raphine.hatenablog.com

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

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

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

上の記事の内容をある程度実践している。（完璧にとは言いません。完璧なんてものは存在しないので）

研究室配属前の学生である。

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

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

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

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

さて、もう少し前置きを続けさせてください。

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

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



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

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

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

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

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

1. 論文を読もう

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

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

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

論文読もうにもどんな論文を読めば良いかわからない。

論文をどう読めば良いか分からない。

英語辛い。

そもそもモチベ沸かない。

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

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

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

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

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

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

そもそも論文って何なのでしょう？

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

情報系の論文の多くは、

世の中に存在する解決されるべき（解決すると皆が喜ぶ）問題を示す。

その課題に対する他の誰かが思いつかなかった（或いは思いついていても以前は有用ではなかった）解決策、及びその実装方法を示す。

その解決策が実際に解決できた事を実験結果を用いて示す。

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

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

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





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

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

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

d.hatena.ne.jp

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

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

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

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

さて。

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

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

例えば、

「起こりうるかもしれない未来の話」を仮定して問題設定をしているかもしれない。

問題設定が物凄く条件を限定した、実社会では起こり得ない事かもしれない。

解決策を実アプリケーションで採用するには課題があるかもしれない。

そもそも実アプリケーション上では起こっている問題を解決できないかもしれない。

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

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

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

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

2. 手を動かそう

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

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

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

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

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



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

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

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

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

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

自分の知識を口に出して説明する事で、理解の浅さに気づいたり、より知識を定着させる事ができる。

自分の意見を説明する事で、その意見の論理的に弱い部分を周囲に指摘してもらえる。

他の人の知識や意見を学ぶ事ができ、価値観が広がる。それによって新しいアイディアが生まれる可能性が増える。

といった所でしょうか。

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

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

4. アウトプットする

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

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

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

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

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

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

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

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



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

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

raphine.hatenablog.com

22歳以下の学生なら参加可能で、費用負担０なので、是非ご応募ください！

応募〆切は5/28です。

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