Новые идеи могут прийти на ум программисту в любое время — например, на прогулке или в очереди. Для обмена идеями отлично подходят рабочие планерки. Какой-то комментарий сам по себе может быть странным или предсказуемым, но в нем попадется несколько фраз, которые привлекут мое внимание. Они смешаются с какими-то незаконченными мыслями и впечатлениями вчерашнего дня.
Оставшаяся на настольном компьютере среда разработки никогда не кажется такой далекой и такой тяжелой на подъем, как в те моменты, когда у тебя в голове задыхается и чахнет новая идея, которой нужен «глоток воздуха», чтобы заявить миру о своем существовании.
Если мы спешим, то можем хотя бы законсервировать идею — набросать ее на бумаге, пока ее помним, а потом вернуться к ней, когда будет время. Но иногда этот момент бывает упущен, искра гаснет, а вернуть ее не удается. Требуется снова искать пищу для ума. Правда, сегодня уже есть Twitter. Этот сервис не назовешь отличным инструментом для записи идей программиста, но Twitter отлично подходит для записи тех кратких мыслей и остроумных замечаний, которые в другой среде остаются неуслышанными и неоцененными.
Я думаю, что Twitter не менее удобен для записи коротких программ и кратких программинг-сессий, длящихся от тридцати секунд до нескольких минут. Подобную роль Twitter может играть и в социальных взаимодействиях: отслеживание программ, которые находятся в процессе разработки, обмен предложениями, опровержение, расширение, интеграция идей.
Под «повсеместным программированием» (Ubiquitous programming) я понимаю возможность программировать где угодно и когда угодно, даже в такие короткие свободные минутки. Термин указывает на связь такого подхода с более масштабным явлением «повсеместных вычислений». Конечно, термин «повсеместное программирование» впервые употребил не я, но мне нечасто приходится встречать людей, которые буквально понимают это выражение (а не как «программирование для систем, обеспечивающих повсеместные вычисления»).
В последнее время я не раз задумывался о повсеместном программировании, так как меня одолевали новые идеи. Некоторые из них я изложил в статье «Abadoning Commitment in HCI» и в дискуссии с группой программистов, занимающихся технологией дополнения пользовательского ввода.
Как бы то ни было, после приобретения смартфона я не раз задумывался, как можно использовать его для программирования. Идей почти не было, пока один приятель не объяснил мне интерпретацию интерпретации замечательной статьи Брета Виктора «Доступное программирование», в которой Виктор критикует излюбленный способ записи моего друга. Не подумайте, что он стал жаловаться: «Ой-ой, не трогайте мою нотацию!», он просто натолкнул меня на интересные мысли. Я стал размышлять: какой способ записи идеально подошел бы для повсеместного программирования?
Ручка, бумага и камера
Уже сама идея писать код на сенсорном экране смартфона мне неприятна. Даже когда я ввожу через тачскрин информацию на естественном языке, я чувствую себя скованным — визуально, физически, духовно, эмоционально. Ладони у меня большие, они закрывают экран, правильно поставить курсор удается не с первого раза. Еще часть экрана закрывает виртуальная клавиатура. Если бы мне пришлось впихнуть на такой экранчик окно IDE — предложения, аннотации, ссылки и т.д., — то совершенно не было бы места не то что для кода и комментариев, а даже для моих собственных мыслей. Планшет и ноутбук неудобны по другим причинам. Они довольно тяжелые, их нужно слишком долго готовить к работе, и, конечно, они не находятся рядом в тот самый момент, когда тебя озарила идея. У меня нет карманов, в которые влезал бы планшет, а если бы и были, не представляю, как можно удобно усесться с такими карманищами.
Но когда я подумал об очках, они показались мне интересным вариантом
В очках для дополненной реальности есть встроенная камера, которая «видит» то же, что и я. Если я смотрю на код, то могу тут же загрузить этот код в программу. То же самое можно сделать и при помощи камеры смартфона: сфотографировать сделанные наброски. Тогда первое грубое редактирование можно выполнять уже не на экране. Достаточно иметь с собой небольшую стопку простой бумаги и ручку, эти вещи легко носить в кармане или кошельке. А более запасливый человек может носить с собой даже общую тетрадь или блокнот в переплете.
Ручка, бумага и камера становятся основными устройствами ввода. «Носитель» программы — бумага — может быть и большим, и маленьким, смотря как его сложить. Тонкая ручка — гораздо более удобное устройство ввода, чем палец. Кстати, возможно, кому-то будет удобнее работать карандашом.
Если выполнять редактирование на бумаге, то экран смартфона остается свободен для более сложных аспектов разработки: аннотаций, предложений, запросов на разъяснение, предупреждений, ошибок, выстраивания взаимосвязей с другими программами. При работе с очками подобные элементы могут отображаться в наложенном слое или на периферии.
Модульность, связывание, совместное использование
В таком случае мы не сможем напрямую подключать подпрограммы, которые пишутся на других «холстах». Допустим, мы записали их на других листах блокнота, которые не хотим вырывать. Соответственно, межпрограммные взаимосвязи также выстраиваются в виртуальном пространстве. Автор нарисует нужную связь на бумаге — например, начертив прямоугольник или добавив немного контекста (скажем, заголовок или другая надпись, может быть, дата, номер версии и имя автора). Имея такое представление в качестве подсказки, а также менее явные подсказки (это может быть история просмотренных автором программ), мы сможем отобразить на телефоне или в очках существенное количество вариантов.
Выбирая варианты, выстраивая взаимосвязи, мы превращаем программу в нечто большее, чем просто наброски на бумаге. Получается более значимая, точная, логичная, правильная, интегрированная сущность. Разработка и редактирование превращаются в смешанную картину, состоящую из виртуальных операций и реальных дополнений (а иногда и сокращений — допустим, нам потребовалось стереть или зачеркнуть элемент). Фактически программа — это виртуальный объект, поддерживаемый в среде программирования. Программу желательно располагать в облаке (общедоступном или закрытом) и синхронизировать с локальным хранилищем данных (на случай неожиданного вылета в оффлайн). Программа останется таким объектом, если не будет повреждена и до тех пор, пока она будет доступна для понимания. Виртуальные программы индексируются по многим показателям: автор, дата, местоположение, содержание, комментарии, взаимосвязи, история и прочая визуальная информация, находящаяся «на кончиках пальцев».
Если у вас есть доступ «только для чтения» к моему облаку, я могу дать вам блокнот, и вы сможете читать программы. Не только рассматривать мою полуразборчивую писанину, но и улавливать связи, читать разъяснения. Моя библиотека станет для вас досягаема. Повсеместное программирование предполагает совместное использование именно таким чудесным осязаемым образом, напоминающим обмен книгами. Разумеется, вы сможете воспользоваться и методом «электронной книги», просматривая облако непосредственно с экрана. Но это, пожалуй, будет намного менее удобно.
Схемы и заметки в произвольной форме
Современное программирование — это в первую очередь написание текста, так как именно текст набирается на клавиатуре. Для ввода в произвольном формате можно использовать мышь, но мне это показалось довольно неудобным. А вот работая с ручкой и бумагой, мы можем рисовать какие угодно графики, схемы, стрелки, функциональные кривые, наброски (символы, карты, взаимодействия), специальные математические символы и т.д.
Это особая свобода, которая и привлекает меня возможностью делать наброски параллельно с обдумыванием идей. Я охотно покупаю общие тетради, наборы ручек, с которыми хожу и в парк, и в ресторан. Мне уже зачастую нелегко вернуться к написанию программ обычным негибким текстом.
Мне нравится делать наброски, заметки на полях. Я объединяю идеи. Я не в восторге от структурных редакторов, а вот совершенно «неструктурированное» редактируемое пространство, в котором можно представить хорошо структурированный объект виртуальной программы (при помощи объяснений и ограничивающих условий), очень меня привлекает.
Не только текст
Обычно мои наброски из рабочих тетрадей превращаются в путаные обрывки информации, к которым я никогда не возвращаюсь (они мне просто не нужны после того, как я полностью усвою записанные в них концепции). Но если бы все эти эскизы, наброски, схемы и прочая информация индексировалась, становилась доступной для поиска, изучения, воспроизводилась на носителе, который не горит, то это значительно обогатило бы текстовую информацию (не обязательно связанную с программированием). Часто на рабочих собраниях люди фотографируют схемы, сделанные на маркерных досках. Почему всю эту информацию никто еще не сохраняет и не индексирует? Есть ли в наличии подходящий для этого инструмент? Дарю идею для революционного приложения, которое озолотит своего создателя, — развивайте!
REPL, виджеты, живой кодинг
Независимо от того, работаем ли мы с умными очками или камерой, наши программы, написанные на бумаги, будут отличаться высокой интерактивностью. В частности, это касается вычисления выражений. Как записать серию выражений и сразу же узнать их значения? Запросто, если программа создается ручкой на бумаге.
Интересная возможность связана с развитием концепции REPL-среды полнофункциональных виджетов. Выражение должно результировать не в обычную величину, а в осязаемое значение, или оголенный объект, или в подобную сущность, которую можно представить в виде виджета, наблюдать ее и манипулировать ею. В частности, такие виджеты могли бы управляться голосом или жестами.
Виджеты, разработанные таким образом, могут управлять состоянием в реальных системах и оказаться удобной основой для повсеместных человеко-компьютерных взаимодействий (HCI). Открываем блокнот на нужной странице. Настраиваем несколько необходимых виртуальных ползунков и флажков. Берем чистый лист бумаги и записываем на нем несколько программ или ссылок на них. Загоняем это в нашу среду разработки — всё, виджет готов.
Понятие «живого кодинга» противоречит повсеместному программированию, но я считаю, что две эти методики могут хорошо взаимодействовать на стыке программирования и человеко-компьютерных взаимодействий: при разработке таких виджетов и REPL-сред.
Как максимально эффективно использовать цвет?
Программируя ручкой на бумаге, мы теряем подсветку синтаксиса. Разработчики, которые не желают от нее отказываться, могут воспользоваться разноцветными ручками или цветными карандашами. Но при повсеместном программировании, как и в повсеместных вычислениях, я не склонен использовать семантический цвет как минимум по шести причинам:
- если у цветов разная семантика, то перед наброском идеи требуется тратить драгоценное время на сортировку карандашей;
- при использовании нескольких цветов потребуется носить с собой гораздо больше карандашей или ручек, такое количество может не уместиться в кармане;
- чем проще контрастность, тем лучше ее будут обрабатывать алгоритмы машинного зрения;
- с цветами неудобно работать при изменяющемся освещении (особенно при необычном, например, неоновом свете);
- в повсеместном программировании/HCI могут прижиться невидимые ссылки (инфракрасные, ультрафиолетовые, использующие дифракцию на кристаллах), но обычно таким ссылкам не хватает гибкости при представлении цветовой информации;
- чем проще контрастность, тем более повсеместным получается программирование
Тем не менее цветовые возможности могут найти применение в чуть более сложном подручном программировании или компиляции.
Что дальше
Думаю, повсеместное программирование при помощи ручки и бумаги — многообещающая и интересная возможность, которую можно реализовать уже сегодня. При такой работе предпочтительно было бы использовать умные очки (особенно при работе стоя или в движении), но смартфоны более распространены, доступны и лучше подойдут для начала. Существующие сегодня алгоритмы машинного зрения в принципе достаточно совершенны для достижения этой цели. Нужное для работы облако также несложно реализовать (предпочтительно на базе свободного ПО).
Здесь я не затронул еще одного аспекта, необходимого для реализации этой модели, — речь об интеграции такого гибкого синтаксиса с моделью программирования. При этом можно обойтись и без протокола RDP (хотя я бы только приветствовал это). Несколько лет назад я много размышлял о синтаксисе и пришел к выводу, что его стоило бы упростить по максимуму, ради сохранения статического восприятия кода.
Интересно, может ли какой-либо подход, связанный с пользовательским синтаксисом, помочь развить специализированный визуальный и схематический синтаксис. Объединив такой подход с применением виртуального объекта программы, мы сможем значительно отложить выстраивание синтаксиса. Достаточно начать писать, а синтаксис разъяснить уже потом (ведь синтаксис — это просто еще один вид связей внутри программы!).
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.