Как стать автором
Обновить

Простое объяснение простоты. Глава 1: Теоретически просто

Время на прочтение27 мин
Количество просмотров10K
Всего голосов 23: ↑19 и ↓4+15
Комментарии55

Комментарии 55

НЛО прилетело и опубликовало эту надпись здесь
проходили
Из этих гипотез предпочтительнее та, в которой содержится меньше сущностей, без гнома. Если же включая лампочку вы услышали тихую ругань из выключателя — предпочтительнее вторая гипотеза, потому что первая не объясняет, почему выключатель ругается, а последняя содержит избыточные сущности.
Предпочтительнее гипотеза с неосторожным электриком за стеной.

Многоуровневое вступление — хорошее начало для статьи по простоте…
<«sarcasm»>Электрик за стеной не объясняет почему ругань идет именно из выключателя. А если начать наворачивать условия, что он прямо за выключателем, или что для выключателя отверстие сквозное — гипотеза становится сложнее</«sarcasm»>

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

Не то, чтобы не понравился. Просто вся статья в целом как-то тяжко воспринимается imho. А вступление — просто глубина вложенности для «перворазников» несколько удивила.
Хм.

У меня есть два предположения:

  1. Статья воспринимается тяжко, потому что я где-то накосячил.
  2. Статья воспринимается тяжко, потому что объем информации большой, и есть контр-интуитивные участки. Мозгу не нравится, когда его предположения рушат, как в примере с интерфейсами или физиками. И в результате он сильно устает.

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

попробуйте весь этот словопоток переписать, сделав раз в 5 короче и связнее.
и поработайте над определением понятий — бо то что есть — безсмысленно и беспощадно.

1. что
если простота или сложность — не субъективная, а объективная характеристика
? а что если вдруг нет?
2.
“Что такое просто?” — не слишком конкретный вопрос. Давайте как-нибудь

а может давайте не как нибудь, если уж теорию предлагаете, а дадим критерии слишком и не слишком конкретного вопроса.
3.
Действие — это последовательность других действий

вошли то ли в тавтологию, то ли в бесконечную рекурсию.
4.
Мы вводим понятие системы и модели системы.
Система — это совокупность компонент,

мы опоздали, понятие системы ввел Берталанфи еще в прошлом столетии. И лучше его употреблять в общепринятой на сегодня форме — Система — множество элементов, находящихся в связях. Или более формально: система — это структура, состоящая из елементов и связей между ними.
понятие компонент не используется при системном подходе (при использовании категории Система).
Современное определение: Компонент — составная часть целого. определение работает в рамках категорий часть — целое, как синоним части.
основное различие этих понятий — компонет (часть) может быть вынута из целого и рассмотрена, изучена как отдельный обьект (точнее — предмет).
елемент же вынуть из системы и его связей с другими елементами нельзя.
примеры — можно вынуть сердце лягушки и изучить его как часть, как отдельный предмет — взвесить, посмотреть реакцию на химикат…
но изучить его как елемент кровеносной системы таким образом нельзя, надо рассматривать только в его кровеносных связях в рамках всей кровеносной системы…
устал коментировать да и работать надо — мне увы за просто писанину не платят
  1. Не понял, объясните пожалуйста подробнее.
  2. Я привел пример. И сказал, что хороший вопрос — ограничивает область возможных ответов. На вопрос «что такое просто?» можно ответить, что просто — это огурец. И я не могу математически доказать, что просто — это не огурец, при такой постановке вопроса. Для меня это свидетельство того, что вопрос не корректен.
  3. А что такого в рекурсивных определениях? Я указал условие выхода из рекурсии.
    Вас же не смущает что: «Простое число — это число, которое не делится на предыдущие простые числа, первое простое число — 2». К тому же, у понятия алгоритм есть сложности с определением. Можете почитать про аппарат рекурсивных функций, но я не стал его пихать в статью.
  4. Я нигде не говорил, что изобрел определение понятия Система.
    Я прочел большое количество статей с разными определениями. Где-то авторы наворачивали на элементы «параметры элемента», где-то связи… Их можно выразить через одну математическую абстракцию — множество. Зачем мне связи в определении, если я могу определить их в тот момент, когда захочу, просто воспользовавшись определением функции через теорию множеств?
    Мне немного сложно воспринимать то, что вы написали. Вы не могли бы скинуть математическое определение? Cкорее всего окажется, что мы говорим об одном и том же разными словами. Вы прочли спойлер «IT'S MATHEMATICS TIME» в этом разделе?

