Вот сколько общаюсь с разработчиками, постоянно слышу убеждение, что есть какой-то правильный способ писать софт. Все ищут секретную архитектуру, вылизывают паттерны, чтобы хоба и тимлид заплакал от счастья от твоего идеального кода.
но, я собрал 4 привычки адептов «чистого кода», (которые обычно все практикуют)
• Бесконечный рефакторинг рабочего кода.
Кажется, что так ты делаешь продукт лучше. Итог: жестко падаешь в перфекционизм. Переписываешь функцию по три раза, а бизнес ждет релиз. Закрываешь вкладку и в голове абсолютная пустота, время потрачено, а новых фичей ноль.
• Упарывание в сложную архитектуру
Сеньоры на ютубе обещают золотые горы, если внедрить микросервисы куда угодно. Итог: получаешь красивый overengineering-проект для мамы и 0 запущенных продуктов в срок, пока конкуренты клепают MVP на коленке.
• Душные споры на ревью
Неплохо, но как итог: ты пишешь полотна текста и тратишь часы на поиск глупой придирки к стилю, потому что банально фокус сместился с реальной задачи на эго.
• Ручная микро-оптимизация
Классика для тех, кто любит алгоритмы из универа. Итог: убиваешь дни жизни и выжимаешь миллисекунды, хотя бизнесу нужен был просто грязный, но рабочий скрипт еще вчера.
Проблема в том, что ни один из этих путей не дает самого главного - скорости и проверки гипотез. Реальному рынку плевать на твой идеальный код за 3 дня. Бизнес предпочтет код от ИИ-агента за 5 минут, который уже завтра начнет приносить деньги.
Хочешь обкатанный на нас лично и 100х учениках метод, как перестать кодить руками и начать делегировать задачи автономным системам?
P. S. Если интересно еще что-нибудь почитать от меня, то заходите в «Азбуку Айтишника», там я рассказываю об айти-базе, также у меня там есть бесплатный гайд на 15 глав по ии-агентам
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱4❤1😁1
😎 Улучшения string и string_view в C++26, о которых давно мечтали
📎 Что изменилось:
• stringstream + string_view (P2495R3) Раньше инициализировать
• bitset + string_view (P2697R1) Та же история: конструктор
• operator+ для string и string_view (P2591R5) Самое долгожданное.
👉 Подробнее тут
Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#линкер_рекомендует
string_view появился в C++17 как замена const string&. Но кое-где он всё равно требовал лишних костылей. C++26 наконец это чинит без критических изменений.📎 Что изменилось:
• stringstream + string_view (P2495R3) Раньше инициализировать
stringstream из string_view можно было только через ручную конвертацию в string. Теперь — напрямую.• bitset + string_view (P2697R1) Та же история: конструктор
bitset принимает string_view без лишней копии. Обходной путь через .data() был ещё и небезопасен из-за null-termination.• operator+ для string и string_view (P2591R5) Самое долгожданное.
s + sv раньше просто не компилировалось — несмотря на то что s += sv работало. Причина: перегрузку придерживали для гипотетического string билдер, который так и не появился. Теперь наконец добавили свободные шаблонные функции.👉 Подробнее тут
Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#линкер_рекомендует
👍5❤3🔥2😁1
🍙 views::take и views::drop — срезы в C++
Если views::transform превращает элементы, то
🌸 views::take — первые N элементов
Лямбда не нужна — достаточно числа. Адаптер остановит итерацию сам, как только наберёт нужное количество.
🍪 take_while — берём пока условие истинно
В отличие от
🍀 views::drop — пропустить первые N элементов
❗️ Важный нюанс:
🌱 Срез в середине: drop + take
Комбинируя два адаптера, получаем аналог Python-срезов:
Весь конвейер по-прежнему ленив: элементы не вычисляются до начала итерации.
🍙 Связка с filter и transform
❌ Ловушка: drop на бесконечном диапазоне
🐸 Продолжение следует...
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность
Если views::transform превращает элементы, то
views::take и views::drop управляют тем, сколько элементов обработать. Та же ленивая логика, никакого лишнего копирования.🌸 views::take — первые N элементов
#include <ranges>
#include <vector>
namespace views = std::views;
std::vector<int> v = {10, 20, 30, 40, 50};
auto first_three = v | views::take(3);
// При итерации: 10, 20, 30
Лямбда не нужна — достаточно числа. Адаптер остановит итерацию сам, как только наберёт нужное количество.
🍪 take_while — берём пока условие истинно
auto while_lt_40 = v | views::take_while([](int x) { return x < 40; });
// При итерации: 10, 20, 30В отличие от
take(n), здесь количество элементов заранее неизвестно — решает предикат.🍀 views::drop — пропустить первые N элементов
auto skip_two = v | views::drop(2);
// При итерации: 30, 40, 50
// drop_while — пропускаем пока условие истинно
auto after_twenties = v | views::drop_while([](int x) { return x <= 20; });
// При итерации: 30, 40, 50
drop_while проверяет предикат только до первого несовпадения, а затем отдаёт все оставшиеся элементы подряд — даже те, что снова удовлетворили бы условию. Это не фильтр — это одноразовый пропуск.🌱 Срез в середине: drop + take
Комбинируя два адаптера, получаем аналог Python-срезов:
// Элементы с индекса 1 по 3 включительно (аналог v[1:4])
auto slice = v | views::drop(1) | views::take(3);
// При итерации: 20, 30, 40
Весь конвейер по-прежнему ленив: элементы не вычисляются до начала итерации.
🍙 Связка с filter и transform
struct Employee {
std::string name;
double salary;
bool is_active;
};
std::vector<Employee> employees = { /* ... */ };
// Топ-2 активных сотрудника по имени
auto top_two = employees
| views::filter([](const Employee& e) { return e.is_active; })
| views::transform([](const Employee& e) { return e.name; })
| views::take(2);❌ Ловушка: drop на бесконечном диапазоне
// OK — take ограничивает бесконечный iota
auto ok = std::views::iota(1) | std::views::take(5);
// 1, 2, 3, 4, 5
// OK — drop сам по себе безопасен, view создаётся без проблем
auto dropped = std::views::iota(1) | std::views::drop(3);
// ОПАСНО — итерирование без терминатора зависнет навсегда
for (auto x : dropped) { /* никогда не остановится */ }
drop на бесконечном диапазоне создаётся без проблем. Опасность — в цикле без ограничителя. Всегда добавляйте take или аналог, если диапазон потенциально бесконечен.📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
📉 Кризис найма в IT: почему Яндекс и Сбер усложняют собеседования вместо того, чтобы их упрощать
Казалось бы, если кандидатов не хватает — надо снижать барьеры. Но крупные игроки делают ровно наоборот: добавляют этапы, тесты и ИИ-оценку. За этим стоит холодная логика: лучше закрывать вакансию дольше, чем нанять человека, который уйдет через полгода. Смотрим, что именно изменилось в Яндексе и Сбере — и работает ли это.
👉 Статья
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст
Казалось бы, если кандидатов не хватает — надо снижать барьеры. Но крупные игроки делают ровно наоборот: добавляют этапы, тесты и ИИ-оценку. За этим стоит холодная логика: лучше закрывать вакансию дольше, чем нанять человека, который уйдет через полгода. Смотрим, что именно изменилось в Яндексе и Сбере — и работает ли это.
👉 Статья
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст
😁5🔥1
Forwarded from Библиотека задач по C++ | тесты, код, задания
🏆 Задача на выходные: string_view vs string в API
Перед тобой два варианта API логгера. Выбери лучший и обоснуй. Нет единственно верного ответа — важна аргументация.
✏️ Напиши в комментариях: какой метод в каком варианте правильный, а какой — нет. Предложи «идеальный»
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность
Перед тобой два варианта API логгера. Выбери лучший и обоснуй. Нет единственно верного ответа — важна аргументация.
#include <string>
#include <string_view>
// Вариант А
class LoggerA {
public:
void log(const std::string& msg);
void setPrefix(const std::string& prefix);
std::string getLastMessage() const;
};
// Вариант Б
class LoggerB {
public:
void log(std::string_view msg);
void setPrefix(std::string_view prefix);
std::string_view getLastMessage() const;
};
// Контекст использования:
// 1. log() вызывается тысячи раз в секунду
// 2. setPrefix() — один раз при старте
// 3. getLastMessage() — для диагностики
// 4. Логгер хранит последнее сообщение внутри
LoggerC.📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🥱1
📰 Свеженькое из мира C++
Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.
😎 Интересное:
• Минималистичная настройка редактора Zed — плейлист с настройкой редактора
• Vtable изнутри — разбор устройства таблиц виртуальных функций
• Деревья в алгоритмах — гайд по иерархическим структурам
• Бесплатные курсы от MIT — университетские курсы по shell, git и др.
• Иерархический FSM — разбор способа решения проблемы состояний
• GCC 16: наконец-то читаемые ошибки компилятора — обзор улучшений обработки и вывода ошибок
• Улучшения string и string_view в C++26, о которых давно мечтали — исправление костылей
📙 Ranges:
• C++ Ranges. Требования к диапазонам
• std::views::filter — ленивая фильтрация в C++20
• views::transform — ленивые преобразования в C++20
• views::take и views::drop — срезы в C++
🔹📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#свежак
Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.
😎 Интересное:
• Минималистичная настройка редактора Zed — плейлист с настройкой редактора
Zed для минималистов• Vtable изнутри — разбор устройства таблиц виртуальных функций
• Деревья в алгоритмах — гайд по иерархическим структурам
• Бесплатные курсы от MIT — университетские курсы по shell, git и др.
• Иерархический FSM — разбор способа решения проблемы состояний
• GCC 16: наконец-то читаемые ошибки компилятора — обзор улучшений обработки и вывода ошибок
• Улучшения string и string_view в C++26, о которых давно мечтали — исправление костылей
string_view📙 Ranges:
• C++ Ranges. Требования к диапазонам
• std::views::filter — ленивая фильтрация в C++20
• views::transform — ленивые преобразования в C++20
• views::take и views::drop — срезы в C++
🔹📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#свежак
👍4❤2
🏛️ oo-alloc — пользовательские аллокаторы
Написать аллокатор в C++ несложно. Написать его правильно — уже интереснее.
• Проблема
• Иерархия классов даёт полиморфизм через интерфейс, но добавляет косвенный вызов через таблицу виртуальных функций — и авторы это понимают
• Выделение памяти через пул снижает нагрузку на кучу и устраняет фрагментацию при объектах фиксированного размера
Альтернатива из стандарта —
👉 Github
🖍️ Стоит ли вообще писать кастомный аллокатор в 2026, когда есть
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст
Написать аллокатор в C++ несложно. Написать его правильно — уже интереснее.
oo-alloc предлагает объектно-ориентированную модель поверх низкоуровневого управления памятью.• Проблема
std::allocator: шаблон привязан к типу, его сложно использовать совместно для разных типов в одном контексте• Иерархия классов даёт полиморфизм через интерфейс, но добавляет косвенный вызов через таблицу виртуальных функций — и авторы это понимают
• Выделение памяти через пул снижает нагрузку на кучу и устраняет фрагментацию при объектах фиксированного размера
Альтернатива из стандарта —
std::pmr::polymorphic_allocator с memory_resource. Тот же полиморфизм, но без overhead своей иерархии и с поддержкой в STL-контейнерах из коробки. Если нужен production-grade вариант — сначала смотреть туда.👉 Github
🖍️ Стоит ли вообще писать кастомный аллокатор в 2026, когда есть
pmr?📍 Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст
❤4👍3🤔1🙏1🥱1
🦾 Почему ваши AI-продукты на базе LLM ломаются (и как это чинить)?
Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало».
🗓️ Когда: 14 мая в 19:00 МСК
⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы
🧑🏻💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы.
🎁 Главный бонус для онлайна:
Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps.
👉 Занять место на вебинаре
Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало».
🗓️ Когда: 14 мая в 19:00 МСК
⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы
🧑🏻💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы.
🎁 Главный бонус для онлайна:
Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps.
👉 Занять место на вебинаре
😁2
В C++23 появился синтаксис auto(x) и auto{x}. Это не очередной сахар для объявления переменных. На самом деле — это именованная операция, у которой есть точная семантика.
auto(x) — это decay-copy: создаётся prvalue того же типа, что и x, но после применения std::decay. То есть:• Ссылки снимаются
• Cv-квалификаторы (const/volatile) удаляются
• Массивы → указатели
• Функции → указатели на функции
const int& r = 42;
auto copy = auto(r); // int, не const int&
auto copy = std::decay_t<decltype(r)>(r);
В простых случаях
auto copy = r тоже даст int — auto и так делает decay. Но в обобщённом коде важно явно сигнализировать намерение: "я хочу копию, а не прокси или view".Главное применение — защита от UB при модификации контейнера. Классический пример — реализация pop_front:
void pop_front(auto& container) {
std::erase(container, auto(container.front()));
// Без auto() — UB: front() может инвалидироваться
// в процессе удаления элементов
}Без auto() мы передаём ссылку на элемент, который erase может разрушить до сравнения. С auto() — сначала создаётся копия значения, потом происходит удаление. Безопасно и читаемо.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🤔3👍2
😆 Платить ИИ за работу меньше, в отличии от человека, не получится
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#развлекалово
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#развлекалово
😁10💯4
🔪 Разбиение диапазонов: views::split, chunk, chunk_by
Ranges-библиотека умеет не только фильтровать и трансформировать, но и разбивать диапазоны на части. Разберём три инструмента — каждый для своей задачи.
🍴 views::split — разбивка по разделителю
В C++23 появился
❗️
🥨 views::chunk(n) — разбивка на блоки фиксированного размера (C++23)
❗️ Если размер диапазона не делится на n нацело — последний блок содержит оставшиеся элементы.
🍪 views::chunk_by — разбивка по условию (C++23)
Группирует соседние элементы, пока выполняется предикат между двумя соседями.
❗️ Предикат принимает два соседних элемента — новая группа начинается там, где он вернул false.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность
Ranges-библиотека умеет не только фильтровать и трансформировать, но и разбивать диапазоны на части. Разберём три инструмента — каждый для своей задачи.
std::string csv = "один,два,три,четыре";
// Разбиваем по запятой
for (auto part : csv | views::split(',')) {
// part — под-диапазон символов, не строка
// В C++20 явно конструируем string:
std::cout << std::string(part.begin(), part.end()) << "\n";
}
// один
// два
// три
// четыре
В C++23 появился
std::ranges::to, и конвертация стала лаконичнее:for (auto part : csv | split(',')) {
std::cout << std::ranges::to<std::string>(part) << "\n";
}views::split возвращает под-диапазоны, а не строки — явное преобразование обязательно в обоих стандартах.std::vector<int> data = {1, 2, 3, 4, 5, 6, 7};
for (auto chunk : data | views::chunk(3)) {
for (int x : chunk) std::cout << x << " ";
std::cout << "\n";
} /
/ 1 2 3
// 4 5 6
// 7Группирует соседние элементы, пока выполняется предикат между двумя соседями.
std::vector<int> v = {1, 1, 2, 3, 3, 3, 4, 4};
// Группируем подряд идущие равные элементы
for (auto group : v | views::chunk_by(std::equal_to{})) {
for (int x : group) std::cout << x << " ";
std::cout << "| ";
} /
/ 1 1 | 2 | 3 3 3 | 4 4 |
// Вариант с std::equal_to<>{} — лаконичнее:
for (auto group : v | chunk_by(std::equal_to<>{})) { ... }📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
😎 Топ-вакансий для C++ разработчиков за неделю
C++ red team developer — от 180 000 и до 450 000 ₽
Офис (Санкт-Петербург)
C++ разработчик (CHYT) — Гибрид (Москва, Санкт-Петербург, Минск, Белград)
Senior Rendering engineer C++ в 3D Карту — от 350 000 и до 400 000 ₽ Удалёнка/Гибрид (Санкт-Петербург, Москва)
✍️ Еще больше топовых вакансий — в нашем канале C++ jobs
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст
C++ red team developer — от 180 000 и до 450 000 ₽
Офис (Санкт-Петербург)
C++ разработчик (CHYT) — Гибрид (Москва, Санкт-Петербург, Минск, Белград)
Senior Rendering engineer C++ в 3D Карту — от 350 000 и до 400 000 ₽ Удалёнка/Гибрид (Санкт-Петербург, Москва)
✍️ Еще больше топовых вакансий — в нашем канале C++ jobs
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст
👍1😁1
🎤 Ваши знания по ИИ-агентам + наша аудитория в 1 млн человек = профит
Мы в Proglib активно качаем тему ИИ-агентов. Если вы в теме, то у нас есть предложение 👇
Что с нас?
- Огромный охват: пропиарим ваши соцсети и продукты на 1 000 000+ айтишников.
- Личный бренд: станете узнаваемым экспертом в самой горячей нише 2026 года.
- Никакой рутины: наши редакторы сами упакуют ваши мысли в крутые посты.
Что с вас?
Любой экспертный контент по ИИ-агентам: кейсы из прода, шпаргалки, статьи, наработки по стеку (LangGraph, CrewAI, AutoGen и др.) или просто мысли по архитектуре.
👉 Стать экспертом и заявить о себе
Мы в Proglib активно качаем тему ИИ-агентов. Если вы в теме, то у нас есть предложение 👇
Что с нас?
- Огромный охват: пропиарим ваши соцсети и продукты на 1 000 000+ айтишников.
- Личный бренд: станете узнаваемым экспертом в самой горячей нише 2026 года.
- Никакой рутины: наши редакторы сами упакуют ваши мысли в крутые посты.
Что с вас?
Любой экспертный контент по ИИ-агентам: кейсы из прода, шпаргалки, статьи, наработки по стеку (LangGraph, CrewAI, AutoGen и др.) или просто мысли по архитектуре.
👉 Стать экспертом и заявить о себе
По умолчанию, когда вы нажимаете
F11 (Step Into) в Visual Studio, отладчик проваливается в каждую функцию — включая стандартную библиотеку, runtime и сторонний код?Функция
Just My Code решает эту проблему. При включении отладчик автоматически перешагивает через код, который не принадлежит вашему проекту — будь то STL, CRT или любые внешние библиотеки.Tools → Options → Debugging → General → Enable Just My Code
#include <vector>
#include <algorithm>
#include <iostream>
int doubleValue(int x) {
return x * 2; // ← ВАШ код
}
int main() {
std::vector<int> v = {3, 1, 4, 1, 5};
// F11 здесь без JMC → провалится в std::sort
std::sort(v.begin(), v.end());
// F11 здесь без JMC → провалится в std::transform
std::transform(v.begin(), v.end(), v.begin(), doubleValue);
return 0;
}
Без JMC: F11 на
std::sort уводит вас в дебри introsort внутри STL.С JMC: отладчик перепрыгивает sort и останавливается на следующей вашей строке.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9