В ближайшее время я собираюсь посетить город Омск, где буду читать следующие курсы:
Основы планирования и организации собственного времени - 25 октября
Использование техники Mind Maps для IT - 23 октября
Шаблоны проектирования - 20 октября
Рефакторинг кода - 20 октября
А чуть раньше будут проходить курсы в Москве:
Рефакторинг кода - 1 октября
Шаблоны проектирования масштаба предприятия - 9 октября
Шаблоны проектирования - 26 ноября
воскресенье, 30 сентября 2007 г.
Курсы октябрь-ноябрь 2007
на
21:27
0
коммент.
Ярлыки: Тренинги
суббота, 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
на
19:07
0
коммент.
Ярлыки: Тренинги, MindMap, Time Management
понедельник, 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
Если вы детально прочтёте эти книги ваш уровень в написании качественного кода будет очень высокий. Заодно напишите мне письмо -- было бы неплохо узнать ваш отзыв.
на
00:01
0
коммент.
Ярлыки: Agile, e-books, Patterns, Refactoring
суббота, 22 сентября 2007 г.
Jimmy Nillson on Domain Driven Design
http://www.infoq.com/interviews/jimmy-nilsson-domain-driven-design
Хорошенькое интервью с Jimmy Nillson.
Ничего не понятно, но стенограмма помогает.
Любой Agile-разработчик должен иметь DDD под подушкой.
на
03:11
0
коммент.
суббота, 15 сентября 2007 г.
Тренинги в Киеве
Пропагандируя Agile и принципы качественного кодирования мне удалось забраться в Киев и прочитать такие тренинги:
1. Design Patterns
2. Refactoring
3. Time Management
4. MindMap
Мне всё это дело понравилось. Особенно "Пузата хата" :)
на
13:30
0
коммент.
Ярлыки: Тренинги
суббота, 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)
{
Listpeople = 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 вышел релиз)
на
13:25
1 коммент.
Ярлыки: C#
четверг, 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:33
0
коммент.
Ярлыки: Microsoft
среда, 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:16
1 коммент.
Ярлыки: Agile Tools, C#
пятница, 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)
на
15:27
0
коммент.
Ярлыки: Agile Tools, C#
четверг, 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
на
18:34
1 коммент.
Ярлыки: Тренинги
вторник, 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)
на
17:32
1 коммент.
воскресенье, 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. В русском эквиваленте я даже не придал значения этому факту.
на
21:54
0
коммент.
среда, 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
на
10:09
0
коммент.
Ярлыки: C#
суббота, 2 июня 2007 г.
В C# много синтаксического сахара
Перечитываю Рихтера первое издание. Так фраза Кирилла, что в c# много синтаксического сахара , просто позволяет совсем другими глазами на многое взглянуть.
и ведь точно много сахара. например:
yield - скрывает под собой нумератор, то есть просто обёртка над классом (реализация паттерна Iterator)
delegate - тоже обёртка над классом (реализация паттерна Observer, но можно приспособить и для Command, Strategy и другие)
event - расставляет private для delegate, то есть тоже класс обёртка над другим классом обёрткой - delegate (реализация Observer чистой воды).
Как много условностей, но и в тоже время красиво!
на
19:38
1 коммент.
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) вариант, так как оба хороши. Всё зависит являются ли части логического выражения граничными условиями или нет.
на
17:48
2
коммент.
Ярлыки: Patterns, Refactoring
пятница, 1 июня 2007 г.
Среда для разработки.
Что нужно для разработчика. Visual Studio? А ннет. Нужно многое, чтобы было качествено и хорошо.
Например боевой комплект может выглядить так:
jira- управление требованиями, задачами, версиями и багтрэкер
confluence - любой проект содержит 2 вещи: программа и документ. Это IDE для создания документа на базе WIKI.
subversion - репозиторий для хранения кода
cruise control - сборка, которая может подхватывать любые другие плагины (о них ниже)
nunit - тестирование
nant - гибкий билд процесс
fxcop - главныйы инструмент качественного кодирования
Сейчас это дело соберу на виртуальной машине -- и можно будет пользоваться пока trial позволяет :)
на
18:35
1 коммент.
Ярлыки: Agile Tools, IDE