プロフィール画像

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

オレゴン州立大学のオンラインCS学士号入学から2年目総括

2024 Winter から 2024 Summer までの半年間に受けた講義の所感と総括について

オレゴン州立大学

2022年4月(2022 Spring)にオレゴン州立大学のオンラインのコンピュータサイエンス第2学士号プログラムに合格してから、2024年9月(2024 Summer)に卒業するまでの後半半年間に受けた講義の所感と総括について書き残していきます。

なお、前半1年間の所感については下記の記事に記載しています。

日本からオンラインでアメリカの大学で社会人学生をすることや、コンピュータサイエンスで実際にどんなことを学ぶのか興味がある方には参考になるかと思います。

2024 Winter

学期 番号 名前 Grade 難易度 作業量
2024 Winter CS361 Software Engineering I A 易しい 44時間
2024 Winter CS374 Operating Systems I A 難しい 118時間

本Termも講義を二つ受講しました。有志のコースレビューのサイトでは、CS361は週6時間、CS374は週16時間かかる想定です。

OSの授業は内容と課題がとてもハードで、オレゴン州立大学のオンラインCS学位プログラム中で1番難しいとされる、独自シェルを実装する課題があるという前評判を聞いていたため、比較的簡単なCS361と組み合わせて受講しました。

社会人学生であることを考慮すると、予想されるワークロードが週20時間前後になるようにクラスを選択すると良いと思います。

今期も2クラスを受講して、GPA3.50以上を維持したため、成績優秀者名簿に載りました。

CS 361 – Software Engineering I

このクラスは個人とグループでの作業比率が50/50ほどになっています。チームメンバーは一人で、任意の方とチームを組むことができます。後述しますが、チームメンバーの作業速度が個人の作業に影響するため、良いチームメンバーを探すことが重要になります。

講義としては主に下記のトピックを学習します。

  • Microservices
  • Agile Project Management & Teamwork, Requirements, Git/GitHub
  • Paper Prototyping, Inclusivity Heuristics
  • Sprint 1: Project Milestone
  • Sprint 2: UML
  • Sprint 3: Code Smells & Refactoring
  • Project Showcase

マイクロサービスやアジャイル等のプロジェクト管理方法、Git、インクルーシブデザイン、UML、リファクタリングなど、一連のソフトウェア開発プロセスで必要となる技術について学習します。現役エンジニアにとっては少し物足りない感はありますが、業務未経験者にとっては重要な学習内容になります。

クラスの流れとしては、アジャイル開発のプロセスでスプリントを回します。最初のスプリントでは、チームメンバーがそれぞれ個人プロジェクトをマイクロサービスで実装します。次のスプリントで、お互いのプロジェクトの一部機能を補完するマイクロサービスを実装し、最終スプリントで統合するような形になります。現代のモダンな開発プロセスを経験することができます。

上記から、チームメンバーの作業の進行度合いが自身のプロジェクトにも影響する形になります。

成績評価は毎週のクイズ形式の小テストと課題、グループプロジェクトの進捗報告と最終提出により評価されます。エクストラクレジットも含めて完了したため、最終Gradeは101.4%となりました。

CS 374 – Operating Systems I

クラスの全体構成はシンプルで、5つの課題と期末試験のみとなっています。個人的には講義内容の難しさというよりも、ボリュームと課題の難易度の点から難しさを感じました。

独自シェルを開発する課題は前評判通り難しく、締め切り前の3日間ほどは1日10時間くらいぶっ通しで開発してました。また、その課題のみが特別難しいというわけではなく、他の課題も順当に難しかったです。

主に下記のトピックを中心に学習します。

  • Introduction to OS, Unix, Linux, POSIX, Shell
  • Introduction to C, Basic Syntax, Pointers, Memory Management
  • Files and Directories, I/O Library, Permissions
  • Processes, Process API
  • Processes II, Signal Handling
  • Concurrency and Threads, Synchronization, Mutex, Condition Variables
  • Interprocess Communication, Pipes, FIFO, Semaphores
  • Network Programming, Sockets, Server Design
  • Introduction to Rust, Basic Syntax
  • Rust and Safe Systems Programming, Ownership, References, Threads, Mutexes

オレゴン州立大学ではコンピュータサイエンスの基礎講義でPythonを採用するようになったので、C言語を触ってこなかった学生にとってはここで初めて触ることになります。

私はコミュニティカレッジで基礎講義をC言語で受講したため、問題なかったのですが、1週間でC言語の基礎を覚えるのはなかなかハードだと思います。

また、課題の開発環境はオレゴン州立大学のリモートサーバーにsshでアクセスし、vimで開発する形で、これも学生たちを苦しめます。技術的には問題なかったのですが、リモートサーバーのラグがストレスになり、途中からDockerでリモートサーバーと同じ環境を構築して開発するようにしました。

授業の内容はOSの基礎的な部分になりますが、課題の難易度は授業の内容から飛躍します。課題は必須要件に加え、マルチスレッドやマルチプロセスのハンドリング、エラーハンドリングなどが厳密にテストされます。

上記のような難易度であるにもかかわらず、実装の方法はLinuxのmanコマンドでマニュアルだったり、cppreferenceのC言語のリファレンスPOSIX stanfardのリファレンスを自分で確認してやってねという投げやり具合で、これまた学生を苦しめました。

成績評価はシンプルに課題と最終テストのスコアで決まります。課題は自動採点で100%になるまで再提出を繰り返せます。最終テストの配点は全体の20%を占め、割合が大きいので課題は100%にしてバッファを持っておくと良いと思います。

全て満点で終えたので、最終Gradeは100%となりました。私が受講した際のクラスの成績は過去最高だったようで、一番難しいとされる課題の平均成績が85%で、その他の課題は92%、全体で91%だったようです。

2024 Spring

学期 番号 名前 Grade 難易度 作業量
2024 Spring CS362 Software Engineering Ⅱ A 易しい 48時間
2024 Spring CS381 Programming Language Fundamentals A やや難 62時間
2024 Spring CS464 Open Source Software A 易しい 31時間

本Termで初めてオレゴン州立大学の講義を三つ受講しました。

卒業要件に必須クラスを除いたCS300, 400台の選択クラスを3つ以上受講することが含まれており、CS381とCS464は選択クラスです。個人的に魅力的な選択クラスがCS381以外になかったため、比較的ワークロードの少ないCS464を同時受講して早く卒業しようという計画でした。

有志のコースレビューのサイトでは、CS362は週6時間、CS381は週9時間、CS464は週3時間かかる想定です。振り返ってみると、実際はCS362は週5時間、CS381は週6時間、CS464は週3時間程度で、週14時間程度の負荷でした。

CS381, 464は課題を早く終わらせることができたので、グループプロジェクトとテストで後半忙しくなるCS362と組み合わせたのは正解でした。

CS 362 – Software Engineering Ⅱ

このクラスもSoftware Engineering Iと同様で、個人作業とグループプロジェクトがあります。チームメンバーは二人で、任意の方とチームを組むことができます。三人チームのため、チームメイトがサボっていたりすると前クラスより悲惨なことになります。

参考:

クラスの構成は、課題と小テスト、期末試験となっています。期末試験の比重は全体の25%ほどの成績を占め、オープンノートではなかったため、単純な暗記作業が辛かったです。個人的にオープンノートで頭を使うテストが好きです(毎日勉強していればテスト前の追い込みが必要ないため)。

授業の内容としては、主に下記のトピックを中心に学習します。

  • Version Control Systems such as Git
  • Software Verification
  • Unit Testing
  • Black Box Testing
  • White Box Testing
  • Random Testing
  • Test-Driven Development
  • Continuous Integration
  • Code Review

Software Engineering Iでは、一連のソフトウェア開発プロセスで必要となる技術について学習したのに対して、このクラスではテスト手法と実装に重点をおいて学習します。また、TDDやCI/CDのようなホットなトピックも触りました。

業務で頻繁にテストコードを書いてますし、Github Actionsも触ってるので、特に新しい発見はなかったです。TDDの概念に初めて触れたくらいですかね。業務未経験者にとっては有用だと思います。

クラスの流れとしては、前半は主にテストコードを書く課題が多く、ブラックボックスでテストを書いてバグを見つけるようなものや、ホワイトボックスで実装を見ながらテストを書いたりするものがあります。テストケースは特定の手法を駆使して考える必要があります。

後半はグループプロジェクトで、CIでテストコードを自動実行させながら、要件に沿ったプログラムをチームで実装するみたいなことをします。チームメンバーの作業の進行度合いがプロジェクト全体に影響する形になり、全員のコントリビューションが課題の要件に含まれているため、良きチームメンバーを見つけられるとスムーズに進みます。

個人的なTips

チームメンバーを探す際はクラス掲示板みたいな場所で、自発的に自己紹介とチームメンバーを探している旨を投稿して、返信待ちをするみたいなことをしていました(タイムゾーンの関係もあるのでこれが楽)。

しかし、この形だと、自己紹介なしに「入りたいです」といった内容の返信が多い、尚且つ、相手がどういう人かわからないから断ったりすると、他の人に選別していると思われて新しい人からの返信が来なくなったりしたので、このクラスではどんな返信でも無条件でOKにしました。

結果的に不健全な形となってしまったため、ちゃんと自己紹介をしている人の投稿に自分が自己紹介と共に返信するという形がいいと今回のクラスで思いました。

成績は課題(グループプロジェクト含む)と小テスト、期末試験で評価され、最終Gradeは97.04%となりました。エクストラクレジットはクラスの教材を改善できたら付与するみたいな曖昧なものでしたが、教材内のGithub Actionsのコードの不備を修正したらいただけました。期末試験は44.17/50でした。

期末試験の比重が大きく、グループプロジェクトと期末試験が失敗しただけで維持してきたGPA4.0が崩されてしまうので、少々怖いクラスでした。(実際にこのクラスで初めてBを取ったみたいな投稿をよく目にしました)

CS 381 – Programming Language Fundamentals

クラスの全体構成はシンプルで、毎週のクイズと小テスト、5つのプログラミング課題となっています。クラス難易度とボリュームが程よく、内容もとてもよくできていました。

クイズと小テストは教材内で軽く触れているところからも出題され、満点を取るのは難しいので、自動採点で何度も提出できる課題で確実に成績100%を取ることが重要なクラスでした。

講義としては主に下記のトピックを学習します。

  • Introduction to Programming Languages
    • Language Criteria, Formal Language, Regular Expressions, Imperative Programming
  • History and Evolution of Programming Languages
    • History (1950s – 1970s), History (1980s – 1990s), History (2000s – Present), Raku
  • Grammars in Programming Languages
    • Backus-Naur Form, Derivations and Parse Trees, Precedence and Associativity, Ambiguity
  • Syntax and Semantics of Programming Languages
    • Syntax, Semantics, Variables, Scope
  • Types and Object-Oriented Programming (OOP)
    • Types, Type Systems, Object-Oriented Programming, Ruby
  • Expressions and Statements in Programming
    • Expressions, Assignment, Selection, Iteration
  • Subprograms and Functions
    • Functions, Parameter Passing, Design Issues, Call & Return
  • Functional Programming Paradigm
    • Functional Programming, Lambda Calculus, Racket, Functional Languages
  • Logic Programming Paradigm
    • Logic Programming, Predicate Calculus, Prolog, Prolog Examples
  • Special Topics in Programming Languages
    • Memory Management, Concurrency, Exception Handling, Event Handling

プログラミング言語パラダイムの歴史を学んだ後に、言語設計の方法を学びます。その後に、それぞれの言語パラダイムでの設計思想を学習して、課題で実際にその思想を取り込んだ言語を用いてプログラムを実装する流れです。

言語設計において、Syntaxはイメージつきますが、Semanticsと聞いて日本語訳にしても、意味論とか意味不明なワードなのですが、具体的に何を指しているのか理解できました。また、経験がなかった関数型と論理型に触れることができてとても有意義でした。

「プログラミング言語を一つ学べば他の言語も簡単に覚えられる」みたいな言葉を頻繁に耳にしますが、正確には同じ設計思想を取り込んでいて、共通点の多い言語は比較的簡単に理解することができるということを、このクラスで身を以て経験することができます。逆も然りです。

成績評価は毎週のクイズと小テスト、5つの課題によって策定され、最終Gradeは99.6%となりました。課題は全て100%でこなし、クイズと小テストで少し落としました。

CS 464 – Open Source Software

このクラスは実際にOSSプロジェクトを探して、issueを作成したり、最終的にプルリクを作成して貢献する必要がある珍しいクラスです。貢献する内容は本人次第で簡単にも難しくもすることができますが、ある程度の規模のOSSであることが条件です。

ただし、クラス期間中にプルリクがマージされる可能性はプロジェクトによって低くなるため、必ずしもマージされる必要はなく、プルリクを作成して貢献しようとしたところまでが評価されます。

私はStorybookを選択して、クラス期間中に無事にマージされました。大きな変更ではないですが、issueの作成からプルリクの作成、マージまでの流れがスムーズだったため、今後のクラスの参考プロジェクトとして使っていただけるようです。

講義としては主に下記のトピックを学習します。

  • Introduction and OSS Anatomy
    • Choosing Projects for this Course, Curated Projects, Bonus List: “Good First Issues”, What is Open Source Software?, Distributed Development and Version Control
  • Law and Economics
    • Who FLOSSes?, Project Sponsorship and Check-in, Intellectual Property and Licensing
  • The OSSDLC
    • Software Testing and Issues, Testing Methods, FLOSS Project Management and the SDLC
  • History and Impact
    • A Brief History of OSS, The State of Open Source, FLOSS Soft Skills, Open Source Industry, Science, and Education

OSSのライセンス周りだったり、ビジネス的な運用だったり、コミュニケーションの取り方やコントリビューションするまでのフローを学んだりします。OSS活動への最初の一歩を踏み出すにはとてもいい内容だと思います。

読書量の多いクラスで、ディスカッションへの参加に伴ってライティングの量も多くなるため、英語疲れしました。レポート中心のクラスは比較的簡単に成績を得られますが、個人的に疲れるのでやりたくないです。

成績評価はクイズとディスカッションへの参加、課題で決まります。全て落とさずにこなしたため、最終Gradeは100%となりました。早くにプルリクを作成することができ、最終週にやることがなくなっていたため、CS362のテスト勉強に集中することができました。

2024 Summer

学期 番号 名前 Grade 難易度 作業量
2024 Summer CS406 Projects A 易しい 140時間
2024 Summer CS467 Online Capstone Project A 易しい 59時間

本TermはSummer Termのため、通常Termより2週間短いですが、8週間で同等量の勉強をする必要があります。Summer Termとしては初めて2クラス受講しました。CS406は選択クラスです。

どちらのクラスもプロジェクトベースのため、ある程度作業量を調整することができましたが、この時期は仕事も忙しく、毎日寝不足で死にそうでした。普通に気絶して寝てる時もありました。

今学期のクラスのプロジェクト内容は自由に選定できるため、有志のコースレビューのサイトは参考にならないと思います。

CS 406 – Projects

このクラスは少し特殊で、このクラスで実施するプロジェクトを監督してくれる講師の方を自分で見つけて、承諾を得ないと実施することができません。

具体的には、自身で作成したプロジェクト計画書を講師にメールし、規定のフォームにサインをしてもらった上で、大学のアドバイザーの方に連絡をすることでクラス登録することができます。

プロジェクトは成果物として見せられるもので、承諾さえ得られれば基本的に大丈夫です。また、このクラスで取得できる単位数は1~16単位で自由に設定でき、1単位あたり3時間/週の作業量が求められます(通常Termの場合)。

私は5単位で設定したため、週あたり15時間の作業量が求められ、10週間となると合計150時間で完遂するプロジェクト計画書が必要になりました。そして、Summer Termのため、8週間で終わることを想定し、18.75時間/週の作業量を考慮したプロジェクト計画書となりました。

5単位を設定した理由:

卒業要件として60単位を取得する必要があり、そのうち45単位をオレゴン州立大学で取得する必要があります。言い換えると15単位まで移行することができますが、自分は結果として16単位を他の大学から移行したため、順当にクラスを受講すると44単位しか取得できなかったためです。

具体的に移行した単位の内訳は以下のようになってます。

  • オレゴン州内のコミュニティカレッジで取得したクラス*3
    • 1クラス4単位で合計12単位
  • ノースダコタ州内の大学で取得したクラス*1
    • 1クラス3単位(移行後4単位換算)

【関連】:現役エンジニアがアメリカの大学でCSの単位を取得してみた所感(オレゴン州立内のコミカレで受講したクラスの話)

【関連】:社会人エンジニアがアメリカの大学で苦手な数学を学び直してみた(ノースダコタ州内の大学で取得したクラスの話)

合計で取得した単位は15単位となりますが、移行後は16単位となります。

移行後に単位が増えるのは、アメリカの州ごとの大学のシステムが異なるためです。オレゴン州はクォーター制(4学期制)で、ノースダコタ州はトリメスター制(3学期制)となっています。そのため、学期ごとに費やす総時間が異なり、1単位あたりで費やす勉強量が異なるために変換する際に単位数が増減します。

クラス自体はプロジェクト計画書で記載した内容の通りにソフトウェア開発を進め、週ごとに動画形式で進捗報告をする形で進みました。進捗報告の形式は講師ごとに変動するかと思いますが、基本的な動きは同じかと思います。

Gradeは出ないクラスで成績評価基準も謎ですが、最終評価はAでした。

監督してくれた講師はアルゴリズムのクラスを担当してくれた先生で、ずっと褒めてくれるし、大学院出願の時も推薦状を書いてくれて、感謝しきれないです。

CS 467 – Online Capstone Project

このクラスは、この第2学士号プログラムの締めにあたるクラスで、最終学期に受講するものになります。こちらもプロジェクトベースとなりますが、グループプロジェクトになります。

プロジェクトとグループの選定については、すでにある程度要件が固められているプロジェクトの一覧の中から実施したいプロジェクトの候補を選定し、教授に提出することで決定されます。候補の中から人数要件が合致したプロジェクトが選定され、グループが作成されます。

プロジェクト一覧には、企業と提携したプログラムもあり、実際に顧客に使われるようなプロジェクトに携わることもできたり、薄い要件しかないプロジェクトを選択し、ゼロイチで開発を進めることもできます。

私が携わったプロジェクトは、AIが自分に最適な求人情報を提示してくれるシステムを作るというものでした。自分はインフラ担当で、開発環境を整え、コンテナ化し、CI/CDを実装し、Google Cloudで基盤を作るみたいなことをしていました。途中からバックエンド開発のヘルプをしたりもしました。

プロジェクト内容自体はとても良く、Google Cloud関連で学べたことも多いのですが、プロジェクトメンバーそれぞれが個性的で問題が多発したため、得体の知れないメンバーでのグループプロジェクトはなるべく避けたいなという気持ちになりました。簡単な自己紹介程度では他人を判断することは難しいので、最終的にはグループプロジェクトは運だなと思いました。

成績評価は進捗報告のレポートや動画で決まります。最終的なGradeはエクストラクレジットも取得したため、102.67%でした。グループプロジェクトは自分でコントロールできない部分も多いため、エクストラクレジットの取得はした方がいいかと思います。

今後の予定

卒業に必要な単位を取得し終えたので、大学院に進学する予定です。

すでにテキサス大学オースティン校にアプライし、合格をいただいたので、進学するかも知れないし、別の大学院に行くかもしれません。

まとめ

2年目の半年間は、Operating Systems IとProgramming Language Fundamentalsのクラスがとても楽しかったです。全体的にプロジェクトベースのクラスが中心で物足りなさはありました。

現在はOperating Systems Iのクラス難易度が調整され、少し簡単になったそうなので、早めに受講してよかったかもしれません。

オレゴン州立大学のコンピュータサイエンス第2学士号プログラムの全体総括みたいなことは別の記事にまとめようと思います。

シェアする

プロフィール画像

Masaki Nishi

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

詳細プロフィール