この記事は主に、大一(下)から夏休みにかけての心の動きと、私がどのようにプログラミングをやり始めたかを記録したものです。

大一(下)くらいの頃、私はまだ大気系にいました。冬休みにボランティアをして、林博雄先生の観測を手伝っていました。その期間に石恩と知り合いました。石恩は物理の人で、話が合いました。その後、林博雄先生がソフトウェアを手伝ってくれる学生を探していて、当時先生のところで働いていた石恩が私を先生に紹介してくれました。私は以前からプログラミングに触れてはいましたが、その頃の私は本当に「一般の人より少しマシ」程度です。でもまあ、挑戦を受け入れてこそ上達します。当時は「コードを書くのは大丈夫そう」と少し思っていました。これを説明するには、もう少し前から話す必要があります。

高校の頃は C++ を書いていて、情報競技の楽しさが少し好きでしたが、才能がないと感じてやめました。学測の後に科展をやって、Python でシミュレーションも作りましたが、あれも自己満足でやっていただけです。今振り返ると、その時期のプログラミング能力は大したものではありませんでした。

大一の冬休み頃、高三で科展を指導してくれた辜鉅璋学長の、公衛系の先生がソフトウェアを作れる学生を探していました。学長が私に「興味ある?」と聞いてくれて、興味があるなら入門を教えてくれると言ってくれました。教えてくれる人がいるのは本当にありがたい!そこで大一(下)は学長と一緒に改めてプログラミングを鍛え直しました。ウェブ技術から始めて、主に JavaScript を学びました。

その後、公衛系の話は立ち消えになり、夏休みから大気系の林博雄先生の COOK チームに入りました。大一の夏休みは、集思論壇の2週間を除けば、残りはほぼ研究室でコードを書いていました。

先生が最初に私に任せたのは、探空気球(ラジオゾンデ)の可視化ソフトウェアを作ることでした。私は春学期にウェブを練習していたので、ウェブで開発することにしました。フロントエンドはデータを表示するだけで、ファイル処理をするにはバックエンドが必要です。つまりローカルサーバーを立てる必要があります。当時 Node.js が流行っていて、しかも JavaScript だったので Node.js を選びました!

実際にやり始めると、私は表面しか分かっておらず、プロジェクトを作れる状態ではないと気づきました。当時できたのは、少しのオブジェクト指向の概念と D3.js の使い方くらいです。そこで文献やドキュメントを大量に読み、フロントとバックをどう構築するかを学びました。フロントは比較的簡単で、Bootstrap を使えばレイアウトはすぐ整い、ロジックも JavaScript 操作が中心です。一番詰まったのはバックエンドの立て方でした。Node.js でサーバーを立てたあと、最終的に一番よく使われている Express を採用しました。API の呼び方もすぐ分かるようになりました。ただ、詰まったのはファイルアップロードです。探空気球のデータファイルは、先にバックエンドにアップロードしてデータ処理してから、結果をフロントに返す必要がありました。ファイルアップロードのコードを書くのにかなり時間がかかりましたが、最終的に使えるテンプレを見つけました。

さらに先生は、気球の可視化を 3D で見せたいと言いました。そこで Cesium.js というオープンソースの 3D 地球ライブラリを見つけました。しかもフロントで動かせる。結局 1 カ月かけて、3D の経路図、2D の経路図、方位図、協温図(Skew-T)、そして X–Y の各種パラメータのプロットなどを全部作りました。これは私にとって最初の「実戦」作品でした。先生が求めた機能はすべて実装しました。先生は協温図まで求めていませんでしたが、大気科学では協温図があまりにも重要なので、これがないと完成度が半分になります。そこで私はさらに時間を使って協温図も作りました。協温図は別の研究者のオープンソースを使いましたが、そのデータ形式がどうしても理解できませんでした。ネット上にある実装もそれしかありませんでした。そこで commit の履歴を遡ってみると、ずっと昔に採用していたデータ形式なら理解できることが分かり、その古いバージョンを使って、ようやく協温図を完成させました!

最初のプロジェクトを終えて、フロントとバックの理解は深まりましたが、とはいえ私はまだ初心者でした。最初のプロジェクトをしていた頃、研究室には短期で台湾に来ていた外国人学生がいて、彼は APP を開発していました。これは微気象観測の計画で、先生がスマホに挿せる小型の気象センサーを大量に買い、ボランティアに配っていました。ボランティアがスマホを小さな気象観測所として使い、大気データを測定できるようにするのですが、その操作に APP が必要でした。その学生が APP を作っていました。

私が最初のプロジェクトを終えた頃、その外国人学生が帰国することになり、APP プロジェクトが私に回ってきました。APP は Hybrid App 方式で、iOS/Android の枠組みの上でウェブ技術を使って開発します。この方式の良いところは、春学期に練習したウェブ技術をそのまま APP 開発に使えることです。Java や Swift を学んでネイティブ開発する必要がありません。

プロジェクトを引き継いだあと、私は元のコードをほぼ 80% 書き直し、さらに多くの機能を追加したので、元のコードはほとんど残りませんでした。彼が 1 カ月かけて作ったものを私がほぼ書き換えてしまったので、申し訳ない気持ちもあります。最初から私に作らせた方が良かったのでは、という気もします。こうなった原因は、ソフトウェア開発の標準的なやり方がなかったことです。みんなが各自で作るので、引き継ぐと途端に厄介で保守も難しい。引き継ぐ側は、扱いづらい部分を全部捨てて作り直すしかなくなります。商業会社の開発では一定の規範に従い、保守性と拡張性を確保しますが、当時の私たちにはその概念がありませんでしたし、私自身も外の世界がどうやっているのかを知りませんでした。

Hybrid App なので、APP 開発はウェブ開発と似ていますが、スマホでしかできない機能もあります。例えばコンパスや Bluetooth などです。また APP も API を呼ぶ必要があり、今回は研究室のサーバーを使って、MySQL や PHP の操作も学びました。PHP は後に気象情報のクローラにも使いましたし、データベースでユーザーアカウント機能も実装しました。

10月頃、APP はようやくリリースできました。その後も新機能を追加し続けましたが、難易度は高くなく、主に複雑か面倒か、という感じです。例えば最初は多言語対応をしておらず、後から言語切り替えを入れるのは本当に大変でした。2つ目のプロジェクトが APP だったことで、私はウェブ開発にさらに慣れ、バックエンド操作の理解も深まり、さらに「スマホ APP を作る方法」も学べました。最後に Google Play へ公開するには開発者アカウントが必要で、登録にはお金もかかります。ひとまず APP は一区切りつきましたが、実際は先生が追加したい機能がずっとあるので、今でも更新が続いていて、真に終わったとは言えません。

大一の夏休みはほぼずっとプログラミングをして過ごしました。友達は環島していたのに!でもこの時期はとても重要でした。私のソフトウェア開発の最初の経験はこの夏休みに培われ、後に大きく役立ちました。もちろん悪い点もあって、近視が進んだ気がします、QQ!

探空気球(ラジオゾンデ)— GitHub

螢火蟲微気象網 — GitHub

螢火蟲微気象網 — アプリ

ぜひ Fork してください〜