オープンコースウエア 大学名:MIT
講座名:6.00 Introduction to Computer Science and Programming
講義日:2008年10月14日(火曜日) ― 第7週・1回目
担当教授:Prof. John Guttag, Prof. Eric Grimson
全講義数:24コマ
各講義時間:60分
配信開始日:2009年8月19日
講義ビデオソース:Youtube
講義ビデオ収録時間:46分19秒
サブタイトル:有
ジャンル: 検証、デバッグ、防御的プログラミング、単体テスト、テストスイート、科学的検証方法
(解像度が480pあり、コンピュータ画面に表示されたソースコードを比較的はっきりと読み取ることができます。)
ビデオ音声品質5段階評価:4
講義コメント:
今回の第11回と第12回目の講義が、当講座の折り返し地点です。
内容的には、第11回と第12回目の講義前半とでワンセットという感じ。
グターグ教授の印象に残った一言「優れたプログラマーとは、デバッグを身につけたプログラマーのことである」。
講義の内容は、プログラムのデバグに関する手法がメインテーマとなっており、
いままでの講座の内容とあえて連動していない、独立した講義内容となっています。
内容が内容なので、プログラムの例題を取り出してきて説明したり、実行してみたりといった、
いままでの講義の進め方とは異なって、プログラムのデバグに関する具体的な手法及び、
心構えや哲学的な捉え方が、メインテーマです。
そんなわけで、一度通しで見た講義ですが、再度ノートを取り出して、気がついたところをノートに書き出してみました。
講義内容は:
1.ソースコードの検証方法
ソースコードの検証は、問題点をあぶり出し、プログラムの信頼性を高めるべく設計する必要がある。この場合、検証とは試験と、推論の両立てでなくてはならない。
2.デバック
デバッグとは、プログラムがなぜ失敗するのかを確証するためのプロセスである。おおよそデバッグには次の二通りの手法がある。
2.1 機能デバッグ
2.2 パフォーマンス(実行速度)デバッグ
市販のデバッグツールで、本当に使い物になるのは、ほとんどない。最も有用なデバッグツールは、print ステートメントと、ソースコードを読み理解する技術である。
3.防御的プログラミング
防御的プログラミングとは、プログラムの検証とデバッグを促進するプログラミング手法のことである。
プログラムのテスト(試験)とデバッグは、別ものである。
3.1 テスト(試験) ‐ 入出力のセットを要件定義の仕様と比較するのがテストである。
3.2 デバッグ ‐ エラーを生み出したイベントを調査するのがデバッグである。
4.単体テスト
4.1 機能クラステスト
4.2 プログラム全体を対象とした統合テスト
5.テストスイート
テストスイートは、いかの相反する条件を同時に満たさなければならない。
5.1 規定時間内に試験を完了できるだけの小ささ
5.2 信頼性を確立するに足る、カバレージの広さ
6.科学的検証方法
組織的に系統立てて、問題を検証すべきであって、あてずっほうにコードを手直しすべきではない。
6.1 実行結果のデータを検証する
6.1.1 実行結果から、何が予想通り動いたか突き止めること。
6.1.2 ソースコードの内容を検証する
6.2 全てのデータにとってつじつまが合う仮定を考えてみる
6.3 繰り返し実行可能なテストプログラムを組んで、走らせてみる
-------------------------------------------------
Lecture 11 Hand out 補助教材 ダウンロード
Lecture 11 ホームワーク Wordgames2 (前回のホームワークの発展形)ダウンロード
MIT 6.00 講座のプログラムも含んだ資料のダウンロード
-------------------------------------------------
-------------------------------------------------
講義で取り上げたPythonコードの例
例-1 Palindrome デバック前
def silly():
res = []
done = False
while not done:
elem = raw_input('Enter element. Return when done. ')
if elem == '':
done = True
else:
res.append(elem)
tmp = res
tmp.reverse()
isPal = (res == tmp)
if isPal:
print 'is a palindrome'
else:
print 'is NOT a palindrome'
例-1 Palindrome デバック前 実行結果
>>> ================================ RESTART ================================
>>>
>>> silly()
Enter element. Return when done. a
Enter element. Return when done. a
Enter element. Return when done. b
Enter element. Return when done. c
Enter element. Return when done.
is a palindrome
>>> silly()
Enter element. Return when done. a
Enter element. Return when done. b
Enter element. Return when done. a
Enter element. Return when done.
is a palindrome
>>>
例-1 Palindrome デバック後
def silly():
res = []
done = False
while not done:
elem = raw_input('Enter element. Return when done. ')
if elem == '':
done = True
else:
res.append(elem)
tmp = res[:]
tmp.reverse()
isPal = (res == tmp)
if isPal:
print 'is a palindrome'
else:
print 'is NOT a palindrome'
例-1 Palindrome デバック後 実行結果
>>> ================================ RESTART ================================
>>>
>>> silly()
Enter element. Return when done. a
Enter element. Return when done. a
Enter element. Return when done. b
Enter element. Return when done. c
Enter element. Return when done.
is NOT a palindrome
>>> silly()
Enter element. Return when done. a
Enter element. Return when done. b
Enter element. Return when done. a
Enter element. Return when done.
is a palindrome
>>>
-------------------------------------------------
Python コードのHTML表示には、Dan CederholmのSimpleCodeを使用しています。
Python コードの入出力は、Python IDLE から行っています。
-------------------------------------------------
講座第11回のリーディングアサイメント
無し
-------------------------------------------------
テキスト(全てネット上で無償公開)
1. Getting Started: Python and IDLE
2. Python Programming
3. The Python Tutorial
4. How to Think Like a Computer Scientist: Learning with Python
-------------------------------------------------
No comments:
Post a Comment