失敗という概念が存在しない退屈なweb開発

47
ととと ととととととと とととと Web とと 2016/12/19 ShippaiNight とととと @ohrdev

Upload: tsunenori-oohara

Post on 16-Apr-2017

643 views

Category:

Software


0 download

TRANSCRIPT

Page 1: 失敗という概念が存在しない退屈なweb開発

という概念が存在しない

退屈な

失敗

Web開発2016/12/19 ShippaiNightおーはら @ohrdev

Page 2: 失敗という概念が存在しない退屈なweb開発
Page 3: 失敗という概念が存在しない退屈なweb開発

発表の趣旨• ( 私の ) 失敗に対する考え方• ( 私の失敗 ) 事例紹介• 知見共有

Page 4: 失敗という概念が存在しない退屈なweb開発
Page 5: 失敗という概念が存在しない退屈なweb開発
Page 6: 失敗という概念が存在しない退屈なweb開発
Page 7: 失敗という概念が存在しない退屈なweb開発
Page 8: 失敗という概念が存在しない退屈なweb開発

発表の趣旨• ( 私の ) 失敗に対する考え方• ( 私の失敗 ) 事例紹介• 知見共有• ローストビーフ

Page 9: 失敗という概念が存在しない退屈なweb開発

Agenda• 自己紹介• 失敗とは• 失敗時の対応• 失敗の防止• 事例紹介• まとめ

Page 10: 失敗という概念が存在しない退屈なweb開発

自己紹介• おーはら @ohrdev• 株式会社ドリコム– 基盤技術部 / 広告チーム– サーバーサイド /AD/ スペシャリスト– Elixir/Phoenix, Erlang, Ruby/Rails, Lisp, etc– 仏像制作 / 広告配信 / 全社基盤システムのお世話

• tokyo.ex, ElixirConf, VRTech.tokyo の主催運営• # 仏像 , # 寺社仏閣 , # 写経 , # 丸太 , #VR,

#LEGO, # 丸太収集

Page 11: 失敗という概念が存在しない退屈なweb開発

事故紹介

Page 12: 失敗という概念が存在しない退屈なweb開発

宣伝 (1)

• 株式会社ドリコム– エンジニアを絶賛募集中です– http://www.drecom.co.jp/recruit/

– TechBlog 始めました– https://tech.drecom.co.jp/

Page 13: 失敗という概念が存在しない退屈なweb開発

宣伝 (2)• SoftwareDesign 2016/11, 12 月号– [ 次世代言語 ] Elixir の実力を知る– http://gihyo.jp/magazine/SD/archive/2016/

201611– http://gihyo.jp/magazine/SD/archive/2016/

201612

Page 14: 失敗という概念が存在しない退屈なweb開発

失敗とは• 人は必ず失敗する– 失敗しない xxx はない

• 失敗のサイクル– 挑戦 -> 失敗 -> 発展 -> 挑戦 -> 失敗 -> 発展 -> …

• 成長の裏には失敗がある

本当に役にたつ「失敗学」 より

Page 15: 失敗という概念が存在しない退屈なweb開発

失敗とは• Web 開発における失敗分類– 組織 / チームの失敗– サービスの失敗– テクノロジーの失敗– アーキテクチャの失敗– ソフトウェアの失敗– オペレーションの失敗

Page 16: 失敗という概念が存在しない退屈なweb開発

失敗とは• 失敗 == 間違い ではない– (web サービス開発の文脈では ) フェーズによって、最適解が異なる– ex) テストを書かない• プロトタイピング、 α 版

– ex) マイクロサービス vs モノシリック• サービスの規模による

• 障害 /Bug ⊂ 失敗– 本発表では障害 /Bug は失敗に含めます

Page 17: 失敗という概念が存在しない退屈なweb開発

失敗とは• 失敗 ( 障害 ) 原因の階層

件数

重大度

個々人が原因

未知なる原因社会が原因組織が原因チームが原因

トランプが戦争起こした大地震が起きたAWS/GCP の障害取引先が倒産した

