CINXE.COM
バグってなんですか?美味しいですか?食べてもお腹が痛くないですか? | Basicinc Enjoy Hacking!
<!DOCTYPE html><html lang="ja" data-scope-path="layouts/application"><head prefix="og: http://ogp.me/ns# article: http://ogp.me/ns/article#"><link crossorigin="" href="https://www.google-analytics.com/analytics.js" rel="preconnect" /><link rel="preload" href="/fonts/noto-sans-jp-v24-japanese-regular.woff2" as="font" type="font/woff2" crossorigin="anonymous"><link rel="preload" href="/fonts/noto-sans-jp-v24-japanese-700.woff2" as="font" type="font/woff2" crossorigin="anonymous"><!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-25666851-3"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-25666851-3'); </script> <link rel="stylesheet" media="all" href="/assets/ress-d1ba3a251927ab1f2bcc841c9a810109355bcb4260a522a0f76452fdc2fe6095.css" /><link rel="stylesheet" media="all" href="/assets/scopes/layouts/application-dda4ec688c139c8f29c39a2a795bcf4af04c4326643549a37f5d8843fffaebab.css" /><link rel="stylesheet" media="all" href="/assets/scopes/articles/show-37905516c06229c8fde10714e660fc48bc7b6ce7881755707db8b0327ceb5bf1.css" /><link rel="stylesheet" media="all" href="/assets/scopes/partials/_viewer-3a78a10250bb498047a06b71271b62ea949e304d25b9781c4450cf998aa2640c.css" /><link rel="stylesheet" media="all" href="/assets/scopes/layouts/_header-db87b54171cc020758ab7d1494677f8f6c2e9c93b453e896af82e4814eaacc7c.css" /><link rel="stylesheet" media="all" href="/assets/scopes/layouts/_breadcrumbs-744a099ab0b9eb5c4bd45215617e267c7d7c404ddddce8810eead5335512e637.css" /><link rel="stylesheet" media="all" href="/assets/scopes/layouts/_footer-a06961717440c6d0183c582c7f21768011f334d368f51b614eabc87bb17b3bbf.css" /><script src="/packs/application-02365dbc4dc28919eee1.js" defer="defer"></script><link href="/icon.png" rel="icon" type="image/png" /><link href="/apple-touch-icon.png" rel="apple-touch-icon" type="image/png" /><link href="/feed" rel="alternate" title="RSS2.0" type="application/rss+xml" /><title>バグってなんですか?美味しいですか?食べてもお腹が痛くないですか? | Basicinc Enjoy Hacking!</title><meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="hBzAZGkMoyROlm7ETrTILBLRuGJp+RPyg68jpMbnbXm8zTBOmeUWFl5Knp1WBE7yZZFe0xGGfQ+n16exWi7v6g==" /><meta content="width=device-width,initial-scale=1" name="viewport" /><meta content="バグってなんですか?美味しいですか?食べてもお腹が痛くないですか? | Basicinc Enjoy Hacking!" property="og:title" /><meta content="article" property="og:type" /><meta content="2019-02-12T19:00:00+09:00" property="article:published_time" /><meta content="yuyuvn" property="article:author" /><meta content="Technology" property="article:section" /><meta content="https://tech.basicinc.jp/articles/150" property="og:url" /><meta content="https://tech.basicinc.jp/uploads/2f68c4032fa9e09f1ef7e2306dbb27c7.jpeg" property="og:image" /><meta content="image/jpeg" property="og:image:type" /><meta content="1200" property="og:image:width" /><meta content="630" property="og:image:height" /><meta content="こんにちは。ベトナムからベーシックのエンジニア@yuyuvn です。 ソフトウェアでは不具合はバグとよばれます。どんなシステムでもバグがあります。 最近、小さいサービスでもフェイスブックのような大きいサービスでもよく不具合が発生しています。これは一体、なぜでしょうか? バグ..." property="og:description" /><meta content="ja_JP" property="og:locale" /><meta content="summary_large_image" name="twitter:card" /></head><body><header data-scope-path="layouts/_header"><div class="header-contents"><a class="root-link" href="/"><svg class="site-logo"><use xlink:href="/assets/icons-5bbe775037b55281ef0bc50d30a51f69c7c3914d399c7107e37f0702d98ae8a2.svg#logo"></use></svg><div class="site-title">Enjoy Hacking!</div></a><div class="site-desc">Basicinc エンジニアブログ</div></div></header><nav data-scope-path="layouts/_breadcrumbs"><ul class="breadcrumbs" itemscope="itemscope" itemtype="https://schema.org/BreadcrumbList"><span class="pretext">% cat </span> <li itemprop="itemListElement" itemscope="itemscope" itemtype="https://schema.org/ListItem"><a itemprop="item" href="/"><span itemprop="name">~</span></a><meta itemprop="position" content="1" /></li>/<li class="current" itemprop="itemListElement" itemscope="itemscope" itemtype="https://schema.org/ListItem"><span itemprop="name">バグってなんですか?美味しいですか?食べてもお腹が痛くないですか?.md</span><meta itemprop="item" content="https://tech.basicinc.jp/articles/150" /><meta itemprop="position" content="2" /></li></ul></nav><div data-scope-path="articles/show"><article class="article"><h1 class="article-title">バグってなんですか?美味しいですか?食べてもお腹が痛くないですか?</h1><div class="article-desc"><a class="article-author" href="/authors/27"><img class="article-author-avatar" src="https://tech.basicinc.jp/uploads/dacacf65faf03116b906379d60b72934.png" /><span class="article-author-name">yuyuvn</span></a><div class="article-date-info"><time class="article-posted-date">Posted 2019-02-12</time></div></div><div class="article-body"><div data-scope-path="partials/_viewer"><p>こんにちは。ベトナム<img draggable="false" title=":flag-vn:" alt="🇻🇳" src="https://twemoji.maxcdn.com/2/svg/1f1fb-1f1f3.svg" class="emoji" loading="lazy">からベーシックのエンジニア<a href="https://github.com/yuyuvn">@yuyuvn</a> です。</p> <p>ソフトウェアでは不具合はバグとよばれます。どんなシステムでもバグがあります。<br> 最近、小さいサービスでもフェイスブックのような大きいサービスでもよく不具合が発生しています。これは一体、なぜでしょうか?</p> <p><img src="https://tech.basicinc.jp/uploads/c4dcf30f62744f3365e5f542af3dd5b4.jpeg" alt=""></p> <h1>バグの原因</h1> <p><a href="https://www.ibm.com/developerworks/community/blogs/invisiblethread/entry/design_and_test?lang=ja">2013年のIBMの記事</a>の通り、ソフトウェアはどんどん複雑になりつつあるということがわかります。現時点でもこの視点が間違いないでしょうか?ソフトウェアはどんどん多くのことができるようになり、ユーザの操作が少なくなります。使用用途が増えると、ソフトウェアの複雑さも高くなります。ソフトウェアは複雑になる程、修正が難しくなります。依存関係が増えて、複雑さも増して、結果としてデバッグが大変な作業になってしまいました。「Judge Business School of the University of Cambridge」の大学の研究によると、開発のコストの30%がバグ対応、開発時間の50%は新しい機能を実装ではなくてバグの修正です。</p> <h1>どうやってデバッグしやすくするか</h1> <p>普段のデバッグには二つのフェーズがあります。調査と修正です。調査のほうが難しく時間もかかります。そのため、Googleには「バグを隠すより見つかりやすい方がいい」と言う文化があるほどです。私もそうだとおもいます。もしテストフェーズでたくさんのバグができたら本番のプロジェクトのバグが少なくなることです。</p> <p>プログラミング言語は大きく分けて2つの種類があります。<a href="https://php-web.net/introduction/interpretor.html">コンパイラ型とインタープリタ型です</a>。コンパイラ型の場合はコンパイルするとき見つかったバグが多ければ多いほどいいです。なぜならコンパイルする時点、トレースバックとか再現させることを考える必要はないから修正するのはすごく簡単です。</p> <p>例えば以下のCのコードがあって</p> <pre lang="C"><code>void main() { int a; int b = 1; if (b == 1) { a = 1; } else { a = 2; } printf("a = %d", a); } </code></pre> <p>新しいロジックを追加する</p> <pre lang="C"><code>void main() { int a; int b = 1; if (b == 1) { a = 1; } else if (b == 2) { // 他のロジック } else { a = 2; } printf("a = %d", a); } </code></pre> <p>これはコンパイルできるがaがnullになってしまいます。これはバグが発生する可能性が高いです。</p> <p>Rustで書き直します。以下の書き方を見ましょう。</p> <pre lang="Rust"><code>fn main() { let mut a; let b = 1; if b == 1 { a = 1; } else if b == 2 { // 他のロジック } else { a = 2; } println!("a = {}", a); } </code></pre> <p>これはコンパイルしたらエラー発生します。これはすぐ確認して修正することができるため良いコードです。</p> <pre><code> | | println!("a = {}", a); | ^ use of possibly uninitialized `a` </code></pre> <p>他のケースで、例えばhoge、piyo、fugaというメソッドがあってhogeの中でpiyoが呼ばれる、piyoの中でfugaが呼ばれる。もしfugaのメソッドの中にバグがあったらhoge、piyoも正常に動作しないことでしょう。これはunitテストでカバー出来るが、もしカバー出来ない場合はruntimeで発生する時はhogeの中の時か、piyoの中時でもあります。デバッグではトレースバックが必要です。Rust言語だったらメソッドの定義をするときどんなparamの値があるか確認するコードが必要です。そうするとfugaのバグがあったら最悪でもpiyoでエラーが発生します。hogeで発生することはないです。ただ、コードはSOLID原則を必ず守らないと効果がありません。特にSOLIDのS(単一責務の原則)です。</p> <p>バグ発生率はどうしてもゼロにすることは出来ない。バグが発生した時にどうすれば良いでしょうか?</p> <p>理想的には、不具合がある箇所をソフトウェアが自動的に修正することです。ただ今の技術段階ではまだ難しいです。なので、不具合が発生した時点の情報を出来るだけ集めてレポートを担当者に送って人間で修正するというフローは悪くないです。</p> <p><img src="https://tech.basicinc.jp/uploads/26506044e07229da825a1a6e5ebf0219.png" alt="bug"></p> <p>保存しておく障害時のログ情報は多ければ多いほどいいですが、その保存した生のログファイルは人間が読むものではないです。トラブル発生時に必要な情報を自動的に判断し、まとめてレポートとして人に送ることで調査時間を節約できます。</p> <h1>まとめ</h1> <p>新しいコードを反映しなければ新しいバグは発生しませんし、ユーザ数が増えなかったらスケールは必要じゃありません。バグを恐れずに開発できたら最高です。</p> <p>エンジニアたちはバグを食べざるを得ず、逃げることなどは出来ないが、ちゃんと切って、煮て、お皿に盛れば、食べてもお腹が痛くなることはないでしょう。</p></div></div><div class="article-sns-share-buttons"><a rel="nofollow" target="_blank" class="pocket-share sns-share-button" href="http://getpocket.com/edit?title=%E3%83%90%E3%82%B0%E3%81%A3%E3%81%A6%E3%81%AA%E3%82%93%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%E7%BE%8E%E5%91%B3%E3%81%97%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%E9%A3%9F%E3%81%B9%E3%81%A6%E3%82%82%E3%81%8A%E8%85%B9%E3%81%8C%E7%97%9B%E3%81%8F%E3%81%AA%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F+by+yuyuvn+%7C+Basicinc+Enjoy+Hacking%21&url=https%3A%2F%2Ftech.basicinc.jp%2Farticles%2F150"><svg class="sns-icon pocket-icon"><use xlink:href="/assets/icons-5bbe775037b55281ef0bc50d30a51f69c7c3914d399c7107e37f0702d98ae8a2.svg#pocket"></use></svg></a><a rel="nofollow" target="_blank" class="hatena-share sns-share-button" href="http://b.hatena.ne.jp/add?mode=confirm&title=%E3%83%90%E3%82%B0%E3%81%A3%E3%81%A6%E3%81%AA%E3%82%93%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%E7%BE%8E%E5%91%B3%E3%81%97%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%E9%A3%9F%E3%81%B9%E3%81%A6%E3%82%82%E3%81%8A%E8%85%B9%E3%81%8C%E7%97%9B%E3%81%8F%E3%81%AA%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F+by+yuyuvn+%7C+Basicinc+Enjoy+Hacking%21&url=https%3A%2F%2Ftech.basicinc.jp%2Farticles%2F150"><svg class="sns-icon hatena-icon"><use xlink:href="/assets/icons-5bbe775037b55281ef0bc50d30a51f69c7c3914d399c7107e37f0702d98ae8a2.svg#hatena"></use></svg></a><a rel="nofollow" target="_blank" class="twitter-share sns-share-button" href="https://twitter.com/share?text=%E3%83%90%E3%82%B0%E3%81%A3%E3%81%A6%E3%81%AA%E3%82%93%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%E7%BE%8E%E5%91%B3%E3%81%97%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%E9%A3%9F%E3%81%B9%E3%81%A6%E3%82%82%E3%81%8A%E8%85%B9%E3%81%8C%E7%97%9B%E3%81%8F%E3%81%AA%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F+by+yuyuvn+%7C+Basicinc+Enjoy+Hacking%21&url=https%3A%2F%2Ftech.basicinc.jp%2Farticles%2F150"><svg class="sns-icon twitter-icon"><use xlink:href="/assets/icons-5bbe775037b55281ef0bc50d30a51f69c7c3914d399c7107e37f0702d98ae8a2.svg#twitter"></use></svg></a><a rel="nofollow" target="_blank" class="facebook-share sns-share-button" href="http://www.facebook.com/share.php?u=https%3A%2F%2Ftech.basicinc.jp%2Farticles%2F150"><svg class="sns-icon facebook-icon"><use xlink:href="/assets/icons-5bbe775037b55281ef0bc50d30a51f69c7c3914d399c7107e37f0702d98ae8a2.svg#facebook"></use></svg></a></div></article></div><footer data-scope-path="layouts/_footer"><div class="footer-contents"><a class="root-link" href="/"><svg class="site-logo"><use xlink:href="/assets/icons-5bbe775037b55281ef0bc50d30a51f69c7c3914d399c7107e37f0702d98ae8a2.svg#logo"></use></svg><div class="site-title">Enjoy Hacking!</div></a><ul class="link-list"><li class="link-list-item"><a class="link" href="https://basicinc.jp/" rel="noopener" target="_blank">株式会社ベーシック</a></li><li class="link-list-item"><a class="link" href="https://basicinc.jp/enjoy-hacking" rel="noopener" target="_blank">エンジニア募集</a></li><li class="link-list-item"><a class="link" href="https://qiita.com/organizations/basicinc" rel="noopener" target="_blank">Qiita</a></li><li class="link-list-item"><a class="link" href="https://www.wantedly.com/companies/basicinc/projects" rel="noopener" target="_blank">Wantedly</a></li></ul></div></footer></body></html>