вторник, 25 декабря 2007 г.

Lean и роль менеджера в Agile. Бесплатный семинар.

12:25 pm - Семинары "Lean и роль менеджера в Agile"

26

Дек

Семинары "Lean и роль менеджера в Agile"
Luxoft Ср, 26 Декабря 2007 в 19:00
Livents.ru - Смотри. Участвуй. Живи.

Мэнеджмент проекта vs JIRA

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

http://confluence.atlassian.com/display/JIRAEXT/Agile+Wall+Report
http://confluence.atlassian.com/display/JIRAEXT/Agile+Velocity+Tracking+plugin
http://confluence.atlassian.com/display/JIRAEXT/JIRA+Charting+Plugin
http://confluence.atlassian.com/display/JIRAEXT/Timecharts
http://confluence.atlassian.com/display/JIRAEXT/Links+Hierarchy+Reports
http://confluence.atlassian.com/display/JIRAEXT/Laughing+Panda+JIRA+Agile+Report+Plugins

И дальше по ссылкам. Очень порадовало заточка ряда плагинов на Agile практики. Так что дерзайте!

Кстати, JIRA стоит значительных денег. Если у вас нет несколько лишних тысяч долларов я с предлагаю хостить ваш проект у меня. Настройку, конфигурацию и поддержку обеспечу. Стоить будет ровно в 10 раз меньше :)

воскресенье, 23 декабря 2007 г.

Personal Sprint

Приведу стэк задач, начнём с наиболее крупной и дальше по убывающей.

1. Vision. Общие знания о проекте, стратегия его развития, фундаментальные принципы декомпозиции и т.п. То что почти не меняется. Стратегические цели. Оценивается бизнес-значимостью.
2. User Stories. На первом месте требования пользователей. Это самые крупные, можно сказать тактические цели в рамках проекта. Оценивается бизнес значимостью и Story Points. Что такое story points? Это сипульки. Условное обозночение трудозатрат, оценивается разработчиками.
3. Tasks. Задачи для разработки. Конкретные задания, которые должен выполнить участник команды. Оценивается в часах. Продолжительность от 1 часа до 1 дня.
4. Personal Sprint (Checklist, TestList). Записи в блокнотике. Каждый разработчик разбивает Task на мелкие шаги. После каждого шага вычёркивает пукнт из List. Для практикующих TDD см. паттерн Test List. Это список тестов, которые нужно написать. Продолжительность от 10-20 минут до одного часа.

Последний пункт может выглядить примерно так. Я хотел сделать "тупой маленький чеклист" для рефакторинга перемещение поля:
1. модифицировать все установки поля (setter)
2. модифицировать всех читателей поля (getter)
3. удалить объявление поля
4. и так далее в таким же простым способом

Можете наконец-то в своём IDE воспользоваться окошком TODO ;)

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

Плюс от таких бумажек следующий - МАТЕРИАЛИЗАЦИЯ. Голова хорошо, но простой список задач проще. Профессиональные медики (см. фильмы зарубежные) ходят с checklist'ом и отмечают галочками выполненные задачи (приём таблеток, процедуры и т.п.). И этому учат их в институте. Так почему такая простая практика отстутствует в арсенале профессионального разработчика? Вы не знаете чем заняться глянули в список и выбрали. Не знаете чем убить минутку до совещания. См. в список.

На закуску пару интересных ссылок не по теме :)
1. Visual Studio Team System 2008 Team Foundation Server Power Tools
http://msdn2.microsoft.com/en-us/tfs2008/bb980963.aspx
2. Год MSDNWiki
http://blogs.msdn.com/sandcastle/archive/2006/09/06/742352.aspx
3. Google.vs.Wiki
http://itblogs.ru/blogs/kav/archive/2007/12/21/24329.aspx

суббота, 15 декабря 2007 г.

А вы Agile команда?

Ответьте на 4 вопроса Скотта Амблера и вы поймёте Agile-команда вы или нет.
Вопрос 1. Покажите свои Unit-тесты.
Вопрос 2. Познакомьте меня со своим заказчиком
Вопрос 3. Покажите ваш CM (configuration managenet)
Вопрос 4. Покажите вашу самоорганизацию.

Если на все четыре вопроса я увижу в вашей команде ответ, то вы Agile-команда!

Показ мод от Microsoft 2008

ADO.Net Entity Framework beta 3. Решение ORM от Microsoft.

ASP.NET 3.5 Extensions Preview - MVC каркас

пятница, 14 декабря 2007 г.

Определите национальность

Определите национальность автора кода

//--------
boolean b;

if(b.toString().length() >4){...}
//-------

Dream Team: Первый шаг

Сегодня провели первый старт. Микро-отчёт.

1. Повешана White Board + Status Board
2. Рассмотрены следующие практики:
2.1. Dialy Scrum Meeting
2.2. Атрибутика для DSM: мечь кладенец, банка для добровольных пожертвований.
2.3. Коллективное притяние решение из Базового Протокола.
2.4. Niko-niko календарь.
2.5. User Story в формате "As a user ..." (см. Mike Cohn)
3. Поговорили о целях, целеполагании.

