Шашки, шахматы и го.

Август 2nd, 2009

Несколько забавных фактов, которые попались мне разом за короткое время

— Шашки.

Первая программа написана в 1950 году. В 2007 году  игра полностью просчитана до конца.

— Шахматы

Первая программа написана около того же 1950 года. На нынешний день (2009 год), самый сильный движок работающий на 64bit 4процессорном компе (то-бишь эквивалент обычного нового проца для персоналки от от Intel’я) обладает ELO (система рейтинга силы)  порядка 3100-3200. Для сравнения, самый высокий рейтинг в мире, был у Каспарова — 2851.

— ГО

Увы не смог найти, когда была написана первая программа. Если не ошибаюсь, это было гораздо позже, чем шахматная и шашечная программа (где-то в 1970). Долгое время, почитатели ГО били себя в грудь, что этот бастион не падет, так как стратегия игры в ГО, гораздо сложнее, чем в шахматы.

В августе 2008 года, Kim Myung Wan профессиональный игрок 8 дана (фактически абсолютный потолок) проиграл компьютеру дав ему 9 камней форы. Дабы не вдаваться в детали рангов ГО, скажу, что сила такой программы выше, чем примерно 75% людей умеющих играть в ГО.

Вывод?

А… Куда же мы котимся….  (с паникой в голосе).

Бранчинг.

Июль 22nd, 2009

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

Кстати, не могу найти нормальный перевод слову бранчится. Как действие слово «ответвляем» меня вполне удовлетворяет, а вот применительно к такому предложению «как стоит ответвляться/ветвится» звучит странно…. Мдя…Будь же ты, проклят герундий.

Ладно, назад к теме. Увы, серебряной пули среди стратегий нет. Так что, пробежимся по стратегиям.

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

— Простейшая стратегия

Если есть один человека, один продукт и одна версия то можно вообще не бранчиться. Все делается в trunk’е, ну разве что, можно помечать стабильные билды и релизовые билды.

Ну, естественно такая халява долго не держится. Буквально через пару выпущенных версии уже появляется необходимость сделать hotfix какому-то из ваших заказчиков и тогда приходится переходить к следующему этапу.

— Стратегия разумного минимума

Бранчимся только тогда, когда это уже абсолютно необходимо. То есть, как в прошлом методе ведем все в trunk, если надо сделать hotfix, то ответвляем от версии, которая отдана заказчику и там делаем исправления и мержим назад в trunk все исправления.

— Стратегия обычной средней фирмы

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

Вот тут уже начинаются расхождения.

а) Ранний бранчинг

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

б) Поздний бранчинг

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

Кстати, на этом размере появляется еще один вопрос в перпендикулярной  плоскости. Как организовывать структуру веток. Можно так

/Product1/trunk

/Product1/branch1

/Product1/branch2

/Product2/trunk

/Product2/branch1

а можно

/trunk/Product1

/trunk/Product2

/branch1/Product1

/branch1/Product2

Мне по душе больше первый метод. Я считаю, что продукты должны быть по возможности независимые друг от друга и поэтому должна быть возможность отдельно их выпустить, а вывод должна быть возможность отдельно бранчить Product1 и отдельно Product2.

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

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

Ну и последняя добавка. Опять же с любой веткой для релиза можно поступать теме же описанными стратегиями.

— Стратегия крупной фирмы

А вот тут собственно говоря наступает самое интересное, то о чем я прочел.

Предположим, что у нас есть большое количество веток в которых мы ведем разработку. Например для версий 5.5, 6.4 и 6.5 и 7.0.  Ну и еще параллельно ведется пару долгоиграющих проектов, который затрагивают несколько продуктов. Что мы хотим — иметь возможность перетягивать исправления. Условно говоря фиксы из 5.5, чтобы можно было применить в 6.4, 6.5, 7..0 и долгоиграющих проектах.

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

Собственно откуда берутся приключения? Первое, мы плохо можем знать другую ветку. Человек работающий над 5.5 достаточно плохо осведомлен о специальном проекте, который собран из частей 6.5 и 7.0. Получается если он закидывает изменения — то он не знает того когда. Если же люди работающие на этим специальным проектом пытаются вытянуть изменения из 5.5, то они тоже могут не слишком хорошо знать код.

