понедельник, 19 октября 2009 г.

Бесконечные споры

Существует тонкая грань между свободой подчиненных и балаганом. С одной стороны руководитель должен давать своим подчиненным достаточно свободы, чтобы они могли раскрыть свой потенциал, участвовать в принятии управленческих решений и, таким образом, перенимать опыт руководителя, с другой стороны, подобная свобода действий может привести к хаосу, когда каждый имеет свою точку зрения и ресурсы каждого сотрудника направлены не на движение вперед, а на убеждения всего коллектива в правильности своей точки зрения.
Потрясающий совет в решении подобной проблемы дают авторы книги Adrenaline Junkies and Template Zombies в шаблоне поведения под названием "Endless Huddle" (Бесконечные совещания).
Основную мысль этого шаблона авторы позаимствовали из документа "Warfighing, United States Marine Corps":

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

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

понедельник, 12 октября 2009 г.

[Visual C++ 2008] Duplicate cpp filename

Я все еще занимаюсь переводом старого С++ проекта с VS2003 на VS2008 и в процессе перевода столкнулся с одной интересной проблемой.

Если в проекте содержится несколько файлов с одинаковыми именами (естественно, в различных папках), то линковаться такой проект не будет.

Проблема в том, что при компиляции файла с именем Foo.cpp студия генерирует объектный файл с именем Foo.obj, а если такой файл уже существует, то просто перезаписывает старый файл. В результате одного (или нескольких, в зависимости от количества cpp-файлов с одинаковыми именами) объектного файла будет не хватать, о чем любезно и сообщит линковщик.

Для проверки достаточно создать простое консольное приложение добавить Foo.h и Foo.cpp в корень и в подпапку, указать различные пространства имен и попробовать в Main.cpp создать объекты обоих классов.

Интересно то, что подобного поведения не было в предыдущих версиях компилятора и подобные проекты успешно компилировались как на VS2005, так и на VS2008. Там эта проблема решалась путем добавления в имя объектного файла чисел 2, 3 и т.д.

Еще более интересным является то, что эта проблема не будет решена до выхода очередной версии Visual C++. Вот один из ответов команды VC++ Team, найденный на MSConnect:

“Unfortunately we will not be able to fix this issue during this release. Please feel free to reactivate the bug if this is a blocking scenario.

Having duplicate file names in the same project is not a supported scenario. As a workaround as you recognize please change the name of the files that are being included in the same project.”

Подробности можно найти здесь и здесь.

Существует по крайней мере два обходных пути (возможны и другие, о которых я не знаю):

1. Избавиться от неуникальных файлов путем переименования.

2. Явно задавая имя объектного файла в свойствах конкретного файла.

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

Update (2009-10-14)

Существует по крайней мере один более изящный способ решения этой проблемы: можно для группы файлов, чьи имена совпадают с другими cpp-файлами в свойствах изменить поле Object File Name с $(IntDir)\ на $(IntDir)\Your Sub Dir\, в результате чего, объектные файлы для этих cpp-файлов будут складываться в указанную подпапку.

вторник, 6 октября 2009 г.

[Visual Studio] Find & Replace

В данный момент я работаю над переводом одного старого проекта, написанного под .Net Framework 1.1 на .Net Framework 3.5. При этом одной из задач является переход с синтаксиса Managed C++, на синтаксис C++/CLI.

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

Итак, задача: переделать свойства с синтаксиса Managed C++ в синтаксис C++/CLI.

Синтаксис свойства на Managed C++:
__property int get_EventType() { return eventType_; }

Синтаксис свойства на С++/CLI:

property int EventType { int get() { return eventType_; } }

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

Шаблон для поиска:

__property:b+{.#}:b*\*@:bget_{:w}\(\):b*(\n*:b*)\{\n*:b*{.*;}:b*\n*:b*\}

Шаблон для замены:

property \1 \2 { \1 get() { \3 } }

Синтаксис регулярных выражений в Visual Studio несколько отличается от общепринятого, но это не слишком важно, т.к. идея остается той же и в msdn прекрасно описаны особенности.

Теперь, запустив в Visual Studio механизм Find & Replace мы будем заменять свойства вида:

__property int get_EventType() { return eventType_;  }

Или

__property int get_EventType()

{

    return eventType;

}

На свойства вида:

property int EventType { int get() { return eventType; } }

Как правильно писал Джон Роббинс, разработчики очень часто плохо отзываются о своих пользователях, поскольку те не читают документацию и слабо используют функционал их приложений, но сами разработчики в этом плане не так уж и далеки от своих пользователей, когда речь касается об использовании функционала среды разработки.  Visual Studio содержит множество функций и инструментов, способных существенно упростить жизнь каждому разработчику, но мало кто из них (из нас) считает нужным изучать подобные возможности. Функция Find & Replace не является исключением. Представленный шаблон для преобразования синтаксиса свойств не претендует  на полноту, он подходит под тот формат записи, который применяется у меня, но возможно потребует некоторых изменений для вас. Но я и не хотел сделать инструмент, подходящий на все случаи жизни, а, скорее, продемонстрировать возможности инструмента, который всегда рядом и вполне может помочь для решения повседневных задач кодирования.

вторник, 15 сентября 2009 г.

Книга “Adrenaline Junkies and Template Zombies: Understanding Patterns of Project Behavior” by Tom Demarco, Piter Hruschka, Tim Lister et al.

Adrenaline_Junkies_and_Template_Zombies Труды Кристофера Александера вот уже в течение сорока лет оказывают серьезное влияние на светлые умы деятелей программной индустрии. И хотя первое упоминание книг Александера в компьютерной литературе, датируется 1969 годом в книге Эда Йордона и Алистера Коберна, идеи Александера оставались в тени, и не стали достоянием широкой компьютерной общественности, вплоть до середины девяностых годов, до выхода знаменитой книги «Банды четырех». Именно выход этой книги ознаменовал начало новой эпохи в нашей индустрии, эпохи всевозможных шаблонов. Идея шаблонов настолько понравилась общественности, что она стала завоевывать все новые и новые области. Так появились шаблоны реализации (implementation patterns), шаблоны асинхронного программирования, шаблоны корпоративных приложений, шаблоны реализации распределенных приложений и многие другие. Несмотря на свое широкое распространение, шаблоны оставались прерогативой архитектора и разработчика, а не менеджера. Но за последние несколько лет эта картина начала изменяться. Вслед за книгой  Джеймса Коплиена  и Нила Харрисона вышла книга Тома ДеМарко, Тима Листера и др. с интригующим названием “Adrenaline Junkies and Template Zombies: Understanding Patterns of Project Behavior”, посвященная шаблонам поведения программных проектов.

Книга состоит из 86 шаблонов, каждый из которых занимает 2-3 страницы и описывает определенную ситуацию, так или иначе связанную с состоянием или поведением программного проекта. Первым шаблоном в книге является шаблон “Адреналиновые наркоманы” (Adrenaline Junkies), который описывает такое состояние проекта, при котором считается, что «безумная активность является знаком здоровой продуктивности». Сотрудникам проекта приходится постоянно переключаться с одной задачи на другую, так и не доводя ни одну из них до логического завершения. Последним шаблоном в книге является шаблон “Зомби шаблонов” (Template Zombies), когда «проектная команда позволяет, чтобы работа управлялась шаблонами, вместо того, чтобы продумать процесс, необходимый для завершения проекта». Этот шаблон характеризует противоположную ситуацию, в которой форма становится гораздо важнее содержания. Между этими двумя шаблонами располагаются оставшиеся 84 шаблона, так или иначе описывающих поведение или состояние проекта. И хотя эти два шаблона не являются чем-то уникальным, они являются частью названия книги и именно они изображены на обложке книги в виде комичных человечков.

«Большая часть участников проекта довольно хорошо разбираются в распознавании образов и обладают внутренним чутьем (“я чувствую, что с этим проектом случится беда”), но не так хорошо разбираются в обобщении этих шаблонов в более удобную форму. Эта книга именно об этом. Мы, шестеро авторов, собрали весь свой опыт для изложения шаблонов, которые мы изучили в течение общих ста пятидесяти лет опыта».

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

P.S. MUST HAVE

UPD: Спасибо Василию Подобеду за коррективы в русскоязычном написании имени Алистера Коберна (Alistair Cockburn).

Книга Гради Буча и др. "Объектно-ориентированный анализ и проектирование с примерами приложений"

Booch_OOA_And_OOD_2007 «Звезда в преддверии коллапса; ребенок, который учится читать; клетки крови, атакующие вирус, - это только некоторые из потрясающе сложных объектов физического мира. Компьютерные программы тоже бывают сложными, однако их сложность совершенно другого рода. … Эйнштейн утверждал, что должны существовать простые объяснения природных процессов, так как Бог не действует из каприза или по произволу. У программиста нет такого утешения: сложность, с которой он должен справиться, лежит в самой природе системы».

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

Авторы пишут: «Эксперименты психологов, например, Миллера, показывают, что максимальное количество порций информации, которыми человек может оперировать одновременно, приблизительно равно семи (плюс-минус две). Вероятно, это ограничение пропускной способности информационного канала связано с объемом краткосрочной памяти человека». И именно это ограничение является своего рода лакмусовой бумажкой при объектно-ориентированной декомпозиции сложной системы.

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

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

Авторы подчеркивают важность архитектурной целостности, итеративного и поступательного жизненного цикла разработки. Интересной особенностью изложения является то, что авторы не считают рациональный унифицированный процесс разработки единственно верным во всех случаях, а ускоренные методы (agile process) неверными в корне. «Выбирая между ускоренным и планомерным проектированием, следует оценивать риск. С какими рисками сталкивается проект? Выберите стиль и соответствующие методы, минимизирующие эти риски…. Выбор процесса проектирования не означает, что работа сделана. Этот процесс следует уточнять на протяжении всего жизненного цикла проекта. Инструменты, работающие хорошо, следует оставить, а инструменты, работающие плохо, - исключить. Целью должен быть непрерывный процесс усовершенствования, основанный на практическом опыте».

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

Так сможет ли эта книга сделать из вас превосходного архитектора? Честно говоря, не знаю… Ведь процесс познания, точно также, как и процесс разработки программного обеспечения, является итеративным и поступательным. Одно только наличие этой книги на полке не является гарантией успеха ваших проектов. Прочитав эту книгу, вы не сможете в первом своем проекте с легкостью анализировать противоречивые требования пользователя, вам не откроются тайны объектно-ориентированной декомпозиции и ваши абстракции будут далеки от идеала. Ведь книга – это всего лишь направление, это не автострада, по которой вы сможете пронестись на бешеной скорости, это всего лишь еле заметная дорожка через тернистый путь, имя которому – объектно-ориентированный анализ и проектирование.

Книга Эндрю Ханта и Дэвида Томас “Программист-прагматик. Путь от подмастерья к мастеру”

The_Pragmatic_ProgrammerЕсть книги, которые учат нас определенным аспектам нашей профессии. Одни говорят о какой-то конкретной технологии или языке программирования, который может стать не актуальным в тот момент, когда вы ее принесли из книжного магазина. Другие учат нас, своим методологиям, говорят, что они самые лучшие, приводя примеры, которые обязательно подтверждают правоту их слов. Третьи знакомят нас с операционными системами, их преимуществами и недостатками. Четвертые рассказывают о модных системах управлениях базами данных и правильными способами их применения.

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

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

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

«Мне кажется, что языки, используемые нами для выражения своих идей, становятся частью нас самих, поэтому, если вы знаете только один язык, может показаться, будто сторонники других языков представляют опасность лично для вас. Мне представляется, что выход из этой ситуации – освоение других языков. Сомневаюсь, что можно быть профессионалом в области ПО и знать лишь один язык программирования. Может быть и экономическая причина: фундаментальные знания выходят за границы языка программирования в отличие от многих практических навыков. Поэтому, если я знаю только язык X и его наборы инструментов, а вы являетесь сторонником языка Y и его наборов инструментов, вы представляете угрозу для источника моего заработка. И вновь решение, как мне кажется, - в знании нескольких языков и наборов инструментов (а также твердое понимание фундаментальных концепций)».

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

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

Единственный выход из сложившейся ситуации – инвестирование в собственный "портфель знаний" на регулярной основе.

Многие авторы поднимают проблему модульности и связанности. Авторы этой книги не исключение. Но они используют несколько непривычный термин «ортогональность».

«Термин "ортогональность" заимствован из геометрии. Две линии являются ортогональными, если они пересекаются под прямым углом, например оси координат на графике… Этот термин был введен в информатике для обозначения некой разновидности независимости или несвязанности. Два или более объекта ортогональны, если изменения, вносимые в один из них, не влияют на любой другой».

Не было ли у вас случая, когда вы за месяц до завершения проекта понимаете, что DCOM для построения клиент-серверной архитектуры не подходит? И нужно искать альтернативные решения… Я был в такой ситуации, и только ортогональность системы позволили перейти на .Net Remoting за неделю и не сорвать сроки.

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

Крис Дейт в предисловии к своей замечательной книге "Введение в системы баз данных" приводит следующую выдержку Бертрана Рассела:

«Меня обвиняли в привычке менять свои суждения… Но разве мог бы физик, работающий с 1900 года, например, похвастаться в середине двадцатого века тем, что его суждения не изменились за последние полстолетия?... Та философия, которую я ценю и которой стараюсь следовать, научна в том смысле, что мы должны всегда стремиться получить неопровержимые знания, но новые открытия могут выявить прежние ошибки, неизбежные для любого беспристрастного разума. Когда бы и что бы я ни говорил, сейчас или в прошлом, я никогда не утверждал, что это – окончательная истина. Я утверждаю лишь то, что в свое время высказанное мной мнение было вполне обоснованным… Я был бы очень удивлен, если бы дальнейшие исследования не показали, что его необходимо пересмотреть. К тому же я никогда не высказывал свое мнение как окончательный вердикт, а просто подчеркивал, что это – лучшее, что я мог сделать в то время для достижения ясного и точного понимания. Моей целью было, прежде всего, полная ясность во всем».

Поэтому никогда не стесняйтесь признаваться (и прежде всего себе) в том, что вы совершили ошибку. Быть может это и не ошибка вовсе, может быть в тех условиях, с тем опытом и знаниями – это был единственно правильный выход?

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

Авторы советуют говорить: "Я вернусь к вам с этим позже".

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

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

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

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

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

Программистом-прагматиком".

среда, 9 сентября 2009 г.

Death March, 3rd edition by Edward Yourdon

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

Изначально материалы книги были закрыты для общего доступа, автор мотивировал это следующим: “All of this is on a separate website from this blog — partly because I’m using Apple’s iWeb development tool to generate new content quickly and easily (with hyperlinks, graphic images, YouTube clips, Google Maps, RSS feed, and various other widgets), and partly to make it password-protected in order to keep spammers and hackers out.”, но затем общий доступ был открыт всем желающим (видимо автору надоело отвечать на множество писем), поэтому сейчас материалы общедоступны на отдельном блоге: http://web.me.com/yourdon/DM3e/DM3e/DM3e.html.

Сейчас доступны следующие разделы:

Thursday, July 2, 2009