AngularではじめるOSS活動
今回の記事は「地方自治小景」の番外編、かつAngular Advent Calendar 2023への参加記事となります(12日目担当)。
ソフトウェア開発者でない人向けの前書き
12月にアドベントカレンダーと称して日めくりでクリスマスまで各々がなんらかのテーマで記事を書くというソフトウェア開発者の風習があります(傍から見るとやっぱ奇習だと思う)。今回の記事はその一つとして書くものです。
世の中にはオープンソースソフトウェアというこれまた奇習の積み上げによって築き上げられた代物が存在しています。このOSS(以下、オープンソースソフトウェアのことを略してOSSと呼称します)なのですが、ソフトウェア開発者以外に説明しようとするとき常に困った感じになります(どう説明していいものかホント毎回悩む)。OSSというのはオープンな場所で、オープンな方法でソースコードを開発していく結果として生まれたソフトウェアを総称したものです(すんません、かなり説明をゆるくしているので手斧投げないで🙇)。昨今のソフトウェア開発はよっぽどのことがない限り皆、このOSSの恩恵を受けていますし、OSSをベースにして進められています。
ほとんどのOSSの成果物はソフトウェア開発者がソフトウェア開発者向けに作るものになります。今回取り上げるAngularというのもその一つになります。といっても安心してください、普通の人からしたら外国語にしか思えない技術的なことを今回はお話しませんから。
Angularを使って地元の課題を解決してみた
OSSで開発されたOSSとして日本で一番有名なのは東京都の新型コロナ対策サイトだと思います。台湾のIT大臣がコミットするような派手なものではなくて今回紹介するのはちっさなちっさな自分の周辺の人のためのちょっとしたWebサービスになります。
Angular(とFirebase)を使って開発してみた際に経験したこと、学んだことをAngularやOSSに関わるソフトウェア開発者のコミュニティにちょっとでもこの記事で還元できたらよいな。
事の起こりはやはりコロナ
すっかり過去のこととなってしまっていますが、それは新型コロナで色々と生活に制約がまだあった2021年の10月になります。なんかこう一言で言うともやもやしていたんです。在宅で仕事ができ、新しい生活様式故にデジタル化に向けて(敢えてDXとは言うまい)追い風が吹きまくっている状態でこう、仕事をしているではないですか、仕事中もずっと家にいて、仕事以外も原則は家にいて、外出と言えばマスクを着けほんと最低限度の買い物とかのために近所のスーパーぐらいにしか行かない生活をずっと続ける。商店街の飲食店はいつだって閉店(そう飲みにも行けない!)、子どもの行事もですが地域のお祭りなども中止続きでなんか生活に色がない。モノトーンというかセピア色というかそんな世情だったのを思い出します。
何か地域の課題に対して自分のソフトウェア開発のスキルを活用できないかなという思いで春ぐらいからもやもや考え続けていたけど、何をしていいやらさっぱり手がかりがないまま半年ほど過ぎた頃のことでした。
足元にあった課題
それは市役所からの突然の電話から始まりました(最近慣れてきたんですが、役所の人って電話したがりますよね。ほんとなんでなんですかね)。地域の課題解決のためにボランティアしたいのでもし何かあれば声をかけてくださいと市役所のある部署にこの電話がかかってくる前に連絡をしていました(それがまた市のホームページの古風な連絡フォームなんですよ)。電話の内容は、わたしが住んでいる地区の自治会がデジタルを活用した策をあれやこれや考えているが、どうにもスタックしておりもしよければ話を聞いて相談に乗ってあげて欲しいというものでした。わたしの住んでいる廿日市市(宮島がある自治体です)では市を28の地区に分けて、それぞれの地域はなるべく自分たちで自分たちの課題を解決するように活動している地域活動団体が存在しています。今回デジタルの利活用で困っているのはたまたま私の住んでいる地区でした。というわけで早速その電話があった日、娘の保育園のお迎えの途中に地区の公民館におじゃまして話を伺うことにしました。
解決したい課題は地区に5か所ある集会所にそれぞれ遠隔のキーボックスと監視カメラを整備したのだけど、集会所から離れた公民館まで予約の申請や料金の支払いをしないといけないため不便になる。そこでエクセルを使ってどうにか頑張って予約システムを組もうとしたがどう逆立ちしても難しい(最初はエクセルをファイル共有してどうにかするとかGoogleカレンダーを活用してなどすでに色々と検討して半年ぐらいたっている状態でお話を伺った)とのことでした。そこで私は地元民として地元の集会所予約システムの開発に協力することにしました。
多世代チームでのアジャイル開発
同じ地域に住んでいたとはいえ初対面のしかも自分の父親よりも年が離れたチームで上手くソフトウェア開発、プロダクト開発が回るのだろうかとその時点では半信半疑でした(これはたぶんわたしと一緒に走った自治会の皆様も同じはず)。
最初の打ち合わせから1週間おきに私がお昼休みに抜けた時間を使ってその時点での動くソフトウェアのレビューを受け、そのフィードバックを受けて、週末にコードを書くサイクルでの開発がスタートしました。最初は、集会所の予約に必要そうな機能のフロントだけをAngular CLIの恩恵を受けながら当てずっぽうで開発して、書いたコードをローカル開発機でさくさく動かして見せてフィードバックを貰ってその場でそれをA4ノートにペーパーモックという形に落として、それをその週末コードに落とす、またフィードバックを受けるというものでした。その間、色々とお話を伺うことで解決しようとしている地域というドメインの理解を深めることができました(ちなみに住んで7年目だったか8年目だったはずですがなんも地元のことを知らなかった)。
最初の開発スコープはWebアプリではなくデスクトップアプリという形で公民館の窓口に来た人の予約を管理できる予約台帳という側面の強いものでした。今、振り返るとWebサービス化した際のランニング予算がかかるかもしれないという所に懸念があったのは表向きの理由で、本当にこの開発が上手くいくのか半信半疑であったというのが本当の所だったと思います。ちなみにこの時点のプロダクトはAngular + Electronのデスクトップアプリでした。この構成にしたのは無論、最終的にはWebサービス化したいというゴールをチームで握っていたからです。12月時点ではWebサービス化の話は一切なかったので私も当分先だろうなと思っていました。それが変わったのが年が変わった2022年の年頭のことです。
いつものようにスプリントレビュー(とはチーム内ではよんでなかったですがわたし的にはスプリントレビューだった)のために公民館にいくと、チームからデスクトップアプリではなくWebサービスとしての提供に挑戦したいとの申し出がありました。当然、ランニングコストがかかる可能性はあるけどそうであるにしても挑戦してみたいとのことでした。私としては作りこみ始めていたElectron側のコードを全破棄というマジかよという感じなのですが、それよりも半信半疑な感じだったのが3カ月間誠実に動くものを出してフィードバックを受け続けて、そこから学習してコードを書いていくというアジャイル開発がこの町内会とか自治会とか呼ばれる場所でできるのだとなぜだかとても嬉しくなったのを今でも思い出します。
さて、ここからは来年度(4月)のリリースめがけて初めて触るFirebaseのキャッチアップを進めながらAngularでのWeb開発をごりごり進める3ヵ月となりました。なんとかβ版リリースを4月に間に合わせ。その後はWebサービスとしては機能するものの窓口に来て予約をする人の受付は公民館の職員さんが受け、その内容を予約システムに反映する必要があるため2か月間はベータで実際の業務フローで回してみて改善が必要ならプロダクトを改善するなどを進め晴れて6月にサービスインとなりました。
運用と機能拡張
その後の機能拡張としては窓口申請者の紙申し込みを無くすためにタブレットPCの購入とその端末で利用するための窓口入力モードの追加や集会所の使用料を予約システムから連携して出力するための機能の追加などをおこないながら大きなサービスダウンもなくかれこれ1年半近く運用してきました。
嬉しい誤算と今後
まず最初の嬉しい誤算はなんといってもゴリゴリのスタートアップじゃなくてもアジャイル開発ができるという経験ができたことです。もう一つは最初のリリースが完了した後に参加された方がAngularの勉強ははじめて開発に参加しようとしてくれていることです。正直なところ、私一人の開発に限界があるのは理解していて近隣の工業大学の学生さんあたりが二人目の開発者かなと思っていたのですが、まさかの自治会の方が二人目の開発者でした。元々、プログラムを組んだことのある方ではあったのですが臆せず新しい技術にキャッチアップして手を動かそうとする姿勢には敬服です。
ここまできて、あれそのコードのリポジトリはどこだよ?早く読んでみたいんだけどと思った皆様、ごめんなさい。まだコードベースはクローズドな状態にあります。
クローズドな状態にしている理由は2つあります。まず第一に今のコードベースは対象にしているユーザー(特定の地区)に特化しているため十分な抽象化が図れていない状態にあります。そのため、現在、他の地区(過疎地域や離島含む)で実際に適応する場合を想定してよりドメインを捉え直してなるだけ多くの場面で課題を解決し価値を発揮できるように練り直しを
進めています。もう一つの理由として、政府が進めているガバメントクラウド上でも展開できるようにマネージドサービスであるfirebaseから離脱を進めています。
来年への抱負としめ
来年は既存コードベースをOSS化に向けてこんな改善に取り組みましたが記事化できたらよいな
新しいコントリビューターがその過程で学んだAngular(に限らずでぜんぜんよいけど)に関する記事を書いてくれたら嬉しいな
廿日市市での最初のOSSのサービス採用に向けた目途がたっているとよいな(今年度はこの辺も踏まえて絶賛、市議会や市を相手に政策提案とかそういうのしてる。ソフトウェア開発者感がない)
アドベント(待降節)という季節は希望について語るのにちょうどよい機会だろうということで、ポエム全振りな記事ですが、わたしもこの活動がきっかけでGovTech企業に転職し使うフレームワークもAngularからNextjs/Reactになってしまいましたが、こうして仕事以外の実際のプロダクト開発でAngularを使う機会を持てているのと、すごく地味にですがAngularユーザーが増えるのに貢献できているのはとっても楽しいことです。
コロナに限らず碌なことがないような世の中だとは思いますが、「暗いと不平を言うよりもすすんであかりをつけましょう」と言うのはちょっと説教くさいのでOSS界隈的に言い換えてみると「バグっていると文句を言うよりもすすんでコントリビューターになりましょう」の精神でちょっとリアルの世界のIssueを見つけてそれに貢献(コントリビュート)してみるのもなかなかに面白い開発体験ですよ、と別の意味でのOSS活動の勧めで筆をおこうと思います。