プロフィール画像

Masaki Nishi
ソフトウェアエンジニア

現役エンジニアがアメリカの大学でCSの単位を取得してみた所感

コミュニティカレッジでコンピュータサイエンスの基礎科目を取得してみた話

my-first-impressions-in-taking-computer-science-class

こんにちは、です。

私は現在、エンジニアとして働いていますが、学問的なバックグランドでは理系どころか文系だったため、情報工学とは離れた領域を主に勉強していました。

仕事をしていく上で、情報工学の基礎領域を学んでみたい気持ちと、将来的にコンピュータサイエンスの学士があれば海外で働くのに有利であるといった点から第二学士としてアメリカのコンピュータサイエンス学士号を取得しようと思い立ちました。

そんなこんなで下記のツイートの通り、オレゴン州立大学のコンピュータサイエンス学部の第二学士号プログラムを始めることとなりました。

本記事では、上記のオレゴン州立大学の学士号プログラムに入学するまでに、色々な理由から同じオレゴン州内のコミュニティカレッジでいくつかコンピュータサイエンスのクラスを受講したので、CS基礎クラスのレベル感だったり所感だったりを備忘録として残しておきます。

コミュニティカレッジでCSクラスを受講した経緯や理由については以前の記事「オレゴン州立大学のコンピュータサイエンス第2学士号オンラインプログラムに合格するまで」にも記載しています。

コミュニティカレッジとは

大前提として、コミュニティカレッジは公立の二年制大学のことを指していて、日本で言う短大に近いと言われています。

アメリカではコミュニティカレッジから四年制大学に編入したり、コミュニティカレッジで取得した単位を四年制大学の単位に移行したりすることが一般的に行われています。

上記の単位移行が容易に行われる理由として、アメリカの大学では、それぞれの科目に3ケタの番号(Course Number)が割り振られており、コンピュータサイエンスのクラスであれば一例として「CS161 – Introduction to Computer Science I」といった感じになります。州や大学により多少の違いはありますが、同じ州内の大学であればコースナンバーが一致していれば大体単位移行ができ、同等のクラスと見なされます。(当たり前ですが、事前に大学の公式HPで単位移行が可能か確認する方が良いですが)

では、なぜ同等のクラスをわざわざコミュニティカレッジで取得するのかという疑問が湧いてくるかと思いますが、単純に四年制大学よりコストが低いからです。

また、コミュニティカレッジだと正式な入学手続きをせずに単なるクラス受講者として、すぐにお試し感覚でクラスを開始することができます。そこで取得した単位が編入先での単位として移行が認められる点も利点となります。

クラッカマス・コミュニティ・カレッジ(Clackamas Community College)を選んだ理由

コロナ禍ということもあって、多くのコミュニティカレッジがオンラインでクラス受講できるように体制を整えていました。それに伴って留学生でもオンラインでクラス受講をできるようにしていたため、日本からでも運良く受講できました。(コロナ禍での対応のため、今後オンラインでの受講ができなくなる可能性があります。)

オレゴン州立大学に単位移行できるオレゴン州内のコミュニティカレッジで、オンラインでコンピュータサイエンスの講義を提供していたコミュニティカレッジは以下となります。

  • Umpqua Community College
  • Portland Community College
  • Lane Community College
  • Clackamas Community College
  • Linn-Benton Community College
  • Mt Hood Community College
  • Southwestern Oregon Community College
  • Rogue Community College
  • Chemeketa Community College

上記のコミュニティカレッジのうち、以下の理由からクラッカマス・コミュニティ・カレッジを選択しました。

  • 留学生向けの費用が比較的安価であったこと
  • アドミッションの返信が早く、丁寧だったこと
  • クラス講師のRateMyProfessorsでの評判が良かったこと
  • クラスでの使用言語がC++であったこと

受講したコンピュータサイエンスのクラス

コミュニティカレッジは二年制のため、四年制大学の三、四年次で受講可能な上級クラス(Upper-division Classes) は存在しないため、基本的には基礎クラス(Lower-division Classes)を受講する形となります。

また、各クラスには前提条件(prerequisite)が存在し、前提クラスを修了していないと後続のクラスを受講できないようになっています。それらを諸々考慮した上で、下記の基礎クラスを受講しました。

学期 番号 名前 Grade 難易度 作業量/週
2022 Winter CS161 Intro to Computer Science I A 易しい 4.7時間
2022 Spring CS162 Intro to Computer Science Ⅱ A 普通 5.8時間
2022 Fall CS260 Data Structure A 難しい 7.1時間

上記3クラスは連続しているクラスのため、全て同じカレッジで受講した方がカリキュラム的にもスムーズに学習できると思います。

CS161 – Intro to Computer Science Iを受講してみた所感

CS-161 Computer Science I
4 credits, Fall/Winter
Introduction to fundamental concepts of structured programming, including problem solving, algorithm and program design, data types, loops, control structures, subroutines, and arrays. Learn to write structured programs in a high level programming language.

講義時間:40時間
前提条件:CS120、MTH111(または高校数学全般)

講義内容は主に、コンピュータサイエンス分野の概要から入り、C++を用いたアルゴリズム開発、問題解決方法、プログラム設計、データ型、制御構造、サブプログラムの学習でした。

講義の進め方としては、毎週教授が録画した1~2時間ほどの講義ビデオと講義資料を確認し、小テストを実施する形でした。また、毎週プログラミングの課題を実施して提出する必要があり、最後の週には期末テストがありました。

成績評価のパーセンテージは忘れてしまいましたが、期末テストの比重が高かった記憶があったため、基本的にはプログラミングの課題を満点で通して期末テストでの失点を少なくする必要があったと記憶してます。

主に以下のスキル、知識があれば問題なくA評価を取得できると思います。

  • プログラムの設計プロセス
  • ソフトウェアライフサイクル
  • C++のビルドプロセスの理解
  • C++を使用した簡単なプログラム設計・実装・デバッグ
  • C++の変数、定数、関数、if-then文、whileループ、forループ、switch文などの構文

現役エンジニアとしては全体的に物足りなさは感じるものの、C言語特有のデータ型、ポインタの概念は他の言語と比べ、よりメモリ操作を意識するようなコーディングが求められるといった点で学びがありました。

CS162 – Intro to Computer Science Ⅱを受講してみた所感

CS-162 Computer Science II
4 credits, Winter/Spring
Introduces fundamental concepts of object oriented programming and dynamic memory management. Covers objects, classes, pointers, dynamic memory allocation, linked lists, and program correctness, verification, and testing.

講義時間:40時間
前提条件:CS161

CS161の続きとなる講義です。C++を使用したOOP(オブジェクト指向プログラミング)の入門で、動的データ構造、再帰、抽象化、継承といった内容でした。

講義の進め方はCS161と同様でした。

主に以下のスキルとOOPの概念を理解していればA評価を取得できると思います。

  •  参照渡しの関数、構造体の配列、クラス、ポインタ、動的メモリ、線形リスト、連結リスト、スタックを使用したプログラミング
  • 関数と再帰の使い方と目的の理解
  • データの抽象化、個別コンパイル、ライブラリプロシージャの使用

CSのバックグラウンドがない初学者はここら辺から詰まるイメージで、同じクラスでも脱落者が数名いました。

OOPの概念はエンジニア業務でも非常に重要となるので良い復習となりました。個人的にはC++でスクラッチからスタックや連結リストといった初歩的なデータ構造を構築するのが楽しかったです。

CS260 – Data Structureを受講してみた所感

CS-260 Data Structures
4 credits, Fall/Spring
Covers common data structures used for the storage and manipulation of data, as well as data abstraction, sorting algorithms, and algorithm analysis. Data structures include linked lists, stacks, queues, binary trees, btrees, hash tables, and graphs.

講義時間:40時間
前提条件:CS162

CS162の続きとなる講義です。CS161, CS162の知識を総動員して連結リスト、スタック、キュー、バイナリツリー、Bツリー、ハッシュテーブル、グラフなどのデータ構造をC++でスクラッチから書いていく感じです。最終的に上記のデータ構造を使用してソートアルゴリズムを実装していきます。

講義の進め方はCS161, CS162と同様です。講義の難易度から救済措置が設けられており、エクストラクレジットが付与される任意の課題があり、それらを完了していると追加で評価されます。自分は全ての任意課題を完了していた上で、全ての必須課題で満点だったため、期末テストが免除されました(CS161から同じ教授だったため、今までの成績を考慮してくれてたかもしれません)。

当たり前ですが、下記の基本的なデータ構造及び初歩的なソートアルゴリズムの理解が必要となります。概念だけでも予習しておくと良いと思います。

  • 連結リスト、スタック、キュー、バイナリツリー、Bツリー、ハッシュテーブル、グラフ
  • ソートアルゴリズム

データ構造とアルゴリズムの知識は転職する際のコーディング試験で必須ですし、コンピュータサイエンス修士に進む場合にも、これらのクラスを優秀な成績で修了していることが求められるのでとても大事です。

正直なところ、3つ目のCS基礎科目にしては飛躍的に難易度が高く、途中離脱者も多いです。C++であることが要因の一つであることは間違い無いと思います。実際にPythonで実施されているオレゴン州立大学のCS261 – Data Structureのクラスレビューを見てみると、CS161, CS162の方が難しかったと評価されていたりします。(単純に比較はできないと思いますが)

初めてコンピュータサイエンスを学び始めるならC++で基礎科目を受講するのは辞めておいた方が良いかもしれません。後続の授業でCS271 – Computer Architecture & Assembly Language, CS344 – Operating Systems Iといった、より低レイヤーの講義がありますが、C++を学んでいるとよりスムーズに学習できるため、先に苦労するか後で苦労するかみたいなところはありますが…。

まとめ

現役エンジニアの観点では、C++で学んだから良かったみたいなところはあります。OSSのソースコードを読む際にC言語で書かれていても抵抗感は無くなりましたし、世のアルゴリズム本で書かれているC言語のサンプルコードが読めるようになったのは嬉しい副産物でした。

【関連記事】社会人エンジニアがアメリカの大学で苦手な数学を学び直してみた

シェアする

プロフィール画像

Masaki Nishi

サンフランシスコ・シリコンバレーでのインターンや外資SIer、メガベンチャーでのエンジニアを経験後、現在はAmazon Web Servicesに勤務。

詳細プロフィール