[ポエム]初学者は学習時にローカルでの環境構築を頑張るべきか否か

こんにちは。

IT系の企業でエンジニア研修を仕事でやってたりする者です。

普段はプログラミングだとか、クラウドのインフラだとか、DevOps的なことだとかを初学者向けに説明したりハンズオンを提供してます。

最近、いろんな方面に技術的な研修を実施させてもらってて、進めていく中でやっぱり **「環境構築」** で詰むことが多いんですよね。

トラブルシュートしようにも、自分のPCでは再現性がなかったりして苦戦することもままあります。

研修における環境差異をなくすためにCloud9だとかCloudShellを使っても、それはそれで楽なんですけど、 **本当にそれでいいのか？** と思ってしまうことがあります。

思考の整理のためにポエムを綴っていきます。
同じ悩みを持つエンジニア人事・研修担当者・メンターの方も多いんじゃないかなあ。

# 持っている環境は、みんな違う

一言に「環境」と言っても、いろんな要素があると思います。

ネットワーク、端末、OS、言語、ライブラリ、ブラウザ、モニター、接続端子、天候。。。

これから私が言及する「環境」というのは、 
**「IT系技術者がシステム構築に必要な技術的な開発を行うために構築する環境」** 
です。

まあつまり
* 端末
* OS
* IDE
* 言語を動かすためのビルドツール
* SDKなどのサービス利用補助ツール
* OSSツール

とかのことです。

同じOSであってもPCのスペックが異なっていたり、内蔵チップがちがっていたりするだけでも挙動が変わることって往々にしてあると思います。

その環境に合わせて開発環境をつくってカスタマイズしていくことが楽しいですよね。

しかし、初学者にとっては、テキストをなぞってもうまくいかない場合どう解決したらいいのかがわからないので、学習のハードルがぐんと高くなってしまいます。

エラー吐かれたりうまくいかないことがあっても、ある程度慣れていれば、

* 「多分こいつが悪さしてるんだなー」
* 「別の方法でやるかー」
* 「公式のFAQにどうせ書いてんだろー」

みたいに、別の方法を模索してなんとか作ることができると思います。

まあよくあるのは 「コンテナイメージをPULLしてきて立ち上げちゃう」 みたいなことですね。

でも初学者にとってはDockerとかの存在・使い方も分かりませんし、結局調べた先の内容もわからないから、わからないわからないうわーーってなってしまいます。

(誰しもが通る道ですね。。)

# クラウドIDEや学習サービスがあるじゃないか

Cloud9などのクラウドIDE、Progateなどの学習サービス、CloudShellなんかを使用すれば、アプリケーションの動作環境なんてほとんど気にしなくても開発のための学習はできます。

私みたいな研修担当者としても、環境差異を気にせず研修を進められますので利用できるならしたいというのが本心です。

# でも、それでいいんだっけ？

プログラミング「だけ」、コマンド操作「だけ」を学びたいのであれば前述したサービスを利用することはとても良い選択だと思います。

でも、技術同士の関連性を把握することや、アプリケーションを動作する環境がどんなものたちで構成されているかを知ることによってそれらの学習の深さが違ってくるのかなと。

例えば、プログラミング言語もバージョンによって仕様が異なるし、インストール方法も色々あります。

インストールの時に使ったツールや、一緒にインストールしたライブラリの依存関係がアプリケーションの実行に影響を与えたりだってするわけです。

プログラミングを例に挙げましたが、そのほかの技術だってそうです。

SQLを書くにしても、そのエンジンがどういう処理の仕方をしてるのか知ることで書きやすくなりますよね。

クラウドインフラの構築だって、クラウドサービスが何をクラウド化して提供しているのか知らないと自分で考えて構築することができません。

「利用者」としての学習であれば気にしなくてもいい部分も、「開発者」であれば知っている必要があると私は思っています。

## 環境を作ることが大変な作業であることを知る

**「アプリケーションが動くためにはその土台となる環境(≒インフラ)が大事なんだな、この作業がとても大変なんだな」**
ということを知るのも、1つの学びであると私は考えます。

特に、インフラやDevOps、SRE的な部分を学習していきたい人たちは早い段階で通っておきたいチェックポイントですよね。

学生時代やプライベートで自前でサーバーを立ち上げたり動かしたりした経験のある人は、自然と身につく感覚です。

異業種からの転職や文系卒で入社して社内研修で初めて触る人は、研修内で一律にその機会を与えられるわけです。

前述した便利なサービスを利用することは、その機会損失に繋がってしまいかねないと懸念しています。。
これはきっと老害のエゴと捉える人もいそうです。。

## 関連する技術に明るいことに越したことはないけれど

**「そんなこと言ったら、技術者として入社してきた未経験者は、全員デジタル回路の勉強からやり直すべきって話になるじゃないか！」**

と、頭の中にいるもう一人の私が金切り声をあげています。

ええ、ええ、わかっています。
**「便利なものを便利に使えること」** こそが最先端を生きる現代人の生き方ですよ。

でも、「その便利なものを開発する人間」は割と泥臭いこともするよねっていうことなんです。

# ローカルPCで頑張る必要ある？

ちょっと話が逸れてしまいました。

これまでの話だと、

**「じゃあ別にAWSに環境立てさせるところからやればよくない？別にローカルじゃなくてもよくない？」**

って感じですよね。

コンソール作業なら端末に依存しませんし、こちらからアクセスすることもできるので管理だって容易です。

環境構築のせいでローカルが汚れるのだって私も嫌いですし、泥臭さを体感するなら別にクラウドでだっていいんです。

でもですね、これまた老害と言われてしまうかもですが、実機を操作した方が触っている感あると思うんですよね。(もうほんと個人的な意見です)

## 「MySQLが動かなくなりました」

RDBの研修をしている時に、研修を受けている社員さんに言われた言葉です。

クラウドサービスを扱ったことがなく、Dockerも使用したことがない方です。
以下のような環境で研修を進めてもらっていました。

* ローカルにMySQLをインストールして立ち上げる
* クライアントツールとしてVSCodeを接続
* VSCodeからクエリを発行する

察している方もいるかもしれませんが、
「MySQLが動かなくなりました」
というのは、 **「VSCode(クライアント)とMySQL(サーバー)の接続が切れました」** という事象だったんですね。

ここで私は、今自分が操作しているものの把握があまりできていないんだなあという感想を持ちました。

これが、**「SQLの練習」** を目的とする研修であればこのまま放置でもいいのかもしれませんが、 **「RDB(MS)について知る」** という研修であれば、放置するわけにもいきません。

改めてそれぞれの役割の説明をしたり、GUIよりもCLIのクライアントの方が操作してる感があるのでは？と、クライアントツールとの接続を研修の最後の方に持っていくことをTRYとしてやってみたり、、

まあそんな感じで、感覚を掴むことって、ともすれば機会がないまま過ぎていくこともあるのではと思っております。

そんなこんなで、「ものを触っている感覚」っていうのも大事なんじゃないかなーと感じているんです。

# 結論

私としての結論は、

「ゴリゴリに開発する人を目指したいなら、頑張った方がいいんじゃない？」

です。

まあふんわりしていますが、全てのシステム利用者・開発者を目指す初学者が必ずしも頑張るべきところではないのかな。という感じですかね。

「コンテナ立てたらええやん？」「AWSにインスタンス1台立てたらええやん？」と考えられる人は、ある程度知識がある人なので別に頑張る必要はないと思います。

長々と書き綴ってしまいました。ここまでご覧いただきありがとうございました。では。