Я могу сократить статью. Раз в 100. Выразив все мысли математически, на пол листа A4. Но, у людей есть проблемы даже с такой простой вещью, как теорема Байеса. Не всем дано мгновенно привязывать математические формулы к реальному жизненному опыту. Я вот не умею, мне нужно долго работать, чтобы понять, как эти непонятные значки влияют на мою жизнь.

P.S.
У меня сложилось впечатление, что вы пробежали статью за 10 минут, пропустив половину текста. Из-за этого вещи, которые вы привели, «вырвались» из контекста. К сожалению, такой способ взаимодействия со статьей при первом прочтении — не подходит.
по п.1 обьясняю подробнее
Еще раз. Есть объект, и какие-то его характеристики могут заставить вас думать(ru), что он простой. И если завтра ваша оценка изменится и остановится на отметке “сложный” — объекту на это будет плевать.
И если простота или сложность — не субъективная, а объективная характеристика, то может быть мы можем ее измерить?


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

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

Второй пункт. Сложность действительно зависит от субъекта. Если у школьника из нашего примера будут связаны руки за спиной — ему действительно будет сложнее переложить кирпич. Но связанные за спиной руки — это весьма объективная причина)

Примерчик: Есть 2 компа.
Я хочу чтобы на каждом из них было 50 нужных мне файлов, размер — одинаков.
На первом уже есть 25 из них.

Комп — это исполнитель, он будет грузить эти файлы. Сложность загрузки каждого файла — одинакова.

Первому компу в 2 раза проще это сделать. Но, у меня не поворачивается язык сказать, что это вызвано субъективным восприятием этого компа, а не объективными причинами.

Я брал определение субъективности из вики, и могу ошибаться. Оно выглядит так: Субъекти́вность — это выражение представлений человека (мыслящего субъекта) об окружающем мире, его точки зрения, чувства, убеждения и желания.

Здесь нет ничего, про объективную информацию, которая имеется о мире. Эти вещи на нее опираются, но они — следствия. Не причина. И могут быть ошибочны.
И да, кажется я понял, почему мы друг-друга недопонимаем. Прочитайте Simple Truth, я думаю так нам будет легче.
возьмите из вики определение обьективности — как независимости от субьекта, этого будет достаточно, чтоб понять написанное мной выше и не называть обьективным то, что им не является.
Простите, но меня вообще не интересует определение. Я предоставил вам достаточно информации чтобы вы могли понять, что я имел ввиду. Если вы знаете, что есть более подходящее слово для выражения моей мысли — так скажите его.

А сейчас вы переходите к стандартному спору об определениях.

Повторяю, если вы знаете слово, которое подойдет лучше или можете кратко выразить эту мысль — помогите мне, я вот не могу.
А если нет — то к чему все это?
НЛО прилетело и опубликовало эту надпись здесь
Да.
А к чему был этот вопрос?
«Молод еще, неопытен, от такого зеленого юнца вряд ли что-то можно всерьез воспринимать».
Видимо, к этому.
Хм.
Смотрите.

Я прочитал ваше сообщение. Это вызвало вполне объективную реакцию фоторецепторов в моем глазу. По оптическому нерву сигнал передался в мой таламус и оттуда ушел в зрительную кору. После этого, произошла активация различных участков в моем мозгу, отвечающих за хранение информации, связанной с тем, что я прочитал в вашем сообщении. Эта информация попала туда таким же образом, как и ваше сообщение.
После этого этого множество сигналов пошло в префронтальную кору. Часть из них отфильтровалась, другая — прошла в нее, и попала в кратковременную память и была использована для принятия мною решения о написании этого сообщения.

Где в этом процессе начинается «субъективное восприятие»?

