Upgrade to Pro — share decks privately, control downloads, hide ads and more …

当たり前にリリースしていくために必要なこと / Release safely

当たり前にリリースしていくために必要なこと / Release safely

88f4e84b94fe07cddbd9e6479d689192?s=128

soudai sone

April 21, 2021
Tweet

Transcript

  1. サービスを壊さずにリリースする ~ 当たり前にリリースしていくために必要なこと ~ Classi社様 新卒研修 第1回 そーだい塾

  2. リリースは怖い
 
 
 What is it?

  3. なぜなら、リリースすると
 
 サービスに影響がでる
 What is it?

  4. 良い影響ならいいけど…
 
 もしバグが出たら…
 
 サービスが壊れたら…
 
 What is it?

  5. だから壊さないための
 
 工夫が大事
 What is it?

  6. これを知ってたら
 
 あの事故は防げたって話をします
 What is it?

  7. 1. 自己紹介
 2. コードの遊びと余裕
 3. 監視と早期発見
 4. 素早く元に戻す
 5. まとめ


    あじぇんだ
  8. 1. 自己紹介
 2. コードの遊びと余裕
 3. 監視と早期発見
 4. 素早く元に戻す
 5. まとめ


    あじぇんだ
  9. 自己紹介
 曽根 壮大(36歳)
 Have Fun Tech LLC 代表社員
 
 そ 

    ね   たけ とも
 • 日本PostgreSQLユーザ会 勉強会分科会 担当
 • 3人の子供がいます(長女、次女、長男)
 • 技術的にはWeb/LL言語/RDBMSが好きです
 • コミュニティが好き
  10. 1. 自己紹介
 2. コードの遊びと余裕
 3. 監視と早期発見
 4. 素早く元に戻す
 5. まとめ


    あじぇんだ
  11. 遊びと余裕
 
 
 コードの遊びと余裕

  12. 遊びは仕組み 遊びの仕組みの活用例が右の 図、橋の結合部の隙間。 橋は夏などの気温が高いときに熱 膨張する。このときの熱膨張分の 隙間が最初から用意されている。 wikipedia: 熱膨張から引用

  13. コードの遊び
 
 
 コードの遊びと余裕

  14. コードの遊び
 ↓
 コードの変更(膨張)を受け入れる場所
 コードの遊びと余裕

  15. Decoratorパターン
 
 
 コードの遊びと余裕

  16. Decoratorパターン
 
 
 コードの遊びと余裕 継承ではなく、委譲で機能を追加していくパターン。 そーだいさんはDo You PHP で育ったので今日はそこから引用して説明する。 みんな

    @shimooka さんに感謝して読むんだぞ!
  17. Decoratorパターン
 
 http://shimooka.hateblo.jp/entry/20141217/1418788239 コードの遊びと余裕

  18. <?php class PlainText { private $textString = null; public function

    getText() { return $this->textString; } public function setText($str) { $this->textString = $str; } } 文字列を扱うクラス。 これに大文字するメソッドを追 加したい場合は? Decoratorパターン
  19. <?php class PlainText { private $textString = null; public function

    getText() { return $this->textString; } public function setText($str) { $this->textString = $str; } // 現場で一番良く見る実装 public function upperCaseGetText($str) { return mb_strtoupper($this->getText()); } } 仕様追加のたびにPlainTextク ラスが大きくなる。 小文字にしたい場合など、どん どんこのクラスが大きくなって いくことが目に見えている。 getText()にifを追加するのは もっとダメ。 Decoratorパターン
  20. <?php /** * テキストを扱うインターフェースクラスです */ interface Text { public function

    getText(); public function setText($str); } Decoratorパターンの場合。 まずはインターフェイスを定義 する。 Decoratorパターン
  21. <?php class PlainText implements Text { private $textString = null;

    public function getText() { return $this->textString; } public function setText($str) { $this->textString = $str; } } 先程のクラスと一緒。 インターフェイスに対する 実装クラスになった。 Decoratorパターン
  22. <?php require_once('Text.class.php'); abstract class TextDecorator implements Text { private $text;

    public function __construct(Text $target) { $this->text = $target; } public function getText() { return $this->text->getText(); } public function setText($str) { $this->text->setText($str); } } Decoratorクラスを作る。 コードの遊び部分になる。 Decoratorパターン
  23. <?php require_once('TextDecorator.class.php'); class UpperCaseText extends TextDecorator { public function __construct(Text

    $target) { parent::__construct($target); } public function getText() { $str = parent::getText(); $str = mb_strtoupper($str); return $str; } } さぁ!Textをdecorateしてみ ましょう!! UpperCaseTextクラスを実装 するとこうなる。 元のPlainTextクラスに全く影 響を与えずに機能を追加する ことができた。 Decoratorパターン
  24. <?php require_once('TextDecorator.class.php'); class DoubleByteText extends TextDecorator { public function __construct(Text

    $target) { parent::__construct($target); } /** * テキストを全角文字に変換して返します * 半角英字、数字、スペース、カタカナを全角に、 * 濁点付きの文字を一文字に変換します */ public function getText() { $str = parent::getText(); $str = mb_convert_kana($str,"RANSKV"); return $str; } } さらに機能追加。 機能追加の単位がクラスに閉 じるので仕様追加の範囲が絞 ることができる。 1クラス、1責務。 シンプルでわかりやすい。 Decoratorパターン
  25. $text_object = new PlainText(); $text_object->setText($text); $double_text_object = new DoubleByteText($text_object); $double_text_object->getText();

    使い方 Decoratorパターン
  26. コードの遊びから生まれる余裕
 • 遠回りをしているように見えるが結果はシンプル
 ◦ シンプルとイージーは違う
 • 影響範囲、スコープを極小化できる
 • シンプルが機能追加のためのコードに余裕を与える
 コードの遊びと余裕

  27. 他にも色んなテクニックがある
 
 知識と経験が『知恵』を生む
 コードの遊びと余裕

  28. スコープは小さく
 
 新たな複雑を導入しない
 コードの遊びと余裕

  29. 1. 自己紹介
 2. コードの遊びと余裕
 3. 監視と早期発見
 4. 素早く元に戻す
 5. まとめ


    あじぇんだ
  30. リリースが成功したことを
 
 どうやって判断する?
 監視と早期発見

  31. 監視と早期発見

  32. リリースを監視する
 
 
 監視と早期発見

  33. リリースを監視する
 ↓
 どうやって?
 監視と早期発見

  34. “アプリケーションの監視は、 いわゆるインフラエンジニアより、 アプリケーションを一番理解している人が 監視を一番良くできる”
 
 -- id:Songmu
 監視と早期発見

  35. サービスの振る舞いを監視する
 
 
 監視と早期発見

  36. 監視と早期発見 https://soudai.hatenablog.com/entry/webservice-monitoring

  37. 監視と早期発見

  38. 監視と早期発見

  39. 資料を見てくれ!
 
 https://speakerdeck.com/soudai/phper-monitoring 監視と早期発見

  40. サービスを監視して早く問題に気付く
 
 
 監視と早期発見

  41. サービスを監視して早く問題に気付く
 ↓
 問題を認知しないと解決はできない
 監視と早期発見 体重計に乗らなければ、ダイエットが上手く行っているかわからない

  42. 1. 自己紹介
 2. コードの遊びと余裕
 3. 監視と早期発見
 4. 素早く元に戻す
 5. まとめ


    あじぇんだ
  43. リリースして、問題に気付いたら?
 
 
 素早く元に戻す

  44. リリースして、問題に気付いたら?
 ↓
 素早く元に戻す
 素早く元に戻す

  45. つまり、元に戻せるように作る
 
 
 素早く元に戻す

  46. 元に戻せるように作る
 • 破壊的な変更をしない
 ◦ DBのUPDATEやDELETEは破壊的
 • ロールバックできるかどうか
 ◦ リリース前も後も等しく動く
 素早く元に戻す

  47. 具体的なテクニックがについては
 
 次回の実践編でやります
 素早く元に戻す

  48. 元に戻せるようにリリースするコツ
 
 
 素早く元に戻す

  49. 元に戻せるようにリリースするコツ
 ↓
 部分的にリリースする(スコープを絞る)
 素早く元に戻す

  50. 部分的リリース 1
 • ModelとViewのリリースを分ける
 ◦ Modelのリリースで既存の状態で動く
 ◦ つまり元に戻せる
 • 同じようにControllerとModelを分けるなどがある


    素早く元に戻す
  51. 部分的リリース 2
 • Viewをユーザに見せない
 ◦ ?hoge=trueがあるときだけ表示、とか
 ◦ 本番データで確認してOKならユーザに公開する
 ◦ 新ページなら導線を公開しないなどもある


    素早く元に戻す
  52. 部分的リリース 3
 • 他にも色々ある
 ◦ カナリアリリース
 ◦ ABテスト
 ◦ DBの変更だけ先にリリースする


    素早く元に戻す
  53. リリースに絶対大丈夫は無い
 
 だから、元に戻せることは大事
 素早く元に戻す

  54. 1. 自己紹介
 2. コードの遊びと余裕
 3. 監視と早期発見
 4. 素早く元に戻す
 5. まとめ


    あじぇんだ
  55. 事故を未然に防げる仕組み
 
 事故から復旧できる仕組み
 まとめ

  56. 事故は起こるべくして起こるし、
 
 起きた過去より、未来のほうが大事
 まとめ

  57. どうしても破壊的な変更が必要なら
 
 その決断は本当に必要か考える
 まとめ いい方法が思い浮かばないときは時期早々 (技術的な観点では)

  58. 手を動かしたものだけが世界を変える
 
 -- id:onishi
 まとめ

  59. さぁリリースをしよう
 
 
 まとめ

  60. ご清聴ありがとうございました
 
 
 まとめ