プログラミングの楽しさを思い出したいあなたへ



東工大B4のりいたです。
この記事は、「もうプログラムを書くのが楽しくない。めんどくさい。昔は楽しかったのにな...」という方に向けて、エンジニアというのはすごい職業でプログラミングはとても楽しいということを伝えるために書きました。

少し長いですが、どうか最後まで読んでいただけると嬉しいです。

## イノベーションは人類を豊かにする最強の武器

新型コロナウイルスCovid-19の被害で大変なことになっています。世界では日本以上に多くの死者や重篤患者が生じてしまっています。感染拡大を抑止するために、次々にワクチンを作り、接種しています。今回のワクチンは、messanger-RNAワクチンと言われるこれまでになかった全く新しいワクチンの作り方だそうです。僕は専門家ではないので詳しいことは分かりませんが、従来のワクチンの製法ではこんなにも早くワクチンを作ることはできなかったようですね。
それなのになぜ全く新しい製法でこんなにも早くに効果の高いワクチンが製造できたのでしょうか？
それは、すでにm-RNAワクチンの手法というのは確立されていたからなんですね。
つまり、大昔から地道にm-RNAワクチンの製法について研究していた研究者がいたわけなんです。
m-RNAや脂質ナノ粒子に関する研究だけでなく、DNAや免疫学、薬物送達技術（DDS）などありとあらゆる基礎研究の成果としてのm-RNAワクチンができているのです。
日本では、すぐに役に立たないことの研究をしている研究者を蔑むような風潮がありますが、**地道な基礎研究によって、これまで人類は文明を発展させてきた**と再認識できる機会だったのではないでしょうか。
「その研究はなんの役に立つの？」なんていうのは非常にナンセンスです。
こんなコロナ禍を経験した現代だからこそ、「**まだ誰も知らないことに取り組むことに価値がある**」という価値観になっていってほしいなと思います。

もう一つ明らかに間違っていると思われる考えが蔓延しています。それは「お金持ちが偉い」というような考え方です。
テスラという電気自動車をご存知ですか？知ってますよね。オートパイロットと呼ばれる自動運転の技術を搭載しています。
そして、テスラを乗っている人を見たらあの人はお金持ちだからだ。お金があるからテスラが買えたんだ。と思いますか？
でも実際はそんな単純なことではないですよね。誰かが地道に研究を重ね続け、その成果を活かして実際に開発した人がどこかにいるから。すごい技術の車に乗ることができるのです。

これは、自動運転などの先端技術に限った話ではありません。
**毎日使う電気も水道もガスも衣服もインターネットもスマホもパソコンも、今あなたが住んでいる家も、外に出れば当然のように歩く町も道路も。この世にある全てのものが、誰かが考えて、誰かが作ってくれているからそこにあるんです。**
あまりに毎日当然のように使いすぎて、あって当然と思われているようなものも、さまざまな研究をもとにそれを開発してくれた人がいるから世の中が成り立っているんです。

汗水垂らして様々な試行錯誤とともに研究をしたりものを作ったりする人は世の中に多大な貢献をしています。
お金を持っている人というのは、そういった過去数千年の研究と開発の成果をタダで利用して、賢く自分にお金が回ってくるようにしているだけのことなんです。
稼いだ金の額で優劣がつくわけではありません。


## すぐに役に立つことはすぐに役に立たなくなる。

僕は大学では情報系(ICT)を専攻して、2年半くらい業務でもSoftware Engineerをやってきました。勉強したとしてもすぐに新しいものが出てきて勉強した意味がなくなってしまうという話も聞きましたし、「だから勉強する意味なんてない」という嘆きも聞きます。
Web開発の現場においては、SPAやコンテナが主流の現在では、LAMP環境での開発知識とは別の知識が必要になってきているかもしれません。数年前の先端技術は今の先端技術ではなくなっているという例の一つだと思います。けれども、「今度はReactやDockerでの開発を勉強すればOK」というのもどうなのかなと思っています。**特定のツールの"使い方"はまた10年後には陳腐化します。そんな5年や10年で役に立たなくなることだけを勉強すべきではない**のではないでしょうか？

