среда, 27 февраля 2013 г.

вторник, 26 февраля 2013 г.

Номера тикетов

Поражает, как хорошо наши тестировщики запоминают номера:
- Скажи, а тикет 78653 и дефект 96321 с друг другом связаны?
- Э... понятия не имею... как они называются?

У них в голове работа организавана как словарь с целочисленным ключом. А у нас, программистов, в голове бардак, и поиск возможен только по ключевым словам :)



пятница, 22 февраля 2013 г.

Never events

На собеседовании у Марины спросили: "Приведи пример какого-нибудь never event". Это выражение означает медицинскую ошибку, для которой нет оправдания, которую легко можно было предотвратить. "Да легко", - отвечает Марина. - "Вот, например, в Вашем госпитале недавно было целых шесть таких случаев. Например, когда ампутировали не ту ногу..."

Дело в том, что Марина как раз сейчас работает в организации, которая этот госпиталь проверяет. Но потенциальные работодатели об этом не знали, поскольку рекрутер по какой-то причине убрал из её резюме последнее место работы.

четверг, 21 февраля 2013 г.

На работу в Украину


Ходил в украинское посольство. Они начинают прием с 9:15 (кроме среды), предварительной записи нет. Чтобы пораньше попасть на работу, пришел на полчаса раньше, был первый в очереди. В 9 приехали двое сотрудников на БМВ. Сразу же запустили, чтобы не мерзли на улице лишние 15 минут. Документы принимал тот же самый лысоватый молодой человек, который там был полтора года назад. Разговаривал вежливо, и, как мне показалось, ни к кому не придирался.

Удивило, что целых пять человек (почти половина посетителей, которые мне встретились) пришли совсем не для того, чтобы вставать на учет, подавать на новый паспорт, регистрировать детей или оформлять доверенность. Нет, они пришли за рабочими визами! Два негра, китаец, поляк и ещё некто, похожий на англичанина. Задумчиво рассматривали они большой информационный стенд, где на английском было одно единственное объявление о том, что Украина подписала Гаагскую конвенцию.

Увидев, что я довольный отошел от окошечка, поляк стал распрашивать: "А это твоя первая украинская виза? А у меня вот такой-то бумажки не хватает - как думаешь, мне дадут?"

Больничные в ADP

В ADP (HR-система, которая у нас используется) есть самые разные виды отсутствия на работе, вроде "помощь полиции в расследовании" или "выполнение гражданского долга в суде присяжных". Но нет элементарного больничного (sick day)! Самое близкое по смыслу, что есть - это "посещение доктора". А если я не ходил к доктору, а просто болел?

А ведь это, наверное, самая популярная в мире онлайн-система такого типа... Перефразируя нашего дорогого президента Януковича, "тому що дешева" :) Есть и другие проблемы: работает только в Internet Explorer, причем надо предварительно проверить кучу настроек безопасности. После обновлений Windows их иногда надо проверять заново. И интерфейс не очень интуитивный: уже третий год ей пользуюсь (плюс ещё раньше пользовался в Штатах), и до сих пор не могу сразу сообразить, как подать заявление на отпуск.

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

Sainsbury's credit card

Дали мне кредитку, у которой первые 15 месяцев 0% APR on balance transfers. Правда, как обычно бывает, за перевод надо заплатить 3% комиссии, но всё равно условия хорошие: это получается приблизительно то же самое, как ссуда под 2.4% годовых.

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

Дошел до последней карточки:
- Сколько с неё переводить будете?
- До упора, пожалуйста! На сколько там у меня лимита хватает?

Агент мне сказал, я согласился. Дело в том, что, конечно, нельзя сделать перевод на всю сумму своего лимита: как минимум, надо, чтобы в этот лимит влезла ещё комиссия банка (3% в данном случае); плюс многие банки не разрешают использовать весь лимит для balance transfer (например, 10% должно остаться свободными).

Поскольку зарегистрироваться на сайте так и не получилось, и дозвониться в ИТ-поддержку я тоже не смог, credit card bill получил только по почте. Опаньки! Оказалось, агент обсчитался, перевел немного больше, чем можно было. Т.е. по его вине я  чуть-чуть превысил свой лимит. За это, во-первых, штраф 12 фунтов; но главное, что у меня таким образом случился дефолт, поэтому в качестве наказания нулевых процентов меня немедленно лишают.

