Как смягчить последствия Мифического Месяца Человека?

16

Закон Брукса: добавление рабочей силы в поздний программный проект делает это позже.

В своей книге « Нет серебряной пули» - сущность и несчастные случаи разработки программного обеспечения Фредерик Брукс определяет концепцию « Мифического человека» :

Брукс полагает, что сложные программные проекты нельзя полностью разделить на отдельные задачи, над которыми можно работать без связи между работниками и без установления комплекса сложных взаимосвязей между задачами и работниками, их выполняющими .

С 1982 года мы, безусловно, продвинулись вперед и приобрели некоторый опыт в смягчении этой проблемы. Каковы некоторые из решений, которые вы успешно применили на своей работе, чтобы добавить ресурсы в проект, не создавая больше проблем.

Иржи Клауда
источник
5
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что он лучше подходит для Software Engg. SE ( softwareengineering.stackexchange.com ), а также потому, что он не является строго специфичным для
Devops
2
Это строго конкретный вопрос DevOps. Это напрямую связано с процессом доставки программного обеспечения. Вы уверены, что действительно понимаете, что означает DevOps?
Иржи Клауда
3
Вы продолжаете говорить DevOps, я не думаю, что это означает, что вы думаете, что это значит.
Иржи Клауда
3
@ Dawny33: Пожалуйста, прочитайте одну из основополагающих книг DevOps - Проект Феникс. Вы не найдете ни одного упоминания об AWS, Docker, Jenkins или каких-либо других инструментах. Вся книга о процессе, организационной иерархии и структуре, способах работы в командах. DevOps - это способ привнести научные идеи, которые улучшили производство в Японии, а затем и в Соединенных Штатах, в процесс разработки программного обеспечения. Идеи, основанные на работах Эдварда У. Деминга и Элиягу М. Голдратта. То, что вы видите как DevOps - это просто поверхность, инструменты, результаты. Лишние части этого.
Иржи Клауда
5
@ Dawny33 Этот вопрос не подходит для разработки программного обеспечения. Хотя эта общая тема, вопрос слишком широк. Он ищет мнения, а не пытается решить проблему. Пожалуйста, не предлагайте другим сообществам, если вы не понимаете, какие типы вопросов они принимают. Если этот вопрос будет опубликован в Software Engineering, он будет отклонен, закрыт и, вероятно, будет удален очень быстро. Это приводит к плохому пользовательскому опыту.
Томас Оуэнс

Ответы:

18

Что такое МММ

Сначала я хочу объяснить контекст для закона Брука. Какое предположение заставило его создать его еще в 1975 году?

Человеко-месяц - это гипотетическая единица работы, представляющая работу, выполненную одним человеком за один месяц; Закон Брукса гласит, что невозможно измерить полезную работу в человеко-месяцах.

источник: https://en.wikipedia.org/wiki/The_Mythical_Man-Month

Когда-то сложные программные проекты означали бы большие монолитные системы. И Брукс утверждает, что они не могут быть полностью разделены на отдельные задачи, над которыми можно работать без связи между разработчиками и без установления комплекса сложных взаимосвязей между задачами и людьми, выполняющими их.

Это очень верно в отношении высокосвязных программных монолитов. Независимо от того, сколько разделений сделано, большой монолит требует времени, необходимого новым программистам для изучения монолита. И увеличенные накладные расходы на связь, которые будут занимать все большее количество доступного времени.

Но так ли это должно быть на самом деле? Нужно ли нам писать монолиты и сохранять каналы связи n(n − 1) / 2там, где nчисло разработчиков?

Мы знаем, что есть компании, в которых тысячи разработчиков работают над большими проектами ... и это работает. Так что должно быть что-то, что изменилось с 1975 года.


Возможность смягчения МММ

В 2015 году PuppetLabs и IT Revolution опубликовали результаты отчета о состоянии DevOps за 2015 год . В этом отчете они сосредоточились на различии между высокопроизводительными организациями и неэффективными.

