Олег Громов печатает...
1.79K subscribers
61 photos
5 videos
141 links
о программировании, стартапах, UK и о жизни в целом
Download Telegram
В августе 2012 года я впервые в жизни уехал из родного Ростова-на-Дону в Москву, получив офер от Инновы. Это было, по сути, начало и моей карьеры, и всей серьёзной взрослой жизни. Сегодня, почти ровно 10 лет спустя, осилив очередной переезд, начинаю достаточно символическую для меня рефлексию — и дата круглая, и решений принято было много, и выводов тоже накопилось предостаточно.

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

PS Да, картинки-превьюшки ужасные, конечно. Попробую научиться делать что-то более симпатичное, а то кажется, что только из-за картинок CTR моих ссылок раза в 2 ниже, чем мог бы быть 🤣

https://gromov.com/en/career-freelance-ups-downs
Карьера разработчика 🤩

Этот канал начинался как своего рода дневник моего профессионального пути.

Я работал в Яндексе 3 года, ездил в Штаты поучить английский и отдохнуть, уехал в Швецию на ~полгода, вернулся работать удалённо в Toptal, потом переехал в Лондон в первый раз, устроившись в Фейсбук, ушёл в стартап Hook, вернулся назад в Россию и устроился в Sourcegraph опять же удалённо на "американскую" зарплату. Сейчас снова в Лондоне уже на классной визе, которая не привязывает меня к работодателю.

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

Те, кто читает меня давно, знают, что я достаточно скептически отношусь к nine-to-five работе, корпорациям и performance reviews, узкой специализации, работе "на дядю" и зарплате как единственному источнику доходов.

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

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

Воскрешая эту тему, напоминаю, что я публиковал несколько статей на эту тему, получивших хороший отклик. Они собрали ~120 тысяч просмотров и больше 100 комментариев:

- Как найти удалённую работу за доллары
- Удалёнка за доллары: а меня возьмут?
- Как пройти собеседования на удалёнку за рубеж
- Как торговаться на собеседованиях

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

Если найдёте что-то полезное, пишите комментарии, будем обсуждать!

Всем добра ❤️
Привет, читатели!

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

Тексты будут в 99% случаев на английском, посвящённые карьере и технологиям, реже сайд-проектам, стартапам и предпринимательству. Например, ближайшая статья будет на тему фриланса, под рабочим названием The Vicious Cycles of Freelance.

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

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

Спасибо! 🤩
Be ruthless during offer negotiation, then stick around for a while.

This will ensure you're compensated fairly AND have enough time to learn, build something valuable, and stand out.

#careerbites — the advice I wish I got when I was younger

twitter.com/oleggromov
How much is a year of your life?

It must be priceless, right? So thought I, until I realised I've been putting money first for over a decade.

In 2022, a year of my life is $200k. It was about $110k in 2021, $175k in 2020, $90k in 2019.

Here's a brief story of my life 👇


twitter.com/oleggromov
Почему твитер?

Многие до сих пор удивляются, зачем/почему я полез в твитер. Основных причины две.

1. Англоязычная тех-тусовочка в основном в твитере
Есть ещё стримеры на твиче, ютуберы, само собой, но это видео, другой формат.

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

Русскоговорящим предпринимателям и "криейторам" (прости господи!) телега заменила email-рассылки, которые в остальном мире растут и даже привлекают инвестиции.
А вот для англоговорящей аудитории телега — это какая-то маргинальная помойка, тут никого нет, да и не придут, даже если звать.

2. В телеграме нет органики
Канал ужасно тяжело растить. Как круто ты ни пиши, никто никогда этого не увидит без рекламы/продвижения где-то ещё.
Ну ладно, будет рост +5 человек в месяц, если писать что-то настолько крутое, что оно будет расходиться по интернету через пересылку сообщений.

Все мои подписчики пришли с других платформ: статей про карьеру на VC и Хабре, разных интервью, кросс-постов в каналах друзей.
Это всё здорово, но ужасно сложно и утомительно.

А что твитер?
А в твитере есть рекомендации, есть лайки и репосты, там принято делиться тредами (нравится нам это или нет).
Твой контент реально видят новые люди.

Поэтому и твитер, поэтому на английском.

Кстати, есть прикольное предположение, что старые аккаунты в твитере растить сильно сложнее, чем новые.
Свой аккаунт я зарегистрировал в 2009 году. 13 лет — тринадцать, Карл! — он был полудохлым, с ±200 подписчиками.

И тут в июне я начал активно туда писать. За последние 28 дней у меня:
- 159k показов твитов
- 40к визитов профиля
- рост на 94 подписчика

