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] denisioru.livejournal.com 2012-06-02 11:26 am (UTC)(link)
- невозможность запустить несколько инстансов софтины одновременно. Да, год 2012й. Лом в жопу.
- изобретение собственных IP-протоколов. Прикладной софт должен работать по UDP или TCP. В редких очевидных случаях - RTMP и иже с ними. Люто, бешено лоботомировать.
- использоать API ОС для ресолвинга имён. За формирование руками DNS запросов и отправку их в неизвестном направлении - насылать нещадный кровавый понос.
- использование нестандартных диалогов открытия и сохранения файлов. Как наказание - выдать блок питания к ноуту юзера, несовместимый с розетками в офисе и дома.
- глюки на мультимониторных конфигурациях. За появление главного окна софтины, напополам распиленное между десктопами - выкалывать глаза.
- создание и использование временных файлов ВНЕ системного каталога TEMP - отправлять сортировать мусорные баки.

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

Про ручные ДНС запросы - класс. Никогда такого не видел :)
А зачем вообще резолвить что-то руками? Это ж системное дело, адрес этот хост или имя.. На прикладном уровне вообще об этом не надо думать.

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

А вот по последнему пункту - уточните. "Системный каталог" у вас - это что?

[identity profile] tzirechnoy.livejournal.com 2012-06-02 11:49 am (UTC)(link)
>А зачем вообще резолвить что-то руками?

Стандартный резолвер -- это такое убожэство, что надо что-то с ним делать. Типичный вариант, конечно [v]fork и использовать 50 процэссов/потоков, но это тожэ полумера.

[identity profile] denisioru.livejournal.com 2012-06-02 11:51 am (UTC)(link)
по поводу инстансов - ок, компромисс. Должна быть возможность ограничить одним инстансом, да.

Я и руками собираемые TCP-пакеты видел. Когда шлюз по умолчанию переехал в другую подсеть и стал доступен по статическому маршруту - тут то всё и погнулось. Ибо эта хуета не знала про статические маршруты. Клиент-банки, да.

есть API для получения временного каталога. Есть переменные среды. Тоесть способов выяснить, где именно находится место "временно насрать" - их больше одного и никакого труда не составляет.
Edited 2012-06-02 11:52 (UTC)

[identity profile] vp.livejournal.com 2012-06-02 12:03 pm (UTC)(link)
Ребе, руками собираемые пакеты я могу объяснить только в одном сулчае. Это сделано на 8051 процессоре, который ничего не знает про езернет, и он тупо бомбит собранные по шаблону битики в этот провод, ничего о нем не понимая. Остальное - да. Преступление.

[identity profile] denisioru.livejournal.com 2012-06-02 12:21 pm (UTC)(link)
Клиент-банк же. Наверно студентам-практикантам секурность в голову ударила.

[identity profile] metaclass.livejournal.com 2012-06-02 12:07 pm (UTC)(link)
>Когда шлюз по умолчанию переехать в другую подсеть и стал доступен по статическому маршруту - тут то всё и погнулось.

Так, а строка статического маршрута как выглядит, я что-то от входа не могу понять, как это?

[identity profile] denisioru.livejournal.com 2012-06-02 12:19 pm (UTC)(link)
Капитан очевидность докладывает (route add /?):
Examples:

    > route PRINT
    > route PRINT -4
    > route PRINT -6
    > route PRINT 157*          .... Only prints those matching 157*

    > route ADD 157.0.0.0 MASK 255.0.0.0  157.55.80.1 METRIC 3 IF 2
             destination^      ^mask      ^gateway     metric^    ^
                                                         Interface^
      If IF is not given, it tries to find the best interface for a given
      gateway.
    > route ADD 3ffe::/32 3ffe::1

    > route CHANGE 157.0.0.0 MASK 255.0.0.0 157.55.80.5 METRIC 2 IF 2

      CHANGE is used to modify gateway and/or metric only.

    > route DELETE 157.0.0.0
    > route DELETE 3ffe::/32

(no subject)

[identity profile] vp.livejournal.com - 2012-06-02 12:30 (UTC) - Expand

(no subject)

[identity profile] denisioru.livejournal.com - 2012-06-02 12:50 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-06-02 12:54 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-06-02 13:10 (UTC) - Expand

(no subject)

