domingo, 2 de junio de 2024

¿Qué separa a un programador profesional de un amateur?

 Esta es una pregunta complicada, y si no fuera porque estaba buscando un buen título para la entrada del blog probablemente la habría planteado de otra manera.

Si nos vamos por las definiciones, amateur significa(según la RAE) "no profesional", mientras que "profesional" se refiere a que se vive de realizar dicha actividad.

Tipos de Trabajo

Esta pregunta podría replantearse a ¿qué es lo que se espera de un programador profesional?, y es ahí donde depende del puesto de trabajo. En general puedo identificar 3 tipos de programadores profesionales:

  • junior. Aquellos que simplemente se dedican a implementar lo que otros programadores más experimentados en el equipo les piden que implementen. Es posible que necesiten asistencia para poder entender el propósito de las cosas que hacen.
    De este tipo de programadores se espera que tengan flexibilidad para adaptarse y aprender diferentes tecnologías según se requiera. Además, el trabajo en equipo también es necesario, tanto para modificar y entender el código de los demás como para escribir código con el que los otros se sientan cómodos trabajando.
  • senior. Son los que diseñan la arquitectura del software que funciona como la columna vertebral de los proyectos y le indican a los junior qué cosas codificar. Un senior puede o no escribir código.
    De este tipo de programadores se espera que tengan experiencia y conocimientos más profundos del área en la cual se especialicen.
  • investigador. El propósito de esta profesión es escribir artículos científicos. Aunque necesitan estar familiarizados con escribir código, no se requiere que tengan mucha habilidad para hacerlo y usualmente no necesitan mantener el código una vez que ya lo escribieron (a diferencia de las otras dos profesiones, que deben de tener mucho cuidado en cómo escriben el código porque tendrán que convivir con él por meses o años). 
    Además, es común para los investigadores tener ayudantes que implementen sus ideas, para que se puedan centrar en escribir los resultados en artículos científicos.
No incluyo en esta lista a los competidores más destacados de programación competitiva, no por falta de mérito sino porque hay muy pocos que podrían ganarse la vida simplemente participando en concursos. 

Tipos de Amateurs y Cómo Dar el Siguiente Paso

