未踏'23を終えて

2024-06-23
20分読む

はじめに

先日、2023年度未踏IT人材育成・発掘事業の修了式に参加しました。



大層な盾をもらいました

私が未踏でやったことについてはプロジェクト概要成果発表に詳細があるのですが、ErgというPythonにトランスパイルされるプログラミング言語の開発をやっていました。

開発自体は未踏採択前からやっていたのですが、未踏期間中は機能追加とかバグ修正とか、開発ツール(パッケージマネージャとかレジストリとか)を作って実用性を高めた感じです。なんかこう書くと未踏前に大体はできていたように感じるかもしれませんが、この実用性を高めるという作業が結構大変でした。実証を兼ねてパッケージマネージャはErg自身で実装したのですが、コンパイラ本体のバグがぼろぼろ発覚し、バグを根本的に修正するためコンパイラアーキテクチャの刷新とかもしていました。

以下は技術的記事というより、未踏期間を通して感じたこととか、未踏志望者に対するアドバイス?みたいなものが中心の散文です。

筆者について

2024年4月からM1になった大学院生です。専攻は物理で、研究室では場の量子論の辺りを研究してます。量子情報とか量子計算とかにも興味があります。

なぜそのような人間がプログラミング言語の開発で未踏に?という感じですが、プログラミングは高校生の頃からの趣味です。PythonとかNimを触って、Nimのパッケージを書いてGitHubにあげたりなんかしてプログラミング言語とかOSSとかって面白い、となった口です。独学でも結構プログラミングは出来ているなという自意識があったので、独学では無理そうな知識を得たいということで大学は物理学科を選びました。今思うとかなり傲慢な考えです。

応募まで

ことの始まりは2020年の4月に遡ります。 私はコロナ直撃世代で入学早々4〜5月が授業なしだったのですが、その間に何かやってみようと始めたのがプログラミング言語の開発です。最初の1年はちまちま構文解析器を書いてました。 ライブラリとかを使わず全部自前で書き下ろしたいという欲求があったので、構文解析器は手書きの再帰下降構文解析器です。パーサージェネレータを使えばこの1年の開発期間をかなり短縮できたんですが、その間にじっくり構文とかを考えられたので無駄ということもなかったのかなと思います。

最初は特に今みたいなコンセプトで作っていた訳でもなかったのですが、処理系をコンパイラかインタプリタのどちらにするかを決める段階で、既存の言語、すなわちPythonに乗っかる形にしようと思いつきました。Nimという言語はPythonによく似ているのですが、互換性はなくて、静的型付けという特徴があります。私が型推論というものを知ったのも実質的にはこの言語で、静的型付けが書きにくい(Cとかが念頭にありました)のって構造的な問題じゃないんだ、デザイン次第ではPythonと互換性があって、書きやすい静的型付けの言語が作れるかも? そういう言語みんな欲しいのでは? というのが今に通じるErgのコンセプトです。 Pythonには問題があって〜、みたいな能書きは未踏期間中はよく引き回した話なのですが、実はこのときはまだそういうのは意識していませんでした。

パーサーが完成したらとにかく動かしたかったので適当に検査はスキップしてバックエンド(コード生成器)を作っていました。あとは当時Python自体を静的型付けで高速化したいと企んでインタープリタを作りかけていたのですが、静的に型がついていないと話にならないので一旦コンパイラとして完成させてからという運びを思い描いていました。まあ後にコンパイラだけでも手に余るプロジェクトだと気づくのですが。

2022年の8月に型検査器、所有権検査器、副作用検査器まで一応形になったのでリポジトリを公開しました。starが最初の1週間で2k近く集まって驚いたことを覚えています。

https://ossinsight.io/analyze/erg-lang/erg#overview

その後starの伸びは落ち着いたのですが、これはいける、やはり私の考えは間違っていなかったのだと昼夜を問わず開発を進めました。8〜9月はmax 12h/dayくらいやっていたっぽいです。 まあそんなにやっていると流石に周囲も異変に気がつきます。Ergのstarがどれだけ集まろうがお金にはならないので、ただの趣味で心身を酷使していると家族に諌められました。 それで異常な開発ペースはひと段落したのですが、そう言われるのだったらただの趣味じゃなくしてやろうじゃないかというわけで、どこかのコンペか何かに応募しようと考えました。


未踏に応募するというのは割と最初から本命ではありました。未踏でプログラミング言語というのは、実は第1回から続く伝統的なテーマです。当時は直近3年連続でプログラミング言語系のプロジェクトが採択されており、この波に乗るべきだと思っていました。 異能vationとかも調べたのですが、未踏の方が知名度高いですし、貰えるお金の使途も融通が効きます。サイボウズ ラボユースというのもあって、これも未踏のように好きなものを開発して自由に使えるお金が手に入るのですが、未踏の方がネームバリューも貰える金額もありますね。

やはり未踏は他の似たような事業に比べて破格に条件がいいと思います。貰えるお金も年々増加していて、多分未踏OBの方々の活躍のおかげなんだと思います。低レイヤー1、もっとぶっちゃけて言えばあんまりお金の匂いがしないものを作っても良いというのが未踏の良いところです。未踏には人材育成という側面があるからですね。

そんな訳で応募先は未踏に決まりました。これが大体2022年の11月くらいのことで、翌年3月の頭くらいに応募書類を出したと思います。

選考

前節で述べた通りErgには既に2kのstarがあるというわかりやすい実績がありましたので、正直採択される自信はありました。

審査はZoomで行われました。PMの方々の前で決められた時間プレゼンして、最後に質疑応答というよくある流れですが、質疑応答では補助スライドが役に立ちました。FAQを先回りして考え補助スライドを仕込んでおく、というのは私が多用する発表テクニックなのですが、これは後の未踏期間を通して何度も役に立っています。

採択後イベント

ブースト会議

未踏期間に入ると1週間くらいで最初の会議(ブースト会議)が開催されます。この会議で初めて他の採択プロジェクトの概要とかを知ることになります。

夜は採択者、OB、PM等の集まる懇親会みたいなのがあってわちゃわちゃ楽しく歓談します。 OBは前年同じジャンルをやっていた人などが呼ばれやすいそうなのですが、今回は去年同じくプログラミング言語のプロジェクトをやっていた方が参加してくれて、楽しくプログラミング言語談義をしました。

ブースト会議が終わるとしばらく大きな会議はなくなりますが、PMミーティング(定例進捗報告会のようなもの)が大体月一で開催されます。ここでもOBの人が呼ばれたりします。また別のPMプロジェクトとの合同で開催されたりもします。

8合目会議

11月下旬くらいに開催されます。8割完成したものを出すという感じの会議に聞こえますが、PMの方に言わせると「ここからが本番」で実際は8合目の反応をもとにバリバリ詰めていくなら何割でもOKな雰囲気です。アプリケーションプロジェクトの場合ピボットとかもあるので。 低レイヤープロジェクトは作業量がものをいいがちなので、アプリケーションよりは成果を上げてないとまずい感じはありましたが、幸い私のプロジェクトは未踏前の貯金もあって発表もつつがなく終わり、あとはクオリティをどこまで上げられるかというところでした。

成果報告会

成果報告会は例年2月の中旬に開催されます。ここが実質的な「納期」になるでしょう。

年末から1月の半分は大学の卒論執筆に集中し、書き上がると脇目も振らずに開発を再開しました。OBの方の「成果報告会の朝に初めてまともに動いた」みたいな話も聞いて戦慄していた私は実質的なデッドラインを1週間前に設定していたのですが、後から考えるとこれは良い判断だったと思います。 というのも、成果物の見せ方も考えなくてはならないからです。ぶっつけ本番ではあまりにリスクが高いので、大抵のプロジェクトはPMにまず発表を見せてフィードバックを貰います。このフィードバックが私の場合結構ありがたいものだったのですが、成果発表前ギリギリまで詰めるスタイルだとこれがろくにできません。

成果発表は、まあ私の中ではうまくいったんじゃないかと思いました。

所感

成果報告会の後、同期の人とあっという間だったねという話をしました。 まあ8ヶ月間で前人未踏のモノを作れというのですから客観的に見ればそれはそうで、そしてそういうものを作る同期が何人もいて、更にそれを支援する人や組織がいて……という状況は、これまでの人生では経験したことのない異常事態でした。

