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


63

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

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

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

Однако я оказался совершенно непродуктивным, несмотря на то, что работал над чем-то таким простым, как добавление журналов. По сути, мне просто нужно пройтись по коду шаг за шагом и добавить несколько вызовов трассировки. Однако идиотизм кода настолько раздражает, что я устаю через 10 минут после запуска . Вначале я использовал для добавления usingконструкций, уменьшения вложенности путем обращения ifк ним, переименования переменных в удобочитаемые имена, но проект большой, и в итоге я сдался. Я знаю, что это не та задача, которую я должен выполнять, но, по крайней мере, уменьшение беспорядка дало мне какое-то психологическое вознаграждение, чтобы я мог продолжать. Теперь трюк перестал работать, и у меня осталось 60% работы.

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

Это не просто одна большая напыщенная речь, потому что у меня действительно есть актуальный вопрос:

Есть ли способ оставаться продуктивным и не бороться с ветряными мельницами?

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


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

14
Я знаю, венгерский это не плохо. Именно поэтому я написал Systems Hungarian, а не Apps Hungarian (оригинал). Я не вижу смысла использовать Systems Hungarian в C #, потому что у него отличная система типов и IDE. Наличие 10 переменных в одной и той же области видимости, с которой все начинаются, objустрашает, потому что в принципе это нечитаемо.
Дан

2
Хотел бы я дать за этот вопрос более одного голоса!
o6tech


9
Я сдуваю пар, задавая сварливые вопросы в стеке, которые меня понижают.
Эрик Реппен

Ответы:


32

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

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

Вы в основном создаете свою собственную сеть безопасности здесь. Гламур нет, но важно да!

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

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

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


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

1
@gaearon - я рад, что предложения полезны для вас. Пройдя сквозную работу с хорошим уровнем мотивации, в итоге все окупится. В прошлом году на моей нынешней работе я должен был сделать нечто похожее на то, что вы делаете. В этом году мне дали совершенно новое приложение, чтобы писать с нуля. Люди заметят, что вы делаете и насколько хорошо вы работаете.
Тианна

3
-1 Зачем связывать свою трудовую жизнь и личную жизнь? Это похоже на постоянное пребывание сверхурочноI didn't finish my under-estimated task by Friday - so I need to stay at home and feel bad.
Vorac

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

1
@IntegrityFirst ~ Для меня да. Я опоздаю, чтобы закончить мой список задач. Я буду планировать свое время, чтобы убедиться, что я ударил его. Это моя честность перед собой и перед моими коллегами - что-то завершить, когда я скажу, что я это сделаю. Но если я обнаружу, что что-то не может быть сделано в то время, как я сказал, я изменю план и сообщу своему начальнику. И если я закончу немного поздно, фильм / ресторан будет там на следующей неделе. :)
Тианна

30

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


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

24

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

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

Я бы искал похожие метрики, которые вы могли бы легко написать, чтобы дать себе ощущение прогресса и превратить его в своего рода игру. Строки кода (только что запущенный wc -l), цикломатическая сложность (которая должна уменьшаться при очистке этих мерзких вложенных «если»), строки кода, которые были затронуты вами вместо вашего предшественника (я думаю, что FishEye может сказать вам это за $ 10) и т. Д. Вы можете даже написать скрипт на Perl без особых проблем, чтобы подсчитать количество блоков кода, в которых еще нет операторов логирования.


Я использую
SourceMonitor

13

Я видел эту книгу, рекомендованную: эффективно работать с устаревшим кодом , но, к счастью, не было необходимости ее читать.

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


2
Эта книга о рефакторинге существующего кода, чтобы сделать его тестируемым; Я не думаю, что это сильно поможет в мотивации.
Билли ОНил

2
Хороший вопрос @Billy ONeal, но наличие тестируемого кода и связанных метрик может показать прогресс, который может быть мотивирующим.
StuperUser

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

1
Эта книга довольно старая и устаревшая. Если вы не читали, почему вы рекомендуете?
BЈовић

1
@StuperUser Насколько я понимаю, я могу сказать, что он устарел и может дать несколько полезных советов для начинающих пользователей.
BЈовић

6

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

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


Да, я работаю частями, и уже некоторое время работаю над этим, поэтому у меня есть приблизительное представление о каждом компоненте. Тем не менее, это не очень помогает, потому что это крошечные кусочки логики, которые обычно требуют времени, чтобы понять - и я злюсь, когда понимаю, что 30-строчный метод, на который я потратил 10 минут, на самом деле может быть переписан в 2 строки. Что касается компании, то, к сожалению, я единственный разработчик этого проекта, и в настоящее время я работаю в офисе клиента, поэтому я не могу ни с кем пообщаться.
Дан

@gaearon - Что мешает вам реализовать 2-х линейное решение? Вам нужно выяснить, как делать то, что вам было поручено, проблему с кодом можно решить позже, когда вы не в офисе клиента. Вы должны хранить свои записи о том, что вы сделали, как что-то работает, чтобы вы могли вернуться позже в будущем и внедрить свои изменения, чтобы можно было выполнять обзор кода и интеграционное тестирование.
Ramhound

@gaearon ах-ха! Ты единственный кодер. Так что парень до тебя был единственным кодером. Вы можете сойти с рук, когда вы единственный кодер (как вы заметили от своего предшественника). Имейте это в виду, когда вы ищете свою следующую работу. ;)
Давидхаскинс

@ Ramhound Я держу пари, что не будет никаких обзоров кода. Могу поспорить, что не будет никакого официального тестирования интеграции. Я работал на этих должностях несколько раз. Обычно людям нужен только код, который работает достаточно хорошо, и они хотят его как можно быстрее. Объяснять «лучшие практики» - все равно что разговаривать со стеной, ИМХО.
Дэвидхаскинс

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

6

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

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

Это в основном удобный способ иметь постоянный разговор с экспертом в области :)


3

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


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

1
«он не добавляет производительности при работе на холостом коде» Suuure это делает. Вы проходите большие части кода, работая над вашим пониманием, выполняя задачу с низким уровнем риска (ведение журнала). Это знание, которое вы получаете, очень поможет, если дело доходит до переписывания. Если нет необходимости переписывать, попытайтесь рассчитывать на вознаграждение, которое вы почувствуете, когда очистите большие объемы приложения, насколько лучше будет база кода благодаря вашим последовательным и настойчивым усилиям.
Квентин-старин

2

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


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

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

2

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


0

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

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


0

«Эффективная работа с устаревшим кодом» Майкла Фезерса может помочь.

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


К сожалению, это проект SharePoint, что означает, что он практически не тестируется. В прошлом я написал несколько классных «песочниц» для SharePoint, используя Microsoft Moles, но это требует много дополнительной работы.
Дан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.