Justin Etheredge lleva 20 años trabajando como ingeniería software en todo tipo de empresas (pequeñas, medianas, grandes y hasta fundando la suya propia). Después de todos estos años algo ha aprendido de nuestra profesión. Y lo explica en su post 20 Things I’ve Learned in my 20 Years as a Software Engineer. Vamos a repasarlas, añadiendo mis propios comentarios.

  1. Sólo sé que no sé nada. En nuestro campo hay demasiado por aprender. Y cada día más (nuevos lenguajes, frameworks, librerías, patrones,…). Acéptalo y olvídate del síndrome del impostor
  2. Lo más difícil es saber qué desarrollar. Por muy elegante que sea tu solución, si nadie usa el producto no sirve de nada. Lo más importante al diseñar software es saber escuchar. Y esto a veces implica ser parte ingeniero software, parte psicólogo, parte antropólogo.
  3. Los mejores ingenieros software piensan como diseñadores. Los grandes ingenieros piensan en profundidad sobre la experiencia del usuario que tendrá que usar su código. Estos usuarios serán variados. En función del código estamos hablando de la interfaz gráfica pero también puede ser el diseño de la API que usarán los que quieran llamar a mi código.
  4. El mejor código es el que no existe. O como mínimo el que tú no tienes que mantener.
  5. El software es un medio para lograr un fin. El principal objetivo de un ingeniero software es aportar valor. A veces esto puede incluso implicar que la solución que aporta más valor no es crear una nueva aplicación. Nuestro objetivo no es crear código per se sino para que aporte valor.
  6. A veces hay que dejar de afilar el hacha y empezar a cortar por lo sano. Cuidado con pasar demasiado tiempo pensando y explorando. Ponte un deadline y cuando llegue empieza a producir. Cuidado con el “análisis-parálisis”.
  7. Cuidado con ingenieros que hace años que no programan decidiendo como diseñar el sistema. Ya hemos dicho que no puedes saberlo todo y que tampoco puedes pasarte la vida explorando sin decidir. Pero sí que tienes que conocer lo que está pasando en el ecosistema del desarrollo software para poder saber qué caminos son más prometedores y vale la pena explorar un poco.
  8. No busques la perfección sino la mejora continua. Todo sistema acaba fallando o generando frustración a los usuarios, por muy bueno que fuera su diseño inicial. Acéptalo y diseña sistemas que sean fáciles de ir adaptando y mejorando
  9. No te canses de preguntar el porqué. No hagas las cosas como se han hecho siempre. Ni implementes una funcionalidad que no entiendes. Pregunta las razones hasta que las entiendas.
  10. Evita los programadores 0.1X. Más que buscar programadores 10X evita aquellos que te hacen perder el tiempo, no testean su código, no piden feedback,…
  11. Forma tus propias opiniones. Lo que más diferencia un ingeniero software senior de un junior es que tiene sus propias opiniones. No tener opiniones implica que no has experimentado lo suficiente (o peor, que eres incapaz de analizar tu propia experiencia). Da igual que no estés de acuerdo con sus opiniones (siempre se pueden discutir) pero busca trabajar con gente que tenga.
  12. La gente no quiere realmente innovación.  La gente quiere seguir haciendo las cosas como siempre. En todo caso un poco mejor. Pero si tu solución es demasiada disruptiva  no te la van a comprar. Si realmente quieres “imponer” tu innovación prepárate para muchas horas de pedagogía.
  13. Los datos son los más importantes de tu sistema. Los datos seguirán vivos cuando tu sistema muera. Más aún, seguirán vivos cuando tú te jubiles. Tómate el tiempo de tener buenas estrategias de backup, de limpieza y ordenación de datos.
  14. Respetas las viejas tecnologías. Hacen su trabajo. Y lo hacen bien. ¿Realmente quieres empezar ahora un proyecto largo y caro para reemplazar algo que funciona?
  15. No confundas humildad con ignorancia. A veces los que más hablan son los que menos saben. Asegúrate de preguntar y escuchar a los silenciosos. Que a lo mejor callan por timidez, no por desconocimiento
  16. Todo ingeniero software debería escribir regularmente. El saber comunicar es una competencia imprescindible en cualquier ingeniero. Ejercítala.
  17. Simplifica tu proceso de desarrollo. Limítalo a desarrollar en iteraciones cortas donde en cada una se desarrolle una funcionalidad reducida y se aprenda del resultado. Cualquier otra cosa es añadir complejidad y tienes que estar muy seguro de que realmente es necesaria. A veces ni las metodologías ágiles son tan ágiles.
  18. Los ingenieros software trabajan mejor cuando se sienten con autonomía y “ownership” del producto. Como todo el mundo, cuanta más implicación y “poder” sientan que tienen en el producto más comprometidos con él estarán.
  19. Las entrevistas para decidir a quien contratar no sirven. Por desgracia no hay nada mejor que incorporar el ingeniero al equipo para ver como trabajamos todos juntos. Una opción, que utiliza por ejemplo Automattic es contratar la persona para un primer proyecto (pagado claro) y, en función de como ha ido, ofrecerle o no el contrato.
  20. Lucha para que el sistema no crezca. La tentación (y presión) de añadir más funcionalidad al proyecto nunca cesan. Pero cada nueva funcionalidad viene con un alto coste. La mejor versión de un sistema software no es necesariamente la que viene con más funcionalidades.

Y vosotros, ¿estáis de acuerdo con estas reflexiones? ¿añadiríais alguna otra?