Tuesday, May 29, 2007

What sex is computer system?

Я почему-то всегда думал, что компьютер - это "она". Ну как будто бы это не "компьютер", а "машина". Да и вообще, это получается как-то случайно: "Что она пишет?", "И что это она сейчас делает?". Это настолько естественно, что я даже не задумывался на эту тему. Типа как в английском, все корабли и судна, в том числе очень большие воздушные или космические - "she". Из уважения, что ли? Или, как бы это так сказать, позыв души выразить, как много сил уходит, чтобы, мм, добиться от этой штуки ожидаемого?

А тут вот появилось еще одно наблюдение - девушки имеют тенденцию говорить "он".

Что-то за этим все-таки стоит. Надо Фрейда почитать.

Sunday, May 27, 2007

Compile-Time Attributes

Вот ведь е-мое, это все только в разработке, оказывается.

http://research.microsoft.com/specsharp/papers/krml135.pdf

Compile-Time Attributes

Я вот тут вдруг подумал, что валидацию параметров методов надо бы делать декларативно.

Самая большая ерунда в том, что самому такую ерунду написать проблематично - ведь для разбора атрибутов придется лазить в рефлекшн, да еще и писать что-то вроде менеджера вызовов, который будет применять логику до вызова метода и после него. Тем более такие штуки, вроде бы, уже есть: http://www.codeplex.com/ValidationFramework. Не думаю, что они очень быстрые, эти штуки.

Надо чтобы компилятор сам впихивал в начало метода соответствующий код. Неужели такого еще нет? Вот блин.

Friday, May 25, 2007

WTF?

private const FileOptions requiredOptions =
FileOptions.Asynchronous | FileOptions.DeleteOnClose | FileOptions.Encrypted |
FileOptions.RandomAccess | FileOptions.SequentialScan | FileOptions.WriteThrough;

private void someMethod(FileOptions options)

{

if ((options & ~requiredOptions) != FileOptions.None)

throw new ArgumentOutOfRangeException("options");

}

Wednesday, May 23, 2007

Нашел еще один интересный performance-bug

1000 объектов DateTime в Hashtable, обрабатываются раза в 3-4 медленнее, чем 1000 объектов в Generic Dictionary. Вот такая ерунда. Время экономится на операциях boxing-unboxing.

Tuesday, May 8, 2007

Автоматизация тестов

Как же часто нормальное юнит-тестирование спасало проект и сохраняло мне часы и дни героических боев с багами! Сейчас тесты, наряду с любимым инструментом для рефакторинга, кажутся такими естественными, неотъемлемыми атрибутами процесса программирования, что без них чувствуешь себя буквально без рук. Невероятно раздражаешься, когда приходится лишний раз открывать тормозной отладчик. Гадость в том, что не все поддается автоматическому тестированию. Базы данных еще более-менее побеждаются всяческими там фейками (fake), моками (mock) и прочими ухищрениями, но вот при интерфейс пользователя - полностью ручная работа.

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

  1. Заказчик, в подавляющем большинстве случаев, мыслит именно в категориях интерфейса. То есть все, что он себе представляет - это внешний вид системы и ее реакцию на действия пользователя. Естественно желание сделать нечто, что сразу же говорит разрабочтику, соответствует результат работы этим требованиям или нет.
  2. Если все нижние слои системы покрыты тестами, то UI получается самым слабым звеном. В нем чаще всего появляются и сложнее всего ищутся ошибки. А тратить 20 минут и лезть в какой-нибудь ASP.NET-отладчик, который съест полтора гига оперативки, ради того, чтобы узнать, что какой-нибудь там дропдаун (dropdown) не восстановил состояние из вьюстейта (viewstate), согласитесь, раздражает.

