University of the Peopleを卒業してコンピュータサイエンスの学士号を取りました(仮)

先日AY2024-Term3を終えて卒業要件単位数を満たすことができました。今はまだ卒業申請中なので「仮」としている。ディプロマを手にするまでは実感が湧かなそうだけれど日に日に記憶が薄れていくので振り返りを。

清々しい気分で見物した今年の牡丹

目次

CS 2204 Communications and Networking

OSI参照モデル、TCP/IPモデルの各レイヤーの役割とそこに使われているプロトコルやアルゴリズムを一通り学んだ。イーサネットとATMの比較、connection-orientedとconnectionlessの違い、プロトコル設計におけるアドレス指定・フロー制御・エラー制御のしくみ、Manchester・4B/5Bなどの符号化方式とクロック同期問題、クロストークの仕組み、移動通信システムの世代ごとの進化、IPアドレスとサブネット計算、ARPとNeighbor Solicitationの違い、ワイヤレスネットワークと隠れノード問題、各種ルーティングアルゴリズム、Remote Procedure Call、UDPとTCPとQUICの違い、DNS、HTTP、などなど覚えることは盛りだくさん。アプリケーション層だけは何となくわかる程度の自分の知識レベルでは脳のリソース的に厳しいコースとなった。

厳しいコースになることは予想していて、あらかじめ『マスタリングTCP/IP 入門編』『ネットワークはなぜつながるのか』を読んで予習をした。この二冊はUoPeopleに入学する前から長いこと積んであったのだが、大学の強制力でついに読破できたのがありがたい。前者はコース中盤から大活躍、後者はより抽象度が高くネットワーク未経験者にもわかりやすい文章で、全体像を把握するのにちょうどよかった。

学ぶトピックはCCNAの範囲であることが多く、コース中はUdemyの『Cisco CCNA試験対策講座』を購入して補助教材にしていた。MACアドレス解決やルーティングアルゴリズムやコネクション確立のフローなど、教科書だけでイメージするのが難しい動きを理解するのに役立った。他に、技術評論社のネットワーク関連の記事はある技術仕様をサマライズするようなシーンで、文章化の参考にさせてもらっていた。

学ぶコンセプトが膨大なのに対し課題で取り上げられるものは限られるので、教科書で読んだだけの情報は記憶に定着していない気がするけど、網羅的に理論を習得できて「ネットワークは難しい」という意識は克服された。

学習時間は約15時間/週

CS 2301 Operating Systems 1

皆さんの評判どおりとても良いコースだった。メインの教科書は無料で公開されているArpaci-Dusseauの『Operating Systems: Three Easy Pieces (OSTEP)』を使い、このうち「Virtualization」の章を8週かけて学んだ。

このOSTEPはテンポの良い口調で具体と抽象をバランス良く語ってくれるのでOSの知識が無くても読みやすく、初めての技術を英語で読んで英語で理解して納得できる唯一の教科書だった。毎週この中から1,2チャプターに加えてGeeksforGeeksやTutorials Pointなどいくつかのネット記事が読書課題として与えられる。そこに登場したコンセプトは全てDA, WA, LJの3つの課題で網羅されるので、それらに取り組むことで記憶に定着する。さらに重要なコンセプトはコース中に繰り返し登場するので記憶が補強され、他のコースではありがちな「教科書で読んだだけの内容は忘れるがfinalに出てきて失点」現象が起きない唯一のコースでもあった。

OSの歴史から始まり、カーネルとシステムコール、CPUスケジューリング、マルチプロセッサ、キャッシュ管理、メモリ仮想化とプログラミング言語のガベージコレクションの比較、メモリ割り当て、スタックとヒープ、Shellなどのトピックを学んだ。OSを実装できるまでの技術はさすがにこれだけでは身につかないが、概念としての仮想化の仕組みを深く理解でき、良質な学習体験を得られていちばん推しのコースとなった。

学習時間は約13時間/週

CS 3307 Operating Systems 2

OS1が神だったのに対してOS2は個人的には正直なところあまり得られるものがなく... OSTEPも一瞬しか使わず基本的にネット記事を読むのが残念でした。Windows, Mac, Linuxの比較や、ファイルシステム・パーティショニング・リモートプロシージャコールを広く浅く、並行性と同時実行性、VimとEmacsの基礎、後半はUnixコマンドやShellの基礎を学んだ。

課題ではたびたびWindows, Mac, LinuxのうちどのOSが理にかなっているかという問いを投げかけられるのだが、Macを取り上げるとアンチAppleクラスメイトから理由なき減点を受ける気配を初期段階で察知したことにより、in my opinion~ など慎重な言葉選びをしなければならず余計な心労があったのがすこし大変だった。他、WAでは「ジュニアデベロッパーが理解できるよう技術書を書く」というように文体への指示があったことで単純な手順を噛み砕いて説明しなければならないのがやや面倒に感じた。

良くなかったことばかり書いてしまったんだけど、一点、今までうやむやにしていた並行性と同時実行性の言葉の定義の違いを明確にできたのは良かった。

youtu.be

学習時間は約11時間/週

CS 4402 Comparative Programming Languages

プログラミング言語の歴史から始まり、命令型/非命令型の分類、言語同士の比較、データ型、文字コード、エンディアン、動的/静的型付け、強い型と弱い型、値渡しと参照渡し、ジェネリクス、関数型言語の遅延評価とカリー化などを学んだ。コース中はJavaの存在感は薄かった印象だが、finalではJavaのコードを例に抽象クラス・継承・インターフェースなどポリモーフィズムの理解度を問う問題がいくつか出たのが想定外だったのと、Perlの挙動が予想外すぎて勘では解けず数問失点したのがくやしい(予習不足なだけ)。

課題はDAと振り返りのLJしかないため軽めではあったが知らないことが多くて勉強になった。自分は普段SQL以外は命令型言語しか書いたことがなかったので、課題をとおしてHaskellやPrologで簡単なサンプルを書いたことで関数型や論理型がどういう性質の言語なのか知れたり、命令型でもCやPerlなど馴染のなかった言語のシンタックスを知るきっかけになったのが良かった。また、コース中盤でOpen Recursionとは何かを説明する課題で調査をしていて、複数の記事内で通称TaPLとよばれる『Types and Programming Languages』という書籍が引用されていることに気が付き、偶然にもCS学生の必読書らしきこの一冊に出会うこととなった(Open Recursionに関する部分しかまだ読んでいない)

コンパイラのコンパイルプロセスを説明する課題に取り組んだこともすごく勉強になった。その時に読んだRui Ueyamaさんの『低レイヤを知りたい人のためのCコンパイラ作成入門』では、プログラミング言語がアセンブリに変換されていく過程を初めてちゃんと知り、コンパイラを使う側でしかなかった私はコンパイラめちゃくちゃすごいとなった。その内部処理には過去のデータ構造コースで学んだ木構造が構文解析に使われていたり、正規表現がトークン化に使われていたりして、知ってる知識を使えばコンパイラ作れそうな気がしてきてうれしかった。BNFって以前のプログラミングコースで出てきた際にあまりピンと来なかったが、文脈自由文法や生成規則を学んでその便利さに唸ったりもした。

このコースを通して、自分はコンパイラもプログラミング言語も使わせてもらう側の身だけどそれ自体の開発者はすごいとあらためて思った。

学習時間は約11時間/週

CS 4407 Data Mining and Machine Learning

データマイニングと機械学習の定義とそこで使われるテクニックやモデルを広く学んだ。HadoopとRDBMSとNoSQL、教師あり学習と教師なし学習、機械学習の各モデル(線形回帰、ロジスティック回帰、k-NN、decision tree、ニューラルネットワーク、パーセプトロン、etc.)のアルゴリズムと理論、Rを使った分析手法などを学んだ。

最初の2週間は過去に履修した統計学の復習から始まって、基本用語やデータの種類・分布・偏差・分散・期待値・正規分布ってなんだっけ...?と記憶を掘り起こした。P値、仮説検定とかはIntro to Statisticsでは扱わなかった気がするので(忘れてるだけ?)、もしかしたら選択科目のStatistical Inferenceを取っておくとより導入がスムーズだったのかもしれない。事前にUdemyの以下のコースを購入してさらっと目を通しておいたのだけど、統計学の基本も説明してくれたので流し見しながら短時間で復習ができた。

www.udemy.com

一番恐れていた数学的な要素については、ディスカッション課題ではモデルやアルゴリズムの仕組みを言葉で述べる指示が多く、微分や線形代数など数学の深い知識がなくてもまとめることができたので一安心。それからChatGPTとの二人三脚で、教科書の数式を見ても理解が難しい時はPythonかRでの演算過程を提示してもらっていた。Graded QuizeやFinal ExamではZ-score, min-max normalized value, エントロピーなどを手計算する問題も出たが関数電卓を使えたので大丈夫だった。

プログラミング課題ではRでモデルのプロットや、信頼区間とP値の分析、残差分析によるモデルの妥当性の検証、k-NNや分類木によるデータの分類、Basic Propというニューラルネットワークシミュレータを使ったネットワークの構築と誤差の分析なども行った。ニューラルネットワークについては、課題を通じて生物学的ニューロンと人工ニューロンを比較したことで、どうやって人間の脳を人工的に模倣するのか、なぜ出力の非線形変換が必要なのかを知れたのが興味深かった。シナプスの可塑性を知り自分の脳に刺激を与え続けなければ...とも思った。

このコースでは今まで遠い存在に思っていたデータサイエンスが身近に感じられるようになり、この領域に興味を持てるようになったのが良かった。

学習時間は約13時間/週

さいごに

入学したのがAY2021-Term4だったのでちょうど三年在籍していたことになる。一年目は念願の大学生になれたテンションの高さで突き進んでいたが、二年目頃から勉強が難しくなって我に返り、疲れもたまってフィジカルもメンタルもきつい日々を黙々とこなすだけになった。最後の二ヶ月は本当に限界がきて仕事を休ませてもらい学業に専念していて、わがままを聞いてもらえた職場に感謝しています。今すべてが終わって世界が違って見えるくらい清々しい。

私はもともと理系のバックグラウンドがないエンジニアであったこと、大卒でなかったことにコンプレックスがあり、大学へ行きたいとはずっと考えていて、2021年に生活環境に変化があったり緊急事態宣言で一人で過ごす時間が増えたのをきっかけに、なんとなくUoPeopleに入学したのでした。入学の動機は完全にその時の気分ではあったけれど、コンピュータサイエンスの知識の習得だけでなく他の多くの価値、例えば次のようなことが身についたり、気がつく瞬間があったおかげで続けられたんだと思う。

  • 自己学習の習慣
  • 論理的思考と批判的思考
  • 一次情報や信頼できるソースから情報を得る意義
  • 不当な評価を受けた時に「自分はそれに価しない」と異議を申し立てること
  • 世界にはいろんな国がありいろんな人がいること
  • 人の考えを聴き違いを受け入れたうえで自分の意見も伝えること
  • ネットワーク、DB管理、OSなど自分の専門外の領域を専門にしている人へのさらなる敬意
  • 自分の無知さの自覚と一緒に仕事してくれてる優秀な皆さんありがとの気持ち
  • 大きな問題はdivide and concureで解決できる
  • わからないことはまだまだ沢山あるが勉強すればわかるようになるから大丈夫という自信

あとはコンピュータサイエンスを幅広く学んだうえで、私はやっぱユーザーインターフェースを作ることに興味があるなあと気がつき、一番得意としているフロントエンド領域の開発へのモチベーションが高まった。以前よりも機械側の気持ちがわかるようになったので、その機械と人間が対話するユーザーインターフェースの可能性をもっと追求してみたい思いが今あって、時間もできたことだしアクセシビリティとか対話のためのLLMとか勉強してみようと考えている。

今後もっと勉強したいことが見つかったら大学院へ行くかもしれないし、どういう選択をしていくかは何もわからないけどこれからも勉強は続けていきたい。英語も引き続きがんばる。

全然まとまりがないが、UoPeople日記はこれでおしまい。