悪態のプログラマ -29ページ目

悪態のプログラマ

とある職業プログラマの悪態を綴る。
入門書が書かないプログラミングのための知識、会社の研修が教えないシステム開発業界の裏話は、新人プログラマや、これからプログラマを目指す人たちへのメッセージでもある。

もう10年ほど前のことである。自分の書いたソースコードを他の人に見せるのは恥ずかしい、という人がいた。

それなりに経験もある人のようだったので、私は意外に思った。仕事でプログラミングしているのであれば、そんなことは言っていられない。そもそも、ソースコードは誰かに読んでもらうつもりで書くものだ。

しかし、開発現場を見回せば、「恥ずかしいソースコード」がごろごろしている。そして、おかしなことに、それを書いた人々は、恥ずかしいとは思っていないようである。

10年前に「恥ずかしい」と言った人は、少なくとも、プログラムに「上手-下手」があることを知っていた。また、自分の力量がどれくらいであるかも知っていたのだろう。

今、彼はどうしているのだろう。そして、恥ずかしいと思ったこともない今のプログラマ達は、10年後、どうなっているだろう。




■関連記事
プログラマは誰でも同じ?
プログラマとして歓迎したい人とは



Cプログラミング診断室―さらに美しく健康的なプログラムのために
藤原 博文
技術評論社 (2003/07)
売り上げランキング: 51,225
おすすめ度の平均: 3.4
3 今となっては
4 面白い,ためになる,でも読みにくい
4 ダメな実例コードが書いてあるのはこの本だけかと


空から恥が降る
空から恥が降る
posted with amazlet on 06.05.06
藤原 新也
文藝春秋 (2004/05)
売り上げランキング: 68,596
おすすめ度の平均: 4
4 久しぶりに読みました
4 初めて読んだ、藤原新也。
タブが表現する幅は、環境によって違う。プログラマはそのことをよく認識し、タブの幅(桁数の設定)が変わっても、なるべくインデントが崩れないようにソースコードを書くべきである。それがソースコードの「読者」に対するマナーだろう。

といっても、それほど難しいことではない。一部の例外を除き、基本的にはスペースとタブを混在させないようにすればよい。

例えば、インデントが4桁の行はスペース、8桁の行はタブを使うといったことはよくない。タブが8桁(程度)であることを「読者」に強要するからである。

また、1行のインデントの中にタブとスペースを混在させるのもよくない。幅が固定のものと可変のものを合わせると「中途半端な可変」になり、崩れの原因となる。

ただし、この「混在させない」というルールには例外がある。

実は、タブを使ったインデントには、スペースを使うべき場面というのがあるのだ。


ソースコードのインデントでは、プログラムの処理的に意味のあるまとまりを「段落」とみなし、その段落をまとめて段下げする。段落の中に段落を作るような場合には、どんどん下げていくので、「階層」のようになる。

前編 で例に挙げたソースでいえば、関数や「if」、「for」の後の括弧 { ... } の中のような、いわゆる「ブロック」がひとつの段落である。

一方、段落とは無関係なところでインデントが必要なこともある。

行が長くなりすぎたのでやむをえず改行するとか、単にソースを読みやすくするために改行するようなことがあるだろう。このような便宜的な改行でできた行は、段落としては直前の行と同じ階層に属する。しかしながら、直前の行よりも深くインデントすることが多い。

このようなインデントでは、段落の階層が下がるわけではないので、ここでは「階層」と区別して「調整」と呼ぶことにしよう。

例えば、

1: void func2( int a,    // 階層0
2:       int b,    // 階層0 + 調整12
3:       int c ){   // 階層0 + 調整12
4:  if( a == 1 &&      // 階層1
5:    b == 2 &&      // 階層1 + 調整4
6:    c == 3 ){      // 階層1 + 調整4
7:   int d = a + b + c;   // 階層2
8:  }            // 階層1
9: }             // 階層0

というソースがあったとする(※1)。

1行目にはインデントがない。段落の階層の数は0である。

2行目は、1行目の続きを便宜的に改行しているだけなので、やはり階層はない。ただし、「int b」を1行目の「int a」の位置に揃えるために「調整」をしている。3行目も同様。

4行目からは、関数「func2」のブロックの中に入るので、階層が1つ下がる。

5行目も便宜的な改行なので階層は4行目と同じく1である。ただし、「b == 2」をすぐ上の「a == 1」にそろえるために、4桁分の「調整」が続いている。6行目も同様。以下省略。

ここで、インデントを作るときのルールは、

1. 行の先頭から、「階層」の数だけタブを打つ
2. 更に「調整」をしたい場合には、スペースを打つ

