¿Cómo puedo realmente dominar un lenguaje de programación?

103

Sé que al aprender un idioma, simplemente puedes comprar un libro, seguir los ejemplos y, siempre que sea posible, probar los ejercicios. Pero lo que realmente estoy buscando es cómo dominar el idioma una vez que lo hayas aprendido.

Ahora sé que la experiencia es un factor importante, pero ¿qué pasa con el aprendizaje de lo interno del idioma, cuál es la estructura subyacente, etc.

Hay artículos que dicen leer este libro, leer ese libro, hacer este juego y ese juego. Pero para mí esto no significa dominar un idioma. Quiero poder leer el código de otras personas y comprenderlo, no importa lo difícil que sea. Comprender cuándo usar una función y cuándo otra, etc., etc.

La lista podría seguir y seguir, pero creo que he hecho el punto. :)

Y finalmente, tome cualquier lenguaje como ejemplo si es necesario, aunque lo mejor sería si se tomara C como ejemplo.

cprogcr
fuente
11
La experiencia es todo lo que realmente se reduce a. Toda la teoría en la que eres experto es inútil a menos que puedas aplicarla prácticamente.
Simon Whitehead
2
Implemente un compilador para este lenguaje. En realidad, esa es mi forma favorita de probar cualquier idioma nuevo. Si suena demasiado fácil y aburrido, intente definir la semántica del lenguaje formal en su lugar, utilizando K framework o algo similar.
SK-logic
66
"hombre, la papa es dinossaurio, universo del automóvil". no importa cuánto domines un idioma, si el código es malo y no tiene sentido, aún es difícil de entender.
Renato Dinhani
2
Siento que nos falta un poco el punto. Los idiomas evolucionan, por lo que no hay dominio de un idioma, creces con él, cuanto más lo usas, más tienes que aprender.
nycynik
2
Código y código de lectura. Tome una parte aleatoria del kernel de Linux (Programación en C) y descubra qué hace una función.
Alex Hart

Respuestas:

166

Tengo que responder: "Todo lo anterior". La gente discute sobre si la codificación es un arte, un oficio, una disciplina de ingeniería o una rama de las matemáticas, y creo que es más justo decir que es parte de cada uno. Como tal, cuantas más técnicas traigas al dominio del idioma, mejor. Aquí está una lista parcial:

  • Usa el idioma todo el día, todos los días. Por lo general, esto significa estar empleado a tiempo completo en el idioma.

  • Lee todo lo que puedas sobre el idioma. Especialmente, "mejores prácticas" y modismos.

  • Únase a un grupo de usuarios para hablar con otros sobre el idioma y lo que hacen con él.

  • ¡Trabaja con el código de otras personas! No hay una forma más rápida de aprender qué no hacer en un idioma que tener que limpiar después de alguien que hizo algo horrible.

  • Apoye el código que escribe: ¡cada error se convierte en un recorrido por sus peores decisiones!

  • Estudiar informática y lenguas en general.

  • Aprende un idioma muy diferente. Un gran complemento para C sería un lenguaje funcional como Lisp. Esto cambiará la forma en que piensas sobre tu lenguaje procesal al revés.

  • Aprenda a usar los marcos y las API disponibles para ese idioma.

  • Tómese el tiempo para hacer sus propios experimentos con el idioma. SICP no es aplicable a C, pero la actitud de aprender un idioma probando sus límites es muy productiva.

  • Lea la historia del idioma para saber por qué se hizo de la forma en que está.

  • Asista a conferencias para escuchar el idioma que hablan los autores, o para escuchar lo que los líderes de la industria están haciendo con el idioma.

  • Toma una clase en el idioma.

  • Enseñar el idioma a otros (gracias a Bryan Oakley )

En resumen, haga todo lo que pueda pensar. No hay forma de saberlo todo sobre la mayoría de los idiomas. Cada técnica de aprendizaje que utiliza aporta una perspectiva adicional a su comprensión.

