Leetcodeの練習感想
概要
一般社団法人ソフトウェアエンジニアリング協会の方にLeetcodeの指導をしていただいたので、その感想を共有します。
前提と自己紹介
私は、
- 情報系大学院 修士修了
- SIerにてSE/プロジェクトマネージャーとして勤務
- 現在は42 Tokyoに在籍し、基礎カリキュラム修了
という経歴です。
過去に、Leetcodeの問題を解くことをやったことはありました。ただ、「入出力が一致し、アクセプトすればOK」というやり方をしていました。
そのようなバックグランドの人間が、ソフトウェアエンジニアリング協会でのLeetcodeを通して何を学んだのかを、書いていきます。(現時点で30問程度しか解いていないので、まだまだ練習途中の感想です。)
目的
この活動の私にとっての目的は、ソフトウェアエンジニアとして働くために、「ソフトウェアエンジニアの常識を身につける」です。
つまり、
- ソフトウェアエンジニアならば感じることを、感じられる。
- ソフトウェアエンジニアが常識の範囲内と思うコードを書ける。
- コードを見たらソフトウェアエンジニアと同じようなコメントができる。
- ソフトウェアエンジニアならばしている調査を、実施できる。
最後の部分は、具体的な説明がありました。
例えば、「公式ドキュメントを見たか」という質問は「その中身を知っているか」という意味ではないです。「自発的に見たい気持ちになれたか」です。専門家はそれなりの頻度で「見たい気持ち」になります。その気持ちが湧いたかを聞いています。これが知っているか知らないかできたかできないかから脱却するということです。
つまり、「Leetcodeでアクセプトされる」ということではなく、それ以上の常識を身につけることを目的としています。
考えの背景にある、「専門家集団」や「常識」についての詳細はこちらで説明されています。
やったこと
以下の流れに沿って実施しました。
新井さんの問題順番にやっていきます。一日一問で最初はいいでしょう。答えを見ずに考えて、5分考えて分からなかったら答えを見てください。答えを見て理解したと思ったら、答えを隠して書いてください。筆が進まず5分迷ったら答えを見てください。そして、見ちゃったら一回全部消してやり直しです。答えを送信して、正解になったら、まずは一段階目です。次にコードを読みやすくするようにできるだけ整えましょう。これで動くコードになったら二段階目です。そしたららまた全部消しましょう。今度は、時間を測りながら、もう一回、書きましょう。書いてアクセプトされたら文字消してもう一回書きましょう。これを10分以内に一回もエラーを出さずに書ける状態になるまで続けてください。3回続けてそれができたらその問題はひとまず丸です。
その後、他の方の書いたコードのレビューを実施します。レビューを通して以下のような感覚を身につけます。
「専門家集団は、だいたい同じものを見たらだいたい同じ反応をする」のだから、単純な話として、同じものを見て同じ反応をすれば、同じ品質のコードが書けるはずですよね。だって、そのクライテリアにあてはまっていなければ、修正したいなあ、と思うわけなんですから。
つまり、「自分が講師と同じ反応をすることができるか」「講師と同じコメントをつけることができるか」を意識してレビューを行います。
感想
雑多な感想になりますが、いくつかのポイントごとに感想を述べていきます。
ワーキングメモリの重要性を体感した
他の人が書いたソースコードを読む際に、脳のワーキングメモリを消費しないコードであることは重要です。コードは書くことより、読まれることの方が多いです。
例えば、「変数名から分からない情報」「覚えておかないといけない情報」「パズルとして推測が必要な情報」があると、読み手のワーキングメモリを消費します。
ソースコードが常識に沿っていない場合、たとえば変数名が常識に沿っていなければ、その変数が表しているものを推測するためのパズルを同僚に強いることになります。
このようなワーキングメモリを消費するコードに対しての指摘を通して、ワーキングメモリの重要性を体感しました。
自分が認知負荷のあるコード(ワーキングメモリを消費するコード)を書いていたことを知った
今まで自分が書いていたコードは、認知負荷のあるコードでした。それが当たり前になっていました。その状態でコードを書く練習をしていても、「認知負荷が存在すること」を気付けないし、その負荷がない状態がどういうものかを察することができません。
一度、自分が常識を身につけ、その常識に沿ったコードを書く習慣を身につける。その経験を通して初めて、「今までの自分が認知負荷のあるコードを書いていた」という事実に気づくことができました。
他者との向き合い方について考え方が改まった
私が活動を始めて一番最初にいただいたコメントがこれです。
ある種の「他者の発見」という話なのだろうと思っています。
自分の外に規範があって、それとの距離をどうするかという話です。
さまざまなガイドラインが存在しており、どれに従うのが素晴らしいとかそういう話じゃないです。一緒に働く同僚の負担を少なく開発できることが大事である、と理解しました。
専門家集団の常識の範囲を感じた
練習を始めた当初は、多くのコメントに対して「そんなところが気になるのか!」と、ある程度驚きを持ってレビューコメントを見ていました。いまは、驚きのある指摘が減ったように思います。もちろん0ではないですが、ちょっとずつ少なくなっていってる感じです。
練習を行った結果、今は驚きというよりは「そりゃそうだ。当然そこは気にするべきだった」という感想になることが多くなりました。
3回繰り返すことで違和感と向き合う
練習における最終ステップ、「3回繰り返す」というのがすごく重要です。
練習前は「3回繰り返すなんて単純作業を繰り返すだけ。暗記するんじゃないんだから無駄なのでは?」みたいな節を感じていました。今までの人生を思い返しても、繰り返すことは九九や漢字を暗記する時しか経験してません。
実際にやってみて感じた意義は、「徹底した違和感の追求」と言う言葉になる気がします。単純に暗記して暗唱することが目的じゃありません。意味のあるまとまりとして自分から出力する、その過程で違和感を感じるかどうかを見つめ直し、自分に問うことができます。3回やって違和感がないかどうかを確認するのです。
練習開始直後は、「自分の中の最適値として暗記したコードを、出力している」という感覚が若干ありました。(当時にそのつもりはなかったけど、今日振り返るとそう感じます)
いまは、暗記というより「書くべきことを順次考えつつ、順次書く」という感じに変わった気がしますし、「計算機でやりたいことを考える」と「コードを書く作業」の距離が近くなったような感じがします。
さいごにお知らせ
協会ではLeetcodeの練習だけでなく、CSの勉強会・模擬面接・その他の企画も多くやられています。
また、2025/03/02に、東京にてソフトウェアエンジニアリング協会のイベントが行われます。
Discussion