ebanoe.dev
0
legacy_Жук_-··1 перегляд

В Comodo соискателям ебут мозги, предлагая за два дня написать антивирус на C++

Добрый день, ебаная редакция и ебаные читатели. Хочу рассказать вам необычную историю, которая произошла с моим товарищем. Я, так уж получилось, жил по соседству и мог воочию наблюдать за происходящим.

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

Итак, поехали. Один мой коллега, так уж вышло, начал поиски работы по вакансии Middle/Senior C++ developer. Да-да, есть жизнь за пределами ангуляров. В какой-то момент к нему постучалась hr и предложила “интересную” вакансию в Comodo. Для тех, кто вообще «не в кугхсе», компания разрабатывает продукт Comodo Internet Security и достаточно
известна в мире кибербезопасности (не так известна, как ProtectMasters, но всё-таки):

https://ru.wikipedia.org/wiki/Comodo

И чуть больше про сам продукт можно найти здесь:

https://ru.wikipedia.org/wiki/Comodo_Internet_Security

У компании есть офис в Киеве, куда, собственно, она и хотела бы нанять ещё девелопера (или нескольких). Всё складывалось вполне обычно, но ВНЕЗАПНО закрутилось с новой силой.

Описание вакансии и требований

Для начала ознакомимся с описанием вакансии и требованиями к кандидату:

https://www.work.ua/ua/jobs/2118094/
http://telegra.ph/MiddleSenior-C-Developer-08-02

Первый мелкий факап бросается в глаза практически сразу:

картинка не сохранилась в архиве

Что же это за требования такие, в которых опыт работы от 2-х лет, а опыт коммерческой разработки под винду минимум 3? И я молчу про 5 лет опыта в плюсах. Но не будём доёбываться, в целом глянем на требования:

картинка не сохранилась в архиве

Если кратко, то кандидат должен знать C++, многопоточность, STL, COM/ATL. Остальное – будет плюсом.

“С хуя ли мы так всё детально обсасываем?” — спросит любознательный читатель. А потому, что комодо даёт кандидатам тестовое заданьице. И не какое-нибудь там на 30-40 минут, а, сука, целый проект.

Тестовое задание – напиши антивирь

Заводят на тестовое вас определённым хитрожопым способом. Вначале разговор идёт о том, что вы умнейший и милейший человек. Конечно, никто не сомневается в вашем опыте и скилах, но нужно, чтобы вы показали свой продакшн код.

Как правило, да что там – в 99,99 % такой код показать вы нихуя не сможете, потому что педалили продакшн за бабки и под NDA. А, значит, если покажете, то нарушите условия договора со своим предыдущим заказчиком. Контрибьютить в опенсорц за “спасибо” любят немногие. А даже если и любят, то фикс бага в три строчки вряд ли покажет твоё неимоверное владение паттернами и новым стандартом плюсов. Была тут статьейка на ебаненьком, как гнобить разработчиков – читай про опен репозитории там.

Вот мы и подходим к тому, что показать ты можешь только своё еблище в скайпе. Рекрутёру очень-очень жаль. Но выход есть – тестовое задание. Тебе-то с твоим опытом и навыками его сделать – как два пальца! И щедрая компания комодо готова ждать даже несколько дней, всё для тебя. Бери весло и хуярь только. И вот оно – тестовое – уже летит тебе в скайп:

You need to develop simple malware detector.

Scanner

Scanner is core component implemented as shared library (DLL). Scanner component must be able
to:
— Scan file by path
— Scan array of bytes
— Load signatures file

Implement appropriate methods in the scanner interface.
Malware detection algorithm is the following: if scanned file contains any of predefined byte
sequences, it is considered infected.
The sequences are stored in the regular text file separated by newlines, in the following format:
HexString.{GUID}

Examples:
01ABEDFF55.{ab306a70-0fd2-4b4b-84fe-f9ebd899d90f} EE21DEAD827739ACCD028FFC.{5c34b10f-3f6d-4bbb-b9ec-2faa1ee07660}
If appropriate sequence is found, scanner must return its GUID. Use file mapping to increase
scanning performance.

Client

Client is UI or console application. Client application must be able to:
— Uses Scanner component to recursively scan specific folder.
— Scanning progress must be displayed.
-Scanning must be performed in the thread pool (2 threads per CPU core).

Bonus tasks (optional)

