This is a variation of the Veeam test task done in Go. The test task was supposed to be solved in .net. I was lucky enough to solve this test task back in 2017-2018. Below is the description of the test task.
Original description in Russian
Написать консольную программу на C#, предназначенную для поблочного сжатия и расжатия файлов с помощью System.IO.Compression.GzipStream. Для компрессии исходный файл делится на блоки одинакового размера, например, в 1 мегабайт. Каждый блок компрессится и записывается в выходной файл независимо от остальных блоков. Программа должна эффективно распараллеливать и синхронизировать обработку блоков в многопроцессорной среде и уметь обрабатывать файлы, размер которых превышает объем доступной оперативной памяти. В случае исключительных ситуаций необходимо проинформировать пользователя понятным сообщением, позволяющим пользователю исправить возникшую проблему, в частности если проблемы связаны с ограничениями операционной системы. При работе с потоками допускается использовать только стандартные классы и библиотеки из .Net 3.5 (исключая ThreadPool, BackgroundWorker, TPL). Ожидается реализация с использованием Thread-ов. Код программы должен соответствовать принципам ООП и ООД (читаемость, разбиение на классы и т.д.).- Работоспособность – проверяется на тестовых файлах с размерами от 0 до 32 Gb; Правильность выбора алгоритма с точки зрения эффективности – должен быть максимально загружен самый слабый компонент системы (диск/процессор);
- Знание и умение использовать примитивы синхронизации – должны быть правильно выбраны примитивы для синхронизации потоков, доступа к данным; Проработка архитектуры – есть разбиение на классы по принципам ООП и ООД, не должно быть лишних классов, интерфейсов, методов и т.д.;
- Читабельность и понятность кода – код должен быть простым, аккуратным; алгоритм программы должен быть понятен без отладки; Грамотная обработка ошибок и нестандартных ситуаций – должна выводиться диагностическая информация, по которой должно быть понятно что произошло без отладки программы;
- Правильное управления ресурсами – не должно быть утечек неуправляемых ресурсов, а также своевременное уничтожение управляемых ресурсов.
Translation into English using an AI
Create a console program in C# that is designed for block-by-block compression and decompression of files using System.IO.Compression.GzipStream. For compression, the original file is divided into blocks of the same size, for example, 1 megabyte each. Each block is compressed and written to the output file independently of the other blocks. The program should effectively parallelize and synchronize the processing of blocks in a multiprocessor environment and be able to handle files larger than the available RAM. In case of exceptional situations, it is necessary to inform the user with a clear message that allows the user to fix the problem, in particular, if problems are related to operating system limitations. When working with threads, it is allowed to use only standard classes and libraries from .Net 3.5 (excluding ThreadPool, BackgroundWorker, TPL). Implementation using Threads is expected. The code of the program should correspond to the principles of OOP and OOD (readability, splitting into classes, etc.).- Functionality — tested on test files with sizes from 0 to 32 GB;
- Correctness of algorithm selection in terms of efficiency — the weakest component of the system (disk/processor) should be loaded as much as possible;
- Knowledge and ability to use synchronization primitives — primitives for synchronizing threads and accessing data must be chosen correctly;
- Architecture design — there is a division into classes according to OOP and OOD principles, there should be no unnecessary classes, interfaces, methods, etc.;
- Readability and clarity of code — the code should be simple and neat; the program algorithm should be understandable without debugging;
- Competent handling of errors and unusual situations — diagnostic information should be displayed, which makes it clear what happened without debugging the program;
- Proper resource management — there should be no leaks of unmanaged resources, as well as timely destruction of managed resources.
Important
I don’t know how relevant the test task is today. I don’t remember all the requirements and comments. I am open to dialogue and discussions. But I doubt that if this test task is relevant, I will be able to fully assist you.
- Windows machine (the code is not adapted for other operation systems, kernel32.dll calls)
- Go
go run main.go -m=C -source="C:\_temp\Prod12122024.log" -target="D:\_temp\Prod12122024.gzip"
-m
: mode, available two modes -m=C
compress and -m=D
decompress
-source
path to the source file
-target
path to the result file
Just a simple Go project to teach goroutines, Go synchronization primitives and some kind of third-party packages. Also an attempt to use SOLID and GOF patterns in GO practice