見出し画像

新卒エンジニア研修・PHP編

コドモンの開発ブログを移転しました。最新の記事はこちらからご覧ください。

こんにちは、コドモン21卒エンジニアの昼寝が好きな成本です!

現在コドモン開発部では3ヶ月におよぶエンジニア新卒研修を実施しており、幅広い分野の知識について学んでいます。コドモン開発チームのエンジニア研修シリーズとして、新卒エンジニアから見たリアルな研修風景をお伝えしていきます!

今日は前回のインフラ研修に続いて、PHP研修についてお伝えしていきます。

 1: 研修全体の大まかな流れ

本研修では『PHP本格入門』という書籍の上巻を参考に学習を進めていきます。ちなみにこの書籍、300ページを超える分厚い本となっており、最初に目にしたときは少し冷や汗が出ました💦

自分のように「情報過多なものに少し苦手意識がある😰」という方はいませんか?そんな方でもコドモンの研修では心配ご無用です。なんと先輩が現場の知見を元に、実務を行う上で重要な点をドキュメントにまとめてくださっています!

▼プログラミング基礎のドキュメント

画像3

ドキュメントは2種類あります。条件分岐や繰り返しの様な汎用的プログラミング知識のキーワードを記載した「プログラミング基礎」と、クラスやインスタンスなどのより抽象度の高い概念をまとめた「オブジェクト指向」です。

ドキュメントに記載されたキーワードを重点的に学習すれば一通りの座学知識が身につくうえ、その過程では実際にコードを書きながら手を動かすことが推奨されており、Dockerに立てた Laravel環境で実行することができます。しかも周りの新卒たちと一緒に分からない箇所を相談しながら進めていくことができるので、記憶に定着しやすかったです!

画像4

このようにまずは基礎的知識をインプットする座学がメインとなります。しかし本研修では覚えたことを覚えたまま終わりにするような勿体ないことは決してせず、定期的にアウトプットを意識した演習も行います!例えば、関数やif文といった基礎知識を用いてしりとりを実装する演習などもありました。他にも章ごとに数々の演習を行いましたが、中でも印象に残った特徴的なものについては次章で取り扱います!

2: 特に印象に残ったエピソード

前章でもお話しした通り、本研修では座学の要所に演習がありました。本章ではそれらの中でも特に印象に残った3つの具体的なエピソードについてお話ししていきます!

ジャンケン✌️

まず初めにジャンケンの実装です。この演習の目的は3人の仮想プレイヤーでジャンケンを実施し、その結果を表示するといったものです。これを基本的な条件分岐のみを使ったものと、オブジェクト指向の概念を用いたものの二段階に分けて実施しました!関数のみしか使えなかった第一段階と比べて、第二段階ではオブジェクトと呼ばれる単位にコードを切り分けることができてコードの可読性が飛躍的に上昇しました。

この研修が印象深かった理由は二つあり、先ほど述べたようにオブジェクト指向の有用性を実感できたこと、そして初めて先輩のO本さんにコードレビューをしてもらい可読性を意識するようになったことです。

画像5

チーム開発でコードを書くということは、チームメイトが読みやすいコードを意識するのが必要不可欠です。冗長に書かれたコードよりも簡潔に書かれたコードの方が意図が伝わりやすく、例え最終的な挙動が同じだったとしてもリリース後の保守性や拡張性は高くなります。それをふまえて、レビューでは主に早期リターンなどを用いた条件分岐の簡略化や、php-cs-fixerなどのプラグインによるフォーマッティング(記述形式の統一化)について教えてもらいました。

しかしこれらのノウハウは数多くあるコーディング規則の氷山の一角🧊に過ぎません。チームメイトの読みやすさを意識した綺麗なコードを書くためには更に多くの規則が必要となります。そこで!数多くのエンジニアに長いこと好まれてきた必読書ともいえる名著を新卒で読んだので、それについて紹介します。

リーダブルコード📗

『リーダブルコード』は簡潔で洗練されたコードを書くためのノウハウがいくつも共有された技術書です。

"hoge"や"fuga"などのとりあえず「その時動けば良い」変数名を使ってしまったことがある方はいませんか?本書では目的が明確で伝わりやすい変数の命名規則や、どの程度の大きさで関数を切り分けるべきかについて、具体例と共に紹介されています。

