Два коммита. В 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 — и закрываю ноутбук с двумя закрытыми вехами и чек-листом на утро.
Не думайте, что это про мою скорость. Это про то, что изменилось в инструментах.
Что из этого выйдет, я не знаю.
Не выйдет — будет ещё один мёртвый репозиторий на аккаунте. У всех такие есть.
Выйдет — посмотрим, куда это дует, чему я научусь и что в итоге смогу сделать.
💬 Вопрос
Когда вы в последний раз открывали среду разработки под язык, на котором не пишете?
У меня ответ — сегодня. И выяснилось, что читать достаточно.
А что остановило вас в прошлый раз — язык или мысль, что это займёт месяц 👇
Дальше надо будет посмотреть на это при свете дня.
Подозреваю, что мне не понравится 😉