Вы — шлюхи из Sucker Punch-а

в 8:37, , рубрики: mvp, говнокод, разработка, тестирование, метки: , , ,

image

Всем привет, я Евгений и давайте поговорим.
Расскажу несколько историй, а пока — я UX-разработчик, но при этом занимаюсь фронтэндом полностью, потому что мне это нравится.
Истории будут о том, почему MVP — это не «говнокод по-быстрому», а минимальная версия продукта, которая должна будет развиваться в будущем. Запомните — minimal product, не продукт с говнокодом.

История #1, про прошлое место работы

Работал я в одном месте. Проект довольно-таки известный, но известен не очень положительно — данный проект был за месяц скопирован с оригинального западного проекта и поэтому там был ужасный говнокод. Да, когда кто-то находил баги, нужно было это фиксить и это делал второй фронтэндер. Фронтэнд там был оптимизирован не полностью — большая часть скриптов и стилей вообще не сжималась. 2 Мб, около 200 запросов к серверу при загрузке страницы. Итак, какая главная проблема?
Когда мы разрабатывали еще один сервис для проекта, мы использовали yeoman. Yeoman — это утилита для фронтэнда, позволяющая создавать приложения по шаблону (утрирую, безусловно): в итоге из коробки (при правильном генераторе) готовы куча утилит, облегчающих работу — не нужно было самому склеивать спрайты, f.e., это все делалось автоматически. Ну так вот, мы использовали yeoman и один MVVM-фреймворк — это было основным стеком для фронтэнда. В какой-то момент нам пришлось отказаться от node.js и в итоге кое-как перенесли Bower в бэкэнд.
И что бы вы думали? Второй фронтэндер спрашивал у меня, как заинклюдить Bower в Asset Pipeline. Когда ему говорили, что это отдельный менеджер пакетов — он очень удивлялся и не понимал. Я ему кидал ссылку на bower.io — он не понимал и все спрашивал, как заинклюдить в Asset Pipeline. Он пытался подружить два разных менеджера пакетов, если утрировать. Попробуйте emerge воткнуть в Ubuntu — собирать исходники здорово, но зачем, если есть apt-get?
Через некоторое время у нас появилось немного времени, чтобы вернуться на Grunt, что я и попытался провернуть. Когда я сказал в общем чате, что мы теперь пишем тесты, что у нас теперь нормальная разработка — сколько жоп порвалось, что взрыв был слышен в какой-нибудь Кремниевой долине. «Да у нас и так плохой код, зачем нам тесты писать, нам бы с этим говнокодом разобраться». Как разобраться? Никак, все просто ныли, что все плохо, но не хотели изучать что-то новое. Зачем нам тесты, зачем нам осваивать новые технологии.

История #2, про новое место работы

Пришел я недавно на новую работу, открыл я проект на yeoman — какой же лютый там говнокод. И что же произошло, когда я предложил использовать кофескрипт? «А зачем он нам нужен?». Когда я переписал фабрику с одним return вместо создания временного объекта (к нему цеплялись методы и лишь потом return-ился объект) — а зачем нам это нужно, нам привычно другое. DRY и прочие аргументы не слышались. В итоге та же ситуация — есть говнокод, слепленный на коленке и нет желания это изменять, не потому что неприятно, а потому что действительно не хочется и все устраивает.

Какая мораль и причем тут сакер панч?

Sucker Punch — это такой фильм Зака Снайдера. Осторожно, кто не смотрел, сейчас будет спойлер.
Одна часть фильма повествует о том, что есть бордель с танцовщицами, где шлюхи находятся в рабстве и ничего с этим не делают. Но потом появилась новая девушка и ее это не устроило — она решила устроить план побега. Предложила остальным — они не согласились, потому что страшно. Так вот, со своим говнокодом, со своим нежеланием меняться — вы как шлюхи из Сакер Панча. MVP — это не тот продукт, который делают на коленке, это продукт, который нужно сделать быстро, аккуратно и минимальными усилия. И если у вас есть говнокод — будьте добры, развивайтесь, не устраивайте застой, который приведет потом к болоту.
Думаю, в какой-то момент я буду дарить чулки и помаду, если это продолжится, вы уж не обижайтесь, каждому по возможностям же.

Автор: theaqua

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js