未経験で初現場がGo。RubyやJavaを学んできた自分が感じた「考え方の違い」
はじめに
未経験でSES企業に入社し、実務で初めて触れる言語がGoに決まりました。
Goの学習経験はありませんでしたが、RubyやJavaをある程度学んできたので、
正直「ちょっと書き方が違うくらいだろう」と思っていました。
しかし、キャッチアップを進めていくうちに、書き方の違いどころか考え方そのものが違う言語だと感じています。
この記事では、RailsやJavaしか知らなかった自分が、Goに触れる中で感じた 「考え方の違い」 をつらつら書いていきます。ポエムです。
想定読者
- Goのこと何にも知らないけどなんとなく気になってる未経験エンジニア
- Ruby、Java、PHPなどの「フレームワーク文化」で学んできた未経験エンジニア
- オブジェクト指向が当たり前だと思っている未経験エンジニア
1. フレームワークが設計の土台ではないという違い
RailsやSpring Bootで学習してきたので、自分にとってサーバーサイド開発は
- MVCで構成される
- ディレクトリ構成が決まっている
- ルーティングのパターンが統一されている
- ORMが最初から組み込まれている
といったように、フレームワークが設計の前提でした。
「フレームワークが細部まで枠組みを提供してくれて、それに乗っかればアプリができる」 という文化が当たり前という感覚です。
しかしGoは根本的に違います。
Goではフレームワークは「補助ツール」でしかないようで、RailsやSpring bootとは根本的に異なる以下のような特徴があります。
- Goのフレームワークであるechoやginは、Railsのように全体の設計を規定しない
- プロジェクトの構造(MVCにするかどうか含め)は実装者が決める
- ルーティングの書き方や配置の仕方はフレームワークやプロジェクトごとに異なる
- ORMも実装者が利用するしないを決める
つまり、RailsやSpring Bootはレールに乗るだけだが、Goのechoやginはレールから自分たちで作るイメージです。
フレームワーク依存で学んできた身としては、最初にここで大きな戸惑いを感じました。
2. オブジェクト指向で整理しないという違い
RubyやJavaでは、クラスや継承を自然なものとして学んできました。
- クラスを作り
- メソッドを持たせ
- 継承で共通化し
- 階層構造にまとめる
という整理の仕方が当たり前でした。
しかしGoは、ここでも明らかに異なる考え方を持っています。
Goにはクラスも継承もないんです。
その代わりGoは、「階層」ではなく 「コンポジション(組み合わせ)」 で設計するという、とてもシンプルな設計思想を持っています。
RailsやJavaの「上位の概念」「継承階層」「抽象クラス」といった考え方から入ってくると、整理の仕方そのものが違うことに驚きました。
ただし、構造体というクラスに似たデータの塊に、関連するメソッドを定義できるので、オブジェクト指向っぽい書き方は可能です。
3. 「魔法」ではなく「明示」を重んじるという違い
未経験エンジニアにとって、Railsには「なんか知らんけど動く」部分がたくさんあります。
これは学習初期にはめちゃくちゃ助かりますよね。
しかしGoは、こういう魔法を極力排除したい言語だと感じました。
Goの世界ではとにかく明示的であることが大事で、
- ミドルウェアを自分で積む
- どの関数が何をしているかが常に明確
- 暗黙の依存関係がほとんどない
- 自分が見ているファイルに全部書いてある感覚を持てる
のような特徴があります。
RailsやSpring Bootの「便利のやさしさ」とは別で、Goは「透明性のやさしさ」を重視しているように感じました。
4. 「シンプル=簡単」ではないという違い
Goはその設計思想から「シンプル」と言われがちです。
しかし、触れるうちに分かったのは、そのシンプルさを維持するためには一定程度の技術レベルが必要になるということです。
例えばRailsとの違いが顕著に出る部分で、Railsでは
- ディレクトリ構成
- 責務分割
- ルーティングの型
- ORM
などがフレームワーク側から提供されます。
しかしGoでは、これらが「全部自由」です。
ディレクトリ構成も責務分割もルーティングの型もORMの利用も全部プロジェクト次第です。
つまり、シンプルなコードを書くためにはシンプルに設計できるスキルが重要になると感じました。
まとめ:言語によって考え方って全然違う
最初にGoに触れた時に自分が戸惑ったポイントは、
- フレームワーク中心ではない
- 階層構造を作ることを前提にしていない
- 魔法を使わず明示を重視する
- シンプルを維持するスキルが求められる
というような、書き方よりも「考え方の違い」でした。
RubyやJavaに触れてきたからこそ、Goの考え方は新鮮で、ピヨピヨながらプログラミングの奥深さの一端に触れた感じがしています。
これから実務を通して、一人前のgopherになれるよう精進していきます。
Discussion