ソフトウェアエンジニアについての考え

 良いエンジニアはDesign Pattern、Code Reuse、UnitTestに詳しい、Simpleに対しても宗教的に
熱心しています。さらに下記の10個の知識ポイントをマスタしないといけない、これらは
プログラミング言語・Design Patternを超え、ソフトウェアエンジニアとして広範囲でマスタ
すべきです。
(1)リレーショナルデータベース(Relational Databases)
 RDは大規模WEBサービスでの拡張性制限などの問題が抱えていますが、20年前から
コンピュータ業界の一番大きな成果です。特に注文、業務データ処理などでかなりの
メリットを持っています。
 データベースの正規化(normalization)で、データベースの冗長性を減らし、
参照時の矛盾を減らすことができます。
(2)セキュリティ(Security)
 ハッカーが増えることで、データのセキュリティが重要になってきました。
セキュリティは広範囲の概念で、認証・ライセンス・データ転送などを含みます。
(3)クラウドコンピューティング(Cloud Computing)
 RWW(ReadWriteWeb)最近の発表「Reaching For The Sky Through The Compute Clouds 」には、
クラウドコンピューティングがどういうふうに大規模WEB応用のリリースに変化を与えているか
を言及しました。大規模の並列処理、ローコスト及び素早くマーケット参入など。
 並列アルゴリズムが誕生以来、最初に迎えたのはGrid Computing、Grid Computingは
未利用のCPU資源を集め、集中計算を行います。最も有名なのはBerkley校のSETI@HOME計画です。
 なお、AmazonWEBサービスでもクラウドコンピューティングが応用されています。
APIを通じてのコール、例えばクラウドサービス(EC2)、大型メディアファイルのスドレージ(S3)、
インデックスサービス(SimpleDB)、シーケンスサービス(SQS)等等。
(4)並列計算(Concurrency)
 並列計算はエンジニアにとって一番紛らわしいところかもしれません。私たちは今までずっと
線性思考を使ってきたからです。だが、並列処理は現代システムではもても重要な位置づけです。
 並列計算はプログラミングでは例えばJAVAではスレッドで実現しています。並列の複雑性は
スレッドが品頻繁に共通データにアクセスしながら、自分の実行順序を保つことです。
(5)キャッシュ(Caching)
 キャッシュは現代WEBに欠かせない存在です。DB直接アクセスのコストが高いため、
キャッシュの存在がとても重要になってきます。最もよく使われるデータのみキャッシュされます。
 多くの大規模システムはMemcachedという分散キャッシュシステムを使います。Memcachedは
ネットワーク上の過剰メモリを使い、バッファリングさせます。現代のプログラミング言語Java,PHPなどはMemcachedの実装を持っています。
(6)ハッシュ法(Hashing)
 ハッシュ法の目的はデータアクセスの高速化です。シーケンスデータアクセスだと、
項目を探すコストはデータ列のレングスによりますが、ハッシュ法では項目毎に一個の数字で
インデックスし、良いハッシュアルゴリズムではデータ検索速度は一定です。
 データハウス以外もハッシュ法は分散システムにも重要です。Uniform HashはCloud Database
環境上、異なるコンピュータ間分散保存します。Googleのインデックスサービスはこの方法を使い、
URL毎に特定のコンピュータに分散しています。
(7)アルゴリズムの複雑性(Algorithmic Complexity)
 アルゴリズムの複雑性について、エンジニアは下記のポイントを理解する必要があります。
A.ビッグ・オー記法;
B.ループの内包を使わない、Hashテーブルを使うべき;
C.アルゴリズムのパフォーマンスを無視しない。
 いつもreuseとreadableを考慮したコーディングをし、アルゴリズムを簡潔で表現しましょう。
(8)多層化(Layering)
 多層化でソフトウェアの構成を検討するのが一番簡単かもしれません。良いソフトウェアは
ピラミット構成を使用します。コンポーネントを重ねた複雑度がありますが、コンポーネント自身
はシンプルです。優秀なソフトウェアはたくさん小さい再利用可能なコンポーネントから
構成されます。リファクタリングなどの手法を利用します。
(9)規約&テンプレート(Conventions and Templates)
 ネーミング規約とテンプレートの応用は開発ではよく忘れられます。だが、これらは有効な
手段です。ネーミング規約でソフトウェア自動化が可能になり、テストにも便利です。
 テンプレートはC++Javaのコンストラクトではなく、MVCモデルでよく使われるデザイン
テンプレートです。Cold Fusionの次JSPがこの機能を実現し(Volocity)、PHP自身は
テンプレートベースで作られました。
(10)インターフェース(Interfaces)
 ソフトウェア工学ではユーザインターフェースは重要な概念です。ソフトウェアは
リアルシステムのモデルであって、いかにシンプルなインターフェースで複雑な操作が
できることが核心です。