PMBOK 7th 勉強会始めます!

こんにちは、Synamon のエンジニアリングマネージャーの渡辺(@mochi_neko_7)です。

今回は最近社内で始めた PMBOK(Project Management Body Of Knowledge)の勉強会を始めた話と、関連した発信のご紹介をします。

PMBOK とは?

PMBOK はプロジェクトマネジメントの知識体系をまとめたもので、世界標準として作られています。

詳細は本題ではないので、こちらの記事などをご覧ください。

products.sint.co.jp

きっかけ

少し前に Twitter でこちらが話題になっていました。

note.com

プロジェクトマネジメントの総本山のあの PMBOK が、6th → 7th で内容を大幅に更新アジャイルな考え方を取り入れているとのこと!

これはどんな内容なのか気になりますし、その印象からこれまで PMBOK を避けていたのでこの機会にしっかり勉強してみようとなりました。

ですが残念なことに日本語翻訳版は11月発売。

でも早く読みたい、待てないということで、英語版で読むことに。

社内で声掛けしてみた

自分で読むのも全然良いのですが、最近の開発ではよりプロジェクト的な動きが強くなっている傾向があったので、せっかくなら有志を集めて何人かで読もうと思いつきました。

さらに日本語版も出ていないのでまだアウトプットも少なめ、するとテックブログで勉強会の内容を発信するのも良さそうです。

読みたい自分、社内でのナレッジ、社外へのアウトプットと一石三鳥ですね。

ということで社内で声掛けした結果、5人のエンジニアが集まって勉強会をすることになりました。

集まった顔ぶれ

参加者のプロジェクトマネジメントの習得度は

  • 最近勉強しはじめている
  • PM 経験少しあるが、体系的に勉強したことない
  • バリバリに PM 経験あるが、PMBOK は勉強したことない

のようにばらばらです。

理想的には従来の PMBOK 経験者がいると比較もできるのですが、いないので仕方ありません。

新しくなった第7版で一からプロジェクトマネジメントを勉強するつもりでやっていきます!

今後

今回は「勉強会をやります!」の宣言だけですが、今後勉強会の進行とともに学んだプロジェクトマネジメントの内容を、テックブログの記事として定期的にアウトプットしていこうと思います!

気になる方は自分Synamon 公式 Twitterでの発信をお見逃しなく。

最後に

Synamon ではこういった勉強会がメンバーから自発的に発生する文化があります。

もしそういう文化が好ましいという方、技術だけでなくプロジェクトマネジメントにも関心のあるエンジニアの方がいましたら、ぜひカジュアル面談でお話してみませんか?

meety.net

募集要件を詳しく見たい方、直接エントリーしたい方はこちら。

herp.careers

それでは次回をお楽しみに!

Startup Issue Gym #2 開催しますよー!

こんにちは、Synamon のエンジニアリングマネージャーの渡辺(@mochi_neko_7)です。

4月頃に Synamon を含めた3社のスタートアップで開催した「Startup Issue Gym」

synamon.hatenablog.com

ですがこれは単発のイベントではなく、あくまでイベントグループでイベントを定期開催しますよと宣言しておりました。

今回はその続報になります。

第2回やります

というわけで 2021/8/25(水)に第2回を開催します!!!

f:id:mochinekos:20210823193909p:plain

startup-issue-gym.connpass.com

今回のイベントテーマは「クライアントサイド開発の Issue」。

クライアントサイドというとちょっと広い定義で、Web フロントエンド、ネイティブ iOS / Android、Unity などなどクライアント(ユーザー)が直接触れる側の技術になります。

各社使用している技術は様々ではありますが、前回同様現場でのリアルな Issue の話からクライアントサイド特有の学びを持ち帰っていただけたらと思います。

ビビッドガーデンさん、カミナシさん、Synamon と事業領域が異なるスタートアップ同士でどんな Issue が語られるんでしょうか?

Synamon からの登壇は?

Synamon は XR(VR / AR / MR)の開発をしており、クライアントサイドは主に Unity を使用しています。

ですが今回の登壇内容は Unity には寄せず、クライアントサイド全般で学びのあるテーマを選んでいます。

登壇テーマは「エンジニアとユーザー中心設計」。

XR 技術はまだまだ一般には浸透しておらず、XR を活用したい企業でも XR がどんなものなのか詳しくは知らない人がほとんどであるのが現状です。(もちろん中には詳しい方もいます)

そのためふわっとした理解の中から企業が本当に実現したいことを一緒に探っていく必要があります。

言われたままに実装しても価値提供にはつながらず、顧客と対話しながらやりたいことを咀嚼し、我々の XR のノウハウを活かしながら最適な実現方法、ソリューションを提案していきながら、顧客への価値提供をしていくことになります。

そのプロセスの中では、営業から並走している BizDev、UX の知見のあるデザイナーだけではなく、エンジニアも貢献できる・関わるメリットががあります。

