火線超人的故事,要從衛福部電子病歷格式轉向說起。在衛福部資訊處李建璋處長上任後,為了解決台灣 HIS 長年各自為政的孤島效應,把方向盤轉向 HL7 FHIR 與 SMART on FHIR,甚至把 SMART on FHIR 的創辦人請來台灣。這個動向我一直有在關注,走到這一步,大概就嗅到味道了:這一次不是口號,是玩真的。
真正讓我心動的是技術本身。FHIR 不挑程式語言,Java、C#、JavaScript、Ruby 都有現成的函式庫;生態系裡的伺服器和工具,幾乎個個都是 Docker 一鍵完成。我越看越眼熟:容器化、開放標準、模組化,這不就是我天天在用的那套積木嗎?原來自己熟悉的技術路線,跟國際醫療標準的走向,是同一條路。這條路,怎麼看都走得通。
後來,第一屆 FHIR 台灣 50 登場,號稱「醫療界的 0050」,要選出五十個代表性的 FHIR 應用。這個外號取得真的是好:0050 挑的是台灣最有代表性的五十家公司,台灣 50 要挑的是最有代表性的五十個 FHIR 實作。我想,與其在腦子裡空轉,不如把想法做出來投稿,看看自己的東西符不符合世界標準、能不能接上醫界的期待。於是有了火線超人。取這個名字的時候我自己得意了很久:FHIR 的官方發音就是 fire,中文取「火」;串接的通路是 LINE,取「線」。合在一起,火線超人,一個住在 LINE 裡的 FHIR 應用,病人打開聊天視窗就能查自己的就醫資料、看診進度、健康報告。後來它成了第一屆台灣 50 的優良得主。
得獎當然開心,但回頭看,過程中累積的東西比獎座實用多了:OAuth 授權怎麼接、多家醫院的伺服器怎麼管、病人身分怎麼綁,這些問題的答案現在都散落在專案的規格和程式碼裡。這個系列就是把這條路重新走一遍,整理成 30 篇,讓下一個想做 SMART app 的人少走一點冤枉路。
先講一下為什麼這件事值得做。
在醫院工作久了的人,大概都同意:病人的資料,常常出不了醫院的門。換一家醫院看診,檢驗重新來一次;想整理自己的健康紀錄,得在各家醫院的 app 和網站之間當人肉搬運工。這不是哪家醫院故意刁難,而是各家 HIS 長年各自發展,資料格式、介接方式通通不一樣,系統之間根本沒有共同語言。
這道牆擋住的不只是病人,還有開發者。就算你有本事寫出很棒的健康管理 app,光是面對每家醫院都不同的介接規格,串接成本就足以讓專案在簡報階段直接陣亡。
這幾年國際的解法,就是這個系列的兩位主角。
FHIR(Fast Healthcare Interoperability Resources)解決「資料長什麼樣、怎麼拿」。它把醫療資料定義成一個個標準的 Resource,像 Patient、Observation、Condition,而且用大家熟悉的 RESTful API 存取。對 web 開發者來說,呼叫 FHIR API 的手感跟呼叫任何一個 JSON API 沒兩樣。你甚至可以把 FHIR server 直接當成一個醫療專用的資料庫:資料表(Resource 的結構)和查詢介面都標準化了,只是查詢語言從 SQL 換成 HTTP。
SMART on FHIR 解決「app 怎麼安全地掛上去」。它站在 OAuth 2.0 與 OpenID Connect 的肩膀上,規範 app 怎麼請求授權、怎麼知道「現在在看哪位病人」、怎麼用最小權限拿資料。
我喜歡用插座來比喻,如果 FHIR 是電力規格,SMART 就是插座的形狀。兩個都標準化之後,寫 app 就像設計電器,不用為每一棟房子客製插頭,走到哪插到哪。在美國,標準化 FHIR API 與 SMART App Launch 已經進入 EHR 認證與合規要求,一個 app 寫一次,理論上就能在不同的醫療系統上跑。
在台灣,健保署與各醫院近兩年也陸續在推 FHIR,台灣 50 優良 SMART app 徵案這樣的活動就是生態系的起步。現在進場,時間點應該剛好。
開始之前,有些事情要先講清楚。SMART on FHIR 指的是授權與啟動框架,但一個 app 要真的能用,還有資料呈現、多伺服器管理、部署上線等一大串。所以這個系列談的是廣義的 SMART on FHIR 應用開發:以 SMART 標準為核心,順便講一下,做一個真實醫療 app 會遇到哪些事。
我把 30 天分成五部分:
| 部 | 範圍 | 內容 |
|---|---|---|
| 一、緣起 | day01 到 day04 | 背景知識與開發環境 |
| 二、SMART 核心 | day05 到 day14 | 授權框架完整拆解 |
| 三、做出有用的 app | day15 到 day22 | 臨床資料的讀寫與呈現 |
| 四、真實世界的坑 | day23 到 day27 | 多租戶、病歷整合、生態與安全 |
| 五、上線與展望 | day28 到 day30 | 部署、回顧與下一步 |
兩件事先說明。第一,火線超人是用 Ruby on Rails 寫的,但系列範例會用 JS/TS 搭配公開 sandbox,你不需要會 Rails,也不需要 LINE 帳號,有瀏覽器和編輯器就能跟上。火線超人的實作會以經驗談的形式出現,當作真實世界的對照組。第二,每篇都有「跟著做」段落,我的經驗是 SMART 的觀念用讀的很抽象,親手跑過一次授權流程,很多東西自然就通了。
第一天不寫程式,先逛一下建立手感。請打開瀏覽器做這兩件事:
SMART App Gallery 首頁,左側是應用類型與分類篩選,右側列出 Featured Apps
SMART Launcher 首頁,可以設定 Launch Type、FHIR 版本、模擬的病人與醫師,最下面填入 app 的 Launch URL
逛完心裡大概就會有個底:這個生態系已經很多人在蓋房子,我們接下來要學的,就是蓋房子的方法。
今天聊了三件事:醫療資料的高牆、FHIR 與 SMART 這對搭檔,還有整個系列的地圖。故事從台灣 50 和火線超人開始,但這個系列真正想做的,是讓更多人有能力做出下一個火線超人。
明天把地圖攤開,看清楚 FHIR、SMART、OAuth 2.0、OpenID Connect 這幾個名詞到底誰管誰,先把方位認熟,後面 30 天才不會迷路。