
2018年、私は開発途中の大規模プロジェクトに参加しました。元のエンジニアたちは既に去っており、複雑で文書化されていないコードが残されていました。このようなコードで作業するのは困難です。なぜなら、配管部分とビジネスドメインを区別できないからです。これによりデバッグが困難になり、影響を把握できないため変更が予測不可能になります。言葉を理解せずに本を編集しようとするようなものです。
多くのエンジニアは、コードがコンパイルされることが成功の指標だと考えています。私は、別のエンジニア(または6ヶ月後の自分)があなたのコードの「なぜ」を理解できることが成功だと信じています。元のエンジニアたちは、文書化せず不明瞭な名前を使用することで、将来のエンジニアたちに制約を課しました。名前は時として、前のエンジニアの思考プロセスを知る唯一の窓なのです。
ドナルド・クヌースは有名な言葉を残しています:
プログラムは人間が読むためのものであり、コンピュータが実行するのは偶然に過ぎない。 – ドナルド・クヌース
命名
命名は困難です。なぜなら、アプリケーション内でその部品がどこに、どのように適合するかをラベル付けし定義する必要があるからです。
ネットスケープ在籍時のフィル・カールトンは次のように述べました:
コンピュータサイエンスで困難なことは2つだけ:キャッシュの無効化と命名である。
— フィル・カールトン
私たちは使用する言葉や名前のレンズを通してコードを見ています。名前は次のエンジニアが理解するための言語を作り出します。この言語は、作者がビジネスドメインとプログラミング言語をどのように橋渡ししたかの絵を描きます。
20世紀前半の哲学者ルートヴィヒ・ヴィトゲンシュタインは言いました:
私の言語の限界は私の世界の限界を意味する。 – ルートヴィヒ・ヴィトゲンシュタイン
私たちのソフトウェアの言語は、使用する名前と同じくらい記述的でしかありません。曖昧な名前を使用するとソフトウェアの目的がぼやけ、記述的な名前を使用すると明確性と理解がもたらされます。
自分が言語を話せない国を訪れることを想像してください。トイレを使わせてもらうという簡単な要求でも、困惑した表情を向けられます。コミュニケーションできないことは、フラストレーションを感じ、場合によっては恐怖さえ感じるかもしれません。エンジニアも、混乱を招く、不明確な、さらに悪いことに誤解を招く名前に直面したとき、同じ気持ちになります。
この感覚は実際に体験するのが一番です。
体験
最初のコードスニペットを調べてください。このコードは何をしているのでしょうか?なぜでしょうか?
時間をかけて考えてください。
public class StringHelper
{
public string Get(string input1, string input2)
{
var result = string.Emtpy;
if(!string.IsNullOrEmtpy(input1) && !string.IsNullOrEmtpy(input2))
{
result = $"{input1} {input2}";
}
return result;
}
}
上記のコードは2つの文字列の単純な連結です。コードが教えてくれないのは「なぜ」です。「なぜ」は非常に重要で、それなしでは影響を理解せずに動作を変更することは困難です。もちろん、コードの使用方法を調査すれば「なぜ」が明らかになる可能性がありますが、それがポイントなのです。コードの目的を発見する必要はないはずです。代わりに、作者が手がかりを残すべきであり、それは彼らの責任なのです。
コードを再度見てみましょう。今度は少し「なぜ」を振りかけて。
再び時間をかけて、このコードを読むときに感じる違いを観察してください。
public class FirstAndLastNameFormatter
{
public string Concatenate(string firstName, string lastName)
{
var fullName = string.Emtpy;
if(!string.IsNullOrEmtpy(firstName) && !string.IsNullOrEmtpy(lastName))
{
fullName = $"{firstName} {lastName}";
}
return fullName;
}
}
「なぜ」がコードに命を吹き込み、読むべきストーリーがあります。
コミュニケーション
次のエンジニアに意図と設計を伝えることで、ソフトウェアは生き続け成長できます。なぜなら、エンジニアがソフトウェアを修正できなければ、それは死んでしまうからです。これは悲劇であり、特に設計の不備や表現力の欠如が原因である場合はなおさらです。どちらも知識があれば防げるものです。
次のエンジニアのために、コードで表現力豊かになってください。記述的な名前を使用し、「なぜ」を捉えてください。なぜなら、次のエンジニアはあなた自身かもしれないからです。
著者:Chuck Conwayはソフトウェアエンジニアリングと生成AIを専門としています。ソーシャルメディアで彼とつながりましょう:X (@chuckconway) または YouTube をご覧ください。