Высокопроизводительные организации показывают некоторые неожиданные свойства. Например, они имеют лучшие сроки исполнения проекта в разработке. Лучшая эксплуатационная стабильность и надежность в эксплуатации. А также лучшая репутация в сфере безопасности и соответствия.

Одна из удивительных вещей, выделенных в отчете, - это показатель развертываний в день. Но не только развертывания в день, они также измеряли развертывание / день / разработчика и каков эффект от добавления большего числа разработчиков в высокопроизводительных организациях по сравнению с низкоэффективными.

Это график из этого отчета -

Развертывания в день на разработчика

В то время как малоэффективные организации согласуются с предположениями о Мифическом Месяце Человека. Высокопроизводительные организации могут масштабировать число развертываний / день / dev линейно с количеством разработчиков.

Об этой находке рассказывает отличная презентация Джина Кима на DevOpsDays London 2016 .


Как это сделать

Во-первых, как стать высокопроизводительной организацией? Об этом говорится в нескольких книгах, в этом ответе недостаточно места, поэтому я просто сделаю ссылку на них.

Для организаций, занимающихся программным обеспечением и ИТ, одним из важнейших факторов становления высокопроизводительной организации является: ориентация на качество и скорость .

Например, Уорд Каннингем объясняет технический долг как все то, что нам разрешено оставить нефиксированным. Это принято руководством, потому что оно всегда обещает, что будет исправлено, когда будет время.

Времени всегда не хватает, а технический долг становится все хуже и хуже.

Что это за вещи, которые вызывают технический долг?

  • устаревший код
  • ручная настройка сред
  • ручное тестирование
  • ручное развертывание

Устаревший код Как определено в книге «Эффективная работа с унаследованным кодом » Майкла Фезерса, это любой код, который не имеет автоматического тестирования.

Любые ярлыки времени используются для запуска кода; операции обременены обслуживанием этого долга навсегда. Тогда процесс развертывания становится все длиннее и длиннее.

Джин рассказывает историю в своей презентации о компании, которая работает в течение шести недель. Вовлечение десятков тысяч чрезвычайно утомительных шагов, склонных к ошибкам, связывание 400 человек, и они будут делать это четыре раза в год.

Один из принципов DevOps заключается в том, что надежность достигается за счет более частого развертывания небольших приложений.


пример

Эти две презентации показывают все, что Amazon сделала для сокращения времени, необходимого для развертывания кода в рабочей среде.

По словам Джина, в этих высокопроизводительных организациях со временем меняется только количество разработчиков. Итак, из примера с Amazon можно сказать, что за четыре года они увеличили свои развертывания в десять раз, просто добавив больше людей.


Это означает , что при определенных условиях, с правом архитектуры, правильные технические методы, правильные культурные нормы, производительность труда разработчиков может масштабировать как число разработчиков увеличивается. И DevOps определенно находится в центре всего этого.

Евгений
источник
4

То, что я сделал (и это только субъективно), выглядит следующим образом:

Когда менеджер, который думает о сроках, желает добавить людей в мою команду, чтобы сократить необходимое время, и, кажется, под МММ, я сначала обсуждаю с ним или с ней, почему это может быть плохо. Моя любимая аналогия в этом заключается в том, чтобы напомнить им, что если одна женщина сможет родить ребенка в течение девяти месяцев, у девяти женщин не будет одного ребенка за один месяц, но у них будет девять детей за девять месяцев. Время не сокращается, лучше только параллельная обработка.

Когда решение навязывается нашей команде, мы обычно пытаемся либо разделить некоторые задачи дальше, а когда это невозможно, мы обычно полагаемся на парное программирование , где один программист отвечает за ввод текста, а другой диктует код (и периодически переключается). ).

Сам код написания медленнее, но при тестировании меньше опечаток / ошибок и ошибок из-за неизбежного просмотра, сделанного во время записи. Я чувствую, что общее качество кода также немного лучше, но у меня нет метрик, подтверждающих это утверждение.

