varエンジニアブログ

株式会社varのエンジニアブログです。IT初心者から中級者までが楽しめる内容を投稿しております。

Git入門 【初級編】

1. Gitとは

1-1. Gitを使うメリット

  • 複数人で同じファイルを編集する際に効果的。 (集団開発)
  • 過去の状態に戻るために必要


1-2. リポジトリとは

  • 開発対象のデータが全てまとまっているデータベースのようなもの。
    リモートリポジトリローカルリポジトリが存在する。

  • 「リモートリポジトリ」→ 他人と共有して使用する、開発における要となるリポジトリ
    GitHubとGitLabの2種類が存在し、用途によって使い分ける。

  • 「ローカルリポジトリ→ 自分の開発環境上のみに存在する、自分だけが触れるリポジトリ


言葉だけだとなかなか理解しづらいので、下の図を見てみましょう。

f:id:Futaa:20210201101417p:plain
リモートリポジトリとローカルリポジトリの関係

このように、リモートリポジトリとローカルリポジトリは上図のようなCopyとUploadの関係で成り立っています。リモートリポジトリから開発対象のデータを自分の開発環境であるローカルリポジトリにCopy、そして自分の開発環境で追加や修正のコードを書いてそれをリモートリポジトリにUploadするのです。

本来ならCopyやUploadにはGitの専門用語があります。


1-3. 2種類のリモートリポジトリ

前項では、リモートリポジトリには2つの種類が存在すると説明しました。
GitLabGitHubです。これらの違いについて確認しましょう。

GitLabは主に企業における集団開発において使用されるリモートリポジトリで、有料です。
一方、GitHubは全世界にソースコードを公開することができる一般向けのリモートリポジトリで、無料です。そのため、例えばRailsで作ったwebアプリケーションのソースコードを参考にしたい場合はGitHubで検索して、他人の書いたソースコードを見ることができます。また、自分の作ったポートフォリオなどの作品をGitHubに公開し、他人に見てもらうこともできます。
ただし、自分の作品を公開する際はソースコードMySQLなどのパスワードが記載されていたり、秘密鍵も同時に公開対象にしてしまうのはセキュリティ上大変危険な行為です。注意しましょう。



2. 超重要! Gitの概念「BranchとCommit」

2-1.Gitを支える重要な2つの概念

Gitを使うことで得られるメリットに関しては前章で説明しました。覚えていますか?
もう一度振り返ってみましょう。

  • 複数人で同じファイルを編集する際に効果的。 (集団開発)
  • 過去の状態に戻るために必要

この章では、2つ目の「過去の状態に戻るために必要」ということに関して深く触れていきたいと思います。この機能を支える2つの概念は、Gitを扱う上で大変重要なものとなってくるので、ここで理解しておきましょう。

  • 「Branch」 → 開発成果の履歴を1つの線で表したもの。枝に似ていることからBranchと呼ばれる
  • 「Commit」 → Branch上に存在する開発成果の1つ1つを表す。Branchはこれが複数存在することで成り立つ



3. 実践! Gitに触れてみよう

これまでの章ではGitとはどういうものなのかについて説明してきました。しかし、これらの説明をより深く理解するには実際にGitを触ってみるのが一番です!
この章では、自分のPC上に作業ディレクトリを作って、実際にいくつかCommitを作成してみましょう。その上で、Branchの変化の様子についても見ていきます。

まずは、sampleというディレクトリを作り、それを作業ディレクトリにします。
以下のコマンドを打ってください。

$ mkdir sample
$ cd sample
$ git init

git initコマンドを使うことで、カレントディレクトリを作業ディレクトリとすることができます。
今回はsampleがカレントディレクトリなので、sampleは作業ディレクトリとなりました。

それでは、作業ディレクトリの中で作業をしてみましょう。
今回は試しにsample.txtというファイルを作成し、編集することでgitを体験していきます。以下のコマンドを打ってください。

$ touch sample.txt

touchコマンドを使うことで、空のファイルを作成することができます。

sample.txtが作業ディレクトリに追加されたことで、gitの状態が変化しました。
以下のコマンドを打って、gitの状態を確認してみましょう。

$ git status

きっと以下のような文章が表示されたと思います。

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        sample.txt

nothing added to commit but untracked files present (use "git add" to track)

「Untracked files: 以下のファイルはインデックスに追加されていないのでCommit出来ませんよ」ということを表しています。
つまり、Commitをする前に、インデックスにファイルを追加してあげないといけないのです。

インデックスにファイルを追加しましょう。以下のコマンドを打ってください。

$ git add .

addの後ろの「.」カレントディレクトを表すものです。上記のコマンドで、インデックスにsample.txtを含むカレントディレクトリのファイルを追加することが出来ました。

これで、ついにCommitをすることが出来ます。早速やってみましょう。
以下のコマンドを打ってください。

$ git commit -m 'ver1.0 最初のコミット'

上記のコマンドでCommitをすることが出来ました。 Commitされているか確認するために以下のコマンドを打ってみましょう。

$ git log --graph

上記のコマンドを打つと、「ver1.0 最初のコミット」と表示されたと思います。
一番上のアルファベットと数字の羅列はハッシュ値です。

余裕があれば、sample.txtを編集→インデックスに追加→Commitを繰り返してみましょう。
以下のコマンドを2~3回繰り返して、Branchの変化の様子を見てみます。

$ vim sample.txt
※文字を入力&編集してみましょう。
$ git status
$ git add .
$ git commit -m '説明文'
$ git log --graph


これにてGitの実践は終了です。お疲れ様でした!!



4.最後に

今回はGitについて、その基礎となるものを学んでいきました。

古里塾ではこのようなハンズオン形式を含めた授業を月に8回、ライブ講義にて行っています。
興味のある方、そして価値のあるエンジニアになりたいという方は古里塾のHPをご覧ください。 furusatojuku.site


