エンジニアの次のステップへの勉強法


言われたものはだいたい作れるし、どんなプログラミング言語が来ても大抵書けそうかなってなったエンジニアがそこで成長が止まってしまう人を見かけることがあります。
技術が好きで、作ることが好きで、なのに環境に求められず成長が止まってしまっているんだろうと思います。

ここで成長が止まってしまう環境とは、

* 新しい技術の情報を仕入れて語り合うエンジニアが居ない
* 業務用件に高い技術が求められない
* 改善サイクルが遅い
* 開発プロセスなどをまとめる人がいない

などです。
簡単に言うと、今はうまく仕事があるけれど、停滞している仕事場ですね。
下手にビジネス的に成り立ってしまっているので、それ以上成長をする必要がないのです。

まあ、そういう生き方もありかな？って思うので、それでいいやって思う人は続きは読まなくてもいいかなって思います。

ここから先はエンジニアとして技術を伸ばすことが楽しい、ものを作ることが楽しい、でも今のままでいいの？って思っている人へわずかでもヒントになればと思って書きます。

# 最初に

ここに書いているものは今、私がいる環境では普通に会話する `基礎` に近いものです。
全てを把握をしているわけではないですが、それぞれのワードや意味は知っていて会話に出てくる内容です。

エンジニアの基礎力としてフレームワークやトレンドだけではなく、技術土台を強くしましょう。

# エンジニアの基礎力アップのために

## デザインパターンを覚えよう
GoFのパターンに代表されるデザインのパターンがあります。
マルチスレッド処理のパターン、関数型のパターン。

どんなオブジェクト指向でも利用しているGoFのデザインパターン。

マルチスレッドであればCyclicBarrier、CountDownLatchなど。
Javaであればjava.util.concurrentパッケージを覗いてみると実装が見れていいかもしれません。

関数型であればLoanPatternやScalaではmixinをつかったCakePattern、モナドなど。


規定通りの動作だけを目指していたコードが、よりスタイリッシュに書くことが出来て、柔軟性と堅牢性が高まります。


## インフラ、ネットワーク知識を理解しよう

今の時代アプリケーションコードを書いていると言っても、ほとんどの場合ネットワーク接続して、その処理をするのが当たり前になっています。プロトコルの特徴やHTTP(ブラウザ)の仕様などを把握して、どう実現するのかをスタイリッシュに決めましょう。

- TCP
- HTTPプロトコル
- DNS
- ルーティング
- ミドルウェア

また、最近はイミュータブルインフラストラクチャや仮想化利用が進んでいます。

dockerやkubernetes、CloudFormationを学びましょう。
その構成に対してのエラー監視システム、統計情報管理など色々なミドルウェアやサービスがあります。
これらの理解はアプリケーションを作り上げる時に開発のスピードアップと堅牢性に影響します。

あなたの理想のインフラ構成管理をイメージできるようになれると、その上にのせるアプリケーションもまた違って見えるでしょう。

## OSSのコードを読もう

世の中には優秀なエンジニアが沢山コードを公開しています。(いい時代になりました、、、)

GitHubで有名なフレームワークのコードもオープンソースで沢山開発されています。
自分の馴染みの深いフレームワークのコードを読んで、どのような仕組み、思想、そしてコードの書き方があるかを知っていきましょう。
JavaではJDKのクラスのコードを読んでみても良いかもしれません。

今まで書いていたコードのより良い書き方を発見できるきっかけになるのはもちろん、フレームワークの理念にそったクラス分割方法などを学ぶことが出来ます。

## クラウド環境のサービスに触れよう

素早くサービスを立ち上げるときにはクラウド環境を使うことも当たり前になってきました。
環境によってはクラウド環境の知識を求められることもあります。どのようなサービスが存在しているかを把握して、重要なサービスについては手を動かして利用してみましょう。

１時間単位などで借りることが出来るので、知識に対する投資額はほんの数百円です。
新しい知識に対するコストとしては安すぎる金額です。
この金額すら投資ができないならばエンジニアの成長にどれだけの思いがあるのでしょう？

AWS、GCP、Azureどれでも良いです。
出来れば基礎のEC2などのサーバインスタンスだけでなく、クラウドサービス特有のサービスを利用してみましょう。
AWS例ですと、CodeBuildやCodeDeployなどのCI環境やCloudFormationなどもあります。データを貯めるストレージもいくつも用意されています。なぜ複数用意されているのか？どんなときに使うと開発のスピードアップを計ることが出来るのか、提案できるエンジニアになるためには少なくとも知っている必要があります。
深く理解していけば強みにもなります。

クラウドサービスを利用するのは当たり前の時代になってきました。エンジニアの基礎の要素の１つとして知っておく必要があるでしょう。

## アーキテクチャパターンを覚えよう

GoFなどのデザインパターンは個々のクラスの役割を定義しているものですが、アプリケーションとして完成させるにはより大きなデータの流れがプログラムの中で発生しています。

- レイヤードモデル(階層型アーキテクチャ)
- ドメイン駆動モデル
- クリーンアーキテクチャ
- クラウドデザインアーキテクチャ
- マイクロサービスアーキテクチャ

アプリケーションの中のパッケージ構成の方法が中心でしたが、最近はサーバの外も含めたアーキテクチャを考えるケースが求められ始めています。アーキテクチャはコードを書く上での土台となります。土台がしっかりしていれば、まだまだ未熟なエンジニアであってもメンテナンス性が高いコードを書ける可能性が高まります。

あなたのアプリケーションのシステムビジョンを持って作れるようにアーキテクチャを学びましょう。

## 開発プロセスを学ぼう

