Slide 1

Slide 1 text

なぜ私たちはGoを書くのか 今あらためて考えるGo言語の良さと実際 2019/10/04 第138回RITS技術交流会 Yoichiro Shimizu @budougumi0617

Slide 2

Slide 2 text

● 清水 陽一郎 @budougumi0617 ○ Backend Engineer ○ Go / Ruby ● Blog ○ 毎週書いてる 自己紹介 2

Slide 3

Slide 3 text

自己紹介 ● 埼玉大学大学院数理電子情報系専攻 博士前期課程修了 ● 2011年 リコーITソリューションズ株式会社入社 ○ 商業印刷用プリンタの外部コントローラ開発 etc... ● Java研修/Java8研修/Go言語研修 受講 3 https://twitter.com/yoshiki_shibata/status/820074722700296193

Slide 4

Slide 4 text

自己紹介 ● 2017年 freee株式会社 ○ 電子証明書を利用したアカウントアグリゲーション用アプリ( Windows) ○ マイナンバーカードを利用した電子申告アプリ( macOS) ○ クラウド会計サービスのアカウントアグリゲーション機能のマイクロサービスの開発 ○ 金融機関とのAPI連携のためのOAuth2.0認証・トークン管理マイクロサービスの開発 4 https://customers.microsoft.com/ja-jp/story/freee-professional-services-xamarin-azure-visual-studio-japanese-japan

Slide 5

Slide 5 text

GoConference’19 5

Slide 6

Slide 6 text

6

Slide 7

Slide 7 text

自己紹介 ● 2017年 freee株式会社 ○ 電子証明書を利用したアカウントアグリゲーション用アプリ( Windows) ○ マイナンバーカードを利用した電子申告アプリ( macOS) ○ クラウド会計サービスのアカウントアグリゲーション機能のマイクロサービスの開発 ○ 金融機関とのAPI連携のためのOAuth2.0認証・トークン管理マイクロサービスの開発 7 https://customers.microsoft.com/ja-jp/story/freee-professional-services-xamarin-azure-visual-studio-japanese-japan

Slide 8

Slide 8 text

自己紹介 ● golang.tokyo 運営 ○ https://golangtokyo.connpass.com/ ○ メルカリ、DeNA、eureka、freee、Wantedly etc... ○ 月イチで勉強会 ○ 技術書典で合同誌の執筆 ● Go Conference 運営 ○ https://gocon.connpass.com/ ○ 半年に一回カンファレンスを実施 ■ google Goチーム、海外からの登壇も ○ Goのリリースに合わせたリリースパーティ 8

Slide 9

Slide 9 text

Go Conference 2019 Autumn ● https://gocon.jp/ 9

Slide 10

Slide 10 text

今日のテーマ
 Goの紹介
 実際に使ってみて
 10 /

Slide 11

Slide 11 text

アジェンダ ● 自己紹介 ● Goとは ● Goが生まれた背景・設計思想 ● 業務で利用して実感するGoの良さ ● 実際にGoを始めるための第一歩 11

Slide 12

Slide 12 text

アンケート
 12 /

Slide 13

Slide 13 text

Goを使ったことがある方? 13

Slide 14

Slide 14 text

merpay 14

Slide 15

Slide 15 text

kyash 15

Slide 16

Slide 16 text

Pairs(eureka) 16

Slide 17

Slide 17 text

Nature Remo 17

Slide 18

Slide 18 text

LOVOT (Groove X) 18

Slide 19

Slide 19 text

Wantedly 19

Slide 20

Slide 20 text

Go採用企業 ● GAFA ● Uber ● Sony ● LINE ● DeNA ● CyberaAgent ● CookPad ● Preferred Networks ● バンダイナムコ ● etc... 20

Slide 21

Slide 21 text

Goで作られたOSS ● Docker ● Kubernetes ● Terraform ● Hugo ● Prometheus ● etc... 21

Slide 22

Slide 22 text

Goが活躍できる場所 ● Linux / macOS / Windows ● Web ● IoT ● Mobileアプリ ● WebAssembly ● AWS Lambda / Google Functions ● Google App Engine 22

Slide 23

Slide 23 text

Goとは
 23 /

Slide 24

Slide 24 text

Goとは ● Googleで2007年に考案(OSS化は2009年) ○ Robert Griesemer ○ Rob Pike ○ Ken Thompson ● 半年に1度のリリース ○ 現在1.13.1が最新 24 The Go gopher was designed by Renee French.

Slide 25

Slide 25 text

Goとは ● 強い静的型付け、型推論 ● コンパイル言語 ● 手続き型 ● オブジェクト指向ではない ● ポインタがある 25

Slide 26

Slide 26 text

● https://blog.golang.org/gopher ● マスコットキャラクター ● Go's New Brandの中で 厳格な(?)仕様が The Go Gopher 26 Go Brand Book より

Slide 27

Slide 27 text

生まれた背景
 設計思想
 27 /

Slide 28

Slide 28 text

Goは何を目的に作られたのか? ● プログラミング言語には生まれた背景・言語哲学がある ● 例えばHaskell ○ 当時乱立していた関数型言語を統一するため ● 例えばRuby ○ ストレスなくプログラミングできる 28

Slide 29

Slide 29 text

Goは何を目的に作られたのか? ● Go ○ ソフトウェア開発の中で発生していた課題解決のため ● Go登場以前のGoogleのソフトウェア開発 ○ C++, Java, Python ○ ビルド時間のコスト ○ プログラミングコードの安全性 29 https://talks.golang.org/2012/splash.article

Slide 30

Slide 30 text

Goは何を目的に作られたのか? ● コンパイル速度が速いこと ● 安全に書けること ● 本質にフォーカスした開発ができること ● 「スマートさ」が目的ではない ○ ジェネリクス / モナド / ラムダなどはない ○ 例外機構もない 30 https://talks.golang.org/2012/splash.article