また、varエンジニアブログの管理人 古里栄識のLine@では以下の内容を発信しています。
(2020年12月時点:登録者数750名)

  • おすすめのプログラミング言語
  • 初心者がやりがちな意味のない勉強法
  • おすすめの優良記事
  • 簡単な質問対応

特に、勉強方法について困っていることがあれば質問してみるのもお勧めです!
以下の URLから古里栄識のLINE@を登録できます。
https://landing.lineml.jp/r/1654804352-xmngLnqd?lp=Ld9S5W

ブルートフォース攻撃を体験してみよう

0.読む前に準備して欲しいものと注意事項

今回は自分の用意したサーバーに対して ブルートフォース攻撃 を仕掛けます。
ブルートフォース攻撃に関しては後ほど詳しく説明します。
したがって、事前に準備するものと、必ず守って欲しい注意事項があります。

①.用意する環境

  • Ubuntu 18.14 LTS 環境のサーバー

    下記の記事を参考に、AWSのEC2インスタンスを用意するのも良いと思います。
    ※その際はSSHをパスワード認証に設定するのを忘れないでください。

engineering.var.co.jp

②.注意事項

  • 本記事で紹介した内容の実践は、自分の用意した環境内のみ で行ってください。
    他人のサーバーに攻撃を仕掛けるのは犯罪であり、法で罰せられます。



1.ハッキングとは


パスワード認証などを採用しているシステムに対して総当たり攻撃をすることを
ブルートフォース攻撃 と言います。

今回はブルートフォース攻撃を通して、クラッキングの怖さとセキュリティの大切さについて、実践を通して学んでいきましょう!



2.ブルートフォース攻撃を仕掛ける準備をする(攻撃準備編)

今回はブルートフォース攻撃を仕掛けるために使うツールをダウンロードするのですが、ネット上に公開されているツールは攻撃用途に使うためではなく、 「自分の環境を守るため」 に使用するものです。セキュリティ上の脆弱性がないかを、攻撃を通して実際に確認していくのです。

まずはパッケージ管理ツールを更新します。以下のコマンドを打ってください。

$ sudo apt update

「apt」とは、Ubuntuにおける パッケージ管理ツール です。Apache, MySQL, Firewalldなどの有名なソフトウェアやツールは「apt」を使ってインストールします。CentOSAmazon Linuxには「yum」という別のパッケージ管理ツールが存在します。様々な場面で使用するので、覚えておきましょう。

更新が完了したら、早速ブルートフォース攻撃に使うツールをインストールしていきます。
以下のコマンドを打ってください。

$ sudo apt install hydra

「hydra」はブルートフォース攻撃を行う際に使うツールです。
インストールが完了したら以下のコマンドを打って、hydraの説明文を見てみましょう。

$ hydra

英語で「hydra」に関する説明が書かれていますね。興味のある方は是非読んでみてください。
なお、一番上の文は注意書きで 「軍事や機密組織内、及び法に反するような用途で使わないでください」 と記されています。そういった目的で使うのは絶対にやめましょう。


さて、準備段階もこれで最後となります。
今回はパスワードの候補が多く書かれているテキストファイルを元に、ブルートフォース攻撃を仕掛けます。github上にあるサンプルファイルをダウンロードしましょう。
まずはホームディレクトリ上に「samplefiles」というディレクトリを作成し、その中にサンプルファイルをダウンロードします。ホームディレクトリに戻ってから、以下のコマンドを打ってください。

$ mkdir samplefiles
$ cd samplefiles
$ wget https://raw.githubusercontent.com/danielmiessler/SecLists/master/Passwords/Common-Credentials/500-worst-passwords.txt

wget」とは、 指定したURLのファイルをダウンロード するのに使用するコマンドです。

以上で攻撃するための準備は完了です。
続いて、被害対象となるユーザーを作成していきます。

3.ブルートフォース攻撃を仕掛ける準備をする(被害準備編)

では、攻撃されるための準備をしていきます。
まずはユーザーを作成しましょう。以下のコマンドを打ってください。
ユーザー名は各自で決めてください。その際、出来るだけ長めの名前にしてください。

$ sudo useradd -m -s /bin/bash ユーザー名

すると、今使っているユーザーのパスワードが聞かれるので入力してください。


useraddに使用するオプションについて、1つ1つ解説していきます。

  • 「-m」とは ユーザーの「ホームディレクトリ」 を作成するために付けるオプションです。
    「ホームディレクトリ」はユーザーがログインする際に毎回最初に訪れるディレクトリです。
    cdコマンドを使う際にも特に何もパスを指定しなければ、ホームディレクトリへ移動します。

  • 「-s」とは ユーザーが使用するシェル を指定するためのオプションです。
    「シェル」は ユーザーとカーネルの間の一連のやり取りを仲介 するためのものです。
    ユーザーは直接カーネルに命令したり、処理結果を聞くことは出来ないのです。
    また、「bash」の他にも「sh」や「zsh」など様々なシェルが存在します。


次に、作成したユーザーのパスワードを設定していきます。
パスワードは先ほど攻撃側サーバーでダウンロードしたサンプルファイルの中から、好きな単語を選択しましょう。
では、vimコマンドを使ってサンプルファイルの中身を確認します。

$ vim 500-worst-passwords.txt

パスワード一覧の候補が表示されたと思います。この中から好きな単語を決めてください。
早めに実践を終わらせたい方は比較的上にある単語を選ぶのがお勧めです。


では、確認が終わり次第攻撃側で開いているvimを閉じましょう。

:q!

「q」に「!」を付けると、 保存せず強制終了 することを意味します。うっかりインサートモードで文字を改変してしまった時には、コマンドモードでこのコマンドを入力しましょう。


決めた単語を元に、作成したユーザーにパスワードを設定します。

$ sudo passwd ユーザー名
New Password: サンプルファイルに書いてあった好きな単語

脆弱なパスワードを設定したユーザーを作成出来ましたね。
準備はこれにて終了です。お疲れ様でした!少し休憩しましょう。



