пятница, августа 03, 2007

К вопросу о "стандартах кодирования"

На форуме Artima Developer Spotlight появилась тема: "What's the Most Effective Code Style Policy?", посвящённая обсуждения "стандартов кодирования".

Немного о терминологии

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

Рассмотрим возможные смыслы термина:

  1. Стиль и синтаксис форматирования исходного кода программы
    • Расстановка скобок
    • Использование пробелов и пустых строк
    • Правила написания выражений (for, if, while и так далее)
    • Правила именования переменных
    • Правила объявления переменных
    • Правила написания комментариев
    • Правила использование отступов
  2. Иногда к содержанию первого пункта могут быть добавлены элементы "управления конфигурацией"
    • правила именования файлов
    • структура файлов проекта
    • правила использования системы контроля версий
    • стандартизация используемых средств разработки
  3. Иногда к стандартам кодирования могут также быть добавлены "best practices" того, как надо писать программы, в зависимости от определённого языка программирования, среды разработки, компании или специфики разрабатываемого продукта (типичным примером может служить требование "всегда создавать в классе виртуальный деструктор", для C++)
Конечно же, "стандарты кодирования" могут включать в себя содержимое и всех пунктов сразу, и какую-то их смесь, а также что-то что здесь не упомянуто.

Мой взгляд

Здесь я хочу ответить на вопрос, заданный в теме на форму Artima - "What's the Most Effective Code Style Policy?".

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

Основной необходимостью существования "стандартов кодирования" обычно называют (некоторые части процитированы по Code Conventions for Java Programming Language, они отмечены '*'):
  1. Необходимость работ над одним и тем же исходным файлом нескольким программистам
  2. Улучшение "понятности" исходного кода, что позволяет программистам более полно и быстро понять новый для них код (*)
  3. Необходимость сопровождения (исправления ошибок, внесения небольших исправлений) кода и тот факт что в большинстве случаев споровождение осуществляется не тем же человеком, который является исходным автором кода. (*)
  4. Программист, работающий над исходным кодом, который написан не в "любимом" или "привычном" стиле будет тратить на его исправление больше времени (аргумент Bill Venners из исходного сообщения в форуме).
Моё мнение состоит в том, что усилия на создание и поддержание "стандартов кодирования" в большинстве случаев существенно выше чем затраты на "понимание" или поддержку кода, написанного "в другом стиле". Я конечно не имею ввиду примеры из "Obfuscated C Code Contest" :-) В большинстве случаев, код написанный вменяемым программистом понятен другому вменяемому программисту, вне зависимости от того, как именно расставлены в нем фигурные скобки или именованы переменные. Единственной неприятностью могут быть различия в настройках отступов и табуляций/пробелов, при просмотре кода различными текстовыми редакторами, просмотрщиками и программами сравнения.

Поэтому в моей голове всегда существовал такой "стандарт кодирования":
  1. Единообразная настройка длины табуляции (tab length)
  2. Использование пробелов вместо табуляций
  3. При правке кода пользоваться тем стилем, который используется в этом коде
Вот собственно и все. А если Вы или Ваш коллега пишете код в стиле "Obfuscated C Code Contest", то подумайте может проблема должна быть решена не при помощи "стандартов кодирования", а как-нибудь по-другому?

17458907.195e50a0db7e7428ccd693c67f635406.1186161181.ba176d26a55281a16d8fd8b02a541ce8
17458907.48319b4763d4aa2700c0fda3363b9fab.1186391267.b8da257c7d1fa1c830df3b9f73d6fb72

вторник, июля 31, 2007

"Вера" в науку

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

Именно этот вопрос и хочется обсудить. Является ли наука своего рода «верой»? Я осознаю, что затрагиваю в этом небольшом обсуждении такие вопросы, которыми занимались и продолжают заниматься великие мыслители и ни в коей мере не пытаюсь себя к ним причислить, но тем не менее мне кажется что многие их мысли так и не нашли своего читателя, во многом из-за не совсем внятного, перегруженного деталями изложения.

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

Введение

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

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

О научном мировоззрении

(заголовок взят из заголовка статьи В.И Вернадского «О научном мировоззрении», опубликованной в журнале «Вопросы философии и психологии», 1902)

Научные и религиозные мыслители отличаются друг от друга прежде всего мировоззрением. Именно поэтому сравнение или практически любые споры на темы «Есть бог или нет» между двумя достаточно разумными и эрудированными собеседниками никогда не могут закончится победой одного из них. У них просто разный взгляд на мир, разная картина мира, и у каждого из них она непротиворечива. Именно поэтому спор не может привести к чьей-либо победе, они оба правы. Поэтому же являются достаточно бессмысленными споры представителей религиозных конфессий или философских течений между собой – при условии непротиворечивости их построений (или неспособности спорщиков выявить противоречия), каждый останется при своём мнении и будет прав.

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

Как мне кажется (как я уже говорил, я не учёный и поэтому все здесь изложенное конечно же является спекуляцией), научное мировоззрение основано на нескольких «столпах»:

  1. Здоровый консерватизм
  2. Стремление к поискам истины, к открытию нового, к познанию окружающего мира
  3. Необходимость достоверности наблюдений
  4. Научный подход
  5. Непрерывность поиска истины

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

