Как решить задачу упаковки 800 файлов размером 120 Кб в zip архив
Что проверяют
Задаёте ли вы уточняющие вопросы, прежде чем решать. Условие намеренно неполное: не сказано, что за файлы, где идёт упаковка и что считать успехом. Следом обычно спрашивают, как вы будете тестировать такую функцию в продукте.
Как отвечать
Сначала уточните постановку и прикиньте объём: 800 файлов по 120 КБ дают около 94 МБ. Дальше важно, что это за файлы. Текст, JSON и CSV сжимаются в разы, а JPEG, PNG, PDF и уже сжатые архивы почти не сжимаются, архив выйдет примерно того же размера. Если задача про лимит (почта или форма загрузки принимает не больше заданного объёма), вопрос в том, влезет ли результат, и ответом может быть «разбить на несколько архивов».
Если нужно просто упаковать, хватит zip -r в терминале или модуля zipfile в Python. Важная деталь: zipfile.ZipFile(path, "w") по умолчанию использует ZIP_STORED, то есть складывает файлы без сжатия. Для сжатия нужен compression=zipfile.ZIP_DEFLATED. Лимиты формата здесь не мешают: классический ZIP держит до 65 535 файлов и 4 ГБ, дальше включается ZIP64.
Если речь о тестировании функции архивации, проверки такие:
- полнота: в архиве ровно 800 файлов, содержимое совпадает с исходным (контрольные суммы,
unzip -tилиtestzip()); - имена: кириллица, пробелы, одинаковые имена из разных папок, длинные пути;
- границы: пустой файл, один файл, ноль файлов, превышение лимита по числу или объёму;
- нагрузка и сбои: время упаковки, потребление памяти, параллельные запросы, обрыв посередине, недоступный файл;
- совместимость: архив открывается штатными средствами в разных ОС.
Где спотыкаются
Сразу пишут код, не спросив, что за файлы и какая цель. Интервьюер ждал именно вопросов.
Обещают, что архив «сожмёт в несколько раз», не зная типа файлов. Для фотографий выигрыш будет в пределах нескольких процентов.
Проверяют только факт создания архива. Файл archive.zip на диске ещё не значит, что внутри все 800 файлов с правильными именами и целым содержимым.