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

Во многих мошеннических схемах используется очень простая и действенная идея: когда человек вкладывается во что-то, это что-то обретает для него ценность, даже если по факту это пустышка. Например, всякие фейковые опросы, где человек тратит 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 лет, то вы уже не видите, что бросать.

Что хотел сказать автор?

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

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

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


Если вам не нравится, что я пишу, то не подписывайтесь на мой канал «Блог погромиста«. Там ужасно.

Читайте так же:

  • Google представил новый способ включить ключевые моменты видео в ПоискеGoogle представил новый способ включить ключевые моменты видео в Поиске Google запустил новый способ включения ключевых моментов для видео на сайте без необходимости вручную маркировать каждый сегмент. Компания вывела из беты разметку SeekToAction для автоматического выделения глав на видео в поиске. Все, что нужно сделать – это сообщить Google шаблон URL […]
  • Московский суд оштрафовал Google на 6,5 млн рублейМосковский суд оштрафовал Google на 6,5 млн рублей 29 сентября 2021 года Мировой суд Таганского района Москвы оштрафовал Google по 2 протоколам Роскомнадзора на 6,5 млн рублей за неудаление запрещенного контента. Один штраф составил 2,5 млн рублей, второй был максимальный за нарушения — 4 млн рублей.У Google есть 60 суток на выплату двух […]
  • Контент сайта знакомствКонтент сайта знакомств Вам нужно вдохновение для вашей собственной контент-стратегии? Посмотрите, что делают эти сайты знакомств.Мы много говорим о B2B компаниях и их контент маркетинге успехи, которые иногда можно легко забыть. Что такое мир B2C - например. Сайты знакомств и приложения. Однако сочетание […]
  • Таганский суд Москвы оштрафовал Google еще на 14 миллионов рублейТаганский суд Москвы оштрафовал Google еще на 14 миллионов рублей Мировой судья Таганского суда Москвы признал компанию Google виновной в нарушении ч. 4 ст. 13.41 Кодекса об административных правонарушениях и оштрафовал её на 14 миллионов рублей. Речь идёт о признании компании виновной по четырём […]