Тестовые задания по C#
Здесь собраны реальные тестовые задания, которые дают соискателям на стажировках и junior-позициях. Эти задания помогут лучше подготовиться к отбору, потренироваться и пополнить портфолио
СКБ Контур • Высокая сложность
Тестовое задание по C# от компании СКБ Контур
ImageTransformer Нужно написать сервис, решающий такую задачу. По HTTP приходит запрос, содержащий картинку в формате png, координаты прямоугольной области и тип преобразования. Надо применить к картинке преобразование, вырезать фрагмент, соответствующий заданной области, и отправить в ответ. Вопросы по заданию можно задавать здесь: https://t.me/joinchat/A3Kxg0zr49r5YbnfHpIT0A Требования к решению Ожидается, что ваш сервис будет подвергаться большой нагрузке. Поэтому он, конечно же, должен работать максимально быстро. Чем быстрее обрабатывается каждый запрос — тем лучше. Чем больше запросов в секунду обрабатывается — тем лучше. Но у любой производительности есть предел, и ваш сервис должен быть готов столкнуться с нагрузкой, превышающей его возможности. Требования к стабильности под экстремальной нагрузкой: 1. Если нагрузка превышает возможности сервиса — производительность не должна деградировать. То есть, если сервис способен обработать максимум X rps, при нагрузке X * 2 rps сервис должен всё ещё обрабатывать не меньше X rps. Запросы, до которых очередь дойдет не скоро, можно сразу отклонять с ошибкой. 2. Производительность сервиса не должна деградировать со временем. Если сервис круглосуточно работает под нагрузкой без перезапусков, никакие ресурсы не должны закончиться и пропускная способность не должна уменьшиться. 3. Клиенты не должны замечать кратковременные задержки в работе сервиса. Если случилась пауза из-за GC, или ещё по какой-то причине сервис короткое время не обрабатывал запросы, клиенты не должны получить ошибок, если пауза действительно была небольшая. Известно, что сервис будет запущен на виртуальной машине с 8 GB оперативной памяти и 8 ядрами процессора. Операционная система — 64-битная Windows Server 2016. Реализация Сервис должен представлять собой self-hosted веб-сервер, написанный на C# под .NET 4.6.2. Можно использовать вот этот шаблон проекта: https://github.com/DQKrait/Kontur.ImageTransformer
СКБ Контур • Высокая сложность
Тестовое задание по C# от компании СКБ Контур
Задание Напишите сервер статистики для многопользовательской игры-шутера. Матчи этой игры проходят на разных серверах, и задача сервера статистики — строить общую картину по результатам матчей со всех серверов. Сервер должен представлять собой standalone-приложение, реализующее описанный ниже RESTful API. Общая схема работы такая: игровые сервера анонсируют себя advertise-запросами, затем присылают результаты каждого завершенного матча. Сервер статистики аккумулирует разную статистику по результатам матчей и отдает её по запросам (статистика по серверу, статистика по игроку, топ игроков и т.д.). Нельзяиспользовать.NETCore. Требования к решению ● Сервер должен реализовывать описанное выше API. ● Сервер должен поддерживать работу на произвольном HTTP-префиксе (задается при запуске). ● Сервер не должен терять данные при перезапуске. Если на PUT-запрос сервер вернул 200 OK, данные не должны быть потеряны даже в случае аварийного завершения приложения. Допустима потеря данных при внезапном выключении хоста. Дляхраненияданныхможноиспользоватькаксобственноерешение,таки готовуюembedded-базуданных.ВкачествеБДнерекомендуется использоватьMSSQLLocalDB. ● Сервер не должен падать при получении некорректных запросов. На такие запросы нужно отправлять ответ с кодом, отличным от 200 OK. Допустимы любые коды вида 4xx и 5xx. ● Сервер должен быстро обслуживать все виды запросов. ● Сервер должен уметь логировать ошибки. ● Код должен быть покрыт тестами. ● Код должен быть написан аккуратно и с любовью к деталям. Оформление решения ● Все внешние модули, от которых зависит решение, должны содержаться в папке с решением. Также допускаются зависимости от nuget-модулей. ● Решение должно успешно собираться с помощью msbuild: nuget restore && msbuild /p:Configuration=Release. В результате сборки папка Kontur.GameStats.Server/bin/Release внутри папки с решением должна содержать всё необходимое для работы приложения. ● Сервер должен запускаться из папки bin/Release следующим образом: Kontur.GameStats.Server.exe --prefix http://+:8080/, где вместо http://+:8080/ может быть любой UrlPrefix. ● Можно использовать в качестве заготовки проект из репозитория на гитхабе: https://github.com/DQKrait/Kontur.GameStats
Waliot • Лёгкая сложность
Тестовое задание по C# от компании Waliot
Сервис геокодирования 🗺️ Тестовое задание на позицию backend разработчика. Задача Необходимо разработать приложение с возможностью прямого и обратного геокодирования (из координат в адрес и наоборот). Не требуется разворачивать собственную базу данных с адресами, достаточно использовать сторонние API (Google, Яндекс, другое). Таким образом приложение является кэширующим прокси-сервисом для стороннего сервиса геокодирования. Приложение должно предоставлять API с JSON форматом данных. Требования Java / Kotlin Spring Boot Кэширование результатов запросов. В качестве кэша можно использовать SQL базу данных (MySQL, Postgres, другое), либо NoSQL решение (Memcached, Redis, другое). Логирование ошибок и работы приложения в целом. Покрытие тестами базовой функциональности. Дополнительно (будет преимуществом) Метрики работы приложения (Actuator, Dropwizard, другое). Сборка и запуск приложения в Docker. Решение Решение должно быть представлено публичным репозиторием или zip-архивом. В проекте необходимо добавить readme с инструкцией по запуску приложения. Результат решения (ссылку на репозиторий или zip-архив) следует отправить на почту по адресу: gehrman.i@firstmk.ru. Удачи! <3
СКБ Контур • Высокая сложность
Тестовое задание по C# от компании СКБ Контур
Задача. Архиватор логов Неотъемлемая часть любого промышленного приложения — это его логи. Туда попадают записи о всех важных событиях в жизни приложения, например ошибках, скорости и результатах выполнения пользовательских запросов. Зачастую чтение логов — единственный способ разобраться с внезапно возникшей в продакшене неведомой проблемой, или посчитать какую-то статистику о работе приложения. За день приложение под хорошей нагрузкой может генерировать десятки гигабайт логов. Все эти логи хочется хранить вечно, а значит, их надо сжимать. Обычно для этих целей используются алгоритмы сжатия общего назначения — например, gzip. Но можно ли сжимать лучше? Наверное да — ведь логи имеют специфичный формат записей и множество повторяющихся элементов. Ваша задача — продемонстрировать, что это возможно. Задача Разработать приложение для архивации логов в заданном формате (см. конец этого документа). Это должно быть консольное приложение, имеющее два режима работы: сжатие и разжатие. При запуске с двумя аргументами приложение должно запускаться в режиме сжатия: dotnet LogPacker.dll <input_file> <output_file> Первый аргумент задает путь до исходного лог-файла. Второй аргумент задает путь до файла, куда вы запишете сжатые данные. При запуске с тремя аргументами, где первый равен -d, приложение должно запускаться в режиме разжатия: dotnet Kontur.LogPacker.dll -d <input_file> <output_file> Здесь второй аргумент задает путь до сжатого файла, сформированного вашим приложением, а третий аргумент — путь до разжатого файла. Требования и ограничения Внимание! Чтобы соблюсти все базовые требования к решению, рекомендуем воспользоваться шаблоном: https://github.com/DQKrait/Kontur.LogPacker/tree/master Там также есть набор простейших тестов и утилита для запаковки решения в архив перед отправкой на проверку. Внимание! Для выполнения задания вам понадобится .NET Core SDK 2.1 и среда разработки Visual Studio 2017 или JetBrains Rider. Пробную версию JetBrains Rider можно скачать тут: https://www.jetbrains.com/rider/ Функциональные требования: После цикла сжатие-разжатие файл должен быть побайтово равен исходному. Алгоритм должен корректно работать на логах, где строки имеют другой формат, а также на данных, вообще не являющихся логами (в общем случае это просто случайные бинарные данные). Требований по качеству сжатия в таком случае нет, но требования по скорости сжатия сохраняются. Качество сжатия: на произвольных лог-файлах заданного формата размер сжатых данных должен быть меньше, чем при использовании gzip (здесь и далее имеется в виду стандартная реализация из .NET Core: GZipStream с CompressionLevel.Optimal). Ваш архиватор должен выигрывать хотя бы 1 процентный пункт (если gzip сжимает файл до 25% исходного размера, у вас должно получаться 24% или ещё меньше). Скорость сжатия: на любых данных время работы вашего алгоритма не должно превышать время работы gzip более чем в два раза. Аналогично со скоростью разжатия. Потребление оперативной памяти: объем потребляемой оперативной памяти не должен зависеть от размера входных данных и на любых входных данных не должен выходить за разумные пределы (100-200 МБ). Загрузка процессора: архивация логов не должна мешать другим работающим на машине приложениям. Поэтому ваш архиватор должен работать в один поток. Решение может создавать временные файлы, но их суммарный размер не должен превышать размер входного файла, и они должны удаляться до завершения процесса архиватора. Все временные файлы должны находиться в рабочей директории приложения (т. е. если вы будете указывать только имя файла, без директории, всё сработает как надо). Требования к оформлению: Решение должно представлять собой консольное приложение на .NET Core 2.1. Нельзя использовать внешние библиотеки и приложения, как из nuget, так и подключаемые вручную. Решение должно быть запаковано в zip-архив с фиксированной структурой папок. Чтобы не ошибиться, рекомендуем воспользоваться утилитой Kontur.LogPacker.SubmitHelper из проекта с шаблоном.
без ограничений.
Чтобы получить полный доступ,
вам необходимо зарегистрироваться.