27 марта 2010 г.

Holey Dollar

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

Начну с интересного факта. Кто-нибудь пытался найти (и прочитать!) информацию о Macquarie Group? Коля не в счет, он уже все прочитал, я уверен. Так вот, все ли помнят какой у нее логотип? Вот, напоминаю:


Почему на улице темно? Снимок был сделан в полдевятого вечера. Вот так я тут работаю, ага. Эта штука находится прямо перед проходной, с улицы видно обратную сторону этого щита. Ни у кого не возникло вопроса что этот логотип такое изображает? А это есть дырявый доллар (holey dollar). В 1813 году губернатор Нового Южного Уэльса Лехлен Маккуари (Lachlan Macquarie), который также известен тем, что предложил назвать континент Австралией, столкнулся с проблемой нехватки монет в обороте. При нем Новый Южный Уэльс стал развиваться экономически, благосостояние росло и монет на всех стало не хватать. И тогда губернатор решил  эту проблему гениально и просто: закупил серебряные монеты у Испании и из каждой монеты сделал две путем выдавливания центральной части. Получалась одна монета с дыркой, стоимостью 5 шиллингов и маленькая монетка, оценивающаяся в 1 шиллинг 6 пенсов. Стоимость обоих монет получалась больше, чем той монеты, из которой они были сделаны. И их невозможно было использовать за пределами Австралии. Одни плюсы. Вот за такой способ решения непростых задач этот доллар и был выбран символом Macquarie Group.



Переходим от истории к суровым будням работы в этой организации.

Ну что же, все идет, вроде бы, как и должно идти. Трудности есть, их немало, я скажу о них ниже. Одна из главных новостей для меня - пятинедельное отсутствие Даррена. Он неделю назад умотал в свою Южную Африку гулять свою же свадьбу. Оказывается, он из ЮАР. В четверг мы всей командой спустились в атриум GPO (General Post Office, то здание, фасад которого выходит на Martin Place, бывшее главное почтовое управление). Там находится множество кафе, ресторанов и всего такого. Просто заказали кто что, посидели вместе. Это Дермот так предложил проводить Даррена. Вы не думайте, на Западе люди не такие злые и глупые как их у нас изображают.

В пятницу на прощание Даррену я выпустил первую версию своего сервиса. Где-то в среду во время одной из бесед я сказал, что могу буквально за день сделать первую ограниченную версию. Он попросил сделать. Я теперь уже не знаю зачем, ее так пока никто и не использовал, а я продолжаю ее дорабатывать. Вся прошлая неделя ушла на войну с Hibernate и вычитывание документации на него. Раньше 7 вечера с работы не уходил. Это еще не СМН, но довольно близко. На выходных сплю часов до 10-11. Выматывает такой график весьма мощно. А я что хотел? Работы? Java EE? Hibernate? На, получи, распишись.

Помимо Hibernate была еще проблема: синтаксический разбор сохраненных в базе данных условий для запросов. Сами (SQL) запросы генерировались программой, код которой у меня был. Но мне же выпендриться надо, я буду генерировать HQL вместо SQL. Значит пришлось часть кода от той программы отодрать с мясом, сильно измордовать и впихнуть в свой сервис. Как делался там синтаксический разбор? Regular expressions, разумеется. Вот, что я нашел там:

// Commented for the regex rookies ;)
Pattern DATE_RANGE_REGEX = Pattern.compile(
     "^\\s*?[\\[({]?\\s*?" +  // optional space and/or brackets
     "(\\S.+?)" +             // start date
     "\\s*?(?:-|~|to)\\s*?" + // either "-", "~" or "to" with optional spacing
     "(\\S.+?)" +             // end date
     "\\s*?[\\])}]?\\s*?$"    // optional space and/or brackets
     , Pattern.CASE_INSENSITIVE);

Гонконгские разработчики оказались с юмором. Руки бы лучше росли у них из другого места. И документировали свои системы по-человечески. Вы думаете, вы понимаете в журнилировании? Ничего вы не понимаете. Вот как надо:

try {

    LOG.severe("Rolling back transaction...");
    aConnection.rollback();
    LOG.severe("Transaction rolled back OK");
}
catch (Exception re) {

    LOG.log(Level.SEVERE, "Error rolling back transaction!",re);
}

try {

    LOG.severe("Releasing connection...");
    release(aConnection);
    LOG.severe("Connection released OK");
} catch (Exception re) {

    LOG.log(Level.SEVERE, "Error releasing connection!", re);
}

ex.printStackTrace();

Вот так-то. Обратите внимание на уровень записей - везде Severe.

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

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