Мне казалось, что это слово используется для описания «модели реальности», составленной мозгом, на основе хранящейся в нем информации. Но то, что информация в нем хранится — это объективно. Или нет? Ведь она тоже является «моделью» информации извне. Но она получена вполне себе объективным образом, через изменение состояния нейронных связей, который вызван такой же объективной их активацией из-за объективного воздействия на рецепторы. У меня возникают затруднения, с тем чтобы провести здесь границу объективности и субъективности.

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

Вы подняли очень интересный вопрос. И мне действительно не стоит использовать слово «субъективно», если оно обозначает зависимость от человека и состояния его мозга. И не стоит использовать «объективно», как обозначающее независимость от них.
Есть ли слово, которое обозначает именно «независимо от желаний и ожиданий»?
проблема намного глубже, чем подобрать правильное понятие.
категории Обьект-субьект — основа подхода, на котором построены практически все существующие науки. В основе подхода — выделение в многогранном и потенциально очень сложном обьекте только одну изучаемую сторону (вес, количество, скорость, цвет..), игнорирование других сторон и поиск зависимости этой стороны от других также изолированно изучаемых сторон.
в физике, математике такой подход хорошо работает.
но в социальных науках, психологии, истории, биологии, химии — уже не работает. там изучаемый предмет нельзя представить в виде обьекта и поэтому разработали и применяют системный подход. изучаемый предмет моделируют через систему (структуру связанных елементов). Берталанфи первым это сделал и ввел понятие елемента ( химического ) в системе (соединении).
когда говорят что рассматривают предмет как систему, то понимают, что система — это произвольная искусственно созданная модель, которая помогает решать какие-то задачи по оперированию с предметом.
для одного предмета можно создать большое количество моделей разной сложности и качества, исходя из целей, которые ставит перед собой исследователь (а также его инструментария, опыта). это разительно не похоже на мир обьективных знаний, где большей частью для одного обьекта все используют одинаковую модель, не систему, а целое, иногда разделяемое на части.
в Вашем случае не надо идти к позиции «независимо от желаний и ожиданий». надо исходить из этого, так как системные модели вырабатываются как раз для удовлетворения желаний и ожиданий.
В основе подхода — выделение в многогранном и потенциально очень сложном обьекте только одну изучаемую сторону (вес, количество, скорость, цвет..), игнорирование других сторон и поиск зависимости этой стороны от других также изолированно изучаемых сторон.


Это как?
Смотрите. Я астроном и изучаю звезды. Я хочу определить цвет звезды. Как я могу это сделать, не зная об ее скорости? Если я просто посмотрю на нее — то я увижу не правильный цвет. Потому что есть эффект доплера. Т.Е. если меня интересует цвет, то меня сразу интересует скорость.
Кстати, оба понятия связаны еще и с температурой.
А если вспомнить про энергию, которая связана с массой, да еще и через скорость…
Как вы собираетесь независимо их изучать?

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

Почему? Что такое объект, и почему то, что изучают эти дисциплины — не объекты? И если «не объект» — это субъект, то что такое субъект? Когда я иду в словарь, там пишут — это человек. Окей, я взял, подошел и пнул стол. Это взаимодействие было субъективным, ведь в нем участвовал я? После этого на столе появились субъективные вмятины, а у меня субъективно распухли пальцы?

Простите, но пока у нас есть только информация что объективно — это не субъективно, а субъективно это не объективно. Я пытаюсь разорвать этот круг и соотнести эти вещи с реальностью, чтобы они наконец-то перестали циклиться друг на друга.

Какую часть реальности описывают слова субъект и субъективно и чем эта часть реальности отличается от остальной, объективной?
Я добавил репозиторий, где все, о чем я говорил написано на Java.
Вот: github.com/lonelydeveloper97/ModelExample/tree/master/src/com/lonelydeveloper97

Теперь «кровавые недоопределения» обрели форму кода, применены для описания системы из 2 монет, и считают сложность 300 перебрасываний монеток, по «недоопределению».
Можно пощупать, поиграться, построить свои модели. It works.

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

А разве это цель code review?

Простота не синоним ни надёжности ни понятности ни расширяемости.
Простота точно не является целью code review.

Простота для понимания = минимальное количество усилий чтобы понять код.
Простота для расширения = минимальное количество действий чтобы добавить функциональность.


