Cómo Crear Código Fuente de Calidad

Este post deja a un lado las pruebas de Aseguramiento de Calidad de Software desde un punto de vista funcional, para centrarse en cómo un desarrollador moderno puede escribir aplicaciones de calidad.

Propósito

Producir código fuente de calidad y de forma efectiva facilita la continuidad del software, la colaboración con el equipo de trabajo, la reutilización de funcionalidad e incluso la automatización de procesos de ingeniería.

Esta publicación es básicamente una guía de referencia para favorecer el hábito de considerar aspectos de calidad al desarrollar software, sin ahondar exhaustivamente en cada aspecto pues existen amplias fuentes de información especializadas en cada tema.

Aspectos

Esta sección aborda aquellos aspectos de relevancia por tomar en cuenta al producir código fuente con un nivel de calidad mayor, sin depender de un lenguaje, tecnología, framework o metodología particular.

01. Legibilidad

El código fuente debe ser leíble y comprendido con la mayor facilidad posible. Esto implica formatear el código fuente, ajustarse a las convenciones de codificación de los lenguajes de programación, usar identificadores significativos y seguir reglas de nomenclatura estándares. Muchas herramientas integradas en los editores de texto e IDEs le ayudarán a formatear el código, mientras se vuelve costumbre.

02. Cobertura

Asegúrese de que toda instrucción es alcanzable, es decir, que en algún momento partes de su código serán ejecutadas. Esto ayuda a detectar código "basura", que no es del todo utilizado, evitando confusiones. Este término en inglés se llama Code Coverage y existen múltiples herramientas para cada lenguaje que facilitan detectar código inalcanzable.

03. Errores Probables

En ocasiones las estructuras de código poseen potenciales errores no detectados en tiempo de compilación pero pueden aparecer en tiempo de ejecución, como una división por cero o una instrucción sospechosa y no confiable. En inglés, el término para esto es Code Linting y existen muchas herramientas que detectan estos errores probables, llamadas Linters, para cada lenguaje e integradas muchas veces en editores o IDEs.

04. Frameworks

Aunque no es necesario emplear un framework para desarrollar en cierto lenguaje, sin duda facilitan mucho el trabajo y suelen estar bien depurados. Sin embargo esta recomendación va en el sentido de apegarse a las convenciones que estos frameworks ya definen, para facilitar el entendimiento y agilizar el desarrollo. Consulte bien la documentación y ejemplos que le sirvan de guía.

05. Dependencias

Si su código posee dependencias de otras librerías, use apropiadamente un gestor de dependencias, como Composer para PHP, Bower o NPM para Javascript, Nuget para .NET, Pip para Python, entre otros. Un gestor de dependencias le ayudará a evitar incrustar librerías directamente en sus proyectos y versionarlas, obteniéndolas bajo demanda y sin causar conflictos entre éstas.

06. Modularidad

Diseñe software cuyo código fuente esté bien estructurado en ficheros y carpetas en apego a convenciones, defina bien los espacios de nombres de clases ("namespaces") y construya pensando en la reutilización del código en otros proyectos. Piense en crear componentes, módulos o librerías que realicen tareas concretas y aprovechables.

07. Versionamiento

El simple hecho de versionar código no lo convierte en código de calidad, pero el proceso de versionamiento le facilitará el control de cambios, la colaboración con terceros y actualización de ambientes de su software. Ya sea Subversion, Git o cualquier otra herramienta de versionamiento que use, describa bien sus cambios y estructure su repositorio pensando en su mantenimiento.

08. Comentarios

Mantenga su código documentado toda vez que sea necesario y la legibilidad del mismo no sea suficientemente explicativa. No documente en exceso aquello que otro desarrollador puede comprender con facilidad. Siga las convenciones de documentación de su lenguaje de programacion. 

09. Documentación

Cuenta con al menos un fichero README.md con la información clave para comprender el proyecto y cómo ponerlo en marcha. Es posible que prefiera separar esta documentación en múltiples ficheros o sólo en uno, según sea conveniente. En el caso de RESTful APIs, sugerimos el uso de Swagger y Swagger-UI (o herramientas similares) que faciliten el consumo de APIs.

