Эволюционно сложившийся язык мешает вам думать

Поймёт и ребёнок (владеющий китайским языком).

Вы знаете, язык музыкальной нотации сложился в результате многих сотен лет эволюции — именно поэтому он такой стройный и удобный. Там всё понятно, просто в использовании и легко осваивается.

И, например, язык математики сложился в результате многих сотен лет эволюции — именно поэтому он такой стройный и удобный. Там всё точно, логично и всегда понятно.

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

Что? Не легко? Какой язык ни возьми, там куча исключений, странных правил, доставшихся в наследство из предыдущих веков, и нелогичностей?

Хм. Странно. Вроде бы многие сотни лет эволюции и вдруг такое.

Ну ладно. Человеческое тело сложилось в результате миллионов лет эволюции — вот с ним-то всё в порядке. Например, зрительный нерв, приделанный к сетчатке со внешней стороны, в результате чего у людей есть «слепое пятно», — это вообще отлично. Или отросток кишки, называемый «аппендиксом», который может внезапно убить вроде бы совершенно здорового человека. Или, вот, облысение — прекрасная же штука. Или…

Ну ладно, тут тоже похоже на то, что даже миллионы лет эволюции совсем даже не привели к совершенству — в лучшем случае к «ничего так, как-то живём». Однако создавай мы человеческое тело сейчас, наверняка все эти замечательные штуки в него вставлять бы не стали. Да и, например, искусственный язык [TBS_POPOVER placement=»top» title=»Эсперанто ― наиболее распространённый плановый язык, созданный варшавским лингвистом и окулистом Лазарем (Людвиком) Марковичем Заменгофом в 1887 году, после десяти лет работы. К 1878 году его проект «Lingwe uniwersala» был практически завершён. 17 декабря Заменгоф с гимназическими друзьями отпраздновал создание языка. Однако Заменгоф в то время был слишком молод, чтобы опубликовать свою работу.» style=»border: 1px solid #ddd; padding: 3px;»]эсперанто[/TBS_POPOVER] оказывается одновременно последовательнее и гибче, нежели любой естественный язык, хотя у эсперанто эволюция если и была, то шла она не более века.

Это должно подвести нас к мысли, что «эволюционно сложилось» вовсе не синоним «очень хорошо и правильно». И вовсе не означает, что сделанный сознательно вариант, который отбросит бо́льшую часть «эволюционно сложившегося», в обязательном порядке будет хуже эволюционного.

Особенно ярко, на мой взгляд, это проявляется в программировании: там чем дольше «эволюционное» дописывание и модификация вашей программы, тем выше вероятность, что все проблемы этой программы лучше было бы решить выбрасыванием её кода целиком и написанием нового кода — с учётом приобретённого опыта и новейших наработок человечества.

Вдруг с музыкальной нотацией, языком математики и кучей других «эволюционно сложившихся за столетия» вещей будет так же? Вдруг текущие версии не то, что не идеальны, а настолько уже отягощены «legacy-кодом», что выбросить и написать новую версию с условного нуля — давно уже разумное решение?

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

Должен сказать, что разработка софта и тут тоже даёт ответ на данный вопрос. Софт разрабатывают профессионалы, однако от уровня их профессионализма зависит только то, через сколько времени будет нужно выбрасывать «эволюционно написанный» код.

Дело в том, что, когда профессионал создаёт новое, он, по сути, точно так же выдвигает и проверяет гипотезы, как и любитель или вообще случайно встретившийся с темой человек. У профессионала, естественно, есть предыдущий опыт и какие-то познания, поэтому он будет в среднем угадывать лучше, чем те, у кого всего этого нет. И ещё у профессионала есть методы проверки гипотез, о которых посторонний человек может даже не подозревать. Однако тут всё прямо как в «стихийной эволюции»: не поймёшь, пока не сделаешь и опробуешь.

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

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

Если фича была небольшой, после её испытания иногда можно выкинуть её целиком, и попробовать другой вариант, который теперь, после испытаний на практике, уже гораздо более понятен. Однако как быть, если реализация фичи уже отняла десять тысяч человеко-часов и новая версия отнимет лишь самую малость меньше? За чей счёт проводить этот банкет?

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

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

Можно было бы сделать так сразу?

Ну, знал бы, куда упаду, соломку бы подстелил. Сделать-то можно, но откуда это узнать, пока оно не сделано хоть как-то? Мысленное моделирование использования и реальное использование — две большие разницы.

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

Повторить эн раз.

На каком-то разе, очевидно, из костылей и пластилина будет состоять чуть менее чем вся программа. При том, что её всё время делали профессионалы.

Просто они делали её «эволюционно» — другого выхода не было. Но это вовсе не привело к совершенству: это привело к тому, что текущая версия скорее всего лучше, чем самая первая, но, если сейчас всё выкинуть и переписать заново, версия получится несравнимо более удачная.

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

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

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

Одна из таких, например, — чувство, что «текущую версию специалисты уже знают, а новую им всем придётся учить заново». Однако штука тут в том, что обычно некоторые представления о более удачном варианте у основной массы уже есть и есть даже некоторые его намётки — он только лишь пока ещё не реализован целиком и без костылей. Ведь, как говорилось ранее, как раз в процессе использования люди начинают понимать, как можно было бы сделать лучше. А новая версия реализует как раз вот это.

И по этой причине, сколь сильным ни было бы нежелание «учить всё заново с нуля», в реальности изрядное количество фич переписанной версии пользователи встречают словами «ну наконец-то!», а не «о боже мой, тут всё новое — я ничего не понимаю». Фактически, то, что старые, уже освоенные методы в новой версии оказываются где-то на периферии или вообще за бортом, даже в момент перехода компенсируется тем, что они там уже и не нужны — тот же или даже лучший результат достигается гораздо более просто.

Кроме того, кроме специалистов, которые уже знают, есть ещё будущие специалисты. И в далёкой перспективе их будет больше, чем всех предыдущих вместе взятых. Продолжая обучать их использованию эволюционно сложившейся версии костылей, вы тратите их время без какой-либо компенсации. У них ведь нет уже присутствующих умений, которые после перехода окажутся во многом бесполезными, хотя на них ранее было потрачено время. И одновременно с тем более логичная версия — без костылей и «легаси-кода» — обычно требует гораздо меньшего времени на изучение и привыкание.

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

Есть ещё опасение вида «эта версия работает — а вдруг новая не заработает»? Разумеется, может и не заработать. Но ведь для того и есть методы проверки, нет? И вроде как не предполагается, что прямо в момент выпуска эта версия будет «финальной» — «уже давно работающая» ведь, как вы сами сказали, эволюционировала. Наверно и новая тоже будет, нет? Если что-то там вдруг поначалу не заработает, так поправим — как в прошлой поправляли.

Это подводит нас к третьему моменту — уже не столько опасению, сколько соображению. К вопросу: «а зачем?».

Если новая система тоже будет обрастать сначала исправлениями, а потом костылями, то зачем нам новая?

Если старая система хоть как-то работает, то зачем вводить новую, которая, по крайней мере, в переходный период, не исключено, будет работать хуже — как минимум, поскольку к ней ещё не привыкли? Ну и потому, что до начала массового использования вряд ли будут исправлены все недочёты.

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

Но ещё важнее вторая причина: это экономит время и силы. Только теперь уже время и силы тех, кто использует эту систему для получения практических результатов.

И это касается, в том числе, систем записи, вкупе с терминологией.

Может показаться, что система записи — потому и система «записи», что она лишь протоколирует некие мысли, тогда как сами мысли вполне могут быть одними и теми же, независимо от системы.

В сферическом вакууме это, конечно, абсолютно верно — «просто протокол», вот это вот всё. Однако в физической реальности, в отличие от реальности абстрактной, у любого процесса всегда ненулевой коэффициент полезного действия. И если ваша чудо-машина 95% энергии сразу же переводит в нагрев окружающего воздуха, то на полезную работу с неизбежностью будет уходить только 5%.

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

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

Сама идея записывания состоит в том, чтобы разгрузить ваш мозг, которому в ином случае пришлось бы тратить много энергии на удерживание в памяти целой кучи уже известных фактов, промежуточных результатов рассуждений и ранее сделанных выводов. Благодаря ей вам не надо каждый день прокручивать по многу раз в голове всё это, чтобы оно не ушло в ваш мозговой «архив», а то и вообще в никуда.

Однако если система записи такова, что сама по себе требует запоминания огромного количества дополнительных и неочевидных правил, или, что ещё хуже, если она вдобавок постоянно побуждает вас думать, как что-то пишется или читается, даже если вы эти правила уже знаете, то ей сэкономленное она же и потребляет. Причём при наборе «критической массы» костылей и «легаси-кода» она начнёт потреблять больше, чем экономит.

Чтобы это было проще понять, представьте, что в вузе вам преподают физику на китайском языке, который для вас не только не родной, а ещё и не особо вам известный. Лекции на китайском, учебники на китайском и все упражнения тоже на китайском. Скорее всего все пять лет обучения основной вашей проблемой будет обучение китайскому, а вовсе не физика — на неё будет оставаться лишь самая малость времени.

Горькая ирония тут в том, что, несмотря на вроде бы наличие учебников, вы понимаете физику хуже, чем понимали бы без учебников вообще, но зато с устными рассказами на понятном вам языке.

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

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

Приведу некоторое количество примеров — для начала из области IT.

Часто люди думают, будто бы те программы, которые есть сейчас, стало возможно написать исключительно по той причине, что сильно возросло быстродействие компьютеров. И, аналогично, некоторые вещи стало возможно сделать только потому, что компьютеры стали гораздо быстрее, чем были.

И для некоторых вещей это действительно так.

Однако для многих из тех, про которые часто думают, что это так, это не так.

Ряд программ можно было бы написать и использовать даже на компьютерах сорокалетней давности — если рассматривать их чисто как «железо». То есть работали бы они медленнее, однако даже если бы какие-то операции занимали бы минуту вместо микросекунды, это всё равно было бы полезно.

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

Тем, кто знаком с программированием только на примере псевдо-бейсика со школьных уроков информатики, может показаться, будто бы «принципиально ничего не изменилось», однако на самом деле всё изменилось радикально и много раз. Сам по себе этот псевдо-бейсик уже гораздо проще в использовании, чем ассемблер или, тем более, что-то вроде машины Тьюринга, но современные языки программирования в использовании проще и удобнее этого псевдо-бейсика настолько же, насколько он проще и удобнее ассемблера.

Ряд алгоритмов, которые на ассемблере заняли бы многие десятки страниц текста, на современном языке программирования записываются одной строкой, которая, к тому же, гораздо более интуитивным способом читается.

Ну и теперь представьте себе, сколько на старом языке занял бы аналог страницы кода на современном. Сколь тяжело было бы это понять и сколь тяжело было бы это отлаживать.

Страница довольно интуитивного текста против многотомника, в котором вам надо, фактически, дешифровывать каждую строку.

А дальше больше. Человек, осваивая язык, привыкает думать на нём. Соответственно, привыкший к современному языку программирования, думает этими интуитивно понятными и очень ёмкими строками, а привыкший думать на ассемблере — теми строками, которые есть на ассемблере: интуитивными только для задач вида «положить значение из ячейки А в ячейку Б», которых даже для сортировки списка надо написать столько, что в голове это уже не удержишь.

Можно ли при этом рассматривать какой-то современный язык как «эволюционно доработанный ассемблер»? Ну, с тем же успехом вы могли бы рассматривать английский и русский языки как «доработанный санскрит». Да, отдельные отголоски там есть, но в целом знание русского не позволит вам понимать санскрит, а знание санскрита — русский. Даже на том уровне, чтобы объясниться с продавцом в магазине.

Языки программирования, разумеется, заимствовали идеи друг у друга — в том числе, у предшественников. Однако очень часто они заимствовали в основном опыт использования: что в предшественнике было плохо — мы у себя не делаем, а что хорошо — быть может, заимствуем в улучшенном виде.

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

И да, разумеется, программистам приходилось переучиваться с языка на язык. Но в результате стало возможно написать те программы, которые полвека назад показались бы ненаучной фантастикой.

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

Ну, не прям всегда: это всё-таки предельная стадия — когда дальше уже вообще совсем никак. Соскакивать же люди обычно начинают несколько раньше — когда уже достаточно тяжело и вполне понятно, что дальше лучше уже не будет. И постепенно очень популярный десятилетия назад язык уходит куда-то в нишевые области, а то и исчезает из употребления совсем.

Таким образом, оба варианта — законсервировать язык навсегда и не добавлять в него никаких новых удачных идей или добавлять их при помощи всё более и более сложных костылей, чтобы не утратить совместимость с более ранними версиями и не превратить очередную версию в совсем новый язык — ведут к одному и тому же результату: выходу языка из употребления в какой-то момент времени. Поскольку игра уже не стоит свеч: учиться долго, пользоваться языком и думать на этом языке тяжело, а бонусов на фоне новых языков никаких. Кроме, конечно, «этот язык я уже знаю».

Ещё пример.

Хоть это и не сразу очевидно, интерфейс программы — это тоже язык. Он обычно не похож на привычные большинству текстовые языки, однако всем требованиям языка как средства коммуникации он обладает. Кликая по иконкам и нажимая клавиши, вы сообщаете компьютеру, что вы от него хотите, а он, как-то меняя содержимое экрана, сообщает вам о произошедших изменениях. При этом оба два подчиняются однозначным правилам, что является аналогом синтаксиса языка.

Так вот, современные успехи в компьютерной графике связаны не только с ростом мощности процессоров и видеокарт, а ещё и с этим самым «языком-интерфейсом». Точнее сказать, они связаны преимущественно с этим.

Поскольку даже тридцать лет назад вполне можно было собрать суперкомпьютер («супер» — по меркам тех времён, конечно), который был вполне способен отрендерить львиную долю спецэффектов из современных фильмов. Грубо говоря, весь «Аватар» целиком тогда компы бы не потянули, но вот персонажей того же качества и ближайшие к ним объекты — вполне (посмотрите, собственно, на «Терминатор 2»).

Почему же тогда не было такого количества фильмов со спецэффектами современного уровня — пусть даже с чуть-чуть прикрученным фитильком?

Их не было потому, что компьютер-то всё это нарисовать мог, а вот человек — нет. Поскольку тогдашний язык-интерфейс для общения с компьютером на эту тему был чудовищно трудным в использовании.

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

Изначально вообще в текстовом виде, но чуть позже — всё-таки уже в графическом: при помощи мыши или её аналогов.

Компьютеру этот язык очень хорошо понятен, однако человеку «разговаривать» на таком языке столь тяжело, что даже после многих лет тренировки художнику стоило больших усилий изобразить что-то, хотя бы похожее на реалистичную голову человека.

С объектами же, на которые нельзя посмотреть в реальном мире, вообще происходил полный швах — описать их на таком «языке» оказывался неспособен вообще никто. То есть что-то после долгих тренировок получается, однако до реализма ему как пешком до звёзд.

В результате, в упомянутом «Терминаторе 2» эта проблема решалась сканированием живого актёра, а вручную дорисовывались только простые вещи — типа лезвий вместо рук или аморфной капли на полу.

Разумеется, эту систему много раз пытались усовершенствовать — чтобы язык-интерфейс хоть как-то помогал художнику в решении его задач. Что позволило от трёхмерных палка-палка-огуречик перейти к трёхмерным персонажам, похожим на примитивные детские игрушки, но дальше сложность росла столь сильно, что без смены языка-интерфейса прогресс в этой области попросту останавливался.

Однако радикальная смена языка-интерфейса (крайне, кстати, неудачно реализованная поначалу) привела к тому, что мы имеем сейчас — к компьютерной графике, неотличимой от съёмки реальных объектов.

Вместо того, чтобы строить язык вокруг расстановки точек в пространстве, теперь он был построен вокруг концепции «куска виртуального пластилина», из которого можно было лепить нужную форму при помощи интуитивно понятных инструментов, похожих на что-то типа «вдавить», «вспучить», «добавить пластилина», «выдавить через трафарет» и тому подобное.

С этого же «куска виртуального пластилина» одновременно с тем снимались ещё и текстуры для отображения мелких деталей формы (ну там, пор, морщин и т.п.), а текстуры, отвечающие за цвет, отражающую способность и что угодно ещё, рисовались прямо на нём, а не, как раньше, на адской развёртке из 3d в 2d — в Фотошопе.

Результатом процесса вроде бы оказывался всё тот же «каркас» (теперь он натягивался на кусок «виртуального пластилина» постфактум — с той или иной степенью автоматизации) и приложенные к нему текстуры, однако оказалось, что на этом языке человеку «каркас» и текстуры описывать настолько проще, что среднестатистический школьник при очень недолгой подготовке мог за полчаса сделать такую модель, которую раньше самый опытный художник мира не сделал бы и за месяц.

А опытные в этом новом языке уже могли нарисовать такое, что раньше никто себе и представить бы не смог. Что реальные, что вымышленные объекты — со степенью реалистичности «реалистичнее, чем в реальности».

Было ли по этому поводу сопротивление с призывами «не трогать то, что и так работает»?

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

Но вместо всего перечисленного результатом стал ещё один радикальный взлёт качества спецэффектов в кино, передачах и компьютерных играх.

Обращу внимание, в обоих примерах речь идёт не о смене внутреннего устройства, а о смене именно что языка взаимодействия человека с этим внутреннем устройством. В случае с языками программирования, написанное в конечном счёте всё так же превращается в двоичный код, а в случае с трёхмерной графикой — в «каркас», привязанные к нему текстуры и их координаты. Конечно, процессоры теперь имеют больше команд, а в трёхмерной графике появилось гораздо больше дополнительных возможностей, чем когда-то, однако та часть, про которую я говорил, в конечном счёте превращается в примерно то же самое, что и тридцать лет назад.

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

Ну, а как вы теперь будете отличать одно от другого-то? Сейчас, вон, после появления GPT-моделей, даже с компьютером стало возможно разговаривать на обычном разговорном языке. А уж про математику, музыку, инженерию и кучу других вещей с компьютером можно общаться уже многие десятилетия. И не только можно, но и необходимо.

Тут как правильно? Учить минимум два языка для каждой сферы: один для общения с компьютером, а другой — для общения с людьми?

Но с какой целью? Не проще было бы иметь один язык, который подходит и для людей, и для компьютеров? Тем более, что представления будто бы «с компьютером говорят на языке нулей и единиц» — это порождение фантазии писателей-фантастов полувековой, а то и вековой давности. Даже в тех случаях, когда общение не происходит при помощи мышки и какого-то графического интерфейса, всё равно пишется текст, в котором гораздо больше, чем два символа — «0» и «1».

Кроме того, общение с компьютером сильно помогло в том плане, что гораздо более наглядно вскрыло принципиальные недоработки «эволюционно сложившихся» языков, на которые долгое время можно было закрывать глаза.

В частности, то, что они очень сильно неполны. Их сильно не хватает, чтобы выразить музыкальную, математическую и т.п. идею целиком — приходится в промежутках вставлять что-то на разговорном языке, надеясь на то, что читатель сам догадается до того, что тут пропущено, может быть двояко истолковано или попросту написано с ошибками.

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

При этом в «традиционном» языке математики, например, для этого просто отсутствуют слова и конструкции.

Вы не можете написать «а теперь раскроем скобки», кроме как словами разговорного языка. Вы не можете написать «решим уравнение, а потом его решения подставим вот сюда» на «эволюционно сложившемся» языке математики — только на каком-то разговорном.

Одновременно с тем, даже то, что написано на языке математики, неоднозначно, а потому трактуется только в контексте — в надежде, что все читатели правильно угадают смысл написанного.

Что это тут такое? Проверка эквивалентности? Утверждение? Присваивание переменной значения — до тех пор, пока не присвоят другое? Или вообще какой-то универсальный закон «икс всегда то же самое, что и единица»?

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

А если нет?

А если опыт у вас большой, но не совсем в той области, про которую вы сейчас читаете?

Да и даже с большим опытом вы, по сути, тратите кучу времени впустую — на попытку угадать, что имелось в виду, и на дешифровку текста.

Вместо того, чтобы потратить это время на осмысление и развитие самой идеи.

Взглянем, например, на вот такое выражение.

Если отвлечься от того, что кому-то его вид кажется привычным, поскольку он подобное видел все годы вуза, а до того — фрагментарно — в школьные годы, то это — пример чудовищно плохого дизайна «интерфейса».

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

Вы должны знать, что «erf» — это функция, чтобы правильно догадаться, что…

…это вызов функции с аргументом, а не умножение некой переменной «erf» на написанное в скобках.

Вы должны знать, что такое «n», чтобы однозначно трактовать nμ, σ как функцию с параметрами μ и σ, а не, например, с индексами μ и σ.

Вы даже не можете быть уверены в том, что μ2 — это μ * μ, а не μ с верхним индексом «2».

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

Ок, «2x» — это наверняка 2 * x, но вот sin(x + 1) — это точно вызов функции «sin»? Вдруг вы не знаете, что такая функция есть — как с большой вероятностью не знали, что есть функция «erf»?

Быть может, это sin * (x + 1)?

Или s * i * n *(x + 1)?

Или si * n * (x + 1)?

С другой стороны, по смыслу одинаковое записывается разными способами.

И «erf», и «квадратный корень», и «интеграл» — это всё по смыслу функции. Однако одно записывается именем, после которого идёт что-то в круглых скобках, другое — угловатой закорючкой, а третье — сглаженной закорючкой.

Второе охватывает свой аргумент верхней частью закорючки, а третье — не охватывает. Но зато у него в конце есть «dx», про который надо знать, что и это на самом деле тоже функция — «дифференциал от икс», а вовсе не переменная «dx» или «d * x».

И в это время есть ещё и четвёртое — «nμ, σ(x)» — где два, по сути, аргумента приписаны где-то снизу, а третий — в скобках. И это сделано лишь на том основании, что первые два аргумента уже были зафиксированы где-то вне выражения, а третий внутри выражения переменный.

И в это время два аргумента у функции «интеграл», определяющие начало и конец интегрирования, написаны под и над закорючкой.

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

И ещё тут есть «непреходящая» константа «π», значение которой как бы «всегда известно», рядом с которой есть другие две греческие буквы — «σ» и «μ» — которые таким свойством уже не обладают.

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

Добавьте к этому ещё неоднозначность знака «=» и ряда других значков, и попытайтесь осознать, сколько специальных правил вам надо заранее знать, чтобы понять идею написанного.

И сколько всего надо угадывать — например, что «=» в этом примере означает «при заданных таким образом (где-то за кадром) функциях p и n левая часть всегда тождественна правой».

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

То есть понимаете: смысл сказанного тут оказывается проще, чем техническая сторона его записи.

И я тут ещё привёл не самый сложный пример — всего-то одно выражение с весьма распространёнными операциями. Добавь я сюда что-то из теории категорий, вы бы сейчас ещё пытались понять, что такое «морфизм», «множество» и «моноид», а также как вам на письме предлагается отличать…

…от…

…коим часто обозначается умножение. При том, что первый, не закрашенный кружок ряд авторов рисуют как закрашенный.

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

К чему это приводит?

Ну, например, если вы откроете статью в Википедии про упомянутую мной теорию категорий, то скорее всего вы поймёте там примерно ничего — даже если изучали математику в школе, а потом ещё и в вузе.

Наверно дело в том, что это — очень сложная и продвинутая теория? Которую невозможно понять тем, кто не отучился сначала одиннадцать лет в школе, а потом ещё пять—шесть в вузе? Да и после этого хоть что-то поймут только те, кто учился очень хорошо? А для нормального понимания надо ещё несколько лет отучиться — уже конкретно по этой теме?

Математика — это ведь сложно, да?

А что если я скажу вам, что все основные идеи этих построений может за пять—десять минут понять даже тот, кто не кончал не только технический вуз, но даже в школе толком не учился?

Да-да, для этого не нужен не только матанализ, но даже алгебра. И даже арифметика.

Начнём с почти чистого листа.

Единственный термин, который нам понадобится — «функция». Однако если вам что-то про них рассказывали на школьной и вузовской математике, забудьте про это на время.

«Функцией» мы назовём какой-то набор действий над входными данными, который после их завершения даёт нам результат.

Входными данными и результатом при этом может быть что угодно — числа, тексты, геометрические фигуры, файлы, звуки, вообще что захотите.

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

На специальном языке мы могли бы записать это как…

«f» — это имя функции, которое может быть произвольным. Главное, не использовать в рамках одних и тех же рассуждений одно и то же имя для именования разных функций.

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

Знак «=» тут, в отличие от математики, означает строго одну и ту же идею: «с этого момента то, что написано слева от него — альтернативное название для того, что написано справа». Если написанное справа содержит в себе функции, то мы считаем, что сначала надо дождаться того, что все они выполнятся и вернут результаты, и только потом называть именем слева то, что получилось.

То есть, если, например, мы написали…

…то это означает, что с этого момента именем «res» называется результат выполнения функции f, которой передали данные x.

Поскольку «что угодно» включает в себя и функции тоже, какая-то функция может вернуть имя другой функции. Или даже саму эту функцию — то есть некий набор определённых действий, которые надо совершить над данными, когда их предоставят.

Теперь рассмотрим интересную функцию «composition».

Эта функция получает в качестве данных две какие-то функции и возвращает другую функцию, которой мы тут присвоили альтернативное имя «g».

Эта функция g такая, что вызов…

— это то же самое, что вызов…

Например, у нас есть функция «нарисовать пример геометрической фигуры по её названию на английском языке» — draw. И вторая функция «перевести слово с русского на английский» — translate. При помощи функции composition мы теперь можем получить функцию, которая сначала переводит имя фигуры с русского на английский, а потом рисует пример такой фигуры.

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

Однако тут главное, что без какой-либо предварительной подготовки — не говоря уже про пятнадцать лет изучения математики — я вам за одну страницу объяснил основную идею того, что записанное на «эволюционно сложившемся языке математики» казалось совершенно непонятным.

И это произошло чисто за счёт использования другого языка.

Понимая теперь, про что на самом деле речь, прочитайте в той статье Википедии раздел, начинающийся со слов «Категория C — это»…

Что, всё ещё непонятно?

Ну да, «множество морфизмов», «тождественный морфизм», «стре́лки» какие-то. Про что это всё? Без пятнадцати лет и потом ещё пяти бесполезно даже пытаться это понять.

Ок.

Предположим, у нас есть три произвольные функции: f1, f2, f3.

И для всех возможных функций мы сделали функцию composition.

И выяснили, что если…

…и…

То g1[x] и g2[x] дают один и тот же результат для любого x.

То есть, например, оба варианта приводят нас к тому, что данные две функции — g1 и g2, — вызванные для произвольного x, это то же самое, что вызов…

И ещё у нас есть функция «ничего не трогать», которая тупо возвращает то, что получила в качестве входных данных. Назовём её identity.

Для неё composition действует так, что для произвольной функции f

…и…

…возвращают эту самую функцию f.

Теперь все такие объекты x, для которых мы можем определить composition и identity так, чтобы вышенаписанное выполнялось, в совокупности с этими самыми composition и identity, а также со всеми функциями, для которых всё это работает, мы назовём «категорией».

Зачем-то назовём. Я реально не представляю, зачем. Да, теперь мы сможем говорить что-то вроде «категория множеств», «категория слов русского языка» и т.п., но это реально ничего не даёт, поскольку суть была вообще не в этом, а в том, что можно комбинировать функции.

Можно подумать, что без всей этой дополнительной терминологии и красивых незакрашенных кружочков мы что-то потеряли. Быть может, исходный вариант глубже, а я тут всё упростил и примитивизировал.

Однако нет. Ирония в том, что изложенный мной вариант — даже более общий, нежели изложенный в Википедии. Ведь там, как следует из текста, под «иксами» понимаются только некие «математические объекты» (чего бы это ни значило). Здесь же речь шла вообще про произвольные сущности — не только числа, математические выражения, списки (или, если угодно, множества), но ещё и про звуки, картинки, файлы, слова и предложения разговорного языка. Про что угодно.

Эта идея тем и хороша, что работает вообще для любой сколь-либо формализуемой сущности.

Взглянем, например, на разговорные языки.

Разумеется, для предложений на разговорных языках мы можем определить функцию identity — она возвращает то предложение, которое ей дали, поэтому её композиция с любой функцией будет тождественна вызову этой функции.

Теперь пусть у нас есть три функции:

Перевод предложения с английского на немецкий — englishToGerman.

Перевод с немецкого на итальянский — germanToItalian.

Перевод с итальянского на русский — italianToRussian.

Для этих функций мы могли бы определить composition довольно очевидным способом: она строит функцию, которая сначала переводит с одного языка на другой, а потом с другого на третий.

Теперь мы можем получить переводчик с английского на русский двумя способами.

Если у нас алгоритм перевода мега-однозначен и не допускает никаких вольностей, то может статься, что englishToRussian1 и englishToRussian2 всегда дают один и тот же перевод для каждой одной и той же переданной им фразы. В этом случае фразы данного языка, три означенные функции, а также соответствующие composition и identity будут категорией.

Тут надо понимать, что из выполнения свойства, описанного в предыдущем абзаце, что-то следует: как минимум, то, что englishToRussian1 и englishToRussian2 взаимозаменимы, как и все их аналоги. Однако малейший уклон в сторону «традиционного языка» (даже простое разъяснения термина «категория» из оного) тут же начинает уводить нас в сторону от практической сути — от того, что так вообще можно делать: комбинировать функции.

Этот язык реально мешает вам думать, оттягивая львиную долю ресурсов вашего мозга на себя самого — на дешифровку написанного, на запоминание терминов, которые в основном не пригодятся, и так далее.

Равно как и на частные случаи записи всего этого.

Ведь, как ни странно, с некоторыми дополнения того способа записи, который я тут использовал, можно регулярным способом записать не только всю математику, а ещё и все промежуточные слова на естественном языке, которые приходится использовать из-за неполноты «эволюционно сложившегося языка».

А заодно и не только математику, а целую кучу других наук.

Причём это не «просто гипотеза» — это уже сделано.

С музыкой происходит аналогичное.

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

Вы хотели бы научиться что-то исполнять, скажем, на синтезаторе. Синтезатор у вас уже есть — казалось бы, вперёд. Но нет. Сначала вам нужно изучить целую тучу специальных значков и специальных, нерегулярных правил, по которым они работают. Свободно всё это читать вы сможете только через многие годы — и то иногда будете сбиваться.

Вам что-то дал такой язык? Если «ну хоть какую-то систему записи», то вон ведь, есть система записи, на постижение которой у вас уйдёт пять минут, а неверно что-то трактовать вы не будете вообще никогда.

В начале полоски нажал клавишу, в конце — отпустил. Синий — левая рука, зелёный — правая. Цифры — номера пальцев. Ещё можно было бы насыщенностью силу нажатия закодировать, хотя тут это и не сделано.

Да, такую запись несколько проще использовать на клавишных инструментах, а, например, на тромбоне — чуть сложнее. Но даже на нём использовать эту гораздо проще, чем «эволюционно сложившуюся». Вы не можете нажать ту клавишу, которая нарисована, но клавиша соответствует конкретной ноте, а всё-таки запомнить, где какая нота на инструменте — это более простая задача, чем кучу спец-значков и специальных правил. Тем более, что и в этом случае тоже всё равно придётся запоминать, где какая нота.

Вообще, конечно, про то, насколько плох «эволюционно сложившийся язык записи музыки» с точки зрения дизайна и терминологии, можно написать статью, которая по размерам, будет аналогична этой, но я в данном случае просто отошлю к видео (которое, к сожалению, на английском без перевода), где это уже сделано.

И подытожу:

На мой взгляд, в тот момент, когда закостыленность языка очевидна, нет смысла держаться за этот язык. Особенно в тех случаях, когда уже есть альтернативы с гораздо меньшим количеством костылей.

Да, преодоление сложностей кем-то воспринимается как самоценный спорт, однако надо тогда честно признаваться, что вас интересует не музыка, математика, программирование и т.п., а решение языковых головоломок. Что борьба с «эволюционно сложившимся языком» и победа над ним для вас гораздо важнее, чем всё то, что на нём выражается, включая выраженное для практического использования.

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

Если же «эволюционно сложившийся» вы не знаете, то тратить время на него, вместо языка без костылей, вообще нет никакого смысла — с новым всё будет гораздо быстрее и проще.

Ну и это. Мир таков, что языки с неизбежностью приходится в какой-то момент менять. Как бы ни было кому-то больно за потраченные — как выясняется, впустую — годы и десятилетия.

Лекс Кравецкий :