среда, марта 26, 2008

Meeting

-Пойдем с нами, помитингуем. -Надолго? -Да нет, часа на полтора.
Знакомо? Митинги — хороший способ осознать какова сила командной работы. За полтора часа разговоров команда тратит столько времени, сколько тебе в одиночку не потратить за неделю. На первый взгляд, кажется что время тратится с пользой. Люди говорят, спорят, обсуждают, но стоит поймать выходящего из комнаты для совещаний и спросить, что, собственно, обсуждалось, и что было решено, как будет получен ответ в стиле: «Ну взаимодействие системы, А с подсистемой B. Петро будет спеку на интерфейс писать." Помилуйте, что тут можно было обсуждать полтора часа? А ведь существуют компании где на подобные совещания тратится больше половины рабочего времени, а большая часть «митингующих» рисует чертиков. Между тем способ сделать собрания эффективными давно известен всем желающим. Нужно лишь соблюдать несколько простых правил:
  • Прежде чем назначить совещание нужно составить план, в котором будут перечислены вопросы вынесенные на обсуждение и предполагаемое время обсуждения каждого. Это позволит определить список заинтересованных лиц и оценить время необходимое на совещание. С планом необходимо ознакомить всех участников заранее, а не прямо на месте. Лучше, если участники будут пропускать несущественные для себя вопросы, чем рисовать чертиков.
  • Если в процессе обсуждения поднимается новый вопрос, план ни в коем случае не меняется на лету. Вместо этого назначается отдельное обсуждение с собственным планом и отдельными участниками. Если участники будут уверены в том, что план не изменят на лету, они смогут пропустить несущественные для них вопросы.
  • На любом совещании должен быть председатель. Его задача следить за соблюдением регламента, прерывать затянувшиеся обсуждения и вести протокол. По окончании совещания протокол выдается всем участникам или публикуется. Протокол нужен обязательно. Иначе уже через полчаса непонятно почему было принято какие-то решения, а на следующий день забываются и сами решения.
  • Любой участник может поручить любому другому участнику говорить от своего имени. Это позволит сэкономить время самым продуктивным сотрудникам, способным сделать за время совещания что-то более полезное.
  • Если кто-то из приглашенных счел возможным не придти, и не доверил свой голос другим участникам, это автоматически означает его согласие с любым принятым решением. 
Более подробно этот подход описан у ДеМарко в «Deadline». Там же есть и примеры удачно проведенных совещаний.

понедельник, марта 17, 2008

Code conventions

Через пару недель проекта, особенно если оный был расчитан на достаточно долгий срок, всегда находится гаврик, считающий, что для успешного существования проекта необходимо немедленно, пока не слишком поздно, написать code conventions. Не будучи вовремя остановленным, он за один присест порождает страниц, эдак, двадцать, заполненных беспорядочными правилами, вроде:
Имена переменных должны удовлетворять camelCase; Недопустимо обращение через две точки, во имя закона Деметры; Бинарные операторы должны быть отделены пробелами с обоих сторон; В сеттерах нужно использовать this; Забытая в микроволновке еда считается общей; и т.д.
Обычно такой документ живет ровно две недели, затем перемещается в архив, извлекаемый оттуда только для того чтобы продемонстрировать его новичкам. Поскольку документ изначально не соблюдался и разительно отличается от негласных соглашений принятых в коде, новички тоже откладывают его в сторону. От проекта к проекту такая ситуация повторяется с завидной регулярностью. Причина в том, что любая дополнительная активность, как написание комментариев, проверка кода на соответствие соглашениям, комментарии к коммиту в VCS требует дополнительных затрат. Если преимущества от этих действий неочевидны человек склонен «забывать» их делать. Поэтому введение в проекте code conventions автоматически означает появление роли следящего за их соблюдением. Для того чтобы решить проблему недостаточно опубликовать документ, каким бы хорошим он ни был. Нужна постоянная активность,  это везде так. Отлично, но следить за соблюдением правил, описанных на двадцати страницах, отнимает прорву времени. И это вторая причина, по которой затея с code conventions проваливается. Теперь, когда мы добрались до сути, мы можем сформулировать рекомендации для написания соглашений. Но, сперва, давайте обозначим проблему, которую мы собираемся решать. Разные программисты предпочитают разные стили написания кода. Если несколько разных стилей смешиваются в одном файле, этот файл становится трудным для чтения. Разнобой в стиле выглядит неряшливо и поощряет неряшливость уже в самом коде. Соглашения о коде призваны устранять неоднозначности в выборе несущественных деталей оформления, в идеале сужая пространство вариантов до одного. Как же писать code conventions? Определите кто ваши программисты. Кто сказал: «Они все здесь»? А как же библиотеки, которыми вы пользуетесь. Их интерфейсы должны вашим соглашениям. Естественно, вы не в силах заставить сторонних разработчиков соблюдать ваши стандарты, но вы всегда можете подогнать стандарты под них. В противном случае использование библиотек будет выбиваться из общего стиля и увеличивать энтропию проекта. Все соглашения можно разделить на две части: поддающиеся автоматическому переформатированию и не поддающиеся. Переформатированию поддаются такие вещи как количество пробелов, формирование отступов, расположение скобок, длина строк и т.п. Лучший способ их публикации, это положить в VCS файл настроек для IDE. Можно также настроить VCS сервер на вызов автоформаттера перед каждым коммитом и забыть о них навсегда. Описывать их в документе совершенно не обязательно. Не стоит поручать человеку делать то, что сумеет машина. Не поддаются переформатированию такие вещи, как имена файлов, переменных, пакетов и классов, стиль работы с исключениями, расположение файлов. Продвинутые автоформаттеры умеют отлавливать ошибки, но исправлять из автоматически невозможно. Поэтому все что не поддается автоформатированию придется описать в документе явно. Документ содержащий code conventions не должен быть большим. Четырех страниц более чем достаточно. По крайней мере ограничение объема избавит вас от соблазна включать в документ правила пользования микроволновкой. Если есть возможность, не изобретайте велосипедов. Почти всегда можно взять готовые документы у разработчиков языка или людей в нем авторитетных. Вот несколько таких примеров: Утилиты для автоформатирования кода:

вторник, марта 11, 2008

Как выбирать библиотеку

Каждый раз сталкиваясь с новой задачей мы задаем себе вопрос: Стоит ли ее решать? Возможно, удастся использовать готовое решение. В этом сила программирования, для большинства задач, таких как вывод суммы прописью или реализация протокола Z39.50 давно существуют готовые решения. Но, если решений несколько, как выбрать одно из них? Или может быть отказаться от всех них и реализовать задачу самому? Для многих такой выбор оказывается черезмерно сложным и они скатываются к одной из двух крайностей: предпочитают во всех случаях готовые средства или всегда изобретают велосипеды. Однако, разумные люди предпочитают объективно оценивать ресурсы. Я определил следующий набор критериев:
  • Большинство библиотек плохо работают на грани своей области применимости. Например, все известные мне попытки применить Hibernate или ActiveRecords из Ruby on Rail к сложной унаследованной базе, вдобавок денормализованной достигали цели только посредством тяжких ухищрений. Убедитесь, что вы собираетесь использовать библиотеку именно так, как это запланировано разработчиками. В противном случае, выбросьте ее сразу. Все равно она для вас не подходит.
  • Срок жизни кода в среднем составляет 5-10 лет до того момента как он морально устареет и будет выброшен. Это тот срок, когда кому-то нужно будет поддерживать код. Соответственно поддержка библиотеки должна быть расчитана на тот-же срок. Будет неприятно, если через пять лет в критичной библиотеке найдется критичный баг, который невозможно исправить, поскольку разработчики библиотеки давно испарились вместе с исходниками. Для коммерческих библиотек с закрытыми исходниками это может стать серьезной проблемой. Для Open Source такой гарантией может стать поддержка большого сообщества или серьезной конторы вроде IBM, Intel или Sun
  • Критичный для функционала проекта должен писаться только собственноручно хотя бы на один уровень вглубь. Например, если мы занимаемся разработкой GIS системы, мы можем взять набор классов с представлением географических координат из десятков библиотек. Но координаты расползутся по всему приложению и заменить библиотеку когда она перестанет удовлетворять будет практически невозможно. Модели предметной области, бизнес правила, уникальные для вашей предметной области элементы интерфейса должны разрабатывать только вы сами. В противном случае у вас есть все шансы при очередном изменении требований столкнуться с ограниченностью библиотеки. К сожалению разработчики библиотек этого не понимают и норовят запихнуть свои «фреймворки», «модели предметной области» и «наборы бизнес правил» во все подходящие, на их взгляд, проекты
  • Любая библиотека имеет склонность врастать в продукт и изменять его вокруг себя. Выбор, например, log4* навсегда определит вашу стратегию логгирования. Хорошая библиотека, изменит продукт в лучшую сторону, плохая только ухудшит. Стоит следить, чтобы архитектурные принципы используемых библиотек были сходны с вашими, code conventions не слишком отличались, а политика релизов была ясной и прозрачной. Плохое регрессионное тестирование библиотек или нарушение обратной совместимости приведет к шаманствам с зависимостями при сборке проекта и багам при обновлении библиотек. Важно понимать, что библиотека это не просто набор интерфейсов, а живой организм со своими особенностями.
Для того чтобы руководствоваться этими принципами на практике есть простой чеклист:
  • Функционал реализуемый библиотекой критичен для проекта?
  • Насколько сложно написать собственный код по сравнению с использованием библиотеки?
  • Является ли библиотека open source либо предоставляют ли производители какие-то осязаемые гарантии?
  • Насколько велико сообщество пользователей библиотеки?
  • Как часто выходят релизы и фиксятся баги?
  • Насколько хорош код библиотеки?
  • Насколько хороша документация?

понедельник, марта 03, 2008

Очередной пример "замечательного" перевода. Фильм Zodiac, фраза: "His ashes were scattered by his family in San Francisco Bay", перевод: "Его статьи и записи были проданы его семьей с аукциона E-Bay". Я нашел только два совпадающих слова. Интересно, что курил переводчик?