Где грань между гибкостью кода и скоростью разработки?

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
Где грань между гибкостью кода и скоростью разработки?

(Это только мысли, и не в коем случае не пропаганда чего либо или против чего либо)

Всегда ли надо делать из говнокода конфетку? Рефакторинг, TDD, паттерны-антипаттерны, красивая документация, Q&A etc
Возьмем, к примеру, перманентный рефакторинг: как только появляется плохой запах кода, переделываем, чтобы не воняло. Вроде бы всё круто, код получается отличный, но не страдает ли от этого бизнес?
Грубо говоря, на рефакторинг тратится время, которое можно было бы использовать на новый функционал.
Т.е. рефакторинг всего = деньги тратятся на з/пл и не зарабатываются на новом функционале. Двойной удар, так сказать.

Общее мнение, насколько я понимаю, что, мол, если не допускать говнокод, то в будущем время на доработку нового функционала уменьшится, чем гибче тем лучше, чем меньше зависимостей тем лучше.

Но:

1) Время на доработку в будущем может стоить дешевле времени на доработку сейчас. Я имею в виду, можно сейчас заработать деньги, нанять на эти деньги программистов, и тогда в будущем больше программистов будет трудится над говнокодом :) И им вдесятером будет легче разгребать старинный говнокод, чем в одиночку править суперкод. К тому же первичные говнокодеры бизнесу обойдутся дешевле.
2) Для многих стартапов жизненно важно выйти на рынок как можно быстрее любой ценой, пока конкуренты тормозят.
2) Х.з. что там будет, в этом будущем, может полная отмена проекта? Отмена половины фич проекта? Нашествие инопланетян? :)
3) Мы не знаем, какая именно гибкость кода понадобится в будущем, а какая пролежит без дела. Т.е. "гибкость всего" гарантированно содержит лишние действия. Например, мы пишем прослойку к БД, чтобы поддерживать несколько СУБД, а это оказалось не актуально для рынка продукта. Или модуль к чему либо написан один раз, хорошо работает, и его год никто не трогал, хотя он гибкий-перегибкий.

Те же самые рассуждения про TDD. Я уж не говорю про любителей складывать 2 и 2, используя 10 паттернов для крутости.

Эти рассуждения разумеется не применимы к фреймворкам, там все должно быть идеально, ибо это их суть. Также они наверно не применимы к разработкам программ для какого-нибудь лунохода, где каждая ошибка может стоить слишком дорого.

В общем, вот мои мысли, возможно я не прав:
1) Надо рассматривать каждый конкретный проект отдельно, а не применять все известные технологии, просто потому, что умеешь.
2) Для многих проектов нужно быстро, топорно и с некоторыми ошибками сделать первую версию, не заморачиваясь, а уже потом спокойно рефакторить, абстрагировать, добавлять юнит-тесты, документацию и проч.
Microsoft раз за разом выпускает винды с багами, а уже потом шлифует напильником. Не ждет конкурентов.
3) Возможен и другой подход: рефакторить но не всё. Т.е. если для примера рассматривать какую-нибудь говноцмс, то в ней можно идеально проработать интерфейс модулей и интерфейс ядра. А вот на реализацию конкретных модулей можно потратить меньше времени. А уж какие-то части модулей можно писать хоть как.
4) Есть еще и такой аспект, как мотивация. Мне, например, противно дорабатывать говнокод. Такие вещи тоже надо как-то учитывать... Даже если всё, что я написал выше, близко к истине, то налицо конфликт между интересами программера и бизнеса.

В общем, что думаете? Может, у меня сегодня воспаление мозга? :)

Кстати, прошу быть позитивными и не флудить :)
 

Adelf

Administrator
Команда форума
Re: Где грань между гибкостью кода и скоростью разработки?

Любой заказ меньше какойто определенной планки я делаю вообще без ничего. Просто пишу код и отправляю результат(как правило такому заказчику на качество совсем плевать и наши интересы совпадают).
Когда пишу какую-нибудь мелочь для себя/своей фирмы - то пишется все опять таки без всего. Единственное отличие - все-таки оставляю больше возможностей для быстрого добавления(изменения) нового функционала. Мелочевкой очень просто управлять. Все методики(XP, рефакторинги, тесты) возникли тогда, когда проекты стали становиться большими. И не умешаться в голове одного человека.
Если это мэйн-проект(даже если он пока маленький) - то отношение должно быть полностью серьезным(тесты, рефакторинг, правильно организованное хранилище и т.д. и т.п.). И чем серьезнее сейчас - тем проще в будущем.

