livaの雑記帳

始めてこのページを開いた人へ

基本情報

書いている人:Liva(@liva_jy

学年:M1

生息域:都内

主に作ってる物:

x86向けOS(と言いつつ、今はカーネルだけ)

github.com

 

連絡はtwitterのDMでお願いします。

OSを好きなだけの普通の大学生が簡単に強くなる方法

raphine.hatenablog.com

 

以前こんな記事を書きました。

この記事の最後では「ここの記事に書いた内容を実践するだけじゃ大学生は強くなれないよ」と言い残したわけですが、多方面から「じゃあ大学生はどうすれば良いんだよ!」みたいなお叱りを頂いたので、続編の大学生版を書きます。

 

ただし続編といっても、少しだけ補足条件を。

 

  • 上の記事の内容をある程度実践している。(完璧にとは言いません。完璧なんてものは存在しないので)
  • 研究室配属前の学生である。

 

二つ目は結構大事な事で、まだ研究を初めてない、というのは大きなポイントです。

 

中高生版でも書きましたが「強さ」というのは曖昧です。別に成績が良くなくても強い人はいます。だから「SNS映えするような強さ(?)を求めるだけなら簡単でっせ?」という事を伝えたい、というのが前の記事の趣旨でした。

でも研究始めちゃうと、強さの定義って「いかに良い学会に論文がacceptされたか」に定まっちゃうじゃないですか。(ココらへんで筆者が血を吐いて死ぬ

なので「どうやったら強くなれますか?」という話は是非指導教員に聞いてみてください。きっとあなたが既に持ってる者を活かした、強くなり方を伝授してくれるんじゃないでしょうか。たぶん?(ココらへんで筆者が再度血を吐いて死ぬ

 

さて、もう少し前置きを続けさせてください。
中高生の場合はほぼ確実に上の記事で書いた通りの事をやれば良いと僕は思っているのですが、大学生となると「強くなり方」に様々なバリエーションが出ると思っています。

中高生と大学生だと、やはり時間の束縛度が違うので、人生経験の幅も違うし、その人が武器にできる物も異なると思うんですよね。ある人はアルバイトいっぱいやってて、お金を持ってるかもしれない。ある人は勉強会とかイベントとかに沢山参加してて、人脈が広いかもしれない。ある人は、プレゼンが上手い/コミュ力がある/語学力がある/マネジメントスキルがあるなどなど・・・。


だから例えば「凄いソフトを作って名前を広めたい!」と思ったとして、ある人は外注してしまうかもしれないし、ある人は仲間を集めて共同開発し、その取りまとめという立ち位置で才能を発揮するかもしれないし。やり方がどうであれ最終的な成果が世に広まれば、その人の名前は売れるわけです。別にその人自身が全部作らなくても良いのです。

 

とはいえこの記事を読んでいる人で、そういった才能を持っていると自覚している人はたぶん少ないと思うので、そういった個々人の才能に頼らずにどうやって強くなるかという話をしていこうと思います。

 その上でここに書いてある事を鵜呑みにせず、自分なりにアレンジはしてみてくださいね。誰しもが自分の人生経験で培った強さを持っているはず(自覚しているかはさておき)ですから、折角なのでそれを活かしてショートカットしつつレベルアップを目指してみるのが良いように思います。

 

さてだいぶ前置きが長くなりましたが、本題に入りましょう。

 

基本は前のブログで書いた、「勉強し、手を動かし、自分の頭で考え、アウトプットする」というのと同じです。少しだけ内容がアップデートされるだけ。

 

1. 論文を読もう

大学のOSの授業内容の自習がある程度終わり基礎知識が身についたら、論文を読んでみましょう。(基礎知識身につける前に論文読んでも何も理解できないと思うので、基礎を学ぶ方が先ですよ?)

 

僕が学部生の時、先輩から「今のうちに論文を読んでおいた方が良いよ」と何度も言われました。もしかしたらこれを読んでいる皆さんの中にも心当たりのある方がいらっしゃるかもしれません。

 

でも、いきなり「論文読め」って言われても難しいですよね。

 

  • 論文読もうにもどんな論文を読めば良いかわからない。
  • 論文をどう読めば良いか分からない。
  • 英語辛い。
  • そもそもモチベ沸かない。

 

論文読むまでの壁、ざっと並べるとこんな所でしょうか。

 

とりあえずまずは「モチベ」の話から。

OSって難しくて、 過去にいろいろ研究され尽くしてしまっているから、今更自分がOS分野に触れてもしょうがないんじゃないか、みたいな気持ちになりませんか?僕はなりました。

これに対する消極的な回答としては、「アプリケーションはOSの上で動いているから、OS(等のシステムソフトウェア)が理解しているとできる事の幅が広がるし、いろいろ潰しが利いて良いよ!」というものです。

まあでもこの記事を読んでいるような人にそんな事を言ってもしょうがないですよね。もっと、「OSって今でもできる事あるんだ!楽しいんだ!」みたいな事を知りたいのではないでしょうか。

 

それ、論文を読めば書いてあります。

 

そもそも論文って何なのでしょう?
研究室配属されいてる学生にとっては当たり前の事なのですが、ここでは学部生向けに簡単に解説してみます。

 

情報系の論文の多くは、

  • 世の中に存在する解決されるべき(解決すると皆が喜ぶ)問題を示す。
  • その課題に対する他の誰かが思いつかなかった(或いは思いついていても以前は有用ではなかった)解決策、及びその実装方法を示す。
  • その解決策が実際に解決できた事を実験結果を用いて示す。

という構成で成り立っています。(自然科学系とかだと違うかもしれませんが、専門外なので良く分からないです)

 

そしてもう一つ大事な情報として、OS関連の論文は最近も沢山発表されています。

これらの事から導かれるのは、「OSについて解決されるべき問題」がまだまだ沢山残っているという事です。

だから論文を読めば、「OSって今でもできる事があるんだ!楽しんだ!」という気持ちになれそうだと思いませんか?実際、僕は論文を読む度にそんな気持ちになりますよ!

もちろんそれなら自分でも同様に論文を書けるかというと、それはまた別問題なんですけどねー。(ココらへんで筆者が吐いた血がダンスを踊り始める

 

さてじゃあ次にどんな論文を読めば良いか、ですがここは1修士学生の意見で書くよりも品川先生(@ut_shina2)の意見を参考にしましょう。

 

d.hatena.ne.jp

 

ここに挙がっている通り、OS系のトップ学会はSOSP/OSDI/EuroSys/USENIX ATCの4つです。

 

で、学部生の間はこの4つの学会の論文を読んでおくのが良いと思います。トップ学会の論文はきちんとロジックが通っているし、研究として抜けが無いので、ハズレ論文を引くリスクが無いというのが主な理由です。

 

学部生の貴重な時間をハズレ論文を読むのに費やすのは勿体無いので、この学会リストの中から興味がわいた物を読んでみるのが一番無難でしょう。

あと、OSDIとUSENIX ATCはPDFが直接ダウンロードできるので、ACMに(所属組織や個人で)課金してなくても論文読めるのが良いですね。

ちなみに僕はACMから論文pdfをダウンロードしてくる方法、学部生の時にわからずに挫折しました。大学回線で繋げばダウンロードできるらしいけど、なんかよく分からん的な。卒論書いてる間にいつの間にか大学回線以外からもダウンロードできるようになったけど、結局なんでできるようになったのかは良く分かってません。アカウント作ったら何か大学と紐付いた的な。まあでもダウンロードできるからいいや、って思ってます。

 

雑談が長くなりました。次行きましょう。

英語読むのダルい、という問題の対策法ですね。

一般的にはAbstract(要旨)を読んで何となく研究概要を把握しろ、みたいに言われますが、ぶっちゃけ英語力無いとAbst読んだだけできちんと理解するの難しいです。まあ僕の英語力がクソ雑魚ってのはあるんですが。。。

僕の場合は論文一回通して読んでも、結局論文が本質的に何が言いたいんだ?ってなって、そこからしばらくウンウン唸って何度も読み返して、ストンと落ちて納得できるまでにだいぶ時間が掛かります。で、きちんと理解できた後にAbst読むと「あぁ〜、なるほど!」ってなるんですが、まあでもそれって実はAbst読めてなかったって話なわけで、何が言いたいかって英語力無いの辛い。

で、そんな人は発表スライドを一通り読んでから論文読むと良いと思います。

 

例えばOSDI'16だったら、Programをズラッとみてみると、多くの論文はスライドが公開されているので、それを最初から最後まで眺める、と。そうすると論文の言いたい事が簡潔にまとまっているし、図で綺麗に説明されているので英語力が低くても割と何とかなります。

まあスライド掲載されてない論文もあるし、そもそも年度が古いと学会の公式サイトが落ちちゃっててスライドにアクセスできない、とかあるんですけどね。とはいえ、ひとまずスライドがある論文から読んでいくだけでも、だいぶ勉強になるんじゃないでしょうか?

 

最後に、論文をどう読むかの話。
これも研究を始めると基本なんですが、論文は章立てて書かれています。

論文ごとにどんな章立てかは異なるのですが、大雑把に分けて以下のような構成になっています。

  • (Abstract)
  • Introduction, Background and Motivation
  • Design and Implementation
  • Evaluation and Discussion
  • Related Work
  • Conclusion

ただし、これを読んでる皆さんはまだ研究をしているわけではないので、論文全てを読まなくても良いと思います。

 

皆さんが論文を読む意義は、

  • 「OSに関して、こんな解決されるべき課題があったんだ!」という知識を得る。
  • 「こんな予想だにしない解決方法があるんだ!」という気づき

といった事でしょう。
そうなると、読むべき章としては、

 

  • (Abstract)
  • Introduction, Background and Motivation
  • Design(Implementationの部分は興味があれば)
  • Conclusion

 

辺りを読むと良いのかな、と。

Introductionでは、「存在する課題」、「それに対してこれまでどう解決しようとしてきたか(学術的な話に限らず、例えばLinuxにおいてどう実装されているか、といった内容も多いので、読むだけで知識が広がる)」、「それをどう解決するか、なぜそのような解決方法だと有用なのか」といった事が書かれています。これらについては、BackgroundやMotivationといった章として独立している事も多いです。

Designは解決方法の全貌です。折角論文を読むからには、「どう解決されたか」を読まないと勿体無いですよね。

Conclusionは論文のまとめで、「結局この論文が何を言いたかったか」がまとまっています。僕は、一通り読んだ後の復習として「自分がこの論文を理解できたか」を把握するために読んでいます。

 

これらの内容は、研究者でなくても知識として知っておく事でいろいろな事に応用できるでしょう。学部生の皆さんでも十分に知っておく価値のある事です。

 

Related Workも読むと知識が増えるから良いよ、なんて言われますが、これは既存研究の列挙なので、研究を始めたら読んだ方が良い一方、研究が人生の中心ではない皆さんは別に読まなくても大丈夫なのではないかなと。

 

さて。

「論文はこう読もう!」という話をダラダラと書いてきた上でこんな事を言うのも何ですが、僕の方から1つ注意点を挙げさせてもらうと、論文を読んでそのまま鵜呑みにはしないでください。

論文に書かれている事は論理的に正しい事が多いのですが、やはり研究という枠で行われている物なので実社会と結びついていない事もあります。

例えば、

  • 「起こりうるかもしれない未来の話」を仮定して問題設定をしているかもしれない。
  • 問題設定が物凄く条件を限定した、実社会では起こり得ない事かもしれない。
  • 解決策を実アプリケーションで採用するには課題があるかもしれない。
  • そもそも実アプリケーション上では起こっている問題を解決できないかもしれない。

とまあいろいろあります。

トップ学会に通っている論文は、比較的これらの「アカデミアあるあるな実社会と結びついてない良くない部分」が少なめではありますが(これもまたトップ学会の論文を読む事と良い、と言われる理由ですね)、それでも多少はあると思って読んだ方が良いでしょう。

「実社会に影響を与えなければ、その研究は無価値だ」とまでは言いませんが、書いてある事を全て鵜呑みにしていくと、「実社会とリンクしていない、机上の空論を並べただけの頭でっかち」になってしまうだけです。

なので、「論文に書いてあるこの部分は実社会とリンクしているだろうか?」という事は常に頭の片隅に置いておくと良いのではないでしょうか?

 

2. 手を動かそう

これについてはこの記事でアップデートする程の物でも無いのですが。

まあでも折角なので、論文読んだ時に得た知識等が自分の書いている物にある程度反映できると良いですよね。

 

「OSを今更作って何の意味があるんだ!」なんて事をよく言われますが、そういう人は放っておくとして、論文を読めば「まだまだOS周りでできる事いっぱいあるじゃん!簡単な物を自分で作ってみても意味があるかもしれないじゃん!」みたいな気持ちになれるかと思います。

(まあどんな論文読むかにもよるんですが。Linuxの改良、みたいな論文ばかり読んでいてもそんな気持ちにはなりにくいので笑)

 

本当は論文で読んだ物を軽く実装してみる、みたいなのが一番良いのですが、システムソフトウェア系の論文って、いざ自分で0から実装するのは結構大変だったり・・・。

それを何とか解決したくて裏でチマチマ作っている物もあるんですが、その話はまた暫くしたらブログに書くかもしれません。

 

3. 自分の頭で考え、議論しよう

中高生版では「自分の頭で考えようね」という話を書きました。

大学生になったら、周りに情報系の友達も(たぶん)できると思うので、そういう人たちと議論してみましょう。

 

議論する事のメリットは、

  • 自分の知識を口に出して説明する事で、理解の浅さに気づいたり、より知識を定着させる事ができる。
  • 自分の意見を説明する事で、その意見の論理的に弱い部分を周囲に指摘してもらえる。
  • 他の人の知識や意見を学ぶ事ができ、価値観が広がる。それによって新しいアイディアが生まれる可能性が増える。

といった所でしょうか。

 

別に友達がOSに詳しくなくても構いません。(もちろん詳しい人の方が良いんだけど)「OSを教えてあげるよ!」という体でその友達と喋れば、自分の知識の整理だけでもできますよね。初心者ならではの視点や発想、なんてのも得られるかもしれません。

 

もちろん、友達がいないと話は全く始まらないんですが。コミュ障辛いね。

 

4. アウトプットする

これはもうアップデートする程の事は無いでしょう。

大学生になったら、時間の自由度や経済力を活かして、勉強会で発表したり、イベントに参加できたりしますよね。

ま、これも引っ込み思案な人間には辛いんですけどね。お家に引きこもるのタノシイ

 

 

 

 

 

 

 

 

だいぶ長くなってしまいましたが、いかがでしたでしょうか?

「論文読もうね」という話が殆どを占めていますが、できるだけ具体的に書いてはみたので、多少は参考になると嬉しいな、と。

ここに書いてある事って研究室配属後だと当たり前の話だと思うんですが、こういう事を学部生の自分に教えてくれる人、僕の周りにいなかったんですよね。少なくとも僕は学部生自体、こういう話めっちゃ知りたかったです。というわけで未来ある若者向けに書いてみました。

 

 

もう6200文字とか書いてるのでさっさと終わらせたい所なんですが、最後に宣伝させてください。(中高生編を読んだ方からすれば「またかよ!」って話ですね、ごめんなさい)

 

今回の記事に書いた内容を、僕が直接サポートしながら実践するという機会を作りました。ここに書いてある内容、いざ一人で実践するのは中々難しいと思うので。


「セキュリティ・キャンプ2018全国大会」(公式サイト)「集中開発コース、YI OS開発ゼミ」の中の「最先端OS談義」というテーマです。

 

テーマ詳細は以下のブログ記事を参考にしてください。

 

raphine.hatenablog.com

 

22歳以下の学生なら参加可能で、費用負担0なので、是非ご応募ください!
応募〆切は5/28です。

ご応募お待ちしております!

普通の中高生でも簡単にOS分野で強くなる方法

釣りタイトルだと思った皆さん、残念ながら本記事は釣り記事ではありません。

安心して読み進めてください。

 

 

 

 

「強くなりたいです。どうやったら強くなれますか?」

 

恐らく情報系の多くの人が抱えている疑問なのではないでしょうか。

「I know everything」みたいに言える人って中々いないですよね。

ちなみに、僕も強くなりたいです。

どうやったら強くなれるんでしょうね。もし強くなれる方法があったら知りたいですよね。 

 

そもそも強さって・・・何だ?

そもそも論で行くと、「強くなりたい」とだけ言うのは少し微妙で、どのように強くなりたいか、という具体的なイメージがあった方が良いのではないかとは思うのですが、まあそんな事を思う人は恐らくこのブログを読んでいない事でしょう。

 

なのでこちらで「強さとは何か」を邪推してみるわけですが、このページを読んでいらっしゃる中高生の皆さん的には、「周囲にドヤれる、twitter上とかでブイブイ言わせられるくらいの知識があったり、技術力があったり」みたいなのを求めているのかなぁ、と。

 

で、それくらいなら簡単なんじゃね?って思ったので、僕が思う「『普通』の中高生でも『簡単に』OS分野で強くなれる方法」を書いてみたいと思います。

どれくらい強くなれるかというと、OS分野に限って言えば、そこら辺に転がってる情報系の大学生よりは強くなれると思います。大学院生の自分からすれば当たり前なのだけど、これを中高生の頃の自分に知っていれば、もっといろいろ世界が広がっていたと思うので、共有させてください。

 

 

1. 手を動かそう

絶対に必要な事として、手は動かさないとダメです。

ただ漠然とtwitterを眺めていても当然強くはなれないですし、Google検索で出てきたページを眺めたり、本屋で買った本を読んでいるだけでは強くなれません。

強くなりたければ実践あるのみ。コードを書きましょう。いろいろな壁にぶつかると思いますが、その壁を乗り越える事でしか強くなる事はできません。

 

皆さんご存知の「30日でできる!OS自作入門」はコードを書く上でとても参考になります。

 

 

 もちろんこの本を読んだだけではダメで、実際に書籍内のコードを動かし、自分で書き、そして本の内容から外れた、オリジナルなコードを書いてみる必要があります。

 

とはいえ、OSに興味がある方ならこのステップはそんなに苦では無いでしょう。

「OSというブラックボックスを自分の手で書けるんだ!」というワクワク感から、自ずと手が動いてしまいますよね!

 

この本を読む上での注意ですが、この本はあくまで「自分でもOSは書けるんだ!」という事を読者に理解させるのが目的の本で、「OSについて学ぶ」本ではないです。(ちゃんと節々にその注意書きがありますよね)

なので、この本を読んだだけでOSの全てを理解したと思わない方が、OS分野で「強く」なれると思います。

 

「OSについて学ぶ」事にはそんなに興味はないんだけどなー、なんて人もいるかもしれません。もちろん、OSについて学ばなくても、持ち前の高い技術力で素晴らしいアウトプットを出せる方にはそういった話は不要なのですが、僕のような「普通の人」は、やはり一度は「OSについて学んでおく」事をオススメします。なぜなら、一度OSの基礎を学んだ人間の方が、その後で手を動かした時に出てくるアウトプットの質が上がるからです。

 

じゃあどうすれば良いのか、というのが次の話。

 

2. 大学の情報系学科のOSの授業スライドで自習する

多くの情報系の学科では「オペレーティングシステム」という講義(あるいはそれに類するもの)があります。その資料を手に入れ、自分で勉強しましょう。

大学の学部の授業は、専門家によって作られているだけあって、一通りの基礎知識をきちんと過不足無く教えてくれます。これをマスターするだけで大学生に肩を並べられるだけの知識がつくでしょう。

基礎を学ぶ事は大変重要です。基礎を学ばないと、学ばかなかった事によっていろんな所でつまづいてしまいます。つまづいて失う時間は基礎を学ぶのに要する時間よりも明らかに大きいので、とても非効率的なわけです。手を動かすときも、「知識があった上で手を動か」した方が作れる物の幅も広がるし、それによって得られる物も大きくなります。

(もちろん、これは「大学の講義の内容なんて学ばなくても、0から同じ内容を自分で再構築できるぜ!」と言い切れるぐらい強い中高生には当てはまりませんが、一応これは普通の中高生向けの記事なので)

 

というわけで、大学の講義を自習すると強くなれるよ!という所までは伝わったと思うのですが、恐らく中高生の皆さんにとって、大学の授業というのはイマイチイメージがつかないものだと思います。大学では凄く高度な教育が展開されてるから、今の自分には難しいかも・・・なんて身構えたくなる気持ちもわかります。

 

しかし多くの大学生は、試験直前に慌てて授業資料をWebからダウンロードし、一夜漬けで勉強してなんとか試験を乗り切るものです。よほど良い教員の授業を除いて、教員の講義なんてあってないようなもの。

大学の授業なんてこの程度の物なんですから、中高生の皆さんでも自力でなんとか勉強できそうですよね?

勉強できるという事は、巷の大学生並の強さにはなれそうですよね?

 

参考として授業資料がダウンロードできるリンクを貼っておきます。

 

東京大学理学部情報科学科「オペレーティングシステム

www.pf.is.s.u-tokyo.ac.jp

 

東京大学電子情報工学科・電気電子工学科「オペレーティングシステム

https://www.eidos.ic.i.u-tokyo.ac.jp/~tau/lecture/operating_systems/

 

勉強する上での注意として、「スライドをただ読み進めるだけ」というだけではさほど強くなれないので、オススメはしません。それだとそこら辺の大学生と同じになってしまいます。

 

スライドを読む時は、「自分が他の人にスライドを使って講義できるようになる」ぐらいまで理解しましょう。(具体的にはこの記事を自力で書けるくらいになると良いですね)ほんの少しでも理解していない所が残っていると、それを聞いた人は容赦なくツッコみを入れてくるものです。怖いですね。手を抜かず頑張りましょう。

 

 

3. 自分で更に膨らませて考えてみる

勉強しただけで終わり、ではその先の成長がありません。

基礎知識が身についたからといって考えるのを止めず、ふとした拍子に気づいた事やアイディアについて想像を膨らませましょう。

アンテナを広げて、いろいろ情報収集をしましょう。SNSGoogle検索を活用したり、勉強会に参加したりすると、きっといろいろな学びや気付きがあるはずです。

基礎をきちんと築いた上で得られる学びや気付きは、とても価値のあるものです。それを大切にしましょう。

言うまでもない事ですが、学びや気付きを得たら、手を動かしてくださいね。

 

4. 手を動かした事をアウトプットする

これは有名な話なので、私がわざわざ書くまでもないですよね。

自分がやった事をブログに書いたり、勉強会で発表したりすれば、いろいろな人に自分の事を知ってもらえて、良い機会に巡り会える事も多くなるでしょう。

 

 

 

長くなりましたが、要するに「基礎をきちんと学び、手を動かし、アウトプットする」事をバランス良くやってね、っていう事です。どれかが欠けてもダメですよ。

いかがでしょう?中高生の皆さんでも簡単にできそうな事ばかりですよね?

 

補足:大学生の方へ

もしかしたら大学生の方もこの記事を読んでらっしゃるかもしれません。一応誤解なきように書いておきますが、「大学生の場合はここまで書いてきた事を全てやっても、強くはなれません」。

大学の講義をきちんと身につけるのなんて当たり前だし、課外活動だって当たり前。ここに書かれている事は「少し強い大学生」なら皆やっている事です。

この内容を中高生が実践してなぜ強くなれるかというと、彼ら、彼女らには「年齢的アドバンテージ」があるからです。

大学生の皆さんがもっと強くなりたいのであれば、他にもやらなければいけない事があるわけですが、それはまた別エントリで。

 

追記:書きました。

raphine.hatenablog.com

 

宣伝:セキュリティ・キャンプ2018

最後に宣伝させてください。

 

「強くなるための方法」として上で挙げた内容ですが、最初から一人で全てやる、というのは少し不安ですよね。

 

そこで、それを私がサポートする機会を作りました。

「セキュリティ・キャンプ2018全国大会」(公式サイト)というイベントがこの夏開かれます。「集中開発コース、YI OS開発ゼミ」の中の「最先端OS談義」というテーマは、「皆さんが自分の力でOS分野で強くなれる」事を目指す物です。まあ、有り体に言えば、このブログ記事に書いてある内容を、私がサポートしつつ実践してみる、っていうテーマですね。

 

学生の皆さんの金銭面での負担は一切無いので、是非ご応募ください。

私のテーマの詳細については、以下のブログエントリーで解説しています。こちらも参考にしてみてください。

raphine.hatenablog.com

seccamp2018(補足4)

注:このページは、セキュリティ・キャンプ2018全国大会x86 OS ゼミにおいて私が担当するテーマ(最先端OS談義)について解説したものです。

詳しくはトップページを御覧ください。

 

独創的なOSを作るために私が必要だと考える3つの要素について

 

既にあるOSについてよく学ぶ

これは所謂「お勉強」であって、もしかすると退屈に感じる人もいるかもしれません。


でも既にあるOSは、そのOSを作った人が長い時間を掛けていろいろな事を考え、アイディアを熟成させ、その結果として実装された物です。我々が0から同じ事(長い時間を掛けて考えて、アイディアを具現化する事)をするよりも、その部分については既存のOSから学んだ方が効率的ではないでしょうか?それによって生まれた時間を使って、更にそれを膨らませた物を作った方が、ずっと面白そうに思えませんか?


さて、勉強するとなると困るのが、「何を学べば良いのか」という事です。そこで、このテーマ希望者向けの選択課題を参考にしてみてください。ここには皆さんが知っているようなOSは殆ど出てこないかもしれませんが、「OSの世界の最先端」があります。
皆さんに「OSの世界の奥深さ」を体感してもらえるようなテーマで課題を作成できたと思うので、是非一通り目を通してみてください。

 

手を動かして検証する

学んだだけで満足せず、学んだ事について実際にコードを書き、走らせ、学んだ事と同じ結果が得られるか、確かめてみましょう。

ただ勉強しただけでは、きちんと実感できないものです。皆さんも学校の授業で、何かを学んだ後は演習という形で手を動かしますよね?それと同じ話です。

もちろん、今このページを読んでいる皆さんの多くにとっては、「コードを書く事が嫌いではない」はず(むしろ、勉強よりもコード書かせてくれ!って思う人の方が多いのかもしれません)なので、この点については皆さんなら大丈夫だと思っています。

但し、1つ問題になるのが、OSというテーマは実装がとても大変だという事です。「自分の好きなようにOSを作るのでさえ大変なのに、新しく学んだ事を実装するなんて無理だよ!」と思う方もいらっしゃるでしょう。このテーマでは、「いかに最小コストで検証するか」という事についても学んで行きたいと思っています。これについては、私の方からいろいろサポートするので、皆さんが気にしなくても大丈夫ですよ。

 

皆でOSについて話し合って、知識を共有したり、考察する

これがこのテーマで最も重要視している事で、「最先端OS談義」というテーマ名の由来にもなっています。

一人でずっと考えても良いアイディアは思いつかないものです。皆で話せば、自分が気づかなかった事に気付かされたり、逆に他の人に刺激を与える事ができ、その中でふとした拍子に良いアイディアを思いつく事があるかもしれません。「3人寄らば文殊の知恵」なんてことわざもありますから。

seccamp2018(補足2)

注:このページは、セキュリティ・キャンプ2018全国大会x86 OS ゼミにおいて私が担当するテーマ(最先端OS談義)について解説したものです。

詳しくはトップページを御覧ください。

 

「OSってなんだろう?」という問いで考える、物事の考え方

 

OSの定義は結構曖昧で、いろいろな解釈ができます。「OSとはなんぞや?」という問いに皆さんは答える事ができるでしょうか?

セキュリティ・キャンプに参加したいと思ってこの文章を読んでいる方にとっては、少し難しい問いかもしれません。でも今から考えていくので、この瞬間にこの問いに答えられなくても大丈夫ですよ。

(OSの定義をご存知の方にとっては、この先の話は退屈になるかもしれません。ごめんなさい。。。)

 

話が脱線しますが、世の中には「自分がOSと定義したものがOSなんだ!」なんて事を言う人もいるようです。

そういう意見を否定はしませんが、少し乱暴なように私には思えます。これについては別トピックとして書いたので、こちらをご覧ください。

 

話を元に戻しましょう。

先に書いておくと、OSの定義は存在します。調べれば出て来ますし、既にご存知の方もいらっしゃるかもしれません。なので私の方から「OSとはこういうものだ!」と言ってしまうのも1つの方法なのですが、それでは皆さんの考える機会を奪ってしまう事になるでしょう。

そこで、禅問答チックに「私の方から皆さんに対して小さな問題を問いかけてみて、皆さんがそれに答える過程で最初の問題の答えを見つける」というようなやり方でやってみたいと思います。

このやり方は遠回りなのですが、私としては皆さん自身が似たような問いにぶつかった際、自分の力で考える上での参考にして頂ければ嬉しいです。

 

禅問答の方向性ですが、少なくとも「OSが最低でも実装していなければいけない役割/機能って何だろう?それが分かればOSの本質が分かるはずだ」というのを目指したいと思います。

それでは早速質問です。最初は簡単な質問から行きましょうか。皆さんも考えてみてください。

注:この後の話はとても長いので、時間に余裕がある時に読んでくださいね。

 

 

 

Q. LinuxWindowsはOS?

 

はい、これは殆どの人がOSだと思いますよね。では次はどうでしょう?

 
Q. OSは何もソフトウェアがインストールされていないパソコンに一番最初にインストールされているものか?(ハイパーバイザ上で動いているケースを除く)

 

以後の議論では仮想マシンやハイパーバイザの存在を少し脇に置かせてください。

その前提で考えれば、何となくこの定義は正しそうな気がします。

 

でもちょっと待ってください。パソコンには最初からブートファームウェアBIOSなりUEFIなり)が入っていますし、OSをインストールした後新しいOSをインストールしてデュアルブート構成にする、なんて事もありますよね。

なのでこれは少し違いそうです。

 
Q. OSは他のソフトウェアに依存せず、独立して動くソフトウェアであるか?

 

ちょっと意図が伝わりにくいかもしれないので補足しましょう。

皆さんが良く使うアプリケーションはOSの上で動いています。でもOSの下で動くソフトウェアは無さそうですよね。

つまりアプリケーションはOSに依存して動いているけれど、OSは何か別のソフトウェアに依存する事なく動いています。なので、これはOSの1つの特徴と言えそうです。

 

でもこれだとOSが最低限持つべき機能がイマイチはっきりしませんね。

少し質問の方向性を変えてみましょうか。

 

Q. Webブラウザを含んでいないWindowsはOSでは無い?

 

昨今のOSの多くはWebブラウザを含んでいます。WindowsであればEdge/Internet ExplorerMacならSafari等。。。

じゃあWebブラウザが無いとOSでは無いのか、と言うと別にそんな事はないですよね。実際、世の中にはWebブラウザを搭載していないOSも沢山ありますし、WindowsからWEBブラウザをアンインストールするとOSでは無くなる、なんて事はありません。

 

では少し単語を変えて同じ質問をさせてください。

 

Q. シェルがインストールされていないLinuxはOSでは無い?

 

この問いだと悩む人もいるのではないでしょうか。

シェルすらインストールされていないLinuxはOSとして価値が無いから、OSじゃ無いんじゃないか、みたいに思う人がいても不思議では無いと思います。

 

ではLinuxからシェルをアンインストールすれば、OSでは無くなってしまうのでしょうか?

もしOSで無くなってしまうのであれば、シェルとWebブラウザにどれだけの違いがあるのでしょう?シェルもWebブラウザも規模が違うだけでどちらも所詮ソフトウェアです。本質的にはさほど差は無いのではないでしょうか。

 

こう書くと「Webブラウザが無くてもパソコンは操作できるけれど、シェルが無いとパソコンを操作する事はできないじゃないか!」という反論が飛んできそうです。

しかし多くの人はお気づきでしょうが、シェルが無くてもパソコンは操作できます。いや、むしろ今時はシェルを使ってパソコンを操作する人の方が少ないですよね。情報系の人間にとってはシェルを使うのが当たり前でも、世の中の大半の人間にとってはパソコンはGUIで操作し、ファイルマネージャーやOfficeソフトを使うためのものです。

 

なのでシェルが無いからといってOSでは無いと断じるのは早計ですし、シェルがOSの本質、というわけでもありません。

「多くのOSはシェルというユーザー対話型のコマンドラインインターフェースを含んでいる」としておくぐらいが丁度良いでしょう。

 

 

 

 

なんだか話がずれていっている気がしますね。少し話を整理してみましょう。

Webブラウザもシェルも、ユーザーがコンピュータを操作するための機能を提供しています。どちらのアプリケーションもOSに無くてはならないもの、というわけではないです。

であれば次のような問いはどうでしょうか?

 

Q.「ユーザーがコンピュータを操作するための機能」を提供する事はOSの本質ではない?

 

一般的に「ユーザーがコンピュータを操作するための機能」を提供するのはアプリケーションの仕事です。Webブラウザも、ファイルマネージャも、シェルも、全てアプリケーションです。

「アプリとOS」という区分けをするなら、アプリケーションはOSに入らないわけですから、「ユーザーがコンピュータを操作する機能」はOSの仕事ではない、となります。

 

しかし一般的なOSでは、Webブラウザやファイルマネージャも含まれてOSとして売られている事が殆どです。最近はアプリケーションストアが含まれている事も多いですよね。どういう事なのでしょう?

 

これを考えるために、「OSとは多義的である」という最初の話まで戻ってみます。様々なアプリケーションを含んでいるOSを、「プロダクトとしてのOS」という観点から見てみるのはどうでしょうか?

 

最近はOSが端末にプレインストールされた状態の方が多いですが、昔はOSがパッケージとして売られていました。(これを読んでいる皆さんなら、パッケージとして売られていたり、インターネット上に公開されているOSを手に入れてインストールした経験があるかもしれません)

パッケージとして販売されているOSは、「とりあえずOSを入れたら、一通りやりたい事ができる」事を目指しています。だってそうでないと「OSをインストールしたけど、追加でソフトを沢山インストールしない限り何もできない」みたいな事になってしまいますよね。

 

ここで大事な事は、「プロダクトとしてのOS」は一般消費者から見た時のOS像であり、「ソフトウェアの分類の1つとしてのOS」とは切り口が異なるわけです。

もちろんどちらもOSですが、今恐らく(エンジニアである)皆さんが興味があるのは、後者のOSが何たるか、でしょう。

 

あ、前者が無意味と言うつもりはありませんよ?例えば話を前に戻して、「シェルはOSの一部である」と言うと納得する人が多いでしょう。シェルはユーザーが端末を容易に使えるためのアプリケーションであり、「プロダクトとしてのOS」がそれを提供している、それは全く間違っていません。

あくまで「ソフトウェアの分類の1つとしてのOS」を考える際、一緒に考えると頭がこんがらがるので、ひとまず脇に置いておきましょう、というだけの話です。

 

話を元に戻すと、「ソフトウェアの分類の1つ」としてOSを見た時、「ユーザーがコンピュータを操作するための機能」を提供するのはあくまでアプリケーションであって、OSの機能ではない、つまりOSの本質ではない、と私は思います。

 

皆さんはどうでしょうか?もしかすると「いや、ユーザーがコンピュータを操作する機能をOSが持つべきだ」と思う人もいるかもしれませんね。

もう少しその議論も続けたい所ではありますが、終わらなくなってしまいそうなので、ひとまずこの話はこれくらいにして先に進ませてください。

 

 

 

さて、全てのソフトウェアは何らかの機能を持っています。

例えばそれは計算をして計算結果を返す事かもしれないし、ユーザーとのインタラクションかもしれないし、はたまたネットワーク通信によって他のコンピュータと協調する事かもしれません。

 

結局、OSの機能って何なのでしょう?

ユーザーに対して機能を提供しないならば、OSは誰のために存在するのでしょう?

では次はこれを考えてみましょうか。

 

Q. OSは誰に対して機能を提供しているのか?

 

どうですか、頭の中に答えが浮かんできましたか?

浮かんでこない人のために、少しだけ脇道に入らせてください。

 

皆さんはC言語UNIXプログラムを書いた事がありますか?書いた事がある人は、ファイルを読み書きする際にfread()やfwrite()といった関数を呼んだ事があるのではないでしょうか。

fread()やfwrite()といった関数を呼び出すと、ライブラリ(libc)の中でread()やwrite()が呼ばれます。これは関数ではなくシステムコールと呼ばれるもので、OSに対して処理の実行を依頼しています。

 

つまり、OSはアプリケーションに対してシステムコールを提供しています。

 

他にもOSが提供している機能はいろいろあります。

例えばファイルシステムはOSが提供している機能ですよね。アプリケーションがファイルシステムについて何も考えずとも、とにかくファイルパスさえ渡せばOSの方で良しなに処理してくれて、ストレージの適切な場所を読み書きする事ができます。

これもまたOSがアプリケーションに対して提供している機能です。

 

おっと、「ファイルシステムはユーザーに対してもファイル操作機能を提供しているから、ファイルシステムはユーザーに対しても提供されているじゃないか!」という声が聞こえてきそうです。でもよく考えてみてください。ユーザーは「シェルやファイルマネージャを通して」ファイル操作をしているわけで、ユーザーにファイル操作機能を提供しているのはシェルやファイルマネージャといったアプリケーションです。そしてこれらのアプリケーションもまた、裏でOSを呼んでファイル操作を肩代わりしてもらっています。なので、OSはあくまでアプリケーションに機能を提供しているわけです。

 

他にはデバイスの制御もOSの重要な役目でしょう。

TCP通信をしたいと思った時、NIC(ネットワークカード)を直接制御してプログラムを書く必要はありません。C言語UNIXプログラミングであれば、ソケットを開いて、read()/write()すれば良いわけです。

これも、各々のデバイスが自分でハードウェアを制御しなくて良いよう、アプリケーションに対してOSが提供している機能ですね。

 

このように考えると、「OSはアプリケーションに対して機能を提供するソフトウェアだ」と言う事ができるでしょう。

 

では次に、OSはどのような機能を提供すれば良いのか考えてみましょう。

これまでの話の中で、幾つかOSが持つべき重要な機能が登場しましたが、これをもっと一般化して、「◯◯こそがOSの提供する機能だ」と言えると良いですよね。

 

Q. OSが提供している機能とは何か?マルチタスクを例にして考えてみよう。

 

最近のOSはマルチタスクをサポートしています。これもまたOSが提供する重要な機能です。

マルチタスクは、複数のプロセスを同時に動かせる仕組み、とでも言えば多くの方に納得して頂けるでしょうか。・・・残念ながらこの説明は正確ではないのですが。

 

折角なのできちんと説明しましょう。(既にご存知の方は読み飛ばしてください)

実は厳密に言うと、マルチタスクはプロセスを「同時に動かす」ための物ではありません。最近のCPUはマルチコア化が進み、複数のCPUコア上でプログラムを実行する事ができます。

皆さんのパソコンは何コア入っていますか?2コア?4コア?もしかしたら「16コアです!」なんていうお金持ちの方もいらっしゃるかもしれません。

しかし、プロセスはCPUのコア数以上に動いています。それら全てのプロセスを限られたコアの上で同時に動かす事は不可能です。

 

マルチタスクがやっている事とは、プロセスAを少し(10ミリ秒程度)実行して、プロセスBを実行して、またプロセスAを少し実行して・・・というものです。

これによって、人間の目から見れば「あたかも複数のプロセスが同時に実行されているように」見えるわけです。

 

さて、今度はこれをアプリケーションの視点から見てみたいと思います。

皆さんがプログラムを書く時、プロセスの切り替えを意識してプログラムを書いた事はないですよね。「このタイミングでプロセスが切り替わる事を想定して、切り替えコードを書いておこう」なんて事はしません。(ノンプリエンプティブマルチタスクの時代はそうだったわけですが、その話は今は割愛させてください)つまりアプリケーションは、CPU上でずっと稼働できるという前提で書かれるわけです。

 

でも既に皆さんはご存知の通り、アプリケーションはCPU上でずっと走れるわけではありません。裏でOSがこっそりアプリケーションを止め、他のアプリケーション(プロセス)に切り替えます。アプリケーションがそれに気づく事は殆どありません。アプリケーションにしてみれば、「あたかも自分が自由に使えるCPUが存在している」のです。もちろん実際には自由に使えるCPUなんてものは存在しません。それはOSによって作り出された、ある種の幻想です。OSはアプリケーションに対して仮想CPUを提供している、と言っても良いでしょう。

 

このようにしてOSが裏でこっそりプロセスを切り替える事には幾つかのメリットがあります。まず、アプリケーションがマルチタスク(プロセスの切り替え)を意識する必要がなく、プログラミングコストが下がります。次にもっと大切な事として、どのプロセスがどれだけの時間実行できるか(プロセスあたりのCPU使用時間)をOSが制御する事ができます。これによって、あるプロセスは重要なので沢山CPU時間を割り当ててあげる事もできるようになりますし、悪意のあるプロセスがCPUを占領してしまい他のプロセスが実行できない、という状況を回避する事もできるわけです。

 

 

さて、これをまとめると、「OSとは仲裁者である」つまり「仲裁こそがOSの提供する機能だ」と言う事は出来ないでしょうか?

「OSはCPUの実行時間を仲裁し、プロセスの実行を保証したり、ある特定のプロセスに意図的に実行時間を割り当てるできる存在である」と説明すると、今の話が綺麗に説明できそうですよね。

 

先程のファイルシステムの話も考えてみましょう。「ストレージとアプリケーションの間を仲介するファイルシステムを定義し、アプリケーションが簡単にストレージにアクセスできるようにする」と考え、OSの機能を「仲介」と考える事もできるでしょう。NICについても、OSが間に入って仲介する事により、アプリケーションがNICの事を良く分からなくても大丈夫なようにしています。

 

ここで頭の良い方はお気づきだと思いますが、仲介と仲裁は意味が異なります。とはいえ、複数のソフトウェアの間に入って良しなにしてあげたり、ハードウェアとソフトウェアの間に入って良しなにしてあげる、という意味では似ているように思えませんか?「仲介や仲裁こそがOSの提供する機能だ」と言えば、(少しすっきりしないかもしれませんが)なんとなくそんな気がしてきません?

 

 

 

 

良い感じに「OSとは何か」が描けてきた所で、オペレーティング・システムの定義を調べてみましょう。

Wikipediaを開いてみると(Wikipediaを参考文献に使うのはあまり良くないので、皆さんは書籍などで定義を調べてみてくださいね)、以下のように記述があります。

 

OSの主な目的は、ハードウェアの抽象化、リソースの管理、そしてコンピュータ利用効率の向上である

 

難しい用語が出てきました。でも大丈夫です。我々が今まで考えてきた事と大きく違う事は言っていません。


Q. ハードウェアの抽象化って何だろう?

Wikipediaにも説明があるので、それも同時に読んでもらいたいのですが、つまり「どんなNICであっても、ソケットとread()/write()というインターフェースでTCPパケットを送れるよ!」という事です。

OSがソフトウェアとハードウェアを仲介する時に、ソフトウェアとOSとの間でハードウェア処理に関する対話の共通窓口が必要で、この窓口こそが抽象化されたハードウェアインターフェース、という事になります。

抽象化とはなんぞや、というのをきちんと理解するのは難しいですが(これまた長くなりそうなので、今回は割愛)、これなら皆さんにもイメージがつきますよね?

 

Q. リソースの管理ってなんだろう?

マルチタスクの話で出てきましたが、あるプロセスがCPUを専有しようとしても、OSが良しなに仲裁して、他のプロセスの処理が中断されないように管理する、という話です。

 

Q. コンピュータの利用効率の向上ってなんだろう?

 もう一度マルチタスクの話を引用すると、あるプロセスは大事だからCPUを沢山使わせてあげられるように調停しよう、という事ですね。

 

どうですか?これまで考えてきた事とだいぶ近いと思いませんか?

 

 

 

 

ここまで結構長かったですが、皆さんどうでしたか?楽しんで頂けたでしょうか?

まあ、「長すぎて疲れちゃったよ」という感想を抱いている人が大半かもしれませんが。

でも、こうやって1つ1つ考えていく事で、「OSの本質が何か」という話のかなり近い所に皆さんと一緒にたどり着く事ができました。そして、これまでの流れが無ければ難しく感じるようなWikipediaの文面も、今にしてみれば「ああなんだ、それだけの事しか言ってないのか」という気持ちになりますよね?

皆さんも、難しい問いに直面した時は、こんな感じで考えてみるのは如何でしょうか?

もちろん皆さんが自分で考える時は、小さな問題を出すのも皆さん自身です。とはいえ、自分で自分に問題を出すのって難しそうですよね。

ご安心ください。キャンプ当日はこのようなお喋りを沢山する予定です。何回か練習すれば皆さんもきっとできるようになるはずですよ。

 

 

 

最後に、皆さんに説明しておかなければならない事があります。

実は、「OSの定義」は、大学のコンピュータサイエンス系学科で「オペレーティングシステム」の授業の最初に、およそ1分程で説明される事です。恐らくこれを読んでいる大学生の中には、「これ、授業で学んだよ!」と思った方もいらっしゃるでしょう。

もちろん、これを読んでいる方の多くは、恐らく中高生、あるいは大学の学部1,2年生だと思うので、この内容に始めて触れた方の方が多いと思います。でも、「OSの定義」は「知っていれば凄い事」「周りに自慢できる事」ではありません。むしろ「知っていて当たり前」と言われてもおかしくないような内容です。

知らない事は悪い事ではありません。人間最初は皆何も知らなかったわけですから。これから勉強していけば良いのです。

でも、「OSの定義」を始めて学んだ皆さんは、天狗になる事なく、これからも謙虚な気持ちで、様々な事を学び続けてください。皆さんが知らない事はこの世界にまだまだ沢山ありますよ。

一方で、「OSの定義」なんてもう習ったから知ってたよ、という皆さん。胸に手を当てて、「あなたが本当にそれを理解しているか」確認してみてください。少なくとも、今この場で、初学者に上手く説明できるでしょうか?(もしそうなら、是非参加者としてではなく、講師としてセキュリティ・キャンプに参加してください。私の代わりに笑)

 

あともう1つ。

最後に私の方から皆さんに宿題を出しておきましょう。

先程の禅問答では、ハイパーバイザ上でOSが動いているケースには敢えて触れずにいました。(ハイパーバイザという言葉が難しければ、VirtualBoxに読み替えてみてください)

ハイパーバイザも、I/Oデバイスを抽象化しています(仮想的なI/OデバイスをゲストOSに見せている)し、複数のVMがリソース(CPU時間やストレージ、メモリ等)を譲り合って使えるように管理しています。もちろん、コンピュータの利用効率を上げるためにハイパーバイザの改良も常に行われています。

 

 では、「ハイパーバイザとOSは『本質的に』 何が違うのでしょうか?」

この問いを面白いと思えたら、是非私のテーマに応募してみてください。

seccamp2018(補足3)

注:このページは、セキュリティ・キャンプ2018全国大会x86 OS ゼミにおいて私が担当するテーマ(最先端OS談義)について解説したものです。

詳しくはトップページを御覧ください。

 

「自分がOSと思った物がOSなんだ」論について

SNSを見ていると、時々「OSの定義なんて曖昧なんだから、自分がOSと思った物をOSと言ってしまえばいいじゃないか」という意見を見かけます。

 

まず誤解のないように述べておくと、この意見は間違っているわけではありません。

私も「これまでのOSはこのように考えられたいたが、このように再定義して良いと思う」「これからのOSはこうあるべきだと思う」という議論は積極的にされていくべきだと考えています。

これまでの定義を妄信的に信じて、「定義は◯◯だから、それ以外の物は全てOSじゃないんだ」というのは、新しい発見を阻害するのであまり良くないのではないかと思っています。

これはOSに限らず、あらゆる概念について言える事でしょう。

 

ではこの意見のどこが問題なのかというと、「これまでの定義と対比させていない事」だと私は思っています。

極端な例を挙げましょう。「テキストエディタはOS」という意見はどうでしょうか?

この意見はネタとしては面白いのですが(実際そういうネタもあるようですし)、真面目に考えると「いやいやテキストエディタはアプリケーションでしょ」って思う人が多いわけです。

ここで、「自分がOSと思った物がOSなんだ」論を出すと、「自分はテキストエディタはOSだと思っているからテキストエディタはOSなんだ」という話になってしまい、それを聞いた周りの人たちは「テキストエディタはアプリケーション派」の人たちは「ま、まあ、そう主張するならそれでも良いんじゃない?」となって話が終わってしまいます。

 

もちろんこれで満足できる人にとってはそれでも良いのかもしれませんが、私の場合は、話が終わってしまうと新しい発見が生まれる機会が失われてしまうので、悲しく感じるわけです。

例えば、「OSはユーザーがコンピュータを操作するための様々な機能を提供している。高機能なテキストエディタプラグインを入れれば何でもできる。だからテキストエディタは現代のOSなんだ!」という主張であれば、「そのOSの定義、ちょっと怪しくない?」みたいな感じで話が膨らみますよね。これは大いにアリだと思います。

 

ですから、「自分がOSと定義したものがOSなんだ!」というのは少し乱暴で、「OSの本質は○○だから、✕✕もOSに含める事ができるのではないか」という風な言い方をした方が、他の人と喋った時に考えが伝わって良いんじゃないかなー、なんて事を個人的には思っています。運が良ければ喋っている中から新しいアイディアが出て来るかもしれないですからね。

seccamp2018(補足1)

注:このページは、セキュリティ・キャンプ2018全国大会x86 OS ゼミにおいて私が担当するテーマ(最先端OS談義)について解説したものです。

詳しくはトップページを御覧ください。

 

なんで当日は議論が主体なの?

これを読んでいる皆さんの中には「セキュリティ・キャンプで圧倒的成長をするんだ!」と意気込んでいる方もいるかもしれません。

しかし、キャンプにおけるゼミの時間は案外短いもので、この時間中にやりたい事をやるには正直時間が足りません。これはこのゼミに限らずどこのゼミにも言える事です。

だからこそ、キャンプ当日はその貴重な時間をできる限り有効活用したいと思っています。

 

ここでちょっと質問なのですが、当日、皆さんならどうしたいですか?

もちろん、画面の向こうの皆さんの答えを聞く事はできないのですが、「思いっきりコーディングがしたい!」「自分が知らない事を講師からいろいろ教えて欲しい!」等という意見が聞こえてきそうですね。

はい、そういうゼミにするのも結構真面目に検討しました。でも折角なら当日は当日にしかできない事をしたいですよね。そうでない事は事前学習の時にやっておけば良いと思うんです。

 

では、事前学習と当日での大きな違いは何でしょう?

まとまった時間が取れる事、他の余計な誘惑が無い事など、いろいろ挙げられると思いますが、私は「ゼミの仲間と直接顔を合わせて話ができる事」が一番大きいのではないかと思っています。

いろんな事を勉強したり、開発したりする事は、皆さんのお家でも(やり方を工夫すれば)できますが、他の学生と直接話す機会はなかなかありません。なので、キャンプ当日はできるだけ皆さんがお互いに意見を交換し、盛り上がる事に時間を使いたいと思っています。

堅苦しい表現はやめましょう。「OSについて皆でワイワイ喋って盛り上がったら楽しいと思いませんか?」

その上で、お喋りに疲れたら軽くコーディングをする、みたいなのはどうでしょう?楽しそうに思えてきませんか?