morfizm (morfizm) wrote,
morfizm
morfizm

Программирование нового поколения

Собираюсь писать коммент ermouth'у в его свежем посте (http://ermouth.livejournal.com/675188.html), но подумалось, что, во-первых, мой ответ в коммент может не влезть, а во-вторых, тема-то, в принципе, интересная, почему бы не подумать об этом вместе.

ermouth поднимает важный вопрос. Приведу его копию для затравки.

Прочитал недавно интерактив Алана Кея на HN и наткнулся там на такой вопрос/ответ:

– Do you think we'll ever have a programming language that isn't fully text based and gets closer to a direct mapping of our own thoughts than current systems? If so any ideas what properties this language would have?

–A few years ago I asked another visionary, Marvin Minsky, if he thought that, in the future, we'd do our programming in something other than plain text. He said, "If it's good enough for Aristotle and Plato, it's good enough for me." RIP, Professor.


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

Я считаю, наоборот. Ну, как минимум, это круг, в котором одно двигает другое. Расскажу, как я это вижу, и приведу аргументы. Разумеется, косвенные-отдалённые, потому что доказывать тут ничего невозможно :)

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

Прелесть языка в отличие от произвольной абстракции в том, что:
1. Можно излагать мысли другому человеку, и он будет рисовать в голове такой же узор (вернее: изоморфный!)
2. Язык описывает окружающий мир, т.е. можно строить проекции мира на этот узор в голове, и дальше с ним работать.
3. Более сложные узоры позволяют осмысливать новые, более сложные вещи (без создания дополнительных размерностей).
4. Именно свойства этого пространства и позволяют мыслить. Без языка (и соответствующего пространства возможностей отображения и выражения) не получались бы в голове такие узоры, которые бы обладали свойствами 1, 2, 3.

Одновременно с этими прелестями, есть и ограничивающие эффекты:
5. К сожалению, именно этим мышление и ограничивается: тем пространством возможностей, которое создаётся языком, которым человек владеет. Практически невозможно выпрыгнуть out of the box. Конечно, вы будете спорить, мыслительный процесс не всегда идёт словами, это может быть интуитивное, абстрактное мышление, которое ещё нужно потрудиться, чтобы записать человеческим языком, но давайте возьмём определение языка шире: не набор слов, а набор понятий. Это всё равно конечный набор.
6. К сожалению, "good enough" != "perfect". Если в языке уже есть несколько понятий, способных выразить более сложное понятие, то новое слово для него не вводят. Язык сопротивляется усложнению. Но упрощению через временное усложение (рефакторингу) он тоже сопротивляется. Эти эффекты легко видеть, когда знаешь несколько иностранных языков. Английский язык очень удачен в плане бизнес-деятельности, getting things done. Если я говорю о делах, я стремлюсь использовать его, потому что там понятийный набор несколько сдвинут, таким образом, что нужные понятия для эффективного ведения дел, чёткие, короткие (узкие) и ёмкие. Зато передавать эмоции по-английски чёрт ногу сломит. Здесь русский язык не в пример выразительнее. В узких профессиональных областях всегда есть своя терминология, которая позволяет заменить сложные описания чего-то одним ёмким и точным словом. Именно это и позволяет эффективно думать о проблемах в этой области. Такой вот микро-язык.
7. К сожалению, язык очень размыт и нечёток. Профессиональная терминология решает эту проблему: у всех терминов зачастую есть чёткие определения. Языки программирования (со строгой типизацией, гм-гм :)) решают эту проблему ещё лучше: одно и то же можно чётко понять одним-единственным способом. Но языки программирования не решают множества других проблем с языком. Вернее, решают: именно тем, что появляются новые языки. Привыкание работать с новым языком, несомненно, влияет на мыслительный процесс: оно определяет его ход.

Ну и теперь самое главное, что именно делать язык: описывает окружающую вселенную или создаёт её?
Посмотрим, например, на стул. Что бы это было, если бы не было этого слова? Предмет. Вещь. Единица. Нечто сложное, составленное из прямоугольных брусков. А что если бы не было и этих слов? Что-то коричневое. А если бы не было слова коричневый? А вообще, было ли бы это чем-то отдельным, или же постороннему глазу (не знающему языка), это казалось бы естественной частью формы комнаты? Откуда они знают, что стул и ковёр это отдельные две вещи? Может, в их глазах это одна такая аморфная масса, они просто не привыкли различать? Термины это, в первую очередь, именно различия, дистинкции, набор характеристик (толковаение термина), позволяющих сгруппировать какие-то наблюдаемые элементы в одно множество (и также определяя множество всех возможных множеств такого типа).

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

