?

Log in

No account? Create an account

Previous Entry | Next Entry

http://www.google.com/search?q=pdf+Are+Programming+Languages+Improving

Computer Code as a Medium for Human Communication:

Are Programming Languages Improving?


Gilles Dubochet, 2009


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

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

Разумеется, когда мы говорим о кратком коде, мы не имеем ввиду синтаксическую краткость — отсутствие лишних пробелов, переводов строк, упаковывание повторяющихся последовательностей операций в текстовые макросы, etc. Краткость, которую имеет смысл рассматривать, достигается использованием абстракций более высокого уровня. Например, использование свёрток списков или деревьев вместо ручного их обхода.

Аргумент от Java/C++ программистов — использование слегка более многословного кода позволяет быстрее и эффективнее донести суть алгоритма до читателя кода. Реакция Java программистов на Haskell-код — этот ваш хаскель сложно понимать, ибо в нём нездоровое количество функциональности на единицу текста.

Аргумент от программистов на языках, допускающих написание существенно более коротких программ — короткий код позволяет человеку выражать более высокоуровневые концепции, наверняка более приближенные к предметной области, и поэтому понимание кода происходит быстрее и эффективнее. Реакция Python программистов на Java код — за деревьями не видно леса: большое количество церемоний вокруг простейших вещей напускает ненужный туман на ту мысль, которую программист пытался этим кодом донести.

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

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

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

Гипотеза номер два. Намёки на модель предметной области, выраженные в типах, именах переменных, и т. п., позволяют привязаться к модели предметной области. Например, понятие объединения из реляционной алгебры может быть выражено через функцию по имени join, а может быть через функцию с похожим названием (enhance_with?), но не имеющую названия, взятого напрямую из предметной области.

Gilles дал некоторому количеству испытуемых код на Scala, по-разному реализующий некий набор алгоритмов из реляционной алгебры. Вот такие три варианта были разработанны:

S/GD/UD/G
Sparse/GroundedDense/UngroundedDense/Grounded
Код на Scala, использующий только конструкции, доступные в Java.
Этот код имеет привязки к реляционной алгебре с помощью имён переменных, функций, типов, etc.
Компактный код на Scala, использующий более высокоуровневые конструкции, доступные в Scala. Код не имеет явных привязок к реляционной алгебре.Компактный код на Scala, имеющий привязки к реляционной алгебре


Читателям кода давались на ознакомление концепции реляционной алгебры, а затем следовала просьба изучить предлагаемые варианты кода, реализующие некоторые алгоритмы из неё: natural join, left outer join, cartesian product. После вникания в код (обычно испытуемые справлялись с этим за 45-60 минут), испытуемые должны были написать "контракты", которым следует код: списки предусловий и постусловий, которым отвечает логика алгоритмов. Этим проверялась степень понимания кода. Параллельно использовался специальный девайс для слежения за глазами, чтобы понять, какие языковые конструкции привлекают максимум внимания на этапе изучения кода.






Рис. 3. Для каждого стиля программирования показано нормализованное время, затраченное на чтение кода алгоритма.

Рис. 4. Для каждого стиля программирования показаны среднее нормализованное время, затраченное на рассматривание одного лексического токена в программе, независимо от его природы.





Рис. 9. Снимок экрана с кодом, как он был показан испытуемым во время эксперимента, с картой распределения концентрации внимания. Алгоритм слева — S/G, читаемый испытуемым 7, алгоритм справа — D/U, читаемый испытуемым 12. Обратите внимание на то, что фиксация внимания на именах идентификаторов, наблюдаемая для кода в стиле S/G, в коде стиля D/U отсутствует.


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

Экспериментальные результаты показывают, что код на Scala, написанный с использованием продвинутых, абстрактных конструкций, лучше чем код, написанный в стиле, схожем с Java. Разница во времени понимания испытуемыми материала статистически значима, несмотря на малый размер выборки. Касательно достигаемого степени понимания, неформальные замечания, сделанные испытуемыми, дают субъективное подтверждение этому — использование продвинутых конструкций упрощает задачу понимания кода. Интересно отметить, что преимущества использования Scala были видны даже в группе, состоящей из программистов с ограниченным пониманием общих концепций Scala.
[…]
Неожиданностью оказалось наблюдение, что время понимания смысла токена не отличалось, несмотря на разный когнитивное содержание токена. (Шрифт мой — lionet). Если это свойство может быть обобщено, это дало бы дизайнерам языков точную цель: чем короче код, тем лучше. Это также может объяснить, почему языки предметной области (DSL) так эффективны.


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

