imog

主にUnityとかの事を書いています

コードレビューについての文書を書いていた

色々決めごとをするときは社内にissueなりwikiなり残すのですが、これは外に公開してもいいんじゃない?と思ったので公開します。 今回は「コードレビューの導入する」というやつです

なぜコードレビューをするのか

大きく二つの効果があると思っています

コードの品質を保つ

一人でコードを書いたときに、それが対応として適切であるかどうかを判断するのは結構難しいです。 基本的には機能を実装するとき、以下の三つについて確認する必要があると考えています。

  1. コードの書き方が適切であるか
  2. 解決方法が適切であるか
  3. 修正箇所以外の影響への対応は適切であるか

下に行くほど考えるべき領域が広くなっていきます。 領域が広くなるほどに一人で対応できる難易度は上がっていくため、漏れが発生し不具合が起きてしまいます。 特に3に関しては自分が予想だにしていないところに影響を与えるなどありがちです。 これを防ぐためにテストコードを書いたり、レビューにより他人の視点、知識から問題を発見していくことが重要になります。

コードの属人化を減らす

ゲームは特に専門性の高い部分が多く、この部分はこの人以外対応できないという問題が発生しがちです(属人化)

短期開発における属人化は速度が出せるので有効ですが、長期の開発においての属人化はボトルネックになりがちです。 これを回避するためには全員がある程度コードを把握しておく必要があります。 コードレビューは自分が把握していないコードを見る有用な時間です。 品質を保つためのレビューだけではなく、自身がコードの内容を把握するためにレビューしていく習慣をつけることで属人化に対処できると考えています。

どうやっていくのか

PRのマージは2人のapprovedを必須にする

  • 2人のapprovedを確認して、自分でマージしてもらいます。(書いた人が取り込みたいタイミングを理解しているはずなので)
  • 人数は暫定です。多いか少ないかはやってみて動的に変えていこうと思います。
  • 2人approvedもらえたら、そこからいつマージするかはPR出した人にお任せします。状況に応じてもっとレビューを求めるのも問題ありません。

スクリプトファイルのみの変更はレビュー不要

  • エンジニアが目視で見ても判断つかないため
  • レビュイーがUIテストなどが通ってるかは確認しましょう(いずれ自動化)
  • 「レビューポイント」のところにレビュー不要な理由を書きましょう(シーンファイルのみのためetc..)

インゲーム・アウトゲーム関係なく2人をランダムにレビュアーにする(ランダムな仕組みは後から作る)

  • 属人化を防ぐため
  • リード的な人のレビューを必須にするとボトルネックになってしまうため
  • この人に見てもらわないと不安!みたいなシチュエーションの場合はその都度その旨書いて指定する

レビューを優先する

  • レビューが終わらないのでマージできない!という状況を防ぐために、レビューを優先!という共通認識を持ちたい
  • 忙しすぎてレビューが本当に無理!ということになったらタスクの積み方から一旦見直す

レビュイー(PR出す側)に意識してほしいこと

PRの粒度を意識する

PRのコミット粒度を小さくすることを心がけていきましょう。 体感ですが、スクリプトファイルの変更が二桁突破するともう辛くなります! コミット粒度を小さくするためには、エンジニアタスクの適切な分解が必要になってきます。

例えば「APIからとってきた情報を表示する新規の画面の追加」というタスクがあるとしたら、それは以下のタスクに分解できます。

  • 画面に表示する情報を持つモデルを作成する
  • 新規のAPIと通信をするメソッド実装
  • 新規画面の追加(データは決め打ちのモック)
  • 画面にモデルの情報を表示するように繋ぎこむ

これらをまとめてやってしまうと肥大化してレビューしにくいので、適切な分割を心がけましょう、

背景が伝わるように文章を書く

PRから背景が伝わるように文章を書いていきましょう。 なぜこのPRをやるのか、どのように解決するのか、特にどこをレビューしてほしいのかなのかがハッキリすればレビュアー側の負担を減らすことができます。JIRAチケットのURLを貼るのもいいでしょう。 前職では以下のようなテンプレートを採用していました。これに近いものを用意しようかと考えています。

