私からあなたへ 一人前のJavaエンジニアになるためのロードマップを送ろう

# 内容
以下記載のURLを参考にロードマップをJavaバージョンにしてみた。
初心者から立派なJava エンジニアになる方への学習の道しるべになれば。

また自分自身すべてできるわけではないので、できるようにするためのメモ書きとして。
（ただ以下をなんとなく理解するだけで2,3年以上かかった。。。）

# 参考
https://github.com/kamranahmedse/developer-roadmap

**※　会社の同期から基本文法についてレベル別記載のアドバイスをいただいたので修正（2018/4/9）**

# ロードマップ

![New Wireframe 2 (29).png](https://qiita-image-store.s3.amazonaws.com/0/230829/16d890e9-ebae-14b2-ae31-cd911df9d8fb.png)


# 学習方法

## 1.Hello World

どのプログラミング言語でもそうですが、まずは動かし方を学びましょう。
ゲシュタルト崩壊するくらいHello Worldは書きましょう。
最初のうちはstatic void mainの意味も分からなくて大丈夫です。徐々に理解できるはずです。

## 2.基本を学ぶ

以下のサイトや書籍を使用してプログラミングの基礎を知りましょう。
文法の書き方やメソッドの使い方、アクセス修飾子など覚えることはいっぱいあります。
会社の研修でも以下の部分は習うと思いますが、聞いただけでは忘れるので繰り返し手を動かして覚えましょう。
十分にマスターできたらJava Silverを受けるのもよいでしょう。

▼　Webサイト
ドットインストール Java入門（有料）：https://dotinstall.com/lessons/basic_java_v2
Paiza Java入門（一部無料）：https://paiza.jp/works/java/primer
schoo：https://schoo.jp/route/27
Progate：https://prog-8.com/languages/java
udemy（キャンペーン中割引）：https://www.udemy.com/manga-java/

▼　書籍
レベル：BronzeからSilverくらい
[スッキリわかるjava入門](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1-%E6%B8%85%E5%96%AC/dp/484433638X/ref=sr_1_1?ie=UTF8&qid=1523104343&sr=8-1&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B+java%E5%85%A5%E9%96%80)
[やさしいJava 第6版](https://www.amazon.co.jp/%E3%82%84%E3%81%95%E3%81%97%E3%81%84Java-%E7%AC%AC6%E7%89%88-%E3%80%8C%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E3%80%8D%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%AB%98%E6%A9%8B-%E9%BA%BB%E5%A5%88/dp/4797388269/ref=sr_1_1?ie=UTF8&qid=1523275532&sr=8-1&keywords=%E3%82%84%E3%81%95%E3%81%97%E3%81%84+java)
レベル：SilverからGoldくらい
[Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで](https://www.amazon.co.jp/Java%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80-%E3%83%A2%E3%83%80%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%83%BB%E5%AE%9F%E7%94%A8%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%BE%E3%81%A7-%E8%B0%B7%E6%9C%AC-%E5%BF%83/dp/477418909X/ref=pd_sim_14_10?_encoding=UTF8&psc=1&refRID=KJR3B8760NAVKYWFYBN3)
[スッキリわかる Java入門 実践編 ](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B-Java%E5%85%A5%E9%96%80-%E5%AE%9F%E8%B7%B5%E7%B7%A8-%E7%AC%AC2%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4844336770/ref=sr_1_2?ie=UTF8&qid=1523275711&sr=8-2&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8Bjava%E5%85%A5%E9%96%80)

### IDEを使いこなす

エンジニアはいかにスピーディに効率よくプログラムを書くかは重要になってきます。
そのためにIDE（開発ツール）を活用しましょう。予測変換機能やショットカートキーを覚えたり、
便利なプラグインを入れたりしてどうやれば効率よく作業できるか考えてみましょう。
先輩や周りの人におすすめのIDEやショットカートキーを教えてくれと聞くのもよいでしょう。
その人のこだわりが見えてくるはずです。そこから自分にあったものを選びましょう。
またJavaは他の言語と比べて比較的に簡単にデバックができます。System.out.printからの確認は早々に捨てましょう。

## 3.プロジェクト管理を学ぶ

Javaのライブラリを効率よく管理できビルドを簡単にしてくれるプロジェクト管理ツールについてマスターしましょう。
有名どころはMavenとGradleです。はやりを行くのならGradleがよいでしょう。

▼　Webサイト
Qiitaの記事：https://qiita.com/tarosa0001/items/e5667cfa857529900216
▼　書籍
[Javaビルドツール入門 Maven/Gradle/SBT/Bazel対応](https://www.amazon.co.jp/Java%E3%83%93%E3%83%AB%E3%83%89%E3%83%84%E3%83%BC%E3%83%AB%E5%85%A5%E9%96%80-Maven-Gradle-SBT-Bazel%E5%AF%BE%E5%BF%9C/dp/4798049387/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=QCEC0G6GN2FWHY4CHZ1Q)

## 4.標準＆ベストプラクティスを学ぶ

いままで書いたソースを改めて見直しましょう。他人に見られてもよいコードを書くために、まずはコーディング規約を読みましょう。
全部覚える必要はないですが有名どころは押さえておきましょう。業界の掟になっておりコードレビュー時に突っ込まれます。またデザインパターンはいろいろあり全部覚える必要はないのですが、GoFの基本的な考え方については理解しておくとよいでしょう。

▼　Webサイト
GoogleのJavaコーディング規約：https://google.github.io/styleguide/javaguide.html
GoogleのJavaコーディング規約日本語訳：https://kazurof.github.io/GoogleJavaStyle-ja/
サルでもわかる 逆引きデザインパターン ：http://www.nulab.co.jp/designPatterns/designPatterns1/designPatterns1-1.html
Githubにあるデザインパターン一覧: https://github.com/iluwatar/java-design-patterns

▼　書籍
[実践Javaコーディング作法](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Java%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E4%BD%9C%E6%B3%95-%E6%A3%AE%E5%B4%8E-%E9%9B%85%E7%A8%94-ebook/dp/B0185E10ZQ/ref=sr_1_2?s=digital-text&ie=UTF8&qid=1523143533&sr=1-2&keywords=%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E4%BD%9C%E6%B3%95)
[増補改訂版Java言語で学ぶデザインパターン入門](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=sr_1_1?s=books&ie=UTF8&qid=1523105664&sr=1-1&keywords=%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
[EFFECTIVE JAVA 第2版](https://www.amazon.co.jp/EFFECTIVE-JAVA-Java-Joshua-Bloch/dp/4621066056)
※英語で第3版が出ているのでもうすぐ日本語もでるかな？

## 5.他人のソースを読む＆ライブラリを学ぶ

GitHubには様々なJavaのライブラリのソースコードが公開されています。他人が書いたコードを読み自分の知識にしていくとよいでしょう。
また今流行している技術について知ることができるでしょう。それに併せてGitの使い方（チェックアウトやブランチ）について学ぶとよいでしょう。
既存のプロジェクトにプルリクエストをだしライブラリに変更を加えられると尚よいでしょう。
▼　Webサイト
Github: https://github.com/trending/java
Qiitaの記事：https://qiita.com/haruto167/items/162551100449ea5c7e6d
Git入門：https://backlog.com/ja/git-tutorial/

## 6.テストコードを学ぶ

より品質のよいコードを書くためにJunitやMockでテストコードをかけるようにしましょう。
また開発手法としてTDDを押さえておきましょう。red→green→refactorを繰り返せば質のよいコードが書けるはずです。

▼　Webサイト
Junitを使ったjavaのテスト入門：https://www.slideshare.net/SatoshiKubo1/junitjava
▼　書籍
[JUnit実践入門 ~体系的に学ぶユニットテストの技法](
https://www.amazon.co.jp/JUnit%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E6%8A%80%E6%B3%95-WEB-PRESS-plus/dp/477415377X/ref=sr_1_1?ie=UTF8&qid=1523143884&sr=8-1&keywords=Junit)

## 7.カバレッジを意識したテストコードを書く

テストコードからソースコードのカバレッジ(網羅率)を把握して、品質をより向上させよう。

▼　Webサイト
JaCoCoでJavaのコードカバレッジレポートを作る：https://ishiis.net/2016/10/13/jacoco-coverage/
EclEmma（JaCoCoを内包、Eclipseプラグイン）：http://www.eclemma.org/jacoco/

## 8.RDBを学ぶ

好きなDBを選びダウンロード＆操作しましょう。
繰り返し繰り返しSQLを書き、DDL&DMLの書き方をマスターしましょう。
またORMを学べばJavaからDBを簡単に操作することができるでしょう。
▼　Webサイト
ドットインストール PostgreSQL入門（無料）：https://dotinstall.com/lessons/basic_postgresql
ドットインストール MySQL入門（有料）：https://dotinstall.com/lessons/basic_mysql_v3
Java O/Rマッパー特集：http://d.hatena.ne.jp/torutk/20170726/p1
▼　書籍
[スッキリわかる SQL 入門 ドリル215問付き! (スッキリシリーズ)](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B-SQL-%E5%85%A5%E9%96%80-%E3%83%89%E3%83%AA%E3%83%AB215%E5%95%8F%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4844333933/ref=sr_1_1?s=books&ie=UTF8&qid=1523144222&sr=1-1&keywords=SQL)

## 9.フレームワークを学ぶ

フレームワークを学びより効率的にソースコードをかけるよう学習しましょう。
私自身はSpringをおすすめし、以下の書籍は非常によりフレームワークの入門書です。
フレームワークは１つ１つの特性が色濃く出ます。Strutsを覚えたからといってSpringが使えるようになりません。
なので自分にあったものを選びましょう。
またフレームワークは廃り流行りが早いです。一昔前まではStruts→Seasarと人気でしたが今では脆弱性が問題視されたり、EOL(End of Life)になっているので常に最新の動向をチェックするとよいでしょう。

▼　書籍
[はじめてのSpring Boot―スプリング・フレームワークで簡単Javaアプリ開発 ](
https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AESpring-Boot%E2%80%95%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A7%E7%B0%A1%E5%8D%98Java%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-I%E3%83%BB-BOOKS-%E4%BF%8A%E6%98%8E/dp/4777519694/ref=sr_1_3?s=books&ie=UTF8&qid=1523144527&sr=1-3&keywords=spring+framework)

## 10.よく使う機能を作ってみる

Javaのフレームワークを学べばWebページが簡単に作れるはずです。
ブログのようなサイト、「CRUD」（作成・参照・更新・削除機能）やログイン機能を実装してみましょう。またそれに合わせてテンプレートエンジンを学習すればより効率的に開発できるはずです。

## 11.Webテストを学ぶ

Webサイトが作れたらテストをしますが、その作業は自動化すれば効率的に終わる場合があります。
ブラウザの自動化ツールについて知っておきましょう。また高負荷がかかった場合、どの程度サイトが持つのか検証が必要です。
高負荷をかけるツールを試してみましょう。

▼　書籍
[Selenium実践入門 ―― 自動化による継続的なブラウザテスト](https://www.amazon.co.jp/Selenium%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%AB%E3%82%88%E3%82%8B%E7%B6%99%E7%B6%9A%E7%9A%84%E3%81%AA%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%86%E3%82%B9%E3%83%88-WEB-PRESS-plus/dp/4774178942)

## 12.NoSQLを学ぶ

名前の通りSQLで操作しないDBについて学びましょう。
RDBと比べて何が便利になって何が不便になるか比較しながら操作するとよいでしょう。
RDBとNOSQLの比較例）項目追加はどうか？排他制御はできるか？パフォーマンスはどうか？等
▼　Webサイト
ドットインストール Mongo入門（無料）：https://dotinstall.com/lessons/basic_mongodb_v3

## 13.キャッシュを学ぶ

学習中

## 14.Rest APIを学ぶ

Rest APIとは何か、JavaでRest APIを実装するにはどうするかを学びましょう。
今まで学んできたフロント（静的なページ）とバック（動的なページ）の役割について、新しい気づきをあたえてくれるでしょう。またRestFulAPIはRDBのようにデータについて定義されていないため、自由に定義を変更することができますが、Swaggerを利用しデータについて定義すればより使いやすくなります。

▼　書籍
[はじめてのSpring Boot―スプリング・フレームワークで簡単Javaアプリ開発](
https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AESpring-Boot%E2%80%95%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A7%E7%B0%A1%E5%8D%98Java%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-I%E3%83%BB-BOOKS-%E4%BF%8A%E6%98%8E/dp/4777519694/ref=sr_1_3?s=books&ie=UTF8&qid=1523144527&sr=1-3&keywords=spring+framework) (実装方法のみ)

## 15.認証を学ぶ

サイトにアクセスする際、セキュリティチェックを行う必要があります。
そのための仕組み（Basic、トークン等）を理解し、それぞれのメリット・デメリットを理解した上で認証機能を実装してみましょう。
たいていフレームワークの中に認証のメソッドがあります。
例）Spring→Spring Security、play→play.libs.OAuth2,AdminAction

## 16.セキュリティを学ぶ

基本的なセキュリティ（SQLインジェクション）などを学ぼう。また脆弱性チェックツールを使って診断するのも１つの手。
OWASPの基本のトップ10を押さえておくのがよいかと。

▼　Webサイト
OWASP：https://www.owasp.org/images/2/23/OWASP_Top_10-2017%28ja%29.pdf

## 17.メッセージングを学ぶ

学習中

## 18.検索エンジンを学ぶ

RDBやNOSQLより複雑な検索を高速に行うのが検索エンジン（全文検索）です。GoogleやYahooも独自の検索エンジンの仕組みがあります。
ここではOSSであるElasticsearch(エラスティックサーチ)を活用してサジェスト機能（予測変換）を実現してみてはどうでしょう。
▼　Webサイト
Qiita:https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329

## 19.Dockerを学ぶ

Javaは「Write once, run anywhere」です。Windows、Mac、LinuxどんなOSでも動きます。
あなた自身で作成した環境が他の環境でも動かせるようDockerのImageを作り自動セットアップ＆起動できるようにしましょう。
また今まで学んだDBも併せてDocker Composeの設定に入れ、自動的にアプリが動かせるようにしましょう。

さらに、JenkinsやCircleCI使えばより楽に環境構築できるはずです。

▼　Webサイト
ドットインストール Docker（無料）：https://dotinstall.com/lessons/basic_docker
▼　書籍
[[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術](
https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-Jenkins%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E2%80%95%E2%80%95%E3%83%93%E3%83%AB%E3%83%89%E3%83%BB%E3%83%86%E3%82%B9%E3%83%88%E3%83%BB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93-PRESS-plus/dp/4774189286/ref=sr_1_1?s=books&ie=UTF8&qid=1523194414&sr=1-1&keywords=Jenkins) 

## 20.Webサーバーを学ぶ

ここまできて今更ですがWebサイトを作成・起動させるとき、Tomcat（Java Servletを動かすためソフト）を使用しているかと思います。
最近のフレームワークはTomcatを内包しているのでTomcatの設定を意識する必要がなくなりましたが、
Tomcatにより、Webサーバが起動し、ポートの設定やアクセスログのJSESSIONIDなどを管理・変更できることを覚えてきましょう。
~~（※昔はTomcatのコンテキスト.xmlやserver.xmlをいろいろ設定する必要がありましたがその時代は終わりを告げたようです）~~

▼　Webサイト
とほほのTomcat入門：http://www.tohoho-web.com/ex/draft/tomcat.htm
Tomcatのサーバ設定：https://thinkit.co.jp/free/article/0708/2/8
Javaの道：http://www.javaroad.jp/opensource/js_tomcat12.htm

## 21.Webソケットを学ぶ

学習中

## 22.GraphQLを学ぶ

学習中

## 23.Graph Databaseを学ぶ

学習中

## 24.BigQueryや機械学習にチャレンジ

学習中


※　学習中について随時更新して記載予定