技術についての考え方

普段、技術について考えることがある。
これは、技術とはどうあるべきだというような話ではなく、自分はこう考えているということ。さらに、その思考は日々刻々と変化している。
全体的に、直近 1 年だと自分は技術を目的だと捉える傾向が強くなってきた。内定先でバイトをしたり、他社のインターンに参加したりして、よりその思いが強くなったように感じる。

技術領域

自分は、特定の技術領域にこだわることは自分自身の成長を妨げることにつながると考える。もちろん、何かに特化したスペシャリストはいると思う。しかし、そのような人も最低限の知識は満遍なく持っていて、その上に専門性を持っている場合がほとんどである。自分はその最低限すら身につけていない。この若い時期に、特定の技術領域に特化しようとすることは危険だと感じてしまっている。

また、それと同時に、自分がやりたいことはフロントエンドやバックエンド、インフラなどという、新卒採用の時によくある技術区分ではなく、web である。
フロントエンドやバックエンドという表現を否定しているわけではなく、自分はそうではないというだけの話。プロトコルだったり、ブラウザだったり、そこを追っていきたい気持ちがここ最近強く出てき始めいている。
これからもこの気持ちは変わらないと思う。web を追って行けるようなエンジニアになりたい。

技術は目的

これはよく論争が起こっているが、そんなもの人それぞれだし、技術と目的の比率も全く一緒という人は存在しないため、この議論は無駄である。
自分は、技術と目的の比率が 8:2 くらいで考えている。
自分は、技術を使って何かものを作ることが好きというよりは、技術を使って技術のサポートをしたり、技術を学ぶこと自体が好きだったりする。
そのため、技術を追いかけ、技術を使い、技術とともに生きることが好きだ。

なら技術 10 割じゃないか。しかし現実はそうはいかない。人間は仕事をしなければならない。
技術を手段としてだけ捉えてる節もなくはないが、仕事をしていると人から感謝されることが多い。お茶の子さいさいじゃないかと思うような軽微な修正をしただけでも、社内でとても感謝されたりする。
こうして、人に技術を使って何かを届けることはとても楽しい。なんてことない実装でも需要があるんだな、自分の持っているものが必要とされているんだなと実感できるととても嬉しい。

技術を使って人に何かを届けるという部分を含めて、8:2 くらいかなと感じている。

維持に興味が出てきた

今まで、何かを作ることだけをしてきた。
しかし、この 1 年を通して、作ることよりも、キープをすることの方が重要性が高く、難易度も高いことにやっと気づいた。気づいたというより、わかっていたけど、自分で体験をして実感することが増えた。
何かを作る時、特にプロダクションコードだと考えて作らないといけない。例えば、剥がしやすい設計にすることは個人的に重要だと考える。すぐ実装することができ、すぐ捨てることができるようにすることで、属人化を防ぎ、スピード感のある開発をすることができる。
また、最近だと Web フロントエンドの開発効率を高く保つための考え方 を読み、さらにこの部分に関心を持つようになった。
また、上記のリンクで参照されていた 「悪い方が良い」原則と僕の体験談 も読んだ。

作るよりも、維持する方が難易度が高い。なら難しい方を、より論理的に考えた上で抽象化し、さらには生んでしまった負債をどう返済するかについて考えようじゃないか!みたいな思考になってきてる。もちろん作るのが嫌いになったわけではない。仕事の楽しみ方を見つけてしまったような、そんな感覚でいる。
自分はソフトウェアの維持にはだいぶ疎い。また、組織まで包めた維持や運用となるともっと疎い。そこをもっと突き詰めていけるような、考えて実装をしていける人間になりたい。

車輪の再発明開発

車輪の再発明は原点にして頂点だと考える。
自分は車輪の再発明が好きだ。
先人の知恵を吸収した気になれる。(気になれるだけだけど...。)
何を食べたらこんなものが思いつくんだ、これはどう動いているんだなど、自分が普段何気なく触っている技術やコンピュータの基礎を理解し、自分で実装してみるとさまざまなことが見えてきて、さらにその実装の問題点なども見えてくる。
さらに進むと、これはなぜこうなっているのかを考えたりする。意外とあっと驚くような実装は多くなく、どんなにすごい技術でも当たり前のことを積み重ねて完成されてるんだなという気持ちになる。

そして、自分で何かライブラリを作ってみると、既存のライブラリの便利機能に「便利だな〜」と心から思えるようになる。
例えば、GraphQL の AST を触ることができるような関数群は非常に便利で効率的かつ使いやすくできている。普段自分で形式言語を書くときは、ユーザーが AST を直接触ることができるような仕組みを提供する余裕がないが、AST を触るようなしっかりしている言語やライブラリ、GraphQL のようなクエリはそこが充実していることが多い。実際に自分が作ることによる大変さと、先人の知恵、既存の実装の便利さなど、さまざまなことを学ぶことができ、自分はこれを推している。

フットワークは軽くあれ

何か新しいものを作るとき、何か新しいライブラリを導入するとき、興味のある技術が出てきたときなど、調査をすると同時に各ライブラリや技術をなんでもとりあえず試してみるといった、フットワークの軽さは非常に重要だと思っている。
壁打ちや素振りをしないと見えない部分はあるし、手を動かした方が理解ができるというのは勉強をする上で当たり前のことだと思う。本やドキュメントを読むだけで理解できたら人間苦労していない。
新しい技術を試すときに、状況や技術スタックを踏まえた時の妥当性や、そのライブラリの使用状況、OSS としての運用、長期的に見た時の負債などを考慮するときに必要な工程が素振りだと思っている。
素振りをするために自分は壊しても大丈夫なそこそこユーザーがいるようなサービスを持つようにしている。例えばブログは 3 ヶ月に 1 回くらいは技術の入れ替えをしているし(意図的ではない、素振りしたい時だけ)、このメモ帳も何回か技術を変えている。また、自分のブログはサーバサイドも自分で書いていたり、認証基盤やエラーハンドリングなどを内製していたり、普段から技術領域を問わず素振りをできる状況を整えている。新しいリポジトリを作って作業をすることもあるが、大半の場合は既存の部分に突っ込む形が多く、そういう前提の時のハマりポイントも整理しておきたいのでそのような構成にしている。

この運用にしてから新規技術にビビらなくなったし、何かしら作ったり学びがあったらブログに書くような癖もついた。
これはこれからも継続していきたいし、だいぶ便利なので布教したい。

まとめ

長々と書いたが、これが大学の卒業を控えた現段階での自分の技術に対する考え方・向き合い方である。
これから先、変化していくだろうし、社会人になってからお仕事プログラマとなる人も少なくはない。特に自分の内定先は多いように感じる。
それが悪いことだとは思わないが、自分には向いていないと思う。自分は趣味を仕事にしてしまっている。趣味が目的ではなく手段になったとき、それは引退のサインなんだと思う。
あまり重く受け止めずに、ゆるゆると、これからも楽しく技術を追い求められればいいなと思う。変化の早い現代で、新しい技術に食らい付き、新しいものを作り出し、維持し、自分も自分が関わっている組織も成長していけるような、そんな人間になりたい。