Разве это не цели код ревью? Конечно, еще есть knowledge sharing, проверка на ошибки...


Но вы правы, возможно мне стоит прояснить этот момент. И

смешались в кучу кони

ниче не смешалось, все нормально. логика прослеживается.
Для людей не знакомых с Берталанфи, такое чтиво лучше чем «рассуждения о ИИ, который все умнеет..» и тп лабуде из соседних статей.
Автор, пиши еще.
НЛО прилетело и опубликовало эту надпись здесь
Да, вы правы — алгоритм — это все же описание действий. Не заметил неточность, когда правил статью.
Когда нам говорят, что где-то есть ручка — мы уже знаем, что за нее можно взяться. И это весьма удобно

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

  • Большая тяжелая чашка, в ручку которой пролезают только два пальца. Если чашка наполнена кипятком, нести ее за ручку очень не просто и больно.
  • Сумка, ручка которой слишком длинная чтобы нести ее в руке, но слишком короткая чтобы нести ее на плече.
  • Металлическая ручка кастрюли или сковороды в процессе приготовления пищи.
  • Ручка чемодана, выдвигающаяся ровно на такую длину, чтобы при передвижении пятка оказывалась под чемоданом
  • Или например вот
    image


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

И, разумеется, вы правы — не все ручки удобны. Об этом будет позже.
Я ошибся. Когда я писал этот пример, то думал, что знаю каким будет ответ… результат по мне очень сильно ударил.
Мой опыт давно перевалил за банальные 10к часов!
Не нервничайте вы так, все в порядке с вашим опытом. В реале ваша интуиция вас не подведет, т.к. для большинства реальных ситуаций, в которых и пунктов и групп будет существенно больше, чем в вашем простеньком примере — вариант с разбиением на несколько экранов действительно будет проще!

Есть такая штука как колмогоровская сложность и, кажется, именно она наиболее четко описывает сложность системы, в контексте разработки ПО. Считать, что любую систему можно разложить на элементарные системы сложности 1 единственным способом не верно. Считать, что сложность элементарных систем можно складывать, тоже не верно.


Поясню на примере. Смотрим на фрактал и находим в нем бесконечное число элементов, но сам фрактал описывается компактной формулой. На практике инженеры-конструкторы для своих задачи такую компактную формулу не всегда могут найти. Знание предметной области равно знанию наиболее часто встречающихся формул/паттернов/подходов которые сложно обнаружить.


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

Вопервых не сушествует способа определить длину саммой короткой программы.

А вовторых самая короткая программа не факт что будет самой простой в субъективном смысле.
Да и да. Предложено много метрик ПО и все они подвергаются критике. Количество строк кода — одна из самых критикуемых.
Вы правы.

Я смотрел на колмогоровскую сложность и на сообщение минимальной длины. Но когда интерпретатором сообщения является мозг, то минимизация «записи» с сохранением количества информации — не работает.
Есть определенные проблемы с тем, как работает человеческая память. Из-за них, для упрощения чтения, модель в некоторых случаях должна быть «избыточна». Это тема одной из следующих статей.

Вполне возможно, что я просто плохо понял сложность Колмогорова или концепт СМД и их можно использовать в «условиях мозга». Но я не умею.
>Я смотрел на колмогоровскую сложность и на сообщение минимальной длины. Но когда интерпретатором сообщения является мозг, то минимизация «записи» с сохранением количества информации — не работает.

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

На пальцах — положим есть модель человеческого мозга, которая для заданной программы выдает число — сложность этой программы, как она будет восприниматься среднестатистическим программистом. Пусть эта модель дала нам оценку программы А — 10 — сложная программа и оценку программы Б — 10, тоже очень сложная программа. Но что если программа Б объясняет многое из программы А и наоборот? Тогда можно ожидать, что оценка сложности объединенной программы будет сильно меньше 10, но не 10 + 10.
Простите, я все еще не понял, откуда вы сделали такой вывод.

По вашему примеру:
У вас есть система А, система Б. У них есть общая подсистема C. Ваша задача — посчитать сложность чтения их человеком. Если вы прочитали А, то вы прочитали C. Поскольку эта информация у вас уже есть, то вам не нужно будет перечитывать C, когда вы будете читать Б. Вы уже о ней знаете.