4.実際にブルートフォース攻撃を仕掛けてみる。

準備が出来たところでいよいよ「hydra」によるブルートフォース攻撃の実践です。
今回は自分のサーバーから自分のサーバー自身に攻撃を仕掛けます。

早速以下のコマンドを打ちましょう。攻撃が始まります。

hydra -l 攻撃されるユーザー名  -P 500-worst-passwords.txt ssh://localhost

コマンドの詳細について説明する前に、実際にどのように攻撃しているか見てみてください。
しばらく時間が経てば以下の文章が表示されるはずです。

[22][ssh] host: localhost  login: 攻撃対象のユーザ名  password: 攻撃対象のユーザーのパスワード
1 of 1 target successfully completed, 1 valid password found

以上の内容が表示されればブルートフォース攻撃が成功したことになります。


「-l」はユーザー名、「-P」は参考にするファイルを選択するオプションです。
今回は自分の作成したユーザーを対象に、サンプルファイルを参考にして攻撃しましたね。
localhost」とは、自分のサーバー自身 を意味する言葉です。
指定したことにより、自分のサーバーから自分のサーバー自身に攻撃をしました。


以上で実践は終了となります。今回実践したことを元に、どうしたら自分のサーバーを守れるかについて次項で考えていきましょう。



5.どうやったら自分のサーバーを守れるか考えてみる

ブルートフォース攻撃を実践したことで、その恐ろしさを実感出来ましたか?
このようにパスワードの設定が甘いと、他人から簡単に侵入されてしまうわけです。
では、我々のサーバーはどのようにして守っていくのでしょうか。自分自身で考えてみましょう。
考え終わったら下にスクロールしてくださいね!







いくつか思いつきましたか?
では、どのようにして守っていくのか。その対策方法についていくつか確認していきましょう。

  • 公開鍵認証のみを使用する (そもそもパスワード認証を採用しない)
  • パスワード自体を難しいものにする
    最低8桁。キーボードの配列(1234...etc)や、よくある単語(testや人の名前 etc...)は使わない!

  • SSHのポート番号を変更する (22 → 違う数字へ)

  • 「fail2ban」 をインストールする
    事項では最後に、この「fail2ban」について詳しく説明します。



6.「fail2ban」をインストールしてみよう

これまでに私たちはブルートフォース攻撃の怖さを体験し、その対策方法について考察しました。
一番早いのはそもそもパスワード認証を採用しないことですが、それは環境によってはなかなか難しいですよね。
しかし、パスワードを難しいものにしたり、SSHのポートを変更したとしてもいつかは侵入されてしまう可能性があります。
そこで、上記2つの対策に加え「fail2ban」という対策ソフトウェアをインストールして更に強固なサーバーにしていきます。まずは実際に、「fail2ban」をインストールしましょう。

$ sudo apt install fail2ban

インストールできたら「fail2ban」の設定を新たに作成します。
以下のコマンドを打ってください。

$ sudo vim /etc/fail2ban/jail.local

何も書いてない新しいファイルが作成され、編集画面になると思います。
以下の文章をコピペしてください。

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.*
maxretry = 6

設定の内容について簡単に解説します。

  • 「enabled = true」は この設定を有効にする という設定
  • 「port = ssh」は sshのポートを監視 する設定
  • 「filter = sshd」は ログファイルの中でsshdと書いてある行を参考にする という設定
  • 「logpath = /var/log/auth.*」は どのログファイルを参考にするか という設定
  • 「maxretry = 6」は 6回失敗したらログイン元IPアドレスファイアウォールによってブロックされる という設定


以上で「fail2ban」の導入は完了です。
余裕のある方はサーバーをもう1台用意して、「fail2ban」が入っている方のサーバーに先程と同じ手順で攻撃してみてください。途中でファイアウォールによってブロックされ、「hydra」による攻撃が失敗します。


攻撃側のIPアドレスがブロックされたことを確認するには、以下のコマンドを被害側サーバーで打ちます。

$ sudo iptables -L

すると、攻撃したサーバーのIPアドレスREJECT されているのが確認できます。
このように、「fail2ban」を導入すると ブルートフォース攻撃による複数回のアクセスを無効化する ことができます。

以上で本記事の内容は全て終了しました。お疲れ様でした!



6.最後に

今回はブルートフォース攻撃の恐ろしさと、その対策方法について実践を通して学べたかと思います。本日学んだことを参考に、今後の勉強やセキュリティ対策に役立てて頂けると幸いです。

古里塾ではこのようなハンズオン形式を含めた授業を月に8回、ライブ講義にて行っています。
興味のある方、そして価値のあるエンジニアになりたいという方は古里塾のHPをご覧ください。 furusatojuku.site


また、varエンジニアブログの管理人 古里栄識のLine@では以下の内容を発信しています。
(2020年12月時点:登録者数750名)

  • おすすめのプログラミング言語
  • 初心者がやりがちな意味のない勉強法
  • おすすめの優良記事
  • 簡単な質問対応

特に、勉強方法について困っていることがあれば質問してみるのもお勧めです!
以下の URLから古里栄識のLINE@を登録できます。
https://landing.lineml.jp/r/1654804352-xmngLnqd?lp=Ld9S5W

AWSのEC2に触れてみよう

1.EC2とは

  • AWS上に立てることのできる仮想サーバーマシンのこと。
  • 1つ1つの仮想サーバー単位を インスタンス という言葉で表します。


今回はEC2を用いて仮想サーバーを実際に起動し、サーバーに触れていきましょう!

2.EC2インスタンスの起動から立ち上げまで

今回はUbuntu Server 18.04 LTSの64bitを選択することにします。

Amazonマシンイメージ(AMI)の選択

AMI とは、EC2の仮想マシン上で使うサーバーOSや、その中でもLinux系だとディストリビューションを使うために必要なファイルシステム一式のイメージのことを指します。
例: Windows Server, Ubuntu, CentOS など

今回は上の検索欄「Ubuntu」と検索をし、Ubuntu Server 18.04の64bit版を選択してみましょう。

②インスタントタイプの選択

EC2では、自分の描いているサービスの規模に合わせてサーバーのCPUやメモリなどのスペックや、ネットワークのパフォーマンスを既定のタイプから選ぶことができます。ベンダー(AWSの提供側)によって予めパフォーマンスの高さが決められたものを 「ServiceLevelAgreement(SLA)」 と言います。

今回は無料対象枠である「tc2.micro」を選択してみましょう。
※無料対象枠であっても、その期間が過ぎたり何度もサーバーを立てたりすると料金が発生する場合があるので注意してください。

インスタンスの詳細の設定

今回は詳しく説明しませんが、自動割り当てパブリックIPが 有効 であることを必ず確認してください。無闇にそれぞれの項目を変更することもお勧めしません。

ストレージの追加とタグの追加に関しても今回は特に設定を加える必要はありません。

④セキュリティグループの設定

ここではインスタンス上のファイアウォールに関する設定をすることができます。
セキュリティグループを作成し、設定することで開放するポート番号を変更したり、ポート番号ごとにアクセスできるIPアドレスを予め決めておくことができます。
「ポート番号」 とは、アプリケーションプログラムごとに割り当てられた通信データの出入口です。TCPUDPそれぞれ設定をすることができます。例えばTCPの80番ポートを開けたらHTTP通信が出来るようになり、Apache2などのwebサーバー用ソフトウェアが機能するようになります。逆に、TCP80番を閉じればHTTP通信が出来なくなり、Apache2も機能しません。

では、現状どのような設定がされているのか見てみましょう。
タイプがSSHプロトコルTCP、ポート範囲が22となっていますね。これは、TCPの22番を開けてSSHが利用できるという状態を表しています。 SSH とは、サーバー外部の端末からリモート接続するために使う通信プロトコルのことです。
また、ソースという箇所ではカスタムの0.0.0.0/0と書いてありますね。 「0.0.0.0/0」 は特殊なIPアドレスで、全てのIPアドレスから接続できることを表しています。つまり、この設定をするとサーバーが全世界に公開され、あらゆる場所からアクセス出来るということです。

今回は現状の設定で確認を押し、起動してみましょう。

⑤公開鍵の設定と起動

起動ボタンを押すと、ペアキーの設定画面になったと思います。ここでは私たちがサーバーにログインするために必要な公開鍵を作ります。公開鍵は、 「公開鍵認証」 に使う鍵の1つです。公開鍵認証では2つの鍵を使います。
まず1つ目は私たちが今から作る 秘密鍵 、そしてもう1つはサーバー上に保管される 「公開鍵」 です。公開鍵に対して秘密鍵を照合し、確認することで初めてログインすることが出来ます。したがって、秘密鍵厳重に管理 しなければなりません。

さて、今回は新しくペアキーを作成します。名前は「mytest」にしましょう。
決定すると、「mytest.pem」という秘密鍵がダウンロードされ、サーバーが起動します。



3.サーバーへのログインからパスワード設定まで

サーバーを起動させた後が本番です。きちんと自分の作ったサーバーを使いこなせるようにしましょう。今回はSSHでログインする際、公開鍵認証ではなくパスワードでログインできるよう設定を変更していきます。

①サーバーへログイン

SSHでサーバーへログインします。予めEC2のコンソール上でパブリックIPを確認しておきましょう。
公開鍵でログインする際、公開鍵があるフォルダで行う必要があります。ターミナルで移動しましょう。
Macの場合はDownloadsフォルダにありますね。cdコマンドで移動してみましょう。

cd Downloads

Downloadsフォルダに移動できました。念のため「mytest.pem」があるか確認してみます。

ls | grep -i mytest.pem

mytest.pemと表示されればファイルが正しくダウンロードできています。
では、早速SSHでログインしていきましょう。

ssh ubuntu@パブリックIP -i mytest.pem

無事にログインできたらターミナル画面下に以下のような表示が出ると思います。

ubuntu@パブリックIP ~ $ 

無事ログイン出来たでしょうか。出来ていない方はもう一度パブリックIPと自分の書いたコマンドを確認してみましょう。出来た方はひとまずお疲れ様でした!少し休憩しましょう。

②パスワード認証に変更する

いよいよ公開鍵認証からパスワード認証へ変更していきます。
まずは以下のコマンドでsshdの設定ファイルがあるディレクトリまでいきます。

$ cd /etc/ssh

「etc」には主に 設定に関するファイルやディレクト が存在しています。今回はその中でもsshフォルダにある「sshd_config」というものを触っていきます。まずはlsコマンドでsshd_configがあるかどうか確認してみましょう。

$ ls | grep -i sshd_config

するとsshd_configと表示されるはずです。パスワード認証に変更するには 「PasswordAuthentication」をyes にする必要があります。まずはyesになっているか確認してみましょう。以下のコマンドを打ってください。

$ cat sshd_config | grep -i password

このコマンドではsshd_configを開き、更に「password」というキーワードがある箇所を絞り込み表示させています。勘の良い方は既にお気づきかもしれませんが、 grep は絞り込み検索をする時によく使われるコマンドです。便利なので覚えておきましょう。

さて、「PasswordAuthentication = yes」になっていましたか。恐らくnoと表示されたはずです。
ではsshd_configの中身を変えていきましょう。以下のコマンドを打ってください。

$ sudo vim sshd_config

vimというコマンドを使うことでファイルの中身を編集し、改変することができます。「PasswordAuthentication」がある箇所までいきましょう。
文字を入力するためにはインサートモードにする必要があります。「i」を押しましょう。
すると文字が入力できるようになるので、noをyesに変更します。そして「esc」を押しましょう。
最後に保存してvimは終了です。「:」を押して、その後に「wq」と打ってください。
「w」は write(保存)「q」quit(終了) です。

変更されているかどうか確認してみましょう。もう1回あのコマンドを使います。

