Почитав у [livejournal.com profile] noddeat про «тупих клієнтів», які задовбали нетупих офісних робітників, і згадав, що у мене за кілька днів до того виникала аналогічна думка з приводу іншої історії.


«Работаю в саппорте местного провайдера. Однажды пришло мне такое письмо:

Здравствуйте, %name% — к сожалению, не знаю, как по отчеству. Знаете, у меня в ходе сложившейся ситуации возник ряд вопросов:

Почему ваша организация не защищает своих клиентов от вирусных программ и от различных «умельцев» по части пакостей в интернете? Разве нельзя при регистрации сразу устанавливать на компьютеры пользователей антивирусные программы и подключать их к серверу автоматического обновления? Почему я второй день сам, в одиночку «барахтаюсь» в этой ситуации?

Почему ваши операторы на телефоне ##-##-## не могут понятно объяснить, что надо делать в критических ситуациях? Почему нет оперативной связи с техническим персоналом? Я не смог связаться напрямую со специалистами, только по заявке через оператора, а это длится часами — отвратительный сервис! Почему надо так долго слушать музыку и магнитофонную запись автоответчика?

Почему всё так долго, неудобно, непонятно? На всех сайтах надо часами регистрироваться, а потом стараться запомнить все эти логины, пароли, имена? Без этих игр в храбрых советских разведчиков никак нельзя?

Почему нельзя сделать небольшое окно 1 на 2 см, в котором в течении всей работы компьютера будет отображаться стоимость текущего соединения в рублях? Можно также создать окно информации, что открылись какие-то вкладки-паразиты, о которых узнаёшь, только когда выходишь из интернета? Может, это и есть те самые «вирусы»?

Знаете, я вот сейчас пишу вам эту записку, а внутри такой мутный осадок раздражения, потому что мне неприятно писать вам всё это, но я вынужден это делать... Я думаю, что профессионалам должно быть стыдно получать вот такие письма от клиентов. И что самое паршивое в этой ситуации — я не уверен, что получу от вас быструю и эффективную помощь...»

От що я скажу: клієнт правий стовідсотково, до останнього слова. Єдине, його претензія дещо не за адресою — він не знає (та і не зобов’язаний знати) особливостей внутрішньоайтішного розподілу праці. Проблема, насправді, дуже глибока і пов’язана з відсутністю на ринку комплексного продукту для користувача. Є окремі продукти під окремі завдання, а разом подружити їх до потрібної міри, щоб вони складали одну систему, ще не вдалося. (Можливо, щось подібне реалізоване в Маках, не знаю. З Маками я стикався рівно один раз, в Бельгії, і більшість зусиль пішло на війну з бельгійскою розкладкою клавіатури та незвичною плутаниною між запуском програми та переключеннями між програмами. Розібратися я так толком і не розібрався, хоча те, що мені треба було — зробив, а от ставити оцінку макам я не візьмусь). Антивірус не ставиться в комплекті з налаштуванням доступу до Інтернету. Централізована реєстрація на сайтах в зародковому стані. Автоматично поставити аддон до браузера, який би зв’язувався з біллинг-центром провайдера і відображав стан рахунку зараз не можна — провайдери не роблять таких аддонів, справедливо вважаючи, що мороки з цією затією буде більше, ніж толку від неї.

Але це все не проблеми клієнта — це проблеми айтішників. Проблеми, які поки що не можуть бути вирішені через неймовірну складність сучасних комп’ютерних систем, яка не йде ні в яке порівняння зі складністю інших систем, створених людиною. Ну що ж, електроніка теж колись була немислимо складною, а зараз 30000 транзисторів процессора 8086 виглядають просто смішно — люди навчилися добиватися стабільної та ефективної роботи значно більш складних електронних систем. Тому залишається сподіватися, що з ринком програмного забезпечення рано чи пізно відбудеться те саме, і людині не потрібно буде компонувати щось своє з окремих продуктів, а можна буде просто купити пакет софту для домашнього вжитку.

Розглянемо наступну ситуацію: є деяка група людей, яка суспільством признається нормальною, «своєю», але в силу деяких обставин вона в одному із своїх видів діяльності загнана у кут обставинами, залежними від соціуму. При цьому суспільство признає ситуацію неприйнятною, але, оскільки виправлення цієї ситуації потребує досить значних зусиль, а сама та група людей таких зусиль докласти не може, то питання «зависає у повітрі». Яка реакція такої групи людей на цю ситуацію може вважатися нормальною? У певному розумінні — ніяка, тому що будь-яка дієва реакція на таку катастрофічно неприйнятну ситуацією буде виходити за рамки реакцій, які вважаються соціумом допустимими. Однак, даючи таку відповідь на поставлене запитання, ми просто уникаємо розв’язання проблеми. Тому з необхідністю ми приходимо до висновку, що «недопустимі» дії утиснутої групи є не те, що припустимими, а неминучими. Ситуація може розв’язатися лише в тому випадку, коли тиск, який чинить ця група на решту суспільства, досягне такого маштабу, що соціум, нарешті, почне якось ворушитися.

Власне, ці всі роздуми не мають практично ніякого відношення до логіки, якою послуговуватимуться члени тієї групи. Для них в такій ситуації діятиме простіша логіка, яка стверджує: «за хамство треба бити в морду». Те, що хамство з боку суспільства є пасивним, виправданням для суспільства слугувати не може; хоча ситуація ускладнюється тим, що страждатимуть від цього «в морду», ймовірно, люди, безпосередньо не винні в ситуації. Біда в тому, що безпосередньо винних-то немає — «і злодія не було, і батька вкрали».

Так от, до чого це я: в дану модель повністю вкладається одеська історія з евакуатором, коли водій, покликавши на допомогу інших автомобілістів, скрутив евакуаторщиків. Застосовувати фізичне насилля проти людини, яка, власне, нічим не завинила, є, з точки зору нашого суспільства, категорично неприйнятним. Але категорично неприйнятним є і положення автомобілістів, яким, замість того, щоб розвивати автомобільну інфраструктуру, влада просто, образно кажучи, заборонила існувати, тому що нормально існувати автомобілісту в рамках цих обмежень, по суті, неможливо. Отож, хоча я не сказав би, що схвалюю поведінку водія, однозначного осуду ця поведінка у мене також не викликає.

Джентльменський набір мов сьогоднішнього веб-дизайнера виглядає так: html, php, sql, javascript. Відкладемо поки що питання цілісної технології і поговоримо про ці мови.

HTML. Призначення: гіпертекст, верстка, оформлення. Про деякі проблеми HTML я вже згадував: гарно пристосований для гіпертексту, погано пристосований до верстки, особливо до верстки форм. В результаті народжуються п’ятиповерхові таблиці, плаваючі div’и в три шари та інші маленькі радощі веб-дизайнера. До всього в html, на відміну від xml, погано структуруються дані, тому робота з ними на стороні клієнта ускладнена.

PHP. Призначення: серверне програмування. Перша і головна моя претензія до php: скриптові мови взагалі не призначені для серйозного програмування. Скрипти — для сисадміна, програмісту потрібна мова зі строгою типізацією, здебільшого без автоматичного приведення типів, з компіляцією (принаймі, в байт-код). Простий тест: спитайте у знайомого веб-дизайнера, чи заважала б йому строга типізація в PHP. Якщо заважала б — то він не програміст, тому що кожен програміст знає, що насправді значно простіше слідкувати за перетвореннями типів, ніж потім розгрібати таємничі помилки, що виникают в результаті некоректного приведення.

Взагалі в php купа деталей, які ніби спеціально придумані, щоб сприяти неякісному написанню коду: перемішаність програмної логіки та інтерфейсного коду (html), поділ на файли по критерію результуючої сторінки, що, крім усього, часто розносить код, який працює з одним і тим самим набором даних, по декількох файлах; навіть така дрібниця, як директива include, що приймає аргументом шлях відносно основного скрипта, що сильно ускладнює дворівневе включення у тому випадку, коли проміжний файл включається в два скрипти, розташовані в різних каталогах. Я вже не кажу про такі речі, як відсутність послідовності в іменуванні функцій, вимогах до назв функція та змінних, дивна поведінка з глобальними змінними. Це все викладено в, НМД, трохи експресивному, але по суті вірному записі [livejournal.com profile] nuclight. Остаточно мене вбив ось цей приклад з документації розробника. Гірше такої мішанини з напівстатичних методів мені навіть важко щось уявити. Якщо програміст на момент написання функції ще не визначився, відноситься вона до об’єкту чи до класу, то йому терміново треба відійти від комп’ютера години на півтори і ще раз гарно все обдумати.

PHP, виходить, орієнтований не просто на початківця, а на початківця, який усіма силами намагається уникнути того, щоб бути змушеним писати нормальний код. В результаті маємо те, що маємо: ледве не на кожному сайті можна знайти численні серйозні уразливості.

Мабуть, найменше претензій у мене до мови SQL. Окрім таких завдань, як вибір строки з найменшим значенням одного з полів, я практично не стикався з завданням отримання або модифікації даних, яке не можна було б красиво реалізувати на sql.

З JavaScript’ом я, на жаль, знайомий досить поверхово. Мушу сказати, що, змушений функціонувати в рамках DOM, javascript не є достатньо зручним засобом для модифікації як контенту, так і інтерфейсу. Хоча сама мова влаштована досить красиво.

Далі буде...

Частина перша. Історичний аспект.

Давно збирався викласти свої думки з приводу сучасного стану речей в веб-програмуванні. Ну що ж, поїхали.

Сучасний стан речей в веб-програмуванні мені категорично не подобається. Точніше буде сказати, що мені категорично не подобається сучасне веб-програмування в цілому. Чому — розповідь довга.

Почну, мабуть, з історичного аспекту.

З самого початку веб призначався для розміщення гіпертексту (тексту з лінками, малюнками та ін.) в Інтернеті. Тобто, скажімо, можна розмістити книжку з ілюстраціями і перехресними посиланнями всередині книги та на зовнішні джерела. Мова, яка під ці потреби була розроблена — html — для цих завдань була гарно пристосована. При цьому вона зовсім не була пристосована ні для більш-менш пристойної верстки, ні для динамічної побудови. З часом програмісти зметикували, що, раз віддає клієнту файли програма (веб-сервер), то можна цю саму програму заставити віддавати не лише статичний файл, а і динамічно згенерований контент. Така динаміка була додатковою примочкою, дрібною автоматизацією ручної зміни даних, і використовувалася для таких речей, як лічильник відвідувань, мітки часу на сторінках та ін. Арсенал засобів, які використовувалися, був досить широким, але цілком характерним саме для задач дрібної автоматизації — скажімо, скриптові мови, технологія CGI, яка для кожного веб-запиту утворювала окремий процес операційної системи.

Потім динаміку придумали використовувати для побудови серйозних фрагментів контенту, скажімо, для розділу новин. Це утворило зразу дві проблеми: по-перше, замість вставки в готову html-структуру окремих строк, засоби динамічної генерації контенту почали самостійно будувати структуру html-розмітки. По-друге, обчислювальні потужності, які стали витрачатися на генерацію контенту, стали порівнянні з рештою витрат на роботу веб-сервера. Ця проблема з часом все більше наростала, з неї почали викручуватися різними кривими способами, такими як Fast CGI.

Потім хтось здогадався розробити веб-сервіси. Це було початком кінця.

По-перше, це вимагало все більш віртуозної верстки, складність якої наростала разом з вимогами дизайнерів і клієнтів «зробити красиво». Це поставило проблему динамічної побудови структурованого html-коду у повен зріст: якщо просто побудувати таблицю зі змінною кількістю строк, в залежності від кількості останніх новин — це ще завдання мислиме, то динамічно зверстати сторінку, яка містить верхнє меню, бічне меню, список рубрик, мапу сайту, тексти з коментарями та ще й прогноз погоди в кутку — це вже за гранню.

По-друге, навіть незалежно від складності верстки, html виявився малопридатним для передачі графічного інтерфейсу. Зверніть увагу: якщо зараз вікно деякої програми промальовується більше 1-2 секунд, користувач скаже, що програма гальмує. Виключенням з цього правила є веб-інтерфейс — мало у кого є достатьно широкосмуговий доступ до Інтернету, щоб за 1 секунду відображався будь-який сайт. Це пов’язано з великою кількістю запитів, необхідних для відображення однієї сторінки.

По-третьє, веб виявився абсолютно непристосованим до обробки окремих команд користувача. Фактично, протокол HTTP передбачає повну видачу готової до відображення сторінки у відповідь на кожен запит. Це є нормальним доти, доки запит справді є запитом. Коли ж запит перетворюється на команду, складається безглузда ситуація: у відповідь на додавання, скажімо, коментаря до тексту браузер вимушений перезчитувати повністю весь текст, коментарі і графічні файли оформлення. При тому, що насправді йому не потрібно отримувати інформації більше, ніж просто відповідь, прийнятий коментар чи ні. Клієнт сам може додати коментар до списку.

По-четверте, будь-який сервіс передбачає поняття сеансу — пов'язаної між собою серії віконних форм, які разом складають одну послідовність дій одного користувача. Від початку протокол HTTP не передбачав нічого подібного взагалі. Запити в межах цього протоколу є повністю ізольованими. Сессію доводилось емулювати додаванням фіксованого ідентифікатора сессії в кожен запит. Потім протокол розширили, узаконивши таку емуляцію у трохи іншому вигляді — у вигляді куків.

На цьому проблеми не закінчуються, але залишаються в основному проблеми спеціальні, їх я детальніше розберу в наступних частинах.

Далі

Дуже часто поширена у третьому світі сім’я з десятком дітей розглядається як безвідповідальність перед власними дітьми, яким такі батьки не можуть забезпечити нормальні умови для розвитку.

Десь зо дві третини художніх книг у світі (не кажучи вже про дешеву беллетристику) написані про кохання. Із них значна частина — про ситуації конфлікту почуттів з розумом.

В літературі я неодноразово зустрічав персонажів, які вважали за вище досягнення позбавитися страху смерті і отримати можливість позбутися життя тоді, коли вважатимуть це доцільним.

Часто можна почути звинувачення у несправедливості лібералізму, оскільки він не гарантує нормальне існування людям, які працюють досить-таки багато.

Спитаєте, що спільного в описаних вище явищ? Подивимося уважніше. У всіх цих випадках критикується (оголошується надмірно спрощеним, «недоробленим») деяке явище. При цьому: інстинкт продовження роду заставляє людей підтримувати існування популяції, незважаючи на умови її майбутнього існування. Кохання змушує людей поєднуватися для народження та виховання дітей незважаючи на їх соціальний статус та інші соціальні явища, часто — абсолютно різних людей, не дозволяє замкнутися окремим невеличким групам і утворити незалежні соціуми. Інстинкт самозбереження рятує масу людей, які через яку-небудь дурню, якої вони нахапалися, вважають, що їх життя не має сенсу. Цю саму дурню інстинкт ігнорує. Лібералізм дозволяє користуватися суспільним поділом праці без складних підтримуючих його суспільних механізмів — йому достатньо для свого існування законності, і він успішно переживе руйнування решти суспільних механізмів та інституцій.

