2019/02/16

Go言語から始まった数々の技術との出会いを振り返ってみた

TL;DR

直近の2年ほどを振り返ってみて、たくさんの技術に出会い、学び、日々使っているなぁと感じたので「ちょっとここらで整理してみるかぁ」という気持ちになりました。
自分用のチラシの裏感がすごいですが、おすすめの書籍なども適宜ご紹介しますので良かったら見てってくだしあʕ◔ϖ◔ʔ

振り返り

Go言語との出会い

2016年10月、「いろいろなプラットフォームで動作して、ランタイムやVMを必要としないツールが作りたい」と思った私は、Go言語を学び始めました。その時の自分は、青年期にBasicとFortran、お仕事でC++やC#を少し、趣味でJavaとKotlinを少しというスペックでした。

Go言語のバイブル的存在の日本語訳である書籍「プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)」の1章を試し読みして、強い衝撃をうけたのを覚えています。当時の自分にはほとんど馴染みのなかった「サーバープログラム」がいともたやすく実現できて、テストコードも含め何をするにも簡潔に書けて、パフォーマンスも抜群。出会ってすぐに「あぁ、Go言語こそ自分にとっての嫁言語だ」と確信しました。


次に取り掛かったのは書籍「Go言語によるWebアプリケーション開発」です。Mongo DBをバックエンドに用いてデータの永続化を行い、Go言語標準のテンプレートエンジンを使って情報をレンダリング、簡単なJavaScriptで少しだけ画面遷移などを行う簡単なWebサービスを実装しました。まだこの頃はモノリシックなアプリケーションを作っていました。


JavaScriptはちっとも分からなかったのですが、書籍「改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで」を参照して試作をしながら、なんとか必要な実装を完了させました。


書籍「みんなのGo言語【現場で使える実践テクニック】」では、社内ツールなどをGo言語で実装する上で必要な多くのテクニックを学ぶことができました。「gckdir」というツールもこの書籍での学びを多く用いています。詳しくはこちらの記事をご覧ください。


学び始めてから約1年間、ほぼ毎日毎晩Go言語の活用事例を調べたり、コードを書いて動かしてみたりというのを繰り返しておりました。

業務はC++やC#メインなので最初はGoを使うことに一抹の迷いがありましたが、自分が師匠と思っている方から「業務で使うべき。製品でつかってなんぼでしょ。」という主旨で背中を押していただいてからはガンガン使っていこうという姿勢に変わりました。

IoTの潮流

Go言語の業務利用を強く意識するようになった折、「IoTやろうぜ」という空気が自分の周りで強くなってきていました。何をやるにもGo言語がよくなっていた自分はGobotの存在を知り、これを使ってなにかやってみようと思い立ちます。

そうして生まれたのが以下の記事です。

WebAPIに触れ、作り始める

IoT機器のデータを他のシステムから使えるようにする仕組みとして、WebAPIでの実現を考えました。当時、Go言語でのWebAPI実装経験がなかった私は調査の中で記事「Build RESTful API service in golang using gin-gonic framework」にたどり着き、重要な2つの出会いに恵まれます。

1つめは、今も愛用しているGo言語最速のHTTP Webフレームワーク「gin-gonic/gin」との出会いです。他言語との速度比較や短時間に非常に多くのリクエストを処理する検証などで、Go言語が非常に高いパフォーマンスを発揮することが実証されています。参考記事を以下に列挙します。
こういった比較ではGo言語標準パッケージが用いられることが多いのですが、ginフレームワークを使うことでさらに高いスループットが得られます。私見ですが、JSON over HTTPを実現するサーバーサイドを実現する技術として世界最速でしょう。

// 余談
本記事の執筆中に出会ったのですが、WebSocket接続においても非常に高いパフォーマンスが実証されています。
Going Infinite, handling 1M websockets connections in Go
This repository holds the complete implementation of the examples seen in Gophercon Israel talk, 2019.
eranyanay/1m-go-websockets

そもそもWebAPIに対する知見が少なかったのですが、書籍「Web API: The Good Parts」に導いていただき、エンドポイントでリソースを表現すること、HTTPメソッドで操作を実現することなど、基本的なことから実際に設計する上でのポイントなど実践的な内容を学ぶことができました。


マイクロサービスアーキテクチャとの出会い

2つめは、WebAPIを作ったり使ったりする上で非常に重要な考え方となるマイクロサービスアーキテクチャとの出会いです。なぜ、大きな一枚岩のようなシステムではなく、多数の小規模なマイクロサービスが連携するシステムが必要とされるのか。どうすればその良さを享受できるのか。私自身、今でも学ぶことが多い内容です。

これについては、是非ともManningの「Microservices Patterns」をオススメしたいです。モノリシックなシステムの問題点を解析しながらマイクロサービスアーキテクチャをどのように適用してゆくのかについて実例を交えて体系的に説明してくれるだけでなく、サービスメッシュの必要性や適用方法など非常にモダンで有益な情報が満載な良書です。Meap(正式リリース前)の頃から買って読んでいますが、本当に素晴らしい内容で読むたびに発見の連続です。昨年末の正式リリースからずっとManningのbestsellersで上位になっているのも納得です。

日本語の良書でマイクロサービスアーキテクチャの概要を学ぶには、オライリーの書籍「マイクロサービスアーキテクチャ」が最適です。上記の書籍とあわせて読みたい一冊です。


