プログラミングを習得するまでの手順
[ 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
ソフトバンククリエイティブ
売り上げランキング: 135,787
ソースからビルドする(難しい)
- Githubなどのオープンソースからビルドする
- Make、Antなどのビルドツールの知識が必要
場合によっては、上記のパッケージ管理システムを使って「依存関係」を解決する必要がある
ビルドできるスキルは後から非常に役立つため、是非トライしてみる
オライリージャパン
売り上げランキング: 162,687
翔泳社
売り上げランキング: 395,953
基本
インストールができれば半分は終わったようなもの。まずは基本から押さえておきましょう。
自分にあった言語を決める
- プログラミング言語は、プログラマーの数だけある
大きく分類すると、以下の種類がある
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などのキットもおすすめ
売り上げランキング: 7,692
オライリージャパン
売り上げランキング: 2,439
プログラム関係の書籍を読む
- 自分にあったものが良い
- できるだけコード例が多く載っているものを選ぶ
エディタを選ぶ
弘法筆を選ばずと言いますが、実際はよく選んだほうが良いことが多いです。
クラシックなものとしてはEmacsやVimがありますが、今では Sublime TextやKomodo Edit、AtomなどGUIのエディタにも多くの種類があります。
インプレスジャパン
売り上げランキング: 5,035
自分にあったものや、操作性、拡張性を基準に選ぶといいと思います。
GitHubやGoogle Codeなどのコードを写す
- GitHubには良質なコードが多く公開されている
- まずはコードを自分の手で写してみる
- 後で見返し、わからない部分を調べる
技術評論社
売り上げランキング: 1,145
実際にまとまった量のプログラムを書く
- 実際に使えるものが良い
- CUIやGUI、ゲームなどある程度幅を持たせる
プログラミング言語のパラダイムを知る
- 構造型言語、関数型言語など、異なったパラダイムのプログラムを知ることは、技術の向上に繋がる
オライリージャパン
売り上げランキング: 147,480
Unix/Linuxを使う
- UnixとLinuxには、プログラミングに役立つノウハウが多く含まれている
- 特にパイプやリダイレクトなどの哲学を知ると良い
仮想マシンを知る
- JavaやRubyなどは仮想マシン(VM)上で動いている
- 仮想マシンのメリットとデメリットを知る
- ガベージコレクションの仕組みを知ること
秀和システム
売り上げランキング: 334,101
Lispを知る
- 最初の高級言語
- 構文自体が二分木で構成されている
- プログラムの構文や、コンパイラの基礎を学ぶのに最適
- マクロを学ぶことは必ず役に立つ
翔泳社 (2010-03-10)
売り上げランキング: 173,346
機械語を知る
- 機械語は最も低レベルな言語
- メモリやCPUを直接操作できる
- 機械語を知ることで、CPUの基本や、パフォーマンスチューニングを知ることができる
正規表現を学ぶ
- メールアドレスや郵便番号などをチェックすることなどに使われる
- 後方参照など奥が深く、以外と難しい
- 書籍は、オライリー・ジャパンの「詳説 正規表現」が分かりやすい。
オライリージャパン
売り上げランキング: 207,914
まとめ
いかがでしたでしょうか。
ところで、あなたがプログラミングをしようという動機は何なのでしょうか。
自動化したい、計算したい、ゲームを作りたい、カスタマイズしたい...
いろんな理由があると思いますが、意外に「何を作るか」が難しいと聞きます。
しかし、それは授業を受けてそう思うだけだと思います。実際は、作りたいものが見つかってから、それにあったプログラムを勉強するのが本当だと思うからです。
そうでないと、無意味に必要のない知識を貯めこむこととなり、時間が無駄になってしまいます。
是非、頭でっかちにならないように気をつけておきたいですね。