четверг, 3 июня 2010 г.

Странный мусорный кулек (продолжение)

Однажды тёмной ночью я решил всё же выбросить этот грёбанный мусорный кулек. Блин, да его поднять не могу! Кирпичи, что ли? Нет - оказывается, это был большой кулек с макулатурой. Плюнул и оставил - пусть сами надрываются.

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

Пару недель я наслаждался чистотой. Но они снова взялись за свое: когда прислали большую посылку, соседи бросили пустую коробку на лестничной клетке. Не понимаю таких людей. У них возле двери ещё хранится детская коляска и велосипед. Каждый день спотыкаются об коробку, но нет, блин, пройти 20 метров до макулатурного бака им в лом.

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

пятница, 28 мая 2010 г.

As fuzzy as you can

В 1998 году я случайно нашел заметку про Soundex. Меня до глубины души поразила простота алгоритма и то, что его придумали ещё в начале 20-го века, когда и компьютеров-то не было. Захотелось как-то его применить.

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

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

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

Кстати, прошло совсем немного времени, и клиент сказал: "Я передумал, шлите мне все платежи, а я сам разберусь". В общем, это логично. Это не работа банка - разбираться в чужих платежах и особенностях ведения клиентского бизнеса. Кстати, робкая операционистка мне ничего не сказала. И только через несколько лет я случайно увидел, что она по-прежнему каждый день вручную добавляет каждый платеж в группу "Все платежи". Узнав об этом, я тут же добавил кнопку "Добавить все" и сэкономил бедной женщине несколько сотен кликов в день :)

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

Часто возникновение и погашение задолженности можно было сопоставить по сумме. Но даже в этом случае вопросы оставались, потому что иногда бывали совершенно разные задолженности, но на одну сумму. А ещё нередко бывало, что суммы не совпадали. Например, мы заплатили за строительство, но оно продолжается год; каждый месяц акт выполненных работ частично погашает дебиторскую задолженность. Или наоборот: целую неделю разные клиенты платят за выдачу им пропусков, а потом вся это кредиторская задолженность гасится одной проводкой.

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


И вот, наконец, мои "нечёткие мечты" сбываются. Большой проект, в основном связанный с нечетким поиском текста. Если всё получится, то с гордостью буду показывать друзьям одно текстовое поле с кнопкой "Поиск" и говорить: "Вот этим я занимался полгода". В принципе, у нас уже был похожий проект, и всё нормально работало, но... там была база с несколькими тысячами записей, а у меня будет несколько миллионов. Те алгоритмы, которые есть, использовать невозможно. Причем не только из-за проблем с производительностью. Природа данных меняется, и нужны совсем другие правила для определения релевантности.

А в функциональной спецификации было сказано просто: "Для этого проекта необходим нечёткий поиск - точно такой же, как сейчас". Но "точно такой же" сделать невозможно. Прошла куча кучи совещаний, где я рассказывал о преимуществах и недостатках Jaccard index, Damerau–Levenshtein distance, nGrams, NYSIIS, Double Metaphone, SQL Full-Text Search, Lucene и пр. Мы долго спорили, в концев у менеджеров опухли головы и они сказали: "Короче, это... сделай как-нибудь получше... be as fuzzy as you can" (будь как можно более нечётким).

Трудно сформулировать чёткие требования к нечёткому поиску. Когда я начинал проект, то думал, что главная проблема - производительность. Оказывается, основная сложность не в том, как это сделать, а в том, что же именно надо сделать. Пожалуй, это мой первый проект, где гораздо больше времени уходит на написание спецификации, а не на программирование. Сами по себе алгоритмы давно известны и реализованы; загвоздка в том, какие именно из них, и в какой последовательности применить.

четверг, 27 мая 2010 г.

В защиту Лесопарка

Что лучше - построить новую дорогу и бизнес-центры или сохранить 10 га леса в черте города Харькова? Предлагаю почитать и, возможно, подписать эту петицию.

