суббота, 15 ноября 2008 г.

Windows Live Writer – проверка связи

Ну, а теперь попробуем все это понаписать в Windows Live Writer. Сюда для начала вставим скриншот Aml Maple:

 

Чуть ниже для пробы вставим ссылку на Aml Maple, более известную в народе как просто “Мапля”. Кстати, вероятно назрела необходимость упомянуть, что “Мапля” все-таки пишется слитно, и несмотря на периодически звучащие сомнения - это действительно единое слово. Дефиса между обоими слогами не нужно. Распространенная гипотеза, что во втором слоге букву “п” нужно писать с Большой буквы также не соответствует действительности. Опять же, обратим внимание, что именно “п”, а никак не “б” (и не надо косить на очепятки опечатки :)

Пожалуй, хватит на этом!  Убедились что все фичи Мапли  распрекрасно работают в WLW и отлично – большего и не надо. Теперь посмотрим как WLW сможет все это опубликовать в блоге…

 Поехали…

Testing BlogJet

I have installed an interesting application - BlogJet. It's a cool Windows client for my blog tool (as well as for other tools). Get your copy here: http://blogjet.com


"Computers are incredibly fast, accurate and stupid; humans are incredibly slow, inaccurate and brilliant; together they are powerful beyond imagination." -- Albert Einstein

понедельник, 23 июня 2008 г.

Как я локализовался


После выхода финальной версии одного из моих продуктов зашла речь о его локализации на другие языки. Надо сказать, что изначально продукт создавался исключительно на русском языке, и о локализации не шло и речи, т.к. каждый день в свет выходило до пары-тройки сборок. В конце же, в районе выхода финальной версии была создана и английская версия приложения, и английская версия сайта. На английской версии было вывешено формально-обязательная «объява»:


«Help translating and proof-reading Aml Pages and get a free registration»,


причем вывешена далеко не в самом заметном месте. А как же? Святое дело! Удочку закинем, а когда уж «клевать» будет - разберемся что делать, кто виноват, и куда деваться. Но, тем не менее, через некоторое время ко мне обратился Patricio Silva - пользователь из Южной Америки, а точнее из Чили - и предложил сделать за бесплатную регистрацию испанский перевод пользовательского интерфейса. В «разговорах в курилке» этот приятель как-то быстро стал за глаза зваться просто «испанцем», ну и поэтому и здесь он фигурирует под этой партийной кличкой.



Ну и что? Да понятно что! Кому же не нужна локализация? Локализация интерфейса дело важное и нужное. Больше языков - хороших и разных. Тем более локализация на такой язык как испанский - все-таки на нем или на его производных половина бывших колоний лопочет - это такой локоток, который укусить хочется. Чего там укусить, слопать целиком, и на серебряном блюдечке. Конечно же, я согласился.



Microsoft более-менее официальным тоном во многих статьях предлагает следующую схему локализации: перевод rc-файла (RC, Resource Script - файл с описанием пользовательского интерфейса). Ну и гут: предлагают - бери, бьют - беги! Тем паче, что моя софтинка была написана на MFC, а эта библиотека предлагает к этому способу всякие другие занимательные рюшечки, глядя на которые в мечтах рисуется и небо в алмазах, и «малиновые штаны», и «банкомат на пляже».
Да и вообще все представляется в стиле Microsoft "Вы будете управлять [локализацией] на кончиках пальцев!!!"... Ну, ясное дело, раз предлагается такой рулез, на этот способ я и заложился. Это уж потом стало понятно, что «да-а-а-а-а-а-а уж» (© Киса Воробьянинов)! Точно! На кончиках! И именно пальцев! ...Только видимо пальцев ног, и некоторые мелочи в этом заявлении проскользнули между пальцами (судя по всем, между большими)...



Собственно подробности предлагаемых наворотов расписаны в статье "Динамическое переключение языка интерфейса в MFC-приложениях". Там же есть и эпохальная фраза о необходимости постоянного слежения за тем, что версия перевода и основного файла всегда должны быть в соответствии.


