2020-05-09

最初に作ったプログラム

「自分が最初に作ったプログラム」のことを最近よく考える。

どれをデビュー作と考えれば良いのか自分でもよく分からない。写経や試行錯誤を試みつつ完成に至らなかったもの、完成はしたが自分が使うのみで誰にも配布していないもの、商用か否か、売上の有無、どこまでをノーカンとしどれをデビュー作とすべきなのか基準が難しい。「プログラムに触った」が条件であればおそらく8歳が最初だが完成していないので多分ノーカンだ。思索はいつも堂々巡りなのだが、せっかくなので軽くまとめてみたい。

N88-日本語BASICでベーマガをひたすら写経

8歳くらいの頃にだいぶ頑張った記憶がある。

「平安京エイリアン」がベーマガに記載されており、動かしてみたいと思い写経した。手元のマシンはPC-98だったがプログラムはPC-88用だった。動かないかもと覚悟しながら写経を開始し、予想通り動かないのだが自分のプロラムミスが原因なのか機種のせいなのか分からない。typoを見つけるたびに「今度こそ!」と直し実行、やはり動かない、繰り返し。何が楽しかったのかサッパリ解らないが、エラーメッセージが変わる度に「ゴールに近づいた?」と嬉しかった記憶はある。

挫折したしばらく後、前回の機種違いの反省を活かしPC-98対応を慎重に選び別作にチャレンジした。同じくベーマガだが「シューティングスター」というタイトルを覚えている。

どうして覚えているのかと言うと、コードをファイルに保存する際「シュティングスター」ではなく「シュティングスター」と保存してしまったことがあり、後で父(当時プログラマーだった)にこっぴどく叱られたからだ。 「どちらのファイルが新しいんだ?」「双方をバラバラに更新してないか?」とかなり注意された記憶がある。

遊びでやってることに対して、どうしてこんなに怒るのだろうと子供心に釈然としなかった。そして数十年後の自分は「commit汚い!」と他人を注意し、そのようなミスの場合たとえ相手が子供であっても少なからず苛立ちを見せてしまうだろう。職業プログラマーはこの手のミスには敏感だ。とはいえ子供や初心者はそれより手前で頑張ってるのだから堪えてやるべきだ。数十年前の父と今の自分へ言い聞かせてやりたい。

ところでこの文章を書きながら気づいたのだが を間違えたということは、当時はカナ入力で日本語を書いていたのか。それ以前に半角カナファイル名か。今なら気が狂う気がする。

プログラム言語に初めて触れたのはこの辺りだと思うが、共に完成していない。たぶんノーカン。

Mathematicaでグラフをひたすら描画

これもノーカンのような気がするが、プログラムに ハマってしまった 原体験はここだ。

中学高校の頃は数学が好きだった。代数・幾何で扱われる美しい関数やグラフに魅了された。単純な図形であれば二次平面や三次空間に数式からプロットできる、式を操作すると図形を変形させられる、行列、写像、音と周波数、倍音との合成、身の回りのあらゆる事象と数式とが相互に変換できることを知り興奮を覚えた。

ところが式をプロットする手段が無い。周波数の近い2つの音を合成するとうねりのような音が聞こえる、周期が微妙に異なる2つの三角関数の和は別の新たな周期を持つ、共に難しくもない知識だがグラフで図示するのはかなり面倒だ。三角関数表と電卓を駆使し手書きで延々プロットしたりもしたが、二度とやりたくなかった。

通っていた予備校の教師に課題のプリントにやたら綺麗なグラフを印刷してくる方がいた。休み時間に「どうやってグラフを描いているのか?」と聞きに行った。「来週までに返してね」と言い机上のPCからフロッピーディスクを取り出し渡してくれた。Mathematica というソフトだった。使い方はよく分からなかったが数式を入力すればグラフが表示されることは分かった。丸3日くらいひたすら数式を作り続けた記憶がある。三次空間の手書きでの描画は(少なくとも自分の絵心では)無理だったので、ソフトでそれを行えるようになったのは感動だった。

MIDIデータ入力支援

同じく中高の頃MIDIで遊んでいた。MIDIのプロトコルに システムエクスクルーシブメッセージ というものがある。MIDI機器の中でもメーカー固有のエフェクトや制御を行うための信号だ。メーカー番号や制御コマンドは取説の通りに入力するだけなのだが、規格上チェックサムが必須になっている。簡単な算数で求められるのだが音作りは試行錯誤の連続なので音のニュアンスを少しでも変える度にチェックサムを計算し直すような作業はしんどい。(当時ろくな入力ソフトを持っていなかった)

これを計算するGUIアプリを作った。OSはWindows3.1、言語はVisual Basicだったと記憶している。CでHello Worldを出力する程度の経験はあったがGUIを扱うのは初めてだ。 main() ではなくイベントドリブンでプログラムが起き上がる感じ、GUIでGUIを構築する気持ち悪さ、最初は「これは、プログラム、なのか?」と戸惑った記憶があるが便利なものはやはり便利だ。半日もかからずに目的のアプリケーションが出来上がった。

随分使い込んだ記憶がある。MIDIデータを入力する時は必ず起動していたので(というユースケースに対応するため後付けで「常に最前面に表示」オプションを実装した)、1年以上もの間ほぼ毎日使ったアプリなのではないだろうか。

これはカウントしても良い気がするが、誰にも配布していない完全に自分専用のプログラムだ。作品と呼んでいいのかは微妙。

掲示板データ物理削除プログラム

18,19の頃、草の根BBSと呼ばれる掲示板サービスに参加したり主催したりしていた。インターネット普及以前のダイアルアップ時代の掲示板サービスだ。