Сложности были в обсуждении п.2.3. Не все решения могут коллективно приниматься. Например, административные. В п.2.1. было сложно договориться во сколько же собираться. Решили договориться на 13 часов. Основной аргумент, чтобы до обеда порешать задачи, которые могут возникнуть после митинга. Сложность в п.2.2. это сама концепция штрафа (банка) была неудобна одному участнику. Согласились действовать по принципу "кто что сможет"; то есть штраф за опоздание на планёрку не строго типизирован: конфетки, деньги и т.п. а гибче "кто что сможет". Niko-niko календарь в основном все поддержали, не поддержавший сказал детские игры. И пришлось признать себя большими детьми :)

Провели ретроспективу на практики и решили заиспользовать в течении следующей недели.
Продолжительность первого шага: 1 неделя.

PS. Таски на жёлтых стикерах признаны для обсуждения (например религиозного). Запланировали повесить возле доски контейнеры для разноцветных стикеров. Возле Nico-nico календаря весит пачка фломастеров.

вторник, 11 декабря 2007 г.

TeamCity 3.0

Похоже команда Jetbrains решила захватить рынок традиционным способом - БЕСПЛАТНО.

Now available for free, TeamCity 3.0, delivers multiple improvements in different areas and extends support for both Java and .NET software development teams. To name just a few: a new licensing policy, per-project roles and permissions, build statistics charts, .NET code duplicates search, VCS integration enhancements, upgraded performance, and a better user experience.

The key new features of this release include:

• Per-project access rights with project roles – an exclusive feature of the Enterprise edition
• Build statistics charts, with declarative pluggable charts for user-defined metrics
• Pre-tested commit from Visual Studio for Subversion
• StarTeam support
• .NET Duplicates finder for catching similar code fragments of your C# and Visual Basic .NET code
• Java Inspections and Duplicates for Maven2 projects
• Version Control labeling for Subversion, CVS, Perforce, StarTeam, ClearCase
• “Hanging” builds auto-detection and thread dump capturing, for quick feedback on Java and .NET builds’ problems
• Display of build start/finish estimations in the build queue
• Build tags for organizing and quickly filtering builds

To learn more about new features in TeamCity 3.0, please visit
www.jetbrains.com/teamcity/features/newfeatures.html?tc30a.

For additional details about the new licensing scheme for Professional, Enterprise and Open Source licenses, see http://www.jetbrains.com/teamcity/buy/?tc30a .

Existing TeamCity users qualify for a free upgrade to the most feature-rich Enterprise edition. For details, go to http://www.jetbrains.com/teamcity/buy/index.html#upgradeuser?tc30a.

воскресенье, 9 декабря 2007 г.

Agile Practices

Сегодня причесал вики сайта http://AgileRussia.ru. Основной упор сделал на разделение всего Agile мировозрения на две вещи: 1) практики и 2) методологии.
Соответственно в практиках будет накапливаться информация о всевозможных Agile-практиках, которые планируется собрать со всего интернета. Кстати, подключайтесь, дел много, заодно узнаем много нового.
Во втором разделе классификация этих же практик с точки зрения авторов методологии.

Сам ресурс доступен по адресу: http://agilerussia.ru/wiki/index.php?title=Practices

PS. В середине недели дам доступ :)

суббота, 8 декабря 2007 г.

Dream Team: Создание новой Agile-команды

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

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

Итак, жду вас на следующей неделе. Буду сообщать с фронта событий.

Мы делаем новости!

вторник, 4 декабря 2007 г.

Dependency Injection Application Block

Ребята в Microsoft решили обзавестись своей реализацией Spring.Net. Дали ей название Dependency Injection Application Block. Такое творение ожидается в следующей версии Enterprise Library.

Более подробно читайте об этом слухе - здесь

понедельник, 3 декабря 2007 г.

Функциональный стиль C# 3.0 в помощь качекодуру

Качкодер (сокращённо качёк) - человек, которые пишет качественный код.

В блоге Ивана появилась первая статья о функциональном программировании. Вырежу самые приятные слова, за остальным заходите к Ivan'у :)

Polygon triangle =
  new Polygon {
    new Point { X = 3, Y = 5 },
    new Point { X = -5, Y = 4 },
    new Point { X = -1, Y = -6 }};

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