フロントエンド技術も学ぶ

WebAPIなどサーバーサイドを作ったら、それらを使うフロントエンドも作りたくなりましたので学び始めました。

Vue.jsでのリアクティブ体験

温度情報などをレンダリングするフロントエンド実装にはVue.jsを選定しました。日本語チュートリアルが充実している点、手軽に始められる点、リアクティブなプロパティなどなどが気に入ったというのもあるのですが、一番良かったのはフロントエンドガチ勢でない自分にとって比較的敷居が低く感じたというのが一番のポイントでした。

electronでデスクトップアプリ

世に出てはいませんが、上記と並行して「WebAPIで取得した情報をレンダリングするデスクトップアプリ」の試作も行っておりました。書籍「Electronではじめるアプリ開発 ~JavaScript/HTML/CSSでデスクトップアプリを作ろう」で学びながら、electronを使った簡素なアプリを作っていました。皆さんご存知のようにATOMを生み出すために作られたelectronです。最近特に人気のVSCodeもelectron製なので、馴染みのある方も結構しらっしゃるのではないかと思います。


ionicでハイブリッドアプリ体験

さらに、当時関わっていた案件でAndroidやiOS対応アプリの需要もあり、ionic frameworkを使った試作に着手します。とてもわかり易く実践的な内容の書籍「ionicで作る モバイルアプリ制作入門〈Web/iPhone/Android対応〉」のおかげで、TypeScriptにもAngularにも初めて触れる自分でもスラスラとハイブリッドアプリ作成ができました。その時に作ったちょっとしたコンポーネントがこちらです。


安心のAngular

この時、TypeScriptの静的型付けでビルド時にチェックできる性質や、Angularのフルスタックなフロントエンドを作り込んでゆける点が気に入りましたので、もう少し踏み込んでAngularを学ぶことにしました。「Angularアプリケーションプログラミング」が網羅的に分かりやすく解説してくれている良書だと感じています。

(2019/02/17追記) こちらの記事で解説されているように、PWA機能を追加するのも簡単です。

バックエンドとフロントエンド両方作ってみて

両方やってみて強く感じたことが2点ありました。

手動ビルドとデプロイやめたい

作ったサービスを実行環境に適用する際に、何度か以下のような手順を実施しました。
  1. 手元で手動ビルド
  2. scpで実行環境にコピー
    • 初回の場合はsystemdスクリプトもコピー
  3. systemdでサービスを再起動しつつバイナリ差し替え
正直面倒。疲れました(ヽ´ω`)

「もうこれやりたくない!! 」と感じたので、dockerを学びながらまずは個々のサービスのコンテナ化を進めました。コンテナ利用時のデータ永続化について学びながら試行錯誤していた時の記事がこちらです。今見返すとmulti-stage buildsも適用したくなります。

GitHubやGitLabのPipelineを使って、以下のようにCI/CDが実現できたら素敵だなと考えています。
  1. 自動テスト
  2. 自動ビルドおよび自動コンテナビルド
  3. 更新したコンテナイメージをKubernetesクラスタにデプロイ
これについてはまだ学習中の内容も多く、Kubernetesを学びながら少しずつ実現している最中です。

同じJSONのデータ型をあっちこっちで実装するの面倒

WebAPIで取得できるデータ型を、フロントエンドやアプリ側で実装する機会が何度かあり「せっかくAPI仕様を決めたのに、あっちこっちで都度実装するの面倒だな・・」とぼんやり感じていました。

「次にWebAPIサービス作るときは何かもうちょっと違う仕組みを試して、この問題をなんとかしたい」
Swagger EditorOpenAPI Generatorに出会ったのは、そんな風に強く意識していた時期でした。これについては別の記事で詳しく書きたいと考えているのですが、APIのスキーマと定義することで非常に効率よく並行開発が可能になる技術です。

そしてクラウドへ...

上記で見てきたように、多数のマイクロサービスの管理や連携、監視、CI/CDなどなど、マイクロサービスアーキテクチャを良い感じで実現してゆくには考慮すべき内容が多数あります。

そのため、インフラチームが無いような環境では難しい面も多々出てきます。簡単にオンプレミスで試行環境を構築して「動かしてみる」レベルならプログラマがとりあえずなんとかすることも可能ですが、規模が大きくなってくるとそうもいきません。ちょっと疲れました・・(ヽ´ω`)

そんなこんなで、私もGoogle Cloud Platformを使い始めることにしました。業界最大手のAWSは業務で使い始めていたので、個人開発しながらクラウドの理解を深めるためのパートナーにはGCPを選びました。Googleの高い信頼性を誇るインフラに支えられている点や、提供サービスの種類がむやみに多様化しすぎていない点に魅力を感じたからです。あと、個人的にGoogleが凄く好きだから。

2018年の年末から使い始めたのですが、便利なサービスがマネージドサービスとして用意されているのは本当にありがたいですね。こちらこちらの記事でいろいろやってます。まだまだ初心者なので、もっと実践を重ねてゆこうと思います。

まとめ

振り返りと称して散文的につらつらと書いてみましたが、結構いろいろ実践してましたね。全体的に広く浅い印象なので、ポイントを押さえて深掘りしたいと感じました。

とりあえず、書籍「Go言語による並行処理」でGo言語にもっと修練しつつ、Istio on GKEを使ってIstioでいろいろ遊んでみたいと思いますʕ◔ϖ◔ʔ