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

2024年04月12日(金)1・2時限

1 シラバスの確認

1.1 基本情報

1.2 関連科目

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

興味関心のある科目は、授業の開講を待つことなくウェブや書籍を活用 して学んでください。また、興味があるものの「取っ掛かり」がない場合は、知能情報コースの先生に相談してアドバイスをもらいましょう。どの先生に相談すれば分からないときは、まずは和田か土井先生 (主任) に相談してみましょう。

1.3 授業概要

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

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

なお、Python言語 の特徴や長所・短所特性を知ってもらうために、その他のプログラミング言語( C言語やJavaScriptなど )についても簡単に体験 (実装) してもらうこともあります。また、実装演習では 高専1・2年の数学や物理を題材としたもの も取り上げ、実装力の向上と同時に数学や物理についても理解を深めてもらいます。

1.4 科目の達成目標

達成目標 (=2025年2月における皆さんのあるべき姿) として、次の事項を設定しています。

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

また、就職や進学に使えるようなポートフォリオ (スキルセットや制作物を示すための集合体・作品集) も作成・公開してもらいます。昨年度の学生のポートフォリオは こちら 配置しています(在校生のみ閲覧可)。

1.5 成績評価法

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

中間試験や期末試験などの筆記形式の定期試験は実施しません

2 そもそも「プログラミング」とは

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 OMUMicrosoft CopilotGitHub CopilotCursor などを、プログラミング学習に活用すること推奨します。

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

小学校で習う「九九」や「分数」について理解しないまま、中学校に進んだら悲惨です。同様に、(AIを使って誤魔化して) 基礎的なプログラミングスキルを身に付けないまま、ソフトウェアエンジニアになってしまうと・・・と考えてください。

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

5 Python実行開発環境 Google Colab.

これからしばらくは、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 コードセルの追加と編集・実行

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

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

6 文字列の扱いと出力

6.1 文字の出力1

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

%reset -f
print('Hello World')

6.2 文字の出力2

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

7 演習

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

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

7.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))

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

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

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

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

8 宿題

次回の授業までに GitHubアカウント を準備しておいてください(授業中にアクセスできるようにしておいてください)。このアカウント(リポジトリ)は、インターンシップ、就職、進学において、皆さんのポートフォリオ ( 取組み実績やスキルを示すための作品集 ) という位置づけになります。

そのため、ユーザーネームは慎重に設定してください (ユーザーネームはポートフォリオの公開URLに含まれます)。1年次の実験実習で作成したアカウントを継続使用しても、新規に作成しても、個人で使用中のものを利用してもOKです。ユーザーネームは変更可能ですが色々と面倒があるので、この機会に適切なものにしておきましょう。

この授業で作成したプログラミングのほか、他の授業や実験実習、高専祭で作成した制作物も、このGitHubアカウントのなかに蓄積していってもらいます。少なくとも知能情報コースの教員とクラスメイトには公開されるものになります。