← Volver

Test de productividad en equipos de desarrollo

78 preguntas para evaluar la disciplina, las prácticas, el entorno y la organización de un equipo de desarrollo, y detectar qué puede mejorar para crear software de calidad y fácil de mantener.

Tests

Hay algunas preguntas que me hago recurrentemente cuando llevo un tiempo desarrollando o dirigiendo un nuevo proyecto. Lo he hecho recientemente, ahora que estamos a punto de lanzar Picly (web en pruebas aquí: http://stage.picly.io).

Uno de los elementos que caracterizan a un buen equipo frente a otro que no lo es tanto es la disciplina a la hora de mantener en el día a día las buenas prácticas y los procedimientos establecidos. Esta disciplina, por lo general, suele venir impuesta por el responsable del equipo, y no por sus propios miembros, que… bueno, no siempre están lo suficientemente motivados o interesados en generar un producto o proyecto mantenible y evolucionable.

En uno de los capítulos de El Libro Negro del Programador resumí, en forma de setenta y ocho preguntas, los indicadores más relevantes que tenemos que tener en cuenta para generar software de calidad. Son preguntas sencillas y directas que nos indican en qué punto flaqueamos o qué podemos mejorar, tanto en nuestro día a día como desarrolladores como en nuestro sector profesional.

Creo que en esas preguntas se resume lo más importante que debe tener en cuenta un equipo de desarrollo y su responsable, partiendo de la base de que no hay supergurús (aunque sí egos inflados, me temo) ni equipos perfectos, ni falta que hace. Lo único que importa es que el negocio para el que se trabaja pueda usar la funcionalidad que necesita, entregada a tiempo; que desarrollemos con calidad; y que además se puedan pedir más características sin acabar con una solución espagueti que haya que tirar a la basura.

Hay muchas razones por las que el software se pudre (software rots). El concepto suena fatal, pero lo que viene a decir es que es casi natural que una solución evolucione de una forma tan caótica que resulte imposible mejorarla o mantenerla; entonces, lo único que se puede hacer es tirarla a la basura. Hay razones para que esto ocurra que abordaré en otra entrada, aunque existen buenas referencias publicadas. Lo que sí quiero remarcar es que, si la mayoría de las siguientes setenta y ocho preguntas se responden afirmativamente, la probabilidad de tener que tirar un producto —o parte de él— a la basura con el tiempo se reducirá notablemente.

Ahora bien, si conocemos bien las razones por las que esto ocurre, entonces nos esforzaremos sin problemas para evitarlo, digo yo; aunque algunas de estas razones son bastante sutiles y tienen un efecto acumulativo difícil de apreciar a primera vista.

A continuación copio y pego este test, que viene incluido en el capítulo titulado «El test del desarrollador de software altamente productivo». Como se verá, muchas de estas preguntas no son de carácter técnico, sino que tratan del entorno, el ambiente y la forma de trabajar en los que nos desenvolvemos, pero afectan positiva o negativamente a nuestro trabajo:

  1. ¿Está el código que generamos suficientemente respaldado por pruebas?
  2. ¿Tiene el equipo en el que trabajamos una cultura suficientemente sólida de creación de pruebas?
  3. ¿Dedicamos conscientemente algún tiempo a refactorizar? Es decir, ¿nos planteamos con frecuencia si algo se puede mejorar o simplificar?
  4. ¿Vamos dejando en el código comentarios del tipo «TODO…» que finalmente nunca llegamos a completar?
  5. ¿Buscamos en nuestro día a día cómo aplicar principios S.O.L.I.D., KISS, etc.?
  6. ¿Trabaja el equipo de desarrollo con la suficiente tranquilidad, en un ambiente cordial y creativo?
  7. ¿Existe suficiente cordialidad entre los miembros del equipo para cooperar en el proyecto?
  8. ¿Tienen que estar terminados nuestros proyectos «para antes de ayer»? Es decir, ¿trabajamos siempre con prisas?
  9. ¿Buscamos trabajar de cerca con la gente que mejor sabe cooperar y trabajar en equipo?
  10. ¿Hay individualismos en el equipo, o personas a las que les resulta difícil trabajar en grupo?
  11. ¿Fomentan los managers o gestores un buen clima en el equipo de trabajo y ponen todos los medios para que este avance correctamente?
  12. ¿Aplicamos intencionadamente principios de diseño cuando programamos?
  13. ¿Tendemos habitualmente a simplificar algo que ya funciona?
  14. ¿Sentimos la necesidad de llenar de comentarios internos las piezas de código que escribimos?
  15. Cuando alguien retoma nuestro trabajo, ¿tiene que preguntarnos continuamente por detalles que no termina de entender?
  16. ¿Buscamos la maestría en aquellas tecnologías que creemos conocer suficientemente?
  17. ¿Aplicamos conscientemente las tácticas descritas en el libro de Martin Fowler sobre refactorización?
  18. ¿Evaluamos correctamente las librerías y los componentes externos que se usan en nuestro proyecto y tenemos en cuenta su grado de evolución, madurez, comunidad de usuarios, etc.?
  19. ¿Aislamos adecuadamente las librerías y los componentes externos en nuestra aplicación para no depender demasiado de ellos?
  20. ¿Somos suficientemente conscientes de que al proyecto en el que trabajamos se le pedirán más cambios y de que estos serán proporcionales a su éxito?
  21. ¿Tendemos a usar siempre lo último «porque sí», sin considerar si su uso es adecuado (y seguro) en nuestro proyecto?
  22. ¿Preferimos usar tecnologías muy maduras antes que tecnologías incipientes y de rápida evolución?
  23. ¿Consideramos el riesgo de usar módulos, librerías o componentes relativamente nuevos en nuestros proyectos?
  24. ¿Estamos dispuestos a modificar profundamente una pieza de código en la que hemos trabajado mucho tiempo?
  25. ¿Intentamos mantener a toda costa un trozo de código sabiendo que se puede mejorar?
  26. ¿Somos honestos con nosotros mismos cuando llegamos a la conclusión de que es mejor empezar algo desde cero que forzar de cualquier manera la incorporación de nuevas características?
  27. ¿Permitimos incorporar más gente al equipo en momentos de crisis, cuando se acercan las fechas de entrega y vemos que de ningún modo se va a completar el trabajo?
  28. ¿Advertimos a nuestros responsables de la falta de recursos para ejecutar con calidad y éxito el proyecto en el que trabajamos?
  29. Si somos responsables de equipos, ¿tenemos claro que cuando un equipo falla es responsabilidad nuestra?
  30. ¿Sufrimos demasiadas reuniones improvisadas?
  31. ¿Las reuniones terminan durando mucho más de lo previsto y se discuten más temas de los incluidos en la agenda?
  32. ¿Hacemos siempre un trabajo que previamente ha planificado el gestor del proyecto?
  33. ¿Se pasan por alto la metodología o las buenas prácticas en momentos de especial estrés o crisis para llegar a las fechas previstas?
  34. ¿Cambia continuamente de criterio el gestor del proyecto?
  35. ¿Tenemos todos los medios necesarios para hacer un buen trabajo?
  36. ¿Comenzamos un nuevo proyecto o una fase de desarrollo resolviendo las partes más complicadas o que más nos inquietan?
  37. ¿Aplicamos refactorizaciones continuamente al trabajo realizado, o solo cuando nos acordamos?
  38. ¿Trabajamos siempre con la calidad en mente, es decir, con la intención de hacer el mejor trabajo posible?
  39. ¿Dominamos suficientemente bien las tecnologías que se emplean en el proyecto?
  40. ¿Nos ceñimos fielmente a la metodología utilizada desde el principio hasta el final del proyecto?
  41. ¿Abandonamos las buenas prácticas metodológicas cuando sentimos presión?
  42. ¿Trabajamos en equipos con talentos descompensados, es decir, con algunas personas muy buenas y otras muy «malas»?
  43. ¿Se establece una arquitectura general rígida al principio del proyecto, cuando aún no están claros todos los requisitos?
  44. ¿Es la arquitectura general del proyecto lo bastante flexible como para poder modificarla durante el desarrollo, o es extraordinariamente rígida?
  45. ¿Está sólidamente establecida la metodología elegida o se ignora a las primeras de cambio?
  46. ¿Se percibe claramente la rentabilidad que se obtiene al seguir correctamente una metodología?
  47. ¿Se relegan siempre para el final las tareas más aburridas o rutinarias?
  48. ¿Nos preocupamos lo suficiente de que nuestro producto de software esté bien hecho y funcione, y de que además lo parezca?
  49. ¿Ponemos suficiente énfasis en diseñar interfaces de usuario ágiles, intuitivas, amigables y elegantes?
  50. ¿Nos ocurre a menudo que diseñamos interfaces de usuario pensando más en los desarrolladores que en los usuarios finales?
  51. ¿Conocemos muy superficialmente multitud de tecnologías, pero muy pocas en profundidad?
  52. ¿Nos centramos más en conocer un poco de muchas tecnologías que en resolver problemas reales con nuestro software?
  53. ¿Sentimos la necesidad de usar lo último de lo último en un nuevo desarrollo «porque sí»?
  54. ¿Indicamos en nuestro currículum los problemas que hemos resuelto con nuestro software, o una retahíla de tecnologías que conocemos superficialmente?
  55. ¿Tenemos el trabajo planificado con antelación?
  56. ¿Es habitual llegar a la oficina sin saber exactamente qué tenemos que hacer?
  57. ¿Nos asignan las tareas que debemos realizar sobre la marcha?
  58. ¿Sufrimos continuamente interrupciones durante el trabajo?
  59. ¿Contamos con los recursos y medios necesarios para realizar correctamente nuestro trabajo?
  60. ¿Se hacen horas extra con frecuencia para completar las tareas?
  61. ¿Percibimos que nuestro gestor o manager se preocupa lo suficiente para que trabajemos concentrados en nuestras tareas la mayor parte del tiempo?
  62. ¿Intentamos reutilizar frameworks y librerías suficientemente maduras en el desarrollo de nuestros proyectos?
  63. ¿Nos preocupamos de que las partes funcionales de la aplicación estén suficientemente desacopladas entre sí?
  64. ¿Nos gusta reinventar la rueda en lugar de usar librerías que ya hacen lo que necesitamos, porque creemos que lo haremos mejor?
  65. ¿Nos esforzamos siempre por escribir código que sea fácil de depurar y corregir?
  66. ¿Son nuestras soluciones imposibles de depurar y corregir una vez desplegadas en producción?
  67. ¿Pasamos muchísimo tiempo trabajando en el mismo proyecto y usando las mismas tecnologías que hace algunos años?
  68. ¿Rotamos periódicamente entre proyectos?
  69. ¿Detectamos en el equipo o departamento a personas que mantienen en secreto cierto conocimiento e información sobre alguna solución?
  70. ¿Somos altamente imprescindibles en una tarea muy específica y crítica que realizamos en la compañía?
  71. ¿Tenemos una actitud abierta a compartir con los demás todo lo que hacemos y aquello que conocemos mejor?
  72. ¿Revisamos proyectos de otros desarrolladores?
  73. ¿Leemos con frecuencia artículos de desarrollo sobre las tecnologías que usamos habitualmente?
  74. ¿Participamos en proyectos heterogéneos?
  75. ¿Ponemos en marcha algún tipo de gestión de la configuración antes de comenzar un nuevo proyecto?
  76. ¿Se sigue fielmente la gestión de la configuración definida durante todo el desarrollo del proyecto?
  77. ¿Practicamos integración continua en grupos de trabajo de más de dos desarrolladores?
  78. ¿Son conscientes todos los miembros del equipo de la importancia de trabajar fielmente con los procedimientos definidos de gestión de la configuración e integración continua?