SlideShare a Scribd company logo
1 of 47
TalknoteとGolangと私
三浦 堅右
2016/05/24(Tue)
at ヒカラボ
Talknote
利用企業数No.1の社内SNS
(2014年8月:シード・プランニング調べ)
Talknoteの課題
Talknoteのアーキテクチャ(一部)
PHP
PHPで苦しくなってきたところ
遅い(性能の問題)
PHPで苦しくなってきたところ
並行処理を簡単に書けない(言語仕様の問題)
PHPで苦しくなってきたところ
カジュアルに書ける反面、堅牢なプログラミングになりづ
らく、バグが増加していく(言語仕様の問題)
テストケース数
PHPで苦しくなってきたところ
モノリシックで肥大化したコードベース(設計の問題)
対策
• 性能の問題
• I/Oを中心に対策
• DB周りのチューニング
• キャッシュの効率化
↓
PHP自体がボトルネックに
対策
• 言語仕様の問題
• テストの充実
• リファクタリング
↓
指数関数的に増す複雑さを
カバーしきれない
対策
• 設計の問題
• 可能であれば新機能は独立したコードベースに
↓
コードの再利用性を捨てることになるため
、当然適用できるケースは少ない
Golang
特徴
• Googleが開発
• シンプルな言語仕様
• 事前コンパイル方式
• 並列処理のサポート
• オブジェクト指向っぽくない
• クラスではなく構造体
• 継承ではなく委譲
メリット
• 習得が容易
• 高速
• コードフォーマットの統一
• 並列処理
• コンパイル時の厳格なエラーチェック
デメリット
• イマドキの言語と比べると見劣りする言語仕様
• コンパイル時の厳格なエラーチェック
華やかさはなく
いわば質実剛健
Talknoteの採用理由
• プログラミングのガバナンス
• 堅牢なプログラミング
• 性能
• デプロイの容易さ
• 並列処理
プログラミングのガバナンス
例)厳格なコードフォーマット(OK)
プログラミングのガバナンス
例)厳格なコードフォーマット(NG)
デプロイの容易さ
• ランタイムいらず
• =デプロイ先のセットアップがいらない
• 極端な話、ビルドしてコピーでデプロイ完了
• go build -o app app.go
scp app server:/usr/local/bin
並列処理
関数を非同期に実行
例)キャッシュの作成
並列処理
クロージャを非同期に実行
例)キャッシュの削除
並列処理
Channelによるメッセージパッシング
Channel
goroutine
• タスク間の通信方式
• メッセージパッシング
• Erlangが同方式を採用
• 下記に影響を受けている言われている
• CSP
• pi-calculus
CSP
• Communicating Sequential Processes
• プロセス計算の一つ
• プロセス計算=並行システムモデリング技法
• 仕様記述言語
• Golang以外に影響を与えた技術
• Unixのパイプ
CPUを有効活用
• 最近のCPUはクロック数が頭打ちでコアを増やす方向へ
• スクリプト言語の多くはマルチコアを活かしづらい
• GIL/GVLによってネイティブスレッドを複数同時実行で
きない
↓
シングルスレッドアプリケーションでは
CPUを有効活用できない
CPUを有効活用
Golangはgoroutineなど
言語レベルで並列処理をサポートしている
↓
CPUを有効活用しやすい
Talknoteの例
メール投稿サブシステム
Talknoteの例
OAuth Client & OAuth Server & Web API
メール投稿サブシステム
• 2014/11リリース
• Go 1.4
• フレームワーク
• Revel (Web API)
• ORM
• gorp
• OAuth
• osin
Revel
• フルスタック
• 基本Railsライク
• scaffoldingも当然あり
• しかしORMはなし
• ホットデプロイ
• 性能もそんなに悪くない
• https://github.com/revel/revel
Revel
gorp
• シンプルなORM「的」ライブラリ
• 基本はSQL叩いて結果を対応する構
造体にぶち込む
• なのでRevelと組み合わせた場合、基
本modelのコードがSQLを含む
• https://github.com/go-gorp/gorp
gorp
gorp
osin
• OAuth2のライブラリ
• OAuthクライアントだけじゃなくOAuthサー
バもつくらなきゃなかったので採用
• 割とちゃんと動いている
• https://github.com/RangelReale/osin
認証サブシステム
• 2016/03リリース
• Go 1.6
• パッケージマネージャ
• glide
• フレームワーク
• grpc-gateway
認証サブシステム
glide
• パッケージマネージャ
• Go 1.5以上で公式採用されたvendoring機能
を利用
• https://github.com/Masterminds/glide
glide
grpc-gateway
• gRPC (HTTP/2 + Protocol Buffers) をラップし
て JSON API (HTTP/1.1 + JSON) を提供するリ
バースプロキシを生成する
• https://github.com/gengo/grpc-gateway
マイクロサービス化
コードベースを小さく分割し、スケーラブルに
そんな訳でトークノートでは
技術大好きエンジニアを
絶賛募集中です。
ご清聴ありがとうございました

