Что для меня значит быть программистом

Пост также можно почитать на habr.com

Как-то мне написали с Хабра и сказали: Саня, хочешь написать статью про программистов?

Разумеется, я отнёсся к этому скептически. Ладно там девопсины или вайтхэты какие - почитать про них было бы интересно, но вот жизнь программиста... Я сразу вспомнил эти мемы, которые на самом деле не мемы, а правда (см. картинку).

Но потом я начал накидывать мысли и внезапно нашёл много тем, которые могут быть интересны и самим разрабам, и людям, далёким от программирования. Так что вот вам исповедь погромиста. Уж не знаю, типичный я программист или какой-то чудак. Пишу так, как вижу, а обобщать на всех прогеров или нет - решать вам.

Ты кто вообще такой?

🔗

Я ненавижу статьи-биографии и интервью каких-то неизвестных чуваков вроде меня. Поэтому я напишу тут лишь краткую предысторию, просто чтобы вы не думали, что я родился уже с ноутбуком и первыми моими словами были git pull && docker-compose up.

Я отучился вот тут, это не просто квадратная скобочка сбоку, а ВМК МГУ. Когда я пришёл туда, я думал, что я очень умный, но мне достаточно быстро доказали, что ващет нет :[

Завершив карьеру троечника, я пошёл во фриланс на Upwork и успешно распространял убогий код по проектам со всего мира, но потом решил, что я рождён для кода, а страдать с клиентами должен кто-то другой - и устроился в компанию. Можете почитать про это тут: Я единственный из 1400, или самый крутой рекрутинг, что я проходил.

Работа в коллективе - это самое прекрасное, что может быть для роста специалиста! Когда я устроился туда, я думал, что я очень умный, но мне достаточно быстро доказали, что ващет нет :[ Мои программы не были потокобезопасными, в базах данных не было индексов, а вместо коротких функций я просто писал полотна кода. Не то чтобы меня как-то угнетали - я просто видел, что разрабы в команде на голову выше меня.

Синдром самозванца хорошенько вдарил мне по лбу. Кого-то это выбивает из колеи, но меня только раззадоривает, и поэтому я достаточно быстро стал подтягивать свои скиллы. И вот я тут, такой, какой есть, пишу для вас статейки.

Что я делаю

🔗

«Программист — это профессиональный конвертер галлюцинаций заказчика в жесткую формальную систему.»

Есть мнение, что программисты пишут код, но я считаю, что мне платят не за код, а за то, что я думаю. Код - это лишь воплощение моих мыслей, а в иных случаях до кода может и не доходить вовсе. Например, совсем недавно я отговорил клиента делать что-то на бэкенде, потому что это уже было реализовано на фронтенде, нужно было только слегка допилить. В итоге 1) я подумал 2) я не написал ни строчки кода 3) клиент получил функционал с минимальными усилиями и затратами. С точки зрения финансов я как бы и не получил ничего, но тут другое - клиент понимает, что я его не обману и всегда постараюсь сделать всё лучшим для него способом. Со следующей задачей он придёт ко мне, да и задач всегда хватает. Win-win.

Итак, ко мне приходят клиенты с идеями или проблемами. Я стараюсь понять то, что им реально нужно (а зачастую случается проблема XY - когда клиент предлагает что-то не то). Вот я и стараюсь понять первопричину проблемы и предложить наиболее оптимальное решение или сказать, что я не тот дроид, которого они ищут.

Я питонист, но иногда приходится писать на js. Иногда приходится верстать html. Иногда поднимать контейнеры с Elastic или переносить сервисы между облачными провайдерами. Честно говоря, мне всё равно. Что не знаю - изучу, если, конечно, клиент готов за это заплатить.

