エンジニアもどきが学びたい（学んだ）技術要素（Java、Web、インフラ...）

# はじめに
*20240812追記　下の記事にロードマップを掲載しています。各フェーズにおける詳細な内容は、この記事で随時加筆訂正していきたいと思います。*

https://qiita.com/ramgap/items/5760421e5255db2e7b14

社内SE3年目のエンジニアもどきが、自身の技術力の無さに不安を感じ、自学したいスキルを書き連ねたものです。
アラフォーなのにまだ３年の経験しかないことが不安なので、仕事以外でも自学するしかないということで書きました。
そもそも何を学ぶべきかと言うところから手探りですが、現在考えていることを綴ります。
もし、同じ境遇の方がいらっしゃれば、何かの参考になれば幸甚です。
この記事は随時更新していきます。
また、今後はこの記事で挙げた技術について学んだことを記事にしていきます。

# 技術要素について
## Java
- JSP&サーブレット
基本的な部分を忘れてきているので、以下の項目については、再度学び直して情報をまとめておきたいです。
    - CRUD操作
    - 認証
    - 認可
    - 検索機能
    - JSTLタグ
    - メッセージプロパティ
    - MVCモデル
    - Entity、DAO、DTOパターン
    - filterクラス
- Spring Framework
現在の環境では、Javaを学ぶことが業務に最も貢献できるはずなので、Javaを軸として学びたいと思っています。JSP・サーブレットでのCRUD操作を行うプログラムはある程度書けるようになったので、次はフレームワークの習得をすべきかと考えて選択しました。Spring MVC、Spring Bootなど。
- Java SE 11 Silver
この資格の勉強を通して、Javaの仕様について知識を深めたいと思っています。ただ、実際に試験を受けるかどうかはまだ検討中です（受験料が高い。。。）。
- JUnit
テスト駆動開発に触れてみたいので、JUnitの使い方を覚えたいです。
- デザインパターン
全てを学ぶには時間がかかりそうですが、よく使いそうな次のパターンは学習しました。今後は、他の言語での実装も試したいです。
    - Singleton
    - Factory Method
    - Strategy
    - Observer
    - Decorator
    - Adapter
    - Facade

## HTML/CSS
- Bootstrap
少しでもモダンな技術に近づくため、習得したいと考えています。Spring Bootでのシステム開発に合わせて学ぶ予定です。
- CSS設計
CSSは何となく敬遠していましたので、概要を勉強しました。あとは実際にスタイルファイルをゴリゴリ書いて身につけていきたいと思います。
https://qiita.com/ramgap/items/1eed53e0556311812678

## Javascript
- 非同期プログラミング
- プロトタイプチェーン
- DOM操作
- モジュールとパッケージ管理
- クロージャ
- 高階関数
- フロントエンドフレームワーク（React）
- テスト（Jest）とデバッグ
    1. Jestの導入
        1. Jestとは何か、その特徴と利点
        1. 環境構築 (Node.js、npm経由でJestのインストール)
        1. 簡単なテストの書き方、テスト実行方法
        1. 公式ドキュメント（Jest Docs）を確認
    1. 基本的なマッチャーを学ぶ
        1. toBe, toEqual, toBeTruthyなどのマッチャーの使い方
        1. 公式のマッチャーリファレンス（Jest Matchers）を参照
        1. 実際にテストを書いてみる（例: 数値や文字列、オブジェクトのテスト）
    1. 非同期コードのテスト
        1. async/awaitやPromisesのテスト方法
        1. doneコールバックの使い方
        1. サンプルコードで非同期テストに挑戦
    1. モック関数とスパイ
        1. Jestのモック機能 (jest.fn(), jest.spyOn())
        1. モック関数を使った依存関係のテスト
        1. 公式ドキュメントのモック関数セクションを参照
    1. 復習・小さなプロジェクト
        1. 内容を振り返り、小さなサンプルアプリケーションのテストを書いてみる
        1. エラーのデバッグを体験
    1. テスト環境のセットアップと設定
        1. Jestの設定ファイル (jest.config.js)を使った設定
        1. testEnvironmentやsetupFilesの使い方
        1. カバレッジレポートの生成 (--coverage)
    1. スナップショットテスト
        1. スナップショットテストとは何か、どのような場面で有効か
        1. Reactコンポーネントなどのスナップショットテストの書き方
        1. スナップショットの更新方法
    1. テストのグループ化とbefore/afterフック
        1. describe, beforeEach, afterEach, beforeAll, afterAllの使い方
        1. 複数のテストケースを効率よく書く方法
    1. モックモジュールのテスト
        1. jest.mock()を使ったモジュールのモック方法
        1. 実際の依存関係を差し替えたテストを書く
    1. カスタムマッチャーの作成
        1. 自作のカスタムマッチャーを作る方法
        1. プロジェクトに合わせた柔軟なテストケースの作成
    1. 実践演習
        これまで学んだことを使って、もう少し大きなアプリケーションのユニットテストを作成
    1. 振り返りと追加学習
        1. 学んだ内容の振り返り、Jestのドキュメントで追加のトピックを調査
        1. 他のテスティングライブラリ（例えば、EnzymeやReact Testing Library）との組み合わせ
