Slide 1

Slide 1 text

田中裕一 (@yuichielectric), 2021/02/18 Developers Summit 2021 オープンソースのベストプラクティスを企業内で実践 〜インナーソースのすすめ 服部佑樹 (@yuhattor) 2021/02/18

Slide 2

Slide 2 text

Developers Summit 2021 • Microsoft における InnerSource – Open Source プラクティスの社内実装 • GitHubを使ってどのようにInnerSourceを実践するか Agenda

Slide 3

Slide 3 text

Developers Summit 2021 どのようにインナーソースを実践するか 服部 佑樹 @yuhattor Azure AppDev Specialist, Microsoft

Slide 4

Slide 4 text

Azure DevOps と GitHub は 同じチームが開発しています。 Microsoft にいる10万⼈以上の エンジニアの標準ツールです GitHub Actions をはじめとす る機能開発と認証連携

Slide 5

Slide 5 text

田中裕一 (@yuichielectric), 2021/02/18 Developers Summit 2021 InnerSource とは

Slide 6

Slide 6 text

InnerSource is ... “Applying the concepts and lessons of successful open source ecosystems to how a company develops software internally” “成功したオープンソース・エコシステムのコンセプトと学びを、 企業が社内でソフトウェアを開発する⽅法に適⽤する" GitHub innersourcecommons.org

Slide 7

Slide 7 text

InnerSourceは、企業⽂化や企業の制限を尊重しつつ、オープンソースに似た内部の シェアリングエコノミー に向けて⽂化的に変⾰していく旅です。 à 開発効率を上げ、より良い顧客満⾜度と成果につなげることが⽬的です。

Slide 8

Slide 8 text

田中裕一 (@yuichielectric), 2021/02/18 Developers Summit 2021 Microsoft が InnerSource を始めた背景と InnerSource の効果 服部 佑樹 (@yuhattr), 2021/02/18

Slide 9

Slide 9 text

http://www.bonkersworld.net/images/2011.06.27_organizational_charts.png 柔軟でない組織 - 規模拡⼤に伴う官僚制組織化 コラボレーションの低下 - 部⾨間の競争激化や政治 モノリシックで、⼤きくなりすぎたソースコード - コンウェイの法則により、ソースコードも⼀枚岩に - コンポーネントの共有も難しく開発の難易度があがる

Slide 10

Slide 10 text

Mission Our mission is to enable the world's best engineering teams with world-class tools and systems that help them ship products their customer love. 私たちの使命は、世界最⾼のエンジニアリングチームが顧客に愛される製品を出荷するための ワールドクラスのツールとシステムを利⽤できるようにすることです。 #開発基盤の整備 #開発者のサポート #GitHub 推進 #社内StackOverflowの整備 #OpenSourceの促進 #Inclusiveデザインの適⽤(アクセシビリティ) #プラクティスの社内共有 #インナーソースの適⽤

Slide 11

Slide 11 text

コントリビューションの可視化 • 63,000 Pull Request • 3,000 Repository • 11,000 Contributor • 35,000 Reviewer *FY18時点 コラボレーションの増加 オープンソースコミュニティと同じプロセス とプラクティスを使⽤して、組織内でチーム が共同作業します サイロを壊す チーム間でのコラボレーションの簡素化、知 識の共有、コードの再利⽤の改善、安全な ワークフロー 開発者の満⾜度向上 インナーソースとオープンソースのプラクティ スを活⽤することで、開発者の満⾜度が⾼まり、 興味のあるプロジェクトに取り組み、スキルを 向上させることができます

Slide 12

Slide 12 text

InnerSource を実現する 4 ポイント 発⾒可能性 パートナーチームがコードベース、ドキュメント、およびその他の関連資料を すべて検索し、事前のドメイン知識なしでプロジェクトを探索すること 実⾏可能性 パートナーチームがソースコードを迅速かつ簡単にコンパイルおよび実⾏できる、または別プロ ジェクトの⼀部としてソースコードを簡単に使⽤できること。カプセル化されており、即実⾏で きる。 貢献性 パートナーチームが問題を簡単に報告し、質問し、新しい機能を提案し、障壁なく前向きな⽅法 でコミットをアップストリームすること 継続性 すべてのチームがコードをメンテナンスし続けること

Slide 13

Slide 13 text

InnerSource をドライブするということは GitHub • コラボレーションを妨げたり、 遅らせたりする障壁を取り除く/減らす • オープン/協⼒的な⾏動を奨励する • 客観的な尺度で現状を評価し、伝える • ステータスと進捗状況を測定するための データを提供する • ⽂化的変化を促進する • ⼈の働き⽅を決める • 新しい統制プロセスの追加 • 活動を抑制する • コードベースのキュレーション • 新しいツールを⾃前で構築 • 新しいタイプのリポジトリを作成 以下である。 以下でない。

