28 октября 2008 г.

S?XBuilder

Today I've seen quite amazing exception: java.net.ConnectException: Connection timed out: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) ... ... ... at org.jdom.input.SAXBuilder.build(SAXBuilder.java:489) at org.jdom.input.SAXBuilder.build(SAXBuilder.java:888) at asg.newsbook.XHtmlToolkit.createDocument(XHtmlToolkit.java:61) ... ... ... (deep from Jasper engine) I've simply called org.jdom.input.SAXBuilder.build(String). I expected this thing to simply parse the damn string into Document, I could expect that it'll throw an exception about invalidity of the document, whatever. No. Software gets so complicated. SAXBuilder decided for whatever reason (here I'm guilty, of course), that it must connect with W3C and download the XSD, or DTD, whatever it needed. And for my each document it sent a web request. Thus slowing down the application a factor of hundreds, accidentally throwing exceptions like the one above, when W3C was too busy. Soo.. Decide for yourself, is this behavior sexy. I think it is. Today I've had enough sex debugging that application. Easy as it was to believe that SAXParser really sux, I'm full of respect of this quite intelligent thing.

12 августа 2008 г.

Usability match: Nokia vs. Sony Ericsson

Кое-что на эту тему я уже писал.

Попробую вообразить, что я Лебедев (или Joel Spolsky; ум, эхм, лучше уж Лебедев :-) и написать, что я ненавижу.
Я ненавижу пользовательский интерфейс „умных“ мобильных телефонов Nokia. (и еще компьютерные мыши).
Но, кажется, я еще „немного“ не дорос до великих гуру юзабилити, так что — остаюсь AnSGri и попытаюсь сравнить интерфейсы мобильных устройств от крупнейших производителей со всем цинизмом и объективизмом.

Прежде всего, условимся, что речь идет о многофункциональных мобильных устройствах, а не просто о телефонах (предпочту не употреблять слово «смартфон», так как SE K700i обычно смартфоном не считают, а именно про аппараты такого класса пойдет речь).

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

Первый раунд. Пользователь впервые в жизни видит устройство. Коробка распакована, SIM установлен, нажата кнопка включения. Nokia просто включается. Он набирает номер, и — замечает кнопку с изображением зеленой телефонной трубки. Очевидно, «позвонить». И правда, работает. Точно так же, как и кнопка с красной перечеркнутой трубкой успешно завершает вызов. Sony Ericsson включается, запуская Мастер настройки, который позволяет настроить язык, время и даже, может быть, запросить настройки интернета у оператора. Замечательно! Но тут появляется странная страница, на которой нас, по всей видимости пытаются чему-то научить. «Как так! Какое-то устройство вздумало меня учить!» Но возмущение вскоре спадает: там изображена кнопка «назад», и пользователь запоминает, что у устройства есть такая клавиша. Настройка завершена, он набирает номер — и видит, что над левой софт-клавишей написано «вызвать». Тут все гладко. Во время вызова над правой софт-клавишей загорается сначала «отмена», затем «отбой». Тут тоже все ясно, и не перепутаешь. Первый раунд окончен со счетом 1:1.

Второй раунд. SMS. Подопытный, пользуясь подсказками над софт-клавишами, добрался по меню до пункта «Новое сообщение», и тут начинается другой вид деятельности — набор текста. Пользователь имеет общие представления и о T9, и о посимвольном наборе, но ранее не очень много ими пользовался, чаще имея дело с полноразмерной клавиатурой своего ПК. Допустим, он хочет набрать «Привет! Я себе мобилу Nokiaкупил». В этом простеньком сообщении аж целых две «коряги» — восклицательный знак и смена языка. Потыкав всякие кнопочки, можно найти, что под «звездочкой» скрывается меню ввода символов, которое решает задачу. А вот со сменой языка проблема. Если и можно догадаться, что удерживание решетки переключает способ ввода, то можно предположить, что переключение языка скрыто там же. Ан нет! И пользователь, уже изрядно наматерившись, прибегает к последнему средству — инструкции. И знаете что? Он не находит ответа на свой вопрос. Настроение испорчено, и в отправленном сообщении говорится «Ну и г*о же эта Нокия!». Тогда как второй экземпляр пользователя успешно пишет «Sony как всегда сделала отличное устройство!», потому что над правой софт-клавишей написано «Функции», и при ее нажатии вылезает столь привычное контекстное меню, в котором есть и вставка символа, и смена языка, и все что угодно. А все потому, что кнопка «Назад» уже есть, и не занимает драгоценную софт-клавишу. Ах да, я совсем забыл про третью «корягу» — исправление опечаток. У Nokia для этого как раз служит правая софт-клавиша. У SE по-другому — для удаления служит кнопка «C». С логичностью такого решения можно поспорить, но лично я с первого взгляда понял, что она обозначает «Clear», то есть — удалить. 2:1 в пользу SE, а точнее, против Nokia. Хотя, мне кажется, кто-то сочтет это нокаутирующим ударом.

Третий раунд. Power Usage. Итак, с двумя основными функциями разобрались, но не за них мы платим большую часть стоимости, а за поддержку приложений, наличие камеры, органайзера, медиаплеера и прочее. Честно скажу, не слишком много с нокиевскими устройствами общался, однако первые впечатления не лучшие. Задам вам лишь один вопрос, на который, однако, нормальный человек редко ответить в состоянии: что делает кнопка с изображением телефонной трубки в режиме фотокамеры? Я не знаю, но кажется, что на самом деле она ничего не делает. Что ж, хотя бы ничего плохого... Как сказать. У Sony Ericsson, как можно догадаться из предыдущего раунда, управление подобно управлению компьютером с помощью двухкнопочной мыши. Левая софт-клавиша или щелчок джойстика — действие по умолчанию, типа «Открыть», «Сохранить», «Позвонить». Правая же в большинстве случаев открывает самое настоящее контекстное меню. При этом кнопка «Назад» возвращает нас ровно на один шаг назад, всегда и везде, а кнопка «C» обозначает удаление объекта под курсором, если это возможно. Я уж не говорю про кнопку «Alt-Tab», переключающую приложения или открывающую подобие меню «Пуск», появляющуюся на последних моделях. 3:1, хотя по мне так и нокаут.

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

9 августа 2008 г.

ООП как создание предприятия

Недавно я писал об опасности излишней "объектаризации" (или объективизации?..) и провел аналогию между написанием программы и управлением предприятием. Сейчас давайте рассмотрим эту аналогию поподробнее.

Прежде всего, условимся считать объектом рабочего либо механизм. В большинстве случаев особой разницы нет, потому что в современном производстве мало задач, с которыми бы не справился робот конечной сложности. Какую-нибудь узкоспециализированную утилиту, типа юниксовой ls можно считать монолитным инструментом, упрощающим отдельную задачу. И когда мы пишем "ls | sort", мы просто последовательно применяем два разных инструмента, как последовательно применяем зубило и напильник при обработке куска металла.
Пока мы можем без труда справиться с некоторой задачей в одиночку, не имеет смысла разделять эту задачу на объекты. Так, можно без посторонней помощи, последовательным применением пилы, рубанка, наждачной шкурки и молотка с гвоздями можно смастерить, скажем, табуретку. Но мы хотим не просто табуретку, мы хотим красивую табуретку, которая не будет портить наш интерьер своей угловатостью, а напротив, будет радовать глаз. И появляется идея пригласить резчика и художника, чтобы они украсили наше произведение. (И что-то мне это уже напоминает: табуретка с двумя декораторами...)

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

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

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

6 августа 2008 г.

ООП навязывает управленческий образ мышления

... причем в худшем его проявлении - в стремлении переложить всю работу на подчиненных и нежелании делать ничего самому. Беда в том, что в результате самому работать приходится еще больше.
Например, недавно мне пришлось писать модуль вычисления выражений (короче, калькулятор, считающий "a + 2px * sqrt(2) - 3.0em") на C#. В этом языке нет ничего, кроме объектов. Поэтому я, недолго думая, создал классы Лексема, Выражение, Оператор и т. п. И оказался в глубокой задумчивости: а какие же "приказы" им раздать, чтобы они сами все сделали?
Здесь полезно обратиться к аналогии между ООП и управлением предприятием, где каждый объект - это работник, а программист (ну или разработчик) олицетворяет высшее руководство. (Можно еще добавить, что операционная система - это государство, а аппаратура - это сама природа).

Итак, как же мы бы организовали вычисление выражения на предприятии? В нашем изначальном "объектном" варианте задействована толпа служащих - числа, операторы, функции, единицы измерения и т. д. И я не завидую тому менеджеру, которому предстоит давать указания всем этим людям (читай - написать программу взаимодействия всем этим объектам). А как бы вы поступили на месте этого несчастного менеджера? Моим ответом было "написать значение на лбу у каждого, выстроить в ряд и посчитать все самому". Потому что это несравненно проще, чем объяснять каждому правила поведения в нашем выдуманном мире. Так зачем же нам живые люди (объекты)? Нам и мертвые сгодятся! (пассивные структуры). Или, еще лучше, собрать механизм, который, в отличие от мертвых людей, не разлагается. (Написать единый модуль в структурном стиле). Ну или нанять квалифицированного специалиста (купить готовую библиотеку, решающую нашу задачу).

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

1 августа 2008 г.

Проект: SmartEdit Control

Недавно мне пришлось работать с замечательным графическим редактором CorelDraw. Это не просто чрезвычайно мощный инструмент для работы с векторной графикой, в том числе и инженерной, но и просто очень качественно выполненный программный продукт. Об этом говорит следующая маленькая и, я подозреваю, мало кому известная деталь: почти все текстовые поля для ввода чисел (длина, координаты, ...) понимают арифметические выражения и единицы измерения. То есть, если вы хотите сдвинуть объект на 5 мм, вы щелкаете по полю и дописываете "+ 5mm". И все работает! Несмотря на то, что исходное значение дано в дюймах. В Photoshop, насколько я знаю, тоже нечто подобное реализовано.
А вот в Microsoft Office Word, когда нужно сделать ровно двадцатимиллиметровый текст, приходится отвлекаться от работы и вычислять "20.0 / 25.4 * 72". Мелочь, конечно, а неприятно. Именно из таких маленьких разочарований и складывается плохое настроение. Компьютеры давно уже существенно более мощные, чем необходимо, но почему-то калькулятор под рукой держать все еще приходится ("покажите мне удобную программу-калькулятор!").

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

А пока я ухожу в гугл. Вдруг есть уже такое в этом мире?