Секреты управления

Записки программиста FineReader’а

7652r_zapiski_programmista10

С выпуском ранних версий FineReader’а связано много воспоминаний. Ими поделился Юрий Чулинин – программист и старожил нашей компании, который работал над программой, начиная со второй версии, сейчас развивает и поддерживает CJK-языки (китайский, японский и корейский) и знает каждый уголок ее кода! Сегодня наш «Файн» распознает 190 языков, а начиналось все с русского и английского. А еще с плюшек в детском саду, сгоревшего трансформатора и работы при свечах. Предлагаем присесть у костра, погрузиться в прошлое и послушать несколько интересных историй от программиста FineReader’а.

Программисты в детском саду

Когда мы работали над вторым FineReader’ом, в компании было человек 20-30. На выставки выезжала вся компания, а о продуктах клиентам рассказывали сами программисты.

Сидели мы в детском садике. Детишек в нем тогда было мало и руководство сдавало помещение одной из групп (средней или старшей, точно не помню). Располагалось оно достаточно обособленно, было несколько комнат, маленькая кухня, смешные детские туалеты. В садике было хорошо! Значительную часть дня территория пустовала, можно было ходить по тропинкам и что-нибудь обсуждать. Или вообще устроить совещание на свежем воздухе под павильончиками!

Кормили нас замечательные женщины, которые каждый день приносили голодным программистам домашнюю еду. В 5 часов были плюшки – мы по очереди покупали их в соседнем магазине. Еще особенной популярностью пользовалось печенье «Веселые друзья» – были такие галеты в форме животных.

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

Четвертый FineReader был выпущен уже в офисе на Бауманской, после переименования компании (раньше ABBYY называлась BitSoftware). Сотрудников стало больше, в одном крыле сидели программисты, в другом – лингвисты. Между ними был клуб «Что? Где? Когда?», кафе, любительский театр. Женщины, которые готовили нам в детском саду, стали ездить по новому адресу.

Шелку – нет!

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

  • например, был приказ о запрете носить шелковое белье. Оно вырабатывало статическое электричество и напряжением можно было убить компьютер;
  • запрещалось ходить босиком – у нас не было дресс-кода, но такие «эксперименты» не приветствовались;
  • был приказ, запрещающий играть в компьютерные игры на рабочем месте.

Страшная история

Когда мы работали в офисе на Бауманской (общежитие), студенты что-то там нахимичили, что-то перемыкнули – в общем, сожгли подстанцию. Т.е. трансформатор просто сгорел. Сеть упала надолго – никто не мог назвать хотя бы примерные сроки: «ну, когда-нибудь починим», «может через неделю, может через месяц», «когда привезут новый трансформатор». Остались мы без электричества.

Часть сотрудников отправилась в отпуск, а часть продолжала работать в экстремальных условиях. Купили генератор – он стоял на балкончике под навесом, чтобы его не тревожила непогода, а админы бегали к нему по часам и подливали бензинчик. Генератор этот нас не подводил и всегда послушно работал, питая несколько компьютеров. Тянул он строго определенное количество, поэтому мы работали по специальному графику, в несколько смен.

Но главными, в этой истории, являются 2 смешных обстоятельства:

  1. Программистская романтика. На освещение мощности трансформатора уже не хватало (лучше иметь 2 дополнительных рабочих компьютера, чем лампочки). Поэтому по вечерам мы работали при свечах, а по офису передвигались с фонариками.
  2. Пунктуальные вкусняшки. У нас было расписание чаепитий. Газовую горелку ставить не стали, а для чайников не хотелось выделять электрические мощности. Поэтому, в определенное время, все гасили мониторы, а на высвобожденной энергии кипятились чайники. Чай пили в этот период всей компанией.

А потом трансформатор починили и все наладилось.

ScanMan и рейды по тестированию сканеров

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

Но (даже в таких условиях) сканирование было сильной стороной FineReader’а. Он умел стабильно работать даже с портативными сканерами, которые прокручивали бумагу (или водились по документу), и легко склеивал полученные ими кусочки текста в один файл. Часть пользователей даже покупали его как программу, с помощью которой они смогут хорошо сканировать документы, а если нужно – еще и распознать их.

Для того, чтобы добиться такой стабильности, мы немало потрудились.

Был такой протокол TWAIN для общения со сканерами – запутанный, развесистый, многовариантный. Все сканеры реализовывали его совершенно по-своему. Другая сторона протокола (какое-то программное обеспечение) тоже использовала его разными способами.

Самый простой способ «общения» через TWAIN – это попросить сканер открыть свой диалог, в котором пользователь выбирал нужную опцию. Но здесь было много сложностей: было трудно получить хороший скан (определенные параметры нельзя было выбрать), часто сканер не мог обработать многостраничный документ (а для тех, кто пользовался и пользуется FineReader это довольно популярная задача).

У нас же, отдельным приложением, была подсистема ScanMan. Он использовал другой режим TWAIN – окошко показывал наш FineReader и он же управлял сканированием. Такой вариант был удобнее для пользователей. Но не все сканеры так умели, не всегда передавали файл нужным способом, какие-то имели запрещенные разрешения.

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

Для его создания целая куча программистов несколько лет подряд ездила по всяким компаниям и тестировала сканеры 1-2 раза в неделю. Суть была такой: через дилеров или знакомых мы узнавали, что там-то в Москве появился такой-то сканер. С этой фирмой мы договаривались, приезжали и прогоняли определенный набор тестов.

Трудности распознавания и запрещенные слова

Для проверки качества сканирования у нас было несколько документов. Программисты до сих пор знают их наизусть и могут обмениваться фразами из текста – этот диалог довольно занятно смотрится со стороны.

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

Чтобы избежать подобных инцидентов, команда составила список запрещенных слов. Их нельзя было подтягивать из словаря в начале или в конце строки (если было подозрение, что это перенесенное слово). В какое-то время этот список обогащали лингвисты – он получился очень занятным, и мы к нему не раз обращались… конечно, из сугубо научного интереса! :)

FineReader и слово на миллион

В 2000 году мы переехали на Савеловский вокзал, и я переносил программу под MacOS, а потом и под Linux. Тогда появилась шутка – «Работаю недалеко от вокзала и переношу FineReader с платформы на платформу».

В это время в коде спеллера нашли функцию, которая перебирает все слова и вычисляет, по какой-то хитрой формуле (по типу scrabble), специальный коэффицент. И ищет слово с «весом» в миллион по этому значению.

Мы долго не могли понять, зачем нужна эта функция в FineReader’е. Оказалось, что в какой-то газете, вроде «Тещин язык», проводился конкурс – нужно было найти слово, которое, по определенным правилам, стоило бы миллион. За это полагался денежный приз. Наши программисты подсуетились и нашли такое слово (или выяснили, что его нет – точных подробностей не помню).

 

Интересных историй за эти более чем 20 лет было очень много, всего и не вспомнишь теперь.  Работать над программой всегда было интересно. Мы создавали нечто новое и передовое. FineReader 2.0 на момент выпуска опережал возможности популярного железа. Его делали сразу 32-битным, хотя в обиходе была еще 16-битная Windows (у нас был Win32S от Microsoft, который эмулировал 32-битную систему на 16-битной). И с каждой версией хотели сделать программу еще лучше. Надеюсь, что это вполне успешно получалось и получается. Мы продолжаем работать над FineReader’ом, добавлять новые языки и улучшать качество распознавания.

  • http://vk.com/id332991379 Сергей Ружинский

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