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] j-sheridan.livejournal.com 2012-06-02 11:47 am (UTC)(link)
Ребе, я взял на себя смелость и перепостил это туда (http://www.rsdn.ru/forum/flame.comp/4762758.1.aspx)
Срач возможен знатный ))

[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] serbod.livejournal.com 2012-06-02 11:54 am (UTC)(link)
Да, я бывший слакварщик, а теперь убунтист. =)

В свое время собирал вот этими руками ядро, GCC и KDE. =) Не говоря уж о всяких апачах, самбах, pppd и прочей мелочи.

А сейчас пишу серверный софт для цифрового ТВ, который ХЗ на чем будет запускаться - в лучшем случае убунта, а может и centos или солярка какая-нибудь.

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

[personal profile] ex0_planet 2012-06-02 11:56 am (UTC)(link)
Дык, а это, свой репозиторий с нужными версиями не сделать?

[identity profile] j-sheridan.livejournal.com 2012-06-02 11:57 am (UTC)(link)
яростно плюсую over9k первый пункт!

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

[identity profile] vp.livejournal.com 2012-06-02 12:04 pm (UTC)(link)
вы туда еще дополнения запостите, которые другие ребе добавили :)

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

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

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

[identity profile] serbod.livejournal.com 2012-06-02 12:10 pm (UTC)(link)
Все не так просто. Не знаю, как это объяснить.

Вообщем, текущая модель - все нужные компоненты "встроены" в проект, лежат в одном git-репозитории, и собираются вместе с проектом. И это вполне работает. И это не главная проблема на сегодня.

По ходу деля я потихоньку добавляю совместимость с современными компонентами и выпиливаю лишнее. Но это между делом. Софт все-таки специфичный и не публичный.

[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

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

[identity profile] vp.livejournal.com 2012-06-02 12:30 pm (UTC)(link)
Эээ.. А как кастомный пакет может это дело обойти? :)

[identity profile] sergiej.livejournal.com 2012-06-02 12:35 pm (UTC)(link)
Хуже того, если идею можно довести до абсурда, она будет доведена до абсурда :)
В итоге как ни прыгай, любой кусок софта, если в нём хорошенько покопаться, имеет тонны абсурда.

[identity profile] serbod.livejournal.com 2012-06-02 12:43 pm (UTC)(link)
У нас модель может на ходу, в runtime меняться. А вам слабо?

[identity profile] denisioru.livejournal.com 2012-06-02 12:50 pm (UTC)(link)
Нет, не обойти. Просто либа которая сама делает tcp-пакеты в курсе, что на интерфейсе есть default gateway и срёт в него. Но когда default gateway находится НЕ в той же сети, а есть маршрут до него, прописанный статически - тут уже пизда, ад и израиль - библа не знает куда слать пакет. По крайней мере мне не удалось заставить это говно работать в такой конфигурации.

[identity profile] vp.livejournal.com 2012-06-02 12:54 pm (UTC)(link)
А, понял :)
Спасибо, ребе. Буду теперь знать, что вот я знаю человека, который такое сам ВИДЕЛ :)

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

[identity profile] livejournal.livejournal.com 2012-06-02 12:56 pm (UTC)(link)
User [livejournal.com profile] molnij referenced to your post from Анти-критерии для софта и апи (http://molnij.livejournal.com/315520.html) saying: [...] Оригинал взят у в Анти-критерии для софта и апи [...]

[identity profile] metaclass.livejournal.com 2012-06-02 01:10 pm (UTC)(link)
Вот "дефолтный гейтвей в другой сети" - это же какая-то дичайшая содомия, не?
В смысле, что для того чтобы пакету попасть в интернет, он сначала попадает на правило дефолтного гейтвея, а затем на правило "найти дефолтный гейтвей" - емнип, в линуксе я такого сделать не смог.

[identity profile] denisioru.livejournal.com 2012-06-02 01:19 pm (UTC)(link)
Поверьте, ребе, это делал не я.

[identity profile] justy-tylor.livejournal.com 2012-06-02 01:21 pm (UTC)(link)
- Наличие в одной директории исходников с одинаковыми именами, различающимися лишь по регистру
- Использование символов с кодами больше 127 в именах файлов внутри неюникодных контейнеров (.zip, ...)
- Библиотеки локального назначения, шарящие по глобальным ресурсам машины (дырявая libxml и иже с ней)

[identity profile] sergiej.livejournal.com 2012-06-02 01:32 pm (UTC)(link)
Само собой. Просто идеала не бывает.

[identity profile] nonameshadow.livejournal.com 2012-06-02 01:35 pm (UTC)(link)
Про UNC-пути люто плюсую, особливо, кода софтина многопользовальская!!!

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

Page 2 of 6