Фраза то там есть. Да только не описано в деталях, что будет когда версии станут хоть малость, но разными (а они станут, и очень быстро станут). А дьявол, как известно, он в деталях.


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



Танцы с бубном начались с того, как переведенный вариант «вливается» в саму программу. Пользовательский интерфейс может быть неотъемлемой частью exe-шника, или сопутствующей DLL или еще как-то. Я, понятное дело повелся на официальный способ, и возрадовался возможности иметь основной exe-файл с английским языком пользовательского интерфейса (UI), и дополнительную DLL с испанским переводом. Модульность, модульность и еще раз модульность. Очень заманчивой казалась возможность спокойно развивать сам код exe-шника с английской версией UI, и просто цеплять к нему испанский интерфейс в виде DLL. В общем, ночь-заполночь, выслал я испанцу английский rc-файл с инструкциями, что и как переводить.



Время идет, английская и русская версия как-то там потихоньку развиваются в пределах мелких багов, испанец периодически о чем-то спрашивает меня по мылу. В общем, чувствуется, что перевод движется, «процесс идет» и в скорости надо ожидать результат. В общем, солдат спит - служба идет. Довольно потираем ручки. В общем, в предвкушении я, в ожидании... Еще бы! Закажи я этот перевод за денюжку - влетело бы в сотни бакинских. А тут за какую-то регистрацию - фиг с ними с десятками зеленых - все в выигрыше: и я, и он. Уж не говорю о том, что переводит Native с нормальным родным!!! испанским языком, а не из Пердянского филиала педагогического факультета Мухосранского табаретостроительного института. Поэтому и качество перевода, вероятно, будет более-менее на уровне.



Спустя несколько недель испанец присылает мне rc-файл, уже переведенный на испанский язык. Ну, мол думаю, гут! Сейчас заделаем испанскую версию! И вот тут-то и начинается самое интересное.



Испанец попался усидчивый и настойчивый - он перевел всё. Нет, нет! Вы меня не поняли - он ва-а-а-бще всё перевел. Абсолютно. Поэтому если в rc-файле встречалась славная конструкция вроде:



"Button",11, 17, 22, 30 "My Bytton Caption",


то испанец и ее добросовестно и переводил

"Кнопка",11, 17, 22, 30 "Надпись моей кнопки",


(ну, соответственно, на испанский язык).



Кто видел RC-файл - тот понял. Но все ж поясню, в данном месте первое слово "Button" это название класса окна, которая «говорит» RC-компилятору, что данный контрол это кнопка (цифры это координаты кнопки диалоге). И таких «программистких» конструкций в rc-файле тьма тьмущая. Ага! И все переведены! Ух, как я зауважал Microsoft за то, что большая часть классов окон у них имеет малоудобоваримые названия для обычного человеческого глаза, вроде: control, groupbox, ltext. По ним то видно, что это какой-то код. А то бы испанец и их перевел - поверьте, он хоть и не IT-специалист, но нормальный человек - эти милые моему сердцу «коды» все же уцелели.



Но с другой стороны испанцу мне и сказать-то нечего! Я ж сам ему выдал инструкции: переводи всё, что в кавычках. Он и перевел. Ну, что поделать? В общем, я сам виноват. И послать нельзя: испанец не виноват, что он не читает код rc-файла глазами, компилируя в уме. Опять же столько времени потрачено - бросать не хочется. Да и выпустить перевод хочется:


а) испанский все же! Действительно распространенный язык.


б) выпустить именно сторонний перевод, чтобы прочувствовать весь процесс локализации самому - «ручками», «жабрами» и «ноздрями». Познать все радости и подводные камушки этой деятельности изнутри.



Ну, ясное дело, править искореженный до полусмерти rc-файл пришлось мне самому. Т.к. ну не объясню я «дикому» испанцу, где Button надо переводить - ибо эта часть строки, а где это класс окна и нужно оставить как есть. Ох, и приятное же это занятие, хочу Вам доложить. Незабвенным "Replace All" этой проблемы не решить по той же причине - кое-где слово Button употребляется в составе какой-то строки, а где-то его все-таки переводить нужно. Поэтому покликать на «Найти далее» пришлось изрядно. Какие-нибудь регулярные выражения не предлагать. Ну, не силен я в них. Да и решать проблему надо так, чтобы ее не было. А не придумывать автоматизацию багфикса для такой засады.



