こんにちはまくロロです。今回はRailsからGolangを習得する際に感じた困難だった点やポイントを書きたいと思います。
私は文系出身で、大学では全くコンピューターサイエンスなどを勉強した経験がない人間です。
Railsから入って、そのまま企業で大学生インターンをして勉強してきました。駆け出しエンジニアでRailsをしばらく勉強したけど、Goにも興味があるという方の助けになればと思います。
最近Golangが流行ってきていて、これからも需要が伸びそうっていう話をよく聞くんだけど僕も勉強してみようかな。。
目次
Goの難易度
まず習得難易度からいうと
RailsからGolangを習得するのは難しいです。
詳しい難所ポイントは以下で詳しく記述しますが、Railsを少しできるぐらいの状態でGolangを勉強すると難しいと感じる人がほとんどだと思います。
おそらく、情報系の学部でC言語系やJavaなどを勉強した経験がある方はすんなり理解できるのでしょう。。
しかし、まともにコンピューターサイエンスを勉強していない非情報系の人は結構最初に苦しむ可能性が高いと感じました。
私もRailsで簡単なアプリケーションは一人で作成できますし、インターンの業務でも大抵は自力でこなせるぐらいの力は(おそらく)ついていると思います。
私の駆け出し時代の簡単な勉強順序は以下のような感じです。
この程度やっても最初のGo習得、またアプリケーションをGoで作るのは苦労しました。
ではどのようなポイントが難しいのか具体的にみていきましょう。
難しいと感じたポイント
以下が私が感じたRailsからGoを習得する過程で難しいと感じたポイントです。
それぞれ細かくみていきましょう。
日本語の情報が少ない
まずGoを勉強し始めて一番最初に感じる点は、とにかく日本語の情報が少ないということです。
Railsの場合、ほとんどエラーは誰かが解決策を提示してくれていることがほとんどですし。さらに、何か作成したい機能などがあれば、それを参考にして少しカスタマイズするぐらいで、ある程度完成してしまうぐらいの素晴らしい記事が溢れています。
しかしGoの場合、基礎的な文法や環境構築などの記事はたくさんありますが、少し込み入った技術に関しての記事はRailsと比べて圧倒的に少ないです。
ベテランエンジニアはドキュメントだけあれば、複雑な機能でも作成することができると思いますが、駆け出しでGoをドキュメント重視で習得するのはかなり難易度が高いですよね。
なので日本語の記事がまだ充実していないのはかなり痛いです。
おすすめは、英語の記事をGoogle翻訳やDeepLで翻訳しながら記事を読むことです。
APIの実装の仕方が身に付いていない
続いてはAPIに関してです。
RailsをAPI化して、フロントと分けている企業はまだ少数かと思います。多くの企業がRails単体のモノリシックな設計をしていると思います。(Railsチュートリアルとかもそうですね)
そのような開発にしか携わっていないとどうなるか。
APIって実際どうやって作るの?
ってなります。なぜそうなるかとうと、Rails単体のアプリケーションはフロント、ビジネスロジク、モデルが全ていい感じにつながっているので、API独自を作成することがほぼないです。
そんな状況でGoでAPI開発にいきなり携わると、以下のようなことがおきます
上記のようにRailsではあまり経験しなかったようなことが多々あります。他にもまだまだたくさんの知らないことが出てきます。
Railsでのアプリケーション作成が全てだと思っていると大打撃を受けますね。
コンピューターサイエンスの知識不足
続いてネックになるのが、コンピューターサイエンスの知識。Railsでのアプリケーション開発だとRailsが色々勝手にやってくれるので実際の処理がブラックボックス化していても実装できてしまいます。
また、GoではRailsにないようなポインタ、アドレスなどのメモリをいじる処理、byteデータを扱ったりなど、大袈裟にいうとコンピュータのハードウェアまで意識することが要求される場面があります。
よく、Goは大規模で高速な処理が向いていると言われていますが、まさにこのような細かいところまで言語レベルで実装に落とし込める仕様になっているからこそということですね。
しかし、このような部分がRalisだけを勉強してきた初学者にとっては理解し難いところでもあるともいえます。
各ライブラリが薄い
続いてはライブラリが薄いということです。
ライブラリが薄いというのは、RailsのGemみたいに任意の機能がガバッと扱いやすい形で提供されるのではなく、開発者で細かくカスタマイズができるように、最低限の実装しか提供されていないということです。
正直RailsのGemは爆速でアプリケーションを作成するのには強力な見方です。しかし、それが故にどのような仕組みでその機能が動いているのか深く考えずに終わらせてしまうことがよくあります。
しかし、そのような開発になれていると、おそらくGoを使った開発ではかなり苦労すると思います。
一個の機能を作るだけでも、たくさんの細かい技術を意識する必要があるからです。細かい箇所までしっかりと理解して実装する力が求められるということですね。
マイクロサービスでアプリケーションを作る
最後にマイクロサービスでアプリケーションを作るという点です。
マイクロサービスとは複数のAPIやサービスを組み合わせて、一つのアプリケーションを作成するという設計手法です。
Railsの場合、大部分の機能は一つのRailsアプリケーションの中で完結すると思います。
しかし、マイクロサービスの場合様々な機能がそれぞれ別々に疎結合でつながっているので、とにかく最初の方は何がどうなっているのかわかりにくいです。
さらに、たくさんのサービスがつながっているので、必然的にその結合部分や外部サービスを動かすコードが必要です。これがまた厄介で、各サービスでそれぞれ異なった仕様のコードを記述する必要がでてきます。
また、その複数のサーバーを耐障害性のためにkubernetesなどのソフトウェアを使って自動的に冗長化させ、各サーバーを増減させたりするのでアプリケーション全体としてはさらに複雑になります。
Goはクラウドネイティブと呼ばれるようなインフラの最新技術たちと相性がいいので、そのようなミドルウェアと一緒に使われる場面が多いです。
なのでそのような最新のミドルウェアの技術をキャッチアップしていくことも求められます。
まとめ
今回は文系未経験で、Rails→Goと勉強してきた私が感じたことを書いてみました。
まだGoを初めて日が浅いので、これからもっと色々壁があると思います。その際はまた共有できればと思っています。
今回はGoが難しいというお話でしたが、裏返していうとGoを勉強することで、深くソフトウェア開発を学べるということです。
RailsもGemなど使わずに、細かい設計をすることは可能ですが、そんなことをするぐらいだったRailsを使う必要はないですし、Railsをの特性を全くいかせなくなります。
巷では、Goは覚える文法が少なくスッキリしていて書きやすと強々エンジニアが言っていますが、それはあくまで言語仕様の話しであって、初学者の方がアプリケーションを作りやすいとイコールではないです。
むしろ、文法やライブラリすっきりしているということはカスタマイズしやすいということ。つまり、自分で色々実装できる力が求められるということです。
この辺を理解しないで、需要がありそうだからと飛びついて挫折し、プログラミングが嫌いになったしまったら元も子もないです。
なので、私的にはまずはRailsをしっかり学びつつ、ブラックボックス化してる部分を徐々にGo使ってを学びます。そして、最終的にGoに完全にシフトするのが良い選択だと思います。
次回は、実際に私がどのようにGoを勉強しているか、RailsからGoへ駆け出しエンジニアの方が挫折しないようなフローを共有できればと思います。
この記事へのコメントはありません。