Как быстрые и грязные программисты знают, что они поняли это правильно?


166

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

Тем не менее, некоторые люди считают, что иногда стоит намеренно проверять грязный код в интересах доставки программного обеспечения, планируя «очистить его позже». Есть ли какая-либо практическая техника, которая дает им уверенность в правильности их кода, когда читаемость ниже идеальной? Стоит ли пытаться развивать навык? Или нехватка доверия к коду - это то, что некоторым людям легче принять?


40
Моя теория состоит в том, что все кодеры находятся где-то посередине между «запоминающими устройствами» и «понимающими предметами», и лишь немногие могут делать то и другое. Чем больше дерьма вы можете вспомнить сразу, тем более грязным вы можете позволить себе создавать свой код. Чист ли код или нет, заставьте его работать, протестируйте его!
Работа

35
Тем не менее, некоторые люди считают, что иногда стоит намеренно проверять грязный код в интересах доставки программного обеспечения, планируя «очистить его позже». хех ... ад замерзнет, ​​пока не наступит " позже " ...
Карлос Кампдеррос

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

12
@joe - +1 - некоторые программисты слишком быстры, чтобы игнорировать код, который не вписывается в личную идею «хорошего кода». Вы всегда должны пытаться понять мышление тела кода и его стиль кода, часто вы узнаете что-то полезное.
Джеймс Андерсон

10
How do quick & dirty programmers know they got it right?Потому что это работает :)
Рейчел

Ответы:


100

Код, вероятно, не прав.

Однако это может не иметь значения.

Быстрый и грязный может быть правильным путем в ситуациях, когда:

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

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

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

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


24
+1 за «влияние неудачи низкое». Моим любимым математическим расчетом риска является риск = фактическое последствие неудачи x вероятность неудачи x воспринимаемое последствие неудачи (по моему опыту, предполагаемый риск, которому часто подвержены заинтересованные стороны)
Trav

7
«Код имеет короткое время жизни. Например, вы преобразуете набор данных в стандартный формат с помощью специальной программы». Что, если преобразование не выполнено правильно, но расхождения в данных не замечены намного позже?
Джои Адамс

3
@Trav Итак, просто чтобы подтвердить, что если фактические последствия неудачи огромны, но мои предполагаемые последствия неудачи равны нулю, никакого риска нет?
Кристиан Стюарт,

3
@ChristianStewart С чисто математической точки зрения ваше утверждение будет правильным. Однако на практике восприятие следствия равным нулю не отменяет вес вероятности х фактического следствия. Восприятие помещено в формулу для учета организационных страхов, которые часто влияют на решения по смягчению последствий. Отсутствие такого страха не уменьшает фактическую вероятность или последствия. Таким образом, следует предположить, что восприятие всегда по крайней мере равно 1 (так как оно может увеличивать, но никак не сводить на нет фактический риск)
Trav

1
@Trav В качестве альтернативы, переименуйте один. А именно, риск должен быть заменен на воспринимаемый риск , поскольку, если мы считаем, что последствий неудачи нет, мы, вероятно, также считаем, что риска нет.
Делиот

237

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


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

8
Многие из нас оказались в этом довольно неудачном положении. Это довольно обескураживающий быть завещанным техническим долгом других людей .
Марк Бут

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

3
@ tp1: Хорошие программисты могут написать код, который легко читать. Они делают это, когда кто-то другой читает это, и разъясняет все, что неясно. С практикой часть, которая неясна в первом чтении, сократится.
Кевин Клайн

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

103

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

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

Любой, кто был в этом бизнесе некоторое время, вероятно, согласился бы, что можно было бы возиться с частью программного обеспечения более или менее бесконечно. Duke Nukem Forever, мои друзья. Наступает время, когда эту замечательную функцию или такую ​​срочную работу по рефакторингу просто необходимо отложить и эту штуку следует называть ГОТОВО.

