StringConcat - разработка без боли и сожалений
3.42K subscribers
86 photos
9 videos
3 files
204 links
Полезный блог от разработчиков для разработчиков. Наш сайт: howto.stringconcat.ru
Download Telegram
Хочется почитать какую-нибудь стоящую книгу по разработке или около-разработческой тематике.
Что можете порекомендовать из относительно новых?
Евгений
Немножечко откровений от Капитана Очевидность. Как вы наверное в курсе, существует 2 способа задания идентификаторов. - Естественные идентификаторы, которые натурально идентифицируют объект. Н-р СНИЛС, SSN, номер паспорта. - Суррогатные идентификаторы…
Хотите кек? Попалась недавно система, где первичный ключ — это персональные данные (не буду говорить какие, потому что вендор себя опознает). Ну а чё, гениально же! Зато сразу понятно, кто есть кто — никакой анонимности, никаких лишних UUID. Правда, теперь все интеграции должны соблюдать законы о ПДн, проходить аудиты и жить по регламентам. Зато — очень удобно. А главное — персональные данные ведь никогда не меняются, да?
😁45🤣8🔥5❤‍🔥11
Что тут происходит?

Поскольку количество подписчиков существенно увеличилось, то необходимо прояснить.
Мы — Женя и Серёжа. Инженеры и идейные задроты. В разработке на двоих — уже почти 30 лет.
Начинали, когда никакой айтишечки толком и не было, а разраб получал максимум двадцаху, и то если работу найдет. С тех пор мы прошли весь путь — от зелёных разработчиков до руководителей и архитекторов. Жрали г… (ну вы поняли), падали, вставали и снова шли в прод.

👨‍💻 Серёжа (слева) — Staff Software Engineer в Jago Bank. Руководит разработкой Core Banking. Более 13 лет в индустрии, включая ThoughtWorks, где код — это не просто текст, а философия. Руководил распределёнными командами инженеров, запускал банковские приложения в Сингапуре, переводил монолиты в микросервисы и спасал проекты когда остальные уже опустили руки. Развивал инженерные практики до уровня Elite по DORA-метрикам.

🤖 Женя (справа) — технический директор в Satori. Занимается проектированием банковского софта, а так же руководит разработкой AI-агентов в области интеграции систем. Делал карточный процессинг в Яндекс.Кассе и Банке 131, выводил в прод систему мониторинга инсайдерской торговли в Behavox (UK), писал алгоритмы диагностики заболеваний в AbeHealth, делал телеком и автопроекты, включая электромобили «АТОМ».
Спикер ArchDays, КРАБР и Podlodka, научный редактор перевода книги Learning Domain-Driven Design.

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

Так появился наш курс «Разработка без боли и сожалений»,
где мы рассказываем, как:
- Собирать требования и исследовать предметку,
- Моделировать домен и писать тесты,
- Строить взаимодействие с внешним миром,
- Как всё это красиво натягивать на DDD и Чистую Архитектуру.
и многое другое
Здесь мы делимся практиками, которые помогают строить технологии и команды без выгорания и хаоса.

А этот канал — для тех, кто неравнодушен к своему делу. Если вы здесь, значит, вам важно делать хорошо, понимать, как и зачем всё устроено,и не мириться с «ну и так сойдёт», а мы вам стараемся по возможности помогать.
Спасибо, что вы с нами ❤️
🔥4735👍3🤝2
Недавно наткнулся на codecrafters.io — прикольный сервис, где можно с нуля реализовать всякие штуки вроде Redis, Git, SQLite и прочее непотребство.

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

Каждое задание там — это разбор под капотом: сетевые протоколы, файловые форматы, системы хранения, парсеры и всё то, что обычно «просто работает».

