このブログ「FPGA開発日記」は約2100日で2000記事に到達した。特に2019年と2020年は殆どサボることなく記事を書き続けることができている。ブログの品質は置いておいて、毎日日記を書くことは何となく楽しいものだ。2015年にブログを開設したときに「よしこの日記はなるべく毎日書くようにしよう」と決めて以来休まずに書き続けることができている。
元来物書きは嫌いではない。私はエンジニアだが、仕様書を書くのもそこまで嫌いじゃない。自分の実装するものを綺麗にまとめて、「一点の曇りもなく上手くできてるやろ、ドヤ」みたいにするのは楽しいし、バグ発見の報告書とかまとめて、「回避方法は1.と2.あるけどどうする?ニヤニヤ」みたいなのも何となく楽しい。自分がバグを出すのは嫌だけど。
5年以上にわたってブログを書き続けるにあたり、これほどまでに継続することができたのはいくつかの理由がある。この記事ではブログに限らず、物事を継続するために必要なコトについて私の考え方をまとめる。
毎日書くことが目標ではないが、毎日書くことが目標でもある。
矛盾したような話だが、最初にブログを始めるモチベーションは「毎日書くこと」ではない。ブログを書く目的は「技術を学ぶため」なのだ。新しい技術を学んでそれをまとめることで脳内整理する、これが大前提である。勉強だって机に毎日座ることが目的ではない、そうでしょう?
しかし、ここで鶏と卵の問題が発生する。毎日学ぶためには、とりあえず毎日ブログを書かないと始まらないのだ。とりあえず最初は本来の目的は忘れて、毎日ブログを書いてみることだ。そうすることでブログを書くことが習慣になり、ブログを書くために毎日勉強するというポジティブなループバックが回り始める。エンジンをかけるために、まずはあの手この手でエンジンに着火する必要がある、ということだ。
プロジェクトを2~3個決める
毎日記事を書くためには毎日ネタが必要なのだが、そのためにいくつかのプロジェクトを自分で設定する。ある程度長期的なものが良かろう。「~について調査する」「~を実装する」などで自分でもこれまでにやったことがないものを設定すればモチベーションになる。 私の場合は、普段のネットサーフィンで気になったことや、自分のプロジェクトを決めるときはメモ帳(というかGoogle Keep)を使って管理していることが多い。
何故複数のプロジェクトを決めるかというと、(これは私だけかもしれないが)ある程度気分転換が必要だからだ。気分転換に別のプロジェクトをやるの?というとストイックすぎるかもしれないが、今のプロジェクトに少し飽きたら脱線して別のことを調べてみても良いかもしれない。
定量的な目標を決める
これは上記のプロジェクトにも関連するが、プロジェクトというからには目標を決めたい。この目標を明確にすることが大事なのだ。
- ~までに...を完成させる。
- ~について纏めて発表する。技術書典向けに本を書く。
とかでも構わない。特にコードリーディングについては明確な目標が設定しにくいため、ブログにざっくりとしたメモ形式でまとめつつ、技術書典などをターゲットにして本を作ってみてもいいかもしれない。
あとは日付を決めることが大事。経験上「キリがいいところまで行ったらそこで纏めよう」とするのは挫折する場合が多い。定量的な目標がないからだ。「キリがいい」なんて言葉を使わずに1週間に1回とかにしてしまえばいい。
継続的にインプットを行う
ブログを続けるためにはネタの仕入れも十分に行わなければならない。ネタ探しはいつもどん欲に。Twitter上での話題の物に焦点を当ててもいいし、自分の興味のあるものを片っ端から調べてみても良い。 理想的には、インプットする対象はいわゆる抽象的な概念ではなく、自分で手を動かして実践できるものが良い。自分で手を動かすことはより深い理解につながる。どうしても抽象的な話題で手を動かすことができないときは、自分の言葉で要約を作ってブログに書き並べていってもいい。
私はインプットの対象は手を動かせるタイプのものが多い。去年や今年で手を付けたもので言えば、
- LLVMに独自バックエンドを追加するための試行→LLVMのソースコードを読むだけでなく、自分で独自実装を追加して理解を深める。
- Chiselを使ったDiplomacyの改造→TileLinkを使った既存のソースコードを読むだけではなく、OCPなどに移植して理解を深める。
- ビルドシステムの勉強→ 自分でビルドシステムを作ってみることによって、Makefileがどのようなカラクリで動いているのか理解できるようになった。
- RISC-V Vector Extensionについての勉強→マニュアルを読むだけでなく、そのマニュアルを翻訳して公開する。自作命令セットシミュレータに命令を実装して理解を深める。
- ゼロから作るディープラーニング③の写経 → 写経だけでは物足りないので、Python実装をRubyに置き換えて再実装した。かなり良いところまで実装できたと思う。
- QEMUの勉強→自分でQEMUをRustで作り直してみる。QEMUの構成について理解を深める。
と、列挙するとキリがないが、常に「自分で手を動かして理解する」という方針を貫いた。これが自分にとってアドレナリンを出す方法であり、「次はこれをやってみよう、あれをやってみよう」と継続的なネタをひねり出すための一手法なのだ。
新しいことを恐れない
新しいことはいつも恐ろしいものだ。コンピュータの構成は上手く抽象化が行われていて、自分の知らないテクノロジは魔法の箱のように見えてしまう。その箱を開くのはとても恐ろしいし一目見ただけでは全く理解できない。しかし、ここで恐れてはいけない。ゆっくりと時間をかけていいので、自分で手を動かしながら少しずつ理解を進めていく。こうした小さな努力を続けていけば、やがてその魔法の箱は単なる技術になり、最終的に身に着けることができるようになると思う。
自分の得意な武器を作ろう
これは、「継続的なネタの投下」と共通している。新しい技術を学ぶとき、その技術を、自分の得意な分野から見つめつつ手を動かしていくと、その技術をより効率的に身に着けることができるかもしれない。
自分の場合の柱になる技術は「RISC-Vに関する知識」と「命令セットシミュレータを実装する技術」だ。この2つの柱をベースにして、いろんなツールのRISC-V拡張を行ってみたり、QEMUやLLVMをRISC-V向けに移植したりして、個々の技術について理解を深めることができた。
番外編「無理なら休め」
本当に忙しすぎてブログを書く時間がないならば、その日は休めばいい。 ただし、ブログを書き続けていると、書かない日は体がかゆすぎてゆっくり寝られないようになっているだろう。もうあなたは継続的アウトプットをしたくてたまらない体になってしまっている。