Здравствуй, дорогой дневничок.
Давно хотел про это написать, так, чтобы целиком, от начала и до конца. А то все в разных местах, да полунамеками, да с разных сторон захожу, а озвучиваю только если с кем-то вслух общаюсь, да о насущном рассказываю.
Главная особенность профессии программиста - это количество вещей, которые постоянно необходимо исправлять. Всякий раз появляется что-то новое, и надо внедрять очередную странную сущность, которая вроде как и логично относится к тому, что уже есть в наличии, но - блять! - почему о ней не было заявлено раньше?! Потому что ожидая определенное требование было бы правильно заранее использовать иначе определенную смысловую конструкцию, а не делать так, как было заявлено изначально. И знай я наперед про это требование, я бы не стал делать определенных вещей. А теперь придется их переделывать.
То есть метрик теперь должно быть больше, сервисы будут опциональны, а стран точно будет несколько, и в каждой чтобы все языки были доступны. И начинается планомерное исправление горячих заглушек на что-то более параметрическое и настраиваемое. А там главное не перепутать, что параметризуется, а что настраивается.
А потом оказывается, что что-то не так имели ввиду, и это надо заменить как логический элемент, и ни в коем случае не забыть где-то старую логику. А то потом баг будут всем интернетом искать: где и почему сходящаяся функция расходится, и как значение косинуса в военное время достигает трех. А оно там ей-богу его достигает. И даже график с виду правильный строит.
И это не говоря о постоянных мелких ошибках: забыл “точку с запятой” в сложном каррировании, в регулярке лишний слеш поставил, опечатался в имени переменной или не туда присвоил. Или внезапно обновился какой-то новомодный пакет, и посыпались зависимости.
Или, или, или, или. Куча причин, которые так или иначе проявляются в ошибки в консоли, и требуют разного рода рефакторинг уже написанного и рабочего кода. И в этом смысле в своей деятельности как программиста я на 60% занят исправлением или модификациями уже имеющегося кода, добавляя туда либо запланированное расширение, либо модифицируя логические связи, либо отлавливая баг валидации или генерации структур данных.
Ошибка на ошибке сидит, ошибкой погоняет. И все надо или исправить, или так аккуратно замести под коврик, чтобы никто не догадался, что она там есть, а потом к ней вернуться. И самое главное, что никого кроме себя в том, что что-то не работает уже не обвинишь: компьютер это такая штука, которая не пойдет на уступки и не сжалится, не сыграет в поддавки и не будет подвергать оценке тот или иной способ решения задачи. Компьютеру бесполезно жаловаться, просить, подкупать или угрожать. Все что можно сделать, это создать решение - световое заклинание, управляющее электрическими каскадами в кристаллах процессора и памяти - которое будет стабильно выполняться, и отвечать требования решаемой задачи.
В общем и целом многие кейсы похожи друг на друга - это связанные справочники, ключи которых опираются сложным образом друг на друга, образуя тот или иной граф данных. Применение внешних ключей происходит чаще всего в контексте или внешнего атрибута, или принадлежности к определенному контексту или множеству. Сложнее всего так пересекать узлы и ребра графа, чтобы в них не было повторений и в них нельзя было запутаться. А если они еще могут каскадно объединяться друг с другом - то это уже совсем высший пилотаж.
Я как-то рассказывал своим друзьям о том, что такое программирование: это всего лишь называние вещей своими именами. Хороший программный код читается как книга: каждый символ находится предельно на своем месте, и не вызывает путаницы или искаженного ожидания. А там, где начинаются сложные условия, там все проблемы расширения логики и начинаются.
Самый частые локации плавающих багов логики - это как раз `switch-case` и `if-else` конструкции. И сколько копий об это сломано, а без них никуда. На них все и держится. Даже небо, даже Аллах!
И самый частый внутренний диалог во время такого дебага, это сменяющие друг друга фразы “вот я дебил-то!” и “о, да я красавчик, все правильно сделал!”. Эмоциональные качели 80 уровня. Где в какой-то момент просто перегорает предохранитель, и любое обнаружение себя неправым включает режим “спокойствие! только спокойствие!” и приводит в действие рефлекс “нет ничего непоправимого, сейчас все починим!”.
В конце-концов я уже взял предоплату за эту работу, да и решение не такое уж и сложное. В общем и целом будет работать, и предметную область собой будет закрывать. А все остальное уже за дополнительный прайс!
Но самое главное, обнаружение себя в чем-то неправым не вызывает ничего, кроме живого интереса - а где же я ошибся? - и желания разобраться в ситуации. А не тянет к позывам бить себя пяткой в грудь, доказывая, что я не могу ошибаться в том, что сделал. Все мы грешны, так что давайте разбираться по существу. Что именно не работает, и как должно быть правильно?
В этом смысле у меня было много достаточно типовых разговоров, когда я обнаруживал ошибки в коде своих коллег, и на вопрос “как так получилось?” я неизменно получал ответ вида той или иной формы самобичевания, что мол не досмотрел-не доглядел, не знал, как это правильно использовать, и использовал как мог.
А на вопросы: “А почему не уточнил? Почему не спросил у того, кто знает? Ты же сам говоришь, что не знал правильного ответа. Так почему не узнал правильный?” самым частым ответом получал: “Я не знал, что можно спросить”.
Что тоже было ложью, потому что одна из первых фраз, которую я говорю любому программисту, который начинает работать с моим кодом, и который претендует получать за это от меня деньги за свою работу, звучит так: “Если что-то непонятно - спрашивай. Если не спрашиваешь, значит или все понятно, или тебе неинтересно этим заниматься.”
Достаточно было пару-тройку раз поймать на этом “я не знал, что можно спросить”, чтобы пожать друг другу руку и разойтись каждый в свою сторону. И ни о чем не жалеть.
При этом моменты самобичевания или перекладывания ответственности бывали настолько затяжными, что приходилось прерывать процесс фразой вида: “мне неинтересны твои извинения и твоя форма внутреннего стеснения за обнаруженный факап. Ошибка обнаружена, и ее надо исправить, И мы сейчас решаем, кто это будет делать, и не ищем себе оправданий. А лучшей из форм принесения извинения за допущенный косяк - это признать вслух его наличие, вслед за этим исправить, и больше к нему не возвращаться. Все остальное - вторично”.
И короткая фраза в чатике “ага, мой косяк” - лучшее из того, что способствует дальнейшей продуктивной работе.
Однако при этом обнаруживается феномен: в реальном мире, за пределами компьютеров и машинных кодов, люди практически не обучену этому навыку - распознавания собственных ошибок и конструктивному их исправлению.
Даже простого признания собственного заблуждения во многих людях будет встречать ожесточеннейшее сопротивление, бессмысленное и беспощадное. Я помню, как лет в 14-15 спорил со старшей сестрой о том, как правильно произносить “Land Cruiser”. Сестра упорно настаивала на том, что это “лэнд краузер”, в то время как упирал палец в англо-русский словарь, где явно читалось “крузер”, с непроизносимым конечным “r”. Никакие аргументы на неё так и не подействовали, а мое удивление наблюдаемым феноменом было столь велико, что я зарекся о чем-то с ней спорить в принципе и впредь. Свои нервы дороже.
Да и в принципе спорить с другими людьми зарекся. Желание спорить о чем-то, доказывать свою правоту, убеждать во всесильности собственного знания и непогрешимости ее источника, доказывать незначительность фактов и давить на авторитетность в своих аргументах - верный признак того, что дальнейший разговор бессмысленен. И меня в обратном уже не переубедишь.
А меж тем это огромная проблема. Люди бешеные деньги платят для того, чтобы у психолога, которому они наконец-то доверились и рассказали все как есть, наконец-то произнести заветное “так это все время был мой косяк!”. Что именно было косяком не так важно: случайно разбитая в детстве тарелка, измена по-пьяне, игнорирование какого-то важного очевидного факта, или любой другой из психологических артефактов, проявляемых в отрицании очевидного, следование которому неизменно приводило к переживанию негативных чувств и эмоций. Важно то, что человек все это время знал, что дело в нем самом, и продолжал избегать ответственности за то, в чем был неправ.
А это рождает всякого рода газлайтинг и манипулятивные реакции: тебе показалось, ты неправильно понял, ты не должен был этого делать, ты должен был догадаться, ты, ты, ты, они, другие, прочие, остальные, все.
Кто угодно, лишь бы не я. Ради всего святого, пусть это буду не я. Мне нельзя ошибаться, я не хочу ошибаться. Я хочу всегда быть правым, я хочу быть хорошим. Я не хочу, чтобы меня считали глупым или что я чего-то не знаю. Я, я, я, я. Весь такой важный и большой я, который хочет быть лучше всех, чтобы его любили, чтобы его хвалили и уважали. Чтобы его боялись и с ним соглашались. Чтобы он был лучше всех, и никто не мог быть лучше него.
Чаще всего травмы недостатка родительской любви. Когда те были либо слишком требовательные, либо слишком безразличные к детским успехам.
И вот мы здесь. И имя нам - Легион. Очередной. Скоро соберем армию, и двинем на дальние рубежи. В святой войне за здравый смысл и любовь к ближнему. Бессмысленную и беспощадную.
Кто последний в Космический Десант записывается? За вами буду! А кормить по дороге будут? Или дали пистолет, и крутись как можешь?
И ведь не объяснишь никому, что нет ничего постыдного в том, чтобы где-то ошибиться и признать этот факт, и больше к нему не возвращаться. Я вот, например, постоянно ошибаюсь. Нет ни дня, чтобы опять что-то не натворил, и чтобы потом это не полез исправлять и улучшать. И это вы еще мои кучки под ковром не видели! Я ведь про них помню. И разгрести их тоже надо, ибо потом всплывут в самых неожиданных местах, а я буду глазами удивленно хлопать: “Ой, а кто это сделал?!”.
Все ради этого, дорогой дневничок, и делается, чтобы раз за разом научиться прыгать с кувшинки на кувшинку, не касаясь воды. А если вдруг сбился с шага - отряхнуться, и начать сначала. А иначе паровозик не взлетит.
А там уже можно будет и поезд на Сурхарбан делать. Чертежи уже есть. Главное не разучиться вовремя не ошибаться.