Программист постоянно делает баги. Это считается нормальным.
Причем не только баги-описки, но баги в самой логике работы программы.
Зачастую оказывается, что используемая модель некорректна даже в теории, при этом на практике она может даже более-менее успешно работать за счет каких-нибудь хакерских методов.
А что если предположить, что баг не должно быть вообще? Почему человек не может думать без ошибок? В чем причина ошибок?
Мне кажется, основная причина в том, что разработка происходит стихийно, каждый пишет, что ему придет в голову.
1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись.
2) Не учитываются свойства системы, о которых надо помнить при проектировании каждой операции (например, это могут быть такие свойства, как безопасность, одновременный доступ к ресурсам, блокировки, какие-то инварианты предметной области)
3) Не осуществляется полный анализ всех возможных вариантов. Такой анализ вообще возможен только в случае, когда у нас есть нечто хотя бы напоминающее абстрактную* математическую модель, в противном случае количество вариантов будет слишком большим для такого анализа. Например, нужен анализ всех вариантов одновременных операций при доступе нескольких пользователей к иерархии ресурсов.
Есть ли какой-то способ проектирования, который бы позволил если не избавиться от ошибок, то хотя бы минимизировать их число?
Может ли существовать какой-то паттерн мышления, которому надо следовать, чтобы добиться этого?
Программирование — еще молодая область, возможно лет через сто появится нормальная методология разработки, которая позволит человеку не совершать ошибок...
HH> Программист постоянно делает баги. Это считается нормальным. HH> Причем не только баги-описки, но баги в самой логике работы программы. HH> Зачастую оказывается, что используемая модель некорректна даже в теории, при этом на практике она может даже более-менее успешно работать за счет каких-нибудь хакерских методов.
HH> А что если предположить, что баг не должно быть вообще? Почему человек не может думать без ошибок? В чем причина ошибок?
HH> Мне кажется, основная причина в том, что разработка происходит стихийно, каждый пишет, что ему придет в голову.
HH> 1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись. HH> 2) Не учитываются свойства системы, о которых надо помнить при проектировании каждой операции (например, это могут быть такие свойства, как безопасность, одновременный доступ к ресурсам, блокировки, какие-то инварианты предметной области) HH> 3) Не осуществляется полный анализ всех возможных вариантов. Такой анализ вообще возможен только в случае, когда у нас есть нечто хотя бы напоминающее абстрактную* математическую модель, в противном случае количество вариантов будет слишком большим для такого анализа. Например, нужен анализ всех вариантов одновременных операций при доступе нескольких пользователей к иерархии ресурсов.
HH> Есть ли какой-то способ проектирования, который бы позволил если не избавиться от ошибок, то хотя бы минимизировать их число? HH> Может ли существовать какой-то паттерн мышления, которому надо следовать, чтобы добиться этого?
HH> Программирование — еще молодая область, возможно лет через сто появится нормальная методология разработки, которая позволит человеку не совершать ошибок...
HH>*Под абстракцией понимается выделение существенного.
Солнца клонилось к закату, а старушки все падали, и падали из окон... а математики, все искали и искали серебряннную пулю...
Здравствуйте, HrorH, Вы писали:
HH> А что если предположить, что баг не должно быть вообще? Почему человек не может думать без ошибок? В чем причина ошибок?
HH> Мне кажется, основная причина в том, что разработка происходит стихийно, каждый пишет, что ему придет в голову.
Золотые слова. Работа программиста сравнима с работой инженера проектирующего самолет, но при этом обладает таким вреднейшим качеством, как кажущаяся легкость модификации уже сделанного. Вторая проблема программирования: обычно человек видит сразу решения каких-то частных областей, зависящих от его собственного склада ума. Кто-то сразу видит общую архитектуру, придавая крайне малое значение деталям реализации; кто-то видит реализацию отдельных частей алгоритма, упуская общую архитектуру. Начиная работать с программой, человек начинает с именно с областей наиболее близких ему, генерируя заплатки в тех местах, которые кажутся ему не столь важными. Во что это все выливается — все вы прекрасно знаете.
Сравните это с работой инженера, который вынужден прорабатывать все изначально, перед тем как готовые чертежи уйдут на заводы. Цена ошибки тут велика и может вылиться в миллионы рублей/долларов. По сути инженер в чертежах, схемах, диаграммах как раз строит этакую полную модель будущего изделия, которой так не хватает программистам.
Ошибка работы программиста тоже очень велика и тоже очень часто выливается в огромные убытки. Но из-за некой "виртуальности" или "несерьезности" его работы, кажущейся ему самому и его начальству, мало кто удосуживается достаточным проектированием будущей программы. Движимые принципом "лучше быстрее, чем качественнее" мы роняем наши "самолеты", пускаем под откос "поезда", но все это сходит нам с рук. А ведь программирование — это в меньшей мере искусство, и в большей — наука. Тенденций к исправлению тоже не видно. Печально.
HH> А что если предположить, что баг не должно быть вообще? Почему человек не может думать без ошибок? В чем причина ошибок?
В самом устройстве человека?
HH> Мне кажется, основная причина в том, что разработка происходит стихийно, каждый пишет, что ему придет в голову.
HH> 1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись. HH> 2) Не учитываются свойства системы, о которых надо помнить при проектировании каждой операции (например, это могут быть такие свойства, как безопасность, одновременный доступ к ресурсам, блокировки, какие-то инварианты предметной области) HH> 3) Не осуществляется полный анализ всех возможных вариантов. Такой анализ вообще возможен только в случае, когда у нас есть нечто хотя бы напоминающее абстрактную* математическую модель, в противном случае количество вариантов будет слишком большим для такого анализа. Например, нужен анализ всех вариантов одновременных операций при доступе нескольких пользователей к иерархии ресурсов.
Бюджет и сроки любого проекта ограничены, поэтому перебрать все варианты зачастую просто невозможно. Поэтому берется модель которая устраивает всех(почти) и реализуется
HH> Есть ли какой-то способ проектирования, который бы позволил если не избавиться от ошибок, то хотя бы минимизировать их число? HH> Может ли существовать какой-то паттерн мышления, которому надо следовать, чтобы добиться этого?
HH> Программирование — еще молодая область, возможно лет через сто появится нормальная методология разработки, которая позволит человеку не совершать ошибок...
Нет ни одной области человеческой деятельности где бы не было ошибок. Похоже это невозможно.
Над этой задачей работает много исследователей, и успехи тоже есть. Есть я зыки которые позволяют верифицировать определенные контракты.
К сожалению , очень часто на практике, трудностью является создание формального описания для решения задачи. Т.е. уже на этапе построения спецификации мы не можем избавиться от человеческих ошибок и плохой эфективности.
Зато в областях где каждая ошибка стоит очень дорого, применяются соответствующие интсрументы. Например верификация микросхем и т.п.
Спасибо за тему. Вопрос конечно стар как мир, что как бы намекает, но всё же.
Первое. Человеку свойственно ошибаться — смеритесь. Иногда какой-нибудь Фобос-Грунт будет падать и вывод здесь только один — то, что ошибка может случиться должно быть предусмотренно заранее. Где-то помнится проскальзывала история о том, как код на каком-то марсоходе дебажили удалённо, тобишь с Земли. Гениально! Так и надо.
Второе. Сложность задачи, которую может охватить человек, ограничена. Проше и дешевле (хотя, вследствии неграммотного руководства, невсегда) написать программу и посмотреть, что будет. Помните как Эдисон изобрёл лампочку — просто тупо пробовал все варианты. И знаете что — это сработало. Программировать — это не здание строить. Пробовать разные варианты здесь дёшево.
Третье. Мы всё ещё используем слишком низкоуровневые языки программирования. Чтобы вместить сложные задачи в голову человека, надо поднимать уровень абстракции. (Xотя сначало надо долго и нудно впихивать эти абстракции в голову самого человека. Начиная с "у меня было два яблока, одно отдал, сколько осталось?". А это я о чём? Правильно — об образовании). Иными словами надо улучшать инструменты, точнее использовать другие языки программирования. Будущее проблескивает где-то за декларативными языками программирования. Точнее к сожалению выразиться не могу. Так мне подсказывает моя программистская интуиция. Пока мои собственные попытки как-то собрать свои разрозненные мысли по субжекту терпят неудачу. Нахожусь в постоянной погоне за идеальной программой. Жду просветления.
Здравствуйте, HrorH, Вы писали:
HH> Есть ли какой-то способ проектирования, который бы позволил если не избавиться от ошибок, то хотя бы минимизировать их число? HH> Может ли существовать какой-то паттерн мышления, которому надо следовать, чтобы добиться этого?
Прочитайте Дисциплину программирования Эдсгера Дейкстры.
А после нее — Наука программирования Дэвида Гриса.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, HrorH, Вы писали:
HH> Программирование — еще молодая область, возможно лет через сто появится нормальная методология разработки, которая позволит человеку не совершать ошибок...
Дома строят уже сотни тысяч лет, а ошибки всё совершают и совершают.
Программы без ошибок появятся, когда появится искусственный интеллект.
Здравствуйте, vsb, Вы писали:
vsb>Здравствуйте, HrorH, Вы писали:
HH>> Программирование — еще молодая область, возможно лет через сто появится нормальная методология разработки, которая позволит человеку не совершать ошибок...
vsb>Дома строят уже сотни тысяч лет, а ошибки всё совершают и совершают.
vsb>Программы без ошибок появятся, когда появится искусственный интеллект.
ИИ не "появится", его создадут. И тоже с ошибками...
Здравствуйте, Artifact, Вы писали:
A>Здравствуйте, HrorH, Вы писали:
A>Спасибо за тему. Вопрос конечно стар как мир, что как бы намекает, но всё же.
Вам спасибо, что это кому-то интересно.
A>Первое. Человеку свойственно ошибаться — смеритесь. Иногда какой-нибудь Фобос-Грунт будет падать и вывод здесь только один — то, что ошибка может случиться должно быть предусмотренно заранее. Где-то помнится проскальзывала история о том, как код на каком-то марсоходе дебажили удалённо, тобишь с Земли. Гениально! Так и надо.
Попробуете доказать, что человеку свойственно ошибаться?
Если серьезно, то каждая ошибка всегда имеет конкретную причину, я попытался выявить список таких причин в первом посте.
A>Второе. Сложность задачи, которую может охватить человек, ограничена. Проше и дешевле (хотя, вследствии неграммотного руководства, невсегда) написать программу и посмотреть, что будет. Помните как Эдисон изобрёл лампочку — просто тупо пробовал все варианты. И знаете что — это сработало. Программировать — это не здание строить. Пробовать разные варианты здесь дёшево.
То, что сложность задачи, которую может охватить человек, ограничена, почему-то не так мешает в других областях. Тут уже писали про инженера.
Пробовать разные варианты, это хорошо в случае, когда надо, чтобы работал хотя бы один вариант. Программа должна работать для всех возможных вариантов использования.
A>Третье. Мы всё ещё используем слишком низкоуровневые языки программирования. Чтобы вместить сложные задачи в голову человека, надо поднимать уровень абстракции. (Xотя сначало надо долго и нудно впихивать эти абстракции в голову самого человека. Начиная с "у меня было два яблока, одно отдал, сколько осталось?". А это я о чём? Правильно — об образовании). Иными словами надо улучшать инструменты, точнее использовать другие языки программирования. Будущее проблескивает где-то за декларативными языками программирования. Точнее к сожалению выразиться не могу. Так мне подсказывает моя программистская интуиция. Пока мои собственные попытки как-то собрать свои разрозненные мысли по субжекту терпят неудачу. Нахожусь в постоянной погоне за идеальной программой. Жду просветления.
HH> Причем не только баги-описки, но баги в самой логике работы программы. HH> Зачастую оказывается, что используемая модель некорректна даже в теории, при этом на практике она может даже более-менее успешно работать за счет каких-нибудь хакерских методов.
Вообще-то как раз описки — дело пустяковое. А вот отсутствие самой теории, скорей закономерность.
HH> 1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись.
Сформулируйте математически предметную область бухгалтерского учета, управления бизнес-процессами, работы с клиентами.
Чтобы доказать теоремы.
HH> 2) Не учитываются свойства системы, о которых надо помнить при проектировании каждой операции (например, это могут быть такие свойства, как безопасность, одновременный доступ к ресурсам, блокировки, какие-то инварианты предметной области)
Сложно учесть то, что появляется ПОСЛЕ ввода системы в эксплуатацию.
Но даже до ввода — покажите затраты применимости проектирования каждой операции в обычном таком опердене.
HH> 3) Не осуществляется полный анализ всех возможных вариантов.
Как бы да. Математики наплодили всяких разговоров о P и NP. Нет чтобы на парочке A4 проанализировать все варианты.
HH>Такой анализ вообще возможен только в случае, когда у нас есть нечто хотя бы напоминающее абстрактную* математическую модель,
К ответу на п1:
А математики уже решили уравнения Навье-Стокса? Или задачу о трех(всего лишь!) телах?
HH> Есть ли какой-то способ проектирования, который бы позволил если не избавиться от ошибок, то хотя бы минимизировать их число?
У математиков точно нет. Математики вообще не занимаются проектированием.
Инженеры да, весьма часто прибегают к математике при проектировании. Но вот странно — почему-то есть хорошо спроектированные самолеты и мосты, а почему-то плохо. Может потому что в проектировании чего-либо немало от шаманства?
Чего уж говорить о выражении своих мыслей на формализованном языке программирования. Да, работающая программа обладает рядом свойств которые можно зафиксировать и количественно и качественно. Вот только тут как в китайской присказке — "На ковре с утками не найдешь иглы ее вышивавшей"
HH> Может ли существовать какой-то паттерн мышления, которому надо следовать, чтобы добиться этого?
Может.
Осталась малость — заставить программистов=людей мыслить по этому паттерну.
А вот тут проблемы озвучены уже наверное с 3 лет.
1. почему человек рассудив что правильно — поступает неправильно.
2. И почему человек не хозяин собственным мыслям.
HH> Программирование — еще молодая область, возможно лет через сто появится нормальная методология разработки, которая позволит человеку не совершать ошибок...
Программирование — в первую очередь прикладная область. А значит все в этой области:
1. отражение неразрешенных (а может и неразрешимых) проблем в чисто абстрактных дисциплинах — в первую очередь математике
2. влияние действительно мира, закономерности которого могут быть изучены неверно, или неизвестны.
HH>*Под абстракцией понимается выделение существенного.
... за счет отбрасывания несущественных деталей.
Покажите только безошибочную методику отделения существенного от несущественного и сразу счастья всем прибавится.
Здравствуйте, HrorH, Вы писали:
HH>То, что сложность задачи, которую может охватить человек, ограничена, почему-то не так мешает в других областях. Тут уже писали про инженера.
С чего Вы взяли, что не мешает? Те же инженеры, проектирующие самолеты, регулярно ошибаются. Причем эти ошибки бывают что доходят до производства и иногда приводят к гибели людей. А бывает, что становятся просто особенностями, слабостями самолета, с которыми обслуживающий персонал просто живет.
Здравствуйте, HrorH, Вы писали:
HH>Программа должна работать для всех возможных вариантов использования.
Позвольте не согласиться. Я считаю, что правильнее и надёжнее для каждого варианта писать отдельную программу.
Здравствуйте, HrorH, Вы писали:
A>>Первое. Человеку свойственно ошибаться — смеритесь. Иногда какой-нибудь Фобос-Грунт будет падать и вывод здесь только один — то, что ошибка может случиться должно быть предусмотренно заранее. Где-то помнится проскальзывала история о том, как код на каком-то марсоходе дебажили удалённо, тобишь с Земли. Гениально! Так и надо.
HH>Попробуете доказать, что человеку свойственно ошибаться?
Человеку свойственно переводить явления природы в систему символов (слова, цифры, команды языка программирования). Поскольку система символов — это лишь аппроксимация явлений окружающего мира, эта аппроксимация всегда выполняется с некоторыми неточностями. Отсюда вывод, что ошибки в рассуждениях, в моделировании, в процессе разработки — явление неизбежное, как следствие самой аппроксимации.
Когда программист пишет программу, он (как и любой другой специалист) проводит двойное преобразование: задание превращается в мыслительную модель, а эта модель уже воплощается в коде. И то и другое — суть преобразование из одних символов в другие, при этом на обоих этапах возможны ошибки.
HH>Если серьезно, то каждая ошибка всегда имеет конкретную причину, я попытался выявить список таких причин в первом посте.
Да, только эта причина устанавливается после проявления ошибки. Ошибки могут быть и в матмоделях, и в инвариантах, и во всём остальном. Притом больше того, у каждой ошибки есть не только причина, но ещё и имя с фамилией, и зачастую — не одно.
A>>Второе. Сложность задачи, которую может охватить человек, ограничена. Проше и дешевле (хотя, вследствии неграммотного руководства, невсегда) написать программу и посмотреть, что будет. Помните как Эдисон изобрёл лампочку — просто тупо пробовал все варианты. И знаете что — это сработало. Программировать — это не здание строить. Пробовать разные варианты здесь дёшево.
HH>То, что сложность задачи, которую может охватить человек, ограничена, почему-то не так мешает в других областях. Тут уже писали про инженера.
Мешает. Только в других областях перед "серийным производством" принято выписывать требования, тщательно верифицировать конструкторские решения и вообще всяко проверять друг друга. Это только в программировании принято уповать на "паттерны" чего бы то ни было — то на паттерны архитектур. то на паттерны мышления
HH>Пробовать разные варианты, это хорошо в случае, когда надо, чтобы работал хотя бы один вариант. Программа должна работать для всех возможных вариантов использования.
Программа и так всегда работает во всех вариантах использования. Просто в некоторых случаях её работа считается отклоняющейся от спецификации. А некоторые случаи считаются недопустимыми. Эту проблему, в принципе, могут помочь решить языки с автоматической проверкой корректности программы по отношению к формальной спецификации, Но ни один такой язык не защитит от ошибок в самой спецификации.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Skynin, Вы писали:
HH>> Причем не только баги-описки, но баги в самой логике работы программы. HH>> Зачастую оказывается, что используемая модель некорректна даже в теории, при этом на практике она может даже более-менее успешно работать за счет каких-нибудь хакерских методов. S>Вообще-то как раз описки — дело пустяковое. А вот отсутствие самой теории, скорей закономерность.
Согласен, причем закономерность печальная.
HH>> 1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись. S>Сформулируйте математически предметную область бухгалтерского учета, управления бизнес-процессами, работы с клиентами. S>Чтобы доказать теоремы.
При такой общей постановке технического задания не то что математическую модель, а даже самую кривую программу не написать.
Если же поставить конкретные задачи, то некоторые умные люди уже сейчас для многих из них смогут подобрать полезные модели.
HH>> 2) Не учитываются свойства системы, о которых надо помнить при проектировании каждой операции (например, это могут быть такие свойства, как безопасность, одновременный доступ к ресурсам, блокировки, какие-то инварианты предметной области) S>Сложно учесть то, что появляется ПОСЛЕ ввода системы в эксплуатацию. S>Но даже до ввода — покажите затраты применимости проектирования каждой операции в обычном таком опердене.
Наверно не покажу. Хотя бы потому, что не очень понимаю, что есть опердень. И что есть затраты применимости проектирования.
HH>> 3) Не осуществляется полный анализ всех возможных вариантов. S>Как бы да. Математики наплодили всяких разговоров о P и NP. Нет чтобы на парочке A4 проанализировать все варианты.
Я так понимаю, что эти разговоры не мешают рассмативать задачи с конечным числом вариантов, которые очень часто встречаются на практике.
В этом топике приводили ссылку на доказательтство корректности ядра операционной системы или чего-то такого.
HH>>Такой анализ вообще возможен только в случае, когда у нас есть нечто хотя бы напоминающее абстрактную* математическую модель, S>К ответу на п1: S>А математики уже решили уравнения Навье-Стокса? Или задачу о трех(всего лишь!) телах?
И что из этого следует? Что нельзя решить никакую задачу?
HH>> Есть ли какой-то способ проектирования, который бы позволил если не избавиться от ошибок, то хотя бы минимизировать их число? S>У математиков точно нет. Математики вообще не занимаются проектированием. S>Инженеры да, весьма часто прибегают к математике при проектировании. Но вот странно — почему-то есть хорошо спроектированные самолеты и мосты, а почему-то плохо. Может потому что в проектировании чего-либо немало от шаманства? S>Чего уж говорить о выражении своих мыслей на формализованном языке программирования. Да, работающая программа обладает рядом свойств которые можно зафиксировать и количественно и качественно. Вот только тут как в китайской присказке — "На ковре с утками не найдешь иглы ее вышивавшей"
HH>> Может ли существовать какой-то паттерн мышления, которому надо следовать, чтобы добиться этого? S>Может. S>Осталась малость — заставить программистов=людей мыслить по этому паттерну. S>А вот тут проблемы озвучены уже наверное с 3 лет. S>1. почему человек рассудив что правильно — поступает неправильно. S>2. И почему человек не хозяин собственным мыслям.
Философия — это хорошо, когда она на своем месте. "Доктор, я буду жить?" — "А смысл?"
HH>> Программирование — еще молодая область, возможно лет через сто появится нормальная методология разработки, которая позволит человеку не совершать ошибок... S>Программирование — в первую очередь прикладная область. А значит все в этой области: S>1. отражение неразрешенных (а может и неразрешимых) проблем в чисто абстрактных дисциплинах — в первую очередь математике S>2. влияние действительно мира, закономерности которого могут быть изучены неверно, или неизвестны.
Да, да. Программирование непознаваемо, закономерности действительного мира изучены неверно, все проблемы неразрешимы.
Может быть вернемся к практике, где вполне возможно просчитать и предусмотреть очень многие проблемы, и для этого не хватает только знаний и возможно, желания?
HH>>*Под абстракцией понимается выделение существенного. S>... за счет отбрасывания несущественных деталей. S>Покажите только безошибочную методику отделения существенного от несущественного и сразу счастья всем прибавится.
Не надо философии, в каждом случае требуется математическая модель, которая решает данные конкретные проблемы, а не все проблемы мира.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, HrorH, Вы писали:
HH>>Попробуете доказать, что человеку свойственно ошибаться?
ГВ>Человеку свойственно переводить явления природы в систему символов (слова, цифры, команды языка программирования). Поскольку система символов — это лишь аппроксимация явлений окружающего мира, эта аппроксимация всегда выполняется с некоторыми неточностями. Отсюда вывод, что ошибки в рассуждениях, в моделировании, в процессе разработки — явление неизбежное, как следствие самой аппроксимации.
ГВ>Когда программист пишет программу, он (как и любой другой специалист) проводит двойное преобразование: задание превращается в мыслительную модель, а эта модель уже воплощается в коде. И то и другое — суть преобразование из одних символов в другие, при этом на обоих этапах возможны ошибки.
Хорошо, давайте говорить только о том классе ошибок, которые можно отловить, создав математическую модель и т.д. Ошибки, которые для своего разрешения требуют йогических практик, впадения в нирвану, и непосредственного созерцания Божественной Истины, рассматривать не будем.
HH>>Если серьезно, то каждая ошибка всегда имеет конкретную причину, я попытался выявить список таких причин в первом посте.
ГВ>Да, только эта причина устанавливается после проявления ошибки. Ошибки могут быть и в матмоделях, и в инвариантах, и во всём остальном. Притом больше того, у каждой ошибки есть не только причина, но ещё и имя с фамилией, и зачастую — не одно.
Устанавливается причина после проявления ошибки, но поняв ее, можно попытаться больше не совершать таких ошибок. И ошибка не в фамилии, а в неверном алгоритме мышления.
HH>>То, что сложность задачи, которую может охватить человек, ограничена, почему-то не так мешает в других областях. Тут уже писали про инженера.
ГВ>Мешает. Только в других областях перед "серийным производством" принято выписывать требования, тщательно верифицировать конструкторские решения и вообще всяко проверять друг друга. Это только в программировании принято уповать на "паттерны" чего бы то ни было — то на паттерны архитектур. то на паттерны мышления
Блин, никто не умеет читать. Я написал "не так мешает". Все почему-то прочли "не мешает". Кстати об ошибках
Понятно, что паттерны мышления не всемогущи, но они могли бы помочь совершать меньше ошибок.
HH>>Пробовать разные варианты, это хорошо в случае, когда надо, чтобы работал хотя бы один вариант. Программа должна работать для всех возможных вариантов использования.
ГВ>Программа и так всегда работает во всех вариантах использования. Просто в некоторых случаях её работа считается отклоняющейся от спецификации. А некоторые случаи считаются недопустимыми. Эту проблему, в принципе, могут помочь решить языки с автоматической проверкой корректности программы по отношению к формальной спецификации, Но ни один такой язык не защитит от ошибок в самой спецификации.
Да, зато от этих ошибок, по-крайней мере от многих из них можно попытаться защититься другими способами (о которых я попытался написать в первом посте).
Здравствуйте, Artifact, Вы писали:
HH>>Программа должна работать для всех возможных вариантов использования. A>Позвольте не согласиться. Я считаю, что правильнее и надёжнее для каждого варианта писать отдельную программу.
А как же повторное использование кода?
Или это была шутка?
HH> Есть ли какой-то способ проектирования, который бы позволил если не избавиться от ошибок, то хотя бы минимизировать их число? HH> Может ли существовать какой-то паттерн мышления, которому надо следовать, чтобы добиться этого?
Ошибки появляются в следствии следующих причин:
1. "а это вообще должно было работать?"
2. неверная модель
3. забыты или нерассмотренны какие-то варианты поведения кода
4. опечатка
Ошибки первого рода возникают, когда программист даже не пытается обосновать и доказать правильность работы свое кода.
Ошибки второго рода провоцирует наше незнание, например, незнание — что требования к многопоточному коду отличаются от требований к однопоточному коду.
"Темные углы", они же вырожденные и частные случаи, и их нерасмотрение приводит к ошибкам третьего рода.
Опечатки заложены в природе человека, и даже так и называются — "человеческий фактор". Опечатки уменьшаются при концентрации всего внимания на одной задаче, но полностью от них избавиться не получается.
Для борьбы с этими ошибками есть стандартные рекомендации: пишите правильный код, много знайте, ничего не забывайте, и не теряйте концентрацию когда пишите код. Проблема этих рекомендаций: что они не говорят — а как это сделать?, и не говорят — а как убедиться: что правильности кода уже достаточно? что знаний о ситуации уже достаточно? что достаточно всего вспомнено? и что концентрации внимания тоже достаточно?
Стандартные рекомендации стоит подкрепить следующими привычками:
Предсказание. Основная привычка для защиты от ошибок: это привычка предсказывать поведение своего и чужого кода до запуска кода.
Всегда сначала пытаемся предсказать, как должен себя вести данный код: за сколько времени отработает, что выведет на экран, в каком порядке будут вызываться строки кода, какие будут промежуточные данные и т.д. (чем больше всяких предсказаний, тем лучше).
Потом код запускаем и проверяем свои предсказания, и если предсказанное не совпало с ожидаемым, то разбираемся почему наше представление не совпало с реальностью.
Полнота. Вторая привычка: предсказывать и рассматривать поведение на всем множестве внешних факторов, включая самые худшие сценарии (например, если читается файл определенный структуры, то каким будет поведение кода, если какие-то байты будут случайно изменены, или вообще, если файл сформирован "злоумышленником", который хочет наш код "завалить"?)
Здесь главное не надо бросаться в избыточность: явно фиксировать и обрабатывать в коде все возможные ошибки. достаточно, чтобы код вел себя адекватно: не портит данные, на ошибочную ситуацию формирует ошибку, не скрывает информацию по ошибке.
Разнообразие перепроверок. В большинстве случаев, нет гарантированного способа определить: достаточное или недостаточное кол-во предсказаний уже сделано, чтобы обеспечить правильность нашего представления?. Достаточно (или недостаточно) рассмотрено вариантов? Достаточно или недостаточно написано тестов? есть в коде опечатки или нет? и т.д. Здесь можно лишь рассчитывать на корреляцию, что чем больше разнообразных вариантов перепроверено, и не выявлено проблем, то тем больше вероятность, что наше представление и код правильный. Большинство действий по перепроверке рутинные и их можно переложить на компьютер: статическая типизация, регрессионное тестирование, проверка покрытие кода тестами, проверка, что у кода "хороший запах" и т.д.
Однородность кода. Если придерживаться предыдущих трех правил, то кол-во рассматриваемых вариантов растет лавинообразно по экспонециальному закону. Лавину можно минимизировать, если стараться писать однородный код.
возьмем два кода
for (uint i = items.Length - 1; i >= 0; --i)
{
var item = items[i];
//что-то делаем с item
}
и
foreach (var item in items.Reverse())
{
//что-то делаем с item
}
второй код более однородный, чем первый. в первом коде, для полноты необходимо рассматривать поведение i на границах: что надо написать, чтобы перебрать концевые элементы и при этом не выйти за границу массива: items.Length или items.Length — 1, и i >= 0 или i > 0; также необходимо проверить как себя ведет i "по ту сторону границы", и только вот здесь обнаружится ошибка..
второй код этого всего не имеет, потому что оно уже "спрятано" внутрь функции Reverse, и все эти варианты были рассмотрены при написании функции Reverse.
Привычки предсказывать и перепроверять предсказания уменьшает вероятность появление ошибок первого и второго рода. Привычка к однородному коду с перепроверкой уменьшает кол-во невыявленных опечаток. Привычка к полноте с перепроверкой уменьшает ошибки второго и третьего рода.
Здравствуйте, Васильич, Вы писали:
В>Золотые слова. Работа программиста сравнима с работой инженера проектирующего самолет, но при этом обладает таким вреднейшим качеством, как кажущаяся легкость модификации уже сделанного.
Совершенно согласен, хотя никак не могу понять, почему же математики не производят аналогичного говнища, несмотря на то, что "легкость модификации" результатов их труда вполне сопоставима.
I> почему же математики не производят аналогичного говнища, несмотря на то, что "легкость модификации" результатов их труда вполне сопоставима.
это вызвано лишь ошибкой твоего восприятия: с ошибками программ ты встречаешься каждый день, а с ошибками математиков ты не встречаешься.
взять хотя бы теорему ферма — за последние сто лет разного рода математиками было сформированы, наверное, миллионы доказательств ее правильности и все они оказались неверными, кроме последнего.
Здравствуйте, HrorH, Вы писали:
HH> Есть ли какой-то способ проектирования, который бы позволил если не избавиться от ошибок, то хотя бы минимизировать их число? HH> Может ли существовать какой-то паттерн мышления, которому надо следовать, чтобы добиться этого?
Если рассматривать программирование через призму управления сложностью, то всё получается гораздо лучше, чем обычно.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, HrorH, Вы писали:
HH>> Есть ли какой-то способ проектирования, который бы позволил если не избавиться от ошибок, то хотя бы минимизировать их число? HH>> Может ли существовать какой-то паттерн мышления, которому надо следовать, чтобы добиться этого?
IT>Если рассматривать программирование через призму управления сложностью, то всё получается гораздо лучше, чем обычно.
Извините, можно для тупых поподробнее или может быть ссылки на какую-то литературу.
Здравствуйте, VsevolodC, Вы писали:
VC>Здравствуйте, vsb, Вы писали:
vsb>>Программы без ошибок появятся, когда появится искусственный интеллект.
VC>ИИ не "появится", его создадут. И тоже с ошибками...
При этом способность совершать ошибки будет заложена в сам ИИ
Здравствуйте, DarkGray, Вы писали:
DG>это вызвано лишь ошибкой твоего восприятия: с ошибками программ ты встречаешься каждый день, а с ошибками математиков ты не встречаешься.
По-моему это самоуспокоение, тем более, что таким же образом можно попытаться убедить меня, что и у инженеров ошибок не меньше, но ведь это уж точно не так, о том, как работают инженеры какое-никакое представление у меня есть.
Здравствуйте, HrorH, Вы писали:
IT>>Если рассматривать программирование через призму управления сложностью, то всё получается гораздо лучше, чем обычно. HH>Извините, можно для тупых поподробнее или может быть ссылки на какую-то литературу.
Здравствуйте, HrorH, Вы писали:
HH> А что если предположить, что баг не должно быть вообще? Почему человек не может думать без ошибок? В чем причина ошибок?
HH> Мне кажется, основная причина в том, что разработка происходит стихийно, каждый пишет, что ему придет в голову.
А если это не так и причина в другом? Делая какое-то конечное умозаключение останавливаем мыслительный процесс, чтобы сказать что-то на вроде
HH> Программирование — еще молодая область, возможно лет через сто появится нормальная методология разработки, которая позволит человеку не совершать ошибок...
возможно через сто лет. Почему сто лет, почему не сейчас? Зачем ждать сто лет, тем более, что большинство явно не доживёт?
I>о том, как работают инженеры какое-никакое представление у меня есть.
ты свой единичный опыт, что инженеры работают "лучше", чем программисты — распространяешь на всю отрасль: что все инженеры работают лучше, чем программисты. на основании чего ты делаешь такой переход?
Шаттл с 6 космонавтами, например, взорвался по инженерным причинам, а не по программным.
При этом тот же Фейнман говорит, что это была не случайность, и что состояние инженерного комплекса было много хуже, чем программного.
В итоге хотелось бы заметить, что система проверки программного обеспечения компьютеров действительно показывает себя как высококачественная. Судя по всему, там нет места постепенному самообману путем снижения норм, что весьма характерно для систем безопасности твердотопливных ракета-носителей и основных двигателей шаттла. Для вящей убедительности добавлю, что руководство недавно предлагало прекратить такие сложные и дорогие испытания за их ненадобностью в последнее время истории запусков шаттла.
При этом с двигателями было все намного хуже:
За 250 000 секунд работы основные двигатели отказывали, вероятно, раз 16.
Список некоторых проблем (и их состояния):
Трещины лопаток турбины в топливных турбонасосах высокого давления (ТТНВД). (Возможно, решена.)
Трещины лопаток турбины в кислородных турбонасосах высокого давления (КТНВД). (Не решена.)
Пробой линии форсажного искрового воспламенителя (ФИВ). (Возможно, решена.)
Отказ контрольного вентиля для выпуска газов. (Вероятно, решена.)
Эрозия корпуса ФИВ. (Вероятно, решена.)
Растрескивание листового металла корпуса турбины ТТНВД. (Вероятно, решена.)
Повреждение футеровки труб для охлаждения ТТНВД. (Вероятно, решена.)
Отказ выходного коленчатого патрубка основной камеры сгорания. (Вероятно, решена.)
Смещение сварного шва входного коленчатого патрубка основной камеры сгорания. (Вероятно, решена.)
Субсинхронный вихрь КТНВД. (Вероятно, решена.)
Система аварийного отключения ускорения полета (частичный отказ системы с резервированием). (Вероятно, решена.)
Растрескивание подшипников. (Частично решена.)
Вибрация с частотой 4 000 герц, которая приводит некоторые двигатели в нерабочее состояние. (Не решена.)
Многие из этих, на первый взгляд, решенных проблем были видны уже на ранних стадиях использования новой конструкции: 13 из них появились в первые 125 000 секунд эксплуатации двигателя и только 3 – во вторые 125 000 секунд. Естественно, никогда нельзя быть уверенным, что все недостатки устранены; однако, возможно, в отношении некоторых недостатков стремились устранить не ту причину. Вполне разумно предположить, что в следующие 250000 секунд может произойти, по крайней мере, один сюрприз: вероятность равна 1/500 на двигатель на задание.
[..]
Инженеры в Рокетдайне, где производятся двигатели, оценивают полную вероятность как 1/10 000. Инженеры в Маршалле оценивают ее как 1/300, тогда как руководство НАСА, которому эти инженеры отправляют свои отчеты, утверждает, что вероятность равна 1/100 000. Независимый инженер, дающий НАСА консультации, счел разумной оценкой 1 или 2 к 100
[..]
Медленный сдвиг в направлении снижения коэффициента безопасности можно увидеть во множестве примеров.
Основная разница: это есть ли ОТК и как он построен. У инженеров есть лишь преимущество, что они на 100 лет больше потратили на выстраивание ОТК для проверки качества своей работы. А также сложностью входа на инженерный рынок: большинство решений делается уже существующими компаниями, у которых наработана школа ОТК. в программировании из-за его сильной изменчивости и низкого порога входа: есть большая доля новичков, которые не имеют выстроенного подхода к ОТК. В тоже время большое кол-во новичков и низкий порог входа обеспечивает бурное развитие отрасли.
добавлю, что очень важный показатель надежности системы: это запас прочности.
при этом в инженерной отрасли не ставится под сомнение необходимость такого запаса.
в программировании же до сих пор многие считают, что запас прочности это неважно — и используют тот же C/C++, которые не имеет запаса прочности вообще, и любая малейшая ошибка может привести к произвольным катастрофическим последствиям.
Здравствуйте, DarkGray, Вы писали:
DG>ты свой единичный опыт, что инженеры работают "лучше", чем программисты — распространяешь на всю отрасль: что все инженеры работают лучше, чем программисты. на основании чего ты делаешь такой переход?
По меньшей мере половина проблем возникавших со всякими электронными штуковинами, которыми я пользовался, были софтверного, а не хардверного характера. Причем повседневную битву с (Windows) компьютером, на работе или дома я не считаю, не считаю также и проблемы неудобства пользования, в конце концов это субъективно. Только зависания, неожиданные перезагрузки и т.п. Вот возьмем мобильный телефон, там и компьютер, и радиопередатчик, и дисплей, и аккумулятор, все на таком уровне, который еще 20 лет назад был недостижим. Это же хайтек не хуже космоса и ядреного оружия, просто продается за копейки по причине массового производства. И все ведь работает как часы, проблемы только с говняным софтом. А что в софте том такого сложного?
Здравствуйте, DarkGray, Вы писали:
DG>которые не имеет запаса прочности вообще, и любая малейшая ошибка может привести к произвольным катастрофическим последствиям.
Здравствуйте, DarkGray, Вы писали:
DG>в программировании же до сих пор многие считают, что запас прочности это неважно — и используют тот же C/C++, которые не имеет запаса прочности вообще, и любая малейшая ошибка может привести к произвольным катастрофическим последствиям.
C++ говоришь? А вот у меня был телефон Siemens, так тот иногда начинал вдруг крайне медленно реагировать, похоже мусор собирал, гад.
Здравствуйте, HrorH, Вы писали:
HH>А как же повторное использование кода?
С повторным использованием всё впорядке. Предполагается, что программа состоит из большого числа узлов, блоков, назовите как угодно. Каждый узел получает, что-то на вход и отдаёт что-то на выходе. По факту это принцип электросхемы. Аналогично Юникс пайпс, язык FP Джона Бэкуса, APL.
HH>Или это была шутка?
Нет, но смеяться можно
I>Только зависания, неожиданные перезагрузки и т.п.
непонятно, почему ты считаешь, что это чисто софтварные проблемы.
это может быть вызвано вплоть до физических проблем, когда состояние бита меняется космическим излучением.
насколько я помню, для не ECC-памяти — это оценивается как три случая в год при непрерывной работе устройства.
Здравствуйте, HrorH, Вы писали: HH> А что если предположить, что баг не должно быть вообще? Почему человек не может думать без ошибок? В чем причина ошибок?
Если предположить, что багов не должно быть вообще, то создание программы вырождается в нерешаемую задачу. Баги не побочный эффект программирования, баги это необходимый элемент программы. Собственно, любую программу можно представить как набор [потенциальных] багов.
Собственно, не стоит воспринимать баги как ошибки. Думаю, стоит говорить о недоработках.
HH> Мне кажется, основная причина в том, что разработка происходит стихийно, каждый пишет, что ему придет в голову.
А вот это тебе только кажется. Если бы писали то, что приходит в голову, жизнь была бы чудесной. Я не знаю, куда приходит то, что обычно пишут в коде, но это явно не голова.
HH> Есть ли какой-то способ проектирования, который бы позволил если не избавиться от ошибок, то хотя бы минимизировать их число? HH> Может ли существовать какой-то паттерн мышления, которому надо следовать, чтобы добиться этого?
Нет. Нет.
Всё, что нас не убивает, ещё горько об этом пожалеет.
Здравствуйте, IT, Вы писали: IT>Если рассматривать программирование через призму управления сложностью, то всё получается гораздо лучше, чем обычно.
Если рассматривать программирование через призму управления сложностью, то либо ошибок нет вообще в принципе, либо любая конструкция по дефолту является ошибкой.
Всё, что нас не убивает, ещё горько об этом пожалеет.
Здравствуйте, DarkGray, Вы писали:
DG>непонятно, почему ты считаешь, что это чисто софтварные проблемы. DG>это может быть вызвано вплоть до физических проблем, когда состояние бита меняется космическим излучением. DG>насколько я помню, для не ECC-памяти — это оценивается как три случая в год при непрерывной работе устройства.
Не, ну я ж профи. Проблемы-то повторяются, во многих случаях я их репродуцировать могу.
Здравствуйте, Ромашка, Вы писали:
IT>>Если рассматривать программирование через призму управления сложностью, то всё получается гораздо лучше, чем обычно. Р>Если рассматривать программирование через призму управления сложностью, то либо ошибок нет вообще в принципе, либо любая конструкция по дефолту является ошибкой.
Не вижу в твоём утверждении логической связи между тем, что после 'если' и после 'то'.
Если нам не помогут, то мы тоже никого не пощадим.
DG>>которые не имеет запаса прочности вообще, и любая малейшая ошибка может привести к произвольным катастрофическим последствиям.
S>а Вы не могли бы по подробнее?..
запас прочности можно рассматривать как минимизацию функции F, где F — это функция ухудшение работоспособности системы от сбоя (или изменения условий эксплуатации) отдельной части системы.
соответственно, для машины ожидается, что неисправность лампочки или прокол колеса не приводят к разносу двигателя.
для программы на C/C++ такого ожидания гарантировать нельзя, малейшая ошибка в самом некритическом коде может привести к "проезду по памяти" и отказу любого другого узла (сколько угодно критического), находящегося в той же самой памяти.
частично это проблема решается разнесением по отдельным процессам, что часто делается в nix-программах, но это имеет естественный предел: узлы можно разнести по 2-10 процессам(максимум тысячу), но миллион узлов уже друг от друга таким подходом не разнесешь.
Тише... Тише... Никому не рассказывай, что можно вообще не делать ошибок. Потому что для того чтобы не делать ошибок нужно реально решать NP-полные задачи. А человек этого сделать не может по определению. А значит это будут машины. А если они решают NP полные задачи, значит они же могут их и ставить, что в свою очередь NP полная задача. И любой холодильник или стиральная машина будет плевать в тебя машинным маслом: "Тупая органика". И любой пылесос тебе скажет: "убери за мной, тряпка недоразвитая". И сгинет человечество, как промежуточный этап эволюции, уже ненужный никому, и отслуживший своё. Так что, программист помни. Делая ошибки ты стоишь на страже человечества.
Здравствуйте, HrorH, Вы писали:
HH>Хорошо, давайте говорить только о том классе ошибок, которые можно отловить, создав математическую модель и т.д. Ошибки, которые для своего разрешения требуют йогических практик, впадения в нирвану, и непосредственного созерцания Божественной Истины, рассматривать не будем.
Тогда мы автоматически исключаем те ошибки, которые будут связаны с неправильно выбранной математической моделью. То есть мы сузим круг поисков до: "Где светлей".
HH>>>Если серьезно, то каждая ошибка всегда имеет конкретную причину, я попытался выявить список таких причин в первом посте. ГВ>>Да, только эта причина устанавливается после проявления ошибки. Ошибки могут быть и в матмоделях, и в инвариантах, и во всём остальном. Притом больше того, у каждой ошибки есть не только причина, но ещё и имя с фамилией, и зачастую — не одно.
HH>Устанавливается причина после проявления ошибки, но поняв ее, можно попытаться больше не совершать таких ошибок. И ошибка не в фамилии, а в неверном алгоритме мышления.
Я не вижу в первом предложении ни одного основания для утверждения: "ошибка... в неверном алгоритме мышления". Такие нарушения в логике изложения часто становятся причиной и ошибок, и ненужных затягиваний разработки.
HH>>>То, что сложность задачи, которую может охватить человек, ограничена, почему-то не так мешает в других областях. Тут уже писали про инженера. ГВ>>Мешает. Только в других областях перед "серийным производством" принято выписывать требования, тщательно верифицировать конструкторские решения и вообще всяко проверять друг друга. Это только в программировании принято уповать на "паттерны" чего бы то ни было — то на паттерны архитектур. то на паттерны мышления
HH>Блин, никто не умеет читать. Я написал "не так мешает". Все почему-то прочли "не мешает". Кстати об ошибках
Плохой писатель обвиняет читателей в неумении читать, а хороший переформулирует мысль. Читать все умеют, просто ты употребил сравнение так, словно хочешь сказать, что в "других" областях пренебрежимо малы помехи, связанные с ограниченным объёмом человеческой головы. Да, это как раз об особенностях восприятия письменного текста: неудачно выбранная лексика создаёт массу сложностей в передаче информации от человека к человеку.
HH>Понятно, что паттерны мышления не всемогущи, но они могли бы помочь совершать меньше ошибок.
Может быть, только здесь придётся касаться очень глубоких индивидуальных вещей. Простейший источник ошибок: подумал, что всё ясно, а оказалось, что понял неправильно. Как предотвратить эту ситуацию? Можно пуститься в метафизику с выяснением градаций сомнений и спектра ощущений, которые сопутствуют той или иной степени уверенности. А можно пойти традиционным и надёжным путём: предписать детализировать всё, чтобы изложенное на бумаге не содержало противоречий и недосказанностей, а документы прогонять по одному-двум дополнительным review. Создать несколько томов типовых требований и способов их воплощений, чтоб не повторяться всякий раз, полученный продукт тщательно оттестировать, подписать акты приёмки... И никаких паттернов в голову заколачивать не надо, всё придумано и обкатано не один десяток лет назад.
HH>>>Пробовать разные варианты, это хорошо в случае, когда надо, чтобы работал хотя бы один вариант. Программа должна работать для всех возможных вариантов использования.
ГВ>>Программа и так всегда работает во всех вариантах использования. Просто в некоторых случаях её работа считается отклоняющейся от спецификации. А некоторые случаи считаются недопустимыми. Эту проблему, в принципе, могут помочь решить языки с автоматической проверкой корректности программы по отношению к формальной спецификации, Но ни один такой язык не защитит от ошибок в самой спецификации.
HH>Да, зато от этих ошибок, по-крайней мере от многих из них можно попытаться защититься другими способами (о которых я попытался написать в первом посте).
Я что-то не увидел в твоём первом посте описания способов защиты от ошибок — это раз. А два — надёжная защита надёжна потому, что работает вне зависимости от субъекта. Этим хороши разнообразные нормированные процедуры с разделением ответственностей: один пишет, другой вычитывает, третий принимает решение о "заходе на второй круг". Несколько специалистов пропустят ошибку с меньшей вероятностью, чем один. При условии, конечно, что они добросовестно выполняют свои обязанности, наделены соответствующими полномочиями и дееспособны в рамках этих полномочий.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, HrorH, Вы писали:
HH> 1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись.
Возможно, что формулировка мат. модели или детальный анализ предметной области окажется сложнее, чем написание программы.
В примитивных случаях: полным перебором можно найти решение, которое после строго обосновать и вывести формулу.
В более сложном: сделать несколько прототипов системы на простом языке.
Здравствуйте, HrorH, Вы писали:
HH>При такой общей постановке технического задания не то что математическую модель, а даже самую кривую программу не написать. HH>Если же поставить конкретные задачи, то некоторые умные люди уже сейчас для многих из них смогут подобрать полезные модели.
Не могут, потому что таких моделей нет. Как там, в "Фактах и заблуждениях ..."
Бухгалтерские программы пишутся с 70ых годов, но поверьте, что в этот момент, когда вы читаете эти сроки пишутся новые, и с 10ок их уже близки к провалу.
Конкретные задачи имеют хорошие модели разве что вывод в консоль "Hello world"
Остальное — опыт, чутье, по аналогии с успешными.
HH>Наверно не покажу. Хотя бы потому, что не очень понимаю, что есть опердень. И что есть затраты применимости проектирования.
Опердень — банковское ПО "операционный день".
Но вы и складскую программу не спроектируете математике. Вернее — может быть и можно, но выйдет так дорого, причем не избавит от проблем при ее эксплуатации что нет смысла.
Понимаете, те "математики" что мне встречались сплошь говорят о тестировании алгоритмов. Причем простеньких, типа сортировки.
А работающая компьютерная программа есть конечный автомат с весьма приличным числом состояний. Причем на эти состояния влияют нередко — внешний условия.
HH>Я так понимаю, что эти разговоры не мешают рассмативать задачи с конечным числом вариантов, которые очень часто встречаются на практике.
На практике то как раз встречаются редко.
Хотя, пару миллиардов — да, тоже конечное число вариантов.
HH>В этом топике приводили ссылку на доказательтство корректности ядра операционной системы или чего-то такого.
Пропустил. Но пусть вначале драйвера научаться на корректность тестировать.
HH> И что из этого следует? Что нельзя решить никакую задачу?
Из этого следует что математика совсем не панацея если даже свои собственные проблемы не только не решила, а даже пока не придумала с какого боку за них браться.
А "через миллион лет", и "нельзя решить" для меня смертного тождественные выражения.
HH>Философия — это хорошо, когда она на своем месте. "Доктор, я буду жить?" — "А смысл?"
Ну так вы же развели бытовую философию
Я бы тоже лучше о практике послушал.
HH>Да, да. Программирование непознаваемо, закономерности действительного мира изучены неверно, все проблемы неразрешимы.
Я такого не утверждал.
HH>Может быть вернемся к практике, где вполне возможно просчитать и предусмотреть очень многие проблемы, и для этого не хватает только знаний и возможно, желания?
Так я пока ее от вас и не вижу. И за года в программировании много слышал о "математике" как средстве решения проблем, да только на практике как-то мало видел.
Так что повторюсь, вы не пожелания и мечты свои — а практику озвучьте.
HH>Не надо философии, в каждом случае требуется математическая модель, которая решает данные конкретные проблемы, а не все проблемы мира.
Не надо пустых слов, приведите примеры математических моделей для работающих компьютерных программ. Модели, по которым создавались эти программы.
Я вот почитал остальное обсуждение на момент написания этой строчки.
Где там конкретика?
А насчет философии, так вот мое ИМХО что большинство юных мечтателей о математике как решении проблем — как раз ею неумело пытаются подменить конкретную мозговую работу, как математиков так и инженеров.
Здравствуйте, Nuzhny, Вы писали:
N>Возможно, что формулировка мат. модели или детальный анализ предметной области окажется сложнее, чем написание программы.
Не возможно, а так и будет, поэтому то математиков ушли из отрасли еще в 70ых. Утрировано конечно. Встречается ПО где такой анализ обязателен и доныне — например сервера БД и их алгоритмы обработки данных.
N>В примитивных случаях: полным перебором можно найти решение, которое после строго обосновать и вывести формулу.
Решение — чего? Немногое число программ работает с данными полученными только на старте алгоритма.
А большинство программ в процессе работы запрашивают данные.
И собственно — а текст компьютерной программы разве не та самая конечная формула?
Перебор же собственно и используется при тестировании. Или вообще разработка ведется по TDD.
Так же собственно и математики поступают, когда не могут разрешить общий случай — прибегают к решению частных случаев.
N>В более сложном: сделать несколько прототипов системы на простом языке.
Делаются, как же без них. Только математика тут ни при чем — создание макета давно известно человечеству.
HH> Есть ли какой-то способ проектирования, который бы позволил если не избавиться от ошибок, то хотя бы минимизировать их число? HH> Может ли существовать какой-то паттерн мышления, которому надо следовать, чтобы добиться этого?
В качестве средства описания мне до сих пор нравятся старые добрые структурно-информационные временные схемы (СИВС)...
Здравствуйте, os24ever, Вы писали:
O>В качестве средства описания мне до сих пор нравятся старые добрые структурно-информационные временные схемы (СИВС)...
И замечу что математики в них нет. Поэтому в таком, или ином виде и рисуются такие схемы. Это можно сказать обязательная часть проектирования.
Правда, до надежно работающей компьютерной программы от них еще весьма далеко.
Например из таких схем плохо видно — а области единых транзакций какие будут?
Так вот и реальный проект компьютерной программы что та береговая линия. И математика тут слабо поможет, потому что — ну вот такая она эта предметная область, кривая, косая, с массой исключений и уникальностей. И какой математикой будем проверять соответствие выбранных моделей — действительности?
Здравствуйте, Skynin, Вы писали:
S>Здравствуйте, os24ever, Вы писали:
O>>В качестве средства описания мне до сих пор нравятся старые добрые структурно-информационные временные схемы (СИВС)... S>И замечу что математики в них нет. Поэтому в таком, или ином виде и рисуются такие схемы. Это можно сказать обязательная часть проектирования.
Не любите Вы математику
Если серьезно, то математическая модель у меня появляется (к сожалению) уже ближе к концу разработки программы, когда я уже четко представляю то, о чем пишу. В одном случае я использовал нотацию теории множеств, добавив в нее немного своей нотации. Получилось не вполне математически строго, но как не странно, эти формулы помогли мне найти ошибку в программе. Причем я отчетливо понимаю, что данная конкретная нотация может быть полезна только для данного случая (и аналогичных).
Если Вам не нравится математика, то модель не обязана быть строго математической, достаточно того, чтобы она помогала находить ошибки.
Настоящие же профи могут использовать настоящую математику (алгебру — моноиды, монады, аппликативные функторы и т.п.), причем достаточно сложную.
Я смотрю в сторону таких вещей как денотационная семантика, функциональное программирование.
Для примера можно привести библиотеку функционального реактивного программирования.
Конечно, это уже высший пилотаж, и от всех людей нельзя требовать, чтобы они даже понимали о чем речь в этой статье.
Но библиотеку сделали именно по математической модели. Так что вполне возможно делать нетривиальные программы, используя математику.
Нам же, кто математику знает плохо, может быть полезна даже не очень строгая формулировка модели, лишь бы она помогала достичь полноты, о которой говорили выше.
Посмотрите также ссылку, которую давали выше, по теории сложности и SRP. Это интересно.
Здравствуйте, DarkGray, Вы писали:
DG>второй код более однородный, чем первый.
Неудачный пример. foreach проще for'а не потому что однороднее, а потому что использует меньше сущностей. Однородность это скорее стандартность, т.е. если похожие задачи мы по всему коду будем решать схожим образом, и в плане оформления и в плане построения алгоритма, то вероятность допустить ошибку снизится.
А принцип минимума сущностей должен идти в твоем списке отдельным пунктом, причем пожалуй самым важным. Т.к. тот же геттерный подход по сравнению с сеттерным снижает количество ошибок на порядок, чего никакими улучшениями "предсказаний, полноты, однородности кода, разнообразия перепроверок" добиться невозможно (при сопоставимых усилиях).
Здравствуйте, HrorH, Вы писали:
HH>Не любите Вы математику
Так это Ваше имя?
Я не люблю "математиков", а не математику.
Примерно как Linux уважаю, в вот "форумных линуксоидов" обычно — нет
HH>Если серьезно, то математическая модель у меня появляется (к сожалению) уже ближе к концу разработки программы, когда я уже четко представляю то, о чем пишу. ... Причем я отчетливо понимаю, что данная конкретная нотация может быть полезна только для данного случая (и аналогичных).
Если серьезно, то стоит назвать область в которой пишите программы. Как я вскользь упоминал — вполне представляю такие области, где применение строго математических методов будет эффективным.
HH>Если Вам не нравится математика, то модель не обязана быть строго математической, достаточно того, чтобы она помогала находить ошибки.
Повторюсь — мне не нравятся верующие. Математика не в состоянии помогать ошибки в программировании в подавляющем числе случаев.
В предыдущих постах бегло написал почему.
НЕ отождествяйте себя с математикой, я возражаю не ей, а Вашему ее идеализации
HH>Настоящие же профи могут использовать настоящую математику (алгебру — моноиды, монады, аппликативные функторы и т.п.), причем достаточно сложную.
А что такое настоящие профи, и ненастоящие?
ИМХО — настоящие профи весьма прагматичные ребята. И они используют инструменты что подходят под ситуацию, а не молятся на идеальные методики.
HH>Я смотрю в сторону таких вещей как денотационная семантика, функциональное программирование.
И какое это отношение имеет к природе ошибок в программировании?
HH>Для примера можно привести библиотеку функционального реактивного программирования.
Можно.
А смысл, если Вы не смогли показать "на пальцах" как разрешить основные причины ошибок в программировании своим подходом.
Для примера же могу привести тьму библиотек БЕЗ особой математики, но которые используются в тьме ПО. Замечу — работающего ПО, а не идеального, но которое идеально потому что оно вообще не вышло за стены "лаборатории", а возможно из головы автора.
HH>здесь блог автора реализации HH>здесь одна из статей по теории
HH>Конечно, это уже высший пилотаж, и от всех людей нельзя требовать, чтобы они даже понимали о чем речь в этой статье.
Понимаете, ролики на ютьюбе с забрасывающими мяч в баскетбольную корзину с удивительных позиций набрали немалое число просмотров.
Только возьмут ли тех ребят в NBA?
"Высший пилотаж" понятие относительное.
HH>Но библиотеку сделали именно по математической модели. Так что вполне возможно делать нетривиальные программы, используя математику.
Я и не утверждал что нельзя.
И утрировано — меня интересуют больше: как писать тривиальное ПО без ошибок
HH>Нам же, кто математику знает плохо, может быть полезна даже не очень строгая формулировка модели,
Нам же, программистам, и строгая без толку.
HH>Посмотрите также ссылку, которую давали выше, по теории сложности и SRP. Это интересно.
На свете много чего интересного. И в программировании тоже.
Но я так и не увидел как математические модели могут помочь отрасли разработки ПО.
Добавлю, что увлечение ими было распространено в 50ые, 60ые, а в 80ые японцы даже провалили создание машин 5го поколения.
Программирование с тех пор стало циничней и скептичней.
Конечно, наработки в сomputer science продолжаются и востребованы. (а то еще может вы себя и с сomputer science отождествляете и скажете что я против)
Но до ошеломляющего успеха науки в практике — ой как далеко.
Более эффективными методами оказываются существующие и их развитие — грамотное управление ведением проектов, харизматичные менеджеры собирающие сплоченные команды, ООП, TDD и просто талант+квалификация программистов.
Математика — одна из самых формализованных дисциплин. И если ее формализация не работает, не помогает кардинально решить проблемы, то вот и возникает вопрос о ее применимости к таким-то проблемам вообще.
U>А принцип минимума сущностей должен идти в твоем списке отдельным пунктом, причем пожалуй самым важным. Т.к. тот же геттерный подход по сравнению с сеттерным
pull-схема(она же геттеры) улучшает предсказуемость кода. фактически при pull-схеме, что написано в коде, то и будет происходить в реальности, при push-схеме — реальное поведение необходимо восстанавливать.
зы
не вижу пока, как ты именно через переход сеттеры -> геттеры уменьшаешь кол-во сущностей.
Здравствуйте, HrorH, Вы писали:
HH> 1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись. HH> 2) Не учитываются свойства системы, о которых надо помнить при проектировании каждой операции (например, это могут быть такие свойства, как безопасность, одновременный доступ к ресурсам, блокировки, какие-то инварианты предметной области) HH> 3) Не осуществляется полный анализ всех возможных вариантов. Такой анализ вообще возможен только в случае, когда у нас есть нечто хотя бы напоминающее абстрактную* математическую модель, в противном случае количество вариантов будет слишком большим для такого анализа. Например, нужен анализ всех вариантов одновременных операций при доступе нескольких пользователей к иерархии ресурсов.
Я бы сказал не хватает пункта 4 — нужно учитывать, что завтра могут поменяться требования и половину продукта придется перелопатить. Это очень печальный пункт, когда люди умудряются размазать логику по всем модулям, так что ее потом замучаешься вытаскивать
Мафиозная диктатура это нестабильность. Если не мафиозная диктатура, то Конституция и демократия.
То, что Вы пишите, говорит о том, что Вы не понимаете меня. А я в свою очередь не могу понять Вас.
Я не знаю, как объяснить, потому что сам еще мало что понимаю.
Я пишу программы в области документооборота. Вам стало легче?
Те задачи, которые при этом возникают, не имеют к этому названию никакого отношения.
Математика — это всего лишь язык, инструмент, которым можно пользоваться.
Я порекомендовал модели, как одно из средств, которое позволяет избежать ошибок уже на этапе продумывания спецификации программы.
Использовать ли их, и в каких случаев, это дело каждого.
Я не собираюсь их навязывать.
Более того, я хотел бы узнать, какие вообще есть средства, чтобы минимизировать количество ошибок.
Здравствуйте, ZOI4, Вы писали:
ZOI>Здравствуйте, HrorH, Вы писали:
HH>> 1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись. HH>> 2) Не учитываются свойства системы, о которых надо помнить при проектировании каждой операции (например, это могут быть такие свойства, как безопасность, одновременный доступ к ресурсам, блокировки, какие-то инварианты предметной области) HH>> 3) Не осуществляется полный анализ всех возможных вариантов. Такой анализ вообще возможен только в случае, когда у нас есть нечто хотя бы напоминающее абстрактную* математическую модель, в противном случае количество вариантов будет слишком большим для такого анализа. Например, нужен анализ всех вариантов одновременных операций при доступе нескольких пользователей к иерархии ресурсов.
ZOI>Я бы сказал не хватает пункта 4 — нужно учитывать, что завтра могут поменяться требования и половину продукта придется перелопатить. Это очень печальный пункт, когда люди умудряются размазать логику по всем модулям, так что ее потом замучаешься вытаскивать
Пункт 4 здесь неуместен. Потому что каждый из предыдущих пунктов какбы намекает на решение проблемы.
А пункт 4 в применении к математической модели звучит так:
4': при добавлении в модель новой операции выяснилось, что эта операция не бьется с остальными, т.е. фактически разрушает текущую модель, и надо вместо нее придумывать новую.
Здравствуйте, DarkGray, Вы писали:
DG>зы DG>не вижу пока, как ты именно через переход сеттеры -> геттеры уменьшаешь кол-во сущностей.
При сеттерном подходе если источник меняется из десяти мест, то и изменять состояние объектов зависящих от источника нужно тоже из десяти мест. При геттерном подходе при изменении источника изменять состояние зависящих объектов не нужно в принципе. Соответственно в коде на десять очень сложных сущностей стало меньше.
U>При сеттерном подходе если источник меняется из десяти мест, то и изменять состояние объектов зависящих от источника нужно тоже из десяти мест. При геттерном подходе при изменении источника изменять состояние зависящих объектов не нужно в принципе. Соответственно в коде на десять очень сложных сущностей стало меньше.
в первом приближении это может быть реализовано как:
Здравствуйте, DarkGray, Вы писали:
DG>и так десять раз. DG>дублирование десять раз this.Update_X_Dependencies() еще не похоже на увеличение кол-ва сущностей
Это синтаксический сахар, от которого сущности никуда не делись. Как только, к примеру, окажется, что код изменяющий X не знает всех объектов, которые от X зависят, это станет очевидным.
Здравствуйте, DarkGray, Вы писали:
DG>и так десять раз. DG>дублирование десять раз this.Update_X_Dependencies() еще не похоже на увеличение кол-ва сущностей
Т.е. в общем случае подход с явными апдейтами не работает, вместо него приходится использовать события. Соответственно в коде появляется столь сложная в понимании и опасная в примении сущность как события и подписка на них. В геттерном коде таких сущностей в принципе нет.
ZOI>>Я бы сказал не хватает пункта 4 — нужно учитывать, что завтра могут поменяться требования и половину продукта придется перелопатить. Это очень печальный пункт, когда люди умудряются размазать логику по всем модулям, так что ее потом замучаешься вытаскивать
HH>Пункт 4 здесь неуместен. Потому что каждый из предыдущих пунктов какбы намекает на решение проблемы.
если этот пункт переформулировать, то он становится уместным:
значительная часть ошибок вызвана тем, что в коде не записывается модель, а записывается лишь решение вытекающее из этой модели, а модель остается в голове разработчика, что:
во-первых: приводит к необходимости восстановления модели из кода при каждом изменении кода (со всеми проблемами из этого вытекающими),
во-вторых: делает невозможным применение автоматизированных средств для управления(верификация, преобразования и т.д.) моделью
Здравствуйте, Undying, Вы писали:
U>При сеттерном подходе если источник меняется из десяти мест, то и изменять состояние объектов зависящих от источника нужно тоже из десяти мест. При геттерном подходе при изменении источника изменять состояние зависящих объектов не нужно в принципе. Соответственно в коде на десять очень сложных сущностей стало меньше.
U> Соответственно в коде появляется столь сложная в понимании и опасная в примении сущность как события и подписка на них.
т.е. падает показатель предсказуемости кода?
о том и речь, что первичная задача — максимизировать предсказуемость, и используется корреляция, что при уменьшение кол-ва сущностей увеличивается предсказуемость (но в общем случае, уменьшение кол-ва сущностей не ведет к увеличению предсказуемости, а переход с push на pull может давать и увеличение кол-ва сущностей, особенно на стыке с внешним окружением: как минимум требуется писать синхронайзер под каждый класс из внешнего окружения)
Здравствуйте, HrorH, Вы писали:
HH>Здравствуйте, Skynin, Вы писали:
HH>Я не знаю, как объяснить, потому что сам еще мало что понимаю.
Во втором и не сомневался. Потому что тогда знали бы как объяснить
HH>Я пишу программы в области документооборота. Вам стало легче?
Мне и не было тяжело. Это вы потроллиться что-ли предлагаете?
Лучше расскажите конкретней, как в своей области вы применяете математические методы
HH>Математика — это всего лишь язык, инструмент, которым можно пользоваться.
Разумеется. И как всякий инструмент его можно применять И неумело, И не к месту.
HH>Я порекомендовал модели, как одно из средств, которое позволяет избежать ошибок уже на этапе продумывания спецификации программы.
А я спросил — на чем основаны эти рекомендации? На каком успешном опыте?
Мало того, указал и на причины почему не только мне, а вообще такой успешный метод массово — неизвестен.
HH>Использовать ли их, и в каких случаев, это дело каждого.
О нет, я могу рекомендовать для написания надежных программ рисовать на стенах в офисе желтые квадраты в синий горошек.
"А использовать ли этот отличный метод — это дело каждого!"
HH>Я не собираюсь их навязывать.
А вы попытайтесь :D
Или хотя бы победите в конкурентной борьбе других разработчиков в области документооборота.
HH>Более того, я хотел бы узнать, какие вообще есть средства, чтобы минимизировать количество ошибок.
Минимальный набор, существующий в отрасли я указал.
Книг, исследований же на эту тему написано немало, как с анализом причин, причем разнообразных, не связанных между собой одной категорией,
так и с методиками уменьшения влияния этих причин на качество конечных программных продуктов.
Извините что так размыто "Формулы" у меня нет, и не встречал у кого она есть.
У вас вот тоже(просто "удивительно"!) тоже — "сам еще мало что понимаю"
Вот о том что Вы, и обычно увлеченные "математики" пока не понимают я и упомянул.
А Вы мне сразу о философии забросили. О нефальсифицируемости математики, как и религии с психологией, при одновременном их огромном значении и влиянии на человеческий интеллект, дух и душу, я рассуждаю на соответствующих форумах.
Здравствуйте, Константин, Вы писали:
vsb>>>Программы без ошибок появятся, когда появится искусственный интеллект. VC>>ИИ не "появится", его создадут. И тоже с ошибками... К>При этом способность совершать ошибки будет заложена в сам ИИ
Просто потому, что иначе не получится. ИИ не сможет ничего осознать, пока не сможет делать ошибок.
Извини, не удержался.
U>> Соответственно в коде появляется столь сложная в понимании и опасная в примении сущность как события и подписка на них.
DG>т.е. падает показатель предсказуемости кода?
К чему это наукообразие? Показатель, функция, корреляция... Можно же выразиться проще: что становится трудно понять, как именно работает код и какие он вызывает побочные эффекты. Всё равно эти "показатели", "функции" и "корреляции" или вовсе нельзя рассчитать, или можно рассчитать только на очень ограниченном множестве переменных, которые не отражают всех факторов.
DG>о том и речь, что первичная задача — максимизировать предсказуемость, и используется корреляция, что при уменьшение кол-ва сущностей увеличивается предсказуемость (но в общем случае, уменьшение кол-ва сущностей не ведет к увеличению предсказуемости, а переход с push на pull может давать и увеличение кол-ва сущностей, особенно на стыке с внешним окружением: как минимум требуется писать синхронайзер под каждый класс из внешнего окружения)
Чтобы продраться через этот абзац пришлось прочесть всё сообщение сверху вниз, снизу вверх и ещё по диагонали. В контексте топика прекрасная иллюстрация того, как наукообразием можно замусорить даже самые простые сведения. По сути ты высказал простейшую мысль, что для реализации pull-модели могут понадобиться дополнительные интерфейсные объекты, но код будет проще читать, поскольку подписчики будут изолированы один от другого. В общем, обе мысли очевидны, но при чём тут "корреляция" и "предсказуемость" — тайна сия велика есть.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Попробую намекнуть на один из примеров, просто не хочется палиться.
Сразу станет понятно, что я понимаю слово "математический" несколько широко.
Даже в данном случае можно просто сказать — модель, не произнося слово математический.
Допустим у нас есть дерево объектов, и с этим деревом могут работать одновременно несколько пользователей.
В модели у нас должна быть операция редактирования объекта.
При этом объект должен блокироваться.
Также должна быть операция добавления нового объекта, удаления объекта, перемещения и копирования.
Возникает вопрос, какие блокировки и проверки нужны, чтобы все эти операции бились между собой, и пользователи не портили данных друг друга.
Ответом на этот вопрос и будет модель.
Здесь важно то, что при добавлении каждой новой операции в модель во всех остальных операциях это должно учитываться. Скажем, при добавлении операции удаления, при выполнении остальных операций должна добавиться проверка, что объект не удален.
При добавлении в систему безопасности, в операции редактирования добавляется проверка, есть ли права на редактирование, или только на чтение и т.д.
В операции удалении — что у нас есть права на удаление и т.д.
Тут есть куча подробностей, которые я приводить не буду, скажу только, что то, что я сейчас написал — не совсем корректно, и можно рассматривать только как иллюстрация.
А причем тут мат. модель? -спросите Вы.
Дело в том, что надо рассмотреть все попарные сочетания операций, и учесть все аспекты существующие в системе.
Это пока еще будет просто модель, она станет математической, когда и если появиться необходимость и возможность написать ее в соответсвующей нотации, ведь как я говорил, математика — это всего лишь язык.
Здравствуйте, HrorH, Вы писали:
HH>Более того, я хотел бы узнать, какие вообще есть средства, чтобы минимизировать количество ошибок.
Если уж смотришь в сторону функциональщины то смотри Зависимые типы и такие языки как например:
ATS http://www.ats-lang.org/ это более-менее практичный язык вполне годный для использования в прикладном программировании, но к сожалению еще далек от полноценного релиза.
Можешь также посмотреть Agda, Epigram, но это уже академично по моему.
Ну и если так сильно тянет в математику то посмотри еще Coq
Если же тебе нужны средства для более гражданских языков, то ищи по ключевым "контрактное программирование", "статический анализ".
Кое-что из этого уже пытался смотреть... Правда, пока мало что понял.
А чем помогут зависимые типы, если необходимо сделать корректную спецификацию программы?
DG>>т.е. падает показатель предсказуемости кода?
ГВ>К чему это наукообразие? Показатель, функция, корреляция...
пока задача не сформулирована через показатели, функции, корреляцию и т.д. — ее невозможно решить научным методом, а можно лишь решать методами тыка и взглядами в потолок.
ГВ>По сути ты высказал простейшую мысль, что для реализации pull-модели могут понадобиться дополнительные интерфейсные объекты, но код будет проще читать, поскольку подписчики будут изолированы один от другого.
Здравствуйте, HrorH, Вы писали:
HH>Кое-что из этого уже пытался смотреть... Правда, пока мало что понял. HH>А чем помогут зависимые типы, если необходимо сделать корректную спецификацию программы?
В этом мало помогут, это вообще неформализуемая задача, тут и математика ничем ни поможет.
Помогут в другом если уже формализация есть реализовать ее максимально безошибочно, конечно
помогут не только и не столько зависимые типы, а скажем весь арсенал что есть например в ATS.
Ну и тот же Coq вполне средство построения формальных моделей.
Ну и на фоне того что сама математика уже уперлась в пределы доказуемости я бы особо не надеялся
на то что это будет разрешимо для программирования.
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, HrorH, Вы писали:
HH>>Кое-что из этого уже пытался смотреть... Правда, пока мало что понял. HH>>А чем помогут зависимые типы, если необходимо сделать корректную спецификацию программы?
FR>В этом мало помогут, это вообще неформализуемая задача, тут и математика ничем ни поможет.
Я тут уже 2 раза в этой ветке приводил ссылку на то, как это сделано в FRP.
Вот другая ссылка, но из той же области здесь
Люди как-то используют математику для написания спецификаций, а все мне говорят то про неформолизуемость, то про ограниченность самой математики...
Я не въезжаю, причем здесь ограниченность математики.
Почитайте бумаги Conal Elliott, если Вы их еще не читали. Вы то сможете это понять.
И не надо говорить, что это невозможно (неформализуемо), если это уже есть.
Здравствуйте, DarkGray, Вы писали:
DG>>>т.е. падает показатель предсказуемости кода? ГВ>>К чему это наукообразие? Показатель, функция, корреляция...
DG>пока задача не сформулирована через показатели, функции, корреляцию и т.д. — ее невозможно решить научным методом, а можно лишь решать методами тыка и взглядами в потолок.
Сначала нужно показать саму функцию "предсказуемости".
ГВ>>По сути ты высказал простейшую мысль, что для реализации pull-модели могут понадобиться дополнительные интерфейсные объекты, но код будет проще читать, поскольку подписчики будут изолированы один от другого.
DG>что такое "проще читать"?
Молодец! Эту фразу вообще можно выкинуть. Останется: "для реализации pull-модели могут понадобиться дополнительные интерфейсные объекты, но подписчики будут изолированы один от другого". Смысл не поменялся.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
FR>>В этом мало помогут, это вообще неформализуемая задача, тут и математика ничем ни поможет.
HH>Я тут уже 2 раза в этой ветке приводил ссылку на то, как это сделано в FRP. HH>Вот другая ссылка, но из той же области HH>здесь
Ссылки не помогут, такие читать целая работа, расскажи вкратце суть.
Что такое FRP я знаю, но не вижу какое отношение имеет к формализации. Это скорее один из
элементов или паттернов проектирования. С таким же успехом можно сказать что с помощью
скажем ОО или монад уже все формализовано.
HH>Люди как-то используют математику для написания спецификаций, а все мне говорят то про неформолизуемость, то про ограниченность самой математики... HH>Я не въезжаю, причем здесь ограниченность математики. HH>Почитайте бумаги Conal Elliott, если Вы их еще не читали. Вы то сможете это понять. HH>И не надо говорить, что это невозможно (неформализуемо), если это уже есть.
DG>>пока задача не сформулирована через показатели, функции, корреляцию и т.д. — ее невозможно решить научным методом, а можно лишь решать методами тыка и взглядами в потолок.
ГВ>Сначала нужно показать саму функцию "предсказуемости".
Предсказуемость'(код K, требование T)=минимального вычислительная сложность алгоритма, который для кода K проверяет требование T.
Предсказуемость = 1/Предсказуемость';
вернемся к примеру который уже был:
for (uint i = items.Length - 1; i >= 0; --i)
{
var item = items[i];
//что-то делаем с item
}
foreach (var item in items.Reverse())
{
//что-то делаем с item
}
для кода вида, как во втором примере, требование "незацикливаться" проверяется простым автоматом за O(кол-во операторов в программе), а чтобы проверить на зацикливание код вида, как в первом варианте, необходим алгоритм со сложностью близкой к O(2^кол-во операторов в программе)
зы
изолированность хороша тем, что при правильной изоляции функция предсказуемости выглядит как:
Предсказуемость'(код, требование)=Sum(Предсказуемость'(изолированная часть кода_i, требование))
для неизолированного кода функция ведет себя много хуже:
Предсказуемость'(код, требование)=Product(Предсказуемость'(неизолированная часть кода_i, требование))
FR>Ну и на фоне того что сама математика уже уперлась в пределы доказуемости я бы особо не надеялся FR>на то что это будет разрешимо для программирования.
основная проблема, что математики хотят всегда точное решение. и в статье по ссылке подразумевается, что теории могут быть только точными. на практике же в большинстве задач достаточно теорий и решений, которые описывают и решают задачу с частичной потерей точности.
Я так понял, что при разработке теории функционального реактивного программирования этому Conal Elliot в голову пришла идея.
Во-первых, надо говорить про денотационную семантику (это то что придумали в 1960)
Denotational semantics is a compositional style for precisely specifying
the meanings of languages, invented by Christopher Strachey
and Dana Scott in the 1960s (Scott and Strachey 1971; Stoy 1977).
The idea is to specify, for each syntactic category C,
a mathematical model [C] of meanings, and
a semantic function [.]C :: C -> [C].
Так, вот тут есть семантическая функция, которая сопоставляет синтаксису в коде его значения в модели (здравствуй, Рабинович).
Так вот, идея была в том, что могут быть законы, которые выполняются для этой семантической функции.
Вот обсуждение этого в блоге Вадлера здесь.
Кстати он там рекомендует посмотреть здесь
Вот эти 2 бумаги кажется основные.
Но меня поразило именно то, что все эти апликативные функторы, монады и т.д. использовались именно для определения семантики программы, а сама реализация по мере развития библиотеки делалась более эффективной, то есть использовались другие конкретные типы, но сама модель оставалась почти неизменной.
Боюсь, что от моего описания лучше не стало, т.к. мне самому в этом еще разбираться и разбираться, поэтому если сможете прочесть, лучше сами потом расскажете
В конце концов Вадлер на ерунду обращать внимание не стал бы
Здравствуйте, DarkGray, Вы писали:
DG>т.е. падает показатель предсказуемости кода?
Падает, но это одно из следствий. А нас интересует причина почему это происходит.
DG> а переход с push на pull может давать и увеличение кол-ва сущностей, особенно на стыке с внешним окружением
С чего это будет увеличение количества сущностей? В общем случае при геттерном подходе любой объект представляется в виде автоматического кэша с несколькими входами, в событийной — в виде объекта подписанного на несколько событий.
Проблемы событийного подхода:
1) Проблема лишних модификаций приемника. Если объект подписан на три события, то может возникнуть ситуация при которой одна логическая транзакция порождает три модификации приемника вместо одной. Причем первые две модификации происходят в невалидном состоянии системы, когда логическая транзакция отработала только частично.
2) Проблема оповещения о изменении инициатора изменений. Если объект подписанный на размер контрола, сам изменяет этот контрол, то контрол порождает событие и в этом объекте. Причем опять же вызов этого события происходит в невалидном состоянии системы, т.е. до завершения логической транзакции.
3) Каждый источник должен знать все объекты от него зависящие (пусть и в виде специализированного интерфейса). Соответственно возникает проблема отписки.
Все перечисленные проблемы обнаруживаются бритвой Оккама, т.е. порождают сущности, которых нет в логическом решении. В первом и втором виде проблем в виде лишних вызовов обработчиков событий в рантайме, в третьем — в виде записи в коде и вызовах в рантайме кода отписки от событий. При этом если в третьей проблеме порождаются просто дополнительные сущности, что еще полбеды, то в первой и второй проблемы — это сущности-вредители, которые не просто лишние, но еще и заставляют работать систему в невалидном состоянии, что и делает событийный код крайне сложным и трудно предсказуемым.
При этом если усложнять код, то для третьей проблемы есть неплохое решение, для второй проблемы — плохое, но работающее, но способа решить первую проблему я не вижу вовсе.
При геттерном подходе таких проблем нет в принципе.
Здравствуйте, HrorH, Вы писали:
HH>Здравствуйте, FR, Вы писали:
HH>при разработке теории функционального реактивного программирования этому Conal Elliot в голову пришла идея. HH>Во-первых, надо говорить про денотационную семантику (это то что придумали в 1960) HH>and Dana Scott in the 1960s (Scott and Strachey 1971; Stoy 1977).
Да-да, очень свежие идеи.
И конечно чистая случайность что они не выстрелили до сих пор
HH>Так, вот тут есть семантическая функция, которая сопоставляет синтаксису в коде его значения в модели.
Погуглил "рядом" с указанными источниками. Многовато речи идет о DSL. Вы уверены что DSL это "математика"?
HH>Так вот, идея была в том, что могут быть законы, которые выполняются для этой семантической функции.
HH>Вот обсуждение этого в блоге Вадлера HH>Кстати он там рекомендует посмотреть
HH>Вот эти 2 бумаги кажется основные.
И посвящены языковым проблемам, а не проектированию и верификации ПО.
Посмотрел также CV Conal Elliott, потому что вобщем-то у вас он единственный свежий источник вдохновения.
То что сейчас он хаскелист ладно.
Смотрим что же привело его к этому, какая такая трудовая биография.
А там — сплошь графические алгоритмы, 2D, анимайтед 3D, вертексы с шейдерами из C# и проч.
То есть сама область — сугубая математика. То есть человек вырос на чисто математических задачах
Далее, вырос так что и начал заниматься "DSL" — Vertigo, a language and compiler for computations on graphics processors.
или: Pajama a compiler to produce highly optimized Java applets from simple, declarative specifications of interactive media (e.g., imagery, animation, sound).
HH>Но меня поразило именно то, что все эти апликативные функторы, монады и т.д. использовались именно для определения семантики программы, а сама реализация по мере развития библиотеки делалась более эффективной, то есть использовались другие конкретные типы, но сама модель оставалась почти неизменной.
А чего моделям с которыми работал Conal Elliott изменяться?
Такая у него предметная область — устойчивая.
HH>В конце концов Вадлер на ерунду обращать внимание не стал бы
Хорошо, читаем кто такой этот Вадлер:
Philip Wadler
Position: Professor
Roles: Member of Laboratory for Foundations of Computer Science
Research Interests: Programming languages, functional programming, type systems, web programming, query languages for databases, hybrid and gradual typing, Haskell, Erlang, Java, XML.
То есть "академик" и преподаватель, как понимаю с его емайла inf.ed.ac.uk.
Cугубо научная работа. С чистенькими, рафинированными проблемами.
Студентом у него думаю быть интересно и полезно. Да и вообще, укрепить некие фундаментальные знания.
Но вот в остальном оказался прав — у вас даже источники сплошь из высших сфер, или особых областей программирования.
Здравствуйте, monax, Вы писали:
U>>При сеттерном подходе если источник меняется из десяти мест, то и изменять состояние объектов зависящих от источника нужно тоже из десяти мест. При геттерном подходе при изменении источника изменять состояние зависящих объектов не нужно в принципе. Соответственно в коде на десять очень сложных сущностей стало меньше.
M>покажи пример кода при геттерном подходе
U>С чего это будет увеличение количества сущностей? В общем случае при геттерном подходе любой объект представляется в виде автоматического кэша с несколькими входами, в событийной — в виде объекта подписанного на несколько событий.
ты опять про внутренние объекты, а я тебе про внешние объекты: БД, файловая система, UI, сеть и т.д., и взаимодействие с ними.
например, если есть набор объектов Button, то чтобы задействовать все поля Button-а через getter-ы необходимо добавить внутренний объект ButtonState + добавить class ButtonSynchronizer, который применяет ButtonState к Button.
Здравствуйте, DarkGray, Вы писали:
DG>причина падения предсказуемости при событийном подходе в росте кол-ва трасс, которые необходимо рассмотреть, чтобы сделать тот или иной вывод.
Причем подавляющее большинство этих трасс с точки зрения логики решения является чистым мусором, т.к. в логики решения таких трасс нет и близко. Соответственно событийный подход это способ превратить тривиальную задачу в монстрообразное решение.
Здравствуйте, DarkGray, Вы писали:
DG>ты опять про внутренние объекты, а я тебе про внешние объекты: БД, файловая система, UI, сеть и т.д., и взаимодействие с ними.
Там все то же самое только вместо автоматических кэшей используются LazyMaker'ы.
DG>например, если есть набор объектов Button, то чтобы задействовать все поля Button-а через getter-ы необходимо добавить внутренний объект ButtonState + добавить class ButtonSynchronizer, который применяет ButtonState к Button.
Зачем? Пишется LazyMaker зависящий от нужных входов, вызов LazyMaker.Make вставляется в OnPaint контрола, если входы изменились, то вызывается обработчик, изменяющий нужные свойства Button'а. Соответственно если какие-то изменения нам нужно немедленно отобразить пользователю, то достаточно после выполнения изменений выполнить перерисовку формы. Код UI становится примитивней паровоза, никакого сравнения с событийным кошмаром.
U>Зачем? Пишется LazyMaker зависящий от нужных входов, вызов LazyMaker.Make вставляется в OnPaint контрола, если входы изменились, то вызывается обработчик, изменяющий нужные свойства Button'а.
Т.е. никакой инкапсуляции? это возможно только для каких-то очень простых программ с отношениями только вида 1 к 1.
возьмем, например, графический редактор схем, состоящий из нескольких widget-ов: поле и список всех элементов.
допустим, что элементы подписываются и на поле, и в списке.
как тогда запишется правило, что название выделенного элемента должен выводится жирным зеленым шрифтом с размером на 10% больше умолчательного?
зы
в первом приближении, чтобы не было дублирования — это записывается или так (это будет Push):
Здравствуйте, DarkGray, Вы писали:
U>>Зачем? Пишется LazyMaker зависящий от нужных входов, вызов LazyMaker.Make вставляется в OnPaint контрола, если входы изменились, то вызывается обработчик, изменяющий нужные свойства Button'а.
DG>Т.е. никакой инкапсуляции?
Причем здесь инкапсуляция и какие с ней могут быть проблемы?
DG>возьмем, например, графический редактор схем, состоящий из нескольких widget-ов: поле и список всех элементов. DG>допустим, что элементы подписываются и на поле, и в списке. DG>как тогда запишется правило, что название выделенного элемента должен выводится жирным зеленым шрифтом с размером на 10% больше умолчательного?
DG>соответственно, и появляется <T>State и <T>Synchronizer для каждого внешнего class-а <T>
Ты что такое LazyMaker понял? Синхронайзер это, конечно, хорошее решение по сравнению событиями, но так-то в силу своей активности это плохое решение. LazyMaker решает те же задачи, будучи пассивным. За счет чего и надежнее, и проще, и оптимальней по быстродействию.
U> Причем здесь инкапсуляция и какие с ней могут быть проблемы?
потому что тогда весь код, который отвечает за вывод элемента (а это могут быть тысячи строк кода, которые определяют как элемент выводится при тех или условиях, задачах, настройках и т.д.) — необходимо запихать в один LazyMaker
U> LazyMaker selectedElementMaker
это Push, и имеет характерные проблемы связанные с Push.
в частности, тяжело подмешивать декораторы, например, что элементы на поле должны выводится дополнительно Italic-ом,
а название элемента при наведении мышкой должен выводится синим (и это приоритетнее, чем вывод выделенности)
зы
фактически LazyMaker использует промежуточный подход:
push заменен на pull для отслеживания зависимостей между элементами, но сами данные push-атся
Здравствуйте, DarkGray, Вы писали:
DG>если этот пункт переформулировать, то он становится уместным: DG>значительная часть ошибок вызвана тем, что в коде не записывается модель, а записывается лишь решение вытекающее из этой модели, а модель остается в голове разработчика, что: DG>во-первых: приводит к необходимости восстановления модели из кода при каждом изменении кода (со всеми проблемами из этого вытекающими), DG>во-вторых: делает невозможным применение автоматизированных средств для управления(верификация, преобразования и т.д.) моделью
Точные замечания.
И тут мы приходим к вопросу — а как поможет с рассогласованием модели запись ее в виде математических выражений?
Более обобщенно — какая "алфавитно"-символьная запись позволяет бороться с таким рассогласованием, и наоборот — позволяет быстро восстановить модель в уме человека?
Для компьютера такая запись всего лишь должна быть однозначной. А человеку это помогает слабо, при увеличении количества знаков описания будь то самой модели, или ее решений.
Из попытки решить эту проблему и появляются 2 подхода: DSL и метапрограммирование. Утрировано их суть — уменьшить количество знаков при описании, за счет увеличения их емкости, или вынесения описания контекста куда-то во вне.
Но это частичное решение.
Письменность, частным случаем которой и является запись на языке программирования есть и дар и бич человека.
Каждый программист знает что собственный код со временем читается ничуть не легче чем чужой.
И получается, что сохранить жесткое соответствие модели и кода на ЯП можно только запретив программисту править код. Собственно RAD, CASE системы и всякие генераторы у фреймворков и есть такая попытка.
Но "абстракции текут" и лезть в код приходится.
И какой же выход предлагают адепты ФП, хаскелей и "математики"?
На самом то деле ничего радикального. они предлагают то же самое что уже и так есть:
добиться восстановления модели из символьной записи, чтобы протестировать эту модель автоматизированными средствами.
Но восстановления — КЕМ? Человеком? А чем математическая запись проще в чтении чем код на ЯП? Например: Сколько времени понадобилось проверять доказательство Григория Перельмана? Или — почему Степанов на лекции в Яндексе говорил что наука построена на доверии, "у меня просто нет времени проверить даже 20ти страничное доказательство которое мне друг месяц тому дал почитать"
А если НЕ человеком, то хоть битами записывай 0110111001 — компьютер не устает и не ошибается при чтении.
Увлеченные "математикой" не понимают что внутри самой математики с записью, восстановлением и верификацией уже немалые проблемы.
Вернее — те же. Просто ошибки там выявляются по другому.
Что же до "доказательства верности программ", то я вообще слабо представляю, как математики, которые не решили проблемы, автоматического доказательства утверждений у себя, собираются помочь в этом программистам?
Где та методика у самих математиков — наваял Перельман доказательство — запихнули его в компьютер, или просто по листикам раздали студентам с "инструкцией выполнения" и опа — "доказательство верно!" или "доказательство неверно в такой строчке на такой-то странице!"
S>Более обобщенно — какая "алфавитно"-символьная запись позволяет бороться с таким рассогласованием, и наоборот — позволяет быстро восстановить модель в уме человека?
такая которая позволяет задачу восстановления модели поручить компьютеру.
Здравствуйте, HrorH, Вы писали:
HH> Мне кажется, основная причина в том, что разработка происходит стихийно, каждый пишет, что ему придет в голову. HH> 1) Не формулируется математическая модель...
Всё ясно. Как уже правильно обобщил Carc, математик пытается умничать в области, где сам ниструя не понимает.
Программинг только на заре 70-ых был "академическим", да и то математика там привлекалась только в силу требуемых алгоритмов. В целом же, программинг — это вообще отдельная дисциплина, где не то что "математическую модель", пару квадратов на бумаге — и то сложно расположить! Простой пример: GUI usability. Психология+интуиция+чтобы работало. Или вот базы данных — их что, по рядам Фурье считают? Далеко нет. Тупо "на практике" проверяют, будет ли отзывчивой система при 20 запросах в сек. Почему 20? Да просто эмпирика!
Кроме того, сидеть и рисовать мат.абстракции — это и студент в туалете может, ты попробуй напиши то, чего ещё НИКОГДА НЕ БЫЛО! Ну типа как придумать свою теорему Ферма. Этим и занимаются настоящие профи — на базе опыта, статей, чутья, каких-то полуабстрактных моделей пытаются хотя бы набросать каркас будущей системы. Тут не математика, тут даже бубен сто крат полезнее!
А говносистемы получаются не от зла большого — просто не у всех есть нужный опыт и инженерное мышление. Но пробовать-то надо! Глядишь — вторая система будет намного лучше. Кстати, "говносистемы" как раз и получаются из-за того, что один говноархитектор всё придумал, пол-системы написали, а выкидывать и писать заново НА ОСНОВЕ ОПЫТА — не хотят (сроки/деньги и т.п. чушь). Был бы у каждой системы второй шанс — всё было бы намного лучше.
Здравствуйте, IT, Вы писали:
IT>Не вижу в твоём утверждении логической связи между тем, что после 'если' и после 'то'.
"Сложность", по определению, это количество ошибок на километр кода. Если мы рассматриваем программирование как управление количеством ошибок на километр кода то, согласно закону сохранения сложности, любая конструкция является ошибкой или ошибок вообще не бывает.
Всё, что нас не убивает, ещё горько об этом пожалеет.
Здравствуйте, Ромашка, Вы писали:
IT>>Не вижу в твоём утверждении логической связи между тем, что после 'если' и после 'то'. Р>"Сложность", по определению, это количество ошибок на километр кода.
Откуда такое "поопределение"?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, Ромашка, Вы писали:
Р>>>"Сложность", по определению, это количество ошибок на километр кода. IT>>Откуда такое "поопределение"? Р>У тебя есть другое, которое не сводится к ошибкам на километр? Озвучь, пожалуйста.
Если коротко, то я это понимаю как меру усилий, требуемых для решения поставленной задачи.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, DarkGray, Вы писали:
DG>потому что тогда весь код, который отвечает за вывод элемента (а это могут быть тысячи строк кода, которые определяют как элемент выводится при тех или условиях, задачах, настройках и т.д.) — необходимо запихать в один LazyMaker
Не понял проблемы. Если тебе по условию задачи нужно при изменении входа выполнить тысячи строк кода, то чем LazyMaker как место вызова этих тысяч строк кода хуже нежели любое другое? Никаких дополнительных ограничений на эти тысячи строк кода LazyMaker не накладывает, т.е. эти тысячи строк можно структурировать каким угодно образом, хоть объектным, хоть любым другим.
DG>тогда уж (если все-таки хочется инкапсуляцию) DG>
Не вижу здесь никакой дополнительной инкапсуляции. Что изменилось-то от того, что ты код обработки вынес из LazyMaker'а в функцию этого же контрола?
DG>это Push, и имеет характерные проблемы связанные с Push.
Естественно Push. Каким это чудом у тебя на стыке с сеттерным кодом может быть Pull?
DG>в частности, тяжело подмешивать декораторы, например, что элементы на поле должны выводится дополнительно Italic-ом, DG>а название элемента при наведении мышкой должен выводится синим (и это приоритетнее, чем вывод выделенности)
Не вижу проблемы. Сложность определяется исключительно логической сложностью задачи, никакой дополнительной сложности LazyMaker не вносит.
Здравствуйте, Skynin, Вы писали:
S>Что же до "доказательства верности программ", то я вообще слабо представляю, как математики, которые не решили проблемы, автоматического доказательства утверждений у себя, собираются помочь в этом программистам?
Очень просто, в программах большинство инвариантов, требующих доказательства, сводятся к примитивной арифметике и логике первого порядка, там автоматизированная проверка не представляет такой уж большой проблемы. Делая очередную опердень, теорему Гёделя не получишь. Кое-какие примеры на ATS я показывал тут, например реализация хитрой сортировки с машинно-проверенным доказательством того, что результат действительно отсортирован для любых входных данных, и что при работе с массивом 100% не будет выходов за его пределы (без рантайм-проверок!).
S>Где та методика у самих математиков — наваял Перельман доказательство — запихнули его в компьютер, или просто по листикам раздали студентам с "инструкцией выполнения" и опа — "доказательство верно!" или "доказательство неверно в такой строчке на такой-то странице!"
Она есть — автоматические "доказатели теорем" вроде Coq. Как раз Coq последнее время все больше используется для автоматизированного доказательства и проверки новых теорем. Некоторые из них такие большие, что без него, вручную, доказать их просто не вышло бы.
Здравствуйте, DarkGray, Вы писали:
S>>Более обобщенно — какая "алфавитно"-символьная запись позволяет бороться с таким рассогласованием, и наоборот — позволяет быстро восстановить модель в уме человека?
DG>такая которая позволяет задачу восстановления модели поручить компьютеру.
Епть, так язык программирования и есть такая запись
Почитайте определение языка программирования хотя бы в википедии.
Проблема в авторе — создавшем модель, записавшем ее.
Здравствуйте, D. Mon, Вы писали:
DM>Очень просто, в программах большинство инвариантов, требующих доказательства, сводятся к примитивной арифметике и логике первого порядка, там автоматизированная проверка не представляет такой уж большой проблемы.
Ну раз очень просто — ждем-с.
Мне в начале 90ых усиленно доказывали что лет через 10 программисты вообще не будут нужны. Но может пару тысяч на все человечество.
DM>результат действительно отсортирован для любых входных данных, и что при работе с массивом 100% не будет выходов за его пределы (без рантайм-проверок!).
Да-а-а-а, Достижение!
DM>Она есть — автоматические "доказатели теорем" вроде Coq. Как раз Coq последнее время все больше используется для автоматизированного доказательства и проверки новых теорем.
Очередная сказочка. Coq утрировано говоря — это типизированный Prolog. Со всеми вытекающими.
P.S. DM>Она есть — автоматические "доказатели теорем" вроде Coq. Как раз Coq последнее время все больше используется для автоматизированного доказательства и проверки новых теорем.
Не мое, но совсем не удивлен:
Coq — очень мошная система, и пожалуй мой любимый язык программирования, на данный момент.
...
Одна из дилемм: либо надо писать громоздкие предикаты, и ломать глазки. Либо написать покомпактнее, но автоматизация начинает спотыкаться. И опять-таки надо ломать глазки об многобукв. Хотя там много простейших шагов, который давно научились автоматизировать. А вот вместе все пока не очень складывается.
Все это опять-таки преодолимо, но геморрно. На промышленное применение ИМХО не тянет. Про Coq
Вообще, когда вместо обсуждения проблемы, аргументов и контр-аргументов используется обмен именами, перед которыми нужно падать ниц — это несерьезно.
Здравствуйте, Skynin, Вы писали:
DM>>Очень просто, в программах большинство инвариантов, требующих доказательства, сводятся к примитивной арифметике и логике первого порядка, там автоматизированная проверка не представляет такой уж большой проблемы. S>Ну раз очень просто — ждем-с.
А чего ждать — бери да используй. Нужные языки и инструменты уже появляются. Вон, Кармак вовсю нахваливает статический анализ кода, в том числе появившийся в полной версии VS10, — это все из той же оперы.
S>Мне в начале 90ых усиленно доказывали что лет через 10 программисты вообще не будут нужны. Но может пару тысяч на все человечество.
Ну это понятно, что глупость.
DM>>результат действительно отсортирован для любых входных данных, и что при работе с массивом 100% не будет выходов за его пределы (без рантайм-проверок!). S>Да-а-а-а, Достижение!
Вообще-то да. Гарантия остутствия багов при сохранении эффективности — хорошая вещь. А большинство алгоритмов в современном софте не сложнее той сортировки. По той ссылке у меня есть и более практичный пример с фильтрацией IP адресов. Там машинные доказательства используются при работе с файлами и памятью, программа с багами по этой части просто не компилируется. Это определенно достижение.
DM>>Она есть — автоматические "доказатели теорем" вроде Coq. Как раз Coq последнее время все больше используется для автоматизированного доказательства и проверки новых теорем. S>Очередная сказочка. Coq утрировано говоря — это типизированный Prolog. Со всеми вытекающими.
Почему сказочка? Вон теорема о 4 красках была доказана только благодаря применению компьютера, а окончательно в ней убедились после формализации на Coq. Многие разделы математики сейчас активно формализуются на нем, т.е. сами математики его активно используют.
Здравствуйте, Skynin, Вы писали:
S>Вообще, когда вместо обсуждения проблемы, аргументов и контр-аргументов используется обмен именами, перед которыми нужно падать ниц — это несерьезно.
Это имена не для падания ниц, а ссылки на современную практику. Но если угодно ее отрицать, то можете падать ниц, пожалуйста.
Здравствуйте, D. Mon, Вы писали:
DM>Это имена не для падания ниц, а ссылки на современную практику. Но если угодно ее отрицать, то можете падать ниц, пожалуйста.
Это не современная практика программирования, а научные, лабораторные изыскания.
Даже хаскель НЕ современная практика, а вы уже Coq туда записали? И какие у него достижения, смогли на нем записать "перебор" карт для решения теоремы о 4ех красках?
А ниц как раз фаны падают. Ничего на самом деле не имею ни против хаскеля ни против Coq. Есть проблемы, и народ ищет способы их решения.
Думаете я в первый раз задаю вам вопросы о проблематике? В ответ ни рассуждений, ни опровержений а ссылки на "божьи имена".
Но ощущение нередко — что фаны эти вообще не программисты. Говорим как о напрочь несвязанной профессиональной проблематике.
Здравствуйте, D. Mon, Вы писали:
DM>А чего ждать — бери да используй. Нужные языки и инструменты уже появляются.
Так бери и используй. Я тогда не понял ни откуда взялась эта тема, ни откуда вообще такая мировая проблема.
DM>Вон, Кармак вовсю нахваливает статический анализ кода, в том числе появившийся в полной версии VS10, — это все из той же оперы.
И что? Что с очередным движком у Кармака то приключилось?
Я о — нахваливает — а результат какой?
S>>Да-а-а-а, Достижение! DM>Вообще-то да. Гарантия остутствия багов при сохранении эффективности — хорошая вещь.
Вы не поняли. Мы в 21ом веке наконец то научились тестировать сортировку и проверять выход за рамки массива.
DM>А большинство алгоритмов в современном софте не сложнее той сортировки.
Проблема в том что они часто вообще "не алгоритмы", а наборы произвольных правил, в отличие от сортировки.
DM>По той ссылке у меня есть и более практичный пример с фильтрацией IP адресов. Там машинные доказательства используются при работе с файлами и памятью, программа с багами по этой части просто не компилируется. Это определенно достижение.
Не спорю, задача частая и важная.
Только уж очень простая И конечно, это тоже достижение — наконец то ее решать с помощью машинных доказательств.
DM>Почему сказочка? Вон теорема о 4 красках была доказана только благодаря применению компьютера, а окончательно в ней убедились после формализации на Coq.
Потому что "тупой" перебор — известен давно.
То что записать наконец удалось математикам, освоить компьютер более грамотно — что ж
DM> Многие разделы математики сейчас активно формализуются на нем, т.е. сами математики его активно используют.
Ссылок на стастику не с сайта о Coq не будет я так понимаю?
Но даже если так, я рад за математиков.
Только нам программистам толку с этого мало, потому что есть кардинальные отличия.
Чтобы не повторятся, всего лишь одно назову: Проблема остановки.
Жду от "математиков" инструмента для устранения этого бага
Здравствуйте, Skynin, Вы писали:
DM>>Это имена не для падания ниц, а ссылки на современную практику. Но если угодно ее отрицать, то можете падать ниц, пожалуйста. S>Это не современная практика программирования, а научные, лабораторные изыскания.
Так я именно про научные и отвечал — на вопрос "Где та методика у самих математиков — наваял Перельман доказательство — запихнули его в компьютер..."
S>Даже хаскель НЕ современная практика, а вы уже Coq туда записали? И какие у него достижения, смогли на нем записать "перебор" карт для решения теоремы о 4ех красках?
Ну вот математики чего-то формализуют, доказывают на нем: http://coq.inria.fr/cocorico/List%20of%20Coq%20Math%20Projects
S>Думаете я в первый раз задаю вам вопросы о проблематике? В ответ ни рассуждений, ни опровержений а ссылки на "божьи имена". S>Но ощущение нередко — что фаны эти вообще не программисты. Говорим как о напрочь несвязанной профессиональной проблематике.
Вы задали вопрос "где та методика", я дал конкретный ответ — "вот". Какие рассуждения вам нужны?
Задали вопрос "как математики ... собираются помочь в этом программистам?", я дал конкретный ответ — например, вот так. А теперь делитесь странными эмоциями и обзываетесь. Некрасиво.
Здравствуйте, Skynin, Вы писали:
S>Даже хаскель НЕ современная практика, а вы уже Coq туда записали? И какие у него достижения
Например,
CompCert is a formally verified optimizing compiler for a subset of the C programming language which currently targets PowerPC, ARM and 32-bit x86 architectures. ... The compiler is specified, programmed and proved in Coq.
Здравствуйте, Skynin, Вы писали:
DM>>Вон, Кармак вовсю нахваливает статический анализ кода, в том числе появившийся в полной версии VS10, — это все из той же оперы. S>И что? Что с очередным движком у Кармака то приключилось?
А что приключилось? Я не в курсе.
Вообще, их игры весьма стабильны были, и по его словам с применением статического анализа багов стало еще меньше.
S>Вы не поняли. Мы в 21ом веке наконец то научились тестировать сортировку и проверять выход за рамки массива.
А вы хотели чуда? Я вот в 26-м веке живу и рад, что смог ту сортировку доказать, а на ее примере поучиться доказательному программированию. Все лучше, чем писать сто тыщ тестов, которые все равно баги пропускают.
DM>>А большинство алгоритмов в современном софте не сложнее той сортировки. S>Проблема в том что они часто вообще "не алгоритмы", а наборы произвольных правил, в отличие от сортировки.
Ну так и их можно теми же средствами формализовывать. Просто пока этим мало кто занимается, т.к. не умеют, не обучены и учиться не спешат.
DM>>По той ссылке у меня есть и более практичный пример с фильтрацией IP адресов. Там машинные доказательства используются при работе с файлами и памятью, программа с багами по этой части просто не компилируется. Это определенно достижение. S>Не спорю, задача частая и важная. S>Только уж очень простая И конечно, это тоже достижение — наконец то ее решать с помощью машинных доказательств.
Ну да, это ж учебный пример у меня.
S>Чтобы не повторятся, всего лишь одно назову: Проблема остановки. S>Жду от "математиков" инструмента для устранения этого бага
В моем примере про IP адреса такой инструмент упоминается — termination metric. B ATS можно для рекурсивных функций и циклов формально доказать их завершимость, причем от программиста это требует минимум усилий. Это не решение той сугубо теоретической проблемы про определение завершимости произвольного алгоритма, это решение для повседневных практических задач — удостовериться, что мой код не виснет.
Здравствуйте, Skynin, Вы писали:
DM>>Вообще-то да. Гарантия остутствия багов при сохранении эффективности — хорошая вещь. S>Вы не поняли. Мы в 21ом веке наконец то научились тестировать сортировку и проверять выход за рамки массива.
Тут принципиальный момент в том, что именно не "тестировать сортировку и проверять выход за рамки массива", а доказывать математически, да так, что доказательство проверяет машина, которая ничего не упустит. Т.е. степень уверенности в корректности совсем другая. И за счет такого доказательства можно убрать рантайм-проверки при работе с массивом, т.е. эффективность самой программы повышается. Раньше мы или полагались на внимательность программиста (и все знают, насколько это ненадежно), либо на рантайм-проверки в "безопасных" языках (и все знают, насколько это неэффективно).
Здравствуйте, D. Mon, Вы писали:
DM>Вы задали вопрос "где та методика", я дал конкретный ответ — "вот". Какие рассуждения вам нужны? DM>Задали вопрос "как математики ... собираются помочь в этом программистам?", я дал конкретный ответ — например, вот
Спасибо, почитаю. Первые ж абзацы указывают что математики там не будет.
Поясню чем мне не нравятся ответы "математиков" — я задаю вопросы о "соленом", а ответы дают о "красном".
А истоки такого недоразумения выкристолизованы давно:
одни считают программирование подразделом математики, а другие, в частности я, видом "лингвистики".
Правда конечно где-то "посредине", но "математики" выбирают для доказательства успешности одни задачи, а "лингвисты" — другие
И одно дело когда "математиками" выбираются хорошо формализуемые задачи типа 3D да криптографии.
Но чаще, ввиду и ограничения форумного формата общения, простые, совсем низкого уровня абстракции.
Даже по Вашей ссылке, Вы рассматриваете "список с длинной", а в жизни то, которую приходится записывать на ЯП:
... при отгрузке товара Х движение по бухгалтерскому счету Y ...
Так вот и мой вопрос не о контроле границ массива. это для меня, программиста, давно неактуально.
Как и список с длиной. Как и верификация алгоритма сортировки и прочие мелочи, которые уже написаны, или которыми занимается весьма небольшое число людей.
А как математики ... собираются помочь в записи правил для гораздо более сложных сущностей программистам?
Я уж промолчу о затронутой проблеме соответствия моделей коду. Это уже пусть архитекторы систем допытываются
Здравствуйте, D. Mon, Вы писали:
S>>И что? Что с очередным движком у Кармака то приключилось?
Да так, с Rage проблемки мелкие.
Но Кармак конечно глыба, однозначно
Просто не он один пишет успешные движки для игр.
То есть применяемые им инструменты НЕ дают явного преимущества.
DM>А вы хотели чуда?
Зачем же чуда. Просто хороших примеров.
DM>рад, что смог ту сортировку доказать, а на ее примере поучиться доказательному программированию.
Ну если вы до сих пор пишите сортировки, то да, разделяю вашу радость
Я давно уж их не пишу, поэтому меня ваша радость не греет.
DM>Ну так и их можно теми же средствами формализовывать. Просто пока этим мало кто занимается, т.к. не умеют, не обучены и учиться не спешат.
Ну это понятно, люди во всем виноваты. Пишут программы, корабли в космос запускают (хотя математики ни асилили задачу о 3ех телах, а сжульничали), но вот они не умеют, не обучены и т.д.
Обычный аргумент хаскелистов — вот если б были не быдлокодерами, то освоили б, и было бы великое счастье
DM>Ну да, это ж учебный пример у меня.
Да я понимаю что в короткой заметке и не получится рассказать о другом.
Но уровень абстракции, вот в чем заковыка.
Открываем такого же количества буков разъяснение какого-нить паттерна ООП и сравниваем.
Утрировано говоря — вы приводите пример о фичах ассемблера.
S>>Чтобы не повторятся, всего лишь одно назову: Проблема остановки. S>>Жду от "математиков" инструмента для устранения этого бага
DM>B ATS можно для рекурсивных функций и циклов формально доказать их завершимость, причем от программиста это требует минимум усилий.
...подключил нужную либу да и все.
DM>это решение для повседневных практических задач — удостовериться, что мой код не виснет.
Я не решаю подобные задачи на практике. Вернее я просто не замечаю когда решаю задачи подобного уровня.
Как не замечаю как завязываю шнурки на ботинках.
Здравствуйте, Skynin, Вы писали:
S>Спасибо, почитаю. Первые ж абзацы указывают что математики там не будет.
Она там есть, простая — арифметика да логика.
S>одни считают программирование подразделом математики, а другие, в частности я, видом "лингвистики".
Я не вижу противоречия между лингвистикой и математикой. Лингвистика математизируема, а математика, сама будучи языком, может быть предметом лингвистики.
S>Даже по Вашей ссылке, Вы рассматриваете "список с длинной", а в жизни то, которую приходится записывать на ЯП: S>... при отгрузке товара Х движение по бухгалтерскому счету Y ...
Ну мы же умудряемся это записать в терминах 1С, SQL или C#. И списки, и отгрузку товара. И если списки можно формализовать и что-то про них доказать, то и отгрузку товара можно. Просто правил будет больше.
S>Так вот и мой вопрос не о контроле границ массива. это для меня, программиста, давно неактуально.
Для вас неактуально, а для тысяч программистов, в коде которых нашли тысячи уязвимостей с переполнением буфера, еще как актуально.
S>Как и список с длиной. Как и верификация алгоритма сортировки и прочие мелочи, которые уже написаны, или которыми занимается весьма небольшое число людей. S>А как математики ... собираются помочь в записи правил для гораздо более сложных сущностей программистам?
Пока что ровно так же. Сортировка — это лишь пример, движение денег по счету не качественно сложнее, лишь количественно — числом правил. Но чем хорош подход компьютеризированного доказательства — компьютеру несложно проверить и 100 и 10000 правил, в то время как человек на таких объемах уже пасует, лепя баг за багом.
Здравствуйте, HrorH, Вы писали:
HH> Программирование — еще молодая область, возможно лет через сто появится нормальная методология разработки, которая позволит человеку не совершать ошибок...
HH>*Под абстракцией понимается выделение существенного.
Вспомнилось!
Ощущения от подобных дебатов, у меня как от истории:
Какой-то математик решил прочесть лекцию об эффективных способах раскроя ткани.
Пришло немало портных и их представителей.
Но после фразы, с которой он начал лекцию:
— Представим что человек это правильная сфера ...
бОльшая часть зала встала и ушла.
Здравствуйте, Skynin, Вы писали:
S>Да так, с Rage проблемки мелкие. S>То есть применяемые им инструменты НЕ дают явного преимущества.
Я бы по мелким проблемкам не спешил с такими выводами. А сколько движков было начато и недописано? Сколько дописано, но ценой многократно больших усилий? И вообще, много ли движков превзошли кармаковские? Обычно все только догоняли.
DM>>рад, что смог ту сортировку доказать, а на ее примере поучиться доказательному программированию. S>Ну если вы до сих пор пишите сортировки, то да, разделяю вашу радость
Я часто занимаюсь довольно низкоуровневыми вещами — кодеки, обработка видео. Это не сортировки, но навыки нужны похожие.
S>Обычный аргумент хаскелистов — вот если б были не быдлокодерами, то освоили б, и было бы великое счастье
И чем он плох? Вы же не хотите, например, чтобы машины проектировали и собирали неграмотные быдлоинженеры и криворукие быдлосборщики. И чтоб стригли вас быдлопарикмахеры, и т.д. Но почему-то хотите, чтобы неграмотные программисты писали без багов. Это я называю желанием чуда.
DM>>B ATS можно для рекурсивных функций и циклов формально доказать их завершимость, причем от программиста это требует минимум усилий. S>...подключил нужную либу да и все.
Нет, без либ. Дописал в сигнатуре функции выражение вроде .<a-b>. и все.
DM>>это решение для повседневных практических задач — удостовериться, что мой код не виснет. S>Я не решаю подобные задачи на практике. Вернее я просто не замечаю когда решаю задачи подобного уровня. S>Как не замечаю как завязываю шнурки на ботинках.
И не замечаете, как вносите баг за багом. Так все делают. А потом переделавают. И тестируют. И опять переделывают. Вместо того, чтобы один раз написать формализованно и дать компилятору проверить отсутствие противоречий.
Здравствуйте, matumba, Вы писали:
M>Здравствуйте, HrorH, Вы писали:
M>Всё ясно. Как уже правильно обобщил Carc, математик пытается умничать в области, где сам ниструя не понимает. M>Программинг только на заре 70-ых был "академическим", да и то математика там привлекалась только в силу требуемых алгоритмов. В целом же, программинг — это вообще отдельная дисциплина, где не то что "математическую модель", пару квадратов на бумаге — и то сложно расположить! Простой пример: GUI usability. Психология+интуиция+чтобы работало. Или вот базы данных — их что, по рядам Фурье считают? Далеко нет. Тупо "на практике" проверяют, будет ли отзывчивой система при 20 запросах в сек. Почему 20? Да просто эмпирика!
Дальше поскипано...
Не стоит делать преждевременные выводы при таком недостатке информации.
Это наиболее частая и фатальная ошибка,
когда человек считает,
что он знает достаточно
для принятия решения о том,
чтобы не продолжать исследование дальше.
Вообщем Вы не угадали. И по поводу меня, и поводу применимости математики к базам данных.
И не обижайте меня, пожалуйста.
Если написал непонятно, то извините. В этой ветке есть еще мои комментарии, может помогут.
Здравствуйте, HrorH, Вы писали:
HH>Вообщем Вы не угадали. И по поводу меня, и поводу применимости математики к базам данных.
Если у вас в руках цифры — это ещё далеко не "математика". Ну а для интереса, можете щегольнуть каким-нибудь мат.аппаратом, который необходимо применяют в построении СУБД. Слушаем?...
Кратко, моя речь сводилась к тому, что программинг (особ. промышленный) отстоит от математики не ближе филателии или строительной инженерии.
Если в паре мест вам удалось "математически" доказать какой-то алгоритм, остыньте — не стоит обольщаться, что сейчас набегут математики и всю программную инженерию поставят на уши своими теоремами.
Программинг — это наука + искусство + интуиция. Причём "наука" в большей степени "логика".
Здравствуйте, matumba, Вы писали:
M>Здравствуйте, HrorH, Вы писали:
HH>>Вообщем Вы не угадали. И по поводу меня, и поводу применимости математики к базам данных.
M>Если у вас в руках цифры — это ещё далеко не "математика". Ну а для интереса, можете щегольнуть каким-нибудь мат.аппаратом, который необходимо применяют в построении СУБД. Слушаем?...
Во-первых, я не очень понимаю, что Вы подразумеваете под построением СУБД. Месье делает свой аналог Sql Server?
Мы сами-то Sql Server не строим, мы только юзаем.
Те кто строят, так там математики навалом. Причем разной.
Реляционная алгебра. Теория категорий. Что из этого используют для написания Sql Server — это вопрос к разработчикам.
M>Кратко, моя речь сводилась к тому, что программинг (особ. промышленный) отстоит от математики не ближе филателии или строительной инженерии. M>Если в паре мест вам удалось "математически" доказать какой-то алгоритм, остыньте — не стоит обольщаться, что сейчас набегут математики и всю программную инженерию поставят на уши своими теоремами. M>Программинг — это наука + искусство + интуиция. Причём "наука" в большей степени "логика".
Согласен.
Блин, это я сам виноват. Когда я написал математическая модель, то ударение надо было ставить не на слово математический, а на слово модель.
Что касается доказательств, то они также нужны не всегда. И вообще, слово математика я понимаю достаточно широко, как некий язык, на котором можно записывать свои мысли.
Да, действительно мне в нескольких местах удалось не то чтобы доказать алгоритм, а создать модель, которая помогла мне находить ошибки при разработке (в том числе в одном месте дело было связано с базой данных, я использовал теорию множеств).
Именно что для каждого случая модель нужно придумывать разную, подходящую для данной конкретной задачи.
В конце концов, многие используют в программе конечные автоматы, и это часто приводит к повышению надежности. Это ведь тоже математика.
S>Епть, так язык программирования и есть такая запись S>Почитайте определение языка программирования хотя бы в википедии.
от того, что на ЯП в теории можно записать модель — совсем не означает, что сейчас на ЯП эти самые модели записываются.
например, от записи
class Segment
{
public double Left;
public double Right;
public double Top;
public double Bottom;
}
до модели отрезка — как отсюда до центра вселенной.
в данном случае, введение класса с такими полями это есть частное решение модели (вывод из модели), которая крутится у нас в голове:
1. всякий отрезок представим четырьмя координатами на плоскости
2. в декартовой системе координат можно ввести понятия лево-право(которые изоморфны отношению меньше-больше по оси X), вверх-вниз (которые изоморфны меньше-больше для системы координат принятой обычно в программировании, или больше-меньше принятой обычно в математике)
из этого, в частности, вытекает — что использование названии для полей Left/Right, Top/Bottom отчасти подразумевает, что для класса Segment используется инвариант: Top <= Bottom (или наоборот — в зависимости от выбранной системы координат), Left <= Right
и данный класс является именно частным решение модели (а не общим), потому что для отрезка четыре координаты могут браться произвольные: можно брать, например, центр отрезка и радиус-вектор, или конец отрезка, угол и длину и т.д.
задаваться отрезок тоже может сотней способов: в частности, например, как пересечение двух окружностей и т.д.
Здравствуйте, DarkGray, Вы писали:
DG>для кода вида, как во втором примере, требование "незацикливаться" проверяется простым автоматом за O(кол-во операторов в программе), а чтобы проверить на зацикливание код вида, как в первом варианте, необходим алгоритм со сложностью близкой к O(2^кол-во операторов в программе)
Несколько озадачен: если тела циклов одинаковы, то откуда берётся O(2^N) при использовании for? ИМХО, различие будет только на сложность доказательства корректности for/foreach (если индекс неизменен в цикле). Ну, возможно, ещё добавится O(N), то есть по сути возвращаемся к тому же исходному O(N), если предположить, что в каждой строке тела цикла есть обращение к индексной переменной — нужно доказать, что эти обращения не изменяют индекс. Но двойка в степени N...
DG>зы DG>изолированность хороша тем, что при правильной изоляции функция предсказуемости выглядит как: DG>Предсказуемость'(код, требование)=Sum(Предсказуемость'(изолированная часть кода_i, требование)) DG>для неизолированного кода функция ведет себя много хуже: DG>Предсказуемость'(код, требование)=Product(Предсказуемость'(неизолированная часть кода_i, требование))
В целом понятно, только всё равно, ИМХО, сформулировано запредельно громоздко. Нет, сказать по-простому: 1/вычислительная сложность проверки требования. А если вместо "проверки требования T" написать "доказательство свойства P", то получится ещё проще: "1/вычислительная сложность доказательства свойства P". Путаница возникает из-за того, что тривиальное значение слова "предсказуемость" не слишком похоже на твоё определение: интуитивно "предсказуемость" чаще понимается как сама возможность что-либо предсказать, вне количественных оценок сложности предсказания. Хотя соглашусь, что это тоже не бесспорно.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
ГВ>Несколько озадачен: если тела циклов одинаковы, то откуда берётся O(2^N) при использовании for? ИМХО, различие будет только на сложность доказательства корректности for/foreach (если индекс неизменен в цикле). Ну, возможно, ещё добавится O(N), то есть по сути возвращаемся к тому же исходному O(N), если предположить, что в каждой строке тела цикла есть обращение к индексной переменной — нужно доказать, что эти обращения не изменяют индекс. Но двойка в степени N...
в данном случае, сравниваются предсказывающие алгоритмы для двух классов кода, а не два конкретных этих примера.
один класс кода — состоит из управляющих операторов: if, for, предоопределенного набора функций Fs1;
а второй класс кода — состоит из управляющих операторов: if, foreach, предопределенного набора функций Fs2(в частности, Reverse).
оценки условные, более точно:
для достаточности конечности второго кода достаточно линейно проверить, что нет вызовов "запрещенных" функций, и дополнительно за O(N*log глубина вызовов) проверить, что функция не вызывает саму себя.
для первого кода, если выход из цикла делается по целочисленной переменной, то необходимо:
1. определить при каких значениях i будет выход из цикла
2. построить матрицу для каждого значения i в какое значение i оно переходит после одной итерации.
3. убедиться, что все пути матрицы из п.2 ведут к значениям i в п.1
приблизительная оценка всего этого O(2^32 * кол-во операторов, которые меняют i * 2^кол-во if-ов,которые зависят от i) для 4-х байтного int-а, если решать задачу в лоб
ГВ>В целом понятно, только всё равно, ИМХО, сформулировано запредельно громоздко. Нет, сказать по-простому: 1/вычислительная сложность проверки требования. А если вместо "проверки требования T" написать "доказательство свойства P", то получится ещё проще: "1/вычислительная сложность доказательства свойства P".
согласен, так лучше
ГВ> Путаница возникает из-за того, что тривиальное значение слова "предсказуемость" не слишком похоже на твоё определение: интуитивно "предсказуемость" чаще понимается как сама возможность что-либо предсказать, вне количественных оценок сложности предсказания. Хотя соглашусь, что это тоже не бесспорно.
поведение программы всегда предсказуемо: достаточно ее выполнить для всего набора входных данных.
так даже задача предсказания зацикленности решается: запустить программу и подождать 10^N секунд (10^K тактов),
если программа завершилась раньше, то значит она конечная,
если не завершилась, то гарантии что она бесконечная — нет, но есть зато оценка снизу, что быстрее, чем за 10^N секунд программа не завершается.
поэтому интересует не просто предсказуемо — да/нет, а какая вычислительная сложность предсказания и насколько это предсказание — точное(есть точный ответ, дает оценку сверху/снизу, дает корреляцию при определенных условиях и т.д.)
отмечу что выбор сигнатуры функции UpdateControl произошел на шаге 1, а на шагах 2-4 сигнатура функции уже UpdateControl не менялась, менялся только способ выбора этой функции.
вернемся к шагу 1 — при вынесении кода в функцию UpdateControl есть два сильно отличающихся способа ее задать (сформировать ее сигнатуру): Push и Pull.
//первый способ (Push)void PartialUpdateControl(Control control, Element element)
{
control.Font = new Font{Bold=true, Size = default.Font.Size * 1.1};
control.Color = Colors.Green;
}
//второй способ (Pull)
ControlState ElementPartialView(Element element)
{
return new ControlState
{
Font = new FontState{Bold=true, SizeK = 1.1};
Color = Colors.Green;
};
}
для первого способа код lazy maker-а уже приводился, для второго способа будет:
var maker = new LazyMaker(
() => ControlSynchronizer.Synchronize(element_with_control.Control, ElementPartialView(element_with_control.Element)),
() => element_with_control
);
Разница в сигнатурах void PartialUpdateControl(Control control, Element element) и ControlState ElementPartialView(Element element) начинает проявляться, когда происходит переход к задаче комбинирования правил вывода, в частности, в задаче декорирования.
в первом случае, декоратор переводит Control -> Control (при этом в Control-е намешано к этому времени уже куча всего: данные от зависимых правил вывода, состояние по умолчанию, память от предыдущих изменений и т.д.),
во втором случае, декоратор переводит ControlState -> ControlState, при этом в ControlState лежат данные только от зависимых правил вывода.
Здравствуйте, IT, Вы писали: Р>>>>"Сложность", по определению, это количество ошибок на километр кода. IT>>>Откуда такое "поопределение"? Р>>У тебя есть другое, которое не сводится к ошибкам на километр? Озвучь, пожалуйста.
IT>Если коротко, то я это понимаю как меру усилий, требуемых для решения поставленной задачи.
"Кол-во ошибок на километр кода" это такая же самая мера усилий. Наши определения тождественны.
Всё, что нас не убивает, ещё горько об этом пожалеет.
Здравствуйте, Ромашка, Вы писали:
IT>>Если коротко, то я это понимаю как меру усилий, требуемых для решения поставленной задачи. Р>"Кол-во ошибок на километр кода" это такая же самая мера усилий. Наши определения тождественны.
"Кол-во ошибок на километр кода" говорит не о сложности задачи, а о кривизне рук и наличии мозгов у разработчика. Здесь наиболее наглядно проявляется правило 80/20. 20% разработчиков создают 80% багов вне зависимости от сложности решаемой задачи.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали: IT>"Кол-во ошибок на километр кода" говорит не о сложности задачи, а о кривизне рук и наличии мозгов у разработчика.
Твоя мера сложности так же зависит от кривизны рук и/или наличия мозгов у программиста. При прямых руках и нормальных мозгах усилий на решение задачи будет затрачено меньше, чем при кривых руках и тараканах в голове. Наши определения тождественны.
Всё, что нас не убивает, ещё горько об этом пожалеет.
Здравствуйте, Ромашка, Вы писали:
Р>Твоя мера сложности так же зависит от кривизны рук и/или наличия мозгов у программиста. При прямых руках и нормальных мозгах усилий на решение задачи будет затрачено меньше, чем при кривых руках и тараканах в голове. Наши определения тождественны.
Мозги и руки лишь одна из состовляющих моего определения. Наши определения не могу быть тождественны, как не могут быть тождественны целое и его часть.
Если нам не помогут, то мы тоже никого не пощадим.
.
IT>>Наши определения не могу быть тождественны, как не могут быть тождественны целое и его часть. Р>Как математик, я с тобой не согласен.
Как человек, привыкший пользоваться здравым смыслом, я не могу понять, как по твоей логике мы с тобой можем быть тождественны, находя в тысячах километрах друг от друга
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, DarkGray, Вы писали:
DG>это первый шаг инкапсуляции. и на этом шаге от lazy maker-а инкапсулировали конкретный набор правил вывода выделенного элемента
Здесь есть дополнительный слой абстракции, а является этот дополнительный слой абстракции инкапсуляцией или логическим мусором не зная задачи, которую мы решаем, сказать нельзя.
DG>отмечу что выбор сигнатуры функции UpdateControl произошел на шаге 1, а на шагах 2-4 сигнатура функции уже UpdateControl не менялась, менялся только способ выбора этой функции.
Я не понимаю какое все это отношение имеет к обсуждению LazyMaker'а? LazyMaker это способ позволяющий определить нужно или не нужно в данный момент времени произвести обновление. На способ обновления LazyMaker не накладывает никаких ограничений, соответственно то каким способом лучше производить обновление это совершенно отдельный вопрос. Можно, конечно, и этот вопрос обсудить, но с начала все же хотелось бы определиться с LazyMaker'ом. Считаешь ли ты LazyMaker хорошим решением для взаимодействия геттерного и сеттерного кода? Лучше ли решение на LazyMaker, чем решение на активных синхронайзерах? Какие проблемы ты видишь при использовании LazyMaker'а?
DG>Разница в сигнатурах void PartialUpdateControl(Control control, Element element) и ControlState ElementPartialView(Element element) начинает проявляться, когда происходит переход к задаче комбинирования правил вывода, в частности, в задаче декорирования.
Разница понятна, но как ни странно не шибко заметно на реальных задачах. Т.к. если контрол пассивный, т.е. не активирует событий при изменении своих свойств, то в общем-то без разницы сколько раз мы присваивали его конкретное свойство — один или несколько. А если активный, то проблемы возникают и при одиночном изменении свойства, и при множественном.
Здравствуйте, IT, Вы писали:
M>>Был бы у каждой системы второй шанс — всё было бы намного лучше.
IT>Второго шанса может не понадобиться, если изначально закладывать в систему возможность ошибаться.
Это ещё сложнее, чем вообще написать безошибочную систему
Кроме того, ошибки одной системы могут "наводить" ошибки на другие. (как "плохая" структура данных поганит весь код, который ею оперирует)
И потом, в системах не всегда "всё плохо" — достаточно вовремя остановиться и подправить то, что изначально было архитектурным высером — тогда есть шанс "выправить" остальные системы и всё будет хорошо.
Здравствуйте, DarkGray, Вы писали:
DG>основная проблема, что математики хотят всегда точное решение. и в статье по ссылке подразумевается, что теории могут быть только точными. на практике же в большинстве задач достаточно теорий и решений, которые описывают и решают задачу с частичной потерей точности.
Угу вот в этой самой потере точности и прячутся и баги и неопределенности.
DG>>основная проблема, что математики хотят всегда точное решение. и в статье по ссылке подразумевается, что теории могут быть только точными. на практике же в большинстве задач достаточно теорий и решений, которые описывают и решают задачу с частичной потерей точности.
FR>Угу вот в этой самой потере точности и прячутся и баги и неопределенности.
неопределенность не ведет к багам, если ее правильно готовить.
U>Считаешь ли ты LazyMaker хорошим решением для взаимодействия геттерного и сеттерного кода? Лучше ли решение на LazyMaker, чем решение на активных синхронайзерах? Какие проблемы ты видишь при использовании LazyMaker'а?
синхронайзер решает другую задачу, поэтому его стоит вынести за скобки.
и тогда вопрос будет: что лучше — активный опрос или пассивное применение?
и краткий ответ: первое лучше обеспечивает достоверность и актуальность вывода данных, второе — более экономично.
в частности, через LazyMaker тяжело обеспечить достоверный и актуальный вывод результата функции, которая зависит от времени, или от меняющихся самостоятельно внешних данных
Здравствуйте, matumba, Вы писали:
IT>>Второго шанса может не понадобиться, если изначально закладывать в систему возможность ошибаться. M>Это ещё сложнее, чем вообще написать безошибочную систему
Речь идёт не о результате, а о процессе.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, DarkGray, Вы писали:
DG>и тогда вопрос будет: что лучше — активный опрос или пассивное применение? DG>и краткий ответ: первое лучше обеспечивает достоверность и актуальность вывода данных, второе — более экономично.
Как раз с актуальностью данных у синхронайзера плохо. Т.к. высокую частоту синхронизации нельзя поставить по соображениям производительности, а при частоте в единицы герц задержка при обновлении хорошо заметна глазом. Соответственно в реальном коде все равно приходится вставлять ForceSynchronize. Единственное достоинство синхронайзера это надежность, он гарантирует, что даже если явное обновление сделать забудут, то программа будет работать хоть и не оптимально, но более-менее нормально. Но этот плюс легко получить и при построении логики преобразований на LazyMaker'ах, используя синхронайзер только на верхнем уровне (например, раз в секунду перерисовывая главную форму).
DG>в частности, через LazyMaker тяжело обеспечить достоверный и актуальный вывод результата функции, которая зависит от времени, или от меняющихся самостоятельно внешних данных
В этом случае самый правильный подход это использовании синхронайзера на верхнем уровне и LazyMaker'ов на всех нижележащих уровнях. К примеру, переписывание по этому принципу логики отрисовки gridSynchronizer'а позволило кардинально упростить код.
DG>а переход с push на pull может давать и увеличение кол-ва сущностей, особенно на стыке с внешним окружением: как минимум требуется писать синхронайзер под каждый класс из внешнего окружения)
Все-таки я так и не понял откуда взялись лишние сущности при использовании LazyMaker'ов? Если задача простая, то взаимодействовать с сеттерным кодом можно напрямую из обработчика LazyMaker'а, проблем это не создает. Если задача сложная, то при любом подходе (хоть сеттерном, хоть событийном, хоть на синхронайзерах, хоть на LazyMaker'ах) работа с сеттерным кодом будет как-то инкапсулирована путем создания дополнительных оберток. С чего при использовании LazyMaker'ов этих оберток будет больше?
U>Все-таки я так и не понял откуда взялись лишние сущности при использовании LazyMaker'ов?
я уже выше показывал, что lazymaker — это не одна сущность.
это три сущности в одном месте: структурный кэш + синхронайзер (в данном случае, каждый раз по месту) + целевое состояние (тоже по месту)
зы
попробуй представить как бы ты описал на maker-ах сложное поведение: например, поведение крестика закладки в хроме:
в хроме, когда закладок много — пространство делится между всеми закладками.
при нажатии на крестик, следующая закладка анимировано сдвигается на место предыдущей, при этом крестик оказывается точно под мышкой, и т.д.
и только при убирание мышки — закладки увеличиваются (с анимацией), чтобы занять всё пространство.
Здравствуйте, HrorH, Вы писали:
HH> А что если предположить, что баг не должно быть вообще? Почему человек не может думать без ошибок? В чем причина ошибок?
Я пока придерживаюсь того мнения, что "никто не использует предыдущие наработки". Пока — потому что не видел, что это не так.
Грубо говоря, если один программист написал велосипед, то другой программист в большинстве случаев тоже пишет свой велосипед для аналогичной задачи. В одном велосипеде — одни баги, в другом — другие и/или те же самые.
Здравствуйте, DarkGray, Вы писали:
DG>я уже выше показывал, что lazymaker — это не одна сущность. DG>это три сущности в одном месте: структурный кэш + синхронайзер (в данном случае, каждый раз по месту) + целевое состояние (тоже по месту)
Ты точно читаешь на что отвечаешь? Никакого синхронайзера нет, т.к. максимум нужен один синхронайзер на самом верхнем уровне (т.е. в общем случае синхронайзер один на множество LazyMaker'ов) и при этом он занимает где-то три строки кода, причем стандартных (т.е. создание этого синхронайзера можно вообще вынести в функцию и заменить на один вызов). Что такое структурный кэш и целевое состояние я не совсем понял. Реально есть сам LazyMaker и в сложных случаях какая-то обвязка над логикой действия. Причем примерно такая же обвязка над логикой будет и при любом другом подходе.
DG>попробуй представить как бы ты описал на maker-ах сложное поведение: например, поведение крестика закладки в хроме: DG>в хроме, когда закладок много — пространство делится между всеми закладками. DG>при нажатии на крестик, следующая закладка анимировано сдвигается на место предыдущей, при этом крестик оказывается точно под мышкой, и т.д. DG>и только при убирание мышки — закладки увеличиваются (с анимацией), чтобы занять всё пространство.
И в чем проблема? Как я понимаю соль здесь в том, что текущего логического состояния для определения как нужно выводить закладки не достаточно, необходима еще информация о предыдущем логическом состоянии. Соответственно такую информацию нужно добавить, например, в виде начального числа закладок. Логика работы будет такой, при нажатии на крестик, удаляем закладку и вызываем перерисовку, срабатывает LazyMaker, видит, что начальное число закладок не соответствует текущему, значит, размещение закладок нужно выполнить особым образом. При уходе мыши с панели сбрасываем начальное число закладок в текущее и вызываем перерисовку. На LazyMaker'а эта задача становится примитивней некуда, хотя подозреваю, что реализовывать это на событиях радость еще та.
С анимацией тоже самое. Выставляем время начала анимации, запускаем таймер периодически дергающий отрисовку, отрисовщик по времени прошедшему с начала анимации определяет какой кадр сейчас нужно показать.
Здравствуйте, HrorH, Вы писали:
HH> 1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись.
Т. е.перед началом кодирования необходимо достичь нирваны (решить проблему/задачу тысячелению какую-нибуль)?
Здравствуйте, DarkGray, Вы писали:
U>> Никакого синхронайзера нет DG>мы до сих пор говорим про сущности, или про названия классов?
Про сущности, конечно. Активного синхронайзера при решении на LazyMaker'ах нет, за исключением возможно самого верхнего уровня.
U>>И в чем проблема? DG>приведи рабочий код, тогда можно поговорить: сколько сущностей необходимо, чтобы его выразить.
Здравствуйте, Ромашка, Вы писали:
IT>>Если коротко, то я это понимаю как меру усилий, требуемых для решения поставленной задачи.
Р>"Кол-во ошибок на километр кода" это такая же самая мера усилий. Наши определения тождественны.
Не тождественны. Один человек сделает одно количество ошибок, другой — другое
Здравствуйте, IT, Вы писали:
IT>>>Откуда такое "поопределение"? Р>>У тебя есть другое, которое не сводится к ошибкам на километр? Озвучь, пожалуйста.
IT>Если коротко, то я это понимаю как меру усилий, требуемых для решения поставленной задачи.
Это сильно субъективное определение. Задача одна и та же, но одному для решения надо только синтаксис нового языка освоить, а другому всё программирование целиком, а третьему еще и математику дополнительно подтянуть.
Проще определять как количество составляющих в описании решения, тогда можно переводить метрику и в количество усилий и в количество ошибок на километр.
IT>>Не вижу в твоём утверждении логической связи между тем, что после 'если' и после 'то'.
Р>"Сложность", по определению, это количество ошибок на километр кода. Если мы рассматриваем программирование как управление количеством ошибок на километр кода то, согласно закону сохранения сложности, любая конструкция является ошибкой или ошибок вообще не бывает.
Представь, один и тот же человек пытается решать одну и ту же задачу, в первый раз ошибок мало, во второй раз много. Это что же, задача стала сложнее ? Объяснений может быть много, но факт в том, что количество ошибок слишкмо сильно коррелирует с помехоустойчивостью, а потому применять такую метрику смысла нет.
Здравствуйте, HrorH, Вы писали:
HH> Есть ли какой-то способ проектирования, который бы позволил если не избавиться от ошибок, то хотя бы минимизировать их число? HH> Может ли существовать какой-то паттерн мышления, которому надо следовать, чтобы добиться этого?
Это излагается в первых главах книги Эванса ДДД. Дальше его снесло на паттерны, БД, ООП и на том ДДД закончилось.
Здравствуйте, Tanker, Вы писали: IT>>>Если коротко, то я это понимаю как меру усилий, требуемых для решения поставленной задачи. Р>>"Кол-во ошибок на километр кода" это такая же самая мера усилий. Наши определения тождественны. T>Не тождественны. Один человек сделает одно количество ошибок, другой — другое
Тождественны. Один человек потратит день усилий, другой -- неделю на решение одной и той же задачи.
Всё, что нас не убивает, ещё горько об этом пожалеет.
Здравствуйте, Tanker, Вы писали: T>Представь, один и тот же человек пытается решать одну и ту же задачу, в первый раз ошибок мало, во второй раз много. Это что же, задача стала сложнее ? Объяснений может быть много, но факт в том, что количество ошибок слишкмо сильно коррелирует с помехоустойчивостью, а потому применять такую метрику смысла нет.
Не вижу противоречий. В мире полно метрик с оговоркой "при нормальных условиях".
Всё, что нас не убивает, ещё горько об этом пожалеет.
Здравствуйте, HrorH, Вы писали:
HH> Программирование — еще молодая область, возможно лет через сто появится нормальная методология разработки, которая позволит человеку не совершать ошибок...
Все правильно. Сейчас программист — это не инженер, а шаман. В математику он "не верит". Он "практик", т.е. рассуждает так: "Зачем мне математика? У меня нет времени возиться с ней — лучше я принесу в жертву черную курицу и напишу два юнит теста. И все как-нибудь наладится." То, что получившиеся программы работают плохо и недолго считается нормальным. Ну, программа — это ж не мост железнодорожный: у нее судьба такая — падать. от судьбы-то не уйдешь. Это неизбежный этап развития каждого вида деятельности. В XIX веке инженеры-мостостроители тоже, в массе своей, не верили в математику — они же практики, а не непойми кто. И мосты падали. А как иначе-то? Судьба у мостов железнодорожных такая — падать. То, что в математику верить не надо — она и так работает — до "практика" не доходит. Потому, что без теории практика слепа.
А вам, за то, что время опережаете еще 100500 смайликов поставят, думая при этом: "Вот умора! Может через 100 лет еще и черных куриц в жертву приносить не будут, и с бубном танцевать?"
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Ромашка, Вы писали:
Р>Здравствуйте, Tanker, Вы писали: IT>>>>Если коротко, то я это понимаю как меру усилий, требуемых для решения поставленной задачи. Р>>>"Кол-во ошибок на километр кода" это такая же самая мера усилий. Наши определения тождественны. T>>Не тождественны. Один человек сделает одно количество ошибок, другой — другое
Р>Тождественны. Один человек потратит день усилий, другой -- неделю на решение одной и той же задачи.
То есть, сложность одно и той же задачи разная. Следовательно твоя метрика никуда не годится.
Здравствуйте, Ромашка, Вы писали:
T>>Представь, один и тот же человек пытается решать одну и ту же задачу, в первый раз ошибок мало, во второй раз много. Это что же, задача стала сложнее ? Объяснений может быть много, но факт в том, что количество ошибок слишкмо сильно коррелирует с помехоустойчивостью, а потому применять такую метрику смысла нет.
Р>Не вижу противоречий. В мире полно метрик с оговоркой "при нормальных условиях".
Во первых, нет способа обеспчить эти нормальные условия.
Во вторых, если "Один человек потратит день усилий, другой -- неделю на решение одной и той же задачи" то твоя метрика выдаёт разную сложность для одной и той же задачи.
Здравствуйте, Tanker, Вы писали: Р>>Тождественны. Один человек потратит день усилий, другой -- неделю на решение одной и той же задачи. T>То есть, сложность одно и той же задачи разная. Следовательно твоя метрика никуда не годится.
Предложи другую.
Всё, что нас не убивает, ещё горько об этом пожалеет.
Здравствуйте, Tanker, Вы писали:
T>Во первых, нет способа обеспчить эти нормальные условия. T>Во вторых, если "Один человек потратит день усилий, другой -- неделю на решение одной и той же задачи" то твоя метрика выдаёт разную сложность для одной и той же задачи.
Из этого следует вывод, что "управление сложностью" лженаука и место ей в РАЕН.
Ну, собственно, я это подозревал, думал может у кого есть нормальное определение сложности...
Всё, что нас не убивает, ещё горько об этом пожалеет.
Здравствуйте, Ромашка, Вы писали:
Р>Здравствуйте, Tanker, Вы писали:
T>>Во первых, нет способа обеспчить эти нормальные условия. T>>Во вторых, если "Один человек потратит день усилий, другой -- неделю на решение одной и той же задачи" то твоя метрика выдаёт разную сложность для одной и той же задачи.
Р>Из этого следует вывод, что "управление сложностью" лженаука и место ей в РАЕН.
Нет, из этого следует что твоя метрика никуда не годится. Для РАЕН нужно что бы все метрики никуда не годились Или ты считаешь, что твоя метрика и есть эти все ?
Р>Ну, собственно, я это подозревал, думал может у кого есть нормальное определение сложности...
Не нужно изобретать велосипед, всё уже украдено до нас.
Здравствуйте, Ромашка, Вы писали:
Р>>>Тождественны. Один человек потратит день усилий, другой -- неделю на решение одной и той же задачи. T>>То есть, сложность одно и той же задачи разная. Следовательно твоя метрика никуда не годится.
Р>Предложи другую.
Здравствуйте, DarkGray, Вы писали:
DG>Ошибки появляются в следствии следующих причин: DG>1. "а это вообще должно было работать?" DG>2. неверная модель DG>3. забыты или нерассмотренны какие-то варианты поведения кода DG>4. опечатка
DG>Ошибки первого рода возникают, когда программист даже не пытается обосновать и доказать правильность работы свое кода. DG>Ошибки второго рода провоцирует наше незнание, например, незнание — что требования к многопоточному коду отличаются от требований к однопоточному коду. DG>"Темные углы", они же вырожденные и частные случаи, и их нерасмотрение приводит к ошибкам третьего рода. DG>Опечатки заложены в природе человека, и даже так и называются — "человеческий фактор". Опечатки уменьшаются при концентрации всего внимания на одной задаче, но полностью от них избавиться не получается.
Все 4 твоих случая и есть "человеческий фактор", а опечатки это реально не только опечатки.
Если отказаться от изобретения велосипеда и взять готовый инструмент, то окажется примерно такая картина
1. недостаточно полная информация — основная причина
а. недостаточный уровень знаний ЧФ !
б. неверная методология ЧФ !
2. неверная реализация ЧФ !
3. фактор помехоустойчивости — ЧФ ! проявляется в том в п.п. 1..2 человек просто делает ошибки.
Подробнее про 3.
Например человек забывает или не успевает изучить предмет из за усталости — 1а.
Или из за той же усталости пропускает перепроверку — 1б
Из за той же усталости делает ошибку в реализации алгоритма — это может быть и опечатка и все что угод. п2
Отсюда ясно, что ошибки побороть в принципе нельзя, т.к. есть задачи по которым невозможно добиться полноты информации, а ЧФ не может отменить никто, даже господь бог.
Но вообще говоря наверняка найдется десяток функционалистов, которые скажут что всё это фигня и что они могут писать без ошибок
Здравствуйте, DarkGray, Вы писали:
DG>Основная разница: это есть ли ОТК и как он построен. У инженеров есть лишь преимущество, что они на 100 лет больше потратили на выстраивание ОТК для проверки качества своей работы. А также сложностью входа на инженерный рынок: большинство решений делается уже существующими компаниями, у которых наработана школа ОТК. в программировании из-за его сильной изменчивости и низкого порога входа: есть большая доля новичков, которые не имеют выстроенного подхода к ОТК. В тоже время большое кол-во новичков и низкий порог входа обеспечивает бурное развитие отрасли.
В программировании сложность создания ОТК в том, что нужно очень хорошо разбираться в программировании. То есть, для реализации контроля нужно владение теми же инструментами что используются для создания проекта. В обычной инженерии это легко разделяется и контролировать могут вообще не инженеры пользуясь формальными признаками.
Здравствуйте, Klapaucius, Вы писали:
K>Здравствуйте, HrorH, Вы писали:
HH>> Программирование — еще молодая область, возможно лет через сто появится нормальная методология разработки, которая позволит человеку не совершать ошибок...
K>Все правильно. Сейчас программист — это не инженер, а шаман. В математику он "не верит". Он "практик", т.е. рассуждает так: "Зачем мне математика? У меня нет времени возиться с ней — лучше я принесу в жертву черную курицу и напишу два юнит теста. И все как-нибудь наладится." То, что получившиеся программы работают плохо и недолго считается нормальным. Ну, программа — это ж не мост железнодорожный: у нее судьба такая — падать. от судьбы-то не уйдешь. Это неизбежный этап развития каждого вида деятельности. В XIX веке инженеры-мостостроители тоже, в массе своей, не верили в математику — они же практики, а не непойми кто. И мосты падали. А как иначе-то? Судьба у мостов железнодорожных такая — падать. То, что в математику верить не надо — она и так работает — до "практика" не доходит. Потому, что без теории практика слепа. K>А вам, за то, что время опережаете еще 100500 смайликов поставят, думая при этом: "Вот умора! Может через 100 лет еще и черных куриц в жертву приносить не будут, и с бубном танцевать?"
Имхо, скорее программист это "исследователь". До некоторой степени конечно. Создание софтины во многом похоже на исследование, на поиск решения. А где это видано чтобы она находилось сразу да еще и единственно верное!?! (а иначе, нахр мы все нужны, если решение есть)? Не зря Брукс говорил "первая версия системы всегда отправляется в помойку".
И правильно, т.к. первое найденное решение и не должно быть лучшим. И как раз с этой точки зрения формулировка как "исследователя" наверное и соответствует. По сути готовая программа это отчет о поиске решения.
А математику мы любим, и ценим, и уважуха с респектом. Только
а) Вопрос ни как считать, а что... Частенько "математики" знают как считать, но мало имеют понятия что и зачем. Неспроста программирование азмь езмь прикладная математика...
б) А Эдсгер Дейкстра про математику и программирование как то отмечал "что слабым (poor) математикам лучше оставаться чистыми (pure) математикам". И совершенно прав. Видал примеры не по разу..
PS: вдогонку про математику: никогда не забуду прикладную математику с кучей метрик по первому своему образование. Короче меряли мы там вполне физические объекты реального мира. Не в том суть. Полгода нам читали не сами меряния\считалки_метрик, это все было в матане, тервере, и прочей ереси за курс до этого. Сколько нам рассказывали, как интерпретировать енти самые метрики. Ну к примеру, если мы там насчитали уравнений, выборок и прочия, в результате у нас нечто отношения метр к метру, то оно конечно отношение. Для математиков и останется отношением. А нам по сути профессии важно что это азмь езмь уклон, ибо у нас это высота и ширина. Ну в общем как-то так. Учили придавать полученным циферкам осмысленное значение вполне физических величин (ну там как бы и курс был типа "мат.аппарат для целей Икс-икс"...
Ну дык вот... В конце концов одна наша деваха считала, считали, мозг себе крутила, пересдавал профессору, он ей толкует что что-то ни туда ты насчитала. А она все равно "у меня метрика штуки в квадрате". И хоть кол ей на голове тещи, и объяснять что "штуки в квадрате" смысла не имеют. Ее пофиг. Ибо потому что, хотя и брюнетка была (шифровалась).
Это я все к тому. Что думать надо головой. Вот как вышепреведенной девахе, звезде мат. анализа может помочь математика? Математика это такая острая сабля, ею можно как и красиво колбаску нарезать, так и яйца себе отрубить. Что наша деваха и продемонстрировала. Правда так и не поняла чего сделала, ей и без оных неплохо. Кстати, сейчас преподает, правда слава те хоспади не математику все-таки. Туда ее не подпускают.
Так что голова, голова и еще раз голова. Математика всего лишь инструмент, причем в котором очень важно понимать граничные условия применимости того или иного решения.
T>Все 4 твоих случая и есть "человеческий фактор", а опечатки это реально не только опечатки.
под человеческим фактором обычно подразумевают то, что свойственно человеку, и не свойственно машине (цифровому автомату)
T>Если отказаться от изобретения велосипеда и взять готовый инструмент, то окажется примерно такая картина T>1. недостаточно полная информация — основная причина T> а. недостаточный уровень знаний ЧФ !
машине это свойственно даже в большей степени
T> б. неверная методология ЧФ !
аналогично
T>2. неверная реализация ЧФ !
тем более
T>3. фактор помехоустойчивости — ЧФ ! проявляется в том в п.п. 1..2 человек просто делает ошибки.
и только вот это ЧФ, потому что именно человеку свойственно делать каждый раз одно и тоже чуть-чуть по другому
T> усталость
усталось это тоже не ЧФ, за ddos тот же rsdn и ошибки от "усталости" rsdn сразу полезут.
T>В программировании сложность создания ОТК в том, что нужно очень хорошо разбираться в программировании. То есть, для реализации контроля нужно владение теми же инструментами что используются для создания проекта. В обычной инженерии это легко разделяется и контролировать могут вообще не инженеры пользуясь формальными признаками.
если открыть серьезную книжку по тестированию ПО там все подходы по генерации формальных признаков уже написаны
Здравствуйте, DarkGray, Вы писали:
T>>Все 4 твоих случая и есть "человеческий фактор", а опечатки это реально не только опечатки. DG>под человеческим фактором обычно подразумевают то, что свойственно человеку, и не свойственно машине (цифровому автомату)
Правильно. Решение задач вообще не свойственно машинам.
T>>1. недостаточно полная информация — основная причина T>> а. недостаточный уровень знаний ЧФ !
DG>машине это свойственно даже в большей степени
А что, у машин уже есть разумная жизнь ? Не знал.
T>> б. неверная методология ЧФ ! DG>аналогично
Методология управление своей деятельностью, требует разумной жизни
T>>2. неверная реализация ЧФ ! DG>тем более
Дай ка ссылку на какой нибудь реализатор задач
T>>3. фактор помехоустойчивости — ЧФ ! проявляется в том в п.п. 1..2 человек просто делает ошибки.
DG>и только вот это ЧФ, потому что именно человеку свойственно делать каждый раз одно и тоже чуть-чуть по другому
T>> усталость DG>усталось это тоже не ЧФ, за ddos тот же rsdn и ошибки от "усталости" rsdn сразу полезут.
Усталость это только один из ЧФ, т.к. именно из за неё человек и делает одно и то же каждый раз чуть чуть по другому.
Здравствуйте, DarkGray, Вы писали:
T>>В программировании сложность создания ОТК в том, что нужно очень хорошо разбираться в программировании. То есть, для реализации контроля нужно владение теми же инструментами что используются для создания проекта. В обычной инженерии это легко разделяется и контролировать могут вообще не инженеры пользуясь формальными признаками.
DG>если открыть серьезную книжку по тестированию ПО там все подходы по генерации формальных признаков уже написаны
В ОТК учитывается состояние проектной документации, а в книгах по тестированию ПО ничего подобного нет. В программировании программный код есть фактически часть проектной документации и наиболее значимая. Проектную документацию проверяют через ревью.
Опаньки — контролер проекта на хаскеле должен быть адским хаскелистом !
один из конструктивных критериев разумности (без привлечения магии, что понять что такое разум нам не подвластно) — это увеличение сложности.
разумный алгоритм — это алгоритм, который самостоятельно увеличивает свою сложность.
таким свойством обладает широкий класс алгоритмов, которые перестраивают себя на основе свой деятельности: переборные алгоритмы с перестроением последовательности перебора, нейронные сети и т.д.
T>В ОТК учитывается состояние проектной документации, а в книгах по тестированию ПО ничего подобного нет. В программировании программный код есть фактически часть проектной документации и наиболее значимая. Проектную документацию проверяют через ревью. T>Опаньки — контролер проекта на хаскеле должен быть адским хаскелистом !
это лишь говорит о наличии задачи: построить проектную документацию на русском языке на основе кода.
Здравствуйте, Tanker, Вы писали:
IT>>Если коротко, то я это понимаю как меру усилий, требуемых для решения поставленной задачи.
T>Это сильно субъективное определение. Задача одна и та же, но одному для решения надо только синтаксис нового языка освоить, а другому всё программирование целиком, а третьему еще и математику дополнительно подтянуть.
Всё правильно. Никто не отрицает, что сложность субъективна. Поэтому и определение такое субъективное.
T>Проще определять как количество составляющих в описании решения, тогда можно переводить метрику и в количество усилий и в количество ошибок на километр.
Это всё части целого.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, DarkGray, Вы писали:
T>>В ОТК учитывается состояние проектной документации, а в книгах по тестированию ПО ничего подобного нет. В программировании программный код есть фактически часть проектной документации и наиболее значимая. Проектную документацию проверяют через ревью. T>>Опаньки — контролер проекта на хаскеле должен быть адским хаскелистом !
DG>это лишь говорит о наличии задачи: построить проектную документацию на русском языке на основе кода.
В каких книгах по тестированию ПО описывается решение этой задачи ?
Здравствуйте, DarkGray, Вы писали:
T>>В каких книгах по тестированию ПО описывается решение этой задачи ?
DG>решение этой задачи к тестированию никакого отношения не имеет.
Пока эта задача(или подобная) не решена, для реализации контроля нужно владение теми же инструментами что используются для создания проекта при чем на том же уровне, что и разработчики.
Здравствуйте, matumba, Вы писали:
M>Программинг только на заре 70-ых был "академическим", да и то математика там привлекалась только в силу требуемых алгоритмов. В целом же, программинг — это вообще отдельная дисциплина, где не то что "математическую модель", пару квадратов на бумаге — и то сложно расположить! Простой пример: GUI usability. Психология+интуиция+чтобы работало. Или вот базы данных — их что, по рядам Фурье считают? Далеко нет. Тупо "на практике" проверяют, будет ли отзывчивой система при 20 запросах в сек. Почему 20? Да просто эмпирика!
Все это так, но плохо, что это так. Когда-то и инженеры "эмпирически" конструировали, и в программировании это пройдет.
Здравствуйте, DarkGray, Вы писали:
DG>не вижу кода SyncTabs
Что ты там рассчитываешь увидеть интересного? Это тривиальный код размещения закладок по панели. Его я разумеется приводить не буду, т.к. этот код принципиально такой же как и в любых других решениях.
DG> и анимации
...можно, за бесконечно большое время, предварительно обзаведясь бесконечно большим мозгом
HH> А что если предположить, что баг не должно быть вообще? Почему человек не может думать без ошибок? В чем причина ошибок? HH> Мне кажется, основная причина в том, что разработка происходит стихийно, каждый пишет, что ему придет в голову.
если вы остановите впадение всех вод в океан, я вам напишу программу без ошибок
Здравствуйте, Real 3L0, Вы писали:
J>>если вы остановите впадение всех вод в океан, я вам напишу программу без ошибок R3>Лети на Марс, там все воды остановлены — будешь кодить без ошибок.
вот, ты уже познал дао программирования — без ошибок может писать только сферический программист в вакууме
хотя бы почему его три, и почему именно этот код растет при увеличении задачи.
есть подозрение, что этот код дублируется (содержит элементы copy-paste)
Здравствуйте, DarkGray, Вы писали:
DG>хотя бы почему его три, и почему именно этот код растет при увеличении задачи.
Потому что логически есть три разные задачи:
1) Штатное размещение закладок на панели
2) Размещение закладок на панели таким образом, чтобы крестик следующей закладки оказался на месте крестика удаленной закладки
3) Размещение закладок на панели в ходе анимации
Это разные задачи поэтому каждая задача была оформлена в виде отдельной сущности. Какие-то подзадачи при решении этих задач могут быть идентичными, соответственно эти подзадачи будут оформлены в виде отдельных сущностей (например, чистых функций) и использоваться при решении нескольких задач.
DG>есть подозрение, что этот код дублируется (содержит элементы copy-paste)
Не понял проблему. Ты до сих пор не владеешь методами устранения дублирования? При выносе преобразований в чистые функции устранение дублирования это тривиальнейшая задача. Что там в общем случае интересного-то может быть?
Здравствуйте, igna, Вы писали:
I>Все это так, но плохо, что это так. Когда-то и инженеры "эмпирически" конструировали, и в программировании это пройдет.
а они перестали "эмпирически" конструировать?
Почему тогда тестовые полигоны до сих пор не разломали, аэродинамические трубы и т.п.
Здравствуйте, Klapaucius, Вы писали:
K>В XIX веке инженеры-мостостроители тоже, в массе своей, не верили в математику — они же практики, а не непойми кто. И мосты падали. А как иначе-то?
и именно поэтому сейчас мост построят, а потом раз, и оказывается что в этом районе ветер бывает сильнее, чем учли в модели и мост опять падает, несмотря на математику...
Здравствуйте, Carc, Вы писали:
C>Имхо, скорее программист это "исследователь". До некоторой степени конечно.
Нет, программист не занимается научно-исследовательской работой, он занимается проектной и опытно-конструкторской.
C>Создание софтины во многом похоже на исследование, на поиск решения. А где это видано чтобы она находилось сразу да еще и единственно верное!?! (а иначе, нахр мы все нужны, если решение есть)? Не зря Брукс говорил "первая версия системы всегда отправляется в помойку".
Программа это машина, создание программ от создения паровозов только тем отличается, что построить паровоз по чертежам — нетривиальная задача, а наладить массовое производство — еще сложнее. Программа же производится из исходного кода полностью автоматически, а тиражируется и вовсе тривиально — простым копированием. Разумеется прототип программы, как и прототип поровоза делается навыброс. Тут Брукс никакой америки не открыл.
C>А математику мы любим, и ценим, и уважуха с респектом. Только C>а) Вопрос ни как считать, а что... Частенько "математики" знают как считать, но мало имеют понятия что и зачем. Неспроста программирование азмь езмь прикладная математика... C>б) А Эдсгер Дейкстра про математику и программирование как то отмечал "что слабым (poor) математикам лучше оставаться чистыми (pure) математикам". И совершенно прав. Видал примеры не по разу..
Программирование, разумеется, не математика в таком же точно смысле в каком физика — не математика, а выкапывание картошки — не лопата и не производство/разработка лопат. И математик не являеется физиком или программистом. Математик обеспечивает других специалистов инструментарием, но самому ему нет ни нужды ни даже смысла выполнять работу этих специалистов. Разработчику лопат не нужно идти работать землекопом — это просто нерационально, для его талантов есть лучшее применение, да и особых результатов при прокладке траншей он не получит. Но землекоп получает выгоду от умения работать лопатой. А физик получает явные выгоды от знания математики, которые может получать и программист (но не хочет).
C>думать надо головой.
Проблема в том, что когда кто-то просто думает головой — он редко получает воспроизводимые практические результаты. Обычно получаются "народные приметы", суеверия и прочие "паттерны проектирования". Поэтому и существует комплекс инструментов вроде научного подхода вообще и математики, которые усиливают головной думатель и направляют его по нужному пути. В некоторых областях математика так успешна, что "думатель" даже не нужен — достаточно тупо подставлять и применять по определенным простым правилам. Т.е. процесс становится автоматизируемым.
C>Математика это такая острая сабля, ею можно как и красиво колбаску нарезать, так и яйца себе отрубить.
Острая сабля — это как раз голова. А математика — это бронещиток на яйцах.
C>Так что голова, голова и еще раз голова. Математика всего лишь инструмент, причем в котором очень важно понимать граничные условия применимости того или иного решения.
Золотые слова. Проблема в том, что программисты ан масс этим инструментом не владеют и граничных условий применимости не понимают. Это и отличает шамана от обыкновенного инженера.
При этом шаманы от программирования считают свою работу жутко сложной и творческой, которую умом не понять, аршином не измерить. Можно только верить, короче. Вот только верить — вредно. Надо знать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, jhfrek, Вы писали:
J>и именно поэтому сейчас мост построят, а потом раз, и оказывается что в этом районе ветер бывает сильнее, чем учли в модели и мост опять падает, несмотря на математику...
... а следовательно не нужно тратить время на математику, а лучше принести в жертву побольше черных куриц" — поясняет шаман.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, DarkGray, Вы писали:
DG>ты не привел полноценного кода, который можно запустить — это проблема.
Мне что заняться нечем, писать полноценный код для совершенно ненужной мне задачи? Если ты не способен понять, что синхронизация и действие это ортогональные проблемы, соответственно если рассматривается решение проблемы синхронизации, то код действий совершенно не интересен, то чем я тебе могу помочь?
Здравствуйте, Klapaucius, Вы писали:
J>>и именно поэтому сейчас мост построят, а потом раз, и оказывается что в этом районе ветер бывает сильнее, чем учли в модели и мост опять падает, несмотря на математику... K>... а следовательно не нужно тратить время на математику, а лучше принести в жертву побольше черных куриц" — поясняет шаман.
вам, шаману, виднее что вы поясняете.
А я пишу о том, что даже математика и даже инженерам не в состоянии помочь построить 100% надежные мосты. Построение модели что в инженерном деле, что в программировании, увы, но выходит за рамки математики
U>Мне что заняться нечем, писать полноценный код для совершенно ненужной мне задачи? Если ты не способен понять, что синхронизация и действие это ортогональные проблемы, соответственно если рассматривается решение проблемы синхронизации, то код действий совершенно не интересен, то чем я тебе могу помочь?
я хочу увидеть полный код для сложной задачи, где одновременно переплетается несколько конфликтующих логических задач.
потому что только на таких задачах (имея код на руках в которых эти конфликты разрешаются) имеет смысл говорить о преимуществах и недостатках того или иного подхода.
U> Мне что заняться нечем, писать полноценный код для совершенно ненужной мне задачи?
а разве это косвенно не означает, что твой подход трудозатратный? раз ты не можешь за короткое время выдать код под достаточно небольшую задачку.
зы
в твоем текущем коде я не вижу как разрешаются конфликты:
что анимаций может быть несколько одновременно,
что анимация может затрагивать закладки, которые уже удалены,
и т.д.
Здравствуйте, jhfrek, Вы писали:
J>вам, шаману, виднее что вы поясняете.
Это, наверное, я употребляю выражения вроде "дао программирования", ага?
J>А я пишу о том, что даже математика и даже инженерам не в состоянии помочь построить 100% надежные мосты.
Инженеры не строят мосты со 100% надежностью. Строят мосты с разумной надежностью вроде 99.99% Из этого простого соображения не следует, что нужно бросить все и делать мосты с непредсказуемой надежностью, которую впоследствии по статистике падений оценят как "невысокую".
J> Построение модели что в инженерном деле, что в программировании, увы, но выходит за рамки математики
Программистам повезло — для них тут ситуация лучше, чем в среднем по инженерным деятельностям.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Klapaucius, Вы писали:
J>>вам, шаману, виднее что вы поясняете. K>Это, наверное, я употребляю выражения вроде "дао программирования", ага?
нет, вы просто не понимаете шуток
J>>А я пишу о том, что даже математика и даже инженерам не в состоянии помочь построить 100% надежные мосты. K>Инженеры не строят мосты со 100% надежностью. Строят мосты с разумной надежностью вроде 99.99% Из этого простого соображения не следует, что нужно бросить все и делать мосты с непредсказуемой надежностью, которую впоследствии по статистике падений оценят как "невысокую".
"бросить все и делать мосты с непредсказуемой надежностью" — это ваш тезис, который вы все время пытаетесь мне приписать. Надежность модели что в 99.99%, что в 100% не гарантирует 100% покрытия моделью всех условий, в моем примере, ветровой нагрузки, которая может оказаться полностью несоответствующей модели (техники смежной конторы плохо ее промеряли на этапе подготовки документации).
J>> Построение модели что в инженерном деле, что в программировании, увы, но выходит за рамки математики K>Программистам повезло — для них тут ситуация лучше, чем в среднем по инженерным деятельностям.
это вы просто приборы не программировали, когда математически верный и безупречный автомат приводит к зависанию прибора, потому что спецы не сказали что переход из состояния 1 в состояние 3 быстрее чем за 1 секунду приводит к зависанию прибора. А они не сказали потому что забыли, т.к. в реальной жизни ручки перевода из состояния 1 в состояние 3 находятся далеко друг от друга и у них быстрее чем за 1 секунду перевести из одного состояния в другое все равно не получается.
Здравствуйте, jhfrek, Вы писали:
J>нет, вы просто не понимаете шуток
В том-то и дело, что понимаю. А вы, видимо, недостаточно хорошо понимаете, как много говорят о вас ваши шутки.
J>"бросить все и делать мосты с непредсказуемой надежностью" — это ваш тезис, который вы все время пытаетесь мне приписать.
Он не высказан, но, видимо, подразумевается. Иначе не понятно, в чем суть вашего возражения.
J>Надежность модели что в 99.99%, что в 100% не гарантирует 100% покрытия моделью всех условий, в моем примере, ветровой нагрузки, которая может оказаться полностью несоответствующей модели (техники смежной конторы плохо ее промеряли на этапе подготовки документации).
Это мы уже обсудили. Мне сюда мой предыдущий ответ копипастить, надеюсь, необязательно? 100% мы не гарантируем, и? Какой вывод вы из этого делаете?
J>когда математически верный и безупречный автомат приводит к зависанию прибора, потому что спецы не сказали
Ну, еще раз спрошу: и? Какой вывод-то? Не нужно писать "безупречные автоматы"?
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Klapaucius, Вы писали:
J>>нет, вы просто не понимаете шуток K>В том-то и дело, что понимаю. А вы, видимо, недостаточно хорошо понимаете, как много говорят о вас ваши шутки.
скорее они говорят о фантазиях оппонента
J>>"бросить все и делать мосты с непредсказуемой надежностью" — это ваш тезис, который вы все время пытаетесь мне приписать. K>Он не высказан, но, видимо, подразумевается. Иначе не понятно, в чем суть вашего возражения.
я ее вам уже несколько раз написал
J>>Надежность модели что в 99.99%, что в 100% не гарантирует 100% покрытия моделью всех условий, в моем примере, ветровой нагрузки, которая может оказаться полностью несоответствующей модели (техники смежной конторы плохо ее промеряли на этапе подготовки документации). K>Это мы уже обсудили. Мне сюда мой предыдущий ответ копипастить, надеюсь, необязательно? 100% мы не гарантируем, и? Какой вывод вы из этого делаете?
что ваш исходные тезисы про мосты, программистов и веру в математику не верны
J>>когда математически верный и безупречный автомат приводит к зависанию прибора, потому что спецы не сказали K>Ну, еще раз спрошу: и? Какой вывод-то? Не нужно писать "безупречные автоматы"?
снова вы фантазируете... Писать нужно, но от ошибок в построении модели они не застрахуют. Поэтому если программисты "поверят" в математику и начнут ее постоянно применять (кстати, еще один неверный тезис, про то что не верят и не применяют), программы по прежнему будут содержать ошибки.
нет такой сущности, есть две сущности: активный опрос + синхронайзер
вообще, уже на коде который ты привел "пунктирно" видно появление тех сущностей, про которые я говорил ранее
DG> структурный кэш + синхронайзер (в данном случае, каждый раз по месту) + целевое состояние (тоже по месту)
основную проблему я вижу в том, что не смотря на то, что сущности: активный опрос, синхронайзер, целевое состояние в коде присутствуют — они не стандартизованы (не оформлены в виде готового кода), что приводит к низкому значению показателя "повторная используемость кода".
в виде класса выражен только структурный кэш: lazymaker
Здравствуйте, DarkGray, Вы писали:
DG>вообще, уже на коде который ты привел "пунктирно" видно появление тех сущностей, про которые я говорил ранее
Значит, у нас спор о терминах, т.е. ни о чем.
DG>основную проблему я вижу в том, что не смотря на то, что сущности: активный опрос, синхронайзер, целевое состояние в коде присутствуют — они не стандартизованы (не оформлены в виде готового кода), что приводит к низкому значению показателя "повторная используемость кода". DG>в виде класса выражен только структурный кэш: lazymaker
Синхронайзер это логически само действие и есть, соответственно в общем случае стандартизирован быть не может, т.к. действия могут не иметь между собой ничего общего. Активный опрос появляется только в случае анимации и и так содержит очень небольшое количество строчек кода. Хотя в принципе занимайся я задачами анимации может и придумал бы как его стандартизировать, но я такими задачами не занимаюсь.
DG>а разве это косвенно не означает, что твой подход трудозатратный? раз ты не можешь за короткое время выдать код под достаточно небольшую задачку.
Во-первых, что-то мне подсказывает, что в гугле эту небольшую задачу решали полгода, а затем еще полгода отлаживали.
Во-вторых, я даже за деньги никогда не делаю ничего бессмысленного. Ты же мне предлагаешь сделать бессмысленную работу за бесплатно.
В-третьих, если тебе нужен рабочий код строящий логику на LazyMaker'ах, то могу скинуть VirtualGridSynchronizer. Как раз недавно логику его работу на LazyMaker'ы переписал. Но рабочего примера использования GridSynchronizer'а скинуть не смогу, могу лишь скинуть код из рабочего проекта.
DG>в твоем текущем коде я не вижу как разрешаются конфликты: DG>что анимаций может быть несколько одновременно, DG>что анимация может затрагивать закладки, которые уже удалены,
Тут в первую очередь сложность логическая, т.е. нужно понять, что мы вообще хотим и что должен видеть пользователь. Мне эту логическую сложность разрешать неинтересно, т.к. проблемы анимации при операциях над закладками меня волнуют в последнюю очередь.
Здравствуйте, jhfrek, Вы писали:
J>скорее они говорят о фантазиях оппонента
И ваши ответы в этом треде (полностью пока что подтверждающие мои догадки) тоже я нафантазировал?
J>я ее вам уже несколько раз написал
Вы написали, что 100% надежную программу написать нельзя из-за ее взаимодействия с не надежной на 100% средой. Допустим, и что дальше? Какой вывод-то из этого следует или дальше думать нельзя?
За надежность бороться не нужно? Если не 100 то все рвано уже 0,01 или 99,99, aut Caesar, aut nihil, так? Или нет?
J>что ваш исходные тезисы про мосты, программистов и веру в математику не верны
В чем они не верны? Конструкции инженеров 19-го века редко ломались? После того, как они подтянули теорию, конструкции не стали надежнее?
J>снова вы фантазируете... Писать нужно, но от ошибок в построении модели они не застрахуют. Поэтому если программисты "поверят" в математику и начнут ее постоянно применять (кстати, еще один неверный тезис, про то что не верят и не применяют)
Конечно не применяют! Ну, может вы исключение. Вы, может быть, завершимость кода, который пишите, проверяете? Программы из спецификации выводите? Корректность каждого шага, при этом, по индукции доказываете? Многие программисты не понимают даже зачем типизация нужна.
J> программы по прежнему будут содержать ошибки.
Вопрос в том, насколько много этих ошибок будет. И как дорого обойдется их выявление и устранение.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, igna, Вы писали:
I>Не, ну я ж профи. Проблемы-то повторяются, во многих случаях я их репродуцировать могу.
И что? Проблемы с зависанием при звонках в смешанных 3G/2G сетях, характерные для HTC HD2, проявлялись минимум ещё для двух моделей других производителей и с другими платформами. Общая черта у них — один и тот же чип GSM. Исходя из этого, я делаю вывод о том, что чип тупо не соответствовал собственной спецификации. Ну и, конечно же, о том, что глав QA отделов у HTC и Нокии можно смело увольнять за служебное несоответствие.
Так что в современном смарте может глючить всё, что угодно — но выглядеть это будет всегда именно как программная ошибка. Просто у тебя нет способа общаться напрямую с железкой, а только через слои приложение/ос/драйвер.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, HrorH, Вы писали: HH>То, что сложность задачи, которую может охватить человек, ограничена, почему-то не так мешает в других областях. Тут уже писали про инженера.
В основном это не мешает в тех областях, где удаётся обеспечить внятную изоляцию между компонентами решения. Именно благодаря этому поломка лампочки подсветки в салоне авто не приводит к отказу двигателя или тормозной системы. При этом неработоспособные инженерные решения выдаются на рынок постоянно — просто масштабы последствий несопоставимы. Ну будет у вас в автомобиле иногда залипать правый дворник в не до конца опущенном положении — ну и что? Эту ошибку инженеров способен заметить только очень опытный пользователь.
В современных программных решениях никакой изоляции нету — основы проектировались во времена дефицита ресурсов. Примером отказоустойчивой архитектуры с хорошей изоляцией компонентов является Эрланг — и вот решения на нём как раз выглядят такими же безошибочными, как самолёты, дома, или автомобили.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Skynin, Вы писали:
S>Не могут, потому что таких моделей нет. Как там, в "Фактах и заблуждениях ..." S>Бухгалтерские программы пишутся с 70ых годов, но поверьте, что в этот момент, когда вы читаете эти сроки пишутся новые, и с 10ок их уже близки к провалу.
Не могу с вами согласиться. В бухгалтерии как раз мат модели очень простые. Основа для них существует очень давно, и вы не встретите ошибки в бухгалтерских программах, связанные, скажем, с несоответствием оборотов по счетам. Это как раз то место, которое можно формально верифицировать.
Сложности могут быть в несоответствии программы более высокоуровневым требованиям — скажем, налогового законодательства. Там основная проблема не в том, что модель невозможно построить, а в том, что она меняется четыре раза в год.
S>Но вы и складскую программу не спроектируете математике. Вернее — может быть и можно, но выйдет так дорого, причем не избавит от проблем при ее эксплуатации что нет смысла.
Забавно. Но довольно большой пласт математики сформирован именно вокруг и для складских программ. Вся реляционная модель/алгебра/исчисление черпала вдохновение именно там. Для ровно того же разработана вся теория транзакций — а там сплошная математика, почитайте Бернстайна.
Исключительно благодаря теоремам оттуда складская программа ухитряется гарантировать вам согласованность остатков на складе, несмотря на то, что процессы обработки транзакций идут параллельно. Это избавляет вас от большого количества проблем при построении складских программ.
S>Понимаете, те "математики" что мне встречались сплошь говорят о тестировании алгоритмов. Причем простеньких, типа сортировки.
Это вам неправильные математики встречались.
HH>>В этом топике приводили ссылку на доказательтство корректности ядра операционной системы или чего-то такого. S>Пропустил. Но пусть вначале драйвера научаться на корректность тестировать.
И тестируют. Просто понятие "корректности" нужно уметь чётко определять.
S>Так что повторюсь, вы не пожелания и мечты свои — а практику озвучьте.
Практика перед вами ежедневно.
1. Верификатор дотнета миллионы раз в день доказывает, что в заданной программе нет ошибок типизации. Чистая математика.
2. Оптимизаторы запросов в СУБД выполняют трансформации планов запросов для сокращения задействованных ресурсов, сохраняя их семантическую эквивалентность. Чистая математика.
3. Шедулеры транзакций в СУБД обеспечивают сериализуемость сценариев выполнения, обеспечивая гарантию целостности данных. Чистая математика.
4. Механизмы журналирования в СУБД обеспечивают восстановление целостности состояния после сбоев. Чистая математика.
5. Оптимизирующие компиляторы — сплошная математика, с теоремами и прочим.
Можно продолжать до бесконечности.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Klapaucius, Вы писали:
K> То, что в математику верить не надо — она и так работает — до "практика" не доходит.
Что значит: "в математику верить не надо — она и так работает"? В каком смысле "работает"? Может уже доказали гипотезу Коллатца? Или есть формула получения простого числа по его номеру?
Или может вы мне сможете объяснить "на пальцах" почему в математике, которая "работает" Дзета-функция Римана даёт минус одну двенадцатую для суммы чисел от одного до бесконечности:
Здравствуйте, B0FEE664, Вы писали:
BFE>Что значит: "в математику верить не надо — она и так работает"? В каком смысле "работает"?
Работает в том смысле, что математический инструментарий успешно применяется практиками и дает воспроизводимый хороший результат. Практикам этого вполне достаточно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, igna, Вы писали:
В>>Золотые слова. Работа программиста сравнима с работой инженера проектирующего самолет, но при этом обладает таким вреднейшим качеством, как кажущаяся легкость модификации уже сделанного.
I>Совершенно согласен, хотя никак не могу понять, почему же математики не производят аналогичного говнища, несмотря на то, что "легкость модификации" результатов их труда вполне сопоставима.
У математиков нет предметной области, представление о которой обычно не совсем полное или не совсем точное.
Инженеры, проектирующие самолет, с завидной регулярностью потом патчи делают для них. Просто про патчи в программах вы в курсе, а про замены всех каких-нибудь гаек в механизме управления стабилизатором — нет.
Здравствуйте, Sinclair, Вы писали:
S>>Так что повторюсь, вы не пожелания и мечты свои — а практику озвучьте. S>Практика перед вами ежедневно. S>1. Верификатор дотнета миллионы раз в день доказывает, что в заданной программе нет ошибок типизации. Чистая математика. S>2. Оптимизаторы запросов в СУБД выполняют трансформации планов запросов для сокращения задействованных ресурсов, сохраняя их семантическую эквивалентность. Чистая математика. S>3. Шедулеры транзакций в СУБД обеспечивают сериализуемость сценариев выполнения, обеспечивая гарантию целостности данных. Чистая математика. S>4. Механизмы журналирования в СУБД обеспечивают восстановление целостности состояния после сбоев. Чистая математика. S>5. Оптимизирующие компиляторы — сплошная математика, с теоремами и прочим. S>Можно продолжать до бесконечности.
А нельзя ли чтонть такое, что было бы практически применимо? А то всё это примеры, как программы решают проблемы программистов, созданные самими же программистами. СУБД, даже если с шедулерами и верификацией типов в налоговую инспекцию не сдашь, да и управлять ракетой тоже не поставишь.
S>А нельзя ли чтонть такое, что было бы практически применимо? А то всё это примеры, как программы решают проблемы программистов, созданные самими же программистами. СУБД, даже если с шедулерами и верификацией типов в налоговую инспекцию не сдашь, да и управлять ракетой тоже не поставишь.
Простите, но я не могу вам ничем помочь. В налоговую вы сдаёте отчёт, подписанный цифровой подписью, основанной на вполне себе конкретной математике. При подготовке этого отчёта вы пользовались СУБД, построенной на основе работ Кодда, Дейта, Бернстайна и прочих.
Если вы не видите в этом математики, то проблема не в математике. Проблема лично в вас.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>>А нельзя ли чтонть такое, что было бы практически применимо? А то всё это примеры, как программы решают проблемы программистов, созданные самими же программистами. СУБД, даже если с шедулерами и верификацией типов в налоговую инспекцию не сдашь, да и управлять ракетой тоже не поставишь.
S>Простите, но я не могу вам ничем помочь. В налоговую вы сдаёте отчёт, подписанный цифровой подписью, основанной на вполне себе конкретной математике. При подготовке этого отчёта вы пользовались СУБД, построенной на основе работ Кодда, Дейта, Бернстайна и прочих.
СУБД — это задача, которую программисты сами себе поставили (точно, сделав нужные определения сами) и сами решили.
Такая же картина наблюдается в математике — математики решили, что неплохо бы сделать цифровую подпись, выписали полный и точный список требований, решили задачу, и доказали, что решение правильно.
В реальном мире определить задачу — первая и главная трудность. Обычно невозможно точно определить явления реального мира, всякую турбулентность или действия законодателя, так, чтобы определения можно было бы практически использовать.
Соответственно, после того, как доказали, что алгоритм точно решает поставленную задачу, в случае с СУБД проблемы по определению закончились, а в случае с чем-то практически применимым через какое-то время оказывается, что реальный мир не соответствует спецификации.
DG>>насколько я помню, для не ECC-памяти — это оценивается как три случая в год при непрерывной работе устройства.
S>оценка должна зависеть от объема и физического размера памяти.
согласен.
я эту оценку встречал несколько лет назад, и тогда, на вскидку, шла речь о кол-ве памяти в районе 1-4 гб и размером с 1-2 стандартных планки dimm
ps
еще, конечно, зависит от того, как именно защищен компьютер от космического излучения (в ДЦ на глубине 1км под землей — кол-во сбоев упадет на несколько порядков)
S>СУБД — это задача, которую программисты сами себе поставили (точно, сделав нужные определения сами) и сами решили. S>Такая же картина наблюдается в математике — математики решили, что неплохо бы сделать цифровую подпись, выписали полный и точный список требований, решили задачу, и доказали, что решение правильно.
Ничего подобного. Всё наоборот — это налоговая поставила задачу "идентифицировать авторство цифрового документа", математики в ответ придумали цифровую подпись.
Из реальной жизни взялась задача складского учёта — в ответ на неё придумали реляционные СУБД и теорию транзакций.
Неважно, что этих матаппаратов недостаточно для решения вашей "задачи реального мира". Важно то, что они для вас необходимы.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Из реальной жизни взялась задача складского учёта — в ответ на неё придумали реляционные СУБД и теорию транзакций.
Разговор был вот об этом
1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись.
2) Не учитываются свойства системы, о которых надо помнить при проектировании каждой операции (например, это могут быть такие свойства, как безопасность, одновременный доступ к ресурсам, блокировки, какие-то инварианты предметной области)
3) Не осуществляется полный анализ всех возможных вариантов. Такой анализ вообще возможен только в случае, когда у нас есть нечто хотя бы напоминающее абстрактную* математическую модель.
В случае теории транзакций,
1. Математическую модель формирует программист — какая сказано, такая и будет. Какие теоремы захотят доказать, такие докажут, а про остальные скажут "не нужно". Сами себе поставили задачу, сами и решили.
2. В теории транзакций есть полный и точный список свойств системы, поскольку систему описывали сами программисты.
3. Математическая модель есть — составить модель чего-то, что сами же и придумали, гораздо проще, чем составить модель физического склада с учетом пьянства грузчиков и воровства охраны.
Все эти примеры — оптимизирующий компилятор, реляционная СУБД, или теория транзакций, объединяет то, что нет внешнего заказчика или нет внешней проверки. Если в задании сказано "атомарность транзакций это то-то и это-то", атомарность становится тем, что сказано — "по определению". Поэтому в области программирования можно ставить себе задачи с удобными математическими моделями и "культурно" решать их. В реальном мире такое не работает. Можно, конечно, сказать "сопротивлением воздуха пренебрегаем", но воздух от этого не исчезает.
Здравствуйте, Klapaucius, Вы писали:
K>Ну, еще раз спрошу: и? Какой вывод-то? Не нужно писать "безупречные автоматы"?
Вывод такой, что на практике автоматы уже стали более безупречными, чем постановка задачи. Грубо говоря, если есть спецификация и по ней точно закодить, то через какое-то короткое время тестирования окажется, что в спецификации больше ошибок, и они дороже, чем в кодеже.
Здравствуйте, Sharowarsheg, Вы писали:
S>Если в задании сказано "атомарность транзакций это то-то и это-то", атомарность становится тем, что сказано — "по определению". Поэтому в области программирования можно ставить себе задачи с удобными математическими моделями и "культурно" решать их. В реальном мире такое не работает. Можно, конечно, сказать "сопротивлением воздуха пренебрегаем", но воздух от этого не исчезает.
Я вас продолжаю непонимать. Я вижу реальные программы складского учёта. Посмотрите, к примеру, на tpc-c. Вас беспокоит то, что там нет моделирования пьянства грузчиков?
Ну так эта задача никогда и не ставилась. Зато вот задача обеспечения целостности — ставилась. И именно для её решения были придуманы все эти шедулеры, оптимизаторы запросов, и прочая математика. А вы сейчас пытаетесь сделать вид, будто в складских программах ничего этого нет.
Ну так вот 90% складской программы работает за счёт как раз этой математики. Именно там — хардкор и основная работа. А всё, что вам кажется бессистемной программой — это тонкая плёночка, намазанная на хорошо обоснованный аппарат.
Вы можете сколько угодно говорить, что не видите роли воздуха в вашей повседневной деятельности. Тем не менее, вы им дышите.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
S>Все эти примеры — оптимизирующий компилятор, реляционная СУБД, или теория транзакций, объединяет то, что нет внешнего заказчика или нет внешней проверки.
про компилятор настолько просто, что даже ты поймешь
берем два компилятора, один не оптимизирующий, другой оптимизирующий, с кучей сложностей внутри
компилируем ими одну программу, скажем, архиватор -- получаем два бинарника (ну или экзешника, если под виндой)
запускаем на одинаковых входных данных -- получаем одинаковые результаты, но с разной скоростью
и где ты тут видишь "нет внешнего заказчика или нет внешней проверки"?
внешний заказчик -- юзер архиватора, внешняя проверка -- скорость архивации
Здравствуйте, m e, Вы писали:
ME>компилируем ими одну программу, скажем, архиватор -- получаем два бинарника (ну или экзешника, если под виндой) ME>запускаем на одинаковых входных данных -- получаем одинаковые результаты, но с разной скоростью ME>и где ты тут видишь "нет внешнего заказчика или нет внешней проверки"? ME>внешний заказчик -- юзер архиватора, внешняя проверка -- скорость архивации
2012 год. Не вижу пользователей архиватора, по большому счету.
Здравствуйте, HrorH, Вы писали:
HH> А что если предположить, что баг не должно быть вообще? Почему человек не может думать без ошибок? В чем причина ошибок?
В чрезвычайной сложности программ по сравнению с любыми другими изделиями. Программа среднего размера легко может содержать миллион запчастей, в отличии от большинства других технических изделий.
HH> 1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись. HH> 2) Не учитываются свойства системы, о которых надо помнить при проектировании каждой операции (например, это могут быть такие свойства, как безопасность, одновременный доступ к ресурсам, блокировки, какие-то инварианты предметной области) HH> 3) Не осуществляется полный анализ всех возможных вариантов. Такой анализ вообще возможен только в случае, когда у нас есть нечто хотя бы напоминающее абстрактную* математическую модель, в противном случае количество вариантов будет слишком большим для такого анализа. Например, нужен анализ всех вариантов одновременных операций при доступе нескольких пользователей к иерархии ресурсов.
Если все это проделывать, то ошибки будут в вашей математической модели, в формальном описании свойств системы в полном анализе всех возможных вариантов.
Здравствуйте, Васильич, Вы писали:
В>Золотые слова. Работа программиста сравнима с работой инженера проектирующего самолет, но при этом обладает таким вреднейшим качеством, как кажущаяся легкость модификации уже сделанного.
В самолете, я думаю, меньше запчастей, чем в среднего размера программе
Здравствуйте, Sinclair, Вы писали:
S>>Так что повторюсь, вы не пожелания и мечты свои — а практику озвучьте. S>Практика перед вами ежедневно.
Т.е. в задачах, для которых есть хорошие математические модели, программисты эти математические модели активно используют. В задачах где хорошую математические модели создать не получается программисты обходятся без математики. Так в чем претензии топикстартера к программистам?
Здравствуйте, m e, Вы писали:
S>>2012 год. Не вижу пользователей архиватора, по большому счету.
ME>инсталлеры программ обычно держат программу запакованной, и распаковывают; кроме того, бывает саму программу жмут тулзой типа upx ME>тебе, как шароварщику, хоть это должно быть известно
Ну то есть как и следовало ожидать, программисты пользуются архиваторами. Распаковка обычно раз в десять быстрее, кстати сказать. И в любом случае, распаковка должна быть всего-навсего быстрее максимум десятимегабитного канала передачи, в который обычно всё упирается в дистрибутивах.
Здравствуйте, Undying, Вы писали:
U>Т.е. в задачах, для которых есть хорошие математические модели, программисты эти математические модели активно используют. В задачах где хорошую математические модели создать не получается программисты обходятся без математики. Так в чем претензии топикстартера к программистам?
Не стоит рассматривать этот топик как претензии к программистам.
Идея была в том, что человек может не совершать многие или все ошибки, если проанализирует свое мышление, и поймет, какие шаги были пропущены. Именно пропущенные шаги — это и есть наиболее частые причины ошибок.
Модель, в той или иной степени математическая (от 0 до 100%), предлагалась как одно из средств для того, чтобы найти эти пропущенные шаги.
Под математикой понимались не только различные математические области, от теории категорий до теории множеств (и меньше всего мат.анализ), но и разные виды математических и псевдо-математических нотаций, которые может придумать любой человек.
Кроме того, я считаю, что программист, который знает математику хорошо, может придумывать математические модели сам, и они будут тем более строгие математически, чем лучше он знает математику. Но строгость модели — это не самоцель.
Вообщем, если Вас смущает* слово математика, для начала считайте что его не было, так будет понятнее. A уже потом, когда станет понятно, можно степень математичности постепенно повышать от нуля и до 100%.
*смущает — здесь: вызывает протест, чувство вины, желание набить морду и другое.
Здравствуйте, Pzz, Вы писали:
Pzz>В самолете, я думаю, меньше запчастей, чем в среднего размера программе
Конечно нет. Не меньше. Поскольку в "запчасти" самолета входит несколько программ среднего размера.
Есть две причины низкой надежности софта по сравнению с самолетами:
1. Программы отличаются друг от друга сильнее чем самолеты. Возьмите конструктора самолета и поставьте ему год срока для создания автомобиля. Либо не уложится, либо автомобиль будет с багами.
2. Цена надежности. Ошибка в софте обычно обходится дешевле чем в самолете. Поэтому на искоренение багов тратится меньше ресурсов.
В принципе, писать программы на уровне самолетов вполне можно. Для космоса так и делают. Почитайте про программистов NASA, там своя специфика, но стоимость строчки кода получается абсолютно неподъемная для бизнеса ориентированного на широкого клиента.
Здравствуйте, Ziaw, Вы писали:
Z>В принципе, писать программы на уровне самолетов вполне можно. Для космоса так и делают. Почитайте про программистов NASA, там своя специфика, но
стоимость строчки кода получается абсолютно неподъемная для бизнеса ориентированного на широкого клиента.
злобный язык АДА — шаг влево, шаг вправо — расстрел через повешенье
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, jhfrek, Вы писали:
J>>злобный язык АДА — шаг влево, шаг вправо — расстрел через повешенье
Z>Да, АДА. Дело там не только в языке, но язык выбран наиболее строгий из самых простых.
HH> 1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись. HH> 2) Не учитываются свойства системы, о которых надо помнить при проектировании каждой операции (например, это могут быть такие свойства, как безопасность, одновременный доступ к ресурсам, блокировки, какие-то инварианты предметной области) HH> 3) Не осуществляется полный анализ всех возможных вариантов. Такой анализ вообще возможен только в случае, когда у нас есть нечто хотя бы напоминающее абстрактную* математическую модель, в противном случае количество вариантов будет слишком большим для такого анализа. Например, нужен анализ всех вариантов одновременных операций при доступе нескольких пользователей к иерархии ресурсов.
После того как я прочел книгу академика Алексея Николаевича Крылова “Мои воспоминания” жаркие споры на профессиональных формах о том, что программисты недостаточно используют математику, что когда космические корабли бороздят программы будут записываться как доказательства теорем и т.д., я невольно вспоминаю большую главу из этой книги под названием “Служба в Военно-морской академии и в Академии наук” (и ее раздел “Значение математики для кораблестроения”). Процитирую оттуда один фрагмент для демонстрации:
Знаменитый английский натуралист лет 70 тому назад сказал: «Математика подобно жернову перемалывает лишь то, что под него засыплют». Вы видели, что в строгой эвклидовой математике эта засыпка состоит из таких аксиом и постулатов, в справедливости которых инженер усомниться не может, а так как лишь эти аксиомы и постулаты «перемалываются» без добавления новых (а если что добавляется, то должно быть точно и ясно указано), то инженер и придает такую веру математическому доказательству. Но здесь необходимо постоянно иметь в виду следующее обстоятельство: когда конкретный вопрос приводится к вопросу математическому, то всегда приходится делать ряд допущений, ибо математика вместе с механикой оперируют над объектами идеальными, лишь более или менее близкими к объектам реальным, к которым инженер будет прилагать полученные математические выводы. Ясно, что сколько бы ни было точно математическое решение, оно не может быть точнее тех приближенных предпосылок, на коих оно основано. Об этом часто забывают, делают вначале какое-нибудь грубое приближенное предположение или допущение, часто даже не оговорив таковое, а затем придают полученной формуле гораздо большее доверие, нежели она заслуживает, и это потому, что ее вывод сложный.
Напомню, что это сказал не программист, а человек, занимавшийся кораблестроением – отраслью много более наукоемкой, чем программирование. И стоимость ошибки в которой много выше, чем в среднем по софтостроению.
Здравствуйте, Mamut, Вы писали:
HH>> 1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись. HH>> 2) Не учитываются свойства системы, о которых надо помнить при проектировании каждой операции (например, это могут быть такие свойства, как безопасность, одновременный доступ к ресурсам, блокировки, какие-то инварианты предметной области) HH>> 3) Не осуществляется полный анализ всех возможных вариантов. Такой анализ вообще возможен только в случае, когда у нас есть нечто хотя бы напоминающее абстрактную* математическую модель, в противном случае количество вариантов будет слишком большим для такого анализа. Например, нужен анализ всех вариантов одновременных операций при доступе нескольких пользователей к иерархии ресурсов.
...
Хозяева Hyatt Regency – нового отеля в Канзас Сити, мечтали, чтобы всё у них было со всякими сопелками и свистелками. Архитектурная фирма, ответственная за дизайн здания, выступила с предложением сделать несколько галерей, которые крепились бы к потолку. Задумка была очень изящной. Вот только её воплощение привело к гибели более ста человек.
Недостаток проекта был прост до смешного:
Один длинный стержень был заменен на два коротких.
...
Здравствуйте, Mamut, Вы писали:
HH>> 1) Не формулируется математическая модель предметной области, не доказываются необходимые теоремы. Возможно не везде это требуется, но в нетривиальных случаях без этого не обойтись. HH>> 2) Не учитываются свойства системы, о которых надо помнить при проектировании каждой операции (например, это могут быть такие свойства, как безопасность, одновременный доступ к ресурсам, блокировки, какие-то инварианты предметной области) HH>> 3) Не осуществляется полный анализ всех возможных вариантов. Такой анализ вообще возможен только в случае, когда у нас есть нечто хотя бы напоминающее абстрактную* математическую модель, в противном случае количество вариантов будет слишком большим для такого анализа. Например, нужен анализ всех вариантов одновременных операций при доступе нескольких пользователей к иерархии ресурсов.
M>Hнайдено тут: http://eao197.blogspot.com/2012/02/progflame_19.html
M>
M>После того как я прочел книгу академика Алексея Николаевича Крылова “Мои воспоминания” жаркие споры на профессиональных формах о том, что программисты недостаточно используют математику, что когда космические корабли бороздят программы будут записываться как доказательства теорем и т.д., я невольно вспоминаю большую главу из этой книги под названием “Служба в Военно-морской академии и в Академии наук” (и ее раздел “Значение математики для кораблестроения”). Процитирую оттуда один фрагмент для демонстрации:
M>
Знаменитый английский натуралист лет 70 тому назад сказал: «Математика подобно жернову перемалывает лишь то, что под него засыплют». Вы видели, что в строгой эвклидовой математике эта засыпка состоит из таких аксиом и постулатов, в справедливости которых инженер усомниться не может, а так как лишь эти аксиомы и постулаты «перемалываются» без добавления новых (а если что добавляется, то должно быть точно и ясно указано), то инженер и придает такую веру математическому доказательству. Но здесь необходимо постоянно иметь в виду следующее обстоятельство: когда конкретный вопрос приводится к вопросу математическому, то всегда приходится делать ряд допущений, ибо математика вместе с механикой оперируют над объектами идеальными, лишь более или менее близкими к объектам реальным, к которым инженер будет прилагать полученные математические выводы. Ясно, что сколько бы ни было точно математическое решение, оно не может быть точнее тех приближенных предпосылок, на коих оно основано. Об этом часто забывают, делают вначале какое-нибудь грубое приближенное предположение или допущение, часто даже не оговорив таковое, а затем придают полученной формуле гораздо большее доверие, нежели она заслуживает, и это потому, что ее вывод сложный.
M>
M>Напомню, что это сказал не программист, а человек, занимавшийся кораблестроением – отраслью много более наукоемкой, чем программирование. И стоимость ошибки в которой много выше, чем в среднем по софтостроению.
Супер! В точку!
Математика фикция — что посеешь, то и пожнешь! Что закладываем, то и получаем на выходе.
Здраствуйте, Капитан Очевидность.
В математическую модель что засовываешь, то и получаешь. Естественно.
Так вот, если в том, что засовываешь, есть противоречия, то математическая модель это покажет.
Формулы начнут не сходиться.
И вот именно так можно отловить НЕКОТОРЫЕ ошибки.
HH>В математическую модель что засовываешь, то и получаешь. Естественно. HH>Так вот, если в том, что засовываешь, есть противоречия, то математическая модель это покажет. HH>Формулы начнут не сходиться. HH>И вот именно так можно отловить НЕКОТОРЫЕ ошибки.
когда конкретный вопрос приводится к вопросу математическому, то всегда приходится делать ряд допущений, ибо математика вместе с механикой оперируют над объектами идеальными, лишь более или менее близкими к объектам реальным, к которым инженер будет прилагать полученные математические выводы.
Какую математическую модель, и какие формулы ни используй, они будут только приближениями реальности.
Здравствуйте, Mamut, Вы писали:
M>Какую математическую модель, и какие формулы ни используй, они будут только приближениями реальности.
Это Капитан Очевидность дубль два.
Только не понятно, с чем Вы спорите, учитывая что в предыдущем моем посте выделено большими буквами, что математическая модель может помочь найти НЕКОТОРЫЕ ошибки.
Кстати, сама формулировка "приближение к реальности" довольно забавна. Это как нечто, что не есть реальность, но находится от реальности на некотором расстоянии. В чем измеряется это расстояние? Впрочем, это уже оффтоп.
Здравствуйте, Klapaucius, Вы писали:
S>>Вывод такой, что на практике автоматы уже стали более безупречными, чем постановка задачи.
K>И что дальше? Выявляются проблемы со спецификацией, которые обходятся дорого — и что с этим делать? Решать? Или не надо?
Ну их и решают, обычно в каждой области своими какими-то способами, но формализация реального мира имеет мало схожего с математическим доказательством теорем.
M>>Какую математическую модель, и какие формулы ни используй, они будут только приближениями реальности.
HH>Это Капитан Очевидность дубль два. HH>Только не понятно, с чем Вы спорите, учитывая что в предыдущем моем посте выделено большими буквами, что математическая модель может помочь найти НЕКОТОРЫЕ ошибки.
Некоторые — это сколько? Одну? Две? 1% от всех ошибок? 2%?
При этом в изначальном топик делалось следующее заявление:
А что если предположить, что баг не должно быть вообще? Почему человек не может думать без ошибок? В чем причина ошибок?
Мне кажется, основная причина в том...
И дальше — список, завязанный на математику.
И вот ВНЕЗАПНО выясняется, что математика не поможет избавиться от ошибок, так как она поволит выявить лишь некоторые из ошибок
IT>>>Наши определения не могу быть тождественны, как не могут быть тождественны целое и его часть. Р>>Как математик, я с тобой не согласен.
IT>Как человек, привыкший пользоваться здравым смыслом, я не могу понять, как по твоей логике мы с тобой можем быть тождественны, находя в тысячах километрах друг от друга
Здравствуйте, Mamut, Вы писали:
M>И вот ВНЕЗАПНО выясняется, что математика не поможет избавиться от ошибок, так как она поволит выявить лишь некоторые из ошибок
Внезапно выясняется, что я вообще-то писал о другом, и если почитать мои пояснения в ветке, то это станет понятно.
А Вы спорите с чем-то, что сами же и придумали.
M>>И вот ВНЕЗАПНО выясняется, что математика не поможет избавиться от ошибок, так как она поволит выявить лишь некоторые из ошибок
HH>Внезапно выясняется, что я вообще-то писал о другом, и если почитать мои пояснения в ветке, то это станет понятно. HH>А Вы спорите с чем-то, что сами же и придумали.
То есть для того, чтобы телепатировать, что у тебя там понаписано, мне надо читать все стопятьсот веток? Извини, не буду.
То есть проблема в том, что люди пытаются спорить, не успев для начала понять, о чем идет речь.
Надо сказать, что мой первый пост был достаточно расплывчатым, потому что я не дал возможности идее отстояться в голове пару лет, чтобы она лучше сформировалась.
В результате каждый увидел в этом посте то, что ему было ближе.
Здравствуйте, Mamut, Вы писали:
M>То есть для того, чтобы телепатировать, что у тебя там понаписано, мне надо читать все стопятьсот веток? Извини, не буду.
Идей несколько.
Первая идея.
Почему все так уверены, что человеку свойственно ошибаться? Потому что это сказал Сенека?
А если он ошибся? Не надо тут меня ловить на противоречии.
Возможность ошибиться и необходимость ошибки это разные вещи.
Что является причиной ошибок в мышлении человека?
Прежде всего само мышление.
Представьте, что Вы создаете программу искуственного интеллекта. И эта программа делает ошибку.
Что Вы начинаете делать? Вы начинаете отлаживать программу, пытаясь понять, где был сделан неверный вывод.
А почему в случае ошибки человека этого не делается? Не ищется этот неверный шаг в рассуждении?
Я здесь пишу эту идею, пока только одну, не с целью, чтобы Вы с ней спорили.
Хотя спор тоже может быть полезен, но мне бы хотелось, чтобы для начала тот кто будет спорить, понял о чем речь.
M>>То есть для того, чтобы телепатировать, что у тебя там понаписано, мне надо читать все стопятьсот веток? Извини, не буду.
HH>Идей несколько. HH>Первая идея. HH>Почему все так уверены, что человеку свойственно ошибаться? Потому что это сказал Сенека?
Потому что это утверждение подтверждается эмпирически.
HH>А если он ошибся? Не надо тут меня ловить на противоречии. HH>Возможность ошибиться и необходимость ошибки это разные вещи.
Из того, что человеку свойственно ошибаться, не следует ни то, что ошибка возможно ни то, что ошибка необходима.
HH>Что является причиной ошибок в мышлении человека? HH>Прежде всего само мышление. HH>Представьте, что Вы создаете программу искуственного интеллекта. И эта программа делает ошибку. HH>Что Вы начинаете делать? Вы начинаете отлаживать программу, пытаясь понять, где был сделан неверный вывод. HH>А почему в случае ошибки человека этого не делается? Не ищется этот неверный шаг в рассуждении?
Почему не ищется? Во всей этой теме ищутся огибки в твоих рассуждениях
Здравствуйте, Mamut, Вы писали:
M>Из того, что человеку свойственно ошибаться, не следует ни то, что ошибка возможно ни то, что ошибка необходима.
Согласен. Т.е. можно принять как рабочую гипотезу, что можно найти методологию, позволяющую не совершать ошибок при разработке программ.
По поводу мат. модели в следующий раз, увы но мне нужно бежать.
M>>Из того, что человеку свойственно ошибаться, не следует ни то, что ошибка возможно ни то, что ошибка необходима. HH>Согласен. Т.е. можно принять как рабочую гипотезу, что можно найти методологию, позволяющую не совершать ошибок при разработке программ.
HH>То есть проблема в том, что люди пытаются спорить, не успев для начала понять, о чем идет речь. HH>Надо сказать, что мой первый пост был достаточно расплывчатым, потому что я не дал возможности идее отстояться в голове пару лет, чтобы она лучше сформировалась. HH>В результате каждый увидел в этом посте то, что ему было ближе.
Ну так это не наша проблема, и не проблема абстрактных людей, а сугубо твоя
Здравствуйте, HrorH, Вы писали:
HH>Почему все так уверены, что человеку свойственно ошибаться? Потому что это сказал Сенека?
потому что не ошибается лишь механизм, работающий по строго детерминированному алгоритму, например, часы — они не ошибаются, они ломаются, т.е. совсем перестают выполнять алгоритм. А начать отставать, потому что им лениво и они хотят поспать, часы не могут. А человек — может.
И улучшить сами себя часы не могут, а человек — может, но он может и ошибиться при улучшении.
Короче, поведение человека не детерминировано, способности человека по оценке внешних условий ограничены, именно поэтому человек, робот, супер-мозг и любой другой механизм, обладающий свободой выбора и взаимодействующий с внешней средой будет ошибаться.
HH>Что является причиной ошибок в мышлении человека? HH>Прежде всего само мышление.
масло-масляное
HH>Представьте, что Вы создаете программу искуственного интеллекта. И эта программа делает ошибку. HH>Что Вы начинаете делать? Вы начинаете отлаживать программу, пытаясь понять, где был сделан неверный вывод. HH>А почему в случае ошибки человека этого не делается? Не ищется этот неверный шаг в рассуждении?
ну это вам лучше знать, почему вы постоянно на одни и те же грабли наступаете Более другие человеки ваше "этое" делают
HH>Я здесь пишу эту идею, пока только одну, не с целью, чтобы Вы с ней спорили.
да мы и не собирались спорить с идеей, шизофренией мы вроде не страдаем, мы с вами спорим
HH>Хотя спор тоже может быть полезен, но мне бы хотелось, чтобы для начала тот кто будет спорить, понял о чем речь.
а еще лучше что бы тот кто пишет идеи с целью что бы понял речь о чем который перешел Йода с язык на нормальный излагать свои мысли
HH>Почему все так уверены, что человеку свойственно ошибаться? Потому что это сказал Сенека?
Не только, квантовая физика вообще утверждает что случайность и неопределенность это
имманентное свойство нашей вселенной. Так что ошибки неизбежны и не только у человека.
Здравствуйте, FR, Вы писали:
FR>Не только, квантовая физика вообще утверждает что случайность и неопределенность это FR>имманентное свойство нашей вселенной. Так что ошибки неизбежны и не только у человека.
Тут наконец-то следует обратить внимание на многозначность слова "ошибка".
Если говорить о метафоре с ИИ, которую я привел выше, то используемое мной значение слова ошибка станет не таким расплывчатым.
Мы говорим, что ИИ ошибся, если из известной ему информации он сделал неверный вывод.
Я предлагаю, по крайней мере ДЛЯ НАЧАЛА, использовать именно это значение.
В качестве противоположной крайности, приведу следующий пример.
Робот, управляемый нашим ИИ, вышел из дому, и тут на него упал метеорит (ну прямо как у Азимова).
Можно сказать, что это была его ошибка. Только вот он не только не имел информации позволяющей избежать этой ошибки, но и (будем считать) не имел никакой возможности получить эту информацию. Так вот, это значение слова ошибка я не использую.
Этот случай здесь описан, чтобы лучше стал понятен смысл слова ошибка, который я предлагаю для начала использовать.
При этом мы сможем перейти в чуть более практическое русло, чем рассуждения о квантовой неопределенности.
J>ну это вам лучше знать, почему вы постоянно на одни и те же грабли наступаете Более другие человеки ваше "этое" делают
Вот. Грабли — ключевое слово.
Я писал не только о себе, но и вообще о том, как программисты пишут программы.
Идея номер два.
Представьте, что Вы пишете какую-то нетривиальную часть программы.
Скажем, ядро Вашей системы, которое должно работать как часы.
Естественно, что Вы захотите все тщательно продумать.
Выделить основные сущности, продумать основные операции, основные сценарии, просчитать все на несколько шагов вперед.
Вполне вероятно, что Вы будете все это переписывать еще десять раз, но дело не в этом.
Вот этот набор основных сущностей и основных операций между ними я и называю МОДЕЛЬЮ.
А будучи сформулированной на языке математики, она становится математической моделью.
Что же мы имеем в реальности. Программисты пишут программу. Тестеры находят ошибку. Эта ошибка свидетельствует о том, что какая-то часть системы была не продумана.
Программист эту ошибку исправляет.
На чем все дело обычно и заканчивается. Никакого анализа обычно не делается, на это просто нет времени.
В результате через некоторое время тестер находит другую, но в чем-то похожую ошибку в другой части системы.
А третью и четвертую ошибку тестеры не находят, потому что их можно найти только с помощью скурпулезного анализа, а воспроизвести их случайно довольно маловероятно. Эти ошибки найдут заказчики, ведь там систему будут использовать тысячи людей.
HH>Тут наконец-то следует обратить внимание на многозначность слова "ошибка". HH>Если говорить о метафоре с ИИ, которую я привел выше, то используемое мной значение слова ошибка станет не таким расплывчатым. HH>Мы говорим, что ИИ ошибся, если из известной ему информации он сделал неверный вывод. HH>Я предлагаю, по крайней мере ДЛЯ НАЧАЛА, использовать именно это значение.
согласен. это хорошее, конструктивное определение.
но в сложной задаче ошибки все равно заложены даже при таком определении понятия "ошибка".
для создания решения сложной задачи используется алгоритм последовательной композиции: решение большей задачи A складывается из решений меньших задач A1-An. Самый широкий класс ошибок при этом, что не учтено какое-то влияние решения задачи Ai на решение задачи Aj, приводящее к сбою в решении Aj (или к сбою и в Ai, и в Aj): например, решение задачи Ai в процессе выполнения может эксклюзивно захватывать инструменты, которые необходимы для решения задачи Aj.
При этом если сложность задачи композиции можно понизить до приемлимой O(n), O(n*log n), O(n^log n), в частности, через поиск субоптимальных решений вместо оптимальных, то сложность задачи отслеживания влияния подрешений друг на друга понизить нельзя.
такая антисиметрия связана с тем, что при поиске решения нам необходимо найти один произвольный вариант из множества всех вариантов (что можно делать даже методом тыка, если доля вариантов приводящая к результату достаточно велика по отношению ко всем вариантам), а при отслеживании влияния подрешений друг на друга необходимо проверить все варианты.
Здравствуйте, HrorH, Вы писали:
HH>Тут наконец-то следует обратить внимание на многозначность слова "ошибка". HH>Если говорить о метафоре с ИИ, которую я привел выше, то используемое мной значение слова ошибка станет не таким расплывчатым. HH>Мы говорим, что ИИ ошибся, если из известной ему информации он сделал неверный вывод. HH>Я предлагаю, по крайней мере ДЛЯ НАЧАЛА, использовать именно это значение.
Я не против, но это не поможет.
Я уже тут давал ссылку на "Пределы доказуемости"
Из неприводимости числа Ω следует, что всеобъемлющей математической теории существовать не может. Бесконечное множество битов Ω составляет бесконечное множество математических фактов (является ли каждый выбранный бит единицей или нулем), которые не могут быть выведены из каких бы то ни было принципов, более простых, чем сама последовательность битов. Значит, сложность математики бесконечна, тогда как любая отдельная теория «всего на свете» характеризуется конечной сложностью и, следовательно, не может охватить все богатство мира математических истин
Очень большая часть реальных задач именно такого "не упрощаемого" типа. Модели в их решении почти бесполезны.
HH>А третью и четвертую ошибку тестеры не находят, потому что их можно найти только с помощью скурпулезного анализа, а воспроизвести их случайно довольно маловероятно.
и это может означать, что скурпулезный анализ требует проверки, например, 10^30 различных вариантов, что является на сегодня нерешаемой задачей.
при поиске ошибок мы имеем дело с NP-задачей, которая нерешаема по определению.
Здравствуйте, HrorH, Вы писали:
HH>Представьте, что Вы пишете какую-то нетривиальную часть программы. HH>Скажем, ядро Вашей системы, которое должно работать как часы. HH>Естественно, что Вы захотите все тщательно продумать. HH>Выделить основные сущности, продумать основные операции, основные сценарии, просчитать все на несколько шагов вперед. HH>Вполне вероятно, что Вы будете все это переписывать еще десять раз, но дело не в этом. HH>Вот этот набор основных сущностей и основных операций между ними я и называю МОДЕЛЬЮ. HH>А будучи сформулированной на языке математики, она становится математической моделью.
Проблема в сложности модели, нет никаких гарантий (а та же невыводимость гарантирует обратное для большого класса задач)
что эта модель будет проще чем решение в виде программы.
FR>Я уже тут давал ссылку на "Пределы доказуемости"
это не достаточное условие. необходимо еще показать, что при решении реальных проблем нельзя обойтись с помощью конечного множества математических фактов.
Здравствуйте, DarkGray, Вы писали:
FR>>Я уже тут давал ссылку на "Пределы доказуемости"
DG>это не достаточное условие. необходимо еще показать, что при решении реальных проблем нельзя обойтись с помощью конечного множества математических фактов.
Такое доказательств практически бесполезно, конечность скажем в всего-то 2^30 (жалкий гигабайт) на практике равнозначна бесконечности.
FR>Такое доказательств практически бесполезно, конечность скажем в всего-то 2^30 (жалкий гигабайт) на практике равнозначна бесконечности.
этот контрдовод не опровергает исходный мой посыл, что необходимо еще показать, что, например, для решения реальных задач недостаточно алгоритмов, правильность которых можно доказать с помощью алгоритмов с вычислительной сложностью меньше 2^30, допустим.
Здравствуйте, igna, Вы писали:
В>>Золотые слова. Работа программиста сравнима с работой инженера проектирующего самолет, но при этом обладает таким вреднейшим качеством, как кажущаяся легкость модификации уже сделанного. I>Совершенно согласен, хотя никак не могу понять, почему же математики не производят аналогичного говнища, несмотря на то, что "легкость модификации" результатов их труда вполне сопоставима.
Ещё как производят когда тоже что-то кодить пытаются. И ты будешь смеятся, это ещё большее говнище чем производит среднестатистический кодер но не математик.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, DarkGray, Вы писали:
DG>этот контрдовод не опровергает исходный мой посыл, что необходимо еще показать, что, например, для решения реальных задач недостаточно алгоритмов, правильность которых можно доказать с помощью алгоритмов с вычислительной сложностью меньше 2^30, допустим.
Это невозможно ни доказать ни показать, понятие "реальные задачи" слишком нечеткое. Если же нам нужно добиться целей топикстартера,
то есть избежать ошибок полностью, то показать мало, нужно полное формальное доказательство, что ни на практике ни в теории
просто невозможно.
Да и сразу чтобы избежать непонимания, для конкретных узких, жестко формализованных задач, все возможно, а местами уже и доказано.
FR>нужно полное формальное доказательство, что ни на практике ни в теории просто невозможно.
тезис о "невозможности в теории" — спорен.
данный тезис верен, только если под формальным доказательством понимать только доказательства ограниченные логикой первого порядка над жестко фиксированными термами. но ведь есть намного более сложные логики...
Здравствуйте, DarkGray, Вы писали:
DG>тезис о "невозможности в теории" — спорен. DG>данный тезис верен, только если под формальным доказательством понимать только доказательства ограниченные логикой первого порядка над жестко фиксированными термами. но ведь есть намного более сложные логики...
Не спорен, в общем виде он уже доказан для математики тем же Чейтином.
Частные "реальные задачи" никакой возможности выделить нет, в виду нечеткости термина.
FR>Не спорен, в общем виде он уже доказан для математики тем же Чейтином.
он доказан для бесконечных задач.
FR>Частные "реальные задачи" никакой возможности выделить нет, в виду нечеткости термина.
реальные задачи можно считать конечными, как по пространству, так и по времени.
зы
возьмем оракула, который для числа N выдает мат. аппарат M, который описывается числом бит N.
мат. аппарат мощности N умеет описывать с помощью N бит некоторое кол-во вариантов V: V(M(N), N).
если при этом кол-во вариантов V растет со скоростью близкой к функции Аккермана (или другого гипероператора), то даже при малых N кол-во вариантов превысит размер вселенной доступной для человека.
FR>>Не спорен, в общем виде он уже доказан для математики тем же Чейтином.
DG>он доказан для бесконечных задач.
Нет, почитай внимательнее те же пределы доказуемости. Там основной вывод что существует бесконечное
множество "невыводимых" математических фактов, при этом сам "факт" (представленный последовательностью
бит) может быть как конечным так и бесконечным.
Если полностью перевести на компьютерный язык, то для решения любой проблемы существует некая минимальная
программа которую упростить уже невозможно, и большинство таких программ будут достаточно большими
и сложными.
Основная цель использования моделей именно упрощение, Чейтин доказывает что невозможно для очень большого
класса задач.
FR>Если полностью перевести на компьютерный язык, то для решения любой проблемы существует некая минимальная FR>программа которую упростить уже невозможно, и большинство таких программ будут достаточно большими FR>и сложными.
можно взять все минимальные программы, которые решают произвольную возможную проблему в конечной части вселенной доступной человеку и закодировать их числами: каждое число обозначает одну минимальную программу. при этом если программа решает те же проблемы, что и другие программы из набора, то она выкидывается.
каждая программа получается простой — это всего лишь число.
и соответственно, из теории (и уж тем более из чейтина) не следует, что в этом наборе программ будет больше, чем, например, 2^30
Здравствуйте, DarkGray, Вы писали:
DG>можно взять все минимальные программы, которые решают произвольную возможную проблему в конечной части вселенной доступной человеку и закодировать их числами: каждое число обозначает одну минимальную программу. при этом если программа решает те же проблемы, что и другие программы из набора, то она выкидывается.
Вообще то у нас нет цели именовать уже готовые решения, у нас цель получить эти решения.
DG>каждая программа получается простой — это всего лишь число.
Ну и как с суперархиватором который хранит в себе все возможные архивы и нумерует их это не будет просто число, это будет
суперархиватор + число что заведомо сложнее пары просто архиватор + архив.
DG>и соответственно, из теории (и уж тем более из чейтина) не следует, что в этом наборе программ будет больше, чем, например, 2^30
И не следует что будет меньше.
Ну и сложность этого набора будет больше чем сумма сложности просто программ.
FR>Если полностью перевести на компьютерный язык, то для решения любой проблемы существует некая минимальная FR>программа которую упростить уже невозможно, и большинство таких программ будут достаточно большими FR>и сложными.
или другими словами человеку нет необходимости решать любую проблему, ему достаточно уметь решать 3 проблемы:
в чем смысл жизни?,
где взять энергию?,
куда бежать из текущей жопы?
и эти три решения, если они известны, описываются с помощью трех чисел: решение 1, решение 2 и решение 3.
я утрирую, конечно, но общий смысл именно такой.
FR>Вообще то у нас нет цели именовать уже готовые решения, у нас цель получить эти решения.
есть две различные задачи:
найти решение,
закодировать найденное решение (представить решение в виде пригодном для восстановления другим индивидуумом, который не знает о данном решении, или более формально: представить решение в виде, которое может восстановить МТ).
сейчас мы говорим о задаче второго вида: допустим, что мы уже знаем как решать все проблемы, стоящие перед человечеством — сколько потребуется бит, чтобы закодировать данное решение.
Здравствуйте, DarkGray, Вы писали:
DG>есть две различные задачи: DG>найти решение, DG>закодировать найденное решение (представить решение в виде пригодном для восстановления другим индивидуумом, который не знает о данном решении, или более формально: представить решение в виде, которое может восстановить МТ).
Из Чейтина вытекает что есть класс задач (очень широкий, практически большинство) для которого моделирование практически равнозначно
кодированию, так как оно ничего ни упрощает.
DG>сейчас мы говорим о задаче второго вида: допустим, что мы уже знаем как решать все проблемы, стоящие перед человечеством — сколько потребуется бит, чтобы закодировать данное решение.
Явно не 32 или там 128, нумерация это чистая уловка считать нужно не только номер, но и длину нумерованной программы тоже.
Здравствуйте, HrorH, Вы писали:
J>>ну это вам лучше знать, почему вы постоянно на одни и те же грабли наступаете Более другие человеки ваше "этое" делают HH>Вот. Грабли — ключевое слово. HH>Я писал не только о себе, но и вообще о том, как программисты пишут программы.
я таки не понял — это самокритика или вы знаете абсолютно всех программистов?
Резкий переход о Сенеки к программистам позволяет мне сделать заключение что я развеял ваши сомнений в истинности высказывания Сенеки, да?
HH>Идея номер два. HH>Представьте, что Вы пишете какую-то нетривиальную часть программы. HH>Скажем, ядро Вашей системы, которое должно работать как часы. HH>Естественно, что Вы захотите все тщательно продумать. HH>Выделить основные сущности, продумать основные операции, основные сценарии, просчитать все на несколько шагов вперед. HH>Вполне вероятно, что Вы будете все это переписывать еще десять раз, но дело не в этом. HH>Вот этот набор основных сущностей и основных операций между ними я и называю МОДЕЛЬЮ.
не, обычно этот набор сущностей и операций называют АТД — абстрактный тип данных, например АТД "вектор" в котором реализованы операции сложения и умножения векторов и операция умножения вектора на скаляр
HH>А будучи сформулированной на языке математики, она становится математической моделью.
что сформулировано на языке математики? Векторная арифметика? Она и без всякого программирования уже давно на нем сформулированна — что бы сложить два вектора надо,.. при сложении векторов получается вектор,.. и т.д.
HH>Что же мы имеем в реальности. Программисты пишут программу. Тестеры находят ошибку. Эта ошибка свидетельствует о том, что какая-то часть системы была не продумана. HH>Программист эту ошибку исправляет. HH>На чем все дело обычно и заканчивается. Никакого анализа обычно не делается, на это просто нет времени. HH>В результате через некоторое время тестер находит другую, но в чем-то похожую ошибку в другой части системы. HH>А третью и четвертую ошибку тестеры не находят, потому что их можно найти только с помощью скурпулезного анализа, а воспроизвести их случайно довольно маловероятно. Эти ошибки найдут заказчики, ведь там систему будут использовать тысячи людей.
если ошибку никто не находит, потому что воспроизвести ее маловероятно, то ошибки нет. (с) начальный курс "Технологии программирования"
если у вас криво построенный цикл разработки, когда программист кое-как исправляет ошибку без анализа (кстати, что это значит? Если функция при определенном сочетании значений переменных выдает 10 вместо 5, то ваш программист вставляет кусок if (сочетание параметров) return 5; ? ), то это ваши персональные грабли, не надо их обобщать.
Давайте упростим задачу. Я, ваш проджект менеджер, ставлю вам задачу написать функцию, которая складывает 2 числа. Напишите ее безошибочный вариант.
Здравствуйте, DarkGray, Вы писали:
DG>и это может означать, что скурпулезный анализ требует проверки, например, 10^30 различных вариантов, что является на сегодня нерешаемой задачей.
DG>при поиске ошибок мы имеем дело с NP-задачей, которая нерешаема по определению.
Увы, на практике это скорее всего означает, что количество вариантов было равно десяти, но протестировать три из них просто не пришло тестеру в голову (т.к. он не знал внутренней логики системы). Зато программист мог бы продумать ВСЕ эти десять возможных вариантов.
На практике, есть части системы, которые наиболее важны, и где наиболее просто сделать ошибку.
Именно эти части обычно содержат очень небольшое количество вариантов.
Тут еще вопрос, как это количество считать, чтобы не плодить несколько вариантов там, где на самом деле вариант только один.
Здравствуйте, DarkGray, Вы писали:
DG>для создания решения сложной задачи используется алгоритм последовательной композиции: решение большей задачи A складывается из решений меньших задач A1-An. Самый широкий класс ошибок при этом, что не учтено какое-то влияние решения задачи Ai на решение задачи Aj, приводящее к сбою в решении Aj (или к сбою и в Ai, и в Aj): например, решение задачи Ai в процессе выполнения может эксклюзивно захватывать инструменты, которые необходимы для решения задачи Aj.
Мне кажется, что пример с захватом инструментов неудачен, т.к. такие вещи должны продумываться чуть ли не в первую очередь.
Более того, мне сходу даже не придумать пример, когда бы подзадачи мешали друг другу, и это не выявлялось бы еще на этапе проектирования.
DG>>для создания решения сложной задачи используется алгоритм последовательной композиции: решение большей задачи A складывается из решений меньших задач A1-An. Самый широкий класс ошибок при этом, что не учтено какое-то влияние решения задачи Ai на решение задачи Aj, приводящее к сбою в решении Aj (или к сбою и в Ai, и в Aj): например, решение задачи Ai в процессе выполнения может эксклюзивно захватывать инструменты, которые необходимы для решения задачи Aj.
HH>Мне кажется, что пример с захватом инструментов неудачен, т.к. такие вещи должны продумываться чуть ли не в первую очередь. HH>Более того, мне сходу даже не придумать пример, когда бы подзадачи мешали друг другу, и это не выявлялось бы еще на этапе проектирования.
у меня создается ощущение, что ты под инструментами понимаешь что-то сложное, а это простые вещи.
инструменты — это память, процессор, именованные сущности, винт, база, сокеты и т.д.
это всё то, что используется при решении, и при этом обладает свойством ограниченности.
как много ты видел кода, который корректно обрабатывает нехватку памяти или нехватку свободного места на диске, и не приводит при этом к порче данных? не считая БД, которая под это специально проектируется
ярким примером того, что в коде редко учитывается влияение подзадач друг на друга — являются DDOC-атаки: повышение нагрузки на подзадачу Ai (например, многократной загрузке главной страницы) приводит к отказу всей задачи A (отказу всего сайта). в данном случае не учитывается, что для обработки всех страниц используются одни и те же инструменты.
FR>Из неприводимости числа Ω следует, что всеобъемлющей математической теории существовать не может. Бесконечное множество битов Ω составляет бесконечное множество математических фактов (является ли каждый выбранный бит единицей или нулем), которые не могут быть выведены из каких бы то ни было принципов, более простых, чем сама последовательность битов. Значит, сложность математики бесконечна, тогда как любая отдельная теория «всего на свете» характеризуется конечной сложностью и, следовательно, не может охватить все богатство мира математических истин
FR>Очень большая часть реальных задач именно такого "не упрощаемого" типа. Модели в их решении почти бесполезны.
Не могу проследить логическую цепочку в Вашем ответе.
Здравствуйте, DarkGray, Вы писали:
DG>у меня создается ощущение, что ты под инструментами понимаешь что-то сложное, а это простые вещи. DG>инструменты — это память, процессор, именованные сущности, винт, база, сокеты и т.д. DG>это всё то, что используется при решении, и при этом обладает свойством ограниченности.
Да, Вы правы. Я имел в виду свои ресурсы, а не ресурсы ОС.
Ваши рассуждения, как мне показалось, касались взаимодействия подмоделей внутри модели, и вдруг такой низкоуровневый пример.
Это слегка сломало мне мозг.
HH>Да, Вы правы. Я имел в виду свои ресурсы, а не ресурсы ОС. HH>Ваши рассуждения, как мне показалось, касались взаимодействия подмоделей внутри модели, и вдруг такой низкоуровневый пример. HH>Это слегка сломало мне мозг.
при чистом построении моделей узким местом становятся такие инструменты, как: операции, понятия и т.д.
возьмем, например, базовую операцию 'разделить':
какая-то подзадача может считать, что результат деления необходимо округлять до целого:
какая-то — что округлять необходимо до машинной точности,
какая-то — что до определенного эпсилона,
какая-то — что округление должно делаться вверх,
другая — вниз,
третья — что до ближайщего,
четвертая — что до ближайщего, но округление ...5 дожно делаться вверх, если предыдущая цифра нечетная, и вниз — если четная,
пятая — что для отрицательных чисел правила округления должны быть такими же, как для положительным,
шестая — что для отрицательных чисел правила округления должны быть зеркальным (относительно 0) отражением правил для положительных чисел,
седьмая — что есть специальные числа: +/- бесконечность, nan и т.д.,
восьмая — что нет специальных чисел
и т.д
и это я взял в качестве примера простую, давно изученную и достаточно однозначную операцию — деление чисел. а можно взять, например, сравнение множеств(коллекций, последовательностей) — там еще все менее однозначно, и вариантов многократно больше.
дальше есть три варианта:
1. все эти нюансы специфицируются для каждой минимальной подзадачи => приводит к комбинаторному взрыву, и невозможности строить сложные модели за разумное время
2. нюансы операции "разделить" жестко однозначно фиксируются для всех подмоделей => модель выхолащивается, и становится применимой только для решения узкого круга задач
3. делается допущение, что подмодели являются устойчивыми к данным нюансам (поведение сильно не меняется, если операцию деления брать чуть другую), и что нюансы операции "разделить" можно брать произвольные => приводит к необходимости отслеживания, как нюансы одной подзадачи (в частности, выбор операции деления) влияет на поведение других подзадач.
HH>Увы, на практике это скорее всего означает, что количество вариантов было равно десяти, но протестировать три из них просто не пришло тестеру в голову (т.к. он не знал внутренней логики системы). Зато программист мог бы продумать ВСЕ эти десять возможных вариантов.
ты сейчас берешь, в качестве примера, какие-то вопиющие ошибки, при этом оставляя за бортом вопрос — а что делать с невопиющими ошибками?
или другими словами: все задачи можно упорядочить по кол-ву тестов, которые необходимо сделать для их тестирования: при этом кол-во тестов будет плавно расти от 1 до 10^(10^(10^10)).
что приводит к вопросам:
1. сколько тестов мы себе можем позволить сделать?
2. что делать с задачами, для которых кол-во необходимых тестов превышает то кол-во, которые мы можем позволить себе сделать?
2.1. если кол-во необходимых тестов превышает то кол-во, которые можно сделать, то нужно ли делать хоть какие-то тесты?
2.1.1. все ли тесты одинаково полезные? или какие-то тесты необходимо делать в первую очередь?
2.1.1.1. все ли ошибки одинаково вредны? или какие-то более вредны, чем другие?
Здравствуйте, DarkGray, Вы писали:
DG>при чистом построении моделей узким местом становятся такие инструменты, как: операции, понятия и т.д.
Вы случайно не о том ли говорите, что когда у нас есть некоторые части программы, для которых нет точного описания, что они делают, то мы обречены на ошибки, связанные с неправильным пониманием их семантики. Если об этом, тогда согласен, если нет, значит не въехал.
DG>возьмем, например, базовую операцию 'разделить':
Дальше поскипано.
Пример с делением не помогает мне понять, что количество вариантов может зависеть от таких мелочей, как реализация деления.
Не очень понятно, почему я не могу пользоваться стандартными функциями округления, которых аж три штуки?
Но если не могу, то мы вспоминаем, что подразумевается под делением в теории групп и делаем соответсвующий интерфейс, и передаем его как аргумент везде где он нужен.
HH>Увы, на практике это скорее всего означает, что количество вариантов было равно десяти, но протестировать три из них просто не пришло тестеру в голову (т.к. он не знал внутренней логики системы). Зато программист мог бы продумать ВСЕ эти десять возможных вариантов.
когда говорят, что для проверки ошибки достаточно было десяти тестов, часто лукавят — уменьшая кол-во вариантов для тестирования за счет знания о том, что ошибка имеет место быть в конкретной функции (а этого знания не было на момент тестирования).
например, если ошибка произошла в функции F_14_x_137_bis у которой десять вариантов поведения, то утверждается при этом, что для выявления ошибки необходимо было сделать всего 10 тестов.
это не так. если программист за день пишет таких функций 20 штук, то значит чтобы выявить эту ошибку (не зная о ее наличии) он должен был выполнить 200 тестов в день, а если эти 20 функций обладают разным кол-вом вариантов поведения (например, равномерно от 1 до 1000), то должен был выполнить 10тыс. тестов, чтобы выявить эту ошибку.
Здравствуйте, DarkGray, Вы писали:
DG>ты сейчас берешь, в качестве примера, какие-то вопиющие ошибки, при этом оставляя за бортом вопрос — а что делать с невопиющими ошибками? DG>или другими словами: все задачи можно упорядочить по кол-ву тестов, которые необходимо сделать для их тестирования: при этом кол-во тестов будет плавно расти от 1 до 10^(10^(10^10)). DG>что приводит к вопросам: DG> 1. сколько тестов мы себе можем позволить сделать? DG> 2. что делать с задачами, для которых кол-во необходимых тестов превышает то кол-во, которые мы можем позволить себе сделать? DG> 2.1. если кол-во необходимых тестов превышает то кол-во, которые можно сделать, то нужно ли делать хоть какие-то тесты? DG> 2.1.1. все ли тесты одинаково полезные? или какие-то тесты необходимо делать в первую очередь? DG> 2.1.1.1. все ли ошибки одинаково вредны? или какие-то более вредны, чем другие?
Я вообще не говорил о тестах.
Модели отлавливают ошибки, которые тесты сами по себе никогда не отловят.
Более вредные ошибки — это ошибки в ядре системы, ошибки в архитектуре.
И именно здесь могут быть полезны модели.
HH>Но если не могу, то мы вспоминаем, что подразумевается под делением в теории групп и делаем соответсвующий интерфейс, и передаем его как аргумент везде где он нужен.
это поднимает два вопроса:
1. что делать с кодом, который корректен только для какого-то подмножества операций деления? как, например, спецфицируется, что данный код корректен только для операции деления, которая округляет до целых чисел, при этом важно, чтобы округление положительных чисел было вниз, а для отрицательных — направление округления неважно?
2. почему операция деления передается как один аргумент? а не как два, три, сто? т.е. ты уже жестко специфицировал, что в данной подзадаче для всех ее подзадач — операция деления всегда одна и та же. и этим ограничил круг решаемым задач.
или другими словами: если две подподзадачи одной подзадачи используют разные спецификации для операции деления, то подзадача в качестве аргументов будет брать одну операцию деления (с ужесточением спецификации), или две операции деления?
для общей модели, каждое использование операции деления необходимо делать как отдельный интерфейс и отдельный аргумент. что и приводит к комбинаторному взрыву
Здравствуйте, DarkGray, Вы писали:
DG>для общей модели, каждое использование операции деления необходимо делать как отдельный интерфейс и отдельный аргумент. что и приводит к комбинаторному взрыву
более того, для каждого процессора (семейства процессоров) придется делать ее отдельным аргументом, ибо то что для одного процессора является делением на маленькое число, для другого будет делением на 0
HH>Я вообще не говорил о тестах. HH>Модели отлавливают ошибки, которые тесты сами по себе никогда не отловят.
сами по себе модели не отлавливают ошибки. ошибки отлавляют доказательства корректности, которые могут содержаться в модели.
при этом кол-во доказательств коррелирует с кол-вом поведения кода примерно так же, как кол-во тестов.
соответственно, в моих тезисах словосочетание "кол-во тестов" можно заменить на "кол-во доказательств корректности модели" и смысл, и описываемые проблемы останутся теми же самыми.
Здравствуйте, HrorH, Вы писали:
HH>Не могу проследить логическую цепочку в Вашем ответе.
Все очень просто математика утверждает что существует бесконечное число неприводимых фактов, то есть фактов которые
нельзя выразить через более простые факты с помощью некоторой модели, их можно только принять за аксиому. То есть
даже в теории моделирование нередко (скорее часто) невозможно в принципе.
Если вернутся к практическому программированию то очень большая часть задач точно также "неприводима" или "немоделируема",
вернее возможно чисто теоретически модель и возможна, но трудозатраты на ее построение и сложность получившийся модели
слишком большие, что делает ее бесполезной, а скорее даже вредной, вместо кода который по сути (с тестами) конструктивное
доказательство на формальном языке, получаем неформальную не проверяемую автоматически мат. модель.
Здравствуйте, DarkGray, Вы писали:
DG>сами по себе модели не отлавливают ошибки. ошибки отлавляют доказательства корректности, которые могут содержаться в модели.
Многие ошибки будут отловлены на этапе продумывания модели, когда еще никаких доказательств нет.
DG>при этом кол-во доказательств коррелирует с кол-вом поведения кода примерно так же, как кол-во тестов.
Мне даже не надо доказывать, что функция f(x) = x не меняет свой аргумент. Но протестировать это я не могу, т.к. количество случаев бесконечно.
Кроме того, для известных математических объектов ничего доказывать не надо, это сделано до нас.
Conal Elliott называет это already payed for.
DG>соответственно, в моих тезисах словосочетание "кол-во тестов" можно заменить на "кол-во доказательств корректности модели" и смысл, и описываемые проблемы останутся теми же самыми.
Тесты и модель это разные вещи. Можно доказать теорему, которая будет справедлива для любых объектов, обладающих определенными свойствами, но протестировать все варианты невозможно.
Вообще Вы правы, что в некоторых случаях количество вариантов будет слишком большим, чтобы можно было создать модель.
Но в таких случаях можно попытаться разбить модель на несколько более простых.
Либо сделать модель более абстрактной, при этом она будет не учитывать каких-то деталей и не будет отлавливать каких-то ошибок, зато сможет отлавливать небольшую, но важную часть ошибок, кототорую не покроешь никакими тестами.
Здравствуйте, FR, Вы писали:
FR>Все очень просто математика утверждает что существует бесконечное число неприводимых фактов, то есть фактов которые FR>нельзя выразить через более простые факты с помощью некоторой модели, их можно только принять за аксиому. То есть FR>даже в теории моделирование нередко (скорее часто) невозможно в принципе.
Не понимаю, каким образом эта теория мешает мне делать модели?
Если есть бесконечное количество каких-то фактов, что мне мешает от них абстрагироваться?
И потом подсчет количества это коварная штука, f(x)=x это один факт, или бесконечность фактов?
FR>Если вернутся к практическому программированию то очень большая часть задач точно также "неприводима" или "немоделируема", FR>вернее возможно чисто теоретически модель и возможна, но трудозатраты на ее построение и сложность получившийся модели FR>слишком большие, что делает ее бесполезной, а скорее даже вредной, вместо кода который по сути (с тестами) конструктивное FR>доказательство на формальном языке, получаем неформальную не проверяемую автоматически мат. модель.
Просто не надо пытаться моделировать все мелкие детали системы, надо сосредоточиться на основном.
Насчет тестов: тесты не отменяют продумывание. А результат продумывания — это как раз то, что я называю моделью.
Здравствуйте, HrorH, Вы писали:
HH>Не понимаю, каким образом эта теория мешает мне делать модели? HH>Если есть бесконечное количество каких-то фактов, что мне мешает от них абстрагироваться? HH>И потом подсчет количества это коварная штука, f(x)=x это один факт, или бесконечность фактов?
Теория не мешает она лишь утверждает что упрощение часто невозможно. А кому нужна модель которая не упрощает.
И даже хуже многие сложные вещи нельзя ни доказать ни опровергнуть, только принять как аксиому.
То есть полная формализация в общем случае невозможна.
FR>>Если вернутся к практическому программированию то очень большая часть задач точно также "неприводима" или "немоделируема", FR>>вернее возможно чисто теоретически модель и возможна, но трудозатраты на ее построение и сложность получившийся модели FR>>слишком большие, что делает ее бесполезной, а скорее даже вредной, вместо кода который по сути (с тестами) конструктивное FR>>доказательство на формальном языке, получаем неформальную не проверяемую автоматически мат. модель.
HH>Просто не надо пытаться моделировать все мелкие детали системы, надо сосредоточиться на основном.
Тогда ошибки все-равно будут.
HH>Насчет тестов: тесты не отменяют продумывание. А результат продумывания — это как раз то, что я называю моделью.
То есть речь не идет о полностью формальных мат. моделях?
Тогда нам не о чем спорить.
Ну и твоих целей такой подход отсюда
Здравствуйте, HrorH, Вы писали:
HH>Мне даже не надо доказывать, что функция f(x) = x не меняет свой аргумент. Но протестировать это я не могу, т.к. количество случаев бесконечно.
ну и напрасно, вы ошибетесь как в простейшем случае с опечаткой — function F(X: double): single; begin Result := X end; в котором вы получите ошибку округления не возможную в мат. модели. Так и в сложном случаев, когда x — это ссылка на класс, не известно что творящий при обращении к экземпляру
Здравствуйте, FR, Вы писали:
FR>Теория не мешает она лишь утверждает что упрощение часто невозможно. А кому нужна модель которая не упрощает. FR>И даже хуже многие сложные вещи нельзя ни доказать ни опровергнуть, только принять как аксиому. FR>То есть полная формализация в общем случае невозможна.
Согласен.
FR>Тогда ошибки все-равно будут.
Да, это конкретное средство не позволяет избавиться от всех ошибок.
FR>То есть речь не идет о полностью формальных мат. моделях?
Речь идет о моделях разной степени формальности (от 0 до 100%).
FR>Тогда нам не о чем спорить.
Согласен. Спорить вообще малоэффективно...
FR>Ну и твоих целей такой подход отсюда
ни как ни решает.
Если посмотреть тот пост, я там как раз спрашиваю, есть ли что-то, чтобы могло бы мне помочь избавиться от ошибок.
Т.е. я пытаюсь двигаться сверху и снизу, от теории (может ли человек не ошибаться) и от практики (исползование моделей, полноты и учета всех аспектов и другое, чего я еще не знаю).
И эти два подхода в идеале должны встретиться в одной точке.