Специализация в разработке

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


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

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

Отсутствие специализации в итоге приводит к следующим проблемам:
  • Новичкам приходится долго вникать в работу, их переключают из одной области в другую, в итоге в голове каша и достаточно глубоко не могут ни в чем разобраться.
  • Требуя от людей разбираться во всем мы тем самым повышаем требования к уровню мышления, что приводит к проблемам при поиске персонала
  • Медленная разработка, требуется больше времени для  того, чтобы вникнуть в задачу
  • Низкая ответственность за свои действия, когда 10 человек правят один и тот же файл, то никто не может взять на себя ответственность за его работу.
  • Архитектура приложения приводит к высокому зацеплению кода (high coupling), когда различные компоненты сильно зависят друг от друга. Получается так называемый спагетти-код.
  • И как итог, снижение мотивации разработчиков. 
Уважаемые читатели, с удовольствием узнаю, как дела обстоят в вашей команде, пишите, что вы думаете насчет специализации.

Комментарии