Получается, какая-то тупая у них система, что дала агенту превысить лимит. Я сначала даже решил, что это специально такое кидалово. Но после трех часов (!) висения на телефоне всё же удалось достучаться до толькового сотрудника, который всё исправил. Вообще-то физически этой кредиткой от Sainsbury's занимается Halifax: и дизайн выписки похож, и телефонная система часто говорит про Halifax. Но что-то там напутали в этой системе, и она переключает тебя случайным образом куда попало. Т.е. я звоню, жму каждый раз одни и те же клавиши на телефоне, а попадаю в разные места. Ну, хорошо, что вопрос решился.

Королёк

Хотя в Лондоне огромный выбор овощей и фруктов, но вот "харьковская" хурма королёк мне тут пока не попадалась...

среда, 20 февраля 2013 г.

Метеоритофобия

После челябинского метеорита и астероида 2012 DA14 у некоторых развился космический страх. А для меня это давно пройденный этап :)

В детстве очень интересовался астрономией, в четыре года знал всё планеты Солнечной системы. Однажды увидел в энциклопедии фотографию Аризонского кратера, после этого некоторое время  боятся метеоритов.  Я-то не знал, что это кратер образовался аж 50 тысяч лет назад, а не месяц назад... Родители успокаивали, что Земля огромная, людей не так уж много, и шансы пострадать от метеорита ничтожные. Но я всё равно беспокоился: ничтожные-то ничтожные, но если шарахнет, то мало не покажется!

А ещё очень расстроился, когда узнал, что Солнце когда-нибудь взворвется и уничтожит все планеты. "Но это же будет только через миллиарды лет", - говорили родители. А всё равно было так жалко!

Поэтому про тепловую смерть Вселенной мне рассказали уже попозже, когда немного подрос и мог выдержать удар :)

Как швейцарские часы


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

Я каждый год рекомендую пару человек. В этот раз поднатужился и накатал аж шесть рекомендаций. Одна из них сорвала апплодисменты: "Having an on-site Product Manager does make a difference. Despite being French..." И тут раздается хохот. Поскольку кадровичку не дослушали и прервали на полуслове, получилось нечто вроде "здорово, что теперь прямо в нашем офисе есть Product Manager, хоть она и француженка" (а отношения у англичан и французов, как известно, вроде как дружеские, но всё же натянутые).

"Подождите, вы неправильно поняли! Там ещё есть запятая!" Полный текст звучал так: "Having an on-site Product Manager does make a difference. Despite being French, Antoinette reminds me a Swiss watch: she is accurate and diligent, and she follows up every question or issue raised, no matter how small or big it is".

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

Традиционно также награждали ответственных за противопожарную безопасность (Fire Wardens в Англии, Fire Marshalls в Штатах) и отвественных за оказание первой помощи (First Aiders). Последние есть только в английском офисе, здесь такое требование. Кадровичка пошутила, что в Америке каждый сам за себя, медицина платная. "Пока никому ещё никому не приходилось делать искуственное дыхание изо рта в рот... хотя я знаю, что Ирма давно мечтает попрактиковаться :)"

вторник, 19 февраля 2013 г.

Windows 7: постоянно блокируется аккаунт

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

Ну, сменил, я, значит, его в очередной раз, и начались неприятности: несколько раз в день мой аккаунт блокируется. Работать невозможно. Сисадмины говорят: "Сам виноват, где-то у тебя на компьютере крутится программа, которая используется старый пароль. Попытки залогиниться под старым паролем  расцениваются, как хакерская атака, и мы на всяких случай автоматически блокируем твой аккаунт на полчаса".

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

А может, на самом деле какой-то хакер регулярно пытатается подключится к моему компьютеру, используя старый пароль?

Сисадмины так задницу от стула и не оторвали, поэтому разобрался сам: с удивлением обнаружил, что в окне User Accounts мой аккаунт присутствует дважды. Оба с одинаковыми правами. Домен одинаковый. Не знаю, как это получилось. Я вообще в этих вопросах не силен... Если что-то с Active Directory, то почему проблема коснулась только меня?