GlenPeterson
fuente
76
+5 para admitir el código que escribe: ¡cada error se convierte en un recorrido por sus peores decisiones!
Jennifer S
8
+1 únicamente para la oración final:Every technique you use to learn brings and additional perspective to your understanding.
Izkata
1
@Izkata: Dios mío, ¿escribí eso? En realidad soy un hablante nativo de inglés! Lo he corregido. ¡Gracias!
GlenPeterson
2
@GlenPeterson ... En realidad, acabo de copiar pegado sin prestar mucha atención a la frase "desactivada". El +1 fue de hecho por la intención detrás de él. = P
Izkata
13
+1 para "Aprende un lenguaje muy diferente. Un gran complemento para C sería un lenguaje funcional como Lisp. Esto cambiará la forma en que piensas sobre tu lenguaje procesal al revés". - Esto es probablemente lo más importante. Le ayuda a aprender cómo aprender sobre programación (es decir, qué buscar en qué situación).
nada101
53

Se necesitan 10,000 horas de práctica.

Lea "Enseñe a programar en diez años"

Puntos clave desde arriba:

  • Obtener interesado en la programación, y hacer algo porque es divertido. Asegúrese de que siga siendo lo suficientemente divertido como para estar dispuesto a dedicar sus diez años / 10,000 horas.
  • Programa. El mejor tipo de aprendizaje es aprender haciendo.
  • Hable con otros programadores; leer otros programas
vartec
fuente
1
¡Eso es lo que iba a publicar! Todavía no he pasado suficientes horas en P.SE, obviamente.
Martijn Pieters
@MartijnPieters: :-D
vartec
8
¡Gran título para un libro! No puedo esperar a la secuela, "¡Enséñate a programar bien en 20 años!"
GlenPeterson
16
Sin embargo, debes asegurarte de no repetir las mismas 10 horas 1000 veces ...
Izkata
Ninguna cantidad de experiencia técnica ayudará a alguien a saber para qué automatizar o crear un programa. Esto es como decir: vaya al gimnasio y haga todos los ejercicios fundamentales en el baloncesto durante diez años, durante 1 hora cada día. ¡Maricón! Eres una superestrella del baloncesto (maestro) ... no, es más que solo habilidad técnica. Por lo tanto, no considero que esto sea una respuesta a la pregunta, es decir, ¿cómo convertirse en un maestro? Esto podría ser parte de la solución, pero no es la poción mágica para dominar. Lo sé, ¡no soy un maestro!
oemb1905
36

NUNCA te consideres el maestro de todo el idioma hasta que hayas implementado un lenguaje mejor que ese. Lo que significa que, para aprender cómo funciona un idioma en particular desde abajo, obtenga un libro que le enseñe los conceptos del compilador / intérprete del idioma. Por ejemplo:

  • C: El libro del compilador de LCC

  • C ++: el diseño y la evolución de C ++ (y luego siga compilando su propio compilador de C ++ o al menos comprenda la implementación de uno utilizando el código del compilador C ++ de GNU)

  • Java: Obtenga "Inside JVM" y obtenga el código fuente de javac. El código .C de "java" también es útil

  • Python: implementación de CPython.

  • ObjectiveC: Casi cualquier material de Apple sobre los aspectos internos de ObjC runtime env y los códigos fuente del compilador lo ayudarán.

  • Lisp: SICP Book (te enseña Scheme y un compilador-intérprete básico para lenguaje similar al lisp): Lisp in Small Pieces (otro buen libro).