Отже, кожна з цих речей, по-перше, виконує важливу для людства роль, по-друге, не потребує взагалі або потребує досить незначних початкових умов для свого функціонування. Очевидно, що існування людства цінніше за проживання людей у комфортних умовах та їх всебічний розвиток, так само як і за філософствування на тему «У чому сенс життя?». Що неподільність (і — значною мірою — існування, адже невеликі замкнуті групи, найімовірніше, швидко б виродились) соціуму важливіша за безконфліктне співіснування людей у сім’ї (кому неочевидно — ласкаво просимо у коменти). Що суспільний поділ праці цінніший за безумовну його справедливість — людям краще буде житися за примітивного суспільного поділу зі справедливістю «на трієчку», ніж взагалі без нього у печерах.

Загальним для цих явищ є ось що: всі вони є низькорівневими методами забезпечення існування сучасної цивілізації. Звідсти витікають і їх плюси, і їх мінуси. Серед мінусів — спрощеність дії, яка (дія) в результаті часто виявляється неадекватною ситуації. За це їх, власне, і критикують. Серед плюсів, безперечно — надійність. Методом жорсткого релігійного регулювання в Індії вдалося деякою мірою ізолювати окремі досить великі групи-соціуми один від одного. Середньовічна Європа теж намагалася отримати подібний результат, однак у неї це виходило все сумнівніше і сумнівніше. Більшовики спробували позбавитися від лібералізму, а він все одно проривався крізь усі заборони у вигляді чорного ринку. Китаю та Індії більш-менш вдається стримувати народжуваність, однак можна не сумніватися, що у випадку більш-менш серйозних катаклізмів на планеті народжуваність прорветься і виросте достатньо, щоб вимирання людству не загрожувало. (Загальновідоме явище — під час війни народжуваність різко зростає). Самогубства так і досі не складають суттєвої загрози для існування суспільства, хоча, здавалося б, є маса країн, в яких для величезної кількості населення це було би «найрозумнішим» виходом.

Багатьом людям слід зрозуміти, що з низькорівневими методами боротися, по-перше, безглуздо, а по-друге — небезпечно. Безглуздо — тому що вони все одно будуть діяти через свій крайній примітивізм. Небезпечно — тому що замість них прийдеться для досягнення тої ж самої мети ставити значно більш наворочені, а, отже, менш надійні «підпорки». Один з прикладів, що трапляється, коли підпорки руйнуються, ми бачили на початку дев’яностих у нашій країні — низькорівневий метод взяв своє, але з жертвами. Думається мені, що краще вже було би одразу залишити лібералізм в основі суспільних відносин. Так що не треба безумовно критикувати низькорівневі методи. Вони корисніші, ніж здаються.

Дехто говоре — бандити, хулігани,
З тої голоти людей не буде.
А ми ще подивим, як потреба стане,
Хто полізе в льох, а хто під кулі піде.

Брати Гадюкіни «Ми — хлопці з Бандерштадту»

Фріц Морген дуже не любить героїв[1]. На його думку, герої лише ускладнюють життя собі та іншим. Так само він не любить людей, які, коли бачать хамство, грубість чи порушення законів, намагаються відновити справедливість на місці і самостійно[2]. Від таких теж, на його думку, толку ніякого, одна шкода — самі страждають, люди страждають; а справедливість-то можна і цивілізовано, по-європейськи відстоювати.

Це все було би вірно, якби не один маленький момент. Саме герої витягують суспільство з багна за вуха. Саме небайдужа людина, яка може надавати по голові вуличному хаму, призводить до того, що вуличні хами попритримають язик наступного разу. Саме наявність благородних спецназівців заставляє хуліганів боятися нападати не лише на сильних. Саме принциповість водія, який не пропустив порушника правил і втратив в результаті кілька годин і багато нервів, дозволить їздити спокійніше багатьом.

Солженіцин якось описував ситуацію, де традиційна кривава помста на Кавказі призвела до того, що КДБ не змогла влаштувати там звичну для себе ситуацію загальної покори. Чекісти банально боялись. Місцеві «герої» зламали таку гарну і відлагоджену, сучасну (20-е століття!) систему. Коли формальна система не працює, або працює принципово не в тому напрямку, виправити щось можна тільки позасистемними методами. І самі дикі методи очищують ситуацію, коли «цивілізований» підхід з’їхав невідомо у що (а з ним це трапляється часто; фашизм — дитя цивілізації).