今回は本書を21新卒の5人で分担し輪読会を実施しました!この輪読会を通して具体的ですぐに意識できるコツを学習し、晴れてコーディング過程におけるリファクタリング(一度記述したコードをより簡潔化させること)の基本的な手法を獲得しました。

一通りの構文、オブジェクト指向、リファクタリングの手法を獲得した今、ある程度基本が出揃ったといっても過言ではなかったでしょう。そうしてホッと息をつくのも束の間、PHP研修における最終試練が待ち構えていました......!

ブラックジャック🃏

多くの人が一度はプレイしたであろうブラックジャックは、トランプの手札の合計がなるべく21に近づくようにカードを引いていきプレイヤーとディーラーでその結果を勝負するゲームです。

本演習ではそれまでに培った全ての知識を使って、ブラックジャックを実装しました。そして今回はなんと珍しく個人戦!各々が自分のやり方で最善の実装を目指し、手に汗握るバチバチのファイト(?)が繰り広げられようとしていました。

演習は主に4ステップに分かれていました。

クラス図の作成(1時間)
実装(4時間)
リファクタリング(1時間)
機能追加(1時間)

第一工程のクラス図作成では、どのようなクラスが必要になるか、そして各クラスでどのような関数やプロパティが必要になるかを最初の1時間で洗い出し、新卒全員で構想を発表し合いました。

画像1

(今になって見ると欠陥だらけですが、drawioで実際に作ったクラス図です!)

第二工程では実装に着手していきます。そしてここから先はほぼ個人戦です。各々が思い描く最善の方法で、上記のクラス図をもとにコードを書いていきます。想定した挙動になかなかならず、苦戦する状況が続きました。集中していると4時間もあっという間に過ぎて行きました。試行錯誤の甲斐があり、なんとか最終的には全員がブラックジャックを実装することができました!しかしこの演習はここからが本番です。

動くことを目的とした実装工程では可読性や細かい記述形式が疎かになってしまいがちです。そこで第三工程では上記のリーダブルコードで得た知見をもとに、一歩退いた視点で改めて自分のコードを振り返るリファクタリングを行いました。

その際に主に意識した観点は以下の通りです。

・意図が伝わりやすい変数名になっているか
関数の分離は適度なサイズになっているか
・変数や引数のは指定されているか

最初から完璧なコードを書くことは困難ですが、リファクタリングしたことで、修正のしやすい状態にすることができました!

そこで最終工程では新規機能を追加しました。プレイヤーの場合、ブラックジャック(21点ぴったり)を目指せるように点数計算の処理を追加しました。各々奮闘しましたが、時間内に上記の機能を追加し終えることができたメンバーは1人という結果に......!機能追加の難易度をひしひしと感じました。

そしてタイムアップとなり、この日の演習のために用意していたGitのブランチで各自PullRequestを作成して終了です。後日先輩からPullRequestに対してレビューをもらい、更なる改善点を知ることができました。

設計と実装、リファクタリングと新規機能追加まで一通り実施することができ、非常に濃密な一日となりました。

3: 最後に

PHP研修は基本的に周囲の新卒のメンバーとチームを組んでインプットやアウトプットを繰り返していきます。よって一人で学習するより、周りの人とのコミュニケーションの中で新しい発見を見つけたり、自分の学びを確かなものに磨きあげることができます。

ラーニングピラミッド」という単語を聞いたことがある方はいるでしょうか?

スクリーンショット 2021-05-28 17.19.04

この説によると、講義や読書など受動的な学びでは知識の定着が3割にも達しません。逆にグループディスカッションや仲間に教える能動的学習を通じて、その定着率をより高くまで引き上げることができます。

またコドモンは企業としての文化に一貫性があり、集まるメンバー同士で自然と気が合うことが多いと感じています。

ちょうど多過ぎず少な過ぎない5人という新卒の仲間と共に、インプットとアウトプットを通じて切磋琢磨しながら成長できる環境があります。このコドモンの環境に少しでもご興味を持っていただけたら他の記事もぜひご覧ください!😄