¿Qué lenguajes de programación se debe enseñar a cada estudiante de ciencias de la computación?

13

¿Qué lenguajes (o clases (como en paradigmas) de lenguajes de programación, más un lenguaje recomendado de esa clase) deberían enseñar a cada estudiante de informática en la universidad según usted? Motiva tus respuestas; ¿Por qué ese lenguaje? ¿Qué uso tendrá uno de él? ¿Qué conceptos enseña (mejor que el lenguaje X)?

Nota / aclaración : esta pregunta es sobre informática con un fuerte enfoque en la ingeniería de software, no pura informática. El objetivo principal es la educación en ciencias de la computación y no la educación en ingeniería de software.

Anto
fuente
13
El código psuedo debería ser suficiente para CS.
Jé Queue
12
@Xepoch - no estoy de acuerdo. No es particularmente natural expresar una semántica de evaluación ansiosa o perezosa, covarianza / contravarianza en firmas de tipo, teoría de categorías, etc., utilizando pseudocódigo. El pseudocódigo es excelente para describir algoritmos y estructuras de datos, pero CS tiene mucho más que eso.
Aidan Cully
66
Además, la gran mayoría de los estudiantes de CS esperan obtener un trabajo no académico después de graduarse. El seudocódigo no valdrá mucho en un mercado laboral competitivo. No creo que un título de CS deba ser principalmente capacitación laboral, pero tiene que hacer algún ajuste en esa dirección.
Adam Crossland
2
TODOS ELLOS . Si el tiempo es limitado, comience con las letras del alfabeto. A +, B, C, C #, D, E, F #, J, K, Q, R, T ... Esa no es una mala lista, en realidad.
Jesse Millikan
66
Felicitaciones por descubrir otra versión más del "¿Qué idioma?" pregunta. No puedo esperar para leer todas las opiniones. No olvides la referencia a SICP. Oh espera, ahí está.
Corbin Marzo

Respuestas:

21

Voy a dar una lista:

  • Ensamblaje (un dialecto relativamente simple): es importante comprender al menos un poco de los fundamentos
  • C: lenguaje de procedimiento, utilizado en muchos lugares. No carga a los nuevos estudiantes con conceptos completamente nuevos como OOD de una sola vez.
  • Java / C # / Eiffel / C ++: algo orientado a objetos es bueno, cualquiera de estos lograría el objetivo de enseñar a los estudiantes OOD y una vez que entiendan uno de estos idiomas, deberían poder aprender los otros. Hay muchos buenos idiomas, enumeré Eiffel porque también tiene diseño por contrato.
  • LISP y Prolog: Enseña a los estudiantes una forma completamente nueva de pensar, que es importante, incluso si nunca usan ninguno de estos "en el mundo real".
  • SQL y XML: presenta nuevas formas de pensar sobre los datos y cómo recuperarlos y administrarlos.

Los estudiantes deben estar expuestos a todos estos paradigmas como mínimo. No solo uno o dos.

Supongo que muchas personas sugerirán Python para cubrir el estilo de procedimiento, el estilo OOP y tal vez otros, pero no tengo suficiente experiencia personal con Python para poder recomendarlo con confianza.

FrustratedWithFormsDesigner
fuente
Realmente desearía que mi escuela hubiera entrado en más detalles sobre XML y SQL, tuvimos una clase que entró en ambos y fue terribad.
agregaría lenguajes dinámicos modernos, como Lua, Python, Javascript, etc.
Javier
44
ah, también algunas funciones hardcore, como haskell y erlang son muy educativas
Javier
1
+1 para listar SQL. Al menos estás pensando en álgebra relacional.
Jé Queue
1
También separaría OO administrado de OO no administrado, C ++ y Java. Si bien nunca he usado C ++ desde uni sin aprender sobre malloc, el montón y la pila, nunca serás tan bueno entendiendo OO.
markmnl
45

Personalmente, me parece algo triste que los lenguajes funcionales no se enseñen tan predominantemente como solían ser. Creo que, al menos, los estudiantes de ciencia ficción deberían estar expuestos a un lenguaje de todos los paradigmas principales: de procedimiento, orientado a objetos, funcional y dinámico.

Michael Brown
fuente
2
+1 Mi clase de lenguajes de programación fue fácilmente la clase más valiosa que tomé.
HappyCodeMonkey
1
Como estudiante de TI, definitivamente estoy de acuerdo. Tengo el beneficio de trabajar a tiempo completo en el mundo real mientras voy a la escuela como desarrollador de aplicaciones web de nivel junior, pero siento que incluso si obtuviera un título de CS completo me perdería mucha cobertura de los diferentes paradigmas
Ken
1
Algo relacionado: youtube.com/watch?v=Ps8jOj7diA0 Stanford tiene sus conferencias completas de Programming Paradigms 2008 en YouTube.
Inaimathi
44
Agregar declarativo a la lista (Prolog). También algunos idiomas son explícitamente paralelos (Occam). Enseñar a los estudiantes cómo funciona el paralelismo sería bueno (nadie lo entiende correctamente).
Martin York
1
@Martin York: Prolog es un lenguaje de programación lógico , que es un tipo de lenguaje declarativo. (Menciono esto como lenguajes de programación funcionales son también declarativa, en términos generales.)
mipadi
33

Creo que un estudiante de CS bien equilibrado debería aprender un idioma en cada uno de los 4 tipos de lenguaje de programación:

Funcional - Lisp / Haskell / PostScript. No tengo mucha experiencia con Haskell, pero he escuchado a otros programadores que se entusiasman con eso. Comprender los constructos de la programación funcional y por qué son útiles en muchas situaciones ayudará a un programador a mejorar la organización de algoritmos en otros lenguajes también.

Orientado a objetos : elija. C # / Java / Python / Ruby / yadda yadda yadda. Este tipo debe enseñarse simplemente porque eso es lo que quieren las empresas modernas.

Imperativo - C / Fortran / Pascal. Estos son menos comunes en estos días, pero aún deben aprenderse desde una perspectiva práctica / histórica. Los métodos que emplean todavía tienen practicidad porque en todos los idiomas, todo se reduce a una instrucción. Y los idiomas imperativos son muy buenos para enumerar y seguir instrucciones.

Lógico - ProLog. Nunca he encontrado un buen uso práctico para ninguno de estos lenguajes, pero he encontrado algunos de los conceptos detrás de los lenguajes lógicos cuando trato de descubrir cómo escribir algunos de mis métodos en lenguajes más orientados a objetos. No pude concentrarme mucho en los idiomas lógicos durante mis años universitarios, y creo que un enfoque más fuerte allí podría haberme hecho algo bueno entonces.

Joel Etherton
fuente
66
Es posible que desee agregar prototipos a esa lista, por ejemplo, JavaScript.
stusmith
@stusmith: vale la pena mencionar los prototipos, pero en realidad es un subconjunto de lenguajes orientados a objetos, y javascript es un ejemplo limitado en el mejor de los casos. Lo consideraría quizás una tarea en un curso de lenguajes de programación, pero no un enfoque.
Joel Etherton
1
+1 para Prolog. He visto su uso práctico y uso habitualmente prototipos de algoritmos.
Fred Foo
@larsmans: me interesaría saber sobre su uso. No lo he tocado en varios años, así que estoy confuso con buenas aplicaciones prácticas. ¿Tiene algún enlace a documentos técnicos o artículos similares?
Joel Etherton
Echa un vistazo a ECLiPSe ( eclipseclp.org ), un dialecto de Prolog de código abierto utilizado industrialmente por varias grandes empresas europeas (si no recuerdo mal , la compañía ferroviaria francesa SNCF, intentaré encontrar una referencia).
Fred Foo
6

El idioma n. ° 1 que todo graduado de CS debe conocer es el que maximiza su potencial para conseguir un gran trabajo. Eso va a cambiar con el tiempo, va a cambiar según la definición del individuo de un gran trabajo , y va a variar según la región geográfica.

Por el momento, diré que el inglés es el idioma número 1 que todo experto en CS debe saber (esto, por supuesto, varía según la región).

oosterwal
fuente
Un buen trabajo es un efecto secundario de un título de CS. Un título de CS es para eso, el conocimiento de la teoría computacional. Fácilmente podría haber obtenido un mejor trabajo en la educación vocacional en lugar de romperme la cabeza en matemáticas y CS durante todos esos años.
Jé Queue
2
+1 para inglés. Los lenguajes de computadora son detalles de implementación.
Wyatt Barnett
+1. Si alguien puede aprender bien inglés (s), puede aprender bien los manuales. Sabía bien inglés. No tuve problemas para aprender ningún idioma.
Shiplu Mokaddim
4

