Sunday, May 9, 2010

Зарисовка "Турецкий базар"

Пришла в голову, наблюдая за отдельными менеджерами по продажам...

Турецкий базар - соитие ада и рая. Здесь вам дадут попробовать сладости, которых вы еще не пробовали, дадут испить ледяного щербета, а через пару шагов обжигающего кофе, крепкого настолько, что мнится воды в напитке нет - есть только кофе, внявший просьбам поваров и ставший жидким... А пройдя еще чуть-чуть кто-то непременно толкнет вас в мусорную кучу, напоминая, что удовольствия - это хорошо, но зевать не надо - а то, вот оно - место для нерасторопных, прямо перед вами - лежит, окруженное мухами и пахнет так, что хочется бежать к ближайшему продавцу гвоздики, кажется, он в трех лотках отсюда?.. И будет базар водить вас, не желая отпускать, пока есть еще силы идти, а если нет - то хотя бы сидеть в любой чайхане, а если и этого нет - то хоть прилечь в ближайшей кальянной.... главное, чтобы деньги были. Да, это главное - базару вы интересны только пока можете что-то ему дать. И страсти разгораются на каждом углу - обряд, посвященный базару и всем богам торговли, которых можно вспомнить - торг за все что угодно.
- Ножи! Прекрасные ножи! Режь что хочешь - хоть колбасу, хоть тещю.
- Сколько-сколько вы предлагаете?!
- Орехи! Фисташки! Финики! Налетай - подешевело!
- Сколько-сколько вы просите?!
- Горшки! Прекрасные горшки! Специально для вас!
А это новенький, ему недавно досталась от дяди гончарная мастерская и решил он пойти продавать горшки. Дядя его все больше для своих трудился, и рад был помогать соседям, а молодости-то этого мало... им же надо что-то новое, большее, лучшее... вот и решил он торговлей заняться. Он же не дядя - не пристало ему только для своей деревни горшки делать, надо для всех, и чтобы его знала не только деревня. Посмотрим же, как он справляется:
 - Горшки! Уникальные горшки! Только для вас!
А вот и покупатель... Смотрит, трогает, хмурится - не хочется ему признавать, что горшки и впрямь неплохие...
 - Да уж... налепил... и сколько же ты хочешь за такие поделки?
Не смутился наш новичок, знает - правила торга, будут хмурится и ворчать, будут хаять, надеясь цену сбить, но нас таким не проймешь:
 - Совсем мало прошу, за замечательнейшие горшки. Вы смотрите на них - и ровные все, и брать удобно и толстые есть чтобы в тепле хранить, и тончайшие есть чтоб перед гостями хвастать!
Видит покупатель - и впрямь горшки-то хорошие, да и жена велела купить... но не покупать же сразу, надо цену сбивать. Думал, хмурился, и вдруг увидел:
 - Да где ж хорошие? Где ж брать удобно - ручек-то нет! Вон ты посмотри по базару - у всех горшки с ручками, чтобы значит и налить можно было аккуратно и носить легко, а твои - только плескать из них хорошо!
А молодой горшечник вдруг весь сдулся при этих словах, смотрит - и правда, недалеко лоток с горшками, так там почти все с ручками... а он и забыл как-то, ему и так удобно было... и дед его всегда без ручек делал... А то что у соседей горшки почти все кривые, это издалека и не видно-то.
 - Мои горшки и без ручек удобные! Возьмите - попользуйтесь, убедитесь сами. А через десяток дней приходите - или горшок вернете, или заплатите.
Удивился покупатель такому, но кто ж отказываться от бесплатного горшка будет? Взял и ушел домой пробовать. Придя домой, рассказал он жене как сторговался до бесплатного горшка, а та подругам своим рассказала, те мужей своих погнали на базар... И раздал горшечник молодой свои горшки "на попробовать". А тем временем новые горшки непременно с ручками делал.


