Как вы справляетесь с уродливым кодом, который вы написали? [закрыто]


88

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

Чем ты занимаешься? Перестаньте быть маньяком OCD и просто примите, что ваш код приведет к беспорядку, независимо от того, что вы делаете, и просто продолжайте использовать функции этого чудовища? Сохранить очистку для версии 2?


15
Это отличный вопрос.
Уолтер

3
Я думаю, что это хорошее место для применения правила 80/20 .
Марк C

хм .. не пишите некрасивый код вообще ?!
Рупеш Шеной

8
@Roopesh: Во -первых, это не уродливо, но когда ты продолжаешь заниматься этим, это становится уродливым. С добавленными функциями вы понимаете, что структура ядра могла бы быть разработана иначе, чтобы лучше поддерживать эти функции. И в этот момент вы можете либо вернуться назад и переписать большие куски основы, либо просто добавить функцию. Обычно не хватает времени, чтобы вернуться и переписать половину вашей программы.
mpen

Тогда «дизайн с учетом изменений», говорите вы. Конечно, легко сказать, но когда некоторые фундаментальные вещи меняются, потому что ваш клиент на самом деле не знает, чего он хочет, а только дает вам половину спецификации, это довольно сложно.
mpen

Ответы:


41

Найдите другую работу и позвольте другим людям с ней справиться. Muahahahhahahaa.

.....

Просто шутка. :)

Но со всей серьезностью: оценка заполнения - ваш друг. Я обычно делаю достойную реалистичную оценку, а затем удваиваю ее. Это может звучать чрезмерно, а иногда и так, но лучше немного переоценить и даже иногда выглядеть немного медленнее, чем оставлять плохие впечатления, получая ошибочный код и всегда сбивая ваши оценки. И, конечно, вы берете на себя технические долги, позволяя кодовой базе стать хакером.

Другой (связанный) совет: всегда оценивайте кажущиеся крошечными задачи, не требующие больших усилий, для приличного размера блока. Скажем, к примеру - элемент, в котором вы почти уверены, будет просто однострочное 30-секундное изменение - дайте ему 1 час (или, может быть, любой самый низкий временной блок в вашем расписании или системе CR, например, 15 минут / 0,25 часа) , И дайте блоки на полдня или 1 день для более крупных, но все же относительно тривиальных предметов.

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

Наконец, всегда помните, что люди не должны знать, что вы несколько дополняете свои оценки. Пока вы компетентный разработчик и выполняете работу в приличном темпе, этот отступ не будет заметен. т.е. не говорите PHB: «Моя первоначальная оценка состоит в том, что это займет два часа, но дайте мне полдня». Просто скажите ему: «Я думаю, это займет около половины дня». и оставь это там.


12
+1 За то, что ты злой. ;)for(printf("MUHU"); 1; printf("HA"));
Матин Улхак

1
@muntoo: Мне потребовалась секунда, чтобы понять, что это было ... не видел for. Cute;)
mpen

4
Я уверен, что это зависит от менеджера, но вам не обязательно лгать. У меня и CTO есть понимание; он знает, что я могу дать разумную оценку, но только с уверенностью около 50%; если я добавлю коэффициент выдумки, то смогу дать ту же оценку с уровнем достоверности 90%. И оказывается, что в течение длительного периода времени большинство людей предпочитают надежные оценки наивно-оптимистичным, даже если они не признают или не осознают этого, поэтому он дает пессимистическую оценку своему боссу, если только это не является чрезвычайной ситуацией.
Ааронаут

2
Дело в том, что абсолютно ничто не занимает меньше чем полчаса, очень хорошо сделано. Даже если единственное изменение в коде занимает 5 минут, есть множество накладных расходов.
Мерф

2
@ Murph - на месте. Я отказываюсь от любой коммерческой оценки менее чем за полдня. К тому времени, когда разработчик собрал правильный код, внес изменения, запустил модульные тесты, передал сборку для тестирования и протестировал ее в здравом уме, НИЧЕГО не занимает 5 минут.
Джон Хопкинс

66

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

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


+1 за это. Оценка заполнения FTW. И действительно, тот же совет касается обоснования того, сколько времени занимает исправление ошибок и их обслуживание (во всяком случае, внутренне: оправдание PHB, а не клиентам, как вы говорите, клиентам все равно).
Бобби Столы

5
Я думаю, что это разумный способ решения проблемы тоже. Боль, которой они подвергают разработчиков, должна быть возвращена в качестве дополнительных затрат. Менеджмент и отдел продаж тоже должны согласиться с этой философией, иначе разработчики получат шанс и будут подвержены ухудшению кодовых баз.
Жестянщик

1
О, дальше: безусловно, идеал - это открытое, честное общение. Я предлагаю механизм преодоления только тогда, когда это не вполне достижимо. Это долгосрочное лекарство как обман.
Фрэнк Шиарар

3
Это дополняющая оценка? Похоже, пришло время для реализации новой функции при сохранении качества кода для меня.
Дэвид Торнли

2
Я думаю, что это в основном правильный подход, но я бы охарактеризовал его по-другому. Они нанимают вас для разработки профессионального кода качества. Это означает, что вам нужно вложить в свои оценки время, чтобы «сделать все правильно». Не делайте оценки, основываясь на времени, которое понадобится вам, если вы не спите всю ночь, взламывая и объявляете «выполненным», как только он заработал правильно в первый раз. Это может означать, что в конкурентной ситуации вам будет иногда недостаточно. Это нормально. Вы создадите репутацию, обеспечивающую качество и стабильность, и в конечном итоге победите. Играть в длинную игру.
Брэндон Дюретт

11

Попробуйте сделать правильный редизайн при интеграции новых функций. Нет позже. Без редизайна вы постоянно добавляете все больше и больше трений для дальнейших изменений и новых функций.

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