https://gist.github.com/adarapata/40ec5f66e0c348a639a1aa6cb519aee6

レビュアーに意識してほしいこと

HRTの原則を守る

「レビューはBARで語らうように」という名言があります。レビューとは相手のやったことに対してコメントするので、ともすれば相手を傷つけてしまうような悪い空気になってしまいます。それが発生しないように謙虚(Humility) 尊敬(Respect) 信頼(Trust) の気持ちをもってコメントしましょう。

HRTの原則 ~ソフトウェア開発はバーでしっとり語り合うように ~

http://blog.livedoor.jp/lalha/archives/50496623.html

なぜを書く

「良い」「悪い」という基準は主観的な言葉なので、どういう観点から良い、悪いを判断したのかを書くように心がけましょう。

悪い例:「ここはBのようにしたほうが良いと思います」 いい例:「ここはBのようにするとネストが減り可読性が上がりそうです」

わからないところは質問していく

レビューは品質の保証だけでなくレビュアーが要件を理解する場でもあります。なので、こうしたほうがいいというコメントだけではなくて「このコードは何をしているんですか?」みたいな自身の理解を深めていくのも目的です。 なのでこの辺りがわからない、というのもどんどんコメントしましょう。

褒める

めっちゃええコードやんと思ったらそういうコメントもどんどんしてください。

テストコードについての文書を書いていた

色々決めごとをするときは社内にissueなりwikiなり残すのですが、これは外に公開してもいいんじゃない?と思ったので公開します。

今回は「Unityにテストコードを導入する」ときの文書です

なぜテストコードを導入するのか

往々にしてプロダクトの要件は常に変化します。一ヵ月前の仕様が変わることも珍しいことではありません。仕様が変わればコードの修正は必要です。つまり、コードは必ず変化するという前提で書く必要があります。

コードが変化すると、その周辺のコードに少なからず影響を与えます。場合によっては全然関係ないと思っていたところに飛び火することもあります。それらを予め人間がすべて把握するのは経験則からくる職人技に近いものなので、非常に難易度が高いです。

テストコードを書くと、変更を加えた際に起きる影響をある程度可視化してくれます。 プロダクトの規模が大きくなるほど開発速度は落ちていきますが、テストコードはその減速率を下げるのに役立ちます。

テストコードを書くメリットは以下の2点です

品質を把握する

テストそのものが品質を上げてくれるわけではありません。テストコードは現状のプロダクトの品質がどんなものなのかを可視化してくれます。この部分が適切に動いているのか、この部分に変更を加えるとどうなるのか、など。品質の可視化は機能追加、リファクタリングの判断材料となり、素早い意思決定が行えます。

テストがないコードは品質が悪いのではなく品質がわからないので、どこを直すべきか、どこの処理を手厚くすべきかという判断が難しくなり、結果的に開発効率が落ちてしまうと考えています。

精神的障壁の排除

影響範囲の見えないコードの修正はメンタル的によろしくないです。 根本原因を解決すべきとわかっていても、影響範囲が見えない場合、リスクを減らし最小工数で抑えるために一旦場当たり的な対応を取りがちです。これはもちろん有効に働く場合もありますが、上記のネガティブな理由から選択すると、未来で同じ問題にぶつかってしまいます。

テストコードにより影響範囲が可視化されていると、根本原因の解決はどのくらいの影響を与えるのかというのがある程度見えることで「なんだか大変そう・・」という精神的障壁を超えた上で判断ができるようになります。

導入するためには?

テストコードを書くためには、ビューとロジックが分離されている必要があります。(そうしないとめっちゃ書きづらい) これは別issueのMV(R)Pアーキテクチャ導入 #1125 によって実現できると考えてます。

また、シングルトンはテストするのが非常に面倒です。 refs シングルトンパターンの誘惑に負けない

