以前、Javaはまだまだ学ぶ価値があるプログラミング言語だと申し上げました。
-
Javaがオワコンではなく学ぶ価値がある8つの理由
Javaというプログラミング言語は常に人気ランキングの上位にいるのに、IT業界で働いている人から 「いまさらJavaなんてやめた方がいいよ」 なんて意見を耳にしたかもしれません。 僕は外資系のIT企業 ...
続きを見る
しかしどこから手をつけたらわからないという方も多いと思うので、今回は僕自身の経験に基づいた、最速でJavaのエンジニアになるためのロードマップを考えてみました。
Javaの基本
まずはJavaの基本的な文法や使い方を学びましょう。
プログラミング自体が初めてという場合は、この段階においては、書籍だけでなくオンラインコースやスクールなどを活用するのがベストだと思います。
この段階で身につけること
- 単純なプログラムの書き方
- コンパイルと実行の仕方
- 基本的なAPIの使い方(DateTime、Collectionなど)
- ループや条件分岐などの文法
ここでのポイントは、あまり細部に深く入り込まないことです。この段階では教材に従ってそこに出てきたことだけにフォーカスしましょう。
Javaには豊富なAPIがありますが、使用頻度がそこまで高くないものも多く、必要な時に調べれば済むものも多くあります。
【 5日でできる】はじめての Java プログラミング入門
IDE
Javaでプログラミングを行うときは、学習中であっても必ずIDE(統合開発環境)を使って、IDEの使い方に慣れ親しみましょう。
「プログラミングはテキストエディタで」なんて意見もありますが、ことJavaに関してはそのアドバイスは無視してください。ガスコンロがあるのに毎回自分で火を起こすようなものです。
IDEはプログラムのエラーを検知して解決策を教えてくれたり、よりよいコーディングの方法を提案したり、デバッグを支援したりとさまざまな機能がついています。
JavaにおいてはEclipseがシェアナンバーワンで無料で使えますが、僕はIntelliJ IDEAというIDEをオススメします。IntelliJは最初こそとっつくにくい印象を受けますが、慣れると手になじんで最高の開発環境となってくれます。僕は長いことEclipseを使っていましたが、IntelliJに乗り換えてからコードの品質も効率も大きく改善したと感じているので、早いうちから使っておけばよかったと後悔しています。
完全機能版は有償ですが買う価値は十分すぎるほどあります。とはいえ無償版でもかなりのことができてしまうので、まずは無償版を使ってみるといいでしょう。同僚の開発者は無償版を使っていますが別に不便もないようで、無償版でしっかりとしたコードを書いています。
https://www.jetbrains.com/ja-jp/idea/
この段階で身につけること
- IDEでソースコードを編集、ビルド、実行する方法
- 検索、移動、エラーの確認方法など基本的な使い方
ここでも必要なことにだけフォーカスしましょう。IDEは機能が盛り沢山すぎて圧倒されますが、全部覚えようとすると罠にはまってしまいます。どんな機能があるのかをざっと知っておき、あとは必要になってから覚えるようにしましょう。
Maven
プログラミングをするということは、書いたプログラムを実行可能な形式にコンパイルしたり、依存するライブラリや設定ファイルをまとめてパッケージ化したりという作業が必ず必要になります。
そのような作業は煩雑な上にコードを修正するたびに繰り返し発生するので、ビルドツールを使って自動化します。
JavaにおいてはMaven(メイブン)というビルドツールがデファクトスタンダードとなっています。プログラミングはいろんな外部ライブラリを組み合わせて開発することがほとんどですが、Mavenはライブラリの依存関係を解析しネットから必要なものをダウンロードしてくれます。
そのためJavaエンジニアにとっては、Mavenの使い方を理解していることも必須のスキルとなります。
この段階で身につけること
- Mavenが提供するデフォルトの挙動を理解する
- ソースコードのコンパイル、テスト、パッケージをする方法
- レポジトリ(ローカル、リモート)の概念
- 主要なプラグインの機能
オブジェクト指向・デザインパターン
「Javaはオブジェクト指向言語」
という触れ込みを聞いて「オブジェクト指向とはなんぞや」と調べると「多態性」「継承」「カプセル化」などといった意味不明な単語にぶち当たり、いきなりつまづいてしまう人もいるでしょう。
また、プログラムを果物とか動物といった「モノ」に例えてわかりやすく解説したつもりがかえって意味不明になってしまう解説もよくあります。
初歩の段階では、あまり気にせず、まずは自分で書いたプログラムをビルド、実行、修正というサイクルを身につけるのが先だと思っています。
オブジェクト指向を知るには、オブジェクト指向でない手法で作るとどういう問題があって、どうやってその問題を解決しようとしているのかを理解する必要があるからです。
その上で徐々にオブジェクト指向について学ぶといいと思います。デザインパターンについては、オブジェクト指向と密接に関連したものが多いので、これも並行で覚えていくといいと思います。
これらのスキルが身につくと、複雑なプログラムをシンプルで読みやすく、意図が明確で、テストもしやすく品質が高いコードに変換することができるようになります。
小規模なアプリケーションだけを書いたり、指示された通りに特定の部品のコーディングをするだけならオブジェクト指向を知らなくてもいいかもしれませんが、それではJavaエンジニアのキャリア的には伸びしろがありません。複雑なアプリケーションを設計したり開発を行う際には、オブジェクト指向に基づいたプログラミングは必要不可欠です。
デザインパターンに関しては以下の本がオススメします。かなり古い内容で、正直なところ普段の仕事ではあまりお目にかからないパターンも多いですが、最も有名なGoFの「オブジェクト指向における再利用のためのデザインパターン」のデザインパターンが網羅されていて、これらはいまだにジョブインタビュー(仕事の面接)などで聞かれることがあります。本の中ではJava言語を使って解説しているので、Java経験者にはわかりやすいと思います。
とっかかりポイント
- インターフェイスの使いどころを知る
- インターフェイス中心の設計を意識する
- 自分のコードに適用できるデザインパターンを意識する
- 先輩などプログラミングスキルが高い人のコードの構造を見て、パターンや意図を察する習慣をつける
テストの書き方
プログラマの仕事はプログラムを書くことですが、それと同じくらい大事なのが、自分が書いたプログラムが正しく動作をするか検証する「テストコード」を書くことです。
正しくテストを書くことでコードの品質が改善するのはもちろんのこと、テストがしやすいコードは意識すると必然的に設計も綺麗になります。
代表的なものはJUnitと呼ばれるフレームワークで、これをIDEから実行してコードを修正したり、Mavenと組み合わせてビルド前に必ずテストが実行されるようにします。
またChromeなどのブラウザを自動操作してWebアプリケーションをテストするためのSeleniumもあります。
またコードによってはデータベースや外部サーバーと連携するものも多く、そういった条件のテストを簡素化するためにモックフレームワークを使うことも多く、Mockitoなどが有名です。
とっかかりポイント
- JUnitのテストの書き方を知る
- IDEとMavenからテストを実行
- テストしやすい設計を意識する
- IDEを使ってテストカバレッジを測定、改善する
Linux
サーバーサイドのJavaはLinuxのサーバー上で実行することが多いため、Linuxの知識は必要です。
といってもサーバー管理者を目指すわけでもなければシステム管理の細かい知識は必要とされず、基本的には、ファイルシステムや権限などの基本知識があり、リモートのLinuxサーバーにファイルを転送したり、SSHでログインしてコマンドラインでログファイルを読んだり、ファイルやサービスなどの基本的な操作が行えればまずは十分だと思います。
Linuxに慣れる方法は、ローカルに仮想マシンを作ってLinuxをインストールするか、インターネット上に自分専用のサーバー(VPS)を借りてそこでLinuxを走らせることです。VPSはインターネット上に自分専用のサーバーが立ち上がるのでそこで好きなことをできます。現実の問題に対処する中で知識がつくのでオススメです。
VPSのオススメは、ConoHa VPSとさくらのVPSで、僕はConoHa VPSを使っています。申し込んだら数分後に自分専用サーバーを持てるのが魅力です。
とっかかりポイント
- 基本的なファイル操作方法
- コマンドライン上でのファイルを読み書き
- プロセスやサービスを操作
- パッケージの更新や追加
Spring Boot
JavaコミュニティにはSpring Frameworkというフレームワークがあり、サーバーサイドのJavaではほとんどのプログラムが何らかの形でSpring Frameworkを使用しています。
Spring Bootはウェブアプリケーションが作れるフレームワークです。
わかりやすいところでは、データベースに接続してデータを読み書きしたりするようなWebサービスをごくわずかなコーディングで開発できます。
ひと昔前までは、サーブレットやJSPという仕組みでサーバー側のJavaを実装していたのですが、現在ではSpringなどのモダンなフレームワークを通じてWebアプリケーションを開発します。
今日ではServlet/JSPを直接触る機会はほとんどないので、学ぶとしても最低限の知識を仕入れるに留めておき、むしろSpring Bootに慣れ親しんでおくといいでしょう。
とっかかりポイント
- デフォルト挙動を理解
- JPAを使ってデータベースに接続
- Rest APIを公開
- データベース(RDBMS)の基礎(まずははMariaDBをオススメ)
- HTTPプロトコルの基礎(メソッド、パラメータ、ボディ、ヘッダ、ステータスなど)
- パッケージングと実行の方法
- Spring Bootアプリケーションのテストする方法
この段階では、データベースアクセスのためのフレームワーク(JPA)、 SQLなどを知る必要も出てきます。データベースの設計やSQLのパフォーマンスについても徐々に知識をつけるといいでしょう。
またHTML/CSS/JavaScriptなど、フロントエンド(ブラウザ内)の技術も必要になるかもしれません。Javaは主にバックエンド側を担当する技術なので、ウェブ画面やデザインなどのフロントエンドは専門の人に任せるということも多いですが、フロント側もできればなおいいので、最低限の知識を身につけておくと便利です。ちなみに僕の今の仕事では、バックエンドはJava、フロントエンドはReactJSといったパターンが多いようです。
【Javaプログラマー必須】最強のフレームワーク、Spring。環境構築、Thymeleaf画面作成、依存性の注入まで。
DevOps
最近では開発からテスト、ビルド、デプロイまでを自動化するDevOpsが盛んにいわれています。単にプログラムを書くだけでなく、こうしたプロセス全体まで見渡せるようになると開発チームのリーダーや、開発プロセスの改善を担当するような仕事もあり、最近ではかなり需要のある分野となっています。
DevOpsは多岐に渡りますが、まずはJenkins(ビルドサーバー)やGit関連について理解しておくとよさそうです。
とっかかりポイント
- Jenkinsの使い方
- Gitとの連携
- 自動テスト
- 自動リリース
- 自動デプロイ
クラウド系(Docker/Kubernetes)
かつては社内のデータセンターに何百万もするサーバーを設置して、その上にシステムをインストールしていたのですが、最近ではクラウド環境が大きく普及して、クラウドに移行するシステムも増えています。
金融機関や官公庁、伝統的な大企業など、クラウドに消極的な業界もありますが、しかし日本政府がAWA(アマゾン)のクラウドを使うとか、アメリカの国防省がAzure(マイクロソフト)のクラウドを採用というニュースも出てきて、今後はクラウド化がさらに加速すると思います。
僕も伝統的な大企業の仕事を担当することが多く、これまでクラウドとは縁がなかったのですが、最近になってクラウド上にシステム移行するプロジェクトを担当するようになりました。
そのため、クラウド関連の技術は今後は必須のスキルになってくると思われます。
アプリケーションや依存関係をコンテナという容器に突っ込むことでサーバー環境をスッキリ管理するためのDocker。複数のDockerコンテナをまとめ上げてサービスを実行するKubernetes。JavaとしてKubernetesの環境に対応したSpring Cloud関連のプロジェクトは知っておいて損はないと思います。
https://kubernetes.io/ja/docs/tutorials/
並行と反復が大切
以上、最速でJavaエンジニアになるための順番を紹介してきましたが、実際には順番に一つずつ階段を上がるイメージではなく、二つか三つの項目を並行して取り掛かり、また行ったり来たりを繰り返し、螺旋階段を登るように徐々に理解と知識を深めていくのが効果的だと思います。
僕は、若い頃うまいことエンジニアのポジションに潜り込んで、そこから強制的にスキルを身につけたので、ある意味ではラッキーともいえますが、そういう話が常に転がっているかといえばそうでもないですし、勤務先が外資系だったこともあり常にクビの恐怖と隣り合わせでした。
なので、これからエンジニアを目指すという方は、オンラインのコースやスクールを活用して足場固めをしてから開発経験を積んでいくのがいいと思います。
またこれはあくまで僕自身の経験や境遇からみた一つのケースで、学習を進めていくうちに別の技術に興味が湧いたり縁があったりするかもしれません。ですが、ここで挙げたものはJava以外の分野でも役立つばかりなので無駄になることは一つもありません。千里の道も一歩からといいますし、この機会に最初の一歩を踏み出してみましょう。
【 5日でできる】はじめての Java プログラミング入門