Продолжаем бодаться с электронным болваном.
Коллега недавно писал про «спираль энтропии». Как это выгдядит на практике: делаю прототип на Spring. Есть обычный класс
А вот другой пример, когда я сам не до конца понимаю, что делаю. Нужно было развернуть небольшой набор приложений в кубере. Сначала всё выглядело нормально, потом система постепенно обросла костылями. Что-то не заработало — ИИ в попытках починить начал накидывать всё более странные решения, причем на первый взгляд даже рабочие. Но после пересоздания подов всё снова разваливалось.
Проблема в том, что в кубере я разбираюсь поверхностно и не смог вовремя понять, что именно ломается и почему.
И это был совсем небольшой кейс, без какого-то сверхэнтерпрайза. Назовем этот эффект «я не знаю, чего я не знаю». Мы не говорим, что это все не работает (напротив, если понимать что ты делаешь, то еще как). Но если у тебя нет собственной экспертизы, ты можешь долго смотреть на деградацию системы и принимать её за прогресс. А некоторые команды даже ищут людей, чтобы детектить ИИ-слоп и не пущать его в код
Коллега недавно писал про «спираль энтропии». Как это выгдядит на практике: делаю прототип на Spring. Есть обычный класс
LLMProvider, который отвечает за доступ к LLM. Вместо того чтобы подключить его через IoC-контейнер, ИИ просто создает экземпляр прямо в контроллере. Или вместо того, чтобы повторяющиеся куски промпта вынести в отдельный файл, мы получаем копипасту. И таких мелочей набегает целое ведро: нечитабельные тесты, кривое управление зависимостями, утечки ресурсов, да и просто какой-то мусор. Здесь хотя бы спасает то, что я понимаю, как должно быть устроено.А вот другой пример, когда я сам не до конца понимаю, что делаю. Нужно было развернуть небольшой набор приложений в кубере. Сначала всё выглядело нормально, потом система постепенно обросла костылями. Что-то не заработало — ИИ в попытках починить начал накидывать всё более странные решения, причем на первый взгляд даже рабочие. Но после пересоздания подов всё снова разваливалось.
Проблема в том, что в кубере я разбираюсь поверхностно и не смог вовремя понять, что именно ломается и почему.
И это был совсем небольшой кейс, без какого-то сверхэнтерпрайза. Назовем этот эффект «я не знаю, чего я не знаю». Мы не говорим, что это все не работает (напротив, если понимать что ты делаешь, то еще как). Но если у тебя нет собственной экспертизы, ты можешь долго смотреть на деградацию системы и принимать её за прогресс. А некоторые команды даже ищут людей, чтобы детектить ИИ-слоп и не пущать его в код
Telegram
Intelligent Systems Architecture
ВОСХОДЯЩАЯ СПИРАТЬ ЭНТРОПИИ
ПАТТЕРН:
Агенты "мыслят" локальными оптимизациями и слепы к архитектуре системы в целом. Они внедряют зависимости «в лоб», плодят if/else-ветвления и без давления не проводят рефакторинг. Новые фиксы плодят костыли. Контекстное…
ПАТТЕРН:
Агенты "мыслят" локальными оптимизациями и слепы к архитектуре системы в целом. Они внедряют зависимости «в лоб», плодят if/else-ветвления и без давления не проводят рефакторинг. Новые фиксы плодят костыли. Контекстное…
💯20👍5🙈2❤1
В 100500-й раз наступаем на одни и те же грабли. Может, вам не придется
Вероятно, кому-то из вас все нижесказанное покажется капитанством, но в моей практике история повторяется раз за разом.
Есть фронтенд-приложение, которое в собранном виде — просто js/html-статика, отдаваемая nginx’ом напрямую в браузер пользователя (SPA). И тут возникает главный вопрос: а как прописывать URL до API бекенда?
Какие вообще есть варианты?
Первый (и самый часто встречающийся) — захардкодить URL при сборке фронта. Главный минус: при переносе на другой домен или развороте на новом стенде фронт придется пересобирать под новый адрес. Админы в восторге, конечно. А потом начинается: «ооой, а отключите нам пожалуйста CORS, у нас ничего не работает». Ну вообще-то CORS как раз для того и придумали, чтобы ничего не работало, когда не надо.
Второй вариант — как-то передавать URL через настройки. Но как? В статику особо ничего не передашь: это же скомпиленный в жс тупескрипт без собственного поведения на сервере.
Как обычно выкручиваются: веб-приложение ходит по относительному адресу без хоста. То есть берет текущий домен и к нему уже приделывает все остальное.
А на стороне nginx настраивается proxy_pass, который проксирует запросы с определенным префиксом (например,
В итоге:
— не нужно отключать CORS;
— фронт всегда ходит на тот же хост и порт;
— URL автоматически валиден на любом стенде и домене;
— фронт не нужно пересобирать под каждый environment.
У самого nginx тоже нет нормального механизма передачи параметров внутрь конфига (я тоже удивился, когда узнал, может сейчас уже что-то прикрутили), но и тут обычно выкручиваются через subst/envsubst.
Может, у вас есть и другие варианты, но этот подход уже тысячу раз обкатан. Есть нюансики, конечно, но в целом работает.
Вероятно, кому-то из вас все нижесказанное покажется капитанством, но в моей практике история повторяется раз за разом.
Есть фронтенд-приложение, которое в собранном виде — просто js/html-статика, отдаваемая nginx’ом напрямую в браузер пользователя (SPA). И тут возникает главный вопрос: а как прописывать URL до API бекенда?
Какие вообще есть варианты?
Первый (и самый часто встречающийся) — захардкодить URL при сборке фронта. Главный минус: при переносе на другой домен или развороте на новом стенде фронт придется пересобирать под новый адрес. Админы в восторге, конечно. А потом начинается: «ооой, а отключите нам пожалуйста CORS, у нас ничего не работает». Ну вообще-то CORS как раз для того и придумали, чтобы ничего не работало, когда не надо.
Второй вариант — как-то передавать URL через настройки. Но как? В статику особо ничего не передашь: это же скомпиленный в жс тупескрипт без собственного поведения на сервере.
Как обычно выкручиваются: веб-приложение ходит по относительному адресу без хоста. То есть берет текущий домен и к нему уже приделывает все остальное.
А на стороне nginx настраивается proxy_pass, который проксирует запросы с определенным префиксом (например,
/api/v1) дальше на бекенд.В итоге:
— не нужно отключать CORS;
— фронт всегда ходит на тот же хост и порт;
— URL автоматически валиден на любом стенде и домене;
— фронт не нужно пересобирать под каждый environment.
У самого nginx тоже нет нормального механизма передачи параметров внутрь конфига (я тоже удивился, когда узнал, может сейчас уже что-то прикрутили), но и тут обычно выкручиваются через subst/envsubst.
Может, у вас есть и другие варианты, но этот подход уже тысячу раз обкатан. Есть нюансики, конечно, но в целом работает.
Baeldung on Linux
Using Environment Variables in Nginx Config File | Baeldung on Linux
Learn how to use environment variables inside the Nginx config file.
👍10🔥5💯1
Я случайно открыл новый (или давно забытый) способ писать промпты.
Летел я из Джакарты домой в Сингапур. Как обычно:
- на Netflix ничего не скачано
- Wi-Fi в самолёте стоит как крыло от него самого
В общем, надо чем-то себя занять.
Решил пописать код. Тем более была вполне интересная задача: написать небольшой rule engine для банка. Но есть нюанс:
- интернета нет
- локальных LLM нет
- писать всё руками, как наши деды в 2022-м, тоже не хотелось
И тут мне пришла идея: а что если поиграть с LLM в TDD ping-pong? То есть я руками пишу самое важное — спецификацию в виде тестов.
А модель потом сама генерирует реализацию под этот контракт.
Получалось примерно так:
Сразу захотелось сделать красивый DSL для правил. Потому что если делать DSL — то обязательно универсальный, расширяемый, чтобы потом переиспользовать для всех продуктов (да-да, конечно). Иначе зачем вообще начинать 😄
В итоге за полтора часа полёта я написал 7 тестов, 0 строк реализации и абсолютно ничего не компилировалось. То есть классический успешный TDD session. А уже дома вместо огромного промпта на 3 экрана с объяснениями что я вообще хочу я просто сказал Cursor "Сделай так, чтобы тесты проходили"
И получилось… идеально. С первого раза все тесты зазеленели, классы получились маленькими, интерфейсы аккуратные и никакой магической лапши. И тут до меня дошла довольно простая мысль: спецификацию можно задать не словами, используя расплывчатые формулировки вида "гибко, красиво и удобно", а сразу запердолить контракт в виде тестов.
Выходит, что LLM намного проще быть хорошим инженером, когда ты перестаёшь разговаривать с ней как продакт и начинаешь как разработчик
Летел я из Джакарты домой в Сингапур. Как обычно:
- на Netflix ничего не скачано
- Wi-Fi в самолёте стоит как крыло от него самого
В общем, надо чем-то себя занять.
Решил пописать код. Тем более была вполне интересная задача: написать небольшой rule engine для банка. Но есть нюанс:
- интернета нет
- локальных LLM нет
- писать всё руками, как наши деды в 2022-м, тоже не хотелось
И тут мне пришла идея: а что если поиграть с LLM в TDD ping-pong? То есть я руками пишу самое важное — спецификацию в виде тестов.
А модель потом сама генерирует реализацию под этот контракт.
Получалось примерно так:
@Test
fun `when term deposit created allow only deposit`() {
val awaitFundingTd =
accountRuleSet {
withdrawal {
default { denyAny() }
}
deposit {
allowAny() { balances("funded") }
}
}
awaitFundingTd
.makeDecision(Withdrawal, "ATM Withdrawal")
.shouldBeDenied()
}
Сразу захотелось сделать красивый DSL для правил. Потому что если делать DSL — то обязательно универсальный, расширяемый, чтобы потом переиспользовать для всех продуктов (да-да, конечно). Иначе зачем вообще начинать 😄
В итоге за полтора часа полёта я написал 7 тестов, 0 строк реализации и абсолютно ничего не компилировалось. То есть классический успешный TDD session. А уже дома вместо огромного промпта на 3 экрана с объяснениями что я вообще хочу я просто сказал Cursor "Сделай так, чтобы тесты проходили"
И получилось… идеально. С первого раза все тесты зазеленели, классы получились маленькими, интерфейсы аккуратные и никакой магической лапши. И тут до меня дошла довольно простая мысль: спецификацию можно задать не словами, используя расплывчатые формулировки вида "гибко, красиво и удобно", а сразу запердолить контракт в виде тестов.
Выходит, что LLM намного проще быть хорошим инженером, когда ты перестаёшь разговаривать с ней как продакт и начинаешь как разработчик
👍54🔥11🍓5💯4🤝1🫡1
Не так давно писали про выкрутасы вендоров, а теперь случилось страшное: у них закончились деньги. По стону в кулуарах наблюдаем следующее — оказывается, у заказчиков и клиентов деньги тоже понемногу заканчиваются или хотя бы приходится их считать. Кто-то переходит на четырёхдневку, кто-то сокращает разрабов. В общем, приятного мало. Самая мякотка — у некоторых проблемы начались из-за технического долга. Если раньше, когда мы с Серёжей заикались о техдолге, нам снисходительно говорили: «ой да мы тут просто баблом зальём/людей наймем/etc, ты не сечёшь», — то теперь ВНЕЗАПНО это бабло кончилось, а проценты платить всё равно нужно. Наверное, надо просто побольше татуированных ажаиль-коучей нанять ИИшки внедрить, тогда точно придём к успеху. В общем, запасаемся попкорном и надеемся, что нас пронесёт.
А что у вас происходит?
А что у вас происходит?
Telegram
StringConcat - разработка без боли и сожалений
Мы в Satori тоже регулярно сталкиваемся с вендорами ПО. Раньше я как-то не особо обращал на это внимание… но теперь я просто в восхищении от того, как изящно устроен этот рынок. Узнал потрясающие вещи:
- Оказывается, API можно смело поставлять без документации…
- Оказывается, API можно смело поставлять без документации…
💯14🌚7👍5😁5❤1
Случилась очередная офигительная история у Meta (Компания Meta, владеющая Facebook, Instagram и WhatsApp, запрещена в РФ и признана экстремистской) с их AI. Если коротко, злоумышленники разговорили ИИ-ассистента, уговорили его сменить email на свой и сбросить пароль (социнженерия, только для нейросетки). Бот без проблем отправил код подтверждения на новый адрес. Даже двухфакторка не спасла. Говорят, спёрли кучу аккаунтов (сколько именно — молчат). Пример эксплуатации по ссылке.
Дайте непонятно как работающей штуковине полный доступ, повесьте на неё критически важные процессы. И что может пойти не так?
Дайте непонятно как работающей штуковине полный доступ, повесьте на неё критически важные процессы. И что может пойти не так?
X (formerly Twitter)
dbc (@madcat516) on X
@darkrai @instagram lol yeah, major exploit but there’s nothing you can do. It’s like the roblox ai assistant exploit from a few days ago where you could reset emails if you had their billing. Instagram on the other hand is even easier, you only need the…
😁44🔥4👍1
Энтерпрайз-код 11/10
Небольшой пятничный кек. Коллеги поделились кулстори. Есть некая система, которая ходит к этим самым коллегам по HTTP и периодически присылает кривые жсоны. Например:
То кавычки забудут, то ещё чего.
Как такое возможно, спросите вы? А всё потому, что этот жсон формируется огромным 30-этажным SQL-запросом из coalesce и конкатенаций. Что-то типа:
Я даже не знаю, как это комментировать и сколько SQL-инъекций с прочими уязвимостями сидит в такой конструкции. Зато теперь понятно, почему на просьбу добавить новое поле они реагируют так нервно.
В общем, отдать JSON прямо из базы можно через какой-нибудь json_agg, но не напрямую же (наверное, это будет недостаточно энтерпрайзно, да и админа БД просто так, что ли, нанимали?)
Небольшой пятничный кек. Коллеги поделились кулстори. Есть некая система, которая ходит к этим самым коллегам по HTTP и периодически присылает кривые жсоны. Например:
{
"id": 123123,
"name": ,
"attr": false
}То кавычки забудут, то ещё чего.
Как такое возможно, спросите вы? А всё потому, что этот жсон формируется огромным 30-этажным SQL-запросом из coalesce и конкатенаций. Что-то типа:
-- job security 99lvl, LLM себя из розетки выключит увидев такое
SELECT concat('{','"id":',t.id,',','"name":"',coalesce(coalesce(u.name,(select name from users where id=t.user_id and rownum=1)),' '),'",','"attr":',case when row_number() over (partition by t.user_id order by t.created_at) = 1 then lower(cast(t.attr as varchar(10))) else lower(cast(t.attr as varchar(10))) end,',','"settings":{','"lang":"',coalesce(u.lang,(select lang from user_prefs where user_id=t.user_id and rownum=1),'ru'),'",','"theme":',case when u.theme is null then 'null' when u.theme=1 then '"light"' when u.theme=2 then '"dark"' else concat('"',u.theme,'"') end,',','"notifications":',coalesce(cast(u.notif as varchar),(select cast(prefs as varchar) from user_prefs where user_id=t.user_id and rownum=1),'false'),'},','"roles":',(select concat('[',string_agg(concat('"',r.role_name,'"'),','),']') from user_roles r where r.user_id=u.id group by r.user_id),',','"history":{','"prev_name":"',lag(u.name) over (partition by t.user_id order by t.created_at desc),'",','"next_name":"',lead(u.name) over (partition by t.user_id order by t.created_at desc),'"},','"recursive_check":',case when t.id=(select max(id) from requests where user_id=t.user_id) then concat('"FINALLY_',t.id,'"') else concat('"NOT_FINALLY_',(select concat('SUB_',t2.id) from requests t2 where t2.user_id=t.user_id and rownum=1),'"') end,case when exists(select 1 from dual where t.id>0) then ',' else '' end,'}','}') as json_response FROM requests t left join users u on t.user_id=u.id where t.status='active' and row_number() over (order by t.created_at)>0 order by t.created_at desc
Я даже не знаю, как это комментировать и сколько SQL-инъекций с прочими уязвимостями сидит в такой конструкции. Зато теперь понятно, почему на просьбу добавить новое поле они реагируют так нервно.
В общем, отдать JSON прямо из базы можно через какой-нибудь json_agg, но не напрямую же (наверное, это будет недостаточно энтерпрайзно, да и админа БД просто так, что ли, нанимали?)
😁51🙈11😈3🆒3❤2🔥2👏1
Время страшилок: деплоймент из закрытой комнаты.
Когда меня уволили из Thoughtworks два года назад, я чуть не попал в местный банк BOU (название изменено). О его корпоративной культуре ходили легенды, которые ужасали даже китайцев.
Недавно я познакомился с человеком, который как Thoughtwork'er проработал там целых три месяца.
Три месяца. По местным меркам это уже ветеран и носитель сакральных знаний.
Сейчас расскажу об особенностях разработки. Заваривайте чаёк.
Деплоймент из закрытой комнаты
Хотите задеплоить фикс на прод? Включить VPN, выполнить команду или в крайнем случае нажать кнопку Deploy Prod на дашборде CI/CD? Нет!
Деплоймент происходит только из специальной комнаты, которую можно открыть только изнутри. Да, именно так.
Во время деплоймента у вас за спиной будет стоять ещё один человек. А за его спиной будет висеть камера.
И да, это значит, что в этой команде постоянно кто-то должен находиться в комнате даже тогда, когда никакого деплоймента нет. Даже сейчас. У меня нет идей зачем.
Подготовка к деплойменту
Всем вендорам банк платит по факту деплоймента в прод, а не по отработанным часам, поэтому мой товарищ был кровно заинтересован в том, чтобы его проект всё-таки увидел прод.
Но чтобы попасть в закрытую комнату, нужно получить sign-off на деплоймент.
Занимается этим деплоймент-менеджер.
Мой друг начал регулярно задалбывать этого менеджера вопросами о том, получил ли он все необходимые подписи.
Через непродолжительные два месяца менеджер радостно сообщил, что разрешение наконец получено, и достал из стола внушительную папку документов.
На каждом листе стояли подписи разных вышестоящих начальников.
Были ли там распечатки кода — история умалчивает.
Но после истории с комнатой я бы уже ничему не удивлялся.
Когда меня уволили из Thoughtworks два года назад, я чуть не попал в местный банк BOU (название изменено). О его корпоративной культуре ходили легенды, которые ужасали даже китайцев.
Недавно я познакомился с человеком, который как Thoughtwork'er проработал там целых три месяца.
Три месяца. По местным меркам это уже ветеран и носитель сакральных знаний.
Сейчас расскажу об особенностях разработки. Заваривайте чаёк.
Деплоймент из закрытой комнаты
Хотите задеплоить фикс на прод? Включить VPN, выполнить команду или в крайнем случае нажать кнопку Deploy Prod на дашборде CI/CD? Нет!
Деплоймент происходит только из специальной комнаты, которую можно открыть только изнутри. Да, именно так.
Во время деплоймента у вас за спиной будет стоять ещё один человек. А за его спиной будет висеть камера.
И да, это значит, что в этой команде постоянно кто-то должен находиться в комнате даже тогда, когда никакого деплоймента нет. Даже сейчас. У меня нет идей зачем.
Подготовка к деплойменту
Всем вендорам банк платит по факту деплоймента в прод, а не по отработанным часам, поэтому мой товарищ был кровно заинтересован в том, чтобы его проект всё-таки увидел прод.
Но чтобы попасть в закрытую комнату, нужно получить sign-off на деплоймент.
Занимается этим деплоймент-менеджер.
Мой друг начал регулярно задалбывать этого менеджера вопросами о том, получил ли он все необходимые подписи.
Через непродолжительные два месяца менеджер радостно сообщил, что разрешение наконец получено, и достал из стола внушительную папку документов.
На каждом листе стояли подписи разных вышестоящих начальников.
Были ли там распечатки кода — история умалчивает.
Но после истории с комнатой я бы уже ничему не удивлялся.
😁28🔥11🤯6❤3🍓1
Тут, оказывается, вышел OWASP Top 10 2025.
Из интересного (на мой взгляд):
Software Supply Chain Failures — теперь на 3-м месте. Если старый A06:2021 в основном смотрел на зависимости (поставил старую или уязвимую библиотеку — получил дыру уровня Log4Shell), то теперь речь идет уже обо всей цепочке поставки ПО: репозитории, CI/CD, IDE, механизмы обновлений. Атакуют не только сам пакет, но и весь путь его доставки. Например, через компрометацию мейнтейнера, взлом вендора с последующей поставкой зараженных зависимостей и библиотек и т.д. То есть неприятный сюрприз может приехать от вполне легитимного поставщика. Если раньше такие истории считались скорее экзотикой, то теперь они добрались до 3-го места (особенно с учетом возможностей ИИ).
Mishandling of Exceptional Conditions — новый пункт. Суть в том, что приложение некорректно реагирует на сбои: неожиданный ввод, обрыв сети, нехватку памяти, ошибки БД и прочие нештатные ситуации. В результате проблему либо не замечают, либо никак на нее не реагируют, а иногда пользователю вообще отдают полный стектрейс. Здесь, кстати, есть неявная связь с вайбкодингом: ИИ очень любит упрощать подобные моменты. Про корректную обработку ошибок я даже рассказывал на Подлодке. Приятно все-таки иногда угадывать тренды — примерно как с девальвацией навыков кодинга в последние годы.
Как минимум рекомендую ознакомиться.
Из интересного (на мой взгляд):
Software Supply Chain Failures — теперь на 3-м месте. Если старый A06:2021 в основном смотрел на зависимости (поставил старую или уязвимую библиотеку — получил дыру уровня Log4Shell), то теперь речь идет уже обо всей цепочке поставки ПО: репозитории, CI/CD, IDE, механизмы обновлений. Атакуют не только сам пакет, но и весь путь его доставки. Например, через компрометацию мейнтейнера, взлом вендора с последующей поставкой зараженных зависимостей и библиотек и т.д. То есть неприятный сюрприз может приехать от вполне легитимного поставщика. Если раньше такие истории считались скорее экзотикой, то теперь они добрались до 3-го места (особенно с учетом возможностей ИИ).
Mishandling of Exceptional Conditions — новый пункт. Суть в том, что приложение некорректно реагирует на сбои: неожиданный ввод, обрыв сети, нехватку памяти, ошибки БД и прочие нештатные ситуации. В результате проблему либо не замечают, либо никак на нее не реагируют, а иногда пользователю вообще отдают полный стектрейс. Здесь, кстати, есть неявная связь с вайбкодингом: ИИ очень любит упрощать подобные моменты. Про корректную обработку ошибок я даже рассказывал на Подлодке. Приятно все-таки иногда угадывать тренды — примерно как с девальвацией навыков кодинга в последние годы.
Как минимум рекомендую ознакомиться.
👍15🔥4❤2
Помните, я рассказывал про софтину из 50 микросервисов? На прошлой неделе мне показали изделие уже из 80! В код я ещё не смотрел, но, зная, какие задачи оно решает и сколько у него пользователей, всё это выглядит как нечто избыточное.
Я даже боюсь представить, сколько человекочасов там закопано в инфраструктуру, интеграции, деплои, мониторинг и прочую деятельность, которая никак не приближает никого к решению задач и какие последствия для отрасли в целом имеет такой подход.
Чтобы не было недопонимания: мы не говорим что микросы не нужны. Проблема в том, что благодаря хайпу прошлого десятилетия (а точнее армии мутных татуированных типов, которые разбираются разве что в средствах для ухода за бородой своего парня) микросервисы впаривали направо и налево. Мы с Серёжей даже видели курс, где единственным обоснованием их применения было что-то вроде "куда же в 2k1x без микросервисов" (я сейчас не утрирую).
Хайп прошёл и многие уже успели на собственном опыте узнать, сколько стоит поддержка распределённой системы, которая никогда не должна была быть таковой. Но расслабляться рано. Те же самые люди, которые вчера продавали микросервисы как универсальное решение всех проблем сегодня с тем же энтузиазмом продают вайбкодинг.
Я даже боюсь представить, сколько человекочасов там закопано в инфраструктуру, интеграции, деплои, мониторинг и прочую деятельность, которая никак не приближает никого к решению задач и какие последствия для отрасли в целом имеет такой подход.
Чтобы не было недопонимания: мы не говорим что микросы не нужны. Проблема в том, что благодаря хайпу прошлого десятилетия (а точнее армии мутных татуированных типов, которые разбираются разве что в средствах для ухода за бородой своего парня) микросервисы впаривали направо и налево. Мы с Серёжей даже видели курс, где единственным обоснованием их применения было что-то вроде "куда же в 2k1x без микросервисов" (я сейчас не утрирую).
Хайп прошёл и многие уже успели на собственном опыте узнать, сколько стоит поддержка распределённой системы, которая никогда не должна была быть таковой. Но расслабляться рано. Те же самые люди, которые вчера продавали микросервисы как универсальное решение всех проблем сегодня с тем же энтузиазмом продают вайбкодинг.
Telegram
StringConcat - разработка без боли и сожалений
Моя личная боль: Микросервис == Entity
Третью неделю переносим одно «небольшое» приложение из примерно полусотни микросервисов (помогите) в новую инфру, со всеми пайплайнами, куберами, базами данными и прочим непотребством. И это настоящий музей антипаттернов.…
Третью неделю переносим одно «небольшое» приложение из примерно полусотни микросервисов (помогите) в новую инфру, со всеми пайплайнами, куберами, базами данными и прочим непотребством. И это настоящий музей антипаттернов.…
😁45💯18👍13
Handbook: Как не быть уволенным когда все косячат с деплойментом? (продолжение, начало про деплоймент из закрытой комнаты)
Как вы понимаете, при деплойменте из закрытой комнаты ни один деплоймент гладко не проходит.
А если что-то пошло не так, нужен виноватый. И тут процесс поставлен на поток. Раз в полгода нанимается новый деплоймент-менеджер, который, офигевая, собирает все эти подписи.
- Потом происходит деплоймент с неизменным факапом.
- Виновным назначается деплоймент-менеджер.
- Деплоймент-менеджер отправляется на февральский мороз.
- Тут же открывается вакансия нового деплоймент-менеджера.
Ну хоть тут процесс у банка отработан. И заметьте, для этого никому не надо запираться в той комнате с HR менеджером и камерой.
Почему я не попал в тот банк?
Когда мы торговались за зарплату, я неосмотрительно выдал:
Я обмениваю международную компанию с хорошей репутацией на местный банк, поэтому хотелось бы компенсировать эту потерю прибавкой к зарплате.
От HR я узнал, что этим самым оскорбил банк до глубины души. Они правда не считают, что хоть сколько-нибудь хуже Thoughtworks. Более того, подозреваю, что где-то существует подписанный документ, подтверждающий это.
Хотя звоночки были уже на собеседовании
Меня брали, чтобы я помог командам писать код лучше.
Это как раз то, чем я занимался уже лет пять и, чёрт подери, умею. Но мне сказали, что код лично мне писать не придётся.
А придётся писать регламенты.
Что-то вроде:
«Регламент 001 на использование TDD в рамках процесса разработки системы».
«Регламент 002 о порядке применения регламента 001».
«Регламент 003 о внесении изменений в регламент 002».
Как вы понимаете, при деплойменте из закрытой комнаты ни один деплоймент гладко не проходит.
А если что-то пошло не так, нужен виноватый. И тут процесс поставлен на поток. Раз в полгода нанимается новый деплоймент-менеджер, который, офигевая, собирает все эти подписи.
- Потом происходит деплоймент с неизменным факапом.
- Виновным назначается деплоймент-менеджер.
- Деплоймент-менеджер отправляется на февральский мороз.
- Тут же открывается вакансия нового деплоймент-менеджера.
Ну хоть тут процесс у банка отработан. И заметьте, для этого никому не надо запираться в той комнате с HR менеджером и камерой.
Почему я не попал в тот банк?
Когда мы торговались за зарплату, я неосмотрительно выдал:
Я обмениваю международную компанию с хорошей репутацией на местный банк, поэтому хотелось бы компенсировать эту потерю прибавкой к зарплате.
От HR я узнал, что этим самым оскорбил банк до глубины души. Они правда не считают, что хоть сколько-нибудь хуже Thoughtworks. Более того, подозреваю, что где-то существует подписанный документ, подтверждающий это.
Хотя звоночки были уже на собеседовании
Меня брали, чтобы я помог командам писать код лучше.
Это как раз то, чем я занимался уже лет пять и, чёрт подери, умею. Но мне сказали, что код лично мне писать не придётся.
А придётся писать регламенты.
Что-то вроде:
«Регламент 001 на использование TDD в рамках процесса разработки системы».
«Регламент 002 о порядке применения регламента 001».
«Регламент 003 о внесении изменений в регламент 002».
Telegram
StringConcat - разработка без боли и сожалений
Время страшилок: деплоймент из закрытой комнаты.
Когда меня уволили из Thoughtworks два года назад, я чуть не попал в местный банк BOU (название изменено). О его корпоративной культуре ходили легенды, которые ужасали даже китайцев.
Недавно я познакомился…
Когда меня уволили из Thoughtworks два года назад, я чуть не попал в местный банк BOU (название изменено). О его корпоративной культуре ходили легенды, которые ужасали даже китайцев.
Недавно я познакомился…
😁19❤8🤯7
Про языки программирования в эпоху ИИ.
Можно подумать, что сейчас уже не так важно, какой язык мы используем. Но не совсем. Скорее, подвергается инфляции сам навык кодинга (хотя фронтендеры еще с 2010-х должны были привыкнуть, что их навыки регулярно обесцениваются с выходом очередного фреймворка).
Так вот, суть языка никуда не девается. Более того, если мы рассматриваем тру-инженерный подход, то нам нужно как-то валидировать выхлоп LLM. И тут очень кстати оказываются нормальная модульность, типы, статический анализ и прочие скучные вещи, которые почему-то снова становятся актуальными (опять ничего нового).
Есть ощущение, что в эпоху ИИ язык все больше становится не только способом писать код, но и способом ограничивать пространство ошибок. Чем больше инвариантов и ограничений можно выразить средствами самого языка, тем меньше шансов, что модель сгенерирует что-то неожиданное (это работает и с разработкой через органическую нейросеть). В этом смысле, например, Python выглядит менее удачным выбором для разработки больших систем с активным использованием ИИ. Не потому, чтокто вообще придумал это убожество на нем нельзя писать, и уж тем более не потому, что на нем не делают больших проектов (делают, к сожалению). А потому, что многие гарантии остаются на уровне соглашений и линтеров. Типизация появилась позже и по большей части тоже работает вне языка. В результате часть ошибок всплывает уже в рантайме, а вы тратите больше времени и больше токенов на их поиск и исправление.
Возможно в эпоху LLM хорошие языки — это не те, на которых быстрее наговнокодить, а те, на которых проще ловить косяки электроболванов
Можно подумать, что сейчас уже не так важно, какой язык мы используем. Но не совсем. Скорее, подвергается инфляции сам навык кодинга (хотя фронтендеры еще с 2010-х должны были привыкнуть, что их навыки регулярно обесцениваются с выходом очередного фреймворка).
Так вот, суть языка никуда не девается. Более того, если мы рассматриваем тру-инженерный подход, то нам нужно как-то валидировать выхлоп LLM. И тут очень кстати оказываются нормальная модульность, типы, статический анализ и прочие скучные вещи, которые почему-то снова становятся актуальными (опять ничего нового).
Есть ощущение, что в эпоху ИИ язык все больше становится не только способом писать код, но и способом ограничивать пространство ошибок. Чем больше инвариантов и ограничений можно выразить средствами самого языка, тем меньше шансов, что модель сгенерирует что-то неожиданное (это работает и с разработкой через органическую нейросеть). В этом смысле, например, Python выглядит менее удачным выбором для разработки больших систем с активным использованием ИИ. Не потому, что
Возможно в эпоху LLM хорошие языки — это не те, на которых быстрее наговнокодить, а те, на которых проще ловить косяки электроболванов
👍40😁16❤6
Magnum Opus
Итак, ребята, немного новостей.
1. Как вы знаете, мы занимаемся обучением, и у нас есть курс «Разработка без боли и сожалений». Написали мы его около 6 лет назад, и за это время он не потерял актуальности (а во времена ИИ стал даже актуальнее, ИМХО). Но пришла пора обновлений.
За эти годы мы гораздо лучше поняли текущие потребности, накопилось большое количество материала и т.д. Что хочется сделать? Добавить больше практики: как самостоятельной, так и в формате разборов. Очень много вопросов из серии «а как вот это сделать?», поэтому решили, что проще показать и заставить вас повторить. Еще хочется добавить новые темы: немного ИИ, безопасности, производительности, миграций и т.д. Раньше этого не было в явном виде, но сейчас потребность уже есть.
Мы уже приступили к обновлению, делаем это не спеша. Это не наша основная деятельность, над нами нет KPI, менеджерок, эйчарок и т.д., поэтому можем делать все в свое удовольствие и никуда не торопиться. Это наше отдохновение от корпоративных болот, эдакий Magnum Opus.
2. Если все получится, то, возможно, будет отдельный курс про инженерный ИИ в разработке, в соавторстве с ребятами из научной среды. Идея в том, чтобы рассказать, как использовать ИИ в разработке и получать воспроизводимый (!) результат. Сразу скажу, что это довольно сильно отличается от вайбкодинга — тут опять придется думать (опять все строится на тех вещах, о которых мы много лет рассказываем на канале). Но пока окончательной договоренности нет. Надеемся, что получится. А может и нет, штош.
3. Еще накопилось некоторое количество духоты (и не очень духоты), которую уже можно выкладывать на YouTube и в блог. В прошлом году выпускали материалы довольно активно, а потом немного придавило личными и рабочими делами. Обещаем исправиться.
4. Есть еще некоторое количество тем, которыми не очень хочется делиться с большим интернетом, потому что нас, как обычно, обольют говном за непопулярное мнение. Скорее всего, сделаем подписку с символическим платежом и будем выкладывать такое туда по мере сил. Заодно уже завели проект на sponsr. Хотим постепенно дублировать туда вообще все наши материалы в том числе и заметки, забекапиться так сказать (на самом деле хочется просто вернуться в юность, когда мы читали емеил-рассылки и учились по ним программировать).
Сайт пока отключен. Если вам интересно поучаствовать в курсе — можете написать мне в личку.
Как говорят у нас, рәхим итегез!
Итак, ребята, немного новостей.
1. Как вы знаете, мы занимаемся обучением, и у нас есть курс «Разработка без боли и сожалений». Написали мы его около 6 лет назад, и за это время он не потерял актуальности (а во времена ИИ стал даже актуальнее, ИМХО). Но пришла пора обновлений.
За эти годы мы гораздо лучше поняли текущие потребности, накопилось большое количество материала и т.д. Что хочется сделать? Добавить больше практики: как самостоятельной, так и в формате разборов. Очень много вопросов из серии «а как вот это сделать?», поэтому решили, что проще показать и заставить вас повторить. Еще хочется добавить новые темы: немного ИИ, безопасности, производительности, миграций и т.д. Раньше этого не было в явном виде, но сейчас потребность уже есть.
Мы уже приступили к обновлению, делаем это не спеша. Это не наша основная деятельность, над нами нет KPI, менеджерок, эйчарок и т.д., поэтому можем делать все в свое удовольствие и никуда не торопиться. Это наше отдохновение от корпоративных болот, эдакий Magnum Opus.
2. Если все получится, то, возможно, будет отдельный курс про инженерный ИИ в разработке, в соавторстве с ребятами из научной среды. Идея в том, чтобы рассказать, как использовать ИИ в разработке и получать воспроизводимый (!) результат. Сразу скажу, что это довольно сильно отличается от вайбкодинга — тут опять придется думать (опять все строится на тех вещах, о которых мы много лет рассказываем на канале). Но пока окончательной договоренности нет. Надеемся, что получится. А может и нет, штош.
3. Еще накопилось некоторое количество духоты (и не очень духоты), которую уже можно выкладывать на YouTube и в блог. В прошлом году выпускали материалы довольно активно, а потом немного придавило личными и рабочими делами. Обещаем исправиться.
4. Есть еще некоторое количество тем, которыми не очень хочется делиться с большим интернетом, потому что нас, как обычно, обольют говном за непопулярное мнение. Скорее всего, сделаем подписку с символическим платежом и будем выкладывать такое туда по мере сил. Заодно уже завели проект на sponsr. Хотим постепенно дублировать туда вообще все наши материалы в том числе и заметки, забекапиться так сказать (на самом деле хочется просто вернуться в юность, когда мы читали емеил-рассылки и учились по ним программировать).
Сайт пока отключен. Если вам интересно поучаствовать в курсе — можете написать мне в личку.
Как говорят у нас, рәхим итегез!
❤42👍24🔥3👏1
Небольшой лайтовый пост про то кто мы такие и чему учим (считайте, что разбирался с редактором сайта). Следующий, с пониженым содержанием кислорода уже в работе.
❤9🔥5
А теперь первый душный пост на нашем новом ресурсе. Выжимка из опыта — как собрать команду мечты.
Внутри:
- Почему команда мечты — это не 10 суперзвёзд, работающих по 16 часов (а суперзвезда вообще антипаттерн)
- Каких людей надо гнать ссаными тряпками в первую очередь
- Какие роли необходимы в команде
- Почему собес почти ничего не решает
- И как понять на нём, что перед вами хорошая команда, а не очередной филиал ада
Читать →
Внутри:
- Почему команда мечты — это не 10 суперзвёзд, работающих по 16 часов (а суперзвезда вообще антипаттерн)
- Каких людей надо гнать ссаными тряпками в первую очередь
- Какие роли необходимы в команде
- Почему собес почти ничего не решает
- И как понять на нём, что перед вами хорошая команда, а не очередной филиал ада
Читать →
😁11🔥7🌚5👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
💯21❤10👍7🔥7
Тут опять произошло прекрасное.
Исследователи из JFrog решили проверить, что там с найденными (как выяснилось, в основном ИИ) уязвимостями в SQLite, и оказалось, что из 55 зарегистрированных CVE реальной была всего одна, а остальные — обычные галлюцинации ИИ: тут и выдуманные методы, и несуществующие пути эксплуатации, и нерабочие эксплоиты, и прочие радости жизни. Самое фиговое, что эти уязвимости уже успели попасть в CVE. То есть в следующем релизе вполне возможно, что какой-нибудь сканер начнет сношать вам мозг относительно критической уязвимости, которой никогда не существовало.
Можно подумать, что ИИ тут бесполезна. Но нет.
На мой взгляд, ИИ сейчас довольно неплохо работает там, где есть четко сформулированные правила, которые можно проверить. Например, при разработке агрегатов и инвариантов к ним. Можно попросить ИИ оценить белые пятна: не нарушается ли владение объектами, не забыли ли мы проверить уникальность, нет ли сценария, при котором агрегат может попасть в неконсистентное состояние и все в этом духе. Понятно, что это не магический анализатор, который найдет все проблемы. Но результаты иногда бывают довольно неожиданные и реально полезные. Как минимум, помогает посмотреть на модель с другой стороны и найти потенциальные баги до того, как они доедут до прода.
Вторая полезная штука — проверить наличие или отсутствие проверок безопасности. Но тут есть важный момент (и, кстати, он справедлив и для первого случая). Эти проверки должны быть единообразны и желательно централизованы.
Условно, если у вас простая модель разделения доступа, то на каждом контроллере должна быть аннотация
Вообще, для таких критичных вещей я большой фанат подхода fail fast. В одном из проектов мы сделали следующим образом: если в конфигурации явно не задано, какая роль нужна для контроллера (или он не добавлен в список исключений), приложение просто не стартует. Что-то вроде:
Но это довольно примитивный случай. Проблемы начинаются дальше. Например, нам нужно проверить не просто наличие роли, а доступ к конкретному ресурсу. Пользователь может видеть только свои счета, свои документы и т.д. Тут уже одной аннотации с ролью на контроллере может быть недостаточно. И вот здесь как раз хорошо работает комбинация из архитектурных правил, статического анализа и ИИ. Допустим, мы договариваемся, что любой Use Case, который работает со счетом, обязан использовать интерфейс безопасности:
Дальше можно кастомный статанализатор (мы так делали, дописывали правила уже к существующему), который будет проверять наличие такого вызова (и имеет ли он вообще отношение к сущностям, над которыми происходит действие), можно ронять сборку при нарушении правила, а еще можно попросить ИИ проверить не упустили ли мы чего.
Конечно, это не панацея и не заменяет нормальные тесты и security review. Но вероятность забыть критичную проверку становится заметно ниже. Мне вообще кажется, что именно в этом сейчас одна из самых сильных сторон ИИ. Мы не пытаемся заставить его быть магическим сканером уязвимостей, который найдет неизвестную дыру в миллионах строк кода, а использовать его как дополнительный слой контроля за тем, что ваши собственные правила действительно соблюдаются. Но для этого сначала нужно эти правила иметь . Если у вас просто сопли, размазанные по всему проекту, слоям и сервисам (99% того что я видел выглядит именно так), то ИИ просто поможет вам быстрее расстаться с бюджетом
Исследователи из JFrog решили проверить, что там с найденными (как выяснилось, в основном ИИ) уязвимостями в SQLite, и оказалось, что из 55 зарегистрированных CVE реальной была всего одна, а остальные — обычные галлюцинации ИИ: тут и выдуманные методы, и несуществующие пути эксплуатации, и нерабочие эксплоиты, и прочие радости жизни. Самое фиговое, что эти уязвимости уже успели попасть в CVE. То есть в следующем релизе вполне возможно, что какой-нибудь сканер начнет сношать вам мозг относительно критической уязвимости, которой никогда не существовало.
Можно подумать, что ИИ тут бесполезна. Но нет.
На мой взгляд, ИИ сейчас довольно неплохо работает там, где есть четко сформулированные правила, которые можно проверить. Например, при разработке агрегатов и инвариантов к ним. Можно попросить ИИ оценить белые пятна: не нарушается ли владение объектами, не забыли ли мы проверить уникальность, нет ли сценария, при котором агрегат может попасть в неконсистентное состояние и все в этом духе. Понятно, что это не магический анализатор, который найдет все проблемы. Но результаты иногда бывают довольно неожиданные и реально полезные. Как минимум, помогает посмотреть на модель с другой стороны и найти потенциальные баги до того, как они доедут до прода.
Вторая полезная штука — проверить наличие или отсутствие проверок безопасности. Но тут есть важный момент (и, кстати, он справедлив и для первого случая). Эти проверки должны быть единообразны и желательно централизованы.
Условно, если у вас простая модель разделения доступа, то на каждом контроллере должна быть аннотация
@Secured (или что-то подобное), а не где-то глубоко в DAO. Иначе вы просто сожжете токены ибо ИИ не сможет понять, что именно является правилом, а что случайностью.Вообще, для таких критичных вещей я большой фанат подхода fail fast. В одном из проектов мы сделали следующим образом: если в конфигурации явно не задано, какая роль нужна для контроллера (или он не добавлен в список исключений), приложение просто не стартует. Что-то вроде:
.addRole(SomeController::method, Roles.ADMIN)Но это довольно примитивный случай. Проблемы начинаются дальше. Например, нам нужно проверить не просто наличие роли, а доступ к конкретному ресурсу. Пользователь может видеть только свои счета, свои документы и т.д. Тут уже одной аннотации с ролью на контроллере может быть недостаточно. И вот здесь как раз хорошо работает комбинация из архитектурных правил, статического анализа и ИИ. Допустим, мы договариваемся, что любой Use Case, который работает со счетом, обязан использовать интерфейс безопасности:
CheckHasAccountAccess(accountUID)Дальше можно кастомный статанализатор (мы так делали, дописывали правила уже к существующему), который будет проверять наличие такого вызова (и имеет ли он вообще отношение к сущностям, над которыми происходит действие), можно ронять сборку при нарушении правила, а еще можно попросить ИИ проверить не упустили ли мы чего.
Конечно, это не панацея и не заменяет нормальные тесты и security review. Но вероятность забыть критичную проверку становится заметно ниже. Мне вообще кажется, что именно в этом сейчас одна из самых сильных сторон ИИ. Мы не пытаемся заставить его быть магическим сканером уязвимостей, который найдет неизвестную дыру в миллионах строк кода, а использовать его как дополнительный слой контроля за тем, что ваши собственные правила действительно соблюдаются. Но для этого сначала нужно эти правила иметь . Если у вас просто сопли, размазанные по всему проекту, слоям и сервисам (99% того что я видел выглядит именно так), то ИИ просто поможет вам быстрее расстаться с бюджетом
Jfrog
SQLite Critical CVEs or LLM Slop? | JFrog
The JFrog security research team recently identified a supply chain attack targeting the `xinference` package on PyPI. Versions 2.6.0, 2.6.1, and 2.6.2 were compromised and yanked by maintainers after users reported suspicious behavior. If you installed or…
👍18😁4❤3
Как ИИ превратил плохих менеджеров в плохих разработчиков
Не знаю, как у вас, но у меня с появлением ИИ собеседования превратились в боль.
Раньше плохих разработчиков можно было отсеять ещё на этапе тестового задания. Сейчас любое тестовое выполняют как минимум на «сойдёт»:
— пользоваться ИИ не запретишь;
— какое-никакое решение он всё-таки состряпает.
Поэтому количество очных собеседований у нас выросло в разы.
Но недавно я столкнулся с новым типом кандидатов: плохими менеджерами, которые с помощью ИИ переквалифицировались в плохих разработчиков.
Попался мне один такой. Рассказываю.
Читаю резюме — вроде всё нормально, но нет какого-то коннекта на уровне «свой — чужой». Чувствую подвох. Резюме слишком вылизано, в достижениях слишком много бизнесовых показателей. Разработчики обычно так не пишут.
Открываю тестовое — и там тоже на первый взгляд всё хорошо. Но вместо Gradle вижу build.sh, который заканчивается командой:
Уже подозрительно.
На собеседовании выяснилось, что кандидат работал менеджером разработчиков в крупном криптостартапе. После внедрения ИИ многих менеджеров там заставили писать код.
В ядро продукта их, конечно, никто не пустил, но поручили делать сопутствующие инструменты — например, для KYC.
На собеседовании кандидат не смог реализовать ни одного бизнес-требования. А когда мы попросили отрефакторить компонент бизнес-логики и сделать его немного более объектно-ориентированным, он почему-то начал рассуждать про JSON.
В общем, будьте внимательны. Обязательно просите кандидатов писать код прямо на собеседовании. Я все так же против того, чтобы заставлять на собеседованиях вертеть деревья. Но отрефакторить свой код, заимплементировать фичу и написать на это тест кандидат, имхо, обязан.
И на сладкое.
Файл с тестовым заданием назывался
Ну а что? В требованиях было сказано использовать Git. Вот, пожалуйста, использовал.
Расскажите в комментариях как ИИ повлиял на процессы собеседований в ваших командах
Не знаю, как у вас, но у меня с появлением ИИ собеседования превратились в боль.
Раньше плохих разработчиков можно было отсеять ещё на этапе тестового задания. Сейчас любое тестовое выполняют как минимум на «сойдёт»:
— пользоваться ИИ не запретишь;
— какое-никакое решение он всё-таки состряпает.
Поэтому количество очных собеседований у нас выросло в разы.
Но недавно я столкнулся с новым типом кандидатов: плохими менеджерами, которые с помощью ИИ переквалифицировались в плохих разработчиков.
Попался мне один такой. Рассказываю.
Читаю резюме — вроде всё нормально, но нет какого-то коннекта на уровне «свой — чужой». Чувствую подвох. Резюме слишком вылизано, в достижениях слишком много бизнесовых показателей. Разработчики обычно так не пишут.
Открываю тестовое — и там тоже на первый взгляд всё хорошо. Но вместо Gradle вижу build.sh, который заканчивается командой:
javac -d "$BUILD_DIR" "@$SOURCES_FILE"Уже подозрительно.
На собеседовании выяснилось, что кандидат работал менеджером разработчиков в крупном криптостартапе. После внедрения ИИ многих менеджеров там заставили писать код.
В ядро продукта их, конечно, никто не пустил, но поручили делать сопутствующие инструменты — например, для KYC.
На собеседовании кандидат не смог реализовать ни одного бизнес-требования. А когда мы попросили отрефакторить компонент бизнес-логики и сделать его немного более объектно-ориентированным, он почему-то начал рассуждать про JSON.
В общем, будьте внимательны. Обязательно просите кандидатов писать код прямо на собеседовании. Я все так же против того, чтобы заставлять на собеседованиях вертеть деревья. Но отрефакторить свой код, заимплементировать фичу и написать на это тест кандидат, имхо, обязан.
И на сладкое.
Файл с тестовым заданием назывался
ATM-final-v6. Внутри лежал Git-репозиторий с одним-единственным коммитом.Ну а что? В требованиях было сказано использовать Git. Вот, пожалуйста, использовал.
Расскажите в комментариях как ИИ повлиял на процессы собеседований в ваших командах
🙈19❤10