成長の自己分析みたいなのを成果報告書に書かされたのですが、トリアージ的な能力が成長したなと思っています。何せ8ヶ月程度しかないので、当初思い描いていたもの全てを実現できるプロジェクトは稀だと思います。むしろ提案段階で全て予見できるようなものは未踏性が足りないと判断されかねない。 私の場合はネイティブコードバックエンドの開発が道半ばという感じで終わってしまいました。ネイティブコードバックエンドは、ErgをPythonの他にバイナリも吐ける言語にしようってことで実装しようとしたバックエンドです。そうすれば高速化が期待できるので。 「Pythonにトランスパイル 可能な 静的型付けプログラミング言語の開発」というプロジェクト名にしたのはこのネイティブコードバックエンドの開発を見据えてのことだったのですが、時間が足りませんでした。fibonacciのコードくらいはコンパイルできるようになったのですが、目標のパッケージマネージャのコンパイルはなかなか達成できず。それよりパッケージマネージャをはじめとした開発ツール群のクオリティアップの方が重要と考えて開発は中止しました。逆にこの方針で当初作る予定のなかったものが出来上がったりもしたので、悪いことばかりでもありません。まあここら辺の見極めが重要だと思います。多分現実の仕事とかでもそうなのでしょうね。未踏も仕事ですが……

ネイティブコードバックエンドは未踏期間後もちまちま開発して公開したいと思います。

若干ネガティブな話

これだけ未踏はいいぞみたいなポジティブトークばかりしていてもリアリティがないので、ちょっとネガティブな話もしておきましょう。皆様にはあまり役立ちそうもない話ばかりなので、この節はスキップして構いません。

まずErgの開発にお金が入ってくるというのは素晴らしいことだったのですが、同時にそれが枷にもなりました。具体的には、Erg以外のプロジェクトに手をつけることがなくなりました。成果的にも金銭的にもその時間はErgに使うべきですから。 余暇でOSS開発をしているプログラマの方とかもいると思いますが、未踏の場合はフルリモート・フレキシブルタイム状態なので、仕事とオフの境が消失しがちです。パソコンを立ち上げたときにErgをやるかそれ以外をやるか、というのが選択肢としていつも立ちはだかるわけです。 そこでErgを選ぶと、それは正しい選択肢なんですが少し鬱憤が溜まります。まあ未踏終わるまで我慢しろという話ですし、今は未踏終わったのでぼちぼち他のプロジェクトの開発も再開しています。

あとは単純に1440時間は多いですね。未踏の期間が264日で、期間中無休で働いたとしても毎日5時間半くらいやることになります。もちろんそんなの無理なので長期休暇中に連日10時間くらいやることになります。多分1440時間は複数人でやる前提の時間だと思います。作業実績として付託金が出るので別にやらなくてもお金が発生しないだけです。私は意地になってやり抜きましたが、これから1人プロジェクトで応募する人は無理をせず頑張って下さい。 一応補足すると、私はどれだけ忙しくてもタスク消化のために徹夜はしない、毎日6時間は寝る主義なので未踏期間中心身に不調をきたしたりはしませんでした。そんな主義でも未踏は何とかなります。

今後について

Ergの開発は今後もバリバリ……はできないと思いますが継続的にやっていきます。まだ未実装の言語機能としては

  • 多段階計算システム(≒型検査されるマクロ)
  • ユーザー定義コンパイル時関数
  • ユーザー定義多相型

があり、特に最初のは現在鋭意開発中で、今のところif, for, importマクロが実装できてます。 なぜ多段階計算システムを追加したいかというのはこのポスト

にも書いたのですが、ユーザービリティを意識してのことです。 未踏前はあんまり意識してなかったのですが、プロダクトの市場意識ですね。Ergで商売をしようってわけじゃないですが、この言語を他人が実際に使うかもしれない・使ってもらうにはどう改善していくか、というのは未踏の中で深まっていった考えの一つです。

あとは広報活動みたいなのを今まであんまりやっていなかったので、やっていきたいですね。RustかPythonのカンファレンスに参加しようかなと思ってるのですが、その他にもErgの宣伝させてやってもいいというカンファレンス運営関係の方がいたらご連絡いただけると嬉しいです。 ゆくゆくはワークショップとか開催できたらいいなと思ってます。そのためにはユーザー集めないとなんですけどね。

それと、未踏アドバンストっていうのもまた応募できるんですが、あっちはビジネスか既に実用されているやつじゃないとって雰囲気があるので、やはりユーザーを増やさねば……