Однако взгляд бизнесмена на это - совсем другой. Для него параметр "качество" неощутим. Вот "срок" - совсем другое дело. И с этим очень сложно бороться. Вот недавно пришлось ознакомиться с проектом, который писался также - главное как можно скорее получить нужный результат. Через пару лет это все выросло в это вот безобразие - скриншот(таких файлов в проекте - сотни). Скорее всего я откажусь это рефакторить. Почти наверняка проще переписать.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
И с этим очень сложно бороться. Вот недавно пришлось ознакомиться с проектом, который писался также - главное как можно скорее получить нужный результат. Через пару лет это все выросло в это вот безобразие - скриншот(таких файлов в проекте - сотни). Скорее всего я откажусь это рефакторить. Почти наверняка проще переписать.
Так вот я и думаю, может и не надо "бороться"? Программист должен быть эффективен не как сферический конь в вакууме, а как часть бизнес-процесса. Даже если потом код придется полностью переписать, возможно начальный говнокод был оправдан.
 

Adelf

Administrator
Команда форума
Ну вообще одну из главных мыслей Getting Real от 37signals примерно так и можно понять - самую первую версию надо набросать за первый месяц. А потом можно ее допиливать. Правда они не говорят - напиши говнокод и живи с ним всегда :) Они имеют ввиду написать систему с самым минимальным необходимым функционалом. Т.е. экономить не на качестве, а на функциях. Потом оказывается, что многие функции просто не нужны. Примеров того, что этот подход более чем жизнеспособен, достаточно даже у самих 37signals.
 

pilot911

Новичок
делать надо так - сначала пишем как думаем, оцениваем идеи на черновую, потом в бета версии все переделываем на основании возникшего понимания структуры системы
 

Sawa

Новичок
Однако взгляд бизнесмена на это - совсем другой. Для него параметр "качество" неощутим. Вот "срок" - совсем другое дело.
это для манагера скорее , который подгоняет , чтобы в срок в писаться

Для бизнесмена нет техников, он может полностью не понимать того чем занимается, а его знаний будет достаточно чтобы понимать что там есть деньги. Его интересует параметр - сколько денег вкинул, и сколько получил. Китайцы\индусы лучше - они дешевле чем держать офис в москве. Если результат одинаков для конечного пользователя ( работающий сайт ), зачем вкладывать больше ? Если делается заказ, вообще непонятно зачем качество. Человек обратился за помощью потому что ничего не понимает, зачем качество кода если это при сдаче(и оплате заказа) никто не оценит.

т.е. вы понимаете что в реале дела девелоперов еще хуже чем кажутся :D рефакторинг, юниттесты, время на доработки оптимизацию ? хорошее место работы у вас :)


ЗЫ. иногда "правильно" то что выгодно, так не только русские думают.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
это для манагера скорее , который подгоняет , чтобы в срок в писаться
срок для бизнесмена очень важен. Это оборачиваемость средств.
Т.е. цель не просто заработать столько то денег, а заработать их как можно быстрее, чтобы можно было дальше вкладывать и зарабатывать еще, как можно быстрее, чтобы можно было вкладывать....

-~{}~ 08.09.09 16:48:

т.е. вы понимаете что в реале дела девелоперов еще хуже чем кажутся
Почему "хуже"? Ну не требуется качество, да и бог с ним. Об этом и речь, что всё зависит от конкретики.
 

zerkms

TDD infected
Команда форума
Грубо говоря, на рефакторинг тратится время, которое можно было бы использовать на новый функционал.
как пишут во всех книжках о "модных технологиях" - эти самые технологии это долгосрочные вложения. т.е. сегодняшний "прогиб" на рефакторинг в 10 часов - это экономия на поддержку и дальнейшее развитие написанного сейчас кода в будущем в размере 100 часов.

* числа взяты с потолка, но идею передают.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
как пишут во всех книжках о "модных технологиях" - эти самые технологии это долгосрочные вложения. т.е. сегодняшний "прогиб" на рефакторинг в 10 часов - это экономия на поддержку и дальнейшее развитие написанного сейчас кода в будущем в размере 100 часов.
Кто-нибудь замерял? :)
 

