{"id":14268,"url":"\/distributions\/14268\/click?bit=1&hash=1e3309842e8b07895e75261917827295839cd5d4d57d48f0ca524f3f535a7946","title":"\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c \u0438\u0433\u0440\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e?","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"f71e1caf-7964-5525-98be-104bb436cb54"}

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

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

Один раз я написал статью о том, как увлечение новым языком программирования спасло меня от выгорания. Её прочитало много людей, и меня позвали работать в стартап. Предложение было заманчивым, ребята звали меня делать реальные вещи, а не абстрактное дерьмо. Я согласился.

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

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

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

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

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

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

Как у любого стартапа, у этого был ограниченный бюджет. И я убедил всех, что его надо тратить на правильный код, продуманную архитектуру и глубокое тестирование. «Это самая правильная инвестиция, — настаивал я. — Знаете, почему 90% стартапов схлопываются? Потому что у них все начинает валиться из-за ранних ошибок, и весь бюджет уходит на латание дыр в прототипе, из которого они решили растить продукт, не переписывая. А могли бы разрабатывать новые фичи».

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

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

«Эй, вы меня наняли, чтобы повысить качество разработки — мы его повышаем». Но это моя логика. Кроме логики есть ещё эмоции, и я начал сопереживать. На самом деле я понимал, что им не нужно качество. Если вы любите работать на результат — попробуйте меня понять. Представьте, что вы попали в компанию вечного процесса, где релиз вечно откладывается все дальше и дальше, и вы начинаете понимать, что никто к нему особо и не стремится. Как быстро вы сбежите?

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

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

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

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

Наверное, я огромный мудак. Может и правда то, что я делаю, — это плохо, и мне нужно стать другим разрабом. Но это не так. Дело в том, что есть разрабы, которые занимаются индустрией, и есть те, кто фигачит вам продукт. Главное уметь отличать их друг от друга и ни в коем случае не ждать от индустрийщиков, что они сделают вам ваш продукт. Потому что они плевать на него хотели. На ваш продукт, на ваших пользователей, на ваш бизнес и на вас самих.

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

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

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

Если ваш кандидат на должность СТО рассказывает про программирование с горящими глазами, часто говорит об архитектуре, фреймворках и прочем — это тот самый парень. И от него будут одни чертовы проблемы.

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

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

0
397 комментариев
Написать комментарий...
Alex Chernyshev

Статья гарантированно напугает всех кто считает деньги,
поэтому думаю надо дать ряд пояснений для 'непричастных':

"Костыль"/быстрое решение/hotfix - с точки зрения последующих затрат это натурально множитель. Множество костылей и является тн. 'legacy code', по факту.
Каждая следущая добработка в проекте с костылями будет стоить не Х часов разработки а Х * коэффициент костылей.
Вот пример для иллюстрации:
Стоит задача реализовать загрузку файлов картинок через веб-форму,  для генерации и отдачи preview. Задача в такой постановке банальна, посему отдается фрилансеру и делается за день.
Дальше нужно "доработать" загрузку больших картинок, скажем от 1Гб. Все, вы попали на пару месяцев работ, т.к. нужно делать асинхронную загрузку, с прогрессом, с паузой и отменой, с обработкой разрыва связи. Саму генерацию preview нужно тоже докручивать, тк ничего стокового при таких размерах работать не будет.
Дальше нужно добавить "всего лишь" генерацию превью PDF/DOCX какого-нибудь - и вы попали еще раз и сильно, потому что там внутри есть страницы, те на выходе вашего замечательного решения нужен не один сгенеренный preview а несколько. А вы уже например привязали биллинг к количеству сгенеренных пользователем превью.

Т.е всего лишь пара небольших доработок (с точки зрения бизнеса) и проекту на уровне MVP - кабздец, ну либо увеличение бюджета раза в три.

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

Так что не стоит так сразу кидать кирпичами в каждого предложившего рефакторинг - не каждый врач вам враг, даже если таблетки горькие :) 

Ответить
Развернуть ветку
Artem Petrenkov
Месяц-полтора тяжелой работы, зато все последующие доработки - с предсказуемыми сроками, без авралов и выхода за границы бюджета.

Отлично, а зачем такое решение абстрактному сервису в вакууме, если такая задача может быть никогда и не возникнет? Это как если бы клиент подбирал машину для доставки продуктов по городу, а вы ему вместо условного VW Caddy предлагаете сразу БелАЗ, потому что вдруг какой-то клиент через 10 лет закажет сразу 100 тонн картошки.