Pattern RANGE_DATE_PATTERN =
Pattern.compile("[dD]ate\\(.*?([Tt]oday\\(.*?\\)|[Tt]oday|[Cc]alcdate|[Cc]alcdate\\(.*?\\))+?.*?\\)");

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

По долгу службы пришлось поковыряться в структуре базы данных Sal Oppenheim. Эту компанию недавно купила Macquarie, я, вроде, уже писал. Сама эта компания расположена в Германии. Вообще, в Европе сейчас происходят самые интересные дела у Macquarie. Вот и база данных оказалась с немецким акцентом. Мне нужно было понять где там какие значения придется искать. Вот комментарий к одной из таблиц: "Mapping fuer udl_id zu Spaltennummer". А одно из полей было названо так: WKN. Майкл сказал, что не знает что это значит. А значило это "Wertpapierkennummer". Сказал Майклу, посмеялись. Вообще, когда приходится тяжело работать юмор начинает сам выходить наружу. Самый пик - это когда нарываешься на неразрешимую проблему, а тебе смешно. Бывало такое.

В среду произошел прикол. Я на обеде решил смотаться в агентство, заплатить за жилье, а то срок подходит. Вышел на Park Street, поймал такси, доехал, заплатил, поймал еще одно такси и приехал обратно. Тут надо отметить, что вход в здание Macquarie расположен рядом со входом в отель Westin. А еще там же, в том же здании находится ASIC (Australian Securities and Investments Commission) с целью, так сказать, осуществления давления. Но речь скорее об отеле. Парадный вход там устроен как положено, с ковровой дорожкой и швейцаром. А рядом со входом в Macquarie все время стоят всякие недешевые машины. В тот день стояла какая-то Ferrari (не знаю точно какая, я в Ferrari не разбираюсь особо) и Rolls Royce Phantom. Я водителя попросил остановиться где нибудь неподалеку, но он сказал, что может и прямо к двери подъехать. И подъехал. Только я с ним расплатился, как дверь машины открыл швейцар и поздоровался. Я вышел. Швейцар спросил нет ли у меня багажа. Да нет, я на работу приехал, вообще-то. Sorry. Вот с таким пафосом получилось. Надо было лимузин брать, ей-богу, а то там Roll Royce, а я на такси.

Несколько выходных подряд я пытался найти в продаже обогреватель. В 30-градусную жару. Во дурак, а. В прошлые выходные я его не нашел, зато нашел джойстик. Часа 2 гонял А340 над Сиднеем. А обогреватель нашел позже, в том же Woolworth. Но там я уже и так загружен был, что-то еще взять никак бы не получилось, поэтому перенес покупку на следующие выходные. То есть на сегодня-завтра. Однако в пятницу получил вот такое вот письмо:


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

В пятницу же в 4 часа нас (в расширенном составе, вместе с другими командами) собрал Кэмерон в одном из конференц-залов. Некоторые пришли с пивом. Пятница же. Да и пиво бесплатное. Также пришли 2 немца из Sal Oppenheim. Подключились ребята из Гонконга. Кэмерон показывал презентацию, где объяснял к чему же мы, собственно, идем. У каждого из нас есть свой относительно небольшой проект. Здесь же он показал всю картину того, что мы хотим получить. А хотим мы SOA. Программисты поймут. Домечтался я, однако. Давно хотел с SOA поработать. Это интересно и перспективно. Вот и получил. Сам не понимаю как так получилось попасть именно в ту сферу в которую хотел. Там работы на годы хватит. Такой вот итог презентации. Там же я впервые услышал благодарность от руководства за напряженную работу. Кэмерон же все видит, сам поздно уходит с работы. С одной стороны это всего лишь слова, а с другой - в России их никто не говорил.

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

С утра на Martin place наблюдается сильное движение: армия офисных работников в светлых рубашках и черных брюках идет на работу. Кто-то пьет кофе на ходу, кто-то ест гамбургер, кто-то уже решает какие-то вопросы по телефону. Цветочные киоски выставляют букеты, которые распространяют свои запахи. Город начинает просыпаться. На фоне этой суеты стоит одинокий велосипедист и играет на кларнете. Каждое утро над Martin Place разносятся протяжные звуки, призывающие тысячи людей на работу. На GPO бьют часы в башне. Но я это слышу уже сидя за рабочим местом. Martin Place - это очень атмосферное место, здесь надо побывать.