Aniket Inge
fuente
1
Ahora esto es lo que yo llamo una respuesta. Ya he aceptado una, pero esta merecería una "mejor respuesta" si fuera un poco antes
Cprogcr
2
No tienes idea de cuánto ayudó tu respuesta. Estoy leyendo sobre los libros que mencionaste y son el tipo de cosas que necesito.
cprogcr
jeje que aprendí de ellos. Encantado de ayudar :-)
Aniket Inge
como mencionó C como ejemplo, permítame darle los nombres de dos libros más, como regalo, que solía dominar C como el dorso de mi mano): 1. OOC.PDF (disponible gratuitamente en línea) y 2. Minix Book (aunque es un libro para implementadores de sistemas operativos, esto es lo que Linus Torvalds leyó antes de implementar Linux)
Aniket Inge
1
Sí, por Andrew Tenenbaum, ese es el libro. Cualquier edición es buena para leer. No le dice cómo funciona "C", pero cuando ve cómo se implementa la biblioteca C para que funcione con un sistema operativo que USTED creó, ¡comienza a comprender C aún mejor! Tal vez lo suficiente como para permitirle modificarlo. (Y ahí es donde entra OOC)
Aniket Inge
12

Intente usar el idioma para algo para lo que no fue diseñado. Escriba un controlador de dispositivo en Python o una biblioteca de manipulación matricial en COBOL. Creo que una de las mejores maneras de dominar un idioma es realmente impulsarlo, tratando de hacer que sus fortalezas superen sus debilidades.

TMN
fuente
1
Cuando estaba en la universidad, decidía que había "dominado" un idioma una vez que escribí Pong en él. Esto funcionó bastante bien hasta que aprendí MIPS. Todavía tengo pesadillas.
Roddy of the Frozen Peas
Sitio web en C se puede hacer?
BigSack
10

Te lo pondré fácil. Nunca dominarás un idioma. Período. Si crees que sí, entonces obviamente no lo has hecho. No hay una cima de montaña que de repente alcances y digas "Bueno, ahora, he dominado completamente ese idioma. ¿Y ahora qué?" Incluso los programadores experimentados que han trabajado con el mismo idioma durante décadas le dirán que a veces todavía se encuentran con nuevas ideas, procesos, prácticas, etc. El verdadero objetivo es dominar su comprensión conceptual de un idioma o idiomas. La capacidad de aprender nuevos conceptos y la velocidad con la que puede adoptar características nuevas o modificadas en el idioma es mucho más importante que el conocimiento de memoria de cada palabra clave y sintaxis. Deje de preocuparse por "dominar" un idioma y simplemente preocúpese por mejorar y refinar continuamente la calidad y la eficiencia de su código.

Chris Pratt
fuente
2
The true goal is to master your conceptual understanding of a language or languages.Exactamente. Eso es lo que realmente quise decir.
cprogcr
Cualquier lenguaje de programación es finito. Está construido con un número finito de conceptos, requiere un número finito de trucos idiomáticos. Por lo tanto, es fácil dominar cualquier idioma. Por supuesto, uno no puede dominar la programación en general, siempre existe la posibilidad de una mejora adicional, pero la pregunta es específicamente sobre un lenguaje dado .
SK-logic
SK-logic: los lenguajes de programación cambian, al igual que sus bibliotecas y entornos. Como resultado, también cambia su forma de trabajar con el idioma. Por ejemplo, jQuery cambió la forma en que trabajamos con Javascript.
orlp
Probablemente sea cierto que nadie puede realmente dominar un lenguaje como C ++, pero para los algo minimalistas como Scheme debería ser bastante posible, como dice @ SK-logic, es realmente la programación , en cualquier lenguaje, lo que no se puede dominar, porque El campo de aplicaciones es infinito.
Leftaroundabout
1
@nightcracker, los idiomas no "evolucionan". C99 siempre será C99 y nunca cambiará. C ++ 11 siempre seguirá siendo C ++ 11, incluso después de que sea reemplazado por un lenguaje de próxima generación. Los entornos "evolucionan", sí, pero jQuery no introdujo ninguna técnica nueva que no se conocía antes en las comunidades de otros idiomas. Eran nuevos en la comunidad limitada de Javascript solamente.
SK-logic
5

Ya sabes la respuesta a esto

  • Tienes que usar el lenguaje. Mucho. Para resolver una gama de problemas tan diversa como sea posible
  • Debe leer (e, idealmente, trabajar con) el código de otras personas, preferiblemente aquellos que tengan un grado de dominio (es decir, una comprensión profunda de al menos algún aspecto del idioma). Por extensión, si puede hablar con la gente sobre la resolución de problemas con el idioma, mucho mejor.