未踏とはあんまり関係なくなるのですが、本業の方に関連する話もしたいと思います。 これまでも研究で数値計算のためにコードを書くみたいなことはやっていたんですが、未踏をやってからは本業の研究の方にもプログラミング、というか計算機科学を絡めたいなという想いが強くなってきました。具体的には量子計算に対する関心が強まっています。現在のコンピュータでは計算量が指数的に増大するLattice Gauge Theoryの計算も量子コンピュータでいい感じに計算できるかも?みたいな論文を最近読んで興味が湧いています。Latticeは未履修なんですが量子コンピュータと並行して勉強しています。

あとは量子プログラミング言語という研究対象もあるようで、これはもう、とても興味あるんですが、まあ流石にCSのテリトリーなようです。こっちも勉強していますが、これで学位は取れなそう……

なんか自分は量子コンピュータをどう作るか、とか今できてるもので計算できることは何か、みたいなことよりも量子コンピュータが「完成」したとして何ができるか、みたいなことに興味があるようです。 もしかしたらだいぶ気の早い話になるかもしれないのですが、歴史を振り返ってみれば古典コンピュータの方だって実機ができる前にラムダ計算などの理論は整備されていました。なので、時勢を先取りして基礎研究しておくことも意義があると思います。 まあ後は単に、多分計算が速くなるから量子コンピュータを開発しよう、みたいなモチベーションで研究が進んでいくよりかは、量子コンピュータが完成したらこんな世界が待っているよ、みたいなビジョンがあった方が業界として良いのではないかと考えています。

閑話休題。

その他

これから未到に応募したいという人へ向けて細々とした話をします。

事務書類

やる必要がある事務はこんな感じです。

  • 契約書類の確認・サイン(契約時)
  • 作業日報(毎週)
  • 進捗報告(毎月)
  • 概算払い請求の確認(不定期)
  • 移動宿泊経費の申請(不定期)
  • 成果報告(2〜3月)

あんまり詳しく言っていいのかわからないので適当にぼかしますが、作業日報については、未踏事務局の人がサポートしてくれるのでそこまで字面ほど面倒ではないです。私は作業日報とは別に非公開の作業日誌を勝手に書いていたので、それの内容を元に週末まとめていました。3日以上同じ作業を継続してはならないというルールがあって、これは結構タフなバグを直してるときとかは苦しい制約だったんですが、進捗を反映して若干言い回しを変えてみたり、一旦別のタスクをやってみたりすることで凌げました。 進捗報告も、大抵各PMごとの進捗ミーティングが毎月開かれるのでその時の発表資料の提出をもって進捗報告としてくれます。 概算払請求も基本的には「確認しました」のメールを送ればいいだけです。移動宿泊経費は、私の場合申請することはなかったです。大抵会議とかミーティングとかは都内で開催されるので、都内在住だと交通費は申請下限額以下です。 成果報告だけそれなりの分量があってまあまあ大変です。書類はまとめてGitHubのリポジトリにあげていますが、これくらいの分量のものを書かされます(私のは少し多めですが)。私はその数ヶ月前に卒論を書かされていて、それに比べればなんてことなかったのですが、まだそういった洗礼を受けていない人は面食らうかもしれません。

収入

未踏でもらえるお金は付託金という名目になります。プロジェクトの遂行にあたって予算が必要になる場合、この付託金から使用することになります。またここで使ったお金は確定申告の際に経費として申請が可能です。必ず領収書など証憑を取っておきましょう。 交渉力があれば、必要機材は採択後に色々なコネを使って借りることもできます。私の同期の人は企業の協力を取り付けて高性能コンピュータのレンタルとかをしてもらってました。まあこれは不確定要素ですが。 付託金という名前なので何となく自由には使えなさそうに聞こえますが、完全に自由です。ソフトウェア開発系の場合はコスト0円なので実質給料です。ただし、後述しますがあくまで給与ではなく、所得税の控除額が少なくなります。

IPAからは作業実績に応じて付託金を年何回かに分けてもらうことができます(概算払い)。よくアルバイトの給料は103万まで非課税と言いますが、それは給与所得の場合の控除65万+基礎控除38万のことであり、未踏の付託金は給与にはならないので控除額は38万円です。つまりIPAから38万以上もらう人(ほぼ全員だと思います)は納税する必要があります。 次の確定申告の章でも話しますが、収入次第では税率が変わるので、概算払いの受け取りは遅延させてもらうこともできます。私の場合は一人プロジェクトでどう分けても年130万以上は受け取りますが195万以上になることはなかったので、遅延は申請しませんでした。