Возвращаюсь я домой уже затемно. Выхожу на Martin place. Воздух теплый, каким он бывает во всех южных приморских городах. Вечером здесь царит расслабленность. Люди сидят на ступеньках и лавочках или неспешно прогуливаются. Кто-то, и их немало, заполняет кафе, рестораны и клубы. Ну, а мне дорога на станцию Wynyard вдоль George Street. Путь к станции лежит через коридоры, ведущие в торговые павильоны Hunter Arcade. В коридорах расположены всякого рода закусочные, тот же McDonalds, кафе острой кухни iSpicy, от которого идут совсем уж мощные запахи, кажется, карри, и небольшие магазины. Но мне туда не надо. Мне надо вниз, к поездам. На платформе вечером людей немного, в основном такие же засидевшиеся допоздна работники. Женский голос время от времени дает объявления (наизусть уже запомнил, так часто слышу: "The next train to arrive on platform five goes to Liverpool via Regents Park. First stop Town Hall, then Central, Redfern, then all stations to Liverpool"). Курить вещества на платформе запрещено. Прямо так и написано:


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

1. Пригородные вагоны (официально - серии С). Тупомордые алюминиевые коробки, выпускавшиеся в 80 годах. Кондиционеров нет. Самые старые из того, что есть. Чаще всего по вечерам попадаются. Но вечером уже не жарко, да и народа немного, бывает, что я один на этаже еду.

2. Вагоны серии K. Выглядят как и предыдущие, но кондиционируются. Разница видна по окнам. Они у них сплошные и не открываются.

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

4. Millennium. Одни из самых новых. Красивый желто-черный поезд, с мягкой подвеской и способностью наклоняться на поворотах. Отличается космическими звуками, издаваемыми его двигателями. Узнается по форме стекол на дверях, они прямоугольные с закругленным торцом внизу. Этот попадается почти всегда по утрам.

5. Oscar. Похож на Millennium, но еще новее. Узнается по черному цвету, которым покрашена центральная часть и по форме стекол дверей.

Остальные типы по моей линии не ездят, или вообще гоняют между городами.

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

Выхожу из перехода, прохожу вдоль улицы и вижу вдалеке огни CBD. Он продолжает жить и ночью, а его пригороды уже сейчас затихают. Проходя по улицам можно попробовать представить себе образ жизни людей того или иного дома. Вот из того постоянно пахнет чем-то вкусным. А вот из этого - брагой (не шучу, правда). Хозяйка этого дома иногда выгуливает белую кошечку с медальоном в виде красного сердечка. У другого дома взрослые провожают 2-3 ребятишек куда-то. Иногда проезжают машины. В остальном - тишина, подчеркнутая звуками сверчков (или цикад, не знаю точно) и высоко пролетающих самолетов. Вечером они уже не летают низко над городом. Район готовится ко сну.

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

Знаете, как-то уж очень много внимания в блоге уделяется лично мне. "Я сказал, я сделал, я подумал..." Как-то это начинает напрягать, поэтому я и включаю в посты побольше описаний и всякого такого, что показалось интересным. Может, подскажете как дальше продолжать? Что лучше писать?

14 марта 2010 г.

The Corporation

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

Итак, действующие лица (я их уже представлял, но для порядка надо привести список еще раз):

Darren Vorster - мой менеджер. Возглавляет проект Catherine, над которым мы работаем.
Dermot Smyth - ирландский парень, спец по JBoss, Maven, Ant, Bamboo и прочей мути.
Ankur Kandikatla - мелкий индус. Над чем работает точно не помню.
Lin Wu - еще более мелкая китаянка. Работает на своим веб-сервисом.
Michael Farkas - архитектор. Специализируется по доменной модели и интерфейсам взаимодействия наших сервисов.
Matthew and Sam - ребята из Гонконга, на чьи плечи легла страшная обязанность провести рефакторинг одной программы с целью заставить ее работать с нашими веб-сервисами.

Начну с начала. Не успел я появиться на рабочем месте как сразу же пришлось делать кучу дел: запрашивать доступы, делать звонки, просить поставить нужные программы, на почту повалили письма (штук 20 в день). Даррен прислал список того, что нужно сделать и установить. Там были, помимо прочего, такие штуки как Cygwin и FreeMind. Мы с ним как-то говорили и он вскользь спросил использовал ли я карты памяти (Mind Map). Узнав, что да, включил FreeMind в список нужных программ. А Cygwin - это чтобы мне как юниксоиду было привычнее жить в Windows. Какая забота :)

Первое что мне поручил Даррен было изучение методологии Scrum. Распечатал 20 страниц текста и засел читать и конспектировать. Много времени это не заняло. Дальше пошло мощнее. Первые дни мы с ним подолгу беседовали, он мне объяснял всю эту финансовую мудрость. Надавал кучу ссылок на википедию, которые нужно было прочитать, дал книгу "Options, Futures and other Derivatives", сказал на что там обратить внимание.