それを現場で実践しているエンジニアの方に、ユーザー中心設計も参照しながら語ってもらいます。

余談ですが

今回はイベントページの作成から当日の配信、司会など運営の中心を Synamon が引き受けています。

慣れない部分も多いですが、この経験からイベント主催のノウハウを溜めていきたい!

最後に

繰り返しになりますが、イベントは「2021/8/25(水)」開催です。

気になるテーマやキーワードのある方はぜひご参加ください↓

startup-issue-gym.connpass.com

また、後日 YouTube Live のアーカイブも配信予定ですので、予定の合わない方はそちらもチェックしてみてください。

それでは当日お会いしましょう!

Quest2上で動作するパススルーモードを試す

f:id:fb8r5jymw6fd:20210815173323j:plain

はじめに

エンジニアの松原です。先日社内でVarjo XR-3が導入され、今後はハイエンドなXRコンテンツが作っていけそうです。最近はAR/MR関連も業界で活発化しているのを見かけており、さらに楽しみが増えました。

それに関連して、先日Oculus Integration SDKがアップグレードされたのですが、ついに実験的機能としてパススルーモードが追加されました!

早速試してみたのですが、ビルドの際に気を付ける箇所があったので、備忘録的に記事としてまとめました。

Oculus Integration v31について

2021/08/12にリリースされたOculus Integration SDK v31には大きな変更がありました。

  • Passthrough APIが実験的機能に追加された
  • (Quest/Quest2のOSに)Vulkan検証レイヤが利用できるようになり、今後のアプリケーション開発にVulkanでの開発が推奨される
  • Unity上で動作するOVRPluginがOpenXR backendがデフォルトで有効になったこと

OVRPluginのバックエンドがOpenXRベースのものに変わったものも含め、以下にUnityでのQuest2向けのパススルーモードを有効にする設定までの手順をまとめてみました。

XR Plug-in ManagementとOculus XR Pluginをインストール

OpenXR backendを利用する場合、XR Plug-in ManagementOculus XR PluginをPackage Managerに追加する必要があります。

Unity2019~2021ではProject SettingsのGUIから追加することができます。一番下の項目にXR Plugin Managementの項目から、下図のボタンを押します。

f:id:fb8r5jymw6fd:20210814150634p:plain
XR Plugin Managementの項目から追加できる

しばらく待つと自動的にXR Plug-in Managementが利用できるようになります。続けてOculus XR Pluginも追加します。下図のようにXR Plugin ManagementのPlug-in Providersのリストのうち、Oculusにチェックを入れます。チェックを入れたら自動的にプラグインが追加されます。

f:id:fb8r5jymw6fd:20210814151736p:plain
Oculus XR PluginのチェックボックスをONに

Oculus Integrationをインストール

これらのパッケージが追加できたら、Oculus Integrationの最新版のv31をPackage Managerからアセットをダウンロード、インポートします。

f:id:fb8r5jymw6fd:20210814145634p:plain
Oculus Integrationのインポート

Unity2019をお使いの場合、バックエンドがOpenXRベースのものになっていないので、メニューバーの Oculus > Tools > OpenXR > Switch to OVRPlugin with OpenXR backend を選択し忘れないよう注意してください。 (Unity2020や2021ではデフォルトでOVRPluginがOpenXR backendを使うように変更されましたので、そのままで大丈夫です。)

f:id:fb8r5jymw6fd:20210814153303p:plain
Switch to OVRPlugin with OpenXR backend を選択する

ビルド設定を変更する

Project SettingsのPlayerのOther Settingsの設定を変更していきます。

Color SpaceLinear に変更します。

f:id:fb8r5jymw6fd:20210814153642p:plain
Color SpaceをLinearに変更

Graphics APIはOpenGLES3、VulkanいずれかでもPassthrough APIは動作するようですが、v31ではVulkan APIの利用が推奨されているようなので、せっかくなので Auto Graphics API のチェックを外し、Vulkan を利用するように変更します。

f:id:fb8r5jymw6fd:20210814154534p:plain
Vulkan APIを使うように変更

v31のパッケージではPassthrough APIではARM64ビルドでないと動作しないようで、そのためには Scripting BackendIL2CPP に変更したうえ、ARMv7 のチェックを外し、 ARM64 の箇所にチェックを入れます。

f:id:fb8r5jymw6fd:20210814153836p:plain
IL2CPPに変更、Target ArchitectureをARM64に変更

シーン中にあるOVRCameraRigのパススルーモードを有効にする

パススルーモードを利用するにはUnityのScene中にあるOVRCameraRigの設定を変更する必要があります。今回は Assets/Oculus/SampleFramework/Usage/Passthrough/Scenes 配下にある AugmentedObjects のシーンをサンプルとして利用します。

f:id:fb8r5jymw6fd:20210814155006p:plain
AugmentedObjectのシーンを開く