Adelf

Administrator
Команда форума
zerkms ты б почитал всетаки :)
ТС говорит о том, что время, которое "сейчас" часто бывает гораздо дороже времени, которое "будет потом". И он в этом прав :) Даж не знаю что возразить.
 

zerkms

TDD infected
Команда форума
Кто-нибудь замерял?
я "замерял". в mzz уже давно собираю профит с тдд.

-~{}~ 09.09.09 00:12:

Adelf
угу согласен. быстрый прув оф концепт вообще обычно с конечным продуктом не имеет ни одной общей строки :)
 

whirlwind

TDD infected, paranoid
Почему щас такси с собственными отечественными а/м нету, они ведь дешевле?
 

Духовность™

Продвинутый новичок
Хорошая, годная тема.

Год назад я начал изучать паттерны, ООП, МВС, рефакторинг и пр. словечки, невероятно модные сейчас. Изучал, и на работе реализовывал проекты на базе моего видения этих технологий. Что сказать? Коллега, не слышавший имени Буча, Фаулера, не имеющий грамотного понятия об ООП, писал жуткий говнокод-кашу из html и выгодно выигрывал по срокам. Я же, залезая в рамки стремления к профессиональному программированию, тормозил сроки вызывал недовольство менеджеров.

В конечно итоге, я пришел к выводу, что примерно в 50% своей рабочей практике я складывал "2 и 2, используя 10 паттернов для крутости".

Всегда ли надо делать из говнокода конфетку?
1. Любой код, хорошо работающий в данный момент и отвечающий потребностям задачи - хороший код.

2. Говнокод - это тот самый конь в вакууме. В интернете 99% сайтов представляют из себя говнокод. Как сказал Дима Попов здесь
Увы, но "классический сайт" - делается на один раз, по конкретному заказу от конкретной компании.

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

Сайт должен быть быстрым, масштабируемым, и работающим. Все навороты - сильно усложняют (да, я именно так считаю) разработку и поддержку сайта
Далее, вот от него ещё хороший пример:
Я помню, как-то правил проект на PHP, который сделал человек, позже ушедший в Java-разработчики.


Что бы исправить одну мелкую ошибку, надо было перескочить через четыре полупустых класса, оттуда выйти на псевдо-интерфейс, и только там увидеть функцию.


Да, я уверен, что система у автора была красивая и масштабируемая.

Только он не учел, что поддерживать её будет заранее неизвестно кто, и документации на неё нету (он не делал).


Так вот, к чему это я. К том, что в недокументированном коде, использующем сложные объектные подходы, я твердо убежден, как правило разбораться гораздо сложнее, чем в линейном простом, но при этом грамотно написанном.

Безусловно и там и там есть исключения.

Но я не понимаю, откровенно не понимаю, когда на сайте, представляющем из себя набор текстовых лент, для генерации одной от начал до конца необходимо перелопать пять классов. И это не считая абстракции.
 

AmdY

Пью пиво
Команда форума
опять лошадка в вакууме? когда время жмёт не обязательно писать говнокод. можно отбросить часть функционала, по обрезать проверки и обработчики исключений, сделать что-то попроще, рефакторить не весь код за раз, а в несколько проходов и т.д. причём вопрос решается во время работы над конкретным проектом.
 

AmdY

Пью пиво
Команда форума
но такие вещи решаются на месте, есть кусок кода, оценивается сколько займёт его переписывание и сколько это сэкономит времени-ресурсов в дальнейшем. если числа не сильно различаются, проходим мимо, отлаживая на потом(никогда). незачем решать будущие проблемы. Я вспоминаю Zend Framework <=1.0, с его _гибким_ MVC, от которого раньше воротило, потому что использовать для _конкретной_ задачи было неудобно.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
В общем, лично для меня всё встало на свои места. Нельзя никакие теории возводить в абсолют, надо всегда оценивать, прикидывать, смотреть цели/сроки и т.д., где-то можно одно, где-то другое...
 

Alexandre

PHPПенсионер
Они имеют ввиду написать систему с самым минимальным необходимым функционалом. Т.е. экономить не на качестве, а на функциях. Потом оказывается, что многие функции просто не нужны.
аналогичная мысль была в "Факты и заблуждения профессионального программирования"

код надо сразу писать "нег@вно"
потом самому легче будет разбираться.
 

Духовность™

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