エンジニアの新卒研修を受けた学びと感想
はじめまして。2021年4月に入社したエンジニアの齊藤初輝です。
今回はラクーンの新卒研修を受けた学びと感想について書きたいと思います。
新卒研修が作られた背景や研修のゴールなどは以下の記事をご覧ください。
ゼロから始める新人エンジニア研修
入社のきっかけ
ラクーンへの入社を決断した1番の理由は、人が良かったからです。
ラクーンを知ったきっかけはエンジニア限定の逆求人イベントでした。
スライドを使って自己紹介し、お笑い鑑賞が趣味でおすすめのお笑い芸人さんの動画を紹介していました。
後日行った1次面接で動画の内容について話ができました。
正直見なくてもいい動画だったと思います。でもちゃんと見てくれていた。
ここなら自分もちゃんと見てもらえると思い、入社を決めました。
新卒全体研修
4月から技術職・総合職も含めた全体研修が始まりました。
全体研修はリモートでしたがマナー等の社会人に必要とされる力を学ぶ内容でした。(就活みたい)
そのほか、毎年実習を含めたIT研修を行っています。ウェブサービスを提供している会社として、カスタマー業務やサービスの改善のため、基本的な知識を備えておこうという目的です。
全体研修スケジュール
実習のページ作成研修では以下のようなページを実際に作ってもらいます。
全体研修が終わるといよいよエンジニアの新卒研修がスタートします。毎年5月中旬ごろから始まり、夏が終わる頃まで行われます。
期間が曖昧であるのは新卒者それぞれの進捗の違いや理解度に差があるからです。
そのため、新卒者それぞれの理解度に合うようにメンターが研修をカスタムしてくれています。
エンジニアの新卒研修の概要
この研修には『はばたけエンジニア✨』という名前がつけられています。
この名前にはエンジニアとしてはばたいてほしい!という願いが込められています。
ラクーンのエンジニアの新卒研修は、プログラミング経験があることが前提として進められます。
そのため、座学はなく、手を動かして学ぶ研修となっています。座学がない分、わからないところがでてくると思います。その際はメンターに質問をし、アドバイスをもとに自分で調べて理解していきます。
研修の趣旨
ラクーンでのシステム開発に必要な技術を学ぶことを目的としています。
ラクーンにはスーパーデリバリーというサービスがあります。これは卸販売したい商品をサイトに掲載し、それらの商品を求める事業者が仕入れをするECサービスです。
研修はこのスーパーデリバリーの開発に近い内容となっています。スーパーデリバリーの開発ではJavaを使用しています。そのため、研修でもJavaを使ったシステム開発のやり方を学びます。
フォロー体制
去年
新卒研修には同じユニットの先輩社員がメンターとして1on1でついていました。
教育はラクーンの重要な社風の1つと弊社社長が申しています。そのため、1on1でフォロー体制がしっかりしています。
メリットは
・同じユニットなので、話す機会が多くコミュニケーションが築きやすい。(ラクーンは3~5人程度のユニット制)
・1on1なので学びの深堀ができる。
などがあります。
そのほか、ブラザー制度というものがあります。
新卒者1人につき1人、同じ部署の先輩社員をブラザーと見立てます。ブラザーは業務や社会生活におけるサポートをします。
今年
初の試みで自分を含めた2年目のエンジニアが新卒研修系のメンターをしていました。
他に、シニアエンジニア1名がメンターのサポートをしてくれていました。
研修カリキュラム
研修課題は大きく4つあります。
- Servlet・JSPで会員登録機能の作成
- Servletの基礎
- HTTPの基礎
- OracleDBの基礎
- Eclipse上での開発フローに慣れる
- 仕様を確認する
- 単体テスト
- Spring・JSPで同様に会員登録機能の作成
- ログ出力(SLF4J)
- DB接続にコネクションプールを利用
- MVCモデルでの設計
- 例外処理
- 都道府県リストをDBから取得
- バリデーションをコントローラから外だし
- フィルタでのアクセスログの記録
- JavaScriptでのバリデーション
- CSSでステキな入力フォームへ
- JUnitでテストコードを記述
- SpringBootを使ってバッチ処理の作成
- SpringBootの基礎
- バッチの作成方法
- SMTP、MIME
- メール送信の仕組みとテストで細心の注意を払うこと
- Linuxの基本操作とパッケージ管理
- 仮想環境、Dockerの概要
- コンテナ内での操作をマスターする
- パッケージにビルド
- トランザクション
- MySQLを使って商品一覧システムの作成
- IaC
- DockerFile
- Docker Compose
- ポートフォワーディング
- MySQL
- 複数データソース(Multiple Data Source)の利用
- ページング
- Responsive Web Design(RWD)
- キャッシング
- DBキャッシュ
- HTTPキャッシュ
- ライブラリの検討・選択
- REST API
- クライアントサイドレンダリングとサーバサイドレンダリングの違い
- 非同期通信
- 設計をMVCにしたことにより、サーバサイドの変更が抑えられること
スーパーデリバリーに近い研修ともあり、会員登録や、商品一覧機能の作成などが研修の中に存在しています。
研修のカリキュラムは1つずつステップアップしてシステム開発を学ぶ内容となっています。
課題1では初めにフレームワークを使わずに実装しますが、課題2ではフレームワークを使うようになるなどシステム開発の根本から応用まで学べる内容となっています。
研修フロー
- 課題が渡される
- 要件定義
- 実装
- レビュー
- レビュー後実装
- 単体テスト
- QA(Quality Assurance)
- 完了!振り返り
このフローはラクーンの開発のフローと同じです。研修も同じフローで進みます。
研修フローを課題ごとに実施し、4つの課題すべてを終えるとエンジニアの新卒研修が終了となります。
研修の様子
勤務形態
リモートと出社を分けながら研修を進めています。
リモートではSlackやZoomを使って質問をしたり、コミュニケーションを取っています。
研修スタート!
先ほどの研修フロー通りに紹介しようと思います。
まず、課題が渡されます。課題の資料はGitLabのREADMEにあるため、初めにGitLabのキーペアの設定をする必要があります。
キーペアの設定後、課題をCloneします。
新卒者は課題内容をよく読み進めていきます。1つ目の課題の1章目だけはメンターと一緒に進めます。初めの環境構築からHello Worldまでがメンターと実施する課題の内容です。
要件定義
課題内容には最小限の要件が書いてあります。
例えば、課題には会員情報の登録処理を作ろうというパートがありました。
このパートは名前、メールアドレス、都道府県、開発環境は指定されていました。そのほかは特に指定はありません。
そのため、初めにどこまで会員登録の機能を作りこむかをある程度決める必要があります。
基本的には弊社のサービスを想定されていますが、どんなシステムを想定し、どういう人が使うのかをメンターと話し合ってから手を動かさないといけません。要件が決まればメモをとり、まとめます。
自分は要件定義をきっちりできていませんでした。なんとなくで作り始めてここをどうすればいいかとメンターに聞くことが多く、手戻りが発生していました。
実務も要件が毎回きっちりと決まっているわけではないため、要件定義が研修の課題の一つとなっています。
実装
要件が決まれば実装を進めていきます。
実装でわからない箇所があればメンターに質問をします。(リモートの際はSlackで、出社の際は直接質問をしています。)
レビュー
目的は品質の高いコードを書くためのノウハウの共有や、コードのミスを見つけるためです。
レビューの時間は1時間です。新卒者は要件定義をまとめた資料とコードをメンターに見せて説明します。
気付いた点をメンターがレビューするので、修正が必要であれば新卒者がメモを取ります。
レビューで指摘された内容を新卒者は修正します。
単体テスト
レビュー後の指摘対応が終われば単体テストを実施します。
試験内容と期待結果を書いた仕様書を作り、テストを実施します。
バグがあればバグを修正し、再度テストをする。テストがすべて通ると単体テストは終わりです。
QA
単体テストが終われば、新卒者はSlackで以下の4点を記載し、メンターにQA依頼をします。
- QA対象の課題の番号
- 作業ブランチ名
- 要件定義のメモのURL
- gitのレポジトリのURL
新卒者はQAが終わるまで次の課題の内容を確認します。
メンターはQAが終わると、指摘内容をまとめて新卒者にテキストで返します。
新卒者は指摘内容を読み、修正します。
修正がすべて終われば先ほどと同様の手順でメンターに再度QA依頼をします。
指摘がなくなるまで修正->QA依頼を繰り返します。
完了と振り返り
課題が終わるごとに振り返りをします。
課題を通してよかったこと、よくなかったことを反省して次の課題に活かします。
新卒研修の振り返り方法
振り返りでは学んだ内容をKPT(Keep Problem Try)で実施しています。KPTとは?実施のタイミングは1日の終わりと金曜日、研修課題が終わったときです。1日の終わりにはメンターと2人でその日を振り返る目的でKPTをしています。金曜日はメンターと新卒者全員でKPTをしています。
このようにKPTを個人でするのと全体でする理由は個人では自分自身の振り返りと収束思考、全体では発散思考学んだことの共有を目的としているからです。
課題が終わったときの振り返りはその課題を進めることで得たことをKPTで振り返っています。
研修以外の学び
研修をする中で足りない知識が必ずでてきます。その際はメンターからおすすめの本を紹介していただくことがありました。
また、技術以外の必要な業務知識が記載されている本の紹介などもありました。
Slackで#timesチャンネルを作り、その日のふとした悩みなどをつぶやくと弊社のエンジニア全員をメンターとして召喚できます。
研修以外でも学びの環境はあり、特に社内の勉強会は活発なため、勉強会で得たことを研修に活かせる機会が何度もありました。
直撃!同期に聞いてみた(研修を振り返ってみて)
難しかったところ・辛かったところ
山下
一番辛かったのは初めの課題でJavaが意味わからなすぎて、全く実装が進まなかったときです。
その時、メンターに「エンジニアとして輝けないかもしれません。。。」と冗談交じりに言ったらメンターから「そんなすぐに輝けるならその輝きに価値は薄いよ」と元気づけてもらいました。
※はばたけエンジニアの中にかがやけエンジニアという技術課題が存在する。
平尾
開発環境のDocker化が特に難しかったですね。
研修の初期はホストOSに直接ソフトウェアをダウンロードして環境構築をしますが、研修の後半では開発環境をDockerで立ち上げられるようにします。
インフラの領域をあまり知らないこととUNIXライクなOSをCLIで触る経験が少なかったので苦戦しました。
この困難を乗り越えたことによって成長につながったと感じています。
よかったところ
山下
要件定義のやり方から始まり、テストコードの書き方まで一通り経験させてもらえました。
作って終わりではなくメンターにしっかりQAしてもらえたのがありがたかったです。
一番初めの課題のQA指摘は60個近くあり、メンターにXSSを仕掛けられました。
これまで考えていなかったセキュリティ対策について考えるいいきっかけになりました。
また、メンターにはコードの書き方だけではなく、「技術選定をするときに大事なこと」などプログラマーとしての考え方も教えてもらえました。
自分はメンターにその時々の自分の課題やレベルに応じて、様々な本を紹介してもらえました。
ある程度、SQLが触れるようになったら「SQLアンチパターン」だったり、「Javaで学ぶアンチパターン」であったり。
自分では選んで読むことがなかった本だと思うのでありがたいです。
平尾
開発フローを疑似的に経験し、現場にキャッチアップするための基礎力をゼロから身に着けることができました。
入社前にはあまり意識しなかった要件定義と品質管理を学べたことは特に刺激的でした。
また技術的なことだけでなく、開発者として求められていることや案件のすすめ方をメンターから教えてもらえたことが嬉しかったです。
先輩開発者の力を借り、基礎力も身に着けることができことができるのは会社ならではかなと思います。
研修を受けて学んだこと・感想
プログラムを書く力
まず、単純にプログラムを書く力がついたと思います。定期的にコードを書く時間が増えたのもありますが、研修自体が手を動かすことが多かったのが要因の一つだと思います。書いたコードに対するレビュー、コードの修正、エラーが出たらデバッグしたり、ログを見る。研修を通して行った、こういった地道なことの繰り返しが成長を促してくれました。
また、自分が書いたコードはすべて理解しておく必要があることを学びました。曖昧な理解の実装箇所があるせいでエラーの原因を特定できないことが何度かありました。
今はよりプログラミング能力をあげるために、競技プログラミングに取り組んでおり、テストケースのあげかたなど研修で習った部分が活かせているなと感じます。
一次情報にあたる
調べる力がついたと思います。理由は一次情報にあたるようになったからです。なかなか公式のドキュメントを読む際は苦労することが多いと思います。しかし、研修を受ける中でレビューの際に、『公式のドキュメントに書いてあるよ』などの助言をいただく機会が多く、結局は一次情報を頑張って読むことが一番の近道であると実感しました。公式のドキュメントを読むために必要な知識がなく、ドキュメントを読むことが難しく感じる場合はGetting Startedだけでも読むようにする。これだけでも意識的な部分で変わってくると思います。Spring BootのGetting Started
質問の仕方
質問は質問テンプレートに沿うように書いていました。
↓質問テンプレート↓
どの課題をやっているか(Where)
バックログの課題キーと件名 【例】 課題1.1何が問題か(What)
Cronで実行するためにjarにビルドして実行したところ、下記のエラーが発生した。
Error: Could not find or load main class jp.ne.raccoon.runway.MemberJudgeApplication Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/CommandLineRunnerいつ発生しているか(When)
EclipseでProjectのExportからビルドしたjarをDockerで実行したとき。
どこが問題だと考えているか(Who)
jarの実行時のオプションにクラスパスを指定できるので、指定が漏れているから?なぜここが問題だと考えたか?(Why)
NoClassDefFoundErrorで検索して、下記のサイトにクラスパスを指定するように書いてあったので。
http://example.com/hoge/fugaどのように解決しようと試したか(How)
クラスパスを指定しようとしたが、何をクラスパスに指定していいかわからない。
このテンプレートを書いてよかったことは文字に書くことで頭の整理につながったことです。何がわかってて、どこまで試して、どこら辺に原因がありそうなどを明確にすることで時間はかかりますが自分で考えるという観点では非常によかったです。
研修でもプログラムを書くことで詰まったら日本語でやりたい処理を言葉にして書いてみるといいとアドバイスを得ました。言葉でプログラムの流れを整理できるとだいたいは実装に落とし込めることがほとんどなので、悩んだら文字にしてみるはよくやっています。
ユーザがいるサービス
入社前、自分は動くものならある程度作ることができると思っていましたが全然でした。
研修では実務同様、ユーザを想定した機会が何度もありました。例えば、要件定義やバグのない実装をする、テストをすべて通す、XSSなどセキュリティ面の考慮をする、排他制御、基本的なUI(バリデーションメッセージ、ボタンの配置)などです。
個人でプログラムしているレベルだとユーザに使ってもらうサービスを作ることがなく、この動作はできるといった単一的な部分でしか考えられていませんでした。研修を通してこういったユーザへの配慮やサービスとしての責任が不足していることがわかりました。
このように研修で学ぶことは多く、新卒研修ではシステム開発のスキルを実務に入れるレベルまで引き上げもらいました。
プロのエンジニアになるための壁を一つ乗り越えた気がします。
今後の個人目標
自分は自分が今いる環境をよくしたいと思う気持ちがあります。
そのためには自分が行動をする必要があります。
一歩踏み出すことを恐れずにいきたいです。
このブログもラクーンでの最初の1歩だと思っています。
技術面の目標は実務課題を効率的、効果的に解決できるようになりたいと思っています。
研修を終えて入社時よりも力はついたのですが、実務の課題は研修とは違った難しさがあります。
原因の特定から対策案を考え、実装に落とし込む。こういったプロセスが研修との違いであり、これから学ぶ必要があると感じています。
まとめ
以上新卒研修を受けた感想でした。
今年も4人のエンジニアがはばたきます!はばたけエンジニアという新卒研修の名前のように
これからプロのエンジニアとしてはばたきたいと思います。
最後にラクーングループは一緒に働く仲間を絶賛大募集中です!
新卒の方、手厚い研修でエンジニアとして長く働くための土台を築き、本配属後に活躍しませんか?
中途の方も少しでも興味を持っていただけたら是非こちらからエントリーお待ちしています!