10. Construcción

En caso de emplear código fuente cuyo lenguaje de programación requiera compilación, tome en cuenta usar una herramienta de construcción de software que facilite la generación de binarios ("builds") del software, pruebas y publicación en ambientes de ejecución. Considere herramientas como Maven, Gradle, Msbuild, Nant, así como aquellas de integración continua.

11. Pruebas

Mantenga íntegra la calidad de ejecución de su código empleando Pruebas Unitarias o algún otro mecanismo que le facilite detectar si el software no está produciendo los resultados esperados, inclusive de forma automática e integrada con su herramienta de integración continua. Librerías y utilidades como PHPUnit, Nunit y Junit son esenciales en este tipo de pruebas.

12. Optimización

Haga uso de herramientas de Profiling para medir el tiempo de procesamiento, complejidad o consumo de memoria ineficiente del software. Muchos problemas de rendimiento se resuelven durante el diseño de software, sin embargo en caso de duda o algún cuello de botella, no dude en considerarlas.

13. Errores

Nunca deje la gestión de errores o excepciones del software a la libre, pues podria provocar comportamientos inesperados. Prevea siempre mecanismos de captura y reacción ante errores, que le faciliten la comprensión y la canalización de situaciones inesperadas. Habilite los mecanismos necesarios que le permitan registrar y también depurar condiciones de error.

14. Auditoría/Logs

Registre en logs debidamente formateados cada evento que produzca un impacto en el estado de la aplicación (base de datos, configuración, etc) de modo que pueda ser fácil trazar errores o eventos significativos. Estos registros deben contar con datos contextuales del evento que permitan comprender su naturaleza. También, establezca niveles de registro (ERROR; DEBUG, INFO, etc).

15. Parametrización

Evite usar estructuras de código que requieran alterar ficheros de código fuente o re-compilar el software tan solo para ajustar algún parámetro de configuración del comportamiento del mismo. Siempre procure parametrizar el comportamiento del software mediante ficheros de configuración y otros mecanismos aparte que faciliten su mantenimiento.

16. Seguridad

Muchos lenguajes y frameworks de programación se han preocupado por prevenir de antemano potenciales vulnerabilidades de seguridad, pero la mayoría siguen siendo introducidas por el desarrollador, por lo que procure asegurar los mecanismos de autenticación, autorización, validación de datos, infiltraciones y condiciones que comprometan la estabilidad de su software.

17. Escalabilidad

Identifique servicios comunes que puedan ser reutilizados por otras aplicaciones y sepárelos. O bien, identifique servicios que por su naturaleza puedan requerir escalarse en múltiples nodos para efectos de balanceo de carga y alta disponibilidad.

18. Configuración

Emplee una confguración y herramientas que le permitan rápidamente preparar o configurar un entorno de desarrollo o pruebas de la aplicación. Herramientas como docker y docker-compose suelen ser muy efectivas para levantar rápidamente un entorno de desarrollo aislado de su propia estación de trabajo.

19. Licenciamiento

Finalmente, deje claro cuál es el uso que terceros pueden hacer de su software. Garantíce la autoría del software hacia usted o su compañía y establezca con claridad los términos en que otros podrán hacer uso de su código fuente, ya sea bajo un mecanismo de licenciamiento libre o alguno más restrictivo.

Conclusión

Escribir código de calidad es fácil cuando se convierte en un buen hábito y se cuentan con las herramientas adecuadas durante el momento de desarrollo. La mayoría de estas prácticas no son nada complejas y se ajustan a muchos escenarios y tecnologías.

Probablemente existan muchos otros aspectos valiosos para la calidad de su código fuente que pasaron por alto en este artículo, por lo que sírvase dejar su aporte en los comentarios para valorarlos y mantener este artículo actualizado continuamente.

 

BLOG COMMENTS POWERED BY DISQUS