Desarrollo de software en equipo (Parte 2)


Tecnología

Es muy importante que tu equipo tenga claro el alcance y el matiz tecnológico que le darás a tu proyecto. Como seguramente ya sabes, no es lo mismo hacer una aplicación web que una aplicación de escritorio, o un videojuego 3D, o un sistema con backend al que se conectan múltiples tipos de aplicación cliente.

En el pasado quizá hubiese sido dicho, que es mas importante una gestión cuidadosa que una maleta llena de herramientas. Sin embargo, cada día las herramientas existentes nos dan un grado de poder y un alcance enorme. Piense como hubiese sido escrito su aplicación web favorita hace 7 años, cuando no existía AngularJS, Knockout.JS o (ponga aquí su framework favorito). Hubiese podido entregarse el mismo nivel de funcionalidad al mismo costo de hoy en día?

A continuación le daré un breve resumen de lo que la tecnología le puede entregar en el ahora y una recomendación sobre sus elecciones.

Lenguajes de programación

La promesa de la tecnología en este ámbito es interesante, los lenguajes de programación de ultima generación intentan ofrecer una elevada densidad de funcionalidad por linea de código escrita y un grado de abstracción aun mayor. Los mas modernos lenguajes intentan ser tan declarativos como sea posible con el fin de que el programador pueda expresar sus deseos sin ocuparse de los algoritmos para alcanzar esta expectativa.

“Los lenguajes declarativos de ultima generación … aun se enfrentan a un desafío técnico no superado”

languagesEl paradigma de programación declarativa estriba también en que construir software es realidad escribir una especificación para la cual una implementación será hecha de forma automática, por lo tanto la tarea de testing se hace innecesaria ya que es un supuesto que la implementación automática cumplirá los requerimientos de la especificación. Sin embargo estos lenguajes se enfrentan a un desafío técnico aun no superado, las descripciones declarativas aún son auto-implementadas de maneras suboptimas, por lo que se encuentran fuera de los fines prácticos o cuando mucho limitadas a casos donde el desempeño no es de gran importancia. Por esta y otras razones no seria una decisión sabia seleccionar esta tecnología para emprender tu nuevo proyecto de desarrollo.

Para emprender tu nuevo proyecto de desarrollo de software comercial la oferta tecnología es mucho mas madura fundamentalmente en dos ámbitos, lenguajes de programación imperativos con tipado estático y lenguajes de programación imperativos con tipado dinámico. En el primer grupo puedes encontrar lenguajes populares como C#, Java, Go y C++, y son mi recomendación para el desarrollo de proyectos de software en equipo y con enfoque de ingeniería claro.

La razón para escoger este grupo estriba en que el sistema de tipos fuerte le permite al arquitecto y los desarrolladores interactuar sobre garantías locales claras. Es decir, que el arquitecto puede fácilmente describir interfaces explicitamente en el código fuente que luego los desarrolladores implementarán. Así podrán ponerse de acuerdo con un menor esfuerzo debido a que el código fuente al contener explicitamente las interfaces puede ser auto descriptivo, luego las herramientas de compilación validarán una buena parte de las restricciones que impuso el arquitecto al hacer el diseño.

Por otro lado, los lenguajes de programación dinámicos no validarán las restricciones del diseño durante la fase de compilación por lo cual los detalles de la implementación deberán ser revisados con mayor atención de manera manual para verificar la correctitud de la implementación. La arquitectura por su parte no podrá ser inferida desde el código fuente, por lo que un esfuerzo de documentación será requerido por separado. Adicionalmente, las herramientas de compilación al tener garantías locales generan software mas eficiente ya que explota mas propiedades del código fuente escrito que las que podrían ser inferidas desde el código fuente escrito en un lenguaje dinámico.

Tendencias actuales

Entre las tendencias del desarrollo actual que seguro debes implementar se encuentran:

Control de versiones o Control de código fuente

