Не далее, чем в вечер пятницы я размышлял о своей прежней работе и о нынешней. Параллельно в моем мозгу крутились размышления о прочитанном материале из книги Фредерика Брукса «Мифический человеко-месяц.» В общем, эти размышления натолкнули меня на осознание одного из вариантов такого неприятного процесса, как гибель программного продукта. В этом процессе есть как минимум 2 очень важных точки, которые я назвал «коллапсами». Впрочем, начнем с начала.
Существует такое понятие как «сложность», применимое к любому этапу разработки. Сложность можно рассматривать как некоторый коэффициент между объемом необходимой работы и временем её выполнения. Если сложность большая, то время на выполнение даже небольшой работы может быть очень большим. Однако, думаю, из моего поста о важности проектирования и документирования вполне понятно, что наличие документации может значительно снизить сложность (правда, тут может сыграть очень злую роль сложность самой документации, не уменьшив, а только еще увеличив сложность проекта). Увеличение же сложности происходит с каждым новым «костылем», некоторым особым случаем, не вписавшимся в общий алгоритм.
Далее я представил себе команду разработчиков, работающих над проектом. Представил, что условия у них весьма неблагополучны и им приходится постоянно ставить «костыли» — причин для этого может быть очень много и я в них предпочел не вдаваться. Очевидно, что с течением времени сложность будет только расти.
Теперь представим, что в группу добавили нового разработчика. Чтобы выполнять задачи, ему нужно сначала разобраться в коде, обучиться и на это нужно время. Однако тут есть своя тонкость — чем сложнее проект, чем больше нужно при работе держать информации в голове, тем дольше будет обучение и ниже качество кода. А это грозит порождением новых «костылей» и даже ошибок. Но я задумался над самим процессом обучения. Дело в том, что как бы ни был талантлив и умел программист, при работе над проектом часть информации обязательно должна быть не просто запомнена, но еше и усвоена. Это обстоятельство порождает момент, когда из-за большой сложности время на обучение нового программиста перекрывает допустимые границы. Таким образом при возрастании сложности наступает момент, когда над проектом могут работать только те программисты, кто работал над ним ранее. Такой уровень сложности — первый коллапс, который обнаружить крайне затруднительно, потому что его положение на кривой сложности индивидуальнео для каждого программиста.
Что же происходит дальше при развитии проекта в том же ключе? Сложность возрастает, вместе с ней растут и сроки исполнения. И в некоторый момент наступает второй коллапс, когда сроки выполнения работ превышают все допустимые границы даже для прежней группы разработчиков. В этот момент исчезает смысл работать дальше и существует только два варианта — либо переписывать все заново, либо прекращать работу, что означает гибель проекта.
PS:Разумеется, эти размышления носят чисто эмпирический характер. И, полагаю, более опытные коллеги по цеху возразят мне.