Этот вопрос действительно содержит два вопроса, которые необходимо решать отдельно:
Почему у некоторых команд строгий процесс разработки?
Простой ответ: потому что, если они этого не делают, ошибки случаются. Дорогостоящие ошибки. Это верно для разработки и для остальной части ИТ-сферы (системные администраторы, администраторы баз данных и т. Д.).
Это очень трудно понять многим разработчикам и ИТ-специалистам, потому что большинство из нас когда-либо работали только на одном из «крайностей» - либо крупные компании в стиле Fortune, имеющие как минимум дюжину разработчиков и строгие процессы, которым необходимо следовать, либо маленькие, микро-ISV или даже внештатные работы, где люди просто не плохо облажаются, или стоимость провала низкая.
Но если вы когда-либо видели компанию между этими этапами - даже компанию с яркими, талантливыми ИТ-специалистами - вы поймете опасность отсутствия какого-либо процесса или неполного процесса. Видите ли, общение между сотрудниками страдает от проблемы комбинаторного взрыва ; Как только вы достигнете уровня около 6-10 разработчиков в одной команде, основной причиной серьезных или критических дефектов будет не недостаток таланта или ноу-хау, а скорее недостаток общения.
Алиса спрашивает вокруг в понедельник утром и решает, что можно делать реконструктивные операции на туловище, потому что никто другой не работает над этой частью. Боб прибывает через час, вернулся из отпуска и полон энергии и решает, что он собирается реализовать новую важную функцию в той же области, и зачем беспокоиться о ветке, потому что никто так и не коснется этого кода? Таким образом, Алиса расплачивается за этот «технический долг», Боб реализует свою убойную функцию, которая была на заднем плане в течение 6 месяцев, и когда они, наконец, оба проверяют свой код (конечно, перед закрытием в пятницу!), Весь Команда должна остаться позади и попытаться преодолеть кошмарный ад конфликтов, которые продолжат жить как ошибки и регрессии в течение следующих нескольких недель.
Алиса и Боб оба отлично поработали над задачами кодирования, но оба они начали с плохого решения («что может быть худшего?»). Руководитель группы или руководитель проекта проводит их через вскрытие и составляет контрольный список, чтобы предотвратить это снова:
- Регистрация должна быть ежедневной, чтобы минимизировать влияние конфликтов;
- Изменения, которые займут значительно больше 1 дня, должны быть сделаны в филиалах;
- Все важные задачи (в том числе не функциональные работы, такие как рефакторинг) должны быть правильно отслежены и назначены в трекере ошибок.
Держу пари, что многим из нас этот «процесс» кажется просто здравым смыслом. Это старая шляпа. Но знаете ли вы, что многие небольшие команды не делают этого? Команда из двух человек может вообще не беспокоиться об управлении исходным кодом. Какая разница? Это честно не нужно. Проблемы начинают возникать только тогда, когда команда растет, а процесс - нет.
Конечно, оптимизация процесса похожа на оптимизацию производительности; следует обратной экспоненциальной кривой. Приведенный выше контрольный список может устранить 80% дефектов, но после его внедрения вы обнаружите, что на остальные 80% дефектов приходится что-то другое . В нашем вымышленном, но знакомом примере это могут быть ошибки сборки из-за наличия разных сред сборки, что, в свою очередь, связано с отсутствием стандартного оборудования, и разработчики используют библиотеки с открытым исходным кодом, которые обновляются каждые 2 недели.
Таким образом, у вас есть три варианта: либо (а) стандартизировать аппаратное обеспечение и строго ограничить использование сторонних библиотек, что является дорогостоящим и может значительно снизить производительность, либо (б) настроить сервер сборки, который требует сотрудничества со стороны группы sysadmin и разработчик, работающий полный рабочий день, чтобы поддерживать его, или (c) позволить разработчикам делать это самостоятельно, распространяя стандартную виртуальную машину и предлагая разработчикам использовать ее. Ясно, что (б) является лучшим долгосрочным решением, но (в) имеет лучший краткосрочный баланс надежности и целесообразности.
Цикл продолжается и продолжается. Каждая «политика», которую вы видите, обычно устанавливается для решения реальной проблемы. Как писал Джоэл Спольски еще в 2000 году (обратите внимание на совершенно другую тему, но, тем не менее, актуальную):
Когда вы заходите в ресторан и видите табличку с надписью «Собаки запрещены», вы можете подумать, что табличка носит чисто запретный характер: мистер Ресторан не любит собак вокруг, поэтому, когда он строил ресторан, он вывесил эту табличку.
Если бы это было все, что происходило, также был бы знак "Нет змей"; в конце концов, никто не любит змей. И знак «Нет слонов», потому что они ломают стулья, когда садятся.
Реальная причина того, что знак есть исторические: это исторический маркер , который указывает на то, что люди использовали , чтобы попытаться привести их собак в ресторане.
То же самое в большинстве (я не скажу, во всех) командах разработчиков программного обеспечения: такие политики, как «Вы должны добавить тестовый пример для каждого исправления ошибки», почти всегда указывают на то, что у команды исторически были проблемы с регрессиями. Регрессии являются еще одной из тех проблем, которые чаще всего связаны с нарушением связи, а не с некомпетентностью. Если вы понимаете политику, вы можете использовать легитимные ярлыки (например, мне пришлось исправить 6 небольших ошибок, но все они были в одной функции, поэтому я могу просто написать один тестовый пример для всех 9 из них).
Это объясняет, почему процессы там, но это не вся история. Другая половина:
Почему так трудно следовать процессу?
На самом деле это более простой вопрос: потому что команда (или ее руководство) сосредоточена на повторяемых результатах и минимизации дефектов (как указано выше), но не уделяла достаточного внимания оптимизации и автоматизации этого процесса.
Например, в исходном вопросе я вижу несколько проблем:
Система контроля версий (CVS) является наследием по сегодняшним стандартам. Для новых проектов он был почти полностью заменен Subversion (SVN), который быстро затмевается распределенными системами, такими как Mercurial (Hg). Переключение на Hg сделало бы ветвление и слияние намного проще, и даже в моем гипотетическом примере выше требование ежедневного принятия стало бы намного менее болезненным. Код даже не должен компилироваться, потому что хранилище является локальным; - на самом деле, более ленивые разработчики могут даже автоматизировать этот шаг, если захотят, настроив сценарий выхода из системы для автоматической фиксации изменений в локальном репозитории.
Не было потрачено времени на автоматизацию процесса виртуальной машины. Весь процесс получения, настройки и загрузки исходного кода / библиотек на виртуальную машину может быть автоматизирован на 100%. Это может быть автоматический процесс, который вы выполняете где-то на центральном сервере, пока работаете над исправлением ошибки на локальном компьютере (и используете только виртуальную машину для обеспечения чистой сборки).
С другой стороны, в определенном масштабе решение VM-per-developer становится глупым, и у вас просто должен быть сервер Continuous Integration. Вот тут-то и появляются реальные преимущества производительности, потому что это (в основном) освобождает отдельных разработчиков от необходимости вообще беспокоиться о сборках. Не нужно беспокоиться о настройке чистых виртуальных машин, поскольку сервер сборки всегда чист.
Формулировка вопроса («контрольный пример со всеми этапами») подразумевает, что происходит некоторое ручное тестирование. Это, опять-таки, может работать для небольших команд с относительно низкой рабочей нагрузкой, но не имеет смысла в более широком масштабе. Регрессионные тесты могут и должны быть автоматизированы; нет никаких «шагов», просто класс или метод, добавленный в набор тестов модулей / интеграции.
Нет необходимости говорить, что переход от Bugzilla к более новой (лучшей) системе отслеживания ошибок сделает эту часть опыта менее болезненной.
Компании не обязательно дешевы или глупы только потому, что они не решили эти проблемы. Все, что они знают, это то, что текущий процесс работает , а в некоторых случаях они не склонны к риску и не хотят что-либо менять в этом. Но на самом деле их просто нужно убедить в преимуществах .
Если бы разработчики потратили неделю на отслеживание своего времени на все задачи, не связанные с кодированием, вы могли бы легко добавить это, показать руководству, что (например) инвестиции с нулевым капиталом, 100 человеко-часов в обновление до Mercurial устраните до 10 человеко-часов в неделю при разрешении конфликтов слияния, тогда это 10-недельное вознаграждение, и они почти наверняка согласятся на это. Та же идея с серверами сборки (CI) или улучшенным отслеживанием ошибок.
Напомним: команды еще не сделали этого, потому что никто не убедил руководство в том, что это достаточно важно сделать сегодня . Поэтому возьмите на себя инициативу и превратите ее в уравнение затрат и выгод; узнайте, сколько времени уходит на задачи, которые можно упростить / автоматизировать с минимальным риском, и рассчитать точку безубыточности и возможную отдачу от нового инструмента или техники. Если они все еще не слушают, то вы уже знаете, какие у вас есть варианты.
Если бы разработчики потратили неделю на отслеживание своего времени на все задачи, не связанные с кодированием, вы могли бы легко сложить их, показать управление ... и превратить его в уравнение затрат и выгод и т. Д. ...
Выше часть выглядит достойной дальнейшего расширения.
Я могу подтвердить, что это работает. Программисты использовали это несколько раз в одном из проектов, над которым я работал, и каждый раз это приводило к желаемым изменениям.
У меня сложилось общее впечатление, что, если все сделано правильно, этот трюк может преодолеть довольно большое количество невежества и инерции руководства.
Хотелось бы отметить, что та компания, в которой нам (разработчикам) пришлось прибегнуть к такому подходу « сделай сам», была очень незрелой в IT-сфере. У более опытных поставщиков программного обеспечения я видел подобные вещи, которые в основном делали сами менеджеры. И, как правило, они были более продуктивными, чем мы, программисты. Гораздо продуктивнее.