誤解してほしくないのは、ツールの使い方を学ばないと何も作れません。まずはツールの使い方から先に学ぶということは正しい姿勢だと思っています。
また、僕が言いたいことは、「CSや低レイヤーの技術を学ぶべき」ということとは全く異なります。システムコールだろうが、命令セットだろうが、プロトコルスタックだろうが、それらも先端技術の一つに過ぎません。それらもまた10年後には大きく変わっているでしょう。私が言いたいのは、何のテーマを学ぶかではなく、そのテーマにおいてどこまで深く学べるかだということです。

僕の意見としては、「**あるソフトウェアがどのような仕組みで成り立っているか**」、さらに「**なぜそのような仕組みを採用したのか。他のやり方に比べ何がどのように優れているのか。**」という"哲学"を学ぶことが大切だと思っています。このような観点からシステムを見ることができたときに、**実態を伴って理解している**と言えるのではないかなと思います。

**実態を伴って理解している**ために、定理を証明したり、システムの仕組みを理解するのは、必要条件です。どう動いているのかを理解した上で、さらに「**その技術を発明した人は、なぜその仕組みを採用したのか**」という視点で物事みて、説明できるレベルになって初めて、**実態を伴って理解している**と言えると思っています。具体的に言えば、例えばマルチコアプロセッサでは、共有メモリ方式と分散メモリ方式があります。教科書にはSPMDのような実行モデルでどのプロセスにどのような番号を割り当て、どのようにメモリ空間を保持するのか、独立するのか、共有するのか、どう管理するのかについて詳細に書いてあります。まずは、教科書に記載されているアルゴリズムを知ることは最低条件として必要です。ただ、プロセッサーはこういうふうに動いているんだな〜と知って終わりでは、**実態を伴って理解している**とは言えないと思います。
**実態を伴って理解している**とは、どのような要件を満たすために、どうしてそのような手法を取り入れたのか？と世界で初めてマルチコアプロセッサを開発した天才の観点に立ち返って腑に落ちるまで考えることだと思っています。同じ変数や配列に対して，プロセスごとに違う値を与えることが可能となるようにするために、それぞれに独立したメモリ空間が必要なんだとか。しかし、分散メモリでは通信路のレイテンシーが課題になります。この課題を認識し、それに対する解決策を認識するということが重要です。
例えば、それを共有メモリで実現するためには仮想メモリの考え方が必要になると。

**実装を理解することは必要ですが、それでは不十分で、どうしてその実装になったのかまで理解することが大切**だと思っています。そして、それを理解できるようになると次々と疑問が湧いてきてどんどん、知りたい知りたいという気持ちになります。キャッシュの場合はどうなんだろう、多層キャッシュ接続のマルチプロセッサではどうするんだろう、OSのマルチプロセス管理と競合しないのか？など次々に疑問が湧いてきて、この疑問が湧き続けるフェーズが私が生きている中で一番楽しい瞬間です。アドレナリンが止まらなくなり、何時間も教科書にかぶりつき、自分の中で全てが腑に落ちるまで調べ尽くします。なんとなくわかったと自分の中では思うのですが、翌日大学に行って友人と話すと、また新たな疑問が湧いてくるんですよね。
こういった、「**その技術を発明した人は、なぜその仕組みを採用したのか**」という視点で物事みてあらゆる仕組みを説明できるようになってくると応用が効くようになってきます。一つ一つの事例から普遍的な本質を学ぶことができるようになります。マルチコアプロセッサでのキャッシュやプロセス間通信で出てくるような課題は、Linuxの世界でも出てきますし、現代の分散サーバーの世界でも出てきます。そして、モダンアプリケーションのマイクロサービスの世界に通ずるものもあります。コヒーレンスとコンシステンシの世界の超低レイヤーのキャッシュであっても、ウェブアプリのRedisのキャッシュであってもキャッシュはキャッシュなんですよね。多層キャッシュや古くなったキャッシュへのアクセス、データ競合といった課題は普遍的に生じてくるので、物事の本質まで到達した人は応用が効きます。この先、Redis が使われなくなっても、Intel Core i7 が使われなくなっても、何かしらパケットを転送している限りこの世からレイテンシーという概念がなくなることはありません。それが単一のCPU内のプロセッサ間であれ、複数のサーバー間の通信であれ、本質を理解するようになると似たようなものに見てくるわけです。

