суббота, 5 июня 2010 г.

[life.rest] Поучаствовал в корпоративном дне здоровья

Последние три года в Гомельском офисе нашей компании существует традиция – устраивать корпоративные дни здоровья с выездом на природу. Я участвовал в прошлом году, с удовольствием поехал и в этом.

Рассказ о дне здоровья следует начать с определения дня его проведения. В этот раз выбирали из трех дат: 4-е, 11-е и 18-е июня. Больше всего желающих было за 4-е и 18-е. Но четверо из тех, кто хотел попасть 4-го, категорически не хотели 18-е. А четверо других, которые хотели отдыхать 18-го, очень не хотели делать это 4-го. Чтобы разрешить между ними спор был выбран очень оригинальный вид жребия – командная игра в дартс :) Игра оказалась напряженной, очень интригующей и в упорной борьбе команда 4-го июня вырвала себе победу.

Итак, утром 4-го народ собрался, дружненько перебазировал стратегические запасы:

на крыльцо института, в котором мы арендуем помещения:

Потом немного подождали заказанных автобусов

загрузились и поехали

Приехали на живописный берег

Полчасика поплутали по запутанным лесным дорогам, но в конце-концов нашли удобное место. Ну и понеслось – купание, конкурсы, волейбол, пиво-водка-вино-коньяк, шашлык-машлык…

Отдельное спасибо нужно сказать нашим ребятам, которые организовали инициативную группу и озадачились придумыванием конкурсов. Все-таки больше 50 человек, слоняющихся по берегу без дела – это черевато :)

Не смотря на то, что я отнекивался, меня все-таки попытались затянуть в конкурс, в котором две команды носились по лесу с GPS-навигаторами в поисках разбросанных организаторами “кладов”. На первых же 100 метрах пробежки в арьергарде нашей команды я понял, что игры в Зарницу для моего возраста уже противопоказаны :( Плюс к тому, я вывихнул ногу. В общем, нежелание бегать по лесу и некие настойчивые требования моего организма вынудили меня покинуть общую группу и совершить прогулку вдоль слегка заболоченного берега реки.

Эта прогулка еще раз подтвердила жизненную мудрость: “Идя на фотоохоту забудь пригласить друзей” :) Кроме меня на том берегу не было ни одной живой души. Компанию мне составляли только полчища комаров и мошек :) Зато там было очень интересно и, местами, красиво:

Вернувшись в лагерь я вдруг понял, что очень устал. Пофотографировал еще немного

а потом с первой же подвернувшейся оказией вернулся домой. Жалко, что не смог остаться на природе до вечера. Но, видимо, вчера мне нужен был не активный отдых с походами за дровами и пробежками с GPS-ом. А шезлонг где-нибудь в теньке, и несколько часов полудремы с бутылочкой сухого белого в обнимку… Ну ничего, буду более внимательно прислушиваться к своему организму в будущем :)

На дне здоровья много снимал. Только домой привез 258 снимков и еще с пару десятков удалил на месте. Мой новый Fujifilm Finepix S1500 полностью себя оправдал. Не зря я накануне еще раз перечитал руководство пользователя и отключил несколько тормознутостей, которые меня сильно раздражали. Заодно удалось понять, что я хочу от хорошего зеркального фотоаппарата – обязательно ручной зум, быстрый автофокус, наличие ручного фокуса, скорость съемки не менее 3-4 кадров в секунду. Временами с ностальгией вспоминал свой пленочный Nikon F65 (особенно когда не смог щелкнуть маленькую зеленую ящерицу, притаившуюся рядом с моей сумкой). Но на пленку все равно не вернусь, т.к. не могу себе представить, как на пленку отснять порядка 300 снимков за день, из которых 9/10 можно прямиком отправлять в корзину.

Еще одно впечатление связано с автомобилями. Никогда не хотел иметь автомобиль. У меня отец три года в армии прослужил шофером, из-за этого он очень сильно не любил автомобили и эта нелюбовь по наследству досталась и мне. Точнее говоря, не нелюбовь, а полное безразличие. Но вот в последние несколько лет возникают ситуации, когда жалеешь, что автомобилистом не являешься. Первая ситуация – поездки по строительным рынкам и магазинам на общественном транспорте, когда приходится делать ремонт в квартире. Ну а вторая ситуация – вот такие выезды на природу. Соблазн, блин, возникает… ;)

А все-таки хорошо в теплый летний день на берегу реки. Отличные впечатления. Испытать которые, собственно, всем своим читателям и желаю! :)))

четверг, 3 июня 2010 г.

[prog] Презентация The Anatomy of Message Passing

В мае на очередном заседании Northwest C++ User Group Бартош Милевски (Bartosz Milewski) выступил с докладом The Anatomy of Message Passing (по этой ссылке доступно видео доклада и PDF-ка со слайдами и комментариями к ним).

В своей презентации Бартош рассказывает о маленькой C++ библиотеке для реализации обмена сообщениями. Основные идеи для которой он взял из Haskell-евских MVar (для далеких от Haskell-я есть хорошее описание MVar-ов от Бартоша) и из диссертации J.H.Reppy “Higher-order Concurrency”.

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

среда, 2 июня 2010 г.

[life.wow] Нехилый провальчик

В минувшие выходные в результате тропического урагана Агата в Гватемале образовался большой карстовый провал:

Диаметр – приблизительно 18 метров, глубина – около 100 метров. Внушаить! (дополнительные снимки можно посмотреть здесь)

Это не первый подобный провал в Гватемале. Аналогичный катаклизм произошел 23-го февраля 2007:

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

Договорился этот знакомый с хозяевами какого-то домишки о ремонте. Взял он у друга грузовик, загрузился песком, цементом и прочими стройматериалами и заехал во двор дома. Задним ходом.

Только заехал, как асфальт под машиной проломился и машина рухнула в небольшую вертикальную пещеру. Глубиной метров 10. Кузовом вниз, к счастью:

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

Говорят, под Неаполем полно карстовых пустот. И вот такие провалы там регулярно образуются. Хотя до размеров Гватемальских им еще далеко.

вторник, 1 июня 2010 г.

[work; prog] Так вот о тестовом задании для C++ников

Расскажу подробнее о тестовом задании (условие было опубликовано ранее), которое я давал кандидатам на должность C++ программиста.

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

Изначально задача возникла при необходимость обновить лицензионную информацию в небольшой библиотечке. Я прикинул, как её решить, оказалось, что проще 10 файлов вручную обработать, чем писать программу. Но тогда я вел что-то вроде факультатива по программированию и мне требовалось какое-то более-менее реальное упражнение для студентов. Я дал эту задачу им в качестве домашнего задания. К своему удивлению, я обнаружил, что с ходу ее никто не решил. Стал интересоваться почему и тут-то стало понятно, насколько данная задача удобна в качестве теста.

Ловушка первая, она же главная. Условие задачи не гарантирует того, что лицензионная информация всегда находится в начале файла. Да, пример приведен именно такой. Но условие этого не гарантирует.

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

Поскольку лицензия может находится в любом месте файла, а весь файл не должен загружаться в память целиком, то сразу же вырисовывается чуть ли не единственный способ ее решения: принцип “скользящего окна”. Т.е. из файла считывается N строк, которые и сравниваются с текстом лицензии. Если не совпадают, то одна первая прочитанная строка выбрасывается, а еще одна считывается, и производится новое сравнение. Ничего сложного, имхо.

Еще один большой и жирный плюс можно заработать, если при несовпадении прочитанного из файла фрагмента выбрасывать не одну строку, а несколько. Здесь же принцип точно такой же, как и при поиске подстроки в строке – можно применять и метод Кнута-Морриса-Пратта, например.

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

Ловушка вторая, тест на максимализм и способность расставлять акценты. Это разбор аргументов командной строки и response-файла. Поскольку реализация response-файла объявлена бонусом, то самоуверенные разработчики сразу же берутся за нее. Изобретая при этом свой собственный маленький велосипед для универсального разбора аргументов (чтобы аргументы командной строки и содержимое response-файла обрабатывались единообразно).

А вот делать этого не следует. Сроки на решение небольшие (для последних вакансий я давал по два дня), если знаний и опыта не хватает, то такую библиотеку сделать не успеешь. Нужно рассчитывать силы и расставлять акценты. Главное что? Работа с лицензией. Вот она и должна быть сделана на пять баллов. И только после этого можно браться за response-файлы. Если получилось – отлично, если нет – ничего страшного, предъявляется минимальный вариант, который, тем не менее, полностью решает исходную задачу.

Как показывает практика, далеко не все могут расставить акценты именно так. Даже были случаи, когда кандидат успевал сделать response-файлы, но не успевал реализовать работу с лицензиями.

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