である。タブが先でスペースが後である。その順番が逆であってはならない(※2)。

例えば、上記の5行目を書くときには、タブを1つだけ打ち、それ以後はスペースを4回打つのである。

タブを「→」、スペースを「-」で表現すると、次のようになる。

1: void func2( int a,    // 階層0
2: ------------int b,    // 階層0 + 調整12
3: ------------int c ){   // 階層0 + 調整12
4: if( a == 1 &&     // 階層1
5: ----b == 2 &&     // 階層1 + 調整4
6: ----c == 3 ){     // 階層1 + 調整4
7: →→int d = a + b + c;  // 階層2
8: }           // 階層1
9: }            // 階層0

このようにすれば、タブの幅を変更しても、階層内の位置が崩れることはない(※3)。

現実には、「調整」の一部または全部をタブにしているソースをよく見かける。当然ながら、タブの桁数を変更すると崩れてしまう。ソースを読みやすくするはずの改行が、逆にソースを読みにくくしてしまうとは、皮肉なものである。


ここまで、インデントについて考えてきたが、インデント以外の場所でも、縦にコードを揃える必要があるようなところでは、タブは使わないほうがよい。

タブという特殊な文字は常に意識して、取り扱いには注意が必要である。

プログラミング向けのエディタ には、タブを目に見える形で表示できるものが多い。もし自分のエディタの画面にタブが表示されないようだったら、表示することができないかどか、設定等を確認してみるといいだろう。






※1
ここでは便宜上、タブの代わりに全角スペースを使用。なお、HTML の PRE タグが使えることが判明したので、今回から使用している。環境によってはきちんと見えないかもしれないが。。。

※2
タブの左(前)にスペースがくることはない。スペースに限らず、タブの左にはいかなる文字もないほうがよい。つまり、行頭以外にはタブを使わないということである。本文の例でいえば、コメント「//」の前などにタブを入れたくなるが、スペースにすべき。そうしないと、コメントの開始位置が縦に揃わなくなる(もっとも、揃える必要がない場合はタブを入れてもかまわないのだが)。

