A menudo escucho que un programador real puede aprender fácilmente cualquier idioma en una semana. Me han dicho que los idiomas son solo herramientas para hacer las cosas. La programación es la habilidad definitiva que se debe aprender y dominar.
¿Cómo puedo asegurarme de que realmente estoy aprendiendo a programar en lugar de simplemente aprender los detalles de un idioma? ¿Y cómo puedo desarrollar habilidades de programación que se puedan aplicar a todos los idiomas en lugar de solo uno?
"What do you mean you're not an expert in LanguageX?!? I can learn a language in a Week!"
. 1 semana después:"See, I've learnt the language, and here's a Hello World example I copied from Wikipedia to prove it!"
Respuestas:
No se preocupe por conocer algún concepto ridículo de "habilidad" tan comúnmente escuchado en declaraciones como:
Estas declaraciones se basan en una premisa errónea y revelan la falta de experiencia en un espectro más amplio de lenguajes de programación. Son declaraciones muy comunes y muy creídas por una gran cantidad de programadores, no discutiré eso, pero sí discutiré su precisión.
Esto se demuestra simplemente: Pase una semana (o realmente cualquier cantidad de tiempo mayor que un par de días) tratando de aprender los fundamentos de Haskell , Prolog o Agda . Poco después comenzará a escuchar la vieja canción de Sesame Street en su cabeza "Una de estas cosas no es como las otras ...".
Como resultado, hay una gran cantidad de lenguajes de programación, técnicas y enfoques que son tan extraños de lo que el 95% de nosotros hacemos o hemos hecho. Muchos desconocen por completo que cualquiera de estos otros conceptos existen, lo cual está bien y estos conceptos no son necesarios para ser un programador empleado e incluso efectivo.
Pero el hecho sigue siendo: estas técnicas y enfoques existen, son buenos para muchas cosas diferentes y pueden ser muy útiles, pero no son como a lo que estás acostumbrado y la gente no puede simplemente aprenderlos con una tarde de violín.
Además, diría que la mayoría de los casos en que las personas afirman que tienen o pueden aprender cosas tan complejas como lenguajes de programación tan rápido como una semana, sufren un poco del efecto Dunning Kruger , Wikipedia (énfasis mío):
Recomendaría a las personas a esta visión más experimentada sobre el concepto de aprender a programar de Peter Norvig: aprender a programar en diez años .
¡Seguramente, hay un conjunto de principios generales que harán que todos los idiomas sean fáciles de aprender!
Quizás, pero diría que este conjunto de principios es tan amplio que casi siempre habrá idiomas fuera de su alcance de una semana. A medida que agrega nuevos conceptos a la lista con la que está familiarizado y cómodo, esta lista de idiomas fuera de su alcance inmediato puede reducirse, pero me cuesta creer que alguna vez desaparecerá. La lista de enfoques de computación conceptual para las cosas es tan amplia que es desconcertante, desde lenguajes concatenantes hasta lenguajes basados en vectores y lenguajes especializados en IA o metaprogramación ( o lenguajes que existen completamente para admitir expresiones regulares ).
Después de diez años, generalmente podrás programar. Esto significa que puede escribir código algo decente en algún idioma o estilo de idiomas. Entonces, después de 10 años, está listo para comenzar a abordar estos innumerables conceptos transversales para el resto de su vida, y si no es Edsger W. Dijkstra , Donald Knuth o John D. Carmack , no llegará a todos de ellos.
fuente
La clave de esta pregunta es trascender el idioma y pensar no en el idioma en el que está codificando.
WAT?
Los programadores políglotas experimentados piensan en el árbol de sintaxis abstracta (AST) de su propio modelo mental del lenguaje. Uno no piensa "Necesito un bucle for aquí", sino más bien "Necesito recorrer un bucle sobre algo" y se traduce en eso al apropiado para, o mientras que, o iterador o recursión para ese idioma.
Esto es similar a lo que uno ve al aprender un idioma hablado. Las personas que hablan muchos idiomas piensan con fluidez el significado , y sale en un idioma determinado.
Uno puede ver alguna pista de este AST en el par de videos de seguimiento ocular Code Comprehension with Eye Tracking y Eye-Tracking Code Experiment (Novato) donde se observan los movimientos del ojo de un principiante y un programador experimentado. Uno puede ver al programador experimentado 'compilar' el código en su modelo mental y 'ejecutarlo' en su cabeza, mientras que el principiante tiene que iterar sobre el código palabra por palabra clave.
Por lo tanto, la clave para desarrollar habilidades de programación para aplicar a todos los idiomas es aprender varios idiomas para que uno pueda distanciarse de tener el modelo mental de un idioma y desarrollar la capacidad de generar el AST para un problema por sí mismo en un idioma principal que luego se traduce a un idioma determinado.
Una vez que uno tiene esta capacidad de usar el AST en la cabeza, aprender otro idioma dentro de una escuela de pensamiento similar (ir a Befunge es un poco un salto desde Java, pero no tanto desde Forth ) se vuelve mucho más fácil: es 'solo' traducir el AST a un nuevo idioma que es mucho más fácil la tercera, cuarta y quinta (etc.) vez que se hace.
Hay un artículo clásico, Los programadores reales no usan Pascal . Parte de esto dice:
También hay bits para los que no puedes usar el AST mental, también debes pensar en el lenguaje. Esto lleva un poco de tiempo para lograrlo (todavía estoy acusado de escribir código Perl en Python y mi primer código Lisp fue revisado diciendo "Este es un muy buen programa en C").
A esto, debo señalar un artículo publicado por la ACM, Cómo no escribir Fortran en cualquier idioma . El tercer párrafo del artículo (que no son citas destacadas) aborda directamente la pregunta en cuestión:
No es suficiente tener el AST, es necesario tener el AST que se pueda traducir a otros idiomas. Tener un Fortran AST en tu cabeza y escribir código Fortran en Java no es algo bueno. También se debe estar lo suficientemente familiarizado con el idioma y sus expresiones idiomáticas para poder pensar en el idioma (a pesar de lo que dije en la parte superior).
He visto código Java escrito por alguien que no había dejado de escribir código C. Había un objeto con un método principal. En este objeto había un montón de métodos estáticos llamados
main
y clases internas privadas que tenían campos públicos (y por lo tanto se parecían mucho a los puntales). Era un código C escrito en Java. Todo lo que se hizo fue traducir la sintaxis de un idioma a otro.Para superar este punto, uno debe continuar escribiendo código en varios idiomas, no pensar en esos idiomas al diseñar el código, sino pensar en ellos al traducir el diseño al código para que funcione correctamente con las expresiones idiomáticas del lenguaje.
La única manera de llegar allí, siendo capaz de desarrollar habilidades de programación que se puedan aplicar a todos los idiomas, es continuar aprendiendo idiomas y mantener ese lenguaje de programación mental flexible en lugar de estar vinculado a un idioma.
(Mis disculpas a ChaosPandion por tomar mucho de la idea que presentó ).
fuente
Elija un idioma y comience a codificar. Python es una buena opción para un principiante, y hay tutoriales disponibles en línea , para que pueda aprender cómo hacerlo correctamente.
Todo se sigue de eso. Sus intereses lo llevarán a marcos y conceptos de diseño que agregarán sofisticación a sus programas. Descubrirá que hay cursos en línea que puede tomar que lo basarán en los fundamentos y la teoría, y que existen diferentes paradigmas de programación que puede explorar, etc.
Y sí, descubrirá idiomas como Haskell que le enseñarán algo nuevo, una vez que tenga una base sólida en los fundamentos.
Algunos programadores probablemente piensan que todos los idiomas son iguales porque no han sido expuestos a ninguno que los haga pensar de manera diferente. Todos los idiomas más utilizados se derivan de Algol (son esencialmente lenguajes de procedimiento), y de ellos, la mayoría son lenguajes de llaves similares a C. Todos ellos hacen esencialmente las mismas cosas, aunque algunos con más sofisticación que otros.
fuente
La programación se trata de resolver problemas de tal manera que la solución se pueda expresar en una gramática tan restringida que se pueda implementar con un lenguaje de programación. El arte de la programación es, por lo tanto, el arte de resolver problemas.
Ciertos lenguajes invitan a otros paradigmas de programación, como la orientación a objetos, eventos, multihilo y basados en MVC. Todos estos son solo modelos y patrones y no tienen nada que ver realmente con la implementación.
Si puede sentarse y resolver un problema en papel de tal manera que pueda traducirse fácilmente a código y esté asociado con un modelo apropiado para su plataforma, entonces usted es un programador. Si todo lo que puede hacer es tomar esas soluciones e implementarlas en nuestro idioma elegido, entonces ese es otro asunto.
He estado programando durante 30 años (¡OMFG!) Y todavía lo uso
php.net
para buscar comandos en PHP porque no es mi primer idioma.Diría que la experiencia en idiomas es inversamente proporcional a la frecuencia con la que mira el manual o el stackoverflow. La experiencia en programación es la facilidad con que se resuelven los problemas de manera compatible con los lenguajes de programación de computadoras.
En noticias relacionadas, aprendí Ruby la semana pasada. Aunque no soy un "experto", puedo resolver un problema que podría escribir en Perl, por ejemplo, y luego pasar una edad traduciéndolo a Ruby mientras lo aprendo un poco más.
fuente
Creo que, como con cualquier cosa, la práctica hace la perfección. Simplemente no se encasille en hacer siempre lo mismo o siempre usar el mismo idioma y seguir aprendiendo cosas en cada proyecto.
Creo que puedes dibujar fácilmente un paralelo a algo como aprender a tocar la guitarra. Cualquier buen músico puede aprender a tocar una nueva canción en un período de tiempo muy corto, porque ya conoce todos los acordes y toda la teoría detrás de por qué los acordes se tocan como son. ¿Cómo se ponen tan bien? Simplemente han tocado tantas canciones que todos los patrones se han mezclado, mientras que al mismo tiempo complementaron su conocimiento con la teoría real documentada de que esos patrones también se suscriben.
Entonces, quizás puedas tocar algunas canciones muy bien, pero no puedes desviarte o aprender nuevas canciones rápidamente. Este es probablemente el equivalente de un programador .NET que continúa haciendo la misma aplicación CRUD una y otra vez, en algún momento intente algo nuevo, agregue algunas llamadas de servicio web o una IU avanzada, o escríbala en un idioma completamente nuevo. Cuando llegue a un punto crítico, vea por qué las cosas suceden de la manera en que suceden, haga preguntas en Stack Exchange, etc. Eventualmente, verá todos los patrones que surgen continuamente y conocerá algunas de las teorías subyacentes y aprenderá un nuevo idioma. parece casi tan desalentador.
fuente
No voy a abordar cuánto tiempo lleva aprender un idioma o lo que significa aprender un idioma, sino que voy a abordar su problema real: cómo determinar si ha aprendido a programar o ha aprendido un lenguaje de programación .
Has aprendido a programar si has aprendido a dividir un problema en procesos discretos y luego usar esos procesos para resolverlo. Ha aprendido un lenguaje de programación si ha aprendido la sintaxis de un idioma y sabe cómo ajustar cómo funciona un proceso, cuando se implementa en ese idioma.
Esto no quiere decir que deba programar en Fortan cuando use Lisp o sumar los valores de una columna en una tabla en una base de datos usando un cursor. Solo que el lenguaje es un detalle de implementación. Uno que puede cambiar los procesos que se necesitan, pero no la necesidad de identificar y crear procesos: al final hay una implementación en el mundo real, con entrada / salida y resultados deseados.
fuente
Mi estrategia siempre ha sido centrarme en habilidades puras en lugar de habilidades específicas.
En lugar de aprender la sintaxis especial de Python (o cualquier idioma) para lo que sea que quiera hacer, dedique sus ciclos cerebrales a resolver problemas abstractos, como la mejor manera de resolver cada problema en esa categoría.
De esa manera, sabrá qué hacer sin importar el idioma, y en su mayoría poseerá habilidades atemporales que se pueden usar para programar en cualquier idioma.
Específicamente, evite las herramientas que están llenas de trampas, como MySQL o lenguajes obstinados, como Java, ya que lo que aprenda al usar estas herramientas tendrá una gran proporción de conocimiento específico de la herramienta que seguramente se volverá inútil bastante rápido.
Al contrario de lo que se ha dicho en muchas respuestas, NO escuche a otros programadores, usted es un novato y no hay forma de distinguir lo falso de lo real, por lo que es mejor tomar todo con una cucharada de sal.
Desea cuestionarse todo el tiempo y aceptar solo cuando la solución es rápida, elegante y confiable.
fuente
Ahí está el enfoque teórico. Aprender sobre cómo funcionan realmente las computadoras bajo la cubierta. Cómo se unen las instrucciones básicas del procesador para hacer que las operaciones y estructuras más complejas que damos por sentado en la programación de alto nivel.
Luego está el enfoque de programación más práctico. El principal punto de fricción que las personas plagadas suelen etiquetar como "no buenos programadores" es que realmente solo saben un idioma. E incluso si conocen a otros, programan en ellos de la misma manera que lo hacen con su lengua materna . Ese es un ciclo que uno debe romper si realmente quieren aprender a programar. La respuesta predeterminada a eso es aprender al menos un lenguaje de cada paradigma de programación. Aprenda un lenguaje OOP, un lenguaje funcional, un lenguaje de script ... etc. Y al aprender no me refiero a aprender la sintaxis . Aprendes un idioma al usarlo para crear algo.
Personalmente, cuando quiero aprender un nuevo idioma, uso los acertijos del Proyecto Euler . Voy a un rompecabezas que ya he resuelto en un lenguaje OOP (como ejemplo) y trato de resolverlo usando uno funcional mientras trato de seguir las mejores prácticas del nuevo lenguaje. Cuando resuelve el mismo problema utilizando dos enfoques fundamentalmente diferentes, no solo ve cuáles son las diferencias reales, sino que también le muestran dónde están las áreas comunes. Estas áreas comunes que comparten todos los idiomas es la programación real , las diferencias son solo diferentes formas de lograrlo.
fuente
Bueno, la mayoría de las cosas que quería decir ya se han dicho. Lo que me gustaría agregar es una analogía muy simple.
Si los lenguajes de programación se consideran meras herramientas, incluso entonces no hay absolutamente ninguna lógica en ser bueno en uno hace que ser bueno en el otro sea un juego de niños.
Los idiomas a menudo no son difíciles de aprender, pero se necesita paciencia y ejercicio para ser bueno en eso. Además, no hay una forma correcta de aprender a programar.
Aquí hay un par de cosas que quizás quieras hacer al aprender un idioma.
Experimente nuevos idiomas, explore nuevas bibliotecas, aprenda nuevos trucos en su tiempo libre. Antes de que te des cuenta, te sorprenderás con tu propia habilidad.
fuente
En mi caso, aprendo cómo programar realmente a través de lo siguiente:
Además, como han mencionado sus comentaristas, no olvide dominar sus herramientas también. Aprender todas las mejores prácticas y las mejores teorías no sirve de nada o se implementará de manera deficiente si no conoce lo suficiente sobre su herramienta, en este caso, un lenguaje de programación.
fuente
Creo que si puedes pensar analíticamente, tienes un buen comienzo.
Aprenda el idioma que desee y trabaje usted mismo a través de una serie de ejemplos, por ejemplo, tal como se presentan en casi todos los libros que enseñan programación.
Luego intenta resolver tus propios problemas. Intenta encontrar diferentes soluciones y compáralas. La velocidad y el uso de la memoria son factores de uso común que importan. Discuta sus soluciones con otros programadores.
Lea el código de otros programadores e intente comprender por qué resolvieron el problema de esta manera.
También debe leer algunos libros sobre algoritmos para obtener una visión general sobre los enfoques estándar. Los problemas nuevos son a menudo modificaciones de problemas viejos.
Mucha práctica y trabajar con código también en equipos lo ayudará a aumentar sus habilidades paso a paso.
Espero que mi opinión responda a su pregunta al menos parcial.
fuente