Есть бесплатный тариф, так что можно попробовать без вложений.
Мы сами пока не юзали, но выглядит интересно
👍21🔥72
Forwarded from Artem Brannt
Я юзал с целью "освоить незнакомый язык на реальном проекте", мне понравилось. Из прикольного - все проекты делаются по baby steps (например, Redis начинается с задания "сделайте TCP-сервер, который отвечает PONG на PING на нужном порте), это сильно помогает постепенно въехать в новую технологию. Из не очень прикольного, но по-своему полезного - в заданиях обычно пишут, что делает, но практически не дают пояснений, как; если непонятно, приходится лезть в документацию, в другие решения, которые там же можно посмотреть, или спрашивать у ChatGPT). Бесплатно дают доступ к одному проекту, который меняется каждый месяц, плюс, когда они добавляют новый проект, у него есть период бета-тестирования, когда он тоже бесплатен.
🔥12👍1
Когда-то давно мне приспичило разобраться как работает Linux. Нашёл Linux From Scratch — проект, где ты буквально собираешь систему с нуля. Но это упоротый вариант.

В итоге я остановился на Arch Linux — почти как Gentoo, только без бесконечной пересборки мира.
Поднимал сети вручную, вкорячивал модули ядра, правил grub.cfg, шаманил с udev и драйверами.
Естественно, сейчас я уже всё это забыл и зову админа чтобы подключить сетевой кабель. Но тогда, когда я занимался прошивками и разрабатывал под Linux, это дало мне дикий буст к пониманию того, как система устроена изнутри. И вот это как раз пет-проект класса «Минимализм» — когда ты воссоздаёшь базовый слой, чтобы прочувствовать механику. Но есть опасность — после таких экспериментов у вас может прорасти свитер
🔥23
🔧 Немного закулисья нашей разработки

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

Интеграции — это огромный пласт работы между системами, несмотря на кажущуюся простоту. Постоянное перекладывание данных, развешивание JSON’ов и выпиливание XML’ей лобзиком. Мы пробовали автоматизировать это стандартными агентами, курсорами и другими универсальными инструментами. Фиксировали правила, добавляли ограничения — но идеального результата не получили.

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

Поэтому мы делаем ставку на другое: узкоспециализированную систему, заточенную под конкретный фреймворк и конкретные задачи интеграции. Вот, даже лендос склепали.

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

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

Система у нас состоит из двух ключевых модулей:
1. Генератор кода
2. Фреймворк с четкой структурой, в который этот код встраивается
На вход подается описание желаемого выхлопа, а так же документация целевых систем. На выходе — код, который реализует желаемую интеграцию, встроенную в фреймворк.

Сейчас я работаю над промптами, тестирую разные подходы и собираю первые результаты. И — что приятно — кое-что уже начинает работать (по крайней мере мне так кажется).

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

Продолжение следует 👇
🔥292👍1
Смотрел код — и заметил прекрасное. Зацените, как там проверяется время:

event.createdAt.truncatedTo(ChronoUnit.SECONDS) shouldBe OffsetDateTime.now().truncatedTo(ChronoUnit.SECONDS)

То есть просто отрезают миллисекунды в надежде, что тест «успеет» в ту же секунду. А если через миллисекунду тикнет новая? Ну да, можно же начать резать минуты… или часы…
Так и рождаются моргающие тесты, которые то проходят, то падают — чистое веселье.

Что с этим делать?

Нормальный путь — зафиксировать время через Clock.fixed() или Clock.offset() и передавать этот Clock внутрь всего, что генерирует OffsetDateTime.now(clock).
Красоты мало, зато:
• время контролируется снаружи;
• тесты становятся предсказуемыми;
• и никто больше не бегает от внезапно наступившей секунды.

Если же душа просит простых и понятных решений, в JUnit можно тупо повторять тест несколько раз. Прокатило один раз — и ладно, галочка зелёная.

Ещё вариант: не сравнивать даты напрямую, а мерить Duration.between(…) и проверять, что разница в пределах пары миллисекунд. А когда CI сервер начнет тормозить и тесты снова станут моргать — добавите еще пару секунд, делов то.

Ну и последний способ — попробовать замокать статический метод now(), если сможете конечно.

P.S.: Если понадобятся дополнительные лайфхаки по созданию говнокода — зовите, всегда рад помочь.
😁28👌5👍1👾1
Media is too big
VIEW IN TELEGRAM
Типичная разработка
😁29💯4👍31😭1