lqp - Читаемость кода
November 19th, 2016
12:51 am

[Link]

Previous Entry Add to Memories Tell A Friend Next Entry
Читаемость кода
В последнее время снова начал читать книжки по программированию и около.

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

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

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

*) Читаемость кода есть функция от количества содержащегося в этом коде информации. Алгоритм, расписанный на 10 экранов всегда будет "более читаемым" в пересчете на экран текста, чем тот же алгоритм, расположенный на одном экране. Однако далеко не факт, что во втором случае понимание алгоритма целиком будет легче или быстрее, чем во втором. А так да, программист живенько топчет кнопки со стрелочками, процесс идет...

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

Tags:

(57 comments | Leave a comment)

Comments
 
From:[info]silly_sad
Date:November 18th, 2016 - 08:31 pm
(Link)
prosto pidarasy neverno ponjali slovo "chitajemostj".
kod dolzhen prozrachno sootvetsvovatj ispolnjajemym funkcijam -- otnoshenije mezhdu tekstovymi elementami i funkcionaljnymi dolzhno bytj PROSTYM.

vidish, net nikakogo chitatelja. kak v kvantovoj fizike net i ne dolzhno bytj "nabljudatelja"
From:[info]lqp
Date:November 18th, 2016 - 08:35 pm
(Link)
Что там насчет регэкспов? Или даже простейших хэшей?
From:[info]silly_sad
Date:November 18th, 2016 - 08:41 pm
(Link)
ja dumaju chto nechitajemostj regespov vyzvana chrezmernoj kompaktnostju, tojestj problema chisto fizicheskaja -- grubo govorja otlichenije tochek ot zapjatushek. eto problema drigogo urovnja. dlja razsmotrenija chitabeljnosti regexpov nado by ix razvernutj v normaljnyj jazyk.
From:[info]lqp
Date:November 18th, 2016 - 08:49 pm
(Link)
Нет, я про другое. Соотношение между текстом регекспа и реализующим его итеративным (или рекурсивным?) алгоритмом весьма нетривиально и я например этого алгоритма не знаю для большинства языков.
From:(Anonymous)
Date:November 18th, 2016 - 08:57 pm
(Link)
Есть книжка от O'Reilly которая исчерпывающе
освещает предмет

Для практического использования вам и не надо
знать внутренности 2х основных видов регэксп
машин.

Для практики есть маленькие utilities, на которых
вы пробуете свои регэкспы с разным input'ом,
обладая лишь общими знаниями (жадный, не-жадный
и т.д.)
From:[info]lqp
Date:November 18th, 2016 - 09:00 pm
(Link)
Во первых, сколь я помню, регекс-машина перла заметно сложнее чем та что описывается у орейли.

Во вторых, я отвечал на следующее утверждение
kod dolzhen prozrachno sootvetsvovatj ispolnjajemym funkcijam
From:(Anonymous)
Date:November 18th, 2016 - 09:14 pm
(Link)
Есть книжка от O'Reilly которая исчерпывающе
освещает предмет

Пёрловские регэкспы - основа этой книги

From:[info]lqp
Date:November 18th, 2016 - 11:31 pm
(Link)
Да только в перле с того момента много нового появилось.
From:(Anonymous)
Date:November 19th, 2016 - 09:40 am

"игры в которые играют люди"

(Link)
"игры в которые играют люди" - была такая книжка.

Вы играете в игру "хоть какой мне дай совет,
я всегда отвечу нет"

Ой, хны-нхы, памагиите, люди

-- ну вот можно так

нееет, это не пойдет

-- но тогда вот эдак

нееет, я точно знаю, что нет

-- но тогда шел бы ты, потому что ты
играешь в психиатрическую игру, а не
ищешь ответов для работы с реальностью
From:[info]lqp
Date:November 19th, 2016 - 09:33 pm

Re: "игры в которые играют люди"

