とある京大生の作業ログと日々の雑記

コンピュータサイエンスについて学んだことを可視化したり日々の雑記をまとめてます。

これからプログラミングを始めようとしている人々へ

今までブログ記事のタイトルを「〜をしてみた話」といった形式に統一してきたが、毎回それに沿うようにタイトルを考えるのがめんどくさくなってしまったのでこれからは自由な形式にしてみようということで、今回はその第一弾。




まあこれはこれでいいのかもしれない(?)




今回の記事としては「これからプログラミングを始めてみようという人に向けた、導入としての知識を提供する」といった内容にするつもり(もちろんこれから内容をババっと書いていくので脱線する可能性は大いにあり、とりあえず一応の意思表明)





今回こうした記事を書くに至った経緯としては、今日は友達とパフェを食べてきたときの会話が発端で....


f:id:komi1230:20180331204658j:plain


チョコバナナパフェおいしかった。



チョコバナナってパフェとかパンケーキ、クレープでは王道of王道だけど、やはり好きすぎるので注文してしまったのである。




まあ本題に戻り、以下が今日その相手(Aとしよう)との会話。



A「もうこれから3回生で将来のこと考えなきゃで、院に行くかもしれないけど一応就職とかの準備も込めてインターンとかも応募しようと思ってて〜」


ぼく「なるほどね」



A「まあそれでインターンの求人とか色々見てたらエンジニアとかあって、でもプログラミング経験ないからどうしようもないな〜って思ってて、ちょっとやってみようかなって感じ....」



ぼく「お、ええやん」




といった感じで、最初にどんなことから勉強すればいいのかといったことを簡単に話してたのだけど、最初に自分がプログラミングを始めたときの勉強法が果たして一般的に推奨できるものではないなと思い、一度導入などについて整理してみようと思った次第なのである。

まずプログラミングってなに?

Wikipediaには以下の通りの説明がなされている。

コンピュータのプログラミング(英: programming)とは、コンピュータプログラムを作成することにより、人間の意図した処理を行うようにコンピュータに指示を与える行為である。


例えばぼくが友達に机の上にあるコップを地面に叩きつけて壊して欲しいという場合、友達に


「ちょっとその机にコップあるじゃん?それ地面に叩きつけて割ってくんね?」


とお願いするわけである。




同様に、ぼくらがコンピュータに対して何かお願いをするとき、やって欲しいことをやってくれるためにちゃんとしたお願いの仕方があるのである。




それがプログラミングだと個人的には解釈している。




お願いの仕方には色んなやり方があり、それがプログラミング言語だと解釈してもらえればいいと思う。




具体例として、例えば画面に"今日のパフェおいしかった"を10回表示してほしい場合、C言語という言語では

#include<stdio.h>

int main(void){
    int n = 10;
    int i;
    for(i=0;i<n;i++){
        printf("今日のパフェおいしかった\n");
        }
    return 0;
    }

というような感じになるし、Pythonという言語では

for _ in range(10):
    print("今日のパフェおいしかった")

また、Haskellという言語では

func x = do
    if x == 0 then print "今日のパフェおいしかった"
                   return ()
    else print "今日のパフェおいしかった"
         return func (x-1) 

main = print $ func 10

というような感じになる。




上記の通り、言語ごとでプログラムの書き方は大きく変わり、それぞれ向き不向きがある。




言語の特徴を述べていくととんでもないことになるのでここでは割愛するが、とりあえずここでは簡単にCやPythonHaskellでは書き方が大きく異なり、これらはオブジェクト型言語関数型言語の違いであるとだけここで明言しておく。




気になる人はググっておこう。

プログラミングってなんか難しそう

これからプログラミングを始めよう、もしくはまだ初心者の人はこういう風に思っているかもしれない。




確かに、一般的にプログラミングは非常に敷居が高いイメージがある。




そういうイメージがあるからこそ、ここでちゃんと言っておきたい。



プログラミングなんかよりセンター試験の英語や国語の方がはるかに難しい




