In English

В.Ш.Кауфман

Ниша занятости активных ветеранов – дополнения

Проблемы программиста-практика

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

Естественно считать, что средства программирования должны помогать программисту минимизировать свои затраты.

Однако на практике этого не происходит в силу следующих причин.

Диагностика в действующих программах – одна из важнейших по затратам программиста проблема современного программирования.

Наряду с объективными проблемами баланса между возможностью информировать и обязанностью защитить программную услугу от разрушения, процветает откровенная наглость и безграмотность в этом деле. Чего стоят сообщения продуктов MS типа «где-то какая-то ошибка», при том, что соответствующий «информатор» наверняка обладает возможностью хотя бы частично идентифицировать причину случившегося!

Замечательный в этом отношении пример: “The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable.”

Создатель подобного сообщения наверняка знает, какой именно ресурс с каким именем  разыскивается, однако пользователь получает нечто совершенно невразумительное: «Ресурс, который ищете, возможно, был удалён, был переименован или временно недоступен».

Тем самым Вас (клиента, оплатившего пользование программой), посылают в буквальном смысле «очень далеко», не неся за это никакой ответственности!

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

История: попытка отладить навигацию сайта, тонко зависящую от прав пользователя и его действий (другими словами, текущая навигация должна обновляться в соответствии с содержимым связанной с конкретным пользователем базы данных).

Постановка задачи

Задача (возникшая, конечно, в моей повседневной практике): ускорить (оптимизировать по времени) навигацию корпоративного сайта, обладающую описанными выше свойствами и осуществляемую в основном посредством .Net TreeView компонентой, расположенной в так называемой Master Page, общей части практически всех веб-страниц сайта.

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

 Извращённая логика работы Master Page – сама по себе хорошо известный источник головной боли создателей сайтов. К тому же Master Page - никакая не «Page», т.е. никак не страница, и никак не «Master», управляющий поведением других страниц в естественном смысле этого слова, а по сути User Control, запускаемый из «нормальной» содержательной («content») страницы.

Так что уже само названии компоненты – недоразумение, ведущее к немалым затратам программистов при попытке применить эту компоненту в нетривиальных реальных условиях.

Проблема

 Справившись со всеми описанными выше «тонкостями» Master Page, я обнаружил, что в некоторых случаях после изменения состояния базы данных навигация не обновляется.

Решение проблемы

Именно из-за отмеченных выше прелестей логики Master Page были перепроверены соответствующие операции базового класса этой самой Master Page с подозрением, что какая-то тонкость не учтена. Только затем подозрение пало на динамически создаваемый на сервере клиентский скрипт, работающий непосредственно после обновления базы данных.

Выяснилось, что в нём иногда пишется лишний апостроф, делающий этот скрипт синтаксически неправильным! Именно поэтому в этом случае скрипт не работает и навигация не обновляется.

Источники проблемы

Главная – никакой диагностики при синтаксической ошибке в скрипте!

«На заре туманной юности», серьёзно занимаясь методами синтаксического анализа и воплощая их в действующих тогда трансляторах, я и в самом мрачном сне не мог себе представить, что в 21 веке буду тратить драгоценное во всех смыслах рабочее время на поиск абсолютно тривиальной с точки зрения синтаксического анализа, но весьма нетривиальной для человека ошибки - лишнего апострофа в не очень коротком скрипте, да ещё  и динамически создаваемом.

Конечно, Visual Studio позволяет отлаживать скрипты, и диагностику предоставляет. Однако включить её не только надо уметь, но она ещё и работает только для родного Internet Explorer, пользоваться которым регулярно столь неудобно, что у меня в это время был включён более приличный в практическом отношении Firefox. А поскольку отладка в Visual Studio к тому же работает очень медленно даже на приличных компьютерах, то постоянно применять медленный Internet Explorer, да ещё со включённой отладкой скриптов практически нереально.

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

Умолчание делается безграмотно с точки зрения логики программиста-пользователя.

История: попытка в Microsoft Windows 7 найти файл, содержащий заданный текст

Постановка задачи

Задача (тоже из моей повседневной практики): найти в некоторой известной мне папке все файлы, содержащие подстроку ”Cookies”. Папка хотя и известная, но довольно большая, содержащая реализацию на классическом ASP одного из наших старых, но активно работающих интернет-приложений. Знаю точно. что в нескольких файлах этой папки такие подстроки есть (сам писал!). Но сейчас мне нужны все такие файлы.

Шокирующий результат поиска в Windows 7

Казалось бы, чего проще. Открываю означенную папку в Windows Explorer, пишу ”Cookies” в строке поиска. Однако нет ничего простого, когда работаешь с современными сверх-умными операционными системами!

Получаю следующий замечательный результат «ничего не найдено»:

 

Попытки разобраться с причинами неудачи

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

Выясняется следующее (важно понимать, что это выясняется после немалых затрат времени и сил, которые при иных обстоятельствах должны были бы полностью компенсированы, да ещё и с учётом морального ущерба(!), производителем Windows 7).

Безобразное умолчание

По умолчанию ищется не всё, а только по именам файлов - замечательная философия: пусть не будет найдено то, что пользователю нужно, зато быстро не найдено!

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

Затем. опять по умолчанию, проверяются файлы не со всеми расширениями - например, не проверяются расширения .asp – опять, конечно, для быстрого получения неадекватного результата.

И это всё при том, что Дейкстра давным-давно вполне вразумительно объяснил, что такое разумное умолчание (по умолчанию должен быть общий случай, а не «оптимизация» - критерий Дейкстры в ЯП).

Настройки поиска

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

http://www.wseven.info/folder-options/

Пытаюсь применить эти рекомендации, работая с Folder Options и Indexing Options :

На индексирование всего компьютера уходит порядка десяти часов, однако с этим вполне можно смириться – я, конечно, хочу индексировать всё - память для индекса практически бесплатна, а искать хочется как можно быстрее, если результат, конечно, будет релевантным. Мне совершенно непонятно, зачем вообще заставлять пользователя думать об ограничении области поиска – по умолчанию, конечно, следует искать по всему компьютеру (за исключением собственно ОС и установленных программ, чтобы не вводить пользователя в заблуждение).

Однако, установив вручную «Всегда искать среди имён и содержимого файлов», как показано ниже, я по прежнему не могу получить правильного результата для поиска, скажем, текста ”Cookies”  в файле с расширением .asp  (одно из стандартных расширений для веб-страниц, кстати, «родное» как раз для производителя той самой Windows 7, с которой я сейчас сражаюсь, пытаясь заставить её делать нечто более чем обычное и совершенно естественное).

После дополнительной настройки

Чтобы уж совсем меня запутать, Windows 7 в некоторых контекстах в таких файлах подобный текст находит, например, если этот контекст таков:

<!-- IF IsEmpty(Request.Querystring("lg")) THEN , etc. Cookies --> ,

и не находит, если он таков:

'    Response.Cookies("Default_language") = Request.Querystring("lg")  .

То же самое (в любых комбинациях, как и должно быть) прекрасно ищется, если изменить у того же файла расширение на .txt (стандартное расширение для текстовых файлов, обрабатываемых Notepad, etc.).

Вместе с тем, расширение .asp, конечно, перечислено среди расширений тех файлов, где искать нужно:

Нет нужды добавлять, что так называемый «поиск и устранение неисправностей» (”Troubleshooting”) Windows 7, оказывается, как обычно, совершенно бесполезным.

Кстати, 12.1.2019 проверил, как с поиском аналогичного текста в последней версии Windows 10 – коротко говоря, лучше не стало.

Решение задачи

Устав «бороться» с Windows 7, я решил поискать иные решения (программистская жизнь была бы замечательной, если бы это было возможно всегда, а не только при решении столь просто формулируемой задачи).

Практически приемлемым оказалось только решение полностью отказаться от поиска Windows 7, установив, например, Total_Commander (заметим, что и Google Desktop не захотел решить нашу задачу – он не понимает расширения .asp и мне осталось непонятным, как его этому научить). А вот Total_Commander справился с задачей легко и без каких-бы то ни было специальных настроек (кроме, естественно, указания, где и что искать).