※3
階層をまたがって縦に並べるようなことをしていれば、ずれてしまう(上記の例で言えば、縦に並んだコメント「//」の部分がずれてしまう)のだが、そのような記述が必要なケースは稀だろう。



Code Complete第2版〈上〉―完全なプログラミングを目指して
スティーブ マコネル
日経BPソフトプレス (2005/03)
売り上げランキング: 4,432
おすすめ度の平均: 4.8
5 これを読まずしてソフトウェア開発ができるか?
5 職業プログラマーになりたいですか?
5 1歩上を目指す全ての開発者へ


ずばりわかる! Java Javaの良いコード、悪いコード
石原 直樹 河村 嘉之 丸の内 とら 米持 幸寿 日経ソフトウエア
日経BP社 (2006/03/09)

プログラムのソースコードを書くときには、行の先頭に空白を入れて段を下げ、意味のあるまとまりをつくって、読みやすくする。いわゆる「インデント」である。

例えば、次のように、関数や、ループ処理(for)、条件文(if)の始まりと終わりを分かりやすくするためにインデントを使う。

  void func(int n){
    for(int i=0; i<n; i++){
      if(i % 2 == 1){
        printf("%d\n", i);
      }
    }
  }

このインデントには、半角スペースや、タブを使う。普通、全角スペースは使用しない(※1)。

タブ(Tab)は、1文字入力するだけで2桁以上インデントすることのできる便利な文字である。ただし、1つのタブが何桁分のインデントになるかは決まっておらず、8桁、4桁、2桁など、環境(エディタなどの設定)によって違ってくる。

このタブの特徴が、ときに面倒な問題を起こすことがある。タブやスペースを好き勝手に使ってインデントされたソースコードを、それが書かれた環境とはタブの桁数が違う環境にもって行くと、表示や印刷が、ガタガタになってしまうことがあるのだ。

たとえば、上記のようなソースがこんな風になってしまう。

    void func(int n){
    for(int i=0; i
            if(i % 2 == 1){
              printf("%d\n", i);
          }
        }
  }

これでは、読みにくくて仕方がない。


と書くと、タブの桁数が環境によって違うことが問題のような気になってしまう。そして、タブは全員4桁に設定しようとか、いや、8桁にすべきだといった議論になりがちである。

しかし、実は、タブの桁数を揃えただけでは、根本的な解決にはならない。確かに、タブの桁数をルール化し、開発チームの全員がそれを厳守すれば、表面的にはソースコードが崩れることはなくなる。しかし、そのルールが通用しないところへソースをもって行くと、やはり崩れてしまうだろう。

他の解決策として、インデントにタブを使わず、半角スペースだけを使うという方法もある。タブがつかわれていなければ、どこに持っていっても崩れることはない。プログラマは、ただタブを使わないように気をつけていればよい(※2)。

しかし、実際には、そのようなプロジェクトは少ない。タブを使うように決められたプロジェクトに参加して、自分だけがスペースのみを使うようなことをしたら、逆にそれがインデントを崩す原因となってしまうだろう。

コーディング・ルールに関しては、郷に入っては郷に従うのが、プロのプログラマである。職業プログラマが、一度もタブによるインデントを使わずに人生を終わるということはほとんどないだろう。

プロジェクトにおいて、タブを使うのか使わないのかといった、最低限のルールを決めることは必要である。しかし、それは決してタブの使い方を知らないプログラマを容認するためのものではない


この問題の根本的な原因は、プログラマのタブの使い方にある。タブの桁数が変わっても、なるべくソースコードが崩れないように書くという配慮が足りないのである。

まず、環境によってタブの表示幅が変わってしまう、ということ自体を知らないプログラマがいる。これは問題外。勉強不足だ。

また、知っていながら、いいかげんなインデントをするプログラマがいる。おそらく、インデントをそれほど重要なものだとは考えていないのだろう。

しかし、読みやすいソースを書くということは、プロのプログラマとしての最低限のマナーである。

そのような人たちには、どうしたら崩れないようにソースを書くことができるのか、一度でも考えてほしいものである。

後編へ続く



※1 このブログの例では、便宜上、全角スペースを使っているので注意。

※2 エディタによっては、タブをスペースに自動的に変換してくれたりする機能があったりするので、それを使うと便利である。



C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス
ハーブ サッター アンドレイ アレキサンドレスク
ピアソンエデュケーション (2005/10)


稼げるJava!今より楽するコーディング
マルチパラダイムシステムズ
技術評論社 (2005/01)
売り上げランキング: 13,942
おすすめ度の平均: 4.5
5 職業的Javaプログラマへの指南書
5 私的には、星5つ
4 一通り文法を学んだJavaプログラマの方に!!!
キーボード操作に慣れるための近道は、なるべくマウス(もしくは、その他のポインティング・デバイス)を使わないことである。キーボードとマウスのどちらでもできるようなことは、キーボードで行う癖をつけるとよい。

しかし、そのように気をつけていても、最初のうちは、どうしても無意識のうちにマウスに手が伸びてしまうものである。マウスを遠くに置いていても、いつの間にか近くに引き寄せてしまう。

今回は、そのような、体に染み込んだマウスへの依存を断ち切るための修行方法を考えてみよう。


荒行がお好みなら、簡単である。マウスをパソコンから引き抜いてしまえばよい。しかし、それでは、マウスでしかできない操作をしたい場合にどうしようもなくなってしまう。

では、なるべくマウスを使わないように、重たくしてしまうというのはどうだろうか? 鉄下駄ならぬ鉄のマウス、つまり「鉄鼠」である(※1)。

しかし、そのようなマウスは売られていない(と思う)。普通のマウスに錘を入れるなどして自作できるかもしれないが、そこまでするのも面倒だ。

そこで、「コントロールパネル」の「マウス」の設定で、ポインタの速度を非常に遅してしまうというのはどうだろうか? こうすることで、仮想的に「鉄鼠」を実現しようというわけである。

無意識にマウスに手を伸ばしても、ポインタが重くなっているので、はっと我に返る。しかも、ポインタの動作が遅くて使いにくいので、自然とキーボードを使いたくなるだろう(※2)。


単なる思いつきなので、その効果については責任はもてない。

しかし、実際に自分でやってみたところ、キーボード派のはずの私も、意外と頻繁にマウスを使っていることを発見したりして、面白かった(※3)。お暇なら一度お試しあれ。




※1
「てっそ」と読む(京極夏彦氏の小説でも有名な、妖怪の名前を拝借)。厳密には、マウスを持つ手を鍛えるために「重く」するわけではないので、鉄下駄のアナロジーになっていないのだが。。。

※2
実際には、マウスが「重い」とは感じられなず、ただ「遅い」という感じ。ポインタをちょっと動かすにも、マウスを大きく動かさなければならなくなる。あえてその状態でマウスを使い続ければ、運動不足解消になるとかならないとか。

ちなみに、マウスではなくトラックポイント(ThinkPad のキーボードについている赤い点)を使うと、本当に「重く」なったように感じるから不思議である。

※3
といっても、私の場合、厳密にはマウスではなくトラックポイントを使っているので、少々事情が違う。トラックポイントによる操作では、ホームポジションから手を動かす必要がなく、キーボードだけの操作よりも効率的な場合がある(例えば、エディタ上でのカーソル移動とか)。



■関連記事
キーボードを使おう その1 ~ ホームポジション ~
キーボードを使おう その2 ~ ショートカットキー ~



Lenovo ThinkPlus USBトラベルキーボード ウルトラナビ付 [31P9514]
Lenovo
売り上げランキング: 399
おすすめ度の平均: 4.4
4 トラックパッドは不要
5 求めていた逸品
4 リラックス・ビュー


文庫版 鉄鼠の檻
文庫版 鉄鼠の檻
posted with amazlet on 06.04.23
京極 夏彦
講談社 (2001/09)
売り上げランキング: 520
おすすめ度の平均: 4.74
5 指の短い私には辛かった。次作は更に辛そう。
5 完成度はこれまでで一番
5 墨色の結界


編集中のファイルはこまめに保存すること。

これは、コンピュータを利用する上での鉄則である(※1)。

編集中のファイルを保存するには、

・「ファイル」というメニューの「上書き保存」を選ぶ
・ツールバーのフロッピーの絵がついたボタンを押す
・Ctrl キーを押しながら S キーを押す(ショートカットキー)

などの方法があるが、どれを使うか?

「こまめに」保存するのだから、なるべく手っ取り早い方法がよい。プログラミングのように、キーボード主体の作業をしている場合なら、ショートカットキー(キーボードショートカット)が最適だろう。

時折、何をするにもマウスに手を伸ばす人がいるが、見ているほうがイライラしてくる。「上書き保存」のみならず、「コピー」や「貼り付け」、「元に戻す(アンドゥ)」など、よく使う機能のショートカットキーを覚えておくと、作業効率が格段にアップする。プログラマであれば「コンパイル」や「実行」などもそうだ。


覚えるといってもそれほど難しい話ではない。ショートカットキーが割り当てられているメニューには、

 上書き保存(S) Ctrl+S

のように、どのキーを押したらよいかが表示してある。ここでは、「Ctrl+S」というのが、「Ctrl キーを押しながら S キー押せば、上書き保存ができますよ」という意味である。

また、「(S)」のような、アンダーライン(下線)が付いたアルファベットにも意味がある。Alt キーを押しながらそのキーを押すと、そのメニューをマウスでクリックしたのと同じことになるのである(※2)。これは、メニューだけでなく、ボタンでも同様である。

これらの親切な表示に気が付いていない人は意外に多いようだ。もったいない話である。

あとは、

・Tab や Shift+TAB でフォーカス(カーソル)を移動
・Alt+F4 でウインドウを閉じる
・Alt+Tab でウインドウを切り替える
・Ctrl+Esc(または Windows キー)でスタートメニューを表示
・Alt+Space でシステムメニューを表示

などをマスターすれば、キーボードから手を離さずとも、いろいろなことができるようになるだろう(※3)。


こうした操作方法を学ぶことは、ソフトウェア開発者にとっては、単に作業効率がアップするというだけではない。

キーボードによるソフトウェアの一般的な使い方 というものを学ぶことができるからである。そこで得られた知識は、ソフトウェアのユーザーインターフェースを設計する際に、きっと役に立つだろう。



※1
言うまでもないと思うが、こまめに保存しないと、突然、電源が落ちたりしたときに編集内容が失われる。

※2
詳細は pcpc さんの記事 をどうぞ。

※3
グラフィック系のソフトは無理だし、エクスプローラや Web ブラウザも使いにくい。しかし、ワープロや表計算などでは、ほとんどの操作ができるはずである。中には一般的なキーボードショートカットが使えなかったり、メニューに「アンダーライン」が無いソフトがあるかもしれないが、それはそのソフトが悪い。

Microsoft 提供のショートカットキー情報はこちら



■関連記事
キーボードを使おう その1 ~ ホームポジション ~
キーボードを使おう その3 ~ 鉄鼠 ~



ショートカットキー活用事典―ビジネスが10倍速くなる!
猪早 圭 Jin
インプレス (2005/03)
売り上げランキング: 37,761
おすすめ度の平均: 5
5 仕事が速くなるはウソじゃない!


ポケット版 Windowsショートカット・キー活用事典
長谷 優子
工学社 (2004/09)
売り上げランキング: 355,740
おすすめ度の平均: 5
5 ていねいな解説が嬉しい1冊