Desarrollo de Software @ Engineering USA

ARTÍCULO

Escrito por Giacomo Tagliabue


En Engineering nos gusta resolver problemas, y nos empeñamos en proporcionar a cada uno de nuestros clientes la solución que mejor se ajusta a su problema. Algunas veces esto significa emplear alguno de los productos de estado del arte de nuestro socio y personalizarlo, y algunas veces significa abandonar el camino ya recorrido e intentar inventar algo completamente nuevo para ajustarse perfectamente a las necesidades de nuestro cliente.

La construcción de un producto sólido y mantenible es una tarea difícil, no obstante. Lo que podría parecer la forma más rápida de embarcar y finalizar un producto suele finalmente culminar en un mayor costo total debido a los problemas de mantenimiento que surgen después de que se ha enviado el producto. La creación y mantenimiento de software requiere estándares de calidad bien establecidos así como métodos para entregar un producto superior de forma oportuna.

Últimamente, Engineering ha estado trabajando en el desarrollo de soluciones de software personalizadas, tanto para nuestros clientes y para nuestros socios. Este nuevo emprendimiento requirió volver a pensar la forma en que el software se crea y embarca en Engineering, para lograr más altos estándares de calidad.

En este artículo, resaltaremos qué es lo que hace a Engineering capaz de entregar soluciones de software personalizadas que satisfacen los estándares de la industria y emplean las tecnologías más modernas, así como de llevarle a usted al funcionamiento interno y mostrarle como se conducen nuestras prácticas de Desarrollo de Software.

Metas

En una sola frase, podemos definir cualquier proyecto como exitoso cuando satisface con las expectativas de los clientes o inversionistas. En el caso de un proyecto exitoso de Desarrollo de Software, este se puede alcanzar cuando se datan las siguientes metas:

  • Alta calidad: El producto entregado refleja las necesidades del cliente con atención a los detalles más pequeños.
  • Confiable: El software ha pasado por cuidadosas pruebas para remover la ocurrencia de inconsistencias/bugs que podrían afectar la experiencia de usuario.
  • Rápida entrega: Es importante entregar el Proyecto a tiempo para cumplir con la fecha límite del cliente.
  • Mantenible y extensible: Todo software requiere ser mantenido. Como tal, tiene que ser diseñado de forma tal que facilite el mantenimiento tras su entrega y que permita la fácil modificación en caso de que los requerimientos cambien o que se agreguen nuevos requerimientos.

Engineering Agile

En los últimos 15 años, una nueva filosofía llamada Programación Extrema o Extreme Programming (XP) ha comenzado a diseminarse en el mundo de Desarrollo de Software. XP permite que equipos pequeños asuman proyectos grandes y reduzcan los costos de mantenimiento. Muchas metodologías para Desarrollo de Software nacieron siguiendo diversas derivaciones de principios de XP. Como conjunto de conceptos y principios de alto nivel, XP es muy valioso, pero en ocasiones choca con algunas preconcepciones que aún existen en Desarrollo de Software, especialmente cuando, en el caso de Engineering, tenemos que lidiar con soluciones heredadas y tecnologías corporativas.

En Engineering, aprovechamos los principios centrales de las metodologías agile cuando tenemos que crear nuestro software, y diseñamos un flujo de trabajo simple que es escalable, de forma que se lo pueda usar en un proyecto de una persona, lo mismo que en un proyecto de diez o más personas.

Nuestro enfoque nos ayuda de muchas formas. Comenzamos fijando una fecha de entrega para un MVP (Minimum Viable Product – Producto Viable Mínimo) que podemos mostrar a nuestro cliente tan pronto sea posible; a partir de ahí, procedemos en iteraciones cortas hasta que todos los casos de uso estén cubiertos. Esto nos permite comunicar con clientes de forma fácil y recibir retroalimentación tan pronto sea posible, cuando los cambios son menos onerosos. Nuestros clientes participan con gusto en el desarrollo, siguiendo el proyecto desde el comienzo, y ven el progreso real del trabajo de forma diaria. El enfoque agile nos permite enfrentar cualesquier requerimientos adicionales o un bug recién descubierto de forma muy rápida, y enviar la modificación tras la entrega sin complicación.

Nuestro enfoque mezcla ciertos aspectos de Scrum en lo que respecta a la gestión de los sprints, y github-flow en lo que toca a la gestión del código base y seguimiento de problemas.

Aproximación Estandarizada

