Программистам присуще рассматривать сложные комплексные системы так, как это делают математики, оттого совсем не удивительно, что они не похожи на большинство других людей. Вот что я под этим подразумеваю: вообразите, что вы подкинули монетку 1 000 000 раз, и 999 000 раз она упала орлом вверх и всего один раз – решкой. С точки зрения математика, это опровергает утверждение о том, что монетка всегда падает орлом вверх. Тот единственный раз, когда она упала решкой вверх, делает все утверждение неверным. В терминах математики утверждение является истинным, только когда оно истинно всегда. Такой ход мыслей привычен для Хомо логикус и кажется им логичным, потому что именно такое поведение свойственно компьютерам.
Большая же часть обычных людей, напротив, будет считать, что описанное выше утверждение является истинным, ведь это подтверждается преобладающим количеством раз, когда монета упала орлом вверх. Более того, они также будут уверены, что это утверждение не просто истинно, но его истинность является сокрушительной, убедительной и неоспоримой. Миллион против одного, что оно верно! Свойством человеческого разума является считать подобные события, где вероятность миллион к одному, однозначными. Это вероятность, с которой не поспоришь. Меня скорее ударит молния или я случайно упаду с моста, чем монетка упадет решкой вверх.
Вероятность того, что утверждение о монетке истинно, невероятно огромна, а человек вида Хомо сапиенс живет в мире вероятностных событий. Тем не менее вероятность того, что утверждение ложно, все же возможна, а программисты существуют в мире возможностей. Если какое-то событие может случиться, оно должно быть учтено. В мире программного обеспечения, где решающую роль играют точные утверждения, нельзя упускать из виду даже события с ничтожной вероятностью.
Программисты обычно называют такие маловероятные события «исключениями». Вероятность наступления таких событий ничтожно мала, однако они могут вызвать серьезный сбой в работе программы, если не предусмотреть их наступление. Несмотря на их низкую вероятность, цена неподготовленности может быть очень высока. Так что маловероятные события являются вполне обыденной реальностью для программистов. И даже тот факт, что исключение может возникнуть только один раз в 79 лет при ежедневном использовании программы, совсем не меняет дела. Что будет, если этот единственный раз случится завтра?
Бесспорной отличительной чертой программиста-любителя от профессионала является навязчивая одержимость тщательно предусматривать возможные исключительные ситуации и готовиться к ним, как это делают путешественники. Но такое фанатичное стремление готовиться к исключительным ситуациям влечет за собой неминуемые последствия в виде пренебрежения теми событиями, которые имеют больший процент вероятности случиться. В результате на свет появляются программы, которые обладают взаимодействием, напичканным редкими или невостребованными функциями, которые затрудняют работу с тем, что действительно важно и часто применяется. Вот одна из самых распространенных жалоб пользователей: с программой сложно работать, потому что в ней слишком много разных настроек и все смешаны в одну кучу, без какого бы то ни было разделения.
Такая щедрость в добавлении множества ненужных и нежеланных функций как следствие программистского мышления в категориях возможного – это прекрасный пример того, что По Бронсон называет «великодушие в эгоизме». Они наполняют программные функциональные возможности тем, что нужно им самим.
Распространенная в среде программистов шутка гласит, что в мире существует только три цифры: 0, 1 и бесконечность. В применении к компьютерному миру она действительно справедлива. Внутри двоичной вычислительной системы событие либо происходит, либо нет – соответственно, это 1 или 0. Если же какое-то событие может произойти больше одного раза, значит, оно может повториться бесконечное количество раз.
Код установки программы и завершения ее работы пишется таким образом, что может быть выполнен только один раз. При попытке программы повторно выполнить этот код может возникнуть системный сбой или как минимум могут появиться ошибки в работе программы. Фрагменты кода других частей программы пишутся таким образом, чтобы выполняться повторно. Фактически любая часть программы, которая может выполниться не менее двух раз без сбоев, может выполняться сколько угодно раз. С точки зрения кода и программиста вида Хомо логикус нет большой разницы между двумя запусками программы и двумя миллионами запусков.
Мышление обычных людей отличается от мышления программистов. Они оперируют такими цифрами, как 0 и 1, но не менее уверенно они пользуются, например, цифрами 2, 7 и числом 31. Большинству людей гораздо легче представить 300 вещей, нежели миллион. Обычный человек исчисляет вещи такими количественными величинами, которые неведомы программистскому разуму. К примеру, ярые поклонники катания на лыжах могут потратить на это занятие около десяти выходных в сезон. Если взять 40 лет активного катания, то в общем количество таких вылазок будет менее 500 – и это за всю жизнь! Для современного цифрового компьютера обработка 500 объектов займет доли секунды. Даже самый увлеченный пользователь какой-либо программы запустит ее не больше нескольких тысяч раз, при этом программисты все еще мыслят категориями бесконечных чисел.
Хорошим программистам свойственно целенаправленно закрывать глаза на существование на практике таких чисел, как 500, так как это позволяет им подготовить программы к возникновению 501-го раза. Именно это подразумевает По Бронсон под описанием второго навыка высокоэффективного инженера: «Чем меньше они видят, тем лучше для них».