Creo que cambia con el tiempo, pero idealmente: 3 idiomas desde 3 perspectivas muy diferentes. En mi época era procesal, OO y funcional: Pascal, C ++ y LISP. No estoy tan entusiasmado con esos tres en particular. Pero cuando entrevisto busco:

  • Algún nivel de experiencia con un lenguaje en el que debe prestar atención a la gestión de la memoria (C / C ++ y muchos otros)
  • Algún nivel de experiencia con un lenguaje orientado a objetos con expectativas sobre el uso de API y las diversas abstracciones disponibles (C ++ / Java)
  • Un lenguaje "elástico", algo extraño, difícil y desafiante. No voy a contratar porque alguien conoce LISP, ensamblaje o algún otro lenguaje desafiante, pero quiero ver que el ingeniero enfrentó algún tipo de desafío que involucraba la resolución de problemas serios y mucho "¿qué diablos es esto?" momentos

Como otro oficio, creo que los programas de CS necesitan capacitar a los estudiantes en idiomas prominentes en el mercado. En cualquier momento, creo que 2-3 idiomas tienen una gran importancia para la mayoría de los trabajos. Creo que una escuela le debe a los estudiantes la oportunidad de aprender 2 de 3 de esos idiomas con una capacitación profunda disponible en al menos uno.

bethlakshmi
fuente
4

Para un estudiante de CS, busque lenguajes de programación que estén estrechamente relacionados con los conceptos de CS que se discuten. Sugeriría:

  • Esquema, para comprender mejor el cálculo lambda
  • Erlang, para entender el modelo del actor.
  • Prolog, para lógica de predicados y sistemas de prueba
  • Haskell, para la teoría de tipo / categoría, y porque la evaluación perezosa se expresa completamente en el lenguaje
  • al menos un lenguaje ensamblador: si desea contarlo debajo de este banner, también agregaría un lenguaje de código de bytes, como los códigos de bytes Java o CLR, y el IR LLVM
  • probablemente un lenguaje de definición de hardware, como Verilog o VHDL
  • Bison para una clase de construcción de compiladores
  • algo con un sistema de tipo dinámico (me viene a la mente Ruby) ...

La lista podría continuar de esta manera, pero la idea fundamental es bastante simple: enseñar a los estudiantes el lenguaje de programación que mejor se adapte a la forma en que desea enseñar los conceptos.

Aidan Cully
fuente
3

yacc

para tener una idea de lo que sucede detrás de escena, sea cual sea el lenguaje de programación que esté utilizando. ayuda a comprender conceptos básicos como el código muerto y varios tipos de optimizaciones que un compilador (bueno) podrá hacer por usted.

mariotomo
fuente
2

Lisp (con CLOS para OOP) y Haskell. Esta pregunta no está restringida a estudiantes. Nuevos y sofisticados lenguajes de programación han tomado prestadas (¿copiadas, robadas? ... no, no está mal) muchas características de estos dos. Puedes prepararte para el futuro. La programación funcional (estilo) es más importante hoy y se introduce en lenguajes de programación imperativos como C # (LINQ) o C ++ (lambda) y muchos más. Es una pena que algunos estudiantes aprendan solo Java.

knivil
fuente
1
Si bien estoy de acuerdo con ambos, es posible que desee poner un poco de razonamiento (también señalaré que no sería particularmente útil saber que estos son sus únicos idiomas).
Inaimathi
2

Creo que el lenguaje no es tan importante como la gente cree.

Sí, necesita saber cómo programar, etc., pero muchos programadores excelentes son autodidactas y se basan en sus experiencias del mundo real que los ayudan a desarrollarse.

Los estudiantes podrían aprender algunas lecciones sobre cómo programar en el mundo real y no solo los métodos de libros, esto los haría más "redondeados" y, en mi opinión, mejores desarrolladores / graduados.

¡Aprendí más sobre programación y desarrollo de software después de dejar la universidad y comenzar a trabajar!

usuario18041
fuente
2

REALMENTE IMPORTA ?

Por lo general, la picazón detrás de esta pregunta es "¿Qué palabras de moda puedo poner en mi currículum que me darán los trabajos más lucrativos / interesantes / desafiantes / fáciles?". Aunque la pregunta tiene sus méritos, ya que la mayoría de los currículums son evaluados por personas de recursos humanos que no comprenden lo que están buscando. pero es muy superficial, ya que una vez que ha pasado las puertas necesita entregar los productos.

No es qué idiomas sabes que te hacen un buen o mal programador, es cómo puedes usarlo. Para esto hay básicamente dos categorías de programadores:

  1. Los que se concentran en aprender un idioma en su núcleo. Lo más importante es el idioma y cómo usarlo. En los extremos, tienden a optimizar súper cada pequeña mota de código y a menudo usan características oscuras solo porque pueden.

  2. Luego están los que quieren aprender sobre técnicas y paradigmas. El lenguaje que usan realmente no importa siempre que pueda expresar su imagen mental con elegancia. En los extremos, estos tenderán a usar UML u otros sistemas similares con la esperanza de que otros hagan el trabajo duro de codificarlo.

