Hoy en día, la programación se ha convertido en una habilidad cada vez más necesaria: como diseñador, entender algo de programación puede ayudarte a comprender mejor tu trabajo; como emprendedor, ser fundador técnico hará que muchas de tus tareas sean más fáciles. Y para quienes están empezando, enfrentarse a la gran cantidad de información puede hacer que no sepan por dónde comenzar; tras pasar por materiales básicos y fáciles, el aprendizaje se vuelve cada vez más difícil, y la curva de aprendizaje empinada te hace dudar; sabes cómo imprimir algunos textos en la pantalla, pero no sabes cuándo es el momento de abordar un proyecto realmente útil; no tienes claro qué cosas aún desconoces, e incluso no sabes qué deberías aprender a continuación.
El contenido de este artículo no solo ofrecerá algunos consejos orientativos, sino que también incluirá una introducción de programación centrada en conceptos básicos. Por supuesto, una ruta paso a paso no es realista, y cada persona tiene sus propias características, por lo que esta guía de introducción a la programación busca principalmente estimular tu reflexión, ayudándote a formar una ruta de aprendizaje que se adapte a ti.
Pero ten en cuenta: este artículo está dirigido a quienes realmente desean aprender a programar — aquellos que tienen una fuerte determinación, que están decididos a crear algo real, y que no se detendrán hasta lograrlo; no para quienes solo han oído que programar es divertido. En mi opinión, esas personas nunca entrarán en el mundo de la programación, y mucho menos podrán crear algo decente.
Aunque el tono general del artículo sigue la filosofía de “opiniones fuertes, convicciones débiles” (Strong Opinions, Weakly Held), los lectores deben mantener una actitud de escepticismo respecto a la precisión de lo que aquí se escribe, como si desconfiaran de todo a su alrededor. Si tienes alguna duda, siéntete libre de discutir públicamente.
Ajuste de actitud
Definir metas
Antes de comenzar a aprender programación, reflexiona sobre tus objetivos. Cuando tienes una meta clara, el camino se vuelve más evidente. Entonces, ¿qué quieres crear? ¿Un sitio web? ¿Un juego? ¿Aplicaciones para iOS o Android? ¿O simplemente quieres automatizar tareas aburridas para tener más tiempo para disfrutar del paisaje? Quizá solo buscas mejorar tu empleabilidad y conseguir un buen trabajo. Todos estos son objetivos válidos, y motivan tu aprendizaje de programación. Sin motivación, será difícil avanzar en un largo y a veces monótono proceso de aprendizaje.
Este video quizás te inspire: “Las cosas que la mayoría de las escuelas no enseñan”
No te impacientes
La mala programación es fácil. Incluso los “tontos” pueden aprenderla en 21 días. La buena programación requiere pensamiento, pero cualquiera puede hacerlo y todos pueden experimentar la satisfacción extrema que esto trae. La programación de mala calidad es sencilla. Incluso un idiota puede aprenderla en 21 días. La buena programación requiere reflexión, pero todos pueden lograrlo y experimentar la satisfacción máxima que conlleva.
Ya sea en librerías físicas o en línea, abundan libros de recetas rápidas como “Aprende X en 21 días”, que prometen que en poco tiempo podrás dominar la tecnología. Matthias Felleisen, en su libro “How to Design Programs”, señala claramente esta tendencia y la critica con sarcasmo.
No existen atajos ni “balas de plata”. Los sabios dicen que dominar algo requiere 10 años o 10,000 horas, como en el dicho chino “diez años afilando una espada”. Así que no te preocupes, el esfuerzo no será en vano.
Cultivar interés
Most buenos programadores programan no porque esperen recibir pagos o reconocimiento público, sino porque les divierte programar.
La mayoría de los excelentes programadores no hacen programación esperando recompensas o admiración, sino porque les resulta divertido.
— Linus Torvalds
Sumérgete en la programación por interés. La pasión es una fuente inagotable de motivación. Mantén esa sensación de entusiasmo para poder dedicarla a esas 10,000 horas o 10 años de programación. Programar es una alegría de exploración. Es una alegría de creación. Ver tu obra en la pantalla es muy divertido. Que la gente admire tu código, que tus vecinos usen tu producto, o que los medios discutan sobre él, también es interesante. La programación debe ser muy divertida; si no lo es, identifica qué hace que sea aburrida y resuélvelo.
Comenzar a aprender
Una historia que alerta
Cuando entré en secundaria, empecé a aprender programación. Lamentablemente, leí varios libros populares en ese momento, como “21 días para dominar C++”. Aunque al principio no fue un gran problema y pude escribir pequeños programas, cuando el software fallaba, no sabía por qué. Problemas más complejos me superaban, y no podía hacer mucho con las bibliotecas existentes. Aunque codificaba todos los días, mi capacidad de programación avanzaba muy lentamente. Solo tenía una comprensión muy limitada de conceptos como “iteración” y “recursión”, y solo usaba la computadora como una calculadora.
Luego, en la universidad, estudié física. Al principio, memorizaba fórmulas físicas sin entender cómo se derivaban, qué relaciones tenían, o qué significado tenían. Aprendía a resolver problemas físicos comunes, pero no entendía el “por qué” detrás del “cómo”.
Cuando intenté hacer algunos videojuegos basados en física, enfrenté nuevamente las mismas dificultades: no sabía cómo abordar nuevos problemas, el miedo a lo desconocido crecía, y empecé a evitar entender realmente, confiando en Google para copiar y pegar código. Afortunadamente, una clase en segundo año cambió completamente mi forma de aprender. Por primera vez, sentí que abría los ojos. Me di cuenta de que solo tenía una comprensión muy superficial de algunas disciplinas, incluyendo física y ciencias de la computación.
Sobre esa clase: acabábamos de aprender electricidad y relatividad, y el profesor escribió en la pizarra estos temas, conectándolos con una línea. “Supongamos que tenemos un electrón moviéndose a velocidad relativista…”, al principio solo escribió fórmulas conocidas de electricidad y relatividad, pero tras varias derivaciones algebraicas en varias pizarras, apareció mágicamente la fórmula del campo magnético. Aunque esa fórmula la conocía desde hace años, en ese momento no entendía la conexión profunda entre estos fenómenos. La diferencia entre magnetismo y electricidad era solo una cuestión de “perspectiva”. De repente, comprendí que no solo se trataba de “cómo hacer” (How), sino también de “por qué” (why). Empecé a volver a lo básico, a aprender esas partes fundamentales que antes no había estudiado bien. Este proceso de volver atrás fue doloroso, pero espero que te sirva de advertencia: nunca hagas esa tontería.
Reflexión tras la alerta
Esta imagen proviene del libro “Gödel, Escher, Bach” de Douglas Hofstadter. Cada letra en ella está formada por letras más pequeñas. En el nivel más alto, vemos “MU”, donde M está formado por tres HOLISM (holismo), y U por un REDUCTIONISM (reduccionismo). Cada letra contiene a la siguiente, y viceversa. En el nivel más bajo, la letra más pequeña también está formada por “MU” repetido.
Cada nivel de abstracción contiene información. Si solo observas desde una perspectiva holística en el nivel superior o desde una perspectiva reduccionista en el nivel inferior, solo obtendrás “MU” (que en algunos dialectos significa “nada”). La cuestión es: ¿cómo obtener la mayor cantidad de información en cada nivel? O, en otras palabras, ¿cómo aprender en un campo complejo como la programación, que abarca muchos conocimientos?
Un problema común en la educación y el aprendizaje es que los principiantes tienden a centrarse demasiado en la visión global y descuidan los fundamentos. Por ejemplo, los estudiantes quieren construir un robot, pero no entienden los modelos físicos que lo sustentan, ni cómo funcionan los componentes, ni los sistemas de control y sensores. Y este proceso de aprendizaje puede parecer poco interesante.
Aquí hay dos grandes errores para los principiantes:
Si solo interactúan con “motores y componentes” preconstruidos (sin entender cómo se construyen), esto limitará mucho su capacidad para construir esas cosas en el futuro y dificultará la resolución de problemas.
El segundo error, menos evidente, es que a veces la visión holística parece efectiva, pero puede ser engañosa. Después de uno o dos años, cuando hayan avanzado en su aprendizaje, será muy difícil volver a “sustentar” los conocimientos básicos. Tendrán que abandonar ideas preconcebidas y avanzar con paciencia, lo cual será mucho más difícil que aprender los fundamentos desde el principio.
Pero tampoco hay que exagerar: caer en la trampa del reduccionismo extremo, intentando hacer grandes teorías desde el principio, puede ser peligroso. Solo te llevará a la teoría y al aburrimiento, y te hará perder motivación. Esto suele ocurrir con estudiantes de ciencias de la computación.
Para entender mejor, puedes comparar aprender programación con aprender a cocinar: compras libros de recetas para preparar buenos platillos. Si solo quieres cocinar para tu familia, eso puede ser suficiente; seguir los pasos de las recetas te dará buenos resultados. Pero si quieres impresionar a tus amigos, crear platillos únicos y convertirte en un “gran chef”, necesitas entender las ideas detrás de esas recetas, comprender la teoría, no solo practicar ciegamente. Pero si todos los días solo lees libros teóricos sin practicar, solo te convertirás en un mal cocinero, e incluso nunca llegarás a ser uno, porque te rendirás ante la monotonía. En resumen, la programación conecta la teoría con la práctica, y es un campo donde la ciencia de la computación y las aplicaciones se entrelazan. La forma correcta de aprender programación es: explorar de arriba hacia abajo mediante proyectos y experimentos, para obtener intuición y motivación; y desde abajo hacia arriba, sentando bases sólidas y consolidando el pensamiento algorítmico.
Como principiante, debes enfocarte en la primera, con la segunda como complemento.
Fundamentos del diseño de programas
“¿Qué lenguaje de programación debería aprender?” Es una de las primeras preguntas de los principiantes, pero en realidad es una pregunta equivocada. Lo que deberías preguntarte primero es: “¿Qué elementos constituyen la base del aprendizaje de programación?”
En la base de la pirámide del conocimiento en programación hay tres partes clave:
Pensamiento algorítmico: por ejemplo, ¿cómo encontrar el número más grande en un conjunto de números? Primero necesitas tener una variable maxSoFar, y luego para cada número…
Sintaxis: ¿cómo expresar estos algoritmos en un lenguaje de programación para que la computadora los entienda?
Fundamentos del sistema: ¿por qué el hilo nunca termina en un while(1)? ¿Por qué es inviable el código: int *foo() { int x = 0; return &x; }?
Para principiantes en la etapa de introducción, usar C como primer lenguaje puede ser muy difícil y aburrido, porque implica aprender estas tres partes simultáneamente, y antes de poder hacer algo, hay que dedicar mucho tiempo.
Por eso, para minimizar el esfuerzo en “sintaxis” y “fundamentos del sistema”, se recomienda usar Python como primer lenguaje. Aunque Python es amigable para principiantes, no significa que sea solo un “juguete”; en proyectos grandes, su potencia y flexibilidad son evidentes. Una vez familiarizado con Python, aprender C será una buena opción: te ayudará a pensar desde una perspectiva cercana al hardware y a entender algunos principios del sistema operativo.
A continuación, se presenta una guía de introducción que te ayudará a construir un marco mental completo, facilitando la exploración de arriba hacia abajo. Los materiales no tienen un orden estricto; puedes escoger cualquiera, y si te bloqueas, considera cambiar de material.
MIT 6.00.1x (Introducción a la ciencia de la computación y programación en Python). Aunque el curso usa Python, como una excelente introducción, enfatiza conceptos y paradigmas importantes en ciencias de la computación, no solo el lenguaje. Si no eres estudiante de ciencias, te abrirá la mente en el autoestudio; contenido: conceptos computacionales, programación en Python, estructuras de datos y algoritmos simples, pruebas y depuración.
Harvard CS50x (Ciencia de la computación, Harvard). También es una introducción, complementaria a la de MIT. Usa C, PHP, JavaScript + SQL, HTML + CSS. Tiene un alcance y profundidad adecuados, y permite conocer algunos avances tecnológicos recientes, lo que puede motivar mucho el interés en la computación. Tarea adicional: leer “Coding”.
Al terminar esta etapa de introducción, habrás acumulado cierta experiencia en código y comprensión de la programación. Entonces, quizás quieras aprender alguna tecnología concreta, como desarrollo web, Android, iOS, etc. Puedes intentar hacer cosas simples, obtener retroalimentación positiva y motivarte. Pero recuerda no profundizar demasiado en detalles específicos, ya que en el futuro tendrás tiempo para aprenderlos. Tampoco te enfoques en frameworks o lenguajes específicos ahora; es momento de aprender los fundamentos de ciencias de la computación. No intentes tomar atajos aprendiendo directamente lo que quieres, eso está destinado al fracaso.
Entonces, ¿qué hacer en esta fase de entrada? Reflexiona sobre tus programas anteriores: ¿por qué diseñaste así? ¿Cómo puedes escribir mejores programas? Busca entender la esencia de la programación: usar la computadora para resolver problemas.
Suposiciones:
X = tiempo dedicado a pensar en soluciones, es decir, “resolver problemas”
Y = tiempo dedicado a implementar el código, es decir, “usar la computadora”
Capacidad de programación = F(X, Y) (donde X > Y)
Para mejorar esta capacidad, debes optimizar X, Y y la función F(X, Y). Pocas obras abordan estos tres aspectos simultáneamente, pero hay una que sí: “Structure and Interpretation of Computer Programs” (SICP). Este libro te indica estos tres caminos. Antes de leer SICP, quizás puedas resolver problemas simples con algunas funciones. Pero después de leerlo, aprenderás a abstraer y descomponer problemas, enfrentando desafíos más complejos y grandes. Esto representa un gran salto en tu capacidad de programación, cambiando fundamentalmente tu forma de pensar y resolver problemas con código. Además, SICP usa Scheme, introduciéndote a la programación funcional. Su sintaxis es muy sencilla, y podrás aprenderla rápidamente, dedicando más tiempo a entender sus ideas y a resolver problemas complejos.
Peter Norvig escribió una reseña muy interesante de SICP, diciendo:
Para usar una analogía, si SICP fuera sobre automóviles, sería para quienes quieren entender cómo funcionan, cómo se construyen, y cómo diseñar vehículos eficientes, seguros y confiables para el siglo XXI. La gente que odia SICP solo quiere aprender a conducir en la autopista, como todos.
Si tú eres de los primeros, leer SICP será clave para conectar la etapa de iniciación con la de entrada.
Aunque SICP es un “libro de introducción”, tiene cierta dificultad para principiantes. Aquí algunos recursos útiles:
Udacity CS212 Diseño de Programas de Computadora: dictado por Peter Norvig, mencionado antes, en Python, con cierta dificultad.
“How to Design Programs, Second Edition”: más accesible que SICP, con explicaciones claras, ideal para principiantes. Si SICP parece muy difícil, prueba primero con este.
Videos de la clase de SICP en UC Berkeley y grabaciones de los autores enseñando en HP (en chino).
“Composing Programs”: una introducción a la programación basada en SICP, usando Python, con algunos proyectos pequeños.
Colección de ejercicios de SICP: intenta resolver todos los ejercicios para consolidar.
Tras completar esta parte, construirás un modelo propio de diseño de programas, tu mente dejará de ser un caos y entenderás que memorizar bibliotecas y sintaxis no enseña a resolver problemas. La próxima etapa será la práctica en proyectos, que será un momento excelente para avanzar. Para proyectos: en esta fase inicial, participar en proyectos open source puede ser prematuro. Mejor empieza con proyectos simples, como crear y mantener un sitio web, o hacer un pequeño juego y mejorarlo. Si no tienes ideas claras, sigue a “炼⽠研究所” o elige un proyecto de la “Mega Project List” que te guste.
Si sientes que SICP es demasiado difícil, no te fuerces; pasa a la siguiente etapa: empieza a leer “The Elements of Computing Systems”, que te enseñará a construir una computadora desde la compuerta NAND, hasta que funcione en tu máquina. No entraremos en detalles, pero este libro será fundamental en toda tu fase de introducción. Tu objetivo en esta etapa será completar todos los proyectos del libro (incluyendo un compilador y un sistema operativo básicos).
Para dominar completamente este libro y fortalecer tus bases, y para un futuro de avances sólidos, debes preparar algunos aspectos (nota: el orden no es absoluto):
Fundamentos de sistemas informáticos
Con la base en diseño de programas, si quieres profundizar en la ciencia de la computación, te recomiendo este libro: “Computer Systems: A Programmer’s Perspective, 3/E” (Sistemas informáticos: una perspectiva del programador). La crítica sobre la traducción del título no es relevante; en realidad, solo es el material del curso “Introduction to Computer Systems” de CMU. La especialidad de CMU en ciencias de la computación es más orientada al software, y este libro describe cómo funcionan los sistemas desde la perspectiva del programador, explicando en detalle cómo se ejecutan los programas en la computadora.
Si el texto te resulta aburrido, puedes complementar con el MOOC en Coursera: “The Hardware/Software Interface”, que es un subconjunto de CSAPP, con los experimentos más importantes. También, revisa “The C Programming Language” para refrescar conocimientos de C.
Tras terminar este libro, tendrás una base sólida en sistemas, y estarás preparado para estudiar sistemas operativos, compiladores, redes, etc. Cuando avances en temas más avanzados, revisa los capítulos correspondientes y realiza los ejemplos en código. Esto te dará una comprensión más profunda de la teoría, y podrás entender desde el diseño superior hasta la implementación en bajo nivel, visualizando el flujo de datos en la red, memoria, caché y CPU.
Fundamentos de estructuras de datos y algoritmos
Hoy en día, muchos piensan que programar (especialmente en desarrollo web) consiste en usar código de otros, y que expresar ideas claramente es más importante que dominar matemáticas y algoritmos complejos. ¿Para qué aprender estructuras de datos, ordenamiento, búsqueda binaria, si ya están integrados? ¿Para qué usar algoritmos si en el trabajo no los necesitas? Este pensamiento pragmático extremo es erróneo. Sin una base sólida, tarde o temprano te quedarás atascado.
Estructuras de datos y algoritmos van de la mano. En esta etapa, debes entender qué algoritmos y estructuras de datos usar para resolver un problema más rápido. Es fundamental conocer las estructuras y algoritmos comunes, y no siempre es necesario codificarlos; escribir en papel es más rápido. Para lo que no entiendas, investiga su propósito y escenario de uso.
Recursos recomendados:
“Introduction to Algorithms”: algunos dicen que no es un libro de entrada, pero en realidad no es uno, solo no quiere ser confundido con otros. Puedes saltarte ejercicios y demostraciones en la primera lectura, y si te sientes inseguro, lee primero “Data Structures and Algorithm Analysis”.
“Algorithms: Design and Analysis” [Part 1] y [Part 2]: curso de Stanford, sin restricción de lenguaje. Estos dos te darán una base sólida en algoritmos; si tu inglés no es bueno, puedes usar “Introduction to Algorithms” de MIT.
En la fase inicial, también debes aprender a resolver problemas pequeños con algoritmos comunes, combinando con SICP. Libros como “Programming Pearls” y “The Practice of Programming” son útiles.
Otros fundamentos
Aspectos que a menudo se descuidan en la fase inicial:
Aprender a preguntar: en el aprendizaje, seguramente tendrás dudas. Usa bien los motores de búsqueda. Cuando no puedas resolver algo, pregunta en Stack Overflow o Zhihu. Antes de preguntar, lee este artículo: “Cómo hacer preguntas efectivas para resolver problemas”.
No seas un lobo solitario: intenta comunicarte con otros programadores en CoCode. Crea un sitio web personal simple. Escribe en un blog tus ideas. Suscríbete a blogs de programación que te gusten, como Joel on Software, Peter Norvig, Coding Horror.
Mejora tu inglés: es la herramienta principal para acceder a recursos de calidad. Pero en la fase inicial, los libros traducidos no pierden tanta información, así que evalúa según tu situación.
Resumen
No debes temer a lo que has leído. La introducción a la programación no se logra en unas semanas. Encontrarás muchas dificultades en el camino. Cuando te bloquees, prueba la técnica de “Feynman”: divide los problemas en partes pequeñas, y explica claramente a otros para verificar tu comprensión. Es normal no poder resolver todo; en esos casos, no te fuerces. Muchas veces, al volver después de un tiempo, todo será más claro.
Además, no te limites a los materiales mencionados. Hay otros libros que vale la pena releer en esta fase y en etapas posteriores. Entre los más recomendados en la lista de “programadores imprescindibles” en Stack Overflow están:
“Code Complete”: para programadores experimentados y novatos, ayuda a llenar vacíos de conocimiento. Para principiantes, revisa capítulos sobre variables, pruebas y carácter personal.
“The Pragmatic Programmer”: considerado un “manual de código”, cubre desde principios como DRY y KISS, hasta aspectos de la actitud profesional.
El autor, Dave, dice en la introducción:
Eres un Programador Pragmático. No estás atado a ninguna tecnología en particular, pero tienes una base amplia en la ciencia, y tu experiencia en proyectos prácticos te permite elegir buenas soluciones en cada situación. La teoría y la práctica se combinan para hacerte fuerte. Ajustas tu enfoque según las circunstancias y el entorno, y lo haces continuamente a medida que avanzas. Los Programadores Pragmáticos hacen el trabajo, y lo hacen bien.
Estas ideas y la editorial “The Pragmatic Bookshelf” me han influenciado mucho. Por eso, esta guía también busca reflejar ese espíritu, y espero que tú también te conviertas en un verdadero Programador Pragmático.
Epílogo
Si logras completar todas estas tareas, ¡felicidades! Has alcanzado realmente la entrada a la programación. Esto significa que en etapas más avanzadas no temerás aprender nuevos lenguajes, ni APIs complejas, ni tecnologías específicas, e incluso te parecerá más fácil. Claro, aún necesitarás mucha práctica: te dolerá la espalda, te cansarás al caminar, y no podrás subir al quinto piso con un solo respiro. Pero puedo asegurarte que experimentarás un cambio mental profundo, ganarás confianza, y la mirada de tus profesores, compañeros y en CSDN será muy diferente. Aunque solo hayas llegado a la entrada, ya serás un “alto ejecutivo” en el mundo espiritual del programador. No, me equivoqué: incluso los “ricos y famosos” no tienen una fuerza mental poderosa; también dudan de sí mismos, y creen que sin dinero no son nada. Pero en resumen, si sigues esta guía y estudias con dedicación, experimentarás la sensación de “alcanzar la cumbre”.
()(
Ver originales
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
Guía de introducción a la programación - Plataforma de intercambio de criptomonedas digitales
Guía de introducción a la programación
Prólogo
Hoy en día, la programación se ha convertido en una habilidad cada vez más necesaria: como diseñador, entender algo de programación puede ayudarte a comprender mejor tu trabajo; como emprendedor, ser fundador técnico hará que muchas de tus tareas sean más fáciles. Y para quienes están empezando, enfrentarse a la gran cantidad de información puede hacer que no sepan por dónde comenzar; tras pasar por materiales básicos y fáciles, el aprendizaje se vuelve cada vez más difícil, y la curva de aprendizaje empinada te hace dudar; sabes cómo imprimir algunos textos en la pantalla, pero no sabes cuándo es el momento de abordar un proyecto realmente útil; no tienes claro qué cosas aún desconoces, e incluso no sabes qué deberías aprender a continuación.
El contenido de este artículo no solo ofrecerá algunos consejos orientativos, sino que también incluirá una introducción de programación centrada en conceptos básicos. Por supuesto, una ruta paso a paso no es realista, y cada persona tiene sus propias características, por lo que esta guía de introducción a la programación busca principalmente estimular tu reflexión, ayudándote a formar una ruta de aprendizaje que se adapte a ti.
Pero ten en cuenta: este artículo está dirigido a quienes realmente desean aprender a programar — aquellos que tienen una fuerte determinación, que están decididos a crear algo real, y que no se detendrán hasta lograrlo; no para quienes solo han oído que programar es divertido. En mi opinión, esas personas nunca entrarán en el mundo de la programación, y mucho menos podrán crear algo decente.
Aunque el tono general del artículo sigue la filosofía de “opiniones fuertes, convicciones débiles” (Strong Opinions, Weakly Held), los lectores deben mantener una actitud de escepticismo respecto a la precisión de lo que aquí se escribe, como si desconfiaran de todo a su alrededor. Si tienes alguna duda, siéntete libre de discutir públicamente.
Ajuste de actitud
Definir metas
Antes de comenzar a aprender programación, reflexiona sobre tus objetivos. Cuando tienes una meta clara, el camino se vuelve más evidente. Entonces, ¿qué quieres crear? ¿Un sitio web? ¿Un juego? ¿Aplicaciones para iOS o Android? ¿O simplemente quieres automatizar tareas aburridas para tener más tiempo para disfrutar del paisaje? Quizá solo buscas mejorar tu empleabilidad y conseguir un buen trabajo. Todos estos son objetivos válidos, y motivan tu aprendizaje de programación. Sin motivación, será difícil avanzar en un largo y a veces monótono proceso de aprendizaje.
Este video quizás te inspire: “Las cosas que la mayoría de las escuelas no enseñan”
No te impacientes
La mala programación es fácil. Incluso los “tontos” pueden aprenderla en 21 días. La buena programación requiere pensamiento, pero cualquiera puede hacerlo y todos pueden experimentar la satisfacción extrema que esto trae. La programación de mala calidad es sencilla. Incluso un idiota puede aprenderla en 21 días. La buena programación requiere reflexión, pero todos pueden lograrlo y experimentar la satisfacción máxima que conlleva.
Ya sea en librerías físicas o en línea, abundan libros de recetas rápidas como “Aprende X en 21 días”, que prometen que en poco tiempo podrás dominar la tecnología. Matthias Felleisen, en su libro “How to Design Programs”, señala claramente esta tendencia y la critica con sarcasmo.
No existen atajos ni “balas de plata”. Los sabios dicen que dominar algo requiere 10 años o 10,000 horas, como en el dicho chino “diez años afilando una espada”. Así que no te preocupes, el esfuerzo no será en vano.
Cultivar interés
Most buenos programadores programan no porque esperen recibir pagos o reconocimiento público, sino porque les divierte programar.
La mayoría de los excelentes programadores no hacen programación esperando recompensas o admiración, sino porque les resulta divertido.
— Linus Torvalds
Sumérgete en la programación por interés. La pasión es una fuente inagotable de motivación. Mantén esa sensación de entusiasmo para poder dedicarla a esas 10,000 horas o 10 años de programación. Programar es una alegría de exploración. Es una alegría de creación. Ver tu obra en la pantalla es muy divertido. Que la gente admire tu código, que tus vecinos usen tu producto, o que los medios discutan sobre él, también es interesante. La programación debe ser muy divertida; si no lo es, identifica qué hace que sea aburrida y resuélvelo.
Comenzar a aprender
Una historia que alerta
Cuando entré en secundaria, empecé a aprender programación. Lamentablemente, leí varios libros populares en ese momento, como “21 días para dominar C++”. Aunque al principio no fue un gran problema y pude escribir pequeños programas, cuando el software fallaba, no sabía por qué. Problemas más complejos me superaban, y no podía hacer mucho con las bibliotecas existentes. Aunque codificaba todos los días, mi capacidad de programación avanzaba muy lentamente. Solo tenía una comprensión muy limitada de conceptos como “iteración” y “recursión”, y solo usaba la computadora como una calculadora.
Luego, en la universidad, estudié física. Al principio, memorizaba fórmulas físicas sin entender cómo se derivaban, qué relaciones tenían, o qué significado tenían. Aprendía a resolver problemas físicos comunes, pero no entendía el “por qué” detrás del “cómo”.
Cuando intenté hacer algunos videojuegos basados en física, enfrenté nuevamente las mismas dificultades: no sabía cómo abordar nuevos problemas, el miedo a lo desconocido crecía, y empecé a evitar entender realmente, confiando en Google para copiar y pegar código. Afortunadamente, una clase en segundo año cambió completamente mi forma de aprender. Por primera vez, sentí que abría los ojos. Me di cuenta de que solo tenía una comprensión muy superficial de algunas disciplinas, incluyendo física y ciencias de la computación.
Sobre esa clase: acabábamos de aprender electricidad y relatividad, y el profesor escribió en la pizarra estos temas, conectándolos con una línea. “Supongamos que tenemos un electrón moviéndose a velocidad relativista…”, al principio solo escribió fórmulas conocidas de electricidad y relatividad, pero tras varias derivaciones algebraicas en varias pizarras, apareció mágicamente la fórmula del campo magnético. Aunque esa fórmula la conocía desde hace años, en ese momento no entendía la conexión profunda entre estos fenómenos. La diferencia entre magnetismo y electricidad era solo una cuestión de “perspectiva”. De repente, comprendí que no solo se trataba de “cómo hacer” (How), sino también de “por qué” (why). Empecé a volver a lo básico, a aprender esas partes fundamentales que antes no había estudiado bien. Este proceso de volver atrás fue doloroso, pero espero que te sirva de advertencia: nunca hagas esa tontería.
Reflexión tras la alerta
Esta imagen proviene del libro “Gödel, Escher, Bach” de Douglas Hofstadter. Cada letra en ella está formada por letras más pequeñas. En el nivel más alto, vemos “MU”, donde M está formado por tres HOLISM (holismo), y U por un REDUCTIONISM (reduccionismo). Cada letra contiene a la siguiente, y viceversa. En el nivel más bajo, la letra más pequeña también está formada por “MU” repetido.
Cada nivel de abstracción contiene información. Si solo observas desde una perspectiva holística en el nivel superior o desde una perspectiva reduccionista en el nivel inferior, solo obtendrás “MU” (que en algunos dialectos significa “nada”). La cuestión es: ¿cómo obtener la mayor cantidad de información en cada nivel? O, en otras palabras, ¿cómo aprender en un campo complejo como la programación, que abarca muchos conocimientos?
Un problema común en la educación y el aprendizaje es que los principiantes tienden a centrarse demasiado en la visión global y descuidan los fundamentos. Por ejemplo, los estudiantes quieren construir un robot, pero no entienden los modelos físicos que lo sustentan, ni cómo funcionan los componentes, ni los sistemas de control y sensores. Y este proceso de aprendizaje puede parecer poco interesante.
Aquí hay dos grandes errores para los principiantes:
Pero tampoco hay que exagerar: caer en la trampa del reduccionismo extremo, intentando hacer grandes teorías desde el principio, puede ser peligroso. Solo te llevará a la teoría y al aburrimiento, y te hará perder motivación. Esto suele ocurrir con estudiantes de ciencias de la computación.
Para entender mejor, puedes comparar aprender programación con aprender a cocinar: compras libros de recetas para preparar buenos platillos. Si solo quieres cocinar para tu familia, eso puede ser suficiente; seguir los pasos de las recetas te dará buenos resultados. Pero si quieres impresionar a tus amigos, crear platillos únicos y convertirte en un “gran chef”, necesitas entender las ideas detrás de esas recetas, comprender la teoría, no solo practicar ciegamente. Pero si todos los días solo lees libros teóricos sin practicar, solo te convertirás en un mal cocinero, e incluso nunca llegarás a ser uno, porque te rendirás ante la monotonía. En resumen, la programación conecta la teoría con la práctica, y es un campo donde la ciencia de la computación y las aplicaciones se entrelazan. La forma correcta de aprender programación es: explorar de arriba hacia abajo mediante proyectos y experimentos, para obtener intuición y motivación; y desde abajo hacia arriba, sentando bases sólidas y consolidando el pensamiento algorítmico.
Como principiante, debes enfocarte en la primera, con la segunda como complemento.
Fundamentos del diseño de programas
“¿Qué lenguaje de programación debería aprender?” Es una de las primeras preguntas de los principiantes, pero en realidad es una pregunta equivocada. Lo que deberías preguntarte primero es: “¿Qué elementos constituyen la base del aprendizaje de programación?”
En la base de la pirámide del conocimiento en programación hay tres partes clave:
Para principiantes en la etapa de introducción, usar C como primer lenguaje puede ser muy difícil y aburrido, porque implica aprender estas tres partes simultáneamente, y antes de poder hacer algo, hay que dedicar mucho tiempo.
Por eso, para minimizar el esfuerzo en “sintaxis” y “fundamentos del sistema”, se recomienda usar Python como primer lenguaje. Aunque Python es amigable para principiantes, no significa que sea solo un “juguete”; en proyectos grandes, su potencia y flexibilidad son evidentes. Una vez familiarizado con Python, aprender C será una buena opción: te ayudará a pensar desde una perspectiva cercana al hardware y a entender algunos principios del sistema operativo.
A continuación, se presenta una guía de introducción que te ayudará a construir un marco mental completo, facilitando la exploración de arriba hacia abajo. Los materiales no tienen un orden estricto; puedes escoger cualquiera, y si te bloqueas, considera cambiar de material.
MIT 6.00.1x (Introducción a la ciencia de la computación y programación en Python). Aunque el curso usa Python, como una excelente introducción, enfatiza conceptos y paradigmas importantes en ciencias de la computación, no solo el lenguaje. Si no eres estudiante de ciencias, te abrirá la mente en el autoestudio; contenido: conceptos computacionales, programación en Python, estructuras de datos y algoritmos simples, pruebas y depuración.
Harvard CS50x (Ciencia de la computación, Harvard). También es una introducción, complementaria a la de MIT. Usa C, PHP, JavaScript + SQL, HTML + CSS. Tiene un alcance y profundidad adecuados, y permite conocer algunos avances tecnológicos recientes, lo que puede motivar mucho el interés en la computación. Tarea adicional: leer “Coding”.
Al terminar esta etapa de introducción, habrás acumulado cierta experiencia en código y comprensión de la programación. Entonces, quizás quieras aprender alguna tecnología concreta, como desarrollo web, Android, iOS, etc. Puedes intentar hacer cosas simples, obtener retroalimentación positiva y motivarte. Pero recuerda no profundizar demasiado en detalles específicos, ya que en el futuro tendrás tiempo para aprenderlos. Tampoco te enfoques en frameworks o lenguajes específicos ahora; es momento de aprender los fundamentos de ciencias de la computación. No intentes tomar atajos aprendiendo directamente lo que quieres, eso está destinado al fracaso.
Entonces, ¿qué hacer en esta fase de entrada? Reflexiona sobre tus programas anteriores: ¿por qué diseñaste así? ¿Cómo puedes escribir mejores programas? Busca entender la esencia de la programación: usar la computadora para resolver problemas.
Suposiciones:
X = tiempo dedicado a pensar en soluciones, es decir, “resolver problemas”
Y = tiempo dedicado a implementar el código, es decir, “usar la computadora”
Capacidad de programación = F(X, Y) (donde X > Y)
Para mejorar esta capacidad, debes optimizar X, Y y la función F(X, Y). Pocas obras abordan estos tres aspectos simultáneamente, pero hay una que sí: “Structure and Interpretation of Computer Programs” (SICP). Este libro te indica estos tres caminos. Antes de leer SICP, quizás puedas resolver problemas simples con algunas funciones. Pero después de leerlo, aprenderás a abstraer y descomponer problemas, enfrentando desafíos más complejos y grandes. Esto representa un gran salto en tu capacidad de programación, cambiando fundamentalmente tu forma de pensar y resolver problemas con código. Además, SICP usa Scheme, introduciéndote a la programación funcional. Su sintaxis es muy sencilla, y podrás aprenderla rápidamente, dedicando más tiempo a entender sus ideas y a resolver problemas complejos.
Peter Norvig escribió una reseña muy interesante de SICP, diciendo:
Para usar una analogía, si SICP fuera sobre automóviles, sería para quienes quieren entender cómo funcionan, cómo se construyen, y cómo diseñar vehículos eficientes, seguros y confiables para el siglo XXI. La gente que odia SICP solo quiere aprender a conducir en la autopista, como todos.
Si tú eres de los primeros, leer SICP será clave para conectar la etapa de iniciación con la de entrada.
Aunque SICP es un “libro de introducción”, tiene cierta dificultad para principiantes. Aquí algunos recursos útiles:
Tras completar esta parte, construirás un modelo propio de diseño de programas, tu mente dejará de ser un caos y entenderás que memorizar bibliotecas y sintaxis no enseña a resolver problemas. La próxima etapa será la práctica en proyectos, que será un momento excelente para avanzar. Para proyectos: en esta fase inicial, participar en proyectos open source puede ser prematuro. Mejor empieza con proyectos simples, como crear y mantener un sitio web, o hacer un pequeño juego y mejorarlo. Si no tienes ideas claras, sigue a “炼⽠研究所” o elige un proyecto de la “Mega Project List” que te guste.
Si sientes que SICP es demasiado difícil, no te fuerces; pasa a la siguiente etapa: empieza a leer “The Elements of Computing Systems”, que te enseñará a construir una computadora desde la compuerta NAND, hasta que funcione en tu máquina. No entraremos en detalles, pero este libro será fundamental en toda tu fase de introducción. Tu objetivo en esta etapa será completar todos los proyectos del libro (incluyendo un compilador y un sistema operativo básicos).
Para dominar completamente este libro y fortalecer tus bases, y para un futuro de avances sólidos, debes preparar algunos aspectos (nota: el orden no es absoluto):
Fundamentos de sistemas informáticos
Con la base en diseño de programas, si quieres profundizar en la ciencia de la computación, te recomiendo este libro: “Computer Systems: A Programmer’s Perspective, 3/E” (Sistemas informáticos: una perspectiva del programador). La crítica sobre la traducción del título no es relevante; en realidad, solo es el material del curso “Introduction to Computer Systems” de CMU. La especialidad de CMU en ciencias de la computación es más orientada al software, y este libro describe cómo funcionan los sistemas desde la perspectiva del programador, explicando en detalle cómo se ejecutan los programas en la computadora.
Si el texto te resulta aburrido, puedes complementar con el MOOC en Coursera: “The Hardware/Software Interface”, que es un subconjunto de CSAPP, con los experimentos más importantes. También, revisa “The C Programming Language” para refrescar conocimientos de C.
Tras terminar este libro, tendrás una base sólida en sistemas, y estarás preparado para estudiar sistemas operativos, compiladores, redes, etc. Cuando avances en temas más avanzados, revisa los capítulos correspondientes y realiza los ejemplos en código. Esto te dará una comprensión más profunda de la teoría, y podrás entender desde el diseño superior hasta la implementación en bajo nivel, visualizando el flujo de datos en la red, memoria, caché y CPU.
Fundamentos de estructuras de datos y algoritmos
Hoy en día, muchos piensan que programar (especialmente en desarrollo web) consiste en usar código de otros, y que expresar ideas claramente es más importante que dominar matemáticas y algoritmos complejos. ¿Para qué aprender estructuras de datos, ordenamiento, búsqueda binaria, si ya están integrados? ¿Para qué usar algoritmos si en el trabajo no los necesitas? Este pensamiento pragmático extremo es erróneo. Sin una base sólida, tarde o temprano te quedarás atascado.
Estructuras de datos y algoritmos van de la mano. En esta etapa, debes entender qué algoritmos y estructuras de datos usar para resolver un problema más rápido. Es fundamental conocer las estructuras y algoritmos comunes, y no siempre es necesario codificarlos; escribir en papel es más rápido. Para lo que no entiendas, investiga su propósito y escenario de uso.
Recursos recomendados:
Otros fundamentos
Aspectos que a menudo se descuidan en la fase inicial:
Resumen
No debes temer a lo que has leído. La introducción a la programación no se logra en unas semanas. Encontrarás muchas dificultades en el camino. Cuando te bloquees, prueba la técnica de “Feynman”: divide los problemas en partes pequeñas, y explica claramente a otros para verificar tu comprensión. Es normal no poder resolver todo; en esos casos, no te fuerces. Muchas veces, al volver después de un tiempo, todo será más claro.
Además, no te limites a los materiales mencionados. Hay otros libros que vale la pena releer en esta fase y en etapas posteriores. Entre los más recomendados en la lista de “programadores imprescindibles” en Stack Overflow están:
“Code Complete”: para programadores experimentados y novatos, ayuda a llenar vacíos de conocimiento. Para principiantes, revisa capítulos sobre variables, pruebas y carácter personal.
“The Pragmatic Programmer”: considerado un “manual de código”, cubre desde principios como DRY y KISS, hasta aspectos de la actitud profesional.
El autor, Dave, dice en la introducción:
Eres un Programador Pragmático. No estás atado a ninguna tecnología en particular, pero tienes una base amplia en la ciencia, y tu experiencia en proyectos prácticos te permite elegir buenas soluciones en cada situación. La teoría y la práctica se combinan para hacerte fuerte. Ajustas tu enfoque según las circunstancias y el entorno, y lo haces continuamente a medida que avanzas. Los Programadores Pragmáticos hacen el trabajo, y lo hacen bien.
Estas ideas y la editorial “The Pragmatic Bookshelf” me han influenciado mucho. Por eso, esta guía también busca reflejar ese espíritu, y espero que tú también te conviertas en un verdadero Programador Pragmático.
Epílogo
Si logras completar todas estas tareas, ¡felicidades! Has alcanzado realmente la entrada a la programación. Esto significa que en etapas más avanzadas no temerás aprender nuevos lenguajes, ni APIs complejas, ni tecnologías específicas, e incluso te parecerá más fácil. Claro, aún necesitarás mucha práctica: te dolerá la espalda, te cansarás al caminar, y no podrás subir al quinto piso con un solo respiro. Pero puedo asegurarte que experimentarás un cambio mental profundo, ganarás confianza, y la mirada de tus profesores, compañeros y en CSDN será muy diferente. Aunque solo hayas llegado a la entrada, ya serás un “alto ejecutivo” en el mundo espiritual del programador. No, me equivoqué: incluso los “ricos y famosos” no tienen una fuerza mental poderosa; también dudan de sí mismos, y creen que sin dinero no son nada. Pero en resumen, si sigues esta guía y estudias con dedicación, experimentarás la sensación de “alcanzar la cumbre”.
()(