В чем же цимус от использования неизменяемых объектов, вместо обычных переменных? На самом деле мы получаем целый ворох конфет:
- Отсутствие побочных эффектов. Работа любой функции гарантировано зависит только от входных параметров и результатом ее работы являются только выходные параметры.
- Мы можем совершенно безопасно отдавать свой объект наружу во временное пользование, у нас есть 100% гарантия, что его никто не испортит.
- Отладка упрощается в разы. Все с чем будет работать функция лежит в стеке вызова.
- Повышается эффективность тестирования.
- Колоссально упрощаются алгоритмы синхронизации доступа из разных потоков.
- Появляется возможность автоматически распараллеливать выполнение задач.
- Существенно упрощаются алгоритмы хэширования и выявления эквивалентности.
- Реализация Undo/Redo, причем не только структур данных, но и хода выполнения программы становится тривиальной.
- Появляется возможность заменять произвольные функции не останавливая всей программы. (Реально существуют приложения на Erlang-е, работающие годами без остановки, код которых был заменен целиком)
- ... и много других приятных плюшек.

воскресенье, 2 декабря 2007 г.

Джимми Нильссон. Применение DDD и шаблонов проектировани - пример некачественного перевода.

Буквально два дня назад купил долгожданную книгу Нильссона в переводе издательства Вильямс. Тема книги и автор очень уважаемые люди :). Но вот перевод не вышел.

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

"Кроме опечаток есть и просто неправильный перевод профессиональных терминов, что несколько раз меня уже вводило в ступор"

А теперь мой собственный комментарий. Зелёную полосу называют провалившимся тестом. TestFixture — обозвали тестовой конфигурацией на схеме. Mock объект имитацией. А самовольная замена DDD на ППО, а TDD на РПТ — бесчинство и яркое неуважение к читателю.

Пару ярких цитат: "Тест компилируется, но даёт положительный результат (красную полосу)" (стр.464) в оригинале "It compiles, but it turns red.". А от этого плакать хочется: "Теперь тест даёт наконец-то отрицательный результат (зелёную полосу)!" (страница 467 внизу)

Вывод: НЕ ПОКУПАЙТЕ!!! ЧИТАЙТЕ ОРИГИНАЛ!!!

пятница, 30 ноября 2007 г.

Software Factories (Фабрики разработки программ)

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

1) Джек Гринфилд и Кит Шорт, при участии Стива Кука и Стюарта Кента Фабрики разработки программ. Потоковая сборка типовых приложений, моделирование, структуры и инструменты (Software Factories: Assembling Applications with Patterns, Models, Frameworks, and Tools)
2) Practical Software Factories in .NET by Gunther Lenz and Christoph Wienands
3) Agile Software Factories by Damon Wilder Carr (Author)



Для начала можно начать с wikipedia: http://en.wikipedia.org/wiki/Software_factory. А затем на хорошо проработанную страничку http://msdn2.microsoft.com/en-us/teamsystem/aa718951.aspx

среда, 28 ноября 2007 г.

Аудио-подкасты для программистов

Совсем давно мой хороший знакомы (привет Кирилл!) посоветовал хоороший список аудио-подкастов для разработчиков. Прослушивая их вы убиваете двух зайцев: 1) узнаете самые новые идеи из уст гигантов софтварной индустрии, 2) подкачиваете английский.

Так что подключайтесь к прослушиванию:

* DotNetRocks
* Hanselminutes
* Bits Of Sillicon Hell
* Developer Night in Canada (although it is dormant for a long time)
* Code Sermon
* FLOSS Weekly
* Mondays
* Polymorphic Podcast
* Security Now
* Software Engineering Radio
* This Week in Tech
* Web Dev Radio
* Windows Weekly

(искать в google)

суббота, 24 ноября 2007 г.

Surprising criticism from parting Microsoft development lead

Jay Bazuzi, once Development Lead for the C# Editor, is leaving Microsoft, and he wrote some surprisingly harsh parting words for his friends before he left; things like “OO isn’t a fad” and that “It’s OK to use someone else’s code”.

Оригинал: ссылка
Источник: ссылка

среда, 21 ноября 2007 г.

Выпущена Visual Studio 2008

On Monday, Nov. 19, Microsoft announced that Visual Studio 2008 and the .NET Framework 3.5 were released to manufacturing (RTM). With more than 250 new features,Visual Studio 2008 includes significant enhancements in every edition, including Visual Studio Express and Visual Studio Team System. Developers of all levels – from hobbyists to enterprise development teams – now have a consistent, secure and reliable solution for developing applications for the latest platforms: the Web, Windows Vista, Windows Server 2008, the 2007 Office system, and beyond.

Ссылка на новость
Скачать полную версию (90 дней trial)
Скачать VS2008 Express (900Мб, DVD)
Примеры проектов
.Net Framework 3.5 Full Package

На сайте здесь найдены приполезнейшие ссылки:

вторник, 20 ноября 2007 г.

Инфекция Agile обнаружена в Сибири!

В начале ноября при поддержке Учебного Центра «Люксофта» в городе Омске состоялись тренинги, посвящённые применению гибких методологий в разработке программного обеспечения, а так же техникам повышения личной эффективности.

Тренинги проводил Agile-евангелист Денис Миллер.

 


 В самый последний момент я вспомнил, что нужно сделать снимок на память :)

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

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

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

 

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

Практика Рефакторинг on-line

