Дневник разработки · День 3

Пятнадцать тысяч строк в половине второго ночи

Два коммита. В 01:38 и в 01:39.

Между ними минута, в сумме — пятнадцать тысяч шестьсот четырнадцать строк.

Xcode открыт. Наконец-то.

🌙 Почему за весь день один заход

Два часа до офиса. Два обратно. И вечер.

В историю попали те самые две строчки, обе после половины второго ночи.

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

Коммитить такое — флуд.

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

Поэтому первый коммит за день — в 01:38. Гамузом.

Завтра разберусь.

🧰 По мою сторону ноутбука

Позднее время в истории коммитов читается как героизм. Это не оно.

Ночь — это то, что осталось.

А четыре часа дороги и весь вечер ушли на инструменты.

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

Но приложение у нас для Mac. А для Mac — Xcode.

Ну всё, думаю. Теперь я настоящий разработчик под Apple.

По ощущениям это переезд с Windows на macOS.

Многое работает иначе, и дело даже не в том, что ты не понимаешь — ты просто не знаешь, где у этого ручка. Слепой котёнок, который ищет, как оно вообще должно заработать.

Ладно. Не рокет сайнс.

Проблема оказалась в другом.

Я попробовал прикрутить туда агента.

Он не прикрутился.

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

Так или иначе, попытка взять крепость нахрапом кончилась... ну, скажем так, ничем. Магии не случилось.

Вывод неприятный и короткий: инструментарий надо знать. Даже если ты пятнадцать лет в индустрии.

Скорее — особенно если пятнадцать.

Я выдохнул и запустил обратно WebStorm. С Клодом сбоку, виджетом.

Стало понятнее.
Легче не стало.

Мой M1 такую компанию не вывозит.

И вот тут я поймал себя на вопросе, которого раньше не задавал.

А он мне сейчас вообще нужен?

Локальная история, тяжёлые рефакторинги, вся артиллерия JetBrains — это инструменты человека, который пишет код руками. Я руками не пишу. Я читаю, правлю и решаю, каким он должен быть.

Может, пора дать шанс VSCode.

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

Поэтому он всегда стоял где-то на фоне. Я подходил к нему пару раз и не подружился.

Но сегодня у меня к редактору другой запрос, и он короткий:

  • лёгкий
  • свежие модели
  • ничего сверху, только то, чему я доверяю

И под такой запрос он внезапно оказался не компромиссом, а ответом.

Лучше привычного Шторма. Вот этого я не ожидал.

Итог вечера выглядит так.

Xcode — смотреть код.
VSCode — работать.

Не тот расклад, за который я садился. Но рабочий.

И только после этого начинается то, что видно в истории коммитов.

🏗️ Что именно случилось

Помните шесть тысяч строк из прошлой части? Шесть файлов задач, от нулевой вехи до пятой?

Сегодня закрыты нулевая и первая.

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

То есть прототип. Но нативный, и на моей машине.

Девять тысяч строк в первом коммите.

А через минуту — второй, и он важнее, чем выглядит.

📋 Обещание, которое оказалось двумя строками

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

Звучит как функция. В коде это выглядит так:

pasteboard.clearContents()
pasteboard.setString(text, forType: .string)

Очистить. Положить строку. Всё.

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

Главное свойство продукта оказалось отказом, а не возможностью.

Подозреваю, дальше это будет повторяться.

📎 Коммит, который называется «Add instructions»

Шесть с половиной тысяч строк, и ни одной из них я не писал этой ночью.

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

Скопировал. Не перенёс.

И я понимаю, как это выглядит. За дублирование бьют по рукам, и правильно делают.

Но оно покупает вещь, которой у меня до этого не было: предсказуемый адрес.

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

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

Документация — это больше не полка. Это контекст, и у контекста есть адрес.

Адрес, правда, вышел не один.

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

Идея «всё важное в одном предсказуемом месте» за одну минуту стала тремя предсказуемыми местами.

🔌 Engineer honesty moment

Теперь откройте папку с исходниками.

jpasteModelsBlock.swift
jpasteModelsTab.swift
jpasteViewsCanvasBlockView.swift
jpasteTestsBlockViewModelTests.swift

Видите, что произошло?

