楽しくエンジニアリングするための道筋

# TL;DR

- とりあえず公式チュートリアルだけでも触れてみるか, はじめにの項を読んでみる.
- 基礎知識は必要だが, 最初からいきなりやるのではなく段階を踏んでやる.
- 非公開でもいいからとりあえずどこかに内容を書いておく.

# はじめに

みなさん, 勉強は好きですか？または楽しいですか？
自分は興味はある分野の勉強はある程度好きですが, 飽き性なのですぐ飽きてしまいます. あと, わからないことが多いと理解しなきゃいけないという苦しさから楽しくないことと感じることが多々あります.
上記は自分の場合ですが, 人によっては, 全く楽しくないまたは嫌だと感じることがあるかと思います.
そもそもエンジニアリングをしてみたいが, 勉強は…や, 勉強しててあんまり楽しくないと感じる人もいるかもしれません.
なので, 自分流ではありますが, 楽しくエンジニアリングできるための道筋というのを書こうと思います.

:::note warn
なお, 自分の経験に基づいた話をベースに書いているので, 必ずしもこれが正しいというわけではないということはご了承ください.
加えて, エンジニアリングと書いてありますが, 基本的にはコンピュータ領域に近い話がメインです. 裾野を広げすぎな感じはありますが, そこは大目に見てもらえれば助かります…
:::

# 本題

長々文章書いてるとすぐ飽きちゃうので, さっそく本題にいきましょう.
基本的には以下の 3 つをベースに話をします.

1. とりあえずチュートリアルに手を出してみる.
1. 基礎知識は段階を踏んで行う.
1. インプットと同時にアウトプットを行う.

## 1. とりあえずチュートリアルに手を出してみる.

