文系エンジニアが放送大学の情報コースに通った感想と振り返り

はじめに

この記事では、放送大学教養学部の情報コースに通った際の感想と振り返りを書いています。文系からソフトウェアエンジニアとして就職された方の参考になれば幸いです。

当初考えていたこと

私は、法学部を卒業してソフトウェアエンジニアとして就職しました。そのため、いわゆる情報系の学位を持っていません。幸い、Androidエンジニアとして働く上ではなんとかなる場面が多いものの、新卒の段階から何らかの学位を得たいと考えていました。動機としては、体系的に学んでいないことによる基礎知識の欠如が一番大きいです。実務で何かを身につける際に表面的な理解で終わってしまうことが多く、自分の中で「分かったこと」を積み上げていけない点にもどかしさを感じていました。また、将来のキャリアを見据えた時にも情報系の科目を履修していることは自身のプラスになると判断しました。これらの理由から放送大学に入学し、今回無事卒業することができました。ここでは、その感想と振り返りを書くことにします。

社会人が情報系の分野を学ぶ際の選択肢

社会人が情報系の学位を取得する上で、学士や修士を含め様々な選択肢があります。

私が当初検討していた際は以下の点を重視していました。

  • 情報系科目の基礎知識から身に付けたい
  • 社会人学生の負荷が分からないため、科目履修を柔軟にできるコースが良い
  • 非同期で学習したい

上記の点を満たす放送大学にて、数年前から科目履修を始めました。

放送大学とは

放送大学とは、インターネット等を利用して様々な科目を学べる通信制の大学です。学位は学士(教養)と修士(教養)、博士(教養)が存在しており、その中でいくつかのコースに分かれています。

例)学部課程で提供されているコース

  • 生活と福祉コース
  • 心理と教育コース
  • 社会と産業コース
  • 人間と文化コース
  • 情報コース
  • 自然と環境コース

通信制大学・大学院の放送大学

私は、情報系*1の講義を多く展開している情報コースを選択しました。

受講した科目の一部

在学中には以下の講義を受講しました*2。

【基盤科目】

  • 身近な統計(’18)
  • 初歩からの数学(’18)
  • 情報学へのとびら(’22)

【コース科目】
(導入科目)

  • 計算の科学と手引き(’19)
  • 情報理論とデジタル表現(’19)
  • 日常生活のデジタルメディア(’22)
  • 入門微分積分(’16)
  • 入門線型代数(’19)
  • 初歩からの物理(’22)

(専門科目)

  • 博物館情報・メディア論(’18)
  • 記号論理学(’14)
  • コンピュータの動作と管理(’17)
  • データ構造とプログラミング(’18)
  • コンピュータとソフトウェア(’18)
  • コンピュータと人間の接点(’18)
  • 自然言語処理(’19)
  • 情報社会のユニバーサルデザイン(’19)
  • Webのしくみと応用(’19)
  • 映像コンテンツの制作技術(’20)
  • 身近なネットワークサービス(’20)
  • アルゴリズムとプログラミング(’20)
  • 情報デザイン(’21)
  • 問題解決の数理(’21)
  • 教育のためのICT活用(’22)
  • 情報セキュリティ概論(’22)
  • データベース(’23)
  • C言語基礎演習(’20)
  • 数理最適化法演習(’20)
  • 続・C言語基礎演習(’23)
  • 線型代数学(’17)

講義の感想

全体を通して

全体として広く浅く概観する科目が多いです。専門科目の難易度としては基本情報技術者や応用情報技術者レベル + α程度をイメージしていただけると良いと思います。もちろん、各科目の中で理論的な深掘り・説明もありますが、詳細を理解していくには参考文献や他資料を用いて自ら学んでいく必要があります。講義動画は全て録画されており、好きな時に視聴できます。学期中のレポート課題等は一部科目を除いてほぼ課されず、通信指導と期末テストで成績が計算されます*3。期末試験は選択問題が多く、準備をすれば解ける問題がほとんどです。試験勉強に関しては、過去2回分の試験問題が学生用ポータルに公開されているので、そちらを利用しましょう。もし難しそうな科目があれば、一年前から過去問をチェックしておくと良いです。

