ITBlogs

Сообщество IT-профессионалов
Welcome to ITBlogs Sign in | Join | Help
in Search

Not a kernel guy

  • minidump.py

    Если вам вдруг зачем-то понадобилось проанализировать структуру минидампа не загружая его в отладчик, начните вот с этой статьи: http://moyix.blogspot.com/2008/05/parsing-windows-minidumps.html. Автор написал скрипт на Python (на основе Construct) для анализа дампов, который распознает все потоки, описанные на MSDN (а также недокументированный поток, хранящий информацию об описателях окон).

    PS. Скрипт открывает дамп в текстовом режиме, что очевидно не будет работать на Windows. Чтобы этого не случилось, последняя строчка скипта должна выглядеть вот так:

    print MINIDUMP_HEADER.parse_stream(open(sys.argv[1], "rb"))
  • Как сделать копию экрана в Windows.

    Интересно, что существует около десятка способов сделать копию экрана в Windows. Программно, без привлечения нестандартного оборудования или сторонних библиотек. Статья “Screen recording with WDDM 1.2” описывает наиболее часто используемые:

    1. GDI: GetDC(NULL), а затем BitBlt(), чтобы скопировать данные из видеопамяти в системную.
    2. Direct3D: метод IDirect3DDevice9::GetFrontBufferData() позволяет скопировать содержимое видеопамяти в системный буфер.
    3. Mirror Display Driver: позволяет напрямую перехватывать команды отрисовки.
    4. OpenGL: дает прямой доступ к отображаемому буферу в видеопамяти.
    5. Windows 8: появился специализированный интерфейс IDXGIOutputDuplication.
    6. Перехват интерфейсов Direct3D: вызовы интерфейсов Direct3D довольно легко перехватить, внедрившись в процесс. Это позволяет скопировать содержимое заднего буфера непосредственно перед его показом.

    Кроме этих есть еще несколько способов:

    1. DirectDraw: дает доступ к виделпамяти через так называемую primary surface (DDSCAPS_PRIMARYSURFACE).
    2. DirectX 10: метод IDXGIOutput::GetDisplaySurfaceData() похож на IDirect3DDevice9::GetFrontBufferData(), но работает только для полноэкранных приложений.
    3. Media API: Статья “Various methods for capturing the screen” описывает способ копирования экрана с помощью Windows Media API. Скорее всего это обертка вокруг GDI.
    4. WM_PRINT: правильно написанные приложения должны уметь отрисовывать свои окна в произвольный контекст.
    5. DWM: некоторые умудрились раскопать недокументированные функции Desktop Window Manager, дающие доступ к Direct3D поверхностям, куда отрисовываются окна верхнего уровня.
    6. WDDM: в конце концов можно написать собственный WDDM драйвер (или фильтр), чтобы перехватывать графические команды. Сложно, но, в принципе, реально.

    Не смотря на все разнообразие, самый древний способ (GDI) остается наиболее оптимальным для большинства применений. Он относительно медленный, но при этом работает на любой версии Windows. Остальные способы (кроме, может, Direct3D и DirectDraw) либо не работают со всеми версиями ОС, либо конфликтуют с видео драйверами и приложениями.

  • Мое интервью на OpenQuality.ru.

    Мое интервью на OpenQuality.ru: http://experience.openquality.ru/alexey-pakhunov-interview/.

  • Дело о пропавшем файле ‘ammintrin.h’.

    Начну издалека. Мой любимый редактор кода на данный момент – Sublime Text 2. До него я пользовался Notepad2, Source Insight, Far (естественно после того, как появился Colorer). Что было до Far-а с Colorer-ом я уже не очень помню. Точно был Borland Pascal и Turbo C. Редактор кода Visual Studio в этом списке должен быть где-то между Borland-ом и Far-ом. Не помню, чтобы я пользовался им продолжительное время.

    Отладчику из Visual Studio повезло чуть больше, так как правильно держать WinDbg я научился уже после замены Far-а на Notepad2 пополам с Source Insight. Остальной инструментарий из набора Visual Studio я использую не очень часто, особенно учитывая, что компилятор и другие инструменты все равно есть в отдельно стоящем SDK. Так и получается, что сама по себе Visual Studio мне в общем-то и не нужна.

    Единственная неприятность заключается в том, что такая конфигурация (SDK есть, а Visual Studio нет) явно попадает в категорию экзотики. И, как следствие, не поддерживается и не тестируется как следует. Приходится самому.

    Последняя проблема вылезла в самый неожиданный момент. Мне понадобилось обновить компилятор из SDK до версии из Visual Studio 2010 SP1. Зачем понадобилось – это отдельная история. На сайте Microsoft соответствующее обновление имеется: KB2519277 (и ставиться, надо сказать, не в пример быстрее Visual Studio 2010 SP1). Однако после установки обновления сборка Chrome начала ругаться на отсутсвующий заголовок ‘ammintrin.h’.

    Здесь нужно добавить, что в 2010-ой версии Visual Studio с инсталляциями не заладилось с самого начала. Достаточно посмотреть на readme файл к вышеупомянутому обновлению. А если учесть, что само обновление вышло не для того, чтобы обновить версию компилятора и SDK, а как исправление для Visual Studio 2010 SP1, который портил установленный SDK…

    Вернемся к нашим баранам. Заголовок ‘ammintrin.h’ включался из ‘intrin.h’, который, в свою очередь, находился в “%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\include”. Что было похоже на проблемы с инсталляцией. Беглый поиск в интернете показал, что проблема решается переустановкой SP1. SP1 мне поставить не удалось в виду отсутствия Visual Studio на машине, так что я переставил SDK и обновление к нему с нуля. Естественно не помогло.

    В процессе установки однако, я сохранил копию ‘intrin.h’. Выяснилось, что KB2519277 обновляет ‘intrin.h’, добавляя ссылку на ‘ammintrin.h’, но сам ‘ammintrin.h’ не ставит.
    Покопавшись в интернете еще немного выяснилось (по аналогии с ‘immintrin.h’, ‘pmmintrin.h’), что ‘ammintrin.h’ должен содержать intrinsics для SSE4A, которые специфичны AMD и в проекте не используются.

    http://docs.oracle.com/cd/E24457_01/html/E21991/gliwk.html:
    Note that ammintrin.h is published by AMD and is not included in any of the Intel intrinsic headers. ammintrin.h includes pmmintrin.h, so by including ammintrin.h, all AMD SSE4A as well as Intel SSE3, SSE2, SSE and MMX functions are declared.

    Родилось простое решение – был создан пустой заголовок ‘ammintrin.h’ и положен рядышком с ‘intrin.h’. Тем, кому функции все-таки нужны, могу посоветовать восстановить их по образцу либо таки скопировать этот файл с машины, где стоит SP1 (но это не спортивно). :-)

  • Как перевести SDDL в двоичный дескриптор безопасности.

    Некторые ключи реестра хранят дескрипторы безопасности (security descriptor) в двоичной форме (REG_BINARY). Пример – значение AccessPermission, которое устанавливает дескриптор безопасности COM сервера. Редактировать такой дескриптор – одно удовольствие. :-)

    Стандартный диалог редактирования двоичного значения в реестре.

    Тем не менее, отыскался способ как сделать это без помощи сторонних инструментов (или компилятора) – с помощью PowerShell и WMI класса Win32_SecurityDescriptorHelper. Вот так можно прочитать дескриптор из реестра и преобразовать его в SDDL:

    $key = "hklm:\SOFTWARE\Classes\AppID\{4ff35d5e-d226-4550-9248-03e7779e67de}"
    $sd = (gp -Path $key).AccessPermission
    $sddl = ([wmiclass]"Win32_SecurityDescriptorHelper").BinarySDToSDDL($sd).SDDL
    PS C:\Users\alexeypa> $sddl
    O:BAG:BAD:(A;;CCDC;;;IU)(A;;CCDC;;;SY)(A;;CCDC;;;BA)

    И в обратную сторону:

    $binary_sd = ([wmiclass]"Win32_SecurityDescriptorHelper").SDDLToBinarySD($sddl).BinarySD
    -join ($binary_sd | foreach {$_.ToString("X2")})

    И, наконец, если SDDL вам кажется китайской грамотой – поможет sddlgen.exe из Windows SDK:

    SDDLGen

  • Windows Internals, Part 1, Sixth Edition.

    Ух ты, оказывается, первая часть 6-ой редакции Windows Internals вышла в марте: RTM’d today: Windows Internals, Sixth Edition, Part 1! В отличие от 5-ой редакции, в список резензентов которой я, можно сказать, попал просто за компанию – главным образом потому, что работал тогда в команде Window Kernel, в этот раз я ждал возможности поучаствовать в создании книги с нетерпением. В этот раз мне было что сказать – не даром я с Wow64 нянчился столько времени. Не смотря на это, я умудрился прошляпить рецензирование “своего” раздела про Wow64 и делал это в последную минуту – уже после того, как глава была закончена.

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

    Acknowledgments

    :-)

  • Битва титанов: Visual Studio 2010 против Sophos Antivirus.

    По рассылке пришло описание бага ну просто феерической кавайности: http://connect.microsoft.com/VisualStudio/feedback/details/649139/vs2010-does-complete-rebuild-based-on-completely-unrelated-file. Если вкраце, то присутсвие Sophos Antivirus на машине, заставляет Visual Studio делать полный билд вместо инкрементального. Почему? Потому что MSBuild полагает, что файл “%ProgramData%\Sophos\Sophos Anti-Virus\config\Config.bops” (который, понятно, ни к MSBuild, ни к собираемому проекту никак не относится) является вводом каждого target’а в проекте. По какой-то причине, этот файл обновляется очень часто, что и вызывает полную пересборку всего проекта. WTF?

    WTF?

    Оказывается, чтобы определить зависимости между файлами в проекте, MSBuild внедряется в процессы компилятора, линкера и перехватывает чтение и запись файлов (что одновременно и гениально, и не очень умно). Sophos Antivirus, мало чем отличаясь по своей коварности от других антивирусов, также внедряется в каждый процесс на машине (и, стало быть, творит там свои черные дела). Помимо всего прочего, Sophos Antivirus читает “%ProgramData%\Sophos\Sophos Anti-Virus\config\Config.bops”. Ну а посольку делает он это от имени процесса куда внедрился, то MSBuild заносит этот конфигурационный файл в список зависимостей.

    Facepalm

    PS. Вот этот комментарий к ответу Дэна (инженера из Microsoft) с описанием в чем, собственно, проблема очень порадовал:

    Hello Dan,
    and thanks for your response.
    Unfortunately I was not able to comprehend your response.

    Здраствуйте Дэн и спасибо за ваш ответ.
    К сожалению, я не смог понять ваш ответ.

    :-)

  • А вы знаете, что ваш браузер устарел?

    Вот пример, почему проверка версии браузера – зло (и адъ, и Содомъ с Гоморрой):

    Did you know that your Internet Explorer is out of date?

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

    Я вот, кстати, не понимаю. От 99% проверок на версию браузера можно было бы отказаться, если бы браузеры поддерживали проверку поддерживаемых фич. Тогда продобные проверки выглядели бы не как “если версия IE > X.Y или версия Firefox > A.B или …”, а как “если поддерживается тег video”. Вон процессоры и операционные системы делают это спокон веков: IsProcessorFeaturePresent().

    PS. И тем более не понимаю, если браузеры уже поддерживают проверку поддерживаемых фич (Я просто не в курсе как обстоят дела на этом фронте).

  • История “DeCSS хайку”.

    Now help me, Muse, for
    I wish to tell a piece of
    controversial math.

    Сет Шоен, DeCSS хайку

    История двенадцатилетней давности. 20 января 2000 года, судья Окружного суда Южного округа Нью-Йорка Льюис А. Каплан, рассматривая дело Universal City Studios et al. v. Reimerdes et al., выносит предварительный запрет на распространение ответчиком компьютерного кода для чтения зашифрованных DVD. Иск против ответчика был возбужден в соответствии с положениями Digital Millenium Copyright Act.

    Обосновывая свое решение, судья Каплан указал, что положения Первой поправки о защите свободы слова не распространяются на исполняемый исходный код. Это противоречило решению Девятого окружного апелляционного суда США по “криптографическому” делу Бернштейна, утверждающему, что исходный код является формой речи, защищаемой Первой поправкой. В своем решении суд даже процитировал код на Scheme из декларации профессора MIT Харольда Абельсона, поясняющей почему исходный код является эффективным и, иногда, предпочитаемым способом коммуникации между людьми. Позднее Шестой окружной апелляционный суд США вынес решение о том, что независимо от функциональной важности кода, его выразительная природа заслуживает защиты Первой поправки.

    Возникает вопрос. Если напрямую компилируемый и исполняемый код может быть ограничен в распространении согласно положениям DMCA, как утверждает судья Каплан, но текстовое описание того же алгоритма может распространяться свободно, то где именно проходит граница? Профессор Дэвид Турецкий из университета Карнеги-Меллон создал “галерею CSS дешифраторов” чтобы исследовать это противоречие и указать на абсурдность позиции судьи Каплан, что возможно юридически различить исходный код и другие формы письменной речи.

    В галерее профессора собраны всевозможные формы одного и того же алгоритма расшифровки DVD: обычный код на C; код в виде GIF картинки; код, напечатанный на футболке; код на новом языке программирования, для которого (пока) не существует компилятора; несколько музыкальных версий и, наконец, поема.

    Про последнюю, известную как “DeCSS хайку”, есть совершенно отдельная, стоящая прочтения, история. Но и сама поэма тоже ничего.

    Now help me, Muse, for
    I wish to tell a piece of
    controversial math,

    for which the lawyers
    of DVD CCA
    don’t forbear to sue:

    that they alone should
    know or have the right to teach
    these skills and these rules.

    (Now those six bytes, the
    DVD CCA says
    under penalty

    of perjury, are
    its trade secret, and you are
    breaking the law if

    you tell someone that,
    for instance, the Xing player
    used the following:

    (далее идут заветные числа. :-) )

    “Energy is just
    the same as matter, but for
    a little factor,

    speed of light by speed
    of light, and we are ourselves
    frozen energy.”

    Rejoice then, get some
    popcorn out, and butter if
    you aren’t vegan.

  • Автоматическая настройка яркости монитора.

    Прогресс не стоит на месте. В моем новом Lenovo X220 стоит новый тачпад без нижнего ряда кнопок и с чуствительной нижней гранью. В результате, я научился: а) выразительно шипеть, безуспешно пытаясь выделить кусок текста; б) держать руки подальше от тачпада. Мотивы (помимо денежных) hardware engineers, внедривших это новшество, остались неизвестны.

    Другая интересная особенность этого (да и, наверное, других моделей) ноутбука в том, что он умеет самостоятельно менять яркость экрана. Совершенно самостоятельно. Скажем, переключюсь я в редактор кода (серый фон) – яркость и контрастность экрана плавно уменьшаются. Переключась обратно в браузер (белый фон) – яркость и контрастность плавно возвращаются в норму.

    Поскольку я сам сижу на software стороне баррикад, то мотивы software engineers, которые написали этот чудный алгоритм, мне несколько более понятны. Ради меня старались, мерзавцы. Экономили заряд батареи, наверное. Не могу не заменить однако, что успехи в создании сколь-нибудь годного к использованию искуственного интеллекта, по-прежнему ожидаются не ранее, чем через двадцать лет. О чем, вышеназванные инженеры, тоже должны быть в курсе. Могли бы и догадаться, чем закончится эта затея.

    Короче говоря, я нашел где этот спецэффект отключается. В «Intel Control Center» выбирается «Intel HD Graphics»:

    Intel Control Center.

    В нем выбирается «Advanced Mode» (само собой):

    Advanced Mode \m/.

    Далее, во вкладке «Power» нужно снять галочки с «Automatic Display Brightness» и «Display Power Saving Technology». Сделать это нужно для всех источников питания.

    Automatic Display Brightness is evil.

  • Уведомления о смене состояния.

    А давайте разберем антипаттерн – реализацию механизма уведомления о смене состояния чего-либо с помощью очереди сообщений. Для примера возьмем Session Change Notifications в Windows. Пример, как очевидно, совершенно произвольный и не имеющий никакого отношения к тому, что я их сегодня полдня ковырял. :-)

    По идее, все просто. Хотим отслеживать состояние сессий – регистрируем окошко или обработчик, куда будут посылаться уведомления о смене состояния сессий и все дела. Если присмотреться, то все не так просто. Как, к примеру, синхронизировать получение начального состояния всех сессий и установку обработчика? Оба действия не атомарны и, следовательно, можно либо пропустить некоторые уведомления, либо получить уведомления, уже учтенные начальным состоянием сессий. Или другая проблема: состояние сессии, вычисленное по полученным уведомлениям может не соответствовать актуальному состоянию сессии. Т.е. получаем WTS_SESSION_LOGON, а сессия уже давно завершилась и даже соответствующее уведомление было послано, просто сообщение все еще сидит в очереди оконных сообщений необработанное. Именно с сессиями, такое вряд ли конечно может случиться на практике. Слишком они тяжеловесны. Но теоретически такое возможно. Хотя стресс тесты и не такое, бывает, находят.

    Возникает вопрос, а что же делать? Одно из возможных решений – разделить доставку уведомления о смене состояния и получение текущего состояния. Получение уведомления будет означать, что состояние, возможно, поменялось. Обработчик уведомления должен будет опросить текущее состояние и сравнить его с сохраненной копией. Опять же, в моем случае, все что мне нужно было отследить – это номер сессии, присоединенной в физической консоли. Для этого есть отдельная, и очень эффективная функция – WTSGetActiveConsoleSessionId(). Вот её полный листинг:

    0:000> uf kernel32!WTSGetActiveConsoleSessionId
    kernel32!WTSGetActiveConsoleSessionId:
    75133f49 a1d802fe7f      mov     eax,dword ptr [SharedUserData+0x2d8 (7ffe02d8)]
    75133f4e c3              ret

    :-)

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

  • Первые две недели.

    Мой первый день работы в Google случился всего две недели назад и пока у меня не получается внятно разложить свои впечатления по полочкам. Собственно говоря, толком поработать за эти две недели мне не пришлось. Первая неделя была полностью занята тренингами и прочими формальностями. Во время второй в Сиэтле случился Snopocalypse – выпало, наверное, целых два дюйма снега. А может и три. По такому случаю закрылись все школы, а большинство компаний распустили работников по домам, чтобы те со спокойной совестью могли поехать в горы кататься на лыжах по укрытым свежим снегом склонам. Поэтому буду делиться впечатлениями в порядке их прихода в голову. :-)

    Google-овский HR пытается называть себя People Operations, но, похоже, эта затея обречена на провал. Аббревиатура “HR” проще, понятней и гораздо более узнаваемая, чем непонятное, хотя и прикольно звучащее, “People Operations”. Более того, сами people operators постоянно сбиваются, то и дело называя себя HR. Как бы в отместку за это HR заваливает новых гуглеров (nooglers) кучей интранетных ссылок на важные и не очень страницы, документы и формы. К концу первого дня количество только важных ссылок (которые нужно обязательно посетить и прочитать) переваливает за два десятка, так что перспектива остаться без первого пейчека из-за какой-то незаполненной формы начинает казаться реальной.

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

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

    В Google культивируется открытость – внутри компании свободно доступна информация о многих вещах, которые были бы большим секретом в других местах. Скажем, сайт показывающий текущее состояние, связность и кучу другой актуальной информации о дата центрах компании доступен всем FTE работникам компании. Каждый вечер пятницы на всю компанию транслируется TGIF meeting, на котором Ларри и Сергеем рассказывают о том, как прошла неделя и отвечают на вопросы работников.

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

    Шрифты в Linux по-прежнему ужасны. Даже если поставить шрифты из Windows. И если раньше я мог думать, что проблема состоит в патентованных алгоритмах, отсутствии денег или серьезных дизайнеров, готовых работать pro bono, то теперь я начинаю подозревать, что дело совсем в другом – это никого серьезно не парит. Ну подумаешь, замыленный или “грязный” шрифт. Читается же. Точно также как и растягивание 4:3 картинки в 16:9 формат, вложенные скролл-бары на web страницах (ненавижу!) или видео в 360 линий по гигабитной сетке. Стива Джобса на них нет. Ноутбуки у большинства, кстати, – все сплошь маки.

    С Emacs, на удивление, можно жить. Особенно если поменять putty на mintty и ходить удаленно на Linux машину (шрифты!).

    Пока все.

  • Поиск работы за рубежом.

    Вопрос из почты (персональная информация удалена):

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

    У меня выдался относительно свободный вечер (да и вообще давать непрошенные советы – это мое хобби), а поэтому вот:

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

    1. Вы подходите лучше других кандидатов на ту или иную позицию;
    2. Затраты на ваш найм будут оправданы.

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

    В случае востребованных IT специальностей (пример востребованной специальности – разработчик, пример невостребованной – системный администратор) быть на голову остальных легко, по крайней мере в некоторых случаях. Во-первых, последний десяток другой лет регулярно (например прямо сейчас) случается ситуация, когда вменяемые локальные кандидаты просто исчезают с рынка. Расползаются по теплым местам, откуда выманить их стоит слишком дорого. Во-вторых, чтобы стать хорошим разработчиком нужно не так уж много: IQ в пределах нормы и легкую помешанность на программировании. Либо толика упорства, чтобы заниматься самообразованием. “Помешанным” в этом плане легче – им подобное самообразование в кайф. :-)

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

    Ну и язык нужно учить прямо сейчас. А лучше – еще вчера. Критерии знания языка простые. Понимаете фильмы без перевода? Можете без особой подкотовки объяснить чем вы занимаетесь на работе? Рассказать чем занимается ваша компания? Обсудить преимущества и недостатки вегитарианской кухни? Если нет – то “учите язык, пригодится”. Выехать, конечно, можно и с более примитивным языком, но ощущения будут хуже. Кроме того, учить язык все равно придется, а при “погружении в языковую среду” язык все равно (сюрприз!) учится зубрежкой.

    В принципе это все. Несколько конкретных идей что можно сделать.

    1. Будучи студентом легко поехать по Work and Travel. Так можно и страну посмотреть и язык потренировать. Пахать правда придется на совсем неинтересных работах (McDonalds, etc).
    2. Будучи студентом можно пробиться на стажировку в крупную компанию: Microsoft, Google, Intel, etc. Чтобы пройти отбор придется попахать в университете. Дело в том, что пост-советские студенты учаться как из под палки и в результате в резюме их похвалиться нечем. Западные студенты пашут как лошади. Не по своей воле, зачастую, но тем не менее. Резюме у них, соответственно, гораздо лучше. Иностранные кандидаты в любом случае конкурируют с лучшими. Т.е. хочешь – не хочешь, а приходится пахать.
    3. Для наработки резюме имеет смысл участвовать в open source проектах. Либо найти удаленную или локальную работу, что еще лучше – не только резюме растет, но еще и деньги платят.
    4. Как только формальные требования на визу соблюдены, можно начинать искать вакансии. Можно рассылать резюме на конкретные позиции. Можно – засылать в большие компании. Можно искать “body shops”. Главное в этом деле: не бросать поиски хотя бы первые десять лет. :-) И постояно самообразовываться: следить за измененниями в иммиграционных вопросах; улучшать резюме (в смысле переписывать, работая над правильной подачей своего опыта).
    5. Все это время – учить язык.
    6. GC lottery еще не отменили. Играйте каждый год.

    В результате этих действий что-нибудь на получится. Либо расхочется эмигрировать. Либо найдется вариант. Либо вы начнете свой бизнес и проблемы эмиграции уйдут сами собой. :-)

  • Вести с полей.

    Сегодня был мой последний день работы в Microsoft. Завтра мне еще будет нужно выполнить последние формальности, но рабочим днем завтра назвать язык не поворачивается. Доступа к почте и корпоративной сети у меня уже нет.

    В общей сложности я проработал в Microsoft больше семи лет. Начав самым базовым разработчиком (59-й уровень, на который нанимают толковых выпускников университета), дорос Senior SDE. Почти наверняка дорос бы и до Principal SDE, если бы остался ещё на пару лет. По крайней мере, карьерные перспективы были радужные.

    За эти семь лет я успел поработать в трёх разных подразделениях компании (Office, OSD и MSR); приложить руку к паре крупных проектов (Axapta и Windows) и нескольким мелким; сменить не меньше пяти разных офисов; пережить пару-тройку реорганизаций и одно сокращение штата. Кроме того, я дважды сменил место жительства, сначала переехав в Данию, а затем в США.

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

    В Microsoft я немного познакомился с «играми, в которые играют люди». Надо сказать, что писать гораздо код интереснее. Впрочем, не могу сказать подтвердить рассказы других людей про ужасы политических игр в Microsoft. Мне непосредственно ничего такого ужасного видеть не доводилось. То ли повезло, то ли менеджеры у меня были хорошие (кстати, хорошие менеджеры были, кроме шуток), то ли игры на самом деле не такие ужасные…

    В общем и целом – очень здорово вышло, что мне довелось работать в Microsoft.

    Теперь про причины перехода. Это сложно сформулировать, но у меня появилось ощущение некоторого застоя и потребности встряхнуться. В прошлом подобное настроение уже раз предвещало скорую смену работы. ;-) Небольшое исследование внутреннего рынка открытых вакансий принесло понимание, что смена команды, скорее всего, не поможет. Мне хотелось поменять не столько проект, сколько те неписанные правила, которым следуют окружающие меня люди. Иными словами – захотелось повариться в немного другом соку.

    Итого – с понедельника я начинаю работать в Google. Первую неделю – в Mountain View, CA. Потом – в десяти минутах езды от Microsoft Main Campus – в Kirkland-ом офисе Google. Мне предстоит изменить множество привычек и выучить много нового, но я уверен, что я от этого только выиграю.

  • Про то, как мы один тест запускали…

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

    Далее идет хронология с момента первого официального запуска стресс теста. (К этому моменту ручной прогон тестов в течение нескольких минут ничего не находит).

    30 ноября: FAILED. Ну никто и не ожидал, что все заработает с первого раза. Продолжаем отлаживать инфраструктуру: больше логов, настраивается сбор дампов со всех машин и т.д.

    4 декабря: FAILED. Тест запустился на 7 часов позднее положенного, так как машина решила поспать. После чего, тест отвалился по одному из таймаутов.

    5 декабря: FAILED. Останавливается передача данных в адаптере безо всяких на то причин. Ну что поделаешь, – железо новое, не до конца отлаженное. Добавляем watchdog в драйвер, который дергает reset на адаптере.

    6 декабря: FAILED. Драйвер не смог выделить память для DMA буферов. Начинаем выделять память несколькими кусками поменьше, а не одним большим.

    12 декабря: FAILED. Тест завалился из-за недавних правок тестового скрипта.

    13 декабря: FAILED. Нашли ошибку в одном из конечных автоматов. К этому времени завершалась работа над кардинальной переделкой этого куска кода, так что ошибку решили не исправлять.

    15 декабря: FAILED. В основную ветку вливаются изменения, которые, по идее, исправляют предыдущую проблему. Однако тест падает из-за другого, только что добавленного бага.

    15 декабря (вечер): SUCCEEDED. Ура!

    16 декабря: FAILED. Поломали билд.

    19 декабря: SUCCEEDED. Что, опять? Даже как-то странно.

    20 декабря: FAILED. Нашлась проблема в shutdown коде.

    Вот так и живем…

More Posts Next page »

This Blog

Syndication

Powered by Community Server (Personal Edition), by Telligent Systems