Tuve una discusión con uno de mis maestros el otro día.
Debatimos el impacto que los lenguajes de script más simples (como Python o Ruby) tienen en los programadores junior.
Argumentó que los lenguajes de secuencias de comandos engendran técnicas de codificación descuidadas porque los principiantes no entienden lo que está sucediendo "bajo el capó". También citó otros ejemplos de cómo los lenguajes de secuencias de comandos a menudo hacen que el programador descuide las preocupaciones sobre eficiencia, administración de memoria, complejidad operativa, etc.
Argumenté que los lenguajes de nivel inferior podrían ser demasiado para algunas personas y podrían darse por vencidos antes de desarrollar una pasión por la programación. Cuando comencé a aprender mi primer lenguaje de programación (C), llegué a los indicadores y me di por vencido porque los conceptos eran demasiado difíciles (en mi defensa, solo tenía 14 años). Si no fuera por Java, ¡podría no haberme convertido en programador! Si hubiera comenzado con un lenguaje más simple y luego cavara profundamente, siento que no me habría rendido y habría aprendido tanto como comencé con C.
La clase terminó antes de que ambos lados fueran completamente explorados.
Hasta este punto, he estado predicando que los principiantes deben comenzar con lenguajes de secuencias de comandos y luego profundizar; pero después de esa discusión, comencé a preguntarme si esto era un pensamiento erróneo.
Entonces, ¿qué impacto tienen los lenguajes de scripting en los programadores junior?
Respuestas:
Estoy en desacuerdo. Primero, los lenguajes de script están en un nivel más alto de abstracción, y no hay nada de malo en esto. Al principio uno solo está tratando de aprender los principios. En realidad, diría que elegir un idioma de nivel inferior puede fomentar una mala codificación, ya que uno tiene que lidiar con algunos detalles antes de poder comprenderlos. En cambio, con un lenguaje más simple, uno puede comenzar a escribir código limpio y conciso desde el principio.
En segundo lugar, hay mucho que aprender en estos idiomas. En cuanto al aprendizaje del lenguaje, diría que C es más fácil que Python. Uno tiene que lidiar con punteros o cuidar las cadenas, pero hay muchos más conceptos que aprender en Python. Comprensiones, orientación a objetos, reflexión, métodos mágicos, funciones de primera clase, lambdas, iteradores y generadores, metaclases: todo esto es parte del lenguaje.
Creo que comenzar con Python permite aprender mucho más sobre programación y con una curva de aprendizaje más suave. Un lenguaje de nivel inferior puede tener menos abstracciones, por lo tanto, menos conceptos generales para aprender, y abrumar al principiante con detalles de los que puede querer prescindir.
fuente
No importa donde comiences. Importa a dónde vas después de empezar.
BASIC puede no ser el lenguaje más elegante del planeta, pero abarca los fundamentos de la programación de procedimientos, y eso es suficiente para comenzar.
Empecé con BASIC. No me quedo allí.
fuente
Tu maestro tiene razón, excepto que asume que sus consecuencias son malas.
Si considera que el aprendizaje de idiomas es puramente una actividad académica para aprender cómo funcionan las computadoras, entonces está en lo correcto. Si los ves como una forma de hacer las cosas, estás en lo correcto.
fuente
Creo que "lenguaje de secuencias de comandos" es una palabra horrible, que está extremadamente desactualizada o, en el mejor de los casos, se adapta a una clase de lenguajes específicos de dominio. Tu maestro solo está alineando todo lo que claramente no entiende lo suficiente en un eje del mal.
Una distinción sensata es la que se da entre lenguajes de alto nivel y lenguajes de bajo nivel, o entre lenguajes de tipo estático y dinámico, que son verdaderamente ortogonales.
Assembler tiene un nivel dinámico de tipo dinámico (si hablar de tipos tiene algún sentido), C tiene un nivel bajo de tipo estático, Ruby tiene un nivel alto de tipo dinámico, Haskell tiene un nivel alto de tipo estático. Java no es de tipo estático alto ni bajo, C ++ es de nivel estático alto y bajo. Y así.
La discusión solo puede ser, qué paradigmas son más adecuados para un programador de nivel de entrada.
Estoy bastante convencido de que la programación de bajo nivel probablemente no sea una. Podría haber sido, en algún momento a principios de los años 90, cuando en realidad podría producir resultados interesantes en un tiempo razonable.
Pero la programación es alimentada por la pasión. La pasión se nutre de recompensas. Por lo tanto, los programadores de nivel básico deben comenzar con herramientas gratificantes. Las herramientas de bajo nivel ya no son gratificantes, porque hay un vasto mar de herramientas de alto nivel que te dan el mismo resultado en una fracción del tiempo.
El pensamiento humano es abstracto. A medida que aprendemos a entender el mundo, lo hacemos mediante abstracciones de grano muy grueso y entramos en detalles según sea necesario.
Para que un niño entienda su entorno, no se le enseñarán matemáticas, luego física, luego química, luego biología, luego historia, sociología y filosofía. Le das un modelo muy simple del mundo para hacer frente y, por sí solo, mucho tiempo para superarlo, te disparará interminablemente cuando seas joven y luego negarás por completo tu autoridad.
Así es como pensamos. El cerebro humano solo puede procesar cantidades limitadas de "unidades" de información, pero el grado de abstracción importa poco en la cuantificación de la información. Por ejemplo: leer la expresión '34 * 75 'para nosotros es más simple para nosotros que calcularlo, mientras que para las computadoras es al revés. Reconocer (y, por lo tanto, abstraer) un montón de píxeles negros en una línea ondulada, que luego se puede reconocer (y, por lo tanto, una vez más abstraído) como un dígito individual, es una gran cantidad de trabajo.
Mi abuela entiende la idea de abrir un archivo. Sin embargo, ella no tiene comprensión por debajo de ese nivel. Y, francamente, si hubiera tenido que aprender esto estudiando primero el funcionamiento interno del hardware y el sistema operativo y lo que no, nunca habría llegado allí.
Hay mucha gente por ahí, que complican demasiado las cosas, porque nunca se les enseñó a pensar en términos de soluciones claras, concisas y, por lo tanto, elegantes, sino que pasaron demasiado tiempo molestando con detalles intercambiables de bajo nivel y resolviendo problemas en contra de ellos. Enseñar a las personas a pensar como las computadoras es el peor enfoque posible para la programación.
El valor de la programación radica en encontrar una solución a un problema. Expresarlo como código es realmente una tarea aburrida y mecánica, y simplemente debe hacerse con las herramientas adecuadas.
Ah, y no te preocupes por no haber entendido los punteros. Tuve el mismo problema a la misma edad. El problema aquí también es la falta de abstracción. Clásicamente, aprende acerca de los punteros de algún libro de C y, mientras lucha por comprenderlos, esto va de la mano con la asignación de memoria y, por lo tanto, con la memoria de pila y montón, y así sucesivamente. El concepto abstracto detrás de los punteros es la indirección. Una variable que contiene un índice en una matriz específica es solo eso (en realidad es lo mismo en C, donde la matriz específica es su espacio de direcciones), y no necesita aritmética de puntero para esto.
Esto solo pretende ilustrar, que elegir un alto nivel de abstracciones hace que las cosas sean mucho más fáciles de entender.
EDITAR: y cuando se trata de escribir, prefiero los idiomas estáticamente escritos. Y creo que los programadores de nivel básico deberían entender claramente el concepto de tipos (que es abstracto).
fuente
No hay nada simple sobre Python. Eche un vistazo a Unicode y meta-programación.
fuente
Veo otro problema mucho más profundo.
Los idiomas sin tipo no obligan a uno a prestar atención a los tipos, a pensar en tipos. Esto está muy bien siempre que tenga pequeños scripts con algunas cadenas y números que se convierten entre sí sin darse cuenta. Pero llegará el día en que esto se rompa. De repente, el programa se interrumpirá, y cada solución rápida hará que se vuelva a interrumpir.
O bien, el programador novato aspirante se da cuenta de que necesitará una lista de listas en lugar de una lista de tuplas, pero no tendrá la menor idea de "cómo hacer esto", y hará preguntas sobre stackoverflow que muestran que es una absoluta impotencia.
fuente
Sigo manteniendo que la instrucción formal y la tutoría son un factor mucho más importante que la elección del idioma en la calidad del código de principiante. Sin embargo, si tuviera que elegir un primer idioma para principiantes, elegiría python para programadores autodidactas y C ++ para instrucción universitaria.
La razón es que con la instrucción formal puede comenzar con programas pequeños y triviales para establecer una base teórica sólida años antes de que necesite hacer algo útil. Creo que el orden es ideal si puede permitirse el tiempo, y C ++ le brinda mucha ayuda con los errores del compilador y las fallas de segmentación entre las conferencias para informarle si no comprende los fundamentos.
Algunos de esos fundamentos son simplemente muy difíciles de aprender si eres autodidacta, hasta que tengas algo de experiencia. Además, generalmente debe hacer algo útil lo antes posible, y puede obtener los fundamentos teóricos según sea necesario, aunque se arriesga a nunca aprender más que el mínimo con este enfoque. Es por eso que recomiendo un lenguaje como python en ese caso.
fuente
Lo vimos al revés en la universidad y creo que es útil. * Comenzamos en el nivel bajo. Punteros, gestión de memoria, matrices de caracteres ... Entonces sí, comenzamos con C. Lo mismo con los algoritmos: primero implemente una lista vinculada, una tabla hash, un árbol ... Y solo luego use las bibliotecas estándar.
Después de eso, pasamos a lenguajes más potentes como Java, C # o perl. Pero con la ventaja de saber qué sucede debajo del cinturón.
Si bien esto funciona, creo que también está bien pasar de los lenguajes de script a un lenguaje de nivel inferior. Conocer un idioma de alto y bajo nivel asegura que tenga la facilidad de uso de un idioma de alto nivel sin dejar de entender lo que está sucediendo. El orden en que los aprende es menos importante.
fuente
Los lenguajes de script no hacen que los programadores sean descuidados. La falta de claridad para comprender el dominio del problema (por ejemplo, el negocio al que sirve el programa) es lo que causa descuido.
Como dice el viejo dicho: "Puede escribir COBOL en cualquier idioma", aunque sospecho que cuando cada tipo de datos se ve igual , se hace más difícil ver cuáles son los aspectos esenciales de su programa, una característica importante de COBOL- ización
fuente
Foo
oBar
o algo completamente diferente, siempre y cuando sea posible.frobnicate()
de cualquier manera. Sin interfaces explícitas.Yo diría que los lenguajes de script no fomentan técnicas descuidados. (Tenga en cuenta que esto no significa que los idiomas sean malos , solo que es difícil mantener bases de código grandes en dichos idiomas) Sin embargo, creo que por diferentes razones que las otras respuestas aquí.
Creo que para usar cualquier lenguaje, un programador necesita tener una comprensión básica de la programación en su conjunto. No serán efectivos en ningún lado si no entienden conceptos como vectores, árboles y tablas hash. No necesariamente necesitan poder implementar estas cosas, pero necesitan conocer sus características.
Donde creo que la descuido entra en juego no es la habilidad de programación, sino cuando uno necesita crear componentes reutilizables. Estos lenguajes no requieren que defina buenas interfaces entre unidades de código o los mecanismos para que las bibliotecas impongan restricciones a sus clientes. No es imposible hacer buenos componentes reutilizables en tales lenguajes, es mucho más difícil.
Los lenguajes de secuencias de comandos tienen el atractivo para el programador novato porque les permite realizar más tareas "puntuales" en menos tiempo, pero cuando esos mismos programadores comienzan a realizar programas de mantenimiento, a menudo tienen rápidamente problemas con estos lenguajes.
No digo que los lenguajes de script sean malos, ni mucho menos. Pero sí dificultan el mantenimiento de enormes bases de código (varios millones de líneas) (que es una de las razones por las que no se ve ninguna de estas bases de código en lenguajes de secuencias de comandos). Cuando necesita soluciones relativamente pequeñas o únicas, le permiten lograr mucho más en menos tiempo y menos código (y menos código es casi siempre mejor).
Solo tenga en cuenta que ninguna herramienta es la mejor para cada trabajo. Elija la herramienta más adecuada para la situación. Eso va para los lenguajes de programación al igual que para cualquier herramienta.
fuente
Estoy con su maestro, pero también con @Singletoned cuando dice que su maestro está asumiendo que las consecuencias (por ejemplo, no tener conocimiento del rendimiento) son malas.
Creo que comenzar con C es mejor que comenzar con lenguajes de secuencias de comandos. Como profesor, me concentraría en toda la arquitectura von Neumann (ALU, registros, memoria, puertos de E / S , ...), pasaría directamente a los punteros (lo siento, es realmente un concepto clave [no liberar referencias (es decir, punteros) en lenguajes VM es una fuente principal de pérdidas de memoria]), golpee algunas estructuras de datos (árbol, lista vinculada, tabla hash 1 ), y luego ... suba un nivel de abstracción a otra cosa (OO, programación funcional, algo: reglas de escritura estáticas fuertes , yo \ m /, por lo que no hay "lenguajes de script"> :().
1 Hmm, tal vez estoy de acuerdo con tu maestro en consideraciones de rendimiento, después de todo.
fuente
Creo que lo mejor es comenzar con un lenguaje modular y luego pasar a cosas más complicadas, en mis días comenzamos con Pascal y COBOL e intentamos entender qué significan las subrutinas, las variables de control de flujo, etc. Solo después de sentirme cómodo con Pascal, incluso tuve el deseo de cambiar a lenguajes como C / C ++ y aprender todas las otras técnicas que son más útiles para el programador junior.
fuente
Los dos tienen razón.
Los lenguajes de script definitivamente hacen que sea más difícil para los desarrolladores novatos entender lo que realmente está sucediendo. (También lo hacen las bases de datos, los marcos y las bibliotecas. Ah, y los navegadores, servidores, redes y sistemas de archivos). Cuando entrevisto a desarrolladores más jóvenes, a menudo me sorprende lo poco que saben sobre cómo funcionan realmente las computadoras y cuán propensas son a la carga programación cultural.
Por otro lado, la cosa número uno que busco en las entrevistas no es la comprensión perfecta, es que les encanta hacer cosas. Cuando comencé, una computadora que hacía cualquier cosa era bastante impresionante, así que mi pequeño Apple Basic y el ensamblador 6502 me parecieron realmente increíbles. Pero en estos días las computadoras hacen muchas cosas increíbles, así que creo que está bien que las personas comiencen a un nivel bastante alto si eso es lo que se necesita para engancharse.
Básicamente, creo que está bien comenzar en el extremo poco profundo de la piscina siempre y cuando finalmente desees buscar aguas más profundas.
fuente
En primer lugar, comenzaría con un lenguaje de mayor nivel de abstracción. Actualmente recomendaría Python. La razón más importante para elegir un lenguaje de secuencias de comandos como primer idioma es que puede armar fácilmente algo que funcione. Como Joe menciona en su pregunta, lo más importante al convertirse en programador es que tiene la motivación para seguir y profundizar. Esta motivación se gana cuando puede crear software funcional y útil.
Además de los puntos con la comprensión de la abstracción (alto nivel) y la comprensión de la implementación subyacente (bajo nivel), hay un tercer punto que se pierde. Para ser un buen programador hoy en día, debes dominar los dos puntos anteriores. Además, es fundamental para su competencia que mire constantemente las nuevas tecnologías y puntos de vista. No importa desde qué nivel de abstracción comience, debe mejorar constantemente y cuestionar sus métodos actuales.
Debe quedar claro desde el principio que los lenguajes de programación son meras herramientas para hacer el trabajo. Es muy importante elegir la herramienta correcta para una tarea en particular. Creo que para un programador principiante, un lenguaje de script de alto nivel ayudará a enfatizar este punto. Un lenguaje de nivel superior dará una perspectiva más amplia y motivará al programador a profundizar más.
fuente