Сожги и начни заново
Во многих мошеннических схемах используется очень простая и действенная идея: когда человек вкладывается во что-то, это что-то обретает для него ценность, даже если по факту это пустышка. Например, всякие фейковые опросы, где человек тратит 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 лет, то вы уже не видите, что бросать.
Что хотел сказать автор?
Как здорово, что мы не на уроке литературы, и автор может сказать именно то, что хотел сказать автор.
Проблема «я вложил в это слишком много времени» — глобальная, но программистам, которые в большинстве своём перфекционисты, в этом плане вдвойне тяжелей. Мы очень привязываемся к коду, он — наше детище, и отказаться от него — это что-то за гранью. Но иногда это единственно верное решение.
Мне нравится проводить аналогию с тачками. Ваша машина может быть самой красивой и быстрой — прям как код, -, но всё это не важно, если вы едете по тупиковой дороге — ведь вы всё равно никуда не приедете. И если на горизонте замаячил тупик, то лучшее, что вы можете сделать — это не надеяться на чудо, а как можно скорее взять свой код, сжечь его и начать заново.
Если вам не нравится, что я пишу, то не подписывайтесь на мой канал «Блог погромиста». Там ужасно.