2025-2I プログラミング1 第01回 講義資料

2025年04月10日(木)5・6時限

1 シラバスの確認

1.1 基本情報 プログラミング1

本科目の通称は「PG1」です。

1.2 担当教員の自己紹介

1.3 関連科目

知能情報コースの専門科目は ソフトウェア系ハードウェア系応用情報科学系3系統 があります。ここでは、ソフトウェア系応用情報科学系 の科目のなかで、特に 本科目との関連が深い科目 を挙げています。

「進取の精神」を大切にして興味関心のある分野は、授業の開講を待つことなくウェブや書籍を活用し、先取りして学んでください。もし、特定の分野に興味関心があるものの「取っ掛かり」や「ロードマップ (= 学習の道筋・体系的な学習方法)」がない場合は、知能情報コースの先生に相談してアドバイスをもらってください。

どの先生に相談すれば分からないときは、まずは 和田 か 土井先生 (主任) に相談してみましょう。

例えば、人工知能の理論を学びたくて知能情報コースを選択したのに、5年の「人工知能」の開講を3年間も待つことは、時間的にも学習の意欲・効率の面からも非合理です

情報分野のことを 「一緒に学ぶ友人を募りやすい」「相談や質問ができる教員がいる」 といった「知能情報コースという環境」を有効に活用してください。同じ技術や分野に興味を持つクラスメイトが高確率で存在するはずです。

1.4 授業概要

プログラミングICTエンジニア(特に ソフトウェアエンジニア )にとって最重要スキルのひとつに位置づけられます。また、プログラミングは理工学分野の学び(情報工学系科目をはじめ「数学」や「物理」などの学び)においても 理解深化のための強力な ツール (=道具・手段) として役立ちます。

(Pythonを使ったベクトルの幾何変換の可視化の例)

img

本科目では、そのような位置付けである プログラミングの導入教育 として、主に「Python言語 (パイソン言語)」を使ってプログラムに関する概念や用語、設計、実装、デバック、管理 (GitHubなど) について 経験的に習得すること を目指します。

なお、Python言語 の特徴や長所・短所特性を知ってもらうために、その他のプログラミング言語(C言語やJavaScriptなど)についても簡単なコードを示すこともあります。また、就職やインターンシップに向けて ポートフォリオ を作成してもらうために HTML/CSS についても授業のなかで学びます。

さらに、実装演習では 高専1・2年の数学や物理を題材としたもの も取り上げ、実装力の向上と同時に「数学」や「物理」について、プログラミングを通じて理解を深めるようなこともします。

1.5 科目の達成目標

達成目標 ( =2026年2月における皆さんのあるべき姿) として、次の事項を設定しています。シラバスからの抜粋です。

  1. Pythonの 開発環境および実行環境 を構築できる。
  2. IDE (統合開発環境) や バージョン管理システム などの各種開発ツールを効果的に利用できる。
  3. 条件分岐、繰り返し処理、関数、クラスを使用して基本的な 構造化プログラミング ができる。
  4. Pythonの多様なライブラリを活用して 日常生活や学習 に有用な小規模アプリの開発ができる。
  5. エラーや意図せぬ結果が生じたとき、その原因特定と解決に向けて適切なアプローチができる。

1.6 成績評価法

総合成績(学年末の最終成績)は、次のように評価します。

中間試験や期末試験などの筆記形式の定期試験は実施しません。小テスト実施するときは、その前回講義でアナウンスします。なお、昨年度は 全6回 の小テストを実施しました (本年度は少し回数が増えるかもしれません)。

小テストを欠席した場合

遅刻や欠席(公欠や出欠停止を含む)により、小テストを受験できず追試験を希望する者は 当該授業日を含めて2日以内 に、学生から和田宛に TeamsChat で追試験の実施依頼 をしてください。

小テストの追試験は、公欠や忌引を含めて理由に関わらず 1人あたり最大3回まで対応します。4回目以降の欠席・遅刻による小テスト未受験に対して、追試は実施せず「0点」で評価します。

1.7 授業の進め方

本科目では、最初の2~3回の講義を除いて セルフペースド学習 (自己調整学習) を前提に授業を提供していきます。

皆さんは「2年知能情報コース」という括りでは同じですが、一人ひとりのプログラミングのスキル・経験には相当な個人差があるはずです。趣味などで日常的にプログラミングをしてきた学生と、学校授業の枠内でしか体験してきていない学生では 学習時間に軽く数百時間の差 があります。