logo_gitEs un mecanismo que le permite al equipo gestionar y compartir cambios de código fuente. Para tu próximo proyecto la recomendación es usar GIT, un sistema poderosamente flexible a la hora de gestionar el código fuente. La ventaja al usar git es que la evolución del código fuente se puede representar como un árbol donde cada nodo representa una versión del software, pero su gestión le permite fácilmente manejar las bifurcaciones y mantener muy baja la sobrecarga de gestionar diferentes sub desarrollos a la vez.

Automatización de pruebas

Debido a que la verificación automática de programas aun es una promesa lejana y materia de fuerte investigación actual, nuestro software deberá ser probado para poder asegurar que su implementación es correcta. La mejor opción para equipos de desarrollo es escribir pruebas usando el propio código fuente que son ejecutadas automáticamente en cualquier momento para corroborar que un desarrollo nuevo no daña funcionalidad escrita previamente.
coverage_with_resharperComo regla general haga que el equipo implemente pruebas que recorran cada linea de código ejecutable en el sistema, luego deje que una herramienta automática le reporte el porcentaje de código que fue cubierto en dicha ejecución ademas de la cantidad de casos de prueba que fueron exitosos y fallidos. Asegure que su equipo mantiene un nivel de cobertura cercano al 100% y la totalidad de las pruebas resulten exitosas.

Análisis estático de código

static_analysisConsiste en tomar una herramienta automática que revisa el código fuente verificando que un sin numero de reglas están satisfechas. Estas reglas suelen ser configurables y mas blandas que las reglas propias del lenguaje de programación, es decir, el análisis estático no te dirá si un programa es o no correcto desde el punto de vista de como esta escrito, pero puede indicarte usos del lenguaje que aunque son legales para el compilador no son recomendados o no satisfacen restricciones de diseño impuestas para las necesidades particulares del proyecto, o van en contravia de las mejores practicas reconocidas. Entre las mejores herramientas en este rubro tenemos Resharper, StyleCop y SonarQube

Aplicación de formato y estilo automático al código fuente.

Consiste en aplicar un conjunto de reglas que hacen que el código fuente luzca siempre con el mismo estilo de codificación a pesar de que lo escriban personas diferentes.

js_code_style_indentsSuelen tener muchas opciones de configuración, establezca opciones que siempre favorezcan la legibilidad y la productividad de quien lee el código. Por ejemplo, ajuste un numero máximo de caracteres por linea de manera que quien lee el código no requiera hacer scroll en su propia pantalla, este valor solía ser 80 pero debido a las resoluciones que manejamos hoy en día en nuestras pantallas un valor de 140 a 160 es mucho mas útil. Establezca opciones que le permita maximizar la densidad de código siempre que este mantenga legible pero armonice con sus preferencias estéticas.  Instruya a su equipo en bajo la premisa de que el código se escribe primero para las personas y luego para el compilador. Entre las herramientas mas destacadas para este propósito tenemos Resharper, Visual Assist, IntelliJ IDEA

“el código se escribe primero para las personas y luego para el compilador”

Gestión automática de dependencias

nugetsActualmente existen los muy populares gestores de paquetes que le permiten administrar con mucha facilidad las bibliotecas de las cuales nuestro proyecto depende, estas son herramientas que hacen fácil nuestro proceso de construcción y entrega ya que nos permiten mantener actualizadas nuestras dependencias y facilitan la migración cuando deseamos hacer cambios en los paquetes que deseamos usar. Entre las herramientas mas reconocidas de este campo tenemos: Maven, Nuget, ChocolateyIvy, npm, bower, pip

Calidades de construcción

