でこてっくろぐ ねお

UbieのSRE。でこらいふろぐ(http://dekolife.hatenablog.com/)の姉妹版。デコテックログ(deko tech log)である

コンピュータ・サイエンスやりたくなって1年ちょっとコツコツやってる/やったことたち

私は経済学部出身でWeb系エンジニアをやっているわけだが、コンピュータ・サイエンスはずっと学びたいと思っていた。 そんな中、Turing Complete FMというpodcastに出会ってその気持ちが更に強くなり、ここ1年くらい、子育ての合間にコツコツコツコツとコンピュータ・サイエンス周りのことを学んでいた。このエントリでは、学んでいたこと、及び子育ての合間にどうやって時間を捻出しているのかをまとめた。

目次:

やっている/やったこと

コンピュータサイエンス系のPodcastを聞く

Turing Complete FMが私のコンピュータ・サイエンス熱を燃やしてくれたpodcast。全部のエピソードを2~3回ずつくらい聞いた。"低レイヤの話めっちゃ面白いな" と、やる気がかなり出るのでオススメ。 聞き始めた頃は内容のほとんどが理解不能だった。以下に紹介しているpodcastのMisreading Chatもそうだが、何度も聞く、及びこのエントリに書いているいろいろなコンピュータ・サイエンスの習得の努力を行うことで、どんどん内容が分かるようになっていくのが最高に楽しいのであった。 turingcomplete.fm

Turing Complete FMの更新が止まってしまったので最近はMisreading Chatをよく聞いている。 2回ずつくらい聞いた。たまに関心のない分野のものがあるのでそれは飛ばして聞いている。 2人の掛け合いが大変楽しい。心が安らぐ。

misreading.chat

なお、英語のコンピュータ・サイエンス系のpodcastも聞きたいと思いチャレンジしたのだが、私の英語レベルでは全く聞き取れなかったため、もっと簡単な、コンピュータ・サイエンス関係なく英語を学ぶためのpodcatも1日時間を決めて聞いている。

コンパイラを書く(ペンディング中)

コンピュータ・サイエンスを学ぶにあたって何か手近な題材ないかなと思っていたら、上記Turing Complete FMの提供者であるRui Ueyamaさんがいい感じのチュートリアルを出してくれていたので(正確な動機はProgramming系のyoutuberになりたくて動画を探したら見つけてRuiさんの作ったものだったし興味範囲にも合致していたからやり始めた、という感じだけど、まぁそこはどうでもよい)、Cで書かれているチュートリアルの内容を当時興味があったRustに置き換えて一つ作ってみた。 手軽に言語が動いて楽しかった(これはコンパイラではなくインタープリタだけど)。 dekotech.dekokun.info

そして、Rui Ueyamaさんが低レイヤを知りたい人のためのCコンパイラ作成入門を執筆し始めたので、それを追って一緒にコードを書いていた。一時期更新が止まっていたのでそこで私の実装を止めていたら最近一気に加筆修正が進んでおり、だいぶ置いてかれてしまっている… www.sigbus.info

dekotech.dekokun.info

私の書いてたコードは以下

github.com

低レイヤを知りたい人のためのCコンパイラ作成入門、これまでBNFで書かれていた部分がちょっと分かりづらかったが、最近EBNFに書き変わって格段に分かりやすくなった感じがする。また進めていきたい。

以下エントリ、めっちゃ尊敬していて、9cc一通り終わったらRustでやりたい、が、本当に半年以上拘束されるだろうしよく考えねば、とは思っている。 qiita.com

9cc終わったら以下の感じでRustやってみてもいいかも!

OSの作り方を学ぶ

OS作ってみたいよねと思ったので 30日でOSが作れるという本を90日くらいかけて終わらせた。

以下、始めたエントリは書いたけど終わったエントリ書いてないね… dekotech.dekokun.info

それまでOSが何をやっているのかよくわかってなかったが、本を読んで、いろいろなことを学べた。本格的にC言語を書いたのも初めてだったので学びが多い。 この本によってかなりTuring Complete FMの内容が理解できるようになって嬉しかった。

このエントリに対しての感想として以下エントリを教えてもらった。良さそう。次OSやる時はxv6見てみるぞ! 何がOS実装の理解を難しくしているのかとGNU assemblyの準備 - Qiita

RustでOSを書く(ペンディング中)

上記30日OS本の内容をRustに移植しようといろいろやっていたが、残念ながら途中で頓挫した。 何かうまくいかない際のデバッグの方法が難しかった。デバッグのために文字列出力させていたけどたまにうまくデバッグ文字列が表示されない、sereal port経由でoutputするか…となったけどそこもうまくいかず、一旦ペンディングしたのであった。

github.com

ので、RustでOSを書いている文献を探し、以下Writing OS in Rustをみつけてやっていた。

os.phil-opp.com

Writing OS in Rustを読みつつ書いてるリポジトリはこちら。 Writing OS in Rust、最近色々書き直されているようでそれに追随できておらずこちらも今ペンディング中。

github.com

Rustを学ぶ

低レイヤを触りやすい言語、及び以前Haskellを学んでいたこともあり型システムがしっかりしている言語を一つ学んでおきたいという気持ちがあって、そこにちょうどRustがあったので学び始めた。 以下本を購入して読み通すことで、Rustの知識以外のいろいろなことも学ぶことができて大変良かった。 具体的には、当時の私はHeapとStackがプログラムの中でどう使い分けられているのかとかそういう知識があまりなかった(上記あるように事前に30日OS本は読んでいるので、OSからみてどう使い分けているのか、というのは知っていたが)が、この本を読むことである程度知ることができた。

https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Rust-Jim-Blandy/dp/4873118557/ref=asc_df_4873118557/?tag=jpgo-22&linkCode=df0&hvadid=295706574430&hvpos=1o2&hvnetw=g&hvrand=14566952903449752437&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1028853&hvtargid=pla-526453140636&psc=1&th=1&psc=1www.amazon.co.jphttps://www.amazon.co.jp/dp/4839919844/ref=cm_sw_r_tw_dp_U_x.M52CbQZYPEB2https://www.amazon.co.jp/dp/4839919844/ref=cm_sw_r_tw_dp_U_x.M52CbQZYPEB2

プログラミングコンテスト系のサービスをやってみる

アルゴリズムやデータ構造周り楽しそうだなぁと思っていたのでそのあたり学ぶために以下をやっている。

LeetCode

何かやりたいなと思っていた時にちょうど以下エントリを読んで、"LeetCodeって面白そうじゃん" となったため1~2日で1問ペースで解いていっている。 leetcodeは、回答をsubmitして失敗した際に失敗した問題が分かるのが勉強しやすくて好き。 全部Rustで書いてる。

kumagi.hatenablog.com

Atcoder

LeetCodeのコンテストが毎週日曜日にあるのだが、毎週日曜日は消防団の訓練で外出していることが多くあまり参加できていなかった。そんな時、会社の若者が"コンピュータ・サイエンス学びたい" という話をしていたので、"じゃ、一緒にAtcoderでコンテスト出てみよう" と誘った。 今度その若者と一緒に初参加予定。楽しみ。

計算理論の初歩を学ぶ

初歩的なところから学んでいきたい。そもそもまだ計算理論ってのがなんなのかもよくわかってないんだけど。

白と黒の扉を読む

コンピュータ・サイエンスを文献で学びたい、という思いが強くあったがどの本がいいかわからず、検索していたらこの本を紹介しているエントリがあった。かつて購入して読んでいたこともあり、再度読んでみた。 小説なので読みやすく、形式言語オートマトンについて学べる。

大学の教科書で使われているような書籍で学ぶ

id:hokkai7go さんに コンピュータ・サイエンス学びたいけどどうすればいいかねぇ という話をしたら大学の教科書をおすすめされたので、上記白と黒の扉に記載してあった参考文献の中の一番基本的に見えた、計算理論の基礎を買って読んでいる。 最初に数学の基本的な事項を学び、その後有限オートマトンと正規言語、非決定性有限オートマトンと決定性有限オートマトンの等価性、などなどあたりまで読んだ。まだ半分くらい(というか全3巻のうち、1巻の半分くらい)なので先は長いが、とにかく面白い。

システムのパフォーマンスについて知る

会社で詳解 システム・パフォーマンス輪読会がやっていたので途中から加わった。 このエントリの中では一番仕事に役立ちやすい分野のような気がする。 現代の(と言ってもそんなに新しくはないけど)LinuxSolaris)について詳しくなれる(まぁ、Solaris特有のところは結構読み飛ばしつつやってる)。 今はその輪読会がそのまま、 パフォーマンス計測ツールを作ろう の会に変わって各人Cやらなんやらでツールを書いている。私はRustでstrace的なものを作ってみよう!ってのを最近始めた。

