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

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

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

soudai sone

April 21, 2021
Tweet

More Decks by soudai sone

Other Decks in Technology

Transcript

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

    View Slide

  2. リリースは怖い



    What is it?

    View Slide

  3. なぜなら、リリースすると


    サービスに影響がでる

    What is it?

    View Slide

  4. 良い影響ならいいけど…


    もしバグが出たら…


    サービスが壊れたら…


    What is it?

    View Slide

  5. だから壊さないための


    工夫が大事

    What is it?

    View Slide

  6. これを知ってたら


    あの事故は防げたって話をします

    What is it?

    View Slide

  7. 1. 自己紹介

    2. コードの遊びと余裕

    3. 監視と早期発見

    4. 素早く元に戻す

    5. まとめ

    あじぇんだ

    View Slide

  8. 1. 自己紹介

    2. コードの遊びと余裕

    3. 監視と早期発見

    4. 素早く元に戻す

    5. まとめ

    あじぇんだ

    View Slide

  9. 自己紹介

    曽根 壮大(36歳)

    Have Fun Tech LLC 代表社員


    そ  ね   たけ とも

    ● 日本PostgreSQLユーザ会 勉強会分科会 担当

    ● 3人の子供がいます(長女、次女、長男)

    ● 技術的にはWeb/LL言語/RDBMSが好きです

    ● コミュニティが好き

    View Slide

  10. 1. 自己紹介

    2. コードの遊びと余裕

    3. 監視と早期発見

    4. 素早く元に戻す

    5. まとめ

    あじぇんだ

    View Slide

  11. 遊びと余裕



    コードの遊びと余裕

    View Slide

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

    View Slide

  13. コードの遊び



    コードの遊びと余裕

    View Slide

  14. コードの遊び

    ↓

    コードの変更(膨張)を受け入れる場所

    コードの遊びと余裕

    View Slide

  15. Decoratorパターン



    コードの遊びと余裕

    View Slide

  16. Decoratorパターン



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

    View Slide

  17. Decoratorパターン


    http://shimooka.hateblo.jp/entry/20141217/1418788239
    コードの遊びと余裕

    View Slide

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

    View Slide

  19. 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パターン

    View Slide

  20. /**
    * テキストを扱うインターフェースクラスです
    */
    interface Text {
    public function getText();
    public function setText($str);
    }
    Decoratorパターンの場合。
    まずはインターフェイスを定義
    する。
    Decoratorパターン

    View Slide

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

    View Slide

  22. 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パターン

    View Slide

  23. 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パターン

    View Slide

  24. 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パターン

    View Slide

  25. $text_object = new PlainText();
    $text_object->setText($text);
    $double_text_object = new DoubleByteText($text_object);
    $double_text_object->getText();
    使い方
    Decoratorパターン

    View Slide

  26. コードの遊びから生まれる余裕

    ● 遠回りをしているように見えるが結果はシンプル

    ○ シンプルとイージーは違う

    ● 影響範囲、スコープを極小化できる

    ● シンプルが機能追加のためのコードに余裕を与える

    コードの遊びと余裕

    View Slide

  27. 他にも色んなテクニックがある


    知識と経験が『知恵』を生む

    コードの遊びと余裕

    View Slide

  28. スコープは小さく


    新たな複雑を導入しない

    コードの遊びと余裕

    View Slide

  29. 1. 自己紹介

    2. コードの遊びと余裕

    3. 監視と早期発見

    4. 素早く元に戻す

    5. まとめ

    あじぇんだ

    View Slide

  30. リリースが成功したことを


    どうやって判断する?

    監視と早期発見

    View Slide

  31. 監視と早期発見

    View Slide

  32. リリースを監視する



    監視と早期発見

    View Slide

  33. リリースを監視する

    ↓

    どうやって?

    監視と早期発見

    View Slide

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


    -- id:Songmu

    監視と早期発見

    View Slide

  35. サービスの振る舞いを監視する



    監視と早期発見

    View Slide

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

    View Slide

  37. 監視と早期発見

    View Slide

  38. 監視と早期発見

    View Slide

  39. 資料を見てくれ!


    https://speakerdeck.com/soudai/phper-monitoring
    監視と早期発見

    View Slide

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



    監視と早期発見

    View Slide

  41. サービスを監視して早く問題に気付く

    ↓

    問題を認知しないと解決はできない

    監視と早期発見
    体重計に乗らなければ、ダイエットが上手く行っているかわからない

    View Slide

  42. 1. 自己紹介

    2. コードの遊びと余裕

    3. 監視と早期発見

    4. 素早く元に戻す

    5. まとめ

    あじぇんだ

    View Slide

  43. リリースして、問題に気付いたら?



    素早く元に戻す

    View Slide

  44. リリースして、問題に気付いたら?

    ↓

    素早く元に戻す

    素早く元に戻す

    View Slide

  45. つまり、元に戻せるように作る



    素早く元に戻す

    View Slide

  46. 元に戻せるように作る

    ● 破壊的な変更をしない

    ○ DBのUPDATEやDELETEは破壊的

    ● ロールバックできるかどうか

    ○ リリース前も後も等しく動く

    素早く元に戻す

    View Slide

  47. 具体的なテクニックがについては


    次回の実践編でやります

    素早く元に戻す

    View Slide

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



    素早く元に戻す

    View Slide

  49. 元に戻せるようにリリースするコツ

    ↓

    部分的にリリースする(スコープを絞る)

    素早く元に戻す

    View Slide

  50. 部分的リリース 1

    ● ModelとViewのリリースを分ける

    ○ Modelのリリースで既存の状態で動く

    ○ つまり元に戻せる

    ● 同じようにControllerとModelを分けるなどがある

    素早く元に戻す

    View Slide

  51. 部分的リリース 2

    ● Viewをユーザに見せない

    ○ ?hoge=trueがあるときだけ表示、とか

    ○ 本番データで確認してOKならユーザに公開する

    ○ 新ページなら導線を公開しないなどもある

    素早く元に戻す

    View Slide

  52. 部分的リリース 3

    ● 他にも色々ある

    ○ カナリアリリース

    ○ ABテスト

    ○ DBの変更だけ先にリリースする

    素早く元に戻す

    View Slide

  53. リリースに絶対大丈夫は無い


    だから、元に戻せることは大事

    素早く元に戻す

    View Slide

  54. 1. 自己紹介

    2. コードの遊びと余裕

    3. 監視と早期発見

    4. 素早く元に戻す

    5. まとめ

    あじぇんだ

    View Slide

  55. 事故を未然に防げる仕組み


    事故から復旧できる仕組み

    まとめ

    View Slide

  56. 事故は起こるべくして起こるし、


    起きた過去より、未来のほうが大事

    まとめ

    View Slide

  57. どうしても破壊的な変更が必要なら


    その決断は本当に必要か考える

    まとめ
    いい方法が思い浮かばないときは時期早々
    (技術的な観点では)

    View Slide

  58. 手を動かしたものだけが世界を変える


    -- id:onishi

    まとめ

    View Slide

  59. さぁリリースをしよう



    まとめ

    View Slide

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



    まとめ

    View Slide