metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-06-02 12:03 pm

Анти-критерии для софта и апи

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

С точки зрения пользователя:
1) Отличие от общепринятых UI гайдлайнов. Например, розовый фон, красные кнопки, шрифт Comic Sans и выход из программы по кнопке F1.
2) Неадекватное поведение по отношению к другим программам и ОС. Например, встраивание хуков на системные действия или расширений в Explorer.
3) Издевательства над обычными средствами пользовательской интеграции - например, невозможность без вуду скопировать текст из программы в клипбоард, стандартным сочетанием кнопок или меню.
4) Наличие тупиков в Workflow, т.е. возможность обычными действиями зайти в программе туда, откуда обычными действиями уже не выйдешь (только снимать программу из диспетчера задач, kill и прочая)
5) Отсутствие прогресс-баров и прочей индикации выполнения при длительных операциях, отсутствие возможности их корректно прервать.

С точки зрения админства-деплоймента:
1) Неумение работать в многопользовательской среде/на терминальном сервере.
2) Неумение переживать xcopy-деплоймент и запускаться на чистой машине. В крайнем случае - должно быть документировано, что из окружения требуется (.net, жаба, переменные окружения)
3) Хардкодед пути в бинарниках - убивать нещадно.
4) Размещение своих либ/данных в общих папках, типа system32. Под линуксом - не считается, там за это пакетный менеджер, в идеале, отвечает и там принято всему софту гадить единообразно.

С точки зрения программизма:
0) ad-hoc программирование, без проектирования. Практически сразу заметно по структуре api.
1) Хардкодед значения, не являющиеся математическими константами. Пытать на дыбе авторов. Сюда же - хардкодед пути типа C:/Program Files или C:/openssl/etc (портированный софт
2) Тот же контекст, но в пределах ВСЕЙ ОС, а не только запущенного бинарника (Dragon Naturally Speaking и его апи - сука, ненавижу).
3) Не реентерабельные функции.
4) Отсутствие в АПИ для работы с внешними ресурсами явных пар типа Open/Close, Enter/Exit.
5) Невидимый/недокументированный/мутабельный глобальный контекст. Сюда же - использование такого контекста для работы с внешними ресурсами. Т.е. Open не возвращает "хендл для работы с ресурсом", а просто открывает где-то внутри его и все последующие функции его используют, неявно. Например, коннект к БД - один на всю программу. Или транзакция - одна на весь коннект к БД.
6) Отсутствие для значений getter там где присутствует setter. Забивать гвозди в голову за такое. Т.е. мы можем установить некий параметр, но не можем узнать его значение.
7) Случайное поведение API, не объяснимое переданными параметрами и документированным окружением. Обычно - следствие пункта 5 и общего рукожопия.
8) Использование GUI в явно не-гуишных либах. Последний пример - библиотека для работы с одной железякой, кидающая диалоговое окно при ошибке драйвера. Если ее использовать в фоновом сервисе - капец от входа.
9) Отсутствие в API возможности показать прогресс и прервать длительно выполняющиеся операции.
10) Отсутствие обработки ошибок вообще. УБИВАТЬ! УБИВАТЬ! УБИВАТЬ!
11) Обработка ошибок нормального workflow исключениями. Т.е. "попытка подключится к отсутствующему серверу" кидает исключение, хотя должна быть операция TryConnect
Хуже этого - только парсинг строк в простые значения без функции TryParse
12) Отсутствие логгинга. Сажать на кол, конечно же.
13) Отсутствие исходников - когда вышеописанное вылезет в полной мере, а автор окажется живущим половой жизнью с ежихой в ашраме Гуру Бхактиведанты Свами Прабхувады Ребе Короля Мошиаха - вам придется чинить либу самому.
За вас никто ничего чинить не будет - инфа 100%, еще ни одной либы не видел, где автор бы починил самоочевидную ошибку ранее чем через месяц после баг-репорта.

Т.е., если вы проектируете API - лучше сразу думайте, как его можно однозначно завернуть в красивый класс на c# или сделать обертку для него на хаскеле функциональном языке - резко становится очевидно, что можно делать и чего нельзя.