Slide 14

Slide 14 text

InnerSource をドライブするということは GitHub • 特定の⽬的のための、複雑なソリューション • 貢献 = 気晴らし • ⾃分のコード • ⾞輪の再発明 • 製品 = コード • よりシンプルなモジュール式コンポーネント • 貢献 = コラボレーションとコミュニティへの投資 • 私たちのコード • 再利⽤し構築 • 製品 != コード Product Product Product Product インナーソースの狙い Product Product Product Product 最⼤化を狙う 少ない共有部分 かつての運⽤

Slide 15

Slide 15 text

田中裕一 (@yuichielectric), 2021/02/18 Developers Summit 2021 Microsoft の InnerSource プラクティス

Slide 16

Slide 16 text

1. 発⾒ 2. デザイン 3. 開発 4. デプロイ 5. メンテナンス • PMが新機能のリクエストを持ち込 む • PMが要件の検証(顧客インタ ビュー、既存のバックログに対す る機能の検証)を⾏い、 InnerSourcing のための機能の優 先順位を決定 • PMが要件ドキュメントを作成 • PMは、製品の⼀貫性(ユーザーエ クスペリエンス、ルック&フィー ル、製品ロードマップの整合性な ど)を確保するための要件をレ ビューします。 • Dev/PM が要件をレビューし、設 計ソリューションを議論します。 • PMは、必要に応じてさらなる顧 客検証を実施します。 • Dev は、作業を開始する前に、サ ポートしている開発者と設計計画 を議論します。 • 開発者は、開発チームの延⻑線 上で働きます (すなわち、該当 プロダクトのコードベースで機 能を構築、PR をチェック、機 能をテスト、バグバッシュをホ スト、デモ、ドキュメントの作 成を⾏います)。 • Dev は必要に応じてガイダンス を提供し、ブロッカーを取り除 きますます。 • PMが機能を有効にする前にコ ミュニティに新機能のリリース を送信します。 • 顧客に影響を与える機能は、混 乱を防ぐために Feature Flag を ⽤います。 • コードは通常、プルリクエスト を完了してから 4 時間以内に本 番環境にデプロイされます。 • インナーソース中は、開発 者が開発した機能を⽀援し たり、デバッグしたりしま す。 • 最終的には、開発チームが 製品の責任者となり、開発 終了後も機能のメンテナン スを⾏います。 • Weekly PM シンク • Weekly Dev/PM シンク PM toolkit • インタビューのテンプレート • サンプル要件テンプレート • 製品ビジョン - スライド7 • 機能バックログ PM toolkit • 新機能リリーステンプレート 早めに、オープンに、書⾯でコミュニケーションをとる 貢献者をチームの ⼀員として扱う ⽂書化して実験を簡単に ex: 共通の要件 ex: 30⽇間保証 メンターシップ 貢献の Recognition Best Practices Microsoft の InnerSource フレームワーク

Slide 17

Slide 17 text

役割 タスク

Slide 18

Slide 18 text

Microsoft の収集する Customer Metrics (Customer = 社内ユーザー) メトリクスの収集をし、社内での InnerSource 促進の管理をします。 • Contributor が複数いるリポジトリ • CONTRIBUTING.md が存在するリポジトリ • README.md が存在するリポジトリ • Fork の数 例) 1ヶ⽉の開発状況の変化: (+3%) (+0.1%) (+0.9%) Contributor が複数いるリポジトリ CONTRIBUTING.md ファイルが存在するリポジトリ README.md ファイルが存在するリポジトリ

Slide 19

Slide 19 text

Microsoft の収集する Customer Metrics (Customer = 社内ユーザー) 期中のプルリクエストの数と、チームを越えたプルリクエストの数をトラックします プルリクエスト チームを越えたPR % Q1 FY19 852k 37k 5.6% Q2 FY19 810k 35k 4.2% Q3 FY19 912K 39k 4.8% Q4 FY19 1.0M 46k 4.1% Q1 FY20 1.2M 43k 3.6%

Slide 20

Slide 20 text

