どらめも

なんでもないことをかきます

Cybozuインターンに行ってきた

まえがき

8 月の最初の 1 週間で Cybozu さんで Web サービス開発体験のインターンに参加してきました。近年の情勢もあってフルオンラインでしたがそれを感じさせないとても良いインターンだったので今回記事を書いています。

参加するまでの流れ

サポーターズの逆求人経由でオファーをいただきそのまま面談(not 選考)や面接をしてと言う感じです。Cybozu さんは Twitter とかで以前からそこそこ知っていてインターンしてみたかったのでちょうど良かったです。

インターンシップの概略

Web サービス開発コースということで kintone の新機能のプロトタイプをモブプログラミングで開発を行うというものに取り組みました。Cybozu さんは業務にもモブプログラミングを取り入れているのでその体験という感じですね。6 人コースには人がいてそれぞれ 3 人チームに分けられ、チームごとに 2 人のメンターさんがつく形で開発を進めました。取り組んだ内容としては@Space という同じスペースに所属する全員に対するメンションを kintone に生やすというものを 40 個くらいある候補の中から選んで実装しました。 ちなみに去年は kintone 内部のコードはオンライン実施のためさわれず別の形でのインターンだったらしくその点よかったです。また、開発を行う機材として開発のセットアップが終わった 16 インチの MacBookPro(メモリ 32G)が貸し出されて何も問題なく快適に開発を行うことができました(スゴイ)。

実際の日程とか

一日目

顔合わせ、kintone の仕組み、事始め問題を解きました。(css をいじったりあることに関するエントリポイントの探し方とかデータベースのどこを叩いているかを探したりする問題) 二日目にメンターさんの解説もあり、どうやって探していくのかとか chrome dev tool とか IDE の便利機能の話とかがあって良かったです。

二日目

上の解説と仕様書の書き方の話、チームの発表。チームでの開発するプロトタイプの検討と仕様書を書き書きしました。 ここで僕らのチームの方針としては大きい機能を開発するというよりは小さい機能でも使用検討から開発、テストまでを行いたいという方針で用意されていた項目から選び、一部仕様を縮小して取り組むことにしました。(@Space の機能の対象範囲をとりあえず限定した) 誰に読まれても問題ない仕様書を書く必要があるので日本語力〜になりました。

三日目

開発のための機能開発のために色々な機能のコードリーディングをモブプロでやっていました。具体的にはサジェスト機能の場合にどうやって生成しているのかを追っていました。(Space をマージしたかったので) ここでの反省点としてコードを深くおいすぎたというのがあります。大規模コードを開発する場合においてコードを一から十まで把握している必要はなく、むしろ既存実装にできるだけ乗った方がいいこともあります (あとそんなことにさいている時間はない)。そこのバランス感覚が重要なのかなと強く感じました。

四日目

コードの表面をなぞりつつやることの全体像を意識しようと振り返りの時にメンターさんから助言をいただいたのでそれをチームで意識しつつやって息をしました。チームの子が残りタスクとやることの優先順位の可視化を行なってくれて 非常に助かりました。チームで助け合えるのはいいですね。この日は実装を行い、その後レイヤを意識した実装に書き換え、テストの実装を行いました。kintone のバックエンド実装は Controller, Service, Logic, Repository(Database)にわかれているほか、 便利関数の集合体である Util などがあります。僕らのチームではメンションの呼び出し機能などを Util から Repository を直だたきする実装にしてしまい、まあ業務的にはアウトだよね的な実装になってました。そこで話し合った結果レイヤの変更を行うことにしました。 結果として似たような処理を行う Service が存在していたためその既存実装にうまく乗っかる形で実装を行い Controller などにも変更を行うことでいい感じにしました。 あとはテストの実装を急いで行いました。今回はブラウザのテストを作成しました。Selenium で作ってあったのでそこに乗っかりました。僕も Seleniumスクレイピングを組んだことがあったのですが、その時は div とかを指定したりクリックしたりするコードで溢れていたのを記憶しているのですが、kintone のコードは機能ごとにうまく処理が隠蔽されていて、それらを組み立てるだけで様々なテストを組み立てられるようになっていて非常に体験がよかったです。存在しないものについては一部作成も行いました。

