Всё настраиваемое лучше сразу выносить в конфиги. Пусть даже по началу это будет объект в том же файле.
Это и читаемость улучшит, и тестируемость повысит (о тестах дальше).
Используйте паттерны проектирования.
Есть замечательная подборка паттернов на том же Гитхабе, очень советую посмотреть: github.com/kamranahmedse/…
Как правило, большую часть наших задач уже решили за нас до нас 😃
Такие решения называются паттернами. Их польза не только в том, что решать задачи становится легче, но ещё и в том, что знакомый паттерн видно при чтении другим разработчикам.
Паттерны удобно использовать в связке с SOLID. Некоторые из принципов прямо подразумевают какой-то из паттернов.
Мы с twitter.com/dex_157 в нашей книжке о принципах SOLID добавляли разделы с паттернами под каждый принцип.
Писать код и рефакторить — это как «писать» и «редактировать статью», сложно делать одновременно.
Если кусок кода попался большой, стоит дать ему «отлежаться». Когда вы начнёте работать с ним на свежую голову, то будет гораздо проще начать думать о коде с точки зрения читателя.
А ещё (самое сложное для меня) надо купировать перфекционизм 😅
Отрефакторить до идеала сложно, а чаще всего не нужно.
Пользуемся правилом 20/80 — 20% усилий должны приносить 80% результата.
Он предлагает искать швы — места, в которых можно относительно безопасно «распилить» комбайн на части.
Покрыть швы тестами, а уже потом начинать рефакторинг.
Я пробовал, это и правда работает.
Как найти хороший шов?
Обычно шов — это место, где мы можем заменить одно поведение другим: месте соединения модулей.
В хорошо написанном коде такие места выделены явно, потому что модули слабо зацеплены.
Представьте, где именно вы бы разделили систему на несколько частей (по смыслу, по поведению, по зависимостям) — там и будет шов.
В книжке много техник, как работать с кодом, когда вы уже определились со швом.
Типа, как заменить зависимость:
- одну зависимость за раз;
- определить, какую зависимость хотим поменять;
- покрыть шов тестами;
- вынести текущий код в отдельный класс;
- заменить класс на другой.
Ещё офигенная и практичная книга — “Debug it!” («Отдебажь это!», простите за кустарный перевод): bespoyasov.ru/blog/debug-it/
Она вся состоит из рецептов, как работать с багами из-за непонятного кода.
Там даже содержание — это уже рецепт! 😃
Глава 1 — Исследовать обстановку
Глава 2 — Воспроизвести проблему
3 — Определить причину
4 — Исправить
5 — Как не допустить такой ошибки в будущем
...и т. д.
Внутри каждой главы есть списки действий под ситуацию. Короче, рекомендую.
От читаемости к тестированию! 🦸
Используйте TDD 🙂
TDD мне экономит кучу времени. К нему надо привыкнуть, потому что сперва приходится «вывернуть мозги», но он быстро окупается.
С ним:
- Исчезает проблема «дополнительной работы»
- Писать тесты и рефакторить входит в привычку
- Рефакторить безопаснее
- Видно сущности, делающие слишком много
- API проектируется до реализации, и-за чего становится удобнее
Там рассказываю об этом подробнее:
- как внедрить на проекте;
- как использовать;
- как сделать тесты проще.
Как упростить тесты при работе по TDD:
- Чаще использовать чистые функции
- Обращать внимание на зацепление кода
- Тестировать только свой код
- Использовать удобные инструменты
- Потратить время на удобную инфраструктуру
С TDD можно искать пахнущий код. Код пахнет, если:
- Тестов слишком много по сравнению с другими модулями
- Описание ссылается на несвязанные вещи
- Ожидание от теста оформлено невнятно
- Подготовка теста слишком сложная
- Тест проверяет детали реализации
- Тест всегда зелёный
Там же я рассказываю, как помочь увидеть пользу от TDD (и тестов вообще) руководству.
Коротко: говорим только об измеряемых параметрах, проводим исследования, сравниваем.
Я ещё когда-то написал книжку с примером разработки крестиков-ноликов: bespoyasov.ru/ttt-tdd/
Там показываю, как переходить по циклу TDD, в какой момент приступать к рефакторингу, на что обращать внимание.
TDD можно использовать и при работе с React тоже.
Недавно я проводил воркшоп об использовании TDD при разработке React-приложений: bespoyasov.ru/talks/?full#1
Он длинный, около 5 часов, но там я прохожусь по всем основным концепциям, а именно, как тестировать:
- ...Функций бизнес-логики.
- Функции, возвращающие случайные значения.
- Простые компоненты.
- Кастомные хуки, их связь с компонентами.
- Работу со стором.
- Асинхронные функции и вызовы API.
- Пользовательские действия: клик, клавиатура.
Так-с, пора работать!
Продолжим во время обеда 😃
Продолжим!
Чем же так хорош TDD для тестируемости и читаемости?
Он сразу поставит нас в ситуацию, когда сперва придётся думать о тестируемости. Писать код, который будет неудобно тестировать, по TDD — очень сложно 😃
Напомню стандартный цикл разработки по TDD. В нём 3 этапа:
- красная зона — на ней мы пишем тест, проверяем, что он падает по нужной причине;
- зелёная — пишем реализацию, которая тест проходит;
- синяя — рефакторим код и тесты.
Когда мы пишем сперва тест, мы автоматически следим за тем, чтобы вызывать функцию было удобно.
Под этим я подразумеваю и аргументы, которые в функцию надо передать, и зависимости, которые нужно создать перед тестом.
Чем больше приходится готовить зависимостей, тем выше вероятность, что модуль делает слишком много — а это нарушение SRP и запах кода.
Когда мы проверяем, с какой причиной падает тест, он становится таким, которому можно доверять.
(Если мы видим, что тест красный, когда ожидание не выполняется, и зелёный, когда выполняется — это доказательство работы правильной теста.)
Правильные тесты сразу же закрывают написанную функциональность.
Рефакторить код становится безопасно: если мы что-то по пути поломаем, мы узнаем об этом мгновенно по покрасневшим тестам.
А ещё TDD — это единственный способ безопасно (или даже вообще хоть как-то) отрефакторить легаси 😃
Кроме TDD тестируемость улучшит Dependency Injection.
Вместо того, чтобы мокать всё подряд, можно использовать DI, и подмешивать во время тестов нужные зависимости.
DI — это не обязательно контейнеры и всё такое страшное, можно использовать кустарный DI через объект с зависимостями в конце.
Запрос — функция, которая возвращает результат и не имеет сайд-эффектов.
Команда — функция, которая меняет состояние системы и ничего не возвращает.
На чтение такого кода уходит меньше сил, потому что ожидания при чтении оправдываются, и мы можем строить прогнозы относительно функций, с которыми работаем.
Ещё один приём рефакторинга, который улучшает читаемость — вынесение деталей в метод или функцию:
- bespoyasov.ru/blog/missing-a…
В ней нам стоит описывать не «как оно работает», а «почему оно работает именно так».
Ответ на вопрос «почему?» — это важный кусок контекста задачи, который может потеряться. Лучше его зафиксировать в документации.
А на вопрос «как оно работает», считаю, должны отвечать тесты 🙂
Подведём итоги за сегодня 🙂
- Хорошая читаемость снижает когнитивную нагрузку при чтении кода.
- Паттерны проектирования, эвристики и рефакторинг помогают улучшить читаемость.
- Тесты помогают рефакторить безопасно.
- Чтобы рефакторить легаси, удобно использовать швы.
- ...
- ...Грамотная архитектура улучшает тестируемость.
- TDD также улучшает тестируемость и помогает разбивать легаси на модули.
- DI — не обязательно контейнеры, можно проще.
- React тормозит на глубоких деревьях 😅
Завтра поговорим о том, как расти в разработке. Обсудим, что лучше:
- учиться в университете,
- окунуться в боевую разработку,
- найти ментора,
- читать книги,
- участвовать в опен-сорсе.
• • •
Missing some Tweet in this thread? You can try to
force a refresh
Если говорить о тестовых. Я против них, особенно до технического собеса. Ты тратишь свои силы, время, ресурсы и твоя работа может просто быть выброшена и не оценена. Собственно как было выше
Я предпочитаю лайв кодинг. Это хороший и рабочий способ провести собес.
За все время я написала одно тестовое и то в страхе, что меня просто никуда не возьмут. Это была первая работа.
Всем доброе утро!
Ночью решила, что хочу и этим с вами поделиться 🙌🏻 если по ходу чтения есть вопросы, смело задавайте, возможно я что-то полезное и интересное для вас опускаю
Сказ о том, как я имела три работы, а потом три работы имели меня 👇🏻
Если коротко: херовая идея конечно
Предыстория. Все детство пока девочки играли в куклы, я играла в школу и жить без этого не могла. Поэтому с первого курса бакалавриата я стала репетитором по математике. Вообще вышло это случайно и я не планировала во время учебы на мехе чем то заниматься, кроме учебы
Если говорить о специфике работы, то для себя я поняла, что с большей долей вероятности я не пойду делать бек. Я люблю UI, люблю верстать, люблю думать над клиентской логикой.
На первой работе у меня были достаточно сложные и глубокие вещи, просто так в которые не въедешь. Я тратила все ресурсы и силы, чтобы родить что-то годное.
Сейчас же я занимаюсь социальной частью сайта. Я делаю очень много клиентской логики и это мне доставляет.
Ну как и положено, начну я с рассказа почему я стала программистом
Ещё в 10 классе я поняла, что мне интересна математика и мой очень близкий друг/одноклассник/одногруппник/однопартник предложил пойти с ним в мат школу при мехмате. (Никита, если ты это читаешь, я держусь, чтобы не тегать тебя!)
Ну я короче прониклась в то, как мы решали примеры 1 курса и перестала себя видеть в чём-то другом, кроме программирования и математики.
Ну вот и я дорвалась в этот аккаунт на недельку! Будем знакомиться 🙂
Меня зовут Татьяна Гулякина, я – фронтенд разработчик вот тут @tradingview и почти магистр комп.наук вот тут @mmcs_sfedu. Мне 22 года и живу я в городе Ростове-на-Дону 🙋♀️
Правда какого-то конкретного плана на неделю у меня нет, есть только пара заметок на интересные темы, некоторые из которых подкинули мне мои друзья для обсуждения здесь