viernes, 10 de octubre de 2014

Desarrollador de software. Mucho mas que código fuente

Hace poco uno de mis estudiantes me pidió que le recomendara algunas cosas para convertirse en un mejor desarrollador. Esta entrada es mi respuesta para él y refleja mi posición respecto al conjunto de habilidades tanto técnicas como soft skills que conforman un buen profesional del desarrollo de software.

Considero que un desarrollador va mas allá de ser la persona que escribe el código fuente. Es la persona que materializa los deseos de sus clientes. 

Quien programa construye producto y un verdadero producto esta conformado por sus características funcionales, atributos de calidad y los elementos tecnológicos necesarios para construirlo entre ellos la infraestructura y el código fuente. 

Articular todos estos elementos es una tarea compleja que requiere conocimiento y habitualmente este se encuentra segregado en diferentes personas de modo que el trabajo en equipo, y las habilidades de comunicación se convierten en elementos indispensables para cumplir su labor social.

Hacer software es un trabajo de comunidad, de apoyo mutuo y de mejora continua. En torno a esto, construir software que entiendan otros seres humanos es de gran importancia para lograr cultura de colaboración. Las siguientes practicas y herramientas pueden apoyar la necesidad de construir software mantenible.

  • Code Smells: Una recopilación de malas practicas de programación.
  • Patrones de refactor: Un conjunto de soluciones a problemas comunes de mantenibilidad y que pueden ser aplicadas en determinados contextos. Martin Fowler es referente en este tema. Es recomendable visitar la pagina web http://refactoring.com/, leer el libro Refactoring. Improving the design of existing code y Refactoring databases. Evolutionary database design
  • Análisis estático de código: Herramientas que nos apoyan en la identificación de malas practicas de programación. Algunas de las mas comunes son: Sonar Qube, Check Style, PMD, Find Bugs.
  • TDD (Test Driven Design): Es una practica de programación cuya aplicabilidad garantiza código de mejor calidad (Pues todo el el tiempo el código se prueba) y un diseño mas simple.
  • Principios SOLID: Un conjunto de principios que apoyan la construcción de un mejor código fuente.
  • Patrones GRASP: La asignación de responsabilidades es uno de los factores que mas influencia la escritura de código fuente limpio.
  • Clean Code: Un muy buen libro de Robert C. Martin.
  • Coding Standards: Los estándares de codificación varían dependiendo del lenguaje de programación. Acá están los estándares de Java.

Por otro lado hacer código mantenible no garantiza el éxito del producto pues la mantenibilidad se centra en la forma como se estructura el código fuente mas no en los elementos de ejecución. Por esta razón es muy importante conocer conceptos como el manejo de Threads, Programación MultiThread, Agents, profiling, sincronización, Dead Locks, o cualquier otro elemento propio de cada lenguaje o estilo de programación.

También es absolutamente importante que quien escribe código fuente tenga un buen conocimiento en patrones de diseño de cualquier tipo (Siempre serán de gran ayuda) ya sean GOF, JEE, etc.

Hasta ahora tenemos un conjunto de elementos que nos pueden apoyar en la realización de código mantenible y que tenga un buen comportamiento en tiempo de ejecución pero falta algo mas. Aunque no sea su área de experiencia, todo desarrollador debe tener conocimientos aun siendo básicos sobre arquitectura de software, esto le permitirá tomar mejores decisiones y no limitarse a construir con base en la restricciones que otra persona define. En torno a este tema recomiendo un muy buen libro N-Layerd Domain Oriented Architecture Guide with .Net 4.0. Aunque esta basado en arquitectura Microsoft es un muy buen referente de estilos arquitectónicos Layer y puede ser bastante ilustrativo.

Pero aun no es suficiente. Para que todo esto se puede articular en producto construido son importantes dos cosas:
  1. Conocer el paradigma de programación. Ya sea programación procedimental, declarativa, orientada a objetos, funcional o cualquier otra. Es muy común ver programas hechos en scala (Con programación funcional) que en su construcción son orientados a objetos. Al hacer esto no solo se pierde todo el poder del paradigma sino que terminamos construyendo productos innecesariamente complejos.
  2. Conocer el lenguaje de programación: Lenguajes de programación hay muchos, cada uno tiene sus ventajas, desventajas y características especiales que al ser aplicadas de forma correcta nos permiten lograr grandes cosas.
Recomiendo los siguientes libros para quienes quieran profundizar en los conceptos que permiten garantizar software mantenible que promueva unos buenos niveles de servicio con el  paradigma de Programación orientada objetos y Java
Y algo que les permitirá conectarse con el software como producto: Libro Lean Mindset. Ask the rigth Questions

Espero que esta pequeña entrada le sea de utilidad a todos aquellos que quieren hacer del software un producto. Aquellos que quieren ir mucho mas allá del código fuente

1 comentario:

Carlos Celis Osorio dijo...

Interesante artículo...
Yo adicionaría que todo lo que ha escrito debería ir acompañado de un cambio de paradigma, en las empresas colombianas sobre todo, puesto que, no existe una cultura de mejoramiento continuo ni de aprendizaje colaborativo en la mayoría de las empresas. Por ende, es posible que muchos empleados que son desarrolladores de software no tengan mucho tiempo para mejorar sus habilidades puesto que el tiempo en el trabajo se consume un poco más de la tercera parte de la duración completa del día y las horas para dormir se consumen otro tercio; adicionemos a eso las horas para comer, para el desplazamiento y para compartir con los seres queridos.
En conclusión, para ser un mejor desarrollador de software hay que estudiar y para estudiar hay que tener tiempo pero, tiempo con calidad de vida.