В принципе, в response-файлах так же есть маленькая ловушка. Хотя она ни разу не срабатывала (т.к. толком response-файлы никто и не сделал), но она есть: в именах файлов могут быть пробелы. И такие имена в response-файлах нужно задавать в кавычках. А раз так, то нельзя читать response-файл, например, с помощью штатного operator>>(istream&,string&) – будет идти разбиение по пробельным символам.

Ловушка третья, она же маленькая заноза в заднице. Это требование к учету различных концов строк (DOS-овский, Unix-овый и Mac-овый). Это самая настоящая мелочь. Но она определяет, каким образом в памяти должен храниться текст лицензии. И как нужно представлять в памяти фрагмент файла для сравнения.

Поскольку концы строк нужно отрезать при сравнении лицензии, сразу же отпадает возможность искать совпадение с помощью std::string::operator== или memcmp. Строки нужно хранить отдельно, концы строк – отдельно.

Мне казалось, что здесь нет ничего сложного. Ну нужно было сделать структуру, в которой был бы список строк и использованный в них маркер конца строки или же список объектов, в каждом из которых хранится строка и ее маркер. И всех делов. Так ведь нет! Каких только странных комбайнов я не насмотрелся :)

Ловушка четвертая, тестирование. Только считанные единицы соискателей вместе с решением присылают тестовые файлы на которых они проверяли свое решение. Не удивительно, что они не проходили даже поверхностной проверки (например, далеко не все решения могли выполнить цепочку из insert-change-delete). Во время последнего поиска людей первым, кого я взял, был программист, который прислал далеко не самое лучшее решение. Но вместе с решением шел набор тестовых файлов и батник, запустив который можно было эти тесты прогнать. И я взял его, даже не смотря на то, что опыта работы и знаний у него было намного меньше, чем у всех остальных претендентов. Зато задатки правильные :)


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

  • дублирование кода и большие функции (по 100 и более строк);
  • хардкодинг. Суровый и повсеместный. Ладно когда имена аргументов командной строки задаются прямо в strcmp. Так ведь они затем используются для определения режима работы программы, при выдаче сообщений об ошибках и т.д.;
  • слабое знание STL. За счет использования std::ifstream, std::vector, std::string решение данной задачи не представляет сложности. Но если вместо них брать старые-добрые FILE*, самодельные списки с ручным управлением памятью, буфера для строк фиксированного размера и прочие plain-C прелести, то и решения получаются большие, сложные и ненадежные;
  • отсутствие контроля за успешностью операций ввода-вывода. Доходило даже до того, что люди открывали файл и даже не проверяли, открылся ли он;
  • отсутствие устоявшегося стиля кодирования. Хотя это объясняется тем, что многие имели опыт не более 1-2 лет работы. Но даже и опытные разработчики не могли объяснить, почему в одном месте они обозвали переменную в camelCase, а в другом – в lower_case.

Такие дела. Хорошая была задача. Теперь буду придумывать что-нибудь новое :)

Напоследок хочу предупредить тех, кто захочет попробовать практику тестовых задач. На анализ решений вам потребуется время. Иногда много. На некоторые решения у меня уходило часа по три, если не больше. Бывает так, что смотришь в код, чувствуешь, что здесь что-то не так. А точную причину беспокойства понять не можешь. Приходится вникать, писать собственные тесты, гонять программу в разных режимах. Для того, чтобы потом обстоятельно, с уликами на руках, объяснить кандидату что почем ;) Так что не самый легкий это путь отсева претендентов.

понедельник, 31 мая 2010 г.

[prog] Scala в LinkedIn

Презентация об использовании Scala в LinkedIn: Scala at LinkedIn: Distributed Computing with Norbert (там видео и PDF-ка со слайдами).

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

Так что определить, серьезно ли используется Scala в LinkedIn (точнее, в его подразделении Search, Network, and Analytics) или же это так, из разряда “попробовали – получилось”, я не могу. Но интересующимся языком Scala, думаю, будет любопытно. Тем более, что исходники Norbert-а открыты под Apache-вской лицензии.

Кстати, интересная статистическая информация об LinkedIn:
- в графе социальной сети LinkedIn более 65 миллионов узлов, более 680 миллионов ребер;
- к этому графу происходит более 250 миллионов обращений в день;
- поиск людей на LinkedIn обрабатывает порядка 15 миллионов запросов, с пиковой нагрузкой в 250 запросов в секунду.

[work] Ищу технического писателя в свою команду (в Гомеле)

Формальные требования:

Обязанности

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