В таком случае весь мержинг делают через ветки от которых были порождены текущие. То есть, чтобы из 5.5 перенести в 6.5 то из 5.5 мержат в 5.0, из 5.0 мержат в trunk, trunk мержат в 6.0, 6.0 мержат в 6.5.

С одной стороны, количество мержингов становится ГОРАЗДО больше с другой стороны, мержиться с веткой от которой была порождена текущая всегда гораздо проще и гораздо больше шансов, что нам знакомы обе ветки.

Далее, мержинг проводится в тот момент, когда ветка стабильна (идеально в релизовом состоянии). И еще, как только от ветки что-то бранчится, то после этого в этой ветке не ведется никакой разработки. Условно говоря, как только сделан branch 2.0, то в trunk не кладется никакой код кроме мержей. Таким образом в trunk мержится только стабильный код и поэтому trunk остается в достаточно стабильном виде.

Что-то я замудро описал. В целом, разработки делаются только в «листах» дерева (веток от которых не было ничего ответвлено) и для переноса изменений, мы идем по дереву вверх и вниз. Такой метод сложен, но зато позволяется все НЕ листы ветки держать в стабильном состоянии. И это снижает вероятность проблем при следующих мержах.

Вот собственно эта схема для меня и была новая.

UAC, тудыть его в качель.

Июль 16th, 2009

Товарищи, никто не подскажет, где находится очередь желающих оторвать достоинства тому, кто придумал UAC для Vista? Что? Достоинств на всех не хватит? Я предлагаю тогда их пришывать назад и отрывать по второму кругу.

А если серьезно. Никто  случайно не сталкивался с следующей проблемой

— Есть MSI

— Устанавливаем его на машину, выбирая галочку «для всех пользователей»

— Он благополучно устанавливается, по ходу поднимая UAC и прося подтвердить что я таки хочу его поставить (я Admin, поэтому он хоть credentials не просит)

— После того как установилось, щелкаем снова по MSI — он запускается в Maintanance mode (опции modify/repair/remove). Чтобы я не выбирал (modify, repair или remove) он в результате посылает нафиг по тому поводу что у меня нету IE 5.5 или выше (на самом деле есть).

Собственно грабли заключаются в том, что почему-то в этом maintanance mode Vista не выплевывает UAC окошко и не elevate процесс. В результате MSI пытается что-то там делать но Windows бьет его рукам и говорит «не скажу тебе противный, какой у меня IE», ну и MSI естественно передает мне теже слова.

Подтверждением того, что это таки проблемы с elevation, является то, что я насильно (Run as adimistrator) запустил MSI сразу elevated и все зашуршало.

А еще забавность в том, что если я делаю теже самые действия только устанавливаю не для «all user on this computer», а только для себя любимого, то проблемы тоже исчезают и оно таки показывает UAC для maintanance.

Да, кстати, для полноты картины. Мне нужно починить это не с точки зрения пользователя, а именно с точки зрения программиста. То есть, что-то сделать с исходниками (они у меня есть) MSI (здравствуй Wise Installer Studio), чтобы эта фигня зафурычила.

О… и если можно запишите меня в очередь на отрывание достоинств и к MSI’шикам. Хотя нет, пожалуй это перебор… Для них вполне будет достаточно просто мощной затрещины, чтобы в следующий раз делали продукт по проще для понимания.

И еще раз о Scrum.

Июль 11th, 2009

И еще один пинок мяча в те же ворота, что и прошлой статье. Все таки, меня удивляет вот такое отношение к Scrum (взять отсюда):

Scrum creates self organized teams. They organize themselves, they organize their quality. They organize their tools. They organize their engineering practices (TDD, pair programming). Why? Because they are responsible for delivering. No one else is.

Господи, ну какая-же фигня. Объясните почему вдруг у них появляется супер-пупер ответственность за результат.

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

Но вот только не надо мне рассказывать, что из плохо организованной, немотивированной команды Scrum сделает сплоченный коллектив, и все как один с флагами будут responsible for delivering.

Еще раз повторю мысль из предыдущей статьи. Scrum — это методика управления проектами. Все остальное в нем не большые добавки и приятности. Но это никак не методика повышения ответственности команды.