PS от [livejournal.com profile] denisioru:
- невозможность запустить несколько инстансов софтины одновременно. Да, год 2012й. Лом в жопу.
- изобретение собственных IP-протоколов. Прикладной софт должен работать по UDP или TCP. В редких очевидных случаях - RTMP и иже с ними. Люто, бешено лоботомировать.
- использоать API ОС для ресолвинга имён. За формирование руками DNS запросов и отправку их в неизвестном направлении - насылать нещадный кровавый понос.
- использование нестандартных диалогов открытия и сохранения файлов. Как наказание - выдать блок питания к ноуту юзера, несовместимый с розетками в офисе и дома.
- глюки на мультимониторных конфигурациях. За появление главного окна софтины, напополам распиленное между десктопами - выкалывать глаза.
- создание и использование временных файлов ВНЕ системного каталога TEMP - отправлять сортировать мусорные баки.

PS от [livejournal.com profile] belnetmon:
- невозможность запустить софтину под уровнем пользователя , отличного от админа
- невозможность работы с UNC путями
- гадить во временную папку, которую пидор создал в корне системного диска (NVidia, Intel - привет)

[identity profile] d4s.livejournal.com 2012-06-02 02:06 pm (UTC)(link)
ребе, а вот я не помню спрашивал я у вас или нет: а читали ли вы "Искусство программирования в UNIX" Реймонда?
а то ваш пост мне почему-то коррелирует с этой книжкой ;-) Впрочем, как и часть комментов по существу.
netch: (Default)

[personal profile] netch 2012-06-02 02:27 pm (UTC)(link)
ad hoc вообще-то нормальная ситуация в принципиально новой тематике - там можно любых дров наломать. Но нужно потом не держаться за созданную структуру как за священный грааль, а уметь переделывать (если хочется красивых слов и плавных методов - то рефакторить).

[identity profile] j-sheridan.livejournal.com 2012-06-02 02:29 pm (UTC)(link)
Ребе, тамошние сами сусами. Они догадаются по ссылке сходить :)
netch: (Default)

[personal profile] netch 2012-06-02 02:29 pm (UTC)(link)
К последнему надо уточнить - совершенно нормально видеть временные файлы в ~$user/tmp, где $user - пользователь, от которого запускается софтина. Для некоторых целей общий tmp принципиально несекьюрен или может быть слишком мал.
Но, насколько я понимаю, правило было введено не против таких, а против тех, что временные файлы держат рядом с бинарями...

[identity profile] metaclass.livejournal.com 2012-06-02 02:42 pm (UTC)(link)
Еще не добрался, лежит тут в очереди на прочтение.

[identity profile] guamoka.livejournal.com 2012-06-02 02:43 pm (UTC)(link)
хотелось как лучше, а получилось ad-hoc

[identity profile] guamoka.livejournal.com 2012-06-02 02:45 pm (UTC)(link)
по поводу нескольких инстансов - в идеале, это должно конфигурироваться. Может быть нужен только один инстанс. а может быть - несколько. Дурные тетки иногда в припадке ненависти могут запустить 100500 копий приложения и радоваться.

Вот кстати да. Только что запускал прошивальщик, а он не запускается. Пока обнарушил, что он пониз всех окон ушел, успел три инстанса запустить.

[identity profile] d4s.livejournal.com 2012-06-02 02:55 pm (UTC)(link)
да просто по половине ваших анти-критериев (если не больше) подробно расписывается почему так не надо делать ;-) И еще есть.

PS а вообще книжка must have имхо. Будь моя воля -- я бы студов заставлял учить ее начиная с 1-го курса и со сдачей экзамена на каждом курсе ;-)

[identity profile] metaclass.livejournal.com 2012-06-02 03:09 pm (UTC)(link)
У меня тут как-то в комментах возмущались, что она устарела)

[identity profile] familom.livejournal.com 2012-06-02 03:25 pm (UTC)(link)
> Про ручные ДНС запросы - класс. Никогда такого не видел :)
Системный резолвер может быть синхронным/медленным. Критично для всяких штук типа кроулеров.
Edited 2012-06-02 15:28 (UTC)

[identity profile] d4s.livejournal.com 2012-06-02 03:31 pm (UTC)(link)
как-то не заметил.
у меня, правда, специфика соответствующая.
а что советовали взамен?