— Use modern C++11, C++14
— Implement Scanner and Client as separate processes with an IPC.
— Implement Scanner component as COM object in an in-process or out-of-process COM
server using ATL. Use ATL classes in Client application.
— Unit tests for Scanner classes.
—————————————————————-
You are free to refer to any documentation/internet etc.
Task estimated time: 1 — 2 days.

В сухом остатке – новый стандарт, а также ATL/COM – не являются обязательными навыками, но будут плюсом. Про WinAPI не говориться вообще.

Иными словами, комодо просит вас бесплатно хуярить тестовое несколько дней. Притом компания не отрицает, что вы вполне себе можете быть разрабом уровня синьор, но ей на это срать, потому тестовое оплачивать она не будет. Вам просто предлагают проебать несколько дней своего времени (при синьорском-то рейте), при этом никаких гарантий трудоустройства вам никто не даст.

Плюс, как вы заметили, никакой технический специалист пока на горизонте не появлялся – тестовое даёт hr, не отстреливающий нихуя – просто бери и делай, там видно будет.

Выполнение тестового

Раз из технарей никто не вышел на связь, мой товарищ решил ебашить так, как по его мнению, и по объективным причинам будет лучше.

Была сделана динамическая библиотека и исполняемый файл. Система сборки cmake, поддерживаемые оси – винда, мак и убунту. Было решено, что антивирус должен поддерживать как можно больше платформ, потому от решений типа COM/ATL стоит отказаться. Использовался новый стандрт С++ а также QtCore. Код покрывался тестами (gtest).

По функциональности всё было реализовано (сканирование, обход директорий и поддиректорий, отображение прогресса и т.д.) и работало на винде и убунте – за пару дней успел протестить только их. Было потрачено 4 вечера. Конечно, всё было не идеально, но товарищ отправил то, что было. Стал ждать фидбэка.

Для тех, кто не в курсе, что есть COM:
https://ru.wikipedia.org/wiki/Component_Object_Model

Простыми словами – это срань, прибитая к винде гвоздями и разработанная очень давно. В современных продуктах от неё отказываются, т.к. абсолютно непереносима на другие ОС.

ATL – срань, которая выходит из предыдущей срани, и нужна для использования первой:
https://ru.wikipedia.org/wiki/Active_Template_Library

Использование этого говна под большим вопросом в продуктах секьюрити, которые должны идти в ногу со временем и/или впереди планеты всей.

Сука, фидбэк

Наконец, настал этот день – день фидбэка. Он пришёл – вот он:

Добрый день!Спасибо, получили Ваше тестовое задание. По нему уже пришел фидбек:
usage of QFile instead of native file mapping and QThreadPool instead of STL or native windows threads as well as many controversial design decisions force us to think candidate is not suitable for our project

Всё! 4 вечера были проёбаны. И теперь ты знаешь, что после создания экземпляра QFile всё пошло по пизде. Если прочитать более вдумчиво, то парни хотят, чтобы вместо кроссплатформенных решений ты юзал API операционной системы. И если с файловым маппингом это ещё куда ни шло, то с потоками в Qt был реализован паттерн map/reduce, который в новый стандрат STL пока ещё не вошёл. Есть только предложение, парни, proposal:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3446.pdf

Про many controversial design я вообще не понял – что это, блядь, за срань? Человек потратил 4 вечера, хули вы тут взагали по загалям пишете? Где нормальный фидбэк?

Парням, видимо, через некоторое время стало стыдно, и пришёл более полный фидбэк.

Фидбэк 2 – перезагрузка

Более полный фидбэк содержит на несколько строчек больше – рассмотрим их все.

1) Checker.cpp: Checker::Knuth_Morris_Pratt() throw std::runtime_error("Pattern not found");
Why «throw» instead for the «return bool»?

Для поиска сигнатур использовался алгоритм Кнута-Морриса-Пратта. И пацанов вообще не смутило, что использовался именно он. А должно было, ведь для поиска сразу нескольких сигнатур он не подходит, а подходит Ахо-Корасик:
https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm

И парни из Comodo могли бы это заметить, но увы. Доколупались они к генерации исключения вместо возврата кода ошибки. Да будет вам, хлопцы-комодцы, известно, что «Чистый код» Роберта Мартина советует как раз генерировать исключения, ведь это добавляет в наш код наглядности. В общем, эта тема весьма холиварна, а вот эффективность алгоритмов – нет. Парень не успел реализовать Ахо-Корасик за 4 дня, а вы нихуя не отстрелили этого в своём же тестовом.