Нашёл интересный сайт. Хотите попрактиковаться в рефакторинге. Хотите получить совет. Заходим на сайт http://refactormycode.com.
В основном там Ruby и Java поклонники были замечены. Но есть и колонка для C#.

пятница, 16 ноября 2007 г.

Implementation Patterns by Kent Beck


Буквально недавно выпущена книга гуру качественного кода и мною примного уважаемого автора Кента Бека под названием "Implementation Patterns". Беглый просмотр оглавления и аннотаций навели меня на мысль, что эта книга компиляция идей мира smaltalk в Java. А раз это так, то этот труд стоит читать! Ведь там идей очень много и очень они качественные.

Ждём завоз этой книги на территорию России. Если кто будет пролетать мимо и увидет в продаже. Просьба купить -- деньги верну :)

четверг, 15 ноября 2007 г.

Качественный проект

Идея 1. Во время проекта создаётся не только ПРОДУКТ, но так же ДОКУМЕНТАЦИЯ (можно считать, это отдельный проект), создаётся ПРОЦЕСС (многие это уже осознали) и создаётся КОМАНДА (это осознали только адаптивные методологии).

Идея 2. Успех проекта зависит 100% от человеческого фактора. А он в свою очередь складывается из ВЗАИМОДЕЙСТВИЯ, ДОВЕРИЯ, ЭМПАТИИ, ОРГАНИЧЕСКОЙ АРХИТЕКТУРЫ, ДОКУМЕНТАЦИИ, ОБРАТНАЯ СВЯЗЬ и др. (что значат некоторые вещи - не спрашивайте, не знаю). Этим waterfall не занимается.

Согласно Agile, наша цель -- создать лучшй продукт. Причём самым эффективным способом. А как практика последних десятилетий показала, что эффективность зависит от КОМАНДЫ и ЧЕЛОВЕЧЕСКОГО ФАКТОРА. На что и ориентируются множество практик Agile.

среда, 14 ноября 2007 г.

Семейный SCRUM (Family Scrum)

Уже второй день проводим вечерний SCRUM в семейном кругу.
Немного необычно. Чувствуется у меня скованность. Но интересно.
Итак наша команда: муж, жена, 2 пацанов по 3.5 года.

Стандарные вопросы Daily Scrum Meeting:
- что было сегодя?
- что будешь делать завтра?
- что тебе мешало быть эффективным? (проблемы)

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

Дополнительно ревизия дня и планы на завтра малышне позволяет задуматься (все их мысли на лице можно прочитать). И потом они рожают. Немного не в попад -- но получается весело.

Knowledge Transfer with SCRUM



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

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

На семинаре я попытался взглянуть на практики SCRUM с точки зрения передачи знания. Мне кажется такой срез очень важен, поэтому смотрите и я жду ваших комментариев :)

четверг, 25 октября 2007 г.

Джим Мак-Карти "Программируем командный дух" и "Правила разработки программного обеспечения"

Год назад пытался читать эту книгу. Ничего не понял. Засыпал. Спустя год всё изменилось. Я понял оказывается её читать можно.

Фактически Джим предлагает формализовать некие часто встречающиеся моменты во взаимодействии разработчиков. Как начинать митинги, как вести. Как выявлять намерения и цели разработчиков. Как формировать цели команды. То есть разработать паттерны командного взаимодействия.

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

Справка:

Джим и Мишель Мак-Карти, «Программируем командный дух. Базовые протоколы, позволяющие создавать и поддерживать общее видение», Символ-Плюс, 2004, ISBN-5-93286-065-0

Jim McCarthy, Michele McCarthy, “Software for Your Head: Core Protocols for Creating and Maintaining Shared Vision”, Addison-Wesley, 2001, ISBN-0201604566

http://www.microsoft.com/rus/news/issues/2006/06/JimMcCarthy.mspx
http://www.mccarthyshow.com/TheMcCarthyShowIndividualEpisodes/Episode15FamilyTime/tabid/1256/Default.aspx
http://www.sdexpo.ru/data/speakers_2007/jim_mccarthy_software_for_your_head.pdf

Отзывы
http://kirillk.livejournal.com/51279.html
http://community.livejournal.com/mustread/6340.html


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

воскресенье, 21 октября 2007 г.

Применение DDD и шаблонов проектирования: проблемно-ориентированное проектирование приложений с примерами на C# и .NET

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

--- cut ---
Эта книга о разработке корпоративных программных приложений в среде .NET с применением шаблонов проектирования. В ней описаны: проблемно-ориентированные методы проектирования (DDD, или Domain Driven Design), разработка посредством тестирования (TDD, или Test-Driven Development), объектно-реляционное преобразование, т.е. методы, которые многие относят к ключевым технологиям разработки программного обеспечения. По мере развития и усложнения технологии все большее значение приобретают вопросы правильного применения методов проектирования. Ценность этой книги в том и состоит, что она помогает разобраться в этих вопросах. Хотя большинство примеров кода представлено на языке C#, материал книги может оказаться полезным и для тех, кто работает на платформе Java. Книга адресована опытным разработчикам архитектуры и прикладного программного обеспечения уровня предприятий, в том числе и в среде .NET.
--- cut ---

