Permalink
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
67 lines (33 sloc) 9.75 KB

Juan María Hernández Arroyo

1. BIO

Nunca fui un programador precoz de esos que a los 6 años estaban tirando código en Basic y con 14 optimizaban rutinas en ensamblador, pero siempre me gustaron los ordenadores y de pequeño me gustaba juntarme con mi vecino (que sí era de los del ensamblador) a "programar". Bueno, él programaba y yo le decía lo que quería que hiciera.

Pese a esos prometedores inicios como Jefe de Proyecto, conseguí reconducir mi vida y ganarme la vida con lo que más me gusta: programar. Llevo más de 15 años haciéndolo profesionalmente (desde que acabé Ingeniería Superior Informática en la UCM en 2001) y aún sigo disfrutando con ello.

Escribo Koalite, un blog sobre desarrollo de software en el que me quejo de cosas, y me puedes encontrar en twitter como @gulnor, donde me quejo otras cosas.

2. INTRO

Viendo las INTROs que han escrito mis compañeros, parece que esto va de soltar un rollo motivacional y de soft skills (toma nota, eso de utilizar buzzwords es muy importante en esta profesión si quieres parecer importante. ¿Ves? Lo he vuelto a hacer utilizando la palabra buzzwords).

La verdad es que no creo que las cualidades básicas para ser un buen desarrollador estén demasiado alejadas de las de muchas profesiones.

El principal requisito si quieres ser bueno en algo es que te guste. A menos que seas un genio, y doy por hecho que no lo eres porque si lo fueras no estarías leyendo esto, la única forma que conozco de ser bueno en algo es echarle tiempo, y para eso al final necesitas que te guste. Echarle horas a algo que no te gusta a la larga es imposible.

Tienes que estar dispuesto a aprender cosas nuevas constantemente. Eso suena divertido, pero a veces puede acabar siendo estresante cuando ves que no te da tiempo a llegar a todo lo que te gustaría: no te preocupes, puedes aprender despacio las cosas importantes y con eso podrás llegar bastante lejos.

Y, lo más nos cuesta a veces: tienes que cuestionarte continuamente lo que ya sabes. No tengas miedo de cambiar de opinión. Sé humilde y asume que hay muchas cosas que ahora no sabes, y que puede que cuando las aprendas te hagan cambiar de visión. Sólo así podrás seguir avanzando sin atarte a lo que un día te sirvió pero ahora te está frenando.

3. PERFIL

Aunque comprendo la necesidad de especializarse en un mundo tan amplio como el desarrollo, me gusta (de forma ilusa, lo sé) pensar que la especialización es para los insectos.

Me considero desarrollador, aunque lo que más me gusta es programar. Hago esa distinción entre programador y desarrollador porque, pese a que no me gusta la separación tradicional en roles de analistas, arquitectos, programadores, etc., sí creo que desarrollar software es más que picar código y es importante tenerlo en cuenta.

Supongo que hoy en día se me podría considerar un full stack developer (recordáis lo de las buzzwords del principio, ¿verdad?), pero como decía, trato de ver más allá del código para entender qué estoy haciendo, para quién, y por qué.

4. CAMINO DE APRENDIZAJE

Puedes ser un buen desarrollador sin tener estudios formales, pero soy de los que piensan que se le puede sacar mucho partido a estudiar una carrera. Cierto, puedes aprender todo eso por tu cuenta, pero es más fácil si te ayudan.

Obviamente, internet es un buen sitio para aprender cosas. No siempre es sencillo distinguir el contenido bueno del malo y puedes dar muchos palos de ciego, pero poco a poco puedes encontrar tu red de blogs y gente de referencia (aquí twitter ayuda bastante) que te pueden servir de guía. Aun así, nunca jamás dejes de mirar con espíritu crítico todo lo que lees, porque incluso tus "mitos" de internet pueden estar equivocados (y seguramente lo estén muchas veces).

Hay quien le da mucha importancia a asistir a charlas, meetups, comunidades y todo esto tipo de cosas. Mi impresión es que están bien para conocer a gente (que también podrías conocer por internet), pero la mayoría de las veces el contenido de las charlas está más orientado al lucimiento del charlista que a enseñar cosas útiles. De todas formás, siempre te puede ayudar a conocer cosas nuevas en las que luego profundizar por tu cuenta y, en general, suelen ser entretenidas desde un punto de vista lúdico-festivo.