2) Dispatcher.cpp: void Dispatcher::SetGuid(const std::string& Guid) { memset(guidMemory, 0x00, GUID_SIZE); memcpy(guidMemory, &Guid[0], Guid.length()); }
What happened when Guid length will be greater then GUID_SIZE?
(Да, этот метод вызовется лишь после проверок на валидность строки
гуида, но все же)

Весь код не приводится здесь, как вы помните. Поэтому я кратко поясню ситуацию. У нас есть буфер фиксированоого размера, в него копируются данные из строки. Размер строки не фиксирован, поэтому для его определения используется метод length(). Здесь возможны 3 случая:
— строка длиннее буфера (то, чего парни опасаются), тогда может быть переполнение буфера;
— строка и буфер одинаковой длины, это нормальное поведение;
— строка короче буфера (парни не учли этот вариант).

Для того, чтобы исключить первый и последний вариант, строка перед подачей в рассматриваемый выше метод, проходит предварительную проверку на валидность. Невалидные строки не попадут сюда никогда. Таким образом, комодцы повторили поведение статического анализатора, именуемое как false positive. Т.е. приколупались к вполне нормальному куску кода.

Комодцы, рекомендую вам курс:
https://www.coursera.org/learn/software-security

Где на пятой неделе вам расскажут, каким образом статический анализатор должен проверять безопасность кода, как это достигается математически, а также что можно считать уязвимостью, а что – нет.

3) Mapper.cpp: Mapper::Mapper(const char* fileName) auto tmp = file.map(0, file.size()); if (!tmp) { throw std::runtime_error("Unable to map file"); } buffer.reset(new uint8_t[file.size()]); — Недопонимание идеи маппинга файла?
memcpy(buffer.get(), tmp, file.size()); — А что если память для
buffer не выделилась?

Парней здесь смутило, что товарищ маппит файл в память, а потом из замапленного куска делает копию. Дескать, маппинг уже отображает файл в память, с ним и работайте. Давайте и тут разберёмся. Во-первых, такое копирование, даже будучи избыточным, вполне корректно работает. Во-вторых, ни один антивирь сейчас не работает с маппами только для чтения, потому что ему нужно делать эмуляцию, деобфускацию и всякого рода преобразования с исходным файлом. С маппингом для чтения не получится в него что-то записать – он же для чтения. Маппинг на запись похерит оригинал. Но! Тут ещё как-то
можно согласиться, что конкретно для этой задачи было лучшее решение. Тем не менее, представленное решение тоже было рабочим!

Теперь вторая их претензия, что будет, если память не выделилась. Комодцы сами говорят про стронг скиллз в плюсах, и так косячат. Если память не выделилась – будет исключение, и до memcpy дело не дойдёт. Почитайте, комодцы, вам будет полезно:
http://www.cplusplus.com/reference/new/operator%20new/

4) Scanner.cpp: const char* GetInfectedFileGUID(const char* path) Can return nullptr, valid GUID string and empty GUID (0000-0000-...)
And all these results will be printed as founded matches.

А вот этот пиздёжь даже комментировать тяжело. Как вы помните, антивирь работал, его тестировали. А значит – он собирался и запускался. Если бы комодцы достали руки из жопы и запустили эту поделку, то увидели бы лог, в которого таких “founded matches” почему-то не было. Возможно, потому, что они нихера не могут читать в статике код. Парни, что это – недопонимание С++?

Скажу вам, ради справедливости, косяки там были. Конечно, куда ж без них – и не один, и не два. Вот только комодцы не нашли ни одного.

Вывод.

1. Мопед не мой, я только написал статейку на ебаное. Сам код тестового я не писал, его писал другой человек. Но он положил на вас, Comodo, хуй, и я бы положил, если бы вы не начали стучать мне в linkedin с этой сраной вакансией.

2. Убеждаюсь, что делать какие-то тестовые, не поговорив с техническими специалистами “до” — пустая трата времени. Также как и трата времени – общение с фриланс рекрутерами. Конечно, хотелось бы общаться с рекрутерами компании напрямую, если уж без рекрутёров никак. Но могу сказать из своего личного опыта, что рекрутёры в больших компаниях заняты рассказами друг другу о том, как они на выходных в клубешниках с причмокиванием сосали писюны. На работу времени не остаётся. Вот и приходится нанимать сторонних фрилансеров.

