カテゴリー
システム開発全般 プログラミング

プログラミングにおけるエントロピー増大について

エントロピー増大の法則とは

エントロピー増大の法則というのは熱力学から導入された考え方で、物事の煩雑さが常に大きくなるという法則です。ブラックのコーヒーにミルクを入れるとかき混ぜなくても、自然と混じりあっていくように、ミルクとコーヒーという独立した状態からお互いが混じり合う無秩序状態になってきます。

一度煩雑性が増した物事を元に戻すためには、外からエネルギーを加えることが必要になります。コーヒーの例で言えば混ざったコーヒーからミルクとコーヒーの成分を分離するためには濾過したり、水分を蒸発させて分離させるような処理が必要になるでしょう。

プログラミングにおけるエントロピー増大の法則とは

プログラムのソースコードも、コード量が増えるににつれ、どんどん煩雑になりエントロピーが増大した状態になります。メンバーが増えて様々なコードの書き方の癖が入り混じるようになったり、後から追加された機能によってそれまで維持していたコーディングルールを守れなくなったり。

煩雑さが増すにつれて、ソースコードに修正するために必要なコストが増えていきます。新機能追加のソースコードを書き加えるときに、他の部分に及ぼす影響を把握するための確認の手間が増えたり、全体の整合性をとるために行う検討時間(設計工数)が増えるからです。

こうして、プロジェクトが進むにつれた新たな機能追加・改善に必要な時間的コストが増えてゆき、進捗が悪くなってゆきます。

エントロピーを下げるアクション

設計工程で、コーディング規約を決めたり、フレームワークを採用したり、実装時にコードレビューを行うのは、プログラミングにおけるエントロピーの増大を抑制するための手段だと言えます。開発が進むにつれて、進捗が悪くなるプロジェクトはこのあたりの設計を疎かにしていることが多いです。

一度複雑性が上がってしまったソースコードを修正して複雑性を下げるためには多大な労力が必要です。影響範囲を考慮しながら散らばったコードを整理し、機能でまとめ、抽象化したり具体化したり、、。エントロピーを下げるために行うエネルギーの注入作業が、リファクタリングです。

リファクタリングには、技術的な困難と共に、経営的・政治的な困難もつきまといます。リファクタリングでは、機能が追加されたり改善されたりはしないため、技術的なバックグラウンドを持たない発注者や経営者に、その作業の必要性を理解してもらうことが難しいからです。

そのため、設計工程で採用するフレームワークを検討し、コーディング規約やレビューのルールを決めるのは非常に重要です。リファクタリングの必要性・重要性をプロジェクトオーナーに伝え、初期段階からプロジェクト責任者に伝え、実行計画を予め盛り込んでおくことも有効だと思います。

カテゴリー
システム開発全般 プログラミング

プログラミングと英語

プログラマーやエンジニアにどのくらい英語が必要かというのはよく聞かれる質問です。

プログラマに必要じゃないという回答は見たことがないし、当然私も英語は必要という考えですがその理由は二つあります。

第一に、これが一般的にもよく言われるこだと思うのですが、プログラミングを行っていて不明点が出てきた時はGoogle検索で解決方法を調べますが、その時に英文の記事しか検索結果にでてこないことがよくあるということです。幸いにして、日本語の検索でも大抵の解決方法は誰かが解決方法を書き、ネットで公開してくれています。

しかし、バージョンに依存するような頻度の少ない問題や、最近バージョンアップした言語やライブラリなどの情報は、日本語で検索できないこともあります。その場合は、英語で疑問点を調べなくてはなりません。

とは言っても、そのような英語の文章は大抵シンプルで、関連するプログラムが付記されているので理解するのは難しくない場合が多いです。

ただ、英語に苦手意識が強いと、その文章を読む作業も苦痛になるし、英語で調べたら簡単に見つかる解決策を、日本語で探そうとしてより時間がかかってしまうこともあります。この点において多少の英語力というのは必要だと思います。

もう一点、個人的にはこちらのほうがエンジニアがある程度英語に習熟しておいた方が良いと思う理由です。それはプログラミング言語は基本的に英語・アルファベットで書くことを前提に作られているということです。

作成したプログラムは、その後の修正・改善のために他のチームメンバーや自分でも読み返します。そのため時間が経ってから自分でプログラムを読んだとき、また他人が読んだときに、理解しやすいプログラムを書くことが必要です。

英語圏の達人プログラマーが書くプログラミングの教科書的な本には、普通の文章として読めるようなプログラムを書きなさいというようなことが書かれています。例えば、ファイルの上から下に実際に処理される順序でプログラムを書くこと、関数や変数に実際の処理に沿った命名をすること、単数形・複数形や動詞・名詞の違い、それらのルールを統一をする(規約に沿う)ことなど。

実際の開発現場でも、 実際の機能と異なる命名をされた関数名や変数名があるプログラムを読むと、理解するのにより多くの時間を費やしてしまうことがよくあります。

英語圏以外のプログラマにとってこのようなことに対して注意を払うためには、基本的な英語の文章作成力、読解力を養っておく必要があると感じます。

ちなみにアルファベットを使って、ローマ字表記で関数名・変数名を指定してプログラムを書くことは可能です。実際にローマ字表記でプログラミングを行うプログラマもいるのですが、英語に訳せない日本語や固有名詞に使用する以外で、ローマ字表記を使用することを私はお薦めしません。

・英語表記で書かれたプログラミング言語の予約語や、フレームワークのプログラムと異なる表記体系が混在してしまう
・日本語(ローマ字表記)には複数形がない
・ローマ字表記は表記ゆれを起こしがち
   例) Hensuu←→Hensu, Henshu←→Hensyu, O Sadaharu←→Oh Sadaharu

よって、プログラミングを行うために英語力は必要か?ということに対しては

・疑問点・不明点をググるために英語は必要
・読み易いプログラムを書くために英語の単語力・文章作成力・読解力が必要
・日本人のみの開発現場では、リスニング・英会話力は不要

だと考えています。