弊グループアドベントカレンダーの記事ですが本日最終出社を迎えますshishiです。
前置き
- これは日記です
- 技術的な詳細の話はしない
- 特にためになりそうなことは書いてない
経緯
4月に入社。入社がそもそも紹介で、とある仕事のために僕が必要ということで誘われて入社したものの入社したときにその仕事はなくなってしまっていた。さて何をしたものかと思っていたらやったことないObjectiveCからやったことないSwiftへの移行プロジェクトをすることになった。なお僕個人は別の1人プロジェクトもやっている状態。
メンバー
私自身はRuby、PHP、Perl、あとは趣味で雑多に色々とやってきたプログラマー。開発リードをすることに。
実はもともとタイトルのような大変な感じのプロジェクトではなく、プロジェクトの話が出た頃にはObjectiveC版をメンテナンスしていた数人と一緒にやるはずだった。しかし、いざ始めましょうかという段取りになると不思議な力でもともとメンテナンスしていた人達が全員別プロジェクト(地理的にも別、アドバイスを求めることも諸事情で難しい状態に)へ行くことに。残ったのは新卒(プログラミング経験あり)2人、プログラマーへキャリアチェンジしたばかりの1人(プログラミング経験無し)と私。全員ObjectiveCもSwiftも経験無しというなんともワイルドな感じになる。
プロジェクトを始めた後にさすがになんともならんということで僕を弊社に誘った張本人の1人(Java、Groovyプログラマー)と、その人と一緒に別の仕事をすることになっていたプログラマーへキャリアチェンジしたばかりのもう1人(プログラミング経験無し)を引きずり込み、自分のツテでObjectiveCもSwiftもできるフリーランスのiOSアプリケーションプログラマを1人業務委託で連れてくることに成功し最終的なメンバー構成に。
プロジェクトでやりたかったこと
- アプリケーション自体はビュー数も多くなく、自社サーバーに用意されたAPIを利用してほげほげな操作をする。詳細は不思議な力で書けない。
- 今後のメンテナンスを考えたObjectiveCからSwiftへの移行。移行すること自体が第一の目的。
- アプリケーションの画面デザインを全画面変更。ビューの構成要素自体はあまり変わらないが見た目的なものはほぼ変わる。
- 予定期間は4ヶ月強
やってきたこと
プロジェクト開始前の私が入社してすぐぐらいはメンバー達にプログラミング基礎教育をしていた。言語としてはRubyを使い、数冊のRubyの本を輪読したり、Railsチュートリアルを2週したり。この輪読は色んな所で好評なので興味があったらまた会ったときにでも聞いてみて欲しい。なのでメンバーは大きくパラダイムが変わるのでない限り、なんとなく書いてあることは理解できるぐらいだったと思う。僕自身はSwiftのチュートリアルや入門書をいくつか済ませておいた。ObjectiveCについてはなんとなく読めればいいや以上の学習はしていない。 メンバーにはさらっと文法だけでも理解しといてね、と自習する時間をとってもらった。
言語移行に際して段階的にObjectiveCのコードにSwiftを混ぜていくか一気に作り直すかという方法があり、一気にやったほうが良いのではと思い友人数名に相談してみたところ、ほぼ一気にやったほうが良いという返事をもらったのでSwift新規プロジェクトを作り直すことに。
ObjectiveC版のコードはまさに秘伝のソース状態。やはりプログラマーとしては移行したついでに綺麗に直してやるぜぐらいは思っていたんだけども、これを直せるようメンバーを教育しながら移行していくことは無理だと判断。移行するという目的自体を第一に優先すべく、分からない部分はとりあえず動くという状態のままSwiftコードへとしていこうということにした。この当時は新デザイン案もまだまだ固まっていないことも合わせて、既存の画面デザインのままとにかくSwiftへとコードを移すことを優先した。この先何が間に合わなかったとしても第一の目的だけはという感じ。
この「とりあえず移行しよう」を優先したときに付け加えたことは2つあり、一つはStoryboardをビューごとに分割すること。これは人間が自分で内容を管理するものではなく、生成されたものを受け入れるしかないのが基本のXMLにも関わらずアプリケーション全体で一つの状態であったので、これからの移植、チームでのメンテナンスの際にさすがに看過できないデメリットになると判断したためによる。もうひとつはデーターベースアクセス、及びモデルとして定義されている部分についてユニットテストを書くこと。ほとんどのロジックはコントローラーに書かれており、ちゃんと分割されているわけではなかったので効果としてそれほどのものは得られないだろうということは予測できたが最低限自動的に誤りが見つけられるようにということと、後々テストを全体に整備できるようにするための教育含み。あとは多々ある言語の機能の違いをどうするかというのは早い段階で話し合って決めた。(letやvar, StringとNSStringなど)
移行する単位は画面ごととした。いろいろな画面で使われている共通メソッドみたいなものもあるが、担当した画面に関係のないものは一切無視して構わないことにした。区切りを分かりやすくしたかったこと、画面をつなげて動かすことを優先したかったこと、移行元に不要なコードが多く予想できたので切れるコードは早期に切りたかったことによる。割りと機械的にであればこの程度の学習量でも進まないことはないなと思った。とはいえ当たり前ながら機械的な移植では動作が変わってしまうことは多くあり、その際には仕様を維持できるように相談して実装していた。ついでに実装がまともに近づくことになったのでこのある程度考えるプロセスがあったのも結果的に見れば良かったのだと思う。
メンバーみんなでうんうん唸りながら数画面移植できてきたところで、上記の唯一まともにプロジェクトに必要な技量を持つプログラマーである友人が参加してくれたので、そこから開発が加速した。言語の文化、常識を聞いてメンバーの作業も早くなり、彼本人の作業もあって移植が進むようになった。まさに救世主状態。
移行作業中にはライブラリ管理をやり直したり、非推奨メソッドを代替してみたら動作が変わって大変なことになったりとそれはもうみんな困ったのだがそこはまたいずれ。
そのまま期間の大半を移植に当て、それっぽくアプリケーション全体を動かせるようになったところでコード行数を計測したときは不要なコードの多さと言語を替えたことによる圧縮効果が凄まじく、30%程度になっていたと思う。
単純にコードを移し替える上記の移植がだいたい終わったところで画面デザインの変更に取り掛かったのだけども、こちらのデザインの人もスマホアプリのデザイン初挑戦という方とうこともあり、テイストを崩さないように、かつ開発のやりやすいようにだいぶいろいろとデザインを一緒に試行錯誤させてもらった。
実際にその新デザインをStoryboardに当てていく際にはだいたいのメンバーがつらい移植を乗りこえてきただけあり、スムーズにデザインの変更を当てていくことができた。これは私自身が思っていたよりメンバーが成長したなと思った部分だった。デザインの移行が早かったこともあり、この時点で全体にUIテストを書くことができた。なおこのUIテストはそもそもテストフレームワーク自体がものすごく不安定で遅く、ここまでの開発で積もり積もったXcodeへの憎しみが倍増するきっかけとなった。
今回はありがたいことに外部からQA用人員を呼んで良かったので、だいたいデザインが当てられた頃から細かい動作検証をしてもらえた。開発者テストさえ上記のように十分ではなかったこともあり、このQAがなかったらどんなひどいアプリケーションができていたか…
メンバーへ思うこと
実際プログラミングを学習し始めるには既に動いているアプリケーションの一部を改修していき、小さいところからより広げていくのが一般的な気がしているけども、今回は会社の都合とはいえハードなことをメンバーに課すことになってしまったと思う。できた教育も十分ではなく、終始OJTできつかったと思うが、1人も抜ける人なくリリースできて良かったと思う。
教える時間が十分ではなかったので一つ一つの知識を教えても覚えられないと思い、できるだけ考え方を終始伝え、そこからどうすれば良いんじゃないかと教えた。我田引水すれば長期的には考え方が大事で知識は都度覚えていけば良いものであると思うので、それが今後役に立てば良いなあと思う。
これから
本当はもっと整理して書くつもりだったんだけど書いてるうちにいろいろ思い出して完全に日記になってしまった。まあこういう変なのがアドベントカレンダーに紛れててもいいかと思いそのままにする。
このブログは12/2に予約公開設定してある。公開する頃にはもうアプリケーションは僕の手を離れているはず。十分にやりきれないことはあったけどもメンバーの努力で制限の多い中最上のものになったと思う。移植を通して未経験ばかりだったメンバーは大きく成長したし、リファクタリングの順序や方針、Realmへの移行等々直すべきことの方針は共有してあるし、これから今までの苦労を次にメンテナンスする人達に被せないようにする作業を通してアプリケーションがずっと良くなっていくことと思う。
なお冒頭の通り私は12月で退職する運びとなっている。しばらくフリーランスとして過ごす予定です。近い将来タイムゾーンがずれるリモートワークでも良いという条件でお仕事あればぜひご連絡ください!