Microsoft 開発チームの OKRs の例 Object コードオーナーが、⾃分たちのソフトウェアがどのよう に使われているかを理解し、コントリビューターを募集 する⽅法を理解している Key Result • InnerSourceの貢献パイプラインのメトリクスを定義 し、消費しやすい⽅法で提供する (使⽤状況、インタラクション、および貢献の追跡) • InnerSourceの貢献パイプラインMVPが、関連する2 つのチームで採⽤されていること Action Item • チームが使⽤できるInnerSourceモデルとダッシュ ボードMVPの開発 • モデルとダッシュボードを公開 • ファネルを改善するためのアクション指向のガイダン スとワークフローを開発し、提供します。 InnerSource OKR Object マイクロソフトのエンジニアがコードの共同作業を可能 にする Key Result • Microsoftのすべてのアクティブなアカウントで、 InnerSourceガイドラインが導⼊されたForksプロ ジェクトがある(〇〇%から◯ポイント増加) Action Item • アカウント所有者のために Fork プロジェクトを作成 するためのワークフローを作成する • Fork プロジェクトをまだ持っていない関連するすべて のMicrosoftアカウントにバナーを作成/ロールアウト する InnerSource OKR

Slide 21

Slide 21 text

田中裕一 (@yuichielectric), 2021/02/18 Developers Summit 2021 プロダクト開発チーム以外の InnerSource

Slide 22

Slide 22 text

⾃社プロダクト以外の InnerSource Practice: Microsoft サービス部⾨

Slide 23

Slide 23 text

プロダクト開発と同⼀の開発フロー Azure Boards UserVoice IdeaFarm IP Council SI Field BP Field Component Library IPKit 1801 1804 1807 1808 Aka.ms Link Publish Content Update Library Portfolio IPForum 1804 1807 1808 vNext 1801 Offering Sales Content Scoping Content Delivery Content Aka.ms Link

Slide 24

Slide 24 text

ここまでのまとめ GitHub InnerSource は⽂化変⾰の旅。 継続的に社内で⽂化を育てましょう。 発⾒可能性 / 実⾏可能性 / 貢献性 / 継続性 が重要。 InnerSource のメトリクスをとってみましょう。 Fun! InnerSource の活動は社内統制や標準化の活動の⼀環としてでは なく、“投資” として⾏いましょう。 そして、何よりも楽しんでコラボレーションをしよう。

Slide 25

Slide 25 text

ాத ༟Ұ (@yuichielectric), 2021/02/18 Developers Summit 2021 (JU)VCΛ࢖ͬͯͲͷΑ͏ʹ ΠϯφʔιʔεΛ࣮ફ͢Δ͔

Slide 26

Slide 26 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ ాத ༟Ұ γχΞιϦϡʔγϣϯζΤϯδχΞ yuichielectric yuichielectric

Slide 27

Slide 27 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ ͲͷϓϩδΣΫτΛ ΠϯφʔιʔεԽ ͢Δ͔ʁ ϓϩδΣΫτΛ Ͳ͏ݟ͚ͭͯ΋Β͏͔ʁ Ͳ͏΍ͬͯ ίϯτϦϏϡʔτ ͯ͠΋Β͏͔ʁ ͏·͍͍ͬͯ͘Δ͔Λ Ͳ͏ଌΔʁ

Slide 28

Slide 28 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ ͲͷϓϩδΣΫτΛ ΠϯφʔιʔεԽ ͢Δ͔ʁ ϓϩδΣΫτΛ Ͳ͏ݟ͚ͭͯ΋Β͏͔ʁ Ͳ͏΍ͬͯ ίϯτϦϏϡʔτ ͯ͠΋Β͏͔ʁ ͏·͍͍ͬͯ͘Δ͔Λ Ͳ͏ଌΔʁ

Slide 29

Slide 29 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ ͍͖ͳΓΈΜͳ͓ޓ͍ίϯτϦϏϡʔτ͠߹͍·͠ΐ͏ʂ ͱݴͬͯ΋޿·Βͳ͍ ͲͷϓϩδΣΫτΛΠϯφʔιʔεԽ͢Δ͔ʁ

Slide 30

Slide 30 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ Ϣʔβʔ ίϯτϦϏϡʔλʔ ϝϯςφʔ

Slide 31

Slide 31 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ wطଘͷϓϩδΣΫτͰࣾ಺Ͱ޿͘࢖ΘΕ͍ͯΔ࢖ΘΕΔ΋ͷ w ϓϥοτϑΥʔϜɺϥΠϒϥϦɺϑϨʔϜϫʔΫɺ4%,ͳͲ w Ϗϧυɺ$*ج൫౳ͷ։ൃπʔϧ w શࣾతͳ'"2 w ࣾ಺ن໿౳ͷυΩϡϝϯτ ͲͷϓϩδΣΫτΛΠϯφʔιʔεԽ͢Δ͔ʁ

Slide 32

