Системное администрирование

индекс
199,95

Теория правильных скриптов

Чем различается скрипт и программа? Вовсе не используемым языком или наличием интерфейса.

Главная разница — в наличии у программы обширнейшей оболочки, не связанной «содержимым» программы. В зависимости от платформы, это могут быть страницы руководства, поддержка нескольких языков, наличие функционала по установке/удалению, исполнение соглашений об интерфейсе (командной строки, или иных средств взаимодействия), интерфейсы в общем реестре и т.д… Программа должна уметь работать в любой документированной среде, предусматривать различные ситуации (круче всего с этим у программ под unix, которые используют ./configure для определения, собственно, где они, что можно, а что нельзя на этой (очередной) платформе).

Скрипт же, в строго обратном смысле: он предназначен для решения конкретной проблемы «здесь и сейчас». Никто не ожидает от скрипта, который отсылает статистику, способности делать это одновременно на solaris'е, freeBSD и windows embedded standard с cygwin'ом на борту.

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

Разница между скриптом и программой — административная.


Практически любая программа имеет в себе ТРИ важные составляющие:
  • Нетривиальный алгоритм.
  • Техподдержку, наработанные лучшие практики использования, типовые схемы внедрения и готовые конфигурации.
  • Правильную интеграцию в рабочую среду в любой разрешённой (документированной) конфигурации.


Давайте подробнее об этих составляющих…

1) Алгоритм. У любой программы есть во-первых некая идея (что, собственно, делает программа), во-вторых — обвязка. Чтение конфигов, вывод в сислог, оповещение по почте и ещё тысяча не связанных с основной задачей операций. Но программу используют не ради чтения конфигов и записи в лог, а ради того, что она ДЕЛАЕТ. Соответственно, обычно идея заключается в выполнении каких-то действий по какому-то алгоритму. Нетривиальная идея. В фактическом коде это может быть меньше, чем чтение xml-конфига, но при этом именно рабочий алгоритм — суть программы. Он может быть или «обрабатывающим данные» (вроде SQL'я), или математическим (вроде md5sum), или работающим с конкретными особенностями конкретной железки (формата файла) — но он всегда требует высокой квалификации в предметной области для адекватного понимания принципов работы. Понятно, что код OpenSSL может читать любой программист. Понятно, что алгоритм работы OpenSSL может понять только хороший математик.

Но мы пишем не о программах — о скриптах. Так вот, скрипт не должен реализовывать нетривиальные алгоритмы. Если вы у себя в скрипте пишите аналог base64 — это плохой скрипт. Если вы у себя в скрипте пишите отправку сообщений по smtp методом «открыли сокет, записали» — это омерзительный скрипт. Если вы у себя в скрипте ловите данные с ком-порта и пишите туда ответ (для управления УПСом) — это писец какой-то, а не скрипт.

Скрипт НЕ ДОЛЖЕН содержать в себе алгоритма в терминах «предметной области». У скрипта нет предметной области, скрипт — обвязка вокруг программ, которые уже работают с предметными областями. В некоторых случаях скриптовый язык может предоставлять весь инструментарий:
if  md5.md5sum (open.($check).read() ) != url.openurl($control).read():
     smtp.sendmail($from, $to, "data check failed", "md5sum of $check does not match control sum form $contol.").

Это скрипт. Просто скрипт. Не смотря на то, что он реализует офигенный объём работы. А вот если у вас md5 — класс, объявленный в скрипте 5 строчками выше с имплементацией md5 (или url, или open, или smtp, etc) — это уже потуга на программу. Но программа — это много сложнее, чем алгоритм, её составляющий — и подобное не должно реализовываться в скриптах. НИКОГДА.

2) Любая программа должна обладать известным поведением. Математики предлагают описывать поведение программы в всеобъемлющих терминах; практика же говорит, что обычно кроме алгоритма программа ещё содержит баги и фичи, которые влияют на её поведение, к которым надо адаптироваться. Адаптироваться к ним куда проще, когда есть некоторая практика использования программы.

«KDC has been valid once but invalid now» — если это сообщение от скрипта — всё, хоронить. Прямо тут, на месте. У программы это вполне разумное сообщение по которому можно гуглить и выяснять, что именно не так. Это прямое следствие наличия в программе некой предметной логики, специфичной и требующей от пользователей не изучать её насквозь, а принять бехивиористически. То бишь как набор утверждений о поведении программы. «Данная версия программы не понимает файлы больше 2Гб в размере». Это не укладывается в алгоритм (а если уложится — будет занимать этак с том дискретной математики) — но это нужно знать в практическом смысле. «Данная программа плохо себя ведёт в условиях симметричной нагрузки на аплоад/даунлоад, лучше запустить две копии, каждая из которых будет работать в свою сторону симметрично» — понимание _ПОЧЕМУ_ потребует титанических усилий, проще принять это как данность. Чем сложнее алгоритм, тем больше жизни нужно потратить на его исследование, адаптацию и глубокое изучение. На всё жизни не хватит, значит, проще принять как данное и сконцентрироваться на важном.

Скрипт же, обратно, должен быть кристально понятен каждому, кто его посмотрит (с поправками на знание скриптового языка). Никаких (if every in self.__datarange__ is not in any map(__systable__.lang, __localtable__.map, lambda (a,b):[a in b or b in a for every __sys__.pair(a,b)])) raise "Missed i18n constitution".

3) Скрипт решает задачу _ЗДЕСЬ_И_СЕЙЧАС_. Программа решает задачу _ТАМ_И_ВСЕГДА_ (с поправкой на опыт эксплуатации из п.2). Когда вы пишите скрипт, вы делаете так, чтобы оно работало в вашей системе. Оно не годится для свободного использования в других системах (хотя может быть ЛЕГКО (см п.1) адаптировано). Программа должна быть адаптируема к куче вариантов применения, реализация этой адаптации в скрипте приводит к потере его простоты и превращению его, собственно, в программу. Кроме того (увы и ах), но знание КАК ПРАВИЛЬНО писать программу не эквивалентно написанию правильного алгоритма. Вы можете написать потрясающую библиотеку, но если вы не сможете запустить её на машине, у которой понедельник первый день недели (или второй — кому как повезёт), то грош цена вашей библиотеке. Необходимость думать об этом — это уже написание программ — скрипту такое допустимо (хотя и не желательно).

Ну и ещё важное отличие между скриптами и программами. Программы (в форме библиотек) могут «наслаиваться» друг на друга. Этой программе нужен libYYY, которая использует libZZZ и libAAA, при этом libAAA использует libZZZ и libc. Это нормально.

Скрипты же НЕ ДОЛЖНЫ ЗАВИСЕТЬ ДРУГ ОТ ДРУГА. Ситуация, когда скрипт зависит от сервисов другого скрипта, который зависит от третьего — ненормальная.

Заметим, речь идёт о зависимости. Вполне можно представить себе скрипт, который вызывает другие скрипты и выдаёт обобщённый результат по ним, но это уже грань. Чуть сложнее (например, «запустить скрипт А если скрипт Б не отработал») — уже за гранью фола. Нехорошо. А если скрипт А не отработал но не сообщил об этом? Или чуть-чуть отработал, но потом отвалился так, что скрипту Б не получится доделать (а мы, как авторы скрипта А, и подумать не могли о подобном)?

Что же вообще должен делать хороший скрипт? Сращивать несколько программ в конкретную систему. Можете считать программы за детали конструктора. А сам конструктор — за скрипт. Вам НЕ СЛЕДУЕТ нарезать винтовую нарезку на шпинделе — возьмите шпиндель с нарезкой. Вам не следует делать эллиптический валик из этой резинки — оно всё равно будет плохо работать. Если у вас в конструкторе нет квадратной пластинки с дырками по краям, то это проблема нехватки деталек. Вы можете попытаться сделать квадратную пластину из пары прямоугольных, но не следует делать её и сотни длинных полосок.

Бывает так, что скрипты перерождаются в программы. Внезапно в скрипте появляется некая логика (алгоритм), которая становится нетривиальна (и полезна). В этот момент нужно поймать это — и не полениться потратить в три раза больше времени, но сделать её программой. Обеспечить её «мясом», которое отличает программу от скрипта. Добавить сотню проверок условий, заменить все константы на конфигурируемые переменные, приготовить её для работы в «непривычных» условиях. Желательно сделать её публичной (тогда может наработаться практика использования).

Обычный пайп представляет из себя практически идеальный инструмент для конструирования простых программ:
lssomething | grep "bla-bla"|sendmail root@host.ru -s "bla-bal for something".


Грань, в которой заканчивается скрипт найти сложно. Скажем так, цикл — ещё терпимо. Проверка условия — нормально. Но вот проверка условия в цикле (больше, чем выход из цикла) — это уже плохо. Если же у вас цикл, в котором по проверке условия запускается цикл — это 100% программа. Если у неё нет всего того, что должно быть у программы, значит это просто очень плохая программа. Но никак не скрипт.

Когда я смотрю на сборники «полезных скриптов» (вот тут (forum.sysadmins.ru), например), я понимаю, что это программы. Ужасные программы без сопроводительной документации, процедуры установки, без проверки условий… Так нельзя.

Применение подобных скриптов — признак крайней куцести рабочей среды. Я одно время пробовал с ними ужиться, но пришёл к выводу, что это ошибка. Куда правильнее иметь набор тулкитов (т.е. полноценных программ, реализующих конкретные вещи полностью и хорошо), чем набор аналогичных скриптов (повторю ещё раз — программа может быть написана на том же скриптовом языке — разница между скриптом и программой в непрограммерской обвязке: документации и приспособленности к жизни в широком спектре систем).

