Zenn
💻

コーディング練習会の感想@一般社団法人ソフトウェアエンジニアリング協会

に公開
9

これは何の記事?

一般社団法人ソフトウェアエンジニアリング協会に生徒として参加して、3ヶ月ちょっとが経過しました。協会参加直後から取り組んでいたコーディング練習では、Arai60というLeetCodeの問題集に取り組んでいました。これをひと通り終えたので、取り組んだことや感想などについてまとめました。

そもそもソフトウェアエンジニアリング協会とは?

ソフトウェアエンジニア(SWE)の育成や就職支援を非営利で行なっている団体です。
ご指導いただける協会理事の講師陣は、元ビッグテック所属のプロ中のプロのSWEです。
一般社団法人ソフトウェアエンジニアリング協会

LeetCodeを題材にしたコーディング練習会だけでなく、コンピューターサイエンス(CS)の基礎知識を学ぶ勉強会の開催や、模擬面接やレジュメ添削など、SWEの育成や就職支援のための様々な取り組みがなされています。
最近では将棋AIエンジンの個人開発なども行われていました。

コーディング練習会の目的

前提として、SWEというのは医者や弁護士などと同様に専門職の一種ですが、非資格職という違いがあります。非資格職では、その専門家集団内で共通基盤として持たれている「常識」というものがあり、これを身につけていれば専門家集団の仲間と認められます。
協会ではSWEに必要な「常識」を習得することを目的にしています。
「常識」について

コーディングにおいては、書いたコードがLeetCodeでAcceptedされるだけでは不十分で、その上でコードを前にしたときの、知識・反応・行動・感覚・判断といったものを専門家の「常識」に合わせることを目指しています。
講師の方が仰っていたことで印象的なのは、「感情を育てましょう」「審美眼を鍛えましょう」というものです。これについては後述します。

コーディング練習会の詳細

まず、題材となる Arai60 は下記の問題精選集のことを指します。
https://1kohei1.com/leetcode/

具体的な練習方法は例えば下記のようなものです。

Step1

  • 答えを見ずに考えて、まずAcceptedされるコードを書いてみます。
  • もし、5分くらい考えて分からなかったら答えのソースコードを見ます。
  • 答えを見て理解したと思ったら、答えを隠して書きます。
  • 書いたコードを送信して、Acceptedされたら、まずは Step1 クリアです。

Step2

  • 次に、可読性や直感性などを意識して、コードが読みやすくなるようにできるだけ整えます。
  • 同じ問題を解いた先人のPR(プルリクエスト)の内容も見て、自分の解法以外の選択肢を見つける(しっくりくるものがあれば自分でも試す)、ドキュメントなどで調べ物をして知識を補う、ということをします。深さ優先探索みたいに自分の興味の赴くままに、やりたいことはやり尽くしておいた方がベターだと思います。
  • わからない事があれば、GPTを質問攻めにして理解しました。どうしても動かないコードができてしまったらデバッグをお願いすることもありました。私はよくギャルを召喚して面白おかしく解説してもらっていました。生成AIを使わないのは損だと思いますが、コレは意識した方がいい気がしています。
  • 関連するライブラリ(@cache や LRU Cache)をゼロから実装することもありました。

Step3

  • Step2で納得して整えたコードを、再現性高く書けるようになるまで練習します。
  • 10分以内に1回もエラーを出さずに書ける状態になるまで続けます。
  • 3回続けてこれができたら Step3 クリアです。
  • 最後に、GitHubでPRを上げて、PRのリンクをDiscordサーバーのレビュー依頼用チャンネルで共有して、既に解いている生徒に向けて、レビュー依頼をします。講師の方々も見てくれます。

コーディング練習会に参加した感想・気づき

参加のきっかけ・私の信条

  • プログラミングを学ぶのに、こんなに良い環境が他にあるだろうか?(反語)という、率直な感想がまずあります。
  • 私は、協会に入る前は1人でAtCoderなどの問題を解いてました。
    https://qiita.com/e869120/items/eb50fdaece12be418faa#2-3-分野別初中級者が解くべき過去問精選-100-問
    これをやる中で、「後で自分が読んだときに読みやすくしたい」や「直感性シンプルさを大事にしてコードを書きたい」という気持ちが生じて、これが重要視されるSWEという職種に興味を持ち、協会に参加させていただきました。この選択は正しかったと思います。自分のやりたかったコーディングを存分に練習会で学べていると感じます。
  • 人間1人ではできることや体験できる世界に限界があり、例に漏れず個人学習にも限界があるので、この協会のコミュニティに参加して、本当に良かったと感じます。
  • 他生徒や講師のコードレビューコメントが非常に勉強になります。特に講師の方には、私の理解の足りない点を、書いたコードや私の振る舞いから的確に察知・コメントいただいたおかげで、私一人では到達できなかったであろうレベルまで、理解が深まったように思います。
  • コードを書くときの信条も定まった気がします。「シンプルさと直感性」です。協会に参加した当初に漠然と大事にしたかったことを、より解像度高く大事に思うようになった感覚です。

感情・審美眼を養う

  • 感情審美眼を養いましょう」という講師の教えが個人的に非常にしっくりきています。そもそも、コードの書き方というのは大変自由なもので多くの選択肢がありますが、その中で、「これは個人的には好みで良いと感じるが、あれはこういうところが気に食わない。」という自分が納得するためのこだわりを持つことが性に合っている気がします。
  • ただ、独りよがりは良くないので注意ですね。人の話はよく聞いて、より良いものが見つかれば柔軟に自分の考えを変化させなければならないと思います。
  • 感情や審美眼を十分に養うことができれば、数ある選択肢の中から個人としてより良い手段を選択できるだけでなく、合理性の幅を持つことで他者との協調にもつながる、というメリットがありそうです。個人的には、コーディング自体が楽しくなるというメリットもあると思っています。
  • 興味・関心のあるモノを前にして、その良し悪しがわかるというのは面白いことだと感じるはずです。これとか、(良し悪しというより判別をしているという違いはありますが)感情としては近いと思います。
    https://x.com/052ysk/status/1848023234031284412
  • ちょっとスケールがデカい話に脱線しますが、真善美でいうところの(自分にとっての)の追求がイメージとして近い気がしています。誰かのためにという観点ではも大事になってくるのではないでしょうか。
    学部入学式における総長のことば
  • 私は内向感情が強い自覚があり、これを大きくはたらかせながらコードを書くのが、とても楽しいです。例えば再帰呼び出しは、親分から子分への引き継ぎなど、ストーリーをつけて楽しく書いていた気がします。
  • 私見ですが、例えば、動的計画法の肝は遷移式・漸化式にあると思っていますが、これだけ覚えても何も面白くないのでストーリーや人格みたいなものを自分なりに見出して、面白おかしく理解するようにしていました。この方が頭に残ってくれます。そもそも、コーディングは楽しくやるのが一番だと思っています。(たぶん継続が大事なので...)
    https://github.com/kstoneriv3/tips-for-studying-and-working-abroad-ja/blob/main/misc.md?plain=1#L11
  • 最近思っていることですが、出力や計算時間が間に合うコードが書けた後に、直感性やシンプルさ追求したり、感情や審美眼を持ってコードを読むのって感性工学とかの話になってくるのではと感じています。人が見るものなので、そりゃそうという気もしたり、設計哲学(例:Pythonだと、The Zen of Python)とかも言語ごとにあるようなので、たしかになあと思います。左脳的なロジック中心になるのがコーディングだと思っていましたが、右脳的な感性も大事なのかもしれないです。
  • 最近気づきましたが、プログラミングってプラレールによく似ていると思います。子供の頃ずっとこれで遊んでましたね。(途中からプラレールに満足できなくなり、Nゲージで遊んでいました。)
    コード動かすのもこれと同じノリで楽しいです。
    https://edu.watch.impress.co.jp/docs/news/1499148.html

コーディング ≒ 箸を持つようなもの・体を動かすようなもの

  • 協会で学ぶ前は、コードを書くことは特殊な技能によってなされるものだと思ってましたが、「箸を持つようなものである」「体を動かすようなものである」というのを知り、変な気負い?のような感情が、なくなりました。ただ、書けるととても嬉しいですね。純粋な内部動機が満たされる感覚です。
  • 知らないコードが出てきても「あ、知らない子ですね。これを自分がしっくりする体(思考)の動かし方で覚えましょう。どんなストーリーを見出そうかな?」というマインドになれるので、良い意味で気が楽になった気がします。(「こんなもの、思いつかないんだが・・・」みたいに感じてしまうのは時間がもったいないと思います。さっさと体を動かして覚えてしまいましょう。)
  • (まだまだですが…)スムーズにコードを書くということに、特別な感情は持たなくなりました。
  • 直感的に納得できたコードをStep3で何度も書きますが、連想ゲーム?のように必要なことを自然と紡ぎながら書いていく、みたいな感覚も生じてきた気がします。
  • 趣味でギター弾くときは、感覚的に自分に馴染む体(主に指や手ですが)の動かし方をメカニクスとして見つけるイメージで繰り返し練習します。コーディング練習ではStep1~Step3でコードを改善・整理していって最後に何度も書くということをしますが、これは直感的に納得できて馴染んでいる(はずの)思考のメカニクス的な動かし方を頭の中で繰り返す感覚で、ギターを練習するのと近い感覚だと感じます。良い練習方法なのではと感じると同時に、「箸を持つようなものである」「体を動かすようなものである」ということが明らかに感じられる気がします。
  • ギターは手に余計な力が入っていたり、手にしっくりきていない無駄があるような弾き方だと上手く弾けなくて、コーディングは理解が頭の中にシンプルに納得して整理されていないと(カオスに発散してしまっていると)書けない、みたいなのも感覚としては似ているかもと思います。
  • 記憶が曖昧ですが熱力学のエントロピーは低い方がうれしい、みたいなイメージでしょうか。Everything In Its Right Placeという好きな曲があるのですが、タイトル通り、こういうことなのかもしれないです。「Yesterday, I woke up sucking a lemon」は、心理面での無秩序やカオスを表現しているのかもと感じます。
    https://inadeepsleep.com/entry/2017/09/09/133925#:~:text=どんなに世界は狂って見えようと、「すべてのものは、あるべき場所にある」と思うことにした
  • ちょっと記憶が曖昧ですが、20問目あたりを過ぎたくらいから、なんだか急にコードが書きやすくなってきた気がします。(理由は分かりません…体の動かし方が分かってきたという事だったのかもしれません。)
  • コードを書くのは元から好きでしたが、最近は毎日やらないとソワソワするようになりました。

コードを読むこと・他者との関わり

  • 他の人のコードを読む、というのも初めての経験でした。最初は先人のPRを読むのが結構大変でしたが、徐々に読む時の負荷が下がっていった気がします。私はPythonメインで書いてますが、まだ、CPythonなどをちゃんと読めている感覚がないので精進したいです。
  • 書くよりも読む能力の方が大事ということを講師の方がよく仰っていましたが、感情や審美眼を養い「常識」を身につけるためにはこれが必要というのは、納得です。
  • これもまだちゃんと上手くできている自信はないですが、人のコードを読んで、コメントをつけるというのも、以前は恐る恐るでしたが、最近少しずつ自分の納得いく形でできるようになっている、気がします…
  • コメントするときは自分の感情は伝えつつも強制はしたくないので、相手がより良い状態になるために必要かもしれないことをご提案する、みたいなイメージで書きたいと思っています。
  • まだ修行が足りませんが、講師の方が自分にしてくれているようなコメントを、私も他の人のためにできるようになりたいと感じます。
  • 私は基本的にビビリなので、「勉強会では火傷を恐れずに」というのをどこかで見て、良い意味で気が楽になった気がします。
  • あと、これも練習会に参加した大きなメリットですが、まさに自分が目指すコードをよく書かれている目標になるような先人を見つけられたのも学習効果の面で非常に大きかったと感じます。この方のコードは真っ先に確認して、よく参考にさせていただくようになりました。すると、「この人のコードにはいつも自分のやりたいことが書いてあるなあ」「なんか最近コードが似てきているかも?」みたいな親近感?を、比較的最近、感じるようにもなりました。特定の一人ではあるものの、他のSWEとよく似た振る舞い・同じ反応ができるようになるという意味では良い傾向なのではと感じます。
  • あと、そもそもソフトウェアエンジニアリングにおけるコーディングというものは、いつ爆発するかわからない爆弾を埋め込むようなものであるらしく、生成AIという強力なツールを使うのであれば、AIが出力したコードをよく読んで理解して、最後に人間が責任を持って介入する、ということが大事なのではと思っています。生成AIを用いたコーディングに対する個人的な感想としては、出力されるコードは入出力はしっかり合うことは多いかもしれないが、その他の部分がまだまだだと感じます。書き方が気に食わないと感じることが多かったり、人間の直感からすると明らかにおかしいことも平気で言ってくることもあるのでAIの出力をそのまま使うのは、かなり不安と忌避感がありますね。
    https://nowokay.hatenablog.com/entry/2025/03/22/020514#:~:text=ということで,もいいです。
    https://nowokay.hatenablog.com/entry/2025/03/22/020514#:~:text=それと、AIエージェント,もあります。
    https://x.com/ainsophyao/status/1870481549357174972
    https://x.com/GergelyOrosz/status/1907470584650285080
    https://x.com/kaityo256/status/1883106307957473397
    https://zenn.dev/dyoshikawa/articles/developers-still-need-to-understand-ais-code