Опять же есть и были другие нюансы. Как известно, любой парсер впадает в основательный ступор, если не закрыта какая-то парная конструкция формального языка вроде скобок (),{}, или «кавычек» (кто на Си писал - наверняка видел как компилятор клинит). Компилятор rc-файлов не исключение. Поэтому его крепко озадачивают те же самые незакрытые кавычки. А надо сказать, что в rc-файле их хватает: по пяток штук на строку - да легко!!! Мало того, что ими ограничиваются строки, но если в составе какой-то строки есть еще кавычки (уже по смыслу), то они отмечаются двойными кавычками.



Пример: «Пожалуйста, нажмите кнопку ««Закрыть»», чтобы больше не видеть этот rc-файл».


Вот в этом примере кавычки в начале и в конце строки это ограничители самой строки в RC-файле. А двойные кавычки внутри фразы на слове ««Закрыть»» - сие есть хитрая конструкция внутри rc-файла, которая говорит rc-компилятору, что эти кавычки реально по сути есть в самой строке.



Как вы думаете, испанец работал в рекурсивном режиме - и в уме контролировал число открытых и закрытых кавычек?

Правильно! Ага, щаззз!


Поэтому мой бедный rc-компилятор мучился не по-детски чтобы диагностировать: где же ошибка. В начале файла открыли - через пару-тройку десятков строк, уже в соседнем описании диалога «вумный» компилятор нашел закрытую :). Про всякие MENUITEM, переведенные на МенюЭлемент, уж помалкиваю - это семечки. Такое правится ручками без «отрыва от пива с друзьями» - просто такие ляпы и видны хорошо, да и "Replace All" с ними вполне справляется.



А надо сказать, интерфейс у меня был немаленький, как впрочем, и сам продукт. Я уже упоминал выше, что испанец трудился несколько недель. Причем явно «пиво не пил», а действительно занимался делом, т.к. письма с вопросами от него приходили через день точно, а иногда и почаще. Тут еще примечателен такой момент, что испанец то Чилийский. Это вообще-то соседнее полушарие, другая сторона Земли. По прямой - через внутреннее ядро Земли - ей богу короче, чем по экватору (правда, все же, на экваторе задницу не так напечет как внутри). Это значит, что когда у нас день - у них ночь. И наоборот. У нас разница так примерно с часов восемь. Самое продуктивное по времени было отправлять ему ответы в наш вечер - тогда у него было более менее утро, и он как раз успевал что-то по делу ответить часиков до 2-3 ночи по Москве. Так что все прелести неслабо распределенной в пространстве команды тоже себя проявили по полной. Он мне вопрос: «переводить ли "Button" вот тут вот». Я часов через 7 проснусь - ему отвечу, он через часов 7 прочтет. Отлично! Еще день прошел, мы еще сдвинулись на одно предложение. И это когда вопрос простой. А когда что-то существенное, по делу, когда мне нужно самому погуглить, поискать решение, подумать - то какой уж тут ответ в три минуты!?! Вот такие вот темпы работы.


Но ё-моё... Вы представляете объем этой моей правки rc-файла? Я потратил полностью два вечера (часов по 4-5) на приведение rc-файла в порядок, и что-то где-то урывал по мелочам - то с утра минут 20 поаппрувишь, то там 10 минут, то тут 15. Очень, скажу вам, это тонизирующее занятие - после него перестаешь ругать все проблемы баз данных, компиляторов языков, недокументированности API и бежишь к родной среде разработке как к любимой женщине - разве ж это проблемы??? А испанец тоже потрудился дай боже, так что, ну просто грех было не дать ему регистрацию. Даже если перевод (не по сути качества перевода - оно было более чем достойное) - никуда не годился. Итак, регистрацию я ему дал.