delphi-project-manager-debug-releaseCuando compilas y construyes tu proyecto puedes hacerlo con diferentes fines. Por ejemplo, con el fin de ejecutar pruebas manuales o depurar la ejecución de las ultimas lineas de código que escribiste, o entregarlo al cliente para uso en producción. Debido a esto el resultado de la construcción puede requerir ser configurado con diferentes opciones por ejemplo pedir al compilador el máximo nivel de optimización para una ejecución mas eficiente y de alto desempeño, o por el contrario favorecer la experiencia de depuración, o por ejemplo habilitar la optimización pero dejar también habilitada la comprobación de aserciones de código.
Es muy importante que el arquitecto y al menos un desarrollador senior conozca a fondo las posibilidades que la tecnología de construcción le brinda para tomar el máximo provecho de esta y conseguir los resultados esperados en menor tiempo.

Integración continua y Entrega continua

Es también el santo grial del desarrollo ágil moderno, cuando te encuentras trabajando en equipo, sabes que el trabajo que cada miembro hace al final deberá integrarse al software, pero con un poco de experiencia te das cuenta que puede convertirse en un dolor de cabeza debido a que el trabajo de los miembros puede fácilmente sobrelaparse con el de otros, este problema esta parcialmente resuelto con las herramientas control de código fuente o de control de versiones que vimos mas arriba.

Sin embargo, aunque puedas combinar fácilmente el código de tu equipo en un solo repositorio, no esta garantizado que el código integrado funcionará correctamente estando junto, o peor aun, no dañará funcionalidad escrita con anterioridad. En calidad de agravante, el día que decidas tomar tu software y prepararlo para la entrega al cliente o a la puesta en producción encontraras que algunos aspectos adicionales deben ser solventados, por ejemplo, la creación de un instalador, poblar bases de datos con información semilla, inicializar servicios web, realizar cierta preparación de la maquina anfitriona, etc. Puedes ver que fácilmente esto puede convertirse en un dolor de cabeza que a menudo debe repetirse con cada release. Entonces, aparece el concepto de integración continua, el cual busca integrar automáticamente todos los aspectos del software de manera que en todo momento puedas contar con una versión del software listo para entregar, así podrás conocer y atender tempranamente los problemas propios de la integración y disminuir dramáticamente el riesgo de la entrega.

jenkins-plugin-diagram-saciA las herramientas de integración continua puedes agregar la automatización de muchas de las otras herramientas aquí mencionadas. Entonces el flujo de la integración continua quedaría mas o menos así: cuando un desarrollador somete su trabajo al servidor de control de versiones, el sistema de integración continua obtiene la ultima versión del código fuente obtiene los paquetes de los cuales depende el software, construye el software en las calidades para las cuales haya sido configurado y ejecuta las herramientas de análisis de código y ejecuta las pruebas automáticas. Como resultado de esto el director del proyecto puede ver el estado del desarrollo a medida que los desarrolladores realizan cada contribución. Este reporte puede incluir en forma gráfica la cantidad de código fuente que esta siendo probado en la integración continua a partir del porcentaje de cobertura de las pruebas automáticas y la cantidad de pruebas fallidas o exitosas.

teamcity-383469-1279080600

Algunos sistemas de integración continua permiten configurar un dashboard con métricas adicionales que le permiten al director de proyecto tener una visión mas amplia del estado del mismo.

Entre los servidores de integración continua mas conocidos tenemos: Jenkins, Team Foundation Server, TeamCity, AppVeyor, Travis-CI

Anuncios

Primeros pasos en descripcion de hardware con VHDL


VHDL source code for a signed adder
Image via Wikipedia

Hace un tiempo cuando estudiaba en la U, hice este video para la monitoria de logica digital que dictaba los fines de semana. Aqui lo dejo, quiza sea de ayuda para alguien.

Aunque habia hecho una serie de varios videos, desgraciadamente este es el unico que tengo ahora.

Es una tutoria sobre descripcion de hardware con VHDL incluyendo una práctica con el software Altera Quartus II aunque lo que se examina vale tambien para otros entornos como el de Xilinx o Actel. Se trata de modelar un multiplexor con VHDL para mostrar algo de la descripcion combinatoria y luego se agrega un registro al circuito para mostrar el uso de la funcion rising_edge(). para cada caso se compara con la interpretacion RTL que el sintetizador hace de la descripcion.