Занятость

Полный рабочий день. В Гомеле (Республика Беларусь). Совместительство возможно, но для этого следует доказать свой очень высокий профессиональный уровень.

Требования

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

Дополнительные плюсы:
* знакомство с LaTeX;
* свободное чтение технической документаци на английском.

Размер оплаты

Устанавливается по результатам испытательного срока. От 300у.е. и выше, в зависимости от способностей, ответственности и самостоятельности.

Испытательный срок

Обязательный испытательный срок до одного месяца. Размер оплаты на время испытательного срока определяется по результатам собеседования.

Ну а теперь пояснения.

[life] Пятнадцать лет выпуска

В минувшую субботу состоялась встреча выпускников математического факультета Гомельского Государственного Университета им.Ф.Скорины (специальности “ПО ВТ и АС”, код 22.04) образца 1995 года. Очень полезное мероприятие, с сильным ностальгическим оттенком.

У нас вообще традиция – собираться каждые пять лет. Сначала через пять лет после выпуска, потом через десять. Сейчас вот через пятнадцать. Когда встречались на пятилетие выпуска, было не очень интересно. Мало времени прошло, я еще четыре года в университете отработал вместе с несколькими сокурсниками. Так что был более-менее наслышан о том кто, где и как.

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

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

К счастью, все более-менее пристроены. Девчата замужем, говорят, удачно. Ребята, которые не разгильдяи вроде меня, или собственным бизнесом владеют, или руководят. В общем, пистон, который нам вставили на первом-втором курсе преподаватели старой советской школы, не прошел даром – кто смог закончить универ, тот не потерялся :)

За прошедшие с последней встречи пять лет еще несколько человек уехали из Гомеля. Еще несколько человек собираются уехать. Заставляет задуматься…

Много в этот раз говорили о семьях, о детях. У четверых из присутствовавших по трое детей, у многих по двое. Вызывает уважение. Кто-то уже занят строительством дома, кто-то квартир для детей. У кого-то детям по 15, по 14 лет. У кого-то – старшей дочке 17 (семнадцать!). Охуе Афигеть…

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

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

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

воскресенье, 30 мая 2010 г.

[life.cinema] Очередной кинообзор

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

Девять королев. Отличный фильм про мошенников. Хотя не могу избавиться от мысли, что несколько лет назад я смотрел его голливудский ремейк.

Прячься! Мне понравилось. Хорошие актеры, нормальный сюжет. Местами было "немного предсказуемо", но финал стал для меня неожиданным. На мой взгляд -- это хороший и качественный отечественный фильм.

Порок. Суровый фильм, довольно неожиданный финал. Мне понравилось, хотя по началу скучновато.

Шелк. Весьма неплохой тайваньский ужастик.

Глухарь в кино. Нормально сделанный российский фильм на один просмотр.

Шепот дороги ужасов. Оказалось на удивление не плохо. Местами, правда, авторы сделали несколько совсем уж невероятных ляпов (вроде вытаскивания гвоздей пробитыми руками). Но общее впечатление они не портят.

Пипец. Качественно сделанная пародия-сказочка для 14-15-летнего возраста.

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

Защитнег. Криминальная драма про недоразвитого переростка, который вообразил себя супергероем и отправился воевать с наркоторговцами. Мне не понравилось. В происходящее не веришь ни на секунду. Хотя Вуди Харельсон играет хорошо.

Серьезный человек. Да, не каждый фильм братьев Коэнов я в состоянии понять. Вот этот не понял. Как по мне, мудотень страшная. Хотя может это потому, что я гой ;)

[life.photo] Голландия на фотографиях Артура Гассанова

Сегодня в рубрике “Знакомство с фотомастером” снимки Артура Гассанова.

Голландские  сувениры.

Schermerland  Noord-Holland.

Золотая  Голландия.

Голландское  утро.

Роттердамская  арфа.

Gouda.

Rotterdam.

Ладога  и  её  берега.

Летучий  Голландец.

Голландские  сказки.

Люблю  я  голландское  утро.

Утро.

Вечерний  Schiedam.

Старая  мельница.

Winter  in  Holland.

Зимнее очарование .

Крик,  одиночества.

Золотая  зима.

Фонарь,  дерево  и  оранжевая  крыша

Страна  на  воде

Sea - light   stories

Домик  у  канала

Если вам понравились работы Артура, то очень рекомендую заглянуть на photosight или photoline. Там много его отличных фотографий, особенно снимков мельниц.