понедельник, 27 сентября 2010 г. - www.msmirnov.ru

Нумерация версий продукта в TFS (Team Foundation Server)

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

1. Я отказался от использования свойства Iteration Path, которое содержало номер текущей итерации проекта.

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

Свойство Iteration Path в принципе выполняло отлично свою функцию (тем более что оно было связано в деревом папок в Team Queries), если бы не одно обстоятельство - для него нельзя было устанавливать значения по умолчанию, запрещенные значения и т.п.
Это приводило к тому, что члены команды, которое мало работают с TFS, путались, забывали выставлять это значение, оставляли в качестве значения корневой элемент дерева и т.п. В будущем это стало бы создавать еще большую путаницу, так как с временем количество версий будет увеличиваться и сотрудникам пришлось бы постоянно работать с длинным списком версий, что неудобно.

Так что я убрал свойство Iteration Path с форм ввода ошибок и задач и заменил его на новое поле Version, которому уже задал список значений, соответствующих списку доступных номеров версий продукта. Для поля я Version задал значение по умолчанию, соответствующий текущему номеру версии, так что никто теперь по идее не будет путаться, какую версию выставить. А для задач и багов, запланированных на следующую версию можно всегда вручную установить следующее значение.

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

Хотя конечно если что-то будет неудобно, то будем менять.

2. Я уменьшил количество запросов в Team Queries.
Ранее я писал, что у меня были такие запросы, как My current tasks, My current bugs, All tasks, All bugs и т.д.

Сейчас я оставил в каждой версии продукта только по два запроса: My current work и Tasks and bugs.
- My current work отображает для каждого сотрудника список его активных задач и ошибок, относящихся к выбранной версии.
- Tasks and bugs содержит все задачи и ошибки данной версии.

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

Кроме того, безотносительно версий, я оставил следующие запросы:
- All my work - отображает всю историю задач и ошибок для данного сотрудника.
- All work items - отображает все work items.
- List fixes - отображает список багов и задач, выполненных за последние два дня. Очень удобно для отслеживания прогресса работы.
- My current work - отображает все активные задачи и баги, назначенные на данного сотрудника.

Таким образом, дерево запросов сейчас имеет следующий вид:


Название папок в дереве как и раньше соответствуют версиям продукта.

Продолжение темы - здесь.

P.S.
Другие мои посты на тему TFS:
1. Миграция в TFS (Team Foundation Server)
2. Кто ошибку создает - тот ее и проверяет?
3. Нумерация версий продукта в TFS (Team Foundation Server)
4. Учет трудозатрат и отчетность в TFS (Team Foundation Server)
5. Как создать work item в TFS (Team Foundation Server) из письма в Outlook
6. Как поместить свой control на форму Work Item в TFS (Team Foundation Server)
7. Как настроить номер итерации по умолчанию в TFS (Team Foundation Server)
Мой сайт - www.msmirnov.ru

пятница, 24 сентября 2010 г. - www.msmirnov.ru

Application Developer Days 2010. Ярославль, 24 Сент. День2

Итак, сегодня состоялся второй день конференции Application Developer Days 2010 в Ярославле. Описание первого дня можно посмотреть здесь.

На второй день лично мне наиболее интересными показались два доклада:
1. Разработка для Windows Phone 7, которую читал Михаил Черномордиков из Microsoft.
2. Как начать разрабатывать для iPhone, которую читал Никита Фролов.

На обоих докладах освещались примерно одни и те же вопросы в плане разработки мобильных приложения для WP7 и для iPhone, поэтому посмотреть их в сравнении было особенно интересно.

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

Судя по докладам (и такое впечатление сложилось не только у меня) разработка для WP7 представляет собой намного более простую и удобную для решения задачу, нежели для iPhone.

В частности:
1. Для WP7 можно в среде .NET разрабатывать SilverLight и XNA-приложения на C# или Visual Basic.NET, что намного более удобно чисто с точки зрения IDE, чем связка MacOS + xCode + Objective C.

2. Эмулятор WP7 в Visual Studio обеспечивает полную эмуляцию работы устройств на базе WP7. Эмулятор xCode не может проэмулировать iPhone полностью- разрабатывать можно только имея под рукой iPhone.

3. Objective C намного менее удобен в использовании, чем C#. В частности, он не обладает сборщиком мусора и имеет менее удобный синтаксис.