В общем, и в голове мечты, и в попе зуд. Уж больно мне хотелось выпустить испанскую версию. Опять же и язык распространенный, и довести до конца все-таки как-то надо бы - «иба русские маряки ни-и-и-ккк-а-а-ада ни сдаюца!!!». Да и испанец все-таки не Леня Голубков оказался. После получения своей регистрации он все равно периодически стучался в почту и спрашивал, когда же будет выпущена его испанская версия. Не филон, не халявщик - молодец, в общем.


Спустя некоторое время я как-то разгреб rc-файл, откомпилился, и выслал ему испанскую версию...


Думаете, This is the End? Конец?


Щаззз!


Лента Мёбиуса, знаете что такое? :)



Ан нет! Начались проблемы с диалектами испанского - т.к. их в Windows тоже далеко не один вариант: кастильский, гвинейский, аргентинский и.т.д. Можете сами посмотреть - правой кнопкой по языковой панели Windows, в меню «Параметры», «Добавить язык» - смотрите, любуйтесь. И чтобы все его евойные тильды, умляуты и прочие диакритические штришки отображались нормально, нужно в rc-файле еще выставить правильный вариант испанского, да и всякие мелочи прописать тоже корректно, и тоже ручками.


Тут, я уже наученный опытом на свою попу, особо его не инструктировал - просто сгенерил с десяток тупых тупых MFC-ишных примеров, да выставил им испанский язык. Потом накомпилил соответствующее число exe-шников под каждый вариант испанского и радостно, с гиками и плясками зарядил их ему в почту. Причем по одному exe-шнику на одно письмо. Ну, во-первых письмо с одним маленьким атачментом, значительно вероятнее дойдет до адресата. Это как-то интереснее, чем гадать: чего там в Чили с файерволами, ограничениями объема вложений, а может у них ночь и он просто спит? К чему мучаться сомнениями!?!


Во вторых, приятно было, чтобы он прочувствовал всю творческую наполненность таких проверок - «держи исчо бинарник, и этот тоже запусти (да не попутай с другой версией), да посмотри все ли хорошо аль плохо». Вай, плохо? Нибеда! Лови следующий



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



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


Ну чего?


Да как всегда! Ничче принципиально нового! В планах завоевание испано-язычных рынков, поют сердца, скупая слеза наворачивается на глаза...



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



И... В общем, если кратко это называется «Здравствуй, Ёптить!». Новых команд меню у него в испанской версии нет. В английской версии то они есть, а в испанской нету.


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



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


Я говорю, о нормальном среднем пользователе - про всякие там «хаки» с WM_COMMAND напрямую и речи быть не может - да и все равно куда это годится!?!. Представить же себе пользователя, до посинения переключающегося между английским и испанским интерфейсом да еще и с перезапуском программы, лично я себе в здравом уме не могу. Поэтому все складывается просто шикарно: если перевод версии и есть, то только для конкретной версии и не старше. Ценность такой локализации весьма ограничена - или конечный пользователь имеет старенькую версию с нужным языком, или уж новую, но только не с родным интерфейсом.



А в чем же, собственно, дело? А дело, как говорится, в шляпе - в самой постановке вопроса локализации в том виде, как ее предлагает Microsoft. Нет, нет! Я не хочу ругать Microsoft - это малоинтересное занятие. Просто хочу отметить, что те решения, которые годятся для огромных корпораций - малопригодны для небольшой команды разработчиков, или же вообще для одиночки.



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



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


Разве что однажды пришлось учесть случай вроде кнопки панели инструментов «полужирный шрифт». В английском варианте такая кнопка должна иметь рисунок с жирной буквой «B», а в русской с буквой «Ж» - посмотрите на панель инструментов того же Word...


А больше особо, в общем случае, как правило и не нужно ничего переводить.


Ребяты-ы-ы-ы! Всё-ё-ё-ё-ё!



