ブログ

インターンはたくさん失敗しよう

ソウトウェアエンジニアインターンのhiroです。
最近は様々な企業のインターン体験記をブログで読むことができます。例えば私の前回の記事もその一つです。インターン先を検討する際に参考にする人も多いのではないでしょうか。私もインターンの内容を調べる際に参考にしました。しかし、読み進めていくと自分と同じ学生がやってるとは思えないような成果物がズラリと並んでいて、「えっ、こんなことやってるの?」と衝撃を受けることが多々ありました。インターンと言えど、成果を挙げることが当たり前のようです。
しかし、短期間で結果を出すことがインターンの本質かと言われたら決してそうではなく、就業体験である以上、エンジニアとして働くこととはどういうことなのかを学ぶことが重要だと思います。インターンに限らず働く上で失敗はつきものです。失敗した時にたくさんのフィードバックをもらえるのがいいインターン先だと思いますし、そこから一つでも多くのことを学び吸収することがインターンに参加する醍醐味なのではないでしょうか。
前回の記事では私がエンジニアチームのインターンとして実際に取り組んだ内容について書きましたが、その過程でいくつもの失敗をし、たくさんのフィードバックをもらいました。今回の記事では、私のインターン経験をもう少し掘り下げて、インターン期間中に失敗したこととそこから学んだことをいくつか紹介します。

グループ開発に慣れずにテンパる

ソフトウェアで仕事をする上で欠かせない存在となったGit。複数の人と共同で開発する経験が少なかったため、インターンする前はせいぜい GitHub に自分のコードを乗っけるくらいのことしかできず、マージコンフリクトって何?というレベルで分かっていませんでした。
Git の使い方を一通り勉強しながら開発を進めていたのですが、ある日、git merge master で現在のブランチにマスターのブランチを取り込もうとして失敗してしまいました。軽くパニック状態になった私は慌てて git revert HEAD -m 1 を行い、再度 git merge master をしました。今度は問題が起きなかったので、このままプッシュしました。
…Gitに明るい方であれば既にお気づきだと思いますが、やらかしてます。具体的には、merge commitをrevertしても、変更したデータを打ち消せても履歴を打ち消しているわけではないので、再度masterを取り込もうとしてもrevertされた分のコミットが取り込めないという現象が起きていたのです!(詳しい説明はこちら)。対処するには、再度mergeする前にrevertしたmerge commitを再びrevertする必要がありました。
私のGitに対する理解が浅かった故に、結果的に間違った修正をプッシュしてしまいました。幸い、すぐにエンジニアの方に失敗した箇所を取り消していただき、何がいけなかったのか説明してもらえました。この一件で私はGitの恐ろしさを垣間見ると同時に、ツールを正しく理解し使うことの重要性を学びました。あー怖い。

Javaの正しい書き方が分からずコードレビューで弾かれる

フライウィールのインターンに来るまではC++やPythonを使うことが多く、 Javaは大学の講義で触ったことがある程度の経験しかありませんでした。講義の知識を動員してなんとか動くコードを書きましたが、コードレビューの段階で様々な問題点を指摘されました。正常な動作が確認できるコードでも、継続して開発する上で技術的負債となる可能性があれば、直す必要があります。正しいコードの書き方を勉強をするためには Effective Java や実際に使われているコードを読んでみると良い、というアドバイスをいただき、Nullを使う代わりにOptional型を使う、引数が長くなればBuilderを使う、といった実践的なJavaの書き方を勉強していきました。
その後も座学やコードレビューを通じて色々なことを学び、インターンが終わる頃にはメンターの方に「hiro さんはもう First Comment Approval できるぐらいここでの開発に慣れたね」と言っていただけるまでになりました。

仕様を完全に把握できないまま実装を進めてしまう

開発フローに少し慣れてきた頃、古いコードを移行するというタスクが私に割り振られました。当初はただの移行作業だけだと思い、深く考えずに古いコードと同じロジックを再利用しようと考えましたが、実装の途中でエッジケースの存在が発覚しました。迂回しようと分岐処理を重ねていくと、いつのまにかコードが肥大化してしまう事態になりました。
このことを相談すると、一度思考を整理して、本当に必要な処理は何なのかを見極めることが重要だと指摘されました。
実際にホワイトボードで内容を整理すると、本当に実装するべき機能の整頓が出来ました。結局一から書き直しになってしまいましたが、前より遥かにスッキリしたコードを書くことができました。こういう事態を回避する為に、最初からデザインを意識してデザインドックを書いたり、ユースケースを考えたりして、実装する前にやるべきことを整理するプロセスが大事だと痛感しました。

最後に

私が紹介した失敗はどれもエンジニアとしては初歩的なミスです。ですが、どれもインターンをしなければそもそも経験することができなかったものばかりです。失敗を経て、私は今ではGitで慌てることはなくなり、Javaの正しい書き方がある程度身に着き、仕様の詰め方について考えられるようになりました。これらは紛れもなくエンジニアとして成長したと言い張れることだと思います。
インターンとして結果が出せることは素晴らしいことです。ですが、そこに辿り着くまでの過程で失敗を重ね、そこからフィードバックを得て、学ぶことができるのも、インターンの大きな魅力の一つじゃないでしょうか。
フライウィールでは、たくさん失敗して、たくさん学びたいインターン生を募集中です!