$ cat sshd_config | grep -i password

「PasswordAuthentication=yes」になっていることが確認できましたか。

③パスワードを設定する

パスワード認証に変更したとは言え、パスワードが存在しなかったら意味がありませんよね。
そこで、ubuntuユーザーにパスワードを設定していきます。以下のコマンドを打ちましょう。

$ sudo passwd ubuntu

新しいパスワードを入力するよう求められましたね。好きなパスワードを入力しましょう。

さて、先ほどから登場している「sudo」というコマンドが気になりますよね。
「sudo」 とは、コマンドを管理者権限で実行するために使うコマンドです。
先ほどのsshd_configも、今さっき行ったパスワード変更も「sudo」が無ければ実行できません。
使用する機会が多いので必ず覚えておきましょう。

さぁパスワードを設定したのでこれでおしまい! ...と思いきや、実はまだ今のままではパスワード認証が出来ないのです。次項で最後ですのでもう少しお付き合いください。

sshdを再起動する

先ほど設定したsshd_configを反映するには、一度sshdを再起動する必要があります。以下のコマンドを打ちましょう。

$ sudo service sshd restart

上手くいったら特に何も表示されず次のコマンドが入力できるようになります。
ログアウトしてパスワード認証が出来るかどうか確認してみましょう。

$ exit
ssh ubuntu@パブリックIP

パスワードを打ってログイン出来たら、無事設定が完了したということになります。
お疲れ様でした!



4.最後に

自分のサーバーは無事使えるようになりましたか。
余裕のある方はApacheをサーバー内にインストールして、webサーバーを立ててみるのも良いと思います。その時はfirewallの設定とセキュリティグループの再設定も忘れずに!

さて、今回たったこれだけの作業でも、「Linux」や「ネットワーク」の基礎概念に対する正しい理解が求められてきます。普段から基礎を大切に、たくさん勉強していきましょう。

「基礎概念」 に関して詳しく知りたい方は以下の記事をご覧ください。 engineering.var.co.jp


また、varエンジニアブログの管理人 古里栄識のLine@では以下の内容を発信しています。
(2020年12月時点:登録者数750名)

  • おすすめのプログラミング言語
  • 初心者がやりがちな意味のない勉強法
  • おすすめの優良記事
  • 簡単な質問対応

特に、勉強方法について困っていることがあれば質問してみるのもお勧めです!
以下の URLから古里栄識のLINE@を登録できます。
https://landing.lineml.jp/r/1654804352-xmngLnqd?lp=Ld9S5W

USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。
それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」
ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んで見てください。

では、タイトルにもある通り「USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話」を時系列に沿ってしていこうと思います。

これからフリーランスを目指す方、 IT企業に入社を考えているあなたが 自分を重ねながら読んで頂けると楽しめると思います。

序章 なぜこの記事を書こうと思ったのか

フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。

しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。

これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、現在は企業研修やIT塾で数多くの受講生を指導している。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」 私が出した答えは、「量産型エンジニアか否か」である。

今のフリーランス市場には、量産型エンジニアが溢れている!! ここでの量産型エンジニアの定義は以下の通りである。

量産型エンジニアとは、比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。結果として、フリーランスとして活動してもブラック企業案件しか回ってこず、スキルもつかず、思ってたよりも過酷な生活を強いられる。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。

第1章 IT歴0-2ヶ月

「そうだ。フリーランスエンジニアになろう。」 「給料も高いし、フリーランスを目指そう!」

そんな理由からITの世界に身を投げたあなたは最初に何をすべきか?プログラミング言語を学ぶ?IT塾に通う?参考書を買う?

違う!!!

まずは、タイピングだ。これを聞いて、「そんなんできる」と思った人はこの部分を飛ばしてくれて構わない。私が最初にしたことは、オンラインタイピングゲーム寿司打でタイピングすることだった。

当たり前の話だが、タイピングの遅いやつは仕事が遅い。ブラインドタッチができないやつは、話にならない。エンジニアは1日に数万文字を打つこともある。タイピングは絶対に早くないといけない。タイピングもできないのにプログラミングの勉強をしている人は愚の骨頂である。サッカーで例えるならば、リフティングもできないのにシュートの仕方を学んでいるようなものだ。そんなんではいつまで経っても身につかない。

ブラインドタッチができるまでは、参考書を買う必要もない。ブラインドタッチできることがエンジニアとしての超最低レベルだ。

ちなみに、私は「毎日3時間」寿司打をした。1ヶ月半経ったころにはブラインドタッチができるようになっていた。これができない人は、ITは諦めよう。IT以外にもたくさんの仕事はある。わざわざ自分が苦手な領域で戦う必要はないだろう。IT以外にもたくさんの仕事はある。今になって思うが、1日3時間もする必要はなかった。1日1時間もすれば十分だと思う。

タイピングができるようになったら次になにをするか?

次は、プログラミング学習だ。

私はC言語を学んだ。近年は、PythonのようなC言語よりも勉強しやすい言語があるからそちらをおすすめする。(私は当時、Pythonなど知らなかった、それくらい情弱だった。)

なぜ、真っ先にプログラミング言語を勉強するかというと、成長のためにこれが手っ取り早いからだ。最初のうちは、ただの英語の羅列で、何も頭に入ってこない。コードを読んでも何が書いてるか全くわからない。だが、それでいい。毎日プログラミングを勉強して、わからないことが1つずつわかるようになってはじめITの楽しさがわかるようになってくる。学習すべき内容が途方もないほど多くあるように感じて、挫折してしまいそうになったことも何度もある。というか毎日挫折しそうになる。

ここで、この段階にあるあなたに一言、伝えたいことがある。

「あなたにセンスがないわけじゃない」

いきなり失礼なことを言うな!と思うかもしれないが、本当にそう感じる瞬間があなたにもきっとくる。「自分はセンスがない・向いていない」と感じたことのあるエンジニアが大半なのではないか?ちなみに、私は毎日感じている。できる人を見るほど自分の才能のなさに嫌になってしまう。