数学系科目

上で広く浅くと書いたものの、数学II・Bで止まっている自分にとって、数学系の科目はかなり大変でした。既に説明済みの事柄や途中式が省かれていることも多々あり、本当の大学数学初心者はかなり迷います。自分は微分積分と線形代数を取りましたが、ほぼ全ての章の計算で詰まりました、、、。 もちろん、証明の内容をさらっと追うことはできますが、全ての行を理解しようとすると途端に辛くなります。実際、動画と教科書だけでは理解しきれない箇所が多かったため、私は予備校のノリで学ぶ「大学の数学・物理」とマセマを参考にしながら読み進めました。

yobinori.jp

色々と怖いことを書きましたが、期末テストは易しめの問題が多い印象です。過去問を何度か解いておけば、点数を取れるようになっていました。そのため、そこまで身構える必要はないと思います*4。

専門科目

情報コースでは、OSやネットワーク、データベースといった専門科目が用意されています。また、よくイメージされる科目以外にも、ユニバーサルデザインや情報デザイン、博物館情報学といった情報分野に関連する科目も各種提供されています。全体の感想で述べた通り、専門科目とは言いつつも、各分野の入門レベルを概観する講義が多いです。また、手を動かす機会が少ない点にも注意が必要です。例えば、OSやネットワークの講義を受講しましたが、概念をレポートにまとめたり、コードを実装したりする課題はあまりありません。そのため、これらの講義は概念の地図を作るために使用し、より詳細な内容については別のリソースを使って独学していく必要があります。

演習科目

いわゆるプログラミングをしたい場合は演習系科目を履修する必要があります。私はC言語演習と数理最適化法演習を受講しました。C言語演習は文法やポインタといったレベルから教えてくれるため、C言語初心者にとってありがたい講義でした。演習科目では実装やレポート課題を提出する必要がありますが、どれも数時間で終わるレベルです。難易度についても、少しでもコーディング経験があれば困る箇所は少ないと思います。

 特に面白かった科目

記号論理学

記号論理学は、命題論理や一階述語論理について学べる科目です。頭の中で考えるとこんがらがりそうな命題をタブロー法で機械的にチェックできる点は非常に感動しました。この科目を受講してから、Prologにパラドックスを与える遊びにハマった記憶があります。話を戻すと、論理学の基礎を学べるとても素敵な講義なので、少しでも興味があれば受講をお勧めします。

問題解決の数理&数理最適化演習

これらの講義は数理最適化の基礎を学べる科目です。最短ルートの計算やスケジューリングといった線形最適化問題について、イメージしやすい例を出しながら解説してくれます。初心者として入門するにあたって非常に良い講義でした。この二つの科目は概念と演習としてセットになっているため、個人的には同時に取ることをおすすめします。 数理最適化演習という字からは難しい印象を受けますが、かなり丁寧に説明してくれるため、躓くポイントは少ないと思います。

どんな人に向いているか

以下の点が当てはまる方には、教養学部の情報コースをお勧めできます。

  • 情報系の勉強を全くしたことがない
  • プログラミング経験も少ない
  • 固定で時間を取るのが難しい
  • 講義や試験といった、勉強を強制する仕組みが欲しい

反対に、以下の点を求める方は別のリソースを検討する、または併用することをお勧めします。

  • コーディング経験を積みたい
  • OSやコンパイラといった低レイヤの分野について重点的・発展的に学びたい

さいごに

この記事では、放送大学教養学部の情報コースに通った際の感想と振り返りを書いてきました。良い点と足りない点を色々と書きましたが、全体としては情報コースに通って良かったです。情報系科目の外観を掴み、興味のある分野や分からない分野を認識することができたのは、この情報コースで体系的な学びを得られたからこそだと考えています*5。もし社会人として学び直しを考えている方がいれば、ぜひ参考にしていただけると幸いです。

*1:いわゆるコンピュータサイエンス関連の科目

*2:3年次編入、かつCS以外の興味ある講義をいくつか取ったため、一部を抜粋して記載しています

*3:正確には、通信指導を出すと期末テストを受験できるようになります

*4:数学科目を取ったのが少し前なので、最近の期末テストの傾向がどうなっているかは要確認です。加えて、ラジオで提供されている一部科目は難しいという噂を聞きます。他の方もレビューを出されているため、そちらを参考にしてください。

*5:情報分野に関連する学位を持っているとギリギリ言えるようになった点も嬉しいです

Arm-poweredのLarger RunnerにAndroid SDKがインストールされていない

GitHubが管理している通常のUbuntu 24.04のイメージでは、Android SDKがインストールされています。

https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md

しかし、Arm-poweredのRunnerは話が違うらしく、Android SDKを始めとするいくつかのソフトウェアが入っていない、かつ管理者もGitHubではないようです。

https://github.com/actions/partner-runner-images/blob/main/images/arm-ubuntu-24-image.md#not-installed-software

github.com

Issueが立っているようなので、今後に期待です。

github.com

MockKExceptionが発生する場合、必ず同例外でテストが落ちると思っていた話

概要

モックライブラリの一つであるMockKを使用していたところ、relaxed周りで当初の認識と違う挙動があったため備忘録として書いています。

発生した問題

当初の理解

class Class1 {
  fun methodUnit(): Unit {}
  fun methodNotUnit(): Int { return 1 }
}

// 通常のMock
val mock1: Class1 = mockk()
mock1.methodUnit() // exception
mock1.methodNotUnit() // exception

// relaxUnitFun = trueのMock
val mock2: Class1 = mockk(relaxedUnitFun = true)
mock1.methodUnit() // exception
mock1.methodNotUnit() // exception

// relaxed = trueのMock
val mock3: Class1 =  mockk(relaxed = true)
mock1.methodUnit() 
mock1.methodNotUnit() 

上記のように、relaxをtrueにしていない箇所では即MockKExceptionが返却され、必ずテストが失敗すると思っていました。

失敗せずにテストが続行されるケース

class HogeViewModel(): ViewModel {
  val exceptionHandler = CoroutineExceptionHandler { _,_ -> }
  fun method(hoge: Hoge) {
     viewModelScope(exceptionHandler).launch { 
       hoge.call()
       // do something
     }
  }
}

// test file
fun test() = runTest {
  val hoge: Hoge = mockk()
  viewModel.method(hoge)

  // 他の処理やアサーション
}

上記のテストコードにおいて、Hogeクラスはrelaxedなモックオブジェクトではないため、callメソッドを呼んだタイミングでMockKExceptionによってテストが失敗しそうです。 しかし、同コードを実行すると、他の処理やアサーションに進んでしまいます。

そのため、当初はモックオブジェクト以外に原因があると思い込んでしまいました。

原因

原因はViewModelScopeとCoroutineExceptionHandlerです。 SuperVisorJobを持つViewModelScopeとCoroutineExceptionHandlerがあることによって、scope内で発生した例外は親Coroutineに伝播しません。 つまり、runTestで生成されたCoroutineには伝播せず、MockKExceptionが発生していることを認識しづらくなっています。

そもそもMockKはどうやって動いているのかの参考

zenn.dev

2024年の振り返り

日々のお仕事

 仕事は変わらずAndroidアプリ開発をやっていました。また、開発以外にもチームの課題解決的なことを頑張っていました。チームで動くことが増えてきて、全体としてどうやってコミュニケーションを進めるべきか、どうすれば成果を出せるのか日々悩んでいます。特に振り返りが難しいですね、、、。時間内に観点を整理する&チームとしての次の行動に繋げていくということの奥深さを痛感しています。

それ以外

会社の技術イベント

 ExceptionHandlerのLTをしました。もうすぐ一年経つことに驚きを隠せません。

CoroutineExceptionHandlerと仲良くなる / Grasping the basics of CoroutineExceptionHandler - Speaker Deck

Kotlin Fest 2024

 一般参加という形で参加する初めてのカンファレンスでした。色々なセッションを聴けて楽しかったです。特にCompiler Pluginの話が面白かったですね。

DroidKaigiのスタッフ

 英語を始めコミュニケーション関連の施策を色々と担当しました。無事に終わって本当に良かったです。

技術書典

 KSPの技術同人誌を書きました。執筆当時は日本語で書かれたKSP2の情報がほぼ存在していなかったため、KotlinのSlackや英語記事、各種ライブラリのPRを見ながら執筆を進めました。日本語の情報が少なくても何とかなるのだと、少しだけ自信が湧きました。

techbookfest.org

また、こちらの同人誌にも少しだけ参加しました。わいわい。

techbooster.booth.pm

勉強

 放送大学での勉強も変わらず続けています。2024年度は以下の科目を取りました。

  • コンピュータの動作と管理(’17)
  • Webのしくみと応用(’19)
  • コンピュータとソフトウェア(’18)
  • 続・C言語基礎演習(’23)
  • 数理最適化法演習(’20)
  • 問題解決の数理(’21)
  • 情報社会のユニバーサルデザイン(’19)
  • 博物館情報・メディア論(’18)
  • 映像コンテンツの制作技術(’20)

2025年度の卒業を目指して引き続き頑張ります。

旅行

 今年も色々な場所に旅行に行きました。

特にイギリスはずっと行きたいと思っていた場所だったので、街並みを見ただけでテンションが上がりました。ソンドハイムシアターでのレ・ミゼラブルは圧巻でした。

LiVE

 今年もLiSAのLiVEを観に行きました。

とても盛りだくさんな一年でした。来年のLiVEも楽しみです。

来年は?

 大学院に行きたいと考えているため、その準備として放送大学での勉強と英語学習に力を入れる予定です。

Google Docsで数式を書く時

数式の入れ方

画面上のタブから挿入→計算式で数式を入力できる。

特殊記号の入れ方

同じく画面上のタブから挿入→特殊文字で数式を入力できる。 探すのが難しい場合は、自分で書いて検索できる。

添字の入れ方

  • 通常のテキストであれば、表示形式→テキスト→下付き文字を選択する
  • 数式であれば、Spaceを押した後に数字を入力する

PRへのレビューをトリガーにしてActionを動かすとき

詰まったポイントのメモ

diffをPythonに渡す

メインの処理をPythonで書いていたため、値をPython側で扱えるようにする必要がありました。 いくつか方法はあると思いますが、今回はenvに設定しました。

しかし、コンテキストからdiff_hunkを取り出し、envに設定したところ、特殊文字に関するエラーが出てしまいました。

  • +やその他の記号が特殊な意味を持つため、渡せない
  • {hoge}の後の単語がコマンドとして認識される

前者はエスケープすれば良いですが、後者の楽な解決方法が思い浮かびませんでした。 そのため、 commentプロパティ全体をJSON形式でenvに設定する方法に変えています。

env:
  COMMENT: ${{ toJson(github.event.comment) }}

一行選択だと開始行が空になる

通常だとstart_lineとlilneのように開始と終了で対となる値が設定されていますが、一行選択の場合は終了の行にしか値が入りません。 レビュー時に選択した行のみを取り出したい時は、上記の事項を考慮する必要があります。

参考

Webhook のイベントとペイロード - GitHub Docs

2021年の自作PCメモ

概要

組立時の情報を残していなかったので、メモ

2021/10/01購入&組立

  • ケース P10 FLUX 9073円
  • 電源 Antec NeoEco750GOLD 9091円
  • GPU GeForce RTX3060 Ti 67701円
  • CPUクーラー SCMG5100 無限五 5037円
  • RAM XPG GAMMIX D20 DDR4 Memory 16GBx2 15800円
  • マザボ TUF GAMING B560-PLUS WIFI 16245円
  • CPU Intel i7-11700 35346円
  • DVD GSH24NSD5BLBLH 日立LGデータストレージ 1980円
  • HDD ST2000DM005 SEAGATE BARRACUDA 2TB 5346円
  • SSD MZV8V1TOBIT SAMSUMG SSD 980 MVMe M.2 11800円

メモ

ちょうどグラボが高騰してた。 WIFIが機能せず、USBに挿すタイプで代用した。