Почему вы решили, что сложности общих частей должны складываться?)
В моем тексте складываются сложности действий. И в примере выше действий для прочтения Б стало меньше после прочтения А.
Оцениваем не сложность объекта O как такового, а сложность достижения заданного результата R, посредством действия с объектом O. Считаем, что результата R можно добиться путем выполнения элементарных действий с объектом O. Определяем сложность R как сумму сложностей элементарных действий с объектом O.

Вы же говорите примерно об этом, верно?

Утверждение — определение минимального набора действий с объектом O для достижения результата R эквивалентно вычислению колмогоровской сложности. То есть является невычислимой функцией.

Объект O и его интерфейс — например JVM и язык программирования Java, результат R — реализация программы согласно требованиям заказчика. Для вычисления сложности нужно найти минимальный набор действий с языком R. Чем не колмогоровская сложность? Добавления исполнителя ничего, принципиально, не меняет.
Немного не так:
Есть набор систем O={O1,...,On}. Есть уже заданный алгоритм А. Алгоритм принимает Ok и дает результат Rk. Так же у вас есть результат R — тот к которому мы стремимся.
Задача — найти такое Ok, которое при выполнении на нем A, будет давать Rk, такое что R принадлежит Rk, и при этом будет иметь наименьшую сложность.

Пример:
Ваш заказчик просит вас сделать кнопочку. В залогиненом состоянии на кнопочке один текст, в незалогиненом — другой. Кнопки делают разные вещи в этих состояниях. Скажем, когда вы не залогинены — предлагают залогиниться, а когда залогинены — посмотреть данные аккаунта.
Это ваш R.

У вас есть два варианта решения:
Первый — сделать две разные кнопки и подставлять их в зависимости от состояния.
Второй — сделать одну кнопку, но менять у нее текст и действие при нажатии.
Эти варианты: ваши O.

Вы знаете, что у вас 3 коллеги, они будут читать этот код. Еще вы знаете, что возможно у вас будет редизайн через полгода и вы оцениваете его вероятность в 60%.
Это, кхм… Варианты действий с вашим кодом. Я пока не знаю их алгоритмы (А), и моя задача — их найти.

Вопрос — какой из вариантов лучше?

Моя мысль — если мы узнаем алгоритм действий «прочитать код» и «внести изменения в код» — мы сможем ответить на этот вопрос. Если он есть — то оценка сложности не будет отличаться от оценки сложности любого другого алгоритма.

Люди читают примерно одинаково, это задано на уровне того, как устроен их мозг. Отличия между ними обуславливаются разным опытом, а не тем, что их мозги работают по разным принципам. Следовательно — можно попробовать составить алгоритм так, что он будет параметризоваться от «опыта» человека.

Есть набор систем O={O1,...,On}. Есть уже заданный алгоритм А. Алгоритм принимает Ok и дает результат Rk. Так же у вас есть результат R — тот к которому мы стремимся.
Задача — найти такое Ok, которое при выполнении на нем A, будет давать Rk, такое что R принадлежит Rk, и при этом будет иметь наименьшую сложность.


Извините, но это уже похоже на полную кашу в голове. Что такое сложность Rk или Ok? Набор O дан свыше или мы можем его вычислить? Как его вычислить? Если набор дан, то кто гарантирует, что в нем есть Ok, на котором достигается минимум сложности? Если набор О дан, то можем ли мы показать, что он полный, то есть никаких других интересных Ok быть не может?

Вы знаете, что у вас 3 коллеги, они будут читать этот код. Еще вы знаете, что возможно у вас будет редизайн через полгода и вы оцениваете его вероятность в 60%.


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

Это, кхм… Варианты действий с вашим кодом. Я пока не знаю их алгоритмы (А), и моя задача — их найти.


В определении выше A полагался единственным, потому что A: Ok -> Rk. Но если их много, то говорить о том, что Ok отображается в Rk с помощью A уже нельзя. Далее — можете ли вы показать, что у всех людей одинаковый A?

