Aspectos por Considerar al Construir Aplicaciones

Construir software es fácil, sin embargo ponerlo en operación, colaborar, mantenerlo y mejorarlo son parte de la naturaleza del software, por lo cual no deje de tomar los siguientes aspectos en consideración.

Propósito

Crear aplicaciones de calidad y de forma efectiva que faciliten 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. Análisis

Antes de empezar a construir, comprenda con claridad todos los alcances, repercusiones, restricciones, supuestos, herramientas, plataformas y otros elementos de diseño por tomar en consideración. Consulte, prueba o solicite la realimentación que considere oportuna para tomar buenas decisiones en lo que seguirá por delante. Trazar la ruta adecuada antes de empezar a caminar, es fundamental.

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

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

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

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

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

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

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

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

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

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

12. Pruebas

Siempre tenga claro qué debe probarse para confirmar que lo que esté desarrollando llene las expectativas. Puede que deba realizar pruebas manuales o automatizadas, para asegurar la calidad a nivel funcional, integración, seguridad, rendimiento, compatibilidad, experiencia de usuario, entre otras. No deje sus creaciones a la suerte. 

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

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

15. 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).

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

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

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

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

20. Interfaces/UX

Comprenda el público de las aplicaciones con interfaces de usuario, sus expectativas, herramientas, dispositivos y ambiente de operación. Estandarice comportamientos y elementos visuales, cree una aplicación intuitiva facilitando su comprensión y operación, atienda correctamente errores y eventos inesperados. Una interfaz de usuario de calidad no requiere mayor guía o soporte para operarla.

Conclusión

Alcanzar un alto nivel de calidad es fácil cuando se toman las previsiones 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. Omitirlo, simplemente se convertirá en un desgaste posterior, una carga por arrastrar,

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