SlideShare ist ein Scribd-Unternehmen logo
1 von 22
Goでのチーム開発と
コード管理の悩み
第2回 関西golang勉強会
Kentaro Kawano
About Me
• Kentaro Kawano/@kawaken
• シナジーマーケティング, TechScore
• Go, Python, Rails, swift
Go歴
• 個人
– 1.2からさわり初めた
– CLIツールなどの作成が中心
– Webアプリは作ってなかった
• 仕事
– データ作成、チャット用ツールなど
– 9月から本格的にプロジェクトに導入
チーム開発の悩み
Goのレベル上げ
• 学習が必須
– 触ってる人少ない
– Go Quiz みたいな教材をほぼ日で提供
• 問題作るのしんどかった
– 週1回30分の簡単な勉強会
– 書籍
情報収集
• Blog, GoCon, Advent Calendar など
• 他社事例はありがたい
– 参考になるし「Go増えてる感」は大事
開発環境構築
• メンバーの環境
– 基本お任せ
• 以前はVirtualBoxのイメージを配布
– よく使うツールのインストールスクリプトを作成
• golang.org/x/tools/cmd/〜
• golint,gocode などコード関連のツール
• gom,fresh,gooseなどのプロジェクトで使うツール
CI/CD環境
• 新しく構築
– 既存環境の流用では上手くいかないことも
• コード化を目指す(〜 as a Code)
– drone.io(Docker),Ansible,Terraformなど
• 静的ファイルの扱いが定まってない
– go-bindata?
• ホットデプロイが未検証
– 動作確認できてない
レビュー
• gofmt,golintなどツールで些末な部分は回避
– CIでもチェックできる
• スキルがコードに現れやすい気がする
– スキル差でどうしても悪い方が目立つ
• 基本的な部分の記述が増えるから?
– 教育大事ですね、みたいな意識の高まり
• Go らしいコードとは何か?
– まだよくわからない
– 変なコードにはなりにくい
コード管理の悩み
ライブラリの選択
• 枯れてる、メンテされてないの判断が難しい
• 単純なベンチマークだけではわからない
– Middleware、セキュリティ対策、セッション管理な
ど
• 迷ったら標準に寄せる(ムリに採用しない)
Gin
• Gin最速!みたいな記事もある
• 採用事例も見かける
• メンテされているの?みたいなIssueもあった
• contribのプルリクが放置されていたり…
• 使っている人は多そうだけど、本当に大丈夫
か?
– 最悪自分たちでメンテするという覚悟で採用
パッケージ構成
• SCMにはGitLabを使用
– サブパッケージの go get ができない
• 個別のリポジトリを作って対応
• 実装上の不都合はない
• CIの設定などが手間
Gom
• master に問題があると、ブランチの切り替え
ができない
– gin-gonic/contrib/sessions
– aws/aws-sdk-go
• 最近、一時的にmasterがビルドエラーに
• 一時的にforkして修正
• 修正をプルリクしたいが手つかず…
データベース関連
• database/sqlとlib/pqで頑張ってる
• drone/sqlgenを使ってみた
– JSON型で使い方が合わなかった
• モデル関連のコードジェネレータを自作
– ER図からモデル作成
• 検索機能などでSQLの組み立てに苦労
– クエリビルダは採用しても良かったかも…
名前付け問題
• 冗長で似たような名前の定義が増える
– リクエストパラメータ保持用のstruct
• HogeRequestParams
• FugaRequestParams
– コード値管理用のconst
• 型名を先につけて回避
– ABSuccess
– XYSuccess
– 共通化もできない…
• パッケージを細かくするしかない?
テスト関連
• testifyを使ってassertionは簡単に書けるよう
• go test
– ./... をつけないとダメ
• サブパッケージのテストがスルーされていた
– -race もつける
• 非同期処理で怪しいところが検出できる
• 結果がわかりにくいのでどうにかしたい
GOの感想
学習コスト高くない
• 高くないと見込んでたけど、実際高くない
• 覚えることが多くない
• goroutine周りでちょっとハマった程度
– 使い方の問題
– syncパッケージで解決できると思う
• 変な暗黙知がない
開発効率も悪くない
• Railsと比較して
– コードを書く量は増えたと思う
– 変なハマり方しない
– すぐに動くモノはできない
• 環境整備に時間がかかった
– 最初なので仕方ない
– 次からは短縮できる時間
• 今までと比べて遜色ない効率で進んでいる
– 最初の方は低迷してたけど乗り切った
運用はこれから
• 実際やってみないとわからない
• コスト削減につながったらという期待
– AWSのインスタンスを小さいモノに変えるとか
– 今後のバージョンアップ対応の負荷
おわり
ご静聴ありがとうございました