会社に所属していると開発を複数人でするのは当たり前でしょう。
開発チームとしてのアウトプットを最大化しようとすると、個人能力のスピード以上にチームプロセスの改善が問われるケースがあります。必須ではないですが、アジャイル開発を使う意義や開発に対する考え方を学ぶ上で学んでおくことでチームのパフォーマンスが上がり、あなた自身のパフォーマンスも上がるでしょう。

- アジャイル開発
- スクラム開発
- XP
- リーンソフトウェア開発
- ペアプログラミング
- モブプログラミング
- KPT

## ビッグデータ処理について学ぼう

１日に数十億と言うデータが増えるシステムなどでは、今までのアーキテクチャでは全くこなせないと言うケースもよくあります。
事業ケースによるので必須ではないですが、少しばかりの強みになるかもしれません。

BigQueryやRedShiftを使うだけで済むケースも多いかもしれませんが、Webアプリケーションサーバですと、レイテンシが問題になります。レイテンシを解決しつつ、スケーラブルなアーキテクチャはそれだけで特徴的なものになります。
また大規模処理専用の環境HadoopやHIVE、ECS、Sparkなどのフレームワークなども知っておいてもいいでしょう。

個人で動作は確認できても大規模データ実験するのは難しいので、それらが存在する会社を探すというのもありかもしれません。。自分のエンジニアとしてのレベルを上げるために勉強した上で環境を変えるために動くのが近道かも。

## 機械学習でプラスアルファの知識をつけよう

クラウドサービスでは気軽に機械学習のデータを利用するサービスなども生まれています。
また、機械学習をさせるインフラもあります。
そして自分で機械学習を実行できるインフラを作ることも出来ます。
GPU処理やFPGAなども利用しているケースも存在しているのではないでしょうか。

統計や機械学習はエンジニアとしてのスキルとは別のスキルかもしれませんが、今トレンドな技術セットの一つかと思います。
ちなみに僕はほとんどできません (>_<)

## 技術以外のトレンドを理解して、技術を活かす場所を探そう

ブロックチェーン技術を利用した仮想通貨のビットコインやフィンテックなどや広告を個人単位に最適化するアドテクノロジー、ECや色々なメディアでのレコメンドエンジン、検索エンジン。
技術の高さ + ビジネスでの活用 はエンジニアにとってもチャレンジな環境が多く存在していることが多いです。
それはエンジニアの技術向上に繋がるでしょう。自分の技術力が最も高い価値に変わる環境を知っておくことは、自分の成長のために必要かもしれません。

# 新しい技術情報のキャッチアップ方法4選

これからも技術は進化して、基礎力を上げるだけでは足りない部分があります。
技術アンテナを高めて、より強いエンジニアに成るために情報キャッチアップの方法を紹介します。

## 勉強会に参加しよう

勉強会は残念ながら深い話はあまり出てきません。
多くはユースケースか汎用的な例です。
しかし、知らない知識について概要を掴んだり、名前すら知らない知識を知る切っ掛けになる場所になったりします。
深く知るためには自分の手を動かす必要がありますが、自分の知らない知識やノウハウを得られる出会いとしては悪くはないでしょう。

また、勉強会によっては懇談会が設定されているものがあります。
その中で普段出会うことのないエンジニアの考えに触れたり、あるいは転職まで出来てしまうこともあります。
人のつながりは最強です。

## twitterでフォローしよう

とても有名な人がtwitterをしているケースはよくあり、最新技術について発信していることも多いです。
むしろこのtwitterフォローだけで最新技術について知れてしまうのではと思うほどです。

それぞれの分野について有名な人は多く居ますので、少しずつで良いのでフォローを増やしてみて下さい。

## 公式ドキュメントをwatchしよう

最新の情報はやはり公式にあります。AWSの新サービス、GCPの新サービス、その他フレームワークの開発状況、ISSUEの状況、Pull Requestの状況、将来のビジョン。

最新のサービスをすぐに導入することは無いかもしれませんが、どのタイミングで導入できるかは分かりません。定期的に見に行くと知識を蓄積することが出来るでしょう。

またGoogle、AWS、MicroSoftなどのページにはクラウドアーキテクチャについて解説しているページや構成管理のコンセプトの説明、開発プロセスやマネジメントに関する情報などもあります。クラウドサービスの知識だけでなく、基礎知識を向上させる記事も多くあったりするので、探してみても良いかもしれないです。


## githubを覗いてみよう

OSSのコードを読んでみようと言うところと関係あるのですが、GitHubにはトレンドを見ることが出来るページがあります。
OSSコードを読むことではなく、どんなプロダクトが開発されているのか、トレンドは何なのかを素早くキャッチできるようにスターの多いプロダクトはコードでなくても、READMEなどを読んで、コンセプト、解決領域などのインスピレーションを受けてみましょう。

いつも見る必要はないと思いますが、たまに覗いてみると面白いものがあるかもしれません。

## Qiitaをチェックしよう


最近のトレンドは万人受けするような記事がよく上位に来るようになってしまって、コアで面白い記事が上がりにくいのですが、自分の気に入った人は積極的にフォローしたりして、トレンドとは別のタブのタイムラインで追えるようにしておくといいかもしれません。


自分も記事をQiitaに書いているので勧めてみましたｗ


# まとめ

やる気あるエンジニアが沢山成長できる環境を作りたいといつも思っています。
やる気と実力があるエンジニアが最大限に価値を提供できるシステムを作りたいといつも思っています。
問い合わせなどコメントでもなんでも良いのでメッセージくれたら答えますので、ヒントが欲しい方はなんでもどうぞ！

やりたいなって思っているだけではなくて、やっている人がどの方向に知識をつければよいかのヒントになればと思います。


また、こんな方法やこんな考えもあるんでは？と思う方が居ましたらコメントやトラックバック等で教えてください！