でも大丈夫。誰しもそうやって成長してきたということを強く伝えたい。そうやって、C言語の本が読み終わるくらいになったときに私は1つの決断をした。「そうだ。MacBookを買おう!」たいそうな理由はない。かっこいいから。エンジニアはみんな持ってるイメージだから。そんな理由で私は電気屋さんに行った。

今になって思うが、この決断は間違っていなかった。本気でエンジニアを目指したいあなたは今すぐMacBookを買ったほうがいい。理由はいつかわかる。信じてくれ。MacBookを手にした私は、感動した。なんと動きが軽いんだ。当時の私は意味もわからずメモリやストレージの増量したカスタム版を購入していた。これもまた今になって思うが、とりあえず高いものを買ったほうがいい。「やる気がでる」からだ。この時期は、これくらいの理由で十分なのである。

さて、こんなことをしているうちに2ヶ月が過ぎた。

第2章 IT歴3-6ヶ月

この頃には、少しずつプログラミングができるようになってきた。超簡単なプログラムなら自分で作れるようになってきた。さて、次に何をやるか。

答えは、「Linux

Linuxがわからない人はまず「Linux とは」でググるとよい。なぜ、私がLinuxに行き着いたかというと「プログラミング 初心者」でググるとそういうことをどこかの誰かが言っていたからだ。間違いない。Linuxシステムをある程度理解することがエンジニアのスタートラインに立つための次のステップだ。

意外とこの部分が抜けている人もいる。講師をしていて思うが、Linuxを理解できている人は成長速度が全く違う。どこの企業とは言わないが、Linuxコマンドもろくに使えない中堅社員が多い所の研修は本当に骨が折れる。IT企業に就職しといてLinuxコマンドも知らないようでは終わりである。さっさとやめてしまえとすら思う。そんな人のために「Linux標準教科書」というものがある。無料でダウンロードできるので、これを読むことをおすすめする。

Linuxシステムを理解するのは容易ではない。少なくとも2ヶ月はかかる。しかもある程度わかるくらいのレベルにしかなれない。完全に理解するのは稀有の天才でなければきっと難しいだろう。だが、ある程度理解することが大事だ。そしてこの頃からおすすめするのはネットワークに関する参考書を読むことだ。

特に「TCP/IPモデル」というものを理解することは非常に大切である。

今まで見てきた多くのエンジニアでネットワークに関する知識を身につけている人はほとんどいなかった。一流エンジニアになるためにまずはネットワークの知識を身に着けるべきだと私は思う。エンジニアが増えている現在、希少性を身につけることは大切だろう。

さて、こうしているうちに半年がすぎた。半年も続けられたら、あとはどうにかなる。だが、私の経験上、60%の人は半年も続かない。この記事を読んでいるあなたも60%の確率で半年しないうちに挫折する。じゃあ、どうすれば、モチベーションが保てるかについては、下のほうに書いておく。

第3章 IT歴7-12ヶ月

何事もまずは半年である。これくらいになってくるとネットにある記事を見ると半分くらいのことはわかるようになってくる。嘘だ。正確には、3割くらいだ。。。

さて、このレベルまでは多くの人が今述べたようなことをしていればあなたも到達できるだろう。では、ここから何が必要かを考えよう。私の答えは、

  • 基本的な技術を深く理解する
  • 自分で何か大きなプログラムを組む

この二つを実行することだ。まずは、「基本的な技術を深く理解する」に関して説明する。ここが本記事でもっとも大事だから注意して読んでほしい。もう一度言う、ここが一番大事だ。この時期まで本気で頑張った人は、毎日大量の情報量に触れてきたと思うその中で「ある程度理解できた」というものもあれば「なんかよくわからない」と言ったものが必ずあるはずだ。

この期間では、「なんかよくわからない」ことを「ある程度理解できた」のフェーズまで持っていくことが重要なのである。

この機会を失うとあなたはきっと生涯理解せずに過ごすだろう。なぜ、ここまで私がこれを推すのか説明しよう。

ITの世界を全て理解するには、途方もない知識量が必要である。「全プログラミング言語の全文法を覚え、全プロトコルを理解する。」こんなことは絶対に無理だ。

しかし、プログラミングやプロトコルには、「基礎概念」が存在する。

Linuxやネットワークを理解することを私が薦める理由は、これらを学ぶことでITの世界の「基礎概念」を学べるからである。これらを理解すると、新しい知識に触れた際の理解の速さが大幅に向上する。高校時代の数学などでもよく言われていたが、「基礎力を鍛える」ことはITの世界においても大切なのである。したがって、私は初心者が「Ruby on rails」などのフレームワークをいきなり学習することはおすすめしない。確かに、即戦力になるしコーディング力を急激に高めることが可能である。しかし、これで成功するのは本当に能力のある人間だけである。

よくあるプログラミングスクールでは、カリキュラムの都合上このフレームワークをメインで教えることがどうしても多くなってしまう。別にスクールを悪く言うつもりはない。ただ、スクールだけでは理論上、あまりに不十分なのだ。だから、スクールに通えば一人前になれると考えているあなたはとても危険だと言っているのだ。小手先のテクニックだけを学んだ中途半端なエンジニア(量産型エンジニア)の誕生である。

私が講師をしている中でよく見る駆け出しエンジニアは「Railsできます」「Spring Frameworkできます」と言う人たちばかりだ。しかし、実際に会話をしていると基礎的なLinuxコマンドを知らなかったり、ネットワークなどの知識を欠いている人がほとんとであった。

これでは、「量産型のエンジニア」になってしまう。

真に稼げるエンジニアは、残り10%が知らないような知識を知っている必要があるから重宝されるのだ。

