¿Aprender a usar C (o C ++) es un requisito para ser un buen programador (excelente)? [cerrado]

25

Cuando comencé a aprender a programar, los programadores reales podían escribir ensamblajes mientras dormían. Cualquier escolarización seria en informática incluiría un poco de entrenamiento y práctica en la programación usando el ensamblaje. Desde entonces, eso ha cambiado, hasta el punto en que veo que los títulos en Ciencias de la Computación con ensamblaje, si se incluyen, se relegan a una tarea y un capítulo, para un total de dos semanas de trabajo de 4 años de escolaridad.

La programación C / C ++ parece haber seguido un camino similar. Ya no me sorprende entrevistar a graduados universitarios que no han pasado más de dos semanas programando en C ++, y solo han leído sobre C en un libro en alguna parte. Si bien los títulos de CS más serios todavía parecen incluir un tiempo significativo de aprendizaje y el uso de uno o ambos idiomas, la tendencia es claramente hacia una C / C ++ menos forzada en la escuela.

Es claramente posible hacer una carrera produciendo un buen trabajo sin siquiera leer o escribir una sola línea de código C o C ++.

Dado todo eso, ¿vale la pena aprender los dos idiomas? ¿Están obligados a sobresalir? (más allá de los consejos obvios, no específicos del idioma, como "una buena selección de idiomas es probablemente importante para una educación integral" y "probablemente sea una buena idea seguir probando y aprendiendo nuevos idiomas a lo largo de la carrera de un programador, solo estirar las celdas grises ")

blueberryfields
fuente
8
C es omnipresente en la infraestructura de software actual. Aprenderlo definitivamente te dará una comprensión más profunda de lo que realmente está sucediendo en el software que escribes. (Ver programmers.stackexchange.com/questions/14744/… ).
Charles Salvia
También encontré las respuestas aquí relevantes: programmers.stackexchange.com/questions/29109/…
blueberryfields
Tangencial: un buen programador se siente cómodo con varios paradigmas de programación, esto significa haber aprendido (y usado) varios lenguajes.
Matthieu M.
Aprender más idiomas no puede doler.
Maxpm
44
No hay C / C ++. Solo hay C y C ++. Son idiomas muy diferentes, y es probable que la respuesta sea bastante diferente dependiendo de lo que estés hablando.
Caleb

Respuestas:

63

Joel Spolsky (sí, ese Joel) argumentó hace un tiempo que los programadores realmente duros saben cómo usar lenguajes más duros (como C, C ++ y Lisp) y sus construcciones (como punteros y características funcionales), y que los lenguajes de nivel superior generalmente no eran lo suficientemente "duro" como para demostrar su competencia.

Puedo entender su punto de vista de que las personas que conocen C y C ++ y que son realmente buenas en eso saben mucho más sobre lo que sucede debajo del capó que las personas que, por ejemplo, programan en Ruby (y solo en Ruby). Diría que es así: si conoces un lenguaje "difícil", probablemente sea una buena prueba de que puedes programar mientras respetas las restricciones severas o que dominas formas complejas de pensar. Si eres bueno en un lenguaje de alto nivel, también podrías programar mientras respetas las restricciones severas, pero no hay prueba de ello.

No creo que aprender C o C ++ dañe tu cerebro (aunque algunas personas parecen creer esto). En realidad, aprenderlo para apreciar mejores idiomas de nivel superior podría ser una buena idea.

zneak
fuente
34

Sí, se requiere saber C (o C ++) para ser un excelente programador (en nuestros tiempos actuales).

No es el lenguaje en sí, es el medio ambiente.

Los programas no se ejecutan al vacío. Un excelente programador conoce su entorno, como un gran escultor conoce su material. Nuestro entorno de programación actual (sistemas operativos, compiladores, redes, etc.) se basa en C / C ++.

Excelente programador escribe programas eficientes y los depura en situaciones de la vida real. Debe conocer el entorno, y hoy en día requiere conocer C / C ++.

Editar: No puedo resistirme a agregar referencia de Matrix Morpheus podría preguntar: ¿desea tomar la píldora Java y seguir viviendo en el mundo cómodo que brinda la máquina virtual? ¿O tomas la píldora C y ves cuán profundo es el agujero del conejo?