3. Комодо затеяли какую-то хуйню. То ли там у руля сидит дебил, который вообще без дупля во всех этих технолоГейях, то ли нужно показать руководству, что в Украине некого нанимать. И потом в ход можно пустить кумов, сватов, братов и прочих? Хуй его знает, но что-то там явно не здраво.

4. Читатель, если ты захотел в Комодо, возможно, тебе не стоит тратить своё время на людей, у которых цель – просто поебать тебе мозги?

5. Комоды, комодцы, комодовцы! Ну нахуя вы это делаете? Получается, что вы заявили достаточно высокую зп на вакансию, но никого не хотите нанимать? Кандидаты рвут жопы, рекрутёры рвут жопы – а вам это не стоит ни копейки, ведь вы платите за результат, а его нет.

6. Рекрутёр! Не трать своё время – эта вакансия будет висеть вечно.

7. Редакция, жду ваших комментов. Интересно мнение со стороны. Кто виноват, кто прав, что
делать?

Комментарий ебаной редакции

Дорогой Анонимус! Спасибо за отличную статью. Шарящих в «плюсах» в редакции нет, поэтому по технической части остается лишь поверить на слово. Касательно тестовых заданий на несколько дней, то здесь, конечно, тонкий вопрос. С одной стороны, время всегда жалко, поэтому неплохо бы таки перед приступлением к заданию пособеседоваться с технарем, чтоб вы друг друга поняли и чтоб не было явного кидка. Большие задания (больше, чем на полдня, а то и на несколько дней) — это настоящая роскошь, несколько часов/дней жизни. Как правило, стороны понимают это, поэтому действует негласное правило — если решение худо-бедно работает, контора не ебёт мозги и берет человека на работу. Ведь по сути это работающая программулина, законченный мини-проектец. Даже если никто его никому впаривать небудет, это завершенный кусок работы, на который были затрачены личное время и усилия — это уже достойно уважения. Исходя из вышеперечисленного, можно сделать вывод, что либо у Комодовцев нет опыта в найме, либо им не горит и они перебирают кандидатами, пренебрегая их лояльностью и особо не парясь. Что ж, ну, будут, значит, и дальше разрабатывать своё Комодо ограниченными ресурсами. Другу же совет — если речь идет о драгоценном времени — лучше по сто раз переспросить HRшу на предмет контакта с технарем и четко дать понять, что личное время — на вес золота.

З архіву ebanoe · Опубліковано 17 серпня 2017 р.

Коментарі (272)

