【イベントレポ】2024/11/06 コードを読み解きながら体験する!初心者が身につけておきたい「プログラムを読む技術」
はじめに
概要
イベント概要
登壇者
最初に
今日伝えるのは、「プログラムを読むときの考え方、プログラムの読み方」
今日の話を聞くことで、読む力を身に付けるのを早める
自己紹介
コンサルタントとプログラミング教室と甲南大学非常勤講師
共通して「考え方」を教えている。
IT企業の社員に就職し、プログラマーからPM、システムエンジニアへ。
10年務めた後グランドサークルを立ち上げて、プログラマーから始めていたが、作っても売れず営業が苦手な事もあってコンサルタントおよびプログラミング教室を始める。
プログラミングの教室の生徒からプログラムの読み方を質問されることが多かった。その生徒は1行1行は読めるが、まとまった単位で読めなかった。そのため、設計や目的を考える視点が必要と考えた。プログラマーとしての自分の考え方をもとに、「プログラムを読む技術」を書いた。
プログラムを読む機会
書籍のサンプルプログラム
他人のコードの引継ぎ
バグ修正・デバッグ
機能追加・仕様変更
ソースコードレビュー
なぜ他人のプログラムを読むのは難しいか
一番大きい理由は、他人や過去の自分との設計する際の考え方の違い。設計を読み取れていない。
そのため、プログラムを書いた人の考え方が読めるようになるとプログラムも読めるようになる。
プログラムの読み方
まずプログラムの構造を理解する
その上で
プログラムの全体を把握する
それぞれの部分の役割を理解する
一行一行の役割を読み取る
プログラムには作られた目的がある。何らかのデータを何らかの形に変えるために作られる。つまり、入力を出力に変えるのがプログラム。
処理のところはどういう風に書いても出力が実現できていればいいため、考え方の違いで読めなくなる。
処理の中も細かい入力、処理、出力の組み合わせで構成される。
練習
Q. 自動販売機の入力と出力は?
A.
入力:お金、商品のボタン
出力:商品、おつり(あれば)
Q. 自動販売機の処理は?
A.
入力されたお金が足りている時、入力された商品を受取口から取り出せるようにする
おつりがある場合はおつりを返す。
Q. 自動販売機の処理はどのように分解できる?
A.
お金を入れる
商品ボタンを押す
商品を出す
お釣りを返す
Q. お金を入れる部分の入力と出力
A.
入力:お金
出力:入力された金額の合計を変数「total」に出力する
Q. お金を入れる部分の処理はどのようになるか
A.
入力されたお金が正しいかどうかチェック
正しい場合は金額を確認
入金済みの金額と入力された金額を合計し変数「total」に格納
筆者コメント:チャットを見ると、ボタン点灯だったり、在庫確認だったり、電子決済だったりの処理まで出てきた。大きい処理で書けば、お金処理の部分は電子決済に置き換えられる。
自動販売機のプログラム例
#自動販売機のプログラム
#生成AIが作成
# 商品情報(例)
products = {
"コーラ": {"price": 120, "stock": 5},
"オレンジジュース": {"price": 100, "stock": 3},
"お茶": {"price": 150, "stock": 2}
}
def vending_machine():
balance = 0
while True:
print("-" * 20)
print("自動販売機へようこそ!")
print("-" * 20)
# 商品一覧を表示
for product, info in products.items():
print(f"{product}: {info['price']}円 ({info['stock']}個)")
# お金投入
while True:
money = int(input("お金を入れてください(0で終了): "))
if money == 0:
print("ご利用ありがとうございました")
return
balance += money
# 商品選択
product_name = input("商品名を入力してください: ")
# 商品の在庫確認と購入処理
if product_name in products:
product = products[product_name]
if product['stock'] > 0:
if balance >= product['price']:
print(f"{product_name}を購入しました!")
product['stock'] -= 1
change = balance - product['price']
balance = 0
print(f"お釣りは{change}円です。")
else:
print("お金が足りません。")
else:
print("在庫がありません。")
else:
print("その商品は販売していません。")
if __name__ == "__main__":
vending_machine()
バグがあるので、修正にも挑戦してみるとよい。そうするとプログラムをしっかり読むことにつながる。
筆者コメント:お金投入が無限ループで商品選択に進めない。実際はお金入れる処理と、購入処理は非同期処理になりそう。
プログラムを読む
プログラムの細部の設計はプログラマーによって違っても、入力と出力はだいたい同じ
プログラム全体の「入力」「出力」「処理」を想像する
プログラム全体の処理を分解する
分解した処理のそれぞれについて、「入力」「出力」「処理」を想像する
分解を繰り返す
これはプログラムを書く手順も同じ手順と共通している。
まとめ
プログラミング初学者向けの内容ではあったが、設計書書く際にもIPOを意識して書くというのは後輩にも伝えたい内容だなと思いました。また、概念設計>基本設計>詳細設計どのくらいの粒度感で書くかという参考にもなりました。