7.01.2008

Описание входных данных. Часть первая. Описание входных данных для комментариев к ревизии.

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

В данном случае используется пять классов:
  • Компонент – класс символов, указывающий на обозначение компонента, к которому относится ревизия.
  • Версия – класс символов, определяющий номер версии.
  • Знак – класс, обозначающий признак изменения: нововведение, дополнение или исправление.
  • Тикет – класс, указывающий на номер тикета.
  • Описание – сам текст описания изменения.
Все эти классы сами по себе поддаются строгой структуризации и располагаются также строго структурированным образом:
:component:
(:version:)?
(:mark: (:ticket:)? :description:)+
Как видно, первую строку занимает название компонента. На следующей строке находится номер версии, причем она может быть указана, а может не быть указана. Третья и последующие строки – это описание изменений.

Теперь конкретизируем класс «знак». Знак обозначает следующее:
  • Нововведение. Обозначается так: “[*]”.
  • Дополнение. Обозначается так: “[+]”.
  • Исправление. Обозначается так: “[!]”.

В соответствии с этим конкретизируем класс «знак» в соответствии с языком регулярных выражений:
:component:
(:version:)?
(\[\*\+\!\] (:ticket:)? :description:)+
Результат получается довольно простой: сперва открывается квадратная скобка, затем идет один из трех знаков, а после – закрывающая квадратная скобка.

Теперь опишем регулярное выражение версии:
:component:
(\d+\.\d+\.\d+\.\d+)?\n
(\[\*\+\!\] (:ticket:)? :description:)+
Как видно, версия – это четыре последовательности цифр (точнее – четыре числа), каждое из которых отделяется от соседних символом точки. Крайние числа при этом от пустоты слева и от следующих далее классов справа точками, естественно, не отделяются. Это стандартный шаблон написания номера версии, например, как “1.9.8.50”.