長期間続く高稼働状態適切な人員配置ができていないレビュー体制が無いテスト /CI が無い引き継ぎが無い

考慮不足うっかり確認漏れ無知勉強不足

Page 18: 失敗という概念が存在しない退屈なweb開発

失敗時の対応• チーム / 組織としてどうすべきか• 放置しない• 助ける / られる

Page 19: 失敗という概念が存在しない退屈なweb開発

失敗時の対応• チーム / 組織としてどうすべきか

失敗

組織長

組織

チーム

上司

教育者

先輩

同僚

致命的な事故を防止する( 失敗した者の ) 成長を考える重大な事故を予防する

( 失敗した者の ) 成長を考える小さな失敗をさせる失敗の後始末を手伝う

失敗者を助けて自分も学ぶ

Page 20: 失敗という概念が存在しない退屈なweb開発

失敗時の対応• 放置しない– 失敗を放置すると失敗が成長 ( 拡大 ) する• テストコード不足、コードメトリクス• チーム文化• スロークエリ、 N+1 問題• データ量 ( ログのローテート忘れ )• ログのとりわすれ

–割れ窓を防ぐ– 大きな失敗 / 障害 /Bug の原因になる

Page 21: 失敗という概念が存在しない退屈なweb開発

失敗時の対応• 助ける / られる– 失敗時は周りに助けを求めるべき

• 責任感の強い人ほど自分でなんとかしようとする• 自分ではどうしようも無い場合は詰む

–日頃から助けを求められるパスを作っておく• 普段から周りを助けておかないと、いざという時に助けてもらえない(助ける : 助けられる =5:1 くらい )

–仕組みが無いと辛い(組織として取り組む )• エンジニア間のつながり• 助け合える文化、失敗を許容する文化• 空気

Page 22: 失敗という概念が存在しない退屈なweb開発

失敗時の対応• 助けられる

Page 23: 失敗という概念が存在しない退屈なweb開発

失敗時の対応 (空気 )

社内コミュニケーションにおける unk の可能性http://onk.bz/data/2008-02-24/1000speakers2.html

Page 24: 失敗という概念が存在しない退屈なweb開発

失敗時の対応 (空気 )

Page 25: 失敗という概念が存在しない退屈なweb開発

失敗時の対応 (空気 )

Page 26: 失敗という概念が存在しない退屈なweb開発

失敗時の対応 (空気 )

Page 27: 失敗という概念が存在しない退屈なweb開発

失敗時の対応 (空気 )

Page 28: 失敗という概念が存在しない退屈なweb開発

失敗時の対応 (空気 )

Page 29: 失敗という概念が存在しない退屈なweb開発

失敗時の対応 (空気 )

• 助け合える文化、助け合える空気• 失敗を許容する文化、失敗を許容する空気• ミスを憎んで人を憎まず

Page 30: 失敗という概念が存在しない退屈なweb開発

失敗の対策• 知見を貯める• 情報の残し方• トップダウンで

Page 31: 失敗という概念が存在しない退屈なweb開発

失敗の対策• 知見を貯める–客観的な失敗情報 (だけ ) は役に立たない– 当事者の心理状態、行動、考えが重要

失敗 記述 記録 伝達知見化背景

心理状態経緯 原因

対応総括

連鎖の防止共通認識

仕組み・system

Page 32: 失敗という概念が存在しない退屈なweb開発

失敗の対策• マニュアル– 失敗しない手順しかない– マニュアルにない手順を行うとどうなるかが無い–想定外の事態が発生するとどうにもならない

• 失敗時の記録 / 知見が重要– どう失敗したか– どうして失敗したか– どうすれば回避できたか

Page 33: 失敗という概念が存在しない退屈なweb開発

失敗時の対策 (情報の残し方 )マニュアル

S

G

想定外のケースに対処できない

Page 34: 失敗という概念が存在しない退屈なweb開発

失敗時の対策 (情報の残し方 )べからず

想定外のケースに対処できない

Page 35: 失敗という概念が存在しない退屈なweb開発