Я боролся с коллегами по этому поводу много раз. ВСЕГДА есть еще один твик, что-то еще, что «должно» быть сделано, чтобы оно было «правильным». Вы всегда можете найти это. В какой-то момент в реальном мире достаточно хорошего, просто должно быть достаточно хорошо. Никакое реальное, актуальное, отгрузочное программное обеспечение не является идеальным. Никто. В лучшем случае это достаточно хорошо.


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

7
«Любой, кто был в этом бизнесе некоторое время, вероятно, согласился бы, что можно было бы возиться с частью программного обеспечения более или менее бесконечно». Это было бы возможно, но зачем это делать? После того, как вы установили свой стандарт качества, вы разрабатываете его, внедряете, тестируете, исправляете ошибки, снова тестируете, а затем уже не трогаете. Это займет больше времени, чем просто взлом, но как только вы достигнете своей цели (необходимая функциональность реализована и протестирована), становится совершенно ясно, что вам больше не следует возиться с кодом. Просто мои 2 цента.
Джорджио

7
+1 - в реальном мире всегда будет компромисс между качеством кода и соблюдением сроков. Я предпочел бы иметь программиста, который может быстро создавать разумный код, чем перфекциониста, который тратит месяцы, мучаясь от того, должен ли он вызывать метод "serialize" или "writeToFile".
Джеймс Андерсон

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

6
@ Джорджио: Я не согласен с вашим "суеверием", что качественная работа занимает больше времени, чем просто взлом ее. Это может быть правдой, если вы приравниваете программирование к печатанию. Принимая во внимание весь жизненный цикл программного обеспечения, все идет намного проще и, следовательно, быстрее, если вы заботитесь о качестве.
ThomasX

85

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

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

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

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

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


8
«доброжелательно (и невежественно) полагать, что они делают все возможное, учитывая обстоятельства». Идеальное изложение проблемы. # 1 бросился из-за ограничений и сделал все, что мог. № 2 приходит и унаследовал хаос плюс новые сроки и делает все возможное. Вплоть до двадцатой бедной души, которая не могла сделать все возможное, если бы у него были годы, чтобы исправить ущерб. Вот почему я придерживаюсь правила бойскаутов: «Оставь это чище, чем ты его нашел». Дайте этому следующему соку шанс на бой - это может быть вы.
Стив Джексон

1
Забавно, я чувствую обратное, так как я начал модульное тестирование своего кода (на работе). Это как лень; нет никакой причины действительно понимать ваш код, так как другой код будет ловить ошибки для вас
Izkata

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

4
Дональд Кнут: «Остерегайтесь ошибок в приведенном выше коде; я только доказал, что это правильно, а не пробовал». haacked.com/archive/2007/11/29/…
MarkJ

1
@Izkata - если вы не понимаете, что делаете, модульные тесты, вероятно, не работают и проверяют, что код содержит те же ошибки, что и тесты. Кроме того, даже при 100% покрытии решений и точных модульных тестах, возможно (хотя и необычно) иметь ошибку, которую тестирование не выявляет.
Steve314

33

Модульные тесты . Это единственный способ быть уверенным в любом коде (грязном или нет).

На боковой ноте;

короткие сокращения делают для длительных задержек (Пиппин)


6
Хорошая цитата, но это был не Гэндальф. Это был Пиппин, который спорил, почему он, Фродо и Сэм не должны пересекать всю страну до парома Баклберри, прямо в первом путешествии из Хоббитона.
Даниэль Роузман

22
Исправление: «Модульные тесты. Это единственный способ получить ложное чувство безопасности в коде (грязный или нет)». Модульные тесты хороши, но ничего не гарантируют.
Кодер

8
Когда я хочу обнаружить скрытые ошибки, я показываю приложение своему боссу. Я называю это босс-тестом, он должен быть сделан после юнит-тестирования. У него есть аура магнетизма, которая поглощает все виды странных ошибок, а также космические лучи прямо в регистры процессора.
Мистер Смит