Теперь необходимо подробно описать номер тикета – что это такое и как обозначается. Для этого опишем его языком регулярных выражений:
:component:
(\d+\.\d+\.\d+\.\d+)?\n
(\[\*\+\!\] (#\d+)? :description:)+
Видно, что номер тикета – это знак «номер» и последующие за ним цифры. Например, “#650”. Также видно, что тикет может быть указан, а может не быть указан.

Далее конкретизируем само описание изменения. Описание изменения – это довольно сложное выражение. Дело в том, что каждое новое изменение записывается с новой строки, а описание этого изменения может содержать какие угодно символы, но только не перевод строки. С одной стороны, можно пользоваться этим:
:component:
(\d+\.\d+\.\d+\.\d+)?\n
(\[\*\+\!\] (#\d+)? [^\n]*\n)+
С другой стороны, можно использовать «ленивые» квантификаторы:
([^\n]+)\n
(\d+\.\d+\.\d+\.\d+)?\n
(\[\*\+\!\] (#\d+)? .*?\n)+
Неизвестно, какой из двух способов лучше, скорее всего – второй.

Теперь остается конкретизировать имя компонента – самая легкая задача напоследок. Имя компонента стоит в первой строчке, и сразу после имени идет знак перевода строки. Сам компонент может называться какими угодно символами, но не переводом строки, поэтому опишем его так:
([^\n]+)\n
(\d+\.\d+\.\d+\.\d+)?\n
(\[\*\+\!\] (#\d+)? [^\n]*\n)+
В соответствии с предыдущим примером описания языком регулярных выражений сообщения к изменению, можно описать «ленивым» квантификатором и имя компонента:
.+?\n
(\d+\.\d+\.\d+\.\d+)?\n
(\[\*\+\!\] (#\d+)? .*?\n)+
Ну а теперь осталось расставить пробелы там, где они должны быть:
.*?\n
(\d+\.\d+\.\d+\.\d+)?\n
(\[\*\+\!\]\s(#\d+)?\s.*?\n)+
В одну строку выражение запишется следующим образом:
.*?\n(\d+\.\d+\.\d+\.\d+)?\n(\[\*\+\!\]\s(#\d+)?\s.*?\n)+

5.04.2008

Пакетик с дырочками

Разговор с нашим дистрибьютором в городе Сургуте.

ª Денис Турянский (Сургут) 4 мая 2008 г.
ª 12:03 мне кажется лучше ничего не писать, а продавать net iii и не предлагать вариантов
­
ª Ришат Мухаметшин 4 мая 2008 г.
ª 12:04 да
ª 12:04 после 15/05/2008 Такси-Мастер 2 будет поставляться с ключом Guardant NET III
­
ª Денис Турянский (Сургут) 4 мая 2008 г.
ª 12:04 а тм1?
­
ª Ришат Мухаметшин 4 мая 2008 г.
ª 12:05 а ТМ1 - уже месяц как
­
ª Денис Турянский (Сургут) 4 мая 2008 г.
ª 12:06 марии надо дать команду, чтобы непредлагала вариантов клиентам.
ª 12:06 есть нет ключ и стоит он столько, все
­
ª Ришат Мухаметшин 4 мая 2008 г.
ª 12:07 мы всегда оставляем выбор нашим клиентам
ª 12:08 мало ли, вдруг кто-то захочет больше проблем с ключом Stealth II
ª 12:08 может же такое случиться ни с того ни с сего
­
ª Денис Турянский (Сургут) 4 мая 2008 г.
ª 12:09 при моем "практическом" опыте, проще сказать, что должно быть так и других вариантов нет. клиент после этих слов с открытым ртом соглашается и радуется, что ему самому не приходится вникать в эти тонкости :-D


И действительно – нахрена клиенту знать, что есть еще вареная колбаса с жиром, если в салате в любом случае будет вкуснее вареная колбаса без жира?

4.18.2008

Продолжаем о карте клиента

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

Какая информация мне нужна? А нужна мне следующая информация:
  1. Номер клиента (его id).
  2. Наименование организации, на которую я прошиваю ключ. При этом имя контактного лица мне безразлично. Почтовый адрес – тоже.
  3. Версия программы, под которую я прошиваю ключ.
  4. Соответственно, тип ключа, который я прошиваю.
  5. Число рабочих мест и модули, которые я добавляю в прошивку.
  6. И, наконец, самое главное: правильно ли я делаю, что прошиваю ключ, или клиент не оплатил услуги технической поддержки, и я работаю бесплатно?
Теперь дополнительная информация.
  1. Перед тем, как начать прошивать ключ, нужно убедиться, не прошил ли его кто-нибудь вместо меня пять минут назад. Или я сам пять минут назад прошил. Это нужно знать.
  2. Прошиваю ли я первый ключ или делаю это уже вторично.
Как все это узнать? На данный момент очень просто: нужно открыть карту клиента. Посмотрим.



Чтобы выловить всю информацию о том, что же мне нужно прошивать, у меня уходит минут десять, не меньше. Что же здесь не так?
  1. Поле «Наименование организации» дублирует поле «Полное название организации» – на практике одно из них не требуется никогда. Именно поэтому менеджеры сходят с ума и пишут в оба поля что попало. В частности бывший когда-то «ИП Аржаник В. Н.» превратился в «Такси Лада / ИП Аржаник В. Н.» – а на кого мне ключ прошивать?
    • Человеческие ошибки – это первостепенный вид ошибок, который явно указывает на то, что интерфейс программы несовершенен. Это значит, что что-то нужно доработать. Я рекомендую убрать одно из полей и оставить только одно поле – «Организация».
  2. Поле «Город» во время прошивки ключа значения никакого не имеет, хотя и является одним из самых важных для менеджеров.
  3. То же самое касается поля «Разница во времени». Кстати говоря, разница во времени в виде сдвига от местного времени – это практика самых плохих веб-сайтов, но не CRM-систем. Я рекомендую сделать это поле привязанным к лондонскому нулевому меридиану.
  4. Поле «Адрес» оформлено неверно. Можно просматривать все в виде одной строки, но заполнять всегда нужно по полям: индекс, улица, дом, корпус и так далее.
  5. Поля «Телефонный код» (кстати, что за название такое непонятное?) и «Телефон» в сумме являются избыточными. Нужен только номер телефона. Код города, как видно, всеми игнорируется – в поле «Телефон» записан номер мобильного.
  6. Поле «Email, www» – это верх ошибочности. Еще раз повторюсь: смотрим одной строкой, вводим по полям. Соответственно, нужны два поля – поле для ввода почтового ящика и поле для ввода веб-сайта, если он есть. У каждого поля должен быть такой функционал, который позволяет ввести сделать еще одно поле с почтовым ящиком (связь 1:М, если уж на то пошло) или с адресом веб-сайта.
  7. Поле «Комментарий» – раздолье для менеджеров. Туда пишется все, что приходит в голову или не терпит временных затрат на то, чтобы сообразить, куда вписать ту или иную информацию. В комментарии попадают номера телефонов, информация о рабочих местах, номера ключей, имена клиентов и прочее и прочее. Я бы рекомендовал это поле убрать вообще. На его фундаменте, а точнее – просто на идее комментирования, основать механизм добавления комментариев – такой, чтобы можно было проследить, когда и кто добавил. Как в блоге. Или как в Trac.
  8. Поле «Группы» для меня до сих пор загадочно, поэтому я склонен предполагать, что оно вовсе не нужно в работе никогда.
Не очень удобная получается карточка клиента: я кое-как узнал, на какую организацию прошивать ключ, да куда отправлять число-ответ. Не густо, особенно учитывая то, что я всегда отправляю письмо на тот адрес, с которого пришло число-вопрос. Ради одной с трудом понятой строчки видеть столько полей – зачем?

Но это еще не все. Далее мне нужно узнать, сколько у клиента рабочих мест. Для этого я иду на вкладку «Продукты»:



Что я вижу? Я вижу, что клиент когда-то (“13.1”) купил Такси-Мастер, затем купил модуль, затем купил рабочее место (а сколько?) и еще рабочее место купил. Естественно, мне нужно сейчас посчитать, сколько рабочих мест (три?) у клиента, и какие модули он приобрел. Я сказал «посчитать» – я сам должен это считать? Почему бы информационной системе не посчитать? Кто из нас CRM-система?

Здесь снова проскакивает слабое место, подверженное человеческим ошибкам: чем больше строк в таблице – а строки, в частности, столбец «Наименование» – менеджеры заполняют от балды левой рукой: мы видим, что сперва клиент купил «Дополнительные лицензии ТМ», а затем – «Доп. раб. м.», хотя через пять минут я понимаю, что это одно и то же, – тем проще мне допустить ошибку. И я допускаю. И я допустил.

Что же я должен видеть на самом деле? Только то, сколько рабочих мест у клиента, и какие у него модули. Все.

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



И я молниеносно понимаю: у клиента нет технической поддержки, но есть «VIP-поддержка» (кто мне объяснит, что это такое?)! В принципе, мне не нужно знать, когда она заканчивается, но это и не написано, как и то, есть ли техподдержка. Есть VIP, а техническая-то где?! Получается, я зря ключ прошивал с кучей ошибок?

Тут же я понимаю, что программа все-таки «Такси-Мастер 1», а не «Такси-Мастер 2». К счастью, я уже начал прошивать для первой версии, и меня разорвало бы, узнай я, что у клиента вторая.

Эту вкладку убрать полностью. Без комментариев.

Остался нераскрытым вопрос: а какой ключ прошивать? Stealth II или, может быть, Fidus? А может быть NET III? Неясно. Опять приходится сочинять, потому что в карточке клиента этого не написано нигде вообще.

Наконец, мы задаемся вопросом: «Что же теперь делать?» Как Человек, Прошивающий Ключи, я могу порекомендовать по-человечески оформить карточку клиента для глаз техподдержки. Как это сделать? А вот так:



Все сразу становится понятно: на какое имя прошиваем, какой ключ, сколько мест, какие модули и кто уже прошивал. По порядку:
  1. В большом заголовке большими буквами написано самое главное – ответ на вопрос: «А тому ли прошиваю ключ?» А также ответы на ряд других вопросов («Кто он?» и «С каких пор?»).
  2. Далее идет поле «ID». Информация из этого поля используется для сборки дистрибутивов – они все делятся по клиентам, а именно – по их номеру. Удобно, практично, безопасно.
  3. «Название организации». Именно так, как должно быть прошито в ключе. Никак иначе.
  4. Поле «Программа» ясно показывает, для какой программы прошивается ключ.
  5. Поле «Число рабочих мест» – это как будто несбыточная мечта – это одна цифра и никаких строк в таблице. Просто цифра пять – просто пять рабочих мест. Информационная система сама посчитала, сколько рабочих мест зарегистрировано на клиента. Какая умная информационная система!
  6. Поле «Модули» – это верх программерской мысли. Это строки таблицы, выведенные в виде строки и разделенные запятыми. Это человеческий вид табличной информации – ее читает человек, а не компьютер.
  7. Поле «Техподдержка» цветом показывает, есть поддержка или нет, и словами – доколе есть или с каких пор нет. Идеальное решение для быстрой работы.
  8. Поле «Тип ключа» просто и быстро показывает тип ключа, а не менеджеровы сочинения типа “LPT”, “USB” или “NET” – ну что это за бред?
  9. В поле «ID ключа» записан, как ни странно, ID ключа – тот элемент, который проверяется каждый раз при дистанционной прошивке и отвечает на вопрос: «А правда ли, что мы прошиваем ключ нашему клиенту, а не чудику, которому наш клиент продал налево?»
  10. В поле «Прошит» находится результат мышления гения информационной системы. Там написано, когда и кто последний раз прошивал ключ. Самое смешное, что не нужно оставлять поле пустым, если никто этого не делал, – нужно написать «никогда». Тогда это будет человеческая информация, а не машинная.
  11. Ну и кнопка «Закрыть» – очень важная штука. Она должна быть достаточно большой, поскольку время доступа к элементу управления прямо пропорционально расстоянию до него и обратно пропорционально примерно квадратному корню его размера. Это значит, что чем меньше кнопка и чем дерьмовее она расположена, тем сложнее закрыть карточку человеку, держащему манипулятор мышь. Он, конечно, нажмет Escape, но после трижды ругнется про себя.
Как видно, сделать идеальную карточку клиента не так уж сложно. Нужно просто понять, для чего и для кого создаются CRM-системы. Вот и все.

Далее в программе – карточка задачи для технической поддержки.

4.17.2008

Модуль GPRS готов к выпуску в свет

Наш почетный клиент такси «Блюз» (город Ижевск) протестировал работу модуля GRPS. Результат работы – фрагмент журнала работы модуля – вы можете увидеть ниже:
Текст сообщения = 77:Мы едем или как?
Текст сообщения = 77:Нахуй ты уехал в страитель?
Текст сообщения = 77:Поехаели уже на выстовку?
Текст сообщения = 77:Я еще не освободился
Текст сообщения = 77:Я сейчас у телки класный музон скачал
Текст сообщения = 0:Я сейчас класный музон скачал
Текст сообщения = 77:Лучше бы ты ее голой сфоткал
Текст сообщения = 77:Она поросенок
Текст сообщения = 77:Повтори последнее смс
Текст сообщения = 77:Она поросенок
Как мы видим, модуль работает стабильно.

Привет, меня зовут таксилямбда

Мне не нравится, когда человек, с которым я знакомлюсь, называет себя асечным или форумным ником. Я считаю, что таким образом он выдает себя не за того, кем является, а подобных людей я не то, чтобы не люблю, – я просто их избегаю.

4.11.2008

Какой должна быть карта клиента

Первое предложение к нашей «не до конца продуманной» CRM: сделать карточку клиента такой, чтобы грузилось быстро, читалось удобно, понималось адекватно и смотрелось приятно. Как это можно осуществить? Да хоть вот так:

1311: Ришат Мухаметшин (клиент)
Ришат Мухаметшин (Ижевск) – клиент с 10.03.2007
ID: 1311
Программа: Такси-Мастер 3
Рабочих мест: 80
Модули:
Средства связи
СМС
Rander
Техподдержка: есть до 10.01.2009

Что здесь такого особенного? А то, что наконец-то программа (а у нас она вообще именуется информационной системой) учета работы с клиентами думает. То есть, не пользователь смотрит на то, как программа показала в полях типа TEdit данные из записи таблицы базы данных, а то, как он должен это видеть – человек читает, а не парсит.

Что еще такого случилось? Давайте по пунктам:
  • Полное имя клиента – оно преобразилось. Пускай оно хранится в базе в виде трех различных полей (фамилия, имя и отчество – CHAR(55), CHAR(30) и CHAR(50) соответственно, что уж тут), но инфосистема показывает все в виде, понятном человеку. И человек – будь то sales manager, программист или даже блондинка, пишущая документацию, – он поймет быстро.
  • Подпись «клиент с такого-то времени» – что здесь? Во-первых, программа сама поняла: да, это клиент (потому что у него есть ID, например), и сказала об этом нам в понятном, опять же, человеческом виде. Во-вторых, дата, с которой клиент является клиентом. Возможно, она и не нужна, но иногда по ней можно сориентироваться, как много проблем предвидится, если клиент позвонил.
  • ID клиента. Здесь все понятно – это место, на котором можно разгуляться вдоволь – написать “SELECT id FROM clients WHERE id='1311'”, например, или вообще «джоины» прикрутить. Смысл остается всегда одинаковым: нам для чего-то нужно знать ID клиента (черт возми, а не проще ли его выбросить в заголовок окна?).
  • Программа. Здесь не нужен никакой выпадающий список, не нужно поле ввода – здесь обычный «кэпшон», как и везде. Мы ничего не редактируем – мы смотрим. И видим, что у клиента есть какая-то программа, соответственно которой мы придумываем, какой ключ шить, какой ответ на вопрос давать или какое обновление собирать и слать. Очень важная информация, кстати говоря.
  • Рабочих мест – сколько? Правильно: 2 (10.03.2007) + 4 (15.08.2007) - 1 (1.01.2008) + 6 (1.04.2008). Именно так мы считаем сейчас, потому что мы же круче, чем система. Но было бы очень приятно, если бы каждый из восьмидесяти раз в день, когда нам приходится открывать карту клиента, система сама подсчитывала число рабочих мест на основании каких-то там своих данных из базы, потому что (повторюсь) тупо выворачивать базу в виде настольного приложения – сурово.
  • Модули. Это то, о чем мечтаем мы – техническая поддержка. Мы должны точно знать, какая хрень еще установлена у клиента. А что у него установлено? Правильно: Средства связи (10.02.2008), СМС (15.03.2008), Rander (05.04.2008). И все это приходится искать в так называемом «списке задач», который, как оказалось, отражает не только задачи, но и состояние «бизнес-корзины» клиента.
  • Техподдержка. Очень важное информационно поле (напомню – обычный кэпшон с зеленым или красным текстом), которое в конце-то концов отвечает на вопрос: «Вот и с этим всем что же нам делать?» При этом реакция человека (не базы данных!) на цвет может быть быстрее, чем на дату. Другими словами, дата окончания подписки на поддержку – это второстепенный вопрос, который следует за вопросом: «А есть ли она?» Тут же вспоминаем светофорчик, по которому переходим дорогу и переезжаем перекрестки, и понимаем: красный свет – поддержки нет, а горит зеленый – клиент довольный.
Остался вопрос: куда подевались всякие телефоны, почтовые адреса и города клиента? А их можно ловко показать, а также преобразовать все «кэпшоны» в «эдиты» и «дропдауны» (соответственно типу данных) при нажатии какой-нибудь кнопки «Редактировать», которая находится внизу левее кнопки «Закрыть», которая, в свою очередь, по правилам call-to-action, находится справа. Нажимаем «Редактировать» – и кнопка «Закрыть» (со стороны пользователя – вообще только подпись на кнопке) заменяется на «Отменить», а кнопка «Редактировать» – на «Сохранить», соответственно.

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