Короче, удалил один из двух своих аккаунтов (наугад). Вроде теперь всё нормально...

Процедура медленно читается из SqlDataReader


Для тех, кому некогда читать, сразу перейду к сути: дело таки оказалось в хранимой процедуре, а не в C# коде...



Столкнулись с интересной проблемой. Как впоследствии оказалось, она была вызвана сразу несколькими неудачными совпадениями.

Есть сложный и важный для бизнеса Windows service, который ночью обрабатывает 50 миллионов записей из базы данных SQL Server. При этом результаты промежуточных вычислений сохраняются во временные таблицы. Не те, которые в TempDB, а обычные таблицы. Просто используются как временные.

Я этот процесс слегка поменял. И вот хранимая процедура, которая делает join временных таблиц, вдруг начинает бешенно тормозит. Причем это случается уже на боевом сервере, и откатываться назад поздно. Ну, хорошо - она возвращает около 300 тысяч записей, что немало... Но ведь тестировали много раз на реальных данных, в разных окружениях (Development, UAT, Stress). И всё летало, занимало секунды, а теперь часы.

Возможно, какие-то установки Production-сервера отличаются от тестовых?  Хотя стараемся, чтобы всё было похоже. Или из-за различий в объеме оперативной памяти планы запросов меняются?

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

"А включаешь - не работает". Запускаю свой сервис, который вызывает ту же процедуру - бешенные тормоза. Ну, тут, конечно, у всех появляется мысль, что этот как-то связано с C#-кодом. Надо заметить, мы практически не используем ORM - в основном всё делает через SqlDataReader, чтобы побыстрее. Поэтому сказать, что, например, Linq-to-SQL сгенерировал тупой запрос, нельзя. Да и какой тут запрос, если я просто вызываю процедуру?

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

Может, процедура возвращает поля с какими-нибудь устаревшими типами данных вроде text? И это как-то замедляет работу? Да нет, только обычные float, char, varchar...

Я чуть-чуть успокоился, когда выяснилось, что и до моих изменений на боевом сервере процесс занимал много часов. Т.е. проблема старая. Просто её никто не замечал. Ну, подумаешь, вычисления стали занимать полдня? Если за сутки всё успело посчитаться, то система вроде как работает нормально. Но сейчас, к сожалению, из-за изменений алгоритма нужно пересчитать данные задним числом, за целую неделю, а не за день, и на это просто не хватит времени...

Может, всё-таки запуск запроса из SQL Management Studio - это не то же самое, что запуск из Windows service? Какие-нибудь параметры соединения не такие, что ли? Тут DBA говорит: "Давай-ка я сам напишу простой C#-код, который вызывает процедуру и считывает все из SqlDataReader". Пишет. И у него всё летает! Тут начинаются шутки, что может его перевести из админов в разработчики, раз у него так здорово получается?

Мучительно сравниваю его код со своим. Да вроде никаких серьезных отличий...

Тут пришла идея хака: вместо того, чтобы вызывать процедуру, временно вставить в C# код непосредственно код SQL-запроса. Хотя DBA это не приветствует, но надо срочно что-то решать... Делаю - летает!

Итак, прокатило, непосредственная проблема решена. Но надо ж теперь разобраться, в чем была причина?

Во-первых, оказалось, что нашему DBA просто повезло. Его C#-код работал точно так же, как мой. Просто он его запустил непосредственно после того, от откомпилировал процедуру. На том и порешили: к определению процедуру добавили WITH RECOMPILE. Всё равно она запускается только несколько раз в день. Стала быстро работать каждый раз.

Но всё равно непонятно: что же заставляет SQL Server использовать неправильный план запроса? Неужели таки глюк в самом SQL Server (у нас 2008 R2)? Современные сервера баз данных очень-очень надежны, но всё же изредка бывает что-то такое? Была мысль, что надо процедуру грохнуть и создать заново. Или даже создать под другим именем. Может, где-то в недрах SQL Server напротив этой процедуры записан какой-то мусор?

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

