Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
El programador pragmático es uno de esos raros casos de libros técnicos que se leen, se releen y se vuelven a leer durante años. Tanto si es nuevo en el campo como si es un profesional experimentado, acabará encontrando ideas nuevas cada vez. Dave Thomas y Andy Hunt escribieron la primera edición de este libro tan influyente en 1999 para ayudar a sus clientes a crear software mejor y a redescubrir el placer de escribir código. Estas lecciones han ayudado a una generación de programadores a examinar la propia esencia del desarrollo de software, independientemente de cualquier lenguaje, framework o metodología en particular, y la filosofía pragmática ha sido el germen de cientos de libros, screencasts y audiolibros, además de miles de carreras e historias de éxito. Ahora, más de veinte años después, esta nueva edición reexamina lo que significa ser un programador moderno. Los temas abarcan desde la responsabilidad personal y el desarrollo profesional hasta técnicas de arquitectura para mantener su código flexible y fácil de adaptar y reutilizar. Escrito como una serie de secciones independientes y repleto de anécdotas clásicas y nuevas, ejemplos razonados y analogías interesantes, este libro ilustra los mejores enfoques y los mayores obstáculos de muchos aspectos diferentes del desarrollo de software. No importa si es un novato, un programador con experiencia o un director responsable de proyectos de software, utilice estas lecciones en su día a día y pronto observará mejorías en su productividad personal, exactitud y satisfacción laboral. Aprenderá las habilidades y desarrollará los hábitos y actitudes que forman los cimientos del éxito a largo plazo en su carrera.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 542
Veröffentlichungsjahr: 2022
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Para Juliet y Ellie,Zachary y Elizabeth,Henry y Stuart
Hemos disfrutado de literalmente miles de conversaciones sobre programación en los últimos 20 años, hemos conocido a muchas personas en conferencias, cursos y, a veces, incluso en el avión. Cada una de ellas ha aportado algo a nuestra comprensión del proceso de desarrollo y ha contribuido a las actualizaciones de esta edición. Gracias a todas esas personas (y seguid avisándonos cuando nos equivoquemos).
Gracias a los participantes en el proceso beta del libro. Vuestras preguntas y comentarios nos han ayudado a explicar las cosas mejor.
Antes de pasar a la fase beta, compartimos el libro con algunos colegas para recibir sus opiniones. Gracias a VM (Vicky) Brasseur, Jeff Langr y Kim Shrier por sus comentarios detallados y a José Valim y Nick Cuthbert por las revisiones técnicas.
Gracias a Ron Jeffries por dejarnos utilizar el ejemplo del sudoku.
Eterna gratitud al personal de Pearson que accedió a dejar que creásemos este libro a nuestra manera.
Un agradecimiento especial a la indispensable Janet Furlow, que domina todo lo que toca y nos mantiene a raya.
Y, por último, una mención a todos los programadores pragmáticos del mundo que han estado haciendo que la programación sea mejor para todo el mundo durante los últimos veinte años. Por otros veinte más.
David Thomas y Andrew Hunt son dos de las voces más conocidas y prestigiosas en la comunidad de desarrollo de software. Ponentes y conferenciantes por todo el mundo. Juntos, fundaron la colección Pragmatic Bookshelf, que publica libros de vanguardia galardonados para desarrolladores de software. También fueron dos de los firmantes y autores del Manifiesto Ágil, considerado la biblia de las metodologías ágiles y del desarrollo de software.
Dave actualmente enseña en la universidad, tornea madera y juega con nuevas tecnologías y paradigmas.
Andy escribe ciencia ficción, es un músico activo y le encanta jugar con la tecnología.
Agradecimientos de la segunda edición
Sobre los autores
Prólogo
Prefacio de la segunda edición
Cómo se organiza el libro
¿Qué hay en un nombre?
Código fuente y otros recursos
Del prefacio de la primera edición
¿Quién debería leer este libro?
¿Qué hace a un programador pragmático?
Pragmatistas individuales, equipos grandes
Es un proceso continuo
1. Una filosofía pragmática
1 Es su vida
Las secciones relacionadas incluyen
2 El gato se comió mi código fuente
Confianza del equipo
Asuma la responsabilidad
Las secciones relacionadas incluyen
Retos
3 Entropía del software
Primero, no haga daño
Las secciones relacionadas incluyen
Retos
4 Sopa de piedras y ranas hervidas
El lado de los aldeanos
Las secciones relacionadas incluyen
Retos
5 Software lo bastante bueno
Implique a sus usuarios en la compensación
Saber cuándo parar
Las secciones relacionadas incluyen
Retos
6 Su cartera de conocimientos
Su cartera de conocimientos
La creación de su cartera
Objetivos
Oportunidades para el aprendizaje
Pensamiento crítico
Las secciones relacionadas incluyen
Retos
7 ¡Comuníquese!
Conozca a su público
Sepa lo que quiere decir
Elija el momento
Elija un estilo
Dele un buen aspecto
Involucre a su público
Sepa escuchar
Responda a la gente
Documentación
Resumen
Las secciones relacionadas incluyen
Retos
2. Un enfoque pragmático
8 La esencia del buen diseño
ETC es un valor, no una regla
Las secciones relacionadas incluyen
Retos
9 DRY: los males de la duplicación
DRY es más que código
Duplicación en el código
Duplicación en la documentación
Duplicación relativa a la representación
Las secciones relacionadas incluyen
10 Ortogonalidad
¿Qué es la ortogonalidad?
Beneficios de la ortogonalidad
Diseño
Herramientas y bibliotecas
Creación de código
Pruebas
Documentación
Vivir con ortogonalidad
Las secciones relacionadas incluyen
Retos
Ejercicios
11 Reversibilidad
Reversibilidad
Arquitectura flexible
Las secciones relacionadas incluyen
Retos
12 Balas trazadoras
Código que brilla en la oscuridad
Las balas trazadoras no siempre dan en el blanco
Código trazador versus creación de prototipos
Las secciones relacionadas incluyen
13 Prototipos y notas en post-its
Cosas para las que puede crear prototipos
Cómo utilizar prototipos
Crear prototipos de arquitectura
Cómo no utilizar prototipos
Las secciones relacionadas incluyen
Ejercicios
14 Lenguajes de dominio
Algunos lenguajes de dominio del mundo real
Características de los lenguajes de dominio
Compensaciones entre lenguajes internos y externos
Un lenguaje de dominio interno de bajo coste
Las secciones relacionadas incluyen
Retos
Ejercicios
15 Estimaciones
¿Cuánta exactitud es suficiente exactitud?
¿De dónde vienen las estimaciones?
Estimar el calendario de los proyectos
Qué decir cuando le pidan una estimación
Las secciones relacionadas incluyen
Retos
Ejercicios
3. Las herramientas básicas
16 El poder del texto simple
¿Qué es el texto simple?
El poder del texto
Mínimo común denominador
Las secciones relacionadas incluyen
Retos
17 Jugar con el intérprete de comandos
Su propio intérprete de comandos
Las secciones relacionadas incluyen
Retos
18 Edición potente
¿Qué significa “fluidez”?
Avanzar hacia la fluidez
Las secciones relacionadas incluyen
Retos
19 Control de versiones
Empieza en la fuente
Ramificaciones
Control de versiones como centro de proyectos
Las secciones relacionadas incluyen
Retos
20 Depuración
Psicología de la depuración
Mentalidad de la depuración
Por dónde empezar
Estrategias de depuración
Programador en tierras extrañas
La búsqueda binaria
El elemento sorpresa
Lista de comprobación de depuración
Las secciones relacionadas incluyen
Retos
21 Manipulación de texto
Las secciones relacionadas incluyen
Ejercicios
22 Cuadernos de bitácora de ingeniería
Las secciones relacionadas incluyen
4. Paranoia pragmática
23 Diseño por contrato
DBC
Implementar DBC
DBC y fallo total temprano
Invariantes semánticas
Contratos dinámicos y agentes
Las secciones relacionadas incluyen
Retos
Ejercicios
24 Los programas muertos no mienten
La captura y liberación es para la pesca
Fallo total, no basura
Las secciones relacionadas incluyen
25 Programación asertiva
Aserciones y efectos secundarios
Deje las aserciones activadas
Las secciones relacionadas incluyen
26 Cómo equilibrar los recursos
Anidar asignaciones
Objetos y excepciones
Equilibrio y excepciones
Cuando no podemos equilibrar los recursos
Comprobar el equilibrio
Las secciones relacionadas incluyen
Retos
Ejercicios
27 No vaya más rápido que sus faros
Cisnes negros
Las secciones relacionadas incluyen
5. O se adapta o se rompe
28 Desacoplamiento
Train Wrecks
Los males de la globalización
La herencia añade acoplamiento
De nuevo, todo tiene que ver con el cambio
Las secciones relacionadas incluyen
29 Malabares con el mundo real
Eventos
Máquinas de estados finitos
El patrón Observer
Publish/Subscribe
Programación reactiva, streams y eventos
Los eventos son ubicuos
Las secciones relacionadas incluyen
Ejercicios
30 Transformar la programación
Encontrar transformaciones
¿Por qué es esto tan genial?
¿Qué pasa con el manejo de errores?
Las transformaciones transforman la programación
Las secciones relacionadas incluyen
Ejercicio
31 Impuesto sobre la herencia
Algo de historia
Problema de usar la herencia al compartir código
Las alternativas son mejores
La herencia rara vez es la respuesta
Las secciones relacionadas incluyen
Retos
32 Configuración
Configuración estática
Configuración como servicio
No escriba código dodo
Las secciones relacionadas incluyen
6. Concurrencia
Todo es concurrente
33 Romper el acoplamiento temporal
Buscar la concurrencia
Oportunidades para la concurrencia
Oportunidades para el paralelismo
Identificar oportunidades es la parte fácil
Las secciones relacionadas incluyen
Retos
34 Estado compartido es estado incorrecto
Actualizaciones no atómicas
Transacciones de recursos múltiples
Actualizaciones no transaccionales
Otros tipos de accesos exclusivos
Doctor, me hago daño...
Las secciones relacionadas incluyen
35 Actores y procesos
Los actores solo pueden ser concurrentes
Un actor simple
Sin concurrencia explícita
Erlang prepara el escenario
Las secciones relacionadas incluyen
Retos
36 Pizarras
Una pizarra en acción
Los sistemas de mensajería pueden ser como pizarras
Pero no es tan simple...
Las secciones relacionadas incluyen
Ejercicios
Retos
7. Mientras escribe código
37 Escuche a su cerebro reptiliano
Miedo a la página en blanco
Luche contra sí mismo
Cómo hablar lagarto
¡Hora de jugar!
No solo su código
No solo código
Las secciones relacionadas incluyen
Retos
38 Programar por casualidad
Cómo programar por casualidad
Cómo programar de forma deliberada
Las secciones relacionadas incluyen
Ejercicios
39 Velocidad de los algoritmos
¿Qué queremos decir con estimar algoritmos?
Notación Big O
Estimación con sentido común
Velocidad de los algoritmos en la práctica
Las secciones relacionadas incluyen
Retos
Ejercicios
40 Refactorización
¿Cuándo deberíamos refactorizar?
¿Cómo refactorizamos?
Las secciones relacionadas incluyen
41 Probar para escribir código
Pensar en las pruebas
Escritura de código guiada por pruebas
TDD: necesita saber adónde va
De vuelta al código
Pruebas unitarias
Pruebas en relación con el contrato
Pruebas ad hoc
Construya una ventana de pruebas
Una cultura de pruebas
Las secciones relacionadas incluyen
42 Pruebas basadas en propiedades
Contratos, invariantes y propiedades
Generación de datos de prueba
Encontrar asunciones malas
Las pruebas basadas en propiedades nos sorprenden a menudo
Las pruebas basadas en propiedades también ayudan al diseño
Las secciones relacionadas incluyen
Ejercicios
Retos
43 Tenga cuidado ahí fuera
El otro 90 %
Principios de seguridad básicos
Sentido común vs. criptografía
Las secciones relacionadas incluyen
44 Poner nombre a las cosas
Respetar la cultura
Coherencia
Cambiar nombres es aún más difícil
Las secciones relacionadas incluyen
Retos
8. Antes del proyecto
45 El pozo de los requisitos
El mito de los requisitos
Programar como terapia
Los requisitos son un proceso
Póngase en la piel del cliente
Requisitos frente a política
Requisitos frente a realidad
Documentar requisitos
Sobreespecificación
Solo una cosita más...
Mantenga un glosario
Las secciones relacionadas incluyen
Ejercicios
Retos
46 Resolver rompecabezas imposibles
Grados de libertad
¡No se estorbe a sí mismo!
La suerte favorece a la mente preparada
Las secciones relacionadas incluyen
Retos
47 Trabajar juntos
Programación en pareja
Programación en grupo
¿Qué debería hacer?
48 La esencia de la agilidad
Nunca puede haber un proceso ágil
Entonces, ¿qué hacemos?
Y esto dirige el diseño
Las secciones relacionadas incluyen
Retos
9. Proyectos pragmáticos
49 Equipos pragmáticos
Sin ventanas rotas
Ranas hervidas
Planifique su cartera de conocimientos
Comunique la presencia del equipo
No se repitan
Balas trazadoras en equipos
Automatización
Saber cuándo dejar de añadir pintura
Las secciones relacionadas incluyen
Retos
50 Los cocos no sirven
El contexto importa
La talla única no le queda bien a nadie
El objetivo real
Las secciones relacionadas incluyen
51 Kit pragmático básico
Dirija con el control de versiones
Pruebas despiadadas y continuas
Reforzar la red
Automatización completa
Las secciones relacionadas incluyen
Retos
52 Deleite a sus usuarios
Las secciones relacionadas incluyen
53 Orgullo y prejuicio
Posfacio
La brújula moral
Imagine el futuro que quiere
Bibliografía
Posibles respuestas a los ejercicios
Créditos
Recuerdo cuando Dave y Andy tuitearon por primera vez acerca de la nueva edición de este libro. Fue una gran noticia. Vi como la comunidad de creadores de código respondía con entusiasmo. Mi página de inicio bullía con expectación. Después de más de veinte años, El programador pragmático es tan relevante hoy como lo era entonces.
Es muy significativo que un libro con tanta historia generase semejante reacción. Tuve el privilegio de leer una copia inédita para escribir este prólogo, y entendí por qué había causado tanto alboroto. Aunque se trata de un libro técnico, no es justo llamarlo así. Los libros técnicos a menudo intimidan. Están repletos de palabras imponentes, términos confusos, ejemplos enrevesados que, sin querer, hacen que te sientas estúpido. Cuanto más experimentado es el autor, más fácil es olvidar cómo es aprender conceptos nuevos, ser un principiante.
A pesar de sus décadas de experiencia en programación, Dave y Andy han superado el difícil reto de escribir con el entusiasmo de personas que acaban de aprender estas lecciones. No nos hablan con condescendencia. No asumen que somos expertos. Ni siquiera dan por hecho que hemos leído la primera edición. Nos aceptan como somos, programadores que quieren ser mejores, sin más. Dedican las páginas de este libro a ayudarnos a conseguirlo, paso factible a paso factible.
Para ser justos, ya han hecho esto antes. La publicación original estaba llena de ejemplos tangibles, ideas nuevas y consejos prácticos para ejercitar nuestros músculos y desarrollar nuestro cerebro para la escritura de código que todavía se aplican hoy en día. Pero esta actualización realiza dos mejoras en el libro.
La primera es la más evidente: elimina algunas de las referencias antiguas y los ejemplos desfasados y los sustituye por contenido reciente y moderno. No encontrará ejemplos de ciclos invariantes ni build machines. Dave y Andy han recogido su contenido potente y se han asegurado de que las lecciones todavía se entienden, sin las distracciones de los ejemplos antiguos. Desempolvan viejas ideas, como DRY (don’t repeat yourself, no te repitas) y le dan una mano de pintura fresca, haciendo que brillen.
La segunda, sin embargo, es la que hace este lanzamiento realmente emocionante. Después de escribir la primera edición, tuvieron la oportunidad de reflexionar sobre lo que estaban intentando decir, con lo que querían que se quedasen los lectores y cómo estaba percibiéndose. Recibieron feedback sobre esas lecciones. Vieron qué calaba, qué había que perfeccionar, qué se entendía mal. En los veinte años en los que este libro ha pasado por las manos y los corazones de programadores de todo el mundo, Dave y Andy han estudiado esta respuesta y han formulado nuevas ideas, nuevos conceptos.
Han aprendido la importancia de la capacidad de acción y han reconocido que podría decirse que los desarrolladores tienen más capacidad de acción que muchos otros profesionales. Empiezan este libro con un mensaje sencillo, pero profundo: “Es su vida”. Nos recuerda nuestro propio poder en nuestra base de código, en nuestros empleos, en nuestras carreras. Marca el tono del resto del libro; es más que otro libro técnico lleno de ejemplos de código.
Lo que hace que destaque de verdad en las estanterías de los libros técnicos es que entiende lo que significa ser programadores. La programación trata sobre intentar hacer el futuro menos doloroso, sobre hacer cosas mal y ser capaz de recuperarse, sobre crear buenos hábitos, sobre entender tu conjunto de herramientas. La creación de código es solo una parte del mundo de los programadores, y este libro explora ese mundo.
Paso mucho tiempo pensando en el viaje de la creación de código. Yo no crecí creando código. No lo estudié en la universidad. No me pasé la adolescencia jugueteando con la tecnología. Entré en el mundo del código a los veintitantos y tuve que aprender lo que significaba ser programadora. Esta comunidad es muy diferente de otras de las que he formado parte. Hay una dedicación única al aprendizaje y la practicidad es al mismo tiempo refrescante e intimidante.
Para mí, fue como entrar en un mundo nuevo. O, al menos, una nueva ciudad. Tuve que conocer a los vecinos, elegir un supermercado, encontrar las mejores cafeterías. Me llevó un tiempo familiarizarme con el terreno, encontrar las rutas más eficientes, evitar las calles con más tráfico, saber cuándo era probable que hubiese atascos. El clima era diferente, necesitaba un fondo de armario nuevo.
Las primeras semanas, incluso los primeros meses, en una ciudad nueva, pueden ser aterradores. ¿No sería maravilloso tener un vecino amable y bien informado que lleve un tiempo viviendo allí? ¿Alguien que pueda enseñarte el lugar, decirte cuáles son esas cafeterías? ¿Una persona que lleve ahí el tiempo suficiente para conocer la cultura, entender el ritmo de la ciudad, de forma que no solo ayude a que te sientas en casa, sino también a que te conviertas en un miembro que contribuye a la comunidad? Dave y Andy son esos vecinos.
Como recién llegada relativa, es fácil sentirse desbordada, no por el acto de programar, sino por el proceso de convertirse en programadora. Es necesario que se produzca un cambio de mentalidad completo, un cambio en los hábitos, los comportamientos y las expectativas. El proceso de conversión en mejores programadores no ocurre solo porque sepamos escribir código; debe haber también intención y práctica deliberada. Este libro es una guía para convertirse en programadores mejores de manera eficiente.
Pero no se equivoque: no le dice cómo debería ser la programación. No es filosófico ni sentencioso. Dice, de manera llana y simple, qué es un programador pragmático, cómo trabaja, cómo enfoca el código. Dejan a su elección si quiere ser uno. Si siente que eso no le va, no le guardan rencor. Pero, si decide que le interesa, son los vecinos amables que están ahí para mostrarle el camino.
—Saron Yitbarek.
Fundadora y directora ejecutiva de CodeNewbie.
Presentadora de Command Line Heroes.
En los años noventa, trabajábamos con empresas cuyos proyectos estaban teniendo problemas. Nos dimos cuenta de que estábamos diciendo lo mismo todo el tiempo: quizá debería probar eso antes de enviarlo; ¿por qué el código solo se construye en el ordenador de Mary? ¿Por qué nadie ha preguntado a los usuarios?
Para ahorrar tiempo con los nuevos clientes, empezamos a tomar notas. Y esas notas se convirtieron en El programador pragmático. Para nuestra sorpresa, pareció calar hondo, y ha seguido siendo popular durante los últimos 20 años.
Pero más de dos décadas son varias vidas cuando hablamos de software. Traiga a un desarrollador de 1999 y métalo en un equipo actual, y verá los apuros que pasa en este mundo nuevo y extraño. Pero el mundo de los noventa es igual de raro para los desarrolladores de hoy. Las referencias de este libro a cosas como CORBA, herramientas CASE y bucles indexados eran como mucho pintorescas y, probablemente, confusas.
Al mismo tiempo, 20 años no han afectado para nada al sentido común. La tecnología ha cambiado, pero las personas no. Las prácticas y los enfoques que eran buena idea entonces siguen siéndolo ahora. Esos aspectos del libro han envejecido bien.
Así pues, cuando llegó la hora de crear esta edición por el 20º aniversario, tuvimos que tomar una decisión. Podíamos repasar y actualizar las tecnologías a las que hacemos referencia y santas pascuas, o podíamos reexaminar los supuestos que había detrás de las prácticas que recomendábamos a la luz de las dos décadas de experiencia adicionales.
Al final, hicimos las dos cosas.
Como resultado, este libro es una especie de paradoja del barco de Teseo.1 Alrededor de un tercio de los temas del libro son completamente nuevos. Del resto, la mayoría se ha reescrito, de manera parcial o total. Nuestra intención era hacer que las cosas fuesen más claras, más relevantes y, de alguna manera, atemporales.
Hemos tomado decisiones difíciles. Hemos desechado el apéndice “Recursos”, porque sería imposible mantenerlo actualizado y porque es más fácil que busque lo que quiera. Hemos reorganizado y reescrito temas relacionados con la concurrencia, dada la abundancia actual de hardware paralelo y la escasez de buenas maneras de tratar con él. Hemos añadido contenido que refleja actitudes y entornos cambiantes, desde el movimiento del desarrollo ágil que ayudamos a iniciar hasta la aceptación cada vez mayor de modismos en la programación funcional y la necesidad creciente de tener en cuenta la privacidad y la seguridad. Sin embargo, resulta interesante que hubiese bastante menos discusión entre nosotros sobre el contenido de esta edición que cuando escribimos la primera. Los dos sentíamos que todo aquello que era importante era más fácil de identificar. En cualquier caso, este libro es el resultado. Por favor, disfrútelo. Puede adoptar, quizá, algunas prácticas nuevas. Tal vez decida que algunas cosas de las que sugerimos están mal. Involúcrese en su oficio. Denos su opinión.
Pero, sobre todo, recuerde divertirse con esto.
Este libro está escrito como una colección de temas cortos. Cada tema es independiente y gira en torno a una idea central específica. Encontrará numerosas referencias cruzadas, que le ayudarán a situar cada tema dentro de un contexto. Puede leer los temas en cualquier orden, no es necesario que los lea tal y como aparecen.
De manera ocasional, se encontrará con un cuadro titulado Truco nn (como Truco 1, “Preocúpese por su oficio”). Además de enfatizar puntos del texto, creemos que los trucos tienen vida propia, influyen en nuestra vida a diario.
Hemos incluido ejercicios y retos donde es pertinente. Los ejercicios suelen tener respuestas relativamente directas, mientras que los retos son más abiertos. Para que se haga una idea de nuestra forma de pensar, hemos incluido nuestras respuestas a los ejercicios al final del libro, pero muy pocos tienen una única solución correcta. Los retos pueden servir como base para debates o para un ensayo acerca de los cursos de programación avanzados. También hay una breve bibliografía que incluye los libros y artículos a los que hacemos referencias explícitas.
—Cuando yo uso una palabra —insistió Humpty Dumpty con un tono de voz más bien desdeñoso— quiere decir lo que yo quiero que diga..., ni más ni menos.
—Lewis Carroll, A través del espejo.
Esparcidos por el libro encontrará varios ejemplos de jerga, bien palabras perfectamente correctas en nuestro idioma que se han corrompido para que signifiquen algo técnico, bien palabras inventadas horribles a las que han asignado significados algunos científicos de la computación que se la tienen jurada a la lengua. La primera vez que usemos alguna de estas palabras de jerga, intentaremos definirla o, al menos, dar alguna pista sobre su significado. Sin embargo, estamos seguros de que algunas han pasado inadvertidas y otras, como “objeto” y “base de datos relacional”, tienen un uso bastante común que hace que añadir una definición sea aburrido. Si se encuentra con un término que no ha visto antes, por favor, no lo ignore sin más. Tómese un tiempo para buscarlo, quizá en la web o tal vez en un libro de texto de ciencias de la computación. Y, si tiene ocasión, escríbanos un correo electrónico y quéjese para que añadamos una definición en la siguiente edición.
Dicho esto, hemos decidido vengarnos de los científicos de la computación. A veces, hay palabras de jerga perfectamente válidas para conceptos, palabras que hemos decidido ignorar. ¿Por qué? Porque la jerga existente suele restringirse al dominio de un problema particular o una fase concreta del desarrollo. Sin embargo, una de las filosofías básicas de este libro es que la mayoría de las técnicas que recomendamos son universales: la modularidad se aplica al código, los diseños, la documentación y la organización de los equipos, por ejemplo. Cuando queríamos usar la palabra de jerga convencional en un contexto más amplio, resultaba confuso; parecía que no podíamos deshacernos del bagaje que llevaba consigo el término original. Cuando ha ocurrido eso, hemos contribuido al declive de la lengua inventando nuestros propios términos.
La mayor parte del código que se muestra en este libro se ha extraído de archivos fuente compilables, que se encuentran disponibles en la página web de Anaya Multimedia (http://www.anayamultimedia.es). Vaya al botón Selecciona Complemento de la ficha del libro, donde podrá descargar el código fuente.
También dispone de estos archivos en la página web del libro original en https://pragprog.com/titles/tpp20. Ahí también encontrará enlaces a recursos útiles, además de actualizaciones del libro original y otras noticias en inglés.
1 Si a lo largo de los años se sustituyen todos los componentes de un barco, ¿la nave resultante es el mismo barco?
Este libro le ayudará a convertirse en un desarrollador mejor.
Puede que sea un desarrollador solitario, un miembro de un equipo grande para proyectos o un asesor que trabaja con muchos clientes a la vez. No importa; este libro le ayudará, como individuo, a hacer un trabajo mejor. No se trata de un libro teórico; nos centramos en temas prácticos, en que utilice su experiencia para tomar decisiones mejor fundamentadas. La palabra “pragmático” viene del latín pragmaticus (“hábil en asuntos”), que a su vez deriva del griego πραγματικός, que significa “adecuado para el uso”.
Este libro va de “hacer”.
La programación es un oficio artesano. En su forma más simple, se reduce a conseguir que un ordenador haga lo que queremos que haga (o lo que nuestros usuarios quieran que haga). Como programador, es en parte oyente, en parte consejero, en parte intérprete y en parte dictador. Intenta capturar requisitos imprecisos y encontrar una manera de expresarlos de forma que una simple máquina pueda hacerles justicia. Intenta documentar su trabajo para que otros puedan entenderlo, e intenta diseñar su trabajo de forma que otras personas pueda construir sobre él. Es más, trata de hacer todo eso mientras se enfrenta al paso inexorable del tiempo marcado para un proyecto. Hace pequeños milagros todos los días.
Es un trabajo difícil.
Hay mucha gente que le ofrece ayuda. Distribuidores de herramientas promocionan los milagros que realizan sus productos. Gurús de las metodologías prometen que sus técnicas garantizan resultados. Todo el mundo afirma que su lenguaje de programación es el mejor y que cada sistema operativo es la respuesta a todos los males concebibles.
Por supuesto, nada de esto es cierto. No hay respuestas fáciles. No hay una “mejor solución”, ya sea una herramienta, un lenguaje o un sistema operativo. Solo puede haber sistemas que son más apropiados en un conjunto de circunstancias determinado.
Aquí es donde entra el pragmatismo. No debería aferrarse a una tecnología concreta, sino tener una base de fondo y experiencia lo bastante amplia para que le permita elegir soluciones buenas en situaciones particulares. Ese fondo surge de un entendimiento de los principios básicos de la ciencia de la computación, y su experiencia viene de una amplia gama de proyectos prácticos. La teoría y la práctica se combinan para hacerle más fuerte.
Debe ajustar su enfoque para adaptarse a las circunstancias y el entorno actuales. Juzgue la importancia relativa de todos los factores que afecten a un proyecto y use su experiencia para generar las soluciones apropiadas. Haga esto de manera continua a medida que progresa el trabajo. Los programadores pragmáticos acaban el trabajo, y lo hacen bien.
Este libro va dirigido a quienes quieran ser programadores más efectivos y más productivos. Quizá se sienta frustrado porque le parece que no está aprovechando su potencial. Puede que se fije en colegas que parecen usar herramientas que les hacen más productivos que usted. Tal vez su trabajo actual utiliza tecnologías antiguas y quiere saber cómo pueden aplicarse ideas más nuevas a lo que hace.
No fingimos tener todas (ni siquiera la mayoría de) las respuestas, ni todas nuestras ideas son aplicables en todas las situaciones. Lo único que podemos decir es que, si sigue nuestro enfoque, ganará experiencia con rapidez, aumentará su productividad y tendrá un mejor entendimiento del proceso completo de desarrollo. Y escribirá software mejor.
Cada programador es único, con puntos fuertes y débiles, preferencias y antipatías individuales. Con el tiempo, cada uno elabora su propio entorno personal. Ese entorno reflejará la individualidad del programador con tanta claridad como sus aficiones, su ropa o su corte de pelo. Sin embargo, si es un programador pragmático, compartirá muchas de las siguientes características:
■Primero en adoptar/se adapta con rapidez.
Tiene buen instinto para las tecnologías y las técnicas y le encanta probar cosas. Cuando le dan algo nuevo, enseguida le coge el tranquillo y lo integra con el resto de sus conocimientos. Su confianza nace de la experiencia.
■Inquisitivo.
Tiende a hacer preguntas. “Eso está muy bien, ¿cómo lo has hecho? ¿Tienes problemas con esa biblioteca? ¿Qué es esa informática cuántica de la que he oído hablar? ¿Cómo se implementan los enlaces simbólicos?” Es un coleccionista de hechos, cada uno de los cuales puede afectar a sus decisiones dentro de unos años.
■Pensador crítico.
Rara vez da las cosas por sentadas sin estudiar primero los hechos. Cuando un colega dice: “Porque así es como se hace” o un distribuidor promete la solución a todos sus problemas, huele un desafío.
■Realista.
Intenta entender la naturaleza subyacente de cada problema al que se enfrenta. Este realismo le da una impresión bastante exacta de lo difíciles que son las cosas y cuánto tiempo llevarán. Una comprensión profunda de que un proceso debería ser difícil o tardará bastante en completarse le proporciona la resistencia para seguir trabajando en ello.
■Versátil.
Se esfuerza por familiarizarse con una amplia variedad de tecnologías y entornos y trabaja para mantenerse al día con los nuevos desarrollos. Aunque puede que su trabajo actual requiera que sea un especialista, siempre será capaz de pasar a nuevas áreas y nuevos retos.
Hemos dejado las características más básicas para el final. Todos los programadores pragmáticos las comparten y son lo bastante básicas para expresarse como trucos:
Truco 1. Preocúpese por su oficio.
Nos parece que no tiene sentido desarrollar software a menos que nos preocupemos por hacerlo bien.
Truco 2. ¡Piense! En su trabajo.
Para ser un programador pragmático, le desafiamos a pensar en lo que está haciendo mientras lo está haciendo. No se trata de una inspección única de prácticas actuales, sino de una valoración continua de cada decisión que toma, cada día y en cada proyecto. No avance nunca con el piloto automático puesto. Debe pensar constantemente y ser crítico con su trabajo en tiempo real. El antiguo eslogan corporativo de IBM, THINK! (¡PIENSA!), es el mantra del programador pragmático.
Si le parece que esto es difícil para usted, entonces está mostrando el rasgo realista. Esto le va a llevar algo de tiempo valioso, tiempo que es probable que ya esté bajo una presión enorme. La recompensa es una implicación más activa en un trabajo que le gusta, una sensación de dominio de una variedad cada vez mayor de temas y el placer de un sentimiento de mejora continua. A largo plazo, la inversión de tiempo dará sus frutos cuando usted y su equipo se vuelvan más eficientes, escriban código más fácil de mantener y pasen menos tiempo en reuniones.
Algunas personas sienten que no hay sitio para la individualidad en equipos grandes o proyectos complejos. Dicen que el software es una disciplina de ingeniería que se descompone si los miembros individuales del equipo empiezan a tomar decisiones por su cuenta.
No estamos de acuerdo en absoluto.
Debería haber ingeniería en la creación del software. Sin embargo, eso no excluye la artesanía individual. Piense en las grandes catedrales construidas en Europa durante la Edad Media. Cada una de ellas necesitó miles de años-hombre de esfuerzo, distribuidos a lo largo de muchas décadas. Las lecciones aprendidas se transmitían a la siguiente generación de constructores, que hacían avanzar el estado de la ingeniería estructural con sus logros. Pero los carpinteros, los canteros, los tallistas y los vidrieros eran artesanos, e interpretaban los requisitos de ingeniería para producir un conjunto que trascendía el aspecto puramente mecánico de la construcción. Su fe en sus contribuciones individuales era lo que sustentaba los proyectos: los que cortamos solo simples piedras debemos visualizar catedrales.
Dentro de la estructura general de un proyecto, siempre hay espacio para la individualidad y la artesanía. Esto es cierto en particular si se tiene en cuenta el estado actual de la ingeniería de software. Dentro de cien años, puede que nuestra ingeniería parezca tan arcaica como las técnicas usadas por los constructores de catedrales medievales pueden parecer a los ingenieros actuales, mientras que se seguirá honrando nuestra artesanía.
Un turista que visitaba el Eton College en Inglaterra preguntó al jardinero cómo lograba que el césped fuese tan perfecto.
—Es fácil. Solo hay que retirar el rocío todas las mañanas, cortar cada dos días y pasar el rodillo una vez a la semana —respondió el jardinero.
—¿Eso es todo? —preguntó el turista.
—Desde luego —respondió el jardinero—. Hágalo durante 500 años y también tendrá un césped así de bonito.
Los buenos céspedes necesitan pequeñas cantidades de cuidados diarios, y lo mismo ocurre con los buenos programadores. A los consultores de gestión les gusta meter la palabra kaizen en las conversaciones. “Kaizen” es un término japonés que captura el concepto de hacer muchas mejoras pequeñas de manera continua. Se consideró que fue una de las principales razones para la espectacular ganancia en productividad y calidad en la fabricación japonesa y se copió por todo el mundo. El kaizen se aplica también a los individuos. Trabaje cada día para perfeccionar sus habilidades y para añadir nuevas herramientas a su repertorio. A diferencia del césped de Eton, empezará a ver resultados en cuestión de días. Con los años, le impresionará ver cuánto ha florecido su experiencia y cuánto han crecido sus habilidades.
Este libro es sobre usted.
No se confunda, es su carrera y, lo que es más importante, “Es su vida”. Le pertenece. Está aquí porque sabe que puede convertirse en un desarrollador mejor y ayudar a otros a ser mejores también. Puede convertirse en un programador pragmático.
¿Qué distingue a los programadores pragmáticos? Consideramos que es una actitud, un estilo, una filosofía sobre la forma de abordar los problemas y sus soluciones. Piensan más allá del problema inmediato, lo sitúan en un contexto más grande y buscan el panorama general. Al fin y al cabo, sin ese contexto más grande, ¿cómo podemos ser pragmáticos? ¿Cómo podemos llegar a acuerdos inteligentes y tomar decisiones bien fundadas?
Otra clave para su éxito es que los programadores pragmáticos asumen la responsabilidad de todo lo que hacen, algo que veremos en “El gato se comió mi código fuente”. Al ser responsables, los programadores pragmáticos no van a sentarse tranquilamente a ver cómo sus proyectos se vienen abajo por negligencias. En “Entropía del software”, le explicamos cómo mantener sus proyectos impolutos. A la mayoría de la gente le resulta difícil el cambio, unas veces por buenas razones y otras por una simple cuestión de inercia. En “Sopa de piedras y ranas hervidas”, echamos un vistazo a una estrategia para instigar el cambio y (por el interés del equilibrio) presentamos el cuento admonitorio de un anfibio que ignoraba los peligros del cambio gradual.
Uno de los beneficios de entender el contexto en el que trabajamos es que se vuelve más fácil saber lo bueno que tiene que ser nuestro software. A veces, “casi perfecto” es la única opción posible, pero, a menudo, hay que sacrificar algo a cambio. Exploramos esto en “Software lo bastante bueno”.
Por supuesto, necesita tener una amplia base de conocimiento y experiencia para sacar todo esto adelante. El aprendizaje es un proceso continuo y en desarrollo. En “Su cartera de conocimientos”, vemos algunas estrategias para mantener el ímpetu.
Por último, ninguno de nosotros trabaja en el vacío. Todos pasamos gran parte del tiempo interactuando con otras personas. “¡Comuníquese!” muestra una lista de maneras en que podemos hacer esto mejor. La programación pragmática surge de una filosofía de pensamiento pragmático. Este capítulo determina la base para esa filosofía.
No estoy en este mundo para cumplir tus expectativas, y tú no estás en este mundo para cumplir las mías.
—Bruce Lee.
Es su vida. Le pertenece. Usted la dirige. Usted la crea.
Muchos desarrolladores con los que hablamos se sienten frustrados. Sus preocupaciones son variadas. Algunos sienten que están estancándose en su trabajo, otros que la tecnología ha pasado de largo a su lado. Hay personas que sienten que están infravaloradas, que están mal pagadas o que sus equipos son tóxicos. A lo mejor quieren mudarse a Asia o Europa, o trabajar desde casa.
Y la respuesta que les damos es siempre la misma.
“¿Por qué no puedes cambiarlo?”.
El desarrollo de software debe aparecer cerca de lo más alto en cualquier lista de carreras en las que tenemos control. Hay demanda para nuestras habilidades, nuestros conocimientos cruzan fronteras geográficas, podemos trabajar de manera remota. Nos pagan bien. Realmente podemos hacer lo que queramos.
Pero, por alguna razón, los desarrolladores parecen resistirse al cambio. Se apoltronan y esperan que las cosas mejoren. Se quedan mirando con pasividad mientras sus habilidades se quedan anticuadas y se quejan de que sus empresas no les ofrecen formación. Se fijan en los anuncios de destinos exóticos mientras van en el autobús y, después, salen a la lluvia heladora y caminan con pesadez hasta el trabajo.
Así pues, aquí está el truco más importante del libro.
Truco 3. Tiene capacidad de acción.
¿Su entorno laboral es un asco? ¿Le aburre su trabajo? Intente arreglarlo, pero no se pase la vida intentándolo. Como dice Martin Fowler, “puede cambiar su organización o cambiar su organización”.1
Si le parece que la tecnología está pasando de largo respecto a usted, saque tiempo (a su propio ritmo) para estudiar cosas nuevas que parezcan interesantes. Está invirtiendo en usted mismo, así que es razonable que lo haga fuera de su horario laboral.
¿Quiere trabajar de manera remota? ¿Lo ha pedido? Si le dicen que no, busque a alguien que diga que sí.
Esta industria ofrece un conjunto notable de oportunidades. Sea proactivo y aprovéchelas.
■Tema 4, “Sopa de piedras y ranas hervidas”.
■Tema 6, “Su cartera de conocimientos”.
La mayor debilidad de todas es el miedo a parecer débil.
—J.B. Bossuet, Política deducida de las palabras propias de la Sagrada Escritura, 1709.
Una de las piedras angulares de la filosofía pragmática es la idea de asumir la responsabilidad por nosotros mismos y nuestras acciones en lo que respecta al avance de nuestra carrera, nuestro aprendizaje y nuestra educación, nuestro proyecto y nuestro trabajo diario. Los programadores pragmáticos se hacen cargo de su propia carrera y no tienen miedo de admitir el desconocimiento o el error. No es el aspecto más agradable de la programación, desde luego, pero ocurrirá, incluso en los mejores proyectos. Pese a las pruebas exhaustivas, la buena documentación y la automatización sólida, hay cosas que salen mal. Las entregas se retrasan. Surgen problemas técnicos imprevistos.
Estas cosas pasan e intentamos lidiar con ellas de la forma más profesional posible. Eso significa ser honestos y directos. Podemos estar orgullosos de nuestras habilidades, pero debemos asumir la responsabilidad sobre nuestros defectos, nuestra ignorancia y nuestros errores.
Por encima de todo, su equipo necesita poder confiar en y depender de usted, y usted necesita sentirse cómodo dependiendo de cada uno de ellos también. Confiar en un equipo es esencial para la creatividad y la colaboración, según muestran diversos trabajos de investigación.2 En un entorno sano basado en la confianza, podemos decir lo que pensamos de forma segura, presentar nuestras ideas y depender de los miembros del equipo, que a su vez pueden depender de nosotros. Si no hay confianza, bueno...
Imagine un equipo de ninjas sigilosos con alta tecnología que se infiltra en la guarida de un villano. Tras meses de planificación y perfecta ejecución, han llegado al lugar. Ahora, es su turno para activar la cuadrícula de guía láser: “Lo siento, chicos, no tengo el láser. El gato estaba jugando con el puntito rojo y lo he dejado en casa”.
Ese tipo de traición de la confianza debe ser difícil de arreglar.
La responsabilidad es algo a lo que accedemos de manera activa. Adquirimos un compromiso para garantizar que algo se hace bien, pero tenemos necesariamente un control directo sobre cada aspecto de ello. Además de dar lo mejor de nosotros mismos, debemos analizar la situación para detectar riesgos que quedan fuera de nuestro control. Tenemos derecho a no asumir una responsabilidad sobre una situación imposible, o una en la que los riesgos son demasiado grandes, o las implicaciones éticas son demasiado sospechosas. Tendrá que tomar la decisión en función de sus propios valores y su criterio.
Cuando acepte la responsabilidad sobre un resultado, debería esperar tener que responder por él. Cuando cometa una equivocación (como hacemos todos) o un error de juicio, admítalo con honestidad e intente proponer opciones.
No culpe a otra persona ni circunstancia, ni se invente excusas. No eche la culpa a un distribuidor, a un lenguaje de programación, al director o a sus compañeros. Puede que todas esas cosas hayan influido, pero depende de usted ofrecer soluciones, no excusas.
Si existía un riesgo de que el distribuidor le fallase, debería haber tenido un plan de contingencia. Si su unidad de almacenamiento masivo se estropea (y con ella se pierde todo su código fuente) y no tiene una copia de seguridad, es culpa suya. Decirle a su jefe “el gato se ha comido mi código fuente” no servirá.
Truco 4. Ofrezca opciones, no se invente excusas pobres.
Antes de acercarse a alguien a decirle por qué algo no puede hacerse, va con retraso o está estropeado, pare y escúchese. Hable con el patito de goma de su monitor o con el gato. ¿Su excusa suena razonable o estúpida? ¿Cómo va a sonarle a su jefe?
Repase la conversación en su mente. ¿Qué es probable que diga la otra persona? ¿Le preguntará si ha probado esto o ha considerado aquello? ¿Cómo responderá usted? Antes de ir a darle a esa persona la mala noticia, ¿hay algo más que pueda probar? A veces, ya sabe lo que van a decirle, así que ahórreles la molestia.
En vez de excusas, ofrezca opciones. No diga que no puede hacerse; explique qué puede hacerse para resolver la situación. ¿Hay que eliminar código? Dígaselo y explique el valor de la refactorización (véase el tema 40, “Refactorización”).
¿Necesita dedicar tiempo a crear un prototipo para determinar la mejor manera de proceder (véase el tema 13, “Prototipos y notas en post-its”)? ¿Tiene que introducir pruebas mejores (véase el tema 41, “Probar para escribir código” y “Pruebas despiadadas y continuas” en el capítulo 9) o automatización para evitar que vuelva a ocurrir?
Quizá necesite recursos adicionales para completar esta tarea. ¿O tal vez necesite pasar más tiempo con los usuarios? Quizá la cuestión sea usted mismo: ¿necesita aprender alguna técnica o tecnología en mayor profundidad? ¿Le ayudaría algún libro o curso? No tenga miedo de pedir o de admitir que necesita ayuda.
Intente olvidar las malas excusas antes de decirlas en voz alta. Si no le queda más remedio que usarlas, dígaselo primero a su gato. Al fin y al cabo, si el pequeño Calcetines va a cargar con la culpa...
■Tema 49, “Equipos pragmáticos”.
■¿Cómo reacciona cuando alguien (el cajero del banco, el mecánico del taller o un dependiente) le pone una mala excusa? ¿Qué piensa de esa persona y de su empresa como resultado?
■Cuando se oiga a sí mismo decir: “No lo sé”, asegúrese de añadir después: “Pero lo averiguaré”. Es una manera genial de admitir lo que no sabe, pero asumiendo después la responsabilidad como un profesional.
Aunque el desarrollo de software es inmune a casi todas las leyes de la física, el inexorable incremento de la entropía nos afecta de pleno. La entropía es un término de física que se refiere a la cantidad de “desorden” en un sistema. Por desgracia, las leyes de la termodinámica garantizan que la entropía en el universo tienda hacia el máximo. Cuando aumenta el desorden en el software, lo denominamos “pudrición del software”. Algunas personas prefieren utilizar el término más optimista “deuda técnica”, con la noción implícita de que la pagarán algún día. Es probable que no lo hagan.
En cualquier caso, al margen del nombre, tanto la deuda como la pudrición pueden extenderse sin control.
Existen muchos factores que pueden contribuir a la pudrición del software. El más importante parece ser la psicología, o la cultura, que se emplea en un proyecto. Incluso si somos un equipo de uno, la psicología de nuestro proyecto puede ser una cuestión muy delicada. A pesar de la planificación escrupulosa y las personas más adecuadas, un proyecto puede deteriorarse y arruinarse durante su vida. Y, por otra parte, hay otros proyectos que, pese a las enormes dificultades y los contratiempos constantes, luchan con éxito contra la tendencia natural hacia el desorden y consiguen llegar a buen puerto.
¿Qué marca la diferencia?
En el centro de las ciudades, algunos edificios son bonitos y están limpios, mientras que otros son armatostes deteriorados. ¿Por qué? Los investigadores en el campo del crimen y el deterioro urbano descubrieron un mecanismo desencadenante fascinante, uno que convierte con rapidez un edificio limpio, intacto y habitado en uno ruinoso y abandonado.3
Una ventana rota.
Una ventana rota que se deje sin reparar durante un periodo de tiempo considerable infunde en los habitantes del edificio una sensación de abandono, una sensación de que a los responsables no les importa el edificio. Así que se rompe otra ventana. La gente empieza a tirar basura. Aparecen grafitis. Comienza a producirse un daño estructural serio. En un periodo de tiempo relativamente corto, el edificio queda demasiado dañado para que el propietario quiera arreglarlo, y la sensación de abandono se convierte en una realidad.
¿Qué marcaría una diferencia? Varios psicólogos han realizado estudios4 que demuestran que la desesperanza puede ser contagiosa. Piense en el virus de la gripe en espacios cerrados. Ignorar una situación que está claro que va mal refuerza la idea de que quizá nada puede arreglarse, que no le importa a nadie, que todo está abocado al fracaso; son todo pensamientos negativos que se extienden por los miembros del equipo, lo que genera un círculo vicioso.
Truco 5. No viva con ventanas rotas.
No deje “ventanas rotas” (malos diseños, decisiones equivocadas o código pobre) sin reparar. Arregle cada una en cuanto la descubra. Si no hay tiempo suficiente para arreglarla de forma adecuada, tápela con tablas de manera temporal. Quizá pueda comentar el código irritante, mostrar un mensaje que diga “Sin implementar” o sustituir con datos dummy. Haga algo para evitar más daños y para demostrar que está por encima de la situación.
Hemos visto sistemas limpios y funcionales que se deterioran con bastante rapidez una vez que las ventanas empiezan a romperse. Hay otros factores que pueden contribuir a la pudrición del software, los veremos más adelante, pero la negligencia acelera la pudrición más que ningún otro factor.
Puede que esté pensando que nadie tiene tiempo de andar limpiando todos los cristales rotos de un proyecto. Si es así, más vale que empiece a planear hacerse con un contenedor de basura o mudarse a otro vecindario. No deje que la entropía gane.
Andy tenía un conocido que era obscenamente rico. Su casa estaba inmaculada, llena de antigüedades de valor incalculable, obras de arte tridimensionales y cosas así. Un día, un tapiz que estaba colgado demasiado cerca de una chimenea empezó a arder. Los bomberos llegaron corriendo para salvar la situación y la casa. Pero, antes de arrastrar las mangueras grandes y sucias por el interior, se detuvieron (con las llamas propagándose) para extender una alfombra entre la puerta principal y el origen del incendio.
No querían estropear la moqueta.
Sí, suena bastante exagerado. Desde luego, la máxima prioridad de los bomberos es sofocar el incendio, y al cuerno con los daños colaterales. Pero estaba claro que habían evaluado la situación, confiaban en su capacidad para controlar el fuego y tuvieron cuidado de no infligir un daño innecesario a la propiedad. Eso es lo que debe hacerse con el software: no causar daños colaterales solo porque hay algún tipo de crisis. Una ventana rota ya son demasiadas.
Una ventana rota (una porción de código mal diseñada, una mala decisión de la dirección con la que el equipo debe vivir mientras dure el proyecto) es lo único que hace falta para comenzar el declive. Si se da cuenta de que está trabajando en un proyecto con bastantes ventanas rotas, es demasiado fácil adoptar la mentalidad de que “todo el resto de este código es una porquería, voy a seguir en esa línea, sin más”. No importa si el proyecto ha ido bien hasta ese punto. En el experimento original que llevó a la teoría de las ventanas rotas, un coche abandonado se quedó sin tocar durante una semana. Pero, en cuanto se rompió una sola ventana, el coche fue desmantelado en cuestión de horas.
Del mismo modo, si se encuentra trabajando en un proyecto en el que el código es bonito y prístino (escrito con limpieza, bien diseñado y elegante), es probable que ponga especial cuidado en no estropearlo, igual que los bomberos. Incluso aunque haya un incendio (fecha límite, fecha de lanzamiento, demostración para una feria comercial, etc.), no querrá ser el primero que haga un lío y cause un daño adicional.
Solo dígase: “Nada de ventanas rotas”.
■Tema 10, “Ortogonalidad”.
■Tema 40, “Refactorización”.
■Tema 44, “Poner nombre a las cosas”.
■Ayude a fortalecer a su equipo haciendo un sondeo en el vecindario de su proyecto. Elija dos o tres ventanas rotas y hable con sus compañeros de cuáles son los problemas y qué podría hacerse para arreglarlos.
■¿Se da cuenta cuando se rompe una ventana por primera vez? ¿Cuál es su reacción? Si ha sido a causa de la decisión de otra persona o de una orden del director, ¿qué puede hacer usted al respecto?
Tres soldados volvían a casa hambrientos tras la guerra. Cuando vieron un pueblo en la lejanía, se les levantó el ánimo; estaban seguros de que los aldeanos les ofrecerían una comida. Sin embargo, al llegar allí, se encontraron las puertas y las ventanas cerradas. Después de muchos años de guerra, los alimentos escaseaban y los aldeanos hacían acopio de lo que tenían.
Lejos de desistir, los soldados pusieron a hervir una cazuela con agua y metieron con cuidado tres piedras. Los asombrados aldeanos se acercaron a mirar.
—Esto es sopa de piedras —explicaron los soldados.
—¿Eso es todo lo que lleva? —preguntaron los aldeanos.
—¡Desde luego! Aunque algunos dicen que sabe incluso mejor con unas zanahorias...
Un aldeano se fue corriendo y volvió enseguida con una cesta de zanahorias de su reserva.
Unos minutos después, los aldeanos volvieron a preguntar:
—¿Eso es todo?
—Bueno —dijeron los soldados—, un par de patatas le dan cuerpo.
Otro aldeano salió corriendo.
En la siguiente hora, los soldados hicieron una lista con más ingredientes que mejorarían la sopa: carne, puerros, sal y hierbas aromáticas. Cada vez, un aldeano diferente iba corriendo a buscar en su despensa personal.
Al final, tenían una gran cazuela de sopa humeante. Los soldados quitaron las piedras y se sentaron con el resto del pueblo para disfrutar la primera comida decente que cualquiera de ellos había probado en meses.
Hay un par de moralejas en la historia de la sopa de piedras. A los aldeanos los engañan los soldados, que utilizan la curiosidad de los aldeanos para conseguir comida de ellos. Pero lo que es más importante es que los soldados actúan como catalizador, uniendo al pueblo para que todos juntos puedan producir algo que no podrían haber hecho solos, un resultado sinérgico. Al final, todo el mundo gana.
De vez en cuando, quizá le convenga emular a los soldados.
Puede que esté en una situación en la que sepa con exactitud lo que es necesario hacer y cómo hacerlo. El sistema entero aparece ante sus ojos; sabe que está bien. Pero, si pide permiso para abordarlo todo, se encontrará con retrasos y miradas confusas. Se formarán comités, habrá que aprobar presupuestos y las cosas se complicarán. Todo el mundo se guardará sus propios recursos. Esto se denomina a veces “fatiga de arranque”.
Es hora de preparar la sopa de piedras. Determine qué puede pedir de forma razonable. Desarróllelo bien. Una vez que lo tenga, enséñeselo a otras personas y deje que se maravillen. Después, diga: “Por supuesto, estaría mejor si añadiésemos...”. Finja que no es importante. Siéntese y espere a que empiecen a pedirle que añada la funcionalidad que quería desde el principio. A la gente le resulta más fácil unirse a un éxito en curso. Enséñeles una muestra del futuro y conseguirá su apoyo.5
Truco 6. Sea un catalizador para el cambio.
Por otra parte, la historia de la sopa de piedras también habla de un engaño sutil y gradual. Tiene que ver con concentrarse demasiado en algo. Los aldeanos piensan en las piedras y se olvidan del resto del mundo. Todos caemos en esa trampa, todos los días. Las cosas nos acechan.
Todos hemos visto los síntomas. Los proyectos van escapándose por completo de nuestro control de forma lenta e inexorable. La mayoría de los desastres de software empiezan siendo demasiado pequeños para que los notemos, y la mayoría de los costes adicionales en los proyectos se producen día a día. Los sistemas van alejándose de sus especificaciones funcionalidad a funcionalidad, mientras se añade un parche tras otro a una porción del código hasta que ya no queda nada del original. A menudo, esa acumulación de cosas pequeñas es la que acaba con la moral y con los equipos.
Truco 7. Recuerde el panorama general.
Nunca hemos probado esto, de verdad, pero dicen que, si coges una rana y la sueltas en agua hirviendo, saltará fuera del recipiente. Sin embargo, si la dejas en una cazuela con agua fría y después vas calentándola de manera gradual, la rana no notará el aumento lento de la temperatura y se quedará quieta hasta que esté cocinada.
Observe que el problema de la rana es diferente al de las ventanas rotas que hemos visto en el tema 3, “Entropía del software”. En la teoría de las ventanas rotas, la gente pierde la voluntad de luchar contra la entropía porque percibe que a nadie más le importa. La rana no nota el cambio, sin más.
No sea como la rana imaginaria. No pierda de vista el panorama general. Revise constantemente lo que pasa a su alrededor, no solo lo que está haciendo usted a nivel individual.
■Tema 1, “Es su vida”.
■Tema 38, “Programar por casualidad”.
■Mientras revisaba un borrador de la primera edición, John Lakos planteó la siguiente cuestión: los soldados engañaron a los aldeanos de manera progresiva, pero el cambio que catalizaron fue bueno para todos. Sin embargo, al engañar a la rana de forma progresiva, le hacemos daño. ¿Puede determinar si está haciendo sopa de piedras o sopa de ranas cuando intenta catalizar un cambio? ¿Es la decisión subjetiva u objetiva?
■Rápido, sin mirar, ¿cuántas luces hay encima de usted? ¿Y cuántas hay en la sala? ¿Cuánta gente? ¿Hay algo fuera de contexto, algo que parezca que no debería estar ahí? Este es un ejercicio de consciencia situacional, una técnica practicada a menudo por personas que van desde Boy y Girl Scouts a los SEAL de la Armada de EE. UU. Acostúmbrese a prestar atención y a ser consciente de lo que pasa a su alrededor. Después, haga lo mismo en su proyecto.
Lo bueno se malogra queriendo mejorarlo.
—Shakespeare, El rey Lear 1.4.
Hay un chiste (un poco) viejo sobre una empresa que hace un pedido de 100.000 CI a un fabricante japonés. Parte de la especificación era la tasa de defectos: un chip de cada 10.000. Unas semanas después, llega el pedido: una caja grande que contiene miles de CI y una caja pequeña que contiene solo diez. Pegada en la caja pequeña hay una etiqueta que dice: “Estos son los diez defectuosos”.
Ojalá tuviésemos de verdad este tipo de control sobre la calidad. Pero el mundo real no nos deja producir mucho que sea realmente perfecto, sobre todo software libre de errores. El tiempo, la tecnología y el temperamento conspiran contra nosotros.
Sin embargo, esto no tiene por qué ser frustrante. Como describió Ed Yourdon en un artículo en IEEE Software, When good-enough software is best [You95], puede disciplinarse para escribir software que sea lo bastante bueno, para sus usuarios, para las personas que tendrán que mantenerlo en el futuro y para su propia tranquilidad. Descubrirá que es más productivo y sus usuarios están más contentos. Y puede que descubra que sus programas son en realidad mejores por su incubación más corta.
Antes de seguir, tenemos que matizar lo que vamos a decir. La frase “lo bastante bueno” no implica código chapucero o mal producido. Todos los sistemas deben cumplir los requisitos de sus usuarios para tener éxito, y deben ajustarse a unos estándares básicos de rendimiento, privacidad y seguridad. Lo que defendemos es que se dé a los usuarios la oportunidad de participar en el proceso de decidir si lo que hemos producido es lo bastante bueno para sus necesidades.
Por lo general, escribirá software para otras personas. A menudo, se acordará de averiguar lo que quieren.6 Pero ¿les pregunta alguna vez lo bueno que quieren que sea su software? A veces, no habrá opción. Si está trabajando en marcapasos, sistemas de piloto automático o una biblioteca de bajo nivel que va a divulgarse ampliamente, los requisitos serán más rigurosos y sus opciones serán más limitadas.
Sin embargo, si está trabajando en un producto totalmente nuevo, tendrá restricciones diferentes. Los responsables del marketing tendrán promesas que cumplir, los usuarios finales pueden haber hecho planes en función de una fecha de entrega y, desde luego, su empresa tendrá restricciones respecto al flujo de caja. Sería poco profesional ignorar los requisitos de estos usuarios solo para añadir funcionalidades nuevas al programa o para pulir el código una vez más. No estamos abogando por el pánico: sería igual de poco profesional prometer plazos imposibles y recortar elementos de ingeniería básicos para cumplir esos plazos.
El alcance y la calidad del sistema que producimos deberían describirse como parte de los requisitos de ese sistema.
Truco 8. Convierta la calidad en una cuestión de los requisitos.
A menudo, se verá en situaciones en las que se requiere una compensación. Sorprendentemente, muchos usuarios preferirían utilizar software sin pulir del todo hoy que esperar un año para tener la versión brillante y con toda la parafernalia (y, en realidad, puede que lo que necesiten de aquí a un año sea totalmente diferente, de todas formas). Muchos departamentos de TI con presupuestos muy ajustados estarán de acuerdo. A menudo, un software genial hoy es preferible a la fantasía de un software perfecto mañana. Si da a sus usuarios algo con lo que jugar pronto, con frecuencia su feedback le llevará a conseguir una solución final mejor (véase el tema 12, “Balas trazadoras”).
En algunos aspectos, programar es como pintar. Empezamos con un lienzo en blanco y determinadas materias primas básicas. Utilizamos una combinación de ciencia, arte y oficio para determinar qué hacer con ellas. Esbozamos una forma general, pintamos el entorno subyacente y, después, añadimos los detalles. Damos un paso atrás todo el tiempo con ojo crítico para ver lo que hemos hecho. De vez en cuando, desechamos un lienzo y empezamos otra vez.
Pero los artistas dirán que todo el trabajo duro se verá arruinado si no sabemos cuándo parar. Si añadimos capa tras capa, detalle tras detalle, el cuadro se pierde en la pintura.
No arruine un buen programa tratando de embellecerlo o refinarlo en exceso. Siga adelante y deje que su código se mantenga por sí mismo durante un tiempo. Puede que no sea perfecto. No se preocupe: nunca podría ser perfecto. (En el capítulo 7, “Mientras escribe código”, veremos filosofías para desarrollar código en un mundo imperfecto).
■Tema 45, “El pozo de los requisitos”.
■Tema 46, “Resolver rompecabezas imposibles”.
■Fíjese en las herramientas de software y los sistemas operativos que utiliza con regularidad. ¿Puede encontrar cualquier prueba de que estas organizaciones o desarrolladores se sienten cómodos enviando software que saben que no es perfecto? Como usuario, ¿preferiría (1) esperar a que eliminen todos los errores, (2) tener un software complejo y aceptar algunos errores o (3) optar por un software más simple con menos errores?
■Considere el efecto de la modularización en la entrega de software. ¿Llevaría más o menos tiempo conseguir un bloque de software monolítico con acoplamiento fuerte para la calidad requerida en comparación con un sistema diseñado como módulos de microservicios con acoplamiento muy débil? ¿Cuáles son las ventajas y las desventajas de cada enfoque?
■¿Se le ocurre algún software popular que tenga un exceso de funcionalidades innecesarias? Es decir, un software que contenga muchas más funcionalidades de las que se usarán jamás, cada una de ellas generando más posibilidades de que haya errores y puntos débiles en la seguridad, y haciendo que las funcionalidades que sí se usan sean más difíciles de encontrar y gestionar. ¿Corre usted mismo el peligro de caer en esta trampa?
Invertir en conocimientos produce siempre los mejores beneficios.
—Benjamin Franklin.
Ah, el viejo Ben Franklin, siempre con una homilía concisa a mano. Bueno, si pudiésemos irnos pronto a la cama y madrugar, seríamos magníficos programadores, ¿no? Según un proverbio inglés, el pájaro madrugador se lleva el gusano, pero ¿qué pasa con el gusano madrugador?
Sin embargo, en este caso, Ben da en el clavo. Nuestro conocimiento y nuestra experiencia son nuestros activos profesionales más importantes en el día a día.
Por desgracia, son activos con fecha de caducidad.7 Nuestros conocimientos se quedan obsoletos a medida que se desarrollan técnicas, lenguajes y entornos nuevos. Las fuerzas del mercado cambiante pueden hacer que nuestra experiencia quede desfasada o sea irrelevante. Teniendo en cuenta el ritmo cada vez más veloz del cambio en nuestra sociedad tecnológica, esto puede ocurrir con bastante rapidez.
A medida que disminuye el valor de nuestro conocimiento, también se reduce nuestro valor para nuestra empresa o nuestro cliente. Queremos evitar que eso suceda.
Nuestra capacidad para aprender cosas nuevas es nuestro activo estratégico más importante. Pero ¿cómo aprendemos a aprender, y cómo sabemos qué aprender?
Nos gusta pensar que todos los hechos que los programadores saben acerca de la informática, los dominios de aplicación en los que trabajan y toda su experiencia son como sus carteras de conocimientos. Gestionar una cartera de conocimientos es muy similar a gestionar una cartera de valores:
1.Los inversores serios invierten con regularidad, como costumbre.
2.
