<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Андрей Шкуропий</title>
	
	<link>http://shkuropiy.ru</link>
	<description>Программист shareware</description>
	<lastBuildDate>Sat, 20 Aug 2011 20:45:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/shkuropiy" /><feedburner:info uri="shkuropiy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Cautus.ru — новый блог о сетевой безопасности</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/K62ncBB-UVg/cautusru-novyj-blog-o-setevoj-bezopasnosti</link>
		<comments>http://shkuropiy.ru/news/cautusru-novyj-blog-o-setevoj-bezopasnosti#comments</comments>
		<pubDate>Fri, 20 Aug 2010 07:43:07 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
				<category><![CDATA[Интересные ссылки]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[блог]]></category>
		<category><![CDATA[компьютер]]></category>
		<category><![CDATA[сеть]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/news/cautusru-novyj-blog-o-setevoj-bezopasnosti</guid>
		<description><![CDATA[Открыл новый проект http://cautus.ru. Это блог о компьютерной и сетевой безопасности для начинающих]]></description>
			<content:encoded><![CDATA[<p>Открыл новый проект <a href="http://cautus.ru">http://cautus.ru</a>. Это блог о компьютерной и сетевой безопасности для начинающих. Странно, но я не нашел в СНГ ни одного проекта похожей тематики (может плохо искал?), хотя необходимость просвещения пользователей о новых угрозах назрела уже давно.</p>
<p>На этом блоге в меру своих сил я буду делать следующее:</p>
<ul>
<li>Простым языком рассказывать неопытным пользователям об опасностях, подстерегающих их на просторах интернета и в локальных сетях. </li>
<li>Давать советы по безопасному сетевому поведению. </li>
<li>Снабжать обзорами сопутствующего программного обеспечения для защиты компьютера. </li>
<li>Информировать о новых глобальных сетевых угрозах и мировых новостях безопасности.</li>
</ul>
<p>В проект приглашаются авторы, которым, как и мне, надоело вытаскивать компьютеры знакомых из-под вирусных наездов. Если вам есть что рассказать людям, <a href="http://cautus.ru/stante-avtorom">свяжитесь со мной</a>.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/K62ncBB-UVg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/news/cautusru-novyj-blog-o-setevoj-bezopasnosti/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://shkuropiy.ru/news/cautusru-novyj-blog-o-setevoj-bezopasnosti</feedburner:origLink></item>
		<item>
		<title>О языковом переводе интерфейса в shareware</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/xabYl6w14RM/o-yazykovom-perevode-interfejsa-v-shareware</link>
		<comments>http://shkuropiy.ru/software-development/o-yazykovom-perevode-interfejsa-v-shareware#comments</comments>
		<pubDate>Tue, 07 Jul 2009 11:48:26 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
				<category><![CDATA[easyQuizzy]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[GNU GetText]]></category>
		<category><![CDATA[MUI]]></category>
		<category><![CDATA[Unicode]]></category>
		<category><![CDATA[интернационализация]]></category>
		<category><![CDATA[интерфейс]]></category>
		<category><![CDATA[локализация]]></category>
		<category><![CDATA[множественные формы]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/software-development/o-yazykovom-perevode-interfejsa-v-shareware</guid>
		<description><![CDATA[Наше решение не претендует на оптимальность для всех, но, если вы никогда раньше не занимались интернационализацей, то это поможет вам построить свою систему, более эффективную для вас.]]></description>
			<content:encoded><![CDATA[<p>Большинство границ между странами в Интернете на сегодняшний день фактически стерты. Но одна граница, которая осталась в наличии, еще долго будет головной болью разработчиков программного обеспечения — языковая. Создание интернациональных программ всегда было большой проблемой, и каждая компания решала ее по-своему. Сегодня хочу написать, как эту проблему решили мы. Наше решение не претендует на оптимальность для всех, но, если вы никогда раньше не занимались интернационализацией, то это поможет вам построить свою систему, более эффективную для вас.</p>
<p><span id="more-399"></span>
<p>Для начала немного теории.</p>
<p>Есть два термина, которые разработчики часто путают: <em>интернационализация</em> и <em>локализация</em> программы. Интернационализация — это адаптация продукта для потенциального использования в любой стране, а локализация — это добавление специальных функций для использования программы в некотором <em>определённом регионе</em>. Интернационализация производится на начальных этапах разработки. Локализация делается для каждого целевого языка отдельно (подробнее <a href="http://ru.wikipedia.org/wiki/Интернационализация" target="_blank" rel="nofollow">смотрите здесь</a>). Разработчики <a href="http://ru.wikipedia.org/wiki/Shareware" target="_blank">shareware</a> занимаются обычно как раз интернационализацией, потому что у них просто недостаточно ресурсов для создания отдельных версий приложений для разных языков или стран, как делает, например, Microsoft. </p>
<p>При интернационализации важно еще на стадии проектирования не привязываться к конкретным языкам и странам во избежание конфликтов на национальной почве. Если вы хотите, чтобы продажи программы пошли в <a href="http://ru.wikipedia.org/wiki/ОАЭ" target="_blank" rel="nofollow">ОАЭ</a>, надо, как минимум, вставлять в нее текстовые редакторы с поддержкой двунаправленного письма, использовать <a href="http://ru.wikipedia.org/wiki/Unicode" target="_blank" rel="nofollow">Unicode</a>-строки во всех местах и, соответственно, Unicode-шрифты. Также следует озаботиться запросом у операционной системы изменяющихся от страны к стране региональных стандартов представления чисел, даты, денежной единицы и всем остальным, что на русском языке по-идиотски называют &#8220;культура приложения&#8221;, очевидно криво переведя английский термин &#8220;software culture&#8221;.</p>
<p>Такими нехитрыми способами можно порешать практически все проблемы интернационализации, кроме одной: вы не сможете сами перевести строки пользовательского интерфейса на все языки. </p>
<p>Многие это последнее проблемой вообще не считают и просто переводят свой интерфейс на английский язык, так как интернациональное shareware продается лучше всего почему-то в англоязычных странах. Если вам этого мало, то придется ответить на главный вопрос: <em>как вы будете взаимодействовать с переводчиками?</em><strong> </strong></p>
<p>Способов решения два:</p>
<ol>
<li><strong>Платный.</strong> Вынести все используемые в программе строки в файл ресурса, раздать его переводчикам, заплатив примерно от $5 до $10 за каждые 1000 символов, и включить переведенные ресурсы в программу.  </li>
<li><strong>Бесплатный.</strong> Сделать файлы с переводными строками доступными для изменения &#8220;на ходу&#8221; всем желающим, и поощрять самостоятельное выполнение переводов заинтересованными пользователями с постепенным включением их в дистрибутивы новых версий. </li>
</ol>
<p>Платный способ хорош своей простотой для программистов, но вам придется повторять его снова и снова при выходе новых версий приложения. Причем, пока вы не закончите с переводами, нельзя будет сделать релиз.</p>
<p>Бесплатный способ имеет то преимущество, что позволяет при необходимости заказывать платные переводы, не жертвуя возможностью получить дополнительные бесплатные переводы, однако он и более сложный в плане реализации, так как приходится создавать прозрачную и надежную схему взаимодействия с переводчиками.</p>
<p>Мы нашли способ объединить эти два решения.</p>
<p>Был создан специальный <a href="http://easyquizzy.com/translate/" target="_blank">сайт для переводчиков</a>, на котором они могут с помощью <a href="http://ru.wikipedia.org/wiki/Wiki" target="_blank" rel="nofollow">Wiki</a>-движка редактировать переводные файлы в формате <a href="http://ru.wikipedia.org/wiki/Xml" target="_blank" rel="nofollow">XML</a>. Переводные файлы при достижении определенной степени завершенности у нас включаются в дистрибутив программы в виде ресурсов, и пользователь после установки программы их редактировать не может, но, если загрузить переводной файл с сайта и положить его в папку программы, то он загрузится вместо файла, который был прикреплен к программе при компиляции. Это сделано для возможности быстрой проверки качества пользовательского перевода без необходимости выпускать новую сборку программы.</p>
<p>Решение редактировать XML-файлы вручную может показаться странным из-за необходимости <a href="http://ru.wikipedia.org/wiki/Валидация" target="_blank" rel="nofollow">валидации</a>, но преимущества для нас перекрыли недостатки. XML очень просто структурируется и позволяет легко задать правила форматирования даже для тех, кто этот формат первый раз в жизни видит. Идентификаторами переводных строк у нас являются оригинальные строки на английском языке, что позволяет программисту не выдумывать никаких таблиц идентификации и не синхронизировать потом номера строк-оригиналов между десятком переводных файлов.</p>
<p>Для применения перевода следует делать так, как привыкли делать переводчики <a href="http://ru.wikipedia.org/wiki/Php" target="_blank" rel="nofollow">PHP</a>-страниц, интернационализированных с помощью библиотеки <a href="http://ru.wikipedia.org/wiki/Gettext" target="_blank">GNU GetText</a>&nbsp; — пробрасывать оригинальные английские строки сквозь функцию трансляции, которая в зависимости от текущего выбранного языка выдает нужную переводную строку. Пример на Delphi: </p>
<pre style="font-size: 12px; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff">CloseButton.Caption := SS('Close')</pre>
<p>При такой реализации пришлось решить несколько технических вопросов, самыми главными из которых были следующие.</p>
<ol>
<li>Как идентифицировать используемые языки?
</li>
<li>Как переводить множественные формы в предложениях с числительными?</li>
</ol>
<p>Рассмотрим эти вопросы подробнее.</p>
<p>Языков на свете очень много. Теоретически, добровольцы могут захотеть перевести ваш интерфейс на любой язык, поэтому лучше сразу быть готовым к этому в программе. Кроме обычного названия языка, написанного на нем самом, следует держать его английское название для использования в меню выбора языка, а также буквенный или числовой код. Этот код нужен будет потом для кодирования переводных строк и, опционально, для автоматического определения языка при первом запуске программы, чтобы пользователю не нужно было переключаться с английского языка на свой вручную. </p>
<p>С этими буквенными кодами языков не все просто. </p>
<p>Имеется несколько версий стандарта буквенного кодирования языков под названием <a href="http://ru.wikipedia.org/wiki/ISO_639" target="_blank" rel="nofollow">ISO 639</a>, и каждая последующая версия расширяет их доступный набор. Стандарт ISO 639-1 регламентирует двухбуквенные коды для основных мировых языков (en, ru, fr и т.д.), ISO 639-2 расширяет код до трех символов, значительно увеличивая набор доступных языков (eng, rus, fra и т.д.) и вводя тонкости их модификаций (например, fre/fra — современный французский, а frm — средневековый французский), ISO 639-3 тоже трехбуквенный, но покрывает также десятки диалектов и наречий, включая все разновидности наречий американских индейцев. Гигантскую сводную таблицу этих стандартов можно посмотреть <a href="http://www.sil.org/iso639-3/codes.asp" target="_blank">здесь</a>.</p>
<p>Кстати, многие делают ошибку, путая код <em>языка</em> с кодом <em>страны</em>. Хотя они иногда и совпадают (например, для России и русского языка, ru-RU), но в общем случае они должны отличаться. Коды стран должны соответствовать стандарту <a href="http://ru.wikipedia.org/wiki/ISO_3166" target="_blank" rel="nofollow">ISO 3166</a>, и их записывают обычно большими буквами, если они стоят в паре с кодом языка (en_US, en_GB, uk_UA). Код страны важен для определения региональных настроек, но, поскольку предполагается, что интернационализация программы была сделана вдумчиво, и все региональные настройки типа даты и валюты выбираются из операционной системы, мы отбросили код страны за ненадобностью. Единственное место, где он может пригодиться в таком случае — это поддержка &#8220;местных&#8221; особенностей языков и локальных диалектов. Характерный пример: британский и американский английский могут отличаться используемыми наборами слов. Однако, если ваше приложение не содержит больших объемов связного текста, этот аспект можно игнорировать, все равно текстовые метки над полями ввода из трех слов правильно поймут и американцы, и англичане.</p>
<p>Мы приняли за основу языкового кодирования стандарт ISO 639-2, как наиболее распространенный трехбуквенный код, который описывает большинство языков. А если его недостаточно для идентификации языка (или диалекта), то дополнительно к этому коду используется код ISO 639-3. Посмотреть, как строится наш переводной XML-файл с секцией описания доступных языков, можно по <a href="http://easyquizzy.com/translate/ru:structure" target="_blank">этой ссылке</a>.</p>
<p>Автоматический выбор языка в таком случае слегка затруднен тем, что привычный программистам двухбуквенный код текущего языка операционной системы (en, ru и т.д.), возвращаемый системной функцией GetLocaleInfo() с параметром LOCALE_SISO639LANGNAME, соответствует двухбуквенному стандарту ISO 639-1, поэтому пришлось построить таблицу соответствия между ISO 639-1 и ISO 639-2. Так что для большинства языков автоматический выбор все равно сработает. А если не сработает, то пользователю придется его выбрать вручную в меню один раз, ничего не поделаешь. </p>
<p>Переходим к множественным формам.</p>
<p>Перевод предложений, в которых присутствуют численные переменные, очень часто бывает затруднен выбором нужной множественной формы в конкретном языке, чтобы предложение читалось правильно при любых значениях этих переменных.
</p>
<p>Пример: дана переводная строка «Было задано x вопросов», где x — числовая переменная. При обычной подстановке x = 1 получается строка, как будто написанная роботом, который не знает, как правильно согласовывать предложения с числами: «Было задано 1 вопросов». Некоторые разработчики используют убогую схему подстановки вроде такой «Было задано x вопрос(ов)», или вообще «Было задано x вопрос(-а, -ов)», т.е. право выбора правильной формы великодушно предоставляется пользователю.
</p>
<p>А если все делать, как следует, то переводная строка должна была бы меняться так: </p>
<ul>
<li>
<p>(x = 1) «Был задан x вопрос»</p>
</li>
<li>
<p>(x = 2) «Было задано x вопроса»</p>
</li>
<li>
<p>(x = 5) «Было задано x вопросов»</p>
</li>
<li>
<p>(x = 21) «Был задан x вопрос»</p>
</li>
<li>
<p>(x = 35) «Было задано x вопросов»</p>
</li>
</ul>
<p>Если посмотреть на изменения строки при последовательном увеличении переменной x, то можно увидеть, что в русском языке достаточно только трех множественных форм предложения, чтобы охватить все варианты.
</p>
<p>Особой формы обычно требует также нулевое значение переменной: </p>
<ul>
<li>
<p>(x = 0) «Не было задано ни одного вопроса»</p>
</li>
</ul>
<p>В английском языке и многих других языках достаточно только двух форм: единичной и множественной. В словенском языке четыре множественных формы, в русском, украинском и белорусском — три.
</p>
<p>Правила выбора нужной формы в зависимости от значения переменной в общем случае отличаются для разных языков. Описания правил выбора нужной множественной формы для большинства языков можно посмотреть <a href="http://translate.sourceforge.net/wiki/l10n/pluralforms" target="_blank">на этом сайте</a>.
</p>
<p>Когда я решил включить поддержку множественных форм в программу, начал искать в Интернете готовые эффективные реализации этого механизма. Требовалось обеспечить как простоту программирования, так и легкость понимания правил для переводчиков. Оказалось, что все самые &#8220;продвинутые&#8221; библиотеки интернационализации используют метод работы с множественными формами, который был введен в уже упоминавшейся GNU GetText. Все формы предложения с переменными нумеруются, начиная с нуля, и переводчику предлагается в переводном файле задать для своего языка алгоритм выбора формы, а для каждой строки с числовыми переменными — все пронумерованные формы предложений. Пример:
<pre style="font-size: 12px; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff">msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d день назад"
msgstr[1] "%d дня назад"
msgstr[2] "%d дней назад"</pre>
</p>
<p>Здесь msgid — это оригинальная английская строка для одиночной формы, msgid_plural — оригинальная английская строка во множественном числе, %d — целочисленная переменная, по которой будет производиться выбор нужной формы в целевом языке, а массив msgstr[n] представляет все одиночные и множественные формы переведенной строки.</p>
<p>У этого метода есть серьезный недостаток, из-за которого я его отбросил: выбор нужной формы возможен только по <em>одной числовой переменной</em>, которая встречается в предложении. Если в предложение будут включены две (и более) переменные, то придется разбивать переводные строки на куски&nbsp; и потом склеивать в программе, усложняя и без того мутный для переводчиков синтаксис.</p>
<p>Отличное решение было подсмотрено мной на <a href="http://habr.ru" target="_blank" rel="nofollow">Хабрахабре</a> у разработчика <a href="http://afan.habrahabr.ru/" target="_blank">Afan</a> (к сожалению, не смог найти его настоящее имя) вот в <a href="http://habrahabr.ru/blogs/development/55286/" target="_blank">этой статье</a>. </p>
<p>Суть его в том, чтобы включать все множественные формы в одну строку, используя специальную синтаксическую конструкцию такого вида:</p>
<pre style="font-size: 12px; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff">{%номер_переменной|форма_0|форма_1|форма_2|…|форма_N}</pre>
<p>где </p>
<ul>
<li>
<p>номер_переменной — порядковый номер целочисленной переменной, по значению которой будет выбрана нужная форма предложения;</p>
</li>
<li>
<p>форма_0 — нулевая форма, которая будет выбрана при нулевом значении переменной;</p>
</li>
<li>
<p>форма_1…форма_N — все множественные формы предложения в данном языке.</p>
</li>
</ul>
<p>Пример использования в наших переводных файлах:
<pre style="font-size: 12px; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff">   &lt;id text="{%1|No right answers|1 right answer|%1 right answers},
             {%2|no wrong answers|1 wrong answer|%2 wrong answers}"&gt;
     &lt;rus&gt;{%1|Нет правильных ответов|%1 правильный ответ|%1 правильных ответа|%1 правильных ответов},
          {%2|нет неправильных ответов|%2 неправильный ответ|%2 неправильных ответа|%2 неправильных ответов}&lt;/rus&gt;
   &lt;/id&gt;</pre>
</p>
<p>В данном примере оригинальная английская строка имеет две переменных: %1 — количество правильных ответов, %2 — количество неправильных ответов. С помощью данного синтаксиса множественных форм они при любых значениях переменных сформируют согласованную строку.
</p>
<p>Например, при подстановке %1 = 0, а %2 = 5 получим «No right answers, 5 wrong answers».
</p>
<p>Обратите внимание, что внутри каждой формы можно использовать переменные, константы или вообще обойтись только текстом.
</p>
<p>И для программиста, и для переводчика цельная строка такой конструкции будет гораздо нагляднее, чем разбитая на две части по методу GNU GetText. Разбирать такие строки в программе можно с помощью простейшего однопроходного интерпретатора, разработка которого доступна студенту-второкурснику с факультета программирования. Я применил рекурсивный спуск по простой левосторонней грамматике. В указанной выше ссылке на статью есть способ разбора с помощью регулярных выражений на C#.
</p>
<p>Вот в принципе и вся наша схема интернационализации приложений, которую я буду применять для всех будущих shareware-проектов. Остальные мелкие технические вопросы вроде использования запрещенных символов и подстановки переменных я здесь рассматривать не буду, так как они уже описаны на нашем <a href="http://easyquizzy.com/translate/" target="_blank">wiki-сайте для переводчиков</a>.
</p>
<p>Если у вас есть идеи по улучшению данной схемы — пожалуйста, пишите в комментариях или на почту. Я подумываю о том, чтобы сделать свой модуль языковой поддержки бесплатным программным компонентом, и, если будет достаточно желающих его получить, то так и сделаю.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/xabYl6w14RM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/software-development/o-yazykovom-perevode-interfejsa-v-shareware/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://shkuropiy.ru/software-development/o-yazykovom-perevode-interfejsa-v-shareware</feedburner:origLink></item>
		<item>
		<title>Введите символы на картинке</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/3xFuat0-Gz0/vvedite-simvoly-na-kartinke</link>
		<comments>http://shkuropiy.ru/usability/vvedite-simvoly-na-kartinke#comments</comments>
		<pubDate>Thu, 19 Mar 2009 11:33:45 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
				<category><![CDATA[Юзабилити]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[rapidshare]]></category>
		<category><![CDATA[бот]]></category>
		<category><![CDATA[веб-сервис]]></category>
		<category><![CDATA[кот]]></category>
		<category><![CDATA[спам]]></category>
		<category><![CDATA[тест]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/usability/vvedite-simvoly-na-kartinke</guid>
		<description><![CDATA[Теперь у меня есть правило: если я не могу при регистрации пройти CAPTCHA за 3 попытки, то я иду искать другой аналогичный веб-сервис, благо сейчас их очень большой выбор. Да здравствует конкуренция!]]></description>
			<content:encoded><![CDATA[<p>С каждым днем разработчики веб-сервисов придумывают все более изощренные методы борьбы со спам-роботами и конкурентами, перекачивающими содержимое с одного веб-портала на другой. Любимое средство защиты &#8212; <a href="http://ru.wikipedia.org/wiki/CAPTCHA" target="_blank" rel="nofollow">CAPTCHA</a>-тест с картинкой, конечно же. </p>
<p><img alt="captcha" src="http://static.flickr.com/3452/3366889865_3653eb21eb.jpg" border="0" /></p>
<p>Авторы спам-роботов не дремлют и создают целые <a href="http://DeCaptcher.com" target="_blank" rel="nofollow">веб-службы</a> для автоматического распознавания тестов (в том числе и с помощью обычных индусов, а не только каких-то продвинутых <a href="http://www.scorcher.ru/neuro/science/neurocomp/mem52.htm" target="_blank" rel="nofollow">нейронных сетей</a>), идет нешуточная борьба интеллектов разработчиков CAPTCHA против разработчиков ботов.</p>
<p>И вот, в последние годы я стал замечать, что мне становится все труднее распознать новые модификации этих тестов. В то же время для современных ботов, <a href="http://ocr-research.org.ua/" target="_blank" rel="nofollow">как показала практика</a>, они уже не являются большой проблемой. </p>
<p>Подозреваю, что в какой-то момент у каждого человека может наступить порог отказа от использования веб-сервиса, когда у него слишком долго не получается пройти CAPTCHA-тест. Например, у меня этот порог наступил, когда мне дали ссылку на загрузку файла с известного для любителей халявы сервиса <a href="http://rapidshare.com/" target="_blank" rel="nofollow">RapidShare</a>. Я был в таком шоке от их теста, что до сих пор с содроганием вспоминаю ту напряженную работу по раглядыванию котов. </p>
<p><img alt="cats" src="http://static.flickr.com/3624/3367714066_1822da413a.jpg" border="0" /></p>
<p>Где-то после 7-й попытки расшифровать его я плюнул на скачиваемый файл и пошел делать гимнастику для глаз. Особенно обидно было позже узнать, что этот тест был взломан ботами каким-то обходным путем. Т.е. фактически веб-сервис введением этого теста снизил шансы для человека и одновременно повысил их для другой компьютерной программы. </p>
<p>Теперь у меня есть правило: если я не могу при регистрации пройти CAPTCHA за 3 попытки, то я иду искать другой аналогичный веб-сервис, благо сейчас их очень большой выбор. Да здравствует конкуренция!</p>
<p>Если вы разрабатываете веб-сервис, подумайте о том, чтобы определить эту границу, за которой вы начнете из-за CAPTCHA-теста терять пользователей-людей и привлекать роботов.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/3xFuat0-Gz0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/usability/vvedite-simvoly-na-kartinke/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://shkuropiy.ru/usability/vvedite-simvoly-na-kartinke</feedburner:origLink></item>
		<item>
		<title>24/7</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/Ag-g6odAh_A/247</link>
		<comments>http://shkuropiy.ru/thoughts/247#comments</comments>
		<pubDate>Fri, 16 Jan 2009 08:48:15 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
				<category><![CDATA[Мысли вслух]]></category>
		<category><![CDATA[24/7]]></category>
		<category><![CDATA[shareware]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/thoughts/247</guid>
		<description><![CDATA[Меня уже начало передергивать, когда я ненароком слышу &#34;Мы работаем 24 часа в сутки, 7 дней в неделю&#34;. Не знаю почему, но этот рекламный штамп меня бесит гораздо больше, чем все остальные. Странно, что не додумались продолжить этот идиотизм &#34;Мы работаем 24 часа в сутки, 7 дней в неделю, 4 недели в месяц, 12 месяцев [...]]]></description>
			<content:encoded><![CDATA[<p>Меня уже начало передергивать, когда я ненароком слышу &quot;Мы работаем 24 часа в сутки, 7 дней в неделю&quot;. Не знаю почему, но этот рекламный штамп меня бесит гораздо больше, чем все остальные. Странно, что не додумались продолжить этот идиотизм &quot;Мы работаем 24 часа в сутки, 7 дней в неделю, 4 недели в месяц, 12 месяцев в году, 5 лет в пятилетку&quot;.</p>
<p>Возможно, это поначалу звучало гораздо круче, чем&#160; &quot;Мы работаем круглосуточно&quot;, но сейчас, когда это выражение стали использовать все, кому не лень, оно стало банальностью, которая часто не соответствует действительности.</p>
<p>Особенно глупо этот лозунг выглядит, если применяется к коммерческим веб-сайтам. То, что сайт работает круглосуточно, еще не значит, что компания, которая стоит за этим сайтом, никогда не спит. И было бы странно, если бы сайт компании работал с 8:00 до 17:00, а не 24 часа в сутки. Но не ждите, что заявки, оставленные вами на сайте в 3 часа ночи, будут рассмотрены и обработаны сразу же.</p>
<p>Немного отличается ситуация для дешевого <a href="http://ru.wikipedia.org/wiki/Shareware">shareware</a>, которое продается через онлайн-магазины. Если после перевода денег через электронную платежную систему автоматический кодогенератор сразу же высылает клиенту регистрационную информацию с ключом, то это может считаться круглосуточным сервисом, если вся система работает без проблем. Но если вдруг где-то в цепочке автоматического обслуживания появляется сбой (например, сервер неожиданно упал и кодогенератор стал не доступен), то клиенту все равно придется ждать, пока вы проснетесь, проверите e-mail и придумаете решение проблемы. </p>
<p>Если хотите использовать лозунг 24/7 для своей компании, убедитесь сначала, что не врете своим клиентам и сможете его обеспечить в полном смысле этого слова.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/Ag-g6odAh_A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/thoughts/247/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://shkuropiy.ru/thoughts/247</feedburner:origLink></item>
		<item>
		<title>Про мышеловки</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/dKKnH62FYcA/pro-myshelovki</link>
		<comments>http://shkuropiy.ru/news/pro-myshelovki#comments</comments>
		<pubDate>Fri, 07 Nov 2008 11:03:21 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[мышеловка]]></category>
		<category><![CDATA[мыши]]></category>
		<category><![CDATA[навесной потолок]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/news/pro-myshelovki</guid>
		<description><![CDATA[В мой Google Reader упала сейчас новость о выпуске новой классной мышеловки: Электронная ловушка представляет собой чёрный сундучок, на задней стенке которого имеются две лесенки. Взобравшись по ним, мышь попадает прямиком в &#34;камеру сгорания&#34;, именуемую Shock N&#8217; Drop Chamber. Там её со 100-процентной гарантией за 3-5 секунд убивает электрический заряд. Затем камера переворачивается и сбрасывает [...]]]></description>
			<content:encoded><![CDATA[<p>В мой <a href="http://google.com/reader">Google Reader</a> упала сейчас новость о выпуске новой классной мышеловки:</p>
<blockquote><p>Электронная ловушка представляет собой чёрный сундучок, на задней стенке которого имеются две лесенки. Взобравшись по ним, мышь попадает прямиком в &quot;камеру сгорания&quot;, именуемую Shock N&#8217; Drop Chamber.</p>
<p>Там её со 100-процентной гарантией за 3-5 секунд убивает электрический заряд. Затем камера переворачивается и сбрасывает бездыханное тельце в ящик, вмещающий трупики 10 грызунов. О том, что ящик переполнен, владельцу мышеловки &quot;сообщит&quot; световой индикатор.</p>
<p>Помимо скорбной процедуры опустошения ящика от человека требуется лишь регулярно класть в &quot;Виктора&quot; приманку и включать устройство.</p>
<p>Комплекта из четырёх батареек типа C хватает для уничтожения 150 мышей.</p>
</blockquote>
<p><a href="http://www.membrana.ru/lenta/?8829">Прочитать полностью</a></p>
<p>Сразу вспомнилось, как я боролся с мышами, работая банковским админом. </p>
<p>  <span id="more-364"></span>
<p>В офисе завелись эти сволочные твари. Начали они с того, что адски тупатели, шарясь по навесным потолкам в кредитном отделе. Особенно весело было, когда там сидели клиенты, оформлявшие кредит, и, уже собираясь подписать договор, слышали шебуршение и недоуменно поднимали брови. Кредитчица выходила из ситуации, поясняя им, что это жильцы сверху переставляют мебель, т.к. наше отделение было в цокольном этаже жилого дома. Но все равно было очень стыдно. </p>
<p>Начальница выдала мне разрешение на ликвидацию мыши и я пошел покупать мышелоку. </p>
<p><a href="http://ru.wikipedia.org/wiki/Мышеловка"><img src="http://upload.wikimedia.org/wikipedia/commons/6/68/Mausefalle_300px.jpg" /></a> </p>
<p>В качестве приманки были использованы крупные куски жареного сала. При взводе мышеловки мне пару раз прищемило пальцы, но в конце концов она была установлена внутри навесного потолка прямо над моей головой. Мыши на неделю затаились, потом, очевидно, одна из них подошла попробовать сала, и произошло ложное срабатывание, при котором я от неожиданности облился чаем, мышеловка хлопает очень громко.</p>
<p>После этого неудачного покушения мыши затаили на меня лютую злобу. Они целых полмесяца искали возможность отомстить, и придумали способ. </p>
<p>У начальницы неожиданно пропала телефонная связь и у всех начало сбоить Интернет-соединение. Проверка телефонов показала, что произошел обрыв где-то в проводке между кабинетом начальника и распределительной коробкой. Телефонные кабели были проброшены прямо внутри навесных потолков. Для поиска обрыва я дождался, пока отделение закроется для клиентов, и начал снимать навесные потолки. При снятии каждой панели меня щедро обсыпало пылью и засохшим мышиным калом. Их какашки были у меня везде &#8212; во рту, в носу, за пазухой, рассыпаны по всей одежде. Попутно пришлось удалять мышиные гнезда из бумажных ошметков. Я никогда не предполагал, что маленькие мышки могут так сильно нагадить. </p>
<p>Место обрыва было обнаружено там, где я его меньше всего искал &#8212; на подходе к <a href="http://ru.wikipedia.org/wiki/Патч-панель">патч-панели</a>, когда все кабели собираются в толстенный жгут. На половине <a href="http://ru.wikipedia.org/wiki/Коммутационный_шнур">патч-кордов</a> жгута была равномерно сожрана изоляция. Когда звонил телефон, по жгуту пробегали искры, а провод к телефону начальника был перекушен полностью.</p>
<p>Уверен, что мыши мерзко хихикали за стенкой, пока я, матерясь под 100-вольтными ударами тока телефонной линии в момент дозвона, скручивал провода синий-к-синему, зеленый-к-зеленому и т.д. (и так очень много раз).</p>
<p>На этом мыши не остановились. Через пару месяцев после этого у нас в отделении начал протекать туалет. Вызванный сантехник поснимал гофрированные трубы и в пластмассовом коллекторе обнаружилась дыра размером с кулак, и с характерными следами зубов. При всех процедурах замены коллектора мне приходилось помогать сантехнику и лазить по канализационным трубам руками. Изнутри канализационная труба <em>очень неприятная</em> на ощупь.</p>
<p>Так вот, я к чему, собственно: если вы будете ставить этот &quot;<a href="http://www.victorpest.com/store/rodent-control/M260?utm_source=PRWire&amp;utm_medium=PR&amp;utm_campaign=PRWire+Multi-Kill+11-08">Victor Multi-Kill</a>&quot; из новости, подумайте о том, как мыши могут отомстить вам, если меня они так довели за простую дедовскую пружинную мышеловку.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/dKKnH62FYcA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/news/pro-myshelovki/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://shkuropiy.ru/news/pro-myshelovki</feedburner:origLink></item>
		<item>
		<title>Настройка или параметры?</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/OSGd2ZiIBY0/nastrojka-ili-parametry</link>
		<comments>http://shkuropiy.ru/usability/nastrojka-ili-parametry#comments</comments>
		<pubDate>Thu, 30 Oct 2008 08:09:23 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
				<category><![CDATA[Юзабилити]]></category>
		<category><![CDATA[Word]]></category>
		<category><![CDATA[настройка]]></category>
		<category><![CDATA[параметры]]></category>
		<category><![CDATA[путать]]></category>
		<category><![CDATA[сервис]]></category>
		<category><![CDATA[юзабилити]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/usability/nastrojka-ili-parametry</guid>
		<description><![CDATA[Если вы создаете новую версию продукта, подумайте, что для вас важнее: чтобы пользователи привыкали к неожиданностям или чтобы они привыкали получать всегда то, что им действительно нужно.]]></description>
			<content:encoded><![CDATA[<p>Немало встречается таких проблем юзабилити, которые повторяются в программном продукте от версии к версии десяток лет подряд. Все продолжают пользоваться продуктом, и при этом никто не возражает, что он успешный и замечательный. Но вот какая-то ошибка проектирования остается или уже просто по привычке, или по соображениям сохранения преемственности интерфейса, или потому, что в компании все еще работает дизайнер пользовательского интерфейса, который обладает правом вето и применяет его ко всем, у кого альтернативный взгляд на эту ошибку. И ошибка вдруг переименовывается в <em>особенность</em> программы.</p>
<p>Вот яркий пример. MS Word с его знаменитыми двумя пунктами меню &quot;Сервис&quot;, которые мало того, что являются полными синонимами в сознании пользователя, но еще и расположены рядом.</p>
<p><img alt="Conf" src="http://static.flickr.com/3195/2985435649_a1819a2c0a.jpg" border="0" /></p>
<p>Пункты &quot;Настройка&#8230;&quot; и &quot;Параметры&#8230;&quot;. Кто их не путал никогда, пусть первым бросит в меня камень.</p>
<p>Я постоянно пользуюсь редактором Word с 1998 г., и, когда мне нужно открыть диалоговое окно конфигурации программы, вместо этого в половине случаев я почему-то попадаю в окно настройки панелей инструментов и клавиатурных комбинаций. Выучить нужную команду не удается, уж слишком они похожи.</p>
<p>Казалось бы, что стоило написать &quot;Настройка команд&#8230;&quot; и поместить этот пункт в другую секцию меню &quot;Сервис&quot;, или назвать другой пункт &quot;Параметры программы&#8230;&quot;. Будто в этих названиях разрешено было использовать только одно слово. </p>
<p>Но увы, теперь это неписанный стандарт. И все текстовые редакторы, которые обладают аналогичной функциональностью, повторяют эту ошибку просто для того, чтобы быть похожими на Word. Преемственность интерфейса подменила собой здравый смысл.</p>
<p>Если вы создаете новую версию продукта, подумайте, что для вас важнее: чтобы пользователи привыкали к неожиданностям или чтобы они привыкали получать всегда то, что им действительно нужно.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/OSGd2ZiIBY0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/usability/nastrojka-ili-parametry/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://shkuropiy.ru/usability/nastrojka-ili-parametry</feedburner:origLink></item>
		<item>
		<title>Да? Нет? Отменить? О!</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/HyvwpndLLM4/da-net-otmenit-o</link>
		<comments>http://shkuropiy.ru/usability/da-net-otmenit-o#comments</comments>
		<pubDate>Sun, 26 Oct 2008 09:10:10 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
				<category><![CDATA[Юзабилити]]></category>
		<category><![CDATA[Bat]]></category>
		<category><![CDATA[TheBat!]]></category>
		<category><![CDATA[диалог закрытия]]></category>
		<category><![CDATA[закрытие]]></category>
		<category><![CDATA[почта]]></category>
		<category><![CDATA[юзабилити]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/usability/da-net-otmenit-o</guid>
		<description><![CDATA[Что мне больше всего нравится в замечательной почтовой программе &#34;TheBat!&#34; (пишется с восклицательным знаком, да), созданной молдавскими ребятами из компании RitLabs? Конечно же, диалоговое окно, которое появляется при попытке закрытия программы, когда она получает или отправляет почту: Если у вас картинка не загрузилась, или шрифт мелковат, я еще раз напишу текстом &#8212;&#8212;&#8212;&#8212;&#8212; Предупреждение &#8212;&#8212;&#8212;&#8212;&#8212; Некоторые [...]]]></description>
			<content:encoded><![CDATA[<p>Что мне больше всего нравится в замечательной почтовой программе &quot;<a href="http://www.ritlabs.com/ru/products/thebat/" target="_blank" rel="nofollow">TheBat!</a>&quot; (пишется с <a href="http://shkuropiy.ru/usability/pro-vosklicatelnye-znaki" target="_blank">восклицательным знаком</a>, да), созданной молдавскими ребятами из компании RitLabs?</p>
<p>Конечно же, диалоговое окно, которое появляется при попытке закрытия программы, когда она получает или отправляет почту:</p>
<p> <span id="more-353"></span>
</p>
<p><img alt="BatExit" src="http://static.flickr.com/3072/2946823137_fb75cd76e7.jpg" border="0" /></p>
<p>Если у вас картинка не загрузилась, или шрифт мелковат, я еще раз напишу текстом</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;    <br />Предупреждение     <br />&#8212;&#8212;&#8212;&#8212;&#8212;     <br />Некоторые задания по проверке или отправке почты еще не завершены.     <br />Вы хотите выйти из программы по их завершении?     <br />&#8212;&#8212;&#8212;&#8212;&#8212;     <br />Да, Нет, Отменить     <br />&#8212;&#8212;&#8212;&#8212;&#8212; </p>
<p><em>(Кстати, не все знают, что можно скопировать в буфер обмена текст из любого стандартного диалогового окна Windows, просто нажав Ctrl+C)</em></p>
<p>Когда я вижу этот диалог, то никогда не могу понять, что же мне нажимать. Я снова и снова перечитываю вопрос, и мучительно выбираю из трех вариантов ответа тот, который мне подходит. К сожалению, еще не было ни одного раза, чтобы я угадал правильный ответ. Программа после нажатия любой кнопки всегда делает то, что я от нее меньше всего ожидаю. При этом каждый раз я чувствую себя полным идиотом.</p>
<p>Это очень наглядный пример того, как разработчики пытались построить линию поведения пользователя, учитывая все множество предполагаемых действий, а получилось так, что толком не учли ни одного из них.</p>
<p>Приведу потенциальный сценарий использования, на основании которого мог родиться этот странный диалоговый запрос.</p>
<ul>
<li>Пользователь нажал кнопку получения почты, потому что с нетерпением ждет письмо от возлюбленной. </li>
<li>Почтовый клиент полез на POP-сервер и выполняет длительное действие по перекачиванию спама (с рекламой средств для увеличения кое-чего на 5 см) из почтового ящика на компьютер. </li>
<li>Пользователю это надоело, потому что 10 Мбайт спама загружаются медленно даже на выделенных линиях, и нужного письма все не видно. </li>
<li>Пользователь нажимает кнопку-крестик в заголовке окна TheBat для его закрытия. </li>
</ul>
<p>Программа (точнее, ее разработчики) в сомнении. Сомнения выплескиваются на пользователя, которому предоставляется честь разрубить узел противоречий и сказать программе, как же ей поступить. </p>
<p>Ведь пользователь может не знать, что прием/отправка писем &#8212; это в общем случае длительный фоновый процесс, и его прерывание будет означать, что письма не дойдут до адресата или не скачаются с сервера. Тогда вместо того, чтобы немедленно прекратить пересылку, пользователя следует проинформировать об этом и намекнуть, что правильнее все-таки подождать до завершения передачи, а только потом уже выйти из программы. Но пользователь может не захотеть выходить из программы после того, как пересылка закончится, так как он может при этом получить важную почту, и ему будет необходимо время на ее прочтение. Фраза &quot;<em>Вы хотите выйти из программы по их завершении?</em>&quot; демонстрирует полную уверенность разработчиков в том, что после того, как идиоту-пользователю объяснили, чем сейчас компьютер занимается, у него даже не возникнет мысль о досрочном прекращении процесса. А вдруг ему как раз не нужно ожидать завершения передачи, и надо все-таки выйти прямо сейчас? Может, добавить кнопку &quot;Отменить&quot; на всякий случай? </p>
<p>Эта самая кнопка &quot;Отменить&quot;, которая делает именно то, что хочет пользователь (закрывает программу без ожидания), только вносит дополнительную путаницу, потому что никаких ссылок на нее в тексте предупреждения не приводится. Предполагается, что пользователь должен догадаться о смысле кнопки &quot;Отменить&quot;, но ведь в большинстве других программ кнопка &quot;Отменить&quot; в подобных диалогах отменяет действие, которое вызвало предупреждение. Интуиция пользователя подсказывает ему, что нажатие на кнопку &quot;Отменить&quot; <em>отменит закрытие</em> программы, а пользователю нужно именно <em>закрыть</em> ее, черт возьми.</p>
<p>Проблема в том, что пользователь понятия не имеет о двух первых вариантах развития событий. Потому что эти варианты возникли только в голове у разработчика, они&#160; выглядели для него равновероятными, и он взял на себя смелость разобраться таки с пользователем, который не ведает, что творит. А пользователю просто хотелось закрыть программу и пойти спать, он устал качать на свой компьютер спам с почтового сервера.</p>
<p>Что мешало перестроить запрос, например, так:</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;    <br />Предупреждение     <br />&#8212;&#8212;&#8212;&#8212;&#8212;     <br />Идет получение/отправка почты.&#160; <br />Выйти из программы сейчас?&#160; <br />&#8212;&#8212;&#8212;&#8212;&#8212;     <br />Да, Нет     <br />&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>Все потенциальные варианты развития событий были бы учтены без душевных метаний как разработчика, так и пользователя. Но почему-то так не получилось.</p>
<p>P.S.</p>
<p>Не следует думать, что я считаю TheBat плохой программой только из-за одного этого несчастного диалогового запроса. TheBat &#8212; отличное приложение, которое помогало мне автоматизировать мою работу с электронной почтой и экономить уйму времени много лет подряд. Я просто хочу сказать, что любой программный продукт можно сделать еще лучше, чем он есть, и для этого даже не всегда нужно менять что-то радикально. Иногда достаточно всего лишь переставить несколько слов в диалоговом окне.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/HyvwpndLLM4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/usability/da-net-otmenit-o/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://shkuropiy.ru/usability/da-net-otmenit-o</feedburner:origLink></item>
		<item>
		<title>Этот кошмарный внутренний софт</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/4JwjRWSDwPg/etot-koshmarnyj-vnutrennij-soft</link>
		<comments>http://shkuropiy.ru/software-development/etot-koshmarnyj-vnutrennij-soft#comments</comments>
		<pubDate>Mon, 06 Oct 2008 06:23:57 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
				<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[банк]]></category>
		<category><![CDATA[внутреннее ПО]]></category>
		<category><![CDATA[внутренний софт]]></category>
		<category><![CDATA[качество]]></category>
		<category><![CDATA[кошмарное ПО]]></category>
		<category><![CDATA[кошмарный софт]]></category>
		<category><![CDATA[ошибки]]></category>
		<category><![CDATA[плохой интерфейс]]></category>
		<category><![CDATA[программное обеспечение]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/software-development/etot-koshmarnyj-vnutrennij-soft</guid>
		<description><![CDATA[Этот софт всегда является отвратительной дешевкой. Я не видел еще ни одного экземпляра внутреннего ПО, при использовании которого мне не хотелось бы разбить клавиатуру об голову его программиста.]]></description>
			<content:encoded><![CDATA[<p>Внутреннее программное обеспечение &#8212; это ПО, которое используется только внутри конкретной организации или группы организаций для выполнения относительно узкого круга задач. Обычно внутренний софт разрабатывают сами предприятия в отделах автоматизации, а потом внедряют на рабочих местах по команде сверху. Иногда внутренний софт заказывают сторонним подрядчикам, предварительно проводя тендер.</p>
<p>Этот софт всегда является отвратительной дешевкой. Я не видел еще ни одного экземпляра внутреннего ПО, при использовании которого мне не хотелось бы разбить клавиатуру об голову его программиста. </p>
<p> <span id="more-343"></span>
</p>
<p>В большинстве случаев эти мысли возникают у всех пользователей такого софта, и работники массово пытаются избежать его использования, если предоставляется хоть малейшая возможность это сделать. Потому что без внутреннего ПО задача, для которой его создали, решается обычно на порядок быстрее и проще обычными бюрократическими методами, т.е. перекладыванием и переписыванием бумажек. </p>
<p><img alt="soft1" src="http://static.flickr.com/3128/2918091608_3e2008763f.jpg" border="0" /></p>
<p>Внутреннее ПО обладает несколькими характеристиками, которые меня доводят больше всего:</p>
<ol>
<li><b>Масса логических ошибок</b>.
<p>Когда я работал администратором в банке, то внутреннее ПО создавало мне кромешный ад на земле, потому что в нем происходили сбои <i>каждый час</i>. При этом клиенты недополучали проценты по вкладам, счета сбрасывались в ноль, а огромные суммы денег при переводе терялись или подвисали в воздухе, не доходя до центрального сервера. Конечно, потом, в конце банковского дня, все деньги находили и доставляли по назначению, благодаря тому, что каждая операция, слава богу, дублировалась в бумажном виде, но все это ощутимо сказывалось на моих нервах и добавляло седины на голове. </p>
<p>Попытки указать разработчикам на ошибки и заставить их исправить, к сожалению, ничего не дали. Вместо этого предлагалось воспроизвести магическую последовательность действий с файлами, нажать несколько неприметных кнопок, пританцовывая с бубном, и ошибка обходилась. Когда я приехал увольняться в областной филиал (это был один из самых счастливых дней моей жизни), ребята-программисты показали мне тот самый шаманский бубен, и сказали, что без него работа банка была бы невозможна.</p>
</li>
<li><b>Морально устаревший пользовательский интерфейс</b>.
<p>Вызывает смех сквозь слезы, когда организация закупает новейшие компьютеры с многоядерными 64-разрядными процессорами, 20-дюймовыми TFT-мониторами и предустановленной Windows XP OEM, а потом на них запускают 16-разрядное ПО от Васи Пупкина из второго отдела в окне MS-DOS и текстовом режиме 80х25. Это малюсенькое окошко одиноко торчит в углу экрана (не все знают, что надо нажать Alt+Enter для его максимизации), и людям приходится вводить данные в кошмарные текстовые формы с псевдографикой, которые были лучшим образцом юзабилити в 1985 году. Конечно, без использования мышки и без возможности скорректировать введенную информацию. </p>
<p>Для внутренних программ под Windows похожая история: они все созданы без каких бы то ни было минимальных удобств для пользователя. Я лезу на стену и вою от ужаса, когда вижу системы, построенные на Clarion и Visual FoxPro. Их сразу можно распознать по уродским формам для ввода данных, которые предназначены для каких-то зомби с вывихнутым мозгом, но уж никак не для людей.</p>
<p>Еще один пример идиотской концепции интерфейса &#8212; все виденные мною системы разделения доступа во внутренних приложениях. Когда-то, в конце восьмидесятых &#8212; начале девяностых годов, в СНГ сложился стиль разработки ПО с расчленением приложения на задачи-оверлеи. Каждая такая &#171;задача&#187; запускалась в отдельном окне, в котором она принимала команды от пользователя, делала что-то с данными из локальной БД и клала их обратно. Разделение доступа заключалась в том, что создавалось огромное меню задач, и каждому пользователю давался доступ только на определенное их подмножество. Меню обычно хранилось в текстовом файле на каждом рабочем месте, и администратору безопасности, чтобы расширить/ограничить кому-то разрешения, приходилось оббегать все компьютеры, вручную внося исправления в эти текстовые файлы, &#171;закомментировав&#187; несколько строк. Защитить саму базу данных (будьте прокляты, тысячи dbf-ок!) не представлялось возможным, и она регулярно убивалась нечаянными действиями пользователей. Спасали только частые резервные копии. С тех пор в архитектуре внутреннего софта ничего не изменилось. Факт того, что сейчас рулят многозвенные клиент-серверы и веб-интерфейсы, разработчикам внутреннего ПО совершенно неизвестен. </p>
</li>
<li><b>Абсолютная негибкость конфигурации</b>.
<p>Очень мало или совсем нет параметров внутреннего софта, которые можно изменить для повышения удобства работы пользователя. У программиста почему-то никогда не возникает мысль, что условия на рабочих местах могут отличаться от того, на котором он пишет программу. Разрешение экрана &#8212; только 800х600, ни пикселя больше. Битов на пиксель &#8212; только 8, ведь 256 цветов &#8212; это очень даже много. Каталог, в который должна быть установлена программа &#8212; только &#171;C:\ARM\&#187;, даже не обсуждается. Веселье начинается, когда две программы должны быть установлены в каталог C:\ARM\, потому что это очень популярное название. Экспорт данных &#8212; только на дискету под буквой &#171;А:&#187;, пожалуйста, потому что выходное устройство намертво забито в исходном коде, а исходный код программист-пенсионер унес с собой в могилу. Я видел, как несчастные пользователи работали с такой программой, не вынимая дискету из дисковода, используя ее как промежуточный буфер между базой данных и сетевой папкой. Иногда после экспорта данных из приложения дискета не считывалась, поэтому приходилось ее форматировать и повторно запускать процесс экспорта с предварительной настройкой в течение получаса. </p>
</li>
<li><b>Невозможность понять, как это работает, без непосредственного общения с программистом</b>.
<p>Является как следствием трех предыдущих тезисов, так и следствием отсутствия вразумительной документации. Если документация и прилагается к программе, то она построена в стиле, который я называю &#171;нате, отцепитесь&#187;, когда ее пишут только &#171;для галочки&#187; и не предполагают, что ее будет кто-то читать. По крайней мере, понять концепцию работы программы по ней можно очень редко. Поэтому прямая связь с разработчиком программы или с каким-нибудь опытным пользователей становится архиважной. Авторы ПО, обычно, очень не любят, когда им звонят и спрашивают, как пользоваться их программой, ведь для них все очевидно, и они не понимают, как можно быть таким тупым и этого не понимать. Следовательно, при каждой попытке заинтересованных пользователей разобраться происходят скандалы между отделами с последующим коллективным распитием валидола. </p>
</li>
<li><b>Невозможность самому разработать альтернативное, лучшее ПО</b>.
<p>Если вы &#8212; молодой энтузиаст и более-менее умеете программировать, то, когда вы будете ежедневно сталкиваться с кривым внутренним софтом, у вас обязательно возникнет идея переписать это уродство с нуля. Для типичного внутреннего ПО при хорошей университетской подготовке это займет у вас до одного-двух месяцев работы, и вы можете решить, что это замечательная альтернатива тому, чтобы мучаться с существующим ПО постоянно. </p>
<p>Однако, при попытке сделать это возникнут непредвиденные проблемы. Вы не сможете получить информацию, необходимую для безболезненного перехода всей организации на вашу программу (описания форматов данных, файлов экспорта/импорта для нормальной работы со смежными системами, полей любимых всеми dbf-файлов и др.), потому что никто из программистов ничего этого не документировал, а просто держал в голове. Если программист, создавший ПО, еще работает в организации, он вряд ли будет настроен на сотрудничество с вами, потому что вы автоматически станете его конкурентом в продвижении на следующую должность. Не у каждого энтузиаста хватит терпения докапываться с помощью дизассемблера до сути процессов, происходящих внутри. </p>
<p>К тому же, вы на всех уровнях организации будете встречать сопротивление вашим инновациям, потому что в любом коллективе есть пассивный балласт старых работников, которые изучили внутренний софт давным-давно, еще при старом программисте, написавшем его. Они не захотят переучиваться, даже если ваша программа в 100 раз лучше и надежнее, и это доказано тестированием. </p>
</li>
</ol>
<p>Почему внутренний софт такой?</p>
<p><img alt="soft2" src="http://static.flickr.com/3245/2917247799_ccb626c5fd.jpg" border="0" /></p>
<p>Причины, в общем-то, очевидны:</p>
<ul>
<li><b>Программисты не заинтересованы в качестве своего продукта</b>.
<p>Большинство программистов в отделах автоматизации работают на фиксированной ставке со смехотворными премиями. У них нет никакого финансового стимула делать софт качественно. Если у программиста и есть внутренняя мотивация &#171;сделать хорошо&#187;, то она существует недолго. Почему-то так получается, что чем больше организация, тем меньше каждый человек хочет для нее выкладываться. </p>
</li>
<li><b>Внутреннее ПО не разрабатывает молодежь</b>.
<p>Молодые талантливые программисты, которые могут делать качественные программные системы, не хотят работать в занюханных информационных отделах, сопровождающих электронный документооборот заводов, государственных структур, банков и других крупных предприятий. Хе-хе, если бы я был талантливым программистом, то не писал бы весь этот негатив в блоге, а работал бы на классную софтверную компанию, которая делает коммерческое ПО. В результате такими отделами в массе заправляют престарелые программисты &#171;старой школы&#187;, которые начинали с разработки программ для компьютеров, а не для людей. </p>
</li>
<li><b>Если внутреннее ПО заказывают на стороне, то на него тратят минимально возможные средства</b>.
<p>Поскольку любой отечественный бизнесмен хочет получать максимальную прибыль в краткосрочной перспективе, ему обычно наплевать на качество заказанного софта, если тот хоть как-нибудь решает поставленную задачу. Ведь не он же будет им пользоваться, в конец концов. Государственному управленцу тем более на это наплевать, потому что его не интересует вообще ничего. Поэтому тендеры на разработку софта выигрывают обычно те компании, которые предлагают много функций за меньшую цену, и никто не будет рассматривать вблизи, как именно эти функции реализованы. К тому же, если даже для заказных программ предприятие по документам выделяет вроде бы достаточно большой бюджет, очень часто конечные разработчики получают из этих денег мизерную долю. Вам слово &#171;откат&#187; говорит что-нибудь? Коррупция играет здесь не последнюю роль, да.</p>
</li>
</ul>
<p>Вы можете спросить: &#171;Автор, ты зачем все это рассказываешь? Мне вот все это было и так понятно, но я не думаю, что об этом стоит беспокоиться, ведь низкое качество внутреннего ПО &#8212; это вполне естественно, и тут ничего не поделаешь&#187;. </p>
<p><img alt="soft3" src="http://static.flickr.com/3093/2917247869_f6de161021.jpg" border="0" /></p>
<p>Я думаю, беспокоиться стоит. Плохой внутренний софт &#8212; это как айсберг, у которого самая опасная часть скрыта от наружного наблюдения. И когда ваша компания на него налетит, то вы даже не поймете, почему потонули.</p>
<p>Так зачем нужно улучшать внутреннее ПО?</p>
<p>Ответ на этот вопрос очевиден для служащих организации, которые круглосуточно матерятся, пытаясь заставить этот чертов внутренний софт работать. Совсем по-другому обстоит дело в кругах руководящего состава, который этот софт заказывает, распоряжается его бюджетом и принимает его после разработки. Именно для них приведу три веские (на мой взгляд) причины, почему важно его качество.</p>
<ol>
<li><b>Некачественный софт усиливает текучку кадров</b>.
<p>Когда у вас будет увольняться очередной работник, который, сидя за компьютером, постоянно нервничал и от злости иногда даже хлопал по монитору, потрудитесь спросить у него, что именно скрывается за формулировкой &#171;по собственному желанию&#187;. Вполне возможно, что на 70&#8212;80% его недовольство рабочим местом было связано именно с плохо работающими программами. Пять особенностей внутреннего ПО, которые я описал выше, могут довести вполне спокойного человека до бешенства и нервного срыва, я сам это многократно видел воочию. А нервные срывы каждый день отнюдь не создают комфортных условий для работы.</p>
</li>
<li><b>Некачественный софт снижает эффективность работы сотрудников</b>.
<p>Если у вас в приемной выстраиваются длиннющие очереди клиентов к &#171;девочке с компьютером&#187;, то это говорит об одном из двух: либо девочка &#8212; тормоз, либо тормозом является ее программа, которая не позволяет делать быстрый ввод данных (есть еще и третий вариант, когда тормозом являются и девочка, и ее программа, но мы его здесь рассматривать не будем). Хорошо спроектированный пользовательский интерфейс позволяет заводить информацию в систему на порядок быстрее, чем плохо спроектированный. Вывод: за одно и то же время можно обработать больше клиентов и получить с них больше денег.</p>
</li>
<li><b>Вы будете терять деньги из-за ошибок софта</b>.
<p>Когда слетает центральная база данных и работа всего предприятия приостанавливается на неопределенное время, вы теряете деньги. Когда ваш сайт взламывают малолетние хакеры-самоучки, и клиенты вместо коммерческого предложения видят чью-нибудь задницу на весь экран, вы теряете деньги и престиж. Если программа неправильно сводит баланс, или использует неточные формулы, это еще куда ни шло, вы даже можете не заметить потерь при большом денежном обороте. Хуже будет, если эти потери заметят ваши клиенты, которые мало того, что прекратят у вас обслуживаться, так еще и всем друзьям об этом расскажут. </p>
</li>
</ol>
<p>Если какая-то программа является основой технологического процесса организации, то повышенные затраты на ее качественную разработку окупаются <i>всегда</i>. Понимание этого &#8212; одно из оснований коммерческого успеха и залог хорошего эмоционального микроклимата на рабочих местах.</p>
<p><img alt="soft4" src="http://static.flickr.com/2364/2917247975_869868240b.jpg" border="0" /></p>
<p>Но рядовым работникам тоже следует учитывать влияние дрянного ПО на их жизнь. Когда вы будете устраиваться на новую работу, и ваша должность предполагает интенсивное взаимодействие с компьютером, при собеседовании обязательно спросите, какие программы будут у вас установлены. Требуйте посмотреть на них вблизи <i>перед тем</i>, как подписывать контракт. Никакая, даже самая большая зарплата не стоит вашего психического здоровья. Перетерпеть ежедневный контакт с плохой программой могут далеко не все, поверьте мне.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/4JwjRWSDwPg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/software-development/etot-koshmarnyj-vnutrennij-soft/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		<feedburner:origLink>http://shkuropiy.ru/software-development/etot-koshmarnyj-vnutrennij-soft</feedburner:origLink></item>
		<item>
		<title>Про восклицательные знаки</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/c1gRtz9_dpE/pro-vosklicatelnye-znaki</link>
		<comments>http://shkuropiy.ru/usability/pro-vosklicatelnye-znaki#comments</comments>
		<pubDate>Fri, 19 Sep 2008 05:40:34 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
				<category><![CDATA[Юзабилити]]></category>
		<category><![CDATA[восклицательный знак]]></category>
		<category><![CDATA[дурдом]]></category>
		<category><![CDATA[интерфейс]]></category>
		<category><![CDATA[эмоции]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/usability/pro-vosklicatelnye-znaki</guid>
		<description><![CDATA[Не употребляйте восклицательные знаки в электронной переписке! Никогда! Даже если вас переполняют сильнейшие эмоции и вы хотите сделать акцент на чем-то!]]></description>
			<content:encoded><![CDATA[<p>Не употребляйте восклицательные знаки в электронной переписке! Никогда! Даже если вас переполняют сильнейшие эмоции и вы хотите сделать акцент на чем-то! Это всегда выглядит, как письма из дурдома! Особенно идиотскими получаются предложения, которые заканчиваются несколькими восклицательными знаками!!!!!!!! Это вообще полный финиш!!!!!!</p>
<p>То же самое относится и к пользовательскому интерфейсу! Программа не должна быть кричащей истеричкой! Если у вас вместо кнопки &quot;Пуск&quot; будет написано &quot;Пуск!&quot;, то мне будет страшно на нее нажимать: кто знает, на какие последствия нажатия вы намекаете этим восклицательным знаком!</p>
<p>Вам не тяжело читать этот пост?!!! </p>
<p>А <a href="http://www.somethingawful.com/hosted/jeffk/" rel="nofollow">этот сайт</a>?!!</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/c1gRtz9_dpE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/usability/pro-vosklicatelnye-znaki/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://shkuropiy.ru/usability/pro-vosklicatelnye-znaki</feedburner:origLink></item>
		<item>
		<title>Видеозахват и тестирование программ</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/WRcR68pZkkc/videozaxvat-i-testirovanie-programm</link>
		<comments>http://shkuropiy.ru/software-development/videozaxvat-i-testirovanie-programm#comments</comments>
		<pubDate>Wed, 17 Sep 2008 10:25:07 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
				<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[avi]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[QA]]></category>
		<category><![CDATA[видеозахват]]></category>
		<category><![CDATA[захват видео с экрана]]></category>
		<category><![CDATA[ошибки]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/software-development/videozaxvat-i-testirovanie-programm</guid>
		<description><![CDATA[если вы тестируете прикладную программу и хотите сэкономить нервы, используйте системы видеозахвата действий пользователя. Это позволит при случайном возникновении ошибки восстановить последовательность ваших действий хотя бы на уровне пользовательского интерфейса, что в большинстве случаев очень помогает гарантированно воспроизвести баг...]]></description>
			<content:encoded><![CDATA[<p>На стадии тестирования программного продукта между юнит-тестами и выпуском бета-версии есть три этапа, которые знает каждый тестировщик:</p>
<p> <span id="more-304"></span>
<ol>
<li><strong>Ошибки обнаруживаются с сумасшедшей скоростью</strong>, когда время нахождения багов гораздо меньше времени их формальной записи в <a href="http://ru.wikipedia.org/wiki/Система_отслеживания_ошибок">трекер</a>. Ошибки спонтанно возникают на любой функции программы, даже не надо прилагать никаких усилий для их поиска. </li>
<li><strong>Нормальный темп обнаружения ошибок</strong>, в ожидаемых местах, где сложная функциональность. Тестировщик методично ищет слабое место программы, создает пару разных начальных условий, фактически ставя подножку, и программа падает. </li>
<li><strong>Когда большинство ошибок исправлено</strong>, тестировщику становится очень трудно. Можно целыми днями комбинировать начальные экстремальные условия, строить тактические планы убийства программы, и все равно ничего не добиться. Тем не менее, тестировщик чувствует, что ошибка где-то рядом, и перед выпуском бета-версии неплохо было бы ее найти. Причем, даже если какая-то ошибка возникает случайно, может понадобиться целая вечность, чтобы ее воспроизвести, а без этого ценность ее обнаружения в большинстве случаев нулевая. </li>
</ol>
<p>На третьем этапе, если вы тестируете прикладную программу и хотите сэкономить нервы, используйте системы видеозахвата действий пользователя. Это позволит при случайном возникновении ошибки восстановить последовательность ваших действий хотя бы на уровне пользовательского интерфейса, что в большинстве случаев очень помогает гарантированно воспроизвести баг.</p>
<p>Алгоритм работы такой: при каждой сессии тестирования предварительно включаете видеозапись всего, что происходит на экране, а потом при любом случайном вылете во время тестовых процедур останавливаете запись и просматриваете все, что делали с программой.</p>
<p>Из бесплатных средств видеозахвата я пока нашел только программу <a href="http://www.debugmode.com/wink/">Wink</a>. Вообще-то, она была сделана для создания демонстрационных flash-роликов, но тестировщикам тоже может помочь. Недостаток: мигание курсора мышки при видеозахвате и низкая скорость работы.</p>
<p>Из платных программ мне понравилась <a href="http://hypercam.com">HyperCam</a> (стоит 35 $, но единственным ограничением демо-версии является вывод предупреждающего текста в углу снятого видео, что для тестирования, в принципе, безразлично). HyperCam при записи почти не влияет на работу компьютера и пишет видеоряд сразу в avi-файл сносного качества (вполне можно разобрать мелкий текст). Минус программы в том, что она не поддерживает <a href="http://ru.wikipedia.org/wiki/Windows_Presentation_Foundation">WPF</a>-приложения.</p>
<p>Тестировщикам под WPF мне, к сожалению, порекомендовать нечего. Хорошим решением был бы <a href="http://www.techsmith.com/screen-capture.asp">SnagIt</a> (50 $), но эта программа не захватывает окна с полупрозрачностью, которые в WPF-приложениях могут встречаться довольно часто.</p>
<p>А для тестировщиков, которые работают с полноэкранными DirectX и OpenGL приложениями (игры и другие мультимедиа), будет полезной программа скоростного видеозахвата <a href="http://fraps.com">Fraps</a> (37 $).</p>
<p>Если вы тестировщик и пользуетесь программами видеозахвата, очень прошу сообщить мне их названия в комментариях.</p>
<p><em>P.S.</em> Недавний выход игры <a href="http://www.stalker-game.com">S.T.A.L.K.E.R. Clear Sky</a> очень явно показал, что далеко не все отечественные тестировщики доходят хотя бы до второго этапа из перечисленных. Вы же не хотите, чтобы на вас потом так же плевались пользователи? Если не хотите, то ловите случайные ошибки, не пускайте их в мир.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/WRcR68pZkkc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/software-development/videozaxvat-i-testirovanie-programm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://shkuropiy.ru/software-development/videozaxvat-i-testirovanie-programm</feedburner:origLink></item>
	</channel>
</rss>