Antes que nada, cualquier programador profesional debería de tener un dominio aceptable del inglés, al menos en un contexto técnico y de lectura. Me he entrado que hay varios graduados que no saben inglés y esto es algo bastante grave.
Cualquier trabajo de programación requiere de leer artículos científicos o documentación en inglés y si éso supone un problema entonces simplemente no es posible desempeñar estos trabajos (para los que se pregunten por qué mi blog está en español, lo explico después, por el momento no quiero desviarme del tema).
Una vez aclarado ése punto, los amateurs son aún más difíciles de clasificar que los profesionales, ya que cualquiera que programe sin ser un profesional es por definición un amateur y no hay un órden fijo de aprendizaje de habilidades de la profesión.
Sin embargo, he visto varios muy recurrentes que voy a enumerar aquí junto con lo que creo que necesitan para volverse profesionales junior. No significa que todos los programadores amateur caigan en alguno de estos casos, simplemente muchos lo hacen:
  • Entusiasta de unas cuantas tecnologías. Acá incluiría a la gente que tomó tutoriales de unos cuantos lenguajes de programación y frameworks, y tal vez también a los que tomaron un bootcamp.
    Este tipo de programadores usualmente puede llevar un proyecto sencillo de manera aceptable trabajando solo. Incluso algunos de ellos podrían trabajar como freelancers.
    Los siguientes cosas que recomendaría aprender son:
    • Cómo usar un sistema de control de versiones (como Github)
    • Cómo estructurar el código para hacerlo más legible y mantenible (recomiendo Clean Code).
    • Algoritmos y Estructuras de Datos. Por supuesto que recomiendo mi propio libro, que además es gratis. Como posibles alternativas está Algoritmos, de Sedgewick(su edición "Algoritmos en C++" tiene bastantes ilustraciones de las estructuras de datos, pero en la parte de algoritmos creo que le falta profundidad); o Introduction to Algorithms, que puede resultar un tanto denso, pero está muy completo y con mucha profundidad.
    • Matemáticas discretas. Es posible que se necesite aprender esto para entender bien los algoritmos (en mi libro también explico bastante matemáticas discretas ^^). Me gustó mucho un libro titulado "Estructuras de Matemáticas Discretas para la Computación", pero creo que ya es difícil de conseguir, quizá convenga buscar otras fuentes.
    • Buenas Prácticas de la tecnología/lenguaje en turno. Todo framework o lenguaje de programación tiene una lista de buenas prácticas y es altamente recomendable familiarizarse con ellas.
      Ya que tanto los lenguajes como los frameworks están diseñados pensando que se van a seguir ésas prácticas y por tanto ésa forma de usarlos va a ocasionar menos problemas. Además, la gente familiarizada con usar algo puede anticiparse a qué tipo de prácticas son problemáticas y cuales suelen ser más ventajosas y ello también está documentado como buenas prácticas.
    • Patrones de diseño, hay un libro clásico homónimo. Esto no es tan necesario porque usualmente los que deciden qué patrones de diseño usar son los senior, pero puede servir para entender mas rápido cómo se organizan los proyectos.
    • Pruebas automáticas. Sobre todo pruebas unitarias. No las usan en todos los trabajos, pero las usan mucho los gigantes tecnológicos.
  • Competidor. Aquellos que han entrenado mucho para programación competitiva normalmente tienen bases matemáticas fuertes y conocen bastante bien los algoritmos, pero es común que necesiten saber bastante de cómo trabajar en proyectos.
    Recomendaría aprender estas cosas:
    • Programación orientada a objetos. El curso de MIT se ve decente. Para una introducción sencilla checar este post.
    • Cómo usar un sistema de control de versiones (como Github)
    • Cómo estructurar el código para hacerlo más legible y mantenible (recomiendo Clean Code).
    • Patrones de diseño, hay un libro clásico homónimo. Esto no es tan necesario porque usualmente los que deciden qué patrones de diseño usar son los senior, pero puede servir para entender mas rápido cómo se organizan los proyectos.
    • Pruebas automáticas. Sobre todo pruebas unitarias. No las usan en todos los trabajos, pero las usan mucho los gigantes tecnológicos.
  • Estudiante de ingeniería. El sentido común diría que alguien con formación universitaria debe estar mejor preparado que alguien que ha tomado unos cuantos tutoriales en internet por hobbie.
    Desgraciadamente he visto que en la práctica esto no siempre es el caso, ¿por qué?, pues porque muchos estudiantes se enfocan tanto en prepararse para pasar los examenes que se olvidan de aprender, lo cual luego resulta en graduados que ni siquiera pueden escribir programas bastante sencillos, como un fizzbuzz.
    Para poder graduarse como un profesional y no acabar como un amateur con título, recomiendo las siguienes acciones:
    • Realizar proyectos personales mas allá de las tareas. Esto servirá para reforzar las cosas aprendidas y para tener cierta motivación para seguir aprendiendo, ya que con esto se recontextualizan las cosas de "¿cómo voy a usar esto en el examen?", "¿cómo lo podría usar en mis proyectos personales?".
    • Asegurarse de no dejar huecos en las materias de matemáticas discretas, álgebra lineal o matemáticas mas elementales (para auto-evaluarse recomiendo hacerse preguntas como "¿por qué se define así y no de otra manera?", "¿por qué se siguen estos pasos para resolver este problema?" o atreverte a cambiar las preguntas clásicas por otras que nunca hayas visto para ver si las podrías responder, El Traductor de Ingeniería lo explica bastante bien.).
      Los huecos en cálculo, probabilidad o ecuaciones diferenciales no son tan graves, pero en algunas áreas de especialidad pueden afectar.
    • Buscar un internship/trabajar como becario, esto da cierta experiencia laboral que luego piden en los trabajos.
    • Intentar la programación competitiva, además de que sirve para afianzar conocimientos de algoritmos y desarrollar el razonamiento, sirve mucho en el curriculum e incluso hace que los problemas de entrevistas de trabajo parezcan fáciles.
    • Finalmente, las cosas a aprender para el "entusiasta de nuevas tecnologías" también aplican a estudiantes de ingeniería.
  • Recién graduado de ingeniería. Hasta lo que entiendo en este grupo hay mucha gente frustrada porque en los trabajos suelen buscar gente con experiencia y es común que en entrevistas de trabajo hagan preguntas para las cuales la universidad no los preparó.
    Para quienes esten en ésa situación, mi recomendación sería que buscaran formas de ganar experiencia, ya sea en algún proyecto de software libre, como freelancer o incluso en algún trabajo no muy bien pagado pero que de experiencia; y también que se aseguren de tener cierto entendimiento sólido (aunque no necesariamente amplio) de algoritmos, estructuras de datos y resolución de problemas. Es común encontrar problemas de entrevistas de trabajo donde evalúan esto.
    Finalmente, el libro Clean Code también puede servir mucho para entrevistas de trabajo así como las buenas prácticas de los lenguajes de programación que se estén usando (en entrevistas de trabajo los entrevistadores no hablan mucho de estilo de código pero en le evaluación se fijan bastante).
    Para quienes quieran incursionar en los gigantes tecnológicos, es buena idea checar Programming Interviews Exposed.
  • Gente de DEMAT. En este grupo me he encontrado con muchos rasgos en común con los competidores(aunque también con mayor variación, hay una buena cantidad que ya están bien preparados), así que recomiendo revisar las mismas cosas.
Por último, para los que quieran convertirse en investigadores creo que no hay mucho misterio: hay que estudiar un doctorado en un área de investigación.

¿Por qué mi blog está en español si es tan necesario el inglés?

El objetivo final de este blog es llevar a los lectores a un nivel profesional,n sé que varios no están aún ahí y entre otras cosas aún tienen un camino por recorrer en el inglés.
A mi parecer el manejo del inglés es algo que está mejor llevado si se practica en paralelo con las otras cosas, por lo cual no creo que sea una buena idea exigirles que dominen inglés antes de proseguir con el resto de su preparación.
Ciertamente también podría resultar más provechoso leer todo en inglés para practicar. Sin embargo, también puede resultar más desgastante, en especial las partes que requieren de mucha concentración.
Por último, estoy seguro que todo lo que escriba aquí ya está explicado en inglés en otro lado, así que simplemente estoy añadiendo la opción de leerlo en español y queda en las manos de cada quien decidir qué fuentes usar.

No hay comentarios.:

Publicar un comentario

De StackOverflow a ChatGPT: El Arte de Pegar sin Pensar

 Es curioso cómo apenas en Agosto del año pasado critiqué duramente la práctica de copiar código de páginas de internet para pegarlo dentro ...