Tags:

Comments

( 125 comments — Leave a comment )
dizel_by
Mar. 21st, 2010 03:11 am (UTC)
Давно хочу понять Haskell (базовые знания elisp есть, но они не помогают). Понять в первую очередь в ключе "для каких целей его лучше использовать и почему именно его", а не математический бэкграунд (нужно будет - это вспомню и доучу). Посоветуйте плиз какой-нибудь текст по этому поводу и пару простых примеров из реальной жизни, которые красиво реализуются на Haskell именно из-за его особенностей. Заранее спасибо.
ex_juan_gan
Mar. 21st, 2010 03:22 am (UTC)
Real World Haskell - лучшая книга, чтобы современному программисту преодолеть этот концептуальный барьер.

Мне как-то тут недавно понадобилось бинарные файлы в хекс текст переводить (и обратно) - ну вот накатал такой адхок:

import System.IO
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.Char8 as C
import Data.Word
import Text.Printf

convert :: [Word8] -> String
convert = concat . (map (printf "%02x"))

bytes2hex = convert . L.unpack

main = do
  hSetBinaryMode stdin True
  bin <- L.getContents
  putStrLn (bytes2hex bin)



Конечно, мог бы и на джаве или скале или питоне, но бойлерплейта шибко много было б.

Edited at 2010-03-21 03:24 am (UTC)
(no subject) - dizel_by - Mar. 21st, 2010 03:24 am (UTC) - Expand
В питоне это встроенное - zhengxi - Mar. 21st, 2010 03:32 am (UTC) - Expand
(no subject) - levgem - Mar. 21st, 2010 08:48 am (UTC) - Expand
(no subject) - voidex - Mar. 21st, 2010 11:29 am (UTC) - Expand
(no subject) - thesz - Mar. 21st, 2010 11:54 am (UTC) - Expand
(no subject) - levgem - Mar. 21st, 2010 11:58 am (UTC) - Expand
(no subject) - thesz - Mar. 21st, 2010 12:11 pm (UTC) - Expand
(no subject) - ex_juan_gan - Mar. 21st, 2010 05:06 pm (UTC) - Expand
(no subject) - faceted_jacinth - Mar. 21st, 2010 08:12 pm (UTC) - Expand
(no subject) - voidex - Mar. 21st, 2010 09:44 pm (UTC) - Expand
(no subject) - lionet - Mar. 22nd, 2010 09:22 am (UTC) - Expand
(no subject) - faceted_jacinth - Mar. 22nd, 2010 11:43 am (UTC) - Expand
(no subject) - lionet - Mar. 22nd, 2010 07:46 pm (UTC) - Expand
(no subject) - faceted_jacinth - Mar. 22nd, 2010 08:00 pm (UTC) - Expand
(no subject) - lionet - Mar. 22nd, 2010 08:01 pm (UTC) - Expand
(no subject) - faceted_jacinth - Mar. 22nd, 2010 08:12 pm (UTC) - Expand
(Deleted comment)
(no subject) - lionet - Mar. 23rd, 2010 04:26 am (UTC) - Expand
(no subject) - inv2004 - Dec. 14th, 2011 11:19 pm (UTC) - Expand
(no subject) - jdevelop - Mar. 21st, 2010 11:21 am (UTC) - Expand
(no subject) - nponeccop - Mar. 22nd, 2010 06:59 pm (UTC) - Expand
(no subject) - jdevelop - Mar. 22nd, 2010 08:28 pm (UTC) - Expand
оффтоп - nponeccop - Mar. 23rd, 2010 08:44 am (UTC) - Expand
Re: оффтоп - lionet - Mar. 23rd, 2010 08:46 am (UTC) - Expand
Re: оффтоп - alk0 - Dec. 24th, 2010 08:10 am (UTC) - Expand
ex_juan_gan
Mar. 21st, 2010 03:13 am (UTC)
Я отсюда понял только одно: при всех прочих параметрах равных, короткие имена облегчают восприятие.

Ашриниванисавараванараян vs Аш.

