Будущее не предсказать
Вчера на главную страницу хакерньюс в очередной раз попал один из моих любимых блог-постов про программирование. Он называется "Write code that is easy to delete, not easy to extend". Через весь пост красной нитью тянется важная мысль: написание кода — это эволюционный процесс, который никогда не останавливается, и нет универсальных подходов и практик, которые всегда работают.
Автор выделяет восемь шагов в написании кода: 0. Не пишите код 1. Скопипастите код 2. Не копипастите код 3. Пишите побольше бойлерплейта 4. Не пишите бойлерплейт 5. Напишите один большой кусок кода 6. Разбейте код на части 7. Продолжайте писать код
Все восемь пунктов нельзя применить одновременно. Это эволюция, которую нужно пройти шаг за шагом.
Самые сложный код. с которым мне приходилось работать (и который я писал когда-то сам) не был эволюционным. Он пытался сразу решить как можно больше проблем, он пытался предсказать будущее. Как правило, предсказанное будущее никогда не наступало, а переусложнённый код продолжал лежать в исходниках.
От предсказания страдают все этапы разработки. Команда тратит время и силы сначала на поиск решения для несуществующей проблемы, а потом на реализацию. Каждое такое решение замедляет команду, затрудняет добавление новых фич и нуждается в поддержке. Каждое такое решение слишком продуманное, красивое и близкое к сердцу, чтобы без сожалений его удалить.
Когда я работал в канадском стартапе, то в одиночку развивал кодовую базу почти на двести тысяч строк кода. Кодовая база досталась мне в наследство и в ней было много предсказаний. Чтобы выжить, я решил бороться с предсказаниями.
Я начал с функций и действовал по совету Джона Кармака: если функция вызывается в одном месте, нужно попробовать её заинлайнить. Оказалось, большинство функций были слишком умными. Они принимали в себя лишние аргументы и обрабатывали случаи, которые никогда не могли наступить. После инлайна функции сжимались. Несколько десятков строк кода превращались просто в несколько строк. Почти за три года работы в стартапе я добавил много крупных фич, но кодовая база не выросла, а наоборот уменьшилась. Всё благодаря борьбе с предсказаниями.
В своих командах я учу разработчиков не заглядывать в будущее, а решать только текущие проблемы. Приложения будут развиваться, проблемы будут становиться сложнее, и рано или поздно наступит время для более сложных и продуманных решений. Но пока время не пришло, не стоит загонять себя в искусственные рамки из вымышленного будущего. По своей природе софт — это мягкий и податливый материал. Когда придёт время, ему можно придать любую форму.