[identity profile] denisioru.livejournal.com - 2012-06-02 13:19 (UTC) - Expand

[identity profile] denisioru.livejournal.com 2012-06-02 11:54 am (UTC)(link)
И да, мне как end userу насрать про то, каким шайтаном написан софт. Когда при открытии/сохранении файла вижу окно в стиле "try to do something similar on windows 95" - у меня глаза вытекают.

[identity profile] vp.livejournal.com 2012-06-02 12:05 pm (UTC)(link)
люто плюсую. Я считаю, что не дело это прикладной софтины знать как в этой ОС задуман диалог открытия файла. В этом плане, конечно, акронисовский диалог - это капец из капца :) Страшнее я не видел.

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

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

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

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

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

[identity profile] fraks-nsk.livejournal.com 2012-06-04 02:49 am (UTC)(link)
>> - создание и использование временных файлов ВНЕ системного каталога TEMP - отправлять сортировать мусорные баки.

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

[identity profile] denisioru.livejournal.com 2012-06-04 03:35 am (UTC)(link)
Какой оптимизации?? Вы небось ещё и бакапите временные файлы чтобы оптимизировать работу интернета?

[identity profile] metaclass.livejournal.com 2012-06-04 03:55 am (UTC)(link)
Временные файлы используются для сортировок и создания индексов, их имеет смысл держать отдельно от системы и отдельно от БД - чтобы быстрее работало.
Впрочем, для СУБД, которая не умеет tablespace все это как мертвому припарка.

[identity profile] fraks-nsk.livejournal.com 2012-06-04 04:15 am (UTC)(link)
Тем не менее это лучше чем ничего.

[identity profile] denisioru.livejournal.com 2012-06-04 04:47 am (UTC)(link)
Для БД придуманы свои методы - вроде базы типа tempdb в mssql, которые можно переложить куда либо. Речь про прикладной софт.

[identity profile] fraks-nsk.livejournal.com 2012-06-04 04:00 am (UTC)(link)
Оптимизация например такая - если винтов на сервере более одного то надо как минимум разнести БД и TEMP Firebird на разные диски. В каких-то случаях может быть актуальным сделать TEMP Firebird на электронном диске или еще что-то...
Edited 2012-06-04 04:02 (UTC)

[identity profile] metaclass.livejournal.com 2012-06-04 04:07 am (UTC)(link)
Насчет электронного диска - дичайшая содомия. Проще и дешевле же памяти докинуть.

(no subject)

[identity profile] fraks-nsk.livejournal.com - 2012-06-04 04:14 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-06-04 04:21 (UTC) - Expand

[identity profile] denisioru.livejournal.com 2012-06-04 04:45 am (UTC)(link)
В пост врывается firebird? Причем здесь он?

(no subject)

[identity profile] metaclass.livejournal.com - 2012-06-04 04:52 (UTC) - Expand

(no subject)

[identity profile] denisioru.livejournal.com - 2012-06-04 04:55 (UTC) - Expand

(no subject)

[identity profile] fraks-nsk.livejournal.com - 2012-06-04 06:34 (UTC) - Expand

(no subject)

[identity profile] metaclass.livejournal.com - 2012-06-04 06:54 (UTC) - Expand

(no subject)

[identity profile] berezovsky.livejournal.com - 2012-06-04 07:52 (UTC) - Expand

(no subject)

[identity profile] fraks-nsk.livejournal.com - 2012-06-04 06:37 (UTC) - Expand

[identity profile] vp.livejournal.com 2012-06-04 07:45 am (UTC)(link)
Ну дык мы вынесли системный темп на другой раздел? В чем проблема чтобы и ФБ его использовал?

(no subject)

[identity profile] fraks-nsk.livejournal.com - 2012-06-04 08:32 (UTC) - Expand

[identity profile] vp.livejournal.com 2012-06-04 07:44 am (UTC)(link)
+1
Обычно на сервере если делается раздел под временные файлы, дык все равно, что туда временное будет писаться, ФБ или системные временные файлы. Искусственно тут вводить еще какую-то настройку не вижу смысла.

[identity profile] mfi.livejournal.com 2012-06-13 04:20 pm (UTC)(link)
Насчет блока питания - нельзя так жестоко. Полсотни лет в девятом круге(обман доверия) - вполне достаточно.