Hierarchyにある OVRCameraRig を選択します。

f:id:fb8r5jymw6fd:20210814155145p:plain
OVRCameraRigを選択

インスペクタにある OVR Manager (Script)Experiment Features EnabledPassthrough Capability Enabled にチェックを入れ、Enable Paththrough にもチェックを入れます。

f:id:fb8r5jymw6fd:20210814155302p:plain
Passthrough関連の項目にチェックを入れる

他、サンプルからでなく、一から自分のアプリをパススルーにする方法に関しては追加で以下の記事を参考にしてください。 https://developer.oculus.com/experimental/passthrough-api/

設定後、シーンを保存アプリをビルドして実機に転送します。

ADBコマンドからQuest2実機側のパススルーモードを有効にする

2021/08/13日時点だと、パススルーモードの有効/無効設定はADBコマンドからしか変更できないようです。

PCとQuest2をUSBケーブルを使って接続した状態で、ADBコマンドが利用できるPC環境で、以下のコマンドを実行します。

adb shell setprop debug.oculus.experimentalEnabled 1

※Quest2を再起動するたびに上記コマンドが必要になるようです(パススルーモードが無効になるようにリセットがかかるみたいです)。

実行画面例

f:id:fb8r5jymw6fd:20210814160352p:plain
実機での実行画面
※Quest2の本体のセキュリティで静止画や動画キャプチャをすると真っ暗になるようなので、実機のレンズにスマホを押し当てて撮影しています。

試した所感など

パススルーモードは現在実験的機能で、まだ本機能として実装されるか不明ですが、Quest2があればAR/MRコンテンツが体験できるようになりそうで嬉しいです。

また、Graphics API が 本格的にVulkanに移行されることも期待され、パフォーマンスの向上が期待でき、今後の開発が楽しみです!

お知らせ

Synamonでは現在Unityエンジニアやサーバーサイドの採用を積極的に行っております!Unityの開発経験がある方をお待ちしております!

ご自身のキャリアプランに合わせて役職を選べます!詳しくは以下の求人を見ていただけると嬉しいです!

herp.careers

イベント立ち上げ&LT登壇してきました!

こんにちは。

株式会社Synamonでエンジニアリングマネージャーをしてます、渡辺匡城(@mochi_neko_7)です。

またしばらく記事投稿が空いてしましましたが、気を取り直してまた定期的に記事を書いていきたいと思います!

先日Synamonと、同じスタートアップのビビッドガーデンさん、カミナシさんと共同でイベントグループの立ち上げをしました。

今回はそのイベントグループ Startup Issue Gym の簡単な紹介と、第一回イベントで私が登壇したLTの内容についてお話します。

f:id:mochinekos:20210524202803p:plain

Startup Issue Gym

Startup Issue Gymは、ビビッドガーデン、カミナシ、そしてSynamonのスタートアップ3社で立ち上げをしたイベントグループです。

このグループでは急成長しているスタートアップが集まって Issue(課題) を共有し、一緒に解決方法を考える場をつくっていきます。 苦労した Issue を共有して学びを深めるもよし、ちょっと先のフェーズのスタートアップの Issue を参考にするもよし、スタートアップでは働いていないけどどんな Issue があるのかリアルな話を聞きに来るもよしです。

スタートアップがどんなやり方で開発をしているのか知りたい方や今スタートアップで Issue を抱えて困っている方、Issue は乗り越えたので発信することで自分たちの学びを深めたいという方にも集まっていただけるといいなと思っております。 ちょっと覗いてみるとスタートアップの現場のリアルな声が聞けるはずです。

startup-issue-gym.connpass.com

イベントは単発ではなく今後も定期開催する予定なので、気になる方はぜひ「メンバーになる」を押してください!

記念すべき初回イベントのテーマは「開発プロセスの Issue」ということで、立ち上げた3社が自己紹介も兼ねてLTとQ&Aを行いました。 おかげさまで予定していた定員も埋まり、増枠させていただきました。

startup-issue-gym.connpass.com

Youtube Live のアーカイブもあるのでよければご覧ください。

www.youtube.com

実は当初はただ Issue を共有するだけではなく、参加者の方と一緒にその Issue にどう立ち向かうかディスカッションをするイベントにしようとしていたのですが、ディスカッションとなるとなかなか参加のハードルも高いため初回はQ&Aの形式になりました。 ここは次回以降のイベントで挑戦してみたいですね。

ここからは私が実際にLTでお話した内容の要約になります。

開発プロセスの Issue

初回イベント「開発プロセスの Issue」のSynamonのLTとしては私がお話をさせていただきました。

www.slideshare.net

大きなテーマとしては2つの Issue を紹介しました。

  • ここ一年で一番大きかった Issue
    • スクラム導入
  • 現在の開発プロセスの Issue
    • プロダクト開発と案件開発の両立

