Делай как вGoogle
Скачать 5.77 Mb.
|
Глава 10. Документация ............................................................................................ 186 Что считается документацией? .............................................................................. 186 Зачем нужна документация? .................................................................................. 187 Документация как код ........................................................................................... 188 Знание своей аудитории ........................................................................................ 190 Виды документации ............................................................................................... 192 Обзоры документации ........................................................................................... 199 Философия документирования .............................................................................. 201 Когда привлекать технических писателей? ............................................................ 204 Заключение ........................................................................................................... 204 Итоги ..................................................................................................................... 205 Глава 11. Основы тестирования ................................................................................ 206 Почему мы пишем тесты? ...................................................................................... 207 Проектирование набора тестов ............................................................................. 213 Тестирование в масштабе Google .......................................................................... 222 История тестирования в Google ............................................................................. 224 Ограничения автоматизированного тестирования ................................................. 228 Заключение ........................................................................................................... 229 Итоги ..................................................................................................................... 230 Глава 12. Юнит-тестирование ................................................................................... 231 Важность удобства сопровождения ....................................................................... 232 Как предотвратить хрупкие тесты.......................................................................... 232 Создание ясных тестов .......................................................................................... 239 Повторное использование тестов и кода: DAMP, не DRY ........................................ 247 Заключение ........................................................................................................... 254 Итоги ..................................................................................................................... 255 Глава 13. Тестирование с дублерами ........................................................................ 256 Влияние тестовых дублеров на разработку ПО ...................................................... 256 Тестовые дублеры в Google ................................................................................... 257 Базовые понятия ................................................................................................... 258 10 Оглавление Приемы использования тестовых дублеров ........................................................... 261 Реальные реализации ............................................................................................ 263 Имитации .............................................................................................................. 267 Заглушки ............................................................................................................... 271 Тестирование взаимодействий .............................................................................. 273 Заключение ........................................................................................................... 278 Итоги ..................................................................................................................... 278 Глава 14. Крупномасштабное тестирование .............................................................. 279 Что такое большие тесты? ..................................................................................... 279 Большие тесты Google ........................................................................................... 284 Структура большого теста ..................................................................................... 287 Типы больших тестов ............................................................................................ 294 Большие тесты и рабочий процесс разработчика ................................................... 302 Заключение ........................................................................................................... 307 Итоги ..................................................................................................................... 307 Глава 15. Устаревание .............................................................................................. 308 Почему необходимо заботиться об устаревании? ................................................... 309 Почему устаревание вызывает такие сложности? .................................................. 310 Подходы к прекращению поддержки ..................................................................... 313 Управление процессом прекращения поддержки ................................................... 316 Заключение ........................................................................................................... 319 Итоги ..................................................................................................................... 320 ЧАСТЬ IV. ИНСТРУМЕНТЫ ...................................................................... 321 Глава 16. Управление версиями и ветвями ............................................................... 322 Что такое управление версиями? ........................................................................... 322 Управление ветвями .............................................................................................. 331 Управление версиями в Google .............................................................................. 335 Монолитные репозитории ...................................................................................... 340 Будущее управления версиями .............................................................................. 342 Заключение ........................................................................................................... 344 Итоги ..................................................................................................................... 345 Оглавление 11 Глава 17. Code Search ............................................................................................... 346 Пользовательский интерфейс Code Search ............................................................. 347 Как гуглеры используют Code Search? ................................................................... 348 Зачем понадобился отдельный веб-инструмент? ................................................... 350 Влияние масштаба на дизайн ................................................................................ 353 Реализация в Google .............................................................................................. 356 Некоторые компромиссы ....................................................................................... 361 Заключение ........................................................................................................... 365 Итоги ..................................................................................................................... 365 Глава 18. Системы и философия сборки ................................................................... 366 Назначение системы сборки .................................................................................. 366 Так ли необходимы системы сборки? ..................................................................... 367 Современные системы сборки ................................................................................ 370 Модули и зависимости ........................................................................................... 386 Заключение ........................................................................................................... 392 Итоги ..................................................................................................................... 393 Глава 19. Critique: инструмент обзора кода в Google ................................................. 394 Принципы оснащения обзора кода инструментами ................................................ 394 Процесс обзора кода ............................................................................................. 395 Этап 1: добавление изменений .............................................................................. 397 Этап 2: запрос на рецензирование ........................................................................ 401 Этапы 3 и 4: исследование и комментирование изменения .................................... 403 Этап 5: одобрение изменений (оценка изменений) ................................................ 406 Этап 6: фиксация изменения ................................................................................. 408 Заключение ........................................................................................................... 409 Итоги ..................................................................................................................... 410 Глава 20. Статический анализ ................................................................................... 411 Характеристики эффективного статического анализа ............................................ 411 Ключевые уроки внедрения статического анализа ................................................ 413 Tricorder: платформа статического анализа в Google ............................................. 415 Заключение ........................................................................................................... 422 Итоги ..................................................................................................................... 422 12 Оглавление Глава 21. Управление зависимостями ....................................................................... 424 Почему управлять зависимостями так сложно? ...................................................... 425 Импортирование зависимостей .............................................................................. 428 Теория управления зависимостями ........................................................................ 433 Ограничения SemVer ............................................................................................. 438 Управление зависимостями с бесконечными ресурсами ......................................... 443 Заключение ........................................................................................................... 450 Итоги ..................................................................................................................... 450 Глава 22. Крупномасштабные изменения .................................................................. 452 Что такое крупномасштабное изменение? ............................................................. 452 Кто занимается крупномасштабными изменениями? .............................................. 454 Препятствия к атомарным изменениям .................................................................. 456 Инфраструктура для крупномасштабных изменений .............................................. 461 Процесс крупномасштабных изменений ................................................................. 465 Заключение ........................................................................................................... 471 Итоги ..................................................................................................................... 471 Глава 23. Непрерывная интеграция .......................................................................... 472 Идеи непрерывной интеграции .............................................................................. 474 Непрерывная интеграция в Google ........................................................................ 487 Заключение ........................................................................................................... 496 Итоги ..................................................................................................................... 496 Глава 24. Непрерывная поставка .............................................................................. 497 Идиомы непрерывной поставки в Google ............................................................... 498 Скорость — это командная победа: как разделить процесс развертывания на управляемые этапы .......................................................................................... 499 Оценка изменений в изоляции: флаги управления функциями .............................. 500 Стремление к гибкости: создание серии выпусков ................................................. 501 Качество и ориентация на пользователя: поставляйте только то, что используется ................................................................................................... 503 Сдвиг влево: раннее принятие решений на основе данных .................................... 504 Изменение культуры команды: дисциплина развертывания ................................... 506 Заключение ........................................................................................................... 507 Итоги ..................................................................................................................... 507 Оглавление 13 Глава 25. Вычисления как услуга .............................................................................. 509 Приручение вычислительной среды ...................................................................... 510 Написание ПО для управляемых вычислений ........................................................ 515 CaaS во времени и масштабе ................................................................................. 522 Выбор вычислительной услуги ............................................................................... 528 Заключение ........................................................................................................... 537 Итоги ..................................................................................................................... 538 ЧАСТЬ V. ЗАКЛЮЧЕНИЕ ......................................................................... 539 Послесловие ........................................................................................................ 540 Об авторах ........................................................................................................... 542 Об обложке ......................................................................................................... 543 Предисловие Я всегда восхищался тем, как в Google все устроено, и мучил своих друзей-гугле- ров (сотрудников Google) расспросами. Как им удается поддерживать такое огромное монолитное хранилище кода? Как десятки тысяч инженеров согласованно работают в тысячах проектов? Как они поддерживают качество систем? Сотрудничество с «экс-гуглерами» только усилило мое любопытство. Если в одной команде с вами работает бывший инженер Google, вы будете часто слышать: «А вот мы в Google...» Переход из Google в другие компании кажется шокирующим опытом, по крайней мере для инженера. Человек со стороны считает системы и процессы разработки кода в Google одними из лучших в мире, учитывая масштаб компании и то, как часто люди хвалят ее. В книге «Разработка ПО. Делай как в Google» группа гуглеров (и экс-гуглеров) раскрывает обширный набор практик, инструментов и даже культурных аспектов, лежащих в основе программной инженерии в Google. Но эта книга не ограничива- ется простым описанием инструментария (о котором можно говорить бесконечно) и дополнительно описывает философию команды Google, которая помогает сотруд- никам адаптироваться к разным обстоятельствам. К моему восхищению, несколько глав книги посвящены автоматизированному тестированию, которое продолжает встречать активное сопротивление в отрасли. Самое замечательное в программной инженерии — это возможность добиться желаемо- го результата несколькими способами. В каждом проекте инженер должен учитывать множество компромиссов. Что можно заимствовать из открытого исходного кода? Что может спроектировать команда? Что имеет смысл поддерживать для масштаба? У своих друзей-гуглеров я хотел узнать, как устроен гигантский мир Google, богатый таланта- ми и средствами и отвечающий высочайшим требованиям к программному обеспече- нию (ПО). Их разнообразные ответы познакомили меня с неожиданными аспектами. В этой книге изложены эти аспекты. Конечно, Google — уникальная компания, и не- верно считать ее способ управления разработкой ПО единственно верным. Цель этой книги — помочь вам организовать работу и аргументировать принятие решений, свя- занных с тестированием, обменом знаниями и совместной деятельностью в команде. Возможно, вам никогда не придется создавать свой Google и вы не захотите исполь- зовать методы этой компании. Но, отказавшись от знакомства с практиками, разра- ботанными в Google, вы лишите себя богатого опыта, накопленного десятками тысяч инженеров, совместно работающих над разработкой софта более двух десятилетий. Это знание слишком ценно, чтобы закрывать на него глаза. Камиль Фурнье, автор книги «От разработчика до руководителя» (М.: МИФ, 2018) Вступление Что именно мы подразумеваем под программной инженерией? Что отличает «про- граммную инженерию» от «программирования» или «computer science»? И как под- ход Google связан с другими подходами в этой области, описанными во множестве книг в последние пятьдесят лет? Термины «программирование» и «программная инженерия» используются в отрасли взаимозаменяемо, хотя каждый из них имеет собственное значение. Студенты уни- верситетов, как правило, изучают computer science и работают как «программисты». Но «инженерия» подразумевает применение теоретических знаний для создания чего-то реального и точного. Инженеры-механики, инженеры-строители, авиа- ционные инженеры и специалисты в других инженерных дисциплинах — все они занимаются инженерным делом: используют теоретические знания для создания чего-то реального. Инженеры-программисты также создают «нечто реальное», но это «нечто» неосязаемо. В отличие от других инженерных сфер, программная инженерия более открыта для вариантов. Авиационные инженеры должны следовать стандартам, поскольку ошиб- ки в их расчетах могут нанести реальный ущерб. Программирование традиционно не имеет жестких ограничений, но, поскольку ПО интегрируется в нашу жизнь, мы должны определить и использовать более надежные методы его разработки. Надеемся, что эта книга поможет вам увидеть путь к созданию современного ПО. Программирование в долгосрочной перспективе На наш взгляд, программная инженерия охватывает не только написание кода, но и все инструменты и процессы создания и дальнейшей поддержки этого кода. Какие методики может внедрить организация, занимающаяся разработкой ПО, чтобы со- хранять ценность кода в долгосрочной перспективе? Как инженеры могут сделать кодовую базу более устойчивой, а саму дисциплину программной инженерии более строгой? У нас нет конкретных ответов на эти вопросы, но мы надеемся, что команд- ный опыт Google, накопленный за последние два десятилетия, поможет нам их найти. Одна из ключевых идей, которой мы делимся в этой книге, заключается в том, что программную инженерию можно рассматривать как «программирование, интегри- рованное во времени». Какие практики сделают код устойчивым — способным реа- гировать на изменения — в течение его жизненного цикла (от проекта его создания и внедрения до его устаревания)? В этой книге подчеркиваются три фундаментальных принципа, которые, по нашему мнению, следует учитывать при проектировании, разработке и написании кода. 16 Вступление Время и изменения Как код должен адаптироваться на протяжении срока действия. Масштаб и рост Как организация должна адаптироваться по мере своего развития. Компромиссы и издержки Как организация должна принимать решения, основываясь на показателях вре- мени, изменений, масштаба и роста. В книге мы часто будем возвращаться к этим принципам и показывать, как они вли- яют на инженерные практики и обеспечивают их устойчивость. (Полное обсуждение этих принципов смотрите в главе 1.) Точка зрения Google В компании Google сложился свой уникальный взгляд на рост и развитие устойчивого ПО, основанный на его масштабе и долговечности. Надеемся, что уроки, которые мы извлекли, найдут отражение и в вашей компании, которая тоже развивается и ис- пользует все более устойчивые практики. Темы, обсуждаемые в этой книге, мы разделили на три основных аспекта ландшафта программной инженерии, сложившихся в Google: y культура; y процессы; y инструменты. Культура Google уникальна, но опыт, который мы получили, изучая ее, широко при- меним. В главах, посвященных культуре (часть II), мы подчеркнули коллективный характер разработки ПО и необходимость культуры сотрудничества для развития организации и сохранения ее эффективности. Методики, описанные в части III «Процессы», знакомы большинству инженеров-про- граммистов, но мы отметили, что большой размер кодовой базы Google и долгий срок ее действия обеспечивают надежную основу для выработки оптимальных практик. Мы научились учитывать время и масштаб, а также определили области, где у нас пока нет удовлетворительных ответов. Наконец, в части IV «Инструменты» мы использовали инвестиции в инфраструк- туру инструментов, чтобы получить дополнительные преимущества по мере роста и устаревания кодовой базы. Некоторые из этих инструментов специфичны для Google, но по возможности мы даем ссылки на их альтернативы. Мы полагаем, что основные идеи с успехом можно применять в большинстве инженерных организаций. Культура, процессы и инструменты, представленные в этой книге, описывают уроки, которые типичный инженер-программист извлекает в процессе работы. Конечно, Google не обладает монополией на полезные советы, и мы делимся своим опытом Условные обозначения 17 не для того, чтобы диктовать вам правила. Эта книга — наша точка зрения, и мы на- деемся, что вы найдете ее полезной и сможете применять наш опыт непосредственно или использовать его в качестве отправной точки при выработке своих практик, специфичных для вашей предметной области. Также эта книга не является учебником. В самой компании Google по-прежнему недостаточно эффективно применяются многие идеи, представленные здесь. Наш опыт является результатом наших неудач: мы все еще допускаем ошибки, внедряем несовершенные решения и должны последовательно улучшать код. Тем не менее огромный размер Google гарантирует существование множества решений для каждой проблемы. Мы надеемся, что в этой книге нам удалось собрать самые лучшие из них. Что не отражено в книге Эта книга не охватывает вопросы проектирования ПО (собранная по этой теме ин- формация заслуживает отдельной книги). Мы привели некоторый код, но только для примера, чтобы показать основные принципы, которые не зависят от языка, и в этих главах практически нет рекомендаций по «программированию». Также эта книга не охватывает многих важных вопросов, касающихся разработки ПО, таких как управление проектами, разработка API, усиление безопасности, интернациона- лизация, применение фреймворков пользовательского интерфейса и других проблем, связанных с конкретным языком программирования. Мы решили оставить эти темы в стороне, понимая, что не сможем раскрыть их в достаточной степени, и уделили больше внимания инженерии, а не программированию. Заключительные примечания Эта книга является результатом совместных усилий и должна послужить окном в мир программной инженерии крупной организации, создающей свои продукты. Надеемся, что вместе с другими источниками она поможет нашей отрасли внедрять наиболее передовые и устойчивые практики. Но самое главное, мы хотим, чтобы книга вам понравилась и вы взяли на вооружение некоторые из представленных здесь уроков. Том Маншрек Условные обозначения В этой книге приняты следующие обозначения: Курсив Используется для обозначения новых терминов. Моноширинный шрифт Применяется для оформления листингов программ и программных элементов внутри обычного текста, таких как имена переменных и функций, баз данных, типов данных, переменных окружения, инструкций и ключевых слов. 18 Вступление Так обозначаются советы, предложения и примечания общего характера. Благодарности Эта книга является результатом труда множества людей. Все представленное здесь является квинтэссенцией знаний, накопленных нами и другими сотрудниками Google за долгие годы. Мы лишь передаем вам опыт, которым поделились с нами старшие коллеги из Google и других компаний. Перечислить их всех трудно, но мы выражаем им свою благодарность. Также мы благодарим Мелоди Мекфессель (Melody Meckfessel) за поддержку этого проекта на начальном этапе, а также Дэниела Джаспера (Daniel Jasper) и Дэнни Берлина (Danny Berlin) за помощь в его завершении. Эта книга была бы невозможна без колоссальных совместных усилий наших курато- ров, авторов и редакторов. Авторы и редакторы указаны в каждой главе или врезке, а здесь мы отметим всех, кто внес вклад в каждую главу, участвуя в обсуждении и подготовке к печати. y Что такое программная инженерия? Санджай Гемават (Sanjay Ghemawat), Эндрю Хаятт (Andrew Hyatt). y Успешная работа в команде: Сибли Бэкон (Sibley Bacon), Джошуа Мортон (Joshua Morton). y Обмен знаниями: Дмитрий Глазков, Кайл Лимонс (Kyle Lemons), Джон Риз (John Reese), Дэвид Симондс (David Symonds), Эндрю Тренк (Andrew Trenk), Джеймс Такер (James Tucker), Дэвид Колбреннер (David Kohlbrenner), Родриго Дамацио Бовендорп (Rodrigo Damazio Bovendorp). y Инженерия равенства: Камау Бобб (Kamau Bobb), Брюс Ли (Bruce Lee). y Как стать лидером в команде: Джон Уили (Jon Wiley), Лоран Ле Брун (Laurent Le Brun). y Масштабируемое лидерство: Брайан О’Салливан (Bryan O’Sullivan), Бха- рат Медиратта (Bharat Mediratta), Дэниел Джаспер (Daniel Jasper), Шайндел Шварц (Shaindel Schwartz). y Оценка продуктивности инженеров: Андреа Найт (Andrea Knight), Коллин Грин (Collin Green), Кетлин Садовски (Caitlin Sadowski), Макс-Канат Алексан- дер (Max-Kanat Alexander), Илай Янг (Yilei Yang). y Правила и руководства по стилю: Макс-Канат Александер (Max-Kanat Alexander), Титус Винтерс (Titus Winters), Мэтт Аустерн (Matt Austern), Джеймс Деннетт (James Dennett). Благодарности 19 y Код-ревью: Макс-Канат Александер (Max-Kanat Alexander), Брайан Ледгер (Brian Ledger), Марк Баролак (Mark Barolak). y Документация: Йонас Вагнер (Jonas Wagner), Смит Хинсу (Smit Hinsu), Джеф- фри Ромер (Geoffrey Romer). y Основы тестирования: Эрик Куфлер (Erik Kufler), Эндрю Тренк (Andrew Trenk), Диллон Блай (Dillon Bly), Джозеф Грейвс (Joseph Graves), Нил Норвитц (Neal Norwitz), Джей Корбетт (Jay Corbett), Марк Стрибек (Mark Striebeck), Брэд Грин (Brad Green), Мишко Хевери (Mi ško Hevery), Антуан Пикар (Antoine Picard), Сара Сторк (Sarah Storck). y Юнит-тестирование: Эндрю Тренк (Andrew Trenk), Адам Бендер (Adam Bender), Диллон Блай (Dillon Bly), Джозеф Грейвс (Joseph Graves), Титус Винтерс (Titus Winters), Хайрам Райт (Hyrum Wright), Оги Факлер (Augie Fackler). y Тестирование с дублерами: Джозеф Грейвс (Joseph Graves), Геннадий Цивил (Gennadiy Civil). y Крупномасштабное тестирование: Адам Бендер (Adam Bender), Эндрю Тренк (Andrew Trenk), Эрик Кюфлер (Erik Kuefler), Мэтью Бомонт-Гай (Matthew Beaumont-Gay). y Устаревание: Грег Миллер (Greg Miller), Энди Шульман (Andy Shulman). y Управление версиями и ветвями: Рейчел Потвин (Rachel Potvin), Виктория Кларк (Victoria Clarke). y Code Search: Дженни Ван (Jenny Wang). y Системы и философия сборки: Хайрам Райт (Hyrum Wright), Титус Винтерс (Titus Winters), Адам Бендер (Adam Bender), Джефф Кокс (Jeff Cox), Жак Пие- наар (Jacques Pienaar). y Critique: инструменты обзора кода в Google: Миколай Додела (Miko łaj Dądela), Герман Луз (Hermann Loose), Ева Мэй (Eva May), Элис Кобер-Соцек (Alice Kober-Sotzek), Эдвин Кемпин (Edwin Kempin), Патрик Хизель (Patrick Hiesel), Оле Ремсен (Ole Rehmsen), Ян Мацек (Jan Macek). y Статический анализ: Джеффри ван Гог (Jeffrey van Gogh), Сиера Джаспан (Ciera Jaspan), Эмма Седерберг (Emma S öderberg), Эдвард Афтандилиан (Edward Aftandilian), Коллин Винтер (Collin Winter), Эрик Хо (Eric Haugh). y Управление зависимостями: Расс Кокс (Russ Cox), Николас Данн (Nicholas Dunn). y Крупномасштабные изменения: Мэтью Фаулз Кулукундис (Matthew Fowles Kulukundis), Адам Зарек (Adam Zarek). y Непрерывная интеграция: Джефф Листфилд (Jeff Listfield), Джон Пеникс (John Penix), Каушик Шридхаран (Kaushik Sridharan), Санджив Дханда (Sanjeev Dhanda). 20 Вступление y Непрерывная поставка: Дэйв Оуэнс (Dave Owens), Шери Шипе (Sheri Shipe), Бобби Джонс (Bobbi Jones), Мэтт Дафтлер (Matt Duftler), Брайан Шутер (Brian Szuter). y Вычисления как услуга: Тим Хокин (Tim Hockin), Коллин Винтер (Collin Winter), Ярек Кузьмиерек (Jarek Ku śmierek). Также мы хотим поблагодарить Бетси Бейер за то, что поделилась опытом работы над книгой «Site Reliability Engineering. Надежность и безотказность как в Google» 1 Спасибо Кристоферу Гузиковски (Christopher Guzikowski) и Алисии Янг (Alicia Young) из O'Reilly, которые запустили наш проект и довели его до публикации. Кураторы также хотели сказать отдельное спасибо: Том Маншрек (Tom Manshreck): «Маме и папе за то, что помогли мне поверить в себя и решали со мной домашние задания за обеденным столом». Титус Винтерс (Titus Winters): «Папе за мой путь. Маме — за мой голос. Виктории — за мое сердце. Рафу — за мою спину. А также мистеру Снайдеру, Ранве, Зеду (Z), Майку, Заку, Тому и всем Пейнам, Меку (mec), Тоби, Кгд (cgd) и Мелоди за уроки, наставничество и доверие». Хайрам Райт (Hyrum Wright): «Маме и папе за поддержку. Брайану и завсегдатаям Бейкерленда за мое первое погружение в мир ПО. Дюэйну (Dewayne) за продолже- ние этого путешествия. Ханне, Джонатану, Шарлотте, Спенсеру и Бену за их дружбу и интерес. Хизер за то, что все это время была рядом». От издательства Ваши замечания, предложения, вопросы отправляйте по адресу comp@piter.com (издательство «Питер», компьютерная редакция). Мы будем рады узнать ваше мнение! На веб-сайте издательства www.piter.com вы найдете подробную информа цию о на- ших книгах. 1 Бейер Б., Джоунс К., Петофф Д., Мёрфи Н. Р. Site Reliability Engineering. Надежность и без- отказность как в Google. СПб.: Питер, 2021. 592 с.: ил. |