この問題は、シングルトンをやめて依存性の注入(DI)を行うことで解決できます。UnityだとZenjectというライブラリが有名です。

ユニットテスト

Unityに依存しないPure Classのテストです。これはEditModeテストを導入します。実はいくつか実装済みです。 - 例 xxxxx

Zenjectを導入した場合、バインド処理が必要になるのでZenjectに付属の ZenjectUnitTestFixture を継承して書く

refs - Unity で ユニットテストをする http://blog.kakeragames.com/2016/02/17/unity-test-unit.html

インテグレーションテスト

MonoBehaviorなどUnityに依存したコードのPlayModeテストを書く。やり方はもうちょっと詰めていく。

unity-uitestというライブラリがあったのでこれを使えばアウトゲームのシーンUIの自動テストは書けそうな気がするが要調査

FaceRigとボイスチェンジャーでバーチャルの肉体を手に入れた

30手前の男性二人がチャットでボイチェンで美少女声出してキャッキャしてたら肉体も欲しいなという気持ちになり、FaceRigを購入しておばあちゃんの肉体を手に入れた

無駄にバーチャルの肉体で配信できる環境を整えてしまった。

しかしそうなると今度は身体を動かしたいなという感じになってきたので誰か僕にHTC VIVEを買ってください。

社内LT会に参加してきた

社内でLTやろうぜ!という流れができたので参加してきた。

お昼に行われるやつで、なんと1000円相当の弁当が出るコスパ高いLT大会だった。今回は牛たん御膳を選択。

僕は最近やってたUnityのでモッククライアントの実装など話していた。

speakerdeck.com

前回話したテストの延長で、通信が絡むユニットテストの解決方法を探すという感じのお話。 これはいずれ汎用的に使えるやつとして公開したいなーというお気持ち。

その他にもC++の黒魔術があったりとバラエティ豊かな発表だった。

www.slideshare.net

C++ => C プリプロセッサらしい。

全員基本的になんだかヤバそうなスキルを備えていて聞いてて飽きない話ばっかりだったので、こんな感じで表に出していけるような空気になっていけばいいなと思う。

試用期間が終わった

金曜日でちょうど三ヶ月だったので、無事に試用期間を終えることができたっぽい。

社内でやったこと

クライアント側の一部分にアーキテクチャ導入したり、テスト導入したり、その過程でDIツール入れたりなど。 割と開発基盤を整えていた感じある。 また、それとは別にふりかえりのファシリテートしたり、動きやすくするためのチームビルディングなどやっていた。 チームビルディングと敢えて言う内容でもなかったりするけど、行動に名前を付けることは大事なのでそう呼んでいる。

あと臨時会議室作るとかしてた

www.instagram.com

BARいも焼酎、席替えに伴いだいぶ土地を減らされました。

割と前職で得た知識や経験がそのまま適用できているので、業界関係なくエンジニアリングは大事だなあと感じた。特に人の巻き込み方に関してはそれはもうパクりまくっている。

最近はとりあえず考えてること全部垂れ流そうということでいもスレというスレッドを開発チャンネルに作ってる

https://i.gyazo.com/29cdb17fd4b211341a65b50c51cdeaef.png

コメントはないけど絵文字だけは付くので見てるんだと信じてる。

一方で、結構新しい概念や技術を立て続けに導入したため別の問題も発生しているので、それはそれで別途解決しないといけなさそう。今後優先する課題であった。

社外でやったこと

Gotanda.unityは定期的に登壇したりしてる。3月はZenjectのテストについて話してた。

speakerdeck.com

入社3日目にして社名を間違える失態を犯したけど無事試用期間終わりました。

あと、「Unityテスト完全に理解した」という勉強会の会場提供したり発表したりしていた。

connpass.com

僕はテストを導入した話をやっとりました。

speakerdeck.com

