【Coursera】Programming with Google Go Specialization を修了しました
はじめに
こんにちは.ぬまっちです.ちょっと前の話になりますが,Coursera の Programming with Google Go Specialization を修了し,Certificate を取得しました.
この記事ではコースの概要に加え,Programming with Google Go Specialization を受講した理由,受講して勉強になったことについてまとめようと思います.
コースの概要
そもそも Coursera とは
ご存知でない方もいらっしゃるかもしれないので,簡単に Coursera について説明しておきます.
Coursera は,スタンフォード大学・アリゾナ州立大学等の有名大学の授業や,Google や IBM といった有名企業が提供しているコースをオンラインで受講できる学習プラットフォームです.MOOC のひとつであり,似たようなプラットフォームとしては edx や Udemy が存在します.
分野としては,ビジネス (MBA 系) から言語学習,コンピュータサイエンス,ディープラーニングまで幅広く提供されています.課金すればコース内で課題やクイズに取り組むこともでき,コース修了時に証明書が発行されます.この辺の証明書は LinkedIn に載せることができます.
ちなみに,無料コースだと課題やクイズの制限があったり,修了証明書が発行されなかったりして寂しいので,筆者は月額課金制の Coursera Plus に登録しています.月額課金でなく,コース毎の課金もできるので,この辺の課金プランの選択は何をどのくらいの期間で勉強したいかによるかなーと思います.コースにもよりますが,講座を聞くだけなら課金不要な場合もあります.
また,ただのオンラインコースだけでなく,完全オンラインで取得できる学士号や修士号のプログラムも複数の大学から提供されているため,社会人修士を目指したことのある方であれば聞いたことがあるかもしれません.
コースは基本的に英語なので,英語のリスニングがある程度できる方であれば十分に楽しめると思います.大体のコースで英語字幕はつけられるので,リスニングは苦手でも読むならできる,という方にもおすすめです.
Programming with Google Go Specialization とは
次に,今回私が履修した Programming with Google Go Specialization について説明します.こちらの Specialization は,カリフォルニア大学アーバイン校が提供している Go 言語の専門講座です.
Specialization (専門講座) とは複数コースのセットであり,ある専門分野に関する知識を身につけたい場合に役立ちます.例えば ディープラーニング専門講座 では,ディープラーニングに関する 5 つの個別コースを専門講座の指定コースとしており,それら全てを修了したら専門講座の修了証明書を取得できます.勿論,個々のコースに関する証明書もコース修了時に取得できます.
- Neural Networks and Deep Learning
- Improving Deep Neural Networks: Hyperparameter Tuning, Regularization and Optimization
- Structuring Machine Learning Projects
- Convolutional Neural Networks
- Sequence Models
私が今回履修した Programming with Google Go 専門講座では,下記 3 コースが指定されていました.
基本的な文法の説明から始まり,関数やオブジェクト指向プログラミングを Go でどのように実装するかの説明が入り,最後に並行処理の概念整理+標準ライブラリを用いた並行処理の実装へと進んでいきます.
期間は 3 ヶ月程度とされていますが,筆者は 1 ヶ月くらいで全 3 コースを修了できました.一番時間がかかるのが演習なので,もともと他言語でバリバリコードを書いていた人であればかなり時間を短縮して修了できると思います.
誰が受けるべきか
これが割と明確で,専門講座 1 つ目である Getting Started with Go のコース説明にしっかり書いてあります.
Learn the basics of Go, an open source programming language originally developed by a team at Google and enhanced by many contributors from the open source community.
This course is designed for individuals with previous programming experience using such languages as C, Python, or Java, and covers the fundamental elements of Go.
Topics include data types, protocols, formats, and writing code that incorporates RFCs and JSON.
Most importantly, you’ll have a chance to practice writing Go programs and receive feedback from your peers.
Upon completing this course, you'll be able to implement simple Go programs, which will prepare you for subsequent study at a more advanced level.
要するに,他言語の利用経験があり,次は Go を勉強してみたいと思っている方にとてもおすすめということです.コース内でも,「Java や Python ならこう」「Go ではこう」のような説明が入ることが多く,他言語を利用した経験がある方であればより理解しやすい構成となっています.
また,「他言語経験者を対象としている」と明言しているだけあり,型や分岐等の基本的事項の説明は程々で,ポインタやメモリを交えたプログラム実行の振る舞いについてもある程度踏み込んだ説明をしてくれます.ので,単純な入門書・入門コースと比較すると少し難易度は上がります.
逆に,誰が受けるべきでないかについてです.これはあくまで私の個人的な意見ですが,下記場合にはこの専門講座を受講するのはおすすめしません.
- 完全なプログラミング未経験者
- 既に Go に精通している方
- すぐに Go でアプリ開発したい方
まずプログラミング未経験者の場合ですが,未経験者でいきなりこのコースの内容を理解するのはかなり難しいです.入門書でカバーされているような基本事項の説明にそこまで時間が割かれないからです.そもそもコースで提示されているターゲットからも外れているので,もしどうしても受講したい場合には別途 Go の入門書や他言語 (C や Java) を学習してから戻ってくるとよいのかなと思います.
既に Go に精通されている方については,このコースによって得られるものがないと思いますので受講は不要かと思います.Go は使っているけどポインタやメモリとかをあまり理解せずに使っている,みたいな方の場合には得られるものはあると思います.
最後にすぐに Go でアプリ開発をしたい方についてです.この専門講座はあくまで他言語経験者が Go を習得することを目的としたものであるため,フレームワークの説明やアプリ開発は扱われません.
課題でアルゴリズムやプログラムを書くことはありますが,Java でいう Spring や,Python でいう Django/Flask 等のフレームワークを学んだり,実践的なアプリケーション開発手法を説明したりはしません.すぐにアプリを開発したい場合,利用したいフレームワークのチュートリアルサイト等で勉強した方がよいかと思います.
なぜ専門講座を受講したのか
筆者がこの専門講座を受講した理由についてです.
受講前の時点で Java の開発経験が 3 年程度ありました.が,転職によってメインの開発言語が Go になりました.個人的に Go を勉強した経験はありましたが,せっかくアカデミックなコースが Coursera にあるし,一度体系的に学習しておくかーという気持ちで受講しました.
Go に関しては,一応受講前に A Tour of Go は一通りやっていて,基本的な文法は理解した状態でした.
また,Go を学習する上で特に難しそうなポインタに関しても,受講前に「ポインタ完全制覇」を読んだことがあり,それなりにポインタとメモリの関係はイメージできていました.
ので,受講前の筆者の状態は以下のような感じでした.
- 静的型付け言語 (主に Java) の経験はそれなりにある
- 仕事で使う言語が Java から Go に変わった
- Go は個人で使ったことがあり,一通りの文法は知っている
- 何となくポインタを理解している
専門講座を受講した感想
正直なところ,インストラクタの方の説明がかなり明快で,コース全体がとても面白かったです.修了時には,Go を体系的に学ぶことができた達成感と満足感がありました.その中でも特に印象的で勉強になった内容について簡単にシェアしたいと思います.
低レイヤを含めた説明
ただ文法や言語機能について説明するだけに留まらず,理解する上で分かりやすくなるものであれば低レイヤの知識を用いた説明も入ります.
例えば,ある処理を実行中にメモリ上のデータがどのように遷移していくのかといった説明や,あるコードで 競合状態 (Race Condition) が発生する理由をコンパイル+機械語と絡めて説明してくれたりします.
よく入門書で見かけるように適当な具体例で誤魔化すのではなく,低レイヤの前提から何故そうなるのかをしっかりと解説してくれるため,とても納得感がありました.
また,ちょうど情報系の大学で学ぶような基礎知識 (OS やコンピュータ・アーキテクチャ等) を独学で学んでいる時期だったため,今まで学んだ知識が Go の勉強中にホロホロと出てきてとても感動したのを覚えています.
筆者は情報系の出身ではないので,大学でこういったコンピュータ・サイエンス的な内容を絡めたプログラミング講義を受けたことがありません.また,会社に入って開発するようになってからも,この辺のレイヤの知識について指導をしてくださる方はいませんでした.
教科書こそ大学で利用されるものを使って勉強していましたが,完全に独学でした.独学ということは,学習した知識が点在したまま,線で繋がりにくい状態ということです.
プログラムの動作を低レイヤの知識を使って説明してくれるというのは,今まで独学してきた情報系分野の知識の点と点を結んでくれるようなもので,既存の知識を整理する上でとても役立ちました.
これがコースを通して一番嬉しいポイントでした.
並行処理の概念説明
こちらは専門講座 3 つ目のコース Concurrency in Go で扱われる内容です.コース前半を全て利用して,何故並行処理が必要なのかと,並行処理の基本概念をとても丁寧に説明してくれます.
具体的には,並行 (Concurrent) と並列 (Parallel) の違いや,CPU・プロセス・スレッド・Goroutine の関係等についてとてもわかりやすく説明してくれます.Goroutine やチャネルを用いた,Go での並行処理の実装方法に入るのはコースの後半からとなります.
これを良い点と捉えるか悪い点と捉えるかは受講者の知識レベルや経験によりそうですが,筆者の場合は並行処理についてあやふやだった知識を整理することができたため嬉しいことでした.
Go でのオブジェクト指向プログラミング
カプセル化,継承,ポリモフィズムを軸としたオブジェクト指向プログラミングは,今日のシステム開発において避けて通ることはできない概念だと思います.Java や Python,C++等では,クラスを用いてオブジェクト指向プログラミングを行います.
一方,Go ではクラスは存在せず,構造体 (struct) とインタフェースのみサポートされています.そして,継承もサポートされていません.
では Go ではオブジェクト指向プログラミングができないのかというと,決してそういうわけではないことが専門講座では説明されています.
専門講座の 2 番目のコース Functions, Methods, and Interfaces in Go では,コース後半が全て Go でのオブジェクト指向プログラミングに割かれています.オブジェクト指向プログラミングの概念説明から始まり,カプセル化や Go でのクラスの実現方法の説明,interface によるポリモフィズムの実現方法へと進んでいきます.
また,コース内では触れられませんが,Go ではコンポジションによって擬似的に継承を実現できます.Java の extends
のように明確な文法があるわけではありませんが,匿名フィールドとして埋め込みを行うことで,擬似的な継承が可能です.具体例は以下のサイトをご参照ください.
課題演習
コースでは,単元毎に課題が準備されています.例えば,バブルソートの実装や競合状態を起こすコードの実装等です.難易度は結構まちまちで,5 分程度で実装できるものから,1 時間以上かかるものまでありました.とても大学の課題という感じですね.
とはいえ演習問題が存在するのはとてもありがたいことで,演習問題を全て解き終わった後は結構手は動くようになります.
また,提出した課題は別の受講者が採点してくれます.かつ,自分も他の受講者の提出課題を毎回最低 1 件は採点しなければなりません.コードレビュー的な観点で採点をすると結構大変ですが (実体験),採点基準はコース側で提示してくれているので,それに従って採点しましょう.
あくまで個人的な所感ですが,他言語経験者を対象としているコースというだけあり,一定水準以上のコードしか見かけませんでした.
課題の中では,並行処理の最終課題である「食事する哲学者の問題」が特に面白かったです.恐らく情報系出身の方や並行処理を学習したことがある方には馴染み深い有名な問題かと思います.
デッドロックやスタベーションが起きないように Go で実装するのですが,実際に動かしてみると「あれ?あれ?」みたいなことが結構起きて楽しかったです.一番時間はかかりましたが,最後まで調べずに実装できたので達成感もありました.
おわりに
以上,Coursera の Programming with Google Go Specialization を修了した感想でした.他言語経験者で Go を勉強してみたい方や,低レイヤを交えた Go の動作説明に興味がある方には特におすすめのコースなので,是非受講してみてください.
ちなみに筆者は,この専門講座と並行して以下の「プログラミング言語 Go」も読み進めていました.こちらの本も Go の言語機能について網羅的に整理しています.ただ,Programming with Google Go と同様に入門書ではないので,完全にプログラミング未経験者の方の場合は,他のサイトや入門書等で勉強してから読むことを推奨します.
Discussion