事始め
新卒研修も終わりに近づき、配属が近くなってきた。 研修を受けて学んだことも多くあったので、忘れないように記事を書こう。 全職種共通研修についてはここではハブらせてもらう。
研修のスケジュール
- Java
- Spring boot
- Server + linux
- 個人での開発
- チームでの開発
Java
Javaで学んだことは、 そうだなー、すべてがクラスだってことかな。慣れてくるとそんなに悪いものでもない気がする。 ただ、マルチスレッド処理の記述方法がほかの言語とは違うからちょっと気を付けた方がいいかもしれない。 ああ、あとすごく勉強になったのはインターフェースだね。インターフェースを使うことでクラスのインターフェースを定義できる。 どういうことかというと、 インターフェースによって、ポリモフィズムを実現できる、という話だ。 ポリモフィズムとは「メッセージが同じでも、それを受け取るオブジェクトによっ て動作が異なること」だからね。 インターフェースを作っておいて、それを実装するクラスを作る、んで、インターフェース名で変数を作っておいて、そこに紐づけるオブジェクトは、 インターフェースを実装したクラス。これによって、例えば、インターフェースを配列で保持して、各要素ごとに同じメソッドで違う処理をさせることができる、っていう話だね。ハイハイ。
Spring boot
ここはいろんなことを学んだね。
- DIという概念
- 単体テストという概念
- WEB開発でのレイヤードアーキテクチャの話。
DIをすることでコンポーネント間の依存関係を疎結合にできる、って話だな。インターフェースを定義しておいて、その実装を注入する。 注入されたコンポーネントを使う側のクラスは、何を注入するかだけを考えればいい。中の実装はどうでもいい。だからテストと本番で切り替えることもできる。
あとは単体テストだね。今までは全く意識してこなかったが、確かに、各メソッドについて簡単な単体テストを書いた方がいいに決まっている、という話だな。
WEB開発でのレイヤードアーキテクチャ。これもだいぶいい学びになった。そうね、UIとAPIに分けて開発するっていうのもめっちゃ勉強になったし、その中でも特にAPIでController + Service + repository + Mapperに分けてやるってのだいぶ勉強になった。これからもこのレイヤーは守って進めていきたいなって感じだな。
server + linux
ここは特に学んだことはないかなーー。でも、SQLのjoinについてはかなり学んだのでjoinとかそのあたりかな、だから改めてページを作ってまとめていきたいよね。あーー、あとはCI/CDについても学んだな。これはだいぶいい学びだった。Jenkinsを学んだね。しかし、Github Actionsの方がよさそうっていう感想。これも改めてまとめたいね。
個人開発
Spring bootの演習でやったことを個人でもう一回やるって感じだった。ただ、Javaを使ってWebシステムを構築する方法がわかったね。
チーム開発演習
これはマジで勉強になった。特にチームでの開発方法、めっちゃ勉強になった。作業分担の仕方だね、 うちのチームではコンポーネントの依存関係を意識してタスクを振ったけど、これが完全にはまったね。横軸を機能、縦軸をそのサービスを実現するためのコンポーネント(Controller, Service, Repository)で見た時、バックエンドは縦の依存関係が圧倒的に強かった。そもそも縦の依存関係は必ず生じるのだけれどもね。一方で、フロントはほかの機能との横断的な依存関係が多かった(それもそうだよね、APIっていう道具を使ってフロントの人は処理するからね)。こういうときはいっそレイヤーごとに担当を分けてしまった方がすっきり行く。特に最上位層はユーザがみるデザインなわけで、そこを一人の人が開発したのはデザインに統一感が出せてむしろ良かったって話だよね、マジで。
あとは、設計と見えるかの重要性かな。とくにMiroを使って、ワイヤー、そしてそれを実現するための機能、その機能を実現するためのコンポーネント、とか、レイヤードアーキテクチャを設計するときの方法、めっちゃ勉強になった。
あとは、タスク管理ツールだね。GithubのProjectを立ててIssue化することができるって話よ。んで、Git + Githubについてもマジでいろんなことを学んだね。チームメンバーでgitに詳しい人がいてね。それもまとめておきたいね。
うちのチームはかなりスピーディーに開発が進んだけど、これはひとえに設計をちゃんとやって、みんなで共有できたから。この開発方法は一生の宝になると思う。しかし、実現方法がわからないものに出会ってしまったらどうやるのかな。空中分解型アジャイルとかやるのかな。
まとめ
- Java : インターフェース、ポリモフィズム
- Spring Boot : DI, 単体テスト、レイヤードアーキテクチャ
- server + linux : CI/CDツール(Jenkins, Github Actions), SQLのjoinやgroup by (個別の記事として出す)
- 個人開発演習:なし
- チーム開発演習:タスクの振り分け方、Miroを使って設計を見えるかすること、タスク管理をgithubですること。 (Gitの使い方として新しい記事を出す)