#Unityテスト理解した ハッシュタグがトレンド2位まで上がってたので驚いたのとともに、やっぱみんな気になってたんやな・・という気持ちになった。 懇親会でも、導入したいけどできなかったとか、一人で頑張ったけど燃え尽きたなど様々な苦労話を聞いたり。何か参考になればよさそう。

第二回やるときは是非とも各所で運用されているゲームの人たちに登壇してほしい。ほんと。

これからやること

有給が発生したので活用してぽん酒館行きたい

ponshukan-niigata.com

ボイストレーニングを始めた

突然のボイトレを始めた

なぜ

最近歌ってないなと思いカラオケに行ったら歌が下手になっていた。

でも冷静に考えたら普段仕事で歌ってるわけでもないし日頃トレーニングしてるわけでもないから、下がりこそすれ上がることは永遠にないことに気づいた。

歌うのは好きなのでそれは嫌だなあと思い何かしら動くことにした。

教室が近くにあることはわかったが、直近だと時間とお値段がつらいので断念。 その代わりamazonで好評だった本に倣って練習している

https://www.amazon.co.jp/gp/product/4905084180/

いずれはスタジオ行きたい

なにしている

本自体はCDの説明に沿って1日30分くらいのトレーニングだけ。 まだ一週間なので特に変化はないが、根気よく続けていくことにする。

あと、今までやってこなかったけど自分の声を録音して聴くようになった。 するとそこでようやく自分の音がやや低くずれていることに気づいた。やっと改善のための分かりやすい材料が出てきた。やったぜ。

翌日もう一度録音して少しずつ調整をかけていってそれっぽくなってきた。 何事においてもふりかえりは大事であることを改めて認識させられた。

それ以降、通勤時は録音した自分の声を聴くようにした。万が一イヤホンが外れたら自分の声を聴き続けるナルシストエンジニアと認識されるリスクを背負いながら僕は働いている。

ちなみに練習時の曲は聖飢魔Ⅱの「荒涼たる新世界」です

www.youtube.com

みなさんカラオケに行きましょう

GWふりかえり

大洗帰省

心の故郷である大洗に帰省した

www.instagram.com

www.instagram.com

いつも日帰りだったので今回は一泊二日にしたところ、みんなで帰りを気にせず飲めるので最高だった。ドルフィンで酒を飲み知らない人と一緒に「ジョジョ ~その血の運命~」をデュエットして、翌日はレンタサイクルで大洗を駆け回り非常に充実していた。そろそろまた行きたい。

MMBAR

メタルマックスに出てきた料理を食べながらメタルマックスについて語るイベントがあったので行ってきた。

twipla.jp

前職でも現職でもメタルマックスの話題は誰も伝わらないので10年分くらい喋った気がする。

あと、アリとアリの卵を使ったオムレツを食べた。 www.instagram.com

桜えびの味がした。

ノアフェス勉強会

友人に連れられてノアフェスと呼ばれるイベントの事前勉強会的なのに参加してきた。

noahfes.jp

ノベル&アドベンチャーゲームの祭典らしい。同人やインディーゲーム開発においてノベルやアドベンチャーってあまりプログラマというのを見かけないイメージがあり、案の定プログラマはほとんどいなかった。しかしプランナーやシナリオライター側の発表はあまり聞いたことがなかったのでそれはそれで新鮮で楽しかった。 ノベルやアドベンチャーは観測している範囲だと吉里吉里やティラノエディタをベースに作るのが主流なので、他のジャンルとはまた違った空気感なのかもしれない。

輝夜月にハマる

VTuberはもともと知ってたけど、輝夜月のShowroom生放送を観たらドハマりしてしまった。投げ銭すると即時にからあげやタライが降ってきたり1万円で竹がにょきにょき生えてくるのは絶対テンション上がる。承認欲求が満たされていく。 そのまま委員長の放送見始めたのでその勢いは留まるところを知らない。

割とGW満喫したので明日から一般社会人に戻ります。 ちなみに明日からUniteですが、僕は三日間終日参加しているので気軽にお声がけください。

events.unity3d.jp

当日はUnityできますよTシャツが目印です。