当時私はMASHというホストプログラムで掲示板を提供していた。ところで他のプログラムは投稿の削除がとにかく遅かったのだが、このMASHというプログラムだけ何故か異常に早かった。

どうして知ったのかよく覚えていないのだが、削除が早かった理由は今で言う論理削除を行っていたからだ。当時の無償の草の根BBSホストプログラムにはRDBなど搭載されていない。全投稿を単一ファイルで管理するような設計が主流だったため物理削除が走ると数分レベルで無応答になるのは当然だ。とはいえ論理削除で当座は軽快に動作しても言わばゴミが残った状態なのでパフォーマンスに影響ある。

というわけでデータ構造を解析し物理削除するプログラムを書いた。結果は失敗。物理削除自体はうまく動いたのだが投稿の番号もずれてしまうのでスレッドの整合が取れなくなった。というわけで改良。投稿自体は残しつつ件名と本文とを0バイトに切り詰めるという処理に書き直した。うまくいった。稼働中の実際のホストで実際に動作させてみた。特に問題ない。パフォーマンスは、上がったのかよく分からない。作ることそれ自体が目的だったので別にそれでも構わない。

おそらくニーズはあるだろうと思い公開してみた。とは言え自分の作ったプログラムで人様のホストの投稿を壊すような事態は避けたい。「データは独自解析」「壊れるかもしれないので自己責任で」「物理削除なので復旧は不可」等の免責文言をてんこ盛り書いた記憶がある。使ってくれた人はいたのだろうか、おそらくいないだろう。自分なら、そんな危なかしいプログラムは怖くて使えない。フリーソフト作者としてCD-ROM書籍に掲載されるなどに憧れてはいたので、とりあえず何かやってみたかったのだと思う。

フリーランスもどきでの初仕事

21の頃フリーターをしていた。音楽を志し定職には就かずにいる一方、金(楽器や機材の資金)と時間(自己連やリハ)の両方が喉から手が出るほど欲しかった。という理由でプログラマーに憧れていた。肉体労働より頭脳労働の方がレバレッジを効かせやすい。単位時間辺りの収入を手っ取り早く最大化するのであればプログラマーが良いんじゃないか、という理由だ。

そんなことを知人に話していたところ「仕事あるかもよ?」と紹介された。話を聞きに行ったところその場で仕事にありつけた。メーカーのコミュニティサイト内の掲示板システム。perl+CGIでRDBはPostgreSQL、納期は1ヶ月後、報酬は15万。おいマジか15万ももらえるのかプログラマーって職業はすごいな、と感じた。おいマジか当時の自分すごいな大丈夫か?

これは作品と数えても良いはずだ。プロとして請けた。納品した。売上も立った。実際に世に公開された。のだが実を言うと数えたくない。元となるサイトのリニューアルに伴い納品したサービスも1年を待たずクローズとなったのだが、その上で白状すると、XSSがあったはず。該当箇所のコードも何となく覚えている。

言い訳がましくなってしまうのだが、クローズしたずっと後になって気付いたのだ。URLに細工をすることでhtmlやjsに対し色々と面白いことが出来るのは気付いたのだが、それが脆弱性に直結するとまで思い至らなかった。SQLで同じことが出来ると気付いた時はこれはヤバいと思い対策できたので、あと一歩というところだった。なお気付いたのは数年後だがきっかけは徳丸本だ。

趣味プログラムが商用人気アプリに

数年後、当時努めていた企業で取引先にちょっとした損をさせてしまった。実際のところ単なるコミュニケーションミスで損とは言っても常識的な失注の範囲内なのだが、若かったためもあり当時は心が傷んだ。

同じ頃、プログラムの練習用にJavaでガラケー向けのゲームアプリを作っていた。いかにも定番なトランプゲーム、絵を描けないのでグラフィックは全てダミー、ゲーム自体の出来栄えには自信がある。

損をさせてしまった取引先に対し自分はクライアントの立場、自分の担当業務はガラケーアプリ、趣味プロダクトのガラケーアプリが手元にある。ちょうど良かったので趣味プロをその取引先にこっそり渡し絵だけ正式なものを組み込ませ納品してもらった。対価はきちんとアプリ1本分。グレーな取引だが誰も損してないので構わないだろう。後日、自作のそのアプリがサイト内でランキング1位になってしまった。数年間は不動の一位だった。

世に出すなりに外部品質に気遣った、コードを人に渡すなりに内部品質に気遣った、本業ではマーケティングが専門、様々な観点を取り入れていく過程で様々な学びを得つつ思い入れも実績もある。心情的にはこれを自分のデビュー作にしたいのだが、報酬を得てないしグレーな取引だしそもそもこれ以前にも色々やってるし、デビュー作でなく出世作、と言ったところか。ゴーストライター側だが。

職業プログラマー

更に数年後に職業としてプログラマーをやり始めるが、その辺りから急激に書きたいと思うことがなくなる。夢は叶うまでが楽しい、的な話だろうか。書こうと思えば書けるのだが、ここから先はきりがなくなるのでやめておく。

この記事で言いたいこと、それは「原体験は重要である」ということだ。上に挙げたそれぞれ、今の自分なら一瞥で「素人仕事」と一笑に付すだろう。だが現在の自分を形作る原体験として重要な位置を占めるのは間違いない。何かしらの問題に対し過去の教訓から答えを見出そうとするとほぼ上に挙げたどれかに行き着く。当時はそんなこと考えもしておらず、後になって自分の中で意味付けがなされていったのだろう。今と過去の差分を見ると未来が想像できる。自分の立ち位置を確固たるものとするために、過去の経験に意味付けを与えていくことは重要ではないだろうか。