今の環境は, 昔の環境と比べ整っております.
[CodeSandbox](https://codesandbox.io/) や [Wandbox](https://wandbox.org/) のようにオンラインでコードを実行できる環境のほか, [Go Playground](https://go.dev/play/) や [Rust Playground](https://play.rust-lang.org/) 等の公式サイトレベルで用意されてる環境もあります.
また, チュートリアルがある言語も存在します. 特に最近の言語はそういう傾向が多いです.
例えば, [Python](https://docs.python.org/ja/3/tutorial/index.html), [Ruby](https://www.ruby-lang.org/ja/documentation/quickstart/) のようにチュートリアルページを用意してる言語や, [A Tour of Go](https://go-tour-jp.appspot.com/welcome/1) のようにチュートリアルと同時に実行環境も用意されているようなチュートリアルページもあります.[^1] [^2]
公式のチュートリアルがなかったり, リファレンスだけでわかりにくかったりしても有志が運営している [JavaScript Primer](https://jsprimer.net/) のようなサイトもあります. このようなサイトを利用するのも手です.
時々, 上記のようなチュートリアルもリファレンスも存在しないまたはわからない言語があります (例えば C や C++ のような昔からある言語). 自力でこれらを勉強できる人や近くに詳しい人がいるならまだしも, 初学者にとってはこれらの言語に挑むのは難しく, また必要となる知識も多いため, 挫折もしやすいです. そのため, 避けるのが無難かと自分は思います.

もし今実行できる環境がない, 例えばスマホでサイトを見てるという方がいるかと思います. その場合は, 最低限 Getting Started (はじめに) の項を読むことをお勧めします. 読むと読まないだけでも雲泥の差があるので, 読みましょう. 特にスマホだと寝ながら読むこともできるので, 休憩時間中や寝る前に読むというのも非常に有効かと思います.

## 2. 基礎知識は段階を踏んで行う.

基礎知識というのはいつでも大事です. 逆に基礎知識がなければエンジニアリングすることは無理です.
ですが, 基礎知識をつけるには大抵の人間は多くの時間とやる気が必要です.
また, 基礎知識に必要な前提知識という知識も必要になることも多々あります.

分散システム (distributed systems) を例に以下の簡易的な文章を考えてみます.

:::note warn
以下の文章は, 自分の知識をもとに書いた架空の文章です. 念の為確認はしてますが, 文章的に間違えていたら指摘してくれれば幸いです. また, 以下の文章に出た用語の説明は今回行いません (本筋とは関係ないため).
:::

分散システムでは, 様々な方法があります. 例えば, 垂直分散 (vertical distribution) や水平分散 (horizonal distribution) が代表例です. 現在では, 分散システムは必須の技術であり, アプリケーション分野では Kubernetes によるコンテナオーケストレーションシステムや Istio, Envoy を用いたマイクロサービスの構築が具体的な例でしょう. また, これらに加えてデータベースのシステムにはフェイルオーバー (failover) による冗長化は可用性 (Availability) を高める方法として有効です.

…以上の文章は理解できたでしょうか？
少し意地悪なことをしている自覚はありますが, この文章に出ている用語を全部説明できますか？そもそも, 分散システムという言葉自体わかりますか？
恥ずかしながら, 文章を書いた自分も完璧に説明できるわけではありません.
例えば, Kubernetes を理解するためにはコンテナという概念を理解する必要があり, そのためには仮想化という概念を理解しなければなりません.
ですが, それらの用語を一気に勉強し, 覚えて理解しようとしても結局やってる側にとっては「何がメリットなのか」理解できないと思います.
実際, これらを理解するためには, 「何が問題で何を解決しなければならないのか」を理解する必要があります.
これは, 実際に問題に直面しない限り理解しにくいかと思います.

現在では, 色んな知識や技術を駆使したサービスを利用していますが, それらを全部理解するのは非常に難しいです.
もし, 自分がやろうとしていることで問題に直面しわからないことがあったら一度立ち止まって調べ, 理解をする.
これが, この「基礎知識は段階を踏んで行う.」です. 一度に一気にやってもわかりませんし, 逆に勉強してる側にとってはモチベの低下につながります. 
「俺は一度にやるタイプなんだ！」というのは否定しませんが, 大体今やっている分野を飛び出して別の分野に行ってしまい, 時間を無駄にしてしまうというのがオチです. 数学をやっていたらいつの間にか歴史の話を見てた…そういう経験ありませんか？それと同じようなことが起きてしまいます.
前を見ずに突っ走るより, その都度調べ基礎理解するのが一番の近道で楽しくできる方法です.

:::note info
勉強方法はどうすればいいのか？
本, ネット, 人伝など色々な方法があります. そこは好きに選んでいいと思います.
無責任かと思われそうですが, 結局選ぶのは勉強する本人次第なところがあり, 勉強方法まで指南するような記事ではないことは理解してくれればありがたいです.
あと, これらどれでも古い情報や正しくない情報も含まれているので, 正解がないというのも大きいというのが個人的な印象です.
:::

## 3. インプットと同時にアウトプットを行う.

これはよく言われていることですね, 特にアウトプットに関しては色々なブログやら記事やらで言われていることです.
では, 実際にどうすればいいのか, 簡単です.

**書きなさい.**

…何を？どこに？と思うかもしれませんが本当に何でもいいです.
知った内容をブログ, Qiita 記事等に, 書いたコードを GitHub 等に…どこかに置いていつでも見れるような状態にしましょう.
「もしかしたら怖い人たちに見られてきついこと言われるかもしれない」と思うかもしれません (実際この記事を書いている自分も思っております).
その場合は非公開で自分だけ見れるようにしましょう. 別に, 見られても構わないと思うなら公開すればいいだけなので.
ここでの本題は, 「書くこと」が重要であり, 「他人から見られること」が重要というわけではないです.
公開はただの「おまけ」程度で考えた方が気が楽に書けるかと思います.

# おわりに

この方法が最適解ではありませんが, 自分の中で楽しくエンジニアリングするための道筋というのを書いてみました.
エンジニアリングの勉強したいが…みたいに迷っている人や, 一度挫折したような人間の助けになれば幸いです.

[^1]: ここにあげているチュートリアルのリンクは全て日本語化されていますが, 言語によっては英語のみの場合もあるので気をつけてください.
[^2]: 特に Go は A Tour of Go 以外にもチュートリアルページがあります. 気になる方は探してみてもいいかもしれません.