Soy un principiante en programación y he estado leyendo libros, estudiando, leyendo artículos y demás. Estoy obteniendo excelentes resultados desde que comencé a aprender programación, y cuando era principiante pensaba que sabía todo sobre programación, pero a medida que aprendía más me di cuenta de lo difícil que es este campo (de hecho, todos los campos son difíciles, pero ese no es el punto).
Hoy en día, he escrito software funcional y he aprendido los BÁSICOS de 3 idiomas y soy intermedio en un solo idioma. Cuando miro cosas avanzadas como MYSQL, o programación OpenGL, o incluso el código C ++ de Visual Studio, me da dolores de cabeza, e incluso cuando visualizo el código fuente HTML de muchos sitios web (la mayoría de los códigos fuente en sitios web, vistos por Google Chrome parecen muy desordenados y desorganizados ) me confunde hasta el límite de mi cerebro. Todo parece simple al principio, sin embargo, al mirar estas cosas avanzadas, me hace preguntarme cómo se puede aprender tanto.
La pregunta, en pocas palabras, es si estas cosas se vuelven más claras para un programador a medida que avanza en su carrera. ¿Los temas complicados como los enumerados anteriormente (OpenGL, MySQL, sitios html avanzados) se vuelven más fáciles de leer, escribir y comprender a medida que aprende más, o simplemente se vuelve más complicado a medida que avanza? ¿Cómo puedes combatir esta sensación de que eres una hormiga en el mundo de la programación y estas cosas están a punto de aplastarte?
Respuestas:
Respuesta corta: no.
Respuesta larga:
Leer el código de otras personas se vuelve más fácil, sí. Pero solo leyendo. A medida que gana experiencia y habilidades, sus requisitos personales como desarrollador crecen.
No solo quieres escribir código. Quieres escribir un hermoso código .
No asume que su código se ejecuta en condiciones ideales . Comienza a pensar en todas las cosas malas que pueden suceder al ejecutar su código, manejar excepciones, pensar en problemas de hardware, latencia de red y el problema crece a medida que crecen sus habilidades.
No lee ni escribe código en el único idioma que conoce. Como desarrollador hábil, sabe que para resolver este problema específico que tiene ahora, la programación funcional es una alternativa mucho mejor , por lo que ahora debe leer y escribir código en lenguaje de programación funcional.
No se limita a un pequeño conjunto de bibliotecas que conoce. Si codifica en C #, desea conocer y utilizar toda la potencia de muchas bibliotecas de .NET Framework.
Ya no usa el bloc de notas. Necesita su potente IDE y desea saber cómo unir el código de prueba, de qué se tratan las métricas de código y cuál es el significado de cientos de opciones y ventanas que su IDE puede mostrarle.
No desea limitarse modestamente a un conjunto básico de herramientas que le proporciona el lenguaje . En C #, desea usar genéricos, contratos de código, reflexión, desarrollo impulsado por eventos, aspectos funcionales con LINQ, extensiones reactivas y un montón de otras cosas que aprendió, todo en un solo proyecto, si esas cosas lo ayudan a escribir mejor código.
No empiezas a escribir código . Usted pasa del 80 al 90% de su tiempo reuniendo requisitos , creando la arquitectura de su aplicación, escribiendo pruebas unitarias, escribiendo documentación, etc., y solo del 10 al 20% de su tiempo escribiendo código real .
Te importa la seguridad . Usted conoce los problemas legales que pueden surgir con los datos manipulados por sus aplicaciones. Ya sabes lo que es ITIL . Conoces algunas normas ISO y las aplicas diariamente en tu trabajo.
Sí, gana experiencia y habilidades, y se vuelve más fácil resolver un problema dado con todo el conocimiento y las habilidades intelectuales que adquirió. Pero los problemas que debe resolver también crecen, y simplemente no está entusiasmado por resolver los problemas del nivel de los que he resuelto cuando comenzó a programar.
Mientras adquiere habilidades, también obtiene una idea de la complejidad del desarrollo de software, aprende los aspectos que ni siquiera podía imaginar cuando comenzó a aprender programación, y desea y necesita aplicar todas las cosas que aprende a diario.
En breve:
El primer día que comienzas a aprender a programar, la tarea de enumerar todos los números del 1 al 100 divisibles por dos es muy compleja: acabas de aprender a hacer bucles y mostrar números en la pantalla, pero no tienes idea de cómo averiguar si El número es divisible por dos.
Diez años después, el mismo ejercicio parece ser extremadamente simple. Pero también, diez años después, está escribiendo aplicaciones que deben usar transacciones, están alojadas en varios servidores y deben manejar el estado de sesión correctamente entre servidores, y está almacenando los detalles de la cuenta bancaria de sus clientes, con todos los aspectos legales y de seguridad resultantes.
... Y te preguntas "¿Cómo podría hacer eso?" exactamente de la misma manera que lo hizo hace diez años cuando tenía que mostrar números en una pantalla con un bucle.
Cuando todo se vuelve fácil para usted en un dominio, significa que ha alcanzado la perfección en este dominio o que ya no le importa.
Lograr la perfección en un dominio tan vasto como el desarrollo de software es imposible, no importa lo inteligente que seas.
fuente
De niño, aprendes a hablar y luego a leer tu lengua materna. La mecánica simple de esto es una lucha al principio, pero en algún momento llega con fluidez. Sin embargo, todavía tiene un suministro infinito de libros que no ha leído, y en algunos temas debe aumentar su vocabulario primero solo para poder entender el libro.
Lo mismo vale para la programación de computadoras. En algún momento, el idioma en sí deja de sentirse como un idioma extranjero, pero todavía hay muchas cosas escritas en ese idioma que aún no sabes. Pero todo es accesible para usted con cierto esfuerzo.
Algunos trabajos de programación son muy repetitivos, básicamente re-implementan software muy similar para diferentes clientes. En esos trabajos, puede sentir que llega a una meseta de aprendizaje. En otros trabajos, está haciendo algo nuevo y único todo el tiempo, y nunca deja de aprender cosas nuevas.
fuente
Aquí hay algunas respuestas realmente buenas, pero pensé que podría agregar un par de puntos más:
Esto se llama el efecto Dunning-Kruger . Es extremadamente común entre los programadores principiantes y, de hecho, los principiantes en muchos campos.
¿Las personas que escribieron esos sitios web querían que pudieras entenderlos? Probablemente no. Les interesa tener un código que sea difícil de entender.
Por especialización . Soy un experto en un campo extraordinariamente estrecho: el diseño y la implementación de analizadores semánticos del compilador de C #. Si hubiera pasado quince años estudiando OpenGL o XML o HTML o lo que sea, sería un experto en eso y desconcertado por los analizadores semánticos. Pero no lo hice, y por lo tanto solo tengo una comprensión muy básica de OpenGL, XML y HTML.
Sí, porque comienzas a ver los patrones más grandes. Tome OpenGL por ejemplo. Probablemente haya visto un montón de "bibliotecas API": grandes fragmentos de código relacionado en los que la forma en que interactúa con el código es llamando a un montón de funciones nombradas con argumentos particulares. Y puede obtener una comprensión básica de OpenGL simplemente entendiendo que es una API.
Cuando haya adquirido más experiencia y haya visto un montón de técnicas de programación diferentes, se dará cuenta de que las tecnologías aparentemente no relacionadas, como OpenGL y LINQ en C #, tienen puntos en común. Ambas son API en las que construye flujos de trabajo que canalizan datos, y que puede ejecutar optimizadores y otras transformaciones en el flujo de trabajo de manera rica e interesante. Una vez que tenga ese concepto en su caja de herramientas, de repente se vuelve mucho más fácil aprovechar toda la potencia de cualquier API que use ese patrón.
Se vuelven más fáciles y más complicados. Más fácil porque, como dije, comienzas a reconocer los patrones de pensamiento más amplios que subyacen al diseño del sistema, lo que te permite usar el sistema de manera más efectiva. Más complicado porque ahora puede usar el sistema para resolver problemas más complicados y luego comenzar a encontrarse con las limitaciones del sistema.
Eres una hormiga; Todos somos hormigas. Pero las cosas no son el pie que te aplasta; es el mundo que puedes explorar, vivir, beneficiarte y mejorar. Tú, hormiga, solo puedes explorar una pequeña parte de ella. Elija una parte que le guste donde pueda agregar valor real y convertirse en un experto en ella.
fuente
Respuesta corta, sí.
Dado el tiempo y la exposición, estas cosas se vuelven más fáciles de comprender.
Recuerde que cuando mira sitios desde las herramientas de desarrollo en su navegador, a menudo los genera un marco. Que sea cualquier cantidad de cosas ... ASP.NET, JSP, RoR, Django, ... quién sabe. Algunos de estos marcos producen código más limpio que otros.
Al cerrar ... la exposición conduce a la competencia. No hay forma de anular ese sentimiento. Solo experiencia y aprendizaje. Se necesita tiempo para mudarse, adquirir conocimientos de dominio y aprender las habilidades que utiliza su entorno.
fuente
Estoy de acuerdo con algunas de las respuestas ya dadas, pero creo que también son un punto subyacente que no se discute sobre la lectura de código. Cuando comencé a buscar un código fuente abierto, me pareció abrumador y enorme. ¿Pero adivina que? siempre va a ser enorme En algún momento te das cuenta de que mejoras al extraer lo que quieres saber específicamente y seguir adelante.
Sin embargo, un ejemplo que diste fue mirar un montón de código HTML:
¿Por qué estás mirando el código HTML? Probablemente no porque quieras aprender el HTML de todo el sitio. Probablemente hay un truco específico que esperas aprender. En ese caso, solo busque el HTML relevante con una herramienta como firebug.
Si realmente quieres aprender cómo está hecho todo el sitio, te has dado cuenta de que HTML renderizado no es la forma de hacerlo. Sería mejor mirar un proyecto de código abierto utilizando tecnología similar. Sin embargo, intentar aprender el código de un proyecto completo no vale la pena como parece. Es aburrido, consume mucho tiempo, es fácil olvidar lo que aprendió y no tiene nada que mostrar al final. Aprenderá menos al leer el código de otras personas sin cesar y mucho más al usar piezas específicas e interesantes para escribir complementos, adiciones de funciones o como andamios y consejos para sus propios proyectos.
Intenta aprender el mínimo absoluto para que algo funcione por tu cuenta. Solo regrese a sus puntos de referencia cuando se atasque o desee aprender algo nuevo específico. Esto va en contra de la sabiduría convencional de que tienes que entender todo o de lo contrario estás programando en la oscuridad. Pero eventualmente te das cuenta de que el objetivo es imposible y aprendes a equilibrar los objetivos de saberlo todo y el objetivo de terminar realmente en lo que estás trabajando.
fuente
La respuesta corta es SÍ, pero mucho depende de cómo defina la experiencia.
Creo que hay al menos 3 partes para el desarrollo. A medida que mejora en cada segmento, ciertas cosas se vuelven más claras.
Comprender los requisitos del NEGOCIO . Esto le brinda una mejor vista panorámica de la aplicación. Cuanto mejor comprenda por qué las reglas comerciales son lo que son, más rápido comprenderá por qué ciertas cosas se hacen de cierta manera. Por ejemplo, sus clientes deben cumplir con la regulación gubernamental X, razón por la cual necesitan preparar el documento Y, razón por la cual necesitan almacenar esta información aparentemente inútil.
Comprensión de los requisitos técnicos . Esto es como el # 1, excepto que se trata más de entender por qué a nivel técnico. Algunas herramientas y tecnologías tienen sus propias peculiaridades, hasta que las haya abordado antes de que sea difícil entender por qué las cosas se hacen de cierta manera. Esto es más evidente cuando se trata con sistemas heredados. Por ejemplo, la aplicación utiliza un bus de servicio particular que solo toma XML.
Comprender los requisitos de IDIOMA . Como otros han mencionado, mientras más experiencia tengas con un idioma, más rápido podrás leer lo que el codificador original estaba tratando de lograr. Sin embargo, sin el n. ° 1 y el n. ° 2, descubrirá que esta capacidad aumentada alcanza su punto máximo rápidamente.
Intente involucrarse en múltiples aspectos del desarrollo porque realmente no se vuelve más fácil hasta que haya hecho todas las áreas al menos algunas veces.
Recuerde que la perfección (y el propósito) en el código de otra persona siempre es relativa a # 1 y # 2. Estos son los principales impulsores de por qué el código está en el estado en que se encuentra. Los cambios frecuentes en esas dos áreas son la razón más importante por la que obtenemos código de espagueti todo el tiempo. Entonces, a menos que sea un experto en leer los requisitos técnicos y comerciales, la tarea de leer el código siempre será una PITA real.
fuente
¡Se vuelve más fácil y más complicado al mismo tiempo!
traducido al desarrollo de software
fuente
Voy a tomar un rumbo ligeramente diferente al de los otros encuestados; Creo que leer y escribir código de hecho se vuelve más fácil a medida que lo haces más, y lo demostraré con una simple analogía.
Piense en cuándo comenzó a practicar deportes. Al principio con el primer deporte que aprendiste, la coordinación básica para las tareas simples de un solo deporte probablemente parecía realmente difícil. A medida que adquiriste más experiencia, comenzaste a dominar las tareas simples para no tener que pensar más en ellas y te diste cuenta de que había tareas más complejas a las que podrías prestar atención (como mirar a otros jugadores para predecir Su comportamiento).
Luego, cuando probaste suerte en otro deporte, probablemente descubriste que no estabas tan atrasado cuando comenzaste. Atrapar una pelota de baloncesto es muy diferente a atrapar una pelota de béisbol, pero a alguien que domine uno de ellos le resultará mucho más fácil recoger al otro que a una persona que nunca antes había hecho ninguno de los dos. Con su experiencia practicando un segundo deporte, descubrió que el primer deporte le proporcionó habilidades específicas y genéricas . Las habilidades específicas (atrapar una pelota de baloncesto) son útiles solo en su dominio, pero las habilidades genéricas (rastrear un objeto en movimiento rápido que se aproxima en un espacio tridimensional y desarrollar un plan para lidiar con él) lo hacen mejor en todos los dominios relacionados.
¿Qué tiene esto que ver con la programación? La primera línea de código que lee lo expone a un mundo basado en ciertas reglas. Aprendiste esas reglas (la sintaxis y las expresiones idiomáticas de ese lenguaje) como habilidades específicas, pero también aprendiste algunas habilidades genéricas valiosas: comprender cómo funcionan internamente las computadoras y cómo expresar tus intenciones de una manera que una computadora pueda entender. Cada nuevo idioma que aprende le proporciona algunas habilidades específicas nuevas, pero también fortalece sus habilidades genéricas y le ayuda a ver los patrones disparados a través de todos los lenguajes de computadora, como depósitos minerales en capas a lo largo de una pared del cañón. Una vez que se familiarice con algunos idiomas diferentes, podrá reconocer la "forma" de la mayoría de los códigos, si perdona la vaguedad, incluso si no sabe nada sobre el idioma en el que está escrito.
Por ejemplo, los tres lenguajes que mencionó (MYSQL, OpenGL, C ++) tienen algunas características comunes:
Cuanta más programación realice, más se dará cuenta de que, independientemente de la forma de la pelota, sigue siendo una pelota que viene hacia usted y sabe qué hacer con ella sin tener que pensar demasiado en ella. Toda la programación se trata de intentar expresar sus intenciones de una manera que la computadora pueda entender; aprenda lo suficiente y comenzará a poder leer las intenciones en lugar del código.
PD- Cada vez, cuando finalmente empiezas a sentir que sabes manejar, te encontrarás con algo que te rompe el cerebro y te hace sentir como un principiante. Eso es lo que nos encanta de este trabajo, siempre hay algo nuevo que aprender.
fuente
Respuesta corta: sí , en general
Sin embargo, no se convertirá en un especialista si generaliza. Convertirse en un especialista también significa darse cuenta de todas las cosas que no sabe: esto puede ser una sensación abrumadora.
A medida que avanzas en el tiempo, ganas experiencia.
A medida que avanza en el tiempo, otros lenguajes / patrones, etc. se desarrollan paralelamente a su desarrollo.
Otra variable a su pregunta es si está ganando experiencia significativa en relación con la industria, ya que también se mueve a través del mismo tiempo constante. La industria tecnológica es un objetivo móvil y, a diferencia de la mayoría de las otras industrias.
Una buena pregunta también podría ser: ¿se está extendiendo demasiado o demasiado en un idioma determinado?
fuente
Es una fuente interminable de asombro (y ansiedad) cuántos lenguajes de computadora hay y hasta qué punto siguen cambiando. Además de eso, la cantidad de marcos diferentes en cada idioma y para cada marco, la gran variedad de bibliotecas y complementos disponibles. Agregue a eso el número de editores de código e IDEs.
Todas estas variaciones tienen dos dimensiones de complejidad.
También tienen una cosa en común. La integridad de Turing. Con un esfuerzo suficiente por parte de un programador, ¡todos pueden usarse para resolver todos los problemas! Entonces, si comienzas con un lenguaje como C (vocabulario pequeño, sintaxis compleja y casi sin abstracciones) definitivamente tienes la sensación de que puedes hacer cualquier cosa (con bastante razón).
Luego cambie a "cosas fáciles" como CSS, HTML, Javascript y quizás también marcos como Bootstrap y React, y su cerebro se freirá, como lo haría Albert Einstein. La gente piensa "sé francés, por lo que aprender alemán debería ser fácil". ¡No!
Se pueden aprender muchas abstracciones de programación de los patrones de software . Hay varios libros dedicados al tema. Los patrones están en todas partes, son independientes del lenguaje y se pueden aprender y comprender una vez . Si conoce sus patrones, puede usarlos en cualquier idioma y reconocerlos cuando se incorporan a los idiomas y con mayor frecuencia en varios marcos.
La mayoría de las personas tarda de 1 a 2 años en hablar un nuevo idioma y los empleadores lo saben. Es por eso que no contratan a personas que no tienen experiencia en su idioma, porque el nuevo empleado pasará mucho tiempo luchando con el idioma y no tendrá suficiente tiempo para resolver los problemas comerciales.
En resumen, los principios / abstracciones de la informática, los patrones de software y el tipo de problemas comerciales que se encuentran, todo esto cambia lentamente. Puede aprender una vez y acumular nuevos conocimientos de forma incremental. Por el contrario, los lenguajes de computadora, los marcos, los llamados "ecosistemas" y las bibliotecas de componentes cambian muy rápidamente al igual que todas las herramientas que los rodean. ¡Aquí se espera que el ritmo de aprendizaje sea lento y lento!
fuente
Cuando se hace algún progreso, desaprendemos y aprendemos de nuevo lo que creíamos saber antes. - Henry David Thoreau
Hay una historia del maestro zen y la taza de té desbordante .
A veces, necesitamos dejar de lado nuestras nociones y opiniones preconcebidas del pasado para que podamos permitirnos aprender nuevos conceptos.
Recuerde: si se siente abrumado por un nuevo concepto, debe buscar muchos maestros.
Recientemente, cuando se me asignó la tarea de actualizar algún software interno de la compañía que utilizaba un lenguaje de script con el que no estaba familiarizado. Al principio fue muy estresante. Sin embargo, después de cambiar mi actitud, comencé a encontrar recursos que explicaban la sintaxis y los conceptos básicos. Completé el proyecto y ahora utilizo este lenguaje de secuencias de comandos como una de mis herramientas para hacer más cosas.
Tu actitud hace toda la diferencia.
fuente