Прошел десяток дней, не вернулся первый покупатель. И второй не вернулся. А третий пришел, и горшок принес:
 - Попробовал я твой горшок - неудобно без ручки, забирай назад.
Смотрит горшечник - а горшок-то уже и надколоть успели, и жир на стенках нарос - выкидывать придется. Грустно ему стало, но он вспомнил что надо быть веселым перед покупателями, и начал продавать свои новые изделия:
 - А возьмите вот эти - и с ручкой, и удобные, и красивые - на стол поставишь и самому приятно и перед гостями не стыдно!
Покупатель смотрит - а чего бы еще один горшок не "попробовать" - только и делов-то, что что-нибудь несделанное найти...
 - Не стыдно, говоришь? Да как я такой простой горшок, безо всякой росписи на стол поставлю? Такой только в чулане хранить можно!
Чуть не заплакал тут торговец:
 - Ну возьмите хоть попробовать. Вы же увидите, удобный горшок, хороший. Ну, пожалуйста.
Обрадовался покупатель - опять сработало, и взял горшок. А придя домой - жене рассказал.

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

Monday, May 3, 2010

История о локализации - pootle

Как мы делали локализацию сайта.
Если не вдаваться в технические подробности вкручивания локализации в перловый код, то самое интересное было в установке и настройке системы для переводчиков - pootle.

Прикольная штука, местами тупая до безобразия, а местами вполне даже ничего, только привыкнуть к ней надо...
Итак, pootle - система представляющая веб-интерфейс для редактирования файлов локализации. Поддерживает несколько форматов, чуть-чуть умеет работать с VCS (разными), написана на питоне и заточена под linux.

Из особенностей собственно процесса перевода:
 - переводчик может смотреть / переводить / предлагать варианты перевода / коммитить
 - на все отдельные права
 - в качестве "исходного" языка может показывать любой язык - не только msgid

Неочевидная вещь - разные режимы просмотра файлов:
 - режим просмотра / перевода - все записи показываются по-порядку, по 10 на странице (не настраивается)
 - режим проверки / поиска - записи показываются все, но кнопки "Пропустить" ("Skip") / "Назад" ("Back") переводят не на след / пред запись, а на след / пред запись отвечающую условиям поиска. Проверка - это тоже поиск, по условиям "у записи есть предложение перевода" + "у записи стоит флаг 'неточно' ('fuzzy')"

Потратив некоторое время заставили ее нормально взлететь на FreeBSD, потратив еще какое-то время - настроили проекты. Основная проблема тут была в том чтобы объяснить pootle'у что файлы проекта надо еще и с VCS связать. Он такие схемы понимает только если структура каталогов выглядит как po/project_id/lang.po или po/lang/project_id.po. Отдельно доставляет то, что обновлять файлы из него, хоть он вроде и умеет, приводит к непредсказуемым последствиям - может появится набор предложений перевода для служебных записей, или у последних в файле или еще что.

Коммитить из него вроде проблем не составляет... разве что он упорно всех переводчиков хотел называть по именам - без фамилий. Но это легко поборолось. А вот никаких средств против race между разными переводчиками - это зло. Перед коммитом нельзя посмотреть diff - т.е. если переводчиков много, а права коммита только у координатора - то, что именно будет закоммичено можно узнать только постфактум. Впрочем, даже если бы diff был (мы его в результате добавили) - никаких lock'ов все равно нет - так что между diff и commit от координатора содержимое все равно может измениться.

Еще одна веселая особенность - связь с ldap. Поддержка есть из коробки, но странная - фильтры на поиск можно задавать только не содержащие ldap специфичных знаков - строка фильтра прогоняется через ldap.filter.escape_filter_chars... т.е. задать фильтр вида (&(objectClass=myOrgPerson)(uid=%s)(memberOf=cn=tranlators)) нельзя. Пришлось и тут поправить.
На этом веселье не заканчивается - он не пользуется ldap постоянно - только при первом логине, после чего копирует из ldap всю информацию, которая ему нужна (имя, фамилия, email) в свой локальный cache и дальше пользуется им... более того - даёт менять в нем...  Т.е. ничто не мешает переводчику подписываться в коммитах не своим именем-фамилией-адресом, а любым произвольным... президента компании, например :)

