January 23, 2007

Магия чисел против коллективного разума

(Хотя, наверное, лучше было бы сказать совсем наоборот, потому как коллективный разум, всё же победил!)

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

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

Получается, что к ошибке приводит только первая семёрка в строке. Интересны так же, так сказать, side effects. Visual Studio всё отлично собирает, но при этом ругается если семёрка объявлена как значение константы. Дальше больше. Собранный на испорченной машине exe без проблем запускается и правильно работает на других машинах. Написали код попроще, тот который просто парсит строчку, переданную в качестве параметра, чтобы откинуть все лишние возможности внести ошибку. Результат тот же.

Прошло N часов. Произведена переустановка Microsoft .Net Framework, кажется, даже Visual Studio. В голову стали закрадываться мысли типа "а не снести ли Винду". И тут мне вспомнилось, как однажды, давным давно, на мой вопрос, заданный на форуме sql.ru, в течение 10 минут был получен простой ответ. Конец света откладывается. Идём на форум RSDN.

Первый ответ не поразил новизной - "переставь Винду". Отнекиваемся. Ждём. И вот спустя какое-то время...  Вуаля!

Оказалось, что в настройках локализации можно в качестве знака отрицания указать любой символ. Угадайте что было указано на "поломанной" машине?! Шутка хумора, однако.

Всвязи с этим вспомнилась ещё шуточка: #define i j.

P.S.: Кто изменил локаль так и осталось загадкой.


January 17, 2007

О важности стандартизации и силе привычки

Ехал вчера в метро и подумалось: стандартные (или просто однотипные) интерфейсы вызывают привыкание, а привыкание - сильная штука.

Пример из жизни №1

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

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

Пример из жизни №2

Пример уже не из моей жизни, но я о нём наслышан. Итак. iPod и Zune. Уже догадались к чему клоню? Раньше все пользовались продуктом Apple, у которого есть колесо (пусть и сенсорное но всё равно колесо), которое можно крутить. И вот Microsoft выпускает Zune. Счастливый обладатель нового девайса открывает заветную коробку, достаёт плеер, видит круглый контрол и что пытается с ним сделать? Правильно! Покрутить. А оказывается что это всего лишь кнопки, которые сделаны в форме кольца совсем не для этого. Скажете придумал? Нет. Вот вам информация из первых рук: ревью Zune от Scoble  и подкаст на twit.tv. Все говорят одно и то же: после iPod все ожидают сенсорное кольцо :-)

Вывод

Хочешь сделать что-то, что всем понравится? Спроси меня как! Сделай интерфейс максимально узнаваемым и привычным (если, конечно, интерфейс не есть твоё ключевое преимущество). Потому как люди склонны иметь привычки и могут болезненно переносить отказ от них.


January 15, 2007

Вершители судеб

Сегодня нашёл замечательный пост Jeff Atwood о том, как один сайт за считанные дни потерял значительную часть посетителей. А всё из-за того, что анализатор Google обнаружил среди коментариев на этом сайте "неправильные" ссылки и перестал отображать его в результатах поиска.

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


Контрольная сумма и ширина канала - things that matter

Вводная:

Скачал я тут себе недавно Fedora Core 6. Хотел посмотреть чего там новенького. Надо сказать, что занятие это на моём домашнем 64кбитном канале не очень быстрое, так что я ждал момента окончания закачки как ничего другого. И вот... Случилось! Докачалось! Ура. Заливаю образ на ДВД и давай ставить.

У RedHat'ов (а может ещё у кого есть, но запомнилось только у них) есть замечательная опция: при установке можно проверить диск на ошибки. Никогда, если честно, этим не занимался, видимо потому, что ставил FC5 с 5 CD дисков и уж больно не хотелось их туда-сюда вставлять-вынимать. А тут целый один DVD - можно и проверить, хуже не будет. Проверяем-проверяем... 10%... 25%... 68%... БАЦ! Corrupted. Я было погрешил на диск, он у меня был немного потёртый. А потом думаю: "а ну-ка вместо того чтобы диски резать один за другим проверю контрольную сумму ISO". Проверил. Взгрустнулось. Сумма не совпала.