Weitere ähnliche Inhalte

Andere mochten auch

マイクロサービス時代の動画配信基Ruby×go=∞
マイクロサービス時代の動画配信基Ruby×go=∞マイクロサービス時代の動画配信基Ruby×go=∞
マイクロサービス時代の動画配信基Ruby×go=∞DMM.com
 
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppAkihiko Horiuchi
 
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
Pythonによる機械学習入門〜基礎からDeep Learningまで〜Pythonによる機械学習入門〜基礎からDeep Learningまで〜
Pythonによる機械学習入門〜基礎からDeep Learningまで〜Yasutomo Kawanishi
 
Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Pythonによる機械学習入門 ~SVMからDeep Learningまで~Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Pythonによる機械学習入門 ~SVMからDeep Learningまで~Yasutomo Kawanishi
 
DMM.comにおけるビッグデータ処理のためのSQL活用術
DMM.comにおけるビッグデータ処理のためのSQL活用術DMM.comにおけるビッグデータ処理のためのSQL活用術
DMM.comにおけるビッグデータ処理のためのSQL活用術DMM.com
 
いまさら聞けないselectあれこれ
いまさら聞けないselectあれこれいまさら聞けないselectあれこれ
いまさら聞けないselectあれこれlestrrat
 
Googleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスGoogleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスEtsuji Nakai
 

Andere mochten auch (7)

マイクロサービス時代の動画配信基Ruby×go=∞
マイクロサービス時代の動画配信基Ruby×go=∞マイクロサービス時代の動画配信基Ruby×go=∞
マイクロサービス時代の動画配信基Ruby×go=∞
 
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebApp
 
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
Pythonによる機械学習入門〜基礎からDeep Learningまで〜Pythonによる機械学習入門〜基礎からDeep Learningまで〜
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
 
Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Pythonによる機械学習入門 ~SVMからDeep Learningまで~Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Pythonによる機械学習入門 ~SVMからDeep Learningまで~
 
DMM.comにおけるビッグデータ処理のためのSQL活用術
DMM.comにおけるビッグデータ処理のためのSQL活用術DMM.comにおけるビッグデータ処理のためのSQL活用術
DMM.comにおけるビッグデータ処理のためのSQL活用術
 
いまさら聞けないselectあれこれ
いまさら聞けないselectあれこれいまさら聞けないselectあれこれ
いまさら聞けないselectあれこれ
 
Googleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスGoogleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービス
 

Ähnlich wie Goでのチーム開発とコード管理の悩み

分散開発チームによるAgile開発実践 ~いろいろハマった!よかった
分散開発チームによるAgile開発実践 ~いろいろハマった!よかった分散開発チームによるAgile開発実践 ~いろいろハマった!よかった
分散開発チームによるAgile開発実践 ~いろいろハマった!よかったMakoto Iguchi
 
楽天トラベルとSpring(Spring Day 2016)
楽天トラベルとSpring(Spring Day 2016)楽天トラベルとSpring(Spring Day 2016)
楽天トラベルとSpring(Spring Day 2016)Rakuten Group, Inc.
 
メタ勉強会 - カジュアルトーク駆動学習
メタ勉強会 - カジュアルトーク駆動学習メタ勉強会 - カジュアルトーク駆動学習
メタ勉強会 - カジュアルトーク駆動学習Yoshiaki Yoshida
 
Aizu.LT16 社会人1年目の失敗とContinuous Integration
Aizu.LT16 社会人1年目の失敗とContinuous IntegrationAizu.LT16 社会人1年目の失敗とContinuous Integration
Aizu.LT16 社会人1年目の失敗とContinuous IntegrationTomoaki Tamura
 
Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016kyon mm
 
地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進めDai FUJIHARA
 
地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進めRakuten Group, Inc.
 
今時のオンプレなgithubクローン環境構築
今時のオンプレなgithubクローン環境構築今時のオンプレなgithubクローン環境構築
今時のオンプレなgithubクローン環境構築You&I
 
ゲームの裏側を支える人たちの裏側
ゲームの裏側を支える人たちの裏側ゲームの裏側を支える人たちの裏側
ゲームの裏側を支える人たちの裏側Riou Tomita
 