Maglob
fuente
99
+1 para la referencia de Matrix, lo guardaré para un posible uso futuro :-)
Konamiman
20

Debo referirme a otro artículo de Joel. En The Law of Leaky Abstracciones , aprender lenguajes como C, Lisp, C ++ y lenguajes que involucran el manejo de la memoria también implican aprender una forma de pensar que nos define para el resto de nuestras carreras.

Mi profesor en mi clase de Estructuras de datos y Algoritmos, William Spears, le dijo a una sala llena de escépticos estudiantes de Ciencias de la Computación por qué no estábamos aprendiendo las últimas herramientas. Los estudiantes se quejaron de que sentían que no estaban preparados para el "mundo real" porque no estábamos aprendiendo Java. No estábamos aprendiendo JavaScript. No hubo clases sobre HTML. No estábamos aprendiendo [[INSERTE LA TECNOLOGÍA AQUÍ]].

¿Por qué no estábamos aprendiendo las últimas herramientas? Según nuestro profesor, la tecnología cambia tan rápido que en 4 años, las herramientas que aprendemos pueden quedar obsoletas. Bueno, después de unos años en la industria, tendría que decir que estoy de acuerdo con su evaluación.

El propósito de una educación en informática es aprender a aprender. Encontrar soluciones a muchos problemas en el desarrollo a menudo requiere una capacidad de pensar fuera de la caja que solo puede venir del aprendizaje básico, fundamental, bajo el capó, Ciencias de la Computación sin procesar que proviene de trabajar con C, C ++ y Lisp.

Cuando esas abstracciones en el mundo real se filtran, y lo harán, una comprensión de los conceptos básicos es lo que separa el promedio del mejor.

jmort253
fuente
3
Debo estar perdiendo algo. ¿Qué tiene que ver Lisp con los fundamentos de aprendizaje? Es la mayor inversión de abstracción jamás inventada. Uno de sus objetivos de diseño originales y fundamentales era "imaginemos que no estamos realmente en una máquina Turing y veamos cuánto podemos simplificar las cosas haciendo eso".
Mason Wheeler
66
@Mason: Learning Lisp le enseñará aproximadamente nada sobre las computadoras del mundo real. Te enseñará mucho sobre la teoría de la computación. La informática en bruto es algo más que computadoras en bruto.
David Thornley
2
@Mason Wheeler Learning lisp presenta varios conceptos avanzados, que incluyen: los datos / códigos son intercambiables, el código de reflexión / auto-modificación, y la importancia de considerar su compilador / vm como parte de su producto final
blueberryfields
@blueberryfields: ... todos los codificadores más experimentados consideran vulnerabilidades de seguridad o dañinas en un grado u otro. Cosas muy malas para enseñar a los novatos.
Mason Wheeler
2
@Mason No entiendo el contexto de tu comentario: estamos hablando de excelentes programadores aquí, no de novatos. No consideraría un programador, que no tiene un conocimiento profundo de estos conceptos, y los aplica de manera apropiada (y regularmente) en su trabajo, como un experto.
blueberryfields
18

Déjame ponerlo de esta manera. Supongamos que necesita contratar a alguien para que trabaje en C ++, y alguien solicita que realizó un proyecto de C ++ en la universidad, pero que solo se ha programado en Java desde su graduación. Por el contrario, supongamos que necesita contratar a alguien para un trabajo de Java, y alguien solicita que hizo un proyecto de Java en la universidad pero que solo se ha programado en C ++ desde su graduación.

¿Con quién se sentirá más cómodo contratando? Yo diría que el tipo C ++, ya que cambiar a usar un lenguaje de recolección de basura es mucho más fácil que alejarse de uno. Del mismo modo para otros conceptos y otros lenguajes, como pasar de compilado a interpretado, o de tipeo estático a dinámico. En casi todas las características por comparación de características que puede hacer entre lenguajes, C ++ aparece en el extremo difícil, lo que hace que sea difícil programarlo, pero también una excelente línea de base para juzgar a un programador.

