学問に王道なし

書山有路勤為径  学海無涯苦作舟

学問に王道なし

書山有路勤為径  学海無涯苦作舟

【訳】2018年のデキるバックエンドエンジニアになれる為のロードマップ

初めに

最近は、「エンジニアロードマップ」というGithubプロジェクトはかなり人気集めている。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
github.com

日本の同僚たちにも共有したが、やはり英語という壁が強そうので、なかなか伝わっていないところあると思う。
そこで、「和訳しよう」というアイデアが出た。
中国人なのになんで日本語へ訳するのかというツッコミは勘弁してください
まだやる気あるうちに、早めに終わらせたい。

FEルートはすでにQiita記事あるため飛ばす。
2018年の最先端フロントエンドエンジニアになろう - Qiita


目的

このロードマップは、「FE/BE/DevOpsを勉強したいが、どうすれば良いのかはわからない人」に対して、「こんな感じで勉強すればいい」というルートを示すマップである。
すでに勉強ルートある方にも、代替案として参考できる。

Disclaimer

このロードマップの目的は、大枠についてのアイデアを提供し、次に学ぶべき技術について混乱しないように、トレンディな技術について道標を示すことです。
ひとつのツールがある作業に適していても、他の作業には適していない可能性があること、そして最新技術が必ずしもよりよいものではないことがあることを覚えておく必要があります。

参考図

f:id:zhangnan198711:20180403223239p:plain

さて、ルートの訳に始めよう。

バックエンドエンジニアのロードマップ

1.まずは一つ言語をピックアップしよう

バックエンド開発経験なし初心者にとって、スクリプト型言語から着手したほうがいいかと。特に入門しやすいNode.js 又は PHP はオススメ。
すでにスクリプト言語で開発している方は、他のスクリプト型言語ではなく、GolangとかRustとかClojureに着目しよう。スクリプト型言語と違う体験ができるはず。

2.学習した内容を練習しよう

選定言語を使って実践し、コマンドライン程度のアプリケーションを作ろう。

  • ls などのコマンドと同様な機能を作ろう(by 訳者:アクセスして、コンソルへlsコマンドと同じような内容を出力)
  • /r/programming のURLへアクセスしたら、reddit記事をグレップして保存する機能
  • JSONフォーマットで、あるディレクトリ構造を出力する機能
  • 上記のJSONを読み込んで、同じディレクトリ構造を再現(作成)する

とりあえず毎日の手動作業を考えて、自動化させるアプリケーションを作ろう

3.パッケージマネジャーを勉強しよう

選定言語のパッケージマネジャーを勉強しよう。
例えば

PHP
composer
Node.js
NPM/yarn
Python
pip
Ruby
gems
Java
maven/gradle (訳者追加)
なんでパッケージマネジャーを勉強すべき?

パッケージマネジャーは、外部ライブラリーを利用する際依存関係を管理するもの。
そして自分の成果物(パッケージなど)をデプロイする際にも必要。

4.開発標準とベストプラクティスを知ろう

全ての言語は、自分の標準とベストプラクティスがあるはずので、それを勉強しよう。
例えば、PHPなら、PHP-FIGPSRsある。
Node.JSなら色んなコミュニティから定義されたベストプラクティスある。

(訳者注) ベストプラクティスって一体なに?

ベストプラクティスは、「最優良事例」という意味合いで、「品質を担保できる為の開発ガイドライン」として理解できるかも。
例:

  • Java開発のベストプラクティス例1:性能問題で、文字列連結する際に 「+」演算子や「StringBuffer」ではなく、「StringBuilder」利用しましょう
  • Java開発のベストプラクティス例2:可読性の為に、マジックナンバーの利用を控えて、定数やENUMとして定義しましょう
セキュリティーを注意

セキュリティー関連のベストプラクティスは必ず読んでください。
OWASPの上位セキュリティー脅威を読んで、選んだ言語での対策方法を理解しよう。

5.成果物として、パッケージとライブラリーを作成して公開しよう

学んだ開発標準とベストプラクティスを意識した上で、パッケージとライブラリーを作成して、他人にも利用できる為に公開しよう。

OSSプロジェクトへ貢献しよう

