C++ C++  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Архитектурный разбор C++-системы

Итоговый тест ставит участника в положение инженера, которому нужно разобрать уже работающую C++-систему: восстановить владение, найти неявные контракты, провести поток данных через потоки и процессы, оценить цену изменения и выбрать проверяемое решение вместо красивой, но пустой схемы.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 30 вопросов, время — 85 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 30
У приложения есть один `Runtime`, создающий и уничтожающий все службы в известном порядке. Какое владение лучше отражает эту модель?
C++C++20
class Runtime {
    std::unique_ptr<Logger> logger_;
    std::unique_ptr<Database> db_;
    std::unique_ptr<Api> api_;
};
Вопрос 2 из 30
Два компонента держат друг друга через shared_ptr и никогда не разрушаются. Какая связь обычно должна стать weak_ptr?
C++C++20
struct Session { std::shared_ptr<Manager> manager; };
struct Manager { std::shared_ptr<Session> current; };
Вопрос 3 из 30
Плагин вернул объект с виртуальными методами. Что обязано пережить этот объект?
C++C++20
auto plugin = dlopen(path, RTLD_NOW);
auto service = create_service(plugin);
dlclose(plugin);
service->run();
Вопрос 4 из 30
Фоновая задача захватывает `this` и выполняется после закрытия окна. Какой архитектурный вопрос нужно решить прежде синтаксической правки?
C++C++20
executor.post([this] { model_.refresh(); });
// Window уничтожается, задача остаётся в очереди
Вопрос 5 из 30
Какой порядок остановки системы обычно безопаснее?
C++C++20
void Runtime::shutdown() {
    accepting_requests_.store(false);
    queue_.close();
    workers_.request_stop();
    workers_.join();
    api_.reset();
    database_.reset();
    logger_.reset();
}
Вопрос 6 из 30
Метод принимает `int timeout_ms`, где -1 означает бесконечность, 0 — не ждать, остальные значения положительны. Как улучшить контракт?
C++C++20
Result wait(int timeout_ms);
Вопрос 7 из 30
Внутренний метод вызывается только после внешней валидации и считает неверный Update нарушением программного контракта. Какой механизм точнее?
C++C++20
void apply_validated(User& user, const Update& update) {
    assert(update.is_valid());
    user.apply(update);
}
// внешняя граница проверяет данные до этого вызова
Вопрос 8 из 30
Какой контракт у функции опасно скрыт?
C++C++20
std::span<const Byte> Cache::view() const { return storage_; }
void Cache::append(Byte b) { storage_.push_back(b); }
Вопрос 9 из 30
Сообщения между процессами меняются независимо. Что является частью архитектурного контракта?
C++C++20
struct MessageEnvelope {
    std::uint32_t schema_version;
    std::uint64_t message_id;
    std::span<const std::byte> payload;
};
Result decode(MessageEnvelope envelope);
Вопрос 10 из 30
Как определить инвариант класса счёта?
Вопрос 11 из 30
Продюсеры без ограничения кладут задания быстрее одного потребителя. Какой дефект архитектуры возникнет первым?
C++C++20
for (;;) {
    queue.push(read_request()); // очередь без лимита
}
Вопрос 12 из 30
Система требует сохранить порядок событий для одного клиента, но допускает параллелизм между клиентами. Как разложить поток?
Вопрос 13 из 30
Почему передача `const Message&` в асинхронную очередь опасна?
C++C++20
void Dispatcher::post(const Message& m) {
    tasks_.push([&m] { send(m); });
}
Вопрос 14 из 30
Кэш обновляется событием, которое может прийти повторно. Какое свойство обработчика особенно полезно?
Вопрос 15 из 30
Где лучше проверять размер и структуру входного бинарного пакета?
C++C++20
Header h;
std::memcpy(&h, data, sizeof h);
auto payload = std::span(data + sizeof h, h.length);
Вопрос 16 из 30
Изменение private-поля класса заставляет пересобирать почти весь продукт. Что наиболее вероятно?
C++C++20
// giant.hpp включён тысячами файлов
class Service {
    std::vector<InternalRecord> cache_;
    HeavyClient client_;
};
Вопрос 17 из 30
Какой change amplification признак у центрального enum состояния?
Вопрос 18 из 30
Нужно добавить новый формат экспорта. Когда точка расширения в виде интерфейса оправдана?
Вопрос 19 из 30
Почему общий модуль `utils` повышает цену изменений?
C++C++20
// utils.hpp
#include "database.hpp"
#include "network.hpp"
#include "ui.hpp"

namespace utils {
    Json to_json(const DomainObject&);
    void retry(NetworkRequest&);
    std::string format_for_ui(const DomainObject&);
}
Вопрос 20 из 30
Как оценить миграцию формата хранилища?
Вопрос 21 из 30
Запрос проходит через пять служб и теряется. Какой элемент диагностики наиболее полезен?
Вопрос 22 из 30
Как проверить корректность остановки пула потоков?
C++C++20
Pool pool{4};
pool.submit(long_job);
pool.submit(waiting_job);
pool.stop();
Вопрос 23 из 30
Как fault injection проверить обработку частичной записи на диск?
C++C++20
auto n = writer.write(buffer); // тестовый writer возвращает меньше buffer.size()
Вопрос 24 из 30
Почему интеграционный тест, зависящий от реальных часов и сети, часто нестабилен?
Вопрос 25 из 30
Какой вопрос задавать при расследовании падения без воспроизведения?
Вопрос 26 из 30
Сервис должен отвечать за 20 мс на 99-м процентиле. Почему среднее время 5 мс недостаточно?
Вопрос 27 из 30
Как пакетная обработка может ускорить поток мелких сообщений?
Вопрос 28 из 30
Профиль показывает крупные копии между Parser, Validator и Storage. Какой первый архитектурный вопрос?
C++C++20
Document d = parser.parse(bytes);
Document checked = validator.validate(d);
storage.save(checked);
Вопрос 29 из 30
Какой API лучше для функции, синхронно читающей неизменяемый непрерывный буфер без сохранения ссылки?
C++C++20
Result parse(std::span<const std::byte> input);
Вопрос 30 из 30
Как выбрать между общей библиотекой и отдельной службой для нового компонента?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу