ソースコードの書き方について

ソースコードの実装方法

プログラミングのソースコードの書き方について、たまに聞かれたりするので、自分用のためにも簡単にメモします。

基本的に気を付けていることは「可読性」「保守性」「効率性」でしょうか。保守性は可読性につながることではありますが。
ソースコードは書き終わって、仕様通りに動いたからといって終わりではありません。その後、運用に向けて問題ないかテストをして、バグや品質に問題があれば修正する必要があります。また実際に運用していく中で、必要な機能が出てくれば改修を行うことなども出てくるでしょう。そんなときにスムーズに行えるように、もしくはそのようなことが起きないように、より適したソースコードを実装していることが重要になります。

 

可読性・保守性

改修をスムーズに行っていくには「可読性・保守性」が重要になります。可読性、保守性が悪ければ、簡単に改修できることであっても、苦戦することがあります。

「可読性」が必要な理由としては、見知らぬ人が初めて読んだときや、自分自身が後で見直したときに、ソースコードの可読性を考慮しないで実装してしまうと読み解くのに大変時間が掛かってしまいます。
自分が初めて働いたときの先輩には、「数週間後にソースコードを見直す自分は他人だと思ってソースコードを書くように」と言われました。本当にその通りで、自分が実装したソースコードですら時間が経てば何を書いたか忘れてしまいます。さらに何を考慮して、このようなソースコードを採用したかなどの重要なことなども忘れていることがあります(処理効率の考慮であったり、このように実装しないとバグとなり得るため(回避のために)実装しているなど)。ましてや他人が見れば、初見ではどこまで考慮して、何をしたいのかわかりません。

 簡単な例:コメントをきちんと書く、変数名やメソッド名など理解できる名前にしておくなど

 

「保守性」が必要な理由としては、ある一部分の機能を改修したいときに、色んな機能が混じっている箇所に実装していれば、その機能のみを改修することは困難になります。また、一部分のみを改修したにも関わらず、色んな箇所に影響を与えてしまえば、様々な部分の改修や再テストなどを行う必要が出てしまい、時間が掛かってしまいます。そのようなことが最低限に収まるようにする必要があります。

 簡単な例:一つのメソッドに複数機能を持たせない

 

「可読性・保守性」を考慮したソースコードはリーダブルコードだと考えられます。
リーダブルコードについて簡単にまとまっている記事がありましたので、気になれば参考にしてみてください。

 リーダブルコード要約とリーダブルコード要約の活用方法
 リーダブルコードを読んだので、殴り書き

 

効率性

「効率性」の必要性としては、簡単なテストや単体では気付きにくいかもしれませんが、最低限のメモリ使用や処理にしておく必要があります。その場では問題なく実装し、動作ができていたとしても、実際の運用で使用する大量データ、他とのソースコードとの結合により、ものすごく処理時間が掛かってしまうことや、メモリが足りなくて落ちてしまうことで、本番環境で使いものにならないこともあり得ます。

「効率性」などはプログラミング言語によって、考慮の仕方が違うので割愛しますが、無駄な繰り返し処理を行わないようにしたり、メモリなど必要な分だけを使用すること(オブジェクトの新規作成などループ内で行わない、Listなど必要な数がわかっていれば設定しておくなど)が重要になってきます。

 

ソースコードのLOC(Step数)

LOC(lines of code)とは、ソフトウェアの規模を表す指標のひとつであり、ソースコードの行数のことです。SLOC (source lines of code) 」も同義。日本ではStep数と言われることが多いです。ただ行数は、記載の仕方や、横幅などで変わってきてしまいますので、あくまでも目安にはなります。

よくどのくらいの規模、行数か聞かれることあるので、他のソフトウェアがこのぐらいだという参照記事をあげておきます。

 ソフトウェアのコード行数
 自動車一台にソースコード1000万行
 Googleは10億個のファイル・20億行のコード・合計86TB

記事にあるように、これぐらいの量の行数が必要ですが、逆に下記の記事のようにこんなに少ない数でも書けるというものもあります。

 AlphaZeroのソースコードはわずかホワイトボード一枚に収まる

AlphaZeroは、グーグルの親会社であるアルファベット傘下のDeepMind(ディープマインド)の研究グループが、囲碁をマスターした「AlphaGo」(アルファ碁)と呼ばれるプログラムで世界に衝撃を与えたました。それをさらに、初めて復数のゲームに対応したAIのボードゲームチャンピオンとして発表したものになります。このソフトウェアは、難解な3つのゲーム、チェス、囲碁、そして将棋のいずれに関しても、自己学習して人間を超えることができます。

これほどすごい機能を持つAlphaZeroのソースコードはそんなに長いものではありません。実際はアルゴリズム自体は比較的シンプルで、大量のデータと、それの重み付けによる判断が重要になっているからと考えられます。

もちろん、これらもプログラミング言語に左右される部分はあると思いますが、これほど大量に実装する必要性もありますし、シンプルに実装することができることもあります。

自分にとって、そして他の人にとっても、できる限り最適なソースコードが実装できるように日々精進していくしかありませんね。