воскресенье, 28 марта 2010 г.

Qcon 2010. День первый

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

  • Функции - небольшой размер (1-4 строки - это нормально, больше - уже много :) )
  • Аргументы функций - в идеале 0. 1 нормально, 2 уже плохо, а 3+ вообще беда. Особняком стоят аргументы boolean - их вообще быть не должно (2 метода с двумя вариациями в названии замен)
  • Имена - чем больше видимость тем длиннее имя
  • Классы - 200-300 строк, 10-30 методов, 0-6 полей
  • тесты, продолжающаяся интеграция, парное программирование

Узнал, что моя обычная практика при внесении изменений в код (затронул класс - пофикси в нем все косяки которые там есть), затронул пакет - если есть что в нем улучшить - улучши. Эта практика небольших инкрементальных улучшений в "бэкграунде" - оказывается называется "Boy Scout Rule". Блин, может я еще что-то делаю, что как-нибудь прикольно называется, а я этого не знаю? :)

Еще новое слово, которое похоже будет все чаще звучать - Craftsmanship. В манифесте собственно все сказано, идея мне нравится, буду пользоваться.

В общем, было весело :) Запала хватило на весь день :)


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

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


Интригующее название "The Craftsman Learns" заставило меня пойти на этот доклад после обеда. Докладчик сразу расположил к себе тем, что был босиком :) Узнал много нового:

  • Учиться это как плыть против течения. Если ты не плывешь вперед, тебе кажется что ты стоишь на месте, но по факту ты движешься назад
  • Спрашивать 5 раз "почему? зачем?" над каждой непонятной вещью
  • Проговаривать вслух вещи над которыми раздумываешь. Рассказать мучающую тебя проблему коту или мягкой игрушке - это может помочь не только сформулировать вопрос, но и тут же ответить на него :)
  • Думая над логическими/рациональными вещами, подключать нерациональную (правую) часть мозга - рисовать, говорить, дрыгать ногой :)
  • Делиться тем, чему сам недавно обучился - это поможет самому лучше понять (как в том анекдоте)
  • После изучения теории нужна практика. Причем внимательная и вдумчивая (я часто грешу одной теорией)
  • Ментальные карты - я даже на iPhone скачал приложение, которое их рисует. Чувствую, что такой техники мне не хватало, частенько бумажки просто исписаны без какой-либо структуры. С другой стороны возникает ощущение структурирования неструктурированного - то есть усложнение непонятного :)

Еще была пара исключительно программистских советов вроде учить по одному языку программирования в год или прочитывать одну техническую книгу в 2 месяц.

Не могу не отметить веселую презентацию. Рекомендую посмотреть.


Про отношения разработчиков и специалистов по развертыванию и сопровождению (людей следящих за системами в работе, следящих за ними, отвечающие за их работоспособность, горячую замену, системные апргрейды, окружающую среду и т.п.) я послушал в 15.00. Ходил собственно чтобы послушать, насколько в Дойче все плохо. Оказалось, что в Дойче всё замечательно. Ну или не всё. Но на твердую четверку. Итак, чего не хватает до пятерки:

  • отделять конфиги от бинарников (у нас не везде)
  • сделать конфиги легкодоступными для просмотра
  • проверять конфиги (имеется ввиду на рабочих станциях перед релизом)
  • показывать значения всех конфигов (значения по умолчанию, даже если они в коде)
  • failfast - быстропадающее приложение. Оно должно падать как можно быстрее, если конфиг некорректен


Больше всего в первый день я ждал доклада про Skype. Рассказывал молодой парень с таким прикольный акцентом. :) Оказывается Skype это:

  • С и С++ в ядре и транспортном уровне
  • Delphi (c ума сойти!) в интерфейсе для Skype клиента
  • PHP на сайте и онлайн-магазине
  • Postgre - БД и около нее

Лейтмотив автора был "функциональной архитектурой должен кто-то заниматься". И "всё гениальное - просто". Больше он ничем не запомнился.


Так закончился первый день. Доклад "мамы Smalltalk" я в расчет не беру - он был уже после пива. Главное, что запомнилось из него - все крутые вещи были придуманы в 70х. Просто тогда у них железа нормального не было :)

среда, 24 марта 2010 г.

Новые программизмы

Сегодня на тренинге от IBM услышал пару новый программизмов:

"Green field environment" - это когда ты разрабатываешь новый проект, а все вокруг/около него гибко / еще не создано / готово к изменениям. Иными словами ты можешь его изменять как тебе угодно.

"Brown field environment" - свой проект ты вынужден "встраивать" в среду которая недружественна к изменениям. То есть скорее ты изменишь свои требования к окружению, чем оно измениться по отношению к твоим. Говенный энвайромент, короче :)

"Gold hammer solution" - когда у тебя в распоряжении есть решение, сработавшее достаточно хорошо пару/несколько раз. И ты начинаешь с помощью него решать все последующие задачи (разбиваешь своим золотым молотком проблемы "в лоб"). Иногда мне кажется, что трехзвенка самый яркий пример такого "золотого молота" :)

понедельник, 22 марта 2010 г.

Быстро, много и без задержек. Java (?)

Доклад о том, как построить приложение на Java, способное обрабатывать большое количество транзакций в секунду с минимальной задержкой (latency). Авторы построили электронную торговую площадку (родственную Betfair) на основе Java и делятся опытом.

Итак, как осуществить больше 100К+ сложных бизнес-транзакций за время, меньшее 1 миллисекунды.

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

  1. вставка ордера в движок
  2. матчинг (с одним или несколькими контр-ордерами)
  3. генерация отчетов о сделках
  4. их передача в сокет

Зависимость заточки кода под производительность от требуемого количества транзакций:

  • 10K+ transactions per second - если не делать глупый вещей
  • 100K+ TPS - если придерживаться стандартный библиотек (в смысле не использовать транжирные третьесторонние) и иметь хороший "чистый" код
  • 1M+ TPS - пишем собственный кэш для больших объектов, имеем хорошие тесты для измерения производительности, контролируем сборщик мусора (нет лишнему мусору и тюнинг GC параметров), заточенная под скорость архитектура

Архитектура высокопроизводительного приложения (типа exchange :))

Receiver принимает сообщение от клиентов (протокол общение - FIX)

Replicator дублирует поток данных на запасной сервер

Journaller сливает все тот же поток на файловую систему

UnMarshaller парсит сообщения

Business Logic собственно matching engine нашего рынка

Marshaller генерирует execution reports

Publisher отправляет репорты в сеть


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


Слева и справа от бизнес-логики - это входные и выходные буферы соответственно. Просто большие циклические байтовые массивы. Replicator и Journaller используют входной буфер в режиме "только-для-чтения", а Receiver и UnMarshaller - читают и пишут. Receiver - то что получил из сети, а UnMarshaller - то, что распарсил. Видимо, внутренний протокол LMAX гарантирует, что во внутреннем представлении сообщение поместится в тот же место, в котором размещалась закодированная копия.

Business Logic читает из буфера самое старшее сообщение, обрабатывает его и пишет результат в выходной буфер. Где его затем подхватит Marshaller и запишет уже в виде сообщения внешнего протокола. Которое будет отправлено в сеть Publisher'ом.

Такая архитектура позволила добиться порядка 90 микросекундной обработки одной транзакции при 100К+ TPS.

P.S. Рекомендации от авторов

  • fastutils для коллекций в целом и хэш-таблиц в частности
  • 29West как транспорт

P.S.S. LMAX = London Multi-Asset Exchange. То же что и Tradefair

вторник, 16 марта 2010 г.

Задачка про груши

Решил задачку про груши (ответы не видел, так как читал по RSS). Один из вариантов:

1111

1100

1010

1001