頑張らないように頑張る。

努力と怠惰の狭間

「プログラミングの勉強したいんですけど、何からしたらいいですか?」

よくある質問

エンジニアをしてるとたまにこのような質問を受ける。
結論から言うと「知らん」だが、最近使ってる答え方を書いておく。

要点としては3つある。

  • 学習目的
  • 勉強方法
  • プログラム言語

学習目的

学習者からこの質問を受けて、こう答えるエンジニアもいるだろう。
「目的は何?」


僕から言わせてもらうと、学習者は明確な目的など持っていない事が多い。
なぜなら、「ITで何が出来るのか。そもそもITとは何なのか。」が分かってないからである。


まず、IT分野にはいくつかある。
厳密ではないが、以下のように分かれる。

  • インフラ系
    • ネットワークやセキュリティ、サーバ運用など
    • 日常生活でいう道路や水道やガスのような部分
  • ハードウェア系
    • 機械への組み込み
    • 今話題のIoTやドローンはここに分類される
  • ソフトウェア系
  • Web系
  • ゲーム系
  • その他
    • 汎用系やオープン系などもあるが、初心者向けではないのでここでは触れない
    • 機械学習人工知能という答えもあるだろうが、それについては「プログラム言語」で触れる

さて、あなたはこの中で何がやりたい?
それによって答えは変わってくる。

僕はチャットアプリやSNSなど「Web系」に興味があったので、その道に進んだ。
友達にはゲームが好きで「ゲーム系」に進んだ人もいる。

このように「何が出来るのかを知り、そのためには何系をすれば良いのか」と考える必要がある。

勉強方法

次に「プログラミングの勉強ってどうしたらいいですが」についてだが、
勉強方法は、人によって様々である。


理論からしっかり勉強したい人もいれば、
人から聞いて耳で勉強する人もいれば、
手当たり次第に問題を解いていく人もいる。


このように、人によって違うため、違う勉強法を教えても長続きしない。
長続きさせるためには、適した勉強法を教える事が大切だ。

理論から勉強したい

理論から勉強したいのであれば、「基本情報技術者試験」を勧める。

ITの基礎的な部分がまとまっていて、アルゴリズムからネットワークの仕組み、情報戦略など包括的に勉強するには持って来いである。
勉強の分野は、大きく分けると3分類に分けられている。

人から聞いて耳で勉強したい

人から聞いて耳で勉強したいのであれば「無料カンファレンスや無料勉強会」を勧める。

「無料」というのは重要だ。
無料はハードルを一気に下げてくれる。

都内では毎日のように勉強会が開催されている。
地方は回数が少ないが、それでも勉強会は開催されている。

とりあえず気になるところ数箇所に顔を出して、どういう話をしているのか聞き、興味が沸けばそれを勉強してみるといい。
どの勉強会に参加すればよいのか分からない場合は、界隈のコミュニティで最大派閥の勉強会に顔を出せば、界隈の雰囲気が掴めてよいかと思う。
(例えば、「Pythonの勉強会よりJavaの勉強会の方が楽しかった」であればJavaを勉強してみると良いだろう)

手当たり次第に問題を解きたい

手当たり次第に問題を解きたいのであれば、少し保留とする。
というのも、次の「プログラム言語」を見せてみないと分からないからである。

プログラム言語

ここまで読んでみて、初心者が思う事はこうだろう。
「めんどくさ」


そうだと思う。僕自身も書いていて面倒くさい。
初心者のプログラム言語選びというのは、それほど面倒くさい事なのだ。
逆に言うと「これだけ面倒臭い事を数秒で考えて回答している」という事だけでも覚えて帰ってほしい。


さて、プログラム言語だが、これも「学習目的」に起因する部分がある。
例えば、このような感じ。

  • ゲームを作りたいのであれば、処理速度を考慮するためC++
  • 簡単にWebサイトを作りたいのであれば、Wordpressも扱えるPHP
  • 機械学習を考慮したサービスを作りたいのであればPython
  • 30億のデバイスで動くようにしたいのであればJava

ちなみに、データベースを触るのであればSQLは必須であるし、
Webページを触るのであればHTMLは必須である。


最後に、百聞は一見に如かずという事で、様々な言語で書いたFizzBuzzのプログラムを見てほしい。
これを見て「この言語分かりやすい」「この言語面倒くさそう」などの感情を持つ事が出来れば、分かりやすい言語を選択するのをおすすめする。
(僕が書ける言語に限定したため、Java,Ruby,Python,Goの4言語のみ紹介する)

Java

import java.util.ArrayList;
import java.util.List;
public class FizzBuzz {
    public static void main(String[] args) {
        int start = 1;
        int end   = 100;
        List<String> fizzBuzz = new ArrayList<>();
        for (int i = start; i < end; i++) {
            String str = "";
            if (i % 3 == 0) {
                str += "Fizz";
            }
            if (i % 5 == 0) {
                str += "Buzz";
            }
            if (str == "") {
                str = String.valueOf(i);
            }
            fizzBuzz.add(str);
        }
        System.out.println(fizzBuzz);
    }
}

Ruby

class FizzBuzz
    def self.fizzBuzz
        start = 1
        endx   = 100
        fizzBuzz = []
        for i in start..endx do
            str = ''
            if i % 3 == 0 then
                str += 'Fizz'
            end
            if i % 5 == 0 then
                str += 'Buzz'
            end
            if str == ''
                str = i
            end
            fizzBuzz.push(str)
        end
        p fizzBuzz
    end
end
FizzBuzz.fizzBuzz

Python

class FizzBuzz:
    start = 1
    end   = 100
    fizzBuzz = []
    for i in range(start, end):
        str = ''
        if i % 3 == 0:
            str += 'Fizz'
        if i % 5 == 0:
            str += 'Buzz'
        if str == '':
            str = i
        fizzBuzz.append(str)
    print (fizzBuzz)

Go

package main
import (
    "log"
    "strconv"
)

func main(){
    var start int = 1
    var end   int = 100
    var fizzBuzz []string
    for i := start; i < end; i++ {
        var str string = ""
        if i % 3 == 0 {
            str += "Fizz"
        }
        if i % 5 == 0 {
            str += "Buzz"
        }
        if str == "" {
            str = strconv.Itoa(i)
        }
        fizzBuzz = append(fizzBuzz, str)
    }
    log.Println(fizzBuzz)
}