🐙

車輪の再発明でのリスキリング[別解]

2023/12/14に公開

本記事はUzabase Advent Calendar 2023の14日目の記事です。
https://qiita.com/advent-calendar/2023/uzabase

はじめに

Goを学び始めてまもない頃、当時の同僚にGoを使ったプロジェクトをやりたいという話を持ちかけられた際に個人的にもう少し言語への理解を深めたいなというモチベーションでマイクロフレームワークを書いたので、車輪の再発明と学習題材の代表格であるTODOアプリや掲示板みたいな実際にアプリケーションを書くこととの違いみたいなものを書いてみました。

要約

  • プリンシプルオブプログラミングのプログラミングのアンチパターンにも書いてある通りですが、技術を高める目的であれば一定の効果はある。
  • 言語の学習目的であれば、ある程度実装が想像できるものを題材とするほうがよい。そして、極力がんばらない。
  • 新しく言語を学び始めて、FWやライブラリを使って簡単なアプリケーションくらいは書けるようになったが、今特に作りたいものがこれと言ってないけど、学習したいモチベーションがあるときに特に効果がありそう。

どんなものを作ったのか

いわゆるオレオレフレームワークなるものです。
軽量かつ必要最低限の機能のみを実装したマイクロフレームワークを作りました。

https://github.com/U5K492/go-rest

車輪の再発明とは

ここで改めて車輪の再発明についておさらいしておきたいと思います。

下記はプリンシプルオブプログラミングから引用したものです。

ある機能について、既にそれを実現しているコードやライブラリがあるのに、
自分で改めて同じ機能をプログラミングしてしまうことがあります。
これは、既に世の中にある「車輪」のようなものを、
わざわざ手間をかけてもう一度発明してしまうような、無駄な作業です。

今日ではWEBアプリケーションを作る上で、各言語ごとに有名なフレームワークやライブラリが豊富にあり、大体欲しいものは探せばだいたい誰かが作っている世の中なので、
わざわざ手間をかけてでも書きたいモチベーションがなければそうそう陥ることはない事象かなと思います。

また、プリンシプルオブプログラミングにはこうも書いてあります。

しかも、再発明したものより、既にあるものの方が、たいていの場合、品質は優れています。

じゃあ、どうして車輪の再発明が起こるのかは、大きく分けて下記の2点が上がっていました。

  1. 車輪をしらない
  2. 車輪をつくりたい

1 に関しては当人の知識不足や勉強不足による、意図しない再発明だと解説されていました。
そして、2 の方は意図した再発明として下記のように解説されていました。

改めて作成する必要はないのに、技術的興味や、他の人が作った部品を使いたくないという
プライドから、プログラマが自分自身で作ったもの以外を拒み、自分自身で何でも作りたがって
しまうという場合に当てはまります。

多少、偏った印象を受ける解説ですが、そういうプログラマも一定数はいるでしょう。

また、この本には車輪の再発明をすべきときというのも書かれています。

  1. ビジネス目的
  2. 学習目的

今回は、2 を実践したということになります。

なぜ、WEBフレームワークを書こうと思ったのか

結論から言うと、一度書いた経験があるからです。

その時のモチベーションとしては、
私はPHPを用いた開発現場をいくつか経験してきているのですが、直近では大抵PHPで開発となるとLaravelが採用されるのがデファクトスタンダートになっています。

Laravel のようなフルスタックフレームワークは便利な機能が豊富でとても素晴らしいのですが、
軽めのWebAPIの開発やビューを必要としないケースではほとんどの場合オーバースペックですし、コンテナに乗せるときにイメージが膨らみがちなのでLaravelのルーティングと少しの機能だけを抜き出した軽量なフレームワークがあると嬉しいなと思ったのがきっかけでした。

もちろん、プロダクションで使用する目的ではなくこう言うのがあれば嬉しいなというだけのモチベーションで個人的に作成したのですが、その時に書き慣れたPHPではあったのですが、学びが結構あったのが印象的でした。

その時は書き慣れた言語で書いたことなかったものを書いたのですが、
今回は学習中の言語で書いたことのあるものを書いてみるをやったということになります。

この方法は循環させることが可能で、学習中の言語が書き慣れた時にその言語でまた別の題材に取り組むことでその時に書いた経験を次に新しく言語を学習するときに転用できます。

得られるもの

基本的にゼロから書くということは現実的ではないので、有名なフレームワークやライブラリのソースを読むことになると思います。
それによって下記のようなものを得ることができると思います。

  • OSSさんありがとうの気持ちで溢れる
  • OSS開発への興味が湧く
  • コードリーディング力が上がる

まとめ

今日のプログラミング言語やフレームワークはチュートリアルがよくできていたり、ドキュメントが読みやすくわかりやすかったり、直感的に書けるようになっているので、ある程度それだけで書けるようにはなるとは思いますが、新しく言語を学習するときの選択肢として引き出しに入れておいてはいかがでしょうか?

参考

https://github.com/go-chi/chi

https://github.com/labstack/echo

https://github.com/gin-gonic/gin

Discussion