Теперь, какие же все-таки возникают проблемы, помимо самой технической нетривиальности?

  1. Там приходится программировать. Это утверждение не кажется таким уж глупым, если учесть, что отделы QA укомплектованы не программистами. QuickTestPro предлагает писать скрипты на бейсике, различные NUnit-библиотеки для ASP используют прямо C#. Кроме того, для каждого теста надо готовить исходные данные, для чего может понадобиться соответствующий навык, чаще всего SQL.
  2. Эти тесты ужасно долго работают. В большинстве случаев системы тестирования позволяют записать примитивный макрос - последовательность движений и кликов мышки, нажатия клавиш и т.п. То есть для тестирования веб-приложения система открывает браузер, ходит там по нему, кликает и т.п. Таким образом, это не дает немедленного фидбека разработчику так, как это делают юнит-тесты.
  3. Соответственно, тестирование нельзя запустить в фоновом режиме на рабочей машине. Приходится еще и выделять отдельный компьютер. Иногда бывает проблемой.
  4. Поддержка написанных тестов в рабочем состоянии - головная боль тестеров. Интерфейс пользователя меняется быстро. В ASP.NET, скажем, стоит положить контрол на страничке в другой контейнер, как его клиентский ID кардинально изменится. Тест поломается, а выполняется он долго, то есть чинить его тоже достаточно долго и неприятно. В итоге все сведется к тому, что тестер плюнет на все, самостоятельно пробежится по страничкам и на глаз посмотрит, что "вроде все правильно".
  5. Чувствуется большой недостаток в общении между разработчиками и тестерами. То есть по идее, исходя прямо из тербований заказчика, можно было бы изначально договориться о том, какие элементы управления понадобятся на данном экране. Потом на экран попросту сверху вниз слева направо добавляются все необходимые кнопки, которые пока ничего не делают. На этом этапе тестеру уже есть над чем работать.

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

Monday, May 7, 2007

Оптимизация

Вчера нашел в приложении интересный перформанс-баг. Ситуация следующая. Есть некий Hashtable и некий набор объектов. В определенных случаях объекты бывают почти одинаковыми, и их достаточно много (больше 1000 штук). Все они пихаются в этот Hashtable, где ключи - специальные объекты, у которых переопределены Equals и GetHashCode.

После этого обнаруживается, что работа с Hashtable занимает какое-то нереальное время. Даже если пробежать по всем ключам и для каждого просто сказать Assert.IsTrue(Hashtable.Contains(key)) - потратим несколько секунд!

Баг в том, что реализация GetHashCode ключа почти всегда возвращала одинаковые значения. Hashtable, по идее, должен строить бинарное дерево по хэш-кодам своих элементов. Если хэш-коды для каких-то объектов совпадают, то в соответствующий узел дерева кладутся все такие объекты в простом связном списке. А если разных хэш-кодов всего-то, скажем, два, то получаем два списка по 500 значений в каждом, поиск в которых выполняется тупым перебором.

Agile documents

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

Мы пробовали уже много разных способов фиксации требований и обсуждений.

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

2. Результаты обсуждений в почте - вообще неприемлемо. Там постоянно образуется по нескольку версии одного документа, и далеко не всегда понятно, кто кому на какой вопрос отвечал.

3. Просто документы с контролем версий - это формализм. Ведение вордовых и экселевых документов - это не "гибко". Это не двусторонее общение, это не коммуникации - это постулирование и констатация требований. В теории, если правильно вести документы, то все будет, казалось бы, отлично. Но тут сыграет свою роль человеческий фактор. Кто будет фиксировать в документе все изменения и следить за актуальностью? Специально выделенный человек? Он не будет этого делать. Чтобы делать это, надо хорошо разбираться во всем проекте. А тем людям, которые хорошо разбираются во всем проекте, обычно не до этого. Чаще всего таким человеком назначают ("назначают" - опять какое-то слово из не-agile лексикона) либо самого младшего со стороны бизнеса, который и в самой предметной области проекта не очень-то шарит, либо бизнес-аналитика, который будет заниматься только ведением документов, то есть станет единственным бюрократом в проекте. За это его перестанут любить и начнут игнорировать. И вообще, формальность отношений в команде противоречит религии "agile" :).

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

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