More Related Content

What's hot

SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~bleis tift
 
VBAを書きたくない話(Excel-DNAの紹介)
VBAを書きたくない話(Excel-DNAの紹介)VBAを書きたくない話(Excel-DNAの紹介)
VBAを書きたくない話(Excel-DNAの紹介)bleis tift
 
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドYAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドkeroyonn
 
Performance DBFlute on ClubDB2 Xmas2013
Performance DBFlute on ClubDB2 Xmas2013Performance DBFlute on ClubDB2 Xmas2013
Performance DBFlute on ClubDB2 Xmas2013Masahiko Kubo
 
他言語との連携(ネイティブから動的言語まで)
他言語との連携(ネイティブから動的言語まで)他言語との連携(ネイティブから動的言語まで)
他言語との連携(ネイティブから動的言語まで)Tatsuya Ishikawa
 
JJUG Bizreach DBFlute 2014
JJUG Bizreach DBFlute 2014JJUG Bizreach DBFlute 2014
JJUG Bizreach DBFlute 2014Masahiko Kubo
 
安全なテーマ作成のためのPHPの知識
安全なテーマ作成のためのPHPの知識安全なテーマ作成のためのPHPの知識
安全なテーマ作成のためのPHPの知識Fumito Mizuno
 
開発チームにローカライズ支援職を置くと…
開発チームにローカライズ支援職を置くと…開発チームにローカライズ支援職を置くと…
開発チームにローカライズ支援職を置くと…Self Employed
 
ClubDB2 Xmas2014 BizOneToOne
ClubDB2 Xmas2014 BizOneToOneClubDB2 Xmas2014 BizOneToOne
ClubDB2 Xmas2014 BizOneToOneMasahiko Kubo
 
PHPでAIプログラミングコンテスト準優勝するまでの軌跡
PHPでAIプログラミングコンテスト準優勝するまでの軌跡PHPでAIプログラミングコンテスト準優勝するまでの軌跡
PHPでAIプログラミングコンテスト準優勝するまでの軌跡Shintaro Kurachi
 
札束でExcelを殴る
札束でExcelを殴る札束でExcelを殴る
札束でExcelを殴るbleis tift
 
(仮)ややこしい時こそ質問してみる
(仮)ややこしい時こそ質問してみる(仮)ややこしい時こそ質問してみる
(仮)ややこしい時こそ質問してみるT Takeno
 
業務アプリにおける VB との付き合い方
業務アプリにおける VB との付き合い方業務アプリにおける VB との付き合い方
業務アプリにおける VB との付き合い方s_earlgrey
 
Cat tool overview for CEDEC2011 Draft
Cat tool overview for CEDEC2011 DraftCat tool overview for CEDEC2011 Draft
Cat tool overview for CEDEC2011 DraftSelf Employed
 

What's hot (15)

SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~
 
VBAを書きたくない話(Excel-DNAの紹介)
VBAを書きたくない話(Excel-DNAの紹介)VBAを書きたくない話(Excel-DNAの紹介)
VBAを書きたくない話(Excel-DNAの紹介)
 
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドYAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
 
Performance DBFlute on ClubDB2 Xmas2013
Performance DBFlute on ClubDB2 Xmas2013Performance DBFlute on ClubDB2 Xmas2013
Performance DBFlute on ClubDB2 Xmas2013
 
他言語との連携(ネイティブから動的言語まで)
他言語との連携(ネイティブから動的言語まで)他言語との連携(ネイティブから動的言語まで)
他言語との連携(ネイティブから動的言語まで)
 
JJUG Bizreach DBFlute 2014
JJUG Bizreach DBFlute 2014JJUG Bizreach DBFlute 2014
JJUG Bizreach DBFlute 2014
 
C#とaop
C#とaopC#とaop
C#とaop
 
安全なテーマ作成のためのPHPの知識
安全なテーマ作成のためのPHPの知識安全なテーマ作成のためのPHPの知識
安全なテーマ作成のためのPHPの知識
 
開発チームにローカライズ支援職を置くと…
開発チームにローカライズ支援職を置くと…開発チームにローカライズ支援職を置くと…
開発チームにローカライズ支援職を置くと…
 
ClubDB2 Xmas2014 BizOneToOne
ClubDB2 Xmas2014 BizOneToOneClubDB2 Xmas2014 BizOneToOne
ClubDB2 Xmas2014 BizOneToOne
 
PHPでAIプログラミングコンテスト準優勝するまでの軌跡
PHPでAIプログラミングコンテスト準優勝するまでの軌跡PHPでAIプログラミングコンテスト準優勝するまでの軌跡
PHPでAIプログラミングコンテスト準優勝するまでの軌跡
 
札束でExcelを殴る
札束でExcelを殴る札束でExcelを殴る
札束でExcelを殴る
 
(仮)ややこしい時こそ質問してみる
(仮)ややこしい時こそ質問してみる(仮)ややこしい時こそ質問してみる
(仮)ややこしい時こそ質問してみる
 
業務アプリにおける VB との付き合い方
業務アプリにおける VB との付き合い方業務アプリにおける VB との付き合い方
業務アプリにおける VB との付き合い方
 
Cat tool overview for CEDEC2011 Draft
Cat tool overview for CEDEC2011 DraftCat tool overview for CEDEC2011 Draft
Cat tool overview for CEDEC2011 Draft
 

Similar to Talknoteとgolangと私

PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」Preferred Networks
 
精神論によるいきいきとした組織づくりのご提案
精神論によるいきいきとした組織づくりのご提案精神論によるいきいきとした組織づくりのご提案
精神論によるいきいきとした組織づくりのご提案tod esking
 
Web関連技術の最新動向・プログラミング言語(サーバ側)
Web関連技術の最新動向・プログラミング言語(サーバ側)Web関連技術の最新動向・プログラミング言語(サーバ側)
Web関連技術の最新動向・プログラミング言語(サーバ側)masayoshi takahashi
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~infinite_loop
 
俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かう俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かうAkira Suenami
 
Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!Ouka Yuka
 
PHPカンファレンス2015
PHPカンファレンス2015PHPカンファレンス2015
PHPカンファレンス2015Daisuke Kasuya
 
オープンソースプロジェクトのQAについて - LibreOfficeのケースから-
オープンソースプロジェクトのQAについて  - LibreOfficeのケースから-オープンソースプロジェクトのQAについて  - LibreOfficeのケースから-
オープンソースプロジェクトのQAについて - LibreOfficeのケースから-Shinji Enoki
 
【CodeCamp】PHP教科書サンプル
【CodeCamp】PHP教科書サンプル【CodeCamp】PHP教科書サンプル
【CodeCamp】PHP教科書サンプルcodecampJP
 
PHPの今と未来を語る
PHPの今と未来を語るPHPの今と未来を語る
PHPの今と未来を語るRui Hirokawa
 
いまどき(これから)のPHP開発
いまどき(これから)のPHP開発いまどき(これから)のPHP開発
いまどき(これから)のPHP開発Kenjiro Kubota
 
[超初心者向け無料セミナー] 1時間でまるわかり!CakePHP概説&WordPress応用事例
[超初心者向け無料セミナー] 1時間でまるわかり!CakePHP概説&WordPress応用事例[超初心者向け無料セミナー] 1時間でまるわかり!CakePHP概説&WordPress応用事例
[超初心者向け無料セミナー] 1時間でまるわかり!CakePHP概説&WordPress応用事例TechGardenSchool
 