Это ужасно мало, 0.2% конверсия из просмотра профиля в подписчика.
Может, конечно, профиль так себе — я пока ещё экспериментирую и с тем, о чём писать, и с тем, как это выглядит. Но так или иначе, за 2 месяца я настрочил кучу контента, а привлёк всего 200 человек. Мало.

Так что зарегал новый профиль и пробую начать сначала 🤩
Ушёл в никуда

Ну что, наконец-то настоящие новости подвезли: я ушёл из Sourcegraph.

Сегодня был последний день. Выкупил рабочие компы, закрыл последний PR (без мёржа, ха-ха), попрощался с командой и всё — адиос!

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

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

Чего хочется, о чём думаю, как себя чувствую. Что волнует, что интересно, чего не хватает.

Это роскошь, конечно.

Наконец, ну дико я задолбался за этот 2022-й и конец 2021-го года. Сначала мы переехали в Россию, только обустроились — ***. Удрали в Турцию, там почти полгода на чемоданах.

Сейчас переехали в UK — и только через несколько недель, наконец, переедем в постоянное жильё. И это же тоже только начало!

Конечно, это время меня многому научило. Например, тому, что ко всему не подготовишься. Нужно принять неизвестность и идти вперёд несмотря ни на что. Очень по-предпринимательски. Но утомительно.

И на работу сил (да и желания, если быть честным) практически не осталось. Надо отдыхать.

Что дальше?
Тут сложнее.

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

Но честно говоря, я пока не знаю. Даже не пытаюсь что-то решить.

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

Но я не уверен, что ROI у книги за авторством фактически ноунейма подберётся близко к желаемому.

Допустим, пишу я её три месяца. Обойдётся это мне, условно в £15,000. Значит, если книжка стоит £25, продать нужно 600 копий, чтобы её окупить. Кажется, что немного, но если считать средней конверсию в 1% от размера аудитории — нужно 60,000 подписчиков.

Нереалистично.

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

Все эти stealth-стартапы по полгода в чулане пилить — ну это для наивных.

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

Вот вы мне можете очень помочь, если расскажете, почему подписались (и не отписались).

А про эмоции от ухода с работы, неожиданные, я тоже в твитере написал.

👋
Человек проработал в компании 45 лет.

Даже не знаю, как к этому отнестись. Удивительно!
Книга о карьере

Решил, что всё-таки буду писать книгу. И все это будет в популярном сейчас формате building in public.

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

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

Следующий пост будет про цели и немного о том, для кого она.

А пока показываю новую шапку профиля. Как вам?

twitter.com/oleggromov
Нарисовал три картинки для новой статьи. Пока что даже они мне даются намного лучше, чем хороший, простой и связный текст.

Как вам?

Что происходит на картинке?
Media is too big
VIEW IN TELEGRAM
Альфа-версия обложки для книги 🤩
To build a great career, focus on building great things. You’ll have fun, learn a ton, and the right people may notice your results.

Focusing on raises and promotions only breeds indifference to work.

#careerbites — the advice for software engineers that are after more money

twitter.com/oleggromov
Всем привет! Давно ничего не писал вам, слишком сильный откат словил после полугода на адреналине и в неизвестности.

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

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

А мне скучно так, по расписанию и на заданную тему. Что я самый настоящий jack of all trades, master of none, а кому это вообще может быть интересно - не ясно.

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

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

Поржал и решил: канал теперь будет называться коды некоды.

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

Короче, встречайте: канал про преувеличения и прописные глупости от почётного обладателя синдрома самозванца с обширным опытом в индустрии 🤡

Рассказать вам, что я делал полгода? А вы мне тогда расскажите в комментариях, как у вас дела и чем занимались.

Обнимаю ❤️
34 - done 🎂 А со следующего года перестаю смотреть на цифры.

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

Думаете, это мои коды? Кастомная аутентификация через одноразовые пароли, куча логики в боте для обеспечения работы клуба, интеграция со страйпом или сервисом рассылки email?

Как бы не так! Это сраная админка джанги сломалась. Да, я не шучу. Да, "баг в компиляторе". И, хотя баг в компиляторе куда менее вероятен, чем ошибка в коде админки какой-то там CMS, выглядит всё равно нереалистично. Может я где-то накосячил? Наверняка. Но пятисотит именно админка, а не продакшен-урлы.

Надеюсь воспроизвести хотя бы, потому что пока что пара отладочных деплоев ошибку куда-то запрятали 🤦🏻‍♂️
Ошибка оказалась тривиальной и, в некотором смысле, виноват был почти что мой код/настройки.

Я давно уже использую managed posgtres от DigitalOcean, чтобы не возиться хотя бы с настройками и обновлением БД. Так вот оказалось, что там не включён по-умолчанию connection pooling, и 500-я ошибка была потому что БД обрубала лишние соединения 🤷‍♂️ Хорошо хоть всё важное сыпется не в постгрес, а в редис.

