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

Две спецификации и ни строчки кода

Я написал два документа.

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

Кода по-прежнему ноль.

Первый документ читает машина. Второй — незнакомец. И это, как выяснилось, две разные профессии.

🧾 Шесть тысяч строк для приложения на одного

Тринадцать файлов, один коммит.

Бизнес-требования. Технические требования. Разбор того, что умеет прототип. План вех. Шесть файлов задач — от нулевой вехи до пятой. И файл с правилами проекта.

Ни строчки Swift. Ни одного открытого Xcode.

Если строишь дом, сначала думаешь про фундамент.
Потом появляется план.
И только потом кто-то берёт в руки инструмент.

С разработкой так же, если делать её хорошо. Но по порядку.

У меня уже было два ответа и не было третьего.

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

Страница ответила: читается ли идея. Кажется, да.

Ни то, ни другое не отвечает на вопрос, что именно я строю.

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

🤖 Спецификация, которую читает не человек

Теперь неочевидное.

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

Только нативные фреймворки Apple.

Никаких внешних зависимостей.

Тринадцать файлов, шесть тысяч сто восемьдесят восемь строк. Кода среди них нет.
Тринадцать файлов, шесть тысяч сто восемьдесят восемь строк. Кода среди них нет.

Это написано не затем, чтобы кто-то понял, как устроено приложение. Это написано, чтобы по нему работали. И в том же коммите лежит файл с правилами для ассистента.

Отсюда вывод, который переворачивает привычную логику.

Одиночке с ассистентом нужно больше документации, чем одиночке без него. Не меньше.

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

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

🗣 Как это на самом деле писалось

Шесть тысяч строк я не печатал.

Я говорил. Потоком, сумбурно, широкими мазками — надо было выговориться, чтобы появилось из чего делать требования. Без структуры и без попыток сформулировать красиво.

Потом приходил фидбек. Наводящие вопросы. И шаг за шагом складывалось сначала «для чего», и только после него — «как».

Здесь работает правило, обратное привычному: лучше сказать больше, чем меньше.

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

И то, что получилось, должно быть понятно двоим: мне, который это придумывал, и мне, который завтра по этому работает.

🧊 Что заморожено

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

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

Приватность принадлежит доске, а не сниппету. Разница кажется технической, но она про то, сколько раз человек принимает решение. Если защита у сниппета — решаешь каждый раз. Если у доски — решил один раз и дальше просто кладёшь вещь туда, куда она относится. Та же мысль, что и холст: пространство вместо свойств.

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

Mac первый. iPad и iPhone — во второй версии. На странице написано «скоро для Mac, iPhone и iPad», и это правда: страница говорит, куда мы идём. А спецификация выбирает, в каком порядке.

И там же, отдельной строкой: двадцать четыре сниппета бесплатно.

Записано. Заморожено.

🔀 Вторая спецификация

А потом я открыл собственную страницу и не понял её за десять секунд.

Ту самую проверку, которую сам же и придумал.

Это единственное, что лендинг умеет делать честно: он ждёт, пока вы забудете, что писали его сами.

Дальше было пять заходов подряд, с восьми тринадцати до восьми сорока двух. Утренний поезд.

Обновил страницу.
Поставил аналитику.
Поменял оформление.
Переставил разделы.
Переставил разделы ещё раз.

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

(Аналитику, кстати, я поставил на страницу, о которой знают ноль человек. Поставить и не смотреть можно всегда. Не поставить и потом захотеть посмотреть — уже нет.)

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

Последний коммит за сегодня называется буквально: порядок разделов (почему я это строю).

И вот тут дошло.

Порядок блоков — не оформление. Порядок блоков и есть аргумент.

Страница, которая начинается с функций, говорит: вот что оно умеет.
Страница, которая начинается с человека, говорит: вот почему этому можно верить.

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

Есть человек, который объясняет, зачем он это делает.

Больше пока ничего — и оказалось, что это единственное, что имеет смысл поставить первым.

Верх страницы после пятой попытки за утро.
Верх страницы после пятой попытки за утро.

🔌 Engineer honesty moment

Начну с самого свежего, ему десять минут.

Этот дневник я сначала назвал частями. Часть первая, часть вторая — как сборник статей. А это не сборник. Это дневник, и записи в нём должны называться днями. Переименовал.

Но адрес записи генерируется один раз, при публикации, и в нём навсегда осталось part-1.

Черновое название утекло в урл. Ничего, бывает.

Теперь по делу.

В .gitignore этого проекта одна строка.

.idea/

Папка JetBrains. Она не имеет ни малейшего отношения к нативному приложению для Mac. Она там потому, что пальцы помнят десять лет фронтенда, и первое, что я делаю в новом репозитории, — игнорирую IDE, которой в этом проекте нет.

А .DS_Store в список никто не внёс.

Поэтому в том же коммите, ровно рядом с шестью тысячами строк инженерной строгости, лежит служебный файл, который macOS кладёт в папку просто потому, что вы на неё посмотрели. Шесть килобайт. Он до сих пор там.

Я написал документ о том, каким шаблонам следовать запрещено, и закоммитил мусор из Finder.

Ну и вдогонку: всё это время я переставлял блоки и не тронул ни одного слова внутри них. А слова там, напомню, написала машина.

Полчаса я выстраивал порядок аргументов в тексте, которого ещё нет.

И это было правильно. Порядок работает раньше слов.

💬 Вопрос

Сколько вы записываете, прежде чем начать?

Я честно думал, что ответ «нисколько» — и что это признак опытного человека, который держит всё в голове.

Оказалось, я просто никогда не работал в паре с тем, кто умеет читать.

Расскажите, как у вас 👇

Дальше, наверное, пора всё-таки открыть Xcode.

Тот самый, ни разу не открытый, и ни строчки на Swift за мной. Территория рядом с моей — и не моя.

Но когда меня такое останавливало 😉