KidDOS: компьютер, достаточно маленький, чтобы ребёнок мог его изучить целиком
Я научился программировать, потому что скучал перед 486DX4 с 8 мегабайтами памяти и диском на 160 МБ. У сегодняшних детей такого нет. Поэтому я хочу это построить.
Я начал программировать, потому что мне было скучно.
Не скучно в смысле «хотел изменить мир». Не скучно в смысле «прочитал книгу про Тьюринга». Просто обыкновенная, двенадцатилетняя, нечем-заняться скука перед 486DX4 — 100 МГц, восемь мегабайт памяти, жёсткий диск на 160 мегабайт.
Игры на нём были. Хорошие. Day of the Tentacle. Warcraft II: Tides of Darkness. Dune II. Master of Orion. Z. The Lost Vikings. Dyna Blaster. И один насквозь пиратский диск, купленный кем-то где-то, с надписью «Сотни офигенных игр» шрифтом, который ни разу в жизни не видел дизайнера.
Но, чёрт возьми, я во всё это уже сыграл. Много, много раз. Я знал наизусть каждую миссию в Warcraft II. Я завоевал Арракис за каждый дом. Пиратский диск был выработан до последней еле живой shareware-демки. Интернета не было. Был мигающий курсор.
Тем временем у друзей появлялись всё более новые компьютеры. Мой отец не был большим любителем апгрейдов. Так что пока одноклассники играли в Half-Life и Red Alert 2, я получил апгрейд на 16 мегабайт памяти, который заметно ускорил мою Windows 95. Это был передний край технологий в нашем доме.
И я начал ковыряться в этой штуке.
dir. Ага, файлы. cd. Ага, папки. Что там в autoexec.bat? Почему компьютер пишет всё это при загрузке? Что будет, если это поменять? (Компьютер перестаёт загружаться. И вот ты в двенадцать лет учишься быстро чинить ЕДИНСТВЕННЫЙ компьютер в доме, пока отец не вернулся с работы. Господи. Вот это мотивация. Бэкапы? Не, не слышал.) Что такое debug.exe? Почему прямо тут лежит qbasic.exe и что он делает?
А потом кто-то дал мне книгу. Первая книга по программированию, которая у меня появилась, — Кип Ирвин, Assembly Language for Intel-Based Computers, третье издание. Не Паскаль, не Бейсик, не «Изучи C за 21 день» — ассемблер. Регистры, прерывания, int 21h, MASM. На той машине это выглядело совершенно естественно: между мной и железом почти ничего не было, так почему бы не начать сразу с железа? (Про этот первый язык я уже писал.)
Вот что люди забывают: это было возможно. Сто шестьдесят мегабайт. Один человек мог сесть и прочитать всё, что есть на этом компьютере. У каждого файла была причина существовать. Каждую директорию туда положил человек, и можно было понять зачем. Конфиги были текстом. Исполняемые файлы были достаточно маленькими, чтобы открыть их в hex-редакторе и разглядывать. Вся машина была конечным, познаваемым объектом, и скучающий ребёнок мог её изучить так же, как изучают лес за домом.
Вот так я и стал программистом. Не через курсы. Через скуку, машину, слишком слабую для новых игр, и книгу, которая случайно оказалась про ассемблер.
Сегодня так уже нельзя
Посадите ребёнка за современный компьютер и скажите ему: изучай.
Windows — это раздутая рекламная платформа, которая иногда запускает программы. Меню «Пуск» пытается вам что-то продать. Файловая система — лабиринт из AppData\Local\Packages\Microsoft.Something_8wekyb3d8bbwe, который не писал ни один человек и который ни один человек не понимает. Откройте любую папку в C:\Windows — там десять тысяч файлов без единого объяснения, и тронуть любой из них — отличный способ переустановить систему.
Linux лучше, но это уже и не тот Linux, который я изучал двадцать пять лет назад. Каждый раз, когда я туда заглядываю, что-то переехало. /etc сбросил половину содержимого в /usr/lib. ifconfig исчез. init превратился в дюжину unit-файлов. У каждого дистрибутива своё мнение о том, где что должно лежать, и это мнение меняется с каждым релизом. Взрослый сисадмин успевает за этим следить. Десятилетний ребёнок — нет.
macOS прячет файловую систему целиком и предпочла бы, чтобы вы вообще не спрашивали.
И у всех троих бесчеловечное количество интерфейсов. У современной ОС больше поверхности для настройки, чем один человек может прочитать за всю жизнь. Больше нет никакого «прочитай всё и пойми». Есть только «загугли текст ошибки и надейся».
Так что делает скучающий ребёнок? Он не изучает компьютер. Там нечего изучать. Он открывает браузер, браузер выдаёт ему бесконечную ленту коротких видео, а эта лента спроектирована очень умными людьми так, чтобы он больше никогда не скучал.
А скука была самой сутью. Именно скука заставила меня открыть autoexec.bat.
Так вот что я хочу построить
Дослушайте до конца.
KidDOS. Ненастоящий компьютер внутри вашего настоящего компьютера.
Это одно приложение. Работает на Mac, Windows, Linux. Запускаешь — оно разворачивается на весь экран, прячет всё остальное и показывает терминал, похожий на ЭЛТ-монитор, с мигающим курсором. Всё. Никаких окон, никакой мыши, никакого интернета. Только приглашение командной строки.
Ребёнок печатает hi. Машина здоровается в ответ. А потом говорит: напиши help, если хочешь узнать, что я умею.
kidos:~$ hi
Hi! I'm a computer. I'm small, and you can learn all of me.
Type help if you want to know what I can do.
kidos:~$ help
You're in a folder called /home/kid. Folders hold files.
ls - show what's in this folder
cd - go into a folder
cat - read a file
man - read the manual for any command (try: man ls)
There's a letter for you. Try: cat welcome.txt
А вот как настоящая штука выглядит уже сегодня, прямо из сборки:

