Олег Громов печатает...
1.76K subscribers
65 photos
5 videos
144 links
о программировании, стартапах, UK и о жизни в целом
Download 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
7👍3👎1
Всем привет! Давно ничего не писал вам, слишком сильный откат словил после полугода на адреналине и в неизвестности.

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

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

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

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

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

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

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

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

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

Обнимаю ❤️
👍52🔥11💅42👌1🌚1
34 - done 🎂 А со следующего года перестаю смотреть на цифры.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы эти простые штуки хотя бы работали как положено, а лучше работали хорошо и помогали, а не бесили 😍
🫡18👍15🔥6😁61
Не понимаю в пубернетисах

Только хотел хвалить деплои в 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? Да если не меньше даже. Памяти там пара гигов, а значит не пару сотен уж точно хватить должно.

Вопрос в зал: куды бечь, чтобы разобраться?
1👍1👨‍💻1
Прикольное от кофаундера Sourcegraph 😁

https://twitter.com/beyang/status/1641900256572092416
🤡41
Forwarded from @yegor256 news (yegor256)
ChatGPT understands Agile pretty well...
😁20👍2👎1💔1
"By working in short cycles and constantly refining and improving the product, teams can deliver absolutely nothing on a regular basis, enabling them to receive paychecks from their clueless managers until the entire budget is wasted and they can move on to the next project or the next company."

Да ты ж мой золотой!

Я бы сказал, что ChatGPT отлично понимает не только agile, а в принципе судьбу 9 из 10 программных продуктов 😁
👍2
Запуск-пиздец 🤯🤪🥳

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

Сердце процесса продаж - это Сонины перфомансы в инстаграме. Она показывает, рассказывает, удивляет, ссылается на, предлагает и напоминает. Все "по книжке" современных инста-продаж. А главное - работает. Люди покупают у людей, а не клиенты у компаний 🫡

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

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

Разве что-то могло пойти не так в нашем идеально спланированном отпуске? 🤔

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

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

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

Нечасто - сильно накосячил я всего один раз, когда десяток новых пользователей пришли в бота и застряли на вводе e-mail, потому что у меня не создавались модели пользователей с пустым не-null полем. Это я что-то "улучшал" за 15 минут до этого 🤡

Хотя любопытно, что самая важная часть - приём оплаты, уведомление об оплате, выдача доступа - работали у меня нормально. А вот фигня вроде этих регистраций хуже. Интересно было бы поискать корреляцию между уровнем моей усталости в момент написания этих кодов и их качеством.

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

Конечно же, мои любимые деплои подосрали и тут: ведь это атомарность-иммутабельность-whatever, нельзя просто строчку кода подправить и питон перезагрузить. Нужно сделать чекаут, прогнать весь CI, остановить и перезапустить всех воркеров. Буэ, блин, сам себе ентерпрайз какой-то наколхозил!

Из неочевидного:
⁃ срочность ("продажи закрываются через 12 часов") - работает! Люди после такого напоминания идут и докупают, если они хотели купить изначально, конечно
⁃ кто хочет купить, продирается через даже ошибочные сценарии и пишет в поддержку. Те, кто не очень хочет, отваливаются на первых же трудностях или даже дополнительных шагах регистрации/покупки
⁃ напоминания тем, кто не хотел покупать, приводят только к блокировке бота 🤪 Спасибо телеге за то, что совместила кнопки "удалить" и "забанить", очень удобно!

Обобщать после 50+ продаж и 200+ взаимодействий с ботом ещё рановато, но уже очень хочется 🥰

Теперь думаю над основными метриками этого продукта и том, как их наиболее эффективно поддерживать и растить с помощью своих кодов-некодов.
👍23🔥1
Ну это чисто я 😁
😁28
Вообще поймал себя на том, что сижу пишу код руками, без copilot-а, и не хочу его включать. А всё дело в том, что есть ощущение, что сейчас состояние потока прервётся. У вас такого нет?
👍4🤡3🤔2👎1
Давайте поиграем в самообман

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

🔥 Так интереснее. Да, по граблям на костылях пройдусь, баги соберу (но это неточно), зато сам. Писать коды для чего-то, чем пользуются другие люди, что зарабатывает деньги тебе - самая клёвая работа. Может, это не по-предпринмательски, зато в кайф. Все эти тесты-шместы, в докер с пубернетисом завернуть, сборки и CI, cloudflare настроить, мониторинги и логи, вся эта шляпа - это промышленное программирование. Оно всё одинаковое, неинтересное, непрозрачное, очень многословное, энтерпрайзное, по best practices с SOLID - не люблю.

