BlueVancouver- アラサー エンジニア転職@カナダ

現在アラサーの駆け出しエンジニア。[文系学部卒]にも関わらず26歳の時にSoftware Engineerになる事を決意。東京の外資系コンサル会社を26歳で退職し、カナダでのコンピュータサイエンスの大学に理転しました。(業務未経験) & (アラサーからの理転) & (いきなりカナダ) ですが、日本人としてもっと多様なキャリアがあってもいいと思い、情報共有しております。Youtube: https://www.youtube.com/channel/UCpa0EIrdETaR2gunXDEz-7A

年収も需要も時代が決める - 海外エンジニア

個人的意見と感想をただただ書いています。

私はトロントでソフトウェアエンジニアをしていて、今まで何人かの優秀なエンジニアを見てきました。PhDを終えて、エンジニアに新卒就職した人、PhDからポスドクを経てからエンジニアに転職した人、ポスドクを超えてAssociate Professorをやってからエンジニアに転職した人。どの方々も非常に優秀で自分では叶わないと思うような方々でした。

ただ、自分はそのようなScienceの分野では勝負しないので、今回はあくまでもその方々を見てきて思ったことを呟きます。

注)自分はPhDを持っているわけでもないので、これはただの独りごとです。

 

年収も需要も時代が決める。

自分は取れるものならPhDに挑戦したいとは思います。それは置いといて、とあるポスドク後の優秀な同僚のかたがいて、彼はとあるスタートアップでエンジニアをしています。とても優秀なのですが、バックグラウンドもマッチすることもあり、かなりニッチなscienceよりの分野でトップレベルのスキルを有しています。

当時留学中だった自分はどうやったら彼のようになれるか考えており、その過程でその同僚のタイトルになるといくらほど年収がもらえるかなんとなく調べていたところ、予想とは反対に市場の平均前後だったのです。彼はそのScienceの分野でエンジニアとしては本当にトップレベルの人材ということをなぜかマーケットが評価していないという数字が納得いきませんでした。

自分はそのそのスタートアップのインターン最終日に彼に、今後もこの分野の技術を続けるのか聞いたことがあります。彼はおそらくまだしばらくその分野でやっていくとおっしゃっており、それはそれで素晴らしいのですが、まだまだ時代がその新しい技術に追いついていないと感じました。その技術を続ける場合、かなりニッチなため他の企業でjob positngはほぼなく、州外または国外に行かないとおそらく転職はないかもしれないとLinkedInのjob postから思いました。

あくまでも自分の感想ですが、ここまで優秀でも、良くも悪くもニッチな領域だとなかなか他の企業からの需要が少なく、転職が厳しく、競合がいないということは平均的な年収で雇えてしまうのだろうと感じました。

価値観は人それぞれですが、シンプルにただただ年収をあげるのをを目指すのなら、ニッチに行きすぎず、程よく需要がある分野でそれなりに特化することが大事だと思います。なので、良くも悪くも、年収も転職需要も時代が決める。

年収に関してはどこに住むかも大きく影響しますが、それはまたどこかで書きたいと思います。

自分はこのことで今でも考えています。今はリアルタイムのデータ ストリーミング、Data Ops Software、データ基盤構築、インフラ、IaaC、Big Dataのoptimizationなど結構データにニッチに生きていますが、これが良いのかどうか、考えてbackendに行くかML Opsなどに行くかいつかはシフトしていかないといけないと感じています。

年収も需要も時代が決めるので、どうにかその大きな流れについていけるように2024は頑張っていきます。

2023年の学びと振り返り

トロントでは、そろそろ2024年を迎えようとしていますので、自分の成長記録や個人的な備忘録として残しておきます。また時間ができたら別のエントリーで落ち着いたらもっと細かいエントリーも書くつもりですが、まずは自分用に2023年まとめを書いておきます。

 

キャリア面

2022年にData Ops系のソフトウェアを書くエンジニアとして、OLAPデータ基盤のゼロからの構築やML系dataのインフラ管理を、トロントで働き出し、2023年は今の会社で2年目を迎えたので、業務的なキャッチアップを終え、ようやく技術的にも気持ち的にも、本来のインプットを出せてきた年でした。

技術的な学びで言えば、成長した分野としては

  • Data Ops Software開発: Serverless なEvent Driven Designの理解を深め、Scalableな設計とあり方を実践できた。
  • Sparkのbig data処理: パフォーマンスoptimizationや、Memoryのdebugginなど細かい実務レベルでレベルが一つ上がった。
  • Data Modelling:大きく変化するビジネスモデルに合わせるData Modelを作れた。
  • Data Integration: RedshiftやData Lake on S3で持っているデータをRedshift data share使ったり、S3 to S3でやり方を調べたり、学ぶことが多かった。Data Integrationは技術というよりかは、ビジネスコミュニケーションが全てな気もしますが、これはエンジニアとして生きていく上で避けれないので、慣れるしかないですね。
  • CI/CD: AWSでCDKをちゃんと学びだしてから、CI/CDはまだproto type作るレベルで、それ以上は仕事では進まなかったですが、Data系のpipelineのcodeでもIntegration Testをちゃんとやろうという意識を持って日々の業務に取り組み、S3にexpected resultをparquetでstoreしておいて、CDKで決めておいたそれぞれのbatch jobがprocessしたデータに対して、あらかじめ作っておいたexpected data outputとマッチするかテストするPoCを下半期はやっていました。

来年やりたいこと

  • Airflowは学んだけど、普段使っているGlue Workflowよりどこまで細かいレベルで管理できるか。次なる職場で試してみたい。
  • Snowflake: 実際AWSは便利なので、Snowflake使うチャンスなかったけど、これも次の会社で使ってみたい。
  • Real-time streaming: Data OpsやData pipeline、ML系のデータインフラ構築、管理に加え、よりbackendに近い、real-time data streamingの仕事を増やしていきたい。それがML domainならなお良い。Kappa vs Lambda architectureのLambdaの方を実際に書く機会があれば尚良い。
  • Kotlin: これは言語として既に来年使うことが決まっているので、ちゃんと深めていきたい。Real-time streamingをkotlinでやるときに業務でしかencounterしないことは絶対あるので、backend系のReal-time streamingスキルセットをもっと深めたいので、頑張ります。
  • ML Ops: いずれはML Opsに軸足をシフトしていく。2023年はML系のデータを扱ってきたものの、deploy、ML pipelineなどをしてきたわけではないので、個人プロジェクトなどでhands-onで経験を積んでいく

今年の学び

正直GPTが凄すぎて、ただコード書くだけの人材はいらないとよくわかった一年だった。これはもう避けれることではないので、じゃあ今後どういうキャリアに集中するかに集中していきたい。自分はマネジメントは全く興味ないので、対策としては以下になるかと思います。

シニアエンジニアはdefaultで目指しているので良いとして、あとGPTに奪われないキャリアとしては、

  • data architectや設計の知識を増やす。Fundamentals of Software Architectureの本があと半分残っているので、まずはちゃんと技術書読むところから始める。
  • ML Opsに寄せる: ML Opsの経験積んで、データ系のソフトウェアエンジニアの知見を生かすML Opsになるのも面白い。

 

 

仕事以外の話

2022年に妻と入籍して、2023年に無事に結婚式を日本であげることができました。これからトロントで夫婦生活も始まるので、貴重な時間を大切にしていきたいと思います。

 

人生はA-くらいでいいと思っています。ここ数年はコロナや不況で正直大変な2,3年でしたが、人生を100%としたら、自分の場合の幸せは次のように定義できます。

  • 25%は身体の健康
  • 25%はメンタルの健康
  • 25%は家族との時間
  • 25%は資産と仕事の収入

なので、人生における仕事はたった25%もありません。散々と技術の話してきましたが、残りの75%を大切に2024年も1日1日大事に、growth mindsetを持って成長していきます。

 

スタンフォードMBAのEssay:What matters most to you, and whyについて考えてみた話

スタンフォードMBAでは毎年Essayのお題でWhat matters most to you, and whyが出されます。私はMBAを取得したわけでも、今では行きたいわけでもありませんが、過去に外資コンサルで働いていた際に、MBA出願を目指し、このEssayについて考えたことがあり、これが原因というわけではありませんが、一つのきっかけとして、MBA、ついでにビジネス系のキャリアから一旦は技術職にshiftするきっかけになりました。

今ではこのスタンフォードGBSのお題にすごく感謝しています。

過去の話

外資コンサル時代、キャリアアップするにはMBAしかないと思い、アゴスや各スクールが東京に来る際には毎回ブースに足を運び、在校生の話を聞いていました。コンサルは3年できっちりやめて、MBAに行く予定だったので、2年目からこのEssayに週末に取り込んでいたと思います。

本題

What matters most to youですが、当時と今で少し考えは変わるかもしれませんが、今の自分を主観として誰からの評価も気にせず、本音で書くなら

1.健康

2.パートナーとの時間や関係

3.コントロールできる時間、または自分らしく居れる時間の割合

4.場所の自由(ビザや永住権など、働く場所に制限を受けない状態)

5.経済的自由

6.社会貢献(ボランティアという意味ではなく、仕事の延長で価値を提供し、貢献したい)

という感じです。

具体的に深掘りすると4,5,6は結局のところ自身のskillsetの向上と成長に言い換えられます。なぜなら、場所の自由を達成するには雇い主にvalueを提供する必要があり、その価値をわからせる必要があり、経済的自由も自身の価値提供のreturnとしての結果だからです。6についても自身の価値提供の大小で貢献度が決まります。

なので、Essayを書く過程で上の6点がここうなります。

1.健康

2.パートナーとの時間や関係

3.コントロールできる時間、または自分らしく居れる時間の割合

4.自身のskillsetの向上と成長

 

もう少し深掘りすると、3について、これは勤務時間を短くするわけではありません。例えば、もし仕事の内容が単純に趣味の延長だった場合、それは自分らしく居れる時間に含まれ、好きなことをしているので、自分の幸福に貢献します。

つまり、どれだけ他者貢献ができても、どれだけskillsetの向上に繋がっても、それが自分が勤務外でも進んでやりたいと思えないのであれば、その時間は義務となってしまいます。

詰まる所、MBA卒業後、Finance、VC、PrivateEquityの世界に行けたところで、それらの時間は自分が勤務外でも進んでやりたいと思えないので、What matters most to youに関係ないことがわかってしまいました。

 

今の技術職については、自分はやはり物作りが好きなので、この”What matters most to you”の自分の価値観に一番近いので、引き続き日々精進していきます。

他の言い方をすると、独立して何か物作りをすることもこの価値観に沿ってはいるので、いづれは独立も視野に入れておこうと考えさせられました。それにMBAが必要かどうかは答えは出ていません。Networkingという観点で見ればアリでしょうが、costがpayしないだろうというのが今の気持ち。Tech系のnetworkingは他にもあると思うので、一つのことに固執せず、自分の価値観に沿ってこれからも活動していくと思います。

当時はこのessayが書けず悩んでいましたが、今では書けなくて正解だったかもとも思います。

 

 

 

Redshiftで他システムと連携する方法 3つ【勉強メモ】

今までは個人ではGCPを良く使っていたのですが、AWS Redshiftについて、ここ最近学ぶことが多かったので、備忘録として残しておこうと思います。分かったことは、これという正解がない(複数の正解がある)ことがわかったということです。

 

そもそもRedshiftとは。そしてRDSとの違い

    • Redshiftは、大容量のデータを高速に解析・クエリすることが可能で、主に、大量の業務データから、複雑な分析やビジネスインテリジェンス(BI)に使用したい。
    • Redshiftは、カラムベースのストレージ方式を採用していて、高い圧縮率とクエリパフォーマンスを提供。また、複数のノードからなるクラスタ構成でスケーラブルな処理能力を持っている。

ここから本題

自分のAccountでRedshiftを持っているとする。他のAWS accountのRedshift(または別region)にデータを渡したい場合はどの選択肢があるか?

  1. COPYコマンドを使用する:
    • 自分のRedshift ->
      自分のs3 (相手のaccountにアクセス許す)->
      相手のaccountでs3からRedshiftにcopy
    • COPYコマンドを使用して、データを一括でエクスポートおよびインポートする。
    • ソースRedshiftクラスタからデータをエクスポートし、その出力データをS3に保存する。
    • ターゲットRedshiftクラスタCOPYコマンドを使用して、S3からデータをインポートします。
    • この方法では、データの一括転送が可能ですが、データの一貫性や遅延に関する考慮が必要です。
    • Pro: シンプルでわかりやすい。自分のaccount内でcopyコマンドだけを実行するGlueJobまたはLambdaを作って、毎日決まった時間にスケジューリング可能。
    • Con:リアルタイムではない。相手が何らかのtransform必要な場合は追加でRedshiftの中でストアドか、s3からRedshiftの間にGlue Jobなど挟む必要あり。自分のRedshiftのschemaに何らかの変更があった場合、相手にいちいち連携する必要がある。よくこれで問題をみてきた。相手と自分で複雑な処理が必要な時はあまり向いていない。
    • まとめると、この方法だけでもさらに複数のパターンがあって、便利。
    • 1-1:Redshift (A)->S3(A)->copyしてRedshift (B)、つまり物理データを持つ
    • 1-2:Redshift (A)->S3(A)->copyせずGlueCrawlerでS3(A)の新しいデータを認識する。その後、external tableとしてaccess Redshift (B) 、つまり物理データを持たない
    • 1-3:Redshift (A)->S3(A)->何らかのtransformation->S3(B)->copyしてRedshift (B)
  2. クロスアカウントアクセスを設定する:
    • ソースAWSアカウントとターゲットAWSアカウント間でクロスアカウントアクセスを設定します。
    • ソースRedshiftクラスタのデータを、ターゲットRedshiftクラスタに直接クエリやデータの転送を行うことができる。
    • 注意として、自分はexternal schema を作る必要がある。
    • 例)
      GRANT USAGE ON DATABASE sales_db TO Bob;

      CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE sales_db;

      GRANT USAGE ON SCHEMA sales_schema TO GROUP Analyst_group;

    • Pro:相手が直接自分のRedshiftにアクセスできるので、リアルタイムかつ自分のすることは少ない。特定のスキーマだけアクセスを設定することも可能。
    • Con: アクセス権限(Viewを作るなど)とセキュリティに注意する必要がある。
    • 公式ドキュメント: 

      https://docs.aws.amazon.com/redshift/latest/dg/manage-permissions.html

    • Demo: 

      https://www.youtube.com/watch?v=FW63-BehQg0

  3. AWS Data Pipelineを使う

     

    • ソースとなるRedshiftクラスタからのデータエクスポートする。

    • Data Pipelineの定義ファイルで、ソースとなるRedshiftデータベースを指定。
    • エクスポート活動(ExportActivity)を定義し、ソースデータベースからデータを抽出し、一時的なデータストア(例:S3バケット)にエクスポートします。

       

    • 目的のRedshiftクラスタへのデータインポート:

      インポート活動(ImportActivity)を定義し、データのターゲットとなるRedshiftデータベースを指定します。
    • インポート活動のパラメータで、エクスポートされたデータの場所(S3パス)を指定。
    • 必要に応じて、データのマッピングや変換を行うために、データ変換活動(DataTransformActivity)を定義することもできます。
    • スケジュールの設定:

      Data Pipelineの定義ファイルで、エクスポート活動とインポート活動を含むパイプラインを定義します。
    • タスクスケジュール(例:毎日、毎週、または特定の日時)を設定して、パイプラインを実行する頻度を指定。

方法1) のcopyコマンドの自動化と方法3)のdata pipelineはどっちがいいのか。

人によって意見が分かれるかもしれませんが、自分の意見として、data pipelineではRedsihft->S3->Redshift間でデータストラクチャーのマッピングを定義できたり、追加のtransformationを加えられるので、柔軟。ただ、これは方法1-3のように、間にGlueJobやlambdaなど自分で追加処理は追加できるので、あまり柔軟性の軸で判断する意味はないと感じる。

どちらのoptionもLogとmonitoringを有効化すればcloud watchでアラートも設定できますし、あまり差は感じません。

個人的には、あまり言葉を選ばずに言えば、結局のところ、コストと速さをbench markingしてみて、あとは自分が慣れているものを使えばいいのではと思う。

まとめ

Cloudのプラットフォーム(AWS, GCP, Azure)の世界はどんどん便利になっていて、とてもありがたいですし、開発者の皆様に感謝しています。

 

カナダでのCS留学の振り返りとその費用について

 

こんにちは、CS留学生の私が2年間のカナダ留学を終え、2022年の夏に無事卒業することができました。今回は、CS留学体験について振り返り、また留学費用についてもお伝えしたいと思います。

実際にCS留学を始めてみると、思っていた以上に大変でした。英語面ではなく、CSの概念や数学的な部分が特に難しく、週末もほとんど図書館で過ごしており、多くの思い出はきついものばかりでした。

卒業にあたって、自分は当初予定していたSecondd bachlorの2年よりも卒業は長くなりました、理由はフルタイムのインターンを丸々1年間行い、合計3年で卒業することになったからです。実際には学生期間は2年間だった為、学生の期間は変わりませんでした。ただ、この選択をすることで、カナダでエンジニアとして働けるようになったため、遅らせた甲斐があったと思っています。

Question:日本からオンラインでCSマスターを取るべきだったか?

日本からオンラインでアメリカの大学院に通うことも考えましたが、当時はトランプ大統領の時代であり、ビザの問題があったため、カナダ現地に来ることにしました。その結果、face to faceで学ぶことができ、CSの授業、そして就活にも集中できました。また、現地にいることでインターンもでき、いいメンターに出会えたため、やってみてよかったと思っています。

Question: CSの授業と知識はエンジニアになる上で必要だったのか?
これは個人差が出るところだと思いますが、個人的にはYesです。一つの理由としては、学位を取らなかった自分と取った後の自分を比べることができないから、結局取ってみるしかないというのが結論です。MBAがビジネスマンに必要なのか?という問いに似てるなと思います。

Question: 学べてよかったことは?
一応学びの内容も振り返るとします。最も大変だったクラスはOperating Systemになります。これはどの教授が教えたとしても難しくなると思います。内容としては、Linuxの簡易版のターミナルをCで作ったり、実際のOSが行なっているConcurrencyというのをスクラッチで、semaphoreやconditional variableというのを用いて行います。プログラミング課題は教授の授業だけでは完了できない仕組みになっていて、自分は有名な本、little book of semaphoreを見つけて、うまく実装することができました。この本の中に課題のヒントが書いていて、読みながら、ハリーポッターの謎のプリンスで出てくる、ハリーが古本に書かれいるコメントを見て課題を完成させるシーンを思い出しました。しんどかったですが、もし今後エンジニアとしてOSやコンテナ周りのビルドをRustでかけるなら、挑戦したいと思えたので、すごいいい経験になりました。こういう側から見たら遠回りな経験のお陰で進むキャリアを決めるいい経験に振り返るとなっているかもですね。


Question:結局いくら費用かかったのか?

最後に留学費用についてお話しします。学費だけで2年間で約600万円かかりました。ただし、インターンをしていたため、2年目の学費と生活費はほぼインターンの給与でまかなえました。留学費用は高いですが、自分自身のスキルアップに繋がったことを考えると、費用対効果は高かったと思います。

以上が私のCS留学2年間の振り返りと費用についてです。留学を考えている方にとって、何か参考になる情報があったら幸いです。
今後はカナダでエンジニアとして目の前の一つ一つのタスクにひたすら集中して頑張ります。現在の世界経済の影響が不安で、将来のことは何もわかりませんが、存在しないものに怯えても仕方ないので、マインドフルネスを意識して日々コードと真剣に向き合っていきます。

 

 

文系卒の社会人がComputer Scienceの大学/院に戻った際に大変な数学の壁をどう乗り越えるか。

今回のエントリーでは自分がサラリーマン生活を経てから理系の大学に戻った際に感じた数学の壁とどういう対策をしたかシェアしていきたいと思います。

最近Twitterを使ってなかったので、完全に乗り遅れましたが、誰かがエンジニア数学不要論を展開しているらしいです。自分は賛成でも否定でもなく、単純に数学にブランクのある社会人がどう数学の壁を乗り越えるかにFocusしていこうと思います。

タイトルにある通り社会人向けと書いてる理由は数学に対してブランクがあるからです。自分が大変だったこととどういう戦略をとったかをシェアしていきたいと思います。 

 

1.CSに必要な数学とは

文系卒の社会人がコンピュータサイエンスを学ぶにあたって、まずぶち当たる壁が数学になります。多くのコンピュータサイエンスは実装の前に理論を学ぶ必要があり、なぜその理論が良いのか証明したり、証明を理解する必要があるため、 コンピュータサイエンスは理系の中でも特に数学が必要とされます。CSによく登場する数学の分野としては主に

離散数学(Discrete Mathematics、Combinatorics、Graph Theory)

解析 (Real Analysis、Numerical Analysis)

線形計画法非線形計画法(Linear Programing、Nonlinear Programming)

確率論 (Probability、Randomized Algorithms)

線形代数(Linear Algebra)

 

などの分野です。

例えば、アルゴリズム離散数学を使ってグラフ問題やカウンティング組み合わせ問題を解く必要があります。

解析に関してはアルゴリズムがどれくらい速いかを計算する必要があり解析の知識が必要となります。

線形計画法非線形計画法(Linear Programing、Nonlinear Programming)は機械学習の分野でよく登場する分野になります。

確率論は機械学習ではもちろんですがアルゴリズムの世界でもRandomizedアルゴリズムと言う、ランダムに値を割り当てることで通常のアルゴリズムよりも早く問題を解決する特定のアルゴリズムがあります。また暗号化の分野でも確率は大事になるため確率論と computer Science は切っても切れない関係にあります。

最後に線形代数ですが線形代数は数学の基礎といってもいいほど万物に使われる根幹となるため 、深く理解する必要があります。

 

2.数学のギャップがある社会人の壁

では何が問題かというといきなりこれらの数学をいきなり学び出しても前提知識が抜けていたり、ブランクがあるため、授業に追いつくことがかなり難しいです。そのため、卒業に必要な単位を取る以前にそもそもこれらを前提とする知識を自分で勉強する必要がある、またはPrerequisite(そのクラスを取るために必要な一個レベルを下げた) クラスを取る必要があります。前提知識を自分で勉強する場合も、クラスを取って勉強する場合もそれなりの時間をかける必要があります。

前提知識と言うと例えば微分積分、数列、Trigonometric(sin/cos/tanとその関係性)の復習と数学1 Aで 出るような場合の数の計算に出てくる定理と、できれば証明の仕方も頭に入れとく必要があります。

自分はカナダに来る前に約半年ほどかけてこれらの前提知識を自分で勉強しました。

別のエントリで社会人が学業に戻る際の数学のギャップについても語っているのでこちらを参照ください。

https://bluevancouver.hatenablog.com/entry/study-blank

 

また、単純に履修を終えるのに時間がかかるという問題ではなく、単純に難しいためそもそも単位を取ることが難しいです。例えば線形計画法非線形計画法などは数学部としてオファーされるため数学メジャーの学生と同じ土俵で勝負することになります。そのため平均点をとることさえも努力が必要となります。もちろん数学のレベルは自分が勉強したいコンピュータサイエンスの分野にもよるのですが、昨今流行りの機械学習ディープラーニングを 扱うエンジニアになりたいのであれば多くの時間を数学に時間を使うことになります。

 

3.ここからは対策編です。 

対策としては数学の教科書は1行読むのにとても時間がかかるため出来るだけ動画で学習することをまずお勧めします。何も準備せずに授業に臨んだり、初見で教科書を読む際は理解度が30%程度であるため YouTube やUdemyを使ってわかりやすい説明を聞いてから教科書を読んだり授業に臨むと理解度が上がるようになりました。

 

参考までにリストを載せておきます 

 

離散数学: ほとんどのトピックは彼の動画でカバーできます。特に問題を一緒に解ける動画が参考になります。https://www.youtube.com/c/Trevtutor

 

Real Analysis: 難しいproofをわかりやすく説明してくれています。 https://youtu.be/h9Ez1qdsqps

 

Numerical Analysis: Jeffrey Chasnovのyoutube動画は、数学をエンジニア向けに説明してくれているので、見やすいです。https://youtu.be/d3sZa3T2TJw

 

確率論: 英語圏の学生はみんな見ているチャンネルです。教授よりもわかりやすいことで有名。機械学習に使われるテクニックも一緒に学ぶことができます。https://www.youtube.com/c/joshstarmer

 

Linear Algebra: 数あるyoutuberのなかで、最もわかりやすく、Linear Algebraの本質をアニメーションで説明してくれているチャンネルです。 https://youtu.be/fNk_zzaMoSs

 

また、数学は英語で勉強することを個人的には おすすめします。日本語で勉強した名前や定義をまた英語で再度頭に入れることは二度手間ですし、数学で使う英語はパターンがあって、慣れたら逆に英語で勉強した方がわかりやすくなります。

2021 Fall semesterの学業での学び

2021年9月からは学業に戻り、以下のコースを受講しました。

1.Computer Network

2.Artificial Intelligence

3.Numerical Analysis

4.Intermediate Ordinary Differential Equation

5.Mathematical Modelling

 

この頃から、学ぶ内容も難しくなってきて、5つ取るのが結構きつく感じました。

それぞれの学びを自分用に残しておこうと思います。

1.Computer Network

ネットワークの基礎を学ぶコースで、ネットワークが構成する5つのレイヤー(application, transportation, network, link, physical)をトップダウンでapplicationレイヤーから学んでいくスタイルでした。コーディング課題が他のコースと比べて重く、pythonを使って、既存のlibraryを使わずに、一からTCPのようなreliableなデータのtransferをclientとserver両方実装するような内容でした。そのreliable data transferの際に、serverが複数のclientからのrequestに対応できるように、concurrentに対応することがまた難しかったです。

ピーク時は夜12時くらいまで実装とテストを繰り返しました。一つ学んだこととしては、実装して初めて気づくことや、考えさせられることが多かったです。

教科書からコンセプトを学んでも実際にコードを書くと、ここはどうなんだろう、ということがあって、深く理解するには、自分はコードで作ってみるのが一番だと感じました。

ただ、学んでいる内容自体は筋が通っていて、数学もそこまで複雑なものは出てこなかったので、コンセプトはすっと頭に入ってきました。

 

2.Artificial Intelligence

AIのイントロなので、マスターでやるような深い内容ではなかったですが、こんなことを学びました。hidden markov modelというモデルでは、目に見えるobserved dataと、目に見えない、hidden variableがあります。例えば、ある人の機嫌や顔が見えて(observed data)、天気が見えていない場合(hidden variables)などはobserveされたdataから、最も近い、今日や昨日の天気はなんだったのかなどと予測します。

Machine learningでは例えば、naive bayes classifierや、bayesian networkという手法を使って、Twitterなど大量のテキストデータから、特定の単語をカウントし、そのテキストの集合が例えばpositiveな発言か、negativeな発言か、あらかじめ正解(=ground truth)がある中で、次に誰かが発言したTweetがpositiveなものなのか、negativeなものなのかを識別するようなmodelを組んだりしました。

自分はAIだけをキャリアの専門としていく気はありませんが、ある程度自分でAIを理解して、実装されたcodeが読めないと仕事でモデルを組むサイエンティストの話についていけなくなると思ったので受講しました。内容自体は本当に楽しかったので、将来的にAI/ML & System・Infra のような仕事も見据えて学んでいこうと思います。

 

3.Numerical Analysis

ここからは数学のお話。自分は数学とCSのダブルで専攻しているため、数学も専門として学ぶ必要があります。Numerical Analysis/Methodsはのっぺりしていて、様々な手法で、computerが使えない時に、複雑なfunctionを含む微分方程式や、積分をどう手で近しい値を出すかというのがゴールです。

逆に言えば、ほとんどの人がこのクラスで学ぶmethod達は初見のため、そこまで数学のbackgroundがなくても、頑張ればある程度のレベルまでは理解することができました。ただ、この分野はこの分野で深いので、極めるのは大変だなと思いました。

 

4.Intermediate Ordinary Differential Equation

微分方程式の2つ目のコースです。既にイントロの微分方程式は終えていて、数学/物理学メジャーの学生だけが取るコースでした。この分野の個人的に好きなところは、解があることで、微分方程式の問題に対して、自分のアプローチが正しかったのか間違いなのかTrue/Falseで確認することができて、エンジニアにとっては戦いやすい分野だと感じました。また、次に紹介する、モデリングのクラスも微分方程式を使って、物事の増減を式にするので、他の分野で使われる幅の広さから、受講して良かったと思いました。

内容としては、前半はSeries(数列)を使って、微分方程式を解いたり、

後半では例えば、Predator Preyというモデル(肉食動物と草食動物の人口推移)について、人口ピラミッドが崩れないのはなぜかというのを数学的に分析したりしました。

あとは、そのようなsustainable/stableな解が存在するかどうかを証明するのにポアンカレ・ベンディクソンという定理をつかって証明したり。

最終的にはカオスシステムにおけるbifurcationという分野を学びました。Predator Preyとは異なり、少し初動が違うだけでstableになったり、ならなかったりするような状態をカオスといい、その分岐点はどこにあるのかを学ぶのがbifurcationという概念です。

これはこれで生物学やエネルギーの分野でかなり使われるので、bio-informaticに興味が出るかはわかりませんが、学んで良かったと思います。

 

5.Mathematical Modelling

最後がモデリングのクラスで、微分方程式との違いは、微分方程式は既に問題となるモデルと式が与えられた上で、どういうテクニックを使って、その解を解くか(解けるか)に重点を置いているのに対し、モデリングのクラスは、そのような事象をどう式に落とし込むかを学びます。よって、モデリングで問題を作り、微分方程式で解を求めるような流れになります(大まかですが)。

面白かった内容としては、昨今のコロナの感染数がどう増えていくのか、なぜ指数関数的に増えるのか、をモデルして初めて理解しました。最も有名な基本的なモデルとしてはSIRモデルという、Susceptible(感染する可能性のある人)、Infected(感染した人)、Recovered(感染して、元に戻った人)に分け、そうするとSusceptibleとInfectedが触れることでInfectedが増えて、その微分方程式の解が指数関数で表現できるため、とても早く、感染者が増えることが理解できました。

 

まとめ

CSと並行して数学を専攻することがどこまで自分のソフトウェアエンジニア力に貢献しているかはわかりませんが、将来的に数学を必要とする分野(AI/Securityなど)で働く時に学んでいて良かったなと思えれば嬉しいです。気持ちとしては本業のソフトウェアエンジニアリングをもっと極めていきたいので、頑張っていこうと思います。