…живые программы?
Широко известный в узких кругах Steve Yegge изволит толковать о программах, не требующих ребута. Де, программа может жить вечно, и останавливать ее не надо. Надо двигатель на ходу перебирать. Сложнее, конечно — кто-то должен рулить, а кто-то в это время под капот лезть — но зато программа живет. А то ведь рестартом мы ее убиваем, бедненькую.
Это я поерничал немножко, конечно. Впрочем, обратитесь к первоисточнику. Там букв много, и статья явно провокационная, но почитать стоит. Феномен самоосознания там затрагивается, да. Собаки с кошками. Микрософт Эксель. Линукс. Прочие самоосознающие зверюшки. (Люди думающие скорее предпочтут пенроузовские “Shadows of the Mind”.)
Опустив всю воду, резюмирую основные моменты:
- …systems must be able to grow without rebooting. A system that can’t grow over time is static, so it really isn’t a system at all; it’s a function. It might be a very complex function with lots of possible inputs and outputs. It might be a very useful function, and it might live for a long time. But functions are always either replaced or subsumed by systems that can grow. And I’ve come to believe, over nearly two decades of thinking about this, that systems that can grow and change without rebooting can live forever.
- …my first argument against rebooting is that in nature it doesn’t happen. Or, more accurately, when it does happen it’s pretty catastrophic. If you don’t like the way a person works, you don’t kill them, fix their DNA, and then regrow them. If you don’t like the way a government works, you don’t shut it down, figure out what’s wrong, and start it back up again. Why, then, do we almost always develop software that way?
- Because most programmers nowadays prefer to build marionettes rather than scary real children, most programming is oriented towards building layer upon layer of hardware. C++ and Java programmers (and I’d be willing to bet, C# programmers) are by default baking every line of code they write into hardware by modeling everything in the type system up front.
Комментарий к первому пункту: bullshit. Функции сложения целых чисел нет необходимости эволюционировать во времени. Зато мы можем построить на ее основе более сложные функции. Функции логического сложения-умножения-отрицания can grow прямо-таки чудесно. Никакого rebooting на самом деле не надо — нет состояния, значит нечего ребутать. Вы когда-нибудь ребутали калькулятор? Да-да, это такая красная кнопочка `C’. А вот теперь представьте, что вы получили некое значение, скажем `5′ в качестве результата. Записали его в книжечку. А красной кнопочки-то у вас и нет. Приходится вычитать из результата пятерку, чтобы вернуться к истокам.
Идем дальше. Rebooting does happen. Every time a man dies. Это позволяет виду эволюционнировать. Иначе бы мы до сих пор ходили бы с жабрами.
BTW, вам приходилось поддерживать плохо написанный проект на протяжении нескольких лет? Этакого монстроидного спрута, которого не ребутали со времен FoxPro, и который хаотично эволюционнировал согласно странным законам индийских программистов? Похоже, Стив предлагает нам именно эту альтернативу.
Третье. Конечно, we build marionnetes. I’d rather say we build machines. Если бы вместо машин мы растили детей, каждого бы пришлось несколько лет учить, только чтобы иметь возможность общаться. И ни о каком DWIM (это ниже в его посте) не было бы и речи.
Сила программиста именно в том, что он играет роль слепой эволюции для своих творений. Неправильно работает процесс — в топку его. Поправим сырцы и перезапустим. В конечном итоге выживет та версия, которая делает то, что от нее требуют.
А то, что мы делаем hardware, а не software — да это тоже хорошо. Программы, которые модифицируют себя на ходу, нужны только в специфических контекстах вроде AI (у которого, кстати, не так уж и много возможных применений). Software doesn’t have to be soft — достаточно возможности его изменить, не останавливая конвейер. Конвейер, который клепает железки, а не саму софтину.
И static type system тут ни при чем. Это форма, а не сам софт. Форма освобождает, как говорят художники. В любой системе должны быть инварианты, иначе это не система, а месиво. Строгая система типов — это M в DWIM. Статическая верификация же позволяет отличить разумную мысль от горячечного бреда.
Впрочем, это все детали, не так ли? Да, несомненно, я придираюсь. Основная мысль Стива — systems must be able to grow without rebooting. True. Для этого необязательно переходить на самомодифицирующиеся программы, отказываться от функций и возвращаться к природе. В комментариях можно встретить Josh’а Staiger’а:
You mention Unix as one of your “close-to-living systems”, but if we look inside Unix we see a lot of rebooting: cd, ls, grep, awk. A million tiny processes springing to life and dying off: each unmodifiable in its lifetime. (probably not a coincidence that if we look inside a human being we see something similar)
The key point is that each one is small (do one thing well), each is intended to have a short lifespan, and each co-operates well with the other.
In fact the greps of the world look conspicuously like our fundamental unit of abstraction: the function…
Exactly. Можно иметь примитивное с точки зрения функционала ядро, которое управляет эволюцией множества мелких программ. Эти программы в общем случае не должны быть частью системы; это множество мелких, независимых функций. (Ведь каноническая Unix-программа — это функция над входным потоком, входными файлами и аргументами командной строки). Поведение таких функций детерминировано; в идеале они не зависят от какого-то глобального состояния; кроме того, их суперпозиция дает возможность строить функции более высоких порядков. (Прослеживаете аналогию с decoupling в ООП?).
Умирают ли программы, не имеющие состояния?
О записи
Вы читаете “…живые программы?,” в блоге Полоса отчуждения
- Опубликовано:
- 02.17.07 / 8пп
- Рубрика:
- философия, архитектура
Комментарии (77)
Оставить комментарий | comments rss [?] | трекбек [?]