Slide 32 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ ͲͷϓϩδΣΫτΛ ΠϯφʔιʔεԽ ͢Δ͔ʁ ϓϩδΣΫτΛ Ͳ͏ݟ͚ͭͯ΋Β͏͔ʁ Ͳ͏΍ͬͯ ίϯτϦϏϡʔτ ͯ͠΋Β͏͔ʁ ͏·͍͍ͬͯ͘Δ͔Λ Ͳ͏ଌΔʁ

Slide 33

Slide 33 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ Enterprise Organization Repository Repository Organization Repository ϓϩδΣΫτΛͲ͏ݟ͚ͭͯ΋Β͏͔ʁ wࣾ಺ϝϯόʔ͕ϦϙδτϦʹΞΫηε Ͱ͖Δඞཁ͕͋Δ w*OUFSOBMϦϙδτϦ&OUFSQSJTF಺શମ͔Β 3FBEͰ͖ΔϦϙδτϦ

Slide 34

Slide 34 text

https://github.com/sap/project-portal-for-InnerSource

Slide 35

Slide 35 text

https://github.com/helaili/enterprise-showcase

Slide 36

Slide 36 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ w1SJWBUF(JU)VC1BHFT(JU)VC"DUJPOTͰɺ(JU)VC͚ͩͰࣾ಺ݶఆͷ ΠϯφʔιʔεϙʔλϧαΠτΛߏங͢Δ͜ͱ΋Մೳ w දࣔ͢ΔϦϙδτϦͷ৘ใ͸"DUJPOTͰఆظతʹߋ৽ w ͦͷ಺༰Λ(JU)VC1BHFTʹσϓϩΠ ϙʔλϧαΠτͷσϓϩΠઌ

Slide 37

Slide 37 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ ͲͷϓϩδΣΫτΛ ΠϯφʔιʔεԽ ͢Δ͔ʁ ϓϩδΣΫτΛ Ͳ͏ݟ͚ͭͯ΋Β͏͔ʁ Ͳ͏΍ͬͯ ίϯτϦϏϡʔτ ͯ͠΋Β͏͔ʁ ͏·͍͍ͬͯ͘Δ͔Λ Ͳ͏ଌΔʁ

Slide 38

Slide 38 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ ॳΊͯίϯτϦϏϡʔτ ͢Δਓͷෆ҆Λ औΓআ͘͜ͱ͕େࣄ w Ͳ͏͍͏ίϯτϦϏϡʔτ͕ ड͚ೖΕΒΕΔͷ͔ʁ w Ͳ͏͍͏ྲྀΕͰίϯτϦϏϡʔτ ͨ͠Βྑ͍ͷ͔ʁ w Θ͔Βͳ͍͜ͱ͕͋ͬͨΒ୭ʹ ฉ͚͹Α͍ͷ͔ʁ w ԿΛຬͨͨ͠ΒϓϧϦΫΤετ͕ Ϛʔδ͞ΕΔͷ͔ʁ

Slide 39

Slide 39 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ 3&"%.&NE νʔϜ֎͔ΒͷίϯτϦϏϡʔτΛ ׻ܴ͍ͯ͠Δ͜ͱ Ͳ͏͍͏छྨͷίϯτϦϏϡʔτΛ ड͚෇͚͍ͯΔͷ͔ ίϯτϦϏϡʔτͷ۩ମతͳखॱ https://github.com/asciidwango/js-primer

Slide 40

Slide 40 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ $0/53*#65*/(NE όάใࠂͷ࢓ํ ػೳཁ๬ͷใࠂͷ࢓ํ ϓϧϦΫΤετͷ࡞Γํ ϓϧϦΫΤετͷϚʔδ৚݅ ϨϏϡʔϓϩηε

Slide 41

Slide 41 text

https://github.com/asciidwango/js-primer/blob/master/CONTRIBUTING.md

Slide 42

Slide 42 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ ΠγϡʔɾϓϧϦΫΤετ ςϯϓϨʔτ ొ࿥͢ΔΠγϡʔ΍ϓϧϦΫΤετ ͷछྨ͝ͱʹඞཁͳ৘ใͷ߲໨Λ ςϯϓϨʔτʹؚΊ͓ͯ͘ɻ

Slide 43

Slide 43 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ $0%&08/&34 ϑΝΠϧͷछྨ΍ύεຖʹΦʔφʔ Λࢦఆ ϓϧϦΫΤετ࡞੒࣌ʹ มߋ͞ΕͨϑΝΠϧͷΦʔφʔʹ ϨϏϡΞʔΛࣗಈઃఆ͢Δ͜ͱ͕ Մೳ # Φʔφʔ͸ݸਓͰ΋νʔϜͰ΋ྑ͍ * @global-owner1 @global-owner2 *.js @frontend-team *.go @backend-team *.css @design-team /build/logs/ @infra-team docs/* @mr-document

