¿Un conocimiento profundo de C ++ te ayudará a aprender otros idiomas más rápido / más fácil? [cerrado]

9

¿Existe la posibilidad de que alguien que haya aprendido todos los aspectos clave de C ++ y conozca muy bien los fundamentos del lenguaje, aprenda otros lenguajes (como Python, Perl, Java) más rápido y más fácil?

yo ..
fuente
99
Yo diría que C ++ es lo suficientemente diferente de la mayoría de los otros lenguajes para que sea más confuso elegir algo más (si es el único lenguaje que conoce). Muchos lenguajes comparten la sintaxis de C ++, pero pocos han evolucionado en la misma dirección. C ++ tiene una gran cantidad de información histórica que es específica solo de C ++. Su mejor opción para aprender rápidamente nuevos idiomas es enfocarse en aprender diferentes idiomas de diferentes paradigmas. Cuantos más paradigmas conozca, más rápido será recoger otras cosas de esos paradigmas.
KChaloux
3
No creo que conocer C ++ le brinde una ventaja para aprender otros idiomas en general. Realmente depende de qué otros idiomas vas a aprender. Mi profesor de lenguajes de programación solía decir que deberíamos concentrarnos en comprender los conceptos generales: esto definitivamente hará que aprender idiomas individuales sea mucho más fácil.
Giorgio
99
Aprender un idioma en profundidad es un buen comienzo para aprender a programar en general, excepto que podría confundir los conocimientos específicos del idioma con el conocimiento general. Modern C ++ es un gran lenguaje, pero una vez que haya avanzado a un nivel intermedio, se beneficiará enormemente de conocer otras perspectivas conocidas; tal vez eche un vistazo a OCaml y Ruby, incluso si nunca las usará en serio. Una vez que eres un programador estable y puedes diferenciar entre cosas específicas del lenguaje y generales, ser productivo en nuevos idiomas es bastante fácil, aunque el dominio siempre lleva tiempo.
amon
1
¿Comparado con que? ¿Aprende bien otro idioma, conoce bien C ++ pero no profundamente, sin saber nada?
Telastyn
2
Sí, pero también al revés. Conocer Ocaml o Scheme hace que muchas de las nuevas características de C ++ 11 sean más fáciles de entender
Basile Starynkevitch

Respuestas:

12

En términos generales

Es probable que el conocimiento profundo de cualquier lenguaje de programación lo ayude a aprender otros idiomas más rápido. Esto se debe en parte a que la programación es una forma de pensar más de lo que es aprender la sintaxis. La mayoría de las prácticas de programación serían ciertas para la mayoría de los otros lenguajes de programación. Es por eso que la gente dice que siempre aprendes el segundo lenguaje de programación más rápido que el primero.

En términos específicos

C ++ es un lenguaje que permite un "control" mucho mayor que otros lenguajes. Esto puede ser bueno y malo. Por ejemplo, un arma real es mejor que una pistola de aire cuando vas al bosque (porque en realidad puedes derribar algo con él), pero también es más peligroso para ti y para quienes te rodean. C ++ tiene conceptos como la administración de memoria, de los que no debe preocuparse en la mayoría de los otros idiomas. Sin embargo, tener una comprensión firme de estos conceptos está lejos de ser inútil, incluso cuando se trabaja con lenguajes de administración automática de memoria. También puede realizar operaciones bit a bit e ir mucho más abajo al 'metal' con un lenguaje como C ++. Incluso una comprensión básica en esas áreas puede ayudarlo mucho como programador en cualquier idioma.

Opinión personal

Personalmente, aprendí Java por primera vez durante casi 3 años antes de aprender C ++, y debo decir que me arrepiento (por supuesto ...). Esto hizo que aprender C ++ (todavía estoy aprendiendo, lejos del conocimiento 'profundo': D) no sea tan sencillo como me gustaría. Si lo hubiera hecho al revés, diría que hubiera sido mucho más fácil para mí. Especialmente cuando sabes POR QUÉ se hace algo de una manera específica, y no solo puedes estar seguro de la magia automática del lenguaje. Si se me permite dar una opinión, sugeriría: C (para paradigmas de programación básicos y universales) -> C ++ (para una comprensión básica de OOP junto con la gestión de memoria) -> Entonces puede ingresar a cualquier lenguaje OOP 'real' con un buena base o puede continuar con temas más avanzados en C ++, todo dependiendo de lo que '