🥷 Уровень контроля. Я дико кайфую, когда могу делать что хочу и как хочу. Да, абстракций ещё пару слоёв нагородить придётся, запутаться в этом всём, переписать к чёрту. Зато получится красиво, как хотелось! Я лезу в редис и смотрю, кто там у меня на каком этапе регистрации застрял и исправляю баги не просто в проде, а прямо в стейте прода. Это почти как отладчиком в памяти шарить. В БД руками исправляю имя пользователя с опечаткой. Делаю новую платёжную ссылку для транзакции, которая подвисла - а код для этого у меня ещё не написан. Достаю пользователей с marketing_consent=True и рассылаю им что хочу. Круто же! Какая из существующих систем такое позволит?

😎 Такого, как я хочу, нет. Например, у нас своя уникальная система репостов-комментариев. Потому что мы хотим скрывать историю в основном канале Клуба, а телеграм этого не умеет с каналами. То есть либо скрытая история в обычном чате, либо канал с комментариями и открытой историей. И все делают каналы + обычные комментарии. А у нас круче, ни у кого такого нет пока. Или своя система отслеживания вовлечённости. Я её ещё не доделал, но, может быть, она поможет терять меньше клиентов каждый месяц. Ну и я столько ещё всего хочу навыдумывать и сделать, что это и армией чужих ботов не покрыть.

💩 Готовые решения часто ещё хуже. Написаны кем-то, кому дела до твоего бизнеса нет. Особенно телеграм-боты. Это ж не бизнес, где все серьёзно, QA, SLA, комплаенсы, аудиты и прочие страшные аббревиатуры из программы MBA. Хочу я стимулировать импульсивные покупки и просить email-ы уже после оплаты - да пожалуйста. Буквально: вызвать функции register и buy в обратном порядке. А в готовом боте кто это для меня сделает? Кто там баги поправит, если у меня люди идут в период продаж, а он глючит? Или я даже просто не пойму, что он глючит, а подумаю, что у нас продукт говно и конверсии говно, и это мы сами себе злые буратины.

🤘Я хочу владеть данными своих пользователей, потому что у нас на Клуб и связанные продукты большие планы. Допродавать тем, кто уже покупал, давать скидки за друзей, рассылать email-приглашения. Чужих ботов придётся либо прикручивать к собственному бэкенду, либо просто хранить все данные о клиентах там. Ок, если это страйп, это ещё можно пережить - и то source of truth для меня всё же в нашей БД. Но уж точно не чьи-то телеграмьи поделки! Так я хотя бы в один (почти) монолит полезный код пишу, а иначе буду зоопарком этих недосервисов через вебхуки и очереди жонглировать. Вот ещё.

🤬 Чужие поделки на порядок (без преувеличения) дороже. В комментарии Елена принесла один похожий сервис, так они берут комиссию 20%! Любимый креаторами (тьфу!) gumroad - 10%. У меня в страйпе не больше 3%, в лучшем случае около 1,7%. Ну это куда вообще годится? Ещё я нолог каким-то деятелям-погромистам, таким же, как я, не платил. Хватит с меня и англичанки.

Короче, все свои немалые усилия я воспринимаю не иначе как инвестиции. Для меня вопрос не в том, нужно ли их делать, а отобьются ли они - и когда. Лучшее ли это, во что я могу инвестировать своё время и усилия сейчас? Пока, на старте, кажется, что да. А как оно обернётся - мы вместе узнаем.
🔥16👍2🙏2🤔1
Добавленная ценность

Чем больше кодов для Клуба пишу, тем сильнее осознаю, что эти мои коды конкретно в нашем продукте почти не создают добавленной ценности 🤔 Ха-ха, привет, прошлый пост! И всем любителям моих смысловых качелей тоже привет!

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

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

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

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

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

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

В конце концов, эти рассуждения подводят меня к моему любимому вопросу: почему мне кажется более привлекательным предпринимательство, а от программирования иногда воротит? Да потому что программировать скучно. Скакнуть из 0 в 1 с помощью кодов - круто. Из единицы вырасти в двоечку-троечку, когда всё работает как часы - ладно, под пиво попрёт. А заниматься очередной развесистой системой годами точно не кайф.

Поэтому и тянет меня всё сильнее в важное: в ценность и продукт, в ценообразование и разные тарифы, в создание работающего сообщества, в маркетинг, в понимание целей и задач наших клиентов, чтобы лучше им помогать (и больше продавать).
7💯4🤔3👍2
Привет 👋