Раньше всё было не так, мне было не всё равно. Раньше я считал проекты "своими" и переживал за их работоспособность и успех. Помню, как-то я отдыхал на даче, и мне написали, что нужно срочно пофиксить баг перед презентацией клиенту. Я схватил ноут и побежал в поле (там была лучше связь), забрался там на какой-то холмик и, держа ноут на весу, пытался накодить и запушить фикс. Ничего не вышло, и тогда я расстроился, но потом узнал, что встреча с клиентом прошла нормально. Ну и чего я тогда старался?! Это меня научило тому, что не так-то оно иногда и важно, и точно не стоит моих нервов. Самые важные вещи у всех разные, но это уж точно не должны быть проекты каких-то дядек.

"Свой проект" при разработке на заказ - это иллюзия, ведь ничего "своего", кроме кода и, в редких случаях, ваших идей, в них нет. Кстати, даже ваш код может быть и не ваш вовсе - интеллектуальная собственность чаще всего переходит клиенту. И вот сегодня ты работаешь над проектом, а завтра ты ушёл или тебя "ушли", или клиент закрыл проект, или пришёл джун и всё раздолбал, пока ты был в отпуске. Да что угодно! Это точно не стоит переживаний, поэтому только голый профессионализм и отчуждённость, и если даже у клиента всё горит и не работает, то я со спокойным и скучающим лицом иду всё чинить. Что это - выгорание или сеньорность?

Забавный факт: в то время, как я писал эту статью (о том, какой я классный и всё такое), мне написал клиент и сказал, что мой код не списывает деньги у покупателей, и у них из-за этого не продлевается подписка. Раньше была бы паника, а сейчас я подумал: не списывается - и ладно, бывает, в конце концов, не мы взяли лишнего, а нам не дали полагающегося. Не критично, короче. Починил, программа заработала и начала - серьёзно, блин - списывать деньги с клиентов по два раза. Я, конечно, сделал фейспалм, но, опять же, переживать сильно не стал, а подумал: это ж не Therac-25 какой-нибудь, я не облучаю людей до смерти, а просто случайно списал деньги. Бывает. Дадим 2 месяца доступа вместо одного или сделаем возврат денег. Починил, программа заработала ~~и начала облучать людей. Я подумал: ну ладно, бывает...~~ Вообще это замечательный подход: осознать, что проблема не такая уж и проблема, и вполне решаема. И это я не только про программирование ;)

Может казаться, что вовлечённость человека в проект должна играть на руку заказчику - типа программист заинтересован в развитии, будет стараться и ночей не спать. Как по мне - так наоборот. Вовлечённый человек переживает и паникует, когда всё горит. Вовлечённый человек будет сопротивляться изменениям, если они ему не нравятся. Вовлечённый человек будет делать слишком много. Мне же плевать. Если всё горит, то у меня всё равно холодная голова, и поэтому я чиню лучше. Я скажу заказчику, что он хочет хрень, но всё равно сделаю её, если ему точно надо. Я сделаю ровно столько, сколько нужно для достижения цели, и если рядом сто костылей, то я напишу сто первый, а не пойду делать мега-рефакторинг.

Как я пришёл к отчуждённости? Мы пилили проект 2 года. Два долбаных года жизни я старался как чёрт, чтобы что-то придумать и сделать лучше - и мы не пришли никуда. Софт не работал с нужной точностью, заказчик перестал появляться на созвонах, и ничего не менялось. Во что я вкладывал себя? Зачем я тратил нервы на что-то "срочное"? Почему тратил на это своё личное время и бессонные ночи? Это был корабль, который тонул, и тонул он по вине клиента - а я всё латал дыры, не видя, что мы просто идём в никуда. Прожигание себя во имя ничего. Я решил, что больше на это не попадусь.

Моя работа - про неизвестность

🔗

Постоянно, просто постоянно случается какая-то неведомая хрень.

Ну, например, на днях мне написал клиент, что приложение не работает. Если вы читаете меня, то знаете мою реакцию:

Пробую открыть сайт - виснет намертво, но и ошибки не выдаёт. Если зайти на сервер по ssh и проверить, то видно, что приложение работает. Зашёл в панель управления AWS, посмотрел "внутренний" адрес приложения типа https://my-stupid-app-123456789.us-east-1.elb.amazonaws.com - по нему всё работает.

В этот момент очень хотелось сказать "здесь наши полномочия всё, разбирайтесь с девопсом". Но девопёс пришёл бы нескоро, поэтому я решил добить вопрос самостоятельно. Полез проверять DNS записи и обнаружил, что домен ведёт на какой-то левый сервер, а не на моё уютное приложение. Пошёл гуглить про левый сервер и на каком-то треде в реддите нашёл, что такое случается, когда не продлевают домен. Написал клиенту, оказалось - у него окончился срок действия карты, и домен не проплатился.

К чему это я - вроде нанимался python разработчиком, а в результате дебажу кредитную карту клиента. И так постоянно. Если вам нужна рутинная работа с чётким набором действий - то, наверно, программирование вас не обрадует.

Правда ли про 300кк/нс

🔗

Мне 33 годика, из них лет 13 у меня жёсткое программирование, и я помидор на питоне. На нынешней работе я работаю парт-тайм, из-за NDA я не могу назвать точную цифру, поэтому я буду как Пиноккио из Шрека:

Можно посмотреть зарплаты на специализированных сайтах, вот, например, justjoin.it для Европы.

Работаю я в среднем 4 часа в день (но это прям чистое время, без перерывов и приёма пищи). Можно было бы залезть в фулл-тайм и вывозить деньги экскаваторами, но у меня есть целый список вещей, которые намного интереснее, чем лопатить чью-то джангу - поэтому я и денежку зарабатываю, и делаю какие-то свои безумные проекты для души, а иногда вот даже статьи пишу.

Вообще фишка тут в том, что зарубежные заказчики готовы платить больше. Приготовьте платочки для слёз, прежде чем смотреть, сколько зарабатывает программист в США в месяц. В зарубежных странах ставки как правило выше, чем в России, и до недавнего времени я вообще не понимал, зачем работать на тут, когда можно работать на там - то есть получается "зарабатывай там, где зарплаты выше, а живи там, где стоимость жизни ниже". Увы, "стоимость жизни ниже" стало звучать до жути буквально, а "там" нас всех банят, поэтому я не знаю, что советовать. Мой опыт больше не применим в текущих условиях.

С другой стороны, сейчас повсюду летают хищные сберы, вк и яндексы и зазывают - по крайней мере мне стучатся постоянно. Как-то я обнаглел и по фану сказал, что прошу 500к в месяц, а они взяли и согласились. Так что, как говорил Базз:

Интересно ли работать?

🔗

Когда задачи интересные - интересно, когда неинтересные - неинтересно. Ваш кэп.

Вопрос на самом деле должен быть такой: часто ли попадаются интересные задачи, или только jsonы перекладываешь?

В основном я перекладываю jsonы. Редко, но бывает, что я отстаю от графика, и приходится работать по ночам, а где-то в полночь я, как Золушка, превращаюсь в тыкву и начинаю программировать, как я это называю, "спинным мозгом" - я пишу какой-то код, он даже работает, но вот голова не понимает, что вообще я написал и зачем.

Очень часто я погружаюсь в чей-то говнокод и стараюсь добавить свой костыль так, чтобы ничего не сломалось. Это не самое весёлое занятие, знаете ли.

Но есть и интересные моменты.

Иногда я нахожу баги в коде, даже когда я уже не работаю. Как-то я отдыхал и вдруг вспомнил, что инициализировал список как [set()] * 10 вместо [set() for _ in range(10)]. Проверил - так оно и есть! Красивый баг, пойманный в уме.

Кстати, я как ребёнок радуюсь необычным и красивым багам. Вот вам лучшие, только зацените:

Deadlock

🔗

Как-то наше flask-приложение стало зависать намертво. Я полез дебажить и обнаружил, что программа стопорилась на строчке soup = BeautifulSoup(html, 'lxml'). Это просто парсинг html при помощи супер-популярной библиотеки, какого хрена? Взял этот html, запустил на своём компе - работает без ошибок. Запустил на сервере в терминале - работает без ошибок. Запустил на flask - виснет. Ставки, господа?

Если у вас сервер apache2, на нём стоит mod_uwsgi, и вы запускаете lxml, то случается deadlock где-то в python GIL. Наверно. Что это было - я так и не понял, но это настолько неочевидно, что я впал в осадок. Мой друг Кристофер Нолан успел меня сфотографировать в тот момент:

Кстати, это именно я добавил "lxml", чтобы парсинг работал быстрее, а он вместо этого повесил всё приложение... Потому и погромист.

Двойные списания

🔗

В субботу утром (!) мне пишет клиент, что моя библиотека списывает деньги с клиентов дважды (собственно, упоминал об этом выше). Моя библиотека! Да там 170, мать их, тестов, скорее, клиент грибов поел или марсиане списывают деньги, чем мой код.

Тем не менее я смотрю в админку и вижу, что действительно деньги списываются дважды. Я не переживаю, мне наоборот хорошо - наконец-то что-то интересное!

Вот код для тех, кто в теме:

@transaction.atomic
def _charge_recurring_subscription(
    subscription: Subscription,
    schedule: Iterable[timedelta],
    at: datetime,
    lock: bool = True,
):
    if lock:
        # here we lock specific subscription object, so that we don't try charging it twice
        # at the same time
        _ = Subscription.objects.filter(pk=subscription.pk).select_for_update(of=('self',))

    log.debug('Processing subscription %s', subscription)

    expiration_date = subscription.end

    charge_dates = [expiration_date + delta for delta in schedule]
    charge_periods = pairwise(charge_dates)
    # ... и далее по тексту

Тут транзакция, в ней мы делаем SELECT FOR UPDATE, что блокирует строку в базе данных до конца транзакции. Два снятия одновременно просто невозможны. Этот код проверял мой коллега на code review, а сейчас наш CEO ещё раз перечитал этот код, зная про двойные списания, и ничего не нашёл. Увидели ошибку?

В django все запросы к базе - ленивые, и строчка _ = Subscription.objects.filter(...) только создавала запрос, но не выполняла его, поэтому запись не блокировалась! Код выше заставляет человека фокусироваться на том, что автор хотел сделать, а не что этот код реально сделает.

Фикс - например, добавить list(_), чтобы заставить Джанго выполнить запрос:

_ = Subscription.objects.filter(pk=subscription.pk).select_for_update(of=('self',))
list(_)

Ну не красота ли?

Уязвимости

🔗

Чем больше понимаешь, как устроены некоторые технологии, тем интересней всё исследовать и находить уязвимости. Я любопытный, поэтому chrome dev tools и postman - мои любимые друзья. Благодаря им:

  • я находил уязвимости на Хабре (1, 2, 3)
  • в одном из сервисов, которым пользовалась наша компания, смог читать приватные данные и постить сообщения от лица коллег;
  • ещё один сервис не давал редактировать какое-то поле, но если через chrome dev tools убрать с него атрибут disabled, то можно было редактировать как хочешь; постоянно этим пользуюсь на разных сайтах, которые думают, что могут мне что-то запретить
  • как-то даже нашёл уязвимость на сайте местной пиццерии и получил коды от всех подъездов в городе; я почти почувствовал себя ключником из матрицы, хотя коды так и не пригодились
  • на одном сайте можно было в корзине отредактировать цену товара и поставить такую, какая нравится... скинул себе цену рублей на 50 just for lulz

Такой вот интересный побочный эффект.

Комплексы

🔗

Про синдром самозванца я уже упоминал выше.

Бывало раньше и такое, что я чувствовал себя неловко, что залипал на какой-то задаче, например, разгребая тонны спагетти-кода. Сначала я переживал, что клиент ожидал 1 час работы, а я потратил все 10, но потом я стал думать: ну а если бы не было меня, а был кто-то другой, то что? Сумел бы джун сделать всё как надо? Сумел бы кто-нибудь сделать это быстрее, если он ничего не знает, а у меня весь проект в голове? Скорее всего, я со своими 10 часами - самое оптимальное решение проблемы для клиента, а если он так не считает - то пусть так и скажет, и решим это как цивилизованные люди - за гаражами.

За всё время никто так и не сказал ничего подобного. Очень часто проблемы живут только у нас в голове. И это я не только про программирование ;)

Социализация

🔗

Говорят, что у программистов есть всякие проблемы в социальном плане, вместо секса с девушками у них секс с линуксом, а вместо того, чтобы просто позвонить по телефону, они находят полуживой сайт компании и пишут там в форму обратной связи.

Да нет, с этим всё нормально. А то что у меня отвалились драйвера nvidia, и сегодня я всё утро занимался сексом с линуксом... Ладно, ладно, есть некоторые проблемы. Но что причина, а что следствие - я не знаю: то ли я мало общаюсь, и поэтому программирую, то ли я программирую, и поэтому мало общаюсь, то ли это работает в обе стороны.

Добавьте к этому то, что я никогда не работал в офисе, а все немногочисленные друзья разбежались по разным странам - и получится Голлум

Но всё-таки, насколько бы ни был "погромист обыкновенный" асоциальным, мне кажется, что без социума наш вид вымрет. Не зря говорят "один в репо не воин" - код ревью от товарищей в компании не раз спасал проекты от моих "гениальных" идей, и очень часто я узнавал что-то новое и иначе смотрел на проблему. Нужно учиться общаться и дружить - например, когда сам делаешь код ревью, необходимо проявлять толерантность: разносить коллег за их код не очень хорошо. У меня на работе был чувак, который писал такой ужасный код, что я еле сдерживался, чтобы не выдать, что я об этом думаю. Вот так я делал ревью:

Кстати, лайфхак: если оцениваете чью-то работу, старайтесь отмечать не только ошибки, но и что-то, что вам понравилось. Я постоянно пишу фидбеки кандидатам на нашу вакансию, и хорошего там гораздо больше, чем критики. Тут обыгрываются две идеи:

  • Если написать только плохое, то на вас обидятся; если написать хорошее и плохое, то к вам прислушаются.
  • Отругайте человека - и он забудет это через неделю. Похвалите человека - и он будет помнить об этом всю жизнь.

Это, кстати, не только про программирование ;)

Отдыхаешь тоже за компом?

🔗

Ну да, а что?

Можно позалипать на Ютюбе. Можно написать какую-нибудь интересную программу. Можно почитать Хабр. Можно написать статью. Заметьте, что я стараюсь не только потреблять контент, но и что-то создавать, ведь это приносит даже больше удовольствия.

Так уж получилось, что многое из того, что мне интересно, доступно только через комп. Увы.