¿Puedes prosperar en una carrera sin tocar el código C o C ++? Claro, pero todavía no me gustaría contratar a alguien que no pudo o tuvo miedo de hacerlo.

Karl Bielefeldt
fuente
3
Argumento poco impresionante. Si necesitara trabajar en Java, contrataría a alguien con experiencia en Java. Si necesitara hacer el trabajo de C ++, contrataría a alguien con experiencia en C ++. Si tuviera que contratar a un chico Java para un puesto en C ++, entonces podría pasar un tiempo extra de entrevista preguntándole sobre punteros y administración de memoria y RAII; Del mismo modo, si tuviera que contratar a un chico de C ++ para un puesto en Java, pasaría más tiempo en la entrevista preguntando sobre nerviosismo, patrones de diseño, reflexión, etc. Ninguno de los conjuntos de habilidades requiere más inteligencia, solo experiencia. La mayor parte de la curva de aprendizaje está en las bibliotecas de todos modos.
Aaronaught
13

No, no es necesario aprender C o C ++ para ser un buen programador, pero comprenderlo ayudaría a aclarar algunos conceptos básicos como la gestión de memoria.

Rachel
fuente
7

¿Vale la pena aprender los dos idiomas?

Es claramente posible hacer una carrera produciendo un buen trabajo sin siquiera leer o escribir una sola línea de código C o C ++.

S.Lott
fuente
6

En resumen, no, no lo son. Son lenguajes útiles para aprender, pero puedes ser fácilmente un excelente programador sin tocar una línea de C o C ++. La mayoría de los programadores excelentes probablemente los habrán tocado, pero eso no viene al caso: en muchas aplicaciones en estos días no se usan tanto como .NET y Java, y como tal su necesidad ha disminuido un poco.

Tenga en cuenta que no estoy diciendo que no valga la pena aprender, creo que ambos son idiomas importantes para aprender, especialmente si planea hacer una carrera de la programación. ¿Pero puedes ser un programador decente sin haber tocado alguna vez? Seguro.

berry120
fuente
5

Depende de tus intereses.
Si desea estar en la programación del sistema, sí, tendrá que aprender C / C ++, ya que son lenguajes predeterminados de CS. Para familiarizarse con los conceptos del sistema operativo, los compiladores, las estructuras de datos, la gestión de la memoria, etc., debe conocer C / C ++. Además, hay toneladas de buenos textos, libros y artículos disponibles en C / C ++ que optimizarán sus habilidades de programación. Hace unos días en / * Programadores * / leí una excelente respuesta para Por qué C - Porque está cerca del metal .
Por el contrario, si desea limitarse a la programación de aplicaciones, no es necesario utilizar C / C ++, comience directamente con C # (.Net) / Java y obtendrá un buen trabajo de desarrollador. Pero si realmente ama la programación hardcore, estoy seguro de que algún día comenzará a aprender C / C ++.

guardabosque
fuente
Cerca del metal! Me encanta ese comentario.
Wajih
3

Depende totalmente del dominio de la aplicación en la que desee trabajar. Si desea jugar en el entorno incrustado, entonces necesita saber C o C ++. C ++ también es probablemente el lenguaje más utilizado en el desarrollo de juegos. Si desea trabajar en aplicaciones web, entonces C o C ++ pueden no ser tan importantes. No existe un lenguaje que tenga el prestigio de ser requerido para saber como una prioridad para definir un buen ingeniero de software.

Pemdas
fuente
3

C ha sido nombrado "ensamblaje portátil", lo cual es muy cierto. Fue diseñado para hacer que Unix sea portátil en todos los procesadores y describir el código muy cerca del conjunto de instrucciones del procesador subyacente.

Si encuentra que le gustaría trabajar cerca del hardware real, estar en software embebido o controladores de dispositivo, etc., no hay forma de evitar C. Si desea trabajar en los lenguajes más convencionales y de alto nivel, es una mejor idea ya que Muchas de las características que hacen que C sea potente también hacen que C sea peligroso, por lo que se han reducido o simplemente se han eliminado.