Другими словами, он работает естественно по умолчанию, не требуя предварительной индексации, очень гибко настраивается, содержит практически всё, что нужно (с точки зрения интересов пользователя, а не производителя – что давно должно было бы быть в стандартном Windows Explorer-е). Этот продукт платный, но своих (совсем небольших) денег стоит!

Увы, и у этого продукта не всё блестяще с поиском, скажем, в документах MS Word. Я, во всяком случае, не смог в небольшой папке найти с его помощью файл, содержащий слово «Ольга», хотя в ней был файл  .doc , содержащий строку со этим словом.

Заключительные замечания

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

Вместо всего этого безобразия с неработающими настройками создателям Windows 7 следовало бы начать с правильного умолчания!

Нетрудно привести и другие примеры безграмотного умолчания. Скажем, когда вас, считающего себя по умолчанию, естественно, не только администратором на собственном компьютере, но и собственником оного, вдруг ввергают в ступор заявлением типа «у вас нет доступа к таким-то ресурсам» или «у вас нет прав делать такие действия», сопровождая иногда подобные сообщения замечательным советом: выполните ту же самую программу заново в качестве администраторв (”Run as administrator”).

Чтобы полнее ощутить уровень абсурдности подобной «заботы о потребителе», достаточно  представить психическое состояние человека, которому автомобиль периодически перестаёт подчиняться, сообщая, что единственный выход из положения - начать поездку заново, предварительно умудрившись нажать хорошо запрятанную особую кнопку, означающую «я действительно твой владелец».

Примеры подобного рода можно, увы, перечислять до бесконечности. Скажем, в Visual Studio 2010 попытка компилировать файл, построенный автоматически одним из «мастеров» этой системы, завершается сообщением об ошибке «The type or namespace name 'Xml' does not exist in the namespace 'System'».

Оказывается, автоматически создавая файл со строчкой «using System.Xml;», супер-современная среда-помощница не удосуживается добавить в Ваш проект ссылку на System.Xml, заставляя Вас впадать в ступор, поражаясь невразумительной диагностике, и, с трудом придя в себя, вспоминать об уровне квалификации Ваших дорогих помощников и, в конечном итоге, добавлять эту ссылку вручную.

Заметим, что не только «мастер», но и компилятор вполне мог бы это делать, обнаружив в компилируемом файле указанную строчку.

«Труд на юзера спихнуть» - позорный лозунг ленивых и (или) безграмотных программистов.

 

Примеры «хорошего» умолчания при подключении «старых» ASMX веб-сервисов и ужасного умолчания при подключении «новых» WCF веб-сервисов разбираются в моём тексте о науке «Привычнология».

Скриншот первой страницы результата в Гугле:

 

Результат в Яндексе с указанием искать только в точном соответствии с запросом.

Скриншот начала первой страницы результата в DuckDuckGo

 Ответы на вопросы

1.      Вопрос. А что, раньше было лучше?

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

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

Сослаться на убедительные примеры сейчас по многим причинам нелегко, но я хорошо помню, скажем, стремление Евгения Андреевича Жоголева довести до совершенства нашу систему модульного программирования СИМПР (кстати предвосхитившую базовые идеи .Net), первые версии того же Скайпа или впечатление от изящного Паскаля Вирта.

Да и в своих продуктах я старался недомыслия не допускать, в частности, в книге «Языки программирования. Концепции и принципы» и в недавно созданном сервисе Вицита.

2.      Вопрос. Не всякий ветеран годится? А каковы требования к тем, кто годится?

Ответ. Требуется, чтобы ему было что показать и о чём убедительно рассказать, демонстрируя свою дееспособность в современных условиях.

3.      Вопрос. Вы говорите: «недомыслие, недотянуто, недоделано». А если бизнес говорит "надо" (срочно выпускать очередное обновление)?

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

Это же нужно делать по отношению к тем видам ущерба, который наносят «эффективные менеджеры» в нашей сфере, воруя наше внимание, время, нервы и другие ценнейшие ресурсы.

4.      Вопрос. Мы готовы предложить план действий в конкретной ситуации? Мы владеем всеми современными методами проектирования-тестирования?

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

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