Я написал два документа.
Первый — шесть тысяч сто восемьдесят восемь строк. Второй — полстраницы текста, переставленного пять раз за полчаса.
Кода по-прежнему ноль.
Первый документ читает машина. Второй — незнакомец. И это, как выяснилось, две разные профессии.
🧾 Шесть тысяч строк для приложения на одного
Тринадцать файлов, один коммит.
Бизнес-требования. Технические требования. Разбор того, что умеет прототип. План вех. Шесть файлов задач — от нулевой вехи до пятой. И файл с правилами проекта.
Ни строчки 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 за мной. Территория рядом с моей — и не моя.
Но когда меня такое останавливало 😉