G.Rassovsky
fuente
3
Me alegro de que mi universidad nos hizo comenzar con pascal. Luego progresamos a C (para la parte de administración de memoria y operaciones de bits) y finalmente avanzamos a java para oop (aunque esto podría haber sido cualquier otro lenguaje). Para ser honesto, me resulta bastante inquietante cuántas universidades comienzan con Java. Inevitablemente aprenderá java (y lo más importante, OOP) mal, ya que la OOP real es demasiado complicada para los principiantes que todavía están luchando con la diferencia entre ORyAND
Lovis
2
@Doval: la recolección de basura le da la ilusión de no tener que preocuparse por la administración de la memoria. Solo mire con qué frecuencia los programas de código administrado tienen pérdidas de memoria porque alguna referencia permaneció válida en un lugar inesperado (las colecciones son un delincuente perenne) para ver cuán ilusorio es esto realmente.
Mason Wheeler
1
@Doval: Tamaño, lugar, alineación incorrectos: ¿cómo se hace exactamente una de estas cosas en un lenguaje orientado a objetos cuando el compilador conoce el tamaño adecuado y el asignador maneja la colocación y la alineación? Liberación temprana: esto es exactamente lo que se supone que GC debe prevenir, por lo que decir que no es relevante para esta discusión es simplemente falso. Pero lo hace a costa de convertir cada asignación en una pérdida de memoria. Y no pisotear los datos de otros objetos es un problema de verificación de límites , no un problema de recolección de basura.
Mason Wheeler
2
C ++ exige tanto aprendizaje que es específico de la implementación de C ++, pero nunca se usará fuera de C ++ debido a las peculiaridades interminables, sus bibliotecas y varios sistemas. En mi experiencia, todos los que escriben C ++ básicamente están de acuerdo en que todo C ++ está mal escrito y lleno de peculiaridades y rarezas que son principalmente específicas de C ++. Aprender a manejar ese campo minado no será útil en otros idiomas cuando la mayoría de los idiomas carecen de la mayoría de los problemas que tiene C ++.
Jimmy Hoffa
2
@Doval: Sí, ese es mi punto: estas cosas son algorítmicamente indecidibles en el caso general , por lo que deben ser manejadas por una persona inteligente, no por un algoritmo, para ser manejadas correctamente. Y decir "eso no es una fuga, es un programa ineficiente" es simplemente dividir el cabello semánticamente; Para un observador externo, el comportamiento del programa es el mismo que el de un programa que pierde memoria, especialmente en el contexto de sistemas multitarea donde la compresión de la memoria bajo carga puede causar problemas graves.
Mason Wheeler
9

Lamentablemente no. Esto es realmente un gran problema cuando se enseña C ++ en clases de programación, especialmente en las clases de nivel principiante: puedes aprender los principios de programación, o puedes aprender el lenguaje C ++, pero el lenguaje C ++ tiene demasiados escollos y pequeñas estupideces para aprender ambos de manera efectiva. ¡El alcance de una clase de un semestre!

Hay muchas cosas que se probaron en C ++ y finalmente se volvieron idiomáticas en el lenguaje por pura inercia, que prácticamente todos los demás lenguajes desde entonces se han analizado y rechazado porque resultó ser un gran error. Las principales son las plantillas de C ++ y el modelo de objetos de C ++ (los objetos como tipos de valor nunca son algo bueno, porque rompe la sustitución de Liskov y la propia OOP).

Entonces, si primero obtienes un conocimiento profundo de C ++ y luego quieres aprender otros lenguajes de programación, habrá una gran cantidad de daños y contraproducentes que deberás desaprender para ser efectivo en otros lenguajes de programación.