Применение копипастнутых скриптов — подобие ранне-досового копирования на дискетках полезных программулин. Работает — радуемся, не работает — пофигу, сломало всё — злимся. В условиях выбора между копипастнутым скриптом и программой (и минимальной обвязкой) следует выбирать программы. Даже если внедрение программы потребует дополнительных усилий по изучению, налаживанию и т.д. Наладив программу, вы получите программу. Отладив скрипт вы получите лишь костыль, прочность и долговечностью которого не знает даже автор.

Каждый раз, когда возникает подобная ситуация: делать скрипт или искать программу, следует начать с поиска программы. Потому что программирование увлекает (да нафига нам nagios, мы и сами напишем пачку скриптов мониторинга), а изучение чужого — утомляет (ну хрена она работает не так как я ожидаю?). Но последствия «недопрограммирования» — отсутствие документации к тому «дымоходу», который вы сделали. А последствие внедрённого решения — система, которая умеет работать сама по себе.
+30
2 мая 2010, 00:10
26

комментарии (72)

–2
adminimus #
Главная разница — в наличии у программы обширнейшей оболочки, не связанной «содержимым» программы.
странная у вас классификация. Если я вместо shell-скрипта напишу небольшую программку на сях без всякой документации, поддержки, инсталлятора и прочего барахла, то вы назовете ее скриптом?
А то, что вы описали (программа + «обвязка») я бы скорее назвал приложением.
P.S. весь пост еще не осилил, много букв
+3
amarao #
Нет, я же про это написал — я это назову «плохой программой». Скрипт допускает отсутствие документации в силу своей самоочевидности (и самодокументируемости исходным текстом). Если текст вашей программы не может быть тривиально понятен при открытии файла на просмотр, это уже программа. И если она не имеет должного оформления, то это плохая программа.
+2
lless #
плохая программа не равно ненужная программа. она тоже имеет право на жизнь.
+7
amarao #
Разумеется. Именно потому половина России пользуется программой PERSW (можете уточнить у ближайшего бухгалтера, что это за программа). Кто-нибудь может сказать, что эта программа ненужная? Нет. Кто может сказать, что она плохая? Каждый, кто с ней сталкивался.
–3
tsippa #
Ваша классификация хромает, мягко говоря. Я знаю много скриптов которые по сложности и уровню документации конкурируют с любой программой (возьмите любую cms на php)
Единственная разница между программой и скриптом в общепринятых значениях — используемый язык. Если язык компилируемый (с++, pascal), то это программа, если язык интерпретируемый (php,perl) — это скрипт.
+2
amarao #
Вы пропустили мимо всё, что я написал. «Чем различается скрипт и программа? Вовсе не используемым языком» — в самом начале.

Разумеется, программа может быть написана на PHP, а скрипт — на C (более того, у меня на старой работе одна из специфичных задач решалась скриптом на си, потому что из си это было удобнее сделать, чем из шелла).

Программа от скрипта отличается:
* Сложным алгоритмом (обширной логикой)
* Сопроводительной документаций
* Широкой областью применимости (относительной универсальностью)
* Подчинению полиси для дистрибьютива/ОС
* Тщательной проверки параметров и предсказуемым поведением в нестандартных ситуациях

Если же код имеет сложный алгоритм, но не имеет сопроводительной документации (и далее по списку) — то это либо плохая программа, либо плохой скрипт.

Скрипт — «код», настолько компактный и логичный, что является самодокументированным.

Насчёт скриптовых языков… С учётом, что процентов 50% минимального дистрибьютива дебиана это программы для интерпретаторов, говорить о том, что «интерпретируемые программы не программы» было бы глупо.
–2
tsippa #
Притянуто за уши. Есть следующая общепринятая терминология, все что интерпретируемое — скрипты, все что скомпилировано — программы.
При чем здесь их сложность и функционал?
Вы зачем то пытаетесь навязать нам самопальную классификацию и добавить хаоса. Не надо!
ИМХО
+6
amarao #
Во-первых, грубое деление на «скомпилировано/интерпретируемо» несколько устарело. например, байт-код — это интерпретируемое или компилируемое? А JIT-компиляция? А байткод питона?

Во-вторых (и это важно) я не собираюсь вводить «самопальную классификацию», я говорю про реальное состояние дел в хозяйстве системного администратора. Называть скриптом, например, deluge у меня язык не повернётся (хоть он на питоне и написан). Так же у меня не повернётся язык называть приложением (программой) цикл на Си, который выводит список файлов с заданным атрибутом в файловой системе.

Не обижайтесь, но вы почему-то решили, что я собираюсь рассказывать людям что есть интерпретируемые языки программирования, а потом высказываете претензию, что этот рассказ неправильный.
–4
tsippa #
Да какие обиды, бросьте! В споре рождается истина!
Дело в том, что вы подменяете общепринятое понятие «скрипт — интерпретируемая программа» на «скрипт — программа на колене». Найдите другие слова и не вносите смуту.
+1
amarao #
Считайте, что слово-омоним. Как, например, приложение. Ethernet — это «приложение» (так же как телефония) с точки зрения СКС. Однако, в компьютерах приложением называют что-то совсем другое, чем электрический стандарт кодирования битов.

