Лекция 1. Бритва Оккама в программировании

Начать хотелось бы с напоминания о философской концепции, хорошо известной программистам - Бритве Оккама. Этот методологический принцип гласит: "Не следует привлекать новые сущности без самой крайней на то необходимости".

Человеческая память безгранична. Каждый, наверно, удивлялся, как легко удается вспомнить текст песни, услышанный 15, 20 или даже 30 лет назад, причем всего один раз. А вот решить уравнение двумя разными способами гораздо сложнее, даже если знаешь оба. Мозг часто отказывается выполнять двойную "вычислительную" работу. Способ, которым работа выполняется обусловлен зачастую не эффективностью его самого, а привычками, модой, инструментарием, который оказался под рукой.

Соотношение запоминательных и творческих возможностей мозга приблизительно равно соотношению динамики роста емкости жестких дисков и частот, на которых работают процессоры компьютеров. Если за последние 20 лет типичная емкость жесткого диска увеличилась с 10 Мб до 500 Гб (в 50000 раз), то частота процессора - всего лишь с 10МГц до 4ГГц (всего в 400 раз). Эта нехитрая арифметика иллюстрирует тот факт, что "принятие решений" стоит гораздо дороже, чем простое хранение информации.

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

Культура, цивилизация создают иллюзию интеллектуального всемогущества современного человека. Компьютерные технологии эту иллюзию усилили многократно. Кажется, что стоит лишь хорошенько порыться в справочниках плюс несколько ночей отказать себе в полноценном сне, иными словами слегка "напрячься", и выдающееся интеллектуальное творение (компьютерная программа, литературное произведение и т.п.) будет явлено миру. В молодости, наверно, каждый испытывал подобные порывы творческого энтузиазма. В молодости не хочется верить в такие поговорки, как "укатали Сивку крутые горки", "гладко было на бумаге, да забыли про овраги". Однако на практике очень многое зависит от правильного выбора методологии, от способа, которым достигнут результат. "Цена вопроса" может оказаться непреемлимо высокой, даже если результат достигнут. Эта проблема занимала еще античных авторов ("пиррова победа", "сизифов труд" и т.п.). Профессионал, да и просто человек зрелый и опытный. не может позволить себе приступать к делу хотя бы на 80% не рассчитав силы и ресурсы (на 100% расчитать их не получается, наверно, ни у кого и никогда, если речь не идет совсем уж о примитивных задачах).

Сегодня, наверно, ни для кого не секрет, что компьютер - это не только мощный инструмент для решения широкого круга задач, но и источник вполне конкретных проблем. Есть даже немало людей, считающих, что некоторые задачи легче решать без компьютера, чем с его помощью. Например, журналист старой закалки напишет материал на бумаге быстрее, чем его молодой коллега за компьютером. Хотя бы за счет того, что на приведение электронного устройства в рабочее состояние (загрузка, открытие текстового редактора) требуется несколько минут. За это время с помощью ручки и бумаги можно создать вполне готовую к публикации заметку. Компьютерная программа, как и газетный материал, рождается в голове человека, и никакие "сверхудобства" не заменят возможности быстро и адекватно зафиксировать удачную мысль. Иногда листок бумаги и огрызок карандаша более пригодны для этого, чем Eclipse. Такая же ситуация с бухгалтерией: старожилы в один голос говорят, что до появления компьютеров бухгалтеров было меньше, а объем производства в стране - больше. Парадокс, э?

Млжно сказать, что появилась проблема избыточности возможностей компьютера: энергия использующего это устройство человека тратится не на решение практических задач, а на освоение всё новых и новых программ и возможностей этих программ. Причем многие из таких возможностей являются не более, чем декларациями.

Производители ПО зачастую заманивают пользователей обещаниями облегчить труд, автоматизировать выполнение тех или иных задач. На поверку же оказывается, что заменить человека в некоторых делах не так-то просто. Например, каждый пользователь сталкивался с неуместным "умничатьем" некоторый приложений. Например, Microsoft Word делает прописной букву, следующую за словом с точкой. Многим это нравится. (Такие люди, наверно, и заполонили Интернет безграмотной писаниной). Не могу сказать, что пишу слишком уж грамотно, тем всегда держу и буду держать эту опцию отключенной. По крайней мере до тех пор, пока MS-Word не будет руководствоваться правилами более сложными, чем "если слово закончилось точкой, то следующая буква должна быть заглавной". Здесь мы имеем дело не просто с избыточностью, а с дурной избыточностью, когда компьютер предлагает не решегие проблемы, а суррогатное решение, иллюзию решения, подменяя красивыми элементами GUI-интерфейса сложную задачу проверки грамматики, которую образованный человек и так прекрасно выполнит. Такие "удобства" делают и без того безграмотных и слишком уж надеющихся на компьютер людей еще более безграмотными.

Можно привести массу других примеров мешающей избыточности компьютерных программ: вставляешь диск в дисковод - его пытаются воспроизвести совершенно неадекватным проигрывателем. Сохраняешь документ - его предлагают поместить в папку с дурацким названием. Конечно, всё это настраивается, но речь о другом: следует ли пользоваться всеми этими странными возможностями, "заботливо" кем-то для вас предусмотренными?

IDE - программы для создания программ - тоже страдают "дурной избыточностью" (по аналогии с гегелевской "дурной бесконечностью"). Визарды, десятки возможностей, воспользоваться которыми многим не придет даже в голову, и прочая мишура скорее служит для "завоевания рынка" и отдаляет программиста от реального результата, чем способствует повышению производительности труда. Возможно, в случаях, когда коллектив из десятков кодеров трудится над созданием сложного проекта, такие вещи, как Eclipse и незаменимы. Но рынок нуждается не в программах-монстрах, а в небольших приложениях для решения конкретных прикладных задач или даже в расширении возможностей уже имеющихся решений за счет написания дополнительных модулей и плагинов. В таких условиях использовать Eclipse - всё равно что стрелять из пушки по воробьям. Точно так же, как для написания служебной записки на два-три абзаца совсем необязательно открывать Microsoft Word или другой громоздкий редактор.

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

Язык Java и пакеты, включенные в стандартный дистрибутив JDK это уже само по себе огромное богатство, которое не нуждается в красивых обертках. Использовать сложные IDE - значит тратить время не на освоение языка, а на освоение приемов работы с инструментами, на смену которым завтра придут другие, радикально отличающиеся от существующих, ставя своих приверженцев перед необходимостью опять переучиваться. И хотя человеческая жизнь достаточно длинна для того, чтобы время от времени позволять себе такую роскошь, но гонка вооружений в сфере IT, свидетелем которой я стал в последние 15 лет свидетельствует, что КПД от таких переучиваний может быть не только нулевым, но и отрицательным.

Среда 3f-lab, которую я предлагаю здесь вашему вниманию, как раз и создана с учетом принципа необходимой достаточности. Это не программа, которую нужно инсталлировать. Это просто совокупность каталогов и приемов работы, некоторые из которых могут быть оформлены в виде скриптов (раньше я пользовался скриптами Makefile, теперь всё чаще применяю ant). 3f-lab - это не IDE, это дисциплина, то есть соображения по поводу того, как лучше достичь определенного результата и почему те или иные действия (хранение файлов, компиляция, дистрибуция) нужно выполнять так, а не иначе.

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

Copyright (C) 2009 Михаил Беляков