EverProduct
Фронтенд

Этап 05 · Ремесло

Собрать руки: как практиковать фронтенд

Двадцать статей позади: ты знаешь, что делает машина и почему. Это знание почти ничего не стоит, пока не переселилось в руки, — и вот статья про расстояние между тем и другим.

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

Откроешь пустую папку — и всё равно будешь медленным.

Это не провал и не что-то необычное. Читать про фронтенд и делать фронтенд — два разных навыка, и работой является только один. Эта последняя статья — о том, как пройти расстояние между ними намеренно, а не в надежде, что оно закроется само; само оно, без помощи, обычно не закрывается.

Читать про фронтенд и делать фронтенд — два разных навыка, и работой является только один.

Почему эта область производит иллюзию

Разрыв между знанием и умением есть в любом предмете. Во фронтенде его усугубляют две вещи.

Учебники ощущаются практикой. Ты смотришь видео, набираешь то, что набирают, в конце всё работает, и возникшее ощущение неотличимо от компетентности. Но следование за учителем — это узнавание: каждое решение принято прямо перед тем, как оно понадобилось. Сфера «Как учиться» называет это центральной иллюзией: самое гладкое обучение даёт самое слабое удержание, и гладкость — как раз предупреждающий знак. Потом ты открываешь пустой файл, и узнавать нечего.

Починка невзрачна и абсолютно надёжна: закрой учебник и собери то же самое с пустого файла. Не другой проект — тот же самый, с нуля, с закрытой вкладкой. Места, где ты застрянешь, — точный список того, чего ты не выучил, выданный бесплатно.

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

Долговечное против истекающего

Раздели то, что можно выучить, на две кучи: у них радикально разная отдача.

Долговечное — как браузер собирает страницу, семантика HTML, каскад и раскладка, язык и преобразование данных, DOM и события, асинхронность, HTTP и сеть, доступность, принципы производительности, отладка как метод, решение о том, где живёт состояние. Ничто из этого существенно не изменилось за десятилетие и не изменится к моменту, когда ты станешь сеньором.

Истекающее — API фреймворка этого года, конфигурация текущего сборщика, библиотека состояния, о которой все спорят, модный способ писать стили. Необходимо, чтобы делать работу сегодня. Существенно другое через пять лет.

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

Есть практическая проверка. Когда появляется новый фреймворк, человек с долговечным знанием читает его документацию и думает: «ага, вот как они решают производные значения и идентичность элементов списка» — неделя до продуктивности. Человек без него начинает с нуля снова, в четвёртый раз. Переносимой частью всегда были понятия.

Твоя опись чанков

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

Раскладка страницы с боковой панелью. Адаптивная сетка карточек. Форма с проверкой и всеми состояниями. Модалка, управляющая фокусом. Таблица с сортировкой, фильтрацией и пагинацией. Поле поиска с debounce. Список с добавлением, редактированием и удалением. Загрузка данных с состояниями загрузки, ошибки и пустоты. Аутентификация и защищённый маршрут. Загрузка файла с прогрессом. Бесконечная прокрутка или пагинация. Переключатель темы, уважающий системную настройку. Система всплывающих уведомлений.

Тринадцать штук. Опытный разработчик, получив «нужна таблица данных с фильтрами», не выводит решение из первых принципов — он достаёт блок, вспоминает три значимых решения и две ловушки и тратит внимание на то, что специфично для этого продукта.

Строятся они так же, как строятся все блоки: каждый собирается несколько раз, в разных контекстах, с проверкой результата. И две детали отделяют работающую практику от той, которая тебе льстит.

Перемешивай. Не собирай четыре сетки карточек подряд. Чередуй типы, и перед каждым сам называй подход, а не наследуй его из заголовка учебника: настоящая работа никогда не сообщает, какая техника нужна, и без этого именно выбор остаётся нетренированным.

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

Лестница

