プログラミング時の注意力とBug
最近、Spacemacsの
The best editor is neither Emacs nor Vim, it’s Emacs and Vim!
という言葉に惹かれて、自分のemacs.dの中にもevil(extensible vi layer)を入れて、vimのキーバインドを使うようにしました。
evilを使っているうちに、1つ気づいたことがあります。それは自分のプログラムの中のBugが以前より増えました。
例えば、c++のstd::vectorのコンストラクタを逆に書いてしまったり、引数をstd::vectorで渡しているのに、参照つけるのを忘れったりして、c++を勉強し始めた時によく間違ったことがまだ自分のコードで現れました。
注意力が分散されたので、Bugが起こりやすくなった
考えたら、Bugが起こりやすくなった原因は、vimのキーバインドのせいではなく、自分がvimのキーバインドに慣れてないだけです。慣れてないので、一部の注意力がvimのキーバインドに移して、完全にプログラミングに集中出来なくなってしまいました。
例えば、emacsのキーバインドを使うとき、行の最後に移動したい場合、何も考えず、自然に、C-eを押します。しかし、vimのキーバインドを使うとき、行の最後は$だから、多分$を押すと最後に移動するだろう
という風に頭の中で考える必要があります。
反省
vimのキーバインドの問題では、使い続ければ、慣れていくので、自然に解決できます。しかし、これと似たような問題がまだたくさんあると思います。
プログラムのメインのロジックに集中するべきなのに、いつもこういう細かい言語レベルに注意力を払わないといけません。そうなると、メインのロジックでBugが起こりやすくなるじゃないかと思います。
例えば、先のstd::vectorの例だと、引数をstd::vectorで渡しているなら、参照で渡した方がいいのような細かいことを注意する必要があります。しかし、これはメインのロジックと全然関係がないですね。
このような問題について、c++では特に多いですが、他の言語も多少あると思います。
どうすればいい
- 大量にコードを書く
大量にコードを書いて訓練すれば、ある程度考えなくても、自然にBugを避けることができると思います。
- 高レベルの言語を使う
例えば、gcのある言語を使えば、メモリ管理のところに気にしなくてもいいです。actor modelをサポートする言語を使えば、マルチスレッドの地獄から解放できます。
- DSL的なものを作る
低layerで言語の細かいところを注意してDSLを作れば、メインロジックをDSLで作ることができます。
- Editor/IDEに任せるものはできるだけEditor/IDEに任せる
例えば、lintを使って、変なコードを書いた瞬間に、warningを出せば、人間の目でいちいちチェックする必要がなくなります。補完機能を使えば、関数名を思い出す必要も無くなります。