Independientemente de cómo y en qué orden los adquieras, los conocimientos que considero necesarios para ser un buen programador son:

  • Principios fundamentales. Lo pongo al principio porque creo que es lo más importante, aunque no necesariamente lo primero que debes aprender. Tienes que estar siempre pensando en qué hay por debajo de esto que estoy haciendo. Conceptos relacionados con acoplamiento, cohesión, escalabilidad, transaccionalidad, complejidad algorítmica, computación distribuida... Intenta no quedarte en la superficie de lo que estás aprendiendo en cada momento y ponlo en contexto dentro del marco de este tipo de conceptos. Así conseguirás que lo que aprendas sea mucho más sólido y no se limite a seguir un asistente para crear un esqueleto de aplicación con el framework de moda.

  • Programación orientada a objetos. Da igual el lenguaje, aunque Java o C# probablemente sean las elecciones más seguras. Es el paradigma que más se usa y resulta bastante accesible.

  • Programación funcional. No hace falta que seas un experto, pero tener ciertas nociones es importante, y creo que cada vez lo va a ser más viendo la evolución general de todos los lengaujes.

  • Bases de datos. Es muy raro que una aplicación no necesite guardar información, y es muy raro que una aplicación que necesite guardar información no utilice una base de datos, así que manejarte con ellas, especialmente con bases de datos relacionales, es necesario.

  • Hardware. No se trata de montar PCs o de diseñar la nueva CPU de Intel, pero hay que ser consciente de que TODO el software se ejecuta sobre algún hardware. Sí, el de la nube también. La nube es el hardware de otro, pero sigue siendo hardware. Hay que saber las restricciones que tenemos a nivel de harware, lo que implican las operaciones de entrada/salida, lo que supone el consumo excesivo de memoria y la paginación... Conceptos básicos, pero necesarios.

  • Redes. Al igual que el hardware, la idea es ser consciente de que, hoy en día, casi todas las aplicaciones dependen de una conexión de red. Y que no es igual una red cableada, que una conexión 4G. Y la diferencia entre UDP y TCP. Y lo que es el ancho de banda y lo que es la latencia. Te vendrá bien conocer un poco protocolos como HTTP que, casi seguro, acabarás utilizando.

  • Cómo escribir tests. Para mi una diferencia fundamental entre un buen desarrollador y uno malo es la calidad del producto que entrega. Para cuidar esa calidad hay muchos caminos, pero ser capaz de escribir pruebas automatizadas es muy útil. Hay muchos tipos de pruebas: unitarias, funcionales, de integración, basadas en propiedades... Todas tienen su uso y saber combinarlas es importante. Como bonus, es un conocimiento que puedes aprovechar en todo tipo de lenguajes y plataformas.

  • Sistemas de Control de Versiones. El que sea, aunque hoy en día el más popular es Git y, especialmente, la forma de usarlo con GitHub. Aparte de ser imprescindible para cualquier cosa que hagas profesionalmente, te abrirá las puertas a colaborar en proyectos Open Source donde podrás aprender un montón.

  • Arquitectura y diseño. Puede que al principio te parezca que te queda un poco lejos y te venga todo impuesto desde fuera, pero intenta siempre comprender la arquitectura que se está aplicando en un proyecto y los motivos que hay detrás de un diseño concreto. Además, existen catálogos de patrones de diseño y arquitectónicos que resulta útil conocer para hablar un idioma común con otros desarrolladores. Eso sí, ten cuidado porque, sobre todo cuando empiezas a tener cierta soltura con estos conceptos, es fácil caer en la tentación de crear auténticos monstruos ultra-complicados para resolver problemas simples.

  • Metodologías de desarrollo. Es otra cosa en la que, probablemente, no tengas mucha mano inicialmente y te toque asumir lo que ya se esté usando en el equipo de desarrollo en el que caigas. Aun así, plantéate siempre por qué se usan unas metodologías u otras e intenta conocer los pros y los contras de las más usas. Al igual que con la arquitectura, es fácil caer en el exceso y acabar siendo demasiado fanático de una metodología concreta. Ojo con eso.

Además de estos conocimientos más técnicos, hay un par más que también creo que son muy importantes:

  • Inglés. Qué menos que leer documentación en inglés y poder escribir textos en inglés para comunicarte por internet. Lo razonable sería que pudieras también escuchar charlas en inglés y poder ser capaz de mantener una conversación técnica. Lo deseable sería que te pudieras manejar con total soltura. De verdad, si puedes invertir tiempo en esto, merece la pena y además es un conocimiento totalmente reutilizable en otras áreas de la vida.

  • Capacidad de comunicación. Puede parecer lo contrario por la imagen de las películas de los programadores solitarios encerrados en sus cuevas, pero para desarrollar software es crítico comunicarte bien con tus compañeros de equipo, clientes, etc. Ten en cuenta que muchas veces estás hablado de cosas intangibles y es difícil hacerse a la idea de lo que queremos decir, por lo que más te vale que te esfuerces en comunicar bien esa idea tan genial que tienes en la cabeza para mejorar el diseño de la aplicación.