8
В то время как мы цитируем, вам также может понравиться «Тестирование показывает наличие, а не отсутствие ошибок» - Эдсгер Дейкстра
Тимоти Джонс

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

15

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

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


1
+1 за указание на то, что решения о мерах качества должны быть обоснованы потребностями бизнеса.
Стивен Гросс

+1 за * «Навык, который нужно развить, - это понимание того, какой уровень« совершенства »необходимо использовать для конкретного проекта». ... Установите минимальный стандарт того, насколько «подстройка», по вашему мнению, будет приемлемой риск с точки зрения качества, а затем придерживаться его.
С.Робинс

11

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

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

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


1
Другими словами - модули могут быть Q & D, но архитектура должна быть правильно очищена.
Кромстер

9

Вот история о быстром и грязном программисте, которого я знаю.

Я знал человека, который считает, что юнит-тесты - пустая трата времени. После долгих споров он наконец написал один. Он состоял из одного длинного метода, посыпанного && и || и вернул логическое значение assertTrue. Заявление охватывает 20 строк. Затем он написал класс, в котором у каждого метода была одна строка, а у основного - более 1000 строк без пробелов. Это была стена текста. Когда я просмотрел его код и вставил несколько новых строк, он спросил «почему». Я сказал «Из-за читабельности». Он вздохнул и удалил их. Он положил комментарий сверху "Не трогай это, это работает!"

В прошлый раз, когда я разговаривал с ним, он написал сайт для компании. Он пытался найти ошибку. Последние 3 дня он проводил по 8 часов в день. Чуть позже я снова поговорил с ним, и оказалось, что его товарищ по команде изменил значение литерала и не обновлял его где-либо еще. Это не было константой. Поэтому он также изменил другие литералы, чтобы его ошибка была исправлена. Он жаловался на код спагетти своего напарника. Он сказал мне: «Ха-ха, разве мы все не знаем, каково это не спать всю ночь с отладчиком, не выспавшись над одной неприятной ошибкой?» Он думает, что это действительно хорошие программисты, и ему это действительно нравится.

Кроме того, он считает, что чтение книг и блогов по программированию бесполезно. Он говорит: «Просто начни программирование». Он сделал это в течение 12 лет, и он думает, что он отличный программист. / Facepalm


Вот еще немного.

В другой раз мы писали класс DatabaseManager для нашего веб-приложения. Он положил все вызовы базы данных в нем. Это был урок Бога с более чем 50 методами для всех мыслимых вещей. Я предложил разбить его на подклассы, потому что не каждый контроллер должен знать о каждом методе базы данных. Он не согласился, потому что «просто» было просто иметь один класс для всей базы данных, и «быстро» было добавлять новый метод всякий раз, когда он нам нужен. В конце концов, в DatabaseManager было более 100 открытых методов от аутентификации пользователя до сортировки мест расположения археологических раскопок.


1
+1. Почему-то я люблю читать эти истории. Они даже больше не делают меня грустным или злым.
Сэм Хоцевар

-1 за написание любого вида _______ класса менеджера.
Брайан Дрисколл

@SamHocevar Беги, не ходи, на thedailywtf.com
Mawg

7

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

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

Один разработчик дал убедительный ответ, когда я попросил его использовать библиотечный код: «Разве это не обман? Я должен был написать весь свой собственный код в школе».


1
Довольно этичный разработчик у вас там!
Стивен Гросс

6

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

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


6

Продукт поставляется.

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

Да, это в организационном вопросе и «никогда не должно случиться». Но если вам случается писать код в организации, которая плохо управляется и сильно зависит от сроков, на уровне отдельного программиста у вас ограниченные возможности.


5

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

Лично я бы не стремился развить навык «написания грязного кода» и быть уверенным в его правильности. Я предпочел бы написать правильный код в первый раз.


5

Откуда они знают, что поняли это правильно? Тестирование - это простой ответ.

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

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

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

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

