ちょっと気になっただけですが.
でも、設計もせずに行き当たりばったりに手を動かして、ちゃんとしたものができるとは思わないし、結局デバッグではまる原因になる。yuguiさんが講演で言ってたことも結局そういうことじゃないかと解釈したし、Linusが長い間カーネルデバッガの導入に反対だった(2.6.26でkgdbがマージされた)のも同じ理由からだろう。
(Plan9 日記 2009-04-25 ■[イベント] Debug hacks conference 2009)
別に oraccha さんに何か物申したいわけではないのですが,この手のデバッグの話になると,なぜか
「デバッガを使うよりも ○○ (コードの書き方とか,設計とか,開発プロセスとか,テストとか,何でもいいのだけど) の方が大事だ.」
という論調の人が沸いてくるのはなんでなんだろうな,と思います.単なる論理のすり替えなんじゃないかな… 並べて議論するようなものでは無い気がします.
まるでデバッガを使う人が,なぜかみんな 「ちゃんとした設計をしないで」 「いきあたりばったりのコードを書いて」 「小手先でバグを直すだけで本質的なバグの原因を見逃し」 「テストも書かない人」 と言わんばかりですな.
ここらへんは,やっぱり,コンパイラやデバッガは,一般のプログラマにとっては不可侵な領域,ある種の聖なるもの,として必要以上に畏れ多いものとして扱われているのが原因なのかなと.なので意見が両極端に触れて,建設的にならない.宗教と同じで,すぐに原理主義か無宗教かという極端な話になる.
OS とかプログラミング言語とか処理系とかも 「偉い人賢い人が設計して実装した素晴らしいものを,我々下々の物が使わせていただく.それに物申すなんて不敬罪」 みたいな雰囲気はある気がしますね.
OS とか言語とか処理系の方は,わりとメジャーになってきて,いろんなものが出てきてるけど,デバッガはまだまだ特別な物なのかなと思います.自分が使いやすいデバッガをデザインしたり,既存のデバッガをハックして欲しい機能を追加したりするのが当たり前の世の中 (いつになるのかわかりませんが)になってくれば,また変わってくるのかもしれませんね.
ちなみに弊社では,「こういう設計で,こういうコードを書いて,こういうコードが出れば理想的だが,既存のコンパイラは欲しいコード出してくれないし,既存のデバッガではデバッグが非常に困難になる」 というような場合,デバッガは当然のこととしても,最近ではコンパイラにまで手を入れるのが普通という流れになってきているので,他の会社とはプログラミングに対する概念がかなり根本的に違うなーということをよく感じます (他の会社知らないけど,あんまり聞かない気がします).
逆に,そういう既存の膨大なコードベースをサクサク改良したり,保守したりすることができるのも,デバッガがあってこそなわけですし.
コードの書き方に合わせて,デバッガを改良することにより,普通では開発できないような設計や構成が可能になる.これが弊社の技術的強みの本質なんだなと,最近ようやくデバッガ開発に参加し始めて,社長に 2 日かけてデバッガの内部構成の説明をしていただいて,その片鱗に触れることができた思いがします.
普通の書き方ではかなり大変になるであろう,デバッガの複数 UI 化や,マルチコア SMP 対応なども,独自の書き方で非常にシンプルになっていて感動しました.
どうやったらこんなの思いつくんだ ? と思いましたが,やっぱり,デバッガが特別なものではなく,改良していくのが当たり前という世界でずっと生きていると,発想が根本的に変わっていくのだろうなと思います (もちろん社長の天才的な発想力もあるのだと思いますが).
とかダラダラ twitter の方に書いてたら,hyoshiok さんからツッコミが入ってました.
@alohakun 誰もデバッグの事や、テストの事や、ソフトウェアの品質管理のことを体系立って教えてくれていなかったんですよ。趣味の問題にとやかく言われたくない症候群。
http://twitter.com/hyoshiok/status/1618207240
なるほど,「趣味の問題にとやかく言われたくない症候群」 ってのは,いろいろなところにありそうな気がしますね.
なんかとりとめもなく長々と書いてしまいましたけど,要するに,手段はないよりある方が良いし,できないよりはできた方が良いに決まってるということです.
便利な技術やツールが,技術者を堕落させるとかいうのは,また別の話でしょ,という.そんなのは,新しい技術が生まれるたびに必ず言われる 「最近の若者は」 だし.
「最近の技術者はすぐにコンパイルして実行するから駄目だ.わしが若い頃は,十分に机上デバッグして,脳内でプログラムをシミュレートしてから実行したもんだ.おかげでデバッガを使うまでもなく,バグを見つけることができた」
とかすぐに言い出す人が出てきますけど,その当時とはプログラムの規模も複雑さも全く違いますからね.
全部自分で書いた,小規模なコードならともかく,GCC や Linux みたいに,大量の ifdef で切られていて,関数ポインタ使いまくりの,数十から数百万行を超えるコードベースなんて,静的に追えるものではありません.また,仮に追えたとしても,それは単なる想像に過ぎずに,本当に動いている生きたコードであることは,デバッガなどで動的に追わない限り確信することはできません.