Al desarrollar software, es importante estandarizar los procedimientos y reglas a seguir a lo largo del proceso de desarrollo. En Engineering, seleccionamos nuestras tecnologías y herramientas en base a lo que es más productivo y observa mejor los estándares de la industria, y desarrollamos reglas y activos internos para aplicar a los propios proyectos. Esto nos permite tener un portafolio más cohesivo de productos, hacer integraciones más fáciles entre proyectos diferentes, y re-utilizar módulos independientes del negocio. Cuando tenemos que comenzar un nuevo proyecto, es muy fácil arrancar la solución y comenzar a escribir el código que en realidad hace lo requerido, porque podemos aprovechar una mezcla bien probada de tecnologías y flujo de trabajo. Engineering usa y vigila el cumplimiento de lo siguiente para asegurar que nuestro proceso y producto cumple con los más altos estándares de calidad con el impacto más bajo al costo:

  • Reglas de Chequeo de Estilo para Código Automatizado
  • Reglas de Análisis Estático para Código Automatizado
  • Flujo de trabajo de implementación automatizado con un clic.
  • Reglas internas y convenciones entre proyectos diferentes

Control de Código Fuente

Creemos que el control de código fuente es uno de los componentes más importantes (y de los más ignorados) para asegurar altos estándares de calidad en Desarrollo de Software.  El no usar un método de control de código fuente de forma apropiada causa que el código se “ensucie” con el paso del tiempo, lo que puede aumentar dramáticamente la deuda técnica, cosa que puede hundir un proyecto antes de siquiera ser implementado.

En Engineering, tratamos al código fuente como el documento de diseño más importante, y tomamos cuidado esmerado para asegurarnos de que únicamente el código bien probado y de alta calidad forme parte del producto final. Empleamos GitHub para hospedar nuestros proyectos y usamos su herramienta de seguimiento de problemas y mecanismo de solicitud pull para comunicarnos tanto internamente como con nuestros clientes.

También aprovechamos el poder del control de código fuente cuando tenemos que mantener versiones diferentes para nuevos desarrollos del mismo proyecto en los que cada desarrollo podría tener requerimientos diferentes o requerir dirigirse a un cliente o planta específicos.

Revisión de Código

Dos pares de ojos siempre resultan mejor que uno, así que preferimos hacer revisiones del código antes de que se acepte en el código base principal. Esto ayuda a identificar bugs y suposiciones incorrectas en el código, o ineficiencias en el código, teniendo como resultado la reducción de deuda técnica. La revisión de código también fomenta la propagación de las mejores prácticas entre los desarrolladores, de forma que cualquiera pueda reconocer, atender y aprender de sus errores más rápido, por no decir la prevención de que aquellos errores afecten la calidad del producto.

Test Driven Development (TDD – Desarrollo Conducido por Prueba)

Siempre probamos cada funcionalidad, y cada vez que se agrega funcionalidad nueva, se la debe acompañar de una prueba que cubre todos los casos de uso. Nos agradan las unidades de prueba, porque pueden ejecutarse sin gastos adicionales cada vez que el código cambia para asegurar que las modificaciones no interfieran con funcionalidad introducida previamente.

Integración Continua & Entrega Continua

En Engineering, nos gusta la automatización. La automatización de tareas significa que usted puede delegar a una máquina la realización de tareas aburridas para usted, y las computadoras son bien conocidas por ejecutar las tareas aburridas de forma rápida, barata y sin errores. Empleamos grunt gulp para crear y probar nuestras tareas de implementación. Empleamos el increíble Appveyor CI para ejecutar nuestra tarea automáticamente cada vez que se modifica el código. Por ejemplo, con Entrega Continua, podemos automatizar todas las siguientes tareas en el servidor CI y con un comando único, también asegurando que el proyecto creado no dependa del ambiente en el que se creó:

  • Análisis de Estilo
  • Análisis de Código Estático
  • Resolución de dependencias externas
  • Compilación de proyecto .NET
  • Compilación de Proyecto JavaScript
  • Minimización
  • Ejecución de Pruebas
  • Compresión de activos
  • Generación de documentación PDF
  • Compilación de instalador

Esto hace de la creación de un proyecto a partir del código fuente un proceso muy barato, replicable y libre de errores. Cada build además está identificado con un número de versión de forma tal que siempre sabemos que versión se implementa.

Tecnologías Orientadas a Web

El mundo del desarrollo ha cambiado dramáticamente en los últimos 5 años: hemos visto un desplazamiento global hacia productos basados en web. Engineering hace suya la tendencia proporcionando soluciones basadas en web y escogiendo tecnologías de avanzada para aprovechar esta nueva forma de crear software.