(Link)
Так я не прошу мне обьяснит регекспы. Я их знаю. Я привожу пример того, что необхобимость однозначного соответствия между текстом и реализацией как минимум неочевидна.
From:[info]silly_sad
Date:November 18th, 2016 - 09:06 pm
(Link)
a zachem znatj algoritm?
eto jazyk drugovo urovnja :)
tebe nado znatj chto u tebja zapisano, a ne to kak ono budet realizovano.
From:[info]lqp
Date:November 18th, 2016 - 10:57 pm
(Link)
Это тавтология. Любой языек программирования по определению однозначно определяет, что записано.
From:[info]silly_sad
Date:November 18th, 2016 - 11:02 pm
(Link)
net, ja imell vvidu chto napisano v obrabatyvajemom tekste.
ty na regexp opisyvajesh svojstva nekojego teksta, vsjo. nikakogo algoritma tam net. vopros chitajemosti trivialjnyj -- mozhesh li ty videtj kakije svojsta zapisany.

but, like i said, there is another layer of obscurity -- physical readability -- regex is hard to human eyes.
[User Picture]
From:[info]wieiner_
Date:November 18th, 2016 - 08:53 pm
(Link)
через 20 -- 25 лет. слово "программист" будет очень смешное. программированием должны заниматься роботы!

сейчас, соответственно, код пока должен удовлетворять некоторым неформальным и формальным стандартам, вроде венгерской нотации или паттернов. на регрулярные выражения наверное тоже есть какой-то неформальный стандарт, типа, как на записи продукций в формальных грамматиках. сначала они(всякие институты) это формализуют -- потом перепоручают роботам. а программеры -- за бортом. плюс еще сейчас все функциональное опять в моде.
From:[info]lqp
Date:November 18th, 2016 - 08:57 pm
(Link)
программированием должны заниматься роботы!

А кто будет программировать роботов?

венгерской нотации

Свят-свят-свят!!!!!
[User Picture]
From:[info]wieiner_
Date:November 18th, 2016 - 09:24 pm
(Link)
>А кто будет программировать роботов?
опять роботы. называется "раскрутка". когда например новый язык программирования переписывается на емсамом!
From:(Anonymous)
Date:November 18th, 2016 - 10:32 pm
(Link)
хохол, иди нахуй.
From:(Anonymous)
Date:November 18th, 2016 - 08:55 pm
(Link)
(1)
Вам следует знать, что в России блокируют этот сайт
(лй.россиа.орг)

(2)
У вас сильно недодуманное.
На эту тему Кнут подумал десятки лет назад - и создал
гениальное (и гениально простое) решение - literate programming

(а)
Обычно пишут код с примечаниями. Последнее время научились
форматировать и распечатывать (в пдф или хтмл) код с примечаниями
так чтобы красивше было

ваши рассуждения не выходят за рамки такого представления

(б)
Кнут предложил писать РАССУЖДЕНИЯ, логику почти "эссе" -
в порядке мышления человека (вместо порядка,
навязанного машиной) - в который вставлены куски кода
со строчками на человеческом языке.

Далее, эти строчки вида
[здесь регэксп для выделения поля ХХХ]
или
while counter=1, [вычисленная ширина массива]

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

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

А записываем как бы "дневник рассуждений", из которого потом
автоматически одной командой получаем форматированную книгу,
а другой - код в машинном порядке

(г)
Программки, которые это делают ЭЛЕМЕНТАРНЫ - одну я сам
написал для себя (и пользуюсь уже много лет).

Процесс программирования таким образом прост и естественен.

(д)
имбецилы на англоязычном интернете обычно не понимают простоты
процесса, фантазируют "литературные способности", к которым
они не склонны, и отказываются пробовать. Проблема примерно
такая же, как с ЛИСПом - все говорят о нем, но никто на нем
не пишет.

Так что проблема давным-давно решена. Кнутом в его
literate programming

From:[info]lqp
Date:November 18th, 2016 - 09:04 pm
(Link)
Видите ли. Встроенная документация - она конечно вещь хорошая, но вообще говоря написание программ и написание учебника по использованным в программе алгоритмам - это разные профессии. Это клево, что эти занятия можно совместить, но в большинстве случаев задача так не стоит.
From:(Anonymous)
Date:November 18th, 2016 - 09:19 pm
(Link)
вы ответили в точности как те идиоты с англоязчных
форумов --
НЕ ЗНАЯ НИЧЕГО вы откинули решение словами, которые
представляют из себя бессмыссленное общее место

НЕт, вы идиот (да еще и неумеющий читать ясно прописанное) -
literate programming не "написание учебника, и не являются
"встроенной документацией" (которой являются встроенные
системы документации большинства современных скриптовых
языков, например)