この本質とは、どう動いているのかを理解した上で、さらに「**その技術を発明した人は、なぜその仕組みを採用したのか**」という視点で物事みて、説明できるレベルになることです。


これからあらゆる先端技術が出てきたとしても、核となる物事の仕組みとそれの基礎となる哲学はずっと変わらないはずです。
「特定のライブラリの使い方」など**すぐに役に立つことではなく**、
「物事の仕組みと、なぜその仕組みを採用したのか」のような**すぐには役に立たないことに取り組むことが大切なこと**なのではないかなと思います。
**なぜなら、すぐに役に立つことはすぐに役に立たなくなるからです。**

## 荒れ地に種を蒔く開拓者たる勇気を

ちょっと僕自身の昔話をしますね。
僕がプログラミングを始めてまだ4ヶ月くらいだった頃の話です。社員数400人程度の企業のインターンに参加していました。そこは非常に楽しい仕事環境だったのですが、インターンということもありメンターの方におんぶにだっこの状態でした。そろそろインターンではなく一人前のエンジニアとして働きたいと思い、求人サイトにフリーランスエンジニアとして登録しました。流石に経験が浅いため大きい企業への参画は難しく、フルタイムのエンジニアが2人しかいないシード期の企業を選びました。結論から述べるとこれは超大失敗でした。
サービスは立ち上げフェーズで必要な機能が全然足りてない状態でした。そのため、僕に回ってくるタスクはひたすら機能開発になります。アプリの性質も認証とデータの出し入れをする程度だったので、技術的な面白さは皆無でした。淡々と、マークアップとCRUDを実装するというような感じでした。

最初の1週間はエンジニアという肩書きに心が躍るような気分でしたが、2週目に入るともうとにかく仕事がつまらなくてつまらなくて仕方がなかったです。
理由は単純で、**今の自分にできることだけを繰り返しやるのはめちゃくちゃ退屈で反吐が出るほどつまらない**からです。

毎日特に新たな発見もなく日々が過ぎていきます。エンジニアという肩書きでしたが、実際にやっていることはライン生産方式のライン工の方のような感じでした。僕にとっては苦行でしかなかったし、将来はエンジニアにはならないと決め込んでいました。

そんな時にエンジニアというのはめっちゃ楽しい職業なのだと気づかせてくれたのはやはり大学の友人でした。東工大にはめちゃくちゃ頭が良くて、プログラミングが超大好きな人たちが集まっています。大学のカフェで勉強しているときに、当時の僕とは桁違いの成果を出している人たちと話していました。その時に「<span style="color: #d61b09">**うぉぉ！エンジニアリングというのは、お金を稼ぐための手段でもなければ、何かものを作るための手段でもないのだ！マジでめちゃくちゃコンピューターの仕組みそのものに興味があって、その興味の赴くままに夢中で"探求"していくものなのだ！！！**</span>」ということに気付かされました。

それがちょうど大学2年の春過ぎくらいだったと思います。それ以降は、自分の興味の赴くままに気になったものを**とにかく探求**するようになりました。そこからさらに何億倍も何兆倍もプログラミングが楽しくなって、めちゃくちゃワクワクするようになりました。知らないことが出てくるたびに、脳内の興奮物質がドバドバと出てきて「脳汁やべぇぇぇ」ってなってました。

それをきっかけに明らかに技術力(技術で課題解決をする力)が向上していきました。その当時に10年以上のキャリアのあるエンジニアの方が集まっても解決できなかった課題を1人で解決したこともあります。
知識が増えたことで、これまで思いつかなかったような「ビジネスにおける本質的な課題解決」を提案することができるようになってきたからだと思います。


