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

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

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

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

Я ненавижу статьи-биографии и интервью каких-то неизвестных чуваков вроде меня. Поэтому я напишу тут лишь краткую предысторию, просто чтобы вы не думали, что я родился уже с ноутбуком и первыми моими словами были 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 я не могу назвать точную цифру, поэтому я буду как Пиноккио из Шрека:

На самом деле у нас есть объявление о найме, и там написано "$45-70 в час", а работаю я в среднем 4 часа в день (но это прям чистое время, без перерывов и приёма пищи), что даёт, с учётом безумного курса, минимум $3600 в месяц, или 338 000р.

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

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

С другой стороны, сейчас повсюду летают хищные сберы, вк и яндексы и зазывают - по крайней мере мне стучатся постоянно. Как-то я обнаглел и по фану сказал, что прошу 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, 4)

  • в одном из сервисов, которым пользовалась наша компания, смог читать приватные данные и постить сообщения от лица коллег;

  • ещё один сервис не давал редактировать какое-то поле, но если через chrome dev tools убрать с него атрибут disabled, то можно было редактировать как хочешь; постоянно этим пользуюсь на разных сайтах, которые думают, что могут мне что-то запретить

  • как-то даже нашёл уязвимость на сайте местной пиццерии и получил коды от всех подъездов в городе; я почти почувствовал себя ключником из матрицы, хотя коды так и не пригодились

  • на одном сайте можно было в корзине отредактировать цену товара и поставить такую, какая нравится... скинул себе цену рублей на 50 just for lulz

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

Комплексы

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

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

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

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

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

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

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

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

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

  1. Если написать только плохое, то на вас обидятся; если написать хорошее и плохое, то к вам прислушаются.

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

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

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

Ну да, а что?

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

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

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

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

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

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

  • Если ничего не получается, то бросьте всё нафиг, поспите, и завтра утром всё получится. Я не знаю как, но это РАБОТАЕТ.

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

  • С первого раза не заработает. Я помню случаи из всей своей жизни, когда я что-то написал, и оно заработало с первого раза - их ТРИ.

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

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

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

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

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

  • Заставьте себя начать. Двигать что-то, когда оно стоит на месте, тяжело, а когда оно уже двигается - несравненно легче.

  • Договоритесь (с начальником или со своей головой), какое минимальное кол-во часов / задач / что-там-у-вас в день вы должны отработать; это должно быть небольшое число, чтобы почти гарантированно его достичь. Когда отработал норму и осознаёшь, что свободен, то хочется работать ещё - типа вот какой я молодец. Когда знаешь, что до нормы ещё очень далеко - то руки опускаются и это сильно демотивирует.

  • Однажды боги спустились с небес и дали человеку огонь, но если б вместо этого они дали ему pomodoro timer, то мы бы уже бороздили другие галактики! Мой любимый - focusmeter. Включаем таймер и работаем 30 минут - это очень просто! Потом отдыхаем 5 минут и отработаем ещё 30 минут. Опа, уже час пройден! Помидорный таймер помогал мне делать самую скучную и ненавистную работу на свете, ведь голова видит конец этого ужаса совсем близко - всего-то через 30 минут!

  • Некоторые проекты действительно бесят и/или заставляют грустить, но очень важно проявить профессионализм - поэтому просто скажите, что проект - хрень полная, и работать над ним вы больше не будете. Ладно, не всегда такое возможно, но вы правда хотите тратить свою жизнь на то, что вам совсем не нравится?

  • У меня сейчас около 7 параллельных проектов. Кому-то такое не по душе, а мне самое то - я просто не успеваю устать от проекта, потому что часто переключаюсь.

И чо

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

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

Кстати, я ненавижу не технические статьи, поэтому 1) предыдущие тут 2) следующие будут с кодом и техническим месивом, как вы любите. Заползайте в телегу, чтобы не пропустить: Блог погромиста

