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

Mac почти готов — и я беру в первый релиз iPad и iPhone

Вчера я закончил на нехорошем подозрении: пятьдесят девять файлов за один заход не проходят бесследно.

Не прошли. Но сегодня это не главное, так что коротко.

🌙 Ночная проверка

Ночью вчерашнюю правку прочитали три ревьюера. Все трое — ИИ, и ни один её не писал. Задача у каждого была одна: найти, что сломалось.

Нашли одиннадцать дефектов. Два — старые, просто никто раньше не смотрел в ту сторону. А девять внесла сама вчерашняя чистка.

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

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

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

К утру всё починено. Сто три теста зелёные, сборка без единого предупреждения.

🖥 Почти готово

А теперь о главном.

Я смотрю на jpaste для Mac — и вижу уже не стройку. Вижу приложение, которое почти готово.

Оно стоит сбоку от окна, куда я вставляю текст, и не отбирает у него фокус. Клик по сниппету — он в буфере, а я так и не ушёл из своего письма.

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

За этими четырьмя кружками — своя маленькая история.

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

Прототип. Три полоски в одном углу, уголок для размера в другом и EDIT под карточкой.
Прототип. Три полоски в одном углу, уголок для размера в другом и EDIT под карточкой.

А удаление пряталось внутри редактирования.

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

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

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

Это и есть «почти готово». Уже не строишь, а подкручиваешь.

Мышь над нижней карточкой — четыре кнопки по углам. Над верхней мыши нет — только текст.
Мышь над нижней карточкой — четыре кнопки по углам. Над верхней мыши нет — только текст.

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

Мне нравится, как это выглядит. Ничего лишнего, пока оно не нужно.

Но заметьте: почти всё здесь держится на мыши. Через пару разделов это пригодится.

Сегодня ИИ написал мне следующий план. И начал его фразой: «Приложение для macOS готово».

Я бы сказал «почти». Но спорить не стал. Потому что следующий план — уже не про Mac.

📺 Экран напротив офиса

Напротив моего офиса — арена, а на ней огромный экран. И всю неделю буквально каждая вторая реклама на нём — новый iPhone Duo.

По дороге в офис. До начала продаж — пара недель.
По дороге в офис. До начала продаж — пара недель.

До начала продаж ещё пара недель, а он уже везде. И, кажется, уже сейчас забрал внимание у нового iPhone Pro.

Последние три-четыре года купить Pro в числе первых было непростой задачей. Каждый год было за чем гоняться: то Dynamic Island, то титановый корпус, то новый дизайн в семнадцатом. Ждать приходилось неделями, а порой и месяцами.

В этом году я специально проверил. Дошёл до ближайшего Apple Store — и могу купить новый Pro хоть сегодня. В любом цвете и почти любого объёма.

Похоже, покупатели решили брать новый телефон, а не новую итерацию старой линейки. И это вполне логично.

Нет, я его не покупаю. Цена у него невменяемая. А когда у тебя свежий iPhone и iPad, смысла в таком устройстве немного.

Но я смотрю на этот экран и думаю о другом.

jpaste идеально ложится на iPad. А это, по сути, iPad, который складывается в карман. Значит, jpaste ложится и на самое шумное устройство в инфополе.

И тут главный вопрос: сколько это будет стоить?

🧮 Сто и ещё шестьдесят

На этот вопрос я сегодня получил ответ на двадцать восемь файлов.

План переноса на iPad и iPhone. Четыре фазы, двадцать задач, девять вопросов, которые может решить только владелец. И ни одной строчки кода.

План переноса. Двадцать восемь файлов, 4 756 строк — и ни одного с кодом.
План переноса. Двадцать восемь файлов, 4 756 строк — и ни одного с кодом.

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

Это выглядит приемлемым.

Фазы такие. Сначала сделать код переносимым — так, чтобы на Mac не изменилось ничего. Потом iPad. Потом iPhone. И последняя — устойчивость к экранам, которых никто ещё не видел.

На последней я задержался.

Модель, которая писала план, честно пишет в нём: складной iPhone давно ходит в слухах и не подтверждён. Её знания заканчиваются раньше, чем его показали. Того, что висит у меня напротив офиса, она не знает.

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

Приложение, которое не знает, какой у него экран, нельзя застать врасплох новым экраном.

Мне это нравится больше, чем любая точная догадка.

💰 Один ценник

Первый из девяти вопросов — одно приложение или два.

Два — это отдельная страница в магазине и отдельная покупка для iPad и iPhone. Одно — одна страница, одна цена, одна покупка на всех устройствах.

Раздельные покупки смысла не имеют. Я хочу, чтобы iPad и iPhone были не вторым товаром, а ещё одним поводом купить приложение вообще.

Я ведь не целюсь в покупку за доллар. А значит, должен давать ценность на квадратный метр денег, которые прошу. Больше просишь — больше дай.

Позавчера я написал: «Не жадничаю с разными платформами». Сегодня это перестало быть просто фразой.

Второй вопрос — когда.

ИИ советует начать с iPad. Там у продукта цельная история, и до первого релиза так выходит на сорок–шестьдесят часов меньше. А iPhone — потом, обновлением.

Я выбираю иначе. iPad и iPhone — в первом же релизе.

Одна волна вместо двух. И никто не откроет страницу, не увидит «только для iPad» и не уйдёт.

У решения есть цена, и её надо назвать.

Mac больше не выйдет без телефона.
Цена одна везде — даже если на каком-то устройстве она окажется неудобной.
И рейтинг общий. Если версия для iPhone выйдет слабой, она утянет вниз и Mac.

Во второй день я написал в спецификации: «Mac первый. iPad и iPhone — во второй версии».

Mac всё ещё первый. А вот второй версии для них не будет. Они едут в первой.

👆 На iPad нет наведения

Теперь о том, почему эти шестьдесят стори-поинтов — не перерисовка под другой размер.

На Mac весь продукт — окно, которое стоит рядом и не отбирает фокус. На iOS такого не бывает. Приложение либо на экране, либо нет.

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

На iPhone так не выйдет. Честная версия для телефона — «скопировал здесь, переключился, вставил там». И вся работа — сделать этот путь как можно короче.

А теперь вспомните про мышь.

Четыре кнопки, которые появляются при наведении. Масштаб, который держится за курсор. Меню по правому клику.

На iPad всего этого фактически нет. Нет наведения. Нет курсора. Нет правого клика.

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

То, что я доводил на Mac, удобно переиспользовать не выйдет. Решения придётся искать заново.

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

🔌 Engineer honesty moment

Раз уж про экран.

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

И второе. Наполнять доску текстами на телефоне — складном или обычном — не самое удобное занятие. Писать там длинные сниппеты вряд ли кто-то будет.

Но как инструмент, где пачка нужных данных всегда под рукой, — он точно будет работать хорошо.

Версия для iPhone — именно про это. Я делаю её для второго, а не для первого.

💬 Вопрос

Одно приложение, три устройства, одна цена.

Для вас это повод купить небольшое платное приложение? Или вы считаете, что так и должно быть по умолчанию, и платить за это не готовы?

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

Завтра — первая фаза. Сделать код переносимым так, чтобы на Mac не изменилось ничего.

Сто три теста должны остаться зелёными. Подозреваю, что AppKit сидит в коде глубже, чем кажется 😉