Mason Wheeler
fuente
44
Hay razones por las que Java y C # tienen un sistema de plantillas estrictamente más débil, pero eso se debe a que necesitan metadatos completos sobre todo. Y estaría interesado en una explicación de cómo los objetos como valores rompen las cosas. Especialmente teniendo en cuenta que hay referencias ...
Deduplicador
3
@Deduplicator: Java y C # tienen un sistema genérico completamente diferente , porque la experiencia muestra que las plantillas causan todo tipo de problemas graves, muchos de los cuales surgen porque el sistema de Plantillas no estaba bien planificado en primer lugar. (¡Turing-completado por accidente , para dar un ejemplo obvio!) Y los objetos como valores rompen la sustitución de Liskov porque si tiene una clase Derivada cuyo padre es Base, y anula un método virtual en Base, y lo pasa por defecto pasando a una función que toma una Base y llama al método virtual, no invocará la versión Derivada.
Mason Wheeler
2
@MasonWheeler: Ah, te refieres a cortar .
Fred Larson
2
@FredLarson: Debería haber adivinado que un problema tan frecuente y pernicioso tendría un nombre específico. (Y, como se trata de C ++, un nombre tonto. Cuando un programador fuera del mundo de C ++ oye "segmentación", es probable que piense en segmentación de matrices : P
Mason Wheeler
44
Aunque estoy de acuerdo con muchas cosas que escribiste, creo que tienes un punto de vista muy parcial ;-) En mi humilde opinión, aprender C ++ no hace que las personas sean más tontas.
Doc Brown
8

No. Conocer bien C ++ facilitará el aprendizaje de otros lenguajes que son como C ++. Pero eso sería aburrido. ¿Por qué querrías saber dos idiomas que son iguales? Eso no te compra nada. (Tenga en cuenta que esto no es específico de C ++. Se aplica a cualquier idioma. Compare con los idiomas naturales: aprender italiano no facilitará el aprendizaje de otros idiomas. Le facilitará aprender español, francés o portugués, y aprender tres de ellos será más fácil aprender el cuarto, pero incluso aprender todos los idiomas romances no te ayudará un poco a aprender finés, chino, hindi, hebreo, árabe, pashtu, griego, etc.)

Los lenguajes de programación implementan paradigmas. Peter van Roy ha recopilado un póster de los 34 paradigmas principales de programación .

Los paradigmas, a su vez, están compuestos de conceptos. Ese cartel enumera unos 18 conceptos.

Todos los paradigmas (o al menos los del póster) están compuestos de esos conceptos. Todos los idiomas implementan uno o más paradigmas compuestos de esos conceptos. Entonces, si aprende esos conceptos, (en cierto sentido) aprenderá todos los lenguajes de programación a la vez.

Por supuesto, todavía hay muchas peculiaridades específicas del idioma (sintaxis entre ellas). Además, ese póster ignora por completo la escritura y, por supuesto, existe una diferencia significativa entre un sistema de tipo System F <: ω , un sistema de tipo Scala o un sistema de tipo dinámico de tipo pato, y mucho menos un sistema de tipo dependiente à la Idris, Agda, Coq, Guru o ATS.

Jörg W Mittag
fuente
Hindi , no hindú . Nada te ayudará a "aprender hindú", y mucho menos italiano o C ++ ;-) +1.
PKG
En realidad, aprender diferentes idiomas, aunque es muy similar, aún amplía tu mente y, por lo tanto, te ayuda un poco para los idiomas más alejados.
Dyesdyes
Tendría que estar en desacuerdo con la comparación con los lenguajes naturales, ya que C ++ es un lenguaje multi-paradigmático a diferencia de los lenguajes naturales. Además, al aprender una característica del lenguaje en detalle, conocerá las decisiones de diseño para esa característica y probablemente comprenderá los pros y los contras de otras implementaciones. Por ejemplo, intente aprender en profundidad las plantillas de C ++ sin conocer sus beneficios y desventajas frente a los genéricos dinámicos. Incluso si no tropieza con ninguna mención de C # (difícil hoy en día), aún sabría qué son los genéricos dinámicos e instantáneamente conocerá las limitaciones de los genéricos de C # al aprender sobre ellos después
Rado
5

Diría que conocer profundamente cualquier lenguaje de programación ayudará a aprender otros, al menos otros idiomas de la misma familia. Por ejemplo, el conocimiento de C ++ no ayudará mucho con LISP o Haskell, pero para lenguajes de procedimiento orientados a objetos, lo hará. Mi enfoque ha sido tratar de aprender bien un idioma de cada una de las diferentes familias (de procedimiento, funcional, orientado a objetos, etc.) de idiomas, luego ese conocimiento puede trasladarse a otros idiomas en esa familia. Por otro lado, un conocimiento profundo de APL no ayudará con nada más ...

