関数型プログらミングの時代ですが、DXの本とかみてると、パターンやオブジェクト図が深くかかわってきてるような、そうなると、オブジェクト指向を避けては通れないような気がします。嫌だけど、OOPやって、それから関数型プログラミングという体を引き裂かれるような体験は避けては通れないのかな、OOPから関数型プログラミングは
あたりですね、Kotlin でやってるみたいでまだ最初の方でしか読んでませんが。。。
ということで、オブジェクト指向の勉強は やはり必須のようですね。あまり教えたくないですが。。。
結局避けては通れないようです。
それで 私流の学び方 教えます。一番良いのは Java で デザインパターンを勉強することです。
他の言語だと、その言語が便利すぎて、すでに デザインパターンが実装された形で言語が作られていてどこがデザインパターンか分からないからです。
お勧めは
です。実はJavaの勉強方法も同じくこの本から進めた方がいいのです。やり方はこの本のサンプルコードを EclipseというJavaの総合開発環境をインストールして動かしていきながら中のコードを読んでいくことです。
Eclpseは 例えば
とかを見てインストールしてみてください。本のサンプルコードは中にコピーするだけで、Eclispeは勝手にコンパイルしてくれるので、いつでも実行できるようになります。デバッグもできるので変数の状態も確認できます。
Javaは全然知らなくても、インストールとコードの動かし方は書かれてる通りやればできます。この辺がどんな言語でも環境構築が壁になりますが、ちなみに最近の流行はVSCodeですが、そこでもできるでしょう。ただ どっちでもいいですが、多分Eclipseのほうがネットにもいろいろ説明が多いような、書籍はJava の入門書はEclipseで行うのが定番ですが、2015年くらいで止まってます。おそらく本で書くよりもネットが普及したのと、それほど、みんなJavaをやらなくなったからではって思います。ちなみに言っておくと、EclipseもVSCodeも開発者はErich Gamma 氏でWiki にある通り、Gang Of Four の主要メンバー
つまりこれから学ぶデザインパターンの起源はGoFのデザインパターンから始まったのですが、それはC++で書かれた本です。有名な本。 それのJava へ言い換えたのが、結城さんの本です。
さて文法は、知らなくても、とりあえずこの本から始めましょう、で、何か文法書なり入門書はそばにおいて、入門書から読んではダメです。こちらを見てコードがわからなかったら、入門書で意味を調べる。これが最善の勉強法です。大抵入門書から読むと、C言語レベルの使い方で息切れしてクラスまで行きません、クラス 抽象クラス インターフェース 仮想関数 ポリモリヒズム カプセル化 スレッドとかまず行きませんから。またJava 特有の public protected private とかは、適当に見てください。あまりこだわっても、他の言語では大まかな意味はあっててもずれてくるんで意味ないです。
リファクタリングにしろ UML的なモデル構築にしろ、基本はJavaが頭にあるように思います。
「ls を読まずにプログラマを名乗るな!」って本があります。2013年出版の本でKindle 版が出ています。私がこの本をC言語の本として進めます。
下手な入門書を読むより、ずっと良いと思います。GNU のCoreUtls の中にあるls.c
というls のソースを読むわけです。なぜ良いとかというと、ほぼいろんな環境で可能だからです。WindowsのUbuntuであろうが、raspberry pi でUbuntu であろうが 普通のUbuntu であろうが、勉強できます。要はgcc, make, gdb あたりをapt でインストールしたら、じっさいCoreUtils のファイルをとってきて ./confiure, make CFLAGS='-g' でデバッガーgdb 使いながらソースを走らせてみることもできます。ただし何分2013年の本ですから この本で触れてあるls のソースのヴァージョンはCoreUtils 8.21 のものでこれは中のソースのライブラリーかGlibが新しくなってるためかコンパイルはできません。しかしCoreUtils 9.0という最新のものはコンパイルできます。ls.cも diff で比較したらかなり変わってますが、書いてる部分についてはソースは変わりないようです。
なぜ、これがいいか? 今の人たちは CUIをあまり使わないので、その良さを知りません。ls を使ってないでしょうね。このコマンドがいかに便利か、そしてそれを実現をCでどうやってるのか、この本は解説しています。
またコンパイル自体もls.cだけでなくいろんなものをコンパイルしてるわけで、そのmake や Makefile また ./configure という、GNUのautomake 環境など本当の実装を見られます。
あとソースを読むのに、いろんなツール、エディターつまりemacs やvim またはless を使うし、grepも使うはずです。前述のdiff もそうです。これらはほかの言語を勉強する際にも役立つ環境です。
本を見てて思うのは、ソースのどの部分を見ないで、捨てるかつまりどこを捨ててどこをちゃんと見るか、これを学ぶことになると思います。大半はエラー処理です。だからそこは飛ばして、やっていることを取り出す。しかしC言語の場合、すべてやらないといけない。変数にメモリーを割り当てる部分や構造体を自前で作らないといけない。これらはOOPな他の言語ではそういうパーツがすでにあってそれを使えば、勝手にやってくれる。そこを全部、自分でやっている。だかた今の言語で読み替えて、それでどんな作業をやってるか見る作業が必要になってくる。そのために捨て去る部分がかなりある。結局はそのメリハリをつけることの重要性を学ぶことになると思う。
ほかのCのソースと違ってls はla.c の一つのファイルをよめばよい。その意味ではほかのプログラムでみるCのソースは、何十個もソースファイルが分かれてるので、どのファイルか探すだけでも骨が折れる。これはそれはない。
私自身も進行形のお勧めの勉強法です。
もちろん OOPや関数型言語の勉強は必須です。しかしC言語を学ぶ意味は上に書いたようなことだと思う。


