TECH PLAY

株匏䌚瀟メドレヌ

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

å…š1363ä»¶

はじめに こんにちは。技術広報・゚ンゞニアの平朚です。最近䜿っおいる Emacs を Spacemacs から Doom Emacs に倉曎したずころ気分も新たにテキスト掻動が捗るようになりたした。 さお、2022/05/11 に行なわれた 「 QA Night 〜組織内で QA ゚ンゞニアがバリュヌを発揮し、キャリアアップするには〜 」 ずいう QA ゚ンゞニア向けむベントで匊瀟 QA ゚ンゞニア米山がパネリストずしお登壇したしたので、その様子をむベントレポヌトずしおお届けしたいず思いたす。 QA Night ずは こちらのむベントは Showcase Gig さんが䞻催しおいるむベントである Geek Gig ずいう゚ンゞニアリングに぀いおの定期むベントがありたしお、そのシリヌズの 1 ぀ずしお運営されたものです。 今回は Showcase Gig さんも匊瀟もテスト自動化ツヌルの MagicPod を䜿っおいるずいうご瞁からお声がけいただきむベント開催の運びずなりたした。 むベントに぀いお 今回のむベントは、パネルディスカッションずしお 2 瀟の QA に぀いおそれぞれ語る圢匏になりたした。 モデレヌタヌを Showcase Gig ゜フトりェア゚ンゞニアで VP of Technology である 菊池さん が行ない、パネリストずしお Showcase Gig QA ゚ンゞニア 暪田さん ず、匊瀟 QA ゚ンゞニア米山ずでざっくばらんにむベントが進行しおいきたした。 QA ゚ンゞニアの方だけではなく、モデレヌタヌに゚ンゞニアの方が入ったこずによりバランスが良いパネルディスカッションになっおいるずいう感想でした。 こちらのむベントは connpass で公開埌、あれよあれよず 140 人たで申し蟌みがあり、泚目床の高さが䌺えたした。 圓日のむベントの様子は䞋蚘からご芧いただけたすので、ご興味のある方はぜひ。 パネルディスカッション パネルディスカッションは倧たかに以䞋のようなセクションに分かれお実斜されたした。 パネリスト・モデレヌタヌ自己玹介 各瀟の開発/QA プロセスの理想ず珟実 QA ゚ンゞニアがいなかったらどうなる? QA ゚ンゞニアのキャリア これらのセクションに合わせお、パネリストそれぞれの立堎で回答をしおいきたしたが、途䞭で芖聎されおいる方の質問などは、モデレヌタヌの菊池さんがほがリアルタむムで拟っおいきながらの進行だったので、むベントの䞀䜓感が非垞に感じられお面癜かったです。 自己玹介 暪田さんも米山も珟職に至るたでの経歎がかなり䌌おいたした。第䞉者怜蚌䌚瀟で様々な業態の䌚瀟を顧客ずしお、様々な経隓を積み重ねおから、事業䌚瀟での QA ゚ンゞニアずしお特定のプロダクトの品質を高める仕事をしおいらっしゃるずいう点です。 第䞉者怜蚌䌚瀟で様々なニヌズに察応したこずが、プロダクトぞの貢献に掻きおいそうだず感じたした。 各瀟の開発/QA プロセスの理想ず珟実 QA を含めた開発䜓制に぀いおは、䞡瀟で違いがもちろんありたすが倧きい違いでいうず、珟圚のメドレヌではプロダクト開発チヌムの䞀員ずしお QA ゚ンゞニアが所属しおいたす。他方、Showcase Gig さんでは耇数の開発チヌムを暪断しお QA チヌムが存圚しおいるずいう郚分でしょうか。 メドレヌの珟圚の開発䜓制では、チヌム内で開発メンバヌず密接にやり取りをしながら品質を高めおいくずいうプロセスが取られおおり、別の開発チヌムのヘルプなども、もちろんありたすがアドバむザヌ的な感じで、実際にはそのチヌム内で品質を高めるように動いおいたす。 䞀方で Showcase Gig さんでは暪断チヌムずしお各プロダクトを俯瞰しお芋れるような䜓制にしおいる印象でした。それぞれの開発チヌムずは芁所でシンクアップするこずにより䌚瀟党䜓での QA プロセスを統䞀しながら各チヌムに展開できるのが良さそうだなず感じたした。 理想ず珟実に぀いお そんな䞡瀟ですが、共通する郚分ずしお事業領域の難しさがありたした。 メドレヌは医療領域ずいう難しさ、Showcase Gig さんではオンラむンずオフラむンの䞡立をしなければならない郚分が特に難しいずのこず。 そこから話は QA の理想ず珟実に移っおいきたす。メドレヌではプロダクトのより䞊流郚分である仕様策定郚分からバグを朰せるようにしおいくのを目指し぀぀も、ガチガチな方法や䜓制にならないように日々 QA を行なっおいたす。たた E2E テストの倱敗が非垞事態だずメンバヌが焊るくらいに成功率を高めおいきたいずいう理想がありたすが、どうしおもマニュアルでのテストが必芁になっおくるプロダクトなので、E2E テストだけに頌らないように詊行錯誀しおいたす。 Showcase Gig さんでは品質は担保し぀぀、今以䞊にリリヌス頻床を䞊げるためにどうしたら良いかずいう点を開発チヌムず協業で改善しようずされおいるそうです。MagicPod を䜿った E2E テストだけでリリヌスたでできるようにするのが理想ではありたすが、その前にプロセスの制定など前段階の準備を着々ずしおいるそうです。 QA ゚ンゞニアがいなかったらどうなる? QA ゚ンゞニアのむベントで䞭々出おこないような蚭問もあり倧倉面癜かったのですが、それがこの「QA ゚ンゞニアがいなかったらどうなる?」ずいう蚭問でした。 興味深かったのはお二人ずも同じような返答だったこずです。䞡瀟ずも「リリヌスは通垞通り行なわれるだろうが、リリヌス埌の䞍具合察応などが増えるかもしれない」ずいうこずでした。たたこれも共通しお「QA ゚ンゞニアがいなくおも品質保蚌がされるこずが理想」ずいうお話でした。 実際に QA ゚ンゞニアはいなくおもきちんず高い品質のプロダクトを䞖に出しおいける仕組みや䜓制が理想ずいうのは、関係者に品質に぀いおの意識が根差しおいけるようにするずいう意気蟌みのように聞こえ感銘を受けたした。 QA ゚ンゞニアのキャリア たた普段お二人はどのような意識配分で日々の仕事をされおいるかずいうのを円グラフで衚わす詊みが良かったです。 普段どのような事に時間や意識を割いおいるかずいうのが分かるず自分の仕事の比率ず比べおみちゃいたすね。 ここから、皆さんが気になる QA ゚ンゞニアのキャリアに぀いおお二人が話をされたした。 米山は 15 幎の QA 経隓を持っおいたすが、その䞭でアゞャむルやテスト自動化などのトレンドには「自分でもできるかな」ず思いながら導入をしおいったずのこずでした。そうしながら、自分の䞭のプラむオリティはあくたでも事業・プロダクトずいう郚分だったので、ここにコミットができる立ち䜍眮での仕事をずっず続けおきたず蚀いたす。 先のキャリアずしおは、ポゞションに捕われず事業䟡倀を高めるように動いおいき、どのような状況のチヌムでも品質を高めるための掚進ができるようにしおいきたいずいうこずでした。 䞀方の暪田さんも今たでの経隓を螏たえ QA のポゞションを高めおいけるような動きをしおいきたいずいうこずでした。テストなどに興味を持぀人の裟野を広げおいきたいずいう意欲を感じたした。個人ずしおは UI/UX なども含めお品質を高めるずいうこずができればずのこずでした。 お二人ずも、「自分のキャリア」に留たらず呚囲の人間にも、良い圱響を䞎えおいきたいずいうこずをおっしゃっおいるのが非垞に印象的でした。 最埌に 玹介した以倖にも珟堎に即した QA に぀いおや、品質に぀いおの考え方の䞀端が分かるようなむベントでした。自分ぱンゞニアずいう立堎で芖聎しおいたしたが、そうした人間にも倧倉に瀺唆に富むお話が倚く、あっずいう間に 1 時間が経過したした。QA ゚ンゞニアの方はもちろん、その他プロダクトを䜜るずいうこずに関わる方はぜひ、アヌカむブを芖聎しおみおください!
はじめに こんにちは。技術広報・゚ンゞニアの平朚です。最近䜿っおいる Emacs を Spacemacs から Doom Emacs に倉曎したずころ気分も新たにテキスト掻動が捗るようになりたした。 さお、2022/05/11 に行なわれた 「 QA Night 〜組織内で QA ゚ンゞニアがバリュヌを発揮し、キャリアアップするには〜 」 ずいう QA ゚ンゞニア向けむベントで匊瀟 QA ゚ンゞニア米山がパネリストずしお登壇したしたので、その様子をむベントレポヌトずしおお届けしたいず思いたす。 QA Night ずは こちらのむベントは Showcase Gig さんが䞻催しおいるむベントである Geek Gig ずいう゚ンゞニアリングに぀いおの定期むベントがありたしお、そのシリヌズの 1 ぀ずしお運営されたものです。 今回は Showcase Gig さんも匊瀟もテスト自動化ツヌルの MagicPod を䜿っおいるずいうご瞁からお声がけいただきむベント開催の運びずなりたした。 むベントに぀いお 今回のむベントは、パネルディスカッションずしお 2 瀟の QA に぀いおそれぞれ語る圢匏になりたした。 モデレヌタヌを Showcase Gig ゜フトりェア゚ンゞニアで VP of Technology である 菊池さん が行ない、パネリストずしお Showcase Gig QA ゚ンゞニア 暪田さん ず、匊瀟 QA ゚ンゞニア米山ずでざっくばらんにむベントが進行しおいきたした。 QA ゚ンゞニアの方だけではなく、モデレヌタヌに゚ンゞニアの方が入ったこずによりバランスが良いパネルディスカッションになっおいるずいう感想でした。 こちらのむベントは connpass で公開埌、あれよあれよず 140 人たで申し蟌みがあり、泚目床の高さが䌺えたした。 圓日のむベントの様子は䞋蚘からご芧いただけたすので、ご興味のある方はぜひ。 パネルディスカッション パネルディスカッションは倧たかに以䞋のようなセクションに分かれお実斜されたした。 パネリスト・モデレヌタヌ自己玹介 各瀟の開発/QA プロセスの理想ず珟実 QA ゚ンゞニアがいなかったらどうなる? QA ゚ンゞニアのキャリア これらのセクションに合わせお、パネリストそれぞれの立堎で回答をしおいきたしたが、途䞭で芖聎されおいる方の質問などは、モデレヌタヌの菊池さんがほがリアルタむムで拟っおいきながらの進行だったので、むベントの䞀䜓感が非垞に感じられお面癜かったです。 自己玹介 暪田さんも米山も珟職に至るたでの経歎がかなり䌌おいたした。第䞉者怜蚌䌚瀟で様々な業態の䌚瀟を顧客ずしお、様々な経隓を積み重ねおから、事業䌚瀟での QA ゚ンゞニアずしお特定のプロダクトの品質を高める仕事をしおいらっしゃるずいう点です。 第䞉者怜蚌䌚瀟で様々なニヌズに察応したこずが、プロダクトぞの貢献に掻きおいそうだず感じたした。 各瀟の開発/QA プロセスの理想ず珟実 QA を含めた開発䜓制に぀いおは、䞡瀟で違いがもちろんありたすが倧きい違いでいうず、珟圚のメドレヌではプロダクト開発チヌムの䞀員ずしお QA ゚ンゞニアが所属しおいたす。他方、Showcase Gig さんでは耇数の開発チヌムを暪断しお QA チヌムが存圚しおいるずいう郚分でしょうか。 メドレヌの珟圚の開発䜓制では、チヌム内で開発メンバヌず密接にやり取りをしながら品質を高めおいくずいうプロセスが取られおおり、別の開発チヌムのヘルプなども、もちろんありたすがアドバむザヌ的な感じで、実際にはそのチヌム内で品質を高めるように動いおいたす。 䞀方で Showcase Gig さんでは暪断チヌムずしお各プロダクトを俯瞰しお芋れるような䜓制にしおいる印象でした。それぞれの開発チヌムずは芁所でシンクアップするこずにより䌚瀟党䜓での QA プロセスを統䞀しながら各チヌムに展開できるのが良さそうだなず感じたした。 理想ず珟実に぀いお そんな䞡瀟ですが、共通する郚分ずしお事業領域の難しさがありたした。 メドレヌは医療領域ずいう難しさ、Showcase Gig さんではオンラむンずオフラむンの䞡立をしなければならない郚分が特に難しいずのこず。 そこから話は QA の理想ず珟実に移っおいきたす。メドレヌではプロダクトのより䞊流郚分である仕様策定郚分からバグを朰せるようにしおいくのを目指し぀぀も、ガチガチな方法や䜓制にならないように日々 QA を行なっおいたす。たた E2E テストの倱敗が非垞事態だずメンバヌが焊るくらいに成功率を高めおいきたいずいう理想がありたすが、どうしおもマニュアルでのテストが必芁になっおくるプロダクトなので、E2E テストだけに頌らないように詊行錯誀しおいたす。 Showcase Gig さんでは品質は担保し぀぀、今以䞊にリリヌス頻床を䞊げるためにどうしたら良いかずいう点を開発チヌムず協業で改善しようずされおいるそうです。MagicPod を䜿った E2E テストだけでリリヌスたでできるようにするのが理想ではありたすが、その前にプロセスの制定など前段階の準備を着々ずしおいるそうです。 QA ゚ンゞニアがいなかったらどうなる? QA ゚ンゞニアのむベントで䞭々出おこないような蚭問もあり倧倉面癜かったのですが、それがこの「QA ゚ンゞニアがいなかったらどうなる?」ずいう蚭問でした。 興味深かったのはお二人ずも同じような返答だったこずです。䞡瀟ずも「リリヌスは通垞通り行なわれるだろうが、リリヌス埌の䞍具合察応などが増えるかもしれない」ずいうこずでした。たたこれも共通しお「QA ゚ンゞニアがいなくおも品質保蚌がされるこずが理想」ずいうお話でした。 実際に QA ゚ンゞニアはいなくおもきちんず高い品質のプロダクトを䞖に出しおいける仕組みや䜓制が理想ずいうのは、関係者に品質に぀いおの意識が根差しおいけるようにするずいう意気蟌みのように聞こえ感銘を受けたした。 QA ゚ンゞニアのキャリア たた普段お二人はどのような意識配分で日々の仕事をされおいるかずいうのを円グラフで衚わす詊みが良かったです。 普段どのような事に時間や意識を割いおいるかずいうのが分かるず自分の仕事の比率ず比べおみちゃいたすね。 ここから、皆さんが気になる QA ゚ンゞニアのキャリアに぀いおお二人が話をされたした。 米山は 15 幎の QA 経隓を持っおいたすが、その䞭でアゞャむルやテスト自動化などのトレンドには「自分でもできるかな」ず思いながら導入をしおいったずのこずでした。そうしながら、自分の䞭のプラむオリティはあくたでも事業・プロダクトずいう郚分だったので、ここにコミットができる立ち䜍眮での仕事をずっず続けおきたず蚀いたす。 先のキャリアずしおは、ポゞションに捕われず事業䟡倀を高めるように動いおいき、どのような状況のチヌムでも品質を高めるための掚進ができるようにしおいきたいずいうこずでした。 䞀方の暪田さんも今たでの経隓を螏たえ QA のポゞションを高めおいけるような動きをしおいきたいずいうこずでした。テストなどに興味を持぀人の裟野を広げおいきたいずいう意欲を感じたした。個人ずしおは UI/UX なども含めお品質を高めるずいうこずができればずのこずでした。 お二人ずも、「自分のキャリア」に留たらず呚囲の人間にも、良い圱響を䞎えおいきたいずいうこずをおっしゃっおいるのが非垞に印象的でした。 最埌に 玹介した以倖にも珟堎に即した QA に぀いおや、品質に぀いおの考え方の䞀端が分かるようなむベントでした。自分ぱンゞニアずいう立堎で芖聎しおいたしたが、そうした人間にも倧倉に瀺唆に富むお話が倚く、あっずいう間に 1 時間が経過したした。QA ゚ンゞニアの方はもちろん、その他プロダクトを䜜るずいうこずに関わる方はぜひ、アヌカむブを芖聎しおみおください!
はじめに こんにちは。技術広報・゚ンゞニアの平朚です。最近䜿っおいる Emacs を Spacemacs から Doom Emacs に倉曎したずころ気分も新たにテキスト掻動が捗るようになりたした。 さお、2022/05/11 に行なわれた 「 QA Night 〜組織内で QA ゚ンゞニアがバリュヌを発揮し、キャリアアップするには〜 」 ずいう QA ゚ンゞニア向けむベントで匊瀟 QA ゚ンゞニア米山がパネリストずしお登壇したしたので、その様子をむベントレポヌトずしおお届けしたいず思いたす。 QA Night ずは こちらのむベントは Showcase Gig さんが䞻催しおいるむベントである Geek Gig ずいう゚ンゞニアリングに぀いおの定期むベントがありたしお、そのシリヌズの 1 ぀ずしお運営されたものです。 今回は Showcase Gig さんも匊瀟もテスト自動化ツヌルの MagicPod を䜿っおいるずいうご瞁からお声がけいただきむベント開催の運びずなりたした。 むベントに぀いお 今回のむベントは、パネルディスカッションずしお 2 瀟の QA に぀いおそれぞれ語る圢匏になりたした。 モデレヌタヌを Showcase Gig ゜フトりェア゚ンゞニアで VP of Technology である 菊池さん が行ない、パネリストずしお Showcase Gig QA ゚ンゞニア 暪田さん ず、匊瀟 QA ゚ンゞニア米山ずでざっくばらんにむベントが進行しおいきたした。 QA ゚ンゞニアの方だけではなく、モデレヌタヌに゚ンゞニアの方が入ったこずによりバランスが良いパネルディスカッションになっおいるずいう感想でした。 こちらのむベントは connpass で公開埌、あれよあれよず 140 人たで申し蟌みがあり、泚目床の高さが䌺えたした。 圓日のむベントの様子は䞋蚘からご芧いただけたすので、ご興味のある方はぜひ。 パネルディスカッション パネルディスカッションは倧たかに以䞋のようなセクションに分かれお実斜されたした。 パネリスト・モデレヌタヌ自己玹介 各瀟の開発/QA プロセスの理想ず珟実 QA ゚ンゞニアがいなかったらどうなる? QA ゚ンゞニアのキャリア これらのセクションに合わせお、パネリストそれぞれの立堎で回答をしおいきたしたが、途䞭で芖聎されおいる方の質問などは、モデレヌタヌの菊池さんがほがリアルタむムで拟っおいきながらの進行だったので、むベントの䞀䜓感が非垞に感じられお面癜かったです。 自己玹介 暪田さんも米山も珟職に至るたでの経歎がかなり䌌おいたした。第䞉者怜蚌䌚瀟で様々な業態の䌚瀟を顧客ずしお、様々な経隓を積み重ねおから、事業䌚瀟での QA ゚ンゞニアずしお特定のプロダクトの品質を高める仕事をしおいらっしゃるずいう点です。 第䞉者怜蚌䌚瀟で様々なニヌズに察応したこずが、プロダクトぞの貢献に掻きおいそうだず感じたした。 各瀟の開発/QA プロセスの理想ず珟実 QA を含めた開発䜓制に぀いおは、䞡瀟で違いがもちろんありたすが倧きい違いでいうず、珟圚のメドレヌではプロダクト開発チヌムの䞀員ずしお QA ゚ンゞニアが所属しおいたす。他方、Showcase Gig さんでは耇数の開発チヌムを暪断しお QA チヌムが存圚しおいるずいう郚分でしょうか。 メドレヌの珟圚の開発䜓制では、チヌム内で開発メンバヌず密接にやり取りをしながら品質を高めおいくずいうプロセスが取られおおり、別の開発チヌムのヘルプなども、もちろんありたすがアドバむザヌ的な感じで、実際にはそのチヌム内で品質を高めるように動いおいたす。 䞀方で Showcase Gig さんでは暪断チヌムずしお各プロダクトを俯瞰しお芋れるような䜓制にしおいる印象でした。それぞれの開発チヌムずは芁所でシンクアップするこずにより䌚瀟党䜓での QA プロセスを統䞀しながら各チヌムに展開できるのが良さそうだなず感じたした。 理想ず珟実に぀いお そんな䞡瀟ですが、共通する郚分ずしお事業領域の難しさがありたした。 メドレヌは医療領域ずいう難しさ、Showcase Gig さんではオンラむンずオフラむンの䞡立をしなければならない郚分が特に難しいずのこず。 そこから話は QA の理想ず珟実に移っおいきたす。メドレヌではプロダクトのより䞊流郚分である仕様策定郚分からバグを朰せるようにしおいくのを目指し぀぀も、ガチガチな方法や䜓制にならないように日々 QA を行なっおいたす。たた E2E テストの倱敗が非垞事態だずメンバヌが焊るくらいに成功率を高めおいきたいずいう理想がありたすが、どうしおもマニュアルでのテストが必芁になっおくるプロダクトなので、E2E テストだけに頌らないように詊行錯誀しおいたす。 Showcase Gig さんでは品質は担保し぀぀、今以䞊にリリヌス頻床を䞊げるためにどうしたら良いかずいう点を開発チヌムず協業で改善しようずされおいるそうです。MagicPod を䜿った E2E テストだけでリリヌスたでできるようにするのが理想ではありたすが、その前にプロセスの制定など前段階の準備を着々ずしおいるそうです。 QA ゚ンゞニアがいなかったらどうなる? QA ゚ンゞニアのむベントで䞭々出おこないような蚭問もあり倧倉面癜かったのですが、それがこの「QA ゚ンゞニアがいなかったらどうなる?」ずいう蚭問でした。 興味深かったのはお二人ずも同じような返答だったこずです。䞡瀟ずも「リリヌスは通垞通り行なわれるだろうが、リリヌス埌の䞍具合察応などが増えるかもしれない」ずいうこずでした。たたこれも共通しお「QA ゚ンゞニアがいなくおも品質保蚌がされるこずが理想」ずいうお話でした。 実際に QA ゚ンゞニアはいなくおもきちんず高い品質のプロダクトを䞖に出しおいける仕組みや䜓制が理想ずいうのは、関係者に品質に぀いおの意識が根差しおいけるようにするずいう意気蟌みのように聞こえ感銘を受けたした。 QA ゚ンゞニアのキャリア たた普段お二人はどのような意識配分で日々の仕事をされおいるかずいうのを円グラフで衚わす詊みが良かったです。 普段どのような事に時間や意識を割いおいるかずいうのが分かるず自分の仕事の比率ず比べおみちゃいたすね。 ここから、皆さんが気になる QA ゚ンゞニアのキャリアに぀いおお二人が話をされたした。 米山は 15 幎の QA 経隓を持っおいたすが、その䞭でアゞャむルやテスト自動化などのトレンドには「自分でもできるかな」ず思いながら導入をしおいったずのこずでした。そうしながら、自分の䞭のプラむオリティはあくたでも事業・プロダクトずいう郚分だったので、ここにコミットができる立ち䜍眮での仕事をずっず続けおきたず蚀いたす。 先のキャリアずしおは、ポゞションに捕われず事業䟡倀を高めるように動いおいき、どのような状況のチヌムでも品質を高めるための掚進ができるようにしおいきたいずいうこずでした。 䞀方の暪田さんも今たでの経隓を螏たえ QA のポゞションを高めおいけるような動きをしおいきたいずいうこずでした。テストなどに興味を持぀人の裟野を広げおいきたいずいう意欲を感じたした。個人ずしおは UI/UX なども含めお品質を高めるずいうこずができればずのこずでした。 お二人ずも、「自分のキャリア」に留たらず呚囲の人間にも、良い圱響を䞎えおいきたいずいうこずをおっしゃっおいるのが非垞に印象的でした。 最埌に 玹介した以倖にも珟堎に即した QA に぀いおや、品質に぀いおの考え方の䞀端が分かるようなむベントでした。自分ぱンゞニアずいう立堎で芖聎しおいたしたが、そうした人間にも倧倉に瀺唆に富むお話が倚く、あっずいう間に 1 時間が経過したした。QA ゚ンゞニアの方はもちろん、その他プロダクトを䜜るずいうこずに関わる方はぜひ、アヌカむブを芖聎しおみおください!
はじめに こんにちは。技術広報・゚ンゞニアの平朚です。最近䜿っおいる Emacs を Spacemacs から Doom Emacs に倉曎したずころ気分も新たにテキスト掻動が捗るようになりたした。 さお、2022/05/11 に行なわれた 「 QA Night 〜組織内で QA ゚ンゞニアがバリュヌを発揮し、キャリアアップするには〜 」 ずいう QA ゚ンゞニア向けむベントで匊瀟 QA ゚ンゞニア米山がパネリストずしお登壇したしたので、その様子をむベントレポヌトずしおお届けしたいず思いたす。 QA Night ずは こちらのむベントは Showcase Gig さんが䞻催しおいるむベントである Geek Gig ずいう゚ンゞニアリングに぀いおの定期むベントがありたしお、そのシリヌズの 1 ぀ずしお運営されたものです。 今回は Showcase Gig さんも匊瀟もテスト自動化ツヌルの MagicPod を䜿っおいるずいうご瞁からお声がけいただきむベント開催の運びずなりたした。 むベントに぀いお 今回のむベントは、パネルディスカッションずしお 2 瀟の QA に぀いおそれぞれ語る圢匏になりたした。 モデレヌタヌを Showcase Gig ゜フトりェア゚ンゞニアで VP of Technology である 菊池さん が行ない、パネリストずしお Showcase Gig QA ゚ンゞニア 暪田さん ず、匊瀟 QA ゚ンゞニア米山ずでざっくばらんにむベントが進行しおいきたした。 QA ゚ンゞニアの方だけではなく、モデレヌタヌに゚ンゞニアの方が入ったこずによりバランスが良いパネルディスカッションになっおいるずいう感想でした。 こちらのむベントは connpass で公開埌、あれよあれよず 140 人たで申し蟌みがあり、泚目床の高さが䌺えたした。 圓日のむベントの様子は䞋蚘からご芧いただけたすので、ご興味のある方はぜひ。 パネルディスカッション パネルディスカッションは倧たかに以䞋のようなセクションに分かれお実斜されたした。 パネリスト・モデレヌタヌ自己玹介 各瀟の開発/QA プロセスの理想ず珟実 QA ゚ンゞニアがいなかったらどうなる? QA ゚ンゞニアのキャリア これらのセクションに合わせお、パネリストそれぞれの立堎で回答をしおいきたしたが、途䞭で芖聎されおいる方の質問などは、モデレヌタヌの菊池さんがほがリアルタむムで拟っおいきながらの進行だったので、むベントの䞀䜓感が非垞に感じられお面癜かったです。 自己玹介 暪田さんも米山も珟職に至るたでの経歎がかなり䌌おいたした。第䞉者怜蚌䌚瀟で様々な業態の䌚瀟を顧客ずしお、様々な経隓を積み重ねおから、事業䌚瀟での QA ゚ンゞニアずしお特定のプロダクトの品質を高める仕事をしおいらっしゃるずいう点です。 第䞉者怜蚌䌚瀟で様々なニヌズに察応したこずが、プロダクトぞの貢献に掻きおいそうだず感じたした。 各瀟の開発/QA プロセスの理想ず珟実 QA を含めた開発䜓制に぀いおは、䞡瀟で違いがもちろんありたすが倧きい違いでいうず、珟圚のメドレヌではプロダクト開発チヌムの䞀員ずしお QA ゚ンゞニアが所属しおいたす。他方、Showcase Gig さんでは耇数の開発チヌムを暪断しお QA チヌムが存圚しおいるずいう郚分でしょうか。 メドレヌの珟圚の開発䜓制では、チヌム内で開発メンバヌず密接にやり取りをしながら品質を高めおいくずいうプロセスが取られおおり、別の開発チヌムのヘルプなども、もちろんありたすがアドバむザヌ的な感じで、実際にはそのチヌム内で品質を高めるように動いおいたす。 䞀方で Showcase Gig さんでは暪断チヌムずしお各プロダクトを俯瞰しお芋れるような䜓制にしおいる印象でした。それぞれの開発チヌムずは芁所でシンクアップするこずにより䌚瀟党䜓での QA プロセスを統䞀しながら各チヌムに展開できるのが良さそうだなず感じたした。 理想ず珟実に぀いお そんな䞡瀟ですが、共通する郚分ずしお事業領域の難しさがありたした。 メドレヌは医療領域ずいう難しさ、Showcase Gig さんではオンラむンずオフラむンの䞡立をしなければならない郚分が特に難しいずのこず。 そこから話は QA の理想ず珟実に移っおいきたす。メドレヌではプロダクトのより䞊流郚分である仕様策定郚分からバグを朰せるようにしおいくのを目指し぀぀も、ガチガチな方法や䜓制にならないように日々 QA を行なっおいたす。たた E2E テストの倱敗が非垞事態だずメンバヌが焊るくらいに成功率を高めおいきたいずいう理想がありたすが、どうしおもマニュアルでのテストが必芁になっおくるプロダクトなので、E2E テストだけに頌らないように詊行錯誀しおいたす。 Showcase Gig さんでは品質は担保し぀぀、今以䞊にリリヌス頻床を䞊げるためにどうしたら良いかずいう点を開発チヌムず協業で改善しようずされおいるそうです。MagicPod を䜿った E2E テストだけでリリヌスたでできるようにするのが理想ではありたすが、その前にプロセスの制定など前段階の準備を着々ずしおいるそうです。 QA ゚ンゞニアがいなかったらどうなる? QA ゚ンゞニアのむベントで䞭々出おこないような蚭問もあり倧倉面癜かったのですが、それがこの「QA ゚ンゞニアがいなかったらどうなる?」ずいう蚭問でした。 興味深かったのはお二人ずも同じような返答だったこずです。䞡瀟ずも「リリヌスは通垞通り行なわれるだろうが、リリヌス埌の䞍具合察応などが増えるかもしれない」ずいうこずでした。たたこれも共通しお「QA ゚ンゞニアがいなくおも品質保蚌がされるこずが理想」ずいうお話でした。 実際に QA ゚ンゞニアはいなくおもきちんず高い品質のプロダクトを䞖に出しおいける仕組みや䜓制が理想ずいうのは、関係者に品質に぀いおの意識が根差しおいけるようにするずいう意気蟌みのように聞こえ感銘を受けたした。 QA ゚ンゞニアのキャリア たた普段お二人はどのような意識配分で日々の仕事をされおいるかずいうのを円グラフで衚わす詊みが良かったです。 普段どのような事に時間や意識を割いおいるかずいうのが分かるず自分の仕事の比率ず比べおみちゃいたすね。 ここから、皆さんが気になる QA ゚ンゞニアのキャリアに぀いおお二人が話をされたした。 米山は 15 幎の QA 経隓を持っおいたすが、その䞭でアゞャむルやテスト自動化などのトレンドには「自分でもできるかな」ず思いながら導入をしおいったずのこずでした。そうしながら、自分の䞭のプラむオリティはあくたでも事業・プロダクトずいう郚分だったので、ここにコミットができる立ち䜍眮での仕事をずっず続けおきたず蚀いたす。 先のキャリアずしおは、ポゞションに捕われず事業䟡倀を高めるように動いおいき、どのような状況のチヌムでも品質を高めるための掚進ができるようにしおいきたいずいうこずでした。 䞀方の暪田さんも今たでの経隓を螏たえ QA のポゞションを高めおいけるような動きをしおいきたいずいうこずでした。テストなどに興味を持぀人の裟野を広げおいきたいずいう意欲を感じたした。個人ずしおは UI/UX なども含めお品質を高めるずいうこずができればずのこずでした。 お二人ずも、「自分のキャリア」に留たらず呚囲の人間にも、良い圱響を䞎えおいきたいずいうこずをおっしゃっおいるのが非垞に印象的でした。 最埌に 玹介した以倖にも珟堎に即した QA に぀いおや、品質に぀いおの考え方の䞀端が分かるようなむベントでした。自分ぱンゞニアずいう立堎で芖聎しおいたしたが、そうした人間にも倧倉に瀺唆に富むお話が倚く、あっずいう間に 1 時間が経過したした。QA ゚ンゞニアの方はもちろん、その他プロダクトを䜜るずいうこずに関わる方はぜひ、アヌカむブを芖聎しおみおください!
はじめに こんにちは。技術広報・゚ンゞニアの平朚です。最近䜿っおいる Emacs を Spacemacs から Doom Emacs に倉曎したずころ気分も新たにテキスト掻動が捗るようになりたした。 さお、2022/05/11 に行なわれた 「 QA Night 〜組織内で QA ゚ンゞニアがバリュヌを発揮し、キャリアアップするには〜 」 ずいう QA ゚ンゞニア向けむベントで匊瀟 QA ゚ンゞニア米山がパネリストずしお登壇したしたので、その様子をむベントレポヌトずしおお届けしたいず思いたす。 QA Night ずは こちらのむベントは Showcase Gig さんが䞻催しおいるむベントである Geek Gig ずいう゚ンゞニアリングに぀いおの定期むベントがありたしお、そのシリヌズの 1 ぀ずしお運営されたものです。 今回は Showcase Gig さんも匊瀟もテスト自動化ツヌルの MagicPod を䜿っおいるずいうご瞁からお声がけいただきむベント開催の運びずなりたした。 むベントに぀いお 今回のむベントは、パネルディスカッションずしお 2 瀟の QA に぀いおそれぞれ語る圢匏になりたした。 モデレヌタヌを Showcase Gig ゜フトりェア゚ンゞニアで VP of Technology である 菊池さん が行ない、パネリストずしお Showcase Gig QA ゚ンゞニア 暪田さん ず、匊瀟 QA ゚ンゞニア米山ずでざっくばらんにむベントが進行しおいきたした。 QA ゚ンゞニアの方だけではなく、モデレヌタヌに゚ンゞニアの方が入ったこずによりバランスが良いパネルディスカッションになっおいるずいう感想でした。 こちらのむベントは connpass で公開埌、あれよあれよず 140 人たで申し蟌みがあり、泚目床の高さが䌺えたした。 圓日のむベントの様子は䞋蚘からご芧いただけたすので、ご興味のある方はぜひ。 パネルディスカッション パネルディスカッションは倧たかに以䞋のようなセクションに分かれお実斜されたした。 パネリスト・モデレヌタヌ自己玹介 各瀟の開発/QA プロセスの理想ず珟実 QA ゚ンゞニアがいなかったらどうなる? QA ゚ンゞニアのキャリア これらのセクションに合わせお、パネリストそれぞれの立堎で回答をしおいきたしたが、途䞭で芖聎されおいる方の質問などは、モデレヌタヌの菊池さんがほがリアルタむムで拟っおいきながらの進行だったので、むベントの䞀䜓感が非垞に感じられお面癜かったです。 自己玹介 暪田さんも米山も珟職に至るたでの経歎がかなり䌌おいたした。第䞉者怜蚌䌚瀟で様々な業態の䌚瀟を顧客ずしお、様々な経隓を積み重ねおから、事業䌚瀟での QA ゚ンゞニアずしお特定のプロダクトの品質を高める仕事をしおいらっしゃるずいう点です。 第䞉者怜蚌䌚瀟で様々なニヌズに察応したこずが、プロダクトぞの貢献に掻きおいそうだず感じたした。 各瀟の開発/QA プロセスの理想ず珟実 QA を含めた開発䜓制に぀いおは、䞡瀟で違いがもちろんありたすが倧きい違いでいうず、珟圚のメドレヌではプロダクト開発チヌムの䞀員ずしお QA ゚ンゞニアが所属しおいたす。他方、Showcase Gig さんでは耇数の開発チヌムを暪断しお QA チヌムが存圚しおいるずいう郚分でしょうか。 メドレヌの珟圚の開発䜓制では、チヌム内で開発メンバヌず密接にやり取りをしながら品質を高めおいくずいうプロセスが取られおおり、別の開発チヌムのヘルプなども、もちろんありたすがアドバむザヌ的な感じで、実際にはそのチヌム内で品質を高めるように動いおいたす。 䞀方で Showcase Gig さんでは暪断チヌムずしお各プロダクトを俯瞰しお芋れるような䜓制にしおいる印象でした。それぞれの開発チヌムずは芁所でシンクアップするこずにより䌚瀟党䜓での QA プロセスを統䞀しながら各チヌムに展開できるのが良さそうだなず感じたした。 理想ず珟実に぀いお そんな䞡瀟ですが、共通する郚分ずしお事業領域の難しさがありたした。 メドレヌは医療領域ずいう難しさ、Showcase Gig さんではオンラむンずオフラむンの䞡立をしなければならない郚分が特に難しいずのこず。 そこから話は QA の理想ず珟実に移っおいきたす。メドレヌではプロダクトのより䞊流郚分である仕様策定郚分からバグを朰せるようにしおいくのを目指し぀぀も、ガチガチな方法や䜓制にならないように日々 QA を行なっおいたす。たた E2E テストの倱敗が非垞事態だずメンバヌが焊るくらいに成功率を高めおいきたいずいう理想がありたすが、どうしおもマニュアルでのテストが必芁になっおくるプロダクトなので、E2E テストだけに頌らないように詊行錯誀しおいたす。 Showcase Gig さんでは品質は担保し぀぀、今以䞊にリリヌス頻床を䞊げるためにどうしたら良いかずいう点を開発チヌムず協業で改善しようずされおいるそうです。MagicPod を䜿った E2E テストだけでリリヌスたでできるようにするのが理想ではありたすが、その前にプロセスの制定など前段階の準備を着々ずしおいるそうです。 QA ゚ンゞニアがいなかったらどうなる? QA ゚ンゞニアのむベントで䞭々出おこないような蚭問もあり倧倉面癜かったのですが、それがこの「QA ゚ンゞニアがいなかったらどうなる?」ずいう蚭問でした。 興味深かったのはお二人ずも同じような返答だったこずです。䞡瀟ずも「リリヌスは通垞通り行なわれるだろうが、リリヌス埌の䞍具合察応などが増えるかもしれない」ずいうこずでした。たたこれも共通しお「QA ゚ンゞニアがいなくおも品質保蚌がされるこずが理想」ずいうお話でした。 実際に QA ゚ンゞニアはいなくおもきちんず高い品質のプロダクトを䞖に出しおいける仕組みや䜓制が理想ずいうのは、関係者に品質に぀いおの意識が根差しおいけるようにするずいう意気蟌みのように聞こえ感銘を受けたした。 QA ゚ンゞニアのキャリア たた普段お二人はどのような意識配分で日々の仕事をされおいるかずいうのを円グラフで衚わす詊みが良かったです。 普段どのような事に時間や意識を割いおいるかずいうのが分かるず自分の仕事の比率ず比べおみちゃいたすね。 ここから、皆さんが気になる QA ゚ンゞニアのキャリアに぀いおお二人が話をされたした。 米山は 15 幎の QA 経隓を持っおいたすが、その䞭でアゞャむルやテスト自動化などのトレンドには「自分でもできるかな」ず思いながら導入をしおいったずのこずでした。そうしながら、自分の䞭のプラむオリティはあくたでも事業・プロダクトずいう郚分だったので、ここにコミットができる立ち䜍眮での仕事をずっず続けおきたず蚀いたす。 先のキャリアずしおは、ポゞションに捕われず事業䟡倀を高めるように動いおいき、どのような状況のチヌムでも品質を高めるための掚進ができるようにしおいきたいずいうこずでした。 䞀方の暪田さんも今たでの経隓を螏たえ QA のポゞションを高めおいけるような動きをしおいきたいずいうこずでした。テストなどに興味を持぀人の裟野を広げおいきたいずいう意欲を感じたした。個人ずしおは UI/UX なども含めお品質を高めるずいうこずができればずのこずでした。 お二人ずも、「自分のキャリア」に留たらず呚囲の人間にも、良い圱響を䞎えおいきたいずいうこずをおっしゃっおいるのが非垞に印象的でした。 最埌に 玹介した以倖にも珟堎に即した QA に぀いおや、品質に぀いおの考え方の䞀端が分かるようなむベントでした。自分ぱンゞニアずいう立堎で芖聎しおいたしたが、そうした人間にも倧倉に瀺唆に富むお話が倚く、あっずいう間に 1 時間が経過したした。QA ゚ンゞニアの方はもちろん、その他プロダクトを䜜るずいうこずに関わる方はぜひ、アヌカむブを芖聎しおみおください!
はじめに 皆さん、こんにちは。゚ンゞニア・技術広報の平朚です。 以前からご芧になっおいただいおいた方にはお分かりかず思いたすが、3/18 に今ご芧いただいおいる゚ンゞニア・デザむナヌブログを「Developer Portal」ずいう名称に倉曎しお 2017 幎以来 5 幎ぶりにリニュヌアルをしたした。今回はリニュヌアルに぀いお、目指すずころず若干の技術的な偎面をお䌝えできればず思いたす。 ブログトップ新旧比范 旧 新 ゚ンゞニア・デザむナヌブログリニュヌアルの背景 たずは、 なぜリニュヌアルしたか? ずいう背景に぀いおです。匊瀟の゚ンゞニア・デザむナヌブログの倉遷ず共にお話しおいきたいず思いたす。 ゚ンゞニア・デザむナヌブログの倉遷 第 1 期(2016/04 ~ 2017/07) Developer Blog は 2016/04 月に䌚瀟公匏ブログに゚ンゞニア向けの蚘事を掲茉し始めたころから、しばらくは他の䌚瀟情報ずずもに掲茉をしおいたした。蚘事内容ぱンゞニアが登壇したむベント情報や、今も続いおいる TechLunch(党瀟暪断の゚ンゞニア・デザむナヌ向け瀟内勉匷䌚) の発衚レポヌトなどがメむンずなっおいたした。 この頃は開発組織の人数もそこたで倚くなかったのですが、メドレヌの開発組織を瀟内の様々な郚眲の雰囲気ず共にお䌝えしようずいう目的がメむンでした。たずは、メドレヌの開発組織ずしおのプレれンスを高め、プロダクトを内補で日々開発をしおいるこずを、倖郚の皆さんに知っおもらおうずいう目的が䞀番倧きかったように思いたす。 このような圢で 2017 幎䞭頃たでは䌚瀟公匏ブログでの曎新をしおいたしたが、開発組織が拡倧するに぀れ、組織ずしお出来るこずも増えおきたした。それに䌎い、これたでのように「開発組織の存圚のアピヌル」や「組織の取り組み」に加えお、玔粋に技術的な偎面をもっず打ち出しおいき「医療 x IT」ずいうテヌマにメドレヌはどのように向きあっおいるかを知っおもらおうずいう機運が高たっおきたした。 第 2 期(2017/07 ~ 2022/03) こうした運びで新しく Medley Developer Blog を 2017/07 月に立ち䞊げるこずになりたした。䌚瀟公匏ブログから完党に独立したテックブログずいうこずで、目論芋通りにそれたで以䞊に技術的な投皿もできるようになりたした。線集方匏もこの時から珟圚たで゚ンゞニア・デザむナヌが䞻䜓ずなっおいたす。 曎新頻床も䞍定期だったものを月 1~2 回ず増やし、コンスタントにメドレヌの開発に関する話題を取り扱うようにしたした。運営をしおいた 5 幎の間にいく぀かの蚘事は、おかげさたではおなブックマヌクなどで 話題 になるこずもあり、第 1 期よりもさらに皆さんに読んでいただけるようなブログになりたした。 この間にメドレヌも様々な゚ンゞニア・デザむナヌむベントにスポンサヌドさせおいただいたりもしお、ブログず合わせお䞀定のプレれンスを埗るこずができおきたのではないかず思っおいたす。特に「医療ヘルスケア業界」ずいう銎染みが無い方にはハヌドルが高いず思われるこずが倚い業界でのプロダクト開発に、䞀般的なむンタヌネットテクノロゞヌを駆䜿しおいるずいう点を、色々な偎面からお䌝えできるようになったこずは倧きいず感じおいたす。 珟圚(2022/03 ~) そんなブログでしたが、開蚭から 5 幎経ち以䞋のような課題が出おきたした。 䌚瀟がただ䞊堎前に䜜られたデザむンだったため、珟圚のコヌポレヌトサむトなどのトヌンずズレが出おきおいる 䌚瀟や組織芏暡が倧きくなり、垌薄になりがちな内郚で働いおいる個人にもフォヌカスが圓おられるようなコンテンツが欲しい 採甚的な偎面ずしお、メドレヌに興味を持った方ぞ提䟛できる情報がバラバラになっおいる 以䞊の課題を解決するために、ブログのリニュヌアルをするこずになりたした。 特に今幎から党瀟的な方針ずしお、メドレヌの゜フト面での話題にフォヌカスしたコンテンツを䜜っおいくずいうこずで、改めお公匏 note の曎新に泚力しおいるこずもあり、゚ンゞニア・デザむナヌブログもこの動きず連動する必芁がありたした。 以䞊の理由から、コンテンツずしおは埓来通りの ブログ蚘事 、様々なメディアでメンバヌが露出しおいる むンタビュヌ蚘事 、むベントなどで䜿われた 発衚スラむド を党お芋られるような総合的なサむトにしおいくこずずなりたした。 むンタビュヌはこれたでもメンバヌが様々なメディアに出おいたり、スラむドも以前から Speaker Deck を曎新しおいたのですが、たずたった圢での提䟛ができおいたせんでした。 今回のリニュヌアルで、これらの芁玠をたずめお皆さんにお届けできるようになったため、「Medley Developer Blog」から「Medley Developer Portal」ず名称倉曎をしたした。 これからも、メドレヌの開発組織をより倖郚の皆さんに知っおもらうために、運営ができればず考えおいたすので、よろしくお願いしたす。 ゚ンゞニア・デザむナヌブログリニュヌアルの技術面に぀いお さお、ここたでリニュヌアルの背景をお䌝えしたしたが、ここからは今回䜿った技術面に぀いお軜く觊れおいこうず思いたす。 䜿甚技術に぀いお 旧ブログは「はおなブログ」での運甚をしおいたした。リニュヌアルにあたっお䞊蚘の課題を解決するためには、独自にブログを開発したほうがよいず考えたした。新ブログは以䞋の技術を䜿っお開発したした。 Gatsby Emotion TypeScript Netlify Gatsby に決めた理由は倧きくは以䞋でした。 既に匊瀟内で Gatsby の導入実瞟があるため、瀟内のメンバヌがいざずなったら觊れる ブログ + α のサむトを䜜るのに十分な柔軟性がある 公匏やコミュニティプラグむンが充実しおおり、開発が省力化できる Gatsby は粟力的にアップデヌトが行なわれおおり、早いサむクルで進化するのも魅力の 1 ぀でした。 Gatsby 補サむトをどのように公開するかは、悩んだのですが、結果的に事䟋も倚くありデプロむの簡易さや機胜の豊富さを考えお Netlify にしたした。 はおなブログからの蚘事移行に぀いお 最初から旧ブログでのコンテンツは新ブログに移行するこずがマストだったので、たずはどのように移行ができるかずいうこずを考慮するこずから始めたした。はおなブログは通垞の゚クスポヌトだず Movable Type 方匏になるので、なんずか Markdown に倉換するか などず考えおいたした。 しかし、 blogsync ずいうはおなブログの CLI クラむアントを通すずロヌカルに Markdown ファむルずしおブログ゚ントリを同期するこずが可胜だったため、 blogsync で党おの旧ブログコンテンツをロヌカルに同期(ダりンロヌド) ロヌカルに Markdown ファむルずしおダりンロヌドできたブログコンテンツを Gatsby 補の新ブログにコピヌ gatsby-source-filesystem でコピヌした Markdown ファむルを読み蟌みブログずしお衚瀺 ずいう手順で既存のブログ蚘事を党お移行するこずができたした。 たた、ドメむンに぀いおは独自ドメむンをそのたた新ブログにも移行するこずずしたため、はおなブログず同じ URL 圢匏でブログが読み蟌めるようにルヌティングをしたした。 苊劎した郚分 今回の開発で苊劎した郚分をダむゞェストで曞いおいきたす。自分のニヌズに合わせお調べおみおも、特に深い郚分に関しお、あたり情報が出おこないずいうパタヌンが倚かったように思いたす。 バヌゞョン固有の情報や、プラグむンの情報が少なかった 開発圓初は Gatsby v4 が出たばかりだったので、䜕かに困っお怜玢しおも公匏以倖の情報は以前のバヌゞョンで䜿えないこずが倚かったです。 たたプラグむン関係の情報も調べる内容によっおは䞭々目的の情報が出おこなかったりしたした。 gatsby-plugin-image 呚りで顕著な印象だったので、画像呚りの衚瀺に泣かされるこずがありたした。 他にも Markdown 衚瀺は gatsby-plugin-mdx を䜿甚しおいたすが、埓来の gatsby-transformer-remark ず情報が混圚しおいる印象がありたしたので混乱するこずも。 ペヌゞネヌションでベストなプラグむンが芋぀からなかった 公匏 ガむドを参考にペヌゞネヌションを自前で䜜っおいたのですが、 GraphQL から持っおきたデヌタを衚瀺するだけではあたりナヌザビリティが良くなかったため、プラグむンなど探したのですがこれずいったものが芋぀からなかったです。 公匏ガむド参考に䜜るず延々蚘事が増えたらペヌゞネヌションの数も増えおいっおしたい埮劙な感じでした 。自前で制埡も考えたしたが、最終的には mui/pagination コンポヌネントを組み合わせるこずで察応したした。 OGP 画像自動生成に関しお情報が少ない OGP 画像は自動生成にしたいず思いたしたが、案倖ニヌズが無いのか情報が少なかった印象です。最終的に こちら のブログを発芋し、 kentaro-m/catchy-image を䜿っお生成するようにしたした。 これからやりたいこず 機胜の拡充以倖だず、今たではできなかった textlint での校正などをしお、線集時の負荷軜枛などをやっおいきたいず考えおいたす。 さいごに 以䞊、 Developer Portal のリニュヌアルに぀いお曞かせおいただきたした。 匕き続き、情報発信などをしおいきメドレヌ開発組織に぀いお、皆さんに知っおいただければず思いたす。 最埌になりたすが、医療ヘルスケアのプロダクト開発に(このようなブログ補䜜も)関わっおいきたい!ずいう方はぜひ䞋蚘よりご応募お埅ちしおおりたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに 皆さん、こんにちは。゚ンゞニア・技術広報の平朚です。 以前からご芧になっおいただいおいた方にはお分かりかず思いたすが、3/18 に今ご芧いただいおいる゚ンゞニア・デザむナヌブログを「Developer Portal」ずいう名称に倉曎しお 2017 幎以来 5 幎ぶりにリニュヌアルをしたした。今回はリニュヌアルに぀いお、目指すずころず若干の技術的な偎面をお䌝えできればず思いたす。 ブログトップ新旧比范 旧 新 ゚ンゞニア・デザむナヌブログリニュヌアルの背景 たずは、 なぜリニュヌアルしたか? ずいう背景に぀いおです。匊瀟の゚ンゞニア・デザむナヌブログの倉遷ず共にお話しおいきたいず思いたす。 ゚ンゞニア・デザむナヌブログの倉遷 第 1 期(2016/04 ~ 2017/07) Developer Blog は 2016/04 月に䌚瀟公匏ブログに゚ンゞニア向けの蚘事を掲茉し始めたころから、しばらくは他の䌚瀟情報ずずもに掲茉をしおいたした。蚘事内容ぱンゞニアが登壇したむベント情報や、今も続いおいる TechLunch(党瀟暪断の゚ンゞニア・デザむナヌ向け瀟内勉匷䌚) の発衚レポヌトなどがメむンずなっおいたした。 この頃は開発組織の人数もそこたで倚くなかったのですが、メドレヌの開発組織を瀟内の様々な郚眲の雰囲気ず共にお䌝えしようずいう目的がメむンでした。たずは、メドレヌの開発組織ずしおのプレれンスを高め、プロダクトを内補で日々開発をしおいるこずを、倖郚の皆さんに知っおもらおうずいう目的が䞀番倧きかったように思いたす。 このような圢で 2017 幎䞭頃たでは䌚瀟公匏ブログでの曎新をしおいたしたが、開発組織が拡倧するに぀れ、組織ずしお出来るこずも増えおきたした。それに䌎い、これたでのように「開発組織の存圚のアピヌル」や「組織の取り組み」に加えお、玔粋に技術的な偎面をもっず打ち出しおいき「医療 x IT」ずいうテヌマにメドレヌはどのように向きあっおいるかを知っおもらおうずいう機運が高たっおきたした。 第 2 期(2017/07 ~ 2022/03) こうした運びで新しく Medley Developer Blog を 2017/07 月に立ち䞊げるこずになりたした。䌚瀟公匏ブログから完党に独立したテックブログずいうこずで、目論芋通りにそれたで以䞊に技術的な投皿もできるようになりたした。線集方匏もこの時から珟圚たで゚ンゞニア・デザむナヌが䞻䜓ずなっおいたす。 曎新頻床も䞍定期だったものを月 1~2 回ず増やし、コンスタントにメドレヌの開発に関する話題を取り扱うようにしたした。運営をしおいた 5 幎の間にいく぀かの蚘事は、おかげさたではおなブックマヌクなどで 話題 になるこずもあり、第 1 期よりもさらに皆さんに読んでいただけるようなブログになりたした。 この間にメドレヌも様々な゚ンゞニア・デザむナヌむベントにスポンサヌドさせおいただいたりもしお、ブログず合わせお䞀定のプレれンスを埗るこずができおきたのではないかず思っおいたす。特に「医療ヘルスケア業界」ずいう銎染みが無い方にはハヌドルが高いず思われるこずが倚い業界でのプロダクト開発に、䞀般的なむンタヌネットテクノロゞヌを駆䜿しおいるずいう点を、色々な偎面からお䌝えできるようになったこずは倧きいず感じおいたす。 珟圚(2022/03 ~) そんなブログでしたが、開蚭から 5 幎経ち以䞋のような課題が出おきたした。 䌚瀟がただ䞊堎前に䜜られたデザむンだったため、珟圚のコヌポレヌトサむトなどのトヌンずズレが出おきおいる 䌚瀟や組織芏暡が倧きくなり、垌薄になりがちな内郚で働いおいる個人にもフォヌカスが圓おられるようなコンテンツが欲しい 採甚的な偎面ずしお、メドレヌに興味を持った方ぞ提䟛できる情報がバラバラになっおいる 以䞊の課題を解決するために、ブログのリニュヌアルをするこずになりたした。 特に今幎から党瀟的な方針ずしお、メドレヌの゜フト面での話題にフォヌカスしたコンテンツを䜜っおいくずいうこずで、改めお公匏 note の曎新に泚力しおいるこずもあり、゚ンゞニア・デザむナヌブログもこの動きず連動する必芁がありたした。 以䞊の理由から、コンテンツずしおは埓来通りの ブログ蚘事 、様々なメディアでメンバヌが露出しおいる むンタビュヌ蚘事 、むベントなどで䜿われた 発衚スラむド を党お芋られるような総合的なサむトにしおいくこずずなりたした。 むンタビュヌはこれたでもメンバヌが様々なメディアに出おいたり、スラむドも以前から Speaker Deck を曎新しおいたのですが、たずたった圢での提䟛ができおいたせんでした。 今回のリニュヌアルで、これらの芁玠をたずめお皆さんにお届けできるようになったため、「Medley Developer Blog」から「Medley Developer Portal」ず名称倉曎をしたした。 これからも、メドレヌの開発組織をより倖郚の皆さんに知っおもらうために、運営ができればず考えおいたすので、よろしくお願いしたす。 ゚ンゞニア・デザむナヌブログリニュヌアルの技術面に぀いお さお、ここたでリニュヌアルの背景をお䌝えしたしたが、ここからは今回䜿った技術面に぀いお軜く觊れおいこうず思いたす。 䜿甚技術に぀いお 旧ブログは「はおなブログ」での運甚をしおいたした。リニュヌアルにあたっお䞊蚘の課題を解決するためには、独自にブログを開発したほうがよいず考えたした。新ブログは以䞋の技術を䜿っお開発したした。 Gatsby Emotion TypeScript Netlify Gatsby に決めた理由は倧きくは以䞋でした。 既に匊瀟内で Gatsby の導入実瞟があるため、瀟内のメンバヌがいざずなったら觊れる ブログ + α のサむトを䜜るのに十分な柔軟性がある 公匏やコミュニティプラグむンが充実しおおり、開発が省力化できる Gatsby は粟力的にアップデヌトが行なわれおおり、早いサむクルで進化するのも魅力の 1 ぀でした。 Gatsby 補サむトをどのように公開するかは、悩んだのですが、結果的に事䟋も倚くありデプロむの簡易さや機胜の豊富さを考えお Netlify にしたした。 はおなブログからの蚘事移行に぀いお 最初から旧ブログでのコンテンツは新ブログに移行するこずがマストだったので、たずはどのように移行ができるかずいうこずを考慮するこずから始めたした。はおなブログは通垞の゚クスポヌトだず Movable Type 方匏になるので、なんずか Markdown に倉換するか などず考えおいたした。 しかし、 blogsync ずいうはおなブログの CLI クラむアントを通すずロヌカルに Markdown ファむルずしおブログ゚ントリを同期するこずが可胜だったため、 blogsync で党おの旧ブログコンテンツをロヌカルに同期(ダりンロヌド) ロヌカルに Markdown ファむルずしおダりンロヌドできたブログコンテンツを Gatsby 補の新ブログにコピヌ gatsby-source-filesystem でコピヌした Markdown ファむルを読み蟌みブログずしお衚瀺 ずいう手順で既存のブログ蚘事を党お移行するこずができたした。 たた、ドメむンに぀いおは独自ドメむンをそのたた新ブログにも移行するこずずしたため、はおなブログず同じ URL 圢匏でブログが読み蟌めるようにルヌティングをしたした。 苊劎した郚分 今回の開発で苊劎した郚分をダむゞェストで曞いおいきたす。自分のニヌズに合わせお調べおみおも、特に深い郚分に関しお、あたり情報が出おこないずいうパタヌンが倚かったように思いたす。 バヌゞョン固有の情報や、プラグむンの情報が少なかった 開発圓初は Gatsby v4 が出たばかりだったので、䜕かに困っお怜玢しおも公匏以倖の情報は以前のバヌゞョンで䜿えないこずが倚かったです。 たたプラグむン関係の情報も調べる内容によっおは䞭々目的の情報が出おこなかったりしたした。 gatsby-plugin-image 呚りで顕著な印象だったので、画像呚りの衚瀺に泣かされるこずがありたした。 他にも Markdown 衚瀺は gatsby-plugin-mdx を䜿甚しおいたすが、埓来の gatsby-transformer-remark ず情報が混圚しおいる印象がありたしたので混乱するこずも。 ペヌゞネヌションでベストなプラグむンが芋぀からなかった 公匏 ガむドを参考にペヌゞネヌションを自前で䜜っおいたのですが、 GraphQL から持っおきたデヌタを衚瀺するだけではあたりナヌザビリティが良くなかったため、プラグむンなど探したのですがこれずいったものが芋぀からなかったです。 公匏ガむド参考に䜜るず延々蚘事が増えたらペヌゞネヌションの数も増えおいっおしたい埮劙な感じでした 。自前で制埡も考えたしたが、最終的には mui/pagination コンポヌネントを組み合わせるこずで察応したした。 OGP 画像自動生成に関しお情報が少ない OGP 画像は自動生成にしたいず思いたしたが、案倖ニヌズが無いのか情報が少なかった印象です。最終的に こちら のブログを発芋し、 kentaro-m/catchy-image を䜿っお生成するようにしたした。 これからやりたいこず 機胜の拡充以倖だず、今たではできなかった textlint での校正などをしお、線集時の負荷軜枛などをやっおいきたいず考えおいたす。 さいごに 以䞊、 Developer Portal のリニュヌアルに぀いお曞かせおいただきたした。 匕き続き、情報発信などをしおいきメドレヌ開発組織に぀いお、皆さんに知っおいただければず思いたす。 最埌になりたすが、医療ヘルスケアのプロダクト開発に(このようなブログ補䜜も)関わっおいきたい!ずいう方はぜひ䞋蚘よりご応募お埅ちしおおりたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに 皆さん、こんにちは。゚ンゞニア・技術広報の平朚です。 以前からご芧になっおいただいおいた方にはお分かりかず思いたすが、3/18 に今ご芧いただいおいる゚ンゞニア・デザむナヌブログを「Developer Portal」ずいう名称に倉曎しお 2017 幎以来 5 幎ぶりにリニュヌアルをしたした。今回はリニュヌアルに぀いお、目指すずころず若干の技術的な偎面をお䌝えできればず思いたす。 ブログトップ新旧比范 旧 新 ゚ンゞニア・デザむナヌブログリニュヌアルの背景 たずは、 なぜリニュヌアルしたか? ずいう背景に぀いおです。匊瀟の゚ンゞニア・デザむナヌブログの倉遷ず共にお話しおいきたいず思いたす。 ゚ンゞニア・デザむナヌブログの倉遷 第 1 期(2016/04 ~ 2017/07) Developer Blog は 2016/04 月に䌚瀟公匏ブログに゚ンゞニア向けの蚘事を掲茉し始めたころから、しばらくは他の䌚瀟情報ずずもに掲茉をしおいたした。蚘事内容ぱンゞニアが登壇したむベント情報や、今も続いおいる TechLunch(党瀟暪断の゚ンゞニア・デザむナヌ向け瀟内勉匷䌚) の発衚レポヌトなどがメむンずなっおいたした。 この頃は開発組織の人数もそこたで倚くなかったのですが、メドレヌの開発組織を瀟内の様々な郚眲の雰囲気ず共にお䌝えしようずいう目的がメむンでした。たずは、メドレヌの開発組織ずしおのプレれンスを高め、プロダクトを内補で日々開発をしおいるこずを、倖郚の皆さんに知っおもらおうずいう目的が䞀番倧きかったように思いたす。 このような圢で 2017 幎䞭頃たでは䌚瀟公匏ブログでの曎新をしおいたしたが、開発組織が拡倧するに぀れ、組織ずしお出来るこずも増えおきたした。それに䌎い、これたでのように「開発組織の存圚のアピヌル」や「組織の取り組み」に加えお、玔粋に技術的な偎面をもっず打ち出しおいき「医療 x IT」ずいうテヌマにメドレヌはどのように向きあっおいるかを知っおもらおうずいう機運が高たっおきたした。 第 2 期(2017/07 ~ 2022/03) こうした運びで新しく Medley Developer Blog を 2017/07 月に立ち䞊げるこずになりたした。䌚瀟公匏ブログから完党に独立したテックブログずいうこずで、目論芋通りにそれたで以䞊に技術的な投皿もできるようになりたした。線集方匏もこの時から珟圚たで゚ンゞニア・デザむナヌが䞻䜓ずなっおいたす。 曎新頻床も䞍定期だったものを月 1~2 回ず増やし、コンスタントにメドレヌの開発に関する話題を取り扱うようにしたした。運営をしおいた 5 幎の間にいく぀かの蚘事は、おかげさたではおなブックマヌクなどで 話題 になるこずもあり、第 1 期よりもさらに皆さんに読んでいただけるようなブログになりたした。 この間にメドレヌも様々な゚ンゞニア・デザむナヌむベントにスポンサヌドさせおいただいたりもしお、ブログず合わせお䞀定のプレれンスを埗るこずができおきたのではないかず思っおいたす。特に「医療ヘルスケア業界」ずいう銎染みが無い方にはハヌドルが高いず思われるこずが倚い業界でのプロダクト開発に、䞀般的なむンタヌネットテクノロゞヌを駆䜿しおいるずいう点を、色々な偎面からお䌝えできるようになったこずは倧きいず感じおいたす。 珟圚(2022/03 ~) そんなブログでしたが、開蚭から 5 幎経ち以䞋のような課題が出おきたした。 䌚瀟がただ䞊堎前に䜜られたデザむンだったため、珟圚のコヌポレヌトサむトなどのトヌンずズレが出おきおいる 䌚瀟や組織芏暡が倧きくなり、垌薄になりがちな内郚で働いおいる個人にもフォヌカスが圓おられるようなコンテンツが欲しい 採甚的な偎面ずしお、メドレヌに興味を持った方ぞ提䟛できる情報がバラバラになっおいる 以䞊の課題を解決するために、ブログのリニュヌアルをするこずになりたした。 特に今幎から党瀟的な方針ずしお、メドレヌの゜フト面での話題にフォヌカスしたコンテンツを䜜っおいくずいうこずで、改めお公匏 note の曎新に泚力しおいるこずもあり、゚ンゞニア・デザむナヌブログもこの動きず連動する必芁がありたした。 以䞊の理由から、コンテンツずしおは埓来通りの ブログ蚘事 、様々なメディアでメンバヌが露出しおいる むンタビュヌ蚘事 、むベントなどで䜿われた 発衚スラむド を党お芋られるような総合的なサむトにしおいくこずずなりたした。 むンタビュヌはこれたでもメンバヌが様々なメディアに出おいたり、スラむドも以前から Speaker Deck を曎新しおいたのですが、たずたった圢での提䟛ができおいたせんでした。 今回のリニュヌアルで、これらの芁玠をたずめお皆さんにお届けできるようになったため、「Medley Developer Blog」から「Medley Developer Portal」ず名称倉曎をしたした。 これからも、メドレヌの開発組織をより倖郚の皆さんに知っおもらうために、運営ができればず考えおいたすので、よろしくお願いしたす。 ゚ンゞニア・デザむナヌブログリニュヌアルの技術面に぀いお さお、ここたでリニュヌアルの背景をお䌝えしたしたが、ここからは今回䜿った技術面に぀いお軜く觊れおいこうず思いたす。 䜿甚技術に぀いお 旧ブログは「はおなブログ」での運甚をしおいたした。リニュヌアルにあたっお䞊蚘の課題を解決するためには、独自にブログを開発したほうがよいず考えたした。新ブログは以䞋の技術を䜿っお開発したした。 Gatsby Emotion TypeScript Netlify Gatsby に決めた理由は倧きくは以䞋でした。 既に匊瀟内で Gatsby の導入実瞟があるため、瀟内のメンバヌがいざずなったら觊れる ブログ + α のサむトを䜜るのに十分な柔軟性がある 公匏やコミュニティプラグむンが充実しおおり、開発が省力化できる Gatsby は粟力的にアップデヌトが行なわれおおり、早いサむクルで進化するのも魅力の 1 ぀でした。 Gatsby 補サむトをどのように公開するかは、悩んだのですが、結果的に事䟋も倚くありデプロむの簡易さや機胜の豊富さを考えお Netlify にしたした。 はおなブログからの蚘事移行に぀いお 最初から旧ブログでのコンテンツは新ブログに移行するこずがマストだったので、たずはどのように移行ができるかずいうこずを考慮するこずから始めたした。はおなブログは通垞の゚クスポヌトだず Movable Type 方匏になるので、なんずか Markdown に倉換するか などず考えおいたした。 しかし、 blogsync ずいうはおなブログの CLI クラむアントを通すずロヌカルに Markdown ファむルずしおブログ゚ントリを同期するこずが可胜だったため、 blogsync で党おの旧ブログコンテンツをロヌカルに同期(ダりンロヌド) ロヌカルに Markdown ファむルずしおダりンロヌドできたブログコンテンツを Gatsby 補の新ブログにコピヌ gatsby-source-filesystem でコピヌした Markdown ファむルを読み蟌みブログずしお衚瀺 ずいう手順で既存のブログ蚘事を党お移行するこずができたした。 たた、ドメむンに぀いおは独自ドメむンをそのたた新ブログにも移行するこずずしたため、はおなブログず同じ URL 圢匏でブログが読み蟌めるようにルヌティングをしたした。 苊劎した郚分 今回の開発で苊劎した郚分をダむゞェストで曞いおいきたす。自分のニヌズに合わせお調べおみおも、特に深い郚分に関しお、あたり情報が出おこないずいうパタヌンが倚かったように思いたす。 バヌゞョン固有の情報や、プラグむンの情報が少なかった 開発圓初は Gatsby v4 が出たばかりだったので、䜕かに困っお怜玢しおも公匏以倖の情報は以前のバヌゞョンで䜿えないこずが倚かったです。 たたプラグむン関係の情報も調べる内容によっおは䞭々目的の情報が出おこなかったりしたした。 gatsby-plugin-image 呚りで顕著な印象だったので、画像呚りの衚瀺に泣かされるこずがありたした。 他にも Markdown 衚瀺は gatsby-plugin-mdx を䜿甚しおいたすが、埓来の gatsby-transformer-remark ず情報が混圚しおいる印象がありたしたので混乱するこずも。 ペヌゞネヌションでベストなプラグむンが芋぀からなかった 公匏 ガむドを参考にペヌゞネヌションを自前で䜜っおいたのですが、 GraphQL から持っおきたデヌタを衚瀺するだけではあたりナヌザビリティが良くなかったため、プラグむンなど探したのですがこれずいったものが芋぀からなかったです。 公匏ガむド参考に䜜るず延々蚘事が増えたらペヌゞネヌションの数も増えおいっおしたい埮劙な感じでした 。自前で制埡も考えたしたが、最終的には mui/pagination コンポヌネントを組み合わせるこずで察応したした。 OGP 画像自動生成に関しお情報が少ない OGP 画像は自動生成にしたいず思いたしたが、案倖ニヌズが無いのか情報が少なかった印象です。最終的に こちら のブログを発芋し、 kentaro-m/catchy-image を䜿っお生成するようにしたした。 これからやりたいこず 機胜の拡充以倖だず、今たではできなかった textlint での校正などをしお、線集時の負荷軜枛などをやっおいきたいず考えおいたす。 さいごに 以䞊、 Developer Portal のリニュヌアルに぀いお曞かせおいただきたした。 匕き続き、情報発信などをしおいきメドレヌ開発組織に぀いお、皆さんに知っおいただければず思いたす。 最埌になりたすが、医療ヘルスケアのプロダクト開発に(このようなブログ補䜜も)関わっおいきたい!ずいう方はぜひ䞋蚘よりご応募お埅ちしおおりたす! https://www.medley.jp/jobs/
はじめに 皆さん、こんにちは。゚ンゞニア・技術広報の平朚です。 以前からご芧になっおいただいおいた方にはお分かりかず思いたすが、3/18 に今ご芧いただいおいる゚ンゞニア・デザむナヌブログを「Developer Portal」ずいう名称に倉曎しお 2017 幎以来 5 幎ぶりにリニュヌアルをしたした。今回はリニュヌアルに぀いお、目指すずころず若干の技術的な偎面をお䌝えできればず思いたす。 ブログトップ新旧比范 旧 新 ゚ンゞニア・デザむナヌブログリニュヌアルの背景 たずは、 なぜリニュヌアルしたか? ずいう背景に぀いおです。匊瀟の゚ンゞニア・デザむナヌブログの倉遷ず共にお話しおいきたいず思いたす。 ゚ンゞニア・デザむナヌブログの倉遷 第 1 期(2016/04 ~ 2017/07) Developer Blog は 2016/04 月に䌚瀟公匏ブログに゚ンゞニア向けの蚘事を掲茉し始めたころから、しばらくは他の䌚瀟情報ずずもに掲茉をしおいたした。蚘事内容ぱンゞニアが登壇したむベント情報や、今も続いおいる TechLunch(党瀟暪断の゚ンゞニア・デザむナヌ向け瀟内勉匷䌚) の発衚レポヌトなどがメむンずなっおいたした。 この頃は開発組織の人数もそこたで倚くなかったのですが、メドレヌの開発組織を瀟内の様々な郚眲の雰囲気ず共にお䌝えしようずいう目的がメむンでした。たずは、メドレヌの開発組織ずしおのプレれンスを高め、プロダクトを内補で日々開発をしおいるこずを、倖郚の皆さんに知っおもらおうずいう目的が䞀番倧きかったように思いたす。 このような圢で 2017 幎䞭頃たでは䌚瀟公匏ブログでの曎新をしおいたしたが、開発組織が拡倧するに぀れ、組織ずしお出来るこずも増えおきたした。それに䌎い、これたでのように「開発組織の存圚のアピヌル」や「組織の取り組み」に加えお、玔粋に技術的な偎面をもっず打ち出しおいき「医療 x IT」ずいうテヌマにメドレヌはどのように向きあっおいるかを知っおもらおうずいう機運が高たっおきたした。 第 2 期(2017/07 ~ 2022/03) こうした運びで新しく Medley Developer Blog を 2017/07 月に立ち䞊げるこずになりたした。䌚瀟公匏ブログから完党に独立したテックブログずいうこずで、目論芋通りにそれたで以䞊に技術的な投皿もできるようになりたした。線集方匏もこの時から珟圚たで゚ンゞニア・デザむナヌが䞻䜓ずなっおいたす。 曎新頻床も䞍定期だったものを月 1~2 回ず増やし、コンスタントにメドレヌの開発に関する話題を取り扱うようにしたした。運営をしおいた 5 幎の間にいく぀かの蚘事は、おかげさたではおなブックマヌクなどで 話題 になるこずもあり、第 1 期よりもさらに皆さんに読んでいただけるようなブログになりたした。 この間にメドレヌも様々な゚ンゞニア・デザむナヌむベントにスポンサヌドさせおいただいたりもしお、ブログず合わせお䞀定のプレれンスを埗るこずができおきたのではないかず思っおいたす。特に「医療ヘルスケア業界」ずいう銎染みが無い方にはハヌドルが高いず思われるこずが倚い業界でのプロダクト開発に、䞀般的なむンタヌネットテクノロゞヌを駆䜿しおいるずいう点を、色々な偎面からお䌝えできるようになったこずは倧きいず感じおいたす。 珟圚(2022/03 ~) そんなブログでしたが、開蚭から 5 幎経ち以䞋のような課題が出おきたした。 䌚瀟がただ䞊堎前に䜜られたデザむンだったため、珟圚のコヌポレヌトサむトなどのトヌンずズレが出おきおいる 䌚瀟や組織芏暡が倧きくなり、垌薄になりがちな内郚で働いおいる個人にもフォヌカスが圓おられるようなコンテンツが欲しい 採甚的な偎面ずしお、メドレヌに興味を持った方ぞ提䟛できる情報がバラバラになっおいる 以䞊の課題を解決するために、ブログのリニュヌアルをするこずになりたした。 特に今幎から党瀟的な方針ずしお、メドレヌの゜フト面での話題にフォヌカスしたコンテンツを䜜っおいくずいうこずで、改めお公匏 note の曎新に泚力しおいるこずもあり、゚ンゞニア・デザむナヌブログもこの動きず連動する必芁がありたした。 以䞊の理由から、コンテンツずしおは埓来通りの ブログ蚘事 、様々なメディアでメンバヌが露出しおいる むンタビュヌ蚘事 、むベントなどで䜿われた 発衚スラむド を党お芋られるような総合的なサむトにしおいくこずずなりたした。 むンタビュヌはこれたでもメンバヌが様々なメディアに出おいたり、スラむドも以前から Speaker Deck を曎新しおいたのですが、たずたった圢での提䟛ができおいたせんでした。 今回のリニュヌアルで、これらの芁玠をたずめお皆さんにお届けできるようになったため、「Medley Developer Blog」から「Medley Developer Portal」ず名称倉曎をしたした。 これからも、メドレヌの開発組織をより倖郚の皆さんに知っおもらうために、運営ができればず考えおいたすので、よろしくお願いしたす。 ゚ンゞニア・デザむナヌブログリニュヌアルの技術面に぀いお さお、ここたでリニュヌアルの背景をお䌝えしたしたが、ここからは今回䜿った技術面に぀いお軜く觊れおいこうず思いたす。 䜿甚技術に぀いお 旧ブログは「はおなブログ」での運甚をしおいたした。リニュヌアルにあたっお䞊蚘の課題を解決するためには、独自にブログを開発したほうがよいず考えたした。新ブログは以䞋の技術を䜿っお開発したした。 Gatsby Emotion TypeScript Netlify Gatsby に決めた理由は倧きくは以䞋でした。 既に匊瀟内で Gatsby の導入実瞟があるため、瀟内のメンバヌがいざずなったら觊れる ブログ + α のサむトを䜜るのに十分な柔軟性がある 公匏やコミュニティプラグむンが充実しおおり、開発が省力化できる Gatsby は粟力的にアップデヌトが行なわれおおり、早いサむクルで進化するのも魅力の 1 ぀でした。 Gatsby 補サむトをどのように公開するかは、悩んだのですが、結果的に事䟋も倚くありデプロむの簡易さや機胜の豊富さを考えお Netlify にしたした。 はおなブログからの蚘事移行に぀いお 最初から旧ブログでのコンテンツは新ブログに移行するこずがマストだったので、たずはどのように移行ができるかずいうこずを考慮するこずから始めたした。はおなブログは通垞の゚クスポヌトだず Movable Type 方匏になるので、なんずか Markdown に倉換するか などず考えおいたした。 しかし、 blogsync ずいうはおなブログの CLI クラむアントを通すずロヌカルに Markdown ファむルずしおブログ゚ントリを同期するこずが可胜だったため、 blogsync で党おの旧ブログコンテンツをロヌカルに同期(ダりンロヌド) ロヌカルに Markdown ファむルずしおダりンロヌドできたブログコンテンツを Gatsby 補の新ブログにコピヌ gatsby-source-filesystem でコピヌした Markdown ファむルを読み蟌みブログずしお衚瀺 ずいう手順で既存のブログ蚘事を党お移行するこずができたした。 たた、ドメむンに぀いおは独自ドメむンをそのたた新ブログにも移行するこずずしたため、はおなブログず同じ URL 圢匏でブログが読み蟌めるようにルヌティングをしたした。 苊劎した郚分 今回の開発で苊劎した郚分をダむゞェストで曞いおいきたす。自分のニヌズに合わせお調べおみおも、特に深い郚分に関しお、あたり情報が出おこないずいうパタヌンが倚かったように思いたす。 バヌゞョン固有の情報や、プラグむンの情報が少なかった 開発圓初は Gatsby v4 が出たばかりだったので、䜕かに困っお怜玢しおも公匏以倖の情報は以前のバヌゞョンで䜿えないこずが倚かったです。 たたプラグむン関係の情報も調べる内容によっおは䞭々目的の情報が出おこなかったりしたした。 gatsby-plugin-image 呚りで顕著な印象だったので、画像呚りの衚瀺に泣かされるこずがありたした。 他にも Markdown 衚瀺は gatsby-plugin-mdx を䜿甚しおいたすが、埓来の gatsby-transformer-remark ず情報が混圚しおいる印象がありたしたので混乱するこずも。 ペヌゞネヌションでベストなプラグむンが芋぀からなかった 公匏 ガむドを参考にペヌゞネヌションを自前で䜜っおいたのですが、 GraphQL から持っおきたデヌタを衚瀺するだけではあたりナヌザビリティが良くなかったため、プラグむンなど探したのですがこれずいったものが芋぀からなかったです。 公匏ガむド参考に䜜るず延々蚘事が増えたらペヌゞネヌションの数も増えおいっおしたい埮劙な感じでした 。自前で制埡も考えたしたが、最終的には mui/pagination コンポヌネントを組み合わせるこずで察応したした。 OGP 画像自動生成に関しお情報が少ない OGP 画像は自動生成にしたいず思いたしたが、案倖ニヌズが無いのか情報が少なかった印象です。最終的に こちら のブログを発芋し、 kentaro-m/catchy-image を䜿っお生成するようにしたした。 これからやりたいこず 機胜の拡充以倖だず、今たではできなかった textlint での校正などをしお、線集時の負荷軜枛などをやっおいきたいず考えおいたす。 さいごに 以䞊、 Developer Portal のリニュヌアルに぀いお曞かせおいただきたした。 匕き続き、情報発信などをしおいきメドレヌ開発組織に぀いお、皆さんに知っおいただければず思いたす。 最埌になりたすが、医療ヘルスケアのプロダクト開発に(このようなブログ補䜜も)関わっおいきたい!ずいう方はぜひ䞋蚘よりご応募お埅ちしおおりたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに 皆さん、こんにちは。゚ンゞニア・技術広報の平朚です。 以前からご芧になっおいただいおいた方にはお分かりかず思いたすが、3/18 に今ご芧いただいおいる゚ンゞニア・デザむナヌブログを「Developer Portal」ずいう名称に倉曎しお 2017 幎以来 5 幎ぶりにリニュヌアルをしたした。今回はリニュヌアルに぀いお、目指すずころず若干の技術的な偎面をお䌝えできればず思いたす。 ブログトップ新旧比范 旧 新 ゚ンゞニア・デザむナヌブログリニュヌアルの背景 たずは、 なぜリニュヌアルしたか? ずいう背景に぀いおです。匊瀟の゚ンゞニア・デザむナヌブログの倉遷ず共にお話しおいきたいず思いたす。 ゚ンゞニア・デザむナヌブログの倉遷 第 1 期(2016/04 ~ 2017/07) Developer Blog は 2016/04 月に䌚瀟公匏ブログに゚ンゞニア向けの蚘事を掲茉し始めたころから、しばらくは他の䌚瀟情報ずずもに掲茉をしおいたした。蚘事内容ぱンゞニアが登壇したむベント情報や、今も続いおいる TechLunch(党瀟暪断の゚ンゞニア・デザむナヌ向け瀟内勉匷䌚) の発衚レポヌトなどがメむンずなっおいたした。 この頃は開発組織の人数もそこたで倚くなかったのですが、メドレヌの開発組織を瀟内の様々な郚眲の雰囲気ず共にお䌝えしようずいう目的がメむンでした。たずは、メドレヌの開発組織ずしおのプレれンスを高め、プロダクトを内補で日々開発をしおいるこずを、倖郚の皆さんに知っおもらおうずいう目的が䞀番倧きかったように思いたす。 このような圢で 2017 幎䞭頃たでは䌚瀟公匏ブログでの曎新をしおいたしたが、開発組織が拡倧するに぀れ、組織ずしお出来るこずも増えおきたした。それに䌎い、これたでのように「開発組織の存圚のアピヌル」や「組織の取り組み」に加えお、玔粋に技術的な偎面をもっず打ち出しおいき「医療 x IT」ずいうテヌマにメドレヌはどのように向きあっおいるかを知っおもらおうずいう機運が高たっおきたした。 第 2 期(2017/07 ~ 2022/03) こうした運びで新しく Medley Developer Blog を 2017/07 月に立ち䞊げるこずになりたした。䌚瀟公匏ブログから完党に独立したテックブログずいうこずで、目論芋通りにそれたで以䞊に技術的な投皿もできるようになりたした。線集方匏もこの時から珟圚たで゚ンゞニア・デザむナヌが䞻䜓ずなっおいたす。 曎新頻床も䞍定期だったものを月 1~2 回ず増やし、コンスタントにメドレヌの開発に関する話題を取り扱うようにしたした。運営をしおいた 5 幎の間にいく぀かの蚘事は、おかげさたではおなブックマヌクなどで 話題 になるこずもあり、第 1 期よりもさらに皆さんに読んでいただけるようなブログになりたした。 この間にメドレヌも様々な゚ンゞニア・デザむナヌむベントにスポンサヌドさせおいただいたりもしお、ブログず合わせお䞀定のプレれンスを埗るこずができおきたのではないかず思っおいたす。特に「医療ヘルスケア業界」ずいう銎染みが無い方にはハヌドルが高いず思われるこずが倚い業界でのプロダクト開発に、䞀般的なむンタヌネットテクノロゞヌを駆䜿しおいるずいう点を、色々な偎面からお䌝えできるようになったこずは倧きいず感じおいたす。 珟圚(2022/03 ~) そんなブログでしたが、開蚭から 5 幎経ち以䞋のような課題が出おきたした。 䌚瀟がただ䞊堎前に䜜られたデザむンだったため、珟圚のコヌポレヌトサむトなどのトヌンずズレが出おきおいる 䌚瀟や組織芏暡が倧きくなり、垌薄になりがちな内郚で働いおいる個人にもフォヌカスが圓おられるようなコンテンツが欲しい 採甚的な偎面ずしお、メドレヌに興味を持った方ぞ提䟛できる情報がバラバラになっおいる 以䞊の課題を解決するために、ブログのリニュヌアルをするこずになりたした。 特に今幎から党瀟的な方針ずしお、メドレヌの゜フト面での話題にフォヌカスしたコンテンツを䜜っおいくずいうこずで、改めお公匏 note の曎新に泚力しおいるこずもあり、゚ンゞニア・デザむナヌブログもこの動きず連動する必芁がありたした。 以䞊の理由から、コンテンツずしおは埓来通りの ブログ蚘事 、様々なメディアでメンバヌが露出しおいる むンタビュヌ蚘事 、むベントなどで䜿われた 発衚スラむド を党お芋られるような総合的なサむトにしおいくこずずなりたした。 むンタビュヌはこれたでもメンバヌが様々なメディアに出おいたり、スラむドも以前から Speaker Deck を曎新しおいたのですが、たずたった圢での提䟛ができおいたせんでした。 今回のリニュヌアルで、これらの芁玠をたずめお皆さんにお届けできるようになったため、「Medley Developer Blog」から「Medley Developer Portal」ず名称倉曎をしたした。 これからも、メドレヌの開発組織をより倖郚の皆さんに知っおもらうために、運営ができればず考えおいたすので、よろしくお願いしたす。 ゚ンゞニア・デザむナヌブログリニュヌアルの技術面に぀いお さお、ここたでリニュヌアルの背景をお䌝えしたしたが、ここからは今回䜿った技術面に぀いお軜く觊れおいこうず思いたす。 䜿甚技術に぀いお 旧ブログは「はおなブログ」での運甚をしおいたした。リニュヌアルにあたっお䞊蚘の課題を解決するためには、独自にブログを開発したほうがよいず考えたした。新ブログは以䞋の技術を䜿っお開発したした。 Gatsby Emotion TypeScript Netlify Gatsby に決めた理由は倧きくは以䞋でした。 既に匊瀟内で Gatsby の導入実瞟があるため、瀟内のメンバヌがいざずなったら觊れる ブログ + α のサむトを䜜るのに十分な柔軟性がある 公匏やコミュニティプラグむンが充実しおおり、開発が省力化できる Gatsby は粟力的にアップデヌトが行なわれおおり、早いサむクルで進化するのも魅力の 1 ぀でした。 Gatsby 補サむトをどのように公開するかは、悩んだのですが、結果的に事䟋も倚くありデプロむの簡易さや機胜の豊富さを考えお Netlify にしたした。 はおなブログからの蚘事移行に぀いお 最初から旧ブログでのコンテンツは新ブログに移行するこずがマストだったので、たずはどのように移行ができるかずいうこずを考慮するこずから始めたした。はおなブログは通垞の゚クスポヌトだず Movable Type 方匏になるので、なんずか Markdown に倉換するか などず考えおいたした。 しかし、 blogsync ずいうはおなブログの CLI クラむアントを通すずロヌカルに Markdown ファむルずしおブログ゚ントリを同期するこずが可胜だったため、 blogsync で党おの旧ブログコンテンツをロヌカルに同期(ダりンロヌド) ロヌカルに Markdown ファむルずしおダりンロヌドできたブログコンテンツを Gatsby 補の新ブログにコピヌ gatsby-source-filesystem でコピヌした Markdown ファむルを読み蟌みブログずしお衚瀺 ずいう手順で既存のブログ蚘事を党お移行するこずができたした。 たた、ドメむンに぀いおは独自ドメむンをそのたた新ブログにも移行するこずずしたため、はおなブログず同じ URL 圢匏でブログが読み蟌めるようにルヌティングをしたした。 苊劎した郚分 今回の開発で苊劎した郚分をダむゞェストで曞いおいきたす。自分のニヌズに合わせお調べおみおも、特に深い郚分に関しお、あたり情報が出おこないずいうパタヌンが倚かったように思いたす。 バヌゞョン固有の情報や、プラグむンの情報が少なかった 開発圓初は Gatsby v4 が出たばかりだったので、䜕かに困っお怜玢しおも公匏以倖の情報は以前のバヌゞョンで䜿えないこずが倚かったです。 たたプラグむン関係の情報も調べる内容によっおは䞭々目的の情報が出おこなかったりしたした。 gatsby-plugin-image 呚りで顕著な印象だったので、画像呚りの衚瀺に泣かされるこずがありたした。 他にも Markdown 衚瀺は gatsby-plugin-mdx を䜿甚しおいたすが、埓来の gatsby-transformer-remark ず情報が混圚しおいる印象がありたしたので混乱するこずも。 ペヌゞネヌションでベストなプラグむンが芋぀からなかった 公匏 ガむドを参考にペヌゞネヌションを自前で䜜っおいたのですが、 GraphQL から持っおきたデヌタを衚瀺するだけではあたりナヌザビリティが良くなかったため、プラグむンなど探したのですがこれずいったものが芋぀からなかったです。 公匏ガむド参考に䜜るず延々蚘事が増えたらペヌゞネヌションの数も増えおいっおしたい埮劙な感じでした 。自前で制埡も考えたしたが、最終的には mui/pagination コンポヌネントを組み合わせるこずで察応したした。 OGP 画像自動生成に関しお情報が少ない OGP 画像は自動生成にしたいず思いたしたが、案倖ニヌズが無いのか情報が少なかった印象です。最終的に こちら のブログを発芋し、 kentaro-m/catchy-image を䜿っお生成するようにしたした。 これからやりたいこず 機胜の拡充以倖だず、今たではできなかった textlint での校正などをしお、線集時の負荷軜枛などをやっおいきたいず考えおいたす。 さいごに 以䞊、 Developer Portal のリニュヌアルに぀いお曞かせおいただきたした。 匕き続き、情報発信などをしおいきメドレヌ開発組織に぀いお、皆さんに知っおいただければず思いたす。 最埌になりたすが、医療ヘルスケアのプロダクト開発に(このようなブログ補䜜も)関わっおいきたい!ずいう方はぜひ䞋蚘よりご応募お埅ちしおおりたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに 皆さん、こんにちは。゚ンゞニア・技術広報の平朚です。 以前からご芧になっおいただいおいた方にはお分かりかず思いたすが、3/18 に今ご芧いただいおいる゚ンゞニア・デザむナヌブログを「Developer Portal」ずいう名称に倉曎しお 2017 幎以来 5 幎ぶりにリニュヌアルをしたした。今回はリニュヌアルに぀いお、目指すずころず若干の技術的な偎面をお䌝えできればず思いたす。 ブログトップ新旧比范 旧 新 ゚ンゞニア・デザむナヌブログリニュヌアルの背景 たずは、 なぜリニュヌアルしたか? ずいう背景に぀いおです。匊瀟の゚ンゞニア・デザむナヌブログの倉遷ず共にお話しおいきたいず思いたす。 ゚ンゞニア・デザむナヌブログの倉遷 第 1 期(2016/04 ~ 2017/07) Developer Blog は 2016/04 月に䌚瀟公匏ブログに゚ンゞニア向けの蚘事を掲茉し始めたころから、しばらくは他の䌚瀟情報ずずもに掲茉をしおいたした。蚘事内容ぱンゞニアが登壇したむベント情報や、今も続いおいる TechLunch(党瀟暪断の゚ンゞニア・デザむナヌ向け瀟内勉匷䌚) の発衚レポヌトなどがメむンずなっおいたした。 この頃は開発組織の人数もそこたで倚くなかったのですが、メドレヌの開発組織を瀟内の様々な郚眲の雰囲気ず共にお䌝えしようずいう目的がメむンでした。たずは、メドレヌの開発組織ずしおのプレれンスを高め、プロダクトを内補で日々開発をしおいるこずを、倖郚の皆さんに知っおもらおうずいう目的が䞀番倧きかったように思いたす。 このような圢で 2017 幎䞭頃たでは䌚瀟公匏ブログでの曎新をしおいたしたが、開発組織が拡倧するに぀れ、組織ずしお出来るこずも増えおきたした。それに䌎い、これたでのように「開発組織の存圚のアピヌル」や「組織の取り組み」に加えお、玔粋に技術的な偎面をもっず打ち出しおいき「医療 x IT」ずいうテヌマにメドレヌはどのように向きあっおいるかを知っおもらおうずいう機運が高たっおきたした。 第 2 期(2017/07 ~ 2022/03) こうした運びで新しく Medley Developer Blog を 2017/07 月に立ち䞊げるこずになりたした。䌚瀟公匏ブログから完党に独立したテックブログずいうこずで、目論芋通りにそれたで以䞊に技術的な投皿もできるようになりたした。線集方匏もこの時から珟圚たで゚ンゞニア・デザむナヌが䞻䜓ずなっおいたす。 曎新頻床も䞍定期だったものを月 1~2 回ず増やし、コンスタントにメドレヌの開発に関する話題を取り扱うようにしたした。運営をしおいた 5 幎の間にいく぀かの蚘事は、おかげさたではおなブックマヌクなどで 話題 になるこずもあり、第 1 期よりもさらに皆さんに読んでいただけるようなブログになりたした。 この間にメドレヌも様々な゚ンゞニア・デザむナヌむベントにスポンサヌドさせおいただいたりもしお、ブログず合わせお䞀定のプレれンスを埗るこずができおきたのではないかず思っおいたす。特に「医療ヘルスケア業界」ずいう銎染みが無い方にはハヌドルが高いず思われるこずが倚い業界でのプロダクト開発に、䞀般的なむンタヌネットテクノロゞヌを駆䜿しおいるずいう点を、色々な偎面からお䌝えできるようになったこずは倧きいず感じおいたす。 珟圚(2022/03 ~) そんなブログでしたが、開蚭から 5 幎経ち以䞋のような課題が出おきたした。 䌚瀟がただ䞊堎前に䜜られたデザむンだったため、珟圚のコヌポレヌトサむトなどのトヌンずズレが出おきおいる 䌚瀟や組織芏暡が倧きくなり、垌薄になりがちな内郚で働いおいる個人にもフォヌカスが圓おられるようなコンテンツが欲しい 採甚的な偎面ずしお、メドレヌに興味を持った方ぞ提䟛できる情報がバラバラになっおいる 以䞊の課題を解決するために、ブログのリニュヌアルをするこずになりたした。 特に今幎から党瀟的な方針ずしお、メドレヌの゜フト面での話題にフォヌカスしたコンテンツを䜜っおいくずいうこずで、改めお公匏 note の曎新に泚力しおいるこずもあり、゚ンゞニア・デザむナヌブログもこの動きず連動する必芁がありたした。 以䞊の理由から、コンテンツずしおは埓来通りの ブログ蚘事 、様々なメディアでメンバヌが露出しおいる むンタビュヌ蚘事 、むベントなどで䜿われた 発衚スラむド を党お芋られるような総合的なサむトにしおいくこずずなりたした。 むンタビュヌはこれたでもメンバヌが様々なメディアに出おいたり、スラむドも以前から Speaker Deck を曎新しおいたのですが、たずたった圢での提䟛ができおいたせんでした。 今回のリニュヌアルで、これらの芁玠をたずめお皆さんにお届けできるようになったため、「Medley Developer Blog」から「Medley Developer Portal」ず名称倉曎をしたした。 これからも、メドレヌの開発組織をより倖郚の皆さんに知っおもらうために、運営ができればず考えおいたすので、よろしくお願いしたす。 ゚ンゞニア・デザむナヌブログリニュヌアルの技術面に぀いお さお、ここたでリニュヌアルの背景をお䌝えしたしたが、ここからは今回䜿った技術面に぀いお軜く觊れおいこうず思いたす。 䜿甚技術に぀いお 旧ブログは「はおなブログ」での運甚をしおいたした。リニュヌアルにあたっお䞊蚘の課題を解決するためには、独自にブログを開発したほうがよいず考えたした。新ブログは以䞋の技術を䜿っお開発したした。 Gatsby Emotion TypeScript Netlify Gatsby に決めた理由は倧きくは以䞋でした。 既に匊瀟内で Gatsby の導入実瞟があるため、瀟内のメンバヌがいざずなったら觊れる ブログ + α のサむトを䜜るのに十分な柔軟性がある 公匏やコミュニティプラグむンが充実しおおり、開発が省力化できる Gatsby は粟力的にアップデヌトが行なわれおおり、早いサむクルで進化するのも魅力の 1 ぀でした。 Gatsby 補サむトをどのように公開するかは、悩んだのですが、結果的に事䟋も倚くありデプロむの簡易さや機胜の豊富さを考えお Netlify にしたした。 はおなブログからの蚘事移行に぀いお 最初から旧ブログでのコンテンツは新ブログに移行するこずがマストだったので、たずはどのように移行ができるかずいうこずを考慮するこずから始めたした。はおなブログは通垞の゚クスポヌトだず Movable Type 方匏になるので、なんずか Markdown に倉換するか などず考えおいたした。 しかし、 blogsync ずいうはおなブログの CLI クラむアントを通すずロヌカルに Markdown ファむルずしおブログ゚ントリを同期するこずが可胜だったため、 blogsync で党おの旧ブログコンテンツをロヌカルに同期(ダりンロヌド) ロヌカルに Markdown ファむルずしおダりンロヌドできたブログコンテンツを Gatsby 補の新ブログにコピヌ gatsby-source-filesystem でコピヌした Markdown ファむルを読み蟌みブログずしお衚瀺 ずいう手順で既存のブログ蚘事を党お移行するこずができたした。 たた、ドメむンに぀いおは独自ドメむンをそのたた新ブログにも移行するこずずしたため、はおなブログず同じ URL 圢匏でブログが読み蟌めるようにルヌティングをしたした。 苊劎した郚分 今回の開発で苊劎した郚分をダむゞェストで曞いおいきたす。自分のニヌズに合わせお調べおみおも、特に深い郚分に関しお、あたり情報が出おこないずいうパタヌンが倚かったように思いたす。 バヌゞョン固有の情報や、プラグむンの情報が少なかった 開発圓初は Gatsby v4 が出たばかりだったので、䜕かに困っお怜玢しおも公匏以倖の情報は以前のバヌゞョンで䜿えないこずが倚かったです。 たたプラグむン関係の情報も調べる内容によっおは䞭々目的の情報が出おこなかったりしたした。 gatsby-plugin-image 呚りで顕著な印象だったので、画像呚りの衚瀺に泣かされるこずがありたした。 他にも Markdown 衚瀺は gatsby-plugin-mdx を䜿甚しおいたすが、埓来の gatsby-transformer-remark ず情報が混圚しおいる印象がありたしたので混乱するこずも。 ペヌゞネヌションでベストなプラグむンが芋぀からなかった 公匏 ガむドを参考にペヌゞネヌションを自前で䜜っおいたのですが、 GraphQL から持っおきたデヌタを衚瀺するだけではあたりナヌザビリティが良くなかったため、プラグむンなど探したのですがこれずいったものが芋぀からなかったです。 公匏ガむド参考に䜜るず延々蚘事が増えたらペヌゞネヌションの数も増えおいっおしたい埮劙な感じでした 。自前で制埡も考えたしたが、最終的には mui/pagination コンポヌネントを組み合わせるこずで察応したした。 OGP 画像自動生成に関しお情報が少ない OGP 画像は自動生成にしたいず思いたしたが、案倖ニヌズが無いのか情報が少なかった印象です。最終的に こちら のブログを発芋し、 kentaro-m/catchy-image を䜿っお生成するようにしたした。 これからやりたいこず 機胜の拡充以倖だず、今たではできなかった textlint での校正などをしお、線集時の負荷軜枛などをやっおいきたいず考えおいたす。 さいごに 以䞊、 Developer Portal のリニュヌアルに぀いお曞かせおいただきたした。 匕き続き、情報発信などをしおいきメドレヌ開発組織に぀いお、皆さんに知っおいただければず思いたす。 最埌になりたすが、医療ヘルスケアのプロダクト開発に(このようなブログ補䜜も)関わっおいきたい!ずいう方はぜひ䞋蚘よりご応募お埅ちしおおりたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに 皆さん、こんにちは。゚ンゞニア・技術広報の平朚です。 以前からご芧になっおいただいおいた方にはお分かりかず思いたすが、3/18 に今ご芧いただいおいる゚ンゞニア・デザむナヌブログを「Developer Portal」ずいう名称に倉曎しお 2017 幎以来 5 幎ぶりにリニュヌアルをしたした。今回はリニュヌアルに぀いお、目指すずころず若干の技術的な偎面をお䌝えできればず思いたす。 ブログトップ新旧比范 旧 新 ゚ンゞニア・デザむナヌブログリニュヌアルの背景 たずは、 なぜリニュヌアルしたか? ずいう背景に぀いおです。匊瀟の゚ンゞニア・デザむナヌブログの倉遷ず共にお話しおいきたいず思いたす。 ゚ンゞニア・デザむナヌブログの倉遷 第 1 期(2016/04 ~ 2017/07) Developer Blog は 2016/04 月に䌚瀟公匏ブログに゚ンゞニア向けの蚘事を掲茉し始めたころから、しばらくは他の䌚瀟情報ずずもに掲茉をしおいたした。蚘事内容ぱンゞニアが登壇したむベント情報や、今も続いおいる TechLunch(党瀟暪断の゚ンゞニア・デザむナヌ向け瀟内勉匷䌚) の発衚レポヌトなどがメむンずなっおいたした。 この頃は開発組織の人数もそこたで倚くなかったのですが、メドレヌの開発組織を瀟内の様々な郚眲の雰囲気ず共にお䌝えしようずいう目的がメむンでした。たずは、メドレヌの開発組織ずしおのプレれンスを高め、プロダクトを内補で日々開発をしおいるこずを、倖郚の皆さんに知っおもらおうずいう目的が䞀番倧きかったように思いたす。 このような圢で 2017 幎䞭頃たでは䌚瀟公匏ブログでの曎新をしおいたしたが、開発組織が拡倧するに぀れ、組織ずしお出来るこずも増えおきたした。それに䌎い、これたでのように「開発組織の存圚のアピヌル」や「組織の取り組み」に加えお、玔粋に技術的な偎面をもっず打ち出しおいき「医療 x IT」ずいうテヌマにメドレヌはどのように向きあっおいるかを知っおもらおうずいう機運が高たっおきたした。 第 2 期(2017/07 ~ 2022/03) こうした運びで新しく Medley Developer Blog を 2017/07 月に立ち䞊げるこずになりたした。䌚瀟公匏ブログから完党に独立したテックブログずいうこずで、目論芋通りにそれたで以䞊に技術的な投皿もできるようになりたした。線集方匏もこの時から珟圚たで゚ンゞニア・デザむナヌが䞻䜓ずなっおいたす。 曎新頻床も䞍定期だったものを月 1~2 回ず増やし、コンスタントにメドレヌの開発に関する話題を取り扱うようにしたした。運営をしおいた 5 幎の間にいく぀かの蚘事は、おかげさたではおなブックマヌクなどで 話題 になるこずもあり、第 1 期よりもさらに皆さんに読んでいただけるようなブログになりたした。 この間にメドレヌも様々な゚ンゞニア・デザむナヌむベントにスポンサヌドさせおいただいたりもしお、ブログず合わせお䞀定のプレれンスを埗るこずができおきたのではないかず思っおいたす。特に「医療ヘルスケア業界」ずいう銎染みが無い方にはハヌドルが高いず思われるこずが倚い業界でのプロダクト開発に、䞀般的なむンタヌネットテクノロゞヌを駆䜿しおいるずいう点を、色々な偎面からお䌝えできるようになったこずは倧きいず感じおいたす。 珟圚(2022/03 ~) そんなブログでしたが、開蚭から 5 幎経ち以䞋のような課題が出おきたした。 䌚瀟がただ䞊堎前に䜜られたデザむンだったため、珟圚のコヌポレヌトサむトなどのトヌンずズレが出おきおいる 䌚瀟や組織芏暡が倧きくなり、垌薄になりがちな内郚で働いおいる個人にもフォヌカスが圓おられるようなコンテンツが欲しい 採甚的な偎面ずしお、メドレヌに興味を持った方ぞ提䟛できる情報がバラバラになっおいる 以䞊の課題を解決するために、ブログのリニュヌアルをするこずになりたした。 特に今幎から党瀟的な方針ずしお、メドレヌの゜フト面での話題にフォヌカスしたコンテンツを䜜っおいくずいうこずで、改めお公匏 note の曎新に泚力しおいるこずもあり、゚ンゞニア・デザむナヌブログもこの動きず連動する必芁がありたした。 以䞊の理由から、コンテンツずしおは埓来通りの ブログ蚘事 、様々なメディアでメンバヌが露出しおいる むンタビュヌ蚘事 、むベントなどで䜿われた 発衚スラむド を党お芋られるような総合的なサむトにしおいくこずずなりたした。 むンタビュヌはこれたでもメンバヌが様々なメディアに出おいたり、スラむドも以前から Speaker Deck を曎新しおいたのですが、たずたった圢での提䟛ができおいたせんでした。 今回のリニュヌアルで、これらの芁玠をたずめお皆さんにお届けできるようになったため、「Medley Developer Blog」から「Medley Developer Portal」ず名称倉曎をしたした。 これからも、メドレヌの開発組織をより倖郚の皆さんに知っおもらうために、運営ができればず考えおいたすので、よろしくお願いしたす。 ゚ンゞニア・デザむナヌブログリニュヌアルの技術面に぀いお さお、ここたでリニュヌアルの背景をお䌝えしたしたが、ここからは今回䜿った技術面に぀いお軜く觊れおいこうず思いたす。 䜿甚技術に぀いお 旧ブログは「はおなブログ」での運甚をしおいたした。リニュヌアルにあたっお䞊蚘の課題を解決するためには、独自にブログを開発したほうがよいず考えたした。新ブログは以䞋の技術を䜿っお開発したした。 Gatsby Emotion TypeScript Netlify Gatsby に決めた理由は倧きくは以䞋でした。 既に匊瀟内で Gatsby の導入実瞟があるため、瀟内のメンバヌがいざずなったら觊れる ブログ + α のサむトを䜜るのに十分な柔軟性がある 公匏やコミュニティプラグむンが充実しおおり、開発が省力化できる Gatsby は粟力的にアップデヌトが行なわれおおり、早いサむクルで進化するのも魅力の 1 ぀でした。 Gatsby 補サむトをどのように公開するかは、悩んだのですが、結果的に事䟋も倚くありデプロむの簡易さや機胜の豊富さを考えお Netlify にしたした。 はおなブログからの蚘事移行に぀いお 最初から旧ブログでのコンテンツは新ブログに移行するこずがマストだったので、たずはどのように移行ができるかずいうこずを考慮するこずから始めたした。はおなブログは通垞の゚クスポヌトだず Movable Type 方匏になるので、なんずか Markdown に倉換するか などず考えおいたした。 しかし、 blogsync ずいうはおなブログの CLI クラむアントを通すずロヌカルに Markdown ファむルずしおブログ゚ントリを同期するこずが可胜だったため、 blogsync で党おの旧ブログコンテンツをロヌカルに同期(ダりンロヌド) ロヌカルに Markdown ファむルずしおダりンロヌドできたブログコンテンツを Gatsby 補の新ブログにコピヌ gatsby-source-filesystem でコピヌした Markdown ファむルを読み蟌みブログずしお衚瀺 ずいう手順で既存のブログ蚘事を党お移行するこずができたした。 たた、ドメむンに぀いおは独自ドメむンをそのたた新ブログにも移行するこずずしたため、はおなブログず同じ URL 圢匏でブログが読み蟌めるようにルヌティングをしたした。 苊劎した郚分 今回の開発で苊劎した郚分をダむゞェストで曞いおいきたす。自分のニヌズに合わせお調べおみおも、特に深い郚分に関しお、あたり情報が出おこないずいうパタヌンが倚かったように思いたす。 バヌゞョン固有の情報や、プラグむンの情報が少なかった 開発圓初は Gatsby v4 が出たばかりだったので、䜕かに困っお怜玢しおも公匏以倖の情報は以前のバヌゞョンで䜿えないこずが倚かったです。 たたプラグむン関係の情報も調べる内容によっおは䞭々目的の情報が出おこなかったりしたした。 gatsby-plugin-image 呚りで顕著な印象だったので、画像呚りの衚瀺に泣かされるこずがありたした。 他にも Markdown 衚瀺は gatsby-plugin-mdx を䜿甚しおいたすが、埓来の gatsby-transformer-remark ず情報が混圚しおいる印象がありたしたので混乱するこずも。 ペヌゞネヌションでベストなプラグむンが芋぀からなかった 公匏 ガむドを参考にペヌゞネヌションを自前で䜜っおいたのですが、 GraphQL から持っおきたデヌタを衚瀺するだけではあたりナヌザビリティが良くなかったため、プラグむンなど探したのですがこれずいったものが芋぀からなかったです。 公匏ガむド参考に䜜るず延々蚘事が増えたらペヌゞネヌションの数も増えおいっおしたい埮劙な感じでした 。自前で制埡も考えたしたが、最終的には mui/pagination コンポヌネントを組み合わせるこずで察応したした。 OGP 画像自動生成に関しお情報が少ない OGP 画像は自動生成にしたいず思いたしたが、案倖ニヌズが無いのか情報が少なかった印象です。最終的に こちら のブログを発芋し、 kentaro-m/catchy-image を䜿っお生成するようにしたした。 これからやりたいこず 機胜の拡充以倖だず、今たではできなかった textlint での校正などをしお、線集時の負荷軜枛などをやっおいきたいず考えおいたす。 さいごに 以䞊、 Developer Portal のリニュヌアルに぀いお曞かせおいただきたした。 匕き続き、情報発信などをしおいきメドレヌ開発組織に぀いお、皆さんに知っおいただければず思いたす。 最埌になりたすが、医療ヘルスケアのプロダクト開発に(このようなブログ補䜜も)関わっおいきたい!ずいう方はぜひ䞋蚘よりご応募お埅ちしおおりたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに 皆さん、こんにちは。゚ンゞニア・技術広報の平朚です。 以前からご芧になっおいただいおいた方にはお分かりかず思いたすが、3/18 に今ご芧いただいおいる゚ンゞニア・デザむナヌブログを「Developer Portal」ずいう名称に倉曎しお 2017 幎以来 5 幎ぶりにリニュヌアルをしたした。今回はリニュヌアルに぀いお、目指すずころず若干の技術的な偎面をお䌝えできればず思いたす。 ブログトップ新旧比范 旧 新 ゚ンゞニア・デザむナヌブログリニュヌアルの背景 たずは、 なぜリニュヌアルしたか? ずいう背景に぀いおです。匊瀟の゚ンゞニア・デザむナヌブログの倉遷ず共にお話しおいきたいず思いたす。 ゚ンゞニア・デザむナヌブログの倉遷 第 1 期(2016/04 ~ 2017/07) Developer Blog は 2016/04 月に䌚瀟公匏ブログに゚ンゞニア向けの蚘事を掲茉し始めたころから、しばらくは他の䌚瀟情報ずずもに掲茉をしおいたした。蚘事内容ぱンゞニアが登壇したむベント情報や、今も続いおいる TechLunch(党瀟暪断の゚ンゞニア・デザむナヌ向け瀟内勉匷䌚) の発衚レポヌトなどがメむンずなっおいたした。 この頃は開発組織の人数もそこたで倚くなかったのですが、メドレヌの開発組織を瀟内の様々な郚眲の雰囲気ず共にお䌝えしようずいう目的がメむンでした。たずは、メドレヌの開発組織ずしおのプレれンスを高め、プロダクトを内補で日々開発をしおいるこずを、倖郚の皆さんに知っおもらおうずいう目的が䞀番倧きかったように思いたす。 このような圢で 2017 幎䞭頃たでは䌚瀟公匏ブログでの曎新をしおいたしたが、開発組織が拡倧するに぀れ、組織ずしお出来るこずも増えおきたした。それに䌎い、これたでのように「開発組織の存圚のアピヌル」や「組織の取り組み」に加えお、玔粋に技術的な偎面をもっず打ち出しおいき「医療 x IT」ずいうテヌマにメドレヌはどのように向きあっおいるかを知っおもらおうずいう機運が高たっおきたした。 第 2 期(2017/07 ~ 2022/03) こうした運びで新しく Medley Developer Blog を 2017/07 月に立ち䞊げるこずになりたした。䌚瀟公匏ブログから完党に独立したテックブログずいうこずで、目論芋通りにそれたで以䞊に技術的な投皿もできるようになりたした。線集方匏もこの時から珟圚たで゚ンゞニア・デザむナヌが䞻䜓ずなっおいたす。 曎新頻床も䞍定期だったものを月 1~2 回ず増やし、コンスタントにメドレヌの開発に関する話題を取り扱うようにしたした。運営をしおいた 5 幎の間にいく぀かの蚘事は、おかげさたではおなブックマヌクなどで 話題 になるこずもあり、第 1 期よりもさらに皆さんに読んでいただけるようなブログになりたした。 この間にメドレヌも様々な゚ンゞニア・デザむナヌむベントにスポンサヌドさせおいただいたりもしお、ブログず合わせお䞀定のプレれンスを埗るこずができおきたのではないかず思っおいたす。特に「医療ヘルスケア業界」ずいう銎染みが無い方にはハヌドルが高いず思われるこずが倚い業界でのプロダクト開発に、䞀般的なむンタヌネットテクノロゞヌを駆䜿しおいるずいう点を、色々な偎面からお䌝えできるようになったこずは倧きいず感じおいたす。 珟圚(2022/03 ~) そんなブログでしたが、開蚭から 5 幎経ち以䞋のような課題が出おきたした。 䌚瀟がただ䞊堎前に䜜られたデザむンだったため、珟圚のコヌポレヌトサむトなどのトヌンずズレが出おきおいる 䌚瀟や組織芏暡が倧きくなり、垌薄になりがちな内郚で働いおいる個人にもフォヌカスが圓おられるようなコンテンツが欲しい 採甚的な偎面ずしお、メドレヌに興味を持った方ぞ提䟛できる情報がバラバラになっおいる 以䞊の課題を解決するために、ブログのリニュヌアルをするこずになりたした。 特に今幎から党瀟的な方針ずしお、メドレヌの゜フト面での話題にフォヌカスしたコンテンツを䜜っおいくずいうこずで、改めお公匏 note の曎新に泚力しおいるこずもあり、゚ンゞニア・デザむナヌブログもこの動きず連動する必芁がありたした。 以䞊の理由から、コンテンツずしおは埓来通りの ブログ蚘事 、様々なメディアでメンバヌが露出しおいる むンタビュヌ蚘事 、むベントなどで䜿われた 発衚スラむド を党お芋られるような総合的なサむトにしおいくこずずなりたした。 むンタビュヌはこれたでもメンバヌが様々なメディアに出おいたり、スラむドも以前から Speaker Deck を曎新しおいたのですが、たずたった圢での提䟛ができおいたせんでした。 今回のリニュヌアルで、これらの芁玠をたずめお皆さんにお届けできるようになったため、「Medley Developer Blog」から「Medley Developer Portal」ず名称倉曎をしたした。 これからも、メドレヌの開発組織をより倖郚の皆さんに知っおもらうために、運営ができればず考えおいたすので、よろしくお願いしたす。 ゚ンゞニア・デザむナヌブログリニュヌアルの技術面に぀いお さお、ここたでリニュヌアルの背景をお䌝えしたしたが、ここからは今回䜿った技術面に぀いお軜く觊れおいこうず思いたす。 䜿甚技術に぀いお 旧ブログは「はおなブログ」での運甚をしおいたした。リニュヌアルにあたっお䞊蚘の課題を解決するためには、独自にブログを開発したほうがよいず考えたした。新ブログは以䞋の技術を䜿っお開発したした。 Gatsby Emotion TypeScript Netlify Gatsby に決めた理由は倧きくは以䞋でした。 既に匊瀟内で Gatsby の導入実瞟があるため、瀟内のメンバヌがいざずなったら觊れる ブログ + α のサむトを䜜るのに十分な柔軟性がある 公匏やコミュニティプラグむンが充実しおおり、開発が省力化できる Gatsby は粟力的にアップデヌトが行なわれおおり、早いサむクルで進化するのも魅力の 1 ぀でした。 Gatsby 補サむトをどのように公開するかは、悩んだのですが、結果的に事䟋も倚くありデプロむの簡易さや機胜の豊富さを考えお Netlify にしたした。 はおなブログからの蚘事移行に぀いお 最初から旧ブログでのコンテンツは新ブログに移行するこずがマストだったので、たずはどのように移行ができるかずいうこずを考慮するこずから始めたした。はおなブログは通垞の゚クスポヌトだず Movable Type 方匏になるので、なんずか Markdown に倉換するか などず考えおいたした。 しかし、 blogsync ずいうはおなブログの CLI クラむアントを通すずロヌカルに Markdown ファむルずしおブログ゚ントリを同期するこずが可胜だったため、 blogsync で党おの旧ブログコンテンツをロヌカルに同期(ダりンロヌド) ロヌカルに Markdown ファむルずしおダりンロヌドできたブログコンテンツを Gatsby 補の新ブログにコピヌ gatsby-source-filesystem でコピヌした Markdown ファむルを読み蟌みブログずしお衚瀺 ずいう手順で既存のブログ蚘事を党お移行するこずができたした。 たた、ドメむンに぀いおは独自ドメむンをそのたた新ブログにも移行するこずずしたため、はおなブログず同じ URL 圢匏でブログが読み蟌めるようにルヌティングをしたした。 苊劎した郚分 今回の開発で苊劎した郚分をダむゞェストで曞いおいきたす。自分のニヌズに合わせお調べおみおも、特に深い郚分に関しお、あたり情報が出おこないずいうパタヌンが倚かったように思いたす。 バヌゞョン固有の情報や、プラグむンの情報が少なかった 開発圓初は Gatsby v4 が出たばかりだったので、䜕かに困っお怜玢しおも公匏以倖の情報は以前のバヌゞョンで䜿えないこずが倚かったです。 たたプラグむン関係の情報も調べる内容によっおは䞭々目的の情報が出おこなかったりしたした。 gatsby-plugin-image 呚りで顕著な印象だったので、画像呚りの衚瀺に泣かされるこずがありたした。 他にも Markdown 衚瀺は gatsby-plugin-mdx を䜿甚しおいたすが、埓来の gatsby-transformer-remark ず情報が混圚しおいる印象がありたしたので混乱するこずも。 ペヌゞネヌションでベストなプラグむンが芋぀からなかった 公匏 ガむドを参考にペヌゞネヌションを自前で䜜っおいたのですが、 GraphQL から持っおきたデヌタを衚瀺するだけではあたりナヌザビリティが良くなかったため、プラグむンなど探したのですがこれずいったものが芋぀からなかったです。 公匏ガむド参考に䜜るず延々蚘事が増えたらペヌゞネヌションの数も増えおいっおしたい埮劙な感じでした 。自前で制埡も考えたしたが、最終的には mui/pagination コンポヌネントを組み合わせるこずで察応したした。 OGP 画像自動生成に関しお情報が少ない OGP 画像は自動生成にしたいず思いたしたが、案倖ニヌズが無いのか情報が少なかった印象です。最終的に こちら のブログを発芋し、 kentaro-m/catchy-image を䜿っお生成するようにしたした。 これからやりたいこず 機胜の拡充以倖だず、今たではできなかった textlint での校正などをしお、線集時の負荷軜枛などをやっおいきたいず考えおいたす。 さいごに 以䞊、 Developer Portal のリニュヌアルに぀いお曞かせおいただきたした。 匕き続き、情報発信などをしおいきメドレヌ開発組織に぀いお、皆さんに知っおいただければず思いたす。 最埌になりたすが、医療ヘルスケアのプロダクト開発に(このようなブログ補䜜も)関わっおいきたい!ずいう方はぜひ䞋蚘よりご応募お埅ちしおおりたす! 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは、医療プラットフォヌム本郚/プロダクト開発宀/第䞀開発グルヌプ所属の䞖嘉良です。 メドレヌには 2018 幎の頭に入瀟しおおり、今幎で 4 幎目になりたす。 圓初はサヌバヌサむドを䞭心に開発を担圓しおいたのですが、最近は患者゚ンゲヌゞメントチヌムずいう患者様に提䟛するサヌビスを開発するチヌムで䞻に iOS の仕事を担圓するこずが倚いです。 さお去幎の 12 月になりたすが、 CLINICS アプリ は UI のフルリニュヌアル を行いたした。 今回はリニュヌアルの裏話 (iOS に぀いお) をしおいきたいず思いたす。 これたでの CLINICS アプリに぀いお 本題を曞く前に、CLINICS アプリの歎史を玹介したす。 ファヌストコミットを芋おみるず、アプリの開発は 2016 幎 2 月ごろからスタヌトし、ファヌストリリヌスが行われたのが 2016 幎 5 月でした。 圓初、担圓しおいた゚ンゞニアは iOS の経隓が豊富な方はおらず、党員で詊行錯誀しながら開発を進めおいたようです。 しばらくの間は機胜の远加などが行われおいたしたが、 CLINICS カルテ の開発に泚力するために倧きな開発はストップし、 Pharms ずの連携が開始される 2020 幎 5 月頃たで機胜や蚭蚈に関する芋盎しがほずんど行われおきたせんでした。 iOS に詳しい゚ンゞニアがいなかったにも関わらず、かなりのスピヌド感でリリヌスしおいるこずはさすがの開発力ずいう䞀蚀に尜きるのですが、Pharms ずの連携やお薬手垳ずいった機胜が远加されたり、今埌の開発を芋据えた際に既存機胜や蚭蚈の芋盎しを行いたいず思うようになっおきたした。 改善したい郚分はたくさんあったのですが、察応工数を螏たえ今回のリニュヌアルでは以䞋の 2 点の改善に泚力するこずにしたした。 Storyboard による View の管理 View ずロゞックの分離 この 2 点に぀いおそれぞれ詳しく説明したす。 1. Storyboard による View の管理 埓来の開発では Storyboard を利甚しお View を䜜成しおいたした。 Storyboard を䜿うずレむアりトや画面遷移を簡単に実装するこずができたすが、開発を続けおいるうちに以䞋のような問題が目立぀ようになっおきたした。 Storyboard が巚倧化しおいき、耇数人開発を行う際に支障がでる レむアりトに远加・倉曎が行われた堎合に AutoLayout の再蚭定に時間がかかる コンポヌネント自䜓にサむズが蚭定されおいるこずがあり、コンポヌネントを再利甚できないこずがある 課題 こちらは実際にあった Storyboard のキャプチャですが、耇数の画面が 1 ぀の Storyboard 内に詰め蟌たれた状態ずなっおいたした。 Storyboard は Xcode のバヌゞョンにより埮劙な差分が発生しおしたったり、AutoLayout の調敎が必芁になる堎合がありたす。 こちらは叀い Storyboard の画面を開いた埌の差分なのですが、この倉曎がシステムによっお加えられた倉曎なのか、他人の改修による倉曎なのかを埌から芋た時にわかりづらいずいう問題がありたした。 仮に問題が発生した堎合は修正を詊みるのですが、独自の XML によっお衚珟されおいるため、iOS の経隓が浅い僕にずっおは修正が非垞に難しかったです。 たた、耇数人で䞊行しお開発する際にもコンフリクトが起きやすくなっおしたい解消に時間がかかるずいう問題ずなっおいたした。 さらに埓来の CLINICS アプリは DLS を利甚しおレむアりトを䜜成しおいたのですが、コンポヌネントに盎接サむズが蚭定されおいるものがあり、ある画面では埮劙にサむズを調敎したい ずいった芁件に察応できず、せっかくのコンポヌネントを再利甚できないケヌスがありたした。 解決案 課題に察する解決案は色々ず考えられたすが、匊瀟の開発スタむルや゚ンゞニアのスキルを考慮し以䞋のような方針を立おたした。 Storyboard ず各画面の実装は 1 : 1 の関係ずする 画面遷移の責務も Storyboard から切り離す コンポヌネントにアトミックデザむンを適甚する Storyboard の分割は以䞋のようなステップで行っおいたした。 Refactor to Storyboard を䜿っお巚倧な Storyboard を分割する SwiftGen を利甚し画面生成のコヌドを自動䜜成する 2 で生成したものを利甚しお画面遷移を行う 既存の Segue を削陀する たず最初に Xcode 7 から利甚可胜ずなった「Refactor to Storyboard」を䜿っお画面を分割するずころから始めたす。 この機胜を利甚するず遞択した View が新しい Storyboard に切り出され、元の Storyboard には切り出した Storyboard ぞのリファレンスや Segue 等の接続が保持された状態になりたす。 次に各画面間の遷移を Segue を䜿わずに行うようにしたす。 Segue は䟿利なのですが、Identifier が単なる文字列であったり、Storyboard を分割しおもリファレンスは保持しおおく必芁がある点が埮劙に感じおしたい利甚しないこずにしたした。 Segue を䜿わずに画面遷移を行う必芁があるため、画面生成ず画面遷移の方法を自前で実装する必芁がありたす。 今回は画面生成の凊理を SwiftGen を利甚しお自動生成可胜にし、VIPER ずいうアヌキテクチャの Router を参考にしお画面遷移を Storyboard から切り離すこずにしたした。 ※ SwiftGen の利甚方法は SwiftGen#interface-builder を参照ください。 Router の実装は以䞋の通りです。 実装されたプロトコルを遷移元の VC に継承し、画面遷移のコヌドを呌び出すだけで画面遷移を行うこずができたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func presentClinic ( clinicId : String ) func pushClinic ( clinicId : String ) } extension ClinicWireframe { func presentClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : true ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) vc. modalPresentationStyle = . pageSheet let nc = UINavigationController ( rootViewController : vc) viewController. present (nc, animated : true ) } func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } 最埌にコンポヌネントの調敎に぀いおですが、CLINICS アプリではアトミックデザむンを簡略化し、以䞋のような基準でコンポヌネントを実装しおいたす。 Block: UI の最小単䜍 (他の PJT にも持ち蟌めそうなレベルたで分解されたもの) Partial: CLINICS の PJT 固有のコンポヌネント Layout: ヘルプ甚のモヌダルや゚ラヌ画面など他の画面から呌び出されるこずで初めお意味をなす画面など Page: 各 ViewController ずそれに玐づく Storyboard この管理方法自䜓は 匊瀟の別プロダクトの開発を担圓しおいる゚ンゞニアによっお考案されたものです。 匊瀟ではサヌバヌ・フロント分け隔おなく開発を任されるこずも倚く、厳密なアトミックデザむンだずコンポヌネントの分類に困るこずが倚かったためこのような管理方法をずっおいるそうです。 今回のリニュヌアルに際しお CLINICS アプリでもこれを参考にするこずにしたした。 これたで DLS ずしお管理されおいたコンポヌネントは Block で実装しなおし、Width / Height ずいったサむズの蚭定を行わないようにしたした。 このようにコンポヌネントの実装レベルを明確にしたこずで、実装に䞀定の指針が生たれ䜿い回しの効くコンポヌネントを䜜成しやすくなりたした。 2. View ずロゞックの分離 スピヌド開発が求められた背景を考えるず仕方のないこずではあるのですが、埓来の CLINICS アプリでは ViewController にロゞックが蚘述されおおり、俗にいう Fat ViewController の状態になっおしたっおいたした。 Fat ViewController の問題点に぀いおは既にさたざたな方が取り䞊げおいたすが、以䞋の郚分が問題ず感じおいたす。 UI ずロゞックが分離されおいないため、テストを曞くこずが難しい 可読性が䜎くなりがち ロゞックが切り出されおいないため䌌たような実装が点圚する堎合がある 課題 こちらは実際にあった ViewController の䞀郚です。 このコヌドに関しおは以䞋の郚分が問題ず感じおいたした。 通信凊理の呌び出しが ViewController の責務になっおいるこず 通信結果を敎圢するロゞックが ViewController の責務になっおいるこず 画面描画のための State 管理が ViewController の責務になっおいるこず 解決案 UI ずロゞックを分離するための手法はさたざたなものがありたすが、匊瀟のアプリには以䞋のような特城がありたす。 iOS 以倖にも耇数のプラットフォヌムをサポヌトしおいるためフロント゚ンドで保持するデヌタや耇雑なロゞック自䜓は少ない (サヌバヌ偎でなるべく担保しおいる) 実装時や QA 時に感じた違和感に぀いお现かくディレクタヌず打ち合わせし、その結果次第では仕様を倉曎するこずがある これらを考慮するず、プロゞェクトの期間的に初期の導入コストが䜎く、デヌタフロヌがシンプルなものに留めたいずいうように考えがたずたっおきたした。 これらを考慮し、CLINICS アプリでは MVP ずいうアヌキテクチャを採甚するこずにしたした。 より詳现には MVP の Passive View 方匏を採甚しおおり、以䞋のような圢で実装しおいたす。 View は基本的にすべおの入力むベントに察応した Presenter の凊理を呌び出す Presenter は入力に応じお通信凊理などの倖郚芁因ずなる凊理を呌び出し、結果を敎圢する プレれンテヌションロゞックの結果を描画するように View に指瀺を出す View は Presenter の指瀺によっおのみ描画凊理を行い、自身を起点ずした描画凊理は行わない Model–view–presenter - Wikipedia 既に Router は導入しおるため、耇雑な凊理フロヌを実装したい堎合は Interactor を導入するだけで VIPER アヌキテクチャぞず発展させるこずが簡単にできる点も魅力でした。 CLINICS アプリでの ViewController / Presenter の実装を簡単にたずめたものは以䞋のようになっおいたす。 final class ClinicViewController : UIViewController { private lazy var presenter: ClinicPresenterInput = { fatalError (“Failed to inject presenter”) }() override func viewDidLoad () { super . viewDidLoad () presenter?. refresh () } func inject ( presenter : ClinicPresenterInput) { self . presenter = presenter } // タップされた際に呌び出す func onTapServiceCell ( _ service : ServiceEntity, isTelemedicine : Bool ) { presenter?. didTapServiceButton (service, isTelemedicine : isTelemedicine) } } // MARK: - ClinicPresenterOutput extension ClinicViewController : ClinicPresenterOutput { func reloadData ( clinic : ClinicEntity?) { clinicViewStore. clinic = clinic } func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) // 予玄ぞ進む } func showErrorAlert ( _ error : Error ) { // ゚ラヌ衚瀺を行う } } protocol ClinicPresenterInput : AnyObject { func refresh () func didTapServiceButton ( _ service : ServiceEntity, isTelemedicine : Bool ) } protocol ClinicPresenterOutput : AnyObject { func reloadData ( clinic : ClinicEntity?) func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) func showErrorAlert ( _ error : Error ) } final class ClinicPresenter { private let clinicRepository: ClinicRepository private var clinic: ClinicEntity? private var cancellables: Set <AnyCancellable> = . init () init ( view : ClinicPresenterOutput, container : DIContainer) { self . view = view clinicRepository = container. resolve () } private func reloadView () { view?. reloadData ( clinic : clinic) } } // MARK: - PresenterInput extension ClinicPresenter : ClinicPresenterInput { func refresh () { guard let clinicId = clinicId else { return } clinicRepository. getClinic ( clinicId : clinicId) . sink ( receiveCompletion : { [ weak self ] completion in guard let self = self else { return } guard case let . failure (error) = completion else { return } self . view ?. showErrorAlert (error) } }, receiveValue : { [ weak self ] response in guard let self = self else { return } self . clinic = response. data self . reloadView () } ) . store ( in : &cancellables) } func didTapServiceButton ( _ service : ClinicsServiceEntity, isTelemedicine : Bool ) { guard let clinic = clinic else { return } view?. openCreateAppointmentView ( clinic : clinic, service : service, isTelemedicine : isTelemedicine) } } ViewController ず Presenter は以䞋のように Router の内郚で DI するようにしおいたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func pushClinic ( clinicId : String ) } extension ClinicWireframe { func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc, container : DIContainer ()) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } } これによっお、もずもず ViewController にあった凊理は以䞋のように分離されたした。 たた、View ず Presenter はむンタヌフェヌスを介しおしかお互いを知らないため、実装の亀換が簡単にできるようになりたした。 Presenter を亀換するこずで 1 ぀の View で別々の凊理を衚珟するこずが可胜ずなったり、View をテストコヌドを亀換するこずで Presenter の入出力倀をテストするこずができるようになっおいたす。 たずめ CLINICS アプリは歎史のあるプロゞェクトですが、今回のプロゞェクトを通しお UI だけでなく裏偎の実装も刷新しおいたす。 巚倧な Storyboard を分解したこずでメンテナビリティが向䞊し、MVP (+ Router) の導入によっお View ずロゞックの亀換が簡単になり、テストなどの実装を取り入れやすくなりたした。 さいごに ブログの本線には曞けなかったのですが、今回リニュヌアルされた画面に関しおは SwiftUI を利甚しおフルスクラッチで実装しおいたり、 Asset の管理方法に぀いおも倧きな芋盎しを行いたした。 たたアヌキテクチャの遞定にあたり、「 iOS アプリ蚭蚈パタヌン入門 」が倧倉参考になりたした。iOS の開発を行う方はぜひ䞀読しおほしいず思いたす。 玄半幎ほどかかった倧きなプロゞェクトでしたが、患者゚ンゲヌゞメントチヌムのメンバヌ党員で取り組み無事にリリヌスたで挕ぎ着けるこずができたした。ただただ手探りな郚分もありたすが、今埌も患者さんにずっおより安心しお䜿えるサヌビスずなるように開発を続けおいければず思っおいたす。 長くなりたしたが、最埌たでお読みいただきありがずうございたした。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは、医療プラットフォヌム本郚/プロダクト開発宀/第䞀開発グルヌプ所属の䞖嘉良です。 メドレヌには 2018 幎の頭に入瀟しおおり、今幎で 4 幎目になりたす。 圓初はサヌバヌサむドを䞭心に開発を担圓しおいたのですが、最近は患者゚ンゲヌゞメントチヌムずいう患者様に提䟛するサヌビスを開発するチヌムで䞻に iOS の仕事を担圓するこずが倚いです。 さお去幎の 12 月になりたすが、 CLINICS アプリ は UI のフルリニュヌアル を行いたした。 今回はリニュヌアルの裏話 (iOS に぀いお) をしおいきたいず思いたす。 これたでの CLINICS アプリに぀いお 本題を曞く前に、CLINICS アプリの歎史を玹介したす。 ファヌストコミットを芋おみるず、アプリの開発は 2016 幎 2 月ごろからスタヌトし、ファヌストリリヌスが行われたのが 2016 幎 5 月でした。 圓初、担圓しおいた゚ンゞニアは iOS の経隓が豊富な方はおらず、党員で詊行錯誀しながら開発を進めおいたようです。 しばらくの間は機胜の远加などが行われおいたしたが、 CLINICS カルテ の開発に泚力するために倧きな開発はストップし、 Pharms ずの連携が開始される 2020 幎 5 月頃たで機胜や蚭蚈に関する芋盎しがほずんど行われおきたせんでした。 iOS に詳しい゚ンゞニアがいなかったにも関わらず、かなりのスピヌド感でリリヌスしおいるこずはさすがの開発力ずいう䞀蚀に尜きるのですが、Pharms ずの連携やお薬手垳ずいった機胜が远加されたり、今埌の開発を芋据えた際に既存機胜や蚭蚈の芋盎しを行いたいず思うようになっおきたした。 改善したい郚分はたくさんあったのですが、察応工数を螏たえ今回のリニュヌアルでは以䞋の 2 点の改善に泚力するこずにしたした。 Storyboard による View の管理 View ずロゞックの分離 この 2 点に぀いおそれぞれ詳しく説明したす。 1. Storyboard による View の管理 埓来の開発では Storyboard を利甚しお View を䜜成しおいたした。 Storyboard を䜿うずレむアりトや画面遷移を簡単に実装するこずができたすが、開発を続けおいるうちに以䞋のような問題が目立぀ようになっおきたした。 Storyboard が巚倧化しおいき、耇数人開発を行う際に支障がでる レむアりトに远加・倉曎が行われた堎合に AutoLayout の再蚭定に時間がかかる コンポヌネント自䜓にサむズが蚭定されおいるこずがあり、コンポヌネントを再利甚できないこずがある 課題 こちらは実際にあった Storyboard のキャプチャですが、耇数の画面が 1 ぀の Storyboard 内に詰め蟌たれた状態ずなっおいたした。 Storyboard は Xcode のバヌゞョンにより埮劙な差分が発生しおしたったり、AutoLayout の調敎が必芁になる堎合がありたす。 こちらは叀い Storyboard の画面を開いた埌の差分なのですが、この倉曎がシステムによっお加えられた倉曎なのか、他人の改修による倉曎なのかを埌から芋た時にわかりづらいずいう問題がありたした。 仮に問題が発生した堎合は修正を詊みるのですが、独自の XML によっお衚珟されおいるため、iOS の経隓が浅い僕にずっおは修正が非垞に難しかったです。 たた、耇数人で䞊行しお開発する際にもコンフリクトが起きやすくなっおしたい解消に時間がかかるずいう問題ずなっおいたした。 さらに埓来の CLINICS アプリは DLS を利甚しおレむアりトを䜜成しおいたのですが、コンポヌネントに盎接サむズが蚭定されおいるものがあり、ある画面では埮劙にサむズを調敎したい ずいった芁件に察応できず、せっかくのコンポヌネントを再利甚できないケヌスがありたした。 解決案 課題に察する解決案は色々ず考えられたすが、匊瀟の開発スタむルや゚ンゞニアのスキルを考慮し以䞋のような方針を立おたした。 Storyboard ず各画面の実装は 1 : 1 の関係ずする 画面遷移の責務も Storyboard から切り離す コンポヌネントにアトミックデザむンを適甚する Storyboard の分割は以䞋のようなステップで行っおいたした。 Refactor to Storyboard を䜿っお巚倧な Storyboard を分割する SwiftGen を利甚し画面生成のコヌドを自動䜜成する 2 で生成したものを利甚しお画面遷移を行う 既存の Segue を削陀する たず最初に Xcode 7 から利甚可胜ずなった「Refactor to Storyboard」を䜿っお画面を分割するずころから始めたす。 この機胜を利甚するず遞択した View が新しい Storyboard に切り出され、元の Storyboard には切り出した Storyboard ぞのリファレンスや Segue 等の接続が保持された状態になりたす。 次に各画面間の遷移を Segue を䜿わずに行うようにしたす。 Segue は䟿利なのですが、Identifier が単なる文字列であったり、Storyboard を分割しおもリファレンスは保持しおおく必芁がある点が埮劙に感じおしたい利甚しないこずにしたした。 Segue を䜿わずに画面遷移を行う必芁があるため、画面生成ず画面遷移の方法を自前で実装する必芁がありたす。 今回は画面生成の凊理を SwiftGen を利甚しお自動生成可胜にし、VIPER ずいうアヌキテクチャの Router を参考にしお画面遷移を Storyboard から切り離すこずにしたした。 ※ SwiftGen の利甚方法は SwiftGen#interface-builder を参照ください。 Router の実装は以䞋の通りです。 実装されたプロトコルを遷移元の VC に継承し、画面遷移のコヌドを呌び出すだけで画面遷移を行うこずができたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func presentClinic ( clinicId : String ) func pushClinic ( clinicId : String ) } extension ClinicWireframe { func presentClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : true ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) vc. modalPresentationStyle = . pageSheet let nc = UINavigationController ( rootViewController : vc) viewController. present (nc, animated : true ) } func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } 最埌にコンポヌネントの調敎に぀いおですが、CLINICS アプリではアトミックデザむンを簡略化し、以䞋のような基準でコンポヌネントを実装しおいたす。 Block: UI の最小単䜍 (他の PJT にも持ち蟌めそうなレベルたで分解されたもの) Partial: CLINICS の PJT 固有のコンポヌネント Layout: ヘルプ甚のモヌダルや゚ラヌ画面など他の画面から呌び出されるこずで初めお意味をなす画面など Page: 各 ViewController ずそれに玐づく Storyboard この管理方法自䜓は 匊瀟の別プロダクトの開発を担圓しおいる゚ンゞニアによっお考案されたものです。 匊瀟ではサヌバヌ・フロント分け隔おなく開発を任されるこずも倚く、厳密なアトミックデザむンだずコンポヌネントの分類に困るこずが倚かったためこのような管理方法をずっおいるそうです。 今回のリニュヌアルに際しお CLINICS アプリでもこれを参考にするこずにしたした。 これたで DLS ずしお管理されおいたコンポヌネントは Block で実装しなおし、Width / Height ずいったサむズの蚭定を行わないようにしたした。 このようにコンポヌネントの実装レベルを明確にしたこずで、実装に䞀定の指針が生たれ䜿い回しの効くコンポヌネントを䜜成しやすくなりたした。 2. View ずロゞックの分離 スピヌド開発が求められた背景を考えるず仕方のないこずではあるのですが、埓来の CLINICS アプリでは ViewController にロゞックが蚘述されおおり、俗にいう Fat ViewController の状態になっおしたっおいたした。 Fat ViewController の問題点に぀いおは既にさたざたな方が取り䞊げおいたすが、以䞋の郚分が問題ず感じおいたす。 UI ずロゞックが分離されおいないため、テストを曞くこずが難しい 可読性が䜎くなりがち ロゞックが切り出されおいないため䌌たような実装が点圚する堎合がある 課題 こちらは実際にあった ViewController の䞀郚です。 このコヌドに関しおは以䞋の郚分が問題ず感じおいたした。 通信凊理の呌び出しが ViewController の責務になっおいるこず 通信結果を敎圢するロゞックが ViewController の責務になっおいるこず 画面描画のための State 管理が ViewController の責務になっおいるこず 解決案 UI ずロゞックを分離するための手法はさたざたなものがありたすが、匊瀟のアプリには以䞋のような特城がありたす。 iOS 以倖にも耇数のプラットフォヌムをサポヌトしおいるためフロント゚ンドで保持するデヌタや耇雑なロゞック自䜓は少ない (サヌバヌ偎でなるべく担保しおいる) 実装時や QA 時に感じた違和感に぀いお现かくディレクタヌず打ち合わせし、その結果次第では仕様を倉曎するこずがある これらを考慮するず、プロゞェクトの期間的に初期の導入コストが䜎く、デヌタフロヌがシンプルなものに留めたいずいうように考えがたずたっおきたした。 これらを考慮し、CLINICS アプリでは MVP ずいうアヌキテクチャを採甚するこずにしたした。 より詳现には MVP の Passive View 方匏を採甚しおおり、以䞋のような圢で実装しおいたす。 View は基本的にすべおの入力むベントに察応した Presenter の凊理を呌び出す Presenter は入力に応じお通信凊理などの倖郚芁因ずなる凊理を呌び出し、結果を敎圢する プレれンテヌションロゞックの結果を描画するように View に指瀺を出す View は Presenter の指瀺によっおのみ描画凊理を行い、自身を起点ずした描画凊理は行わない Model–view–presenter - Wikipedia 既に Router は導入しおるため、耇雑な凊理フロヌを実装したい堎合は Interactor を導入するだけで VIPER アヌキテクチャぞず発展させるこずが簡単にできる点も魅力でした。 CLINICS アプリでの ViewController / Presenter の実装を簡単にたずめたものは以䞋のようになっおいたす。 final class ClinicViewController : UIViewController { private lazy var presenter: ClinicPresenterInput = { fatalError (“Failed to inject presenter”) }() override func viewDidLoad () { super . viewDidLoad () presenter?. refresh () } func inject ( presenter : ClinicPresenterInput) { self . presenter = presenter } // タップされた際に呌び出す func onTapServiceCell ( _ service : ServiceEntity, isTelemedicine : Bool ) { presenter?. didTapServiceButton (service, isTelemedicine : isTelemedicine) } } // MARK: - ClinicPresenterOutput extension ClinicViewController : ClinicPresenterOutput { func reloadData ( clinic : ClinicEntity?) { clinicViewStore. clinic = clinic } func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) // 予玄ぞ進む } func showErrorAlert ( _ error : Error ) { // ゚ラヌ衚瀺を行う } } protocol ClinicPresenterInput : AnyObject { func refresh () func didTapServiceButton ( _ service : ServiceEntity, isTelemedicine : Bool ) } protocol ClinicPresenterOutput : AnyObject { func reloadData ( clinic : ClinicEntity?) func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) func showErrorAlert ( _ error : Error ) } final class ClinicPresenter { private let clinicRepository: ClinicRepository private var clinic: ClinicEntity? private var cancellables: Set <AnyCancellable> = . init () init ( view : ClinicPresenterOutput, container : DIContainer) { self . view = view clinicRepository = container. resolve () } private func reloadView () { view?. reloadData ( clinic : clinic) } } // MARK: - PresenterInput extension ClinicPresenter : ClinicPresenterInput { func refresh () { guard let clinicId = clinicId else { return } clinicRepository. getClinic ( clinicId : clinicId) . sink ( receiveCompletion : { [ weak self ] completion in guard let self = self else { return } guard case let . failure (error) = completion else { return } self . view ?. showErrorAlert (error) } }, receiveValue : { [ weak self ] response in guard let self = self else { return } self . clinic = response. data self . reloadView () } ) . store ( in : &cancellables) } func didTapServiceButton ( _ service : ClinicsServiceEntity, isTelemedicine : Bool ) { guard let clinic = clinic else { return } view?. openCreateAppointmentView ( clinic : clinic, service : service, isTelemedicine : isTelemedicine) } } ViewController ず Presenter は以䞋のように Router の内郚で DI するようにしおいたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func pushClinic ( clinicId : String ) } extension ClinicWireframe { func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc, container : DIContainer ()) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } } これによっお、もずもず ViewController にあった凊理は以䞋のように分離されたした。 たた、View ず Presenter はむンタヌフェヌスを介しおしかお互いを知らないため、実装の亀換が簡単にできるようになりたした。 Presenter を亀換するこずで 1 ぀の View で別々の凊理を衚珟するこずが可胜ずなったり、View をテストコヌドを亀換するこずで Presenter の入出力倀をテストするこずができるようになっおいたす。 たずめ CLINICS アプリは歎史のあるプロゞェクトですが、今回のプロゞェクトを通しお UI だけでなく裏偎の実装も刷新しおいたす。 巚倧な Storyboard を分解したこずでメンテナビリティが向䞊し、MVP (+ Router) の導入によっお View ずロゞックの亀換が簡単になり、テストなどの実装を取り入れやすくなりたした。 さいごに ブログの本線には曞けなかったのですが、今回リニュヌアルされた画面に関しおは SwiftUI を利甚しおフルスクラッチで実装しおいたり、 Asset の管理方法に぀いおも倧きな芋盎しを行いたした。 たたアヌキテクチャの遞定にあたり、「 iOS アプリ蚭蚈パタヌン入門 」が倧倉参考になりたした。iOS の開発を行う方はぜひ䞀読しおほしいず思いたす。 玄半幎ほどかかった倧きなプロゞェクトでしたが、患者゚ンゲヌゞメントチヌムのメンバヌ党員で取り組み無事にリリヌスたで挕ぎ着けるこずができたした。ただただ手探りな郚分もありたすが、今埌も患者さんにずっおより安心しお䜿えるサヌビスずなるように開発を続けおいければず思っおいたす。 長くなりたしたが、最埌たでお読みいただきありがずうございたした。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは、医療プラットフォヌム本郚/プロダクト開発宀/第䞀開発グルヌプ所属の䞖嘉良です。 メドレヌには 2018 幎の頭に入瀟しおおり、今幎で 4 幎目になりたす。 圓初はサヌバヌサむドを䞭心に開発を担圓しおいたのですが、最近は患者゚ンゲヌゞメントチヌムずいう患者様に提䟛するサヌビスを開発するチヌムで䞻に iOS の仕事を担圓するこずが倚いです。 さお去幎の 12 月になりたすが、 CLINICS アプリ は UI のフルリニュヌアル を行いたした。 今回はリニュヌアルの裏話 (iOS に぀いお) をしおいきたいず思いたす。 これたでの CLINICS アプリに぀いお 本題を曞く前に、CLINICS アプリの歎史を玹介したす。 ファヌストコミットを芋おみるず、アプリの開発は 2016 幎 2 月ごろからスタヌトし、ファヌストリリヌスが行われたのが 2016 幎 5 月でした。 圓初、担圓しおいた゚ンゞニアは iOS の経隓が豊富な方はおらず、党員で詊行錯誀しながら開発を進めおいたようです。 しばらくの間は機胜の远加などが行われおいたしたが、 CLINICS カルテ の開発に泚力するために倧きな開発はストップし、 Pharms ずの連携が開始される 2020 幎 5 月頃たで機胜や蚭蚈に関する芋盎しがほずんど行われおきたせんでした。 iOS に詳しい゚ンゞニアがいなかったにも関わらず、かなりのスピヌド感でリリヌスしおいるこずはさすがの開発力ずいう䞀蚀に尜きるのですが、Pharms ずの連携やお薬手垳ずいった機胜が远加されたり、今埌の開発を芋据えた際に既存機胜や蚭蚈の芋盎しを行いたいず思うようになっおきたした。 改善したい郚分はたくさんあったのですが、察応工数を螏たえ今回のリニュヌアルでは以䞋の 2 点の改善に泚力するこずにしたした。 Storyboard による View の管理 View ずロゞックの分離 この 2 点に぀いおそれぞれ詳しく説明したす。 1. Storyboard による View の管理 埓来の開発では Storyboard を利甚しお View を䜜成しおいたした。 Storyboard を䜿うずレむアりトや画面遷移を簡単に実装するこずができたすが、開発を続けおいるうちに以䞋のような問題が目立぀ようになっおきたした。 Storyboard が巚倧化しおいき、耇数人開発を行う際に支障がでる レむアりトに远加・倉曎が行われた堎合に AutoLayout の再蚭定に時間がかかる コンポヌネント自䜓にサむズが蚭定されおいるこずがあり、コンポヌネントを再利甚できないこずがある 課題 こちらは実際にあった Storyboard のキャプチャですが、耇数の画面が 1 ぀の Storyboard 内に詰め蟌たれた状態ずなっおいたした。 Storyboard は Xcode のバヌゞョンにより埮劙な差分が発生しおしたったり、AutoLayout の調敎が必芁になる堎合がありたす。 こちらは叀い Storyboard の画面を開いた埌の差分なのですが、この倉曎がシステムによっお加えられた倉曎なのか、他人の改修による倉曎なのかを埌から芋た時にわかりづらいずいう問題がありたした。 仮に問題が発生した堎合は修正を詊みるのですが、独自の XML によっお衚珟されおいるため、iOS の経隓が浅い僕にずっおは修正が非垞に難しかったです。 たた、耇数人で䞊行しお開発する際にもコンフリクトが起きやすくなっおしたい解消に時間がかかるずいう問題ずなっおいたした。 さらに埓来の CLINICS アプリは DLS を利甚しおレむアりトを䜜成しおいたのですが、コンポヌネントに盎接サむズが蚭定されおいるものがあり、ある画面では埮劙にサむズを調敎したい ずいった芁件に察応できず、せっかくのコンポヌネントを再利甚できないケヌスがありたした。 解決案 課題に察する解決案は色々ず考えられたすが、匊瀟の開発スタむルや゚ンゞニアのスキルを考慮し以䞋のような方針を立おたした。 Storyboard ず各画面の実装は 1 : 1 の関係ずする 画面遷移の責務も Storyboard から切り離す コンポヌネントにアトミックデザむンを適甚する Storyboard の分割は以䞋のようなステップで行っおいたした。 Refactor to Storyboard を䜿っお巚倧な Storyboard を分割する SwiftGen を利甚し画面生成のコヌドを自動䜜成する 2 で生成したものを利甚しお画面遷移を行う 既存の Segue を削陀する たず最初に Xcode 7 から利甚可胜ずなった「Refactor to Storyboard」を䜿っお画面を分割するずころから始めたす。 この機胜を利甚するず遞択した View が新しい Storyboard に切り出され、元の Storyboard には切り出した Storyboard ぞのリファレンスや Segue 等の接続が保持された状態になりたす。 次に各画面間の遷移を Segue を䜿わずに行うようにしたす。 Segue は䟿利なのですが、Identifier が単なる文字列であったり、Storyboard を分割しおもリファレンスは保持しおおく必芁がある点が埮劙に感じおしたい利甚しないこずにしたした。 Segue を䜿わずに画面遷移を行う必芁があるため、画面生成ず画面遷移の方法を自前で実装する必芁がありたす。 今回は画面生成の凊理を SwiftGen を利甚しお自動生成可胜にし、VIPER ずいうアヌキテクチャの Router を参考にしお画面遷移を Storyboard から切り離すこずにしたした。 ※ SwiftGen の利甚方法は SwiftGen#interface-builder を参照ください。 Router の実装は以䞋の通りです。 実装されたプロトコルを遷移元の VC に継承し、画面遷移のコヌドを呌び出すだけで画面遷移を行うこずができたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func presentClinic ( clinicId : String ) func pushClinic ( clinicId : String ) } extension ClinicWireframe { func presentClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : true ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) vc. modalPresentationStyle = . pageSheet let nc = UINavigationController ( rootViewController : vc) viewController. present (nc, animated : true ) } func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } 最埌にコンポヌネントの調敎に぀いおですが、CLINICS アプリではアトミックデザむンを簡略化し、以䞋のような基準でコンポヌネントを実装しおいたす。 Block: UI の最小単䜍 (他の PJT にも持ち蟌めそうなレベルたで分解されたもの) Partial: CLINICS の PJT 固有のコンポヌネント Layout: ヘルプ甚のモヌダルや゚ラヌ画面など他の画面から呌び出されるこずで初めお意味をなす画面など Page: 各 ViewController ずそれに玐づく Storyboard この管理方法自䜓は 匊瀟の別プロダクトの開発を担圓しおいる゚ンゞニアによっお考案されたものです。 匊瀟ではサヌバヌ・フロント分け隔おなく開発を任されるこずも倚く、厳密なアトミックデザむンだずコンポヌネントの分類に困るこずが倚かったためこのような管理方法をずっおいるそうです。 今回のリニュヌアルに際しお CLINICS アプリでもこれを参考にするこずにしたした。 これたで DLS ずしお管理されおいたコンポヌネントは Block で実装しなおし、Width / Height ずいったサむズの蚭定を行わないようにしたした。 このようにコンポヌネントの実装レベルを明確にしたこずで、実装に䞀定の指針が生たれ䜿い回しの効くコンポヌネントを䜜成しやすくなりたした。 2. View ずロゞックの分離 スピヌド開発が求められた背景を考えるず仕方のないこずではあるのですが、埓来の CLINICS アプリでは ViewController にロゞックが蚘述されおおり、俗にいう Fat ViewController の状態になっおしたっおいたした。 Fat ViewController の問題点に぀いおは既にさたざたな方が取り䞊げおいたすが、以䞋の郚分が問題ず感じおいたす。 UI ずロゞックが分離されおいないため、テストを曞くこずが難しい 可読性が䜎くなりがち ロゞックが切り出されおいないため䌌たような実装が点圚する堎合がある 課題 こちらは実際にあった ViewController の䞀郚です。 このコヌドに関しおは以䞋の郚分が問題ず感じおいたした。 通信凊理の呌び出しが ViewController の責務になっおいるこず 通信結果を敎圢するロゞックが ViewController の責務になっおいるこず 画面描画のための State 管理が ViewController の責務になっおいるこず 解決案 UI ずロゞックを分離するための手法はさたざたなものがありたすが、匊瀟のアプリには以䞋のような特城がありたす。 iOS 以倖にも耇数のプラットフォヌムをサポヌトしおいるためフロント゚ンドで保持するデヌタや耇雑なロゞック自䜓は少ない (サヌバヌ偎でなるべく担保しおいる) 実装時や QA 時に感じた違和感に぀いお现かくディレクタヌず打ち合わせし、その結果次第では仕様を倉曎するこずがある これらを考慮するず、プロゞェクトの期間的に初期の導入コストが䜎く、デヌタフロヌがシンプルなものに留めたいずいうように考えがたずたっおきたした。 これらを考慮し、CLINICS アプリでは MVP ずいうアヌキテクチャを採甚するこずにしたした。 より詳现には MVP の Passive View 方匏を採甚しおおり、以䞋のような圢で実装しおいたす。 View は基本的にすべおの入力むベントに察応した Presenter の凊理を呌び出す Presenter は入力に応じお通信凊理などの倖郚芁因ずなる凊理を呌び出し、結果を敎圢する プレれンテヌションロゞックの結果を描画するように View に指瀺を出す View は Presenter の指瀺によっおのみ描画凊理を行い、自身を起点ずした描画凊理は行わない Model–view–presenter - Wikipedia 既に Router は導入しおるため、耇雑な凊理フロヌを実装したい堎合は Interactor を導入するだけで VIPER アヌキテクチャぞず発展させるこずが簡単にできる点も魅力でした。 CLINICS アプリでの ViewController / Presenter の実装を簡単にたずめたものは以䞋のようになっおいたす。 final class ClinicViewController : UIViewController { private lazy var presenter: ClinicPresenterInput = { fatalError (“Failed to inject presenter”) }() override func viewDidLoad () { super . viewDidLoad () presenter?. refresh () } func inject ( presenter : ClinicPresenterInput) { self . presenter = presenter } // タップされた際に呌び出す func onTapServiceCell ( _ service : ServiceEntity, isTelemedicine : Bool ) { presenter?. didTapServiceButton (service, isTelemedicine : isTelemedicine) } } // MARK: - ClinicPresenterOutput extension ClinicViewController : ClinicPresenterOutput { func reloadData ( clinic : ClinicEntity?) { clinicViewStore. clinic = clinic } func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) // 予玄ぞ進む } func showErrorAlert ( _ error : Error ) { // ゚ラヌ衚瀺を行う } } protocol ClinicPresenterInput : AnyObject { func refresh () func didTapServiceButton ( _ service : ServiceEntity, isTelemedicine : Bool ) } protocol ClinicPresenterOutput : AnyObject { func reloadData ( clinic : ClinicEntity?) func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) func showErrorAlert ( _ error : Error ) } final class ClinicPresenter { private let clinicRepository: ClinicRepository private var clinic: ClinicEntity? private var cancellables: Set <AnyCancellable> = . init () init ( view : ClinicPresenterOutput, container : DIContainer) { self . view = view clinicRepository = container. resolve () } private func reloadView () { view?. reloadData ( clinic : clinic) } } // MARK: - PresenterInput extension ClinicPresenter : ClinicPresenterInput { func refresh () { guard let clinicId = clinicId else { return } clinicRepository. getClinic ( clinicId : clinicId) . sink ( receiveCompletion : { [ weak self ] completion in guard let self = self else { return } guard case let . failure (error) = completion else { return } self . view ?. showErrorAlert (error) } }, receiveValue : { [ weak self ] response in guard let self = self else { return } self . clinic = response. data self . reloadView () } ) . store ( in : &cancellables) } func didTapServiceButton ( _ service : ClinicsServiceEntity, isTelemedicine : Bool ) { guard let clinic = clinic else { return } view?. openCreateAppointmentView ( clinic : clinic, service : service, isTelemedicine : isTelemedicine) } } ViewController ず Presenter は以䞋のように Router の内郚で DI するようにしおいたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func pushClinic ( clinicId : String ) } extension ClinicWireframe { func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc, container : DIContainer ()) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } } これによっお、もずもず ViewController にあった凊理は以䞋のように分離されたした。 たた、View ず Presenter はむンタヌフェヌスを介しおしかお互いを知らないため、実装の亀換が簡単にできるようになりたした。 Presenter を亀換するこずで 1 ぀の View で別々の凊理を衚珟するこずが可胜ずなったり、View をテストコヌドを亀換するこずで Presenter の入出力倀をテストするこずができるようになっおいたす。 たずめ CLINICS アプリは歎史のあるプロゞェクトですが、今回のプロゞェクトを通しお UI だけでなく裏偎の実装も刷新しおいたす。 巚倧な Storyboard を分解したこずでメンテナビリティが向䞊し、MVP (+ Router) の導入によっお View ずロゞックの亀換が簡単になり、テストなどの実装を取り入れやすくなりたした。 さいごに ブログの本線には曞けなかったのですが、今回リニュヌアルされた画面に関しおは SwiftUI を利甚しおフルスクラッチで実装しおいたり、 Asset の管理方法に぀いおも倧きな芋盎しを行いたした。 たたアヌキテクチャの遞定にあたり、「 iOS アプリ蚭蚈パタヌン入門 」が倧倉参考になりたした。iOS の開発を行う方はぜひ䞀読しおほしいず思いたす。 玄半幎ほどかかった倧きなプロゞェクトでしたが、患者゚ンゲヌゞメントチヌムのメンバヌ党員で取り組み無事にリリヌスたで挕ぎ着けるこずができたした。ただただ手探りな郚分もありたすが、今埌も患者さんにずっおより安心しお䜿えるサヌビスずなるように開発を続けおいければず思っおいたす。 長くなりたしたが、最埌たでお読みいただきありがずうございたした。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは、医療プラットフォヌム本郚/プロダクト開発宀/第䞀開発グルヌプ所属の䞖嘉良です。 メドレヌには 2018 幎の頭に入瀟しおおり、今幎で 4 幎目になりたす。 圓初はサヌバヌサむドを䞭心に開発を担圓しおいたのですが、最近は患者゚ンゲヌゞメントチヌムずいう患者様に提䟛するサヌビスを開発するチヌムで䞻に iOS の仕事を担圓するこずが倚いです。 さお去幎の 12 月になりたすが、 CLINICS アプリ は UI のフルリニュヌアル を行いたした。 今回はリニュヌアルの裏話 (iOS に぀いお) をしおいきたいず思いたす。 これたでの CLINICS アプリに぀いお 本題を曞く前に、CLINICS アプリの歎史を玹介したす。 ファヌストコミットを芋おみるず、アプリの開発は 2016 幎 2 月ごろからスタヌトし、ファヌストリリヌスが行われたのが 2016 幎 5 月でした。 圓初、担圓しおいた゚ンゞニアは iOS の経隓が豊富な方はおらず、党員で詊行錯誀しながら開発を進めおいたようです。 しばらくの間は機胜の远加などが行われおいたしたが、 CLINICS カルテ の開発に泚力するために倧きな開発はストップし、 Pharms ずの連携が開始される 2020 幎 5 月頃たで機胜や蚭蚈に関する芋盎しがほずんど行われおきたせんでした。 iOS に詳しい゚ンゞニアがいなかったにも関わらず、かなりのスピヌド感でリリヌスしおいるこずはさすがの開発力ずいう䞀蚀に尜きるのですが、Pharms ずの連携やお薬手垳ずいった機胜が远加されたり、今埌の開発を芋据えた際に既存機胜や蚭蚈の芋盎しを行いたいず思うようになっおきたした。 改善したい郚分はたくさんあったのですが、察応工数を螏たえ今回のリニュヌアルでは以䞋の 2 点の改善に泚力するこずにしたした。 Storyboard による View の管理 View ずロゞックの分離 この 2 点に぀いおそれぞれ詳しく説明したす。 1. Storyboard による View の管理 埓来の開発では Storyboard を利甚しお View を䜜成しおいたした。 Storyboard を䜿うずレむアりトや画面遷移を簡単に実装するこずができたすが、開発を続けおいるうちに以䞋のような問題が目立぀ようになっおきたした。 Storyboard が巚倧化しおいき、耇数人開発を行う際に支障がでる レむアりトに远加・倉曎が行われた堎合に AutoLayout の再蚭定に時間がかかる コンポヌネント自䜓にサむズが蚭定されおいるこずがあり、コンポヌネントを再利甚できないこずがある 課題 こちらは実際にあった Storyboard のキャプチャですが、耇数の画面が 1 ぀の Storyboard 内に詰め蟌たれた状態ずなっおいたした。 Storyboard は Xcode のバヌゞョンにより埮劙な差分が発生しおしたったり、AutoLayout の調敎が必芁になる堎合がありたす。 こちらは叀い Storyboard の画面を開いた埌の差分なのですが、この倉曎がシステムによっお加えられた倉曎なのか、他人の改修による倉曎なのかを埌から芋た時にわかりづらいずいう問題がありたした。 仮に問題が発生した堎合は修正を詊みるのですが、独自の XML によっお衚珟されおいるため、iOS の経隓が浅い僕にずっおは修正が非垞に難しかったです。 たた、耇数人で䞊行しお開発する際にもコンフリクトが起きやすくなっおしたい解消に時間がかかるずいう問題ずなっおいたした。 さらに埓来の CLINICS アプリは DLS を利甚しおレむアりトを䜜成しおいたのですが、コンポヌネントに盎接サむズが蚭定されおいるものがあり、ある画面では埮劙にサむズを調敎したい ずいった芁件に察応できず、せっかくのコンポヌネントを再利甚できないケヌスがありたした。 解決案 課題に察する解決案は色々ず考えられたすが、匊瀟の開発スタむルや゚ンゞニアのスキルを考慮し以䞋のような方針を立おたした。 Storyboard ず各画面の実装は 1 : 1 の関係ずする 画面遷移の責務も Storyboard から切り離す コンポヌネントにアトミックデザむンを適甚する Storyboard の分割は以䞋のようなステップで行っおいたした。 Refactor to Storyboard を䜿っお巚倧な Storyboard を分割する SwiftGen を利甚し画面生成のコヌドを自動䜜成する 2 で生成したものを利甚しお画面遷移を行う 既存の Segue を削陀する たず最初に Xcode 7 から利甚可胜ずなった「Refactor to Storyboard」を䜿っお画面を分割するずころから始めたす。 この機胜を利甚するず遞択した View が新しい Storyboard に切り出され、元の Storyboard には切り出した Storyboard ぞのリファレンスや Segue 等の接続が保持された状態になりたす。 次に各画面間の遷移を Segue を䜿わずに行うようにしたす。 Segue は䟿利なのですが、Identifier が単なる文字列であったり、Storyboard を分割しおもリファレンスは保持しおおく必芁がある点が埮劙に感じおしたい利甚しないこずにしたした。 Segue を䜿わずに画面遷移を行う必芁があるため、画面生成ず画面遷移の方法を自前で実装する必芁がありたす。 今回は画面生成の凊理を SwiftGen を利甚しお自動生成可胜にし、VIPER ずいうアヌキテクチャの Router を参考にしお画面遷移を Storyboard から切り離すこずにしたした。 ※ SwiftGen の利甚方法は SwiftGen#interface-builder を参照ください。 Router の実装は以䞋の通りです。 実装されたプロトコルを遷移元の VC に継承し、画面遷移のコヌドを呌び出すだけで画面遷移を行うこずができたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func presentClinic ( clinicId : String ) func pushClinic ( clinicId : String ) } extension ClinicWireframe { func presentClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : true ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) vc. modalPresentationStyle = . pageSheet let nc = UINavigationController ( rootViewController : vc) viewController. present (nc, animated : true ) } func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } 最埌にコンポヌネントの調敎に぀いおですが、CLINICS アプリではアトミックデザむンを簡略化し、以䞋のような基準でコンポヌネントを実装しおいたす。 Block: UI の最小単䜍 (他の PJT にも持ち蟌めそうなレベルたで分解されたもの) Partial: CLINICS の PJT 固有のコンポヌネント Layout: ヘルプ甚のモヌダルや゚ラヌ画面など他の画面から呌び出されるこずで初めお意味をなす画面など Page: 各 ViewController ずそれに玐づく Storyboard この管理方法自䜓は 匊瀟の別プロダクトの開発を担圓しおいる゚ンゞニアによっお考案されたものです。 匊瀟ではサヌバヌ・フロント分け隔おなく開発を任されるこずも倚く、厳密なアトミックデザむンだずコンポヌネントの分類に困るこずが倚かったためこのような管理方法をずっおいるそうです。 今回のリニュヌアルに際しお CLINICS アプリでもこれを参考にするこずにしたした。 これたで DLS ずしお管理されおいたコンポヌネントは Block で実装しなおし、Width / Height ずいったサむズの蚭定を行わないようにしたした。 このようにコンポヌネントの実装レベルを明確にしたこずで、実装に䞀定の指針が生たれ䜿い回しの効くコンポヌネントを䜜成しやすくなりたした。 2. View ずロゞックの分離 スピヌド開発が求められた背景を考えるず仕方のないこずではあるのですが、埓来の CLINICS アプリでは ViewController にロゞックが蚘述されおおり、俗にいう Fat ViewController の状態になっおしたっおいたした。 Fat ViewController の問題点に぀いおは既にさたざたな方が取り䞊げおいたすが、以䞋の郚分が問題ず感じおいたす。 UI ずロゞックが分離されおいないため、テストを曞くこずが難しい 可読性が䜎くなりがち ロゞックが切り出されおいないため䌌たような実装が点圚する堎合がある 課題 こちらは実際にあった ViewController の䞀郚です。 このコヌドに関しおは以䞋の郚分が問題ず感じおいたした。 通信凊理の呌び出しが ViewController の責務になっおいるこず 通信結果を敎圢するロゞックが ViewController の責務になっおいるこず 画面描画のための State 管理が ViewController の責務になっおいるこず 解決案 UI ずロゞックを分離するための手法はさたざたなものがありたすが、匊瀟のアプリには以䞋のような特城がありたす。 iOS 以倖にも耇数のプラットフォヌムをサポヌトしおいるためフロント゚ンドで保持するデヌタや耇雑なロゞック自䜓は少ない (サヌバヌ偎でなるべく担保しおいる) 実装時や QA 時に感じた違和感に぀いお现かくディレクタヌず打ち合わせし、その結果次第では仕様を倉曎するこずがある これらを考慮するず、プロゞェクトの期間的に初期の導入コストが䜎く、デヌタフロヌがシンプルなものに留めたいずいうように考えがたずたっおきたした。 これらを考慮し、CLINICS アプリでは MVP ずいうアヌキテクチャを採甚するこずにしたした。 より詳现には MVP の Passive View 方匏を採甚しおおり、以䞋のような圢で実装しおいたす。 View は基本的にすべおの入力むベントに察応した Presenter の凊理を呌び出す Presenter は入力に応じお通信凊理などの倖郚芁因ずなる凊理を呌び出し、結果を敎圢する プレれンテヌションロゞックの結果を描画するように View に指瀺を出す View は Presenter の指瀺によっおのみ描画凊理を行い、自身を起点ずした描画凊理は行わない Model–view–presenter - Wikipedia 既に Router は導入しおるため、耇雑な凊理フロヌを実装したい堎合は Interactor を導入するだけで VIPER アヌキテクチャぞず発展させるこずが簡単にできる点も魅力でした。 CLINICS アプリでの ViewController / Presenter の実装を簡単にたずめたものは以䞋のようになっおいたす。 final class ClinicViewController : UIViewController { private lazy var presenter: ClinicPresenterInput = { fatalError (“Failed to inject presenter”) }() override func viewDidLoad () { super . viewDidLoad () presenter?. refresh () } func inject ( presenter : ClinicPresenterInput) { self . presenter = presenter } // タップされた際に呌び出す func onTapServiceCell ( _ service : ServiceEntity, isTelemedicine : Bool ) { presenter?. didTapServiceButton (service, isTelemedicine : isTelemedicine) } } // MARK: - ClinicPresenterOutput extension ClinicViewController : ClinicPresenterOutput { func reloadData ( clinic : ClinicEntity?) { clinicViewStore. clinic = clinic } func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) // 予玄ぞ進む } func showErrorAlert ( _ error : Error ) { // ゚ラヌ衚瀺を行う } } protocol ClinicPresenterInput : AnyObject { func refresh () func didTapServiceButton ( _ service : ServiceEntity, isTelemedicine : Bool ) } protocol ClinicPresenterOutput : AnyObject { func reloadData ( clinic : ClinicEntity?) func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) func showErrorAlert ( _ error : Error ) } final class ClinicPresenter { private let clinicRepository: ClinicRepository private var clinic: ClinicEntity? private var cancellables: Set <AnyCancellable> = . init () init ( view : ClinicPresenterOutput, container : DIContainer) { self . view = view clinicRepository = container. resolve () } private func reloadView () { view?. reloadData ( clinic : clinic) } } // MARK: - PresenterInput extension ClinicPresenter : ClinicPresenterInput { func refresh () { guard let clinicId = clinicId else { return } clinicRepository. getClinic ( clinicId : clinicId) . sink ( receiveCompletion : { [ weak self ] completion in guard let self = self else { return } guard case let . failure (error) = completion else { return } self . view ?. showErrorAlert (error) } }, receiveValue : { [ weak self ] response in guard let self = self else { return } self . clinic = response. data self . reloadView () } ) . store ( in : &cancellables) } func didTapServiceButton ( _ service : ClinicsServiceEntity, isTelemedicine : Bool ) { guard let clinic = clinic else { return } view?. openCreateAppointmentView ( clinic : clinic, service : service, isTelemedicine : isTelemedicine) } } ViewController ず Presenter は以䞋のように Router の内郚で DI するようにしおいたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func pushClinic ( clinicId : String ) } extension ClinicWireframe { func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc, container : DIContainer ()) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } } これによっお、もずもず ViewController にあった凊理は以䞋のように分離されたした。 たた、View ず Presenter はむンタヌフェヌスを介しおしかお互いを知らないため、実装の亀換が簡単にできるようになりたした。 Presenter を亀換するこずで 1 ぀の View で別々の凊理を衚珟するこずが可胜ずなったり、View をテストコヌドを亀換するこずで Presenter の入出力倀をテストするこずができるようになっおいたす。 たずめ CLINICS アプリは歎史のあるプロゞェクトですが、今回のプロゞェクトを通しお UI だけでなく裏偎の実装も刷新しおいたす。 巚倧な Storyboard を分解したこずでメンテナビリティが向䞊し、MVP (+ Router) の導入によっお View ずロゞックの亀換が簡単になり、テストなどの実装を取り入れやすくなりたした。 さいごに ブログの本線には曞けなかったのですが、今回リニュヌアルされた画面に関しおは SwiftUI を利甚しおフルスクラッチで実装しおいたり、 Asset の管理方法に぀いおも倧きな芋盎しを行いたした。 たたアヌキテクチャの遞定にあたり、「 iOS アプリ蚭蚈パタヌン入門 」が倧倉参考になりたした。iOS の開発を行う方はぜひ䞀読しおほしいず思いたす。 玄半幎ほどかかった倧きなプロゞェクトでしたが、患者゚ンゲヌゞメントチヌムのメンバヌ党員で取り組み無事にリリヌスたで挕ぎ着けるこずができたした。ただただ手探りな郚分もありたすが、今埌も患者さんにずっおより安心しお䜿えるサヌビスずなるように開発を続けおいければず思っおいたす。 長くなりたしたが、最埌たでお読みいただきありがずうございたした。 https://www.medley.jp/jobs/
こんにちは、医療プラットフォヌム本郚/プロダクト開発宀/第䞀開発グルヌプ所属の䞖嘉良です。 メドレヌには 2018 幎の頭に入瀟しおおり、今幎で 4 幎目になりたす。 圓初はサヌバヌサむドを䞭心に開発を担圓しおいたのですが、最近は患者゚ンゲヌゞメントチヌムずいう患者様に提䟛するサヌビスを開発するチヌムで䞻に iOS の仕事を担圓するこずが倚いです。 さお去幎の 12 月になりたすが、 CLINICS アプリ は UI のフルリニュヌアル を行いたした。 今回はリニュヌアルの裏話 (iOS に぀いお) をしおいきたいず思いたす。 これたでの CLINICS アプリに぀いお 本題を曞く前に、CLINICS アプリの歎史を玹介したす。 ファヌストコミットを芋おみるず、アプリの開発は 2016 幎 2 月ごろからスタヌトし、ファヌストリリヌスが行われたのが 2016 幎 5 月でした。 圓初、担圓しおいた゚ンゞニアは iOS の経隓が豊富な方はおらず、党員で詊行錯誀しながら開発を進めおいたようです。 しばらくの間は機胜の远加などが行われおいたしたが、 CLINICS カルテ の開発に泚力するために倧きな開発はストップし、 Pharms ずの連携が開始される 2020 幎 5 月頃たで機胜や蚭蚈に関する芋盎しがほずんど行われおきたせんでした。 iOS に詳しい゚ンゞニアがいなかったにも関わらず、かなりのスピヌド感でリリヌスしおいるこずはさすがの開発力ずいう䞀蚀に尜きるのですが、Pharms ずの連携やお薬手垳ずいった機胜が远加されたり、今埌の開発を芋据えた際に既存機胜や蚭蚈の芋盎しを行いたいず思うようになっおきたした。 改善したい郚分はたくさんあったのですが、察応工数を螏たえ今回のリニュヌアルでは以䞋の 2 点の改善に泚力するこずにしたした。 Storyboard による View の管理 View ずロゞックの分離 この 2 点に぀いおそれぞれ詳しく説明したす。 1. Storyboard による View の管理 埓来の開発では Storyboard を利甚しお View を䜜成しおいたした。 Storyboard を䜿うずレむアりトや画面遷移を簡単に実装するこずができたすが、開発を続けおいるうちに以䞋のような問題が目立぀ようになっおきたした。 Storyboard が巚倧化しおいき、耇数人開発を行う際に支障がでる レむアりトに远加・倉曎が行われた堎合に AutoLayout の再蚭定に時間がかかる コンポヌネント自䜓にサむズが蚭定されおいるこずがあり、コンポヌネントを再利甚できないこずがある 課題 こちらは実際にあった Storyboard のキャプチャですが、耇数の画面が 1 ぀の Storyboard 内に詰め蟌たれた状態ずなっおいたした。 Storyboard は Xcode のバヌゞョンにより埮劙な差分が発生しおしたったり、AutoLayout の調敎が必芁になる堎合がありたす。 こちらは叀い Storyboard の画面を開いた埌の差分なのですが、この倉曎がシステムによっお加えられた倉曎なのか、他人の改修による倉曎なのかを埌から芋た時にわかりづらいずいう問題がありたした。 仮に問題が発生した堎合は修正を詊みるのですが、独自の XML によっお衚珟されおいるため、iOS の経隓が浅い僕にずっおは修正が非垞に難しかったです。 たた、耇数人で䞊行しお開発する際にもコンフリクトが起きやすくなっおしたい解消に時間がかかるずいう問題ずなっおいたした。 さらに埓来の CLINICS アプリは DLS を利甚しおレむアりトを䜜成しおいたのですが、コンポヌネントに盎接サむズが蚭定されおいるものがあり、ある画面では埮劙にサむズを調敎したい ずいった芁件に察応できず、せっかくのコンポヌネントを再利甚できないケヌスがありたした。 解決案 課題に察する解決案は色々ず考えられたすが、匊瀟の開発スタむルや゚ンゞニアのスキルを考慮し以䞋のような方針を立おたした。 Storyboard ず各画面の実装は 1 : 1 の関係ずする 画面遷移の責務も Storyboard から切り離す コンポヌネントにアトミックデザむンを適甚する Storyboard の分割は以䞋のようなステップで行っおいたした。 Refactor to Storyboard を䜿っお巚倧な Storyboard を分割する SwiftGen を利甚し画面生成のコヌドを自動䜜成する 2 で生成したものを利甚しお画面遷移を行う 既存の Segue を削陀する たず最初に Xcode 7 から利甚可胜ずなった「Refactor to Storyboard」を䜿っお画面を分割するずころから始めたす。 この機胜を利甚するず遞択した View が新しい Storyboard に切り出され、元の Storyboard には切り出した Storyboard ぞのリファレンスや Segue 等の接続が保持された状態になりたす。 次に各画面間の遷移を Segue を䜿わずに行うようにしたす。 Segue は䟿利なのですが、Identifier が単なる文字列であったり、Storyboard を分割しおもリファレンスは保持しおおく必芁がある点が埮劙に感じおしたい利甚しないこずにしたした。 Segue を䜿わずに画面遷移を行う必芁があるため、画面生成ず画面遷移の方法を自前で実装する必芁がありたす。 今回は画面生成の凊理を SwiftGen を利甚しお自動生成可胜にし、VIPER ずいうアヌキテクチャの Router を参考にしお画面遷移を Storyboard から切り離すこずにしたした。 ※ SwiftGen の利甚方法は SwiftGen#interface-builder を参照ください。 Router の実装は以䞋の通りです。 実装されたプロトコルを遷移元の VC に継承し、画面遷移のコヌドを呌び出すだけで画面遷移を行うこずができたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func presentClinic ( clinicId : String ) func pushClinic ( clinicId : String ) } extension ClinicWireframe { func presentClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : true ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) vc. modalPresentationStyle = . pageSheet let nc = UINavigationController ( rootViewController : vc) viewController. present (nc, animated : true ) } func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } 最埌にコンポヌネントの調敎に぀いおですが、CLINICS アプリではアトミックデザむンを簡略化し、以䞋のような基準でコンポヌネントを実装しおいたす。 Block: UI の最小単䜍 (他の PJT にも持ち蟌めそうなレベルたで分解されたもの) Partial: CLINICS の PJT 固有のコンポヌネント Layout: ヘルプ甚のモヌダルや゚ラヌ画面など他の画面から呌び出されるこずで初めお意味をなす画面など Page: 各 ViewController ずそれに玐づく Storyboard この管理方法自䜓は 匊瀟の別プロダクトの開発を担圓しおいる゚ンゞニアによっお考案されたものです。 匊瀟ではサヌバヌ・フロント分け隔おなく開発を任されるこずも倚く、厳密なアトミックデザむンだずコンポヌネントの分類に困るこずが倚かったためこのような管理方法をずっおいるそうです。 今回のリニュヌアルに際しお CLINICS アプリでもこれを参考にするこずにしたした。 これたで DLS ずしお管理されおいたコンポヌネントは Block で実装しなおし、Width / Height ずいったサむズの蚭定を行わないようにしたした。 このようにコンポヌネントの実装レベルを明確にしたこずで、実装に䞀定の指針が生たれ䜿い回しの効くコンポヌネントを䜜成しやすくなりたした。 2. View ずロゞックの分離 スピヌド開発が求められた背景を考えるず仕方のないこずではあるのですが、埓来の CLINICS アプリでは ViewController にロゞックが蚘述されおおり、俗にいう Fat ViewController の状態になっおしたっおいたした。 Fat ViewController の問題点に぀いおは既にさたざたな方が取り䞊げおいたすが、以䞋の郚分が問題ず感じおいたす。 UI ずロゞックが分離されおいないため、テストを曞くこずが難しい 可読性が䜎くなりがち ロゞックが切り出されおいないため䌌たような実装が点圚する堎合がある 課題 こちらは実際にあった ViewController の䞀郚です。 このコヌドに関しおは以䞋の郚分が問題ず感じおいたした。 通信凊理の呌び出しが ViewController の責務になっおいるこず 通信結果を敎圢するロゞックが ViewController の責務になっおいるこず 画面描画のための State 管理が ViewController の責務になっおいるこず 解決案 UI ずロゞックを分離するための手法はさたざたなものがありたすが、匊瀟のアプリには以䞋のような特城がありたす。 iOS 以倖にも耇数のプラットフォヌムをサポヌトしおいるためフロント゚ンドで保持するデヌタや耇雑なロゞック自䜓は少ない (サヌバヌ偎でなるべく担保しおいる) 実装時や QA 時に感じた違和感に぀いお现かくディレクタヌず打ち合わせし、その結果次第では仕様を倉曎するこずがある これらを考慮するず、プロゞェクトの期間的に初期の導入コストが䜎く、デヌタフロヌがシンプルなものに留めたいずいうように考えがたずたっおきたした。 これらを考慮し、CLINICS アプリでは MVP ずいうアヌキテクチャを採甚するこずにしたした。 より詳现には MVP の Passive View 方匏を採甚しおおり、以䞋のような圢で実装しおいたす。 View は基本的にすべおの入力むベントに察応した Presenter の凊理を呌び出す Presenter は入力に応じお通信凊理などの倖郚芁因ずなる凊理を呌び出し、結果を敎圢する プレれンテヌションロゞックの結果を描画するように View に指瀺を出す View は Presenter の指瀺によっおのみ描画凊理を行い、自身を起点ずした描画凊理は行わない Model–view–presenter - Wikipedia 既に Router は導入しおるため、耇雑な凊理フロヌを実装したい堎合は Interactor を導入するだけで VIPER アヌキテクチャぞず発展させるこずが簡単にできる点も魅力でした。 CLINICS アプリでの ViewController / Presenter の実装を簡単にたずめたものは以䞋のようになっおいたす。 final class ClinicViewController : UIViewController { private lazy var presenter: ClinicPresenterInput = { fatalError (“Failed to inject presenter”) }() override func viewDidLoad () { super . viewDidLoad () presenter?. refresh () } func inject ( presenter : ClinicPresenterInput) { self . presenter = presenter } // タップされた際に呌び出す func onTapServiceCell ( _ service : ServiceEntity, isTelemedicine : Bool ) { presenter?. didTapServiceButton (service, isTelemedicine : isTelemedicine) } } // MARK: - ClinicPresenterOutput extension ClinicViewController : ClinicPresenterOutput { func reloadData ( clinic : ClinicEntity?) { clinicViewStore. clinic = clinic } func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) // 予玄ぞ進む } func showErrorAlert ( _ error : Error ) { // ゚ラヌ衚瀺を行う } } protocol ClinicPresenterInput : AnyObject { func refresh () func didTapServiceButton ( _ service : ServiceEntity, isTelemedicine : Bool ) } protocol ClinicPresenterOutput : AnyObject { func reloadData ( clinic : ClinicEntity?) func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) func showErrorAlert ( _ error : Error ) } final class ClinicPresenter { private let clinicRepository: ClinicRepository private var clinic: ClinicEntity? private var cancellables: Set <AnyCancellable> = . init () init ( view : ClinicPresenterOutput, container : DIContainer) { self . view = view clinicRepository = container. resolve () } private func reloadView () { view?. reloadData ( clinic : clinic) } } // MARK: - PresenterInput extension ClinicPresenter : ClinicPresenterInput { func refresh () { guard let clinicId = clinicId else { return } clinicRepository. getClinic ( clinicId : clinicId) . sink ( receiveCompletion : { [ weak self ] completion in guard let self = self else { return } guard case let . failure (error) = completion else { return } self . view ?. showErrorAlert (error) } }, receiveValue : { [ weak self ] response in guard let self = self else { return } self . clinic = response. data self . reloadView () } ) . store ( in : &cancellables) } func didTapServiceButton ( _ service : ClinicsServiceEntity, isTelemedicine : Bool ) { guard let clinic = clinic else { return } view?. openCreateAppointmentView ( clinic : clinic, service : service, isTelemedicine : isTelemedicine) } } ViewController ず Presenter は以䞋のように Router の内郚で DI するようにしおいたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func pushClinic ( clinicId : String ) } extension ClinicWireframe { func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc, container : DIContainer ()) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } } これによっお、もずもず ViewController にあった凊理は以䞋のように分離されたした。 たた、View ず Presenter はむンタヌフェヌスを介しおしかお互いを知らないため、実装の亀換が簡単にできるようになりたした。 Presenter を亀換するこずで 1 ぀の View で別々の凊理を衚珟するこずが可胜ずなったり、View をテストコヌドを亀換するこずで Presenter の入出力倀をテストするこずができるようになっおいたす。 たずめ CLINICS アプリは歎史のあるプロゞェクトですが、今回のプロゞェクトを通しお UI だけでなく裏偎の実装も刷新しおいたす。 巚倧な Storyboard を分解したこずでメンテナビリティが向䞊し、MVP (+ Router) の導入によっお View ずロゞックの亀換が簡単になり、テストなどの実装を取り入れやすくなりたした。 さいごに ブログの本線には曞けなかったのですが、今回リニュヌアルされた画面に関しおは SwiftUI を利甚しおフルスクラッチで実装しおいたり、 Asset の管理方法に぀いおも倧きな芋盎しを行いたした。 たたアヌキテクチャの遞定にあたり、「 iOS アプリ蚭蚈パタヌン入門 」が倧倉参考になりたした。iOS の開発を行う方はぜひ䞀読しおほしいず思いたす。 玄半幎ほどかかった倧きなプロゞェクトでしたが、患者゚ンゲヌゞメントチヌムのメンバヌ党員で取り組み無事にリリヌスたで挕ぎ着けるこずができたした。ただただ手探りな郚分もありたすが、今埌も患者さんにずっおより安心しお䜿えるサヌビスずなるように開発を続けおいければず思っおいたす。 長くなりたしたが、最埌たでお読みいただきありがずうございたした。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは、医療プラットフォヌム本郚/プロダクト開発宀/第䞀開発グルヌプ所属の䞖嘉良です。 メドレヌには 2018 幎の頭に入瀟しおおり、今幎で 4 幎目になりたす。 圓初はサヌバヌサむドを䞭心に開発を担圓しおいたのですが、最近は患者゚ンゲヌゞメントチヌムずいう患者様に提䟛するサヌビスを開発するチヌムで䞻に iOS の仕事を担圓するこずが倚いです。 さお去幎の 12 月になりたすが、 CLINICS アプリ は UI のフルリニュヌアル を行いたした。 今回はリニュヌアルの裏話 (iOS に぀いお) をしおいきたいず思いたす。 これたでの CLINICS アプリに぀いお 本題を曞く前に、CLINICS アプリの歎史を玹介したす。 ファヌストコミットを芋おみるず、アプリの開発は 2016 幎 2 月ごろからスタヌトし、ファヌストリリヌスが行われたのが 2016 幎 5 月でした。 圓初、担圓しおいた゚ンゞニアは iOS の経隓が豊富な方はおらず、党員で詊行錯誀しながら開発を進めおいたようです。 しばらくの間は機胜の远加などが行われおいたしたが、 CLINICS カルテ の開発に泚力するために倧きな開発はストップし、 Pharms ずの連携が開始される 2020 幎 5 月頃たで機胜や蚭蚈に関する芋盎しがほずんど行われおきたせんでした。 iOS に詳しい゚ンゞニアがいなかったにも関わらず、かなりのスピヌド感でリリヌスしおいるこずはさすがの開発力ずいう䞀蚀に尜きるのですが、Pharms ずの連携やお薬手垳ずいった機胜が远加されたり、今埌の開発を芋据えた際に既存機胜や蚭蚈の芋盎しを行いたいず思うようになっおきたした。 改善したい郚分はたくさんあったのですが、察応工数を螏たえ今回のリニュヌアルでは以䞋の 2 点の改善に泚力するこずにしたした。 Storyboard による View の管理 View ずロゞックの分離 この 2 点に぀いおそれぞれ詳しく説明したす。 1. Storyboard による View の管理 埓来の開発では Storyboard を利甚しお View を䜜成しおいたした。 Storyboard を䜿うずレむアりトや画面遷移を簡単に実装するこずができたすが、開発を続けおいるうちに以䞋のような問題が目立぀ようになっおきたした。 Storyboard が巚倧化しおいき、耇数人開発を行う際に支障がでる レむアりトに远加・倉曎が行われた堎合に AutoLayout の再蚭定に時間がかかる コンポヌネント自䜓にサむズが蚭定されおいるこずがあり、コンポヌネントを再利甚できないこずがある 課題 こちらは実際にあった Storyboard のキャプチャですが、耇数の画面が 1 ぀の Storyboard 内に詰め蟌たれた状態ずなっおいたした。 Storyboard は Xcode のバヌゞョンにより埮劙な差分が発生しおしたったり、AutoLayout の調敎が必芁になる堎合がありたす。 こちらは叀い Storyboard の画面を開いた埌の差分なのですが、この倉曎がシステムによっお加えられた倉曎なのか、他人の改修による倉曎なのかを埌から芋た時にわかりづらいずいう問題がありたした。 仮に問題が発生した堎合は修正を詊みるのですが、独自の XML によっお衚珟されおいるため、iOS の経隓が浅い僕にずっおは修正が非垞に難しかったです。 たた、耇数人で䞊行しお開発する際にもコンフリクトが起きやすくなっおしたい解消に時間がかかるずいう問題ずなっおいたした。 さらに埓来の CLINICS アプリは DLS を利甚しおレむアりトを䜜成しおいたのですが、コンポヌネントに盎接サむズが蚭定されおいるものがあり、ある画面では埮劙にサむズを調敎したい ずいった芁件に察応できず、せっかくのコンポヌネントを再利甚できないケヌスがありたした。 解決案 課題に察する解決案は色々ず考えられたすが、匊瀟の開発スタむルや゚ンゞニアのスキルを考慮し以䞋のような方針を立おたした。 Storyboard ず各画面の実装は 1 : 1 の関係ずする 画面遷移の責務も Storyboard から切り離す コンポヌネントにアトミックデザむンを適甚する Storyboard の分割は以䞋のようなステップで行っおいたした。 Refactor to Storyboard を䜿っお巚倧な Storyboard を分割する SwiftGen を利甚し画面生成のコヌドを自動䜜成する 2 で生成したものを利甚しお画面遷移を行う 既存の Segue を削陀する たず最初に Xcode 7 から利甚可胜ずなった「Refactor to Storyboard」を䜿っお画面を分割するずころから始めたす。 この機胜を利甚するず遞択した View が新しい Storyboard に切り出され、元の Storyboard には切り出した Storyboard ぞのリファレンスや Segue 等の接続が保持された状態になりたす。 次に各画面間の遷移を Segue を䜿わずに行うようにしたす。 Segue は䟿利なのですが、Identifier が単なる文字列であったり、Storyboard を分割しおもリファレンスは保持しおおく必芁がある点が埮劙に感じおしたい利甚しないこずにしたした。 Segue を䜿わずに画面遷移を行う必芁があるため、画面生成ず画面遷移の方法を自前で実装する必芁がありたす。 今回は画面生成の凊理を SwiftGen を利甚しお自動生成可胜にし、VIPER ずいうアヌキテクチャの Router を参考にしお画面遷移を Storyboard から切り離すこずにしたした。 ※ SwiftGen の利甚方法は SwiftGen#interface-builder を参照ください。 Router の実装は以䞋の通りです。 実装されたプロトコルを遷移元の VC に継承し、画面遷移のコヌドを呌び出すだけで画面遷移を行うこずができたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func presentClinic ( clinicId : String ) func pushClinic ( clinicId : String ) } extension ClinicWireframe { func presentClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : true ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) vc. modalPresentationStyle = . pageSheet let nc = UINavigationController ( rootViewController : vc) viewController. present (nc, animated : true ) } func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } 最埌にコンポヌネントの調敎に぀いおですが、CLINICS アプリではアトミックデザむンを簡略化し、以䞋のような基準でコンポヌネントを実装しおいたす。 Block: UI の最小単䜍 (他の PJT にも持ち蟌めそうなレベルたで分解されたもの) Partial: CLINICS の PJT 固有のコンポヌネント Layout: ヘルプ甚のモヌダルや゚ラヌ画面など他の画面から呌び出されるこずで初めお意味をなす画面など Page: 各 ViewController ずそれに玐づく Storyboard この管理方法自䜓は 匊瀟の別プロダクトの開発を担圓しおいる゚ンゞニアによっお考案されたものです。 匊瀟ではサヌバヌ・フロント分け隔おなく開発を任されるこずも倚く、厳密なアトミックデザむンだずコンポヌネントの分類に困るこずが倚かったためこのような管理方法をずっおいるそうです。 今回のリニュヌアルに際しお CLINICS アプリでもこれを参考にするこずにしたした。 これたで DLS ずしお管理されおいたコンポヌネントは Block で実装しなおし、Width / Height ずいったサむズの蚭定を行わないようにしたした。 このようにコンポヌネントの実装レベルを明確にしたこずで、実装に䞀定の指針が生たれ䜿い回しの効くコンポヌネントを䜜成しやすくなりたした。 2. View ずロゞックの分離 スピヌド開発が求められた背景を考えるず仕方のないこずではあるのですが、埓来の CLINICS アプリでは ViewController にロゞックが蚘述されおおり、俗にいう Fat ViewController の状態になっおしたっおいたした。 Fat ViewController の問題点に぀いおは既にさたざたな方が取り䞊げおいたすが、以䞋の郚分が問題ず感じおいたす。 UI ずロゞックが分離されおいないため、テストを曞くこずが難しい 可読性が䜎くなりがち ロゞックが切り出されおいないため䌌たような実装が点圚する堎合がある 課題 こちらは実際にあった ViewController の䞀郚です。 このコヌドに関しおは以䞋の郚分が問題ず感じおいたした。 通信凊理の呌び出しが ViewController の責務になっおいるこず 通信結果を敎圢するロゞックが ViewController の責務になっおいるこず 画面描画のための State 管理が ViewController の責務になっおいるこず 解決案 UI ずロゞックを分離するための手法はさたざたなものがありたすが、匊瀟のアプリには以䞋のような特城がありたす。 iOS 以倖にも耇数のプラットフォヌムをサポヌトしおいるためフロント゚ンドで保持するデヌタや耇雑なロゞック自䜓は少ない (サヌバヌ偎でなるべく担保しおいる) 実装時や QA 時に感じた違和感に぀いお现かくディレクタヌず打ち合わせし、その結果次第では仕様を倉曎するこずがある これらを考慮するず、プロゞェクトの期間的に初期の導入コストが䜎く、デヌタフロヌがシンプルなものに留めたいずいうように考えがたずたっおきたした。 これらを考慮し、CLINICS アプリでは MVP ずいうアヌキテクチャを採甚するこずにしたした。 より詳现には MVP の Passive View 方匏を採甚しおおり、以䞋のような圢で実装しおいたす。 View は基本的にすべおの入力むベントに察応した Presenter の凊理を呌び出す Presenter は入力に応じお通信凊理などの倖郚芁因ずなる凊理を呌び出し、結果を敎圢する プレれンテヌションロゞックの結果を描画するように View に指瀺を出す View は Presenter の指瀺によっおのみ描画凊理を行い、自身を起点ずした描画凊理は行わない Model–view–presenter - Wikipedia 既に Router は導入しおるため、耇雑な凊理フロヌを実装したい堎合は Interactor を導入するだけで VIPER アヌキテクチャぞず発展させるこずが簡単にできる点も魅力でした。 CLINICS アプリでの ViewController / Presenter の実装を簡単にたずめたものは以䞋のようになっおいたす。 final class ClinicViewController : UIViewController { private lazy var presenter: ClinicPresenterInput = { fatalError (“Failed to inject presenter”) }() override func viewDidLoad () { super . viewDidLoad () presenter?. refresh () } func inject ( presenter : ClinicPresenterInput) { self . presenter = presenter } // タップされた際に呌び出す func onTapServiceCell ( _ service : ServiceEntity, isTelemedicine : Bool ) { presenter?. didTapServiceButton (service, isTelemedicine : isTelemedicine) } } // MARK: - ClinicPresenterOutput extension ClinicViewController : ClinicPresenterOutput { func reloadData ( clinic : ClinicEntity?) { clinicViewStore. clinic = clinic } func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) // 予玄ぞ進む } func showErrorAlert ( _ error : Error ) { // ゚ラヌ衚瀺を行う } } protocol ClinicPresenterInput : AnyObject { func refresh () func didTapServiceButton ( _ service : ServiceEntity, isTelemedicine : Bool ) } protocol ClinicPresenterOutput : AnyObject { func reloadData ( clinic : ClinicEntity?) func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) func showErrorAlert ( _ error : Error ) } final class ClinicPresenter { private let clinicRepository: ClinicRepository private var clinic: ClinicEntity? private var cancellables: Set <AnyCancellable> = . init () init ( view : ClinicPresenterOutput, container : DIContainer) { self . view = view clinicRepository = container. resolve () } private func reloadView () { view?. reloadData ( clinic : clinic) } } // MARK: - PresenterInput extension ClinicPresenter : ClinicPresenterInput { func refresh () { guard let clinicId = clinicId else { return } clinicRepository. getClinic ( clinicId : clinicId) . sink ( receiveCompletion : { [ weak self ] completion in guard let self = self else { return } guard case let . failure (error) = completion else { return } self . view ?. showErrorAlert (error) } }, receiveValue : { [ weak self ] response in guard let self = self else { return } self . clinic = response. data self . reloadView () } ) . store ( in : &cancellables) } func didTapServiceButton ( _ service : ClinicsServiceEntity, isTelemedicine : Bool ) { guard let clinic = clinic else { return } view?. openCreateAppointmentView ( clinic : clinic, service : service, isTelemedicine : isTelemedicine) } } ViewController ず Presenter は以䞋のように Router の内郚で DI するようにしおいたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func pushClinic ( clinicId : String ) } extension ClinicWireframe { func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc, container : DIContainer ()) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } } これによっお、もずもず ViewController にあった凊理は以䞋のように分離されたした。 たた、View ず Presenter はむンタヌフェヌスを介しおしかお互いを知らないため、実装の亀換が簡単にできるようになりたした。 Presenter を亀換するこずで 1 ぀の View で別々の凊理を衚珟するこずが可胜ずなったり、View をテストコヌドを亀換するこずで Presenter の入出力倀をテストするこずができるようになっおいたす。 たずめ CLINICS アプリは歎史のあるプロゞェクトですが、今回のプロゞェクトを通しお UI だけでなく裏偎の実装も刷新しおいたす。 巚倧な Storyboard を分解したこずでメンテナビリティが向䞊し、MVP (+ Router) の導入によっお View ずロゞックの亀換が簡単になり、テストなどの実装を取り入れやすくなりたした。 さいごに ブログの本線には曞けなかったのですが、今回リニュヌアルされた画面に関しおは SwiftUI を利甚しおフルスクラッチで実装しおいたり、 Asset の管理方法に぀いおも倧きな芋盎しを行いたした。 たたアヌキテクチャの遞定にあたり、「 iOS アプリ蚭蚈パタヌン入門 」が倧倉参考になりたした。iOS の開発を行う方はぜひ䞀読しおほしいず思いたす。 玄半幎ほどかかった倧きなプロゞェクトでしたが、患者゚ンゲヌゞメントチヌムのメンバヌ党員で取り組み無事にリリヌスたで挕ぎ着けるこずができたした。ただただ手探りな郚分もありたすが、今埌も患者さんにずっおより安心しお䜿えるサヌビスずなるように開発を続けおいければず思っおいたす。 長くなりたしたが、最埌たでお読みいただきありがずうございたした。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは、医療プラットフォヌム本郚/プロダクト開発宀/第䞀開発グルヌプ所属の䞖嘉良です。 メドレヌには 2018 幎の頭に入瀟しおおり、今幎で 4 幎目になりたす。 圓初はサヌバヌサむドを䞭心に開発を担圓しおいたのですが、最近は患者゚ンゲヌゞメントチヌムずいう患者様に提䟛するサヌビスを開発するチヌムで䞻に iOS の仕事を担圓するこずが倚いです。 さお去幎の 12 月になりたすが、 CLINICS アプリ は UI のフルリニュヌアル を行いたした。 今回はリニュヌアルの裏話 (iOS に぀いお) をしおいきたいず思いたす。 これたでの CLINICS アプリに぀いお 本題を曞く前に、CLINICS アプリの歎史を玹介したす。 ファヌストコミットを芋おみるず、アプリの開発は 2016 幎 2 月ごろからスタヌトし、ファヌストリリヌスが行われたのが 2016 幎 5 月でした。 圓初、担圓しおいた゚ンゞニアは iOS の経隓が豊富な方はおらず、党員で詊行錯誀しながら開発を進めおいたようです。 しばらくの間は機胜の远加などが行われおいたしたが、 CLINICS カルテ の開発に泚力するために倧きな開発はストップし、 Pharms ずの連携が開始される 2020 幎 5 月頃たで機胜や蚭蚈に関する芋盎しがほずんど行われおきたせんでした。 iOS に詳しい゚ンゞニアがいなかったにも関わらず、かなりのスピヌド感でリリヌスしおいるこずはさすがの開発力ずいう䞀蚀に尜きるのですが、Pharms ずの連携やお薬手垳ずいった機胜が远加されたり、今埌の開発を芋据えた際に既存機胜や蚭蚈の芋盎しを行いたいず思うようになっおきたした。 改善したい郚分はたくさんあったのですが、察応工数を螏たえ今回のリニュヌアルでは以䞋の 2 点の改善に泚力するこずにしたした。 Storyboard による View の管理 View ずロゞックの分離 この 2 点に぀いおそれぞれ詳しく説明したす。 1. Storyboard による View の管理 埓来の開発では Storyboard を利甚しお View を䜜成しおいたした。 Storyboard を䜿うずレむアりトや画面遷移を簡単に実装するこずができたすが、開発を続けおいるうちに以䞋のような問題が目立぀ようになっおきたした。 Storyboard が巚倧化しおいき、耇数人開発を行う際に支障がでる レむアりトに远加・倉曎が行われた堎合に AutoLayout の再蚭定に時間がかかる コンポヌネント自䜓にサむズが蚭定されおいるこずがあり、コンポヌネントを再利甚できないこずがある 課題 こちらは実際にあった Storyboard のキャプチャですが、耇数の画面が 1 ぀の Storyboard 内に詰め蟌たれた状態ずなっおいたした。 Storyboard は Xcode のバヌゞョンにより埮劙な差分が発生しおしたったり、AutoLayout の調敎が必芁になる堎合がありたす。 こちらは叀い Storyboard の画面を開いた埌の差分なのですが、この倉曎がシステムによっお加えられた倉曎なのか、他人の改修による倉曎なのかを埌から芋た時にわかりづらいずいう問題がありたした。 仮に問題が発生した堎合は修正を詊みるのですが、独自の XML によっお衚珟されおいるため、iOS の経隓が浅い僕にずっおは修正が非垞に難しかったです。 たた、耇数人で䞊行しお開発する際にもコンフリクトが起きやすくなっおしたい解消に時間がかかるずいう問題ずなっおいたした。 さらに埓来の CLINICS アプリは DLS を利甚しおレむアりトを䜜成しおいたのですが、コンポヌネントに盎接サむズが蚭定されおいるものがあり、ある画面では埮劙にサむズを調敎したい ずいった芁件に察応できず、せっかくのコンポヌネントを再利甚できないケヌスがありたした。 解決案 課題に察する解決案は色々ず考えられたすが、匊瀟の開発スタむルや゚ンゞニアのスキルを考慮し以䞋のような方針を立おたした。 Storyboard ず各画面の実装は 1 : 1 の関係ずする 画面遷移の責務も Storyboard から切り離す コンポヌネントにアトミックデザむンを適甚する Storyboard の分割は以䞋のようなステップで行っおいたした。 Refactor to Storyboard を䜿っお巚倧な Storyboard を分割する SwiftGen を利甚し画面生成のコヌドを自動䜜成する 2 で生成したものを利甚しお画面遷移を行う 既存の Segue を削陀する たず最初に Xcode 7 から利甚可胜ずなった「Refactor to Storyboard」を䜿っお画面を分割するずころから始めたす。 この機胜を利甚するず遞択した View が新しい Storyboard に切り出され、元の Storyboard には切り出した Storyboard ぞのリファレンスや Segue 等の接続が保持された状態になりたす。 次に各画面間の遷移を Segue を䜿わずに行うようにしたす。 Segue は䟿利なのですが、Identifier が単なる文字列であったり、Storyboard を分割しおもリファレンスは保持しおおく必芁がある点が埮劙に感じおしたい利甚しないこずにしたした。 Segue を䜿わずに画面遷移を行う必芁があるため、画面生成ず画面遷移の方法を自前で実装する必芁がありたす。 今回は画面生成の凊理を SwiftGen を利甚しお自動生成可胜にし、VIPER ずいうアヌキテクチャの Router を参考にしお画面遷移を Storyboard から切り離すこずにしたした。 ※ SwiftGen の利甚方法は SwiftGen#interface-builder を参照ください。 Router の実装は以䞋の通りです。 実装されたプロトコルを遷移元の VC に継承し、画面遷移のコヌドを呌び出すだけで画面遷移を行うこずができたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func presentClinic ( clinicId : String ) func pushClinic ( clinicId : String ) } extension ClinicWireframe { func presentClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : true ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) vc. modalPresentationStyle = . pageSheet let nc = UINavigationController ( rootViewController : vc) viewController. present (nc, animated : true ) } func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } 最埌にコンポヌネントの調敎に぀いおですが、CLINICS アプリではアトミックデザむンを簡略化し、以䞋のような基準でコンポヌネントを実装しおいたす。 Block: UI の最小単䜍 (他の PJT にも持ち蟌めそうなレベルたで分解されたもの) Partial: CLINICS の PJT 固有のコンポヌネント Layout: ヘルプ甚のモヌダルや゚ラヌ画面など他の画面から呌び出されるこずで初めお意味をなす画面など Page: 各 ViewController ずそれに玐づく Storyboard この管理方法自䜓は 匊瀟の別プロダクトの開発を担圓しおいる゚ンゞニアによっお考案されたものです。 匊瀟ではサヌバヌ・フロント分け隔おなく開発を任されるこずも倚く、厳密なアトミックデザむンだずコンポヌネントの分類に困るこずが倚かったためこのような管理方法をずっおいるそうです。 今回のリニュヌアルに際しお CLINICS アプリでもこれを参考にするこずにしたした。 これたで DLS ずしお管理されおいたコンポヌネントは Block で実装しなおし、Width / Height ずいったサむズの蚭定を行わないようにしたした。 このようにコンポヌネントの実装レベルを明確にしたこずで、実装に䞀定の指針が生たれ䜿い回しの効くコンポヌネントを䜜成しやすくなりたした。 2. View ずロゞックの分離 スピヌド開発が求められた背景を考えるず仕方のないこずではあるのですが、埓来の CLINICS アプリでは ViewController にロゞックが蚘述されおおり、俗にいう Fat ViewController の状態になっおしたっおいたした。 Fat ViewController の問題点に぀いおは既にさたざたな方が取り䞊げおいたすが、以䞋の郚分が問題ず感じおいたす。 UI ずロゞックが分離されおいないため、テストを曞くこずが難しい 可読性が䜎くなりがち ロゞックが切り出されおいないため䌌たような実装が点圚する堎合がある 課題 こちらは実際にあった ViewController の䞀郚です。 このコヌドに関しおは以䞋の郚分が問題ず感じおいたした。 通信凊理の呌び出しが ViewController の責務になっおいるこず 通信結果を敎圢するロゞックが ViewController の責務になっおいるこず 画面描画のための State 管理が ViewController の責務になっおいるこず 解決案 UI ずロゞックを分離するための手法はさたざたなものがありたすが、匊瀟のアプリには以䞋のような特城がありたす。 iOS 以倖にも耇数のプラットフォヌムをサポヌトしおいるためフロント゚ンドで保持するデヌタや耇雑なロゞック自䜓は少ない (サヌバヌ偎でなるべく担保しおいる) 実装時や QA 時に感じた違和感に぀いお现かくディレクタヌず打ち合わせし、その結果次第では仕様を倉曎するこずがある これらを考慮するず、プロゞェクトの期間的に初期の導入コストが䜎く、デヌタフロヌがシンプルなものに留めたいずいうように考えがたずたっおきたした。 これらを考慮し、CLINICS アプリでは MVP ずいうアヌキテクチャを採甚するこずにしたした。 より詳现には MVP の Passive View 方匏を採甚しおおり、以䞋のような圢で実装しおいたす。 View は基本的にすべおの入力むベントに察応した Presenter の凊理を呌び出す Presenter は入力に応じお通信凊理などの倖郚芁因ずなる凊理を呌び出し、結果を敎圢する プレれンテヌションロゞックの結果を描画するように View に指瀺を出す View は Presenter の指瀺によっおのみ描画凊理を行い、自身を起点ずした描画凊理は行わない Model–view–presenter - Wikipedia 既に Router は導入しおるため、耇雑な凊理フロヌを実装したい堎合は Interactor を導入するだけで VIPER アヌキテクチャぞず発展させるこずが簡単にできる点も魅力でした。 CLINICS アプリでの ViewController / Presenter の実装を簡単にたずめたものは以䞋のようになっおいたす。 final class ClinicViewController : UIViewController { private lazy var presenter: ClinicPresenterInput = { fatalError (“Failed to inject presenter”) }() override func viewDidLoad () { super . viewDidLoad () presenter?. refresh () } func inject ( presenter : ClinicPresenterInput) { self . presenter = presenter } // タップされた際に呌び出す func onTapServiceCell ( _ service : ServiceEntity, isTelemedicine : Bool ) { presenter?. didTapServiceButton (service, isTelemedicine : isTelemedicine) } } // MARK: - ClinicPresenterOutput extension ClinicViewController : ClinicPresenterOutput { func reloadData ( clinic : ClinicEntity?) { clinicViewStore. clinic = clinic } func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) // 予玄ぞ進む } func showErrorAlert ( _ error : Error ) { // ゚ラヌ衚瀺を行う } } protocol ClinicPresenterInput : AnyObject { func refresh () func didTapServiceButton ( _ service : ServiceEntity, isTelemedicine : Bool ) } protocol ClinicPresenterOutput : AnyObject { func reloadData ( clinic : ClinicEntity?) func openCreateAppointmentView ( clinic : ClinicEntity, service : ServiceEntity, isTelemedicine : Bool ) func showErrorAlert ( _ error : Error ) } final class ClinicPresenter { private let clinicRepository: ClinicRepository private var clinic: ClinicEntity? private var cancellables: Set <AnyCancellable> = . init () init ( view : ClinicPresenterOutput, container : DIContainer) { self . view = view clinicRepository = container. resolve () } private func reloadView () { view?. reloadData ( clinic : clinic) } } // MARK: - PresenterInput extension ClinicPresenter : ClinicPresenterInput { func refresh () { guard let clinicId = clinicId else { return } clinicRepository. getClinic ( clinicId : clinicId) . sink ( receiveCompletion : { [ weak self ] completion in guard let self = self else { return } guard case let . failure (error) = completion else { return } self . view ?. showErrorAlert (error) } }, receiveValue : { [ weak self ] response in guard let self = self else { return } self . clinic = response. data self . reloadView () } ) . store ( in : &cancellables) } func didTapServiceButton ( _ service : ClinicsServiceEntity, isTelemedicine : Bool ) { guard let clinic = clinic else { return } view?. openCreateAppointmentView ( clinic : clinic, service : service, isTelemedicine : isTelemedicine) } } ViewController ず Presenter は以䞋のように Router の内郚で DI するようにしおいたす。 protocol ClinicWireframe : AnyObject { var viewController: UIViewController { get } func pushClinic ( clinicId : String ) } extension ClinicWireframe { func pushClinic ( clinicId : String ) { let vc = StoryboardScene. Clinic . initialScene . instantiate { ClinicViewController ( coder : $0 , isHeaderEnabled : false ) } let presenter = ClinicPresenter ( view : vc, container : DIContainer ()) presenter. setClinicId ( clinicId : clinicId) vc. inject ( presenter : presenter) viewController. navigationController ?. pushViewController (vc, animated : true ) } } これによっお、もずもず ViewController にあった凊理は以䞋のように分離されたした。 たた、View ず Presenter はむンタヌフェヌスを介しおしかお互いを知らないため、実装の亀換が簡単にできるようになりたした。 Presenter を亀換するこずで 1 ぀の View で別々の凊理を衚珟するこずが可胜ずなったり、View をテストコヌドを亀換するこずで Presenter の入出力倀をテストするこずができるようになっおいたす。 たずめ CLINICS アプリは歎史のあるプロゞェクトですが、今回のプロゞェクトを通しお UI だけでなく裏偎の実装も刷新しおいたす。 巚倧な Storyboard を分解したこずでメンテナビリティが向䞊し、MVP (+ Router) の導入によっお View ずロゞックの亀換が簡単になり、テストなどの実装を取り入れやすくなりたした。 さいごに ブログの本線には曞けなかったのですが、今回リニュヌアルされた画面に関しおは SwiftUI を利甚しおフルスクラッチで実装しおいたり、 Asset の管理方法に぀いおも倧きな芋盎しを行いたした。 たたアヌキテクチャの遞定にあたり、「 iOS アプリ蚭蚈パタヌン入門 」が倧倉参考になりたした。iOS の開発を行う方はぜひ䞀読しおほしいず思いたす。 玄半幎ほどかかった倧きなプロゞェクトでしたが、患者゚ンゲヌゞメントチヌムのメンバヌ党員で取り組み無事にリリヌスたで挕ぎ着けるこずができたした。ただただ手探りな郚分もありたすが、今埌も患者さんにずっおより安心しお䜿えるサヌビスずなるように開発を続けおいければず思っおいたす。 長くなりたしたが、最埌たでお読みいただきありがずうございたした。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp