En las últimas semanas he estado en contacto con
bastantes personas que acaban de terminar sus estudios, la mayoría en la
universidad, y tienen poca (o nula) experiencia profesional, y me he llevado
una pequeña desilusión por el bajo nivel de conocimientos de muchos de ellos.
En este post lo he escrito pensando en una
formación universitaria porque es lo que mejor conozco, pero creo que realmente
es aplicable a cualquier tipo de formación que vaya orientada a preparar
alguien para dedicarse a la programación y al desarrollo de software,
incluyendo Ciclos Formativos Superiores e incluso visiones más alternativas del
tipo hack your education.
No conozco la situación en profundidad como para
saber si es un problema de los programas de estudio, de la calidad de los
profesores o del interés de los alumnos, pero sí sé que es algo que deberías
tener en cuenta si estás estudiando y quieres dedicarte a esto del desarrollo
de software, porque independiente de quién tenga la
responsabilidad, al final el mayor afectado eres tú.
Aunque voy a remarcar los conocimientos más
“prácticos” que son necesarios, soy de los que piensan que la parte teórica también es muy importante y que
asignaturas como cálculo, álgebra, lógica, teoría de números, estructuras de datos, teoría de la programación y todas
esas cosas que “no valen para nada en el mundo real”, son muy importantes a la
hora de formar un buen profesional por lo que aportan a la hora de mejorar la
capacidad de análisis y resolución de problemas.
Quiero dejar claro que no (sólo) digo esto desde el
punto de vista de las necesidades actuales de la empresa. Al contrario de lo que piensan
otros, considero que la formación de una persona, y más en el caso
de la universidad, debe estar orientada a proporcionarle las herramientas
necesarias para poder desempeñar su trabajo no sólo ahora, sino servirle como
base sobre la que seguir evolucionando y mejorando durante muchos años.
Un bueno ejemplo de esta filosofía son el tipo
de libros que creo que pueden ayudarte a
ser un mejor desarrollador: se trata de libros sobre
conceptos básicos que puedes aplicar durante mucho tiempo, no sobre el lenguaje
de moda.
¿Qué se supone que
debes saber?
Ésta es una lista de cosas que considero básicas
para cualquiera que quiera dedicarse al desarrollo y haya dedicado unos cuantos
años a formarse para ello. No hace falta ser un experto en nada (eso requiere
mucho más tiempo), pero sí tener una idea más o menos clara de los conceptos
básicos y una base lo bastante sólida como para poder seguir profundizando en
aquello que necesites.
1. Programación
orientada a objetos
Algunos dicen que ya ha alcanzado su zenit y
empieza a ser desplazada por otros paradigmas, pero la realidad es que a día de
hoy sigue siendo la manera de desarrollar la mayoría de aplicaciones.
El lenguaje no es importante, puede ser Java, C#,
C++ o incluso cosas más exóticas como Smalltalk. Lo que importa es tener claros
los conceptos, lo que es una clase, un objeto, un interfaz, una clase
abstracta, un método estático, un método de instancia, herencia, composición,
etc.
Dentro de este punto, considero especialmente útil
conocer patrones de diseño,
no tanto por los patrones en sí, que muchas veces están sobrevalorados, sino
porque ayudan a establecer un lenguaje común para comunicarte con otros
desarrolladores y la forma de implementarlos es un buen ejemplo de cómo aplicar
técnicas de diseño orientado a objetos.
No se trata de conocer el último framework de moda,
que seguramente estará anticuado en poco tiempo, sino de manejar los conceptos
necesarios para poder comprender y utilizar no sólo ese framework, sino todos
los que puedan surgir en el futuro.
2. Programación
funcional
Cada vez se usa más, e incluso los lenguajes
tradicionalmente orientados a objetos que evolucionan más lento como Java o C++
empiezan a incluir características funcionales. Y eso por no hablar de
lenguajes como Ruby, Python o Javascript o el empuje de lenguajes funcionales
como Clojure, F# o Haskell.
No hace falta ser un experto en teoría de categorías,
ni en el sistema de tipos de
Hindley-Milner o en cálculo lambda, pero al menos es necesario tener claro
lo que es una función de orden superior, el valor de la inmutabilidad o la
utilidad de un cierre lambda.
Aparte de que sea un paradigma de programación que
está ganando popularidad actualmente, aporta otra forma de razonar sobre los
problemas y eso siempre es positivo.
3. Bases de datos
Casi cualquier aplicación necesita, de una u otra
forma, almacenar información, y ésta suele terminar en una base de datos. Hasta
hace no mucho, decir base de datos era prácticamente lo mismo que decir base de
datos relacional, pero hoy en día hay bastantes alternativas, como bases de
datos documentales, de grafos, orientadas a objetos.
Es imposible pretender dominarlas todas durante tu
periodo de formación, pero sí es bueno que las conozcas y tengas una idea
aproximada de para qué sirven.
Además, merece la pena dedicarle un esfuerzo
adicional a aprender algo más sobre SQL para ser capaz de lanzar consultas
básicas. Además de su utilidad directa, aprender a expresar cosas de forma
declarativa usando lógica de conjuntos es importante.
4. Hardware y
redes
Hay programadores que piensan que por dedicarse a
programar no necesitan saber nada del hardware que ejecuta sus programas, pero
la realidad es muy distinta. Es necesario conocer las características básicas
del hardware que utilizamos todos los días para poder tomar decisiones
correctas.
Nuevamente, no se trata de convertirte en ingeniero
de Intel, sino de entender que no es lo mismo acceder a memoria cache que a
RAM, ni a RAM que a disco, y por supuesto no es lo mismo acceder a datos en
local que a información en un servidor que está en la otra punta del mundo.
Tener unas nociones básicas de cómo funciona una
red, sobre todo a nivel de protocolos, es también importante cuando hacemos
aplicaciones que deben funcionar en el mundo real. La diferencia entre UDP y
TCP, lo que puede aportarnos usar un protocolo de más alto nivel como HTTP, las
variaciones de latencia entre usar una red wifi, una red de datos móvil o una
red cableada, etc., son factores muy importantes a la hora de desarrollar una
aplicación, y aunque no sepas como funciona el handshake de una conexión
TCP, por lo menos deberías saber que existen las conexiones TCP y
que controlan la entrega de los paquetes.
5. Sistemas de
Control de Versiones
Tengo que reconocer que tenía mis dudas sobre este
punto, pero después de pensarlo creo que hoy en día no hay excusa para que no
aprendas a manejar un sistema de control de versiones mientras completas tus
estudios.
Existen muchas opciones online gratuitas como
Github, Bitbucket (o incluso Team Fundation Service, si no te queda más
remedio) y es una herramienta tan útil, aunque sólo sea para coordinarte con
tus compañeros de prácticas, que deberías saber manejarla.
Igual que pasa con los lenguajes de programación,
no es importante cuál aprendas, pero aprende alguno que te permita practicar
las ideas básicas de subir y bajar código, obtener cambios de otras personas,
crear ramas, resolver conflictos, etc.
Insisto, aunque sólo sea para coordinarte con tus
compañeros de prácticas, aprende a manejarlo y evitarás estar enviando zips por
email y tratando de averiguar cuál era la versión buena la hora de hacer la
entrega.
¿Esto te
garantizará un trabajo?
La verdad que ni siquiera sé si esto te hará más
apetecible para el mercado laboral, teniendo en cuenta el panorama actual. Ya
escribí sobre lo que parece ser que buscan
las empresas y sobre el estado de la industria del software en España, pero
hay que intentar ver las cosas con cierta perspectiva.
Hoy en día, entre la manera de trabajar de muchas
empresas y la calidad de muchos de nuestros colegas de profesión, parece que
todo esto da igual y que no compensa aprender las cosas de verdad. Que lo mejor
que puedes hacer es tirar código de cualquier manera durante un par de años
para intentar dar cuanto antes el salto a puestos que no requieran tanta
programación. Si ese es tu deseo, es verdad, no merece la pena hacer el
esfuerzo de aprender esto y seguramente deberías centrarte en otras
habilidades.
Sin embargo, si te gusta programar y quieres
dedicarte a ello, es fundamental que seas bueno en tu profesión.
Sólo así conseguiremos cambiar la idea de que los programadores son algo que no
aporta valor, porque realmente sí que podrás aportar valor.
Es verdad, esto requiere mucho esfuerzo, pero es lo
que hay. Y además más te vale acostumbrarte porque si realmente te quieres
dedicar al desarrollo de software, tendrás que hacerlo toda tu vida. Vas a
estar aprendiendo cosas nuevas toda tu vida. Y eso es bueno. Es divertido. Si
no te parece divertido, seguramente te hayas equivocado de profesión y deberías
buscar una a la que no te importe dedicarle parte de tu tiempo para aprender y
mejorar.
Conclusiones
Hay muchas más cosas que son útiles y merece la
pena aprender. Como se suele decir, no están todas las que son pero sí son
todas las que están. Las que cosas que aparecen en este post son de las más
básicas y en las que he detectado más carencias al hablar con gente que acaba
de terminar su formación.
En algunos casos, parece que pretendemos correr
demasiado y he hablado con personas que han hecho cursos o incluso han
trabajado con tecnologías recientes como ASP.NET MVC y Entity Framework, pero
no tienen claros conceptos básicos como clases e interfaces. Eso no se puede
sostener en el tiempo. No es que los frameworks hagan
tontos a los desarrolladores, pero sin unas bases sólidas, al final
las cosas se acaban cayendo y entramos en un modelo de desarrollo fundamentado
en meter mano de obra, cobrar servicios y no valorar al programador, porque,
realmente, no aporta mucho.
Ésta no es una responsabilidad exclusiva tuya como
estudiante. Seguramente haya muchas cosas que estén fallando para llegar a esta
situación, pero la realidad es que, hoy por hoy, el más interesado en tener una buena formación eres tú,
y tienes en tu mano muchas herramientas para conseguirla.
Fuente: Juan María Hernández | software development
hola
ResponderBorrar