¿Qué dificulta la adopción de prácticas de desarrollo ágiles en proyectos de firmware / sistemas integrados?

Estoy de acuerdo con Ido, enormes barreras culturales en esto. He intentado implementar varias prácticas ágiles sin mucho éxito en organizaciones más grandes, aunque ha sido bastante fácil de hacer en una empresa pequeña.

El problema es poder simular su software o ejecutar pruebas unitarias directamente en el hardware. Por ejemplo, trabajé en un proyecto para lograr que GDB remoto funcionara con un teléfono celular, y así poder implementar y ejecutar pruebas directamente en el hardware mientras mi PC de desarrollo controlaba el dispositivo. Todo esto a través de GDB.

En otro proyecto, usé Qemu para simular nuestro hardware y ejecutar Linux dentro de la VM, simulando la mayoría de las interfaces de hardware necesarias a través de los archivos.

Esto no es fácil, y nosotros, como desarrolladores integrados, tenemos que adaptar las ideas de TDD y CI a nuestras prácticas y limitaciones. Sin embargo, no es tan difícil obtener algunas configuraciones básicas de pruebas de humo con construcciones constantes y algunos informes rudimentarios.

Una buena parte de esto es saber qué es posible y qué herramientas están disponibles. Con respecto a esto, seguir a la comunidad web me ha ayudado mucho.

Un obstáculo importante que he experimentado es que el software integrado a menudo no es la función principal en el desarrollo de un sistema integrado. Los equipos de hardware probablemente no estén utilizando técnicas ágiles dado que no los entienden ni confían en ellos. También tienen plazos de entrega mucho más largos en sus partes, por lo que los plazos no tienen tanto sentido para ellos. El gerente de proyecto / programa está tratando de conducir su proyecto en su conjunto, a menudo utilizando Microsoft Project para todas las demás disciplinas, y desea que el software se ajuste a su proceso. Eso es mucho rechazo.

Otro obstáculo importante es que para llegar a un verdadero “hecho” en el software incorporado, debe ejecutarlo en el hardware final con una solución totalmente integrada. Debido a la memoria limitada, el ancho de banda del procesador y el ancho de banda de la memoria, muchos problemas en los sistemas integrados solo se encuentran cuando hay múltiples actores que compiten por estos recursos. Por lo tanto, la competencia por los recursos genera el acoplamiento, incluidos los problemas de tiempo entre los módulos, y no solo el diseño del software. Para probar completamente los problemas de sincronización, memoria o ancho de banda, debe ejecutar el sistema completo. A menudo eso es imposible ya que aún no se ha diseñado ni prototipado, por lo que realmente no ha terminado con la funcionalidad que ofrece al final de muchos de los primeros sprints. Esto crea una deuda técnica, que no se puede quemar hasta que tenga un hardware funcional. Por lo tanto, al final del proyecto, aún necesita tener una cantidad significativa de tiempo planificado para la corrección de errores. Esto a su vez no genera confianza en los detractores, que piensan que el resultado es el mismo que la cascada.

Estos obstáculos no son insuperables, pero es necesario comprenderlos y planificar su mitigación y la comunicación de los planes al inicio del proyecto.

Si estamos pensando en cosas como el desarrollo evolutivo y TDD, los problemas serían el costo del cambio, la disponibilidad de soporte de herramientas (simuladores, utilidades de prueba) y, en general, no tan importante de una comunidad ágil para compartir historias.