CINXE.COM

「SREをはじめよう」の輪読会を実施しました! - BASEプロダクトチームブログ

<!DOCTYPE html> <html lang="ja" data-admin-domain="//blog.hatena.ne.jp" data-admin-origin="https://blog.hatena.ne.jp" data-author="basedevteam" data-avail-langs="ja en" data-blog="base-developer.hatenablog.com" data-blog-host="base-developer.hatenablog.com" data-blog-is-public="1" data-blog-name="BASEプロダクトチームブログ" data-blog-owner="basedevteam" data-blog-show-ads="" data-blog-show-sleeping-ads="" data-blog-uri="https://devblog.thebase.in/" data-blog-uuid="10328537792370962182" data-blogs-uri-base="https://devblog.thebase.in" data-brand="devblog" data-data-layer="{&quot;hatenablog&quot;:{&quot;admin&quot;:{},&quot;analytics&quot;:{&quot;brand_property_id&quot;:&quot;&quot;,&quot;measurement_id&quot;:&quot;G-W1284X7XBB&quot;,&quot;non_sampling_property_id&quot;:&quot;&quot;,&quot;property_id&quot;:&quot;UA-177755085-1&quot;,&quot;separated_property_id&quot;:&quot;UA-29716941-19&quot;},&quot;blog&quot;:{&quot;blog_id&quot;:&quot;10328537792370962182&quot;,&quot;content_seems_japanese&quot;:&quot;true&quot;,&quot;disable_ads&quot;:&quot;custom_domain&quot;,&quot;enable_ads&quot;:&quot;false&quot;,&quot;enable_keyword_link&quot;:&quot;false&quot;,&quot;entry_show_footer_related_entries&quot;:&quot;false&quot;,&quot;force_pc_view&quot;:&quot;true&quot;,&quot;is_public&quot;:&quot;true&quot;,&quot;is_responsive_view&quot;:&quot;true&quot;,&quot;is_sleeping&quot;:&quot;false&quot;,&quot;lang&quot;:&quot;ja&quot;,&quot;name&quot;:&quot;BASE\u30d7\u30ed\u30c0\u30af\u30c8\u30c1\u30fc\u30e0\u30d6\u30ed\u30b0&quot;,&quot;owner_name&quot;:&quot;basedevteam&quot;,&quot;uri&quot;:&quot;https://devblog.thebase.in/&quot;},&quot;brand&quot;:&quot;devblog&quot;,&quot;page_id&quot;:&quot;entry&quot;,&quot;permalink_entry&quot;:{&quot;author_name&quot;:&quot;toshi-oliver&quot;,&quot;categories&quot;:&quot;&quot;,&quot;character_count&quot;:6580,&quot;date&quot;:&quot;2025-01-23&quot;,&quot;entry_id&quot;:&quot;6802418398322597383&quot;,&quot;first_category&quot;:&quot;&quot;,&quot;hour&quot;:&quot;18&quot;,&quot;title&quot;:&quot;\u300cSRE\u3092\u306f\u3058\u3081\u3088\u3046\u300d\u306e\u8f2a\u8aad\u4f1a\u3092\u5b9f\u65bd\u3057\u307e\u3057\u305f!&quot;,&quot;uri&quot;:&quot;https://devblog.thebase.in/entry/2025/01/23/180000&quot;},&quot;pro&quot;:&quot;pro&quot;,&quot;router_type&quot;:&quot;blogs&quot;}}" data-device="pc" data-dont-recommend-pro="false" data-global-domain="https://hatena.blog" data-globalheader-color="b" data-globalheader-type="pc" data-has-touch-view="1" data-help-url="https://help.hatenablog.com" data-hide-header="1" data-no-suggest-touch-view="1" data-page="entry" data-parts-domain="https://hatenablog-parts.com" data-plus-available="1" data-pro="true" data-router-type="blogs" data-sentry-dsn="https://03a33e4781a24cf2885099fed222b56d@sentry.io/1195218" data-sentry-environment="production" data-sentry-sample-rate="0.1" data-static-domain="https://cdn.blog.st-hatena.com" data-version="3302d0c519de548bcb3552ea0bf509" data-initial-state="{}" > <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#"> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="robots" content="max-image-preview:large" /> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=7; IE=9; IE=10; IE=11" /> <title>「SREをはじめよう」の輪読会を実施しました! - BASEプロダクトチームブログ</title> <link rel="canonical" href="https://devblog.thebase.in/entry/2025/01/23/180000"/> <meta itemprop="name" content="「SREをはじめよう」の輪読会を実施しました! - BASEプロダクトチームブログ"/> <meta itemprop="image" content="https://cdn.image.st-hatena.com/image/scale/0fe86124af8fa2b3c590ba0db4c761ac05e7944f/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fdefault_entry_og_image%2F153078222%2F1614340287711564"/> <meta property="og:title" content="「SREをはじめよう」の輪読会を実施しました! - BASEプロダクトチームブログ"/> <meta property="og:type" content="article"/> <meta property="og:url" content="https://devblog.thebase.in/entry/2025/01/23/180000"/> <meta property="og:image" content="https://cdn.image.st-hatena.com/image/scale/0fe86124af8fa2b3c590ba0db4c761ac05e7944f/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fdefault_entry_og_image%2F153078222%2F1614340287711564"/> <meta property="og:image:alt" content="「SREをはじめよう」の輪読会を実施しました! - BASEプロダクトチームブログ"/> <meta property="og:description" content="はじめに BASE Dept. Product Devにてバックエンドエンジニアをしているオリバです。 2024年末、弊社のソフトウェアエンジニア(以下、SWE)でSREに興味を持つメンバーを募り、「SREをはじめよう」を題材にした輪読会を実施しました。本記事では、各部・各章の要点を整理し、実践に役立つ知見を共有します。 ※引用元: O&#39;Reilly Japan SREをはじめよう 第1部 SRE入門 この部では、SREの定義やSREの文化のような、SREの概論に触れています。 SREの定義 書籍では、SREを以下で定義しています。 サイトリライアビリティエンジニアリングは、組織がシステム、サ…" /> <meta property="og:site_name" content="BASEプロダクトチームブログ"/> <meta property="article:published_time" content="2025-01-23T09:00:00Z" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:image" content="https://cdn.image.st-hatena.com/image/scale/0fe86124af8fa2b3c590ba0db4c761ac05e7944f/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fdefault_entry_og_image%2F153078222%2F1614340287711564" /> <meta name="twitter:title" content="「SREをはじめよう」の輪読会を実施しました! - BASEプロダクトチームブログ" /> <meta name="twitter:description" content="はじめに BASE Dept. Product Devにてバックエンドエンジニアをしているオリバです。 2024年末、弊社のソフトウェアエンジニア(以下、SWE)でSREに興味を持つメンバーを募り、「SREをはじめよう」を題材にした輪読会を実施しました。本記事では、各部・各章の要点を整理し、実践に役立つ知見を共有します…" /> <meta name="twitter:app:name:iphone" content="はてなブログアプリ" /> <meta name="twitter:app:id:iphone" content="583299321" /> <meta name="twitter:app:url:iphone" content="hatenablog:///open?uri=https%3A%2F%2Fdevblog.thebase.in%2Fentry%2F2025%2F01%2F23%2F180000" /> <meta name="description" content="はじめに BASE Dept. Product Devにてバックエンドエンジニアをしているオリバです。 2024年末、弊社のソフトウェアエンジニア(以下、SWE)でSREに興味を持つメンバーを募り、「SREをはじめよう」を題材にした輪読会を実施しました。本記事では、各部・各章の要点を整理し、実践に役立つ知見を共有します。 ※引用元: O&#39;Reilly Japan SREをはじめよう 第1部 SRE入門 この部では、SREの定義やSREの文化のような、SREの概論に触れています。 SREの定義 書籍では、SREを以下で定義しています。 サイトリライアビリティエンジニアリングは、組織がシステム、サ…" /> <meta name="google-site-verification" content="_FbkQSjQgcZcxJjN06Pre9XjjxZDgyKpxuQLyX7Yq_Y" /> <meta name="keywords" content="テックブログ,BASE,開発,エンジニア,Web" /> <script id="embed-gtm-data-layer-loader" data-data-layer-page-specific="{&quot;hatenablog&quot;:{&quot;blogs_permalink&quot;:{&quot;is_author_pro&quot;:&quot;true&quot;,&quot;is_blog_sleeping&quot;:&quot;false&quot;,&quot;has_related_entries_with_elasticsearch&quot;:&quot;false&quot;,&quot;blog_afc_issued&quot;:&quot;false&quot;,&quot;entry_afc_issued&quot;:&quot;false&quot;}}}" > (function() { function loadDataLayer(elem, attrName) { if (!elem) { return {}; } var json = elem.getAttribute(attrName); if (!json) { return {}; } return JSON.parse(json); } var globalVariables = loadDataLayer( document.documentElement, 'data-data-layer' ); var pageSpecificVariables = loadDataLayer( document.getElementById('embed-gtm-data-layer-loader'), 'data-data-layer-page-specific' ); var variables = [globalVariables, pageSpecificVariables]; if (!window.dataLayer) { window.dataLayer = []; } for (var i = 0; i < variables.length; i++) { window.dataLayer.push(variables[i]); } })(); </script> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-P4CXTW');</script> <!-- End Google Tag Manager --> <link rel="shortcut icon" href="https://devblog.thebase.in/icon/favicon"> <link rel="apple-touch-icon" href="https://devblog.thebase.in/icon/touch"> <link rel="icon" sizes="192x192" href="https://devblog.thebase.in/icon/link"> <link rel="alternate" type="application/atom+xml" title="Atom" href="https://devblog.thebase.in/feed"/> <link rel="alternate" type="application/rss+xml" title="RSS2.0" href="https://devblog.thebase.in/rss"/> <link rel="alternate" type="application/json+oembed" href="https://hatena.blog/oembed?url=https%3A%2F%2Fdevblog.thebase.in%2Fentry%2F2025%2F01%2F23%2F180000&amp;format=json" title="oEmbed Profile of 「SREをはじめよう」の輪読会を実施しました!"/> <link rel="alternate" type="text/xml+oembed" href="https://hatena.blog/oembed?url=https%3A%2F%2Fdevblog.thebase.in%2Fentry%2F2025%2F01%2F23%2F180000&amp;format=xml" title="oEmbed Profile of 「SREをはじめよう」の輪読会を実施しました!"/> <link rel="author" href="http://www.hatena.ne.jp/toshi-oliver/"> <link rel="preload" href="https://cdn-ak.f.st-hatena.com/images/fotolife/i/itsukichitose/20200909/20200909153301.png" as="image"/> <link rel="stylesheet" type="text/css" href="https://cdn.blog.st-hatena.com/css/blog.css?version=3302d0c519de548bcb3552ea0bf509"/> <link rel="stylesheet" type="text/css" href="https://usercss.blog.st-hatena.com/blog_style/10328537792370962182/911dd0d5a723164224866aa0bcc098fb1e73cf10"/> <script> </script> <style> div#google_afc_user, div.google-afc-user-container, div.google_afc_image, div.google_afc_blocklink { display: block !important; } </style> <script type="application/ld+json">{"@context":"http://schema.org","@type":"Article","dateModified":"2025-01-23T18:00:01+09:00","datePublished":"2025-01-23T18:00:00+09:00","headline":"「SREをはじめよう」の輪読会を実施しました!","image":["https://cdn.user.blog.st-hatena.com/default_entry_og_image/153078222/1614340287711564"]}</script> </head> <body class="page-entry header-image-only enable-bottom-editarea globalheader-off globalheader-ng-enabled"> <div id="globalheader-container" data-brand="hatenablog" style="display: none" > <iframe id="globalheader" height="37" frameborder="0" allowTransparency="true"></iframe> </div> <div id="container"> <div id="container-inner"> <header id="blog-title" data-brand="hatenablog"> <div id="blog-title-inner" style="background-image: url('https://cdn-ak.f.st-hatena.com/images/fotolife/i/itsukichitose/20200909/20200909153301.png'); background-position: center 0px;"> <div id="blog-title-content"> <h1 id="title"><a href="https://devblog.thebase.in/">BASEプロダクトチームブログ</a></h1> <h2 id="blog-description">ネットショップ作成サービス「BASE ( https://thebase.in )」、ショッピングアプリ「BASE ( https://thebase.in/sp )」のプロダクトチームによるブログです。</h2> </div> </div> </header> <div id="content" class="hfeed" > <div id="content-inner"> <div id="wrapper"> <div id="main"> <div id="main-inner"> <!-- google_ad_section_start --> <!-- rakuten_ad_target_begin --> <article class="entry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-6800 words-400 mode-markdown entry-odd" id="entry-6802418398322597383" data-keyword-campaign="" data-uuid="6802418398322597383" data-publication-type="entry"> <div class="entry-inner"> <header class="entry-header"> <div class="date entry-date first"> <a href="https://devblog.thebase.in/archive/2025/01/23" rel="nofollow"> <time datetime="2025-01-23T09:00:00Z" title="2025-01-23T09:00:00Z"> <span class="date-year">2025</span><span class="hyphen">-</span><span class="date-month">01</span><span class="hyphen">-</span><span class="date-day">23</span> </time> </a> </div> <h1 class="entry-title"> <a href="https://devblog.thebase.in/entry/2025/01/23/180000" class="entry-title-link bookmark">「SREをはじめよう」の輪読会を実施しました!</a> </h1> <div class="customized-header"> <div class="entry-header-html"><div id="oldArticleWarning" style="display: none;" class="notice-warning"></div></div> </div> </header> <div class="entry-content hatenablog-entry"> <h1 id="はじめに">はじめに</h1> <p>BASE Dept. Product Devにてバックエンドエンジニアをしている<a href="https://x.com/toshi_oliver">オリバ</a>です。</p> <p>2024年末、弊社のソフトウェアエンジニア(以下、SWE)でSREに興味を持つメンバーを募り、「SREをはじめよう」を題材にした輪読会を実施しました。本記事では、各部・各章の要点を整理し、実践に役立つ知見を共有します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/toshi-oliver/20250123/20250123145032.png" width="487" height="692" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>※引用元: <a href="https://www.oreilly.co.jp/books/9784814400904/">O'Reilly Japan SREをはじめよう</a></p> <h1 id="第1部-SRE入門">第1部 SRE入門</h1> <p>この部では、SREの定義やSREの文化のような、SREの概論に触れています。</p> <h2 id="SREの定義">SREの定義</h2> <p>書籍では、SREを以下で定義しています。</p> <blockquote><p>サイトリライアビリティエンジニアリングは、組織がシステム、サービス、製品において 適切なレベルの信頼性を持続的に達成できるよう支援することを目的とした工学分野である。</p></blockquote> <p>工学の分野の1つと認識されていますが、情報系の学部出身の弊社社員の中で、工学分野としてのSREという言葉を耳にしたことがある方はいませんでした。もしかすると、将来的に大学の講義でもSREが取り上げられるかもしれません。</p> <p>また、SREを理解するのに最適な1枚のスライドが紹介されています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/toshi-oliver/20250123/20250123145306.png" width="1200" height="666" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>※引用元: <a href="https://www.usenix.org/conference/srecon14/technical-sessions/presentation/keys-sre">Keys to SRE</a></p> <p>このスライドはSREの始祖とも言われているBen Treynor Slossが、2014年5月31日のSREconの基調講演で紹介されたスライドです。</p> <p>私が特に疑問に思ったのは、上から6つ目の<code>Excess Ops work overflows to DEV team</code>です。和訳すると、「余計な運用作業は開発チームにオーバーフローさせる」という意味になり、なぜ運用作業を開発チームにオーバーフローさせるのか輪読会で話し合い、以下の内容で解釈しました。</p> <ul> <li>余計な運用作業があることを意図的に開発チームに気づかせるようにする</li> <li>SREの運用作業は過剰になりがちで、より重要な業務に注力するために、開発チームに一部を委譲する</li> <li>インシデントが起きたときに、SREの中で閉じないようにする</li> </ul> <h2 id="DevOpsとSREの関係性">DevOpsとSREの関係性</h2> <h3 id="DevOps">DevOps</h3> <p>コードを本番環境にリリースするために何が必要か考えます。</p> <h3 id="SRE">SRE</h3> <p>本番環境を起点に、信頼できる運用を実現するには何をすべきか考えます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/toshi-oliver/20250123/20250123145602.png" width="1200" height="538" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>※引用元: <a href="https://www.oreilly.co.jp/books/9784873119618/">SREの探求</a></p> <h2 id="SREの心構え">SREの心構え</h2> <p>本書で特に重要とされるSREの心構えとして、以下の4点が挙げられます。</p> <h3 id="1-フィードバックループを重ねる">1. フィードバックループを重ねる</h3> <p>信頼性向上の中心となるのは、継続的な改善を可能にするフィードバックループの構築です。</p> <h3 id="2-共同作業を重視する">2. 共同作業を重視する</h3> <p>SREは、さまざまな分野の同僚と協力しながらシステムの信頼性を向上させます。また、顧客とも信頼性に関する共同作業を行う姿勢が重要です。</p> <h3 id="3-オーナーシップを持つ">3. オーナーシップを持つ</h3> <p>運用するサービスに対して責任を持ち、主体的に取り組みます。</p> <h3 id="4-失敗から学ぶ">4. 失敗から学ぶ</h3> <p>システムのエラーを学習機会と捉え、そこから改善のアイデアを得ます。</p> <h2 id="SREの文化を醸成する">SREの文化を醸成する</h2> <p>本書で紹介されているSRE文化を醸成するための取り組みの中で、組織に取り入れやすいと思われるアイデアを以下にまとめました。</p> <h3 id="1-トイル削減を祝う文化を作る">1. トイル削減を祝う文化を作る</h3> <p>トイル(以下の特徴を持つ繰り返し作業)を削減した取り組みを組織全体で祝う文化を作ります。</p> <ul> <li>手作業である</li> <li>繰り返される</li> <li>自動化可能</li> <li>長期的価値を持たない</li> <li>サービスの成長に比例して増える(O(n))</li> </ul> <h3 id="2-ポストモーテム会やデザインドキュメント会の開催">2. 「ポストモーテム会」や「デザインドキュメント会」の開催</h3> <p>ポストモーテムとは、インシデント発生後の事後検証プロセスです。インシデントレポートをチーム全体で共有する文化や、振り返りの場を定期的に設けることで、組織的な学びを深められる可能性があります。</p> <h3 id="3-チーム間のローテーション">3. チーム間のローテーション</h3> <p>SWEが一定期間SREチームに参加する「交換留学」を実施することで、SRE文化が組織全体に広がります。弊社でも2025年からこの取り組みを開始する予定です。</p> <h2 id="SREを提唱する">SREを提唱する</h2> <p>SREを提唱できる力は、組織内外でその存在意義を説明する場面で重要です。例えば、組織のステークホルダーにSREの存在意義を伝え、SREという組織を存在させる場面でも必要ですし、採用活動や転職時には、SREの役割や文化を候補者や採用側と共有し、ギャップを認識することが求められます。</p> <p>また、他者の経験やストーリーを学ぶことも重要です。本書では、イベントや勉強会への参加が強く推奨されています。私もさっそく、2025年1月26日に開催される<a href="https://2025.srekaigi.net/">SRE Kaigi 2025</a>への参加申し込みを行いました。</p> <h1 id="第2部-個人がSREをはじめるには">第2部 個人がSREをはじめるには</h1> <p>この部では、個人がSREを始めるために必要なスキルや考え方について説明します。</p> <h2 id="SREになるための準備">SREになるための準備</h2> <p>SREになるために必要なスキルとして、本書では以下を挙げています。</p> <h3 id="1-コーディングスキル">1. コーディングスキル</h3> <p>コーディングスキルはSREにとって不可欠です。システムの構造を深く理解し、潜在的な故障を予測・防止する能力を備えるには、このスキルが求められます。</p> <h3 id="2-計算機科学の学位">2. 計算機科学の学位</h3> <p>計算機科学の学位は必須ではありませんが、コーディング経験を通じて同等の知識を習得する必要があります。</p> <h3 id="3-モノリス分散システムへの理解">3. モノリス、分散システムへの理解</h3> <p>OSやネットワークの仕組みを理解することは、大規模でスケーラブルなシステムの構築に不可欠です。また、近年ではマイクロサービスやマルチリージョン対応などの分散システムを扱うケースが増えています。</p> <h3 id="4-統計とデータの可視化">4. 統計とデータの可視化</h3> <p>SLI(Service Level Indicator)やSLO(Service Level Objective)で使用されるパーセンタイルの理解には統計学の知識が必要です。輪読会では<a href="https://www.ohmsha.co.jp/book/9784274065705/">マンガでわかる統計学 (Ohmsha)</a>という書籍が推薦されていました。</p> <p>その他、ストーリーテリング、NALSD(非抽象的な大規模システム設計)、レジリエンス工学、性能工学、AI/MLの知識も重要とされています。</p> <h2 id="肩書きだけの変更はNG">肩書きだけの変更はNG</h2> <p>本書では、学生やSWEがSREに転向する方法が述べられていますが、システム管理者やDevOpsメンバー全員の肩書きを単に「SRE」に変更することへの警告も含まれています。</p> <p>文化的・戦略的・組織的な変革を伴わない肩書きの変更では、SREの本質的なメリットを享受できません</p> <h2 id="コラボレーションモード">コラボレーションモード</h2> <p>SREは「あくなき共同作業」によって成り立つと本書では強調されています。</p> <p>具体例として、SLI/SLOの策定や実施が挙げられます。また、監視業務を通じて顧客の声に耳を傾け、顧客との共同作業も実現しています。</p> <p>弊社では隔週で「定点観測会」を開催し、BASEのコア機能を洗い出し、SLI/SLOの見直しを行っています。</p> <h2 id="トイルとの関係を築く">トイルとの関係を築く</h2> <p>SREは、「SREの文化を醸成する」で触れたトイルに継続的に向き合う必要があります。本書では、その理由として以下の3つを挙げています。</p> <h3 id="1-美学">1. 美学</h3> <p>トイルは非効率で美しさを欠き、最適化の障害となります。</p> <h3 id="2-お金">2. お金</h3> <p>高度なエンジニアをトイルに費やすのではなく、価値を生む仕事に集中させることで、組織のコスト削減に繋がります。</p> <h3 id="3-時間の使い方仕事の満足度">3. 時間の使い方/仕事の満足度</h3> <p>エンジニアはトイルではなく開発業務に時間を使いたいと考えます。過剰なトイルは生産性と満足度を低下させます。</p> <p>弊社では毎週、有志メンバーによるトリアージ会を開催しています。この会では、SentryやNewRelicのアラートを確認し、解決すべきIssueをタスクとして起票しています。 また、OKRを活用し、目標を達成するためのトイル解消に取り組んでいます。<br> ※ 参考: OKRを設定する(<a href="https://rework.withgoogle.com/jp/guides/set-goals-with-okrs">https://rework.withgoogle.com/jp/guides/set-goals-with-okrs</a>)</p> <h2 id="失敗から学ぶ">失敗から学ぶ</h2> <p>本書では、失敗から学ぶ方法として、インシデント後のレビューが重要であるとされています。</p> <p>インシデント後のレビューでは、単なる文書や報告書、アクションリストの作成に留まらず、以下の点を重視することが求められます。</p> <h3 id="時系列での詳細な記録">時系列での詳細な記録</h3> <p>インシデントの前後で何が起きたのかを明確に記載します。</p> <h3 id="プロセスの記述">プロセスの記述</h3> <p>どのような資料を参照したのか、解決までのプロセスを詳細に説明し、単なる事象の振り返りにとどまらず、将来の予防策や信頼性向上のための具体的な知見を得られます。</p> <p>また、インシデント後のレビューを行う際には、以下の行動を避けることが重要です。</p> <h3 id="犯人探し">犯人探し</h3> <p>問題の原因を特定の人物に帰結させることは、生産的な学びや改善にはつながりません。</p> <h3 id="ヒューマンエラーへの責任転嫁">ヒューマンエラーへの責任転嫁</h3> <p>人間のミスに焦点を当てるだけでは、システム全体の信頼性向上を妨げます。</p> <h3 id="成功点の無視">成功点の無視</h3> <p>問題解決においてうまく機能した点も学びの一部であり、見落とさないことが重要です。</p> <p>インシデント後のレビューは、失敗からの学びをシステムの改善やプロセスの洗練に結びつけるための重要な手段です。これを適切に活用することで、組織全体の信頼性を向上させることができます。</p> <h2 id="なぜなぜ分析はアンチパターン">なぜなぜ分析はアンチパターン</h2> <p>「なぜなぜ分析」は、トヨタグループの創始者である豊田佐吉が考案した手法です。この手法では、事象に対して「なぜ」を繰り返し問い続けることで、根本原因を突き詰めていきます。一般的に、5回「なぜ」を繰り返すと根本的な原因に到達できるとされています。</p> <p>本書では、「なぜなぜ分析」は特定の事象を深掘りして原因を発見するのには適しているものの、インシデントを理解し、そこから学びを得るためには不十分であると指摘されています。その理由は以下の通りです。</p> <ul> <li>重要な情報を見逃す可能性が高い</li> <li>システム全体の理解を阻害し、部分的な要因に偏りがちになる</li> </ul> <p>そのため、「なぜなぜ分析」はインシデント分析においてはアンチパターンとされています。</p> <p>「なぜ」を繰り返す前に、まずは「何が起こったのか」を詳細に確認し、全体像を把握することが重要です。インシデントのプロセスや影響を全て洗い出すことで、包括的な学びと改善につながります。</p> <h1 id="第3部-組織がSREをはじめるには">第3部 組織がSREをはじめるには</h1> <p>この部では、組織がSREの導入に成功するための要因を探っています。</p> <h2 id="Dickersonの信頼性の階層構造">Dickersonの信頼性の階層構造</h2> <p>既存の組織がSREを開始するためのわかりやすいロードマップとして、Dickersonの信頼性の階層構造があります。</p> <p>これは、元Google社員のMikey Dickersonが、マズローの欲求階段説を引用したものです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/toshi-oliver/20250123/20250123150856.png" width="1007" height="942" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>※引用元: <a href="https://www.oreilly.co.jp/books/9784814400904/">O'Reilly Japan SREをはじめよう p.198</a></p> <p>マズローの階層構造と同様に、階層の一番下からはじめて、下の階層が強固になった時点で初めて上の階層に進みます。</p> <p>1段目の監視/オブザーバビリティに関して、監視ツールやオブザーバビリティプラットフォームを導入している組織がほとんどだとは思いますが、意外とSLI/SLOまでしっかり実践している組織は少ないかもしれません。</p> <h2 id="SREを組織に組み込む">SREを組織に組み込む</h2> <p>本書では、SREを0からスケールアップする(本書ではSRE0と呼ぶ)ために必要なものは、建築工学や土木工学など資格を持った人がいないとはじめられないものではなく、サービスやシステムに対する好奇心と、SLI/SLOを始めるための機会であると述べています。</p> <p>また、SREが既に組織に統合されているモデルとして、以下の3種類を定義しています。</p> <h3 id="1-中央集権型パートナー型モデル">1. 中央集権型/パートナー型モデル</h3> <p>Googleが最初に導入し普及させたもので、独立した組織として、採用プロセスや、人員、ジョブラダーを持ちます。例えばGoogleでは、GoogleマップのSREチーム、GmailのSREチーム、広告のSREチームが存在します。</p> <h3 id="2-分散型埋め込み型モデル">2. 分散型/埋め込み型モデル</h3> <p>Metaで導入されているモデルで、SREが開発チームに参加します。詳細は、<a href="https://www.oreilly.co.jp/books/9784873119618/">SREの探求</a>の第13章に記載されています。</p> <h3 id="3-ハイブリット型モデル">3. ハイブリット型モデル</h3> <p>上記2つのモデルを混ぜて導入したもので、中央集権的な組織で働くSREと、個々の事業部門で個別に雇用されているSREがいます。</p> <p>弊社が提供するサービスには、ECストアフロントを提供する「BASE」のほか、ID決済機能とショッピングアプリ機能を提供する「PayID」、金融サービスを提供する「BASE BANK」などがあります。(その他のサービスについてはここでは割愛します)</p> <p>これらを上記の3種類のモデルに当てはめると、「BASE」は中央集権型/パートナー型モデルに、「PayID」と「BASE BANK」は分散型/埋め込み型モデルに該当すると考えられます。</p> <p>このことから、弊社全体としてはハイブリッド型モデルを採用していると言えるでしょう。</p> <h2 id="SRE組織の進化段階">SRE組織の進化段階</h2> <p>SREチームの進化に関する概念的な枠組みとして、本書では、SREcon Asia 2018で元LinkedInのBenjamin Purgason氏が行った講演内容を引用しています。この進化段階は5つのステージに分かれていますが、必ずしも順序通りに進む必要はなく、ステージを飛ばして進化することも可能です。</p> <h3 id="段階1-消防士">段階1: 消防士</h3> <p>多くのSREチームがこのステージからスタートします。主な役割は障害対応などの「火消し」ですが、重要なのは火災と火災の間に何を行うかです。例えば、この時間を活用して、Dickersonの信頼性の階層構造でいう最初の2つの階層(監視/オブザーバビリティとインシデントレスポンス)の構築や、トイル(繰り返し作業)を撲滅するための自動化(本書では「自動消火装置」と表現)に取り組むことが推奨されています。</p> <h3 id="段階2-ゲートキーパー門番">段階2: ゲートキーパー(門番)</h3> <p>この段階では、SREが「ゲートキーパー」の役割を果たし、システムに関するすべての決定がSREを通過しなければならない状態になります。しかし、ゲートキーパー的な振る舞いは、他の開発者や組織内のメンバーに不快感を与える可能性があります。本書では具体例として、空港の税関職員をイメージした説明がなされています。</p> <h3 id="段階3-提唱者">段階3: 提唱者</h3> <p>この段階では、SREと他のメンバーの関係がより協力的になります。SREは、設計やアーキテクチャの議論など、ソフトウェアライフサイクルの初期段階から積極的に関与します。これにより、全員が協力して本番環境を構築し、信頼性を高めることを目指します。</p> <h3 id="段階4-パートナー">段階4: パートナー</h3> <p>段階3の発展形であり、SREとSWEがパートナーとして対等に協力する状態です。具体的には、計画やロードマップの作成を共同で行い、チーム間の連携がより強化されます。</p> <h3 id="段階5-エンジニア">段階5: エンジニア</h3> <p>この最終段階では、SREとその他のエンジニアの役割の境界線が曖昧になります。全員がシステムのライフサイクル全体に関与し、信頼性向上を目的とした活動に取り組みます。SREの活動がチーム全体に自然に組み込まれ、信頼性が組織全体の文化として根付いた状態です。</p> <h1 id="今後の展望">今後の展望</h1> <p>本記事で取り上げた「SREをはじめよう」の内容や輪読会での議論を通じて、SRE文化の醸成や実践への理解が深まりました。今後、弊社では以下のような取り組みが可能ではないかと、輪読会で議論しました。</p> <h3 id="1トイル削減を祝う文化の醸成">1.トイル削減を祝う文化の醸成</h3> <p>トリアージ会やOKRを活用したトイル削減活動を継続し、削減したトイルの成果を社内で共有し、モチベーションを高める文化を醸成します。</p> <h3 id="2-知識共有の強化">2. 知識共有の強化</h3> <p>外部イベントやカンファレンスへの参加、登壇を行い、自分なりのSREの定義を語れるようにします。</p> <h3 id="3-失敗からの学びを最大化">3. 失敗からの学びを最大化</h3> <p>ポストモーテム会を定期的に開催し、インシデント後の学びを組織全体に共有します</p> <h1 id="おわりに">おわりに</h1> <p>弊社では、SREの方だけではなく、サイトリライアビリティエンジニアリングに興味を持たれているSWEの方も積極採用しています。興味を持っていただいたら、ぜひ下記からご応募ください!</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fbinc.jp%2Fjobs" title="採用情報 | BASE, Inc." class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://binc.jp/jobs">binc.jp</a></cite></p> </div> <footer class="entry-footer"> <div class="entry-tags-wrapper"> <div class="entry-tags"> <span class="entry-tag"> <a href="https://d.hatena.ne.jp/keyword/SRE" class="entry-tag-link"> <span class="entry-tag-icon">#</span><span class="entry-tag-label">SRE</span> </a> </span> <span class="entry-tag"> <a href="https://d.hatena.ne.jp/keyword/SRE%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86" class="entry-tag-link"> <span class="entry-tag-icon">#</span><span class="entry-tag-label">SREをはじめよう</span> </a> </span> </div> </div> <p class="entry-footer-section track-inview-by-gtm" data-gtm-track-json="{&quot;area&quot;: &quot;finish_reading&quot;}"> <span class="author vcard"><span class="fn" data-load-nickname="1" data-user-name="toshi-oliver" >toshi-oliver</span></span> <span class="entry-footer-time"><a href="https://devblog.thebase.in/entry/2025/01/23/180000"><time data-relative datetime="2025-01-23T09:00:00Z" title="2025-01-23T09:00:00Z" class="updated">2025-01-23 18:00</time></a></span> </p> <div class="hatena-star-container" data-hatena-star-container data-hatena-star-url="https://devblog.thebase.in/entry/2025/01/23/180000" data-hatena-star-title="「SREをはじめよう」の輪読会を実施しました!" data-hatena-star-variant="profile-icon" data-hatena-star-profile-url-template="https://blog.hatena.ne.jp/{username}/" ></div> <div class="social-buttons"> <div class="social-button-item"> <a href="https://b.hatena.ne.jp/entry/s/devblog.thebase.in/entry/2025/01/23/180000" class="hatena-bookmark-button" data-hatena-bookmark-url="https://devblog.thebase.in/entry/2025/01/23/180000" data-hatena-bookmark-layout="vertical-balloon" data-hatena-bookmark-lang="ja" title="この記事をはてなブックマークに追加"><img src="https://b.st-hatena.com/images/entry-button/button-only.gif" alt="この記事をはてなブックマークに追加" width="20" height="20" style="border: none;" /></a> </div> <div class="social-button-item"> <div class="fb-share-button" data-layout="box_count" data-href="https://devblog.thebase.in/entry/2025/01/23/180000"></div> </div> <div class="social-button-item"> <a class="entry-share-button entry-share-button-twitter test-share-button-twitter" href="https://x.com/intent/tweet?hashtags=SRE&amp;hashtags=SRE%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86&amp;text=%E3%80%8CSRE%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86%E3%80%8D%E3%81%AE%E8%BC%AA%E8%AA%AD%E4%BC%9A%E3%82%92%E5%AE%9F%E6%96%BD%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F!+-+BASE%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%83%81%E3%83%BC%E3%83%A0%E3%83%96%E3%83%AD%E3%82%B0&amp;url=https%3A%2F%2Fdevblog.thebase.in%2Fentry%2F2025%2F01%2F23%2F180000" title="X(Twitter)で投稿する" ></a> </div> </div> <div class="customized-footer"> <div class="entry-footer-html"><p><iframe src="https://blog.hatena.ne.jp/basedevteam/base-developer.hatenablog.com/subscribe/iframe" allowtransparency="true" frameborder="0" scrolling="no" width="150" height="28"></iframe></p> </div> </div> </footer> </div> </article> <!-- rakuten_ad_target_end --> <!-- google_ad_section_end --> <div class="pager pager-permalink permalink"> <span class="pager-prev"> <a href="https://devblog.thebase.in/entry/2025/02/14/190000" rel="prev"> <span class="pager-arrow">&laquo; </span> BASE機械学習チームでより良い開発環境実… </a> </span> <span class="pager-next"> <a href="https://devblog.thebase.in/entry/2025/01/21/080000" rel="next"> 数値と論理 <span class="pager-arrow"> &raquo;</span> </a> </span> </div> </div> </div> <aside id="box1"> <div id="box1-inner"> </div> </aside> </div><!-- #wrapper --> <aside id="box2"> <div id="box2-inner"> <div class="hatena-module hatena-module-html"> <div class="hatena-module-body"> <div class="sw-recruitment-area"> <a href='https://speakerdeck.com/base/for-engineers' target="_blank"> <img src="https://cdn-ak.f.st-hatena.com/images/fotolife/y/yoshiokachang/20211125/20211125184229.jpg" class="corporate sw-sidenav"> </a> <a href='https://note.com/base_designteam/' target="_blank"> <img src="https://cdn-ak.f.st-hatena.com/images/fotolife/a/applepine1125/20230117/20230117092925.png" class="note sw-sidenav"> </a> <a href="https://www.youtube.com/channel/UCPHQqCdsk1ZeU1tCkp-gLdw" target="_blank"> <img src="https://cdn-ak.f.st-hatena.com/images/fotolife/y/yoshiokachang/20211125/20211125184259.jpg" class="youtube sw-sidenav"> </a> <a href="https://base.connpass.com/event/" target="_blank"> <img src="https://cdn-ak.f.st-hatena.com/images/fotolife/a/applepine1125/20221208/20221208144956.png" class="connpass sw-sidenav"> </a> </div> </div> </div> <div class="hatena-module hatena-module-search-box"> <div class="hatena-module-title"> 検索 </div> <div class="hatena-module-body"> <form class="search-form" role="search" action="https://devblog.thebase.in/search" method="get"> <input type="text" name="q" class="search-module-input" value="" placeholder="記事を検索" required> <input type="submit" value="検索" class="search-module-button" /> </form> </div> </div> <div class="hatena-module hatena-module-recent-entries "> <div class="hatena-module-title"> <a href="https://devblog.thebase.in/archive"> 最近の投稿 </a> </div> <div class="hatena-module-body"> <ul class="recent-entries hatena-urllist urllist-with-thumbnails"> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a href="https://devblog.thebase.in/entry/2025/02/21/102320" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">Developers Summit 2025に参加・登壇しました</a> <div class="urllist-entry-body recent-entries-entry-body">はじめに BASE の Product Dev Division で Advanced Engineer のプログラミングをするパンダ(@Panda_Pro…</div> </div> </li> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a class="urllist-image-link recent-entries-image-link" href="https://devblog.thebase.in/entry/2025/02/17/180000"> <img alt="PHPカンファレンス名古屋 2025にBASE BANKのエンジニアが登壇します &amp; スポンサーとして協賛します" src="https://cdn.image.st-hatena.com/image/square/1b1568d7b8bd9237084752dd444cb4ab9fea5fe8/backend=imagemagick;height=128;version=1;width=240/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fh%2Fhiroki_saito%2F20250217%2F20250217132454.png" class="urllist-image recent-entries-image" title="PHPカンファレンス名古屋 2025にBASE BANKのエンジニアが登壇します &amp; スポンサーとして協賛します" width="240" height="128" loading="lazy"> </a> <a href="https://devblog.thebase.in/entry/2025/02/17/180000" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">PHPカンファレンス名古屋 2025にBASE BANKのエンジニアが登壇します &amp; スポンサーとして協賛します</a> <div class="urllist-entry-body recent-entries-entry-body">はじめに BASE BANK Department で開発責任者をしている斉藤です。 2025/2/22(土)に開催される PHPカンフ…</div> </div> </li> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a class="urllist-image-link recent-entries-image-link" href="https://devblog.thebase.in/entry/2025/02/14/190000"> <img alt="BASE機械学習チームでより良い開発環境実現のために取り組んだこと" src="https://cdn.image.st-hatena.com/image/square/7226c2204c39f4a6b06ad77c41e91b36bea7e231/backend=imagemagick;height=128;version=1;width=240/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fdefault_entry_og_image%2F153078222%2F1614340287711564" class="urllist-image recent-entries-image" title="BASE機械学習チームでより良い開発環境実現のために取り組んだこと" width="240" height="128" loading="lazy"> </a> <a href="https://devblog.thebase.in/entry/2025/02/14/190000" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">BASE機械学習チームでより良い開発環境実現のために取り組んだこと</a> <div class="urllist-entry-body recent-entries-entry-body">BASEの機械学習チームでの開発環境の改善の取り組みをご紹介します</div> </div> </li> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a class="urllist-image-link recent-entries-image-link" href="https://devblog.thebase.in/entry/2025/01/23/180000"> <img alt="「SREをはじめよう」の輪読会を実施しました!" src="https://cdn.image.st-hatena.com/image/square/7226c2204c39f4a6b06ad77c41e91b36bea7e231/backend=imagemagick;height=128;version=1;width=240/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fdefault_entry_og_image%2F153078222%2F1614340287711564" class="urllist-image recent-entries-image" title="「SREをはじめよう」の輪読会を実施しました!" width="240" height="128" loading="lazy"> </a> <a href="https://devblog.thebase.in/entry/2025/01/23/180000" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">「SREをはじめよう」の輪読会を実施しました!</a> <div class="urllist-entry-body recent-entries-entry-body">はじめに BASE Dept. Product Devにてバックエンドエンジニアをしているオリバです。 2024年末、弊社のソ…</div> </div> </li> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a href="https://devblog.thebase.in/entry/2025/01/21/080000" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">数値と論理</a> <div class="urllist-entry-body recent-entries-entry-body">はじめに こんにちは!BASE株式会社でPay IDチーム プロダクトマネージャーをしているbunです。 Pay IDは…</div> </div> </li> </ul> </div> </div> <div class="hatena-module hatena-module-category"> <div class="hatena-module-title"> カテゴリー </div> <div class="hatena-module-body"> <ul class="hatena-urllist"> <li> <a href="https://devblog.thebase.in/archive/category/Web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E9%96%8B%E7%99%BA" class="category-Webサービス開発"> Webサービス開発 (47) </a> </li> <li> <a href="https://devblog.thebase.in/archive/category/%E3%83%81%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA" class="category-チーム開発"> チーム開発 (32) </a> </li> <li> <a href="https://devblog.thebase.in/archive/category/%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89" class="category-フロントエンド"> フロントエンド (34) </a> </li> <li> <a href="https://devblog.thebase.in/archive/category/Go" class="category-Go"> Go (19) </a> </li> <li> <a href="https://devblog.thebase.in/archive/category/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92" class="category-機械学習"> 機械学習 (21) </a> </li> <li> <a href="https://devblog.thebase.in/archive/category/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3" class="category-デザイン"> デザイン (35) </a> </li> <li> <a href="https://devblog.thebase.in/archive/category/%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%83%BB%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E7%B5%84%E7%B9%94" class="category-マネジメント・エンジニアリング組織"> マネジメント・エンジニアリング組織 (25) </a> </li> <li> <a href="https://devblog.thebase.in/archive/category/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%83%BB%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%BB%E7%99%BB%E5%A3%87" class="category-イベントレポート・スポンサー・登壇"> イベントレポート・スポンサー・登壇 (95) </a> </li> </ul> </div> </div> <div class="hatena-module hatena-module-archive" data-archive-type="default" data-archive-url="https://devblog.thebase.in/archive"> <div class="hatena-module-title"> <a href="https://devblog.thebase.in/archive">アーカイブ</a> </div> <div class="hatena-module-body"> <ul class="hatena-urllist"> <li class="archive-module-year archive-module-year-hidden" data-year="2025"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://devblog.thebase.in/archive/2025" class="archive-module-year-title archive-module-year-2025"> 2025 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2025/02" class="archive-module-month-title archive-module-month-2025-2"> 2025 / 2 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2025/01" class="archive-module-month-title archive-module-month-2025-1"> 2025 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2024"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://devblog.thebase.in/archive/2024" class="archive-module-year-title archive-module-year-2024"> 2024 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2024/12" class="archive-module-month-title archive-module-month-2024-12"> 2024 / 12 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2024/11" class="archive-module-month-title archive-module-month-2024-11"> 2024 / 11 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2024/10" class="archive-module-month-title archive-module-month-2024-10"> 2024 / 10 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2024/08" class="archive-module-month-title archive-module-month-2024-8"> 2024 / 8 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2024/07" class="archive-module-month-title archive-module-month-2024-7"> 2024 / 7 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2024/06" class="archive-module-month-title archive-module-month-2024-6"> 2024 / 6 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2024/05" class="archive-module-month-title archive-module-month-2024-5"> 2024 / 5 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2024/04" class="archive-module-month-title archive-module-month-2024-4"> 2024 / 4 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2024/03" class="archive-module-month-title archive-module-month-2024-3"> 2024 / 3 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2024/02" class="archive-module-month-title archive-module-month-2024-2"> 2024 / 2 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2023"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://devblog.thebase.in/archive/2023" class="archive-module-year-title archive-module-year-2023"> 2023 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2023/12" class="archive-module-month-title archive-module-month-2023-12"> 2023 / 12 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2023/11" class="archive-module-month-title archive-module-month-2023-11"> 2023 / 11 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2023/10" class="archive-module-month-title archive-module-month-2023-10"> 2023 / 10 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2023/09" class="archive-module-month-title archive-module-month-2023-9"> 2023 / 9 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2023/08" class="archive-module-month-title archive-module-month-2023-8"> 2023 / 8 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2023/06" class="archive-module-month-title archive-module-month-2023-6"> 2023 / 6 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2023/05" class="archive-module-month-title archive-module-month-2023-5"> 2023 / 5 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2023/04" class="archive-module-month-title archive-module-month-2023-4"> 2023 / 4 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2023/03" class="archive-module-month-title archive-module-month-2023-3"> 2023 / 3 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2023/01" class="archive-module-month-title archive-module-month-2023-1"> 2023 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2022"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://devblog.thebase.in/archive/2022" class="archive-module-year-title archive-module-year-2022"> 2022 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2022/12" class="archive-module-month-title archive-module-month-2022-12"> 2022 / 12 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2022/11" class="archive-module-month-title archive-module-month-2022-11"> 2022 / 11 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2022/10" class="archive-module-month-title archive-module-month-2022-10"> 2022 / 10 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2022/09" class="archive-module-month-title archive-module-month-2022-9"> 2022 / 9 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2022/08" class="archive-module-month-title archive-module-month-2022-8"> 2022 / 8 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2022/07" class="archive-module-month-title archive-module-month-2022-7"> 2022 / 7 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2022/06" class="archive-module-month-title archive-module-month-2022-6"> 2022 / 6 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2022/05" class="archive-module-month-title archive-module-month-2022-5"> 2022 / 5 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2022/04" class="archive-module-month-title archive-module-month-2022-4"> 2022 / 4 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2022/03" class="archive-module-month-title archive-module-month-2022-3"> 2022 / 3 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2022/02" class="archive-module-month-title archive-module-month-2022-2"> 2022 / 2 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2021"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://devblog.thebase.in/archive/2021" class="archive-module-year-title archive-module-year-2021"> 2021 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2021/12" class="archive-module-month-title archive-module-month-2021-12"> 2021 / 12 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2021/11" class="archive-module-month-title archive-module-month-2021-11"> 2021 / 11 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2021/10" class="archive-module-month-title archive-module-month-2021-10"> 2021 / 10 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2021/09" class="archive-module-month-title archive-module-month-2021-9"> 2021 / 9 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2021/08" class="archive-module-month-title archive-module-month-2021-8"> 2021 / 8 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2021/07" class="archive-module-month-title archive-module-month-2021-7"> 2021 / 7 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2021/06" class="archive-module-month-title archive-module-month-2021-6"> 2021 / 6 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2021/05" class="archive-module-month-title archive-module-month-2021-5"> 2021 / 5 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2021/04" class="archive-module-month-title archive-module-month-2021-4"> 2021 / 4 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2021/03" class="archive-module-month-title archive-module-month-2021-3"> 2021 / 3 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2021/02" class="archive-module-month-title archive-module-month-2021-2"> 2021 / 2 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2021/01" class="archive-module-month-title archive-module-month-2021-1"> 2021 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2020"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://devblog.thebase.in/archive/2020" class="archive-module-year-title archive-module-year-2020"> 2020 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2020/12" class="archive-module-month-title archive-module-month-2020-12"> 2020 / 12 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2020/11" class="archive-module-month-title archive-module-month-2020-11"> 2020 / 11 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2020/10" class="archive-module-month-title archive-module-month-2020-10"> 2020 / 10 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2020/09" class="archive-module-month-title archive-module-month-2020-9"> 2020 / 9 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2020/08" class="archive-module-month-title archive-module-month-2020-8"> 2020 / 8 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2020/07" class="archive-module-month-title archive-module-month-2020-7"> 2020 / 7 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2020/06" class="archive-module-month-title archive-module-month-2020-6"> 2020 / 6 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2020/05" class="archive-module-month-title archive-module-month-2020-5"> 2020 / 5 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2020/02" class="archive-module-month-title archive-module-month-2020-2"> 2020 / 2 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2020/01" class="archive-module-month-title archive-module-month-2020-1"> 2020 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2019"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://devblog.thebase.in/archive/2019" class="archive-module-year-title archive-module-year-2019"> 2019 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2019/12" class="archive-module-month-title archive-module-month-2019-12"> 2019 / 12 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2019/11" class="archive-module-month-title archive-module-month-2019-11"> 2019 / 11 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2019/10" class="archive-module-month-title archive-module-month-2019-10"> 2019 / 10 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2019/09" class="archive-module-month-title archive-module-month-2019-9"> 2019 / 9 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2019/08" class="archive-module-month-title archive-module-month-2019-8"> 2019 / 8 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2019/07" class="archive-module-month-title archive-module-month-2019-7"> 2019 / 7 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2019/06" class="archive-module-month-title archive-module-month-2019-6"> 2019 / 6 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2019/05" class="archive-module-month-title archive-module-month-2019-5"> 2019 / 5 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2019/04" class="archive-module-month-title archive-module-month-2019-4"> 2019 / 4 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2019/03" class="archive-module-month-title archive-module-month-2019-3"> 2019 / 3 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2019/02" class="archive-module-month-title archive-module-month-2019-2"> 2019 / 2 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2019/01" class="archive-module-month-title archive-module-month-2019-1"> 2019 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2018"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://devblog.thebase.in/archive/2018" class="archive-module-year-title archive-module-year-2018"> 2018 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2018/12" class="archive-module-month-title archive-module-month-2018-12"> 2018 / 12 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2018/11" class="archive-module-month-title archive-module-month-2018-11"> 2018 / 11 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2018/10" class="archive-module-month-title archive-module-month-2018-10"> 2018 / 10 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2018/09" class="archive-module-month-title archive-module-month-2018-9"> 2018 / 9 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2018/08" class="archive-module-month-title archive-module-month-2018-8"> 2018 / 8 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2018/07" class="archive-module-month-title archive-module-month-2018-7"> 2018 / 7 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2018/06" class="archive-module-month-title archive-module-month-2018-6"> 2018 / 6 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2018/05" class="archive-module-month-title archive-module-month-2018-5"> 2018 / 5 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2018/04" class="archive-module-month-title archive-module-month-2018-4"> 2018 / 4 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2018/03" class="archive-module-month-title archive-module-month-2018-3"> 2018 / 3 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2018/02" class="archive-module-month-title archive-module-month-2018-2"> 2018 / 2 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2018/01" class="archive-module-month-title archive-module-month-2018-1"> 2018 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2017"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://devblog.thebase.in/archive/2017" class="archive-module-year-title archive-module-year-2017"> 2017 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2017/12" class="archive-module-month-title archive-module-month-2017-12"> 2017 / 12 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2017/06" class="archive-module-month-title archive-module-month-2017-6"> 2017 / 6 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2017/04" class="archive-module-month-title archive-module-month-2017-4"> 2017 / 4 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2017/03" class="archive-module-month-title archive-module-month-2017-3"> 2017 / 3 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2017/01" class="archive-module-month-title archive-module-month-2017-1"> 2017 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2016"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://devblog.thebase.in/archive/2016" class="archive-module-year-title archive-module-year-2016"> 2016 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2016/10" class="archive-module-month-title archive-module-month-2016-10"> 2016 / 10 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2016/06" class="archive-module-month-title archive-module-month-2016-6"> 2016 / 6 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2016/05" class="archive-module-month-title archive-module-month-2016-5"> 2016 / 5 </a> </li> <li class="archive-module-month"> <a href="https://devblog.thebase.in/archive/2016/04" class="archive-module-month-title archive-module-month-2016-4"> 2016 / 4 </a> </li> </ul> </li> </ul> </div> </div> </div> </aside> </div> </div> <div id="bottom-editarea"> <script type="text/javascript"> // 記事上の警告用divタグを取得 const warning = document.getElementById("oldArticleWarning"); // 記事の最終編集日時を取得(なければ投稿日時) const timeElement = document.querySelector(".entry-date > span > time") || document.querySelector(".entry-date > a > time"); const getYearsElapsed = function(dateString) { const today = new Date(); const startDate = new Date(dateString); let yearsElapsed = today.getFullYear() - startDate.getFullYear(); console.log(yearsElapsed) console.log(startDate) // まだ1年経過していない場合は減算 if ( today.getMonth() < startDate.getMonth() || (today.getMonth() === startDate.getMonth() && today.getDate() < startDate.getDate()) ) { yearsElapsed--; } return yearsElapsed; } if (timeElement) { const elapsedYears = getYearsElapsed(timeElement.dateTime) // 1年以上経過していたら警告を表示 if (elapsedYears > 0) { warning.style.display = "block"; warning.innerHTML = ` <span>この記事の最終編集日時は${elapsedYears}年以上前です。</span><br> 古い情報が含まれている可能性があるため、予めご了承ください。 `; } } </script> </div> </div> </div> <script async src="https://s.hatena.ne.jp/js/widget/star.js"></script> <script> if (typeof window.Hatena === 'undefined') { window.Hatena = {}; } if (!Hatena.hasOwnProperty('Star')) { Hatena.Star = { VERSION: 2, }; } </script> <div id="fb-root"></div> <script>(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&appId=719729204785177&version=v17.0"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));</script> <div class="quote-box"> <div class="tooltip-quote tooltip-quote-stock"> <i class="blogicon-quote" title="引用をストック"></i> </div> <div class="tooltip-quote tooltip-quote-tweet js-tooltip-quote-tweet"> <a class="js-tweet-quote" target="_blank" data-track-name="quote-tweet" data-track-once> <img src="https://cdn.blog.st-hatena.com/images/admin/quote/quote-x-icon.svg?version=3302d0c519de548bcb3552ea0bf509" title="引用して投稿する" > </a> </div> </div> <div class="quote-stock-panel" id="quote-stock-message-box" style="position: absolute; z-index: 3000"> <div class="message-box" id="quote-stock-succeeded-message" style="display: none"> <p>引用をストックしました</p> <button class="btn btn-primary" id="quote-stock-show-editor-button" data-track-name="curation-quote-edit-button">ストック一覧を見る</button> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="message-box" id="quote-login-required-message" style="display: none"> <p>引用するにはまずログインしてください</p> <button class="btn btn-primary" id="quote-login-button">ログイン</button> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="error-box" id="quote-stock-failed-message" style="display: none"> <p>引用をストックできませんでした。再度お試しください</p> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="error-box" id="unstockable-quote-message-box" style="display: none; position: absolute; z-index: 3000;"> <p>限定公開記事のため引用できません。</p> </div> </div> <script type="x-underscore-template" id="js-requote-button-template"> <div class="requote-button js-requote-button"> <button class="requote-button-btn tipsy-top" title="引用する"><i class="blogicon-quote"></i></button> </div> </script> <div id="hidden-subscribe-button" style="display: none;"> <div class="hatena-follow-button-box btn-subscribe js-hatena-follow-button-box" > <a href="#" class="hatena-follow-button js-hatena-follow-button"> <span class="subscribing"> <span class="foreground">読者です</span> <span class="background">読者をやめる</span> </span> <span class="unsubscribing" data-track-name="profile-widget-subscribe-button" data-track-once> <span class="foreground">読者になる</span> <span class="background">読者になる</span> </span> </a> <div class="subscription-count-box js-subscription-count-box"> <i></i> <u></u> <span class="subscription-count js-subscription-count"> </span> </div> </div> </div> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> <script src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script> <script type="text/javascript" src="https://cdn.blog.st-hatena.com/js/external/jquery.min.js?v=1.12.4&amp;version=3302d0c519de548bcb3552ea0bf509"></script> <script src="https://cdn.blog.st-hatena.com/js/texts-ja.js?version=3302d0c519de548bcb3552ea0bf509"></script> <script id="vendors-js" data-env="production" src="https://cdn.blog.st-hatena.com/js/vendors.js?version=3302d0c519de548bcb3552ea0bf509" crossorigin="anonymous"></script> <script id="hatenablog-js" data-env="production" src="https://cdn.blog.st-hatena.com/js/hatenablog.js?version=3302d0c519de548bcb3552ea0bf509" crossorigin="anonymous" data-page-id="entry"></script> <script>Hatena.Diary.GlobalHeader.init()</script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10