Примерно так же и тут. Да, у программистов своё представление о том, что есть скриптовый язык, а что нет. У администраторов — своё. Скриптами называют не программу на скриптовом языке программирования, а костыль для реализиации локальной задачи. Вряд ли кто-то в здравом создании назовёт конфигурацию 1ц бухгалтерии «скриптом бухгалтерского учёта».

+4
tsippa #
Предлагаю создать опрос!
+1
lless #
>Если же у вас цикл, в котором по проверке условия запускается цикл
о боже, я не написал не одного скрипта…
>следует начать с поиска программы
а через 2 часа поисков и находки, понимаешь что это не то что тебе надо, нет логов в нужной форме, нельзя скормить нужные параметры и все равно пишешь «скрипт»(программу)
> "_ЗДЕСЬ_И_СЕЙЧАС_", "_ТАМ_И_ВСЕГДА_"
как я могу использовать программу, если я не уверен что мне может понадобиться от неё завтра? поюзать её пару дней, а потом все же написать «скрипт»(программу)?
+1
amarao #
Поиск нужного приложения для реализации задачи может занимать куда больше, чем пара часов. Возможно, на это потребуется месяц, а то и больше. Я говорю про продакт системы, в пределах «мне нужно читать RSS и писать это в мой mp3-плеер» можно делать что хочешь. Если же система вам не принадлежит (aka продакт-система организации), то следует учитывать наличие тех, кто придёт вам на смену.

Задача «не может принять в нужной форме» как раз решается скриптом в одну строчку (с использованием awk). И это вполне достойная задача скрипта — подготовить инфраструктуру для запуска приложения или связать два приложения между друг другом.

Я не знаю, как вы можете использовать программы. Я обычно примерно себе представляю ТЗ для неё и сроки (область) применения.
0
lless #
>Отладив скрипт вы получите лишь костыль, прочность и долговечностью которого не знает даже автор.
на моей практике рабочих скриптов намного больше чем программ. некоторые работают годами и все хорошо.
по поводу инструкций — если ты пишешь для "_ЗДЕСЬ_И_СЕЙЧАС_" они как бы и не нужны. Тебе нужно в кротчайшие сроки достигнуть цели и время на поиски программ, их изучения, подгонку совершенно нет. К тому же нужный софт может быть платным — а скрипт продукт твоей работы и за него платить тебя никто не заставит.
+этика комментирования строчек кода, чтобы те кто тебя заменят смогли понять что к чему.
p.s. может мы с вами понимаем разные вещи под словом «скрипт»?
+2
amarao #
… скрипты работают годами где? В том месте, где их написали и оставили? А если сеть перевести на DHCP? А если поменять платформу с *x на *y?

Ситуаций, когда нужный софт был бы платным, его функционал можно было в разумное время реализовать скриптом, и у него бы не было бесплатных аналогов — я в своей жизни не видел.
0
muhas #
… программы работают годами где? В том месте, где их написали и оставили? А если перевести на DHCP? А если поменять платформу с *x на *y?

извините, не удержался…
initscripts подчиняется списку
* Сложным алгоритмом (обширной логикой)
* Сопроводительной документаций
* Широкой областью применимости (относительной универсальностью)
* Подчинению полиси для дистрибьютива/ОС
* Тщательной проверки параметров и предсказуемым поведением в нестандартных ситуациях
но это явный скрипт(куча скриптов) с моей точки зрения( по «математико-программистким представлениям»), разьясните почему этот скрипт будет по вашему списку программой? я что-то не допонял видимо
0
muhas #
ах да, и разницу между плохой програмой и плохим скриптом я тоже не понял =)
0
amarao #
плохая программа — программа, которую писали как скрипт (без документации и т.д.)
плохой скрипт — скрипт, который перераздулся за пределы нормального, но всё ещё не обзавёлся документаций.

Результат у них одинаковый, история разная.
0
muhas #
а если не знаешь истории программы-скрипта? то плохая программа=плохой скрипт?
0
amarao #
Нет, это не скрипт, это программа на скриптовом языке. Отличается от скрипта она именно перечисленным.
0
muhas #
т.е только эти критерии?