Я вряд ли буду городить еще один перевод интерфейса на французский или немецкий язык только из-за этого рисунка кнопки. Нет, нет! Я не спорю - оно конечно неплохо, когда и для французов с немцами есть свой вариант кнопки «Жирный/Bold». Но выпуск локализованной версии дело ответственное и важное. Я попросту не могу потратить еще несколько месяцев на подготовку локализованной версии только из-за одной буквы. В любом случае есть такая же команда меню с нормально переведенным названием, и таким же нормальным переводом всплывающей подсказки к панели инструментов. Но такая кнопка всего лишь «штрих», «мелочь». Не спорю, мелочи важны! Но все равно, если этот штрих удался - прекрасно! Но если нет, это не позволяет задерживать выпуск локализованной версии на несколько месяцев. Это просто не то что невыгодно, а из-за отсутствия еще несколько месяцев еще одной локализованной версии - это просто в убыток. К тому же, когда этот идеальный перевод будет готов, основные версии тоже не будут «курить в сторонке», и обрастут новыми возможностями. И что делать? Опять перевод должен догонять? Или просто выпустить локализованную, но старую версию? Что лучше? Я не знаю - все зависит от специфики проекта.



Второй момент, что в основном нужен перевод именно «строчной» части интерфейса, и ни в коем случае не изменяя (нет, ну скажем, почти не изменяя) саму структуру, строение пользовательского интерфейса. Поэтому крайне не хочется отдавать переводчикам rc-файл полностью. Они в нем напортачат куда больше, чем переведут! Уж не говоря о том, что строки вперемешку с «дремучим кодом» и переводить им куда сложнее. Перефразируя известную поговорку: «Хороший «rc-программист» редкость! Хороший переводчик еще большая редкость!» А тут все вместе и в одном флаконе, да?



Третий момент: для динамично разрабатываемого приложения - когда новые версии появляются куда чаще, чем локализованные - есть непреодолимое желание погонять «переведенный интерфейс» в отладчике. Посмотреть что да как. А не наблюдать очередной crach после подключения к releas-ной версии очередной языковой DLL-ки (с последующей затем традиционной медитацией в дизассемблере).



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


  1. Возможность отделить непосредственно локализуемую часть: строки, названия меню, кнопок и.т.п. от структуры, строения самого пользовательского интерфейса. Причем выделить ее так, чтобы в процессе перевода на иностранный язык переводчику она не «маячила» перед глазами.

  2. Возможность «вживить» перевод непосредственно в исполняемый файл в момент компиляции. Одно дело связывание DLL, все ошибки вылезут в run-time. Совсем другое дело design-time. Лично я предпочитаю возможность увидеть настойчивые матюги компилятора что «такой-то строки вообсче нету блин», чем решать все эти проблемы в run-time.


    А кстати, как вообще решать подобные проблемы в рантайм?


    Если эта строка с советом дня... Ну да ладно - печально, но не критично. А если отсутствует какое-то критическое сообщение? И результат такого сообщения - выбор пользователя - влияет на сохранность его же пользовательских данных? Вроде «Действительно удалить весь текст без возможности восстановления? Да\Нет». И что будет, если пользователь узрит шедевр «Строка не найдена. Да\Нет»?. Не-е-е, робяты - нафиг, нафиг такой софт. Код мы сто раз перепишем, поправим и юзера подтехсаппортим. Но вот исправить его данные, безвозвратно запоротые - тут, как правило, «увы», только разводить руками. Только вот пользователю от этих «увы» ничуть не легче.

  3. Возможность использовать перевод версии Икс, для версии Икс+1 таким образом, чтобы всё, что уже переведено, используется в переведенном варианте. Для чего перевода нет - пусть показывается хоть как-то, а хоть бы и на основном языке.



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

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





Вот такие вот проблемы возникли после первой попытки сколько-нибудь серьезной локализации. И вот такие вот требования, пожелания, возможности локализации мне в результате и понадобились. Стало очевидно, что перевод rc-файла - никак «не катит». Нужно искать другое решение. И кстати оно было найдено. Какое? Об этом в следующей нетленке. Я и так расписался. Но с другой стороны, не вспомнить боевую «молодость» со всеми ее «геморроями», «шишками» и новыми в процессе появившимся великорусскими и ох каким живыми словами? Ну это уж «ваще»! Сентиментальность, однако. С другой стороны: об этом всём как-то неоднократно возникали дискуссии на некоторых форумах, вот и решил «не вырубить топором» - описать все с деталями и душераздирающими подробностями ручной правки всякой «мути», с которой «эти чертовы калькуляторы, стоящие на ваших, и на наших рабочих столах» вп-а-алне могли бы справляться самостоятельно. Продолжение, о том как все же была решена проблема, напишу в следующий раз.