Стремление к поискам истины, представляет из себя обратную сторону консерватизма. Это собственно и есть мерило «здоровья» консерватизма. Каждое подтверждённое расхождение с господствующими в настоящий момент представлениями – это вызов учёным, «звоночек», прислушавшись к которому, необходимо расширять существующие теории или даже полностью отметать их и создавать новые. Абсолютных истин нет, каждый раз наука создаёт модели, все более приближающиеся к реальности, на основе того набора фактических данных, которыми она к данному времени располагает.

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

Научный подход представляет из себя способ исследования и получения новых знаний и обычно выглядит так:

  1. Наблюдение проблемы
  2. Предложение возможного объяснения проблемы – гипотезы
  3. Предсказание возможных последствий, в том случае если гипотеза верна
  4. Проверка предсказания

Необходимо также понимать разницу между гипотезами и теориями и «господствующими в настоящий момент в науке представлениями». Наличие огромного набора экспериментальных фактов вынуждает добросовестных учёных, создающих новые теории и гипотезы проверять практически все их. Это необходимо, либо для выяснения ложности фактов, либо для отбрасывания теории или гипотезы, как противоречащей наблюдениям. В каждый конкрентный момент в науке существует свод «господствующих представлений». Они не обязательно являются истинными. Помните, что наука – это набор последовательных моделей, которые должны приближаться к истине все больше и больше. Однако проверить то, приближается модель к истине или нет можно только лишь экспериментом. В разные времена господствовали разные научные представления, которые заменялись новыми с появлением новых экспериментальных фактов. И с каждым годом фактов становится все больше и больше! Поэтому старые, устаревшие или применимые только в частных случаях теории отбрасываются (или устанавливаются границы из применения, как с механикой Ньютона) и заменяются новыми, включающими их в себя, как частные случаи. В этом и состоит непрерывность поиска истины.Мы не можем быть уверены в том, что господствующие в данный момент научные преставления истинны и навсегда останутся таковыми. Мы можем лишь быть уверены в том, что они согласуются с теми набором достоверных экспериментальных фактов, которые накопило человечество (без сомнения может быть так что не все имеющиеся факты достоверны или в теориях есть ошибки).

Коренное отличие науки от религии и философии

Теперь, когда разобран вопрос о том, что представляет из себя научное мировоззрение можно ответить на основной вопрос статьи – является ли наука предметом веры?

Данный вопрос был затронут известным учёным, В.И. Вернадским в его работе "Научная мысль, как планетное явление" (написана в конце 1930-х годов).

В.И. Вернадский пишет:

"Есть одно коренное явление, которое определяет научную мысль и отличает научные результаты и научные заключения ясно и просто от утверждений философии и религии - это общеобязательность и бесспорность правильно сделанных научных выводов, научных утверждений, понятий, заключений. Научные, логически правильно сделанные действия имеют такую силу только потому, что [...] в ней [в науке] существует область фактов и обобщений, научных, эмпирически установленных фактов и эмпирически полученных обобщений, которые по своей сути не могут быть реально оспариваемы. Такие факты и обобщения, если и создаются временами философией, религией, жизненным опытом [...] не могут быть ими как таковые доказаны. [...] Общеобязательные научные истины не являются самоочевидными и должны во всех случаях непрерывно проверяться сравнением и реальностью. Эта реальная проверка составляет основную ежедневную работу учёного.
[...]
Как религий, так и философий, поэтических и художественных выражений, здравых смыслов, традиций, этических норм очень много, может быть [...] столько же, сколько отдельных личностей. Но наука одна и едина, ибо [...] они все связаны в единое научное построение и не могут логически противоречить одна другой.
"

Конечно, современная наука пропитана религиозными, политическими и философскими идеями, однако, как считал В.И. Вернадский «[…] есть часть науки общеобязательная и научно-истинная. Этим она резко отличается от всякого другого знания и духовного проявления человечества – не зависит ни от эпохи, ни от общественного и государственного строя, ни от народности и языка, ни от индивидуальных различий.

Это:

  1. Математические науки во всем их объёме
  2. Логические науки почти всецело
  3. Научные факты в их системе, классификации и сделанные из них эмпирические обобщения»

Хотелось бы отметить, что объяснение основных положений науки, научного мировоззрения, научного подхода требует на мой взгляд специального разъяснения, которое я в меру сил попытался дать в этой статье. Без такого разъяснения наука остаётся для далёких от неё людей слепой системой верований, которой она ни в коем случае не является.

17458907.195e50a0db7e7428ccd693c67f635406.1186148117.6d2ce9534a9cad439ee9664a6e39399e

суббота, июля 28, 2007

В защиту науки (несколько книг)

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

Так вот, современные научно-популярные книги, которые читать не менее интересно чем труды, например, Носовского и Фоменко, существуют (тиражи, правда сказать, невелики, 2500 - 3000 экземпляров).

Вот те из них, что мне удалось прочитать:

  1. Билл Брайсон. "Краткая история почти всего на свете"
  2. Л.Б. Вишняцкий. "История одной случайности или происхождение человека"
  3. Владимир Сурдин "Астрология и наука"
  4. Владимир Сурдин "НЛО: записки астронома"

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

Все книги очень рекомендуются к прочтению и выступают в защиту науки намного лучше любого специального бюллетеня.