技術記事以外

技術記事以外の振り返りやその日学んだことのちょっとしたメモなどを置く予定です

Stanford の Foundations in Computer Science Graduate Certificate を取りました

この記事の続きです。自分用としてもメモ。

CS107

前評判通りかなりintensiveなコースでした。あまりに不安だったので過去のコースサイトのリンクから各週のスライド・Course Readerという情報量の多い参考資料のpdf・Labのページを全部読んでおきました。読んだと言っても、目を通したという感じです。そもそも知らない内容が多く、個人的にとっつきやすい分野でもないため正直アセンブリ周りは全然分かっていませんでした。自習できないところを学ぶためにお金払ってる側面もあるのでそもそも全てわかるようになることは元から目指しておらず、まあ心配なのでちょっと準備しておこうみたいな気持ちでした。

そんな程度でも前準備は多少役に立っていたように思います。CS161のように発想が追いつかず課題を解くのに悩むとはまた違った感じですが、課題はかなり取り組みがいのある内容で相変わらず業務外の時間は土日含めほとんど溶けました。基本的に課題はプログラムを書くことになり、テストも自分で用意するので大体思いつく限りのテストを実施してグリーンなら提出の目処はつくという点では少し楽だったかもしれません。テストが通った時や、リバースエンジニアリング系の課題で答えがわかった時は楽しかったです。C言語は通らないで来たのでコマンドラインデバッグする発想もなく最初は面食らいましたしできる気がしませんでしたが、意外とできるものですね(当たり前だけど)。

中間・期末試験は想定通り難しかったです。課題の時はそれなりだったアセンブリの解読が急にできなくなる不思議。これだけ密な授業内容でありながらやはり生徒は皆優秀なので中央値は高く、中間は最高得点ではありましたが期末はもうちょい落としていた覚えがあります。最終成績はなんとかAに収まりほっとしました。

担当のJerryはまた Kieth とは違ったタイプだけどこちらもパッション溢れている先生で、特にとても生徒思いな先生でした。SCPD経由で授業をとっている生徒とも積極的にコミュニケーションを取ろうとしてくれるし、毎回授業後にはメールが届いて授業のサマリや次回予告のみならず先生の近況まで伝えてくれます。お茶目。

内容は普段普通にコード書いてたら正直使わない内容ではあると思いますが、プログラムがどうやって動いているかなど根幹部分への理解が深まるのでとってよかったです。(そもそもRequired Courseではありますが)

CS108

Electiveです。この授業だけは授業のリソースが公開されておらず、チームプロジェクトがあったので結構不安でした。仕事だとチームでの仕事はそれだけ学ぶものが多いし成果物も良くなるので好きなんですが、授業課題となると全員が決まった時間を確保できないことなど普通にあり得ますしそれで成績左右されるのはストレスフルなのでできれば避けたい思いがありました。ギリギリまでファイルシステム系の授業と悩んでいましたが、Androidに興味があったこともあり最終的にはこちらを選択しました。

授業内容は、半分くらいは「ものすごく実務の上で大事だが学生の間は学ぶ機会がなさそうなこと」でした。例えば(かなり簡略化してますが)コードは長きに渡って色々な人に管理されるから自分さえわかればいいってもんじゃない、とか。ただし私はすでに実務経験があるので「本当それ大事!わかるわかる」みたいな感覚で聞くことがほとんどでした。そういう意味で授業はあまり重くなかったです。 残り半分は私の経験のないAndroidプログラミングの授業でした。Webとは思った以上に構造が違うので最初は結構びっくりしましたが、大体構造がわかればあとは授業課題の実装はそこまで大変ではなかったです。こういうツールや言語の自習は得意なので、比較的授業はさらっと見てあとはハンドアウトと普段通り検索で対応しました。

授業ポリシーがちょっとユニークで「実務では他の人にどう評価されるかも大事だから、どんなにプロジェクトへの貢献時間だけが大きくても最終的にチームメンバーからの評価が悪かった時はそれを評価に入れる」とか「Generative AI の使用はOKだが使用によってどんな効果があるか調べてるからどの目的でどの程度使ったかレポートしてくれ」などがありました。結局コードの生成は AI 使わなかったのですが、このポリシーがきっかけで検索するときの選択肢にGeminiが入ってきて、ちょっと使った結果「自分のある程度知識がある分野は(おそらく調べ方とか単語を知っているため)普通に検索した方が早いが、全く何も知らない分野(Androidユニットテストの書き方など)はGeminiに聞いた方が早いこともある」という気づきが得られて興味深く思いました。

個人課題はあまり難しいものではないですがCS107に比べるとテストでの確認が少ししにくいタイプのものが多く、ゆえに中盤はちょくちょく点を落とす場面もあって落第まではいかないだろうと思いつつも若干の不安はありました。そして懸念していたチーム課題。タイムゾーンの問題があるのでその辺承知の人だけ集めて組みたく自分からメンバーを募集しました。特にチームリーダーみたいなものは決めなかったのですが、自分で募集したしかなりタイトな締切なので良いだろうということで、ある程度決めの作業は私の一存で決め、仕切りをさせてもらいました。初っ端のタスクの振り出しやデザインモックの作成、アーキテクチャの提案などの作業は並行して分担できないものが多く、あまりそこに時間をかけられる猶予もなかったので逆にそういう人が誰かいないと立ち行かない課題でもあったと思います。

途中まではなかなかコントリビューションの伸びないメンバーがいたり、申告なかったですが多分gitがあまりわかっていないメンバーがうっかりmainに push -f するといったこれ進研ゼミで見たやつパターンがあったり、想定よりは遅れに遅れ最後かなりカツカツでしたが、一応最後1日をテストとクリティカルなバグ修正に当てるくらいの時間は確保できました。後半は流石にみんな自分の成績もかかっているので作業スピードも伸び、Slack上でのコミュニケーションも以前よりしっかり取れるようになったのでスムーズに進み始めました。

最終的にはそれなりに良い成果物になったと思いますし、チームの皆さんがポジティブに評価してくれたようで、個人の成績ではExtraでポイントをもらってA+で終了できました。エンジニアとして実務経験があるのが私だけだったので、むしろ私がもっとプロジェクトマネジメントに長けていたらより余裕をもって終わらせることができたのかもという点は反省点でもあります。他のメンバーはパートタイムではなさそうだったので、Stanfordの授業を並行して複数とっている忙しい中でしっかり参加してくれて感謝しています。

余談ですがAndroidStudioにEmulatorも動かすため私の貧弱なMacは常にウィンウィン悲鳴をあげていました。重いこと重いこと…。途中で実機に切り替えマシになったのですが、チーム課題も佳境に差し掛かった段階で急に実機にインストールできない(セキュリティ的な理由で)みたいなエラーが吐かれ始めた時は眩暈がしました。

総括

  • Stanfordの授業は高いけど、高いなりの理由(授業の質・サポートの質・課題の質etcが総じて高い)はある。JPYのレートも踏まえて具体的にどの程度見合っているかはなんとも言えないけど。
  • 本当に全てがオンラインで完結する
  • 授業がちゃんとしている分、ちゃんと成績をとるならかなり時間が持っていかれるので心してやろう
  • やってよかった

結局、大変なんだけど学びはあるし張り合いもあるから終わったらでまた授業をとりたくなってしまう…!

メモ

  • 学期により担当する教授が違うので、ratemyprofessorとかでどの教授の取るか決めた方がいい
  • アカウントがあれば https://carta-beta.stanford.edu/! で学生からのレビューも見られる
  • 全然関係ないけどUTAustinの同等のもの https://mscshub.com/

UoLやめた話 & Stanford で CS の授業をとった感想

前にロンドン大学の学士のプログラムを始めたという話をしましたが、2学期・計6クラス取ってやめました。理由はとにかく事務関連の処理が遅く、特に成績に関する問い合わせ(明らかな採点もれなど)について数ヶ月も返事がもらえない状態に耐えられなくなったということが一番大きいです。修士系と比べると値段が異常と言っていいほどにリーズナブルなので文句は言えませんが…。

その後、Non-degree student として Stanford の授業をとり始めたので感想を書いてみます。修士にしなかった理由はそもそも推薦状の当てがないので出願できる見込みがないのと、仮にできる状態だったとしてついていけるのかどうかテストが必要だと感じたためです。

Application

Graduate Certificate のアプリケーションを出しました。特に特筆すべきような記憶に残っている内容はないのですが、パスポートが数日前に切れてしまっているのですが身分証これでどうにかならないですかねと交渉したところOKでした。

全体の感想

事務系はとても対応が良いしフレキシブルです。例えば2個目の授業は当初CS107を取ろうとしていたのですが、支払い後に気が変わってCS161に変更できないかメールしてみたら快諾ですぐに処理してくれました。 正直学費が授業の質や事務の対応の良さを考慮してもまだ高いように感じるくらいべらぼうに高いので当たり前といえば当たり前かもしれませんが、成績も期末試験後一週間以内くらいですぐ出ますし、授業中の課題の評価やTAによるQ&Aプラットフォームのレスポンスも早いです。 授業取る時には中間・期末を見据えて持ち込みのCheetSheet作成を念頭にメモをとっておくことが大事だと思ったのでここは次回も忘れないようにしたいです。

CS106

前半と後半で少し趣が異なるのですが、私は特に前半がきつかったです。何せ数学が苦手なため…。Kieth の常にパッションに溢れた授業は熱量が感じられてとてもよかったです。試験や宿題で一定以下の成績を取るとその時点で落ちるシステムだったので結構ヒヤヒヤでした。いくら授業が楽しいとはいえ課題の量も多く、かなり時間を持っていかれるので中間試験前後は終わらない宿題と途方もない過去問を目の前に本当に辛くてこんなのいくつもやっていられないから認定証なんてとてもじゃないが無理!!と非常に厳しい心理状態に陥っていました。 なのになぜか期末の勉強をするころには次何取ろっかな…くらいのメンタリティになっていて怖い。後半は比較的得意なトピックだったのか、少し安定して(それでも期末前はまた死にそうになっていました)最終的にはなんとかAが取れてほっとしました。(なおA+が上にあるはずなのですっごくいいとかではないです)内容としてはとても勉強になりました。みっちりやらされる分独学より定着度は確実に高いですね。

CS161

こちらも課題がびっくりするほど毎回平均点ジャストで、こんなの思いつかないよ!!と叫びながらアルゴリズムを考える問題を解いていたのでまた先行き不安でしたが、CS106と違って中間前は宿題がなかったり最後の授業は期末範囲に入らなかったり少し優しい仕様になっていて嬉しかったです。 元々数学記号っぽいものが苦手なのでアルゴリズム関連のことをぐぐっても Latex 仕様の記号が出てくるとそっ閉じしていましたが、この授業を受けたおかげで自らそういうリソースを検索して読みに書かれるようになり成長を感じました。(自分に甘い) アルゴリズムは基本は知っているつもりでしたが、やはり表面的な理解だったなと今になって思いますし、これもCS106と同じで理解度や定着度がかなり進歩した実感が得られました。期末試験だけは平均より少しだけ良く、今回もなんとかAで終わることができました。

今後

Electiveでどれを取るか悩んでいるのですが、どちらにしても内容がヘビーそうな必修のCS107が控えているのでかなり不安です。授業始まるまでにできるだけCourse Reader とか読んでおきたいしC++も少しやっておかないと厳しそう。

今日の学習メモ

  • まあまあ使ったことある気がするのにnth-child系はクラス名を起点に使えることを知らなくて衝撃を受けた。いかにこれまで雰囲気で使ってたかがよくわかる…

CSSの :nth-child、:nth-of-type などにクラス名を使う落とし穴 | PisukeCode - Web開発まとめ

  • Cではmax()min()といったような関数はない
  • Cでは\0を末尾につけることで文字列がそこで終わりになるので、改行コードを削除したいときは改行コードのアドレスを取得してそこにこれを足す
  • Cではファイルを開く際fgetsで一行ずつ取得ができるが、このとき格納する変数を先に用意しておく必要があり、さらにそのサイズは事前に決めなければいけないので(理屈的にはなんでも良いが)例えば256サイズの配列を宣言して決めて使い回す

今日の学習メモ

  • Boyer-Moore Voting Algorithm 頭良すぎる〜〜〜〜〜シンプルな感じのロジックに見えるけど最初え、なんで動くの?って感じで色々なパターンやってみたら(当たり前だけど)うわ、この場合もここがこうなるから問題ないのか…!の連続
  • 授業の影響で pigeon-hole が頭をちらついていた
  • Cでは配列変数名のみの場合配列の先頭の要素のアドレスとなるため、argv+1で2つ目の要素のアドレスを指すことができ、*(argv+1)とすることで要素にアクセスができる。もしくは添字で普通にアクセスする。
  • C における文字列は本当にただのcharの配列であり、オブジェクトではないため特にビルトインのメソッドなどもない

今日の学習メモ

Test Generator | Playwright

playwright を起動してサイトを操作するだけで画面テストを生成してくれるらしい。

「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回

「ユーザーは自分の欲しいものを知らない」と「ユーザーの声を聞かないUXデザインは存在しない」がとてもわかりやすく説明されている。ユーザーと接触するのは根底にあるユーザーのニーズを掘り下げるため。

今日の学習メモ

https://lopan.jp/about-svg/filter/

SVGにはフィルタというものがあり、自分でSVG内にフィルタを組み合わせたものを一つの要素のように定義してidを割り振る。これをCSSで指定することで指定の要素にフィルタをかけることができる。すごい。ただしフィルタの種類によっては一部ブラウザではサポートがないみたい。

大事なところはストップ! - YouTube

冷静に考えたら当たり前ではあるんだけど、あのスローモーションになる動きはやっぱり誰かがどこかでそうしようと意図的に入れたからそうなってるんだなあと思う。もう当然のように受け入れてしまうけど、最初にこれを思いつくのは簡単では無いだろうな。遊ぶ側としてはむしろそれが普通くらいの勢いだけど、いざ自分が一からゲーム実装したらこの発想がないかもしれない。