そのため、教員主導の一斉進行スタイルで授業をしてしまうと、どうしても個人レベルでは不満 (=授業が簡単すぎる/難しすぎる、展開が遅すぎる/早すぎるという不満) がでてきます。そのため、この科目では、教員からは、皆さんの属性(公大高専の知能情報コースの2年生)に最適化した学習ロードマップに沿った講義資料 (ウェブテキスト) を提供するので、学生の皆さんは、それを用いて 自分自身で学習の速度(ペース)と理解の深さ(どこまで深掘りするか)を調整しながら学習を進めてほしい と思っています。講義資料を読んで試行錯誤しても解決しないことがあれば、教員の机間巡視中に声をかけてください。

これまでにプログラムを自学してきた学生は、1回分の講義資料の表面的な内容は 30分 もあれば終わってしまうと思います。余った時間は深い掘り下げや、別のプログラミング関連の学習に使ってください (プログラミングや情報工学に関係のない取り組みはNGです)。また、周囲の学生からヘルプを求められたときは、サポートしてもらえると教員としては大変ありがたいです昨年度の講義資料で、先取りして学んでもらってもOKです。

一方で、これまで授業の範囲内でしかプログラミングに触れてこなかった学生の場合、90分の授業時間では1回分の講義資料の最後まで到達しないこともあると思います。その際は、多少大変であっても授業時間外に必死に取り組んでほしいと思います。

中級者向けの情報

中級者向けの情報は、この紫色のコラムで提供します。初学者は読み飛ばしてください。学習の初期段階では、かえって混乱するような内容を含みます。

1.8 AI共創時代において「プログラミング」を学ぶ意義

最近「もうAIがプログラムを書いてくれるから、プログラミングを学ぶ必要なんてないよね~」という声を耳にすることが増えました。確かに ChatGPT のような生成AIでは、自然言語での指示だけで、少なくとも中級者レベルを超える高品質なプログラムコードを生成してくれるようになっています。それも、人間には到底不可能な短時間で…。

こうした状況において大事なことは「プログラミングを学ぶ「意味」や「価値」は何なのか」、そして「プログラミングの知識・スキルを持つ人と、そうでない人とでは、AI支援で開発したときに プロダクトにどのような質的な差 が生じるのか」を常に考えて学ぶことです。学びの「方法」や「内容」を常に修正・調整していくことが重要になります。

AI共創・AI補完型労働の時代、学習の仕方によっては学習者に実務的・市場的な価値をもたらさないプログラミングの勉強 も存在しえると思います。皆さんには、自身のキャリア形成に寄与するような「学び」をしてほしいと考えています。

1.8.1 ヒント💡

プログラミングの知識やスキルがなくても、自然言語で指示を与えれば生成AIからコードを得ることは十分可能です。しかし、専門知識がない人にとって、その「コード」は「意味不明の呪文」でしかありません。皮肉なことに、プログラムの特性上、意味不明な「呪文」であってもビルドして実行すれば、目的の機能が実現できるか表面的の確認はできてしまいます (このことが「プログラミングを学ぶ必要があるの?」という疑問や不安を生むのかもしれません)。

しかし、そのコードが、以下に示すような観点 (プロダクトとして無視できない要素) で適切であるかの判断は、素人にはできません。特にトレードオフが存在する要素 (例えば、パフォーマンスと保守性の両立など) の評価には、プロンプトに落とし込めない要素も含むため、AIに判断してもらうこともできません。

また、生成AIは同一のプロンプトに対しても毎回異なるコードを生成してきますが、そのうち、どのコード (実装) が最適であるかの見極めには、高度な知識と経験が要求されます。

プログラミングから少し話が逸れますが、例えば、次のようなプロンプトを AI に与えるとします。実際に試してみてください (PortalAI for OMU) 。

次の要件に沿って、教員から保護者に向けてのメッセージを作成してください。

# 内容
- 大変かもしれないが九九を確実に習得しておかないと後々に困ることになる。
- 家庭でも協力してほしい。
- アナロジーを用いて伝える。

# 条件
- 対象は小学2年生の保護者
- 文字数は250文字前後
- 3つの案を提案

皆さんであれば、AIが提案してきた3案を比較し、最も効果的であろうメッセージを選定することができると思います。また、表現を微調整したり、各案のいいところを切り貼りしてより良いメッセージにすることもできると思います。

しかし、次のように「条件」を変えてみるとどうでしょうか?