Todo se reduce al trabajo duro y la determinación y por todo lo que nunca puede llegar allí.

Piense de dónde obtenemos el término: para convertirse en un maestro artesano, tenía que ser un aprendiz y luego un oficial y solo ellos tendrían la oportunidad de convertirse en un maestro. En el camino se te enseñaría y practicarías y observarías e interrogarías a otros en su oficio y (con suerte) aprenderías de ellos.

No hay bala mágica ...

Murph
fuente
2

Comience leyendo y entendiendo qué es SDLC (también conocido como ciclo de vida de desarrollo de software). Es un proceso iterativo que implica superación personal, aprendizaje,**practicing, practicing...**

ingrese la descripción de la imagen aquí

Eso abriría sus horizontes sobre qué áreas necesita aprender o mejorar. Hay varios libros básicos de ingeniería de software que también le resultarán muy útiles para leer una vez que cree un par de aplicaciones por su cuenta.

Además, una vez que se sienta seguro con un lenguaje OOP , puede comenzar a aprender patrones de diseño , y Head First Design patterns es realmente un buen libro para considerar. Amo este libro.

EL Yusubov
fuente
1
Gracias. Ya había elegido la respuesta cuando leí esto, pero definitivamente seguiré tu consejo.
cprogcr
No estoy seguro de por qué se ha votado negativamente, por favor, hágame saber qué debe mejorarse.
EL Yusubov
2

No hay sustituto para la experiencia. Para dominar algo, tienes que hacerlo / usarlo, en gran medida, para muchas cosas diferentes.

Así que adelante y use ese lenguaje para ejercicios (como el Proyecto Euler ) y proyectos personales, cosas que realmente necesita o cosas que cree que son interesantes. Escribe un juego, escribe una aplicación web, escribe un analizador, lo que quieras. Y en cada paso, esfuércese por comprender lo que está haciendo en lugar de simplemente pegar el código o seguir las instrucciones.

Quiero poder leer el código de otras personas y comprenderlo, no importa lo difícil que sea.

Eso es algo que puede hacer de inmediato una vez que haya entendido la sintaxis básica. Simplemente tome un código y tómese el tiempo para descifrarlo en detalle. Busque cosas que no entienda o haga preguntas específicas en lugares como Stack Overflow .

Michael Borgwardt
fuente
2

En el lado de alto nivel del problema, aprenda sobre arquitectura: cómo organizar sus proyectos, cuál es su estructura. No dejes que crezcan al azar.

En el nivel medio, aprende diferentes técnicas y paradigmas. Cuantas más herramientas diversas tenga en su repertorio, más poder tendrá para usted. Si solo ha estudiado java, python y ruby, ha estado expuesto solo a una muy pequeña porción del espacio de programación. Aprenda programación imperativa y funcional, aprenda prólogo y J. La idea no es "dominar" cien idiomas, sino aprender sobre diferentes formas de resolver los mismos problemas.

En el lado de bajo nivel del problema, una cosa que podría ayudarlo a ser un mejor programador (de hecho, mejor en lo que sea que haga) es tener un buen modelo mental de la plataforma. Por ejemplo, puede aprender cómo funcionan las estructuras de control de C y conocer las bibliotecas más comunes, pero si no tiene un modelo mental de cómo funcionan los punteros y la memoria, tendrá problemas con expresiones moderadamente complejas.

José Dinuncio
fuente
1

¿Puedo hacer un par de sugerencias?

Primero, si puede encontrar un mentor para discutir su uso del idioma, y ​​para obtener los mejores consejos y trucos, y para responder cuando una técnica es mejor que otra.

