What does being a programmer mean to me
Once they wrote to me from Habra and said: Sanya, do you want to write an article about programmers?
Of course, I was skeptical. Okay, there are some devopsins or whitehats – it would be interesting to read about them, but this is the life of a programmer… I immediately remembered these memes, which are not really memes, but the truth:
But then I started sketching my thoughts and suddenly found many topics that may be interesting to both the developers themselves and people who are far from programming. So here is the confession of a pogrom. I don’t know if I’m a typical programmer or some weirdo. I write as I see it, and whether to generalize to all losers or not is up to you.
Contents
Who are you anyway?
I hate biographical articles and interviews of some unknown dudes like me. So I’ll just write a short background here, just so you don’t think I was born with a laptop and my first words were git pull && docker-compose up
.
I unlearned right here, it’s not just a square bracket on the side, but VMK MSU. When I got there I thought I was very smart, but I was quickly proven wrong.[
Завершив карьеру троечника, я пошёл во фриланс на 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 я не могу назвать точную цифру, поэтому я буду как Пиноккио из Шрека:
На самом деле у нас есть объявление о найме, и там написано “$45-70 в час”, а работаю я в среднем 4 часа в день (но это прям чистое время, без перерывов и приёма пищи), что даёт, с учётом безумного курса, минимум $3600 в месяц, или 338 000р.
Можно было бы залезть в фулл-тайм и вывозить деньги экскаваторами, но у меня есть целый список вещей, которые намного интереснее, чем лопатить чью-то джангу – поэтому я и денежку зарабатываю, и делаю какие-то свои безумные проекты для души, а иногда вот даже статьи пишу.
Вообще фишка тут в том, что зарубежные заказчики готовы платить больше. Приготовьте платочки для слёз, прежде чем смотреть, сколько зарабатывает программист в США в месяц. В зарубежных странах ставки как правило выше, чем в России, и до недавнего времени я вообще не понимал, зачем работать на тут, когда можно работать на там – то есть получается “зарабатывай там, где зарплаты выше, а живи там, где стоимость жизни ниже”. Увы, “стоимость жизни ниже” стало звучать до жути буквально, а “там” нас всех банят, поэтому я не знаю, что советовать. Мой опыт больше не применим в текущих условиях.
С другой стороны, сейчас повсюду летают хищные сберы, вк и яндексы и зазывают – по крайней мере мне стучатся постоянно. Как-то я обнаглел и по фану сказал, что прошу 500к в месяц, а они взяли и согласились. Так что, как говорил Базз:
Но это для сеньора. Джунам – мои соболезнования.
Интересно ли работать?
Когда задачи интересные – интересно, когда неинтересные – неинтересно. Ваш кэп.
Вопрос на самом деле должен быть такой: часто ли попадаются интересные задачи, или только jsonы перекладываешь?
В основном я перекладываю jsonы. Редко, но бывает, что я отстаю от графика, и приходится работать по ночам, а где-то в полночь я, как Золушка, превращаюсь в тыкву и начинаю программировать, как я это называю, “спинным мозгом” – я пишу какой-то код, он даже работает, но вот голова не понимает, что вообще я написал и зачем.
Очень часто я погружаюсь в чей-то говнокод и стараюсь добавить свой костыль так, чтобы ничего не сломалось. Это не самое весёлое занятие, знаете ли.
Но есть и интересные моменты.
Иногда я нахожу баги в коде, даже когда я уже не работаю. Как-то я отдыхал и вдруг вспомнил, что инициализировал список как [set()] * 10
instead [set() for _ in range(10)]
. I checked – that’s how it is! A beautiful bug caught in the mind.
By the way, like a child, I rejoice in unusual and beautiful bugs. Here are the best ones for you, just rate them:
Deadlock
Somehow our flask application began to freeze. I went to chat and found that the program stopped at a line soup = BeautifulSoup(html, 'lxml')
. It’s just parsing html using a super popular library, what the hell? I took this html, ran it on my computer – it works without errors. Ran it on the server in the terminal – works without errors. Started on flask – hangs. Bets, gentlemen?
If you have a server apache2
stands on it mod_uwsgi
and you run lxml
, then a deadlock occurs somewhere in the python GIL. Apparently. What it was – I never understood, but it is so unclear that I fell into a slump. My friend Christopher Nolan managed to photograph me at that moment:
By the way, I added this "lxml"
so that the parsing would work faster, but instead it hung the whole program… That’s why the pogromist.
Double write-offs
On Saturday morning (!) a client writes to me that my library is deducting money from clients twice (actually, I mentioned it above). My library! But there are 170, to have them, tests, rather, the client ate mushrooms or the Martians write off money, than my code.
Nevertheless, I look in the admin and see that the money is really debited twice. I’m not worried, on the contrary, I feel good – finally something interesting!
Here’s the code for those on the thread:
@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)
# ... и далее по тексту
Here is a transaction, in it we do SELECT FOR UPDATE
which locks the row in the database until the end of the transaction. Two withdrawals at the same time simply impossible. This code was checked by my colleague on code review, and now our CEO re-read this code, knowing about double write-offs and found nothing. See an error?
In django, all requests to the base are lazy, and a string _ = Subscription.objects.filter(...)
only created a request, but did not execute it, so the record was not blocked! The code above forces the person to focus on what the author is wanted to dorather than what this code will actually do.
Fix – for example, add list(_)
to force Django to execute the request:
_ = Subscription.objects.filter(pk=subscription.pk).select_for_update(of=('self',))
list(_)
Well, isn’t it beauty?
Vulnerabilities
The more you understand how certain technologies work, the more interesting it is to explore everything and find vulnerabilities. I’m curious, so chrome dev tools and postman are my favorite friends. Thanks to them:
-
I found vulnerabilities on Habra (1, 2, 3, 4)
-
in one of the services used by our company, he was able to read private data and post messages on behalf of colleagues;
-
another service did not allow editing a certain field, but if you remove an attribute from it through chrome dev tools
disabled
, then you could edit as you want; I use it all the time on various sites that think they can ban me -
somehow even found a vulnerability on the website of a local pizzeria and got codes from all the entrances in the city; I almost felt like a master of the matrix, although I never needed the code
-
on one site, you could edit the price of the product in the basket and put the one you like… I dropped the price by 50 hryvnias.
Such an interesting side effect.
Complexes
I have already mentioned the impostor syndrome above.
There have also been times when I’ve felt awkward about getting stuck on a task, like digging through tons of spaghetti code. At first, I was worried that the client was waiting for 1 hour of work, and I spent all 10, but then I began to think: well, if I wasn’t there, and someone else was, then what? Would June be able to do everything right? Would anyone be able to do it faster if they don’t know anything and I have the whole project in my head? Most likely, I with my 10 hours are the most optimal solution to the problem for the client, and if he does not think so, then let him say so, and we will solve it as civilized people – behind the garages.
No one has ever said anything like that. Very often, problems live only in our heads. And I’m not just talking about programming 😉
Socialization
They say that programmers have all sorts of problems socially, instead of having sex with girls, they have sex with Linux, and instead of just calling, they find a half-live company website and write in the feedback form there.
But no, everything is fine with that. And the fact that my nvidia drivers fell off, and today I was having sex with Linux all morning… Okay, okay, there are some problems. But what is the cause and what is the consequence – I don’t know: whether I don’t communicate much, and therefore I program, or I program, and therefore I don’t communicate much, or it works both ways.
Add to that the fact that I have never worked in an office, and all the few friends I have scattered to different countries – and you get Gollum
But still, no matter how antisocial the “ordinary rioter” is, it seems to me that without society our species will die out. It’s not for nothing that they say “one in the repo is not a warrior” – code review from colleagues in the company saved projects from my “genius” ideas more than once, and very often I learned something new and looked at the problem differently. You need to learn to communicate and make friends – for example, when you do a code review yourself, you need to show tolerance: it’s not very good to beat up your colleagues for their code. I had a dude at work who wrote such terrible code that I could barely keep myself from giving away what I thought about it. This is how I roared:
By the way, a life hack: if you evaluate someone’s work, try not only to note mistakes, but also something that you liked. I constantly write feedback to candidates for our vacancy and there are much more good things than critics. Two ideas are at play here:
-
If you write only bad things, you will be offended; if you write good and bad, you will be listened to.
-
Scold a person – and he will forget it in a week. Praise a person – and he will remember it for the rest of his life.
This, by the way, is not only about programming;)
Do you also rest at the computer?
Well, so what?
You can watch it on YouTube. You can write some interesting program. You can read Habr. You can write an article. Note that I try not only to consume content, but also to create something, because it is more satisfying.
It just so happened that much of what interests me is available only through a computer. Unfortunately.
However, with pet-projects (aka projects for the soul, not money) lately it has become worse, because before I was thinking about what kind of service to do, and now I think why it is even necessary in this situation. Well, you understand 🙁 But still, there is a shift. Well, I’m writing a cat-400 game framework in the hipster language nim.
Do you have to be smart to smash?
Usually all my articles – if they are about me – make fun of my stupidity, so I kind of hint: you don’t need to be very smart and you don’t need to know everything to live a normal life. But being persistent is a must. Get a “stubborn” tattoo on your arm and look at it constantly until enlightenment.
Here are a couple more tips for those who are not megabrained:
-
If nothing works, then throw it all away, sleep, and tomorrow morning everything will work out. I don’t know how, but it WORKS.
-
If it’s not clear what the code does, break it up into small functions and give the functions and variables normal names.
-
It won’t start working the first time. I remember cases in my entire life when I wrote something and it worked the first time – THREE of them.
-
Work in a team of more experienced people or find a mentor – it’s very important to have someone tell you how terrible your code is, otherwise you, like me, will live for years in a bubble of your own ignorance and think everything is fine
Procrastination, burnout and decay
After every vacation I hate work.
Enthusiasm is not so much anymore. I remember when I was just starting my career, docker was not imported, and I manually configured postgres, uwsgi, nginx, postfix, dovecot, opendkim and a bunch of other things to have a server with a site and mail. But what do you know about suffering? Now I use the method “throw the problem with money”: I look for a service or a person who already does everything for me, pay them, and let them suffer themselves.
But from time to time I still feel like “what the hell am I doing, I can quit pogrom and go sell vegetables at the market”, and I have a personal recipe for keeping myself in good shape:
-
Force yourself to start. It is difficult to move something when it is standing still, but when it is already moving it is incomparably easier.
-
Agree (with your boss or your head) the minimum number of hours / tasks / what-have-you per day you should work; it has to be a small amount to be almost guaranteed to reach it. When you have worked the norm and realize that you are free, then you want to work more – like, what a good man I am. When you know that the norm is still very far away – hands go down and it is very demotivating.
-
Somehow the gods came down from heaven and gave man fire, but if instead they gave him a pomodoro timer, then we would already be furrowing other galaxies! My favorite is focusmeter. Turn on the timer and work for 30 minutes – it’s very simple! Then we rest for 5 minutes and work for another 30 minutes. Oops, it’s already been an hour! The tomato timer helped me do the most boring and hated work in the world, because the head sees the end of this horror very close – in just 30 minutes!
-
Some projects really suck and/or make you sad, but it’s very important to show professionalism – so just say that the project sucks and you won’t work on it anymore. Okay, it’s not always possible, but do you really want to spend your life doing something you don’t enjoy at all?
-
I currently have about 7 parallel projects. Some people don’t like it, but that’s exactly the case for me – I just don’t have time to get tired of the project, because I often switch.
And what
This is a slice of a programmer in a vacuum. Maybe you learned something new, or some of my ideas made you reconsider some things – I would be glad. Where is wrong – hit me in the comments, I knew what I was getting into 🙂
This article, as I already said, was supposed to appear in one of the sections of the Habra content studio, but as soon as I found out that, maybe, If there will be advertising of any courses, then cooperation had to be interrupted. Quickly packing knowledge into your head is definitely great, but I’m afraid that the courses don’t pack the main thing: love for programming. I’m drawn to programming, I love it, and when my program doesn’t crash in the first 10 minutes, it’s a delight. Programming is, well, a lifestyle, it’s a fascination with sophisticated solutions, it’s despair due to the fact that the hell doesn’t work again, it’s unclear why, it’s an opportunity to create, create and break. And if you feel something similar, then you don’t really need the courses, and if not, the courses won’t help you. What do you think?
By the way, I hate non-technical articles, so 1) the previous ones are here 2) the next ones will be with code and technical array as you like. Crawl into the visa so you don’t miss: Pogromist’s blog