тогда пофигу что программа а что скрипт (да и раньше было пофигу) если и то и то работает и выполняет возложенную на неё функцию…
–1
lless #
>А если сеть перевести на DHCP? А если поменять платформу с *x на *y?
ну это уже скорее подходит под категорию "_ТАМ_И_ВСЕГДА_"
>Ситуаций, когда нужный софт был бы платным, его функционал можно было в разум…
вот опять вы про тоже. я пытаюсь сказать что скрипты выполняют несложную, рутинную работу. Позволяют автоматизировать некоторые процессы — не такие глобальные. например бекапы(зачем покупать софт если можно написать шелл скрипт?), парсинг-фильтрация логов, мониторинг нужной службы с оповещением на телефон\аськуджаббер\мыло.
Конечно можно воспользоваться программой которая будет весить в разы больше и если ты найдешь в ней баг под конкретную ситуацию тебе придется ждать заплатки(если купил то там сапорт поможет), если опен-сурс — то знаний еще больше понадобится.
я с вами согласен в плане скрипт-"_ЗДЕСЬ_И_СЕЙЧАС_", софт-"_ТАМ_И_ВСЕГДА_". порой сроки поджимают. И для начала нужно написать скрипт, и пока он будет работать задуматься «а нужна ли программа?» или заняться её поиском.
0
lless #
комментарий к ветке выше.
+2
amarao #
Именно с прицелом на «оповещалку» я и писал это. Если у вас скрипт реализует нетривиальную логику (проверить, что SMTP работает, если не работает, то оповестить админа альтернативным методом), то это ПЛОХОЙ скрипт. Даже если он работает. Потому что следующий админ будет вынужден либо изучать персонально ваши скрипты, либо писать свои. И то и то, плохо.

Правильный выход — поднять nagios и настроить отсылку оповещений оттуда. Да, это займёт времени больше, чем скрипт для мониторинга конкретного сервиса, однако, это будет общее решение для проблемы «мониторить всё».
+3
lless #
а если новый не знает что такое нагиос? он будет изучать что это и как это работает. потом посмотрит как вы это настроили, все удалит и настроит по своему-а если ему будет лень, то напишет скрипт.
у вас в профиле написано «ненавижу Microsoft», это же не значит что для окон скриптов не пишут.
Нагиос насколько помню юникс-подобных ос, бывают админы которые с юниксами на вы и они не держат серваков на онных. Или это уже не системные администраторы?
+2
amarao #
Я про это и говорю. Вместо того, чтобы с увлечением писать скрипт, с которым вашему последователю придётся разбираться, нужно напрячься и поставить нагиос (или другую систему мониторинга), для которой чужие дяди УЖЕ написали документацию.

Если вы пишите скрипт, будьте добры написать к нему документацию, хотя бы в 1/10 от документации нагиоса.

Мысль статьи простая: пишите код — он должен быть либо очевиден с первого взгляда, либо иметь документацию. Первое называется скрипт, второе — программа. Статья посвящена объяснению того, что не нужно писать программы с уровнем документированности скрипта.

nagios прекрасно мониторит виндовые сервера; у майкрософта, насколько я знаю, есть system manager, который делает что-то подобное.

Если прийдёт новый админ и увидит, что «тут стоит нагиос» и «тут какая-то куча скриптов», то какова вероятность а) что он прочитает про нагиос б) что он изучит скрипты без документации?
+2
lless #
эх мечты мечты… я про то, что когда приходишь на новое место и там все прям для тебя. в столе папочка с документациями по структуре предприятия, где какой сервак и какие крутятся на нем сервисы. на каком из серверов в кроне висит скрипт для бекапов и что он бекапит. какие бывают частые глюки с их решениями(я думаю у каждого админа есть такие). Отдельно лежит папочка с лицензиями на весь конторский софт. а то иногда приходишь, а от прошлого админа и след простыл… и сидишь отлавливаешь все и разгребаешь. и тоже ничего не документируешь…
0
amarao #
Стопочки документации нет. Есть стопочка статей в локальной вики.
+4
Iwamoto #
Правилом хорошего тона является передача дел при уходе. Мой предшественник этого толком не сделал, пришлось и файло на его компе восстанавливать, и пароли сбрасывать. Было неприятно.

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

Начальник у нас был хороший, требовал подобных действий до ухода в отпуск. И коллеги с основными заморочками по подобному корану справятся, и тебя с пляжа телефонным звонком не выдернут.
0
amarao #
А я при уходе ничего не писал, кроме конверта с паролями. Потому что всё это было написано в течение рабочего времени, а не судорожно «в последние две недели».
0
Iwamoto #
Вы знаете, «судорожно» ничего не писалось. У нас было краткое описание таблиц и полей, возможность просмотра структуры базы через бормановский SQL Explorer на резервной базе, и некоторые куски исходников серверной части, которые буквально выпрашивались у головного офиса. На раскрутку одной подсистемы у меня ушло больше года, и все эти знания — схему данных, описание основных нештатных ситуаций, примерный список действий пользователей при проведении базовых операций, я передал коллеге. К счастью, он промаялся с этим наследием всего лишь месяц.

