Несмотря на то, что к этому моменту я уже закончил разработку графического движка для одного [впрочем не слишком коммерчески успешного] игрового проекта, на меня накатывала апатия и депрессия, и не удивительно — что толку быть разработчиком движка, код которого ты просто перестал понимать (а о возможностях его [графического движка] совершенствования и говорить нечего).
Вскоре так получилось, что компания Katauri, в которой я работал, фактически прекратила свою деятельность и я уволился. В результате, я совсем перестал программировать, что вгоняло в депрессию ещё сильнее. Более 2-х лет я вообще не работал и не искал работу (обстоятельства так сложились, что я жил далеко от всех своих родственников и у меня была достаточная финансовая подушка [лет на 5], что позволяло скрывать от всех своё положение), пока в начале 2016 не случилось событие [смерть моего отца], которое резко изменило мою отшельническую жизнь — я прилетел домой на похороны, и вскоре решился сказать родственникам, что я не работаю с 2014 года.
В это же время [в начале 2016] у меня стали появляться идеи для нового языка программирования, которые я просто складировал в отдельный текстовый файлик. Вначале я не придавал этому большого значения (в конце концов, мало кому нужен просто ещё один язык программирования, и я понимал это), но впоследствии оригинальных идей получилось достаточно много, так что я решил попробовать заняться этим всерьёз, сделав упор на продуманность синтаксиса языка.
По мнению многих программистов, синтаксис языка программирования не так важен, или даже более категорично:
Syntaxation • Douglas Crockford • GOTO 2013:
Syntax is the least important aspect of programming language design.
Я подозреваю, это от того, что обычным программистам не составляет труда просто запомнить "как надо" и всё. А мне — составляет [причём порой очень большого труда]. Поэтому при разработке синтаксиса я вынужден был опираться не на память, а на логику. Так, практически все элементы синтаксиса нового языка имеют/получили рациональное обоснование их выбора. Остаток данной статьи я посвящу перечислению наиболее значимых обоснований выбора элементов синтаксиса, которые [эти обоснования] не встречаются в других статьях (таких как «Разработка когнитивно-эргономического синтаксиса для нового аппаратно-ориентированного языка программирования») и в документации к языку. [Про сам язык можно прочитать на его странице в Википедии. Примеры кода и документация представлены на веб-сайте языка.]
Почему аргументы функций по умолчанию константны, а переменные — нет, разве это не приводит к несогласованности, упомянутой в документации языка программирования D?
Ну переменные на то и переменные, что могут изменяться, а аргументы — это другое слово. Но самое главное почему допустима такая "несогласованность" — если при объявлении переменной абсолютно ясно что означает её изменяемость, то в случае аргументов функции такой ясности уже нет: возможно, что меняться будет копия переменной [передача по значению], а возможно, что меняться будет сама переменная, переданная в функцию [передача по ссылке]. Поэтому в 11l используются квалификаторы:
=
для копирования значения, &
для передачи по ссылке, а в случае отсутствия квалификатора аргумент передаётся по константной ссылке (либо по константному значению, если размер аргумента не превышает размера указателя [например если аргумент целочисленного типа {т.к. использовать [константную] ссылку в данном случае менее эффективно}]).Почему глобальные функции и типы не требуют префикса
:
, а глобальные переменные требуют?Потому что глобальные функции и типы — это нормально, а глобальные переменные — это не очень хорошо.
Почему
a.len
/sum(a)
/a.map(f)
, а не len(a)
/a.sum()
/map(a, f)
?В 11l используется кратчайшая запись:
a.len
len(a)
a.len()
sum(a)
a.sum()
a.map(f)
map(a, f)
И кроме того, функции вроде sum()
(any()
, all()
, product()
, min()
, max()
) всегда финальны [в отличие от map()
и filter()
].Почему
print()
в 11l не поддерживает запятую для вывода нескольких переменных как в Python?В Python запятая полезна для вывода нестроковых переменных:
print(a, b)
Альтернативные записи (print(str(a) + ' ' + str(b))
или print(f'{a} {b}')
) более многословны.Но в 11l можно писать так:
print(a‘ ’b)
И к тому же, в языках программирования нет консенсуса по символу разделителю — в некоторых языках (например Python, Swift, JavaScript (console.log()
)) используется пробел [по умолчанию], в других ({PHP (echo
), Ruby, Go (fmt.Print
), Pascal (write
), D (write
), Perl, Julia, Nim (echo
)}) — пустая строка, а в Lua и Basic вообще используется табуляция {а точнее в Basic используется print zone из 14 или 16 пробелов, и пробел или пустая строка при использовании разделителя ;
}.Почему запись
x, y = i, j
не поддерживается (и необходимо писать (x, y) = (i, j)
)?Потому что её можно спутать с записью
int x, y = i, j;
в Си [и её аналогом Int x, y = i, j
в 11l], которая обозначает совсем другое.[В Python запись
(x, y) = (i, j)
также корректна.]Почему
return a, b
не поддерживается (и необходимо писать return (a, b)
)?return a, b
у меня ассоциируется с возвратом функцией множества значений, хотя в Python это не так — реально возвращается кортеж (одно значение типа tuple), в чём можно убедиться через print(type(f()))
. (Что я имею в виду под возвратом множества значений: ну, например, если функция bar()
возвращает 1, 2
, то вызов foo(bar())
означает foo(1, 2)
[так это работает например в языке Lua], а если возвращает (1, 2)
, то означает foo((1, 2))
.)Почему
write_bytes()
, а не просто перегруженная write()
?Для симметрии с
read_bytes()
.А почему
read_bytes()
?Сделать как в Python {то есть, чтобы в зависимости от режима открытия файла (
b
или t
) менялся тип возвращаемого значения функции read()
} в 11l не получится из-за статической типизации.Почему
null
, а не none
или nil
?Потому что есть nullable-типы, а не noneable.
А нельзя было обойтись без префикса
@
?Можно, но я решил использовать префикс [ради эксперимента (улучшится с ним читаемость кода или наоборот)], так как отказаться от него в будущем в принципе вполне возможно, а вот добавить впоследствии — точно нет.
Почему для while-циклов используется ключевое слово
loop
, а не for
как например в Go?Для цикла while (while loop) логичным является либо
while
, либо loop
, но никак не for
.[А в Go, видимо, сделано по аналогии с Си с его универсальным
for
(for (;;)
для бесконечного цикла и for (;condition;)
как синоним while (condition)
).]Комментарии (72)
Andrey_Epifantsev
01.11.2022 05:29+19Вероятность того, что кто-то станет внедрять новый язык минимальна.
А вот если бы вы написали набор рекомендаций и методов работы с существующими языками и библиотеками для людей с вашими особенностями (этакие best practices для людей которые не могут всё охватить) - это было бы здорово.
Тем более что в наше время, на самом деле, к таким людям можно отнести практически всех. Взять хотя бы стандарт C++ - один человек его в принципе не в состоянии охватить. Аналогично с WEB стандартами. Просто большинство этого пока не осознают, а вы оказались на переднем крае и осознали.
oleg_shamshura
01.11.2022 07:33+16Предлагаю выход: старичкам вернуться на старый добрый K&R C и писать строго на нем.
Всего 13 ключевых слов. Принципы уже въелись в ДНК. Ничего не забудешь, даже если разбудить посреди ночи. И при этом -- безграничные возможности, люди юниксы писали.
Языки приходят и уходят, а С -- вечен, как достояние цивилизации.
PS. Ладно, так уж и быть, ANSI C.Kreastr
01.11.2022 08:53+1Главное не пользоваться макросами вообще и не подключать сторонние библиотеки еще.
oleg_shamshura
01.11.2022 09:28Нормалек, макросы тоже въелись в ДНК. А о библиотеках пока речи не было.
IvanPetrof
01.11.2022 09:30+8Тут возникает другая сложность - удержание в памяти самого проекта. Т.к. Чем "беднее" язык, тем получается больше строк. А чем больше строк, при проблемах как у автора, пока "дочитаешь" функцию до конца, забудешь про что было в начале. Разбивание на маленькие функции влечёт за собой увеличение числа слов, которые нужно помнить и т.д.
oleg_shamshura
01.11.2022 09:53+2Не принимайте всерьез, я поприкалывался. Тем более, что проблемы с памятью начинаю и у себя замечать.
Но если серьезно, то действительно хотелось бы иметь дело с языками, у которых синтаксис компактный и регулярный -- что-нибудь в духе LISP, Tcl или Forth, когда всё описание синтаксиса занимает один короткий абзац текста. Как правило, такие языки еще и выразительны до умопомрачения.
Ну, а маленькие функции тем и хороши, что им можно давать немаленькие имена.EvalApply
01.11.2022 12:38+3в духе LISP, Tcl или Forth, когда всё описание синтаксиса занимает
один короткий абзац текста. Как правило, такие языки еще и выразительны
до умопомрачения.3Тоже хотел ответить, упомянув LISP и Forth
Программы при той же функциональности получаются гораздо компактнее.pharo
01.11.2022 16:56+1Цитата из статьи по Форт с Лурк.
…
Итого, если в LISP скобка — это базовый эзотерический символ, а в прочих языках соблюдается некий баланс, то в Форте вся эзотерика строится на отсутствии скобок в записи выражений. Мегаследствие: все различия глобальных концептов в программировании определяются числом скобок в языке! А не всякими там ООП, замыканиями и прочими коротящими мозги штуками.
…
codecity
01.11.2022 07:35+3Перевод Python->С++ показался интересным, думаю вам стоит развивать это направление. Можно узнать - изучали ли вы аналогичные сторонние решения перевода Python->С++? Как ваше решение в сравнении с ними?
По вопросу нового языка. Язык ценен количеством носителей (ну или писателей в случае разработки). Изучают язык, как правило, по нужде, а не для удовольствия - на чем говорят, за что платят - то и вынуждены изуать, нравится нам или нет. Хороший искусственный язык не обязательно станет востребованным. Вот есть Логлан - логически правильный язык. Будете ли вы его изучать?
alextretyak Автор
01.11.2022 08:00+1изучали ли вы аналогичные сторонние решения перевода Python->С++?
Да, конечно. Вот здесь представлены диаграммы производительности (конкретно Python в C++ транслирует Nuitka и Shed Skin).
codecity
01.11.2022 07:41Еще оффтоп. Если не секрет, по какой причине возникли проблемы с памятью?
alextretyak Автор
01.11.2022 08:00+2Неизвестно.
DreamShaded
01.11.2022 08:59а удалось это исправить?
alextretyak Автор
01.11.2022 10:00+8Не совсем. Скорее удалось исправить [моё] отношение к этим проблемам.
mikelavr
01.11.2022 13:08+1Советую посмотреть на книги Бредесена. Делать то, что он говорит - полезно в любом возрасте и состоянии.
https://www.litres.ru/pages/rmd_search/?q=бредесен
Helltraitor
01.11.2022 11:28+3Не увидел ни примеров кода, ни спецификации / документации. Тоже хотел сделать свой язык до знакомства с Rust, который меня пока полностью устраивает
UPD: Еще могу вспомнить подход котлина с
.let
и прочими - читается прекрасно и помогает структурировать код
progchip666
01.11.2022 11:30+1Не то, чтобы у меня были большие проблемы с памятью, но мне в принципе не нравится картина когда программирование всё больше сводится к заучиванию многочисленных функций. В результате процесс и из творчества всё больше в зубрёжку превращается, а исполняемый код растёт в геометрической прогрессии и достаточно примитивные программы пожирают в итоге невероятное количество ресурсов.
Поэтому я программирую на С и С++. С# применяю только по необходимости.
Akon32
01.11.2022 11:52Разработка нового языка программирования сейчас имеет мало шансов на успех, т. к. трудно создать коммьюнити, трудно создать библиотеки, трудно создать IDE...
Не пробовали написать программу, заменяющую тот тип памяти, что не работает у вас? Это было бы полезно большему кругу людей (не только программистам).
(Выше я предполагаю, что вы уже обращались к неврологам и проходили обследования. Лечение, если оно возможно, может дать лучшие результаты, чем искусственные дополнения)
CrashLogger
01.11.2022 13:43+1Сейчас как раз проще чем когда-либо создать IDE и компилятор - все необходимые инструменты уже есть. Возмите clang и eclipse например. А библиотеки можно использовать сишные - их уже на все случаи жизни написали. Достаточно обеспечить прозрачный интерфейс для их вызова.
OlegSevg
01.11.2022 12:23+1У меня есть немного другая проблема. Когда читаю различные статьи и попадается не интересный( но важный) текст то я автоматически его перескакиваю на следующий абзац или дальше. Так что приходится завставлять себя вернуться назад и с усилием вчитываться. Может это просто банальная лень... но раздражает.
Skigh
02.11.2022 11:19Впервые такое заметил за собой больше двадцати лет назад, на старших курсах универа.
Несмотря на это, ещё мечтал о научной карьере, на аспирантуру поступил.
«Графа Монте-Кристо из меня не вышло...»
EvalApply
01.11.2022 12:30+1Lisp,Common Lisp не рассматривали?
Мне кажется, он более логичен, чем остальные языки.
Синтаксического сахара там почти нет.
EvalApply
01.11.2022 12:33+1Оффтоп.
Пожилые люди тоже все забывает. Интеллект снижен из-за этого (не знают, не помнят, что делат), но частично сохранен.
В сериале каком-то видел, как расклевивают по дому листочки пост-ит с напоминаниями.
Если бы сделать какое-то устройство, распознающее ситуации и дающее подсказки, было бы полезно и востребовано.MagisterAlexandr
02.11.2022 18:35В сериале каком-то видел, как расклевивают по дому листочки пост-ит с напоминаниями.
Хочу такую штуку в Augmented Reality (чтобы не пугать окружающих, и чтобы легко backup'илось).
engine9
01.11.2022 12:55+8Я мало что понимаю в программировании, но по-человечески хочу выразить уважение и восхищение тому, как вы адаптируетесь к своей беде.
sky-walker
01.11.2022 14:22+1Да, источником ошибки может быть все что угодно ...
Навеяло. После института, на моей первой работе, до сих пор помню эпизод: при тестах как-то странно не работал поиск в базе данных.
Причиной в итоге оказалось то, что наборщик базы не всегда переключался с латыни на русский на букве "c". Или просто не замечал - как известно, "c" в обоих раскладках находится на одной клавише, заметить ошибку невозможно. Хороший был урок.
/
domix32
01.11.2022 15:22+2Ожидаемо страница помечена к удалению. А чего сразу на сайт/репозиторий не сослаться? Кажется это более ожидаемое поведение.
Почему для while-циклов <...>
меня больше смущает необходимость скобок для биндинга счетчиков к переменным. Не очень понятно можно ли иметь внешнюю переменную, которую можно кинуть в качестве итератора.
auto it = vec.begin(); for (;it != vec.end(); ++it) { if (somecond(it)) break; } // и тут мы используем наш it для чего-нибудь.
Также много вопросов возникает к switch оператору. Нет примеров многстрочных кейсов, типа
// C++ switch(c) { case 'a' : { print("aaaaaaaaaa"); scream = true; break; } case 'b': { print("bebebebe"); sanitazer_scream = true; break; } default: { print("everything is quite"); } }
У раста в этом плане паттерн матчинг выглядит неплохо (настолько, что даже в С++23/25 может быть завезут аналогичный синтаксис)
match c { // для простых кейсов контекс кончается после запятой 'a' => println!("the first in the kind"), 'b' => println!("not an omega"), // контекс кейса заканчивается фигурной скобкой 'c' => { maybe_omega = true; println!("suspicious {}", maybe_omega); }, // можно использовать диапазоны и байндинги к локальным переменным x@'d'..'f' => println!("some dudes {}",x), // паттерн матчинг всегда должен покрывать все варианты _ => println!("whatever else"), }
Объявление констант через параметры кажется тоже лишнее действие. Почему не взять better defaults и не считать все объявления без V константами?
Не очень понятно как отличать статичные и глобальные переменные.
Что с модулями? Или пока оно работает исключительно с одним файлом?
MagisterAlexandr
02.11.2022 01:00+1Ожидаемо страница помечена к удалению.
Аккурат после публикации этой статьи.
А чего сразу на сайт/репозиторий не сослаться?
Верно. Тогда бы и не была помечена к удалению.
Ну прямо буриданов мост.
domix32
02.11.2022 02:31Аккурат после публикации этой статьи.
Вас смущает наличие редакторов википедии на хабре чи шо?
MagisterAlexandr
02.11.2022 02:39То, что автор создал/отредактировал статью о своём проекте, не доказывает незначимости проекта.
Как будто оттого, что автор наймёт кого-то написать статью, проект станет значимее.
domix32
02.11.2022 02:58Значимость обычно проистекает из популярности/распространения языка. Иначе можно смело переносить туда весь esolang.org, добавить статьи про YoptaScript и миллион диалектов того же лиспа. Заодно доки по либам NPM или PyPI добавить.
Поэтому уж лучше оно храниться где-нибудь в Github Arctic Vault - и аудитория подходящая и значимость соответствующая. На вики же оно будет пылиться с парой сотней просмотров мертвым грузом.
MagisterAlexandr
02.11.2022 03:09Значимость явления напрямую связана со смыслом.
Распространённость придаёт смысл. Люди, вкладывая энергию/внимание, этот смысл находят/создают. Но это не обязательное условие для наличия смысла. Пример: фундаментальная физика, которую более-менее понимают единицы.
domix32
02.11.2022 15:47Не знаю что у вас там как связано, но у вики вполне себе имеются конкретные критерии значимости, в которые статья все же не попадает.
MagisterAlexandr
02.11.2022 18:25Не берусь оценивать, достаточно ли обоснований значимости по
тем у вас тамэтим критериям. Я лишь обратил внимание, что написание статьи самим автором не является доказательством недостатка значимости. Как и малая распространённость. Это признаки (статистически чаще так), а не доказательства. Но да, статьи в авторитетных источниках и примеры использования проекта третьими лицами будут в плюс.Также, если редактор википедии, только что пометивший страницу к удалению, пишет здесь, на habr, "Ожидаемо страница помечена к удалению", то это вызывает ощущение обоснования через само себя (то самое, в чём упрекают авторов, пишущих статьи о своих проектах).
domix32
02.11.2022 22:10Также, если редактор википедии, только что пометивший страницу к удалению, пишет здесь
Телега не моя, статья по моём прочтении уже была помечена. Ожидаемо. Мои правки заметно меньше.
alextretyak Автор
02.11.2022 02:12Также много вопросов возникает к switch оператору. Нет примеров многострочных кейсов
Самый первый пример на веб-сайте языка содержит двухстрочный кейс:
I --nesting_level == 0 ...
.Не очень понятно как отличать статичные и глобальные переменные.
Статичные переменные объявляются внутри функций/типов, а глобальные — вне функций/типов. При обращении к ним префикс одинаковый (двоеточие), но в других языках обращение к статичным и глобальным переменным также никак не различается.
Что с модулями? Или пока оно работает исключительно с одним файлом?
Есть пример на Rosetta Code.
Т.е. чтобы вызвать функцию модуля необходимо написать:<имя_модуля>:<имя_функции>(...)
thevlad
01.11.2022 18:52+1Знакомо, у меня тоже ухудшилась память с возрастом, возможно не так сильно. Лайфхаки: записная книжка на телефоне, и распечатанные куски кода с пометками.
Krypt
01.11.2022 20:27+1Syntax is the least important aspect of programming language design.
А потом у нас есть такие сайты:
http://fuckingblocksyntax.com
https://fuckingifcaseletsyntax.comУ меня, буквально, распечатка на страницу со второго прижатая монитором сейчас лежит
nuclight
02.11.2022 00:43a.len len(a) a.len() sum(a) a.sum() a.map(f) map(a, f)
Так а почему
a.len
без скобок, аa.sum
с ними? Неконсистентно, как раз придется запоминать.alextretyak Автор
02.11.2022 01:30Обоснование этого решения приводится на форуме:
I think all such functions should be called without parentheses to denote their ultra low cost.
nuclight
02.11.2022 16:48Я говорю о примере в статье - если для len есть вариант без скобок, то для sum и map приводятся только с ними, неконсистентно.
MagisterAlexandr
02.11.2022 00:51Прекрасная штука.
Только как её использовать вместо Obj-C, Swift, Bash и пр., ведь нужна состыковка с используемыми API/Frameworks?
alextretyak Автор
02.11.2022 01:25Вместо Bash — запросто.
Можете привести пример Bash-скрипта, который не получается перевести на 11l?
[Можно перевести Bash-скрипт на Python, а затем воспользоваться транспайлером Python → 11l.]MagisterAlexandr
02.11.2022 01:38https://github.com/Robotizing/MiceWeb/blob/master/miceweb
Bash используется потому, что он работает везде (кроме Windows).
Можно бы сделать native-версию под Windows на 11l. Как думаете, реально?
alextretyak Автор
02.11.2022 02:30+1Можно бы сделать native-версию под Windows на 11l. Как думаете, реально?
Теоретически да, но в данном случае это скорее нецелесообразно.
MagisterAlexandr
02.11.2022 02:01Как реализовать на 11l выполнение команд терминала Windows (запуск exe-файлов, с передачей данных от одной команды следующей команде, скажем, echo "1" | ipfs add)?
alextretyak Автор
02.11.2022 02:23+1Как реализовать на 11l выполнение команд терминала Windows (… скажем, echo "1" | ipfs add)?
Вот так:
os:(‘echo "1" | ipfs add’)
MagisterAlexandr
02.11.2022 02:31Вернёт и код завершения команды, и результат выполнения (stdout, желательно также stderr)? Кажется, понял, выведет в консоль, как system().
Как быть с задачей, когда нужно получить вывод команды в виде массива?
alextretyak Автор
02.11.2022 02:38Это эквивалент функции system()/_wsystem().
Сохранение stdout/stderr в строковую переменную в данный момент не поддерживается, т.к. я не знаю хорошего способа сделать это под Windows (непонятно как реализовать поддержку Unicode).
MagisterAlexandr
02.11.2022 02:59А насколько легко конвертировать этим транспайлером Python-проект https://github.com/zeronet-conservancy/zeronet-conservancy? Там, наверное, завязки на библиотеки Python, которые всё равно непонятно как решать.
Такие задачи, как найти в большом файле вхождения заданной строки и скопировать их все в отдельные файлы (собственно, восстановление удалённых файлов по известному началу файла), должны легко решаться, наверное.
P.S. Придумал применение: обучение программированию младших школьников (не всех подряд, а те ~5%, кому интересно).
mbait
02.11.2022 02:11Было бы интересно взглянуть на грамматику языка, потому что составить даже беглое мнение о новом языке по одному лишь FAQ труновато. И вот ещё вопрос. В случае sum(a) как вычисляется область видимости? Ведь если вызов sum(a) это эквивалент a.sum, то символ "sum" должен сперва быть найден в области имён типа/класса объекта "a". Но если "sum" это свободная функция, то придётся делать лишний поиск по таблице имён. Короче говоря, с точки срезния использования это, может, и удобно, но реализация пока под вопросом. Да и ООП flavor пока неясен: в С++ у нас функции-члены, в Java честные методы, в JavaScript - свойства и function(), в Ruby - каноничный message passing c его respond_to. А у вас как?
P.S. Катаури это та самая из Владивостока, которая писала "King's bounty"?
MagisterAlexandr
02.11.2022 02:26На katauri.com:
1999 г. "Генерал"Разработчик: "NewGame Software". Распространение - Freeware.Стратегическая игра. Игра имела успех среди стратегов, выделяясь из ряда стратегий сильнейшим AI и возможностью турнирной игры.
Неужели одна из немногих игр, где ИИ не для галочки?
alextretyak Автор
02.11.2022 03:00Было бы интересно взглянуть на грамматику языка, потому что составить даже беглое мнение о новом языке по одному лишь FAQ труновато.
Что вы имеете в виду под FAQ? Данную статью? Но я ведь привёл ссылку на веб-сайт языка, где есть примеры, документация и ссылки на статьи, чего имхо вполне достаточно для получения представления о данном языке.
Ведь если вызов sum(a) это эквивалент a.sum
Почему вы так решили? В 11l правильно писать только
sum(a)
.А у вас как?
Также как в C++.
Катаури это та самая из Владивостока, которая писала "King's bounty"?
Да, та самая. :)(:
mbait
02.11.2022 11:08Каюсь, прочитал первый раз по диагонали. Сейчас перечитал - всё стало понятней.
Soukhinov
02.11.2022 02:34+4Имею схожий (может, не столь радикальный) опыт потери памяти.
Я работал над проектом объёмом в 30 тысяч строк кода. Причём особенностью проекта являлась существенная зависимость частей кода друг от друга (то есть это не был набор независимых частей, каждую из которых можно расслабленно прочесть за час и затем работать с ней). Чтобы работать с каким-то местом кода, надо было держать в голове как минимум 10 тысяч других, зависимых строк.
Я аутист, и с кодом вполне справлялся. Бывало, по неделе не заглядывал в код, программируя (или ища ошибку) в голове на основе запомненных наизусть 10-15 тысяч строк кода. Затем в пятницу садился, и всё набирал.
И тут у меня случился небольшой приступ фиксационной амнезии. Буквально часов 8 была полная амнезия, потом ещё сутки-двое частичная.
В общем, через неделю вышел я на работу, сел за компьютер и обнаружил, что больше не могу работать с исходным кодом. И так, и сяк пытаюсь — не вмещаются в голову 10 тысяч строк кода. Опытным путём установил, что теперь мой предел — это около 6-7 тысяч строк кода. Пришлось экстренно (и мучительно) рефакторить. За 2-3 месяца привёл код к состоянию, когда достаточно держать в голове лишь 5 тысяч строк (интересно, что при этом кодовая база выросла с 30 до 35 тысяч строк). Но всё равно, несмотря на рефакторинг, продуктивность упала пропорционально сократившейся памяти. Хотя сейчас понемного восстанавливается.
Далее пара слов про саму амнезию.
Фиксационная амнезия — это неспособность запоминать новую информацию. Очень хорошо показано в фильме Memento Кристофера Нолана. В какой-то момент я проснулся именно так, как просыпался главный герой фильма. С одной крайне важной разницей: на тумбочке рядом с больничной койкой я обнаружил свой смартфон с фотографиями и историей чатов. Это существенно снизило остроту проблемы (если бы у главного героя фильма был смартфон, то и фильм не о чем было бы снимать).
Опыт амнезии был незабываемый! Особенно в начале, когда памяти у меня хватало лишь на 10 секунд. Каждые 10 секунд ощущение, что ты только что проснулся от какого-то сна, который не помнишь, и что вот теперь этот кошмар закончился. И так непрерывно.
Выяснилось, например, что моё восприятие (зрение, слух, размышления) по большей части основано на памяти. Например, в здоровом состоянии я вхожу в комнату и становлюсь в её центре. При этом я воспринимаю всю комнату целиком (то, что передо мной, — вижу, а то, что сзади, — помню). Войдя же в комнату в состоянии амнезии я пугался. Я ведь не помню, что сзади. А что, если из комнаты нет выхода? А что, если меня привели в комнату под дулом пистолета, и приведшие как раз стоят сейчас сзади меня? Приходилось постоянно озираться. Ощущение, что смотришь через подзорную трубу. Чуть отвел взгляд — и сразу забыл. То же самое со слухом. Длинные фразы не воспринимались. Оказалось, что в здоровом состоянии фраза «звучит» в голове, давая возможность её несколько раз прокрутить и понять. В состоянии амнезии этого нет.
Кроме того, в состоянии фиксационной амнезии имеется существенный риск «зацикливания». Выяснилось, что в здоровом состоянии моё поведение определялось: 1) текущими ощущениями 2) памятью 3) поставленной целью. В состоянии же амнезии, если цель не поставить, остаются только текущие ощущения. Если они отличаются несильно (например, передо мной сидит всё тот же собеседник), то возникает зацикливание, когда начинаешь говорить собеседнику одну и ту же фразу. Если же поставить цель (например, спуститься по лестнице), то можно спускаться по лестнице хоть минуту (несмотря на 10-секундную память) потому, что цель освежается в памяти с каждой пройденной ступенькой (хотя я могу не помнить, зачем я спускаюсь).
В итоге оставалось лежать в кровати и смотреть в потолок, периодически «находя» на тумбочке свой мобильник.
MagisterAlexandr
02.11.2022 04:17+1Есть ещё такая грустная история.
Я сделал вывод, что нам, программистам (да и вообще людям, и прочим живым существам), противопоказана работа по насилию (так как дедлайн, так как обещал). Когда тебе остановиться, всегда должен решать ты.
И с кофе поаккуратнее, а то его люто пропагандируют.
mbait
02.11.2022 11:05А откуда у вас воспоминания обо всём этом? Ведь по логике они тоже должны были исчезнуть.
MagisterAlexandr
02.11.2022 05:02+1В школах в 90-е не зря учили Basic. После него отношение к Pascal и C было неоднозначное.
Для компилятора, конечно, проще, когда расставлены все эти скобки и точки с запятыми. А человеку?
Компилятор Pascal, а тем более C, действительно эффективнее. Кто-то скажет, что Basic это вообще интерпретатор. Да нет, Quick Basic это и интерпретатор (с возможностью менять программу во время выполнения, чего потом так долго не хватало и теперь только вот в Swift появилось) и компилятор (make Executable, запускаем, и скорость выполнения увеличивается в разы). Как бы там ни было, сейчас, когда сильно выросли и вычислительные мощности и наши алгоритмистские навыки, что мешает написать синтаксис без компромиссов, чтобы именно машина помогала человеку? Поэтому я приветствую такие проекты, как 11l.
P.S. В Pascal/C ещё строгая типизация, которая избавляет от ошибок, но это важно на достаточно сложных программах, школьнику трудно оценить по достоинству. И нормальные ассемблерные вставки (а не "хакерские" Peek, Poke, Absolute, которые в Basic).
oleg_shamshura
02.11.2022 07:15+1"синтаксис без компромиссов, чтобы именно машина помогала человеку"
...экономить нажатия на клавиши
...описывать намерения максимально подробно и точно
...удерживать в строгости
...позволять хитрозавернутые вольности
...жестко навязывать конкретный стиль кодинга
...обеспечивать мультипарадигменность
...шире использовать умолчания
...не допускать скрытной активности
...
mikhanoid
02.11.2022 07:01Спасибо, что поделились опытом и обратили внимание на некоторые аспекты языкостроительства.
Но возникает вопрос: а почему не Лисп? Там вообще ничего не нужно помнить. Ощущение, которое я испытал, написав на нём первую программу, сложнее `a + b`, было примерно такое: "Ух, ты! Да у меня процентов 50 рабочей памяти освободилось от особенностей языка под работу с самими алгоритмами!". Перешёл я на Лисп после смеси из Bash и C++. Это было физическое ощущение облегчения. У лиспов, конечно, есть свои недостатки, но это самый лёгкий для мозга язык из испробованных мной.
Если решите попробовать какой-нибудь Лисп (Scheme наиболее компактный из них, используется и в игровой индустрии), хотелось бы узнать о Вашеи опыте.
Akon32
02.11.2022 07:14Неужели в лиспе совсем нет синтаксиса? Те же самые if, def, циклы. Если писать что-то сложное - и классы появятся.
Всё равно ЯП сохраняется в голове подобно человеческому языку, и нет разницы, (if...) или if (...){...}.
kolkov
03.11.2022 01:03Тоже после ковилды в декабре 2020го через пару месяцев резко ухудшилась память.
Поправил курсом приёма МС и курсом Вессел+Цитофлавин на месяц.
Теперь довожу до ума кетодиетой и интервальным голоданием, резко улучшилась.
Пробуйте и все получится!
mSnus
<теперь у нас есть 51 стандарт.жпг/>