2020年の振り返りと来年の抱負 読みたい本
2020年も終わるということで、今年の振り返りをしていこうと思います。
2020年の振り返り
月ごとの振り返り
1月
何をしていたかあまり覚えていませんが、年末年始の休みは「Go言語でつくるインタプリタ」をやっていた気がします。Rust の楽しさに目覚めた頃で、Rust を使ってやっていました。
結局、最後まで実装しきれていないのですが、それまで自分にとって完全にブラックボックスだったインタプリタの動作原理を学ぶことができ、とても有意義な学習だったと思います。
この後、6月頃からコントリビュートし始めた deno_lint
というリンター開発を行う際にも、間接的にこのあたりの知識が役立っています。
2月
またしても何をしていたか覚えていませんが、ぼちぼち在宅勤務が始まった頃のような気がします。
常にペアプログラミングをする(Zoomをつなぎながら)という環境だったので、MacBook に搭載されているマイクだと心もとないかなと思い、指向性のあるUSBマイクを購入したりしました。ただ、これ以外には特にリモートワークのための設備投資を行っていないので、来年はもう少し投資をしたいと思っています。とりあえず本棚を買わないとやばい。
このくらいから、あらゆるコンサートやライブが中止になりはじめました。僕自身も、とあるライブの全国ツアーに行っていたのですが、愛知、宮城、福岡が終わった後に、残る大阪と東京公演だけ中止になるという事態でした。つらい。
3月
リモートワークになり通勤時間がなくなったことで、多少の時間的な余裕が生まれました。OSS にコントリビュートし始めたり、競プロの精進をがんばったりしていた気がします。
あと、大学院に行くことに思いを馳せていたのも3月だった気がします。英文の成績証明書の発行を郵送で申請したり(成績が悪くて絶望)、TOEFLの公式問題集を買ったりしていました。この頃の気持ちの動きは退職エントリでも少し触れました。
4月
特に何もなかった気がします。社会人2年目になって、「新卒」という肩書が使えなくなりました。
5月
ゴールデンウィークは競プロのライブラリ整備や精進をがんばっていたっぽいです。ライブラリのように、汎用的に使えるデータ構造やそのインタフェースを抽象的に考えることは、Rust のスキルを向上させる上ではある程度の効果があったように思います。
出来心で転職サイトに登録しはじめたのが確かこの頃だったと思います。
6月
自分の中での今年の大きな転機その1、deno_lint
へのコントリビュートを開始しはじめました。初めての PR が6月11日だった模様。
最初は ESLint や typescript-eslint のルールを移植していくということをやっていましたが、移植が一段落した頃からは、ルールのリファクタリングとか、false positive(つまり、本来はまったく問題ないはずなのに、誤ってリンターがエラーとして報告してしまうこと)が起きるルールの修正、テストケースを充実させる、などの方向でコントリビュートを続けています。
deno_lint への commit 量
7月
なんやかんやあって転職をすることに決めたのが7月だったと思います。
最初は出来心で転職サイトに登録しただけだったのに、カジュアル面談からぬるりと選考に進んで、気づけばいくつか内定をいただくことができました。
8年ぶりくらいに自作PCを組みました。Rust での開発をしていると MacBookPro のファンがうるさかったため、マシンパワーのあるPCが欲しくなりました。
CPU は Ryzen9 3900X で、他のパーツはお買い得そうなものを適当に選び、OS は Manjaro にしました。
目論見通り、開発がめちゃくちゃ快適になって生産性アップに(多分)繋がりました。良い買い物でした。
引き続き OSS は deno_lint
をメインにコントリビュートし続けていました。
8月
友人たちと北海道をキャンピングカーで走り回りました。学生時代に戻ったみたいで楽しかった。人生最後の青春。
deno_lint
をやっているうちに、deno
本体にも変更を加える必要が出てきて、本体側に初めてコントリビュートをしました。
その後もちょこちょこと本体側にコントリビュートすることができました。来年はもっと貢献できたらいいな。
deno への commit 量
9月
3年くらい使ってきた iPhone X の画面が浮きはじめてきた(バッテリーの膨張?)ので、iPhone 12発売までの繋ぎのつもりで iPhone SE2 を購入しました。(結局今も SE2 を使い続けている……)
毎週日曜日に、1週間の活動報告をブログに投稿するという試みを9月27日から始めました。だんだん手抜きになっていますが、今のところ継続できています。
誕生日でした。26歳になり人生に焦りを覚えはじめる。
10月
前職の最終出社でした。
有休消化期間に、2泊3日で伊豆にぼっち開発合宿をしにいきました。OSS開発がとてもはかどりました。もうちょっと長く滞在しても良かった。
下田の寝姿山からの景色
宿の部屋からの眺め
11月
転職先に入社しました。前職が超大企業だったのでいろいろとカルチャーのギャップを感じつつも、一番懸念していた「人間関係がうまくいくか」という心配は完全なる杞憂となり、安心しました。技術的にもエキサイティングな経験を積むことができています。
OSSコントリビュートも引き続き行っていましたが、複雑な機能を実装する際や、機能について議論するときなどに、自分の知識不足を感じる場面が増えてきました。表面的な理解だけでもコントリビュートをすることはできますが、「ただコントリビュートするだけ」ではなく、もっと上のレベルに到達したいという思いが強くなっていきました。
そのためには盤石な基礎を身につけること、これが一番の近道と考え、コンピュータサイエンスとその周辺分野について体系的な学習を開始しました。
12月
投資信託を始めました。
アドベントカレンダーに参加し、以下の5本の記事を書きました。もともとあまり外部発信が得意ではなかったのですが、アドベントカレンダーというある種の強制力によって多少は記事を書くのに慣れることができたような気がします。
今年のアドベントカレンダーは終わりましたが、外部発信は続けていけたらいいなと思います。
OSS活動のまとめ
今年1年、OSSに出した Pull Request をまとめてみました。(my-weekly-contributions という自作スクリプトをちょっと書き換えて出力しました)
長いので折りたたみにしておきます。
2020年 OSSに出した Pull Request 一覧 (計161個)
denoland/deno_lint
- refactor(no-regex-spaces): switch to
asset_lint_err!
macro - refactor(no-new-symbol): switch to
asset_lint_err!
macro - chore: delegate FsModuleLoader to deno_core
- refactor(no-namespace): switch to
assert_lint_err!
macro - feat(website): add meta tags for open graph
- refactor(no-mixed-spaces-and-tabs): switch to
asset_lint_err!
macro - fix(valid-typeof): allow comparison with variables other than undefined, null, Object
- fix(prefer-as-const): handle
var_decl
that has nodecl
- refactor(no-misused-new): switch to
asset_lint_err!
macro - feat(plugin): expose ControlFlow to JS
- refactor(getter-return): replace std::mem::take with Option::take
- fix(getter-return): proper handling for function in getter
- fix(no-inferrable-types): handle private class fields
- refactor(no-irregular-whitespace): switch to
asset_lint_err!
macro - chore(readme): update readme
- fix(no-ex-assign): handle nested assignments correctly
- refactor(no-inner-declarations): switch to
asset_lint_err!
macro - fix(no-inferrable-types): handle nested things properly
- refactor(no-global-assign): switch to
asset_lint_err!
macro - fix(no-dupe-keys): deal with BigInt keys
- fix(no-func-assign): handle FnExpr and nested assignments
- refactor(no-fallthrough): switch to
asset_lint_err!
macro - refactor(no-extra-semi): switch to
asset_lint_err!
macro - fix(prefer-const): ease handling for destructuring assignment
- refactor(no-extra-non-null-assertion): switch to
asset_lint_err!
macro - refactor(no-extra-boolean-cast): switch to
asset_lint_err!
macro - refactor(prefer-const): switch to
asset_lint_err!
macro - refactor(no-empty-interface): switch to
asset_lint_err!
macro - refactor: delegate DropSpan to swc_ecmascript::utils
- refactor(no-dupe-keys): switch to
asset_lint_err!
macro - refactor(no-dupe-keys): switch to
asset_lint_err!
macro - refactor(no-dupe-else-if): switch to
asset_lint_err!
macro - refactor(no-dupe-class-members): switch to
asset_lint_err!
macro - refactor(no-dupe-args): switch to
asset_lint_err!
macro - refactor(no-debugger): switch to
asset_lint_err!
macro - feat: add require-await rule
- refactor(no-control-regex): switch to
asset_lint_err!
macro - refactor(no-constant-condition): switch to
asset_lint_err!
macro - refactor(no-cond-assign): switch to
asset_lint_err!
macro - refactor(no-compare-neg-zero): switch to
asset_lint_err!
macro - refactor: use HashMap for GLOBALS instead of array
- fix ban-unused-ignore and ban-unknown-rule-code
- feat(example): add
--rule
option to dlint - fix(ControlFlow): handle block execution status correctly
- fix(no-undef): handle hoisted class declarations
- fix(camelcase): provide better hint message when object pattern has default value
- fix(no-undef): handle class declarations hoisting
- fix control flow analysis on for statements
- fix(camelcase): fix hint for object keys
- fix(no-empty): fix contains_comments logic
- refactor: introduce typed message & hint
- refactor(no-class-assign): switch to
assert_lint_err!
macro - refactor(no-case-declarations): switch to
assert_lint_err!
macro - refactor(getter-return): switch to
assert_lint_err!
macro - feat(example): add all-rules subcommand
- refactor(for-direction): switch to
assert_lint_err!
macro - refactor(ban-untagged-ignore): switch to
assert_lint_err!
macro - refactor(ban-types): switch to
assert_lint_err!
macro - refactor(constructor-super): switch to
assert_lint_err!
macro - refactor: use
once_cell
instead oflazy_static
- test(no-constant-condition): add tests to make sure else-if is handled
- refactor(tests): use macro to have messages & hints be asserted
- fix typo
- fix(no-dupe-keys): handle nested objects & getter and setter with the same name
- fix(no-constant-condition): handle nested stuff
- test: add
assert_lint_err
macro to assert messages and hints - fix(no-empty): handle nested empty blocks in switch
- refactor: switch to
impl Into<String>
to avoid unnecessary allocation - fix(no-dupe-args): handle nested function's arguments and remove unnecesarry allocation
- fix(no-cond-assign): handle nested stuff
- refactor: use matches!
- refactor: remove Arc/Rc
- fix(getter-return): use ControlFlow to check if getters return something
- chore: enable prefer-const again
- fix(prefer-const): refactor & handle hoisting
- fix(prefer-const): handle nested assignments correctly
- fix(no-case-declarations): handle nested switch statements
- fix(control_flow): handle class constructors
- fix(no-compare-neg-zero): handle nested stuff
- fix(no-class-assign): increase tests and fix to pass them
- fix(prefer-const): treat param of catch clause like thet of function
- fix(prefer-const): handle
+=
and-=
correctly - add prefer-const rule
- fix(no-async-promise-executor): handle nested or parenthesized stuff
- fix(no-array-constructor): handle nested stuff
- fix(getter-return): handle nested stuff
- fix(for-direction): handle nested for loops
- [WIP] Refine explicit-function-return-type
- test: print source code when assertion fails
- fix(defualt-param-last): handle nested violations
- fix(no-unsafe-finally): catch violations in nested finally blocks
- add Camelcase rule
- Chore: fix and unify visibility
- Chore: sort rules alphabetically
- chore: remove unnecessary allocation
- [POC] Lint parallelly
- fix(constructor-super): handle nested classes
- adjacent-overload-signatures
- no-control-regex
- chore(no-extra-non-null-assertion): add to readme
denoland/deno
- refactor(cli/flags): change allow_read/write/net types from bool to Option<Vec<T>>
- refactor(runtime): return iterator from resolve_addr
- chore(runtime): fix typo
- feat(unstable): add Deno.resolveDns API
- refactor(cli): add async version of resolve_addr function
- chore(test): increase timeout duration on macOS
- docs(lint): Update available rules & add link to doc site
- feat(core): Add FsModuleLoader that supports loading from filesystem
- fix(watcher): watcher doesn't exit when module resolution fails
- refactor(cli): Remove unnecessary conversion into BTreeMap
- fix(fmt, lint): Make sure that target paths are not directory
- build: update dlint to v0.2.10
- feat(unstable): Support --watch flag for bundle and fmt subcommands
- refactor(watch): create single watcher for whole process
- fix(logger): change log level to which prefix is added
- fix(fmt,lint): do not print number of checked files when quiet option is enabled
- fix(fmt, lint): not print the number of checked files when quiet option is specified
- WIP feat(test): add timeout feature [HELP WANTED]
- feat(fmt, lint): show number of checked files
- chore: replace nested function declarations with arrow functions
- chore: remove unreachable code to pass linter
- feat(cli/lint): Add support for reading input from stdin
- fix(cli/lint): use
deno_lint::rules::get_recommended_rules
to get rules - chore(std/encoding): disable
no-control-regex
- test(url_test): disable
no-self-assign
rule - fix(std/wasi): make parameter & return value of
syscall
typed
kenkoooo/AtCoderProblems
- [replacement with sqlx] StreakUpdater
- [replacement with sqlx] RatedPointSumClient
- [replacement with sqlx] ProblemsSubmissionUpdater
- [replacement with sqlx] ProblemInfoUpdater
- [replacement with sqlx] SubmissionClient
- [replacement with sqlx] SimpleClient
- [replacement with sqlx] LanguageCountClient
- [replacement with sqlx] ContestProblemClient
- [replacement with sqlx] AcceptedCountClient
- [replacement with sqlx] VirtualContestManager
- [replacement with sqlx] UserManager
- refactor(backend): fix module style
- [replacement with sqlx] ProgressResetManager
- [replacement with sqlx] ProblemListManager
- [WIP] replace diesel with sqlx
rslint/rslint
- Feat: add shebang handling to lexer and parser
- Refactor: make getter-return be consistent with others
- Feat: add no-setter-return
- Fix: allow
cons
method to work if there is noelse
block - Chore: allow macros to deal with trailing commas
- Docs: Add
no-await-in-loop
doc
hatoo/cargo-snippet
- doc(README): update
- Add meta word
doc_hidden
to snippet attribute - Fix the parsing way of doc comments (#23)
- Make backslash, tab, newline, etc. be processed properly
- Display non-ascii space characters as they are
- Output doc comments in 3-slash-style
typescript-eslint/typescript-eslint
- docs(eslint-plugin): add info about
allowDirectConstAssertionInArrowFunctions
option - fix(eslint-plugin): [adjacent-overload-signatures] fix false positive on call signatures and a method named
call
rust-analyzer/rust-analyzer
launchbadge/sqlx
tanakh/cargo-atcoder
2021年の抱負
コンピュータサイエンスの勉強を続ける
まず、今年の最後のほうから徐々に開始したコンピュータサイエンスの勉強は、来年も引き続きやっていきたいです。いきなり型理論の本(TaPL)を読もうとして挫折したので、大学の教養レベルからじっくりと勉強を進めていきたいと思います。一方で、コンパイラの教科書は今の知識でも読み進められそうな感じがしたので、手を動かしながら読み進めていきたいと思います。
以下、現在読み進めている本および来年読み進めていきたい本です。
- 数理論理学
- 型理論、意味論
- オートマトン、計算可能性
- コンパイラ理論
- OS
コンパイラ3種の神器
英語を使えるようになる
ソフトウェアエンジニアとして生きていく中での英語の重要性というのはもはや語るまでもないと思いますが、自分の場合は OSS に積極的に関わるようになってからさらにその重要性を実感することになりました。
具体的には、英語のドキュメントを読むなどの受動的なスキルのほかにも、話す、書く、など能動的なスキルの必要性が、自分の中で増してきた形です。
日本の伝統的英語教育のおかげ(?)でリーディングに関してはできなくもない、しかしリスニング、スピーキング、ライティングはかなり怪しい、というのが現状なので、本腰を入れてこれらを磨くための勉強を始めました。
とりあえず以下の教材をやり始めています。
- 瞬間英作文(簡単な文章を素早くアウトプットするため)
- 英語耳(リスニングが壊滅的なため)
- 速読速聴・英単語 Daily1500(シャドーイング用)
オンラインの英会話レッスンを受講したり、あと数値的な目標があったほうがモチベーションが続きやすい気がするので、TOEICなどの受験も検討していきたいところ。(現時点での自分の英語力がよく分からないので、数値化したいというのもある)
OSSコントリビュートを続ける
もはや生活の一部がOSSコントリビュートになりつつあるので、いまさら「抱負」として掲げなくても継続していくとは思うのですが、やはりOSSコントリビュートは続けていきたいです。OSSコントリビュートをする自分の中での一番のモチベーションは「楽しいから」という単純なものなので、楽しむ気持ちをもちながらやっていけたらいいなと。
(そういえば、Linusの自伝のタイトルも Just for Fun(邦題: それがぼくには楽しかったから) ですね!)
おわり
みなさんよいお年を!
Discussion