ソフトウェアエンジニアリング協会のコーディング練習会に参加した
背景
2025 年 5 月から 7 月末にかけて、一般社団法人ソフトウェアエンジニアリング協会 のコーディング練習会に参加して Arai 60 を解いた。
一般社団法人ソフトウェアエンジニアリング協会とは
同様の練習会に参加した方の記事が複数存在するので、公式ページから理念を引用するに留める。
日本のソフトウェアエンジニア育成は数と質の観点で不十分です。日本の大学でコンピュータサイエンスを学べる学部の定員数は十分とは言えず、真にコンピュータサイエンスを学べる学部の数も全体から見ると限られています。日本のソフトウェアエンジニアには、もっと広く世界と戦うことができる一流のソフトウェアエンジニアリングを学べる環境を積極的に求めてほしいと考えています。海外での経験が増えるほど、日本の技術力も向上するでしょう。一流のソフトウェアエンジニアを多数輩出することで、日本の社会や組織を変革したいと考えています。今のソフトウェアエンジニアリング育成を変えたい志のあるものがあつまり、ソフトウェアエンジニアの育成、就職支援などを非営利の活動でおこなって参りました。このたび一般社団法人を設立することで、この活動をさらに広く実現したいと考えています。
Arai 60 とは
所謂 LeetCode の問題をキュレーションしたリスト。Grind 75 など他のリストも多数存在している。
筆者について
文学士取得後、外資系企業のビジネス職として入社した。社内異動を繰り返して、現在は同社で Solutions Engineer (2021~) をしているほか、米国大学院の Computer Science 修士に在籍中。
コーディングインタビューについては、2019 年頃から時々練習しては年単位でぱったりやめて、というのを数度繰り返していた。
練習会の目的
「世界標準のソフトウェアエンジニアのコーディング能力を身につける」ことであり、具体的には
- 計算量のような雑な評価ではなくコードの優劣の評価をして適切なものを選択する能力
- 手作業でできることをコンピュータにお願いできる
- 大規模なコードを読解し理解する能力
といった能力を獲得することを目標としている。詳しくは マニュアル の背景、目標などのセクションを参照。
少なくともコーディング、という側面における、SWE 集団の中での「常識」的な能力や振る舞いを身につけることであると思っていて、ではその常識とはなにか、というものを教えようという活動である、と理解している。
手順
上記マニュアルに記載の 標準的な進め方 に則って進めた。
- Step 1: 何も見ずに問題を解く。5~10 分程度考えてわからなければ答えを見た。
- Step 2: 同じ問題を解いた方のコード、標準ライブラリの公式ドキュメント、CPython のソースコードなどを読み、より洗練された書き方や解法、言語の仕様などについて理解に努めた。
- Step 3: 10 分以内にエラーを出さず、3 回連続で書けるまで練習した。
- コードレビューを受け、修正や、コメント内容についてより深く理解するために関連ドキュメントなどを読んだ。
感想
一通り解き終わった時点での雑感を、ある程度上記目的に照らす形で列挙してみる。
- 計算量について、もともとは Big O notation (最悪計算量による見積もり) を中心に考えていたが、言語や実行環境、特性、データ構造が消費するメモリ量などを考慮し、より実践的な (実時間における) パフォーマンスを意識するようになった。
- コードの可読性やメンテナンス性といった、より多面的な視点からコードの品質を評価する習慣がついた (e.g. 処理の意図が的確に伝わるような命名)。
- 複雑な処理であっても、一度アルゴリズムや手順の方針が固まれば、スムーズにコードに落とし込める場面が増えた。
- 自分で問題を解くだけではなく、他の人のコードをレビューを通じて「この問題はどういう解き方の選択肢があるのか」「その優劣はなにか」などより広く多面的で広い視点で問題を捉えようとするようになった。
- 脳内でデバッガを走らせる能力。複雑なものだとうまくできないこともあるが、徐々にコードの挙動を速く正確に読み取れるようになってきたように思う。
- 他の人のコードを読む認知負荷が下がった。読むスピードも多分速くなった。
- 初見で解けることも、解けないこともまあそういうものか、と受け入れるようになり、解けたこと、解けなかったことに意味を見出さなくなった。
- 繰り返し書く中で、自分が納得して書けていなかったり、必要以上に煩雑になっている箇所は手が止まるので、より流れるように書ける / 読めるコードを意識するようになった。また、全体の処理の流れと、複数ある書き方の中で自分が選んだ選択肢を踏まえて書くと何回書いてもだいたい同じコードになる、といったことを体感した。
- 最初のうちは自分の気づかなかった点についてレビューコメントをいただけるのが助かっていたが、進めていくうちにある程度コメントが入りそうな箇所、内容を予測できるようになった。最近解いた問題について、他の人からレビューリクエストが来る仕組み (他の人のコードを読むことを推奨する仕組み) の方をより有意義だと感じるようになった。
まとめとこれから
個人的には、CS の勉強のほか、個人プロジェクトや C++ で Grind75 を練習するなど、いくつかの取り組みを継続していく予定。
「コードを書けるようになる」とか「言語のスタイルに表面的に則ったコードを書けるようになる」というのは 1 人ないしごく少数でもできると思う (多分私はこのパターン)。
ただその背後にあるより大きな概念や習慣 (「常識」といってもよいし、同じコードを見たときにどれくらい広いものが見えているか、といった感覚) は、コミュニティの中で、同士や先駆者と話しながらでないと身につけるのは難しいように感じた。
適切な環境・機会を広く提供してくださっているソフトウェアエンジニアリング協会は大変意義深いと思っているので、感謝申し上げるとともに、微力ながら継続的に関わっていければと考えている。
コーディング練習会は常時開催しているほか、対面の勉強会 (直近開催されたもの) や CSZAP といった取り組みも行っているので、興味を持った方は https://www.swe.or.jp/ を参照のこと。
Discussion