Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

+1 107новых вакансий за сутки·93 791вакансия открыта сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 273
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 407 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 198
  • Облачные технологии14 153
  • QA вакансии3 463
  • Backend вакансии2 115
  • Инженер данных1 798
  • Продакт-менеджер1 248

Разработка

  • Android1 857
  • iOS1 696
  • Fullstack вакансии994
  • AI вакансии954
  • Frontend вакансии753
  • Mobile вакансии44

По стеку

  • Go8 725
  • Java6 580
  • Node.js2 032
  • .NET1 731
  • Kotlin1 619
  • Rust1 471
  • C#717
  • PHP689
  • C++580

DevOps и инфраструктура

  • Kubernetes7 778
  • DevOps вакансии6 080
  • Linux-инфраструктура5 500
  • Terraform / IaC4 278
  • CI/CD3 272
  • Мониторинг и Observability1 790
  • SRE567
  • Кибербезопасность454

Аналитика и данные

  • Data Scientist1 138
  • Бизнес-аналитик921
  • Аналитик данных857
  • Системный аналитик154

Другие направления

  • Проджект-менеджер623
  • UI/UX дизайн148
  • Ручное тестирование14

По регионам

  • Вакансии в США44 162
  • Вакансии в Европе24 019
  • Вакансии в Канаде4 539
  • Работа в России3 868

По формату

  • Удалённые вакансии75 003
  • Релокация в США44 160
  • Гибридная работа12 465
  • Офисная работа7 099

По уровню

  • Senior вакансии42 635
  • Middle вакансии20 963
  • Junior вакансии6 714

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • Wise189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify36 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме C++Все вопросы
C++MiddleПроектирование систем

Что такое принципы SOLID и как они применяются в C++?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

SOLID в C++ реализуется через виртуальные функции (OCP, LSP), шаблоны и концепты (ISP, DIP), а также строгое разделение заголовков (SRP). Концепты C++20 дают статическую проверку интерфейсных контрактов.

S — Single Responsibility Principle

Класс должен иметь единственную причину для изменения.

#include <string>
#include <fstream>

// Нарушение: класс и хранит данные, и сериализует, и логирует
class UserBad {
public:
    std::string name;
    void saveToFile(const std::string& path); // SRP-нарушение
    void log();                               // SRP-нарушение
};

// Соблюдение: разделение ответственности
struct User { std::string name; int id; };

class UserRepository {
public:
    void save(const User& u, const std::string& path) {
        std::ofstream f(path);
        f << u.id << " " << u.name << "\n";
    }
};

Принципы SOLID в C++

O — Open/Closed Principle

Открыт для расширения, закрыт для изменения.

#include <memory>
#include <vector>

struct Shape {
    virtual double area() const = 0;
    virtual ~Shape() = default;
};

struct Circle : Shape {
    double r;
    explicit Circle(double r) : r(r) {}
    double area() const override { return 3.14159 * r * r; }
};

struct Rectangle : Shape {
    double w, h;
    Rectangle(double w, double h) : w(w), h(h) {}
    double area() const override { return w * h; }
};

double totalArea(const std::vector<std::unique_ptr<Shape>>& shapes) {
    double sum = 0;
    for (const auto& s : shapes) sum += s->area();
    return sum;
    // Новую фигуру добавляем без изменения этой функции
}

L — Liskov Substitution Principle

// Нарушение: Rectangle vs Square — классический антипаттерн
struct Rectangle {
    virtual void setWidth(int w)  { w_ = w; }
    virtual void setHeight(int h) { h_ = h; }
    int area() const { return w_ * h_; }
protected:
    int w_ = 0, h_ = 0;
};

// Square переопределяет setWidth/setHeight — нарушает LSP
// Решение: не наследовать Square от Rectangle
// Используйте независимые типы или концепты

I — Interface Segregation Principle

// Нарушение: один жирный интерфейс
struct IWorker {
    virtual void work()  = 0;
    virtual void eat()   = 0;  // роботы не едят!
    virtual void sleep() = 0;
};

// Соблюдение: мелкие интерфейсы
struct IWorkable { virtual void work()  = 0; virtual ~IWorkable() = default; };
struct IFeedable  { virtual void eat()   = 0; virtual ~IFeedable()  = default; };

struct Robot    : IWorkable { void work() override { /* ... */ } };
struct Employee : IWorkable, IFeedable {
    void work() override { /* ... */ }
    void eat()  override { /* ... */ }
};

D — Dependency Inversion Principle + C++20 Concepts

#include <concepts>

// Абстракция через concept (статическая DIP)
template<typename T>
concept Logger = requires(T t, std::string_view msg) {
    { t.log(msg) } -> std::same_as<void>;
};

struct ConsoleLogger {
    void log(std::string_view msg) {
        std::puts(msg.data());
    }
};

struct FileLogger {
    void log(std::string_view msg) { /* write to file */ }
};

template<Logger L>
class Service {
    L& logger_;
public:
    explicit Service(L& l) : logger_(l) {}
    void doWork() {
        logger_.log("Starting work");
    }
};

// Использование
ConsoleLogger cl;
Service service(cl);  // CTAD, нет виртуальных вызовов

Подводные камни

  • Виртуальное наследование для реализации ISP даёт накладные расходы — vtable на каждый интерфейс. C++20 concepts дают нулевую стоимость через статический полиморфизм.
  • LSP-нарушения в иерархиях наследования часто обнаруживаются не в compile-time, а в runtime. Концепты и статические проверки (static_assert) позволяют сдвинуть ошибки влево.
  • Злоупотребление DIP через интерфейсы создаёт избыточную косвенность — в performance-sensitive C++ коде предпочитайте шаблоны и concepts над виртуальными функциями.
  • SRP в C++ осложняется тем, что разбиение на мелкие классы увеличивает количество заголовков и время компиляции — баланс между чистотой и build performance важен.
  • Open/Closed через виртуальные функции требует stable ABI — добавление нового чисто виртуального метода в базовый класс ломает всех наследников.
  • Шаблонная DIP (concepts) не поддерживает runtime-подмену реализации — для мокирования в тестах всё равно нужны виртуальные функции или type erasure (std::function, std::any).

Частые вопросы на собеседовании

  • Что такое undefined behavior в C++ и приведите примеры?
  • Что такое smart pointers в C++? Объясните unique_ptr, shared_ptr и weak_ptr.
  • Что такое правило трёх / правило пяти / правило нуля (Rule of Three / Five / Zero)?
  • Что такое RAII (Resource Acquisition Is Initialization) и почему это важно?

Типичные ошибки

  • Объяснять SOLID в C++ только по синтаксису, без жизненного цикла и стоимости.
  • Игнорировать ошибки, null/empty состояния, порядок инициализации или режим сборки.
  • Давать пример, который работает в демо, но ломается при изменении владельца ресурса.
  • Показывать сырой указатель без объяснения владельца и момента освобождения.

Что проверяет интервьюер

  • Кандидат формулирует точную модель для SOLID в C++, а не только определение.
  • Пример компилируем, безопасен по lifetime и соответствует версии технологии.
  • Названы trade-off, ограничения и диагностируемые симптомы ошибки.

Как вы знаете этот вопрос?

Проверить себя по теме C++ →

Источники

  • https://isocpp.org/wiki/faq/strange-inheritance
←Предыдущий вопросРасскажите о случае, когда особенности C++ повлияли на архитектурное решение, производительность или сопровождение проекта.Следующий вопрос→Каковы наиболее распространённые ошибки работы с памятью в C++ (dangling pointers, утечки памяти, buffer overflow) и как их обнаруживать?

Связанные темы

C++Debuggingmemory-managementperformance-tradeoffs

Вакансии с этим навыком

C++ вакансии
  • AI SW Engineering Student
  • Senior Language Programmer
  • Firmware Leader
  • Edge AI Engineer (Mid/Senior) | Telematics
  • Engineering Manager