Literate Programming - возможность РАССУЖДАТЬ в порядке
человеческой логики, помечая свои рассуждения -- и затем
из них получить (а) описание с кодом в точности в том
духе, как вы видите объяснения с псевдокодом, например,
в учебниках - каждый из нас учился по похожим объяснениям
и (б) сам код

Вы не "пишете учебник" для которого вторичны "примеры".
Вы ВЕДЕТЕ ДНЕВНИК РАССУЖДЕНИЙ, своего понимания и решений,
вами выбранных - который превращается в программу одним
вызовом of a small utility

Одним из следствий такого подхода оказывается то, что даже
спустя годы можно программы поддерживать и даже запускать
новых программистов на них.
From:(Anonymous)
Date:November 18th, 2016 - 10:34 pm
(Link)
>(которой являются встроенные системы документации большинства современных скриптовых языков, например)

шо бля? это когда в начале тела функции можно рассказать о чем она?
From:[info]silly_sad
Date:November 18th, 2016 - 09:24 pm
(Link)
Dijkstra "On the foolishness of the natural language programming"
From:(Anonymous)
Date:November 18th, 2016 - 09:45 pm
(Link)
Для того, чтобы бросаться ссылками,
надо хотя бы понимать что они в те
древние времена имели в виду.

В принципе, Кнут создал literate programming
когда впервые появилась необходимость перестать
писать "кучу", и структурировать программы, которые
выросли в размере так, что стали неподъёмными для
мозга.

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

И ВТОРАЯ ГЛАВНАЯ МЫСЛЬ Кнута по струкруризации кода была
в том, что НАДО ПРЕКРАТИТЬ выворачивать мозг чтобы писать
в порядке, удобном для машины,.но наоборот ПИСАТЬ В ПОРЯДКЕ
ЧЕЛОВЕЧЕСКОЙ ЛОГИКИ - которую его utility преобразует в
машинно-упорядоченный код

Так что сначала поймите о чем они тогда бились, а потом
уже кидайте ссылки с закоговками, которые вам показались
"опровергающими" (при том совершенно не зная сути спора)
From:[info]silly_sad
Date:November 18th, 2016 - 11:07 pm
(Link)
povtorenjije ne dobavljajet istinnosti. FYI.
From:(Anonymous)
Date:November 18th, 2016 - 11:36 pm
(Link)
"...povtorenjije..."

wy idiot
From:[info]lqp
Date:November 18th, 2016 - 11:09 pm
(Link)
Ты решаешь задачу, скажем, уравнивания триангуляционной сети. Какая тут, нафиг, может быть "человеческая логика"?
From:(Anonymous)
Date:November 18th, 2016 - 11:35 pm

Я решаю иную задачу

(Link)
ы решаешь задачу, скажем, уравнивания триангуляционной сети

Нет, я не могу решить задачу заставить читателя поступить
как минимально адекватный технарь должен поступать by default:

скачать кусок literate программы (еще лучше - самого Кнута),
посмотреть как это устроено -- и перестать издавать глупости
из самых общих слов.

Ну не может технарь гнать словесный мусор даже не вбив в
поисковик literate programming samples
From:(Anonymous)
Date:November 18th, 2016 - 11:46 pm

Re: Я решаю иную задачу

(Link)
даже простейший HTML превратился в результате повышения требований к нему в хуй знает что. нухуя ты тут втираешь про literate programming, годный разве что для программирования блокнотика с записями?
From:(Anonymous)
Date:November 19th, 2016 - 04:27 am

Re: Я решаю иную задачу

(Link)
он сука упоротый в кашу ваще хуле ты ему пишешь сайт у него сука блокируется да это же МАКАКА!!
From:(Anonymous)
Date:November 19th, 2016 - 09:43 am

вы имбецил

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

Он написал TeX - а это ОГРОМНАЯ программа,
которую иначе мозг поднять не смог бы.

Но то человек со средним. ваш же не выше
комнатной температуры
From:(Anonymous)
Date:November 19th, 2016 - 12:14 pm

Re: вы имбецил

(Link)
говорят, что Кнут создал TeX, в значительной степени для того, чтобы публиковать тексты на русском языке
From:(Anonymous)
Date:November 19th, 2016 - 03:32 pm

Re: вы имбецил

(Link)
на украинском же
From:[info]lqp
Date:November 19th, 2016 - 11:24 am