Комментарии (59)


  1. NelEvg
    20.08.2023 13:36
    +33

    Большинство прогеров думают что пробились к вершинам, но на самом деле они просто туда всплыли (с)


  1. gotoroho
    20.08.2023 13:36
    +6

    Спецы формируются через страдания. И это, кстати, не только про программирование ;)


  1. gev
    20.08.2023 13:36
    +12

    Мыши страдали, но продолжали жрать питона!


    1. blind_oracle
      20.08.2023 13:36
      +3

      Душить


  1. truthseeker
    20.08.2023 13:36
    +7

    Спасибо за статью. Интересно. В первую очередь ваше отношение к жизни, и психологические трюки, интересны. Описанные вами методы и в других сферах работают. Как минимум, в системном администрировании отстранённость тоже очень помогает не паниковать, и решать проблему на холодную голову, рассмотрев её с разных сторон.


  1. LyuMih
    20.08.2023 13:36
    +1

    С пет проектами похожая ситуация.
    Вроде бы раньше хотел сделать все и сразу… И выгарал, пока доводил страницу/код до идеального состояния.


    А теперь просто думаю, зачем что-то делать самому/своё, если можно взять готовое и накидать контента и получится то, что хотел.


  1. vitaly_il1
    20.08.2023 13:36
    +13

    "Мне 33 годика"

    А мне через пару месяцев 60. Но в целом все так.
    По частностям - я последние 10 лет фрилансер, лет 25 назад перешел из программистов в юникс сисадмина, а потом, ес-но, в девопс.


  1. Tasta_Blud
    20.08.2023 13:36
    +2

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

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


    1. Krawler
      20.08.2023 13:36
      +1

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

      Я думаю, что вот все эти стереотипы про программист_ов они либо про очень сильно запаренных работой и выгоревших, либо еще что.

      P.S. Если взять просто человека с диагностированной депрессией, то он, внезапно, хорошо подойдет почти под все стереотипы, если подумать
      А процент каких-либо психических особенностей/расстройств у программист_ов выше, чем в среднем по популяции


    1. 0xd34df00d
      20.08.2023 13:36

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


      1. Krawler
        20.08.2023 13:36
        +2

        А шо ж тогда к девушкам от мужчин столько претензий по поводу этого самого "бессмысленного" слежения за собой? Или это другое?


        1. 0xd34df00d
          20.08.2023 13:36
          +1

          Не могу отвечать за всех мужчин, они меня послом не уполномочили, извините.


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


          1. Krawler
            20.08.2023 13:36
            +1

            Вполне адекватны, так как это область интересов и круто, когда интересы сходятся Вообще тут как бы ответ простой - если один из партнеров забивает на внешность, то глупо ожидать не забивания на внешность от другого


            1. 0xd34df00d
              20.08.2023 13:36

              Вполне адекватны

              ИМХО нет, как минимум потому, что это сужает количество потенциальных партнёрш практически до нуля, да и слишком привязывает отношения к моим текущим интересам, а они могут меняться.


              так как это область интересов и круто, когда интересы сходятся

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


              Вообще тут как бы ответ простой — если один из партнеров забивает на внешность, то глупо ожидать не забивания на внешность от другого

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


  1. DistortNeo
    20.08.2023 13:36
    +2

    а работаю я в среднем 4 часа в день (но это прям чистое время, без перерывов и приёма пищи)

    И это правильно.
    Во-первых, при офисной работе из 8 часов на собственно работу хорошо, если уходит половина.
    А во-вторых, каждый последующий час приводит к накоплению усталости и снижению КПД. Не получится зарабатывать в 2 раза больше, тратя на работу в 2 раза больше времени.


    1. K_Chicago
      20.08.2023 13:36
      +4

      каждый последующий час приводит к накоплению усталости и снижению КПД. Не получится зарабатывать в 2 раза больше, тратя на работу в 2 раза больше времени.

      хм...а вы уверены что это не про копание канав или рубку дров?

      ну, возможно это похоже на будни код-фризера на нелюбимой работе с которой мечтаешь уйти каждый день.

      Мой пойнт - а я люблю когда каждый последующий час приводит ко все большему погружению, КПД стремится к упору, работа кипит и двигается,двигается, двигается...

      отвлечемся от "офисного окружения", говорю просто о сферическом случае в вакууме: день начался, я сижу перед компом, мне нужно начать и кончить implementation какой-нибудь функциональности.

      несколько часов я прокрастинирую. Наконец, весь интернет прочитан, кофе выпит, пончики съедены, и начинаю потихонечку, по чуть-чуть, baby steps, подбивать клинья к этой задаче. "немножко попашет, попишет стихи". написал строчку, проверил как там пикабу; написал еще полторы, а как там хабр. И "незаметно, незаметно, незаметно. Подступает, все ближе подступает, несказанное желанное такое..." вхождение в "зону". Обнаруживаю, что работа кипит. Гуглю, пишу, компиляю, матерюсь на непонятки, гуглю, пишу...

      И вот ваш "каждый последующий час приводит" ко все большей интенсивности работы, над макушкой уже вьется дымок, время летит как с цепи сорвавшись, солнце просто несется от полудня к соседнему лесу, приложение уже дышит, хрипло и с перерывами, но все яснее...Если в офисе - стало приятнее, оказывается все уже ушли домой, сбегал на кухню и заварил себе любимому совсем свежий кофейник едрёного, и часы пролетают. "усталость"? черт ее знает, она где-то там, пока не ощущается, и наконец задача в общем готова, даже навесил всяких фенечек с обработкой исключений, и даже каментов насыпал...Всё, по-домам, на улице темно, в паркинге моя лошадка уже стоит сиротливо, еду домой по почти пустым улицам. Вот тут усталость и хысь! В голове пусто и гулко, дома тупо гоняю Kingdom Rush, забираюсь в койку и всю ночь компиляю какой-то бред, один из типичных кошмаров от мозга который перегрелся, утром тащусь обратно в офис никакой и первые два часа вообще тупо пью кофе.

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

      А если без этого, начать утречко со свежего кофе и много, раскачаться часа через 2-3, и снова въехать в эту сладкую "фазу", и в конце дня видеть живыми новые только что накодированые фичи...вот за это я и люблю свою работу.


  1. vkomp
    20.08.2023 13:36

    Хорошая летняя статья. Спасибо!
    Это особенно зашло: "Если непонятно, что делает код, то разбейте его на небольшие функции и дайте функциям и переменным нормальные названия."
    Многое в статье вижу про "эмоциональный капитал", который не получить никак кроме через пережить самому. Потому для офисных джунов это ересь - мир совсем другой. Отлучался из программирования на 10+ лет в недвижимость - сделки между людьми на критичные суммы очень нехило прокачивают этот скилл.


  1. dyadyaSerezha
    20.08.2023 13:36
    +5

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

    А чел, который берет интервью у себя самого, называется "не интересный никому, кроме себя". К сожалению, такой вариант отсутствует в списке ответов. ????


  1. ubuntuandrew
    20.08.2023 13:36

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

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


  1. dsh2dsh
    20.08.2023 13:36
    +4

    зачем работать на тут, когда можно работать на там

    В 33 года я тоже так думал. Десяток лет спустя у меня той работы не стало. За последние два года такой работы я больше найти не смог. И хотя я не в России, думаю, в этом вопросе это ничего особо не меняет. Американские компании не хотят нанимать людей, не находящихся легально в США. Все remote вакансии неявно предполагают, что кандидат должен легально находится в США. За два года я пожалуй встретил только два исключения, когда целенаправленно искали за пределами США. И вторая проблема. Они теперь стали хитромордыми и либо ищут людей, что бы платить им по локальному рынку, либо открывают филиалы, что бы нанимать локально, т.е., опять же, что бы платить по локальному рынку.

    А пока та работа у меня была, я тоже думал, и зачем люди за "копейки" работают локально, если можно удалённо работать за гораздо большие деньги.


    1. dalerank
      20.08.2023 13:36

      Они всегда так делали, не могу сказать как было до 2007, но когда начал работать с американцами сразу стало понятно что они платят по местному рынку, но может немного больше. Просто платят в баксах, а после резкого скачка курса вдруг оказывается что и зп подросла. Но это все потом нивелируется разными оговорками, снижением часов и сроков. И гдето через годик все опять приходит к местному уровню. Попытки получить ставки побольше натыкались на требования жить поближе к сюзерену ;)


      1. dsh2dsh
        20.08.2023 13:36
        +1

        Полагаю, что мне сильно повезло, но мне 15 лет платили по американскому рынку. Собственно, по прошествии двух лет, уже не полагаю, а я просто уверен, что мне крупно повезло тогда.


      1. Politura
        20.08.2023 13:36
        +2

        Но это все потом нивелируется разными оговорками, снижением часов и сроков. И гдето через годик все опять приходит к местному уровню. Попытки получить ставки побольше натыкались на требования жить поближе к сюзерену ;)

        Думаю сильно от работодателя зависит. Работал с 2007 по 2013 год на одну американскую компанию удаленно из российской глубинки, ЗП в долларах за этот период все время росла, с 1500 доросла до 3500.


        1. dsh2dsh
          20.08.2023 13:36
          +3

          Понимаете, это всё те же самые "копейки". Мне известен, за тот же период, рост до 11000. Мне кажется, своим примером вы как раз подтвердили комментарий, на который отвечали.


    1. tommyangelo27
      20.08.2023 13:36

      Удивлён, что вы вообще нашли американскую контору, которая платила по ставкам США человеку, который в США не находится. Я с американцами работаю с 2013 года, и ни разу с таким не сталкивался????. Они всегда искали людей в Европе, Индии или Китае целенаправленно, чтобы меньше платить.


      1. dsh2dsh
        20.08.2023 13:36

        Да, теперь я тоже удивлён, что мне так повезло. Правда - это ещё и грустно.


    1. Femistoklov
      20.08.2023 13:36

      Они теперь стали хитромордыми и либо ищут людей, что бы платить им по локальному рынку, либо открывают филиалы, что бы нанимать локально, т.е., опять же, что бы платить по локальному рынку.

      Стандартный вопрос: а зачем им тогда нанимать "чужих" людей, если за те же деньги можно нанять "своих" людей?


      1. dsh2dsh
        20.08.2023 13:36

        Больший выбор. Дешевле при не меньшем качестве. Американская зарплата - она ведь тоже разная. Можно нанять качественного разработчика например в Европе за $120000 в год, но не найти такого же качественного в США за эти же 120.


  1. rutexd
    20.08.2023 13:36

    Всегда интересно почитать статью от интересного человека.

    Спасибо!)


  1. NelEvg
    20.08.2023 13:36
    +33

    Большинство прогеров думают что пробились к вершинам, но на самом деле они просто туда всплыли (с)


  1. Mike-M
    20.08.2023 13:36
    +3

    Отругайте человека — и он забудет это через неделю. Похвалите человека — и он будет помнить об этом всю жизнь.

    К сожалению, наоборот: человеку свойственно лучше запоминать плохое.
    Именно поэтому не существует антонима к слову "злопамятный".


    1. mapron
      20.08.2023 13:36
      +3

      у нас не существует антонима к слову "ущербный", значит нормальных людей не существует, все мудаки. (такого же уровня логика). Человеку свойственно помогать и быть добрым, противоположное - это патология.


      1. m-oblepiha
        20.08.2023 13:36

        антоним к слову "ущербный" – "безупречный"


        1. mapron
          20.08.2023 13:36

          А антонимы к слову "злопамятный" - незлопамятный, отходчивый, всепрощающий. Ждал вашего комментария.


  1. nektopme
    20.08.2023 13:36

    У Вас очепятка во фразе "Прокрастинация, выгорание и тлен"


  1. mapron
    20.08.2023 13:36
    -5

    Зачем постить мусорные бессмысленные опросы в конце? Тут вроде не Youtube, нагревать "алгоритм" опросами не нужно.


  1. elmirius
    20.08.2023 13:36
    +8

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

    Вот это везуха! Обычно после такого письма пробуешь, а всё открывается. Потом приходится неделю выяснять, что конкретно у клиента не работает.


  1. sasmoney
    20.08.2023 13:36

    Тоесть получается ChatGPT может заменить программиста, сам придумает и напишет необходимый код и решение


  1. Wesha
    20.08.2023 13:36
    +7

    Мне 33 годика, из них лет 13 у меня жёсткое программирование, и я помидор на питоне.

    Фух, наконец
    после попыток так тридцати что-то таки получилось.
    после попыток так тридцати что-то таки получилось.


  1. vagon333
    20.08.2023 13:36
    +1

    Все логично, и помидорство и философский пофигизм, но как-то скучно так работать.
    Если меня проект не торкает, лучше сразу слиться.


    1. dsh2dsh
      20.08.2023 13:36
      +1

      Я работал в ситуации, когда проект меня торкал. Как же обидно было, когда меня вышвырнули.


  1. LeVoN_CCCP
    20.08.2023 13:36

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

    Я не силён в этом, но со стороны БД, запроса нет = ничего не изменяется, а то что запрос начинает выполняться сейчас или на 20-50 секунд позже ничего не меняется (за исключением того, что списание пойдёт через 20-50 секунд). Или тут какая-то фича джанга, что он выполняет его дважды если ленивый, или где-то в коде дублирование, что списывает и в начале (секретное место) и лениво "через 20-50 секунд", но при этом не списывает в начале, так как идёт блок неленивый, который блокирует и списывает разово /fantasy. Можете, пожалуйста, пояснить этот момент?


    1. blind_oracle
      20.08.2023 13:36
      +1

      Код ожидает что после SELECT FOR UPDATE никто другой эту строчку в БД модифицировать не сможет. Но т.к. запрос по факту в БД не ушёл - параллельно второй процесс может создать race condition и обработать строку более 1 раза


      1. LeVoN_CCCP
        20.08.2023 13:36

        Да, может обработать, но суть как раз в том, что эта строка до старта обработки пусть меняется как может, но после селекта уже не меняется. У нас нет селекта, потому апдейтить может кто угодно и как угодно, что для нашей операции (списать деньги и продлить подписку с техническим селектом) неважно. Что и возвращает к вопросу тому, что это не объясняет двойного списания.
        Допустим возвращаемся к моменту примера с двумя участками 0сек и 20-50сек и пусть 200$ на счету, подписка 100$.


        1. Ситуация race condition. w1 (lazy) создаёт (но не исполняет) селект фор апдейт. На 0 секунд у нас нет кода нет блока, ничего нет. Есть w2 (неизвестный) который берёт и исполняет чего-то списывая 100$ на что-то, потом приходит w1 (через 20-50 секунд) и списывает ещё 100 добавляя месяц (тут опять же уровень изолированности транзакций описанный ниже).
        2. Ситуация race condition. w1 (не lazy) создаёт (и исполняет делая блок) селект фор апдейт. На 0 секунд есть блок есть селект есть списывания и добавления. Есть w2 (неизвестный) который уже не может взять и исполнить чего-то списывая 100$ (и по идее должен ожидать выполнения w1, после чего возможны различные ситуации в зависимости от уровня изолированности транзакций БД если брать ПГ в частности).

        В любом из двух случаях проблема в w2 что это такое, что оно делает и почему оно списывает. То есть для того чтоб не получить отрицательный баланс при одновременном обращении и недостатке средств вопросов нет. Вопрос как раз в том, из-за чего происходит второе списание.


        1. blind_oracle
          20.08.2023 13:36

          По куску кода автора сложно понять что там происходит и что он вообще лочит.

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


          1. LeVoN_CCCP
            20.08.2023 13:36

            Именно поэтому я и попросил пояснить немного, почему получалось двойное обновление, т.к. всё что описано автором совсем не объясняет двойное списание. Или для кого-то из гуру данной вещи очевидно и он может описать то, что "очевидно" из приведённого кода. На мой дилетантский jango взгляд и объяснениям рядом я понял, что списание происходит не сразу а "чуть позже" и это ну никак с т.з. логики не влияет на то что "если позже, то надо делать 2 раза".


            1. kit_oz
              20.08.2023 13:36

              Есть вероятность, что автор даже не стал искать этот самый w2, так как предложенного решения достаточно, что бы устранить проблему клиента.


              1. LeVoN_CCCP
                20.08.2023 13:36

                У меня тоже сложилось впечатление (по другим местам), что автор предпочитает подорожником и изолентой лечить всё, но думал что я тут что-то недопредставляю.


                1. kesn Автор
                  20.08.2023 13:36

                  У нас есть подписки (Subscription) и платежи (SubscriptionPayment) с ForeignKey к подписке.
                  Есть функция для продления подписки. Пусть она вызывается параллельно из 2 потоков.

                  Первый поток:

                  1. Находит Subscription, которую пора продлевать

                  2. Ищет, был ли SubscriptionPayment, скажем, за последние 3 дня - не находит - значит, пора списывать

                  3. Триггерит внешний API для списания денег клиента

                  Параллельно второй поток:

                  1. Находит Subscription, которую пора продлевать

                  2. Ищет, был ли SubscriptionPayment, скажем, за последние 3 дня - не находит - значит, пора списывать

                  3. Триггерит внешний API для списания денег клиента

                  Первый поток:
                  4. Если внешний API отработал без ошибок, то создаёт SubscriptionPayment

                  Второй поток:
                  4. Если внешний API отработал без ошибок, то создаёт SubscriptionPayment

                  SELECT_FOR_UPDATE делает так, что на первом шаге один из потоков получает блокировку на Subscription, и второй поток ждёт, пока первый поток не разлочит Subscription в конце транзакции (т.е. уже после создания SubscriptionPayment). Когда второй поток переходит к шагу 2, он уже находит существующий платёж.

                  Если я где-то туплю - дайте знать. Я могу.


  1. KenobyM
    20.08.2023 13:36

    Интересно. Спасибо. По вовлеченных людей - в точку. Я вообще понял, что для каждого дела есть коридор мотивации. Выше, ниже - плохо и неэффективно.


  1. kay_kay
    20.08.2023 13:36

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

    Объясните в чем баг?

    Результат ведь один и тот же.


    1. kesn Автор
      20.08.2023 13:36
      +4

      items = [set()]*10
      items
      # [set(), set(), set(), set(), set(), set(), set(), set(), set(), set()]
      items[1].add(12345)
      items
      # [{12345},{12345},{12345},{12345},{12345},{12345},{12345},{12345},{12345},{12345}]
      
      items2 = [set() for _ in range(10)]
      items2
      # [set(), set(), set(), set(), set(), set(), set(), set(), set(), set()]
      items2[1].add(12345)
      items2
      # [set(), {12345}, set(), set(), set(), set(), set(), set(), set(), set()]
      


      1. avshkol
        20.08.2023 13:36

        Я точно Джун - мне потребовалось 10 минут экспериментировать с add() и даже append(), чтобы понять, какой код вы хотели, и почему первый вариант не подходит)))


      1. Wesha
        20.08.2023 13:36
        +2

        Указатели наносят ответный удар!

        (Для читателей: в первом случае создался один объект, а в массив загнали всего лишь 10 указателей на него; во втором случае каждый раз создавался новый объект, как, собственно, аффтар и планировал с самого начала).

        Детская ошибка всех тех, кто не заморачивается пониманием того, что есть объект и что есть указатель на объект. В наше время это было то, с чего обучение, собственно, начиналось.


        1. kay_kay
          20.08.2023 13:36

          Спасибо. Теорию понял.


        1. AleVaKa
          20.08.2023 13:36

          Сейчас тоже даже на курсах это объясняют =) И даже говорят, почему инициализировать аргумент функции пустым списком плохая идея. Но как я понял, автор не по незнанию ошибся, а по другой причине, раз сам же потом и отловил этот баг "в уме".


      1. kay_kay
        20.08.2023 13:36

        Мать моя!!!!!

        Спасибо, наглядно.


  1. Analytique
    20.08.2023 13:36

    Очень интересно читать, пишите ещё))


  1. bagrovykt
    20.08.2023 13:36
    +1

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


  1. Battary
    20.08.2023 13:36
    +1

    Я вот раньше тоже как-то переживал за проекты, (а потом мне прострелили колено), а потом пришло осознание, что никакой код не вечен.

    Все мы знаем про жизненные циклы ПО, и самое важное в них — это то, что рано или поздно любой код будет удален.

    Хотелось бы дополнить автора, что конечно стоит писать как можно лучший код, оптимальный, элегантный...но когда уже написано 100 костылей, то написать 101 костыль действительно мудрое решение. (⁠◕⁠ᴗ⁠◕⁠)