見出し画像

Desk開発日記#1 - Viscuitの開発ブログを読み漁ってDeskが何かわかった。

まずは背景から。
最近、Deskというソフトウェアを作っている。

コンセプトは以下の3つで、

・Minecraftのように直感的
・Rのように実用的
・Spreadsheetのように汎用的*1

わかりやすく言い換えれば、Minecraftのように多くの人が遊ぶことができ、かつ、R(統計解析などに使われるプログラム言語)のように専門家にも好んで使われるもので、かつ、Spreadsheet(ExcelやGoogle Sheets)のように業界や地域などを選ばず使われるソフトフェアということだ。核心をはぐらかしているようだが、Deskは「〇〇ができるソフトウェア」という表現の枠に嵌まらないと思っているのでコンセプト第一である(少なくともプログラミングができるソフトウェアにはなるはず)。

作る目的としては、学生時代からプログラミングをもっと楽しく誰でもできるものにしたいという気持ちがあって*2、最近やっと実現に必要な糸口を見つけられたような気がしたからだ。最終的な目標としては、人間の生活一般とプログラミングという行為の重なる領域を広げたい*3と思っている。

実際に開発も少しずつ進めていて、自然数同士の足し算ぐらいは計算できるようになっていたり、ものをドラッグして別のものにぶつけて作用反作用みたいなこともできるようになっている。
まだ何もできていないとも言える。

そして、Viscuitである。
先日Twitterを見ていて、Viscuitというビジュアルプログラミング言語の開発ブログの何かの記事をたまたま読んだ。その内容がかなり刺さったので、ビスケットのあれこれビスケット開発室から次々と自分に興味がありそうな記事を読んで、Viscuitというビジュアルプログラミング言語の素晴らしさやViscuit作者のプログラミングに対する思いに感銘を受けた。

それとともに自分がDeskで何をするべきなのかがやっと言語化できるようになった。正直、昨日まで自分でもDeskが何なのか、なぜ作らないといけないのかがあまり分かっておらず、Deskを作る社会的意義があると思うのは自分の思い込みの可能性もあると思っていた。


まずDeskを作る意義は、ビスケット開発室の同名の記事から言葉を借りれば「プログラミングの大衆化」である。もしくは、私の言葉で言うとプログラミングの生活化

プログラミングの外面の大衆化について、最近私が思っているのは抽象言語(というか言語)は人間には効率的かつ正確に操れないということだ。プログラミング言語をそのように操れるのはプログラミング言語に精通したプログラマだけだし、日本語についても日本語学者くらいだ。

自然言語は大衆、そう大衆👥が作っていくものだから、流れでこうやって書いていても、日本語素人である私が書いていてもあまり酷いことにはならない。それに対して、プログラミング言語はsyntaxなどがあらかじめ定義されているものがほとんどで、コンピュータが理解でき、実行できるように書く必要がある。それが辛い。

その解決策としては、ビットマップ時代のプログラミング言語 - ビスケット開発室に書かれているように「文字のプログラミングに対して,グラフィカルな皮をかぶせて使いやすく」するというのが良いだろう。VRやMRなどが普及したら、プログラミングをLEGOのように3D空間で触れたり動かしたりできるものにしても良いと思う。

ここで、私の信念を述べておくと、ビジュアルプログラミングの利益を得る主体の集合にはベテランプログラマの大部分も入ると思っている。特定の言語というよりもプログラミングという概念に精通しているのであれば、抽象的なコードのアイデアが頭の中に出てきた時、プログラミング言語に翻訳するよりも、そのまま絵のように描き出せる方が効率が良いはずである。

Deskのことを考える過程で有名なビジュアルプログラミング言語をいくつか調べてみたことがあったが、その中でも今回知ったViscuitは特に強力な方法を使っていると思った。

そのことはViscuitの中身について知るとわかる。Viscuitではメガネの左と右にそれぞれ絵を配置して絵の変化のルールを宣言的に表現する。疑似コードで手続き的に書くと以下のようになるはずだ。

if 似てる?(状態 と 左) {
  違い = 変化法則を考える (状態 から 左)
  ルール = 変化法則を考える (左 から 右)
  変化 = 変化法則の合成 (違い と ルール)
  新しい状態 = 状態を変える (状態 を 変化)
}

上記のような実装が大変そうなロジックがViscuitでは左右に絵を配置するだけでできるのである。

そして、疑似コードを見ればわかるようにViscuitが計算の対象にできるのは絵の配置だけでなく、「似てる?」「変化法則を考える」「変換法則の合成」「状態を変える」といった関数が実装可能なあらゆるデータ構造である。

またViscuit作者が提案されている Fuzzy Rewriting も強力である。上の疑似コードの「似てる?」のところを見てわかるように、Viscuitのメガネは完全一致ではなく似ているものに対して発火する。さらに、「変化法則の合成 (違い と ルール)」のところを見てわかるように左の絵と実際の絵の違いを見て変化のさせ方を変えている。これにより、少ないメガネだけで柔らかい振る舞いを実現できている。

