こんにちは、ナナです。
この記事は、プログラミング未経験・初心者にとって、すごく大事なことを解説します。
私は日ごろからプログラミング未経験者に対して指導することが日常なのですが、そこでよく見る光景がプログラムが思うように動かず、画面を見ながら悩み続ける姿です。
こんな状況になっている皆さん、いいですかっ!
ボーっと見てても問題は解決しませんっ!
では、どうしたら解決するのか!それは『デバッグ』をすることなんです。
『デバッグ』という技術は、プログラミング言語を学ぶ書籍などで紹介されることがほとんどないのですが、初心者の人ほど活用すべき機能なんです。
本記事では次の疑問点を解消する内容となっています。
では、『デバッグスキル』の使い方をレベル別に解説していきましょう。
「PyCharm」統合開発環境の『デバッガ機能』を紹介
まずは、「デバッグ」って何、ということを学びますよ!
そもそも「バグ」って何?「バグってる」とか言うよね!
「バグ(bug)」とは虫のことであり、プログラムに問題があることを「バグがある」と言います。
プログラムを作る過程において「思い通りに動かない」ということは、プログラミングを始めたばかりの人ほど多く経験します。それはつまり、プログラムに「バグ」があるわけなんです。
このバグを取り除くことができれば問題は解決するわけです。これを「デバッグ」と呼びます。
デバッグ工程の流れ
プログラムがうまく動かないということは「バグ」があるということです。しかし、この「バグ」を見つけることは初心者ほど難しいのです。
このバグを見つけるためには「デバッグ」を正しい手順で行う必要があります。デバッグの作業とは次のものです。
この工程の中で、初心者が苦戦しやすいのが「STEP2」の原因を調べる工程です。
問題の原因がわからなくて、「ボ~」っとしてしまう人をたくさん見てきました。
調べるということは、手を動かすことなんです。「ボー」っとプログラムを見てても決して解決しませんよ。
統合開発環境に搭載されている『デバッガ機能』
本サイトのPython入門では「PyCharm」と呼ばれる統合開発環境を利用する構成となっています。
多くの統合開発環境では「デバッガ」と呼ばれるデバッグするための機能が搭載されています。
この「デバッガ」こそが、プログラミング初心者が『統合開発環境』を使う最大のメリットといっても過言ではありません。
「PyCharm」に限らず他の統合開発環境を使っている場合でも、この記事のノウハウは役に立ちますよ!
デバッグ技術 レベル1:『ブレークポイント』と『ステップ実行』
デバッグ機能もいろいろとあるため、一度に全ては使いこなせません。現在の皆さんの学習状況に合わせて、必要なデバッグ技術を学ぶとよいです。
まず、「レベル1」としては次の人を対象としています。
それでは、条件をクリアしている方はデバッガ機能の基本を学んでいきましょう。
『ブレークポイント』の設定方法を覚えよう
『ブレークポイント』とはプログラムを一時停止するための、マークのことです。
デバッグをするときは、この『ブレークポイント』を怪しい部分に設定しておき、プログラムを順に見ていくことになります。
まずは、簡単な次のプログラムを例に『ブレークポイント』の設定方法を覚えましょう。PyCharmにプログラムをコピーしてください。
calc = 10
calc = calc + 20
print("計算結果:", calc)
PyCharmのエディタに『ブレークポイント』を設定することができます。
プログラムの左に部分をクリックすると、●印が表示され『ブレークポイント』が設定されたことを意味します。
『デバッグ実行』をしてプログラムを動かしてみよう!
プログラムを動かすことで『ブレークポイント』の位置までプログラムの処理を進めるわけです。ただし、このデバッガを利用する際は『デバッグ実行』というものを行う必要があります。
スイッチをよく見ると「虫」のマークをしているのがわかりますね。これを押すことで『デバッグ実行』が開始されます。
プログラムが起動し実行されますが、『ブレークポイント』が設定されている場所に差し掛かると自動的にプログラムが一時停止の状態となります。
止まったときに表示される青帯の部分は「次に実行しようとしている処理」を示しています。
つまり、青帯部分はまだ実行されていない状態だということに注意してください!
『ステップ実行』をしてプログラムを1行ずつ動かしてみよう!
『ブレークポイント』で一時停止したプログラムは『ステップ実行』をすることによって1行ずつ順に動かすことができます。
『ステップ実行』にはいくつか種類があるのですが、レベル1では『ステップオーバー』を覚えましょう。
『ステップオーバー』を1度だけ押すと、青帯が次のプログラムに移動し、1行進んだのがわかります。
変数の『インスペクタ機能』を見てみよう!
プログラムとは「情報」を処理で加工しながら動きます。バグの原因の多くは、この「情報」を正しく制御できないことにあるのです。
この情報とはプログラムで言うところの『変数』であり、『変数』の値が狙い通りの値になっていない問題が多いのです。
デバッガには変数の『インスペクタ機能』が搭載されています。これは、変数の情報を可視化したものです。
インスペクタ画面には、ステップ実行を行うたびに最新の変数の状況が表示されます。
この画面でプログラムの進行状態に伴い、自分が意図した値となっているかを確認することでバグを見つけ出すことができます。
まず、覚えるべきは『ブレークポイント』『ステップオーバー』『変数のインスペクタ』の3つですね。
これらはデバッガを扱う基本機能になります。
デバッグ技術 レベル1:バグを見つける流れ(実践編)
次はレベル1で習得したデバッグ機能を使って、実際にどんな感じで問題を見つけていくのかを実践的な手順で示します。
わたしが普段直接指導しているような感じで解説します。このあたりは手順は、初心者の方にはめちゃくちゃ役に立つ技術ですよ。
『デバッガ』を正しく使って、プログラムを追いかけることができれば、初心者のうちに抱える9割くらいの問題は解決するでしょう。
つまり、
本サイトのような独学で学ぶ初心者の方ほど
『デバッガ』を使いこなすことで問題が解決するのです!
それほど、この『デバッガ』は強力な機能なんです。
ただ、「デバッガを使うといいよ!」とアドバイスしても、「使い方がそもそもわからないから、どうしたらいいのかわからない」と悩んでしまうんですね。
そこで、実際に問題のあるプログラムを例に、どんな風にデバッガを使うのかを解説しましょう。
問題を抱えたサンプルプログラム
簡単なプログラムですが、次の問題を例にデバッガの使い方を覚えましょう。
サンプル問題:台形の面積を求め100以上か100未満でメッセージを変化する
- 変数「up」を上底、「bottom」を下底、「height」を高さとして定義し、任意の数値を与えるものとする。
- 台形の面積が100以上の場合は「面積が大きいです」、100未満の場合は「面積が小さいです」と表示せよ
出力期待結果
ケース①:up = 5, bottom = 10, height = 10 のとき
面積は小さいです
ケース②:up = 5, bottom = 15, height = 10 のとき
面積は大きいです
この課題を、次のようにプログラムしてみました。実はこのプログラムには間違いが潜んでいます。
up = 5 # 上底
bottom = 10 # 下底
height = 10 # 高さ
area = up + bottom * height / 2
if area > 100:
print("面積は大きいです")
else:
print("面積は小さいです")
面積は小さいです
STEP1:プログラムが上手く動いていないことを自覚する
まずは、問題が起きていることを自覚することです。今回はケース①の入力ケースであり、期待通りの出力結果が得られています。
それでは、ケース②の入力パターンで動かしてみましょう。
up = 5 # 上底
bottom = 15 # 下底
height = 10 # 高さ
area = up + bottom * height / 2
if area > 100:
print("面積は大きいです")
else:
print("面積は小さいです")
面積は小さいです
期待する結果としては「面積は大きいです」なのですが、「面積は小さいです」が表示されました。
これが「うまく動いていないことを自覚した」の瞬間です。
今回はわたしが出力期待値を指定しているため、すぐに明確に間違っていることがわかりますね。
しかし、本来は皆さん自身で出力期待値を設計し、その通りになっているかを確認することになります。これを「テストケース」と呼びますよ。
STEP2:うまくいかない原因を調べる
問題があることがわかったら、次は原因を調べる工程に入ります。問題が起きているテストケースが明確な場合は、そのケースにて原因を調べるのがよいでしょう。
ここからは『デバッガ機能』の出番です。『ブレークポイント』と『デバッグ実行』を活用しましょう。
初心者の方はまずは、プログラムの先頭に『ブレークポイント』を設定するようにしましょう。
だんだん、デバッグのコツがわかってくると、原因がありそうな場所に『ブレークポイント』を設定し調べられるようになります。
慣れないうちは最初の行に設定しておきます。
次は、『ステップオーバー』でステップ実行を行いながら順にプログラムを検証します。
プログラムを1行1行吟味しながら、じっくりと意図した動きになっているかをチェックします。この時、『変数インスペクタ』は常に監視し、変数の値が狙い通りの値かをチェックします。
初心者がよくやってしまう禁止事項が「何も考えずにステップオーバーを連打する」ことです。
このような初心者を何人も見てきましたが、「それ意味ないから連打しちゃダメ!」と毎回指導します。
デバッグとは問題を探す工程なんです。連打なんかしてたら問題を見落としてしまうに決まってるんですよ!
『ステップ実行』をする際にはポイントがあります。それは、次に処理されるプログラムの実行結果を予想しながら順に動かすことです。
皆さんが動かすその1行のプログラムは、必ず何らかの意図を持った処理なんです。その理想の動きと、『デバッガ』が突きつける事実を照らし合わせてプログラムを検証していきます。
それでは下記プログラムの『ステップ実行』を行い、プログラムの実行が白色の行に差し掛かったとしましょう。
up = 5 # 上底
bottom = 15 # 下底
height = 10 # 高さ
area = up + bottom * height / 2
if area > 100:
print("面積は大きいです")
else:
print("面積は小さいです")
この時に考えるべきことは
「台形の面積は上底と下底を足した20に、高さ10を掛けて2で割るのが正解だな。つまり、面積は100になれば合ってるよね」
と考えた後に『ステップ実行』をします。
動かした結果、理想の「100」に対して、デバッガは「80」であるという事実を突きつけました。この理想と事実の違いこそがバグの発生地点です。
つまり、『ステップ実行』をするときは、常に「自分の理想」と「デバッガの事実」を比較しながら、違いが出てくる場所を見つけるのです。
これは『デバッガ』を使うときの、すっごい大事なポイントを解説していますよ。
本当に初心者には役に立つ考え方なので理解できるまで読み直して、実際に実践して身に付けてください!
STEP3:正しく動くためにはどうしたらよいかを考え作る
原因がわかってしまえば、解決方法は比較的簡単に導き出せることが多いです。
今回は台形の面積が正しく計算できていないわけです。算数の計算は加減算より乗除算の方が優先されるのでしたね。これはプログラムの世界でも同じです。
つまり、()を使って上底と下底を先に計算すればよいということですね。
up = 5 # 上底
bottom = 15 # 下底
height = 10 # 高さ
area = (up + bottom) * height / 2
if area > 100:
print("面積は大きいです")
else:
print("面積は小さいです")
実はこのプログラムにはもう一つバグが含まれています。皆さん、デバッガを使って原因を調べてみてくださいね。
デバッグ技術の「レベル2」は『Python 関数のデバッグ方法と「脳内デバッグ」の鍛え方』の記事で紹介しています。「関数」が学び終わった方は是非見ておくことをオススメします。