見出し画像

【イベントレポ】2024/11/06 コードを読み解きながら体験する!初心者が身につけておきたい「プログラムを読む技術」

はじめに


概要

イベント概要

ソフトウェアを開発するうえで、コード(プログラム)を読むことは、書くことと同じくらい重要です。プログラマーとして、コードを読む場面というのはとても多く発生します。

仕事として他の人が書いたコードを引き継ぐこともあるでしょうし、自己学習においてサンプルコードやGitHubなどで公開されているコードを読むこともあるでしょう。過去に自分が書いたコードを読む機会もあります。

書けるのであれば、同じ言語で書かれた他の人のコードはスラスラと読めるはずなのですが、初心者のうちはどういうわけか読みにくい、難しい、どこから手をつければ良いのかわからないといった壁に突き当たりがちです。

今回は「書くスキルも設計スキルも飛躍的に上がる! プログラムを読む技術」を発売された岩松洋さんをお招きし、初心者がなぜコードを読みにくいと感じるのか、読むためにまずはどこから始めれば良いのかを解説していただきます。

いくつかのサンプルコードを使用して、初心者向けの実演を交えながらご講演いただく予定です。

他の人のコードを読むのが苦手でキャッチアップに時間がかかる方、入門書でプログラミングの勉強はしてみたものの、大きめのサンプルコードを読みきれずに挫折してしまった方など、読むことに苦手意識を持たれている方が前に進むきっかけとしていただけたら嬉しいです。

https://techplay.jp/event/960580より引用

登壇者

岩松 洋

システムコンサルタント、プログラミング講師
紙とえんぴつで学ぶアルゴリズムとフローチャート」(日経BP)著者
書くスキルも設計スキルも飛躍的に上がる! プログラムを読む技術」(日経BP)著者

岡山大学工学部修士課程情報工学専攻卒業。大手IT企業にてプログラマー、システムエンジニア、プロジェクトマネージャーとして経験を積んだのちに起業。数々の開発業務を通じ、要件定義の経験を重ねて身に付けた業務フローづくりのスキルを生かし、生産性向上、業務効率改善専門のコンサルタントとして中小企業を中心に支援している。2019年からはプログラミング教育に関わる。初心者がつまずきがちな文法暗記型教育に疑問を抱き、日常の事柄を「紙とえんぴつ」を使用し言語化するトレーニング手法で「プログラミング言語を学んでも書くことができない」という課題を解決する指導に力を入れている。そうした指導をまとめた『紙とえんぴつで学ぶアルゴリズムとフローチャート』を執筆。動画学習コンテンツも提供しているほか、無料勉強会も定期的に開催している。

https://techplay.jp/event/960580より引用

最初に

今日伝えるのは、「プログラムを読むときの考え方、プログラムの読み方」
今日の話を聞くことで、読む力を身に付けるのを早める

自己紹介

コンサルタントとプログラミング教室と甲南大学非常勤講師
共通して「考え方」を教えている。
IT企業の社員に就職し、プログラマーからPM、システムエンジニアへ。
10年務めた後グランドサークルを立ち上げて、プログラマーから始めていたが、作っても売れず営業が苦手な事もあってコンサルタントおよびプログラミング教室を始める。
プログラミングの教室の生徒からプログラムの読み方を質問されることが多かった。その生徒は1行1行は読めるが、まとまった単位で読めなかった。そのため、設計や目的を考える視点が必要と考えた。プログラマーとしての自分の考え方をもとに、「プログラムを読む技術」を書いた。

プログラムを読む機会

  • 書籍のサンプルプログラム

  • 他人のコードの引継ぎ

  • バグ修正・デバッグ

  • 機能追加・仕様変更

  • ソースコードレビュー

なぜ他人のプログラムを読むのは難しいか

一番大きい理由は、他人や過去の自分との設計する際の考え方の違い。設計を読み取れていない。

そのため、プログラムを書いた人の考え方が読めるようになるとプログラムも読めるようになる。

プログラムの読み方

まずプログラムの構造を理解する

その上で

  1. プログラムの全体を把握する

  2. それぞれの部分の役割を理解する

  3. 一行一行の役割を読み取る

プログラムには作られた目的がある。何らかのデータを何らかの形に変えるために作られる。つまり、入力を出力に変えるのがプログラム。
処理のところはどういう風に書いても出力が実現できていればいいため、考え方の違いで読めなくなる。
処理の中も細かい入力、処理、出力の組み合わせで構成される。

練習

  • 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()

バグがあるので、修正にも挑戦してみるとよい。そうするとプログラムをしっかり読むことにつながる。

筆者コメント:お金投入が無限ループで商品選択に進めない。実際はお金入れる処理と、購入処理は非同期処理になりそう。

プログラムを読む

プログラムの細部の設計はプログラマーによって違っても、入力と出力はだいたい同じ

  1. プログラム全体の「入力」「出力」「処理」を想像する

  2. プログラム全体の処理を分解する

  3. 分解した処理のそれぞれについて、「入力」「出力」「処理」を想像する

  4. 分解を繰り返す

これはプログラムを書く手順も同じ手順と共通している。

まとめ

プログラミング初学者向けの内容ではあったが、設計書書く際にもIPOを意識して書くというのは後輩にも伝えたい内容だなと思いました。また、概念設計>基本設計>詳細設計どのくらいの粒度感で書くかという参考にもなりました。


いいなと思ったら応援しよう!