読者です 読者をやめる 読者になる 読者になる

とむとむのどーでも良い日々

日々の出来事をそこはかとなく書き綴る日記です

プログラミング入門書

たまには技術者であることをアピールすることを書いてみたり(笑)。

現在僭越ながら新人研修でExcelVBAの講師を担当しています(VBAExcelも詳しくないのに(笑))。とは言っても会社の教育方針で、ExcelVBAの入門書を手がかりに勉強し、わからないところなどを教えるというスタイルです。つまり、基本的には自習なわけです。

で、これに使っている入門書なのですが…内容がいい加減すぎます。For~NextループとFor Each~NextループではFor Eachのほうがはるかに高速だって(笑)。検証の仕方を間違っているのです。コレクションの要素にアクセスする場合、インデックスで参照するのは遅いのです。なのにその方法でループの速度を比較しているのでしょう。つまり、ループ速度を比較しているつもりなのに、実際は要素へのアクセス速度を見てしまっているのです。コレクションの要素列挙なら、インデックスを用いないで要素を列挙できるFor Eachの方が速いのは当たり前。配列を使ったループなら、通常のForループの方が速いです。実際に検証しました。とは言っても、10万回ループして速度差1秒程度。誤差の範疇ですね。ですけど、「For Eachのほうがはるかに高速」は完全に否定できます。

また、参照渡しの仮引数を持つ関数を呼び出す際、実引数をカッコで囲むと値渡しになると書いてありました。これも間違い。実引数をカッコで囲むと式として評されるため、一時領域に保管され、その参照が渡るため、実引数を書き換えられないのです。値渡しになっているわけではなく、参照渡しだけど実引数と別の領域の参照が渡っているのです。動作的には値渡しと結果的には同じですが、ウソはいけません。

他にも、Boolean型の判断に「= True」「= False」とか書いてあったり、MsgBoxの引数をorではなく+で加算してたり、Left関数で良いところをMid関数を使っていたり、文字列をカンマで連結するのにJoin関数を使わなかったりと、少なくとも自分の目からみたらボロボロです。こんな本が改定を重ねて売れ続けているらしいのです。

 入門書なので、識者が見ることはないので、あまりつっこまれないのでしょうね。まぁ人間だれしも間違い・勘違いがあるし自分だって間違いますから、あまり強く言うつもりはありませんが、それにしたって「配列をFor EachでVariantで受けて処理すると別領域に値がコピーされて高速に読み出される」とか書いてあって、頭抱えました。配列だってそのコピーされた値だって同じメモリにいるんですよ?なんでコピーすると高速に読み出せるんですか?つか、コピーするのにだって処理コストはかかるんですよ?そんなことしないで普通に連続領域に取られる配列がどうして遅いんですか?…書いてておかしいと思わなかったのかなぁ…。

あまりウソや曖昧な記述を公共の場に出さないで欲しいです。訂正するの大変なんですよ…。未だにオブジェクト変数にNothing代入しないとメモリ解放されないと思っている人は大量にいますが、(Microsoftが原因を生んだ張本人ではありますが)この手の間違った情報の流布が原因です。本とかサイトとかに書いてあると、盲信する人多いんですよ。初心者だから当たり前ですけどね。

なお、今回使用した本だけではなく、昔使っていた入門書にも間違いがあったり好ましくない記述があったりしました。入門書ってそういうもんなんですかねぇ…。かと言って書いてある内容を精査して購入するのは大変だし、信頼できるライターさんは入門書なんか滅多に書かないし。自分で書くのは面倒だし(笑)。良いサイトを見つけて新人に紹介するしかないですかね。

スポンサーリンク