Старый код имеет больше шансов выжить

Несколько лет назад у меня возникла такая ситуация. Нам (оффшоринговой команде) дали проект, над которым до этого работали девелоперы* на стороне заказчика.

Мы провели пару рефакторингов. И после этого к нам в код глянул заказчик. И задал вопрос : «почему г***о — код которому n лет в обед рефакторингами не затронут, а код который вы сами писали отрефакторен»?

И я бросил заметку «нормальна ли ситуация, когда старый код переживает новый?» в свой личный «долгий ящик».

Через какое-то время мне попалась идея про т.зв. Эффект Линды ( dou.ua/forums/topic/13137 ).

И я решил проверить ее на коде.
Т.е. я решил выяснить у какой строчки больше шансов протянуть следующие 1000 коммитов — у той, которая была закоммиченна 1000 коммитов назад — или у той, которая была закоммичена n*1000 (n>1) коммитов назад?

Для этого я взял известные **проекты с открытым кодом, которые используют mercurial*** . Для визуализации и подсчетов я выбрал ipython notebook, основной код доступен github.com/...​ter/hg_st/mozilla_central.

Что у меня получилось?
Для проекта Mercurial SCM, вероятность у строки возраста 1 000 коммитов выжить еще 1000 коммитов порядка >90%, у строки возраста 5 000 коммитов вероятность <95%, у строки возраста 20 000 коммитов вероятность >98%

У большиства других проэктов подобная картина. bogdanartyushenko.blogspot.com/...​ct-on-source-code-on.html

Исключение составил проект cpython.

Т.е. если у вас тоже в проекте старый и плохой (т.е. не ваш) код переживает новый и классный (т.е. написанный вами) — можете попробовать этот момент в качестве аргумента.

* в коммитах а не во времени, т.к. проект может «умереть» потом быть реанимирован и т.п.
** мне известные-)
*** мне было проще для него написать скрипты

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
И после этого к нам в код глянул заказчик.
Берите метлу и по морде, по морде. В код он заглядывает, ты смотри какой.

Обидчивый он ты смотри какой. (к)

Имеет больше шансов выжить, если не меняется архитектура проекта. Если например, вы использовали один подход, а потом перешли на другой, то естественно, что большинство старого кода будет удалено

Странный вопрос. Вменяемый девелопер не будет без крайней нужны трогать старый как говно мамонта непонятно как работающий и не покрытый тестами код. А свой — будет, т.к. понимает примерно как он работает.

Хотите рефакторинг — выделяйте ресурсы на TDD и регрессию, заставьте BA писать что фича делает в JIRA.

Заказчик платит деньги за определенные услуги, чаще всего — допилить / перепилить фичу. За то что любознательный девелопер полезет рядом рефакторить и ломать он не платит. Нет никакого смысла подвергать проект и себя ненужному риску из-за приступов хипстерства.

Чудес не бывает.
pp.vk.me/...732/1e601/HwLkSEV0tFI.jpg

Я думаю, это справедливо для каких-то изолированных подсистем или компонентов, которые никак не затрагиваются при изменениях

угу, есть у нас тоже один чудный репозиторий, который трогать бояться)

Тоже мне, истину открыл. А то что график надёжности экспоненциальный — тоже не знал?
По той же причине если ту же задачу может выполнить старый код и новый — бери старый, лучше возрастом 1+ год.

То же самое касается всех технически сложных устройств — чем они старше, тем они надёжнее. Причина банальна: чем жёстче баг, тем раньше он себя проявляет.

Проблема в другом: Иногда баги попадаются настолько редкие или имеющие обходы, что они выживают. А следовало бы убить в ранней стадии. Ещё хуже, когда эти баги называют фичами, и находятся люди которые к ним привыкли и жить без них не могут. И совсем п*****ц, когда их называют стандартами, как какой-нибудь UML, хотя ему давно пора найти замену.

А не логичнее ли предположить, что «в начале времен» пишется каркас и ключевой функционал, на который (обычно) получается чуть больше времени и чуть меньше неожиданных изменений. А потом уже начинаются демо, перепиливание функционала, свистелки и т.д. В таком раскладе вполне логично, что более продуманная часть кода выживает и не рефакторится. А если рефакторинг проводить сразу, и регулярно выявлять г-код, тогда опять же, долгоживущий код — это такой код, который сходу признали приемлемым. В обеих моделях хороший код вполне ожидаемо долгоживущий)

Понятие говнокода очень относительное. Особенно во времени.
Раньше, когда индусского кода еще не было (ну или он не был таким массовым), весь код был более-менее сносным. И если что-то делало свою работу и при этом не особо глючило (или глюки были описаны и не мешали при аккуратном использовании библиотек), то глубокого смысла в рефакторинге не было.
Ну и кроме того — хотя большинство программеров и несколько перфекционисты, но в основном по отношению к своему собственному коду. Несовершенство чужого пусть мучает его автора. )

Че сказать-то хотел?

Підписатись на коментарі