Стандарт, а не настроение
Студии шесть дней. Пока она не обзавелась привычками случайно — вот стандарт, по которому она работает. Записан сейчас, пока быть честным ещё ничего не стоит.
На этой странице
Строка под нашим именем гласит: мы не просто разрабатываем — мы создаём каждую строку кода и пиксель. Первый же человек не из студии, прочитав её, спросил, не слишком ли громко звучит создаём для бутиковой студии, которой большую часть жизни предстоит писать TypeScript и ревьюить пул-реквесты. Вопрос справедливый. Слово я оставил — и вот аргумент в его пользу.
«Создавать» — это про эффект, а не про метод. Когда софт кажется чуть-чуть невозможным — список, который прокручивается без единого рывка на четырёхлетнем телефоне; форма, которая возвращает наполовину набранный ответ после обрыва связи; релиз, о котором никого не пришлось предупреждать, — вы наблюдаете не магию. Вы наблюдаете отсутствие тех двенадцати мелких отказов, ожидать которые вас приучили. Магия работает, пряча труд. Инженерия работает, выбирая сделать невидимый труд во вторник, когда никто и никогда не увидит версию, где вы его не сделали.
Создавать — не настроение. Это стандарт: список того, что мы делаем каждый раз, и в особенности в те недели, когда пропустить это сегодня не стоило бы ничего.
Стандарты немодны, потому что звучат как бюрократия. Это не так. Стандарт — то, что решает за вас в шесть вечера в четверг, когда клиент доволен, демо прошло, а правильный следующий шаг — ещё два часа работы, которые не дадут никакой видимой разницы. Один только вкус этот спор проигрывает всегда. Записанный стандарт выигрывает его примерно в половине случаев, и в этом зазоре помещается вся разница между студиями.
Мы нанимаем архитекторов, а не сборщиков
Разница не в грейде и не в должности. Сборщик спрашивает, что написано в тикете. Архитектор спрашивает, чем этот тикет обернётся на восемнадцатом месяце, когда на предложенный им срез пути обопрутся ещё три функции. Оба пишут работающий код. Дешёвым в содержании на второй год остаётся только один.
Набор кода никогда не был дефицитным навыком, и с каждым кварталом он всё менее дефицитен. Дефицитным остаётся суждение: какой инвариант несущий, какая абстракция окупает свой вес, какая запрошенная функция на самом деле — две функции и одно недопонимание. Сборщик добавляет то, о чём попросили. Архитектор спрашивает, что теперь придётся удалить, раз эта штука появилась, — и готов сказать нет, и вот что я построил бы вместо этого, мне, письменно.
Поэтому планка найма — это планка суждения. Я хочу, чтобы внутренние споры в этой студии были про удаление, а не про добавление. Удлинить бэклог способен кто угодно.
Говорите, чем эта штука не является
У каждой системы есть граница, за которой она перестаёт быть правдой. Кеши протухают. Оценки предполагают объём. Модели уверены в вещах, которых никогда не видели. Индустрия по умолчанию оставляет эту границу за пределами предложения и надеется, что в проде на неё никто не наткнётся. Наше правило работает наоборот: ограничение живёт в интерфейсе, тем же кеглем, что и обещание.
Фраза, признающая ограничение, — часть продукта. Если её нет в интерфейсе, релиз не закончен.
Это уже видно в двух местах, где нам приходится быть честными. Калькулятор цен ставит оговорку там же, где стоит число, а не в подвале: оценка держится, пока объём работ и исследование не скажут иначе. Гарантия возврата называет каждое своё условие на одном дыхании с обещанием. Публикация условий стоит немного конверсии и покупает единственное, что имеет смысл иметь на первый день, — клиента, который не удивится на третьем месяце.
Смежное и настолько же обязательное: убеждают числа. «Быстро» — это отчёт о том, что мы чувствуем по поводу собственной работы. «180 мс на 95-м перцентиле, на среднем Android через 4G» — утверждение, которое можно пойти и опровергнуть. Прилагательные просят им поверить; числа просят их проверить. Мы предпочитаем, чтобы нас проверяли, — а когда измерения ещё нет, честный ход в том, чтобы сказать, что измерения нет, а не тянуться за прилагательным покрупнее.
Уборка при размонтировании — моральная позиция
Вот самый маленький известный мне пример этого стандарта — тот, которым я объясняю его людям, считающим всё это абстракцией. Интерактивный компонент, пока живёт, набирает вещи: таймеры, слушатели событий, сокеты, обсерверы, кадры анимации, контекст GPU. Ничто в языке не заставляет вас вернуть всё это, когда компонент уходит. Пропустите — приложение всё равно работает: тесты зелёные, демо прошло, функция уехала в релиз.
А потом кто-то двадцать минут ходит по вашему продукту. Брошенные таймеры продолжают тикать все до одного. Телефон греется, вентилятор ноутбука раскручивается, вкладка, которой было прекрасно у вас на столе, умирает в электричке. Никто не заводит такой баг как вы забыли функцию очистки; его заводят как «приложение тяжёлое», а чаще не заводят вовсе и просто перестают им пользоваться.
Я называю это моральной позицией, потому что стоит она одного вечера и не покупает ничего, что можно показать в демо. Вы делаете это для машины, которую никогда не увидите, принадлежащей человеку, который никогда не узнает, что его пощадили. Тот же инстинкт масштабируется на всё, что выше: сессии, которые действительно заканчиваются; задачи, которые останавливаются, когда их отменили; кеши со сроком жизни, который кто-то выбрал осознанно; функции, которые убирают, когда они перестают отрабатывать собственное обслуживание. Софт, не прибирающий за собой, — это софт, не уважающий машину, на которой он в гостях.
Почему маленькая студия публикует цены
Информационная асимметрия — любимый трюк этой индустрии и самый старый. «Цены по запросу» не означает, что цена сложная; это означает, что она подвижна в сторону, которая зависит от того, что агентство сумеет угадать про ваш бюджет. Число существует до созвона. Созвон — про то, кто узнает его первым.
Мы опубликовали своё в первый день, с арифметикой на экране: юниты по каждой строке, множители, вилка, недели. Дойти до числа можно в два часа ночи, ни с кем не встречаясь, и если число вам не подходит, вы потеряли девяносто секунд вместо двух встреч и недели вежливости.
У этого есть настоящая цена, и я лучше назову её, чем сделаю вид, что выбор был бесплатным. Мы вручаем конкурентам свой прайс-лист, приглашаем сравнивать нас по цене с теми, кто с удовольствием нас подрежет, и лишаемся возможности брать с двух клиентов разные деньги за одинаковую работу. Эта возможность мне не нужна. Цену, которую стыдно опубликовать, стыдно и брать.
Гарантия возврата 100% — та же мысль с ценником. Если проект не выйдет в релиз до срока по договору, вы не платите. Она превращает нашу уверенность из прилагательного в обязательство на нашей стороне стола, а это единственная форма уверенности, с которой покупатель может что-то сделать.
Есть версия всего этого, которая действует ещё до того, как человек становится клиентом, и как раз её большинство студий держит за декорацию. Что мы должны посетителю: страницы, которые быстро грузятся на том телефоне, что у него действительно есть; цену, которую можно найти, не сдав почтовый адрес; никаких обратных отсчётов, обнуляющихся при перезагрузке; никакого cookie-диалога, устроенного так, чтобы неправильную кнопку было проще нажать; никакого виджета, изображающего человека, который счастлив вам помочь. Тёмные паттерны — это тот же стандарт, только направленный на клиента, а не на код.
На первой неделе всё это ничуть не впечатляет. Держать стандарт легко, пока студия маленькая, календарь пустой и ни один дедлайн ещё не оскалился. Записать его сейчас стоит именно потому, что позже он станет неудобным, а записанный стандарт можно опровергнуть — в отличие от корпоративной ценности. Сайт запустился шесть дней назад, и цены публичны с первого часа. И то и другое проверяемо. Пожалуйста, проверьте.