CINXE.COM

「リファクタリングの時間」を確保する技術

<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta content="width=device-width, initial-scale=1" name="viewport"/><title>「リファクタリングの時間」を確保する技術</title><link rel="canonical" href="https://zenn.dev/loglass/articles/961e283e6fbe71"/><meta name="twitter:card" content="summary_large_image"/><meta property="og:url" content="https://zenn.dev/loglass/articles/961e283e6fbe71"/><meta property="og:title" content="「リファクタリングの時間」を確保する技術"/><meta property="og:image" content="https://res.cloudinary.com/zenn/image/upload/s--M9BPCqyj--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2580%258C%25E3%2583%25AA%25E3%2583%2595%25E3%2582%25A1%25E3%2582%25AF%25E3%2582%25BF%25E3%2583%25AA%25E3%2583%25B3%25E3%2582%25B0%25E3%2581%25AE%25E6%2599%2582%25E9%2596%2593%25E3%2580%258D%25E3%2582%2592%25E7%25A2%25BA%25E4%25BF%259D%25E3%2581%2599%25E3%2582%258B%25E6%258A%2580%25E8%25A1%2593%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_34:little_hands%2528%25E6%259D%25BE%25E5%25B2%25A1%2540Lo...%2Cx_220%2Cy_108/bo_3px_solid_rgb:d6e3ed%2Cg_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzRlNWQ4ZTRjZjguanBlZw==%2Cr_20%2Cw_90%2Cx_92%2Cy_102/co_rgb:6e7b85%2Cg_south_west%2Cl_text:notosansjp-medium.otf_30:%25E6%25A0%25AA%25E5%25BC%258F%25E4%25BC%259A%25E7%25A4%25BE%25E3%2583%25AD%25E3%2582%25B0%25E3%2583%25A9%25E3%2582%25B9%2520%25E3%2583%2586%25E3%2583%2583%25E3%2582%25AF%25E3%2583%2596%25E3%2583%25AD%25E3%2582%25B0%2Cx_220%2Cy_160/bo_4px_solid_white%2Cg_south_west%2Ch_50%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzAxNjQwZGFkNjEuanBlZw==%2Cr_max%2Cw_50%2Cx_139%2Cy_84/v1627283836/default/og-base-w1200-v2.png"/><meta property="og:type" content="article"/><meta property="og:site_name" content="Zenn"/><meta content="https://storage.googleapis.com/zenn-user-upload/avatar/01640dad61.jpeg" name="zenn:image"/><meta content="little_hands(松岡@Loglass)さんによる記事" name="zenn:description"/><link href="http://www.hatena.ne.jp/little_hands/" rel="author"/><meta name="next-head-count" content="13"/><script nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=">var displayMode = 'browser'; if (window.matchMedia('(display-mode: standalone)').matches) { displayMode = 'standalone'; // PWA } else if (window.navigator.standalone === true) { displayMode = 'standalone'; // PWA on iOS Safari } window.dataLayer = window.dataLayer || []; window.dataLayer.push({'display_mode': displayMode});</script><script nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=">(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-K42DRM8');</script><script async="" src="https://www.googletagmanager.com/gtag/js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY="></script><script nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=">window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());</script><script src="https://embed.zenn.studio/js/listen-embed-event.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY="></script><style nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY="> @font-face { font-family: 'Inter'; font-weight: 600; font-display: swap; src: local(''), url('https://static.zenn.studio/fonts/inter-v3-latin-600.woff2') format('woff2'); } @font-face { font-family: 'Inter'; font-weight: 700; font-display: swap; src: local(''), url('https://static.zenn.studio/fonts/inter-v3-latin-700.woff2') format('woff2'); }</style><meta content="Zenn" name="apple-mobile-web-app-title"/><link href="/manifest.json" rel="manifest"/><link href="https://static.zenn.studio/images/logo-transparent.png" rel="shortcut icon" type="image/png"/><link href="https://static.zenn.studio/images/icon.png" rel="apple-touch-icon-precomposed" type="image/png"/><link nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" rel="preload" href="https://static.zenn.studio/_next/static/css/68835d9d5cc2bed0.css" as="style"/><link nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" rel="stylesheet" href="https://static.zenn.studio/_next/static/css/68835d9d5cc2bed0.css" data-n-g=""/><link nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" rel="preload" href="https://static.zenn.studio/_next/static/css/8175e6fc05bf3349.css" as="style"/><link nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" rel="stylesheet" href="https://static.zenn.studio/_next/static/css/8175e6fc05bf3349.css" data-n-p=""/><link nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" rel="preload" href="https://static.zenn.studio/_next/static/css/73149e3adcac36b7.css" as="style"/><link nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" rel="stylesheet" href="https://static.zenn.studio/_next/static/css/73149e3adcac36b7.css"/><noscript data-n-css="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY="></noscript><script defer="" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" nomodule="" src="https://static.zenn.studio/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script defer="" src="https://static.zenn.studio/_next/static/chunks/7679.c0c0f767292b40bd.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY="></script><script src="https://static.zenn.studio/_next/static/chunks/webpack-959ee23ac3a08aae.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/framework-945b357d4a851f4b.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/main-ef7eed30f6bbba47.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/pages/_app-1662a43e95dc3f9b.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/7056-cf96eb948d7b336b.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/1828-1625283b55648af2.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/370-e961ff601e2a22c6.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/6232-798ac44847000f8a.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/9344-fc1a735416442515.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/565-03a0a60d578fe20b.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/pages/%5Busername%5D/articles/%5Bslug%5D-747cc26864f499fc.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script><script src="https://static.zenn.studio/_next/static/qHU6Be8y3eXbdnUQStbKu/_buildManifest.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script><script src="https://static.zenn.studio/_next/static/qHU6Be8y3eXbdnUQStbKu/_ssgManifest.js" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=" defer=""></script></head><body><script nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=">const shouldUseTwemoji = !/(googlebot|macintosh|macintel|macppc|mac68k|macos|iphone|ipad)/i.test(window.navigator.userAgent); if(shouldUseTwemoji) document.body.setAttribute("data-use-twemoji", "true");</script><div id="__next"><header class="AppHeader_header__54XdE"><div class="Container_wide__ykGLh Container_common__figYY"><div class="AppHeader_inner__CJC4C"><a class="AppHeader_homeLink__cjUD6" href="/"><svg x="0px" y="0px" viewBox="0 0 377.4 88.3" aria-label="Zenn | エンジニアのための情報共有コミュニティ" height="22"><title>Zenn</title><g fill="#111"><path d="M233,56.8h-39c0.5,3.5,2.2,6.8,4.8,9.2c2.7,2.3,6.2,3.5,9.8,3.4c2.8,0,5.6-0.5,8.2-1.7c2.5-1.1,4.8-2.8,6.5-5l8.2,9.5 c-2.5,3.4-5.7,6.1-9.5,7.9c-4.6,2.2-9.6,3.3-14.7,3.2c-5.7,0.1-11.4-1.2-16.5-4c-4.5-2.5-8.2-6.3-10.7-10.9s-3.8-9.8-3.7-15.1v-2.2 c-0.1-5.7,1.1-11.3,3.5-16.5c2.2-4.7,5.7-8.6,10.1-11.3c4.7-2.8,10.1-4.2,15.5-4.1c5.2-0.1,10.3,1.1,14.9,3.7 c4.1,2.5,7.4,6.2,9.4,10.5c2.2,5.1,3.3,10.5,3.2,16.1V56.8z M216.1,43.9c0.1-2.9-0.9-5.7-2.8-7.9c-1.8-1.9-4.4-2.9-7.9-2.9 c-2.9-0.1-5.8,1.1-7.7,3.2c-2,2.6-3.3,5.7-3.6,9h22V43.9z"></path><path d="M128.3,67.9h36.1v14.7h-56.9V72l35.8-54.3h-36.2V2.9h56.6v10.4L128.3,67.9z"></path><path d="M248.8,50.7c0-19.1,12.7-29.2,28.2-29.2s27.9,10.1,27.9,29.2V82h-16V51.4c0-10.6-4.8-16.1-12-16.1s-12.4,5.5-12.4,16.1 v30.7h-15.8L248.8,50.7L248.8,50.7z"></path><path d="M320.3,50.7c0-19.1,12.7-29.2,28.2-29.2s27.9,10.1,27.9,29.2V82h-16V51.4c0-10.6-4.8-16.1-12-16.1S336,40.8,336,51.4v30.7 h-15.8L320.3,50.7L320.3,50.7z"></path></g><path fill="#3EA8FF" class="st0" d="M2.4,83.3h17c0.9,0,1.7-0.5,2.2-1.2L68.4,5.2C69,4.2,68.3,3,67.1,3H51c-0.8,0-1.5,0.4-1.9,1.1L1.6,81.9 C1.3,82.5,1.7,83.3,2.4,83.3z"></path><path fill="#3EA8FF" class="st0" d="M61,82.1l22.1-35.5c0.7-1.1-0.1-2.5-1.4-2.5H65.7c-0.6,0-1.2,0.3-1.5,0.8L41.5,81.2c-0.6,0.9,0.1,2.1,1.2,2.1 h16.3C59.8,83.3,60.6,82.9,61,82.1z"></path></svg></a></div></div></header><article class="View_container__VQuzA"><aside class="ContentStickyNavForMobile_container__153a8"><div class="Container_wide__ykGLh Container_common__figYY"><div class="ContentStickyNavForMobile_inner__xJ_fS"><div class="ContentStickyNavForMobile_avatarInner__3_noS"><a class="ContentStickyNavForMobile_principalLink__c15vw" href="/p/loglass"><span class="ContentStickyNavForMobile_avatarContainer__V3P_G"><img alt="株式会社ログラス テックブログ" class="AvatarImage_border__pDIjF AvatarImage_plain__Fgp4R AvatarImage_withPublication__hNtIe" height="38" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/4e5d8e4cf8.jpeg" width="38"/></span><span class="ContentStickyNavForMobile_displayName__cmEag">株式会社ログラス テックブログ</span></a></div><div class="ContentStickyNavForMobile_actions__a9fMk"><div style="margin-left:15px"><div class="LikeButton_container__YlckE style-medium count-bottom"><button aria-label="いいね" class="LikeButton_button__ZwdG4"><svg class="LikeButton_svgLike__Gl0Sz" viewBox="0 0 110 110"><path class="LikeButton_svgLikeLine__f9txR" d="M73,24a23.78,23.78,0,0,0-15.89,6.19,3.14,3.14,0,0,1-4.18,0A23.81,23.81,0,0,0,37,24a22,22,0,0,0-22,22c0,16.67,19.64,32.82,25.11,37.93,2.84,2.65,6.15,5.64,8.92,8.13a8.9,8.9,0,0,0,11.9,0c2.77-2.49,6.07-5.48,8.91-8.13C75.37,78.81,95,62.66,95,46A22,22,0,0,0,73,24Z" fill="currentColor"></path><path class="LikeButton_svgLikeInner__uiexS" d="M66.25,76.42c-.71.64-1.32,1.2-1.82,1.67-2.51,2.33-5.39,5-7.94,7.25a2.21,2.21,0,0,1-3,0C51,83,48.1,80.42,45.59,78.09c-.5-.47-1.12-1-1.82-1.67C38.09,71.29,23,57.67,23,46A14,14,0,0,1,37,32a15.92,15.92,0,0,1,11.65,5.23l4.73,5a2.2,2.2,0,0,0,3.23,0l4.72-5A16.06,16.06,0,0,1,73,32,14,14,0,0,1,87,46C87,57.67,71.93,71.29,66.25,76.42Z" fill="currentColor"></path><g class="LikeButton_svgLikeDecoration__78UjB"><circle cx="41.5" cy="9.5" fill="#3ea8ff" r="3.5"></circle><circle cx="98.5" cy="26.5" fill="#ffdc6e" r="3.5"></circle><circle cx="13" cy="19" fill="#c067f4" r="5"></circle><circle cx="77" cy="9" fill="#f76685" r="5"></circle><circle cx="26.5" cy="92.5" fill="#f76685" r="3.5"></circle><circle cx="105.5" cy="48.5" fill="#c067f4" r="3.5"></circle><circle cx="4.5" cy="60.5" fill="#3ea8ff" r="3.5"></circle><circle cx="94.5" cy="73.5" fill="#3ea8ff" r="1.5"></circle><circle cx="16.5" cy="75.5" fill="#ffdc6e" r="1.5"></circle><circle cx="78.5" cy="91.5" fill="#ffdc6e" r="1.5"></circle></g></svg></button></div></div></div></div></div></aside><div class="PublicationInfoForDesktop_container__UxKig"><div class="Container_wide__ykGLh Container_common__figYY"><div class="PublicationInfoForDesktop_inner__LnToC"><a class="PublicationInfoForDesktop_link__fqxgJ" href="/p/loglass"><span class="PublicationInfoForDesktop_avatar__qh_yu"><img alt="" class="AvatarImage_border__pDIjF AvatarImage_plain__Fgp4R AvatarImage_withPublication__hNtIe" height="45" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/4e5d8e4cf8.jpeg" width="45"/></span><span class="PublicationInfoForDesktop_displayName__nzipD">株式会社ログラス テックブログ</span></a><span class="PublicationInfoForDesktop_label__d4mY3"><a class="PublicationLabelLink_link__JBqs2" href="/faq#what-is-publication">Publicationへの投稿</a></span></div></div></div><header class="ArticleHeader_header__IRbtk"><div class="Container_wide__ykGLh Container_common__figYY"><div class="ArticleHeader_main__W98WY"><div class="ArticleHeader_emoji__30JiU"><span class="Emoji_twemoji__hcxYF"><span class="Emoji_twemojiImg__Oc6vR" style="background-image:url(https://asia-northeast1-zenn-dev-production.cloudfunctions.net/twemoji/🏘️.svg)"></span></span><span class="Emoji_nativeEmoji__GMBzX">🏘️</span></div><h1 class="ArticleHeader_title__9jiOv"><span style="font-size:0.92em">「リファクタリングの時間」を確保する技術</span></h1><div class="ArticleHeader_metaContainer__5UzrJ"><div class="ArticleHeader_metaInfo__XrRdh"><div class="ArticleHeader_userInfo__g_sSW"><a class="ArticleHeader_avatar__anCEE" href="/little_hand_s"><img alt="" class="AvatarImage_plain__Fgp4R " height="25" loading="lazy" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/01640dad61.jpeg" width="25"/></a><a class="ArticleHeader_metaUserName__FbZgW" href="/little_hand_s">little_hands(松岡@Loglass)</a></div><span class="ArticleHeader_pubDate__gF_sc"><span class="ArticleHeader_num__7Zpz0">2024/12/11</span>に公開</span></div></div></div></div></header><div class="Container_wide__ykGLh Container_common__figYY"><div class="ContainerUndo_undoInSM__1vdc1"><div class="View_inner__LlCJG"><div class="View_stickyShare__TsaVf"><div class="View_stickyShareInner__FLu2S"><div class="LikeButton_container__YlckE style-large-white count-bottom"><button aria-label="いいね" class="LikeButton_button__ZwdG4"><svg class="LikeButton_svgLike__Gl0Sz" viewBox="0 0 110 110"><path class="LikeButton_svgLikeLine__f9txR" d="M73,24a23.78,23.78,0,0,0-15.89,6.19,3.14,3.14,0,0,1-4.18,0A23.81,23.81,0,0,0,37,24a22,22,0,0,0-22,22c0,16.67,19.64,32.82,25.11,37.93,2.84,2.65,6.15,5.64,8.92,8.13a8.9,8.9,0,0,0,11.9,0c2.77-2.49,6.07-5.48,8.91-8.13C75.37,78.81,95,62.66,95,46A22,22,0,0,0,73,24Z" fill="currentColor"></path><path class="LikeButton_svgLikeInner__uiexS" d="M66.25,76.42c-.71.64-1.32,1.2-1.82,1.67-2.51,2.33-5.39,5-7.94,7.25a2.21,2.21,0,0,1-3,0C51,83,48.1,80.42,45.59,78.09c-.5-.47-1.12-1-1.82-1.67C38.09,71.29,23,57.67,23,46A14,14,0,0,1,37,32a15.92,15.92,0,0,1,11.65,5.23l4.73,5a2.2,2.2,0,0,0,3.23,0l4.72-5A16.06,16.06,0,0,1,73,32,14,14,0,0,1,87,46C87,57.67,71.93,71.29,66.25,76.42Z" fill="currentColor"></path><g class="LikeButton_svgLikeDecoration__78UjB"><circle cx="41.5" cy="9.5" fill="#3ea8ff" r="3.5"></circle><circle cx="98.5" cy="26.5" fill="#ffdc6e" r="3.5"></circle><circle cx="13" cy="19" fill="#c067f4" r="5"></circle><circle cx="77" cy="9" fill="#f76685" r="5"></circle><circle cx="26.5" cy="92.5" fill="#f76685" r="3.5"></circle><circle cx="105.5" cy="48.5" fill="#c067f4" r="3.5"></circle><circle cx="4.5" cy="60.5" fill="#3ea8ff" r="3.5"></circle><circle cx="94.5" cy="73.5" fill="#3ea8ff" r="1.5"></circle><circle cx="16.5" cy="75.5" fill="#ffdc6e" r="1.5"></circle><circle cx="78.5" cy="91.5" fill="#ffdc6e" r="1.5"></circle></g></svg></button></div><span style="display:block;height:1rem;flex-shrink:0"></span><div style="display:flex;gap:0.5rem;flex-direction:column;align-items:stretch;flex-wrap:nowrap"><a aria-label="X(Twitter)にポスト" class="ShareButtonsExperimental_button__d9aXF ShareButtonsExperimental_svgTwitterVertical__NmmfB ShareButtonsExperimental_svgTwitterBase__8FrNq" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://twitter.com/intent/tweet?url=https://zenn.dev/loglass/articles/961e283e6fbe71&amp;text=%E3%80%8C%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E6%99%82%E9%96%93%E3%80%8D%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93%EF%BD%9Clittle_hands(%E6%9D%BE%E5%B2%A1%40%20Loglass)&amp;hashtags=zenn" id="gtm-article-left-tweet" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="27" height="28" viewBox="0 0 27 28" fill="none"><g clip-path="url(#clip0_1_18)"><path d="M16.0687 11.7356L26.12 0H23.7382L15.0106 10.1899L8.03988 0H0L10.5411 15.4089L0 27.7155H2.38199L11.5985 16.9546L18.9601 27.7155H27L16.0681 11.7356H16.0687ZM12.8062 15.5447L11.7382 14.0103L3.24025 1.80106H6.89884L13.7568 11.6543L14.8248 13.1887L23.7393 25.9963H20.0807L12.8062 15.5452V15.5447Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1_18"><rect width="27" height="27.7297" fill="white"></rect></clipPath></defs></svg></a><a aria-label="Facebookに投稿" class="ShareButtonsExperimental_button__d9aXF ShareButtonsExperimental_svgFacebookVertical__3ykb7 ShareButtonsExperimental_svgFacebookBase___gDOW" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="http://www.facebook.com/sharer.php?u=https://zenn.dev/loglass/articles/961e283e6fbe71" id="gtm-article-left-facebook" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="28" height="29" viewBox="0 0 28 29" fill="none"><g clip-path="url(#clip0_2_21)"><path d="M28 14.7812C28 7.02084 21.7319 0.729736 14 0.729736C6.26808 0.729736 0 7.02084 0 14.7812C0 21.3707 4.52032 26.9002 10.6182 28.4189V19.0753H7.73136V14.7812H10.6182V12.9309C10.6182 8.14833 12.7747 5.93158 17.453 5.93158C18.34 5.93158 19.8705 6.10637 20.4966 6.28061V10.1729C20.1662 10.138 19.5922 10.1206 18.8793 10.1206C16.5838 10.1206 15.6968 10.9935 15.6968 13.2625V14.7812H20.2698L19.4841 19.0753H15.6968V28.7297C22.629 27.8895 28.0006 21.9654 28.0006 14.7812H28Z" fill="currentColor"></path></g><defs><clipPath id="clip0_2_21"><rect width="28" height="28" fill="white" transform="translate(0 0.729736)"></rect></clipPath></defs></svg></a><a aria-label="はてなブックマークに登録" class="ShareButtonsExperimental_button__d9aXF ShareButtonsExperimental_svgHatenaBookmarkVertical__b161J ShareButtonsExperimental_svgHatenaBookmarkBase__VXz6p" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://b.hatena.ne.jp/add?mode=confirm&amp;url=https://zenn.dev/loglass/articles/961e283e6fbe71&amp;title=%E3%80%8C%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E6%99%82%E9%96%93%E3%80%8D%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93%EF%BD%9Clittle_hands(%E6%9D%BE%E5%B2%A1%40Loglass)" id="gtm-article-left-hatena-bookmark" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="27" height="28" viewBox="0 0 27 28" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.4999 0.729736H21.5001C24.5376 0.729736 27 3.19213 27 6.22964V22.2298C27 25.2673 24.5376 27.7297 21.5001 27.7297H5.4999C2.46239 27.7297 0 25.2673 0 22.2298V6.22964C0 3.19213 2.46239 0.729736 5.4999 0.729736ZM12.98 13.7472C13.8521 13.8136 14.5319 14.1209 15.0212 14.6673V14.6679C15.512 15.2127 15.7572 15.9444 15.7572 16.8543C15.7572 17.5126 15.62 18.0877 15.3436 18.5867C15.0692 19.084 14.6756 19.4712 14.1604 19.7433C13.7441 19.9658 13.2289 20.1278 12.6155 20.2245C12.001 20.3179 10.9966 20.3665 9.6039 20.3665H6.13656V8.09392H9.50184C10.8859 8.09392 11.8503 8.13875 12.4016 8.22623C12.9503 8.31695 13.4206 8.4703 13.8164 8.68792C14.269 8.93902 14.6129 9.27437 14.8527 9.69341C15.0865 10.1151 15.2069 10.6028 15.2069 11.1546C15.2069 11.8512 15.0309 12.4053 14.6761 12.813C14.3197 13.2261 13.756 13.5355 12.98 13.7472ZM9.96192 10.8144H9.24372H9.24318V13.2768H9.91116C10.7352 13.2768 11.2984 13.1856 11.6073 13.0058C11.9124 12.8227 12.0663 12.5273 12.0663 12.0667C12.0663 11.6061 11.9216 11.2821 11.6375 11.0947C11.3497 10.9084 10.7919 10.8144 9.96192 10.8144ZM10.4128 18.1514C11.2028 18.1514 11.7661 18.0531 12.0928 17.8523V17.8528C12.4227 17.653 12.5863 17.3209 12.5863 16.8581C12.5863 16.3408 12.4367 15.9806 12.1338 15.7765C11.8357 15.5724 11.2747 15.4703 10.463 15.4703H9.24372V18.1514H10.4128ZM19.3093 17.257C18.4502 17.257 17.7547 17.9525 17.7547 18.8111C17.7547 19.6697 18.4507 20.3658 19.3093 20.3658C20.1679 20.3658 20.8634 19.6697 20.8634 18.8111C20.8634 17.9525 20.1668 17.257 19.3093 17.257ZM17.9593 8.09318H20.6593V16.2753H17.9593V8.09318Z" fill="currentColor"></path></svg></a></div></div></div><div class="View_columnsContainer__ijfFN"><section class="View_content__OZ_Dc"><div class="View_main__AU6KW"><div class="Container_default__13H8g Container_common__figYY"><div class="View_topics__2sHkl"><a class="View_topicLink__jdtX_" href="/topics/%E8%A8%AD%E8%A8%88"><div class="View_topicImage__qMmmw"><img class="View_topicImg__TpkV5" loading="lazy" src="https://zenn.dev/images/topic.png"/></div><div class="View_topicName____nYp">設計</div></a><a class="View_topicLink__jdtX_" href="/topics/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2"><div class="View_topicImage__qMmmw"><img class="View_topicImg__TpkV5" loading="lazy" src="https://zenn.dev/images/topic.png"/></div><div class="View_topicName____nYp">エンジニア</div></a><a class="View_topicLink__jdtX_" href="/topics/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0"><div class="View_topicImage__qMmmw"><img class="View_topicImg__TpkV5" loading="lazy" src="https://zenn.dev/images/topic.png"/></div><div class="View_topicName____nYp">リファクタリング</div></a><a class="View_topicLink__jdtX_" href="/topics/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB"><div class="View_topicImage__qMmmw"><img class="View_topicImg__TpkV5" loading="lazy" src="https://zenn.dev/images/topic.png"/></div><div class="View_topicName____nYp">アジャイル</div></a><a class="View_topicLink__jdtX_" href="/tech-or-idea"><div class="View_topicImage__qMmmw"><img class="View_topicImg__TpkV5" loading="lazy" src="https://static.zenn.studio/images/drawing/idea-icon.svg"/></div><div class="View_topicName____nYp" style="text-transform:capitalize">idea</div></a></div><div class="InsertButtonToCodeBlock_insertButtonWrapper__ueql2"><div class="znc BodyContent_anchorToHeadings__uGxNv"><aside class="msg message"><span class="msg-symbol">!</span><div class="msg-content"> <p data-line="1" class="code-line">この記事は <a href="https://qiita.com/advent-calendar/2024/loglass" target="_blank" rel="nofollow noopener noreferrer">株式会社ログラス Productチーム Advent Calendar 2024</a> のシリーズ 2、11日目 の記事です。</p> </div></aside> <h2 id="%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" data-line="5" class="code-line"> <a class="header-anchor-link" href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" aria-hidden="true"></a> はじめに</h2> <p data-line="7" class="code-line">ソフトウェア開発において、リファクタリング、つまりコードの保守性を高める活動は、ソフトウェアの価値を高める上でとても大切ですよね。<br> しかし、「リファクタリングの時間が確保できない」「リファクタリング実施のための同意が得られない」という話を耳にすることがあります。</p> <p data-line="10" class="code-line">リファクタリングは「絶対やった方がいいのは感覚としてはわかっている、でもその必要性ををうまく伝えられない」となりがちな性質があるのです。</p> <p data-line="12" class="code-line">この記事では、リファクタリングの時間を確保するために、どんなことを考え、何をステークホルダーに伝え、具体的にどのようなタイミングで実施していくといいのか、について解説します。</p> <h3 id="%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81" data-line="14" class="code-line"> <a class="header-anchor-link" href="#%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81" aria-hidden="true"></a> ポイントまとめ</h3> <p data-line="16" class="code-line">リファクタリング時間確保のポイントを端的に説明すると、以下の通りになります。</p> <ul data-line="18" class="code-line"> <li data-line="18" class="code-line">リターンとコストを明らかにする</li> <li data-line="19" class="code-line">複数の実施パターンを選択肢として持ち、柔軟に選べるようにする。</li> <li data-line="20" class="code-line">その中でも、日頃の小さいリファクタリングで成功体験を積み、徐々に規模を大きくする</li> </ul> <p data-line="22" class="code-line">これについて、順を追って解説していきます。</p> <h2 id="%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E6%99%82%E9%96%93%E7%A2%BA%E4%BF%9D%E3%81%AE%E9%9B%A3%E3%81%97%E3%81%95" data-line="24" class="code-line"> <a class="header-anchor-link" href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E6%99%82%E9%96%93%E7%A2%BA%E4%BF%9D%E3%81%AE%E9%9B%A3%E3%81%97%E3%81%95" aria-hidden="true"></a> リファクタリング時間確保の難しさ</h2> <p data-line="26" class="code-line">リファクタリング時間確保が難しいのはなぜでしょうか。その理由を一言で表現すると、</p> <p data-line="28" class="code-line"><strong>リファクタリングは、かけるコストに対して得られるリターンがわかりにくいから</strong></p> <p data-line="30" class="code-line">に尽きます。</p> <p data-line="32" class="code-line">「10時間エンジニアの時間を投資すると、翌月から5時間ずつ開発工数が削減できますよ」<br> と言われたら、非技術者でも「じゃあやろう、いつやる?」となるわけです。<br> では、そうならないのはなぜでしょうか?</p> <p data-line="36" class="code-line">リターンとコストのうち、コストに関しては、延べ時間である程度計算できるのでわかりやすいです。ここには不確実性があるので、不確実性を織り込んだ見積もりができれば議論することができます。</p> <p data-line="38" class="code-line">一方、難しいのはリターンですね。特に、定量的に価値を聞かれて答えに困る、という経験をお持ちの方はいらっしゃるのではないでしょうか。</p> <p data-line="40" class="code-line">ここで大切なのは、</p> <p data-line="42" class="code-line"><strong>「定量的に価値を測定できない」≠「価値がない」</strong></p> <p data-line="44" class="code-line">ということです。</p> <p data-line="46" class="code-line">価値はあるが、測定しにくい。</p> <p data-line="48" class="code-line">それがリファクタリングに本質的につきまとう課題なので、その前提でどうするかを考えていく必要があります。</p> <h2 id="%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%81%A8%E3%81%9D%E3%81%AE%E7%9B%AE%E7%9A%84" data-line="50" class="code-line"> <a class="header-anchor-link" href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%81%A8%E3%81%9D%E3%81%AE%E7%9B%AE%E7%9A%84" aria-hidden="true"></a> リファクタリングの定義とその目的</h2> <p data-line="52" class="code-line">まず、リファクタリングの定義と目的について確認しましょう。</p> <p data-line="54" class="code-line">リファクタリングとは、「ソフトウェアの内部構造を改善しつつ、外部から見た動作を変えない修正を加える行為」です。これにより、ソフトウェアの内部品質を向上させます。ソフトウェア品質特性で言うと、主に保守性を向上させることになります。</p> <p data-line="56" class="code-line">その結果として、以下のような効果の発生を目指します。</p> <ul data-line="58" class="code-line"> <li data-line="58" class="code-line"> <strong>開発速度向上</strong> <ul data-line="59" class="code-line"> <li data-line="59" class="code-line"> <strong>可読性の向上</strong>: コードの複雑性を下げ、理解を容易にします。</li> <li data-line="60" class="code-line"> <strong>機能拡張性の向上</strong>: 機能追加や修正に必要なコストを下げ、速度を向上させます。</li> </ul> </li> <li data-line="61" class="code-line"> <strong>外部品質向上=バグの発生確率を低減</strong> <ul data-line="62" class="code-line"> <li data-line="62" class="code-line"> <strong>開発難易度の低減</strong>: ロジックを簡素化することにより、開発難易度を下げ、外部品質向上につなぎます。</li> <li data-line="63" class="code-line"> <strong>テスト容易性向上</strong>: テストすべき内容が明確になり、テスト設計が容易になります。ユニットテストなど小さなテストも実行しやすくなります。</li> </ul> </li> </ul> <p data-line="65" class="code-line">つまり、目的を端的に表現すると <strong>「リファクタリングとは、生産性と品質改善のための投資」</strong> です。</p> <p data-line="67" class="code-line">この目的が最も大切です。生産性と品質を改善したくない人はいないはずなので、ここに同意できれば、あとはリターン・コストの大きさと、コストの支払い方法の問題に分解することができます。<br> (厳密には、前述の通り「内部品質向上により生産性と外部品質を向上させる」ですが、長くなるのでここは諸々込みで「品質改善」と表現しています)</p> <h3 id="%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%BF%85%E8%A6%81%E6%80%A7" data-line="70" class="code-line"> <a class="header-anchor-link" href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%BF%85%E8%A6%81%E6%80%A7" aria-hidden="true"></a> リファクタリングの必要性</h3> <p data-line="72" class="code-line">もう一つ重要な、押さえておくべきことをお伝えします。</p> <p data-line="74" class="code-line"><strong>「リファクタリングはどんなに優れたチームでも必要になるものである」</strong> ということです。</p> <p data-line="76" class="code-line">わざわざ後からリファクタリングするよりも、最初から保守性の高いコードを書けばいいではないか、と思いますよね。しかし、それは以下のような不確実性や制約があるため、困難です。</p> <ol data-line="78" class="code-line"> <li data-line="78" class="code-line"> <strong>技術的な不確実性</strong>: <ul data-line="79" class="code-line"> <li data-line="79" class="code-line">要件の変更や新技術の登場により、初期の設計が最適でなくなる可能性がある</li> <li data-line="80" class="code-line">開発チームのスキルや知識が向上し、より良い実装方法が見つかることがある</li> </ul> </li> <li data-line="81" class="code-line"> <strong>要件/仕様の不確実性</strong>: <ul data-line="82" class="code-line"> <li data-line="82" class="code-line">プロジェクトの初期段階では、最終的な製品像が完全に固まっていないことが多い</li> <li data-line="83" class="code-line">ユーザーフィードバックや市場の変化により、要求が変わる可能性がある</li> </ul> </li> <li data-line="84" class="code-line"> <strong>時間的な制約</strong>: <ul data-line="85" class="code-line"> <li data-line="85" class="code-line">納期やリソースの制限により、最初から理想的な設計や実装を行う余裕がない場合がある</li> <li data-line="86" class="code-line">短期的な目標達成を優先するあまり、コードの品質が犠牲になることがある</li> </ul> </li> <li data-line="87" class="code-line"> <strong>技術力の制約</strong>: <ul data-line="88" class="code-line"> <li data-line="88" class="code-line">保守性の高い設計や実装を行うためのスキルや経験が、チーム内で十分でない場合がある</li> <li data-line="89" class="code-line">新しい技術や設計パターンの導入時に、チーム全体が同じペースで習得し、適切に活用することが困難な場合がある</li> </ul> </li> </ol> <p data-line="91" class="code-line">これらの要因により、保守性は放っておくと自然と下がっていき、生産性や品質が低下します。リファクタリングの文脈では3、4の「制約」が特に注目されがちですが、1、2の「不確実性」の観点も重要です。</p> <p data-line="93" class="code-line"><strong>不確実性や制約がないプロジェクトはありません。</strong> そのため、適切に保守性を向上するための手を打たなければ、長期的には開発チームの生産性、品質は低下するものなのです。<br> リファクタリングが必要な状況を恥じる必要はありません。大切なのはその状況にどう対応するか、ということです。</p> <h2 id="%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AB%E9%87%8D%E8%A6%81%E3%81%AA%E3%81%93%E3%81%A8" data-line="97" class="code-line"> <a class="header-anchor-link" href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AB%E9%87%8D%E8%A6%81%E3%81%AA%E3%81%93%E3%81%A8" aria-hidden="true"></a> リファクタリングを行うために重要なこと</h2> <p data-line="99" class="code-line">以上を踏まえ、リファクタリングを実施するために重要なことは、<strong>コストとリターンを明確にすること</strong>です。</p> <p data-line="101" class="code-line">「リファクタリングとは、生産性と品質改善のための投資」だと書きました。となると、そのリターンにコストが見合えば実行した方がよく、見合わなければ実行すべきではないと考えられます。そのため、「どんなリターンを期待して、どれだけの時間をかけるか」を常に意識することが重要です。</p> <h2 id="%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E3%81%A9%E3%81%86%E8%80%83%E3%81%88%E3%82%8B%E3%81%8B" data-line="104" class="code-line"> <a class="header-anchor-link" href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E3%81%A9%E3%81%86%E8%80%83%E3%81%88%E3%82%8B%E3%81%8B" aria-hidden="true"></a> リファクタリングのリターンをどう考えるか</h2> <p data-line="106" class="code-line">前述の通り、リファクタリングのリターン(価値)は、定量化が難しいことが多いです。そこで、まずは定性的な価値を言語化することが重要です。シンプルに「リファクタリングすると何が嬉しいの?」に答えられるようにしましょう。<br> それを押さえた上で、できる範囲で定量的に表現できないか検討する、という順番で考えます。</p> <p data-line="109" class="code-line">2つの例を具体的に紹介します。</p> <h3 id="%E4%BE%8B1%EF%BC%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0" data-line="111" class="code-line"> <a class="header-anchor-link" href="#%E4%BE%8B1%EF%BC%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0" aria-hidden="true"></a> 例1:ファイルインポート機能のリファクタリング</h3> <p data-line="113" class="code-line">状況:<br> 既存のファイルインポート機能に新しいファイル形式を追加するのに、現在2日かかっている。今後も新しいファイル形式の追加は想定される。</p> <p data-line="116" class="code-line">リファクタリング案:<br> インポート処理をリファクタリングによって汎用化し、新形式の追加コストを下げる。</p> <p data-line="119" class="code-line">リターン:<br> 定性的な価値は「将来の機能拡張のコストを下げる」とまず考えます。<br> それを定量化すると、以下の通りになります。</p> <ul data-line="123" class="code-line"> <li data-line="123" class="code-line">リファクタリング後は、新形式の追加が0.5日で可能になる(1.5日の削減)と想定</li> <li data-line="124" class="code-line">リファクタリングには5日かかる</li> </ul> <p data-line="126" class="code-line">リターンとコストが釣り合う点を計算すると、「1.5日の削減 × 4 = 6日」なので、今後新形式の追加が4つ以上見込まれるのであれば投資に対してリターンが見合うから実施しましょう、と論理的に提案、判断ができます。</p> <h3 id="%E4%BE%8B2%EF%BC%9A%E3%83%90%E3%82%B0%E3%81%8C%E5%A4%9A%E7%99%BA%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0" data-line="128" class="code-line"> <a class="header-anchor-link" href="#%E4%BE%8B2%EF%BC%9A%E3%83%90%E3%82%B0%E3%81%8C%E5%A4%9A%E7%99%BA%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0" aria-hidden="true"></a> 例2:バグが多発しているコードのリファクタリング</h3> <p data-line="130" class="code-line">状況:<br> 特定の機能に機能拡張する度にバグが頻繁に発生し、対応工数に多くの時間を費やしている。この機能の拡張は今後も継続することが見込まれる。</p> <p data-line="133" class="code-line">リファクタリング案:<br> 既存コードをリファクタリングして可読性を上げ、ユニットテストを充実させる。</p> <p data-line="136" class="code-line">リターン:<br> 定性的な価値は、バグ発生を防ぎ、それによる対応コストを削減することです。<br> これを定量化するならば、今後の見込みのバグの対応コスト(アラートの対応、調査、お客さま対応など含む)を計算し、それを削減すると考えられます。</p> <p data-line="140" class="code-line">なお、これは多少強引な定量化ではあります。バグの発生見込みは確率論通りに発生するわけではありませんし、バグの問題は対応コストだけでなくステークホルダーに対して迷惑をかけてしまうことなどもあります。対応コストによる定量化は、あくまで「価値はあるけど定量化が難しい」ことへの対策の一つだと考えてください。</p> <h3 id="%E5%BF%85%E8%A6%81%E6%80%A7%E3%81%AE%E5%90%8C%E6%84%8F%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%84" data-line="142" class="code-line"> <a class="header-anchor-link" href="#%E5%BF%85%E8%A6%81%E6%80%A7%E3%81%AE%E5%90%8C%E6%84%8F%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%84" aria-hidden="true"></a> 必要性の同意におけるコツ</h3> <p data-line="144" class="code-line">これらの例のように、リファクタリングのリターンを具体的に示すことで、その必要性をより明確に伝えることができます。<br> この際に役立つコツとして、「問題解決の5階層」があるので、併せてご紹介します。</p> <p data-line="147" class="code-line"><img src="https://storage.googleapis.com/zenn-user-upload/52b665857e16-20241206.png" loading="lazy" class="md-img"></p> <p data-line="149" class="code-line">ここで重要なのは、下の階層から順番に認識を合わせる必要があるということです。</p> <p data-line="151" class="code-line">例えば、「今後の品質向上のためのリファクタリングが必要(4.施策)」の同意を得るためには、その下の階層の認識を合わせる必要があります。</p> <p data-line="153" class="code-line">つまり、</p> <ol data-line="154" class="code-line"> <li data-line="154" class="code-line">事象: 機能拡張の度にバグが○件発生し、それぞれ平均○分時間をとられるので、月に○時間の対応工数がかかっている</li> <li data-line="155" class="code-line">問題: 新規機能開発工数がバグ対応工数で圧迫されている</li> <li data-line="156" class="code-line">原因: 該当コードの可読性やテスト容易性が低いため、バグを生みやすいコードになっている</li> <li data-line="157" class="code-line">施策: 該当コードをリファクタし、可読性やテスト容易性を向上させる</li> <li data-line="158" class="code-line">効果: 今後のバグ発生リスクが削減される</li> </ol> <p data-line="160" class="code-line">と整理をすると、「4.施策」の必要性の同意が得られない場合、「1.事象」「2.問題」の認識があっていない可能性があるので、そこから確認していくことが必要ということになります。</p> <p data-line="162" class="code-line">詳細は次の解説記事をこちらをご覧ください。</p> <p data-line="164" class="code-line"><span class="embed-block zenn-embedded zenn-embedded-card"><iframe id="zenn-embedded__91b19e2755439" src="https://embed.zenn.studio/card#zenn-embedded__91b19e2755439" data-content="https%3A%2F%2Flittle-hands.hatenablog.com%2Fentry%2F2019%2F12%2F13%2Fproblem-solving-5layer" frameborder="0" scrolling="no" loading="lazy"></iframe></span><a href="https://little-hands.hatenablog.com/entry/2019/12/13/problem-solving-5layer" style="display:none" target="_blank" rel="nofollow noopener noreferrer">https://little-hands.hatenablog.com/entry/2019/12/13/problem-solving-5layer</a></p> <h2 id="%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9F%E6%96%BD%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0" data-line="166" class="code-line"> <a class="header-anchor-link" href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9F%E6%96%BD%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0" aria-hidden="true"></a> リファクタリングの実施タイミング</h2> <p data-line="168" class="code-line">リファクタリングを効果的に行うためには、適切なタイミングを組み合わせることが重要です。ここでは、リファクタリングの主要なタイミングを4つ紹介します。①→④の順にコストが低く、頻繁に実施を検討できると良いものになります。</p> <h3 id="%E2%91%A0%E6%A9%9F%E8%83%BD%E9%96%8B%E7%99%BA%E4%B8%AD" data-line="170" class="code-line"> <a class="header-anchor-link" href="#%E2%91%A0%E6%A9%9F%E8%83%BD%E9%96%8B%E7%99%BA%E4%B8%AD" aria-hidden="true"></a> ①機能開発中</h3> <p data-line="172" class="code-line">ブランチを切って、mainブランチにマージをするまでは常にリファクタリングチャンスです。Martin Fowlerも"Refactoring is a part of day-to-day programming(リファクタリングは日々のプログラミングの一部だ)"と言っています。</p> <p data-line="174" class="code-line">参考:<br style="display:none"> <span class="embed-block zenn-embedded zenn-embedded-card"><iframe id="zenn-embedded__82b3bcd272565" src="https://embed.zenn.studio/card#zenn-embedded__82b3bcd272565" data-content="https%3A%2F%2Frefactoring.com" frameborder="0" scrolling="no" loading="lazy"></iframe></span><a href="https://refactoring.com" style="display:none" target="_blank" rel="nofollow noopener noreferrer">https://refactoring.com</a></p> <p data-line="177" class="code-line">リファクタリングされた状態のコードでプルリクエストを作成することにより、レビューやテストのコストが削減できますし、保守性が高い状態で今後の開発を実施できます。</p> <p data-line="179" class="code-line"><strong>実施のポイント</strong><br> 実施するべきタイミングは、新しいコードを書きながら修正案が思いついた時、関数を定義してユニットテストを書いた後、プルリクエストを作成して見直している時…など、いつでもです。常にリファクタリングできる余地はないか検討しましょう。</p> <p data-line="182" class="code-line">ただし、これは日々の開発の中で自然に実施しやすいので、「リファクタリングの時間を確保できない」と話題になるのは、次のパターン以降かと思います。</p> <h3 id="%E2%91%A1%E6%A9%9F%E8%83%BD%E6%8B%A1%E5%BC%B5%E3%82%92%E3%81%99%E3%82%8B%22%E7%9B%B4%E5%89%8D%22" data-line="184" class="code-line"> <a class="header-anchor-link" href="#%E2%91%A1%E6%A9%9F%E8%83%BD%E6%8B%A1%E5%BC%B5%E3%82%92%E3%81%99%E3%82%8B%22%E7%9B%B4%E5%89%8D%22" aria-hidden="true"></a> ②機能拡張をする"直前"</h3> <p data-line="186" class="code-line">機能拡張する<strong>直前</strong>に、修正対象のコードをリファクタリングすることで、目前の開発の拡張容易性、テスト容易性を高めます。</p> <p data-line="188" class="code-line">メリットとしては、リファクタリングのコストに対して、定性的なリターンが明確ですぐに得られるため、必要性がわかりやすいという点です。③④に比べて、開発作業の一環とみなしやすいので、いちいち許可を取らなくても実施しやすいかと思います。(これが難しい現場もあもしれませんが…)</p> <p data-line="190" class="code-line"><strong>実施のポイント</strong><br> <strong>リファクタリングの修正だけで先にテストし、マージする</strong> ようにしましょう。<br> これは、修正の差分を小さくしてレビューしやすくするため、そしてテスト範囲を限定するためです。</p> <p data-line="194" class="code-line">この事前のリファクタを「必要な手順」と考え、その前提で見積もり・計画するようにできると理想的です。<br> 時間短縮のために、テストしないでいいですか?とはなりませんよね。リリースのために必要な手順だからです。リファクタリングも同じで、それが必要な手順だと強い気持ちで思えるかが大切です。そう思うためには、このパターンのリファクタリングの成功体験を積み、「リターンとコストが見合っている」と自分の中で納得しておくことが必要です。</p> <h3 id="%E2%91%A2%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%81%A8%E3%81%97%E3%81%A6%E7%A9%8D%E3%82%80" data-line="197" class="code-line"> <a class="header-anchor-link" href="#%E2%91%A2%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%81%A8%E3%81%97%E3%81%A6%E7%A9%8D%E3%82%80" aria-hidden="true"></a> ③リファクタリングをバックログアイテムとして積む</h3> <p data-line="199" class="code-line">リファクタリングや、少しスコープを広げて技術的負債解消等をバックログアイテムとして蓄積し、優先順位をつけて対応していきます。</p> <p data-line="201" class="code-line">必要コストを扱いやすくするために、規模の相対見積もりでざっくりと数値化するのがおすすめです。コスト数値化の表現はストーリーポイントのような形でもいいですし、Tシャツサイズ見積(S/M/L)でも良いでしょう。</p> <p data-line="203" class="code-line">参考:<br style="display:none"> <span class="embed-block zenn-embedded zenn-embedded-card"><iframe id="zenn-embedded__96a2830b4150b" src="https://embed.zenn.studio/card#zenn-embedded__96a2830b4150b" data-content="https%3A%2F%2Fasana.com%2Fja%2Fresources%2Fstory-points" frameborder="0" scrolling="no" loading="lazy"></iframe></span><a href="https://asana.com/ja/resources/story-points" style="display:none" target="_blank" rel="nofollow noopener noreferrer">https://asana.com/ja/resources/story-points</a><br style="display:none"> <span class="embed-block zenn-embedded zenn-embedded-card"><iframe id="zenn-embedded__e5901be3025c2" src="https://embed.zenn.studio/card#zenn-embedded__e5901be3025c2" data-content="https%3A%2F%2Fasana.com%2Fja%2Fresources%2Ft-shirt-sizing" frameborder="0" scrolling="no" loading="lazy"></iframe></span><a href="https://asana.com/ja/resources/t-shirt-sizing" style="display:none" target="_blank" rel="nofollow noopener noreferrer">https://asana.com/ja/resources/t-shirt-sizing</a></p> <p data-line="207" class="code-line"><strong>実施のポイント</strong><br> このパターンでの実施時には、プロダクトオーナーやプロダクトマネージャー(以下POと表記)と同意が必要になることが多いでしょう。この同意を取るパターンとして2つ考えられます。</p> <ol data-line="210" class="code-line"> <li data-line="210" class="code-line">バックログアイテムごとに価値を説明して、都度POと同意を取る</li> <li data-line="211" class="code-line">一定期間ごとにどれくらいのコストをリファクタリングに時間を投資するかをPOと合意し、あとはエンジニア内で決定する</li> </ol> <p data-line="213" class="code-line">まずは小さく1から始めると良いでしょう。リターンとコストを意識して議論をする習慣づけにもなります。</p> <p data-line="215" class="code-line">そこからステップを進め「月当たりこれくらいのコスト(時間やストーリーポイント等)を投資します」とPOと同意できると、あとはエンジニア内で解決ができます。ここは大きなハードルがありますが、「リファクタリングしたら、それ以降の開発の速度や品質が上がった」という成功体験をPOと一緒に積み、「必要性はわかった、あとの時間の使い方は任せる」となれると理想的です。</p> <p data-line="217" class="code-line">リターンを非エンジニアにわかるように示して議論するのはコストがかかるので、パターン2までいけると全体としての効率は良くなりますし、リファクタリングが開発サイクルに組み込まれるので大きな進化だと言えます。</p> <p data-line="219" class="code-line">この詳細は、以前にスライドを作成したのでこちらをご覧ください。</p> <p data-line="221" class="code-line"><span class="embed-block zenn-embedded zenn-embedded-card"><iframe id="zenn-embedded__43a2b661202e5" src="https://embed.zenn.studio/card#zenn-embedded__43a2b661202e5" data-content="https%3A%2F%2Fwww.slideshare.net%2Fslideshow%2Fss-243097467%2F243097467" frameborder="0" scrolling="no" loading="lazy"></iframe></span><a href="https://www.slideshare.net/slideshow/ss-243097467/243097467" style="display:none" target="_blank" rel="nofollow noopener noreferrer">https://www.slideshare.net/slideshow/ss-243097467/243097467</a></p> <h3 id="%E2%91%A3%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%8C%96%E3%81%99%E3%82%8B" data-line="223" class="code-line"> <a class="header-anchor-link" href="#%E2%91%A3%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%8C%96%E3%81%99%E3%82%8B" aria-hidden="true"></a> ④リファクタリングをプロジェクト化する</h3> <p data-line="225" class="code-line">リファクタリングを独立したプロジェクトとして計画し、リソースを割り当てて集中的に取り組みます。大きくなると、リアーキテクチャと呼ばれるようなものにもなる場合もあります。</p> <p data-line="227" class="code-line">コードの複雑度が高まりすぎて、こまめな改善では追いつかない、と言った場合にこの手段が必要になることがあります。影響範囲が大きい分、大きなコストで大きなリターンが得られることがありますが、その分難易度も上がり、失敗リスクも高まります。</p> <p data-line="229" class="code-line"><strong>実施のポイント</strong><br> 「リターンとコストを見合うかを検討」は同じなのですが、規模が大きくなる場合は <strong>ビッグバンリリースにしないようにする</strong> (=最後に1回だけの大きなリリースにしないようにする)ことが非常に重要になります。</p> <p data-line="232" class="code-line">リファクタリングの修正範囲や期間が大きくなると、その分影響するコードを修正できなくなり、その範囲の開発が止まってしまいます。また、修正が大きくなるほど、バグを混入するリスクは高まります。<br> さらに、期間が伸びるほど遅延リスクも増え、期間に間に合わせようとまた保守性の低いコードを書くという悪循環も生まれてしまいます。</p> <p data-line="235" class="code-line">そのため、<strong>とにかく小さく修正して、小さくマージ、リリースできないかを検討します。</strong> どうしても難しいこともあると思いますが、それでも知恵を絞ります。ストラングラーフィグパターン、というのものもあるので参考にしてみてください。</p> <p data-line="237" class="code-line"><span class="embed-block zenn-embedded zenn-embedded-card"><iframe id="zenn-embedded__6c633394a39a3" src="https://embed.zenn.studio/card#zenn-embedded__6c633394a39a3" data-content="https%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Fazure%2Farchitecture%2Fpatterns%2Fstrangler-fig" frameborder="0" scrolling="no" loading="lazy"></iframe></span><a href="https://learn.microsoft.com/ja-jp/azure/architecture/patterns/strangler-fig" style="display:none" target="_blank" rel="nofollow noopener noreferrer">https://learn.microsoft.com/ja-jp/azure/architecture/patterns/strangler-fig</a></p> <h3 id="%E5%AE%9F%E6%96%BD%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B04%E3%81%A4%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81" data-line="240" class="code-line"> <a class="header-anchor-link" href="#%E5%AE%9F%E6%96%BD%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B04%E3%81%A4%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81" aria-hidden="true"></a> 実施タイミング4つパターンのまとめ</h3> <p data-line="242" class="code-line">これら4つのリファクタリングタイミングは、互いに排他的ではありません。プロジェクトの状況に応じて、適切なアプローチを選択し、組み合わせることが重要です。</p> <p data-line="244" class="code-line">ですが、「リファクタリングは日々のプログラミングの一部」となるように、まずはコストの小さい①、②からチャンスを伺っていきましょう。</p> <p data-line="246" class="code-line">日々の積み重ねで保守性は維持されるとともに、リファクタリングの成功体験を組織として積むことで、より大きなリファクタリングにも着手できるようになっていきます。</p> <h2 id="%E3%81%BE%E3%81%A8%E3%82%81" data-line="249" class="code-line"> <a class="header-anchor-link" href="#%E3%81%BE%E3%81%A8%E3%82%81" aria-hidden="true"></a> まとめ</h2> <p data-line="251" class="code-line">ポイントをおさらいします。</p> <ul data-line="253" class="code-line"> <li data-line="253" class="code-line">「リファクタリングとは、生産性と品質改善のための投資」だと認識する。</li> <li data-line="254" class="code-line">常にリターンとコストを見極めて判断する癖をつける。</li> <li data-line="255" class="code-line">4つのリファクタリングタイミングを使い分ける。</li> <li data-line="256" class="code-line">常にリファクタリングチャンスを探し、日々改善を積み上げる。</li> <li data-line="257" class="code-line">組織として成功体験を積み、大きくしていく</li> </ul> <p data-line="259" class="code-line">以上を踏まえて、より良い開発を進めていきましょう!</p> </div></div><div class="View_actions__s_UJk" id="share"><div class="LikeButton_container__YlckE style-large"><button aria-label="いいね" class="LikeButton_button__ZwdG4"><svg class="LikeButton_svgLike__Gl0Sz" viewBox="0 0 110 110"><path class="LikeButton_svgLikeLine__f9txR" d="M73,24a23.78,23.78,0,0,0-15.89,6.19,3.14,3.14,0,0,1-4.18,0A23.81,23.81,0,0,0,37,24a22,22,0,0,0-22,22c0,16.67,19.64,32.82,25.11,37.93,2.84,2.65,6.15,5.64,8.92,8.13a8.9,8.9,0,0,0,11.9,0c2.77-2.49,6.07-5.48,8.91-8.13C75.37,78.81,95,62.66,95,46A22,22,0,0,0,73,24Z" fill="currentColor"></path><path class="LikeButton_svgLikeInner__uiexS" d="M66.25,76.42c-.71.64-1.32,1.2-1.82,1.67-2.51,2.33-5.39,5-7.94,7.25a2.21,2.21,0,0,1-3,0C51,83,48.1,80.42,45.59,78.09c-.5-.47-1.12-1-1.82-1.67C38.09,71.29,23,57.67,23,46A14,14,0,0,1,37,32a15.92,15.92,0,0,1,11.65,5.23l4.73,5a2.2,2.2,0,0,0,3.23,0l4.72-5A16.06,16.06,0,0,1,73,32,14,14,0,0,1,87,46C87,57.67,71.93,71.29,66.25,76.42Z" fill="currentColor"></path><g class="LikeButton_svgLikeDecoration__78UjB"><circle cx="41.5" cy="9.5" fill="#3ea8ff" r="3.5"></circle><circle cx="98.5" cy="26.5" fill="#ffdc6e" r="3.5"></circle><circle cx="13" cy="19" fill="#c067f4" r="5"></circle><circle cx="77" cy="9" fill="#f76685" r="5"></circle><circle cx="26.5" cy="92.5" fill="#f76685" r="3.5"></circle><circle cx="105.5" cy="48.5" fill="#c067f4" r="3.5"></circle><circle cx="4.5" cy="60.5" fill="#3ea8ff" r="3.5"></circle><circle cx="94.5" cy="73.5" fill="#3ea8ff" r="1.5"></circle><circle cx="16.5" cy="75.5" fill="#ffdc6e" r="1.5"></circle><circle cx="78.5" cy="91.5" fill="#ffdc6e" r="1.5"></circle></g></svg></button></div><div class="View_menu__wgMxq"><button aria-label="その他の操作" class="PopoverMenuButton_menuButton__hKCa_"><svg viewBox="0 0 27 27" height="16" width="16"><path fill="currentColor" d="M12.74,20.53,3.48,11.35a.75.75,0,0,1,0-1.07L4.71,9.05a.75.75,0,0,1,1.07,0l7.49,7.41,7.49-7.41a.74.74,0,0,1,1.06,0l1.24,1.23a.77.77,0,0,1,0,1.07L13.8,20.53A.74.74,0,0,1,12.74,20.53Z"></path></svg></button></div><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a aria-label="X(Twitter)にポスト" class="ShareButtonsExperimental_button__d9aXF ShareButtonsExperimental_svgTwitterHorizontal__5xDGM ShareButtonsExperimental_svgTwitterBase__8FrNq" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://twitter.com/intent/tweet?url=https://zenn.dev/loglass/articles/961e283e6fbe71&amp;text=%E3%80%8C%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E6%99%82%E9%96%93%E3%80%8D%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93%EF%BD%9Clittle_hands(%E6%9D%BE%E5%B2%A1%40%20Loglass)&amp;hashtags=zenn" id="gtm-article-footer-tweet" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="27" height="28" viewBox="0 0 27 28" fill="none"><g clip-path="url(#clip0_1_18)"><path d="M16.0687 11.7356L26.12 0H23.7382L15.0106 10.1899L8.03988 0H0L10.5411 15.4089L0 27.7155H2.38199L11.5985 16.9546L18.9601 27.7155H27L16.0681 11.7356H16.0687ZM12.8062 15.5447L11.7382 14.0103L3.24025 1.80106H6.89884L13.7568 11.6543L14.8248 13.1887L23.7393 25.9963H20.0807L12.8062 15.5452V15.5447Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1_18"><rect width="27" height="27.7297" fill="white"></rect></clipPath></defs></svg></a><a aria-label="Facebookに投稿" class="ShareButtonsExperimental_button__d9aXF ShareButtonsExperimental_svgFacebookHorizontal__MpfBm ShareButtonsExperimental_svgFacebookBase___gDOW" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="http://www.facebook.com/sharer.php?u=https://zenn.dev/loglass/articles/961e283e6fbe71" id="gtm-article-footer-facebook" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="28" height="29" viewBox="0 0 28 29" fill="none"><g clip-path="url(#clip0_2_21)"><path d="M28 14.7812C28 7.02084 21.7319 0.729736 14 0.729736C6.26808 0.729736 0 7.02084 0 14.7812C0 21.3707 4.52032 26.9002 10.6182 28.4189V19.0753H7.73136V14.7812H10.6182V12.9309C10.6182 8.14833 12.7747 5.93158 17.453 5.93158C18.34 5.93158 19.8705 6.10637 20.4966 6.28061V10.1729C20.1662 10.138 19.5922 10.1206 18.8793 10.1206C16.5838 10.1206 15.6968 10.9935 15.6968 13.2625V14.7812H20.2698L19.4841 19.0753H15.6968V28.7297C22.629 27.8895 28.0006 21.9654 28.0006 14.7812H28Z" fill="currentColor"></path></g><defs><clipPath id="clip0_2_21"><rect width="28" height="28" fill="white" transform="translate(0 0.729736)"></rect></clipPath></defs></svg></a><a aria-label="はてなブックマークに登録" class="ShareButtonsExperimental_button__d9aXF ShareButtonsExperimental_svgHatenaBookmarkHorizontal__ccpWn ShareButtonsExperimental_svgHatenaBookmarkBase__VXz6p" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://b.hatena.ne.jp/add?mode=confirm&amp;url=https://zenn.dev/loglass/articles/961e283e6fbe71&amp;title=%E3%80%8C%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E6%99%82%E9%96%93%E3%80%8D%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93%EF%BD%9Clittle_hands(%E6%9D%BE%E5%B2%A1%40Loglass)" id="gtm-article-footer-hatena-bookmark" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="27" height="28" viewBox="0 0 27 28" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.4999 0.729736H21.5001C24.5376 0.729736 27 3.19213 27 6.22964V22.2298C27 25.2673 24.5376 27.7297 21.5001 27.7297H5.4999C2.46239 27.7297 0 25.2673 0 22.2298V6.22964C0 3.19213 2.46239 0.729736 5.4999 0.729736ZM12.98 13.7472C13.8521 13.8136 14.5319 14.1209 15.0212 14.6673V14.6679C15.512 15.2127 15.7572 15.9444 15.7572 16.8543C15.7572 17.5126 15.62 18.0877 15.3436 18.5867C15.0692 19.084 14.6756 19.4712 14.1604 19.7433C13.7441 19.9658 13.2289 20.1278 12.6155 20.2245C12.001 20.3179 10.9966 20.3665 9.6039 20.3665H6.13656V8.09392H9.50184C10.8859 8.09392 11.8503 8.13875 12.4016 8.22623C12.9503 8.31695 13.4206 8.4703 13.8164 8.68792C14.269 8.93902 14.6129 9.27437 14.8527 9.69341C15.0865 10.1151 15.2069 10.6028 15.2069 11.1546C15.2069 11.8512 15.0309 12.4053 14.6761 12.813C14.3197 13.2261 13.756 13.5355 12.98 13.7472ZM9.96192 10.8144H9.24372H9.24318V13.2768H9.91116C10.7352 13.2768 11.2984 13.1856 11.6073 13.0058C11.9124 12.8227 12.0663 12.5273 12.0663 12.0667C12.0663 11.6061 11.9216 11.2821 11.6375 11.0947C11.3497 10.9084 10.7919 10.8144 9.96192 10.8144ZM10.4128 18.1514C11.2028 18.1514 11.7661 18.0531 12.0928 17.8523V17.8528C12.4227 17.653 12.5863 17.3209 12.5863 16.8581C12.5863 16.3408 12.4367 15.9806 12.1338 15.7765C11.8357 15.5724 11.2747 15.4703 10.463 15.4703H9.24372V18.1514H10.4128ZM19.3093 17.257C18.4502 17.257 17.7547 17.9525 17.7547 18.8111C17.7547 19.6697 18.4507 20.3658 19.3093 20.3658C20.1679 20.3658 20.8634 19.6697 20.8634 18.8111C20.8634 17.9525 20.1668 17.257 19.3093 17.257ZM17.9593 8.09318H20.6593V16.2753H17.9593V8.09318Z" fill="currentColor"></path></svg></a></div></div><span style="display:block;height:2rem;flex-shrink:0"></span><aside class="View_authorInfo__F19rR"><div class="ProfileCard_container__YfvQl"><a class="ProfileCard_avatar__tIJpR" href="/little_hand_s"><img alt="little_hands(松岡@Loglass)" class="AvatarImage_plain__Fgp4R " height="80" loading="lazy" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/01640dad61.jpeg" width="80"/></a><div class="ProfileCard_name__qXamf"><a class="ProfileCard_displayName__gRUeY" href="/little_hand_s">little_hands(松岡@Loglass)</a></div><div class="ProfileCard_content__1w905"><p class="Paragraph_common__yRSrj Paragraph_sidenote__9NTjJ Paragraph_decorateLink__aIAFh"><span>DDDや設計にお困りの方はDMにてご相談ください。講義、モブモデリングやコーディングなどご要望に合わせた進め方でサポートします(オンライン)。 YouTube: <a href="https://youtube.com/channel/UCbHtbIUxtfGjrDy1WcqxExw" target="_blank" rel="nofollow noopener noreferrer">youtube.com/channel/UCbHtbIUxtfGjrDy1WcqxExw</a></span></p><div class="ProfileCard_actions__2ZjZ8"><span class="ProfileCard_follow__ng60N"></span><a aria-label="@little_hand_s" class="ProfileCard_twitterLink__l4sOK ProfileCard_linkBase__hVELe" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://twitter.com/little_hand_s" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="27" height="28" viewBox="0 0 27 28" fill="none" aria-label="X(Twitter)"><g clip-path="url(#clip0_1_18)"><path d="M16.0687 11.7356L26.12 0H23.7382L15.0106 10.1899L8.03988 0H0L10.5411 15.4089L0 27.7155H2.38199L11.5985 16.9546L18.9601 27.7155H27L16.0681 11.7356H16.0687ZM12.8062 15.5447L11.7382 14.0103L3.24025 1.80106H6.89884L13.7568 11.6543L14.8248 13.1887L23.7393 25.9963H20.0807L12.8062 15.5452V15.5447Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1_18"><rect width="27" height="27.7297" fill="white"></rect></clipPath></defs></svg></a><a aria-label="little-hands.hatenablog.com" class="ProfileCard_link__oexkj ProfileCard_linkBase__hVELe" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://little-hands.hatenablog.com/" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg x="0px" y="0px" viewBox="0 0 27 27" style="enable-background:new 0 0 27 27" xml:space="preserve" aria-label="リンク"><path fill="currentColor" d="M9.6,23.9c-3.6,0-6.5-3-6.5-6.6c0-1.7,0.7-3.4,1.9-4.6l2.3-2.3c0.5-0.4,1.2-0.4,1.6,0.1c0.4,0.4,0.4,1,0,1.5l-2.3,2.3 c-1.7,1.7-1.7,4.4,0,6.1s4.4,1.7,6.1,0l2.3-2.3c0.5-0.4,1.2-0.4,1.6,0.1c0.4,0.4,0.4,1,0,1.5L14.3,22C13,23.2,11.4,23.9,9.6,23.9z M10.6,17.5c-0.6,0-1.1-0.5-1.1-1.1c0-0.3,0.1-0.6,0.3-0.8l5.8-5.8c0.4-0.4,1.1-0.4,1.6,0c0.4,0.4,0.4,1.1,0,1.6l-5.8,5.8 C11.2,17.4,10.9,17.5,10.6,17.5z M18.9,16.9c-0.3,0-0.6-0.1-0.8-0.3c-0.4-0.4-0.4-1.1,0-1.6l2.3-2.3c1.7-1.7,1.7-4.4,0-6.1 c-1.7-1.7-4.4-1.7-6.1,0L12,8.9c-0.5,0.4-1.2,0.4-1.6-0.1c-0.4-0.4-0.4-1,0-1.5L12.7,5c2.6-2.6,6.7-2.6,9.2,0s2.6,6.7,0,9.2 l-2.3,2.4C19.4,16.8,19.1,16.9,18.9,16.9z"></path></svg></a></div></div></div></aside><div class="View_publicationInfo__MKZ62"><div class="ProfileCard_container__YfvQl"><a class="ProfileCard_avatar__tIJpR" href="/p/loglass"><img alt="株式会社ログラス テックブログ" class="AvatarImage_plain__Fgp4R AvatarImage_withPublication__hNtIe" height="80" loading="lazy" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/4e5d8e4cf8.jpeg" width="80"/></a><div class="ProfileCard_name__qXamf"><a class="ProfileCard_displayName__gRUeY" href="/p/loglass">株式会社ログラス テックブログ</a><span><a class="PublicationLabelLink_link__JBqs2" href="/faq#what-is-publication">Publication</a></span></div><div class="ProfileCard_content__1w905"><p class="Paragraph_common__yRSrj Paragraph_sidenote__9NTjJ Paragraph_decorateLink__aIAFh"><span>株式会社ログラスは「良い景気を作ろう。」をミッションに、企業経営を推進する次世代型経営管理クラウド「Loglass 経営管理」を開発し提供しています。</span></p><div class="ProfileCard_actions__2ZjZ8"><span class="ProfileCard_follow__ng60N"></span><a aria-label="@loglassprdteam" class="ProfileCard_twitterLink__l4sOK ProfileCard_linkBase__hVELe" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://twitter.com/loglassprdteam" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="27" height="28" viewBox="0 0 27 28" fill="none" aria-label="X(Twitter)"><g clip-path="url(#clip0_1_18)"><path d="M16.0687 11.7356L26.12 0H23.7382L15.0106 10.1899L8.03988 0H0L10.5411 15.4089L0 27.7155H2.38199L11.5985 16.9546L18.9601 27.7155H27L16.0681 11.7356H16.0687ZM12.8062 15.5447L11.7382 14.0103L3.24025 1.80106H6.89884L13.7568 11.6543L14.8248 13.1887L23.7393 25.9963H20.0807L12.8062 15.5452V15.5447Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1_18"><rect width="27" height="27.7297" fill="white"></rect></clipPath></defs></svg></a></div></div></div></div><span style="display:block;height:2rem;flex-shrink:0"></span><aside class="SendBadgeCta_container__peDjp"><div class="SendBadgeCta_content__FGxIx"><div class="SendBadgeCta_title__NFpA3">バッジを贈って著者を応援しよう</div><span style="display:block;height:0.5rem;flex-shrink:0"></span><p class="Paragraph_common__yRSrj Paragraph_sidenote-sm__zfJpo">バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。</p><div class="SendBadgeCta_buttonContainer__5_7_u"><button class="Button_primary__VcoA9 Button_baseStyle__Vhn6Y Button_large__jO0IW Button_fontBold__BN6Co">バッジを贈る</button></div></div><svg viewBox="0 0 318 451" fill="currentColor" class="SendBadgeCta_icon__mcUsF"><path d="M175.12,41.58V13.2a8.87,8.87,0,0,0-17.73.6V41.58a8.87,8.87,0,1,0,17.73.6Z"></path><path d="M75,44.52,94.62,64.17c.1.11.21.22.32.32a8.87,8.87,0,0,0,12.18-12.86L87.52,32A8.87,8.87,0,0,0,75,44.52Z"></path><path d="M253.56,44.52A8.87,8.87,0,0,0,241,32L221.37,51.63,221,52A8.87,8.87,0,0,0,233.9,64.17h0Z"></path><path d="M18.06,262.07a28.08,28.08,0,0,0-.7,39.08l22.55,27.78,12.58,15.5,32.78,40.4A24.72,24.72,0,0,0,104.53,394H203a35.83,35.83,0,0,1,15.13,3.36,8,8,0,0,0,9-1.68h0a8.09,8.09,0,0,0-2.2-13h0a46,46,0,0,0-19.6-4.4H104.57a9.06,9.06,0,0,1-7.08-3.37L72.76,344.4,58.37,326.68l-.72-.89L39.91,303.93,29.32,290.42h0a12.35,12.35,0,0,1,0-17.46,10.33,10.33,0,0,1,1.43-1.2,12.1,12.1,0,0,1,4.76-2.15h.17a12.73,12.73,0,0,1,2.06-.21H38a12.47,12.47,0,0,1,3.53.52l.71.23c.23.08.45.18.68.27h0A12.55,12.55,0,0,1,46.76,273l11,10.68,14,13.53,21.88,21.13a23.65,23.65,0,0,0-.56,2.63,8.77,8.77,0,0,0-.21,1.6l-.06.84v3.51a3.31,3.31,0,0,1,0,.62,2.53,2.53,0,0,0,0,.55,1.79,1.79,0,0,0,.07.62c.07.18,0,.33.07.54s.08.42.1.62l.09.54.12.61.12.53a2.93,2.93,0,0,0,.15.6c0,.18.09.33.14.53s.12.43.17.6l.16.52c.06.19.13.42.19.59s.12.34.19.51l.21.58.21.51.24.57c.07.17.15.31.23.5s.17.37.26.55l.25.51.28.53.28.5.3.52.3.49c.11.16.21.33.32.5l.33.48.33.49c.12.16.24.31.35.47l.36.47.37.47c.13.14.24.28.37.44s.33.37.41.46.15.18.23.26l.15.17.43.45.4.4.46.44.4.38.5.43.41.36.53.42.42.33.56.41.42.31.61.4.41.27.66.4.4.24.72.39.38.2.8.4.33.16.94.4.23.1c.79.33,1.61.62,2.45.88a26.76,26.76,0,0,0,5.83,1.08,21.47,21.47,0,0,0,2.78.11H184.7l.48-.07.28-.06.43-.11.28-.09.42-.15.25-.11a2.93,2.93,0,0,0,.44-.21l.21-.1c.2-.11.4-.23.59-.36l.17-.12.38-.29c.2-.16.4-.34.59-.52h0c.19-.19.38-.4.56-.61l.11-.15c.13-.17.25-.35.37-.52l.15-.23.27-.49.13-.26.21-.49a.45.45,0,0,1,.1-.3,1.7,1.7,0,0,0,.16-.51,1.06,1.06,0,0,1,.07-.3c.05-.2.08-.39.11-.58v-.26a6.31,6.31,0,0,0,0-.87,10.7,10.7,0,0,0-.11-1.27,7.87,7.87,0,0,0-7.76-6.6H120.77a12.35,12.35,0,0,1-12.3-13.57,5.65,5.65,0,0,1,.16-1.07v-.23c.07-.33.15-.67.25-1h0c.11-.36.23-.68.36-1a.94.94,0,0,1,.1-.23c.12-.29.26-.58.41-.86v-.07c.16-.3.34-.58.52-.86l.16-.24.15-.22c.12-.17.25-.33.37-.48l.08-.11c.21-.25.43-.5.66-.74l.19-.19c.22-.22.44-.43.68-.63l.06-.06c.26-.22.52-.42.8-.62l.21-.15c.26-.18.53-.36.8-.52h.06c.29-.17.59-.32.9-.47l.24-.12c.29-.13.59-.26.89-.37h.07c.35-.12.67-.22,1-.31l.27-.08c.36-.08.67-.16,1-.22h.07a4.73,4.73,0,0,1,1-.14h65.95a46.51,46.51,0,0,0,12.79-1.77,43.8,43.8,0,0,0,4.85-1.75h.09c.76-.34,1.51-.69,2.25-1.07a62.92,62.92,0,0,1,29.3-7.17h3.1l1.45.08.93.08a11.73,11.73,0,0,1,1.33.12l1,.11.94.11.38.06.87.13,1.32.21.91.17,1.28.25.91.2,1.26.3.91.22,1.24.34.9.25,1.28.39.83.27c.59.19,1.17.39,1.75.6l1.25.47c.31.12.63.23.94.36H260c.89.35,1.75.72,2.62,1.1l.44.21c.71.32,1.4.66,2.09,1l.68.32c.67.36,1.34.71,2,1.08l.47.26c.81.41,1.62.92,2.41,1.41l.42.27c.64.39,1.28.81,1.91,1.23l.67.46c.58.4,1.16.81,1.73,1.23l.54.39c.73.55,1.46,1.11,2.16,1.69l.38.31c.58.47,1.15,1,1.72,1.47l.63.56c.48.46,1,.92,1.48,1.38l.55.53c.23.24,1.5,1.75,3,3.55a5.2,5.2,0,0,0,.51.55,8,8,0,0,0,11.31,0h0a8,8,0,0,0,.36-11q-1.08-1.23-2.22-2.43c-1.68-1.73-3.43-3.39-5.25-5V207.16h7a8.88,8.88,0,0,0,8.87-8.86V152.38a8.88,8.88,0,0,0-8.87-8.87H284.85c5.62-15,1.68-32.58-10.89-43.16a49.14,49.14,0,0,0-28.23-11.56c-20.31-1.46-44.09,12.21-58.31,24.38-1,.89-2.13,1.82-3.13,2.76h-38c-1-.94-2.14-1.87-3.14-2.76-14.22-12.16-38-25.84-58.33-24.38a49,49,0,0,0-28.24,11.56C44,110.93,40.12,128.51,45.69,143.51H32.91a8.88,8.88,0,0,0-8.86,8.87V198.3a8.85,8.85,0,0,0,8.86,8.86h7v46.77a20.38,20.38,0,0,0-2.06-.08A27.76,27.76,0,0,0,18.06,262ZM196,207.17h76.88v87.5c-1.46-.72-2.92-1.42-4.39-2.08a83.5,83.5,0,0,0-14.76-4.9,81.38,81.38,0,0,0-18.58-2.15,78.77,78.77,0,0,0-36.42,8.92,25.37,25.37,0,0,1-2.68,1.18Zm.05-45.91h92.74v28.17h-92.7Zm0-32c.9-.86,1.9-1.71,2.9-2.57,12-10.28,30.55-20.22,43.76-20.22.6,0,1.17.06,1.75.06a31.32,31.32,0,0,1,18.08,7.4c8.65,7.25,9.65,20.71,2.08,29.58H196.06Zm-43.71,4.42h26V297.39h-26Zm-17.78,9.86H66C58.4,134.68,59.41,121.22,68,114a31.34,31.34,0,0,1,18.09-7.47c13.28-1,33,9.41,45.5,20.16,1,.86,2,1.72,2.92,2.57ZM57.65,207.16h76.88v90.2H121.27A29,29,0,0,0,102,304.8l-19.1-18.45L57.69,262Zm-15.86-45.9h92.74v28.17H41.83Z"></path></svg></aside><span style="display:block;height:2rem;flex-shrink:0"></span></div></div><div id="discuss"><div class="ArticleComments_commentsContainer__kOO0n"><section class="ArticleComments_comments__y4Azs"><div class="ArticleComments_emptyContainer__I4fw6"><h3 class="Heading_size-lg__KD3Up Heading_centered__lNLF_">Discussion</h3><img class="ArticleComments_emptyImg__FGwCr" src="https://static.zenn.studio/images/drawing/discussion.png" width="300"/></div></section></div></div></section><aside class="View_sidebarContainer__YwcNH"><div class="ArticleSidebar_container__jSRJw"><div><div class="ArticleSidebar_user__vJ7nz ArticleSidebar_sidebarCard__AtM_Z"><div class="SidebarUserBio_container__iWemi"><a href="/little_hand_s"><img alt="little_hands(松岡@Loglass)" class="AvatarImage_border__pDIjF AvatarImage_plain__Fgp4R " height="60" loading="lazy" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/01640dad61.jpeg" width="60"/></a><div class="SidebarUserBio_author__cM7pP"><a class="SidebarUserBio_name__0zFdT" href="/little_hand_s">little_hands(松岡@Loglass)</a><div class="SidebarUserBio_actions__oFupD"><a class="SidebarUserBio_twitterLink__yGgDq SidebarUserBio_link__nnh24" href="https://twitter.com/little_hand_s" rel="nofollow noopener noreferrer" target="_blank"><span aria-label="@little_hand_s" data-tooltip-for-desktop="true" data-tooltip-position="bottom" role="tooltip"><svg width="27" height="28" viewBox="0 0 27 28" fill="none" aria-label="X(Twitter)"><g clip-path="url(#clip0_1_18)"><path d="M16.0687 11.7356L26.12 0H23.7382L15.0106 10.1899L8.03988 0H0L10.5411 15.4089L0 27.7155H2.38199L11.5985 16.9546L18.9601 27.7155H27L16.0681 11.7356H16.0687ZM12.8062 15.5447L11.7382 14.0103L3.24025 1.80106H6.89884L13.7568 11.6543L14.8248 13.1887L23.7393 25.9963H20.0807L12.8062 15.5452V15.5447Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1_18"><rect width="27" height="27.7297" fill="white"></rect></clipPath></defs></svg></span></a><a class="SidebarUserBio_link__nnh24" href="https://little-hands.hatenablog.com/" rel="nofollow noopener noreferrer" style="margin-left:-2px" target="_blank"><span aria-label="little-hands.hatenablog.com" data-tooltip-for-desktop="true" data-tooltip-position="bottom" role="tooltip"><svg x="0px" y="0px" viewBox="0 0 27 27" style="enable-background:new 0 0 27 27" xml:space="preserve" aria-label="リンク"><path fill="currentColor" d="M9.6,23.9c-3.6,0-6.5-3-6.5-6.6c0-1.7,0.7-3.4,1.9-4.6l2.3-2.3c0.5-0.4,1.2-0.4,1.6,0.1c0.4,0.4,0.4,1,0,1.5l-2.3,2.3 c-1.7,1.7-1.7,4.4,0,6.1s4.4,1.7,6.1,0l2.3-2.3c0.5-0.4,1.2-0.4,1.6,0.1c0.4,0.4,0.4,1,0,1.5L14.3,22C13,23.2,11.4,23.9,9.6,23.9z M10.6,17.5c-0.6,0-1.1-0.5-1.1-1.1c0-0.3,0.1-0.6,0.3-0.8l5.8-5.8c0.4-0.4,1.1-0.4,1.6,0c0.4,0.4,0.4,1.1,0,1.6l-5.8,5.8 C11.2,17.4,10.9,17.5,10.6,17.5z M18.9,16.9c-0.3,0-0.6-0.1-0.8-0.3c-0.4-0.4-0.4-1.1,0-1.6l2.3-2.3c1.7-1.7,1.7-4.4,0-6.1 c-1.7-1.7-4.4-1.7-6.1,0L12,8.9c-0.5,0.4-1.2,0.4-1.6-0.1c-0.4-0.4-0.4-1,0-1.5L12.7,5c2.6-2.6,6.7-2.6,9.2,0s2.6,6.7,0,9.2 l-2.3,2.4C19.4,16.8,19.1,16.9,18.9,16.9z"></path></svg></span></a></div></div></div><span style="display:block;height:1rem;flex-shrink:0"></span><p class="Paragraph_common__yRSrj Paragraph_description-sm__vmr99 Paragraph_decorateLink__aIAFh"><span>DDDや設計にお困りの方はDMにてご相談ください。講義、モブモデリングやコーディングなどご要望に合わせた進め方でサポートします(オンライン)。 YouTube: <a href="https://youtube.com/channel/UCbHtbIUxtfGjrDy1WcqxExw" target="_blank" rel="nofollow noopener noreferrer">youtube.com/channel/UCbHtbIUxtfGjrDy1WcqxExw</a></span></p><span style="display:block;height:1rem;flex-shrink:0"></span><button class="Button_primary__VcoA9 Button_baseStyle__Vhn6Y Button_full__RIG_z Button_large__jO0IW Button_fontBold__BN6Co">バッジを贈る</button><div class="ArticleSidebar_badgeAbout__Y3cIb"><a class="TextAnchor_anchorColoredSubtle__ZUESd TextAnchor_anchorColored__PlNnP ArticleSidebar_badgeAboutLink__aqdNT" href="/faq#badges">バッジを贈るとは<svg viewBox="0 0 24 24" fill="currentColor" class="TextAnchor_icon__1hdMx"><path d="M0 0h24v24H0z" fill="none"></path><path d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"></path></svg></a></div></div></div><span style="display:block;height:1.5rem;flex-shrink:0"></span><div class="ArticleSidebar_sticky__W61mq"><div style="display:flex;gap:1.5rem;flex-direction:column;align-items:stretch;flex-wrap:nowrap"><div class="ArticleSidebarToc_toc__dUPn8"><div class="ArticleSidebarToc_tocTitle__A3VjO">目次</div><div class="ArticleToc_toc__WF75u"><ol class="ol-depth-1"><li><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a><ol class="ol-depth-2"><li><a href="#%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81">ポイントまとめ</a></li></ol></li><li><a href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E6%99%82%E9%96%93%E7%A2%BA%E4%BF%9D%E3%81%AE%E9%9B%A3%E3%81%97%E3%81%95">リファクタリング時間確保の難しさ</a></li><li><a href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%81%A8%E3%81%9D%E3%81%AE%E7%9B%AE%E7%9A%84">リファクタリングの定義とその目的</a><ol class="ol-depth-2"><li><a href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%BF%85%E8%A6%81%E6%80%A7">リファクタリングの必要性</a></li></ol></li><li><a href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AB%E9%87%8D%E8%A6%81%E3%81%AA%E3%81%93%E3%81%A8">リファクタリングを行うために重要なこと</a></li><li><a href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E3%81%A9%E3%81%86%E8%80%83%E3%81%88%E3%82%8B%E3%81%8B">リファクタリングのリターンをどう考えるか</a><ol class="ol-depth-2"><li><a href="#%E4%BE%8B1%EF%BC%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0">例1:ファイルインポート機能のリファクタリング</a></li><li><a href="#%E4%BE%8B2%EF%BC%9A%E3%83%90%E3%82%B0%E3%81%8C%E5%A4%9A%E7%99%BA%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0">例2:バグが多発しているコードのリファクタリング</a></li><li><a href="#%E5%BF%85%E8%A6%81%E6%80%A7%E3%81%AE%E5%90%8C%E6%84%8F%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%84">必要性の同意におけるコツ</a></li></ol></li><li><a href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9F%E6%96%BD%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0">リファクタリングの実施タイミング</a><ol class="ol-depth-2"><li><a href="#%E2%91%A0%E6%A9%9F%E8%83%BD%E9%96%8B%E7%99%BA%E4%B8%AD">①機能開発中</a></li><li><a href="#%E2%91%A1%E6%A9%9F%E8%83%BD%E6%8B%A1%E5%BC%B5%E3%82%92%E3%81%99%E3%82%8B%22%E7%9B%B4%E5%89%8D%22">②機能拡張をする&quot;直前&quot;</a></li><li><a href="#%E2%91%A2%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%81%A8%E3%81%97%E3%81%A6%E7%A9%8D%E3%82%80">③リファクタリングをバックログアイテムとして積む</a></li><li><a href="#%E2%91%A3%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%8C%96%E3%81%99%E3%82%8B">④リファクタリングをプロジェクト化する</a></li><li><a href="#%E5%AE%9F%E6%96%BD%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B04%E3%81%A4%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81">実施タイミング4つパターンのまとめ</a></li></ol></li><li><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></li></ol></div></div></div></div></div></aside></div></div></div></div><div id="related-contents"></div></article><footer class="AppFooter_footer__pqSnY"><div class="Container_wide__ykGLh Container_common__figYY"><div class="AppFooter_inner__uGxbT" data-nosnippet="true"><div class="AppFooter_brandingColumn__BikTT"><a href="/"><svg x="0px" y="0px" viewBox="0 0 377.4 88.3" height="20" width="85"><title>Zenn</title><g fill="#111"><path d="M233,56.8h-39c0.5,3.5,2.2,6.8,4.8,9.2c2.7,2.3,6.2,3.5,9.8,3.4c2.8,0,5.6-0.5,8.2-1.7c2.5-1.1,4.8-2.8,6.5-5l8.2,9.5 c-2.5,3.4-5.7,6.1-9.5,7.9c-4.6,2.2-9.6,3.3-14.7,3.2c-5.7,0.1-11.4-1.2-16.5-4c-4.5-2.5-8.2-6.3-10.7-10.9s-3.8-9.8-3.7-15.1v-2.2 c-0.1-5.7,1.1-11.3,3.5-16.5c2.2-4.7,5.7-8.6,10.1-11.3c4.7-2.8,10.1-4.2,15.5-4.1c5.2-0.1,10.3,1.1,14.9,3.7 c4.1,2.5,7.4,6.2,9.4,10.5c2.2,5.1,3.3,10.5,3.2,16.1V56.8z M216.1,43.9c0.1-2.9-0.9-5.7-2.8-7.9c-1.8-1.9-4.4-2.9-7.9-2.9 c-2.9-0.1-5.8,1.1-7.7,3.2c-2,2.6-3.3,5.7-3.6,9h22V43.9z"></path><path d="M128.3,67.9h36.1v14.7h-56.9V72l35.8-54.3h-36.2V2.9h56.6v10.4L128.3,67.9z"></path><path d="M248.8,50.7c0-19.1,12.7-29.2,28.2-29.2s27.9,10.1,27.9,29.2V82h-16V51.4c0-10.6-4.8-16.1-12-16.1s-12.4,5.5-12.4,16.1 v30.7h-15.8L248.8,50.7L248.8,50.7z"></path><path d="M320.3,50.7c0-19.1,12.7-29.2,28.2-29.2s27.9,10.1,27.9,29.2V82h-16V51.4c0-10.6-4.8-16.1-12-16.1S336,40.8,336,51.4v30.7 h-15.8L320.3,50.7L320.3,50.7z"></path></g><path fill="#3EA8FF" class="st0" d="M2.4,83.3h17c0.9,0,1.7-0.5,2.2-1.2L68.4,5.2C69,4.2,68.3,3,67.1,3H51c-0.8,0-1.5,0.4-1.9,1.1L1.6,81.9 C1.3,82.5,1.7,83.3,2.4,83.3z"></path><path fill="#3EA8FF" class="st0" d="M61,82.1l22.1-35.5c0.7-1.1-0.1-2.5-1.4-2.5H65.7c-0.6,0-1.2,0.3-1.5,0.8L41.5,81.2c-0.6,0.9,0.1,2.1,1.2,2.1 h16.3C59.8,83.3,60.6,82.9,61,82.1z"></path></svg></a><p class="AppFooter_siteDescription__NWGP2">エンジニアのための<br aria-hidden="true"/>情報共有コミュニティ</p></div><div class="AppFooter_navColumns__ahV9g"><nav class="AppFooter_navColumn__47qTk"><h4 class="AppFooter_navColumnTitle__vVeiQ">About</h4><ul><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/about">Zennについて</a></div></li><li><a href="https://classmethod.jp" rel="nofollow noopener noreferrer" target="_blank">運営会社</a></li><li><a href="https://info.zenn.dev" rel="nofollow noopener noreferrer" target="_blank">お知らせ・リリース</a></li></ul></nav><nav class="AppFooter_navColumn__47qTk"><h4 class="AppFooter_navColumnTitle__vVeiQ">Guides</h4><ul><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/manual">使い方</a></div></li><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/biz-lp">法人向けメニュー</a><span class="NewLabel_newLabelSecondary__6Iy_T NewLabel_newLabel__Xva_r">New</span></div></li><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/publications">Publication / Pro</a></div></li><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/faq">よくある質問</a></div></li></ul></nav><nav class="AppFooter_navColumn__47qTk"><h4 class="AppFooter_navColumnTitle__vVeiQ">Links</h4><ul><li><a href="https://twitter.com/zenn_dev" rel="nofollow noopener noreferrer" target="_blank">X(Twitter)</a></li><li><a href="https://github.com/zenn-dev" rel="nofollow noopener noreferrer" target="_blank">GitHub</a></li><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/mediakit">メディアキット</a></div></li></ul></nav><nav class="AppFooter_navColumn__47qTk"><h4 class="AppFooter_navColumnTitle__vVeiQ">Legal</h4><ul><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/terms">利用規約</a></div></li><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/privacy">プライバシーポリシー</a></div></li><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/terms/transaction-law">特商法表記</a></div></li></ul></nav></div></div><div class="AppFooter_copyright__J_Jbe" data-nosnippet="true"><div class="AnnouncementPopUp_hiddenWrapper__ThDWT"><div aria-hidden="true" class="PopUp_popup__lIgfz AnnouncementPopUp_container__Pb5q2"><div></div></div></div><a href="https://classmethod.jp/"><img alt="Classmethod inc." height="25" loading="lazy" src="https://static.zenn.studio/images/classmethod-logo-small.svg" width="115"/></a></div></div></footer><div id="modal-portal"></div></div><script id="__NEXT_DATA__" type="application/json" nonce="Ii7g9Ux+jJc2Z5bqfHwOGYfjeUsLOE0l10V2vPO/GbY=">{"props":{"pageProps":{"article":{"id":298941,"postType":"Article","title":"「リファクタリングの時間」を確保する技術","slug":"961e283e6fbe71","commentsCount":0,"likedCount":248,"bookmarkedCount":0,"bodyLettersCount":7725,"articleType":"idea","emoji":"🏘️","isSuspendingPrivate":false,"publishedAt":"2024-12-11T08:00:05.888+09:00","bodyUpdatedAt":"2024-12-06T13:04:36.134+09:00","sourceRepoUpdatedAt":null,"pinned":false,"path":"/loglass/articles/961e283e6fbe71","bodyHtml":"\u003caside class=\"msg message\"\u003e\u003cspan class=\"msg-symbol\"\u003e!\u003c/span\u003e\u003cdiv class=\"msg-content\"\u003e\n\u003cp data-line=\"1\" class=\"code-line\"\u003eこの記事は \u003ca href=\"https://qiita.com/advent-calendar/2024/loglass\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003e株式会社ログラス Productチーム Advent Calendar 2024\u003c/a\u003e のシリーズ 2、11日目 の記事です。\u003c/p\u003e\n\u003c/div\u003e\u003c/aside\u003e\n\u003ch2 id=\"%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\" data-line=\"5\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\" aria-hidden=\"true\"\u003e\u003c/a\u003e はじめに\u003c/h2\u003e\n\u003cp data-line=\"7\" class=\"code-line\"\u003eソフトウェア開発において、リファクタリング、つまりコードの保守性を高める活動は、ソフトウェアの価値を高める上でとても大切ですよね。\u003cbr\u003e\nしかし、「リファクタリングの時間が確保できない」「リファクタリング実施のための同意が得られない」という話を耳にすることがあります。\u003c/p\u003e\n\u003cp data-line=\"10\" class=\"code-line\"\u003eリファクタリングは「絶対やった方がいいのは感覚としてはわかっている、でもその必要性ををうまく伝えられない」となりがちな性質があるのです。\u003c/p\u003e\n\u003cp data-line=\"12\" class=\"code-line\"\u003eこの記事では、リファクタリングの時間を確保するために、どんなことを考え、何をステークホルダーに伝え、具体的にどのようなタイミングで実施していくといいのか、について解説します。\u003c/p\u003e\n\u003ch3 id=\"%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81\" data-line=\"14\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81\" aria-hidden=\"true\"\u003e\u003c/a\u003e ポイントまとめ\u003c/h3\u003e\n\u003cp data-line=\"16\" class=\"code-line\"\u003eリファクタリング時間確保のポイントを端的に説明すると、以下の通りになります。\u003c/p\u003e\n\u003cul data-line=\"18\" class=\"code-line\"\u003e\n\u003cli data-line=\"18\" class=\"code-line\"\u003eリターンとコストを明らかにする\u003c/li\u003e\n\u003cli data-line=\"19\" class=\"code-line\"\u003e複数の実施パターンを選択肢として持ち、柔軟に選べるようにする。\u003c/li\u003e\n\u003cli data-line=\"20\" class=\"code-line\"\u003eその中でも、日頃の小さいリファクタリングで成功体験を積み、徐々に規模を大きくする\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-line=\"22\" class=\"code-line\"\u003eこれについて、順を追って解説していきます。\u003c/p\u003e\n\u003ch2 id=\"%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E6%99%82%E9%96%93%E7%A2%BA%E4%BF%9D%E3%81%AE%E9%9B%A3%E3%81%97%E3%81%95\" data-line=\"24\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E6%99%82%E9%96%93%E7%A2%BA%E4%BF%9D%E3%81%AE%E9%9B%A3%E3%81%97%E3%81%95\" aria-hidden=\"true\"\u003e\u003c/a\u003e リファクタリング時間確保の難しさ\u003c/h2\u003e\n\u003cp data-line=\"26\" class=\"code-line\"\u003eリファクタリング時間確保が難しいのはなぜでしょうか。その理由を一言で表現すると、\u003c/p\u003e\n\u003cp data-line=\"28\" class=\"code-line\"\u003e\u003cstrong\u003eリファクタリングは、かけるコストに対して得られるリターンがわかりにくいから\u003c/strong\u003e\u003c/p\u003e\n\u003cp data-line=\"30\" class=\"code-line\"\u003eに尽きます。\u003c/p\u003e\n\u003cp data-line=\"32\" class=\"code-line\"\u003e「10時間エンジニアの時間を投資すると、翌月から5時間ずつ開発工数が削減できますよ」\u003cbr\u003e\nと言われたら、非技術者でも「じゃあやろう、いつやる?」となるわけです。\u003cbr\u003e\nでは、そうならないのはなぜでしょうか?\u003c/p\u003e\n\u003cp data-line=\"36\" class=\"code-line\"\u003eリターンとコストのうち、コストに関しては、延べ時間である程度計算できるのでわかりやすいです。ここには不確実性があるので、不確実性を織り込んだ見積もりができれば議論することができます。\u003c/p\u003e\n\u003cp data-line=\"38\" class=\"code-line\"\u003e一方、難しいのはリターンですね。特に、定量的に価値を聞かれて答えに困る、という経験をお持ちの方はいらっしゃるのではないでしょうか。\u003c/p\u003e\n\u003cp data-line=\"40\" class=\"code-line\"\u003eここで大切なのは、\u003c/p\u003e\n\u003cp data-line=\"42\" class=\"code-line\"\u003e\u003cstrong\u003e「定量的に価値を測定できない」≠「価値がない」\u003c/strong\u003e\u003c/p\u003e\n\u003cp data-line=\"44\" class=\"code-line\"\u003eということです。\u003c/p\u003e\n\u003cp data-line=\"46\" class=\"code-line\"\u003e価値はあるが、測定しにくい。\u003c/p\u003e\n\u003cp data-line=\"48\" class=\"code-line\"\u003eそれがリファクタリングに本質的につきまとう課題なので、その前提でどうするかを考えていく必要があります。\u003c/p\u003e\n\u003ch2 id=\"%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%81%A8%E3%81%9D%E3%81%AE%E7%9B%AE%E7%9A%84\" data-line=\"50\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%81%A8%E3%81%9D%E3%81%AE%E7%9B%AE%E7%9A%84\" aria-hidden=\"true\"\u003e\u003c/a\u003e リファクタリングの定義とその目的\u003c/h2\u003e\n\u003cp data-line=\"52\" class=\"code-line\"\u003eまず、リファクタリングの定義と目的について確認しましょう。\u003c/p\u003e\n\u003cp data-line=\"54\" class=\"code-line\"\u003eリファクタリングとは、「ソフトウェアの内部構造を改善しつつ、外部から見た動作を変えない修正を加える行為」です。これにより、ソフトウェアの内部品質を向上させます。ソフトウェア品質特性で言うと、主に保守性を向上させることになります。\u003c/p\u003e\n\u003cp data-line=\"56\" class=\"code-line\"\u003eその結果として、以下のような効果の発生を目指します。\u003c/p\u003e\n\u003cul data-line=\"58\" class=\"code-line\"\u003e\n\u003cli data-line=\"58\" class=\"code-line\"\u003e\n\u003cstrong\u003e開発速度向上\u003c/strong\u003e\n\u003cul data-line=\"59\" class=\"code-line\"\u003e\n\u003cli data-line=\"59\" class=\"code-line\"\u003e\n\u003cstrong\u003e可読性の向上\u003c/strong\u003e: コードの複雑性を下げ、理解を容易にします。\u003c/li\u003e\n\u003cli data-line=\"60\" class=\"code-line\"\u003e\n\u003cstrong\u003e機能拡張性の向上\u003c/strong\u003e: 機能追加や修正に必要なコストを下げ、速度を向上させます。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-line=\"61\" class=\"code-line\"\u003e\n\u003cstrong\u003e外部品質向上=バグの発生確率を低減\u003c/strong\u003e\n\u003cul data-line=\"62\" class=\"code-line\"\u003e\n\u003cli data-line=\"62\" class=\"code-line\"\u003e\n\u003cstrong\u003e開発難易度の低減\u003c/strong\u003e: ロジックを簡素化することにより、開発難易度を下げ、外部品質向上につなぎます。\u003c/li\u003e\n\u003cli data-line=\"63\" class=\"code-line\"\u003e\n\u003cstrong\u003eテスト容易性向上\u003c/strong\u003e: テストすべき内容が明確になり、テスト設計が容易になります。ユニットテストなど小さなテストも実行しやすくなります。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-line=\"65\" class=\"code-line\"\u003eつまり、目的を端的に表現すると \u003cstrong\u003e「リファクタリングとは、生産性と品質改善のための投資」\u003c/strong\u003e です。\u003c/p\u003e\n\u003cp data-line=\"67\" class=\"code-line\"\u003eこの目的が最も大切です。生産性と品質を改善したくない人はいないはずなので、ここに同意できれば、あとはリターン・コストの大きさと、コストの支払い方法の問題に分解することができます。\u003cbr\u003e\n(厳密には、前述の通り「内部品質向上により生産性と外部品質を向上させる」ですが、長くなるのでここは諸々込みで「品質改善」と表現しています)\u003c/p\u003e\n\u003ch3 id=\"%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%BF%85%E8%A6%81%E6%80%A7\" data-line=\"70\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%BF%85%E8%A6%81%E6%80%A7\" aria-hidden=\"true\"\u003e\u003c/a\u003e リファクタリングの必要性\u003c/h3\u003e\n\u003cp data-line=\"72\" class=\"code-line\"\u003eもう一つ重要な、押さえておくべきことをお伝えします。\u003c/p\u003e\n\u003cp data-line=\"74\" class=\"code-line\"\u003e\u003cstrong\u003e「リファクタリングはどんなに優れたチームでも必要になるものである」\u003c/strong\u003e ということです。\u003c/p\u003e\n\u003cp data-line=\"76\" class=\"code-line\"\u003eわざわざ後からリファクタリングするよりも、最初から保守性の高いコードを書けばいいではないか、と思いますよね。しかし、それは以下のような不確実性や制約があるため、困難です。\u003c/p\u003e\n\u003col data-line=\"78\" class=\"code-line\"\u003e\n\u003cli data-line=\"78\" class=\"code-line\"\u003e\n\u003cstrong\u003e技術的な不確実性\u003c/strong\u003e:\n\u003cul data-line=\"79\" class=\"code-line\"\u003e\n\u003cli data-line=\"79\" class=\"code-line\"\u003e要件の変更や新技術の登場により、初期の設計が最適でなくなる可能性がある\u003c/li\u003e\n\u003cli data-line=\"80\" class=\"code-line\"\u003e開発チームのスキルや知識が向上し、より良い実装方法が見つかることがある\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-line=\"81\" class=\"code-line\"\u003e\n\u003cstrong\u003e要件/仕様の不確実性\u003c/strong\u003e:\n\u003cul data-line=\"82\" class=\"code-line\"\u003e\n\u003cli data-line=\"82\" class=\"code-line\"\u003eプロジェクトの初期段階では、最終的な製品像が完全に固まっていないことが多い\u003c/li\u003e\n\u003cli data-line=\"83\" class=\"code-line\"\u003eユーザーフィードバックや市場の変化により、要求が変わる可能性がある\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-line=\"84\" class=\"code-line\"\u003e\n\u003cstrong\u003e時間的な制約\u003c/strong\u003e:\n\u003cul data-line=\"85\" class=\"code-line\"\u003e\n\u003cli data-line=\"85\" class=\"code-line\"\u003e納期やリソースの制限により、最初から理想的な設計や実装を行う余裕がない場合がある\u003c/li\u003e\n\u003cli data-line=\"86\" class=\"code-line\"\u003e短期的な目標達成を優先するあまり、コードの品質が犠牲になることがある\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli data-line=\"87\" class=\"code-line\"\u003e\n\u003cstrong\u003e技術力の制約\u003c/strong\u003e:\n\u003cul data-line=\"88\" class=\"code-line\"\u003e\n\u003cli data-line=\"88\" class=\"code-line\"\u003e保守性の高い設計や実装を行うためのスキルや経験が、チーム内で十分でない場合がある\u003c/li\u003e\n\u003cli data-line=\"89\" class=\"code-line\"\u003e新しい技術や設計パターンの導入時に、チーム全体が同じペースで習得し、適切に活用することが困難な場合がある\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp data-line=\"91\" class=\"code-line\"\u003eこれらの要因により、保守性は放っておくと自然と下がっていき、生産性や品質が低下します。リファクタリングの文脈では3、4の「制約」が特に注目されがちですが、1、2の「不確実性」の観点も重要です。\u003c/p\u003e\n\u003cp data-line=\"93\" class=\"code-line\"\u003e\u003cstrong\u003e不確実性や制約がないプロジェクトはありません。\u003c/strong\u003e そのため、適切に保守性を向上するための手を打たなければ、長期的には開発チームの生産性、品質は低下するものなのです。\u003cbr\u003e\nリファクタリングが必要な状況を恥じる必要はありません。大切なのはその状況にどう対応するか、ということです。\u003c/p\u003e\n\u003ch2 id=\"%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AB%E9%87%8D%E8%A6%81%E3%81%AA%E3%81%93%E3%81%A8\" data-line=\"97\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AB%E9%87%8D%E8%A6%81%E3%81%AA%E3%81%93%E3%81%A8\" aria-hidden=\"true\"\u003e\u003c/a\u003e リファクタリングを行うために重要なこと\u003c/h2\u003e\n\u003cp data-line=\"99\" class=\"code-line\"\u003e以上を踏まえ、リファクタリングを実施するために重要なことは、\u003cstrong\u003eコストとリターンを明確にすること\u003c/strong\u003eです。\u003c/p\u003e\n\u003cp data-line=\"101\" class=\"code-line\"\u003e「リファクタリングとは、生産性と品質改善のための投資」だと書きました。となると、そのリターンにコストが見合えば実行した方がよく、見合わなければ実行すべきではないと考えられます。そのため、「どんなリターンを期待して、どれだけの時間をかけるか」を常に意識することが重要です。\u003c/p\u003e\n\u003ch2 id=\"%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E3%81%A9%E3%81%86%E8%80%83%E3%81%88%E3%82%8B%E3%81%8B\" data-line=\"104\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E3%81%A9%E3%81%86%E8%80%83%E3%81%88%E3%82%8B%E3%81%8B\" aria-hidden=\"true\"\u003e\u003c/a\u003e リファクタリングのリターンをどう考えるか\u003c/h2\u003e\n\u003cp data-line=\"106\" class=\"code-line\"\u003e前述の通り、リファクタリングのリターン(価値)は、定量化が難しいことが多いです。そこで、まずは定性的な価値を言語化することが重要です。シンプルに「リファクタリングすると何が嬉しいの?」に答えられるようにしましょう。\u003cbr\u003e\nそれを押さえた上で、できる範囲で定量的に表現できないか検討する、という順番で考えます。\u003c/p\u003e\n\u003cp data-line=\"109\" class=\"code-line\"\u003e2つの例を具体的に紹介します。\u003c/p\u003e\n\u003ch3 id=\"%E4%BE%8B1%EF%BC%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0\" data-line=\"111\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E4%BE%8B1%EF%BC%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0\" aria-hidden=\"true\"\u003e\u003c/a\u003e 例1:ファイルインポート機能のリファクタリング\u003c/h3\u003e\n\u003cp data-line=\"113\" class=\"code-line\"\u003e状況:\u003cbr\u003e\n既存のファイルインポート機能に新しいファイル形式を追加するのに、現在2日かかっている。今後も新しいファイル形式の追加は想定される。\u003c/p\u003e\n\u003cp data-line=\"116\" class=\"code-line\"\u003eリファクタリング案:\u003cbr\u003e\nインポート処理をリファクタリングによって汎用化し、新形式の追加コストを下げる。\u003c/p\u003e\n\u003cp data-line=\"119\" class=\"code-line\"\u003eリターン:\u003cbr\u003e\n定性的な価値は「将来の機能拡張のコストを下げる」とまず考えます。\u003cbr\u003e\nそれを定量化すると、以下の通りになります。\u003c/p\u003e\n\u003cul data-line=\"123\" class=\"code-line\"\u003e\n\u003cli data-line=\"123\" class=\"code-line\"\u003eリファクタリング後は、新形式の追加が0.5日で可能になる(1.5日の削減)と想定\u003c/li\u003e\n\u003cli data-line=\"124\" class=\"code-line\"\u003eリファクタリングには5日かかる\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-line=\"126\" class=\"code-line\"\u003eリターンとコストが釣り合う点を計算すると、「1.5日の削減 × 4 = 6日」なので、今後新形式の追加が4つ以上見込まれるのであれば投資に対してリターンが見合うから実施しましょう、と論理的に提案、判断ができます。\u003c/p\u003e\n\u003ch3 id=\"%E4%BE%8B2%EF%BC%9A%E3%83%90%E3%82%B0%E3%81%8C%E5%A4%9A%E7%99%BA%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0\" data-line=\"128\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E4%BE%8B2%EF%BC%9A%E3%83%90%E3%82%B0%E3%81%8C%E5%A4%9A%E7%99%BA%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0\" aria-hidden=\"true\"\u003e\u003c/a\u003e 例2:バグが多発しているコードのリファクタリング\u003c/h3\u003e\n\u003cp data-line=\"130\" class=\"code-line\"\u003e状況:\u003cbr\u003e\n特定の機能に機能拡張する度にバグが頻繁に発生し、対応工数に多くの時間を費やしている。この機能の拡張は今後も継続することが見込まれる。\u003c/p\u003e\n\u003cp data-line=\"133\" class=\"code-line\"\u003eリファクタリング案:\u003cbr\u003e\n既存コードをリファクタリングして可読性を上げ、ユニットテストを充実させる。\u003c/p\u003e\n\u003cp data-line=\"136\" class=\"code-line\"\u003eリターン:\u003cbr\u003e\n定性的な価値は、バグ発生を防ぎ、それによる対応コストを削減することです。\u003cbr\u003e\nこれを定量化するならば、今後の見込みのバグの対応コスト(アラートの対応、調査、お客さま対応など含む)を計算し、それを削減すると考えられます。\u003c/p\u003e\n\u003cp data-line=\"140\" class=\"code-line\"\u003eなお、これは多少強引な定量化ではあります。バグの発生見込みは確率論通りに発生するわけではありませんし、バグの問題は対応コストだけでなくステークホルダーに対して迷惑をかけてしまうことなどもあります。対応コストによる定量化は、あくまで「価値はあるけど定量化が難しい」ことへの対策の一つだと考えてください。\u003c/p\u003e\n\u003ch3 id=\"%E5%BF%85%E8%A6%81%E6%80%A7%E3%81%AE%E5%90%8C%E6%84%8F%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%84\" data-line=\"142\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E5%BF%85%E8%A6%81%E6%80%A7%E3%81%AE%E5%90%8C%E6%84%8F%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%84\" aria-hidden=\"true\"\u003e\u003c/a\u003e 必要性の同意におけるコツ\u003c/h3\u003e\n\u003cp data-line=\"144\" class=\"code-line\"\u003eこれらの例のように、リファクタリングのリターンを具体的に示すことで、その必要性をより明確に伝えることができます。\u003cbr\u003e\nこの際に役立つコツとして、「問題解決の5階層」があるので、併せてご紹介します。\u003c/p\u003e\n\u003cp data-line=\"147\" class=\"code-line\"\u003e\u003cimg src=\"https://storage.googleapis.com/zenn-user-upload/52b665857e16-20241206.png\" loading=\"lazy\" class=\"md-img\"\u003e\u003c/p\u003e\n\u003cp data-line=\"149\" class=\"code-line\"\u003eここで重要なのは、下の階層から順番に認識を合わせる必要があるということです。\u003c/p\u003e\n\u003cp data-line=\"151\" class=\"code-line\"\u003e例えば、「今後の品質向上のためのリファクタリングが必要(4.施策)」の同意を得るためには、その下の階層の認識を合わせる必要があります。\u003c/p\u003e\n\u003cp data-line=\"153\" class=\"code-line\"\u003eつまり、\u003c/p\u003e\n\u003col data-line=\"154\" class=\"code-line\"\u003e\n\u003cli data-line=\"154\" class=\"code-line\"\u003e事象: 機能拡張の度にバグが○件発生し、それぞれ平均○分時間をとられるので、月に○時間の対応工数がかかっている\u003c/li\u003e\n\u003cli data-line=\"155\" class=\"code-line\"\u003e問題: 新規機能開発工数がバグ対応工数で圧迫されている\u003c/li\u003e\n\u003cli data-line=\"156\" class=\"code-line\"\u003e原因: 該当コードの可読性やテスト容易性が低いため、バグを生みやすいコードになっている\u003c/li\u003e\n\u003cli data-line=\"157\" class=\"code-line\"\u003e施策: 該当コードをリファクタし、可読性やテスト容易性を向上させる\u003c/li\u003e\n\u003cli data-line=\"158\" class=\"code-line\"\u003e効果: 今後のバグ発生リスクが削減される\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp data-line=\"160\" class=\"code-line\"\u003eと整理をすると、「4.施策」の必要性の同意が得られない場合、「1.事象」「2.問題」の認識があっていない可能性があるので、そこから確認していくことが必要ということになります。\u003c/p\u003e\n\u003cp data-line=\"162\" class=\"code-line\"\u003e詳細は次の解説記事をこちらをご覧ください。\u003c/p\u003e\n\u003cp data-line=\"164\" class=\"code-line\"\u003e\u003cspan class=\"embed-block zenn-embedded zenn-embedded-card\"\u003e\u003ciframe id=\"zenn-embedded__91b19e2755439\" src=\"https://embed.zenn.studio/card#zenn-embedded__91b19e2755439\" data-content=\"https%3A%2F%2Flittle-hands.hatenablog.com%2Fentry%2F2019%2F12%2F13%2Fproblem-solving-5layer\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\"\u003e\u003c/iframe\u003e\u003c/span\u003e\u003ca href=\"https://little-hands.hatenablog.com/entry/2019/12/13/problem-solving-5layer\" style=\"display:none\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003ehttps://little-hands.hatenablog.com/entry/2019/12/13/problem-solving-5layer\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9F%E6%96%BD%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0\" data-line=\"166\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9F%E6%96%BD%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0\" aria-hidden=\"true\"\u003e\u003c/a\u003e リファクタリングの実施タイミング\u003c/h2\u003e\n\u003cp data-line=\"168\" class=\"code-line\"\u003eリファクタリングを効果的に行うためには、適切なタイミングを組み合わせることが重要です。ここでは、リファクタリングの主要なタイミングを4つ紹介します。①→④の順にコストが低く、頻繁に実施を検討できると良いものになります。\u003c/p\u003e\n\u003ch3 id=\"%E2%91%A0%E6%A9%9F%E8%83%BD%E9%96%8B%E7%99%BA%E4%B8%AD\" data-line=\"170\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E2%91%A0%E6%A9%9F%E8%83%BD%E9%96%8B%E7%99%BA%E4%B8%AD\" aria-hidden=\"true\"\u003e\u003c/a\u003e ①機能開発中\u003c/h3\u003e\n\u003cp data-line=\"172\" class=\"code-line\"\u003eブランチを切って、mainブランチにマージをするまでは常にリファクタリングチャンスです。Martin Fowlerも\"Refactoring is a part of day-to-day programming(リファクタリングは日々のプログラミングの一部だ)\"と言っています。\u003c/p\u003e\n\u003cp data-line=\"174\" class=\"code-line\"\u003e参考:\u003cbr style=\"display:none\"\u003e\n\u003cspan class=\"embed-block zenn-embedded zenn-embedded-card\"\u003e\u003ciframe id=\"zenn-embedded__82b3bcd272565\" src=\"https://embed.zenn.studio/card#zenn-embedded__82b3bcd272565\" data-content=\"https%3A%2F%2Frefactoring.com\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\"\u003e\u003c/iframe\u003e\u003c/span\u003e\u003ca href=\"https://refactoring.com\" style=\"display:none\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003ehttps://refactoring.com\u003c/a\u003e\u003c/p\u003e\n\u003cp data-line=\"177\" class=\"code-line\"\u003eリファクタリングされた状態のコードでプルリクエストを作成することにより、レビューやテストのコストが削減できますし、保守性が高い状態で今後の開発を実施できます。\u003c/p\u003e\n\u003cp data-line=\"179\" class=\"code-line\"\u003e\u003cstrong\u003e実施のポイント\u003c/strong\u003e\u003cbr\u003e\n実施するべきタイミングは、新しいコードを書きながら修正案が思いついた時、関数を定義してユニットテストを書いた後、プルリクエストを作成して見直している時…など、いつでもです。常にリファクタリングできる余地はないか検討しましょう。\u003c/p\u003e\n\u003cp data-line=\"182\" class=\"code-line\"\u003eただし、これは日々の開発の中で自然に実施しやすいので、「リファクタリングの時間を確保できない」と話題になるのは、次のパターン以降かと思います。\u003c/p\u003e\n\u003ch3 id=\"%E2%91%A1%E6%A9%9F%E8%83%BD%E6%8B%A1%E5%BC%B5%E3%82%92%E3%81%99%E3%82%8B%22%E7%9B%B4%E5%89%8D%22\" data-line=\"184\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E2%91%A1%E6%A9%9F%E8%83%BD%E6%8B%A1%E5%BC%B5%E3%82%92%E3%81%99%E3%82%8B%22%E7%9B%B4%E5%89%8D%22\" aria-hidden=\"true\"\u003e\u003c/a\u003e ②機能拡張をする\"直前\"\u003c/h3\u003e\n\u003cp data-line=\"186\" class=\"code-line\"\u003e機能拡張する\u003cstrong\u003e直前\u003c/strong\u003eに、修正対象のコードをリファクタリングすることで、目前の開発の拡張容易性、テスト容易性を高めます。\u003c/p\u003e\n\u003cp data-line=\"188\" class=\"code-line\"\u003eメリットとしては、リファクタリングのコストに対して、定性的なリターンが明確ですぐに得られるため、必要性がわかりやすいという点です。③④に比べて、開発作業の一環とみなしやすいので、いちいち許可を取らなくても実施しやすいかと思います。(これが難しい現場もあもしれませんが…)\u003c/p\u003e\n\u003cp data-line=\"190\" class=\"code-line\"\u003e\u003cstrong\u003e実施のポイント\u003c/strong\u003e\u003cbr\u003e\n\u003cstrong\u003eリファクタリングの修正だけで先にテストし、マージする\u003c/strong\u003e ようにしましょう。\u003cbr\u003e\nこれは、修正の差分を小さくしてレビューしやすくするため、そしてテスト範囲を限定するためです。\u003c/p\u003e\n\u003cp data-line=\"194\" class=\"code-line\"\u003eこの事前のリファクタを「必要な手順」と考え、その前提で見積もり・計画するようにできると理想的です。\u003cbr\u003e\n時間短縮のために、テストしないでいいですか?とはなりませんよね。リリースのために必要な手順だからです。リファクタリングも同じで、それが必要な手順だと強い気持ちで思えるかが大切です。そう思うためには、このパターンのリファクタリングの成功体験を積み、「リターンとコストが見合っている」と自分の中で納得しておくことが必要です。\u003c/p\u003e\n\u003ch3 id=\"%E2%91%A2%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%81%A8%E3%81%97%E3%81%A6%E7%A9%8D%E3%82%80\" data-line=\"197\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E2%91%A2%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%81%A8%E3%81%97%E3%81%A6%E7%A9%8D%E3%82%80\" aria-hidden=\"true\"\u003e\u003c/a\u003e ③リファクタリングをバックログアイテムとして積む\u003c/h3\u003e\n\u003cp data-line=\"199\" class=\"code-line\"\u003eリファクタリングや、少しスコープを広げて技術的負債解消等をバックログアイテムとして蓄積し、優先順位をつけて対応していきます。\u003c/p\u003e\n\u003cp data-line=\"201\" class=\"code-line\"\u003e必要コストを扱いやすくするために、規模の相対見積もりでざっくりと数値化するのがおすすめです。コスト数値化の表現はストーリーポイントのような形でもいいですし、Tシャツサイズ見積(S/M/L)でも良いでしょう。\u003c/p\u003e\n\u003cp data-line=\"203\" class=\"code-line\"\u003e参考:\u003cbr style=\"display:none\"\u003e\n\u003cspan class=\"embed-block zenn-embedded zenn-embedded-card\"\u003e\u003ciframe id=\"zenn-embedded__96a2830b4150b\" src=\"https://embed.zenn.studio/card#zenn-embedded__96a2830b4150b\" data-content=\"https%3A%2F%2Fasana.com%2Fja%2Fresources%2Fstory-points\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\"\u003e\u003c/iframe\u003e\u003c/span\u003e\u003ca href=\"https://asana.com/ja/resources/story-points\" style=\"display:none\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003ehttps://asana.com/ja/resources/story-points\u003c/a\u003e\u003cbr style=\"display:none\"\u003e\n\u003cspan class=\"embed-block zenn-embedded zenn-embedded-card\"\u003e\u003ciframe id=\"zenn-embedded__e5901be3025c2\" src=\"https://embed.zenn.studio/card#zenn-embedded__e5901be3025c2\" data-content=\"https%3A%2F%2Fasana.com%2Fja%2Fresources%2Ft-shirt-sizing\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\"\u003e\u003c/iframe\u003e\u003c/span\u003e\u003ca href=\"https://asana.com/ja/resources/t-shirt-sizing\" style=\"display:none\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003ehttps://asana.com/ja/resources/t-shirt-sizing\u003c/a\u003e\u003c/p\u003e\n\u003cp data-line=\"207\" class=\"code-line\"\u003e\u003cstrong\u003e実施のポイント\u003c/strong\u003e\u003cbr\u003e\nこのパターンでの実施時には、プロダクトオーナーやプロダクトマネージャー(以下POと表記)と同意が必要になることが多いでしょう。この同意を取るパターンとして2つ考えられます。\u003c/p\u003e\n\u003col data-line=\"210\" class=\"code-line\"\u003e\n\u003cli data-line=\"210\" class=\"code-line\"\u003eバックログアイテムごとに価値を説明して、都度POと同意を取る\u003c/li\u003e\n\u003cli data-line=\"211\" class=\"code-line\"\u003e一定期間ごとにどれくらいのコストをリファクタリングに時間を投資するかをPOと合意し、あとはエンジニア内で決定する\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp data-line=\"213\" class=\"code-line\"\u003eまずは小さく1から始めると良いでしょう。リターンとコストを意識して議論をする習慣づけにもなります。\u003c/p\u003e\n\u003cp data-line=\"215\" class=\"code-line\"\u003eそこからステップを進め「月当たりこれくらいのコスト(時間やストーリーポイント等)を投資します」とPOと同意できると、あとはエンジニア内で解決ができます。ここは大きなハードルがありますが、「リファクタリングしたら、それ以降の開発の速度や品質が上がった」という成功体験をPOと一緒に積み、「必要性はわかった、あとの時間の使い方は任せる」となれると理想的です。\u003c/p\u003e\n\u003cp data-line=\"217\" class=\"code-line\"\u003eリターンを非エンジニアにわかるように示して議論するのはコストがかかるので、パターン2までいけると全体としての効率は良くなりますし、リファクタリングが開発サイクルに組み込まれるので大きな進化だと言えます。\u003c/p\u003e\n\u003cp data-line=\"219\" class=\"code-line\"\u003eこの詳細は、以前にスライドを作成したのでこちらをご覧ください。\u003c/p\u003e\n\u003cp data-line=\"221\" class=\"code-line\"\u003e\u003cspan class=\"embed-block zenn-embedded zenn-embedded-card\"\u003e\u003ciframe id=\"zenn-embedded__43a2b661202e5\" src=\"https://embed.zenn.studio/card#zenn-embedded__43a2b661202e5\" data-content=\"https%3A%2F%2Fwww.slideshare.net%2Fslideshow%2Fss-243097467%2F243097467\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\"\u003e\u003c/iframe\u003e\u003c/span\u003e\u003ca href=\"https://www.slideshare.net/slideshow/ss-243097467/243097467\" style=\"display:none\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003ehttps://www.slideshare.net/slideshow/ss-243097467/243097467\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"%E2%91%A3%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%8C%96%E3%81%99%E3%82%8B\" data-line=\"223\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E2%91%A3%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%8C%96%E3%81%99%E3%82%8B\" aria-hidden=\"true\"\u003e\u003c/a\u003e ④リファクタリングをプロジェクト化する\u003c/h3\u003e\n\u003cp data-line=\"225\" class=\"code-line\"\u003eリファクタリングを独立したプロジェクトとして計画し、リソースを割り当てて集中的に取り組みます。大きくなると、リアーキテクチャと呼ばれるようなものにもなる場合もあります。\u003c/p\u003e\n\u003cp data-line=\"227\" class=\"code-line\"\u003eコードの複雑度が高まりすぎて、こまめな改善では追いつかない、と言った場合にこの手段が必要になることがあります。影響範囲が大きい分、大きなコストで大きなリターンが得られることがありますが、その分難易度も上がり、失敗リスクも高まります。\u003c/p\u003e\n\u003cp data-line=\"229\" class=\"code-line\"\u003e\u003cstrong\u003e実施のポイント\u003c/strong\u003e\u003cbr\u003e\n「リターンとコストを見合うかを検討」は同じなのですが、規模が大きくなる場合は \u003cstrong\u003eビッグバンリリースにしないようにする\u003c/strong\u003e (=最後に1回だけの大きなリリースにしないようにする)ことが非常に重要になります。\u003c/p\u003e\n\u003cp data-line=\"232\" class=\"code-line\"\u003eリファクタリングの修正範囲や期間が大きくなると、その分影響するコードを修正できなくなり、その範囲の開発が止まってしまいます。また、修正が大きくなるほど、バグを混入するリスクは高まります。\u003cbr\u003e\nさらに、期間が伸びるほど遅延リスクも増え、期間に間に合わせようとまた保守性の低いコードを書くという悪循環も生まれてしまいます。\u003c/p\u003e\n\u003cp data-line=\"235\" class=\"code-line\"\u003eそのため、\u003cstrong\u003eとにかく小さく修正して、小さくマージ、リリースできないかを検討します。\u003c/strong\u003e どうしても難しいこともあると思いますが、それでも知恵を絞ります。ストラングラーフィグパターン、というのものもあるので参考にしてみてください。\u003c/p\u003e\n\u003cp data-line=\"237\" class=\"code-line\"\u003e\u003cspan class=\"embed-block zenn-embedded zenn-embedded-card\"\u003e\u003ciframe id=\"zenn-embedded__6c633394a39a3\" src=\"https://embed.zenn.studio/card#zenn-embedded__6c633394a39a3\" data-content=\"https%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Fazure%2Farchitecture%2Fpatterns%2Fstrangler-fig\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\"\u003e\u003c/iframe\u003e\u003c/span\u003e\u003ca href=\"https://learn.microsoft.com/ja-jp/azure/architecture/patterns/strangler-fig\" style=\"display:none\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003ehttps://learn.microsoft.com/ja-jp/azure/architecture/patterns/strangler-fig\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"%E5%AE%9F%E6%96%BD%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B04%E3%81%A4%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81\" data-line=\"240\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E5%AE%9F%E6%96%BD%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B04%E3%81%A4%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81\" aria-hidden=\"true\"\u003e\u003c/a\u003e 実施タイミング4つパターンのまとめ\u003c/h3\u003e\n\u003cp data-line=\"242\" class=\"code-line\"\u003eこれら4つのリファクタリングタイミングは、互いに排他的ではありません。プロジェクトの状況に応じて、適切なアプローチを選択し、組み合わせることが重要です。\u003c/p\u003e\n\u003cp data-line=\"244\" class=\"code-line\"\u003eですが、「リファクタリングは日々のプログラミングの一部」となるように、まずはコストの小さい①、②からチャンスを伺っていきましょう。\u003c/p\u003e\n\u003cp data-line=\"246\" class=\"code-line\"\u003e日々の積み重ねで保守性は維持されるとともに、リファクタリングの成功体験を組織として積むことで、より大きなリファクタリングにも着手できるようになっていきます。\u003c/p\u003e\n\u003ch2 id=\"%E3%81%BE%E3%81%A8%E3%82%81\" data-line=\"249\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%81%BE%E3%81%A8%E3%82%81\" aria-hidden=\"true\"\u003e\u003c/a\u003e まとめ\u003c/h2\u003e\n\u003cp data-line=\"251\" class=\"code-line\"\u003eポイントをおさらいします。\u003c/p\u003e\n\u003cul data-line=\"253\" class=\"code-line\"\u003e\n\u003cli data-line=\"253\" class=\"code-line\"\u003e「リファクタリングとは、生産性と品質改善のための投資」だと認識する。\u003c/li\u003e\n\u003cli data-line=\"254\" class=\"code-line\"\u003e常にリターンとコストを見極めて判断する癖をつける。\u003c/li\u003e\n\u003cli data-line=\"255\" class=\"code-line\"\u003e4つのリファクタリングタイミングを使い分ける。\u003c/li\u003e\n\u003cli data-line=\"256\" class=\"code-line\"\u003e常にリファクタリングチャンスを探し、日々改善を積み上げる。\u003c/li\u003e\n\u003cli data-line=\"257\" class=\"code-line\"\u003e組織として成功体験を積み、大きくしていく\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-line=\"259\" class=\"code-line\"\u003e以上を踏まえて、より良い開発を進めていきましょう!\u003c/p\u003e\n","ogImageUrl":"https://res.cloudinary.com/zenn/image/upload/s--M9BPCqyj--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2580%258C%25E3%2583%25AA%25E3%2583%2595%25E3%2582%25A1%25E3%2582%25AF%25E3%2582%25BF%25E3%2583%25AA%25E3%2583%25B3%25E3%2582%25B0%25E3%2581%25AE%25E6%2599%2582%25E9%2596%2593%25E3%2580%258D%25E3%2582%2592%25E7%25A2%25BA%25E4%25BF%259D%25E3%2581%2599%25E3%2582%258B%25E6%258A%2580%25E8%25A1%2593%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_34:little_hands%2528%25E6%259D%25BE%25E5%25B2%25A1%2540Lo...%2Cx_220%2Cy_108/bo_3px_solid_rgb:d6e3ed%2Cg_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzRlNWQ4ZTRjZjguanBlZw==%2Cr_20%2Cw_90%2Cx_92%2Cy_102/co_rgb:6e7b85%2Cg_south_west%2Cl_text:notosansjp-medium.otf_30:%25E6%25A0%25AA%25E5%25BC%258F%25E4%25BC%259A%25E7%25A4%25BE%25E3%2583%25AD%25E3%2582%25B0%25E3%2583%25A9%25E3%2582%25B9%2520%25E3%2583%2586%25E3%2583%2583%25E3%2582%25AF%25E3%2583%2596%25E3%2583%25AD%25E3%2582%25B0%2Cx_220%2Cy_160/bo_4px_solid_white%2Cg_south_west%2Ch_50%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzAxNjQwZGFkNjEuanBlZw==%2Cr_max%2Cw_50%2Cx_139%2Cy_84/v1627283836/default/og-base-w1200-v2.png","toc":[{"id":"%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB","text":"はじめに","level":2,"children":[{"id":"%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81","text":"ポイントまとめ","level":3,"children":[]}]},{"id":"%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E6%99%82%E9%96%93%E7%A2%BA%E4%BF%9D%E3%81%AE%E9%9B%A3%E3%81%97%E3%81%95","text":"リファクタリング時間確保の難しさ","level":2,"children":[]},{"id":"%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%81%A8%E3%81%9D%E3%81%AE%E7%9B%AE%E7%9A%84","text":"リファクタリングの定義とその目的","level":2,"children":[{"id":"%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%BF%85%E8%A6%81%E6%80%A7","text":"リファクタリングの必要性","level":3,"children":[]}]},{"id":"%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AB%E9%87%8D%E8%A6%81%E3%81%AA%E3%81%93%E3%81%A8","text":"リファクタリングを行うために重要なこと","level":2,"children":[]},{"id":"%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E3%81%A9%E3%81%86%E8%80%83%E3%81%88%E3%82%8B%E3%81%8B","text":"リファクタリングのリターンをどう考えるか","level":2,"children":[{"id":"%E4%BE%8B1%EF%BC%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0","text":"例1:ファイルインポート機能のリファクタリング","level":3,"children":[]},{"id":"%E4%BE%8B2%EF%BC%9A%E3%83%90%E3%82%B0%E3%81%8C%E5%A4%9A%E7%99%BA%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0","text":"例2:バグが多発しているコードのリファクタリング","level":3,"children":[]},{"id":"%E5%BF%85%E8%A6%81%E6%80%A7%E3%81%AE%E5%90%8C%E6%84%8F%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%84","text":"必要性の同意におけるコツ","level":3,"children":[]}]},{"id":"%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9F%E6%96%BD%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0","text":"リファクタリングの実施タイミング","level":2,"children":[{"id":"%E2%91%A0%E6%A9%9F%E8%83%BD%E9%96%8B%E7%99%BA%E4%B8%AD","text":"①機能開発中","level":3,"children":[]},{"id":"%E2%91%A1%E6%A9%9F%E8%83%BD%E6%8B%A1%E5%BC%B5%E3%82%92%E3%81%99%E3%82%8B%22%E7%9B%B4%E5%89%8D%22","text":"②機能拡張をする\"直前\"","level":3,"children":[]},{"id":"%E2%91%A2%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%81%A8%E3%81%97%E3%81%A6%E7%A9%8D%E3%82%80","text":"③リファクタリングをバックログアイテムとして積む","level":3,"children":[]},{"id":"%E2%91%A3%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%8C%96%E3%81%99%E3%82%8B","text":"④リファクタリングをプロジェクト化する","level":3,"children":[]},{"id":"%E5%AE%9F%E6%96%BD%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B04%E3%81%A4%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81","text":"実施タイミング4つパターンのまとめ","level":3,"children":[]}]},{"id":"%E3%81%BE%E3%81%A8%E3%82%81","text":"まとめ","level":2,"children":[]}],"tocEnabled":true,"shouldNoindex":false,"scheduledPublishAt":null,"canSendBadge":true,"status":"published","badges":[{"badgeType":"Thanks","rank":"10"}]},"user":{"id":16371,"username":"little_hand_s","name":"little_hands(松岡@Loglass)","avatarSmallUrl":"https://res.cloudinary.com/zenn/image/fetch/s--gzwDF1gO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/01640dad61.jpeg","avatarUrl":"https://storage.googleapis.com/zenn-user-upload/avatar/01640dad61.jpeg","bio":"DDDや設計にお困りの方はDMにてご相談ください。講義、モブモデリングやコーディングなどご要望に合わせた進め方でサポートします(オンライン)。 YouTube: https://youtube.com/channel/UCbHtbIUxtfGjrDy1WcqxExw","autolinkedBio":"DDDや設計にお困りの方はDMにてご相談ください。講義、モブモデリングやコーディングなどご要望に合わせた進め方でサポートします(オンライン)。 YouTube: \u003ca href=\"https://youtube.com/channel/UCbHtbIUxtfGjrDy1WcqxExw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003eyoutube.com/channel/UCbHtbIUxtfGjrDy1WcqxExw\u003c/a\u003e","githubUsername":"","twitterUsername":"little_hand_s","isSupportOpen":true,"tokusyoContact":null,"tokusyoName":null,"websiteUrl":"https://little-hands.hatenablog.com/","websiteDomain":"little-hands.hatenablog.com","totalLikedCount":418,"gaTrackingId":null,"hatenaId":"little_hands","isInvoiceIssuer":false},"topics":[{"id":599,"name":"設計","taggingsCount":651,"imageUrl":"https://zenn.dev/images/topic.png","displayName":"設計"},{"id":701,"name":"エンジニア","taggingsCount":505,"imageUrl":"https://zenn.dev/images/topic.png","displayName":"エンジニア"},{"id":1002,"name":"リファクタリング","taggingsCount":154,"imageUrl":"https://zenn.dev/images/topic.png","displayName":"リファクタリング"},{"id":1180,"name":"アジャイル","taggingsCount":310,"imageUrl":"https://zenn.dev/images/topic.png","displayName":"アジャイル"}],"isMine":false,"isPreview":false,"draftRevealScope":"private","githubRepository":null,"currentUserLiked":false,"currentUserBookmarked":false,"comments":[],"commentedUsers":[],"positiveCommentsCount":0,"publication":{"id":55,"name":"loglass","displayName":"株式会社ログラス テックブログ","avatarSmallUrl":"https://res.cloudinary.com/zenn/image/fetch/s--tGZRxcLN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_80/https://storage.googleapis.com/zenn-user-upload/avatar/4e5d8e4cf8.jpeg","avatarUrl":"https://storage.googleapis.com/zenn-user-upload/avatar/4e5d8e4cf8.jpeg","pro":false,"avatarRegistered":true,"description":"株式会社ログラスは「良い景気を作ろう。」をミッションに、企業経営を推進する次世代型経営管理クラウド「Loglass 経営管理」を開発し提供しています。","autolinkedDescription":"株式会社ログラスは「良い景気を作ろう。」をミッションに、企業経営を推進する次世代型経営管理クラウド「Loglass 経営管理」を開発し提供しています。","twitterUsername":"loglassprdteam","githubUsername":"","coverImageUrl":"https://storage.googleapis.com/zenn-user-upload/publication_cover/4d8322df64.jpeg","fixedSentencesHtml":null,"isSupportOpen":true,"isArticleCommentOpen":true,"gaTrackingId":null}}},"page":"/[username]/articles/[slug]","query":{"username":"loglass","slug":"961e283e6fbe71"},"buildId":"qHU6Be8y3eXbdnUQStbKu","assetPrefix":"https://static.zenn.studio","isFallback":false,"isExperimentalCompile":false,"dynamicIds":[67679],"gip":true,"scriptLoader":[]}</script></body></html>

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