目的思考

  • ソフトウェアエンジニアリングの目的は「ソフトウェア技術を用いて公共の安全・健康・福祉のために有用な事物や快適な環境を構築すること」です。先日の協会の対面勉強会に参加して印象的だったのは「肉を切ることに喜びを覚える外科医」にはなるな、つまり手段に固執して目的を見失うな、という講師のコメントです。
  • 私は書くこと自体が楽しい、という感じでこれまでコードを書くことが多かったのですが、こうならないようにしたいと感じています。例えば、深さ優先探索が好きで、関数名に dfs と入れたのを思い出して反省しました...(これに対する講師のコメントは、関数を呼ぶ側からしたら中身のアルゴリズムには興味がないはずだ、というものでした。その通りだと感じます。)
  • コードを書くという手段に観点を移すとすると、下記のことを意識できれば良いのかもしれないと思っています。端的に表現されていると感じます。
    https://qiita.com/miketako3/items/3085e225a35cdf89cd55#:~:text=ソフトウェアエンジニアリングとは時間で積分したプログラミングである。

今後

  • 工学部/工学系研究科の非情報系出身というのもあり、エンジニアリングという広義の意味では共通する部分が少しはある気がするものの、コードの読み書きをする中でCSの知識が全く足りていないことを痛感しており、ぜひCSZAPで学びたいと感じています。
  • Arai60はじっくりと取り組むやり方で進めましたが、私は飽き性で、変化が欲しいと感じるので、LeetCodeの数を多くこなすというやり方でもやってみたいと感じます。コーディングは、箸を持ったり、体を動かしたりすることに近い、ということなので、数をこなすのは理に適っているかもと感じているのもあります。色々なポーズが出来るようになりたいです。
    とりあえず、Grind75をざっと解き始めてみています。1/2くらいトライしましたが、Arai60で学習したことが活きていて楽しいです。Hardの問題も割とあって、手強いですが歯応えがあって良きです。何かを習得するときは実践駆動でやるのが好きですね。
    https://www.techinterviewhandbook.org/grind75/?order=topics&grouping=topics
  • 【参考】ある協会理事のコーディングに関する考え方は、下記のようなものらしく、この方法でも最終的な到達点も到達時間もそれほど変わらないようなので、これでも良いようです。
    • とりあえず200問を解く(Step1までを繰り返す)
    • あまり分かっていないようであれば、さらに200問解く。
    • なぜかというと、書いて入出力が一致したところで満足してしまうのは、解くことの負荷が大きすぎるからであり、それなりの量をこなせば負荷が相対的に小さくなって周りを見る余裕ができてくる。
  • (時の運というのもあった気がしますが)この協会での学習が身を結び、未経験から希望の会社でソフトウェアエンジニアとしての就職が決定しました。以前から興味のあったAI技術にわりと深めに携わるSWEをやります。大変嬉しく思います。将棋AIの個人開発もこれからの業務と親和性がありそうなので引き続き取り組みたいです。最近はDLの勉強をしています。選考のコーディングテストで満足のいくもの(←こう感じることができること自体が成長の結果なのではと感じます)を提出できたのは、ひとえに協会での学習のおかげだと感じていて、頭が上がらないです。引き続き精進したいです。

最後に & 関連リンク集

SWEという専門家を目指すのであれば、専門家と直接関わることができるコミュニティに参加するのが最も良い方法なのではと感じています。ソフトウェアエンジニアリング協会は、最終的には毎年1万人の桁でSWEを育成することを目標としています。これを達成するには多くの仲間が必要です。
SWEを目指している方は、ぜひソフトウェアエンジニアリング協会に参加して一緒に学びませんか?

協会の活動の様子がわかる記事などのリンクを、下記に掲載いたします。

PR(対面勉強会のお知らせ)

対面勉強会が2025年4月26日に予定されています。
協会の活動目的・ソフトェアエンジニアリングに関する説明や模擬面接デモなどがあります。ぜひご参加ください。
https://x.com/nodchip/status/1897969449296441849
https://x.com/ainsophyao/status/1900559767107784771

9

Discussion

ログインするとコメントできます