また、読みやすさの観点でもViscuitは優れていると思う。Viscuitでテトリスを実装した例を見てみるとここまで分かりやすく書かれたテトリスはないのではないかと思った。他のビジュアルプログラミング言語(ScratchBlueprint)でここまで分かりやすくテトリスを実装するのは難しいだろう。

以上を踏まえると以下のViscuitについての記述は控えめにも感じる。

ビスケットのメガネの形式というのは,今のプログラミングの主流からは外れているように思われがちですが,IoT時代の家庭レベルのプログラミングではこのメガネ形式の方が優れています.

ビスケットが本当のプログラミングではない,という誤解から,これを教えることを躊躇されがちですが,将来的にはこちらも十分重要な書き方なんだということは,一般の方に伝えてゆきたいと思います.

ビスケットの将来像 - ビスケット開発室


もともと考えていなかったが、Viscuitの開発ブログを読んでDeskに入れるべきだと思った要素として Programming by Example がある。今回初めて知った概念だったが、Deskが目指したい世界に近いので、それに似た仕組みは入れたいと思った。

その際には上の疑似コードのような差分計算形式だけではなく、Vimのマクロのような、コマンド形式のものも入れてみたい。

Vimというテキストエディタではマクロを記録開始した後に、普段やっているとおりにテキストを編集するとその操作自体が保存され、その操作を他の場所で使いまわすことができる。Viscuitで言えばメガネの左側に元となる絵を入れた後、右側でその絵を編集(移動、回転など)する。変換の際には左と右の差分を計算するのではなく、記録されている移動と回転を使うといったやり方である。

差分計算形式とコマンド形式でユーザーから見て起こることは同じだが、後者の方が、おそらく実装しやすい計算対象が多い。


最後に私がコンピュータについて考えている事について。
粘土というコンピュータ観 - ビスケット開発室という記事がある。その中でソフトウェアの性質として「粘土のように自由に簡単に変えられる」と「工場を通さずに直接製品化できる」の2つが挙げられている。これに大きな共感があり、表現も分かりやすいと思ったので、同じ語彙を使って自分のコンピュータに対する考えを言語化したい。

一言でいうと私は「粘土のように使用できる製品を粘土から作れることが重要だ」と考えている。思い返してみると、私がこれまでプログラミングの勉強を続けてきたのは、これをいつか実現できるはずと信じているためであった。

現在は、製品とユーザーの関係が硬直していると思う。製品は一般的には開発者によって実装された機能に閉じていて、欲しいと思った機能は提案することくらいしかできない。「粘土のように使用できる製品」とはその常識を破壊するものである。例えば、通話アプリで、右手をあげている時だけミュートするといった機能をユーザが簡単に実装できるといったものだ。

これにより、コンピュータは人々の手に戻ってくる。製品のユーザは機能を一方的に受け入れるのではなく、機能追加を通して世界と対話することができるようになる。

ただし、コンピュータが人々の手に戻ってくるというのは、まだ全体の半分だけだ。もう半分は何かというと「製品を粘土から作れること」だ。企業やソフトウェアエンジニアだけではなく、コンピュータを扱う全ての人が簡単に製品を作れるようにしたい。

こうなっちゃった理由は,コンピュータに課せられた役割が,これまでプログラムを作る人と使う人とが一体となっていた時代から,作る人と使う人とが明確に分かれた時代に変わってきたということなのかもしれません.

オブジェクト指向の問題点 - ビスケットのあれこれ

私がやりたいのは、上記記事で書かれている「作る人と使う人とが明確に分かれた時代に変わってきた」流れを逆転させたいということかもしれない。そのためには、Viscuitのようなやり方でプログラミングを生活化し、さらにソフトウェアエンジニアが大きくて複雑なシステムを作るときの考慮が自然と促される、もしくは必要なくなるような方法*4を考える必要があるだろう。

粘土のように使用できる製品を粘土から作れるようになることで「粘土のように自由に簡単に変えられる」と「工場を通さずに直接製品化できる」の両方が混ざりあって全ての人に開かれることになる。これを可能にするために私はDeskを作りたい。


脚注

*1: ここでいう”汎用的”は使い勝手とか難易度も含めた汎用的であり「Rustは汎用的なプログラミング言語である」の”汎用的”とは違う(もっと良い単語があったら教えてください)。なぜならRustは主にTech企業の開発部署でしか使われていないであろうからだ。

*2: もともとはゲームを遊ぶ誰もがゲームを拡張できるようにゲームを作りたいという気持ちだったが、その領域が広がっていった。

*3: 英語で言うなら、Embark Studiosのミッション"blur the line between playing and making"を真似て、"blur the line between living and programming"としたい。

*4: この点についてはいつか記事を書きたい。


この記事が気に入ったらサポートをしてみませんか?