Как удаление кода и начало с нуля помогли мне написать лучший код

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

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

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

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

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

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

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

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

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

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

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

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

Примечания к публикации:

Эта статья изначально была опубликована 10 декабря 2018 г.