Jim Nutt
fuente
3
He visto cómo se ve el código Self o Smalltalk o Ruby escrito por alguien que aprendió C ++ como primer idioma. De hecho, diría que saber C ++ es bastante perjudicial para aprender OO. Creo que Self o Newspeak sería mucho más adecuado para eso. Por cierto, un conocimiento profundo de APL al menos ayudará con idiomas como J y K. También ayudará a pensar en abstracciones de colección de nivel superior y levantar, lo que probablemente ayudará con la programación al estilo MapReduce o Hadoop, y también a pensar en Functors , Solicitantes, Mónadas y Categorías.
Jörg W Mittag
1
@ JörgWMittag: Es bien sabido que uno puede escribir COBOL en cualquier idioma ... ¿cuál es el punto?
Deduplicador
@Dupuplicator Si su primer idioma es COBOL, es mucho más probable que escriba COBOL en otros idiomas.
Doval
En realidad, tengo que estar de acuerdo con lo de COBOL. Hace unos años trabajé para mí y escribió COBOL en Pascal ...
Jim Nutt
5

Voy a tomar una interpretación diferente aquí.

C ++ es un buen lenguaje para aprender sobre la memoria y las estructuras de datos, ya que te obliga a pensar cuidadosamente sobre conceptos como la propiedad de objetos y la vida útil. Y aprender sobre la memoria y las estructuras de datos es una de las partes esenciales de cualquier plan de estudios de ingeniería de software.

Pero debes aprender sobre las estructuras de datos. Si simplemente "aprende C ++", realmente no ganará mucho y puede ralentizar el proceso de aprendizaje de otros idiomas a corto plazo.

Cuando estaba en la universidad, Data Structures era un curso obligatorio de primer año, tomado después de CS1 (que al menos la mitad de la clase había abandonado). Fue dificil. El formato del curso fue básicamente "Aquí hay una estructura de datos que nunca ha visto antes [por ejemplo, un montón de izquierda ]. Impleméntelo en C ++ en una semana y haga que su salida coincida exactamente con nuestra salida esperada, byte por byte, así que puede calificarlo automáticamente ". Luego, la próxima semana obtendría una nueva estructura de datos y una nueva asignación. Probablemente aprendí más en ese curso que en todos mis otros cursos combinados.

Ese es el tipo de aprendizaje que debes estar haciendo para que C ++ sea valioso.

Kevin
fuente
2

Cada idioma que aprende hace que el siguiente sea más fácil de aprender, especialmente dentro del mismo paradigma. Se prestan mucho unos de otros, y después de un tiempo llega al punto en que un nuevo idioma parece simplemente una colección de características de otros idiomas, con algunos giros únicos.

No creo que C ++ sea mejor o peor que cualquier otro lenguaje en ese sentido. Es uno de los idiomas más detallados que conozco, y dificulta algunas cosas que son fáciles en la mayoría de los otros idiomas, pero eso no necesariamente se traduce en hacer que el próximo idioma sea más fácil de aprender . Sin embargo, generalmente hace que el siguiente idioma se sienta más fácil de usar . Hay una diferencia

Karl Bielefeldt
fuente
0

No. Un conocimiento profundo de C , o del subconjunto de C ++ que es "básicamente C", ayudará al aprender otros lenguajes, al menos al imaginar lo que deben hacer sus implementaciones. Un conocimiento profundo de C ++ , por otro lado, será principalmente información que es confusa o irrelevante al aprender otros idiomas; si aprende la orientación de objetos de C ++ en más de un nivel de superficie, por ejemplo, cuando pasa a Perl / Python / Ruby pasará más tiempo sin aprender lo que sabe que usarlo, ya que los objetos en esos lenguajes se implementan en una forma completamente diferenteque en C ++. Lo mismo es cierto en mayor o menor medida para la mayoría de los otros lenguajes y para otras características del lenguaje (por ejemplo, las plantillas C ++ y el polimorfismo de Haskell son básicamente la misma característica, con, nuevamente, implementaciones completamente diferentes). Por lo tanto, un conocimiento profundo de C ++ será principalmente específico de C ++.

Jonathan Cast
fuente
esta publicación es bastante difícil de leer (muro de texto). ¿Te importaría editarlo en una mejor forma?
mosquito