# 条件
- 対象はアルジェリア出身・在住で、基礎学校2年生(日本の小学2年生相当)の子どもの保護者
- アルジェリアの公用語であるアラビア語で出力
- 文字数は250文字前後
- 3つの案を提案

このときのAIの回答は、もはや「意味不明の呪文」でしかなく、最適なメッセージを見極めることは不可能です。仮に日本語に翻訳したとしても、アルジェリア特有の文化や慣習、教育事情に詳しくなければ、そのメッセージが効果的かどうかを適切に判断することはできません。

この例が示すように、AIがどれほど高度なコードを生成できるようになったとしても、それを正しく評価し、責任をもってプロダクトに組み込むためには、プログラミングの基礎的な知識や経験、背景理解が絶対的に必要となります。コードの「可読性と実行効率」、「汎用性と実行効率」といったトレードオフか絡む判断も、人間が多角的に考慮して責任をもって決定しなければなりません。さらに、ドメイン固有の文化や技術背景を理解している必要もあります。

新しい発想に基づいて価値あるプロダクトを創造し、それに責任をもつことがエンジニアの本質的な仕事です。AIを補完や共創のパートナーとして活用し、そうした仕事を担えるようになるためにも、プログラミングを上手に学んでください。

2 プログラムとプログラミング

そもそも「プログラム (Program)」とは?「プログラミング (Programming)」とは?それらの違いは?

2.1 プログラム (Program)

プログラムとは コンピュータに対する作業指示を記述したもの です。

何らかのプログラミング言語によって記述されて、人間が編集可能な段階(読み書きできる状態)のプログラム のことを「ソースコード」「ソースファイル」「ソースプログラム」「ソースリスト」「スクリプト」「原始プログラム」のように表現します。

一方で、機械語(2進数)によって記述され、コンピュータ (CPU) が直接的に実行可能な段階(読み込みできる状態)になったプログラム のことを「実行ファイル」「ソフトウェア」「アプリ(アプリケーションの略)」「バイナリファイル」「EXEファイル(エグゼファイル)」のように表現します。

単に「プログラム」といっても二通り意味合いがあるので注意してください。どちらを指すかは文脈 (コンテキスト) から判断してください。

なお、プログラミング言語によって記述されたソースコード(=テキストファイル)から、機械語(2進数)で記述される実行ファイルを生成する操作を コンパイル(Compile) または ビルド(Build) といいます。コンパイルには機械語に翻訳するという意味があります。

コンパイルとビルドの違い

厳密には「コンパイル」と「リンク」の2つの作業を総称して「ビルド」と表現します。

(プロンプト例)

コンパイルとビルドの違いについて解説してください。

プログラムは、人間がコンピュータを相手に最も「効率良く」かつ「齟齬なく正確に」コミュニケーション をとるための手段・媒体とも言えます。

2.2 プログラミング (Programming)

プログラミングとは「ソースコード」を作成・記述する行為や作業を指します。ほぼ同じような意味で 「コーディング」実装」「開発」という言葉が使われます。厳密には、それぞれニュアンスは異なります。興味がある人はネットで検索してみてください。

2.3 プログラミングスキル (Programming Skill)

ラフな表現になりますが、次のような能力がプログラミングスキルといえるのではないかと思います。

こんなことが(気軽に効率的に)できたらいいよね 」と思うことをデジタル技術を使って実現するために、どんな構成や手順が必要か をデジタル技術の特性や制約を踏まえながらロジカルに設計/検討し、実際にアプリやウェブサービスなどのプロダクトを実装してリリースできる能力

3 プログラミング学習をはじめる前に…

これから、皆さんは プログラミング未経験者(未学習者) から プログラミング初心者 に向かって「学び」を深めていきます。それに先立ち、ぜひ視聴して欲しい動画があります。以下、「エンジニアチャンネル」というYouTubeチャンネルの動画になります (授業時間外にみておいてください)。

3.1 プログラミングをものにするために投資すべき時間

資格取得に必要とされる学習時間の目安

知能情報コースのプログラミングだけが、相応の学習時間を要求されるわけではありません。

3.2 学校の授業はゲームで言えば「XXXX」

学校の授業というものは、ゲームで言えば チュートリアル でしかありません。その先につづく 膨大な本編の入口部分 にしかすぎません。試行錯誤や失敗の連続でも、自分の意思で好きなように自由に取り組む実開発(ゲームで言えば本編)のほうが、はるかに夢中になれて「学び」も格段に大きく深いです。