Re: Я решаю иную задачу

(Link)
А кому будет нужна ваша программа, если она не решает той задачи, которая требуется?
[User Picture]
From:[info]lolepezy
Date:November 18th, 2016 - 11:09 pm
(Link)
Тому есть понятные причины и, думаю, даже много их.

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

2) На сегодняшний день не так уж много кто "программирует алгоритмы"; в большинстве случаев код довольно тупой и занимается тем, что перекладывает из одного места в другое, вызывает сторонние сервисы, конвертирует данные, валидирует ввод юзера и т.п. В таких условиях понятность организации кода, что, откуда и зачем, становится ещё важнее. Более того, в больших проектах, в сотни тысяч и миллионы строк кода, даже хороший инженер тратит львиную долю своего времени и усилий на то, чтобы понять, что уже написано и где поменять, чтобы сделать как надо. Скорость внесения изменений "так чтобы ничего при этом не сломалось" становится одной из главных метрик любого проекта. Читаемость и понятность "на лету" тут напрямую влияет на производительность. Понятно, что на больших масштабах значение имеет не "локальная читаемость", а логичность и системность дизайна системы с целом, и применяемые техники и стиль, но простая читабельность "по буковкам" тоже имеет какое-то значение.

3) Программирование нынче бизнес с маржой почище наркоторговли (если венчурный стартап), писание книжек по этому делу --- тоже весьма неплохой. Хайп по поводу того или иного аспекта разработки софта --- вещь довольно случайная и меметичная по своей природе. Сегодня это ридабилити, бигдата и десять тысяч новых фрейморков для джаваскрипта каждый месяц, 10 лет назад это был NoSQL, до того java enterprise blabla, есть целое поколение, которым вытрахали мозг дизайн паттернами, и которые носятся с ними теперь и т.д. и т.п. Просто сегодня так модно.

4) Наконец, в индустрию хлынуло очень много идиотов, к сожалению. Популярная профессия с хорошей зарплатой, многим кажется, что ничего сложного. В 90% у них что-то даже получается. Учебные материалы и сами инструменты аппелируют к доступности, отсюда упор на, в том числе, читабельность. That's why we don't have nice things.
From:[info]lqp
Date:November 18th, 2016 - 11:25 pm
(Link)
Та это все понятно, но это замкнутый круг.

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

Я не призываю все это ломать. Я даже не говорю что оно со временем само навернется. Я просто хочу сказать, что за пределами круга тоже есть жизнь. Для программирования в том числе. 60% всего используемого индустрией кода написано не профессиональными программистами.
[User Picture]
From:[info]lolepezy
Date:November 21st, 2016 - 12:29 pm
(Link)
> Я просто хочу сказать, что за пределами круга тоже есть жизнь.

Безусловно.
Кто-то же должен и работающие системы делать, компиляторы
писать всякие и пр. Просто возникло некое "массовое программирование"
со своими Фаулерами и прочим GoFом. И надо это говно уметь
отфильтровывать.
From:(Anonymous)
Date:November 19th, 2016 - 10:01 am
(Link)
кстати да
да что там говорить про код когда ридми хуй поймёшь!
каждый бля индус хочет выебнутся чтобы потом с умным видом сказать: ви таки не правильно поняли здесь нкжен другой флагь!
сука заебали!

пс вопрос к быдлопрограммистам: почему программа вылетает(SIGSEGV) не доходя до main?(заебался)
From:[info]lqp
Date:November 19th, 2016 - 10:28 am
(Link)
Потому что "Це-с-крестами", очевидно.

Тебе показали крест? Так чего же тебе непонятно?
From:(Anonymous)
Date:November 19th, 2016 - 11:02 am
(Link)
я атеист
как с этим бороться?
From:(Anonymous)
Date:November 19th, 2016 - 12:17 pm
(Link)
Фёдор, ну нельзя же так явно демонстрировать свой дилетантизм, ей-богу, бля...
From:(Anonymous)
Date:November 19th, 2016 - 12:35 pm
(Link)
принимаются любые версии потому как вопрос сложный дебагером не ловится
похоже что-то с либами подгружаемыми...
но я их всех отдельно тестировал ок
так что хожу из угла в угол...
From:[info]grusha
Date:November 19th, 2016 - 02:25 pm
(Link)
Чудес не бывает. Если вылетает, значит есть на то причина. Дерзай.
Всегда можешь ядро подебажить, на крайняк.
Можешь с LD_PRELOAD поиграться.
и т.д.
From:(Anonymous)
Date:November 19th, 2016 - 03:02 pm
(Link)
спасибо за LD_PRELOAD
сейчас возьму бубен, раскумарюсь ...
From:[info]grusha
Date:November 18th, 2016 - 11:40 pm
(Link)
>Читаемость кода есть функция от количества содержащегося в этом коде информации. Алгоритм, расписанный на 10 экранов всегда будет "более читаемым" в пересчете на экран текста, чем тот же алгоритм, расположенный на одном экране.