Мы с моим другом Виктором Карповым работаем над новым образовательным проектом.

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

👉 https://forms.gle/wWDzDFitHSTYRQ316

А если ещё и готовы поболтать около часа про ваш опыт обучения программированию и работы, то поставьте галочку в конце формы 🔥

В качестве благодарности за разговор будет консультация + письменные рекомендации от меня и/или Виктора по любым вопросам - от алгоритмов до софт-скиллов. Спасибо! 🙏
12
Программист на свободе

Шесть лет назад я уволился из Яндекса, оставив хороший незавестившийся опцион и отличное, свое место и роль тимлида команды разработки партнёрского кода РСЯ, чтобы "покорять америку". Изрядно нагревшись под калифорнийским солнцем, я вдруг осознал: а можно же ведь было не работать! И мир не останавливается, и смысл жизни не пропадает. Деньги, конечно, нужны, но это ведь не самое главное.

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

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

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

Виновата ли в этом компания? Нет, просто даже тимлидить в корпорации мне мало. А уж писать код и подавно.

Три года назад, когда я уже работал в Фейсбуке в Лондоне, а весь мир уже закрылся на карантин, я наконец-то начал делать что-то своё. У меня была идея, что нужно сделать словарик, основанный на произношении - так появился Quiken.

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

На тот момент у меня за плечами было около 8 лет карьеры (Топтал, Кларна, Яндекс, Иннова) и несколько лет фриланса, всё в веб-разработке, из которых почти 5 лет - тимлидства. И я тогда настолько прирос к своему профессиональному самоопределению - тимлид и фронтенд, - что первой, спустя годы уже очень странной, мыслью было: "а я вообще сам что-то смогу сделать от и до?".

Ужасное ощущение для программиста! Особенно попавшего в профессию по любви, когда денег тут никаких ещё не было.

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

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

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

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

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

Тем не менее, программирование - прекрасный способ творить.

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

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

Вот такой вот программист на свободе.
👍4018🤔3🥱2💯2🤝2
Как я по сишке упарывался

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

Одним из ответов на вопрос "как вернуть интерес к работе" была идея попробовать низкоуровневое программирование. В конце концов, именно с си и плюсов (тьфу-тьфу, чур меня!) началось моё прямо увлечение программированием в юности.

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

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

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

Всё остальное реализуется на основе этих конструкций. Хочешь писать свой malloc - да на здоровье. Главное понимать, что без стандартной библиотеки код перестаёт быть кроссплатформенным.

Есть даже кайфовейшая книжка Object-Oriented Programming with ANSI-C, где автор как раз объекты-наследование-полиморфизм и прочее делает сам, с нуля. Рекомендую.

Но что на сях писать-то? Вот тут у меня проблемы. Есть ардуино и идея самостоятельно напрограммировать управление коптером. Но тут больше пайки и ручной возни, чем программирования, плюс у меня всех деталей под рукой нет. Есть что-то низкоуровневое и производительное, типа SQLite или nginx. Но это огромные проекты!

В итоге написал свой парсер JSON 🤣

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

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

Но почему?

Я тоже помню, включая, как мне кажется, и причины - и пишу, чтобы скопировать строчку:

char* copy = malloc(strlen(original) + 1);
*copy = *original;

Где-то там определён char* original = ..., конечно же.

Помню про выделение памяти и нулевой байт, и пишу malloc(strlen(copy) + 1). Так в си заканчиваются строки, т.к. нет никакого объекта, чтобы хранить её длину - это просто последовательность байт в памяти.

И про указатели с разыменованием тоже помню, и поэтому пишу в *copy = *original. Конструкция *ptr в си означает, что надо взять значение, находящееся по адресу, лежащему в ptr (и длиной в ее тип - но это от меня уже ускользает).

Но одного не помню, что копирование строки - это O(n) операция, если не считать выделения памяти, и её не сделать так же, как копирование чего-то помещающегося в регистры процессора.

То есть моё выражение *copy = *original превращается в несколько инструкций, означающих "возьми значение по адресу original длиной в 8 бит (т.к. это char* ptr, символ) и положи его в ячейку по адресу copy".

Это меня высокоуровневые языки совсем уже с толку сбили.

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

Вот кто ещё вам скажет, что тест - это просто функция, которая вызывает другую функцию и проверяет результат? Да, до этого можно додуматься, но ведь надо подумать. Я даже поначалу искал "unit testing framework" для си, а потом додумался просто положить тесты рядышком и запускать через make.

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

Пока они не стали нашими властелинами 🤣
👍16😁21🔥1