分プログラミングに関する雑多なあれこれ今号から,「⁠プログラミングの光景」と題して連載することになった高林と申します。プログラミングは趣味として,仕事として,かれこれ10年ほど行ってきました。本連載ではプログラミングに関する雑多な事柄について書く予定です。第1回は,プログラミングとは切っても切れない関係にある「デバッグ」について取り上げてみようと思います。デバッグの時間ソフトウェア開発において,デバッグに要する時間は相当のものです。プログラマとしては「いやいや,自分はそれほどデバッグに時間を使ってないよ」と否定したいところですが,冷静に考えてみると,現実には自分が考えているよりも(そうであってほしいと考えているよりも)デバッグに時間を要しているように思えます。それに,バグは他人が書いたコードに混入していることもあるので,たとえ自分がバグを入れなくてもデバッグするはめになります。デバッグの方法論についてはさまざまな文献で取り上げられています。デバッグで難しいのはバグの原因を見つけることです。原因さえ特定できてしまえば,修正自体はたいていの場合,簡単に片づきます。バグの原因を見つけ出す主要な方法には次のようなものがあります。最後にいじったところを疑うデバッガで挙動を追うprintfやログを大量に入れる各種のデバッグ用ツールを使う(Cならvalgrindとか)バグが再現するコード・データをできるかぎり短くする(分割と統治)気分転換してほかのことをやる身近な人に相談する(説明しているうちに自分で原因に気づく)デバッグのご相談ならお任せを最後の,「⁠身近な人に相談する」に関しては,状況を説明することが重要なので,相談相手は人ではなく,ぬいぐるみでもよいという説があります。バグの予防デバッグの時間を減らすには,バグを出さないに越したことはありません。バグを予防する主要な方法には次のようなものがあります。ユニットテスト・リグレッション(回帰)テストをしっかりやるコンパイラの警告を最大にするコードレビューをするきれいなコードを書くユニットテストの重要性については近年,多くの文献で強調されており,私の経験としても,ユニットテストのおかげでデバッグに要する時間はかなり減ったという実感があります。言いつつも,「⁠このくらいの小さな関数ならテストを書かなくてもいいだろう」とついさぼってしまい,何時間もプログラムを走らせたのちに結果が間違っている(バグっている)のに気づくというときがいまだにあります。大規模なデータを処理するプログラムを開発する上では,いきなりでかいデータでテストをしないで,まずは小さなデータでテストをするのが効果的です。,「⁠一発で動いたらいいなあ」という期待のもとに,本番のでかいデータで実行してしまいがちですが,一発で動いたためしはありません。通常,プログラマはたいていの問題は自分で解決しようとしますが,どうしても手に追えない場合は,周りのプログラマに救援を求めることがあります。前述のとおり,他人に相談すると,説明しているうちに自分で原因に気づくことが多いのですが,中にはそう簡単には直らない厄介な問題もあります。このようなとき,「⁠どれどれ,ちょっと見せて」といって他人のデバッグを手伝うのは楽しいものです。して楽しいのか考えてみると,次のような理由に思い当たりました。バグの原因を見つけたときに気分がいい(鼻が高くなる)直接的には自分の問題ではない(他人事の感覚なので気楽)デバッグで苦しんでいる張本人と比べて,第三者である助っ人は客観的にコードを見ることができるので,張本人が見落としていた問題に気づくことはよくあります。,「⁠この挙動は以前に見たことがあるぞ」と,過去の事例に照らし合わせて勘が働くことがあります。C++でいえば,メンバ変数の未初期化やスレッドのスタックのオーバフローによるバグは,一度遭遇したことのある人ならば勘が働きますが,初めてのときは厄介なバグです。ペアデバッギングはこうしたノウハウの伝承に効果的です。二度と頼まれなくなる恐れがあります。時代劇の主人公のように「名を名乗るほどの者ではござらん」といって去っていくのがクールなデバッグ仕事人の態度というものです。まとめ今回はデバッグについて書きました。次回からもこの調子で,プログラミングに関する雑多な事柄について書いていく予定です。デバッグ著者プロフィール高林哲(たかばやしさとる)ソフトウェアエンジニア。2.0の布教などの活動を行っている。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。