Как я вырос без Кодабры
Двадцать лет назад я написал первую строчку кода: 10 CLS
. Именно так, не здороваясь с миром и не представляя, что меня ждет, я ввел следом RUN
и электронная машина также бесцеремонно бросила мне первый вызов, стерев все на экране телевизора с насмешкой «ОК». Я был удивлен, но не тому, что могу приказать машине что-то сделать, а тому, что она может мне отвечать. Мне было 7, и это история о непростых отношениях ребенка с компьютером, через призму лет глазами состоявшегося программиста.
Ко времени написания первой программы, я был уже «продвинутым пользователем» бытовой электроникой в доме. Как известно любому ребенку, если что-то имеет кнопки или ручки, то эти кнопки должны быть непременно нажаты, а ручки выкручены до упора. К счастью, мне никто не запрещал заниматься этим вволю и, как и ожидалось, однажды ручек стало недостаточно и в ход пошли болты и шурупы, явив моему взору чудесный мир печатных плат и микросхем. Отец явно одобрял мои наклонности разбирать все подряд и попытался научить меня еще и собирать эти вещи обратно, преподавая основы радиотехники на практике. Мне нравилось паять и собирать простые устройства, но большого успеха я тут не достиг. Физический мир выглядел слишком уж скучно по сравнению с появившейся у меня в то время игровой приставкой Dendy. И здесь я достиг поистине выдающихся успехов.
Важным вкладом игр в развитие компьютерных навыков у ребенка, на мой взгляд, является необходимость постоянного взаимодействия с разными пользовательскими интерфейсами, которые, в отличие от компьютерных программ, во всех играх разные, но выполняют стандартные функции. Это быстро развивает «компьютерную смекалку», подсознательно выделяя те или иные общие шаблоны (например, настройки игры), позволяя со временем достаточно быстро ориентироваться даже на незнакомом экране. И, конечно же, кнопки. Освоив геймпад, ребенок без труда освоит и любую клавиатуру.
Я тратил на приставку почти все свободное время, которое выделяли мне родители на телевизор. Нетрудно понять, что увлечь ребенка чем-то другим, когда у него есть игры, задача не из легких. Но однажды родителям удалось провернуть поистине грандиозную уловку, купив для меня «Обучающий компьютер Сюбор». Особенностью этого устройства было то, что он обладал полноразмерной клавиатурой IBM, являясь по факту тем же Dendy в комплекте с «обучающим картриджем», на котором было записано несколько программ, поддерживающих ввод с этой клавиатуры. Ностальгирующий читатель может перейти по ссылке на сайт «Железные призраки прошлого», чтобы вспомнить эту легендарную приставку. Программы на «обучающем картридже» хоть и были не слишком хорошего качества, но включали в себя целых два интерпретатора языка программирования Basic. Один назывался «G-BASIC», а второй «F-BASIC». Сейчас мне известно, что это были сильно урезанные клоны Famicom BASIC и Applesoft Basic соответственно. Документация по «F-BASIC» отсутствовала практически полностью, поэтому сколь-нибудь освоить его мне не удалось. «G-BASIC» же оказался достаточно интересной вещью, потому что содержал в себе редактор графики на основе паттернов, словно вырезанных из какой-то версии «Марио» и набор встроенных спрайтов из того же «Марио», которые можно было перемещать и анимировать с помощью кода. Иными словами, на нем можно было написать целую игру!
фото 20 ВЕК
К сожалению, это оказалось не совсем правдой. Я научился перемещать спрайты по экрану достаточно быстро, графический редактор тоже не составил каких-либо проблем. Вдоволь наигравшись с примерами из прилагающейся книги, мне захотелось создать свою собственную интерпретацию любимой в то время игры «Green Beret» (известной также как «Rush«n Attack») и тут пришло первое разочарование — нарисовать свой собственный спрайт было нельзя, оператор SPRITE
работал только со встроенными спрайтами. Марио и его друзья, по очевидным причинам, никак не подходили на роли в игре о вооруженном противостоянии СССР и США. Проявив смекалку, я попытался нарисовать «спецназовца» с помощью ASCII-символов, но эта идея была заведомо провальной. В тот момент «cюбор» практически умер для меня. От безысходности и временного отсутствия новых игр на Dendy, пришлось разобраться с циклами, вводом с клавиатуры и написать программы для решения школьных примеров по математике. К окончанию первого класса школы для меня остались только два загадочных оператора бейсика — РОКE
и РЕЕК
, которые были предназначены для записи и чтения данных из памяти. Подсознательно я чувствовал в них какой-то огромный потенциал, так как все еще не оставлял идею нарисовать собственный спрайт и верил в чудо. Но практически полное отсутствие документации и авторитетной помощи сыграли свою роль, и я так и не смог найти реального применения этим операторам, хотя и научился читать память по произвольному адресу и даже мог заставить приставку перезагрузиться, записав что-нибудь в небезопасную область памяти.
Рассуждая сейчас о роли «сюбора» в моем становлении, как программиста, я не придаю ему большого значения. Было трудно воспринимать его, как что-то большее, чем просто очередную игру, при этом не слишком хорошо сделанную. Это был первый опыт встречи с плохим ПО, но он дал толчок к исследованию вопроса, ведь мне тогда уже было известно о «взрослых» компьютерах и на что они способны по сравнению с моим «сюбором». Я читал отцовские журналы «Радио», пролистывая все статьи об электронике и залипая на распечатках 16-ричных дампов программ для микроконтроллеров. Понять было ничего невозможно, но я бы в то время многое отдал за компьютер, в который эти дампы хотя бы можно было вводить.
Моя мечта сбылась аккурат под новый год, но весьма странным образом. Вместо IBM PC/XT c большим монитором и дисководом, я получил невзрачную коробку с очередной «клавиатурой» внутри под названием «Бытовой компьютер Компаньон-2».
«Компаньон» был российским клоном популярного раньше ZX Spectrum, обладал 48 кб оперативной памяти, интерфейсами для подключения джойстиков и магнитофона для сохранения и загрузки данных с магнитной ленты. Как и игровую приставку, его нужно было подключать к телевизору, либо к специальному монитору, которого у меня, конечно, не было. Пришлось повозиться с подключением к телевизору (ТВ-выход на моей модели компьютера оказался сломан), сделать кабель для RGB-интерфейса и найти подходящий магнитофон. И вот спустя какое-то время, экран заморгал приветственным курсором Sinclair BASIC. Бонусом к компьютеру мне досталась замечательная книжка «Как написать игру для ZX Spectrum» и парочка кассет с играми, поэтому к моменту первого успешного включения компьютера, я уже знал, что надо делать. Конечно же запускать игры.
фото Retro Tresaures
Спустя несколько дней отчаянного перематывания кассет и бесконечного ожидания загрузки больших игр под звуки записанных на пленке нулей и единиц, мчащихся на скорости 1535 бод прямиком в ОЗУ моего компьютера, я осознал, что все игры на «спектруме» абсолютно никчемны по сравнению с Dendy. Эта ситуация вновь оставила меня один на один с бейсиком.
В отличие от «сюбора» с его игрушечным программированием, здесь язык был полноценным, не привязанным к дурацкой графике из «Марио» и с раза в два большим количеством операторов. Пропорционально возможностям, выросла и сложность, а вместе с ней и интерес. Я отлично понимал, что сейчас меня ограничивают только мои собственные знания и навыки, а не сама машина, поэтому пришлось подойти к делу серьезно. Моей целью все еще было написать собственную игру.
Первым делом мне нужны были спрайты и, так как описанной в книге программы «Art Studio» для рисования графики у меня не было, пришлось вооружиться тетрадкой в клеточку. Я поклеточно рисовал нужные спрайты, а потом переносил их на экран через код. Это была поразительно монотонная и сложная работа, в которой очень легко было ошибиться. Но результат был виден сразу и это очень воодушевило. На данном этапе мне даже не требовалось сохранять свои программы, потому что они были «зарисованы» у меня в тетрадке, а я каждый раз набирал код заново, чтобы привыкнуть к новой клавиатуре. На «спектруме» почти все команды бейсика были написаны прямо на клавишах и, обычно, на набор одной команды требовалось только одно нажатие.
Спустя пару недель и тетрадок у меня были спрайты «спецназовца», «врагов», и некоторых декораций. Я даже придумал название для игры, пока рисовал — «Солдат удачи». Суть была стандартная — убить всех врагов. Игрок мог управлять героем и стрелять с помощью джойстика, а враги двигались в хаотичном порядке, пытаясь поразить героя врукопашную. Дополнительную сложность вносили декорации в виде «джунглей», через которые нельзя было пройти и не пролетали пули.
Научить «спецназовца» ходить оказалось простой задачей, код для этого не сильно отличался от «сюборовского», который я уже знал. А вот с врагами возникла первая сложная задача в моей программистской практике. Передвигать спрайты в полностью рандомных направлениях было легко, но от этого игра приобретала слишком уж непредсказуемый характер, не говоря уже о том, что врагам было совершенно наплевать на героя. Пришлось изобретать некое подобие «искусственного интеллекта» для врагов, чтобы играть было интересно. За этим занятием я провел много месяцев, постоянно экспериментируя и меняя логику программы. Чем больше становилась моя программа, тем больше неудобств стал доставлять бейсик с его бесконечными GO TO
и PAUSE
. Однажды мне удалось достать вторую книгу из серии «Как написать игру для ZX Spectrum», которая называлась «Как написать игру на ассемблере для ZX Spectrum». Это был настоящий хардкор для детских мозгов, но я зачитывался, поражаясь возможностям, которые предоставлял язык ассемблера ZX80.
Была одна проблемка. У меня не было программы транслятора ассемблера и я не мог сразу же практиковаться, читая книгу. Зато у меня был бейсик и те самые POKE
и PEEK
, весь потенциал которых я смог осознать только сейчас. Я погрузился в мир памяти, адресов и непредсказуемых последствий. Предостережения в книге о том, что не стоит записывать что попало по адресам, назначение которых не знаешь, меня не слишком останавливали. Первым делом я занялся экспериментами с т.н. «системными переменными» — адресами в памяти, по которым хранились данные для «операционной системы», касающиеся всех сторон жизни компьютера, от клавиатуры до монитора. Из бейсика это было просто, например, вводишь РОКЕ 23659,0
— и в твоем распоряжении уже весь экран, без системного окна! Стоит ли говорить, насколько улучшилась моя игра после добавления в нее тех возможностей, что давали «системные переменные»? Но помнить адреса и числовые значения, которые можно туда писать, совсем неудобно, не говоря уже о том, что я представить себе не мог, как будут работать примеры ассемблерного кода из книги. Тогда у меня родилась безумная идея — написать транслятор самому. Точнее, я понял, что занимаюсь написанием транслятора ассемблера, гораздо позже, чем приступил к этому. Просто у меня была таблица ассемблерных мнемоник и соответствующих им шестнадцатеричных кодов и я подумал, почему бы не написать программу для перевода из одного в другое, ведь с 16-ричными числами в бейсике я уже умел обращаться.
Скриншот Viva Games
Чем больше я погружался в мир ассемблера, тем больше понимал, как же на самом деле работает мой компьютер и почему он работает именно так, а не иначе. За этим занятием пролетели годы, спустя которые у меня появился «настоящий» компьютер на x86, открыв собой новые горизонты познания. Теперь, благодаря «спекки», я уже точно знал, что с ним делать.
Оглядываясь сейчас на свой первый опыт программирования и на Basic, как первый язык, я не совсем уверен в его положительной оценке. Начиная изучать «большие» языки программирования, я столкнулся с определенными проблемами, вызванными привычкой думать в терминах строк и безусловных переходов, переучиваться было немного мучительно. С ассемблером же ситуация более ясная. Хотя архитектуры x86 и Z80 имеют между собой довольно мало общего, но основополагающие принципы не меняются и эти знания до сих пор помогают мне даже при программировании на языках высокого уровня, так что здесь я совершенно точно не прогадал.
Как вы понимаете, мой путь в программирование едва ли можно назвать стандартным, даже для 90-х годов, в основном из-за специфики оборудования, на котором приходилось учиться. Ведь в то время в России уже были распространены компьютеры на базе x86 и многие мои знакомые программисты начинали свой путь именно на них, не испытывая необходимости в буквальном смысле «ковырять железо» в поисках необходимой функции и писать самому себе редакторы кода. Размышляя над этим, я задаюсь вопросом о современных детях и о том, как изучают программирование они сейчас, спустя почти 50 лет безудержного развития компьютерной техники и проникновения компьютеров буквально во все сферы человеческой жизни. По счастливой случайности, на жизненном пути мне встретились хорошие ребята из «Кодабры», которые и раскрыли некоторые секреты из жизни современных школьников.
Для начала о школе. В мои времена уроки «информатики» в школе выглядели весьма печально, в основном из-за отсутствия действительно компетентных преподавателей и оборудования. Мне было там скучно, а одноклассники просто валяли дурака от того, что ничего не понимали. Чего стоит только программирование в тетрадках. Кто только мог придумать такую глупость? Программирование и компьютеры неразрывно связаны. Можно выполнять код в уме и можно записывать его маркером на окне, но только когда ты уже точно знаешь, как он работает в компьютере, а для этого, естественно, нужен сам компьютер. К счастью, сейчас таких проблем не осталось даже, наверное, в самых отдаленных частях нашей страны. Дети начинают изучать компьютер практически с начальных классов и даже если у них нет дома своего, к 7 классу они все равно станут теми самыми «Операторами ПК». А дальше уже начинается настоящая информатика, качество которой, как и в мои времена, сильно зависит от преподавателя и школы.
У «Кодабры», конечно, таких проблем не бывает, так как все ее преподаватели сами являются профессиональными программистами и строят свои уроки на практике. Я не был удивлен, узнав, что и сейчас самое эффективное преподавание программирования для детей, строится на играх. С появлением Unity, это занятие стало еще более дружелюбным и интересным, а главное, без бейсика — тут для занятий используется С#. Хотя мне сейчас и не приходится часто использовать C# в работе, но нельзя не признать, что на текущий момент это один из весьма удачно спроектированных современных языков программирования. Он не очень подходит для обучения азам, но это и не требуется. Для детей помладше практикуются визуальные языки программирования, такие как Scratch. Визуальное программирование — превосходная идея для знакомства с базовыми понятиями в программировании, такими как переменная, условие или цикл, а еще там можно рисовать цветные спрайты!
Немного жаль, что низкоуровневые вещи в последние годы все чаще опускаются при обучении программированию либо рассматриваются по верхам, ведь двигаться с высокого уровня к низкому гораздо сложнее, чем наоборот. Но стремительно набирающие популярность, в том числе и в школьных кругах, Arduino, Raspberry Pi и растущий с каждым днем «интернет вещей», обещают скоро изменить ситуацию в лучшую сторону. При правильном подходе, Arduino может стать «вторым спектрумом» для ребенка, подарить бесценные в будущем знания и занять на множество увлекательных часов.
Я желаю «Кодабре» поскорее создать курсы по низкоуровневому программированию и железу для детей, и приглашаю хабравчан посетить «Фестиваль цифрового творчества
для детей и подростков Digitalfest» 4 декабря, на котором будет в том числе и секция, посвященная интернету вещей и робототехнике, на которых можно познакомить ребенка с не совсем стандартными компьютерами.
Комментарии (4)
28 ноября 2016 в 23:00
0↑
↓
Страшно подумать, я только к 8–9 классу осваивал Бейсик, Visual Basic и Pascal. И тоже нужно было программировать в тетрадках.28 ноября 2016 в 23:15
0↑
↓
нарисовать свой собственный спрайт было нельзя, оператор SPRITE работал только со встроенными спрайтами.
Собственный спрайт можно было нарисовать через poke или call. Точно не помню.
А еще можно было припаять батарейку-таблетку к картриджу и программа сохранялась после вынимания картриджа. Главное выйти из редактора командой system.28 ноября 2016 в 23:45
0↑
↓
Собственный спрайт можно было нарисовать через poke или call. Точно не помню.
Через прямые обращения к памяти, наверняка, можно было рисовать, но в документации это никак не было освещено, да и сама структура памяти мне была неизвестна.А еще можно было припаять батарейку-таблетку к картриджу и программа сохранялась после вынимания картриджа.
Очень интересно, не могли бы вы вспомнить подробности этой операции? Мой картридж внутри ничем не отличался от обычных картриджей с играми для Dendy, поэтому я не представляю, каким образом это можно было сделать. Возможность использования батарейки для сохранений была в некоторых оригинальных картриджах NES, но на Dendy, насколько мне известно, такого никогда не наблюдалось.
28 ноября 2016 в 23:36
0↑
↓
Гы! Спасибо!!! :)Как сейчас помню…
10 CLS
20 INPUT A, B
30 C = A * B
40 PRINT C
50 ENDПоследние 25 лет я не только не думал, что когда-нибудь снова напишу эти строки, но и не подозревал, что скупая слеза потечет по небритой щеке… :)