これからプログラミングを始めよう、SE になろうと思っている方、ようこそ、お待ちしておりました。
ありったけの革命的情熱をこめて君を抱擁する。
チェ・ゲバラ
すいません、大して知りもしないで引用しました。好きなんですよ、この言葉。
さておき、これからプログラミングの学習するにあたって、何を学習するか悩んでいる方も多いのではないのでしょうか。どんなエンジニアになろうとするかにもよりますが、ここでは未経験者が共通して学習すべきものを整理して説明できればと思います。一般論ではありますが、何かの参考になれば嬉しいです。
尚、ここではデザイナやディレクタは想定しておりませんので、予めご了承ください。(デザイナは範疇外ですが、ディレクタについてはどこかで触れたいと思います)
コンピュータ、システムの基礎学習(座学)
システム開発では実践が最も効率的な学習方法ではありますが、とはいえ、まったく知識のない状態では実践していることが理解できず、致命的な過ちを引き起こしたり、大変非効率だったりします。最低限の座学をおさえることで、効率的な実践の手引になります。
IT には基本情報技術者という資格があります。非常に人気の高い資格でもあり、新卒一年目のエンジニアが取得することを推奨している会社もよく見かけます。基本情報技術者試験の試験範囲は広く、情報理論、ハードウェア、ソフトウェア、ネットワーク、セキュリティ、システム開発、情報戦略など多岐にわたります。IT も歴史があり、確立した技術でもあるので、個人的に基本情報技術者試験の参考書を読むことを推奨しています。ただ前述の通り、多岐にわたり過ぎているので、業務上重要な部分を優先的におさえるとよいでしょう。業務に直結する分野は以下の通りです。
- プログラム(言語やアルゴリズム)
- システム開発
- データベース
- ネットワーク
- セキュリティ
但し、この前提として、まず PC の基本的なことについては予め頭に入れておいたほうがよいです。ハードウェア、ソフトウェア、OS、CPU、メモリが何か簡単に理解しておきましょう。「pc 基本用語」のように検索すると、いろいろと記事が出てきますので、本格的な勉強をする前に確認することをオススメします。
尚、座学は根詰めると退屈でいやになってしまうので、実技と並行してコツコツと積み重ねるつもりで理解を深めてください。即効性は低いのですが、一通りの IT 知識を広く、深めることは後々役に立ってきます。実際僕のようなゼネラリストタイプのエンジニアは知識に助けられる場面も多く体験してきました。また、IT の進歩は目覚ましいものではありますが、基本的な技術は不変なので安心して学習を進めてください。
上記優先分野が大方理解できたらあとは好みで学習を進めると尚よいでしょう。但し、注意してほしいのは、2進数やビット演算、回路、CPU の突っ込んだ内容は、数学が得意でない限り避けましょう。情報処理技術者試験の挫折を生み出す大きな要因となるのはこれらの数学的知識ですが、なぜかそれら最も理解し難い、難解な数式が前半の章に密集しています。それらは本当に受験するときに本格的に読めばよいので、一旦脇に置いておきましょう。
尚、オススメの参考書は、きたみりゅうじさんが書かれた「基本情報技術者」です。非常にわかりやすく、網羅性も高いので、僕も愛用しています。この本に限らず、この分野の本は、かなり分厚く重たいので、タブレットをお持ちの方は電子書籍での購入をオススメします。通勤時間なども有効になるでしょう。
おっと、ここまでのお話の大前提として、まず後述するプログラミングの学習を少し始めてほんの少しでも感触がある場合に座学を始めましょう。プログラミング自体が肌に合わないとなると座学はもうただの苦痛となります。苦痛となることを無理やり押し通してまで SE を目指すのではなくて別のキャリアを検討してもよいと思います。但し、最初に書いたように実践一本槍でも限界があるので、プログラミングの習得に詰まったり一段落したら座学を進めるとモチベーションが維持できてよいです。
プログラミング言語
目指すタイプが Web エンジニアであれ、アプリケーションエンジニアであれ、必須となるプログラミング言語があります。HTML、CSS、JavaScript の 3つです。前者 2 つは厳密にはマークアップ言語ですが、いずれにしても必須なのでここで紹介します。
これらは Web システム(ブラウザを介して利用するシステム)において避けて通れません。また、ほぼすべてのシステムの基礎となります。HTML はブラウザの画面描画、CSS は HTML のデザインをサポート、JavaScript は画面に動きをつけるものになります。3つうち、JavaScript は様々な背景から一時期不遇の時代を送ったものの、現在ではモダンな開発現場では必須の地位に返り咲いています。 HTML や CSS のように「できて当たり前」というわけではありませんが、JavaScript に触れずにキャリアを積むのは難しいでしょう。
実際の学習は最終的に無難なところで、書籍が望ましいですが、まずは Progate などプログラミング学習向け Web サービスを利用して感触を掴んでみてください。無料でも基本的なコースは受講可能です。まずは無料枠で進め、続けるモチベーションがあればそのまま有料に切り替えるか、書籍を購入することをオススメします。尚、書籍購入の注意点ですが、中古本はやめましょう。プログラミング言語にはバージョンというものがあり、日々改良を重ねられています。古い書籍だとバージョンが古い前提で説明されており、現在ではインストール不可能、或いは新しい OS では動作しない、などあるためです。中古でも最近出版されたものであればよいのですが、そのへんの判断も込みで、新品を購入することを推奨します。
但し、上記 3つについては、(例外的にではありますが)すぐにバージョンが新しくなる可能性は低いので、例えば、HTML であれば HTML 5、CSS であれば CSS3 の書籍を選択するのがよいのですが、これらはひとつの本に集約されていることが多いのでどうせならそちらにしましょう。尚、JavaScritp は現在あまりバージョンを気にする必要はないので、Amazon などで直近 2年以内販売され、かつ高レビューのものを選びましょう。
ちなみに僕が未知の技術・言語を習得する場合、書籍購入パターンはこんな感じです。
- 「猿でもわかる」「超入門」みたいな最もハードルが低い初心者向け書籍を購入
- その技術の機能を一通り網羅した中級者向け書籍を購入
- 実務でさらに高度な使用が必要な場合はほとんど説明のないリファレンス本を購入
最後については古い、或いは枯れた技術[1] … Continue readingに限ります。モダンな言語については技術的な移り変わりが激しく、書籍を購入してもすぐ役に立たなくなるため、公式のドキュメントを参照するようにしています。
上記の学習が概ね千秋楽を迎えたら、もうひと押し、サーバサイド言語をひとつ選択して学習しましょう。
「えっ、まだやることあるの!?」
と思った方、ごめんなさい、ここまで初級者コース折返し、くらいです。
「俺はゲームプログラマになるんだから、サーバなんざ関係ねぇ!あとは Unity でゲーム作るぜ!」
と思った方、もし、それがソーシャルゲーム、スマホゲームだとしたら、ごめんなさい。サーバの知見は必要です。もし、コンシューマゲームだったとしても、現在はゲームをアップデートすることが当たり前で、配信するのはサーバになりますし、仮に完全に通信をしないゲームやソフトを作るとしても、デバイスから入力を受け付けてそれに対応して動くプログラムを作る以上、サーバの知識はあるに越したことはありません。組込み(家電製品を制御するソフト)でもネットワークに繋がる時代ですので、SE にサーバ開発の知識は必須だと考えてください。
それでは具体的なサーバサイド言語とはなんでしょうか。それは星の数のようにあります。すでに何かしらの動機があって、学習する予定の言語があればそれを選択して進めて構いません。言語が多すぎてよくわかんない、という方は
- PHP
- Ruby
- Python
のいずれかにするのがよいでしょう。上から順に、現在求人数が多いものです。PHP、Ruby については「もうすぐ消えゆく言語」などとネットでの噂がありますが、ガン無視してよいです。流行に敏感な一部のプログラマがそう揶揄しているだけで、少なくとも国内では当面需要はなくなりません。かたや Python は AI 分野での実質的な必須言語ということで大変な注目が集まってますが、体感的に需要はまだ少ないと申しますか、専門家が集まってしまっている、といった印象です。逆に AI 分野への参画を視野に入れている人はこの時点から始めるのもよいと思います。
上記以外に有名なところで、C、C++、Java、C# などありますが、入社・転職したい会社が推進している、などの理由がない場合は学習を見送りましょう。特に C言語は初学者殺し・致死率100%を誇る難解言語です。絶対にやめましょう(素晴らしい言語なのですが…)。
ここでゲームエンジニアを目指す方に補足しておきます。まず、ゲーム制作に携わる方は C# が実質必須になるかもしれませんが、オブジェクト指向の概念を理解するには上記 3つでも可能です。はじめから C# でもよいのですが、学習が難航する場合は上記も検討してみてください。ゲームでなくともスマホアプリエンジニアを目指す方は Swift (iOS)、Android Java(Android) の学習が必須ですが、初学者の状態でネイティブアプリ(インストールして使うソフトウェア)の学習はハードルが高いのでその点はご注意ください。
各種ツール
SE はプログラミング言語のみを取扱うわけではありません。プログラムがアクセスする DB[2]DB:データベース(database)=データを格納するシステムのこと。なぜか慣習的に「でーびー」と発音するを構築したり、プログラムを起動・制御したり、プログラム自体を管理したりします。それらを実現するツールの中で実質的に必須な技術について紹介します。
まず、DB ですが、これはプログラムの習得で必ず用意するように書かれているのでイメージはつきやすいかと思います。但し、多くの書籍では SQLite という実際の開発では使われない DB を利用することが多いので注意が必要です。また、DB のデータを操作する SQL[3]SQL:Structured Query Language の略。DB においてデータを操作する言語も SE には必須なので前述の基本情報技術者試験の参考書などで理解しておきましょう。DB については書籍も無数ありますが、専門家にならない限り書籍は不要です。インストールの仕方、プログラムからのアクセスの仕方、SQL が一通り(検索、登録、更新、削除)投入できるようになる程度で OK です。尚、DB の製品でオススメはダントツで MySQL です。需要が最も高く、無料のため、個人利用するにもハードルが低いというのがその理由です(あとロゴがかわいい)。
プログラムのインストールやセットアップはコマンドラインを使います。Windows ではコマンドプロンプト、Mac ではターミナルと呼ばれるものから投入します。実際に稼働しているシステムの大半は Linux と呼ばれる OS で稼働しており、多くの場合はマウス操作ができず、フォルダの移動や作成、ファイルのコピーなどもすべてコマンドで実行します。これらのコマンドについても簡単に学習する必要があります。Windows のコマンドを業務で頻繁に使う機会は少ないのですが、環境変数、相対パス・絶対パスなどの考え方についてはどの OS でも共通なので理解しておきましょう。
プログラムの管理は VCS(Version Controll System:バージョン管理システム)を使います。これはプログラムの差分を保持し、開発中の状態を保存したり、問題が発生した場合にある地点に戻すことができます。代表的なものは Git です。Git は事実上の開発標準ツールであり、ほとんどの実務で利用されています。プログラムの学習に GitHub(Git を拡張したサービス)を利用しながら進めると理解が早く非常にオススメです。
そのほか、エクセル、ワードなどの Microsoft 製品、Google アプリ各種(特に Gmail、Google Drive、Meet)、チャットツール(Slack が圧倒的に多い)などは他の職種同様頻繁に使いますが、かなりの頻度で使うので勝手に慣れます。現時点では特にアクションは必要ありません。
長くなったのでまとめます。
これから SE を目指す人のロードマップとして以下を推奨しています。いずれも並行しながら進めることで理解が深まるのでオススメです。
- コンピュータ、システムの基礎学習を学習する
- まずは PC の基本についてネットで調べる
- Progate などでプログラミングの感触を掴んだら、基本情報技術者試験の参考書を以下を優先して読み進める
- プログラム(言語やアルゴリズム)
- システム開発
- データベース
- ネットワーク
- セキュリティ
- プログラミング言語を以下の順に学習する
- HTML
- CSS
- JavaScript
- サーバ言語ひとつ(指定がなければ PHP)
- 利用頻度が高い技術を習得する
- データベース(指定がなければ MySQL)で SQL を理解する
- ターミナル、またはコマンドプロンプトの使い方を理解する
- Git(GitHub) でバージョン管理について理解する
上記が一通り理解できるようになると、SE への道は目前です。あとは仕上げにより実践的なモノづくりができるようになれば完成です。そのへんについては別の機会で話をします。
脚注