Проекты работают лучше всего, когда каждая ступень добавляет ровно одну новую трудность: так сложность держится у границы, а не сваливается в скуку или панику.

  1. Статическая страница по настоящему макету. Семантика, раскладка, адаптивность, доступность. Вообще без JavaScript.
  2. Один интерактивный компонент руками, без фреймворка. Список с фильтром, модалка, галерея.
  3. Небольшое приложение на фреймворке. Компоненты, состояние, форма. Данные пока локальные.
  4. То же самое против настоящего API. Загрузка, ошибки, пустые состояния, гонки.
  5. Аутентификация и маршрутизация. Защищённые страницы, сохранённые сессии, состояние в адресе.
  6. Что-то задеплоенное, чем пользуются другие люди. Хотя бы пятеро.

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

Осознанная практика, конкретно

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

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

И с половиной про обратную связь фронтенд оснащён необычайно хорошо. Браузер показывает результат мгновенно. Проверка типов и линтер возражают до сохранения. Консоль сообщает, что сломалось. Тест говорит, работает ли ещё. Каждое из этого — сжатие петли, и вот настоящая причина вкладываться в инструменты: это не театр профессионализма, а укорочение цикла практики.

Читай код, а не только пиши

Этого почти никто не делает, а это один из быстрейших способов вырасти.

Прочитай хороший открытый компонент, реализующий то, что ты собирал, — выпадашку, календарь. Найдёшь двенадцать случаев, о которых не подумал, а из них и состоит «опытный».

Прочитай собственный код трёхмесячной давности. Не чтобы починить — чтобы заметить, чего не можешь восстановить. Это честная обратная связь по твоим именам и структуре и тот же тест на удаление из статьи про CSS, обобщённый на всё.

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

Откуда берётся обратная связь

Практика без обратной связи просто закрепляет привычки. Четыре источника, примерно по возрастанию ценности:

Автоматические сигналы — типы, линтеры, тесты, аудиты. Мгновенно и дёшево, покрывают узкую полосу.

Сравнение с хорошей реализацией. Собери, потом прочитай чужое. Ограничено тем, что ты уже способен заметить, и всё равно полезно.

Ревью от человека. Проси конкретное — «разумный ли у этого компонента API?» — а не «что скажешь?», от которого не бывает ничего.

Настоящие пользователи. Жестоко, медленно и с большим отрывом ценнее всего.

Заметь, что все четыре требуют законченной работы. Вот практическая причина доводить до конца: незаконченный проект нельзя отревьюить, протестировать, задеплоить и использовать, а значит, он почти ничему не учит. Наполовину построенные амбициозные проекты — самый частый способ потратить учебное время без отдачи.

Как пользоваться ИИ, не выхолащивая себя

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

Сфера «Нейросети» разбирает это как следует; короткая версия для здесь. Сначала попытайся сам, всегда. Проси объяснить чаще, чем написать. Когда он выдал код, заставь объяснить каждое решение и не оставляй строку, которую не сможешь защитить. Пользуйся им как репетитором — «почему мой вариант неверен», «что означает эта ошибка», «дай задачу и не показывай ответ», — а не как доставкой готового. И периодически проверяй, что всё ещё можешь сам; медленнее — нормально, а «не смог бы» — это информация.

Как показывать работу

Портфолио фронтендера — не стена клонов. Три вещи лучше двенадцати:

Два-три настоящих проекта, задеплоенных, работающих, по адресу, который можно открыть. Что-то с реальными данными и реальной обработкой ошибок лучше пиксель-в-пиксель клона известного приложения: трудная часть — справляться с грязной реальностью, а клоны её намеренно пропускают.

Readme, объясняющий решения. Почему такая стратегия рендеринга, что бы ты изменил, в чём ошибся сначала. Этот абзац демонстрирует суждение, а нанимают именно суждение.

Код, который можно читать. Ясные имена, небольшие компоненты, понятная структура. Экраны умеет делать кто угодно.

Вся сфера одним списком

