2024年4月末から生徒として参加している、コンピューターサイエンスの勉強会、
CSZAPでの活動内容をご紹介させていただきます。
はじめに
CSZAPは、一般社団法人ソフトウェアエンジニアリング協会※1の講師の方が主催している勉強会です。
CSZAPは、数か月間の短期間で、コンピュータサイエンスの基礎のうち、実務でよく出会う部分や実学的なところを程よく学ぶ会となっています。
また、実務に出会う際に溺れないようにすること、将来的にTech Lead的なポジションになるための素養を身に着けることを目的としています。
(現在CS系の学部にいる人は、かなり重なる部分もあるため、学部の勉強を優先することが推奨されています。)
※ソフトウェアエンジニアリング協会について
①協会の理念
日本のソフトウェアエンジニア育成は数と質の観点で不十分です。日本の大学でコンピュータサイエンスを学べる学部の定員数は十分とは言えず、真にコンピュータサイエンスを学べる学部の数も全体から見ると限られています。
日本のソフトウェアエンジニアには、もっと広く世界と戦うことができる一流のソフトウェアエンジニアリングを学べる環境を積極的に求めてほしいと考えています。海外での経験が増えるほど、日本の技術力も向上するでしょう。一流のソフトウェアエンジニアを多数輩出することで、日本の社会や組織を変革したいと考えています。
今のソフトウェアエンジニアリング育成を変えたい志のあるものがあつまり、ソフトウェアエンジニアの育成、就職支援などを非営利の活動でおこなって参りました。このたび一般社団法人を設立することで、この活動をさらに広く実現したいと考えています。
②ソフトウェアエンジニアリング協会でコーディングを学んでいる生徒の記事
※こちらのコーディングの練習は、CSZAPとは別のカリキュラムになっています。
この記事の目的
- CSZAPでの取り組みの内容を周知すること
- 今後、CSZAPに参加する人への個人的なTIPSのシェア
- 自身の活動記録
学習内容
全体観
2024/4~12月までで合計400h弱をかけて、以下の単元を勉強しました。
勉強時間の内訳としては、予習:勉強会 = 1~2:1程度となっており、
コードリーディングと制作については、現在取り組み中・今後取り組み予定のステータスになっています。
このカリキュラムは、今後変更する可能性があります。
(楽に学べるようにする・必須と選択を切り分ける・応用を少し足すなど)
単元 | 教材 | 勉強時間 |
---|---|---|
①アルゴリズムとデータ構造 | CS2023 final report BOK | 40h |
①’形式言語・計算理論 | 講師解説 | 10h |
②オペレーティングシステム | オペレーティングシステム (オーム社) |
50h |
③ネットワーク | マスタリングTCP/IP ソケットプログラミング |
60h |
④システムデザイン | システム設計の技術試験 | 50h |
⑤情報の全体感 | 高校の情報Ⅰ・Ⅱの教科書 (教員用資料) |
20h |
⑥プログラミング言語の特徴 |
講師解説 | 4h |
⑦コンピュータアーキテクチャ | パタへネ上・下 | 140h |
⑧コードリーディング | gRPCのソースコードを読み レポートにまとめる |
現在取組中 |
⑨制作 | 今後取組可能性あり | 今後取組可能性あり |
①アルゴリズムとデータ構造/①’形式言語・計算理論
CS 2023 final reportのBody of Knowledgeの中のAlgorithmic Foundationsに出てくる単語について、調べて理解するといった内容です。
ALの内容は、以下となっており、そのうちComputational Models and Formal Languagesは講師の方からの解説を中心に学習を行いました。
- Algorithmic Foundations (AL)
- Foundational Data Structures and Algorithms
- Algorithmic Strategies
- Complexity
- Computational Models and Formal Languages
自分が参考にしたもの
このサイトは、CS 2023 final reportのBody of Knowledgeに準拠しているような、
構成になっているので、知りたいことが直接知れることが多かったです。
特に、計算量や問題をどのように変形してアルゴリズムを適用して解くかなどがわかりやすかったです。
その他ソフトウェアエンジニアリング協会のチャット内にある書籍の情報を基に、
自分にあった本で学習を進めました。
②オペレーティングシステム
オペレーティングシステムでは、オーム社のオペレーティングシステムを輪読する形で進められました。
OSの役割・ハードウェアの全体感・プロセス・メモリ管理・ファイルシステム・I/O制御・仮想化などを学びました。
本内の概念の図だけだと、あまり実感がわかなかったので、
適宜ハードウェアの実物を検索することで、イメージを補いがら読みました。
排他制御・プロセスのスケジューリングに関する詳細トピックは、
はじめて出会ったので勉強になりました。
③ネットワーク
ネットワークでは、マスタリングTCP/IPを輪読する形で進められました。
OSIの参照モデルに沿いながら、ネットワークの全体感を学びました。
今まで読み飛ばしていた、NAT越えの挙動を細かく解説頂いて勉強になりました。
CSZAPの別チームでは、マスタリングTCP/IPの代わりにこちらを使っているそうです。
マスタリングTCP/IPと比べてコンパクトで読みやすいようです。
また、OS兼ネットワークの復習を兼ねて、ソケットプログラミングを実施しました。
以下がその課題になります。
クライアントとサーバーの C 言語のプログラムを書く。
socket API を用いる。エラー対応を必ず行う。
サーバーは、初めの(TCP)接続には1, 次の接続には2, .... と重複せずに数字を返す。
サーバー・クライアントは共に1 process で、複数スレッドを用いて、できる限り多くのリクエストを処理できる形で実装する。使うシステムコール
socket, bind, listen, accept, write, read, close
pthread_create, etc..
④システムデザイン
システムデザインでは、システム設計の面接試験を輪読する形で進められました。
前半で、Webサーバー・データベース・ロードバランサ・CDN・キャッシュなどの主要な構成要素や分散処理/冗長化などの基本的な情報を学び、
後半で、YouTube・ニュースフィードシステム・チャットシステムなどのシステムデザインを面接で出る程度の範囲で学びました。
書籍内で対話的に要件を定めていく様子も参考になりました。
(CSZAP講師の方曰く、自分が面接官だったら志願者自身に要件をもっと考えてもらうとのことでした。)
⑤CSの全体感
情報の教科書の指導員用資料をもとに、
アルゴリズム・コンピューターアーキテクチャ・ネットワーク・データサイエンスなどを広く学びました。
データサイエンスでは、資料には載っていませんが、多重共線性には気を付けようなどの話も出ておりました。
一番最初にこれを学ぶのも良さそうです。
⑥プログラミング言語の特徴
Javascript・XML・typescript・C++・Java・React・SQLの特徴や気を付ける点をレクチャーしていただきました。
⑦コンピュータアーキテクチャ
コンピューターアーキテクチャに関する本で、OS・CPU・メモリの詳細な挙動が記載されています。
自分は特に4章のプロセッサの挙動・パイプライン化・命令の並列化などが図がわかりやくて、イメージできるようになりました。
取り組み前後の自身の変化
取組前
- アルゴリズムとデータ構造は、値・文字列・配列・set・関数・構造体ぐらいしか知らなかった。
- ネットワークは、通信系の会社にいたので、なんとなくわかっていた。
- コンピュータアーキテクチャは、OS・プロセッサ・メモリのそれぞれ役割は聞いたことがあったが、各要素の動作や実態のイメージがついていなかった。
現在
- 各単元の主要トピックは、本の図を横におけば最低限説明できる。
- 物量があったり、多少難解なエンジニアリングの本でも読めるのでは?という自信がついた。
- CSZAPの講師の方に教えていただいた、各トピックで遭遇する実務上の注意点などがインプットされた
※今後は、何も見ずに、論点・挙動を説明できるようになりたいです。
CSZAPの参加をおすすめしたい人
- CSのベースの知識を実践的かつ(ある程度)体系的に学習したい
- 現在CSを専攻としていない(専攻している場合は、そちらを優先した方が良い)
- 6~7か月で400時間程度の学習時間を確保することができる
※仕事が忙しい人はパンクすると思うので、あまりおすすめできません
※ほかのチームでは、さまざま改善されて、取り組み時間が短いかもしれません - 本だけ読んでも理解した実感がわかない
- エンジニアだが業務内容が狭い領域なので、広く理解できるようになりたい
- そもそもエンジニアではないが、CSについて知りたい
- 勉強後にソフトウェアエンジニアリング協会やCSZAPに何かしらの貢献(寄付・時間を捧げる等)をしようと思える
効果的な学習方法
CSZAPの序盤はかなりついていくのに必死で、
後から思うと、もっと早く勉強方法のコツをつかんでおきたかったなと思います。
あまり着席することが得意ではなく、活字が苦手な自分なりのコツと勉強会内での周りの人の良いと思った所作をもとに、シェアさせて頂きます。
予習
-
電子書籍で購入して、隙間時間に、自由な体勢で、AIに相談・ググりながら読む
-
まず、節・図・重要な点などを頼りに無理やり読んで概観をつかむ
-
次に、各トピックに対して、5W1Hを問いながら/本内の文脈・単元の全体観を意識しながら、読む
- 5W1Hを問う
-
それは何なのか(what)
-
どんなときに使うとよいのか(when)
-
なぜその技術が生まれたか(why)
-
-
文脈、単元の全体観を意識する
- 5W1Hを問う
勉強会内
- 自分の認識を説明して、合っているか確認する
- 自分のわからない点を質問する
- そもそも何をしているのかわからない(シグナルを発することが大事)
- こういう理解だが、ここの記述との整合性が取れない
- ここの細かいところが気になる...etc
- 他の人の会話を聞いて、自分が理解できていると思っている点が、怪しくないか確認する(理解できていると思っていたが、理解できていなかったことが多々ありました)
- 深入りしすぎると抜けれなくなる沼がよくあるので、適度に切り上げる
復習
- 英単語帳のようにフランクに複数回読む
- 節・図・重要な要素を再確認する
- 章・本を超えて関連を考えてみる
- 勉強会内のメモを読む
- AIに質問していたことを復習する
※何も見ずに空で説明できるようになるとよいと思うがまだできていない
最後に
ソフトウェアエンジニアリング協会・CSZAPの運営者・参加者の方には本当に感謝しております。
ありがとうございます。
CSZAPのおかげで、一人で取り組んでいたら2年くらいかかりそうな/挫折しそうな内容を、数か月間で取り組むことができました。自分もまだまだ自己研鑽の身ですが、自分なりの周知・TIPSシェアをさせていただきました。
これからも謙虚に学んでいこうと思います。
この記事を読んで、CSZAPに参加を希望する方は、
CSZAP希望の旨を記載の上、お問い合わせください。
また、ソフトウェアエンジニアリング協会でCSZAPに限らず勉強したい方も、
お問い合わせください。
お問い合わせ - 一般社団ソフトウェアエンジニアリング協会
もしくは下記のdiscord参加にご参加いただき、ご連絡ください。
ソフトウェアエンジニアリング協会のdiscordサーバー