Как хороший разработчик удерживается от создания кода с низким коэффициентом попадания в шину?
(источник: metrocouncil.org)
Посмотрите на картинку выше. Это может быть программист, который будет сбит автобусом. Согласно Википедии, при разработке программного обеспечения "фактор шины" (или "фактор попадания шины") проекта программного обеспечения
непочтительное измерение концентрации информации в одном человеке или очень немногих. Фактор шины - это общее количество ключевых разработчиков, которые в случае потери работоспособности, например, будучи сбитыми шиной, отправят проект в такой беспорядок, что он не сможет продолжить работу.
Попадание в автобус может принять разные формы. Это может быть человек, берущий новую работу, имеющий ребенка, изменяющий их образ жизни или жизненный статус, воздействие будет иметь тот же эффект.
Или другими словами: если первоначальный разработчик фрагмента кода столкнулся с шиной, вы облажались.
Итак, мой вопрос: как хороший разработчик удерживается от создания кода с низким коэффициентом попадания в шину?
И кто несет ответственность за то, чтобы разработчики, привлеченные для поддержки небольшого количества кода, могли это понять?
23 ответа
Потеря ключевого члена команды происходит часто, временно или навсегда. Если кто-то долго обедает, или грипп обходит офис, или программист хочет поменяться ролями в одной и той же компании, или переживает болезненный развод, или бросает плавать по всему миру, или получает трагический вред, Перспектива внезапного и неожиданного изменения в команде неизбежна.
Одним из атрибутов хорошего разработчика является то, что они стремятся уменьшить "фактор шины" своей команды, сделав себя менее существенными. Это трудно сделать, когда ты не уверен в своей работе. Хороший менеджер создает безопасность, в которой людям нужно расслабляться.
Практики, примерно в приоритетном порядке:
Хорошо продуманный код означает, что ваше намерение записано в коде и исключает секреты.
Тщательные юнит-тесты служат как своеобразной документацией, так и защитной сетью, когда секретный держатель недоступен. (То есть они являются проверяемой документацией.)
Парное программирование, особенно Promiscuous Pairing, будет распространять знания в команде разработчиков и раскрывать секреты.
Доставка часто означает, что даже если что-то случится, у ваших клиентов уже есть последний, работающий продукт, и у вас есть известное количество, к которому можно вернуться, если что-то пойдет не так.
Документация, как в комментариях, так и в других местах, хранит идеи и намерения, которые не могут быть выражены в коде. Тем не менее, создание документации является дорогостоящим, дорогим в использовании, дорогим в обслуживании и часто игнорируемым, поэтому предпочтение отдается другим элементам.
Я бы сказал, что код имеет хорошие модульные тесты. Для разработчика замены, присоединяющегося к проекту, важно знать, что их изменения не нарушают другие части системы.
Самая сложная часть обслуживания IMO не знает, что делает программное обеспечение или как оно делает это: это знает, что программное обеспечение должно делать.
Если бы я знал...
Для чего предназначено программное обеспечение (т.е. функциональная спецификация... мне не обязательно нужна спецификация проекта)
Как построить, как запустить и (следуя из функциональной спецификации), как протестировать существующее программное обеспечение
... тогда это самое главное. Другая документация (например, "дизайн": которая описывает, как функциональная спецификация реализуется программным обеспечением) также может быть полезной, но она сравнительно необязательна и менее важна, чем описанная выше.
Большинство разработчиков ответят на ваш вопрос, сказав: "комментарии в коде, правильные идентификаторы, контроль версий и т. Д. "... но я думаю, что более важным является то, что "как разработчик, если вы пишете программное обеспечение, у которого нет письменной функциональной спецификации, то напишите немного функциональной спецификации, чтобы соответствовать вашему программному обеспечению". FS будет полезен еще до того, как кто-то попытается поддержать программное обеспечение: он будет полезен для QA, которые хотят знать, как тестировать программное обеспечение.
И кто несет ответственность за то, чтобы разработчики, привлеченные для поддержки небольшого количества кода, могли это понять?
Обычно это руководитель группы нового разработчика (т.е. старший программист, который уже знает существующий код); но если этого не сделать (если такого руководителя группы нет), то это может быть менеджер (менеджер по продукту или проекту или "инженер по выпуску"), если этот менеджер знает, где найти функциональные спецификации программного обеспечения и инструкции по сборке.
Регулярные рецензии кода помогают. Это означает, что, по крайней мере, еще один человек должен был просмотреть каждую строку кода и должен был запросить ее изменение для ясности, где это необходимо.
Я постоянно стремлюсь к ясности кода, а не к краткости, которая должна помочь будущим разработчикам. Однако бывают случаи, когда вы не можете не писать код, который немного тупой. В этом случае я собираю команду на 30 минут, чтобы получить представление о том, как работает код, если не полное объяснение.
Набор модульных тестов также помогает другим разработчикам быть уверенными в изменении кода, поскольку они будут знать, когда они вносят изменения, которые разрушают часть системы. При правильном написании они могут также объяснить, как части системы предназначены для работы с помощью именования, а не только кода.
Когда я работал студентом-программистом в моем университете во время обучения в университете, мой Фактор попадания в автобус должен был тщательно контролироваться. Я работал над крупными проектами, но моя работа там была только до того дня, когда я закончил. На этом этапе другие программисты в отделе должны были бы забрать мой проект и управлять им оттуда. Я справился с этим с ведрами документации.
С того дня, как я приступил к работе, я старался держать свои спецификации, код и другую документацию в актуальном состоянии и по возможности чистыми, чтобы любой компетентный сотрудник мог получить четкое представление о моей работе в течение нескольких дней. (с моей помощью или без нее). У каждого моего проекта была бы соответствующая вики-страница Confluence, где я хранил бы всю документацию, диаграммы, спецификации и небольшие "лакомые кусочки", которые могли бы знать другие разработчики.
Это также помогает, если у вас есть хороший чистый стиль кодирования. Если ваш код имеет смысл и прост для глаз, другие программисты должны быть в состоянии подобрать его после несчастного случая с шиной.
В организации всегда должно быть дублирование знаний.
Точно так же, как вы всегда делаете резервную копию вашего жесткого диска (правильно???), вы не хотите, чтобы один человек был единственным обладателем важной информации. Один из способов смягчить это - совместная работа программистов.
То, что вы упоминаете как проблему "автобуса", является, на практике, фактором "что, если Джо уходит / решает уйти". Как правило, работа по желанию, и любой может уйти в любое время.
Эластичная организация не может полагаться на одного разработчика, обладающего всеми важными знаниями.
Контроль исходного кода и хорошо продуманный и прокомментированный код являются ключевыми.
Люди, ответственные за то, чтобы этого не произошло, на самом деле все, кто связан с кодом. Менеджеры по разработке и руководители проектов - это люди, которые должны пристально следить за этим, но исполнительное руководство должно разработать политику для их поддержки и иметь ресурсы, чтобы гарантировать, что возможно наличие нескольких людей, имеющих перекрывающиеся области знаний.
Отладка это сложно. Таким образом, если вы программируете настолько умно, насколько это возможно, вы будете слишком глупы, чтобы отлаживать код.
- Простой код улучшает ремонтопригодность
- Контроль кода для простоты
- Руководители проектов несут ответственность
В порядке важности (очевидно, это мое собственное мнение):
- Четко названные объекты, переменные и имена функций
- Очистить комментарии
- Управления источником
- Код Отзывы
- Разумное программное обеспечение для отслеживания ошибок с заметками о том, что произошло.
- Документация, где это необходимо (но только там, где это необходимо; слишком много всего лишь затрудняет поиск того, что вам нужно)
И человек, ответственный за это? Ты конечно.
Парное программирование снижает этот риск в довольно высокой степени. Если вы не можете этого сделать (многие из нас не могут позволить себе объединиться в каждом проекте), вы всегда можете запланировать регулярные экспертные проверки и задокументировать свой код, а не документировать в конце.
В вики c2 раньше была статья с названием "Не доверяй разработчику в комнате на месяц". Речь шла о планах проекта с такими позициями, как "Внедрить систему, Фред, шесть недель", где управление проектом состоит из разговоров типа "Как дела, Фред? У нас все еще нормально в течение шести недель?" и Фред говорит: "Да, я думаю, что мы на 80%".
Здоровый номер автобуса является побочным эффектом культуры, которая избегает синдрома "разработчик в комнате на месяц". Я думаю, что это скорее культурный, чем технический вопрос - номер шины является атрибутом организации, а не кодовой базы - и стандарты должны устанавливаться сверху вниз. Характеристики этой культуры включают в себя:
- Общепризнанные организационные цели и бизнес-процессы, так что у разработчиков есть нечто иное, чем узко-техническая перспектива для принятия решений, и у них есть основа для обсуждения плюсов и минусов с нетехническими заинтересованными сторонами.
- Конкретная постановка целей и поддающиеся проверке индикаторы прогресса, избегая абстрактных существительных, таких как "система", к которой каждый придает свое значение, словесные отчеты "почти выполнено" или "выполнено на 80%" понимаются как означающие, что они не выполнены каким-либо видимым образом, раздаются сигналы тревоги выкл., если несколько дней проходят без объективного прогресса от разработчика (прохождение новых тестов, новая демо-версия и т. д.).
- Аудит и подотчетность: вы не только несете ответственность за выполнение своей работы, вы несете ответственность за предоставление отчета о ней своим коллегам. То, что вас попросили предоставить отчет, ни в коем случае не является критикой, это средство поддержки и способ "проверить" ваши знания в организации.
- Любопытство, готовность поддержать коллег. Проблемы с количеством автобусов часто усугубляются нежеланием других разработчиков помогать своему коллеге, уязвимому к аварийной остановке автобуса, на случай, если они заразятся растущими обязанностями этого коллеги и рутинными обязанностями по обслуживанию.
- Неформальные каналы для возникновения проблем и сомнений (например, коллеги обедают вместе), а также формальные процессы для регистрации и обострения проблем.
Хорошо написанный код, вероятно, является оптимальным решением. Под "хорошо написанным" я подразумеваю, что операторы лаконичны, имена переменных и методов значимы, а система хорошо спроектирована. И что очень важно - выполнение этого не должно ухудшать текущие процессы разработчика.
Объемная документация станет помехой как для текущего кодера, так и для будущего кодера.
Формализованные процессы (такие как модульное тестирование) являются препятствием для текущей скорости разработки (если, конечно, внутренний кодер не является сторонником процесса).
Армия идет в темпе своего медленного марша. Соединение другого программиста с кем-то, кто очень продуктивен, замедлит их. Очень редко в магазине есть более 1 супер продуктивного кодера.
Следуя Agile-процессам разработки, которые способствуют "владению" всей кодовой базой всей командой.
У меня сейчас эта проблема. По сути, срок безумен, и остальным разработчикам не остается времени нарастать.
Я думаю, что решение состоит в том, чтобы более чем один разработчик разработал систему с самого начала. ВСЕГДА. Три разработчика лучше (я знаю, что это любимый размер команды Google). Таким образом, более чем один человек понимает эту систему от ее ядра и выше, зная, как она работает и ПОЧЕМУ она была разработана таким образом.
Вы можете сказать "а как же ресурсы в небольшой компании?" Жаль, что если у вас есть два разработчика и три проекта одновременно, оба разработчика должны переключаться между всеми тремя, обмениваться идеями и распределять рабочую нагрузку, даже несмотря на то, что такое шаттл обходится очень дорого и неэффективно. Но в долгосрочной перспективе вся команда будет одним экспертом по всем частям кода.
В противном случае, в какой-то момент кто-то совершенно незнакомый с кодом окажется на борту и разорит его, конечно, с лучшими намерениями. И вот, идеальная система, может быть, даже жемчужина компании, спускающаяся с холма. Пуф.
Я нашел эту запись в блоге, которая содержит некоторые интересные моменты:
- Делайте вещи простыми: делайте процессы максимально простыми (но не проще!). Это гарантирует, что процессы просты в обслуживании и, следовательно, легко научить других. Простота обычно сводится к двум вещам: а) использование правильного инструмента для правильной работы и б) использование наиболее простого способа достижения того, что необходимо. Я видел несколько процессов, которые излишне усложняются несоответствующими технологиями или использованием технологий. Чтобы уточнить последнее, процессы часто перерабатываются не по какой-либо другой причине, кроме как для демонстрации сообразительности создателя процесса. Избегайте создания таких процессов Rube Goldberg любой ценой! Важным фактором, связанным с простотой (с точки зрения шины), является использование технологий, которые знакомы более чем одному человеку в команде. Это создает высокий фактор шины с самого начала.
- Документ, документ, документ: это не сложно, но люди все еще думают, что им может сойти с рук "делать это сначала, а потом документировать это". Документация, выполненная после факта, часто оказывается менее чем полезной, потому что автор забывает включить некоторые (много?) мелких деталей, которые, конечно, оказываются критическими в трудные времена. Что должен содержать документ процесса? Достаточно помочь кому-нибудь понять, что, как, где, когда - что он делает; как это работает; где он находится (серверы и т. д.); и когда и как часто он запускается. Документация должна также включать некоторую основную информацию по устранению неполадок и ссылки на соответствующие разделы руководств. Другим важным моментом является синхронизация документации с процессом, то есть обновление всех соответствующих документов при каждом изменении процесса. Это важно, потому что документация по процессу является вашим единственным руководством, когда владелец процесса с коэффициентом шины 1 идет под шину, а не входит в нее.
- Небольшое слово о стиле, возможно, в порядке - документация процесса должна соответствовать 3C ясности, краткости и понятности. Да, можно написать так, чтобы достичь всех трех, хотя это не очевидно в моем письме. Поощряйте людей приобретать второстепенные навыки: первые два пункта касались процесса и документации. Однако, в конце концов, именно люди делают вещи. Несмотря на хорошо спроектированные и документированные процессы, у команды все еще может быть низкий фактор шины, если у команды нет избыточности навыков. Кто позаботится о базах данных, когда администратор базы данных подойдет (или будет перегружен) шиной? Этот вопрос не нужно задавать, если кто-то прошел перекрестную подготовку по базовым задачам DBA. Насколько это возможно, у каждого в команде должен быть хотя бы один дополнительный навык, который позволит им прикрывать кого-то другого.
Все в компании - это либо часть решения, либо часть проблемы.
Если кто-то столкнулся с автобусом, а вы не облажались, это значит, что этот человек был частью проблемы. Вы не хотите расширять проблемную область в своей компании только для того, чтобы не допустить роста фактора поражения автобусов.
И наоборот - если кого-то полезного сбивает автобус, ты всегда облажался, несмотря ни на что. Чем больше опоздавший человек вносит свой вклад в компанию, тем больше ты облажался.
Фактор попадания в автобус - это не нечто особенное, существующее только при разработке программного обеспечения, а скорее общий бизнес-риск.
Таким образом, ответ таков: не ожидайте, что чистый бизнес-риск можно будет волшебным образом решить с помощью какой-либо технологии, инструмента или методологии. Подумайте о бизнесе Willailla 101. Оцените риск, оцените стоимость его снижения, сравните цифры, действуйте соответственно.
Следуя шаблону проектирования, который определяет стиль кодирования, соглашения и общую низкоуровневую техническую архитектуру. Таким образом, каждый кодирует "одинаково", поэтому, если кто-то новичок должен был прийти на борт, он мог просто следовать шаблону проектирования.
Это может раздражать творческие умы (поскольку гибкость нарушена), но это обеспечивает согласованную кодовую базу, а также способствует согласованному согласованному модульному тестированию.
Подводить итоги:
Шаблоны проектирования, гарантирующие, что каждый разработчик соответствует шаблону (вы могли бы даже использовать правила политики кода в Visual Studio Team Foundation для обеспечения соблюдения этих правил)
Модульное тестирование, охватывающее более 80% покрытия кода (которое также прокладывает путь для разработки через тестирование)
Не кодируя в изоляции. Поговорите с другими членами вашей команды о коде, который вы пишете. Есть отзывы кода. Реализация общих стратегий для решения проблем. Если вы находитесь на той же странице, что и все остальные члены команды, коэффициент попадания в автобус будет низким.
Однако, если вы одинокий разработчик, некоторые другие посты здесь уже освещают идеи стандартов кодирования, документации и т. Д.
Контроль источника с закомментированными журналами изменений, вероятно, является ключевым компонентом.
Проект должен легко проверяться и настраиваться. В нашей компании все проекты - это CVS, Eclipse и Maven, поэтому на Checkout вы делаете "maven eclipse" и все готово.
С этого момента вам нужно хорошее руководство для разработчиков (не документ на 500 страниц, а только самое необходимое для начала работы). Руководство разработчика указывает на различные документы, где разработчики могут найти информацию о дизайне и другие вещи.
Система отслеживания ошибок обязательна, а хорошие описания ошибок - обязательны.
Попробуйте прокомментировать свой код и держите Javadoc в актуальном состоянии.
Хорошие юнит-тесты тоже помогают. Старайтесь сделать модульные тесты простым набором, где вы можете просто запустить их все без необходимости настраивать все виды вещей.
Надеюсь это поможет.
Я думаю, что это должно быть перефразировано. Хороший ОДИН разработчик не должен заботиться о факторе шины. Если его проект умрет, да ладно. Хорошая КОМАНДА, с другой стороны, должна иметь очень низкий коэффициент шины.
Как хороший разработчик, вы не должны заботиться о факторе попадания в автобус. Важно то, что вы решаете, когда бежать перед автобусом, а не вашим работодателем.