まだ始めたばかりなのでほとんど何もできていない。 github.com

続けるための仕組み

思想の骨子は以下エントリにかかれている通り。とにかく子供がいるとまとまった時間をとるのはかなり難しいため、1日ほんの少しでいいからターゲットを決めてコツコツ進めていく、ということを大切にやっている。 nhiroki.jp

"カンバン仕事術" っていう本に書いてあると id:Songmu さんに教えてもらった始めることを終わらせ終わらせることを始める という言葉がとにかく気に入っている。

しかし、コツコツするにしても、人生の幸せにおいては子供と遊ぶのも睡眠も仕事も重要であり、子供と遊んだり子育てをしつつ仕事をしつつ睡眠を毎日9時間とか取りつつという生活をしていると、普通の意識でいるとコツコツやっていく時間すらほぼなくなる。が、まぁ以下ちょっとずつ時間をとれるような工夫をいくつかしてコツコツ頑張っている。

やることを書き出し日々メンテする

Todoistに日々やる細かいことと勉強したいことを繰り返し予定で全部入れ、それが全部達成できることを狙って日々過ごす。しかし、睡眠時間のほうがより重要なので、終わってなくても寝る。 終わってない日々が続く場合はやることを減らすなど、無理のない範囲でできるようにメンテナンスする。