4. Visual Studio позволяет производить запуск и отладку приложений непосредственно на телефоне любому разработчику, в то время как xCode - только сертифицированному и только на своем личном телефоне.


В общем и целом после этих двух докладов у слушателей появилось желание написать что-то для WP7 и не писать для iPhone.

Остальные доклады мне показались менее интересными - Domain Driven Design Андрея Бибичева был довольно интересным, но я уже видел его раньше на видео.
Мой сайт - www.msmirnov.ru

четверг, 23 сентября 2010 г. - www.msmirnov.ru

Application Developer Days 2010. Ярославль, 23 Сент. День1.

Сегодня прошел первый день конференции Application Developer Days 2010 в Ярославле.

Доклады. которые мне показались наиболее интересными:

1. Деньги и внутренние часы разработчика. Доклад читал Антон Овчинников, ярославская компания Individ.
Доклад был посвящен обзору финансовых конфликтов между сотрудником и работодателем в сфере ИТ и методам их разрешений.

Наиболее интересными мне показались следующие тезисы:
- С 2000-го года в компании Individ полностью открыта финансовая информация по зарплатам сотрудников. Т.е. зарплаты всех сотрудников стали известны всем. После этого часть сотрудников уволилась. Оставшиеся сотрудники повысили эффективность работы компании. Вновь приходящие сотрудники уже поддерживали высокую эффективность.

- В компании работает около 35 человек. Несколько раз они проводили замеры и выяснили, что в каждый момент времени работает не более 13-ти человек. Остальные болеют, в отпуске, куда-то едут, курят, пьют чай, идут от стола к столу, разговаривают не по работе, лазят в интернете, общаются по аське и т.п.

- Формула E = IQ x EQ^2 - эффективность сотрудника равна произведению его IQ на эмоциональный коэффициент в квадрате. IQ человека формируется к 13-14 годам и больше не развивается, а EQ можно развивать всю жизнь.


- Людей при найме на работу оценивают не по знаниям, а по их жизненным позициям.

- Среднее время работы программиста в компании - 3 года.

2. Дополненная реальность через web-камеру. Доклад читал Михаил Кокорев.
Доклад был посвящен методам и библиотекам распознавания видео-изображений и выполнения с ними различных операций.

Какие методы заполнились больше всего:
- Распознавание маркеров. На камеру показываются маркеры - специальные заранее известные символы - например, человек может налепить себе такой символ на лоб. Библиотека-обработчик определяет его и производит обработку. Например, рисует вместо него шлем. Получается человек в шлеме. Примеры библиотек - NyARToolkit, SLARToolkit (для SilverLight), FLARToolkit (для Flash).

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

Пример приложения, использующего алгоритм SURF (написан кстати на .NET):
Программа находит книжку из, которую ей показали на камеру:


- Распознавание лиц. Бесплатная библиотека FaceLight для SilverLight и платная Luxand Face SDK, которая может определять лица и части лиц - глаза, брови, следить за поворотом головы и т.п.

Хотелось также посетить доклад Искуственный интеллект в играх, но к сожалению не успел. Надеюсь посмотреть его на видео.

Завтра ждет второй день.

P.S. Несколько фотографий:
Мой сайт - www.msmirnov.ru

среда, 22 сентября 2010 г. - www.msmirnov.ru

Лекция Андрея Маркеева "Введение в SharePoint 2010"

В прошлую пятницу по моей просьбе Андрей Маркеев прочитал нам вводную лекцию "Введение в SharePoint 2010".
Андрей имеет большой опыт разработки под SharePoint 2007 и 2010 и за банку меда с моей пасеки он любезно согласился прочитать нам обзорную лекцию, посвященную архитектуре SharePoint 2010, способам разработки в Visual Studio 2010 для SharePoint 2010, области его применения, его достоинствам и недостаткам.

Видео лекции, которое снимал Андрей Гребенщиков, доступно здесь:

Мой сайт - www.msmirnov.ru

пятница, 10 сентября 2010 г. - www.msmirnov.ru

HP нас подводит...

С начала лета используем три довольно серъезных сервера HP ProLiant DL380 G6 (http://h10010.www1.hp.com/wwpc/ru/ru/sm/WF06a/15351-15351-3328412-241475-241475-3884082.html).
На каждом сервере установлено по 8 SAS-дисков HP EG0300FARTT.

Дак вот - диски мрут с завидной регулярностью.
За три месяца умерло три диска.

Если бы не грамотный RAID и резервные копии, потери данных были бы смертельными.

Вот вам и брэнд...
Мой сайт - www.msmirnov.ru

четверг, 9 сентября 2010 г. - www.msmirnov.ru

Почему менеджеры не учатся...

Сегодня наткнулся на интересное видео "Почему менеджеры не учатся"



Наиболее интересными мне показались рассуждения о "цикле менеджера" - очень точно подмечено...

Рекомендую посмотреть всем заинтересованным.
Мой сайт - www.msmirnov.ru

четверг, 2 сентября 2010 г. - www.msmirnov.ru

Небольшой сравнительный домашний тест SSD и HDD для SQL Server.

Итак, в мои руки попало SSD-устройство Intel X25-V, чью производительность я и решил проверить через призму работы с базами данных.
Версия устройства, конечно, не серверная, но, как говорится, что имеем то и тестим.

Итак, я создал две новые базы SQL Server 2008 - одну на HDD (Seagate ST380815 - старая модель, но так даже лучше - видна динамика), другую на SSD и выполнял на них идентичные запросы.

Перед каждым тестом я сбрасывал буферы SQL Server.

Изначально я создал по одной таблице в каждой базе:

create table TestTable (ID int identity (1, 1), dt datetime, TextData varchar (255))

Сначала проверил последовательную вставку 1 000 000 записей:

declare @i int, @d int
declare @dt datetime

set @i = 1
 while @i <= 1000000
  begin
    set @d = convert (int, (RAND () * 365))
    set @dt = dateadd (day, @d, '2010-01-01')

    insert into TestTable (dt, TextData)
    values (@dt, convert (varchar (255), NEWID ()))

    set @i = @i + 1
  end

Результат: HDD - 4:45,  SSD - 3:03


Затем я выполнил массовую вставку 1000000 записей:

select * into TestTable2
from TestTable
 
Результат: HDD - 0:08, SSD - 0:03
 
 
Далее - создание кластерного индекса.
 
create clustered index cIndex on TestTable (dt)
 
Результат: HDD - 0:07, SSD - 0:04



Случайное чтение 100 000 записей индексированной таблицы:


declare @i int, @d int
declare @dt datetime
declare @TextData varchar (255)

set @i = 1

while @i <= 100000
  begin
    set @d = convert (int, (RAND () * 365))

    set @dt = dateadd (day, @d, '2010-01-01')

    select @TextData = TextData from TestTable where dt = @dt

    set @i = @i + 1
  end


Результат: HDD - 1:57, SSD - 1:38  


Случайное чтение 1 000 записей неиндексированной таблицы:


declare @i int, @d int
declare @dt datetime
declare @TextData varchar (255)

set @i = 1

while @i <= 1000
  begin
    set @d = convert (int, (RAND () * 365))

    set @dt = dateadd (day, @d, '2010-01-01')

    select @TextData = TextData from TestTable2 where dt = @dt

    set @i = @i + 1
  end


Результат: HDD - 1:38, SSD - 1:39  
Как видим, здесь оценить разницу не удалось, поскольку вся таблица целиком была скеширована при первом обращении и в дальнейшем происходила работа уже с кешем, а не с физическим носителем.

Последовательное чтение записей индексированной таблицы:

select *
from TestTable
where dt between '2010-05-01' and '2010-06-30'

Результат: HDD - 206 мс, SSD - 36 мс


Последовательное чтение записей неиндексированной таблицы:

select *
from TestTable2
where dt between '2010-05-01' and '2010-06-30'

Результат: HDD - 70 мс, SSD - 11 мс

Еще раз приведу итоги своего тестирования в сводной таблице

ОперацияHDDSSD
Последовательная вставка 1 000 000 записей4:453:03
Массовая вставка 1 000 000 записей0:080:03
Создание кластерного индекса0:070:04
Случайное чтение 100 000 записей индексированной таблицы1:571:38
Случайное чтение 1 000 записей неиндексированной таблицы1:381:39
Последовательное 100 000 чтение записей индексированной таблицы206 мс36 мс
Последовательное 100 000 чтение записей неиндексированной таблицы70 мс11 мс

Мой вывод - на всех операциях SSD быстрее, особенно на массовых.
Мой сайт - www.msmirnov.ru