Коли випаде можливість проявити принциповість, слід згадати, що, крім очевидних невеликих плюсів і не менш очевидних серйозних мінусів у геройства є і неочевидні, вкрай суттєві плюси, і це навіть не пам’ять нащадків. Країні потрібні робінгуди. Життя трохи складніше, ніж видається на перший погляд. Про це — мій наступний запис.


  1. Принципиальные герои и беспринципные злодеи. [livejournal.com profile] fritzmorgen
  2. Не прошёл мимо. [livejournal.com profile] fritzmorgen

 
Працює — не чіпай.

Золоте правило адміна.

Keep it simple, stupid!

Не менш золотий принцип для програміста.

Чому я не комуніст? Адже очевидно, що комуністичний рух ставить на меті побудову дійсно справедливого суспільства (принаймі, набагато більш справедливого, ніж нині існуюче)?

Все дуже просто. Комуністи пропонують повністю зруйнувати існуючу систему суспільних економічних відносин і побудувати свою, ідеальну. Однак, скидається на те, що для того, щоб побудувати систему, яка буде хай навіть не ідеальною, але принаймі стабільною та ефективною, треба бути принаймі екстраталантом, не сказати генієм.

Революція до будівництва нездатна, це, думаю, не потребує доведення. Революція можно лише щось зруйнувати. Інколи це корисно. Більшовики були дуже розумні люди — їм вдалося після революції побудували систему, яка кілька десятиліть давала суттєвий підйом, можна навіть сказати, ривок у розвитку і ще кілька десятиліть на його результатах ця система трималась. Однак і їм не вдалося досягти стабільності системи — ну не склалося у них з повноцінною вертикальною мобільністю суспільства. Прорахунок зіграв з ними злий жарт через 70 років.

Зрозуміло, що чим система простіша, зрозуміліша та випробуваніша, тим надійнішою вона буде. Навіщо таку систему руйнувати — я зрозуміти не можу. Ліберальна система не містить ніяких принципових протирічь зі справедливістю (більше того, вона навіть на трієчку цю саму справедливість забезпечує — люди отримують суспільні блага за принесену суспільну користь), то навіщо натомість замінювати її іншою, зібраною з нуля?

Очевидне рішення у випадку, коли є готове ядро системи — доробляти цю систему, виправляючи огріхи, неточності, промахи, грубі моменти. Незахищені пенсіонери, інваліди — організовуємо загальнообов’язкове соціальне страхування. Сироти — розгортаємо систему інтернатів. Надмірні прибутки підприємців — вводимо прогресивні соціальні податки. Можна продовжувати далі.

Звісно, є речі, які вкрай складно вирішуються «від лібералізму» — наприклад, копірайт. Не одна сотня кілобайт написана про придуркуватість існуючої системи захисту авторських прав, але і відмінити її так просто не вийде — виходить, що і з нею не годиться, і без неї теж паршиво. Схоже, що нормальне рішення цієї проблеми можливе тільки з соціалістичним підходом. Однак вибудовувати його раніше, ніж суспільство саме прийде до цього вийде собі дорожче — обидві сторони, автори і читачі/глядачі/користувачі будуть вважати, що вони постраждали, з’їдять реформатора разом і систему відмінять. Перехід до соціалізму має бути поступовим, у міру дозрівання суспільства.

Капіталістичний базис слід залишити працювати там, де він працює. Якщо комуністи відмовляться від ідеї революційного переходу до нового суспільного устрою — я їх підтримаю у їх намірах обома руками. Тільки після цього вони уже будуть не комуністи.

Profile

ichthuss

May 2017

S M T W T F S
  123456
78910111213
1415 16 17181920
21222324252627
28293031   

Syndicate

RSS Atom

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 27th, 2017 08:47 am
Powered by Dreamwidth Studios