Последние записи


Убираем сборки зависимостей из репозитория

Сто лет назад вышла версия 1.6 Nuget. Для меня это такой повседневный инструмент, типа ложки, в котором непонятно, что может быть нового :). Но в этой версии добавилась прикольная штука, а именно возможность не хранить бинарники зависимостей в репозитории. Действительно, нафиг это нужно, если в любой момент можно их вытянуть с самого nuget. 

Воспользоваться этой фичей у меня получилось не сразу. Почему-то казалось, что оно само все заработает, после обновления nuget — но ничо подобного не произошло. Сборки зависимостей все также сохранялись в репозиторий и без них ничего собираться не хотелось. Печалька накапливалась и достигла критической массы, когда я решил разбораться и все порешать. Решение оказалось состоящим из двух шагов, первый из которых описан в официальном релизе NuGet, а второй я придумал сам. Нужно в игнор файле .[git|hg]ignore прописать следующие строчки:

packages/
!nuget.exe

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



Квест: поиск документации по fubu MVC

Fubu MVC очень крутая и классная вещь. Чтобы постичь всю ее крутоту и классность, я давно пытаюсь найти вменяемую документацию по ней. На удивление, это оказалось не таким уж простым делом :). Поиски напоминают квест, в котором получаешь удовольствие от процесса (а результата все нет -- но об этом дальше). 

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

Авторы фреймворка (который, кстати, расшифровывается, как For Us By Us) решили не искать легких путей. И в результате документация строится с помощью Python движка Sphinx, который запускается через Ruby сборщик Rake.  Именно так - Ruby запускает Python, который строит документацию для .NET фреймворка. Недавно меня сами эти слова бы напугали настолько, что я бы и думать не стал все это запускать. Но не сейчас.

Читать дальше >>



Coding dojo как путь к просветлению

Пару дней (блин, уже неделю) назад были вместе с Сашей Белецким на coding-dojo, где (даже) заняли третье место. Мероприятие выдалось весьма прикольным и поучительным. Среди прочего я постиг сайт http://cyber-dojo.com/. Я слышал про него еще раньше -- на XP Days клёвый дядька Йоханнес про него рассказывал. Но тогда я зашел и сразу ушел. Не понравилось мне писать код без привычной IDE и инструментов - xUnit, NSubstitute и т.д.

А вот на coding-dojo я вдруг осознал всю мощь ресурса. Ведь если вспомнить, что kata -- это тренировка с целью довести навыки до автоматизма, то можно представить этот сайт как такой себе спортзал. Суровый, спартанский, но от этого еще более крутой.

Читать дальше >>



Зачем просто если можно сложно?

Иногда попытки написать идеальный код доводят до абсурда. Вот на что я наткнулся в нашем проекте:

public void RiseMessageProcessedEvent(int? incomingId, int? outgoingId)
{
    var args = CreateEventArgs();

    if (incomingId.HasValue)
        args.ChangedMessagesData.Add(
                CreateMessageChangeData(incomingId.Value, MessageDirection.Incoming));

    if (outgoingId.HasValue)
        args.ChangedMessagesData.Add(
                CreateMessageChangeData(outgoingId.Value, MessageDirection.Outgoing));

    EventService.FireEvent(NotificationEvents.MessageProcessed, args);
}

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

Лучше переписать этот метод вот так:

public void RiseMessageProcessedEvent(int messageId, MessageDirection messageDirection)
{
    var args = CreateEventArgs();

    args.ChangedMessagesData.Add(CreateMessageChangeData(messageId, messageDirection));

    EventService.FireEvent(NotificationEvents.MessageProcessed, args);
}

В результате те же два параметра, но меньше кода и больше понятности.



Анонимус доставляет

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

[Fact]
public void AnonymousTest()
{
    var table = new Dictionary<object, object>();

    var value = new object();
    table.Add(new {Key1 = "key1", Key2 = "key2"}, value);

    table[new {Key1 = "key1", Key2 = "key2"}].Should().Be(value);
}
Читать дальше >>



Agile Base Camp 2012 в Киеве

После успешного празднования Нового 2012 Года нас ждет весьма интересное событие -- конференция Agile base camp, которая состоится на этот раз в Киеве. Упор конференции сделан на продуктовую разработку, но это вовсе не значит, что для аутсорсеров не будет ничего интересного. Я считаю, что продуктовый взгляд на вещи будет полезен всем. Согласитесь, что лучше думать, что ты "делаешь что-то свое", чем "горбатишься на дядю" :)

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

Приходите -- для регистрации нажмите на синенький банер справа  или сюда.



Отчет о конференции xpdays.ua 2011

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

Место БЦ "Парус", как по мне, оказался отличным местом. Удобное расположение в центре плюс утро субботы сделали задачу "добраться до места" достаточно тривиальной.  Залы были изолированы друг от друга, и не было такого, что слышишь доклад из соседнего зала вместо своего, как иногда случается на некоторых событиях.  Немного неадекватный мужской туалет и теснота перед гардеробом -- пожалуй единственные минусы. Да и те скорее для галочки, а не реальные напряги.

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

Читать дальше >>



Тренинг xpdays: TDD in .NET

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

На прошлой неделе в Киеве проходила конференция xpdays.  В течении трех дней происходили разные интересные мероприятия, в которых принимал участие и я.

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

Отдельное спасибо группе. Уровень подготовки оказался весьма высоким, и это позволило нам рассказать и показать все, что мы планировали.

 

Как и должно быть после хорошего тренинга, новые знания получили не только слушатели, но и тренеры. Я, например, открыл для себя Fluent Assertions, о котором напишу отдельный пост.

Спасибо всем участникам и организаторам за то, что это стало возможным, и до встречи на новых событиях! 

 



Тренинг TDD .NET in Action

TDD .NET in Action

25-26 ноября в Киеве состоится очередной тренинг scrumguides. Вместе с Виталием Стаховым мы покажем, как с помощью TDD .NET-разработчик может значительно повысить свою эффективность. После двухдневного погружения в мир тестов вы будете готовы начать применять этот подход на следующий день в своей работе.

Одна из самых частых ошибок при внедрении TDD – это создание хрупких тестов, когда изменения в одном месте рабочего кода требуют каскадных изменений в коде тестов. Затраты на эти изменения со временем растут, и в итоге TDD забрасывается с очередным постом на тему «Нафиг TDD». Мы расскажем, как этого можно избежать.

Мы еще много чего интересного расскажем и покажем. Максимум практики позволит научить не только голову, но и руки.

Для перехода к более детальному описанию тренинга и регистрации нажмите на баннер (должен быть на страничке такой оранжевый и мигает).

Приходите -- будет интересно!

И еще: если у вас есть сайт, пожалуйста, повесьте на нем наш баннер. А мы за это дадим вам скидку 10% на посещение тренинга. Код банера:

<a href="http://www.scrumguides.com/2011/06/tdd-net-in-action-2-net-3-4.html" target="_blank"><img src="http://tdd4.net/Content/images/banner_SCRUM-nobugs.gif" title="TDD .NET in Action" alt="TDD .NET in Action"/></a>





Знай свой инструмент

А вот такая задача. Допустим, вам нужно в winforms приложении показать диалог с какими-то данными, дать пользователю их изменить и сохранить. Данные представляют собой набор полей разных типов. Классический подход – натаскать элементов управления с палитры, поназывать их в стиле txtName, при показе формы пройтись по всем, заполняя текущими значениями, а в обработчике кнопки опять пройтись – и уже обновить поля модели значениями из элементов управления. Не очень увлекательный процесс. Если вдруг понадобится добавить полей к данным, нужно будет для каждого поля добавлять код чтения/записи его значения. Скукота, одним словом.

Удивительно, но из моих знакомых мало кто знает про возможности Visual Studio в этом плане. На самом деле процесс можно радикально упростить. 

Читать дальше >>


Я буду на

Agile Base Camp 2012

Recent Comments

Powered by Disqus

Что еще почитать:

Arrange Act Assert
Ayende @ Rahien
Alexander Beletsky
Rinat Abdullin
Happy PM
it4business
Scott Hanselman