にわかプログラマ学生がWEBエンジニアとして働き始めるまでにおすすめしたい2つのこと

# はじめに
去年まで大学留年にわかプログラマだった僕が新卒でWEBエンジニアになり9ヶ月目になりました。
今思えば入社までにこれやっとけばよかったな、あれはやっておいてよかったなと思ったことがいくつかあります。
当時の僕のような方のアドバイスになればいいなと思い、今回記事を書きました。

### 対象読者
以下の３つにAND条件で当てはまる方に特におすすめしたいです

- プログラムを書く**エンジニアとして内定**をもらっている
- 授業などでプログラミング・コンピューターを勉強したことがなく、プログラミング歴は数ヶ月の**にわかプログラマ**
- 入社までにエンジニアとして働くために何かしら**準備しておきたい**

参考：筆者の環境[^1]

# 結論
以下の２つを入社までに行うことをおすすめします！ 

  * 業務で使う予定の言語・フレームワーク・ツールを多少使えるようになる
  * ひたすらコンピューターの仕組みをインプット


# 結論に至った思考回路
コードを書いたりコンピューター(ソフト)をいじる能力を高くしたい！

↓

そのためには **作りたいものをきれいなコードで作れて、トラブルが起きても対処できる** ようになる必要がある。言い換えると以下のことはできるようになりたい。

* プログラム・フレームワーク・必要なツールを用いて作りたいものを作ることができる
* あとから変更しやすい・読みやすいコードを書ける
* どこでトラブルが起きたか分かる
* トラブルを解決し・再発を防止する

↓

入社までに対象読者は**一人でもできること**をやればいいはず！(MENTAなどのサービスでメンターに教わるのもいいかも知れません。使ったことないですが)