Personalmente, consideraría muy importante comprender qué necesitará eventualmente para ejecutar sus programas, ya que muchas decisiones de diseño dependen de esto, por lo que al menos debe estar familiarizado con la forma de asignar el código en el conjunto de instrucciones de ensamblaje y cómo funciona en la realidad. hardware. Que las cosas que das por sentado en realidad toman tiempo y por qué.

Por lo tanto, al menos sugeriría que eche un vistazo a C y algún código aritmético de puntero avanzado, para que sepa con qué no tiene que lidiar a diario.

usuario1249
fuente
1

C es útil para aprender porque está cerca del silicio. C o lenguaje ensamblador le dará una buena idea de lo que pueden hacer las computadoras y cómo lo hacen, y es probable que esto sea útil para comprender qué es posible y qué es práctico. Además, existe una gran cantidad de código C que puede interesarle, y muchos más lenguajes modernos utilizan gran parte de su sintaxis y semántica.

C ++ es un lenguaje de nivel superior que tiene algunas características muy interesantes. Tiene muchos buenos usos y es un lenguaje poderoso. Por otro lado, hay muchos otros lenguajes poderosos y útiles por ahí.

Por lo tanto, recomiendo aprender sobre lo que sucede en los niveles inferiores, y C es una excelente manera de aprenderlos, por lo que recomiendo aprender C. C ++ es opcional; aprenderlo te enseñará cosas, pero hay otras formas de aprender la mayoría de ellas, y si ya estás trabajando en un idioma convencional, hay mejores idiomas para aprender a aprender nuevos conceptos.

David Thornley
fuente
0

Depende del tipo de software que creas que harás. Los juegos a menudo se escriben en C / C ++, ya que es clásicamente un lenguaje más optimizable cuando se trata del código ejecutable. Lo que codifica es solo lo que obtiene, en cierto modo.

Dicho esto, C # también se ha utilizado para programar juegos. C # es probablemente uno de los mejores lenguajes para el desarrollo de aplicaciones de escritorio, al menos en la plataforma Windows.

Junto con Visual Studio, C # se ha convertido en casi el único lenguaje de desarrollo de software que uso (excusando lenguajes como SQL y PHP, etc.), ya que es para todos los efectos, sangriento en mi opinión.

Si desarrolla en Windows, le recomendaría que aprenda C # .NET junto con cualquier otra cosa.

Sin embargo, no creo que C ++ sea un requisito per se, pero es bueno tener ese conocimiento de nivel inferior de punteros, administración de memoria y otros conceptos.

Nick Bedford
fuente
1
@ Nick: El mundo de la informática está más allá de Windows y C #.
Guardabosques
2
Por eso dije: "Si desarrollas en Windows" .
Nick Bedford
0

@Nick Bedford tiene razón sobre el dominio en el que está trabajando. Mis contrapartes de software escriben controladores de dispositivos y software incorporado. C es el camino a seguir allí. Y no piense en C ++ como un segundo lenguaje, tienen una gran superposición.

Brian Carlton
fuente
3
Si no piensa en C ++ como un lenguaje diferente de C, realmente no conoce bien C ++. Trabajar solo en la superposición es posible pero no recomendable.
David Thornley
Quizás exagero la similitud. Pero son más iguales que, por ejemplo, C y Perl.
Brian Carlton
0

Muchos han dicho que C es bueno para aprender a manejar la memoria y estoy de acuerdo. Para mi opinión sobre aprender C es que es muy bueno aprender por aprender a depurar un programa. Muchas cosas pueden salir mal al escribir para C, lo que requiere que piense en cómo debería depurar sus programas. Raramente uso una herramienta de depuración en cualquiera de mis programas (en C u otros lenguajes) simplemente porque C me enseñó cómo agregar utilidades de depuración incorporadas en los programas.

¿Se requiere aprender C / C ++ para una carrera? No, pero también he visto muchos desarrolladores de Java que no conocen muchos conceptos básicos de programación porque solo aprendieron Java. Lo mismo con los programadores de Perl. Aprender más de un idioma debería ser un requisito para una carrera, ya sea que C / C ++ sea uno de esos idiomas o no.

Arcege
fuente
+1 - Ver conceptos similares presentados de manera diferente en diferentes idiomas me ayudó a comprender mejor esos conceptos y verlos con una luz completamente nueva.
jmort253 01 de
0