不要なことをしない

毎月、今月やらないことを決めてそれを徹底している。例えば、 今月は一切マンガを読まない 今月ははてブはテクノロジーカテゴリ以外読まない など。それを毎月積み上げていっている。 以下TED動画で、今月やることやらないことを決めて徹底しろって言っていて、この動画を一時期ひたすらシャドウイングしていたこともあって頭に完全に刷り込まれた。

www.ted.com

最近は、 これやりたいな と思ったことは全部spreadsheetに順位付けして放り込んでいる。将来これを頭からやっていくぞ! と思うことでだいぶやりたい心が抑えられる。本当にやりたいことは、分解して上記日々のTODOに突っ込んでいっている。

最近の1日

毎日こんな感じで生きてる。先週末に抜歯したら歯が痛くてここ数日自分の時間に集中できてない、という問題はあるのだけども… ここに、定期的に消防団の訓練などが差し込まれてくる。

  • 朝5~6時起床、子供と遊びつつ細々とした家事を行う。朝ごはんのセッティングも
  • 〜7:00 子供と散歩
  • 〜8:00 子供に朝ごはんを食べさせつつ自分の朝ごはんを食べ、食器の片付けなどなど
  • 〜8:40 おかあさんといっしょやいないいないばあを観せつつ妻が子供を見てくれつつ私は子供をみたりleetcodeの問題を読んだり
  • 子供を保育園に送りつつ会社へ。移動時間にPodcastを聞く
  • ランチ時間に高速で食事をし、このエントリで書いたような、やりたいことをやる
  • 20:00 家に戻ってくる(もうちょっと早くできるので早くしたい。終業後、15分位ダラダラしてしまう)
  • ~20:40 お風呂、食事、翌日の朝食の準備
  • ~21:30 このエントリで書いたような、やりたいことをやる
  • 就寝。疲れたと感じた日はちょっと早く寝る。

ディープライフ

日々めっちゃ細切れの時間しか取れないため、ディープライフを意識してやっている。この発表資料読んで、 私も子供と目一杯遊ぶぞ! という気持ちになれました。matsumotoryさんには大変感謝しております。

speakerdeck.com

蛇足

このエントリ、消防団の話がちょくちょく出てくる。 それを減らせばコンピュータサイエンス学べるのでは というのはあるのだが、消防団は以下、第三次世界大戦を生き延びるために入っているのでこれも優先度は結構高いのであった。 消防団、体が鍛えられて結構便利。というか冷静に思い返すと、消防団は家族との触れ合い同様に数少ない私のストレス解消手段として機能している気がした。

dekolife.hatenablog.com