これらの Issue に関して簡単に説明します。

ここ一年で一番大きかった Issue ~ スクラム導入 ~

Synamonでは2020年10月頃からスクラムを導入しています。

スクラム導入の動機・目的としては主に以下のようなものでした。

f:id:mochinekos:20210524200958j:plain
スクラム導入の動機

プロダクトの開発初期の頃は比較的少人数で、新しい機能などをどんどん開発する必要があるため個々の開発力が光ります。 しかしプロダクトが大きくなるにつれ、ソースコードは複雑になり組織としても大きくなるためチームとして機能する必要が出てきました。 そうなってくるとこれまでの開発プロセスでは難しい場面も出てきます。

また、VRという技術自体の市場がそもそもなかったこともあり、顧客目線が持ちづらいという課題も長くありました。 これはビジネス的にも大きな Issue の一つであり、それに対してはビジネスメンバーだけでなく開発メンバーも向き合うべきと考えています。

スクラム導入の経緯に関しては別の記事でしっかりお話したいと思います。

こういった経緯も踏まえつつ、導入して約半年後の2021年4月頃での実感としては主に以下のようなものが挙げられます。

f:id:mochinekos:20210524201130j:plain
スクラム導入の効果

スクラムとしてはおそらくまだまだ向上の余地はありますし、現在でも課題はたくさんあります。 それでも導入前よりは明らかに良くなったというメンバーの声ももらっています。 開発におけるプロセスのあり方、顧客にとっての価値とは何か、スクラムをもっとうまくやるためにはどうすればいいのかなど、開発メンバーが自発的に考えるシーンを多く見るようになってきました。

現在の開発プロセスの Issue ~ プロダクト開発と案件開発の両立 ~

現在の Issue ももちろんいくつもあるのですが、ここではプロダクト開発と案件開発の両立を中心にお話しました。

弊社プロダクトの「NEUTRANS」は、ビジネスでのコラボレーションに必要な基本的な機能を備えたプロダクトの側面(ベース)と、 個々の企業様の実現したい体験に合わせたカスタマイズをする案件の側面(ユースケース)を持っています。

f:id:mochinekos:20210524201227j:plain
NEUTRANSの構成

これらは独立はしておらず、ベースの拡張によってユースケースの表現が広がり、ユースケースの要望からベースが進化する関係にあります。 このサイクルが循環することによって、各ユースケースのナレッジが蓄積し、ユースケースを横断した機能や新しいユースケースの創出なども行われます。

こういった狙いもありますが、一方で Issue も様々あります。

f:id:mochinekos:20210524201327j:plain
NEUTRANSのIssue

そもそも性質の異なるプロダクトと案件が混ざるため、開発要件がかなりカオスになってしまっています。 かといって簡単に分けてしまうのも、現在の規模の組織のマネジメントとしてはあまり取りたくない手段です。

また、スクラム導入以前からの組織的な課題も残っています。

こういった状況の中でも、常によりよい形を模索するため小さく実験を繰り返し、やってみる→ふりかえるを繰り返して組織として成長している最中になります。

f:id:mochinekos:20210524201540j:plain
スタートアップの面白さ

こういったところに面白味を感じていただけるのであれば、成長期のスタートアップはあなたの成長の場としては良いのではないでしょうか。

おわりに

今回のイベントでは運営者としても登壇者としても関わらせてもらいました。

自分たちの Issue を言語化することで学びも深まりますし、他のスタートアップの Issue の話も共感できる話ばかりでした。

こういった場を通して、スタートアップ同士の交流が活発になったり、スタートアップに興味を持ってもらえる人が少しでも増えたらなと思います。

積極採用中です

Synamonではエンジニア各ポジション積極採用中です。

実は私は最近はエンジニア採用に注力していまして、スカウトからカジュアル面談などもやっております。

ちょっと話を聞いてみたいという方も歓迎していますので、ぜひお気軽にお声かけください!

www.wantedly.com

open.talentio.com

開発チームの自発的な課題解決のためにオープンスペースをやってみた

こんにちは。

株式会社 Synamon でエンジニアをしております、渡辺匡城(@mochi_neko_7)と申します。

今回は、社内の開発チームで自発的な課題の解決や改善ができないかという試みとしてオープンスペースをやってみた話を紹介します。

振り返りも兼ねて、実施の経緯からお話ししていきます。

オープンスペースとは

オープンスペース、あるいは OST(Open Space Technology)とは、参加者が自発的に対話するためのワークショップの1つです。

www.ogis-ri.co.jp

特徴としては以下が挙げられます。

  • 参加者がテーマを出す
  • 参加者はセッションを自由に移動してよい
  • 最後にまとめとその共有をする

アジャイル開発界隈では割とメジャーで、Scrum Masters Night! や Engineering Manager Meetup などのイベントでも行われています。

smn.connpass.com