納税

確定申告をやるのは初めてでしたが、思っていたよりはスムーズに申告できました。私の場合ソフトウェア作ってるだけだったのもあるでしょうが。

一応私がどのように確定申告したか、流れをまとめておきます。今後フローが変わる可能性もあるので、参考程度にしてください。 マイナンバーカードがあると非常に楽になるので、作っておいた方が良いです。スマートフォンでマイナンバーカードの読み取りができない場合はカードリーダーも必要だと思います。

国税庁の確定申告等作成コーナーを開き、作成開始を押します。

  • スマートフォンを使用
  • 令和X年分の申告書等の作成
  • 「決算書・収支内訳書」の作成
    • 私の場合初めに一番左の「所得税」を選んでしまい、最後に収支内訳書の添付が必要だと言われこれを選び直してxtxデータを作成し添付しました
  • マイナポータルと連携
  • QRコードを読んでマイナンバーカードを読み取り
  • 収入を入力(付託金)
    • 所得は事業所得(雑所得でも良いっぽい? 開業届があると青色申告で特別控除等を受けられるようですが、私は出しませんでした。恐らくそんなに変わらないので)
    • 私の場合は収入=所得でしたが、所得=収入-必要経費等です
  • 各種控除を入力
    • 私の場合はありませんでした。源泉徴収も0(IPAは源泉徴収しません。正確なところは契約書類に書いてあります)です
  • 申告書が2枚+収支内訳書が送られるので、確認
  • 納付
    • 私は振替納税を選びました

振替納税を選択すると、登録した口座から4月下旬くらいに自動で引き落としされます。因みに税率ですが、ここにも書いてあるとおり私の場合は5%でした。よくサラリーマンが給料30万で手取り20万いくら〜とかいう話を聞いていたので10%くらいは持っていかれるのかと思っていましたが、それほどでもないですね。このあと住民税とかの納付書が来て結構取られました。

アドバイス

もしあなたが今大学生なら、学部1〜3年のうちにやっておくのが良いと思います。なぜか未踏'23は私と同じく当時学部4年の人が結構いましたが、大学院入試/就職・卒論で何かと大変だと思います。大学院生の人も結構いたので、大学院に行くなら入ってからでも良いかも。 高校生で応募するのは、まあ大学入試とかを鑑みて応募すると良いと思います。高校生の年齢で採択されていた人もいましたが、普通の高校に通ってるわけではなかったはず。未踏ジュニアの方で結果を出せば一部の大学で推薦がもらえるらしいので、その後未踏本体に応募するのもいいかもしれません。

未踏のプロジェクトは課題解決型とライフワーク型に大別できるらしいです。
課題解決型は既存の技術だけでは解決が難しい問題にアタックするタイプのプロジェクトで、Ergは表向きこちら側です。ライフワーク型はプロジェクト提案者のこだわりと人生哲学が詰まったタイプのプロジェクトです。「ライフワーク」という言葉は落合PMの仰っていた言葉で、落合PMが取るプロジェクトはこっちらしいです。 表向き課題解決側といったのは、私は前者の体裁の方が説明しやすいと考えただけで、実際のErgプロジェクトはライフワーク的側面も多分にあると考えています。言語実装は今後も続く生涯の趣味になると思うので。 そういう意味でこの二分法はいつも適切とは限らないのですが、ただ未踏に応募する際どちらの方針で押し出していくかは何となく意識はしておいた方が良いと思います。 課題解決型の場合は、課題の重大性、先行技術、先行技術の難点、提案プロジェクトの利点・新規性について詳しく掘り下げる必要があるでしょう。 ライフワーク型の場合は、プロジェクトの面白さ、かける情熱、既にこんなことまでやっているということを説明すると良いと思います。 あるいは、あまりやっている人は見たことありませんが、両方の側面を押し出すということもできるのかもしれませんね。まあ未踏ですから好きなようにやるのが一番です。


関連リンク


  1. 一般的にプログラミング言語処理系は低レイヤーのソフトウェアとして扱われるんですが、私自身はあんまり低レイヤーの人間という自意識を持っていないです。私は静的型システムや言語デザインの方に興味がある人間で、だからどちらかと言えば理論レイヤー?の人間の自意識があります。まあ専門的知識は全然不足しているのですが。 ↩︎

comments powered by Disqus