Правда, с пет-проектами (a.k.a. проектами для души, а не денег) в последнее время стало похуже, потому что раньше я думал, какой бы сервис сделать, а теперь я думаю, зачем это вообще надо в данной ситуации. Ну вы понимаете :( Но всё же подвижки есть. Ну вот я пишу игровой фреймворк cat-400 на хипстерском языке nim.

Нужно ли быть умным, чтобы погромировать

🔗

Обычно все мои статьи - если они про меня - высмеивают мою тупость, так что я как бы намекаю: не нужно быть очень умным и не нужно всё знать, чтобы нормально жить. А вот быть упорным - обязательно. Выбейте себе на руке татуху "stubborn" и смотрите на неё постоянно до просветления.

Вот ещё пара советов для тех, кто не мегамозг:

  • Если ничего не получается, то бросьте всё нафиг, поспите, и завтра утром всё получится. Я не знаю как, но это РАБОТАЕТ.
  • Если непонятно, что делает код, то разбейте его на небольшие функции и дайте функциям и переменным нормальные названия.
  • С первого раза не заработает. Я помню случаи из всей своей жизни, когда я что-то написал, и оно заработало с первого раза - их ТРИ.
  • Работайте в команде более опытных людей или найдите ментора - очень важно, чтобы кто-нибудь говорил вам, насколько ваш код ужасен, иначе вы, как и я, будете жить годы в пузыре собственного невежества и думать, что всё норм

Прокрастинация, выгорание и тлен

🔗

После каждого отпуска я ненавижу работу.

Энтузиазма уже не так много. Помню, когда я только начинал свою карьеру, докеров не завезли, и я настраивал вручную postgres, uwsgi, nginx, postfix, dovecot, opendkim и ещё кучу всякой хрени, чтобы у меня был сервер с сайтом и почтой. Да что вы знаете о страдании? Сейчас я использую метод "закидать проблему деньгами": ищу сервис или человека, который уже всё делает за меня, плачу им, и пусть мучаются сами.

Но периодически всё равно накатывает "а что за хрень я делаю, может бросить погромирование и пойти продавать овощи на рынке", и у меня есть персональный рецепт, как держать себя в тонусе:

  • Заставьте себя начать. Двигать что-то, когда оно стоит на месте, тяжело, а когда оно уже двигается - несравненно легче.
  • Договоритесь (с начальником или со своей головой), какое минимальное кол-во часов / задач / что-там-у-вас в день вы должны отработать; это должно быть небольшое число, чтобы почти гарантированно его достичь. Когда отработал норму и осознаёшь, что свободен, то хочется работать ещё - типа вот какой я молодец. Когда знаешь, что до нормы ещё очень далеко - то руки опускаются и это сильно демотивирует.
  • Однажды боги спустились с небес и дали человеку огонь, но если б вместо этого они дали ему pomodoro timer, то мы бы уже бороздили другие галактики! Мой любимый - focusmeter. Включаем таймер и работаем 30 минут - это очень просто! Потом отдыхаем 5 минут и отработаем ещё 30 минут. Опа, уже час пройден! Помидорный таймер помогал мне делать самую скучную и ненавистную работу на свете, ведь голова видит конец этого ужаса совсем близко - всего-то через 30 минут!
  • Некоторые проекты действительно бесят и/или заставляют грустить, но очень важно проявить профессионализм - поэтому просто скажите, что проект - хрень полная, и работать над ним вы больше не будете. Ладно, не всегда такое возможно, но вы правда хотите тратить свою жизнь на то, что вам совсем не нравится?
  • У меня сейчас около 7 параллельных проектов. Кому-то такое не по душе, а мне самое то - я просто не успеваю устать от проекта, потому что часто переключаюсь.

И чо

🔗

Такой вот срез программиста в вакууме. Может, вы узнали что-то новое, или какая-нибудь моя идея заставила вас пересмотреть взгляд на некоторые вещи - я был бы рад. Где не прав - бейте в комментариях, я знал, на что иду :)

Эта статья, как я уже говорил, должна была выйти в одной из рубрик контент-студии Хабра, но как только я узнал, что, возможно, будет реклама каких-то курсов, то пришлось прервать сотрудничество. Быстрая упаковка знаний в голову - это, несомненно, здорово, но я боюсь, что курсы не упакуют главное: любовь к программированию. Я тащусь от программирования, меня прёт с него, а уж когда моё приложение не падает в первые 10 минут - это вообще восторг. Программирование - это, блин, стиль жизни, это восхищение изящными решениями, это отчаяние из-за того что опять нихрена не работает непонятно почему, это возможность творить, создавать и ломать. И если вы испытываете что-то подобное, то курсы вам нафиг не нужны, а если нет - то курсы вам не помогут. Как считаете?



Новое