Сожги и начни заново

Пост также можно почитать на habr.com

Во многих мошеннических схемах используется очень простая и действенная идея: когда человек вкладывается во что-то, это что-то обретает для него ценность, даже если по факту это пустышка. Например, всякие фейковые опросы, где человек тратит 2 часа времени, чтобы ответить на 500 вопросов, потом в личный кабинет падает 300кк рублей, но нужно заплатить 500р "комиссии" за вывод средств. Никто никогда бы не поверил в эту чушь, но когда потрачено 2 часа и кажется, что от награды отделяет самая малость... Или же человек играет в покер и проиграл уже все деньги, дом и кота, но нужно продолжать, потому что "столько проиграно, нужно отыграть".

Вчера я чуть не попался на это. Не на мошенничество, нет - я чуть не попал в упомянутую психологическую ловушку "слишком много вложил, чтобы бросить", которую сам себе и построил. Но моя история совсем не уникальна, поэтому помимо неё я собрал тут коллекцию историй и применил ORDER BY scale ASC, чтобы вы оценили: эта ловушка живёт на всех масштабах - от маленьких сиюминутных решений до целых жизней.

5 минут

🔗

Когда я устраивался на работу, там был скрининг-тест на 5 вопросов. И один вопрос был "напишите регулярное выражение для ip-адреса". Там не было никакого подвоха, можно было хоть со stackoverflow скопировать (если найдёте хорошее решение). Недавно мы обсуждали это задание с СЕО и я рассказал, как решал его.

Я подумал, что ip-адрес - это повторяющаяся группа вида xxx.. Понятно, что на число xxx есть ограничения, но в целом это 4 группы, только последняя без точки. Поэтому я пытался написать эту группу и указать, что у неё 4 повторения, но вот тут в конце есть исключение.

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

Тест я прошёл.

Эта история очень понравилась СЕО и он даже попросил записать её, а я недоумевал: что прикольного в том, что я написал тупейшую, постыдную регулярку, когда шёл на senior позицию?

Сейчас я вижу. Я потратил минут 5 на этот групповой секс вариант с группами, но мне хватило мозгов отказаться от этой затеи и потом сразу написать решение за 10 секунд. Это было не сложно, ведь 5 минут размышлений - не такая уж и большая потеря. Давайте что-нибудь помасштабнее.

6 часов

🔗

Случилось прям на днях и послужило причиной для статьи.

Клиент попросил добавить с десяток полей в ORM модель (== добавить колонок в одну табличку БД). Я слабо разбирался в кодовой базе и не видел всей картины, и я знал, что когда-нибудь потом клиент опять захочет добавить ещё колонок, а потом ещё. Поэтому я решил сделать небольшой рефакторинг и дать клиенту возможность самому добавлять колонки, этакий Entity-Attribute-Value замутить. Это надо было сделать так с самого начала, но не сделали, и я решил, что сейчас слегка отрефакторю всё это.

Я успешно переделал схему БД. Потом мне пришлось менять код бэкенда, забирающий данные из БД. Потом я пошёл на фронт и поменял javascript код, чтобы он правильно отправлял и принимал новый тип данных. Это было примерно в моих планах, и я укладывался в свой график. Но потом что-то пошло не так.

Я увидел, что часть данных забираются не через ORM запросы: в базе данных был специальный view, который агрегировал данные (считал какую-то статистику, возвращал самые актуальные данные). Пришлось перелопачивать и его.

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

И я бы отрефакторил. По моим оценкам, оставалось работы на 1-2 часа, но я посмотрел, что у меня получилось: я потратил кучу времени, в трёх местах костыли, а я не уверен на 100%, что не всплывёт что-то ещё. И хотя конец задачи был уже виден и я вот уже почти всё сделал, но звоночки были - я уже несколько часов "вот уже почти всё сделал". Ну и я бросил эту идею. Сделал git checkout master && git checkout -b second-attempt и начал заново.

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

2 недели

🔗

Эх, Фил... Человек тоже начал с рефакторинга, но плюнул на все звоночки и решил биться до победного, отрефакторив вообще всё, до чего мог дотянуться. В итоге 2 недели кранча и выгорания, хотя где-то в конце первой нужно было плюнуть на всё и начать заново, как бы ни жалко было потраченного времени. Хотя бы в барах смог посидеть.

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

2 месяца

🔗

Был у меня клиент, мы пилили приложение с нуля. Сначала ему просто нужно было автоматизировать рутину, поэтому я ему сказал "окей, запустим забесплатно на AWS lambda", что мы и сделали. Потом клиенту понадобилось хранить состояние, и я присобачил dynamodb. Потом понадобилось выводить таблички и формочки в html, и я добавил туда какой-то шаблонизатор и самодельную админку.

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

Мы выкинули весь код и начали заново.

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

3 года

🔗

На одного работодателя я работал около 1.5 года. Это был стартап, что-то, что не делал почти никто, так что мы в какой-то степени были первооткрывателями. У работодателя были какие-то соображения по поводу того, какие использовать алгоритмы, чтобы всё заработало, а потом и я привнёс свои идеи. Мы всё реализовали, но оно работало недостаточно хорошо. Потом мы с полгода делали всякие улучшения, экспериментировали, тестировали идеи, устраивали мозговые штурмы... Оно не взлетало, ну прям никак не дотягивало до нужных значений. И тогда я сказал:

Босс, кажется, мы делаем хрень.

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

40 лет

🔗

А бывают и большие сроки, к сожалению.

Бывает, что кто-то изобретает вещь, как ему кажется, революционную, и вкладывает в неё душу - этакий крестраж. Он развивает идею и 40 лет примеряет её то здесь, то там, и даже обучает ей других по воскресеньям в 10 утра. Потом он постит её на Хабр и ему все говорят, что это просто провал. Будь это вы, стали бы вы сомневаться в какой-то концепции, если живёте с ней 40 лет и даже применяете её в жизни? Да хрена с два!

Легко бросить что-то, если вы потратили на это 5 минут. Возможно бросить что-то, если вы потратили 6 часов. Но если вы потратили 40 лет, то вы уже не видите, что бросать.

Что хотел сказать автор? Как здорово, что мы не на уроке литературы, и автор может сказать именно то, что хотел сказать автор.

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

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



Новое