五日目

資料の作成と裏でリファクタなどを行いました。 リファクタの際テストで確認できたのでテスト楽で良いな〜になりました。

考えたこと

モブプロに関して

インターンに参加する前はモブプロやっても実際のところ生産性的にどうなんだとか考えていました。しかし、やってみると他人のコーディングのやり方などの部分(思考法とか知らない git コマンド)も学べる他、 あまり考えていない実装や見落としをしたコーディングをやる可能性が低いというのはかなり良いと感じました。モブプロをしなくても結局コードレビューに時間を割くことになるのでどっちもどっちなのかなーという気もします。 また、他の人の感想にあったのが詰まった時にサクッと相談できたり解決策が見つかったりするため時間が止まることがなくなる、というのは業務を円滑に行う上で良いと感じました。 しかしながら、コードを全員がいまいち理解していない段階においては別にコードリーディングの時間を設けたりすることで理解度を上げるのもいいと感じました。適材適所ですかね。

心理的安全性に関して

モブプロや他の活動をする中でかなり発言がしやすい風土があってとても素敵だと感じました。 わからないことを言語化したりあとこうなんじゃないかなと気軽に相談できるのはとても良い経験でした。 あと個人的にはこれは今やることじゃないよねみたいな感じでやることの訂正などを気軽に言えるのもいいなと思いました(自分で気づくのは難しいことが往々にしてあるので)。

大規模コードを考える

いままではハッカソンとかで一から(雛形とかは使いますが)コードを構築することが圧倒的に多くて大きなコードに機能追加とかをした経験が学部実験くらいでしかなかったのでかなり新鮮でした。OSS とか読んだりプルリクとかしていきたいですね。 実際に大きなコードを読んだり書いたりしてみると三日目のところでも触れましたが、全てのコードを把握する時間はありません。そこで関数名や引数、interface から挙動を知ることになるのですが、そこの名前がかなり重要なわけです。 リーダブルコードなどの書籍があり、僕自身も読んだことはあるのですが、その内容を机上のものではなく実感として知ることができたのはとてもよかったと感じています。 コードの構造に関して少し話しておきます。 Spring MVC においては責務の分離ということでコンポーネントの分離が行われています。いままではまあ大事だよね〜(あんま実感ないけど)みたいな感じでこういう話を眺めていたのですが、今回色々やってみて あたりまえですが色々なところから Database をいじったりするなんてあり得ないしわかりにくさを生じさせるのみなので積極的に意識していきたいと感じました。どのコードも今後数年生かしていくことを考えたコードになっていて とても参考になったのと同時にいままで知識として持っていたものを実感することができてすごく楽しかったです。

その他

社長さんとのランチ会

レイヤを下げて抽象度合いをあげれば海外進出しても勝負できるみたいな話をしていたのがとても印象的でした。とてもフランクにお話をされていて意見を言いやすい風土があるのかなと感じました。

スプリントレビュー

サイボウズでは週ごとに今週これやったみたいな報告会があるらしく参加させていただいたのですが、社員さんがこれ作ったんだ〜って感じ嬉しそうにお話しされていたのが印象的でした。

業務の流れ

25 分やって 5 分休むみたいなのを続けていたので集中力が持たないみたいなのはなかったです。もう少し長くてもいいかなと感じましたが定期的に休みを強制されるのは思考をリフレッシュできるのでいいと感じました。Cuckooはいいぞ。

感想

  • いままで知識として持っていた事象が実感として得られて腑に落ちたのはとてもよかったです。
  • 欲を言えばもっと長めのインターンだとよかったなあと思いました。実装できる時間が流石に少なかったので。
  • モブプロは全然ありな手法だと感じました
  • 雰囲気が心理的安全性〜って感じしてよかったです
  • web サービス開発コースですが蓋を開けるとバックエンドばっかり触ってた気がしますね笑