engineering-manager-meetup.connpass.com

背景

少し前から開発チームにおいて、週一で自由に相談や課題解決をする場を作ってみていました。

しかし開発チーム全体では16人程度、有志で集まっても10人以上集まり、やや人数が多いです。

そうなるとどうしても話を聞いている時間が多く、せっかく集まってもらったのに有意義に時間を使ってもらえていない、という課題感がありました。

やり方やそもそもの定例の意義を考え直していたのですが、その時たまたま読んでいた LeSS(Large Scale Scrum)の書籍でオープンスペースが紹介されていました。

www.amazon.co.jp

そこでちょうど使えそうかなということで、試しにやってみることになりました。

もう1つ背景として、コロナの影響で弊社が完全リモートワークになっていた頃に、コミュニケーション活性化の目的で雑談オープンスペースを何度かやっていました。

ですのでやってみる分には抵抗が少ないかなという期待がありました。

仮説

実施するにあたって立てた仮説は以下になります。

  • 課題解決や改善が自発的に生まれるのでは
  • セッションが小規模で平行して走ることで、コミュニケーションの密度が上がるのでは
  • 定例開催することで、不安や悩みを早めに解消できるのでは

流れと準備

基本的な流れは一般的なものを踏襲しました。

時間は1時間で、以下のようなタイムスケジュールを想定していました。

  1. オープニング(10分)
  2. 参加者からテーマを募る(3分)
  3. セッションの時間と場所を決める(2分)
  4. セッションを行う(30分)
  5. まとめと共有(15分)

事前告知をして、テーマは事前に2つ挙げてもらい、もう2つはその場で出してもらいました。

セッション中の会話は Discord、メモや議事録は Miro を用いました。

discord.com

miro.com

Miro ではこんな感じのセットアップをして、後からセッションの内容がどうだったのか見返せるように工夫してみました。

f:id:mochinekos:20200821160817p:plain
MiroOSTTemplate

付箋の色で使い分けをしています。

  • オレンジ:テーマ
  • 緑:まとめとネクストアクション
  • 濃い黄色:Discord のルーム
  • 薄い黄色:メモ

キャンバス全体を直線で4等分にして中心にテーマなどを置くことで、それ以外のスペースを自由に使えるようにしています。

実際にやってみたらどうなったか

出たテーマ

ざっくり以下のような内容でセッションが盛り上がりました。

  • 読書会をどうやってやるか
  • プロダクトの開発体制の話
  • とある機能の実装方法の相談
  • 最近の注力開発の状況

内容は意外と広く挙がってきました。

まとめやネクストアクションを考えるのはやはりポイントですね。

セッション

テーマを挙げてもらったあとに、セッションの配置をしました。

しかしその際複数のテーマで、テーマを話したいメンバーとテーマに関して相談したいメンバーが被ってしまいました。

そこでセッションを同時に4つ行うのではなく、2つを2回に分けて行うことに急遽変更しました。

そうしてみるとタイムボックスの意識が強くなるので、より会話の密度が上がった印象を受けました。

これは想定していない良い効果でした。

タイムマネジメント

まず Discord に人が集まるまで少し時間がかかります。

それは想定していたのですが、テーマ集めと割り振りに時間がかかりました。

さらにセッションを2回に分けることとなり、時間設定を組みなおした結果、全体の時間が少し超過してしまいました。

タイムマネジメントが甘かったのは反省点でした。

仮説の検証

実施前の仮説の検証結果は以下になります。

  • 課題解決や改善が自発的に生まれるのでは
    • 〇:自発的にテーマが上がってきた
    • △:様々なメンバーからテーマがたくさん挙がってくるともっと良い
    • ✕:実際に解決や改善の効果が出るかトラッキングしたい
  • セッションが小規模で平行して走ることで、コミュニケーションの密度が上がるのでは
    • 〇:タイムボックスの意識が生まれた
    • 〇:全体で1セッションより会話が増え、集中力も上がった
  • 定例開催することで、不安や悩みを早めに解消できるのでは
    • ✕:まだ1回目、もう何度か実施してみて検証したい

おわりに

実際にやってみて、チームのコミュニケーションの1つとしては有効だと実感しました。

ですのでもう何度か実施してみて検証を続けていくことにしました。

結果と反省を踏まえて、進め方自体も改善していきます。

  • タイムテーブルを組みなおすか、パターンを作っておく
  • 開始時に前回実施分の振り返りを簡単に行う

オープンスペースはソフトウェア開発以外にも十分有用な手法ですし、実施するのにはそこまで手間はかかりませんので、チームの自発的な課題解決や改善のきっかけとして試しにやってみてはいかがでしょうか。

おまけ

弊社では「XRが当たり前の世界をつくる」というミッションを一緒に実現していきたいエンジニア、エンジニアリング・マネージャーの各職種の募集を強化しています。