Моя мысль — если мы узнаем алгоритм действий «прочитать код» и «внести изменения в код» — мы сможем ответить на этот вопрос.


Вы можете найти какой-то алгоритм А или даже множество алгоритмов А, Но вы не можете в общем случае знать минимальный ли он/они, оптимальный ли он/они. На самом деле, теорема Райса говорит, что в общем случае вы вообще никаких нетривиальных свойств A как функции (оптимальность, конечность, гладкость, непрерывность и т.д.) по его тексту вычислить не можете.

Предлагаю вам бросить написание статей и начать доказывать теоремы. Вы исследуете очень сложные проблемы, говорить о которых можно только на языке математики.
Извините, но это уже похоже на полную кашу в голове. Что такое сложность Rk или Ok? Набор O дан свыше или мы можем его вычислить? Как его вычислить? Если набор дан, то кто гарантирует, что в нем есть Ok, на котором достигается минимум сложности? Если набор О дан, то можем ли мы показать, что он полный, то есть никаких других интересных Ok быть не может?


Я пытаюсь вам объяснить, что вы ставите другую задачу. Вы говорите о вычислении наилучшего из возможных вариантов, и говорите о том, что это невозможно, и это математически доказуемо. Я это понимаю.
Но я решаю другую — я хочу найти хоть какой-то критерий, который будет описывать реальность лучше, чем имеющиеся у нас (например, лучше чем количество строк кода), для того, чтобы мы могли сравнить хотя бы ограниченное множество вариантов. Сейчас у нас нет инструмента даже для такой задачи.

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

Да, предполагают. Вопрос в том, а надо ли их учитывать, если вероятность редизайна — 60%? Окупится ли это?
Знаете, я отнюдь не уверен, что в примере с простыми числами лучше всегда использовать уже посчитанные значения.
Для первых ста простых я бы так делать не стал. Но я могу ошибаться.

В определении выше A полагался единственным, потому что A: Ok -> Rk. Но если их много, то говорить о том, что Ok отображается в Rk с помощью A уже нельзя. Далее — можете ли вы показать, что у всех людей одинаковый A?


Нет, А будут разные. Давайте предположим, что есть некое множество A, каждый алгоритм из которого встречается с вероятностью Pn. Короче — задали распределение. Ну ок, из этого можно получить дискретное распределение сложностей для каждого O, и получить такое же распределение R — для каждого из алгоритмов. Тут все получается интереснее, например мы можем получить невалидные R_kn для некоторых А_n на некоторых O_k. Ну окей, мы возьмем O_k, который будет соответствовать условию что мы получаем нужный результат с вероятностью больше, скажем 98.5% и при этом минимальной сложностью. Или придумаем еще какое-нибудь условие, которое нам подходит.

Вы можете найти какой-то алгоритм А или даже множество алгоритмов А, Но вы не можете в общем случае знать минимальный ли он/они, оптимальный ли он/они.


В моем примере — они с высокой вероятностью не оптимальны. Люди плохо читают, нам бы не помешала пара плашек озу, с ECC) Проблема в том, что вы не можете изменить то, как записывается информация в вашем мозгу. Поэтому приходится подставлять костыли, с которыми нам будет удобно работать.
Мы и так этим постоянно занимаемся. Я просто пытаюсь найти способ делать это более осмысленно, и делюсь своими мыслями по этому поводу.

Если вы не против, давайте перейдем в ЛС. Вы задаете интересные вопросы, и подкидываете мне интересные мысли. Я, кажется, понимаю, что вы хотите сказать, и понимаю, в какой части у нас возникает недопонимание, но пока что у меня не получается придумать способ донести свою мысль.
Смотрите:
Простое число — это такое число, которое не делиться на предыдущие простые, первое простое число — 2.
Рекурсивное определение бесконечного множества чисел. Проблема в том, что оно не «содержит бесконечное число элементов». Это не массив.
Для того, чтобы узнать какое простое число идет под номером 105513248123 вам придется потратить запредельное количество энергии и времени.
С другими рекурсивными определениями будет тоже самое. Вы не сможете сказать, что они дадут на N шаге алгоритма.

