UoPeopleでProgramming2(Java)を修了した
オンライン大学 University of the People でProgramming2 (CS1103) を修了したのでその感想を書きます。
これまでのUoPeople関連の記事はこちら:
UoPeople カテゴリーの記事一覧 - えんぴつぶろぐ
はじめに
このコースはCS1102:Programming1に続きJavaを使いますが、CS1102に比べると課題の難易度が上がりComputer Scienceコース最初の関門と言われています。
ほぼ毎週Programming課題があるので課題の量も多め。
ただJavaそのものを学ぶというより、Javaを使いながら計算量やデータ構造・アルゴリズム、Generic ProgrammingやGUI Programmingなどの他の言語にも通ずる問題解決力を養うためのコースなのでやりがいがあるし、 これを修了すると受講できるコースの選択肢が格段に広がります。
また、私はWebエンジニア歴がX年くらいありますが、クライアントサイド・フロントエンドがメインでバックエンドのまともな実務経験はほとんどないので楽しみなコースの一つでした。
今週のJavaのコースはGeneric Programmingと構文解析の話。
— えんぴつ (@empitsu88) 2021年5月7日
BNFで定義しつつ再帰下降法でパーサーを作ったり式ツリーを構築したりで段々むずくなってきた。
ただJavaの書き方を学ぶのではなく、計算量や基礎的なデータ構造・アルゴリズムからしっかりやるのが目的のコースなのでとても良い。#CS1103
学習内容
- 例外処理
- 計算量
- ビッグ・オー:𝑂
- ビッグ・オメガ:Ω
- ビッグ・シータ:Θ
- 再帰、ソートアルゴリズム
- ADT(Abstract Data Types)などのデータ構造
- List
- Set
- Map
- Stack
- Queue
- double-ended Queue
- LinkedList
- BinaryTree
- HashTable
- デバッグのノウハウ
- ファイル・ネットワークなどのI/O処理
- MVCパターン
- JavaのCollection Framework
- Generic Programming
- GUI Programming
- Swing component
- BufferedImage, graphicsなど
今期のJavaのコース、初週は例外設計や計算量の話だ!オラわくわくすっぞ!#UoPeople #CS1103
— えんぴつ (@empitsu88) 2021年1月28日
JavaのCollection frameworkにはQueueやLinkedList、HashTreeとかもあってそしてCollectionsクラスにはbinarySearchやshuffleメソッドが生えてるのめっちゃ便利じゃん(小並感)#CS1103
— えんぴつ (@empitsu88) 2021年5月11日
プログラミング課題
ほぼ毎週ProgrammingAssignmentがあります。
(他のコースで言うWritten Assignmentに相当するもの)
また、Learning Journalでも毎週振り返りに加えてプログラミング演習があります。
データ構造を実装したり、
バッカスナウアで定められた構文ルールを実装したり、
チューリングマシンの一部を作ったり、
ファイルの読取・書込を実装したり、
木構造のトラバースをしたり、
バグのあるプログラムのデバッグをしたり、
パーサーを実装したり、
スペルチェッカーを作ったり、
簡単なWebServerを実装したり、
テキストやグラフィックを描画するGUIアプリケーションを作ったり、
ととても実践的な内容。
今週はチューリングマシンの極々一部を作ってみるという課題なんだけど、まずチューリングマシンがなんなのかわかってない#CS1103 #でもとりあえず指示通りに動くものは作れました
— えんぴつ (@empitsu88) 2021年4月26日
とはいってもイチから10まで丸投げされることは少なく、
ベースとなるClassやサンプルコードが渡され、なにをどう実装するか文章で指示されます。
実装する範囲は関数もしくは機能単位で採点基準もシンプル。
テキストの内容やそれまで登場したサンプルコードを理解していればなんとか実装できるはず…。
が、プログラミング自体に慣れていても、指示の文章がめっちゃ長かったり、ベースとするコードの量が多い&仕様がわかりづらかったりでそれなりに時間が取られました。
要件が多い場合も同様。(スペルチェッカーとWeb Serverは結構面倒くさかった…)
自力でシンプルなweb serverを作る課題に8時間くらいかかってしまった😩#CS1103
— えんぴつ (@empitsu88) 2021年5月24日
Optionalなプログラミング演習もありましたが全くやる余裕はありませんでした。
そしてGUI ProgrammingはなんとSwingを使うので、Reactの関数component+宣言的UI慣れた身としては辛かった…。 せめてJavaFXにしてほしかった…。
宣言的UIに慣れてしまった今では命令的UIの構築が辛くてしょうがない#CS1103 #UoPeople
— えんぴつ (@empitsu88) 2021年6月3日
ただ課題としては必須ではなかったですが、バッカスナウアでルールを定めつつ再帰下降法でパーサーを作ったり、式ツリーの構築や後置記法での演算、マンデルブロ集合をシミュレーションするなどといった話もあって興味深かったです。
中高生レベルの数式もたまにでてくるのでAlgebra先にやってなかったら超ビビってたかもしれない。 (理解してなくても課題はできます。)
テキストにマンデルブロ集合を描画するサンプルプログラムが載ってて、「マンデルブロ集合 is 何」ってなったのでぐぐったが
— えんぴつ (@empitsu88) 2021年5月22日
「あ、これ真面目に理解しようとすると1term以上かかるやつだ」
ってなったhttps://t.co/R6xagAF6BW#CS1103 #UoPeople
Learning Journal
先程も言及しましたが、Learning Journalでは振り返り+プログラミング演習です。
ただ、プログラミング演習は基本的にnon-gradedになっています。
題材がテキストの演習問題とほぼ同じだったり、木曜日をすぎるとOffical Solutionが提示されるからだと思われます。
でもそのままコピペするともちろん剽窃になっちゃうので、答えは参考に留めつつできるだけ自分で頑張りましょう。
Discussion Assignment
毎回「XXXのメリット・デメリットについて論じて。」みたいな超シンプルな問いが出されます。
複数の参考文献からの引用+サンプルコードとか載せると高得点をもらえると思われます。
今週のJavaの課題、指示には無かったが、3種類の文献を参照し漸化式と一般項の数式を載せつつそれを実装したコードと実行時間のベンチマーク結果まで貼った自分えらい。
— えんぴつ (@empitsu88) 2021年4月18日
と書こうとしたが、他の生徒も複数の文献やサンプルコード貼ってる人が多くクラスのレベル上がってるなと実感…#CS1103
Graded QuizとFinal Exam
Graded QuizはSelf-Quizで見たことある問題がほとんどだったので、Self-Quizをちゃんとやってれば楽勝のはず。
ただ、Final Examは半分くらいがSelf-Quiz/Review Quizにない問題で、教科書のかなり細かい内容などが出題されていた印象。
役立ったもの
「選択ソートってどんなやつだっけ?」
「木構造の先行順巡回ってどういう順番だっけ?」
という時にアルゴリズムビジュアル大辞典をよく見ていました。
擬似コードやアニメーションも全部載っているので本当に神。
学習時間
学習くらいは大体11時間/週くらいでした。
Web Serverを作った週は時間を取られて18時間かかってた😇
右側3本は課題が少なかったUnit8+最終試験の週でした。
成績
インストラクターが「毎回10点マシュマロ」「Discussion Assignmentでほとんどの生徒にコメントをくれる」という素晴らしい人だったため毎回ほぼ満点を取れました。
ただFinal Examで何問か落としてA+はとれず。
これまでに受講したコース
ということで以下のコースが修了できました!
- ENGL0101 English Composition 1
- UNIV1001 Online Education Strategies
- CS1101 Programming Fundamentals
- CS1102 Programming1
- MATH1201 Algebra
- MATH1302 Discrete Mathematics
- MATH1280 Introduction to Statistics
- CS2203 Databases
+前の大学から単位移行したコース