XR 技術への強い関心のある方、スタートアップの環境で成長していきたい方、自己組織的な開発チームづくりに興味のある方などいらっしゃいましたら、ぜひエントリーしてください。

www.wantedly.com

www.wantedly.com

www.wantedly.com

Unityで対象オブジェクトに(ほぼ)手を入れずに使えるアウトラインエフェクトを作った

f:id:Sokuhatiku:20200720225722p:plain
空中ペンで書いた文字に表示されるアウトライン

はじめに

NEUTRANS BIZのベース機能に、Grabというものがあります。挙動は名前の通りで、レーザーポインターを当てた、もしくは直接触っているアイテムを掴んで、移動させることが出来ます。

ある時、アイテムを掴める状態を分かりやすくしてほしいというオーダーがあった為、それを実現するために、掴めるアイテムに対してアウトラインを表示する仕組みを作成しました。

この機能はすでに最新版のNEUTRANS BIZに搭載されています。

手法の検討

アウトラインの実現方法としては、メッシュを法線方向に膨らませて反転させるものが一般的です。これはお手軽ですが、いくつかの欠点があります。

  • ハードエッジの表現が苦手
  • シェーダーに手を入れる、もしくはモデルにマテリアルを追加する必要がある。

f:id:Sokuhatiku:20200720210109p:plain
メッシュ押し出し反転によるアウトライン

上画像をよくみるとアウトラインが途切れてしまっています。丸みを帯びた物体であれば問題にはなりにくいのですが、このような金属質の物体はエッジを利かせているものが多く、その場合単純に頂点を押し出しただけのアウトラインは破綻してしまいます。

以上の欠点を解消する為に、ComputeShaderとImageEffectを利用して、対象オブジェクトのレイヤー変更のみでアウトラインのON/OFFを切替できる仕組みを開発しました。

f:id:Sokuhatiku:20200720211303g:plain
レーザーポインターを当てるとレイヤーが切り替わる

この方式の利点は以下の通りです

  • オブジェクトのメッシュ特性やマテリアルに表示が左右されない
  • 遠くのオブジェクトであっても太さが変わらない為視認性が高い
  • ハードエッジに強い

逆に欠点は以下の通りです

  • レンダリング用にレイヤーを使うため、物理コンポーネントとは別オブジェクトに分ける必要がある
  • イメージエフェクトと追加カメラを利用している為、それなりに重い

仕組み

動作のイメージは以下のようになります。

  1. アウトラインを表示させたいオブジェクトをアウトラインレイヤーに移動する。
  2. アウトラインレイヤーのみ映すカメラ(シルエットカメラ)でリファレンス画像をレンダリングする。
  3. ComputeShaderでリファレンス画像からエッジ検出してアウトラインを生成する。
  4. 通常のレンダリング結果とアウトラインを合成する。

f:id:Sokuhatiku:20200720223840p:plain

工夫してみた点

Depthの考慮

前述の仕組みによりアウトラインの表示は可能になりました。ただしこの状態では、アウトラインを出すオブジェクトが他のオブジェクトの背後にあってもアウトラインが出てしまいます。

f:id:Sokuhatiku:20200720191931p:plain
キューブを貫通してアウトラインが見えてしまう

この違和感はVR中の酔いの原因になりかねない為、対策を行います。

SetReplacementShaderを利用してシルエットカメラのレンダリングに利用するシェーダーを変更し、深度情報をカラーで出力してもらうようにしました。*1

// シルエットカメラにDepth出力用シェーダーをセットする
silhouetteCamera.SetReplacementShader(settings.DepthShader, "RenderType");
// 通常カメラの深度情報は以下のコードで取得可能
var eyeDepth = Shader.GetGlobalTexture("_CameraDepthTexture");

そしてComputeShader内で、通常カメラのレンダリング結果の深度情報と比較を行い、アウトラインがオブジェクトに隠れているかどうかの判断を行うようにしました。

    float sumDepth = 0;
    float avaiableCount = 0;

    for (int i = -outlineSize; i <= outlineSize; i++)
    {
        for (int j = -outlineSize; j <= outlineSize; j++)
        {
            int pos = selfpos + i + (j * threadGroupSize_x);
            float depth = silhouetteDepth[pos];
            float avariable = depth > 0;

            sumDepth += depth * avariable;
            avaiableCount += avariable;
        }
    }

    float ztest = ((sumDepth / avaiableCount) - SourceDepth[did]) > 0;

f:id:Sokuhatiku:20200720191822p:plain

これで上手く遮蔽出来ます。 ※デバッグ用テクスチャの色は強調しています。

負荷削減

ピクセル情報の参照はGPUの中で(比較的)重い処理です。 単純に周囲のピクセルを参照すると、アウトラインの厚みによってピクセル当たりの参照ピクセル数が(2n+1)^ 2で増加します。単純計算すると3ピクセルの厚みのアウトラインを作る為には\{(2 * 3) + 1\}^ 2=49ピクセル参照する必要があります。*2

