非エンジニアのクラウドと環境構築勉強方法

最近、プログラミング自体ではなくて, Linuxやインフラに関する知識が不足していると感じていて少し苦労しました。色々と勉強しましたが遠回りもしていたなと思うので、各位に同じ轍を踏まないように

  • どのようなプロセスでクラウドサービスや環境構築の必要性を感じたか
  • 必要性を感じたときにどうやって勉強すればいいのか

の2点についてまとめておきたいと思います。

想定読者

  • 僕と同じような経済学出身(いわゆる文系?)の人間の多くは、必要に迫られてプログラミングを始めた人。
  • 非エンジニアで環境構築に苦しめられる人

つまり僕のようなアマチュアを対象としています。あくまでこれは僕の学習プロセスの振り返りの面もあるので、更に良い方法があるなどは適宜教えて下さい。僕も勉強していきたいです。

プログラミングにおけるステップ

プログラミングの必要に迫られていたタイプの僕は次のようなプロセスで新しい課題にぶつかってきました。

  • プログラミング何もわからん。

    とりあえずプログラミング言語勉強するしかない… pythonだとみんなのpython(入門)とかpython実践入門(中級ぐらい)が結構良かったです。

  • コードがあっちこっち行ってしまう。

    バージョン管理の出番です。どれが最新版なのかわからなくなるようなコード管理をやめて、gitを勉強しましょう。 僕もそんなにうまく使えているわけではないですが、GitHub実践入門が良かった記憶があります。

  • 重たい計算がしたくなる。(本題)

    研究あるあるですね。最近だとディープラーニングGPUが使いたいなどのニーズがあるかと思います。ここでクラウドサービスの出番です。 クラウドを利用すれば、自分のPCよりもよいスペックのサーバーをすぐに用意出来るので、研究プロセスを高速化することが出来ます。さあ!クラウドを使ってみましょう!

ここに落とし穴がありました…

クラウド利用時における落とし穴

クラウドサービスに登録して色々やってみようと思った時に次のような落とし穴にハマりました。(現在もハマり中です。)

  • クラウドの使い方よくわからん IAMってなに?EC2?ってなに?セキュリティどうすればいいの? 今までローカルでしか研究開発をしていなかった人間にはクラウドの世界は摩訶不思議です。クラウドサービス自体を把握する必要があります。 クラウドサービスは疎結合なので非常に良いといいますが、結局色々やりたい時には多くのサービスについて知らないといけないし、それぞれで詰まります。

  • EC2インスタンスLinuxだしCUIやんけ!

    僕のような人間はGUIが大好きです。UNIXコマンドも代表的なものしか知りません。 クラウドを利用する際には多少なりともLinuxコマンドラインと親しんでいたほうがいいこともあります。

  • EC2インスタンスの環境がローカルと違う!

    今までは自分のPC上でライブラリなどを用意すればよかったのですが、それを再度EC2インスタンス上でもやる必要があります。このときにローカルのライブラリとEC2上で バージョンが違って、無駄なエラーが出る場合があります。 この時間は完全に無駄なので、どうにかしてローカルとクラウド上で同じ環境を使って分析がしたくなります。ここでdockerの存在を知ります。

もちろんクラウドを利用するのも学習コストが0ではありません。これまでのように適当なレビューのいい本を買って勉強すればいいじゃん!と思いますが、僕のようなアマチュアには実は大変です。

  • 前提知識が違いすぎる

    それぞれの本の著者の想定読者層に比べて残念ながら知識が足りていません。それもそのはずで、有名な本はエンジニア初心者を対象にしていたりします。そのためテクニカルタームがわからないし、本の中身がわかったようでわかりません。そもそもニーズが異なる場合があります。(webサービスを作ることを目的にされても…)

  • 読んでも自分の課題を解決出来ない。

    上に関連しますが、本の内容を消化しきれないケースや、本当に概要しか書いてないケースがあり、実際にやりたいことが自分でできる様になりません。

残念ながらクラウドで計算させたいだけなのに、LinuxとDockerの知識が必要になってしまいました。ここで挫けそうですが、こうしたらいいんじゃないかという勉強方法を見つけました。

暫定的な勉強方法

結論から言いますが、AWSLinuxは同時に学ぶ事ができますが、Dockerは1から勉強してください。ただしDockerを学ぶのに効率的な方法はありそうです。 この部分から先は僕も勉強中です。なので、後々もっとよい方法を見つけるかもしれません。

  • AWSLinux

    AWSではじめるLinux入門ガイドを読みましょう。 AWSのサービスに加え、基本的なLinuxの知識(コマンドラインでの実行方法など)を得ることが出来ます。AWSを利用する際に必要なのに、それほど記載されていることがないaws cliについても記載があるので、非常に良い本だと思っています。

  • Docker

    この部分が一番むずかしいと思います。Docker/Kubernetes 実践コンテナ開発入門という本は評判がよいですが、応用できるような知識が身につきませんでした。恐らく僕が想定読者に含まれないためだと思います。 おすすめとしては若干胡散臭いレビューが多くて申し訳ないのですが、Udemyにある米国AI開発者がゼロから教えるDocker講座が最もよい気配があります。これは勉強中なので、話半分に聞いて貰えれば幸いです。

全体を通しての学習プロセス

まだ学習途中ではありますが、今後の方針について記載したいと思います。以下の図はAWSでマネージドサービスを利用した場合、EC2上でデータベースを作成する場合、オンプレミスで作った場合に、どこまで自分で管理するべきかを示しています。

f:id:tokutokupooh:20201011200923p:plain
Black Belt Online Seminar AWS Amazon RDSより引用

僕のようなアマチュアにとっては、必要に応じて概ね各ブロックの上から下に知識を増やしていく事で効率的に目的を達成するために必要な知識を得ることができるかと思っています。*1なぜかというと、ハードウェアやOSから積み上げる場合だと目的から遠すぎるのと、きちんと学ぶにはあまりにも多くの範囲をカバーする必要があるからです。研究側のほとんどの人にとってLinuxカーネルがハードウェアを動かす仕組み(システムコール)はそこまで必要とする知識ではないと思います。我々の時間は有限なので、効率的に必要な知識を得るべきです。

まとめ

今回の記事ではどのようなステップを踏むとクラウドサービスやdockerによる環境構築を必要とするのか、必要となった場合に何を使って勉強すればいいのかということを紹介しました。 もちろんこの記事は僕がこうしたらいいんじゃないかという中間結果でしかないので人によってはより理解しやすいプロセスがあるかと思いますし、不適切な理解をしている可能性もあります。 しかしこうした0から学習した場合に何が必要なのかということを明確にしている記事は多くないと思いますので、この記事が参考になれば幸いです。

*1:もちろんラックの方法とかを学ぶ必要はないと思いますし、せいぜい必要になるのはOSについての理解までではないでしょうか