Конечно, как показывает этот образ, никто не должен недооценивать опасность быстрого и грязного кода! введите описание изображения здесь


4

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


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

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

Побеждать других на рынке не является гарантией того, что публика примет ваш продукт. Если продукт содержит слишком много недостатков, вам лучше надеяться, что у вас есть дополнительные деньги, чтобы применить хороший маркетинг дыма и зеркала, и иметь блестящие и прощающие отношения с вашей клиентской базой. Это не / или позиция. Главное - сбалансировать риск и вознаграждение и своевременно выпустить продукт высочайшего качества, который вы можете предоставить. Ваши навыки будут оцениваться по качеству продукта, который вы выпускаете, и ущерб, который испорченное программное обеспечение может нанести вашему имиджу, может быть непоправимым.
С.Робинс

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

1
Уоррен, это в основном то, что я говорил. На мой взгляд, альтернативная стоимость возврата кода в обслуживаемое состояние растет экспоненциально, чем дольше вы его задерживаете. Если ваша компания находится в состоянии, когда она может пережить катастрофу, связанную с невозможностью обслуживания, потому что продажи прошли хорошо, а код не был слишком грязным, хорошо, но что, если нет?
Раку

4

На мой взгляд, научиться оценивать правильность кода Q & D не стоит развивать навык, потому что это просто плохая практика. Вот почему:

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

Изучение исходного отчета CHAOS ясно показывает, что Q & D не очень хорошая идея, и это приведет к сокращению бюджета позже (либо в процессе обслуживания, либо во время расширения). Научиться оценивать правильность кода Q & D - пустая трата времени. Как сказал Питер Друкер: «Нет ничего более бесполезного, чем эффективно делать то, чего не следует делать вообще».


3

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

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

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


3

Рискуя казаться немного спорным, я бы сказал, что никто по-настоящему НЕ ЗНАЕТ, что их код на 100% правильный и на 100% без ошибок. Даже если у вас действительно хороший охват тестированием и вы строго применяете хорошие практики BDD / TDD, вы все равно можете разработать код, содержащий ошибки, и да, который может даже содержать побочные эффекты!

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

Важным моментом является то, что хорошо продуманный и хорошо протестированный код позволит ДРУГИМ быть уверенными в вашем коде, что в большинстве случаев важнее, чем ваша собственная уверенность.


2

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


2

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

Так почему же существуют так называемые программисты Quick & Dirty? Моя гипотеза - дарвиновский отбор. Программисты, которые быстро отправляют работоспособный код, иногда отправляют до того, как отправят соревнования, или бюджет заканчивается, или компания обанкротилась. Поэтому их компании все еще работают, нанимая новых программистов, чтобы жаловаться на беспорядок, который необходимо устранить. Так называемый «чистый код» также поставляется, но не настолько дифференциально, чтобы привести к исчезновению кодеров Quick & Dirty.


Это правда. Я видел по крайней мере один продукт, который был в состоянии отправить из-за Quick & Dirty кода, бородавок и всего. Так получилось, что пара дней против месяца означала двухмесячный скачок на соревнованиях. Продукт стал успешным, и код Quick & Dirty был в конечном итоге заменен более качественным кодом. С тех пор, как я увидел, я стараюсь лучше смотреть на качество своего кода не только с инженерной точки зрения, но и с точки зрения бизнеса / конкуренции. Примечание: интерфейс упомянутого кода был в порядке, это была реализация, которая была схематична.
J Trana

0

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

1-) Проект становится больше, а мотивация команды снижается, работая над кодом, полным «стежков». В этом случае проект, скорее всего, переместится в сторону хаоса.

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

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


0

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

Мы также должны принять решение на основе времени + вместимости + приоритетов в списке. Хорошее обсуждение в команде с пожилыми людьми или людьми с более высоким опытом может помочь принять решение, которое наилучшим образом соответствует команде и ее результатам.

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


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