クライアントエンジニアの伊藤です。
2016年に新卒にて入社し、現在2年目でiOS/Android向けのゲーム開発をしています。
今回は入社した当時からアサインされているチームにある、秘伝のソースから学んだことのお話をさせて頂こうと思います。

学んだ内容

  • 秘伝のソースというものを学んでみた
  • 設計周りを学んでみた
  • 効率良く引き継ぎできるやり方を学んでみた

秘伝のソースというものを学んでみた

秘伝のソースというものをご存知でしょうか。
長年運用されソースコードを漬け足し付け足し今に続く、下手に触ると何が起こるかわからない底の深いソースのことです。

入社して間もなくアサインされたチームには通称”闇”と言う、いわば秘伝のソースが存在していました。
やばいやばいと言われてはや数年。
最近になってようやく闇への理解となんとか綺麗にしようと動き出せる知識を手に入れてきました。

そんな秘伝ソースから学べることは反面教師的な何かしか無いかと思っていたのですが、実は学べることの宝庫でした。

設計周りを学んでみた

秘伝のソースから学べる最たる物の一つは設計の仕方です。
開発当初はそこまで想定していなかった。
限定対応かと思ったがその後も割と拡張して使うことになった。
時間という魔物によりこうするしかなかった。いやわからんかった。

// ごめん、無理(sSetNumberの中身を直さなきゃいけないけど何が起こるかわからんので保留)
//

<

p style=”font-size: 12px;”>
※あくまでサンプルです。

そういった前提や小さなほつれから様々な所に影響を及ぼしたり、その穴を塞ぐためのソースで秘伝感が増していくのでした。

途中で浄化(リファクタリング)などをしていければ問題はないのでしょうが、とはいえ取り返しのつかないところまで来ると、それを元に新たなソースを作ることになってしまいます。
そういった現象を自分の目でみて触るのが早いほど中々な速度で経験値が溜まっていき、きっと実践で生きるであろう設計ロジックを学ぶことができるのではないかと思ってます。

ソースコードを読んでこの設計の仕方は良かった。ここを改善するともっと効率的になる。
そういった気付きを自分の糧とし、秘伝をこれ以上濃くしないように。
そして別の箇所なら同じ過ちを繰り返さないような使いやすい設計を作成していきましょう。

// FIXME: バトルアイテムを開発するところも手に入れる手段もなくなったから、いらない・・・はず?
// gInitBattleSPWData();

setTouchEnabled(false);

<

p style=”font-size: 12px;”>
※あくまでサンプルです。

秘伝のソースは時々コメントで笑わせてくる

効率良く引き継ぎできるやり方を学んでみた

続いて秘伝のソースのもっともヤバいであろうところが引き継ぎの難しさ。

  • 口伝で伝えるには複雑で長い
  • いざ資料にまとめようとしても全てを覚えていない
  • コメントで伝えようかとしてもコメントが書いてない
  • まとめてある資料も最新の物でない

このコンボが発生することで“秘伝”の深みが増してしまいます。
なるべくそうならないためにも、秘伝ソースを担当/これから担当する人は日々手順書を作っていくことを心掛けましょう。

「これを追加するにはこういった手順で」「ここを修復するにはこの辺気をつけた方が良い」といった手順書です。
色々資料を見てきましたがやはりこのようなタイプがすぐ伝わりやすく、効率がよかったです。
なるべく機能別に細分化されたものが望ましいです。そして最新のものに常になっている(ここが一番難しいんですが)
その日の終わりに5分,10分でも良いので自分が行った作業で、新しくやった場合のパターンなど日々更新していく。一度に大きなまとめをせずコツコツと。

作成例:『ターン中、攻撃力アップさせる状態異常』
1:〇〇.hのkBattleState_に新規作成したい状態異常のIDの定義を追加する。
kBattleState_AtkUp = ○,  //!&lt; 攻撃力アップ
※似たものがないか確認/似たものがあっても内容を確認
2:〇〇.cppの状態異常Tableに状態異常の基本設定を定義する。
①設定する状態異常のIDを設定する
kBattleState_AtkUp,  //!&lt; 攻撃力アップ
②どのタイミングで状態異常の残りカウントが減少するか設定
kCountType_Turn, //!&lt; ターン経過で消費する
③複数の状態異常が重なった場合の計算方法を指定。
基本 Add 「足し算」を設定する。
④どの括りの状態異常かを指定。
Type_ATK_Up 今回の場合は攻撃力をUPさせるタイプの状態異常。
3:mGetStateSpriteListで状態異常のアイコンを設定する

<

p style=”font-size: 12px;”>
※あくまでサンプルです。

細かいことなんですがこれが抜けなく、最終的にまとめたものを見てもらうだけなので簡単に引き継げるコツです。
さらに自分の作業の振り返り。同じ作業がきた時の見直しなど、とても役に立ちます。
見た人間が理解しやすくなっていければそれも一つの秘伝解決の糸口です。

まとめ

2つ大きなトピックを紹介しました。
1つ目はもう秘伝を作らないように、濃くしないように。
そして2つ目は秘伝を改修以外の道で秘伝で無くしていく方法です。

ここに改修も入っていけばさらなる秘伝を取り除く動きになるのですが、それには相当の時間と影響箇所などの知識が必要です。
なので徐々に進めて少しずつ“闇”に光を取り入れていき、プリーストになれるよう頑張っていきましょう。(๑•̀ㅂ•́)و✧