А Вам повезло больше, даже немного завидую. Но опять же, я не был разработчиком, а был в техподдержке убожества, созданного Teleform.Ru.
+2
LLIAMAH #
Прочитал, в целом идеи в статье изложены верные, хотя я бы не стал так критично относится к роли скриптов в администрировании. Просто важно всегда четко ставить цель и применять те инструменты, которые в данных условиях будут наиболее эффективны.
Немного критики.
Как насчет хорошей верстки? Читать и воспринимать такую «простыню» текста очень сложно. Хорошая статья требует не только хорошей идеи для нее, но и хорошего воплощения ее, идеи, в жизнь. Кстати, это касается почти любой идеи.
Пока это больше похоже на поток мыслей.
+1
Zubchick #
Ух, здорово. Немного категорично как-то, это все же ваше мнение, но в целом неплохо. Со многим согласен.
0
alex_www #
Являются ли рецепты шефа, puppet или cfengine недопрограммами или все же скриптами.
0
amarao #
cfengine являются программами: www.cfengine.org/pages/documentation

Остальное не видел, не знаю.

Повторю: разница между скриптом и программой не в том, как они написаны, а в том, как они сопровождаются.

+1
ToxoT #
Согласен. Были случае когда хотелось доработать ряд функций к уже рабочему скрипту, обычно это было просто в пустую потраченное время.
Чем изобретать велосипеды проще поискать уже готовое решение и адаптировать его под себя тем же скриптом.
Не нужно примитивному скрипту для бэкапов уметь делать дифференциальные бэкапы, это можно сделать уже готовой системой резервирования.
Отличная статья.
+1
amarao #
Правильно будет говорить не «проще», а «правильнее». Потому что проще всё-таки написать самому. Но цена сопровождения и развития этого решения окажется много больше, чем сопровождения существующего решения.
0
Iwamoto #
>Не нужно примитивному скрипту для бэкапов уметь делать дифференциальные бэкапы, это можно сделать уже готовой системой резервирования.

пардон, на какой системе нужно писать скрипт для дифференциальных бэкапов?
–2
Iwamoto #
Поначалу подумал, что это перевод, решил дочитать до конца… Ан нет, не перевод.

>признак крайней куцести рабочей среды

Аффтар, а Вам не доводилось работать в техподдержке конторы, где любые средства разработки программ запрещены? И где только скрипты являются выходом из многих и многих ситуаций?

>Если у вас скрипт реализует нетривиальную логику (проверить, что SMTP работает, если не работает, то оповестить админа альтернативным методом), то это ПЛОХОЙ скрипт.

Да с куя ли?
0
amarao #
Нет, не приходилось. Более того, я ушёл из компании, где я был рутом в компанию, где от меня до рута человека три по иерархии. И там, и там все технические специалисты сами отвечали за работоспособность машины. Точнее, был один… м… не очень квалифицированный — «веб дизайнер», его машину обслуживали мы (ит-отдел) и у него прав администратора не было. В остальных — хочешь свободы — держи, если можешь удержать.

И я с трудом себе представляю компанию, в которой системный администратор не имеет права использовать то, что является удобным/нужным.

Кроме того, речь идёт не о том, «на чём писать», а о том, что скрипт и программа различаются не кодом, а административным подходом.

Насчёт «да с куя ли» — я, вроде, простыню уже написал.
+3
Iwamoto #
>И я с трудом себе представляю компанию, в которой системный администратор не имеет права использовать то, что является удобным/нужным.

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

>Насчёт «да с куя ли» — я, вроде, простыню уже написал.

ну здесь опять же… Если интересует, я могу в ЛС или в почте описать Вам ситуацию с внедрением стороннего ПО. За исключением ссылок на пункты инструкций, номера которых за год после ухода порядком подзабыл:)

>а о том, что скрипт и программа различаются не кодом, а административным подходом

с этим я не согласен, но к аргументированному обсуждению пока не готов, увы.
+3
amarao #
Ну… Я могу сказать только одно: если требования являются необоснованными (например, как в одной компании, в которой, я, к счастью, не работал, где админу запрещали в шариться в интернете (!)), то сотрудник должен либо обосновать свои требования, либо принять политику компании. Ситуация, когда «скрипты можно, а программы нельзя» есть фарс и бред, потому что разницу между ними я изложил чуть выше: программа более документирована чем скрипт.

Писать «свою программу» дорого. Очень. Потому я и говорю, что не нужно поддаваться приятному соблазну сделать самому, и надо презнемочь себя и изучить чужое. Потому что чужое, с большой вероятностью, решило множество проблем и имеет наработанную базу. А своё имеет только голый энтузиазм и веру, что получится лучше, чем у всего белого света.
0
Iwamoto #
>Ситуация, когда «скрипты можно, а программы нельзя» есть фарс и бред,

но она есть, увы. WSH является встроенным средством Windows, а вот программа, и ее средства разработки — нет.

>программа более документирована чем скрипт.

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

>Потому я и говорю, что не нужно поддаваться приятному соблазну сделать самому, и надо презнемочь себя и изучить чужое.

Да, я согласен, что не стоит самому писать проверку md5 и другие распространенные проверенные алгоритмы. А вот «голый энтузиазм и веру, что получится лучше, чем у всего белого света» было, и получалось не хуже, чем у коллег из других городов, каждый из которых изобретал нечто свое.