Но процедура первый раз запускается с неправильными параметрами и ничего не возвращает. Мы об этой ошибке знаем, и вроде как ничего страшного в ней нет. Но оказалось, что именно вот этот первый запуск сбивает SQL Server с толку: он замечает, что ничего из временных таблиц не вытащить не удалось, и перестраивает план запроса в расчете на то, что так будет всегда. Если бы этот неправильный вызов был не первым, а вторым в списке после очистки временных таблиц, то всё было бы нормально...


Lessons learned:

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

То, что система сейчас "вроде как нормально работает", не всегда означает, что можно просто так внести в неё изменения. Может, она работает как раз на пределе возможностей.

Ну, и ещё раз убедился: если кажется, что нашел ошибку в SQL Server или Oracle, то на 99% это на самом деле "проблема в ручках".

среда, 13 февраля 2013 г.

Kostyantyn


С некоторым удивлением увидел, что моего одноклассника профайл в LinkedIn заведен под именем Kostya. Одно дело использовать уменьшительное имя или даже кличку где-нибудь в Facebook, но в LinkedIn обычно всё официально... А дело вот в чем:

Канадского паспорта пока ещё нет. А в украинском написано Kostyantyn (ну и, соответственно, во всех официальных местных документах).  Использую по жизни именно так. Забавно, но именно совершенно идиотское украинское написание имени позволяет полноценно использовать короткую форму, причем даже в полу-государственных службах это вполне прокатывает. Например, написал в адресе получателя посылки написал Kostya, а потом так сложилось что нужно было получать на почте с предьявлением ID. Пояснение, что это short name, вполне удовлетворило служащего :)

Не отдают анализы


Понадобилось взять у GP распечатку Марининых анализов. На самом деле мы и так видим результаты на сайте, но нужна была официальная копия для другого врача. Поехал я, а мне не отдают: "Ты кто такой? Давай, до свиданья!" Предлагал показать свои водительские права, чтобы убедились: я - муж. А они говорят, мало ли тут всяких мужей ходит, мы конфиденциальную информацию отдаем только пациенту.

- А если я привезу её документы?
- Нет, не положено. Пусть сама приезжает.
- Да ей самой ехать неудобно - работает в центре, допоздна...
- Ну, тогда пусть напишет врачу письмо.
- Письмо? А можно, я принесу письмо, чтобы время не тратить на почту?
- Да, конечно, можно.

Это, кстати, частая ситуация в Англии. Водительские права, паспорт, нотариально заверенные копии документов - всё это нередко не впечатляет чиновников. А вот обыкновенное письмо с непонятной закорючкой - совсем другое дело!

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


P.S. Ещё по поводу доверия к подписи. Была недавно ситуация, когда обнаружилась мелкая ошибка на уже подписанном документе. Начальник, которой подписал, на работе не появится в течение нескольких дней, а документ было очень желательно отправить прямо сейчас. Ошибка чисто техническая, смысла документа совершенно не менят, но если кто-то заметит и докопается, то будет нехорошо. Обсуждаю ситуацию с человеком, который живет в Харькове:

- Ну, так какие сложности? Там ведь даже нет печати, только подпись чёрной ручкой? Отсканировать, подправить и послать по факсу "подделанный" документ - раз плюнуть. Даже цветной принтер не нужен...
- Да, конечно... но понимаете... я давно здесь живу, и "печать" у меня уже в голове! Теперь я думаю в первую очередь не о том, можно ли подделать, а о том, что будет, если случайно обман вскроется...

понедельник, 11 февраля 2013 г.

Кошачьи мечты

У людей во сне часто сбываются мечты. А о чем во сне мечтают коты? Думаю, им часто снится, как они сладко спят, и видят сны о том, как сладко спят. Рекурсия.

Русский магазин на Waterloo

