Персональные инструменты
 

ShowTeamWork — различия между версиями

Материал из CustisWiki

Перейти к: навигация, поиск
м (1 версия)
м (Где скачать?)
Строка 33: Строка 33:
 
{{question}} Может посчитать {{bad-words|метрики}}? Ненавистные [[RuPedia:Количество_строк_кода|SLOC]] и иже с ними?  
 
{{question}} Может посчитать {{bad-words|метрики}}? Ненавистные [[RuPedia:Количество_строк_кода|SLOC]] и иже с ними?  
 
Да, такие инструменты есть:
 
Да, такие инструменты есть:
* [http://www.statsvn.org/ StatSVN] Примеры: [http://www.statsvn.org/demo/continuum/], [http://www.statsvn.org/demo/jodatime/], [http://www.statsvn.org/demo/ruby/], [http://www.statsvn.org/demo/ant/], [http://www.statsvn.org/demo/synapse/], [http://www.statsvn.org/demo/synapse/], [http://www.statsvn.org/demo/qalab/],…  
+
* [http://www.statsvn.org/ StatSVN]. Примеры: [http://www.statsvn.org/demo/continuum/], [http://www.statsvn.org/demo/jodatime/], [http://www.statsvn.org/demo/ruby/], [http://www.statsvn.org/demo/ant/], [http://www.statsvn.org/demo/synapse/], [http://www.statsvn.org/demo/synapse/], [http://www.statsvn.org/demo/qalab/],…  
  
 
В зависимости от глубины детализации можно получить:
 
В зависимости от глубины детализации можно получить:
Строка 59: Строка 59:
 
* [http://code.google.com/p/codeswarm/ CodeSwarm].  
 
* [http://code.google.com/p/codeswarm/ CodeSwarm].  
 
* {{good-words|Самая древняя!}} (год с копейками).
 
* {{good-words|Самая древняя!}} (год с копейками).
* Визуализация физической модели {{good-words|«Люди и файлы»}} (на самом деле '''4'''-ре модели: «Simple», «Chaotic», «Maxwell», «Legacy»).
+
* Визуализация физической модели {{good-words|«Люди и файлы»}} (на самом деле '''4'''-ре модели: «Simple», «Chaotic», «Maxwell», «Legacy», но не все они «одинаково полезны», наиболее разумная — «Simple»).
  
 
=== Основная идея ===
 
=== Основная идея ===
  
 
** «Люди» не любят друг друга — {{bad-words|отталкиваются!}}
 
** «Люди» не любят друг друга — {{bad-words|отталкиваются!}}
** «Файлы» тоже {{bad-words|отталкиваются!}} «обратно пропорционально расстоянию»
+
** «Файлы» тоже {{bad-words|отталкиваются!}} «обратно пропорционально расстоянию».
 
** «Людей» и «Файлы» {{good-words|притягивает при коммитах}}!
 
** «Людей» и «Файлы» {{good-words|притягивает при коммитах}}!
 
** «Люди» {{good-words|сближаются из-за совместной работы}} над одними файлами
 
** «Люди» {{good-words|сближаются из-за совместной работы}} над одними файлами
Строка 75: Строка 75:
 
* Цветной пульс проекта в динамике.
 
* Цветной пульс проекта в динамике.
  
=== Что не хватает? ===
+
== Gource ==
 +
=== Основная идея ===
 +
 
 +
* Визуализация и {{good-words|структур каталогов}} («облака имен»)!
 +
* Модель {{good-words|«Пчелы» и «цветы»}}!
 +
* Видны:
 +
** «Горячие зоны».
 +
** {{good-words|Кроссфункциональные}} парни.
 +
** {{bad-words|Заброшенные}} люди и код.
 +
 
 +
 
 +
 
 +
 
 +
== Что не хватает? ==
 
{{important}} Именно поэтому «самодельных»  {{bad-words|визуализаций — почти нет}}!
 
{{important}} Именно поэтому «самодельных»  {{bad-words|визуализаций — почти нет}}!
  
Строка 85: Строка 98:
 
** {{good-words|«эволюционные доработки»}} — легко и быстро «править кино».
 
** {{good-words|«эволюционные доработки»}} — легко и быстро «править кино».
  
{{important}} [[#Наш фреймворк|Наше решение]] {{good-words|все это делает}}!
 
  
=== Примеры ===
+
== Наш фреймворк ShowTeamWork==
  
==== Bugzilla ====
+
{{important}} Наше решение {{good-words|все это делает}}!
  
<html><center>
+
А именно:
<object width="640" height="360"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6354663&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=6354663&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="360"></embed></object>
+
* Вытаскивается лог-информация, если запустить в workspace проекта под какой-нибудь из известных VCS — поддерживаются самые распространенные системы контроля версий: <tt>CVS</tt>, <tt>SVN</tt>, <tt>GIT</tt>, <tt>Bazaar</tt><tt>Mercurial</tt> (в принципе — можно визуализировать любую активность, хоть торговлю трейдеров).
</center>
+
* Автоматически выбирается набор подкаталогов проекта с наибольшей активностью.
</html>
+
* Для них генерируется случайная цветовая палитра, с взаимоконтрастными и яркими цветами.
 +
* При отсутствии «сценария субтитров» — генерируется шаблон-заготовка.
 +
* При отсутствии аудио сопровождения — предлагает заготовленную музыку в стиле «Ambient»
 +
* Порождает видео, с длительностью равной аудиозаписи, и накладывает субтитры, вычисляя их из формата «сценария субтитров», где события привязаны к датам.
  
==== MediaWiki ====
+
=== Примеры ===
  
 
+
Альбом готовых визуализаций для известных софтверных проектов (
== Gource ==
+
<tt>bugzilla</tt>,
=== Основная идея ===
+
<tt>bzr-svn</tt>,
 
+
<tt>codeswarm</tt>,
* Визуализация и {{good-words|структур каталогов}} («облака имен»)!
+
<tt>ffmpeg</tt>,
* Модель {{good-words|«Пчелы» и «цветы»}}!
+
<tt>freemind</tt>,
* Видны:
+
<tt>git</tt>,
** «Горячие зоны».
+
<tt>gource</tt>,
** {{good-words|Кроссфункциональные}} парни.
+
<tt>inkscape</tt>,
** {{bad-words|Заброшенные}} люди и код.
+
<tt>mediawiki</tt>,
 
+
<tt>mercurial</tt>,
== Наш фреймворк ==
+
<tt>mplayer</tt>,
 +
<tt>postgres</tt>,
 +
<tt>subversion</tt>,
 +
<tt>viewvc</tt>) можно посмотреть [http://vimeo.com/album/160744 здесь].
  
 
=== Мы используем ===
 
=== Мы используем ===
Строка 119: Строка 137:
 
* [http://ffmpeg.org/ FFmpeg] (LGPL or GPL).
 
* [http://ffmpeg.org/ FFmpeg] (LGPL or GPL).
  
А также несколько треков свободно доступной электронной музыки от [http://tunguskagrooves.com/ Tunguska Music Society] (License: Creative Commons).
+
А также несколько треков свободно доступной электронной музыки от [http://tunguskagrooves.com/ Tunguska Music Society] (<tt>License: Creative Commons</tt>).
 
Если вы поленитесь искать музыку — мы сделаем клип на базе случайного трека (несколько треков идут в комплекте).
 
Если вы поленитесь искать музыку — мы сделаем клип на базе случайного трека (несколько треков идут в комплекте).
 
Бесплатно и патриотично!
 
Бесплатно и патриотично!
 
Если хотите публиковать свои ролики, напоминаем о пока еще существующих цифровых правах на музыку и рекомендуем использовать только свободно доступную музыку — [http://www.jamendo.com/en/tag/ambient тут огромный выбор музыки в стиле Ambient].
 
Если хотите публиковать свои ролики, напоминаем о пока еще существующих цифровых правах на музыку и рекомендуем использовать только свободно доступную музыку — [http://www.jamendo.com/en/tag/ambient тут огромный выбор музыки в стиле Ambient].
 +
 +
=== Быстрый старт ===
 +
 +
{{caution}} Для Windows-пользователей. Linux-пользователи, думаю, поймут сами, что и как.
 +
 +
Скачайте [http://code.google.com/p/showteamwork/downloads/ дистрибутив], распакуйте куда-нибудь его.
 +
 +
 +
Зайдите в каталог проекта, т.е. воркспейс под одной из систем контроля версий ( <tt>CVS</tt>, <tt>SVN</tt>, <tt>GIT</tt>, <tt>Bazaar</tt>,  <tt>Mercurial</tt>), причем не обязательно верхний уровень — можно на два-три уровня ниже, и вызовите
 +
<tt>showteamwork.exe</tt>, и отправляйтесь пить кофе.
 +
 +
В конце работы вы получите в каталоге, в котором его запустили пару видеофайлов (с <tt>codeswarm</tt> и <tt>gource</tt> визуализациями, по именам все будет понятно), а также вспомогательные файлы настроек и аудио, с префиксом <tt>stw-</tt>.
 +
 +
Далее, вы сможете редактировать эти файлы, подбирая оптимальные настройки, подходящую музыку, и редактируя историю проекта в субтитрах, и по окончании редактирования, перезапускайте <tt>showteamwork.exe</tt>.
 +
 +
Пересчет будет относительно экономичным — например, если вы меняли только параметры относящиеся к <tt>codeswarm</tt>-визуализации, то gource-визуализация пересчитыватся не будет, а если правили только субтитры — то будет выполнятся только наложение субтитров, без вызова <tt>gource</tt> или <tt>codeswarm</tt>.
 +
 +
Более детально, схема генерации описана ниже.
  
 
=== Схема генерации ===
 
=== Схема генерации ===
Строка 128: Строка 164:
 
<graph>
 
<graph>
 
digraph G{
 
digraph G{
   rankdir=LR
+
   rankdir=TB
  
 
   edge [color=blue]
 
   edge [color=blue]
Строка 134: Строка 170:
 
   node [style=filled shape=note]
 
   node [style=filled shape=note]
 
   node [fillcolor="goldenrod1" shape=box3d]
 
   node [fillcolor="goldenrod1" shape=box3d]
   "Лог-файл"  
+
   workspace [label="Workspaсe-каталог \n под VCS" shape=folder]
 +
  svcslog [label="Входной лог-файл: \n cvs.log, svn.log, git.log, \n bzr.log, hg.log, activity.xml"]
 +
  getlog [label="Генератор лога: \n «getlog.py»" URL="#getlog.py"]
 +
 
 +
 
  
 
   node [fillcolor=aliceblue shape=note]
 
   node [fillcolor=aliceblue shape=note]
  "Музыка" 
 
  "Настройки"
 
  "Сценарий"
 
  
   node [fillcolor="#0084FF" shape=egg]
+
   svcslog ->  vcslog0
   "Кеш-данные" "Субтитры"
+
  vcslog0 ->  vcslog [label="есть"]
 +
   vcslog1 ->  vcslog [label="есть"]
 +
  vcslog2 ->  vcslog [label="есть"]
 +
  vcslog0 -> vcslog1 -> vcslog2 [label="нет" color=red]
 +
  getlog  ->  vcslog1
 +
  workspace -> vcslog2
  
 +
  vcslog0 [label="лог-файл"]
 +
  vcslog1 [label="лог-файл"]
 +
  vcslog2 [label="лог-файл"]
 +
  vcslog [label="Лог-файл: \n cvs.log, svn.log, git.log, \n bzr.log, hg.log, activity.xml"]
 +
 +
  node    [fillcolor="#0084FF" shape=egg]
 +
  scenario [label="История \n stw-scenario.txt"]
 +
  audio    [label="Музыка \n stw-audio.mp3"]
 +
  config  [label="Настройки \n stw-config.py"]
 +
  filters  [label="Фильтры \n stw-filter.py"]
 +
 +
  activity [label="Обработанная \n активность\n activity.xml"]
 +
 +
  filters -> activity
 +
  vcslog  -> activity
 +
 +
  cache    [label="Кеш-данные"]
  
  "Музыка"  -> "Кеш-данные" [label="Задает длительность"]
 
  
 
   "Визуализация"  [fillcolor=yellow shape=diamond]
 
   "Визуализация"  [fillcolor=yellow shape=diamond]
   "Настройки"->"Визуализация"  
+
   audio  -> "Визуализация" [label="Задает \n длительность"]
   "Лог-файл" ->"Визуализация"  
+
   config -> "Визуализация" [label="Настройки \n визуализации"]
 +
  activity -> "Визуализация"  
 
    
 
    
   "Визуализация"  -> "Кеш-данные"
+
   "Визуализация"  -> cache
  
  
   "Сценарий" -> "Субтитры"
+
   scenario -> "Субтитры"
 +
  audio  -> "Субтитры" [label="Задает \n длительность"]
  
   "Субтитры"  -> "Результат"
+
   "Субтитры"  -> result
   "Кеш-данные" -> "Результат"
+
   cache -> result
  
   "Результат" [fillcolor=gold shape=house]
+
   result [label="Результат: \n project-codeswarm-xxx.avi \n project-gource-yyy.avi" fillcolor=gold shape=house]
 
}
 
}
 
</graph>
 
</graph>
Строка 165: Строка 225:
 
Упрощенная схема генерации представлена выше.
 
Упрощенная схема генерации представлена выше.
  
Важно знать следующее:
+
{{note}} Единственное необходимое — история проекта, в виде лог-файла, файла-генератора лог-файла, или просто workspace-проекта под одно из известных VCS, у которое лог-файл можно запросить.
  
{{note}} Единственный необходимый входной файл — лог:
+
Будучи запущенной <tt>ShowTeamWork</tt> без дополнительных файлов автоматически проанализирует лог, и  
cvs log > cvs.log
+
* выделит наиболее «активные» каталоги
или
+
svn --verbose log > svn.log
+
 
+
{{note}} Будучи запущенной <tt>ShowTeamWork</tt> без дополнительных файлов автоматически проанализирует лог, и  
+
* выделит наиболее крупные каталоги
+
 
* подберет для них случайную контрастную палитру цветов
 
* подберет для них случайную контрастную палитру цветов
* сгенерирует файл настроек
+
* сгенерирует файлы настроек
 
* предложит одну из заготовленных<ref>Свободный, выпущенных под лицензией Creative Commons</ref> музыкальных дорожек в стиле ''Ambient''.
 
* предложит одну из заготовленных<ref>Свободный, выпущенных под лицензией Creative Commons</ref> музыкальных дорожек в стиле ''Ambient''.
  
== Где скачать? ==
+
А теперь поясним, зачем остальные сложности.
 +
 
 +
=== getlog.py ===
 +
При отсутствии известного системе логфайла, <tt>ShowTeamWork</tt> пытается вызвать скрипт <tt>getlog.py</tt>, где вы пропишете, что и откуда надо тянуть. Например, вы собираетесь визуализировать историю большого проекта, у которого свой репозиторий, независимый от вашего проекта по его визуализации.
 +
<tt>getlog.py</tt> — [[Python]]-скрипт, он мультиплаформенный, в отличие от <tt>bat</tt>-файлов или <tt>shell</tt>-скриптов, и собственно не требует знания [[Python]]  — для всех проектов в подкаталоге <tt>samples</tt> есть скрипт <tt>getlog.py</tt>, так что при необходимости, просто скопируйте скрипт, вытаскивающий лог из нужной вам системы контроля версий (в каталоге <tt>samples</tt> представлены все поддерживаемые типы VCS).
 +
 
 +
В скрипте, вы можете указать, например, параметры ограничивающие дату выборки лог-файла (например, только «последний спринт»).
 +
 
 +
<code-python>
 +
import os
 +
import datetime
 +
 
 +
begindate=(datetime.date.today()-datetime.timedelta(days=14)).strftime("%Y-%m-%d")
 +
os.system(
 +
"""
 +
svn log --verbose --revision "{%(begindate)s}:HEAD" http://svn.wikimedia.org/svnroot/mediawiki/ >svn.log
 +
""" % vars())
 +
</code-python>
 +
 
 +
Или вы можете написать свой скрипт, который, например, будет доставать данные из вики-системы, трекера-задач, системы документооборота или любой системы, подразумевающей командную работу.
 +
 
 +
После работы этого скрипта, ожидается, что в каталоге будет один из следующих файлов:
 +
 
 +
;cvs.log: получаемый командой
 +
  cvs log
 +
;svn.log: получаемый командой
 +
  svn log -v
 +
;bzr.log:  получаемый командой
 +
  bzr log -v
 +
;git.log:  получаемый командой (без шуток и одной строкой):
 +
git log --name-status 
 +
    --pretty=format:"%n------------------------------------------------------------------------%nr%h | %ae | %ai (%aD) | x lines%nChanged paths:
 +
;hg.log:  получаемый командой
 +
  hg -v log
 +
;activity.xml: Стандартный XML-формат представления активности (см. [[#activity.xml]]).
 +
 
 +
Если <tt>getlog.py</tt> не обнаружено, или он не выдал ожидаемые лог-файлы,
 +
<tt>ShowTeamWork</tt> пытается получить их самостоятельно, ожидая, что ее запустили в каталоге проекта под какой-нибудь системой контроля версий.
 +
<tt>ShowTeamWork</tt> смотрит, нет ли одного из следующих подкаталогов (в каталоге запуска или на один-два уровня выше)
 +
<tt>CVS</tt>, <tt>.svn</tt>, <tt>.bzr</tt>, <tt>.git</tt>, <tt>.hg</tt> — и обнаружив таковой, пытается получить лог-файл от соответствующей системы контроля версий (должна быть установлена и «в путях»).
 +
 
 +
=== activity.xml ===
 +
 
 +
Стандартный XML-формат представления активности (когда, кто, с чем, что сделал):
 +
<code-xml>
 +
<?xml version="1.0"?>
 +
<file_events>
 +
<event
 +
  date="1263155767000"
 +
  author="rotem"
 +
  action="A"
 +
  filename="/trunk/phase3/languages/messages/MessagesEn.php"
 +
  comment="Localization update for he, and whitespace fix in en.. " />
 +
<event
 +
  date="1263155767000"
 +
  author="rotem"
 +
  action="M"
 +
  filename="/trunk/phase3/languages/messages/MessagesHe.php"
 +
  comment="Localization update for he, and whitespace fix in en.. " />
 +
</file_events>
 +
</code-xml>
 +
 
 +
Т.е. все просто — последовательность <tt>event</tt> вложенных в <tt>file_events</tt>, а атрибуты
 +
<tt>event</tt> следующие:
 +
;date:  Время события в миллисекундах от стандартной компьютерной эпохи (1970…).
 +
;author: Автор действия
 +
;filename: путь
 +
;action: (необязательно)
 +
:;A: добавление
 +
:;M: модификация
 +
:;D: удаление
 +
;comment: (необязательно) — комментарий
 +
 
 +
==Инсталляция ==
  
 
Проект (исходники и бинарники) хостится на Google Code — http://code.google.com/p/showteamwork/.
 
Проект (исходники и бинарники) хостится на Google Code — http://code.google.com/p/showteamwork/.
Строка 188: Строка 316:
  
 
Под Linux нужно установить (из исходников или пакетами — неважно):
 
Под Linux нужно установить (из исходников или пакетами — неважно):
* ffmpeg
+
* <tt>ffmpeg</tt>
* mencoder (из проекта <tt>mplayer</tt>)
+
* <tt>mencoder</tt> (из проекта <tt>mplayer</tt>)
* python (для надежности версии 2.5 или 2.6).  
+
* <tt>python</tt> (для надежности версии 2.5 или 2.6).  
* gource http://code.google.com/p/gource/
+
* <tt>gource</tt> http://code.google.com/p/gource/
 
и сделать, чтобы эти утилиты были прописаны в путях.
 
и сделать, чтобы эти утилиты были прописаны в путях.
  
Строка 200: Строка 328:
 
== Контакты ==
 
== Контакты ==
 
* [http://belonesox.moikrug.ru Стас Фомин].
 
* [http://belonesox.moikrug.ru Стас Фомин].
Но скоро планирую причесать код и опубликовать по-человечески, на хост-фабрике open-source проектов (скорее всего Google Code).
+
 
 +
 
 +
 
 +
== Резюме ==
 +
 
 +
* Это забавная игрушка.
 +
* Пользоваться ей можно сходу, не приходя в сознание.
 +
* Но в ней куча настроек и прочих «степеней свободы» — подбор музыки, движка визулизации, параметров, палитры и т.п. — так что изготовление роликов визуализации более-менее искусство.
 +
* Результаты полезны для:
 +
** Рекламы проекта:
 +
*** Представления проекта на конференции (очень сейчас модно, см. например [http://vimeo.com/6553097 выступление об проекте Debian Installer]). У вас это займет всего минуты четыре, а аудитория проснется и заинтересуется.
 +
*** Показа проекта без раскрытия кодов, при хедхантинге. Длинные, унылые, проекты с ''legacy''-кодом будут даже смотреться интересней новых и перспективных проектов. И возможно тут предпочтительней использовать Codeswarm-визуализацию.
 +
** Показ работы в рамках SCRUM-демонстрации (или чего-то подобного), для донесения идеи — «мы тут вкалываем!» для заказчиков и прочих стейкхолдеров. Когда показывается короткая работа (неделя-месяц) — лучше использовать Gource-визуализацию.
 +
* Ну и полезно посмотреть на свой или чужой проект, для быстрого и целостного гештальт-восприятия (не затухает ли проект, сколько народу вкладывается в «ядре», и т.п.).
 +
 
 +
В принципе, наверное все сказано, на всякий случай, вдруг кому пригодится — короткий доклад о ShowTeamWorks на [[AgileDays-2009_(Technical_excelence)|конференции AgileDays-2009]] (особого ничего нового, по сравнению с написанным выше).
 +
<html><center>
 +
<object width="640" height="512"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8246851&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=8246851&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="512"></embed></object>
 +
</center></html>
  
 
== Примечания ==
 
== Примечания ==

Версия 22:47, 25 января 2010

Проблема

При грамотном процессе разработки, с применением средств групповой работы, таких, как:

накапливается огромная история коллективного взаимодействия команды.


Хочется:

  • эффективно извлечь из этих данных полезные знания:
Работа
кто, как и где «вкалывает»,
Взаимодействие
кто с кем, и в каких темах
например:
  • достаточно ли было Agile-кроссфункциональности?
  • где были проблемы (заброшенные области, забытые люди)
  • и т.п.
  • быстро и нескучно рассказать о работе своей команды:
    • демонстрации заказчикам;
    • гордость перед коллегами;
    • хедхантинг новых сотрудников.

Однако на практике возникает проблемы:

  • Question.svg как эффективно исследовать этот пласт информации?
  • Question.svg как эффектно показать свою работу лицом?

Question.svg Может посчитать метрики? Ненавистные SLOC и иже с ними? Да, такие инструменты есть:

В зависимости от глубины детализации можно получить:

    • либо пару унылых метрик («KSLOCs в месяц на сферического разработчика в вакууме», то есть в нашей метафоре максимум — «площадь лесного массива»)[1].
    • либо многостраничные Excel-dashboardы, заполненные мириадами цифр, в которых почти также бессмысленно лезть человеку, если он не профессор Чарли Эппс из сериала Numb3rs с его верными суперкомпьютерами и волшебными алгоритмами DataMining-a.

  • Читать логи переписки и коммиты в VCS?

No.svg То есть разрабатывать «шахту знаний» киркой и мотыгой? Бродить по лесу и считать деревья? Муторно!


Question.svg Что же делать?

Есть альтернативный способ «увидеть лес за деревьями» и при этом выжать краткую информацию по процессу — Визуализация. В динамике!

Есть уже даже несколько моделей!

Целых две ☻ .

Codeswarm

  • CodeSwarm.
  • Самая древняя! (год с копейками).
  • Визуализация физической модели «Люди и файлы» (на самом деле 4-ре модели: «Simple», «Chaotic», «Maxwell», «Legacy», но не все они «одинаково полезны», наиболее разумная — «Simple»).

Основная идея

    • «Люди» не любят друг друга — отталкиваются!
    • «Файлы» тоже отталкиваются! «обратно пропорционально расстоянию».
    • «Людей» и «Файлы» притягивает при коммитах!
    • «Люди» сближаются из-за совместной работы над одними файлами



А также:

  • Файлы можно красить (по директориям).
  • Работа красит — файлы красят людей.
  • Цветной пульс проекта в динамике.

Gource

Основная идея

  • Визуализация и структур каталогов («облака имен»)!
  • Модель «Пчелы» и «цветы»!
  • Видны:
    • «Горячие зоны».
    • Кроссфункциональные парни.
    • Заброшенные люди и код.



Что не хватает?

Important.svg Именно поэтому «самодельных» визуализаций — почти нет!

  • Сохраненного видео. Только рисует.
  • Какое видео без музыки?
  • Инфоканал — текст бегущей строкой — субтитры!
  • Максимальная автоматизация:
    • «старт с нуля» — только включить и дать на вход лог!
    • «эволюционные доработки» — легко и быстро «править кино».


Наш фреймворк ShowTeamWork

Important.svg Наше решение все это делает!

А именно:

  • Вытаскивается лог-информация, если запустить в workspace проекта под какой-нибудь из известных VCS — поддерживаются самые распространенные системы контроля версий: CVS, SVN, GIT, Bazaar, Mercurial (в принципе — можно визуализировать любую активность, хоть торговлю трейдеров).
  • Автоматически выбирается набор подкаталогов проекта с наибольшей активностью.
  • Для них генерируется случайная цветовая палитра, с взаимоконтрастными и яркими цветами.
  • При отсутствии «сценария субтитров» — генерируется шаблон-заготовка.
  • При отсутствии аудио сопровождения — предлагает заготовленную музыку в стиле «Ambient»
  • Порождает видео, с длительностью равной аудиозаписи, и накладывает субтитры, вычисляя их из формата «сценария субтитров», где события привязаны к датам.

Примеры

Альбом готовых визуализаций для известных софтверных проектов ( bugzilla, bzr-svn, codeswarm, ffmpeg, freemind, git, gource, inkscape, mediawiki, mercurial, mplayer, postgres, subversion, viewvc) можно посмотреть здесь.

Мы используем

Свободные, open-source программы:

А также несколько треков свободно доступной электронной музыки от Tunguska Music Society (License: Creative Commons). Если вы поленитесь искать музыку — мы сделаем клип на базе случайного трека (несколько треков идут в комплекте). Бесплатно и патриотично! Если хотите публиковать свои ролики, напоминаем о пока еще существующих цифровых правах на музыку и рекомендуем использовать только свободно доступную музыку — тут огромный выбор музыки в стиле Ambient.

Быстрый старт

Caution.svg Для Windows-пользователей. Linux-пользователи, думаю, поймут сами, что и как.

Скачайте дистрибутив, распакуйте куда-нибудь его.


Зайдите в каталог проекта, т.е. воркспейс под одной из систем контроля версий ( CVS, SVN, GIT, Bazaar, Mercurial), причем не обязательно верхний уровень — можно на два-три уровня ниже, и вызовите showteamwork.exe, и отправляйтесь пить кофе.

В конце работы вы получите в каталоге, в котором его запустили пару видеофайлов (с codeswarm и gource визуализациями, по именам все будет понятно), а также вспомогательные файлы настроек и аудио, с префиксом stw-.

Далее, вы сможете редактировать эти файлы, подбирая оптимальные настройки, подходящую музыку, и редактируя историю проекта в субтитрах, и по окончании редактирования, перезапускайте showteamwork.exe.

Пересчет будет относительно экономичным — например, если вы меняли только параметры относящиеся к codeswarm-визуализации, то gource-визуализация пересчитыватся не будет, а если правили только субтитры — то будет выполнятся только наложение субтитров, без вызова gource или codeswarm.

Более детально, схема генерации описана ниже.

Схема генерации

[svg]

Упрощенная схема генерации представлена выше.

Note.svg Единственное необходимое — история проекта, в виде лог-файла, файла-генератора лог-файла, или просто workspace-проекта под одно из известных VCS, у которое лог-файл можно запросить.

Будучи запущенной ShowTeamWork без дополнительных файлов автоматически проанализирует лог, и

  • выделит наиболее «активные» каталоги
  • подберет для них случайную контрастную палитру цветов
  • сгенерирует файлы настроек
  • предложит одну из заготовленных[2] музыкальных дорожек в стиле Ambient.

А теперь поясним, зачем остальные сложности.

getlog.py

При отсутствии известного системе логфайла, ShowTeamWork пытается вызвать скрипт getlog.py, где вы пропишете, что и откуда надо тянуть. Например, вы собираетесь визуализировать историю большого проекта, у которого свой репозиторий, независимый от вашего проекта по его визуализации. getlog.pyPython-скрипт, он мультиплаформенный, в отличие от bat-файлов или shell-скриптов, и собственно не требует знания Python — для всех проектов в подкаталоге samples есть скрипт getlog.py, так что при необходимости, просто скопируйте скрипт, вытаскивающий лог из нужной вам системы контроля версий (в каталоге samples представлены все поддерживаемые типы VCS).

В скрипте, вы можете указать, например, параметры ограничивающие дату выборки лог-файла (например, только «последний спринт»).

import os
import datetime
 
begindate=(datetime.date.today()-datetime.timedelta(days=14)).strftime("%Y-%m-%d")
os.system(
"""
svn log --verbose --revision "{%(begindate)s}:HEAD" http://svn.wikimedia.org/svnroot/mediawiki/ >svn.log
""" % vars())

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

После работы этого скрипта, ожидается, что в каталоге будет один из следующих файлов:

cvs.log
получаемый командой
 cvs log
svn.log
получаемый командой
 svn log -v
bzr.log
получаемый командой
 bzr log -v
git.log
получаемый командой (без шуток и одной строкой):
git log --name-status  
    --pretty=format:"%n------------------------------------------------------------------------%nr%h | %ae | %ai (%aD) | x lines%nChanged paths:
hg.log
получаемый командой
 hg -v log
activity.xml
Стандартный XML-формат представления активности (см. #activity.xml).

Если getlog.py не обнаружено, или он не выдал ожидаемые лог-файлы, ShowTeamWork пытается получить их самостоятельно, ожидая, что ее запустили в каталоге проекта под какой-нибудь системой контроля версий. ShowTeamWork смотрит, нет ли одного из следующих подкаталогов (в каталоге запуска или на один-два уровня выше) CVS, .svn, .bzr, .git, .hg — и обнаружив таковой, пытается получить лог-файл от соответствующей системы контроля версий (должна быть установлена и «в путях»).

activity.xml

Стандартный XML-формат представления активности (когда, кто, с чем, что сделал):

<?xml version="1.0"?>
<file_events>
<event 
  date="1263155767000" 
  author="rotem"
  action="A"
  filename="/trunk/phase3/languages/messages/MessagesEn.php" 
  comment="Localization update for he, and whitespace fix in en.. " />
<event 
  date="1263155767000" 
  author="rotem"
  action="M"
  filename="/trunk/phase3/languages/messages/MessagesHe.php" 
  comment="Localization update for he, and whitespace fix in en.. " />
</file_events>

Т.е. все просто — последовательность event вложенных в file_events, а атрибуты event следующие:

date
Время события в миллисекундах от стандартной компьютерной эпохи (1970…).
author
Автор действия
filename
путь
action
(необязательно)
A
добавление
M
модификация
D
удаление
comment
(необязательно) — комментарий

Инсталляция

Проект (исходники и бинарники) хостится на Google Code — http://code.google.com/p/showteamwork/.

Т.е. скомпилированные под Windows бинарники, вместе можно скачать отсюда, а если хотите поучаствовать в разработке — см. http://code.google.com/p/showteamwork/source/checkout

Единственное софтверное требование под Windows — наличие Java (все остальное идет в комплекте).

Под Linux нужно установить (из исходников или пакетами — неважно):

и сделать, чтобы эти утилиты были прописаны в путях.

Cразу посмотрите каталог samples, должно быть все понятно.

Чуть позже, мы подробно распишем здесь назначение каждой настройки.

Контакты


Резюме

  • Это забавная игрушка.
  • Пользоваться ей можно сходу, не приходя в сознание.
  • Но в ней куча настроек и прочих «степеней свободы» — подбор музыки, движка визулизации, параметров, палитры и т.п. — так что изготовление роликов визуализации более-менее искусство.
  • Результаты полезны для:
    • Рекламы проекта:
      • Представления проекта на конференции (очень сейчас модно, см. например выступление об проекте Debian Installer). У вас это займет всего минуты четыре, а аудитория проснется и заинтересуется.
      • Показа проекта без раскрытия кодов, при хедхантинге. Длинные, унылые, проекты с legacy-кодом будут даже смотреться интересней новых и перспективных проектов. И возможно тут предпочтительней использовать Codeswarm-визуализацию.
    • Показ работы в рамках SCRUM-демонстрации (или чего-то подобного), для донесения идеи — «мы тут вкалываем!» для заказчиков и прочих стейкхолдеров. Когда показывается короткая работа (неделя-месяц) — лучше использовать Gource-визуализацию.
  • Ну и полезно посмотреть на свой или чужой проект, для быстрого и целостного гештальт-восприятия (не затухает ли проект, сколько народу вкладывается в «ядре», и т.п.).

В принципе, наверное все сказано, на всякий случай, вдруг кому пригодится — короткий доклад о ShowTeamWorks на конференции AgileDays-2009 (особого ничего нового, по сравнению с написанным выше).

Примечания

  1. На самом деле сейчас уже есть интересные варианты с нетривиальной статической визуализацией SVN-репозиториев: SVNPlot, примеры: [1], [2]. Но в динамике все равно гораздо веселей.
  2. Свободный, выпущенных под лицензией Creative Commons

Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».

Репликация: База Знаний «Заказных Информ Систем» → «ShowTeamWork»