Обслуживание кода

Поддерживать чистый код так же важно, как и писать его.

Последние несколько месяцев я занимался переписыванием кодовой базы популярного программного пакета Node.js, и это заняло у меня столько времени по двум причинам:

  1. Я все еще очень новичок в кодировании, и
  2. Кодовая база - это гребаный беспорядок.

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

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

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

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

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

В любом случае, изучив и проработав большую часть кода, я смог не только понять, как работает около 80% кода, но и полностью переделать эти 80%. И не только его легче читать, понимать и использовать, он становится настоящей библиотекой: объекты можно извлекать и использовать напрямую, если есть аспекты программы, которые никто не сочтет полезными. Конечно, все это предназначено для полной интеграции, но иногда вам просто нужно подмножество инструментов, и это быстро становится доступным.

Как только я начал понимать первоначальный дизайн, я приступил к преобразованию кодовой базы из наследования псевдоклассов — в JavaScript нет классов — в прямое делегирование объектов, в чем JS преуспевает. Кроме того, я создаю веб-приложение, в котором используются модули ES6, поэтому я расширил преобразование на эту область. И в довершение ко всему, утомив себя рисованием чертовых карт для отслеживания обратных вызовов, я узнал все о промисах и преобразовал кодовую базу в нее.

Потому что, честно говоря, к черту обратные вызовы. По крайней мере, что касается этой кодовой базы. Но я отвлекся.

Теперь все это было сложно во многих отношениях, но результаты феноменальны. Не бывает дня, чтобы я открыл эту кодовую базу и не спросил: «Кто, черт возьми, это туда положил? И почему?" Но становится лучше. Делегирование объектов JS, модули ES6 и промисы делают код супер-пупер чистым. Я не только смог существенно сократить код, но теперь я могу начать включать модули, которые нужно было импортировать отдельно. Что мне понравилось в этом преобразовании, так это распознавание всего лишнего кода, который можно удалить. К тому моменту, к которому я пришел, кодовая база значительно меньше, с гораздо меньшим количеством строк кода, включая огромное количество документации, которую я добавил к ней.

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

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