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:
- 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.
- 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
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