技術系の議論をしていて、「それ、車輪の再発明じゃんw」みたいに言われたのが、めっちゃ腑に落ちなかったので、思いの丈を書いてみます。
システムを作るときに一番重要だと思うもの
僕がシステムを作るときに一番重要だと思うのは、
- 正しく動作すること!!
です。
言い換えれば、
- ダウンせずに動いて、求められている機能が求められている時間内で実行出来ること
です。
(ずっとダウンしないとか無理なのは承知で言ってます。)
それを実現するためには、「すべてのシステム動作が理解できている」かつ、「対象のソースコードを変更可能」であることが重要だと思います。
それが出来れば、すべてを掌握できるので、何かあってもすぐに直せるし、正体不明のバグに苦しむこともないです。
究極を言えば、CPUとかOSも作成して完全無欠に理解したいです。
ですが、現状ではGoogleとかAppleとかのトップ企業くらいしかそんなこと出来そうに無いです。
なので、開発に時間が掛かり過ぎるようなものを再発明はしないほうが良いとは思います。
しかし、そこまで時間が掛からずに作成できるものは作成しても良いのでは?という話です。
再発明のメリット
下記のメリットがあります。
- 自分達のシステムに合わせたシンプルで高速な車輪が使えるようになる
- 自分のチームで作成したものなので、何かあっても直せる
- 自分のチームで作成したので、仕組みを理解できている
- 対象のOSSは突然終了したりするかもしれないが、自分のシステムは続けられる限り終わらない
自分のシステムに合わせたシンプルで高速な車輪が使えるようになる
こちらの記事が参考になると思うのですが、ruiさんが高速なリンカを開発したときの話です。
本来であれば、既にリンカが存在していたので、完璧に車輪の再発明です。再発明の否定派からマサカリの嵐なはずです。
ですが、「ビルドが速くなったありがとう」と大絶賛です。すごいです。
この例だと、既存の車輪が、自分らが求める要求仕様を満たしていなかったので、あってないようなものだったのかもしれません。
また、高速動作を求めるとシンプルさが絶対条件になってきます。
NVIDIAという会社は、機械学習用のチップと、グラフィック用のチップで設計を変えて出しています。
速さを求めると、どうしても用途を限定して特化させる必要があり、なんでも出来るというのは特化型には勝てないということだと思います。
自分のチームで作成したものなので、何かあっても直せる
これはシステムの安定動作に重要な話だと思います。
Linuxなど開発が活発なOSSは何か合ってもパッチを作成してくれると思います。
しかし、何年も前に開発が止まってしまったようなものを使っていると、自分らではコミット権限が無く直せなかったりします。
ちゃんとコードの内容を隅々まで理解して、ホワイトボックス的に使っているというのなら、自分のところに持ってきて直して使うというのは可能だと思います。
しかし、そうやってOSS使っている人は少数だとおもいます。
自分のチームで作成したので、仕組みを理解できている
上の話とも被りますが、仕組みを隅々まで理解していないと、安定動作が危うくなるので、必要だと思います。
「ORM使っていたら、クエリめちゃくちゃ投げていて処理に時間が掛かっていた」とか、現場でもありました。
余談ですが、↑を防ぐためにDB側のクエリログが意図したものか?コーディング中に確認することが必要だと思います。
対象のOSSは突然終了したりするかもしれないが、自分のシステムは続けられる限り終わらない
NPMとleft-pad : 私たちはプログラミングのやり方を忘れてしまったのか?
こちらの記事に書いてありますが、昔、npmモジュールでleft-padモジュールが削除され、それを使用していた多くのモジュールがnpm installできないという事件がおきました。
「車輪の再発明」を嫌がった結果なのかどうかは分からないですが、依存モジュールがあるとこういうことも起き得るという事例だと思います。
自分らで開発していれば、消さない限り消えないのに、誰かがNPM消しただけでシステムがビルド出来なくなるなんて駄目だと思います。
(自社でNPMサーバ建てれば良いとか、プロジェクトにコミットしちゃうとか、打ち手はあると思いますが。。)
まとめ
とはいえ、全部開発していたら時間が無くなってしまうので、既存のものを使う必要はあると思います。
ただ何も考えずに、車輪の再発明を否定するのではなく、色々と熟考した結果、今回はしないとか、今回はするとか決めてほしいですm(_ _)m