В общем, вопрос о том, что именно физически существует, тесно связан с вопросом о том, что мы можем наблюдать, что мы можем сравнивать и соотносить на похожесть, и обозначать символично, формируя новое понятие. Оно существует у нас в голове, в том мире, который выстраивается внутри этого понятийного пространства, и мы, для удобства, считаем, что мы говорим про окружающую нас реальность. Но на самом деле эта реальность определена лимитами восприятия, эти лимиты тесно связаны с языком. Чтобы расширить лимиты восприятия, нужны новые инструменты (для восприятия вещей, которые не вписываются в существующий понятийный ряд), а также изобретение новых слов, терминов, или даже новых (удачных!) терминологий и языков. Кстати, я думаю, что даже без новых инструментов, просто новый язык (но более простой, более заточенный под полезные use cases, с более узкими, чёткими терминами и короткими ёмкими фразами) уже может расширить кругозор, т.к. повышение эффективности позволит размышлять над более сложными вещями - меньше параметров надо одновременно удерживать в памяти, чтобы производить мыслительный процесс.

Мы это видим с языками программирования и с инструментами. Расширяется инструментарий, изобретаются новые языки, его использующие, но местами бывают и новые языки, которые более удачно используют уже имеющийся инструментарий. Под инструментарием я понимаю существующие компоненты окружения - cloud services, библиотеки, IDE, debugging tools, документацию. А под языком - понятийную систему, а также конкретный синтаксис, скажем, языка программирования.

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

Но у меня есть такая мысль, что большинство по-настоящему революционных идей - это не такие, которые решают проблемы. Это те, которые создают проблемы. Революционные решения расширяют понятийную систему настолько, что проблемы, которые они, как оказалось, решают, можно сформулировать только на том будущем языке, который появится, когда решение уже есть. Пока решения не было, проблему или не было видно, или... её просто невозможно было сформулировать, невозможно было до неё додуматься. Я уверен, что Стив Джобс ещё лет за 10 до появления первого айфона как-то развил в себе этот новый понятийный ряд и мысленно представлял себе мир, в котором планшет заменят бумагу. Но я также уверен, что если к этому идти итеративно, решая насущные short-term проблемы, то к этому решению не прийти. Например, если взять телефон Nokia и постепенно пытаться делать его более плоским, но большим по размеру, и на каждый миллиметр уменьшения толщины и увеличения размера делать A/B test, вполне возможно, A/B test сыграет в пользу статус кво, и задержит развитие в локальном экстремуме: телефоне-кирпиче Nokia из 90х.

Нужен long term vision, но, как мне кажется, важнейшая часть этого vision это новая терминология. В области языков программирования это новые концепции. Ну теперь вернёмся к насущной проблеме, текстовый редактор. Даже существующие программы все насквозь структурные: их можно мысленно представлять как деревья, графы, цепочки вызовов, контейнеры и т.п., но при этом мы используем изобретение середины прошлого века - текстовый редактор, который некоторый гибрид из поточного представления (цепочка символов), строчного (массив цепочек символов) и двумерного (массив строк, отображённый на экране монитора). Почему так? Потому что мы не можем перепрыгнуть через удобство. Текстовый редактор (в сочетании с клавиатурой) это сильнейший наркотик, потому что в нём многие вещи можно делать ОЧЕНЬ быстро. Поиск и замена, работа с блоками (строчными, прямоугольными, поточными), переключение окон, авто-indent, буфер клавиатуры (ты вводишь не глядя в экран, и, даже если оно притормаживает, оно потом вводится) и т.д. и т.п. Это сложный инструмент, но все существующие программисты на нём научились мастерски работать, а новые вырастают, тренируемые существующими. Но главное - сложно придумать альтернативный инструмент, который хотя бы существующие вещи позволял бы делать с такой же скоростью!

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

Upd.: пример простой насущный пример создания проблем. Вот есть сегодня проблема, что неудобно шарить фотографии с телефона на телефон. В 90-х были фотографии. Были телефоны. Но не было фотокамеры на телефоне. Это простая идея, которая, возможно, решала какие-то насущные по тогдашним меркам проблемы по мелочи (иначе трудно было бы продать самый первый такой телефон), но на длинной дистанции она создала куда больше проблем, чем решила. Она создала новые потребности у людей. У меня не было потребности шарить фотографии в 90-х. У меня не было потребности подключать внешние микрофоны, линзы и гарнитуры. Тогда даже слова шарить не было в обиходе. Новое слово + новый инструментарий = новые потребности и новые проблемы. Мир движется вперёд. При этом основные продажи идут не засчёт того незначительного use-case'а, благодаря которому удалось продать несколько первых партий телефона с камерой, а за счёт этих новых проблем, которые заняли умы потребителей сегодня, спустя довольно много лет внедрения продукта. Задача - не просто придумать идею, а доработать её до такого уровня, чтобы можно было хоть краем глаза увидеть эти новые проблемы.
Tags: 1, ideas, language, software development
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 17 comments