Как правильно копировать файлы на дискету
Thursday, 9 Aug 2001
Немного истории
В середине девяностых мне довелось писать программу обработки данных для одного медицинского учреждения. Задача сводилась, как и все задачи во вселенной, к получению некоторой информации из внешнего мира (от пациента, с подключенной видеокамеры, с датчика, воткнутого в последовательный порт и откуда-то еще), обработке полученной кипы цифр, сохранению результата в базе данных и печати результирующего отчета.Знакомо, да?
Единственным отличием этой программки от сотен подобных — явилась необходимость, сохраняя данные в базе, копировать их на дискету для последующей передачи пациенту.Я принял революционное решение сохранять необработанные данные, так, что при необходимости эту дискету в дальнейшем можно было бы использовать как некий суррогат пациента — на ней хранились ровно те байтики, которые приходили с камеры, последовательного порта и клавиатуры во время осмотра. При желании, процедуру обследования можно было бы повторить в точности через любой промежуток времени и в отсутствие пациента.
Выбрав подобную стратегию, я немедленно столкнулся с дилеммой следующего толка. Разумеется, самым рациональным способом записи данных на эту дискету был бы простейший из возможных. А именно, прочитал два байта с видео-порта — скинул их на дискету. Набили на клавиатуре фамилию и паспортные данные — хоп, и их на дискету! Но я тут же представил себе будущего пользователя моей программы и загрустил. Ярче, чем наяву, мне виделся сценарий развития событий — на следующий же день после начала работы с программой. А именно,врач вставляет дискету в дисковод, вводит фамилию пациента, и вспоминает, что вставил не ту дискету. Дальше, думаю, ясно. Ничтоже сумняшеся, он достает дискету, вставляет другую, правильную, и продолжает работу. Мотивацию таких действий я слышал миллион раз — «А что такого? Там же не было такого маленького красного флажка, предупреждающего, что дискету нельзя поменять!». Каждый программист, впрочем, знает, что, даже если увесить всё интерфейсное окно красными флажками и заставить его мигать, как новогодняя елка, каждый третий пользователь все равно достанет дискету в самый неподходящий момент и будет звонить разработчикам. Причем, вероятнее всего, выберет оптимальное время для звонка — где-то между двумя и тремя часами ночи. «А дисковод не шуршал! Я точно знаю, когда дискета записывается, мой дисковод шуршит.»
Скрепя сердце, я пошел по пути наименьшего сопротивления. Я записывал все сырые приходящие данные на жесткий диск; когда же данные были полностью получены, обработка закончена, и можно было бы отпускать несчастного обследованного по самое-не-хочу пациента домой — я вывешивал красное окошко во весь экран, блокировал клавиатуру и самозабвенно копировал мегабайт (или около того) данных на дискету. Минута-полторы радостного ожидания, и флоппик готов.
Пациенты с замиранием сердца терзались вопросом: «а докопируется ли оно, раз так шуршит?». Врач терял около пятнадцати минут ежедневно, созерцая экзистенциальное феерически-красное окно, аршинными буквами сулящее все ужасы ада, если достать дискету прямо сейчас. Идиллия по-программистки.
Я думаю, вы поняли, к чему я клоню.
Еще немного истории
Когда я впервые установил на оба своих компьютера Linux, я пообещал жене, что она очень быстро освоится; что я ей помогу, если вдруг; что преимущества она заметит сразу. В то время ей приходилось практически ежедневно обмениваться файлами с человеком, у которого не было быстрого доступа в интернет. В результате, почти каждый вечер я засыпал под мерный хруст флопповода. Объем передачи достигал порой пяти мегабайт. Жена редактировала файлы прямо на дискете, потому что «так удобнее, и должно работать!». Естественно, я предпочел начать ее знакомство с новой операционной системой с объяснения механизма работы sync
и umount
. Битых два часа я распинался на тему того, что можно спокойно работать, не нужно каждый раз ждать, пока файл скопируется, круто, супер, ля-ля-ля.
Только переведя дух, я с изумлением услышал: «но это же неудобно! Я же обязательно забуду этот у-у-ун-мау». Будучи дипломированным лингвистом, она даже не поняла того, что этот у-у-ун-мау — контаминация английского unmount.
В общей сложности мне потребовалось порядка пяти часов объяснений, включая краткие лекции по общему устройству файловых систем, чтобы она признала тот очевидный, с моей точки зрения, факт, что при некритичной операции (а она некритична, в отличие от, скажем, форматирования диска или удаления файлов мимо корзины, в том смысле, что информация копируется на дискету откуда-то, и не может быть окончательно утеряна) — лучше один раз забыть размонтировать дискету, чем по двадцать минут ежедневно терять, пялясь в индикатор копирования файлов.
Основным аргументом против механизма sync
, как рефрен,звучало вот что: «Люди привыкли к этому. Когда файл копируется на дискету, нужно ждать».
Usability?
И вот, спустя почти десять лет с момента кодирования этого ужасного красного окна «не-трожь-дискету-а-то-худо-будет», и через два с лишним года после полного переезда под Linux, я с ужасом понимаю, что usability — это не синоним удобства. Это даже не синоним комфорта. Этого страшного английского монстра — usability — стоит переводить словом привычка. И да, я читал Нильсена.
В общем-то, мы должны быть признательны MicroSoft уже за то, что они приняли компромиссное решение. Ведь, чтобы окончательно защитить людей от потери файлов при копировании на дискету, они могли пойти дальше. Быть, так сказать, последовательнее. А именно, делать в точности так, как это делал я десять лет назад. При каждой попытке сохранить файл, открытый, к примеру, редактором Word прямо с дискеты, вывешивать транспарант, требовать вставить дискету, сохраняться, и (sic!) требовать освободить дисковод от греха подальше. И все бы привыкли.
Проблема надумана?
В общем-то, я понимаю, что вся проблема с этим копированием — в механической пимпочке, отпирающей дисковод (в отличие от сенсора CD-ROM). И если бы дисковод можно было программно заблокировать, все бы пользовались механизмом sync
. Это настолько очевидно, что даже не хочется обсуждать. Хотя постойте! Тут же нашлись бы люди, кричащие «эй! я файлы скопировал, а он мне диск не отдает». И очередной корпоративный софтверный гигант пошел бы навстречу этим несчастным. Ведь их психика нам очень важна. А они нервничают, когда им не достать дискету. И совершенно спокойны, когда им предлагают выбросить из жизни две минуты (то есть, шесть часов в год), созерцая индикатор копирования.
Не знаю уж, чем мы обязаны тому радостному факту, что Internet Explorer не блокирует возможность дальнейшего просмотра страниц в сети при выкачивании файла. Но, учитывая все сказанное выше, я думаю, нам просто повезло. Может, их штатный психоаналитик был в отпуске, когда принималось это важное стратегическое решение?
Наконец, я хочу высказать свое отношение к проблеме. Если мне завтра придется переписывать ту самую медицинскую программу, я не дам поблажки ни себе, ни моим пользователям. Я заставлю их запомнить, безо всяких красных флажков, что дискету во время сеанса менять нельзя. Даже если мне придется провести неделю у них в офисе, останавливая все руки, тянущиеся к дисководу в неположенное время. Даже если вьюга, цунами, землетрясение, потоп и солнечное затмение.
Потому что пользователя нужно уважать, а его время — беречь.
Пойду, что ли, почитаю, как там асинхронный ввод-вывод работает…