PS В комментариях спрашивали, настроено ли всё это опять вручную - нет. На этот раз я решил, что не хочу возиться хотя бы с деплоями и начал использовать DigitalOcean App Platform. В итоге стоимость прода выросла в 2-3 раза, относительно удобно стало деплоить через докер, появились бесшовные деплои (кайф) и куча всякой фигни вроде "изменил env-переменную - тригенрну тебе полный ребилд" (ладно, с кешем).
Надо немного контекста добавить, конечно. Пару месяцев назад Соня решила запустить свой Модный клуб. Это такой закрытый платный чат с кучей полезного контента для любительниц шоппинга и моды. Сразу же продала 30+ мест. Я поглядел, как лихо девушки друг у друга покупают разные штучки, и взялся помогать фултайм.

С контентом и фотографиями, программированием, дизайном, настройкой всего на свете, включая рекламу. Конечно, почти сразу сел коды писать. Чего там делать, всего-то бота простенького написать.

Но есть нюансы. Бот в телеграме не может узнать, что сообщение из канала/чата было удалено. Нельзя получить список пользователей канала, даже если бот админ. Сообщение с 2-10 фото/видео - это не одно сообщение, а 2-10 сообщений, объединённые одним media_group_id. Отправляются они по-отдельности, а потом уже клиентами объединяются в как бы одно сообщение. Поэтому и пересылать их дико неудобно даже человеку. А представьте, каково боту.

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

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

Вместо чуть усложнённого echo-скриптика поверх API получилась какая-то конина лютая со своим стейтом сразу в двух местах. В которой нужно думать про race conditons, иначе воркеры друг с другом подерутся. Простенький бот на поверку оказался не таким уж простеньким.

А потом регистрация и оплаты, подписки и отписки, непрошедшие платежи. Это вообще отдельная вселенная, где накосячить в десять раз проще, чем не накосячить. Когда время пришло, всех клиентов проверить на наличие подписки, кому-то напомнить, кого-то отписать, кому-то сделать исключение по промокоду/whitelist-у. И даже когда всё сделано более-менее по уму, клиентам всё равно сложно.

Кто-то увидел, что надо ввести e-mail для регистрации - и забил. Кто-то отвалился на вводе одноразового пароля. У кого-то не сработал apple pay на странице оплаты из-за отсутствия billing address, и она, как раньше, сделала перевод (а не оформила подписку 😬). Кто-то не понял формулировку про карту зарубежного банка. Все эти дополнительные клики и вопросики конверсии рубят жестоко, конечно.

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

В то время как отдельные храбрецы умудряются стартапы пилить годами, когда нет ни одного платежа! 🤯

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

Чтобы эти простые штуки хотя бы работали как положено, а лучше работали хорошо и помогали, а не бесили 😍
Не понимаю в пубернетисах

Только хотел хвалить деплои в PaaS, в моем случае digital ocean app platform, как заметил, что пубернетисы-то ломаются. Не могут не ломаться 🥰

Разумеется, таинственно и без логов, ведь это платформа - все уже не продумано за тебя!

Во время supposedly zero downtime деплоев какое-то время не отвечают ручки приложения, и даже говорят 504 bad gateway. А ведь, по идее, до успешного прохождения health check-ов трафик должен по-прежнему идти в инстансы предыдущей версии.

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

Сделал так, что пятисотящий пубернетис мне продавать мешает 🤬 Ну ладно, пока не мешает, но может помешать, есть я буду недостаточно аккуратным или достаточно успешным.

Причем, из-за отсутствия конфигов и логов, я даже не уверен, кто именно в цепочке cloudflare -> nginx (?) -> gunicorn/uvicorn -> django -> мой говнокод косячит и дропает соединения.

Точнее, я уверен, что это не мой гениальный код и не джанга с единорогами. Потому что там-то логи есть, и я в них ничего не вижу 🧐

Скорее всего оборванные соединения случаются именно в момент переключения трафика, но что происходит с уже висящими в очереди и ждущими обработки запросами? Ставлю на то, что отлетают именно они. Но не уверен.

Какие вообще в DO настройки reverse proxy, где их посмотреть, что на них влияет? Сколько соединений может удержать один воркер в app platform? В моем представлении edge-сервер должен держать не больше стандартных линуксовых тыщи-двух и не меньше настроенного в nginx. Одно соединение жрет памяти... ну не знаю, сотню килобайт + payload? Да если не меньше даже. Памяти там пара гигов, а значит не пару сотен уж точно хватить должно.

Вопрос в зал: куды бечь, чтобы разобраться?