Pivotal Trackerでアジャイルなプロジェクト管理
Pivotal Trackerでアジャイルなプロジェクト管理Pivotal Trackerでアジャイルなプロジェクト管理
Pivotal Trackerでアジャイルなプロジェクト管理You&I
 
大規模JSプロジェクト ロードオブナイツの管理手法紹介 2012-11-06
大規模JSプロジェクト ロードオブナイツの管理手法紹介 2012-11-06大規模JSプロジェクト ロードオブナイツの管理手法紹介 2012-11-06
大規模JSプロジェクト ロードオブナイツの管理手法紹介 2012-11-06俊仁 小林
 
アジャイル開発やってみた
アジャイル開発やってみたアジャイル開発やってみた
アジャイル開発やってみたArata Fujimura
 
ドメイン駆動設計勉強会発表
ドメイン駆動設計勉強会発表ドメイン駆動設計勉強会発表
ドメイン駆動設計勉強会発表shingo suzuki
 
ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発 ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発 schoowebcampus
 
A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)
A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)
A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)Shinichi Nakagawa
 
CEDEC2015講演 チーム開発をスムーズにするために
CEDEC2015講演 チーム開発をスムーズにするためにCEDEC2015講演 チーム開発をスムーズにするために
CEDEC2015講演 チーム開発をスムーズにするためにTakafumi Ikeda
 
楽天の中のわたしと勉強会
楽天の中のわたしと勉強会楽天の中のわたしと勉強会
楽天の中のわたしと勉強会Rakuten Group, Inc.
 
S03 t1 python_learningdiary#3
S03 t1 python_learningdiary#3S03 t1 python_learningdiary#3
S03 t1 python_learningdiary#3Takeshi Akutsu
 
ソフトウェア開発の現場風景
ソフトウェア開発の現場風景ソフトウェア開発の現場風景
ソフトウェア開発の現場風景Koichi ITO
 

Ähnlich wie Goでのチーム開発とコード管理の悩み (20)

分散開発チームによるAgile開発実践 ~いろいろハマった!よかった
分散開発チームによるAgile開発実践 ~いろいろハマった!よかった分散開発チームによるAgile開発実践 ~いろいろハマった!よかった
分散開発チームによるAgile開発実践 ~いろいろハマった!よかった
 
楽天トラベルとSpring(Spring Day 2016)
楽天トラベルとSpring(Spring Day 2016)楽天トラベルとSpring(Spring Day 2016)
楽天トラベルとSpring(Spring Day 2016)
 
メタ勉強会 - カジュアルトーク駆動学習
メタ勉強会 - カジュアルトーク駆動学習メタ勉強会 - カジュアルトーク駆動学習
メタ勉強会 - カジュアルトーク駆動学習
 
Aizu.LT16 社会人1年目の失敗とContinuous Integration
Aizu.LT16 社会人1年目の失敗とContinuous IntegrationAizu.LT16 社会人1年目の失敗とContinuous Integration
Aizu.LT16 社会人1年目の失敗とContinuous Integration
 
Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016
 
地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め
 
地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め
 
今時のオンプレなgithubクローン環境構築
今時のオンプレなgithubクローン環境構築今時のオンプレなgithubクローン環境構築
今時のオンプレなgithubクローン環境構築
 
ゲームの裏側を支える人たちの裏側
ゲームの裏側を支える人たちの裏側ゲームの裏側を支える人たちの裏側
ゲームの裏側を支える人たちの裏側
 
Pivotal Trackerでアジャイルなプロジェクト管理
Pivotal Trackerでアジャイルなプロジェクト管理Pivotal Trackerでアジャイルなプロジェクト管理
Pivotal Trackerでアジャイルなプロジェクト管理
 
大規模JSプロジェクト ロードオブナイツの管理手法紹介 2012-11-06
大規模JSプロジェクト ロードオブナイツの管理手法紹介 2012-11-06大規模JSプロジェクト ロードオブナイツの管理手法紹介 2012-11-06
大規模JSプロジェクト ロードオブナイツの管理手法紹介 2012-11-06
 
EPIU
EPIUEPIU
EPIU
 
アジャイル開発やってみた
アジャイル開発やってみたアジャイル開発やってみた
アジャイル開発やってみた
 
ドメイン駆動設計勉強会発表
ドメイン駆動設計勉強会発表ドメイン駆動設計勉強会発表
ドメイン駆動設計勉強会発表
 
ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発 ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発
 