En mi opinión, necesitas ambos. El n. ° 1 proporcionará habilidades a corto plazo y, cuando lo elijas sabiamente, te facilitará las puertas de RR.

# 2 proporcionará orientación y organizará su línea de pensamiento hacia una solución funcional al problema en cuestión, pero sin 1 sigue siendo una idea, flotando para siempre en los limbos del cielo de vaporware (o el infierno, dependiendo de dónde lo mire).

# 1 le dará los medios para implementar ideas en sistemas de trabajo reales, pero sin 2 sus sistemas tenderán hacia monstruos cancerosos sin forma.

Newtopian
fuente
Si importa. El primer idioma que aprende moldea su cerebro con respecto a cómo verá los idiomas futuros.
1

Creo que tú mismo respondiste parcialmente tu pregunta.

De verdadera importancia es dar a los estudiantes la oportunidad de entrar en contacto con varios paradigmas, los idiomas reales no deberían importar.

Por supuesto, es importante enseñar principalmente aquellos paradigmas que brindan la mayoría de las oportunidades de trabajo (probablemente OOP en este momento). En consecuencia, también es mejor enseñar un lenguaje ampliamente utilizado para este paradigma, ya que esto es más útil que aprender algo que probablemente nunca usará. Por lo tanto, también odiaba tener que escribir pseudocódigo en mis exámenes. El pseudocódigo está bien, siempre que no tenga una sintaxis 'fija'. Debería poder transmitir conceptos.

Así concretamente:

OOP: .NET o Java

Al menos 1 paradigma de programación adicional, para que el alumno conozca otros enfoques.

Funcional: Lisp?

Steven Jeuris
fuente
funcional, no, por favor, no LISP. más bien: haskell.
mariotomo
1

Lenguaje ensamblador y microcódigo. Un estudiante de CS debe comprender todas las capas básicas de abstracción entre las máquinas de estado booleanas y las últimas funcionalidades de alto nivel / OOP / etc. paradigma del lenguaje de programación.

Básico o Logo o Squeak (et.al.), si alguna vez quieren poder entender cómo enseñar a los niños pequeños algo de alfabetización informática.

Fortran, Cobol y Lisp, si quieren entender la historia de los lenguajes de programación, y cuáles son los problemas reales que solucionan las prácticas modernas.

hotpaw2
fuente
Y C, para que entiendas el 90% de todo el código fuente abierto que puedes estudiar.
2011 a la derecha
1

Elegir 3 o más idiomas de diferentes paradigmas no es tan difícil, se han dado muchas buenas respuestas. Pero si tuviera que elegir un solo idioma, elegiría Scala, porque es funcional y está orientado a objetos. Puede explicar y comparar diferentes enfoques dentro del mismo idioma.

Sean Patrick Floyd
fuente
1

¡No olvide los lenguajes orientados a la pila / concatenantes! Pueden ser verdaderos maestros de la mente. Enfatizan la complejidad del edificio utilizando primitivas pequeñas y fáciles de entender. Puede usarlos para escribir código libre de puntos (o tácito) que se siente tan limpio.

El lenguaje clásico es Forth , pero mi favorito en estos días es Factor . También vale la pena echar un vistazo a Joy y Cat . No te pierdas el wiki de lenguaje concatenativo . ¡Es más divertido que una bolsa llena de martillos!

Roger escaso
fuente
0

Algo funcional, Haskell o Lisp sería mi primera opción, pero quizás Erlang. Los lenguajes funcionales realmente te enseñan cómo construir abstracciones de una manera muy poderosa.

Zachary K
fuente
Pero, ¿deberían los estudiantes limitarse a un paradigma? ¿Qué pasa con los lenguajes OOP funcionales como Scala?
Anto
1
No, por supuesto que no, ¡estaba asumiendo que otras personas irían a por esos!
Zachary K
0

A pesar de su falta de corriente principal, encuentro que D, específicamente la versión 2, proporciona algunas lecciones interesantes que no se pueden aprender fácilmente en otros lugares. Hace un intento más serio que cualquier otro lenguaje en el que pueda pensar para obtener una programación imperativa / procesal, orientada a objetos y funcional para jugar bien entre sí, y permitir la programación en un nivel muy bajo (punteros, administración manual de memoria, en línea lenguaje ensamblador) y un nivel muy alto (programación genérica y generativa) en el mismo lenguaje.

