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


22

Как программисты, мы часто гордимся нашими навыками и придерживаемся очень сильных мнений о том, что такое «хороший» код и «плохой» код.

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

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


2
вау ... этот вопрос действительно актуален для меня прямо сейчас.
WalterJ89

1
Если это не сломано, не исправляйте это. :-)
Ричард

Вещи, которые вы никогда не должны делать, и Big Ball Of Mud должны быть обязательными к прочтению на эту тему для всех программистов.
Ян Худек

возможный дубликат работы над чужим кодом
комнат

Ответы:


31

Для любой унаследованной кодовой базы правильный способ подготовить себя мысленно к работе с ней - начать с написания для нее модульных тестов .

Будь это отстой или нет, сначала нужно иметь уверенность, чтобы иметь возможность изменить его, не ломая вещи!


6
+1. Другие программы часто зависят от ошибок в существующем коде, не говоря уже о странных способах их выполнения. Прежде, чем вы начнете копаться с этим, поймите это!
Алекс Фейнман

У меня была эта проблема однажды. Я исправил ошибку в наших внутренних библиотеках, но оказалось, что от этого некорректного поведения зависит много важного кода. Хлоп.
Джонатан Стерлинг

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

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

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

30

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


3
Случалось со мной несколько раз. Иногда лучше просто оставить это в покое
TheLQ

4
И если вы узнаете, будьте добры к следующему парню и напишите комментарий!
Фрэнк Шеарар

11

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

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

И наконец, поймите, что именно поэтому у вас есть работа.


4
Бывает все время для меня. Я постоянно оглядываюсь на старый код и думаю про себя: «Кто написал это дерьмо? О да… я сделал». Я думаю, это показывает, что вы становитесь программистом, если вы можете признать, что некоторый код, который вы написали в прошлом, плох. Если вы оглянетесь назад и скажете: «Да, выглядит хорошо для меня», либо это чертовски хороший код, либо вы не прогрессируете. : P
Jasarien

7

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

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


7

Выберите свои сражения. Знайте разницу между «я бы так не писал» и «это создает серьезную проблему поддержки или поддержки»


Я украду этот ответ. :-)
съеживаться

4

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

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

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

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

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


3

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

Это война.


3

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

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


3

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


Ах, старый вопрос ПОЧЕМУ ...

1

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

Что я пытаюсь добавить к этому коду / исправить / сделать работу?

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

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


1

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

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


1

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


0

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

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

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


0

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

Вот некоторые маркеры действительно плохого кода:

  • Большие блоки логики были дублированы вместо рефакторинга.
  • Круговые зависимости между классами или пакетами
  • Высокая связь; низкая когезия
  • Неиспользуемые переменные, запись в переменные, которые никогда не читаются, недоступный код.
  • Повторная реализация стандартных библиотечных функций, например форматирование даты.
  • Излишне сложная логика; то есть 50 строк кода, где 10 будет хорошо.
  • Нет комментариев, описывающих назначение классов или методов.
  • Вводящие в заблуждение комментарии.

Отсутствие автоматизированных тестов не означает, что код плохой, но означает, что проект плохой.

Это не вопрос вкуса; эти методы делают обслуживание программы намного дороже.

Как ты готовишься?

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

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