Las más nuevas tecnologías basadas en web nos permiten desarrollar proyectos más rápido y sin errores, y hacen del desarrollo un proceso fácil y replicable, lo que en consecuencia reduce costos y brinda productos de calidad significativamente más alta. Nos enfocamos en pilas de tecnología específicas para crear un flujo de trabajo bien probado y sólido:

  • C# y .NET porque estos son el estándar de facto en TI de manufacturas y empresarial
  • SQLServer proporciona la solución más sólida cuando se trata de gestionar una base de datos para la industria de manufactura
  • ServiceStack es un marco basado en .NET para construir servicios web sólidos y extensibles así como APIs REST
  • Typescript conjunta la formalidad y seguridad de tipos estáticos con la versatilidad y velocidad de JavaScript y bibliotecas de cliente
  • NodeJS y grunt automatizan nuestras tareas y aplican muchas mejores prácticas de desarrollo en el ambiente de cliente
  • AngularJS nos permite construir interfaces de usuario muy completas e interactivas con una increíblemente baja cantidad de código
  • npm y nuget son nuestros sistemas de gestión dependencia seleccionados para clientes y servidores, respectivamente

Como resultado tenemos software que es fácil de usar e instalar, con una Interfaz de Usuario (User Interface – UI) de aspecto moderno, capacidades poderosas de depuración y con diagnóstico, ligera huella en hardware, además de rápidas.

Engineering

En Engineering, asumimos la filosofía de Código Abierto en el Desarrollo de Software, y procuramos introducir este concepto en el mundo de TI de manufactura y empresarial.

El flujo de trabajo para desarrollo moderno se basa ampliamente en el Código Abierto. Esta tendencia también se puede ver en la última regulación de Microsoft respecto a tecnologías de desarrollo. El gigante de Redmond siempre ha sido conocido por su política de código cerrado, pero en el último año, ha hecho código abierto la mayoría de su plataforma .NET. Esto es una señal clara de que, hasta para los proyectos corporativos, ha llegado el momento de explotar el enorme potencial que ofrece el Software de Código Abierto (OSS).

En Engineering, confiamos en una buena parte de OSS para nuestros componentes centrales, y nos gusta mostrar nuestro compromiso al hacer open source muchos módulos que no son parte de nuestro negocio central. Usted puede encontrar nuestros proyectos Open Source en https://github.com/hylasoft-us.... Nosotros no hacemos esto únicamente para ayudar al crecimiento de la comunidad, sino para ayudarnos a desarrollar pensando en modularidad, y proporcionar dependencias altamente reusables y de fácil administración.

Reutilizabilidad

Pensamos que es importante no tener que volver a inventar la rueda cada vez que se inicia un nuevo Proyecto. Sería Bueno poder comenzar a escribir el código central del Proyecto en el día 1 de desarrollo, pero claro, existen muchas tareas adyacentes que han de implementarse primero para cada proyecto, desde  el mecanismo de ingreso, hasta la integración de sistemas externos, la autenticación, el ambiente de reportes, y las bibliotecas de utilidad. Cuando un proyecto es concluido, observamos qué partes se pueden extraer y reutilizar independientemente en otros proyectos. Esto no solo nos permite reducir drásticamente el código y líneas de código para cada proyecto, sino que también aumenta la calidad del producto y reduce deuda técnica, toda vez que cada módulo es completamente independiente de un proyecto único, y ya ha sido probado y usado en unidad.

¿Qué Cosa Sigue?

En Engineering, siempre buscamos formas nuevas de mejorar nuestro flujo de trabajo de desarrollo y refinar nuestra pila de tecnología. Vivimos en una era muy emocionante para el Desarrollo de Software y tenemos la seguridad de que la empresa resultará revitalizada por estos cambios de paradigma.

Hay muchos conceptos que llegan desde el mundo de las innovadoras empresas tecnológicas que arrancan hasta el mundo industrial: el desarrollo basado en contenedores tal como el tipo que proporciona Docker promete ser el estándar de facto para sustituir al viejo modelo de virtualización. El futuro cercano promete ser un periodo muy interesante para experimentar con tecnologías llevables (wearable) y la Realidad Aumentada, y el Internet de las Cosas (IoT) es algo que se vuelve más y  más importante en la manufactura.

En Engineering, no queremos perdernos de una sola oportunidad para cambiar el mundo de manufacturas, y como siempre, estamos emocionados de trabajar con nuestros clientes y socios en proyectos para hacer de estas ideas una realidad.


Contáctenos