Да и написание скриптов порой не исключает изучения чужих наработок, для меня не в плане идей или конкретной реализации, а в плане технических вопросов.
–1
amarao #
Никакие, самые подробные комментарии в коде, не заменят документацию по программе. Скрипту — да, до определённого момента мелкое «трудное» место можно объяснить.

Но если у нас появляется сложная часть, завязанная на логику других программ, то она требует очень подробного описания. Не описания «как работает скрипт», а описания «что он делает». И не на уровне «регистрирует обработчик в WMI-репозитории и по получении сигнала изменяет атрибуты snmp», а объяснение «к чему тут вообще WMI, для чего нужно это транслировать в SNMP руками и что есть snmp-комьюнити».

Относительно «получалось не хуже чем у коллег»… Не хуже. Да. Но если бы на этом месте была продуманная система, то, наверняка, было бы лучше.

Я это говорю по нескольким годам возни, как с самописными скриптами, так и с централизованными системами. Сделать самописный скрипт всегда приятнее. Централизованная система всегда надёжнее, особенно в условиях миграции/расширения/изменения.
–1
Iwamoto #
>Да. Но если бы на этом месте была продуманная система, то, наверняка, было бы лучше.

ненавижу «бы». Нет этой системы, и не будет. Поэтому обменивались и по почте, и обсуждали по телефону, что и как делается.

>Не описания «как работает скрипт», а описания «что он делает».

т.е. программа в этом случае выглядит выгоднее? Не вижу разницы, честно.

>Централизованная система всегда надёжнее, особенно в условиях миграции/расширения/изменения.

не всегда. Киньте в ЛС адрес почты, я Вам распишу конкретные ситуации.
0
amarao #
У вас именно — не будет. Если вы уверены, что вы всю жизнь будете эту систему поддерживать. У меня, например, три десятка скриптов заменилось одним нагиосом, и работает оно куда более красиво с точки зрения архитектуры, и мониторит оно куда больше.
0
Iwamoto #
>У вас именно — не будет.

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

Почему Вы делаете акцент на мониторинге? Оно, конечно важно, но есть у скриптов и другие применения.
+1
amarao #
Внедрение нагиоса с изучением как он работает — меньше недели. Установка агентов — от двух минут до 15 на сервер в зависимости от платформы и скорости работы.

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

На скриптах может делаться много что (да хоть весь свой собственный init), но чем скриптов больше, тем менее понятной становится система.
–1
Iwamoto #
>Внедрение нагиоса с изучением как он работает — меньше недели.

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

>но чем скриптов больше, тем менее понятной становится система.

один скрипт, в котором собраны все необходимые задачи, с разделением по времени. В скрипте расписаны все составляющие в комментариях. Ничем не хуже, я думаю.
+3
Tails #
Вот вы написали, чем отличаются скрипт и программа в вашем понимании. И это не теория правильных скриптов, а теория правильных скриптов в вашем понимании. Вы имеете на это полное право. Вот вы показали статью нам, на то тоже имеете полное право. Но не нужно всех несогласных с вашей теорией, которая отличается от общепринятой классификации, тыкать носом и учить, как правильно.
–2
egorinsk #
А еще в языке bash скрипт надо начинать с trap onerror ERR, чтобы хоть как-то имитировать систему обработки исключений.
–4
egorinsk #
А еще инвалиды, которые пишут bash скрипты часто не умеют нормально обрабатывать пробелы и кавычки в именах файлов, этим грешат OpenSource рахработчики, какие-то компиляторы например не могут установиться в папку с пробелом в имени (Program Files например :) )

Ну а еще у bash невозмодный синтаксис (если надо учитывать кавычки и пробелы), и писать на нем что-то можно только под страхом смерти. И дурная идея с системой подстановок.
+1
amarao #
Ну, этим грешат не только программисты на баше. У майкрософта в руководстве к 2000ому MSSQL не рекомендуют использовать пути к базам данных с пробелами.
0
Iwamoto #
BS. по умолчанию базы сохраняются в Program Files\MSSQL\...\...\чего-то еще. И прекрасно работают.
+1
Emin #
Очень интересная статья. А если приложить этот принцип к вёрстке, то получается, что современный html-код — это программа, исполняемая браузером.
–1
amarao #
Тут я ничего не могу сказать. В этих условиях рассуждение о системном администрировании не очень применимо; скорее нужно говорить о сайте как о сложном комплексе из документов и кода.
+5
unconnected #
напомнило, на одном из форумов гражданин спросил «как бы мне по фтп скачать сразу всё вместе с вложенными каталогами?», 10+ страниц обсуждений с демонстрацией шеловых скриптов, которые под конец уже почти не глючили…
обсуждение резко остановилось после комментария: «ребята, а вы про wget слышали?»
–4
digreen #
Автор, получите заслуженное «спасибо, кэп». Объяснили диким туземцам, что программа — это программа, а скрипт — это набор команд для выполнения конкретной прикладной задачи. Молодец.
script даже переводится как сценарий и уже из этого все понятно.
Грань, в которой заканчивается скрипт найти сложно.