# 【本題】入社までやっておくといいと思うこと
### 業務で使う予定の言語・フレームワーク・ツールを多少使えるようになる
まず**思った通りの動作をするプログラムを書く**ことができるように頑張りましょう。これは一人でもある程度できます。
何をすればいいか分からない場合は、[ドットインストール](https://dotinstall.com/)・[Progate](https://prog-8.com/)等で文法を学んで、[AtCoder](https://atcoder.jp/?lang=ja) のABCコンテストの[A,B問題](https://atcoder.jp/contests/abs/tasks/abc086_a)、[Paiza](https://paiza.jp/works/mondai)などで問題を解いてみるなどしてもいいと思います。

2つ目に**フレームワークを使う**ことができれば、システムを作りやすくなります。
入社するまでに業務で使うフレームワークの基本的な機能を理解しておくと良いと思います。難しい機能は働いてからでもいいと思いますが、基本的な使い方を知っておけばスムーズに業務に参加できるはずです。
とはいっても全くの初心者がチュートリアルをただコピーするだけだと仕組み良くわからないと思うので、おすすめの進め方も紹介します。

1. チュートリアルは章で区切られているはずなので、まずは**1章を丸コピして動くのを確認**します。ここで動くのを確認しないとこれ以降どこが間違っているか検討がつきにくくなってしまうので必ず動くのを確認します(実際には丸コピしても動かなくて途方にくれることもあると思いますが、そこは頑張るしかないです)。
1. 少しずつ書いたコードを変えてみましょう。思い通りに動いたり、エラーが出たりすると思うので、エラーが出たら動いたところまで戻ってまた値を変えます。
1. わかったことをメモしておきます。[Notion](https://www.notion.so/)やテキストエディタ([Atom](https://atom.io/)など)に記録するといいと思います。
1. 十分いじったら2章に進み、2,3を行い、次は3章...と進めて行きます。


3つ目は**必要なツールと書きましたが、主に[Git](https://git-scm.com/)**をイメージしてます。
Gitとは、ざっくりいうとある程度書いたコードを保存して、いつでも保存した状態のコードを復活させられるツールです(初心者向けの記事のためコミットなどの用語はここでは使いません)。
実際にはGit以外にもコードを保存するツールがあるので、会社で使うツールを聞いてみてください。
ProgateにGitのコースがあるそうなので、Gitの基本的な使い方を学んでから、Gitを使いながらフレームワークのチュートリアルを進めてもいいかもしれません。
例えば、チュートリアル1章が動いた時点で保存して、少しいじってみて新たな発見があったらその時点で保存するみたいな使い方ができそうですね！


### ひたすらコンピューターの仕組みをインプット
対象読者が入社までに色々なトラブルを解決できるようにはなるのは難しいと思います。
しかし、**どこでトラブルが起きたか分かるようになるための準備**はできます。
その方法は**コンピューターの仕組みの理解**だと思います。トラブルが起きたときに何が起きているか分からなければ解決しようがありません。
というわけで、入社する前にひたすら**コンピューターの仕組みをインプット**しておきましょう。そうすれば働き始めてからじわじわと役に立ってくるはずです。

仕組みの理解への第一歩として**IT系の資格**を取得するのがおすすめです。例えば基本情報技術者試験が有名ですね。筆記・選択問題の資格であれば、実務経験がなくてもただ暗記をすれば取得できます。
僕は4月に入社した前年の10月に基本情報技術者試験を合格したので、一応参考としてどうやって勉強したかを簡単に紹介します。

1. まずは市販の適当な教科書を買いました。
1. n進数の変換やちょっとして四則演算の問題は解きながら、それ以外は気になる部分をネットで調べつつ読み進めました。
1. 試験が迫ってきたら過去問をひたすら解きまくりました。僕が受けたときは基本情報技術者試験の午前問題の6割くらい？が過去問から出題されていたので、全部解くくらいの**気持ち**で[過去問道場](https://www.fe-siken.com/fekakomon.php)で勉強しました。

ここまでで資格、特に基本情報技術者試験をおすすめしましたが、これはIT関連の知識を浅く広く知る感じなので、自分の興味の持った箇所は随時**本やネットで満足するまで調べる**のがおすすめです。
繰り返しになりますが、トラブルが起きたときは仕組みを理解している方がより早く解決できるので、分からないことはどんどん深く調べて、業務に備えると良いと思います。
僕の場合、初心者向けのTCP/IP、HTTP、コンピューターの仕組みの本など[^2]読んでよかったなぁと思っています。
僕が内定を頂いた時点は、なぜブラウザにURLを入力したら画面にサイトが表示されるのもが全くわからない状態でした。もしこの記事を読んでる方が同じような状態ならば参考になるかと思います。


# 入社してからやればいいこと
ここはおまけです。結論に至った思考回路で列挙した能力のうち、入社前に一人で高めるのは難しいと思ったものを理由付きで紹介しています。

### あとから変更しやすい・読みやすいコードを書けるようにする
これは一人で練習しても大して伸びないのかなと思います。
なぜなら対象読者が個人で開発しようとしても、**規模が小さい**＆**入力のパターンが少ないため考慮するパターン少ない**＆**読みやすさを意識しなくてもよい**からです(もちろんいずれも一人で開発する場合でも必要ですが、妥協できちゃいます)。

一方、実際のプロジェクトでは先輩・上司が個人では難しい規模のプログラムを複数人で書いています。そのため、先輩・上司が書いた既存のコードを読んでこんな感じに書けばいいのかと学んだり、自分の書いたコードを読んでもらってアドバイスを貰うことでこの辺の力はついていくのかなと思います。

### トラブルを解決し・再発を防止する
大きなトラブルが起きるようなプロジェクトを対象読者が入社までに立ち上げるのは難しいかと思うので、これも入社までに高めにくい能力だと思います。
一応例としてあげると、トラブルはユーザー情報の流出、サーバーが落ちるなどかと思います。
これも入社してから学べば良いと思います。


[^1]: 農学部出身。授業・研究では四則演算、たまに統計(t検定、正直理解せずに使っていた)を使うくらい。内定もらった時点でプログラミング歴1日平均1.5時間×4ヶ月くらい。最後の数学は大学1年生の教養科目(中身は全く覚えていない)。コンピューター・Webの仕組み全然わからない。

[^2]: この辺の本がいい感じでした。[ネットワークはなぜつながるのか](https://www.amazon.co.jp/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC2%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84TCP-IP%E3%80%81LAN%E3%80%81%E5%85%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%90%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E6%88%B8%E6%A0%B9/dp/4822283119)、[コンピュータシステムの理論と実装](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E2%80%95%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-Noam-Nisan/dp/4873117127)