Наоборот, менее читаемым. Читаемость это отношение сигнала к шуму.
From:(Anonymous)
Date:November 18th, 2016 - 11:48 pm
(Link)
можно сделать просто, понятно, и ... медленно. быстрый алгоритм всегда сложнее простого.
From:[info]grusha
Date:November 18th, 2016 - 11:57 pm
(Link)
Нахуя ты мне это написал, анон? Прицел почини.

Можно сделать сложно, непонятно и медленно. Можно сделать сложно, непонятно и быстро. Можно сделать просто, понятно и быстро (более короткий код лучше помещается в кэше, например). Все можно сделать.
From:(Anonymous)
Date:November 19th, 2016 - 12:00 am
(Link)
транспортную задачу по оптимизации маршрута решал? сделай на один экран, посмеемся.
From:[info]grusha
Date:November 19th, 2016 - 12:05 am
(Link)
За трампа голосовал?
From:(Anonymous)
Date:November 19th, 2016 - 12:15 am
(Link)
а это из простейших алгоритмов. есть еще графические, для компримирования или кодирования данных, да блядь для простейшего парсинга скриптов. но тут нарисовался php профи и гонит за простоту.
From:[info]grusha
Date:November 19th, 2016 - 12:32 am
(Link)
Вася, сделай простое умственное упражнение: прочитай цитату, на которую я отвечал в своем первом комменте, и попытайся понять, о чем здесь речь и почему твое присутствие здесь излишне.

А php в жопу себе засунь.
From:(Anonymous)
Date:November 19th, 2016 - 12:43 am
(Link)
>Можно сделать просто, понятно и быстро (более короткий код лучше помещается в кэше, например). Все можно сделать.

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

Оправдывайся.
From:[info]grusha
Date:November 19th, 2016 - 12:45 am
(Link)
Не помогло упражнение? Сочувствую.
From:(Anonymous)
Date:November 19th, 2016 - 01:14 am
(Link)
ну, иди тогда нахуй.
From:(Anonymous)
Date:November 19th, 2016 - 02:07 am

загадка

(Link)
висит груша, никому не нужна.
From:(Anonymous)
Date:November 19th, 2016 - 04:31 am
(Link)
насчет пхп было тонко, это дон лосось тут шарудит?
From:[info]lqp
Date:November 19th, 2016 - 10:15 am
(Link)
По человечески да. А с точки зрения теоретиков языков программирования, скажем добавление принудительных переводов строки увеличивает читаемость.
From:[info]grusha
Date:November 19th, 2016 - 03:55 pm
(Link)
Возможно. Не слежу за этими говнотрендами.
Называть этих товарищей "теоретиками" я бы не стал, так как существует и действительно серьезная область CS: https://en.wikipedia.org/wiki/Programming_language_theory

А выражение "ясность и читаемость кода" ровно то и значит - его понятность и читаемость. Дело в том, что программирование (разработка софта) это в первую очередь борьба с возрастающей сложностью (системы, а не алгоритма). Потому что написать кусок кода очень просто, как насрать. (Даже проще, так как в любой момент можно.) Гораздо сложнее написать хороший кусок кода, не превращающий систему в помойку. И это безотносительно сложности (и вообще наличия) стоящей за ним математики. Так что забота о ясности кода это жизненная необходимость. (Конечно, волшебные палочки для дебилов, вроде принудительных отступов, венгерской нотации, ооп и паттернов никак здесь не помогают, а лишь возможно делают процесс велосипедостроения более управляемым с точки зрения манагеров, - коль скоро тривиальность задач и низкие требования к качеству позволяют.)
Powered by LJ.Rossia.org