この授業は1回約90分の通年授業(約30回の講義)ですが、ここでの累積学習時間は

\[ 90 \times 30 = 2,700 \mathrm{min} = 45 \mathrm{hr} \]

です。たとえ1回の授業につき宿題で90分を学びにあてたとしても総時間は90時間にしかなりません。授業のなかだけの取組みでは、「プログラミング超初心者」が「プログラミング初心者」になるために必要な250時間の半分にも到達しないのです。

残念ながら、マス教育の宿命である集団教育は「亀の歩み🐢」です。独学なら 休日の午前中で終わる学習内容 でも、授業では3週間もの時間をかけて (1週間の間隔をあけて90分を3回で) 提供することになります。通常、1週間も学習間隔があけば、記憶も薄れるので、その復習を授業中でやるとすれば、独学なら休日午前で終わる内容を、授業では4週間から5週間もかけて提供 することになります。

週1のペースを待たずに先々勉強したい学生は、昨年度の講義資料を利用してください。

3.3 1000~2000時間という差はなに?

3.4 教員としての願い

和田が理想と考える高専生とは 自己効力感を持って、仲間と共に、創造的なモノづくり活動を楽しめる学生 です。

砕けた言い方をすれば、自分なりの武器と自信を持って、仲間と一緒に何かクリエイティブな「モノづくり(アウトプット活動)」に取り組むことが「楽しい」「充実している」と思える学生 になってほしいと思います。

この授業では、そのためのチュートリアル(導入やきっかけ)になるような内容を提供しています。

4 生成AIの利用について

この授業では生成AIの利用に関して特に制限はありません。ChatGPTPortalAI for OMUGeminiMicrosoft CopilotGitHub CopilotCursor などを、プログラミング学習に賢く活用すること推奨します。

ただし、本質を見失わないように十分に注意 してください。授業のなかで演習や課題を課す目的は「皆さんの理解を深めてもらうため」「皆さんにスキルアップしてもらうため」です。理解深化やスキルアップに結びつかないような AI の使い方をしていると、早ければ1年後には詰みます。遅くとも進学や就職の段階で詰み状態になります (あるいは極端に選択肢が限られた状態になります)。

小学校で習う「九九」や「分数」について理解しないまま、中学校に進むことを想像してください、悲惨😱です。同様に、(AIを使って誤魔化して) 基礎的なプログラミングスキルを身に付けないまま卒業してしまうこと…を想像してください。

皆さんが授業を受ける理由は 「進級」や「卒業」という記号を得るためではありません自己の知識と技術の向上 が目的です。演習や課題に取り組むのは、そのための「手段」です。単位取得や進級、卒業は単なる目標 (≠目的) にすぎず、その過程で獲得する知識やスキルに価値があります。もし、この点に気付いていないクラスメイトがいれば、その誤解を解くよう助けてあげてください。

5 Python実行開発環境 GoogleColab

これからしばらくは、Pythonの実行開発環境として GoogleColab(グーグルコラボ)というクラウドサービスを利用していきます。GoogleColab はネット接続が必須ですが、ウェブブラウザだけで簡単にプログラミングをはじめることができます。

また、6月下旬には 個人PCの内部にもPythonの実行・開発環境を構築し、VSCode を IDE ( Integrated Development Environment: 統合開発環境) として利用して開発するスタイルに移行します。さらに、皆さんが想定以上に意欲的に取り組んでくれれば、Docker を活用した開発・実行環境の構築なども体験させたい、と思っています (前年度は Docker には到達しませんでした)。

Tips:もし、GoogleColab.が有料化されたり、サービス終了してしまったら?

ローカルPCに JupyterNotebook(ジュピターノートブック/ジュパイターノートブック)という環境を構築すれば、GoogleColab. とほぼ同様の開発ができます。そもそも、JupyterNotebook を Google が独自拡張し、ウェブサービス(クラウド型)として提供したものが GoogleColab. です。

仮に、GoogleColab. のサービスが終了しても、それまでに開発したプログラムはローカルPCの JupyterNotebook に引き継ぐことができます。授業のなかでも JupyterNotebook の環境構築を取り上げます。

GoogleColab.についての詳しい情報(FAQ)はこちら

5.1 ノートブックの新規作成

5.2 設定 (AIアシスタントの設定)

AIアシスタントを次のように設定してください (必要に応じてカスタマイズしてください)。

img