En segundo lugar, practique tanto como sea posible y pruebe el idioma al máximo. Solía ​​trabajar en equipo, eso (por diversión) escogía un verbo u otra parte del lenguaje de programación del manual cada día. Fue una marca de honor si pudieras incluirlo en tu código ese día. Esto significaba que todo el equipo de programación necesitaba ver y comprender el término (a veces) oscuro para comprenderlo y usarlo de manera efectiva. Algunos días fallamos, ¡pero ese equipo fue divertido de trabajar y realmente se encendió técnicamente!

Nicholas Sibson
fuente
0

Los lenguajes de programación reflejan las ideas detrás de los paradigmas de programación que se desarrollaron para el desarrollo de software de propósito general o para desarrollar software de propósito especial. Por ejemplo, un lenguaje de programa como Java representa el paradigma del programa orientado a objetos, pero AspectJ (una extensión de Java) se usa para programar de acuerdo con la programación orientada a aspectos.

Dada esta breve introducción, para dominar realmente un idioma, comprar y leer un libro por sí solo no sería de mucha ayuda. Debería comprender el entorno en el que puede programar utilizando el lenguaje deseado, aprender sobre el paradigma y, lo que es más importante, crear una aplicación significativa utilizando el lenguaje. Desarrollar una pequeña aplicación que pueda darle una idea de las diversas herramientas proporcionadas por el lenguaje es un enfoque de aprendizaje realmente útil.

He visto personas provenientes de la comunidad C pura sin aprender nada sobre la orientación a objetos y la lucha para aprender Java u objetivo-c. También he visto a personas luchar con la programación de interfaces de usuario cuando realmente no han comprendido los elementos de la interfaz de usuario, la programación basada en eventos, etc.

¡Espero que esto ayude!

hsnm
fuente
0

Agregaría dos elementos a la lista de Glen

  • Intenta resolver un problema difícil que otros tienen, por ejemplo, dar respuestas sobre SO
  • Leer los diseñadores de idiomas blogs / libro. Ese es el mejor recurso de conocimiento profundo. Sabrías cuál es la decisión de diseño detrás de la razón X.
Lukasz Madon
fuente
0

Para construir sobre lo que dijo @TMN. He tenido un gran éxito en el aprendizaje de idiomas al escribir el mismo programa en un idioma diferente.

Por ejemplo, escribir un programa que lee en un archivo CSV, analiza el texto y luego lo vuelve a escribir en un segundo CSV con las columnas en orden inverso.

Me gusta esto,

Columna1, Columna2, Columna3

a

Columna3, Columna2, Columna1

Esto le dará una comprensión básica o el idioma. Entonces vea qué más puede hacer. Tal vez permita la sustitución de valores o el reordenamiento o la lectura desde la línea de comandos. Hazlo tan complejo como quieras.

También creo lo que dijo @GlenPeterson sobre

Aprende un idioma muy diferente. Un gran complemento para C sería un lenguaje funcional como Lisp. Esto cambiará la forma en que piensas sobre tu lenguaje procesal al revés.

Es una gran idea. Sugeriría un lenguaje como Haskell porque en las últimas versiones puedes programar usando los cuatro paradigmas de programación de OO, de procedimiento, lógico o funcional. Aunque en realidad es un lenguaje funcional, puede implementar con algún esfuerzo los otros paradigmas que serían una buena experiencia de aprendizaje.

Gran lenguaje para jugar.

Dan
fuente
0

No puedes aprender un idioma del libro. Todo lo que necesitas es practicar y practicar. No piense que puede aprender un idioma de ese libro en particular o de esa fuente en particular. Simplemente piense que el lenguaje de programación es el mismo que el lenguaje humano. No puede simplemente aprender inglés o francés leyendo un libro en particular. Todo lo que necesita es usarlo en el día para vida del día Codifique desde cero, amplíe su funcionalidad, intente construir algo que lo haga sentir un poco satisfecho. Y si está pensando en dominar un idioma como saber el lenguaje completo y usar cada elemento del lenguaje de programación en la codificación práctica ... NO PUEDE. O incluso si puede, puede llevar entre 10 y 15 años.

sumitir
fuente