初心者向けGo言語勉強会
初心者向けGo言語勉強会初心者向けGo言語勉強会
初心者向けGo言語勉強会leverages_event
 
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由Kohei Taniguchi
 
PHPプログラミングのIPv6対応の実際
PHPプログラミングのIPv6対応の実際PHPプログラミングのIPv6対応の実際
PHPプログラミングのIPv6対応の実際Tetsuji Koyama
 
エンジニアがチームで数字を追って得たもの
エンジニアがチームで数字を追って得たものエンジニアがチームで数字を追って得たもの
エンジニアがチームで数字を追って得たものbasicinc_dev
 
Diff(ファイル比較)ツールの紹介【勉強会資料】
Diff(ファイル比較)ツールの紹介【勉強会資料】Diff(ファイル比較)ツールの紹介【勉強会資料】
Diff(ファイル比較)ツールの紹介【勉強会資料】株式会社キャッチアップ
 
PHPの今とこれから2006
PHPの今とこれから2006PHPの今とこれから2006
PHPの今とこれから2006Rui Hirokawa
 

Similar to Talknoteとgolangと私 (20)

PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」
 
精神論によるいきいきとした組織づくりのご提案
精神論によるいきいきとした組織づくりのご提案精神論によるいきいきとした組織づくりのご提案
精神論によるいきいきとした組織づくりのご提案
 
Web関連技術の最新動向・プログラミング言語(サーバ側)
Web関連技術の最新動向・プログラミング言語(サーバ側)Web関連技術の最新動向・プログラミング言語(サーバ側)
Web関連技術の最新動向・プログラミング言語(サーバ側)
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かう俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かう
 
Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!
 
PHPカンファレンス2015
PHPカンファレンス2015PHPカンファレンス2015
PHPカンファレンス2015
 
オープンソースプロジェクトのQAについて - LibreOfficeのケースから-
オープンソースプロジェクトのQAについて  - LibreOfficeのケースから-オープンソースプロジェクトのQAについて  - LibreOfficeのケースから-
オープンソースプロジェクトのQAについて - LibreOfficeのケースから-
 
【CodeCamp】PHP教科書サンプル
【CodeCamp】PHP教科書サンプル【CodeCamp】PHP教科書サンプル
【CodeCamp】PHP教科書サンプル
 
第1回勉強会
第1回勉強会第1回勉強会
第1回勉強会
 
PHPの今と未来を語る
PHPの今と未来を語るPHPの今と未来を語る
PHPの今と未来を語る
 
いまどき(これから)のPHP開発
いまどき(これから)のPHP開発いまどき(これから)のPHP開発
いまどき(これから)のPHP開発
 
[超初心者向け無料セミナー] 1時間でまるわかり!CakePHP概説&WordPress応用事例
[超初心者向け無料セミナー] 1時間でまるわかり!CakePHP概説&WordPress応用事例[超初心者向け無料セミナー] 1時間でまるわかり!CakePHP概説&WordPress応用事例
[超初心者向け無料セミナー] 1時間でまるわかり!CakePHP概説&WordPress応用事例
 
初心者向けGo言語勉強会
初心者向けGo言語勉強会初心者向けGo言語勉強会
初心者向けGo言語勉強会
 
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
 
PHPプログラミングのIPv6対応の実際
PHPプログラミングのIPv6対応の実際PHPプログラミングのIPv6対応の実際
PHPプログラミングのIPv6対応の実際
 
Nishimotz pycon2011jan
Nishimotz pycon2011janNishimotz pycon2011jan
Nishimotz pycon2011jan
 
エンジニアがチームで数字を追って得たもの
エンジニアがチームで数字を追って得たものエンジニアがチームで数字を追って得たもの
エンジニアがチームで数字を追って得たもの
 
Diff(ファイル比較)ツールの紹介【勉強会資料】
Diff(ファイル比較)ツールの紹介【勉強会資料】Diff(ファイル比較)ツールの紹介【勉強会資料】
Diff(ファイル比較)ツールの紹介【勉強会資料】
 