とはいえ、エンジニア数人でやっているシード期の企業では「非機能」の要件を求める以前に、機能開発を最優先でやる必要があります。なぜなら、それらを求められる段階ではないからです。
そのため、僕の場合は、運用の自動化や技術選定などを提案をしましたが、仕事全体の5%くらいを充てるにとどめました。それ以上のエフォートを割いてしまうと、新機能のリリースが遅れてしまうからです。5%でも面白いことができれば、モチベーションも少しは上がりました。
自分のレベルが上がるにつれて「厳しい非機能要件のある大きいプロダクト」や、「ギークなプロダクトのギークな部分」へコミットすることができるようになりました。それからは、仕事がつまらないものからワクワクするものに変わりました。5%しかなかった仕事の中の面白い部分が80%とかまで増えてきて、めんどくさい部分が20%くらいまで縮小されるようなイメージです。

要約すると、常に自分ができないこと、知らないこと に向き合っていればエンジニアリングはめちゃくちゃ楽しくなります。**大切なのは、今の自分ができることに満足しないこと**だと思います。
それは、どのような仕組みで動いているのか。どうしてそのような仕組みを採用したのか。そして、より効率よくやる方法はないのか。といった観点で、**探求**していくことで本当の意味でのエンジニア、すなわち「技術を用いてビジネスにおける本質的な課題解決をする人」になれるのだと思います。
と同時に、課題解決をするためには、**仕事は与えられるものではなく自ら生み出すもの**という価値観が非常に重要になります。仕事が与えられるのを待っていたら、機能開発しかさせてもらえないなんてスタートアップでは当然です。自ら課題を見つけて、周りの人を巻き込んでプロジェクト化するくらいの力があれば、確実に仕事は楽しくなります。それだけでなく、事業の成長にも大きなインパクトを残せます。

そうやって好奇心の赴くままに探求を続け、哲学を理解していくことで、「**とことん好きで，これなら負けないと自信を持てる足場を築くこと**」ができます。
これには**3つのとてつもなく大きなメリット**があります。
まず、1つ目は自分に自信が持てるということです。頑張ってきた自分を知っていればこれからも頑張れると思えます。
2つ目は、**そのくらい一つのことを追求した経験は他の分野の知識を取り入れる際にも役に立ちます**。僕は大学受験の時に古典物理学をとことん突き詰めました。ゴールドスタインさんの「古典力学」や砂川重信さんの「電磁気学」を耽読した高校生の時の経験がプログラミング学習の際にもとても役に立ったと思っています。
そして3つ目は社会へさらに大きく貢献できることです。まず、エンジニアとして事業をより良くするための選択肢を増やすことができます。また、技術そのものを発展させることにも貢献できるようになると思っています。
技術者の醍醐味に「**好奇心の赴くままに探求をし、"新規性"を生み出すこと**」というのも一つあると思います。ググっても出てこないような技術領域に対して、自分で考えて数少ない文献に書いてある情報から更なる調査をする。そうすることで世界中でまだ誰も知らないことを発見したり、誰も思い付かないような手法を提案したりすることができるようになるんじゃないかなと思います。
それはまさに**荒れ地に種を蒔く開拓者**として、技術自体に貢献できるようになるのではないでしょうか。きっと蒔いた種は、研究会や学会、テックカンファレンスやブログなどで息を吐き続けることで、根が張り芽が出るのではないでしょうか。
また、インプットと同様にアウトプットをし続けることは重要だと思っています。自分1人でできることは限られているので、自分の見つけた新規性を多くの技術者に共有することでさらなる発展が見込めます。
さらに、アウトプットをし続けるためにはインプットもし続ける必要があり、エンジニアとして楽しいループに入れるのではないかなと思っています。

## さいごに、本当に大切なことを話します

僕の言っていたことを振り返ると、
1. イノベーションは人類を豊かにする最強の武器
2. すぐに役に立つことはすぐに役に立たなくなる。
3. 荒れ地に種を蒔く開拓者たる勇気を

3つのことを言ってきました。
要約すると、**強い好奇心を持って自分の知らないことに取り組むことが、技術者にとって最高に楽しいことです。何かに取り組むなら、「すぐに役に立つことではなくすぐには役に立たないことに取り組む」方が楽しいのではないか。なぜなら、すぐに役に立つことはすぐに役に立たなくなるから。また、すぐには役に立たないことが、これまで人類の文明を発展させてきたから。**
これは僕個人の価値観であって万人に当てはまるとは思っていないです。何を楽しいと思うのかも人それぞれ違うと思います。
僕はまだ大学生ですが、これから歳を重ねることで価値観や大切なことも変わっていくかもしれません。

