Немного философии.
Автор Александр Просторов Версия 1.01 от 06.06.2007
И материалы, изложенные на этом сайте, и в куда большей степени то, что я говорю в форумах, опираются на определенные жизненные воззрения, постулаты. Я перечислю некоторые из них здесь; не для того, чтобы аргументировать или иначе утвердить их истинность - это уж решайте сами - но для того, чтобы иметь возможность сослаться на них, объяснить, почему именно я оцениваю некую конкретную ситуацию так, а не иначе.
Истина против конструктивности.
Я очень высоко оцениваю конструктивность, то есть - в прикладном аспекте - нацеленность на решение, и хорошее решение, актуальных, стоящих перед человеком задач. И вот тут возникает забавный парадокс: иногда неверное, ложное утверждение может быть более конструктивным, нежели соответствующее ему истинное. Таким образом, утверждение может быть "вообще говоря неверным" и "правильным в смысле полезным" одновременно.
Для примера можно взять такое утверждение как "Невезения не существует"1. Вряд ли хоть кто-то назовет его истинным, но в то же время в определенном разрезе оно эквивалентно следующему утверждению: "Любая неудача есть следствие конкретных ошибок и недоработок, и эти ошибки можно найти, проанализировать и не допускать впредь". И вот это утверждение уже безусловно конструктивно, безусловно полезно - пусть и вообще говоря ложно. Реальность такова, что готовность и привычка нести полную ответственность за результат, тенденция к самоанализу, к тщательному поиску ошибок даже там, где их нет, дает куда лучшие результаты, нежели постоянно маячащий стимул списать неудовлетворительный результат на невезение.
Другое популярное утверждение - "Начальник виноват во всем, что натворили его подчиненные". Очевидно, что начальник не сможет во всех деталях контролировать работу хотя бы десяти подчиненных, ну а если у каждого из десяти подчиненных есть свои подчиненные, контроль не может не быть очень и очень поверхностным. Начальник не может знать о том, что Вася поругался с женой и потому сегодня не способен работать с требуемым качеством. Бывает так, что Вася вообще сидит на проекте в двух тысячах километров от своего начальника. Очевидно, что если логически продолжить эту идею и например за каждую ошибку Васи штрафовать и Васю, и всю иерархию его начальников на одну и ту же сумму - следовательно, каждый начальник должен иметь зарплату не меньшую, нежели у всех его подчиненных вместе взятых. Таким образом, это утверждение ложно, но в то же самое время очевидно, что у одних начальников Вася ошибается часто, а у других - редко. Очевидно, что того Васю, который часто ошибается, один начальник отверг, а другой - взял. И что самое неприятное, очевидно, что в момент отказа от "начальник виноват..." организация начинает задвигать тех руководителей, которые чувствуют личную ответственность за результат и стимулировать выдвижение на ведущие роли тех начальников, все достоинства которых сводятся к умению вовремя сказать "виноват Вася, не я".
Резюмируя, в подобных ситуациях я занимаю сторону конструктивности. Пожалуй, родство и разницу истины и конструктивности хорошо иллюстрирует фраза, которую любил повторять мой научный руководитель: "Разница между математиком и программистом в том, что математик делает то, что можно, так, как нужно, в то время как программист делает то, что нужно, так, как можно". И если для достижения хорошего "нужно" требуется не совсем стандартное "можно".... будем делать то, что нужно.
Технические проблемы.
Наблюдая за дискуссиями, которые программисты ведут с программистами, я пришел к выводу, что нам часто не хватает осознания одного важного факта. Очень важного. Такого, который следует помнить гораздо тверже, нежели таблицу умножения в двоичной системе. И этот факт таков: пользователю до фонаря технические проблемы, с которыми мы сталкиваемся, и это совершенно, категорически правильно. Пользователя волнует и должно волновать одно: решение его, пользователя, задачи. Наша же первейшая задача - не создавать ему проблем вдобавок к тем, которые у него уже есть.
Про футбольных судей часто говорят: хорошего судью не видно на поле, игра идет как надо словно бы сама собой. Это верно для специалистов любой обслуживающей профессии, и для ИТшников - в первых рядах. Если пользователь держит телефонный номер айтишника на кнопке быстрого набора - значит, айтишник работает из рук вон плохо.
Хорошая программа - та, которая отвечает чаяниям пользователей [и это не означает запрет писать "для души". Программист - вполне может быть пользователем своей программы и вкладывать в нее свои чаяния]. И вот тут зарыт камень, о который мы часто спотыкаемся - изменение программного решения, видимого пользователю интерфейса, ради решения технических задач.
Идеальный программист, работая на идеальном компьютере, сделает пользователю программу, которая обработает миллиард записей за миллиардную долю секунды. Пока что, к сожалению, этот идеал недостижим - и это плохо. Каждый раз, когда желание пользователя разбивается о техническую проблему, программист обязан испытывать стыд за беспомощность - личную беспомощность, беспомощность выбранной (кем, кстати?) технологии, за свою профессию, наконец.
Вместо этого получается так, что программист перекладывает свой груз на пользователя. Программист говорит, допустим, "сервер плохо справляется с долгими блокировками" - и заставляет пользователя решать конфликты параллельных обновлений. Программист говорит "индексы не пригодны для поиска по последним символам" - и заставляет пользователя искать только по первым. Да этот программист обязан сгореть со стыда в тот момент, когда, показывая нефункционального уродца, произносит "но ведь веб иначе не умеет" - а он вместо этого толкает стандартную речь про "не нужно инсталляции" и "доступно в любой точке мира" и агитирует других плодить таких же уродцев.
Один мой знакомый сказал в свое время хорошую фразу: "За что я ненавижу советских инженеров, так это за полную неспособность объяснить разницу между Ford Fusion и Volkswagen Golf без использования слова "инжектор"". Помните: пользователь не должен знать ни про какой "инжектор", и не будет знать, если тот не сломается. Пользователь знает про скорость движения, про руль, догадывается, что колес четыре, а самое главное - цвет кузова и обивка салона. Ваша задача - выбрать инжектор и все прочее, что этому соответствует. Да, технические проблемы ограничивают наши возможности, и может случиться так, что требуемый двигатель просто не впишется в дизайн кузова. И Ваша квалификация как разработчика однозначно определяется тем, насколько часто случаются коллизии. Каждый раз, когда Вы пытаетесь объяснить пользователю, что, например, слишком длинные выборки обрезаются до тысячи записей - думайте о том, что Вы пытаетесь объяснить ему, что инжекторный двигатель не совместим с выбранным цветом автомобиля, и выглядите столь же беспомощно и глупо.
--------------------------------------------------------
1 Существует совершенно замечательный афоризм с этой же основной мыслью. Он звучит так: "Если бы ты смог отвесить пенделя человеку, виновному во всех твоих неприятностях, ты бы потом три дня не смог сидеть".
http://softwarer.ru/philosophy.html