TECH PLAY

株匏䌚瀟メドレヌ

株匏䌚瀟メドレヌ の技術ブログ

å…š1363ä»¶

はじめに みなさん、こんにちは。゚ンゞニアの山田です。今回は Pharms 開発チヌムがチヌムビルディングの䞀環ずしお行なっおいる「TGIF」ずいう斜策に぀いお参加しおいる皆さんに、どのような効果があるのかなどを聞いおいこうず思いたす。 むンタビュむヌ玹介 新居さん 2016 幎入瀟。゜ヌシャルゲヌム開発䌚瀟を経お、メドレヌぞ入瀟。入瀟圓初はゞョブメドレヌのプロダクト開発などを担圓しおいたが、2020 幎から Pharms で䞭芏暡斜策の開発を䞭心に業務を行なう。 小田さん 2021 幎入瀟。倧手メヌカヌで病院や調剀薬局向けの IT システムの開発業務を経お、メドレヌ入瀟。Pharms では䞭芏暡斜策の開発を䞭心に業務を行なう。 兒玉さん 2018 幎入瀟。2021 幎 4 月たで CLINICS オンラむン蚺療のセヌルス郚に所属。その埌゚ンゞニアに瀟内転職し、Pharms の開発に携わる。珟圚はサヌバサむドの開発を䞭心に担圓しおいる。 新倉さん 2021 幎入瀟。䞍動産テック䌁業でのデザむン業務を経お、メドレヌぞ入瀟。入瀟時から Pharms のデザむナヌずしお各皮デザむンの業務を行なう。 叀川さん 2022 幎に新卒入瀟。珟圚はプロダクトの改善を幅広く担圓しおいる。 Pharms ずいうプロダクトに぀いお 山田 : たず「TGIF」に぀いお聞いおいく前に、Pharms ずはどのようなプロダクトなのか教えおもらっおもよいですか? 新居 : 䞀蚀で蚀うず、薬局の業務効率化支揎システムです。 CLINICS オンラむン蚺療 で蚺察を受けた患者さんや、盎接来院された患者さんからの凊方箋などを受けお、Pharms を通しお服薬指導や、䌚蚈、服薬フォロヌアップなどを䞀貫しお行なえるシステムになっおいたす。 新居さん 山田 : ナヌザヌに぀いおですが、䟋えば、自分が開発を担圓しおいる医療介護求人サむトの ゞョブメドレヌ では、お仕事をお探しの求職者の方々ず、求人情報を掲茉いただく医院・事業所の方々が䜿甚しおいるシステムなのですが、Pharms はどのような方に䜿われるのでしょうか? 小田 : CLINICS アプリを通しお間接的に患者さんが䜿っおいたすが、倧きい割合を占めるのは顧客である薬局のスタッフさん薬剀垫などですね。 小田さん 山田 : やはり珟堎の薬剀垫さんが䜿っおいるサヌビスずいう性栌が匷いんですね。 Pharms 開発チヌムの TGIF ずいう詊みに぀いお TGIF を始める前の課題感 山田 : それでは、いよいよ Pharms 開発チヌムで行なっおいる TGIF に぀いお聞いおいきたいず思いたす。元々、この蚀葉はどんな経緯で付いたんですか? 小田 : 元々は英語圏で蚀われおいる “Thank God It’s Friday” ずいうのが語源で、そのたた金曜日の倕方に開催されるものだったのでこの名前を付けおいたす。ちょっず昔の蚀葉で蚀うず「花金」ですね。 山田 : 「1 週間が終わりだヌ!」っおいう開攟感を衚わしおるんですね。どういうきっかけでこの TGIF をやっおいこうず思ったんでしょうか? 小田 : 䞀昚幎の自分の入瀟前のタむミングで、Pharms 立ち䞊げ時のメンバヌが別のプロゞェクトに集䞭するこずずなり、チヌム䜓制がガラッず倉わる時期がありたした。それ以降、チヌム内の情報がサむロ化したり、チヌムずしおの䞀䜓感がないずいう課題を感じおいたした。この課題を解決するために 雑倚に䜕でも話せるコミュニケヌションの堎 を䜜ろうずいうのが、きっかけでした。 新居 : もちろん、それたでもチヌムで話す機䌚が党く無かったわけではなく、開発蚈画をクォヌタヌ単䜍で䜜っおいるのでそのタむミングでディスカッションする堎を蚭けおいたした。でも もうちょっずコミュニケヌションの頻床を増やしたらより良くなりそうだよね ずいう話があり、毎週金曜日の TGIF が誕生したした。 山田 : そういう経緯だったんですね。それたで゚ンゞニア・デザむナヌが参加する定䟋のような䌚議䜓はどのようなものがあったんですか? 新居 : クォヌタヌ毎のディスカッション以倖だず、週䞀で行なわれる「プロダクト定䟋」だけでした。こちらは開発メンバヌだけではなく、事業郚のメンバヌも参加しおプロダクト開発党般に぀いおの共有を目的にしたものです。それ以倖で定䟋の䌚議䜓はなく、デむリヌで行われるような「朝䌚・倕䌚」も Pharms 開発チヌムでは行なっおいたせんでした。 山田 : チヌム䜓制の倉曎埌、新しいメンバヌの加入もあり、今たでのコミュニケヌション量では足りなくなっおしたったんですね。 新居 : はい。チヌムの状況が倉わっお行く䞭で、 もっず生産性を䞊げおいきたいずいう思いがありたした 。チヌムが小芏暡だった頃は隣の垭の同僚゚ンゞニアに盞談し぀぀開発をドンドン前に進めおいくこずができたんですが、人数が増えおくるずそうしたコミュニケヌションも垌薄になりたす。具䜓的には、開発をしおいお蚭蚈方針・実装方針などがズレるこずは倚々あるず思うんですが、それをさっず䌚話しお軌道修正し、開発を掚進しおいくずいうのが難しくなっおきおいたした。 TGIF の実際 山田 : では、具䜓的に TGIF でどのような事を話し合われるんでしょうか? 新居 : たずは今週の振り返りから始たりたす。前週の TGIF で Try に察しお個々がどう動いおいくかを決めおいるので、それに察しお振り返りをしおいきたす。各自コメントを添えお䜕%達成したのか話しおいきたす。 小田 : その埌、今週のチヌム党䜓の動きに察しお KPT を実斜したす。チヌム党䜓ずしお良かった動きや課題などを挙げおいき、内容を深がったり課題解決に向けお意芋を亀換したりしおいたす。たた、以前はチヌムの動きずは関係ない個人の話などが挙がっおくるこずが倚かったのですが、 チヌム党䜓での生産性の向䞊ずいうこずを目的ずしお考えた堎合、それず関連のない個人の話をしおも寄䞎しない ので、チヌム党䜓に関わるこずをメむンにするよう改善し今の圢になっおきたした。 KPT が終わったら、隔週でチヌム目暙ず Problem で挙がったこずなども螏たえお各自の来週の Try を決めたす。 新居 : 最埌に、ちょっずしたこずでも良いのでチヌムに共有したい「気になるこず」を話しおいきたす。ここは開発に関係する・しないに関わらない話題を出しおいたす。䟋えば 、Pharms のプロダクト自䜓や䌚瀟の組織的なこず、プルリク゚ストのレビュヌのお願いなど雑倚な話題ですね。 その䞭で「ラむブラリアップデヌト」に぀いおの課題や進捗などの共有もしたす。単玔にバヌゞョンアップしお枈むずいうものであれば良いですが、アップデヌトの結果、広範囲に圱響があったりだずか、そもそも゚ラヌなどで䞊手くアップデヌトできないなどがあるので、そうした困り事の共有ず解決を目的ずしおいたす。 山田 : 先ほどチヌム目暙を隔週で決めるずいうお話でしたが、こちらはどういう颚に決めおいくんですか? 小田 : KPT の内容を螏たえお、基本的には Our Essentials (以䞋 OE) に照らし合わせお決めおいきたす。そのチヌム目暙に察しお、個人の目暙をブレむクダりンしお決める圢にしおいたす。 固くなりすぎない䌚を目指しお 山田 : なるほど。 OE に合わせお目暙蚭定しおいくずいうのは、分かりやすくお良い ですね。話は少し逞れたすが、この TGIF では毎回お菓子を持ち寄っお行なっおいるずいうこずですが、どうしおなのでしょうか? 小田 : TGIF を行なっおいる内に、メンバヌ間での意思疎通の少なさによっお、チヌムの生産性が䞊がらないずいう課題は解決しおいきたした。しかし、続けおいる内に段々ず䌚自䜓が固い雰囲気になっおきお、かっちりずした振り返りの堎ずいう感じになっおしたいたした。元々 TGIF の圚り方ずしおはどういうものだっけずいう原点に立ち返るず、やはり 「気軜にコミュニケヌションができる堎」ずいう点が重芁 だず再認識したしお、そこからは堎の雰囲気を柔らげるためにお菓子を持ち寄り始めたした。 お菓子を囲んでの TGIF 山田 : 確かに固すぎるず、ちょっず䌚の名前ずそぐわない感じになっおしたいたすね。 TGIF 運甚の秘蚣 山田 : 他に TGIF を運甚する䞊での工倫などはありたすか? 新倉 : 䌚の性質䞊、話が盛り䞊がっお時間がオヌバヌしがちなので「 TGIF で話す内容はチヌムの成長に぀ながるこずに限定する」など、 効率的か぀意味のある運甚 になるよう進め方の芋盎しず実践は日々詊行錯誀しおいたす。 新倉さん 叀川 : 自分は去幎の新卒入瀟ですので、「蚀っおもしょうがないかな?」ずいうような事もあるのですが、あえおそういった事を考えずに積極的に発蚀するようにしおいたす。 実際に発蚀したために他の方ずの共有もできたすし、孊びになるような議論に発展するこずも倚い ので、蚀っお良かったずいう堎合が倚いです。 叀川さん 兒玉 : ささいな事でも、誰かが チヌムの為に動いた事に察しおは積極的にお瀌を蚀っおいたす 。誰かがちゃんず自分のやったこずを芋おくれおいるず認識できるこずが、チヌムの雰囲気を良くし、チヌム運営の奜埪環に繋がっおいるかず思いたす。 兒玉さん 新居 : ちゃんずチヌム党員にずっお意味がある時間にするずいうこずは意識しおいたす。仮にあたり生産的な時間ではなくなったら TGIF を止めおしたっおも良いず思っおいたす。その為には 「チヌムのために話しをした方がよいこずは必ず話す」「本音ベヌスで建蚭的に議論する」「出おきた課題は必ずクリアにしお次週以降に解決を目指す」 ずいう事を意識しおいたす。 こうしお話すずある意味圓たり前の事ばかりなんですが、参加者党員がこうした点を共通認識ずしお持っおいないず、単に KPT を発衚するだけの堎ずなり䌚自䜓が圢骞化しおいっおしたいたす。ですので、きちんずこの共通認識を持っお臚めるようにするずいうのを倧切にしおいたす。 小田 : たた、TGIF で話が盛り䞊がるのは良いこずなのですが、週に䞀回のこの堎を埅たずにもっず䌚話を掻性化する取り組みずしお 週の頭に Slack のプロダクトチャンネルにテディベアがリマむンダヌで珟れる ので、そのスレッドで話しをするようにしおいたす。 山田 : ぞえヌ!䜕でテディベアなんですか? 新居 : プログラミングで自分で解決できない問題が出おきたずきに、テディベアのぬいぐるみに話しかけるず問題が敎理されお解決できるずいうテディベア効果から取っおいたす。 テディベアの リマむンダヌにコメントが付いおいる様子 山田 : なるほど、それでテディベアが出おくるんですね。 小田 : TGIF を埅぀たでの時間がムダだよねっおいう話もあっお先皋の効率化の話も含めお行なっおいる斜策です。 新倉 : これたで TGIF やテディベアが無い時は䞋手をするず䞀週間誰ずも䌚話をしおいないずいうこずもあったんですが、この取り組みをしおから 本圓にコミュニケヌションが増えたした 。 TGIF の利点ずこれからに぀いお 山田 : ありがずうございたす。既に話にも出おいたすが、TGIF をやっお良かった点はどういったものがあるか改めお聞かせおください。 小田 : やっぱり栌段に「チヌムでの開発」をしおいるずいう意識が高たったこずが良いこずでした。それたではやはりコミュニケヌションなどが䞍足しおいたのですが、今は TGIF などのおかげですぐに盞談しようずいう感じにもなっお良いチヌムになっおきたなずいう感觊がありたす。 さらにチヌムを良くする土壌 にするようにしおいきたいです。 新居 : 1 ぀目は以前よりお互いのこずを知れるようになっお心理的安党性が高たったこず、2 ぀目はチヌムずしおの方針や共通認識を合わせる堎ずしお機胜しおいるこず、3 ぀目は毎週前週からの課題を改善でき、チヌムや個人の成長を感じられるようになったこずです。 党䜓的にチヌム運営にプラス になっおいるず感じおいたす。 新倉 : 私は TGIF が始たっおから半幎埌にゞョむンしたした。元々ぱンゞニアの皆さんだけのものだず思っおちょっず尻蟌みしおいたずころがあったのですが、蓋を開けおみるずプロダクトやチヌム自䜓に぀いおの話が倚く、 デザむナヌずしおも非垞に孊び があるものでした。党䜓的にはクォヌタヌ毎に目暙を決めおそれに向けお動くのですが、その目暙たでの道のりを埋めるずいう意味でも、TGIF があっお良かったです。 新居 : 時にぱンゞニアだけにしかわからない話題などもあったりもしたすが、倧郚分は新倉さんが話したようにプロダクトやチヌムの改善をいかに行なうかずいう話題になっおいるので、そこでデザむナヌ芖点での話が聞けお゚ンゞニアずしおも倧倉助かりたす。 叀川 : 自分は入っおからずっず TGIF があるのである皮圓たり前の存圚なのですが 。チヌムメンバヌの人ずなりなどが分かるのは倧倉助かりたす。たた、自分ずは党然違う経歎を持っおいる゚ンゞニアの方などは同じ話題でも、 自分ずは党然違う芖点を持っお話をしおいたりするので、すごく勉匷になっおいたす 。チヌムの課題が話し合われるので、以前は自分のタスクが終わったら、「次は䜕をしよう」ずいう感じになっおいたんですが、TGIF のおかげで「チヌムがここで困っおいるなら自分がやろう」ず客芳的に分かるようになっおいたす。たた、OE は半幎毎の自己評䟡の際にも䜓珟できおいるかどうかチェックするこずになるので、TGIF での目暙達成床がそれに圹立ちたす。 兒玉 : 䞀番は心理的安党性が高くなったこずです。゚ンゞニアずしおの働き方ずセヌルスをしおいた時の働き方が党然違うずころが倚かったので、1on1 で新居さんずそういった差異に぀いお聞くずいう機䌚しかなかったんですが、今は TGIF があるのでここで皆さんに聞けるようになっお様々な芖点でのアドバむスを頂けるようになりたした。たた、゚ンゞニアずしおお勧めの曞籍や勉匷法など普通に聞こうずするず、 あたり機䌚がないような郚分も気軜に聞けるようになったので、勉匷の効率も良くなりたした 。 山田 : みなさん、ありがずうございたす。それぞれの立堎ですごく有甚な䌚なのが分かりたすね。 TGIF のこれからに぀いおもお話ください。 新居 : 先ほども少し話したしたが、圢骞化しおしたい惰性で行なっおしたうずいうこずになるのが本圓に怖いず思っおいたす。運甚するこずが目的になっおしたい、本来の目的が達成できないず本末転倒ですし。今もやっおいるこずですが、ちゃんずメンバヌ構成や状況に応じお運甚をアップデヌトしおいくずいうこずが䞀番倧切だず思っおいたす。 小田 : 今たで゚ンゞニアだけの䌚から TGIF は始たっおいたすが、デザむナヌの新倉さんが参加しおくれたのを始めずしお、昚幎末から䌁画職の方も入っおくれるようになったので、裟野の広がりを感じおいたす。こういった立堎が別々のメンバヌが入っおもスムヌズに目的が達成できるように TGIF のアップデヌトを続けおいきたいですね。 新倉 : 色々な圹割の人がフラットに発蚀できる堎があるおかげで、プロダクトに぀いお総合的な芖点を持぀こずができたず感じおいたす。実際に自分達が詊行錯誀しお出した機胜が「お客様にこんな颚に䜿われお、こんな感想をもらえた」などすぐに共有しおもらえるので、開発のモチベヌションにも぀ながる良いサむクルになっおいたす。 Pharms 開発チヌムでは、どんな人ず䞀緒に働きたいず考えおいる? 山田 : ありがずうございたす。最埌に Pharms の開発チヌムには、どんな方がゞョむンされるず嬉しいですか? 小田 : い぀もチヌム内で話をしおいるのが「 顧客ファヌスト 」ずいう蚀葉です。これは Pharms に限った話ではなくメドレヌ党䜓の話でもあるのですが、顧客や患者などサヌビスを䜿っおいる人達に察しお提䟛できる䟡倀は䜕かずいうこずをきちんず意識しお開発ができる方です。技術や数字だけを芋るわけじゃなく、その先の顧客をちゃんず考えお開発ができる人ですね。 新居 : メドレヌの事業やバリュヌに共感があるのは倧前提です。たた、小田さんが話されたこずに加えお、プロダクトをより良くしようず考えおるメンバヌず共に、自分はこうしたいずいう意志も持ち぀぀、ずきには建蚭的に議論もしながらプロダクト開発を掚進できる人ず䞀緒に仕事ができるず嬉しいです。倧倉なこずも勿論ありたすが、それを楜しみ、呚囲を巻き蟌みながら技術・技術以倖の郚分も含め前に進めおいける人が良いなず思いたす。 山田 : TGIF も顧客ファヌストの理念から生たれたものずいうこずになりたすよね。ありがずうございたした! さいごに Pharms 開発チヌムが実践しおいる「TGIF」ずいうチヌムビルディングの方法に぀いおむンタビュヌしおきたしたが、いかがだったでしょうか? 実際に TGIF をしおいる様子などを芋るず、和やかな雰囲気ではありたすが、党員真剣にプロダクトに぀いお議論をしおいる姿が印象的でした。 こんなチヌムで調剀薬局や患者のためのプロダクトを䜜っおいきたいず思う方は、ぜひお気軜にお話をしたしょう! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは。コヌポレヌトデザむン郚でコヌポレヌト IT を担圓しおいる枅氎です。 コヌポレヌト IT では党埓業員が利甚するネットワヌクむンフラや SaaS ずいった IT 党般を統括しおおり、瀟内で発生しおいる課題に぀いお IT を駆䜿しお解決しおいたす。 今回は、こうした課題解決の䞀䟋ずしお、「 呌び鈎アプリ 」の開発に぀いお背景ず実装のご玹介をし、最埌に コヌポレヌト IT チヌム の業務内容や理念に぀いおご玹介したいず思いたす。 呌び鈎アプリの開発背景 匊瀟では、チャットツヌルである「 Slack 」ず「 Google Workspace 」や「 TeamSpirit 」等を連携しお、来客者受付システムや 皟議ワヌクフロヌシステム 、オフィス空調最適化システム等、チャットをベヌスにした業務運甚ChatOpsを数倚く行っおいたす。 今回はその䞭でも、サポヌトを受けたい堎合にコヌポレヌト郚門の担圓者を呌び出しできるアプリ、 通称呌び鈎アプリ をご玹介しようず思いたす。 呌び鈎アプリ導入前の困りごず IT 備品や健康保険蚌等の物の受け枡しや PC トラブルぞの察応など、埓業員ぞのサポヌト察応の際、サポヌトを䟝頌した埓業員ずコヌポレヌト郚門ずの間で、以䞋のような困りごずが発生しおいたした。 ■ 埓業員偎の困りごず ・誰に話しかけたらよいかわからない IT 備品や健康保険蚌等を受け取りにコヌポレヌト郚門の座垭に来たが、誰に話しかけたらよいかわからず、りロりロしおいる方が結構いたした。結果、別の郚門に話しかけお、別の郚門の方が正しい郚門に案内するずいう時間も発生しおいたした。 ・時間調敎に手間がかかる PC トラブルぞの察応の際は、コヌポレヌト IT の担圓者が䟝頌者の垭たで行っお䜜業をしおいたため、担圓者ず䟝頌者で時間の調敎が必芁でした。盎前で郜合が悪くなり、リスケが発生するこずもしばしばありたした。 ■ コヌポレヌト郚門の困りごず ・䟝頌者が芋぀けづらい 座垭衚を芋お䟝頌者のずころたで行くが、盎近で座垭倉曎があっお居るず思っおいたずころに居ないこずや、指定の時間に垭に居ないずいったこずが床々発生しおいたした。 ・個人情報が芋えるず困る 埓業員が人事郚から健康保険蚌等の曞類を受け取る際、人事郚の方は個人情報を扱うため、PC 画面の芋える䜍眮たで来られるず困るずいう事情があり、特定の䜍眮で埅っおもらいたいずいうニヌズがありたした。 ・埓業員の氏名確認に手間がかかる 党埓業員分の氏名は把握できないため、コヌポレヌト郚門に来た埓業員本人に名前を聞いお確認し、䞀旊垭に戻っお、貞䞎する IT 備品や健康保険蚌等を探しお枡すずいう、垭を行ったり来たりする状況でした。 ・呚りの業務状況に配慮が必芁 䟝頌者の垭で PC トラブル察応をするず、呚りの人が業務に集䞭しおいたり、顧客ず電話しおいたりするため、業務に支障がでないようになるべく小声で話す必芁がありたした。 ・䟝頌者ぞの察応が属人化しがち コヌポレヌト郚門の担圓者ず䟝頌者の間で䜜業の時間を調敎しおいたしたが、担圓者が急な打ち合わせやお䌑みで䞍圚になっおしたったずきは、他の担圓者ぞの匕き継ぎ察応が挏れおしたうこずがありたした。 䞊蚘の課題を解決するために、 埓業員の方向けにコヌポレヌト郚門の担圓者を呌び出すアプリ を䜜りたした どういったアプリか 呌び鈎アプリは、埓業員ずコヌポレヌト郚門で察面での䜜業/受け枡しが発生するこずPC トラブルぞの察応/萜ずし物の受け枡し/健康保険蚌のお枡し等に関しお、iPad で䟝頌内容に応じた コヌポレヌト郚門の担圓者を呌び出すこずができるアプリ です。 コヌポレヌト郚門の近くのカりンタヌの䞊に iPad が眮いおあり、そこから呌び出しおもらいたす。 ちなみに、カりンタヌはこんな感じのスペヌスで、埓業員の方がセルフサヌビスで IT 備品亀換を行えるブヌスもありたす。 アプリの利甚むメヌゞ たず、埓業員はカりンタヌたで行き、iPad の呌び鈎アプリから呌び出し䟝頌を行いたす。 呌び出し䟝頌は専甚の Slack チャンネルに通知が来るので、各コヌポレヌト郚門の担圓者が通知内容を確認しお、埓業員が居るカりンタヌに行き、察応ずいう流れになりたす。 画面むメヌゞ 利甚方法は、自身の名前を遞択しおもらい、コヌポレヌト郚門ぞの䟝頌内容を遞択するずいう圢です。 導入埌の効果 呌び鈎アプリの導入によっお、 埓業員がコヌポレヌト郚門からサポヌトを受けたり、物を受け枡ししたいずきは、 自身が郜合の良いタむミングで カりンタヌの呌び鈎アプリに来れば良く、 利䟿性が向䞊した 。 Slack 通知に䟝頌者氏名が衚瀺されるので、 氏名を確認する必芁がなくなった。 コヌポレヌト郚門の担圓者が 䟝頌者の垭を探しお尋ねなくおよくなった。 ずいうように困りごずが改善されたした。 たた、特定のメンバヌが察応するのではなく、呌び出されたタむミングで垭に居る党メンバヌが察応できるような運甚にするこずで、PC/IT 備品や健康保険蚌等の物の受け枡し、PC のトラブル察応等のサポヌト察応が属人的にならず、離垭しおいおも、䌑暇をずっおいおも誰でも察応できる䜓制になりたした。 呌び鈎アプリの構成 呌び鈎アプリの開発にあたっおは 1. 先述の課題を解決するこず 2. コヌポレヌト IT 内でプロゞェクトが耇数動いおいるため、他のプロゞェクトの進捗に圱響がでないように、工数をさほどかけずにクむックに開発できるこず 3. なるべくランニングコストをかけないこず ずいう芁件から、 AppSheet ず Google App Script以降 GAS で実装するこずを決めたした。 機胜怜蚌期間を含めお 1 週間皋床で実装できおいたす。 AppSheet は、Google から提䟛されおいる、ノヌコヌドでアプリケヌション開発ができるツヌルです。 AppSheet は、゚ンゞニアではなく「珟堎で働く人が䜜る」ずいう思想をもずにサヌビスが開始されたした。そのため、プログラミング知識がない人でも、マりス操䜜のみで簡単にアプリケヌションを開発できるようになっおいたす。 サヌビス連携図 UI を AppSheet で、Slack ぞの通知を GAS で実装しおいたす。 画面構成 画面は䟝頌者遞択画面、䟝頌内容䞀芧画面、䟝頌詳现䞀芧画面の画面で構成しおいたす。 呌び鈎アプリの実装 呌び鈎アプリをどのように実装しおいるか解説しおいきたす。 AppSheet の蚭定 AppSheet を利甚したアプリの䜜成方法に぀いおは、Google 公匏の How to create an app や Google で AppSheet を怜玢するずいく぀か䜜成䟋のサむトが衚瀺されたすので、今回の機胜を実装するにあたり重芁な 「䟝頌詳现䞀芧画面から Slack 通知」 蚭定の郚分にフォヌカスしお解説したす。 1. Data の蚭定 Tables ず Slices に぀いお、それぞれ蚭定したす。 Tables では、アプリケヌションの元ずなるデヌタを栌玍する「テヌブル」を䜜成したす。 Slices では、テヌブルから必芁な行ず列のみを衚瀺させたり、条件にあうデヌタのみを衚瀺させたりしお、必芁なデヌタを抜出した「テヌブルの䞀郚分」を䜜成したす。 1-1. Tables の蚭定 今回 Table は以䞋の 5 ぀を甚意したした。 テヌブルは、スプレッドシヌトにテヌブルずなるデヌタを䜜成した埌、AppSheet ず連携したす。連携方法は Connect your data to AppSheet の動画を参考にしおください。 テヌブル名 利甚甚途 Client 䟝頌者遞択画面で遞択されたナヌザヌ名を䞀時的に保存するテヌブル Doorbell 䟝頌内容䞀芧画面に衚瀺するテヌブル DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺するテヌブル CallHistory 呌出履歎を保存するテヌブル UserList 䟝頌者遞択画面に衚瀺するテヌブル 䟝頌詳现䞀芧画面ず呌び出し機胜に関連する、「DoorbellDetails」ず「CallHistory」に぀いお詳しく説明したす。 ・ DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺したい内容を䞀芧で蚘茉したす。 分類 ID 列は Doorbell でも同名の列を䜜成し、そこで蚭定した倀ず合わせおください。たた、察応 ID は分類 ID 内でナニヌクになるように蚭定しおください。 察応説明に関しおは、任意で入力しおいただければ倧䞈倫です。 SlackChannel 列に Slack チャンネルに投皿する甚の Webhook URL を蚭定しおください。 Incoming Webhooks 等を䜿甚するず、 Webhook URL が取埗できたす。 3 行目以降のデヌタは、 2 行目を参考に蚭定しおください。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 1 分類 ID 察応 ID 察応名 察応説明 SlackChannel 2 receipt 1 入瀟にあたっお貞䞎物を受け取りたい 通知先チャンネルの Webhook URL を蚭定 Table での蚭定䟋 分類 ID ず察応 ID を耇合キヌ分類 ID ず察応 ID に「REQUIRE」を蚭定ずしおいたす。 ・ CallHistory 呌出履歎を保存するテヌブルのため、ヘッダヌ以倖の入力は䞍芁です。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 F 列 G 列 1 CH_id CH_分類 ID CH_察応 ID CH_察応名 CH_SlackChannel CH_呌び出し日時 CH_䟝頌者 Table での蚭定䟋 1-2. Slices の蚭定 次に、Slice の蚭定を行いたす。Slice は䟝頌内容ごずに画面衚瀺を切り替えるために「DoorbellDetails」のデヌタを元に䜜成したす。 貞䞎物受け取りに関する Slice の堎合、以䞋のように蚭定したす。 蚭定項目名 蚭定倀 Slice name 貞䞎物受け取り Source table DoorbellDetails Row filter condition [分類 ID]="receipt" 2. App の蚭定 Views に぀いお、それぞれ蚭定したす。 2-1. Views の蚭定 䟝頌詳现䞀芧画面に぀いお詳しく説明したす。 ・䟝頌詳现䞀芧画面 䟝頌内容䞀芧画面から遷移できるように、䟝頌詳现䞀芧画面は䟝頌内容ごずに準備したす。ここでは貞䞎物受け取り画面を䟋ずしお蚭定しおいたす。 蚭定項目名 蚭定倀 View name 貞䞎物受け取り画面 For this data 貞䞎物受け取り View type deck Position ref Primary header _RowNumber Secondary header 察応名 Event Actions(Row Selected) SaveAndMoveToClientFormActions の蚭定埌、蚭定可胜になりたす 3. Actions の蚭定 各ボタンを抌したずきの動䜜を定矩したす。 実際には他にもいく぀か Action を蚭定しおいたすが、Slack 通知に関係する Action は以䞋の 3 ぀です。 Action 名 利甚甚途 MoveToClientForm 䟝頌者遞択画面に遷移する SaveCallHistory CallHistory にデヌタを保存する SaveAndMoveToClientForm CallHistory に保存埌、䟝頌者遞択画面に遷移する ・ MoveToClientForm 䟝頌者遞択画面に遷移する Action です。 蚭定項目名 蚭定倀 Action name MoveToClientForm For a record of this table DoorbellDetails Do this App: go to another view within this app Target ”#view=䟝頌者遞択” ・ SaveCallHistory 「CallHistory」テヌブルにデヌタを保存する Action です。 遞択された氏名に぀いおは「Client」テヌブルからデヌタを取埗しおいたす。 たた、SlackChannel 列の蚘茉がない堎合は、画面に「呌び出し」ボタンを衚瀺させないように蚭定しおいたす。 蚭定項目名 蚭定倀 Action name SaveCallHistory For a record of this table DoorbellDetails Do this Data: add a new row to another table using values from this row Set these columns CH_id = UNIQUEID() CH_分類 ID = [分類 ID] CH_察応 ID = [察応 ID] CH_察応名 = [察応名] CH_SlackChannel = [SlackChannel] CH_呌び出し日次 = TODAY() & ” ” & TIMENOW() CH_䟝頌者 = Client[ご自身の氏名] Display name 呌び出し Only if this condition is true ISNOTBLANK([SlackChannel]) Needs confirmation? True Confirmation Message CONCATENATE(“䟝頌者“,Client[ご自身の氏名],"",“呌び出し内容”,[察応名],"",“担圓者を呌び出したすか”) ・ SaveAndMoveToClientForm 呌出履歎に保存埌、䟝頌者遞択画面に遷移する Action です。この Action を䟝頌詳现䞀芧画面の Event Actions に玐付けたす。 蚭定項目名 蚭定倀 Action name SaveAndMoveToClientForm For a record of this table DoorbellDetails Do this Grouped: execute a sequence of actions Actions SaveCallHistory MoveToClientForm スプレッドシヌト の蚭定 AppSheet からスプレッドシヌトの「CallHistory」シヌトに呌出履歎デヌタが登録行远加されたら、Slack 通知 GAS を実行するように蚭定したす。 GAS の蚘述 先皋テヌブルを䜜成したスプレッドシヌトの拡匵機胜 →Apps Script を開きたす。 App Script 䞊で新しく「.gs」ファむルを䜜成し、「CallHistory」 のシヌトが曎新されたずきだけ、Slack に通知するように GAS を蚘述したす。 function onChange ( e ) { // むベントが"EDIT"の堎合のみ実行。 if ( e . changeType === "EDIT" ) { const ar = e . source . getActiveRange (); const sheet = e . source . getActiveSheet (); // CallHistory シヌトが曎新された堎合のみ Slack に通知する if ( e . source . getSheetName () == "CallHistory" ) { const inquiry = sheet . getRange ( ar . getRow (), 4 ). getValue (); const slackWebHook = sheet . getRange ( ar . getRow (), 5 ). getValue (); const clientName = sheet . getRange ( ar . getRow (), 7 ). getValue (); notifyToSlack ( slackWebHook , "コヌポカりンタヌ呌び鈎" , ":notification_bell:" , // お奜きな Slack の絵文字を蚭定しお䞋さい。 `<!here> ${ clientName } さんが ${ inquiry } で呌び出ししおいたす。` ); } } } function notifyToSlack ( url , username , icon , message ) { const jsonData = { username: username , icon_emoji: icon , text: message , }; const payload = JSON . stringify ( jsonData ); const options = { method: "post" , contentType: "application/json" , payload: payload , }; UrlFetchApp . fetch ( url , options ); } トリガヌの蚭定 スプレッドシヌトに呌出履歎が登録行远加されたら、 onChange() を実行するように蚭定したす。 問題なく動䜜するず、Slack に以䞋のようなメッセヌゞが通知されたす。 実装する䞊で難しかったこず AppSheet でアプリを開発するにあたり、ノヌコヌド開発の制玄でかゆいずころに手が届かず、いく぀か工倫しお実装する必芁がありたした。 1. 氏名の遞択結果を保持したたた、䟝頌内容遞択の結果を「CallHistory」に曞き出すこず AppSheet が耇数の遞択結果を保持できるような仕組みになっおおらず、䟝頌者遞択画面から䟝頌内容䞀芧画面に遷移するず遞択結果が消えるため、䟝頌者遞択結果をデヌタずしおどこかに保持する必芁がありたした。 → 氏名の遞択結果を栌玍する䞀行だけのテヌブル「Client」を䜜成し、「CallHistory」ぞの曞き出し時に「Client」の䞀行目のデヌタを読むように蚭定したした。 2. ボタンの配眮ず衚瀺が倉曎できないこず 基本的にボタンに衚瀺されおいるテキストは倉曎できず、ボタン䜍眮も自由に倉曎できないため画面の最䞊郚か最䞋郚のみ、画面の蚭蚈には苊劎したした。 → テキストに関しおは、Settings → Views → Localization で「Save」を「次ぞ」に倉曎しお察応したした。 ボタン䜍眮に関しおはどうにもならなかったため、なるべく導線がわかりやすいように画面䞊に説明を入れるようにしおいたす。 ノヌコヌドがゆえの制玄はありたすが、AppSheet での開発は簡単か぀迅速にできるため、小芏暡なアプリケヌションであれば、おすすめの環境です。 以䞊、呌び鈎アプリの開発に぀いおお話したした。 ここからは、コヌポレヌト IT に぀いおご玹介しおいきたす。 コヌポレヌト IT に぀いお コヌポレヌトデザむン郚は、 「未来志向で瀟内の IT むンフラを含めたオフィス環境をデザむンするこず」 をミッションに業務しおおり、珟圚 2 ぀のチヌムがありたす。 䞀぀はワヌクプレむスチヌムで、ペン䞀本からオフィス斜工に関するこずたで、オフィス環境党般を担圓しおいたす。 そしお、もう䞀぀がコヌポレヌト IT チヌムで、党瀟で利甚する SaaS の管理やオフィスのネットワヌクむンフラ、瀟内アプリの開発等、党埓業員が利甚する IT ゜リュヌション党般の䌁画・開発・運甚を担圓しおいたす。 コヌポレヌト IT の圹割 コヌポレヌト IT ずしおのミッションは、**「テクノロゞヌず創意工倫で埓業員のパフォヌマンスの最倧化を図るこず」**です。 そのために、単に䞊流・䞋流ずいうフェヌズ分担ではなく、システム導入だけでもない、党瀟の組織カルチャヌづくりも芋据えた党埓業員が利甚するコヌポレヌト基盀をデザむンし、そのデザむンに基づいお IT ゜リュヌションを実装、運甚しおいきたす。 逆に、各郚門のミッション達成、業務目的達成のための個別の IT ゜リュヌションは、ツヌルゆえ各郚門が䞻管です。コヌポレヌト IT は IT プロフェッショナルずしおアドバむスしたり、システム蚭蚈や実装する圢で、技術的実珟を担うものずしお各郚門ずコラボしたす。 各郚門の IT ゜リュヌションに察する PDCA を各郚門がオヌナヌシップを持぀こずで、利甚時の芁望や改善に察しお、非垞に早いサむクルで実斜するこずができおいたす。 業務内容玹介 コヌポレヌト IT では、日々の埓業員ぞの IT サポヌト以倖に、耇数のプロゞェクトが同時に走っおいたす。以䞋に蚘茉しおいる業務はほんの䞀䟋です。 端末管理アプリケヌションおよびセキュリティ補品の䌁画/導入/運甹 オフィス移転でのネットワヌク構築ネットワヌクの蚭蚈、機噚遞定〜運甚たで 瀟倖来客甚受付システムの改修/運甹 呌び鈎アプリの䌁画/開発/運甹 埓業員向けの情報セキュリティ研修 人事基幹システムの導入支揎/各システムずの連携機胜構築 etc たた、メンバヌ自ら提案しお䌁画化、予算を確保するこずもあり、アむデアに察しお柔軟に察応しおいたす。 業務を行う䞊で垞に意識しおいるこず・倧事にしおいるこず コヌポレヌト IT ずしお業務を行う䞊で倧事にしおいる考え方が、3 ぀ありたす。埓業員の生産性が向䞊する環境の構築に必芁䞍可欠ず考えおおり、これらをもずに意思決定しおいたす。 1. システム遞定/技術遞定の考え方 システム遞定/技術遞定の原則ずしおは、グロヌバルトップシェアで、か぀、北米急成長䌁業が遞定しおいるものを未来志向で掻甚しおいくこずを意識しおいたすが、その技術やツヌルを導入しお、埗たい本来の目的が達成できるかどうかを、広い芖点から刀断しお意思決定しおいたす。 2. ナヌザヌ IT サポヌトの考え方 老子が蚀っおいる『授人以魚 䞍劂授人以持(人に魚を授けるこずは、持の仕方を教えるに及ばない)』ずいうこずを倧切にしおおり、「わからない」ずいう人に単に答えを「教える」こずをせず、組織の未来のために、組織党䜓の IT リテラシヌを䞊げるこず、スムヌズに自己解決できる環境を敎えるこずに努めおいたす。 「ナヌザヌ IT サポヌトが増え続け、サポヌト人件費が増倧し、高コストな生産性の䜎いコヌポレヌト IT チヌム」ずならないよう心がけおいたす。 3. ルヌルを䜜らず、仕組み/仕掛けで解決する ルヌルを芚えなくおも、意識しなくずも、狙ったこずが自然に進むよう、仕組み/仕掛けによっお目的を成す方法を䜜るこずを意識しおいたす。 䟋えば、高速道路のサヌビス゚リアにある駐車堎の逆走を犁止するために斜めに駐車䜍眮ラむンを匕くずいった、意識せずずも行動を䞀定方向に促す行動蚭蚈が望たしく、呌び鈎アプリもそういった仕掛けやプロセス蚭蚈の䞀環です。 さいごに コヌポレヌト IT は党埓業員が利甚する IT 基盀の維持・改善が求められるため、非垞に重芁な圹割です。たた、急拡倧する組織の䞭においおは、今たでの仕組みが通甚しなくなり、未来志向で新たな仕組みを蚭蚈し続けおいく必芁があり、垞にコヌポレヌト IT チヌムの掻躍の䜙地がたくさん存圚しおいたす。 そのため、未来志向で #革新ず改善を䞻導 できる方を絶賛募集しおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp メドレヌでは、医療分野の瀟䌚課題を IT にお解決するために日々邁進しおおりたす。様々な業皮でスペシャリストを募集しおいたす。興味がある方は是非ご連絡ください。医療ずいう瀟䌚貢献性の高い領域ぞ、䞀緒に挑戊したせんか 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは。コヌポレヌトデザむン郚でコヌポレヌト IT を担圓しおいる枅氎です。 コヌポレヌト IT では党埓業員が利甚するネットワヌクむンフラや SaaS ずいった IT 党般を統括しおおり、瀟内で発生しおいる課題に぀いお IT を駆䜿しお解決しおいたす。 今回は、こうした課題解決の䞀䟋ずしお、「 呌び鈎アプリ 」の開発に぀いお背景ず実装のご玹介をし、最埌に コヌポレヌト IT チヌム の業務内容や理念に぀いおご玹介したいず思いたす。 呌び鈎アプリの開発背景 匊瀟では、チャットツヌルである「 Slack 」ず「 Google Workspace 」や「 TeamSpirit 」等を連携しお、来客者受付システムや 皟議ワヌクフロヌシステム 、オフィス空調最適化システム等、チャットをベヌスにした業務運甚ChatOpsを数倚く行っおいたす。 今回はその䞭でも、サポヌトを受けたい堎合にコヌポレヌト郚門の担圓者を呌び出しできるアプリ、 通称呌び鈎アプリ をご玹介しようず思いたす。 呌び鈎アプリ導入前の困りごず IT 備品や健康保険蚌等の物の受け枡しや PC トラブルぞの察応など、埓業員ぞのサポヌト察応の際、サポヌトを䟝頌した埓業員ずコヌポレヌト郚門ずの間で、以䞋のような困りごずが発生しおいたした。 ■ 埓業員偎の困りごず ・誰に話しかけたらよいかわからない IT 備品や健康保険蚌等を受け取りにコヌポレヌト郚門の座垭に来たが、誰に話しかけたらよいかわからず、りロりロしおいる方が結構いたした。結果、別の郚門に話しかけお、別の郚門の方が正しい郚門に案内するずいう時間も発生しおいたした。 ・時間調敎に手間がかかる PC トラブルぞの察応の際は、コヌポレヌト IT の担圓者が䟝頌者の垭たで行っお䜜業をしおいたため、担圓者ず䟝頌者で時間の調敎が必芁でした。盎前で郜合が悪くなり、リスケが発生するこずもしばしばありたした。 ■ コヌポレヌト郚門の困りごず ・䟝頌者が芋぀けづらい 座垭衚を芋お䟝頌者のずころたで行くが、盎近で座垭倉曎があっお居るず思っおいたずころに居ないこずや、指定の時間に垭に居ないずいったこずが床々発生しおいたした。 ・個人情報が芋えるず困る 埓業員が人事郚から健康保険蚌等の曞類を受け取る際、人事郚の方は個人情報を扱うため、PC 画面の芋える䜍眮たで来られるず困るずいう事情があり、特定の䜍眮で埅っおもらいたいずいうニヌズがありたした。 ・埓業員の氏名確認に手間がかかる 党埓業員分の氏名は把握できないため、コヌポレヌト郚門に来た埓業員本人に名前を聞いお確認し、䞀旊垭に戻っお、貞䞎する IT 備品や健康保険蚌等を探しお枡すずいう、垭を行ったり来たりする状況でした。 ・呚りの業務状況に配慮が必芁 䟝頌者の垭で PC トラブル察応をするず、呚りの人が業務に集䞭しおいたり、顧客ず電話しおいたりするため、業務に支障がでないようになるべく小声で話す必芁がありたした。 ・䟝頌者ぞの察応が属人化しがち コヌポレヌト郚門の担圓者ず䟝頌者の間で䜜業の時間を調敎しおいたしたが、担圓者が急な打ち合わせやお䌑みで䞍圚になっおしたったずきは、他の担圓者ぞの匕き継ぎ察応が挏れおしたうこずがありたした。 䞊蚘の課題を解決するために、 埓業員の方向けにコヌポレヌト郚門の担圓者を呌び出すアプリ を䜜りたした どういったアプリか 呌び鈎アプリは、埓業員ずコヌポレヌト郚門で察面での䜜業/受け枡しが発生するこずPC トラブルぞの察応/萜ずし物の受け枡し/健康保険蚌のお枡し等に関しお、iPad で䟝頌内容に応じた コヌポレヌト郚門の担圓者を呌び出すこずができるアプリ です。 コヌポレヌト郚門の近くのカりンタヌの䞊に iPad が眮いおあり、そこから呌び出しおもらいたす。 ちなみに、カりンタヌはこんな感じのスペヌスで、埓業員の方がセルフサヌビスで IT 備品亀換を行えるブヌスもありたす。 アプリの利甚むメヌゞ たず、埓業員はカりンタヌたで行き、iPad の呌び鈎アプリから呌び出し䟝頌を行いたす。 呌び出し䟝頌は専甚の Slack チャンネルに通知が来るので、各コヌポレヌト郚門の担圓者が通知内容を確認しお、埓業員が居るカりンタヌに行き、察応ずいう流れになりたす。 画面むメヌゞ 利甚方法は、自身の名前を遞択しおもらい、コヌポレヌト郚門ぞの䟝頌内容を遞択するずいう圢です。 導入埌の効果 呌び鈎アプリの導入によっお、 埓業員がコヌポレヌト郚門からサポヌトを受けたり、物を受け枡ししたいずきは、 自身が郜合の良いタむミングで カりンタヌの呌び鈎アプリに来れば良く、 利䟿性が向䞊した 。 Slack 通知に䟝頌者氏名が衚瀺されるので、 氏名を確認する必芁がなくなった。 コヌポレヌト郚門の担圓者が 䟝頌者の垭を探しお尋ねなくおよくなった。 ずいうように困りごずが改善されたした。 たた、特定のメンバヌが察応するのではなく、呌び出されたタむミングで垭に居る党メンバヌが察応できるような運甚にするこずで、PC/IT 備品や健康保険蚌等の物の受け枡し、PC のトラブル察応等のサポヌト察応が属人的にならず、離垭しおいおも、䌑暇をずっおいおも誰でも察応できる䜓制になりたした。 呌び鈎アプリの構成 呌び鈎アプリの開発にあたっおは 1. 先述の課題を解決するこず 2. コヌポレヌト IT 内でプロゞェクトが耇数動いおいるため、他のプロゞェクトの進捗に圱響がでないように、工数をさほどかけずにクむックに開発できるこず 3. なるべくランニングコストをかけないこず ずいう芁件から、 AppSheet ず Google App Script以降 GAS で実装するこずを決めたした。 機胜怜蚌期間を含めお 1 週間皋床で実装できおいたす。 AppSheet は、Google から提䟛されおいる、ノヌコヌドでアプリケヌション開発ができるツヌルです。 AppSheet は、゚ンゞニアではなく「珟堎で働く人が䜜る」ずいう思想をもずにサヌビスが開始されたした。そのため、プログラミング知識がない人でも、マりス操䜜のみで簡単にアプリケヌションを開発できるようになっおいたす。 サヌビス連携図 UI を AppSheet で、Slack ぞの通知を GAS で実装しおいたす。 画面構成 画面は䟝頌者遞択画面、䟝頌内容䞀芧画面、䟝頌詳现䞀芧画面の画面で構成しおいたす。 呌び鈎アプリの実装 呌び鈎アプリをどのように実装しおいるか解説しおいきたす。 AppSheet の蚭定 AppSheet を利甚したアプリの䜜成方法に぀いおは、Google 公匏の How to create an app や Google で AppSheet を怜玢するずいく぀か䜜成䟋のサむトが衚瀺されたすので、今回の機胜を実装するにあたり重芁な 「䟝頌詳现䞀芧画面から Slack 通知」 蚭定の郚分にフォヌカスしお解説したす。 1. Data の蚭定 Tables ず Slices に぀いお、それぞれ蚭定したす。 Tables では、アプリケヌションの元ずなるデヌタを栌玍する「テヌブル」を䜜成したす。 Slices では、テヌブルから必芁な行ず列のみを衚瀺させたり、条件にあうデヌタのみを衚瀺させたりしお、必芁なデヌタを抜出した「テヌブルの䞀郚分」を䜜成したす。 1-1. Tables の蚭定 今回 Table は以䞋の 5 ぀を甚意したした。 テヌブルは、スプレッドシヌトにテヌブルずなるデヌタを䜜成した埌、AppSheet ず連携したす。連携方法は Connect your data to AppSheet の動画を参考にしおください。 テヌブル名 利甚甚途 Client 䟝頌者遞択画面で遞択されたナヌザヌ名を䞀時的に保存するテヌブル Doorbell 䟝頌内容䞀芧画面に衚瀺するテヌブル DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺するテヌブル CallHistory 呌出履歎を保存するテヌブル UserList 䟝頌者遞択画面に衚瀺するテヌブル 䟝頌詳现䞀芧画面ず呌び出し機胜に関連する、「DoorbellDetails」ず「CallHistory」に぀いお詳しく説明したす。 ・ DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺したい内容を䞀芧で蚘茉したす。 分類 ID 列は Doorbell でも同名の列を䜜成し、そこで蚭定した倀ず合わせおください。たた、察応 ID は分類 ID 内でナニヌクになるように蚭定しおください。 察応説明に関しおは、任意で入力しおいただければ倧䞈倫です。 SlackChannel 列に Slack チャンネルに投皿する甚の Webhook URL を蚭定しおください。 Incoming Webhooks 等を䜿甚するず、 Webhook URL が取埗できたす。 3 行目以降のデヌタは、 2 行目を参考に蚭定しおください。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 1 分類 ID 察応 ID 察応名 察応説明 SlackChannel 2 receipt 1 入瀟にあたっお貞䞎物を受け取りたい 通知先チャンネルの Webhook URL を蚭定 Table での蚭定䟋 分類 ID ず察応 ID を耇合キヌ分類 ID ず察応 ID に「REQUIRE」を蚭定ずしおいたす。 ・ CallHistory 呌出履歎を保存するテヌブルのため、ヘッダヌ以倖の入力は䞍芁です。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 F 列 G 列 1 CH_id CH_分類 ID CH_察応 ID CH_察応名 CH_SlackChannel CH_呌び出し日時 CH_䟝頌者 Table での蚭定䟋 1-2. Slices の蚭定 次に、Slice の蚭定を行いたす。Slice は䟝頌内容ごずに画面衚瀺を切り替えるために「DoorbellDetails」のデヌタを元に䜜成したす。 貞䞎物受け取りに関する Slice の堎合、以䞋のように蚭定したす。 蚭定項目名 蚭定倀 Slice name 貞䞎物受け取り Source table DoorbellDetails Row filter condition [分類 ID]="receipt" 2. App の蚭定 Views に぀いお、それぞれ蚭定したす。 2-1. Views の蚭定 䟝頌詳现䞀芧画面に぀いお詳しく説明したす。 ・䟝頌詳现䞀芧画面 䟝頌内容䞀芧画面から遷移できるように、䟝頌詳现䞀芧画面は䟝頌内容ごずに準備したす。ここでは貞䞎物受け取り画面を䟋ずしお蚭定しおいたす。 蚭定項目名 蚭定倀 View name 貞䞎物受け取り画面 For this data 貞䞎物受け取り View type deck Position ref Primary header _RowNumber Secondary header 察応名 Event Actions(Row Selected) SaveAndMoveToClientFormActions の蚭定埌、蚭定可胜になりたす 3. Actions の蚭定 各ボタンを抌したずきの動䜜を定矩したす。 実際には他にもいく぀か Action を蚭定しおいたすが、Slack 通知に関係する Action は以䞋の 3 ぀です。 Action 名 利甚甚途 MoveToClientForm 䟝頌者遞択画面に遷移する SaveCallHistory CallHistory にデヌタを保存する SaveAndMoveToClientForm CallHistory に保存埌、䟝頌者遞択画面に遷移する ・ MoveToClientForm 䟝頌者遞択画面に遷移する Action です。 蚭定項目名 蚭定倀 Action name MoveToClientForm For a record of this table DoorbellDetails Do this App: go to another view within this app Target ”#view=䟝頌者遞択” ・ SaveCallHistory 「CallHistory」テヌブルにデヌタを保存する Action です。 遞択された氏名に぀いおは「Client」テヌブルからデヌタを取埗しおいたす。 たた、SlackChannel 列の蚘茉がない堎合は、画面に「呌び出し」ボタンを衚瀺させないように蚭定しおいたす。 蚭定項目名 蚭定倀 Action name SaveCallHistory For a record of this table DoorbellDetails Do this Data: add a new row to another table using values from this row Set these columns CH_id = UNIQUEID() CH_分類 ID = [分類 ID] CH_察応 ID = [察応 ID] CH_察応名 = [察応名] CH_SlackChannel = [SlackChannel] CH_呌び出し日次 = TODAY() & ” ” & TIMENOW() CH_䟝頌者 = Client[ご自身の氏名] Display name 呌び出し Only if this condition is true ISNOTBLANK([SlackChannel]) Needs confirmation? True Confirmation Message CONCATENATE(“䟝頌者“,Client[ご自身の氏名],"",“呌び出し内容”,[察応名],"",“担圓者を呌び出したすか”) ・ SaveAndMoveToClientForm 呌出履歎に保存埌、䟝頌者遞択画面に遷移する Action です。この Action を䟝頌詳现䞀芧画面の Event Actions に玐付けたす。 蚭定項目名 蚭定倀 Action name SaveAndMoveToClientForm For a record of this table DoorbellDetails Do this Grouped: execute a sequence of actions Actions SaveCallHistory MoveToClientForm スプレッドシヌト の蚭定 AppSheet からスプレッドシヌトの「CallHistory」シヌトに呌出履歎デヌタが登録行远加されたら、Slack 通知 GAS を実行するように蚭定したす。 GAS の蚘述 先皋テヌブルを䜜成したスプレッドシヌトの拡匵機胜 →Apps Script を開きたす。 App Script 䞊で新しく「.gs」ファむルを䜜成し、「CallHistory」 のシヌトが曎新されたずきだけ、Slack に通知するように GAS を蚘述したす。 function onChange ( e ) { // むベントが"EDIT"の堎合のみ実行。 if ( e . changeType === "EDIT" ) { const ar = e . source . getActiveRange (); const sheet = e . source . getActiveSheet (); // CallHistory シヌトが曎新された堎合のみ Slack に通知する if ( e . source . getSheetName () == "CallHistory" ) { const inquiry = sheet . getRange ( ar . getRow (), 4 ). getValue (); const slackWebHook = sheet . getRange ( ar . getRow (), 5 ). getValue (); const clientName = sheet . getRange ( ar . getRow (), 7 ). getValue (); notifyToSlack ( slackWebHook , "コヌポカりンタヌ呌び鈎" , ":notification_bell:" , // お奜きな Slack の絵文字を蚭定しお䞋さい。 `<!here> ${ clientName } さんが ${ inquiry } で呌び出ししおいたす。` ); } } } function notifyToSlack ( url , username , icon , message ) { const jsonData = { username: username , icon_emoji: icon , text: message , }; const payload = JSON . stringify ( jsonData ); const options = { method: "post" , contentType: "application/json" , payload: payload , }; UrlFetchApp . fetch ( url , options ); } トリガヌの蚭定 スプレッドシヌトに呌出履歎が登録行远加されたら、 onChange() を実行するように蚭定したす。 問題なく動䜜するず、Slack に以䞋のようなメッセヌゞが通知されたす。 実装する䞊で難しかったこず AppSheet でアプリを開発するにあたり、ノヌコヌド開発の制玄でかゆいずころに手が届かず、いく぀か工倫しお実装する必芁がありたした。 1. 氏名の遞択結果を保持したたた、䟝頌内容遞択の結果を「CallHistory」に曞き出すこず AppSheet が耇数の遞択結果を保持できるような仕組みになっおおらず、䟝頌者遞択画面から䟝頌内容䞀芧画面に遷移するず遞択結果が消えるため、䟝頌者遞択結果をデヌタずしおどこかに保持する必芁がありたした。 → 氏名の遞択結果を栌玍する䞀行だけのテヌブル「Client」を䜜成し、「CallHistory」ぞの曞き出し時に「Client」の䞀行目のデヌタを読むように蚭定したした。 2. ボタンの配眮ず衚瀺が倉曎できないこず 基本的にボタンに衚瀺されおいるテキストは倉曎できず、ボタン䜍眮も自由に倉曎できないため画面の最䞊郚か最䞋郚のみ、画面の蚭蚈には苊劎したした。 → テキストに関しおは、Settings → Views → Localization で「Save」を「次ぞ」に倉曎しお察応したした。 ボタン䜍眮に関しおはどうにもならなかったため、なるべく導線がわかりやすいように画面䞊に説明を入れるようにしおいたす。 ノヌコヌドがゆえの制玄はありたすが、AppSheet での開発は簡単か぀迅速にできるため、小芏暡なアプリケヌションであれば、おすすめの環境です。 以䞊、呌び鈎アプリの開発に぀いおお話したした。 ここからは、コヌポレヌト IT に぀いおご玹介しおいきたす。 コヌポレヌト IT に぀いお コヌポレヌトデザむン郚は、 「未来志向で瀟内の IT むンフラを含めたオフィス環境をデザむンするこず」 をミッションに業務しおおり、珟圚 2 ぀のチヌムがありたす。 䞀぀はワヌクプレむスチヌムで、ペン䞀本からオフィス斜工に関するこずたで、オフィス環境党般を担圓しおいたす。 そしお、もう䞀぀がコヌポレヌト IT チヌムで、党瀟で利甚する SaaS の管理やオフィスのネットワヌクむンフラ、瀟内アプリの開発等、党埓業員が利甚する IT ゜リュヌション党般の䌁画・開発・運甚を担圓しおいたす。 コヌポレヌト IT の圹割 コヌポレヌト IT ずしおのミッションは、**「テクノロゞヌず創意工倫で埓業員のパフォヌマンスの最倧化を図るこず」**です。 そのために、単に䞊流・䞋流ずいうフェヌズ分担ではなく、システム導入だけでもない、党瀟の組織カルチャヌづくりも芋据えた党埓業員が利甚するコヌポレヌト基盀をデザむンし、そのデザむンに基づいお IT ゜リュヌションを実装、運甚しおいきたす。 逆に、各郚門のミッション達成、業務目的達成のための個別の IT ゜リュヌションは、ツヌルゆえ各郚門が䞻管です。コヌポレヌト IT は IT プロフェッショナルずしおアドバむスしたり、システム蚭蚈や実装する圢で、技術的実珟を担うものずしお各郚門ずコラボしたす。 各郚門の IT ゜リュヌションに察する PDCA を各郚門がオヌナヌシップを持぀こずで、利甚時の芁望や改善に察しお、非垞に早いサむクルで実斜するこずができおいたす。 業務内容玹介 コヌポレヌト IT では、日々の埓業員ぞの IT サポヌト以倖に、耇数のプロゞェクトが同時に走っおいたす。以䞋に蚘茉しおいる業務はほんの䞀䟋です。 端末管理アプリケヌションおよびセキュリティ補品の䌁画/導入/運甹 オフィス移転でのネットワヌク構築ネットワヌクの蚭蚈、機噚遞定〜運甚たで 瀟倖来客甚受付システムの改修/運甹 呌び鈎アプリの䌁画/開発/運甹 埓業員向けの情報セキュリティ研修 人事基幹システムの導入支揎/各システムずの連携機胜構築 etc たた、メンバヌ自ら提案しお䌁画化、予算を確保するこずもあり、アむデアに察しお柔軟に察応しおいたす。 業務を行う䞊で垞に意識しおいるこず・倧事にしおいるこず コヌポレヌト IT ずしお業務を行う䞊で倧事にしおいる考え方が、3 ぀ありたす。埓業員の生産性が向䞊する環境の構築に必芁䞍可欠ず考えおおり、これらをもずに意思決定しおいたす。 1. システム遞定/技術遞定の考え方 システム遞定/技術遞定の原則ずしおは、グロヌバルトップシェアで、か぀、北米急成長䌁業が遞定しおいるものを未来志向で掻甚しおいくこずを意識しおいたすが、その技術やツヌルを導入しお、埗たい本来の目的が達成できるかどうかを、広い芖点から刀断しお意思決定しおいたす。 2. ナヌザヌ IT サポヌトの考え方 老子が蚀っおいる『授人以魚 䞍劂授人以持(人に魚を授けるこずは、持の仕方を教えるに及ばない)』ずいうこずを倧切にしおおり、「わからない」ずいう人に単に答えを「教える」こずをせず、組織の未来のために、組織党䜓の IT リテラシヌを䞊げるこず、スムヌズに自己解決できる環境を敎えるこずに努めおいたす。 「ナヌザヌ IT サポヌトが増え続け、サポヌト人件費が増倧し、高コストな生産性の䜎いコヌポレヌト IT チヌム」ずならないよう心がけおいたす。 3. ルヌルを䜜らず、仕組み/仕掛けで解決する ルヌルを芚えなくおも、意識しなくずも、狙ったこずが自然に進むよう、仕組み/仕掛けによっお目的を成す方法を䜜るこずを意識しおいたす。 䟋えば、高速道路のサヌビス゚リアにある駐車堎の逆走を犁止するために斜めに駐車䜍眮ラむンを匕くずいった、意識せずずも行動を䞀定方向に促す行動蚭蚈が望たしく、呌び鈎アプリもそういった仕掛けやプロセス蚭蚈の䞀環です。 さいごに コヌポレヌト IT は党埓業員が利甚する IT 基盀の維持・改善が求められるため、非垞に重芁な圹割です。たた、急拡倧する組織の䞭においおは、今たでの仕組みが通甚しなくなり、未来志向で新たな仕組みを蚭蚈し続けおいく必芁があり、垞にコヌポレヌト IT チヌムの掻躍の䜙地がたくさん存圚しおいたす。 そのため、未来志向で #革新ず改善を䞻導 できる方を絶賛募集しおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp メドレヌでは、医療分野の瀟䌚課題を IT にお解決するために日々邁進しおおりたす。様々な業皮でスペシャリストを募集しおいたす。興味がある方は是非ご連絡ください。医療ずいう瀟䌚貢献性の高い領域ぞ、䞀緒に挑戊したせんか 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは。コヌポレヌトデザむン郚でコヌポレヌト IT を担圓しおいる枅氎です。 コヌポレヌト IT では党埓業員が利甚するネットワヌクむンフラや SaaS ずいった IT 党般を統括しおおり、瀟内で発生しおいる課題に぀いお IT を駆䜿しお解決しおいたす。 今回は、こうした課題解決の䞀䟋ずしお、「 呌び鈎アプリ 」の開発に぀いお背景ず実装のご玹介をし、最埌に コヌポレヌト IT チヌム の業務内容や理念に぀いおご玹介したいず思いたす。 呌び鈎アプリの開発背景 匊瀟では、チャットツヌルである「 Slack 」ず「 Google Workspace 」や「 TeamSpirit 」等を連携しお、来客者受付システムや 皟議ワヌクフロヌシステム 、オフィス空調最適化システム等、チャットをベヌスにした業務運甚ChatOpsを数倚く行っおいたす。 今回はその䞭でも、サポヌトを受けたい堎合にコヌポレヌト郚門の担圓者を呌び出しできるアプリ、 通称呌び鈎アプリ をご玹介しようず思いたす。 呌び鈎アプリ導入前の困りごず IT 備品や健康保険蚌等の物の受け枡しや PC トラブルぞの察応など、埓業員ぞのサポヌト察応の際、サポヌトを䟝頌した埓業員ずコヌポレヌト郚門ずの間で、以䞋のような困りごずが発生しおいたした。 ■ 埓業員偎の困りごず ・誰に話しかけたらよいかわからない IT 備品や健康保険蚌等を受け取りにコヌポレヌト郚門の座垭に来たが、誰に話しかけたらよいかわからず、りロりロしおいる方が結構いたした。結果、別の郚門に話しかけお、別の郚門の方が正しい郚門に案内するずいう時間も発生しおいたした。 ・時間調敎に手間がかかる PC トラブルぞの察応の際は、コヌポレヌト IT の担圓者が䟝頌者の垭たで行っお䜜業をしおいたため、担圓者ず䟝頌者で時間の調敎が必芁でした。盎前で郜合が悪くなり、リスケが発生するこずもしばしばありたした。 ■ コヌポレヌト郚門の困りごず ・䟝頌者が芋぀けづらい 座垭衚を芋お䟝頌者のずころたで行くが、盎近で座垭倉曎があっお居るず思っおいたずころに居ないこずや、指定の時間に垭に居ないずいったこずが床々発生しおいたした。 ・個人情報が芋えるず困る 埓業員が人事郚から健康保険蚌等の曞類を受け取る際、人事郚の方は個人情報を扱うため、PC 画面の芋える䜍眮たで来られるず困るずいう事情があり、特定の䜍眮で埅っおもらいたいずいうニヌズがありたした。 ・埓業員の氏名確認に手間がかかる 党埓業員分の氏名は把握できないため、コヌポレヌト郚門に来た埓業員本人に名前を聞いお確認し、䞀旊垭に戻っお、貞䞎する IT 備品や健康保険蚌等を探しお枡すずいう、垭を行ったり来たりする状況でした。 ・呚りの業務状況に配慮が必芁 䟝頌者の垭で PC トラブル察応をするず、呚りの人が業務に集䞭しおいたり、顧客ず電話しおいたりするため、業務に支障がでないようになるべく小声で話す必芁がありたした。 ・䟝頌者ぞの察応が属人化しがち コヌポレヌト郚門の担圓者ず䟝頌者の間で䜜業の時間を調敎しおいたしたが、担圓者が急な打ち合わせやお䌑みで䞍圚になっおしたったずきは、他の担圓者ぞの匕き継ぎ察応が挏れおしたうこずがありたした。 䞊蚘の課題を解決するために、 埓業員の方向けにコヌポレヌト郚門の担圓者を呌び出すアプリ を䜜りたした どういったアプリか 呌び鈎アプリは、埓業員ずコヌポレヌト郚門で察面での䜜業/受け枡しが発生するこずPC トラブルぞの察応/萜ずし物の受け枡し/健康保険蚌のお枡し等に関しお、iPad で䟝頌内容に応じた コヌポレヌト郚門の担圓者を呌び出すこずができるアプリ です。 コヌポレヌト郚門の近くのカりンタヌの䞊に iPad が眮いおあり、そこから呌び出しおもらいたす。 ちなみに、カりンタヌはこんな感じのスペヌスで、埓業員の方がセルフサヌビスで IT 備品亀換を行えるブヌスもありたす。 アプリの利甚むメヌゞ たず、埓業員はカりンタヌたで行き、iPad の呌び鈎アプリから呌び出し䟝頌を行いたす。 呌び出し䟝頌は専甚の Slack チャンネルに通知が来るので、各コヌポレヌト郚門の担圓者が通知内容を確認しお、埓業員が居るカりンタヌに行き、察応ずいう流れになりたす。 画面むメヌゞ 利甚方法は、自身の名前を遞択しおもらい、コヌポレヌト郚門ぞの䟝頌内容を遞択するずいう圢です。 導入埌の効果 呌び鈎アプリの導入によっお、 埓業員がコヌポレヌト郚門からサポヌトを受けたり、物を受け枡ししたいずきは、 自身が郜合の良いタむミングで カりンタヌの呌び鈎アプリに来れば良く、 利䟿性が向䞊した 。 Slack 通知に䟝頌者氏名が衚瀺されるので、 氏名を確認する必芁がなくなった。 コヌポレヌト郚門の担圓者が 䟝頌者の垭を探しお尋ねなくおよくなった。 ずいうように困りごずが改善されたした。 たた、特定のメンバヌが察応するのではなく、呌び出されたタむミングで垭に居る党メンバヌが察応できるような運甚にするこずで、PC/IT 備品や健康保険蚌等の物の受け枡し、PC のトラブル察応等のサポヌト察応が属人的にならず、離垭しおいおも、䌑暇をずっおいおも誰でも察応できる䜓制になりたした。 呌び鈎アプリの構成 呌び鈎アプリの開発にあたっおは 1. 先述の課題を解決するこず 2. コヌポレヌト IT 内でプロゞェクトが耇数動いおいるため、他のプロゞェクトの進捗に圱響がでないように、工数をさほどかけずにクむックに開発できるこず 3. なるべくランニングコストをかけないこず ずいう芁件から、 AppSheet ず Google App Script以降 GAS で実装するこずを決めたした。 機胜怜蚌期間を含めお 1 週間皋床で実装できおいたす。 AppSheet は、Google から提䟛されおいる、ノヌコヌドでアプリケヌション開発ができるツヌルです。 AppSheet は、゚ンゞニアではなく「珟堎で働く人が䜜る」ずいう思想をもずにサヌビスが開始されたした。そのため、プログラミング知識がない人でも、マりス操䜜のみで簡単にアプリケヌションを開発できるようになっおいたす。 サヌビス連携図 UI を AppSheet で、Slack ぞの通知を GAS で実装しおいたす。 画面構成 画面は䟝頌者遞択画面、䟝頌内容䞀芧画面、䟝頌詳现䞀芧画面の画面で構成しおいたす。 呌び鈎アプリの実装 呌び鈎アプリをどのように実装しおいるか解説しおいきたす。 AppSheet の蚭定 AppSheet を利甚したアプリの䜜成方法に぀いおは、Google 公匏の How to create an app や Google で AppSheet を怜玢するずいく぀か䜜成䟋のサむトが衚瀺されたすので、今回の機胜を実装するにあたり重芁な 「䟝頌詳现䞀芧画面から Slack 通知」 蚭定の郚分にフォヌカスしお解説したす。 1. Data の蚭定 Tables ず Slices に぀いお、それぞれ蚭定したす。 Tables では、アプリケヌションの元ずなるデヌタを栌玍する「テヌブル」を䜜成したす。 Slices では、テヌブルから必芁な行ず列のみを衚瀺させたり、条件にあうデヌタのみを衚瀺させたりしお、必芁なデヌタを抜出した「テヌブルの䞀郚分」を䜜成したす。 1-1. Tables の蚭定 今回 Table は以䞋の 5 ぀を甚意したした。 テヌブルは、スプレッドシヌトにテヌブルずなるデヌタを䜜成した埌、AppSheet ず連携したす。連携方法は Connect your data to AppSheet の動画を参考にしおください。 テヌブル名 利甚甚途 Client 䟝頌者遞択画面で遞択されたナヌザヌ名を䞀時的に保存するテヌブル Doorbell 䟝頌内容䞀芧画面に衚瀺するテヌブル DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺するテヌブル CallHistory 呌出履歎を保存するテヌブル UserList 䟝頌者遞択画面に衚瀺するテヌブル 䟝頌詳现䞀芧画面ず呌び出し機胜に関連する、「DoorbellDetails」ず「CallHistory」に぀いお詳しく説明したす。 ・ DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺したい内容を䞀芧で蚘茉したす。 分類 ID 列は Doorbell でも同名の列を䜜成し、そこで蚭定した倀ず合わせおください。たた、察応 ID は分類 ID 内でナニヌクになるように蚭定しおください。 察応説明に関しおは、任意で入力しおいただければ倧䞈倫です。 SlackChannel 列に Slack チャンネルに投皿する甚の Webhook URL を蚭定しおください。 Incoming Webhooks 等を䜿甚するず、 Webhook URL が取埗できたす。 3 行目以降のデヌタは、 2 行目を参考に蚭定しおください。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 1 分類 ID 察応 ID 察応名 察応説明 SlackChannel 2 receipt 1 入瀟にあたっお貞䞎物を受け取りたい 通知先チャンネルの Webhook URL を蚭定 Table での蚭定䟋 分類 ID ず察応 ID を耇合キヌ分類 ID ず察応 ID に「REQUIRE」を蚭定ずしおいたす。 ・ CallHistory 呌出履歎を保存するテヌブルのため、ヘッダヌ以倖の入力は䞍芁です。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 F 列 G 列 1 CH_id CH_分類 ID CH_察応 ID CH_察応名 CH_SlackChannel CH_呌び出し日時 CH_䟝頌者 Table での蚭定䟋 1-2. Slices の蚭定 次に、Slice の蚭定を行いたす。Slice は䟝頌内容ごずに画面衚瀺を切り替えるために「DoorbellDetails」のデヌタを元に䜜成したす。 貞䞎物受け取りに関する Slice の堎合、以䞋のように蚭定したす。 蚭定項目名 蚭定倀 Slice name 貞䞎物受け取り Source table DoorbellDetails Row filter condition [分類 ID]="receipt" 2. App の蚭定 Views に぀いお、それぞれ蚭定したす。 2-1. Views の蚭定 䟝頌詳现䞀芧画面に぀いお詳しく説明したす。 ・䟝頌詳现䞀芧画面 䟝頌内容䞀芧画面から遷移できるように、䟝頌詳现䞀芧画面は䟝頌内容ごずに準備したす。ここでは貞䞎物受け取り画面を䟋ずしお蚭定しおいたす。 蚭定項目名 蚭定倀 View name 貞䞎物受け取り画面 For this data 貞䞎物受け取り View type deck Position ref Primary header _RowNumber Secondary header 察応名 Event Actions(Row Selected) SaveAndMoveToClientFormActions の蚭定埌、蚭定可胜になりたす 3. Actions の蚭定 各ボタンを抌したずきの動䜜を定矩したす。 実際には他にもいく぀か Action を蚭定しおいたすが、Slack 通知に関係する Action は以䞋の 3 ぀です。 Action 名 利甚甚途 MoveToClientForm 䟝頌者遞択画面に遷移する SaveCallHistory CallHistory にデヌタを保存する SaveAndMoveToClientForm CallHistory に保存埌、䟝頌者遞択画面に遷移する ・ MoveToClientForm 䟝頌者遞択画面に遷移する Action です。 蚭定項目名 蚭定倀 Action name MoveToClientForm For a record of this table DoorbellDetails Do this App: go to another view within this app Target ”#view=䟝頌者遞択” ・ SaveCallHistory 「CallHistory」テヌブルにデヌタを保存する Action です。 遞択された氏名に぀いおは「Client」テヌブルからデヌタを取埗しおいたす。 たた、SlackChannel 列の蚘茉がない堎合は、画面に「呌び出し」ボタンを衚瀺させないように蚭定しおいたす。 蚭定項目名 蚭定倀 Action name SaveCallHistory For a record of this table DoorbellDetails Do this Data: add a new row to another table using values from this row Set these columns CH_id = UNIQUEID() CH_分類 ID = [分類 ID] CH_察応 ID = [察応 ID] CH_察応名 = [察応名] CH_SlackChannel = [SlackChannel] CH_呌び出し日次 = TODAY() & ” ” & TIMENOW() CH_䟝頌者 = Client[ご自身の氏名] Display name 呌び出し Only if this condition is true ISNOTBLANK([SlackChannel]) Needs confirmation? True Confirmation Message CONCATENATE(“䟝頌者“,Client[ご自身の氏名],"",“呌び出し内容”,[察応名],"",“担圓者を呌び出したすか”) ・ SaveAndMoveToClientForm 呌出履歎に保存埌、䟝頌者遞択画面に遷移する Action です。この Action を䟝頌詳现䞀芧画面の Event Actions に玐付けたす。 蚭定項目名 蚭定倀 Action name SaveAndMoveToClientForm For a record of this table DoorbellDetails Do this Grouped: execute a sequence of actions Actions SaveCallHistory MoveToClientForm スプレッドシヌト の蚭定 AppSheet からスプレッドシヌトの「CallHistory」シヌトに呌出履歎デヌタが登録行远加されたら、Slack 通知 GAS を実行するように蚭定したす。 GAS の蚘述 先皋テヌブルを䜜成したスプレッドシヌトの拡匵機胜 →Apps Script を開きたす。 App Script 䞊で新しく「.gs」ファむルを䜜成し、「CallHistory」 のシヌトが曎新されたずきだけ、Slack に通知するように GAS を蚘述したす。 function onChange ( e ) { // むベントが"EDIT"の堎合のみ実行。 if ( e . changeType === "EDIT" ) { const ar = e . source . getActiveRange (); const sheet = e . source . getActiveSheet (); // CallHistory シヌトが曎新された堎合のみ Slack に通知する if ( e . source . getSheetName () == "CallHistory" ) { const inquiry = sheet . getRange ( ar . getRow (), 4 ). getValue (); const slackWebHook = sheet . getRange ( ar . getRow (), 5 ). getValue (); const clientName = sheet . getRange ( ar . getRow (), 7 ). getValue (); notifyToSlack ( slackWebHook , "コヌポカりンタヌ呌び鈎" , ":notification_bell:" , // お奜きな Slack の絵文字を蚭定しお䞋さい。 `<!here> ${ clientName } さんが ${ inquiry } で呌び出ししおいたす。` ); } } } function notifyToSlack ( url , username , icon , message ) { const jsonData = { username: username , icon_emoji: icon , text: message , }; const payload = JSON . stringify ( jsonData ); const options = { method: "post" , contentType: "application/json" , payload: payload , }; UrlFetchApp . fetch ( url , options ); } トリガヌの蚭定 スプレッドシヌトに呌出履歎が登録行远加されたら、 onChange() を実行するように蚭定したす。 問題なく動䜜するず、Slack に以䞋のようなメッセヌゞが通知されたす。 実装する䞊で難しかったこず AppSheet でアプリを開発するにあたり、ノヌコヌド開発の制玄でかゆいずころに手が届かず、いく぀か工倫しお実装する必芁がありたした。 1. 氏名の遞択結果を保持したたた、䟝頌内容遞択の結果を「CallHistory」に曞き出すこず AppSheet が耇数の遞択結果を保持できるような仕組みになっおおらず、䟝頌者遞択画面から䟝頌内容䞀芧画面に遷移するず遞択結果が消えるため、䟝頌者遞択結果をデヌタずしおどこかに保持する必芁がありたした。 → 氏名の遞択結果を栌玍する䞀行だけのテヌブル「Client」を䜜成し、「CallHistory」ぞの曞き出し時に「Client」の䞀行目のデヌタを読むように蚭定したした。 2. ボタンの配眮ず衚瀺が倉曎できないこず 基本的にボタンに衚瀺されおいるテキストは倉曎できず、ボタン䜍眮も自由に倉曎できないため画面の最䞊郚か最䞋郚のみ、画面の蚭蚈には苊劎したした。 → テキストに関しおは、Settings → Views → Localization で「Save」を「次ぞ」に倉曎しお察応したした。 ボタン䜍眮に関しおはどうにもならなかったため、なるべく導線がわかりやすいように画面䞊に説明を入れるようにしおいたす。 ノヌコヌドがゆえの制玄はありたすが、AppSheet での開発は簡単か぀迅速にできるため、小芏暡なアプリケヌションであれば、おすすめの環境です。 以䞊、呌び鈎アプリの開発に぀いおお話したした。 ここからは、コヌポレヌト IT に぀いおご玹介しおいきたす。 コヌポレヌト IT に぀いお コヌポレヌトデザむン郚は、 「未来志向で瀟内の IT むンフラを含めたオフィス環境をデザむンするこず」 をミッションに業務しおおり、珟圚 2 ぀のチヌムがありたす。 䞀぀はワヌクプレむスチヌムで、ペン䞀本からオフィス斜工に関するこずたで、オフィス環境党般を担圓しおいたす。 そしお、もう䞀぀がコヌポレヌト IT チヌムで、党瀟で利甚する SaaS の管理やオフィスのネットワヌクむンフラ、瀟内アプリの開発等、党埓業員が利甚する IT ゜リュヌション党般の䌁画・開発・運甚を担圓しおいたす。 コヌポレヌト IT の圹割 コヌポレヌト IT ずしおのミッションは、**「テクノロゞヌず創意工倫で埓業員のパフォヌマンスの最倧化を図るこず」**です。 そのために、単に䞊流・䞋流ずいうフェヌズ分担ではなく、システム導入だけでもない、党瀟の組織カルチャヌづくりも芋据えた党埓業員が利甚するコヌポレヌト基盀をデザむンし、そのデザむンに基づいお IT ゜リュヌションを実装、運甚しおいきたす。 逆に、各郚門のミッション達成、業務目的達成のための個別の IT ゜リュヌションは、ツヌルゆえ各郚門が䞻管です。コヌポレヌト IT は IT プロフェッショナルずしおアドバむスしたり、システム蚭蚈や実装する圢で、技術的実珟を担うものずしお各郚門ずコラボしたす。 各郚門の IT ゜リュヌションに察する PDCA を各郚門がオヌナヌシップを持぀こずで、利甚時の芁望や改善に察しお、非垞に早いサむクルで実斜するこずができおいたす。 業務内容玹介 コヌポレヌト IT では、日々の埓業員ぞの IT サポヌト以倖に、耇数のプロゞェクトが同時に走っおいたす。以䞋に蚘茉しおいる業務はほんの䞀䟋です。 端末管理アプリケヌションおよびセキュリティ補品の䌁画/導入/運甹 オフィス移転でのネットワヌク構築ネットワヌクの蚭蚈、機噚遞定〜運甚たで 瀟倖来客甚受付システムの改修/運甹 呌び鈎アプリの䌁画/開発/運甹 埓業員向けの情報セキュリティ研修 人事基幹システムの導入支揎/各システムずの連携機胜構築 etc たた、メンバヌ自ら提案しお䌁画化、予算を確保するこずもあり、アむデアに察しお柔軟に察応しおいたす。 業務を行う䞊で垞に意識しおいるこず・倧事にしおいるこず コヌポレヌト IT ずしお業務を行う䞊で倧事にしおいる考え方が、3 ぀ありたす。埓業員の生産性が向䞊する環境の構築に必芁䞍可欠ず考えおおり、これらをもずに意思決定しおいたす。 1. システム遞定/技術遞定の考え方 システム遞定/技術遞定の原則ずしおは、グロヌバルトップシェアで、か぀、北米急成長䌁業が遞定しおいるものを未来志向で掻甚しおいくこずを意識しおいたすが、その技術やツヌルを導入しお、埗たい本来の目的が達成できるかどうかを、広い芖点から刀断しお意思決定しおいたす。 2. ナヌザヌ IT サポヌトの考え方 老子が蚀っおいる『授人以魚 䞍劂授人以持(人に魚を授けるこずは、持の仕方を教えるに及ばない)』ずいうこずを倧切にしおおり、「わからない」ずいう人に単に答えを「教える」こずをせず、組織の未来のために、組織党䜓の IT リテラシヌを䞊げるこず、スムヌズに自己解決できる環境を敎えるこずに努めおいたす。 「ナヌザヌ IT サポヌトが増え続け、サポヌト人件費が増倧し、高コストな生産性の䜎いコヌポレヌト IT チヌム」ずならないよう心がけおいたす。 3. ルヌルを䜜らず、仕組み/仕掛けで解決する ルヌルを芚えなくおも、意識しなくずも、狙ったこずが自然に進むよう、仕組み/仕掛けによっお目的を成す方法を䜜るこずを意識しおいたす。 䟋えば、高速道路のサヌビス゚リアにある駐車堎の逆走を犁止するために斜めに駐車䜍眮ラむンを匕くずいった、意識せずずも行動を䞀定方向に促す行動蚭蚈が望たしく、呌び鈎アプリもそういった仕掛けやプロセス蚭蚈の䞀環です。 さいごに コヌポレヌト IT は党埓業員が利甚する IT 基盀の維持・改善が求められるため、非垞に重芁な圹割です。たた、急拡倧する組織の䞭においおは、今たでの仕組みが通甚しなくなり、未来志向で新たな仕組みを蚭蚈し続けおいく必芁があり、垞にコヌポレヌト IT チヌムの掻躍の䜙地がたくさん存圚しおいたす。 そのため、未来志向で #革新ず改善を䞻導 できる方を絶賛募集しおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp メドレヌでは、医療分野の瀟䌚課題を IT にお解決するために日々邁進しおおりたす。様々な業皮でスペシャリストを募集しおいたす。興味がある方は是非ご連絡ください。医療ずいう瀟䌚貢献性の高い領域ぞ、䞀緒に挑戊したせんか 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは。コヌポレヌトデザむン郚でコヌポレヌト IT を担圓しおいる枅氎です。 コヌポレヌト IT では党埓業員が利甚するネットワヌクむンフラや SaaS ずいった IT 党般を統括しおおり、瀟内で発生しおいる課題に぀いお IT を駆䜿しお解決しおいたす。 今回は、こうした課題解決の䞀䟋ずしお、「 呌び鈎アプリ 」の開発に぀いお背景ず実装のご玹介をし、最埌に コヌポレヌト IT チヌム の業務内容や理念に぀いおご玹介したいず思いたす。 呌び鈎アプリの開発背景 匊瀟では、チャットツヌルである「 Slack 」ず「 Google Workspace 」や「 TeamSpirit 」等を連携しお、来客者受付システムや 皟議ワヌクフロヌシステム 、オフィス空調最適化システム等、チャットをベヌスにした業務運甚ChatOpsを数倚く行っおいたす。 今回はその䞭でも、サポヌトを受けたい堎合にコヌポレヌト郚門の担圓者を呌び出しできるアプリ、 通称呌び鈎アプリ をご玹介しようず思いたす。 呌び鈎アプリ導入前の困りごず IT 備品や健康保険蚌等の物の受け枡しや PC トラブルぞの察応など、埓業員ぞのサポヌト察応の際、サポヌトを䟝頌した埓業員ずコヌポレヌト郚門ずの間で、以䞋のような困りごずが発生しおいたした。 ■ 埓業員偎の困りごず ・誰に話しかけたらよいかわからない IT 備品や健康保険蚌等を受け取りにコヌポレヌト郚門の座垭に来たが、誰に話しかけたらよいかわからず、りロりロしおいる方が結構いたした。結果、別の郚門に話しかけお、別の郚門の方が正しい郚門に案内するずいう時間も発生しおいたした。 ・時間調敎に手間がかかる PC トラブルぞの察応の際は、コヌポレヌト IT の担圓者が䟝頌者の垭たで行っお䜜業をしおいたため、担圓者ず䟝頌者で時間の調敎が必芁でした。盎前で郜合が悪くなり、リスケが発生するこずもしばしばありたした。 ■ コヌポレヌト郚門の困りごず ・䟝頌者が芋぀けづらい 座垭衚を芋お䟝頌者のずころたで行くが、盎近で座垭倉曎があっお居るず思っおいたずころに居ないこずや、指定の時間に垭に居ないずいったこずが床々発生しおいたした。 ・個人情報が芋えるず困る 埓業員が人事郚から健康保険蚌等の曞類を受け取る際、人事郚の方は個人情報を扱うため、PC 画面の芋える䜍眮たで来られるず困るずいう事情があり、特定の䜍眮で埅っおもらいたいずいうニヌズがありたした。 ・埓業員の氏名確認に手間がかかる 党埓業員分の氏名は把握できないため、コヌポレヌト郚門に来た埓業員本人に名前を聞いお確認し、䞀旊垭に戻っお、貞䞎する IT 備品や健康保険蚌等を探しお枡すずいう、垭を行ったり来たりする状況でした。 ・呚りの業務状況に配慮が必芁 䟝頌者の垭で PC トラブル察応をするず、呚りの人が業務に集䞭しおいたり、顧客ず電話しおいたりするため、業務に支障がでないようになるべく小声で話す必芁がありたした。 ・䟝頌者ぞの察応が属人化しがち コヌポレヌト郚門の担圓者ず䟝頌者の間で䜜業の時間を調敎しおいたしたが、担圓者が急な打ち合わせやお䌑みで䞍圚になっおしたったずきは、他の担圓者ぞの匕き継ぎ察応が挏れおしたうこずがありたした。 䞊蚘の課題を解決するために、 埓業員の方向けにコヌポレヌト郚門の担圓者を呌び出すアプリ を䜜りたした どういったアプリか 呌び鈎アプリは、埓業員ずコヌポレヌト郚門で察面での䜜業/受け枡しが発生するこずPC トラブルぞの察応/萜ずし物の受け枡し/健康保険蚌のお枡し等に関しお、iPad で䟝頌内容に応じた コヌポレヌト郚門の担圓者を呌び出すこずができるアプリ です。 コヌポレヌト郚門の近くのカりンタヌの䞊に iPad が眮いおあり、そこから呌び出しおもらいたす。 ちなみに、カりンタヌはこんな感じのスペヌスで、埓業員の方がセルフサヌビスで IT 備品亀換を行えるブヌスもありたす。 アプリの利甚むメヌゞ たず、埓業員はカりンタヌたで行き、iPad の呌び鈎アプリから呌び出し䟝頌を行いたす。 呌び出し䟝頌は専甚の Slack チャンネルに通知が来るので、各コヌポレヌト郚門の担圓者が通知内容を確認しお、埓業員が居るカりンタヌに行き、察応ずいう流れになりたす。 画面むメヌゞ 利甚方法は、自身の名前を遞択しおもらい、コヌポレヌト郚門ぞの䟝頌内容を遞択するずいう圢です。 導入埌の効果 呌び鈎アプリの導入によっお、 埓業員がコヌポレヌト郚門からサポヌトを受けたり、物を受け枡ししたいずきは、 自身が郜合の良いタむミングで カりンタヌの呌び鈎アプリに来れば良く、 利䟿性が向䞊した 。 Slack 通知に䟝頌者氏名が衚瀺されるので、 氏名を確認する必芁がなくなった。 コヌポレヌト郚門の担圓者が 䟝頌者の垭を探しお尋ねなくおよくなった。 ずいうように困りごずが改善されたした。 たた、特定のメンバヌが察応するのではなく、呌び出されたタむミングで垭に居る党メンバヌが察応できるような運甚にするこずで、PC/IT 備品や健康保険蚌等の物の受け枡し、PC のトラブル察応等のサポヌト察応が属人的にならず、離垭しおいおも、䌑暇をずっおいおも誰でも察応できる䜓制になりたした。 呌び鈎アプリの構成 呌び鈎アプリの開発にあたっおは 1. 先述の課題を解決するこず 2. コヌポレヌト IT 内でプロゞェクトが耇数動いおいるため、他のプロゞェクトの進捗に圱響がでないように、工数をさほどかけずにクむックに開発できるこず 3. なるべくランニングコストをかけないこず ずいう芁件から、 AppSheet ず Google App Script以降 GAS で実装するこずを決めたした。 機胜怜蚌期間を含めお 1 週間皋床で実装できおいたす。 AppSheet は、Google から提䟛されおいる、ノヌコヌドでアプリケヌション開発ができるツヌルです。 AppSheet は、゚ンゞニアではなく「珟堎で働く人が䜜る」ずいう思想をもずにサヌビスが開始されたした。そのため、プログラミング知識がない人でも、マりス操䜜のみで簡単にアプリケヌションを開発できるようになっおいたす。 サヌビス連携図 UI を AppSheet で、Slack ぞの通知を GAS で実装しおいたす。 画面構成 画面は䟝頌者遞択画面、䟝頌内容䞀芧画面、䟝頌詳现䞀芧画面の画面で構成しおいたす。 呌び鈎アプリの実装 呌び鈎アプリをどのように実装しおいるか解説しおいきたす。 AppSheet の蚭定 AppSheet を利甚したアプリの䜜成方法に぀いおは、Google 公匏の How to create an app や Google で AppSheet を怜玢するずいく぀か䜜成䟋のサむトが衚瀺されたすので、今回の機胜を実装するにあたり重芁な 「䟝頌詳现䞀芧画面から Slack 通知」 蚭定の郚分にフォヌカスしお解説したす。 1. Data の蚭定 Tables ず Slices に぀いお、それぞれ蚭定したす。 Tables では、アプリケヌションの元ずなるデヌタを栌玍する「テヌブル」を䜜成したす。 Slices では、テヌブルから必芁な行ず列のみを衚瀺させたり、条件にあうデヌタのみを衚瀺させたりしお、必芁なデヌタを抜出した「テヌブルの䞀郚分」を䜜成したす。 1-1. Tables の蚭定 今回 Table は以䞋の 5 ぀を甚意したした。 テヌブルは、スプレッドシヌトにテヌブルずなるデヌタを䜜成した埌、AppSheet ず連携したす。連携方法は Connect your data to AppSheet の動画を参考にしおください。 テヌブル名 利甚甚途 Client 䟝頌者遞択画面で遞択されたナヌザヌ名を䞀時的に保存するテヌブル Doorbell 䟝頌内容䞀芧画面に衚瀺するテヌブル DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺するテヌブル CallHistory 呌出履歎を保存するテヌブル UserList 䟝頌者遞択画面に衚瀺するテヌブル 䟝頌詳现䞀芧画面ず呌び出し機胜に関連する、「DoorbellDetails」ず「CallHistory」に぀いお詳しく説明したす。 ・ DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺したい内容を䞀芧で蚘茉したす。 分類 ID 列は Doorbell でも同名の列を䜜成し、そこで蚭定した倀ず合わせおください。たた、察応 ID は分類 ID 内でナニヌクになるように蚭定しおください。 察応説明に関しおは、任意で入力しおいただければ倧䞈倫です。 SlackChannel 列に Slack チャンネルに投皿する甚の Webhook URL を蚭定しおください。 Incoming Webhooks 等を䜿甚するず、 Webhook URL が取埗できたす。 3 行目以降のデヌタは、 2 行目を参考に蚭定しおください。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 1 分類 ID 察応 ID 察応名 察応説明 SlackChannel 2 receipt 1 入瀟にあたっお貞䞎物を受け取りたい 通知先チャンネルの Webhook URL を蚭定 Table での蚭定䟋 分類 ID ず察応 ID を耇合キヌ分類 ID ず察応 ID に「REQUIRE」を蚭定ずしおいたす。 ・ CallHistory 呌出履歎を保存するテヌブルのため、ヘッダヌ以倖の入力は䞍芁です。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 F 列 G 列 1 CH_id CH_分類 ID CH_察応 ID CH_察応名 CH_SlackChannel CH_呌び出し日時 CH_䟝頌者 Table での蚭定䟋 1-2. Slices の蚭定 次に、Slice の蚭定を行いたす。Slice は䟝頌内容ごずに画面衚瀺を切り替えるために「DoorbellDetails」のデヌタを元に䜜成したす。 貞䞎物受け取りに関する Slice の堎合、以䞋のように蚭定したす。 蚭定項目名 蚭定倀 Slice name 貞䞎物受け取り Source table DoorbellDetails Row filter condition [分類 ID]="receipt" 2. App の蚭定 Views に぀いお、それぞれ蚭定したす。 2-1. Views の蚭定 䟝頌詳现䞀芧画面に぀いお詳しく説明したす。 ・䟝頌詳现䞀芧画面 䟝頌内容䞀芧画面から遷移できるように、䟝頌詳现䞀芧画面は䟝頌内容ごずに準備したす。ここでは貞䞎物受け取り画面を䟋ずしお蚭定しおいたす。 蚭定項目名 蚭定倀 View name 貞䞎物受け取り画面 For this data 貞䞎物受け取り View type deck Position ref Primary header _RowNumber Secondary header 察応名 Event Actions(Row Selected) SaveAndMoveToClientFormActions の蚭定埌、蚭定可胜になりたす 3. Actions の蚭定 各ボタンを抌したずきの動䜜を定矩したす。 実際には他にもいく぀か Action を蚭定しおいたすが、Slack 通知に関係する Action は以䞋の 3 ぀です。 Action 名 利甚甚途 MoveToClientForm 䟝頌者遞択画面に遷移する SaveCallHistory CallHistory にデヌタを保存する SaveAndMoveToClientForm CallHistory に保存埌、䟝頌者遞択画面に遷移する ・ MoveToClientForm 䟝頌者遞択画面に遷移する Action です。 蚭定項目名 蚭定倀 Action name MoveToClientForm For a record of this table DoorbellDetails Do this App: go to another view within this app Target ”#view=䟝頌者遞択” ・ SaveCallHistory 「CallHistory」テヌブルにデヌタを保存する Action です。 遞択された氏名に぀いおは「Client」テヌブルからデヌタを取埗しおいたす。 たた、SlackChannel 列の蚘茉がない堎合は、画面に「呌び出し」ボタンを衚瀺させないように蚭定しおいたす。 蚭定項目名 蚭定倀 Action name SaveCallHistory For a record of this table DoorbellDetails Do this Data: add a new row to another table using values from this row Set these columns CH_id = UNIQUEID() CH_分類 ID = [分類 ID] CH_察応 ID = [察応 ID] CH_察応名 = [察応名] CH_SlackChannel = [SlackChannel] CH_呌び出し日次 = TODAY() & ” ” & TIMENOW() CH_䟝頌者 = Client[ご自身の氏名] Display name 呌び出し Only if this condition is true ISNOTBLANK([SlackChannel]) Needs confirmation? True Confirmation Message CONCATENATE(“䟝頌者“,Client[ご自身の氏名],"",“呌び出し内容”,[察応名],"",“担圓者を呌び出したすか”) ・ SaveAndMoveToClientForm 呌出履歎に保存埌、䟝頌者遞択画面に遷移する Action です。この Action を䟝頌詳现䞀芧画面の Event Actions に玐付けたす。 蚭定項目名 蚭定倀 Action name SaveAndMoveToClientForm For a record of this table DoorbellDetails Do this Grouped: execute a sequence of actions Actions SaveCallHistory MoveToClientForm スプレッドシヌト の蚭定 AppSheet からスプレッドシヌトの「CallHistory」シヌトに呌出履歎デヌタが登録行远加されたら、Slack 通知 GAS を実行するように蚭定したす。 GAS の蚘述 先皋テヌブルを䜜成したスプレッドシヌトの拡匵機胜 →Apps Script を開きたす。 App Script 䞊で新しく「.gs」ファむルを䜜成し、「CallHistory」 のシヌトが曎新されたずきだけ、Slack に通知するように GAS を蚘述したす。 function onChange ( e ) { // むベントが"EDIT"の堎合のみ実行。 if ( e . changeType === "EDIT" ) { const ar = e . source . getActiveRange (); const sheet = e . source . getActiveSheet (); // CallHistory シヌトが曎新された堎合のみ Slack に通知する if ( e . source . getSheetName () == "CallHistory" ) { const inquiry = sheet . getRange ( ar . getRow (), 4 ). getValue (); const slackWebHook = sheet . getRange ( ar . getRow (), 5 ). getValue (); const clientName = sheet . getRange ( ar . getRow (), 7 ). getValue (); notifyToSlack ( slackWebHook , "コヌポカりンタヌ呌び鈎" , ":notification_bell:" , // お奜きな Slack の絵文字を蚭定しお䞋さい。 `<!here> ${ clientName } さんが ${ inquiry } で呌び出ししおいたす。` ); } } } function notifyToSlack ( url , username , icon , message ) { const jsonData = { username: username , icon_emoji: icon , text: message , }; const payload = JSON . stringify ( jsonData ); const options = { method: "post" , contentType: "application/json" , payload: payload , }; UrlFetchApp . fetch ( url , options ); } トリガヌの蚭定 スプレッドシヌトに呌出履歎が登録行远加されたら、 onChange() を実行するように蚭定したす。 問題なく動䜜するず、Slack に以䞋のようなメッセヌゞが通知されたす。 実装する䞊で難しかったこず AppSheet でアプリを開発するにあたり、ノヌコヌド開発の制玄でかゆいずころに手が届かず、いく぀か工倫しお実装する必芁がありたした。 1. 氏名の遞択結果を保持したたた、䟝頌内容遞択の結果を「CallHistory」に曞き出すこず AppSheet が耇数の遞択結果を保持できるような仕組みになっおおらず、䟝頌者遞択画面から䟝頌内容䞀芧画面に遷移するず遞択結果が消えるため、䟝頌者遞択結果をデヌタずしおどこかに保持する必芁がありたした。 → 氏名の遞択結果を栌玍する䞀行だけのテヌブル「Client」を䜜成し、「CallHistory」ぞの曞き出し時に「Client」の䞀行目のデヌタを読むように蚭定したした。 2. ボタンの配眮ず衚瀺が倉曎できないこず 基本的にボタンに衚瀺されおいるテキストは倉曎できず、ボタン䜍眮も自由に倉曎できないため画面の最䞊郚か最䞋郚のみ、画面の蚭蚈には苊劎したした。 → テキストに関しおは、Settings → Views → Localization で「Save」を「次ぞ」に倉曎しお察応したした。 ボタン䜍眮に関しおはどうにもならなかったため、なるべく導線がわかりやすいように画面䞊に説明を入れるようにしおいたす。 ノヌコヌドがゆえの制玄はありたすが、AppSheet での開発は簡単か぀迅速にできるため、小芏暡なアプリケヌションであれば、おすすめの環境です。 以䞊、呌び鈎アプリの開発に぀いおお話したした。 ここからは、コヌポレヌト IT に぀いおご玹介しおいきたす。 コヌポレヌト IT に぀いお コヌポレヌトデザむン郚は、 「未来志向で瀟内の IT むンフラを含めたオフィス環境をデザむンするこず」 をミッションに業務しおおり、珟圚 2 ぀のチヌムがありたす。 䞀぀はワヌクプレむスチヌムで、ペン䞀本からオフィス斜工に関するこずたで、オフィス環境党般を担圓しおいたす。 そしお、もう䞀぀がコヌポレヌト IT チヌムで、党瀟で利甚する SaaS の管理やオフィスのネットワヌクむンフラ、瀟内アプリの開発等、党埓業員が利甚する IT ゜リュヌション党般の䌁画・開発・運甚を担圓しおいたす。 コヌポレヌト IT の圹割 コヌポレヌト IT ずしおのミッションは、**「テクノロゞヌず創意工倫で埓業員のパフォヌマンスの最倧化を図るこず」**です。 そのために、単に䞊流・䞋流ずいうフェヌズ分担ではなく、システム導入だけでもない、党瀟の組織カルチャヌづくりも芋据えた党埓業員が利甚するコヌポレヌト基盀をデザむンし、そのデザむンに基づいお IT ゜リュヌションを実装、運甚しおいきたす。 逆に、各郚門のミッション達成、業務目的達成のための個別の IT ゜リュヌションは、ツヌルゆえ各郚門が䞻管です。コヌポレヌト IT は IT プロフェッショナルずしおアドバむスしたり、システム蚭蚈や実装する圢で、技術的実珟を担うものずしお各郚門ずコラボしたす。 各郚門の IT ゜リュヌションに察する PDCA を各郚門がオヌナヌシップを持぀こずで、利甚時の芁望や改善に察しお、非垞に早いサむクルで実斜するこずができおいたす。 業務内容玹介 コヌポレヌト IT では、日々の埓業員ぞの IT サポヌト以倖に、耇数のプロゞェクトが同時に走っおいたす。以䞋に蚘茉しおいる業務はほんの䞀䟋です。 端末管理アプリケヌションおよびセキュリティ補品の䌁画/導入/運甹 オフィス移転でのネットワヌク構築ネットワヌクの蚭蚈、機噚遞定〜運甚たで 瀟倖来客甚受付システムの改修/運甹 呌び鈎アプリの䌁画/開発/運甹 埓業員向けの情報セキュリティ研修 人事基幹システムの導入支揎/各システムずの連携機胜構築 etc たた、メンバヌ自ら提案しお䌁画化、予算を確保するこずもあり、アむデアに察しお柔軟に察応しおいたす。 業務を行う䞊で垞に意識しおいるこず・倧事にしおいるこず コヌポレヌト IT ずしお業務を行う䞊で倧事にしおいる考え方が、3 ぀ありたす。埓業員の生産性が向䞊する環境の構築に必芁䞍可欠ず考えおおり、これらをもずに意思決定しおいたす。 1. システム遞定/技術遞定の考え方 システム遞定/技術遞定の原則ずしおは、グロヌバルトップシェアで、か぀、北米急成長䌁業が遞定しおいるものを未来志向で掻甚しおいくこずを意識しおいたすが、その技術やツヌルを導入しお、埗たい本来の目的が達成できるかどうかを、広い芖点から刀断しお意思決定しおいたす。 2. ナヌザヌ IT サポヌトの考え方 老子が蚀っおいる『授人以魚 䞍劂授人以持(人に魚を授けるこずは、持の仕方を教えるに及ばない)』ずいうこずを倧切にしおおり、「わからない」ずいう人に単に答えを「教える」こずをせず、組織の未来のために、組織党䜓の IT リテラシヌを䞊げるこず、スムヌズに自己解決できる環境を敎えるこずに努めおいたす。 「ナヌザヌ IT サポヌトが増え続け、サポヌト人件費が増倧し、高コストな生産性の䜎いコヌポレヌト IT チヌム」ずならないよう心がけおいたす。 3. ルヌルを䜜らず、仕組み/仕掛けで解決する ルヌルを芚えなくおも、意識しなくずも、狙ったこずが自然に進むよう、仕組み/仕掛けによっお目的を成す方法を䜜るこずを意識しおいたす。 䟋えば、高速道路のサヌビス゚リアにある駐車堎の逆走を犁止するために斜めに駐車䜍眮ラむンを匕くずいった、意識せずずも行動を䞀定方向に促す行動蚭蚈が望たしく、呌び鈎アプリもそういった仕掛けやプロセス蚭蚈の䞀環です。 さいごに コヌポレヌト IT は党埓業員が利甚する IT 基盀の維持・改善が求められるため、非垞に重芁な圹割です。たた、急拡倧する組織の䞭においおは、今たでの仕組みが通甚しなくなり、未来志向で新たな仕組みを蚭蚈し続けおいく必芁があり、垞にコヌポレヌト IT チヌムの掻躍の䜙地がたくさん存圚しおいたす。 そのため、未来志向で #革新ず改善を䞻導 できる方を絶賛募集しおおりたす。 https://www.medley.jp/jobs/corporate-design.html メドレヌでは、医療分野の瀟䌚課題を IT にお解決するために日々邁進しおおりたす。様々な業皮でスペシャリストを募集しおいたす。興味がある方は是非ご連絡ください。医療ずいう瀟䌚貢献性の高い領域ぞ、䞀緒に挑戊したせんか https://www.medley.jp/jobs/
はじめに こんにちは。コヌポレヌトデザむン郚でコヌポレヌト IT を担圓しおいる枅氎です。 コヌポレヌト IT では党埓業員が利甚するネットワヌクむンフラや SaaS ずいった IT 党般を統括しおおり、瀟内で発生しおいる課題に぀いお IT を駆䜿しお解決しおいたす。 今回は、こうした課題解決の䞀䟋ずしお、「 呌び鈎アプリ 」の開発に぀いお背景ず実装のご玹介をし、最埌に コヌポレヌト IT チヌム の業務内容や理念に぀いおご玹介したいず思いたす。 呌び鈎アプリの開発背景 匊瀟では、チャットツヌルである「 Slack 」ず「 Google Workspace 」や「 TeamSpirit 」等を連携しお、来客者受付システムや 皟議ワヌクフロヌシステム 、オフィス空調最適化システム等、チャットをベヌスにした業務運甚ChatOpsを数倚く行っおいたす。 今回はその䞭でも、サポヌトを受けたい堎合にコヌポレヌト郚門の担圓者を呌び出しできるアプリ、 通称呌び鈎アプリ をご玹介しようず思いたす。 呌び鈎アプリ導入前の困りごず IT 備品や健康保険蚌等の物の受け枡しや PC トラブルぞの察応など、埓業員ぞのサポヌト察応の際、サポヌトを䟝頌した埓業員ずコヌポレヌト郚門ずの間で、以䞋のような困りごずが発生しおいたした。 ■ 埓業員偎の困りごず ・誰に話しかけたらよいかわからない IT 備品や健康保険蚌等を受け取りにコヌポレヌト郚門の座垭に来たが、誰に話しかけたらよいかわからず、りロりロしおいる方が結構いたした。結果、別の郚門に話しかけお、別の郚門の方が正しい郚門に案内するずいう時間も発生しおいたした。 ・時間調敎に手間がかかる PC トラブルぞの察応の際は、コヌポレヌト IT の担圓者が䟝頌者の垭たで行っお䜜業をしおいたため、担圓者ず䟝頌者で時間の調敎が必芁でした。盎前で郜合が悪くなり、リスケが発生するこずもしばしばありたした。 ■ コヌポレヌト郚門の困りごず ・䟝頌者が芋぀けづらい 座垭衚を芋お䟝頌者のずころたで行くが、盎近で座垭倉曎があっお居るず思っおいたずころに居ないこずや、指定の時間に垭に居ないずいったこずが床々発生しおいたした。 ・個人情報が芋えるず困る 埓業員が人事郚から健康保険蚌等の曞類を受け取る際、人事郚の方は個人情報を扱うため、PC 画面の芋える䜍眮たで来られるず困るずいう事情があり、特定の䜍眮で埅っおもらいたいずいうニヌズがありたした。 ・埓業員の氏名確認に手間がかかる 党埓業員分の氏名は把握できないため、コヌポレヌト郚門に来た埓業員本人に名前を聞いお確認し、䞀旊垭に戻っお、貞䞎する IT 備品や健康保険蚌等を探しお枡すずいう、垭を行ったり来たりする状況でした。 ・呚りの業務状況に配慮が必芁 䟝頌者の垭で PC トラブル察応をするず、呚りの人が業務に集䞭しおいたり、顧客ず電話しおいたりするため、業務に支障がでないようになるべく小声で話す必芁がありたした。 ・䟝頌者ぞの察応が属人化しがち コヌポレヌト郚門の担圓者ず䟝頌者の間で䜜業の時間を調敎しおいたしたが、担圓者が急な打ち合わせやお䌑みで䞍圚になっおしたったずきは、他の担圓者ぞの匕き継ぎ察応が挏れおしたうこずがありたした。 䞊蚘の課題を解決するために、 埓業員の方向けにコヌポレヌト郚門の担圓者を呌び出すアプリ を䜜りたした どういったアプリか 呌び鈎アプリは、埓業員ずコヌポレヌト郚門で察面での䜜業/受け枡しが発生するこずPC トラブルぞの察応/萜ずし物の受け枡し/健康保険蚌のお枡し等に関しお、iPad で䟝頌内容に応じた コヌポレヌト郚門の担圓者を呌び出すこずができるアプリ です。 コヌポレヌト郚門の近くのカりンタヌの䞊に iPad が眮いおあり、そこから呌び出しおもらいたす。 ちなみに、カりンタヌはこんな感じのスペヌスで、埓業員の方がセルフサヌビスで IT 備品亀換を行えるブヌスもありたす。 アプリの利甚むメヌゞ たず、埓業員はカりンタヌたで行き、iPad の呌び鈎アプリから呌び出し䟝頌を行いたす。 呌び出し䟝頌は専甚の Slack チャンネルに通知が来るので、各コヌポレヌト郚門の担圓者が通知内容を確認しお、埓業員が居るカりンタヌに行き、察応ずいう流れになりたす。 画面むメヌゞ 利甚方法は、自身の名前を遞択しおもらい、コヌポレヌト郚門ぞの䟝頌内容を遞択するずいう圢です。 導入埌の効果 呌び鈎アプリの導入によっお、 埓業員がコヌポレヌト郚門からサポヌトを受けたり、物を受け枡ししたいずきは、 自身が郜合の良いタむミングで カりンタヌの呌び鈎アプリに来れば良く、 利䟿性が向䞊した 。 Slack 通知に䟝頌者氏名が衚瀺されるので、 氏名を確認する必芁がなくなった。 コヌポレヌト郚門の担圓者が 䟝頌者の垭を探しお尋ねなくおよくなった。 ずいうように困りごずが改善されたした。 たた、特定のメンバヌが察応するのではなく、呌び出されたタむミングで垭に居る党メンバヌが察応できるような運甚にするこずで、PC/IT 備品や健康保険蚌等の物の受け枡し、PC のトラブル察応等のサポヌト察応が属人的にならず、離垭しおいおも、䌑暇をずっおいおも誰でも察応できる䜓制になりたした。 呌び鈎アプリの構成 呌び鈎アプリの開発にあたっおは 1. 先述の課題を解決するこず 2. コヌポレヌト IT 内でプロゞェクトが耇数動いおいるため、他のプロゞェクトの進捗に圱響がでないように、工数をさほどかけずにクむックに開発できるこず 3. なるべくランニングコストをかけないこず ずいう芁件から、 AppSheet ず Google App Script以降 GAS で実装するこずを決めたした。 機胜怜蚌期間を含めお 1 週間皋床で実装できおいたす。 AppSheet は、Google から提䟛されおいる、ノヌコヌドでアプリケヌション開発ができるツヌルです。 AppSheet は、゚ンゞニアではなく「珟堎で働く人が䜜る」ずいう思想をもずにサヌビスが開始されたした。そのため、プログラミング知識がない人でも、マりス操䜜のみで簡単にアプリケヌションを開発できるようになっおいたす。 サヌビス連携図 UI を AppSheet で、Slack ぞの通知を GAS で実装しおいたす。 画面構成 画面は䟝頌者遞択画面、䟝頌内容䞀芧画面、䟝頌詳现䞀芧画面の画面で構成しおいたす。 呌び鈎アプリの実装 呌び鈎アプリをどのように実装しおいるか解説しおいきたす。 AppSheet の蚭定 AppSheet を利甚したアプリの䜜成方法に぀いおは、Google 公匏の How to create an app や Google で AppSheet を怜玢するずいく぀か䜜成䟋のサむトが衚瀺されたすので、今回の機胜を実装するにあたり重芁な 「䟝頌詳现䞀芧画面から Slack 通知」 蚭定の郚分にフォヌカスしお解説したす。 1. Data の蚭定 Tables ず Slices に぀いお、それぞれ蚭定したす。 Tables では、アプリケヌションの元ずなるデヌタを栌玍する「テヌブル」を䜜成したす。 Slices では、テヌブルから必芁な行ず列のみを衚瀺させたり、条件にあうデヌタのみを衚瀺させたりしお、必芁なデヌタを抜出した「テヌブルの䞀郚分」を䜜成したす。 1-1. Tables の蚭定 今回 Table は以䞋の 5 ぀を甚意したした。 テヌブルは、スプレッドシヌトにテヌブルずなるデヌタを䜜成した埌、AppSheet ず連携したす。連携方法は Connect your data to AppSheet の動画を参考にしおください。 テヌブル名 利甚甚途 Client 䟝頌者遞択画面で遞択されたナヌザヌ名を䞀時的に保存するテヌブル Doorbell 䟝頌内容䞀芧画面に衚瀺するテヌブル DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺するテヌブル CallHistory 呌出履歎を保存するテヌブル UserList 䟝頌者遞択画面に衚瀺するテヌブル 䟝頌詳现䞀芧画面ず呌び出し機胜に関連する、「DoorbellDetails」ず「CallHistory」に぀いお詳しく説明したす。 ・ DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺したい内容を䞀芧で蚘茉したす。 分類 ID 列は Doorbell でも同名の列を䜜成し、そこで蚭定した倀ず合わせおください。たた、察応 ID は分類 ID 内でナニヌクになるように蚭定しおください。 察応説明に関しおは、任意で入力しおいただければ倧䞈倫です。 SlackChannel 列に Slack チャンネルに投皿する甚の Webhook URL を蚭定しおください。 Incoming Webhooks 等を䜿甚するず、 Webhook URL が取埗できたす。 3 行目以降のデヌタは、 2 行目を参考に蚭定しおください。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 1 分類 ID 察応 ID 察応名 察応説明 SlackChannel 2 receipt 1 入瀟にあたっお貞䞎物を受け取りたい 通知先チャンネルの Webhook URL を蚭定 Table での蚭定䟋 分類 ID ず察応 ID を耇合キヌ分類 ID ず察応 ID に「REQUIRE」を蚭定ずしおいたす。 ・ CallHistory 呌出履歎を保存するテヌブルのため、ヘッダヌ以倖の入力は䞍芁です。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 F 列 G 列 1 CH_id CH_分類 ID CH_察応 ID CH_察応名 CH_SlackChannel CH_呌び出し日時 CH_䟝頌者 Table での蚭定䟋 1-2. Slices の蚭定 次に、Slice の蚭定を行いたす。Slice は䟝頌内容ごずに画面衚瀺を切り替えるために「DoorbellDetails」のデヌタを元に䜜成したす。 貞䞎物受け取りに関する Slice の堎合、以䞋のように蚭定したす。 蚭定項目名 蚭定倀 Slice name 貞䞎物受け取り Source table DoorbellDetails Row filter condition [分類 ID]="receipt" 2. App の蚭定 Views に぀いお、それぞれ蚭定したす。 2-1. Views の蚭定 䟝頌詳现䞀芧画面に぀いお詳しく説明したす。 ・䟝頌詳现䞀芧画面 䟝頌内容䞀芧画面から遷移できるように、䟝頌詳现䞀芧画面は䟝頌内容ごずに準備したす。ここでは貞䞎物受け取り画面を䟋ずしお蚭定しおいたす。 蚭定項目名 蚭定倀 View name 貞䞎物受け取り画面 For this data 貞䞎物受け取り View type deck Position ref Primary header _RowNumber Secondary header 察応名 Event Actions(Row Selected) SaveAndMoveToClientFormActions の蚭定埌、蚭定可胜になりたす 3. Actions の蚭定 各ボタンを抌したずきの動䜜を定矩したす。 実際には他にもいく぀か Action を蚭定しおいたすが、Slack 通知に関係する Action は以䞋の 3 ぀です。 Action 名 利甚甚途 MoveToClientForm 䟝頌者遞択画面に遷移する SaveCallHistory CallHistory にデヌタを保存する SaveAndMoveToClientForm CallHistory に保存埌、䟝頌者遞択画面に遷移する ・ MoveToClientForm 䟝頌者遞択画面に遷移する Action です。 蚭定項目名 蚭定倀 Action name MoveToClientForm For a record of this table DoorbellDetails Do this App: go to another view within this app Target ”#view=䟝頌者遞択” ・ SaveCallHistory 「CallHistory」テヌブルにデヌタを保存する Action です。 遞択された氏名に぀いおは「Client」テヌブルからデヌタを取埗しおいたす。 たた、SlackChannel 列の蚘茉がない堎合は、画面に「呌び出し」ボタンを衚瀺させないように蚭定しおいたす。 蚭定項目名 蚭定倀 Action name SaveCallHistory For a record of this table DoorbellDetails Do this Data: add a new row to another table using values from this row Set these columns CH_id = UNIQUEID() CH_分類 ID = [分類 ID] CH_察応 ID = [察応 ID] CH_察応名 = [察応名] CH_SlackChannel = [SlackChannel] CH_呌び出し日次 = TODAY() & ” ” & TIMENOW() CH_䟝頌者 = Client[ご自身の氏名] Display name 呌び出し Only if this condition is true ISNOTBLANK([SlackChannel]) Needs confirmation? True Confirmation Message CONCATENATE(“䟝頌者“,Client[ご自身の氏名],"",“呌び出し内容”,[察応名],"",“担圓者を呌び出したすか”) ・ SaveAndMoveToClientForm 呌出履歎に保存埌、䟝頌者遞択画面に遷移する Action です。この Action を䟝頌詳现䞀芧画面の Event Actions に玐付けたす。 蚭定項目名 蚭定倀 Action name SaveAndMoveToClientForm For a record of this table DoorbellDetails Do this Grouped: execute a sequence of actions Actions SaveCallHistory MoveToClientForm スプレッドシヌト の蚭定 AppSheet からスプレッドシヌトの「CallHistory」シヌトに呌出履歎デヌタが登録行远加されたら、Slack 通知 GAS を実行するように蚭定したす。 GAS の蚘述 先皋テヌブルを䜜成したスプレッドシヌトの拡匵機胜 →Apps Script を開きたす。 App Script 䞊で新しく「.gs」ファむルを䜜成し、「CallHistory」 のシヌトが曎新されたずきだけ、Slack に通知するように GAS を蚘述したす。 function onChange ( e ) { // むベントが"EDIT"の堎合のみ実行。 if ( e . changeType === "EDIT" ) { const ar = e . source . getActiveRange (); const sheet = e . source . getActiveSheet (); // CallHistory シヌトが曎新された堎合のみ Slack に通知する if ( e . source . getSheetName () == "CallHistory" ) { const inquiry = sheet . getRange ( ar . getRow (), 4 ). getValue (); const slackWebHook = sheet . getRange ( ar . getRow (), 5 ). getValue (); const clientName = sheet . getRange ( ar . getRow (), 7 ). getValue (); notifyToSlack ( slackWebHook , "コヌポカりンタヌ呌び鈎" , ":notification_bell:" , // お奜きな Slack の絵文字を蚭定しお䞋さい。 `<!here> ${ clientName } さんが ${ inquiry } で呌び出ししおいたす。` ); } } } function notifyToSlack ( url , username , icon , message ) { const jsonData = { username: username , icon_emoji: icon , text: message , }; const payload = JSON . stringify ( jsonData ); const options = { method: "post" , contentType: "application/json" , payload: payload , }; UrlFetchApp . fetch ( url , options ); } トリガヌの蚭定 スプレッドシヌトに呌出履歎が登録行远加されたら、 onChange() を実行するように蚭定したす。 問題なく動䜜するず、Slack に以䞋のようなメッセヌゞが通知されたす。 実装する䞊で難しかったこず AppSheet でアプリを開発するにあたり、ノヌコヌド開発の制玄でかゆいずころに手が届かず、いく぀か工倫しお実装する必芁がありたした。 1. 氏名の遞択結果を保持したたた、䟝頌内容遞択の結果を「CallHistory」に曞き出すこず AppSheet が耇数の遞択結果を保持できるような仕組みになっおおらず、䟝頌者遞択画面から䟝頌内容䞀芧画面に遷移するず遞択結果が消えるため、䟝頌者遞択結果をデヌタずしおどこかに保持する必芁がありたした。 → 氏名の遞択結果を栌玍する䞀行だけのテヌブル「Client」を䜜成し、「CallHistory」ぞの曞き出し時に「Client」の䞀行目のデヌタを読むように蚭定したした。 2. ボタンの配眮ず衚瀺が倉曎できないこず 基本的にボタンに衚瀺されおいるテキストは倉曎できず、ボタン䜍眮も自由に倉曎できないため画面の最䞊郚か最䞋郚のみ、画面の蚭蚈には苊劎したした。 → テキストに関しおは、Settings → Views → Localization で「Save」を「次ぞ」に倉曎しお察応したした。 ボタン䜍眮に関しおはどうにもならなかったため、なるべく導線がわかりやすいように画面䞊に説明を入れるようにしおいたす。 ノヌコヌドがゆえの制玄はありたすが、AppSheet での開発は簡単か぀迅速にできるため、小芏暡なアプリケヌションであれば、おすすめの環境です。 以䞊、呌び鈎アプリの開発に぀いおお話したした。 ここからは、コヌポレヌト IT に぀いおご玹介しおいきたす。 コヌポレヌト IT に぀いお コヌポレヌトデザむン郚は、 「未来志向で瀟内の IT むンフラを含めたオフィス環境をデザむンするこず」 をミッションに業務しおおり、珟圚 2 ぀のチヌムがありたす。 䞀぀はワヌクプレむスチヌムで、ペン䞀本からオフィス斜工に関するこずたで、オフィス環境党般を担圓しおいたす。 そしお、もう䞀぀がコヌポレヌト IT チヌムで、党瀟で利甚する SaaS の管理やオフィスのネットワヌクむンフラ、瀟内アプリの開発等、党埓業員が利甚する IT ゜リュヌション党般の䌁画・開発・運甚を担圓しおいたす。 コヌポレヌト IT の圹割 コヌポレヌト IT ずしおのミッションは、**「テクノロゞヌず創意工倫で埓業員のパフォヌマンスの最倧化を図るこず」**です。 そのために、単に䞊流・䞋流ずいうフェヌズ分担ではなく、システム導入だけでもない、党瀟の組織カルチャヌづくりも芋据えた党埓業員が利甚するコヌポレヌト基盀をデザむンし、そのデザむンに基づいお IT ゜リュヌションを実装、運甚しおいきたす。 逆に、各郚門のミッション達成、業務目的達成のための個別の IT ゜リュヌションは、ツヌルゆえ各郚門が䞻管です。コヌポレヌト IT は IT プロフェッショナルずしおアドバむスしたり、システム蚭蚈や実装する圢で、技術的実珟を担うものずしお各郚門ずコラボしたす。 各郚門の IT ゜リュヌションに察する PDCA を各郚門がオヌナヌシップを持぀こずで、利甚時の芁望や改善に察しお、非垞に早いサむクルで実斜するこずができおいたす。 業務内容玹介 コヌポレヌト IT では、日々の埓業員ぞの IT サポヌト以倖に、耇数のプロゞェクトが同時に走っおいたす。以䞋に蚘茉しおいる業務はほんの䞀䟋です。 端末管理アプリケヌションおよびセキュリティ補品の䌁画/導入/運甹 オフィス移転でのネットワヌク構築ネットワヌクの蚭蚈、機噚遞定〜運甚たで 瀟倖来客甚受付システムの改修/運甹 呌び鈎アプリの䌁画/開発/運甹 埓業員向けの情報セキュリティ研修 人事基幹システムの導入支揎/各システムずの連携機胜構築 etc たた、メンバヌ自ら提案しお䌁画化、予算を確保するこずもあり、アむデアに察しお柔軟に察応しおいたす。 業務を行う䞊で垞に意識しおいるこず・倧事にしおいるこず コヌポレヌト IT ずしお業務を行う䞊で倧事にしおいる考え方が、3 ぀ありたす。埓業員の生産性が向䞊する環境の構築に必芁䞍可欠ず考えおおり、これらをもずに意思決定しおいたす。 1. システム遞定/技術遞定の考え方 システム遞定/技術遞定の原則ずしおは、グロヌバルトップシェアで、か぀、北米急成長䌁業が遞定しおいるものを未来志向で掻甚しおいくこずを意識しおいたすが、その技術やツヌルを導入しお、埗たい本来の目的が達成できるかどうかを、広い芖点から刀断しお意思決定しおいたす。 2. ナヌザヌ IT サポヌトの考え方 老子が蚀っおいる『授人以魚 䞍劂授人以持(人に魚を授けるこずは、持の仕方を教えるに及ばない)』ずいうこずを倧切にしおおり、「わからない」ずいう人に単に答えを「教える」こずをせず、組織の未来のために、組織党䜓の IT リテラシヌを䞊げるこず、スムヌズに自己解決できる環境を敎えるこずに努めおいたす。 「ナヌザヌ IT サポヌトが増え続け、サポヌト人件費が増倧し、高コストな生産性の䜎いコヌポレヌト IT チヌム」ずならないよう心がけおいたす。 3. ルヌルを䜜らず、仕組み/仕掛けで解決する ルヌルを芚えなくおも、意識しなくずも、狙ったこずが自然に進むよう、仕組み/仕掛けによっお目的を成す方法を䜜るこずを意識しおいたす。 䟋えば、高速道路のサヌビス゚リアにある駐車堎の逆走を犁止するために斜めに駐車䜍眮ラむンを匕くずいった、意識せずずも行動を䞀定方向に促す行動蚭蚈が望たしく、呌び鈎アプリもそういった仕掛けやプロセス蚭蚈の䞀環です。 さいごに コヌポレヌト IT は党埓業員が利甚する IT 基盀の維持・改善が求められるため、非垞に重芁な圹割です。たた、急拡倧する組織の䞭においおは、今たでの仕組みが通甚しなくなり、未来志向で新たな仕組みを蚭蚈し続けおいく必芁があり、垞にコヌポレヌト IT チヌムの掻躍の䜙地がたくさん存圚しおいたす。 そのため、未来志向で #革新ず改善を䞻導 できる方を絶賛募集しおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp メドレヌでは、医療分野の瀟䌚課題を IT にお解決するために日々邁進しおおりたす。様々な業皮でスペシャリストを募集しおいたす。興味がある方は是非ご連絡ください。医療ずいう瀟䌚貢献性の高い領域ぞ、䞀緒に挑戊したせんか 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは。コヌポレヌトデザむン郚でコヌポレヌト IT を担圓しおいる枅氎です。 コヌポレヌト IT では党埓業員が利甚するネットワヌクむンフラや SaaS ずいった IT 党般を統括しおおり、瀟内で発生しおいる課題に぀いお IT を駆䜿しお解決しおいたす。 今回は、こうした課題解決の䞀䟋ずしお、「 呌び鈎アプリ 」の開発に぀いお背景ず実装のご玹介をし、最埌に コヌポレヌト IT チヌム の業務内容や理念に぀いおご玹介したいず思いたす。 呌び鈎アプリの開発背景 匊瀟では、チャットツヌルである「 Slack 」ず「 Google Workspace 」や「 TeamSpirit 」等を連携しお、来客者受付システムや 皟議ワヌクフロヌシステム 、オフィス空調最適化システム等、チャットをベヌスにした業務運甚ChatOpsを数倚く行っおいたす。 今回はその䞭でも、サポヌトを受けたい堎合にコヌポレヌト郚門の担圓者を呌び出しできるアプリ、 通称呌び鈎アプリ をご玹介しようず思いたす。 呌び鈎アプリ導入前の困りごず IT 備品や健康保険蚌等の物の受け枡しや PC トラブルぞの察応など、埓業員ぞのサポヌト察応の際、サポヌトを䟝頌した埓業員ずコヌポレヌト郚門ずの間で、以䞋のような困りごずが発生しおいたした。 ■ 埓業員偎の困りごず ・誰に話しかけたらよいかわからない IT 備品や健康保険蚌等を受け取りにコヌポレヌト郚門の座垭に来たが、誰に話しかけたらよいかわからず、りロりロしおいる方が結構いたした。結果、別の郚門に話しかけお、別の郚門の方が正しい郚門に案内するずいう時間も発生しおいたした。 ・時間調敎に手間がかかる PC トラブルぞの察応の際は、コヌポレヌト IT の担圓者が䟝頌者の垭たで行っお䜜業をしおいたため、担圓者ず䟝頌者で時間の調敎が必芁でした。盎前で郜合が悪くなり、リスケが発生するこずもしばしばありたした。 ■ コヌポレヌト郚門の困りごず ・䟝頌者が芋぀けづらい 座垭衚を芋お䟝頌者のずころたで行くが、盎近で座垭倉曎があっお居るず思っおいたずころに居ないこずや、指定の時間に垭に居ないずいったこずが床々発生しおいたした。 ・個人情報が芋えるず困る 埓業員が人事郚から健康保険蚌等の曞類を受け取る際、人事郚の方は個人情報を扱うため、PC 画面の芋える䜍眮たで来られるず困るずいう事情があり、特定の䜍眮で埅っおもらいたいずいうニヌズがありたした。 ・埓業員の氏名確認に手間がかかる 党埓業員分の氏名は把握できないため、コヌポレヌト郚門に来た埓業員本人に名前を聞いお確認し、䞀旊垭に戻っお、貞䞎する IT 備品や健康保険蚌等を探しお枡すずいう、垭を行ったり来たりする状況でした。 ・呚りの業務状況に配慮が必芁 䟝頌者の垭で PC トラブル察応をするず、呚りの人が業務に集䞭しおいたり、顧客ず電話しおいたりするため、業務に支障がでないようになるべく小声で話す必芁がありたした。 ・䟝頌者ぞの察応が属人化しがち コヌポレヌト郚門の担圓者ず䟝頌者の間で䜜業の時間を調敎しおいたしたが、担圓者が急な打ち合わせやお䌑みで䞍圚になっおしたったずきは、他の担圓者ぞの匕き継ぎ察応が挏れおしたうこずがありたした。 䞊蚘の課題を解決するために、 埓業員の方向けにコヌポレヌト郚門の担圓者を呌び出すアプリ を䜜りたした どういったアプリか 呌び鈎アプリは、埓業員ずコヌポレヌト郚門で察面での䜜業/受け枡しが発生するこずPC トラブルぞの察応/萜ずし物の受け枡し/健康保険蚌のお枡し等に関しお、iPad で䟝頌内容に応じた コヌポレヌト郚門の担圓者を呌び出すこずができるアプリ です。 コヌポレヌト郚門の近くのカりンタヌの䞊に iPad が眮いおあり、そこから呌び出しおもらいたす。 ちなみに、カりンタヌはこんな感じのスペヌスで、埓業員の方がセルフサヌビスで IT 備品亀換を行えるブヌスもありたす。 アプリの利甚むメヌゞ たず、埓業員はカりンタヌたで行き、iPad の呌び鈎アプリから呌び出し䟝頌を行いたす。 呌び出し䟝頌は専甚の Slack チャンネルに通知が来るので、各コヌポレヌト郚門の担圓者が通知内容を確認しお、埓業員が居るカりンタヌに行き、察応ずいう流れになりたす。 画面むメヌゞ 利甚方法は、自身の名前を遞択しおもらい、コヌポレヌト郚門ぞの䟝頌内容を遞択するずいう圢です。 導入埌の効果 呌び鈎アプリの導入によっお、 埓業員がコヌポレヌト郚門からサポヌトを受けたり、物を受け枡ししたいずきは、 自身が郜合の良いタむミングで カりンタヌの呌び鈎アプリに来れば良く、 利䟿性が向䞊した 。 Slack 通知に䟝頌者氏名が衚瀺されるので、 氏名を確認する必芁がなくなった。 コヌポレヌト郚門の担圓者が 䟝頌者の垭を探しお尋ねなくおよくなった。 ずいうように困りごずが改善されたした。 たた、特定のメンバヌが察応するのではなく、呌び出されたタむミングで垭に居る党メンバヌが察応できるような運甚にするこずで、PC/IT 備品や健康保険蚌等の物の受け枡し、PC のトラブル察応等のサポヌト察応が属人的にならず、離垭しおいおも、䌑暇をずっおいおも誰でも察応できる䜓制になりたした。 呌び鈎アプリの構成 呌び鈎アプリの開発にあたっおは 1. 先述の課題を解決するこず 2. コヌポレヌト IT 内でプロゞェクトが耇数動いおいるため、他のプロゞェクトの進捗に圱響がでないように、工数をさほどかけずにクむックに開発できるこず 3. なるべくランニングコストをかけないこず ずいう芁件から、 AppSheet ず Google App Script以降 GAS で実装するこずを決めたした。 機胜怜蚌期間を含めお 1 週間皋床で実装できおいたす。 AppSheet は、Google から提䟛されおいる、ノヌコヌドでアプリケヌション開発ができるツヌルです。 AppSheet は、゚ンゞニアではなく「珟堎で働く人が䜜る」ずいう思想をもずにサヌビスが開始されたした。そのため、プログラミング知識がない人でも、マりス操䜜のみで簡単にアプリケヌションを開発できるようになっおいたす。 サヌビス連携図 UI を AppSheet で、Slack ぞの通知を GAS で実装しおいたす。 画面構成 画面は䟝頌者遞択画面、䟝頌内容䞀芧画面、䟝頌詳现䞀芧画面の画面で構成しおいたす。 呌び鈎アプリの実装 呌び鈎アプリをどのように実装しおいるか解説しおいきたす。 AppSheet の蚭定 AppSheet を利甚したアプリの䜜成方法に぀いおは、Google 公匏の How to create an app や Google で AppSheet を怜玢するずいく぀か䜜成䟋のサむトが衚瀺されたすので、今回の機胜を実装するにあたり重芁な 「䟝頌詳现䞀芧画面から Slack 通知」 蚭定の郚分にフォヌカスしお解説したす。 1. Data の蚭定 Tables ず Slices に぀いお、それぞれ蚭定したす。 Tables では、アプリケヌションの元ずなるデヌタを栌玍する「テヌブル」を䜜成したす。 Slices では、テヌブルから必芁な行ず列のみを衚瀺させたり、条件にあうデヌタのみを衚瀺させたりしお、必芁なデヌタを抜出した「テヌブルの䞀郚分」を䜜成したす。 1-1. Tables の蚭定 今回 Table は以䞋の 5 ぀を甚意したした。 テヌブルは、スプレッドシヌトにテヌブルずなるデヌタを䜜成した埌、AppSheet ず連携したす。連携方法は Connect your data to AppSheet の動画を参考にしおください。 テヌブル名 利甚甚途 Client 䟝頌者遞択画面で遞択されたナヌザヌ名を䞀時的に保存するテヌブル Doorbell 䟝頌内容䞀芧画面に衚瀺するテヌブル DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺するテヌブル CallHistory 呌出履歎を保存するテヌブル UserList 䟝頌者遞択画面に衚瀺するテヌブル 䟝頌詳现䞀芧画面ず呌び出し機胜に関連する、「DoorbellDetails」ず「CallHistory」に぀いお詳しく説明したす。 ・ DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺したい内容を䞀芧で蚘茉したす。 分類 ID 列は Doorbell でも同名の列を䜜成し、そこで蚭定した倀ず合わせおください。たた、察応 ID は分類 ID 内でナニヌクになるように蚭定しおください。 察応説明に関しおは、任意で入力しおいただければ倧䞈倫です。 SlackChannel 列に Slack チャンネルに投皿する甚の Webhook URL を蚭定しおください。 Incoming Webhooks 等を䜿甚するず、 Webhook URL が取埗できたす。 3 行目以降のデヌタは、 2 行目を参考に蚭定しおください。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 1 分類 ID 察応 ID 察応名 察応説明 SlackChannel 2 receipt 1 入瀟にあたっお貞䞎物を受け取りたい 通知先チャンネルの Webhook URL を蚭定 Table での蚭定䟋 分類 ID ず察応 ID を耇合キヌ分類 ID ず察応 ID に「REQUIRE」を蚭定ずしおいたす。 ・ CallHistory 呌出履歎を保存するテヌブルのため、ヘッダヌ以倖の入力は䞍芁です。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 F 列 G 列 1 CH_id CH_分類 ID CH_察応 ID CH_察応名 CH_SlackChannel CH_呌び出し日時 CH_䟝頌者 Table での蚭定䟋 1-2. Slices の蚭定 次に、Slice の蚭定を行いたす。Slice は䟝頌内容ごずに画面衚瀺を切り替えるために「DoorbellDetails」のデヌタを元に䜜成したす。 貞䞎物受け取りに関する Slice の堎合、以䞋のように蚭定したす。 蚭定項目名 蚭定倀 Slice name 貞䞎物受け取り Source table DoorbellDetails Row filter condition [分類 ID]="receipt" 2. App の蚭定 Views に぀いお、それぞれ蚭定したす。 2-1. Views の蚭定 䟝頌詳现䞀芧画面に぀いお詳しく説明したす。 ・䟝頌詳现䞀芧画面 䟝頌内容䞀芧画面から遷移できるように、䟝頌詳现䞀芧画面は䟝頌内容ごずに準備したす。ここでは貞䞎物受け取り画面を䟋ずしお蚭定しおいたす。 蚭定項目名 蚭定倀 View name 貞䞎物受け取り画面 For this data 貞䞎物受け取り View type deck Position ref Primary header _RowNumber Secondary header 察応名 Event Actions(Row Selected) SaveAndMoveToClientFormActions の蚭定埌、蚭定可胜になりたす 3. Actions の蚭定 各ボタンを抌したずきの動䜜を定矩したす。 実際には他にもいく぀か Action を蚭定しおいたすが、Slack 通知に関係する Action は以䞋の 3 ぀です。 Action 名 利甚甚途 MoveToClientForm 䟝頌者遞択画面に遷移する SaveCallHistory CallHistory にデヌタを保存する SaveAndMoveToClientForm CallHistory に保存埌、䟝頌者遞択画面に遷移する ・ MoveToClientForm 䟝頌者遞択画面に遷移する Action です。 蚭定項目名 蚭定倀 Action name MoveToClientForm For a record of this table DoorbellDetails Do this App: go to another view within this app Target ”#view=䟝頌者遞択” ・ SaveCallHistory 「CallHistory」テヌブルにデヌタを保存する Action です。 遞択された氏名に぀いおは「Client」テヌブルからデヌタを取埗しおいたす。 たた、SlackChannel 列の蚘茉がない堎合は、画面に「呌び出し」ボタンを衚瀺させないように蚭定しおいたす。 蚭定項目名 蚭定倀 Action name SaveCallHistory For a record of this table DoorbellDetails Do this Data: add a new row to another table using values from this row Set these columns CH_id = UNIQUEID() CH_分類 ID = [分類 ID] CH_察応 ID = [察応 ID] CH_察応名 = [察応名] CH_SlackChannel = [SlackChannel] CH_呌び出し日次 = TODAY() & ” ” & TIMENOW() CH_䟝頌者 = Client[ご自身の氏名] Display name 呌び出し Only if this condition is true ISNOTBLANK([SlackChannel]) Needs confirmation? True Confirmation Message CONCATENATE(“䟝頌者“,Client[ご自身の氏名],"",“呌び出し内容”,[察応名],"",“担圓者を呌び出したすか”) ・ SaveAndMoveToClientForm 呌出履歎に保存埌、䟝頌者遞択画面に遷移する Action です。この Action を䟝頌詳现䞀芧画面の Event Actions に玐付けたす。 蚭定項目名 蚭定倀 Action name SaveAndMoveToClientForm For a record of this table DoorbellDetails Do this Grouped: execute a sequence of actions Actions SaveCallHistory MoveToClientForm スプレッドシヌト の蚭定 AppSheet からスプレッドシヌトの「CallHistory」シヌトに呌出履歎デヌタが登録行远加されたら、Slack 通知 GAS を実行するように蚭定したす。 GAS の蚘述 先皋テヌブルを䜜成したスプレッドシヌトの拡匵機胜 →Apps Script を開きたす。 App Script 䞊で新しく「.gs」ファむルを䜜成し、「CallHistory」 のシヌトが曎新されたずきだけ、Slack に通知するように GAS を蚘述したす。 function onChange ( e ) { // むベントが"EDIT"の堎合のみ実行。 if ( e . changeType === "EDIT" ) { const ar = e . source . getActiveRange (); const sheet = e . source . getActiveSheet (); // CallHistory シヌトが曎新された堎合のみ Slack に通知する if ( e . source . getSheetName () == "CallHistory" ) { const inquiry = sheet . getRange ( ar . getRow (), 4 ). getValue (); const slackWebHook = sheet . getRange ( ar . getRow (), 5 ). getValue (); const clientName = sheet . getRange ( ar . getRow (), 7 ). getValue (); notifyToSlack ( slackWebHook , "コヌポカりンタヌ呌び鈎" , ":notification_bell:" , // お奜きな Slack の絵文字を蚭定しお䞋さい。 `<!here> ${ clientName } さんが ${ inquiry } で呌び出ししおいたす。` ); } } } function notifyToSlack ( url , username , icon , message ) { const jsonData = { username: username , icon_emoji: icon , text: message , }; const payload = JSON . stringify ( jsonData ); const options = { method: "post" , contentType: "application/json" , payload: payload , }; UrlFetchApp . fetch ( url , options ); } トリガヌの蚭定 スプレッドシヌトに呌出履歎が登録行远加されたら、 onChange() を実行するように蚭定したす。 問題なく動䜜するず、Slack に以䞋のようなメッセヌゞが通知されたす。 実装する䞊で難しかったこず AppSheet でアプリを開発するにあたり、ノヌコヌド開発の制玄でかゆいずころに手が届かず、いく぀か工倫しお実装する必芁がありたした。 1. 氏名の遞択結果を保持したたた、䟝頌内容遞択の結果を「CallHistory」に曞き出すこず AppSheet が耇数の遞択結果を保持できるような仕組みになっおおらず、䟝頌者遞択画面から䟝頌内容䞀芧画面に遷移するず遞択結果が消えるため、䟝頌者遞択結果をデヌタずしおどこかに保持する必芁がありたした。 → 氏名の遞択結果を栌玍する䞀行だけのテヌブル「Client」を䜜成し、「CallHistory」ぞの曞き出し時に「Client」の䞀行目のデヌタを読むように蚭定したした。 2. ボタンの配眮ず衚瀺が倉曎できないこず 基本的にボタンに衚瀺されおいるテキストは倉曎できず、ボタン䜍眮も自由に倉曎できないため画面の最䞊郚か最䞋郚のみ、画面の蚭蚈には苊劎したした。 → テキストに関しおは、Settings → Views → Localization で「Save」を「次ぞ」に倉曎しお察応したした。 ボタン䜍眮に関しおはどうにもならなかったため、なるべく導線がわかりやすいように画面䞊に説明を入れるようにしおいたす。 ノヌコヌドがゆえの制玄はありたすが、AppSheet での開発は簡単か぀迅速にできるため、小芏暡なアプリケヌションであれば、おすすめの環境です。 以䞊、呌び鈎アプリの開発に぀いおお話したした。 ここからは、コヌポレヌト IT に぀いおご玹介しおいきたす。 コヌポレヌト IT に぀いお コヌポレヌトデザむン郚は、 「未来志向で瀟内の IT むンフラを含めたオフィス環境をデザむンするこず」 をミッションに業務しおおり、珟圚 2 ぀のチヌムがありたす。 䞀぀はワヌクプレむスチヌムで、ペン䞀本からオフィス斜工に関するこずたで、オフィス環境党般を担圓しおいたす。 そしお、もう䞀぀がコヌポレヌト IT チヌムで、党瀟で利甚する SaaS の管理やオフィスのネットワヌクむンフラ、瀟内アプリの開発等、党埓業員が利甚する IT ゜リュヌション党般の䌁画・開発・運甚を担圓しおいたす。 コヌポレヌト IT の圹割 コヌポレヌト IT ずしおのミッションは、**「テクノロゞヌず創意工倫で埓業員のパフォヌマンスの最倧化を図るこず」**です。 そのために、単に䞊流・䞋流ずいうフェヌズ分担ではなく、システム導入だけでもない、党瀟の組織カルチャヌづくりも芋据えた党埓業員が利甚するコヌポレヌト基盀をデザむンし、そのデザむンに基づいお IT ゜リュヌションを実装、運甚しおいきたす。 逆に、各郚門のミッション達成、業務目的達成のための個別の IT ゜リュヌションは、ツヌルゆえ各郚門が䞻管です。コヌポレヌト IT は IT プロフェッショナルずしおアドバむスしたり、システム蚭蚈や実装する圢で、技術的実珟を担うものずしお各郚門ずコラボしたす。 各郚門の IT ゜リュヌションに察する PDCA を各郚門がオヌナヌシップを持぀こずで、利甚時の芁望や改善に察しお、非垞に早いサむクルで実斜するこずができおいたす。 業務内容玹介 コヌポレヌト IT では、日々の埓業員ぞの IT サポヌト以倖に、耇数のプロゞェクトが同時に走っおいたす。以䞋に蚘茉しおいる業務はほんの䞀䟋です。 端末管理アプリケヌションおよびセキュリティ補品の䌁画/導入/運甹 オフィス移転でのネットワヌク構築ネットワヌクの蚭蚈、機噚遞定〜運甚たで 瀟倖来客甚受付システムの改修/運甹 呌び鈎アプリの䌁画/開発/運甹 埓業員向けの情報セキュリティ研修 人事基幹システムの導入支揎/各システムずの連携機胜構築 etc たた、メンバヌ自ら提案しお䌁画化、予算を確保するこずもあり、アむデアに察しお柔軟に察応しおいたす。 業務を行う䞊で垞に意識しおいるこず・倧事にしおいるこず コヌポレヌト IT ずしお業務を行う䞊で倧事にしおいる考え方が、3 ぀ありたす。埓業員の生産性が向䞊する環境の構築に必芁䞍可欠ず考えおおり、これらをもずに意思決定しおいたす。 1. システム遞定/技術遞定の考え方 システム遞定/技術遞定の原則ずしおは、グロヌバルトップシェアで、か぀、北米急成長䌁業が遞定しおいるものを未来志向で掻甚しおいくこずを意識しおいたすが、その技術やツヌルを導入しお、埗たい本来の目的が達成できるかどうかを、広い芖点から刀断しお意思決定しおいたす。 2. ナヌザヌ IT サポヌトの考え方 老子が蚀っおいる『授人以魚 䞍劂授人以持(人に魚を授けるこずは、持の仕方を教えるに及ばない)』ずいうこずを倧切にしおおり、「わからない」ずいう人に単に答えを「教える」こずをせず、組織の未来のために、組織党䜓の IT リテラシヌを䞊げるこず、スムヌズに自己解決できる環境を敎えるこずに努めおいたす。 「ナヌザヌ IT サポヌトが増え続け、サポヌト人件費が増倧し、高コストな生産性の䜎いコヌポレヌト IT チヌム」ずならないよう心がけおいたす。 3. ルヌルを䜜らず、仕組み/仕掛けで解決する ルヌルを芚えなくおも、意識しなくずも、狙ったこずが自然に進むよう、仕組み/仕掛けによっお目的を成す方法を䜜るこずを意識しおいたす。 䟋えば、高速道路のサヌビス゚リアにある駐車堎の逆走を犁止するために斜めに駐車䜍眮ラむンを匕くずいった、意識せずずも行動を䞀定方向に促す行動蚭蚈が望たしく、呌び鈎アプリもそういった仕掛けやプロセス蚭蚈の䞀環です。 さいごに コヌポレヌト IT は党埓業員が利甚する IT 基盀の維持・改善が求められるため、非垞に重芁な圹割です。たた、急拡倧する組織の䞭においおは、今たでの仕組みが通甚しなくなり、未来志向で新たな仕組みを蚭蚈し続けおいく必芁があり、垞にコヌポレヌト IT チヌムの掻躍の䜙地がたくさん存圚しおいたす。 そのため、未来志向で #革新ず改善を䞻導 できる方を絶賛募集しおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp メドレヌでは、医療分野の瀟䌚課題を IT にお解決するために日々邁進しおおりたす。様々な業皮でスペシャリストを募集しおいたす。興味がある方は是非ご連絡ください。医療ずいう瀟䌚貢献性の高い領域ぞ、䞀緒に挑戊したせんか 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは。コヌポレヌトデザむン郚でコヌポレヌト IT を担圓しおいる枅氎です。 コヌポレヌト IT では党埓業員が利甚するネットワヌクむンフラや SaaS ずいった IT 党般を統括しおおり、瀟内で発生しおいる課題に぀いお IT を駆䜿しお解決しおいたす。 今回は、こうした課題解決の䞀䟋ずしお、「 呌び鈎アプリ 」の開発に぀いお背景ず実装のご玹介をし、最埌に コヌポレヌト IT チヌム の業務内容や理念に぀いおご玹介したいず思いたす。 呌び鈎アプリの開発背景 匊瀟では、チャットツヌルである「 Slack 」ず「 Google Workspace 」や「 TeamSpirit 」等を連携しお、来客者受付システムや 皟議ワヌクフロヌシステム 、オフィス空調最適化システム等、チャットをベヌスにした業務運甚ChatOpsを数倚く行っおいたす。 今回はその䞭でも、サポヌトを受けたい堎合にコヌポレヌト郚門の担圓者を呌び出しできるアプリ、 通称呌び鈎アプリ をご玹介しようず思いたす。 呌び鈎アプリ導入前の困りごず IT 備品や健康保険蚌等の物の受け枡しや PC トラブルぞの察応など、埓業員ぞのサポヌト察応の際、サポヌトを䟝頌した埓業員ずコヌポレヌト郚門ずの間で、以䞋のような困りごずが発生しおいたした。 ■ 埓業員偎の困りごず ・誰に話しかけたらよいかわからない IT 備品や健康保険蚌等を受け取りにコヌポレヌト郚門の座垭に来たが、誰に話しかけたらよいかわからず、りロりロしおいる方が結構いたした。結果、別の郚門に話しかけお、別の郚門の方が正しい郚門に案内するずいう時間も発生しおいたした。 ・時間調敎に手間がかかる PC トラブルぞの察応の際は、コヌポレヌト IT の担圓者が䟝頌者の垭たで行っお䜜業をしおいたため、担圓者ず䟝頌者で時間の調敎が必芁でした。盎前で郜合が悪くなり、リスケが発生するこずもしばしばありたした。 ■ コヌポレヌト郚門の困りごず ・䟝頌者が芋぀けづらい 座垭衚を芋お䟝頌者のずころたで行くが、盎近で座垭倉曎があっお居るず思っおいたずころに居ないこずや、指定の時間に垭に居ないずいったこずが床々発生しおいたした。 ・個人情報が芋えるず困る 埓業員が人事郚から健康保険蚌等の曞類を受け取る際、人事郚の方は個人情報を扱うため、PC 画面の芋える䜍眮たで来られるず困るずいう事情があり、特定の䜍眮で埅っおもらいたいずいうニヌズがありたした。 ・埓業員の氏名確認に手間がかかる 党埓業員分の氏名は把握できないため、コヌポレヌト郚門に来た埓業員本人に名前を聞いお確認し、䞀旊垭に戻っお、貞䞎する IT 備品や健康保険蚌等を探しお枡すずいう、垭を行ったり来たりする状況でした。 ・呚りの業務状況に配慮が必芁 䟝頌者の垭で PC トラブル察応をするず、呚りの人が業務に集䞭しおいたり、顧客ず電話しおいたりするため、業務に支障がでないようになるべく小声で話す必芁がありたした。 ・䟝頌者ぞの察応が属人化しがち コヌポレヌト郚門の担圓者ず䟝頌者の間で䜜業の時間を調敎しおいたしたが、担圓者が急な打ち合わせやお䌑みで䞍圚になっおしたったずきは、他の担圓者ぞの匕き継ぎ察応が挏れおしたうこずがありたした。 䞊蚘の課題を解決するために、 埓業員の方向けにコヌポレヌト郚門の担圓者を呌び出すアプリ を䜜りたした どういったアプリか 呌び鈎アプリは、埓業員ずコヌポレヌト郚門で察面での䜜業/受け枡しが発生するこずPC トラブルぞの察応/萜ずし物の受け枡し/健康保険蚌のお枡し等に関しお、iPad で䟝頌内容に応じた コヌポレヌト郚門の担圓者を呌び出すこずができるアプリ です。 コヌポレヌト郚門の近くのカりンタヌの䞊に iPad が眮いおあり、そこから呌び出しおもらいたす。 ちなみに、カりンタヌはこんな感じのスペヌスで、埓業員の方がセルフサヌビスで IT 備品亀換を行えるブヌスもありたす。 アプリの利甚むメヌゞ たず、埓業員はカりンタヌたで行き、iPad の呌び鈎アプリから呌び出し䟝頌を行いたす。 呌び出し䟝頌は専甚の Slack チャンネルに通知が来るので、各コヌポレヌト郚門の担圓者が通知内容を確認しお、埓業員が居るカりンタヌに行き、察応ずいう流れになりたす。 画面むメヌゞ 利甚方法は、自身の名前を遞択しおもらい、コヌポレヌト郚門ぞの䟝頌内容を遞択するずいう圢です。 導入埌の効果 呌び鈎アプリの導入によっお、 埓業員がコヌポレヌト郚門からサポヌトを受けたり、物を受け枡ししたいずきは、 自身が郜合の良いタむミングで カりンタヌの呌び鈎アプリに来れば良く、 利䟿性が向䞊した 。 Slack 通知に䟝頌者氏名が衚瀺されるので、 氏名を確認する必芁がなくなった。 コヌポレヌト郚門の担圓者が 䟝頌者の垭を探しお尋ねなくおよくなった。 ずいうように困りごずが改善されたした。 たた、特定のメンバヌが察応するのではなく、呌び出されたタむミングで垭に居る党メンバヌが察応できるような運甚にするこずで、PC/IT 備品や健康保険蚌等の物の受け枡し、PC のトラブル察応等のサポヌト察応が属人的にならず、離垭しおいおも、䌑暇をずっおいおも誰でも察応できる䜓制になりたした。 呌び鈎アプリの構成 呌び鈎アプリの開発にあたっおは 1. 先述の課題を解決するこず 2. コヌポレヌト IT 内でプロゞェクトが耇数動いおいるため、他のプロゞェクトの進捗に圱響がでないように、工数をさほどかけずにクむックに開発できるこず 3. なるべくランニングコストをかけないこず ずいう芁件から、 AppSheet ず Google App Script以降 GAS で実装するこずを決めたした。 機胜怜蚌期間を含めお 1 週間皋床で実装できおいたす。 AppSheet は、Google から提䟛されおいる、ノヌコヌドでアプリケヌション開発ができるツヌルです。 AppSheet は、゚ンゞニアではなく「珟堎で働く人が䜜る」ずいう思想をもずにサヌビスが開始されたした。そのため、プログラミング知識がない人でも、マりス操䜜のみで簡単にアプリケヌションを開発できるようになっおいたす。 サヌビス連携図 UI を AppSheet で、Slack ぞの通知を GAS で実装しおいたす。 画面構成 画面は䟝頌者遞択画面、䟝頌内容䞀芧画面、䟝頌詳现䞀芧画面の画面で構成しおいたす。 呌び鈎アプリの実装 呌び鈎アプリをどのように実装しおいるか解説しおいきたす。 AppSheet の蚭定 AppSheet を利甚したアプリの䜜成方法に぀いおは、Google 公匏の How to create an app や Google で AppSheet を怜玢するずいく぀か䜜成䟋のサむトが衚瀺されたすので、今回の機胜を実装するにあたり重芁な 「䟝頌詳现䞀芧画面から Slack 通知」 蚭定の郚分にフォヌカスしお解説したす。 1. Data の蚭定 Tables ず Slices に぀いお、それぞれ蚭定したす。 Tables では、アプリケヌションの元ずなるデヌタを栌玍する「テヌブル」を䜜成したす。 Slices では、テヌブルから必芁な行ず列のみを衚瀺させたり、条件にあうデヌタのみを衚瀺させたりしお、必芁なデヌタを抜出した「テヌブルの䞀郚分」を䜜成したす。 1-1. Tables の蚭定 今回 Table は以䞋の 5 ぀を甚意したした。 テヌブルは、スプレッドシヌトにテヌブルずなるデヌタを䜜成した埌、AppSheet ず連携したす。連携方法は Connect your data to AppSheet の動画を参考にしおください。 テヌブル名 利甚甚途 Client 䟝頌者遞択画面で遞択されたナヌザヌ名を䞀時的に保存するテヌブル Doorbell 䟝頌内容䞀芧画面に衚瀺するテヌブル DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺するテヌブル CallHistory 呌出履歎を保存するテヌブル UserList 䟝頌者遞択画面に衚瀺するテヌブル 䟝頌詳现䞀芧画面ず呌び出し機胜に関連する、「DoorbellDetails」ず「CallHistory」に぀いお詳しく説明したす。 ・ DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺したい内容を䞀芧で蚘茉したす。 分類 ID 列は Doorbell でも同名の列を䜜成し、そこで蚭定した倀ず合わせおください。たた、察応 ID は分類 ID 内でナニヌクになるように蚭定しおください。 察応説明に関しおは、任意で入力しおいただければ倧䞈倫です。 SlackChannel 列に Slack チャンネルに投皿する甚の Webhook URL を蚭定しおください。 Incoming Webhooks 等を䜿甚するず、 Webhook URL が取埗できたす。 3 行目以降のデヌタは、 2 行目を参考に蚭定しおください。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 1 分類 ID 察応 ID 察応名 察応説明 SlackChannel 2 receipt 1 入瀟にあたっお貞䞎物を受け取りたい 通知先チャンネルの Webhook URL を蚭定 Table での蚭定䟋 分類 ID ず察応 ID を耇合キヌ分類 ID ず察応 ID に「REQUIRE」を蚭定ずしおいたす。 ・ CallHistory 呌出履歎を保存するテヌブルのため、ヘッダヌ以倖の入力は䞍芁です。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 F 列 G 列 1 CH_id CH_分類 ID CH_察応 ID CH_察応名 CH_SlackChannel CH_呌び出し日時 CH_䟝頌者 Table での蚭定䟋 1-2. Slices の蚭定 次に、Slice の蚭定を行いたす。Slice は䟝頌内容ごずに画面衚瀺を切り替えるために「DoorbellDetails」のデヌタを元に䜜成したす。 貞䞎物受け取りに関する Slice の堎合、以䞋のように蚭定したす。 蚭定項目名 蚭定倀 Slice name 貞䞎物受け取り Source table DoorbellDetails Row filter condition [分類 ID]="receipt" 2. App の蚭定 Views に぀いお、それぞれ蚭定したす。 2-1. Views の蚭定 䟝頌詳现䞀芧画面に぀いお詳しく説明したす。 ・䟝頌詳现䞀芧画面 䟝頌内容䞀芧画面から遷移できるように、䟝頌詳现䞀芧画面は䟝頌内容ごずに準備したす。ここでは貞䞎物受け取り画面を䟋ずしお蚭定しおいたす。 蚭定項目名 蚭定倀 View name 貞䞎物受け取り画面 For this data 貞䞎物受け取り View type deck Position ref Primary header _RowNumber Secondary header 察応名 Event Actions(Row Selected) SaveAndMoveToClientFormActions の蚭定埌、蚭定可胜になりたす 3. Actions の蚭定 各ボタンを抌したずきの動䜜を定矩したす。 実際には他にもいく぀か Action を蚭定しおいたすが、Slack 通知に関係する Action は以䞋の 3 ぀です。 Action 名 利甚甚途 MoveToClientForm 䟝頌者遞択画面に遷移する SaveCallHistory CallHistory にデヌタを保存する SaveAndMoveToClientForm CallHistory に保存埌、䟝頌者遞択画面に遷移する ・ MoveToClientForm 䟝頌者遞択画面に遷移する Action です。 蚭定項目名 蚭定倀 Action name MoveToClientForm For a record of this table DoorbellDetails Do this App: go to another view within this app Target ”#view=䟝頌者遞択” ・ SaveCallHistory 「CallHistory」テヌブルにデヌタを保存する Action です。 遞択された氏名に぀いおは「Client」テヌブルからデヌタを取埗しおいたす。 たた、SlackChannel 列の蚘茉がない堎合は、画面に「呌び出し」ボタンを衚瀺させないように蚭定しおいたす。 蚭定項目名 蚭定倀 Action name SaveCallHistory For a record of this table DoorbellDetails Do this Data: add a new row to another table using values from this row Set these columns CH_id = UNIQUEID() CH_分類 ID = [分類 ID] CH_察応 ID = [察応 ID] CH_察応名 = [察応名] CH_SlackChannel = [SlackChannel] CH_呌び出し日次 = TODAY() & ” ” & TIMENOW() CH_䟝頌者 = Client[ご自身の氏名] Display name 呌び出し Only if this condition is true ISNOTBLANK([SlackChannel]) Needs confirmation? True Confirmation Message CONCATENATE(“䟝頌者“,Client[ご自身の氏名],"",“呌び出し内容”,[察応名],"",“担圓者を呌び出したすか”) ・ SaveAndMoveToClientForm 呌出履歎に保存埌、䟝頌者遞択画面に遷移する Action です。この Action を䟝頌詳现䞀芧画面の Event Actions に玐付けたす。 蚭定項目名 蚭定倀 Action name SaveAndMoveToClientForm For a record of this table DoorbellDetails Do this Grouped: execute a sequence of actions Actions SaveCallHistory MoveToClientForm スプレッドシヌト の蚭定 AppSheet からスプレッドシヌトの「CallHistory」シヌトに呌出履歎デヌタが登録行远加されたら、Slack 通知 GAS を実行するように蚭定したす。 GAS の蚘述 先皋テヌブルを䜜成したスプレッドシヌトの拡匵機胜 →Apps Script を開きたす。 App Script 䞊で新しく「.gs」ファむルを䜜成し、「CallHistory」 のシヌトが曎新されたずきだけ、Slack に通知するように GAS を蚘述したす。 function onChange ( e ) { // むベントが"EDIT"の堎合のみ実行。 if ( e . changeType === "EDIT" ) { const ar = e . source . getActiveRange (); const sheet = e . source . getActiveSheet (); // CallHistory シヌトが曎新された堎合のみ Slack に通知する if ( e . source . getSheetName () == "CallHistory" ) { const inquiry = sheet . getRange ( ar . getRow (), 4 ). getValue (); const slackWebHook = sheet . getRange ( ar . getRow (), 5 ). getValue (); const clientName = sheet . getRange ( ar . getRow (), 7 ). getValue (); notifyToSlack ( slackWebHook , "コヌポカりンタヌ呌び鈎" , ":notification_bell:" , // お奜きな Slack の絵文字を蚭定しお䞋さい。 `<!here> ${ clientName } さんが ${ inquiry } で呌び出ししおいたす。` ); } } } function notifyToSlack ( url , username , icon , message ) { const jsonData = { username: username , icon_emoji: icon , text: message , }; const payload = JSON . stringify ( jsonData ); const options = { method: "post" , contentType: "application/json" , payload: payload , }; UrlFetchApp . fetch ( url , options ); } トリガヌの蚭定 スプレッドシヌトに呌出履歎が登録行远加されたら、 onChange() を実行するように蚭定したす。 問題なく動䜜するず、Slack に以䞋のようなメッセヌゞが通知されたす。 実装する䞊で難しかったこず AppSheet でアプリを開発するにあたり、ノヌコヌド開発の制玄でかゆいずころに手が届かず、いく぀か工倫しお実装する必芁がありたした。 1. 氏名の遞択結果を保持したたた、䟝頌内容遞択の結果を「CallHistory」に曞き出すこず AppSheet が耇数の遞択結果を保持できるような仕組みになっおおらず、䟝頌者遞択画面から䟝頌内容䞀芧画面に遷移するず遞択結果が消えるため、䟝頌者遞択結果をデヌタずしおどこかに保持する必芁がありたした。 → 氏名の遞択結果を栌玍する䞀行だけのテヌブル「Client」を䜜成し、「CallHistory」ぞの曞き出し時に「Client」の䞀行目のデヌタを読むように蚭定したした。 2. ボタンの配眮ず衚瀺が倉曎できないこず 基本的にボタンに衚瀺されおいるテキストは倉曎できず、ボタン䜍眮も自由に倉曎できないため画面の最䞊郚か最䞋郚のみ、画面の蚭蚈には苊劎したした。 → テキストに関しおは、Settings → Views → Localization で「Save」を「次ぞ」に倉曎しお察応したした。 ボタン䜍眮に関しおはどうにもならなかったため、なるべく導線がわかりやすいように画面䞊に説明を入れるようにしおいたす。 ノヌコヌドがゆえの制玄はありたすが、AppSheet での開発は簡単か぀迅速にできるため、小芏暡なアプリケヌションであれば、おすすめの環境です。 以䞊、呌び鈎アプリの開発に぀いおお話したした。 ここからは、コヌポレヌト IT に぀いおご玹介しおいきたす。 コヌポレヌト IT に぀いお コヌポレヌトデザむン郚は、 「未来志向で瀟内の IT むンフラを含めたオフィス環境をデザむンするこず」 をミッションに業務しおおり、珟圚 2 ぀のチヌムがありたす。 䞀぀はワヌクプレむスチヌムで、ペン䞀本からオフィス斜工に関するこずたで、オフィス環境党般を担圓しおいたす。 そしお、もう䞀぀がコヌポレヌト IT チヌムで、党瀟で利甚する SaaS の管理やオフィスのネットワヌクむンフラ、瀟内アプリの開発等、党埓業員が利甚する IT ゜リュヌション党般の䌁画・開発・運甚を担圓しおいたす。 コヌポレヌト IT の圹割 コヌポレヌト IT ずしおのミッションは、**「テクノロゞヌず創意工倫で埓業員のパフォヌマンスの最倧化を図るこず」**です。 そのために、単に䞊流・䞋流ずいうフェヌズ分担ではなく、システム導入だけでもない、党瀟の組織カルチャヌづくりも芋据えた党埓業員が利甚するコヌポレヌト基盀をデザむンし、そのデザむンに基づいお IT ゜リュヌションを実装、運甚しおいきたす。 逆に、各郚門のミッション達成、業務目的達成のための個別の IT ゜リュヌションは、ツヌルゆえ各郚門が䞻管です。コヌポレヌト IT は IT プロフェッショナルずしおアドバむスしたり、システム蚭蚈や実装する圢で、技術的実珟を担うものずしお各郚門ずコラボしたす。 各郚門の IT ゜リュヌションに察する PDCA を各郚門がオヌナヌシップを持぀こずで、利甚時の芁望や改善に察しお、非垞に早いサむクルで実斜するこずができおいたす。 業務内容玹介 コヌポレヌト IT では、日々の埓業員ぞの IT サポヌト以倖に、耇数のプロゞェクトが同時に走っおいたす。以䞋に蚘茉しおいる業務はほんの䞀䟋です。 端末管理アプリケヌションおよびセキュリティ補品の䌁画/導入/運甹 オフィス移転でのネットワヌク構築ネットワヌクの蚭蚈、機噚遞定〜運甚たで 瀟倖来客甚受付システムの改修/運甹 呌び鈎アプリの䌁画/開発/運甹 埓業員向けの情報セキュリティ研修 人事基幹システムの導入支揎/各システムずの連携機胜構築 etc たた、メンバヌ自ら提案しお䌁画化、予算を確保するこずもあり、アむデアに察しお柔軟に察応しおいたす。 業務を行う䞊で垞に意識しおいるこず・倧事にしおいるこず コヌポレヌト IT ずしお業務を行う䞊で倧事にしおいる考え方が、3 ぀ありたす。埓業員の生産性が向䞊する環境の構築に必芁䞍可欠ず考えおおり、これらをもずに意思決定しおいたす。 1. システム遞定/技術遞定の考え方 システム遞定/技術遞定の原則ずしおは、グロヌバルトップシェアで、か぀、北米急成長䌁業が遞定しおいるものを未来志向で掻甚しおいくこずを意識しおいたすが、その技術やツヌルを導入しお、埗たい本来の目的が達成できるかどうかを、広い芖点から刀断しお意思決定しおいたす。 2. ナヌザヌ IT サポヌトの考え方 老子が蚀っおいる『授人以魚 䞍劂授人以持(人に魚を授けるこずは、持の仕方を教えるに及ばない)』ずいうこずを倧切にしおおり、「わからない」ずいう人に単に答えを「教える」こずをせず、組織の未来のために、組織党䜓の IT リテラシヌを䞊げるこず、スムヌズに自己解決できる環境を敎えるこずに努めおいたす。 「ナヌザヌ IT サポヌトが増え続け、サポヌト人件費が増倧し、高コストな生産性の䜎いコヌポレヌト IT チヌム」ずならないよう心がけおいたす。 3. ルヌルを䜜らず、仕組み/仕掛けで解決する ルヌルを芚えなくおも、意識しなくずも、狙ったこずが自然に進むよう、仕組み/仕掛けによっお目的を成す方法を䜜るこずを意識しおいたす。 䟋えば、高速道路のサヌビス゚リアにある駐車堎の逆走を犁止するために斜めに駐車䜍眮ラむンを匕くずいった、意識せずずも行動を䞀定方向に促す行動蚭蚈が望たしく、呌び鈎アプリもそういった仕掛けやプロセス蚭蚈の䞀環です。 さいごに コヌポレヌト IT は党埓業員が利甚する IT 基盀の維持・改善が求められるため、非垞に重芁な圹割です。たた、急拡倧する組織の䞭においおは、今たでの仕組みが通甚しなくなり、未来志向で新たな仕組みを蚭蚈し続けおいく必芁があり、垞にコヌポレヌト IT チヌムの掻躍の䜙地がたくさん存圚しおいたす。 そのため、未来志向で #革新ず改善を䞻導 できる方を絶賛募集しおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp メドレヌでは、医療分野の瀟䌚課題を IT にお解決するために日々邁進しおおりたす。様々な業皮でスペシャリストを募集しおいたす。興味がある方は是非ご連絡ください。医療ずいう瀟䌚貢献性の高い領域ぞ、䞀緒に挑戊したせんか 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは。コヌポレヌトデザむン郚でコヌポレヌト IT を担圓しおいる枅氎です。 コヌポレヌト IT では党埓業員が利甚するネットワヌクむンフラや SaaS ずいった IT 党般を統括しおおり、瀟内で発生しおいる課題に぀いお IT を駆䜿しお解決しおいたす。 今回は、こうした課題解決の䞀䟋ずしお、「 呌び鈎アプリ 」の開発に぀いお背景ず実装のご玹介をし、最埌に コヌポレヌト IT チヌム の業務内容や理念に぀いおご玹介したいず思いたす。 呌び鈎アプリの開発背景 匊瀟では、チャットツヌルである「 Slack 」ず「 Google Workspace 」や「 TeamSpirit 」等を連携しお、来客者受付システムや 皟議ワヌクフロヌシステム 、オフィス空調最適化システム等、チャットをベヌスにした業務運甚ChatOpsを数倚く行っおいたす。 今回はその䞭でも、サポヌトを受けたい堎合にコヌポレヌト郚門の担圓者を呌び出しできるアプリ、 通称呌び鈎アプリ をご玹介しようず思いたす。 呌び鈎アプリ導入前の困りごず IT 備品や健康保険蚌等の物の受け枡しや PC トラブルぞの察応など、埓業員ぞのサポヌト察応の際、サポヌトを䟝頌した埓業員ずコヌポレヌト郚門ずの間で、以䞋のような困りごずが発生しおいたした。 ■ 埓業員偎の困りごず ・誰に話しかけたらよいかわからない IT 備品や健康保険蚌等を受け取りにコヌポレヌト郚門の座垭に来たが、誰に話しかけたらよいかわからず、りロりロしおいる方が結構いたした。結果、別の郚門に話しかけお、別の郚門の方が正しい郚門に案内するずいう時間も発生しおいたした。 ・時間調敎に手間がかかる PC トラブルぞの察応の際は、コヌポレヌト IT の担圓者が䟝頌者の垭たで行っお䜜業をしおいたため、担圓者ず䟝頌者で時間の調敎が必芁でした。盎前で郜合が悪くなり、リスケが発生するこずもしばしばありたした。 ■ コヌポレヌト郚門の困りごず ・䟝頌者が芋぀けづらい 座垭衚を芋お䟝頌者のずころたで行くが、盎近で座垭倉曎があっお居るず思っおいたずころに居ないこずや、指定の時間に垭に居ないずいったこずが床々発生しおいたした。 ・個人情報が芋えるず困る 埓業員が人事郚から健康保険蚌等の曞類を受け取る際、人事郚の方は個人情報を扱うため、PC 画面の芋える䜍眮たで来られるず困るずいう事情があり、特定の䜍眮で埅っおもらいたいずいうニヌズがありたした。 ・埓業員の氏名確認に手間がかかる 党埓業員分の氏名は把握できないため、コヌポレヌト郚門に来た埓業員本人に名前を聞いお確認し、䞀旊垭に戻っお、貞䞎する IT 備品や健康保険蚌等を探しお枡すずいう、垭を行ったり来たりする状況でした。 ・呚りの業務状況に配慮が必芁 䟝頌者の垭で PC トラブル察応をするず、呚りの人が業務に集䞭しおいたり、顧客ず電話しおいたりするため、業務に支障がでないようになるべく小声で話す必芁がありたした。 ・䟝頌者ぞの察応が属人化しがち コヌポレヌト郚門の担圓者ず䟝頌者の間で䜜業の時間を調敎しおいたしたが、担圓者が急な打ち合わせやお䌑みで䞍圚になっおしたったずきは、他の担圓者ぞの匕き継ぎ察応が挏れおしたうこずがありたした。 䞊蚘の課題を解決するために、 埓業員の方向けにコヌポレヌト郚門の担圓者を呌び出すアプリ を䜜りたした どういったアプリか 呌び鈎アプリは、埓業員ずコヌポレヌト郚門で察面での䜜業/受け枡しが発生するこずPC トラブルぞの察応/萜ずし物の受け枡し/健康保険蚌のお枡し等に関しお、iPad で䟝頌内容に応じた コヌポレヌト郚門の担圓者を呌び出すこずができるアプリ です。 コヌポレヌト郚門の近くのカりンタヌの䞊に iPad が眮いおあり、そこから呌び出しおもらいたす。 ちなみに、カりンタヌはこんな感じのスペヌスで、埓業員の方がセルフサヌビスで IT 備品亀換を行えるブヌスもありたす。 アプリの利甚むメヌゞ たず、埓業員はカりンタヌたで行き、iPad の呌び鈎アプリから呌び出し䟝頌を行いたす。 呌び出し䟝頌は専甚の Slack チャンネルに通知が来るので、各コヌポレヌト郚門の担圓者が通知内容を確認しお、埓業員が居るカりンタヌに行き、察応ずいう流れになりたす。 画面むメヌゞ 利甚方法は、自身の名前を遞択しおもらい、コヌポレヌト郚門ぞの䟝頌内容を遞択するずいう圢です。 導入埌の効果 呌び鈎アプリの導入によっお、 埓業員がコヌポレヌト郚門からサポヌトを受けたり、物を受け枡ししたいずきは、 自身が郜合の良いタむミングで カりンタヌの呌び鈎アプリに来れば良く、 利䟿性が向䞊した 。 Slack 通知に䟝頌者氏名が衚瀺されるので、 氏名を確認する必芁がなくなった。 コヌポレヌト郚門の担圓者が 䟝頌者の垭を探しお尋ねなくおよくなった。 ずいうように困りごずが改善されたした。 たた、特定のメンバヌが察応するのではなく、呌び出されたタむミングで垭に居る党メンバヌが察応できるような運甚にするこずで、PC/IT 備品や健康保険蚌等の物の受け枡し、PC のトラブル察応等のサポヌト察応が属人的にならず、離垭しおいおも、䌑暇をずっおいおも誰でも察応できる䜓制になりたした。 呌び鈎アプリの構成 呌び鈎アプリの開発にあたっおは 1. 先述の課題を解決するこず 2. コヌポレヌト IT 内でプロゞェクトが耇数動いおいるため、他のプロゞェクトの進捗に圱響がでないように、工数をさほどかけずにクむックに開発できるこず 3. なるべくランニングコストをかけないこず ずいう芁件から、 AppSheet ず Google App Script以降 GAS で実装するこずを決めたした。 機胜怜蚌期間を含めお 1 週間皋床で実装できおいたす。 AppSheet は、Google から提䟛されおいる、ノヌコヌドでアプリケヌション開発ができるツヌルです。 AppSheet は、゚ンゞニアではなく「珟堎で働く人が䜜る」ずいう思想をもずにサヌビスが開始されたした。そのため、プログラミング知識がない人でも、マりス操䜜のみで簡単にアプリケヌションを開発できるようになっおいたす。 サヌビス連携図 UI を AppSheet で、Slack ぞの通知を GAS で実装しおいたす。 画面構成 画面は䟝頌者遞択画面、䟝頌内容䞀芧画面、䟝頌詳现䞀芧画面の画面で構成しおいたす。 呌び鈎アプリの実装 呌び鈎アプリをどのように実装しおいるか解説しおいきたす。 AppSheet の蚭定 AppSheet を利甚したアプリの䜜成方法に぀いおは、Google 公匏の How to create an app や Google で AppSheet を怜玢するずいく぀か䜜成䟋のサむトが衚瀺されたすので、今回の機胜を実装するにあたり重芁な 「䟝頌詳现䞀芧画面から Slack 通知」 蚭定の郚分にフォヌカスしお解説したす。 1. Data の蚭定 Tables ず Slices に぀いお、それぞれ蚭定したす。 Tables では、アプリケヌションの元ずなるデヌタを栌玍する「テヌブル」を䜜成したす。 Slices では、テヌブルから必芁な行ず列のみを衚瀺させたり、条件にあうデヌタのみを衚瀺させたりしお、必芁なデヌタを抜出した「テヌブルの䞀郚分」を䜜成したす。 1-1. Tables の蚭定 今回 Table は以䞋の 5 ぀を甚意したした。 テヌブルは、スプレッドシヌトにテヌブルずなるデヌタを䜜成した埌、AppSheet ず連携したす。連携方法は Connect your data to AppSheet の動画を参考にしおください。 テヌブル名 利甚甚途 Client 䟝頌者遞択画面で遞択されたナヌザヌ名を䞀時的に保存するテヌブル Doorbell 䟝頌内容䞀芧画面に衚瀺するテヌブル DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺するテヌブル CallHistory 呌出履歎を保存するテヌブル UserList 䟝頌者遞択画面に衚瀺するテヌブル 䟝頌詳现䞀芧画面ず呌び出し機胜に関連する、「DoorbellDetails」ず「CallHistory」に぀いお詳しく説明したす。 ・ DoorbellDetails 䟝頌詳现䞀芧画面に衚瀺したい内容を䞀芧で蚘茉したす。 分類 ID 列は Doorbell でも同名の列を䜜成し、そこで蚭定した倀ず合わせおください。たた、察応 ID は分類 ID 内でナニヌクになるように蚭定しおください。 察応説明に関しおは、任意で入力しおいただければ倧䞈倫です。 SlackChannel 列に Slack チャンネルに投皿する甚の Webhook URL を蚭定しおください。 Incoming Webhooks 等を䜿甚するず、 Webhook URL が取埗できたす。 3 行目以降のデヌタは、 2 行目を参考に蚭定しおください。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 1 分類 ID 察応 ID 察応名 察応説明 SlackChannel 2 receipt 1 入瀟にあたっお貞䞎物を受け取りたい 通知先チャンネルの Webhook URL を蚭定 Table での蚭定䟋 分類 ID ず察応 ID を耇合キヌ分類 ID ず察応 ID に「REQUIRE」を蚭定ずしおいたす。 ・ CallHistory 呌出履歎を保存するテヌブルのため、ヘッダヌ以倖の入力は䞍芁です。 スプレッドシヌトぞのデヌタ入力䟋 行番号 A 列 B 列 C 列 D 列 E 列 F 列 G 列 1 CH_id CH_分類 ID CH_察応 ID CH_察応名 CH_SlackChannel CH_呌び出し日時 CH_䟝頌者 Table での蚭定䟋 1-2. Slices の蚭定 次に、Slice の蚭定を行いたす。Slice は䟝頌内容ごずに画面衚瀺を切り替えるために「DoorbellDetails」のデヌタを元に䜜成したす。 貞䞎物受け取りに関する Slice の堎合、以䞋のように蚭定したす。 蚭定項目名 蚭定倀 Slice name 貞䞎物受け取り Source table DoorbellDetails Row filter condition [分類 ID]="receipt" 2. App の蚭定 Views に぀いお、それぞれ蚭定したす。 2-1. Views の蚭定 䟝頌詳现䞀芧画面に぀いお詳しく説明したす。 ・䟝頌詳现䞀芧画面 䟝頌内容䞀芧画面から遷移できるように、䟝頌詳现䞀芧画面は䟝頌内容ごずに準備したす。ここでは貞䞎物受け取り画面を䟋ずしお蚭定しおいたす。 蚭定項目名 蚭定倀 View name 貞䞎物受け取り画面 For this data 貞䞎物受け取り View type deck Position ref Primary header _RowNumber Secondary header 察応名 Event Actions(Row Selected) SaveAndMoveToClientFormActions の蚭定埌、蚭定可胜になりたす 3. Actions の蚭定 各ボタンを抌したずきの動䜜を定矩したす。 実際には他にもいく぀か Action を蚭定しおいたすが、Slack 通知に関係する Action は以䞋の 3 ぀です。 Action 名 利甚甚途 MoveToClientForm 䟝頌者遞択画面に遷移する SaveCallHistory CallHistory にデヌタを保存する SaveAndMoveToClientForm CallHistory に保存埌、䟝頌者遞択画面に遷移する ・ MoveToClientForm 䟝頌者遞択画面に遷移する Action です。 蚭定項目名 蚭定倀 Action name MoveToClientForm For a record of this table DoorbellDetails Do this App: go to another view within this app Target ”#view=䟝頌者遞択” ・ SaveCallHistory 「CallHistory」テヌブルにデヌタを保存する Action です。 遞択された氏名に぀いおは「Client」テヌブルからデヌタを取埗しおいたす。 たた、SlackChannel 列の蚘茉がない堎合は、画面に「呌び出し」ボタンを衚瀺させないように蚭定しおいたす。 蚭定項目名 蚭定倀 Action name SaveCallHistory For a record of this table DoorbellDetails Do this Data: add a new row to another table using values from this row Set these columns CH_id = UNIQUEID() CH_分類 ID = [分類 ID] CH_察応 ID = [察応 ID] CH_察応名 = [察応名] CH_SlackChannel = [SlackChannel] CH_呌び出し日次 = TODAY() & ” ” & TIMENOW() CH_䟝頌者 = Client[ご自身の氏名] Display name 呌び出し Only if this condition is true ISNOTBLANK([SlackChannel]) Needs confirmation? True Confirmation Message CONCATENATE(“䟝頌者“,Client[ご自身の氏名],"",“呌び出し内容”,[察応名],"",“担圓者を呌び出したすか”) ・ SaveAndMoveToClientForm 呌出履歎に保存埌、䟝頌者遞択画面に遷移する Action です。この Action を䟝頌詳现䞀芧画面の Event Actions に玐付けたす。 蚭定項目名 蚭定倀 Action name SaveAndMoveToClientForm For a record of this table DoorbellDetails Do this Grouped: execute a sequence of actions Actions SaveCallHistory MoveToClientForm スプレッドシヌト の蚭定 AppSheet からスプレッドシヌトの「CallHistory」シヌトに呌出履歎デヌタが登録行远加されたら、Slack 通知 GAS を実行するように蚭定したす。 GAS の蚘述 先皋テヌブルを䜜成したスプレッドシヌトの拡匵機胜 →Apps Script を開きたす。 App Script 䞊で新しく「.gs」ファむルを䜜成し、「CallHistory」 のシヌトが曎新されたずきだけ、Slack に通知するように GAS を蚘述したす。 function onChange ( e ) { // むベントが"EDIT"の堎合のみ実行。 if ( e . changeType === "EDIT" ) { const ar = e . source . getActiveRange (); const sheet = e . source . getActiveSheet (); // CallHistory シヌトが曎新された堎合のみ Slack に通知する if ( e . source . getSheetName () == "CallHistory" ) { const inquiry = sheet . getRange ( ar . getRow (), 4 ). getValue (); const slackWebHook = sheet . getRange ( ar . getRow (), 5 ). getValue (); const clientName = sheet . getRange ( ar . getRow (), 7 ). getValue (); notifyToSlack ( slackWebHook , "コヌポカりンタヌ呌び鈎" , ":notification_bell:" , // お奜きな Slack の絵文字を蚭定しお䞋さい。 `<!here> ${ clientName } さんが ${ inquiry } で呌び出ししおいたす。` ); } } } function notifyToSlack ( url , username , icon , message ) { const jsonData = { username: username , icon_emoji: icon , text: message , }; const payload = JSON . stringify ( jsonData ); const options = { method: "post" , contentType: "application/json" , payload: payload , }; UrlFetchApp . fetch ( url , options ); } トリガヌの蚭定 スプレッドシヌトに呌出履歎が登録行远加されたら、 onChange() を実行するように蚭定したす。 問題なく動䜜するず、Slack に以䞋のようなメッセヌゞが通知されたす。 実装する䞊で難しかったこず AppSheet でアプリを開発するにあたり、ノヌコヌド開発の制玄でかゆいずころに手が届かず、いく぀か工倫しお実装する必芁がありたした。 1. 氏名の遞択結果を保持したたた、䟝頌内容遞択の結果を「CallHistory」に曞き出すこず AppSheet が耇数の遞択結果を保持できるような仕組みになっおおらず、䟝頌者遞択画面から䟝頌内容䞀芧画面に遷移するず遞択結果が消えるため、䟝頌者遞択結果をデヌタずしおどこかに保持する必芁がありたした。 → 氏名の遞択結果を栌玍する䞀行だけのテヌブル「Client」を䜜成し、「CallHistory」ぞの曞き出し時に「Client」の䞀行目のデヌタを読むように蚭定したした。 2. ボタンの配眮ず衚瀺が倉曎できないこず 基本的にボタンに衚瀺されおいるテキストは倉曎できず、ボタン䜍眮も自由に倉曎できないため画面の最䞊郚か最䞋郚のみ、画面の蚭蚈には苊劎したした。 → テキストに関しおは、Settings → Views → Localization で「Save」を「次ぞ」に倉曎しお察応したした。 ボタン䜍眮に関しおはどうにもならなかったため、なるべく導線がわかりやすいように画面䞊に説明を入れるようにしおいたす。 ノヌコヌドがゆえの制玄はありたすが、AppSheet での開発は簡単か぀迅速にできるため、小芏暡なアプリケヌションであれば、おすすめの環境です。 以䞊、呌び鈎アプリの開発に぀いおお話したした。 ここからは、コヌポレヌト IT に぀いおご玹介しおいきたす。 コヌポレヌト IT に぀いお コヌポレヌトデザむン郚は、 「未来志向で瀟内の IT むンフラを含めたオフィス環境をデザむンするこず」 をミッションに業務しおおり、珟圚 2 ぀のチヌムがありたす。 䞀぀はワヌクプレむスチヌムで、ペン䞀本からオフィス斜工に関するこずたで、オフィス環境党般を担圓しおいたす。 そしお、もう䞀぀がコヌポレヌト IT チヌムで、党瀟で利甚する SaaS の管理やオフィスのネットワヌクむンフラ、瀟内アプリの開発等、党埓業員が利甚する IT ゜リュヌション党般の䌁画・開発・運甚を担圓しおいたす。 コヌポレヌト IT の圹割 コヌポレヌト IT ずしおのミッションは、**「テクノロゞヌず創意工倫で埓業員のパフォヌマンスの最倧化を図るこず」**です。 そのために、単に䞊流・䞋流ずいうフェヌズ分担ではなく、システム導入だけでもない、党瀟の組織カルチャヌづくりも芋据えた党埓業員が利甚するコヌポレヌト基盀をデザむンし、そのデザむンに基づいお IT ゜リュヌションを実装、運甚しおいきたす。 逆に、各郚門のミッション達成、業務目的達成のための個別の IT ゜リュヌションは、ツヌルゆえ各郚門が䞻管です。コヌポレヌト IT は IT プロフェッショナルずしおアドバむスしたり、システム蚭蚈や実装する圢で、技術的実珟を担うものずしお各郚門ずコラボしたす。 各郚門の IT ゜リュヌションに察する PDCA を各郚門がオヌナヌシップを持぀こずで、利甚時の芁望や改善に察しお、非垞に早いサむクルで実斜するこずができおいたす。 業務内容玹介 コヌポレヌト IT では、日々の埓業員ぞの IT サポヌト以倖に、耇数のプロゞェクトが同時に走っおいたす。以䞋に蚘茉しおいる業務はほんの䞀䟋です。 端末管理アプリケヌションおよびセキュリティ補品の䌁画/導入/運甹 オフィス移転でのネットワヌク構築ネットワヌクの蚭蚈、機噚遞定〜運甚たで 瀟倖来客甚受付システムの改修/運甹 呌び鈎アプリの䌁画/開発/運甹 埓業員向けの情報セキュリティ研修 人事基幹システムの導入支揎/各システムずの連携機胜構築 etc たた、メンバヌ自ら提案しお䌁画化、予算を確保するこずもあり、アむデアに察しお柔軟に察応しおいたす。 業務を行う䞊で垞に意識しおいるこず・倧事にしおいるこず コヌポレヌト IT ずしお業務を行う䞊で倧事にしおいる考え方が、3 ぀ありたす。埓業員の生産性が向䞊する環境の構築に必芁䞍可欠ず考えおおり、これらをもずに意思決定しおいたす。 1. システム遞定/技術遞定の考え方 システム遞定/技術遞定の原則ずしおは、グロヌバルトップシェアで、か぀、北米急成長䌁業が遞定しおいるものを未来志向で掻甚しおいくこずを意識しおいたすが、その技術やツヌルを導入しお、埗たい本来の目的が達成できるかどうかを、広い芖点から刀断しお意思決定しおいたす。 2. ナヌザヌ IT サポヌトの考え方 老子が蚀っおいる『授人以魚 䞍劂授人以持(人に魚を授けるこずは、持の仕方を教えるに及ばない)』ずいうこずを倧切にしおおり、「わからない」ずいう人に単に答えを「教える」こずをせず、組織の未来のために、組織党䜓の IT リテラシヌを䞊げるこず、スムヌズに自己解決できる環境を敎えるこずに努めおいたす。 「ナヌザヌ IT サポヌトが増え続け、サポヌト人件費が増倧し、高コストな生産性の䜎いコヌポレヌト IT チヌム」ずならないよう心がけおいたす。 3. ルヌルを䜜らず、仕組み/仕掛けで解決する ルヌルを芚えなくおも、意識しなくずも、狙ったこずが自然に進むよう、仕組み/仕掛けによっお目的を成す方法を䜜るこずを意識しおいたす。 䟋えば、高速道路のサヌビス゚リアにある駐車堎の逆走を犁止するために斜めに駐車䜍眮ラむンを匕くずいった、意識せずずも行動を䞀定方向に促す行動蚭蚈が望たしく、呌び鈎アプリもそういった仕掛けやプロセス蚭蚈の䞀環です。 さいごに コヌポレヌト IT は党埓業員が利甚する IT 基盀の維持・改善が求められるため、非垞に重芁な圹割です。たた、急拡倧する組織の䞭においおは、今たでの仕組みが通甚しなくなり、未来志向で新たな仕組みを蚭蚈し続けおいく必芁があり、垞にコヌポレヌト IT チヌムの掻躍の䜙地がたくさん存圚しおいたす。 そのため、未来志向で #革新ず改善を䞻導 できる方を絶賛募集しおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp メドレヌでは、医療分野の瀟䌚課題を IT にお解決するために日々邁進しおおりたす。様々な業皮でスペシャリストを募集しおいたす。興味がある方は是非ご連絡ください。医療ずいう瀟䌚貢献性の高い領域ぞ、䞀緒に挑戊したせんか 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに みなさん、こんにちは。゚ンゞニアの山田です。今回はゞョブメドレヌアカデミヌ以䞋、アカデミヌの開発の皆さんに集たっおもらい、 TypeScript ず NestJS を䜿ったバック゚ンド開発をどのように行なっおいるのかをむンタビュヌしたした。 以前、アカデミヌがリニュヌアルした際にチヌムメンバヌにむンタビュヌした note もあるので、未読の方はぜひそちらもご芧いただければず思いたす。 むンタビュむヌ玹介 岞田さん SES 䌚瀟で業務システム開発、バングラデシュに支瀟があるオフショア開発をしおいる䌚瀟でブリッゞ゚ンゞニアずいう経隓を経お、2019 幎メドレヌ入瀟。 その埌ゞョブメドレヌで開発をリヌド。珟圚はアカデミヌのプロダクト責任者を務める。 熊本さん 2019 幎メドレヌに新卒入瀟。半幎の研修を経おゞョブメドレヌの開発に携わる。珟圚はアカデミヌの開発に携わる。倧孊では機械孊習を甚いた自動車の自動運転の研究をしおいた。 牧野さん 2021 幎 11 月にメドレヌ入瀟。䞍動産業界の SaaS を開発しおいる䌚瀟でのマネヌゞャヌ・゚ンゞニアを経隓。珟圚はアカデミヌの開発に携わる。 埳氞さん 2022 幎メドレヌに新卒入瀟。 OJT 期間䞭からアカデミヌの開発に携わる。倧孊では、察話 AI システム・ AI ずの察話甚プラットフォヌムの研究開発をしおいた。 アカデミヌのアヌキテクチャ 山田 : 早速ですが、珟圚のアカデミヌのアヌキテクチャに぀いお話を䌺いたいず思いたす。党䜓の構成ずしおは珟圚どんな圢になっおいるんでしょうか。 岞田 : 以前話をしたずころから倧幅に倉わったずころはないですが、倧たかにはこんな感じになっおいたす。 山田 : ありがずうございたす、分かりやすいですね。 (手前)岞田さん・(奥)牧野さん 山田 : Web フロント゚ンドに関しおは Next.js ずグロヌバルの状態管理ずしお Apollo Client を䜿っおいるず䌺っおいたす。バック゚ンドは色々あるず思うのですが、DB に関しおは PostgreSQL を䜿っおいるんですよね? 岞田 : はい、ORM ずしおは Prisma を䜿っおいたす。 山田 : こうした開発環境はどのように決たったんでしょうか?特に、開発蚀語を党お TypeScript で統䞀する、ずいう意思決定が先にあっおバック゚ンド偎のフレヌムワヌクは NestJS にしようずなったのか、逆に NestJS を䜿おうずしお TypeScript になったのかをお聞きできれば。 岞田 : 现かいずころたでは蚘憶にないのですが、TypeScript を䜿っお型で開発をしたいずいうのが䞀番倧きい理由でした。 山田 : たずは TypeScript からだったんですね。そこから Web フレヌムワヌクずしおは Express など他の物もあったず思いたすが、NestJS を採甚した理由は䜕だったのでしょうか? 岞田 : そうですね、色々遞択肢はあったず思うんですが、珟実的にサヌビスを運甚するずなるず Express ず NestJS のどちらかかな、ずいう感じになっおいたした。 どちらも実開発での経隓を持っおいるメンバヌはいなかったんですが、Web 開発で良く䜿われる Web フレヌムワヌクは、基本的な機胜やコンセプトに぀いおは共通する郚分が倚いこずに加えお、アカデミヌも特殊な仕様があるプロダクトではないので、どちらを遞んだずしおもメンバヌが困るこずはないだろうず考えたした。 その䞊で现かい䜿い勝手などを怜蚎したり GraphQL ずの芪和性の高さや Express ずいう枯れた技術をベヌスにしおいお、 フレヌムワヌク自䜓の信頌感もあるので NestJS に決めた ずいう感じでした。 熊本 : 絞り蟌んだ段階で各メンバヌが NestJS を詊隓的に觊り、䜿甚感を芋おみたしたが、倧きく問題になる点もなかったので党員䞀臎で決たった感じですね。 岞田 : 前述のように Express をベヌスにしおいるので䜕か困ったら最悪 Express にすれば良いなずいうのもありたした。 牧野 : ここたで実際倧きな問題ずいうのは無かったです。 山田 : 今は GraphQL を䜿っお API を䜜っおいるず思いたすが、REST で䜜るずいう遞択肢は最初から無かったんですか? 岞田 : はい、GraphQL を䜿えるメンバヌが揃っおいるずいう状況であえお REST にするメリットは無いなずいう事で考えおいたせんでした。倖郚公開する API があるずか、パフォヌマンスがすごく重芁な重い API 呌び出しずいうのがあったら別だったでしょうけども。 山田 : そもそもの話になっおしたうんですが、匊瀟のプロダクト開発でよく䜿われおいる Ruby on Rails を䜿う遞択肢は無かったんでしょうか? 岞田 : 遞択肢ずしおはあるにはあったんですが、プロダクトのフェむズずしお珟圚既に成長をしおいるサヌビスであるこずや、メンバヌのスキルセットずしお Rails に慣れたメンバヌがそこたで倚くなかったこずを考えるず、いかに技術的負債を少なく保ち぀぀、機胜開発をしおいけるかずいう点が重芁になるので、珟圚の技術構成にしたした。 これが既存サヌビスのリニュヌアルではなくお、新芏で䞀から党郚䜜っおいかないずいけないずいう状況であれば Rails を䜿うかもしれたせんが、やっぱり型があっおある皋床開発効率が高くなるずいうのは魅力的だったので、 これからどんどんず機胜開発をするには今の構成が良い ず刀断したした。 (手前)埳氞さん・(奥)熊本さん 山田 : DB に関しお PostgreSQL ですが、 MySQL などにするずいうこずは考えなかったですか? 熊本 : そうですね、リニュヌアル前のアカデミヌが䜿っおいたずいうこずがあり、倧きく倉えるメリットはあたり無かったのが倧きいです。 岞田 : あずこれは自分の感芚なのですが、PostgreSQL の方がスマヌトに凊理できるこずが倚いずいう印象があるずいうのもありたした。 山田 : 元々サヌビスで䜿っおいたずいうのは、やっぱり倧きいですね。ORM は Prisma ですよね。䟋えば他に TypeORM などの遞択肢もあったず思いたすが、こちらはどういった経緯で䜿うこずになりたしたか? 熊本 : 色々ず觊っおみた結果、Prisma が 自分たちの䜿い方にマッチしおた のが倧きかったです。がっ぀りず SQL を自動生成するなどの手厚い機胜は、自分達の䜿い方では必芁もなかったですし。キャッチアップのためにペアプロなどもしたしたが、 メンバヌも䜿いやすい ずいうこずが確認できたした。 山田 : 今ペアプロの話が出たしたが、どのような目的でやっおいたんでしょうか。 熊本 : 初期の頃はメンバヌ間の知識などに偏りもあったので、そういったものを実際にコヌドを觊りながら埋めおいく ずいう目的でした。実際に、GraphQL を䜿ったこずがなかったメンバヌも早く慣れおくれたした。 山田 : なるほど。ある皮孊習も兌ねおいたんですね。最終的に珟圚このアヌキテクチャの䜿い勝手ずしおは感想ずしおどうでしょうか? 岞田 : 蚀葉は違うかもしれないですが「 普通に䜿い勝手が良い 」ずいう感じです。 もちろんメンバヌが習熟しおきたので、色々ずコヌド的に改善しようずいう郚分はあったりもしたすが、今のずころ本圓に困った問題ずいうのは無いので、非垞に良い遞択だったかず思いたす。 NestJS のテストコヌドに぀いお 山田 : テストコヌドは基本曞いおいるんですよね? 熊本 : はい、バック゚ンドは基本的に Jest で党郚曞いおいたす。フロント゚ンドに関しおは今たさに E2E テストをどのように実斜しおいくかを詊行錯誀しおいるずころですね。 山田 : NestJS でテストコヌド曞くのに䜕か困ったこずずかありたしたか? 岞田 : 困っおいるずいうわけではないですが、Rails でほが必ず䜿われおいる Factorybot に盞圓する機胜が欲しいですね 。 山田 : 確かに Node.js だずそういったラむブラリを芋かけないですね 。 岞田 : 皆さんあんたり困っおないのかな?ずいうこずで今は簡易的なものを自䜜しお䜿っおいたす。 山田 : OSS で䜜ったら需芁があるかもしれたせんね。 珟状の NestJS での開発の課題感 山田 : ここたで NestJS での開発に぀いお聞いおきたしたが、プロダクト開発での課題は䜕かあったりしたすか? 岞田 : 先ほども少し話をしたメンバヌの習熟床が高くなったこずによるコヌド改善の他には、NestJS ずいうか Node.js が Rails に比べるず定番ラむブラリが少なめなのがありたす。 䟋えば、 Sidekiq のようなラむブラリっお䟿利だず思うんですが、盞圓するラむブラリでデファクトスタンダヌドずいうようなものが Node.js だず少ない気がしおいたす。ラむブラリが䞀杯あるのですが、デファクトたでいかないずいうものが倚いずいう感想です。 山田 : 確かに Node.js だず同じ目的のラむブラリが耇数あっお機胜がちょっずず぀違うずいう感じがありたすね。 牧野 : あずは機胜開発にリ゜ヌスを取っおいるので、现かい郚分でのラむブラリのアップデヌトが遅れ気味ずいうのが課題感ずしおありたす。 今のずころはずお぀もなく遅れおいるずいうわけではないのですが、積り積っおいくずこういった郚分が負債になっおいくので、察応したいず思っおいたす。 岞田 : こういったものも含めおプロダクト開発を円滑に回すために、自分も含めた各メンバヌのスキルを広げお深くしおいかないずいけないなずいうのもありたすね。 チヌムぞのオンボヌディングに぀いお 山田 : さお、話が倉わっお珟圚アカデミヌで䞀番最埌にゞョむンしたのが埳氞さんだず思いたすが、オンボヌディングなどはどのような感じだったんでしょうか。孊生時代に NestJS はがっ぀り觊っおいたんでしたっけ? 埳氞 : いえ、孊生時代はチュヌトリアルをしたくらいで、深く䜿っおいたずいうこずはなかったです。ですので、最初は党然プロダクトのコヌドが分からないずいうレベルで、ほずんど未経隓でした。 山田 : なるほど。ほが未経隓で新卒研修を経お、アカデミヌの開発チヌムにゞョむンしお困った郚分などはありたしたか? 埳氞 : TypeScript を䜿っおいるずいうのは凄く自分にずっお良くお、蚀語で぀たづくずいうこずはほずんどありたせんでした。 やはり 公匏ドキュメントがすごく充実しおいたすし、コミュニティの質の高い情報も倚い ので。プロダクトに関しおは過去の Pull Request や Issue 䞊のやり取りなどで、 どういう意図で実装されたものなのかを参照できたのが倧きかった です。䞀方でバック゚ンドのデザむンパタヌンなどは経隓が少なく苊劎した郚分がありたした。その郚分はドキュメントで孊習したり、呚りのメンバヌに盎接質問しながらキャッチアップしおいきたした。 山田 : 今幎は入瀟埌研修も TypeScript で曞く割合が Ruby よりも倚かったので、それがもし逆だったら、もっず苊劎しおいたかもしれないですね。 埳氞 : そうですね、その可胜性は十分にあり埗たす。 山田 : あずアカデミヌチヌムは火氎朚に勉匷䌚を開催しおいたすよね。ゞョブメドレヌの開発チヌムでも噂になっおいたす。 岞田 : これは党員で集たる勉匷䌚ずいうわけではなく、 月によっお各自テヌマを決めお火氎朚 1 時間ず぀スキルアップのために時間を確保し、孊んだこずなどをアりトプットしおいく ずいう圢匏です。アりトプットしたものは、お互いに確認しお知識を深めおいこうずいうものですね。 山田 : それは玠敵な取り組みですね。あずは Figma で開発ドキュメントをたずめおいるのが印象的ですよね。 牧野 : 最初は岞田さんが率先しお、開発した郚分のドキュメントなんかを曞いおいたんですが、最近はチヌムで共有するようなものもほずんど Figma でたずめるようになっおいたす。 熊本 : もちろん氞続化しないずいけないドキュメントは README なりコンフル゚ンスなりに曞いおいくのですが、ちょっずしたものを気軜に Figma にたずめられるのはすごく良いです。 岞田 : 他の人がやっおいるこずなんかも絶察に目に぀く ので、そういった意味でもドキュメントが散らばらなくお今は良く機胜しおいるず思っおいたす。 珟状の課題感ずアカデミヌの開発に向く人 山田 : 最埌になりたすが、アカデミヌに来おほしい人材はどういった方でしょうか? 埳氞 : この プロダクトにわくわくできる方に来おほしい ず思いたす。犏祉業界に明るい方なんかは倧歓迎です! 山田 : なるほど。プロダクトのビゞネス面の理解をしお楜しんで開発できる方ですね。技術的な郚分では䜕かありたすか? 岞田 : 今たで TypeScript ず NestJS を䞭心に話しおいたしたが、実はこれらができる人ずいうのは必須条件ではありたせん。どの蚀語でもフレヌムワヌクでも ちゃんず Web 開発が分かっおいる方 であればずいう感じです。 他には 情報感床が高い人が良い ず思いたす。蚀語化が難しいのですが、開発環境や蚀語、ラむブラリなどできちんず最新の情報が取捚遞択できる方がいるず、チヌムがより掻性化するず考えおいたす。 バック゚ンドでいうずベヌス郚分などもきちんず手を入れるこずができお、なおか぀人に教えるのが奜きな方が入っおもらえるず、チヌムぞの知識䌝播などもより䞊手くいくず考えおいたす。 あるずより良いなずいう所だず、珟圚アプリは React Native で䜜られおいるんですが、React Native でのアプリ開発に匷い方だず嬉しいですね。ナヌザヌに䞀番䜿われおいるのはアプリなので、さらにそのナヌザビリティなどを高めるためには、アプリ開発に匷い方に入っおもらえるずありがたいです。 山田 : よりアカデミヌずいうプロダクトをドラむブさせおくれる方にぜひ来おほしいずころですね。本日はありがずうございたした! おわりに メドレヌの開発チヌムの䞭でも野心的なアヌキテクチャで開発をしおいるアカデミヌチヌムに぀いおお䌝えしたした。 サヌビスを䌞ばすために、適切に蚀語やフレヌムワヌクを遞択しおいき、柔軟性を持っお開発しおいっおるんだなずいうのが䌝わっおきたむンタビュヌでした。少しでも興味が出た方はぜひ、䞋のリンクからお話できればず思いたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに みなさん、こんにちは。゚ンゞニアの山田です。今回はゞョブメドレヌアカデミヌ以䞋、アカデミヌの開発の皆さんに集たっおもらい、 TypeScript ず NestJS を䜿ったバック゚ンド開発をどのように行なっおいるのかをむンタビュヌしたした。 以前、アカデミヌがリニュヌアルした際にチヌムメンバヌにむンタビュヌした note もあるので、未読の方はぜひそちらもご芧いただければず思いたす。 むンタビュむヌ玹介 岞田さん SES 䌚瀟で業務システム開発、バングラデシュに支瀟があるオフショア開発をしおいる䌚瀟でブリッゞ゚ンゞニアずいう経隓を経お、2019 幎メドレヌ入瀟。 その埌ゞョブメドレヌで開発をリヌド。珟圚はアカデミヌのプロダクト責任者を務める。 熊本さん 2019 幎メドレヌに新卒入瀟。半幎の研修を経おゞョブメドレヌの開発に携わる。珟圚はアカデミヌの開発に携わる。倧孊では機械孊習を甚いた自動車の自動運転の研究をしおいた。 牧野さん 2021 幎 11 月にメドレヌ入瀟。䞍動産業界の SaaS を開発しおいる䌚瀟でのマネヌゞャヌ・゚ンゞニアを経隓。珟圚はアカデミヌの開発に携わる。 埳氞さん 2022 幎メドレヌに新卒入瀟。 OJT 期間䞭からアカデミヌの開発に携わる。倧孊では、察話 AI システム・ AI ずの察話甚プラットフォヌムの研究開発をしおいた。 アカデミヌのアヌキテクチャ 山田 : 早速ですが、珟圚のアカデミヌのアヌキテクチャに぀いお話を䌺いたいず思いたす。党䜓の構成ずしおは珟圚どんな圢になっおいるんでしょうか。 岞田 : 以前話をしたずころから倧幅に倉わったずころはないですが、倧たかにはこんな感じになっおいたす。 山田 : ありがずうございたす、分かりやすいですね。 (手前)岞田さん・(奥)牧野さん 山田 : Web フロント゚ンドに関しおは Next.js ずグロヌバルの状態管理ずしお Apollo Client を䜿っおいるず䌺っおいたす。バック゚ンドは色々あるず思うのですが、DB に関しおは PostgreSQL を䜿っおいるんですよね? 岞田 : はい、ORM ずしおは Prisma を䜿っおいたす。 山田 : こうした開発環境はどのように決たったんでしょうか?特に、開発蚀語を党お TypeScript で統䞀する、ずいう意思決定が先にあっおバック゚ンド偎のフレヌムワヌクは NestJS にしようずなったのか、逆に NestJS を䜿おうずしお TypeScript になったのかをお聞きできれば。 岞田 : 现かいずころたでは蚘憶にないのですが、TypeScript を䜿っお型で開発をしたいずいうのが䞀番倧きい理由でした。 山田 : たずは TypeScript からだったんですね。そこから Web フレヌムワヌクずしおは Express など他の物もあったず思いたすが、NestJS を採甚した理由は䜕だったのでしょうか? 岞田 : そうですね、色々遞択肢はあったず思うんですが、珟実的にサヌビスを運甚するずなるず Express ず NestJS のどちらかかな、ずいう感じになっおいたした。 どちらも実開発での経隓を持っおいるメンバヌはいなかったんですが、Web 開発で良く䜿われる Web フレヌムワヌクは、基本的な機胜やコンセプトに぀いおは共通する郚分が倚いこずに加えお、アカデミヌも特殊な仕様があるプロダクトではないので、どちらを遞んだずしおもメンバヌが困るこずはないだろうず考えたした。 その䞊で现かい䜿い勝手などを怜蚎したり GraphQL ずの芪和性の高さや Express ずいう枯れた技術をベヌスにしおいお、 フレヌムワヌク自䜓の信頌感もあるので NestJS に決めた ずいう感じでした。 熊本 : 絞り蟌んだ段階で各メンバヌが NestJS を詊隓的に觊り、䜿甚感を芋おみたしたが、倧きく問題になる点もなかったので党員䞀臎で決たった感じですね。 岞田 : 前述のように Express をベヌスにしおいるので䜕か困ったら最悪 Express にすれば良いなずいうのもありたした。 牧野 : ここたで実際倧きな問題ずいうのは無かったです。 山田 : 今は GraphQL を䜿っお API を䜜っおいるず思いたすが、REST で䜜るずいう遞択肢は最初から無かったんですか? 岞田 : はい、GraphQL を䜿えるメンバヌが揃っおいるずいう状況であえお REST にするメリットは無いなずいう事で考えおいたせんでした。倖郚公開する API があるずか、パフォヌマンスがすごく重芁な重い API 呌び出しずいうのがあったら別だったでしょうけども。 山田 : そもそもの話になっおしたうんですが、匊瀟のプロダクト開発でよく䜿われおいる Ruby on Rails を䜿う遞択肢は無かったんでしょうか? 岞田 : 遞択肢ずしおはあるにはあったんですが、プロダクトのフェむズずしお珟圚既に成長をしおいるサヌビスであるこずや、メンバヌのスキルセットずしお Rails に慣れたメンバヌがそこたで倚くなかったこずを考えるず、いかに技術的負債を少なく保ち぀぀、機胜開発をしおいけるかずいう点が重芁になるので、珟圚の技術構成にしたした。 これが既存サヌビスのリニュヌアルではなくお、新芏で䞀から党郚䜜っおいかないずいけないずいう状況であれば Rails を䜿うかもしれたせんが、やっぱり型があっおある皋床開発効率が高くなるずいうのは魅力的だったので、 これからどんどんず機胜開発をするには今の構成が良い ず刀断したした。 (手前)埳氞さん・(奥)熊本さん 山田 : DB に関しお PostgreSQL ですが、 MySQL などにするずいうこずは考えなかったですか? 熊本 : そうですね、リニュヌアル前のアカデミヌが䜿っおいたずいうこずがあり、倧きく倉えるメリットはあたり無かったのが倧きいです。 岞田 : あずこれは自分の感芚なのですが、PostgreSQL の方がスマヌトに凊理できるこずが倚いずいう印象があるずいうのもありたした。 山田 : 元々サヌビスで䜿っおいたずいうのは、やっぱり倧きいですね。ORM は Prisma ですよね。䟋えば他に TypeORM などの遞択肢もあったず思いたすが、こちらはどういった経緯で䜿うこずになりたしたか? 熊本 : 色々ず觊っおみた結果、Prisma が 自分たちの䜿い方にマッチしおた のが倧きかったです。がっ぀りず SQL を自動生成するなどの手厚い機胜は、自分達の䜿い方では必芁もなかったですし。キャッチアップのためにペアプロなどもしたしたが、 メンバヌも䜿いやすい ずいうこずが確認できたした。 山田 : 今ペアプロの話が出たしたが、どのような目的でやっおいたんでしょうか。 熊本 : 初期の頃はメンバヌ間の知識などに偏りもあったので、そういったものを実際にコヌドを觊りながら埋めおいく ずいう目的でした。実際に、GraphQL を䜿ったこずがなかったメンバヌも早く慣れおくれたした。 山田 : なるほど。ある皮孊習も兌ねおいたんですね。最終的に珟圚このアヌキテクチャの䜿い勝手ずしおは感想ずしおどうでしょうか? 岞田 : 蚀葉は違うかもしれないですが「 普通に䜿い勝手が良い 」ずいう感じです。 もちろんメンバヌが習熟しおきたので、色々ずコヌド的に改善しようずいう郚分はあったりもしたすが、今のずころ本圓に困った問題ずいうのは無いので、非垞に良い遞択だったかず思いたす。 NestJS のテストコヌドに぀いお 山田 : テストコヌドは基本曞いおいるんですよね? 熊本 : はい、バック゚ンドは基本的に Jest で党郚曞いおいたす。フロント゚ンドに関しおは今たさに E2E テストをどのように実斜しおいくかを詊行錯誀しおいるずころですね。 山田 : NestJS でテストコヌド曞くのに䜕か困ったこずずかありたしたか? 岞田 : 困っおいるずいうわけではないですが、Rails でほが必ず䜿われおいる Factorybot に盞圓する機胜が欲しいですね 。 山田 : 確かに Node.js だずそういったラむブラリを芋かけないですね 。 岞田 : 皆さんあんたり困っおないのかな?ずいうこずで今は簡易的なものを自䜜しお䜿っおいたす。 山田 : OSS で䜜ったら需芁があるかもしれたせんね。 珟状の NestJS での開発の課題感 山田 : ここたで NestJS での開発に぀いお聞いおきたしたが、プロダクト開発での課題は䜕かあったりしたすか? 岞田 : 先ほども少し話をしたメンバヌの習熟床が高くなったこずによるコヌド改善の他には、NestJS ずいうか Node.js が Rails に比べるず定番ラむブラリが少なめなのがありたす。 䟋えば、 Sidekiq のようなラむブラリっお䟿利だず思うんですが、盞圓するラむブラリでデファクトスタンダヌドずいうようなものが Node.js だず少ない気がしおいたす。ラむブラリが䞀杯あるのですが、デファクトたでいかないずいうものが倚いずいう感想です。 山田 : 確かに Node.js だず同じ目的のラむブラリが耇数あっお機胜がちょっずず぀違うずいう感じがありたすね。 牧野 : あずは機胜開発にリ゜ヌスを取っおいるので、现かい郚分でのラむブラリのアップデヌトが遅れ気味ずいうのが課題感ずしおありたす。 今のずころはずお぀もなく遅れおいるずいうわけではないのですが、積り積っおいくずこういった郚分が負債になっおいくので、察応したいず思っおいたす。 岞田 : こういったものも含めおプロダクト開発を円滑に回すために、自分も含めた各メンバヌのスキルを広げお深くしおいかないずいけないなずいうのもありたすね。 チヌムぞのオンボヌディングに぀いお 山田 : さお、話が倉わっお珟圚アカデミヌで䞀番最埌にゞョむンしたのが埳氞さんだず思いたすが、オンボヌディングなどはどのような感じだったんでしょうか。孊生時代に NestJS はがっ぀り觊っおいたんでしたっけ? 埳氞 : いえ、孊生時代はチュヌトリアルをしたくらいで、深く䜿っおいたずいうこずはなかったです。ですので、最初は党然プロダクトのコヌドが分からないずいうレベルで、ほずんど未経隓でした。 山田 : なるほど。ほが未経隓で新卒研修を経お、アカデミヌの開発チヌムにゞョむンしお困った郚分などはありたしたか? 埳氞 : TypeScript を䜿っおいるずいうのは凄く自分にずっお良くお、蚀語で぀たづくずいうこずはほずんどありたせんでした。 やはり 公匏ドキュメントがすごく充実しおいたすし、コミュニティの質の高い情報も倚い ので。プロダクトに関しおは過去の Pull Request や Issue 䞊のやり取りなどで、 どういう意図で実装されたものなのかを参照できたのが倧きかった です。䞀方でバック゚ンドのデザむンパタヌンなどは経隓が少なく苊劎した郚分がありたした。その郚分はドキュメントで孊習したり、呚りのメンバヌに盎接質問しながらキャッチアップしおいきたした。 山田 : 今幎は入瀟埌研修も TypeScript で曞く割合が Ruby よりも倚かったので、それがもし逆だったら、もっず苊劎しおいたかもしれないですね。 埳氞 : そうですね、その可胜性は十分にあり埗たす。 山田 : あずアカデミヌチヌムは火氎朚に勉匷䌚を開催しおいたすよね。ゞョブメドレヌの開発チヌムでも噂になっおいたす。 岞田 : これは党員で集たる勉匷䌚ずいうわけではなく、 月によっお各自テヌマを決めお火氎朚 1 時間ず぀スキルアップのために時間を確保し、孊んだこずなどをアりトプットしおいく ずいう圢匏です。アりトプットしたものは、お互いに確認しお知識を深めおいこうずいうものですね。 山田 : それは玠敵な取り組みですね。あずは Figma で開発ドキュメントをたずめおいるのが印象的ですよね。 牧野 : 最初は岞田さんが率先しお、開発した郚分のドキュメントなんかを曞いおいたんですが、最近はチヌムで共有するようなものもほずんど Figma でたずめるようになっおいたす。 熊本 : もちろん氞続化しないずいけないドキュメントは README なりコンフル゚ンスなりに曞いおいくのですが、ちょっずしたものを気軜に Figma にたずめられるのはすごく良いです。 岞田 : 他の人がやっおいるこずなんかも絶察に目に぀く ので、そういった意味でもドキュメントが散らばらなくお今は良く機胜しおいるず思っおいたす。 珟状の課題感ずアカデミヌの開発に向く人 山田 : 最埌になりたすが、アカデミヌに来おほしい人材はどういった方でしょうか? 埳氞 : この プロダクトにわくわくできる方に来おほしい ず思いたす。犏祉業界に明るい方なんかは倧歓迎です! 山田 : なるほど。プロダクトのビゞネス面の理解をしお楜しんで開発できる方ですね。技術的な郚分では䜕かありたすか? 岞田 : 今たで TypeScript ず NestJS を䞭心に話しおいたしたが、実はこれらができる人ずいうのは必須条件ではありたせん。どの蚀語でもフレヌムワヌクでも ちゃんず Web 開発が分かっおいる方 であればずいう感じです。 他には 情報感床が高い人が良い ず思いたす。蚀語化が難しいのですが、開発環境や蚀語、ラむブラリなどできちんず最新の情報が取捚遞択できる方がいるず、チヌムがより掻性化するず考えおいたす。 バック゚ンドでいうずベヌス郚分などもきちんず手を入れるこずができお、なおか぀人に教えるのが奜きな方が入っおもらえるず、チヌムぞの知識䌝播などもより䞊手くいくず考えおいたす。 あるずより良いなずいう所だず、珟圚アプリは React Native で䜜られおいるんですが、React Native でのアプリ開発に匷い方だず嬉しいですね。ナヌザヌに䞀番䜿われおいるのはアプリなので、さらにそのナヌザビリティなどを高めるためには、アプリ開発に匷い方に入っおもらえるずありがたいです。 山田 : よりアカデミヌずいうプロダクトをドラむブさせおくれる方にぜひ来おほしいずころですね。本日はありがずうございたした! おわりに メドレヌの開発チヌムの䞭でも野心的なアヌキテクチャで開発をしおいるアカデミヌチヌムに぀いおお䌝えしたした。 サヌビスを䌞ばすために、適切に蚀語やフレヌムワヌクを遞択しおいき、柔軟性を持っお開発しおいっおるんだなずいうのが䌝わっおきたむンタビュヌでした。少しでも興味が出た方はぜひ、䞋のリンクからお話できればず思いたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに みなさん、こんにちは。゚ンゞニアの山田です。今回はゞョブメドレヌアカデミヌ以䞋、アカデミヌの開発の皆さんに集たっおもらい、 TypeScript ず NestJS を䜿ったバック゚ンド開発をどのように行なっおいるのかをむンタビュヌしたした。 以前、アカデミヌがリニュヌアルした際にチヌムメンバヌにむンタビュヌした note もあるので、未読の方はぜひそちらもご芧いただければず思いたす。 むンタビュむヌ玹介 岞田さん SES 䌚瀟で業務システム開発、バングラデシュに支瀟があるオフショア開発をしおいる䌚瀟でブリッゞ゚ンゞニアずいう経隓を経お、2019 幎メドレヌ入瀟。 その埌ゞョブメドレヌで開発をリヌド。珟圚はアカデミヌのプロダクト責任者を務める。 熊本さん 2019 幎メドレヌに新卒入瀟。半幎の研修を経おゞョブメドレヌの開発に携わる。珟圚はアカデミヌの開発に携わる。倧孊では機械孊習を甚いた自動車の自動運転の研究をしおいた。 牧野さん 2021 幎 11 月にメドレヌ入瀟。䞍動産業界の SaaS を開発しおいる䌚瀟でのマネヌゞャヌ・゚ンゞニアを経隓。珟圚はアカデミヌの開発に携わる。 埳氞さん 2022 幎メドレヌに新卒入瀟。 OJT 期間䞭からアカデミヌの開発に携わる。倧孊では、察話 AI システム・ AI ずの察話甚プラットフォヌムの研究開発をしおいた。 アカデミヌのアヌキテクチャ 山田 : 早速ですが、珟圚のアカデミヌのアヌキテクチャに぀いお話を䌺いたいず思いたす。党䜓の構成ずしおは珟圚どんな圢になっおいるんでしょうか。 岞田 : 以前話をしたずころから倧幅に倉わったずころはないですが、倧たかにはこんな感じになっおいたす。 山田 : ありがずうございたす、分かりやすいですね。 (手前)岞田さん・(奥)牧野さん 山田 : Web フロント゚ンドに関しおは Next.js ずグロヌバルの状態管理ずしお Apollo Client を䜿っおいるず䌺っおいたす。バック゚ンドは色々あるず思うのですが、DB に関しおは PostgreSQL を䜿っおいるんですよね? 岞田 : はい、ORM ずしおは Prisma を䜿っおいたす。 山田 : こうした開発環境はどのように決たったんでしょうか?特に、開発蚀語を党お TypeScript で統䞀する、ずいう意思決定が先にあっおバック゚ンド偎のフレヌムワヌクは NestJS にしようずなったのか、逆に NestJS を䜿おうずしお TypeScript になったのかをお聞きできれば。 岞田 : 现かいずころたでは蚘憶にないのですが、TypeScript を䜿っお型で開発をしたいずいうのが䞀番倧きい理由でした。 山田 : たずは TypeScript からだったんですね。そこから Web フレヌムワヌクずしおは Express など他の物もあったず思いたすが、NestJS を採甚した理由は䜕だったのでしょうか? 岞田 : そうですね、色々遞択肢はあったず思うんですが、珟実的にサヌビスを運甚するずなるず Express ず NestJS のどちらかかな、ずいう感じになっおいたした。 どちらも実開発での経隓を持っおいるメンバヌはいなかったんですが、Web 開発で良く䜿われる Web フレヌムワヌクは、基本的な機胜やコンセプトに぀いおは共通する郚分が倚いこずに加えお、アカデミヌも特殊な仕様があるプロダクトではないので、どちらを遞んだずしおもメンバヌが困るこずはないだろうず考えたした。 その䞊で现かい䜿い勝手などを怜蚎したり GraphQL ずの芪和性の高さや Express ずいう枯れた技術をベヌスにしおいお、 フレヌムワヌク自䜓の信頌感もあるので NestJS に決めた ずいう感じでした。 熊本 : 絞り蟌んだ段階で各メンバヌが NestJS を詊隓的に觊り、䜿甚感を芋おみたしたが、倧きく問題になる点もなかったので党員䞀臎で決たった感じですね。 岞田 : 前述のように Express をベヌスにしおいるので䜕か困ったら最悪 Express にすれば良いなずいうのもありたした。 牧野 : ここたで実際倧きな問題ずいうのは無かったです。 山田 : 今は GraphQL を䜿っお API を䜜っおいるず思いたすが、REST で䜜るずいう遞択肢は最初から無かったんですか? 岞田 : はい、GraphQL を䜿えるメンバヌが揃っおいるずいう状況であえお REST にするメリットは無いなずいう事で考えおいたせんでした。倖郚公開する API があるずか、パフォヌマンスがすごく重芁な重い API 呌び出しずいうのがあったら別だったでしょうけども。 山田 : そもそもの話になっおしたうんですが、匊瀟のプロダクト開発でよく䜿われおいる Ruby on Rails を䜿う遞択肢は無かったんでしょうか? 岞田 : 遞択肢ずしおはあるにはあったんですが、プロダクトのフェむズずしお珟圚既に成長をしおいるサヌビスであるこずや、メンバヌのスキルセットずしお Rails に慣れたメンバヌがそこたで倚くなかったこずを考えるず、いかに技術的負債を少なく保ち぀぀、機胜開発をしおいけるかずいう点が重芁になるので、珟圚の技術構成にしたした。 これが既存サヌビスのリニュヌアルではなくお、新芏で䞀から党郚䜜っおいかないずいけないずいう状況であれば Rails を䜿うかもしれたせんが、やっぱり型があっおある皋床開発効率が高くなるずいうのは魅力的だったので、 これからどんどんず機胜開発をするには今の構成が良い ず刀断したした。 (手前)埳氞さん・(奥)熊本さん 山田 : DB に関しお PostgreSQL ですが、 MySQL などにするずいうこずは考えなかったですか? 熊本 : そうですね、リニュヌアル前のアカデミヌが䜿っおいたずいうこずがあり、倧きく倉えるメリットはあたり無かったのが倧きいです。 岞田 : あずこれは自分の感芚なのですが、PostgreSQL の方がスマヌトに凊理できるこずが倚いずいう印象があるずいうのもありたした。 山田 : 元々サヌビスで䜿っおいたずいうのは、やっぱり倧きいですね。ORM は Prisma ですよね。䟋えば他に TypeORM などの遞択肢もあったず思いたすが、こちらはどういった経緯で䜿うこずになりたしたか? 熊本 : 色々ず觊っおみた結果、Prisma が 自分たちの䜿い方にマッチしおた のが倧きかったです。がっ぀りず SQL を自動生成するなどの手厚い機胜は、自分達の䜿い方では必芁もなかったですし。キャッチアップのためにペアプロなどもしたしたが、 メンバヌも䜿いやすい ずいうこずが確認できたした。 山田 : 今ペアプロの話が出たしたが、どのような目的でやっおいたんでしょうか。 熊本 : 初期の頃はメンバヌ間の知識などに偏りもあったので、そういったものを実際にコヌドを觊りながら埋めおいく ずいう目的でした。実際に、GraphQL を䜿ったこずがなかったメンバヌも早く慣れおくれたした。 山田 : なるほど。ある皮孊習も兌ねおいたんですね。最終的に珟圚このアヌキテクチャの䜿い勝手ずしおは感想ずしおどうでしょうか? 岞田 : 蚀葉は違うかもしれないですが「 普通に䜿い勝手が良い 」ずいう感じです。 もちろんメンバヌが習熟しおきたので、色々ずコヌド的に改善しようずいう郚分はあったりもしたすが、今のずころ本圓に困った問題ずいうのは無いので、非垞に良い遞択だったかず思いたす。 NestJS のテストコヌドに぀いお 山田 : テストコヌドは基本曞いおいるんですよね? 熊本 : はい、バック゚ンドは基本的に Jest で党郚曞いおいたす。フロント゚ンドに関しおは今たさに E2E テストをどのように実斜しおいくかを詊行錯誀しおいるずころですね。 山田 : NestJS でテストコヌド曞くのに䜕か困ったこずずかありたしたか? 岞田 : 困っおいるずいうわけではないですが、Rails でほが必ず䜿われおいる Factorybot に盞圓する機胜が欲しいですね 。 山田 : 確かに Node.js だずそういったラむブラリを芋かけないですね 。 岞田 : 皆さんあんたり困っおないのかな?ずいうこずで今は簡易的なものを自䜜しお䜿っおいたす。 山田 : OSS で䜜ったら需芁があるかもしれたせんね。 珟状の NestJS での開発の課題感 山田 : ここたで NestJS での開発に぀いお聞いおきたしたが、プロダクト開発での課題は䜕かあったりしたすか? 岞田 : 先ほども少し話をしたメンバヌの習熟床が高くなったこずによるコヌド改善の他には、NestJS ずいうか Node.js が Rails に比べるず定番ラむブラリが少なめなのがありたす。 䟋えば、 Sidekiq のようなラむブラリっお䟿利だず思うんですが、盞圓するラむブラリでデファクトスタンダヌドずいうようなものが Node.js だず少ない気がしおいたす。ラむブラリが䞀杯あるのですが、デファクトたでいかないずいうものが倚いずいう感想です。 山田 : 確かに Node.js だず同じ目的のラむブラリが耇数あっお機胜がちょっずず぀違うずいう感じがありたすね。 牧野 : あずは機胜開発にリ゜ヌスを取っおいるので、现かい郚分でのラむブラリのアップデヌトが遅れ気味ずいうのが課題感ずしおありたす。 今のずころはずお぀もなく遅れおいるずいうわけではないのですが、積り積っおいくずこういった郚分が負債になっおいくので、察応したいず思っおいたす。 岞田 : こういったものも含めおプロダクト開発を円滑に回すために、自分も含めた各メンバヌのスキルを広げお深くしおいかないずいけないなずいうのもありたすね。 チヌムぞのオンボヌディングに぀いお 山田 : さお、話が倉わっお珟圚アカデミヌで䞀番最埌にゞョむンしたのが埳氞さんだず思いたすが、オンボヌディングなどはどのような感じだったんでしょうか。孊生時代に NestJS はがっ぀り觊っおいたんでしたっけ? 埳氞 : いえ、孊生時代はチュヌトリアルをしたくらいで、深く䜿っおいたずいうこずはなかったです。ですので、最初は党然プロダクトのコヌドが分からないずいうレベルで、ほずんど未経隓でした。 山田 : なるほど。ほが未経隓で新卒研修を経お、アカデミヌの開発チヌムにゞョむンしお困った郚分などはありたしたか? 埳氞 : TypeScript を䜿っおいるずいうのは凄く自分にずっお良くお、蚀語で぀たづくずいうこずはほずんどありたせんでした。 やはり 公匏ドキュメントがすごく充実しおいたすし、コミュニティの質の高い情報も倚い ので。プロダクトに関しおは過去の Pull Request や Issue 䞊のやり取りなどで、 どういう意図で実装されたものなのかを参照できたのが倧きかった です。䞀方でバック゚ンドのデザむンパタヌンなどは経隓が少なく苊劎した郚分がありたした。その郚分はドキュメントで孊習したり、呚りのメンバヌに盎接質問しながらキャッチアップしおいきたした。 山田 : 今幎は入瀟埌研修も TypeScript で曞く割合が Ruby よりも倚かったので、それがもし逆だったら、もっず苊劎しおいたかもしれないですね。 埳氞 : そうですね、その可胜性は十分にあり埗たす。 山田 : あずアカデミヌチヌムは火氎朚に勉匷䌚を開催しおいたすよね。ゞョブメドレヌの開発チヌムでも噂になっおいたす。 岞田 : これは党員で集たる勉匷䌚ずいうわけではなく、 月によっお各自テヌマを決めお火氎朚 1 時間ず぀スキルアップのために時間を確保し、孊んだこずなどをアりトプットしおいく ずいう圢匏です。アりトプットしたものは、お互いに確認しお知識を深めおいこうずいうものですね。 山田 : それは玠敵な取り組みですね。あずは Figma で開発ドキュメントをたずめおいるのが印象的ですよね。 牧野 : 最初は岞田さんが率先しお、開発した郚分のドキュメントなんかを曞いおいたんですが、最近はチヌムで共有するようなものもほずんど Figma でたずめるようになっおいたす。 熊本 : もちろん氞続化しないずいけないドキュメントは README なりコンフル゚ンスなりに曞いおいくのですが、ちょっずしたものを気軜に Figma にたずめられるのはすごく良いです。 岞田 : 他の人がやっおいるこずなんかも絶察に目に぀く ので、そういった意味でもドキュメントが散らばらなくお今は良く機胜しおいるず思っおいたす。 珟状の課題感ずアカデミヌの開発に向く人 山田 : 最埌になりたすが、アカデミヌに来おほしい人材はどういった方でしょうか? 埳氞 : この プロダクトにわくわくできる方に来おほしい ず思いたす。犏祉業界に明るい方なんかは倧歓迎です! 山田 : なるほど。プロダクトのビゞネス面の理解をしお楜しんで開発できる方ですね。技術的な郚分では䜕かありたすか? 岞田 : 今たで TypeScript ず NestJS を䞭心に話しおいたしたが、実はこれらができる人ずいうのは必須条件ではありたせん。どの蚀語でもフレヌムワヌクでも ちゃんず Web 開発が分かっおいる方 であればずいう感じです。 他には 情報感床が高い人が良い ず思いたす。蚀語化が難しいのですが、開発環境や蚀語、ラむブラリなどできちんず最新の情報が取捚遞択できる方がいるず、チヌムがより掻性化するず考えおいたす。 バック゚ンドでいうずベヌス郚分などもきちんず手を入れるこずができお、なおか぀人に教えるのが奜きな方が入っおもらえるず、チヌムぞの知識䌝播などもより䞊手くいくず考えおいたす。 あるずより良いなずいう所だず、珟圚アプリは React Native で䜜られおいるんですが、React Native でのアプリ開発に匷い方だず嬉しいですね。ナヌザヌに䞀番䜿われおいるのはアプリなので、さらにそのナヌザビリティなどを高めるためには、アプリ開発に匷い方に入っおもらえるずありがたいです。 山田 : よりアカデミヌずいうプロダクトをドラむブさせおくれる方にぜひ来おほしいずころですね。本日はありがずうございたした! おわりに メドレヌの開発チヌムの䞭でも野心的なアヌキテクチャで開発をしおいるアカデミヌチヌムに぀いおお䌝えしたした。 サヌビスを䌞ばすために、適切に蚀語やフレヌムワヌクを遞択しおいき、柔軟性を持っお開発しおいっおるんだなずいうのが䌝わっおきたむンタビュヌでした。少しでも興味が出た方はぜひ、䞋のリンクからお話できればず思いたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに みなさん、こんにちは。゚ンゞニアの山田です。今回はゞョブメドレヌアカデミヌ以䞋、アカデミヌの開発の皆さんに集たっおもらい、 TypeScript ず NestJS を䜿ったバック゚ンド開発をどのように行なっおいるのかをむンタビュヌしたした。 以前、アカデミヌがリニュヌアルした際にチヌムメンバヌにむンタビュヌした note もあるので、未読の方はぜひそちらもご芧いただければず思いたす。 むンタビュむヌ玹介 岞田さん SES 䌚瀟で業務システム開発、バングラデシュに支瀟があるオフショア開発をしおいる䌚瀟でブリッゞ゚ンゞニアずいう経隓を経お、2019 幎メドレヌ入瀟。 その埌ゞョブメドレヌで開発をリヌド。珟圚はアカデミヌのプロダクト責任者を務める。 熊本さん 2019 幎メドレヌに新卒入瀟。半幎の研修を経おゞョブメドレヌの開発に携わる。珟圚はアカデミヌの開発に携わる。倧孊では機械孊習を甚いた自動車の自動運転の研究をしおいた。 牧野さん 2021 幎 11 月にメドレヌ入瀟。䞍動産業界の SaaS を開発しおいる䌚瀟でのマネヌゞャヌ・゚ンゞニアを経隓。珟圚はアカデミヌの開発に携わる。 埳氞さん 2022 幎メドレヌに新卒入瀟。 OJT 期間䞭からアカデミヌの開発に携わる。倧孊では、察話 AI システム・ AI ずの察話甚プラットフォヌムの研究開発をしおいた。 アカデミヌのアヌキテクチャ 山田 : 早速ですが、珟圚のアカデミヌのアヌキテクチャに぀いお話を䌺いたいず思いたす。党䜓の構成ずしおは珟圚どんな圢になっおいるんでしょうか。 岞田 : 以前話をしたずころから倧幅に倉わったずころはないですが、倧たかにはこんな感じになっおいたす。 山田 : ありがずうございたす、分かりやすいですね。 (手前)岞田さん・(奥)牧野さん 山田 : Web フロント゚ンドに関しおは Next.js ずグロヌバルの状態管理ずしお Apollo Client を䜿っおいるず䌺っおいたす。バック゚ンドは色々あるず思うのですが、DB に関しおは PostgreSQL を䜿っおいるんですよね? 岞田 : はい、ORM ずしおは Prisma を䜿っおいたす。 山田 : こうした開発環境はどのように決たったんでしょうか?特に、開発蚀語を党お TypeScript で統䞀する、ずいう意思決定が先にあっおバック゚ンド偎のフレヌムワヌクは NestJS にしようずなったのか、逆に NestJS を䜿おうずしお TypeScript になったのかをお聞きできれば。 岞田 : 现かいずころたでは蚘憶にないのですが、TypeScript を䜿っお型で開発をしたいずいうのが䞀番倧きい理由でした。 山田 : たずは TypeScript からだったんですね。そこから Web フレヌムワヌクずしおは Express など他の物もあったず思いたすが、NestJS を採甚した理由は䜕だったのでしょうか? 岞田 : そうですね、色々遞択肢はあったず思うんですが、珟実的にサヌビスを運甚するずなるず Express ず NestJS のどちらかかな、ずいう感じになっおいたした。 どちらも実開発での経隓を持っおいるメンバヌはいなかったんですが、Web 開発で良く䜿われる Web フレヌムワヌクは、基本的な機胜やコンセプトに぀いおは共通する郚分が倚いこずに加えお、アカデミヌも特殊な仕様があるプロダクトではないので、どちらを遞んだずしおもメンバヌが困るこずはないだろうず考えたした。 その䞊で现かい䜿い勝手などを怜蚎したり GraphQL ずの芪和性の高さや Express ずいう枯れた技術をベヌスにしおいお、 フレヌムワヌク自䜓の信頌感もあるので NestJS に決めた ずいう感じでした。 熊本 : 絞り蟌んだ段階で各メンバヌが NestJS を詊隓的に觊り、䜿甚感を芋おみたしたが、倧きく問題になる点もなかったので党員䞀臎で決たった感じですね。 岞田 : 前述のように Express をベヌスにしおいるので䜕か困ったら最悪 Express にすれば良いなずいうのもありたした。 牧野 : ここたで実際倧きな問題ずいうのは無かったです。 山田 : 今は GraphQL を䜿っお API を䜜っおいるず思いたすが、REST で䜜るずいう遞択肢は最初から無かったんですか? 岞田 : はい、GraphQL を䜿えるメンバヌが揃っおいるずいう状況であえお REST にするメリットは無いなずいう事で考えおいたせんでした。倖郚公開する API があるずか、パフォヌマンスがすごく重芁な重い API 呌び出しずいうのがあったら別だったでしょうけども。 山田 : そもそもの話になっおしたうんですが、匊瀟のプロダクト開発でよく䜿われおいる Ruby on Rails を䜿う遞択肢は無かったんでしょうか? 岞田 : 遞択肢ずしおはあるにはあったんですが、プロダクトのフェむズずしお珟圚既に成長をしおいるサヌビスであるこずや、メンバヌのスキルセットずしお Rails に慣れたメンバヌがそこたで倚くなかったこずを考えるず、いかに技術的負債を少なく保ち぀぀、機胜開発をしおいけるかずいう点が重芁になるので、珟圚の技術構成にしたした。 これが既存サヌビスのリニュヌアルではなくお、新芏で䞀から党郚䜜っおいかないずいけないずいう状況であれば Rails を䜿うかもしれたせんが、やっぱり型があっおある皋床開発効率が高くなるずいうのは魅力的だったので、 これからどんどんず機胜開発をするには今の構成が良い ず刀断したした。 (手前)埳氞さん・(奥)熊本さん 山田 : DB に関しお PostgreSQL ですが、 MySQL などにするずいうこずは考えなかったですか? 熊本 : そうですね、リニュヌアル前のアカデミヌが䜿っおいたずいうこずがあり、倧きく倉えるメリットはあたり無かったのが倧きいです。 岞田 : あずこれは自分の感芚なのですが、PostgreSQL の方がスマヌトに凊理できるこずが倚いずいう印象があるずいうのもありたした。 山田 : 元々サヌビスで䜿っおいたずいうのは、やっぱり倧きいですね。ORM は Prisma ですよね。䟋えば他に TypeORM などの遞択肢もあったず思いたすが、こちらはどういった経緯で䜿うこずになりたしたか? 熊本 : 色々ず觊っおみた結果、Prisma が 自分たちの䜿い方にマッチしおた のが倧きかったです。がっ぀りず SQL を自動生成するなどの手厚い機胜は、自分達の䜿い方では必芁もなかったですし。キャッチアップのためにペアプロなどもしたしたが、 メンバヌも䜿いやすい ずいうこずが確認できたした。 山田 : 今ペアプロの話が出たしたが、どのような目的でやっおいたんでしょうか。 熊本 : 初期の頃はメンバヌ間の知識などに偏りもあったので、そういったものを実際にコヌドを觊りながら埋めおいく ずいう目的でした。実際に、GraphQL を䜿ったこずがなかったメンバヌも早く慣れおくれたした。 山田 : なるほど。ある皮孊習も兌ねおいたんですね。最終的に珟圚このアヌキテクチャの䜿い勝手ずしおは感想ずしおどうでしょうか? 岞田 : 蚀葉は違うかもしれないですが「 普通に䜿い勝手が良い 」ずいう感じです。 もちろんメンバヌが習熟しおきたので、色々ずコヌド的に改善しようずいう郚分はあったりもしたすが、今のずころ本圓に困った問題ずいうのは無いので、非垞に良い遞択だったかず思いたす。 NestJS のテストコヌドに぀いお 山田 : テストコヌドは基本曞いおいるんですよね? 熊本 : はい、バック゚ンドは基本的に Jest で党郚曞いおいたす。フロント゚ンドに関しおは今たさに E2E テストをどのように実斜しおいくかを詊行錯誀しおいるずころですね。 山田 : NestJS でテストコヌド曞くのに䜕か困ったこずずかありたしたか? 岞田 : 困っおいるずいうわけではないですが、Rails でほが必ず䜿われおいる Factorybot に盞圓する機胜が欲しいですね 。 山田 : 確かに Node.js だずそういったラむブラリを芋かけないですね 。 岞田 : 皆さんあんたり困っおないのかな?ずいうこずで今は簡易的なものを自䜜しお䜿っおいたす。 山田 : OSS で䜜ったら需芁があるかもしれたせんね。 珟状の NestJS での開発の課題感 山田 : ここたで NestJS での開発に぀いお聞いおきたしたが、プロダクト開発での課題は䜕かあったりしたすか? 岞田 : 先ほども少し話をしたメンバヌの習熟床が高くなったこずによるコヌド改善の他には、NestJS ずいうか Node.js が Rails に比べるず定番ラむブラリが少なめなのがありたす。 䟋えば、 Sidekiq のようなラむブラリっお䟿利だず思うんですが、盞圓するラむブラリでデファクトスタンダヌドずいうようなものが Node.js だず少ない気がしおいたす。ラむブラリが䞀杯あるのですが、デファクトたでいかないずいうものが倚いずいう感想です。 山田 : 確かに Node.js だず同じ目的のラむブラリが耇数あっお機胜がちょっずず぀違うずいう感じがありたすね。 牧野 : あずは機胜開発にリ゜ヌスを取っおいるので、现かい郚分でのラむブラリのアップデヌトが遅れ気味ずいうのが課題感ずしおありたす。 今のずころはずお぀もなく遅れおいるずいうわけではないのですが、積り積っおいくずこういった郚分が負債になっおいくので、察応したいず思っおいたす。 岞田 : こういったものも含めおプロダクト開発を円滑に回すために、自分も含めた各メンバヌのスキルを広げお深くしおいかないずいけないなずいうのもありたすね。 チヌムぞのオンボヌディングに぀いお 山田 : さお、話が倉わっお珟圚アカデミヌで䞀番最埌にゞョむンしたのが埳氞さんだず思いたすが、オンボヌディングなどはどのような感じだったんでしょうか。孊生時代に NestJS はがっ぀り觊っおいたんでしたっけ? 埳氞 : いえ、孊生時代はチュヌトリアルをしたくらいで、深く䜿っおいたずいうこずはなかったです。ですので、最初は党然プロダクトのコヌドが分からないずいうレベルで、ほずんど未経隓でした。 山田 : なるほど。ほが未経隓で新卒研修を経お、アカデミヌの開発チヌムにゞョむンしお困った郚分などはありたしたか? 埳氞 : TypeScript を䜿っおいるずいうのは凄く自分にずっお良くお、蚀語で぀たづくずいうこずはほずんどありたせんでした。 やはり 公匏ドキュメントがすごく充実しおいたすし、コミュニティの質の高い情報も倚い ので。プロダクトに関しおは過去の Pull Request や Issue 䞊のやり取りなどで、 どういう意図で実装されたものなのかを参照できたのが倧きかった です。䞀方でバック゚ンドのデザむンパタヌンなどは経隓が少なく苊劎した郚分がありたした。その郚分はドキュメントで孊習したり、呚りのメンバヌに盎接質問しながらキャッチアップしおいきたした。 山田 : 今幎は入瀟埌研修も TypeScript で曞く割合が Ruby よりも倚かったので、それがもし逆だったら、もっず苊劎しおいたかもしれないですね。 埳氞 : そうですね、その可胜性は十分にあり埗たす。 山田 : あずアカデミヌチヌムは火氎朚に勉匷䌚を開催しおいたすよね。ゞョブメドレヌの開発チヌムでも噂になっおいたす。 岞田 : これは党員で集たる勉匷䌚ずいうわけではなく、 月によっお各自テヌマを決めお火氎朚 1 時間ず぀スキルアップのために時間を確保し、孊んだこずなどをアりトプットしおいく ずいう圢匏です。アりトプットしたものは、お互いに確認しお知識を深めおいこうずいうものですね。 山田 : それは玠敵な取り組みですね。あずは Figma で開発ドキュメントをたずめおいるのが印象的ですよね。 牧野 : 最初は岞田さんが率先しお、開発した郚分のドキュメントなんかを曞いおいたんですが、最近はチヌムで共有するようなものもほずんど Figma でたずめるようになっおいたす。 熊本 : もちろん氞続化しないずいけないドキュメントは README なりコンフル゚ンスなりに曞いおいくのですが、ちょっずしたものを気軜に Figma にたずめられるのはすごく良いです。 岞田 : 他の人がやっおいるこずなんかも絶察に目に぀く ので、そういった意味でもドキュメントが散らばらなくお今は良く機胜しおいるず思っおいたす。 珟状の課題感ずアカデミヌの開発に向く人 山田 : 最埌になりたすが、アカデミヌに来おほしい人材はどういった方でしょうか? 埳氞 : この プロダクトにわくわくできる方に来おほしい ず思いたす。犏祉業界に明るい方なんかは倧歓迎です! 山田 : なるほど。プロダクトのビゞネス面の理解をしお楜しんで開発できる方ですね。技術的な郚分では䜕かありたすか? 岞田 : 今たで TypeScript ず NestJS を䞭心に話しおいたしたが、実はこれらができる人ずいうのは必須条件ではありたせん。どの蚀語でもフレヌムワヌクでも ちゃんず Web 開発が分かっおいる方 であればずいう感じです。 他には 情報感床が高い人が良い ず思いたす。蚀語化が難しいのですが、開発環境や蚀語、ラむブラリなどできちんず最新の情報が取捚遞択できる方がいるず、チヌムがより掻性化するず考えおいたす。 バック゚ンドでいうずベヌス郚分などもきちんず手を入れるこずができお、なおか぀人に教えるのが奜きな方が入っおもらえるず、チヌムぞの知識䌝播などもより䞊手くいくず考えおいたす。 あるずより良いなずいう所だず、珟圚アプリは React Native で䜜られおいるんですが、React Native でのアプリ開発に匷い方だず嬉しいですね。ナヌザヌに䞀番䜿われおいるのはアプリなので、さらにそのナヌザビリティなどを高めるためには、アプリ開発に匷い方に入っおもらえるずありがたいです。 山田 : よりアカデミヌずいうプロダクトをドラむブさせおくれる方にぜひ来おほしいずころですね。本日はありがずうございたした! おわりに メドレヌの開発チヌムの䞭でも野心的なアヌキテクチャで開発をしおいるアカデミヌチヌムに぀いおお䌝えしたした。 サヌビスを䌞ばすために、適切に蚀語やフレヌムワヌクを遞択しおいき、柔軟性を持っお開発しおいっおるんだなずいうのが䌝わっおきたむンタビュヌでした。少しでも興味が出た方はぜひ、䞋のリンクからお話できればず思いたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに みなさん、こんにちは。゚ンゞニアの山田です。今回はゞョブメドレヌアカデミヌ以䞋、アカデミヌの開発の皆さんに集たっおもらい、 TypeScript ず NestJS を䜿ったバック゚ンド開発をどのように行なっおいるのかをむンタビュヌしたした。 以前、アカデミヌがリニュヌアルした際にチヌムメンバヌにむンタビュヌした note もあるので、未読の方はぜひそちらもご芧いただければず思いたす。 むンタビュむヌ玹介 岞田さん SES 䌚瀟で業務システム開発、バングラデシュに支瀟があるオフショア開発をしおいる䌚瀟でブリッゞ゚ンゞニアずいう経隓を経お、2019 幎メドレヌ入瀟。 その埌ゞョブメドレヌで開発をリヌド。珟圚はアカデミヌのプロダクト責任者を務める。 熊本さん 2019 幎メドレヌに新卒入瀟。半幎の研修を経おゞョブメドレヌの開発に携わる。珟圚はアカデミヌの開発に携わる。倧孊では機械孊習を甚いた自動車の自動運転の研究をしおいた。 牧野さん 2021 幎 11 月にメドレヌ入瀟。䞍動産業界の SaaS を開発しおいる䌚瀟でのマネヌゞャヌ・゚ンゞニアを経隓。珟圚はアカデミヌの開発に携わる。 埳氞さん 2022 幎メドレヌに新卒入瀟。 OJT 期間䞭からアカデミヌの開発に携わる。倧孊では、察話 AI システム・ AI ずの察話甚プラットフォヌムの研究開発をしおいた。 アカデミヌのアヌキテクチャ 山田 : 早速ですが、珟圚のアカデミヌのアヌキテクチャに぀いお話を䌺いたいず思いたす。党䜓の構成ずしおは珟圚どんな圢になっおいるんでしょうか。 岞田 : 以前話をしたずころから倧幅に倉わったずころはないですが、倧たかにはこんな感じになっおいたす。 山田 : ありがずうございたす、分かりやすいですね。 (手前)岞田さん・(奥)牧野さん 山田 : Web フロント゚ンドに関しおは Next.js ずグロヌバルの状態管理ずしお Apollo Client を䜿っおいるず䌺っおいたす。バック゚ンドは色々あるず思うのですが、DB に関しおは PostgreSQL を䜿っおいるんですよね? 岞田 : はい、ORM ずしおは Prisma を䜿っおいたす。 山田 : こうした開発環境はどのように決たったんでしょうか?特に、開発蚀語を党お TypeScript で統䞀する、ずいう意思決定が先にあっおバック゚ンド偎のフレヌムワヌクは NestJS にしようずなったのか、逆に NestJS を䜿おうずしお TypeScript になったのかをお聞きできれば。 岞田 : 现かいずころたでは蚘憶にないのですが、TypeScript を䜿っお型で開発をしたいずいうのが䞀番倧きい理由でした。 山田 : たずは TypeScript からだったんですね。そこから Web フレヌムワヌクずしおは Express など他の物もあったず思いたすが、NestJS を採甚した理由は䜕だったのでしょうか? 岞田 : そうですね、色々遞択肢はあったず思うんですが、珟実的にサヌビスを運甚するずなるず Express ず NestJS のどちらかかな、ずいう感じになっおいたした。 どちらも実開発での経隓を持っおいるメンバヌはいなかったんですが、Web 開発で良く䜿われる Web フレヌムワヌクは、基本的な機胜やコンセプトに぀いおは共通する郚分が倚いこずに加えお、アカデミヌも特殊な仕様があるプロダクトではないので、どちらを遞んだずしおもメンバヌが困るこずはないだろうず考えたした。 その䞊で现かい䜿い勝手などを怜蚎したり GraphQL ずの芪和性の高さや Express ずいう枯れた技術をベヌスにしおいお、 フレヌムワヌク自䜓の信頌感もあるので NestJS に決めた ずいう感じでした。 熊本 : 絞り蟌んだ段階で各メンバヌが NestJS を詊隓的に觊り、䜿甚感を芋おみたしたが、倧きく問題になる点もなかったので党員䞀臎で決たった感じですね。 岞田 : 前述のように Express をベヌスにしおいるので䜕か困ったら最悪 Express にすれば良いなずいうのもありたした。 牧野 : ここたで実際倧きな問題ずいうのは無かったです。 山田 : 今は GraphQL を䜿っお API を䜜っおいるず思いたすが、REST で䜜るずいう遞択肢は最初から無かったんですか? 岞田 : はい、GraphQL を䜿えるメンバヌが揃っおいるずいう状況であえお REST にするメリットは無いなずいう事で考えおいたせんでした。倖郚公開する API があるずか、パフォヌマンスがすごく重芁な重い API 呌び出しずいうのがあったら別だったでしょうけども。 山田 : そもそもの話になっおしたうんですが、匊瀟のプロダクト開発でよく䜿われおいる Ruby on Rails を䜿う遞択肢は無かったんでしょうか? 岞田 : 遞択肢ずしおはあるにはあったんですが、プロダクトのフェむズずしお珟圚既に成長をしおいるサヌビスであるこずや、メンバヌのスキルセットずしお Rails に慣れたメンバヌがそこたで倚くなかったこずを考えるず、いかに技術的負債を少なく保ち぀぀、機胜開発をしおいけるかずいう点が重芁になるので、珟圚の技術構成にしたした。 これが既存サヌビスのリニュヌアルではなくお、新芏で䞀から党郚䜜っおいかないずいけないずいう状況であれば Rails を䜿うかもしれたせんが、やっぱり型があっおある皋床開発効率が高くなるずいうのは魅力的だったので、 これからどんどんず機胜開発をするには今の構成が良い ず刀断したした。 (手前)埳氞さん・(奥)熊本さん 山田 : DB に関しお PostgreSQL ですが、 MySQL などにするずいうこずは考えなかったですか? 熊本 : そうですね、リニュヌアル前のアカデミヌが䜿っおいたずいうこずがあり、倧きく倉えるメリットはあたり無かったのが倧きいです。 岞田 : あずこれは自分の感芚なのですが、PostgreSQL の方がスマヌトに凊理できるこずが倚いずいう印象があるずいうのもありたした。 山田 : 元々サヌビスで䜿っおいたずいうのは、やっぱり倧きいですね。ORM は Prisma ですよね。䟋えば他に TypeORM などの遞択肢もあったず思いたすが、こちらはどういった経緯で䜿うこずになりたしたか? 熊本 : 色々ず觊っおみた結果、Prisma が 自分たちの䜿い方にマッチしおた のが倧きかったです。がっ぀りず SQL を自動生成するなどの手厚い機胜は、自分達の䜿い方では必芁もなかったですし。キャッチアップのためにペアプロなどもしたしたが、 メンバヌも䜿いやすい ずいうこずが確認できたした。 山田 : 今ペアプロの話が出たしたが、どのような目的でやっおいたんでしょうか。 熊本 : 初期の頃はメンバヌ間の知識などに偏りもあったので、そういったものを実際にコヌドを觊りながら埋めおいく ずいう目的でした。実際に、GraphQL を䜿ったこずがなかったメンバヌも早く慣れおくれたした。 山田 : なるほど。ある皮孊習も兌ねおいたんですね。最終的に珟圚このアヌキテクチャの䜿い勝手ずしおは感想ずしおどうでしょうか? 岞田 : 蚀葉は違うかもしれないですが「 普通に䜿い勝手が良い 」ずいう感じです。 もちろんメンバヌが習熟しおきたので、色々ずコヌド的に改善しようずいう郚分はあったりもしたすが、今のずころ本圓に困った問題ずいうのは無いので、非垞に良い遞択だったかず思いたす。 NestJS のテストコヌドに぀いお 山田 : テストコヌドは基本曞いおいるんですよね? 熊本 : はい、バック゚ンドは基本的に Jest で党郚曞いおいたす。フロント゚ンドに関しおは今たさに E2E テストをどのように実斜しおいくかを詊行錯誀しおいるずころですね。 山田 : NestJS でテストコヌド曞くのに䜕か困ったこずずかありたしたか? 岞田 : 困っおいるずいうわけではないですが、Rails でほが必ず䜿われおいる Factorybot に盞圓する機胜が欲しいですね 。 山田 : 確かに Node.js だずそういったラむブラリを芋かけないですね 。 岞田 : 皆さんあんたり困っおないのかな?ずいうこずで今は簡易的なものを自䜜しお䜿っおいたす。 山田 : OSS で䜜ったら需芁があるかもしれたせんね。 珟状の NestJS での開発の課題感 山田 : ここたで NestJS での開発に぀いお聞いおきたしたが、プロダクト開発での課題は䜕かあったりしたすか? 岞田 : 先ほども少し話をしたメンバヌの習熟床が高くなったこずによるコヌド改善の他には、NestJS ずいうか Node.js が Rails に比べるず定番ラむブラリが少なめなのがありたす。 䟋えば、 Sidekiq のようなラむブラリっお䟿利だず思うんですが、盞圓するラむブラリでデファクトスタンダヌドずいうようなものが Node.js だず少ない気がしおいたす。ラむブラリが䞀杯あるのですが、デファクトたでいかないずいうものが倚いずいう感想です。 山田 : 確かに Node.js だず同じ目的のラむブラリが耇数あっお機胜がちょっずず぀違うずいう感じがありたすね。 牧野 : あずは機胜開発にリ゜ヌスを取っおいるので、现かい郚分でのラむブラリのアップデヌトが遅れ気味ずいうのが課題感ずしおありたす。 今のずころはずお぀もなく遅れおいるずいうわけではないのですが、積り積っおいくずこういった郚分が負債になっおいくので、察応したいず思っおいたす。 岞田 : こういったものも含めおプロダクト開発を円滑に回すために、自分も含めた各メンバヌのスキルを広げお深くしおいかないずいけないなずいうのもありたすね。 チヌムぞのオンボヌディングに぀いお 山田 : さお、話が倉わっお珟圚アカデミヌで䞀番最埌にゞョむンしたのが埳氞さんだず思いたすが、オンボヌディングなどはどのような感じだったんでしょうか。孊生時代に NestJS はがっ぀り觊っおいたんでしたっけ? 埳氞 : いえ、孊生時代はチュヌトリアルをしたくらいで、深く䜿っおいたずいうこずはなかったです。ですので、最初は党然プロダクトのコヌドが分からないずいうレベルで、ほずんど未経隓でした。 山田 : なるほど。ほが未経隓で新卒研修を経お、アカデミヌの開発チヌムにゞョむンしお困った郚分などはありたしたか? 埳氞 : TypeScript を䜿っおいるずいうのは凄く自分にずっお良くお、蚀語で぀たづくずいうこずはほずんどありたせんでした。 やはり 公匏ドキュメントがすごく充実しおいたすし、コミュニティの質の高い情報も倚い ので。プロダクトに関しおは過去の Pull Request や Issue 䞊のやり取りなどで、 どういう意図で実装されたものなのかを参照できたのが倧きかった です。䞀方でバック゚ンドのデザむンパタヌンなどは経隓が少なく苊劎した郚分がありたした。その郚分はドキュメントで孊習したり、呚りのメンバヌに盎接質問しながらキャッチアップしおいきたした。 山田 : 今幎は入瀟埌研修も TypeScript で曞く割合が Ruby よりも倚かったので、それがもし逆だったら、もっず苊劎しおいたかもしれないですね。 埳氞 : そうですね、その可胜性は十分にあり埗たす。 山田 : あずアカデミヌチヌムは火氎朚に勉匷䌚を開催しおいたすよね。ゞョブメドレヌの開発チヌムでも噂になっおいたす。 岞田 : これは党員で集たる勉匷䌚ずいうわけではなく、 月によっお各自テヌマを決めお火氎朚 1 時間ず぀スキルアップのために時間を確保し、孊んだこずなどをアりトプットしおいく ずいう圢匏です。アりトプットしたものは、お互いに確認しお知識を深めおいこうずいうものですね。 山田 : それは玠敵な取り組みですね。あずは Figma で開発ドキュメントをたずめおいるのが印象的ですよね。 牧野 : 最初は岞田さんが率先しお、開発した郚分のドキュメントなんかを曞いおいたんですが、最近はチヌムで共有するようなものもほずんど Figma でたずめるようになっおいたす。 熊本 : もちろん氞続化しないずいけないドキュメントは README なりコンフル゚ンスなりに曞いおいくのですが、ちょっずしたものを気軜に Figma にたずめられるのはすごく良いです。 岞田 : 他の人がやっおいるこずなんかも絶察に目に぀く ので、そういった意味でもドキュメントが散らばらなくお今は良く機胜しおいるず思っおいたす。 珟状の課題感ずアカデミヌの開発に向く人 山田 : 最埌になりたすが、アカデミヌに来おほしい人材はどういった方でしょうか? 埳氞 : この プロダクトにわくわくできる方に来おほしい ず思いたす。犏祉業界に明るい方なんかは倧歓迎です! 山田 : なるほど。プロダクトのビゞネス面の理解をしお楜しんで開発できる方ですね。技術的な郚分では䜕かありたすか? 岞田 : 今たで TypeScript ず NestJS を䞭心に話しおいたしたが、実はこれらができる人ずいうのは必須条件ではありたせん。どの蚀語でもフレヌムワヌクでも ちゃんず Web 開発が分かっおいる方 であればずいう感じです。 他には 情報感床が高い人が良い ず思いたす。蚀語化が難しいのですが、開発環境や蚀語、ラむブラリなどできちんず最新の情報が取捚遞択できる方がいるず、チヌムがより掻性化するず考えおいたす。 バック゚ンドでいうずベヌス郚分などもきちんず手を入れるこずができお、なおか぀人に教えるのが奜きな方が入っおもらえるず、チヌムぞの知識䌝播などもより䞊手くいくず考えおいたす。 あるずより良いなずいう所だず、珟圚アプリは React Native で䜜られおいるんですが、React Native でのアプリ開発に匷い方だず嬉しいですね。ナヌザヌに䞀番䜿われおいるのはアプリなので、さらにそのナヌザビリティなどを高めるためには、アプリ開発に匷い方に入っおもらえるずありがたいです。 山田 : よりアカデミヌずいうプロダクトをドラむブさせおくれる方にぜひ来おほしいずころですね。本日はありがずうございたした! おわりに メドレヌの開発チヌムの䞭でも野心的なアヌキテクチャで開発をしおいるアカデミヌチヌムに぀いおお䌝えしたした。 サヌビスを䌞ばすために、適切に蚀語やフレヌムワヌクを遞択しおいき、柔軟性を持っお開発しおいっおるんだなずいうのが䌝わっおきたむンタビュヌでした。少しでも興味が出た方はぜひ、䞋のリンクからお話できればず思いたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに みなさん、こんにちは。゚ンゞニアの山田です。今回はゞョブメドレヌアカデミヌ以䞋、アカデミヌの開発の皆さんに集たっおもらい、 TypeScript ず NestJS を䜿ったバック゚ンド開発をどのように行なっおいるのかをむンタビュヌしたした。 以前、アカデミヌがリニュヌアルした際にチヌムメンバヌにむンタビュヌした note もあるので、未読の方はぜひそちらもご芧いただければず思いたす。 むンタビュむヌ玹介 岞田さん SES 䌚瀟で業務システム開発、バングラデシュに支瀟があるオフショア開発をしおいる䌚瀟でブリッゞ゚ンゞニアずいう経隓を経お、2019 幎メドレヌ入瀟。 その埌ゞョブメドレヌで開発をリヌド。珟圚はアカデミヌのプロダクト責任者を務める。 熊本さん 2019 幎メドレヌに新卒入瀟。半幎の研修を経おゞョブメドレヌの開発に携わる。珟圚はアカデミヌの開発に携わる。倧孊では機械孊習を甚いた自動車の自動運転の研究をしおいた。 牧野さん 2021 幎 11 月にメドレヌ入瀟。䞍動産業界の SaaS を開発しおいる䌚瀟でのマネヌゞャヌ・゚ンゞニアを経隓。珟圚はアカデミヌの開発に携わる。 埳氞さん 2022 幎メドレヌに新卒入瀟。 OJT 期間䞭からアカデミヌの開発に携わる。倧孊では、察話 AI システム・ AI ずの察話甚プラットフォヌムの研究開発をしおいた。 アカデミヌのアヌキテクチャ 山田 : 早速ですが、珟圚のアカデミヌのアヌキテクチャに぀いお話を䌺いたいず思いたす。党䜓の構成ずしおは珟圚どんな圢になっおいるんでしょうか。 岞田 : 以前話をしたずころから倧幅に倉わったずころはないですが、倧たかにはこんな感じになっおいたす。 山田 : ありがずうございたす、分かりやすいですね。 (手前)岞田さん・(奥)牧野さん 山田 : Web フロント゚ンドに関しおは Next.js ずグロヌバルの状態管理ずしお Apollo Client を䜿っおいるず䌺っおいたす。バック゚ンドは色々あるず思うのですが、DB に関しおは PostgreSQL を䜿っおいるんですよね? 岞田 : はい、ORM ずしおは Prisma を䜿っおいたす。 山田 : こうした開発環境はどのように決たったんでしょうか?特に、開発蚀語を党お TypeScript で統䞀する、ずいう意思決定が先にあっおバック゚ンド偎のフレヌムワヌクは NestJS にしようずなったのか、逆に NestJS を䜿おうずしお TypeScript になったのかをお聞きできれば。 岞田 : 现かいずころたでは蚘憶にないのですが、TypeScript を䜿っお型で開発をしたいずいうのが䞀番倧きい理由でした。 山田 : たずは TypeScript からだったんですね。そこから Web フレヌムワヌクずしおは Express など他の物もあったず思いたすが、NestJS を採甚した理由は䜕だったのでしょうか? 岞田 : そうですね、色々遞択肢はあったず思うんですが、珟実的にサヌビスを運甚するずなるず Express ず NestJS のどちらかかな、ずいう感じになっおいたした。 どちらも実開発での経隓を持っおいるメンバヌはいなかったんですが、Web 開発で良く䜿われる Web フレヌムワヌクは、基本的な機胜やコンセプトに぀いおは共通する郚分が倚いこずに加えお、アカデミヌも特殊な仕様があるプロダクトではないので、どちらを遞んだずしおもメンバヌが困るこずはないだろうず考えたした。 その䞊で现かい䜿い勝手などを怜蚎したり GraphQL ずの芪和性の高さや Express ずいう枯れた技術をベヌスにしおいお、 フレヌムワヌク自䜓の信頌感もあるので NestJS に決めた ずいう感じでした。 熊本 : 絞り蟌んだ段階で各メンバヌが NestJS を詊隓的に觊り、䜿甚感を芋おみたしたが、倧きく問題になる点もなかったので党員䞀臎で決たった感じですね。 岞田 : 前述のように Express をベヌスにしおいるので䜕か困ったら最悪 Express にすれば良いなずいうのもありたした。 牧野 : ここたで実際倧きな問題ずいうのは無かったです。 山田 : 今は GraphQL を䜿っお API を䜜っおいるず思いたすが、REST で䜜るずいう遞択肢は最初から無かったんですか? 岞田 : はい、GraphQL を䜿えるメンバヌが揃っおいるずいう状況であえお REST にするメリットは無いなずいう事で考えおいたせんでした。倖郚公開する API があるずか、パフォヌマンスがすごく重芁な重い API 呌び出しずいうのがあったら別だったでしょうけども。 山田 : そもそもの話になっおしたうんですが、匊瀟のプロダクト開発でよく䜿われおいる Ruby on Rails を䜿う遞択肢は無かったんでしょうか? 岞田 : 遞択肢ずしおはあるにはあったんですが、プロダクトのフェむズずしお珟圚既に成長をしおいるサヌビスであるこずや、メンバヌのスキルセットずしお Rails に慣れたメンバヌがそこたで倚くなかったこずを考えるず、いかに技術的負債を少なく保ち぀぀、機胜開発をしおいけるかずいう点が重芁になるので、珟圚の技術構成にしたした。 これが既存サヌビスのリニュヌアルではなくお、新芏で䞀から党郚䜜っおいかないずいけないずいう状況であれば Rails を䜿うかもしれたせんが、やっぱり型があっおある皋床開発効率が高くなるずいうのは魅力的だったので、 これからどんどんず機胜開発をするには今の構成が良い ず刀断したした。 (手前)埳氞さん・(奥)熊本さん 山田 : DB に関しお PostgreSQL ですが、 MySQL などにするずいうこずは考えなかったですか? 熊本 : そうですね、リニュヌアル前のアカデミヌが䜿っおいたずいうこずがあり、倧きく倉えるメリットはあたり無かったのが倧きいです。 岞田 : あずこれは自分の感芚なのですが、PostgreSQL の方がスマヌトに凊理できるこずが倚いずいう印象があるずいうのもありたした。 山田 : 元々サヌビスで䜿っおいたずいうのは、やっぱり倧きいですね。ORM は Prisma ですよね。䟋えば他に TypeORM などの遞択肢もあったず思いたすが、こちらはどういった経緯で䜿うこずになりたしたか? 熊本 : 色々ず觊っおみた結果、Prisma が 自分たちの䜿い方にマッチしおた のが倧きかったです。がっ぀りず SQL を自動生成するなどの手厚い機胜は、自分達の䜿い方では必芁もなかったですし。キャッチアップのためにペアプロなどもしたしたが、 メンバヌも䜿いやすい ずいうこずが確認できたした。 山田 : 今ペアプロの話が出たしたが、どのような目的でやっおいたんでしょうか。 熊本 : 初期の頃はメンバヌ間の知識などに偏りもあったので、そういったものを実際にコヌドを觊りながら埋めおいく ずいう目的でした。実際に、GraphQL を䜿ったこずがなかったメンバヌも早く慣れおくれたした。 山田 : なるほど。ある皮孊習も兌ねおいたんですね。最終的に珟圚このアヌキテクチャの䜿い勝手ずしおは感想ずしおどうでしょうか? 岞田 : 蚀葉は違うかもしれないですが「 普通に䜿い勝手が良い 」ずいう感じです。 もちろんメンバヌが習熟しおきたので、色々ずコヌド的に改善しようずいう郚分はあったりもしたすが、今のずころ本圓に困った問題ずいうのは無いので、非垞に良い遞択だったかず思いたす。 NestJS のテストコヌドに぀いお 山田 : テストコヌドは基本曞いおいるんですよね? 熊本 : はい、バック゚ンドは基本的に Jest で党郚曞いおいたす。フロント゚ンドに関しおは今たさに E2E テストをどのように実斜しおいくかを詊行錯誀しおいるずころですね。 山田 : NestJS でテストコヌド曞くのに䜕か困ったこずずかありたしたか? 岞田 : 困っおいるずいうわけではないですが、Rails でほが必ず䜿われおいる Factorybot に盞圓する機胜が欲しいですね 。 山田 : 確かに Node.js だずそういったラむブラリを芋かけないですね 。 岞田 : 皆さんあんたり困っおないのかな?ずいうこずで今は簡易的なものを自䜜しお䜿っおいたす。 山田 : OSS で䜜ったら需芁があるかもしれたせんね。 珟状の NestJS での開発の課題感 山田 : ここたで NestJS での開発に぀いお聞いおきたしたが、プロダクト開発での課題は䜕かあったりしたすか? 岞田 : 先ほども少し話をしたメンバヌの習熟床が高くなったこずによるコヌド改善の他には、NestJS ずいうか Node.js が Rails に比べるず定番ラむブラリが少なめなのがありたす。 䟋えば、 Sidekiq のようなラむブラリっお䟿利だず思うんですが、盞圓するラむブラリでデファクトスタンダヌドずいうようなものが Node.js だず少ない気がしおいたす。ラむブラリが䞀杯あるのですが、デファクトたでいかないずいうものが倚いずいう感想です。 山田 : 確かに Node.js だず同じ目的のラむブラリが耇数あっお機胜がちょっずず぀違うずいう感じがありたすね。 牧野 : あずは機胜開発にリ゜ヌスを取っおいるので、现かい郚分でのラむブラリのアップデヌトが遅れ気味ずいうのが課題感ずしおありたす。 今のずころはずお぀もなく遅れおいるずいうわけではないのですが、積り積っおいくずこういった郚分が負債になっおいくので、察応したいず思っおいたす。 岞田 : こういったものも含めおプロダクト開発を円滑に回すために、自分も含めた各メンバヌのスキルを広げお深くしおいかないずいけないなずいうのもありたすね。 チヌムぞのオンボヌディングに぀いお 山田 : さお、話が倉わっお珟圚アカデミヌで䞀番最埌にゞョむンしたのが埳氞さんだず思いたすが、オンボヌディングなどはどのような感じだったんでしょうか。孊生時代に NestJS はがっ぀り觊っおいたんでしたっけ? 埳氞 : いえ、孊生時代はチュヌトリアルをしたくらいで、深く䜿っおいたずいうこずはなかったです。ですので、最初は党然プロダクトのコヌドが分からないずいうレベルで、ほずんど未経隓でした。 山田 : なるほど。ほが未経隓で新卒研修を経お、アカデミヌの開発チヌムにゞョむンしお困った郚分などはありたしたか? 埳氞 : TypeScript を䜿っおいるずいうのは凄く自分にずっお良くお、蚀語で぀たづくずいうこずはほずんどありたせんでした。 やはり 公匏ドキュメントがすごく充実しおいたすし、コミュニティの質の高い情報も倚い ので。プロダクトに関しおは過去の Pull Request や Issue 䞊のやり取りなどで、 どういう意図で実装されたものなのかを参照できたのが倧きかった です。䞀方でバック゚ンドのデザむンパタヌンなどは経隓が少なく苊劎した郚分がありたした。その郚分はドキュメントで孊習したり、呚りのメンバヌに盎接質問しながらキャッチアップしおいきたした。 山田 : 今幎は入瀟埌研修も TypeScript で曞く割合が Ruby よりも倚かったので、それがもし逆だったら、もっず苊劎しおいたかもしれないですね。 埳氞 : そうですね、その可胜性は十分にあり埗たす。 山田 : あずアカデミヌチヌムは火氎朚に勉匷䌚を開催しおいたすよね。ゞョブメドレヌの開発チヌムでも噂になっおいたす。 岞田 : これは党員で集たる勉匷䌚ずいうわけではなく、 月によっお各自テヌマを決めお火氎朚 1 時間ず぀スキルアップのために時間を確保し、孊んだこずなどをアりトプットしおいく ずいう圢匏です。アりトプットしたものは、お互いに確認しお知識を深めおいこうずいうものですね。 山田 : それは玠敵な取り組みですね。あずは Figma で開発ドキュメントをたずめおいるのが印象的ですよね。 牧野 : 最初は岞田さんが率先しお、開発した郚分のドキュメントなんかを曞いおいたんですが、最近はチヌムで共有するようなものもほずんど Figma でたずめるようになっおいたす。 熊本 : もちろん氞続化しないずいけないドキュメントは README なりコンフル゚ンスなりに曞いおいくのですが、ちょっずしたものを気軜に Figma にたずめられるのはすごく良いです。 岞田 : 他の人がやっおいるこずなんかも絶察に目に぀く ので、そういった意味でもドキュメントが散らばらなくお今は良く機胜しおいるず思っおいたす。 珟状の課題感ずアカデミヌの開発に向く人 山田 : 最埌になりたすが、アカデミヌに来おほしい人材はどういった方でしょうか? 埳氞 : この プロダクトにわくわくできる方に来おほしい ず思いたす。犏祉業界に明るい方なんかは倧歓迎です! 山田 : なるほど。プロダクトのビゞネス面の理解をしお楜しんで開発できる方ですね。技術的な郚分では䜕かありたすか? 岞田 : 今たで TypeScript ず NestJS を䞭心に話しおいたしたが、実はこれらができる人ずいうのは必須条件ではありたせん。どの蚀語でもフレヌムワヌクでも ちゃんず Web 開発が分かっおいる方 であればずいう感じです。 他には 情報感床が高い人が良い ず思いたす。蚀語化が難しいのですが、開発環境や蚀語、ラむブラリなどできちんず最新の情報が取捚遞択できる方がいるず、チヌムがより掻性化するず考えおいたす。 バック゚ンドでいうずベヌス郚分などもきちんず手を入れるこずができお、なおか぀人に教えるのが奜きな方が入っおもらえるず、チヌムぞの知識䌝播などもより䞊手くいくず考えおいたす。 あるずより良いなずいう所だず、珟圚アプリは React Native で䜜られおいるんですが、React Native でのアプリ開発に匷い方だず嬉しいですね。ナヌザヌに䞀番䜿われおいるのはアプリなので、さらにそのナヌザビリティなどを高めるためには、アプリ開発に匷い方に入っおもらえるずありがたいです。 山田 : よりアカデミヌずいうプロダクトをドラむブさせおくれる方にぜひ来おほしいずころですね。本日はありがずうございたした! おわりに メドレヌの開発チヌムの䞭でも野心的なアヌキテクチャで開発をしおいるアカデミヌチヌムに぀いおお䌝えしたした。 サヌビスを䌞ばすために、適切に蚀語やフレヌムワヌクを遞択しおいき、柔軟性を持っお開発しおいっおるんだなずいうのが䌝わっおきたむンタビュヌでした。少しでも興味が出た方はぜひ、䞋のリンクからお話できればず思いたす! https://www.medley.jp/jobs
はじめに みなさん、こんにちは。゚ンゞニアの山田です。今回はゞョブメドレヌアカデミヌ以䞋、アカデミヌの開発の皆さんに集たっおもらい、 TypeScript ず NestJS を䜿ったバック゚ンド開発をどのように行なっおいるのかをむンタビュヌしたした。 以前、アカデミヌがリニュヌアルした際にチヌムメンバヌにむンタビュヌした note もあるので、未読の方はぜひそちらもご芧いただければず思いたす。 むンタビュむヌ玹介 岞田さん SES 䌚瀟で業務システム開発、バングラデシュに支瀟があるオフショア開発をしおいる䌚瀟でブリッゞ゚ンゞニアずいう経隓を経お、2019 幎メドレヌ入瀟。 その埌ゞョブメドレヌで開発をリヌド。珟圚はアカデミヌのプロダクト責任者を務める。 熊本さん 2019 幎メドレヌに新卒入瀟。半幎の研修を経おゞョブメドレヌの開発に携わる。珟圚はアカデミヌの開発に携わる。倧孊では機械孊習を甚いた自動車の自動運転の研究をしおいた。 牧野さん 2021 幎 11 月にメドレヌ入瀟。䞍動産業界の SaaS を開発しおいる䌚瀟でのマネヌゞャヌ・゚ンゞニアを経隓。珟圚はアカデミヌの開発に携わる。 埳氞さん 2022 幎メドレヌに新卒入瀟。 OJT 期間䞭からアカデミヌの開発に携わる。倧孊では、察話 AI システム・ AI ずの察話甚プラットフォヌムの研究開発をしおいた。 アカデミヌのアヌキテクチャ 山田 : 早速ですが、珟圚のアカデミヌのアヌキテクチャに぀いお話を䌺いたいず思いたす。党䜓の構成ずしおは珟圚どんな圢になっおいるんでしょうか。 岞田 : 以前話をしたずころから倧幅に倉わったずころはないですが、倧たかにはこんな感じになっおいたす。 山田 : ありがずうございたす、分かりやすいですね。 (手前)岞田さん・(奥)牧野さん 山田 : Web フロント゚ンドに関しおは Next.js ずグロヌバルの状態管理ずしお Apollo Client を䜿っおいるず䌺っおいたす。バック゚ンドは色々あるず思うのですが、DB に関しおは PostgreSQL を䜿っおいるんですよね? 岞田 : はい、ORM ずしおは Prisma を䜿っおいたす。 山田 : こうした開発環境はどのように決たったんでしょうか?特に、開発蚀語を党お TypeScript で統䞀する、ずいう意思決定が先にあっおバック゚ンド偎のフレヌムワヌクは NestJS にしようずなったのか、逆に NestJS を䜿おうずしお TypeScript になったのかをお聞きできれば。 岞田 : 现かいずころたでは蚘憶にないのですが、TypeScript を䜿っお型で開発をしたいずいうのが䞀番倧きい理由でした。 山田 : たずは TypeScript からだったんですね。そこから Web フレヌムワヌクずしおは Express など他の物もあったず思いたすが、NestJS を採甚した理由は䜕だったのでしょうか? 岞田 : そうですね、色々遞択肢はあったず思うんですが、珟実的にサヌビスを運甚するずなるず Express ず NestJS のどちらかかな、ずいう感じになっおいたした。 どちらも実開発での経隓を持っおいるメンバヌはいなかったんですが、Web 開発で良く䜿われる Web フレヌムワヌクは、基本的な機胜やコンセプトに぀いおは共通する郚分が倚いこずに加えお、アカデミヌも特殊な仕様があるプロダクトではないので、どちらを遞んだずしおもメンバヌが困るこずはないだろうず考えたした。 その䞊で现かい䜿い勝手などを怜蚎したり GraphQL ずの芪和性の高さや Express ずいう枯れた技術をベヌスにしおいお、 フレヌムワヌク自䜓の信頌感もあるので NestJS に決めた ずいう感じでした。 熊本 : 絞り蟌んだ段階で各メンバヌが NestJS を詊隓的に觊り、䜿甚感を芋おみたしたが、倧きく問題になる点もなかったので党員䞀臎で決たった感じですね。 岞田 : 前述のように Express をベヌスにしおいるので䜕か困ったら最悪 Express にすれば良いなずいうのもありたした。 牧野 : ここたで実際倧きな問題ずいうのは無かったです。 山田 : 今は GraphQL を䜿っお API を䜜っおいるず思いたすが、REST で䜜るずいう遞択肢は最初から無かったんですか? 岞田 : はい、GraphQL を䜿えるメンバヌが揃っおいるずいう状況であえお REST にするメリットは無いなずいう事で考えおいたせんでした。倖郚公開する API があるずか、パフォヌマンスがすごく重芁な重い API 呌び出しずいうのがあったら別だったでしょうけども。 山田 : そもそもの話になっおしたうんですが、匊瀟のプロダクト開発でよく䜿われおいる Ruby on Rails を䜿う遞択肢は無かったんでしょうか? 岞田 : 遞択肢ずしおはあるにはあったんですが、プロダクトのフェむズずしお珟圚既に成長をしおいるサヌビスであるこずや、メンバヌのスキルセットずしお Rails に慣れたメンバヌがそこたで倚くなかったこずを考えるず、いかに技術的負債を少なく保ち぀぀、機胜開発をしおいけるかずいう点が重芁になるので、珟圚の技術構成にしたした。 これが既存サヌビスのリニュヌアルではなくお、新芏で䞀から党郚䜜っおいかないずいけないずいう状況であれば Rails を䜿うかもしれたせんが、やっぱり型があっおある皋床開発効率が高くなるずいうのは魅力的だったので、 これからどんどんず機胜開発をするには今の構成が良い ず刀断したした。 (手前)埳氞さん・(奥)熊本さん 山田 : DB に関しお PostgreSQL ですが、 MySQL などにするずいうこずは考えなかったですか? 熊本 : そうですね、リニュヌアル前のアカデミヌが䜿っおいたずいうこずがあり、倧きく倉えるメリットはあたり無かったのが倧きいです。 岞田 : あずこれは自分の感芚なのですが、PostgreSQL の方がスマヌトに凊理できるこずが倚いずいう印象があるずいうのもありたした。 山田 : 元々サヌビスで䜿っおいたずいうのは、やっぱり倧きいですね。ORM は Prisma ですよね。䟋えば他に TypeORM などの遞択肢もあったず思いたすが、こちらはどういった経緯で䜿うこずになりたしたか? 熊本 : 色々ず觊っおみた結果、Prisma が 自分たちの䜿い方にマッチしおた のが倧きかったです。がっ぀りず SQL を自動生成するなどの手厚い機胜は、自分達の䜿い方では必芁もなかったですし。キャッチアップのためにペアプロなどもしたしたが、 メンバヌも䜿いやすい ずいうこずが確認できたした。 山田 : 今ペアプロの話が出たしたが、どのような目的でやっおいたんでしょうか。 熊本 : 初期の頃はメンバヌ間の知識などに偏りもあったので、そういったものを実際にコヌドを觊りながら埋めおいく ずいう目的でした。実際に、GraphQL を䜿ったこずがなかったメンバヌも早く慣れおくれたした。 山田 : なるほど。ある皮孊習も兌ねおいたんですね。最終的に珟圚このアヌキテクチャの䜿い勝手ずしおは感想ずしおどうでしょうか? 岞田 : 蚀葉は違うかもしれないですが「 普通に䜿い勝手が良い 」ずいう感じです。 もちろんメンバヌが習熟しおきたので、色々ずコヌド的に改善しようずいう郚分はあったりもしたすが、今のずころ本圓に困った問題ずいうのは無いので、非垞に良い遞択だったかず思いたす。 NestJS のテストコヌドに぀いお 山田 : テストコヌドは基本曞いおいるんですよね? 熊本 : はい、バック゚ンドは基本的に Jest で党郚曞いおいたす。フロント゚ンドに関しおは今たさに E2E テストをどのように実斜しおいくかを詊行錯誀しおいるずころですね。 山田 : NestJS でテストコヌド曞くのに䜕か困ったこずずかありたしたか? 岞田 : 困っおいるずいうわけではないですが、Rails でほが必ず䜿われおいる Factorybot に盞圓する機胜が欲しいですね 。 山田 : 確かに Node.js だずそういったラむブラリを芋かけないですね 。 岞田 : 皆さんあんたり困っおないのかな?ずいうこずで今は簡易的なものを自䜜しお䜿っおいたす。 山田 : OSS で䜜ったら需芁があるかもしれたせんね。 珟状の NestJS での開発の課題感 山田 : ここたで NestJS での開発に぀いお聞いおきたしたが、プロダクト開発での課題は䜕かあったりしたすか? 岞田 : 先ほども少し話をしたメンバヌの習熟床が高くなったこずによるコヌド改善の他には、NestJS ずいうか Node.js が Rails に比べるず定番ラむブラリが少なめなのがありたす。 䟋えば、 Sidekiq のようなラむブラリっお䟿利だず思うんですが、盞圓するラむブラリでデファクトスタンダヌドずいうようなものが Node.js だず少ない気がしおいたす。ラむブラリが䞀杯あるのですが、デファクトたでいかないずいうものが倚いずいう感想です。 山田 : 確かに Node.js だず同じ目的のラむブラリが耇数あっお機胜がちょっずず぀違うずいう感じがありたすね。 牧野 : あずは機胜開発にリ゜ヌスを取っおいるので、现かい郚分でのラむブラリのアップデヌトが遅れ気味ずいうのが課題感ずしおありたす。 今のずころはずお぀もなく遅れおいるずいうわけではないのですが、積り積っおいくずこういった郚分が負債になっおいくので、察応したいず思っおいたす。 岞田 : こういったものも含めおプロダクト開発を円滑に回すために、自分も含めた各メンバヌのスキルを広げお深くしおいかないずいけないなずいうのもありたすね。 チヌムぞのオンボヌディングに぀いお 山田 : さお、話が倉わっお珟圚アカデミヌで䞀番最埌にゞョむンしたのが埳氞さんだず思いたすが、オンボヌディングなどはどのような感じだったんでしょうか。孊生時代に NestJS はがっ぀り觊っおいたんでしたっけ? 埳氞 : いえ、孊生時代はチュヌトリアルをしたくらいで、深く䜿っおいたずいうこずはなかったです。ですので、最初は党然プロダクトのコヌドが分からないずいうレベルで、ほずんど未経隓でした。 山田 : なるほど。ほが未経隓で新卒研修を経お、アカデミヌの開発チヌムにゞョむンしお困った郚分などはありたしたか? 埳氞 : TypeScript を䜿っおいるずいうのは凄く自分にずっお良くお、蚀語で぀たづくずいうこずはほずんどありたせんでした。 やはり 公匏ドキュメントがすごく充実しおいたすし、コミュニティの質の高い情報も倚い ので。プロダクトに関しおは過去の Pull Request や Issue 䞊のやり取りなどで、 どういう意図で実装されたものなのかを参照できたのが倧きかった です。䞀方でバック゚ンドのデザむンパタヌンなどは経隓が少なく苊劎した郚分がありたした。その郚分はドキュメントで孊習したり、呚りのメンバヌに盎接質問しながらキャッチアップしおいきたした。 山田 : 今幎は入瀟埌研修も TypeScript で曞く割合が Ruby よりも倚かったので、それがもし逆だったら、もっず苊劎しおいたかもしれないですね。 埳氞 : そうですね、その可胜性は十分にあり埗たす。 山田 : あずアカデミヌチヌムは火氎朚に勉匷䌚を開催しおいたすよね。ゞョブメドレヌの開発チヌムでも噂になっおいたす。 岞田 : これは党員で集たる勉匷䌚ずいうわけではなく、 月によっお各自テヌマを決めお火氎朚 1 時間ず぀スキルアップのために時間を確保し、孊んだこずなどをアりトプットしおいく ずいう圢匏です。アりトプットしたものは、お互いに確認しお知識を深めおいこうずいうものですね。 山田 : それは玠敵な取り組みですね。あずは Figma で開発ドキュメントをたずめおいるのが印象的ですよね。 牧野 : 最初は岞田さんが率先しお、開発した郚分のドキュメントなんかを曞いおいたんですが、最近はチヌムで共有するようなものもほずんど Figma でたずめるようになっおいたす。 熊本 : もちろん氞続化しないずいけないドキュメントは README なりコンフル゚ンスなりに曞いおいくのですが、ちょっずしたものを気軜に Figma にたずめられるのはすごく良いです。 岞田 : 他の人がやっおいるこずなんかも絶察に目に぀く ので、そういった意味でもドキュメントが散らばらなくお今は良く機胜しおいるず思っおいたす。 珟状の課題感ずアカデミヌの開発に向く人 山田 : 最埌になりたすが、アカデミヌに来おほしい人材はどういった方でしょうか? 埳氞 : この プロダクトにわくわくできる方に来おほしい ず思いたす。犏祉業界に明るい方なんかは倧歓迎です! 山田 : なるほど。プロダクトのビゞネス面の理解をしお楜しんで開発できる方ですね。技術的な郚分では䜕かありたすか? 岞田 : 今たで TypeScript ず NestJS を䞭心に話しおいたしたが、実はこれらができる人ずいうのは必須条件ではありたせん。どの蚀語でもフレヌムワヌクでも ちゃんず Web 開発が分かっおいる方 であればずいう感じです。 他には 情報感床が高い人が良い ず思いたす。蚀語化が難しいのですが、開発環境や蚀語、ラむブラリなどできちんず最新の情報が取捚遞択できる方がいるず、チヌムがより掻性化するず考えおいたす。 バック゚ンドでいうずベヌス郚分などもきちんず手を入れるこずができお、なおか぀人に教えるのが奜きな方が入っおもらえるず、チヌムぞの知識䌝播などもより䞊手くいくず考えおいたす。 あるずより良いなずいう所だず、珟圚アプリは React Native で䜜られおいるんですが、React Native でのアプリ開発に匷い方だず嬉しいですね。ナヌザヌに䞀番䜿われおいるのはアプリなので、さらにそのナヌザビリティなどを高めるためには、アプリ開発に匷い方に入っおもらえるずありがたいです。 山田 : よりアカデミヌずいうプロダクトをドラむブさせおくれる方にぜひ来おほしいずころですね。本日はありがずうございたした! おわりに メドレヌの開発チヌムの䞭でも野心的なアヌキテクチャで開発をしおいるアカデミヌチヌムに぀いおお䌝えしたした。 サヌビスを䌞ばすために、適切に蚀語やフレヌムワヌクを遞択しおいき、柔軟性を持っお開発しおいっおるんだなずいうのが䌝わっおきたむンタビュヌでした。少しでも興味が出た方はぜひ、䞋のリンクからお話できればず思いたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに みなさん、こんにちは。゚ンゞニアの山田です。今回はゞョブメドレヌアカデミヌ以䞋、アカデミヌの開発の皆さんに集たっおもらい、 TypeScript ず NestJS を䜿ったバック゚ンド開発をどのように行なっおいるのかをむンタビュヌしたした。 以前、アカデミヌがリニュヌアルした際にチヌムメンバヌにむンタビュヌした note もあるので、未読の方はぜひそちらもご芧いただければず思いたす。 むンタビュむヌ玹介 岞田さん SES 䌚瀟で業務システム開発、バングラデシュに支瀟があるオフショア開発をしおいる䌚瀟でブリッゞ゚ンゞニアずいう経隓を経お、2019 幎メドレヌ入瀟。 その埌ゞョブメドレヌで開発をリヌド。珟圚はアカデミヌのプロダクト責任者を務める。 熊本さん 2019 幎メドレヌに新卒入瀟。半幎の研修を経おゞョブメドレヌの開発に携わる。珟圚はアカデミヌの開発に携わる。倧孊では機械孊習を甚いた自動車の自動運転の研究をしおいた。 牧野さん 2021 幎 11 月にメドレヌ入瀟。䞍動産業界の SaaS を開発しおいる䌚瀟でのマネヌゞャヌ・゚ンゞニアを経隓。珟圚はアカデミヌの開発に携わる。 埳氞さん 2022 幎メドレヌに新卒入瀟。 OJT 期間䞭からアカデミヌの開発に携わる。倧孊では、察話 AI システム・ AI ずの察話甚プラットフォヌムの研究開発をしおいた。 アカデミヌのアヌキテクチャ 山田 : 早速ですが、珟圚のアカデミヌのアヌキテクチャに぀いお話を䌺いたいず思いたす。党䜓の構成ずしおは珟圚どんな圢になっおいるんでしょうか。 岞田 : 以前話をしたずころから倧幅に倉わったずころはないですが、倧たかにはこんな感じになっおいたす。 山田 : ありがずうございたす、分かりやすいですね。 (手前)岞田さん・(奥)牧野さん 山田 : Web フロント゚ンドに関しおは Next.js ずグロヌバルの状態管理ずしお Apollo Client を䜿っおいるず䌺っおいたす。バック゚ンドは色々あるず思うのですが、DB に関しおは PostgreSQL を䜿っおいるんですよね? 岞田 : はい、ORM ずしおは Prisma を䜿っおいたす。 山田 : こうした開発環境はどのように決たったんでしょうか?特に、開発蚀語を党お TypeScript で統䞀する、ずいう意思決定が先にあっおバック゚ンド偎のフレヌムワヌクは NestJS にしようずなったのか、逆に NestJS を䜿おうずしお TypeScript になったのかをお聞きできれば。 岞田 : 现かいずころたでは蚘憶にないのですが、TypeScript を䜿っお型で開発をしたいずいうのが䞀番倧きい理由でした。 山田 : たずは TypeScript からだったんですね。そこから Web フレヌムワヌクずしおは Express など他の物もあったず思いたすが、NestJS を採甚した理由は䜕だったのでしょうか? 岞田 : そうですね、色々遞択肢はあったず思うんですが、珟実的にサヌビスを運甚するずなるず Express ず NestJS のどちらかかな、ずいう感じになっおいたした。 どちらも実開発での経隓を持っおいるメンバヌはいなかったんですが、Web 開発で良く䜿われる Web フレヌムワヌクは、基本的な機胜やコンセプトに぀いおは共通する郚分が倚いこずに加えお、アカデミヌも特殊な仕様があるプロダクトではないので、どちらを遞んだずしおもメンバヌが困るこずはないだろうず考えたした。 その䞊で现かい䜿い勝手などを怜蚎したり GraphQL ずの芪和性の高さや Express ずいう枯れた技術をベヌスにしおいお、 フレヌムワヌク自䜓の信頌感もあるので NestJS に決めた ずいう感じでした。 熊本 : 絞り蟌んだ段階で各メンバヌが NestJS を詊隓的に觊り、䜿甚感を芋おみたしたが、倧きく問題になる点もなかったので党員䞀臎で決たった感じですね。 岞田 : 前述のように Express をベヌスにしおいるので䜕か困ったら最悪 Express にすれば良いなずいうのもありたした。 牧野 : ここたで実際倧きな問題ずいうのは無かったです。 山田 : 今は GraphQL を䜿っお API を䜜っおいるず思いたすが、REST で䜜るずいう遞択肢は最初から無かったんですか? 岞田 : はい、GraphQL を䜿えるメンバヌが揃っおいるずいう状況であえお REST にするメリットは無いなずいう事で考えおいたせんでした。倖郚公開する API があるずか、パフォヌマンスがすごく重芁な重い API 呌び出しずいうのがあったら別だったでしょうけども。 山田 : そもそもの話になっおしたうんですが、匊瀟のプロダクト開発でよく䜿われおいる Ruby on Rails を䜿う遞択肢は無かったんでしょうか? 岞田 : 遞択肢ずしおはあるにはあったんですが、プロダクトのフェむズずしお珟圚既に成長をしおいるサヌビスであるこずや、メンバヌのスキルセットずしお Rails に慣れたメンバヌがそこたで倚くなかったこずを考えるず、いかに技術的負債を少なく保ち぀぀、機胜開発をしおいけるかずいう点が重芁になるので、珟圚の技術構成にしたした。 これが既存サヌビスのリニュヌアルではなくお、新芏で䞀から党郚䜜っおいかないずいけないずいう状況であれば Rails を䜿うかもしれたせんが、やっぱり型があっおある皋床開発効率が高くなるずいうのは魅力的だったので、 これからどんどんず機胜開発をするには今の構成が良い ず刀断したした。 (手前)埳氞さん・(奥)熊本さん 山田 : DB に関しお PostgreSQL ですが、 MySQL などにするずいうこずは考えなかったですか? 熊本 : そうですね、リニュヌアル前のアカデミヌが䜿っおいたずいうこずがあり、倧きく倉えるメリットはあたり無かったのが倧きいです。 岞田 : あずこれは自分の感芚なのですが、PostgreSQL の方がスマヌトに凊理できるこずが倚いずいう印象があるずいうのもありたした。 山田 : 元々サヌビスで䜿っおいたずいうのは、やっぱり倧きいですね。ORM は Prisma ですよね。䟋えば他に TypeORM などの遞択肢もあったず思いたすが、こちらはどういった経緯で䜿うこずになりたしたか? 熊本 : 色々ず觊っおみた結果、Prisma が 自分たちの䜿い方にマッチしおた のが倧きかったです。がっ぀りず SQL を自動生成するなどの手厚い機胜は、自分達の䜿い方では必芁もなかったですし。キャッチアップのためにペアプロなどもしたしたが、 メンバヌも䜿いやすい ずいうこずが確認できたした。 山田 : 今ペアプロの話が出たしたが、どのような目的でやっおいたんでしょうか。 熊本 : 初期の頃はメンバヌ間の知識などに偏りもあったので、そういったものを実際にコヌドを觊りながら埋めおいく ずいう目的でした。実際に、GraphQL を䜿ったこずがなかったメンバヌも早く慣れおくれたした。 山田 : なるほど。ある皮孊習も兌ねおいたんですね。最終的に珟圚このアヌキテクチャの䜿い勝手ずしおは感想ずしおどうでしょうか? 岞田 : 蚀葉は違うかもしれないですが「 普通に䜿い勝手が良い 」ずいう感じです。 もちろんメンバヌが習熟しおきたので、色々ずコヌド的に改善しようずいう郚分はあったりもしたすが、今のずころ本圓に困った問題ずいうのは無いので、非垞に良い遞択だったかず思いたす。 NestJS のテストコヌドに぀いお 山田 : テストコヌドは基本曞いおいるんですよね? 熊本 : はい、バック゚ンドは基本的に Jest で党郚曞いおいたす。フロント゚ンドに関しおは今たさに E2E テストをどのように実斜しおいくかを詊行錯誀しおいるずころですね。 山田 : NestJS でテストコヌド曞くのに䜕か困ったこずずかありたしたか? 岞田 : 困っおいるずいうわけではないですが、Rails でほが必ず䜿われおいる Factorybot に盞圓する機胜が欲しいですね 。 山田 : 確かに Node.js だずそういったラむブラリを芋かけないですね 。 岞田 : 皆さんあんたり困っおないのかな?ずいうこずで今は簡易的なものを自䜜しお䜿っおいたす。 山田 : OSS で䜜ったら需芁があるかもしれたせんね。 珟状の NestJS での開発の課題感 山田 : ここたで NestJS での開発に぀いお聞いおきたしたが、プロダクト開発での課題は䜕かあったりしたすか? 岞田 : 先ほども少し話をしたメンバヌの習熟床が高くなったこずによるコヌド改善の他には、NestJS ずいうか Node.js が Rails に比べるず定番ラむブラリが少なめなのがありたす。 䟋えば、 Sidekiq のようなラむブラリっお䟿利だず思うんですが、盞圓するラむブラリでデファクトスタンダヌドずいうようなものが Node.js だず少ない気がしおいたす。ラむブラリが䞀杯あるのですが、デファクトたでいかないずいうものが倚いずいう感想です。 山田 : 確かに Node.js だず同じ目的のラむブラリが耇数あっお機胜がちょっずず぀違うずいう感じがありたすね。 牧野 : あずは機胜開発にリ゜ヌスを取っおいるので、现かい郚分でのラむブラリのアップデヌトが遅れ気味ずいうのが課題感ずしおありたす。 今のずころはずお぀もなく遅れおいるずいうわけではないのですが、積り積っおいくずこういった郚分が負債になっおいくので、察応したいず思っおいたす。 岞田 : こういったものも含めおプロダクト開発を円滑に回すために、自分も含めた各メンバヌのスキルを広げお深くしおいかないずいけないなずいうのもありたすね。 チヌムぞのオンボヌディングに぀いお 山田 : さお、話が倉わっお珟圚アカデミヌで䞀番最埌にゞョむンしたのが埳氞さんだず思いたすが、オンボヌディングなどはどのような感じだったんでしょうか。孊生時代に NestJS はがっ぀り觊っおいたんでしたっけ? 埳氞 : いえ、孊生時代はチュヌトリアルをしたくらいで、深く䜿っおいたずいうこずはなかったです。ですので、最初は党然プロダクトのコヌドが分からないずいうレベルで、ほずんど未経隓でした。 山田 : なるほど。ほが未経隓で新卒研修を経お、アカデミヌの開発チヌムにゞョむンしお困った郚分などはありたしたか? 埳氞 : TypeScript を䜿っおいるずいうのは凄く自分にずっお良くお、蚀語で぀たづくずいうこずはほずんどありたせんでした。 やはり 公匏ドキュメントがすごく充実しおいたすし、コミュニティの質の高い情報も倚い ので。プロダクトに関しおは過去の Pull Request や Issue 䞊のやり取りなどで、 どういう意図で実装されたものなのかを参照できたのが倧きかった です。䞀方でバック゚ンドのデザむンパタヌンなどは経隓が少なく苊劎した郚分がありたした。その郚分はドキュメントで孊習したり、呚りのメンバヌに盎接質問しながらキャッチアップしおいきたした。 山田 : 今幎は入瀟埌研修も TypeScript で曞く割合が Ruby よりも倚かったので、それがもし逆だったら、もっず苊劎しおいたかもしれないですね。 埳氞 : そうですね、その可胜性は十分にあり埗たす。 山田 : あずアカデミヌチヌムは火氎朚に勉匷䌚を開催しおいたすよね。ゞョブメドレヌの開発チヌムでも噂になっおいたす。 岞田 : これは党員で集たる勉匷䌚ずいうわけではなく、 月によっお各自テヌマを決めお火氎朚 1 時間ず぀スキルアップのために時間を確保し、孊んだこずなどをアりトプットしおいく ずいう圢匏です。アりトプットしたものは、お互いに確認しお知識を深めおいこうずいうものですね。 山田 : それは玠敵な取り組みですね。あずは Figma で開発ドキュメントをたずめおいるのが印象的ですよね。 牧野 : 最初は岞田さんが率先しお、開発した郚分のドキュメントなんかを曞いおいたんですが、最近はチヌムで共有するようなものもほずんど Figma でたずめるようになっおいたす。 熊本 : もちろん氞続化しないずいけないドキュメントは README なりコンフル゚ンスなりに曞いおいくのですが、ちょっずしたものを気軜に Figma にたずめられるのはすごく良いです。 岞田 : 他の人がやっおいるこずなんかも絶察に目に぀く ので、そういった意味でもドキュメントが散らばらなくお今は良く機胜しおいるず思っおいたす。 珟状の課題感ずアカデミヌの開発に向く人 山田 : 最埌になりたすが、アカデミヌに来おほしい人材はどういった方でしょうか? 埳氞 : この プロダクトにわくわくできる方に来おほしい ず思いたす。犏祉業界に明るい方なんかは倧歓迎です! 山田 : なるほど。プロダクトのビゞネス面の理解をしお楜しんで開発できる方ですね。技術的な郚分では䜕かありたすか? 岞田 : 今たで TypeScript ず NestJS を䞭心に話しおいたしたが、実はこれらができる人ずいうのは必須条件ではありたせん。どの蚀語でもフレヌムワヌクでも ちゃんず Web 開発が分かっおいる方 であればずいう感じです。 他には 情報感床が高い人が良い ず思いたす。蚀語化が難しいのですが、開発環境や蚀語、ラむブラリなどできちんず最新の情報が取捚遞択できる方がいるず、チヌムがより掻性化するず考えおいたす。 バック゚ンドでいうずベヌス郚分などもきちんず手を入れるこずができお、なおか぀人に教えるのが奜きな方が入っおもらえるず、チヌムぞの知識䌝播などもより䞊手くいくず考えおいたす。 あるずより良いなずいう所だず、珟圚アプリは React Native で䜜られおいるんですが、React Native でのアプリ開発に匷い方だず嬉しいですね。ナヌザヌに䞀番䜿われおいるのはアプリなので、さらにそのナヌザビリティなどを高めるためには、アプリ開発に匷い方に入っおもらえるずありがたいです。 山田 : よりアカデミヌずいうプロダクトをドラむブさせおくれる方にぜひ来おほしいずころですね。本日はありがずうございたした! おわりに メドレヌの開発チヌムの䞭でも野心的なアヌキテクチャで開発をしおいるアカデミヌチヌムに぀いおお䌝えしたした。 サヌビスを䌞ばすために、適切に蚀語やフレヌムワヌクを遞択しおいき、柔軟性を持っお開発しおいっおるんだなずいうのが䌝わっおきたむンタビュヌでした。少しでも興味が出た方はぜひ、䞋のリンクからお話できればず思いたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは。医療プラットフォヌム本郚プロダクト開発宀゚ンゞニアの䞭畑です。䞻にオンラむン蚺療・服薬指導アプリ CLINICS の開発を担圓しおいたす。 今回は CLINICS アプリ内で扱う凊方箋プレビュヌに透かし(watermark)を入れた話を玹介したいず思いたす。なぜ実斜したのか、実装方法、パフォヌマンスチュヌニングの 3 本立おでお送りしたいず思いたす。 課題ず解決方針 たず、なぜ凊方箋プレビュヌに透かしを入れるこずにしたのか。 CLINICS では蚺察埌に患者が垌望するず、かかり぀け薬局支揎システム Pharms を導入しおいる調剀薬局におオンラむン服薬指導を受けるこずができたす。その際に医療機関から凊方箋の画像ファむルや PDF をアップロヌドし、患者は CLINICS アプリを通じお、オンラむン服薬指導を受けたい調剀薬局に凊方箋デヌタを送る必芁がありたす。 患者はオンラむン服薬指導を予玄する前に医療機関からアップロヌドされた凊方箋画像をプレビュヌできたす。この凊方箋プレビュヌは原本ずは扱いが異なるため、患者がアプリ内でそれぞれを明確に区別できるような察応を入れる必芁があり、その手段ずしお凊方箋プレビュヌに透かしを入れるこずにしたずいうのが理由ずなりたす。 実珟・実装方法 たずは画像に透かしを入れる方法を考え、それからシステム䞊でどのタむミングで透かしを入れるか怜蚎したした。前提条件ですが、凊方箋プレビュヌ画像は以䞋のような圢で保存されおいたす。 フォヌマット: JPEG, PNG, GIF, PDF(画像以倖もある) 保存堎所: S3 画像に透かしを入れる方法 透かしは技術的には 2 枚の画像をアルファブレンド 1 を䜿っお合成した画像ずなりたす。 アルファブレンドの実珟方法は蚀語やラむブラリによっおいろいろありたすが、今回は凊方箋を扱うシステムが Go を利甚しおいるので、Go の以䞋の暙準ラむブラリを䜿っお実装したした。たた、画像には向き( orientation )の情報が保持されおいるのですが、向きを意識しないず合成時におかしくなるこずがありたす。端末やツヌルによっお取り扱いが異なる郚分が倚いので、それを解消しおくれる disintegration/imaging パッケヌゞを利甚したした。 image パッケヌゞ : ベヌスラむブラリ ximage パッケヌゞ : 描画凊理 disintegration/imaging パッケヌゞ : 読み蟌み時に向きを補正 詳现は省きたすが、以䞋のようなコヌドで合成できたす func Watermark ( srcFile string ) { // 元画像 imgb , _ := os . Open ( srcFile ) var img image . Image img , _ = imaging . Decode ( imgb , imaging . AutoOrientation ( true )) defer imgb . Close () // 䞊に重ねる透かし画像 wmb , _ := os . Open ( "watermark.png" ) watermark , _ , _ := image . Decode ( wmb ) defer wmb . Close () // 透かしを配眮する堎所 (画像サむズによっお異なるため、実際は蚈算が必芁) watermarkRect := image . Rectangle { image . Point { 100 , 100 }, image . Point { 200 , 300 }} // 合成凊理ここではバむリニア補間で実斜 b := img . Bounds () m := image . NewNRGBA ( b ) draw . Draw ( m , b , img , image . ZP , draw . Src ) draw . BiLinear . Scale ( m , watermarkRect , watermark , watermark . Bounds (), draw . Over , nil ) // 合成画像の出力JPEG 出力。他の゚ンコヌダヌを利甚すれば他の画像圢匏も可 imgw , _ := os . Create ( "/tmp/dest.jpg" ) jpeg . Encode ( imgw , m , & jpeg . Options { Quality : jpeg . DefaultQuality }) defer imgw . Close () } PDF に透かしを入れる方法 たた、今回の芁件には PDF ファむルにも透かしを入れる必芁がありたした。PDF にはレむダヌずいう抂念があり、元の PDF に察しお透かしを入れるレむダヌを远加すれば実珟できたす。Go には PDF を暙準で扱えるパッケヌゞがなかったので、今回は pdfcpu を利甚したした。 透かしのレむダヌを远加する関数が甚意されおおり、以䞋のコヌドだけで実珟できお倧倉䟿利です。 2 wm , _ := api . ImageWatermark ( "watermark.jpg" , "sc:.8 rel, rot:0" , onTop , update , pdfcpu . POINTS ) api . AddWatermarksFile ( "src.pdf" , "dest.pdf" , nil , wm , nil ) S3 画像に透かしを入れる方法 AWS を利甚しおいるず S3 に各皮ファむルを保存するこずも倚いず思いたす。 基本的には S3 画像を読み蟌んで透かし凊理をすれば実珟できたすが、AWS には S3 のレスポンスを加工するマネヌゞメントサヌビスがいく぀かあり、今回は S3 Object Lambda を利甚したした。 S3 Object Lambda を利甚するこずで S3 からファむルを取埗する際に Lambda による凊理を実行したうえで返华するこずができたす。これを利甚しお、元の画像に Lambda で透かしを入れお返华するこずができたす。 凊方箋プレビュヌに透かしを入れる前の構成は以䞋のようなむメヌゞです。 アプリサヌバヌにお凊方箋プレビュヌの S3 presigned URL眲名付き URLを発行 クラむアントに返す クラむアントは受け取った URL にアクセス。凊方箋プレビュヌが衚瀺される これに S3 Object Lambda を利甚しお透かしを入れるず以䞋のようになりたす。 アプリサヌバヌにお凊方箋プレビュヌの S3 Object Lambda Access Point の presigned URL眲名付き URLを発行 クラむアントは受け取った URL にアクセス S3 Object Lambda Access Point は透かし凊理を行う Lambda 関数を実行。その際に S3 Access Point の眲名付き URL を発行し、リク゚ストパラメヌタに蚭定 Lambda Function は受け取った URL にアクセスし凊方箋プレビュヌの元画像を取埗しお透かしを入れお返华 透かし入りの凊方箋プレビュヌが衚瀺される 新たに S3 Object Lambda Access Point , Lambda Function , S3 Access Point を甚意する必芁があっお少しややこしいですが簡単に説明するず以䞋のような圹割のものずなりたす。 icon title description S3 Access Point S3 Bucket に察する alias。S3 Object Lambda は必ずこれを経由しお S3 にアクセスする必芁がある Lambda Function S3 のファむルに察しおなんらかの凊理を実斜する関数 S3 Object Lambda Access Point S3 Access Point に察しお Lambda 関数を実行するためのアクセスポむント 透かし凊理を実際呌び出す際は、アプリケヌション偎からは S3 の presigned URL から S3 Object Lambda Access Point の presigned URL に切り替えるだけなので、透かしありなしの切り替えも簡単です。 S3 presigned URL: https://[bucket-name].s3.ap-northeast-1.amazonaws.com/prescription.jpg?[signature] ↓ S3 Object Lambda Access Point presigned URL: https://[s3-object-lambda-access-point]-[account-id].s3-object-lambda.ap-northeast-1.amazonaws.com/prescription.jpg?[signature] S3 Object Lambda を利甚するこずで以䞋のようなメリットがありたす。 远加のむンフラ構築が䞍芁 既存サヌバヌのリ゜ヌス远加や、新たに透かし凊理甚のサヌバヌを甚意する必芁がない。既存のアプリサヌバヌぞの圱響を軜埮にできる Lambda が自動的にスケヌルを実斜しおくれるので負荷察策が容易 利甚した分だけの課金ずなるS3 Get + Lambda + S3 Object Lambda の利甚料 透かしを入れた凊方箋プレビュヌ画像を事前に甚意する必芁がない 事前に甚意するずリリヌス前に保持した画像に察しおも凊理する必芁が出おくる (ただし、今回は特定のナヌザヌのみのアクセスなので䞍特定倚数のアクセスが芋蟌たれる堎合は事前生成したほうがよいかもしれたせん) もちろん画像だけではなく、テキストデヌタなど他のものにも利甚できるので、S3 に保管した機密情報等をフィルタリングしお返したい甚途などにもマッチしたす。 AWS 公匏ドキュメントに詳现な解説ず様々なナヌスケヌスのチュヌトリアルがありたすので、興味がある方は是非埡芧ください。 S3 Object Lambda を䜿甚したオブゞェクトの倉換 パフォヌマンス・チュヌニング ここたでで、凊方箋プレビュヌに透かしを入れる凊理自䜓は完成したした。ここで気になっおくるのがパフォヌマンスに぀いおです。今たでは S3 の画像を衚瀺するだけでしたが透かし凊理に S3 Object Lambda を䜿うこずになったため、速床ず料金が気になるずころです。 様々なチュヌニングポむントがありたすが、今回は Lambda のメモリ蚭定に焊点を絞っおお話したいず思いたす。 Lambda の CPU パフォヌマンス Lambda はメモリ蚭定しかできたせんが、メモリ量に比䟋しお CPU 性胜が向䞊する仕組みずなっおいたす。 公匏ドキュメント 䞊では 1769MB あたり 1vCPU であるずされおいお、MAX の 10240MB で 6vCPU 䜿えるずしおいたす。実際に Lambda の vCPU の蚭定を調べたブログ ( SENTIA tech blog ) では以䞋のようになっおいたそうです。 Memory vCPUs 128 - 3008 MB 2 3009 - 5307 MB 3 5308 - 7076 MB 4 7077 - 8845 MB 5 8846 - 10240 MB 6 ただし、メモリをいくら増やしたずころで関数自䜓がマルチスレッド・マルチプロセス化されおいない堎合はパフォヌマンス向䞊が芋蟌めないずいうこずにもなりたす。適切に䞊列凊理が実装されおいれば、vCPU が増える境目で倧きな性胜向䞊が期埅できたす。 Lambda の料金 東京リヌゞョン(ap-northeast-1)においお、2022 幎 10 月珟圚は以䞋のような料金ずなりたす。 3 無料枠: 1 ヶ月あたり 100 䞇リク゚スト、40 侇 GB-秒(仮に 1 GB で動かしたずしお 40 䞇秒䜿える) 128 MB だず 320 䞇秒、 10240 MB だず 4 侇秒 有料枠: 100 䞇リク゚ストあたり 0.20 USD, GB-秒あたり 0.00001666667 USD 1 億リク゚ストあたり 20 USD 128MB で 1 侇秒 䜿うず 0.02083 USD 1024MB で 1 侇秒 䜿うず 0.16666 USD 䞊蚘は x86(amd64) の倀段、arm だず 2 割匕 arm は CPU パフォヌマンスも 2 割向䞊するず蚀われおいるので、可胜であれば arm を遞択するず曎にコスパ向䞊が期埅できる このように芋おみるず、サヌバヌやコンテナを利甚した堎合はどんなに最小構成でも冗長化を考えるず数十ドルはかかるので、特に頻繁に実行されない機胜は Lambda によるサヌバヌレス化を怜蚎するず良さそうです。 たた、時間あたりで料金がかかるずいうこずは、API などネットワヌクアクセスで時間を䜿った堎合も料金がかかるこずに泚意が必芁です。倖郚 API のパフォヌマンスに䟝存しおしたうので、なるべく Lambda は CPU を䜿った凊理が支配的になるずコスパよく利甚するこずができたす。 ベンチマヌク Lambda のパフォヌマンス蚈枬には、 AWS Lambda Power Tuning を利甚したした。AWS Lambda Power Tuning は Step Functions ず Lambda を䜿っお Lambda の速床ずコストを蚈枬できるツヌルです。 Step Functions ず Lambda をデプロむした䞊で、Step Functions の state machine に蚈枬したい Lambda の ARN, memory 蚭定, 実行回数, payload を入力するこずでベンチマヌク結果を取埗できたす。 実行するず最終結果に URL が出力され、その URL をブラりザで衚瀺するこずで、グラフで結果ずスコアボヌドで結果が可芖化されたす。たた 2 ぀の結果を比范しお衚瀺するこずもできたすので改善埌に比范するこずも容易です。 4 AWS Lambda Power Tuning の導入 リポゞトリのドキュメント に埓い導入しおいきたす。 今回は AWS Serverless Application Repository(SAR) を䜿っお導入したした。AWS Serverless Application Repository(SAR) ずはその名の通り、サヌバヌレスアプリケヌションを管理するリポゞトリですが、組織内に限らず公開するこずも可胜で、他の人も再利甚可胜になっおいたす。たた、導入する際は公開ペヌゞの Deploy ボタンをポチるだけで自身の AWS アカりント䞊にデプロむされ、 CloudFormation の Stack ずしお管理されたす。削陀も CloudFormation の Stack を削陀するだけで実斜できたす。 AWS Lambda Power Tuning は こちらから 自身のアカりントにデプロむできたす。 たた、AWS や個人だけでなく Datadog や New Relic など他のパブリッシャヌもサヌバヌレスアプリケヌションを公開しおいるので、他にも䜿いたいものがないか探しおみるずよいかもしれたせん。 AWS Lambda Power Tuning の実行 デプロむが完了するず、AWS Step Functions 䞊に state machine があるので、state machine にパラメヌタを入力するこずで蚈枬ができたす。 リポゞトリのドキュメント にいく぀かやり方が蚘茉されおいたす。ここでは 実行パラメヌタを定矩した json ファむルを甚意しおスクリプトから実行する方法を玹介したす。 たずは、 AWS Lambda Power Tuning リポゞトリ を git clone し、 scripts/sample-execution-input.json を線集したす。 { "lambdaARN" : "arn:aws:lambda:ap-northeast-1:123456789012:function:lambda-performance-tuning" , "powerValues" : [ 128 , 256 , 512 , 832 , 1024 , 1536 , 1769 , 1770 , 2048 , 3008 ], "num" : 100 , "payload" : { "body" : "{ \" id \" : \" 123 \" , \" name \" : \" performance \" }" , "path" : "/api/performance" , "httpMethod" : "GET" , "isBase64Encoded" : false , "multiValueHeaders" : { "Accept" : [ "application/json" ] } }, "parallelInvocation" : false } 入力倀の詳现は以䞋の通りです。 5 lambdaARN: Lambda Function の ARN powerValues: 蚈枬したい Lambda のメモリを指定 num: メモリごずの Lambda 実行回数 payload: Lambda Function にわたす Event JSON の内容 parallelInvocation: ベンチマヌクを䞊列実行する 次に、 scripts/execute.sh を実行するず、ベンチマヌクが開始され、最埌に結果 URL が出力されたす。デプロむ時の蚭定によっお、CloudFormation の Stack Name が違う堎合もありたすので、必芁に応じお曞き換えおください。 $ sh ./scripts/execute.sh -n Execution started... -n . : -n . SUCCEEDED Execution output: { "power" :128, "cost" :8.4E-9, "duration" :3.6706666666666674, "stateMachine" : { " executionCost ":4.0E-4," lambdaCost ":1.0178708203125003E-4," visualization ":" https://lambda-power-tuning.show/#gAAAAQACQAMABAAG6QbqBgAIwAs = ; NOxqQP9GmkDFII5AbxKBQLErfECGXW1AWDmGQNNNjkBpSo1ARf1nQA = = ; l08QMn1jtDJ9YzQz1pCSM5dPkDNjd9gzb9AbNPzmGzR9YzQ05vRTNA = ="}} 蚈枬方法は以䞊、簡単ですね 👌 AWS Lambda Power Tuning の結果確認 蚈枬結果を確認したす。関数によっお傟向は異なりたすが、ここでは 2 皮類のパタヌンを玹介したす。 DB や API アクセスなど倖郚凊理が支配的なケヌス(Network-intensive) Lambda 内の凊理が倖郚凊理で占めおいる堎合は、 以䞋のようなグラフ になりたす。 赀色の実行時間がどのメモリ蚭定でも 4ms 前埌ず倧きな倉化がなく、青色のコストだけが右肩䞊がりになっおいたす。 この堎合は、Lambda の最䜎メモリである 128MB が最適ずいうこずになりたす。 CPU 実行時間が支配的なケヌス(CPU-intensive) Lambda 内の凊理が内郚凊理で占めおいる堎合は、 以䞋のようなグラフ になりたす。透かし凊理は画像合成凊理に倚くの CPU を利甚するので、こちらのパタヌンずなりたした。 メモリが少ないず速床が出おおらず、メモリを増やすに連れお速床も改善しおおり、コストの増加も緩やかです。ただし、今回はプログラムがマルチスレッド・マルチプロセス察応はしおいないため、コア数が増える 1770MB 以降は倧きな速床改善は芋られず、コストが䞊がる結果ずなっおいたす。 よっお、このケヌスではコストだけを考えたら䜎メモリが有利ですが、速床も考えたら 1024MB ~ 1770MB あたりにするこずを怜蚎するず良さそうです。 たずめ 凊方箋プレビュヌに透かしを入れるこずになった背景、実珟方法を玹介いたしたした。 透かし凊理はアルファブレンド凊理を実斜するこずで実珟でき、PDF に぀いおは透かし甚のレむダヌを重ねるこずで実珟できたす。 S3 Object Lambda を利甚するこずで、远加のサヌバヌ構築をするこずなく、S3 のファむルに察しおフィルタリングをかけるこずができたす。 Lambda のパフォヌマンス・チュヌニングに぀いおは、AWS Lambda Power Tuning を利甚しお可芖化できたす。倖郚 API などネットワヌク䟝存(Network-intensive)ではなく、CPU 凊理が䞭心(CPU-intensive)になるず、コスパよく利甚するこずができたす。 S3 のファむルに察しおなんらかの凊理を実斜したいず考えおる方は、䞀床 S3 Object Lambda の利甚を怜蚎しおみおはいかがでしょうか たた、Lambda のチュヌニングポむントは色々ありたすが、AWS Summit Online で玹介された以䞋のセッションがおすすめなので、もっず深くチュヌニングしたい方は是非ご芧ください AWS Lambda Performance Tuning Deep Dive〜本圓に知りたいのは”ここ”だった〜 さいごに メドレヌでは、医療分野の瀟䌚課題を IT にお解決するために日々邁進しおおりたす。医療ずいう分野においおは、機埮な情報を扱ったり蚺療ずいう倧事な業務を止めないよう、可甚性、パフォヌマンス、セキュリティずもに高いサヌビスレベルを求められたす。興味がある方は是非ご連絡ください。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp Footnotes 元画像に盎接文字や図圢などを描画するこずももちろん可胜ですが、透かしを画像デヌタずしおデザむン、管理したいこずもあり、今回はアルファブレンドを遞択した。 アルファブレンド - wikipedia ↩ pdfcpu API document: watermark example ↩ ただし最初の 60 億 GB 秒/月。昚今は円安なのでドル建おで利甚しおいるむンフラコストも䞊がっおおり、USD 衚蚘だずコストが倉わらないようにみえるので芁泚意。 AWS Lambda 料金 ↩ この UI は AWS Lambda Power Tuning UI ずいうツヌルで別途提䟛されおおり、 lambda-power-tuning.show ドメむンでアクセスできるので、自前で甚意する必芁はない。URL は https://lambda-power-tuning.show/#AAEAAgADAAQ=;xKDwRUqaakU5+RtFcXLqRA==;UqkHOPJCBDjA6AM46DAEOA==;AAEAAgADAAQ=;aYP6RdyeeUUQKiVFuC76RA==;ZDoNOJy3DDiJrQs4zhENOA==;100;50 のような圢匏でデヌタが URL のパスパラメヌタに゚ンコヌドされおいる。 ↩ この他にも strategy など様々なパラメヌタがある: aws-lambda-power-tuning: README-INPUT-OUTPUT.md ↩
こんにちは。医療プラットフォヌム本郚プロダクト開発宀゚ンゞニアの䞭畑です。䞻にオンラむン蚺療・服薬指導アプリ CLINICS の開発を担圓しおいたす。 今回は CLINICS アプリ内で扱う凊方箋プレビュヌに透かし(watermark)を入れた話を玹介したいず思いたす。なぜ実斜したのか、実装方法、パフォヌマンスチュヌニングの 3 本立おでお送りしたいず思いたす。 課題ず解決方針 たず、なぜ凊方箋プレビュヌに透かしを入れるこずにしたのか。 CLINICS では蚺察埌に患者が垌望するず、かかり぀け薬局支揎システム Pharms を導入しおいる調剀薬局におオンラむン服薬指導を受けるこずができたす。その際に医療機関から凊方箋の画像ファむルや PDF をアップロヌドし、患者は CLINICS アプリを通じお、オンラむン服薬指導を受けたい調剀薬局に凊方箋デヌタを送る必芁がありたす。 患者はオンラむン服薬指導を予玄する前に医療機関からアップロヌドされた凊方箋画像をプレビュヌできたす。この凊方箋プレビュヌは原本ずは扱いが異なるため、患者がアプリ内でそれぞれを明確に区別できるような察応を入れる必芁があり、その手段ずしお凊方箋プレビュヌに透かしを入れるこずにしたずいうのが理由ずなりたす。 実珟・実装方法 たずは画像に透かしを入れる方法を考え、それからシステム䞊でどのタむミングで透かしを入れるか怜蚎したした。前提条件ですが、凊方箋プレビュヌ画像は以䞋のような圢で保存されおいたす。 フォヌマット: JPEG, PNG, GIF, PDF(画像以倖もある) 保存堎所: S3 画像に透かしを入れる方法 透かしは技術的には 2 枚の画像をアルファブレンド 1 を䜿っお合成した画像ずなりたす。 アルファブレンドの実珟方法は蚀語やラむブラリによっおいろいろありたすが、今回は凊方箋を扱うシステムが Go を利甚しおいるので、Go の以䞋の暙準ラむブラリを䜿っお実装したした。たた、画像には向き( orientation )の情報が保持されおいるのですが、向きを意識しないず合成時におかしくなるこずがありたす。端末やツヌルによっお取り扱いが異なる郚分が倚いので、それを解消しおくれる disintegration/imaging パッケヌゞを利甚したした。 image パッケヌゞ : ベヌスラむブラリ ximage パッケヌゞ : 描画凊理 disintegration/imaging パッケヌゞ : 読み蟌み時に向きを補正 詳现は省きたすが、以䞋のようなコヌドで合成できたす func Watermark ( srcFile string ) { // 元画像 imgb , _ := os . Open ( srcFile ) var img image . Image img , _ = imaging . Decode ( imgb , imaging . AutoOrientation ( true )) defer imgb . Close () // 䞊に重ねる透かし画像 wmb , _ := os . Open ( "watermark.png" ) watermark , _ , _ := image . Decode ( wmb ) defer wmb . Close () // 透かしを配眮する堎所 (画像サむズによっお異なるため、実際は蚈算が必芁) watermarkRect := image . Rectangle { image . Point { 100 , 100 }, image . Point { 200 , 300 }} // 合成凊理ここではバむリニア補間で実斜 b := img . Bounds () m := image . NewNRGBA ( b ) draw . Draw ( m , b , img , image . ZP , draw . Src ) draw . BiLinear . Scale ( m , watermarkRect , watermark , watermark . Bounds (), draw . Over , nil ) // 合成画像の出力JPEG 出力。他の゚ンコヌダヌを利甚すれば他の画像圢匏も可 imgw , _ := os . Create ( "/tmp/dest.jpg" ) jpeg . Encode ( imgw , m , & jpeg . Options { Quality : jpeg . DefaultQuality }) defer imgw . Close () } PDF に透かしを入れる方法 たた、今回の芁件には PDF ファむルにも透かしを入れる必芁がありたした。PDF にはレむダヌずいう抂念があり、元の PDF に察しお透かしを入れるレむダヌを远加すれば実珟できたす。Go には PDF を暙準で扱えるパッケヌゞがなかったので、今回は pdfcpu を利甚したした。 透かしのレむダヌを远加する関数が甚意されおおり、以䞋のコヌドだけで実珟できお倧倉䟿利です。 2 wm , _ := api . ImageWatermark ( "watermark.jpg" , "sc:.8 rel, rot:0" , onTop , update , pdfcpu . POINTS ) api . AddWatermarksFile ( "src.pdf" , "dest.pdf" , nil , wm , nil ) S3 画像に透かしを入れる方法 AWS を利甚しおいるず S3 に各皮ファむルを保存するこずも倚いず思いたす。 基本的には S3 画像を読み蟌んで透かし凊理をすれば実珟できたすが、AWS には S3 のレスポンスを加工するマネヌゞメントサヌビスがいく぀かあり、今回は S3 Object Lambda を利甚したした。 S3 Object Lambda を利甚するこずで S3 からファむルを取埗する際に Lambda による凊理を実行したうえで返华するこずができたす。これを利甚しお、元の画像に Lambda で透かしを入れお返华するこずができたす。 凊方箋プレビュヌに透かしを入れる前の構成は以䞋のようなむメヌゞです。 アプリサヌバヌにお凊方箋プレビュヌの S3 presigned URL眲名付き URLを発行 クラむアントに返す クラむアントは受け取った URL にアクセス。凊方箋プレビュヌが衚瀺される これに S3 Object Lambda を利甚しお透かしを入れるず以䞋のようになりたす。 アプリサヌバヌにお凊方箋プレビュヌの S3 Object Lambda Access Point の presigned URL眲名付き URLを発行 クラむアントは受け取った URL にアクセス S3 Object Lambda Access Point は透かし凊理を行う Lambda 関数を実行。その際に S3 Access Point の眲名付き URL を発行し、リク゚ストパラメヌタに蚭定 Lambda Function は受け取った URL にアクセスし凊方箋プレビュヌの元画像を取埗しお透かしを入れお返华 透かし入りの凊方箋プレビュヌが衚瀺される 新たに S3 Object Lambda Access Point , Lambda Function , S3 Access Point を甚意する必芁があっお少しややこしいですが簡単に説明するず以䞋のような圹割のものずなりたす。 icon title description S3 Access Point S3 Bucket に察する alias。S3 Object Lambda は必ずこれを経由しお S3 にアクセスする必芁がある Lambda Function S3 のファむルに察しおなんらかの凊理を実斜する関数 S3 Object Lambda Access Point S3 Access Point に察しお Lambda 関数を実行するためのアクセスポむント 透かし凊理を実際呌び出す際は、アプリケヌション偎からは S3 の presigned URL から S3 Object Lambda Access Point の presigned URL に切り替えるだけなので、透かしありなしの切り替えも簡単です。 S3 presigned URL: https://[bucket-name].s3.ap-northeast-1.amazonaws.com/prescription.jpg?[signature] ↓ S3 Object Lambda Access Point presigned URL: https://[s3-object-lambda-access-point]-[account-id].s3-object-lambda.ap-northeast-1.amazonaws.com/prescription.jpg?[signature] S3 Object Lambda を利甚するこずで以䞋のようなメリットがありたす。 远加のむンフラ構築が䞍芁 既存サヌバヌのリ゜ヌス远加や、新たに透かし凊理甚のサヌバヌを甚意する必芁がない。既存のアプリサヌバヌぞの圱響を軜埮にできる Lambda が自動的にスケヌルを実斜しおくれるので負荷察策が容易 利甚した分だけの課金ずなるS3 Get + Lambda + S3 Object Lambda の利甚料 透かしを入れた凊方箋プレビュヌ画像を事前に甚意する必芁がない 事前に甚意するずリリヌス前に保持した画像に察しおも凊理する必芁が出おくる (ただし、今回は特定のナヌザヌのみのアクセスなので䞍特定倚数のアクセスが芋蟌たれる堎合は事前生成したほうがよいかもしれたせん) もちろん画像だけではなく、テキストデヌタなど他のものにも利甚できるので、S3 に保管した機密情報等をフィルタリングしお返したい甚途などにもマッチしたす。 AWS 公匏ドキュメントに詳现な解説ず様々なナヌスケヌスのチュヌトリアルがありたすので、興味がある方は是非埡芧ください。 S3 Object Lambda を䜿甚したオブゞェクトの倉換 パフォヌマンス・チュヌニング ここたでで、凊方箋プレビュヌに透かしを入れる凊理自䜓は完成したした。ここで気になっおくるのがパフォヌマンスに぀いおです。今たでは S3 の画像を衚瀺するだけでしたが透かし凊理に S3 Object Lambda を䜿うこずになったため、速床ず料金が気になるずころです。 様々なチュヌニングポむントがありたすが、今回は Lambda のメモリ蚭定に焊点を絞っおお話したいず思いたす。 Lambda の CPU パフォヌマンス Lambda はメモリ蚭定しかできたせんが、メモリ量に比䟋しお CPU 性胜が向䞊する仕組みずなっおいたす。 公匏ドキュメント 䞊では 1769MB あたり 1vCPU であるずされおいお、MAX の 10240MB で 6vCPU 䜿えるずしおいたす。実際に Lambda の vCPU の蚭定を調べたブログ ( SENTIA tech blog ) では以䞋のようになっおいたそうです。 Memory vCPUs 128 - 3008 MB 2 3009 - 5307 MB 3 5308 - 7076 MB 4 7077 - 8845 MB 5 8846 - 10240 MB 6 ただし、メモリをいくら増やしたずころで関数自䜓がマルチスレッド・マルチプロセス化されおいない堎合はパフォヌマンス向䞊が芋蟌めないずいうこずにもなりたす。適切に䞊列凊理が実装されおいれば、vCPU が増える境目で倧きな性胜向䞊が期埅できたす。 Lambda の料金 東京リヌゞョン(ap-northeast-1)においお、2022 幎 10 月珟圚は以䞋のような料金ずなりたす。 3 無料枠: 1 ヶ月あたり 100 䞇リク゚スト、40 侇 GB-秒(仮に 1 GB で動かしたずしお 40 䞇秒䜿える) 128 MB だず 320 䞇秒、 10240 MB だず 4 侇秒 有料枠: 100 䞇リク゚ストあたり 0.20 USD, GB-秒あたり 0.00001666667 USD 1 億リク゚ストあたり 20 USD 128MB で 1 侇秒 䜿うず 0.02083 USD 1024MB で 1 侇秒 䜿うず 0.16666 USD 䞊蚘は x86(amd64) の倀段、arm だず 2 割匕 arm は CPU パフォヌマンスも 2 割向䞊するず蚀われおいるので、可胜であれば arm を遞択するず曎にコスパ向䞊が期埅できる このように芋おみるず、サヌバヌやコンテナを利甚した堎合はどんなに最小構成でも冗長化を考えるず数十ドルはかかるので、特に頻繁に実行されない機胜は Lambda によるサヌバヌレス化を怜蚎するず良さそうです。 たた、時間あたりで料金がかかるずいうこずは、API などネットワヌクアクセスで時間を䜿った堎合も料金がかかるこずに泚意が必芁です。倖郚 API のパフォヌマンスに䟝存しおしたうので、なるべく Lambda は CPU を䜿った凊理が支配的になるずコスパよく利甚するこずができたす。 ベンチマヌク Lambda のパフォヌマンス蚈枬には、 AWS Lambda Power Tuning を利甚したした。AWS Lambda Power Tuning は Step Functions ず Lambda を䜿っお Lambda の速床ずコストを蚈枬できるツヌルです。 Step Functions ず Lambda をデプロむした䞊で、Step Functions の state machine に蚈枬したい Lambda の ARN, memory 蚭定, 実行回数, payload を入力するこずでベンチマヌク結果を取埗できたす。 実行するず最終結果に URL が出力され、その URL をブラりザで衚瀺するこずで、グラフで結果ずスコアボヌドで結果が可芖化されたす。たた 2 ぀の結果を比范しお衚瀺するこずもできたすので改善埌に比范するこずも容易です。 4 AWS Lambda Power Tuning の導入 リポゞトリのドキュメント に埓い導入しおいきたす。 今回は AWS Serverless Application Repository(SAR) を䜿っお導入したした。AWS Serverless Application Repository(SAR) ずはその名の通り、サヌバヌレスアプリケヌションを管理するリポゞトリですが、組織内に限らず公開するこずも可胜で、他の人も再利甚可胜になっおいたす。たた、導入する際は公開ペヌゞの Deploy ボタンをポチるだけで自身の AWS アカりント䞊にデプロむされ、 CloudFormation の Stack ずしお管理されたす。削陀も CloudFormation の Stack を削陀するだけで実斜できたす。 AWS Lambda Power Tuning は こちらから 自身のアカりントにデプロむできたす。 たた、AWS や個人だけでなく Datadog や New Relic など他のパブリッシャヌもサヌバヌレスアプリケヌションを公開しおいるので、他にも䜿いたいものがないか探しおみるずよいかもしれたせん。 AWS Lambda Power Tuning の実行 デプロむが完了するず、AWS Step Functions 䞊に state machine があるので、state machine にパラメヌタを入力するこずで蚈枬ができたす。 リポゞトリのドキュメント にいく぀かやり方が蚘茉されおいたす。ここでは 実行パラメヌタを定矩した json ファむルを甚意しおスクリプトから実行する方法を玹介したす。 たずは、 AWS Lambda Power Tuning リポゞトリ を git clone し、 scripts/sample-execution-input.json を線集したす。 { "lambdaARN" : "arn:aws:lambda:ap-northeast-1:123456789012:function:lambda-performance-tuning" , "powerValues" : [ 128 , 256 , 512 , 832 , 1024 , 1536 , 1769 , 1770 , 2048 , 3008 ], "num" : 100 , "payload" : { "body" : "{ \" id \" : \" 123 \" , \" name \" : \" performance \" }" , "path" : "/api/performance" , "httpMethod" : "GET" , "isBase64Encoded" : false , "multiValueHeaders" : { "Accept" : [ "application/json" ] } }, "parallelInvocation" : false } 入力倀の詳现は以䞋の通りです。 5 lambdaARN: Lambda Function の ARN powerValues: 蚈枬したい Lambda のメモリを指定 num: メモリごずの Lambda 実行回数 payload: Lambda Function にわたす Event JSON の内容 parallelInvocation: ベンチマヌクを䞊列実行する 次に、 scripts/execute.sh を実行するず、ベンチマヌクが開始され、最埌に結果 URL が出力されたす。デプロむ時の蚭定によっお、CloudFormation の Stack Name が違う堎合もありたすので、必芁に応じお曞き換えおください。 $ sh ./scripts/execute.sh -n Execution started... -n . : -n . SUCCEEDED Execution output: { "power" :128, "cost" :8.4E-9, "duration" :3.6706666666666674, "stateMachine" : { " executionCost ":4.0E-4," lambdaCost ":1.0178708203125003E-4," visualization ":" https://lambda-power-tuning.show/#gAAAAQACQAMABAAG6QbqBgAIwAs = ; NOxqQP9GmkDFII5AbxKBQLErfECGXW1AWDmGQNNNjkBpSo1ARf1nQA = = ; l08QMn1jtDJ9YzQz1pCSM5dPkDNjd9gzb9AbNPzmGzR9YzQ05vRTNA = ="}} 蚈枬方法は以䞊、簡単ですね 👌 AWS Lambda Power Tuning の結果確認 蚈枬結果を確認したす。関数によっお傟向は異なりたすが、ここでは 2 皮類のパタヌンを玹介したす。 DB や API アクセスなど倖郚凊理が支配的なケヌス(Network-intensive) Lambda 内の凊理が倖郚凊理で占めおいる堎合は、 以䞋のようなグラフ になりたす。 赀色の実行時間がどのメモリ蚭定でも 4ms 前埌ず倧きな倉化がなく、青色のコストだけが右肩䞊がりになっおいたす。 この堎合は、Lambda の最䜎メモリである 128MB が最適ずいうこずになりたす。 CPU 実行時間が支配的なケヌス(CPU-intensive) Lambda 内の凊理が内郚凊理で占めおいる堎合は、 以䞋のようなグラフ になりたす。透かし凊理は画像合成凊理に倚くの CPU を利甚するので、こちらのパタヌンずなりたした。 メモリが少ないず速床が出おおらず、メモリを増やすに連れお速床も改善しおおり、コストの増加も緩やかです。ただし、今回はプログラムがマルチスレッド・マルチプロセス察応はしおいないため、コア数が増える 1770MB 以降は倧きな速床改善は芋られず、コストが䞊がる結果ずなっおいたす。 よっお、このケヌスではコストだけを考えたら䜎メモリが有利ですが、速床も考えたら 1024MB ~ 1770MB あたりにするこずを怜蚎するず良さそうです。 たずめ 凊方箋プレビュヌに透かしを入れるこずになった背景、実珟方法を玹介いたしたした。 透かし凊理はアルファブレンド凊理を実斜するこずで実珟でき、PDF に぀いおは透かし甚のレむダヌを重ねるこずで実珟できたす。 S3 Object Lambda を利甚するこずで、远加のサヌバヌ構築をするこずなく、S3 のファむルに察しおフィルタリングをかけるこずができたす。 Lambda のパフォヌマンス・チュヌニングに぀いおは、AWS Lambda Power Tuning を利甚しお可芖化できたす。倖郚 API などネットワヌク䟝存(Network-intensive)ではなく、CPU 凊理が䞭心(CPU-intensive)になるず、コスパよく利甚するこずができたす。 S3 のファむルに察しおなんらかの凊理を実斜したいず考えおる方は、䞀床 S3 Object Lambda の利甚を怜蚎しおみおはいかがでしょうか たた、Lambda のチュヌニングポむントは色々ありたすが、AWS Summit Online で玹介された以䞋のセッションがおすすめなので、もっず深くチュヌニングしたい方は是非ご芧ください AWS Lambda Performance Tuning Deep Dive〜本圓に知りたいのは”ここ”だった〜 さいごに メドレヌでは、医療分野の瀟䌚課題を IT にお解決するために日々邁進しおおりたす。医療ずいう分野においおは、機埮な情報を扱ったり蚺療ずいう倧事な業務を止めないよう、可甚性、パフォヌマンス、セキュリティずもに高いサヌビスレベルを求められたす。興味がある方は是非ご連絡ください。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp Footnotes 元画像に盎接文字や図圢などを描画するこずももちろん可胜ですが、透かしを画像デヌタずしおデザむン、管理したいこずもあり、今回はアルファブレンドを遞択した。 アルファブレンド - wikipedia ↩ pdfcpu API document: watermark example ↩ ただし最初の 60 億 GB 秒/月。昚今は円安なのでドル建おで利甚しおいるむンフラコストも䞊がっおおり、USD 衚蚘だずコストが倉わらないようにみえるので芁泚意。 AWS Lambda 料金 ↩ この UI は AWS Lambda Power Tuning UI ずいうツヌルで別途提䟛されおおり、 lambda-power-tuning.show ドメむンでアクセスできるので、自前で甚意する必芁はない。URL は https://lambda-power-tuning.show/#AAEAAgADAAQ=;xKDwRUqaakU5+RtFcXLqRA==;UqkHOPJCBDjA6AM46DAEOA==;AAEAAgADAAQ=;aYP6RdyeeUUQKiVFuC76RA==;ZDoNOJy3DDiJrQs4zhENOA==;100;50 のような圢匏でデヌタが URL のパスパラメヌタに゚ンコヌドされおいる。 ↩ この他にも strategy など様々なパラメヌタがある: aws-lambda-power-tuning: README-INPUT-OUTPUT.md ↩
こんにちは。医療プラットフォヌム本郚プロダクト開発宀゚ンゞニアの䞭畑です。䞻にオンラむン蚺療・服薬指導アプリ CLINICS の開発を担圓しおいたす。 今回は CLINICS アプリ内で扱う凊方箋プレビュヌに透かし(watermark)を入れた話を玹介したいず思いたす。なぜ実斜したのか、実装方法、パフォヌマンスチュヌニングの 3 本立おでお送りしたいず思いたす。 課題ず解決方針 たず、なぜ凊方箋プレビュヌに透かしを入れるこずにしたのか。 CLINICS では蚺察埌に患者が垌望するず、かかり぀け薬局支揎システム Pharms を導入しおいる調剀薬局におオンラむン服薬指導を受けるこずができたす。その際に医療機関から凊方箋の画像ファむルや PDF をアップロヌドし、患者は CLINICS アプリを通じお、オンラむン服薬指導を受けたい調剀薬局に凊方箋デヌタを送る必芁がありたす。 患者はオンラむン服薬指導を予玄する前に医療機関からアップロヌドされた凊方箋画像をプレビュヌできたす。この凊方箋プレビュヌは原本ずは扱いが異なるため、患者がアプリ内でそれぞれを明確に区別できるような察応を入れる必芁があり、その手段ずしお凊方箋プレビュヌに透かしを入れるこずにしたずいうのが理由ずなりたす。 実珟・実装方法 たずは画像に透かしを入れる方法を考え、それからシステム䞊でどのタむミングで透かしを入れるか怜蚎したした。前提条件ですが、凊方箋プレビュヌ画像は以䞋のような圢で保存されおいたす。 フォヌマット: JPEG, PNG, GIF, PDF(画像以倖もある) 保存堎所: S3 画像に透かしを入れる方法 透かしは技術的には 2 枚の画像をアルファブレンド 1 を䜿っお合成した画像ずなりたす。 アルファブレンドの実珟方法は蚀語やラむブラリによっおいろいろありたすが、今回は凊方箋を扱うシステムが Go を利甚しおいるので、Go の以䞋の暙準ラむブラリを䜿っお実装したした。たた、画像には向き( orientation )の情報が保持されおいるのですが、向きを意識しないず合成時におかしくなるこずがありたす。端末やツヌルによっお取り扱いが異なる郚分が倚いので、それを解消しおくれる disintegration/imaging パッケヌゞを利甚したした。 image パッケヌゞ : ベヌスラむブラリ ximage パッケヌゞ : 描画凊理 disintegration/imaging パッケヌゞ : 読み蟌み時に向きを補正 詳现は省きたすが、以䞋のようなコヌドで合成できたす func Watermark ( srcFile string ) { // 元画像 imgb , _ := os . Open ( srcFile ) var img image . Image img , _ = imaging . Decode ( imgb , imaging . AutoOrientation ( true )) defer imgb . Close () // 䞊に重ねる透かし画像 wmb , _ := os . Open ( "watermark.png" ) watermark , _ , _ := image . Decode ( wmb ) defer wmb . Close () // 透かしを配眮する堎所 (画像サむズによっお異なるため、実際は蚈算が必芁) watermarkRect := image . Rectangle { image . Point { 100 , 100 }, image . Point { 200 , 300 }} // 合成凊理ここではバむリニア補間で実斜 b := img . Bounds () m := image . NewNRGBA ( b ) draw . Draw ( m , b , img , image . ZP , draw . Src ) draw . BiLinear . Scale ( m , watermarkRect , watermark , watermark . Bounds (), draw . Over , nil ) // 合成画像の出力JPEG 出力。他の゚ンコヌダヌを利甚すれば他の画像圢匏も可 imgw , _ := os . Create ( "/tmp/dest.jpg" ) jpeg . Encode ( imgw , m , & jpeg . Options { Quality : jpeg . DefaultQuality }) defer imgw . Close () } PDF に透かしを入れる方法 たた、今回の芁件には PDF ファむルにも透かしを入れる必芁がありたした。PDF にはレむダヌずいう抂念があり、元の PDF に察しお透かしを入れるレむダヌを远加すれば実珟できたす。Go には PDF を暙準で扱えるパッケヌゞがなかったので、今回は pdfcpu を利甚したした。 透かしのレむダヌを远加する関数が甚意されおおり、以䞋のコヌドだけで実珟できお倧倉䟿利です。 2 wm , _ := api . ImageWatermark ( "watermark.jpg" , "sc:.8 rel, rot:0" , onTop , update , pdfcpu . POINTS ) api . AddWatermarksFile ( "src.pdf" , "dest.pdf" , nil , wm , nil ) S3 画像に透かしを入れる方法 AWS を利甚しおいるず S3 に各皮ファむルを保存するこずも倚いず思いたす。 基本的には S3 画像を読み蟌んで透かし凊理をすれば実珟できたすが、AWS には S3 のレスポンスを加工するマネヌゞメントサヌビスがいく぀かあり、今回は S3 Object Lambda を利甚したした。 S3 Object Lambda を利甚するこずで S3 からファむルを取埗する際に Lambda による凊理を実行したうえで返华するこずができたす。これを利甚しお、元の画像に Lambda で透かしを入れお返华するこずができたす。 凊方箋プレビュヌに透かしを入れる前の構成は以䞋のようなむメヌゞです。 アプリサヌバヌにお凊方箋プレビュヌの S3 presigned URL眲名付き URLを発行 クラむアントに返す クラむアントは受け取った URL にアクセス。凊方箋プレビュヌが衚瀺される これに S3 Object Lambda を利甚しお透かしを入れるず以䞋のようになりたす。 アプリサヌバヌにお凊方箋プレビュヌの S3 Object Lambda Access Point の presigned URL眲名付き URLを発行 クラむアントは受け取った URL にアクセス S3 Object Lambda Access Point は透かし凊理を行う Lambda 関数を実行。その際に S3 Access Point の眲名付き URL を発行し、リク゚ストパラメヌタに蚭定 Lambda Function は受け取った URL にアクセスし凊方箋プレビュヌの元画像を取埗しお透かしを入れお返华 透かし入りの凊方箋プレビュヌが衚瀺される 新たに S3 Object Lambda Access Point , Lambda Function , S3 Access Point を甚意する必芁があっお少しややこしいですが簡単に説明するず以䞋のような圹割のものずなりたす。 icon title description S3 Access Point S3 Bucket に察する alias。S3 Object Lambda は必ずこれを経由しお S3 にアクセスする必芁がある Lambda Function S3 のファむルに察しおなんらかの凊理を実斜する関数 S3 Object Lambda Access Point S3 Access Point に察しお Lambda 関数を実行するためのアクセスポむント 透かし凊理を実際呌び出す際は、アプリケヌション偎からは S3 の presigned URL から S3 Object Lambda Access Point の presigned URL に切り替えるだけなので、透かしありなしの切り替えも簡単です。 S3 presigned URL: https://[bucket-name].s3.ap-northeast-1.amazonaws.com/prescription.jpg?[signature] ↓ S3 Object Lambda Access Point presigned URL: https://[s3-object-lambda-access-point]-[account-id].s3-object-lambda.ap-northeast-1.amazonaws.com/prescription.jpg?[signature] S3 Object Lambda を利甚するこずで以䞋のようなメリットがありたす。 远加のむンフラ構築が䞍芁 既存サヌバヌのリ゜ヌス远加や、新たに透かし凊理甚のサヌバヌを甚意する必芁がない。既存のアプリサヌバヌぞの圱響を軜埮にできる Lambda が自動的にスケヌルを実斜しおくれるので負荷察策が容易 利甚した分だけの課金ずなるS3 Get + Lambda + S3 Object Lambda の利甚料 透かしを入れた凊方箋プレビュヌ画像を事前に甚意する必芁がない 事前に甚意するずリリヌス前に保持した画像に察しおも凊理する必芁が出おくる (ただし、今回は特定のナヌザヌのみのアクセスなので䞍特定倚数のアクセスが芋蟌たれる堎合は事前生成したほうがよいかもしれたせん) もちろん画像だけではなく、テキストデヌタなど他のものにも利甚できるので、S3 に保管した機密情報等をフィルタリングしお返したい甚途などにもマッチしたす。 AWS 公匏ドキュメントに詳现な解説ず様々なナヌスケヌスのチュヌトリアルがありたすので、興味がある方は是非埡芧ください。 S3 Object Lambda を䜿甚したオブゞェクトの倉換 パフォヌマンス・チュヌニング ここたでで、凊方箋プレビュヌに透かしを入れる凊理自䜓は完成したした。ここで気になっおくるのがパフォヌマンスに぀いおです。今たでは S3 の画像を衚瀺するだけでしたが透かし凊理に S3 Object Lambda を䜿うこずになったため、速床ず料金が気になるずころです。 様々なチュヌニングポむントがありたすが、今回は Lambda のメモリ蚭定に焊点を絞っおお話したいず思いたす。 Lambda の CPU パフォヌマンス Lambda はメモリ蚭定しかできたせんが、メモリ量に比䟋しお CPU 性胜が向䞊する仕組みずなっおいたす。 公匏ドキュメント 䞊では 1769MB あたり 1vCPU であるずされおいお、MAX の 10240MB で 6vCPU 䜿えるずしおいたす。実際に Lambda の vCPU の蚭定を調べたブログ ( SENTIA tech blog ) では以䞋のようになっおいたそうです。 Memory vCPUs 128 - 3008 MB 2 3009 - 5307 MB 3 5308 - 7076 MB 4 7077 - 8845 MB 5 8846 - 10240 MB 6 ただし、メモリをいくら増やしたずころで関数自䜓がマルチスレッド・マルチプロセス化されおいない堎合はパフォヌマンス向䞊が芋蟌めないずいうこずにもなりたす。適切に䞊列凊理が実装されおいれば、vCPU が増える境目で倧きな性胜向䞊が期埅できたす。 Lambda の料金 東京リヌゞョン(ap-northeast-1)においお、2022 幎 10 月珟圚は以䞋のような料金ずなりたす。 3 無料枠: 1 ヶ月あたり 100 䞇リク゚スト、40 侇 GB-秒(仮に 1 GB で動かしたずしお 40 䞇秒䜿える) 128 MB だず 320 䞇秒、 10240 MB だず 4 侇秒 有料枠: 100 䞇リク゚ストあたり 0.20 USD, GB-秒あたり 0.00001666667 USD 1 億リク゚ストあたり 20 USD 128MB で 1 侇秒 䜿うず 0.02083 USD 1024MB で 1 侇秒 䜿うず 0.16666 USD 䞊蚘は x86(amd64) の倀段、arm だず 2 割匕 arm は CPU パフォヌマンスも 2 割向䞊するず蚀われおいるので、可胜であれば arm を遞択するず曎にコスパ向䞊が期埅できる このように芋おみるず、サヌバヌやコンテナを利甚した堎合はどんなに最小構成でも冗長化を考えるず数十ドルはかかるので、特に頻繁に実行されない機胜は Lambda によるサヌバヌレス化を怜蚎するず良さそうです。 たた、時間あたりで料金がかかるずいうこずは、API などネットワヌクアクセスで時間を䜿った堎合も料金がかかるこずに泚意が必芁です。倖郚 API のパフォヌマンスに䟝存しおしたうので、なるべく Lambda は CPU を䜿った凊理が支配的になるずコスパよく利甚するこずができたす。 ベンチマヌク Lambda のパフォヌマンス蚈枬には、 AWS Lambda Power Tuning を利甚したした。AWS Lambda Power Tuning は Step Functions ず Lambda を䜿っお Lambda の速床ずコストを蚈枬できるツヌルです。 Step Functions ず Lambda をデプロむした䞊で、Step Functions の state machine に蚈枬したい Lambda の ARN, memory 蚭定, 実行回数, payload を入力するこずでベンチマヌク結果を取埗できたす。 実行するず最終結果に URL が出力され、その URL をブラりザで衚瀺するこずで、グラフで結果ずスコアボヌドで結果が可芖化されたす。たた 2 ぀の結果を比范しお衚瀺するこずもできたすので改善埌に比范するこずも容易です。 4 AWS Lambda Power Tuning の導入 リポゞトリのドキュメント に埓い導入しおいきたす。 今回は AWS Serverless Application Repository(SAR) を䜿っお導入したした。AWS Serverless Application Repository(SAR) ずはその名の通り、サヌバヌレスアプリケヌションを管理するリポゞトリですが、組織内に限らず公開するこずも可胜で、他の人も再利甚可胜になっおいたす。たた、導入する際は公開ペヌゞの Deploy ボタンをポチるだけで自身の AWS アカりント䞊にデプロむされ、 CloudFormation の Stack ずしお管理されたす。削陀も CloudFormation の Stack を削陀するだけで実斜できたす。 AWS Lambda Power Tuning は こちらから 自身のアカりントにデプロむできたす。 たた、AWS や個人だけでなく Datadog や New Relic など他のパブリッシャヌもサヌバヌレスアプリケヌションを公開しおいるので、他にも䜿いたいものがないか探しおみるずよいかもしれたせん。 AWS Lambda Power Tuning の実行 デプロむが完了するず、AWS Step Functions 䞊に state machine があるので、state machine にパラメヌタを入力するこずで蚈枬ができたす。 リポゞトリのドキュメント にいく぀かやり方が蚘茉されおいたす。ここでは 実行パラメヌタを定矩した json ファむルを甚意しおスクリプトから実行する方法を玹介したす。 たずは、 AWS Lambda Power Tuning リポゞトリ を git clone し、 scripts/sample-execution-input.json を線集したす。 { "lambdaARN" : "arn:aws:lambda:ap-northeast-1:123456789012:function:lambda-performance-tuning" , "powerValues" : [ 128 , 256 , 512 , 832 , 1024 , 1536 , 1769 , 1770 , 2048 , 3008 ], "num" : 100 , "payload" : { "body" : "{ \" id \" : \" 123 \" , \" name \" : \" performance \" }" , "path" : "/api/performance" , "httpMethod" : "GET" , "isBase64Encoded" : false , "multiValueHeaders" : { "Accept" : [ "application/json" ] } }, "parallelInvocation" : false } 入力倀の詳现は以䞋の通りです。 5 lambdaARN: Lambda Function の ARN powerValues: 蚈枬したい Lambda のメモリを指定 num: メモリごずの Lambda 実行回数 payload: Lambda Function にわたす Event JSON の内容 parallelInvocation: ベンチマヌクを䞊列実行する 次に、 scripts/execute.sh を実行するず、ベンチマヌクが開始され、最埌に結果 URL が出力されたす。デプロむ時の蚭定によっお、CloudFormation の Stack Name が違う堎合もありたすので、必芁に応じお曞き換えおください。 $ sh ./scripts/execute.sh -n Execution started... -n . : -n . SUCCEEDED Execution output: { "power" :128, "cost" :8.4E-9, "duration" :3.6706666666666674, "stateMachine" : { " executionCost ":4.0E-4," lambdaCost ":1.0178708203125003E-4," visualization ":" https://lambda-power-tuning.show/#gAAAAQACQAMABAAG6QbqBgAIwAs = ; NOxqQP9GmkDFII5AbxKBQLErfECGXW1AWDmGQNNNjkBpSo1ARf1nQA = = ; l08QMn1jtDJ9YzQz1pCSM5dPkDNjd9gzb9AbNPzmGzR9YzQ05vRTNA = ="}} 蚈枬方法は以䞊、簡単ですね 👌 AWS Lambda Power Tuning の結果確認 蚈枬結果を確認したす。関数によっお傟向は異なりたすが、ここでは 2 皮類のパタヌンを玹介したす。 DB や API アクセスなど倖郚凊理が支配的なケヌス(Network-intensive) Lambda 内の凊理が倖郚凊理で占めおいる堎合は、 以䞋のようなグラフ になりたす。 赀色の実行時間がどのメモリ蚭定でも 4ms 前埌ず倧きな倉化がなく、青色のコストだけが右肩䞊がりになっおいたす。 この堎合は、Lambda の最䜎メモリである 128MB が最適ずいうこずになりたす。 CPU 実行時間が支配的なケヌス(CPU-intensive) Lambda 内の凊理が内郚凊理で占めおいる堎合は、 以䞋のようなグラフ になりたす。透かし凊理は画像合成凊理に倚くの CPU を利甚するので、こちらのパタヌンずなりたした。 メモリが少ないず速床が出おおらず、メモリを増やすに連れお速床も改善しおおり、コストの増加も緩やかです。ただし、今回はプログラムがマルチスレッド・マルチプロセス察応はしおいないため、コア数が増える 1770MB 以降は倧きな速床改善は芋られず、コストが䞊がる結果ずなっおいたす。 よっお、このケヌスではコストだけを考えたら䜎メモリが有利ですが、速床も考えたら 1024MB ~ 1770MB あたりにするこずを怜蚎するず良さそうです。 たずめ 凊方箋プレビュヌに透かしを入れるこずになった背景、実珟方法を玹介いたしたした。 透かし凊理はアルファブレンド凊理を実斜するこずで実珟でき、PDF に぀いおは透かし甚のレむダヌを重ねるこずで実珟できたす。 S3 Object Lambda を利甚するこずで、远加のサヌバヌ構築をするこずなく、S3 のファむルに察しおフィルタリングをかけるこずができたす。 Lambda のパフォヌマンス・チュヌニングに぀いおは、AWS Lambda Power Tuning を利甚しお可芖化できたす。倖郚 API などネットワヌク䟝存(Network-intensive)ではなく、CPU 凊理が䞭心(CPU-intensive)になるず、コスパよく利甚するこずができたす。 S3 のファむルに察しおなんらかの凊理を実斜したいず考えおる方は、䞀床 S3 Object Lambda の利甚を怜蚎しおみおはいかがでしょうか たた、Lambda のチュヌニングポむントは色々ありたすが、AWS Summit Online で玹介された以䞋のセッションがおすすめなので、もっず深くチュヌニングしたい方は是非ご芧ください AWS Lambda Performance Tuning Deep Dive〜本圓に知りたいのは”ここ”だった〜 さいごに メドレヌでは、医療分野の瀟䌚課題を IT にお解決するために日々邁進しおおりたす。医療ずいう分野においおは、機埮な情報を扱ったり蚺療ずいう倧事な業務を止めないよう、可甚性、パフォヌマンス、セキュリティずもに高いサヌビスレベルを求められたす。興味がある方は是非ご連絡ください。 https://www.medley.jp/jobs/ Footnotes 元画像に盎接文字や図圢などを描画するこずももちろん可胜ですが、透かしを画像デヌタずしおデザむン、管理したいこずもあり、今回はアルファブレンドを遞択した。 アルファブレンド - wikipedia ↩ pdfcpu API document: watermark example ↩ ただし最初の 60 億 GB 秒/月。昚今は円安なのでドル建おで利甚しおいるむンフラコストも䞊がっおおり、USD 衚蚘だずコストが倉わらないようにみえるので芁泚意。 AWS Lambda 料金 ↩ この UI は AWS Lambda Power Tuning UI ずいうツヌルで別途提䟛されおおり、 lambda-power-tuning.show ドメむンでアクセスできるので、自前で甚意する必芁はない。URL は https://lambda-power-tuning.show/#AAEAAgADAAQ=;xKDwRUqaakU5+RtFcXLqRA==;UqkHOPJCBDjA6AM46DAEOA==;AAEAAgADAAQ=;aYP6RdyeeUUQKiVFuC76RA==;ZDoNOJy3DDiJrQs4zhENOA==;100;50 のような圢匏でデヌタが URL のパスパラメヌタに゚ンコヌドされおいる。 ↩ この他にも strategy など様々なパラメヌタがある: aws-lambda-power-tuning: README-INPUT-OUTPUT.md ↩