?

Log in

No account? Create an account
   Journal    Friends    Archive    Profile    Memories
 

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


Jul. 6th, 2016 10:59 pm Программирование нового поколения

Собираюсь писать коммент 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'а, благодаря которому удалось продать несколько первых партий телефона с камерой, а за счёт этих новых проблем, которые заняли умы потребителей сегодня, спустя довольно много лет внедрения продукта. Задача - не просто придумать идею, а доработать её до такого уровня, чтобы можно было хоть краем глаза увидеть эти новые проблемы.

19 comments - Leave a commentPrevious Entry Share Next Entry

Comments:

From:raindog_2
Date:July 7th, 2016 06:29 am (UTC)
(Link)
А ты знаком с Sapir–Whorf hypothesis ( https://en.wikipedia.org/wiki/Linguistic_relativity )? В последние годы появиось много интересных экспериментальных исследований на эту тему.
From:morfizm
Date:July 7th, 2016 07:03 am (UTC)
(Link)
Не знаком! Спасибо, буду читать.
From:ermouth
Date:July 7th, 2016 06:59 am (UTC)
(Link)
Дима, прости, не могу удержаться ) Позже в более рациональном ключе поразмыслю, сейчас не могу – смешно )

> у всех терминов зачастую есть чёткие определения
> Посмотрим, например, на стул.
> Что-то коричневое.

Я бы уже одним этим закрыл вопрос чётких определений )
From:morfizm
Date:July 7th, 2016 07:02 am (UTC)
(Link)
lol :)

Но ты поразмысли, тема-то интересная и глубокая. Просто мне казалось, что важно понимать, что искать, прежде чем brainstorm'ить конкретные решения, а мы себе немного по-разному представляем направление поиска.
From:morfizm
Date:July 7th, 2016 06:06 pm (UTC)
(Link)
Кстати, ещё одна проблема, о которой имеет смысл подумать, это project manager'ы, sales/marketing и UX designer'ы. С одной стороны, они несут огромную пользу, т.к. без них не получается сделать юзабельный продукт для конечного потребителя, с другой стороны, они создают вред (UX designer'ы в куда меньшей степени, а PM-ы и sales в большей), потому что они придумывают совершенно нелогичные фичи и ограничения, приводящие к говнокоду с хаками, вместо того, чтобы смоделировать что-то чистое и красивое и преподнести это пользователю во всей полноте.

Тут фундаментально аналогичный вопрос: юзабилити решает часть сегодняшних пользовательских проблем (именно поэтому и продаётся!), но хорошие UX концепты меняют долгосрочную картину и тренируют пользователя по-другому работать с софтом, он получает огромную дополнительную пользу long term в обмен на временное неудобство, чтобы переучиться.

Я как программист всегда принимаю решения в пользу более правильной системы, но можно заставить пользователя переучиться. PM-ы всегда перекошены в обратную сторону: они хотят немедленные benefits относительно сегодняшних pain points, пусть даже для этого придётся писать говнокод.

Идеальное решение, скорее всего, на каком-то новом уровне. Какой-то радикально новый подход, который да, требует переучиться, но учёба ОЧЕНЬ проста (короткий learning curve), а результаты восхитительны и говнокода не нужно. Телефонные интерфейсы (hand gestures, tapping, swipes, etc.) как раз подходят в эту категорию. Проверено на детях и на престарелых людях. Они могут освоить планшет за день на куда более высоком уровне, чем PC будут осваивать неделями.

По-моему, нужно искать такие вот решения.
From:morfizm
Date:July 7th, 2016 06:08 pm (UTC)
(Link)
Кстати, ты идеальный человек для того, чтобы что-то придумать в этом направлении, т.к. ты UX дизайнер, PM и sales в одном лице, который при этом ещё и своими руками немедленно имплементирует свои задумки (потому сразу видит, приводит ли новая UX-идея к говнокоду, или же она логична и естественна).
From:gineer
Date:July 7th, 2016 07:26 am (UTC)
(Link)
Вот у товарища подсумировано
http://ailev.livejournal.com/1275143.html
можно начинать оттуда. ;)

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

Покамест, текстовое представление выигрывает за счет того, что в нем проблема обема внимания (те самые пресловутые 7+-2 объекта) купируется за счет привычности -- все мы говорим тексты, все мы читаем тексты,
и за счет легкости свыертки/подстановки -- длинный текст можно представить как короткий, скажешь "война и мир" и понятно о чем речь.
From:morfizm
Date:July 7th, 2016 08:42 am (UTC)
(Link)
Спасибо, посмотрю потом повнимательнее. Пока поверхностный скан показал один red flag: вижу кучу очень детально разжёванных методик (много постов, и аж книга!) без примеров значимых проектов, которые кодил своими руками* используя методики. А ещё - сильный запах Греди Буча и прочего UML-а, это тоже red flag.

*) я имею в виду, за последние 10 лет, современного стиля и масштаба проекты.

Объём внимания - это понятно. На мой взгляд, то, что текст даёт так много обзора, это, отчасти, усложняет. Если я пытаюсь себе представить, что бы было, если бы, скажем, у всех программистов экраны были максимум на 40 строк и 100 колонок без сворачивания в IDE, то, по-моему, качество кода было бы лучше, потому что "путь наименьшего сопротивления" подсказывал бы хорошую модульность.
From:gineer
Date:July 7th, 2016 12:03 pm (UTC)
(Link)
Ну да, товарищ не программист. Да и нигде не позиционирует себя как...
Зато как постановщик задачи -- дай бог такого любому. ;)


\\если бы, скажем, у всех программистов экраны были максимум на 40 строк и 100 колонок без сворачивания в IDE, то, по-моему, качество кода было бы лучше, потому что "путь наименьшего сопротивления" подсказывал бы хорошую модульность.

И что бы нам дала "более лучшая" модульность?

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

Вот и вы сами его демонстрируете -- упоминаю про ЮМЛ и т.п.
From:dennyrolling
Date:July 7th, 2016 07:47 am (UTC)
(Link)
"Стив Джобс [...] за 10 до [...] первого айфона [...] представлял себе мир, в котором планшет заменят бумагу."

Funny you said that, because Apple Newton was cancelled by Steve Jobs about 10 years prior to iPhone debut.
From:morfizm
Date:July 7th, 2016 08:25 am (UTC)
(Link)
Наоборот, это подтверждает наличие vision: попытался ещё х.знает когда, но сопутствующие технологии и рынок был не готов :) пришлось ждать и дорабытывать.
From:dennyrolling
Date:July 7th, 2016 03:39 pm (UTC)
(Link)
попытался, но не он! идея, так сказать, витала в воздухе, айфон просто первый успешный девайс.
From:juan_gandhi
Date:July 7th, 2016 02:57 pm (UTC)
(Link)
Хорошая тема; спасибо.
From:smogendr
Date:July 7th, 2016 03:29 pm (UTC)
(Link)
думаю, чтение журнала http://ailev.livejournal.com поможет обогатить язык для более точной передачи мыслей на эту тему. подробнее встревать не буду, поскольку сам этим языком владею слабо.
From:andreyvo
Date:July 8th, 2016 09:40 am (UTC)
(Link)
Unfortunately, no one can be told what the Matrix is.
From:ermouth
Date:July 8th, 2016 10:37 pm (UTC)
(Link)
... you have _to see_ it for yourself.

Отличная цитата, прямо про это мой пост. Рассказать слишком сложно, проще показать.
From:morfizm
Date:August 15th, 2016 06:29 am (UTC)
(Link)
Спасибо! Это интересно. Может, доберусь до рассказа.