Рассказываем, как мы с фронтенд-разработчиком Дмитрием Балаевым @manmo убираем Legacy, какими Open Source конфигурациями для ESLint пользуемся и как статический анализатор кода повлиял на развитие разработчиков нашей компании.

Что такое Legacy и откуда он берется

Legacy code — это тяжело поддерживаемый, некачественный или устаревший код, в котором невозможно разобраться (или можно, но очень долго). Часто под Legacy подразумевают код, которая команда получает в «наследство» от предыдущих разработчиков. Но не все так однозначно: код, который [хорошие] команды разработки передают заказчику, Legacy назвать нельзя, потому что в таком коде разобраться можно быстро и легко.

Основные причины Legacy:

  • Поддержка проекта с уже написанным кодом.

    В жизни любого разработчика наступает момент столкновения с «мамонтом». Мы работали над проектом, где код был написан еще в 2000 году. Тогда ни о каком ES6 нельзя было даже мечтать. За 20 лет на поддержке того проекта сменились сотни разработчиков. Каждый из них писал так, как ему удобно, используя свою методику и удобные технологии. Из-за подобных ситуаций не получается единый стиль написания кода, зато получаются костыли в JS-коде, неправильно используемые переменные в CSS и многое другое.  

  • Лень разбираться в чужом коде и делать рефакторинг.

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

  • Нет четкой схемы работы и должного контроля на проекте.

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

  • Нет Code review со стороны тимлидов.

    Четкие инструкции не отменяют человеческий фактор, поэтому даже в очень сильных командах нужны Code review. Нет Code review — есть Legacy и постоянные ковыряния в Pull Request’ах. Нужно помнить стилистику каждого проекта, а для разработчиков это тяжело. Code review должно решать эту проблему.

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

Как убрать Legacy

Есть ряд инструментов, которые помогут сделать рефакторинг и «подогнать» код под единые стандарты. В этой статье мы рассмотрим несколько статических анализаторов кода (далее SCA) – они анализируют программный код без ее реального выполнения. 

JSLint — это SCA с веб-интерфейсом для программ на языке JavaScript, проверяющий их соответствие стандартам оформления кода. Его разработал американский программист и предприниматель Дуглас Крокфорд (Douglas Crockford) в 2002 году. Дуглас занимается разработкой языка JavaScript. Он популяризировал формат данных JSON и разработал различные инструменты, связанные с JavaScript, такие как JSLint и JSMin. После установки анализатор сразу готов к работе. Недостатком является то, что JSLint не настраивается и не расширяется. Официальная документация очень слабая.

JSHint используется при разработке программного обеспечения для проверки соответствия исходного кода JavaScript правилам кодирования. JSHint был создан в 2011 году Антоном Ковалевым как форк проекта JSLint. В данный момент Антон работает инженером по безопасности в Medium. JSHint имеет хорошую документацию и простую интеграцию в редакторы. Из минусов — сложно определить, какие правила вызывают ошибки.

ESLint — инструмент для выявления проблемных шаблонов, обнаруженных в коде JavaScript. Он был создан Николасом Закасом (Nikolas, Zakas) в 2013 году. Николас участвовал в разработке Yahoo! User Interface (YUI) library, создал Cookie Utility, Profiler, YUI Test, три его книги о JavaScript переведены на русский язык. С помощью анализатора ESLint можно устанавливать правила поиска ошибок и легко их находить. Для него доступно множество плагинов, любое правило можно переключить, многие из них имеют дополнительные настройки. Результат получается предсказуемым, плюс ко всему у ESLint удобная поддержка ES6 и реактивных фреймворков.

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

Как настроить ESLint

При создании проектов на современных фреймворках анализатор уже может быть встроен при первоначальных настройках. К примеру, при инициализации нового проекта на Nuxt система предлагает установить ESLint:

Чтобы установить ESLint в уже существующий проект, нужно добавить его через npm “npm install eslint –save-dev” и создать файл настроек “.eslintrc”. Для мгновенной подсветки ошибок можно настроить редактор кода. Дополнительные плагины также устанавливаются через npm. 

В сети можно найти множество Open Source конфигураций для ESLint. Это обычные node.js пакеты с префиксом “eslint-config-”, которые содержат в себе только конфигурацию ESLint от конкретной компании/команды/разработчика. Например, можно легко использовать готовые конфигурации от Google или Airbnb.

Иногда может понадобиться отключить правила в конкретном месте или файле. Это можно сделать несколькими способами:

/* eslint-disable */
	console.log(‘test’);
/* eslint-enable */

или 

console.log(‘test’); // eslint-disable-line

также можно отключать конкретные правила:

/* eslint-disable no-console */
	console.log(‘test’);
/* eslint-enable no-console */

или

console.log(‘test’); // eslint-disable-line no-console
// eslint-disable-next-line no-console
console.log(‘test’);

Не все разработчики согласны с внедрением ESLint, так как привыкли писать код по-своему и не хотят перестраиваться. Бывали случаи, что некоторые разработчики просто забивали на правила, делали пулл с ошибками. В данном случае может помочь библиотека pre-commit, которая не позволяет сделать коммит, если есть ошибки. Но это может привести к тому, что кто-то отключит определенные настройки или сам ESLint. В таком случае поможет только должный контроль и Code review на проекте.

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

Что в итоге

Чтобы полностью избавиться от Legacy, нужно потратить немало времени на кропотливую ручную работу. Сам ESLint сделать этого не сможет, но вот помочь в этом и облегчить тяжелый труд – вполне.

Вот как на нашу компанию повлияло внедрение ESLint:

  • Экономим времени на поддержке проектов порядка 30%.

  • Быстрее и легче обучаем новых сотрудников/стажеров/джунов. Они сразу видят как писать более чистый код.

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

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

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

Комментарии (8)


  1. GreaterGlider
    15.02.2022 13:40

    • Быстрее и легче обучаем новых сотрудников/стажеров/джунов. Они сразу видят как писать более чистый код.

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

    • Экономим времени на поддержке проектов порядка 30%.

    Тоже не очень понятно, как Вам линтер позволяет экономить столько времени. И как вы это замеряли? Ну и по остальным пунктам из итогов тоже поясните пожалуйста


    1. Carduelis
      15.02.2022 14:05
      +1

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


      1. igor_yakovlev Автор
        16.02.2022 12:00

        Цифры мы округлили: наш разработчик на одном из проектов сэкономил 28,73% времени на Code review. К сожалению одинаковость кода имеет свой предел и хочется чтобы экономия продолжалась до 0 часов как тимлида так и разработчика ????


    1. igor_yakovlev Автор
      16.02.2022 12:00

      Мы трекаем все задачи, даже самые мелкие. У каждой задачи есть категория, и мы видим, как время из одной категории перетекает в другие. Например если раньше правки после Code review занимали на проекте 10 часов, то сейчас 7-8 часов.


  1. megahertz
    15.02.2022 16:16

    eslint это конечно хорошо, но это только самое начало пути. Как сдуть пыль с вещей в старом доме.


    1. igor_yakovlev Автор
      16.02.2022 12:01

      Если у вас есть рекомендации как провести «генеральную уборку» кода, присылайте свой или чужой опыт, с удовольствием изучим


  1. vvadzim
    15.02.2022 22:25

    Вот только стало интересно как побороть легаси правилами линта и конец. Обидно. Вот реально вчера гуглил как без вебпака запретить connect из redux-react. Не нагуглил.


    1. Ilusha
      16.02.2022 01:05
      +1

      А если запретить импорт ?

      no-restricted-imports

      Если я Вашу проблему правильно понял