PHPの今とこれから2006
PHPの今とこれから2006PHPの今とこれから2006
PHPの今とこれから2006
 

Talknoteとgolangと私

Editor's Notes

  1. 社内SNS 社内コミュニケーションの最適化 メールを置き換える リテラシーが低いユーザでも迷わず使えるように Web, iOS, Android
  2. 遅い アプリケーションが肥大化 キャッシュを階層化してIOのボトルネックを減らしたとしても遅い
  3. 並行処理 fork()したりpthreadなどで対処できるが、プログラミングの難易度があがるしユーザランド fork()やstream_set_blocking()やReactPHPでNon-blocking I/Oという手もあるといえばある
  4. バギー 型がないことの功罪、数値型と文字列型、empty() / isset() / is_xxx(), … 継承の濫用 DRYの罠 ユニットテストでもカバーしきれないこともある
  5. コードを切り離しづらい
  6. SQL, インデックス, 発行回数, nested loopであることを前提に キャッシュはDBだけじゃなくファイルアクセスも
  7. コードベースでかいしゆるふわだから バグ要因の掛け算 整数なのか浮動小数点なのか文字列なのか実はbooleanなのか 静的型付けじゃないだけで一つの変数に対してこれだけの要素 組み合わせ爆発 ある意味PHPは玄人むけの言語(悪い意味で)
  8. シンプルな言語仕様 手続き型 事前コンパイル方式 静的型付け クロスコンパイルもできる
  9. 習得が容易 言語仕様がシンプル 高速 スタックとヒープ コールスタックやローカル変数、引数は原則スタック しかし関数内でnewしてポインタ返す場合はヒープ ヒープはGC対象 sliceに要素を追加しまくると最初はスタックにおかれていても途中からヒープにおかれる コンパイル時の厳格なエラーチェック importしたのに使用しないパッケージがあったり、使用しない変数があるだけでもエラー GDB does not understand Go programs well. The stack management, threading, and runtime contain aspects that differ enough from the execution model GDB expects that they can confuse the debugger, even when the program is compiled with gccgo.
  10. イマドキっぽくない genericsがない propagationしないエラー処理 mutableな変数
  11. プログラミングのガバナンス コーディングスタイルの強制 習得容易性 堅牢なプログラミング コンパイル時エラーの厳格さ 性能 ネイティブコード デプロイの容易さ バイナリ一個 並列処理 goroutine
  12. プログラミングのガバナンス コーディングスタイルの強制 習得容易性
  13. プログラミングのガバナンス コーディングスタイルの強制 習得容易性
  14. デプロイの容易さ バイナリ一個
  15. 並列処理 goroutine
  16. 並列処理 goroutine m:nスレッド方式(アプリケーションレベル) m個のネイティブスレッドとn個のgoroutine 並行計算 モデル Process calculus(プロセス計算) CSP(Communicating Sequential Processes) 仕様記述言語 ガード付きコマンド Unixパイプ channel π-calculus タスク間の通信方式 メッセージパッシング 類) ex) Erlang 対)共有メモリ方式 ex) Java
  17. タスク間の通信方式 メッセージパッシング 対)共有メモリ方式 ex) Java 同期メカニズムはchannelだけじゃなくてmutexなんかで待ち合わせるのもアリ グローバル変数触るんなら
  18. コルーチンじゃないよ • コルーチン ◦ 一旦処理を中断したあと、続きから処理を再開できる ◦ ノンプリエンプティブな感じ ◦ 並列というより並行プログラミング ◦ ジェネレータ(例えばphpのyield)に似ている • プリエンプション ◦ 実行中タスクを一時的に中断させ、他のタスクを実行後に中断させたタスクを再開すること ◦ 通常カーネルの機能や割り込み処理はプリンプション不可能 ◦ プリエンプティブ・マルチタスク ▪ 実行中タスクにおいて一定時間内(タイムスライス)にOSへ制御が移り、次のタイムスライスのタスクを実行する ▪ OSがCPUの割り当てを管理する ▪ こっちが主流 ◦ ノンプリエンプティブ・マルチタスク ▪ アプリケーションがCPUの割り当てを管理する(空き時間にCPUを開放する) CPUはクロック数増加が頭打ちになり、マルチコア化 最大限に活かす方法は並列処理 GOMAXPROCS goのスケジューラはまだいけてない 1.5でスケジューラがだいぶ改善された模様 デフォルト値が1から論理CPU数になった OSスレッドのコンテキストスイッチはコストでかい なんでもかんでも並列処理じゃなくて並行処理 CSPやpi-calculusはプロセス計算
  19. プロセス計算は、独立エージェントやプロセスの集まりにおける相互作用/通信/同期を抽象的に記述するツールである。 また、プロセス記述を操作・分析可能にする代数学的規則も提供し、プロセス間の等価性について(双模倣性を使った)形式的推論を可能とする。 CSPは独立したプロセス群がメッセージパッシングによって通信することで相互にやり取りしているものとしてシステムを記述する。
  20. マリチコア初期はクロック数おさえていた 最近はそうでもないがまた頭打ち? Sandy Bridge(#2) Ivy Bridge(#3) 性能強化、消費電力・発熱の軽減、グラフィック強化 Haswell(#4) 消費電力・発熱の軽減、グラフィック強化 Broadwell 消費電力・発熱の軽減、グラフィック強化 Skylake 若干性能強化、DDR4対応 • CPU ◦ クロック ▪ クロック数の整数倍の時間で命令を実行 ▪ 4ステージ構成の命令パイプラインでは1個の命令を処理するのに4クロック必要 ▪ クロック数が多いほど単位時間あたりの命令実行数が多いことになる ▪ IPC = Instructions  Per Clock cycle / 1クロックあたり実行可能命令数 ▪ Pentium4はクロック数至上主義でIPC軽視 ▪ スーパーパイプライン ▪ クロック数の向上に用いられる ▪ ステージ数を増加させ、パイプラインでの同時実行数を増加させる ▪ スーパースカラ ▪ IPCの向上に用いられる ▪ パイプラインの同時実行数を増加させる ▪ intelのハイパースレッディング(SMT = Simultaneous Multithreading / 同時マルチスレッディング)はこれ ▪ スーパーパイプラインとスーパースケーラはトレードオフの関係で、通常組み合わせる
  21. GIL/GVL スレッドセーフじゃないところがあったり • CPU ◦ クロック ▪ クロック数の整数倍の時間で命令を実行 ▪ 4ステージ構成の命令パイプラインでは1個の命令を処理するのに4クロック必要 ▪ クロック数が多いほど単位時間あたりの命令実行数が多いことになる ▪ IPC = Instructions  Per Clock cycle / 1クロックあたり実行可能命令数 ▪ Pentium4はクロック数至上主義でIPC軽視 ▪ スーパーパイプライン ▪ クロック数の向上に用いられる ▪ ステージ数を増加させ、パイプラインでの同時実行数を増加させる ▪ スーパースカラ ▪ IPCの向上に用いられる ▪ パイプラインの同時実行数を増加させる ▪ intelのハイパースレッディング(SMT = Simultaneous Multithreading / 同時マルチスレッディング)はこれ ▪ スーパーパイプラインとスーパースケーラはトレードオフの関係で、通常組み合わせる
  22. ついでにハマりポイント jsonのマーシャリング json->structでフィールドが小文字でprivateなゆえに値が設定されず数時間
  23. Revel provides routing, parameter parsing, validation, session/flash, templating, caching, job running, a testing framework, and even internationalization.
  24. そういや、前回の質疑応答で sql.NullInt64 と *int64 のどちらを使っていますか?みたいなのがあったと思うけど、 *int64 だとGC rootから辿るポインタが増えるからGCのプレッシャーが大きくなって嫌なので sql.NullInt64 を使って構造体にboolとint64を埋め込む方がそうならなくて良いって知見をGoConで聞いた。
  25. クライアントサイドのエンジニアがWeb APIまで書く サーバサイドのエンジニアはマイクロサービス、すなわちビジネスロジックに集中 細かいマイクロサービス(コンテナ)を並べてスケーラブルに コードベースを小さくすることで捨てやすくする