フロントエンド・バックエンドにおいて、テックリードを担えるような知識と技術を身に着けたい
他者をけん引できるほどの技術力は、かなり自在にソフトウェア開発を行える技術力だと考えられる。
その技術力を生かし、世の中の不便さを少しでも解消できるものを出来るだけ多く作っていきたい。
統合診療支援システムパッケージに対する機能開発及び機能追加
ウィザード形式で最低限システムを動作させるための設定を実施するツールを開発
施設への統合診療支援システムパッケージの販売拡大に伴い、導入・セットアップ作業のコストを削減するメンテナンスツールの整備が必要となった。
これまで導入・セットアップ作業は、テキストファイルの編集、SQLの作成・実行、DB操作、bat処理の作成・実行など、必要であった。
そのため、システム導入は専門のシステム導入エンジニアチームが行っていた。
しかし、ハードウェア設置を行うサービスエンジニアチームがシステム導入作業を行うことになり、簡易システム設定ツールを開発する運びとなった。
当システムは頻繁に機能や付随する設定項目が追加されるため、簡易設定システム設定ツールで設定できる項目も増えることが予想される。
そこで、設定項目オブジェクトのフレームワークを定義し、このフレームワークを実装したオブジェクトを注入することで容易に設定項目の追加ができる仕組みを実装した。
導入・セットアップ作業者が、DB操作やテキスト編集などを意識せずともシステムの構築を完了できる簡易システム設定ツールを作成することができた。機能制限は発生するが、元々の作業コストを1/6程度に抑えることができ、全国で約60施設に導入されている。
統合診療支援システムは、病院内に煩雑に散らばる診療情報を一元管理し、一画面で多数の情報を整理し、表示することで医療従事者の診療行為を補助する役割を担う。
画面のレイアウトを保存し、院内全体や診療科、医療従事者単位などで保持することができる。
しかし、院内全体で共有しているレイアウトを各個人がコピーし、独自に変更・修正などをすることができなかった。
よりレイアウト機能を汎用的に利用できるように、レイアウトのコピー機能を実装した。
既存機能の改修であり、さらに当パッケージのコア部分の修正であるため、影響範囲を入念に調査しデグレが発生しないように努めた。
また、様々な医療情報を様々な表示形式で多態的に取り扱う部分であるため、改修・拡張を行うことでポリモーフィズムの考え方を深めることにつながった。
検査情報のレイアウト保存機能は本製品のコア機能であるため、より使いやすい機能に発展させることができた。
医療従事者は多くの患者の診察、検査、治療を行っていく中で、どうしても漏れや見逃しが発生してしまうことがある。その結果、患者に対し重大な結果を齎してしまうこともある。
そこで、その漏れや見逃しを補うために、診療オーダーや検査結果をトリガーに、患者に対するアクションを提示する通知機能を追加することになった。
例えば、検査値が閾値以上の場合に、医師に対し再検査や処置を通知および催促することで、漏れや見逃しを未然に防ぐことができる。
ドメインに合わせたオブジェクトを定義していくことで、1クラスあたり200行程度の規模に収めることができた。
3週間という期間での開発であったが、積極的にモデリングを活用していくことで30クラス以上の実装をスムーズに終えることができた。
現状、3種類の通知パターンが存在し、それぞれメッセージフォーマットと埋め込む値の種類が異なる。また、今後も通知パターンが増えていくことが予想されるが、JSONの解釈とメッセージの生成を動的に行うことにより、コード上の修正を必要とせずに対応することができるようになった。
ドメインに合わせたオブジェクトを定義していくことで、1クラスあたり200行程度の規模に収めることができた。
3週間という期間での開発であったが、積極的にモデリングを活用していくことで30クラス以上の実装をスムーズに終えることができた。
現状、3種類の通知パターンが存在し、それぞれメッセージフォーマットと埋め込む値の種類が異なる。また、今後も通知パターンが増えていくことが予想されるが、JSONの解釈とメッセージの生成を動的に行うことにより、コード上の修正を必要とせずに対応することができるようになった。
全国の病院に対し単一のパッケージとして展開しており、なおかつ10年ほどの歴史を持つシステムであるため、かなり技術的負債が蓄積している。
具体的には、
技術的負債由来の開発工程の遅延やバグもかなり散見されている。
これら技術的負債の原因として、下記が考えられる。
技術的負債を改善するため、下記の取り組みを提案し実施している。
コードレビューは直接的にコード設計の改善を見込める他、コード設計思想の説明(アウトプット)及び指摘による考え方の継承・共有も行える。
テストコードはコード品質の向上にも繋がるが、テストコード自体が一つの仕様書になるため、チーム内での設計・仕様の共有を補助する。
まずは、改善実績を作るために少人数のグループを作成し、そのグループ内で施策を実施している。
具体的には、3人のチームを結成し週一回のコードレビューと知識共有及び勉強会のためのミーティングを実施。また、この3人のチームで一つの機能を担当しているため、その機能に対するユニットテストの作成も実施
ゲーム「Minecraft」に対するMODの自主開発
Java言語及びIntelliJIDEを用い、下記の要素の実装を行った。
ForgeMDKと呼ばれるMOD開発キットを利用し、既存のゲームシステムの変更や独自のアイテムやキャラクターの追加等を行う必要がある。実装方法やライブラリの解説が記述されているForgeMDKの開発者ドキュメント(英文)が存在するが、かなり簡素な内容なため、基本的にはデコンパイルされたMinecraftのソースコード、およびForgeMDKのソースコード自体も参照し、それらを参考に実装を行っていく。Javaをほぼ未経験の状態で、コメントもないソースコードを読み上げ理解していくのは非常に困難だった。
Webアプリケーション開発を通してのRust+Reactの学習
自身の開発スキル向上及び、Webアプリケーションへの知見を深めるためにこの取り組みを実施した。
フロントエンド言語として人気の高いReactと、高速かつメモリ安全性の高さで評価が上昇しているRust言語をバックエンドに採用することで、両言語の学習を行うこととした。
Todoアプリケーションを下記の構成で開発した。
Todoを作成、表示、管理する機能及び、Todoに対しラベルを貼付する機能を実装した。
Rustの基本的な考え方を知ることができた。
Reactの基本的なUI作成方法を知ることができた。
今までC#やJavaなどのオブジェクト指向言語に触れてきたため、関数型言語の趣向が強いRustの記述方法になれることに時間がかかった。
また、Rustの中心的な考え方である、オブジェクトの所有権及びその参照と借用も独特なものであり、理解に戸惑ってしまった。
作成したTodoアプリケーションを基に、機能拡張を行っていく。
現在検討している機能としては下記のとおりである。
また、Rust言語の知見を深めるために、下記のライブラリ開発を検討している。