Руководство к действию.
zhengxi
Mar. 21st, 2010 03:30 am (UTC)
И поменьше пустых строк и строк, состоящих из одной закрывающей скобки.

Бывает, инициализацию констант пишу так (код на Питон):

SEEK_SET, SEEK_CUR, SEEK_END = 0,1,2

вместо:

SEEK_SET = 0
SEEK_CUR = 1
SEEK_END = 2

Не был уверен, что это для других так же читаемо как для меня, но теперь буду посмелее так делать.
(no subject) - lionet - Mar. 21st, 2010 03:33 am (UTC) - Expand
(no subject) - rssh - Mar. 21st, 2010 07:33 am (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 07:19 pm (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 03:33 am (UTC) - Expand
itman
Mar. 21st, 2010 03:20 am (UTC)
Они пугают нас словами статистически значимый!

http://www.youtube.com/watch?v=wX5II-BJ8hI&feature=PlayList&p=53952012913C7C24&playnext=1&playnext_from=PL&index=43
lionet
Mar. 21st, 2010 03:44 am (UTC)
У него был приборчик, ему можно.
(no subject) - itman - Mar. 21st, 2010 04:12 am (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 04:24 am (UTC) - Expand
(no subject) - itman - Mar. 21st, 2010 05:01 am (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 05:05 am (UTC) - Expand
(no subject) - itman - Mar. 21st, 2010 05:25 am (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 05:25 am (UTC) - Expand
(no subject) - itman - Mar. 21st, 2010 05:46 am (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 06:01 am (UTC) - Expand
(no subject) - itman - Mar. 21st, 2010 06:10 am (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 06:16 am (UTC) - Expand
(no subject) - itman - Mar. 21st, 2010 06:31 am (UTC) - Expand
(no subject) - voidex - Mar. 21st, 2010 11:44 am (UTC) - Expand
(Deleted comment)
(no subject) - itman - Mar. 21st, 2010 09:02 pm (UTC) - Expand
(Deleted comment)
(no subject) - enternet - Mar. 23rd, 2010 10:30 am (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 09:07 pm (UTC) - Expand
(no subject) - alpha_cygnus - Mar. 22nd, 2010 09:05 pm (UTC) - Expand
(no subject) - lionet - Mar. 23rd, 2010 04:17 am (UTC) - Expand
(no subject) - alpha_cygnus - Mar. 23rd, 2010 09:38 am (UTC) - Expand
(no subject) - alpha_cygnus - Mar. 22nd, 2010 09:08 pm (UTC) - Expand
(no subject) - lionet - Mar. 23rd, 2010 04:18 am (UTC) - Expand
(no subject) - alpha_cygnus - Mar. 23rd, 2010 09:35 am (UTC) - Expand
(no subject) - alpha_cygnus - Mar. 25th, 2010 09:29 am (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 06:05 am (UTC) - Expand
(no subject) - metaclass - Mar. 21st, 2010 10:45 am (UTC) - Expand
(no subject) - itman - Mar. 21st, 2010 02:48 pm (UTC) - Expand
(no subject) - yakov_sirotkin - Mar. 21st, 2010 06:37 am (UTC) - Expand
(no subject) - rssh - Mar. 21st, 2010 07:12 am (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 07:20 pm (UTC) - Expand
(no subject) - yakov_sirotkin - Mar. 21st, 2010 08:58 pm (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 09:04 pm (UTC) - Expand
(no subject) - beroal - Mar. 21st, 2010 06:49 pm (UTC) - Expand
(no subject) - itman - Mar. 21st, 2010 07:02 pm (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 07:24 pm (UTC) - Expand
(no subject) - itman - Mar. 21st, 2010 07:35 pm (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 07:41 pm (UTC) - Expand
(no subject) - itman - Mar. 21st, 2010 07:43 pm (UTC) - Expand
(no subject) - beroal - Mar. 22nd, 2010 12:53 am (UTC) - Expand
justy_tylor
Mar. 21st, 2010 03:47 am (UTC)
В принципе, всё начинается с юзабилити. Можно адаптировать простейшие приёмы (процент значащих символов от количества символов на экране, модель KLM, ...) и сделать рассчёты для языков.

Излишки шума в Java, сухость APL, дополнительные издержки языков с префиксной нотацией или свойства хаскельной layout - всё это вполне вычислимо. Но есть ещё один важный элемент - культура программирования.

Профессионал может использовать APL, Haskell - что угодно. Но если менеджить стадо студентов, то пусть лучше пишут на Java, Scala, или ещё чём-то не требующем хорошей культуры. Главное чтобы архитектор отдельный был. Впрочем, если самому архитектором, то придётся выбирать другие языки и искать более культурных студентов - иначе тошно. :)
lionet
Mar. 21st, 2010 03:52 am (UTC)
У меня мнение такое, что как раз Java требует высокой культуры. И, тем более, C++ требует. Так как шаг влево, шаг вправо — грабли. Мутабельность одна чего стоит.

А вот как раз Haskell культуры такой не требует — усидчивости только. В правильную колею тебя сам компилятор введёт, ничего ты особо лишнего не сделаешь.
(no subject) - justy_tylor - Mar. 21st, 2010 04:25 am (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 04:26 am (UTC) - Expand
(Deleted comment)
(no subject) - lionet - Mar. 21st, 2010 10:12 pm (UTC) - Expand
(no subject) - thesz - Mar. 21st, 2010 12:02 pm (UTC) - Expand
(no subject) - justy_tylor - Mar. 21st, 2010 12:37 pm (UTC) - Expand
(no subject) - thesz - Mar. 21st, 2010 12:50 pm (UTC) - Expand
(no subject) - jdevelop - Mar. 21st, 2010 08:57 pm (UTC) - Expand
(no subject) - thesz - Mar. 21st, 2010 09:06 pm (UTC) - Expand
(no subject) - jdevelop - Mar. 21st, 2010 11:30 am (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 08:14 pm (UTC) - Expand
(no subject) - jdevelop - Mar. 21st, 2010 08:40 pm (UTC) - Expand
(no subject) - thesz - Mar. 21st, 2010 09:19 pm (UTC) - Expand
(no subject) - nponeccop - Mar. 22nd, 2010 07:59 pm (UTC) - Expand
(no subject) - thesz - Mar. 22nd, 2010 09:04 pm (UTC) - Expand
(no subject) - nponeccop - Mar. 23rd, 2010 11:26 am (UTC) - Expand
(no subject) - thesz - Mar. 23rd, 2010 07:31 pm (UTC) - Expand
mynegation
Mar. 21st, 2010 06:04 am (UTC)
Может я чего недопонял, но у меня сразу появились сомнения по поводу отсутствия различия между D/U и D/G. И вот что я нашел в оригинале статьи:

On the other hand, identifiers used as grounding hints have no measurable positive impact on that time, despite the fact that subjects had been reminded of the existence of the conceptual model that was used for grounding. However, the fact that the sample did not contain
subjects with a thorough prior knowledge of the model must be taken into account.


Выделение мое - mynegation.

Если испытуемые не были знакомы с реляционной алгеброй, так какая им разница как называть функцию - join или enhance_with - модель в голове все равно строить с чистого листа. Испытуемые, знакомые с моделью, наверняка построили бы инварианты быстрее, а самые умные написали бы их и без чтения кода.

Я всегда стараюсь привязать код к предметной области настолько асколько это возможно без ущерба для других характеристик (производительности, правильного дизайна, устойчивости к ошибкам...). Зачем множить количество глоссариев без надобности?
lionet
Mar. 21st, 2010 06:12 am (UTC)
I.
Если испытуемые не были знакомы с реляционной алгеброй

1. subject with a thorough prior knowledge
2. Sub jects are first presented with a short textual description of the concepts of relational algebra and with its vocabulary. In this experiment, relational algebra is the domain model
against which code can be grounded.


II.
… появились сомнения по поводу отсутствия различия между D/U и D/G

А кто утверждает про наличие отсутствия различия? Автор статьи не утверждает, я не утверждаю.

Но вот прямо сейчас попробую мою интерпретацию дать, предварительную. Мне кажется, что отсутствие убедительной, системной экспериментальной разницы между восприятием D/U и D/G, кроме неудачности эксперимента, может объясняться именно этим — отсутствием разницы. То есть, народу действительно неважно, привязаны ли алгоритмы к теории, чтобы построить выполняемые инварианты и контракты на функции. Это может ничего не говорить о том, сколько у испытуемых заняло бы времени расширить и дополнить код.
(no subject) - mynegation - Mar. 21st, 2010 06:50 am (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 07:32 pm (UTC) - Expand
(no subject) - singalen - Dec. 16th, 2011 01:25 pm (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 06:20 am (UTC) - Expand
(no subject) - mynegation - Mar. 21st, 2010 07:12 am (UTC) - Expand
(no subject) - levgem - Mar. 21st, 2010 12:00 pm (UTC) - Expand
(no subject) - alpha_cygnus - Mar. 22nd, 2010 09:17 pm (UTC) - Expand
(no subject) - gabriel_irk - Mar. 21st, 2010 07:25 am (UTC) - Expand
tzirechnoy
Mar. 21st, 2010 08:14 am (UTC)
Рис. 3 и Рис. 4 ведут на одну картинку.
lionet
Mar. 21st, 2010 07:35 pm (UTC)
Ну хоть один нашёлся, кто пост прочитал. Fixed, thanks!
sleepy_drago
Mar. 21st, 2010 08:19 am (UTC)
прошу прощения за мой фр. но это мне напомнило "как биологи чинили радио" (видел на LtU).

если нужно могу изложить свое имхо :)
nealar
Mar. 21st, 2010 02:15 pm (UTC)
нужно
(no subject) - sleepy_drago - Mar. 21st, 2010 06:33 pm (UTC) - Expand
wakes_up
Mar. 21st, 2010 11:32 am (UTC)
> Важной вариацией на тему понятности кода является вопрос о том, легче ли понимать более короткий код, или краткость кода может предъявлять слишком много требований к читающему. В своём крайнем выражении аргумент звучит так: что лучше, сидеть и целый час корпеть, пытаясь понять, что делают эти компактные пять строчек программы, или же это час можно затратить на то, чтобы не спеша и не напрягаясь разобрать два-три экрана эквивалентного "несжатого" кода.

Мне кажется, что просто не так стыдно для себ кропеть час над 2мя страницами, чем час над парой строк :)
(Deleted comment)
vit_r
Mar. 21st, 2010 01:22 pm (UTC)
По-моему, порочна сама заложенная в основу такого рассмотрения идея. Код - живой.
lionet
Mar. 21st, 2010 07:37 pm (UTC)
Код — живой, действительно. Это не отменяет того, что данная активность (прочитать, понять, построить модель у себя в голове) — важная составляющая программистской деятельности, и её можно тыкать палочкой независимо от других.
(no subject) - vit_r - Mar. 21st, 2010 07:45 pm (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 08:07 pm (UTC) - Expand
(no subject) - vit_r - Mar. 21st, 2010 08:16 pm (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 08:19 pm (UTC) - Expand
(no subject) - vit_r - Mar. 21st, 2010 08:26 pm (UTC) - Expand
(no subject) - lionet - Mar. 21st, 2010 08:59 pm (UTC) - Expand
(no subject) - vit_r - Mar. 21st, 2010 09:03 pm (UTC) - Expand
potan
Mar. 21st, 2010 07:09 pm (UTC)
Если область видимости идентификатора порядка экрана, то осмысленность названия не важна. Пока рассматриваешь его определение имя успеваешь запомнить.
Вот если бы они проверяли значимость именования не некомпактном коде...
lionet
Mar. 21st, 2010 07:39 pm (UTC)
1. Там был код на сотни строчек. Снимок экрана — это просто снимок одного экрана этого кода.
2. Тезис про то, что имена чего-то значат, был признан inconclusive. Так что смысла нет обсуждать имена идентификаторов — автор говорит, что статистически значимой была только длина кода, даже если иметь одни и те же идентификаторы (S/G vs. D/G).
(no subject) - _slw - Mar. 23rd, 2010 12:50 pm (UTC) - Expand
permea_kra
Mar. 21st, 2010 09:19 pm (UTC)
>Разумеется, когда мы говорим о кратком коде, мы не имеем ввиду синтаксическую краткость
А почему? Понятно, что синтаксис, в общем, вторичен. Но утверждение, что он вообще не влияет на читабельность, вряд ли верно. В патологических случаях(неименованная нетипизированная лямбда и пара текст/математическая нотация), очевидно, влияет. А в непатологических?

( 125 comments — Leave a comment )

Profile

lionet
Lev Walkin
Website

Latest Month

December 2016
S M T W T F S
    123
45678910
11121314151617
18192021222324
25262728293031
Powered by LiveJournal.com
Designed by yoksel