f:id:Sokuhatiku:20200721125835p:plain
3pxのアウトラインを出すためには各ピクセルが7x7の範囲を認識する必要がある

コンピュートシェーダーには、同じスレッドグループ内のスレッド同士で使える共有メモリが存在します。 これを利用する事で、隣のスレッドが取得したピクセル情報を使いまわせるため、結果としてピクセル当たりの参照回数を抑えることが出来ます。

ただし、シェアードメモリのサイズ及びスレッドグループの大きさには制限があり、一般的なFullHDの画像すべてのピクセルをシェアードメモリに載せることは出来ない為、多少工夫して何とかします。

// 例えばこのようなシェアードメモリを定義する
groupshared float silhouettePixelBuffer[ThreadGroupSize_X * ThreadGroupSize_Y* 4];
void DoOutline(uint2 gtid : SV_GroupThreadID, uint2 gid : SV_GroupID)
{
    // 担当アドレスを計算
    int2 sharedID = gtid * 2;
    int2 bufferID = int2(gtid.x * ThreadGroupSize_X - ThreadGroupSize_X * 0.5 + sharedID.x,
                        gid.y * ThreadGroupSize_Y - ThreadGroupSize_Y * 0.5 + sharedID.y);

    // 担当データを書き込む
    silhouettePixelBuffer[ThreadGroupSize_X * 2 * sharedID.y + sharedID.x] = Silhouette[bufferID];
    silhouettePixelBuffer[ThreadGroupSize_X * 2 * (sharedID.y + 1) + sharedID.x] = Silhouette[bufferID + int2(0, 1)];
    silhouettePixelBuffer[ThreadGroupSize_X * 2 * sharedID.y + (sharedID.x + 1)] = Silhouette[bufferID + int2(1, 0)];
    silhouettePixelBuffer[ThreadGroupSize_X * 2 * (sharedID.y + 1) + (sharedID.x + 1)] = Silhouette[bufferID + int2(1, 1)];

    // グループ内全てのスレッドで上の処理が終わるのを待つ
    GroupMemoryBarrierWithGroupSync();

    // この後はsilhouettePixelBufferを参照する処理を組む

結果はこちらです。 f:id:Sokuhatiku:20200720203503p:plain

思いっきり負荷をかけて改善3msという程度だったので、やらなくても良かったかもしれません……。

最後に

f:id:Sokuhatiku:20200721140442g:plain
VRかつ複雑な形状でも綺麗にアウトラインが出るところがお気に入り

以上の仕組みは、実は2017年頃に作成したものです。この度テックブログの記事としてちょうどいい題材ではないかと持ち掛けられたため、引っ張り出してきて記事にしました。

当時はほぼ新入社員だったのですが、自由にコードを書かせてもらって今に至ります。

Synamonでは現在仲間を絶賛採用中です。ご興味のある方は是非一度お話ししましょう!

herp.careers

*1:このシェーダー差し替え処理のトレードオフとして、GeometryShader等シェーダー内で頂点を弄る処理があった場合、ケアしなければ破綻するようになってしまいますが……。

*2:実際は円形に描画する為、角部分の参照は減らせます。

開発チームの生産性・健全性を可視化できるgilotを触ってみた

こんにちは。

株式会社 Synamon でエンジニアをしております、渡辺匡城(@mochi_neko_7)と申します。

今回はソフトウェアの開発チームの生産性・健全性を可視化できる gilot というツールを触ってみたのでレポートします。

ツールの作者の広木大地さん(@hiroki_daichi)は エンジニアリング組織論への招待 の著者であり、EM.FM などでも開発組織の話を発信されています。

そんな広木さんがツールを作成したと目にしたので、実際に触ってみて、弊社のプロダクトに適用してみました。

日本語での使い方やグラフ、指標の解説は Qiita にもまとめられていますので、こちらも参照ください。

qiita.com

上記の内容の補足として、環境のセットアップや Windows 環境ではまったところ、弊社のプロダクトの簡単な解析結果の紹介をします。

gilot

gilot(ジロー)は Git のログをもとに開発チームの生産性や健全性を可視化できるツールです。

GitHub のリポジトリはこちらになります。

github.com

環境セットアップ

簡単にですが、gilot の利用に必要な環境のセットアップを補足します。

なお、今回の検証に使用した環境は以下になります。

  • OS:Windows10
  • gilot:0.2.3

Python

gilot は Python のプログラムのため、実行には Python の環境が必要です。 環境自体はいくつかあり何でも構いませんが、公式はこちらです。

www.Python.org

環境変数のパスを通すのを忘れないでください。

Git

Git のログ解析をするので、Git Client の環境も必要になります。

Git を使っているリポジトリが解析対象になるので、基本的には既にセットアップされているはずです。

GUI 系の Git ツールで内部に Git Client をインストールしている場合にはその環境変数のパスを通すか、新しく公式からインストールしてしまっても構いません。

Git-scm.com

gilot

gilot のインストールは、コンソールで以下のコマンドを入力して行います。

$ pip install gilot

解析方法

GitHubQiita にも紹介がありますが、ここでも簡単に紹介します。

log

まず log コマンドを使って Git のログを解析します。

$ gilot log [repository] -o [log].csv
  • [repository] には解析対象のリポジトリのディレクトリを指定してください。

  • [log] には解析結果の出力先を指定してください。

直接グラフなどを出力するコマンドもありますが、解析にはやや時間がかかりますので、一度ファイルに書き出しておくことをお勧めします。

デフォルトでは master ブランチを対象に解析します。 これを変更したい場合には、--branch [branch_name] のオプションを追加してください。

後で紹介する hotspothotgraph の解析をしたい場合には、--full のオプションを指定して解析する必要があります。

$ gilot log [repository] --full -o [log-full].csv

こちらも少々時間がかかりますので、エラーが出ていない場合にはしばらく待ちましょう。

plot

plot コマンドを使うことで、4つの指標のグラフを作成できます。

$ gilot plot -i [log].csv -o [plot].png
  • [log] には log コマンドで作成した解析結果を指定してください。

  • [plot] にはグラフの画像の出力先を指定してください。

グラフの見方は Qiita の記事を参照してください。

hotspot

hotspot コマンドを使うことで、変更されやすいファイルを解析できます。

$ gilot hotspot -i [log-full].csv
  • [log-full] には --full オプションを追加して解析したログファイルを指定してください。

変更されやすいファイルのランキングがコンソールに出力されます。

変更されやすいということは、バグの温床になりやすいコードであり、リファクタの良い対象になりやすいと考えられます。

hotgraph

hotgraph コマンドを使うことで、同時に変更されやすいファイルのネットワークグラフを作成できます。

$ gilot hotgraph -i [log-full].csv -o [hotgraph].png
  • [log-full] には、-full オプションを追加して解析したログファイルを指定してください。

  • [hotgraph] には、グラフの画像の出力先を指定してください。

--allow-files--disallow-files のオプションで解析対象のファイルのフィルタができますので、プロジェクトによって適宜使用してください。

Windows を使っている方は注意が必要です。

内部で使用している signal.py のライブラリが Windows では使用できずエラーを吐いてしまいます。 (参考)

これは --stop-retry のオプションを使うことで回避ができます。

$ gilot hotgraph -i [log-full].csv -o [hotgraph].png --stop-retry

同時に変更されやすいファイルには何かしらの関連があると考えられます。

もし一見関係の薄いファイルが関連付けられている場合には、それらの責務が適切になっているか確認やリファクタをしたほうがよいと考えられます。

author

最近追加された author というコマンドを使うことで、コミットしている人のコミット量や全体での割合を時系列に解析できます。

$ gilot author -i [log].csv -o [author].png
  • [log] には log コマンドで作成した解析結果を指定してください。

  • [author] にはグラフの画像の出力先を指定してください。

結果

弊社のプロダクトである NEUTRANS BIZ のリポジトリの plot の結果だけ少しお見せします。

f:id:mochinekos:20200711162725p:plain

簡単な考察

上記の結果の考察を簡単にですが行ってみました。

グラフの詳細な説明は Qiita を参照してください。

Gini Coefficient

50%を下回っているので、それほど格差が大きいわけではなさそうです。

これも時系列で追って変化を見てみたいですね。

Hisgram of Code Output

ややピークが大きいでしょうか。

このグラフの使い方はまだピンと来ていないです。

Code Output and Productivity

insertions と deletions が交互に出ていて、定期的にメンテナンスしているのが分かりやすい印象です。

リリースサイクルとの連動がありそうですね。

最近追加された Productivity がまだどのような指標なのか分かっていないです。

Numer of Actual Authors

数値と実体はおおよそ一致している印象です。

数値が落ち込んでいる部分は、おそらくプロダクトの方向性を決めていた時期で手が止まっていたのかなと推測できます。

開発の安定性の参考になりそうです。

おわりに

今回は手でコンソールにコマンドを打って検証しましたが、CI に組み込んで自動で定期的にグラフを出力するのもできそうですね。

ソフトウェアの生産性や健全性は目に見えづらいものですが、ソフトウェアのコードそのものではなく、活動(Git のログ)を用いると数値で解析することできます。

と作者の方が EM.FM でおっしゃっていました。

このような指標を自分で見出したり解析するツールを作るのはなかなか大変ですよね。

その点 gilot はお手軽に可視化までできてとても便利です。

開発チームの生産性や健全性を可視化するツールの1つとして、開発チームのデリバリーパフォーマンスを測る指標 などと併用しながらうまく利用していきたいです。