Раз в пару месяцев заходим в "русский" (прибалтийский) магазин на Waterloo. Не чаще, потому что ностальгия по родным продуктам давно уже не мучает. Мы как-то больше подсели на китайскую еду. Да и качество иногда бывает неважное. Надо внимательно смотреть на срок годности - нередко он уже почти подошел, а иногда даже и прошел. Раз вот взяли большой мешок пельменей, сварили немного, да так все и выкинули - слишком уж мерзко пахло. Чтоб вкус Родины не забывали :) В последний раз меня немного насмешила каша "Британика": британский флаг, какие-то надписи про английское качество... на русском. Т.е. эммигрант, измученный ностальгией, идет покупать "русский" продукт, который претендует на британское происхождение. Циклическая связь... Новый продавец. Заговорил с нами по-лавтвийски. Думали, что латвиец. А он из Афганистана, оказывается. Приехал в Лондон почти 20 лет назад. Хорошо говорит по-русски. С восторгом вспоминает про советское время: "СССР нас поил-кормил, мы только лежали и отдыхали". Интересно. Подозреваю, что не все афганцы такого же хорошего мнения про СССР. Раз познакомился в этом магазине с семейной парой из Узбекистана: - Сколько ты тут? - Пять лет. А вы сколько? - Да мы только сегодня приехали. Меня это расмешило тогда: только приехали, и тут же побежали в русский магазин? Даже дня не могут протянуть без любимой сгущенки или гречки? Говорят, что нет, просто случайно проходили мимо.

Top 5% on LinkedIn


LinkedIn мне пишет: "Congratulations! You have one of the top 5% most viewed LinkedIn profiles for 2012." Не ожидал, что стольким людям интересна моя скромная персона. Общественной жизнью там совсем не живу - не участвую ни в каких онлайн-тусовках. Работу последний раз искал уже два года назад. Профайл не обновлял давным-давно. Ни про одну английскую работу никаких подробностей в моем профайле не написано, чтобы не обвинили случайно в разглашении военной тайны. Только название фирмы, должность и время работы.

Тем не менее люди чего-то там читают, оказывает. Может, дело в том, что у меня относительно много "друзей" (больше 250). Старший Рекрутер смотрит на тебя ©

четверг, 7 февраля 2013 г.

Чужие письма

Предыдущие жильцы съехали из нашего дома ещё в июле, т.е. семь месяцев назад. Но по-прежнему довольно приходят письма, адресованные им. Это типичная ошибка. Люди думают: "Что тут такого... быстренько сообщу в банк, на работу, в коммунальные службы, и всё..."

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

Так что не жалею о 50 фунтах, заплаченных за услугу переадресации почты. А вот у наши предшественников 50 фунтов не нашлось, поэтому письма из таких серьезных организаций, как налоговая или суд, попадают к нам. Жалко мне этих жлобов, поэтому время от времени я им письма отношу. Они купили дом недалеко от нас. Ну, недалеко, но в то же время и не по пути на работу, поэтому я туда хожу не чаще раза в месяц. Плюс ещё у них дурацкий почтовый ящик - каждое письмо надо складывать вдвое и проталкивать.

И ведь не студенты уже, блин. Семья с двумя детьми, англичане. Дом они купили за 275 тысяч - видимо, поэтому полтинника на переадресацию почты уже не осталось :)


Вспомнилась история из детства немного на другую тему. Пошли с отцом к какой-то подруге родителей. Они поговорили о чем-то (я был совсем маленький, поэтому ничего не понял), и она отдала отцу письмо. Он принес письмо домой, положил на стол. Читать я то ли ещё не умел, то ли умел, но плохо. Решил, что письмо адресовано маме. Гордо его распечатал и отдал: "Мама, это тебе". Мама начинает читать, и тут её лицо округляется: письмо-то было не для неё. Насколько я понимаю, друзья родителей развелись, и им надо было передать личное письмо. Ну, или что-то в таком роде. Телефоны тогда ещё мало у кого были... ну, или может в письменном виде было проще...

А почему же я подумал, что письмо для мамы? Потому что мама, оказывается, должна была его вручить адресату. Я просто в разговорое услышал её имя - вот и решил, что для неё. И родители мучались, думали, что же делать. Ведь выглядит всё так, как будто это они решили почитать чужое письмо. Заклеить конверт? Но я его очень неаккуратно распечатал. В конце концов решили, что адресат поверит в нелепую историю про глупого сына.

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

среда, 6 февраля 2013 г.

"Работа нужна?"

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

Нет. В письме лишь одна строчка: "Need a job?" И телефон. Всё.

Ratings by outbrain