Можно было вот это написать и закончить статью, смысл был бы примерно тот же, но люди время не тратили бы.
–1
laevsky #
Позвольте не согласиться с Вашей классификацией скриптов и программ. Дело не в документации и не в интеграции и поддержке и даже не в сложном алгоритме. Эти качества отличают лишь хорошую программу от плохой, и то не всегда.
Скри́птовый язы́к (англ. scripting language, в русскоязычной литературе принято название язык сценариев) — язык программирования, разработанный для записи «сценариев», последовательностей операций, которые пользователь может выполнять на компьютере.

Вот и все. Это из википедии.
–1
dkr6 #
Ну что же вы, мистер?
Вот так, в лет, обрезали крылья…
Не дали поразглагольствовать на тему вокруг программ и скриптов, и о том, что такое хорошо, а что такое плохо…

А статья таки ни о чем…
–1
digreen #
Вот я выше выразил то же самое, только в более критичной форме, и схлопотал минуса.
Автор навязывает свое мнение, временами в категоричной форме (аж с капслоком), забывая вежливо указывать, что это только лишь его видение ситуации.
Скрипты же НЕ ДОЛЖНЫ ЗАВИСЕТЬ ДРУГ ОТ ДРУГА. Ситуация, когда скрипт зависит от сервисов другого скрипта, который зависит от третьего — ненормальная.

Т.е. в среде *unix все выполнение чего-то после выполнения предыдущих действий недопустимо? Например, поднятие туннельного интерфейса после поднятия беспроводного и все в таком духе?
Такое ощущение, что чей-то кривой «скопипастенный» недокументированный" скрипт со «сложной логикой» ему что-то сломал, и все вокруг неправы и должны быть адски заминусованы в случае несогласия.
0
amarao #
Я в своих постах, кроме мата, нигде минуса не ставлю, так что извините.

А в «среде юникс» (если мы про адекватный дистрибьютив, а не про slackware way) программы на интерпретируемых языках вполне себе используются. Как программы. А вот если кто-то пишет свою обвязку, которая вместо вызова N программ реализует их функционал самостоятельно — это плохо. Потому что у программ документация есть, а «самостоятельные реализации» обычно её не имеют.
0
amarao #
Т.е. делюга, или там, медиавики — это такой «сценарий», выполняемый пользователем? хм…
+1
axunax #
Судя по логике автора и его комментариям, предлогаю переименовать пост в «Теория правильных костылей для реализиации локальных задач».
Так он понимает слово — скрипт
0
amarao #
При достаточно простом тексте скрипта он не является костылём, а является штатным средством в работе.
0
axunax #
Это с ваших слов.
Скриптами называют не программу на скриптовом языке программирования, а костыль для реализиации локальной задачи. Вряд ли кто-то в здравом создании назовёт конфигурацию 1ц бухгалтерии «скриптом бухгалтерского учёта».
–3
non7top #
пост совершенно бестолковый и начемный. не содержит в себе никакой смысловой нагрузки, кроме глупостей.
0
Veshij #
Пост из разряда «еще один все понял».
Если вы администрируете какие-либо сложные системы, а не просто почтовый/веб сервер компании — то «скриптами» в вашем понимании обойтись сложно.
И еще у меня есть ощущение, что вы не совсем в «теме», а оперируете только академичискими знаниями.
0
amarao #
Давайте ближе к делу. Пример «сложной системы», которая достаточно сложна, чтобы для неё писать сложные скрипты, но не достаточно важна, чтобы для неё писать приложения администрирования?
+1
siasia #
В английской литературе по отношению к скриптам связывающим библиотеки чаще употребляется понятие «glue», то есть «клей», что точнее выражает смысл идеи нежели «обвязка» с моей точки зрения. Я как программист далёкий от альпинизма, сначала долго не понимал, что значит это слово.
–1
retran #
Скрипт, он же сценарий — ВСТРАИМАЕВАЯ пользователем в приложение программа, служащая для расширения возможностей приложения путем выполнения прикладных операций этого приложения.

любой shell — командная оболочка, shell-скрипты расширяют ее функциональность, используя команды оболочки.
Word — прикладное приложение, программы на VBA расширяют его функциональность, используя его API.
AutoCAD — прикладное приложение, AutoLISP — скрипты.
Произвольная игрушка со скриптовым движком — приложение, логика в ней на Lua или Питоне — скрипты.
При этом отдельное приложение на Питоне — это именно приложение на Питоне, а не скрипты.

При это сложность алгоритмов, интерпретируемость/компилируемость никакого значения не имеют.

Статья — имхо, бред.
0
etz #
Коментаторы отжигают. вместо того что-бы обсуждать дальше тему в разрезе — «пример задач и утилит работника такой-то сферы применяемых в повседневной работе» мелочно и по школьному троллят.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.