Javascriptの基本構文はある程度学んだので、これらの事項を学びました。これらの項目は、ChatGPTで生成しました。今後は小さなアプリから始めて、実際に使えるものをどんどん作っていきたいです。
https://qiita.com/ramgap/items/5707029dc69132f139e2
- 50projects50days
https://github.com/bradtraversy/50projects50days
小さなプロジェクトをたくさん作って、手に染み込ませたいので、上記サイトから学びます。

## Python
おそらく業務で使うことはない（あってもだいぶ先と思います。）のですが、機械学習やデータ分析関連では必須の言語ですし、スクリプト言語を一つは習得したいです。今後、何を軸として学んで行くかブレイクダウンしていきます。

## Git
現在はsvnでバージョン管理もどきをしているのですが、その利用法すら正しいかどうかわからない状態です。それならばいっそ、一歩進んでGitを学ぼうという狙いです。

## インフラ関係
- サーバー（ハードウェア・ミドルウェア）
サーバーに必要な性能がどれくらいなのかもほとんど知らない状態です。。。CPU、メインメモリ、ストレージ、NIC、電源、冗長化に必要なものなど、道のりは長いです。。。また、DBスペシャリストは何とか取得しておりますが、クエリの実行計画や、チューニング、インデックスなどの部分はほぼ無知の状態です。さらに学んでいきたいと思います。
- ネットワーク
ネットワークについてはかなり苦手です。基礎事項を学ぶため、ネットワークスペシャリスト試験を受けましたが、今まで２回不合格となっております。。。自宅でどうにか学べないか思案中です。（ラズベリーパイとスイッチを購入してネットワークを作るとか。）
- DebOps
職場では、テスト、ビルド、デプロイまでを手動でやっているため、テストやCI/CDツールについて学びたいです。
- クラウド（AWS）
おそらく業務では利用しないのですが、今やIT業界でクラウドに全く関わらないことはないので、長い目で学んでいきたいと思います。

## セキュリティ
セキュリティ関係もかなり弱いため、一部ネットワークスペシャリストなどにもかかってくるのでじわりじわりと詳しくなっていき、その後、集中的に学習する機会を設けたいです。

## アウトプット、人的ネットワーク構築
- Github
GitHubは、学んだ成果を公開する機会として。
- Qiita
学んだ内容をまとめ、共有したりフィードバックを貰いながら、交流をしたいです。
- Paiza
- OSSへの参加
- 勉強会などへの参加
- エンジニアの方との交流

# 計画
## 直近（〜3ヶ月）
- Java
    - JSP&サーブレット【一旦完了】
    - Spring Framework【一旦完了】
    - Java SE 11 Silver
    - JUnit【一旦完了】
    - デザインパターン【一旦完了】
    - 小さなプロジェクトの作成【いくつか作成したので一旦完了。機を見てさらに作成する。】
- HTML/CSS
    - CSS設計【一旦完了】
    - Bootstrap【一旦完了】
- Javascript
    - 基礎的事項【一旦完了】
    - React【一旦完了】
    - Jest【一旦完了】
    - 50projects50days
- Paiza（Java, Javascript）【現在B】
- 学んだことをQiitaでアウトプット【随時アウトプット中】
業務に最も関わる領域のため。
## 短期（〜1年）
- サーバー関係
- ネットワーク
- セキュリティ
- Python
## 中期（〜3年）
- 人的ネットワーク構築
- DevOps
- クラウド
## 長期（3年〜）
- スペシャリストorマネージャーの検討