Slide 31

Slide 31 text

● スクリプト言語のプログラミングの容易さ ● コンパイル言語の効率と安全性 ● ネットワークプログラミング ● マルチコアコンピューティング Goは何を目的に作られたのか? 31 https://golang.org/doc/faq#creating_a_new_language

Slide 32

Slide 32 text

Simplicity - 徹底的な簡潔性 ● GoのMission ○ Creating software at scale ○ Running software at scale ● システムは成長する際に、デザインの簡潔性を通してのみ、 安定し、安全であり、首尾一貫したままでいられる 32 Go's New Brand の Mission, プログラミング言語 Go まえがき より

Slide 33

Slide 33 text

● 複雑性は明瞭性を失う例 ○ No free, Only GC ○ 単純な並行処理 ■ “go”と書くだけ ■ no ID ■ ステータス Simplicity is Complicated 33 Simplicity is Complicated より

Slide 34

Slide 34 text

安定した言語仕様 ● Simplicityを体現するために ● Goは1.0(10年前)から言語仕様がほとんど変わらない ○ 予約語も25個から増えない ● 今後もGo1.Xのうちは言語仕様は変わらない ○ 変わるのはGo2から ○ Go 2は4年後(Go 1.20)くらい? 34 Go2については Toward Go 2 より 微妙な言語仕様の変更はたまに入る(例 :Go.1.10)

Slide 35

Slide 35 text

● https://blog.golang.org/toward-go2 ● Go2に至る仕様策定プロセス ● Proposalは誰でも見れる ○ Go 2 Draft Designs ● Go Teamは意見を求めている 開かれた仕様策定(Toward Go 2) 35 英語が難しかったら Gopher Slackの #japan などでも議論してます

Slide 36

Slide 36 text

● Goは身近なサービス・企業で使われている ○ 決済のようなミッションクリティカルなサービスにも ● Goはソフトウェア開発の課題解決を目指した言語 ○ Creating software at scale ○ Running software at scale ● 単純さの中に生産性を見出している(UNIX思考的) ここまでのまとめ 36

Slide 37

Slide 37 text

言語仕様詳細
 特徴
 37 /

Slide 38

Slide 38 text

少ない予約語 38 https://golang.org/ref/spec#Keywords

Slide 39

Slide 39 text

複素数型 ● プリミティブな型として 複素数をサポート 39 https://play.golang.org/p/bm9P4fMInGE

Slide 40

Slide 40 text

スライスとrange ● 可変長配列 ● オブジェクトに対する反復処理 40 https://go-tour-jp.appspot.com/moretypes/16

Slide 41

Slide 41 text

ポインタ ● ちょっとゆるい ● (*p).Xと書かなくても良い 41 https://go-tour-jp.appspot.com/moretypes/1

Slide 42

Slide 42 text

interface ● ダックタイピングを採用 ● 提供者ではなく利用者が定義する ○ 実装提供者に依存せずに利用できる 42 https://go-tour-jp.appspot.com/methods/9

Slide 43

Slide 43 text

goroutineとchannel ● ランタイムが管理する軽量スレッド ● goroutine間を通信するパイプ 43 https://go-tour-jp.appspot.com/concurrency/2

Slide 44

Slide 44 text

多値とエラー ● 関数・メソッドは複数の値を返しうる ● 例外機構はない 44 https://go-tour-jp.appspot.com/methods/19

Slide 45

Slide 45 text

Goの良さ
 45 /

Slide 46

Slide 46 text

● gofmt ● linterの充実 ○ 変な争いをしたり不毛な指摘をせずに済む ● ほぼDSLを覚えなくて良い ○ 脳内メモリをロジックに集中できる ● GoDoc 業務で利用して実感するGoの良さ 46

Slide 47

Slide 47 text

● 可読性 ● 再配布の容易性 ○ 各OS向けに簡単にビルドできる ● デプロイ容易性 ● バイナリイメージの小ささ 業務で利用して実感するGoの良さ 47

Slide 48

Slide 48 text

● RailsのようなWAFを使ったスピードには勝てない ○ いろいろ選択する必要はある ○ 各社内製ライブラリを自作してカバー ● ビューの実装は苦手 業務で利用して実感するGoの良さ 48

Slide 49

Slide 49 text

Goを始める
 49 /

Slide 50

Slide 50 text

● Webブラウザ上でGoの仕様を一通り学べる ○ https://tour.golang.org/ ● 日本語版あり ○ https://go-tour-jp.appspot.com Tour of Go 50

Slide 51

Slide 51 text

● https://amazon.jp/dp/4621300253 ● 日本語で書かれたGoの書籍の中で一番体系的な書籍 ● なぜインターフェースは小さく作るべきか ● Goのカプセル化へのアプローチ ● なぜtesting pkgにはsetup/teardownやassertがないのか ● なぜ例外を持たないのか プログラミング言語Go(書籍) 51

Slide 52

Slide 52 text

● https://amazon.jp/dp/4297107279 ● 環境構築 ● CLIツールの作り方 ● テストの書き方 ● DBを使ったWebサーバの構築 ● まずなにか作ってみたい!という時に最適な一冊 改訂版 みんなのGo言語(書籍) 52

Slide 53

Slide 53 text

● Goはソフトウェア開発の課題解決を目指した言語 ○ 単純さの中に生産性を見出している(UNIX的思考) ● 単純で高い可読性によるコーディングのしやすさ ● デプロイ容易性による活躍の場の広さ ○ マルチプラットフォーム ○ シングルバイナリ ○ 少ないビルド時間 まとめ 53 ©tottie | Renee French ( original design )