トップ «前の日記(2014-12-28) 最新 次の日記(2015-01-02)» 編集

日々の破片

著作一覧

2014-12-29

_ プログラミングの初心者を脱するのはいつか?

Effective Rubyの見本刷が届いたのであらためて読み返しているのだが、監訳していて何を今更ではあるけれど、初心者用のプログラミング入門書と、そこを脱した人(まあ中級者とかになるのだろうけど)のプログラミング入門書の違いというのを考えたので、ちょっと書いててみたい。当然Effective Rubyの宣伝だ。

さて、もちろん、Effective Rubyは初心者用ではない。

表面的には、対象となるプログラミング言語を読者は知っている(少なくとも一般的と認められる構文やAPIは知っている)ことが前提となる。

が、そこは重要ではない。

なぜ重要ではないかと言えば、紙数と労力に問題がなければ(わかっている読者には煩雑になることは覚悟の上で)それらを出現時に説明しても良いからだ。

あるいは表面的には(少なくとも自分用の一発勝負のスクリプトでは)あまり使わない機能などが説明されている。そういった「マニアック」(愚かな言葉だと思うので「」に入れている)な機能が説明されていることか?

が、それも重要ではない。

たとえば、レシピブックを考えてみよう。当然、読者はそのプログラミング言語を知っていることが前提となる。また、なるほどそんな便利なメソッド/記法があったのかと初めて知る「マニアック」な説明があったりする。書籍としての機能は、その言語のある機能を利用したい場合、あるいはある機能をその言語で実装したい場合に、どう書くのが一般的か、あるいは楽か、あるいは簡潔か、あるいは純粋にどう記述するのかについての列挙だから、当然、そうなる。

これは中級者用か? そうではなかろう。分類するならばクラスレスな書籍だ。別に初心者が使いたい機能を実現する書き方を探して丸写しにして利用しても全然OKで、それも想定内となる。

Rubyレシピブック 第3版 303の技(青木 峰郎)

レシピブックについては、利用している言語の文法や構文をいちいち説明しないのは、クラスレスなのでとっくにわかっている人間も読者として想定した場合に煩雑だし、実用性からレシピをたくさん詰め込むにあたってはいちいち詳細を説明するのは余計な労力であり紙数の無駄だからだ。これについても別に記述しても本質的には問題ない。「マニアック」な記述方法の説明があるのは、それが純粋に便利だったり実用的であったりするからだ。

では何が重要か、あるいは何を読者に要求しているのか、だ。

中級者以上を対象とした技術書が読者に要求するものは、単に対象となるプログラミング言語の知識ではない。また無意味に初心者のうちは利用しない機能を紹介して知識を詰め込もうとしているわけでもない。

読者に要求し、かつ説明しようとしているものは、嫌いな言葉だが「覚悟」というものだ。

そこが初心者用とそれ以上のクラス用の技術書の違いだ。

端的には、自分のためのプログラムを作る方法を示すのか、自分以外も利用するプログラムを作る方法を示すのか、だ。

自分しか利用しないプログラムは完全なホワイトボックスだ。それに対して自分以外も利用するのであれば、それはブラックボックスとなることも想定しなければならない。たとえば、gem installしたRubyGemのソースコードをきちんと追っかける利用者を想定しない。そうではなくinstallしたらreadme.mdにちょろっと書いてあるAPIの記述だけで利用されることを想定する。

そういった、プログラムの利用されかたのバリエーションについて想像できることが読者に求める前提だ。

すると、自分のためだけにプログラムを記述していればおそらくほとんど利用する意味がないdupやcloneの利用を考える必要が出てくる。freezeさせる意味も出てくる。例外についての設計も必要となる。安全性の考慮も必要だし、他のRubyGemsとの協調動作も考えなければならない。さらには、ソースコードに自分以外の読者がいる可能性も当然考える必要がある。コミュニティで喜ばれて使われている簡潔な記法があればそれを利用すべきだし、逆に小児病患者(あるいは現時点の宇宙飛行士)向きと思えば利用しない。

Effective Rubyはそういう本で、意外とこのためだけに記述されたRubyのプログラミング書籍はない(と僕はぱっと見たところ思うのだが、もちろん部分的にそういうところまで踏み込んで説明している本がある――たとえばRailsの列車本はそうだ――のは知っている)。

というわけで、githubで公開したりrubygems.orgで公開するようなコードを書く、書いている、書く予定がある、仕事でRubyを書いている、読んでいる、修正している、保守している、引き継ごうとしているならば、ぜひEffective Rubyを読んで(僕の立場としては当然「買って」)ください!

Effective Ruby(Peter J. Jones)

(と考えてみると、世の中のプログラマのほとんどは初心者だよな……)


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え