пятница, 16 августа 2013 г.

Ragel + Bison Example

For the last two days I have been struggling with various lexer/parser combinations.

 Classical flex + (win)bison combination
As flex and bison were designed to work together integration, is not a problem. There were some issues while compiling (and linking) generated code with Visual Studio, but there is a lot of information on the web (namely, on StackOverflow) and the documentation is rather good, some I did not spend a lot of time on them. I already was going to write some code beyond basics, when I realized, that flex does not have unicode support. So, I began searching the web for alternatives and found

 Quex
Next I attempted to use Quex, which boasts full Unicode support, but I resigned after spending a day struggling with bison integration issues.

Ragel
So I ended up with Ragel. It can be integrated with bison, and there is a tutorial available: http://zusatz.wordpress.com/2012/07/08/connecting-ragel-to-bison-in-c/ . Unfortunately, the tutorial does not come with downloadable code, so I created an example from it and hosted it on CodePlex. You will need VS2012, win_bison and ragel to build it.

The sample also includes very basic support for Russian UTF-16 characters.

 Tools worth noting
 I also considered antlr and boost::spirit.

  Additional links: Bison documentation WinBison download IBM tutorial on lex+yacc <

четверг, 31 марта 2011 г.

Дао программиста - про отладчик

Когда я только начинал программировать, в школе, в институте, даже первые годы в CustIS, я постоянно пользовался отладчиком. Программа начинала работать только после нескольких сеансов ловли ошибок при помощи дебаггера (а до этого - нескольких попыток заставить скомпилироваться). Но потихоньку я научился писать по-другому. Сначала - так, чтобы не пришлось исправлять синтаксические ошибки. Потом - обходиться без длительных сеансов отладки. Конечно, я не пишу сразу все правильно, но то, что и того и другого стало на порядок меньше - могу сказать точно. Что изменилось? Ну во-первых, я начал больше думать, перед тем, как бросаться кодировать) Во-вторых многие ошибки получается отловить (в т.ч. понять источник проблемы) при помощи тестов, а не отладчика. Я далеко не всегда практикую TDD (даже сильно реже, чем считаю применимым), но даже тесты, написанные после кода, сильно помогают. Можно сказать, что сейчас я воспринимаю отладчик не как инструмент ежедневной работы, а скорее как помощника для исследования чужого кода.

вторник, 19 января 2010 г.

пятница, 11 декабря 2009 г.

Отчет с конференции AgileDays'09

Конференция проходила 9 декабря 2009 года в бизнес-центре ГУУ (Выхино)

http://www.agiledays.ru

Общее впечатление хорошее, правда наиболее интересными оказались доклады к Agile относящиеся косвенно.

Agile @ Intel

Евгений Сорокин, Антон Бевзюк (Intel) Два Team Lead'а из Intel рассказывали про свой Agile в Нижнем Новгороде. Они делают большое внутреннее финансовое приложение для маркетинга, распределенная команда: программисты в НН (немножко в Индии), аналитики в Англии, бизнес-пользователи в Штатах.

Как у них

К Нижнем на их проекте работает сейчас 12 разработчиков, изначально было 4, в самые напряженные моменты привлекалось до 20. Утверждают, что тестировщиков нет вообще. Agile они начинали с XP(в 2002 году), в с самом книжном его варианте - используют все практики, за исключением Customer-on-Site, в силу удаленность кастомера). Очень сильно форсируют парное программирование - у программиста есть лично рабочее место, но весь код пишется вдвоем, за специальными станциями, с двумя комплектами мышей, клавиатур и мониторов. Парные сессии продолжаются по 1.5-2 часа, каждые 5-20 минут ведущий в паре меняется. Разбиение происходит на standup, который случается в 9-15 ( не работать нам в Intel:)))

В 2008 году у них появился Scrum. Доска у них - (New, WIP, Completed, Support/Testing)+ бумажки-идеи. Работу делят опять же, классически - на user stories, которые делятся на конкретные tasks (объемом работы не более одного дня). При этом добавляется новая роль - Story Owner, программист отвечающий за данную историю целиком. Также, с внедрением Kanban в 2009 году на доске появились Kanban-лимиты.

Заметные отклонения от книжных описаний ( к которым в Intel явно тяготеют) у них случилось только в области планирования. Во-первых, они не планируют итерацию, оценка происходит по ходу. Во-вторых оцениваются не конкретные задачи, а User Stories целиком, причем оценка эволюционировала от идеальных часов через sp к системе (просто-средне-сложно). Также, при планировании в самом начале разработке, у них получилось более 500 user stories, планирование вылилось в кошмар, что научило оценивать более крупными "функциональными" блоками.

Проблемы

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

  1. Долгосрочно планирование. Они это тоже не умеют. В их проекте был фиксированный срок старта (правда, и фиксированный объем работ), рассчитать ресурсы они не сумели, пришлось срочно привлекать помощь из штатов. Правда, измеряя velocity получилось понять это на раннем этапе и не сорвать проект.
  2. Полный Backlog сразу составить не получилось - пришлось делить на большие блоки и уточнять по ходу. По-моему идея была изначально безнадежная)
  3. Распределенная команда - разный уровень, разные критерии оценки, плохо передаются знания. Методы борьбы - стандартные: строго общий бэклог, личное общение
  4. Новички. Команда начиналась с 4 человек, еще 8 набрали по ходу. Кажется студентов) Критерием отбора было знание основ ООП, а не опыт или знание .Net/C#. Говорят, что за 3 месяца новичок превращается в полноценного сотрудника, критерий - можно бывших новичков сажать в пару.

Fun

В Intel есть немало способов скрасить серые будни за написанием тупого кода (почему тупого, см. последний доклад).

  • Каска-чекинка (кто в каске, тот и коммитит, во избежания столкновений)
  • Сокровища('ништяки' по выражению Юли Вяцковой) и проклятья. На standup каждый случайным образом получает бонус( типа права выбирать любого в пару) и обязанность (типа протереть мониторы или убрать warning'и компилятора)
  • Сердечки - на специальной доске каждый член команды получает розовые-розовые сердечки за что-то общеполезное. Курс сокровищ к сердечкам они не сообшили)
  • Кондуктор - звучит сирена, и чувак с дыроколом идет пробивать бумажки. Количество дырочек на бумажке - ее lead time. Все бегут и перевешивают свои бумажки
  • И общая зарядка)

Увидеть лес за деревьями

Стас Фомин (Заказные ИнформСистемы)

Короткий доклад Стаса, посвященный визуализации хода процесса разработки.

Стас показал две модели. Одну их них, Code Swarm мы уже видели (если не видели - идите смотрите(в конце поста)) - в его основе лежит гравитационная модель, где разработчики притягивают файлы, с которыми работают.

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

Также Стас анонсировал предварительную версию фреймворка, позволяющего быстро делать такое видео, у меня правда он работать не захотел. Смотреть можно вот здесь.

8-битный Scrum

Алексей Омельянчук (Сигма-ИС)

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

Комманда его прошла путь от производственного предприятия работающего на МО с жесктим Rational Unified Process, через крупного частного производителя контроллеров (крупнейший поставщик АвтоВаза, 2 млн. штук в год) до software-предприятия, занимающегося, в основном, программированием, а не железом. На каждом этапе добавлялись новый практики.

Что используются

  • спринты, ограниченные во времени
  • демо (по признанию докладчика практика оказалась самой полезной)
  • планирование. Причем, планируют 120-140% от запаса времени, с разделением на обязательное и бонусы

Длительность спринта составляет 1 месяц, что было связано со сложившимся на предприятии укладом. Также был "мегаспринт" - 3 месяцы. Эта цифра обусловлена

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

Еще одна особенность - сборные команды. Каждый проект ведется максимум двумя людьми (большему количеству просто нечего делать на устройстве, куда влезает 500 строк ассемблера), команды объединяют нескоько проектов. Ни о какой кросс-функциональности речь не идет(одна настройка рабочего места занимает день-два), на таким образом все-таки немого смягчаются риски того, что в случае болезни одного человека, его будет некем заменить. Scrum-митинги из-за этой специфики проходят на по 15 минут раз в день, а большее время раз в неделю, чтобы было время въехать в чужую предметную область. На планирование специализация накладывает также глубокий отпечаток - приходится выделять человеческие ресурсы, которые могут решить данную задачу и планировать время каждого отдельно.

SOLID-принципы OO-дизайна

Дмитрий Кандалов (Deutsche Bank)

Java-разработчик из Deutsche Bank рассказывал про очередной набор принципов OO-дизайна. Никаких откровений, но выучить названия и помнить о сути полезно. Рассказ велся по этой статье. Докладчик разумно оговорился, что принципы надо применять по возможности, principles != rules.

Демотиваторы в тему

SOLID - это аббревиатура

  • Single Reponsibility Principle - каждый класс должен иметь один смысл, делать что-то одно. Например описание книги не должно вести историю продаж этой книги.
  • The Open Closed Principle - создание потомков класса должно расширять поведение базового класс, а не требовать его изменения.
  • The Liskov Substitution Principle - обратный к предыдущему. Во всех случаяж должна быть возможность подставить объект подкласс вместо суперкласса.
  • The Interface Segregation Principle - принцип разделения интерфейсов. Если у Вас все-таки получился сложный многофункциональный объект, для каждого выделенного случая его использования выделите отдельный интерфейс.
  • The Dependency Inversion Principle - Принцип обращения зависимости. Подсистемы верхнего уровня абстракции не должны зависеть от подсистем нижнего уровня, а предоставлять им интерфейс, который они должны реализовывать. Например, программа отправки почты не должна зависеть от сетевого протокола нижнего уровня, а, вызывать его функции через интерфейс, который является частью описания модуля верхнего уровня

MS Team System vs IBM Rational Jazz: лучший инструмент разработчика

Евгений Злобин (Microsoft) и Тимур Маркунин (IBM)

Два сейла не очень убедительно продавали свои продукты. IBM выглядел лучше, но его все равно никто не купит. Рассказ про TeamSystem выглядел особенно бледно - про нужные и полезные нововведения, которые появились в 2010 версии ничего сказано не было. Но зато про них рассказывали месяц назад на Платформе, можно почитать здесь.

DDD+TDD+MVP+DSL+Gof+PoEAA=Love!

Евгений Сорокин, Антон Бевзюк (Intel)

Доклад оставил глубокое впечатление, причем, знаю, не только у меня. Те же докладчики рассказывали о том же приложении, что и на первом докладе, но с акцентом на технические приемы и практики. Размер приложения можно приблизительно оценить по следующим цифрам: 140k строк кода, из них 100k - тесты, 20 экранов, 12 разработчиков, 2 года, 50 человеко-лет.

Тестируемые интерфейсы

Было рассказано о двух паттернах, которые позволяют строить тестируемые интерфейсы, а также о том как их тестируют. Это MVP(Model-View-Presenter), используется для WinForms и веб-интерфейсов приложения и MVVM (Model-Vew-ViewModel)

Рассказ про тестирование поразил - пишутся авто тесты в том числе и на Binding данных к контролам. Выглядит страшновато - делают binding в дизайнере, потом через Reflection пишут код (по сути, тоже самое), который его проверяет

Domain Driven Design и тестируемость всего

Реализация DDD-подхода в данном случае состоит в том, что domain описан в отдельной сборке, которая является полностью независимой. Для обеспечения независимости используется прием Inversion-of-Control и одноименная библиотека.

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

Ребята также показались TDD-экстремистами, не знаю насколько это хорошо или плохо. Их мантры такие

  • Подумай->Напиши тест, который падает где ты ожидаешь -> Сделай минимальное исправление
  • Assert, по-хорошему, должен быть один, а исправление - минимальным. Если это не так, скорее всего нужен еще один тест.

Остальное

  • При написании тестов использует свои embedded DSL. Например, вот такое:
 
var testDate = 11.12.of2009
 
public static class DoubleExtensions
{
    public DateTime of2009(this double date)
    {
        return new DateTime((int)date.Floor(), (int)(date-date.Floor())*100, 2009)
    }
 
}
 
 
  • Очень любят GoF и Фаулера. Из полезных паттернов упомянули Спецификацию, чему соответствует до некоторой степени Condition в Uni.Net

воскресенье, 6 декабря 2009 г.

Windows 7 – часть вторая

Обновление оконного интерфейса

  В Windows 7 в очередной раз обновился и улучшился интерфейс. Почти все нововведения показались разумными и удобными, особенно приятно, что разработчики исправили некоторые ошибки в Vista. Правда, должен предупредить, что если вы переходите с Windows XP, то привыкать и искать нужные кнопки все равно придется.

Мой обзор Windows 7

Уже почти месяц у меня  стоит Windows 7, и я решил что можно сформулировать первые впечатления.

четверг, 19 ноября 2009 г.

Mind Maps

Открыл для себя Mind Maps. Собственно, с концепцией я знаком уже давно, а сам рисовать попробовал только сейчас.  Очень удобный способ для быстрой записи мыслей, который организуются в дерево с разнообразными типами связей.

В качестве софтины рекомендую FreeMind, бесплатно, на Java. Работает быстро, удобные клавиатурный шорткаты