Так как мы работаем по одной из Agile методологий, то каждый день у нас проходит Stand Up Meeting. Сидеть нельзя :) Лин, правда, все равно сидит. Там мы, согласно методологии, рассказываем кто что сделал, кто что планирует сделать и какие есть препятствия (blockers). Первое время мне особо было нечего сказать, но раз уж я в команде, то надо делать то, что надо. Вот и докладывал каждый день что изучил. Ниже примеры того, что я сделал руками. Это, значит, Mind Map по классификации деривативов:

Даррен просил обратить большое внимание на методику оценки стоимости опционов Блэка-Шоулза. Что это такое? Это матан! На английском, разумеется. Вот, одна из страниц. Наконспектировал:

Кто-то еще помнит что такое функция плотности распределения случайной величины? По-английски это будет density function. А еще есть cumulative function. Как это по-русски я не помню. Да и не надо. Разобрался, в общем.

Дальше пришлось целый день убить на онлайн тренинги и сдачу тестов. Финансовая структура серьезная, так что здесь очень много правил по работе с данными, доступа к ресурсам, этике и прочему. Нужно точно знать что можно, а что нельзя. Различать уровни доступа к документам, разбираться в полномочиях, уметь противостоять социальной инженерии, malware и прочим страшилкам. В тренингах очень много внимания было уделено конкретным примерам.

Несмотря на то, что это было даже интересно, один тест я завалил, допустив одну ошибку из 20. Требовалось не допустить ни одной. В этом случае надо было дать знать об этом менеджеру. Даррен сказал, что ничего страшного, пересдашь. Только с тех пор ни слуху ни духу о них. Ну, и слава богу.

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

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

Итогом этого всего стал документ, в котором я отобразил схему базы данных, вернее, той ее части, которая фигурировала в запросах. Отрезал все лишнее, провел связи, сделал схему на своем меленьком сервере Derby. Потом из этой схемы генерировал доменную модель объектов Hibernate. Таким образом удалось подобраться непосредственно к написанию веб-сервиса.

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

Я с этим вопросом подошел к Лин и допросил. Какого, собственно, ты так сделала? Ответ банален: взяла то, что работало. И про декларативную демаркацию транзакций ничего не знает. Мда. Надо пробивать у Даррена. По этому поводу состоялось несколько разговором втроем: я, Даррен и Дермот. И на Stand Up Meeting я этот вопрос тоже ставил. Вроде, все согласны. Только Даррен сказал сделать это самому, показать всем и будем взвешивать все за и против. Чего там взвешивать? Ну да ладно, сделаю.

И немедленно сделал!

В пятницу закончил делать свой Data Access Object, на который для пущей убедительности был навешен еще и интерцептор для переинициализации источника данных путем простого обращения к JNDI. Это чтобы совсем не думать откуда идут данные, а просто писать что нужно с ними сделать. Просто и быстро.

Несколько раз я уже оставался на работе до 8 вечера. Так получилось и в пятницу. Часов в 6 подошел Даррен со своим обычным "How's it going?" Я ему все показал, рассказал, полчаса потолковали про то как быть. Сказал, что транзакции нам делать придется, он узнал про какой-то такой требуемый функционал. А я что говорил?

На работе всех уже которую неделю достаю требованием обсудить мои вопросы, а именно: стркутура проектом (что куда надо класть), использование технологий (чтоб у всех одинаковые), журналирование (в каких случаях что писать, какие уровни использовать, какую библиотеку применять), соглашения об именовании и прочее. Для этого написал страницу в Confluence. Как-то пока не особо идет, Даррен через неделю сваливает в отпуск на месяц, сидит на работе до 11 вечера и ему не до того.

В Гонконге происходит своя движуха. У нас каждый день на Stand Up Meeting виртуально присутствуют Мэтт и Сэм. Они тоже в нашей команде, хоть и в Гонконге. Та программа, которую я вывернул мясом наружу с помощью AspectJ будет подвержена ими рефакторингу. Поначалу Мэтт просто показывал свой пессимизм по этому поводу. В последнее время, с пониманием ужаса ситуации, он стал даже ругаться матом. Даже осуждать его не хочется, я понимаю, программа страшная.

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

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

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

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

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

Ближайший справа - Анкур. Второй затылок слева - Даррена :)

Вот так начинается мой рабочий день:

Станция Stanmore:

Как-то раз не смог устоять и купил вот это:

Гомер прав. Mmm...donuts.

Когда работы не было, и делать было нечего, я поймал таракана. Большой такой, сантиметра 4. И бегает, зараза, быстро. Долго думал что с ним делать. Оставил решение этого вопроса до утра. Утром запечатлел его:

Что? Ничего не видно? А так?

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

Ну, делать нечего было, можете это понять?

Вроде, на текущий момент новостей больше нет.