¿Qué impacto tienen los lenguajes de scripting en los programadores junior? [cerrado]


18

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?



44
Aprendí a conducir en un automóvil con transmisión automática. Más tarde, obtuve uno con una transmisión manual. Me tomó un tiempo aprender, y me sentí afortunada de no haber tenido que aprender el embrague y cambiar junto con todo lo demás.
David Thornley

2
@ Singletoned: cierto. De alguna manera, tuve que pensar en xkcd.com/326 aunque ...


44
Personalmente, creo que no es natural aprender a programar bajo y luego alto. Aprendemos a gatear, luego caminar, luego correr, hablar y escribir. No estoy seguro de cuál es la lógica para la reversión del orden natural en la universidad. Por lo general, solo escucho a la gente concluir "porque si fue difícil para mí aprender, entonces debe ser difícil para ti". Incluso Joel dijo esto. Supongo que el ciclo nunca terminará.
P.Brian.Mackey

Respuestas:


26

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.


1
+1, aunque no creo que C sea más fácil de aprender que Python en ningún sentido. Quizás haya menos conceptos para aprender en general, pero aprenderá más en la misma cantidad de tiempo con Python. Y, por supuesto, si C es demasiado fácil, siempre hay C ++, que le enseña las complejidades de los lenguajes de alto y bajo nivel. ;)
Martin

+1, este fue mi pensamiento! Desearía haber leído esto antes de la clase :)
joe_coolish

22

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í.


¡+1 para la respuesta perfecta - mostrando de manera concisa lo equivocada que está la pregunta original! (Como pura coincidencia, comencé con BASIC también ;-)
Péter Török

55
Me sorprende cuántas personas se quedan allí ..: o /
Gary Willoughby

1
Excelente respuesta. Breve, preciso y al grano. Empecé con BASIC también.
Michael Riley - AKA Gunny

11

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.


66
Tengo que estar en desacuerdo contigo. Las consecuencias son malas, porque la consecuencia es la ignorancia. Esto significa que eventualmente, algo se romperá y el problema estará en un nivel de abstracción más bajo de lo que entiendes, por lo que no tendrás idea de cómo solucionarlo. Eso siempre es algo malo.
Mason Wheeler

66
Tengo que estar de acuerdo contigo. Las consecuencias de no saber lo que sucede debajo del capó es una profunda simplicidad y franqueza de expresión sin preocuparse por los matices de hardware. Los niveles más bajos de abstracción son para diseñadores de lenguaje, no para desarrolladores de aplicaciones.
S.Lott

1
@Mason: por supuesto. Una vez hice una cantidad muy sustancial de dinero ahorrando los traseros de un equipo de programadores que no tenían idea de lo que realmente estaba sucediendo debajo del capó, y por lo tanto no podían hacer que su sistema de producción funcionara bien o funcionara de manera confiable. (Una vez porque ese tipo de trabajo apesta. ¡La vida es demasiado corta!)
William Pietri

1
@Mason - Estoy de acuerdo con lo que dijiste, que es importante tener ese conocimiento si vas a programar profesionalmente. Mi conocimiento de punteros, estructuras discretas y cálculo lambda es extremadamente valioso. He estado atrapado en equipos donde los miembros de mi equipo no tenían estas habilidades y terminaron haciendo un código demasiado complicado o con muchos errores. solo porque no sabían mejor. Parece que a veces las universidades alimentan a los estudiantes de CS con demasiada leche y poca carne, pero por otro lado, si alimentan a los programadores principiantes con carne, corren el riesgo de que abandonen.
joe_coolish

1
@ Joe: De acuerdo con Joel, hacer que los que no pueden manejarlo abandonen es el punto. Y como no solo es un programador de computadoras sino también un usuario de computadoras , uno que regularmente tiene que trabajar con programas horribles que solo puedo asumir que fueron creados por codificadores incompetentes, ¡realmente deseo que el bit de "hacerlos abandonar" sea más exitoso!
Mason Wheeler

5

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).


3

No hay nada simple sobre Python. Eche un vistazo a Unicode y meta-programación.


Estoy de acuerdo en que Python puede ser muy complejo y MUY poderoso. Pero lo básico (de manipulación de cadenas, la manipulación de matrices, etc.) son mucho más fáciles en Python que en C.
joe_coolish