あなたには、ぜひそうなってほしい。 では、次に「自分で何か大きなプログラムを組む」ということだ。これは、非常にいい経験になる。これに関しては、2ヶ月程度の期間で完成できるようなものにするとよい。「要件定義」「システム設計」「コーディング」「保守」この一連の流れを自分1人ですることにより実際の開発現場で分業されていることを全て体験できる。そして、このタイミングで初めて、自分の好きなプログラミング言語を見極めるべきだ。

最初の1ヶ月目にC言語Pythonを勉強したかもしれないがそんなものは忘れてしまって構わない自分が作るアプリはどの言語で設計するべきか調査し、 その言語を1から学習するくらいの勢いで開発を進めることが大事なのだ。ちなみに、私は当時、卒業研究だったこともあり45日間、毎日13時間開発に勤しんだ。必ず期限内に完成させなければいけない恐怖と少しずつ完成に近づいていく楽しさの両面を味わえたのはいい機会だったのかもしれない。

この結果、私は手のひらの皮がむけ、ストレスで皮膚病を発症したのは、今となっては笑い話である。この過程を経た方は、もう安心していい。十分1人で学習できるレベルになってくる。ここから、無鉄砲に参考書に手をだしたり、塾に通ったりする必要はない。それでもなお、塾に通いたい方は私に連絡してくれ。

第4章 IT歴1年1-6ヶ月

この時期からおすすめすることは、

業務としてITに触れることだ。

断言するが、1年間しっかりと学習した人間は会社の中でなんとなくITを学んでいる人よりも間違いなく強い。すでに、フリーランスとして生きていく力のある人もいるだろう。おすすめするのは、ベンチャー企業のエンジニアである。社員として契約を結ぶのではなく、契約社員かアルバイトをおすすめする。まだ社員としてその会社で長く働くには勿体無い。

時給1000円程度の給料をもらいながら、勉強しながら働くことが望ましい。 特に、最近では、週末ワーカーのような副業を支援するエージェントがたくさんある。ぜひ、調べてみてほしい。

さて、企業で副業することが決まったあなたがすることは1つだけだ。 それは、その企業でもっとも優秀なエンジニアの真似をすることだ。

その人が使っているエディターの種類、使っているアプリ普段の情報収集の仕方、シェルの種類など全てを真似ることをおすすめする。

私の経験上、どんな企業にも1人はGoogleクラスのエンジニアが存在する。

Googleの社員と仕事をすることは難しいがGoogleクラスの人間と仕事をすることはそんなに難しいことではない。その人の全てを吸収した上で、半年から1年ほど働いてみることがあなたを最高に成長させる機会となる。すると、優秀なエンジニアの何が優秀か、気づくことになるだろう。単純に頭がいい?経験が長い?ちがう。

優秀なエンジニアの優秀さは、基礎概念への理解の高さそしてググり力の高さにある。

基礎概念の大切さは、先ほど説明したからググり力に関して説明しよう。ググり力とは、「Google検索で何かを調べる力」だ。正確には、「あなたが何かに困ったとき、自分の欲しい情報に早くたどり着ける能力」これがググり力だ。優秀なエンジニアほど、ここが優れている。海外のサイトやいろんなところから的確に自分のほしい情報を取捨選択している。

あなたもきっとこれからエンジニアとして何万回とググることになるだろう。その一回一回のスピードをあげることが成長の速さに繋がると私は信じている。

では、どうすればググり力が成長できるだろうか。Mac ユーザー限定だが、アプリを紹介しておこう。(別に私は、ここの受け売りではない)

「Alfred」と呼ばれるランチャーアプリだ。ランチャーアプリって何?はほっておいて、とにかくMacユーザーはインストールしたほうがいい。検索の概念が変わる最高のアプリだ。詳しい使い方は割愛する。ちなみに、私はとあるベンチャー企業で約10ヶ月アルバイトをしていた。Web開発だったため、ここでフレームワークSQLを学んだ。優秀なエンジニアに多くを教わる一方で勉強しながらお金が発生する最高の期間だった。

私はアルバイトで10ヶ月働いた後、別会社でなんと時給が2万円になった。

もちろん、これに関しては再現性がある訳ではない。たまたま私が恵まれたと考えるのが一般的である。しかし、こういうパターンがあることもあるというのは、夢があっていいではないか?

第5章 IT歴1年7-12ヶ月

1年半ほどしっかりと勉強すると、基礎的な知識、実務経験はそれなりに身に付く。では、次に何をすべきだろうか。ここからは、情報収集力が一番の肝である。

では、どうやって情報を収集するか?。これに関しては、RSSと呼ばれる機能やTwitter を利用するのがいいと思うのだが、やはりこれに関しても最も効率的なのは、優秀なエンジニアの真似をするということだ。

この世界で活動していたあなたは、有名エンジニアの一人や二人を知っているだろう。そんな人たちが発信する情報や、同じ職場の同僚と情報を収集しあうことが大切である。この業界では、間違いなく、情報の質が成長にかかせない。

そして、絶えず行うのが基礎概念の復習である。ここあたりから、「なぜその技術が作られたか」について考えるといい。具体的に言うと、例えば、なぜIPアドレスMacアドレスという2つのものが存在するのか?などを考えて欲しい。全ての技術は、必要だから作られたのである。知識だけを学習するのではなく、その背景を考えると理解が深まる。

そして、「言語化」を意識して欲しい。IPアドレスってなんとなくわかるけど、自分の言葉では仕組みを説明できないというのは好ましくない。言語化できないことは、理解していないことと同じである。

この先たくさんの技術に触れていくと思うが、ほとんどの技術はすでにある技術の複合版または、ちょっと変えた版である。つまり、基礎概念がすべてわかっていれば、「大半の新しい技術は、実はたいして新しくない」のだ。

第6章 2年目からのあなた

2年間、1つのことをやりきったあなたは、もう一流エンジニアになっているだろう。安心して、いろんな案件をもらってきていい。

だが、道のりはまだほど遠い。上位10%になるのには簡単だが、ここから9%、8%となるにはさらに3年、5年とかかってくる。私は、上位10%に入っている自信はあるが所詮その程度だ。世の中にはすごい人たちがたくさんいる。今日もそんな人たちの真似をしながら1日を過ごしている。

