Введение
1975 год – книга Фреда Брукса «Мифический человеко-месяц: эссе по разработке программного обеспечения» – книга по разработке программного обеспечения и управлению проектами, написанная Фредом Бруксом и впервые опубликованная в 1975 году, с последующими изданиями в 1982 и 1995 годах. Её центральная тема заключается в том, что увеличение численности персонала в отстающем от графика программном проекте приводит к ещё большей задержке. Эта идея известна как закон Брукса и рассматривается вместе со вторым эффектом системы и поддержкой прототипирования. Наблюдения Брукса основаны на его опыте работы в IBM, где он руководил разработкой OS/360. Он увеличил количество программистов в проекте, отстававшем от графика, и позже пришел к выводу, что это решение, вопреки интуиции, ещё больше задержало проект. Он также ошибся, полагая, что проект по написанию компилятора ALGOL займет шесть месяцев, независимо от количества задействованных специалистов (на самом деле потребовалось больше времени). Склонность менеджеров повторять подобные ошибки в разработке проектов заставила Брукса пошутить, что его книгу называют «Библией разработки программного обеспечения», потому что «все её цитируют, некоторые читают, а лишь немногие следуют её принципам».
The Mythical Man Month: Essays on Software Engineering is a book on software engineering and project management by Fred Brooks first published in 1975, with subsequent editions in 1982 and 1995. Its central theme is that adding manpower to a software project that is behind schedule delays it even longer. This idea is known as Brooks's law, and is presented along with the second system effect and advocacy of prototyping. Brooks's observations are based on his experiences at IBM while managing the development of OS/360. He had added more programmers to a project falling behind schedule, a decision that he would later conclude had, counter intuitively, delayed the project even further. He also made the mistake of asserting that one project—involved in writing an ALGOL compiler—would require six months, regardless of the number of workers involved (it required longer). The tendency for managers to repeat such errors in project development led Brooks to quip that his book is called "The Bible of Software Engineering", because "everybody quotes it, some people read it, and a few people go by it".
Издания
Работа была впервые опубликована в 1975 году, переиздана с исправлениями в 1982 году и выпущена повторно в юбилейном издании с четырьмя дополнительными главами в 1995 году, включая перепечатку эссе «No Silver Bullet» с комментариями автора.
Мифический человек-месяц
Брукс обсуждает несколько причин неудач в планировании. Наиболее значимым является его обсуждение закона Брукса: добавление рабочей силы к просроченному программному проекту только увеличивает его задержку. «Человеко-месяц» – это гипотетическая единица работы, представляющая объем работы, выполненный одним человеком за один месяц; закон Брукса утверждает, что возможность измерения полезной работы в человеко-месяцах – это миф, и поэтому является центральной идеей книги. Сложные проекты в области программирования нельзя идеально разбить на независимые задачи, которые можно выполнять без коммуникации между разработчиками и без установления сложной сети взаимосвязей между задачами и исполнителями. Следовательно, добавление программистов к проекту, отстающему от графика, приведет к еще большей задержке. Это происходит потому, что время, необходимое новым программистам для ознакомления с проектом и возросшая нагрузка на коммуникацию, будут поглощать все больше доступного времени. Когда n человек должны взаимодействовать друг с другом, с увеличением n их производительность снижается, и когда она становится отрицательной, проект задерживается с каждым добавленным человеком. Формула для расчета количества каналов группового взаимодействия: n(n − 1)/2. Пример: 50 разработчиков создают 50 × (50 – 1)/2 = 1225 каналов коммуникации.
Adding manpower to a late software project makes it later. Man month is a hypothetical unit of work representing the work done by one person in one month; Brooks's law says that the possibility of measuring useful work in man months is a myth, and is hence the centerpiece of the book. Complex programming projects cannot be perfectly partitioned into discrete tasks that can be worked on without communication between the workers and without establishing a set of complex interrelationships between tasks and the workers performing them. Therefore, assigning more programmers to a project running behind schedule will make it even later. This is because the time required for the new programmers to learn about the project and the increased communication overhead will consume an ever increasing quantity of the calendar time available. When n people have to communicate among themselves, as n increases, their output decreases and when it becomes negative the project is delayed further with every person added. Group intercommunication formula: n(n − 1)/2. Example: 50 developers give 50 × (50 – 1)/2 = 1,225 channels of communication.
Нет серебряной пули
Брукс добавил главу "Нет серебряной пули — Сущность и случайные факторы в разработке программного обеспечения" и дальнейшие размышления о ней в главе "'Нет серебряной пули' пересмотрено" в юбилейном издании "Мифический человек-месяц". Брукс утверждает, что не существует единого решения, которое могло бы кардинально улучшить ситуацию: "нет ни одного достижения, ни в технологиях, ни в методах управления, которое само по себе обещало бы даже на один порядок величины [в десять раз] повысить производительность, надежность или простоту в течение десятилетия". Этот аргумент основан на разграничении между случайной сложностью и сущностной сложностью, подобно тому, как закон Амдала опирается на различие между "параллелизуемыми" и "строго последовательными" задачами.
Эффект второй системы
Второй эффект системы заключается в том, что при проектировании второй системы архитектор сталкивается с наибольшим риском, поскольку стремится включить в неё все дополнения, которые не были реализованы в первой системе из-за изначально ограниченного времени. Поэтому, приступая ко второй системе, разработчику следует помнить о склонности к излишней сложности.
Тенденция к необратимому количеству ошибок
Автор отмечает, что в достаточно сложной системе существует некое неустранимое количество ошибок. Любая попытка исправить обнаруженные ошибки, как правило, приводит к возникновению других ошибок.
Отслеживание прогресса
Брукс писал: "Вопрос: как крупный программный проект срывает сроки на год? Ответ: по одному дню!" Небольшие срывы по множеству направлений в конечном итоге накапливаются и приводят к значительной общей задержке. Постоянное внимание к выполнению небольших индивидуальных этапов необходимо на каждом уровне управления.
Концептуальная целостность
Чтобы создать удобную для пользователя систему, она должна обладать концептуальной целостностью, которую можно достичь только путем разделения архитектуры и реализации. Один главный архитектор (или небольшая группа архитекторов), действуя в интересах пользователя, определяет, что должно быть включено в систему, а что исключено. Архитектор или группа архитекторов должны сформировать четкое представление о том, что система должна делать, и убедиться, что это видение понятно всей команде. Новая идея может быть отклонена, если она не органично вписывается в общую архитектуру системы. Фактически, для обеспечения удобства использования система может намеренно предоставлять меньше функций, чем потенциально возможна. Главное в том, что если система слишком сложна, многие функции останутся невостребованными, поскольку у пользователей не будет времени на их освоение.
Руководство
Главный архитектор разрабатывает руководство по системным требованиям. В нем должны быть детально описаны внешние требования к системе, то есть все, что видит пользователь. Руководство должно изменяться по мере поступления обратной связи от команд разработки и пользователей.
Пилотная система
При проектировании новой системы команда неизбежно создаст прототип (даже если не планирует этого). Этот прототип служит своего рода "пилотным планом", выявляющим подходы, которые в конечном итоге потребуют полной переработки системы. Именно эта вторая, более продуманная система должна быть поставлена заказчику, поскольку поставка прототипа принесет заказчику лишь страдания и может навредить репутации системы и даже компании.
Официальные документы
Каждый руководитель проекта должен разработать небольшой основной набор формальных документов, определяющих цели проекта, способы их достижения, ответственных за их достижение, сроки достижения и смету расходов. Эти документы также могут выявить несоответствия, которые иначе трудно заметить.
Оценка проекта
При оценке сроков проекта следует помнить, что разработка программных продуктов (которые можно продавать клиентам) и программных систем в три раза сложнее, чем написание простых, независимых внутренних программ. Необходимо учитывать, сколько времени рабочей недели фактически будет уделено техническим вопросам, а не административным или другим нетехническим задачам, таким как совещания, и особенно ежедневные короткие встречи команды ("stand-up") или общие собрания ("all hands").
Сообщение
Чтобы избежать катастрофы, все команды, работающие над проектом, должны поддерживать связь друг с другом всеми возможными способами (по электронной почте, телефону, на совещаниях, посредством служебных записок и т.д.). Вместо того, чтобы что-либо предполагать, разработчики должны обращаться к архитектору (ам) за разъяснением их замысла при реализации той или иной функции, прежде чем действовать, основываясь на предположении, которое может оказаться совершенно неверным. Архитектор (ы) несет (ют) ответственность за создание целостного представления о проекте и доведение его до сведения остальных.
Хирургическая команда
Подобно тому, как во время операции хирургической командой руководит один хирург, выполняющий наиболее критически важную работу и направляющий остальных членов команды для помощи в менее важных задачах, представляется разумным, чтобы опытный программист разрабатывал ключевые компоненты системы, а остальные участники команды обеспечивали поддержку, предоставляя необходимое в нужный момент. Кроме того, Брукс полагает, что опытные программисты обычно в пять-десять раз продуктивнее, чем программисты среднего уровня.
Замораживание кода и версионное управление системой
Программное обеспечение невидимо. Поэтому многие вещи становятся очевидными лишь после выполнения определенного объема работы над новой системой, позволяя пользователю с ней ознакомиться. Этот опыт принесет понимание, которое изменит потребности пользователя или его представление о них. Следовательно, систему следует изменить, чтобы удовлетворить изменившиеся требования пользователя. Однако это возможно лишь до определенного момента, иначе система может так и не быть завершена. В определенный момент времени внесение изменений в систему должно быть прекращено, а код – зафиксирован. Все запросы на изменения следует отложить до следующей версии системы.
Специализированные инструменты
Вместо того чтобы у каждого программиста был свой собственный набор инструментов, у каждой команды должен быть выделенный разработчик инструментов, который может создавать инструменты, сильно настроенные под задачи, решаемые этой командой (например, инструмент генерации кода, создающий код на основе спецификации). Помимо этого, инструменты, используемые во всей системе, должны разрабатываться общей командой разработчиков инструментов под руководством менеджера проекта.