Прохладное утро... Щелчок... Зажигалка подносится ко рту, где своей очереди ждет сигарета.
Такая желанная, такая необходимая, которая нежно согреет и укутает.
Глубокий вдох, который непременно ускоряет мою смерть, — и ментоловый дым наполняет легкие. Сознание постепенно стирает грань реальности, отдаляя меня от текущего местоположения и направляя в далекие воспоминания, что таятся в моей голове.
У каждого из нас есть события, которые становятся триггерами нашего взросления. Они могут ломать нас, деформировать психику или, наоборот, закреплять позитивный опыт, с которым мы идем дальше и достигаем новых успехов. Перед глазами все четче проявляется пленка прошлого, испещренная красными пятнами, от каждого из которых исходит медленная струйка боли.
Тимлид заводит меня в аквариум. Доска, на удивление, не стерта, и на ней все так же остались наши заметки после митинга: фразы, идеи, стрелки, зачеркнутые слова — этот броуновский хаос, из которого рождается что-то совершенно новое. Есть что-то загадочное в think tank'ах — они позволяют познать красоту инженерного мышления: разобрать все на маленькие детали и сложить их вместе в нечто совершенно иное, создав другие абстракции, назвать их и передать другому человеку, дабы он из этого кубика лего мог сделать уже домик, чтобы затем передать этот домик тому, кто этим домиком уже будет пользоваться.
Тимлид, осматривает окно, словно пытаясь понять, наблюдает ли кто-то за нами снаружи. Ведь кто-то же определенно должен наблюдать за нами, не так ли? Затем садится напротив меня и сжимает свои руки, после чего кладет их на стол. Его руки, а если быть точнее, кисти, всегда в компрессионных перчатках. Никогда не думал, что увижу в жизни программиста с туннельным синдромом и болью в области фаланг. Генетика... шанс не так велик, меня точно не заденет. Но теперь поневоле задумываешься — ведь это обязательно дотянется и до меня. И что, если "это" произойдет совсем скоро?
Он аккуратно протирает стол своей кистью, как будто стряхивая с поверхности крошки оставшихся мыслей, а затем смотрит прямо в мои глаза. После секундной паузы раздается фраза:
— Можешь ли ты мне объяснить, почему в коде не было этой проверки? … Я добавил её, можешь не дописывать.
— В голове вопит множество голосов, пытаясь найти хоть какое-то объяснение происходящему. Нет, я не могу объяснить, почему я не добавил эту проверку.
— Я не хочу смотреть историю гита и видеть, как давно там этого не было. Пожалуйста, займись качеством своего кода. Твоим кодом пользуются и другие, ты несешь ответственность и за них тоже.
После этого короткого диалога я еще долго сидел и смотрел на стену стеклянными глазами, в попытках найти хоть что-то в свое оправдание, сделать какой-то мысленный перенос ответственности. Но в конечном счете он ведь прав — мне платят за то, чтобы я принимал точные решения.
Начавшийся дождь выкидывает меня из воспоминания. Поглядывая на часы, понимаю, что прошло всего пару минут. Быстро выкинув сигарету, захожу обратно в офис, делаю кофе и сажусь за свое привычное место у окна. На экране блокировки меня встречает давно знакомая цитата:
"You copied that function without understanding why it does what it does, and as a result your code IS GARBAGE."
Открыв проект, пересматриваю код в попытках вспомнить, на чем остановился вчера. Вдруг глаз цепляется за название класса, в голове происходит химическая реакция, которая влечет за собой воспоминания, события, сносящие все на своем пути и уносящие от тернии к звездам.
Событию уже где-то 3-4 месяца. Это был обычный рабочий день: я и команда вернулись с обеда, и нам пришли уведомления от QA-команды — о том, что наши приложения на их энвайроменте просто-напросто перестали отвечать. Причем не одно приложение, а почти все. Естественно, такие события хоть и не ввели нас в панику, но вызвали очень сильное ощущение тревоги.
"Пожарная" команда» выехала на место. Был сделан рестарт приложений, и всё заработало. В результате детективной работы выяснилось, что логи перестали записывать информацию за 10 минут до «гибели» жертвы. Сами логи не содержали явных улик, которые могли бы указать на заказчика или исполнителя "убийства". Но если логи не дают прямых улик, то можно посмотреть историю коммитов, которые приложения получили, — это и вывело нас на изменение, которое было сделано в одной из поддерживаемых мной библиотек. То есть цепочка улик вела к "заказчику преступления", иначе говоря — ко мне. Меня посадили в карцер с формулировкой "разберись в той фигне, что ты сделал". Проведенные за этим полдня ощутимого результата не принесли.
Спустя какое-то количество часов изучения документации ко мне прислали надзирателя в лице старшего коллеги. Было найдено объяснение: у нас логирование было не асинхронное. Опытный читатель, естественно, догадается и начнет смеяться — и будет абсолютно прав, ошибка детская. Для менее опытных ответа на эту загадку не будет — рано или поздно столкнетесь с этим сами. Забавное наблюдение: фреймворк, который мы использовали, тоже имел кое-какие проблемы с асинхронным логированием — благодаря моему провтыку был обнаружен ещё и провтык во фреймворке. Глубоко уважаемому читателю, разбирающемуся в Java и не являющемуся фанатом красно-шапочных, предлагаю насладиться:
После такого инцидента меня вызвали на one to one:
— Прошу тебя внимательнее относиться к качеству того, что ты делаешь. В последнее время ты создаешь довольно много ошибок, многие из которых случаются исключительно из-за того, что ты не фокусируешься на задаче. Ты должен уделять все свое внимание тому, что мы делаем — мы инженеры, и наша работа заключается в том, чтобы внимательно смотреть и разбирать задачу. Мы должны отдавать этому весь свой фокус, чтобы не допускать ошибок. Если ты не готов это делать, то и дальше будешь натыкаться на подобные инциденты. Скажу между нами, разработчиками: совершая такие ошибки — дурной знак. Не только твоя репутация, но и репутация команды может упасть до такой точки, где находиться мы совершенно не хотим, но если будем продолжать в том же темпе, то несомненно там окажемся.
Ответственность — это нечто большое, что довольно часто приходит неожиданно и нежеланно. Мало кто хочет нести ее на собственных плечах. Но, наверное, именно такие события и делают нас ценнее как сотрудников и взрослее как людей.
Лишь после таких провалов мы начинаем понимать цену ошибки и тяжесть ответственности, которая за ней скрывается. Жизнь программиста — это повседневная ответственность. Она не такая, как у хирурга, но в определенных ситуациях может стать такой же — а может и не стать. Она просто отличается, и у каждого из нас есть свой предел, который мы способны вынести. Важно лишь, что, так или иначе, она всегда с нами. И с этим приходиться считаться — за каждую строчку кода, которую мы пишем, за каждую строчку, которую поддерживаем.
Потому что маленькие ошибки могут привести за собой большие. Если мы делаем что-то неидеально, — например, медленнее на пару миллисекунд, — то, просуммировав это для полумиллиона пользователей, мы получаем довольно большой кусок времени, который попросту потерялся из-за нашей неидеальности, и теперь этот груз лежит на наших плечах. Это неприятно признавать и, в какой-то мере, даже больно. Но, научившись признавать ошибки, мы становимся сильнее — как разработчики. Становимся честнее перед другими людьми этого общества.
IT — прекрасно.
Forward, Always.
kmatveev
Зашёл почитать, зачем автору понадобился код на Scheme с завлекательной картинки. А в тексте про это ничего и нет. Расстроен. Статью не минусил.
Насколько я смог понять, R и Q - функции, принимают аргумент логического типа, и возвращают его же, то есть для #t вернут #t , для #f вернут #f