この記事は 六間坂上 Advent Calendar 2024 3日目の記事です。
はじめに
はじめまして。たーとると申します。
むかしむかし、DSでうごメモにハマっていたこともありHatena Blogを根城に選びました。
人生で初めて記事を書くため、不備がありましたら大目に見てください。
技術者もすなるAdvent Calenderといふものを、私もしてみむとてするなり
全くの別業種から転職を行い、(大学で少し触った程度の)未経験からSEもどきになって早4年ほどです。
1年目はとても丁寧にプログラミングの基礎を教えてもらいました。今でも先輩方には頭が上がりません。
それでも、最初に業務のコードを見たときは「どこから読んでいいのか、自分が実現したいことを達成するためにどう書くべきか」が全く見当もつきませんでした。勿論今でも悩むことはありますが。
そこで、初学者の頃を思い出して読みやすいコードについて簡単な考察をしてみたいと思います。プログラム初心者でも読みやすいコードってなんだろう?
読みやすいコードとは
例えばこんなコードがあったとします。
- List<int> nums = new List<int>() { 1, 2, 3, 4, 5 };
- int total = 0;
- foreach (var num in nums)
- {
- total = total + num; // なんなら total += num; って書きたいけど
- }
- Console.WriteLine("合計" + total + "です。");
恐らく入社したての僕でも一文ずつを追えば読める、簡単なコードです。意図が明確ですし、プログラミング初学者でも読み書き可能な易しいコードと言えるでしょう。
でもC#にはもっといい書き方、ありますよね。こう書くと思います。
- List<int> nums = new List<int>() { 1, 2, 3, 4, 5 };
- Console.WriteLine("合計" + nums.Sum() + "です。");
これは、読みやすいコードと言えるでしょうか。
「Sumは合算だ」という知識さえあればとても読みやすいと言えると思います。
何なら今の僕であればこう書かれているのが自然に感じます。というかこうあるべきです。
当時の僕はLinqもプログラムで用いられる基礎的な英語や単語も知らない若造だったので、Linqが何行にもわたっていると「なんか繋がってる~」となりいちいち調べることで何とか読み解いていた覚えがあります。GroupByの概念を理解するのに一週間くらいかかったような。
それでは、処理について日本語でメモを残せば良いでしょうか。
- List<int> nums = new List<int>() { 1, 2, 3, 4, 5 };
- // numsの合算値を出力
- Console.WriteLine("合計" + nums.Sum() + "です。");
……同じことが二回書いてある
と読めてしまいます。基礎的な知識が付いたからこそそのように読めるのですが、もし業務コードにこのようなコメントがそこかしこにあったら発狂してしまいます。
コメントは可能な限り削ぎ落とし、一見して何をしているか分からないコードにそっと添えるくらいが乙なものです。
日本語で説明させてみた
では、プログラマなら読めるコードをAIで説明させたら、初学者でもそれなりに分かりやすい説明が出力されるのでは?
思いついたが吉日、試してみましょう……
おお、これならプログラムを触ったことのない文系大学生でもかなり理解しやすそうです。部分的に理解できない場合はまあまあ使えるのではないでしょうか。
…………と言いたいところですが、実際の業務のコードってこんなに分かりやすいことはないと思います。独特なクラスやプロパティがあることは日常茶飯事ですし、クラスやメソッドを他コードから継承していた場合、コピペ範囲が膨大になる事は容易に想像ができます。
使用するのが初学者の場合AIが正しい回答を返しているか自分で検証しようがないというのも問題です。
コードが沢山ある中でどこを読ませればいいのか何も分からなくてここだけを読ませてしまった人がいたとします。
プログラムの追い方をある程度分かってきた今なら、コードを抽象化してAIに読んでもらう選択肢もありですが、初学者の頃にそれができるとは思えず……
また、Chat系のAIを使う時はセキュリティポリシーを確認する必要がありますし、データを食わせる先を選ばなきゃいけないのはネックです。
情報漏洩のリスクを完全に排除できない以上、業務のコードをそのままコピペするのは個人的にはしたくないので、食わせても問題のない形に成形する手間がある……
(というか成形できるのなら、そのプログラムの根幹を理解しているのでは??)
そこまでするならその時間で「検索力」を高めて読めるように訓練することが真のプログラマー力(ぢから)なのではないでしょうか……違うかも……
まとめ?
・プロジェクトメンバーの認識を合わせて、言語特性に合わせた読みやすいコードを意識して書く。
・ちゃんと書かれているコードで読めない物は読む側が知識を付ける。
・読めないコード、読みにくいコードを書かない。
・ネットに転がっているようなオープンソースのコードの意図が読み取れないときは、AIに突っ込んでみてもいいかもね。
当たり前で抽象的な事しか書いてないな……
Linqであれ三項演算子であれ、書き方のルールのようなものなので、初見で完全に理解するのは不可能です。C#も年々進化しもう13.0です。
新しい文法や記法・組み込み型が出てくることも珍しくなく、常にこちらの知識をアップデートしていかなければいけない事は自明です。
初学者の方はめげずに初めて見る型やメソッドを検索しましょう。分からない事は分かる人にどんどん聞きましょう。みんなそうして知識を付けてきました。
そうして人に教える側に回り、後輩に基礎的な事象を一通り説明できるようになった時、プログラマーとしてのスタートラインに立てるのではないでしょうか。知らんけど。
……僕ですか?
僕は何年経っても後輩が入ってこないのでよくわからないですね……大丈夫かな