Под капотом — настоящий Unix-подобный шелл. ls, cd, cat, mkdir, rm, пайпы, перенаправления, man. Не DOS-команды, хоть я и называю это KidDOS — я хочу, чтобы мышечная память переносилась. Ребёнок, проведший год в KidDOS, должен открыть настоящий терминал и почувствовать себя как дома.
У него свой виртуальный жёсткий диск. Ребёнок может сделать rm -rf всему целиком, и единственным последствием будет урок. Сброс — одна кнопка в родительском режиме. Семейный ноутбук никогда не под угрозой, потому что KidDOS его не трогает: всё, что видит ребёнок, симулируется, а единственный мостик в настоящую ОС — крошечный белый список: произнести текст вслух, пикнуть, сказать время.
И да, echo "I am a robot" > /dev/speaker заставляет компьютер говорить. Одна эта строчка займёт семилетку на час. Это и есть крючок.
Он растёт вместе с ребёнком
Вот та часть, от которой я в наибольшем восторге.
Семилетка получает шелл и текстовый квест, где комнаты — это папки, а предметы — файлы. Он выучивает cd и cat, не подозревая, что чему-то учится.
Девятилетка получает Бейсик. PRINT, INPUT, FOR. Игры на машине — змейка, тетрис, угадай число — написаны на Бейсике, и исходники лежат прямо тут. cat snake.bas. Поменяй скорость. Поменяй цвет. Сломай. Почини. Каждая игра — листинг, из которого можно воровать, как все мы воровали из листингов на последних страницах журналов.
Одиннадцатилетка получает cc. Настоящий C, скомпилированный в WebAssembly и запущенный в песочнице, так что while(1) не вешает машину, а кривой указатель не роняет ничего, кроме собственной программы ребёнка. Go и Паскаль — так же.
Тринадцатилетка получает что-то похожее на ассемблер. Крошечный ненастоящий процессор с горсткой регистров и просмотрщиком памяти, чтобы «что компьютер вообще делает» перестало быть загадкой.
А если ребёнок настолько умён, настолько любопытен, настолько перерос песочницу — есть дверь. Способ вырваться из KidDOS в настоящую операционную систему. Заслуженный, а не подаренный. Потому что на этом этапе настоящая система — ровно то, что ему и нужно изучать, и он уже будет знать как.
vi в начале даже не установлен. Его открываешь, пройдя игру, которая учит hjkl как заклинаниям перемещения. По-моему, это лучшая идея во всём дизайне, и я хочу увидеть лицо ребёнка, когда появится /bin/vi.
Почему бы просто не дать им Raspberry Pi с Linux?
Потому что я пробовал эквивалент, и это не работает. У настоящей ОС слишком много выходов. Ребёнок находит браузер за десять минут. В файловой системе десять тысяч файлов, которые ничего не значат. Сообщения об ошибках написаны для сисадминов. Внутри машины нет никого, кто сказал бы: «ты создал папку! теперь зайди в неё».
KidDOS маленький намеренно. Каждый файл в нём положен человеком по какой-то причине, и ребёнок может эту причину прочитать. Это компьютер по размеру человека — одного человека, маленького, у которого есть свободное время.
О чём я вас прошу
У меня есть план. Rust, виртуальная файловая система, встроенный Бейсик, wasmtime для компилируемых языков, формат картриджей, чтобы игры были просто папками, которые кидаешь внутрь. Этапы расписаны.
И вот что я чуть не забыл сказать: это не просто план. Оно уже построено. Первые два этапа готовы, и код лежит в открытом доступе прямо сейчас: github.com/nurked/kiddos. Шелл, виртуальный диск, мануал, двенадцать уроков с наставником, который следит за тем, что ты печатаешь, edit, Бейсик и семь картриджей — пещерный квест, угадай число, змейка, виселица, тренажёр печати, тетрис и сокобан, всё на Бейсике, который ребёнок может прочитать и поменять. Установщиков пока нет, так что нужен Rust на машине, а дальше одна строчка:
git clone https://github.com/nurked/kiddos
cd kiddos
cargo run --release -p kiddos
Напишите hi. Всё. Вы внутри.
С тех пор у проекта появился свой дом: kiddos.dev, с подписанными сборками для Mac, Windows и Linux, страницей для родителей о том, как выйти из полноэкранного режима, и педагогической частью аргумента, написанной как следует (по-английски).
Но сразу хочу извиниться: большая часть этого репозитория написана с помощью ИИ. Это первый, очень сырой прототип, доказательство концепции, а не готовая вещь. Сюжетные линии, диалоги, мелкие детали, из-за которых кажется, что внутри машины кто-то есть, — всё это требует ОЧЕНЬ много ручной работы, и я это полностью признаю. Читайте его как набросок идеи, а не как идею, сделанную правильно.
Чего я не знаю — нужно ли это кому-нибудь, кроме меня.
Поэтому я спрашиваю людей, которым не всё равно, как учить детей программировать, — тех, кто учился так же, как я, на маленькой машине, на которой нечем было заняться:
Это хорошая идея?
Вы бы посадили за это своего ребёнка?
Вы бы склонировали, запустили и рассказали мне, что из этого вышло?
Если ответ «да» — скажите мне. Если ответ «это уже существует и называется X» — тоже скажите, я лучше воспользуюсь готовым, чем буду строить своё. А если ответ «это ностальгия, и сегодняшним детям ничего из этого не нужно» — я хотел бы услышать этот аргумент в нормальном виде, потому что хорошей версии его я пока не слышал.
Комментарии открыты ниже — они работают через GitHub.
Читать дальше
Похожие посты
Код всегда ничего не стоил
Сорок лет мы делали вид, что софт — это товар. SaaS сдвинул цену на сервис. ИИ сдвинул её ниже нуля. Артефакт бесплатен. Платят теперь за понимание, какой именно код стоит писать.
Почему я всё ещё не верю в ИИ
Взгляд программиста на хайп вокруг ИИ: система, которую нужно постоянно нянчить, — это не рабочая система. А «ИИ везде» — просто ещё одна форма глупости.
Код теперь пишет себя сам — только не спрашивай, почему он работает
Никто на самом деле больше не пишет свой код — его пишет LLM. И это нормально. Пусть она и разгребает бойлерплейт, а мы перестанем делать вид, что улучшаем JavaScript.