http://www.williamspublishing.com/Books/978-5-8459-1296-1.html

воскресенье, 14 октября 2007 г.

Intention Revealing Method

Всё чесались руки сделать паттер "Intention Method". Думал присвоить себе славу и мировое признание. Но и тут меня обогнали на 10 лет :)

[1] Smalltalk Best Practice Patterns. Kent Beck, 1997
[2] Patterns in Java, V.2, Mark Grand

Очень рекомундую прочитать главу 6 [2] под названием "Organization Coding Patterns". Очень простые решения "Intention ..." & "Composed Method" решат многие проблемы нечитаемого кода.

"Если название функции не очевидно, определите метод который будет отражать намерение"


if(LOCK_FILE.CreateNewFile()) {...
меняется на
if(CreateLockFile())


И другой пример из библиотеки java.awt.EventQueue:
if(eventQueueListener != null)
  eventQueueListener.eventPosted(theEvent);

смело меняем на
private void notifyEventQueueListener(AWTEvent theEvent)
{
  if(eventQueueListener != null)
    eventQueueListener.eventPosted(theEvent);
}

среда, 10 октября 2007 г.

for VS while

Всегда думал, что while используют настоящие мужчины. Но сегодня написал код, которому сам даже не обрадовался. Критерий оценки: нужно приложить усилия, чтобы понять, что по чём.


while (nextLeaseEnd < _finishedRollOverYear)
{
_mtm += _squareFeet.Value;
nextLeaseEnd = nextLeaseEnd.AddMonths(_category.MonthsToNextLeaseEnd);
}



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

DateTime nextLeaseEnd = _tenant.LeaseEnd.Value;
DateTime end = _startRollOverDate.Value;
int delta = _category.MonthsToNextLeaseEnd;

for(; nextLeaseEnd < end; nextLeaseEnd = nextLeaseEnd.AddMonths(delta))
{
_mtm += _squareFeet.Value;
}


Фактически я ввёл ненавистные мне временные переменные.
Но получил 2 разных куска кода с разными намерениями.
Первый - инициализация и границы перебора.
Второй - бизнес-логика.

Ваше предложение?

суббота, 29 сентября 2007 г.

Материалы курсов

Выкладываю материалы презентаций для тренинга "Рефакторинг". Структура тренинга:
1. Философия Рефакторинга
2. Каталог некачественного кода (Code Smells)
3. Каталог рефакторингов
4. Завершение.

http://rapidshare.com/files/59088808/ref001.rar

Дополнительные материалы по другим тренингам:
1) Тренинг MindMap для программистов, аналитиков и руководителей проектов
http://rapidshare.com/files/59092681/mm.rar
2) Материал для тренинга "Управление временем" (Time Managmenent)
Презентации тренинга Time Management (Управление временем)
Видео-ролик. Презентация управление временем на outlook

понедельник, 24 сентября 2007 г.

Как писать качественный код

Три пути (по мере бесполезности)
1) Пригласить меня в свою команду разработки в качестве Scrum Master'a
2) Читать книги (см. ниже)
3) Прийти ко мне на тренинг "Рефакторинг" (Refactoring), "Шаблоны проектирования" (Design Patterns) и другие.

Пробегусь по пункту два. Минимальный набор следующий:
1. Мартин Фаулер. Рефакторинг. Улучшение существующего кода
2. Макконнелл С. Совершенный код
3. Refactoring Workbook By William C. Wake
4. Велкий GoF. Приемы объектно-ориентированного проектирования. Паттерны проектирования.
5. Мартин Фаулер. Архитектура корпоративных программных приложений
6. Джошуа Кериевски. Рефакторинг с использованием шаблонов (паттернов проектирования)
7. Scrum and XP from the Trenches

Если вы детально прочтёте эти книги ваш уровень в написании качественного кода будет очень высокий. Заодно напишите мне письмо -- было бы неплохо узнать ваш отзыв.

суббота, 22 сентября 2007 г.

Jimmy Nillson on Domain Driven Design

http://www.infoq.com/interviews/jimmy-nilsson-domain-driven-design

Хорошенькое интервью с Jimmy Nillson.
Ничего не понятно, но стенограмма помогает.

Любой Agile-разработчик должен иметь DDD под подушкой.

суббота, 15 сентября 2007 г.

Тренинги в Киеве

Пропагандируя Agile и принципы качественного кодирования мне удалось забраться в Киев и прочитать такие тренинги:

1. Design Patterns
2. Refactoring
3. Time Management
4. MindMap

Мне всё это дело понравилось. Особенно "Пузата хата" :)

суббота, 28 июля 2007 г.

C# 3.0 на пальцах