пятница, 9 мая 2008 г.

Софт на Ближнем Востоке


Несколько, конечно дежурная заметка, но она стоит того. Добавил ссылку на блог Романа "Софт на Ближнем Востоке". Совершенно шикарный просто блог - автор рассказывает о софтостроении на Ближнем Востоке. Совершенно другая страна, другие люди, другие традиции, да просто другой мир. На Востоке всё иначе. Читать крайне интересно. В общем, "Восток дело тонкое" ©.




PS: Ну и с праздником всех! П О Б Е Д А!!!

суббота, 19 января 2008 г.

Форум vs Feedback

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

Немного поясню, в данном случае имеется ввиду форум, посвященный какому-то продукту, проекту, сервису. Я не имею ввиду тематические форумы по тем или иным технологиям, языкам программирования и т.д, к примеру форумы www.RSDN.ru. Здесь пойдет речь именно об особенностях общения с пользователями (клиентами) через форум своего проекта (сервиса или чего-то в этом роде).

Все-таки мне кажется что ответ на этот вопрос кроется в социальной сути и принципиальной разнице между способами функционирования форума и формы обратной связи (feedback). Попробую пояснить что я имею ввиду.

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

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

Другое дело, когда подобный форум позволяет собрать группу единомышленников. Людей, объятых единой идеей, взглядами на проблему и способы решения. Имхо, этот случай как раз очень похож на тематические форумы посвященные той или иной проблеме (те же пресловутые форумы www.RSDN.ru).

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

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

б) Обратная связь это диалог, а не публичное обсуждение. Многие пользователи явно не хотели вступать ни в какие публичные обсуждения, но вполне с удовольствием потом общались только с разработчиками. Лично.

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

Ну и напоследок небольшой рассуждение об uninstall feedback (UF) - возможности для пользователя отправить сообщение при удалении программы, объяснить свои причины удаления. Такая ведь информация просто на вес золото. Вот здесь Антон Максимов (http://mper.blogspot.com/2008/01/uninstall-feedback.html) рассуждает обо особенностях организации uninstall feedback.

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

Правда, как показывает опыт, просто необходимо как-то четко индицировать что обратный, к примеру, e-mail не указан. Многие просто банально забывали указать. Я решил эту проблему просто: отображением или скрытием анимированного gif с фразой "e-mail не указан". Никаких диалогов подтверждения "Хотите отправить без обратного e-mail?" - пользователь просто пару раз остервенело кликнет "да! да! хочу без", а потом просто оставит это надоедливую форму. В то же время такой мигающий gif намоминал тем, кто все-таки хотел бы указать e-mail для связи, и ничем не мешал всем остальным.

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

а) в начале Вы просто не можете предполагать все множество возможных причин удаления.

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

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

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

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

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

В третьих попытка, отправить информацию в интернет может быть пресечена брандмауэром или же пользователь увидит запрос на подключение. Уверяю, неискушенный пользователь НИЧЕГО подтверждать не будет и откажется от соединения, а между прочим именно от таких неискушенных пользователей иногда поступает весьма интереснейшая информация. Ну хотя бы потому, что разработчик "за деревьями уже леса не видит", а такой пользователь может рассказать о своем свежем и лишенном (или наоборот нелишенном) условностей взгляде.

