#7 将来のシェアNo.1のGo言語がなぜ優れているのかとベストプラクティス
今回はGo言語についてです。
第3回の「オブジェクト指向って古い」っていう動画でも少しGO言語に
ついて触れましたが、今回すこし詳細を詰めて説明していきます。
Go言語のメリット
速く、CPU、メモリリソースの消費量が少ない
他の記事でもよくみかけますが、GOはコンパイル言語なので、
PHP、Rubyなどのスクリプト言語に比べると早く
さらに、Javaにある互換性を保つためのマシンのJVMみたいなのがGoにはないので
コンパイル言語のJavaと比べてもその分速く、リソース消費が抑えられると
言われています。
「Go パフォーマンス 比較」で検索すると多く記事が見つけられるので、
ここではパフォーマンスの検証はやめておきます。
環境構築が簡単
使ってみた感想ですがPHPやJavaのように、
WEBサーバーを最低限動かすだけでも数々のモジュール
のバージョンをチェックして、インストールしないといけませんが、
Go言語の場合はインストールが必要なモジュールが少なく、
そのモジュールを入れて依存関係の問題やヴァージョン違いによるエラーに
なったことがないです。
PHPの場合はcomposerであったり、JAVAの場合はgradleであったり、
パッケージマネージャの設定をしないといけない場面が多いのですが、
Goの場合は直接githubのパスをGoのインポートの部分に記載すれば
パッケージが使えるので、簡単にライブラリが使えます。
Go言語でもGlideというのがあるのですが、特になくても問題ないです
この依存関係で一番苦労したのが個人的にはPythonです。
MySQLのクライアントですらエラー出まくってなかなかインストールできませんでした。
python python3 pip pip3などメジャーバージョンの互換性がないので、なかなか時間を
取らされました。
開発のテストはコンパイルをいちいちしなくてもrunコマンドで動かす事ができます。
都度都度runコマンドしないといけない所はスクリプト言語に比べて面倒ですが、
そこまでのタイムロスにはならないかと思います
IDEもVSCODEとかのテキストエディタよりのIDEでも十分コーディングできるので
JAVAの場合みたいに開発環境構築のドキュメントがEclipseありきになってる
って事もないです
デメリット?と思われる部分
静的型付け言語コード量が多くなって難しい?
PHPとかに慣れてる人は初め慣れないかもしれませんが、
慣れればそこまで難しくはないと思います。
Javascriptであえて静的型付けするTypescriptが流行ってる
ぐらいなので、デメリットとは言えないかと思います
継承、例外処理がない?
「オブジェクト指向って古い」っていう動画でも触れましたが
継承、例外処理がないぶんコードの書き方が統一されて
むしろメリットだと思います。
Goエンジニアの人口が少ない
google trendで見てみても、まだまだPHP等で比べると人気はないです。
人気がないと、ドキュメントの量も少ないですし、ライブラリの量も
少ないです。実質のデメリットとしてはこれぐらいかと思います。
Go言語のベストプラクティス
フレームワーク、ORMを使わない
Go言語標準でテンプレートも用意されているので、不要なうえ
誰が書いても似たようなコードに統一できる所をそういった
ライブラリを使用することで統一感がでなくなります。
フレームワークを使わなければセッション管理も自前で作成しないといけないですが、
システムの原理を知らずにフレームワークに頼ってブラックボックス的に
使用している事の方がリスクが高いと思います。
多くのエンジニアはベンダー、やライブラリの機能や使い方を覚えたがりますが、
提供されている機能の使い方を覚えるのではなくて、システムの原理を理解する必要があり、
システムの原理さえ理解していれば、どのプログラミング言語だろうと、
どのライブラリだろうと対応できます
なので、GoでもGin,EchoなどのフレームワークがありORMでもGORMとかありますが、
それらのライブラリを使用する限りGoのメリットを活かせる事はできないかと思います
できる限り共通関数を作成しない
MVCはWEBアプリケーションの設計パターンとして一般的ですが、MVCでの開発
をやり初めの頃からモデルが不要と思えて仕方ありませんでした。
そこでGoのコンセプトのorthogonalityに出会って「これだッ!」と思いました。
モデルがあるせいで、人によってビジネスロジックの解釈がちがっていたり
Model担当者、Contoroller担当者、View担当者を分けて開発する現場もあり、
非効率極まりなかったです。
なのでMVCもMなしのVCで問題ないです
多くのエンジニアは共通関数を作りたがります。そしてその関数を標準関数のように
使わせ、再利用させたがります
ただ、ビジネスロジックと関連した共通関数を作成した場合、そのビジネスが
どう変更するかわからないので、作成された共通関数を変更しないといけない時
はそれが使用されているシステムが多い程、影響範囲も大きくなってきます
なので、ビジネスロジックとは関係ないセッション管理など最低限の共通関数
にとどめておく事が重要かと思います
システム的な関数でもエラー処理の場合、自前で共通関数を作って失敗したと
GoのカンファレンスでDNAのエンジニアが発表してたので、エラー処理もGo標準の
関数で事足りるかと思います。
ログ処理に関しては微妙で、ログの内容によっては別ファイルに
書き出しなどしたい時もあります。しかし共通関数にせずにそのようなログシステム
が欲しい部分で直接コーディングする事の方がいいかと思います。
Goを使う上でGoのコンセプトであるorthogonalityという関数同士が干渉せず
独立性を保つこととされているので、先程述べたような思想がGoとマッチする
かと思います
説明欄にorthogonalityのwikipediaのURLを貼っておきます
go言語は人気がない
先程のorthogonalityの考え方でコーディングすると
似たような関数が合った場合はコピペしてベタ書き
SQLがコントローラ内にある
コード量が多くなる
経験豊富なプログラマーからすればダサくて汚くて、面白くない設計パターンです
しかしながら、コーディングに面白さを見出そうとすると不必要に
複雑にしてしまうので、コーディングはあくまでシンプルに初心者でもわかりやすいように
書くことが重要だと思います。
経験豊富なプログラマーが「美しい」コードを書いて、そのシステムを初心者になかなか
引き継げず、まるで初心者がその「美しく」複雑なコードについていけないのは
その初心者のスキル不足のせいになってしまい、そこのシステムは「美しく」複雑な
コードを書いた本人でないと対処できないって状況に陥る現場も経験しています。
そして、その経験豊富なプログラマーが属人的にすればするほど
そのプログラマーしか解決できないのでそのプログラマーが褒め称えられる
というような現場もありました。
シンプル、綺麗、簡単にコードを書くことは全員が一致している認識なのですが、
各々の綺麗などの捉え方が違うので、「初心者でも理解ができるコード」という事が
重要だと思います。多くのエンジニアがそう思っていない現実があります。
ここ20年WEB開発で最新の設計だの、デザインパターンだのと日進月歩の勢いで
変わってるかのようです。Go言語はそういった思想を一切無視して
設計されているので、多くのプログラマーからは嫌われています。
しかし、WEB開発の根本的な所は大きく変わってないので、Go言語の思想は問題なく
正しいと思います。
安易に流行に振り回される必要はないかと思います。
Java,PHP,Python,Ruby,Javascript内での言語を変えて開発してみようと思う
プログラマーは多いのですが、オブジェクト指向ではないGo言語に躊躇してしまう
プログラマーが多いと思います。
しかし、小松がクイジェンを開発した上では詰まる所もなければ
違和感もなく開発ができ、そこまで言語の難しさも感じなかったです。
速く、リソース消費が少なく、フレームワークなしでコードが統一されるという
最強プログラミングなので、是非挑戦してもらえればと思います。
具体的なセッションであったり、DBとの連携などは実践編で紹介していきたいと思います。
https://en.wikipedia.org/wiki/Orthogonality_(programming)
https://www.youtube.com/watch?v=nJWtmhPN_5w