Как правильно писать софт под Windows — пост негодования…

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

В первую очередь речь пойдет о «корпоративном сегменте»: различные программы электронного заказа и прочее подобное ПО, которое приходится внедрять в свои системы системным администраторам и часто плакать кровавыми слезами от наблюдения за одними и теми же ошибками разработчиков.

Я понимаю. что большинство подобных программ пишутся не высокими специалистами, а чаще даже системными администраторами у которых и без того времени ни на что не хватает, но как только программа выходит на более широкую аудиторию, пожалуйста, соизвольте соблюсти несколько ВАЖНЫХ правил хорошего тона и безопасности.

1. Установка приложения

1.1. Папка установки по-умолчанию

По какой-то непонятной мне причине, большинство программистов в своих исталляторах зашивают путь установки что-то вроде:

C:\ProgramName

Нам еще повезет, если инсталятор предложит его изменить, но поверьте, немногие позволяют это сделать.

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

%ProgramFiles%\ProgramName
%ProgramFiles(x86)%\ProgramName

Объясню почему это так важно: У многих администраторов настроены политики безопасности таким образом, что приложения могут запускаться ТОЛЬКО из %ProgramFiles% директории. В случае с установкой в корень диска C:\, мы чаще всего получим неработающий кирпич, который, даже не всегда, можно копированием перенести в %ProgramFiles% после установки- посыпаются ошибки.

Ну и конечно же, представьте сколько вас таких, желающих запускаться из C:\ProgramName. Представляете, какой это вносит хаос в файловую систему ПК пользователя, а так же в политики безопасности компании?

1.2. Название приложения и директории установки

Все по той же непонятной мне причине, многие программисты называют свои программы только им понятными символами, вроде: ELRG. Только подготовленный пользователь сможет угадать, что за этой аббревиатурой скрывается, ни что иное, как «Elektronniy Zakaz Roga Kopita». Да, на русском, в транскрипции. Я не против транскрипций, но сделайте понятные названия.

Если вы создали приложение и даже обозвали его как-то, то пожалуйста, используйте корректные наименования ваших продуктов. Очень часто встречаю дефолтные значения различных инсталяторов вроде «ProgramName v.0.0» (именно так, без прикола).

Не забудьте так же, и про директорию установки (её название должно соответствовать названию программы), а так же про наименование приложения в оснастке «Установка и удаление программ» (да, сюда тоже ваше приложение необходимо вносить, но об этом позже).

Для чего это все? Чтобы системный администратор просто взглянув на директорию/название ярлыка/название ПО в Установке и удалении мог сразу понять что это, зачем это, где это.

1.3. Дополнительное программное обеспечение

Если для работы вашего ПО, необходимо какое-либо еще программное обеспечение (читай библиотеки/либы/флеймворки), не забудьте указать это в инструкции к программе (она же у вас есть, правда?), а так же позвольте пользователю установить его сразу, вместе с вашей программой.

Как можно установить дополнительное ПО?

  1. Жестко зашить его в инсталлятор и проверять его наличие перед установкой и устанавливать, если отсутствует. Не забудьте его удалить за собой после удаления программы или после обновления, если дополнительное ПО уже не требуется в новой версии.
  2. Положить инсталятор «рядом» с основным инсталлятором вашего ПО, чтобы администратору не искать в интернете «нужную» версию вашего любимого флеймворка, чтобы ваша программа заработала.

В случае отсутствия какого-либо компонента, при запуске ПО, не забудьте четко вывести ошибку с описанием проблемы, например так:

Внимание! В вашей операционной системе отсутствует обязательный компонент для запуска программы ProgramName: «ComponentName». Пожалуйста, установите его и попробуйте снова.

Это всего несколько строк кода для вас и несколько часов разбора ошибки для системного администратора в случае, если ошибка будет выглядеть так: «Run error. Application close.»

1.4. MSI инсталятор

MSI — общепринятый стандарт формата установки программного обеспечения в Windows-сетях. Пожалуйста, по-возможности, используйте его, чтобы системный администратор, у которого нормально и корректно настроен домен Active Directory не задалбывался устанавливать ваше ПО на 10-50, а то и больше машин ВРУЧНУЮ или городя какие-либо костыли и огороды.