Итого: система сырая, требует напильника. Но с другой стороны - это проще чем руками сводить результаты редактирования файлов от 5 людей, ни один из которых не имеет представления о VCS... Так что впечатления положительные. Особенно повеселил посимвольный diff для предложений перевода (и зачем-то анимация при принятии и отклонении предложений).

Sunday, May 2, 2010

История о гибкости интерфейсов Часть 2

Продолжаю рассуждать вслух...

Что же делать создателям интерфейсов, когда количество кнопочек, галочек, виджетов и прочего переходит границы разумного и создают комбинаторный взрыв вариатов показа? Из того, что сейчас в сети есть - не так уж много вариантов работает:
 - решить что создатели лучше знают какие и где кнопки пользователям нужны - все остальное скрыть
 - сделать набор из нескольких вариантов, и где-то спрятать выбор предпочитаемого, пример - gmail, есть несколько вариантов типа старый,новый,мобильный и выбор между ними
 - сделать один/два варианта и сделать конструктор интерфейса - blogspot, с его конструктором блога

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

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

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

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

Взглянем на google-analytics - сколько пользователей, которые смотрят в нем статистику своего сайта и не читают их блог, знают о том что посещаемость можно измерять 12 разными способами, не считая фильтрации траффика?

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

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

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

Saturday, May 1, 2010

История о гибкости интерфейсов

некоторые мысли вслух по поводу интерфейсов...

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

Собирая всяческие пожелания пользователей вида "Хочу вот тут так ткнуть и чтобы оно...", сводишь их, по возможности, вместе. Разумеется, пытаешься придумать какую-то одну схему, покрывающую большинство запросов пользователей, включая те, которые еще не озвучены, но ты их уже предвидишь. В результате, реализация нового функционала зачастую дает каждому конкретному пользователю значительно больше возможностей, чем он хотел - и тут-то появляется вопрос: а оно ему все надо? и если нет, как определить кому какие части нужны?

Рассмотрим на почти-выдуманном примере: вот смотрю на меню над полем редактирования - много кнопочек, менюшек, всплывающих окон настройки и тому подобного. Несложно представить себе пользователей - "Хочу менять цвет", "Хочу менять шрифт", "А мне списки нужны", "А я..." и так далее. Кто-то посмотрел на все эти пожелания и сделал большую панель скопировавшую функционал текстовых редакторов. Часть пользователей обрадовалась - "О, как в ворде", часть осталась недовольна - "я просил только цвет, зачем мне это все", еще часть возмутилась - "за идиотов держите? мы сами html написать можем."...  Одну проблему поменяли на другую. Следующий вопрос - оно того стоило? Простое исследование аудитории, статистики пользования и прочее показало - стоило, но оставшихся недовольных тоже надо как-то порадовать.


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

Продолжим наш пример:
раз уж речь про панель форматирования текста, то аудитория - широчайшая, значит никаких сложных решений применять нельзя. Все должно быть понятно написано.
Изучая частоты использования кнопок можно составить список на выбывание. Совсем из панели или в отдельно всплывающее окошко, которое спрячется за кнопкой "Еще" или как-то так.

В результате - несколько кнопок выкинули, а для тех кто "сам может" сделали возможность вводить html напрямую, при этом пришлось сделать еще и настройку - какой режим по умолчанию использовать.

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

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

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

Первый пост

Первый пост во многом тестовый - надо же попробовать как оно работает, "зачем вот тут эта кнопка" и всё такое. Ну и оценить как должен блог выглядеть тоже полезно.
История первая: я завел блог. Столько времени не собирался, а тут вдруг подумал, что некоторые свои размышления и идеи, которые уже не попадают под коммерческую тайну стоит записывать.Может кому-то поможет, а главное - чтобы самому не забыть.