Сортування:ТопНовіСтарі
  • legacy_трудовик

    говорят в комоде реструктуризация прошла, похоже не зря, теперь менеджерова больше и задач больше

  • legacy_Вася

    Да там писать сам сигнатурный сканер как нехер делать. Просто алгоритм Ахо Корасика обернуть в красивую обертку.
    Правда потом дальше всеравно мозги ебут и выясняется что им вовсе чел не в антивирус был нужен а в какую то унылую хрень типа их браузера.
    Был у них, делал задание, послал после таких разговоров нахрен.

  • legacy_expert

    Вы ебанашки вместо COM (ATL) начали городить QT и какие вы блядь синьоры после этого нахуй?

  • legacy_Рейхсфюрер_СС

    Только Rust и C с лиспом и асамом, плюсы для моральных уродов.

  • legacy_Ушат_Помоев

    Пидорнули пацанчика поделом, ибо нехуй даже пытаться с Qt в системное программирование. Это могло быть единственным и достаточным аргументом на отсев. Кутэ вообще должно было сдохнуть чёрти когда, ибо костыли для новобранцев и имбецилов от программирования. Своего рода Delphi, заквашенное на плюсах. Собсно, фидбэчина :»usage of QFile instead of native file mapping and QThreadPool instead of STL or native windows threads as well as many controversial design decisions force us to think candidate is not suitable for our project» — это то, как раз, хоть и косвенная, но феерическая квинтэссенция обозначенного выше тезиса: Qt? На хуй иди!

    Ну и по заданию скажу, что справился бы за день легко. Как два байта переслать. А если клиент библиотеки консольный, то за полдня. Ну и нахуй вообще сторонние либы притягивать за уши, когда из стандартных средств у плюсов из коробки минимум три способа доступа к файлам (для каждой из трёх платформ), в наличии стандартный способ работы с потоками/синхронизацией, неебический набор контейнерных классов, пиздатые строковые возможности и полный интернет разных нужных иногда экзотических и извращенных, но всё-же фич…… Единственно, что нужно помнить при кроссплатформе — это то, что пизженный сырой функционал надо заворачивать в удобные врапперы-бриджи и рассовывать по категориям, формируя что-то, именуемое в народе «фасадом».
    Теперь, по заданию. Прежде всего: «You need to develop simple malware detector.» — это нихуя не резидентный антивирус, перехватывающий весь файловый (а то и вообще весь) ввод-вывод в системе, обладающий эвристиками, детектящими активности, похожие на вирусную деятельность, помимо базы сигнатур. Это просто всего-лишь(!) сканер командной строки.
    теперь читаем very вниматочно!
    — Scan file by path
    сканировать 1 (адын щтука) файл по заданному пути. не? а как по мне — так да. зачем обходить рекурсивно директорий? ну а с другой стороны, обход директория — рекурсивная функция длиной в 50 строк на чистейшем плюсе (и это с учетом кроссплатформы), одним из аргументов которой идёт функтор (можно шаблоном запузырить), колбэчно вызываемый на каждый найденный файл. Иначе говоря, задание упрощается донельзя: «пишем консольный сканер для одного файла, путь к которому передаётся в командной строке». Единственная «сложность» — это распилить код на две части — типа клиент и типа сервер, и реализовать «сервер» в дэлэлэ. Пиздец! Пишем антивирус блеать!
    — Scan array of bytes
    сканировать массив байтов. чушь какая-то… не сказано ведь, откуда их брать! а методов-то больше, чем у ебливого тузика мандавошек… скипаем до выяснения. если у них возникнут вопросы — попиздим и выясним. скорее всего, имеется в виду сканирование байт в этом самом злосчастном файле. но и так придётся писать функционал сканирования массива байтов — мы ведь в любом случае сканим память, даже если это замапленный файл. А добавлен этот элемент в список скорей всего для количества, ибо перечисление фич в виде списка из двух айтемсов — это уже за гранью добра и зла.
    — Load signatures file
    загрузка файла сигнатур. собсно, без оной самое сканирование невозможно, так что тут просто ордер перечисления неверный. как реализовать загрузку сигнатур? сука, std::getline на текстовом файле. простейший токенайзинг по символу «.» на две части (у C++ есть минимум 2 метода искаропки для этого) и закидывание в std::map с предварительным преобразованием строки в UUID (он же GUID, по структуре).
    Ну а по предъявсленному коду (хоть и немного его предъявлено) можно с долей уверенности сказать, что код «ниразу ничоткий»(с), говённый код. Городушки какие-то. Ну вот нахуа предварительное обнуление буфера перед копированием туда содержимого аргумента функции?! Лишняя работа! Оверхед. Причем, двойной. Ведь GUID_SIZE == Guid.length(), исходя из пояснений к функции. А если уж очень надо косить под asciiz, то просто
    ….
    memcpy(guidMemory, &Guid[0], Guid.length());
    // sizeof(guidMemory) должен всегда быть >= (Guid.length() + 1)
    guidMemory[Guid.length()] = 0;
    ….
    Ну и вообще, хуёвая логика-практика: проверять аргумент функции на валидность перед ее вызовом во всех местах, а не в самой функции — тоесть, централизованно…

    Теперь, файл-маппинг…. пишем бридж (выдумываем универсальный интерфейс или нагло пиздим готовый откуда-либо) и реализуем 3 имплементации — под венду, линухс и мокасины. Получается чисто, да и кода не так уж много. Сами имплементации качаем с инета, если в гугле не забанены или пишем на коленке за 20 минут (если все-таки забанены 😉 опыта ведь вагон с перроном). Это чтоб не тащить за собой мелеарды трелеоноф иксобайт Qt…. Да и ваще, любой библиотечный мусор.
    Еще цытатки:
    цытатко: «Парней здесь смутило, что товарищ маппит файл в память, а потом из замапленного куска делает копию….. Во-первых, такое копирование, даже будучи избыточным, вполне корректно работает. Во-вторых, ни один антивирь сейчас не работает с маппами только для чтения, потому что ему нужно делать эмуляцию, деобфускацию и всякого рода преобразования с исходным файлом.».
    Да блядь…. ебучие рога! читаем задание более вниматочно и не выдумываем ничего своего! надо просто просканировать файл. не надо ничего эмулировать, ничего записывать. просто, сцуко, просканировать. это задача такая поставлена. если ты шото там додумал, то ты даун. и тебя отсеивают, дауна. а потомучта даун, блядь. даун, усложняющий всё во сто крат, дай тебе, дауну, волю, даун ты этакой! даун….
    цытатко: «….Тем не менее, представленное решение тоже было рабочим!»
    Тем не менее, но и тем не более. Не по заданию. Наблюдаем еще один оверхед. Тенденция, однако… даун?

    Ну и вдогонку пару брёвен…. Хлопец решил сыграть в лотерейку (сделать тестовое). И его отбрили (не выиграл лотерею — бывает). Пускай это не станет поводом к печали, ибо всё одно наша жизнь суть броуновское движение против диссипативных сил правительства.

    • legacy_Ушат_Помоев

      о! какой-то нубстер минусанул )))))))))))

      • legacy_test_1

        это Гудвин минусит, который и есть автор гениального кода из статьи, который вполне заслуженно посмели обосрать в коментах

    • legacy_Тамада_собачьих_свадеб

      У меня встал

    • legacy_Страшный_сон_путина

      Ну тогда упростим все к ебеням)
      grep -f sigs path

      • legacy_Ушат_Помоев

        Всё должно быть изложено так просто, как только возможно, но не проще. Это дедушка Эйнштейн задвинул. В этом я с ним согласен, хотя ни ОТО, ни СТО не люблю.

    • legacy_Гудвин

      Парень, еблан ты, твоё начальство выгонит тебя ссаными тряпками на мороз

      • legacy_Ушат_Помоев

        Еблан Дебилов — это мой односельчанин. А я — Ушат Помоев. Ты не путай! )))))

        • legacy_Гудвин

          Сложил тебе за щеку пару ссаных тряпок. Не благодари, код ошибки в твоём днк возвращать не нужно

          • legacy_Ушат_Помоев

            неаргументируемые лучи поноса…. признак баттхёрта? ну и по какому поводу пукан шкварчит? я же вроде-как не собирался писать статью-детектор!

          • legacy_Ушат_Помоев

            меня терзают смутные сомненья…. а не под ником-ли Гудвин скрывается автор статьи AKA Жук?!
            )))))))))))))))))))

  • legacy_оккупатор

    В реальном боевом C++, особенно в системном коде, исключения не используются и типично отключены к чертям. Маппинг, если мне память не изменяет, возможен с copy-on-write.

    • legacy_Ушат_Помоев

      исключения навзничь отключаются (в g++ ключом -fno-exceptions) обычно только при написании ОСей и дров, ибо runtime тоже отключено. а так — по желанию. Маппинг возможен, если платформа поддерживает MMU и страничеую адресацию ))))

      • legacy_оккупатор

        У нас в гейдеве исключения по жизни выключены.

        • legacy_Ушат_Помоев

          не, ну я ж ваще не против. можно и так, и так успешно программить. в защиту исключений скажу лишь, что при грамотном поюзе перфоманс импакта зеро, а бенефиты имеюца. дело вкуса, короче…

  • legacy_Лайкабос

    Прочитал о тестовом — и решил что автор статьи лошара. Во первых какое нахуй нда, если ты ищешь новую компанию? Ну поменяй там в своем коде какой нибудь нейминг конвеншн и выдай. Но скорее всего у автора просто никакого полноценного кода и не было, тупо джуном минор баги фиксил.

    Во вторых тестовое задание элементарное же. Далее на православном админском баше, через sed со счётчиком посимвольных совпадений это можно сделать, а через find exec grep ‘pattern’ вообще в одну строчку. Многопоточность? Запускаем пару процессов со своими тасками, пусть ядро поточностью занимается. Венда? Пусть антивирус поднимает юникс виртуалку и туда копирует сканируемое файло 😀
    Да даже на жабаскрипте работа с блобами и воркеры — все элементарно.

    Я хуй знает как там на крестах, но уверен что не сложнее. Так что автор — формошлеп и мудак, а креатив — говно.
    И да, Комодо — пидар контора задрипаная, хуй бы там работал когда.

    • legacy_Лайкабос

      Аа, так чел сделал тестовое и интервьюеры заговнили. Ну хуй пойми, маленькие но гордые компании частенько культивируют выебистость и чсв у своих адептов

    • legacy_Ушат_Помоев

      не, ну вызвать греп — это просто, однако, на винде его нету. придётся тянуть для винды скомпиленный бинарь…. подмять сырцы грепа? как вариант. )) только надо помнить , что в любой момент могут попросить чего-то добавить. расширить, так сказать, функционал. так что такое (чрезмерное) упрощение концепции чревато боком, а то и раком…

  • legacy_гусь_1

    Тыц-пыздыц

  • legacy_Мимо_Крокодилов

    >> new uint8_t[file.size()]

    По одной этой строчке видно, что данного погромиста к продакшн коду нельзя даже на километр подпускать.

    • legacy_Ушат_Помоев

      100%

    • legacy_Рваная_жопа_с_горящими_глазами

      как и его друга-защекана

      • legacy_Ушат_Помоев

        точно…. хотя-бы за то, как нежно и практически трепетно он называет этих еблобанов с комоды «парнями»))))))))))

        • legacy_Гудвин

          Хехе, зато на твоей галерке в жопу тебя поебут, начнёшь хоть нормально работать, сучка. Положил тебе скобок за щеку, мамкин авер. Проверяй рядом со ссаными тряпками

          • legacy_Ушат_Помоев

            хехе, зато если файл попадётся размерами больше оперативы, ебать система насвопается от души. будет щщастячко, если винт ССД будет! а 32-х битная так ваще пошлёт нахуй свыше 2 гектар выделять.
            PS: насчет этих всех скобок за щеку… детски сад, чесслово! мы тут за дело трындим — а тебе безобразия какие-то в голову лезут, школота неокуклившаяся.

  • legacy_полинаркоман

    автор конечно быдлокодер, а иметь опенсоурс проекты (хотя бы один) я думаю как минимум нехуйовая визитная карточка
    У меня тоже хуйня своя была года 2 назад
    сразу скажу я не мну себя каким то мега крутым кибербогом с++, всегда рад код ревью и критике
    в Developex проходил собеседование на Qt разраба,

    1. Вначале стандартный пиздеж с HR
    2. Через пару дней напиши реализуй ебучюю фцию на бинарных деревьях за полчаса (лулзьно что в требовании написано было что нельзя гуглить (наивные, ну ясно что пошла копипаста/копираста 2 напаса пару коментов ну и отослал этот высер)
    3. Получаю положительный отзыв, говорит HR типа «го тех. собеседование». ну го
    4 Попиздели-попиздели о плюсах бинарных сдвигах и всякой разной хуйне, вроде норм все, лажал минимум
    5. Получаю ответ от HR, вы прошли техническое собеседование, теперь последнее задание на пару дней

    нахуярь прогу с UI для рекурсивного поиска заданного текста по графу web страниц который строиться через найденные ссылки в заданой юрл ну и плюс что бы можно было задать параметры типа максимальное количество юрл и количество одновременных закачок страниц

    я по своей природе немного тугодум и любитель шишек, день подумал, покурил, на второй нахуярил код, на третий просмотрел подправил чутка что бы код был почище и понятнее, ну и отправил этот высер

    1. через пару дней HR говорит го финальное тех. собеседование, я начинаю думать да заєбали уже, ну го хуле там, наверное о тестовом задании поговорить хочет чот, забазарили дату время

    2. Пришел тот самый день, звонок в ебучий конченый высер под названием скайп
      поздоровались, уже какойто другой парниша, и начинает он меня спрашивать всякую плюсовую хуйню
      я такой говорю, стопеда, а что там с тестовым заданием? в ответ получаю вопрос «ты вообще о каком тестовом задании говориш, нихуя не знаю и не слышал» после этого чот вообще обидно стало, нахуя я это тогда все делал, на все следующие вопросы я начал не уверено отвечать и лажать, одним словом — провал.

    получаю письмо-копипасту уже на англ от HR, «Спасибо что пришли к нам в офис на собесодование, спасибо за интерес, бла бла бла, вы нам не подходите»

    вот така хуйня малята, випезделся, спасибо

    • legacy_minzdrav

      Минздрав предупреждает: проходить такие собесы чревато появлением анальных трещин.