❷の「コード補完」は、実務では非常に有用ですが、学習時には無効化しておくことを推奨します。

img

5.3 コードセルの追加と編集・実行

5.4 テキストセルの追加と編集

5.5 ノートブックの保存と再開

6 ノートブックがフリーズしたときの対処法

Colab のノートブックが フリーズしたとき (=処理が終わらない、操作を受付けない状態になったとき) は、次の手順で「セッションを再起動する」あるいは「セッションを再起動してすべて実行する」を実行してください。

その後、再度、コードセルで Ctrl+Enter で実行してみてください。

img

それでも解決しないときはウェブブラウザを再起動してください。それでもなお解決しない場合は、新規にノートブックを作成してください。

7 文字列の扱いと出力

7.1 文字の出力1

文字を画面出力するためには print 関数 (Function) を使用します。厳密な表現をすると「文字列リテラルを標準出力に出力するためには、組込み関数の print を使用します」という表現になります。

%reset -f
print('Hello World')

7.2 Geminiの活用法

7.3 文字の出力2

%reset -f
print('Hello World')
print('Hello Python')
%reset -f
print("Hello World")
print('私の名前は○○です。')
print('最寄り駅は○○で年齢は○○歳です。')
%reset -f
print('\U0001F923')

7.4 AIアシスト

img
img

8 演習

次のような文字列を出力するPythonプログラムを GoogleColab. 環境 (Jupyter環境) で作成して、その動作について検証してください。ただし、異なるアプローチによるプログラムを2つ以上作成してください。

Pythonの世界へようこそ!
Hello, World!
これがあなたの最初のプログラム出力です。

8.1 参考

%reset -f
print('Pythonの世界へようこそ!')
print('Hello, World!')
print('これがあなたの最初のプログラム出力です。')
%reset -f
print('''Pythonの世界へようこそ!
Hello, World!
これがあなたの最初のプログラム出力です。''')
%reset -f
print('Pythonの世界へようこそ!','Hello, World!','これがあなたの最初のプログラム出力です。',sep='\n')
%reset -f
print('Pythonの世界へようこそ!\nHello, World!\nこれがあなたの最初のプログラム出力です。')
%reset -f
import time
msg = 'Pythonの世界へようこそ!\nHello, World!\nこれがあなたの最初のプログラム出力です。'
for char in msg:
  print(char, end='')
  time.sleep(0.1)
print()
%reset -f
from IPython.display import display, HTML

html = '''
<style>
@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}
.fade-in {
  animation: fadeIn 4s ease-in-out;
}
</style>
<div id="animated-text" style="background-color: black; color: white; padding: 10px; text-align: center; ">
  <p class="fade-in">Pythonの世界へようこそ!<br>Hello, World!<br>これがあなたの最初のプログラム出力です。</p>
</div>
'''

display(HTML(html))

この演習で伝えたいことは、プログラミングには「正解」というものがひとつだけとは限らない ということです。創造性を発揮し、異なる角度から問題にアプローチする気持ちを持ってください。ある問題に対して多様な解決策が存在し、それぞれが独自の価値を持っていることを理解することが、深い学びにつながります。

同時に 遊び心 を持つことも極めて重要です。標準的でない方法を試すことが、予想外の発見や理解進化につながります。プログラミングは技術だけでなく、創造的な表現の場でもあります (エンジニアにくわえて クリエイタ としてのマインドも持ってください)。

また「プログラムコード」と「その実行結果」から、その背後にあるメカニズムや規則性を理解し、自分なりのメンタルモデルを構築することが大切です。「メンタルモデル」とは、物事の仕組みを自分なりに解釈・理解して、頭のなかに構築する内的なモデルのことを指します。。たとえば、スマートフォンのアプリがどのように動くかを理解するために、ユーザーの操作とアプリの反応の関係を頭のなかでイメージする のがメンタルモデルです。ユーザーが特定のボタンをタップしたとき、なぜ画面が切り替わるのか、どのようにデータが処理されるのかを想像することです。プログラミングでも、書いたコードがどのように動作するかを理解し、予測するためにこのモデルを使います。

さらに、学んだことを定着させるためには 実際に自分でコードを書いてみること (打ち込んでみること) が重要です。新しい内容を学んだら、それに関するプログラムをコピペではなく自分で打ち込んで、それを実行して、その結果を確認・検証する習慣を身につけてください。習って「理解してた」と思っても、実際にはそれが錯覚であることが常です。