プログラミングなんて先ほど述べた通り、所詮は機械へのお願いの仕方である。




だから、私の京大理学部の優秀な友人が



「プログラミングむずいしわからん」



とか言っているのを見て



「京大入試の方が1145141919810倍むずいやろ」



と思ったりするのである。




確かに、最初に始めたときはfor文とかif文、変数への代入が=で等号での比較が==などとても違和感を感じるかもしれない。




ただ、その最初に感じる違和感というのは、高校数学で初めて微分積分をやったときに次数とか係数がちょろちょろ変化するのを問題を解くうちにだんだん自然にできるようになったように、慣れれば当たり前になるのである。




だから、慣れればとても簡単なので、どうか早計に投げ出さないで少し粘ってみてほしい。




きっとその先には、さながら魔法使いのようになんでも自由に操れるようになっていると思われる。

そもそもプログラミングでなにができるの?

こういった質問はたまにされる。



こうした質問をされたとき、ぼくは毎回このように答えている。



「想像できることはなんでもできる。目に見えるものや知ってるものは全部再現できる。」




例えば、水面に雫が落ちたときの波形のシミュレーション、惑星発生のモデリング、手書き文字の認識と分類、筆跡鑑定、SNS、出会い系サイト、コンピューターウイルスなどなど、なんでも作れるしなんでもできる。



もちろん、これらのことを行うのに専門の知識が必要だが、"コンピューターに実行させる"という点においては「プログラミングができる」という事実だけで全てが完結するのである。




プログラミングはある種の魔法だと思う。




同時にプログラミングができる人というのは魔法使いなのだと思う(童貞という意味ではありません)

プログラミングを始めよう

もちろん、簡単に「さあやってみよう」と言ったところで始め方がわからないと思う。



プログラミングの壁の一つとして、こうした環境の準備がある。



最初はよくわからなくてなにがどうなっているのか理解不能なのが普通。



今こうやって偉そうに講釈を垂れているぼくも、ちょうど2年前は合格記念に買ってもらったMacbook Airでターミナル(Windowsでいうコマンドプロンプト)を開くもなにをしたらどうなるかわからなくて、なんとなくC言語の解説サイトを開いてサイトに書いてる通りcdとかrmとかのコマンドを意味もわからず打ち込んでいただけだった。




でも大切なのは「わからんから諦めよ」と投げ出すのではなく「はいクソー意味わからんわボケ。.....調べるか」といった感じでちゃんと調べることで、この「自分で調べる力」はとても重要である。




是非とも試行錯誤してほしい。




自分には理解不能なバグが発生するたびに「はいクソ!死ね!」と言って舌打ちしてほしい。




これを繰り返しいくうちに、気がつくと自分ができることが案外広がってたりする。




ぼくも気がついたら強化学習という人工知能にゲームをやらせる分野に手を出していた。




プログラミングはとても楽しい。




別にこれを読んでいる人が工学部じゃなくて理学部や経済学部、文学部、はたまた浪人だろうと、プログラミングができれば世界が広がるということを知ってもらえると嬉しい。




Welcome to こっち側。




さあパソコンを広げてプログラムを書いてみよう。

勉強に使えるサイト


実際に始めるにあたってなにを始めたらいいんだろうということがあるかもしれないので、過去にぼくが最初に使ったサイトのリンクを貼っておく。

webkaru.net

このサイトはC言語の入門にちょうどいいと思う。



環境構築の方法も載っているし、演習問題のような感じで素数発見のプログラムや二次方程式の解を求めるプログラムを載っているので勉強に適していると思う。




最初にどのプログラミング言語をやるのかという問題は常に議論を呼ぶけど、とりあえずC言語PythonFortranといったオブジェクト指向型言語ならなんでもいいと思われる。




ぶっちゃけると、どの言語を使うかは問題じゃなくて、まず初心者がやるべきことは「プログラミングの作法とプログラミングとしての思考方法を身につけること」だと思う。



PythonとかRubyJavaでもいいかもしれないけど、なにを選ぶかは個人の好みで。




では、長くなったけどここらへんで。