# 2018年1月現在、ASP.NETをメインとした自社パッケージWebアプリケーションの開発業務に従事しています。
* このプロジェクトは、自治体向けオンプレミス環境を対象とした自社パッケージWebアプリケーションをASP.NET(WebForms)+ SQL Serverでフルスククラッチで開発するプロジェクトです。
* 元々、クライアント/サーバー型のVB6アプリケーションとして自社パッケージで持っていたものを、Webアプリケーションとして刷新するプロジェクトで、技術リーダーとして主導しました。
* Webアプリケーションを生み出すにあたって、ASP.NET WebForms + VB.NETで開発することが社内方針と決まっていて、また、自治体向けWebアプリケーションによくあるInternet Explorer限定ではなくGoogle ChromeやFireFoxでも動かすことができることも求められていました。
## 以下の考えの下、プロジェクトを進行しました。
### 開発の手間を可能な限り省ける環境にし、プロジェクトに初めて参画した人でもコードの水準が同程度になるようにしたい
* データベース設計書と、プログラム内部で使用する定数値や各種IDを管理する簡易データベースの二つを入力ファイルとする、ソースコード自動生成ツールをゼロから作成しました。
* その自動生成ツールでは、O/Rマッパー(Dapper)で使用するエンティティファイルや、テーブル定義の各種Create文、及び各定数やIDをまとめた定数ファイル等を自動生成するようにしました。
* このツールのおかげで、変数で比較する値を定数ファイルに持つことができ、可読性が高く変更追従性に強いソースを誰でも作成できるようになりました。
* また、社内で誰もCIに興味がない中、Jenkinsを使用し、MsTest+ReportGenerator+OpenCoverと組み合わせることによって単体テストの自動化・テスト駆動開発の導入も行って、カバレッジの可視化も行い、各々にコードの質を意識させるようにしました。
### WebFormsでもリッチなUIを提供したい
* サーバーサイドで生成されるHTMLをIE8以降のブラウザで互換性を持たせつつ動作させるために、jQuery1.12.4を選択しました。
* クライアントサイドJavaScriptについては、下につくメンバーが殆ど何も触らなくて良いように、全て自分でゼロから用意しました。正規表現で入力バリデーションを行いBootstrap3に沿ったツールチップを出すような作りにしたり、JavaScriptに疎いメンバーだけになることが予見されていたのでサーバーサイドでBootstrap3のダイアログの操作結果をAjax経由でハンドリングするような仕組みにしたり、日付系入力コントロールに入力された様々な形式の日付(2017/12/24,H291224,429.12.24, etc)をシステムで統一された形式(H29/12/24)に自動変換するような関数群を用意することで、新規参画メンバーのスキルが低くても良いようになりました。
* CSSについては、各々のメンバーが勝手に作ると煩雑で分かりにくいCSSファイルができることが予測されたので、開発部署で初めてとなるSass(SCSS形式)でベースを作成しました。CSSをわかりやすく構造化できたので、素早く効率的にUI変更に追従できるようになりました。
### 客先への導入で、カスタマイズを可能な限り0にしてコストを下げたい
* Webアプリケーションに関しては、ページ内のグリッドの表示列の順番を可変にするような仕組みを整えたり、ダイアログに表示するメッセージを可変表示できるようにしたり、ページ内のラベルの表示文字をデータベースの設定を変更するだけで可変にできるようにしたり、パラメータの追加があってもUIから設定変更可能な仕組みを整えたりしました。
* 帳票も出力するシステムのため、帳票出力のフレームワークも自分でゼロから作成しました。CoReportsという帳票作成支援ツールを使用したのですが、従来のクライアント・サーバーシステムでは決められた文字しか出せなかったのを、帳票定義体上のオブジェクトのIDの命名規約によって動的に出力内容を編集できるような仕組みを整えました。また、外字も使用するため、外字の埋め込みができるように、動的にサーバー上のMicrosoft Print To PDF, XPS Document Writer仮想プリンタを制御して、外字を埋め込んだPDF/XPSファイルを生み出す仕組みにもしました。
### バッチアプリケーションとの連携をスムーズに行いたい
* 大量の帳票を出力するため、サーバーサイドにバッチ実行環境もゼロから作成しました。Webアプリから登録されたジョブを制御・実行するためのWindowsサービスも作成し、Windowsサービスとバッチ(コンソールアプリケーション)との連携には部署初のPowerShellも導入し、わかりやすい連携の仕組みを作成しました。
# 長くなりましたが、上記の通り、属人化を避けモジュール化・平準化された開発を行うことへの熱意は誰にも負けません。