お金が稼ぎたいのならば、すぐにフリーランスになることをおすすめする。2年間頑張れたあなたならすぐにいい案件が見つかるだろう。基礎概念がしっかりわかっており、それなりにプログラミングができるエンジニアの単価はあなたが思ってるよりも高い。20代でも十分月30-60万くらいは余裕で稼げる。こんなのでお金が貰えるのか?と思うくらいには高い。だが、何回も言うが2年間勉学を続けられる人はさほど多くない。

ここからは、フリーランスの先輩としてアドバイスさせてもらおう。稼げるかどうかは、能力が高いというよりもどの案件を引き受けるかにかかっている。高給で簡単な仕事というのはいくらでもあるがそれを見つけるのが非常に難しい。では、ここからあなたはどうするべきだろうか。いい案件を見つけるため、成長するため、何をすべきであろうか。

答えは、「人脈」を作ることだ。

当たり前のことだが、ビジネスの世界では、人脈が何より大切だ。フリーランスというのは、いわば1人社長である。自分で自分を売り出していくためにも営業活動はしておくべきだろう。自慢ではないが、私は今まで転職エージェントを一回も使ったことがない。全て、知人の紹介で仕事を取ってきた。みんながみんなこれができるとは限らないが、ある程度IT業界の知人を作ることも大切だろう。

さらには、どの分野で働きにいくのか考えることも大事だ。多くの人がいるフロントエンジニアなのか、やや難易度の高いバックエンドエンジニアなのか、それともネイティブアプリエンジニアなのか、インフラエンジニアなのか、などなど、一言でエンジニアと言ってもたくさんの種類がある。

私のおすすめは、セキュリティの分野と講師業だ。

セキュリティは希少性という観点から非常におすすめできる。これからの時代、多くのものがIoTでインターネットに結ばれるようになるとセキュリティエンジニアの需要が高まってくるだろう。そして、講師業に関しては、ある程度の実績があり人前で堂々と話せるのならばおすすめする。

第7章 まとめ

ここまで読んで頂いたあなたには最後もう少しお付き合いいただこう。

ひとまず、おめでとう。と伝えておく。90%の駆け出しエンジニアは、この記事を見かけてもここまで読んでくれすらしない。彼らは、役立つ情報かどうかの判定すらもできないということだ。私は、この記事に自信を持っている。他のどの記事よりも役にたつ真実を記述していると自負している。

そんな私の記事をここまで読めたあなたはある程度の才能はあると私は思う。おめでとう。

最初にも述べたが、私はフリーランスとして活動する一方で企業研修やIT塾の講師をさせてもらっている。そんな中、私がもっとも感じているのは「基礎概念」への理解の低さだ。ほとんどの生徒が「基礎概念」をおろそかにしている。

これだけ、量産型エンジニアが生産されるのも基礎概念を理解していないがためのことなのだろうと納得するレベルである。

ITの世界にはあまりにも多くの情報が溢れている。次から次に新しい技術が発表され、昨日まで動いたプログラムがversionの変化のために急に動かなくなるといったことすらある。このような移り変わりの早い世界で、全てのことを理解することは可能か?先ほども述べたが答えは、圧倒的にNOだ。

そんなものは、どんな天才でもできないと断言できる。では、どうするか?基礎的な技術を深く理解することが必要なのだ。

とあるGAFAの面接では自社のサービスを展開しているにも関わらずそれに関わる知識よりも、ネットワークやLinuxに関する基本的な知識を聞いてくる。

このことからもわかるように基礎知識は圧倒的に大切なのである。

では、なぜ「基礎概念」がおろそかになるのだろうか?おそらく、ITを勉強し始めた時に体系的にしっかりと学習しなかったからである。

中途半端な知識のままシステムエンジニアとしての道に進んでしまい、気がつけば後戻りできないようになっているのだ。

プログラミングスクールが悪いなんて言うつもりはない。各スクールの方々は努力してカリキュラムを整備しようとしている。だが、今の量産型エンジニアが増えている理由の一つの要因としてスクールの影響があることは事実だろう。

よって、あなたがすることは、スクールで学ぶことを最大限活かすためにスクールでは教わらないITの基礎概念を「自分で」学ぶことなのだ。

量産型エンジニアではなく、真に稼げる良質なエンジニアを共に目指そう。 技術的・メンタル面で相談/質問したいことがあれば、Line@のほうから連絡してくれて構わない。

Line@では以下のようなことを発信している。(2020年12月時点:登録者数750名)

  • おすすめのプログラミング言語
  • 初心者がやりがちな意味のない勉強法
  • おすすめの優良記事
  • 簡単な質問対応

特に、質問対応に関しては、利用しない手はないと思う。プログラミングスクールのメンターなどとは違い、大企業のIT研修を行なっている人に対して無料で質問ができる機会などきっとここ以外にない。1人1人対応しているため、返信に時間がかかるかもしれないが、きっとあなたの良き相談相手になれるだろう。下のリンクから登録してみてくれ。

landing.lineml.jp

最後に、一言まとめとして残して終わりとする。長い文章を読んでくれてありがとう。

基礎概念への理解を追求せよ

おまけ(モチベーションの保ち方)

勉強するモチベーションが続かない。

という人のためにとっておきの秘訣を授けておく。それは、課金することだ。スクールでもudemyでもProgateでもなんでもいい。課金すると人はお金を回収するために必死になって勉強する。無料でももちろん勉強はできる。しかし、課金した教材はもちろん無料のものよりクオリティは高いし、自分の勉強のモチベーションにもなる。

教材に課金したところで、毎月せいぜい数千-数万円単位のものだろう。2年後、あなたが月50万稼ぐつもりなら、一瞬でもとがとれる。たかが数千円を節約して、あなたの成長機会と成長意欲を失わないでほしい。

landing.lineml.jp