プログラミングでつまづいてきたこと

プログラミング初心者に対してどういう情報が役立つのかをぼんやり考えていると、そこそこコードを書けるベテランが、いつ、どういうことにつまづいてきたのかを書くとけっこう有益なのではないかと思ったので書きました。これを読むと直接プログラミング能力が上がるわけではないですが、「ああ、こういうところでつまづいてもいっぱしのプログラマになれている人もいるのだな」と思ってもらうのが目的です。成功談よりも失敗談のほうが役立つとよく言われますが、それと少し似ているのかもしれません。

全段落で「いっぱしのプログラマ」とか言った手前、自分のことを書いておきます。18歳ごろから20年くらい前からプログラミングをしていて、主に有名どころのOSSに向けてコードを書いてきました。昔はLinuxカーネルを10年少々やっていて、ここ最近はCephオーケストレータであるRookの開発とかをしています。プログラマとしてはスーパー優秀とは言えませんが、そこそこは書けます。

では、本題。長ったらしく文書にはせずに、ずらっと列挙します。だいたい上が古くて下が新しいです。後から思いだしたら追記するかもしれません。

  • ポインタが理解できなかった(18歳ごろ?)。メモリのイメージがまったく頭に無かったので参考書を見ても何が書いてあるのがわからなかった。printfで変数のアドレスやポインタの値、それを加減した値などを出力しまくって理解した。
  • 再帰、末尾再帰、クロージャ、メモ化が理解できなかった(20歳ごろ?)。大学に入ってLISPというのがあるらしいと知って書店でSICPを買って読み始めたら何もかもわからずに絶望した。紙に状態遷移図を書きまくってようやく理解した。
  • 「オブジェクト」の意味が多いので混乱した(20歳ごろ?)。具体的にはコードのかたまりであるオブジェクト(ファイル)とオブジェクト指向言語のオブジェクト。何冊か本を読むとようやく別物だと理解できるようになった
  • 「スタック」の意味が多いので混乱した(20歳ごろ?)。具体的にはデータ構造としてのスタックとメモリ上のスタック領域。上記と同様、何冊か本を読んでようやく理解した。
  • 「ヒープ」の意味が多いので混乱した(20歳ごろ?)。具体的には動的メモリ領域としてのヒープとヒープソートのヒープ。これは気にしないでおこうと思って放置していたら、数年後に全然別物と知った。
  • アセンブリ言語がわからない(22歳ごろ?)。レジスタとメモリの違いがわからなかったし、関数呼び出し規約を知らなかったので、いつ何を使っていいかがわからなかった。アセンブリ言語プログラミングの本を数冊読んでやっと理解した
  • なんでも(OOPLという意味での)オブジェクトで表現すべきと思い込んで四苦八苦した挙句プログラミングが楽しくなくなった(23歳ごろ?)。その後、よくわからないうちに飽きたので自縛から解けた。
  • C++の演算子オーバーロードとテンプレートを使うとかっこいいという思いがあって無意味に使っていた(23歳ごろ?)。「一体何をやってるんだろう」という気分になってきてやめた

わたしが主にC言語などの高級とはいいがたい言語を中心に使ってきたこともあって最近プログラミングを始めた人にとってはピンと来ない言葉もあるかもしれませんが、そのへんは無視してもらっていいです。

最後になりますが、プログラミング初心者は何かにつまづくと「それくらい知っていて当然」とか「これが理解できない奴はセンス無い」とかいう暴言が飛んできがちですが、狂犬が吠えていると思って無視しましょう。