Сегодня я отмечу одну супер важную вещь, которая перевернёт всю идеологию объектного программирования. Это xLinq. SQL запросы для объектной модели. Этот синтаксический сахар грандиозное решение для простых программистов. Увеличивает качество кода в разы, а читаемость просто идеальная.

Выключите музыку, будьте внимательны.

Итак доменная модель. Как часто вам приходилось делать обход коллекции объектов и из них формировать новую? Не знаю как вам, но мне постоянно :)

Получалась следующая убогая конструкция


foreach(...)
...
if(...)
...
if(...)
...
newArray.Add(x);

Теперь этому положен конец.

Используем конструкцию:
var my = from r in people
where r.Age > 25
select r;
или
var my = people.Where(r => r.Age>25);

(что одно и тоже)

Здесь это главное сообразить где условия, где выборка
В примерах под переменной 'r' что-то типа итератора. То есть пробегаемся по массиву people, последовательно, текущая запись это 'r'. После обхода собираеются все записи удовлетворяющие условию и кладутся в 'my'.

То есть Linx это SQL для объектной модели. Просто класс!
Linq - это sql для объектов, xLinq - для xml, dLinq - для баз.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EmptyConsoleApplication
{
class Program
{
public class Person
{
public string FirstName {get; set;}
public string LastName {get; set;}
public int Age {get; set;}
}

static void Main(string[] args)
{
List people = new List
{
new Person {FirstName = "Scott", LastName="Guthrie", Age = 20},
new Person {FirstName = "Andre", LastName="Guthrie", Age = 27},
new Person {FirstName = "Peter", LastName="Guthrie", Age = 26}
};

//var my = people.Where(r => r.Age>25);

var my = from r in people
where r.Age > 25
select r;

foreach (var item in my)
{
Console.WriteLine(item.FirstName + ", " + item.LastName);
}
Console.ReadLine();
}
}
}


И в качестве проверки подумайте, что будет если

var my = from r in people
where r.Age > 25
select new Person { FirstName = r.FirstName, LastName = "UNKNOWN", Age = r.Age };


Для примера использовался виртуальныйы образ Orcas Beta 2 (около 5Гб), скачанный
Visual Studio 2008 Downloads (Напомню после VS2005.Net Beta 2 вышел релиз)

четверг, 12 июля 2007 г.

Visual Studio 2005 Express and Resharper 3.0

Подумалось, а почему бы не поставить Express и поверх него Resharper. А нельзя. В express версии нету Add-on'ов. Поэтому устновить Reshaper на неё нельзя.

Но сделал пару полезных выводов:
1. Visual Studio 2005 Express теперь бесплатная без ограничения.
2. Набивать мелкие задачки и примеры в ней приятнее. Летает.
3. Если ставить из инета, то не нужно тянуть 430 Мб :)

Ссылки:
- Всякие полезные примерчики
- Страница проекта
- Образ ISO (430 Мб)
- FAQ

среда, 11 июля 2007 г.

Spring.NET

Ron Jacobs from Microsoft interviews Mark Pollack to get the skinny on Spring.NET on a Virtual TechEd interview.

Насколько я понял, эта тулза позволит:
- декларативно (через xml) создавать объекты (то есть заменит фабрику)
- сделает прослойку от базы данных
- движок AOP

Если есть желание расширить -- жду комментарии, а то мне тяжело сообразить целесообразность этого движка.

пятница, 22 июня 2007 г.

Resharper 3.0

Вышла свеженькая версия
http://www.jetbrains.net/confluence/display/ReSharper/Download
(http://www.jetbrains.com/resharper/download/index.html)

Основные полезности:
http://www.jetbrains.com/resharper/features/newfeatures.html

Из системных требований:
* Processor: Pentium III 850 Mhz minimum (Pentium IV 1.5 Ghz recommended)
* Memory: 512 Mb minimum (1Gb recommended)
* Disk space: 100 Mb
* Operating System: Microsoft Windows 2000/XP/Vista
* Software installed: Microsoft Visual Studio 2005 with Service Pack 1 or Microsoft Visual Studio 2008 codename "Orcas" Beta (experimental support)

четверг, 21 июня 2007 г.

Web Services

C 27-29 на площадке Люксофта будет проводится курс по Web-Services.
Курс будет компиляция для нужд компании материалов по тренингам Course 2548, Course 2549 (тренинги подготовки к сертификации - MCTS: .NET Framework 2.0 Distributed Applications)

Смотрю, какое состояние в Microsoft по этим делам

Книжки:
MCTS Self-Paced Training Kit (Exam 70-529): Microsoft .NET Framework 2.0 Distributed Application Development

ПОДГОТОВКА: MSC-010 WebServices
http://search.microsoft.com/results.aspx?mkt=en-US&setlang=en-US&q=webcast+web+services
http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032265801&Culture=en-US MSDN Webcast: Web Services (Level 300)
http://support.microsoft.com/kb/821377/ Support WebCast: Introduction to Microsoft Web Services Enhancements
http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?culture=en-US&EventID=1032299316&CountryCode=US
MSDN Architecture Webcast: Introducing Web Services Enhancements for Microsoft .NET (WSE) 3.0 (Level 200)
http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?culture=en-US&EventID=1032284289&CountryCode=US
MSDN Webcast: Introducing Web Services in SQL Server 2005 (Level 200)


Web Services Enhancements (WSE)
http://msdn2.microsoft.com/en-us/webservices/aa740663.aspx
http://msdn2.microsoft.com/en-us/webservices/aa740663.aspx#wse3video

INSTALL
Web Services Enhancements (WSE) 3.0 for Microsoft .NET
http://www.microsoft.com/downloads/details.aspx?familyid=018A09FD-3A74-43C5-8EC1-8D789091255D&displaylang=en

вторник, 12 июня 2007 г.

Business Intelligence (BI)

Завтра начну 3 дневный курс Course 2796. Designing an Analysis Solution Architecture Using Microsoft SQL Server 2005 Analysis Services на площадке Люксофта.

Курс расчитан на BI-разработчиков. Так звучит в официальной документации :) А по простому - есть решение типа Access с мелкими нюансами и нужно научиться им пользоваться. Прорабатываются концепции и идеология BI.

Кстати о концепци. В отличии от Access здесь вместо одного приложения для одного пользователя аж-но три - для целого предприятия :)

Три составляющих успеха:
1) Нужно получить данные из кучи мест. Используем SSIS
2) Было бы неплохо эти данные причесать к одному виду и заранее предоставить нужные выборки - то есть сделать OLAP-куб. Для этого изучаем SSAS
3) Отдать конечному пользователю - картинки, отчёты, таблицы, и главное интерактивно и через Web. Изучаем - SSRS

Всё :) Если объяснений в 3 пункта не хватило -- смотрим курс BI на SQL 2005


Справка. OLTP-база отличается от OLAP-базы по принципу использования. Если OLTP это наша любимая база, в которую мы пишем, читаем и модифицируем со скоростью наших мыслей (SELECT, UPDATE...), то OLAP-база заточена только на SELECT. Соотвесно в ней всё наоборот. Нам нужно ускорить выборки, а не бороться с дубликацией денных. Как? Денормализация и другие ухищрения, о которых идёт речь на курсе.


Источники. Незаменимым подспорьем во время подготовки были:
SQL Server 2005 Analysis Services Tutorial - тут примерчики посмотреть
SQL Server Analysis Services - а здесь про концепции и понятия почитать
Chapter 17: Data Warehouse Design - Глава из книги про SQL 2000, где разъясняется про SCD и RCD
Главный ресурс по технологии SSAS - там внизу есть webcasts (например: SQL Server Video Tour)

воскресенье, 10 июня 2007 г.

Microsoft по-русски

Много раз слышал, да может и сам говорил: "Почему Билл Гейтс не русский".
Хотя по некоторым сведениям его помощник собрался покататься на нашем космическом корабле и одно из условий подучить русский. Видать и Гейтс решил не отставать и дал команду переводить MSDN на русский :)

Документация по MS SQL Server 2005

а самое приятное - Русский MSDN Magazine

Конечно читать по-русский приятней. Но иногда перевод вводит в тупик.

Пример: тема Агрегаты из SSAS 2005.
"Агрегаты — это предварительно вычисляемые сводные данные конечных ячеек"
а вот оригинал: "Aggregations are precalculated summaries of data (nonleaf cells) that improve query response time by preparing the answers before the questions are asked"
Оригинал оказался понятней и чётко подчёркивает nonleaf cells. В русском эквиваленте я даже не придал значения этому факту.

среда, 6 июня 2007 г.

Friends из C++ в C#

NUnit.
Вопрос: где разместить код теста.
Проблема: чтобы достучаться до закрытых методов и полей класса.
Решение: reflection или внутри сборки.

На самом деле эта проблема может быть решена с использование модификатора доступа "friend", который был в С++, но отсутствует с языке С#.

Теперь это можно сделать декларативно. В нашем классе объявить друзей:


[assembly:InternalsVisibleTo("cs_friend_assemblies_2")]
class Class1 ...

А используем так:

// compile with: /reference:cs_friend_assemblies.dll /out:cs_friend_assemblies_2.exe
public class M
{
static void Main()
{
Class1 a = new Class1();
...


http://msdn2.microsoft.com/en-gb/library/0tke9fxk.aspx
http://www.infoq.com/news/2007/06/Friend-Assemblies

суббота, 2 июня 2007 г.

В C# много синтаксического сахара

Перечитываю Рихтера первое издание. Так фраза Кирилла, что в c# много синтаксического сахара , просто позволяет совсем другими глазами на многое взглянуть.

и ведь точно много сахара. например:
yield - скрывает под собой нумератор, то есть просто обёртка над классом (реализация паттерна Iterator)
delegate - тоже обёртка над классом (реализация паттерна Observer, но можно приспособить и для Command, Strategy и другие)
event - расставляет private для delegate, то есть тоже класс обёртка над другим классом обёрткой - delegate (реализация Observer чистой воды).

Как много условностей, но и в тоже время красиво!

Refactoring: Replace Nested Conditional with Guard Clauses

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


public bool MyFunc()
{
if(IsEnable() &&
TabbedMdiManager != null &&
TabbedMdiManager.ActiveTab != null &&
TabbedMdiManager.ActiveTab.IsSelected &&
(TabbedMdiManager.ActiveTab.Form as BaseForm).Navigate())
{
return true;
}
else
{
return false;
}

}

Ради чего делалась проверка условий, если потом пишем два блока с return загадка.
Поэтому без большой науки я преобразовал код к следующему виду:

Вариант 1.

return (IsEnable()
&& TabbedMdiManager != null
&& TabbedMdiManager.ActiveTab != null
&& TabbedMdiManager.ActiveTab.IsSelected
&& (TabbedMdiManager.ActiveTab.Form as BaseForm).Navigate());

Здесь ВАЖНО: 1) return 2) начинать новую строку && - сразу визуально видно в чём попс.

После мелких раздумий, казалось бы ничего нам не мешает написать так:

Вариант 2.

bool NoMdi = TabbedMdiManager != null;
bool NoActiveTab = TabbedMdiManager.ActiveTab != null;
bool IsSelected = TabbedMdiManager.ActiveTab.IsSelected;
bool DoesNavigate = (TabbedMdiManager.ActiveTab.Form as BaseForm).Navigate();

return InEditMode() && NoMdi && NoActiveTab && IsSelected && DoesNavigate;

Или так:

Вариант 3.

bool x = IsEnablee();
x = x && TabbedMdiManager != null && TabbedMdiManager.ActiveTab != null && TabbedMdiManager.ActiveTab.IsSelected;
x = x && (TabbedMdiManager.ActiveTab.Form as BaseForm).Navigate();
return x;


Но оба вариант (2) и (3) имеют ошибку. Оператор if может завершить вычисление не дойдя до конца логического выражения.
А вот вариант 2 и 3 такое не могут. Соответствено мы получим исключение во время проверки, например в строчке IsSelected.


Но если посмотреть на код с другой стороны. То можно увидеть, что первые 4 проверки являются стороживыми условиями для выполнения функции Navigate().
Соответственно используем метод "Replace Nested Conditional with Guard Clauses" получаем:

Вариант 4.

public bool MyFunc()
{
If( !InEnable() ) return false;
If(TabbedMdiManager == null ) return false;
If(TabbedMdiManager.ActiveTab == null ) return false;
If(!TabbedMdiManager.ActiveTab.IsSelected ) return false;
if(!(TabbedMdiManager.ActiveTab.Form is BaseForm)) return false;

return TabbedMdiManager.ActiveTab.Form.Navigate());
}

Вывод: Вариант 1. Затрудняет отладку -- не понятно, какое условие сработало. Нужно делать дополнительные телодвижения.

вариант 2, 3 - содержат ошибку, которая заложена в if. В исходном коде делается предположение, что все хорошо
знают, что if может и не дойти до конца.

Вариант 3. Вводит новую локальную переменную, тем более накапливающуюся -- это не очень хорошее решение.
Новая локальная переменная без надобности и упрощения только усложняют чтение кода. Теперь мне прийдётся в
голове накапливать результат :)

Вариант 4. К нему нужно привыкнуть. Множественный выход - религиозные войны. Но для проверки входных условий -- очень мощный механизм. Ещё один минус -- важен порядок. Последовательные строки с if...return могут создать ложное предположение, что строчки можно поменять местами.

Вывод: народ проголосовал за вариант 1. Я остался при своём (вариант 4).

А проблема одна: условия связанные и их раздирать по варианту (2) и (3) нельзя.

Полезно:
http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html


Кстати, сейчас проголосовало несколько человек за варианты. Если бы не было ошибок, то за

вариант 1 - отдано 2 голоса
вариант 2 - отдано 1,5 голоса
вариант 3 - отдан 1 голос
вариант 4 - 0.5 голоса

я отдал за (2) и (4) вариант, так как оба хороши. Всё зависит являются ли части логического выражения граничными условиями или нет.

пятница, 1 июня 2007 г.

Среда для разработки.

Что нужно для разработчика. Visual Studio? А ннет. Нужно многое, чтобы было качествено и хорошо.

Например боевой комплект может выглядить так:
jira- управление требованиями, задачами, версиями и багтрэкер
confluence - любой проект содержит 2 вещи: программа и документ. Это IDE для создания документа на базе WIKI.
subversion - репозиторий для хранения кода
cruise control - сборка, которая может подхватывать любые другие плагины (о них ниже)
nunit - тестирование
nant - гибкий билд процесс
fxcop - главныйы инструмент качественного кодирования

Сейчас это дело соберу на виртуальной машине -- и можно будет пользоваться пока trial позволяет :)