December 1st, 2016

404

смещение точки зрения

В период времени 60-80ые образовательные учреждения начали готовить специалистов с уникальной профессией - оффлайновые программисты. Овладевшие этой специальностью были способны писать программы (включая операционные системы и программы по обработке изображений) используя только печатную литературу, устные коммуникации и личный опыт. Некоторые из них (особенно, программисты 60ых) так за свою жизнь и не нашли ни одного ответа на стековерфлоу.
404

Синонимы

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

Надломился

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

программирование - это такая неряшливая математика

Вот вам интересная мысль.

Что такое бит? Существует ли он?

Программирование (как математика) начинается с допущений:

"Предположим, существует бит, который может принимать значение "истина" и "ноль" и набор операций, применяемых к битам (NOT OR AND ETC)..."

А дальше там чистой воды математика, которая перестаёт думать о реальном мире и зарывается в абстракции, построенные из этих допущений.

В реальный мир программирование вываливается ровно в тот момент, когда приходит инженер и говорит "о, я вот тут из транзисторов и палок скрутил фигулину, которая в первом приближении ведёт себя как этот твой NOT, и можно считать, с некоторыми допущениями, что 0.1В - это ложь, а 0.8В - истина". (по поводу первого приближения: https://en.wikipedia.org/wiki/Latch-up)

Дальше эта абстрактная штука (программирование) периодически вываливается в набор допущений (если я запишу в порт 0x12 значение 0x42, то лампочка зажжётся), которое наиболее грустные из программистов называют "монада IO". Но в местах, которые не касаются этих допущений, мы имеем чистую математику.

Давайте назовём этот объект "TestEnv", и он будет обладать свойством get, которое по имени аргумента возвращает значение или рейзит эксепшен... (и поехало дальше всё это).

Главным, фундаментальным различием этой математики от математики на бумажке является то, что эти логические утверждения никто не проверяет. До определённой степени это может делать интерпретатор/компилятор (например, сказав, что утверждение о том, что TestEnv принимает только имя аргумента и утверждение о том, что TestEnv(arg_name, default_value=None) противоречивы), на каком-то уровне runtime, но финальное утверждение, что данный набор утверждений, лемм, тезисов и т.д. является истинным (то есть решает заданную задачу) совершенно никем не проверенное, и осложняющееся тем, что каждый наш запуск проверяет только частный случай.

Но я не о математическом доказательстве правильности программ. Я о другом. Поскольку программирование - это чистая математика, то все объекты программирования существуют ровно настолько, насколько существуют любые другие математические объекты. Например, совершенно равноправен gevent со своим monkeypatching'ом и, допустим, частичная сумма ряда. Или цепная дробь. Или даже всеми любимый треугольник.

И в тот момент, когда программист решает назвать тип данных или класс в коде 'realm', в этот момент у нас появляется realm, и он настолько же реален, насколько реальна идея о детерминанте матрицы.

Но тут же начинают наблюдаться и различия: детерминант матрицы - хорошо изученная штука, и о его смысле и свойствах согласны все. А realm может оказаться самопротиворечивой конструкцией (например, утверждать, что имеет метод .doit, но вызывать внутри __init__'а метод self.do_it).

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

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

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

Что-то меня на философию сегодня тянет

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

UPD: Главное различие - в рекурсии принято описывать условие для завершения. А у фракталов - нет.

Как будет выглядеть результат работы алогоритма, у которого сложность o(n), при этом есть реурсия, вызывающая себя два раза на o(n/2)?