Время баек! На работе попросили рассказать о своём первом "косяке", делюсь этой историей и с вами.
Я backend-разработчик и моя история необычна тем, что впервые прод я положил во "фронтовой" части проекта...
На одном из мест работы, где я был ещё не самым опытным разработчиком, накопились fullstack-задачи — надо было в том числе дорабатывать фронт (TypeScript/React). Опыта фронта я тогда совсем не имел, но как ответственный разработчик вызвался научиться и покодить на пользу команде. Нужно было сделать не очень сложную доработку: в одном из интерфейсов при определённых условиях отрисовывать немного другие поля и позволить пользователю их изменять. Я тогда ещё не понимал, что в таком случае не стоит тащить всю логику на фронт, поэтому наколбасил каких-то if'ов и вроде бы всё заработало. Тестировал свой опус я, конечно же, руками, а так как процессы у нас в тот момент были не очень-то поставлены, то на крик тимлида "будете что-то в релиз доливать?!" я ответил "я этот ваш фронтенд превозмог, надо вливать!". Ах да, проводить ревью было некому, потому что владелец экспертизы по фронту ушел в отпуск, поэтому коллеги сказали "seems good" и влили мой код в master.
Прокатили релиз на ПРОД, какое-то время всё было спокойно: в логах чисто, ошибок нет, мониторинг чист, но... через несколько минут пошли звонки и письма от пользователей: "Тут какой-то пипец! Почему мы можем редактировать все поля?" Оказалось, что пользователи после релиза получили доступ к редактированию формы, которая by-design должна быть доступна только на чтение.
Форма, редактирование... Чёрт, я был единственным, кто дорабатывал фронт! Я начал быстро пробегать глазами по изменениям, которые внёс. Всё же должно работать, я же всё проверил!.. Коллега, разбирающийся во фронте, к моменту релиза уже вышел из отпуска и проблему мы начали разбирать вместе. "А это что такое?"— смотря на место в коде, на которое указывает палец коллеги, вижу название файла, и я вообще не должен был его трогать в ходе задачи, а внутри него в каком-то хитром if в конце приписано
if (blablabla || oopsIJustTestedSomethingAndForgotToDeleteThis)
Во время выполнения задачи я просто начинал писать какую-то логику, которая срабатывала при определённом значении одного из полей, а в итоге удалил часть условия и оставил там только само значение поля — в JS просто наличие поля в логическом выражении распозналось как true и позволило безусловно редактировать форму, ведь это поле всегда приходит с сервера. Космический стыд! Тем временем тимлид, хоть и знатно испугавшись, хладнокровно откатил релиз. Мне повезло, что никто не успел наворотить страшных дел, ведь система работала с серьёзными данными.
Признавайтесь, сколько раз у вас ёкнуло сердце от несовершенства описанных мной процессов? Мне кажется, можно было испытать эффект "не ходи туда, за дверью убийца!", только по-айтишному. Баг я в итоге поправил, а тот случай навсегда изменил мой подход к разработке.
С тех пор я понял что JavaScript лучший язык программирования (нет) и важность процессов и инженерных практик: код-ревью, тестирование и различные автоматические проверки, которые прочерчивают для нас путь к успеху, не позволяя совершать похожих ошибок. Сейчас я не представляю себе жизнь без этого, более того — внедрение хороших процессов в работу команд стали для меня одним из самых удовлетворяющих занятий в разработке :)