Правильный редизайн / рефакторинг может защитить инвестиции ваших клиентов и обеспечить устойчивость. Вы должны встроить это. Оптимизировать для перемен, путешествовать налегке.


6

Со всеми комментариями о переоценке, я думаю, что скромное количество очков (хорошая возможность) упущено.

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

Вернемся немного к первоначальному вопросу - через много лет для меня это сводится к тому, что вы реализуете что-то, если не знаете (не верите, не ожидаете (подозреваете?), Не думаете, но знаете ), что дополнительные вещи Кроме того, необходимо выполнить то, что вам нужно для реализации этого требования, и не более аккуратно и элегантно, как вы можете.

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

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

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

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


4

1) Правильный контроль изменений - ваш друг

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

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

2) Рефакторинг должен быть выполнен таким образом, чтобы обеспечить подлинную долгосрочную выгоду для клиента

При рассмотрении вопроса о рефакторинге вы всегда должны учитывать, что на самом деле необходимо и что важно, и обеспечивать, чтобы работа по рефакторингу приносила подлинную долгосрочную отдачу за деньги.

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


3

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


2
+1; Это может сработать, однако также существует опасность отчуждения вашего клиента из-за его негибкости. В какой-то степени, можете ли вы сделать это или нет, зависит от типа (размера) проекта и ожиданий клиента.
Кен Хендерсон

3

У меня есть следующий комментарий в базе кода, над которой я сейчас работаю:

/*
 * Every time I see this function, I want to take a shower.
 */

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

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


2

Я предпочитаю избегать этой ситуации в первую очередь.

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

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

в будущем кажется, что вам нужно работать в партнерстве с вашим клиентом. Говоря им, «посмотрите, этот продукт значительно расширяется за пределы оригинальной спецификации. Хотя оригинальный дизайн был хорош для этого уровня, его расширение в направлении X и направлениях Y нуждается в некоторой реструктуризации в дизайне», с которым хорошо справились, и вы даже получите свой клиент платит за это.


Я не знаю, буду ли я считать их "жуками" или нет. Я делаю некоторые большие изменения, и, естественно, все начинает разваливаться, когда вы начинаете вырывать фундамент. Это все поправимо, хотя. Я напоминаю своему клиенту о затратах на внесение таких изменений на регулярной основе, но он хочет немедленных «оценок», которые я просто не могу дать. Парковка мяча невозможна, пока вы действительно не задумаетесь обо всех изменениях дизайна, которые вам нужно сделать, но он просто не понимает этого. Во всяком случае, он платит, и он не жалуется слишком много.
2010 г.

2

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


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

1

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

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

Поэтому лучше прислушиваться к лицу, принимающему решение, к фактическим затратам, не требующим рефакторинга кода, когда это необходимо - по моему опыту, если затраты и временные последствия обоих вариантов объяснены в измеримом выражении владельцу решения, тогда решение может быть ежу понятно. Не ждите, что люди скажут вам: «Да, продолжайте писать красивый код, хотя это занимает вдвое больше времени и не дает мне никакой дополнительной выгоды». Просто так не работает.


1

Сделайте это частью вашего процесса, я называю это «экстремальным рефакторингом», и он будет большим! ;) Просто делайте вещи быстро, и когда будет добавлено достаточно новых функций, которые содержат рубцовую ткань, проведите рефакторинг. Постоянно спрашивайте себя: «Если бы я начал с нуля, как бы я это сделал»

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

Будучи хорошим программистом, вы сможете довольно быстро проводить рефакторинг, и, если вы будете делать это постоянно, код начнет принимать «правильную форму», то есть он станет более гибким с меньшим количеством зависимостей.

Клиенты могут быть недовольны, если они знают, что вы «тратите время» на переработку материала, так что это помогает не спрашивать и не рассказывать об этом, а быть очень быстрым.

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

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


1

Положитесь на высшую силу

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

В нормальном процессе проекта общая спецификация должна быть заморожена до того, как начнется серьезная разработка.

Многие клиенты будут продолжать добиваться изменений / улучшений / улучшений, пока вы их разрешаете. Многие будут использовать эту способность по максимуму, потому что это заставляет их чувствовать, что они получают максимум за свои деньги (даже если это саботирует ваш проект).

Попросите человека, который посвятил себя совершенствованию и замораживанию спецификации на ранних этапах и обеспечению ее соблюдения позднее.

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

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

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


0

Первоначальный правильный дизайн не может помочь избежать проблемы. И почти невозможно (или очень-очень сложно) учитывать все будущие «возможно» требования. Так что через некоторое время Большой Рефакторинг прибудет. И лучшее решение - переписать все.

В двух словах: вместо того, чтобы установить башню на красный Ferrari, пересмотрите требования и постройте танк.


0

Убей его огнем.

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


0

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


0

Самый простой ответ. Я бы прекратил кодирование любого рода, пока у него не будет окончательной спецификации именно того, что он / она хочет на данный момент.

Затем им нужно расставить приоритеты в этом списке функций и т. Д., Чтобы подтвердить, какие элементы должны быть прямо сейчас, а какие можно сделать позже ...

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

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

Скажите им, как только у вас есть окончательный список, что вы будете вносить изменения в будущем, как они предпочитают, но должны сосредоточиться на лучших 15/20, которые они должны иметь прямо сейчас.

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

Как только окончательное решение будет принято относительно того, что должно быть сделано для текущей версии, все обсуждения / идеи / предложения должны быть остановлены на 100%.

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

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

Это трудно сделать, но ползучесть прицела настолько разрушительна для времени, энергии, мотивации и ясного мышления.


0

С точки зрения завершения проекта:

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

С точки зрения разработки:

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

С точки зрения планирования:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.