Двадцать статей в том порядке, в котором ими действительно пользуются:

  1. Знай, что браузер делает с твоими файлами и в каком порядке, и что всё дальнейшее от этого зависит.
  2. Выбирай элементы по смыслу, потом оформляй — и никогда наоборот.
  3. Жди, что решать будет каскад, и читай инспектор вместо добавления !important.
  4. Спрашивай «одна ось или две?» до любой раскладки и не задавай высоты.
  5. Собирай сначала узкое, бери точки перелома из своего содержимого и задавай размеры в относительных единицах.
  6. Считай форму самым рискованным экраном: настоящий form, настоящие подписи, верные типы, честные ошибки.
  7. Проверь второй интерфейс — клавиатура, фокус, имена, контраст — прежде чем считать готовым.
  8. Реши токены и изоляцию один раз, чтобы на шестой месяц стили ещё можно было удалять.
  9. Пиши на языке, а не на трюках: ===, семь ложных значений, ссылки против значений.
  10. Описывай преобразования конвейерами и не мутируй то, что держат другие.
  11. Знай, что под фреймворком: DOM, события, делегирование, уборка.
  12. Считай, что ничто не ждёт: проверяй response.ok, распараллеливай независимое, отменяй устаревшее.
  13. Отлаживай гипотезами, а не перезагрузками, и веди журнал багов в три строки.
  14. Понимай конвейер достаточно, чтобы назвать сломавшуюся стадию.
  15. Бери фреймворк ради бухгалтерии, а не ради вакансии.
  16. Разделяй по швам, композируй вместо конфигурации и относись к пропсам как к API.
  17. Храни минимум, остальное выводи, а то, чем можно делиться, клади в адрес.
  18. Знай, когда и где собирается твой HTML, и что клиент не проверяет права.
  19. Пусть типы несут то, что иначе пришлось бы помнить, и проверяй на границе.
  20. Измеряй до оптимизации и проверяй на настоящем дешёвом телефоне.

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

На практике

Пересобери на этой неделе один учебный проект с пустого файла. Вся статья в одном упражнении.

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

Ставь узкую цель на каждую сессию, записанную до начала и проверяемую в конце.

Трать две трети учебного времени на долговечную кучу. Фреймворки — по мере надобности, из документации.

Задеплой что-нибудь маленькое в этом месяце и приведи пятерых пользователей.

Перечитывай собственный код трёхмесячной давности раз в квартал и замечай, чего не можешь восстановить.

Продолжай доводить до конца. Маленькое и законченное побеждает большое и брошенное всегда.

Проверь себя

Закрой статью и ответь своими словами:

  1. Почему следование за учебником даёт уверенность без умения и в чём починка?
  2. Назови три долговечные темы и три истекающие и скажи, как бы ты разделил время.
  3. Назови пять повторяющихся чанков и то, как строить один намеренно.
  4. Что добавляет каждая ступень лестницы проектов и почему последняя важнее всех?
  5. В чём разница между плохой и хорошей учебной сессией?
  6. Почему любой источник настоящей обратной связи требует законченной работы?
  7. Каков честный способ пользоваться ИИ во время учёбы и какова самопроверка?

Коротко

  • Знать, как работает фронтенд, и уметь его делать — разные навыки; разрыв нормален, а его закрытие — намеренная работа.
  • Учебники дают узнавание, а не воспроизведение: закрой вкладку и собери тот же проект с пустого файла.
  • Раздели обучение на долговечное (браузер, язык, раскладка, сеть, доступность, отладка) и истекающее (фреймворк и инструменты этого года) и трать бо́льшую часть времени на первое.
  • Примерно тринадцать структур повторяются всегда; собирай каждую несколько раз, вперемешку и с разносом, каждый раз называя подход сам.
  • Иди по лестнице, где каждая ступень добавляет одну трудность, и дойди до ступени, где сделанным тобой пользуются живые люди.
  • Практикуйся с узкой целью на границе своих возможностей и используй инструменты, чтобы сжимать петлю обратной связи.
  • Читай хороший код, читай собственный старый код и прочитай наконец документацию, которую год пролистывал.
  • Вся настоящая обратная связь требует законченной работы, поэтому доводи до конца: маленькое и задеплоенное побеждает большое и брошенное.