Одна система проще другой если обе дают одинаковые выходы при одинаковых входах и система описывается меньшим числом символов


Давайте продолжим на примере простых чисел.
У вас есть функция, она умеет считать все простые числа. Вам для каких-то целей потребовались простые числа от [49млн, 50млн]. Простое число номер 40 млн, простое число номер 40 млн + 1 и т.д.

// call: calcPrime(100000000)
// Извините за такой код, но суть мне кажется ясна.

static long calcPrime(int number) {
        int i = 0;
        List<Long> primes = new ArrayList<>();
        primes.add(2L);
        long current = 2;
        int countTo = number + 1;
        while (i < countTo) {
            boolean isPrime = true;
            for (long prime : primes) {
                if (current % prime == 0) {
                    isPrime = false;
                }
            }
            if(isPrime){
                primes.add(current);
                i++;
            }
            current++;
        }
        return primes.get(countTo);
    }


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

Вместо него вы можете залить уже посчитанные простые числа от 49млн до 50млн. Это огромный файл весом больше мегабайта. Он очень длинный и займет очень много места.
Зато доступ к ним будет за O1, если распихать их в массив.

Выход у двух систем будет одинаковый — вы получите свое простое число. Просто в одном случае это займет меньше секунды, а в другом… Я не знаю точно. Часы? Дни? Годы?

Считать, что любую систему можно разложить на элементарные системы сложности 1 единственным способом не верно. Считать, что сложность элементарных систем можно складывать, тоже не верно.


А можете подсказать где это в тексте? Я не вижу такого. Я писал про действия, а не про системы…
Непонятно сложность чего выше — алгоритма вычисляющего простое число или алгоритма выбирающего простое число из массива?

>А можете подсказать где это в тексте? Я не вижу такого. Я писал про действия, а не про системы…

Тут вы правы, речь везде идет про действия. Не уверен, что это меняет суть рассуждений. Каждая система преобразует вход в выход, а потому ей можно сопоставить единственную функцию/действие. Таким образом, с каждой абстрактной функцией/действием можно сопоставить множество систем, а любые выводы о действиях справедливы и для, скажу осторожно, соответствующих классов эквивалентностей систем.
Непонятно сложность чего выше — алгоритма вычисляющего простое число или алгоритма выбирающего простое число из массива?


Вот! И мне тоже!

Мой опыт подсказывает, что если я буду считать небольшие простые числа — то лучше вариант с алгоритмом, т.к. я потрачу на него меньше времени. Но если мне нужны большие простые — то лучше взять уже посчитанные, опять же потому что мне понадобиться меньше времени.
Я хочу узнать прав ли я, и если да, то в каких условиях какое из решений предпочтительнее.
И, если вам не сложно, пробегитесь по публикации и сообщите об ошибках или идеях для ее упрощения.

Ok. Начну с заголовка:
Простое объяснение простоты.

Сожалею, но предложенное объяснение мне простым не показалось. Прежде всего оно непростое по форме, нпр.:
По моим наблюдениям есть два основных кейса
Так и хочется спросить: зачем юзать анлийские слова в записи русскими буквами? Тем более, что через несколько строчек читаем это слово в переводе:
Случай, когда объект элементарен — понятен.

Разве такое «разнообразие» упрощает, а не усложняет восприятие?

Далее, переходя к сути — ИМХО много тумана по очевидным общеизвестным фактам. Нпр., многозначность слов:

X — простой, каковы наши ожидания от X?


Если Х — натуральное число, то лично у меня от X ожидание как от простого числа (2, 3, 5, 7, 11, 13, 17,… :) Подозреваю, что автор хотел сказать несколько иное.

С вашим кодом не станет легче работать, даже если все вокруг думают, что его сложность такая же, как у табуретки.
Общеизвестная и признанная концепция структурного программирования утверждает обратное: со спагетти-кодом работать заметно тяжелее.

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

Из того, что заканчиваю этот коммент, не следует, что с остальным я согласен.
PS ИМХО дискуссионные статьи не надо публиковать с меткой Tutorial, иначе неискушенный в затронутых вопросах читатель может подумать, что приведены признанные всеми утверждения.
С вашим кодом не станет легче работать, даже если все вокруг думают, что его сложность такая же, как у табуретки.

