2014-06-09

プログラミングを習得するまでの手順

Categories: プログラミング
no_image.jpg

[ PR ]


はじめに

現代は情報社会であり、仕事でパソコンを使わないということはまずありません。

職業としてプログラミングをする人でなくても、今はプログラミングを出来ることは1つのスキルといえます。

趣味としてもプログラミングは魅力的ではありますが、その一方で非常に難しい一面があります。

今回はそのプログラミングを取得する一助になるように、大きな視野での学習手順を考えてみました。

注1: 細かい手順は他のサイトを参照してください。

注2: 一部難しい表現がありますが、その際は読み飛ばしてください。

インストール

インストールが全ての基本です。プログラミングをするときに一番難しいのもインストールです。

是非この手順に一番時間を割いて、どんなプログラムでもインストールできるようになっておきたいところです。

インストーラーを利用する(簡単)

  • EXE, ZIP(Windows)や DMG, APP, PKG(Mac)なので配布されていることが多い。

パッケージ管理ツールを利用する(やや難しい)

  • MacとLinuxで利用できる
  • Windowsでも、Cygwinを使うと利用可
  • Macならbrew、Linuxならapt,yumなど

Macのbrewでの例:

brew install ruby
新Linux/UNIX入門 第3版 (林晴比古実用マスターシリーズ)
林 晴比古
ソフトバンククリエイティブ
売り上げランキング: 135,787

ソースからビルドする(難しい)

  • Githubなどのオープンソースからビルドする
  • Make、Antなどのビルドツールの知識が必要
  • 場合によっては、上記のパッケージ管理システムを使って「依存関係」を解決する必要がある

  • ビルドできるスキルは後から非常に役立つため、是非トライしてみる

GNU Make 第3版
GNU Make 第3版
posted with amazlet at 14.06.09
Robert Mecklenburg
オライリージャパン
売り上げランキング: 162,687

基本

インストールができれば半分は終わったようなもの。まずは基本から押さえておきましょう。

自分にあった言語を決める

  • プログラミング言語は、プログラマーの数だけある
  • 大きく分類すると、以下の種類がある

  • C/C++系

    ゲームや組み込みなどに利用され、非常に高速で低メモリで動作する。

  • Java系

    仮想マシンで動作し、基本的なプログラムからWebサーバーまで幅広く使われる。ただしメモリ消費量は多い。

  • スクリプト言語

    RubyやPythonなどが有名で、コード量が少なく簡単な割には、幅広い分野で利用されている。コミュニティは一番充実しているが、動作速度はC言語の1/100程度。

  • 関数型言語

    通常のプログラム言語と全く異なる手法(パラダイム)を持ち、スクリプト言語同様にコード量が少なくなるが、動作速度はスクリプト言語よりも速い。しかし、理解するのが非常に難しい。

以上の種類がありますが、最初はスクリプト言語をおすすめします。C/C++やJavaの方が実用的ですが、スクリプト言語の方が理解しやすく、最近ではスクリプト言語も実用的です。

Hello, World!

  • プログラムが動くということを確認する
  • 文字を標準出力に表示する

例えばC言語の場合:

// hello.c

#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");
    return 0;
}
~$ gcc hello.c -o hello
~$ ./hello

Hello, World!

簡単な計算をしてみる

例えばC言語の場合:

// plus.c

#include <stdio.h>

int main(void)
{
    printf("1 + 1 = %d\n", 1 + 1);
    return 0;
}
~$ gcc plus.c -o plus
~$ ./plus

1 + 1 = 2

REPLがある場合

  • REPL(Read-Eval-Print-Loop)がある言語(Ruby, Python, Lispなど)で試してみる

Hello, World!

Rubyの場合:

~$ irb

> puts "Hello, World!"

Hello, World!
=> nil

> (exit)

簡単な計算をする

Common Lisp(CLisp)の場合:

~$ clisp

  i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
  I I I I I I I      8     8   8           8     8     o  8    8
  I  \ `+' /  I      8         8           8     8        8    8
   \  `-+-'  /       8         8           8      ooooo   8oooo
    `-__|__-'        8         8           8           8  8
        |            8     o   8           8     o     8  8
  ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8

Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/>

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2010

Type :h and hit Enter for context help.

> (+ 1 1)
2

> (quit)
Bye

構文を知る

エントリーポイント

  • プログラムが起動するとき、最初に呼ばれる構文(関数など)のこと
  • 言語によって全く異なるので、その言語のマニュアルや実行例を読む

C言語の場合は、

int main(void)
{
    ... /* ここがエントリーポイント */
}

Javaの場合は、

public class クラス名 {
    public static void main (String[] args){
        ... /* ここがエントリーポイント */
    }
}

/*
 1) ただし、ファイル名を「クラス名.java」とする。
 2) クラス名は必ず大文字から始める。
*/

Rubyの場合は、

puts "hello" # 1行目がエントリーポイント

変数

C言語の例:

int main(void)
{
    int a = 1; // (型の種類) (変数名) = (値) 
    int b = 1;

    printf("a + b = %d", a + b);

    // 出力: a + b = 2
}

ループ

Javaの例:

public class LoopTest {
    public static void main (String[] args){
        // for文
        for(int i=1; i<=5; i++){
            System.out.print(i);
        }

        /* 出力: 12345 */

        System.out.println();

        // while文
        int a = 1;
        while(a < 10){
            System.out.print(a);
            a = a + 2;
        }

        /* 出力: 13579 */

        System.out.println();
    }
}

関数

Pythonの例:

def square(x):
    return x * x

square(10) # 100

クラスとオブジェクト

  • クラスやオブジェクトは、必ずしも必要と言うわけではない
  • JavaやC++ではほぼ必須
  • 言語によって全く異なるので、ここではあまり解説しない

Rubyの例:

class Car
  # イニシャライザ
  def initialize(carname)
    @name = carname
  end

  # メソッド
  def name()
    print(@name, "¥n")
  end
end

car1 = Car.new("crown")
puts car1.name() # crown

car2 = Car.new("civic")
puts car2.name() # civic

特殊な機能を知る

マクロ

  • プログラムが実行される前に、コード自体を変化させる手法
  • 仕組みは、プログラムを二分木にし、特定の箇所を置き換える

Schemeの例:

(define-syntax nil!
  (syntax-rules ()
    ((_ x)
     (set! x '()))))

(define x 10)
(nil! x) ; x = nil

C言語の例:

#include <stdio.h>
#define size_of_array(array)  (sizeof(array)/sizeof((array)[0]))

int main(void){
    int arr[] = {1,2,3,4,5};
    printf("%lu\n", size_of_array(arr));

    // 出力: 5
}

並列処理

  • 初期のプログラムは、1つのプロセスで全てを処理していた
  • 並列処理を使うことで、非同期に複数の処理を行える
  • マルチコアのCPUをフル活用できる

Scalaの例:

val lst = List(1,2,3,4,5,6,7,8,9,10)

lst.par.foreach(i =>
    println(s"[${Thread.currentThread.getName}] : ${i}"))

/*

出力:

[ForkJoinPool-1-worker-10] : 1
[ForkJoinPool-1-worker-12] : 8
[ForkJoinPool-1-worker-11] : 6
[ForkJoinPool-1-worker-11] : 7
[ForkJoinPool-1-worker-12] : 9
[ForkJoinPool-1-worker-12] : 10
[ForkJoinPool-1-worker-10] : 2
[ForkJoinPool-1-worker-13] : 3
[ForkJoinPool-1-worker-11] : 5
[ForkJoinPool-1-worker-12] : 4

*/

// 上記を見ると、順序がまったくバラバラになっていることがわかる
//  => つまり並列処理になっている

応用

コンピュータを知る

  • プログラムは、コンピュータを操作する技術
  • メモリ、CPU、アドレスなどの詳しい知識を知る
  • Arduinoなどのキットもおすすめ
Arduinoをはじめよう 第2版 (Make:PROJECTS)
Massimo Banzi
オライリージャパン
売り上げランキング: 2,439

プログラム関係の書籍を読む

  • 自分にあったものが良い
  • できるだけコード例が多く載っているものを選ぶ

→ おすすめの書籍は別記

エディタを選ぶ

弘法筆を選ばずと言いますが、実際はよく選んだほうが良いことが多いです。

クラシックなものとしてはEmacsやVimがありますが、今では Sublime TextやKomodo Edit、AtomなどGUIのエディタにも多くの種類があります。

Web制作者のためのSublime Textの教科書 今すぐ最高のエディタを使いこなすプロのノウハウ
上野正大 杉本 淳 前川昌幸 森田 壮
インプレスジャパン
売り上げランキング: 5,035

自分にあったものや、操作性、拡張性を基準に選ぶといいと思います。

GitHubやGoogle Codeなどのコードを写す

  • GitHubには良質なコードが多く公開されている
  • まずはコードを自分の手で写してみる
  • 後で見返し、わからない部分を調べる
GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)
大塚 弘記
技術評論社
売り上げランキング: 1,145

実際にまとまった量のプログラムを書く

  • 実際に使えるものが良い
  • CUIやGUI、ゲームなどある程度幅を持たせる

プログラミング言語のパラダイムを知る

  • 構造型言語、関数型言語など、異なったパラダイムのプログラムを知ることは、技術の向上に繋がる
JavaScriptで学ぶ関数型プログラミング
Michael Fogus
オライリージャパン
売り上げランキング: 147,480

Unix/Linuxを使う

  • UnixとLinuxには、プログラミングに役立つノウハウが多く含まれている
  • 特にパイプやリダイレクトなどの哲学を知ると良い

UNIXという考え方―その設計思想と哲学

仮想マシンを知る

  • JavaやRubyなどは仮想マシン(VM)上で動いている
  • 仮想マシンのメリットとデメリットを知る
  • ガベージコレクションの仕組みを知ること
ガベージコレクションのアルゴリズムと実装
中村 成洋 相川 光
秀和システム
売り上げランキング: 334,101

Lispを知る

  • 最初の高級言語
  • 構文自体が二分木で構成されている
  • プログラムの構文や、コンパイラの基礎を学ぶのに最適
  • マクロを学ぶことは必ず役に立つ
初めての人のためのLISP[増補改訂版]
竹内 郁雄
翔泳社 (2010-03-10)
売り上げランキング: 173,346

機械語を知る

  • 機械語は最も低レベルな言語
  • メモリやCPUを直接操作できる
  • 機械語を知ることで、CPUの基本や、パフォーマンスチューニングを知ることができる

正規表現を学ぶ

  • メールアドレスや郵便番号などをチェックすることなどに使われる
  • 後方参照など奥が深く、以外と難しい
  • 書籍は、オライリー・ジャパンの「詳説 正規表現」が分かりやすい。
詳説 正規表現 第3版
詳説 正規表現 第3版
posted with amazlet at 14.06.09
Jeffrey E.F. Friedl
オライリージャパン
売り上げランキング: 207,914

まとめ

いかがでしたでしょうか。

ところで、あなたがプログラミングをしようという動機は何なのでしょうか。

自動化したい、計算したい、ゲームを作りたい、カスタマイズしたい...

いろんな理由があると思いますが、意外に「何を作るか」が難しいと聞きます。

しかし、それは授業を受けてそう思うだけだと思います。実際は、作りたいものが見つかってから、それにあったプログラムを勉強するのが本当だと思うからです。

そうでないと、無意味に必要のない知識を貯めこむこととなり、時間が無駄になってしまいます。

是非、頭でっかちにならないように気をつけておきたいですね。

コメントはTwitterアカウントにお願いします。

RECENT POSTS


[ PR ]

.