Github上のプロジェクトを検索し、適当なOSSプロジェクトを選んでPRを出して改善してみよう。
下記の切り口は考えられる

  • 学んだベストプラクティスを利用し、リファクタリングを行う
  • 既存issueを確認して解決する
  • 新機能を追加する

6.テスト技法を勉強しよう

テストは色んな種類あるが、とりあえず単体と結合テストの考え方から始めよう。
そしてmockやstubなどのテスト用語を理解しよう。

選定した言語により、目的がそれぞれ異なるテストフレームワークは複数ある。Googleした上で、自分のニーズに一番合わせるものを選ぼう。

PHP
PHPUnit / PHPSpec / Codecpetion
Node.js
Mocha / Chai / Sinon / Mockery / Ava / Jasmine

戦争を起こさせたくないため、他の言語のテストフレームワークは自分で調べた上で選んでください。
(訳者注:Javaなら、JUnitTestNGはメイン)

7.ステップ5にて作成した成果物に対して、ユニットテストを書こう

バレージ率の計算を勉強しよう。

8.関係型データベースを学ぼう

下記のように複数データベース製品あるが、一つを分かるようになったら、他の製品も勉強しやすくなる。
オススメとして、MySQL (訳者注:無料/Lightwave/インストールしやすいため)を選らぼう。
もちろん、他の製品との相違点や利用シナリオも勉強しよう。

9.DBを利用して練習しよう!

今までに学んだ知識を全て利用し、簡単なアプリケーションを作ろう!
新規登録とログインとCRUD程度の機能は必須だろう。
例えば、下記の機能あるブログを作成しよう。

  • 誰でも新規登録できる
  • 新規登録と伴い、公開するプロファイルページも作成される
  • 記事の新規投稿 / 編集 / 削除 / 下書き / 公開機能

10.フレームワークを学ぼう

注意:選定言語により、フレームワーク不要な場合もある。
例:

PHP
Laravel / Symfony / Slim / Lumen
Node.js
Express.js / Hapi.js
Golang
フレームワークなしのはマシ

11.フレームワークを利用して、ステップ9で作成したアプリケーションを作り直そう

12.NoSQLデータベースを学ぼう

まずは、「NoSQLとは」を理解してください。
そして、「関係型データベースとの相違点」と「なぜNoSQLは必要か」を理解しよう。
さらに、NoSQLの複数製品の異同点を調べた上で、とりあえずMongoDBで進めよう。

  • MongoDB
  • RethinkDB
  • Cassandra
  • Couchbase

13.キャッシュイングを勉強しよう

下記のどっちかを利用し、アプリケーション層のキャッシュイング仕組みを勉強しよう。

ステップ11にて作成したアプリケーションに、キャッシュイングを適用してみよう。

14.RESTful APIを作成しよう

まずはRESTということを理解し、RESTful APIの作成方法を勉強しよう。
Roy Fieldingが作成したRESTfulに関する論文も読んでください。
(訳者注:英語読めるなら読んでいいかと・・・読めないと、日本語の資料を読んでくださいね)

15.認証/認可の仕組みを知ろう

下記のやり方の相違点と実装方法を勉強しよう。

  • OAuth
  • Basic Authentication
  • Token Authentication
  • JWT
  • OpenID

16.メッセージブローカを知ろう

メッセージブローカについて勉強し、「なぜ(訳者注:なぜメッセージブローカは必要か、どのような場面は必要か)」
色んな製品あるが、下記の二つがオススメ。

  • RabbitMQ (一番推し)
  • Kafka

17.検索エンジンを勉強しよう

アプリケーションの負荷が高くなると、簡単なクエリでもDBへの高負荷になり得る。
その場合、検索エンジンを利用しなければならない。

18.Dockerを勉強しよう

19.Webサーバーの基礎を知ろう

複数製品ある為、それぞれのメリデメを理解しよう。

20.Webソケットの利用方法を勉強しよう

21.GraphQLを知ろう

正直いうとこれは非必須だが、気軽に了解してみて、「新REST」と期待される理由を理解しよう。

22.GraphQLデータベースをさらっとみよう

非必須だが、「GraphQLとは」レベルで分かるようになれば。

23.ステップ1−22メンションしていないの雑

  • Profiling
  • Static Analysis
  • DDD
  • SOAP
  • Go Figure

Keep Exploring !