失敗時の対策 (情報の残し方 )失敗事例

想定外のケースに対処できない

Page 36: 失敗という概念が存在しない退屈なweb開発

失敗時の対策 (情報の残し方 )知識・知見

どんな失敗、どうして失敗、どう回避するか

Page 37: 失敗という概念が存在しない退屈なweb開発

失敗の対策• トップダウンで–ボトムアップではぬるい対策になりがち– トップが率先してやる– 個人努力ではなく、仕組み・ルールとして実行しないと中途半端になる• ルール・プラクティスの導入• Spec/lint/CI の強制実行など

–痛み(心理的障害)が発生するので、ある程度の強制力があるとスムーズに導入できる

Page 38: 失敗という概念が存在しない退屈なweb開発

事例紹介 ( 組織 / チーム )

• 職種間 ( 営業 /企画 / 開発 / 運用 ) の断絶– 開発だから〜まで、営業だから〜まで–⇨お見合い状態からの情報落ち–⇨音頭取り不在によるサイクルスピード低下– スクラム /1 チーム感の醸成(空気 )

• 教育としての失敗 ( どう失敗経験をさせるか )– ペアプロ , コードレビュー–検証環境へのリリース & ストレステスト

Page 39: 失敗という概念が存在しない退屈なweb開発

事例紹介 ( テクノロジー )

• ライブラリ・ミドルウェアのバージョン– 後回しにすればするほど、バージョンアップコストが増大する–⇨Ruby1系、 Rails2系バージョンのシステム–⇨セキュリティ対応ができなく , 自力でやらないといけなくなる(パッチが出ない)– レガシーバージョンのシステムのメンテコストが非常に大きい– お金を稼いでいるのであれば、レジェンドコード

Page 40: 失敗という概念が存在しない退屈なweb開発

事例紹介 ( アーキテクチャ )

• 自動化 (CI による自動 deploy/operation)–初期フェーズから導入しないと高いコストが必要になる–⇨初期から導入していないと Deploy周りの操作は心理的ハードルが高い• AWS のサービス管理 : Terraform から

ServerlessFrameworkへの移行–仮想化は初期フェーズから入れておかないと導入するのが難しい /ハードルが高くなる

Page 41: 失敗という概念が存在しない退屈なweb開発

事例紹介 ( アーキテクチャ )

• 失敗に強いアーキテクチャ–耐障害、監視機構、 etc–負荷分散、スケールアウト / アップ– マイクロサービス• リアーキテクチャ、サービスの入れ替え etc

Page 42: 失敗という概念が存在しない退屈なweb開発

事例紹介 ( プログラミング )

• Lint/ 自動テスト /CI– 開発初期に Lint/ 自動テスト /CI を導入していなかった–⇨ある程度開発が進んだ状態で導入した時にワーニングが大量に出て導入コストが増大–⇨( 知見 )初期フェーズに必ず入れるべき–⇨( 知見 ) 失敗を放置してはいけない– テストが無い状態からテスト導入 (80%程度のカバレッジ ) まで年単位のコストを支払った

Page 43: 失敗という概念が存在しない退屈なweb開発

事例紹介 ( プラクティス )

• 変更に対する恐怖と戦う– リファクタリング– リアーキテクチャ–変更に対する恐怖とどう戦うか• テスト• 検知• マイクロサービス化

–⇨小さな変更を多く繰り返す

Page 44: 失敗という概念が存在しない退屈なweb開発

まとめ• 失敗に対して正しいアクションを• 失敗を成長の糧に• 失敗を怖がらない

Page 45: 失敗という概念が存在しない退屈なweb開発

という概念が存在しない

退屈な

失敗

Web開発

Page 46: 失敗という概念が存在しない退屈なweb開発

という概念が存在するからこそ

退屈せずに楽しめる

失敗

Web開発

Page 47: 失敗という概念が存在しない退屈なweb開発

参考文献• 「使える失敗学」• 「図解 使える失敗学」• 「 Code Simplicity 」• 私のチームの Redmine/Wiki• OSS の issue リスト• etc