Dogram Code
Dogram Code
https://dogramcode.com/programacion
El codificador limpio
Código de conducta para programadores
profesionales
Robert C. Martin
https://dogramcode.com/programacion
Visítenos en la web: www.informit.com/ph
Datos de catalogación de la Biblioteca del Congreso
Martin, Robert C.
El programador limpio: un código de conducta para programadores
profesionales / Robert Martin.
p. cm.
Incluye referencias bibliográficas e índice.
ISBN 0-13-708107-3 (pbk. : alk. paper)
1. Programación informática-Aspectos morales y éticos. 2. Programadores
informáticos-Etica profesional. I. Título.
QA76.9.M65M367 2011
005.1092—dc222011005962
Copyright © 2011 Pearson Education, Inc.
Ilustraciones copyright 2011 de
JenniferKohnke.
Todos los derechos reservados. Impreso en los Estados Unidos de
América. Esta publicación está protegida por derechos de autor, y debe
obtenerse el permiso del editor antes de cualquier reproducción prohibida,
almacenamiento en un sistema de recuperación o transmisión en cualquier
forma o por cualquier medio, electrónico, mecánico, de fotocopia, de
grabación o similar. Para obtener el permiso para utilizar el material de
esta obra, envíe una solicitud por escrito a Pearson Education, Inc.,
Permissions Department, One Lake Street, Upper Saddle River, New
Jersey 07458, o puede enviar su solicitud por fax al (201) 236-3290.
ISBN-13: 978-0-13-708107-3
ISBN-10:0-13-708107-3
Texto impreso en Estados Unidos en papel reciclado en RR Donnelley
en Crawfordsville, Indiana.
Sexta impresión, julio de 2015
Entre 1986 y 2000 trabajé estrechamente con Jim Newkirk, un colega
de Teradyne. Él y yo compartíamos la pasión por la programación y
el código limpio. Pasábamos juntos noches, tardes yfines de semana
jugando con diferentes estilos de programación y técnicas de diseño.
Continuamente estábamos maquinando ideas de negocio.
Con el tiempo, formamos juntos Object Mentor, Inc. Aprendí muchas
cosas de Jim mientras trabajábamos juntos. Pero una de las más
importantes fue su actitud de ética de trabajo; fue algo que me esforcé
por emular. Jim es un profesional. Estoy orgulloso de haber trabajado
con él y de llamarle amigo.
Contenido
https://dogramcode.com/programacion
Prólogo
Prólogo
Agradecimientos
Sobre el autor En
la portada
Introducción previa a los requisitos
Capítulo 1. Profesionalidad
Cuidado conlo quepides
Asumirla responsabilidad
Primero,no dañar
la ética laboral
Bibliografía
Capítulo 2. Decir que
no Roles
adversarios Lo que
está en juego
Ser un "jugador de
equipo" El coste de decir
sí al código imposible
Capítulo 3. Decir sí
Un lenguaje de compromiso
Aprender a decir "sí"
Conclusión
Capítulo 4. Codificación
Preparación
La zona de flujo
Bloqueo del
escritor Depurar
el ritmo de
trabajoLlegar
tarde Ayuda
https://dogramcode.com/programacion
Bibliográfica
Capítulo 5. Desarrollo dirigido por pruebas
El jurado está presente
Las tres leyes del TDD Lo
que el TDD no es
Bibliografía
Capítulo 6. Practicando Algunos
antecedentes de la práctica de
The Coding DojoAmpliación
de la experiencia Conclusión
Bibliografía
Capítulo 7. Pruebas de
aceptación Pruebas de
aceptación Comunicación de
los requisitos Pruebas de
aceptación
Conclusión:
Capítulo 8. Estrategias de prueba
que la GC no debe
encontrar nada La
pirámidede la
automatización de pruebas
Conclusión
Bibliografía
Capítulo 9. Gestión del tiempo
Reuniones
Focus-Manna
Boxeo de tiempo y evasión
de tomates
Callejones sin salida
Marismas, ciénagas, pantanos y otros líos
https://dogramcode.com/programacion
Conclusión
Capítulo 10. Estimación
¿Qué es una
estimación? PERT
Tareas de estimación
La ley de los grandes
números Conclusión
Bibliografía
Capítulo 11. Evitar la
presión Manejar la
presión
Conclusión
Capítulo 12. Colaboración de
los programadores frente a
los cerebros de las personas
Conclusión:
Capítulo 13. Equipos y proyectos
¿Se mezcla?
Conclus
ión
Bibliografía
Capítulo 14. Tutoría, aprendizaje y artesanía
Grados de fracaso
Tutoría
Aprendizaje
Artesanía
Conclusión
Apéndice A. Herramientas
Herramientas
Control de código
fuente IDE/Editor
https://dogramcode.com/programacion
Seguimiento de
problemas
Construcción
continua
Herramientas de
pruebas unitarias
Herramientas de prueba de
componentes
Herramientas de prueba de
integración
UML/MDA
Conclusión:
Índice
Elogios para The Clean Coder
""El tío Bob" Martin sube definitivamente el listón con su último libro.
Explica sus expectativas para un programador profesional sobre las
interacciones de la dirección, la gestión del tiempo, la presión, sobre la
colaboración y sobre la elección de las herramientas a utilizar. Más allá
de TDD y ATDD, Martin explica lo que todo programador que se
considere profesional no sólo debe saber, sino que debe seguir para
hacer crecer la joven profesión del desarrollo de software."
-Markus Gärtner Desarrollador Senior de Software it-agileGmbHwww.it-
agile.de www.shino.de
"Algunos libros técnicos inspiran y enseñan; otros deleitan y divierten.
Rara vez un libro técnico hace estas cuatro cosas. Los de Robert Martin
siempre lo han hecho para mí y The Clean Coder no es una excepción.
Lee, aprende y vive las lecciones de este libro y podrás llamarte con
precisión un profesional del software."
-George Bullock Director de programas de Microsoft Corp.
Si una carrera de informática tuviera "lecturas obligatorias para después
de graduarse", sería ésta. En el mundo real, el código defectuoso no
desaparece cuando se acaba el semestre, no se obtiene unsobresaliente
por una codificación maratoniana la noche anterior a la entrega de un
trabajo y, lo peor de todo, hay que tratar con la gente. Asíque los gurús
de la codificación no son necesariamente profesionales.
https://dogramcode.com/programacion
The Clean Coder describe el camino hacia la profesionalidad... y lo
hace de forma notablemente entretenida".
-Jeff Overbey Universidad de Illinois en Urbana-
Champaign
"The Clean Coder" es mucho más que un conjunto de reglas o
directrices. Contiene sabiduría y conocimientos duramente ganados
que normalmente se obtienen a través de muchos años de prueba y
error o trabajando como aprendiz de un maestro artesano. Si te
consideras un profesional del software, necesitas este libro".
-R. L. Bogetti Diseñador jefe de sistemas Baxter Healthcare
www.RLBogetti.com
Prólogo
Usted ha escogido este libro, así que asumo que es un profesional del
software. Eso es bueno; yo también lo soy. Y ya que tengo tu atención,
déjame contarte por qué elegí este libro.
Todo comienza hace poco tiempo en un lugar no muy lejano. Se abre
el telón, las luces y la cámara, Charley ....
Hace varios años trabajaba en una empresa de tamaño medio que vendía
productos muy regulados. Ya sabes el tipo; nos sentábamos en una granja
de cubículos en un edificio de tres plantas, los directores y los superiores
tenían despachos privados, y conseguir que todos los que necesitabas
estuvieran en la misma sala para una reunión llevaba una semana o más.
Estábamos operando en un mercado muy competitivo cuando el
gobierno abrió un nuevo producto.
De repente, teníamos un conjunto completamente nuevo de clientes
potenciales; todo lo que teníamos que hacer era conseguir que compraran
nuestro producto. Eso significaba que teníamos que presentar la solicitud
en un plazo determinado ante el gobierno federal, pasar una auditoría de
evaluación en otra fecha y salir al mercado en una tercera fecha.
Una y otra vez, nuestros directivos nos recalcaron la importancia de esas
fechas. Un solo desliz y el gobierno nos dejaría fuera del mercado durante
un año, y si los clientes no podían apuntarse el primer día, entonces todos
se apuntarían con otro y nos quedaríamos sin negocio.
Era el tipo de ambiente en el que algunos se quejan y otros señalan que
"la presión hace diamantes".
Yo era director de proyectos técnicos, ascendido desde el departamento de
desarrollo. Mi responsabilidad era poner en marcha el sitio web el día de la
puesta en marcha, para que los clientes potenciales pudieran descargar la
https://dogramcode.com/programacion
información y, sobre todo, los formularios de inscripción. Mi compañero de
fatigas era el gestor de proyectos de cara a la empresa, al que llamaré Joe.
El papel de Joe era trabajar del otro lado, ocupándose de las ventas, el
marketing y los requisitos no técnicos. También era el hombre al que le
gustaba el comentario de "la presión crea diamantes".
Si usted ha trabajado mucho en la América corporativa, probablemente havisto
el señalamiento con el dedo, la culpabilización y la aversión al
trabajo que es completamente
natural. Nuestra empresa tuvo una interesante solución a ese
problemacon Joe y conmigo.
Un poco como Batman y Robin, nuestro trabajo era hacer las cosas. Me
reunía con el equipo técnico todos los días en un rincón; reconstruíamos el
calendario cada día, averiguábamos la ruta crítica y eliminábamos todos los
obstáculos posibles de esa ruta crítica. Si alguien necesitaba software,
íbamos a buscarlo. Si les "encantaría" configurar el cortafuegos pero
"caramba, es la hora de mi almuerzo", les invitaríamos a comer. Si alguien
quería trabajar en nuestro ticket de configuración pero tenía otras
prioridades, Joe y yo íbamos a hablar con el supervisor.
Luego el gerente.
Luego el director.
Conseguimos hacer
las cosas.
Es un poco exagerado decir que pateamos sillas, gritamos y chillamos,
pero utilizamos todas las técnicas de nuestra bolsa para hacer las cosas,
inventamos algunas nuevas por el camino, y lo hicimos de una manera
ética de la que estoy orgulloso hasta el día de hoy.
Me consideraba un miembro del equipo, no por encima de él para escribir
una sentencia SQL o hacer un pequeño emparejamiento para sacar elcódigo.
En ese momento, pensaba en Joe de la misma manera, como un miembro del
equipo, no por encima de él.
Con el tiempo me di cuenta de que Joe no compartía esa opinión. Ese fue
un día muy triste para mí.
Fue el viernes a la 1:00 PM; el sitio web se puso en marcha muy
temprano el lunes siguiente.
Habíamos terminado. *HECHO*. Todos los sistemas estaban listos;
estábamos preparados. Tenía a todo el equipo técnico reunido para la
reunión final de scrum y estábamos listos para dar el salto. Más que "sólo"
el equipo técnico, teníamos a la gente de negocios de marketing, los
propietarios del producto, con nosotros.
Estábamos orgullosos. Fue un buen
https://dogramcode.com/programacion
momento. Entonces Joe se pasó por
aquí.
Dijo algo así como: "Malas noticias. El departamento jurídico no
tiene listos los formularios de inscripción, así que aún no podemos salir
a laluz".
No era gran cosa; habíamos estado retrasados por una cosa u otra
durante todo el proyecto y teníamos la rutina de Batman/Robin bien
aprendida. Yoestaba preparado, y mi respuesta fue básicamente: "Muy
bien, compañero,hagamos esto una vez más. El departamento legal está en
el tercer piso,
¿verdad?"
Entonces las cosas se pusieron raras.
En lugar de darme la razón, Joe preguntó: "¿De qué estás hablando, Matt?".
Dije: "Ya sabes. Nuestra canción y baile habitual. Estamos hablando de
cuatro archivos PDF, ¿verdad? Que están hechos; ¿el departamento legal
sólo tiene que aprobarlos? Vayamos a sus cubículos, echémosles el ojo y
acabemos con esto".
Joe no estuvo de acuerdo con mi apreciación y respondió: "Saldremos a
la luz a finales de la semana que viene. No es gran cosa".
Probablemente puedas adivinar el resto del intercambio; sonó más o menos
así:
Matt: "¿Pero por qué? Podrían hacerlo en un par dehoras".
Joe: "Podría llevar más que eso".
Matt: "Pero tienen todo el fin de semana. Mucho tiempo. Hagamos
esto".
Joe: "Matt, estos son profesionales. No podemos mirarlos fijamente e
insistir en que sacrifiquen su vida personal por nuestro pequeño
proyecto".
Matt: (pausa) ". . . Joe. . . ¿qué crees que hemos estado haciendo con
el equipo de ingeniería durante los últimos cuatro meses?"
Joe: "Sí, pero estos son profesionales".
Pausa.
Respira.
Qué. Lo hizo. Joe. Sólo. ¿Dijo?
En ese momento, pensé que el personal técnico era profesional, en el
mejor sentido de la palabra.
Sin embargo, volviendo a pensar en ello, no estoy tan seguro.
Veamos esa técnica de Batman y Robin por segunda vez, desde una
perspectiva diferente. Pensaba que estaba exhortando al equipo a su mejor
https://dogramcode.com/programacion
rendimiento, pero sospecho que Joe estaba jugando, con la suposición
implícita de que el cuerpo técnico era su oponente. Piensa en ello: ¿Por
qué era necesario correr de un lado a otro, pateando sillas y apoyándose en
la gente?
¿No deberíamos haber podido preguntar al personal cuándo iban a
terminar, obtener una respuesta firme, creer la respuesta que nos dieron y
no quemarnos por esa creencia?
Ciertamente, para los profesionales, deberíamos... y, al mismo tiempo, no
podríamos. Joe no confiaba en nuestras respuestas y se sentía cómodo
microgestionando al equipo técnico, y al mismo tiempo, por alguna razón,
sí confiaba en el equipo jurídico y no estaba dispuesto a microgestionarlo.
¿De qué se trata?
De alguna manera, el equipo jurídico ha demostrado su profesionalidad
de una forma que el equipo técnico no ha hecho.
De alguna manera, otro grupo había convencido a Joe de que no
necesitaban una niñera, de que no estaban jugando y de que debían ser
tratados como compañeros que eran respetados.
No, no creo que tenga nada que ver con los lujosos certificados que cuelgan
de las paredes ni con unos cuantos años más de universidad, aunque esos
años de universidad pueden haber incluido una buena dosis deformación
social implícita sobre cómo comportarse.
Desde aquel día, hace ya tantos años, me he preguntado cómo tendría que
cambiar la profesión de técnico para que se le considere profesional.
Tengo algunas ideas. He escrito un poco en el blog, he leído mucho, he
conseguido mejorar mi propia situación de vida laboral y ayudar a
algunos otros. Sin embargo, no conocía ningún libro que expusiera un
plan, que explicitara todo el asunto.
Entonces, un día, de la nada, recibí una oferta para revisar un primer
borrador de un libro; el libro que tienes en tus manos ahora mismo.
Este libro le dirá paso a paso cómo presentarse e interactuar como un
profesional. No con tópicos trillados, ni con apelaciones a trozos de papel,
sino lo que puedes hacer y cómo hacerlo.
En algunos casos, los ejemplos son palabra por palabra.
Algunos de esos ejemplos tienen respuestas, contrarréplicas,
aclaraciones, incluso consejos sobre qué hacer si la otra persona intenta
"simplemente ignorarte".
Oye, mira eso, aquí viene Joe de nuevo, esta vez a la izquierda del escenario:
Oh, aquí estamos, de vuelta en BigCo, con Joe y yo, una vez más en el gran
proyecto de conversión del sitio web.
Sólo que esta vez, imagínatelo un poco diferente.
https://dogramcode.com/programacion
En lugar de eludir los compromisos, el equipo técnico los asume
realmente. En lugar de eludir las estimaciones o dejar que otro haga la
planificación (y luego quejarse de ello), el equipo técnico se
autoorganiza y asume compromisos reales.
Ahora imagina que el personal trabaja realmente en conjunto. Cuando
los programadores están bloqueados por las operaciones, cogen el
teléfono y el administrador del sistema se pone realmente a trabajar.
Cuando Joe se acerca a encender un fuego para que trabajen en el ticket
14321, no lo necesita; puede ver que el DBA está trabajando diligentemente,
no navegando por la web. Del mismo modo, las estimaciones que recibe del
personal le parecen francamente coherentes, y no tiene la sensación de que
el proyecto tiene prioridad entre el almuerzo yla revisión del correo
electrónico. Todos los trucos e intentos de manipular el calendario no se
responden con un "lo intentaremos", sino con un "ese esnuestro
compromiso; si quieres inventarte tus propios objetivos, siéntete libre".
Después de un tiempo, sospecho que Joe empezaría a considerar al
equipo técnico como, bueno, profesionales. Y tendría razón.
¿Esos pasos para transformar tu comportamiento de técnico a
profesional? Los encontrarás en el resto del libro.
Bienvenido al siguiente paso en tu carrera; sospecho que te va a gustar.
-Matthew Heusser
Software Process
Naturalist
Prefacio
A las 11:39 AM EST del 28 de enero de 1986, sólo 73,124 segundos después
del lanzamiento y a una altitud de 48.000 pies, el transbordador espacial
https://dogramcode.com/programacion
Challenger se hizo añicos por el fallo del cohete impulsor sólido (SRB)
derecho.
Siete valientes astronautas, incluida la profesora de secundaria Christa
McAuliffe, se perdieron. La expresión de la cara de la madre de McAuliffe
al ver la muerte de su hija a nueve millas de altura me persigue hasta el día
de hoy.
El Challenger se rompió porque los gases de escape calientes del SRB, que
estaba fallando, se filtraron por entre los segmentos de su casco, salpicando
el cuerpo del tanque de combustible externo. La parte inferior del tanque
principal de hidrógeno líquido estalló, encendiendo el combustible y
haciendo que el tanque avanzara hasta chocar con el tanque de oxígeno
líquido situado encima. Al mismo tiempo, el SRB se desprendió de su
puntal de popa y giró alrededor de su puntal delantero. Su nariz perforó el
tanque de oxígeno líquido. Estos vectores de fuerza aberrantes hicieron que
toda la nave, que se movía muy por encima de mach 1,5, girara contra la
corriente de aire. Las fuerzas aerodinámicas lo destrozaron todo
rápidamente.
Entre los segmentos circulares del SRB había dos juntas tóricas
concéntricas de goma sintética. Cuando los segmentos se atornillaron, las
juntas tóricas se comprimieron, formando un sello hermético que los
gases de escape no deberían haber podido penetrar.
Sin embargo, en la víspera del lanzamiento, la temperatura en la
plataformade lanzamiento descendió a 17°F, 23 grados por debajo de la
temperatura mínima especificada para las juntas tóricas y 33 grados menos
que en cualquier lanzamiento anterior. Como resultado, las juntas tóricas se
volvieron demasiado rígidas para bloquear adecuadamente los gases
calientes. Al encender el SRB se produjo un pulso de presión al acumularse
rápidamente los gases calientes. Los segmentos del propulsor se hincharon y
relajaron la compresión de las juntas tóricas. La rigidez de las juntas tóricas
impidió que mantuvieran la estanqueidad, por lo que algunos de los gases
calientes se filtraron y vaporizaron las juntas tóricas a lo largo de 70 grados
de arco.
Los ingenieros de Morton Thiokol que diseñaron el SRB sabían que había
problemas con las juntas tóricas, y habían informado de ellos a los directivos
de Morton Thiokol y de la NASA siete años antes. De hecho, lasjuntas
tóricas de los lanzamientos anteriores se habían dañado de forma similar,
aunque no lo suficiente como para ser catastróficas. El lanzamientomás frío
fue el que más daños sufrió. Los ingenieros habían diseñado una reparación
para el problema, pero su aplicación se había retrasado mucho.
Los ingenieros sospechaban que las juntas tóricas se endurecían en frío.
También sabían que las temperaturas para el lanzamiento del Challenger
eran más frías que las de cualquier lanzamiento anterior y muy por debajo
de la línea roja. En resumen, los ingenieros sabían que el riesgo era
https://dogramcode.com/programacion
demasiado alto. Los ingenieros actuaron en base a ese conocimiento.
Redactaron memorandos en los que se alertaba de la existencia de grandes
riesgos. Instaron enérgicamente a los directivos de Thiokol y de la NASA a
no realizar el lanzamiento. En una reunión de última hora celebrada pocas
horas antes del lanzamiento, esos ingenieros presentaron sus mejores datos.
Se enfadaron, engatusaron y protestaron. Pero al final, los directivos les
ignoraron.
Cuando llegó el momento del lanzamiento, algunos de los ingenieros se
negaron a ver la transmisión porque temían una explosión en la plataforma.
Pero a medida que el Challenger ascendía grácilmente hacia el cielo,
empezaron a relajarse. Momentos antes de la destrucción, mientras veían al
vehículo pasar por Mach 1, uno de ellos dijo que habían "esquivado una
bala".
A pesar de todas las protestas y los memorandos, y de las peticiones de
los ingenieros, los directivos creían que sabían más. Pensaban que los
ingenieros estaban exagerando. No confiaban en los datos de los
ingenieros ni en sus conclusiones. Se lanzaron porque estaban bajo una
inmensa presión financiera y política. Esperaban que todo fuera bien.
Estos gestores no fueron simplemente insensatos, fueron criminales. Las
vidas de siete buenos hombres y mujeres, y las esperanzas de una
generación que miraba hacia
Los viajes espaciales, se vieron truncados en aquella fría mañana
porqueaquellos directivos antepusieron sus propios miedos, esperanzas e
intuiciones a las palabras de sus expertos. Tomaron una decisión que no
tenían derecho a tomar. Usurparon la autoridad de las personas que
realmente sabían: los ingenieros.
¿Pero qué pasa con los ingenieros? Ciertamente, los ingenieros hicieron lo
que debían hacer. Informaron a sus jefes y lucharon con ahínco por su
posición. Recurrieron a los canales adecuados e invocaron todos los
protocolos correctos. Hicieron lo que pudieron, dentro del sistema, y aun
así los directivos les pasaron por encima. Así que parece que los ingenieros
pueden salir de rositas.
Pero a veces me pregunto si alguno de esos ingenieros se ha quedado
despierto por la noche, atormentado por esa imagen de la madre de Christa
McAuliffe, y deseando haber llamado a Dan Rather.
Sobre este libro
Este libro trata sobre la profesionalidad del software. Contiene muchos
consejos pragmáticos en un intento de responder a preguntas como
• ¿Qué es un profesional del software?
• ¿Cómo se comporta un profesional?
https://dogramcode.com/programacion
• ¿Cómo puede un profesional enfrentarse a los conflictos, a las
agendas apretadas y a los jefes poco razonables?
• ¿Cuándo y cómo debe un profesional decir "no"?
• ¿Cómo se enfrenta un profesional a la presión?
Pero dentro de los consejos pragmáticos de este libro encontrarás una
actitud que lucha por abrirse paso. Es una actitud de honestidad, de honor,
de respeto a sí mismo y de orgullo. Es la voluntad de aceptar la terrible
responsabilidad de ser un artesano y un ingeniero. Esa responsabilidad
incluye trabajar bien y trabajar limpio. Incluye comunicar bien y estimar
fielmente. Incluye la gestión del tiempo y la toma de decisiones difíciles
con respecto a los riesgos.
Pero esa responsabilidad incluye otra cosa, una cosa aterradora. Como
ingeniero, tiene un conocimiento profundo de sus sistemas y proyectos
que ningún gerente puede tener. Ese conocimiento conlleva la
responsabilidad de actuar.
Bibliografía
[McConnell87]: Malcolm McConnell, Challenger 'A Major Malfunction',
Nueva York, NY: Simon & Schuster, 1987
[Wiki-Challenger]: "El desastre del transbordador espacial Challenger",
http://en.wikipedia.org/wiki/Space_Shuttle_Challenger_disaster
Agradecimientos
https://dogramcode.com/programacion
primavera, verano y Navidad. Trabajamos intensamente en ella. Al final,
funcionó muy bien. A Tim: ¡Gracias!
Tim y yo aprendimos a programar ordenadores. No era fácil hacerlo en
1968, pero lo conseguimos. Conseguimos libros sobre el ensamblador del
PDP-8, Fortran, Cobol y PL/1, entre otros. Los devoramos. Escribimos
programas que no teníamos ninguna esperanza de ejecutar porque no
teníamos acceso a un ordenador. Pero los escribimos de todos modos por
puro amor.
Nuestra escuela secundaria comenzó un plan de estudios de informática en
nuestro segundo año. Conectaron un teletipo ASR-33 a un módem de 110
baudios. Tenían una cuenta en el sistema de tiempo compartido Univac
1108 del Instituto Tecnológico de Illinois. Tim y yo nos convertimos
inmediatamente en los operadores de facto de esa máquina. Nadie más
podía acercarse a ella.
El módem se conectaba descolgando el teléfono y marcando el
número. Cuando se oía el chirrido del módem que respondía, se
pulsaba el botón "orig" del teletipo haciendo que el módem de origen
emitiera su propio chirrido. Luego colgabas el teléfono y se establecíala
conexión de datos.
El teléfono tenía un candado en el dial. Sólo los profesores tenían la llave.
Pero eso no importaba, porque aprendimos que se podía marcar un teléfono
(cualquier teléfono) tocando el número de teléfono en el gancho del
interruptor. Yo era baterista, así que tenía muy buena sincronización y
reflejos. Podía marcar ese módem, con el candado puesto, en menos de 10
segundos.
Teníamos dos teletipos en el laboratorio de informática. Uno era la máquina
online y el otro era una máquina offline. Ambos eran utilizados por los
estudiantes para escribir sus programas. Los estudiantes escribían sus
programas en los teletipos con la perforación de la cinta de papel activada.
Cada pulsación se grababa en la cinta. Los estudiantes escribían sus
programas en IITran, un lenguaje interpretado muy potente. Los estudiantes
dejaban sus cintas de papel en una cesta cerca de los teletipos.
Después de las clases, Tim y yo marcábamos el ordenador (a golpes, por
supuesto), cargábamos las cintas en el sistema de lotes IITran y luego
colgábamos. A 10 caracteres por segundo, no era un procedimiento rápido.
Una hora más tarde, volvíamos a llamar y obteníamos las impresiones, de
nuevo a 10 caracteres por segundo. El teletipo no separaba los listados de
los alumnos expulsando las páginas. Se imprimía una tras otra, así que las
separábamos con unas tijeras, pegábamos la cinta de papel de entrada a su
listado y las colocábamos en la cesta de salida.
Tim y yo éramos los amos y dioses de ese proceso. Incluso los profesores
nos dejaban tranquilos cuando estábamos en esa sala. Estábamos haciendo
https://dogramcode.com/programacion
su trabajo, y ellos lo sabían. Nunca nos pidieron que lo hiciéramos. Nunca
nos dijeron que podíamos hacerlo. Nunca nos dieron la llave del teléfono.
Simplemente nos mudamos, y ellos se fueron
-y nos dieron una correa muy larga. A mis profesores de matemáticas, el
Sr. McDermit, el Sr. Fogel y el Sr. Robien: ¡gracias!
Luego, una vez terminados los deberes de los estudiantes, nos poníamos a
jugar. Escribimos un programa tras otro para hacer cualquier cantidad de
cosas locas y extrañas. Escribimos programas que graficaban círculos y
parábolas en ASCII en un teletipo. Escribimos programas de paseo
aleatorio y generadores de palabras aleatorias. Hemos escrito
calculó el factorial 50 hasta el último dígito. Nos pasamos horas y
horasinventando programas para escribir y luego conseguir que
funcionaran.
Dos años después, Tim, nuestro compadre Richard Lloyd y yo fuimos
contratados como programadores en ASC Tabulating en Lake Bluff,
Illinois. Tim y yo teníamos entonces 18 años. Habíamos decidido que la
universidad era una pérdida de tiempo y que debíamos empezar nuestras
carreras inmediatamente. Fue aquí donde conocimos a Bill Hohri, Frank
Ryder, Big Jim Carlin y John Miller. Ellos dieron a algunos jóvenes la
oportunidad de aprender lo que era la programación profesional. La
experiencia no fue del todo positiva ni negativa. Fue ciertamente
educativa. A todos ellos, y a Richard que catalizó e impulsó gran parte de
ese proceso: Gracias.
Después de dejarlo y fundirme a los 20 años, hice una temporada como
reparador de cortacéspedes trabajando para mi cuñado. Lo hacía tan mal
que tuvo que despedirme. ¡Gracias, Wes!
Un año después, más o menos, acabé trabajando en Outboard Marine
Corporation. Para entonces ya estaba casado y tenía un bebé en camino.
También me despidieron.
Gracias, John, Ralph y Tom.
Luego me fui a trabajar a Teradyne, donde conocí a Russ Ashdown, Ken
Finder, Bob Copithorne, Chuck Studee y CK Srithran (ahora Kris Iyer).
Ken era mi jefe. Chuck y CK eran mis compañeros. Aprendí mucho de
todos ellos. Gracias, chicos.
Luego estaba Mike Carew. En Teradyne, él y yo nos convertimos en el
dúo dinámico. Escribimos varios sistemas juntos. Si querías hacer algo,y
hacerlo rápido, tenías a Bob y a Mike para hacerlo. Nos divertimos
mucho juntos. Gracias, Mike.
Jerry Fitzpatrick también trabajaba en Teradyne. Nos conocimos jugando
juntos a Dragones y Mazmorras, pero rápidamente formamos una
colaboración. Escribimos un software en un Commodore 64 para ayudar a
los usuarios de D&D. También iniciamos un nuevo proyecto en Teradyne
https://dogramcode.com/programacion
llamado "La recepcionista electrónica". Trabajamos juntos durante varios
años, y él se convirtió, y sigue siendo, un gran amigo. ¡Gracias, Jerry!
Pasé un año en Inglaterra mientras trabajaba para Teradyne. Allí me asocié
con Mike Kergozou. Él y yo planeamos juntos todo tipo de cosas, aunque la
mayoría de esos planes tenían que ver con bicicletas y pubs. Pero era un
programador dedicado y muy centrado en la calidad y la disciplina
(aunque,tal vez, él no estaría de acuerdo). Gracias, Mike.
Al volver de Inglaterra en 1987, empecé a maquinar con Jim
Newkirk. Ambos dejamos Teradyne (con meses de diferencia) y nos
unimos a unaempresa emergente llamada Clear Communications. Allí
pasamos variosaños trabajando juntos para conseguir los millones que
nunca llegaron.
Pero seguimos maquinando. Gracias, Jim.
Al final fundamos juntos Object Mentor. Jim es la persona más directa,
disciplinada y centrada con la que he tenido el privilegio de trabajar. Me
enseñó tantas cosas que no puedo enumerarlas aquí. En cambio, le he
dedicado este libro.
Hay tantos otros con los que he maquinado, tantos otros con los que he
colaborado, tantos otros que han tenido un impacto en mi vida profesional:
Lowell Lindstrom, Dave Thomas, Michael Feathers, Bob Koss, Brett
Schuchert, Dean Wampler, Pascal Roy, Jeff Langr, James Grenning, Brian
Button, Alan Francis, Mike Hill, Eric Meade, Ron Jeffries, Kent Beck,
Martin Fowler, Grady Booch, y una lista interminable de otros.
Gracias a todos.
Por supuesto, la mayor colaboradora de mi vida ha sido mi encantadora
esposa, Ann Marie. Me casé con ella cuando tenía 20 años, tres días después
de que ella cumpliera los 18. Durante 38 años ha sido mi compañera
constante, mi timón y mi vela, mi amor y mi vida. Espero poderpasar otras
cuatro décadas con ella.
Y ahora, mis colaboradores y socios intrigantes son mis hijos. Trabajo
estrechamente con mi hija mayor, Angela, mi encantadora madre gallina e
intrépida asistente. Ella me mantiene en el camino correcto y nunca me
deja olvidar una fecha o un compromiso. Planifico los planes de negocio
con mi hijo Micah, el fundador de 8thlight.com. Su cabeza para los
negocios es mucho mejor que la mía. Nuestra última aventura,
cleancoders.com, es muy emocionante.
Mi hijo menor, Justin, acaba de empezar a trabajar con Micah en 8th
Light. Mi hija menor, Gina, es ingeniera química y trabaja en Honeywell.
Con ellos dos, ¡los planes serios acaban de empezar!
Nadie en tu vida te enseñará más que tus hijos. ¡Gracias, niños!
Sobre el autor
https://dogramcode.com/programacion
Robert C. Martin ("Tío Bob") es programador desde 1970. Es fundadory
presidente de Object Mentor, Inc., una empresa internacional de
desarrolladores y gestores de software con gran experiencia, especializada
en ayudar a las empresas a realizar sus proyectos. Object Mentor ofrece
servicios de consultoría de mejora de procesos, consultoría de diseño de
software orientado a objetos, formación y desarrollo de habilidades a las
principales empresas del mundo.
Martin ha publicado decenas de artículos en diversas revistas
especializadas y es ponente habitual en conferencias y ferias
internacionales.
Es autor y editor de numerosos libros, entre ellos:
• Diseño de aplicaciones C++ orientadas a objetos mediante el método
Booch
• Patrones Lenguajes de Diseño de Programas 3
• Más joyas de C++
• La programación extrema en la práctica
• Desarrollo ágil de software: Principios, patrones y prácticas
• UML para programadores de Java
• Código limpio
Líder en la industria del desarrollo de software, Martin fue durante tres
años redactor jefe del C++ Report, y fue el primer presidente de la Agile
Alliance.
Robert es también el fundador de Uncle Bob Consulting, LLC, y
cofundador con su hijo Micah Martin de The Clean Coders LLC.
En la portada
La impresionante imagen de la portada, que recuerda al ojo de Sauron, es
M1, la nebulosa del Cangrejo. M1 está situada en Tauro, aproximadamente
un grado a la derecha de Zeta Tauri, la estrella que se encuentra en la punta
del cuerno izquierdo del toro. La nebulosa del Cangrejo es el remanente de
una supernova que voló sus entrañas por todo el cielo en la fecha más bien
propicia del 4 de julio de 1054 d.C. A una distancia de 6.500 años luz, esa
explosión apareció a los observadores chinos como una nueva estrella, máso
menos tan brillante como Júpiter. De hecho, ¡era visible durante el día!
A lo largo de los seis meses siguientes, desapareció lentamente de la vista.
La imagen de la portada es un compuesto de luz visible y de rayos X. La
imagen visible fue tomada por el telescopio Hubble y forma la envoltura
exterior. El objeto interior, que parece una diana de tiro con arco azul, fue
tomado por el telescopio de rayos X Chandra.
La imagen visible muestra una nube de polvo y gas que se expande
rápidamente y que contiene elementos pesados procedentes de la explosión
de la supernova. Esa nube tiene ahora 11 años luz de diámetro,pesa 4,5
masas solares y se expande a la furiosa velocidad de 1500 kilómetros por
segundo. La energía cinética de esa antigua explosión es, como mínimo,
impresionante.
En el centro del objetivo hay un punto azul brillante. Ahí es donde está el
púlsar. Fue la formación del púlsar lo que provocó la explosión de la
estrella en primer lugar. Casi una masa solar de material en el núcleo de la
estrella condenada implosionó en una esfera de neutrones de unos
30kilómetros de diámetro. El
La energía cinética de esa implosión, unida a la increíble avalancha
de neutrinos creada cuando se formaron todos esos neutrones, desgarró
laestrella y la hizo estallar.
El púlsar gira unas 30 veces por segundo; y parpadea mientras gira.
Podemos verlo parpadear en nuestros telescopios. Esos pulsos de luz son la
razón por la que lo llamamos púlsar, que es la abreviatura de estrella
pulsante.
Introducción previa a los requisitos
Supongo que has cogido este libro porque eres programador informático y
te intriga la noción de profesionalidad. Y así debe ser. La profesionalidad
es algo que nuestra profesión necesita urgentemente.
Yo también soy programador. He sido programador durante 421 años; y
en ese tiempo -déjame decirte- he visto de todo. Me han despedido. He
sido alabado. He sido jefe de equipo, gerente, gruñón e incluso director
general. He trabajado con programadores brillantes y he trabajado con
babosos.2 He trabajado en sistemas de software/hardware embebidos de
alta tecnología y he trabajado en sistemas corporativos de nóminas. He
programado en COBOL, FORTRAN, BAL, PDP-8, PDP-11, C, C++,
Java, Ruby, Smalltalk y una plétora de otros lenguajes y sistemas. He
trabajado con ladrones de sueldo poco fiables, y he trabajado con
profesionales consumados. Es esta última clasificación la que constituye
el tema de este libro.
En las páginas de este libro intentaré definir lo que significa ser un
programador profesional. Describiré las actitudes, disciplinas y
acciones que considero esencialmente profesionales.
¿Cómo sé cuáles son estas actitudes, disciplinas y acciones? Porque tuve
que aprenderlas por las malas. Verás, cuando conseguí mi primer trabajo
como
programador, profesional era la última palabra que habría utilizado
paradescribirme.
El año era 1969. Yo tenía 17 años. Mi padre había presionado a una empresa
local llamada ASC para que me contratara como programador temporal a
tiempo parcial. (Sí, mi padre podía hacer cosas así. Una vez le visalir delante
de un coche que iba a toda velocidad con la mano extendida ordenando que
se detuviera. El coche se detuvo. Nadie dijo "no" a mi padre). La empresa
me puso a trabajar en la sala donde se guardaban todos los manuales de los
ordenadores de IBM. Me hicieron poner años y años deactualizaciones en
los manuales. Fue aquí donde vi por primera vez la frase: "Esta página se ha
dejado intencionadamente en blanco".
Tras un par de días actualizando manuales, mi supervisor me pidió que
escribiera un sencillo programa Easycoder3. Me encantó que me lo
pidieran. Nunca había escrito un programa para un ordenador real. Sin
embargo, había inhalado los libros de Autocoder y tenía una vaga idea
de cómo empezar.
El programa consistía simplemente en leer los registros de una cinta y
reemplazar los ID de esos registros con nuevos ID. Los nuevos IDs
comenzaban en 1 y se incrementaban en 1 por cada nuevo registro. Los
registros con los nuevos IDs debían escribirse en una nueva cinta.
Mi supervisor me mostró una estantería en la que había muchos montones
de barajas rojas y azules. Imagínate que comprases 50 barajas de cartas, 25
rojas y 25 azules. Luego apilas esas barajas una encima de otra. Ese esel
aspecto de estas pilas de cartas. Tenían rayas rojas y azules, y las rayas
tenían unas 200 cartas cada una. Cada una de esas rayas contenía el código
fuente de la biblioteca de subrutinas que los programadores solían utilizar.
Los programadores simplemente tomaban el mazo superior de la pila,
asegurándose de no tomar nada más que tarjetas rojas o azules, y luego lo
ponían al final de su mazo de programas.
Escribí mi programa en unos formularios de codificación. Los formularios
de codificación eran grandes hojas rectangulares de papel divididas en 25
líneas y 80 columnas. Cada línea representaba una tarjeta. Escribías tu
programa en el formulario de codificación utilizando letras mayúsculas y
un lápiz del nº 2. En las últimas 6 columnas de cada línea se escribía un
número de secuencia con ese lápiz del número 2. Normalmente,
incrementabas el número de secuencia en 10 para poder insertar tarjetas
más tarde.
El formulario de codificación iba a parar a los perforadores de
llaves.Esta empresa tenía varias docenas de mujeres que tomaban los
formularios de codificación de una gran cesta de entrada y luego
"tecleaban" en las máquinas de perforación de teclas. Estas
máquinas eran muy parecidas a las máquinas de escribir, salvo que los
caracteresse perforaban en tarjetas en lugar de imprimirse en papel.
Al día siguiente, los teclistas me devolvieron mi programa por correo
interno. Mi pequeño mazo de tarjetas perforadas estaba envuelto por mis
formularios de codificación y una banda elástica. Revisé las tarjetas en
busca de errores de perforación. No había ninguno. Entonces puse el mazo
de la biblioteca de subrutinas al final de mi mazo de programas, y luego
llevé el mazo arriba a los operadores de la computadora.
Los ordenadores estaban detrás de puertas cerradas con llave en una sala
con control ambiental y suelo elevado (para todos los cables). Llamé a la
puerta y un operador me quitó austeramente mi cubierta y la puso en otra
cesta dentro de la sala de ordenadores. Cuando se pusieran a ello, harían
funcionar mi cubierta.
Al día siguiente me devolvieron la baraja. Estaba envuelta en un listado
con los resultados de la carrera y se mantenía unida con una goma
elástica. (¡En aquella época usábamos muchas gomas!)
Abrí el listado y vi que la compilación había fallado. Los mensajes de error
del listado me resultaban muy difíciles de entender, así que se lo llevé a mi
supervisor. Lo miró, murmuró en voz baja, hizo algunas anotaciones rápidas
en el listado, cogió mi cubierta y me dijo que le siguiera.
Me llevó a la sala de fichajes y se sentó en una máquina de fichar vacía. Una
por una, corrigió las tarjetas que estaban equivocadas y añadió una o dos
tarjetas más. Me explicó rápidamente lo que estaba haciendo, pero todopasó
como un rayo.
Llevó la nueva cubierta hasta la sala de ordenadores y llamó a la puerta.
Dijo unas palabras mágicas a uno de los operadores y entró en la sala de
ordenadores tras él. Me hizo una señal para que le siguiera. El operador
preparó las unidades de cinta y cargó la pletina mientras nosotros
observábamos. Las cintas giraron, la impresora parloteó y todo terminó. El
programa había funcionado.
Al día siguiente, mi supervisor me dio las gracias por mi ayuda y me
despidió. Al parecer, ASC no consideraba que tuviera tiempo para cuidar a
un joven de 17 años.
Pero mi relación con ASC apenas había terminado. Unos meses más tarde,
conseguí un trabajo a tiempo completo en el segundo turno de ASC
operando impresoras fuera de línea. Estas impresoras imprimían
correobasura a partir de imágenes impresas que se almacenaban en
cinta. Mi trabajo consistía en
cargar las impresoras con papel, cargar las cintas en las unidades de
cinta,arreglar los atascos de papel y, por lo demás, simplemente ver cómo
funcionan las máquinas.
Era el año 1970. La universidad no era una opción para mí, ni me atraía
especialmente. La guerra de Vietnam seguía haciendo estragos y los
campus eran un caos. Había seguido inhalando libros sobre COBOL,
Fortran, PL/1, PDP-8 e IBM 360 Assembler. Mi intención era eludir la
escuela y conducir tan duro como pudiera para conseguir un trabajo de
programación.
Doce meses después conseguí ese objetivo. Me ascendieron a programador a
tiempo completo en ASC. Yo, y dos de mis buenos amigos, Richard y Tim,
también de 19 años, trabajamos con un equipo de otros tres programadores
escribiendo un sistema de contabilidad en tiempo real para un sindicato de
camioneros. La máquina era un Varian 620i. Era un sencillominiordenador
de arquitectura similar a un PDP-8, salvo que tenía una palabra de 16 bits y
dos registros. El lenguaje era ensamblador.
Escribimos cada línea de código en ese sistema. Y me refiero a cada línea.
Escribimos el sistema operativo, los cabezales de interrupción, los
controladores de E/S, el sistema de archivos para los discos, el
intercambiador de superposición e incluso el enlazador reubicable. Por no
hablar de todo el código de la aplicación. Escribimos todo esto en 8 meses
trabajando 70 y 80 horas a la semana para cumplir un plazo infernal. Mi
salario era
7.200 dólares al año.
Entregamos ese sistema. Y luego lo dejamos.
Renunciamos repentinamente, y con malicia. Verás, después de todo ese
trabajo, y de haber entregado un sistema exitoso, la empresa nos dio un
aumento del 2%. Nos sentimos engañados y maltratados. Varios de
nosotros conseguimos trabajo en otro sitio y simplemente dimitimos.
Yo, sin embargo, adopté un enfoque diferente y muy desafortunado. Un
compañero y yo irrumpimos en el despacho del jefe y renunciamos juntos
en voz alta. Esto fue emocionalmente muy satisfactorio, por un día.
Al día siguiente me di cuenta de que no tenía trabajo. Tenía 19 años, estaba
en el paro y no tenía ningún título. Me entrevisté para algunos puestos de
programación, pero esas entrevistas no fueron bien. Así que trabajé en el
taller de reparación de cortacéspedes de mi cuñado durante cuatro meses.
Por desgracia, era un pésimo reparador de cortacéspedes. Al final tuvo
quedespedirme. Caí en una mala racha.
Me quedaba despierto hasta las 3 de la mañana todas las noches comiendo
pizza y viendo viejas películas de monstruos en el viejo televisor en blancoy
negro con orejas de conejo de mis padres. Sólo algunos de los fantasmas
eran personajes en las películas. Me quedaba en la cama hasta la 1 PM
porque
no quería enfrentarme a mis días tristes. Hice un curso de cálculo en
uncolegio comunitario local y lo suspendí. Estaba destrozado.
Mi madre me llevó aparte y me dijo que mi vida era un desastre, y que
había sido una idiota por renunciar sin tener un nuevo trabajo, y por
renunciar tan emocionalmente, y por renunciar junto con mi amigo. Me
dijo que nunca se renuncia sin tener un nuevo trabajo, y que siempre se
renuncia con calma, con frialdad y solo. Me dijo que debería llamar a mi
antiguo jefe y rogarle que me devolviera mi antiguo trabajo. Me dijo:
"Tienes que comer un poco de tarta de humildad".
Los chicos de diecinueve años no son conocidos por su apetito por el pastel
de la humildad, y yo no era una excepción. Pero las circunstancias habían
hecho mella en mi orgullo. Al final llamé a mi jefe y le di un buen bocado a
ese pastel de humildad. Y funcionó. Se alegró de volver a contratarme por
6.800 dólares al año, y yo lo acepté con gusto.
Pasé otros dieciocho meses trabajando allí, vigilando mis P y Q e
intentando ser un empleado tan valioso como pudiera. Me recompensaron
con ascensos y aumentos de sueldo, y con una paga regular. La vida era
buena. Cuando dejé la empresa, lo hice en buenos términos y con una
oferta de un trabajo mejor en el bolsillo.
Se podría pensar que he aprendido la lección, que ahora soy una profesional.
Nada más lejos de la realidad. Esa fue sólo la primera de las muchas
lecciones que tuve que aprender. En los años siguientes me despedirían de
un trabajo por no respetar las fechas críticas, y casi me despiden de otro por
filtrar inadvertidamente información confidencial a uncliente. Me puse al
frente de un proyecto condenado al fracaso y lo llevé a la ruina sin pedir la
ayuda que sabía que necesitaba. Defendí agresivamentemis decisiones
técnicas aunque fueran contrarias a las necesidades de los clientes.
Contrataría a una persona totalmente no cualificada, cargando a mi
empleador con un enorme lastre con el que lidiar. Y lo peor de todo es que
hice que despidieran a otras dos personas por mi incapacidad para liderar.
Así que piense en este libro como un catálogo de mis propios errores, un
borrador de mis propios crímenes, y un conjunto de pautas para que usted
evite caminar en mis primeros zapatos.
1. Profesionalidad
"Oh, ríete, Curtin, viejo amigo. Es una gran broma que nos ha gastado
el Señor, o el destino, o la naturaleza, lo que prefieras. Pero quien o lo
que sea que nos la jugó, ciertamente tenía sentido del humor. ¡Ja!"
-Howard, El tesoro de la Sierra Madre
¿Así que quieres ser un desarrollador de software profesional? Quieres
llevar la cabeza alta y declarar al mundo: "¡Soy un profesional! "Quieres
que la gente te mire con respeto y te trate con deferencia. Quieres que las
madres te señalen y digan a sus hijos que sean como tú. Lo quieres todo.
¿No es así?
Cuidado con lo que pides
La profesionalidad es un término cargado. Ciertamente es una insignia de
honor y orgullo, pero también es un marcador de responsabilidad y
rendición de cuentas. Ambos van de la mano, por supuesto. No se puede
estar orgulloso y honrado de algo de lo que no se puede responder.
Es mucho más fácil ser un no profesional. Los no profesionales no tienen
que responsabilizarse del trabajo que hacen: lo dejan en manos de sus
empleadores. Si un no profesional comete un error, el empleador limpia el
desastre. Pero cuando un profesional comete un error, limpia el desastre.
¿Qué pasaría si permitieras que un error se colara en un módulo y le
costara a tu empresa 10.000 dólares? El no profesional se encogería de
hombros, diría "cosas que pasan" y empezaría a escribir el siguiente
módulo. El profesional haría un cheque a la empresa por 10.000 dólares.
1
Sí, se siente un poco diferente cuando es tu propio dinero, ¿no? Pero esa
sensación es la que tiene un profesional todo el tiempo. De hecho, ese
sentimiento es la esencia de la profesionalidad. Porque, como ves, la
profesionalidad consiste en asumir responsabilidades.
Asumir la responsabilidad
Ha leído la introducción, ¿verdad? Si no es así, vuelve a hacerlo ahora;
establece el contexto de todo lo que sigue en este libro.
Aprendí a asumir responsabilidades sufriendo las consecuencias de no
asumirlas.
En 1979 trabajaba para una empresa llamada Teradyne. Era el "ingeniero
responsable" del software que controlaba un sistema basado en mini y
microordenadores que medía la calidad de las líneas telefónicas. El
miniordenador central estaba conectado a través de líneas telefónicas
dedicadas o de marcación de 300 baudios a docenas de microordenadores
satélite que controlaban el hardware de medición. Todo el código estaba
escrito en ensamblador.
Nuestros clientes eran los directores de servicio de las principales compañías
telefónicas. Cada uno era responsable de 100.000 líneas telefónicas o más.
Mi sistema ayudaba a estos gestores de áreas de servicio a encontrar y
reparar averías y problemas en las líneas telefónicas antes de que sus clientes
se dieran cuenta. Esto reducía los índices de quejas de los clientes que las
comisiones de servicios públicos medían y utilizaban para regular las tarifas
que las compañías telefónicas podían cobrar. En resumen,estos sistemas eran
increíblemente importantes.
Todas las noches, estos sistemas se someten a una "rutina nocturna" en la
que el miniordenador central indica a cada uno de los microordenadores
satélite que compruebe todas las líneas telefónicas bajo su control. Cada
mañana, el ordenador central sacaba la lista de líneas defectuosas, junto con
sus características de fallo. Los responsables de las áreas de servicio
utilizaban este informe para programar a los reparadores para que arreglaran
los fallos antes de que los clientes pudieran quejarse.
En una ocasión envié una nueva versión a varias docenas de clientes.
"Enviar" es exactamente la palabra correcta. Escribí el software en cintas y
las envié
cintas a los clientes. Los clientes cargaban las cintas y luego
reiniciabanlos sistemas.
La nueva versión corregía algunos defectos menores y añadía una nueva
función que nuestros clientes habían demandado. Les habíamos dicho que
proporcionaríamos esa nueva función en una fecha determinada. A duras
penas conseguí enviar las cintas de un día para otro para que llegaran en la
fecha prometida.
Dos días después recibí una llamada de nuestro jefe de servicio de campo,
Tom. Me dijo que varios clientes se habían quejado de que la "rutina
nocturna" no se había completado y que no habían recibido ningún informe.
Se me encogió el corazón porque, para poder enviar el software a tiempo, me
había olvidado de probar la rutina. Había probado gran parte de las demás
funciones del sistema, pero probar la rutina me llevaba horas, y teníaque
enviar el software. Ninguna de las correcciones de errores estaba en el
código de la rutina, así que me sentía seguro.
Perder un informe nocturno era un gran problema. Significaba que los
reparadores tenían menos que hacer y que estarían sobrecargados más tarde.
Significaba que algunos clientes podrían notar una avería y quejarse.Perder
los datos de una noche es suficiente para que un jefe de área de servicio
llame a Tom y le eche la bronca.
Encendí nuestro sistema de laboratorio, cargué el nuevo software y
comencé una rutina. Tardó varias horas, pero luego abortó. La rutina falló.
Si hubiera ejecutado esta prueba antes de enviarla, las áreas de servicio no
habrían perdido datos y los gerentes de las áreas de servicio no estarían
asando a Tom ahora mismo.
Llamé a Tom para decirle que podía duplicar el problema. Me dijo que la
mayoría de los otros clientes le habían llamado con la misma queja.
Entonces me preguntó cuándo podría solucionarlo. Le dije que no lo sabía,
pero que estaba trabajando en ello. Mientras tanto, le dije que los clientes
deberían volver al antiguo software. Se enfadó conmigo diciendo que eso
era un doble golpe para los clientes, ya que habían perdido toda una noche
de datos y no podían utilizar la nueva función que se les había prometido.
El fallo fue difícil de encontrar y las pruebas duraron varias horas. La
primera solución no funcionó. Tampoco la segunda. Me llevó varios
intentos, y por tanto varios días, averiguar qué había fallado. Durante todo
ese tiempo, Tom me llamaba cada pocas horas para preguntarme cuándo lo
iba a arreglar. También se aseguró de que yo supiera las broncas que estaba
recibiendo de los responsables del área de servicio, y lo embarazoso que
erapara él decirles que volvieran a poner las cintas antiguas.
Al final, encontré el defecto, envié las nuevas cintas y todo volvió a
la normalidad. Tom, que no era mi jefe, se calmó y dejamos atrás todo el
episodio. Mi jefe se acercó a mí cuando todo terminó y me dijo: "Seguro
que no vuelves a hacerlo". Estuve de acuerdo.
Al reflexionar me di cuenta de que enviar sin probar la rutina había sido una
irresponsabilidad. La razón por la que descuidé la prueba fue para poder
decir que había enviado a tiempo. Se trataba de salvar la cara. No me había
preocupado por el cliente, ni por mi empleador. Sólo me preocupaba mi
propia reputación. Debería haber asumido la responsabilidad desde el
principio y haberle dicho a Tom que las pruebas no estaban completas y que
no estaba preparado para enviar el software a tiempo. Eso habría sido duro, y
Tom se habría enfadado. Pero ningún cliente habría perdido datos, yningún
jefe de servicio habría llamado.
Primero, no hacer daño
Entonces, ¿cómo asumimos la responsabilidad? Hay algunos principios.
Recurrir al juramento hipocrático puede parecer arrogante, pero ¿qué
mejor fuente hay? Y, de hecho, ¿no tiene sentido que la primera
responsabilidad, y el primer objetivo, de un aspirante a profesional sea
utilizar sus poderes para el bien?
¿Qué daño puede hacer un desarrollador de software? Desde un punto de
vista puramente de software, puede dañar tanto la función como la
estructura del software. Exploraremos cómo evitar hacer precisamente
eso.
No hacer daño a la función
Está claro que queremos que nuestro software funcione. De hecho, la
mayoría de nosotros somos programadores porque conseguimos que algo
funcionara una vez y queremos volver a tener esa sensación. Pero no somos
los únicos que queremos que el software funcione. Nuestros clientes y
empleadores también quieren que funcione. De hecho, nos pagan para que
creemos un software que funcione tal y como ellos quieren.
Dañamos el funcionamiento de nuestro software cuando creamos errores.
Por lo tanto, para ser profesionales, no debemos crear errores.
"¡Pero espera!" Te oigo decir. "Eso no es razonable. El software es
demasiado complejo para crearlo sin errores".
Por supuesto, tienes razón. El software es demasiado complejo para
crearlo sin errores. Desgraciadamente, eso no te libra de los errores.
Elcuerpo humano es demasiado
complejo de entender en su totalidad, pero los médicos siguen haciendo
unjuramento de no hacer daño. Si ellos no se libran de un compromiso así,
¿cómo podemos hacerlo nosotros?
"¿Nos está diciendo que debemos ser perfectos?" ¿Oigo que objetáis?
No, te digo que debes ser responsable de tus imperfecciones. El hecho de
que seguramente se produzcan errores en tu código no significa que no
seas responsable de ellos. El hecho de que la tarea de escribir un software
perfecto sea prácticamente imposible no significa que no seas responsable
de la imperfección.
A un profesional le corresponde rendir cuentas de sus errores, aunque éstos
sean prácticamente seguros. Así que, mi aspirante a profesional, lo primero
que debes practicar es pedir disculpas. Las disculpas son necesarias, pero
insuficientes. No puedes seguir cometiendo los mismos errores una y otra
vez. A medida que vayas madurando en tu profesión, tu índice de errores
debería disminuir rápidamente hacia la asíntota de cero. No llegará nunca a
cero, pero es tu responsabilidad acercarte lo más posible a ella.
El control de calidad no debe encontrar nada
que elegir.
Una kata suele presentarse en forma de un problema de programación
sencillo que hay que resolver, como escribir la función que calcula los
factores primos de un número entero. El objetivo de la kata no es
averiguar cómo resolver el problema; eso ya lo sabes. El objetivo de la
kata es entrenar tus dedos y tu cerebro.
Hago una o dos katas cada día, a menudo como parte de la adaptación al
trabajo. Puedo hacerla en Java, en Ruby, en Clojure o en algún otro
lenguaje en el que quiera mantener mis habilidades. Utilizaré la kata para
perfeccionar una habilidad concreta, como acostumbrar mis dedos a pulsar
las teclas de acceso directo, o utilizar ciertas refactorizaciones.
Piensa en la kata como un ejercicio de calentamiento de 10 minutos por la
mañana y un enfriamiento de 10 minutos por la tarde.
Colaboración
La segunda mejor manera de aprender es colaborar con otras personas.
Losdesarrolladores de software profesionales hacen un esfuerzo especial
para programar juntos, practicar juntos, diseñar y planificar juntos. Así
aprenden mucho los unos de los otros y consiguen hacer más cosas más
rápido y con menos errores.
Esto no significa que tengas que pasar el 100% de tu tiempo trabajando con
otros. El tiempo a solas también es muy importante. Por mucho que me
guste programar en pareja con otros, me vuelve loca si no puedo escaparme
sola de vez en cuando.
Mentoring
La mejor manera de aprender es enseñar. Nada te meterá los hechos y los
valores en la cabeza más rápido y con más fuerza que tener que
comunicárselos a las personas de las que eres responsable. Así que el
beneficio de la enseñanza está fuertemente a favor del profesor.
Del mismo modo, no hay mejor manera de incorporar a nuevas
personas a una organización que sentarse con ellas y enseñarles los
entresijos.
Los profesionales se responsabilizan personalmente de la tutela de los
jóvenes. No dejarán que un joven se pasee sin supervisión.
Conozca su dominio
Es responsabilidad de todo profesional del software entender el dominio de
las soluciones que está programando. Si está escribiendo un sistema de
contabilidad, debe conocer el campo de la contabilidad. Si estás escribiendo
una aplicación de viajes, debes conocer el sector de los viajes. No es
necesario ser un experto en la materia, pero hay una cantidad razonable de
diligencia debida que debe realizar.
Al iniciar un proyecto en un nuevo dominio, lee uno o dos libros sobre el
tema. Entreviste a sus clientes y usuarios sobre los fundamentos y las
bases del dominio. Pasa algún tiempo con los expertos e intenta
comprender sus principios y valores.
Es el peor tipo de comportamiento poco profesional codificar
simplemente a partir de una especificación sin entender por qué esa
especificación tiene sentido para el negocio. Más bien, debes saber lo
suficiente sobre el dominio para poder reconocer y desafiar los errores de
las especificaciones.
Identifíquese con su empleador/cliente
Los problemas de tu empresa son tus problemas. Hay que entender
cuáles son esos problemas y trabajar para encontrar las mejores soluciones.
A la hora de desarrollar un sistema, debe ponerse en el lugar de su
empleador yasegurarse de que las funciones que está desarrollando van a
satisfacer realmente las necesidades de su empleador.
Es fácil que los desarrolladores se identifiquen con los demás. Es fácil caer
en una actitud de nosotros contra ellos con su empleador. Los
profesionales lo evitan a toda costa.
Humildad
La programación es un acto de creación. Cuando escribimos código
estamos creando algo de la nada. Estamos imponiendo audazmente el
orden sobre el caos. Estamos ordenando con confianza, con detalles
precisos, los comportamientos de una máquina que, de otro modo, podría
causar un daño incalculable. Por eso, programar es un acto de suprema
arrogancia.
Los profesionales saben que son arrogantes y no son falsamente
humildes. Un profesional conoce su trabajo y se enorgullece de él. Un
profesional confía en sus capacidades y asume riesgos audaces y
calculados basados en esa confianza. Un profesional no es tímido.
Sin embargo, un profesional también sabe que habrá momentos en los
que fallará, sus cálculos de riesgo serán erróneos, sus habilidades se
quedarán cortas; se mirará al espejo y verá a un tonto arrogante que le
sonríe.
Por eso, cuando un profesional se encuentre en el punto de mira de una
broma, será el primero en reírse. Nunca ridiculizará a los demás, sino que
aceptará el ridículo cuando sea merecido y se reirá cuando no lo sea. No
rebajará a otro por cometer un error, porque sabe que él puede ser el
siguiente en fracasar.
Un profesional comprende su suprema arrogancia, y que el destino acabará
por darse cuenta y nivelar su puntería. Cuando esa puntería se conecta, lo
mejor que puedes hacer es seguir el consejo de Howard: Ríete.
Bibliografía
[PPP2001]: Robert C. Martin, Principles, Patterns, and Practices of Agile
Software Development, Upper Saddle River, NJ: Prentice Hall, 2002.
2. Decir no
"Pero no pasa nada", dice el ejecutivo nº 1 de Gorilla Mart. "La aplicación es sencilla. Solo
tiene que mostrar a los usuarios algunos productos de nuestro catálogo y permitirles buscar
las ubicaciones de las tiendas. Ya lo hacemos en nuestra web. También te daremoslos
gráficos. Probablemente puedas... ¿cuál es la palabra? sí, ¡codificarla!"
El ejecutivo de Gorilla Mart nº 2 interviene. "Y solo necesitamos un par de cupones que el
usuario pueda mostrar en la caja registradora. La aplicación será de usar y tirar. Vamos a
sacarla adelante, y luego para la fase II haremos algo más grande y mejor desde cero".
Y entonces ocurre. A pesar de los años de constantes recordatorios de que cada función que pide
un cliente siempre será más compleja de escribir que de explicar, vas a por ello. Realmente crees
que esta vez se puede hacer en dos semanas. Sí. ¡Podemos hacerlo! ¡Esta vez es diferente! Son
sólo unos pocos gráficos y una llamada de servicio para obtener la ubicación de una tienda.
¡XML! No hay problema. Podemos hacerlo.
¡Estoy emocionado! ¡Vamos!
Sólo hace falta un día para que tú y la realidad os conozcáis de nuevo.
Yo: Entonces, ¿puede darme la información que necesito para llamar a su servicio
web de localización de tiendas? El cliente: ¿Qué es un servicio web?
Yo: ............
Y así es exactamente como ocurrió. Su servicio de localización de tiendas, que se encuentra
justo donde se supone que está en la esquina superior derecha de su sitio web, no es un servicio
web. Está generado por código Java. Ix-nay con la API-ay. Y para colmo, está alojado por un
socio estratégico de Gorilla Mart.
Entra la nefasta "tercera parte".
En términos de clientes, una "tercera parte" es algo parecido a Angelina Jolie. A pesar de la
promesa de que podrás tener una conversación esclarecedora durante una buena comida y, con
suerte, ligar
............................................................................................................................................... despué
s -lo siento, es
no va a suceder. Vas a tener que fantasear con ello mientras te ocupas de tus asuntos.
En mi caso, lo único que pude sacar de Gorilla Mart fue una instantánea de sus listados de tiendas
actuales en un archivo de Excel. Tuve que escribir el código de búsqueda de tiendas
desde cero.
El doble golpe llegó ese mismo día: Querían los datos de los productos y los cupones en línea para
poder cambiarlos semanalmente. Así que, ¡a por la codificación! Dos semanas para escribir una
aplicación para el iPhone ahora
................................. se convierten en dos semanas para escribir una aplicación para el iPhone,
un backend PHP, eintegrarlos juntos. ¿Qué? ¿También quieren que me encargue del
control de calidad?
Para compensar el trabajo extra, la codificación tendrá que ir un poco más rápido. Olvida esa
fábrica abstracta. Usa un gran bucle for en lugar del compuesto, ¡no hay tiempo!
Un buen código se ha vuelto imposible.
Dos semanas para la finalización
Déjenme decirles que esas dos semanas fueron bastante miserables. En primer lugar, dos de los
días se eliminaron debido a las reuniones de todo el día para mi próximo proyecto. (Eso amplía lo
corto que iba a ser el plazo). Al final, realmente tenía ocho días para hacer las cosas. La primera
semana trabajé 74 horas y la siguiente... Dios. .. Ni siquiera lo recuerdo, se ha borrado de mis
sinapsis.
Probablemente sea algo bueno.
Me pasé esos ocho días escribiendo código con furia. Utilicé todas las herramientas disponibles
para hacerlo: copiar y pegar (también conocido como código reutilizable), números mágicos (para
evitar la duplicación de definir constantes y luego, ¡joder!, volver a escribirlas), y ¡absolutamente
NINGÚN test unitario! (¿Quién necesita barras rojas en un momento como éste?, ¡sólo me
desmotivaría!)
Era un código bastante malo y nunca tuve tiempo de refactorizarlo. Sin embargo, teniendo en
cuenta el tiempo, en realidad era bastante estelar, y al fin y al cabo era un código "de usar y
tirar", ¿no? ¿Te suena algo de esto? Pues espera, la cosa se pone mejor.
Cuando estaba dando los últimos toques a la aplicación (los últimos toques eran escribir todo el
código del servidor), empecé a mirar el código base y me pregunté si tal vez merecía la pena.
Después de todo, la aplicación estaba terminada. He sobrevivido.
"Oye, acabamos de contratar a Bob, y está muy ocupado y no ha podido hacer la llamada,
pero dice que deberíamos exigir a los usuarios que proporcionen su dirección de correo
electrónico para conseguir los cupones. No ha visto la aplicación, pero cree que sería una
gran idea. También queremos un sistema de informes para obtener esos correos electrónicos
del servidor. Uno que sea bonito y no demasiado caro. (Espera, esa última parte era de Monty
Python.) Hablando de cupones, tienen que poder caducar después de un número de días que
especifiquemos. Ah, y................. "
Demos un paso atrás. ¿Qué sabemos sobre lo que es un buen código? Un buen código debe ser
extensible. Mantenible. Debe prestarse a ser modificado. Debe leerse como prosa. Bueno, esto no
era un buen código.
Otra cosa. Si quieres ser un mejor desarrollador, debes tener siempre presente esto,
inevitablemente: El cliente siempre ampliará el plazo. Siempre querrán más funciones.
Siempre querrán cambios-tarde. Y esta es la fórmula de lo que se puede esperar:
(Número de ejecutivos)2
+ 2 * # de nuevos ejecutivos
+ # de Bob's Kids
= DÍAS AÑADIDOS EN EL ÚLTIMO MOMENTO
Ahora, los ejecutivos son gente decente. Yo creo que sí. Mantienen a su familia (suponiendo que
Satanás haya aprobado que tengan una). Quieren que la aplicación tenga éxito (¡tiempo de
promoción!). El problema es que todos quieren reclamar directamente el éxito del proyecto.
Cuando todo está dicho y hecho, todos quieren señalar alguna característica o decisión de diseño
que puedan llamar suya.
Así que, volviendo a la historia, añadimos un par de días más al proyecto y
conseguimosterminar la función de correo electrónico. Y entonces me derrumbé de
agotamiento.
Los clientes nunca se preocupan tanto como tú
Los clientes, a pesar de sus protestas, a pesar de su aparente urgencia, nunca se preocupan tanto
como tú de que la aplicación esté a tiempo. La tarde en que di por terminada la aplicación, envié
un correo electrónico con la compilación final a todos los interesados, ejecutivos (¡silencio!),
gerentes, etc. "¡YA ESTÁ HECHO! ¡OS TRAIGO LA V1.0! ALABADO SEA TU NOMBRE".
Le di a "Enviar", me recosté en mi silla y, con una sonrisa de satisfacción, empecé a fantasear con
que la empresa me subiría a hombros y encabezaría una procesión por la calle 42 mientras me
coronaban como "El mejor desarrollador de la historia". Como mínimo, mi cara aparecería en toda
su publicidad, ¿no?
Es curioso, no parecían estar de acuerdo. De hecho, no estaba seguro de lo que pensaban. No
escuché nada. Ni una palabra. Resulta que la gente de Gorilla Mart estaba ansiosa y ya había
pasado a lo siguiente.
¿Crees que miento? Comprueba esto. Fui a la tienda de Apple sin rellenar una descripción de la
aplicación. Había solicitado una a Gorilla Mart, y no me habían contestado y no había tiempo
para esperar. (Véase el párrafo anterior.) Les escribí de nuevo. Y otra vez. Puse a algunos de
nuestros directivos a trabajar en ello. Dos veces me contestaron y dos veces me dijeron: "¿Qué
necesitas otra vez?". ¡NECESITO LA DESCRIPCIÓN DE LA APLICACIÓN!
Una semana después, Apple empezó a probar la aplicación. Este suele ser un momento de alegría,
pero en cambio fue un momento de temor mortal. Como era de esperar, ese mismo día la aplicación
fue rechazada. Fue la excusa más triste y pobre para permitir un rechazo que pueda imaginar: "A la
aplicación le falta una descripción". Funcionalmente perfecto; no hay descripciónde la aplicación.
Y por esta razón Gorilla Mart no tenía su app lista para el Black Friday. Estaba bastante molesto.
Había sacrificado a mi familia por un súper sprint de dos semanas, y nadie en Gorilla Mart podía
molestarse en crear una descripción de la aplicación con una semana de tiempo. Nos la dieron una
hora después del rechazo; al parecer, esa era la señal para ponerse manos a la obra.
Si antes estaba molesto, a la semana y media me ponía lívido. Verás, todavía no nos habían dado
datos reales. Los productos y cupones del servidor eran falsos. Imaginarios. El código delcupón
era 1234567890. Ya sabes, falso. (Bolonia se escribe baloney cuando se usa en ese contexto,
BTW.)
Y fue esa fatídica mañana cuando revisé el Portal y ¡LA APP ESTABA DISPONIBLE! ¡Con
datos falsos y todo! Grité horrorizado y llamé a quien pude y grité: "¡Necesito los datos!" y la
mujer al otro lado me preguntó si necesitaba a los bomberos o a la policía, así que colgué al
911. Pero luego llamé a Gorilla Mart y dije: "¡Necesito datos!". Y nunca olvidaré la respuesta:
Oh, hola John. Tenemos un nuevo vicepresidente y hemos decidido no lanzarlo. Sácalo
de la App Store, ¿quieres?
Al final, resultó que al menos 11 personas registraron sus direcciones de correo electrónico en la
base de datos, lo que significaba que había 11 personas que potencialmente podrían entrar en un
Gorilla Mart con un cupón de iPhone falso a cuestas. Vaya, eso podría ponerse feo.
Cuando todo estaba dicho y hecho, el cliente había dicho una cosa correctamente todo el tiempo: El
código era un desecho. El único problema es que, en primer lugar, nunca fue liberado.
¿Resultado? Prisa por terminar, lentitud en la comercialización
La lección de la historia es que los interesados, ya sea un cliente externo o la dirección interna,
han descubierto cómo conseguir que los desarrolladores escriban código rápidamente.
¿Efectivamente? No. ¿Rápido? Sí. Así es como funciona:
semana, justo cuando habías trabajado un turno de 20 horas para que todo estuviera bien.
Es como el burro y la zanahoria, salvo que no te tratan tan bien como al burro.
Es un libro de jugadas brillante. ¿Puedes culparlos por pensar que funciona? Pero no ven el código
de Dios. Y así sucede, una y otra vez, a pesar de los resultados.
En una economía globalizada, en la que las corporaciones se rigen por el todopoderoso dólar y el
aumento del precio de las acciones implica despidos, personal sobrecargado de trabajo y
deslocalización, esta estrategia que te he mostrado de recortar los costes de los desarrolladores
está haciendo que el buen código sea obsoleto. Como desarrolladores, nos van a
pedir/decir/convencer para que escribamos el doble de código en la mitad de tiempo si no
tenemos cuidado.
Código imposible
En la historia, cuando John pregunta "¿Es imposible un buen código?", en
realidad está preguntando "¿Es imposible la profesionalidad?". Después de
todo, no fue sólo el código el que sufrió en su historia de disfunción. Fue su
familia, su empleador, su cliente y los usuarios. Todos perdieron 3en esta
aventura. Y perdieron debido a la falta de profesionalidad.
Entonces, ¿quién actuó de forma poco profesional? John deja claro que cree
que fueron los ejecutivos de Gorilla Mart. Después de todo, su libro de
jugadas era una acusación bastante clara de su mal comportamiento. ¿Pero
fue su comportamiento malo? No lo creo.
La gente de Gorilla Mart quería la opción de tener una aplicación para el
iPhone en el Black Friday. Estaban dispuestos a pagar para tener esa
opción. Encontraron a alguien dispuesto a proporcionar esa opción.
Entonces, ¿cómo puedes culparlos?
Sí, es cierto, hubo algunos fallos de comunicación. Al parecer, los
ejecutivos no sabían lo que era realmente un servicio web, y se produjeron
todos los problemas normales de que una parte de una gran empresa no
sepa lo que hace otra. Pero todo eso era de esperar. John incluso lo admite
cuando dice: "A pesar de años de constantes recordatorios de que
cadafunción
que pide un cliente siempre será más complejo de escribir que de explicar.
.
."
Así que si el culpable no fue Gorilla Mart, ¿entonces quién?
Tal vez fuera el empleador directo de John. John no lo dijo explícitamente,
pero hubo un indicio cuando dijo, entre paréntesis, "En losnegocios, la
importancia del cliente importa". Entonces, ¿el empleador de John hizo
promesas irrazonables a Gorilla Mart? ¿Presionaron a John, directa o
indirectamente, para que esas promesas se hicieran realidad?
John no lo dice, así que sólo podemos preguntarnos.
Aun así, ¿dónde está la responsabilidad de John en todo esto? Yo pongo la
culpa directamente en John. John es quien aceptó el plazo inicial de dos
semanas, sabiendo perfectamente que los proyectos suelen ser más
complejos de lo que parecen. John es quien aceptó la necesidad de escribir
el servidor PHP. John es el que aceptó el registro del correo electrónico, y
la caducidad del cupón. John es el que trabajó días de 20 horas y semanas
de 90 horas. John es el que se sustrajo de su familia y de su vida para
cumplir con este plazo.
¿Y por qué hizo esto Juan? Nos lo cuenta con toda claridad: "Le di a
"Enviar", me recosté en mi silla y, con una sonrisa de satisfacción, empecé a
fantasear con que la compañía me subiría a hombros y encabezaría una
procesión por la calle 42 mientras me coronaban como "El mejor promotor
de la historia". En resumen, John intentaba ser un héroe. Vio su oportunidad
de ser aclamado, y fue a por ello. Se inclinó y agarró el anillo de bronce.
Los profesionales suelen ser héroes, pero no porque lo intenten. Los
profesionales se convierten en héroes cuando consiguen hacer un trabajo
bien hecho, a tiempo y dentro del presupuesto. Al intentar convertirse en el
hombre del momento, en el salvador del día, John no estaba actuando como
un profesional.
John debería haber dicho que no al plazo original de dos semanas. O si no,
debería haber dicho que no cuando descubrió que no había servicio web.
Debería haber dicho que no a la solicitud de registro por correo electrónicoy
a la caducidad de los cupones. Debería haber dicho que no a cualquier cosa
que requiriera horribles horas extras y sacrificios.
Pero sobre todo, John debería haber dicho que no a su propia decisión
interna de que la única manera de terminar este trabajo a tiempo era hacer
un gran lío. Fíjate en lo que dijo John sobre el buen código y las pruebas
unitarias:
"Para compensar el trabajo extra, la codificación tendrá que ir un
poco más rápido. Olvida esa fábrica abstracta. Usa un gran bucle for en
lugardel compuesto, ¡no hay tiempo!"
Y otra vez:
"Me pasé esos ocho días escribiendo código con furia. Utilicé todas las
herramientas disponibles para hacerlo: copiar y pegar (también conocido
como código reutilizable), números mágicos (para evitar la duplicación de
la definición de constantes y luego, ¡juego!, volver a escribirlas), y
¡absolutamente NINGÚN test unitario! (¿Quién necesita barras rojas en un
momento como éste?, ¡sólo me desmotivaría!)"
Decir que sí a esas decisiones fue el verdadero quid del fracaso. John
aceptó que la única forma de tener éxito era comportarse de forma poco
profesional, por lo que cosechó la recompensa correspondiente.
Esto puede sonar duro. No es esa la intención. En capítulos anteriores he
descrito cómo he cometido el mismo error en mi carrera, más de una vez.
La tentación de ser un héroe y "resolver el problema" es enorme. Lo que
todos tenemos que comprender es que decir que sí a abandonar nuestras
disciplinas profesionales no es la forma de resolver los problemas.
Abandonar esas disciplinas es la forma de crear problemas. Con
esto, por fin puedo responder a la pregunta inicial de John:"¿Es
imposible un buen código? ¿Es imposible la profesionalidad?"
Respuesta: Yo digo que no.
3. Decir sí
Sólo puedes comprometerte con cosas sobre las que tienes pleno control.
Por ejemplo, si tu objetivo es terminar un módulo que también depende de
otro equipo, no puedes comprometerte a terminar el módulo con plena
integración con el otro equipo. Pero puedes comprometerte a realizar
acciones específicas que te lleven a tu objetivo. Podrías:
• Siéntate durante una hora con Gary, del equipo de
infraestructura, para entender tus dependencias.
• Crea una interfaz que abstraiga la dependencia de tu módulo de la
infraestructura del otro equipo.
• Reúnete al menos tres veces esta semana con el responsable de la
compilación para asegurarte de que tus cambios funcionan bien en
el sistema de compilación de la empresa.
• Cree su propia compilación personal que ejecute sus pruebas de
integración para el módulo.
¿Ves la diferencia?
Si el objetivo final depende de otra persona, debes comprometerte con
acciones específicas que te acerquen al objetivo final.
No funcionaría porque realmente no sé si se puede hacer
Si no se puede hacer, aún puedes comprometerte con acciones que
te acerquen al objetivo. Averiguar si se puede hacer puede ser una de
lasacciones a las que comprometerse.
En lugar de comprometerse a arreglar los 25 errores restantes antes del
lanzamiento (lo que puede no ser posible), puede comprometerse a realizar
estas acciones específicas que le acercan a ese objetivo:
• Revisa los 25 errores e intenta recrearlos.
• Siéntese con el QA que encontró cada error para ver una reproducción
de ese error.
• Dedica todo el tiempo que tengas esta semana a intentar arreglar cada
fallo.
No funcionaría porque a veces no lo consigo
Eso sucede. Puede ocurrir algo inesperado, y así es la vida. Pero tú sigues
queriendo estar a la altura de las expectativas. En ese caso, es hora de
cambiar las expectativas, lo antes posible.
Si no puedes cumplir tu compromiso, lo más importante es que avises
cuanto antes a quien te hayas comprometido.
Cuanto antes levante la bandera ante todas las partes interesadas, más
probable será que haya tiempo para que el equipo se detenga, reevalúe las
acciones que se están llevando a cabo y decida si se puede hacer o cambiar
algo (en términos de prioridades, por ejemplo). Al hacer esto, el
compromiso puede seguir cumpliéndose, o puede cambiarse a otro
compromiso.
Algunos ejemplos son:
• Si fijas una reunión para el mediodía en una cafetería del centro con
un colega y te quedas atascado en el tráfico, dudas de que puedas
cumplir tu compromiso de llegar a tiempo. Puedes llamar a tu colega
en cuanto te des cuenta de que puedes llegar tarde y avisarle. Tal vez
puedas encontrar un lugar más cercano para quedar, o quizás
posponer la reunión.
• Si te comprometiste a resolver un fallo que pensabas que era
solucionable y te das cuenta en algún momento de que el fallo es mucho
más horrible de lo que se pensaba, puedes levantar la bandera. El equipo
puede entonces decidir un curso de acción para hacer ese compromiso
(emparejamiento, picoteo en soluciones potenciales, lluviade ideas) o
cambiar la prioridad y pasarte a otro fallo más sencillo.
Un punto importante aquí es: Si no le dices a nadie sobre el
problemapotencial tan pronto como sea posible, no estás dando a
nadie la oportunidad de ayudarte
cumplir con su compromiso.
Resumen
Crear un lenguaje de compromiso puede sonar un poco aterrador, pero
puede ayudar a resolver muchos de los problemas de comunicación a los
que se enfrentan los programadores hoy en día: estimaciones, plazos y
contratiempos de comunicación cara a cara. Se te tomará como un
desarrollador serio que cumple con su palabra, y eso es una de las mejores
cosas que puedes esperar en nuestra industria.
Aprender a decir "sí"
Le pedí a Roy que contribuyera con ese artículo porque me tocó la fibra
sensible. Llevo algún tiempo predicando sobre cómo decir no. Pero es
igual de importante aprender a decir que sí.
La otra cara del "intento"
Imaginemos que Pedro es responsable de algunas modificaciones en el
motor de clasificación. Ha calculado en privado que estas modificaciones
le llevarán cinco o seis días. También cree que redactar la documentación
de las modificaciones le llevará unas cuantas horas. El lunes por la
mañana, su jefa, Marge, le pregunta por el estado de las cosas.
Marge: "Peter, ¿tendrás las modificaciones del motor de clasificación
hechas para el viernes?" Peter: "Creo que es factible".
Marge: "¿Incluirá eso la documentación?"
Peter: "Intentaré hacer eso también".
Tal vez Marge no pueda oír los titubeos en las declaraciones de Peter, pero
lo cierto es que él no se compromete mucho. Marge hace preguntas que
exigen respuestas booleanas, pero las respuestas booleanas de Peter son
difusas.
Fíjate en el abuso de la palabra intentar. En el último capítulo
utilizamos la definición de "esfuerzo extra" de intentar. Aquí, Pedro
está usando la definición de "tal vez, tal vez no".
Peter estaría mejor respondiendo así:
Marge: "Peter, ¿tendrás las modificaciones del motor de clasificación
hechas para el viernes?" Peter: "Probablemente, pero podría ser el
lunes".
Marge: "¿Incluirá eso la documentación?"
Pedro: "La documentación me llevará unas horas más, así que el
luneses posible, pero podría ser hasta el martes".
En este caso, el lenguaje de Peter es más honesto. Está describiendo su
propia incertidumbre a Marge. Puede que Marge sea capaz de afrontar esa
incertidumbre. Por otro lado, puede que no.
Comprometerse con la disciplina
Marge: "Peter, necesito un sí o un no definitivo. ¿Tendrás elmotor
de clasificación terminado y documentado para el viernes?"
Esta es una pregunta perfectamente justa para Marge. Ella tiene un
horario que mantener, y necesita una respuesta binaria sobre el viernes.
¿Cómo debería responder Peter?
Peter: "En ese caso, Marge, tendré que decir que no. Lo más pronto que
puedo ser
seguro que terminaré con los mods y los docs es el martes".
Marge: "¿Te comprometes al martes?"
Pedro: "Sí, lo tendré todo listo el martes".
Pero, ¿y si Marge realmente necesita las modificaciones y la
documentación para el viernes?
Marge: "Peter, el martes me da un verdadero problema. Willy, nuestro
escritor técnico, estará disponible el lunes. Tiene cinco días para
terminar la guía del usuario. Si no tengo los documentos del motor de
https://dogramcode.com/programacion
clasificación para el lunes por la mañana, no podrá terminar el manuala
tiempo. ¿Puedes hacer los documentos primero?"
Pedro: "No, los mods tienen que ser lo primero, porque generamos los
docs a partir de la salida de las pruebas".
Marge: "Bueno, ¿no hay alguna manera de terminar los mods y los
documentos antes del lunes por la mañana?"
Ahora Peter tiene que tomar una decisión. Es muy probable que termine
con las modificaciones del motor de la tasa el viernes, e incluso podría
terminar los documentos antes de irse a casa el fin de semana. También
podría hacer algunas horas de trabajo el sábado si las cosas tardan más de
lo que espera. Entonces, ¿qué debería decirle a Marge?
Peter: "Mira Marge, es muy posible que pueda tener todo hecho para
el lunes por la mañana si le dedico unas horas extra el sábado".
¿Resuelve eso el problema de Marge? No, simplemente cambia
lasprobabilidades, y eso es lo que Peter tiene que decirle.
Marge: "¿Puedo contar el lunes por la mañana
entonces?" Peter: "Probablemente, pero no
definitivamente".
Eso podría no ser suficiente para Marge.
Marge: "Mira, Peter, realmente necesito una definición de esto. ¿Hay
alguna manera de que te comprometas a tenerlo hecho antes del lunes
por la mañana?"
Peter podría estar tentado a romper la disciplina en este punto. Podría
terminar más rápido si no escribe sus pruebas. Podría terminar más rápido si
no refactoriza. Podría terminar más rápido si no ejecuta la suite de regresión
completa.
Aquí es donde el profesional traza la línea. En primer lugar, Peter se
equivoca en sus suposiciones. No va a terminar más rápido si no escribe sus
pruebas. No lo hará más rápido si no refactoriza. No lo hará más rápidosi
omite la suite de regresión completa. Años de experiencia nos han enseñado
que romper las disciplinas sólo nos retrasa.
Pero en segundo lugar, como profesional tiene la responsabilidad de
mantener ciertos estándares. Su código debe ser probado, y debe tener
pruebas. Su código tiene que estar limpio. Y tiene que estar seguro de
que no ha roto nada más en el sistema.
Peter, como profesional, ya se ha comprometido a mantener estas normas.
Todos los demás compromisos que asuma deben estar subordinados a
eso. Así que toda esta línea de razonamiento debe ser abortada.
Peter: "No, Marge, no hay forma de asegurar ninguna fecha antes del
martes. Siento que eso te fastidie la agenda, pero es la realidad a la que
https://dogramcode.com/programacion
nos enfrentamos".
Marge: "Maldición. Realmente contaba con traer a este antes.
¿Estás segura?"
Pedro: "Estoy seguro de que podría ser tan tarde como el martes, sí."
Marge: "Bien, creo que iré a hablar con Willy para ver si puede
reorganizar su horario".
En este caso, Marge aceptó la respuesta de Peter y empezó a buscar otras
opciones. ¿Pero qué pasa si todas las opciones de Marge se han agotado?
¿Y si Peter fuera la última esperanza?
Marge: "Peter, mira, sé que esto es una gran imposición, pero
realmente necesito que encuentres una manera de hacer todo esto para
el lunes por la mañana. Es realmente crítico. ¿No hay algo que puedas
hacer?"
Así que ahora Peter empieza a pensar en trabajar algunas horas extras
importantes, y probablemente la mayor parte del fin de semana. Tiene que
ser muy honesto consigo mismo sobre su resistencia y sus reservas. Es
fácil decir que vas a hacer muchas cosas los fines de semana, pero es
mucho más difícil reunir la energía suficiente para hacer un trabajo de
calidad.
Los profesionales conocen sus límites. Saben cuántas horas extras
pueden aplicar de forma efectiva, y saben cuál será el coste.
En este caso, Peter se siente bastante seguro de que unas cuantas horasextra
durante la semana y algo de tiempo el fin de semana serán suficientes.
Peter: "Bien, Marge, te diré algo. Llamaré a casa y aclararé algunas
horas extras con mi familia. Si les parece bien, terminaré esta tarea el
lunes por la mañana. Incluso vendré el lunes por la mañana para
asegurarme de que todo va bien con Willy. Pero luego me iré a casa y
no volveré hasta el miércoles. ¿Trato?"
Esto es perfectamente justo. Peter sabe que puede hacer las
modificaciones y los documentos si trabaja las horas extras. También
sabe que será inútil durante un par de días después.
Conclusión:
Los profesionales no están obligados a decir que sí a todo lo que se les pide.
Sin embargo, deben esforzarse por encontrar formas creativas de hacer
posible el "sí". Cuando los profesionales dicen que sí, utilizan el lenguaje del
compromiso para que no haya dudas sobre lo que han prometido.
4. Codificación
https://dogramcode.com/programacion
En un libro1 anterior escribí mucho sobre la estructura y la naturaleza del
Código Limpio. Este capítulo trata del acto de codificar y del contexto
que rodea ese acto.
A los 18 años podía escribir razonablemente bien, pero tenía que mirar las
teclas. No podía escribir a ciegas. Así que una tarde me pasé unas largas
horas ante un teclado IBM 029 negándome a mirar los dedos mientras
escribía un programa que había escrito en varios formularios de
codificación. Examiné cada tarjeta después de teclearla y descarté las que
estaban mal escritas.
Al principio escribí bastantes errores. Al final de la noche los escribí todos casi
a la perfección. Me di cuenta, durante esa larga noche, de que escribir aciegas
es cuestión de confianza. Mis dedos sabían dónde estaban las teclas, sólo tenía
que ganar la confianza de que no me estaba equivocando. Una delas cosas que
me ayudó a tener esa confianza es que podía sentir cuando cometía un error.
Al final de la tarde, si cometía un error, lo sabía casi al instante y simplemente
expulsaba la tarjeta sin mirarla.
Ser capaz de percibir tus errores es realmente importante. No sólo en la
mecanografía, sino en todo. Tener sentido del error significa que se cierra
rápidamente el bucle de retroalimentación y se aprende de los errores con
mayor rapidez. He estudiado,
y dominado, varias disciplinas desde aquel día en el 029. He
descubierto que, en cada caso, la clave de la maestría es la confianza y el
sentido delerror.
Este capítulo describe mi conjunto personal de reglas y principios para la
codificación. Estas reglas y principios no se refieren a mi código en sí,
sino a mi comportamiento, mi estado de ánimo y mi actitud al escribir
código. Describen mi propio contexto mental, moral y emocional para
https://dogramcode.com/programacion
escribir código. Son las raíces de mi confianza y mi sentido del error.
Es probable que no estés de acuerdo con todo lo que digo aquí. Al fin y al
cabo, se trata de algo muy personal. De hecho, es posible que no estés de
acuerdo con algunas de mis actitudes y principios. No pasa nada: no
pretenden ser verdades absolutas para nadie más que para mí. Lo que son es
el enfoque de un hombre para ser un codificador profesional.
Tal vez, estudiando y contemplando mi propio medio de codificación
personal, pueda aprender a arrebatarme la piedra de la mano.
Preparación
La codificación es una actividad intelectualmente desafiante y agotadora.
Requiere un nivel de concentración y atención que pocas otras disciplinas
exigen. Esto se debe a que la codificación requiere hacer malabares con
muchos factores que compiten entre sí a la vez.
Así que tu jefe dice: "¿Y si trabajas dos horas más al día? ¿Y si trabajas
el sábado? Vamos, tiene que haber una forma de meter las horas
suficientes para terminar el reportaje a tiempo".
Las horas extras pueden funcionar, y a veces son necesarias. A veces se
puede llegar a una fecha que de otro modo sería imposible si se hacen
algunas jornadas de diez horas y uno o dos sábados. Pero esto es muy
arriesgado. No es probable que consigas hacer un 20% más de trabajo
trabajando un 20% más de horas. Es más, las horas extras fracasarán con
toda seguridad si se prolongan más de dos o tres semanas.
Por lo tanto, no debes aceptar trabajar horas extras a menos que (1) te lo
puedas permitir personalmente, (2) sean de corta duración, dos semanas o
menos, y (3) tu jefe tenga un plan de respaldo en caso de que el esfuerzo de
las horas extras fracase.
Este último criterio es el que rompe el trato. Si tu jefe no puede explicarte
lo que va a hacer si el esfuerzo de las horas extraordinarias fracasa,
entonces no deberías aceptar trabajar horas extraordinarias.
Falso envío
De todos los comportamientos poco profesionales que puede tener un
programador, quizá el peor de todos sea decir que se ha terminado cuando
se sabe que no es así. A veces se trata simplemente de una mentira abierta,y
eso ya es bastante malo. Pero el caso mucho más insidioso es cuando
conseguimos racionalizar una nueva definición de "terminado". Nos
convencemos de que ya hemos terminado lo suficiente y pasamos a la
siguiente tarea. Racionalizamos que cualquier trabajo que quede puede ser
tratado más tarde, cuando tengamos más tiempo.
Esta es una práctica contagiosa. Si un programador lo hace, otros lo verán y
seguirán su ejemplo. Uno de ellos estirará aún más la definición de "hecho",
y todos los demás adoptarán la nueva definición. He visto esto llevado a
extremos horribles. Uno de mis clientes definió "hecho" como "facturado".
El código ni siquiera tenía que compilar. Es muy fácil estar "hecho" si nada
tiene que funcionar.
Cuando un equipo cae en esta trampa, los directivos escuchan que todo
va bien. Todos los informes de situación muestran que todo el mundo
está a tiempo. Es como los ciegos que hacen un picnic en las vías del
tren: Nadie ve el tren de carga de trabajo inacabado que se les viene
encima hasta que es demasiado tarde.
Definir "Hecho"
Se evita el problema de la falsa entrega creando una definición
independiente de "hecho". La mejor manera de hacerlo es hacer que sus
analistas de negocio y probadores creen pruebas de aceptación
automatizadas 5que deben pasar antes de poder decir que se ha terminado.
Estas pruebas deben estar escritas en un lenguaje de pruebas como
FITNESSE, Selenium, RobotFX, Cucumber, etc. Las pruebas deben ser
comprensibles para las partes interesadas y la gente de negocios, y deben
ejecutarse con frecuencia.
Ayuda
Programar es difícil. Cuanto más joven eres, menos crees esto. Después de
todo, es sólo un montón de sentencias if y while. Pero a medida que adquieres
experiencia empiezas a darte cuenta de que la forma en que combinas esas
sentencias if y while es críticamente importante. No puedes simplemente
juntarlas y esperar lo mejor. En lugar de eso, tienes que dividir
cuidadosamente el sistema en pequeñas unidades comprensibles que tengantan
poco que ver entre sí como sea posible, y eso es difícil.
La programación es tan difícil, de hecho, que está más allá de la
capacidad de una sola persona para hacerlo bien. No importa loexperto
que seas, seguro que te beneficiarás de las ideas y pensamientos de
otro programador.
Ayudar a los demás
Por ello, es responsabilidad de los programadores estar disponibles para
ayudar a los demás. Es una violación de la ética profesional encerrarse en
un cubículo u oficina y rechazar las consultas de los demás. Tu trabajo no
es tan importante como para que no puedas prestar algo de tu tiempo para
ayudar a los demás. De hecho, como profesional estás obligado a ofrecer
esa ayuda siempre que se necesite.
Esto no significa que no necesites tiempo para estar solo. Por supuesto
que sí. Pero tienes que ser justo y educado al respecto. Por ejemplo,
puedes hacer saber que entre las 10 de la mañana y el mediodía no debes ser
molestado, pero que de la 1 a las 3 de la tarde tu puerta está abierta.
Debes ser consciente del estado de tus compañeros de equipo. Si ves a
alguien que parece estar en problemas, debes ofrecer tu ayuda.
Probablemente te sorprenderá el profundo efecto que puede tener tu ayuda.
No es que seas mucho más inteligente que la otra persona, sino que una
nueva perspectiva puede ser un profundo catalizador para
resolverproblemas.
Cuando ayudes a alguien, sentaos a escribir código juntos. Planea pasar
la mayor parte de una hora o más. Puede que te lleve menos que eso, pero
noquieres que parezca que tienes prisa. Resígnate a la tarea y haz un
esfuerzosólido. Es probable que salgas de allí habiendo aprendido más de lo
que has dado.
Ser ayudado
Cuando alguien se ofrezca a ayudarte, sé amable. Acepta la ayuda con
gratitud y entrégate a ella. No protejas tu territorio. No rechaces la ayuda
porque estés bajo presión. Dale treinta minutos más o menos. Si para
entonces la persona no está ayudando mucho, discúlpate amablemente y
termina la sesión dando las gracias. Recuerda que, al igual que estás
obligado a ofrecer ayuda, estás obligado a aceptarla.
Aprende a pedir ayuda. Cuando estés atascado, o desconcertado, o
simplemente no puedas entender un problema, pide ayuda a alguien. Si estás
sentado en una sala de equipo, puedes sentarte y decir: "Necesito ayuda". De
lo contrario, utiliza yammer, o twitter, o el correo electrónico, oel teléfono
de tu mesa. Pide ayuda. De nuevo, esto es una cuestión de ética profesional.
No es profesional quedarse atascado cuando la ayuda es fácilmente
accesible.
A estas alturas, es posible que esperen que estalle en un coro de Kumbaya
mientras los conejitos peludos saltan sobre las espaldas de los unicornios y
todos volamos felizmente sobre el arco iris de la esperanza y el cambio. No,
no es así. Verás, los programadores tienden a ser introvertidos arrogantes y
ensimismados. No nos metimos en este negocio porque nos guste la gente.
La mayoría de nosotros nos metimos en la programación porque preferimos
centrarnos profundamente en minucias estériles, hacer malabarismos con
muchos conceptos simultáneamente y, en general, demostrarnos a nosotros
mismos que tenemos cerebros del tamaño de un planeta, todo ello sin tener
que interactuar con las desordenadas complejidades de otras personas.
Sí, es un estereotipo. Sí, es una generalización con muchas excepciones.
Pero la realidad es que los programadores no suelen ser colaboradores.6 Y,
sin embargo, la colaboración es fundamental para una programación eficaz.
Por lo tanto, como para muchos de nosotros la colaboración no es un
instinto, necesitamos disciplinas que nos impulsen a colaborar.
Mentoring
Más adelante en el libro hay un capítulo entero sobre este tema. Por
ahora permítanme decir simplemente que la formación de
losprogramadores menos experimentados es la
responsabilidad de los que tienen más experiencia. Los cursos de
formación no sirven. Los libros no sirven. Nada puede llevar a un joven
desarrollador de software a un alto rendimiento más rápido que su propio
impulso y la tutoría efectiva de sus superiores. Por lo tanto, una vez más, es
una cuestión de ética profesional que los programadores veteranos
dediquen tiempo a tomar a los programadores más jóvenes bajo su tutela ya
orientarlos. Del mismo modo, los programadores más jóvenes tienen el
deber profesional de buscar esa tutoría de sus superiores.
Bibliografía
[Martin09]: Robert C. Martin, Clean Code, Upper Saddle River,
NJ: Prentice Hall, 2009.
[Martin03]: Robert C. Martin, Agile Software Development: Principles,
Patterns, and Practices, Upper Saddle River, NJ: PrenticeHall, 2003.
5. Desarrollo basado en pruebas
Han pasado más de diez años desde que el Desarrollo Dirigido por Pruebas
(TDD) hizo su debut en la industria. Llegó como parte de la ola de
Extreme Programming (XP), pero desde entonces ha sido adoptado por
Scrum, y prácticamente por todos los demás métodos ágiles. Incluso los
equipos no ágiles practican TDD.
Cuando, en 1998, oí hablar por primera vez de "Test First Programming",
me mostré escéptico. ¿Quién no lo sería? ¿Escribir primero las pruebas
unitarias? ¿Quién haría una tontería como esa?
Pero para entonces ya llevaba treinta años como programador
profesional y había visto cómo iban y venían las cosas en el sector.
Sabía que no debía descartar nada de buenas a primeras, sobre todo
cuando lo dice alguien como Kent Beck.
Así que en 1999 viajé a Medford, Oregón, para reunirme con Kent y
aprender de él la disciplina. La experiencia fue impactante.
Kent y yo nos sentamos en su despacho y empezamos a codificar un
pequeño y sencillo problema en Java. Yo quería escribir la tontería sin más.
Pero Kent se resistió y me llevó, paso a paso, a través del proceso. Primero
escribió una pequeña parte de una prueba unitaria, apenas lo suficiente para
calificarla como código. Luego escribió el código suficiente para que esa
prueba compilara. Luego escribió un poco más de prueba, y luego más
código.
El tiempo de ciclo estaba completamente fuera de mi experiencia.
Estaba acostumbrado a escribir código durante la mayor parte de una hora
antes deintentar compilarlo o ejecutarlo. Pero Kent ejecutaba literalmente su
códigocada treinta segundos, más o menos. Me quedé atónito.
Es más, ¡reconocí el tiempo de ciclo! Era el tipo de tiempo de ciclo que
había utilizado años atrás cuando era un niño que 1programaba juegos en
lenguajes interpretados como Basic o Logo. En esos lenguajes no hay
tiempo de construcción, así que sólo tienes que añadir una línea de códigoy
luego ejecutar. Se recorre el ciclo muy rápidamente. Y por eso, puedes ser
muy productivo en esos lenguajes.
Pero en la programación real ese tipo de tiempo de ciclo era absurdo. En la
programación real había que dedicar mucho tiempo a escribir el código, y
luego mucho más tiempo a conseguir que se compilara. Y luego aún más
tiempo depurándolo. Yo era un programador de C++, ¡maldita sea! Y en
C++ teníamos tiempos de compilación y enlace que tardaban minutos, a
veces horas. Los tiempos de ciclo de treinta segundos eran inimaginables.
Sin embargo, allí estaba Kent, cocinando este programa Java en ciclos de
treinta segundos y sin ningún indicio de que fuera a bajar el ritmo pronto.
Así que me di cuenta, mientras estaba sentado en la oficina de Kent, de que
usando esta sencilla disciplina podía codificar en lenguajes reales con el
tiempo de ciclo de Logo. Estaba enganchado.
El jurado está presente
Desde aquellos días he aprendido que TDD es mucho más que un simple
truco para acortar mi tiempo de ciclo. La disciplina tiene todo un repertorio
de beneficios que describiré en los siguientes párrafos.
Pero primero tengo que decir esto:
• El jurado está presente.
• Se acabó la polémica.
• GOTO es perjudicial.
• Y el TDD funciona.
Sí, se han escrito muchos blogs y artículos polémicos sobre TDD a lo
largo de los años y todavía los hay. En los primeros tiempos eran intentos
serios de crítica y comprensión. Hoy en día, sin embargo, sólo son
despotrica. La conclusión es que el TDD funciona, y todo el mundo
tieneque superarlo.
Sé que esto suena estridente y unilateral, pero teniendo en cuenta los
antecedentes no creo que los cirujanos deban defender el lavado de manos, y
no creo que los programadores deban defender el TDD.
¿Cómo puedes considerarte un profesional si no sabes que todo tu código
funciona? ¿Cómo puedes saber que todo tu código funciona si no lo
pruebas cada vez que haces un cambio? ¿Cómo puedes probarlo cada vez
que haces un cambio si no tienes pruebas unitarias automatizadas con una
cobertura muy alta? ¿Cómo puedes conseguir pruebas unitarias
automatizadas con una cobertura muy alta sin practicar TDD?
Esta última frase requiere cierta elaboración. ¿Qué es el TDD?
Las tres leyes del TDD
Estas tres leyes te encierran en un ciclo que dura, quizás, treinta segundos.
Empiezas escribiendo una pequeña parte de una prueba unitaria. Pero a los
pocos segundos debes mencionar el nombre de alguna clase o función que
aún no has escrito, lo que hace que la prueba unitaria no compile. Así que
debes escribir código de producción que haga que la prueba compile. Pero
no puedes escribir más que eso, así que empiezas a escribir más código de
prueba unitaria.
Dando vueltas y más vueltas al ciclo. Añadiendo un poco al código de
prueba. Añadiendo un poco al código de producción. Los dos flujos de
código crecen simultáneamente en componentes complementarios. Las
pruebas se ajustan al código de producción como un anticuerpo se ajusta a
un antígeno.
La letanía de los beneficios
Certeza
Si adoptas TDD como disciplina profesional, entonces escribirás
docenas de pruebas cada día, cientos de pruebas cada semana y miles de
pruebas cada año. Y mantendrás todas esas pruebas a mano y las ejecutarás
cada vezque hagas algún cambio en el código.
Soy el principal autor y mantenedor de FITNESSE, 2una herramienta de
pruebas de aceptación basada en Java. En el momento de escribir este
artículo, FITNESSE tiene 64.000 líneas de código, de las cuales 28.000
están contenidas en algo más de 2.200 pruebas unitarias individuales. Estas
pruebas cubren al menos el 90% del código de producción 3y tardan unos 90
segundos en ejecutarse.
Cada vez que hago un cambio en cualquier parte de FITNESSE,
simplemente ejecuto las pruebas unitarias. Si pasan, estoy casi seguro de
que el cambio que hice no rompió nada. ¿Cómo de seguro es "casi
seguro"? Lo suficientemente seguro como para enviarlo.
El proceso de control de calidad para FITNESSE es el comando: ant release.
Ese comando construye FITNESSE desde cero y luego ejecuta todas las
pruebas unitarias y de aceptación. Si todas esas pruebas pasan, lo envío.
Tasa de inyección de defectos
Ahora bien, FITNESSE no es una aplicación de misión crítica. Si hay un
error, nadie muere, y nadie pierde millones de dólares. Así que puedo
permitirme el lujo de realizar envíos basados únicamente en la superación
de pruebas. Por otra parte, FITNESSE tiene miles de usuarios, y a pesar de
la adición de 20.000 nuevas líneas de código el año pasado, mi lista de
errores sólo tiene 17 errores (muchos de los cuales son de naturaleza
cosmética). Así que sé que mi tasa de inyección de defectos es muy baja.
No se trata de un efecto aislado. Hay varios informes 4y estudios5 que
describen una reducción significativa de los defectos. Desde IBM hasta
Microsoft, desde Sabre hasta Symantec, empresa tras empresa y equipo tras
equipo han experimentado reducciones de defectos de 2X, 5X e incluso
10X. Son cifras que ningún profesional debería ignorar.
Valor
Cuando sigues las tres leyes y escribes tus pruebas primero, te enfrentas a
un dilema. A menudo sabes exactamente qué código quieres escribir, pero
las tres leyes te dicen que escribas una prueba unitaria que falla porque ese
código no existe. Esto significa que tienes que probar el código que vas a
escribir.
El problema de probar el código es que hay que aislarlo. A menudo es
difícil probar una función si esa función llama a otras funciones. Para
escribir esa prueba tienes que encontrar alguna manera de desacoplar la
función de todas las demás. En otras palabras, la necesidad de probar
primero te obliga a pensar en un buen diseño.
Si no escribes tus pruebas primero, no hay ninguna fuerza que te impida
acoplar las funciones juntas en una masa no comprobable. Si escribes tus
pruebas después, podrás probar las entradas y las salidas de la masa total,
pero probablemente será bastante difícil probar las funciones individuales.
Por lo tanto, seguir las tres leyes, y escribir tus pruebas primero, crea una
fuerza que te impulsa a un mejor diseño desacoplado. ¿Qué profesional no
emplearía herramientas que le condujeran hacia mejores diseños?
"Pero puedo escribir mis pruebas después", dices. No, no puedes. En
realidad no. Puedes escribir algunas pruebas más tarde. Incluso puedes
acercarte a una alta cobertura más tarde si tienes cuidado de medirla. Pero
las pruebas que escribes después son la defensa.
Las pruebas que se escriben primero son ofensivas. Las pruebas a
posteriori las escribe alguien que ya está metido en el código y ya sabe
cómo se resolvió el problema. No hay manera de que esas pruebas puedan
ser ni de lejos tan incisivas como las pruebas escritas primero.
La opción profesional
El resultado de todo esto es que TDD es la opción profesional. Es una
disciplina que mejora la seguridad, el valor, la reducción de defectos, la
documentación y el diseño. Con todo eso a favor, podría considerarse poco
profesional no utilizarlo.
Lo que no es el TDD
A pesar de todas sus bondades, el TDD no es una religión ni una
fórmulamágica. Seguir las tres leyes no garantiza ninguno de estos
beneficios.
Puedes seguir escribiendo mal código incluso si escribes tus pruebas
primero. De hecho, puedes escribir malas pruebas.
Del mismo modo, hay ocasiones en las que seguir las tres leyes es
simplemente poco práctico o inapropiado. Estas situaciones son raras, pero
existen. Ningún desarrollador profesional debería seguir una disciplina
cuando ésta hace más daño que bien.
Bibliografía
[Maximilien]: E. Michael Maximilien, Laurie Williams, "Assessing Test-
Driven Development at IBM",
http://collaboration.csc.ncsu.edu/laurie/Papers/MAXIMILIEN_WILLIA
MS.PDF
[George2003]: B. George, y L. Williams, "An Initial Investigation of
Test-Driven Development in Industry",
http://collaboration.csc.ncsu.edu/laurie/Papers/TDDpaperv8.pdf
[Janzen2005]: D. Janzen y H. Saiedian, "Test-driven development
concepts, taxonomy, and future direction" (Conceptos, taxonomía y
dirección futura del desarrollo basado en pruebas), IEEE Computer,
volumen 38, número 9, pp. 43-50.
[Nagappan2008]: Nachiappan Nagappan, E. Michael Maximilien,
Thirumalesh Bhat y Laurie Williams, "Realizing quality improvement
through test driven development: results and experiences of four
industrial teams", Springer Science + Business Media, LLC 2008:
http://research.microsoft.com/en-us/projects/esm/nagappan_tdd.pdf
6. Practicando
Todos los profesionales practican su arte realizando ejercicios de
perfeccionamiento. Los músicos ensayan escalas. Los jugadores de
fútbol corren a través de los neumáticos. Los médicos practican suturasy
técnicas quirúrgicas. Los abogados practican sus argumentos. Los
soldados ensayan misiones. Cuando el rendimiento es importante, los
profesionales practican. Este capítulo trata de las formas en que los
programadores pueden practicar su arte.
Algunos antecedentes de la práctica
Practicar no es un concepto nuevo en el desarrollo de software, pero no lo
reconocimos como práctica hasta justo después del cambio de milenio.
Quizás la primera instancia formal de un programa de práctica fue impresa
en la página 6 de [K&R-C].
main()
{
print£("hola, mundo\n");
}
Peter: "Sí, todo rojo. Ninguno de los escenarios está escrito. Déjame
escribir el primero".
|scenario|dado el comando _|cmd|
|crear comando|@cmd|
Mejor aún es escribir pruebas que invoquen las características del sistema
subyacente a través de una API real en lugar de a través de la GUI. Esta
API debería ser la misma que utiliza la interfaz gráfica de usuario. Esto no
es nada nuevo. Los expertos en diseño llevan décadas diciéndonos que
separemos nuestras interfaces gráficas de usuario de nuestras reglas de
negocio.
Probar a través de la GUI es siempre problemático, a menos que se esté
probando sólo la GUI. La razón es que la GUI es probable que cambie,
haciendo que las pruebas sean muy frágiles. Cuando cada cambio de la
GUI rompe mil pruebas, o bien vas a empezar a tirar las pruebas o vas a
dejar de cambiar la GUI. Ninguna de las dos opciones es buena. Así que
escribe tus pruebas de reglas de negocio para que pasen por una API
justo debajo de la GUI.
Algunas pruebas de aceptación especifican el comportamiento de la propia
interfaz gráfica de usuario. Estas pruebas deben pasar por la GUI. Sin
embargo, estas pruebas no prueban las reglas de negocio y por lo tanto no
requieren que las reglas de negocio estén conectadas a la GUI. Por lo tanto,
es una buena idea desacoplar la GUI y las reglas de negocio y reemplazar
las reglas de negocio con stubs mientras se prueba la propia GUI.
Mantenga las pruebas de la GUI al mínimo. Son frágiles, porque la GUI es
volátil. Cuantas más pruebas de la GUI tenga, menos probabilidades tendrá
de mantenerlas.
Integración continua
Asegúrese de que todas sus pruebas unitarias y de aceptación se ejecutan
varias veces al día en un sistema de integración continua. Este sistema
debería ser activado por tu sistema de control de código fuente. Cada vez
que alguien envíe un módulo, el sistema de integración continua debería
iniciar una compilación y, a continuación, ejecutar todas las pruebas del
sistema. Los resultados de esa ejecución deberían enviarse por
correoelectrónico a todos los miembros del equipo.
Parar las prensas
Pruebas unitarias
En la base de la pirámide están las pruebas unitarias. Estas pruebas están
escritas por programadores, para programadores, en el lenguaje de
programación del sistema. La intención de estas pruebas es especificar el
sistema al nivel más bajo. Los desarrolladores escriben estas pruebas antes
de escribir el código de producción como una forma de especificar lo que
van a escribir. Se ejecutan como parte de la integración continua para
garantizar que se mantiene la intención de los programadores.
Las pruebas unitarias proporcionan una cobertura tan cercana al 100%
como sea posible. Por lo general, este número debería estar en algún punto
de los 90. Y debe ser una cobertura verdadera, en contraposición a las
pruebas falsas que ejecutan el código sin afirmar su comportamiento.
Pruebas de componentes
Son algunas de las pruebas de aceptación mencionadas en el capítulo
anterior. Generalmente se escriben contra componentes individuales del
sistema.
Los componentes del sistema encapsulan las reglas de negocio, por lo
que las pruebas para esos componentes son las pruebas de aceptación
para esas reglas de negocio
Como se muestra en la Figura 8-2, una prueba de componente envuelve
un componente. Pasa los datos de entrada al componente y recoge los
datos de salida del mismo. Comprueba que la salida coincide con la
entrada. Cualquier otro componente del sistema se desacopla de la prueba
utilizando técnicas apropiadas de imitación y duplicación de pruebas.
Figura 8-2. Prueba de aceptación de
componentes
¿Qué pasa con esa tarea "beta"? Parece que Peter está bastante seguro de
sí mismo, pero que podría salir algo mal que le hiciera descarrilar
significativamente. ¿Cómo debería interpretarlo Mike? ¿Cuánto tiempo debe
planear Mike para que Peter complete las tres tareas?
Resulta que, con unos simples cálculos, Mike puede combinar todas las
tareas de Peter y obtener una distribución de probabilidad para todo el
conjunto de tareas. Las matemáticas son bastante sencillas:
-
Para cualquier secuencia de tareas, la duración prevista de esa
secuencia es la simple suma de todas las duraciones previstas de las
tareas de esa secuencia. Por lo tanto, si Pedro tiene que completar tres
tareas y sus estimaciones son 4,2/1,8, 3,5/2,2 y 6,5/1,3, es probable
que Pedro termine las tres en unos 14 días: 4.2 + 3.5 + 6.5.
Estas técnicas delphi de banda ancha son buenas para elegir una única
estimación nominal para una tarea. Pero, como hemos dicho antes, la
mayoría de las veces queremos tres estimaciones para poder crear una
distribución de probabilidad. Los valores optimistas y pesimistas de cada
tarea pueden generarse muy rápidamente utilizando cualquiera de las
variantes delphi de banda ancha. Por ejemplo, si se utiliza el póquer de
planificación, basta con pedir al equipo que levante las cartas para su
estimación pesimista y luego tomar la más alta. Se hace lo mismo con la
estimación optimista y se toma la más baja.
La ley de los grandes números
Las estimaciones están llenas de errores. Por eso se llaman estimaciones.
Una forma de gestionar el error es aprovechar la Ley de los Grandes
Números.8 Una implicación de esta ley es que si se divide una tarea grande
en muchas tareas más pequeñas y se estiman de forma independiente, la
suma de las estimaciones de las tareas pequeñas será más precisa que una
sola estimación de la tarea más grande. La razón de este aumento de la
precisión es que los errores de las tareas pequeñas tienden a integrarse.
Francamente, esto es optimista. Los errores en las estimaciones tienden
a lasubestimación y no a la sobreestimación, por lo que la integración no es
perfecta. Dicho esto,
Dividir las tareas grandes en pequeñas y estimar las pequeñas de
forma independiente sigue siendo una buena técnica. Algunos de los
errores se integran, y dividir las tareas es una buena manera de entender
mejor esastareas y descubrir las sorpresas.
Conclusión:
Los desarrolladores de software profesionales saben cómo proporcionar a
la empresa estimaciones prácticas que ésta puede utilizar con fines de
planificación. No hacen promesas que no puedan cumplir y no asumen
compromisos que no estén seguros de poder cumplir.
Cuando los profesionales se comprometen, aportan cifras concretas y luego
las cumplen. Sin embargo, en la mayoría de los casos los profesionales no
asumen tales compromisos. En su lugar, proporcionan estimaciones
probabilísticas que describen el tiempo de finalización previsto y la varianza
probable.
Los desarrolladores profesionales trabajan con los demás miembros
de su equipo para consensuar las estimaciones que se entregan a la
dirección.
Las técnicas descritas en este capítulo son ejemplos de algunas de las
diferentes formas en que los desarrolladores profesionales crean
estimaciones prácticas. No son las únicas técnicas de este tipo y no son
necesariamente las mejores. Son simplemente técnicas que me han
funcionado bien.
Bibliografía
[McConnell2006]: Steve McConnell, Software Estimation:
Demystifying the Black Art, Redmond, WA: Microsoft Press, 2006.
[Boehm81]: Barry W. Boehm, Software Engineering Economics,
Upper Saddle River, NJ: Prentice Hall, 1981.
[Grenning2002]: James Grenning, "Planning Poker or How to Avoid
Analysis Paralysis while Release Planning", abril de 2002,
http://renaissancesoftware.net/papers/14-papers/44-planing-poker.html
11. Presión
Es mucho mejor derribar todos los muros de propiedad del código y hacer
que el equipo sea dueño de todo el código. Prefiero equipos en los que
cualquier miembro del equipo pueda revisar cualquier módulo y hacer los
cambios que considere oportunos. Quiero que el equipo sea el dueño del
código, no los individuos.
Los desarrolladores profesionales no impiden que otros trabajen en el
código. No construyen muros de propiedad alrededor del código. Más bien,
trabajan con los demás en la mayor parte del sistema que pueden.
Aprenden de los demás trabajando con ellos en otras partes del sistema.
Emparejamiento
Hasta 2008 evitaba todas las formas de bifurcación, excepto las más
sencillas. Si un desarrollador creaba una rama, esa rama tenía que volver a
la línea principal antes del final de la iteración. De hecho, era tan austero
con las bifurcaciones que rara vez se hacían en los proyectos en los que
participaba.
Si se utiliza SVN, sigo pensando que es una buena política. Sin embargo,
hay algunas herramientas nuevas que cambian el juego por completo. Son
los sistemas de control de fuentes distribuidas. git es mi favorito de los
sistemas de control de fuentes distribuidas. Permíteme que te hable de él.
git
IDE/Editor
Como desarrolladores, pasamos la mayor parte de nuestro tiempo leyendoy
editando código. Las herramientas que utilizamos para ello han cambiado
mucho a lo largo de las décadas. Algunas son inmensamente potentes y
otras han cambiado poco desde los años 70.
vi
Se podría pensar que los días en que se utilizaba vi como el principal editor
de desarrollo ya han pasado. Hoy en día hay herramientas que superan con
creces a vi, y a otros editores de texto sencillos como él. Pero la verdad es
que vi ha disfrutado de un resurgimiento significativo en popularidad debido
a su simplicidad, facilidad de uso, velocidad y flexibilidad. Puede que Vi no
sea tan potente como Emacs, o eclipse, pero sigue siendo un editor rápido y
potente.
Dicho esto, ya no soy un usuario potente de vi. Hubo un día en que se me
conocía como un "dios" del vi, pero esos días ya pasaron. Utilizo vi de vez
en cuando si necesito hacer una edición rápida de un archivo de texto.
Incluso lo he utilizado recientemente para hacer un cambio rápido en un
archivo fuente de Java en un entorno remoto. Pero la cantidad de código
real que he hecho en vi en los últimos diez años es muy pequeña.
Emacs
Emacs sigue siendo uno de los editores más potentes que existen, y
probablemente lo seguirá siendo durante décadas. El modelo lisp interno lo
garantiza. Como herramienta de edición de propósito general, ninguna otra
se le acerca. Por otro lado, creo que Emacs no puede competir realmente
con los IDE de propósito específico que ahora dominan. Editar código no
es un trabajo de edición de propósito general.
En los años 90 yo era un fanático de Emacs. No me planteaba usar otra
cosa. Los editores de apuntar y hacer clic de la época eran juguetes risibles
que ningún desarrollador podía tomar en serio. Pero a principios de los años
00 conocí IntelliJ, mi IDE actual, y nunca he mirado atrás.
Eclipse/IntelliJ
Soy un usuario de IntelliJ. Me encanta. Lo uso para escribir Java, Ruby,
Clojure, Scala, Javascript, y muchos otros. Esta herramienta fue escrita
por programadores que entienden lo que los programadores necesitan al
escribir código. A lo largo de los años, rara vez me han decepcionado y
casi siempre me han complacido.
Eclipse es similar en potencia y alcance a IntelliJ. Los dos están
simplemente a pasos agigantados por encima de Emacs cuando se trata
de editar Java. Hay otros IDEs en esta categoría, pero no los mencionaré
aquí porque no tengo experiencia directa con ellos.
Las características que sitúan a estos IDEs por encima de herramientas
como Emacs son las formas extremadamente potentes en las que te ayudana
manipular el código. En IntelliJ, por ejemplo, puedes extraer una superclase
de una clase con un solo comando. Puedes renombrar variables,extraer
métodos y convertir la herencia en composición, entre otras muchas
grandes características.
Con estas herramientas, la edición de código ya no consiste en líneas y
caracteres, sino en complejas manipulaciones. En lugar de pensar en los
próximos caracteres y líneas que hay que escribir, se piensa en las próximas
transformaciones que hay que hacer. En resumen, el modelo de
programación es notablemente diferente y muy productivo.
Por supuesto, esta potencia tiene un coste. La curva de aprendizaje es
alta, y el tiempo de preparación del proyecto no es insignificante.
Estas herramientas no son ligeras. Necesitan muchos recursos
informáticos para funcionar.
TextMate
TextMate es potente y ligero. No puede hacer las maravillosas
manipulaciones que pueden hacer IntelliJ y Eclipse. No tiene el potente
motor y biblioteca lisp de Emacs. No tiene la velocidad y fluidez de
vi. Por otro lado, la curva de aprendizaje es pequeña y su
funcionamiento es intuitivo.
Yo uso TextMate de vez en cuando, especialmente para el C++
ocasional. Usaría Emacs para un proyecto grande de C++, pero estoy
demasiado oxidado para molestarme con
Emacs para las pequeñas tareas de C++ que tengo.
Seguimiento de los problemas
En este momento estoy utilizando Pivotal Tracker. Es un sistema elegante y
sencillo de utilizar. Encaja muy bien con el enfoque ágil/iterativo. Permite
que todas las partes interesadas y los desarrolladores se comuniquen
rápidamente. Estoy muy satisfecho con él.
Para proyectos muy pequeños, a veces he utilizado Lighthouse. Es muy
rápido y fácil de configurar y utilizar. Pero no se acerca a la potencia de
Tracker.
También he utilizado simplemente un wiki. Los wikis están bien para
proyectos internos. Te permiten establecer el esquema que quieras. No te
obligan a seguir un determinado proceso o una estructura rígida. Son muy
fáciles de entender y utilizar.
A veces, el mejor sistema de seguimiento de asuntos es un conjunto de
tarjetas y un tablón de anuncios. El tablón de anuncios se divide en
columnas como "Por hacer", "En curso" y "Hecho". Los desarrolladores se
limitan a mover las tarjetas de una columna a la siguiente cuando sea
oportuno. De hecho, este puede ser el sistema de seguimiento de problemas
más común que utilizan los equipos ágiles hoy en día.
La recomendación que hago a los clientes es que empiecen con un sistema
manual como el tablón de anuncios antes de comprar una herramienta de
seguimiento. Una vez que domine el sistema manual, tendrá los
conocimientos necesarios para elegir la herramienta adecuada. Y, de hecho,
la elección adecuada puede ser simplemente seguir utilizando el sistema
manual.
Recuento de insectos
Los equipos de desarrolladores necesitan, sin duda, una lista de problemas
en los que trabajar. Estos problemas incluyen nuevas tareas y
características, así como errores. Para cualquier equipo de tamaño
razonable (de 5 a 12 desarrolladores) el tamaño de esa lista debería ser de
docenas a cientos. No miles.
Si tienes miles de errores, algo va mal. Si tienes miles de características y/o
tareas, algo va mal. En general, la lista de problemas debe ser relativamente
pequeña, y por lo tanto manejable con una herramienta ligera como un wiki,
Lighthouse, o Tracker.
Hay algunas herramientas comerciales que parecen ser bastante buenas.
Hevisto que los clientes las utilizan pero no he tenido la oportunidad de
trabajar con ellas
directamente. No me opongo a este tipo de herramientas, siempre que
el número de problemas sea pequeño y manejable. Cuando las
herramientasde seguimiento de incidencias se ven obligadas a seguir miles
de ellas, la palabra "seguimiento" pierde su significado. Se convierten en
"vertederosde problemas" (y a menudo también huelen a vertedero).
Construcción continua
Últimamente he estado usando Jenkins como mi motor de construcción
continua. Es ligero, sencillo y casi no tiene curva de aprendizaje. Lo
descargas, lo ejecutas, haces algunas configuraciones rápidas y sencillas, y
ya estás en marcha.
Muy bonito.
Mi filosofía sobre la construcción continua es simple: Conéctalo a tu
sistema de control de código fuente. Cada vez que alguien revise el código,
debería construirse automáticamente e informar del estado al equipo.
El equipo debe limitarse a mantener la construcción en funcionamiento en
todo momento. Si la compilación falla, debe ser un evento de "parar las
prensas" y el equipo debe reunirse para resolver rápidamente el problema.
En ningún caso debe permitirse que el fallo persista durante un día o más.
Para el proyecto FITNESSE, hago que todos los desarrolladores ejecuten el
script de construcción continua antes de confirmar. La compilación tarda
menos de 5 minutos, por lo que no es onerosa. Si hay problemas, los
desarrolladores los resuelven antes de la confirmación. Así que la
compilación automática rara vez tiene problemas. La fuente más común de
fallos en la compilación automática resulta ser problemas relacionados conel
entorno, ya que mi entorno de compilación automática es bastante diferente
de los entornos de desarrollo de los desarrolladores.
Herramientas de pruebas unitarias
Cada lenguaje tiene su propia herramienta de pruebas unitarias. Mis
favoritas son JUNIT para Java, RSPEC para Ruby, NUNIT para .Net,Midje
para Clojure, y CPPUTEST para C y C++.
Sea cual sea la herramienta de pruebas unitarias que elija, hay algunas
características básicas que todas deberían soportar.
l. Debe ser rápido y fácil ejecutar las pruebas. Que esto se haga a
través de plugins del IDE o de simples herramientas de línea de
comandos es irrelevante, siempre y cuando los
desarrolladores puedan ejecutar esas pruebas a su antojo. El gesto
de ejecutar laspruebas debe ser trivial.
Por ejemplo, yo ejecuto mis pruebas CPPUTEST escribiendo command-M
en TextMate. Tengo este comando configurado para ejecutar mi makefile
que automáticamente ejecuta las pruebas e imprime un informe de una
línea si todas las pruebas pasan. Tanto JUNIT como RSPEC son
compatibles con INTELLIJ, así que todo lo que tengo que hacer es pulsar
un botón. Para NUNIT, utilizo el plugin RESHARPER para que me dé el
botón de prueba.
2. La herramienta debe darle una clara indicación visual de
aprobado/desaprobado. No importa si se trata de una barra verde
gráfica o de un mensaje de consola que diga "Todas las pruebas
pasan". La cuestión es que debe poder decir que todas las pruebas han
sido aprobadas rápidamente y sin ambigüedades. Si tiene que leer un
informe de varias líneas, o peor aún, comparar la salida de dos
archivos para saber si las pruebas pasaron, entonces ha fallado en este
punto.
3. La herramienta debe darle una clara indicación visual del progreso.
No importa si se trata de un medidor gráfico o de una cadena de
puntos, siempre y cuando puedas saber que se sigue avanzando y
que las pruebas no se han estancado o abortado.
4. La herramienta debe evitar que los casos de prueba individuales se
comuniquen entre sí. JUNIT lo hace creando una nueva instancia de la
clase de prueba para cada método de prueba, evitando así que las
pruebas utilicen variables de instancia para comunicarse entre sí. Otras
herramientas ejecutan los métodos de prueba en orden aleatorio para
que no se pueda depender de que una prueba preceda a otra. Sea cual
sea el mecanismo, la herramienta debe ayudarle a mantener sus pruebas
independientes entre sí. Las pruebas dependientes son una profunda
trampa en la que no se quiere caer.
5. La herramienta debe facilitar la escritura de pruebas. JUNIT lo hace
proporcionando una cómoda API para realizar aserciones. También
utiliza la reflexión y los atributos de Java para distinguir las funciones
de prueba de las funciones normales. Esto permite que un buen IDE
identifique automáticamente todas sus pruebas, eliminando la molestia
de cablear suites y crear listas de pruebas propensas a errores.
A
Pruebas de aceptación
automatizadas, 103-
105
comunicación y, 103
integración continua y, 110-111
definición de, 100
el papel del desarrollador en,
106-107 el trabajo extra y, 105
GUTs y, 109-111
negociación y, 107-108 agresión
pasiva y, 107-108 momento de,
105-106
pruebas unitarias y, 108-109
escritores de, 105-106
Roles adversos, 26-29
Estimación de afinidad, 146-147
Ambigüedad, en los requisitos, 98-
100 Disculpas, 12
Aprendices, 183
Aprendizaje, 180-184
Argumentos, en las reuniones,
126-127 Arrogancia, 22
Pruebas de aceptación automatizadas,
103-105 Garantía de calidad
automatizada, 14 Evitar, 131
B
Callejones sin salida, 131-132
Bossavit, Laurent, 89
Juego de bolos, 89
Ramificación, 191
Recuento de errores, 197
Objetivos empresariales, 160
C
Cafeína, 128
Certeza,
código 80
control, 189-194
propiedad, 163
3 AM, 59-60
preocupación, 60-61
Coding Dojo, 89-93
Colaboración, 20, 157-166
Propiedad colectiva, 163-164
Compromiso(s), 47-52
control y, 50
disciplina y, 53-56
estimación y, 138
expectativas y, 51
identificar, 49-50
implícito, 140-141
importancia de, 138
falta de, 48-49
presión y, 152
Comunicación
pruebas de aceptación y,
103 presión y, 154
de los requisitos, 95-100
Pruebas de los componentes
en la estrategia de pruebas, 116-117
herramientas para, 199-
200 Conflicto, en las
reuniones, 126-127
Construcción continua, 197-198
Integración continua, 110-111
Aprendizaje continuo, 19
Control, compromiso y, 50
Valor, 81-82
Artesanía, 184
Aportación creativa, 65-66, 129
Disciplina de crisis, 153 Pepino,
200
Cliente, identificación con, 21
CVS, 191
Tiempo de ciclo, en el desarrollo dirigido por pruebas, 78
D
Plazos
entrega falsa y, 73
esperanza y, 71
horas extras y, 72
la prisa y, 71-72
Depuración, 66-69 Tasa
de inyección de
defectos, 81 Reuniones
de demostración, 126
Diseño, desarrollo dirigido por pruebas y, 82-83
Patrones de diseño, 18
Principios de diseño, 18
Detalles, 201-203
Desarrollo. ver desarrollo dirigido por pruebas
(TDD) Desacuerdos, en reuniones, 126-127
Disciplina
compromiso y, 53-56
crisis, 153
Desenganche, 70
Documentación, 82
Dominio, conocimiento de, 21
"Hecho", definición, 73, 100-103
Enfoque de "no hacer daño", 11- 16
a la función, 11-14
a la estructura, 14-16
Conducción, 70
E
Eclipse, 195-196
Emacs, 195
Empleador(
es)
identificación con, 21
programadores vs. , 159-162
Estimación
afinidad, 146-147
ansiedad, 98
compromiso y, 138
definición de, 138-139
ley de los grandes números y,
147 nominal, 142
optimista, 141-142
PERT y, 141-144
pesimista, 142
probabilidad y, 139 de
las tareas, 144-147
trivariado, 147
Expectativas, compromiso y, 51
Experiencia, ampliación, 93
F
Fracaso, grados de, 174
Falso parto, 73
FitNesse, 199-200
Flexibilidad, 15
Zona de flujo, 62-
64 Dedos voladores,
145
Focus, 127-129
Función, en el enfoque de "no hacer daño", 11-14
G
Gaillot, Emmanuel, 89
Equipo de gelatina, 168-170
Git, 191-194
Objetivos, 26-29, 124
Interfaces gráficas de usuario (GUT),
109-111 Green Pepper, 200
Grenning, James, 145
GUTs, 109-111
H
Golpes duros, 179-180
Ayuda, 73-76
dando, 74
la tutoría y, 75-76
presión y, 154-155
recibir, 74-75
"Esperanza", 48
Esperanza, plazos y, 71
Humildad, 22
I
TDE/editor, 194
Tdentificación, con el empleador/cliente, 21
Compromisos implícitos, 140-141
Tnput, creativo, 65-66, 129
Tntegración, continua, 110-111
Pruebas de tntegración
en la estrategia de pruebas, 117-118
herramientas para, 200-201
TntelliJ, 195-196
Tnterns, 183
Interrupciones, 63-64
Tssue tracking, 196-197
Tteration planning meetings, 125
Reuniones retrospectivas de tteración, 126
J
JBehave, 200
Oficiales, 182-183
K
Kata, 90-91
Conocimient
o
de dominio, 21
mínimo, 18
ética del trabajo y, 17-19
L
Retrasos, 71-73
Ley de los grandes números,
147 Aprendizaje, ética del
trabajo y, 19 "Vamos", 48
Lindstrom, Lowell, 146
Cierre, 190
M
Pruebas exploratorias manuales, en la estrategia de
pruebas, 118-119 Maestros, 182
MDA, 201-203
Reuniones
agenda en, 124
argumentos y desacuerdos en, 126-127
en declive, 123
demostración, 126
objetivos en, 124
planificación de la iteración, 125
iteración retrospectiva, 126
saliendo, 124
de pie, 125
gestión del tiempo y, 122-127
Tutoría, 20-21, 75-76, 174-180
Refactorización despiadada, 15
Líos, 132-133, 152
Métodos, 18
Arquitectura dirigida por modelos (MDA), 201-
203 Enfoque muscular, 129
Música, 63
N
"Necesidad", 48
Negociación, pruebas de aceptación y, 107-108
Estimación nominal, 142
No profesional, 8
0
Código abierto, 93
Estimación optimista, 141-142
Cierre optimista, 190
Resultados, lo mejor posible, 26-29
Horas extras, 72
Código propio, 163
Propiedad, colectiva, 163-164
p
El ritmo, 69-70
Emparejamiento, 64, 154-155, 164
Pánico, 153-154
Pasión, 160
Agresión pasiva, 34-36, 107-108
Personas, programadores vs. , 159-164
Problemas personales, 60-61
PERT (Técnica de Evaluación y Revisión de Programas), 141-144
Estimación pesimista, 142
Cierre pesimista, 190
Actividad física, 129
Planificación del póquer,
145-146 Práctica
antecedentes, 86-89
ética, 93
experiencia y, 93 tiempo de
entrega y, 88-89 ética de
trabajo y, 19-20
Precisión, prematura, en los requisitos, 97-98
Preparación, 58-61
Presión
evitar, 151-153
limpieza y, 152
compromisos y, 152
comunicación y, 154
manipulación, 153-155
ayuda y, 154-155
desórdenes y, 152
pánico y, 153-154
Inversión de la prioridad, 131
Probabilidad, 139
Profesionalidad, 8
programadores
empleadores vs. , 159-162
personas vs. , 159-164
programadores vs. ,
163Propuesta, proyecto, 37-
38
Q
Garantía de calidad
(QA)
automatizada, 14
como cazabichos, 12
como caracterizadores, 114-115
ideal de, como no encontrar problemas, 114-
115 problemas encontrados por, 12-13
como especificadores, 114
como miembro del equipo, 114
R
Randori, 92-93
La lectura, como aportación
creativa, 65 Recarga, 128-
129
Reputación,
11 Requisitos
comunicación de, 95-100
ansiedad de estimación y, 98
ambigüedad tardía en, 98-100
precisión prematura en, 97-98
incertidumbre y, 97-98
Responsabilidad, 8-11
disculpas y, 12
enfoque de "no hacer daño" y, 11-
16 función y, 11-14
estructura y, 14-16 ética
del trabajo y, 16-22
RobotFX, 200
Roles, adversarios, 26-29
Correr, 40-41, 71-72
s
Santana, Carlos, 89
"Debería", 48
Ducha, 70
Simplicidad, 40
Dormir, 128
Control del código fuente, 189-
194 Estacas, 29-30
Reuniones de pie, 125
Estructura
en el enfoque de "no hacer daño",
14-16 flexibilidad y, 15
importancia de, 14
SVN, 191-194
Pruebas del sistema, en la estrategia de pruebas, 118
T
Estimación de tareas, 144-147
Equipos y trabajo en equipo,
30-36
gelificado, 168-170
gestión de, 170
agresión pasiva y, 34-36
preservando, 169
proyecto iniciado, 169-170
dilema del propietario del proyecto con,
170-171 intentar y, 32-34
velocidad de, 170
Desarrollo dirigido por pruebas
(TDD), 80 beneficios de, 80-
Suscríbete a DeepL Pro para poder traducir archivos de mayor tamaño.
Más información disponible en www.DeepL.com/pro.
83
la certeza y, 80
valor y, 81-82 tiempo
de ciclo en, 78 debut
de, 77-78
tasa de inyección de
defectos y, 81 definición
de, 13-14
diseño y, 82-83
documentación y, 82
interrupciones y, 64
tres leyes de, 79-80
lo que no es, 83-84
Prueba
aceptación
automatizado, 103-105
comunicación y, 103
integración continua y, 110-111
definición de, 100
el papel del desarrollador en,
106-107 el trabajo extra y, 105
GUTs y, 109-111
negociación y, 107-108 agresión
pasiva y, 107-108 momento de,
105-106
pruebas unitarias y,
108-109 escritores de,
105-106
pirámide de automatización, 115-119
componente
en la estrategia de pruebas,
116-117 herramientas para,
199-200
importancia de, 13-14
integración
en la estrategia de pruebas,
117-118 herramientas para,
200-201
manual exploratorio, 118-119
estructura
y, 15sistema,
unidad 118
pruebas de aceptación y, 108-
109 en la estrategia de pruebas,
116
herramientas para, 198-199
TextMate, 196
Thomas, Dave, 90
3 Código AM, 59-60
Tiempo, depuración,
69 Gestión del tiempo
evasión y, 131
callejones sin salida y, 131-
132 ejemplos de, 122
enfoque y, 127-129
reuniones y, 122-127 líos
y, 132-133 inversiónde
prioridad y, 131
recarga y, 128-129 técnica
de "tomates" para,
130 Cansancio, 59-60
Técnica de gestión del tiempo "Tomates",
130 Herramientas, 189
Estimaciones trivariadas, 147 Tiempo
de entrega, práctica y, 88-89
U
UML, 201
Incertidumbre, requisitos y, 97-98 Tutoría no
convencional. 179 Véase también tutoría Pruebas
unitarias
pruebas de aceptación y, 108-
109 en la estrategia de
pruebas, 116
herramientas para, 198-199
V
Vi, 194
w
Alejándose, 70
Wasa, 91-92
Delphi de banda ancha, 144-147
"Deseo", 48
Ética del trabajo, 16-22
colaboración y, 20
aprendizaje continuo y, 19
conocimiento y, 17-19
la tutoría y, 20-21
práctica y, 19-20
Código de la preocupación, 60-61
Bloqueo del escritor, 64-66
y
"Sí"
coste de, 36-40
aprender a decir, 52-56
Notas a pie de página
Capítulo 2
1 Como Foghorn Leghorn: "Siempre tengo las plumas numeradas para
una emergencia así".
2 http://raptureinvenice.com/?p=63
3 Con la posible excepción del empleador directo de John, aunque T
apostaría que ellos también perdieron.
Capítulo 3
1 No es que la patente valiera dinero para mí. T la había vendido a
Teradyne por un dólar, según mi contrato de trabajo (y T no se quedó
con el dólar).
Capítulo 4
1 [Martin09]
2 [Martin03]
3 No conozco ninguna disciplina que sea tan eficaz como el TDD, pero
quizás tú sí.
4 Hay mucho más sobre esto en el capítulo sobre estimaciones.
5 Véase el capítulo 7, "Pruebas de aceptación".
6 Esto es mucho más cierto para los hombres que para las mujeres.
T tuvo una maravillosa conversación con @desi (Desi McAdam,
fundadora de DevChix) sobre lo que motiva a las mujeres
programadoras. T le dijo que cuando conseguía que un programa
funcionara, era como matar a la gran bestia. Me dijo que para ella y
para otras mujeres con las que había hablado, el acto de escribir código
era un acto de creación nutritiva.
Capítulo 5
1 Desde mi punto de vista, un niño es cualquier persona menor de 35 años.
Durante mis veinte años, T pasó una gran cantidad de tiempo
escribiendo pequeños juegos tontos en lenguajes interpretados. Escribió
juegos de guerra espacial, juegos de aventura, juegos de carreras de
caballos, juegos de serpientes, juegos de azar, de todo.
2 http://fitnesse.org
3 El noventa por ciento es un mínimo. En realidad, la cifra es mayor que
eso. La cantidad exacta es difícil de calcular porque las herramientas
de cobertura no pueden ver el código que se ejecuta en procesos
externos o en bloques de captura.
4 http://www.objectmentor.com/omSolutions/agile_customers.html
5 [Maximilien], [George2003], [Janzen2005], [Nagappan2008]
Capítulo 6
1 El hecho de que algunos programadores esperen a las
compilaciones es trágico e indica una falta de cuidado. En el
mundo actual, los tiempos de compilación deberían medirse en
segundos, no en minutos, y desde luego no en horas.
2 Se trata de una técnica que Rich Hickey denomina HDD (Hammock-
Driven Development).
3 Esta se ha convertido en una kata muy popular, y una búsqueda en
Google encontrará muchas instancias de la misma. El original está
aquí:
http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata.
4 Utilizamos el prefijo "Pragmático" para desambiguarlo del "Gran"
Dave Thomas de OTT.
5 http://codekata.pragprog.com
6 http://codingdojo.org/
7 http://katas.softwarecraftsmanship.org/?p=71
8 http://c2.com/cgi/wiki?PairProgrammingPingPongPattern
Capítulo 7
1 XPTmmersion
3,Mayo,2000.http://c2.com/cgi/wiki?TomsTalkAtXp
TmmersionThree
Capítulo 8
1 http://www.satisfice.com/articles/what_is_et.shtml2
[COHN09] pp. 311-312
Capítulo 9
1 El maná es un producto común en los juegos de fantasía y de rol como
Dragones y Mazmorras. Cada jugador tiene una cierta cantidad de
maná, que es una sustancia mágica que se gasta cada vez que un
jugador lanza un hechizo mágico. Cuanto más potente sea el hechizo,
más maná consumirá el jugador. El maná se recarga a un ritmo diario
lento y fijo. Así que es fácil agotarlo en unas pocas sesiones de
lanzamiento de hechizos.
2 http://www.pomodorotechnique.com/
Capítulo 10
1 La Ley de Murphy sostiene que si algo puede salir mal, saldrá mal.
2 El número exacto para una distribución normal es 1:769, o el 0,13%,o
3 sigma. Las probabilidades de uno entre mil son probablemente
seguras.
3 El PERT supone que esto se aproxima a una distribución beta. Esto
tiene sentido, ya que la duración mínima de una tarea suele ser mucho
más cierta que la máxima. [McConnell2006] Fig. 1-3.
4 Si no sabes lo que es una desviación estándar, deberías encontrar un
buen resumen de probabilidad y estadística. El concepto no es difícil
de entender y te servirá mucho.
5 [Boehm81]
6 [Grenning2002]
7 http://store.mountaingoatsoftware.com/products/planning-poker-cards
8 http://en.wikipedia.org/wiki/Law_of_large_numbers
Capítulo 12
1 Una referencia a la última palabra de la película Soylent Green.
Capítulo 13
1 [RCM2003] pp. 20-22; [COHN2006] Busque en el índice muchas
referencias excelentes sobre la velocidad.
Capítulo 14
1 Hay muchos sitios web que ofrecen simuladores de este pequeño y
estimulante ordenador.
2 Todavía tengo este manual. Ocupa un lugar de honor en una
de mis estanterías.
Apéndice A
1 Estas cintas sólo podían moverse en una dirección. Así que cuando se
producía un error de lectura, no había forma de que la unidad de cinta
retrocediera y volviera a leer. Había que dejar lo que se estaba haciendo,
enviar la cinta de vuelta al punto de carga y volver a empezar. Esto
ocurría dos o tres veces al día. Los errores de escritura también eran
muy comunes, y la unidad no tenía forma de detectarlos. Así que
siempre escribíamos las cintas de dos en dos y comprobábamos los
pares cuando terminábamos. Si una de las cintas estaba mal, hacíamos
inmediatamente una copia. Si ambas estaban mal,lo que era muy poco
frecuente, volvíamos a empezar toda la operación.Así era la vida en los
años 70.
2 http://en.wikipedia.org/wiki/ASR-33_Teletype
3 Los caracteres de borrado eran muy útiles para editar cintas de papel.
Por convención, los caracteres de borrado se ignoraban. Su código,
0×FF, significaba que todos los agujeros de esa fila de la cinta estaban
perforados. Esto significaba que cualquier carácter podía convertirse
en un rubout sobreperforándolo.
Por lo tanto, si cometieras un error mientras escribes tu programa,
podrías retroceder el golpe y pulsar rubout, para luego continuar
escribiendo.
Dogram Code
https://dogramcode.com/programacion