kdnakt blog

hello there.

CodeCraftersでRedisを実装するコースを受講した

CodeCraftersというサービスを使い始めたので感想を書いておく。Rustでのスレッド処理など普段やらないことを実装できたので面白かった。

codecrafters.io

[きっかけ]

こちらのツイートを見て、CodeCraftersのことを知った。

3, 4年くらい前に100DaysOfCodeをやって以来、あるときは本を写経したり、あるときはLeetCodeを解いたり、あるときはゲームを作ったりして、できるだけ毎日GitHubに草を生やしてきた。
t_wadaさんも、現役プログラマでいるためには毎日コードを書くのが良いとおっしゃっていたので、それを(できるだけ)実践している形だ。

常にネタは探していたので、草を生やし続けるのにちょうどいいな、ということでCodeCraftersを初めてみた。

[やったこと]

最近Rustをちまちまと勉強しているので、言語としてはRustを選択してみた。
他にもGoとPythonに加えて、2022年1月現在はベータ版として、コース数は少ないもののJavaScriptRubyHaskellC#PHP、C、Java、Elixir、Crystal、Clojure、Nimが選択できる。

一番上にRedisを作るコースが上がっていたので、そちらを選択した。

無料版だと1日1ステージずつしか進められないので(有料版だと無制限になるらしい)、7日間かけて最低限のRedisサーバを実装した。

コースの右上の設定ボタンから、「Publish to GitHub」をクリックしてGitHubと連携すると、実装したコードをGitHubに公開することもできる。

今回実装したのはこちらのリポジトリ

github.com

[感想]

ローカルにクローンしたリポジトリで、ステージごとの課題を実装して、git pushコマンドを実行すると、CodeCraftersのサーバでテストが実行される。

テストコードは公開されているので、失敗した場合は内容を確認することができる。
幸い、そんなに難しいテストではなかったので、コミット前にGoで書かれたテスト内容を見て、手元の開発環境でredis-cliコマンドを利用して動作確認するだけでパスすることができた。

github.com

かかった時間は長くて1ステージ30-60分程度で、大体最初に提示された見積もりと一致している。自分は普段週1で30分Rust By Exampleを読みながら手を動かす程度で、ほとんどRustを書かないので、文法や標準ライブラリについて調べながら実装を進める必要があったため、このような時間配分になった。
たぶん、Rustを書き慣れてる人がであれば、1ステージ5-10分で終わるような内容だろう。ただ、作るもの(Redis)自体はとても複雑なので、もっとキレイなコードで多機能なものを目指すのならば、Rustに習熟している人でもそれなりに楽しめるのではないかと思う。

反省点としては、Redisもどきができたといってもほんとに最低限のものしかできなかった。シンプルな文字列のSETとGETに加えて、複数クライアントからの同時接続の受付と、ミリ秒単位での有効期限の指定くらいである。
Redisの使うRedis serialization protocolは、とにかく改行で区切って固定の位置に来た文字列をコマンドとして判定する程度で、本来やるべきコマンドの長さチェックもできていない。複数のクライアントから接続できるとは言っても、両者が同じデータを操作できない残念な実装である。

今後追加の実装を進めて、数値型や配列型への対応や、その他コマンドの実装、認証やTLSへの対応など、いつかできたら、と思う。
CodeCraftersのサイト上では、模範回答や他の参加者のコードも見ることができる。最初のツイートにあった「ベストプラクティスを学べる」部分はまだ実感できていないので、もうちょっと使い倒したい。

[まとめ]

  • CodeCraftersというサイトでRustでRedisを実装するコースを受講した
  • git pushで自動テストが走って採点してもらえる体験はなかなかよかった
  • 最低限の実装でもテストが通るので自分のようなRust初心者でもなんとかなった