|
Я это делаю Персональное меню Голосование Поиск по сайту Реклама
Статистика |
Пользователи и программисты Я мог бы выделить два подхода, которым пользуются программисты при создании программ:
Когда мы пользуемся подходом, ориентированным на пользователя, мы рассматриваем создаваемую нами программу как черный ящик, у которого есть только вход и выход. Как это реализовано внутри, нас, как пользователей, не очень интересует. Лишь немногие продвинутые пользователи могут захотеть поверхностно узнать, как устроен ящик внутри, но лишь с той целью, чтобы лучше понять, как выход зависит от входа. Когда мы пользуемся подходом, ориентированным на программиста, то мы рассматриваем создаваемую нами программу как белый ящик: нам совершенно ясно, как этот ящик устроен внутри. Основное отличие ориентации на пользователя от ориентации на программиста состоит в том, что при ориентации на пользователя в первую очередь имеет значение вход и выход, а при ориентации на программиста в первую очередь имеет значение внутреннее устройство. В крайнем случае пользователя вообще не интересует внутреннее устройства, а программиста - зависимость выхода от входа. Когда мы видим эти два разных подхода, возникает естественный вопрос, каким из них лучше пользоваться? Я не склонен впадать в крайности и говорить, что следует пользоваться каким-то конкретным подходом. Я вижу достоинства и недостатки обоих подходов и поэтому мне видится целесообразным использовать комбинацию. Чтобы Вам эти достоинства и недостатки тоже были видны, я здесь приведу некоторые из них. Если я на какие-то достоинства или недостатки не указал, был бы рад, если бы Вы мне на них указали. Достоинства подхода, ориентированного на пользователя (почему нужно пользоваться этим подходом):
Недостатки подхода, ориентированного на пользователя (почему этим подходом пользоваться не выгодно):
Достоинства подхода, ориентированного на программиста (почему нужно пользоваться этим подходом):
Недостатки подхода, ориентированного на программиста (почему этим подходом пользоваться не выгодно):
Собственно, все эти рассуждения мне навеяны тем, что многие программисты забывают о пользователях. Это касается и новичков и программистов с опытом. У новичков это может выражаться в фразах типа «на контрольном примере работает» или «я не знаю, как это реализовать». У программистов с опытом это может выразиться в фразе типа «так проще реализовать». О новичках я не буду говорить - с ними все просто - им нужно набираться опыта. А вот программистов с опытом хочется прокомментировать. Часто оказывается (именно «часто», а не «всегда»!), что под фразой «так проще реализовать» кроется тот факт, что сам программист не слишком хорошо продумал внутреннее устройство своей системы и теперь, чтобы «реализовать по-другому», ему нужно рефракторить (улучшать) свой старый код. Если забыть о пользователе, то вполне можно отказаться от рефракторинга, отмахнувшись фразой типа «пользователю эта функция не нужна». Есть еще одна примечательная фраза: «я это тестировал полдня - все работает!». Я даже не знаю, к кому ее отнести. Вероятно, так говорят новички с опытом. Почему я так думаю? Потому что написать автоматический тест - гораздо эффективнее. Почему автоматическим тестированием пренебрегают? На мой взгляд, все по той же причине. С точки зрения программиста, тестирование вообще излишне - ведь оно рассматривает программу как черный ящик и проверяет только зависимость выхода от входа. А ориентация на программиста предполагает, что особое значение имеет внутреннее устройство, а вход и выход - это чуть ли не побочный эффект. Что считать ошибкой? Теперь, когда мы знаем о двух подходах к «смотрению» на программы, мы можем поискать ответ на вопрос «Что считать ошибкой?». Часто оказывается, что ошибка - это не объективная реальность, а скорее субъективное восприятие, зависящее от того, с какой стороны мы смотрим на программу. Например, считать ли предупреждения ошибками? С одной стороны, предупреждение - это НЕ ошибка по определению: предупреждение потому и предупреждение, что оно не ошибка. Программы, содержащие в себе предупреждения, могут работать правильно. Именно «могут», а не «будут». Склонность к тому, чтобы оставлять в своих программах предупреждения, говорит об ориентации на программиста: «я тестировал полдня - все работает правильно!» Вероятно, этот человек тестировал полдня как раз для того, чтобы потом сказать эту фразу. Если бы его интересовала зависимость выхода от входа, он подал бы на вход такое данное, которое при наличии этого предупреждения привело бы к ошибке. Собственно, другая сторона - при наличии предупреждения повышается вероятность наличия таких исходных данных, при которых программа выдаст не правильный результат. С этой точки зрения предупреждение конечно же является ошибкой. Просто эта ошибка замаскирована под предупреждение. Здесь хотелось бы отметить примечательный факт: почему некоторые склонны подавлять предупреждения? Эффект страуса нам в этом поможет: если предупреждения не видно, значит его нет. А когда в написанной тобой программе нет ни ошибок, ни предупреждений, как-то становится легче на душе. Любовь к сладкой лжи даже здесь вылезла. Итак, предупреждение - это ошибка? Формально - нет. Фактически - да. Какой ответ Вам больше нравится - выбирайте любой! Другой пример: Соответствует спецификации, но результат не такой, как ожидается. Где ошибка?. Обычно этот вопрос возникает при стыковке двух программ.
Например, есть спецификация языка HTML, в которой написано, что теги
Мы, программисты, пользуясь этой спецификацией, пишем html-код, в котором
оставляем не закрытый тег Если подходить с точки зрения программиста, смотреть на внутренности, то нам все совершенно ясно: ошибка в браузере - он не правильно учитывает спецификацию. Совсем иначе обстоят дела, если смотреть с точки зрения пользователя. Он, пользователь, пользуется этим браузером довольно давно и большинство посещаемых им сайтов отображается правильно (если бы большинство сайтов отображались не правильно, то он давно сменил бы браузер), а наш сайт - не правильно. Какой нормальный пользователь сделает вывод о глючности браузера? Большинство подумают, что это на нашем сайте ошибка.
Я склонен согласиться с пользователем, потому что закрытый тег
Итак, наш код соответствует спецификации, но не правильно отображается в каком-то браузере. Где ошибка? Формально - в браузере, потому что это в нем не корректно реализована спецификация. Фактически - в нашем коде, потому что мы не тестировали наш код под этим браузером. Составление спецификации: ориентация на программиста или на пользователя? Если говорить о рассмотренном выше примере, то я скорее склонен думать, что ошибка не в браузере и не в нашем коде, а в спецификации, которая допускает подобные вольности: можно так, а можно эдак. Если при составлении спецификации ориентироваться на пользователя, то нужно в первую очередь думать об удобстве тех, кто будет этой спецификацией пользоваться и добавлять в нее всякие «украшения для удобства». За примерами таких спецификаций далеко ходить не требуется. Например, упомянутая выше спецификация HTML. Очень удобно для пользователя иметь возможность не закрывать теги, не ставить кавычки и т.п.
Другой пример - любимый мною язык PHP. Очень удобно для пользователя,
когда переменные из Здесь я не буду говорить о том, почему подобные украшения - это зло. Если Вы имеете некоторое представление о безопасном программировании в интернет вообще и у Вас есть опыт программирования на PHP, то Вы и сами знаете, почему. Вы знаете, что в новой версии языка HTML, XHTML уже не допускаются те вольности, которые допустимы в HTML. Вы так же знаете, что в языке PHP перечисленные выше особенности либо уже отключены (по умолчанию), либо их хотят выключить. Удобства от этих «украшений», конечно, есть. Хотя и в сомнительных количествах. А вот при ближайшем рассмотрении головной боли они прибавляют в ощутимых количествах. Я перечислил здесь эти особенности для того, чтобы найти ответ на следующий вопрос: Вольности в спецификации - это ошибка? Если смотреть на спецификацию с точки зрения пользователя, то в спецификации вообще не может быть ошибок. Спецификации как раз и нужны для того, чтобы одни программисты могли договориться с другими программистами о том, как будут согласовываться входы/выходы их программ. Вот здесь хотелось бы обратить внимание на одно несоответствие: спецификации нужны для того, чтобы одни программисты могли договориться с другими программистами. Какое отношение к программистам имеет точка зрения пользователя - не совсем ясно. А ведь говоря об «украшениях» мы говорили именно с точки зрения пользователя: пользователю так удобнее. Итак, считать ли вольности в спецификации ошибкой? Формально - нет, потому что спецификация может быть в принципе любой. Фактически - да. История нам уже показала, к чему приводят вольности в спецификациях. Теперь мы готовы ответить на главный вопрос: Неправильный результат работы программы - это ошибка? С точки зрения программиста программа не содержит в себе ошибок, если она откомпилировалась без ошибок. С точки зрения «дотошного» программиста программа не содержит в себе ошибок, если она откомпилировалась без ошибок и без предупреждений. С точки зрения «очень дотошного» программиста программа не содержит в себе ошибок, если она откомпилировалась без ошибок и предупреждений и на контрольных примерах выдала правильный результат. Обратите внимание, только «очень дотошный» программист посмотрел на результат работы программы, да и тот ограничился лишь контрольными примерами. Из этого можно сделать вывод, что для большинства программистов неправильный результат работы программы не является ошибкой. А вот с точки зрения пользователя поставленный вопрос просто не имеет смысла. Я думаю, все знают, почему. К чему я это все? Здесь я могу повторить фразу, которую уже говорил примерно в середине. Многие программисты забывают, что Десять минут головной боли одного программиста может стоить многих лет головной боли миллионов пользователей. Юрий Попов, popoff.donetsk.ua Последняя модификация: 22.12.05 02:58 Обсуждение статьи в форумеНе проходите мимо! Оставьте Ваш комментарий в форуме! >>> 12.10.06 23:13 MaxKorsak В этой статье очень хорошо описан случай с не закрытыми командами (тегами). Я не разбираюсь в языке PHP и я знаю, что в большенстве случаев, в этом языке, переменные не объявляются. Как таким образом можно говорить о безопастности, если можно ввести любую новую (будь то действия взломщиков или личная ошибка программиста) переменную и внедрить её в код, в результате чего программа будет работать не правильно. Для этого много думать не надо, достаточно в длинном имени ошибиться в одной букве и программа даст сбой, которого на первый взгляд и не увидишь. Спасибо за ответ, Просмотреть все комментарии в режиме форума. Всего комментариев: 2
|