Общеизвестная и признанная концепция структурного программирования утверждает обратное: со спагетти-кодом работать заметно тяжелее.


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

Если код представлял из себя спагетти — он будет спагетти. Если «документацией» являются комментарии формата «здесь я сложил 2 числа» — у кода нет документации.
И никакие желания, уверенность и проч. тут не помогут.

Спасибо за комментарии, я с радостью поправлю эти моменты.

Почему вы обозначили сложность системы и сложность изменения системы одной и той же буквой C? Они же как правило не равны.

Смотрите. У вас есть какое-то множество вариантов «использования» вашей системы. Оно включает в себя все действия, которые вы можете с ней совершить. В том числе и «Внести изменения».

image

Совокупная сложность действий обозначена за C.
Изменение — одно из этих действий. Его сложность обозначена за Cи.
После совершения действия — система поменяется. У нее будет новая совокупная сложность. Она обозначена за C'.

В хабрапарсере есть глюк. Когда вы пишете C_и, обрамляя это символом доллар, то по крайней мере на мобильной версии сайта нижний индекс не отображается. Получается так: $ C_и $, что для меня сейчас выглядит в точности $ C $, что порождает непонятку. Возможно, это все потому, что использована русская и.

$ k = (C’-C)/C_и $ неправильно. Правильно $ k = (C-C’)/C_и $. Вы ведь хотите понизить а не повысить сложность системы.

Ой, спасибо. Действительно, местами перепутал)

Про парсер на мобилах не знал. Сейчас сам зайду с мобильного и посмотрю.
В описании системы «монета» декларируется эквивалентность состояния и элемента. Возможно, стоит воспользоваться бритвой Оккама и «срезать» лишний термин? Сделать проще :)
Это не совсем так.
Состояние системы две монетки = пара состояний монеток. (орел, решка) или (ребро, решка) и т.д.
Для одной монетки состояние действительно вырождается. Оно может быть: орел | решка | ребро.

Я решил написать все на Java, думаю если вам знаком любой объектный язык — будет проще)
github.com/lonelydeveloper97/ModelExample/tree/master/src/com/lonelydeveloper97/model
Состояние не может выродиться. Так как состояние — это часть жизненного цикла системы. Если вырождается состояние, то системы не существует, и нет предмета описания, если это описание системы.
Возможно я не правильно выразился.

Состояние одной монетки — это любой из элементов орел|решка|ребро. Возможные состояния монетки: {Орел, Решка, Ребро}.
Состояние элемента и его возможные состояния — это сам элемент. Он уже определен, мы не разбиваем его дальше.
Состояние системы две монетки: Пара состояний монеток 1 и 2. В моем определении состояние — рекурсивная функция, условие выхода из рекурсии — функция применена к элементу.

E — функция текущего состояния системы.
S — система. S = {S1...Si}, где Sk — подсистемы системы.
E(S) = (E(S1),… E(Si)). Если Sn — Элемент, то E(Sn) = Sn.

Для монеток:
Элементы: {орел, решка, ребро};

S — 2 монетки. S1 — Монетка 1, S2 — Монетка 2.
V = {орел, решка, ребро} — возможные состояния. Одинаковы для обеих монет.

e1 = орел. Это состояние монетки 1. Принадлежит V.
e2 = решка. Это состояние монетки 2. Принадлежит V.

S={S1,S2}, S1 = (V, e1), S2 =(V, e2).
E(S1) = e1. E(S2) = e2
E(S) = (e1, e2) = (орел, решка)

Перекинули монетки, E(S2) стало Орел.
E(S) = (e1, e2) = (орел, орел)

Система две по две монетки:
SS = {S2m1, S2m2}
E(SS) = (E(S2m1), E(S2m2)) = ((e1,e2), (e1,e2)) = ((орел, решка), (орел, решка)).

Я написал это математически и на Java. Вы можете выкачать репозиторий, который я скинул, изучить код. Его не много. Соотнести его с математическим выражением определений. Поставить breakpoint'ы и посмотреть, что оно работает ровно как я сказал. Попробовать описать другие системы в таких же терминах.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории