Инфантилизм как он есть

Попался замечательный топик на Привете. Не берусь сказать правда это или нет – все таки это пересказ через третьи руки. Тем не менее с проявлениями подобного инфантилизма сталкиваюсь чаще, чем хотелось бы. Оптимистичное начало: Подскажите, реально ли найти работу тестером после 2-месячных курсов? Человек не имеет никакого ИТ образования, кроме этих 2 месяца курсов с мужиком, которого нашли по газете… у человека предыдущее образование связано с социальными каким то науками - что то типа не то десткая психолошия, не то социология и что то с детьми… То есть ни о каком выше среднего уровне компьютерного пользователя речи не иедт, навыков бухшалтерии нема. Read On →

Нам нужно нарисовать семь красных линий

— Так вот, — говорит Морковьева. — Нам нужно нарисовать семь красных линий. Все они должны быть строго перпендикулярны, и кроме того, некоторые нужно нарисовать зеленым цветом, а еще некоторые — прозрачным. Как вы считаете, это реально? — Нет, — говорит Петров. — Давайте не будем торопиться с ответом, Петров, — говорит Сидоряхин. — Задача поставлена, и ее нужно решить. Вы же профессионал, Петров. Не давайте нам повода считать, что вы не профессионал. Read On →

Про то, как отцепиться и ничего не порушить

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

We recently saw an AV in stress where our vectored exception handler was called after our dll was unloaded. After investigating the issue, it seems like removing the vectored exception handler does not wait for all users of that exception handler to finish (and does not even remove the exception handler from list for future users if there is one current user). So, there seems to be no way to synchronize removing the exception handler and the dll unloading – any synchronization within the exception handler is useless since the exception thread may be about to call the exception handler.

Недавно мы наблюдали падение приложения во время стрессового тестирования, вызванное тем, что векторный обработчик исключения был вызван после того, как наша DLL была выгружена из памяти. В процессе расследования выяснилось, что, похоже, снятие векторного обработчика исключения не ожидает, пока все пользователи этого обработчика закончат работу (и даже не удаляет обработчик для будущих пользователей, если обработчик в данный момент используется). Так, похоже, что не существует способа синхронизировать снятие векторного обработчика и выгрузку DLL – любая синхронизация в пределах обработчика исключения бесполезна, поскольку поток, в котором произошло исключение, может только готовится вызвать обработчик исключения.

Read On →

Правильный прототип функции DebugBreak()

Функция DebugBreak() объявлена вот таким образом: void WINAPI DebugBreak(void); Если подумать, то это не очень удачный вариант объявления. Гораздо более удобным вариантом был бы: void __cdecl DebugBreak(...); Почему? В такую функцию можно передать любой набор параметров. Например, значения переменных интересующих нас в данной точке останова. Или значение нетривиального выражения. А затем в отладчике посмотреть уже готовый результат вместо утомительных попыток понять, куда наш неутомимый компилятор опять заоптимизировал переменную.

История одной оптимизации

Писал я тут свой первый драйвер для сетевой карты. Взял, как полагается, за основу готовый образец драйвера. Выкинул всю аппаратно-зависимую часть. Добавил свою. По ходу дела выяснил, что tear-down код в примере отсутствует напрочь, чтение стандартной конфигурации не сделано, кругом hardcoded константы. В общем, обычная история, что вы хотите от образца?

Дописал до работающего состояния, протестировал скорость TCP/IP соединения. Получается примерно 3 MByte/sec на одно соединение, около 12 MByte/sec – пиковая пропускная способность нескольких параллельных соединений. Маловато для 1 Gbit/sec соединения.

Read On →

Разбор задачи про пакеты

В комментариях к задаче про пакеты было задано много вопросов. Отвечу здесь.

Во-первых, задача действительно простая, иначе никак не уложиться в формат собеседования. На написание кода и сопутствующее общение есть всего около получаса. Плюс писать код на доске сложнее, чем в любимом редакторе. Тем не менее, в задаче любовно набросано граблей, на которые по возможности кандидат должен суметь не наступить. Условие задачи не полное (естественно!), не смотря на кажущееся обилие деталей. Кандидат всегда может прояснить у собеседующего недостающие детали и получить +1 к карме. Либо он может её решить, предположив разумные умолчания. В этом случае собеседующий всегда может добавить недостающее условие к задаче и попросить поправить код соответственно.

Read On →

Задачка на интервью. Пакеты

А хотите задачку, которую я даю претендентам на контрактную позицию в нашей команде? Вот она, родимая. Есть библиотечная функция: char get_byte(); Функция читает байт из некоего соединения. При необходимости, функция ждет, пока не придет очередной байт. По соединению пересылаются пакеты следующего формата: два байта длины, за которыми следует данные. Длина пакета включает в себя заголовок пакета, т.е. те самые два байта. Нужно написать функцию recv, получающую очередной пакет: size_t recv(char* buf, size_t size); В buf передается указатель на буфер, куда должен быть записан пакет (полностью, включая заголовок). Read On →

NDIS, !ndiskd и DML

На работе понадобилось написать драйвер для сетевой карты. Я этого раньше никогда не делал и вообще с NDIS дела не имел. А тут такая возможность! Делюсь впечатлениями.

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

Read On →

We are still hiring!

Раз уж заговорили про набор людей, - моя команда всё еще ищет двух Senior SDE с опытом разработки драйверов и другого низкоуровневого кода, а так же с хорошим пониманием сетевых технологий (протоколы, драйвера, и т.п.): We are hiring! Мы делаем новые H1B!

Microsoft проведёт очередной набор студентов и выпускников из России, Беларуси и Украины.

Вот, по внутренней рассылке пробежало: Корпорация Microsoft проводит интервью для поступления на работу в Microsoft USA для студентов и выпускников из России, Беларуси и Украины в феврале 2011 года на должности: Инженер по разработке программного обеспечения (SDE) Инженер–тестировщик по разработке программного обеспечения (SDET) Мы приглашаем студентов которые окончили ВУЗ в 2010 году или или собираются окончить ВУЗ в 2011 году на постоянную работу в Рэдмонд. Пожалуйста, присылайте ваши резюме до 1-го февраля 2011 года. Read On →