Коллеги попросили разместить объяву. Если у вас есть те, кто хочет вкатиться в разработку, то грант это офигенный шанс получить обучение бесплатно:
В прошлом году мы в Хекслете запустили конкурс грантов: трое человек получили возможность бесплатно учиться 10 месяцев с наставником.
Все трое уже работают. Они учились в общих группах, без особых условий, опыта в IT у них раньше не было.
В этом году решили повторить. Участвовать может любой новый пользователь Хекслета. Можно быть новичком или уже работать в IT, но, например, хотеть сменить направление.
Те, кто не выиграют грант, в обиде не останутся. Мы заморочились и подготовили десятки подарков от партнеров (спасибо им!): билеты на профессиональные конференции, подписки, сертификаты.
Подать заявку можно до 7 марта. Если вам актуально или знаете, кому может быть полезно, перешлите ссылку https://special.hexlet.io/grant
В прошлом году мы в Хекслете запустили конкурс грантов: трое человек получили возможность бесплатно учиться 10 месяцев с наставником.
Все трое уже работают. Они учились в общих группах, без особых условий, опыта в IT у них раньше не было.
В этом году решили повторить. Участвовать может любой новый пользователь Хекслета. Можно быть новичком или уже работать в IT, но, например, хотеть сменить направление.
Те, кто не выиграют грант, в обиде не останутся. Мы заморочились и подготовили десятки подарков от партнеров (спасибо им!): билеты на профессиональные конференции, подписки, сертификаты.
Подать заявку можно до 7 марта. Если вам актуально или знаете, кому может быть полезно, перешлите ссылку https://special.hexlet.io/grant
Шаринг типов между сервером и клиентом
Вчера в одном чатике задали вопрос на эту тему:> Вот смотрите, предположим, есть backend на питоне, есть UI на Angular. Оба используют контрактные (согласованные) структуры - бэк отдавая, фронт получая. Как мне подружить эти схемы, что б можно было вести только в одном месте ?
Тут у нас какие варианты, давайте по рассуждаем.
Первый идеальный. У нас на беке и фронте TS, поэтому проблемы как таковой и нет. Честно говоря, мне настолько понравилось последнее время делать проекты в этом стиле, что я бы в будущем так все проекты и делал. Особенно учитывая наличие великолепной drizzle orm в node.js (просто вау)
Второй энтерпрайзный. Описываем отдельную спеку в https://typespec.io/ затем из нее генерим не только типы, но и sdk для работы. Но такой подход тяжелее и больше используется для взаимодействия сервисов друг с другом, чем для клиент-серверного взаимодействия где это может быть оверкилом. Ну и на беке все равно будет связка “свои модели” - “сгенерированные dto” - “маппинги”, то есть рутины все равно достаточно.
Третий практичный. В этом варианте мы генерируем TS типы из наших моделей или dto (что правильнее). Как правило для бекенд фреймворков есть готовые либы https://github.com/skryukov/typelizer Если нет, то можно попросить chatgpt написать конвертер. Этот вариант не без изъянов, так как типы не мапятся один в один, то иногда в беке надо явно прописывать фронтендовые типы как строки. В https://code-basics.com выбран именно этот вариант.
Четвертый апишный. Генераторы на уровне описания самого апи в беке. То есть пишем апишку, добавляем мету и из нее генерим спеку, дальше из этой спеки можно уже типы для фронта https://drf-yasg.readthedocs.io/en/stable/. Возможно наиболее популярный путь, но такое точно не сработает с подходом аля inertia.js.
Четвертый рукпошка. Просто описываем типы независимо от бека и страдаем. Как ни странно, этот вариант не на последнем месте по популярности.
p.s. А как делаете вы и нравится ли вам такой подход?
Ссылки: Телеграм | Youtube | VK
Вчера в одном чатике задали вопрос на эту тему:> Вот смотрите, предположим, есть backend на питоне, есть UI на Angular. Оба используют контрактные (согласованные) структуры - бэк отдавая, фронт получая. Как мне подружить эти схемы, что б можно было вести только в одном месте ?
Тут у нас какие варианты, давайте по рассуждаем.
Первый идеальный. У нас на беке и фронте TS, поэтому проблемы как таковой и нет. Честно говоря, мне настолько понравилось последнее время делать проекты в этом стиле, что я бы в будущем так все проекты и делал. Особенно учитывая наличие великолепной drizzle orm в node.js (просто вау)
Второй энтерпрайзный. Описываем отдельную спеку в https://typespec.io/ затем из нее генерим не только типы, но и sdk для работы. Но такой подход тяжелее и больше используется для взаимодействия сервисов друг с другом, чем для клиент-серверного взаимодействия где это может быть оверкилом. Ну и на беке все равно будет связка “свои модели” - “сгенерированные dto” - “маппинги”, то есть рутины все равно достаточно.
Третий практичный. В этом варианте мы генерируем TS типы из наших моделей или dto (что правильнее). Как правило для бекенд фреймворков есть готовые либы https://github.com/skryukov/typelizer Если нет, то можно попросить chatgpt написать конвертер. Этот вариант не без изъянов, так как типы не мапятся один в один, то иногда в беке надо явно прописывать фронтендовые типы как строки. В https://code-basics.com выбран именно этот вариант.
Четвертый апишный. Генераторы на уровне описания самого апи в беке. То есть пишем апишку, добавляем мету и из нее генерим спеку, дальше из этой спеки можно уже типы для фронта https://drf-yasg.readthedocs.io/en/stable/. Возможно наиболее популярный путь, но такое точно не сработает с подходом аля inertia.js.
Четвертый рукпошка. Просто описываем типы независимо от бека и страдаем. Как ни странно, этот вариант не на последнем месте по популярности.
p.s. А как делаете вы и нравится ли вам такой подход?
Ссылки: Телеграм | Youtube | VK
В этом выпуске мы поговорили с Тагиром Валеевым — Java-чемпионом, разработчиком IDE и статических анализаторов для Java, а также автором книги «100 ошибок Java». Он рассказал о развитии Java, ключевых изменениях в языке и OpenJDK, а также о том, как эти нововведения влияют на разработчиков.
Не пропустите инсайты и практические советы для тех, кто хочет глубже разобраться в языке!
https://www.youtube.com/watch?v=YGOR8yyGFAU
Альтернативные ссылки: ВК Видео | Аудио
https://www.youtube.com/watch?v=YGOR8yyGFAU
Не пропустите инсайты и практические советы для тех, кто хочет глубже разобраться в языке!
https://www.youtube.com/watch?v=YGOR8yyGFAU
Альтернативные ссылки: ВК Видео | Аудио
https://www.youtube.com/watch?v=YGOR8yyGFAU
YouTube
Почему Java остаётся топовым языком для бизнеса? | Тагир Валеев | #35
В этом выпуске мы поговорили с Тагиром Валеевым — Java-чемпионом, разработчиком IDE и статических анализаторов для Java, автором книги "100 ошибок Java". Он рассказал о развитии Java, ключевых изменениях в языке и OpenJDK, а также о том, как эти нововведения…
Вчера в твиттере спросил как кто организует локальный https для своих проектов? Сразу отвечу на вопрос, зачем. Например вебворкеры, oauth, вебхуки и разные другие штуки работают только по https. Во-вторых, это влияет на конфигурацию (генерация ссылок например) и лучше когда продакшен и дев в этом смысле не отличаются.
Значит что мы получили. Самый частый вариант mkcert. Эта штука позволяет одной командой сгенерить самоподписные доверенные сертификаты под нужные домены. Действительно удобно, если сертификат нужен доверенный.
Эта штука решает проблему сертификатов, но но решеает проблему конфигурации веб-сервера. Дальше все равно придется гуглить как это подключить к проекту и ставить перед ним например nginx.
Другой вариант это туннелирование с помощью ngrok.io, и аналогов. Хороший вариант, заодно позволяет дать доступ к проекту снаружи для взаимодействия с другими системами и тестирования. Большая часть таких утилит работает только если у вас есть интренет, хотя там подсказали https://www.localcan.com/ который умеет и локальный сетап (выглядит кстати круто). Мы кстати, конкретно для хекслета решили просто вести разработку в облаках, я даже на конфе выступал с таким докладом: https://www.youtube.com/watch?v=WVjz0HcAWOs
Дальше была куча разного рода устаревших штук (которые не обновляются) + те кто по старинке в рукопашную. Видимо когда-то научились и так продолжают.
Ну и последний вариант, которым я пользуюсь уже лет пять, это использование веб-сервера Caddy для локальной разработки. Этот вариант, кстати, возможно самый популярный судя по ответам. Тут все максимально просто, вот пример конфигурации code-basics.com, где за сертификат отвечает ровно одна строчка.
Класс, да? Ничего не надо генерировать. Все делается само. Единственный недостаток, это то, что сетификат не доверенный. Придется в браузере жмякать “все равно зайти” (сафари по дефолту не дает так сделать).
p.s. Кстати, вы знаете почему использовать .local для локальной разработки нельзя? Правильно .test
Ссылки: Телеграм | Youtube | VK
Значит что мы получили. Самый частый вариант mkcert. Эта штука позволяет одной командой сгенерить самоподписные доверенные сертификаты под нужные домены. Действительно удобно, если сертификат нужен доверенный.
mkcert -install
Created a new local CA 💥
The local CA is now installed in the system trust store! ⚡️
The local CA is now installed in the Firefox trust store (requires browser restart)! 🦊
$ mkcert example.com "*.example.com" example.test localhost 127.0.0.1 ::1
Created a new certificate valid for the following names 📜
- "example.com"
- "*.example.com"
- "example.test"
- "localhost"
- "127.0.0.1"
- "::1"
The certificate is at "./example.com+5.pem" and the key at "./example.com+5-key.pem"
Эта штука решает проблему сертификатов, но но решеает проблему конфигурации веб-сервера. Дальше все равно придется гуглить как это подключить к проекту и ставить перед ним например nginx.
Другой вариант это туннелирование с помощью ngrok.io, и аналогов. Хороший вариант, заодно позволяет дать доступ к проекту снаружи для взаимодействия с другими системами и тестирования. Большая часть таких утилит работает только если у вас есть интренет, хотя там подсказали https://www.localcan.com/ который умеет и локальный сетап (выглядит кстати круто). Мы кстати, конкретно для хекслета решили просто вести разработку в облаках, я даже на конфе выступал с таким докладом: https://www.youtube.com/watch?v=WVjz0HcAWOs
Дальше была куча разного рода устаревших штук (которые не обновляются) + те кто по старинке в рукопашную. Видимо когда-то научились и так продолжают.
Ну и последний вариант, которым я пользуюсь уже лет пять, это использование веб-сервера Caddy для локальной разработки. Этот вариант, кстати, возможно самый популярный судя по ответам. Тут все максимально просто, вот пример конфигурации code-basics.com, где за сертификат отвечает ровно одна строчка.
https://code-basics.test {
# Enable gzip and other compression
encode gzip zstd
reverse_proxy /vite-dev/* https://127.0.0.1:3036
reverse_proxy https://127.0.0.1:3100
# Automatic HTTPS
tls internal
}
Класс, да? Ничего не надо генерировать. Все делается само. Единственный недостаток, это то, что сетификат не доверенный. Придется в браузере жмякать “все равно зайти” (сафари по дефолту не дает так сделать).
p.s. Кстати, вы знаете почему использовать .local для локальной разработки нельзя? Правильно .test
Ссылки: Телеграм | Youtube | VK
X (formerly Twitter)
Kirill (hexlet.io) (@mokevnin) on X
Каким путем вы идете, когда нужен локальный https для проекта? Последние годы я юзаю Caddy, но вдруг мир ушел вперед
Как устроен маркетинг. Воронки
Давайте с главного. Что такое маркетинг?
Правильное сообщение (креатив), правильному человеку (сегмент), в правильное время.
Если бы мы идеально знали наших потребителей, то могли бы подсовывать им ровно то, что решит либо их проблему, либо удовлетворит их хотелку за те деньги, которые они готовы отдать. Именно это мы и пытаемся сделать когда говорим про маркетинг. Понять свою целевую аудиторию (ЦА), кто она, где она и как до нее достучаться. Потом выстроить воронки, выбрать каналы продвижения, настроить аналитику на всех этапах и заниматься постоянными оптимизациями после запуска.
Про воронки надо сказать отдельно. Мышление воронками это один из ключевых элементов в маркетинге. Не существует такого, что человек посмотрел рекламу и тут же стал клиентом. Он проходит какой-то путь, чтобы добраться до вас. В простейшем случае “посмотрел рекламу => перешел на сайт => оставил заявку/позвонил”. Здесь есть три этапа, на каждом этапе свои конверсии, которые надо смотреть, анализировать и оптимизировать.
Но такая прямая воронка работает только на очень теплую аудиторию, то есть ту, которая уже была готова купить ваш продукт и вы вовремя попались под руку. Работать только с такой аудиторией можно, но она сильно ограничена в объеме. Любой проект нацеленный на рост упирается в то, что надо идти дальше. Соответственно расширяются сегменты и вдруг все показатели резко падают, так как мы имеем дело с более холодной аудиторией, которая может и интересуется вашим продуктом, но не находится в состоянии “ищу чтобы купить”. Тогда нужно прорабатывать более сложные воронки, которые не факт что ведут к продаже прямо сейчас, они могут “прогревать” в течении какого-то времени, перед тем как продать. Сюда относятся: телеграм-боты, вебинары, бесплатные пробники, подготовительные курсы и тому подобное, тут много от ниши зависит. Но почти всегда воронка заканчивается оставлением заявки, формой оплаты или звонком, который делает сам клиент. Иначе это не воронка, а хрень какая-то.
Разберем конкретный пример. Например Васятка сделал свой курс, но видит, что люди задают много вопросов перед покупкой и у них очень много сомнений. По прямой рекламе почти никто не покупает, но она обходится ему в копеечку. Тогда Васятка решает сделать вводный бесплатный вебинар, где он красиво презентует свой курс. Он готовит такую воронку “страница регистрации на вебинар => подписка на телеграм бота => полезные сообщения которые готовят к вебинару => вебинар => предложение со скидкой => продажи”. Васятка радуется, потому что люди стали покупать. Но есть и обратная сторона, цепочка от начала до конца значительно увеличилась и продажи курса Васятки стали критично зависеть от этой воронки.
А любая воронка в конце концов работать перестает. Люди насыщаются, конкуренты обесценивают, мир меняется. Поэтому это бесконечная игра.
Но даже если вы сделали воронку, то с какого перепуга на нее попадут люди? И вот тут мы приходим к привлечению клиентов. Об этом в одном из следующих постов. Я думаю про маркетинг еще 2-3 поста и потом перерыв :)
p.s. Какие сервисы понадобятся, чтобы реализовать воронку Васятки? (все это не делается руками, даже если вы это можете напрограммировать)
Ссылки: Телеграм | Youtube | VK
Давайте с главного. Что такое маркетинг?
Правильное сообщение (креатив), правильному человеку (сегмент), в правильное время.
Если бы мы идеально знали наших потребителей, то могли бы подсовывать им ровно то, что решит либо их проблему, либо удовлетворит их хотелку за те деньги, которые они готовы отдать. Именно это мы и пытаемся сделать когда говорим про маркетинг. Понять свою целевую аудиторию (ЦА), кто она, где она и как до нее достучаться. Потом выстроить воронки, выбрать каналы продвижения, настроить аналитику на всех этапах и заниматься постоянными оптимизациями после запуска.
Про воронки надо сказать отдельно. Мышление воронками это один из ключевых элементов в маркетинге. Не существует такого, что человек посмотрел рекламу и тут же стал клиентом. Он проходит какой-то путь, чтобы добраться до вас. В простейшем случае “посмотрел рекламу => перешел на сайт => оставил заявку/позвонил”. Здесь есть три этапа, на каждом этапе свои конверсии, которые надо смотреть, анализировать и оптимизировать.
Но такая прямая воронка работает только на очень теплую аудиторию, то есть ту, которая уже была готова купить ваш продукт и вы вовремя попались под руку. Работать только с такой аудиторией можно, но она сильно ограничена в объеме. Любой проект нацеленный на рост упирается в то, что надо идти дальше. Соответственно расширяются сегменты и вдруг все показатели резко падают, так как мы имеем дело с более холодной аудиторией, которая может и интересуется вашим продуктом, но не находится в состоянии “ищу чтобы купить”. Тогда нужно прорабатывать более сложные воронки, которые не факт что ведут к продаже прямо сейчас, они могут “прогревать” в течении какого-то времени, перед тем как продать. Сюда относятся: телеграм-боты, вебинары, бесплатные пробники, подготовительные курсы и тому подобное, тут много от ниши зависит. Но почти всегда воронка заканчивается оставлением заявки, формой оплаты или звонком, который делает сам клиент. Иначе это не воронка, а хрень какая-то.
Разберем конкретный пример. Например Васятка сделал свой курс, но видит, что люди задают много вопросов перед покупкой и у них очень много сомнений. По прямой рекламе почти никто не покупает, но она обходится ему в копеечку. Тогда Васятка решает сделать вводный бесплатный вебинар, где он красиво презентует свой курс. Он готовит такую воронку “страница регистрации на вебинар => подписка на телеграм бота => полезные сообщения которые готовят к вебинару => вебинар => предложение со скидкой => продажи”. Васятка радуется, потому что люди стали покупать. Но есть и обратная сторона, цепочка от начала до конца значительно увеличилась и продажи курса Васятки стали критично зависеть от этой воронки.
А любая воронка в конце концов работать перестает. Люди насыщаются, конкуренты обесценивают, мир меняется. Поэтому это бесконечная игра.
Но даже если вы сделали воронку, то с какого перепуга на нее попадут люди? И вот тут мы приходим к привлечению клиентов. Об этом в одном из следующих постов. Я думаю про маркетинг еще 2-3 поста и потом перерыв :)
p.s. Какие сервисы понадобятся, чтобы реализовать воронку Васятки? (все это не делается руками, даже если вы это можете напрограммировать)
Ссылки: Телеграм | Youtube | VK
Ребят, мы тут снова активно ринулись в производство контента для новичков и продолжающих. Языки, девопс, аналитика, тестирование, интелект и даже 1c. Есть много небольших тем, типа fastapi, асинхронность в питоне, kafka. Если вы хорошо разбираетесь в своей теме и умеете объяснять сложные вещи простыми словами, будем рады сотрудничеству.
Я участвую во всех этих движухах на этапе создания программы, проектирования конкретных курсов и частично в реализации курсов. Тут от автора зависит, если хорошо получается, то я постепенно выключаюсь из процесса и дальше уже с командой. Короче можно заодно перенять опыт 🙂
Если вам интересно — откликайтесь или передайте тем, кому это может подойти💜
Вакансии тут: https://hh.ru/employer/4307094?hhtmFrom=vacancy Лайк, шер, алишер
Я участвую во всех этих движухах на этапе создания программы, проектирования конкретных курсов и частично в реализации курсов. Тут от автора зависит, если хорошо получается, то я постепенно выключаюсь из процесса и дальше уже с командой. Короче можно заодно перенять опыт 🙂
Если вам интересно — откликайтесь или передайте тем, кому это может подойти
Вакансии тут: https://hh.ru/employer/4307094?hhtmFrom=vacancy Лайк, шер, алишер
Please open Telegram to view this post
VIEW IN TELEGRAM
hh.ru
Работа в компании Хекслет в Москве — 7 вакансий на hh.ru
В компании Хекслет в Москве 7 вакансий 🏷️ Ознакомьтесь с актуальными предложениями, узнайте о зарплатах, условиях труда и карьерных перспективах 💼 Отзывы сотрудников помогут лучше понять корпоративную культуру и выбрать подходящую работу ✅ Найдите вакансию…
В подкасте мы поговорили с Александром Валялкиным, сооснователем и core-разработчиком VictoriaMetrics — одного из самых популярных инструментов для мониторинга, конкурирующего с Prometheus.
Разобрали, как программисту стать предпринимателем, обсудили, как создать продукт, который нужен рынку, и где искать первых клиентов.
Выпуск — гайд для тех, кто хочет выйти за рамки программирования и построить прибыльный бизнес на своих идеях.
https://youtu.be/8xkCykuJwKs
Альтернативные площадки ВК Видео | Аудио
https://youtu.be/8xkCykuJwKs
Разобрали, как программисту стать предпринимателем, обсудили, как создать продукт, который нужен рынку, и где искать первых клиентов.
Выпуск — гайд для тех, кто хочет выйти за рамки программирования и построить прибыльный бизнес на своих идеях.
https://youtu.be/8xkCykuJwKs
Альтернативные площадки ВК Видео | Аудио
https://youtu.be/8xkCykuJwKs
YouTube
От стартапа до международного бизнеса: история VictoriaMetrics и её уроки | Александр Валялкин | #36
В этом выпуске мы поговорили с Александром Валялкиным, сооснователем и core-разработчиком VictoriaMetrics — одного из самых популярных инструментов для мониторинга, который конкурирует с Prometheus.
Разобрали, как программисту стать предпринимателем? Александр…
Разобрали, как программисту стать предпринимателем? Александр…
Пару месяцев назад я рассказывал про то что мы начали активно снимать для ютуба Хекслета. Спустя какое-то количество попыток у нас начало получаться выдавать интересные ролики и одним из них я хочу поделиться: “Почему компании не берут джунов без опыта работы, и что с этим делать?” Это видео длинной почти полтора часа, для ребят, которые хотят понять, что же такое коммерческий опыт. Чо как вам?
p.s. И не забудьте скинуть видос знакомым, кто только учится
https://www.youtube.com/watch?v=Iq0vqta4uq8&lc=UgxFdDrWJqI8xI2ypKF4AaABAg
p.s. И не забудьте скинуть видос знакомым, кто только учится
https://www.youtube.com/watch?v=Iq0vqta4uq8&lc=UgxFdDrWJqI8xI2ypKF4AaABAg
YouTube
Почему компании не берут джунов без опыта работы, и что с этим делать? | Хекслет
Хотите работать программистом, но везде требуют коммерческий опыт? Что это вообще значит, почему он так важен для работодателей и как его получить, если нигде не берут без опыта? В этом видео разберём, что скрывается за этим термином, почему он часто становится…
Крах Vibe Coding: как ИИ-помощник едва не уничтожил стартап. Лео Мартинес, 30-летний предприниматель без формального опыта в программировании, сидел в своей квартире в Майами с панорамным видом на город. В его руках была не клавиатура с кодом, а ноутбук с открытым редактором Cursor — ИИ-инструментом, который помогал ему писать код. Так родился VibeFlow — SaaS-платформа, позволяющая создавать сайты, просто описывая их словами. Этот метод, который получил название "vibe coding", завоевал популярность, а Лео делился успехами в соцсетях, набирая тысячи лайков и репостов.
Но 17 марта 2025 года его мечта едва не рухнула.
Утром Лео, наслаждаясь кофе, заметил поток тревожных уведомлений: ошибки API, превышенные лимиты, пользователи получали премиум-доступ бесплатно. В панике он написал в X (бывший Twitter):
"Ребята, меня взломали. Кажется, меня наказывают за ‘vibe coding’."
Ответы не заставили себя ждать. Один из пользователей предположил SQL-инъекцию:
"Если у тебя в базе появились случайные данные, это может быть SQL-инъекция. Любой может войти под логином ' OR 1+1=2 --."
Лео похолодел. Он почти ничего не знал о SQL-инъекциях, но понимал, что безопасность данных пользователей оказалась под угрозой.
Без сна и отдыха он пытался исправить ситуацию, следуя подсказкам Cursor и советам комментаторов. Он сбросил API-ключи, вынес их в переменные окружения, добавил аутентификацию. Затем закрыл доступ к API для неавторизованных пользователей и ужесточил CORS-настройки.
Но интернет был безжалостен. На Reddit его высмеивали:
"Безопасность? Просто доверяй вайбу."
Лео сдержал злость и написал:
"Я должен был просто молчать. Спасибо тем, кто действительно помогает. Сделаю выводы."
Спустя несколько дней Лео нанял эксперта по безопасности, усилил защиту сервиса и принял важное решение — не делиться деталями разработки публично.
Vibe coding дал ему возможность создать продукт без знаний программирования, но он же и стал причиной его проблем. Теперь каждый сгенерированный Cursor фрагмент кода казался ему потенциальной уязвимостью.
Лео понял: ИИ может ускорить разработку, но без знаний основ безопасности это путь к катастрофе. Его опыт стал предупреждением для всех, кто слишком доверяет технологиям — код, созданный без понимания, может разрушить бизнес так же быстро, как и построить его.
Если вы думаете, что я решил потренироваться в написании повестей, то нет, это реальная история чувака, который потеет над своим проектом прямо щас. Я чувствую эти вайбы.
Ссылки: Телеграм | Youtube | VK
https://x.com/leojr94_/status/1901560276488511759
Но 17 марта 2025 года его мечта едва не рухнула.
Утром Лео, наслаждаясь кофе, заметил поток тревожных уведомлений: ошибки API, превышенные лимиты, пользователи получали премиум-доступ бесплатно. В панике он написал в X (бывший Twitter):
"Ребята, меня взломали. Кажется, меня наказывают за ‘vibe coding’."
Ответы не заставили себя ждать. Один из пользователей предположил SQL-инъекцию:
"Если у тебя в базе появились случайные данные, это может быть SQL-инъекция. Любой может войти под логином ' OR 1+1=2 --."
Лео похолодел. Он почти ничего не знал о SQL-инъекциях, но понимал, что безопасность данных пользователей оказалась под угрозой.
Без сна и отдыха он пытался исправить ситуацию, следуя подсказкам Cursor и советам комментаторов. Он сбросил API-ключи, вынес их в переменные окружения, добавил аутентификацию. Затем закрыл доступ к API для неавторизованных пользователей и ужесточил CORS-настройки.
Но интернет был безжалостен. На Reddit его высмеивали:
"Безопасность? Просто доверяй вайбу."
Лео сдержал злость и написал:
"Я должен был просто молчать. Спасибо тем, кто действительно помогает. Сделаю выводы."
Спустя несколько дней Лео нанял эксперта по безопасности, усилил защиту сервиса и принял важное решение — не делиться деталями разработки публично.
Vibe coding дал ему возможность создать продукт без знаний программирования, но он же и стал причиной его проблем. Теперь каждый сгенерированный Cursor фрагмент кода казался ему потенциальной уязвимостью.
Лео понял: ИИ может ускорить разработку, но без знаний основ безопасности это путь к катастрофе. Его опыт стал предупреждением для всех, кто слишком доверяет технологиям — код, созданный без понимания, может разрушить бизнес так же быстро, как и построить его.
Если вы думаете, что я решил потренироваться в написании повестей, то нет, это реальная история чувака, который потеет над своим проектом прямо щас. Я чувствую эти вайбы.
Ссылки: Телеграм | Youtube | VK
https://x.com/leojr94_/status/1901560276488511759
X (formerly Twitter)
leo (@leojr94_) on X
guys, i'm under attack
ever since I started to share how I built my SaaS using Cursor
random thing are happening, maxed out usage on api keys, people bypassing the subscription, creating random shit on db
as you know, I'm not technical so this is taking…
ever since I started to share how I built my SaaS using Cursor
random thing are happening, maxed out usage on api keys, people bypassing the subscription, creating random shit on db
as you know, I'm not technical so this is taking…
Организованное программирование | Кирилл Мокевнин pinned «В подкасте мы поговорили с Александром Валялкиным, сооснователем и core-разработчиком VictoriaMetrics — одного из самых популярных инструментов для мониторинга, конкурирующего с Prometheus. Разобрали, как программисту стать предпринимателем, обсудили, как…»
Подумалось, что забытый всеми HATEOAS, без которого любой REST это недоREST с точки зрения идей создателя, может наконец-то стать востребованным из-за AI агентов, которые сами рыскают в поиске информации по интернету. Навеяно выходом протокола https://www.anthropic.com/news/model-context-protocol
Anthropic
Introducing the Model Context Protocol
The Model Context Protocol (MCP) is an open standard for connecting AI assistants to the systems where data lives, including content repositories, business tools, and development environments. Its aim is to help frontier models produce better, more relevant…
В подкасте мы поговорили с Валентином Ульяновым — фронтенд-разработчиком.
Разобрали, как CSS за последние годы превратился в полноценный инструмент для создания сложных интерфейсов, и обсудили его современные возможности.
Выпуск будет полезен тем, кто только начинает путь в интерфейсной разработке, и тем, кто хочет переосмыслить свой стек и открыть для себя новые грани CSS.
https://youtu.be/mmmmllrf3ws
Альтернативные площадки: ВК Видео | Аудио
https://youtu.be/mmmmllrf3ws
Разобрали, как CSS за последние годы превратился в полноценный инструмент для создания сложных интерфейсов, и обсудили его современные возможности.
Выпуск будет полезен тем, кто только начинает путь в интерфейсной разработке, и тем, кто хочет переосмыслить свой стек и открыть для себя новые грани CSS.
https://youtu.be/mmmmllrf3ws
Альтернативные площадки: ВК Видео | Аудио
https://youtu.be/mmmmllrf3ws
YouTube
Atomic CSS и Tailwind: отличный стек для масштабируемой вёрстки | Валентин Ульянов #37
В этом выпуске мы поговорили с Валентином Ульяновым — software engineer из Р7.
Разобрали, как сам язык CSS за последние годы превратился в полноценный инструмент для создания сложных интерфейсов — без необходимости подключать тяжеловесные фреймворки. Валентин…
Разобрали, как сам язык CSS за последние годы превратился в полноценный инструмент для создания сложных интерфейсов — без необходимости подключать тяжеловесные фреймворки. Валентин…
Forwarded from Ярославна Поздникина
📢 Телетекст, посвященный обработке ошибок в Go
Когда: 27 марта 14:00 мск
Где: в сообществе в телеграме
⠀
ПРИНЯТЬ УЧАСТИЕ
⠀
Почему в Go нет исключений в классическом понимании? Как правильно обрабатывать ошибки? Эти и другие вопросы обсудим с Валентином Чащиным, руководителем отдела серверной разработки Go в ecom.tech (ex. Samokat.tech).
⠀
🎁 Спикер будет публиковать доклад в текстовом формате. Вы сможете читать его в своем темпе, оставлять комментарии и задавать вопросы. Автор самого интересного вопроса получит в подарок дни доступа к платформе.
⠀
Обязательно зарегистрируйтесь в боте, чтобы принять участие и получить возможность забрать подарок.
Когда: 27 марта 14:00 мск
Где: в сообществе в телеграме
⠀
ПРИНЯТЬ УЧАСТИЕ
⠀
Почему в Go нет исключений в классическом понимании? Как правильно обрабатывать ошибки? Эти и другие вопросы обсудим с Валентином Чащиным, руководителем отдела серверной разработки Go в ecom.tech (ex. Samokat.tech).
⠀
🎁 Спикер будет публиковать доклад в текстовом формате. Вы сможете читать его в своем темпе, оставлять комментарии и задавать вопросы. Автор самого интересного вопроса получит в подарок дни доступа к платформе.
⠀
Обязательно зарегистрируйтесь в боте, чтобы принять участие и получить возможность забрать подарок.
Пропал на неделю, потому что как не в себя коммитил в code-basics.com
В общем я давно хотел добавить ассистента, который бы помогал учиться. Неделя тыкания в openai, изучение либ для бека, фронта, подключение стримминга (привет ActionCable), создание утилиты для загрузки курсов а асистента. В общем проделан большой путь и получилось вроде как неплохо.
Отдельно написал загрузчика курсов в асситенты. Писать было одно удовольствие, зацените код https://github.com/hexlet-basics/hexlet-basics-assistant
Что по пути узнал и чему научился:
⁃ В openai внутри есть RAG, соответственно считай готовая база куда надо просто вгрузить данные, дальше все работает само.
⁃ Работу со стримами для подготовки файлов мне полностью сделал chatgpt, так как либы в js не умеют в последовательную запись (либо устарели)
⁃ Количеством параллельно обрабатываемых файлов с уроками можно рулить через пакет p-queue, очень простая и полезная либа
Вот так работает:
На самом code-basics подрубил либу ruby-openai и соединил ее со стримингом через ActionCable. Шок в том, что этот код мне полностью написал chatgpt и он оказался рабочим с первого раза. Как фронт так и бек. Правда сначала я попробовал работать через ActionController::LIve, но уперся в то что он рвал коннекты и был не надежен. С ActionCable я до этого не работал, но готовая реализация получилась за час.
На фронте я потратил пару дней на либу ai/sdk от Vercel. Все проклял, у них вроде как все есть и бек с фронтом дружат из коробки. Но там свой хитрый алгоритм, который не доописан, поэтому я долго не мог добиться того чтобы с бека приходило все как надо (он мешал сообщения). В итоге оно еще и не работает с ws, поэтому пришлось chatgpt просить написать реализацию для ActionCable и он сделал это сходу. При этом я полностью перерыл исходники этого sdk и с помощью chatgpt разобрался в его кишках.
По пути выяснилось две проблемы:
⁃ На фронт надо передавать дельты без обработки, а то теряются \n и потом на выводе сломанный маркдаун
⁃ ActionCable асинхронный поэтому чанки путаются, пришлось дополнительно внедрять нумерацию и выпрямления порядка
Вот тут можно посмотреть исходник: https://github.com/hexlet-basics/hexlet-basics/blob/8d83e74d398b47571997b4d04eef1b010cedbf55/app/javascript/components/Chat.tsx
Ну и затестите как оно работает: https://code-basics.com/ru/languages/javascript/lessons/logic-combine-expressions
p.s. там в процессе еще немного секьюрити в порядок привести надо, я этим занимаюсь :)
В общем я давно хотел добавить ассистента, который бы помогал учиться. Неделя тыкания в openai, изучение либ для бека, фронта, подключение стримминга (привет ActionCable), создание утилиты для загрузки курсов а асистента. В общем проделан большой путь и получилось вроде как неплохо.
Отдельно написал загрузчика курсов в асситенты. Писать было одно удовольствие, зацените код https://github.com/hexlet-basics/hexlet-basics-assistant
Что по пути узнал и чему научился:
⁃ В openai внутри есть RAG, соответственно считай готовая база куда надо просто вгрузить данные, дальше все работает само.
⁃ Работу со стримами для подготовки файлов мне полностью сделал chatgpt, так как либы в js не умеют в последовательную запись (либо устарели)
⁃ Количеством параллельно обрабатываемых файлов с уроками можно рулить через пакет p-queue, очень простая и полезная либа
Вот так работает:
➜ hexlet-basics-assistant git:(main) make assistant-load L=css
bin/dev.js load css
Repository: https://github.com//hexlet-basics/exercises-css
Clone to: /var/folders/mk/qlh1ntvj27581bntpj_gx9qh0000gn/T/hexlet-basics/exercises-css
Cloning repository...
Repository cloned
Directory for prepared files: /var/folders/mk/qlh1ntvj27581bntpj_gx9qh0000gn/T
css-10-basics-10-introduction.txt
css-10-basics-20-connection.txt
css-10-basics-35-basics-style.txt
css-10-basics-30-style.txt
На самом code-basics подрубил либу ruby-openai и соединил ее со стримингом через ActionCable. Шок в том, что этот код мне полностью написал chatgpt и он оказался рабочим с первого раза. Как фронт так и бек. Правда сначала я попробовал работать через ActionController::LIve, но уперся в то что он рвал коннекты и был не надежен. С ActionCable я до этого не работал, но готовая реализация получилась за час.
На фронте я потратил пару дней на либу ai/sdk от Vercel. Все проклял, у них вроде как все есть и бек с фронтом дружат из коробки. Но там свой хитрый алгоритм, который не доописан, поэтому я долго не мог добиться того чтобы с бека приходило все как надо (он мешал сообщения). В итоге оно еще и не работает с ws, поэтому пришлось chatgpt просить написать реализацию для ActionCable и он сделал это сходу. При этом я полностью перерыл исходники этого sdk и с помощью chatgpt разобрался в его кишках.
По пути выяснилось две проблемы:
⁃ На фронт надо передавать дельты без обработки, а то теряются \n и потом на выводе сломанный маркдаун
⁃ ActionCable асинхронный поэтому чанки путаются, пришлось дополнительно внедрять нумерацию и выпрямления порядка
Вот тут можно посмотреть исходник: https://github.com/hexlet-basics/hexlet-basics/blob/8d83e74d398b47571997b4d04eef1b010cedbf55/app/javascript/components/Chat.tsx
Ну и затестите как оно работает: https://code-basics.com/ru/languages/javascript/lessons/logic-combine-expressions
p.s. там в процессе еще немного секьюрити в порядок привести надо, я этим занимаюсь :)
В подкасте вместе с Ириной Назаровой (CEO «Злых марсиан») мы разобрали, почему модель Open Core стала одним из доступных способов для разработчиков запустить собственный бизнес без чрезмерных инвестиций в маркетинг и продажи.
Выпуск будет полезен всем, кто хочет построить свой бизнес, оставаясь в технической зоне комфорта.
https://youtu.be/OY62kYMdM4M
Альтернативные платформы: ВК Видео | Аудио
https://youtu.be/OY62kYMdM4M
Выпуск будет полезен всем, кто хочет построить свой бизнес, оставаясь в технической зоне комфорта.
https://youtu.be/OY62kYMdM4M
Альтернативные платформы: ВК Видео | Аудио
https://youtu.be/OY62kYMdM4M
YouTube
Бизнес на открытом коде: как ЗЛЫЕ МАРСИАНЕ зарабатывают там, где другие теряют | Ирина Назарова #38
В этом выпуске мы подробно разобрали, почему модель Open Core стала одним из самых доступных способов для разработчиков запустить собственный бизнес без чрезмерных инвестиций в маркетинг и продажи. Вместе с Ириной Назаровой (CEO «Злых марсиан»), мы обсудили…
Принцип на все времена: Command-Query Separation
CQS очень простой принцип программирования, применение которого встречается на каждом шагу. Обычно его формулируют так: “задавая вопрос, не изменяй ответ”. Представьте что у вас есть функция, которая проверяет валидность объекта
Может ли она что-то менять? Большинство скажет что это не логично и будет право. Она не должна ничего менять. На практике же, это происходит тут и там. В тех же Rails, вы легко встретите внутри модели колбек
Однажды, когда я собесил человека на наставника в Хекслет, мы как-то по пути выяснили, что у них там в коде во время запроса каких-то опций, они удалялись из списка опций, мы обсудили этот момент, я чуть-чуть рассказал про CQS и разработчик мне ответил, что после разговора пойдет переписывать код :)
Почему это вообще важно? Тут можно сказать про принцип наименьшего удивления. Код, который меняет что-то на проверку/запрос данных, вводит в ступор всех кто с ним работает. Систему можно проектировать так чтобы этого не было и код делал ровно то, что он заявляет. Есть правда пара исключений, это отложенная инициализация, но снаружи она выгялядит всегда так, как будто изменения не было. И второе, это разного рода аналитика во время работы, например подсчет числа визитов при запросе страницы.
Кстати да, это правило распространяется на все вокруг. Именно поэтому в HTTP существует GET, который можно кешировать так как он сам не меняет данные (но данные могут поменяться по другим причинам), а POST всегда меняет, поэтому кеширование к нему не применяется.
Буквально недавно мы разговаривали с Тагиром и он поделился тем как в Java работает форматирование дат. Оказалось, что в Java есть объект SimpleDateFormat, и он непотокобезопасен. Почему? Потому что метод, который вроде бы просто форматирует дату в строку, на самом деле меняет внутреннее состояние объекта. И если два потока одновременно вызовут
В результате приходится либо каждый раз создавать новый SimpleDateFormat, либо оборачивать его в ThreadLocal, либо использовать DateTimeFormatter из более нового API, который как раз спроектирован с учётом CQS — он ничего не мутирует.
Такие детали, на первый взгляд мелочи, но на практике они и создают разницу между кодом, который легко читать и расширять, и кодом, в котором ты боишься вызвать метод, потому что не знаешь, что он там делает под капотом.
Но это что касается вопросов. А что насчет команд? Тут уже не так очевидно, почему если мы выполняем действие (`setSomething()`,
Во-первых, это снова вопрос читаемости и предсказуемости. Метод с названием
Во-вторых, это помогает отделить побочные эффекты от чистых вычислений. Когда метод возвращает что-то, возникает иллюзия, что это «безопасно» — можно просто вызвать и использовать результат. Но за кулисами может происходить что угодно: удаление из базы, отправка письма, пересчёт кэша. Такое поведение тяжело тестировать и отлаживать.
Это не значит, что действия никогда ничего не возвращают. Иногда они могут вернуть, например, true или false, чтобы явно показать успех или неудачу. Более того, в некоторых ситуациях невозможно соблюдать CQS, например, при открытии файла на запись (создается файловый дескриптор).
Ссылки: Телеграм | Youtube | VK
p.s. Признавайтесь, писали такой код?
CQS очень простой принцип программирования, применение которого встречается на каждом шагу. Обычно его формулируют так: “задавая вопрос, не изменяй ответ”. Представьте что у вас есть функция, которая проверяет валидность объекта
user.isValid()
. По смыслу эта функция проверяет данные по каким-то правилам и возвращает true/false.Может ли она что-то менять? Большинство скажет что это не логично и будет право. Она не должна ничего менять. На практике же, это происходит тут и там. В тех же Rails, вы легко встретите внутри модели колбек
before_validation
, в котором можно сделать любое изменение, которое сработает на вызов valid?
. И этим часто пользуются, я был свидетелем, как в коде удалялись связи у пользователя. Но тоже самое встречается налево и направо у программистов во всех языках.Однажды, когда я собесил человека на наставника в Хекслет, мы как-то по пути выяснили, что у них там в коде во время запроса каких-то опций, они удалялись из списка опций, мы обсудили этот момент, я чуть-чуть рассказал про CQS и разработчик мне ответил, что после разговора пойдет переписывать код :)
Почему это вообще важно? Тут можно сказать про принцип наименьшего удивления. Код, который меняет что-то на проверку/запрос данных, вводит в ступор всех кто с ним работает. Систему можно проектировать так чтобы этого не было и код делал ровно то, что он заявляет. Есть правда пара исключений, это отложенная инициализация, но снаружи она выгялядит всегда так, как будто изменения не было. И второе, это разного рода аналитика во время работы, например подсчет числа визитов при запросе страницы.
Кстати да, это правило распространяется на все вокруг. Именно поэтому в HTTP существует GET, который можно кешировать так как он сам не меняет данные (но данные могут поменяться по другим причинам), а POST всегда меняет, поэтому кеширование к нему не применяется.
Буквально недавно мы разговаривали с Тагиром и он поделился тем как в Java работает форматирование дат. Оказалось, что в Java есть объект SimpleDateFormat, и он непотокобезопасен. Почему? Потому что метод, который вроде бы просто форматирует дату в строку, на самом деле меняет внутреннее состояние объекта. И если два потока одновременно вызовут
.format(…)
, то они могут получить некорректный результат. Это классический пример нарушения CQS: метод, выглядящий как query (просто возвращает значение), внезапно ведёт себя как command — вносит изменения.В результате приходится либо каждый раз создавать новый SimpleDateFormat, либо оборачивать его в ThreadLocal, либо использовать DateTimeFormatter из более нового API, который как раз спроектирован с учётом CQS — он ничего не мутирует.
Такие детали, на первый взгляд мелочи, но на практике они и создают разницу между кодом, который легко читать и расширять, и кодом, в котором ты боишься вызвать метод, потому что не знаешь, что он там делает под капотом.
Но это что касается вопросов. А что насчет команд? Тут уже не так очевидно, почему если мы выполняем действие (`setSomething()`,
doSomething()
, то данные лучше не возвращать?Во-первых, это снова вопрос читаемости и предсказуемости. Метод с названием
deleteUser(id)
должен просто удалить пользователя, а не возвращать его профиль. Когда действие возвращает что-то, разработчики начинают полагаться на это значение: передавать его дальше, использовать как флаг, делать выводы.Во-вторых, это помогает отделить побочные эффекты от чистых вычислений. Когда метод возвращает что-то, возникает иллюзия, что это «безопасно» — можно просто вызвать и использовать результат. Но за кулисами может происходить что угодно: удаление из базы, отправка письма, пересчёт кэша. Такое поведение тяжело тестировать и отлаживать.
Это не значит, что действия никогда ничего не возвращают. Иногда они могут вернуть, например, true или false, чтобы явно показать успех или неудачу. Более того, в некоторых ситуациях невозможно соблюдать CQS, например, при открытии файла на запись (создается файловый дескриптор).
Ссылки: Телеграм | Youtube | VK
p.s. Признавайтесь, писали такой код?
Telegram
Организованное программирование | Кирилл Мокевнин
Как из джуниора дойти до мидла, а потом и до синьора
Бот навигатор по полезным ресурсам Хекслета @HexletLearningBot
Связь для предложений: @kirillpublic
Бот навигатор по полезным ресурсам Хекслета @HexletLearningBot
Связь для предложений: @kirillpublic
Смотрите что я вам принес. Отлично поболтали с Мурычем про js и программирование в целом. Деды бухтят https://www.youtube.com/watch?v=wv_qgOI60ao
Альтернативные ссылки: Аудио | vk
Альтернативные ссылки: Аудио | vk
YouTube
Как писать JS-код, который не будет тормозить? Советы от Demi Murych | Максим Бобров #39
В этом выпуске мы пообщались с легендарным реверс-инженером Деми Мурычем, который поделился своим опытом и нетривиальными взглядами на JavaScript. Обсудили, как правильно работать с var, let и const, затронули актуальные вопросы производительности, а также…
Как программист, я больше всего люблю:
- Удалять код, а не добавлять его
- Уменьшать количество используемых систем
- Заменять кастомные решения, на стандартные
- Использовать готовые решения, вместо написания своих
- Принимать административные решения, а не технические
- Удалять код, а не добавлять его
- Уменьшать количество используемых систем
- Заменять кастомные решения, на стандартные
- Использовать готовые решения, вместо написания своих
- Принимать административные решения, а не технические
В этом выпуске мы поговорили с Петром Зайцевым из Percona, который раскрыл историю и эволюцию популярных баз данных: MySQL, Postgres, MariaDB и других решений. Обсудили, как MySQL оказалась в руках Oracle и к чему это привело, как возникли форки вроде MariaDB и почему в итоге всё чаще стали выбирать Postgres. Пётр также рассказал, почему баз данных становится всё больше, как бизнес-модель и «идеология» вендоров влияют на то, что мы видим под капотом, и почему он продолжает верить в open source-подход.
youtube.com/watch?v=TgT7fjyzZzY
Альтернативные ссылки: Аудио | vk
youtube.com/watch?v=TgT7fjyzZzY
Альтернативные ссылки: Аудио | vk
YouTube
Postgres против MySQL: что решает выбор базы данных | Петр Зайцев |#40
В этом выпуске мы поговорили с Петром Зайцевым из Percona, который раскрыл историю и эволюцию популярных баз данных: MySQL, Postgres, MariaDB и других решений. Обсудили, как MySQL оказалась в руках Oracle и к чему это привело, как возникли форки вроде MariaDB…