Autor:
- Titus Winters
- Tom Manshreck
- Hyrum Wright
Páginas: 646
Editorial: Alfaomega – Marcombo
$78.000
Autor:
Páginas: 646
Editorial: Alfaomega – Marcombo
Crédito sujeto a aprobación.
¿Tienes dudas? Consulta nuestra Ayuda.
Hoy en día, los ingenieros de software necesitan saber no solo cómo programar eficazmente, sino también cómo desarrollar prácticas de ingeniería para que la base de código sea sostenible y funcione bien. Este libro hace hincapié en esta diferencia, entre la programación y la ingeniería de software.
¿Cómo pueden gestionar los ingenieros de software una base de código viva que evoluciona y responde a requisitos y demandas cambiantes a lo largo de su vida?
A partir de su experiencia en Google, los ingenieros de software Titus Winters y Hyrum Wright, junto con el escritor técnico Tom Manshreck, presentan una mirada sincera y perspicaz sobre cómo construyen y mantienen el software algunos de los principales profesionales del mundo. Este libro trata de la cultura, los procesos y las herramientas de ingeniería exclusivas de Google, y de cómo estos aspectos contribuyen a la eficacia de una organización de ingeniería de software.
Explorará tres principios fundamentales que las organizaciones de software deben tener en cuenta a la hora de diseñar, establecer la arquitectura, escribir y mantener el código:
Cómo afecta el tiempo a la sostenibilidad del software y cómo hacer que su código resista el paso del tiempo.
Cómo afecta la escala a la viabilidad de las prácticas de software dentro de una organización de ingeniería de software.
Qué contrapartidas debe tener en cuenta el ingeniero de software al evaluar las decisiones de diseño y los desarrollos.
Contenidos
Prólogo xix
Prefacio xxi
Parte I Tesis
1 ¿Qué es la ingeniería de software? 1
Tiempo y cambio 4
Ley de Hyrum 6
Ejemplo: ordenación hash 7
¿Por qué no aspirar a que «nada cambie»? 8
Escala y eficiencia 10
Políticas que no escalan 11
Políticas que escalan adecuadamente 12
Ejemplo: actualización del compilador 13
Desplazamiento hacia la izquierda 15
Contrapartidas y costes 16
Ejemplo: rotuladores 18
Aportaciones a la toma de decisiones 19
Ejemplo: compilaciones distribuidas 19
Ejemplo: decidir entre tiempo y escala 21
Revisar decisiones, cometer errores 22
Ingeniería de software frente a programación 22
Conclusión 23
Resumen 23
Parte II Cultura
2 Cómo trabajar bien en equipo 25
Ayúdeme a ocultar mi código 25
El mito del genio 26
La ocultación se considera perjudicial 28
Detección temprana 29
El factor autobús 29
Ritmo del progreso 30
En resumen, no se esconda 32
Todo es cuestión de equipo 32
Los tres pilares de la interacción social 33
¿Por qué importan estos pilares? 34
Humildad, respeto y confianza en la práctica 34
Cultura post mortem sin sentimiento de culpa 38
Ser Googley 40
Conclusión 41
Resumen 42
3 Compartir conocimientos 43
Desafíos para el aprendizaje 43
Filosofía 45
Preparación del escenario: seguridad psicológica 46
Tutoría 46
Seguridad psicológica en grupos grandes 47
Aumente sus conocimientos 48
Haga preguntas 48
Comprenda el contexto 49
Escalado de las preguntas: pregunte a la comunidad 50
Chats de grupo 50
Listas de correo electrónico 51
YAQS: plataforma de preguntas y respuestas 52
Escalado del conocimiento: siempre hay algo que enseñar 52
Horas de oficina 53
Charlas y clases de tecnología 53
Documentación 54
Código 56
Escalado de los conocimientos de la organización 57
Cultivar la cultura de compartir el conocimiento 57
Establecimiento de fuentes canónicas de información 59
Manténgase al día 62
Legibilidad: tutorías estandarizadas a través de la revisión del código 64
¿Qué es el proceso de legibilidad? 64
¿Por qué someterse a este proceso? 66
Conclusión 68
Resumen 69
4 Ingeniería para la equidad 71
Los prejuicios son la norma 72
Comprensión de la necesidad de la diversidad 74
Desarrollo de capacidades multiculturales 75
Hacer que se pueda procesar la diversidad 77
Rechazo de enfoques singulares 78
Desafío a los procesos establecidos 79
Valores frente a resultados 80
Mantener la curiosidad, seguir adelante 81
Conclusión 82
Resumen 82
5 Cómo liderar un equipo 83
Gerentes y líderes en tecnología (y ambos) 83
El gerente de ingeniería 84
El líder en tecnología 84
El gerente líder de tecnología 84
Pasar de la función de colaborador individual a la función de liderazgo 86
Lo único que hay que temer es…, bueno, todo 86
Liderazgo de servicio 87
El gerente de ingeniería 88
«Gerente» es una palabra de cuatro letras 88
El gerente de ingeniería en la actualidad 89
Antipatrones 91
Antipatrón: contratar a personas fáciles de manejar 91
Antipatrón: ignorar a las personas de bajo rendimiento 92
Antipatrón: ignorar los problemas de carácter personal 93
Antipatrón: ser amigo de todos 94
Antipatrón: comprometer el listón de contratación 94
Antipatrón: tratar al equipo como si fueran niños 95
Patrones positivos 96
Perder el ego 96
Ser un maestro zen 97
Ser catalizador 99
Eliminar obstáculos 99
Ser maestro y mentor 100
Establecer metas claras 100
Ser honesto 101
Rastrear la satisfacción 103
La pregunta inesperada 103
Otros consejos y trucos 104
Las personas somos como las plantas 106
Motivación intrínseca frente a motivación extrínseca 107
Conclusión 109
Resumen 109
6 Liderazgo a escala 111
Siempre hay que decidir 111
La parábola del aeroplano 112
Identificación de las orejeras 113
Señalar las contrapartidas clave 113
Decidir y, después, repetir 114
Siempre hay que dejar solo al equipo 116
Su misión: formar a un equipo «autónomo» 117
División del espacio del problema 117
Siempre hay que mantenerse escalando 120
El ciclo del éxito 121
Lo importante frente a lo urgente 122
Aprender a dejar caer pelotas al suelo 124
Proteja su energía 125
Conclusión 127
Resumen 127
7 Medición de la productividad de la ingeniería 129
¿Por qué debemos medir la productividad de la ingeniería? 129
Triaje: ¿vale la pena medirlo? 131
Selección de métricas significativas con objetivos y señales 135
Objetivos 136
Señales 138
Métricas 139
Uso de datos para validar métricas 139
Actuar y realizar un seguimiento de los resultados 143
Conclusión 144
Resumen 144
Parte III Procesos
8 Guías de estilo y normas 145
¿Por qué tenemos normas? 146
Creación de normas 147
Principios rectores 147
Guía de estilo 156
Cambio de las normas 159
El proceso 161
Árbitros de estilo 161
Excepciones 162
Orientación 163
Aplicación de las normas 164
Comprobadores de errores 166
Formateadores de código 167
Conclusión 169
Resumen 170
9 Revisión del código 171
Flujo de revisión del código 172
Cómo funciona la revisión de código en Google 173
Beneficios de la revisión de código 176
Corrección de código 177
Comprensión de código 179
Coherencia del código 180
Beneficios psicológicos y culturales 181
Compartir conocimientos 182
Mejores prácticas de la revisión de código 183
Sea cortés y profesional 183
Escriba cambios pequeños 184
Escriba descripciones de los cambios que tengan calidad 186
Mantenga al mínimo el número de revisores 186
Automatizar donde sea posible 187
Tipos de revisiones de código 187
Revisiones del código greenfield 188
Cambios de comportamiento, mejoras y optimizaciones 188
Corrección de errores y reversiones 189
Refactorizaciones y cambios a gran escala 190
Conclusión 190
Resumen 191
10 Documentación 193
¿Qué calificar como «documentación»? 193
¿Por qué es necesaria la documentación? 194
La documentación es como el código 196
Conozca a su audiencia 199
Tipos de audiencias 199
Tipos de documentación 201
Documentación de referencia 201
Documentos de diseño 204
Tutoriales 205
Documentación conceptual 207
Páginas de destino 208
Revisiones de la documentación 208
Filosofía de la documentación 210
QUIÉN, QUÉ, CUÁNDO, DÓNDE y POR QUÉ 211
El principio, la parte central y el final 212
Parámetros de la documentación de calidad 212
Documentación obsoleta 213
¿Cuándo necesita a escritores técnicos? 214
Conclusión 214
Resumen 215
11 Descripción general de las pruebas 217
¿Por qué escribimos pruebas? 218
La historia de Google Web Server 219
Pruebas al ritmo del desarrollo moderno 220
Escribir, ejecutar, reaccionar 222
Ventajas de probar el código 223
Diseño de un conjunto de pruebas 225
Tamaño de las pruebas 225
Alcance de las pruebas 230
Regla de Beyoncé 233
Nota sobre la cobertura del código 233
Pruebas a escala de Google 234
Dificultades de un gran conjunto de pruebas 235
Historial de pruebas en Google 237
Clases de orientación 238
Pruebas certificadas 239
Pruebas en los aseos 239
La cultura de pruebas actualmente 240
Límites de las pruebas automatizadas 241
Conclusión 242
Resumen 243
12 Pruebas unitarias 245
Importancia del mantenimiento 246
Prevención de pruebas frágiles 247
Esfuércese en lograr pruebas que no cambien 247
Pruebas a través de API públicas 249
Comprobar el estado, no las interacciones 252
Escriba pruebas claras 253
Haga que las pruebas sean completas y concisas 255
Pruebe los comportamientos, no los métodos 255
No ponga la lógica en las pruebas 261
Escriba mensajes de error claros 262
Pruebas y uso compartido de código: DAMP, no DRY 263
Valores compartidos 265
Configuración compartida 267
Helpers compartidos y validación 269
Definición de infraestructura de pruebas 269
Conclusión 270
Resumen 270
13 Dobles de pruebas 273
El impacto de los dobles de pruebas en el desarrollo del software 274
Dobles de pruebas en Google 275
Conceptos básicos 275
Un ejemplo de dobles de pruebas 275
Costuras 276
Marcos de trabajo de simulación 278
Técnicas para utilizar los dobles de pruebas 279
Simulación 279
Stubbing 279
Pruebas de interacción 280
Implementaciones reales 281
Preferencia de las implementaciones reales a las aisladas 281
Cómo decidir cuándo utilizar una implementación real 283
Simulación 285
¿Por qué son importantes las simulaciones? 286
¿Cuándo deben escribirse las simulaciones? 286
Fidelidad de las simulaciones 287
Las simulaciones se deben probar 288
¿Qué hacer si no hay una simulación disponible? 289
Stubbing 289
Los peligros de abusar del stubbing 290
¿Cuándo es adecuado utilizar stubbing? 292
Pruebas de interacción 292
Preferencia de las pruebas de estado a las pruebas de interacción 292
¿Cuándo son apropiadas las pruebas de interacción? 294
Mejores prácticas para las pruebas de interacción 294
Conclusión 297
Resumen 297
14 Pruebas más grandes 299
¿Qué son las «pruebas más grandes»? 299
Fidelidad 300
Brechas frecuentes en las pruebas unitarias 301
¿Por qué no realizar pruebas más grandes? 303
Pruebas de gran tamaño en Google 304
Pruebas más grandes y el tiempo 305
Pruebas más grandes a escala de Google 306
Estructura de una prueba grande 308
El sistema bajo prueba 308
Datos para la prueba 313
Verificación 314
Tipos de pruebas más grandes 315
Prueba funcional de uno o más binarios interactivos 316
Pruebas de los navegadores y dispositivos 316
Pruebas de rendimiento, carga y estrés 316
Pruebas de la configuración de implementación 317
Pruebas exploratorias 318
Pruebas de regresión de diferencias A/B 319
UAT 320
Sistemas de sondeo y análisis canario 321
Recuperación en caso de catástrofe e ingeniería del caos 322
Evaluación al usuario 323
Grandes pruebas y el flujo de trabajo del desarrollador 324
Creación de pruebas grandes 325
Ejecución de pruebas grandes 325
Propiedad de las pruebas grandes 328
Conclusión 329
Resumen 330
15 Depreciación 331
¿Por qué hacer depreciación? 332
¿Por qué es tan difícil la depreciación? 333
Depreciación durante el diseño 335
Tipos de depreciación 336
Depreciación recomendada 336
Depreciación obligatoria 337
Advertencias de depreciación 339
Gestión del proceso de depreciación 340
Propietarios de los procesos 340
Hitos 341
Depreciación de las herramientas 342
Conclusión 343
Resumen 344
Parte IV Herramientas
16 Control de versiones y gestión de ramas 345
¿Qué es el «control de versiones»? 345
¿Por qué es importante el control de versiones? 347
VCS centralizado frente a VCS distribuido 350
Fuente de verdad 353
Control de versiones frente a gestión de dependencias 355
Gestión de ramas 355
El trabajo en curso es similar a una rama 355
Ramas de desarrollo 356
Ramas de versión 368
Control de versiones en Google 359
One Version 360
Escenario: varias versiones disponibles 361
La norma «One Version» 362
Casi sin ramas longevas 362
¿Qué pasa con las ramas de versión? 364
Monorepos 365
Futuro del control de versiones 366
Conclusión 368
Resumen 369
17 Code Search 371
La interfaz de usuario de Code Search 372
¿Cómo utilizan los Googlers Code Search? 373
¿Dónde? 373
¿Qué? 374
¿Cómo? 374
¿Por qué? 374
¿Quién y cuándo? 375
¿Por qué una herramienta web independiente? 375
Escala 375
Vista global del código sin necesidad de configuración 376
Especialización 377
Integración con otras herramientas para desarrolladores 377
Presentacición de las API 379
Impacto de la escala en el diseño 379
Latencia de la consulta de búsqueda 380
Latencia del índice 381
Implementación de Google 382
Índice de búsqueda 382
Clasificación 384
Selección de contrapartidas 387
Completitud: repositorio en head 387
Completitud: todos los resultados frente a los más relevantes 388
Completitud: head versus ramas versus toda la historia versus
espacios de trabajo 389
Expresividad: token frente a subcadena frente a expresión regular 390
Conclusión 391
Resumen 392
18 Sistemas de compilación y filosofía de la compilación 393
Propósito de un sistema de compilación 393
¿Qué sucede si no existe un sistema de compilación? 395
Pero todo lo que necesito ¡es un compilador! 395
¿Scripts de shell al rescate? 396
Sistemas de compilación modernos 397
Todo se trata de dependencias 398
Sistemas de compilación basados en tareas 398
Sistemas de compilación basados en artefactos 403
Compilaciones distribuidas 410
Tiempo, escala, contrapartidas 414
Tratamiento de los módulos y las dependencias 415
La utilización de módulos detallados y la regla 1:1:1 415
Minimización de la visibilidad de los módulos 416
Gestión de dependencias 416
Conclusión 422
Resumen 423
19 Critique, herramienta de revisión del código de Google 425
Principios de las herramientas de revisión del código 425
Flujo de revisión de código 427
Notificaciones 428
Nivel 1: realización de un cambio 429
Diferenciaciones 429
Resultados del análisis 431
Integración estricta de herramientas 432
Nivel 2: revisión de la solicitud 433
Niveles 3 y 4: comprensión y comentarios del cambio 434
Comentarios 435
Comprensión del estado de un cambio 436
Nivel 5: aprobación del cambio (puntuación del cambio) 438
Nivel 6: confirmación del cambio 440
Después de la confirmación: seguimiento del historial 440
Conclusión 441
Resumen 442
20 Análisis estático 443
Características del análisis estático eficaz 444
Escalabilidad 444
Usabilidad 444
Lecciones clave para hacer que el análisis estático funcione 445
Céntrese en la satisfacción de los desarrolladores 445
Haga que el análisis estático forme parte del flujo principal
de trabajo del desarrollador 446
Permita la contribución de los usuarios 447
Tricorder: plataforma de análisis estático de Google 447
Herramientas integradas 449
Canales de retroalimentación integrados 450
Sugerencias de correcciones 451
Personalización por proyectos 451
Presubmits 453
Integración en el compilador 453
Análisis durante la edición y navegación por el código 454
Conclusión 455
Resumen 455
21 Gestión de dependencias 457
¿Por qué resulta tan difícil la gestión de dependencias? 459
Requisitos conflictivos y dependencias de diamante 459
Importación de dependencias 461
Promesas de compatibilidad 462
Consideraciones al hacer la importación 464
Cómo gestiona Google la importación de dependencias 465
Gestión de dependencias, en teoría 468
Nada cambia (también conocido como el «modelo
de dependencias estáticas») 468
Versionado semántico 469
Modelos de distribución por paquetes 471
Live at Head 471
Limitaciones de SemVer 473
SemVer puede que asegure una compatibilidad superior a la real 474
SemVer podría exagerar 474
Motivaciones 476
Minimum Version Selection 477
Entonces, ¿funciona SemVer? 478
Gestión de dependencias con recursos infinitos 479
Exportación de dependencias 482
Conclusión 486
Resumen 486
22 Cambios a gran escala 489
¿Qué es un «cambio a gran escala»? 490
¿Quién negocia con las LSC? 491
Obstáculos a los cambios atómicos 493
Limitaciones técnicas 493
Fusión de conflictos 494
Sin cementerios encantados 494
Heterogeneidad 495
Pruebas 496
Revisión de código 498
Infraestructura LSC 499
Políticas y cultura 500
Comprensión de la base de código 501
Gestión de cambios 502
Pruebas 502
Soporte del lenguaje 502
El proceso LSC 504
Autorización 504
Creación de cambios 505
Fragmentación y envío 506
Limpieza 509
Conclusión 510
Resumen 510
23 Integración continua 511
Conceptos de IC 513
Bucles de retroalimentación rápida 513
Automatización 515
Prueba continua 517
Desafíos de la IC 523
Pruebas herméticas 524
Integración continua en Google 527
Caso de estudio de IC: Google Takeout 530
Pero no puedo permitirme IC 537
Conclusión 537
Resumen 538
24 Entrega continua 539
Modismos de entrega continua en Google 540
La rapidez es un deporte de equipo: cómo dividir una implementación
en partes manejables 541
Evaluación de cambios en el aislamiento: funciones de protección
de banderas 542
La lucha por conseguir agilidad: configuración de un tren de lanzamiento 543
Ningún binario es perfecto 544
Cumpla con su fecha límite de lanzamiento 545
Calidad y enfoque en el usuario: envíe solo lo que se utilice 545
Desplazamiento a la izquierda: tomar antes decisiones basadas en los datos 546
Cambio de la cultura del equipo: creación de disciplina en el despliegue 548
Conclusión 549
Resumen 550
25 La computación como servicio 551
Dominio del entorno informático 552
Automatización del trabajo 552
Contenerización y tenencia múltiple 554
Resumen 557
Escritura de software para la computación gestionada 557
Arquitectura para el fracaso 557
Trabajos por lotes frente a trabajos de servicio 559
Gestión del estado 561
Conexión a un servicio 563
Código único 564
CaaS con el tiempo y la escala 565
Los contenedores como abstracción 565
Un servicio para gobernarlos a todos 568
Configuración enviada 570
Elección de un servicio informático 571
Centralización frente a personalización 573
Nivel de abstracción: sin servidores 575
Público versus privado 579
Conclusión 581
Resumen 582
Parte V Conclusión
Epílogo 583
Índice 585