A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)
A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)
A Tour of やきう&Go - やきう民の私とGoの半年(実質3日間)
 
CEDEC2015講演 チーム開発をスムーズにするために
CEDEC2015講演 チーム開発をスムーズにするためにCEDEC2015講演 チーム開発をスムーズにするために
CEDEC2015講演 チーム開発をスムーズにするために
 
楽天の中のわたしと勉強会
楽天の中のわたしと勉強会楽天の中のわたしと勉強会
楽天の中のわたしと勉強会
 
S03 t1 python_learningdiary#3
S03 t1 python_learningdiary#3S03 t1 python_learningdiary#3
S03 t1 python_learningdiary#3
 
ソフトウェア開発の現場風景
ソフトウェア開発の現場風景ソフトウェア開発の現場風景
ソフトウェア開発の現場風景
 

Goでのチーム開発とコード管理の悩み

Hinweis der Redaktion

  1. かわのけんたろうと良います。ツイッターでは @kawaken でやっています。 シナジーマーケティングという会社でウェブアプリケーションエンジニアをやっています。 今はGoをメインでやっていて、たまにPythonを触っています。仕事ではRailsが多いですが、Goに乗り換えていきたいと思っています。あと、swiftを触っています。 週2で親会社に出向していて、天気アプリの改修のお手伝いをしています。
  2. 簡単に私のGo歴をご紹介します。 1.2になった頃から触っていて、CLIツールの作成ばかりで、ウェブアプリは作ってなかったです。 仕事では、データ作成やチャット用のツールなどを作成していました。 9月から本格的にプロジェクトに導入することになり、今に至ります。まだ絶賛開発中です。 JavaかGoか?みたいな紆余曲折もありましたが、なんとか画策して無事導入に至りました。 今日はこのプロジェクトでの悩みについてです。
  3. まずはチーム開発での悩みです
  4. Goのレベル上げということで、 まずは学習が必須ということです。触っているメンバーも少なかったですし、教育のためにGo Quizみたいな教材をほぼ日で提供しました。 プロジェクトが佳境に入ってからはやってないのですが、30弱問題を作りましたが、結構しんどかったです。 あとは週1回30分の簡単な勉強会でGoQuizの振り返りとか解答の解説みたいなものをやっていました。 書籍もあまりないですが、昨日、オライリーから新しいのが出ましたね!
  5. 情報収集は欠かさず行っていて、BlogとかGoConとかにも参加しています。AdventCalendarがちょうど色んなネタが出てきたのでありがたかったです。 他社事例などはやっぱり参考になることが多いです。そのままフィットするということはないので、参考になりそうなものを取り入れています。 外部サービスを使った事例とかすごくうらやましいんですが、自社ではそういうのが使えないのであきらめたりしているモノもあります。 あと、どこどもも使ってますね!みたいな話は上司にもやっぱり受けが良いし、 自分たちが採用したものが増えているというのはメンバーにも安心感を与えるのでありがたいです。
  6. 開発環境構築についてです 今までのプロジェクトでは、標準仮想環境ってのがあって、VirtualBoxのイメージをプロジェクトリーダーが調整して配布したりしていましたが、そういうのはやめました。 メンバーそれぞれの環境については、基本はそれぞれお任せにしました。 今までと同じ流れでVirtualBoxを使っている人もいるし、僕はMacで直接開発してます。エディタも特に制限無くみんなバラバラです。 golintやgomなどのよく使うツールはインストールスクリプトを作成して、簡単に共通のツールがセットアップできるようにしました。
  7. CI/CD環境についてですが、 今までのRailsの手法が流用できることがあまりないので、新しく構築しなおしました。 CI環境からデプロイ手法まで、一連の流れの構築が必要になりましたが、できるだけコード化したいという目的があって、 その辺を意識して環境構築を行うようにしました。 まだ運用に乗っていませんので、まだまだこれからですが、Docker、Ansible, Terraformなどで調整しています。 まだ答えが出てないのですが、CSS,JSなどのアセット関連や設定ファイルなどの静的ファイルの扱いをどうしようか悩み中です。 go-bindataでまとめた方が良いかなどうかなーという感じです。 個人で使ったときにgo-bindataでコンパイルがすごい遅くなったこともあって、ムリにまとめなくても良いかとも。
  8. レビューについてです。 gofmt,golintなどのツールがあるので、些末な部分の指摘は回避できています。 CIでもチェックしているので、「golintに怒られてるから確認して」で済んでいます。 ツールで指摘されない部分については、コーディングガイドを設けています。 例えばreturn値の変数名は定義しないとか。x, y int みたいな定義をしないとか。 あと、goって良くも悪くも愚直にコードを書かないといけないし、薄いフレームワークを使用しているからかもしれませんが 本来のコーディングスキルが現れやすい気がします。 そうするとどうしても悪い方が目立ってしまいます。 goだからというか、プログラミングの根本的な指摘をすることもあって、教育が大事ですね、みたいな意識の高まりがありました。 Railsだと見えてなかったところでした。 あとは、Goらしいコードとは何か?というのを探索しています。 Go自体のコードがGoで書かれているので、気になったことはできるだけコードを読むようにしています。
  9. 次はコード管理の悩みです。
  10. ライブラリの選択もかなり悩みました。 githubのスターが多いモノでも、アクティビティがなかったりするものもあって、単に枯れているだけなのか、メンテナンスがされていないのか判断が難しいなと感じます。 とっかかりとしては、フレームワークの比較記事や、こういうライブラリ採用していますみたいな記事になりますが、 単純なベンチマークだけではわからないし「○○が最速なので○○にしましょう」みたいな記事とかに踊らされないように気をつけたり、 何をしたいかによって採用基準は変わってくるので、とりあえずこれ使っとけばいいんだ、みたいなのはやめるようにしました。 あとは、ムリにフレームワークを使わないようにしました。合わないなと思ったら標準でがんばるみたいな。
  11. 例えば、Ginですが、 Qiitaのフレームワーク比較の記事などで、Gin最速!みたいな記事があるし、採用事例も見かけるのですが、 GitHubの方では、メンテされてるの?みたいなIssueが立っていたり(ちゃんと解答されていましたが)、contribのプルリクが放置されていたり… 絶賛メンテ中だという感じですが、GitHubでは反映されていなかったり、ちょっとオープンじゃない感じも… 使ってる人は多そうだけど、本当に大丈夫か?最悪自分たちでメンテナンスしないといけない、という覚悟で採用
  12. 次に、パッケージ構成についてです。 ソースコード管理にはGitLabを使用しています。 サブパッケージの go get ができないという問題があって、個別にリポジトリを作って対応しました。 実装上の不都合はないのですが、CIの設定などが手間です。
  13. パッケージ管理にはGOMを使用しています。 RailsでBundlerを使っていたので使用感が似ているため採用しました。 で、masterに問題があると(コンパイルエラーとか)があると、ブランチやタグの切り替えができない。 gin-gonic/contrib/sessions と、少し前にaws/aws-sdk-go でもmasterがビルドエラーになっていて、 gom installでこけていました。 回避策として、一時的にforkして修正、そちらのリポジトリを参照するようにしています。 対応策をプルリクしたいのですが、手つかずです…
  14. 次にデータベース関連です。 ライブラリの選定中に、紆余曲折ありましたが、最終的にdatabase/sqlとlib/pqを使用して標準で頑張っています。 drone/sqlgen というモデルからScanメソッドをラップしたようなコードを生成してくれるツールがありますが、 JSON周りでちょっと合わなかったので、使用をやめました。 ER図からモデルを作成できるコードジェネレータを自作しました。 検索機能やインポート機能の部分で、SQLの組み立てに苦労していて、 クエリビルダは採用しても良かったかも、と思いました。
  15. 次に名前付けの問題です。 これが一番悩ましいのですが、冗長で似たような名前の定義が増えて困っています。 例えば、リクエストパラメータ保持用のstructとか、 コード値管理用のconstで 微妙に違うモノなので共通化もできず… pythonだと1ファイル1モジュールで分けられますし RubyはModuleで明示的にスコープが分けられます Goの場合はパッケージを細かくするしかないのか?悩ましいところです。
  16. 最後にテスト関連ですが、 素のtestingパッケージだけではつらかったので、testifyを使ってassertionは簡単に書けるようにしています。 go test ですが、最近まで使い方を誤っていて、サブパッケージのテストが実施されていませんでした。 ./... をつける必要があります。 また、 race オプションをしようすると非同期処理で怪しいところが検出できるので、必ずつけるようにしました。 でもテストの結果がわかりにくいので、その辺りをどうにかしたいです。