Если же, по каким-то причинам (например «MSI — это дорого и сложно») вы не можете запаковать ваше ПО в MSI, пожалуйста, используйте инсталляторы с возможностью «тихой» («silent») установки через ключи запуска. Это крайне облегчит жизнь системным администраторам в установке вашего софта.

1.5. Всегда вносите ваше приложение в «Установка и удаление программ»

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

Иногда же, попадаются экземпляры вполне современного ПО, запакованные какими-либо самописными инсталяторами или инсталяторами из далеких нулевых. Хотя даже и они чаще всего, позволяли вносить пару строк в реестр для простоты удаления и возможности автоматического детектирования установки программы скриптами.

2. Работа с файловой системой и правами доступа

2.1. Директория директории рознь

Про работу приложения из %ProgramFiles% я написал, а вот про то, что данные программы должны храниться в %AppData% или в %ProgramData% — нет. Устраняю.

В большинстве корпоративных сетей (безопасных) у пользователя нет доступа к записи и редактированию исполняемых файлов в %ProgramFiles% во избежание их подмены и запуска «зловреда».

Именно поэтому, НИКОГДА не используйте директорию установки для хранения временных файлов программы, а так же различных файлов внутренних баз данных. Используйте для этого специально предназначенные папки: %APPDATA%, %LOCALAPPDATA%, %ProgramData%.

2.2. Никогда не требуйте права на запись в %InstallDir%

Данное вытекает из предыдущего пункта, но выношу это требование в отдельный пункт, т.к. многий (поверьте, очень многий) софт просит права на запись в %InstallDir%. Зачем оно надо — никто не сообщает, чаще всего об этом можно только догадаться, т.к. обычно об этом пишут ошибкой, что-то вроде: «Не могу загрузить модуль modulename.dll», «Can not run application» или вообще топовая и любимая ошибка: «< … >». Да, именно пусто, т.е. без ошибки. Программа просто не запускается… Как вам товарищи?

3. Обновление программного обеспечения

Вот это чаще всего комбинирует в себе кучу ошибок из предыдущих пунктов, тут тебе:

  1. Попытки скачать исполняемый файл из интернета. Про фаерволы, прокси и антивирусы мы конечно же не в курсе. Так же, не в курсе, что многими корпоративными политиками такое поведение рассматривается как зловредное и блокируется.
  2. Попытки записать архив или исполняемый файл в %InstallDir%.
  3. Попытки записать архив или исполняемый файл в %AppData% или %TMP% (или в любую другую папку, доступную на запись пользователю. Во многих сетях запуск исполняемых файлов из данных директорий запрещен политиками безопасности.
  4. Попытки запустить инсталлятор из непредназначенной для этого директории.

Чаще всего, обновление предусмотрено только одним способом: из интерфейса программы.

Давайте расскажу, как это надо делать. Начнем с попыток сделать автоматическое обновление:

  1. Проверяйте, есть ли у пользователя права для установки приложений.
  2. Проинформируйте пользователя о необходимости обновления и предложите нажать заветную кнопку «Обновиться до последней версии», если же у пользователя нет прав (см. выше), то предложить сообщить администратору о необходимости скорейшего обновления программы.
  3. Загружайте из web исключительно архивы (zip) и исключительно через SSL соединение с подписанным сертификатом (не самоподписанным).
  4. Используйте путь для загрузки установочного файла: %TMP%\ProgramName
  5. Используйте вменяемые названия архивов.
  6. Проконтролируйте закрытие приложения перед обновлением, если это может повлиять на процесс обновления.
  7. Если после обновления, необходимо сделать что-либо еще, то сделайте это скриптами, а не большой-большой инструкцией с пошаговым описанием что надо делать.

Продолжим, если у пользователя нет прав на установку приложений (так будет чаще всего), предложите ссылку на загрузку актуальной версии и попросите пригласить системного администратора для её установки. В идеале — по ссылке должен загружаться архив с MSI инсталлятором внутри, который при загрузке его в ActiveDirectory, корректно выполнит обновление на всех настроенных компьютерах.

4. Тестирование

Завершу данную статью одной небольшой просьбой: Пожалуйста, тестируйте ваше ПО перед выпуском в различных тестовых средах.

Послесловие…

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.