[identity profile] denisioru.livejournal.com 2012-06-02 03:38 pm (UTC)(link)
Так я про это же. Есть определяемые системой каталоги, где положено хранить временное говно. Во все остальные месте гадить нельзя.

[identity profile] j-sheridan.livejournal.com 2012-06-02 03:52 pm (UTC)(link)
Ребе, начинается (http://www.rsdn.ru/forum/flame.comp/4762902.1.aspx) :)

[identity profile] serbod.livejournal.com 2012-06-02 04:48 pm (UTC)(link)
Приведите пример. =)
netch: (Default)

[personal profile] netch 2012-06-02 05:19 pm (UTC)(link)
:)

[identity profile] ihar hrachyshka (from livejournal.com) 2012-06-02 05:23 pm (UTC)(link)
Да, там ни слова о разработке аппликашечек под дотнет.

[identity profile] serbod.livejournal.com 2012-06-02 06:28 pm (UTC)(link)
Коллега, вам ужасно не повезло. Вы бросили меня в терновый куст. Я 10 лет занимался ERP вообще и 1С в частности, поэтому ваша опердень меня совершенно не впечатляет.

Приведите конкретный пример работы "статическая модель генерирует приложеие и ядро его динамичской модели" на реальной задаче.

А я пока вкраце опишу наш проект. Это "лего-конструктор" для постройки систем захвата, кодирования, обработки и распространения видео в реальном времени. Примерно как DirectShow или GStreamer, только на порядок проще и эффективней. Работает как распределенная система на сотнях машин, управляется файлами- конфигами, настраивается в реальном времени. Мы ведь не можем в случае проблем во время трансляции футбольного матча повесить табличку "under construction".

[identity profile] mastroombroj.blogspot.com (from livejournal.com) 2012-06-02 08:11 pm (UTC)(link)
>> (NVidia, Intel - привет)
ATI, APC туда же

[identity profile] serbod.livejournal.com 2012-06-02 10:38 pm (UTC)(link)
Судить по нескольким записям в моем журнале было большой ошибкой. =) Я разработал с нуля как минимум 3 разные CRM на базе 1С и написал сотни (а может и тысячи - не считал) разных обработок, документов, отчетов для типовых конфигураций 1С 5.0, 6.0, 7.х и 8.х. А еще всякие внешние компоненты для разных железок. К сожалению (а может и к счастью) я инженер, а не предприниматель, поэтому все эти наработки не лежат в онлайновых магазинах софта.

Вы же свою CRM гордо называете ERP-системой и пытаетесь ее сравнивать с 1С 8.1. А резервировать товар ваша опердень умеет? А вести учет по договорам? Ребе [livejournal.com profile] erp_shik вас на тряпки порвет, почитайте его журнал и его статьи.

[identity profile] sbinq.livejournal.com 2012-06-03 12:10 am (UTC)(link)
> 11) Обработка ошибок нормального workflow исключениями. Т.е. "попытка подключится к отсутствующему серверу" кидает исключение, хотя должна быть операция TryConnect ...

А можете пояснить, чем вам не нравится просто метод Connect(..) бросающий Exception вида CannotConnectToMyCoolServer? Совсем не вижу что в этом плохого.

[identity profile] metaclass.livejournal.com 2012-06-03 05:13 am (UTC)(link)
Тем, что ошибка подключения к серверу - это в некоторых случаях нормальная ситуация.
И это исключение приходится перехватывать практически всегда и переводить на нормальный язык для пользователя.

[identity profile] nivanych.livejournal.com 2012-06-03 06:25 am (UTC)(link)
А какой объём попкорна массой в 10 килограмм? В вёдрах?

[identity profile] nivanych.livejournal.com 2012-06-03 06:28 am (UTC)(link)
У них такой статьи в уголовном кодексе и нет, поди!
Не то, что у нас!

[identity profile] serbod.livejournal.com 2012-06-03 06:49 am (UTC)(link)
Да не вопрос - serbod.com

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

Сдается мне, что у вас там банальный GUI к базе данных и вся логика на хранимых процедурах.

[identity profile] theiced.livejournal.com 2012-06-03 08:25 am (UTC)(link)
он просто дурак. не важно что там у него.

Page 3 of 6