一方でTwitterやエンジニア仲間の間では、「働きたくない」「給料が低い」「つまらない」とかそういったネガティブな話題が最近多いような気がしました。
自分自身エンジニアがすごいつまらないと感じていた時期もありますが、今は楽しんでできています。僕の"哲学"を共有することがエンジニアの皆さんにとってプラスに働くんじゃないかと思って、この記事を書きました。

### 人生における絶対の成功法則

仕事やお金というのは人生においてめちゃくちゃ重要なものだと思います。もちろんそれはわかっているつもりです。楽しい仕事でたくさん稼げた方がいいに決まっています。
けれども、それ以上に大切なものがあると思います。それが人です。
どんなに高いブランド物を身につけても特に何も起きません。でも、すきな人とだったら散歩してるだけでなんか楽しくないですか？
会員制レストランの超高級料理もおいしいけど所詮味覚だなって感じます。友達や同僚とコンビニの酒缶で騒いでる時の方がよっぽど楽しくないですか？
テスト勉強だって1人でするとめちゃくちゃつらいですよね。でも、友達と一緒にテスト勉強していれば、実は試験期間の方が普段よりよっぽど楽しいなんて思ったりしませんか？

友達や仲間と一緒にいる時は楽しいとはいえ、仲がよくてお互いを尊敬し合える関係でなかったら多分一緒にいてもそんなに楽しくないだろうなと思います。だからこそ、本当の意味で仲が良くてお互いを尊敬し合える関係こそが、自分が幸せになるために一番大切なことだと思います。
そこで、僕の考える絶対の成功法則を提唱します。

それは「**おもいやりを持つこと**」です。

思いやりとは、如何なる場面でも相手の立場に立って物事を考えることです。
これは、全ての人にやさしくしなさいというのと少し違います。人の気持ちを察したり、気遣ったりするなかで自然に生まれるのが「おもいやり」なんです。
結果として、自分の大切な友達、同僚や家族と接する時にやさしくできるようになります。
僕は本当に本当におもいやりを持った仲間や友達に恵まれて生きてきました。僕が相手の立場だったら、ここまでしてあげられないななんて思うことをしてくれる友達がたくさんいます。友達がこんなことしてくれたという話を別の友達に話すとびっくりされたりします笑
これは、お互いに**尊敬しあえる関係**を作れているからなんじゃないかなって思います。

### 尊敬される人

尊敬される人とはどんな人か考えたことはありますか？カリスマか？頭が良いひとか？結果を出した人か？
いいや、全部違いますね。
**尊敬される人とは、深い人間性を持った人。つまり、利害関係を超えて、本気でこの人と一緒にいたいと思える人なんです**。

僕は特別何かができるわけではないし、カリスマでもなければ天才でもありません。だけれども、困っている時に助けてくれる人がたくさんいました。多くの人を巻き込んで何かを起こしたい時、協力してくれる人がいました。

それは、僕はおもいやりのある人たちに運よく巡り会えたこと。そして、僕の大切な友人や同僚におもいやりを持って接してきたこと。この2つの条件の結果、お互いにリスペクトしあえる関係を築けたんじゃないかなと思います。

とはいえ、この記事を読んでいるほとんどの人がおもいやりを持った人ばかりだと思います。なぜなら、僕がこれまで出会ったほぼ全員の人にたくさんのやさしさをもらってきたから。

けれども、思いやりのない人に思いやりのある行動をしても何も返ってこないでしょう。さらには、人に騙されたりした時には、本当に大切なことが何かを見失ってしまう時がくるかもしれません。
そんな時には、「**人生における絶対の成功法則は、周りの人と接する時におもいやりを持つこと**」だということを思い出して欲しいと思います。

そうやって言葉にすれば、もう一度、相手の立場に立って考えることができるようになります。そうすることによって自然にやさしくすることができるようになって、**お互いに尊敬し合える関係を作れます**。そうすれば、自分も周りにいる人も幸せになれるんじゃないかなと思っています。

以上です。最後まで読んでいただき、ありがとうございました。