僕が実務訓練を通して学んだこと

僕の大学は,4年生の1月上旬から2月下旬までという特殊な期間に実務訓練(いわゆるインターンシップ)が必修科目としてあります. 実際に企業や研究所で実務や研修を受けるわけですから,研究室とは全く違うことを学ぶことができます. 今回は,そんな実務訓練を通じて学び,自分で考えたこととして,「ソフトウェアの標準化」について,特に社内ライブラリとプログラミング言語について書きます. もちろん,本文には,私の実務訓練先の企業の情報は一切含まれませんので安心してください.

標準化とは?

実は,僕は実務訓練を行うまでソフトウェア開発における標準化について一切知りませんでした. この記事を読んでいる人は,多分標準化について熟知されている方たちだと思うのですが,一応標準化についておさらいしましょう. 標準化について,NTT DataのWebページには次のように記載があります.

システムやソフトウェアを開発するプロジェクトでは、作業の手順や成果物を定義するのが一般的です。すべての開発担当者の作業を標準化することで、作業効率や作業品質の向上、コミュニケーションロスの低減などを実現できます。これによって、プロセス品質が向上し、さらには開発するプロダクトの品質も向上することにつながります。NTT Dataのコラムページより

つまり,標準化とは,結果(プロダクトの品質向上)を達成するために,過程(プロダクトを作るプロセス)を確立することのようです.

標準化のメリットとして,プロダクトの品質向上と高い生産性はもちろんのこと,プロダクトとプログラマの独立性*1が向上します.

標準化と言語と社内ライブラリ

標準化を推し進める場合,社内で使う言語も統一する必要があります. また,その会社独自のソフトウェアライブラリも開発する必要があります. もちろん,社内ライブラリは再利用性が高いものでないといけませんし,社内で使う言語も全員が慣れ親しんだ言語である必要があります. これらを考慮すれば,オブジェクト指向言語オブジェクト指向なライブラリを組むことが最適であるように感じます.

オブジェクト指向言語オブジェクト指向なライブラリが適切に組まれていれば,その言語を使用した経験が一切なくても実際に開発を行うことができる,これを実務訓練で最初に学ぶ事ができました.

では,最適に組まれたライブラリとは何でしょうか? 僕は,誰が見ても使い方がわかり,どこにどんな関数があるかが誰でもわかり,派生したクラスや処理を書く場合に一切コピペを必要としないライブラリだと思いますし,たぶんみなさんもそう思っていただけると思います.

たとえば,このサイト様から引用し,データベースに次のようなテーブルがあるとします.

CREATE TABLE SHOHIN(
    CODE  CHAR(3) PRIMARY KEY,
    NAME  CHAR(20),
    PATH  CHAR(40),
    KIND  CHAR(12),
    GENKA DECIMAL(7)
)

このテーブルを,例えばC++で表現するなら次のようになるでしょう*2

struct Shohin
{
    std::string code;
    std::string name;
    std::string path;
    std::string kind;
    double genka;
};

C++でこのように型を定義すればデータベースの方のテーブルも設定されると楽ですが,C++の構造体では,最大長さやDECIMALなどなどを表現できません. もしくは,逆にデータベースのテーブル定義からC++の構造体を生成する方法があります. この方法は,外部ツールを使用する必要があるので,テストの段階でテーブル定義を変更する場合,またツールで構造体を生成する必要があります. 構造体を生成しなおすということは,その他さまざなコードにも変更を加える必要があるわけです. これでは生産性は向上しません.

やっぱりD言語

こういう時,やっぱりD言語は強いです. たとえば,次のように構造体を定義してやります.

@SQLTable!"SHOHIN"
struct Shohin
{
  @SQLColumnNameAttr!"UpperCase"
  {
    @SQLAttr!`"商品コード"|CHAR(3)|Key`
    string code;
    
    @SQLAttr!`"商品名"|CHAR(20)`
    string name;
    
    @SQLAttr!`"画像URI"|CHAR(40)`
    string path;
    
    @SQLAttr!`"商品種別"|CHAR(12)`
    string kind;
    
    @SQLAttr!`"原価"|DECIMAL(7)` @Invariant!"a >= 0"
    real genka;
  }
}

なんかゴテゴテに修飾されていますが,コレ1つを定義しておけばSQLのCREATE TABLE文を生成することも可能ですし, たとえばデータベースに格納するデータが正常かどうかをチェックする関数も生成可能です*3. さらに,SELECTやWHERE,ORDER BYの自動生成などなども可能です. この方法の重要な点は,プログラマがわざわざコードを書かなくても,この構造体宣言さえしておけばすべて自動生成可能であることです. つまり,プログラマは何もする必要はありませんから,誰がプログラムを書いたとしても誰も迷うことはありません. さらに生産性は向上しますし,人的なミスは圧倒的に削減されます. これこそが標準化が目指すものではないでしょうか.

「けど,D言語って聞いたこと無いよ」って,最初の方に書きましたが,適切にライブラリが組まれていれば,一切書いたことのない言語でもスムーズに書くことができます. 問題ありません.

 それでもD言語はちょっと

それでもD言語は無理,そりゃあそうでしょう. 未だに言語仕様は確定してないし,ライブラリも充実しているとは言えません. そういう会社にオススメなのが,.NET系言語です. .NET系言語は,非常に優れたライブラリを持ち,さらにユーザー定義の属性や実行時リフレクションも行えますので,D言語と同じような機能を作ることも不可能ではないと思います. 多少強引になるかもしませんが. さあ,C#を書くのです!

まとめ

会社の人へ, D言語書きましょう.

*1:プログラム制作者でなくても,保守がしやすいということ

*2:DECIMAL(7)をdoubleで表すのは良いのだろうか?謎

*3:もちろん,SQL文を生成する関数テンプレートとか,チェックする関数テンプレートを書かないといけませんが,ライブラリで定義してれば後は呼び出すだけです