Там должно было быть Models/Block.swift. Views/Canvas/BlockView.swift. Папки, дерево, структура — как в любом проекте.

Вместо этого путь стал частью имени. Директории не создались, и всё легло в одну папку, слиплось именами.

Двадцать два файла Swift. Ни одной директории.

И отдельно прекрасное: файлы тестов лежат внутри приложения. Не в тестовой цели, а прямо там же, рядом с моделями.

Пятнадцать тысяч строк — и папка, которая выглядит так, будто в неё чихнули.

И вишенка. PasteboardService.swift — тот самый, с двумя строчками, ради которых всё и затевалось, — лежит в папке тестов. А его тесты лежат в приложении.

Они поменялись местами.

В прошлый раз я хвастался документом о том, каким шаблонам следовать запрещено, и коммитил рядом мусор из Finder. В этот раз масштаб вырос: теперь не на своём месте всё.

И вот что отдельно хорошо. Вечер я потратил на то, каким инструментом работать. А в структуру папок не посмотрел ни в одном из них.

А, и ещё. Заголовок первого коммита этой ночи — «Start iOs development».

Это приложение для Mac.

Ну что ж. Десять лет фронтенда никуда не деваются: Apple — значит iOS.

Пусть пока так и лежит.

🕳️ Мы копаем котлован

Языков я знаю несколько. JS каждый день, Go и Java по делу, C++ в прошлой жизни.

Swift — отдельная вселенная. Другие правила игры, другие best practices, другие привычки у тех, кто в ней живёт.

Читается.

Не пишется.

И тут честно: я не то чтобы развлекался чтением кода. Я в какой-то момент поймал себя на другом ощущении — проджект-менеджер. Или оунер собственного стартапа.

Продуктовое понимание и технический бэкграунд пригодятся, когда начнётся полировка. Сегодня день не про это.

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

(Со структурой, как вы уже видели, вышло иначе.)

В прошлый раз я начал с того, что сначала думают про фундамент, потом появляется план, и только потом кто-то берёт в руки инструмент.

Так вот. Мы пока не строим. И уж точно не застекляем.

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

Мастер по копанию котлованов тут не я. Я пойму, если мы полезли не туда, — но моя функция другая.

И, если честно, для такого расклада сейчас лучшее время за всю мою карьеру.

Раньше на этом месте надо было нанимать людей. Команду, спецов — и они тоже могли чего-то не знать.

Сейчас на этом месте всезнайка, которая иногда идёт не туда.

(Люди, разумеется, так никогда не делают.)

🎯 Что теперь существует

Впервые за эту историю есть не аргумент, а вещь.

Двадцать два файла Swift. Модели, вьюмодели, вьюхи, сервис буфера обмена и девятнадцать тестов.

И лог на триста сорок три строки, в котором эта ночь описана сама.

✅ M0 COMPLETED
✅ M1 COMPLETED

Session duration: ~3-4 hours
Files created: 22
Tests written: 19
Lines of code: ~1500+

Status: READY FOR REVIEW AND TESTING

Полторы тысячи строк, говорит лог. В коммите девять тысяч.

Но не это в нём главное. Главное — в самом конце, отдельным разделом:

TESTING CHECKLIST FOR MORNING

Build & Run:
1. Open Xcode project
2. Cmd+B - should compile with ZERO errors/warnings
3. Cmd+U - run all tests (should pass 19 tests total)
4. Cmd+R - launch app

И последняя строка файла:

Good morning and good luck! 🚀

Так закончилась эта ночь. Проверять — утром.
Так закончилась эта ночь. Проверять — утром.

Три-четыре часа. Первый раз в жизни всерьёз открыл Xcode — и закрываю ноутбук с двумя закрытыми вехами и чек-листом на утро.

Не думайте, что это про мою скорость. Это про то, что изменилось в инструментах.

Что из этого выйдет, я не знаю.

Не выйдет — будет ещё один мёртвый репозиторий на аккаунте. У всех такие есть.

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

💬 Вопрос

Когда вы в последний раз открывали среду разработки под язык, на котором не пишете?

У меня ответ — сегодня. И выяснилось, что читать достаточно.

А что остановило вас в прошлый раз — язык или мысль, что это займёт месяц 👇

Дальше надо будет посмотреть на это при свете дня.

Подозреваю, что мне не понравится 😉