1
Python es muy simple para comenzar y muchas tareas cotidianas son un orden de magnitud más simple que, por ejemplo, en los lenguajes de sistemas. No, el lenguaje en su conjunto, sus detalles sangrientos y las características avanzadas no son simples (esto es válido para todo el lenguaje que no sea de juguete). Pero esa no era la pregunta.

1
Entonces, ¿por qué mi if searchstring.lower () en filecontent.lower (): no funciona? debido al bom en el archivo sql UTF-16LE en tfs en windows con Python2.7. No fue divertido Lo tengo funcionando. Tomó unas horas. string.find () tampoco funcionaba ... ¡Argghhh!
Christopher Mahan

1
¿Cómo es más sencillo manejar Unicode en C?
dan04

3

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.


66
Pero Python y Ruby están fuertemente tipados. Esto es ortogonal a ser escrito dinámicamente. Las cadenas y los números no se convierten implícitamente entre sí.
dsimcha

3
@dsimcha: Sí, ¿y cómo refuta eso lo que dijo @Ingo?
Jim G.

1
Porque esta pregunta es principalmente sobre Ruby y Python. Pensé que estaba insinuando que cree que Ruby y Python están mal escritos, lo cual es un malentendido común.
dsimcha

1
@ davidk01: ese es mi punto: los valores tienen tipos, lo queramos o no. Pero en los idiomas de tipo dinámico (si ese término le agrada más), las variables no. En cambio, la verificación de tipo se realiza en tiempo de ejecución para distinguir entre las muchas variantes de Unitype.
Ingo

2
@Ingo: al menos solía ser capaz de encontrar usuarios de Common Lisp que pensaran que la falta de escritura estática era un beneficio (en realidad, la escritura estática opcional, utilizable para fines de verificación de errores o de rendimiento), ya que aceleró el desarrollo y eso los errores que la escritura estática habría evitado no resultaron difíciles de encontrar y solucionar en la práctica. No he visto nada más que opinión de una manera u otra.
David Thornley

2

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.


2

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.


1

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


1
Pruébalo antes de sospechar. La principal diferencia es que no le importa un comino, donde se trata de una Fooo Baro algo completamente diferente, siempre y cuando sea posible .frobnicate()de cualquier manera. Sin interfaces explícitas.

Estoy bastante familiarizado con los lenguajes dinámicos, ya que mi trabajo diario es con Ruby on Rails. Y sí, esa es una convención importante dentro de la comunidad dinámica del lenguaje. En general, esto se llama 'tipear pato'. En la literatura de investigación, se llaman tipos estructurales, y hay algunas convenciones de sintaxis que pueden mostrarle cómo se ve un 'tipo graznable'. No solo eso, hay sistemas de tipos que pueden reconocerlos y verificar que su programa está tratando a los patos con amabilidad.
Farley Knight el

Sé acerca de los tipos estructurales y los considero una buena idea. Pero como no hay un solo lenguaje maduro, utilizado remotamente (la base de usuarios de nivel O'Caml sería un buen comienzo) que los usa, no los considero una alternativa práctica al tipeo dinámico. Triste, pero hecho.

Los idiomas ampliamente utilizados no lo hacen, pero eso no le impide arrancar su propio sistema de tipos en uno ampliamente utilizado. Estoy seguro de que has visto documentos sobre cosas como inferencia de tipos para lenguajes dinámicos.
Farley Knight,

Una vez más, no considero que algo usado por mí y el chico de al lado sea una alternativa práctica . Un programador necesita cosas como bibliotecas, sintaxis estable, herramientas, etc.

1

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.


0

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.


La programación descuidada es una fuente de pérdidas de memoria y no se necesita mucho para enseñar a las personas a realizar un seguimiento de los recursos, como los identificadores de archivos. Hay innumerables programas en C con pérdidas de memoria, por lo que no estoy seguro de lo que está haciendo al enseñarle a la gente sobre punteros lo antes posible.
davidk01

Eso es cierto, pero ... (a) no entender los conceptos básicos conduce a un código incorrecto (a través de la piratería hasta la programación correcta o descuidada), y (b) estaba tratando de motivar por qué los punteros siguen siendo relevantes, no afirmando que C es mejor que los lenguajes recolectados de basura en términos de pérdidas de memoria. El objetivo de llegar a los punteros lo antes posible es para que podamos sacarle el mayor provecho a C.
JohnL4

0

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.


0

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.


0

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.