見出し画像

コンピュータ・サイエンス概論 #1(1週目)

今回はコンピュータ・サイエンスの授業についての紹介です。
コンピュータ・サイエンス学習マップで詳細に解説し過ぎていたので切り抜いたものを土台にできた記事です。

自分が受けていないので、授業スライドと課題からの紹介です。概論の概略というもやっとした話ですが、これがアメリカの中堅大学の1年で最初に取る授業ということで、ご参考にして頂ければ。
1年目最初のプログラミングの科目でコードを書くだけでなく、こういう知識も一緒に学ぶ、と思っていただければ。独学系インフルエンサーは座学を否定することが多いですが、理論をしっかり理解した上での反復、つまり知識による土台(予習課題のReadingの上で授業でわからないところを確認)と実践(課題)で知識を実践できるように定着させるのが大学での学習です。

基本的に多少の経験があれば難しい話ではないと思いますが、サポートがある程度ついたりしたら詳細の解説とかやるかも知れないです。取り上げる内容箇条書きしていく感じなので、そこをもっと知りたい人向けに100円の有料記事、とかも考えましたが、サポートで判断でも良いかな、と。

箇条書してる内容は基本的にキーワードですが、「知ってる知ってる」という人はそれでいいと思います。読みながらキーワードから内容を思い浮かべて知識の再確認していただければ。

記事長くなりそうなので、週毎にまとめて書いていきます。

 この授業で学べる事

シラバスによると下記が学べます。

  • 変数とデータ型

  • 代入、入出力、キャスト

  • 条件、繰り返し(iteration)

  • 関数

  • 再帰

  • クラスとオブジェクト

  • 文字列操作、リスト

  • タプル、不変性と可変性

  • 参照と実体

  • ディクショナリとセット

Introduction

最初の週は基本的に授業でどういうことをするか、スケジュールや評価についての説明や、TAのOffice Time(その時間に行けば指導の学生(基本的に大学院生)が質問に答えたりわからないとこ教えてくれる)とかの案内があります。

Reading課題1

ちなみに、この授業はC++をやるので、MITのC++の授業のLecture Notesが紹介されています。

これのIntroductionの部分は結構重要なんですが、プログラミングスクールでは教えていないと思います。まぁ、C++教えないし、下手すると教えられない気がします。

例えば、ソースコードがCompilerによりObjectファイルに変換され、LinkerによりLibraryと紐付けてExecutable(実行可能ファイル)を作成し、それが実行時にOSによりメモリに乗せられる流れとか。パッケージマネージャを使う言語が多いので、知らないとこの辺裏側がわからなくてハマったり。

また、なぜComputer Science(以下CS)を学ぶのか、といったのも読み物として読んでこい、という感じです。

Lecture 1

CSとは何か、が最初に説明されます。宿題のリーディングが下敷きになって、知識を固めます。基本的にアメリカの大学では予習が大事で、ちゃんとリーディングや宿題をやった上でそこの説明で独学でわからなかった部分を明確にするような受け方になります。

最初にHelpはどういう順序で出すか、という話があります。
プログラミングスクールだとちょっと考えてわからなければ聞け、かと思いますが。下記順序で定義されています。

  1. 課題やLecture Note, Labでやったことシラバスの再確認

  2. Google/Bing/教科書で調べる

  3. 友達に聞く

  4. TAに聞く

  5. 先生に聞く

まずは自分での問題解決です。基本的にヒントや、このレベルだと答えは復習の中にあることが多いです。基本的に習ったことから作業をするので、基本的には教えているはず。そして、教え合いもお互いの成長になるよ、と。

また、質問の際は下記をまとめてこようね、と。

  • 何が問題(わからない)か

  • 何をしてみたか

  • 何が最も助けになるか

  • 質問の具体的な対象部分(教科書の項とか)

その後、コンピュータはどこにでもあるけど、違いは何か。
計算のデバイスの話、入力->処理->出力という流れ、プログラムでアルゴリズムを実行するデバイスの話やコンピュータサイエンスとはなにかという話題になります。

あまり詳しく話すと煩雑になるので、下記話題が取り上げられます

  • アルゴリズムとは何か

  • アルゴリズム的思考や擬似コード

  • プログラミングとは何か

  • なぜ最初にプログラムを教えるか

  • ソフトウェア vs ハードウェア

  • プログラムの土台(OS)、目的、アプリケーションとは何か

  • ディジタル表現(離散・2進数)

  • bit/byte/1バイトで表せる数値の数

  • 符号の有無(signed/unsigned)

  • プログラミング

    • 高水準言語(インタープリター言語とコンパイル言語)

  • Linuxコマンド

  • Hello Worldのコードのコンパイル方法の説明

  • Hello Worldのコードの大雑把な説明

    • ライブラリの利用

    • 関数と文

  • コメントについて

初回から結構盛り沢山ですね。

Reading課題2

Lecture 2

  • Linuxコマンド(ls, mkdir, cd)何してる?

  • vi/vim(insert/commandモード)

vimとかで書いてるっぽいですね。vimは使いこなすとかなりできるエンジニア風(マウスを使わないでカーソル動きまくるやつ)になるし、CUIのサーバーにsshして作業する時とかにもおすすめです。

  • 最初のC++コードの解説

    • プリプロセッサー( #include)

    • main関数の戻り型

おまじないと言われるやつもちゃんと説明します。

  • プログラミングスタイル(スタイルガイドの遵守)

お作法というかリーダブルコードを書くために。

  • Stringのクオテーションについて

  • エスケープシークエンス

文字列のあれこれは最初は迷子になりがちです。

  • データ型について

    • Primitives

    • ユーザー定義型

  • 数値型と符号

  • Operator/Operand/Evaluation

  • 数値処理

  • キャスト

  • 小数点の結果が欲しい場合の割り算の仕方

  • 数値計算の()や優先順序

データを何故定義するのか。型を変える意味と効果。
算術演算を正しく行うルールなどを学びます。

1周目は最初にIntroductionの回があるのでLectureは2回です。

Reading課題3

再びMIT。

実装課題1

締め切り:1週目日曜
テーマ: 入出力、オーバーフロー、アンダーフロー

  • <climits>のマクロを使って符号有り無しのint, longs, shortsの最大値と最小値(unsignedはない)を出力せよ。

  • 入力n(n <= 8)を受け取って、n bitでのsigned/unsignedの最大・最小値を出力せよ。(ヒント:pow使ってもいいよ)

  • 符号有り無しの最大値に1足して出力、最小値から1引いて出力

  • 0以下、8(バイト)より大きい入力をハンドリングしてエラーメッセージを出す(Extra)

  • 10点分はコーディングスタイルを守ってるか

あとがき

気が向いたら課題やってみてください。
では、また来週…公開できるようにがんばります。

この記事が気に入ったらサポートをしてみませんか?