Esto es valioso porque, en lugar de ver paradigmas de forma aislada como si existieran en universos diferentes, puedes ver el bosque a través de los árboles. Puedes ver las fortalezas y debilidades de cada paradigma en un nivel de grano fino a medida que los combinas en tus programas. Puede ver cómo se pueden implementar los principales aspectos de los paradigmas en las bibliotecas en términos de código de nivel inferior. El módulo de biblioteca estándar std.algorithm implementa importantes primitivas de programación funcional, pero es un código D simple y directo sin magia. Del mismo modo, rango estándarimplementa una evaluación diferida, pero nuevamente es un código D bastante simple. Puede comprender los costos involucrados en las primitivas de cada paradigma, porque las características cercanas al metal de D hacen que lo que realmente sucede bajo el capó sea relativamente transparente. Incluso puede escribir algo de bajo nivel que se parezca a C, y luego crear una interfaz bonita de alto nivel, en el mismo lenguaje, sin que se interpongan capas de pegamento mágico.

dsimcha
fuente
0

Pseudocódigo.

Las personas en el campo deberían poder explicar sus ideas de manera coherente y estructurada sin una jerga específica de marco o sintaxis. No debería tener que saber la diferencia entre sus corchetes y llaves para entender su algoritmo. No debería necesitar saber qué ??significa o cuáles grepson los interruptores.

Escriba en lenguaje sencillo, pero estructúrelo y formatee como código. Cualquiera puede implementarlo en el idioma que desee.

editar: esta respuesta está motivada en parte por la incapacidad de algunos programadores para escribir pseudocódigo.

"Solo escribe el algoritmo en pseudocódigo"

"¿Que es eso?"

Los beneficios del pseudocódigo es que las partes interesadas que no son de programación pueden entenderlo. No estoy sugiriendo que desee BA y usuarios que prueben su código, sin embargo, puede ayudar cuando un no programador comprenda el algoritmo requerido. Psuedocode elimina la necesidad de explicar for (int i = 0; i < j; i++)y lo que es esencialmente jerga repetitiva.

Kirk Broadhurst
fuente
Muchos lenguajes de programación son lo suficientemente potentes como para que haya poca diferencia entre el código real y el pseudocódigo. ¿A qué elementos de sintaxis de los lenguajes de programación reales se opone?
Kevin Cline
@kevin cline - Me siento cómodo con los elementos de sintaxis que conozco - son los que no conozco a los que podría objetar. Por supuesto que puedo descifrarlos, pero el punto es que el pseudocódigo no debería tener esos problemas (todavía no he visto un lenguaje de programación que realmente se parezca al pseudocódigo)
Kirk Broadhurst
0

C.

  • En primer lugar, todavía se usa (¡ampliamente utilizado!), Y no solo para los núcleos. Actualmente mantengo una aplicación comercial codificada en C. Por lo tanto, incluso con C pura y simple, aún puede obtener un trabajo. En grandes empresas, en la industria, en casi todas partes (pero en desarrollo web).
  • Si va a trabajar en un entorno Unix / Linux, no saber al menos un poco de C es como ir de compras y no poder leer los precios en las etiquetas.
  • Punteros! Todos deberían entender los punteros (cf. Joel Spolsky ). Además, una vez que ha captado el concepto de malloc, sabe exactamente qué tipo de cosas suceden cuando escribe descuidadamente un "nuevo" en un idioma OOP.
  • La mayoría de las sintaxis de "idiomas populares" se derivan de C.
  • Sí, no siempre está claro. Sí, es difícil de aprender. Sí, las cuerdas son una pesadilla para los principiantes. Pero la programación no siempre es clara y es difícil de aprender, y realmente comprenderá lo bueno de OOP cuando, después de estudiar C, pruebe C ++ y descubra std :: string.

Por supuesto, uno debe saber más de un idioma, y ​​no solo un lenguaje de procedimiento antiguo. Pero si tuviera que ir a una isla desierta con un solo compilador, iría con mi viejo y viejo gcc. Puede comprender la programación de alto nivel si conoce la programación de bajo nivel. Creo que no es cierto al revés.

Raveline
fuente
0

Algunos de los lenguajes de programación que se aplicaron para adquirir habilidades generales de resolución de problemas, y los conceptos de programación son Logo y Karel, deben enseñarse antes de C / C ++ / Java / Lisp / PERL / Assembly / cualquier paradigma de programación.

Los estudiantes reciben una introducción muy práctica a la programación.

umlcat
fuente
-1

Cualquier cosa con objetos. Solo asegúrate de que lo aprendan bien.

Contrataría a un gran programador de Java para C # en cualquier momento, pero tendría muchas dudas contratar a alguien que nunca escribió código real

Eric
fuente