Ответить
Развернуть ветку
Alex Chernyshev

Потому что не бывает абстрактных сервисов в вакууме?
Говорю же: порог чего-то что можно считать 'продуктом' на самом деле очень высок, и там очевидно не только затраты на разработку.
Поэтому на практике ситуации 'такая задача может быть никогда и не возникнет' мало реальны, тк границы продукта закладываются сразу, видны они тоже сразу, как минимум владельцам бизнеса/продукта.

Ответить
Развернуть ветку
Artem Petrenkov
границы продукта закладываются сразу, видны они тоже сразу, как минимум владельцам бизнеса/продукта

А какое архитектурное решение вы бы посоветовали для сайта магазина Джеффу Безосу в 1994 году?

Ответить
Развернуть ветку
Alex Chernyshev

'Это если из позиционирования продукта изначально видно, что рано или поздно такая задача может потребоваться.'
А что бывает по-другому? Ну если убрать фанатизм и неадекват из возможных вариантов.

'В примере про доставку продуктов фаундер мог бы просто решить не покупать БелАЗ'
Ну так фаундер наверное знает где именно и в каком количестве будет его доставка работать? Может он брюкву по военным частям развозит.

'А какое архитектурное решение вы бы посоветовали для сайта магазина Джеффу Безосу в 1994 году?'
Самое смешное что Безос видимо еще тогда понимал в технологиях и имел очень хороших разработчиков тк первые версии Амазона работали на Common Lisp, что для тех лет - очень и очень.

Ответить
Развернуть ветку
Artem Petrenkov

У автора данной статьи именно что фанатизм в плане архитектуры. Но ни одного своего решения он так и не довёл до конца.

Ну так фаундер наверное знает где именно и в каком количестве будет его доставка работать?

Знает. Вот потому-то на предложение купить подобный грузовик сразу должен быть ответ "Нет", если подразумевается сценарий обычного онлайн-ретейла.

первые версии Амазона работали на Common Lisp, что для тех лет - очень и очень

И что, с тех пор сайт Амазона ни разу не был переписан и до сих пор наследует те же технологии?

Ответить
Развернуть ветку
Alex Chernyshev

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

'И что, с тех пор сайт Амазона ни разу не был переписан и до сих пор наследует те же технологии?'
Ну с учетом того что топовый cloud-продукт у них это Amazon Lambda, выросший на их же облачной платформе, которая появилась из системы управления тем самым магазином - архитектурный подход с тех времен вполне прослеживается.

Ответить
Развернуть ветку
Artem Petrenkov

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

Ответить
Развернуть ветку
Alex Chernyshev

Я лишь хотел продемонстрировать на реальном примере из жизни чего может стоить ошибка проектирования. Видимо пример был не очень, раз дело опять кончилось Амазоном.

'В разрезе Амазона'
Очень плохая практика - аппелировать к практикам и подходам больших компаний и тем более пытаться переносить их в стартап.
Каждая такая компания уникальна, со своей внутренней культурой разработки, которая складывалась годами. Человеку со стороны сильно врядли будет очевидно  что именно и почему происходит что в Микрософте что в Амазоне.

Ответить
Развернуть ветку
Artem Petrenkov

Я не апеллирую к опыту Амазона, не подменяйте тезисы, пожалуйста.

Ответить
Развернуть ветку
Artem Petrenkov

Это если из позиционирования продукта изначально видно, что рано или поздно такая задача может потребоваться. В таком случае опытный разработчик сразу должен сказать об этом заказчику. И право заказчика решать, как быть в этом случае: сразу выделять несколько месяцев на решение подобной задачи, совсем от неё отказаться, потому что она не принесёт ценности в продукт (например, многогигабайтные фотки от NASA в сервис загружать будет нельзя в принципе, а документы загружать тем более не нужно), а может и отложить задачу на последующие итерации, а пока заложить единый интерфейс взаимодействия и реализовать простейший загрузчик.

В примере про доставку продуктов фаундер мог бы просто решить не покупать БелАЗ, потому что вероятность встретить такого клиента практически нулевая, и оптовые закупки не являются целевыми для сервиса.

Ответить
Развернуть ветку
394 комментария
Раскрывать всегда