Tensibai
источник
1
Мне нравится идея парного программирования. Это действительно то, что может помочь. Я мог бы объяснить, почему позже на основе теории, над которой я работал.
Иржи Клуда
пожалуйста, ждите!
Питер
4

Говоря исключительно с точки зрения CI, увеличение числа разработчиков, работающих над проектом, обычно приводит к увеличению числа людей, работающих в одной отрасли.

Традиционные системы CI имеют проблему масштабируемости в этом отношении: вероятность поломок / регрессий / блокировок увеличивается, замедляя скорость интеграции и предлагая меньшим командам разрываться и переходить к дочерним ветвям (т.е. дальнейшие замедления). См. Как масштабировать непрерывную интеграцию для очень больших проектов / команд? , Это соответствует концепции Мифического Месяца Человека.

Решение, которое я предлагаю в своем ответе на этот вопрос, - хорошо масштабируемая система CI позволила бы перейти к истинной CI - интеграции на основе одной ветви / соединительной линии для целых больших групп (даже с огромными размерами).

При использовании всех страниц на одной странице, с использованием одних и тех же автоматизированных инструментов / процессов и подавляющего большинства проверок качества, автоматизированных внутри самой системы CI, становится намного проще переключать роли и фокусироваться между членами команды. Весь процесс разработки становится более плавным, более предсказуемым, более расслабленным.

Привлечение новых людей на борт в такой среде, повышение их производительности просто за счет выполнения менее сложных задач от более опытных членов команды, которые затем могут взять на себя более сложные задачи, становится проще.

Я считаю, что все это можно рассматривать как успокаивающие эффекты концепции «Мифического человека».

Дэн Корнилеску
источник
В высокопроизводительных организациях добавление большего количества разработчиков обычно означает создание большего количества независимых команд, которые пишут разрозненное программное обеспечение. Это позволяет большему количеству людей достигать большего и быстрее. Общение между ними через единую ветку интеграции является анти-паттерном и, скорее всего, значительно замедлит процесс.
Евгений
Having them all communicate via a single integration branch is an anti-pattern- Почему? Если они не связаны между собой в том смысле, что им больше не нужно интегрировать свою работу, они будут касаться ветви не перекрывая друг друга, не конфликтуя друг с другом. Если их работа все еще нуждается в интеграции, то переход к дополнительным ветвям просто задержит и усложнит интеграцию, отклонившись от методологии CI и потеряв все ее преимущества.
Дан
Я думаю, что мы не согласны со значением «ветвь». Хорошо иметь один большой репозиторий с одной веткой (git или svn) и переносить накладные расходы всех, кто работает над одним и тем же. Также хорошо иметь несколько репозиториев, где у каждого репозитория есть ветвь, которая отслеживает этот конкретный отделенный сервис. Это зависит от инструмента, количества накладных расходов, которые он добавляет для подтверждения и проверки кода.
Евгений
Ах, извините, да - я так привык к этому и продолжаю забывать, что другие нет. Под ветвью я имею в виду общее представление ветки SCM высокого уровня, на самом деле не имеет значения, каковы особенности реальных базовых систем SCM, если они управляются вместе монолитным образом. , 1 большое репо с mainветкой или 10 параллельных репо (git modules?), Каждое с mainветкой должно быть в значительной степени эквивалентно перспективе CI.
Дан
Тогда мое утверждение из первого комментария остается в силе. Независимость не может быть достигнута в вавилонской башне, когда у вас есть монолит, накладные расходы очень высоки для всех - поэтому все обременены. Гораздо лучше представлять несвязанные проекты как несвязанные небольшие системы VCS для управления. Если вы помните достаточно далеко, некоторые компании использовали ClearCase и другие VCS для управления ВСЕМ кодом компании - накладные расходы были ужасными.
Евгений