Ну и напоследок о возможности отправить репорт разработчикам при критической ошибке. Ну да, ну да! Модно конечно - но вы часто отправляли такие репорты в Microsoft? Лично я ни разу. И дело не только и не столько в каких-то там страхах и опасениях, хотя и не без них. Представьте себе, работаете вы в каком-то приложении, вдруг - "бах, вторая смена (С)" - критическая ошибка. Полагаю в первую очередь вы подумаете "что это было", потом о сохранности ВАШИХ, именно Ваших данных, потом произнесете что-то в сердцах и уж в последнюю очередь вы подумаете о проблемах разработчиков и отправке им репорта. Уж лучше пользователь отправит вам сообщение позже, если захочет, и с несколько остывшими эмоциями. Между прочим, в германской армии времен императора Бисмарка было такое правило: если солдат жалуется на офицера ранее чем через два часа после происшествия, солдат в любом случае будет наказан, даже если он абсолютно прав и виноват офицер. Вот так вот: успокойся, а уж потом жалуйся. Думаю, что у немцев, с их Ordnung`ом есть чему поучиться.

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

суббота, 17 ноября 2007 г.

Зачем же люди заводят блог!?!

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

И почему же это все-таки писать надо ночью? Мы что будем кропать антипутинские листовки ко 2 декабря? К чему это кропание "при свечах"?

А все оттого, что днем, когда "свечи потушены" Ванька, Элизабет и тетушка Анкара (это мои и весьма дотошные пользователи) пишут почти точно так же, но в этом "почти" и скрывается вся разница. Они ведь не только пишут, они еще и отправляют, и в аську стучат, и требуют, и ищут себе самого эксклюзивного себе внимания... И ведь находят как ни странно. Постоянно находят - чем больше занят, тем больше и находят.

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

Но бог не Тимошка, видит немножко! Вся неделя прошла в бесконечных релизах бета-версий по ночам. В какой-то момент уже просто стало интересно с какого такого перепуга очередная (не "дымовая") сборка собирается впопыхах посреди ночи, хотя запаркой пока еще и не пахнет даже. При беглом взгляде на свой The Bat, под краешек забитый почтой, стало понятно, что работал он как редактор текста уже пару дней просто без устали. Поверхностный обзор входившей и изошедшей почты сразу показал, что "чукча однако не только читатель, но и писатель". Начал взвешивать почему же так много времени уходило на работу с почтой (нет, нет, не на разбор спама - этот "калькулятор" на моем столе вполне с этим справляется сам), а именно на работу самое меня с этой почтой. И чем дальше взвешивал, тем становилось все понятнее, что нужно не только взвешивать, но "обвешивать". Иначе придется сделать неутешительный и взвешенный вывод: что писал, писал и писал почту. Только почту. И ничего кроме почты! Хм, а деньги когда же зарабатывать!?! При самом скромном раскладе получилось что в "рубиновый вторник - мой лучший день" © было потрачено на написание ответов пользователям три часа. Во все остальные дни и того больше...

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

В другом случае это был разумный программер, который четко приводил аргументы и которые просто нельзя было оставлять незамеченными и неотвеченными. Несмотря на всяческие ужимки программера и попытки сослаться на "незнание внутренней организации списков" - а кто их знает!?! кто знал - все забыли (есть у нас такое дело, мы обычно все быстро забываем - особенно когда качественная память может привести к незапланированной работе :). Четко сформулированные цели, поставленная задача, обоснованный выбор средств решений, и в меру сомнений что путь "истинно верный". Ну, не клиент, а оппонент просто, от разговора с которым за 20 минут выносишь больше понимания, чем от бесконечных диаграмм UML (кстати неплохой язык - четкий, очень правильный со всех сторон, никаких косяков - на его руководстве монитор стоит так что столярным уровнем проверять не нужно).

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

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

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

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

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

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

PS: Для интереса прогнал через частотный словарь письма за неделю. Слово "спасибо" за неделю я прочитал в почте 87 раз среди достаточно ограниченного числа людей. Причем это не то казенное "спасибо", а самое искреннее - с пояснениями за что, почему и пожеланиями на будущее и чуть ли не угрозами "надуться окончательно" если понадобится помощь, а я не обращусь. А иногда в минуту, когда все не ладится, такое “спасибо” очень дорого стоит, позволяет не выкинуть все нафиг и заняться игрой на бирже. От такого “спасибо” понимаешь, что вообще-то твой продукт нужен, и люди его ждут. А это иногда подбадривает куда лучше статистики сервера, обнадеживающих пресс-релизов и прочей многообещающей мишуры.

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