CINXE.COM
ピザ2枚分の人数のMLプロジェクトのPMを1年間やった知見
<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta content="width=device-width, initial-scale=1" name="viewport"/><title>ピザ2枚分の人数のMLプロジェクトのPMを1年間やった知見</title><link rel="canonical" href="https://zenn.dev/ycarbon/articles/e2bb98e808e531"/><meta name="twitter:card" content="summary_large_image"/><meta property="og:url" content="https://zenn.dev/ycarbon/articles/e2bb98e808e531"/><meta property="og:title" content="ピザ2枚分の人数のMLプロジェクトのPMを1年間やった知見"/><meta property="og:image" content="https://res.cloudinary.com/zenn/image/upload/s--sdNLImmp--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2583%2594%25E3%2582%25B62%25E6%259E%259A%25E5%2588%2586%25E3%2581%25AE%25E4%25BA%25BA%25E6%2595%25B0%25E3%2581%25AEML%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E3%2581%25AEPM%25E3%2582%25921%25E5%25B9%25B4%25E9%2596%2593%25E3%2582%2584%25E3%2581%25A3%25E3%2581%259F%25E7%259F%25A5%25E8%25A6%258B%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:yCarbon%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzM1OWYyNzFjNDIuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/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/359f271c42.jpeg" name="zenn:image"/><meta content="yCarbonさんによる記事" name="zenn:description"/><meta name="next-head-count" content="12"/><script nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=">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="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=">(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="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ="></script><script nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=">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="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ="></script><style nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ="> @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="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" rel="preload" href="https://static.zenn.studio/_next/static/css/c98e2d4c357fbe9f.css" as="style"/><link nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" rel="stylesheet" href="https://static.zenn.studio/_next/static/css/c98e2d4c357fbe9f.css" data-n-g=""/><link nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" rel="preload" href="https://static.zenn.studio/_next/static/css/90c5120f4b791556.css" as="style"/><link nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" rel="stylesheet" href="https://static.zenn.studio/_next/static/css/90c5120f4b791556.css" data-n-p=""/><noscript data-n-css="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ="></noscript><script defer="" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" nomodule="" src="https://static.zenn.studio/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="https://static.zenn.studio/_next/static/chunks/webpack-b1e7249ff5e93c77.js" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/framework-ca706bf673a13738.js" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/main-e87375bda7b226b4.js" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/pages/_app-1ac98e4f6170e59b.js" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/6965-d0e146ae5afb1777.js" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/1828-6617a55e48357072.js" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/2001-b0dc4bec07955a59.js" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/9328-2d342e4ba7eccf14.js" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/840-47fb90d0d9531395.js" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/pages/%5Busername%5D/articles/%5Bslug%5D-36dec9385298ff41.js" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/6cWpQ5Z1LAtdbyaB4EE5X/_buildManifest.js" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/6cWpQ5Z1LAtdbyaB4EE5X/_ssgManifest.js" nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=" defer=""></script></head><body><script nonce="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=">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="/ycarbon"><span class="ContentStickyNavForMobile_avatarContainer__V3P_G"><img alt="yCarbon" class="AvatarImage_border__pDIjF AvatarImage_plain__Fgp4R " height="38" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/359f271c42.jpeg" width="38"/></span><span class="ContentStickyNavForMobile_displayName__cmEag">yCarbon</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><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.884em">ピザ2枚分の人数のMLプロジェクトのPMを1年間やった知見</span></h1><div class="ArticleHeader_metaContainer__5UzrJ"><div class="ArticleHeader_metaInfo__XrRdh"><span class="ArticleHeader_pubDate__gF_sc"><span class="ArticleHeader_num__7Zpz0">2024/11/24</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/ycarbon/articles/e2bb98e808e531&text=%E3%83%94%E3%82%B62%E6%9E%9A%E5%88%86%E3%81%AE%E4%BA%BA%E6%95%B0%E3%81%AEML%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEPM%E3%82%921%E5%B9%B4%E9%96%93%E3%82%84%E3%81%A3%E3%81%9F%E7%9F%A5%E8%A6%8B%EF%BD%9CyCarbon&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/ycarbon/articles/e2bb98e808e531" 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&url=https://zenn.dev/ycarbon/articles/e2bb98e808e531&title=%E3%83%94%E3%82%B62%E6%9E%9A%E5%88%86%E3%81%AE%E4%BA%BA%E6%95%B0%E3%81%AEML%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEPM%E3%82%921%E5%B9%B4%E9%96%93%E3%82%84%E3%81%A3%E3%81%9F%E7%9F%A5%E8%A6%8B%EF%BD%9CyCarbon" 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/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92"><div class="View_topicImage__qMmmw"><img class="View_topicImg__TpkV5" loading="lazy" src="https://storage.googleapis.com/zenn-user-upload/topics/fb39b9c866.png"/></div><div class="View_topicName____nYp">機械学習</div></a><a class="View_topicLink__jdtX_" href="/topics/%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%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="/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"><h1 id="%E3%83%94%E3%82%B62%E6%9E%9A%E5%88%86%E3%81%AE%E4%BA%BA%E6%95%B0%E3%81%AEml%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEpm%EF%BC%88%E3%83%97%E3%83%AC%E3%82%A4%E3%83%B3%E3%82%B0%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A3%E3%83%BC%EF%BC%89%E3%82%921%E5%B9%B4%E9%96%93%E3%82%84%E3%81%A3%E3%81%9F%E7%9F%A5%E8%A6%8B" data-line="0" class="code-line"> <a class="header-anchor-link" href="#%E3%83%94%E3%82%B62%E6%9E%9A%E5%88%86%E3%81%AE%E4%BA%BA%E6%95%B0%E3%81%AEml%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEpm%EF%BC%88%E3%83%97%E3%83%AC%E3%82%A4%E3%83%B3%E3%82%B0%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A3%E3%83%BC%EF%BC%89%E3%82%921%E5%B9%B4%E9%96%93%E3%82%84%E3%81%A3%E3%81%9F%E7%9F%A5%E8%A6%8B" aria-hidden="true"></a> ピザ2枚分の人数のMLプロジェクトのPM(プレイングマネジャー)を1年間やった知見</h1> <h2 id="%E8%83%8C%E6%99%AF" data-line="2" class="code-line"> <a class="header-anchor-link" href="#%E8%83%8C%E6%99%AF" aria-hidden="true"></a> 背景</h2> <p data-line="4" class="code-line">2023/10から現在(2024/11)まで1年くらいプレイングマネジャーをやっていました。</p> <p data-line="6" class="code-line">規模としてはピザ2枚分(自分を含めて5~7人前後)の機械学習エンジニアのプロジェクト上での管理をしつつ、自分でもチケットを消化していました。</p> <p data-line="8" class="code-line">そこでの教訓を共有します。</p> <h2 id="%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97" data-line="10" class="code-line"> <a class="header-anchor-link" href="#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97" aria-hidden="true"></a> この記事のスコープ</h2> <h3 id="%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E3%81%93%E3%81%A8" data-line="12" class="code-line"> <a class="header-anchor-link" href="#%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E3%81%93%E3%81%A8" aria-hidden="true"></a> マネジャーとしてやっていたこと</h3> <p data-line="14" class="code-line">主に技術開発のPoCで、タスクを作成・管理しつつ、ピザ2枚分(自分を含めて5~7人前後)の機械学習エンジニアのリーダーをやっていました。また、顧客とのやり取りやその結果生じた開発タスクの調整、会社との方針とタスクのすり合わせ等もやっていました。<br> 自分もタスクを消化していたので俗にいうプレイングマネジャーでした。</p> <p data-line="17" class="code-line">ただし工数管理、社内手続き(稟議など)、社外手続き(契約など)などはノータッチで、PjMに委ねていました。</p> <p data-line="19" class="code-line">チーム向けにマネジャーとしては、以下の2つのタスクに大体ずっと取り組んでいました</p> <ol data-line="21" class="code-line"> <li data-line="21" class="code-line"> <p data-line="21" class="code-line">生産性を最大化する</p> </li> <li data-line="23" class="code-line"> <p data-line="23" class="code-line">冗長性を高める</p> </li> </ol> <p data-line="25" class="code-line">このチームへの動きについてフォーカスを当てます。</p> <h3 id="%E8%A8%98%E4%BA%8B%E3%81%A7%E3%81%AF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E5%A4%96%E3%81%AE%E3%81%93%E3%81%A8" data-line="27" class="code-line"> <a class="header-anchor-link" href="#%E8%A8%98%E4%BA%8B%E3%81%A7%E3%81%AF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E5%A4%96%E3%81%AE%E3%81%93%E3%81%A8" aria-hidden="true"></a> 記事ではスコープ外のこと</h3> <p data-line="29" class="code-line">社外向けに折衝したり、その結果や組織としての方向性からタスクを計画・実行したりもしました。ただ、そういった仕事はエンジニアが1人だけの小さなチームでやっていたころの延長線上だったので省略します。<br> あくまで他のエンジニアを管理するエンジニアの立場になって、何が違ったか・何をやったかという話を書きます。</p> <p data-line="32" class="code-line">話を広げると書ききる前に燃え尽きるため、PjMやPdM、組織間のやりとりや組織・コミュニケーションの設計の話はここでは扱いません。</p> <h2 id="%E3%81%AA%E3%81%9C%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%A8%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%8B%EF%BC%9F" data-line="34" class="code-line"> <a class="header-anchor-link" href="#%E3%81%AA%E3%81%9C%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%A8%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%8B%EF%BC%9F" aria-hidden="true"></a> なぜ生産性と冗長性の向上か?</h2> <h3 id="%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A" data-line="36" class="code-line"> <a class="header-anchor-link" href="#%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A" aria-hidden="true"></a> 生産性の向上</h3> <p data-line="38" class="code-line">生産性の向上は、以下のことにつながります。</p> <ol data-line="40" class="code-line"> <li data-line="40" class="code-line"> <p data-line="40" class="code-line">一定期間でできるだけ多くのことを実現する</p> </li> <li data-line="42" class="code-line"> <p data-line="42" class="code-line">同じことについてできるだけ早く実現する</p> </li> </ol> <p data-line="44" class="code-line">同じ稼働時間でより大きなことをでき、同じことをやる際に稼働時間がより短い方が利益や価値が出ます。組織の値付けや評価が工数ベースであれ価値ベースであれ生産性の向上は有益で、大体の組織で目標として言及されていると思います。</p> <h3 id="%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A" data-line="46" class="code-line"> <a class="header-anchor-link" href="#%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A" aria-hidden="true"></a> 冗長性の向上</h3> <p data-line="48" class="code-line">冗長性は生産性につながるものです。</p> <p data-line="50" class="code-line">リーダーが全部チケットを切って、相談に乗って、レビューして、資料を書く体制だと、リーダーが止まると全て止まります。リーダーの業務時間だけチームが動くことになり、チームのスループットはリーダーがネックになります。</p> <p data-line="52" class="code-line">このような状況だと、リーダー以外の生産性をどれだけ上げても(仮に100人雇ったり、100人力のメンバーを1人雇ったりしても)、リーダーのところでタスクの消化が止まります。冗長性の課題はボトルネックに近しく、ここを多重化したり委譲したりすると、タスクの消化が止まりにくくネックになりにくくなります。チームの能力を引き出したり、チームの規模を拡大するためにはタスクを消化するプロセス上に単一障害点がなるべく無いように設計する必要があります。</p> <p data-line="54" class="code-line">また、長期的にはタスクを委譲しないとメンバーが育たたない、という話もあります。どれだけ教育をしても、結局はタスクを任せてみないことにはタスクをどれほど上手くこなせるか分からないです。ピーターの法則を避けて将来的により上のロールで動けるか判断するためにも、委譲は大切です。</p> <h2 id="%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE%E3%81%AF%E4%BD%95%E3%81%8B%EF%BC%9F" data-line="58" class="code-line"> <a class="header-anchor-link" href="#%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE%E3%81%AF%E4%BD%95%E3%81%8B%EF%BC%9F" aria-hidden="true"></a> 生産性の向上に必要なものは何か?</h2> <p data-line="60" class="code-line">主に生産性の向上に主眼を置いた時、自分は色々調べて先人の知恵に習っていました。</p> <h3 id="%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AB%E3%81%AF%E5%B7%A5%E5%A0%B4%E3%81%A8%E5%90%8C%E3%81%98" data-line="62" class="code-line"> <a class="header-anchor-link" href="#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AB%E3%81%AF%E5%B7%A5%E5%A0%B4%E3%81%A8%E5%90%8C%E3%81%98" aria-hidden="true"></a> 基本的には工場と同じ</h3> <p data-line="64" class="code-line">異論はあると思いますが、ソフトウェア開発であっても基本は工場と同じです。</p> <p data-line="66" class="code-line">ボトルネックを見つけて改善します。細かな理論は色々ありますが、自分はTOC理論と呼ばれるような枠組みを意識して、測定と計画、介入を繰り返していました。</p> <p data-line="68" class="code-line">詰まっている部分 = WIP = ボトルネック以外を改善しても生産性は向上せず、ボトルネックの詰まりが増えるだけ、という考え方に基づいています。他にも色々な考え方はありますが、生産性に着目するなら結局はこの考えかこの考えと似た考え方に則ってやることになると思います。</p> <h3 id="%E5%B7%A5%E5%A0%B4%E3%81%A8%E7%95%B0%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%82%E3%82%8B" data-line="70" class="code-line"> <a class="header-anchor-link" href="#%E5%B7%A5%E5%A0%B4%E3%81%A8%E7%95%B0%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%82%E3%82%8B" aria-hidden="true"></a> 工場と異なることもある</h3> <p data-line="72" class="code-line">ただ、ソフトウェア開発、特に機械学習のプロジェクトと工場とで異なることもあると思っています。</p> <p data-line="74" class="code-line">大きな違いは並列して作成する製品数と生産設備の汎用性です。</p> <p data-line="76" class="code-line">TOC理論ではプロセス間のどこかで大量に生産している製品が詰まり、処理待ちの在庫(WIP)が発生することでボトルネックを特定します。ただしMLプロジェクト、特にPoCや技術検証のようにモデルを作るだけで終わるケースでは、1人が全プロセスを受け持つことができてしまいます。また、1人が並行して受け持てるのはせいぜい2つ程度で、チーム全体でもWIPは高々人数 x 1~2個程度です。この場合、調査、実装、テスト、計算、レポート、レビューのいずれかの特定のプロセスに対してWIPは高々数個に収まります。派手に滞留することがあまりないため、問題があっても見えにくくなります。</p> <h2 id="%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%A8%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E5%85%A8%E4%BD%93%E7%9A%84%E3%81%AA%E6%96%B9%E9%87%9D" data-line="78" class="code-line"> <a class="header-anchor-link" href="#%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%A8%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E5%85%A8%E4%BD%93%E7%9A%84%E3%81%AA%E6%96%B9%E9%87%9D" aria-hidden="true"></a> 生産性と冗長性の向上のためにやっていた全体的な方針</h2> <p data-line="80" class="code-line">生産性と冗長性の向上のために色々やっていました。ただ、大体以下の2つ(組織とソフトウェア)から生産性にアプローチしていました。それ以外の個人への教育や新しいツールの導入なども大事な要素としてありますが、それ自体は小さなチームでやることと変わらないので省略します。</p> <h3 id="%E7%B5%84%E7%B9%94" data-line="82" class="code-line"> <a class="header-anchor-link" href="#%E7%B5%84%E7%B9%94" aria-hidden="true"></a> 組織</h3> <p data-line="84" class="code-line">大体以下の4点からアプローチしていました。</p> <ul data-line="86" class="code-line"> <li data-line="86" class="code-line">小さくチケットを切る</li> <li data-line="87" class="code-line">測定・計測する</li> <li data-line="88" class="code-line">振り返りを行う</li> <li data-line="89" class="code-line">心理的安全性を高める</li> </ul> <h4 id="%E5%B0%8F%E3%81%95%E3%81%8F%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E3%82%92%E5%88%87%E3%82%8B" data-line="91" class="code-line"> <a class="header-anchor-link" href="#%E5%B0%8F%E3%81%95%E3%81%8F%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E3%82%92%E5%88%87%E3%82%8B" aria-hidden="true"></a> 小さくチケットを切る</h4> <p data-line="93" class="code-line">そのままです。タスク管理にカンバンを採用していましたが、そこで切るタスク(チケット)を小さくするようにします。</p> <p data-line="95" class="code-line">基本的にアウトプットはタスクの大きさ x タスクの消化速度(頻度)で決まります。タスクの大きさを大きくすると消化速度は遅くなり、タスクの大きさを小さくすると消化速度は速くなります。ただし後戻り、タスク間の衝突・調整などのタスク外のコストはタスクが大きいほど高くなります。そのため、アウトプットについてはタスクの大きさを小さくした方が安定して良くなると考えています。</p> <h4 id="%E6%B8%AC%E5%AE%9A%E3%83%BB%E8%A8%88%E6%B8%AC%E3%81%99%E3%82%8B" data-line="97" class="code-line"> <a class="header-anchor-link" href="#%E6%B8%AC%E5%AE%9A%E3%83%BB%E8%A8%88%E6%B8%AC%E3%81%99%E3%82%8B" aria-hidden="true"></a> 測定・計測する</h4> <p data-line="99" class="code-line">チケットを小さくするとタスクの流れる速度と量が増します。すると、どの処理でどのくらい時間がかかったが目で把握することが厳しくなります。最初のうちはタスクの消化速度などを数えていましたが、そのうち細かくラベルを付けたり処理ごとの所要時間を自動で出したりすることで、改善する際の判断材料を増やしていました</p> <h4 id="%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A%E3%82%92%E8%A1%8C%E3%81%86" data-line="101" class="code-line"> <a class="header-anchor-link" href="#%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A%E3%82%92%E8%A1%8C%E3%81%86" aria-hidden="true"></a> 振り返りを行う</h4> <p data-line="103" class="code-line">定期的に振り返ることで、懸念の洗い出しや改善策の実施・評価・中断等がやりやすくなります。逆に振り返りをやらないと、懸念の洗い出しや改善策の実施は無視できない問題となって取り組むことになります。懸念のレベルで対応していればすぐに終わったことが、無視できない問題のレベルとなると終わらせるのが大変なことになります。</p> <p data-line="105" class="code-line">問題が小さいうちから共有・対処するために、月次くらいの頻度で振り返りが必要だと思います。また、案件全体レベルのこと(チーム間・内外との意思決定、予算・工数)は別途3か月単位くらいで振り返ると更に良いと思います。ただ、この期間の組合せは組織・案件によるところが大きいと思うので、振り返りをスプリントに合わせて隔週と月次、みたいな間隔の組合せもありだと思います。</p> <p data-line="107" class="code-line">副次的な効果として、誰が何をやったか、何が得意・不得意か、どういった点に着目して仕事をしているか、なども何となく分かるようになります。これは特定のタスクを誰にお願いするか決めるとき、振り返りでこんなことをやりたいとか、逆にちょっと飽き気味と言っていたな、と判断材料になることがあります。</p> <h4 id="%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B" data-line="109" class="code-line"> <a class="header-anchor-link" href="#%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B" aria-hidden="true"></a> 心理的安全性を高める</h4> <p data-line="111" class="code-line">チームで働くうえで心理的安全性の大切さはよく言われますが、チームの規模が大きくなるにつれてより大事になってくると思います。</p> <p data-line="113" class="code-line">これが低いと後戻りが多くなり、また、振り返りやコミュニケーションの効果が小さくなってしまいます。</p> <p data-line="115" class="code-line">感謝を伝える、率直に誤りを認める等々のコミュニケーションの軸はよく言われます。これについては本も沢山あります。ただ、実際にタスクを作って振る側になると仕事の負荷の軸(適切な難易度のタスクを振ること)も大事だと気づきました。いくらコミュニケーションが率直にできても仕事内容がつまらないと熱意やアウトプットが低く・小さくなってしまうので、タスクの中身や難易度にも注意していました。</p> <h3 id="%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2" data-line="117" class="code-line"> <a class="header-anchor-link" href="#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2" aria-hidden="true"></a> ソフトウェア</h3> <ul data-line="119" class="code-line"> <li data-line="119" class="code-line">自動テストを作る</li> <li data-line="120" class="code-line">コード化・自動化する</li> </ul> <h4 id="%E8%87%AA%E5%8B%95%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B" data-line="122" class="code-line"> <a class="header-anchor-link" href="#%E8%87%AA%E5%8B%95%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B" aria-hidden="true"></a> 自動テストを作る</h4> <p data-line="124" class="code-line">テストがないコードは動かないか、動いたとしてもどう動いているかは運だと考えた方が良いと思います。少人数で開発する状況なら手動でコードが動くことを確かめるだけでも何とかなります。ただ、規模が大きくなると何かしらの機能が止まって動かなくなります。なのでテストは必要です。</p> <p data-line="126" class="code-line">テストは自動で実行されないと結局回し忘れたり、回されなくなったりします。なのでテストといっても、自動で動くテストが必要です。開発規模が大きいほどコードが動かない時の影響が大きくなるので、常に最新のコードベースには自動テストが通ったコードだけを入れるようにしていました。</p> <p data-line="128" class="code-line">一方で自動テストは素早く回す必要があります。テストが拡充するほどテストの実行時間が増えますが、PRのたびに10~20分くらい待っていると大変です。なので、テストの実行頻度ごとにスコープを制限し、テスト時間を早める必要があります。依存関係にないコードのテストは動かさない、PRごとのテストはユニットテストや数Batch分の実行テストのみにする、週次ごとに全データでの実行テストをする、などのようにしていました。</p> <h4 id="%E3%82%B3%E3%83%BC%E3%83%89%E5%8C%96%E3%83%BB%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B" data-line="130" class="code-line"> <a class="header-anchor-link" href="#%E3%82%B3%E3%83%BC%E3%83%89%E5%8C%96%E3%83%BB%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B" aria-hidden="true"></a> コード化・自動化する</h4> <p data-line="132" class="code-line">ドキュメントは陳腐化します。Docstringの内容が正しいかをテストすることは難しい一方で、Type Hintの内容は誤りを検知するのは容易です。陳腐化して内容が正しくなった時点で、Docstring(ドキュメント)は何も発しませんが、Type Hint(コード)はエラーを発します。</p> <p data-line="134" class="code-line">また、コード化・自動化すれば結果は一意になります。ドキュメントは人それぞれで解釈が異なってしまい、結果として行動が一意にならない時があります(と思っています)。コード化・自動化はメンテナンスしなくなった時の弊害が大きいですが、規模が大きいチームでは1人当たりのメンテナンスのコストは小さいです。</p> <p data-line="136" class="code-line">Python3.Xをインストールしてください、ではなくDockerのように環境をコードとして管理します。データをURLからダウンロードしてXに展開してください、ではなく以下のコマンドを実行してください、とコード化します。そうすればテストしやすくなりますし、メンテナンスも楽になります。</p> <p data-line="138" class="code-line">自動化の対象としては、PRをマージしたらカンバンのDoneに移動する、モデルの変更をしたら該当するラベルを付ける、などもルールや手作業も含まれます。規模が大きくなるほどルールや手作業を守らせるのは大変になります。問題が起きてから手作業で時間を掛けてカバーすることを避けるために、ルールは増やさず自動的に行われる何かを増やすと楽になります。</p> <h2 id="%E3%81%BE%E3%81%A8%E3%82%81" data-line="140" 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="142" class="code-line">上記のようなことが、2, 3人のチームとピザ2枚分のチームの差として必要かな? と思ってやっていたことでした。</p> <p data-line="144" 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/ycarbon/articles/e2bb98e808e531&text=%E3%83%94%E3%82%B62%E6%9E%9A%E5%88%86%E3%81%AE%E4%BA%BA%E6%95%B0%E3%81%AEML%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEPM%E3%82%921%E5%B9%B4%E9%96%93%E3%82%84%E3%81%A3%E3%81%9F%E7%9F%A5%E8%A6%8B%EF%BD%9CyCarbon&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/ycarbon/articles/e2bb98e808e531" 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&url=https://zenn.dev/ycarbon/articles/e2bb98e808e531&title=%E3%83%94%E3%82%B62%E6%9E%9A%E5%88%86%E3%81%AE%E4%BA%BA%E6%95%B0%E3%81%AEML%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEPM%E3%82%921%E5%B9%B4%E9%96%93%E3%82%84%E3%81%A3%E3%81%9F%E7%9F%A5%E8%A6%8B%EF%BD%9CyCarbon" 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="/ycarbon"><img alt="yCarbon" class="AvatarImage_plain__Fgp4R " height="80" loading="lazy" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/359f271c42.jpeg" width="80"/></a><div class="ProfileCard_name__qXamf"><a class="ProfileCard_displayName__gRUeY" href="/ycarbon">yCarbon</a></div><div class="ProfileCard_content__1w905"><p class="Paragraph_common__yRSrj Paragraph_sidenote__9NTjJ Paragraph_decorateLink__aIAFh"><span>Twitter: <a href="https://twitter.com/yCarbon_jpn" target="_blank" rel="nofollow noopener noreferrer">twitter.com/yCarbon_jpn</a></span></p><div class="ProfileCard_actions__2ZjZ8"><span class="ProfileCard_follow__ng60N"></span></div></div></div></aside></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="/ycarbon"><img alt="yCarbon" class="AvatarImage_border__pDIjF AvatarImage_plain__Fgp4R " height="60" loading="lazy" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/359f271c42.jpeg" width="60"/></a><div class="SidebarUserBio_author__cM7pP"><a class="SidebarUserBio_name__0zFdT" href="/ycarbon">yCarbon</a><div class="SidebarUserBio_actions__oFupD"></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>Twitter: <a href="https://twitter.com/yCarbon_jpn" target="_blank" rel="nofollow noopener noreferrer">twitter.com/yCarbon_jpn</a></span></p></div></div><div class="ArticleSidebar_sticky__W61mq"><span style="display:block;height:1.5rem;flex-shrink:0"></span><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%83%94%E3%82%B62%E6%9E%9A%E5%88%86%E3%81%AE%E4%BA%BA%E6%95%B0%E3%81%AEml%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEpm%EF%BC%88%E3%83%97%E3%83%AC%E3%82%A4%E3%83%B3%E3%82%B0%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A3%E3%83%BC%EF%BC%89%E3%82%921%E5%B9%B4%E9%96%93%E3%82%84%E3%81%A3%E3%81%9F%E7%9F%A5%E8%A6%8B">ピザ2枚分の人数のMLプロジェクトのPM(プレイングマネジャー)を1年間やった知見</a><ol class="ol-depth-2"><li><a href="#%E8%83%8C%E6%99%AF">背景</a></li><li><a href="#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97">この記事のスコープ</a></li><li><a href="#%E3%81%AA%E3%81%9C%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%A8%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%8B%EF%BC%9F">なぜ生産性と冗長性の向上か?</a></li><li><a href="#%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE%E3%81%AF%E4%BD%95%E3%81%8B%EF%BC%9F">生産性の向上に必要なものは何か?</a></li><li><a href="#%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%A8%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E5%85%A8%E4%BD%93%E7%9A%84%E3%81%AA%E6%96%B9%E9%87%9D">生産性と冗長性の向上のためにやっていた全体的な方針</a></li><li><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></li></ol></li></ol></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="j/7rxXCO2IvKzRJ3e2j+mft+RGDMHPHZfaXTpozwdHQ=">{"props":{"pageProps":{"article":{"id":335511,"postType":"Article","title":"ピザ2枚分の人数のMLプロジェクトのPMを1年間やった知見","slug":"e2bb98e808e531","commentsCount":0,"likedCount":14,"bookmarkedCount":0,"bodyLettersCount":4936,"articleType":"idea","emoji":"🍣","isSuspendingPrivate":false,"publishedAt":"2024-11-24T08:52:06.615+09:00","bodyUpdatedAt":"2024-11-24T19:02:18.172+09:00","sourceRepoUpdatedAt":null,"pinned":false,"path":"/ycarbon/articles/e2bb98e808e531","bodyHtml":"\u003ch1 id=\"%E3%83%94%E3%82%B62%E6%9E%9A%E5%88%86%E3%81%AE%E4%BA%BA%E6%95%B0%E3%81%AEml%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEpm%EF%BC%88%E3%83%97%E3%83%AC%E3%82%A4%E3%83%B3%E3%82%B0%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A3%E3%83%BC%EF%BC%89%E3%82%921%E5%B9%B4%E9%96%93%E3%82%84%E3%81%A3%E3%81%9F%E7%9F%A5%E8%A6%8B\" data-line=\"0\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%83%94%E3%82%B62%E6%9E%9A%E5%88%86%E3%81%AE%E4%BA%BA%E6%95%B0%E3%81%AEml%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEpm%EF%BC%88%E3%83%97%E3%83%AC%E3%82%A4%E3%83%B3%E3%82%B0%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A3%E3%83%BC%EF%BC%89%E3%82%921%E5%B9%B4%E9%96%93%E3%82%84%E3%81%A3%E3%81%9F%E7%9F%A5%E8%A6%8B\" aria-hidden=\"true\"\u003e\u003c/a\u003e ピザ2枚分の人数のMLプロジェクトのPM(プレイングマネジャー)を1年間やった知見\u003c/h1\u003e\n\u003ch2 id=\"%E8%83%8C%E6%99%AF\" data-line=\"2\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E8%83%8C%E6%99%AF\" aria-hidden=\"true\"\u003e\u003c/a\u003e 背景\u003c/h2\u003e\n\u003cp data-line=\"4\" class=\"code-line\"\u003e2023/10から現在(2024/11)まで1年くらいプレイングマネジャーをやっていました。\u003c/p\u003e\n\u003cp data-line=\"6\" class=\"code-line\"\u003e規模としてはピザ2枚分(自分を含めて5~7人前後)の機械学習エンジニアのプロジェクト上での管理をしつつ、自分でもチケットを消化していました。\u003c/p\u003e\n\u003cp data-line=\"8\" class=\"code-line\"\u003eそこでの教訓を共有します。\u003c/p\u003e\n\u003ch2 id=\"%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97\" data-line=\"10\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97\" aria-hidden=\"true\"\u003e\u003c/a\u003e この記事のスコープ\u003c/h2\u003e\n\u003ch3 id=\"%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E3%81%93%E3%81%A8\" data-line=\"12\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E3%81%93%E3%81%A8\" aria-hidden=\"true\"\u003e\u003c/a\u003e マネジャーとしてやっていたこと\u003c/h3\u003e\n\u003cp data-line=\"14\" class=\"code-line\"\u003e主に技術開発のPoCで、タスクを作成・管理しつつ、ピザ2枚分(自分を含めて5~7人前後)の機械学習エンジニアのリーダーをやっていました。また、顧客とのやり取りやその結果生じた開発タスクの調整、会社との方針とタスクのすり合わせ等もやっていました。\u003cbr\u003e\n自分もタスクを消化していたので俗にいうプレイングマネジャーでした。\u003c/p\u003e\n\u003cp data-line=\"17\" class=\"code-line\"\u003eただし工数管理、社内手続き(稟議など)、社外手続き(契約など)などはノータッチで、PjMに委ねていました。\u003c/p\u003e\n\u003cp data-line=\"19\" class=\"code-line\"\u003eチーム向けにマネジャーとしては、以下の2つのタスクに大体ずっと取り組んでいました\u003c/p\u003e\n\u003col data-line=\"21\" class=\"code-line\"\u003e\n\u003cli data-line=\"21\" class=\"code-line\"\u003e\n\u003cp data-line=\"21\" class=\"code-line\"\u003e生産性を最大化する\u003c/p\u003e\n\u003c/li\u003e\n\u003cli data-line=\"23\" class=\"code-line\"\u003e\n\u003cp data-line=\"23\" class=\"code-line\"\u003e冗長性を高める\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp data-line=\"25\" class=\"code-line\"\u003eこのチームへの動きについてフォーカスを当てます。\u003c/p\u003e\n\u003ch3 id=\"%E8%A8%98%E4%BA%8B%E3%81%A7%E3%81%AF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E5%A4%96%E3%81%AE%E3%81%93%E3%81%A8\" data-line=\"27\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E8%A8%98%E4%BA%8B%E3%81%A7%E3%81%AF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E5%A4%96%E3%81%AE%E3%81%93%E3%81%A8\" aria-hidden=\"true\"\u003e\u003c/a\u003e 記事ではスコープ外のこと\u003c/h3\u003e\n\u003cp data-line=\"29\" class=\"code-line\"\u003e社外向けに折衝したり、その結果や組織としての方向性からタスクを計画・実行したりもしました。ただ、そういった仕事はエンジニアが1人だけの小さなチームでやっていたころの延長線上だったので省略します。\u003cbr\u003e\nあくまで他のエンジニアを管理するエンジニアの立場になって、何が違ったか・何をやったかという話を書きます。\u003c/p\u003e\n\u003cp data-line=\"32\" class=\"code-line\"\u003e話を広げると書ききる前に燃え尽きるため、PjMやPdM、組織間のやりとりや組織・コミュニケーションの設計の話はここでは扱いません。\u003c/p\u003e\n\u003ch2 id=\"%E3%81%AA%E3%81%9C%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%A8%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%8B%EF%BC%9F\" data-line=\"34\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%81%AA%E3%81%9C%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%A8%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%8B%EF%BC%9F\" aria-hidden=\"true\"\u003e\u003c/a\u003e なぜ生産性と冗長性の向上か?\u003c/h2\u003e\n\u003ch3 id=\"%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A\" data-line=\"36\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A\" aria-hidden=\"true\"\u003e\u003c/a\u003e 生産性の向上\u003c/h3\u003e\n\u003cp data-line=\"38\" class=\"code-line\"\u003e生産性の向上は、以下のことにつながります。\u003c/p\u003e\n\u003col data-line=\"40\" class=\"code-line\"\u003e\n\u003cli data-line=\"40\" class=\"code-line\"\u003e\n\u003cp data-line=\"40\" class=\"code-line\"\u003e一定期間でできるだけ多くのことを実現する\u003c/p\u003e\n\u003c/li\u003e\n\u003cli data-line=\"42\" class=\"code-line\"\u003e\n\u003cp data-line=\"42\" class=\"code-line\"\u003e同じことについてできるだけ早く実現する\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp data-line=\"44\" class=\"code-line\"\u003e同じ稼働時間でより大きなことをでき、同じことをやる際に稼働時間がより短い方が利益や価値が出ます。組織の値付けや評価が工数ベースであれ価値ベースであれ生産性の向上は有益で、大体の組織で目標として言及されていると思います。\u003c/p\u003e\n\u003ch3 id=\"%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A\" data-line=\"46\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A\" aria-hidden=\"true\"\u003e\u003c/a\u003e 冗長性の向上\u003c/h3\u003e\n\u003cp data-line=\"48\" class=\"code-line\"\u003e冗長性は生産性につながるものです。\u003c/p\u003e\n\u003cp data-line=\"50\" class=\"code-line\"\u003eリーダーが全部チケットを切って、相談に乗って、レビューして、資料を書く体制だと、リーダーが止まると全て止まります。リーダーの業務時間だけチームが動くことになり、チームのスループットはリーダーがネックになります。\u003c/p\u003e\n\u003cp data-line=\"52\" class=\"code-line\"\u003eこのような状況だと、リーダー以外の生産性をどれだけ上げても(仮に100人雇ったり、100人力のメンバーを1人雇ったりしても)、リーダーのところでタスクの消化が止まります。冗長性の課題はボトルネックに近しく、ここを多重化したり委譲したりすると、タスクの消化が止まりにくくネックになりにくくなります。チームの能力を引き出したり、チームの規模を拡大するためにはタスクを消化するプロセス上に単一障害点がなるべく無いように設計する必要があります。\u003c/p\u003e\n\u003cp data-line=\"54\" class=\"code-line\"\u003eまた、長期的にはタスクを委譲しないとメンバーが育たたない、という話もあります。どれだけ教育をしても、結局はタスクを任せてみないことにはタスクをどれほど上手くこなせるか分からないです。ピーターの法則を避けて将来的により上のロールで動けるか判断するためにも、委譲は大切です。\u003c/p\u003e\n\u003ch2 id=\"%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE%E3%81%AF%E4%BD%95%E3%81%8B%EF%BC%9F\" data-line=\"58\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE%E3%81%AF%E4%BD%95%E3%81%8B%EF%BC%9F\" aria-hidden=\"true\"\u003e\u003c/a\u003e 生産性の向上に必要なものは何か?\u003c/h2\u003e\n\u003cp data-line=\"60\" class=\"code-line\"\u003e主に生産性の向上に主眼を置いた時、自分は色々調べて先人の知恵に習っていました。\u003c/p\u003e\n\u003ch3 id=\"%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AB%E3%81%AF%E5%B7%A5%E5%A0%B4%E3%81%A8%E5%90%8C%E3%81%98\" data-line=\"62\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AB%E3%81%AF%E5%B7%A5%E5%A0%B4%E3%81%A8%E5%90%8C%E3%81%98\" aria-hidden=\"true\"\u003e\u003c/a\u003e 基本的には工場と同じ\u003c/h3\u003e\n\u003cp data-line=\"64\" class=\"code-line\"\u003e異論はあると思いますが、ソフトウェア開発であっても基本は工場と同じです。\u003c/p\u003e\n\u003cp data-line=\"66\" class=\"code-line\"\u003eボトルネックを見つけて改善します。細かな理論は色々ありますが、自分はTOC理論と呼ばれるような枠組みを意識して、測定と計画、介入を繰り返していました。\u003c/p\u003e\n\u003cp data-line=\"68\" class=\"code-line\"\u003e詰まっている部分 = WIP = ボトルネック以外を改善しても生産性は向上せず、ボトルネックの詰まりが増えるだけ、という考え方に基づいています。他にも色々な考え方はありますが、生産性に着目するなら結局はこの考えかこの考えと似た考え方に則ってやることになると思います。\u003c/p\u003e\n\u003ch3 id=\"%E5%B7%A5%E5%A0%B4%E3%81%A8%E7%95%B0%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%82%E3%82%8B\" data-line=\"70\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E5%B7%A5%E5%A0%B4%E3%81%A8%E7%95%B0%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%82%E3%82%8B\" 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大きな違いは並列して作成する製品数と生産設備の汎用性です。\u003c/p\u003e\n\u003cp data-line=\"76\" class=\"code-line\"\u003eTOC理論ではプロセス間のどこかで大量に生産している製品が詰まり、処理待ちの在庫(WIP)が発生することでボトルネックを特定します。ただしMLプロジェクト、特にPoCや技術検証のようにモデルを作るだけで終わるケースでは、1人が全プロセスを受け持つことができてしまいます。また、1人が並行して受け持てるのはせいぜい2つ程度で、チーム全体でもWIPは高々人数 x 1~2個程度です。この場合、調査、実装、テスト、計算、レポート、レビューのいずれかの特定のプロセスに対してWIPは高々数個に収まります。派手に滞留することがあまりないため、問題があっても見えにくくなります。\u003c/p\u003e\n\u003ch2 id=\"%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%A8%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E5%85%A8%E4%BD%93%E7%9A%84%E3%81%AA%E6%96%B9%E9%87%9D\" data-line=\"78\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%A8%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E5%85%A8%E4%BD%93%E7%9A%84%E3%81%AA%E6%96%B9%E9%87%9D\" aria-hidden=\"true\"\u003e\u003c/a\u003e 生産性と冗長性の向上のためにやっていた全体的な方針\u003c/h2\u003e\n\u003cp data-line=\"80\" class=\"code-line\"\u003e生産性と冗長性の向上のために色々やっていました。ただ、大体以下の2つ(組織とソフトウェア)から生産性にアプローチしていました。それ以外の個人への教育や新しいツールの導入なども大事な要素としてありますが、それ自体は小さなチームでやることと変わらないので省略します。\u003c/p\u003e\n\u003ch3 id=\"%E7%B5%84%E7%B9%94\" data-line=\"82\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E7%B5%84%E7%B9%94\" aria-hidden=\"true\"\u003e\u003c/a\u003e 組織\u003c/h3\u003e\n\u003cp data-line=\"84\" class=\"code-line\"\u003e大体以下の4点からアプローチしていました。\u003c/p\u003e\n\u003cul data-line=\"86\" class=\"code-line\"\u003e\n\u003cli data-line=\"86\" class=\"code-line\"\u003e小さくチケットを切る\u003c/li\u003e\n\u003cli data-line=\"87\" class=\"code-line\"\u003e測定・計測する\u003c/li\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\u003ch4 id=\"%E5%B0%8F%E3%81%95%E3%81%8F%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E3%82%92%E5%88%87%E3%82%8B\" data-line=\"91\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E5%B0%8F%E3%81%95%E3%81%8F%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E3%82%92%E5%88%87%E3%82%8B\" aria-hidden=\"true\"\u003e\u003c/a\u003e 小さくチケットを切る\u003c/h4\u003e\n\u003cp data-line=\"93\" class=\"code-line\"\u003eそのままです。タスク管理にカンバンを採用していましたが、そこで切るタスク(チケット)を小さくするようにします。\u003c/p\u003e\n\u003cp data-line=\"95\" class=\"code-line\"\u003e基本的にアウトプットはタスクの大きさ x タスクの消化速度(頻度)で決まります。タスクの大きさを大きくすると消化速度は遅くなり、タスクの大きさを小さくすると消化速度は速くなります。ただし後戻り、タスク間の衝突・調整などのタスク外のコストはタスクが大きいほど高くなります。そのため、アウトプットについてはタスクの大きさを小さくした方が安定して良くなると考えています。\u003c/p\u003e\n\u003ch4 id=\"%E6%B8%AC%E5%AE%9A%E3%83%BB%E8%A8%88%E6%B8%AC%E3%81%99%E3%82%8B\" data-line=\"97\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E6%B8%AC%E5%AE%9A%E3%83%BB%E8%A8%88%E6%B8%AC%E3%81%99%E3%82%8B\" aria-hidden=\"true\"\u003e\u003c/a\u003e 測定・計測する\u003c/h4\u003e\n\u003cp data-line=\"99\" class=\"code-line\"\u003eチケットを小さくするとタスクの流れる速度と量が増します。すると、どの処理でどのくらい時間がかかったが目で把握することが厳しくなります。最初のうちはタスクの消化速度などを数えていましたが、そのうち細かくラベルを付けたり処理ごとの所要時間を自動で出したりすることで、改善する際の判断材料を増やしていました\u003c/p\u003e\n\u003ch4 id=\"%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A%E3%82%92%E8%A1%8C%E3%81%86\" data-line=\"101\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A%E3%82%92%E8%A1%8C%E3%81%86\" aria-hidden=\"true\"\u003e\u003c/a\u003e 振り返りを行う\u003c/h4\u003e\n\u003cp data-line=\"103\" class=\"code-line\"\u003e定期的に振り返ることで、懸念の洗い出しや改善策の実施・評価・中断等がやりやすくなります。逆に振り返りをやらないと、懸念の洗い出しや改善策の実施は無視できない問題となって取り組むことになります。懸念のレベルで対応していればすぐに終わったことが、無視できない問題のレベルとなると終わらせるのが大変なことになります。\u003c/p\u003e\n\u003cp data-line=\"105\" class=\"code-line\"\u003e問題が小さいうちから共有・対処するために、月次くらいの頻度で振り返りが必要だと思います。また、案件全体レベルのこと(チーム間・内外との意思決定、予算・工数)は別途3か月単位くらいで振り返ると更に良いと思います。ただ、この期間の組合せは組織・案件によるところが大きいと思うので、振り返りをスプリントに合わせて隔週と月次、みたいな間隔の組合せもありだと思います。\u003c/p\u003e\n\u003cp data-line=\"107\" class=\"code-line\"\u003e副次的な効果として、誰が何をやったか、何が得意・不得意か、どういった点に着目して仕事をしているか、なども何となく分かるようになります。これは特定のタスクを誰にお願いするか決めるとき、振り返りでこんなことをやりたいとか、逆にちょっと飽き気味と言っていたな、と判断材料になることがあります。\u003c/p\u003e\n\u003ch4 id=\"%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B\" data-line=\"109\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B\" aria-hidden=\"true\"\u003e\u003c/a\u003e 心理的安全性を高める\u003c/h4\u003e\n\u003cp data-line=\"111\" class=\"code-line\"\u003eチームで働くうえで心理的安全性の大切さはよく言われますが、チームの規模が大きくなるにつれてより大事になってくると思います。\u003c/p\u003e\n\u003cp data-line=\"113\" class=\"code-line\"\u003eこれが低いと後戻りが多くなり、また、振り返りやコミュニケーションの効果が小さくなってしまいます。\u003c/p\u003e\n\u003cp data-line=\"115\" class=\"code-line\"\u003e感謝を伝える、率直に誤りを認める等々のコミュニケーションの軸はよく言われます。これについては本も沢山あります。ただ、実際にタスクを作って振る側になると仕事の負荷の軸(適切な難易度のタスクを振ること)も大事だと気づきました。いくらコミュニケーションが率直にできても仕事内容がつまらないと熱意やアウトプットが低く・小さくなってしまうので、タスクの中身や難易度にも注意していました。\u003c/p\u003e\n\u003ch3 id=\"%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2\" data-line=\"117\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2\" aria-hidden=\"true\"\u003e\u003c/a\u003e ソフトウェア\u003c/h3\u003e\n\u003cul data-line=\"119\" class=\"code-line\"\u003e\n\u003cli data-line=\"119\" class=\"code-line\"\u003e自動テストを作る\u003c/li\u003e\n\u003cli data-line=\"120\" class=\"code-line\"\u003eコード化・自動化する\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"%E8%87%AA%E5%8B%95%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B\" data-line=\"122\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E8%87%AA%E5%8B%95%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B\" aria-hidden=\"true\"\u003e\u003c/a\u003e 自動テストを作る\u003c/h4\u003e\n\u003cp data-line=\"124\" class=\"code-line\"\u003eテストがないコードは動かないか、動いたとしてもどう動いているかは運だと考えた方が良いと思います。少人数で開発する状況なら手動でコードが動くことを確かめるだけでも何とかなります。ただ、規模が大きくなると何かしらの機能が止まって動かなくなります。なのでテストは必要です。\u003c/p\u003e\n\u003cp data-line=\"126\" class=\"code-line\"\u003eテストは自動で実行されないと結局回し忘れたり、回されなくなったりします。なのでテストといっても、自動で動くテストが必要です。開発規模が大きいほどコードが動かない時の影響が大きくなるので、常に最新のコードベースには自動テストが通ったコードだけを入れるようにしていました。\u003c/p\u003e\n\u003cp data-line=\"128\" class=\"code-line\"\u003e一方で自動テストは素早く回す必要があります。テストが拡充するほどテストの実行時間が増えますが、PRのたびに10~20分くらい待っていると大変です。なので、テストの実行頻度ごとにスコープを制限し、テスト時間を早める必要があります。依存関係にないコードのテストは動かさない、PRごとのテストはユニットテストや数Batch分の実行テストのみにする、週次ごとに全データでの実行テストをする、などのようにしていました。\u003c/p\u003e\n\u003ch4 id=\"%E3%82%B3%E3%83%BC%E3%83%89%E5%8C%96%E3%83%BB%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B\" data-line=\"130\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%82%B3%E3%83%BC%E3%83%89%E5%8C%96%E3%83%BB%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B\" aria-hidden=\"true\"\u003e\u003c/a\u003e コード化・自動化する\u003c/h4\u003e\n\u003cp data-line=\"132\" class=\"code-line\"\u003eドキュメントは陳腐化します。Docstringの内容が正しいかをテストすることは難しい一方で、Type Hintの内容は誤りを検知するのは容易です。陳腐化して内容が正しくなった時点で、Docstring(ドキュメント)は何も発しませんが、Type Hint(コード)はエラーを発します。\u003c/p\u003e\n\u003cp data-line=\"134\" class=\"code-line\"\u003eまた、コード化・自動化すれば結果は一意になります。ドキュメントは人それぞれで解釈が異なってしまい、結果として行動が一意にならない時があります(と思っています)。コード化・自動化はメンテナンスしなくなった時の弊害が大きいですが、規模が大きいチームでは1人当たりのメンテナンスのコストは小さいです。\u003c/p\u003e\n\u003cp data-line=\"136\" class=\"code-line\"\u003ePython3.Xをインストールしてください、ではなくDockerのように環境をコードとして管理します。データをURLからダウンロードしてXに展開してください、ではなく以下のコマンドを実行してください、とコード化します。そうすればテストしやすくなりますし、メンテナンスも楽になります。\u003c/p\u003e\n\u003cp data-line=\"138\" class=\"code-line\"\u003e自動化の対象としては、PRをマージしたらカンバンのDoneに移動する、モデルの変更をしたら該当するラベルを付ける、などもルールや手作業も含まれます。規模が大きくなるほどルールや手作業を守らせるのは大変になります。問題が起きてから手作業で時間を掛けてカバーすることを避けるために、ルールは増やさず自動的に行われる何かを増やすと楽になります。\u003c/p\u003e\n\u003ch2 id=\"%E3%81%BE%E3%81%A8%E3%82%81\" data-line=\"140\" 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=\"142\" class=\"code-line\"\u003e上記のようなことが、2, 3人のチームとピザ2枚分のチームの差として必要かな? と思ってやっていたことでした。\u003c/p\u003e\n\u003cp data-line=\"144\" class=\"code-line\"\u003eやっていたプロジェクト・組織固有のことが多々あると思いますが、何かしらの参考になれば幸いです。\u003c/p\u003e\n","ogImageUrl":"https://res.cloudinary.com/zenn/image/upload/s--sdNLImmp--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2583%2594%25E3%2582%25B62%25E6%259E%259A%25E5%2588%2586%25E3%2581%25AE%25E4%25BA%25BA%25E6%2595%25B0%25E3%2581%25AEML%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B8%25E3%2582%25A7%25E3%2582%25AF%25E3%2583%2588%25E3%2581%25AEPM%25E3%2582%25921%25E5%25B9%25B4%25E9%2596%2593%25E3%2582%2584%25E3%2581%25A3%25E3%2581%259F%25E7%259F%25A5%25E8%25A6%258B%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:yCarbon%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzM1OWYyNzFjNDIuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png","toc":[{"id":"%E3%83%94%E3%82%B62%E6%9E%9A%E5%88%86%E3%81%AE%E4%BA%BA%E6%95%B0%E3%81%AEml%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEpm%EF%BC%88%E3%83%97%E3%83%AC%E3%82%A4%E3%83%B3%E3%82%B0%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A3%E3%83%BC%EF%BC%89%E3%82%921%E5%B9%B4%E9%96%93%E3%82%84%E3%81%A3%E3%81%9F%E7%9F%A5%E8%A6%8B","text":"ピザ2枚分の人数のMLプロジェクトのPM(プレイングマネジャー)を1年間やった知見","level":1,"children":[{"id":"%E8%83%8C%E6%99%AF","text":"背景","level":2,"children":[]},{"id":"%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97","text":"この記事のスコープ","level":2,"children":[{"id":"%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E3%81%93%E3%81%A8","text":"マネジャーとしてやっていたこと","level":3,"children":[]},{"id":"%E8%A8%98%E4%BA%8B%E3%81%A7%E3%81%AF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E5%A4%96%E3%81%AE%E3%81%93%E3%81%A8","text":"記事ではスコープ外のこと","level":3,"children":[]}]},{"id":"%E3%81%AA%E3%81%9C%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%A8%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%8B%EF%BC%9F","text":"なぜ生産性と冗長性の向上か?","level":2,"children":[{"id":"%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A","text":"生産性の向上","level":3,"children":[]},{"id":"%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A","text":"冗長性の向上","level":3,"children":[]}]},{"id":"%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE%E3%81%AF%E4%BD%95%E3%81%8B%EF%BC%9F","text":"生産性の向上に必要なものは何か?","level":2,"children":[{"id":"%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AB%E3%81%AF%E5%B7%A5%E5%A0%B4%E3%81%A8%E5%90%8C%E3%81%98","text":"基本的には工場と同じ","level":3,"children":[]},{"id":"%E5%B7%A5%E5%A0%B4%E3%81%A8%E7%95%B0%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%82%E3%82%8B","text":"工場と異なることもある","level":3,"children":[]}]},{"id":"%E7%94%9F%E7%94%A3%E6%80%A7%E3%81%A8%E5%86%97%E9%95%B7%E6%80%A7%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E3%82%84%E3%81%A3%E3%81%A6%E3%81%84%E3%81%9F%E5%85%A8%E4%BD%93%E7%9A%84%E3%81%AA%E6%96%B9%E9%87%9D","text":"生産性と冗長性の向上のためにやっていた全体的な方針","level":2,"children":[{"id":"%E7%B5%84%E7%B9%94","text":"組織","level":3,"children":[]},{"id":"%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2","text":"ソフトウェア","level":3,"children":[]}]},{"id":"%E3%81%BE%E3%81%A8%E3%82%81","text":"まとめ","level":2,"children":[]}]}],"tocEnabled":true,"shouldNoindex":false,"scheduledPublishAt":null,"canSendBadge":false,"status":"published","badges":[]},"user":{"id":73611,"username":"ycarbon","name":"yCarbon","avatarSmallUrl":"https://res.cloudinary.com/zenn/image/fetch/s--U3fO1krp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/359f271c42.jpeg","avatarUrl":"https://storage.googleapis.com/zenn-user-upload/avatar/359f271c42.jpeg","bio":"Twitter: https://twitter.com/yCarbon_jpn","autolinkedBio":"Twitter: \u003ca href=\"https://twitter.com/yCarbon_jpn\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003etwitter.com/yCarbon_jpn\u003c/a\u003e","githubUsername":null,"twitterUsername":null,"isSupportOpen":false,"tokusyoContact":null,"tokusyoName":null,"websiteUrl":null,"websiteDomain":null,"totalLikedCount":78,"gaTrackingId":null,"hatenaId":null,"isInvoiceIssuer":false},"topics":[{"id":152,"name":"機械学習","taggingsCount":1888,"imageUrl":"https://storage.googleapis.com/zenn-user-upload/topics/fb39b9c866.png","displayName":"機械学習"},{"id":781,"name":"マネージメント","taggingsCount":12,"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":null}},"page":"/[username]/articles/[slug]","query":{"username":"ycarbon","slug":"e2bb98e808e531"},"buildId":"6cWpQ5Z1LAtdbyaB4EE5X","assetPrefix":"https://static.zenn.studio","isFallback":false,"isExperimentalCompile":false,"gip":true,"scriptLoader":[]}</script></body></html>