Recomendo sem dúvida a leitura não apenas para programadores iniciantes, mas também para quem já está há tempo nessa área. O livro lembra muito o «Código Limpo» do Robert Martin que li um pouco antes, mas, na minha opinião, este tem exemplos melhores e aborda mais temas.
Primero describiré brevemente todas las secciones principales del libro con mis pequeños comentarios. Luego escribiré una conclusión general con las ventajas y desventajas del libro. Spoiler: el libro es muy bueno y tiene muchas más ventajas que desventajas.
Fundamentos del desarrollo de software
Esta parte del libro está completamente dedicada a los conceptos básicos de la programación y a explicar de qué partes se compone y qué incluye el desarrollo de software. Aquí se consideran etapas como la definición de requisitos, desarrollo, pruebas y mantenimiento. Por supuesto, están descritas de forma más detallada e interesante, por lo que no será aburrido leerlo. Aunque esta sección en particular será útil principalmente para aquellos que recién comienzan su carrera como programadores. Para una mejor comprensión, el autor utiliza metáforas y analogías (por ejemplo, la analogía con la construcción). Como en muchos libros similares, aquí también se menciona el coste de los errores en las diferentes etapas del desarrollo (de momento de forma superficial, ya que se tratará en detalle más adelante). Otra ventaja de esta sección es que ya se menciona que existen diferentes enfoques para el desarrollo: iterativos (en espiral) y en cascada. Se describen brevemente las ventajas y desventajas de cada enfoque. No se habla aquí de términos y enfoques más modernos como Scrum o Agile, pero las metodologías mencionadas por el autor son suficientes para un principiante. Finalmente, el autor toca características importantes que debe tener el software, como: escalabilidad, mantenibilidad, portabilidad, tolerancia a fallos, seguridad y otras.
Código de alta calidad
Si crees que después de bastante, pero interesante, material vas a sumergirte directamente en la sección sobre cómo escribir código genial y discutir temas polémicos sobre nombrado de funciones, variables, uso de tabs y espacios, te equivocas. A continuación viene una sección entera sobre diseño de software. No diría que se trata exactamente de arquitectura completa — como la arquitectura en capas (si hablamos de monolitos) o la basada en microservicios. Más bien aquí se hace hincapié en describir el sistema en general, identificando grandes módulos dentro de ese sistema, y luego diseñando clases individuales, que se describen en forma de métodos. Es una especie de programación abstracta utilizando diagramas y esquemas de bloques. No puedo garantizar que este enfoque (con diagramas de bloques) se use en todas partes hoy en día. Personalmente, solo me topé con esto activamente en el colegio y en la universidad. En ningún trabajo tuve que dibujar diagramas de bloques, ni tampoco lo hicieron mis amigos y colegas. Además, en esta sección se hace referencia a la POO, y en casos de programación funcional puede que no sea tan simple ni obvio. Así que es interesante familiarizarse con esta sección, pero qué tanto aplicarla en la práctica — es una gran pregunta.
Aquí más bien se habla de resolver tareas pequeñas y medianas, no de proyectos completos. No se mencionan tecnologías, se usa abstracción en todo y se sigue SOLID. Por cierto, el enfoque POO está explicado bastante bien. Claro, podrías leer un libro aparte solo sobre eso, pero para principiantes esto es suficiente. Se dedica bastante tiempo también a cómo nombrar correctamente las clases y métodos. Se explican las razones para crear métodos separados o no. Se mencionan algunas palabras sobre excepciones y manejo de errores. Otro aspecto interesante y útil para principiantes es la programación usando pseudocódigo. A mí me gusta llamarlo programación en papel. Para los novatos será especialmente útil si no saben aún cómo escribir completamente un algoritmo.
Variables
A partir de esta sección ya recomendaría leer el libro con más atención incluso a programadores con experiencia que ya han realizado varios proyectos y llevan años en el desarrollo.
Cien páginas de contenido. Uno pensaría, ¿qué tanto se puede discutir sobre variables? Pues bastante, y mucho de ello es útil. La sección comienza con un test interesante sobre tipos de datos (incluyendo árboles, montículos y otros). Se dan ejemplos de buenas y malas inicializaciones de variables en distintos lenguajes. Se explican los ámbitos de visibilidad con imágenes claras. Se enumeran consejos generales para minimizar el ámbito de visibilidad.
Se toca el tema de la duración de vida de los datos, el nombrado de variables temporales, banderas (interruptores), convenciones de nombres en diferentes lenguajes. Se analizan abreviaturas apropiadas y aceptadas, prefijos estándar, y formas correctas de abreviar nombres.
Hacia el final de la sección se hace un repaso más detallado de los tipos de datos y sus limitaciones: números de punto flotante, enums, constantes, tipos de datos personalizados, arreglos, estructuras, punteros.
Operadores
En esta parte del libro se habla sobre la organización secuencial del código, uso de operadores condicionales y bucles. La sección también ocupa 100 páginas, por lo que hay mucho que analizar. Por ejemplo, hay una comparación detallada de cómo funcionan (en duración y rendimiento) los mismos bucles en distintos lenguajes: C, C++, C#, Java y Visual Basic. También se tocan temas como la recursión y el uso de goto.
Mejora del código
La sección consta de los siguientes capítulos:
- Calidad del software
- Construcción colaborativa
- Pruebas realizadas por desarrolladores
- Depuración
- Refactorización
- Estrategias de optimización del código
- Métodos de optimización del código
Al principio, nuevamente se mencionan los requisitos y características del software — casi los mismos que se citaron al inicio. Se habla del coste de encontrar y corregir defectos. La sección es en general teórica y contiene poco código. Se menciona la programación en pareja. Como escribí más arriba al describir la primera sección, el material aquí es algo discutible porque mucho ha quedado anticuado. Se habla de pruebas. Por cierto, pronto publicaré una reseña sobre un libro dedicado exclusivamente a las pruebas. Pero a diferencia de otros libros que enseñan qué tipos de tests existen, qué cubrir y cómo escribirlos, aquí el autor aborda el tema desde otro ángulo. Por ejemplo, describe errores típicos en pruebas, como no analizar valores límite. Habla sobre monitores de cobertura de tests (que ya existían en esa época), menciona algunas herramientas de testing, TDD y ciertos estándares aceptados.
Pero lo más interesante de esta sección empieza en el capítulo sobre refactorización. Otro ejemplo con un bucle for en diferentes lenguajes muestra cómo la misma estructura funciona de manera distinta y consume recursos dependiendo del lenguaje. El tipo de compilador también tiene gran impacto. Hay una tabla interesante que muestra el rendimiento relativo del código escrito en distintos lenguajes. A los ejemplos comparativos entre C, C++, C#, Java y Visual Basic se suman PHP y Python. Especialmente se nota la comparación de operaciones comunes en C++ y Java. Es difícil decir cuán relevantes son ahora estas pruebas, ya que han salido nuevas versiones de compiladores, los lenguajes añaden nuevas características, e incluso los intérpretes, como el de PHP, se reescriben y optimizan en cada versión. Pero el mensaje de este capítulo no era tanto comparar tiempos de ejecución de un algoritmo o función básica (como hallar la raíz cuadrada), sino mostrar que el mismo código (función) en distintos lenguajes puede comportarse de forma completamente diferente (a veces más lento, otras veces más rápido).
Al final de la sección hay un ejemplo de cómo cambiar los tipos de datos a otros más apropiados puede influir en la velocidad de ejecución del algoritmo (nuevamente, ejemplo en varios lenguajes).
Cuestiones del sistema
La sección consta de los siguientes capítulos:
- Cómo el tamaño del programa influye en la construcción
- Gestión de la construcción
- Integración
- Herramientas de programación
¿Qué tiene de interesante? Por ejemplo, se aborda el tema de cómo el tamaño del equipo puede afectar a la eficiencia, y también se enumera la proporción aproximada de programadores en la escritura de código en relación con el código total según el tamaño del equipo. Se habla de cómo el tamaño del proyecto en líneas de código se correlaciona aproximadamente con la densidad de errores. Es posible que los gráficos y tablas sean algo discutibles, pero vale la pena leer sobre ello. De hecho, recomendaría esta sección especialmente a los gerentes.
En general, la sección es teórica y casi no hay código. También se menciona el tema de los cambios en los requisitos durante la ejecución del proyecto y cómo esto puede retrasar el proyecto. Además, se enumeran los principales factores relacionados con los programadores y el equipo que también pueden influir en la velocidad. El autor incluye entre estos factores:
- experiencia y habilidades del programador;
- motivación del equipo;
- calidad de la gestión;
- cantidad de código reutilizado;
- rotación de personal;
- variabilidad de los requisitos;
- y otros.
Se toca el tema de la relación y la construcción de la comunicación con los programadores. Por ejemplo, cómo los programadores pasan su tiempo. Es decir, ya en aquella época el tema del agotamiento era relevante. También se menciona aquí otro tema relacionado con cuestiones de "religión", como la elección del IDE, la nomenclatura y el estilo de código, el uso de linters y otros aspectos.
Se discute el tema de la integración: por etapas e incremental, en forma de T y algunas otras. Se describen las ventajas y desventajas de cada una. Pero el material es bastante discutible, ya que no se menciona nada sobre las prácticas modernas de CI/CD.
Maestría en programación
En resumen, esta es una sección general del libro que incluye muchas otras y también hace referencia a las secciones ya leídas. Se precisan consejos generales y también hay muchos ejemplos de código: desde la colocación de comentarios hasta el trabajo con clases y métodos. No diría que esta sección puede considerarse como la conclusión de todo el libro, más bien como un complemento a las anteriores. La sección termina con recomendaciones morales del autor, por ejemplo, sobre cómo tratar la pereza, la meticulosidad y otras cualidades. Al final, se presenta una enorme lista de bibliografía, lo que al menos indica un enfoque profesional del libro y un trabajo minucioso durante su escritura.
Conclusiones
Este libro tiene casi 900 páginas, pero que esto no te asuste, porque el material que contiene, en mi opinión, es incluso significativamente mejor que el de Robert Martin. Enumeremos los principales pros y contras del libro.
Contras:
- El libro es enorme, y no todo el mundo tiene la capacidad de leer algo así.
- El año de publicación no es el más reciente, por lo que algunos ejemplos y temas pueden estar desactualizados. Por ejemplo, no se mencionan algunos lenguajes de programación modernos, y los enfoques actuales para desplegar aplicaciones y las tecnologías de desarrollo de software han cambiado considerablemente.
Pros:
- Estructura excelente y comprensible.
- Lectura fácil.
- Al final de cada capítulo hay un resumen con los puntos importantes.
- A menudo se presentan ejemplos de código malo, que luego se mejoran hasta llegar a un buen código.
- El código se muestra en diferentes lenguajes, además se comparan algoritmos en varios lenguajes.
Sin duda, es un buen libro. Yo diría que es uno de los mejores libros teóricos sobre programación que vale la pena leer tanto para principiantes como para desarrolladores experimentados.