Сразу вспомнился эпизод, как в один прекрасный момент посреди процесса закачки выключился свет. Видимо в этот самый миг какой-то байтик был принят неправильно и все 3.6Гб оказались бесполезными.

А теперь идея, которая пришла ко мне после этого инцидента.

Контрольная сумма всегда одна на файл. (По крайней мере иного расклада я не встречал ещё ни разу.) Существует 2 возможных выхода. Первый: разбить файл на несколько частей и посчитать контрольную сумму для каждой, чтобы в процессе скачивания видеть что такая-то часть скачалась с ошибкой, и не терять весь файл целиком. Зато в этом случае не совсем понятно как быть с возможностью докачки, точнее таким её использованием, как скачивание в несколько потоков. Вариант второй предполагает возможность в любой момент времени попросить у сервера посчитать сумму для любой части файла, сделать то же на клиентской стороне и сравнить полученные результаты. В случае ошибки переспросить кусочек файла. Большими минусами в этом случае можно назвать увеличение вычислительной нагрузки на сервер (особенно если всякие неблагонадёжные типы будут постоянно спрашивать пересчитать сумму для огромных файлов, это будет настоящий DoS) и необходимость изменения существующих протоколов. Но для таких как я, людей с "ограниченными возможностями" в плане ширины канала это будет что ни на есть решение.

Ах да. Где-то прочитал что всякие P2P сети (а ля eDonkey и BitTorrent) имеют достаточно мощные средства по обеспечению правильности файла при скачивании.


January 12, 2007

Проблема 2007 года

Некоторое время назад (году эдак в 2005) мы с коллегами подсмотрели у Microsoft стратегию нумерации версий сборок.

Как обычно версия состоит из Major, Minor, Release и Build частей. Сама стратегия заключается в том, что Release часть имеет формат YMMDD. То есть для релиза от 8 марта 2005 года значение будет 50308. И все были довольны, потому как 4-компонентый номер версии был неудобен, а тут получилось, что он вроде и информативен, и думать, что в него написать, особенно не надо.

И вот настал 2007 год... И первый же релиз заставил снова пересмотреть систему нумерации билдов...

В катчестве хинта:
А всё почему? Да потому, что под каждую компоненту номера версии отводится двухбайтное значение, и максимальное число, соответственно, 65535, а любая дата 2007 (и более) года в принятой нотации заведомо больше.


January 9, 2007

Трудности перевода

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

Для начала быстренько проглотил Джоэл о программировании, а то лежит на полке уже какое-то время, всё руки не доходили прочитать. А потом решил расширить горизонты познания и взялся за Александреску (сам-то я С++ уже некоторое время как не использую, но добрая память о нём жива, кроме того на DefMacro уж больно хороший отзыв об этой книге). Следом в списке к прочтению оказался Флэнаган (давненько я собирался познакомиться с JavaScript и вот наконец собрался). Можно считать, что каникулы прошли не зря.

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

Флэнаган и Александреску по качеству перевода (и книги в общем) уступают, и вот почему: основное их отличие от предыдущей книги -- чёткая ориентированность на программистов. То есть присутствуют листинги программ и всякие определения (как в любой книге, рассказывающей про любой язык программирования), а не общие размышления. И в этих самых листингах есть досадные опечатки. (Хотя я тут подумал, эти опечатки могли достаться по наследству от оригинала). Ладно когда опечатка в небольшом сценарии на JavaScipt, всё равно в них не вчитываешься, там ничего особенного быть не может, но когда опечатка в описании непростого C++ template, который описывает мудрёную ранее не виданную концепцию... Над одним примером кода я бился минут, наверное, 20, в бессильных попытках понять. И уж когда совсем было забросил это занятие, сославшись на собственную недалёкость, подумал "а что, если опечатка". С учётом опечатки понимание пришло тут же.

У меня есть некоторый опыт чтения программерской литературы как в оригинале так и в переводах, и вот что я отметил:

Складывается впечатление что технические книги переводят совсем нетехнические люди. (Наверное все технически-грамотные люди пишут свои книги :-))


This page is powered by Blogger. Isn't yours?