Slide 44

Slide 44 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ Ϛʔδ͞ΕΔ৚݅ͷ໌֬Խ $0%&08/&34ʹΑΔϨϏϡʔඞਢ $*δϣϒ͕੒ޭ͍ͯ͠Δ͜ͱ ʜ

Slide 45

Slide 45 text

https://github.com/todogroup/repolinter

Slide 46

Slide 46 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ ͲͷϓϩδΣΫτΛ ΠϯφʔιʔεԽ ͢Δ͔ʁ ϓϩδΣΫτΛ Ͳ͏ݟ͚ͭͯ΋Β͏͔ʁ Ͳ͏΍ͬͯ ίϯτϦϏϡʔτ ͯ͠΋Β͏͔ʁ ͏·͍͍ͬͯ͘Δ͔Λ Ͳ͏ଌΔʁ

Slide 47

Slide 47 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ wνʔϜ֎ͷϝϯόʔ͕࡞੒ͨ͠Πγϡʔͷׂ߹ w࡞੒͞ΕͨΠγϡʔʹฦ౴͢Δ·Ͱͷ࣌ؒ wνʔϜ֎ͷϝϯόʔ͕࡞੒ͨ͠ϓϧϦΫΤετͷׂ߹ wνʔϜ֎ͷϝϯόʔ͕࡞੒ͨ͠ϓϧϦΫΤετ͕Ϛʔδ͞Εׂͨ߹ wνʔϜ֎ͷϝϯόʔ͕ϨϏϡʔͨ͠ϓϧϦΫΤετͷׂ߹ wύοέʔδͷμ΢ϯϩʔυ਺ ɾɾɾ ͏·͘ߦ͍ͬͯΔ͔Ͳ͏͔ΛͲ͏΍ͬͯ೺Ѳ͢Δʁ

Slide 48

Slide 48 text

https://github.com/Autodesk/hubble

Slide 49

Slide 49 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ ͲͷϓϩδΣΫτΛ ΠϯφʔιʔεԽ ͢Δ͔ʁ ϓϩδΣΫτΛ Ͳ͏ݟ͚ͭͯ΋Β͏͔ʁ Ͳ͏΍ͬͯ ίϯτϦϏϡʔτ ͯ͠΋Β͏͔ʁ ͏·͍͍ͬͯ͘Δ͔Λ Ͳ͏ଌΔʁ

Slide 50

Slide 50 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ πʔϧ͸จԽΛม͑Δ৮ഔ Πϯφʔιʔε ͸จԽ จԽΛม͑Δ ͷ͸ͱͯ΋େม Ͱ΋ɺπʔϧͷ ಋೖͰਓͷߦಈ ͕มΘΔ ߦಈͷมԽ͕ จԽ͕มΘΔ ͖͔͚ͬͱͳΔ

Slide 51

Slide 51 text

Developers Summit 2021 ͲͷΑ͏ʹΠϯφʔιʔεΛ࣮ફ͢Δ͔ w*OOFS4PVSDF$PNNPOT*OOFS4PVSDFͷίϛϡχςΟ w IUUQTJOOFSTPVSDFDPNNPOTPSH w*OOFS4PVSDF1BUUFOT*OOFS4PVSDFΛ࣮ફ͢Δ্Ͱͷύλʔϯू w IUUQTHJUIVCDPN*OOFS4PVSDF$PNNPOT *OOFS4PVSDF1BUUFSOT wΠϯφʔιʔε༻ϙʔλϧαΠτ࣮૷ w IUUQTHJUIVCDPNPDUPEFNPQSPKFDUQPSUBMGPS JOOFSTPVSDF w IUUQTHJUIVCDPNIFMBJMJFOUFSQSJTFTIPXDBTF ࢀߟ৘ใ wSFQPMJOUFSϦϙδτϦʹඞཁͳ৘ใ͕ஔ͔Ε͍ͯΔ͔Ͳ͏͔ͷ νΣοΫπʔϧ w IUUQTHJUIVCDPNUPEPHSPVQSFQPMJOUFS w֤ϦϙδτϦͷΞΫςΟϏςΟͷՄࢹԽπʔϧ w IUUQTHJUIVCDPN"VUPEFTLIVCCMF w IUUQTHJUIVCDPNDIBPTTHSJNPJSFMBC

Slide 52

Slide 52 text

No content