yucatio@システムエンジニア

趣味で作ったものいろいろ

プログラミングで初学者のときにつまづいたこと

プログラミングでつまづいてきたことというブログ記事を見たので、私も書いてみます。

satoru-takeuchi.hatenablog.com

mizchi.hatenablog.com

自己紹介

記事をリンクしたお2人と違って大したプログラマではないですが、システムエンジニアとして働いて10年経ってみて今の仕事が向いていると思っているところです。

大学でC言語Javaを習って、仕事はWeb系で主にJavaを使用しています。

以下、つまづいたことです。だいたい古いのから新しいものになっています。

代入文

a = 1
b = 2
c = a + b

でcが3になるのは分かったのだが、

a = a + 1

これを見て、"左右が等しくない。"と混乱し、そこで思考が止まってしまった。 半年後くらいに代入文という言葉を覚え、上記は"a + 1を計算した結果をaに入れる"だということが分かった (が慣れるまでにはもう少しかかった)。

アルゴリズム

プログラムそれ自体よりもアルゴリズムでつまづく(大学の授業で習った。言語はC言語。)

バブルソートわからない。わかってもコードに落とし込めない。2重ループが難しすぎる。

こんなに便利な世の中なのに、並び替えをするのにいちいち自前でプログラミングをしなければいけないなんて、どうなっているのだと思った。 (色々と認識が間違っていた)

Java

オブジェクト、インスタンス、クラス

用語の説明を何度読んでも理解ができない。他にもとにかく馴染みのないカタカナ語が多すぎて嫌になった。

あるとき、C言語の構造体に関数を足したのがクラスだと気づきそこから理解が進んだ。が、C言語を習っていなかったらと思うと震える。

Javaオブジェクト指向 (継承、ポリモーフィズムカプセル化)

惑星クラスを拡張したのが、水星クラス、金星クラス、土星クラスとか、 犬クラスだったら"ワン"と鳴いて、猫クラスだったら"ミャー"と鳴くとか、何に使うかがわからなかった。 値の隠蔽(カプセル化)が重要という割に、setterで値を操作できているではないか、と思った。

理解できるようになったのは、Javaデザインパターンを読んでから。


ちなみに"オブジェクト指向とは何か"はこちらの記事でWindows95を開発した中島聡さんの言葉を引用しています。

yucatio.hatenablog.com

インターフェース

インターフェースも何に使うか長年の疑問だった。実装がないとは何の役にも立たないのではないか。

確かこの本だったと思うけど、"例えば、自動販売機、外側に見える部分がちゃんと仕様通りに動いていれば、中に人が入っていて、手でジュースを出してもよい。自動販売機の、外から見える部分がインターフェース、中の機械とかが実装"、といったことがイラスト付きで書いてあって、その図がシュールで印象に残った。この例からなんとなく理解し始めたように思う。


その後、"仕様と実装を分けて考える"ということができるようになってきたのでインターフェースの使い所もはっきりしてきた。

Rubyのmap関数

array.map {|i| i * 2 }

で、なぜ各配列の値が2倍されるのか分からなかった。Javaしかほぼやってこなかったので、変換後の配列が定義されていないことが不思議だった。

JavaのMapとRubyのmapは全くの別物ということに思い当たったのと(JavaのMapはRubyのhash)、 とりあえずJavaでの記法(for文を使うもの)と対比させて覚えた。

プログラミング以外でのつまづきも多い

リンク先での記事でも「オブジェクト」「スタック」「ヒープ」が多義語で分かりにくかったとの記載があったが、 自分の場合は「ドメイン」「インスタンス」が多義語で混乱した。がこれはプログラミングではないもの(プログラミングの周辺知識ではあるが)も含まれているので機会があれば書きたい。

最近はプログラミング言語それ自体というより、周辺のツールで使用される概念や用語の理解に苦労する。 最近だとDockerの用語の理解でつまづいた。

あとがき

書きながら、プログラム始めたばかりのころ 全然コードが動かなくて吐きそうになったのを思い出しました。

とりあえず私から言えることは、Javaは最初に学ぶような言語ではないということです。