Al principio, solía pensar que mi universidad está en la generación de Dennis M. Ritchie por incluir C durante 2 semestres cuando hay muchos lenguajes relativamente nuevos como Java, Visual Basic, etc. Pero el hecho es, o al menos ahora creo, que C es uno de los mejores lenguajes que lo ayudan a comprender los conceptos fundamentales de la programación.

Y sobre la carrera sin aprender C (o C ++): sí, es posible, pero aprender C mostrará su conocimiento en programación.

Sr. programador
fuente
0

La respuesta para mí fue sí. Tanto C como C ++ fueron cursos obligatorios en mi programa de grado de CS, y creo que tener un CS o un título relacionado es un requisito mínimo para ser un "buen programador". Además, ser un "buen programador" significa ser capaz de racionalizar los problemas que ocurren y comprender por qué algo no funciona como cabría esperar. Demasiadas veces en mi carrera he sido testigo de cómo las personas están perplejas por los problemas y piensan que hay fuerzas sobrenaturales trabajando en su contra ... es ridículo.

En mi opinión, conocer C demuestra la capacidad de comprender cualquiera de los lenguajes imperativos y resolver problemas utilizando una de las herramientas más poderosas jamás inventadas por la humanidad.

sesteel
fuente
0

Un programador completo tiene varias bolsas de trucos bajo la manga, y estos incluyen:

1) Programación de bajo nivel ... C como mínimo. Alguna asamblea no dolería.

2) Programación funcional ... Un lenguaje funcional puro, no un híbrido: el esquema funciona aquí.

3) OOP ... Normalmente diría smalltalk, pero creo que podríamos ir con Java ahora.

tierra roja
fuente
0

C es la madre de todos los lenguajes de programación ... el conocimiento experto en C te ayuda a conocer cualquier otro lenguaje como Java en poco tiempo.

C ++ es un juego de pelota completamente diferente y es el más complejo de todos.

bhasinusc
fuente
0

No es necesario aprender C o C ++ para ser un buen programador (excelente), sin embargo, es necesario aprender Ensamblaje para ser un buen programador (excelente). Una programación excelente significa optimizar la memoria, Mhz, ancho de banda, restricciones de energía y luego elegir el mejor diseño y / o implementación para realizar la tarea en cuestión. Entre los científicos informáticos, la principal debilidad sigue siendo, después de décadas de tecnologías en evolución, la gestión óptima de los datos. Este es un conjunto de habilidades que se enseñan escribiendo Ensamblaje (cualquier ensamblaje; podría ser ARM, o MIPS, o x86, o un microcontrolador, o un DSP, o incluso más bajo que eso, a través de verilog / VHDL).

Jonathan Cline IEEE
fuente
0

Habiendo usado c, c ++, ensamblador y Lisp de manera competente, diría que no tiene sentido aprender ningún idioma en particular para ser un buen programador. Mis experiencias con lo que hace a un buen programador es poder pensar de una manera que resuelva problemas. Los idiomas solo te permiten expresar tus habilidades para resolver problemas. Por ejemplo, la simplicidad de C le permite expresar fácilmente algoritmos, mientras que Lisp le permite resolver problemas de forma recursiva. Entonces un lenguaje no te hace un programador. Primero debe resolver los problemas antes de convertirse en un buen programador. Los idiomas son solo herramientas que utiliza para resolver problemas.

molesto_quid
fuente
-1

Vale la pena aprender bien C simplemente para obtener una comprensión sólida de la gestión de la memoria. Lo mismo ocurre con C ++, excepto con el objetivo de aprender estructuras de datos.

agua
fuente
No importa qué idioma se use para aprender estructuras de datos.
kirk.burleson
Creo que sí, porque en muchos otros idiomas se utilizan estructuras de datos sin saber cómo se manejan en la memoria. C ++ (sin el uso de STL) obliga al programador a aprender cómo se manejan las estructuras de datos en el nivel bajo.
aqua
-1

No. Hay muchos programadores malos que escriben código C / C ++. Lo que lo hará un buen programador es comprender cuándo y por qué necesitaría escribir algo en C / C ++

Don
fuente