Я не гринписовец. Я не приковываю себя наручниками с барже с опасными отходами. Я хочу иметь машину, и я поддерживаю стоительство третьей взлетной полосы в Хитроу. Она, конечно, для экологии не очень хороша; но с другой стороны, это ненормально, когда главный аэропорт страны загружен на 98%, нет никакого запаса прочности.

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

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

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

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

А вот что говорят украинцы среднего достатка, купившие Ланос в кредит на 5 лет: "Толкаться в метро? Не барское это дело..."

понедельник, 24 мая 2010 г.

Eastbourne

Истборн - тихий городишко на берегу моря. Там есть классические белые скалы. Правда, они гораздо меньше, чем в Севен Систерс или в Довере. Зато много парков и учебных заведений. Я бы сказал, это более тихий, чистый и современный вариант Оксфорда или Кембриджа.

Жилье чуть ли ни в два раза дешевле, чем в Лондоне. Судя по тому, что на станции висит телевизор с инфомацией о задержках в лондонском метро, многих не пугает полуторочасовая дорога на работу.

По дороге случился конфуз. Автомат выдал мне только один бланк "туда" и сказал: "Произошла ошибка, обращайтесь в кассу". Но стоять в очередь в кассу мне было некогда, опоздал бы на следующий поезд. Без особой надежды на успех я подошел в кассу на уже другой станции. Кассир долго нажимал кнопки и, в конце концов, всё же нашел в базе мой нераспечатанный обратный билет.

пятница, 21 мая 2010 г.

Комната-жертва

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

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

Jeremy Bentham

По пятницам мы часто ходим на обед в паб. Сегодня в Лондоне непривычно тепло, и мы сидели на улице в пабе под названием "Jeremy Bentham", на University Street. В ожидании еды я стал читать мемориальную доску на стене. Тут-то аппетит и испортился...

Оказываются, паб переименован в честь духовного отца University College London. Поскольку этого Джереми сильно уважали, его одетый скелет теперь хранится в университете даже приносится на собрания. В протоколе его отмечают как "присутствовал, но не голосовал". Мумифицированная голова тоже хранится в университете, а в пабе есть восковая копия.

P.S. А в украинском парламенте обычно делают наоборот - "голосовал, но не присутствовал".

Относительно домов

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

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

Другой прикол. В госпитале регулярно рассылается бюллетень о всех текущих проектах. Марина написала доклад на 10 страниц. Начальница говорит: "Слишком много, у других проектов по 2-3 страницы. Складывается такое впечатление, как будто кроме тебя никто не работает, я не могу этого допустить. Не подставляй коллектив, сократи".

Вспомнилась "Теория относительности":
- ...оглупляем его и делаем коллектив умным.
- Относительно чего?
- Домов, конечно.

Подумав, мы решили, что все же Марине надо представить и полную, и сокращенную версию. Только всё это зря: в бюллетене всё равно почему-то напечатали старый, короткий черновик доклада. Зато у всех остальных проектов доклады были по 10 страниц.

Совещание прошло неплохо. Представитель родительского комитета написал, что это "пожалуй, лучший проект года". Бывший злейший враг (когда-то обещал добиться, чтобы Марину выгнали) вдруг сменил гнев на милость, и тоже хвалил. Зато главврач, которого он недавно подсидел, вдруг сказал: "Да, отличный проект, только зачем такому хорошему проекту руководитель?"

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

Напоследок - очередная страшилка. Маринина коллега отвезла отца в госпиталь. Его оса укусила в горло. Горло распухло, он не мог глотать. Через некоторое время выясняется, что отца ничем не лечат. Потому что умный врач прописал парацетамол в таблетках.

- Медсестра, почему Вы ничего не делаете?
- А он не пьет.
- Ну, Вы же понимаете, что он не может пить таблетки.
- Да, ну а шо? Доктор сказал "таблетки", значит, таблетки.

Как в том анекдоте: доктор сказал "в морг", значит, в морг. Дело было в Guy's - это престижный госпиталь в центре Лондона, где любят рожать новые русские жены.

Ratings by outbrain