В 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шу на предмет контакта с технарем и четко дать понять, что личное время — на вес золота.
Коментарі (272)
Недавно попался на рекрутерскую прокладку (ну тоесть у них есть свой сайт для РЕКРУТМЕНТА, но к работодтелю или хотя бы ХР они вас обработают сами).
И в общем у этой ебаной прокладки — 2 теста всегда тебе кидают, когда подаешься на любую вакансию.
1 сука — пародия на iq тест, сиди блядь и продолжай цепочку, реверсивно инженируй и т.д. Идет он блядь час.
2 ой тест — тест на знания «ПРОГРАММИРОВАНИЯ», ну тоесть тупо там всё подряд. Ты можшеь подаваться на жс разработчика, а в этом тесте из 40 вопросов 10 будут по C++, 10 по Джаве, 10 по питону и т.д. — вообще охуенно. Ну и он тоже занимает где-то час (я по интуиции с универа еще помнил всякого), еще был устарелый ЖС и всякое говно мамонта про верстку таблицами, лол.
И потом прокладка торжественно отправляет твое сиви и прилепляет к нему эту ебату — РАБОТОДАТЕЛЮ ТОЧНА БУДЕТ ПОЛЕЗНА И ОХУЕННА и приходит ответ что вакансия мертва )))00
Тоесть блядь времени на придумывание этой хуйни было, а придумывать механизм очищения вакансий — не было ))00
А я проебал несколько часов жизни в пятницу на эту хуйню.
ссылку в студию.
Случайно контора не Nix Solutions?
Ну-ка пиздуй обратно писать Connection, бииистра
Собеседования уже давно не представляют из себя метод отбора по квалификации… Просто акт психологичеакого отбора рабов, с целью сбивать зарплатные ожидания и перспективы роста.
На собесах не пытаются понять, что вы знаете, а пытаются найти в вас слабые места и объяснить, как это ужасно чего-либо не знать.
Согласен, но если кандидат не добоеб то сам сможет на собесе найти слабые места у собеседующего или заподозрив неладную хуйню — вкрутить педали без лишних обьяснений.
Когда я так сделал (поймал собес. на незнании) — мне даже не сказали результат.
Все потому что кроме того типа, которого ты обоссал, никто не знает твоих скилов, HR это все до пизды.
А он умывшись сказал что ты последний днарь) Так же пару раз было, обидно(
Все потому, что я достаточно хорошо технически подкован, а еще я выполнил кмс по лифтингу в awpc и в свои 27 при росте 187 вешу 97кг нежирной мыш. массы., т.е. не качок, но очень атлетично сложен.
Уверен, что тут есть такие же люди и они подтвердят, что на собеседованиях сидят дрыщи с проплешинами на голове и когда я прихожу, случается две вещи:
>> не раб
…и пришел на галеру на собес? Не рабы в основном менеджмент — нихуя особо не делают и взвешивают бабки.
>> т.е. не качок, но очень атлетично сложен.
…если ты не бройлер а только атлетично сложен то этого не видно даже под футболкой в сеточку и коротких кожаных шортах, поэтому самка врятли поведется.
>> но уже понравился HR
…хрюша на собесе это просто прокладка для отсеивания полных неадекватов (в теории), поэтому твое ЧСВ явно на небесах.
Ладно
Статья от какой-то обиженки, а эти неумелые попытки выдать свой проёб за «мопед не мой, эт товарищ ходил, не я» просто умиляют. Признайся, блять, как нормальный мужик, что это твой собес, а не выдумывай воображаемых друзей.
А чего стоят нелепые оправдания этой ранимой девочки. Тебе ж сука в задании написали «Implement Scanner component as COM object in an in-process or out-of-process COM server using ATL. Use ATL classes in Client application», нет блять, я ж самый умный, сам себе придумаю требований (желательно с использованием своего любимого фреймворка), сам их решу а потом обижусь, когда нахуй пошлют и накатаю статью на ёбаное. А не проверять валидность параметра внутри библиотечного метода и оправдываться «ну он же в моём приложении вызывается в местах с проверкой, поэтому в метод пойдут проверенные гуиды, мамая клянусь братуха» — просто адский ад, сеньора сразу видно.
4 вечера он потратил, АЖ 4 СУКА ВЕЧЕРА ОТНЯЛИ У ТАКОГО ВАЖНОГО ЧЕЛОВЕКА, МИДЛА С++! А времени для написания этого высера не жалко было? Вердикт: кг/ам.
Согласен полностью. Тестовое задание вполне вменяемое, и реально проверяет необходимые для этой вакансии навыки.
Друг автора потратил 4 дня на задание, при этом понял его по-своему. По пунктам:
1. Никто не просил туда тянуть Qt, написано же «Client is UI or console application».
2. Про треды на CPU — проверка как кандидат владеет вопросом, это must have в такого рода продуктах.
3. ATL/COM — это optional. К чему возмущаться, что это «это срань, прибитая к винде гвоздями и разработанная очень давно» ?
Другу не пришло на ум, что эти компоненты нужно знать не для того, что на них пишется продукт, а то что они также могут/должны мониториться анитивирусом как вероятный вектор атаки зловредов и прочей херни ? Или старый софт уже не нужно проверять ? Да и в новом также нередко используют эти технологии.
И не нужно забывать, что основная часть клиентов антивирусов как раз сидят на винде. Фраза
«Было решено, что антивирус должен поддерживать как можно больше платформ, потому от решений типа COM/ATL стоит отказаться» вообще идет в разрез с требованиями задания.
4. Игнорирование файлового маппинга(который к слову есть на всех плтаформах), высеры про «алгоритм Кнута-Морриса-Пратта», «Ахо-Корасик» и «Чистый код Роберта Мартина» говорит, что парня понесло вообще не туда.
Про исключения лучше бы вообще не писал. Пусть поговорит с любым системным прораммистом, почитает про SEH, или Рихтера. Это блять не уютная джава,в которой можно и нужно все заворачивать в эксепшены.
Дальнейшую истерику уже и комментировать не охота.
Диагноз — пациент срр-шник уровня галеры, работающий на саппорте индусских проектов. В кресты пришел с либо с веба либо с курсов(судя по его ссылкам), хз что хуже. Если хочет лезть системное программирование — пусть учит ПРАВИЛЬНУЮ мат часть и нарабатывает опыт в этой области. Хотя, судя по ЧСВ — эти советы бесполезны.
То что «комодцы не нашли ни одного» косяка, не говорит о том, что они тупые и меркнут перед гением автора. Просто после всего остального сразу стал понятен уровень кандидата и тратить на него свое время было бы глупо.
ЗЫ. Достали уже эти скороспелые cpp-шники, нахватавшиеся вершков из разных источников и думающие, что простое упоминание C++ должно заставлять простых смертных падать перед ними на колени.
QA>C++
Шо, бомбануло, комодо? Та если б я на собес к тебе попал, то смешал бы там с говном тебя. Давай уже ссылки на правильную матчасть — на Windows internals хотя б, а то рихтера почитать. Питрек! Вот кто писал про сехи, так что не пизди мне тут, нуб
«обидно за пидарское поведение. Тестовое было отличненько сделано.»
Малолетний неудачник-соискатель-говномешатель погуглил умные слова и решил реабилитироваться ? Ссылки ему подавай, лолка малолетняя… Если вместо головы жопа и из нее же руки растут — то тебе дорога в 1С, а не рассуждать с умным видом про вещи о которых понятия не имеешь.
Такое же впечатление возникло.
Добавлю только, что на хуй не впёрлась эта ваша кроссплатформенность в такого рода продуктах. Антивири нужны только под винду — вот и пишите их под винду, с использованием пусть и прибитых гвоздями, но нативных технологий целевой ОС.
Баттхерт перфекциониста, который даже не знаю откуда мог такой взяться в мире крестоёбов.
С другой стороны, тестовое задание более чем на 4 часа — а не пошли-ка вы нахуй.
Николя, ты узрел, что это с пометкой optional? сам ты мидл, слепыш
https://lurkmore.to/%D0%9E%D0%B4%D0%B8%D0%BD_%D0%BC%D0%BE%D0%B9_%D0%B4%D1%80%D1%83%D0%B3
Блядь. Вот обычно со всем согласен, но жаловаться на тестовое задание на каких-то сраных 2 дня? Та блядь, на дрочку за неделю уходит больше. Еще и оплачивать выполнение тестового (причем явно тестового, а не продакшен-левел)? Автор зажрался вообще.
Да не 2 дня жалко, обидно за пидарское поведение. Тестовое было отличненько сделано.
Отлично для индуса.
хуево сделано же, хули ты залупаешься столько времени? ожидал, что зачморят галеру, а вместо этого крестовики тебя в твое же говно макнули? так иди учись, а не обижайся
Кинул вам пару массивов за щеку. Парсите
Массивы не воспринимаем, только по отдельным переменным. Так что в ответ закинули тебе список из LONGINT variables. Считывай!
😀😀😀
Очередное позорище. Соискателя напрягло, что компания ищет людей с хорошим опытом и поразило, что есть люди, использующие плюсы и по 10 лет. Несчастный задрот, явно изучал Жабу и решил, что на плюсах он тоже сможет всё. И о чудо, его код признали убогим 🙂
Невежда не знал старый добрый СОМ? Позорище! Любая девочка из HR отлично владеет СОМ, DCOM, ActiveX . Это же классика технологий Windows.
🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂
Главное, чтобы знала технологию РТОМ
РТОМ они все знают, легкий порог вхождения в эту технологию, а в дальнейшем и вхождения технологий в них
Может и знают, но почему-то, не редко на продакшене, их навыки вызывают вопросы и частенько не соответствуют зарплатным ожиданиям.
Хочешь жопой мою сиську отсосать?
Хочешь? Хочешь?
ХОЧЕШЬ
Кто тебе сказал, что соискатель не использует плюсы 10 лет?
кому нужна старая толстая жопа светлой, кроме алкащей.
бля, по моему несколько вечеров на тестовое задание — это нормально, а то, что вакансия может висеть вечно — так это нормальная практика, перебирают людей, если найдется такой, который и на отлично им антивирус напишет, и на собесе будет петь, стихи рассказывать, жонглировать, то такого неадеквата, возможно, и наймут
На неоплачиваемую стажировку 😂
Правда в том, что крестоёбы в интернетах — это люди, которые в большинстве своём ничего сложнее простых консольных приложений не писали, но зато знают все косяки пхп/джс и прочих скриптовых языков и при каждом удобном случае, петушатся этим.
Нормальный более менее опытный кодер знает и понимает, где и как лучшее применить тот или иной инструмент, коими и являются языки программирования.
По-твоему UI это сложно? В большинстве ide их сейчас рисуют, а не кодят как в старые времена.
Я сам крестоеб, но даж сайты редизайнил работая в хостинге.
Конечно сложно, красивый дизайный сделать намного сложнее нежели набыдлокодить на крестах.
то ли орать с тебя то ли задизайнить тебе за щеку
Давай друг другу майнить на грудь?
Ну, порисуй.
Я думаю в плюсы приходят скорее из-за непреодолимых ограничений других языков. Плюсы наиболее универсальны, хоть писать и в разы более трудоёмко. Сам хоть и топлю за них, считаю, что питон для своих задач хорош, да и жиэс няшка :3
Не згоден з автором в двох моментах:
1. Незнаходження сигнатури це нормальний кейс, навіть більш ймовірний, ніж знаходження. Тому вертати потрібно false при незнаходженні, а не кидати exception, exception — коли щось йде не за планом, а не в стандартних ситуаціях.
2. new вертатиме null для VC6 компілятора, замість кидання bad_alloc exception. Звісно, в усіляких embedded системах де exceptions випиляні для економії пам’яті, new теж вертає null, коли не може виділити пам’ять, але антивірус, ясна справа, не для embedded, тож практичне значення має лише VC6 варіант. І щось мені підказує, що не даремно комодо просять COM і ATL замість кросплатформенного коду — очевидно, у них там тонни легасі коду, що компілюється тільки під VC6, а якщо і перейшли на щось сучасне, то для збереження зворотньої сумісності прилінкували nothrownew.obj.
VC6 в 2017м? Серьезно?
Ну а що — компанія старенька, легасі коду повно, якщо і перейшли на щось сучасніше, то прилінкували nothrownew.obj — і не треба заміняти if(!щось_там) на обробку винятків у кількох тисячах рядків коду.
Перевести легаси код на чтото поновее гараздо практичней чем мучасть старую студию. Она хоть на 7ке заводится и работает? Или в подарок к 6й студии идет пень на ХП?
Так стару студію не потрібно мучити. Береш найновішу студію, береш старий код, компілюєш новою студією, лінкуєш nothrownew.obj — і new тобі преспокійно повертає нуль замість кидання винятків, коли пам’яті не вистачає, відповідно не потрібно переписувати старий код, який розраховує на нуль, а не на винятки
Шта? Этот фокус перестал жить после 2003ей.
for (int i = 0….) и пиздарики.
Как ты, блядь, олень, в вижал студии шестой новые 11 и 14 стандарт будешь юзать? Хули ты ide с компилятором мешаешь вообще?
І 11, і 14, і 17, і навіть 20 сумісні з 98. А стару студію використовувати не обов’язково з кодом, який писався в розрахунку на компіляцію з VC6 — з найновішою студією лінкуєш nothrownew.obj і отримуєш поведінку new таку ж, як і з VC6.
Ага, хуй они слинкуются, парень. Попробуй полинкуй. Думаешь, нахер статик либы в платных продуктах собирают для каждой студии отдельно?
Ліньки перевіряти, повірю на слово.
А че в чистом коде разве не написано про Platform Toolset? Лучше бы ты С++ хотя бы на уровне мидла выучил, чем всякую архитектурное поебонь для взрослых читать 🙂
>>> Why «throw» instead for the «return bool»?
Если я всё правильно понимаю, вызывается исключение для того, чтобы просигнализировать о ненайденной сигнатуре. Но в плюсах обычно не принято вызывать исключение при каждом пуке. Исключение — на то и исключение, что сигнализирует об исключительной ситуации, о неожиданности, которой в нормальных условиях случиться не должно. А ненайденная сигнатура — вполне себе обычная ситуёвина. Так что рили вызов исключения тут не совсем уместен. Он вам не питон! Но в рамках задания на пару дней действительно скорее приебались на пустом месте.
>>> What happened when Guid length will be greater then GUID_SIZE?
Трудно сказать, не видя остального кода, насколько справедлива эта претензия. Но в целом, разнесённость проверки и кода, который в ней нуждается, попахивает… Однако меня больше триггерит это:
>>> &Guid[0]
Ай ай ай… Лезть в кишки строки через указатель на первый элемент вместо специального интерфейса для прямого доступа к данным data()… А вдруг в какой-то ебанутой реализации stl букавки хранятся в std::list? А вдруг в каких-то реализациях строка хранится по кускам?
В общем, как я понял, Comodo — отличная контора как раз для таких педантичных ублюдков говнокодеров фашистов, как я. Впрочем, в рамках тестовой задачи на пару дней все эти предьявы всё же скорее притянуты и говорят об их крайней охуевшести.
Хотя… Если на сеньора то в принципе наверное и оправданно. Не мне говнокодеру судить.
Ну и чушь, особенно про буковки у STL в листе.
Ну это утрированно, понятно что так вряд ли будет
::data() появился с С++ 11.
А вдруг по кускам не бывает — не бывает, есть c_str() который явно не собирает строку по кускам.
Чтобы не было «а вдруг» есть стандарт, в стандарте это «явно» не прописано, значит «а вдруг» имеет место быть. Я знаю точно, что c_str/data вернёт указатель на непрерывно размещённые данные, про &str[0] я знаю только то, что это указатель на символ. Всё.
А головой подумать? 🙂 с_str() — константный метод, за которым нет необходимости чистить память, если данные не сплошные — как он будет работать?
Ну, например, при необходимости получения c_str внутренняя структура меняется, кусочки строки склеиваются в единую область, на которую и возвращается указатель. Метод константный — ну ок, делаем данные через mutable, для пользователя будет полная видимость константности.
в стандарте с++11 это явно прописано, символы хранятся последовательно. однако, идиоматичнее использовать .data()
data был всегда, с 11 он null-terminated
Да, ты прав, у стринга была всегда, с 11 там front и back добавили 🙂 А вот у вектора с которым я стринг перепутал добавили только с 11 🙂