Что для меня значит быть программистом
Как-то мне написали с Хабра и сказали: Саня, хочешь написать статью про программистов?
Разумеется, я отнёсся к этому скептически. Ладно там девопсины или вайтхэты какие - почитать про них было бы интересно, но вот жизнь программиста... Я сразу вспомнил эти мемы, которые на самом деле не мемы, а правда (см. картинку).
Но потом я начал накидывать мысли и внезапно нашёл много тем, которые могут быть интересны и самим разрабам, и людям, далёким от программирования. Так что вот вам исповедь погромиста. Уж не знаю, типичный я программист или какой-то чудак. Пишу так, как вижу, а обобщать на всех прогеров или нет - решать вам.
Ты кто вообще такой?
🔗Я ненавижу статьи-биографии и интервью каких-то неизвестных чуваков вроде меня. Поэтому я напишу тут лишь краткую предысторию, просто чтобы вы не думали, что я родился уже с ноутбуком и первыми моими словами были 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 минут - это вообще восторг. Программирование - это, блин, стиль жизни, это восхищение изящными решениями, это отчаяние из-за того что опять нихрена не работает непонятно почему, это возможность творить, создавать и ломать. И если вы испытываете что-то подобное, то курсы вам нафиг не нужны, а если нет - то курсы вам не помогут. Как считаете?