Masa's Blog

技術的なことはdev.toに書いてるので、それ以外の日常の出来事を物思いにふけるブログ

【UoPeople】CS1103(Programming2)を振り返る

はじめに

今季は社会人大学生の忙しさを忘れのんびり過ごそうと思い、履修登録せず休みを満喫してました。 束の間の休息もおわり、ぼちぼち次termがやってくるとのこと、その前にCS1103を振り返りたいと思います。

CS1103は、 敗北した感じと、求めていたものが手に入った喜びを感じられるカリキュラムで、 なんと表現したら良いのか、履修中は恋人と時限爆弾をいっぺんに手に入れたような気分でした。

Disclaimer

この記事の趣旨は個人的な振り返りであり、自分の備忘録を兼ねた只の日記です。 一方で、役に立つか分かりませんが、これから履修する人の何か参考になれば幸いです。

CS1103とは

改めてCS1103がどんなカリキュラムだったのか見てみましょう。 (シラバスは公開情報なので抜粋)

This course builds on the Introduction to Programming 1 course and teaches a more highly developed Java programming language with features beyond the basic concepts covered in the first programming course. A large part of the course will be devoted to more advanced building blocks such as recursion, linked data structures, and Java's Collection Framework. In addition to this, you will learn more about designing and coding complex, robust, and efficient programs. And you will be introduced to a professional programming tool: the Eclipse Integrated Development Environment.

はい、JavaでRecursionやらData Structureなどの知識とテクニックを身に着けたり、はたまたCollection等のFWの使い方を学ぶコースのようです。 UoPeopleにてプログラミングのカリキュラムはまずPython(CS1101)で基礎中の基礎である変数とかIf文とかを学び、Java(CS1102)にてOOPを学び、そしてCS1103を受講というステップで来ているはずで、私もこの流れで受講しました。

Javaについての私のバックグラウンドを話すと、新卒入社した某SIerにて新入社員研修で学び、その後Java SE8 Silverまで会社命令で取得した(なお、実務ではほとんどやらず)ので、多少は自信はある状態で挑みました。

受講してどうだったのか

はい、舐めてました。普通に敗北を味わいました。一応単位は取れましたが、ほぼ毎週納得いく形で提出物を仕上げられなかったです。 ただ一方で、自分が掘り下げて勉強したいと思える分野がいくつも含まれて、CS基礎を体系的に学びたいと考えていた私には、毎週の学ぶ内容は興味深く楽しかったです。

そして、週が進むにつれて、コースについて行けなくなりました。無念。。。。 理解が浅く、納得いかない形で終わらせてしまった部分は、少しずつ復習していこうと思います....!

具体的にどんなことを学んだかを書いていくと;

概ね以下のトピックを学びました(※印象に残ってるとこをメインに抜粋しててMECEでは無いです)

  • 例外処理
    • Try-Catch
  • 計算量
    • 漸近解析; 𝑂 Ω Θ
  • 再帰、ソートアルゴリズム
    • liniar search
    • quick sort
    • bubble sort
    • recursion
  • ADT(Abstract Data Types)などデータ構造
    • Stack and Queue
    • List
    • Map
    • Hash
    • Set
    • Postfix
    • Tree traversal
  • ファイル・ネットワークなどのI/O処理
  • デバッグ技法
  • ソケットプログラミング
  • MVC Design Architecture
  • Collection Framework
  • Generic Programming
  • GUI Programming
    • Swing
  • Mandelbrot Set

MVC、ソケットプログラミング、I/Oや例外処理、デバッグなどは馴染みある分野であった為、ストレスなく取り組めたし、実際のLab(プログラミング課題)では、簡易Webサーバー実装したり、BNF構文解析を利用した英文自動生成プログラムを書いたりと、楽しむことが出来ました。

一方で、辛かったのは、計算量、ADT、Generic、Swingあたりですかね....Orz 満足する結果で終わらせることが出来ず、Labも完成に至らず提出するなど、課題が残る形となってしまいました。

What troubles

一言でいうと、自分のキャパが足りてないという話ですね。。。。 なんか自分の無能っぷりを晒すことになるかもしれませんが、何が問題だったのか、やり残してしまったことと、今後どうストラテジ立てていくかをありのままに書いてます。

悩み1: 有限な時間でどこに注力するか

UoPeopleは毎週提示される課題の量が多い。そして多くの方が社会人学生の為、毎週コミット出来る時間は限られている。そういった環境の為、提出する必要の無いOptionalな部分のReadingAssignmentやLabは後回しにしたり、取り組まないという人は一定数居ると思います(優先度的には、①Peer Review -> ②提出課題 -> ③提出課題と無関係な部分やOptionalな部分の学習を深める という順番の方が多いと思います)

この取捨選択を自分は完全に間違えて詰んだ。例えばUnit1のReadingAssignmentの最後に漸近解析などの計算量問題があったが、その週のLabが簡単だった(ソートの実行時間比較)のと、きっちり理解しようとすると、本腰入れて数学の知識(対数とか極限とか)が必要そうだなーと思い、一週間でマスターできる内容ではないと思い、分からないところをそのままにしてしまった。

そして、この判断が地獄を見ることになる。その後のADT、データ構造やアルゴリズムに纏わる内容に入るにつれて、ぼんやりとしか理解してない部分が徐々に広がっていき、分からないに分からないを重ね、最終的に手に負えない状況となってしまった。 シラバス見れば計算量の理解が必要であることに薄々感づいていたが、追われるユニットの締め切りのことしか当時は頭になく、考えている余裕が無かった。

因みにこのしくじりエピソードは、計算量だけではない。Swingでも同じことを経験した。 自分は新卒最初の研修でJavaを死ぬ気でやったあと、配属先ではVB.netで開発しており、3年ほど保守/運用をやっていたので、GUIデスクトップアプリは慣れている。そして、私はこの辺の技術に全く興味が無く、好きになれず(新卒〜3年間をWeb系の世界線とは程遠いWinodwsエンプラの世界で過ごしたことをdisadvantageに感じている)。。。

従って、実はCS1102のときから、JavaFXもSwingも時間を使い学ぶことに抵抗があり(実際、テキスト読むだけでもそこそこの英文を読むので結構疲れる)、流し読みで適当な理解で進めていた(今となっては猛反省)

そして、Unitの後半はGUIアプリをベースに、内容が進んでいった為、課題で分からない部分があると、もうどこで躓いてるのか迷子になったりした。とどめはこの章の最後にマンデルブロ集合が出てきたが、まさにこれまで学んできたことの集大成という感じで、もう分からないの大爆発で完全に敗北を味わった。好きなことを学んでたはずなのに、次第に膨らんでいった自分の中の何かが時限爆弾として爆発した瞬間であった。

悩み2: 英語力足りない問題

薄々気付いていたが、自分は英語力足りないのだと実感。これまでそのことにずっと目を瞑っていたが、多分Unit4~5あたり?、Generic/Collectionを学んでいるときだったと思うが、心の中で実力不十分なことを認めた。これまでCS1101~1102で履修した内容はほぼ全て知ってる内容であった一方、この2つ(Generic/Collection)は馴染みない概念で、多分UoPeopleで初めて学んだ。何となくの理解でテキストを読み終わり、いざLabに入ると何をすれば良いのか分からない。

多少の言い訳をすると、正直利用している教科書はほぼ活字で、初めて登場する言葉もそこそこ深い粒度で解説される為、分かりにくい(例えるならば伊藤和夫先生の英文解釈教室みたいな、もう素晴らしいバイブルなんだけど、初学者が読むと難解に感じるあの感覚に近いと思う)。そして、UoPeopleあるあるですが、Labがいまいち何をすればよいか分からない(一例を挙げると、チューリングマシンを作成する課題があったのですが、チューリングマシンの説明もほどほどに、仕様と一部のサンプルが与えられ最初何をしたら良いのか分からなかった。)

等と言った形で多少の言い訳を並べる言葉があるのですが、それでも同時期に履修されていたTwitter繋がりの非プログラマ/外資勤務の会計士の方が、健闘しながらも進捗を出しているのを見て、すごく焦りを感じた。

そして、認めたくなかったが、これまでサクサクReadingAssignmentを読めて、Labも実装出来ていたのは、英語を読めていたのではなくて、元々知っている知識があったから、それが多くを補ってくれてたんだなと、感じてしまった。

悩み3: 普通に内容のレベル高い問題

正直本当にこれ大学で初めてJavaを学ぶ人間の後編カリキュラムなのか?
アメリカのCSを専攻する学生たちは早い段階からこんなレベル高いことやるのか??と思いました。正直今でも疑問です。

私事を話すと、少なくとも新卒研修での学習も(チームでBlackJackを作りました)も、Java Silver試験もこんな難しくは無かったし、日本の情報学部出身の友人に聞いても、きっとJavaの授業でここまで高度なことをやってないような・・・。 そう思ってます。 以前CS1101が一緒のグループであり、fabulousな投稿をしていたUoPeople仲間も同時期に本科目を履修されていて、その方も難しかったと以前言っていたので、少なくともそう感じたのは僕だけじゃなくてちょっと安心。

どういうところが辛かったのか一例を挙げると、いきなりCollection Frameworkのヒエラルキーを見て、それぞれのユースケースを英語で一気に読み込んでも、いきなりLabで使い分けたり、課題指示からアルゴリズム考えて実装するのは、正直かなり大変だった。

最後に件のマンデルブロ集合が出てきたときにはもう鼻血出そうになった。もうこのときには、Javaが分からないのか、英語が分からないのか、数学が分からないのか、もう分からなかった。(今、改めて調べてみたけどやっぱり分からない)

これから

実は今季学業はお休みした理由に純粋な英語学習と、本カリキュラムの復習をしたかった為でした。 ただ何か色々気付いたら、後者の方を後回しにしてしまったということもあって、まずは復習がてら日記書いた次第でした。

幸い、次Termの履修はWarm upの意も兼ねて緩い感じの選択にしたので、並行して学習を進めていこうと思います。

おわりに; これから受講する人へ

読み返すと、すごく難しい印象を与えてしまったかもしれません。ただとりあえずマンデルブロ集合とか漸近解析とか分からなくても基本的に単位は取れる場合が多いと思います。 Discussion ForumとLearning Journalはさほど難しくないですし(CS1102と同じ雰囲気です)、Labもすべての週が難しいわけではないです(一番易しいのだとEclipseデバッグする課題とかありました)

ただ例によってインストラクターガチャはあると思っていて、自分はLabがボロボロだったけど、インストラクターがかなり緩い人だったので、それに助けられた部分もあると感じてます。

あと自分はエンジニアとしての経験が8年あるが、SIerにてプライム案件を行う(大半の業務は設計書・手順書の作成など、上流工程や管理業務)エクセルパワポエンジニアだったので、今回のカリキュラムは本当に苦手な分野でした。なので、Javaで実装をガリガリやってたプログラマならそう苦労しないのかもと思ってます。

また大学なので、当然学ぶ為に来てるわけで、仕事でプログラムを書かない職業の方も多くいらっしゃると思います。日本語の書籍を手元に置いておくと良いと思います(Javaでもアルゴリズムでも図書館に行けばたくさん良書があるはずです)

現場からは以上です😇😇😇