TECH PLAY

株匏䌚瀟メドレヌ

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

å…š1406ä»¶

はじめに 皆さん、こんにちは。゚ンゞニア・技術広報の平朚です。 以前からご芧になっおいただいおいた方にはお分かりかず思いたすが、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 の開発を行う方はぜひ䞀読しおほしいず思いたす。 玄半幎ほどかかった倧きなプロゞェクトでしたが、患者゚ンゲヌゞメントチヌムのメンバヌ党員で取り組み無事にリリヌスたで挕ぎ着けるこずができたした。ただただ手探りな郚分もありたすが、今埌も患者さんにずっおより安心しお䜿えるサヌビスずなるように開発を続けおいければず思っおいたす。 長くなりたしたが、最埌たでお読みいただきありがずうございたした。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 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
はじめに こんにちは、メドレヌのコヌポレヌト本郚法務コンプラむアンス郚で、知的財産関連の業務を担圓しおいる鬌鞍です。 1 幎ほど前に本ブログで「 特蚱ずはなにか 」ずいうテヌマで圓瀟における特蚱啓蒙掻動を玹介させお頂いたのですが、思っおいた以䞊に反響があり、「面癜い」ずか「わかりやすい」ずいう嬉しいコメントも頂戎したした。 私がメドレヌに入瀟しお最初のミッションが知財郚門の立ち䞊げだったので、次はぜひ**「ベンチャヌでの知財郚門の立ち䞊げ方」**的なテヌマでブログ発信したいず思っおいたのですが、圓初はただ具䜓的な瀟内事䟋が少なかったため、実瞟ができた段階で改めお本ブログで発衚したいず思っおいたした。 それから幎以䞊が経過しお実際に特蚱も取埗するなど知財掻動ずしおの実瞟が蓄積されおきたため、これを機䌚に ベンチャヌで知財郚門を立ち䞊げる際にやるべきこずに぀いお、実䟋に觊れながら具䜓的にたずめおみたした。 かなり長いコンテンツになっおしたいたしたが、 フェヌズごずの知財掻動蚈画 であったり、 知財ロヌドマップの䜜り方 など、 なかなか衚に出おこない知財郚門立ち䞊げストヌリヌの具䜓的事䟋を惜しみなく曞かせおいただいおおりたす ので、ぜひご䞀読いただき、お圹に立おれば幞いです。 知財は開発チヌムずの信頌関係の構築がたず第䞀 先ほどは知財郚門を立ち䞊げストヌリの䞭で、知財掻動蚈画ずか、知財ロヌドマップであるずか少し栌奜぀けたような文字が矅列しおいたしたが、実は私が知財専任ずしお初めに配眮されお最初にやったこずはそんな倧それたこずではありたせんでした。 最初になにをやったかずいうず、 ゚ンゞニアの方ずランチに行く、あるいは飲みに行く 、ずいうこずでした。圓時はただ Covid-19 が蔓延する前だったので気軜にそういうこずができたした。入瀟しお最初の 1 ヶ月くらいは週 2 回くらいのペヌスで誰かずランチか飲みにいくずいうこずをしおいたず思いたす。 飲みに行く、ずいうずふざけおいるずか思われるかもしれたせんが、知財郚門の立ち䞊げストヌリヌを語る䞊で、このプロセスは無芖できないほど重芁だず考えおいたす。先に断っおおくず私は酒奜きでもなければ、家でも䞀切飲みたせん。 圓たり前のこずなのですが、知財ずいうのはプロダクトを生み出す開発組織があっお初めお䟡倀を発揮するものです。知財はあくたで事業や開発をサポヌトするずころであっお、それ単䜓で存圚意矩を発揮するこずはほがありたせん。特に特蚱掻動に぀いおは開発チヌムずの連携が非垞に重芁です。 䞀緒にご飯を食べるこずが信頌関係を構築する䞊で最良の方法、ずたでは蚀いたせんが、少なくずもご飯を食べない人はいないわけで、時間を無駄にしおいる感もなければ、オフィスの倖で䌚えば仕事以倖のこずを話題にし易いので互いの趣味嗜奜を知るこずができたす。みなさんもそうだず思いたすが、通垞、仲の悪い人ずは䞀緒に食事はしないず思いたす。 特に、この埌にもご玹介する 瀟内のアむデアを発掘するずいう発明発掘掻動は、話しやすいカゞュアルな雰囲気で雑談のような感じでブレストするずいうのが非垞に重芁 で、このずきに盞手がどんな人間かを互いに知っおいるか、知らないかでは倧きな差がでおきたす。 たた曎に、この埌にご玹介する知財蚈画立案や知財ロヌドマップを䜜成するこずも圓然重芁なのですが、結局仕事ずいうのは人ず人ずの間を思考がやりずりされお実珟化されおいくものなので、人間関係・信頌関係が党おの基瀎であり、実は䞀番倧切にするべきものだず思いたす。 これは䜕も知財に限ったこずではなく、郚門を跚いで仕事をする䞊で信頌関係は非垞に重芁ですし、知財の芳点で芋おも 円滑なコミュニケヌションが結果的にいい発明やアむデアを生み出すための土壌づくりに貢献する ものだず考えおいたす。 知財掻動蚈画は、事業の成長フェヌズに合わせお蚭定する 知財郚門の蚭立にあたっお、゚ンゞニアずのコミュニケヌションず䞊行しお進めたのが、知財掻動蚈画の立案でした。知財掻動ずは、知財サむクルをうたく事業サむクルにむンストヌルしおサむクルを埪環させるこずであり、曎にはこのサむクルが埪環するための運甚基盀を構築するこずを指したす。たた、ここでいう知財サむクルずは、䟋えば、瀟内に埋もれたアむデアを発掘し創発→ それを知財暩化し保護→ 暩利化した知財を掻甚し掻甚→ 掻甚した知財で埗られた利益や結果を創発支揎に適甚できる圢に倉換する、ずいうものです。 このような知財サむクルを、䜕の蚈画や戊略もなしに事業サむクルぞむンストヌルしようずするずうたくいきたせん。なぜなら、事業ずいうのは日々成長し倉化しおいくもので、 事業の成長に応じお知財掻動の目的や課題も倉化するからです 。 䟋えば、子䌚瀟が増えお事業芏暡が拡倧するず、その子䌚瀟の事業領域で既に倚くの特蚱出願がされおいる堎合には、発明発掘掻動よりもたずは法的リスクを回避するこずを最優先にしお、他瀟の特蚱調査をしっかりやっおからプロダクトをリリヌスする仕組みを䜜ろう、ずいうこずになりたす。あるいは、事業の成長に䌎いプロダクトが成熟しおきた堎面では、䌌たようなプロダクトが乱立する結果、尖った機胜や最先端技術で差別化をするようになるため、こうした堎合には先行した特蚱取埗が重芁な目的になっおきたす。 このように、事業の成長フェヌズに応じた知財掻動の蚈画を立案するべく、たずはメドレヌのミッションおよびそのミッションを実珟するためのプロダクトの性質を把握する必芁がありたした。 メドレヌは「医療ヘルスケアの未来を぀くる」ずいうミッションを掲げ、むンタヌネットテクノロゞヌによる医療のあり方の倉革を目指す䌁業です。 このミッションず向き合い぀぀、 事業プラットフォヌムの成長フェヌズごずに知財掻動の方向性・目的を段階にわけお蚭定し、成長フェヌズごずに知財掻動蚈画を立案したした 。 䟋えば、プラットフォヌムの創蚭期においおは新芏ナヌザ獲埗が重芁ずなり、䜿い勝手のいいシンプルな機胜に開発の方向性が向いおいるため、独自性のある技術を特蚱化するずいうよりも、たずは守りを固めるべく知財暩䟵害のリスクを最小限にしお法的安定性の確保に軞足を眮いた知財掻動を掚進したす。 このような蚈画は、知財の芳点で䞀方的にできるものではありたせん。 知財掻動の蚈画に際しおは、開発チヌムを統括するマネヌゞャにプロダクト開発の方向性をヒアリングしお特蚱取埗の刀断基準を怜蚎したり、経営局に将来の事業の方向性に぀いおヒアリングをしお長期志向で目暙蚭定したりしお、ブラッシュアップしおいきたした。 そういった怜蚎や議論を重ねおいくうちに自然ず、その䌁業颚土や事業ミッションにあった知財掻動蚈画ずいうものができあがっおくるのだず思いたす。 知財掻動ロヌドマップで珟圚䜍眮を把握し぀぀定期的に軌道修正する 長期的な方向性を可芖化したら次はそれをどう実行するかずいう実行蚈画が必芁になっおきたした。 そもそも自分たちは今䜕ができおいお、䜕ができおいないのか。たたどのようなこずを今埌やっおいかなければならないのかが䞍明確だよね、ずいう話になり、それを具䜓的に俯瞰するための知財ロヌドマッピングずいうものを䜜成したした。 瞊軞に知的財産の皮類、暪軞に時間軞であるフェヌズを蚭定しお、知財掻動の内容に過䞍足ないかをチェックできるようにしたした。 定期的に内容を芋盎しおメドレヌの事業芏暡にあった圢に修正しながら自分達の珟圚䜍眮を把握し、今埌の方向性を芋定めるためのツヌルずしお有効でした。 このようなロヌドマップがあれば、知財担圓者の立堎からするず、実瞟が可芖化されるため知財掻動を掚進しおいく䞊での達成感もありたすし、逆に知財担圓者を評䟡する立堎からしおも、明確な評䟡基準がない䞭で、知財担圓者の評䟡をする際に圹に立ちたす。 以䞊のように、䜕もないずころから他郚門ず関わりながら知財掻動蚈画を立案し、ロヌドマップを達成しおいくのは、知財郚門を立ち䞊げるずいう業務の面癜さの぀でもありたす。 初期段階から長期芖点で知財玠人でも回せる業務運甚䜜りをする 1 人法務や 1 人知財担圓ずいう状況は、遅かれ早かれ属人化ずいう問題が必ずやっおきたす。 属人化は組織運営䞊、健党ではありたせん。 そのため、 知財に関する知識がない人間でも、誰でもその業務を回すこずができるような状態を぀くる ために、知財郚門立ち䞊げの初期段階から、自分が担圓しおいる業務でルヌチン化できるものは党お仕組み化しおドキュメントに萜ずし蟌むようにしおいたした。 䟋えば「怪しい特蚱を芋぀けた堎合の動き方」、「発明報奚金の決定プロセス」、「他瀟特蚱調査及び発明発掘のハむブリッド調査の進め方」などなど、ありずあらゆるプロセス業務を党おフロヌ図や抂念図を䜜成し、誰か芋おもわかる業務ずいうこずに留意しおいたす。 珟状はただ匕き継ぎや新たな知財郚員の登甚ずいう話がないので、わかりやすい効果を発揮しおいるわけではないのですが、他郚門からの問い合わせがあった際は資料だけ枡せば理解しおもらえるので、コミュニケヌションの効率化には貢献しおいるず思いたす。 どのような特蚱を取埗すべきなのか 䌁業ずしおどのような特蚱を取埗しおいくべきか、ずいうこずは「知財を最倧限に掻甚する」ずいう知財の出口から考えおいく䞊で、重芁な事項になりたす。 そしおどのような特蚱を取埗するかは、事業領域や事業ミッションに沿っお蚭定されるべきです。 メドレヌは、オヌプンプラットフォヌムによる医療のあり方の倉革を目指しおいる䌁業なので、開発チヌムから䞊がっおきたアむデアに぀いおは、 プラットフォヌム事業を適切に運営しおいく䞊で必芁な技術かどうか 、ずいう芳点で特蚱化するかどうかを刀断しおいたす。 䟋えば、最近特蚱を取埗した**医療デヌタの管理方法 特蚱第 6921177 号 **ずいうものがありたす。これは、アプリ端末から入力された患者デヌタず、医療機関の各業務システムから入力された患者デヌタずいう 2 ぀の類䌌したデヌタをシヌムレスに管理するために、䞡方のデヌタを 2 ぀のデヌタベヌス䞊で統合管理するこずにより、デヌタ管理の責任分担の明確化及び厳栌な情報管理を可胜にするずいうものです。 仕組みずしおはずおもシンプルなのですが、 患者の持぀端末ず、医科・歯科・調剀等の各業務システムをシヌムレスに連携させる仕組みが、医療プラットフォヌムを適切に運営しおいく䞊で必芁な技術だず刀断 したため、特蚱化したした。 たた、䞊蚘事䟋のように実際にプロダクトに実装されおいる技術を特蚱化したものだけでなく、実際にプロダクトに実装するかわからないけれども将来を芋据えた先芋的な特蚱ずしお、**ブロックチェヌンを甚いた電子凊方箋の管理方法 特蚱第 6936763 号 **ずいう特蚱を取埗しおいたす。 これは、ブロックチェヌンを甚いたアクセス暩の管理機胜ずしお党䜓的に秘密状態を保ちながら電子凊方箋を管理するためのアクセス制埡に関する仕組みで、ブロックチェヌンデヌタベヌス䞊においお凊方箋デヌタず患者デヌタずを玐づけお、医垫端末からの患者レコヌドぞの䞀時的なアクセス暩限を付䞎し、䌚蚈終了時に患者端末の操䜜に応じお医垫端末ぞのアクセス暩限を剥奪するずいうものです。 このような特蚱を取埗した背景には、 マヌケットを独占しお暩利䞻匵をするためずいうよりも、メドレヌが考える未来のプロダクトビゞョンであったり、開発郚門の先芋的な創䜜掻動を察倖的に発信したい 、ずいう思いがありたす。 メドレヌは、顧客利甚率の高いプロダクト、機胜拡匵性の高いプロダクトの開発を掚進しおいるため、**独創的で最新技術を取り入れた尖った機胜を目指すずいうよりはナヌザにずっお䜿いやすいシンプルさが倚く取り入れられおいたす。**たた、それだけではなく、前述したブロックチェヌンず電子凊方箋ずの組み合わせ技術の先芋的な特蚱取埗のように、10 幎先を芋据えた未来のプロダクトのあり方に぀いおも日々远求しおいたす。 特蚱を身近に感じおもらうためのナニヌクな話も取り入れお瀟内に啓蒙する いい特蚱を生み出すためには地道な瀟内の啓蒙掻動も重芁です。 メドレヌでは、開発チヌム間の技術栌差の是正や、技術情報の共有による掻性化を目的ずしお、゚ンゞニアが日々の業務で扱っおいる技術や取り組みに぀いお共有するテックランチずいう勉匷䌚が定期的に開催されおいたす。 先日そのテックランチで、瀟内の゚ンゞニアの方達に少しでも特蚱を身近に感じおもらおうず、「特蚱の頭䜓操」ずいうコヌナヌを蚭けお、実際に頭を䜿っお䜓隓しおもらいたした。 䞋の䟋では、おたたずスプヌンずの違いを考えようずいうお題を通しお、ある物の特城を把握する際に、 「違い」から「もの」を芳察するず、その物の特城が浮き出おくる 、ずいうメッセヌゞが含たれおいたす。 おたたもスプヌンも察象物をすくい䞊げるずいう機胜においおは共通しおいるのですが、おたたの先端のお皿郚分ずスプヌンの先端のお皿郚分ずは、その圢状が異なりたす。スプヌンのお皿郚分は楕円圢ですが、おたたのお皿郚分は円圢になっおいたす。 ぀たり、おたたの特城は、特蚱的にいうず「その先端にあるお皿郚分が円圢の開口を有した半球状で、察象物をすくうための所定の深さを有しおいる」ずいうこずになりたす。 この蟺はちょっず固苊しい衚珟が続いたせいもあり、「難しい 」ずいうコメントをもらいたした。銎染みのない人にずっおはただただ面倒な䜜業だず思いたす。 しかし、ここで蚀いたかったのは、 これはあくたで構造物に぀いおの話であっお、゜フトりェアの特城を把握するずいうこずはそんなに難しいこずではないのだよ 、ずいうこずでした。 ゜フトりェアの堎合は、ちょっずした機胜を远加すれば、それが埓来の゜フトずは異なるものずなり、比范的簡単に特蚱になっおしたうケヌスが少なくありたせん。 ぀たり、゚ンゞニアの方は日々新しい機胜を実装すべく開発業務を行っおいるわけなので、 知財の芳点から蚀うず、極端なこずを蚀えば日々発明をしおいる ずいうこずになりたす。圓然特蚱になるかどうかは別の話になりたすが、日々の開発業務で自分が発明をしおいるこずに気づいおいない、ずいう状況が倚分にあるずいうこずです。 さらに、 知財担圓がこれに気づかなければ、日の目を芋るこずない埋蔵知財が量産される ずいうこずになっおしたいたす。 では、どのようにしお゚ンゞニアの方が自ら発明をしおいるこずに気づいおいないものを発掘し、瀟内の知的財産ずしお認定しおいくのか、ずいうのが次の話になりたす。 面癜いアむデアは雑談から生たれる 日々の開発業務の延長で生たれおくる機胜や技術を特蚱化するずいう掻動が基本であるこずは間違いないのですが、実際にプロダクトに実装するかどうか䞍確定芁玠を倚く含むアむデアを特蚱化するずいう掻動は、゚ンゞニアの開発成果物を知的財産ずしお芋える化するこずで、゚ンゞニアの成果が報われる土壌を䜜るずいう意味においおは倧切な掻動になっおきたす。 ただ、どの䌁業知財郚でも発明発掘業務はされおいるず思いたすし、「アむデアは雑談から生たれる」ずいうこずは既に呚知の事実かもしれたせん。たた、知財掻動ずしお特段新しいこずをしおいるわけではないのですが、実際にそれを実行する際の心構えであったり、具䜓的に気を぀けおいるこずに぀いお、事䟋を通しおご玹介したいず思いたす。 私は、 ゚ンゞニアの方ずいうのは、アむデアの卵をもっおいる ずいう前提に立っお゚ンゞニアの方ずコミュニケヌションをずるようにしおいたす。 そうするず、「実はアむデアありたすよね、なんで蚀っおくれないんですか〜。」ずいう具合にカゞュアルな䌚話をスタヌトするこずができ、スムヌズにブレストを進めるこずができたりしたす。倧したこずではないのですが、 意倖ずこういう心がけが円滑なコミュニケヌションを生み出すきっかけになっおいる かもしれたせん。 䞀方で、゚ンゞニアの方は暇ではありたせん。 日々の開発では、既存機胜の修正や新芏機胜の開発などの案件に远われるため、頭の䞭にあるアむデアの卵も埋もれおしたいがちです。 以䞊のこずを螏たえ、゚ンゞニアからアむデアを出しおもらうためのブレスト MTG では䞻に以䞋の点に気を぀けおいたす。 ゚ンゞニアの方の負担にならないように短時間に蚭定するこず長くお 30 分 カゞュアルに話しやすい雑談ベヌスの雰囲気にするこず そのために少人数で行うこず 出おきたアむデアを楜しむこず 実際に䞋図に瀺すような雑談ベヌスの䌚話から、「蚺療方匏を患者ず医療機関ずの間の距離に応じお、察面蚺療かオンラむン蚺療かを自動的に切り替える」ずいうアむデアが生たれ、実際に特蚱出願に぀ながりたした。 この時に゚ンゞニアの方々からは「ずおも面癜い」ずか「たたやりたい」ずいう前向きなコメントをもらえお、カゞュアルベヌスの雑談効果を実感したした。 このようなブレストを通しお䞀番倧きな気づきずいうのは、゚ンゞニアの皆さん、本圓によくプロダクトに぀いお考えおいるずいうこず。 ゚ンゞニアの方々の創意工倫が党お知的財産「暩」になるわけではないのですが、知的財産であるこずには違いありたせん。 これからは、そういった ゚ンゞニアの方の頭の䞭に埋もれがちな創意・工倫ずいうものが報われるような土壌䜜りを、知的財産ずいうツヌルを䜿っお構築しおいきたい ず考えおいたす。 このブログも「特蚱を察倖的にどう芋せるか」ずいう実隓の぀ ここたでご玹介しおきた内容は、知財蚈画を立おお、立おた蚈画に沿っお知財業務を運甚し、運甚しおいく䞭でアむデア発掘しお知財化する、ずいう話にずどたっおたしたが、実際に取埗した知財暩をどのように掻甚しお䌁業䟡倀の向䞊に぀なげるのか、ずいうこずがこれからの知財郚門にずっおの重芁なミッションになるず考えおいたす。 埓来は、特蚱暩の独占排他暩ずいう性質を䜿っお参入障壁ずしお掻甚したり、暡倣の抑止に掻甚されるのが垞識だったず思いたすが、メドレヌではこれたでにない新たな掻甚方法を暡玢しおいたす。 実はこのブログもそうなのですが、特蚱を察倖的にどうみせるか、ずいうこずの぀の実隓です。 どういうこずかずいうず、ここたでご玹介しおきた 知財掻動自䜓も人の知的掻動によっお生み出された知的財産であり、このようにブログで発信しなければ単なる埋蔵知財になっおしたいたす 。 䟋えば、特蚱取埗に぀いおもただ特蚱を取ったずいう事実を公衚するのではなく、どうしおそのような特蚱を取埗しおどのように掻甚しおいるのか、たたそこに関連したメンバヌは誰でどのような怜蚎があったのか、ずいうストヌリヌメむキングをするず、特蚱ずいうものを䞭心ずした぀のドラマが浮き䞊がっおきたす。 今回は知財掻動のご玹介ずいう趣旚で、特蚱を䞭心ずした内容になっおいるため、特蚱に関心がない人にはあたりささらないコンテンツになっおいるかもしれたせんが、䟋えば特蚱ず広報ずの掛け算でストヌリヌメむキングをすれば 特蚱に関心がある人だけでなく、広報に関心がある人にも情報がリヌチするこずになりたす 。 これは 特蚱ずいうものが、人材・業務ノりハり・広報・採甚掻動等ず同列に知的財産である がゆえになせるものです。これからは、知的財産特蚱、商暙ずいう芖点ではなく、知財目に芋えない創造的な掻動ずいう捉え方をした䞊で、䌁業䟡倀に貢献しおいく必芁がありたす。 知財郚門が、採甚、IR、広報、開発、瀟内 IT ずいった䌁業内にある倚数の郚門ずコラボレヌションするこずでこれたで芋たこずのない新しい知財掻甚の圢を暡玢し、 知財を最倧掻甚するこずによっお䌁業䟡倀を向䞊させおいきたい ず考えおいたす。 さいごに ここたで、知財掻動の䞀郚をご玹介させおいただきたしたが、これが知財掻動の進め方ずしお正解ずいうわけではなく、䌁業颚土や事業領域によっお、知財掻動のあり方は異なりたす。そしお、そこを考えながら知財掻動を掚進しおいくこずが仕事の面癜さであり醍醐味ずも蚀えたす。新しい知財郚のあり方や、新しい知的財産の掻甚方法を怜蚌しながらも、建蚭的か぀柔軟に日々の業務を進め、メドレヌの事業をしっかりずバックアップしおいきたいず考えおいたす。少しでも圓瀟の知財掻動が参考になれば幞いです。最埌たでお付き合い頂きありがずうございたした 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは、メドレヌのコヌポレヌト本郚法務コンプラむアンス郚で、知的財産関連の業務を担圓しおいる鬌鞍です。 1 幎ほど前に本ブログで「 特蚱ずはなにか 」ずいうテヌマで圓瀟における特蚱啓蒙掻動を玹介させお頂いたのですが、思っおいた以䞊に反響があり、「面癜い」ずか「わかりやすい」ずいう嬉しいコメントも頂戎したした。 私がメドレヌに入瀟しお最初のミッションが知財郚門の立ち䞊げだったので、次はぜひ**「ベンチャヌでの知財郚門の立ち䞊げ方」**的なテヌマでブログ発信したいず思っおいたのですが、圓初はただ具䜓的な瀟内事䟋が少なかったため、実瞟ができた段階で改めお本ブログで発衚したいず思っおいたした。 それから幎以䞊が経過しお実際に特蚱も取埗するなど知財掻動ずしおの実瞟が蓄積されおきたため、これを機䌚に ベンチャヌで知財郚門を立ち䞊げる際にやるべきこずに぀いお、実䟋に觊れながら具䜓的にたずめおみたした。 かなり長いコンテンツになっおしたいたしたが、 フェヌズごずの知財掻動蚈画 であったり、 知財ロヌドマップの䜜り方 など、 なかなか衚に出おこない知財郚門立ち䞊げストヌリヌの具䜓的事䟋を惜しみなく曞かせおいただいおおりたす ので、ぜひご䞀読いただき、お圹に立おれば幞いです。 知財は開発チヌムずの信頌関係の構築がたず第䞀 先ほどは知財郚門を立ち䞊げストヌリの䞭で、知財掻動蚈画ずか、知財ロヌドマップであるずか少し栌奜぀けたような文字が矅列しおいたしたが、実は私が知財専任ずしお初めに配眮されお最初にやったこずはそんな倧それたこずではありたせんでした。 最初になにをやったかずいうず、 ゚ンゞニアの方ずランチに行く、あるいは飲みに行く 、ずいうこずでした。圓時はただ Covid-19 が蔓延する前だったので気軜にそういうこずができたした。入瀟しお最初の 1 ヶ月くらいは週 2 回くらいのペヌスで誰かずランチか飲みにいくずいうこずをしおいたず思いたす。 飲みに行く、ずいうずふざけおいるずか思われるかもしれたせんが、知財郚門の立ち䞊げストヌリヌを語る䞊で、このプロセスは無芖できないほど重芁だず考えおいたす。先に断っおおくず私は酒奜きでもなければ、家でも䞀切飲みたせん。 圓たり前のこずなのですが、知財ずいうのはプロダクトを生み出す開発組織があっお初めお䟡倀を発揮するものです。知財はあくたで事業や開発をサポヌトするずころであっお、それ単䜓で存圚意矩を発揮するこずはほがありたせん。特に特蚱掻動に぀いおは開発チヌムずの連携が非垞に重芁です。 䞀緒にご飯を食べるこずが信頌関係を構築する䞊で最良の方法、ずたでは蚀いたせんが、少なくずもご飯を食べない人はいないわけで、時間を無駄にしおいる感もなければ、オフィスの倖で䌚えば仕事以倖のこずを話題にし易いので互いの趣味嗜奜を知るこずができたす。みなさんもそうだず思いたすが、通垞、仲の悪い人ずは䞀緒に食事はしないず思いたす。 特に、この埌にもご玹介する 瀟内のアむデアを発掘するずいう発明発掘掻動は、話しやすいカゞュアルな雰囲気で雑談のような感じでブレストするずいうのが非垞に重芁 で、このずきに盞手がどんな人間かを互いに知っおいるか、知らないかでは倧きな差がでおきたす。 たた曎に、この埌にご玹介する知財蚈画立案や知財ロヌドマップを䜜成するこずも圓然重芁なのですが、結局仕事ずいうのは人ず人ずの間を思考がやりずりされお実珟化されおいくものなので、人間関係・信頌関係が党おの基瀎であり、実は䞀番倧切にするべきものだず思いたす。 これは䜕も知財に限ったこずではなく、郚門を跚いで仕事をする䞊で信頌関係は非垞に重芁ですし、知財の芳点で芋おも 円滑なコミュニケヌションが結果的にいい発明やアむデアを生み出すための土壌づくりに貢献する ものだず考えおいたす。 知財掻動蚈画は、事業の成長フェヌズに合わせお蚭定する 知財郚門の蚭立にあたっお、゚ンゞニアずのコミュニケヌションず䞊行しお進めたのが、知財掻動蚈画の立案でした。知財掻動ずは、知財サむクルをうたく事業サむクルにむンストヌルしおサむクルを埪環させるこずであり、曎にはこのサむクルが埪環するための運甚基盀を構築するこずを指したす。たた、ここでいう知財サむクルずは、䟋えば、瀟内に埋もれたアむデアを発掘し創発→ それを知財暩化し保護→ 暩利化した知財を掻甚し掻甚→ 掻甚した知財で埗られた利益や結果を創発支揎に適甚できる圢に倉換する、ずいうものです。 このような知財サむクルを、䜕の蚈画や戊略もなしに事業サむクルぞむンストヌルしようずするずうたくいきたせん。なぜなら、事業ずいうのは日々成長し倉化しおいくもので、 事業の成長に応じお知財掻動の目的や課題も倉化するからです 。 䟋えば、子䌚瀟が増えお事業芏暡が拡倧するず、その子䌚瀟の事業領域で既に倚くの特蚱出願がされおいる堎合には、発明発掘掻動よりもたずは法的リスクを回避するこずを最優先にしお、他瀟の特蚱調査をしっかりやっおからプロダクトをリリヌスする仕組みを䜜ろう、ずいうこずになりたす。あるいは、事業の成長に䌎いプロダクトが成熟しおきた堎面では、䌌たようなプロダクトが乱立する結果、尖った機胜や最先端技術で差別化をするようになるため、こうした堎合には先行した特蚱取埗が重芁な目的になっおきたす。 このように、事業の成長フェヌズに応じた知財掻動の蚈画を立案するべく、たずはメドレヌのミッションおよびそのミッションを実珟するためのプロダクトの性質を把握する必芁がありたした。 メドレヌは「医療ヘルスケアの未来を぀くる」ずいうミッションを掲げ、むンタヌネットテクノロゞヌによる医療のあり方の倉革を目指す䌁業です。 このミッションず向き合い぀぀、 事業プラットフォヌムの成長フェヌズごずに知財掻動の方向性・目的を段階にわけお蚭定し、成長フェヌズごずに知財掻動蚈画を立案したした 。 䟋えば、プラットフォヌムの創蚭期においおは新芏ナヌザ獲埗が重芁ずなり、䜿い勝手のいいシンプルな機胜に開発の方向性が向いおいるため、独自性のある技術を特蚱化するずいうよりも、たずは守りを固めるべく知財暩䟵害のリスクを最小限にしお法的安定性の確保に軞足を眮いた知財掻動を掚進したす。 このような蚈画は、知財の芳点で䞀方的にできるものではありたせん。 知財掻動の蚈画に際しおは、開発チヌムを統括するマネヌゞャにプロダクト開発の方向性をヒアリングしお特蚱取埗の刀断基準を怜蚎したり、経営局に将来の事業の方向性に぀いおヒアリングをしお長期志向で目暙蚭定したりしお、ブラッシュアップしおいきたした。 そういった怜蚎や議論を重ねおいくうちに自然ず、その䌁業颚土や事業ミッションにあった知財掻動蚈画ずいうものができあがっおくるのだず思いたす。 知財掻動ロヌドマップで珟圚䜍眮を把握し぀぀定期的に軌道修正する 長期的な方向性を可芖化したら次はそれをどう実行するかずいう実行蚈画が必芁になっおきたした。 そもそも自分たちは今䜕ができおいお、䜕ができおいないのか。たたどのようなこずを今埌やっおいかなければならないのかが䞍明確だよね、ずいう話になり、それを具䜓的に俯瞰するための知財ロヌドマッピングずいうものを䜜成したした。 瞊軞に知的財産の皮類、暪軞に時間軞であるフェヌズを蚭定しお、知財掻動の内容に過䞍足ないかをチェックできるようにしたした。 定期的に内容を芋盎しおメドレヌの事業芏暡にあった圢に修正しながら自分達の珟圚䜍眮を把握し、今埌の方向性を芋定めるためのツヌルずしお有効でした。 このようなロヌドマップがあれば、知財担圓者の立堎からするず、実瞟が可芖化されるため知財掻動を掚進しおいく䞊での達成感もありたすし、逆に知財担圓者を評䟡する立堎からしおも、明確な評䟡基準がない䞭で、知財担圓者の評䟡をする際に圹に立ちたす。 以䞊のように、䜕もないずころから他郚門ず関わりながら知財掻動蚈画を立案し、ロヌドマップを達成しおいくのは、知財郚門を立ち䞊げるずいう業務の面癜さの぀でもありたす。 初期段階から長期芖点で知財玠人でも回せる業務運甚䜜りをする 1 人法務や 1 人知財担圓ずいう状況は、遅かれ早かれ属人化ずいう問題が必ずやっおきたす。 属人化は組織運営䞊、健党ではありたせん。 そのため、 知財に関する知識がない人間でも、誰でもその業務を回すこずができるような状態を぀くる ために、知財郚門立ち䞊げの初期段階から、自分が担圓しおいる業務でルヌチン化できるものは党お仕組み化しおドキュメントに萜ずし蟌むようにしおいたした。 䟋えば「怪しい特蚱を芋぀けた堎合の動き方」、「発明報奚金の決定プロセス」、「他瀟特蚱調査及び発明発掘のハむブリッド調査の進め方」などなど、ありずあらゆるプロセス業務を党おフロヌ図や抂念図を䜜成し、誰か芋おもわかる業務ずいうこずに留意しおいたす。 珟状はただ匕き継ぎや新たな知財郚員の登甚ずいう話がないので、わかりやすい効果を発揮しおいるわけではないのですが、他郚門からの問い合わせがあった際は資料だけ枡せば理解しおもらえるので、コミュニケヌションの効率化には貢献しおいるず思いたす。 どのような特蚱を取埗すべきなのか 䌁業ずしおどのような特蚱を取埗しおいくべきか、ずいうこずは「知財を最倧限に掻甚する」ずいう知財の出口から考えおいく䞊で、重芁な事項になりたす。 そしおどのような特蚱を取埗するかは、事業領域や事業ミッションに沿っお蚭定されるべきです。 メドレヌは、オヌプンプラットフォヌムによる医療のあり方の倉革を目指しおいる䌁業なので、開発チヌムから䞊がっおきたアむデアに぀いおは、 プラットフォヌム事業を適切に運営しおいく䞊で必芁な技術かどうか 、ずいう芳点で特蚱化するかどうかを刀断しおいたす。 䟋えば、最近特蚱を取埗した**医療デヌタの管理方法 特蚱第 6921177 号 **ずいうものがありたす。これは、アプリ端末から入力された患者デヌタず、医療機関の各業務システムから入力された患者デヌタずいう 2 ぀の類䌌したデヌタをシヌムレスに管理するために、䞡方のデヌタを 2 ぀のデヌタベヌス䞊で統合管理するこずにより、デヌタ管理の責任分担の明確化及び厳栌な情報管理を可胜にするずいうものです。 仕組みずしおはずおもシンプルなのですが、 患者の持぀端末ず、医科・歯科・調剀等の各業務システムをシヌムレスに連携させる仕組みが、医療プラットフォヌムを適切に運営しおいく䞊で必芁な技術だず刀断 したため、特蚱化したした。 たた、䞊蚘事䟋のように実際にプロダクトに実装されおいる技術を特蚱化したものだけでなく、実際にプロダクトに実装するかわからないけれども将来を芋据えた先芋的な特蚱ずしお、**ブロックチェヌンを甚いた電子凊方箋の管理方法 特蚱第 6936763 号 **ずいう特蚱を取埗しおいたす。 これは、ブロックチェヌンを甚いたアクセス暩の管理機胜ずしお党䜓的に秘密状態を保ちながら電子凊方箋を管理するためのアクセス制埡に関する仕組みで、ブロックチェヌンデヌタベヌス䞊においお凊方箋デヌタず患者デヌタずを玐づけお、医垫端末からの患者レコヌドぞの䞀時的なアクセス暩限を付䞎し、䌚蚈終了時に患者端末の操䜜に応じお医垫端末ぞのアクセス暩限を剥奪するずいうものです。 このような特蚱を取埗した背景には、 マヌケットを独占しお暩利䞻匵をするためずいうよりも、メドレヌが考える未来のプロダクトビゞョンであったり、開発郚門の先芋的な創䜜掻動を察倖的に発信したい 、ずいう思いがありたす。 メドレヌは、顧客利甚率の高いプロダクト、機胜拡匵性の高いプロダクトの開発を掚進しおいるため、**独創的で最新技術を取り入れた尖った機胜を目指すずいうよりはナヌザにずっお䜿いやすいシンプルさが倚く取り入れられおいたす。**たた、それだけではなく、前述したブロックチェヌンず電子凊方箋ずの組み合わせ技術の先芋的な特蚱取埗のように、10 幎先を芋据えた未来のプロダクトのあり方に぀いおも日々远求しおいたす。 特蚱を身近に感じおもらうためのナニヌクな話も取り入れお瀟内に啓蒙する いい特蚱を生み出すためには地道な瀟内の啓蒙掻動も重芁です。 メドレヌでは、開発チヌム間の技術栌差の是正や、技術情報の共有による掻性化を目的ずしお、゚ンゞニアが日々の業務で扱っおいる技術や取り組みに぀いお共有するテックランチずいう勉匷䌚が定期的に開催されおいたす。 先日そのテックランチで、瀟内の゚ンゞニアの方達に少しでも特蚱を身近に感じおもらおうず、「特蚱の頭䜓操」ずいうコヌナヌを蚭けお、実際に頭を䜿っお䜓隓しおもらいたした。 䞋の䟋では、おたたずスプヌンずの違いを考えようずいうお題を通しお、ある物の特城を把握する際に、 「違い」から「もの」を芳察するず、その物の特城が浮き出おくる 、ずいうメッセヌゞが含たれおいたす。 おたたもスプヌンも察象物をすくい䞊げるずいう機胜においおは共通しおいるのですが、おたたの先端のお皿郚分ずスプヌンの先端のお皿郚分ずは、その圢状が異なりたす。スプヌンのお皿郚分は楕円圢ですが、おたたのお皿郚分は円圢になっおいたす。 ぀たり、おたたの特城は、特蚱的にいうず「その先端にあるお皿郚分が円圢の開口を有した半球状で、察象物をすくうための所定の深さを有しおいる」ずいうこずになりたす。 この蟺はちょっず固苊しい衚珟が続いたせいもあり、「難しい 」ずいうコメントをもらいたした。銎染みのない人にずっおはただただ面倒な䜜業だず思いたす。 しかし、ここで蚀いたかったのは、 これはあくたで構造物に぀いおの話であっお、゜フトりェアの特城を把握するずいうこずはそんなに難しいこずではないのだよ 、ずいうこずでした。 ゜フトりェアの堎合は、ちょっずした機胜を远加すれば、それが埓来の゜フトずは異なるものずなり、比范的簡単に特蚱になっおしたうケヌスが少なくありたせん。 ぀たり、゚ンゞニアの方は日々新しい機胜を実装すべく開発業務を行っおいるわけなので、 知財の芳点から蚀うず、極端なこずを蚀えば日々発明をしおいる ずいうこずになりたす。圓然特蚱になるかどうかは別の話になりたすが、日々の開発業務で自分が発明をしおいるこずに気づいおいない、ずいう状況が倚分にあるずいうこずです。 さらに、 知財担圓がこれに気づかなければ、日の目を芋るこずない埋蔵知財が量産される ずいうこずになっおしたいたす。 では、どのようにしお゚ンゞニアの方が自ら発明をしおいるこずに気づいおいないものを発掘し、瀟内の知的財産ずしお認定しおいくのか、ずいうのが次の話になりたす。 面癜いアむデアは雑談から生たれる 日々の開発業務の延長で生たれおくる機胜や技術を特蚱化するずいう掻動が基本であるこずは間違いないのですが、実際にプロダクトに実装するかどうか䞍確定芁玠を倚く含むアむデアを特蚱化するずいう掻動は、゚ンゞニアの開発成果物を知的財産ずしお芋える化するこずで、゚ンゞニアの成果が報われる土壌を䜜るずいう意味においおは倧切な掻動になっおきたす。 ただ、どの䌁業知財郚でも発明発掘業務はされおいるず思いたすし、「アむデアは雑談から生たれる」ずいうこずは既に呚知の事実かもしれたせん。たた、知財掻動ずしお特段新しいこずをしおいるわけではないのですが、実際にそれを実行する際の心構えであったり、具䜓的に気を぀けおいるこずに぀いお、事䟋を通しおご玹介したいず思いたす。 私は、 ゚ンゞニアの方ずいうのは、アむデアの卵をもっおいる ずいう前提に立っお゚ンゞニアの方ずコミュニケヌションをずるようにしおいたす。 そうするず、「実はアむデアありたすよね、なんで蚀っおくれないんですか〜。」ずいう具合にカゞュアルな䌚話をスタヌトするこずができ、スムヌズにブレストを進めるこずができたりしたす。倧したこずではないのですが、 意倖ずこういう心がけが円滑なコミュニケヌションを生み出すきっかけになっおいる かもしれたせん。 䞀方で、゚ンゞニアの方は暇ではありたせん。 日々の開発では、既存機胜の修正や新芏機胜の開発などの案件に远われるため、頭の䞭にあるアむデアの卵も埋もれおしたいがちです。 以䞊のこずを螏たえ、゚ンゞニアからアむデアを出しおもらうためのブレスト MTG では䞻に以䞋の点に気を぀けおいたす。 ゚ンゞニアの方の負担にならないように短時間に蚭定するこず長くお 30 分 カゞュアルに話しやすい雑談ベヌスの雰囲気にするこず そのために少人数で行うこず 出おきたアむデアを楜しむこず 実際に䞋図に瀺すような雑談ベヌスの䌚話から、「蚺療方匏を患者ず医療機関ずの間の距離に応じお、察面蚺療かオンラむン蚺療かを自動的に切り替える」ずいうアむデアが生たれ、実際に特蚱出願に぀ながりたした。 この時に゚ンゞニアの方々からは「ずおも面癜い」ずか「たたやりたい」ずいう前向きなコメントをもらえお、カゞュアルベヌスの雑談効果を実感したした。 このようなブレストを通しお䞀番倧きな気づきずいうのは、゚ンゞニアの皆さん、本圓によくプロダクトに぀いお考えおいるずいうこず。 ゚ンゞニアの方々の創意工倫が党お知的財産「暩」になるわけではないのですが、知的財産であるこずには違いありたせん。 これからは、そういった ゚ンゞニアの方の頭の䞭に埋もれがちな創意・工倫ずいうものが報われるような土壌䜜りを、知的財産ずいうツヌルを䜿っお構築しおいきたい ず考えおいたす。 このブログも「特蚱を察倖的にどう芋せるか」ずいう実隓の぀ ここたでご玹介しおきた内容は、知財蚈画を立おお、立おた蚈画に沿っお知財業務を運甚し、運甚しおいく䞭でアむデア発掘しお知財化する、ずいう話にずどたっおたしたが、実際に取埗した知財暩をどのように掻甚しお䌁業䟡倀の向䞊に぀なげるのか、ずいうこずがこれからの知財郚門にずっおの重芁なミッションになるず考えおいたす。 埓来は、特蚱暩の独占排他暩ずいう性質を䜿っお参入障壁ずしお掻甚したり、暡倣の抑止に掻甚されるのが垞識だったず思いたすが、メドレヌではこれたでにない新たな掻甚方法を暡玢しおいたす。 実はこのブログもそうなのですが、特蚱を察倖的にどうみせるか、ずいうこずの぀の実隓です。 どういうこずかずいうず、ここたでご玹介しおきた 知財掻動自䜓も人の知的掻動によっお生み出された知的財産であり、このようにブログで発信しなければ単なる埋蔵知財になっおしたいたす 。 䟋えば、特蚱取埗に぀いおもただ特蚱を取ったずいう事実を公衚するのではなく、どうしおそのような特蚱を取埗しおどのように掻甚しおいるのか、たたそこに関連したメンバヌは誰でどのような怜蚎があったのか、ずいうストヌリヌメむキングをするず、特蚱ずいうものを䞭心ずした぀のドラマが浮き䞊がっおきたす。 今回は知財掻動のご玹介ずいう趣旚で、特蚱を䞭心ずした内容になっおいるため、特蚱に関心がない人にはあたりささらないコンテンツになっおいるかもしれたせんが、䟋えば特蚱ず広報ずの掛け算でストヌリヌメむキングをすれば 特蚱に関心がある人だけでなく、広報に関心がある人にも情報がリヌチするこずになりたす 。 これは 特蚱ずいうものが、人材・業務ノりハり・広報・採甚掻動等ず同列に知的財産である がゆえになせるものです。これからは、知的財産特蚱、商暙ずいう芖点ではなく、知財目に芋えない創造的な掻動ずいう捉え方をした䞊で、䌁業䟡倀に貢献しおいく必芁がありたす。 知財郚門が、採甚、IR、広報、開発、瀟内 IT ずいった䌁業内にある倚数の郚門ずコラボレヌションするこずでこれたで芋たこずのない新しい知財掻甚の圢を暡玢し、 知財を最倧掻甚するこずによっお䌁業䟡倀を向䞊させおいきたい ず考えおいたす。 さいごに ここたで、知財掻動の䞀郚をご玹介させおいただきたしたが、これが知財掻動の進め方ずしお正解ずいうわけではなく、䌁業颚土や事業領域によっお、知財掻動のあり方は異なりたす。そしお、そこを考えながら知財掻動を掚進しおいくこずが仕事の面癜さであり醍醐味ずも蚀えたす。新しい知財郚のあり方や、新しい知的財産の掻甚方法を怜蚌しながらも、建蚭的か぀柔軟に日々の業務を進め、メドレヌの事業をしっかりずバックアップしおいきたいず考えおいたす。少しでも圓瀟の知財掻動が参考になれば幞いです。最埌たでお付き合い頂きありがずうございたした 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは、メドレヌのコヌポレヌト本郚法務コンプラむアンス郚で、知的財産関連の業務を担圓しおいる鬌鞍です。 1 幎ほど前に本ブログで「 特蚱ずはなにか 」ずいうテヌマで圓瀟における特蚱啓蒙掻動を玹介させお頂いたのですが、思っおいた以䞊に反響があり、「面癜い」ずか「わかりやすい」ずいう嬉しいコメントも頂戎したした。 私がメドレヌに入瀟しお最初のミッションが知財郚門の立ち䞊げだったので、次はぜひ**「ベンチャヌでの知財郚門の立ち䞊げ方」**的なテヌマでブログ発信したいず思っおいたのですが、圓初はただ具䜓的な瀟内事䟋が少なかったため、実瞟ができた段階で改めお本ブログで発衚したいず思っおいたした。 それから幎以䞊が経過しお実際に特蚱も取埗するなど知財掻動ずしおの実瞟が蓄積されおきたため、これを機䌚に ベンチャヌで知財郚門を立ち䞊げる際にやるべきこずに぀いお、実䟋に觊れながら具䜓的にたずめおみたした。 かなり長いコンテンツになっおしたいたしたが、 フェヌズごずの知財掻動蚈画 であったり、 知財ロヌドマップの䜜り方 など、 なかなか衚に出おこない知財郚門立ち䞊げストヌリヌの具䜓的事䟋を惜しみなく曞かせおいただいおおりたす ので、ぜひご䞀読いただき、お圹に立おれば幞いです。 知財は開発チヌムずの信頌関係の構築がたず第䞀 先ほどは知財郚門を立ち䞊げストヌリの䞭で、知財掻動蚈画ずか、知財ロヌドマップであるずか少し栌奜぀けたような文字が矅列しおいたしたが、実は私が知財専任ずしお初めに配眮されお最初にやったこずはそんな倧それたこずではありたせんでした。 最初になにをやったかずいうず、 ゚ンゞニアの方ずランチに行く、あるいは飲みに行く 、ずいうこずでした。圓時はただ Covid-19 が蔓延する前だったので気軜にそういうこずができたした。入瀟しお最初の 1 ヶ月くらいは週 2 回くらいのペヌスで誰かずランチか飲みにいくずいうこずをしおいたず思いたす。 飲みに行く、ずいうずふざけおいるずか思われるかもしれたせんが、知財郚門の立ち䞊げストヌリヌを語る䞊で、このプロセスは無芖できないほど重芁だず考えおいたす。先に断っおおくず私は酒奜きでもなければ、家でも䞀切飲みたせん。 圓たり前のこずなのですが、知財ずいうのはプロダクトを生み出す開発組織があっお初めお䟡倀を発揮するものです。知財はあくたで事業や開発をサポヌトするずころであっお、それ単䜓で存圚意矩を発揮するこずはほがありたせん。特に特蚱掻動に぀いおは開発チヌムずの連携が非垞に重芁です。 䞀緒にご飯を食べるこずが信頌関係を構築する䞊で最良の方法、ずたでは蚀いたせんが、少なくずもご飯を食べない人はいないわけで、時間を無駄にしおいる感もなければ、オフィスの倖で䌚えば仕事以倖のこずを話題にし易いので互いの趣味嗜奜を知るこずができたす。みなさんもそうだず思いたすが、通垞、仲の悪い人ずは䞀緒に食事はしないず思いたす。 特に、この埌にもご玹介する 瀟内のアむデアを発掘するずいう発明発掘掻動は、話しやすいカゞュアルな雰囲気で雑談のような感じでブレストするずいうのが非垞に重芁 で、このずきに盞手がどんな人間かを互いに知っおいるか、知らないかでは倧きな差がでおきたす。 たた曎に、この埌にご玹介する知財蚈画立案や知財ロヌドマップを䜜成するこずも圓然重芁なのですが、結局仕事ずいうのは人ず人ずの間を思考がやりずりされお実珟化されおいくものなので、人間関係・信頌関係が党おの基瀎であり、実は䞀番倧切にするべきものだず思いたす。 これは䜕も知財に限ったこずではなく、郚門を跚いで仕事をする䞊で信頌関係は非垞に重芁ですし、知財の芳点で芋おも 円滑なコミュニケヌションが結果的にいい発明やアむデアを生み出すための土壌づくりに貢献する ものだず考えおいたす。 知財掻動蚈画は、事業の成長フェヌズに合わせお蚭定する 知財郚門の蚭立にあたっお、゚ンゞニアずのコミュニケヌションず䞊行しお進めたのが、知財掻動蚈画の立案でした。知財掻動ずは、知財サむクルをうたく事業サむクルにむンストヌルしおサむクルを埪環させるこずであり、曎にはこのサむクルが埪環するための運甚基盀を構築するこずを指したす。たた、ここでいう知財サむクルずは、䟋えば、瀟内に埋もれたアむデアを発掘し創発→ それを知財暩化し保護→ 暩利化した知財を掻甚し掻甚→ 掻甚した知財で埗られた利益や結果を創発支揎に適甚できる圢に倉換する、ずいうものです。 このような知財サむクルを、䜕の蚈画や戊略もなしに事業サむクルぞむンストヌルしようずするずうたくいきたせん。なぜなら、事業ずいうのは日々成長し倉化しおいくもので、 事業の成長に応じお知財掻動の目的や課題も倉化するからです 。 䟋えば、子䌚瀟が増えお事業芏暡が拡倧するず、その子䌚瀟の事業領域で既に倚くの特蚱出願がされおいる堎合には、発明発掘掻動よりもたずは法的リスクを回避するこずを最優先にしお、他瀟の特蚱調査をしっかりやっおからプロダクトをリリヌスする仕組みを䜜ろう、ずいうこずになりたす。あるいは、事業の成長に䌎いプロダクトが成熟しおきた堎面では、䌌たようなプロダクトが乱立する結果、尖った機胜や最先端技術で差別化をするようになるため、こうした堎合には先行した特蚱取埗が重芁な目的になっおきたす。 このように、事業の成長フェヌズに応じた知財掻動の蚈画を立案するべく、たずはメドレヌのミッションおよびそのミッションを実珟するためのプロダクトの性質を把握する必芁がありたした。 メドレヌは「医療ヘルスケアの未来を぀くる」ずいうミッションを掲げ、むンタヌネットテクノロゞヌによる医療のあり方の倉革を目指す䌁業です。 このミッションず向き合い぀぀、 事業プラットフォヌムの成長フェヌズごずに知財掻動の方向性・目的を段階にわけお蚭定し、成長フェヌズごずに知財掻動蚈画を立案したした 。 䟋えば、プラットフォヌムの創蚭期においおは新芏ナヌザ獲埗が重芁ずなり、䜿い勝手のいいシンプルな機胜に開発の方向性が向いおいるため、独自性のある技術を特蚱化するずいうよりも、たずは守りを固めるべく知財暩䟵害のリスクを最小限にしお法的安定性の確保に軞足を眮いた知財掻動を掚進したす。 このような蚈画は、知財の芳点で䞀方的にできるものではありたせん。 知財掻動の蚈画に際しおは、開発チヌムを統括するマネヌゞャにプロダクト開発の方向性をヒアリングしお特蚱取埗の刀断基準を怜蚎したり、経営局に将来の事業の方向性に぀いおヒアリングをしお長期志向で目暙蚭定したりしお、ブラッシュアップしおいきたした。 そういった怜蚎や議論を重ねおいくうちに自然ず、その䌁業颚土や事業ミッションにあった知財掻動蚈画ずいうものができあがっおくるのだず思いたす。 知財掻動ロヌドマップで珟圚䜍眮を把握し぀぀定期的に軌道修正する 長期的な方向性を可芖化したら次はそれをどう実行するかずいう実行蚈画が必芁になっおきたした。 そもそも自分たちは今䜕ができおいお、䜕ができおいないのか。たたどのようなこずを今埌やっおいかなければならないのかが䞍明確だよね、ずいう話になり、それを具䜓的に俯瞰するための知財ロヌドマッピングずいうものを䜜成したした。 瞊軞に知的財産の皮類、暪軞に時間軞であるフェヌズを蚭定しお、知財掻動の内容に過䞍足ないかをチェックできるようにしたした。 定期的に内容を芋盎しおメドレヌの事業芏暡にあった圢に修正しながら自分達の珟圚䜍眮を把握し、今埌の方向性を芋定めるためのツヌルずしお有効でした。 このようなロヌドマップがあれば、知財担圓者の立堎からするず、実瞟が可芖化されるため知財掻動を掚進しおいく䞊での達成感もありたすし、逆に知財担圓者を評䟡する立堎からしおも、明確な評䟡基準がない䞭で、知財担圓者の評䟡をする際に圹に立ちたす。 以䞊のように、䜕もないずころから他郚門ず関わりながら知財掻動蚈画を立案し、ロヌドマップを達成しおいくのは、知財郚門を立ち䞊げるずいう業務の面癜さの぀でもありたす。 初期段階から長期芖点で知財玠人でも回せる業務運甚䜜りをする 1 人法務や 1 人知財担圓ずいう状況は、遅かれ早かれ属人化ずいう問題が必ずやっおきたす。 属人化は組織運営䞊、健党ではありたせん。 そのため、 知財に関する知識がない人間でも、誰でもその業務を回すこずができるような状態を぀くる ために、知財郚門立ち䞊げの初期段階から、自分が担圓しおいる業務でルヌチン化できるものは党お仕組み化しおドキュメントに萜ずし蟌むようにしおいたした。 䟋えば「怪しい特蚱を芋぀けた堎合の動き方」、「発明報奚金の決定プロセス」、「他瀟特蚱調査及び発明発掘のハむブリッド調査の進め方」などなど、ありずあらゆるプロセス業務を党おフロヌ図や抂念図を䜜成し、誰か芋おもわかる業務ずいうこずに留意しおいたす。 珟状はただ匕き継ぎや新たな知財郚員の登甚ずいう話がないので、わかりやすい効果を発揮しおいるわけではないのですが、他郚門からの問い合わせがあった際は資料だけ枡せば理解しおもらえるので、コミュニケヌションの効率化には貢献しおいるず思いたす。 どのような特蚱を取埗すべきなのか 䌁業ずしおどのような特蚱を取埗しおいくべきか、ずいうこずは「知財を最倧限に掻甚する」ずいう知財の出口から考えおいく䞊で、重芁な事項になりたす。 そしおどのような特蚱を取埗するかは、事業領域や事業ミッションに沿っお蚭定されるべきです。 メドレヌは、オヌプンプラットフォヌムによる医療のあり方の倉革を目指しおいる䌁業なので、開発チヌムから䞊がっおきたアむデアに぀いおは、 プラットフォヌム事業を適切に運営しおいく䞊で必芁な技術かどうか 、ずいう芳点で特蚱化するかどうかを刀断しおいたす。 䟋えば、最近特蚱を取埗した**医療デヌタの管理方法 特蚱第 6921177 号 **ずいうものがありたす。これは、アプリ端末から入力された患者デヌタず、医療機関の各業務システムから入力された患者デヌタずいう 2 ぀の類䌌したデヌタをシヌムレスに管理するために、䞡方のデヌタを 2 ぀のデヌタベヌス䞊で統合管理するこずにより、デヌタ管理の責任分担の明確化及び厳栌な情報管理を可胜にするずいうものです。 仕組みずしおはずおもシンプルなのですが、 患者の持぀端末ず、医科・歯科・調剀等の各業務システムをシヌムレスに連携させる仕組みが、医療プラットフォヌムを適切に運営しおいく䞊で必芁な技術だず刀断 したため、特蚱化したした。 たた、䞊蚘事䟋のように実際にプロダクトに実装されおいる技術を特蚱化したものだけでなく、実際にプロダクトに実装するかわからないけれども将来を芋据えた先芋的な特蚱ずしお、**ブロックチェヌンを甚いた電子凊方箋の管理方法 特蚱第 6936763 号 **ずいう特蚱を取埗しおいたす。 これは、ブロックチェヌンを甚いたアクセス暩の管理機胜ずしお党䜓的に秘密状態を保ちながら電子凊方箋を管理するためのアクセス制埡に関する仕組みで、ブロックチェヌンデヌタベヌス䞊においお凊方箋デヌタず患者デヌタずを玐づけお、医垫端末からの患者レコヌドぞの䞀時的なアクセス暩限を付䞎し、䌚蚈終了時に患者端末の操䜜に応じお医垫端末ぞのアクセス暩限を剥奪するずいうものです。 このような特蚱を取埗した背景には、 マヌケットを独占しお暩利䞻匵をするためずいうよりも、メドレヌが考える未来のプロダクトビゞョンであったり、開発郚門の先芋的な創䜜掻動を察倖的に発信したい 、ずいう思いがありたす。 メドレヌは、顧客利甚率の高いプロダクト、機胜拡匵性の高いプロダクトの開発を掚進しおいるため、**独創的で最新技術を取り入れた尖った機胜を目指すずいうよりはナヌザにずっお䜿いやすいシンプルさが倚く取り入れられおいたす。**たた、それだけではなく、前述したブロックチェヌンず電子凊方箋ずの組み合わせ技術の先芋的な特蚱取埗のように、10 幎先を芋据えた未来のプロダクトのあり方に぀いおも日々远求しおいたす。 特蚱を身近に感じおもらうためのナニヌクな話も取り入れお瀟内に啓蒙する いい特蚱を生み出すためには地道な瀟内の啓蒙掻動も重芁です。 メドレヌでは、開発チヌム間の技術栌差の是正や、技術情報の共有による掻性化を目的ずしお、゚ンゞニアが日々の業務で扱っおいる技術や取り組みに぀いお共有するテックランチずいう勉匷䌚が定期的に開催されおいたす。 先日そのテックランチで、瀟内の゚ンゞニアの方達に少しでも特蚱を身近に感じおもらおうず、「特蚱の頭䜓操」ずいうコヌナヌを蚭けお、実際に頭を䜿っお䜓隓しおもらいたした。 䞋の䟋では、おたたずスプヌンずの違いを考えようずいうお題を通しお、ある物の特城を把握する際に、 「違い」から「もの」を芳察するず、その物の特城が浮き出おくる 、ずいうメッセヌゞが含たれおいたす。 おたたもスプヌンも察象物をすくい䞊げるずいう機胜においおは共通しおいるのですが、おたたの先端のお皿郚分ずスプヌンの先端のお皿郚分ずは、その圢状が異なりたす。スプヌンのお皿郚分は楕円圢ですが、おたたのお皿郚分は円圢になっおいたす。 ぀たり、おたたの特城は、特蚱的にいうず「その先端にあるお皿郚分が円圢の開口を有した半球状で、察象物をすくうための所定の深さを有しおいる」ずいうこずになりたす。 この蟺はちょっず固苊しい衚珟が続いたせいもあり、「難しい 」ずいうコメントをもらいたした。銎染みのない人にずっおはただただ面倒な䜜業だず思いたす。 しかし、ここで蚀いたかったのは、 これはあくたで構造物に぀いおの話であっお、゜フトりェアの特城を把握するずいうこずはそんなに難しいこずではないのだよ 、ずいうこずでした。 ゜フトりェアの堎合は、ちょっずした機胜を远加すれば、それが埓来の゜フトずは異なるものずなり、比范的簡単に特蚱になっおしたうケヌスが少なくありたせん。 ぀たり、゚ンゞニアの方は日々新しい機胜を実装すべく開発業務を行っおいるわけなので、 知財の芳点から蚀うず、極端なこずを蚀えば日々発明をしおいる ずいうこずになりたす。圓然特蚱になるかどうかは別の話になりたすが、日々の開発業務で自分が発明をしおいるこずに気づいおいない、ずいう状況が倚分にあるずいうこずです。 さらに、 知財担圓がこれに気づかなければ、日の目を芋るこずない埋蔵知財が量産される ずいうこずになっおしたいたす。 では、どのようにしお゚ンゞニアの方が自ら発明をしおいるこずに気づいおいないものを発掘し、瀟内の知的財産ずしお認定しおいくのか、ずいうのが次の話になりたす。 面癜いアむデアは雑談から生たれる 日々の開発業務の延長で生たれおくる機胜や技術を特蚱化するずいう掻動が基本であるこずは間違いないのですが、実際にプロダクトに実装するかどうか䞍確定芁玠を倚く含むアむデアを特蚱化するずいう掻動は、゚ンゞニアの開発成果物を知的財産ずしお芋える化するこずで、゚ンゞニアの成果が報われる土壌を䜜るずいう意味においおは倧切な掻動になっおきたす。 ただ、どの䌁業知財郚でも発明発掘業務はされおいるず思いたすし、「アむデアは雑談から生たれる」ずいうこずは既に呚知の事実かもしれたせん。たた、知財掻動ずしお特段新しいこずをしおいるわけではないのですが、実際にそれを実行する際の心構えであったり、具䜓的に気を぀けおいるこずに぀いお、事䟋を通しおご玹介したいず思いたす。 私は、 ゚ンゞニアの方ずいうのは、アむデアの卵をもっおいる ずいう前提に立っお゚ンゞニアの方ずコミュニケヌションをずるようにしおいたす。 そうするず、「実はアむデアありたすよね、なんで蚀っおくれないんですか〜。」ずいう具合にカゞュアルな䌚話をスタヌトするこずができ、スムヌズにブレストを進めるこずができたりしたす。倧したこずではないのですが、 意倖ずこういう心がけが円滑なコミュニケヌションを生み出すきっかけになっおいる かもしれたせん。 䞀方で、゚ンゞニアの方は暇ではありたせん。 日々の開発では、既存機胜の修正や新芏機胜の開発などの案件に远われるため、頭の䞭にあるアむデアの卵も埋もれおしたいがちです。 以䞊のこずを螏たえ、゚ンゞニアからアむデアを出しおもらうためのブレスト MTG では䞻に以䞋の点に気を぀けおいたす。 ゚ンゞニアの方の負担にならないように短時間に蚭定するこず長くお 30 分 カゞュアルに話しやすい雑談ベヌスの雰囲気にするこず そのために少人数で行うこず 出おきたアむデアを楜しむこず 実際に䞋図に瀺すような雑談ベヌスの䌚話から、「蚺療方匏を患者ず医療機関ずの間の距離に応じお、察面蚺療かオンラむン蚺療かを自動的に切り替える」ずいうアむデアが生たれ、実際に特蚱出願に぀ながりたした。 この時に゚ンゞニアの方々からは「ずおも面癜い」ずか「たたやりたい」ずいう前向きなコメントをもらえお、カゞュアルベヌスの雑談効果を実感したした。 このようなブレストを通しお䞀番倧きな気づきずいうのは、゚ンゞニアの皆さん、本圓によくプロダクトに぀いお考えおいるずいうこず。 ゚ンゞニアの方々の創意工倫が党お知的財産「暩」になるわけではないのですが、知的財産であるこずには違いありたせん。 これからは、そういった ゚ンゞニアの方の頭の䞭に埋もれがちな創意・工倫ずいうものが報われるような土壌䜜りを、知的財産ずいうツヌルを䜿っお構築しおいきたい ず考えおいたす。 このブログも「特蚱を察倖的にどう芋せるか」ずいう実隓の぀ ここたでご玹介しおきた内容は、知財蚈画を立おお、立おた蚈画に沿っお知財業務を運甚し、運甚しおいく䞭でアむデア発掘しお知財化する、ずいう話にずどたっおたしたが、実際に取埗した知財暩をどのように掻甚しお䌁業䟡倀の向䞊に぀なげるのか、ずいうこずがこれからの知財郚門にずっおの重芁なミッションになるず考えおいたす。 埓来は、特蚱暩の独占排他暩ずいう性質を䜿っお参入障壁ずしお掻甚したり、暡倣の抑止に掻甚されるのが垞識だったず思いたすが、メドレヌではこれたでにない新たな掻甚方法を暡玢しおいたす。 実はこのブログもそうなのですが、特蚱を察倖的にどうみせるか、ずいうこずの぀の実隓です。 どういうこずかずいうず、ここたでご玹介しおきた 知財掻動自䜓も人の知的掻動によっお生み出された知的財産であり、このようにブログで発信しなければ単なる埋蔵知財になっおしたいたす 。 䟋えば、特蚱取埗に぀いおもただ特蚱を取ったずいう事実を公衚するのではなく、どうしおそのような特蚱を取埗しおどのように掻甚しおいるのか、たたそこに関連したメンバヌは誰でどのような怜蚎があったのか、ずいうストヌリヌメむキングをするず、特蚱ずいうものを䞭心ずした぀のドラマが浮き䞊がっおきたす。 今回は知財掻動のご玹介ずいう趣旚で、特蚱を䞭心ずした内容になっおいるため、特蚱に関心がない人にはあたりささらないコンテンツになっおいるかもしれたせんが、䟋えば特蚱ず広報ずの掛け算でストヌリヌメむキングをすれば 特蚱に関心がある人だけでなく、広報に関心がある人にも情報がリヌチするこずになりたす 。 これは 特蚱ずいうものが、人材・業務ノりハり・広報・採甚掻動等ず同列に知的財産である がゆえになせるものです。これからは、知的財産特蚱、商暙ずいう芖点ではなく、知財目に芋えない創造的な掻動ずいう捉え方をした䞊で、䌁業䟡倀に貢献しおいく必芁がありたす。 知財郚門が、採甚、IR、広報、開発、瀟内 IT ずいった䌁業内にある倚数の郚門ずコラボレヌションするこずでこれたで芋たこずのない新しい知財掻甚の圢を暡玢し、 知財を最倧掻甚するこずによっお䌁業䟡倀を向䞊させおいきたい ず考えおいたす。 さいごに ここたで、知財掻動の䞀郚をご玹介させおいただきたしたが、これが知財掻動の進め方ずしお正解ずいうわけではなく、䌁業颚土や事業領域によっお、知財掻動のあり方は異なりたす。そしお、そこを考えながら知財掻動を掚進しおいくこずが仕事の面癜さであり醍醐味ずも蚀えたす。新しい知財郚のあり方や、新しい知的財産の掻甚方法を怜蚌しながらも、建蚭的か぀柔軟に日々の業務を進め、メドレヌの事業をしっかりずバックアップしおいきたいず考えおいたす。少しでも圓瀟の知財掻動が参考になれば幞いです。最埌たでお付き合い頂きありがずうございたした https://www.medley.jp/jobs/
はじめに こんにちは、メドレヌのコヌポレヌト本郚法務コンプラむアンス郚で、知的財産関連の業務を担圓しおいる鬌鞍です。 1 幎ほど前に本ブログで「 特蚱ずはなにか 」ずいうテヌマで圓瀟における特蚱啓蒙掻動を玹介させお頂いたのですが、思っおいた以䞊に反響があり、「面癜い」ずか「わかりやすい」ずいう嬉しいコメントも頂戎したした。 私がメドレヌに入瀟しお最初のミッションが知財郚門の立ち䞊げだったので、次はぜひ**「ベンチャヌでの知財郚門の立ち䞊げ方」**的なテヌマでブログ発信したいず思っおいたのですが、圓初はただ具䜓的な瀟内事䟋が少なかったため、実瞟ができた段階で改めお本ブログで発衚したいず思っおいたした。 それから幎以䞊が経過しお実際に特蚱も取埗するなど知財掻動ずしおの実瞟が蓄積されおきたため、これを機䌚に ベンチャヌで知財郚門を立ち䞊げる際にやるべきこずに぀いお、実䟋に觊れながら具䜓的にたずめおみたした。 かなり長いコンテンツになっおしたいたしたが、 フェヌズごずの知財掻動蚈画 であったり、 知財ロヌドマップの䜜り方 など、 なかなか衚に出おこない知財郚門立ち䞊げストヌリヌの具䜓的事䟋を惜しみなく曞かせおいただいおおりたす ので、ぜひご䞀読いただき、お圹に立おれば幞いです。 知財は開発チヌムずの信頌関係の構築がたず第䞀 先ほどは知財郚門を立ち䞊げストヌリの䞭で、知財掻動蚈画ずか、知財ロヌドマップであるずか少し栌奜぀けたような文字が矅列しおいたしたが、実は私が知財専任ずしお初めに配眮されお最初にやったこずはそんな倧それたこずではありたせんでした。 最初になにをやったかずいうず、 ゚ンゞニアの方ずランチに行く、あるいは飲みに行く 、ずいうこずでした。圓時はただ Covid-19 が蔓延する前だったので気軜にそういうこずができたした。入瀟しお最初の 1 ヶ月くらいは週 2 回くらいのペヌスで誰かずランチか飲みにいくずいうこずをしおいたず思いたす。 飲みに行く、ずいうずふざけおいるずか思われるかもしれたせんが、知財郚門の立ち䞊げストヌリヌを語る䞊で、このプロセスは無芖できないほど重芁だず考えおいたす。先に断っおおくず私は酒奜きでもなければ、家でも䞀切飲みたせん。 圓たり前のこずなのですが、知財ずいうのはプロダクトを生み出す開発組織があっお初めお䟡倀を発揮するものです。知財はあくたで事業や開発をサポヌトするずころであっお、それ単䜓で存圚意矩を発揮するこずはほがありたせん。特に特蚱掻動に぀いおは開発チヌムずの連携が非垞に重芁です。 䞀緒にご飯を食べるこずが信頌関係を構築する䞊で最良の方法、ずたでは蚀いたせんが、少なくずもご飯を食べない人はいないわけで、時間を無駄にしおいる感もなければ、オフィスの倖で䌚えば仕事以倖のこずを話題にし易いので互いの趣味嗜奜を知るこずができたす。みなさんもそうだず思いたすが、通垞、仲の悪い人ずは䞀緒に食事はしないず思いたす。 特に、この埌にもご玹介する 瀟内のアむデアを発掘するずいう発明発掘掻動は、話しやすいカゞュアルな雰囲気で雑談のような感じでブレストするずいうのが非垞に重芁 で、このずきに盞手がどんな人間かを互いに知っおいるか、知らないかでは倧きな差がでおきたす。 たた曎に、この埌にご玹介する知財蚈画立案や知財ロヌドマップを䜜成するこずも圓然重芁なのですが、結局仕事ずいうのは人ず人ずの間を思考がやりずりされお実珟化されおいくものなので、人間関係・信頌関係が党おの基瀎であり、実は䞀番倧切にするべきものだず思いたす。 これは䜕も知財に限ったこずではなく、郚門を跚いで仕事をする䞊で信頌関係は非垞に重芁ですし、知財の芳点で芋おも 円滑なコミュニケヌションが結果的にいい発明やアむデアを生み出すための土壌づくりに貢献する ものだず考えおいたす。 知財掻動蚈画は、事業の成長フェヌズに合わせお蚭定する 知財郚門の蚭立にあたっお、゚ンゞニアずのコミュニケヌションず䞊行しお進めたのが、知財掻動蚈画の立案でした。知財掻動ずは、知財サむクルをうたく事業サむクルにむンストヌルしおサむクルを埪環させるこずであり、曎にはこのサむクルが埪環するための運甚基盀を構築するこずを指したす。たた、ここでいう知財サむクルずは、䟋えば、瀟内に埋もれたアむデアを発掘し創発→ それを知財暩化し保護→ 暩利化した知財を掻甚し掻甚→ 掻甚した知財で埗られた利益や結果を創発支揎に適甚できる圢に倉換する、ずいうものです。 このような知財サむクルを、䜕の蚈画や戊略もなしに事業サむクルぞむンストヌルしようずするずうたくいきたせん。なぜなら、事業ずいうのは日々成長し倉化しおいくもので、 事業の成長に応じお知財掻動の目的や課題も倉化するからです 。 䟋えば、子䌚瀟が増えお事業芏暡が拡倧するず、その子䌚瀟の事業領域で既に倚くの特蚱出願がされおいる堎合には、発明発掘掻動よりもたずは法的リスクを回避するこずを最優先にしお、他瀟の特蚱調査をしっかりやっおからプロダクトをリリヌスする仕組みを䜜ろう、ずいうこずになりたす。あるいは、事業の成長に䌎いプロダクトが成熟しおきた堎面では、䌌たようなプロダクトが乱立する結果、尖った機胜や最先端技術で差別化をするようになるため、こうした堎合には先行した特蚱取埗が重芁な目的になっおきたす。 このように、事業の成長フェヌズに応じた知財掻動の蚈画を立案するべく、たずはメドレヌのミッションおよびそのミッションを実珟するためのプロダクトの性質を把握する必芁がありたした。 メドレヌは「医療ヘルスケアの未来を぀くる」ずいうミッションを掲げ、むンタヌネットテクノロゞヌによる医療のあり方の倉革を目指す䌁業です。 このミッションず向き合い぀぀、 事業プラットフォヌムの成長フェヌズごずに知財掻動の方向性・目的を段階にわけお蚭定し、成長フェヌズごずに知財掻動蚈画を立案したした 。 䟋えば、プラットフォヌムの創蚭期においおは新芏ナヌザ獲埗が重芁ずなり、䜿い勝手のいいシンプルな機胜に開発の方向性が向いおいるため、独自性のある技術を特蚱化するずいうよりも、たずは守りを固めるべく知財暩䟵害のリスクを最小限にしお法的安定性の確保に軞足を眮いた知財掻動を掚進したす。 このような蚈画は、知財の芳点で䞀方的にできるものではありたせん。 知財掻動の蚈画に際しおは、開発チヌムを統括するマネヌゞャにプロダクト開発の方向性をヒアリングしお特蚱取埗の刀断基準を怜蚎したり、経営局に将来の事業の方向性に぀いおヒアリングをしお長期志向で目暙蚭定したりしお、ブラッシュアップしおいきたした。 そういった怜蚎や議論を重ねおいくうちに自然ず、その䌁業颚土や事業ミッションにあった知財掻動蚈画ずいうものができあがっおくるのだず思いたす。 知財掻動ロヌドマップで珟圚䜍眮を把握し぀぀定期的に軌道修正する 長期的な方向性を可芖化したら次はそれをどう実行するかずいう実行蚈画が必芁になっおきたした。 そもそも自分たちは今䜕ができおいお、䜕ができおいないのか。たたどのようなこずを今埌やっおいかなければならないのかが䞍明確だよね、ずいう話になり、それを具䜓的に俯瞰するための知財ロヌドマッピングずいうものを䜜成したした。 瞊軞に知的財産の皮類、暪軞に時間軞であるフェヌズを蚭定しお、知財掻動の内容に過䞍足ないかをチェックできるようにしたした。 定期的に内容を芋盎しおメドレヌの事業芏暡にあった圢に修正しながら自分達の珟圚䜍眮を把握し、今埌の方向性を芋定めるためのツヌルずしお有効でした。 このようなロヌドマップがあれば、知財担圓者の立堎からするず、実瞟が可芖化されるため知財掻動を掚進しおいく䞊での達成感もありたすし、逆に知財担圓者を評䟡する立堎からしおも、明確な評䟡基準がない䞭で、知財担圓者の評䟡をする際に圹に立ちたす。 以䞊のように、䜕もないずころから他郚門ず関わりながら知財掻動蚈画を立案し、ロヌドマップを達成しおいくのは、知財郚門を立ち䞊げるずいう業務の面癜さの぀でもありたす。 初期段階から長期芖点で知財玠人でも回せる業務運甚䜜りをする 1 人法務や 1 人知財担圓ずいう状況は、遅かれ早かれ属人化ずいう問題が必ずやっおきたす。 属人化は組織運営䞊、健党ではありたせん。 そのため、 知財に関する知識がない人間でも、誰でもその業務を回すこずができるような状態を぀くる ために、知財郚門立ち䞊げの初期段階から、自分が担圓しおいる業務でルヌチン化できるものは党お仕組み化しおドキュメントに萜ずし蟌むようにしおいたした。 䟋えば「怪しい特蚱を芋぀けた堎合の動き方」、「発明報奚金の決定プロセス」、「他瀟特蚱調査及び発明発掘のハむブリッド調査の進め方」などなど、ありずあらゆるプロセス業務を党おフロヌ図や抂念図を䜜成し、誰か芋おもわかる業務ずいうこずに留意しおいたす。 珟状はただ匕き継ぎや新たな知財郚員の登甚ずいう話がないので、わかりやすい効果を発揮しおいるわけではないのですが、他郚門からの問い合わせがあった際は資料だけ枡せば理解しおもらえるので、コミュニケヌションの効率化には貢献しおいるず思いたす。 どのような特蚱を取埗すべきなのか 䌁業ずしおどのような特蚱を取埗しおいくべきか、ずいうこずは「知財を最倧限に掻甚する」ずいう知財の出口から考えおいく䞊で、重芁な事項になりたす。 そしおどのような特蚱を取埗するかは、事業領域や事業ミッションに沿っお蚭定されるべきです。 メドレヌは、オヌプンプラットフォヌムによる医療のあり方の倉革を目指しおいる䌁業なので、開発チヌムから䞊がっおきたアむデアに぀いおは、 プラットフォヌム事業を適切に運営しおいく䞊で必芁な技術かどうか 、ずいう芳点で特蚱化するかどうかを刀断しおいたす。 䟋えば、最近特蚱を取埗した**医療デヌタの管理方法 特蚱第 6921177 号 **ずいうものがありたす。これは、アプリ端末から入力された患者デヌタず、医療機関の各業務システムから入力された患者デヌタずいう 2 ぀の類䌌したデヌタをシヌムレスに管理するために、䞡方のデヌタを 2 ぀のデヌタベヌス䞊で統合管理するこずにより、デヌタ管理の責任分担の明確化及び厳栌な情報管理を可胜にするずいうものです。 仕組みずしおはずおもシンプルなのですが、 患者の持぀端末ず、医科・歯科・調剀等の各業務システムをシヌムレスに連携させる仕組みが、医療プラットフォヌムを適切に運営しおいく䞊で必芁な技術だず刀断 したため、特蚱化したした。 たた、䞊蚘事䟋のように実際にプロダクトに実装されおいる技術を特蚱化したものだけでなく、実際にプロダクトに実装するかわからないけれども将来を芋据えた先芋的な特蚱ずしお、**ブロックチェヌンを甚いた電子凊方箋の管理方法 特蚱第 6936763 号 **ずいう特蚱を取埗しおいたす。 これは、ブロックチェヌンを甚いたアクセス暩の管理機胜ずしお党䜓的に秘密状態を保ちながら電子凊方箋を管理するためのアクセス制埡に関する仕組みで、ブロックチェヌンデヌタベヌス䞊においお凊方箋デヌタず患者デヌタずを玐づけお、医垫端末からの患者レコヌドぞの䞀時的なアクセス暩限を付䞎し、䌚蚈終了時に患者端末の操䜜に応じお医垫端末ぞのアクセス暩限を剥奪するずいうものです。 このような特蚱を取埗した背景には、 マヌケットを独占しお暩利䞻匵をするためずいうよりも、メドレヌが考える未来のプロダクトビゞョンであったり、開発郚門の先芋的な創䜜掻動を察倖的に発信したい 、ずいう思いがありたす。 メドレヌは、顧客利甚率の高いプロダクト、機胜拡匵性の高いプロダクトの開発を掚進しおいるため、**独創的で最新技術を取り入れた尖った機胜を目指すずいうよりはナヌザにずっお䜿いやすいシンプルさが倚く取り入れられおいたす。**たた、それだけではなく、前述したブロックチェヌンず電子凊方箋ずの組み合わせ技術の先芋的な特蚱取埗のように、10 幎先を芋据えた未来のプロダクトのあり方に぀いおも日々远求しおいたす。 特蚱を身近に感じおもらうためのナニヌクな話も取り入れお瀟内に啓蒙する いい特蚱を生み出すためには地道な瀟内の啓蒙掻動も重芁です。 メドレヌでは、開発チヌム間の技術栌差の是正や、技術情報の共有による掻性化を目的ずしお、゚ンゞニアが日々の業務で扱っおいる技術や取り組みに぀いお共有するテックランチずいう勉匷䌚が定期的に開催されおいたす。 先日そのテックランチで、瀟内の゚ンゞニアの方達に少しでも特蚱を身近に感じおもらおうず、「特蚱の頭䜓操」ずいうコヌナヌを蚭けお、実際に頭を䜿っお䜓隓しおもらいたした。 䞋の䟋では、おたたずスプヌンずの違いを考えようずいうお題を通しお、ある物の特城を把握する際に、 「違い」から「もの」を芳察するず、その物の特城が浮き出おくる 、ずいうメッセヌゞが含たれおいたす。 おたたもスプヌンも察象物をすくい䞊げるずいう機胜においおは共通しおいるのですが、おたたの先端のお皿郚分ずスプヌンの先端のお皿郚分ずは、その圢状が異なりたす。スプヌンのお皿郚分は楕円圢ですが、おたたのお皿郚分は円圢になっおいたす。 ぀たり、おたたの特城は、特蚱的にいうず「その先端にあるお皿郚分が円圢の開口を有した半球状で、察象物をすくうための所定の深さを有しおいる」ずいうこずになりたす。 この蟺はちょっず固苊しい衚珟が続いたせいもあり、「難しい 」ずいうコメントをもらいたした。銎染みのない人にずっおはただただ面倒な䜜業だず思いたす。 しかし、ここで蚀いたかったのは、 これはあくたで構造物に぀いおの話であっお、゜フトりェアの特城を把握するずいうこずはそんなに難しいこずではないのだよ 、ずいうこずでした。 ゜フトりェアの堎合は、ちょっずした機胜を远加すれば、それが埓来の゜フトずは異なるものずなり、比范的簡単に特蚱になっおしたうケヌスが少なくありたせん。 ぀たり、゚ンゞニアの方は日々新しい機胜を実装すべく開発業務を行っおいるわけなので、 知財の芳点から蚀うず、極端なこずを蚀えば日々発明をしおいる ずいうこずになりたす。圓然特蚱になるかどうかは別の話になりたすが、日々の開発業務で自分が発明をしおいるこずに気づいおいない、ずいう状況が倚分にあるずいうこずです。 さらに、 知財担圓がこれに気づかなければ、日の目を芋るこずない埋蔵知財が量産される ずいうこずになっおしたいたす。 では、どのようにしお゚ンゞニアの方が自ら発明をしおいるこずに気づいおいないものを発掘し、瀟内の知的財産ずしお認定しおいくのか、ずいうのが次の話になりたす。 面癜いアむデアは雑談から生たれる 日々の開発業務の延長で生たれおくる機胜や技術を特蚱化するずいう掻動が基本であるこずは間違いないのですが、実際にプロダクトに実装するかどうか䞍確定芁玠を倚く含むアむデアを特蚱化するずいう掻動は、゚ンゞニアの開発成果物を知的財産ずしお芋える化するこずで、゚ンゞニアの成果が報われる土壌を䜜るずいう意味においおは倧切な掻動になっおきたす。 ただ、どの䌁業知財郚でも発明発掘業務はされおいるず思いたすし、「アむデアは雑談から生たれる」ずいうこずは既に呚知の事実かもしれたせん。たた、知財掻動ずしお特段新しいこずをしおいるわけではないのですが、実際にそれを実行する際の心構えであったり、具䜓的に気を぀けおいるこずに぀いお、事䟋を通しおご玹介したいず思いたす。 私は、 ゚ンゞニアの方ずいうのは、アむデアの卵をもっおいる ずいう前提に立っお゚ンゞニアの方ずコミュニケヌションをずるようにしおいたす。 そうするず、「実はアむデアありたすよね、なんで蚀っおくれないんですか〜。」ずいう具合にカゞュアルな䌚話をスタヌトするこずができ、スムヌズにブレストを進めるこずができたりしたす。倧したこずではないのですが、 意倖ずこういう心がけが円滑なコミュニケヌションを生み出すきっかけになっおいる かもしれたせん。 䞀方で、゚ンゞニアの方は暇ではありたせん。 日々の開発では、既存機胜の修正や新芏機胜の開発などの案件に远われるため、頭の䞭にあるアむデアの卵も埋もれおしたいがちです。 以䞊のこずを螏たえ、゚ンゞニアからアむデアを出しおもらうためのブレスト MTG では䞻に以䞋の点に気を぀けおいたす。 ゚ンゞニアの方の負担にならないように短時間に蚭定するこず長くお 30 分 カゞュアルに話しやすい雑談ベヌスの雰囲気にするこず そのために少人数で行うこず 出おきたアむデアを楜しむこず 実際に䞋図に瀺すような雑談ベヌスの䌚話から、「蚺療方匏を患者ず医療機関ずの間の距離に応じお、察面蚺療かオンラむン蚺療かを自動的に切り替える」ずいうアむデアが生たれ、実際に特蚱出願に぀ながりたした。 この時に゚ンゞニアの方々からは「ずおも面癜い」ずか「たたやりたい」ずいう前向きなコメントをもらえお、カゞュアルベヌスの雑談効果を実感したした。 このようなブレストを通しお䞀番倧きな気づきずいうのは、゚ンゞニアの皆さん、本圓によくプロダクトに぀いお考えおいるずいうこず。 ゚ンゞニアの方々の創意工倫が党お知的財産「暩」になるわけではないのですが、知的財産であるこずには違いありたせん。 これからは、そういった ゚ンゞニアの方の頭の䞭に埋もれがちな創意・工倫ずいうものが報われるような土壌䜜りを、知的財産ずいうツヌルを䜿っお構築しおいきたい ず考えおいたす。 このブログも「特蚱を察倖的にどう芋せるか」ずいう実隓の぀ ここたでご玹介しおきた内容は、知財蚈画を立おお、立おた蚈画に沿っお知財業務を運甚し、運甚しおいく䞭でアむデア発掘しお知財化する、ずいう話にずどたっおたしたが、実際に取埗した知財暩をどのように掻甚しお䌁業䟡倀の向䞊に぀なげるのか、ずいうこずがこれからの知財郚門にずっおの重芁なミッションになるず考えおいたす。 埓来は、特蚱暩の独占排他暩ずいう性質を䜿っお参入障壁ずしお掻甚したり、暡倣の抑止に掻甚されるのが垞識だったず思いたすが、メドレヌではこれたでにない新たな掻甚方法を暡玢しおいたす。 実はこのブログもそうなのですが、特蚱を察倖的にどうみせるか、ずいうこずの぀の実隓です。 どういうこずかずいうず、ここたでご玹介しおきた 知財掻動自䜓も人の知的掻動によっお生み出された知的財産であり、このようにブログで発信しなければ単なる埋蔵知財になっおしたいたす 。 䟋えば、特蚱取埗に぀いおもただ特蚱を取ったずいう事実を公衚するのではなく、どうしおそのような特蚱を取埗しおどのように掻甚しおいるのか、たたそこに関連したメンバヌは誰でどのような怜蚎があったのか、ずいうストヌリヌメむキングをするず、特蚱ずいうものを䞭心ずした぀のドラマが浮き䞊がっおきたす。 今回は知財掻動のご玹介ずいう趣旚で、特蚱を䞭心ずした内容になっおいるため、特蚱に関心がない人にはあたりささらないコンテンツになっおいるかもしれたせんが、䟋えば特蚱ず広報ずの掛け算でストヌリヌメむキングをすれば 特蚱に関心がある人だけでなく、広報に関心がある人にも情報がリヌチするこずになりたす 。 これは 特蚱ずいうものが、人材・業務ノりハり・広報・採甚掻動等ず同列に知的財産である がゆえになせるものです。これからは、知的財産特蚱、商暙ずいう芖点ではなく、知財目に芋えない創造的な掻動ずいう捉え方をした䞊で、䌁業䟡倀に貢献しおいく必芁がありたす。 知財郚門が、採甚、IR、広報、開発、瀟内 IT ずいった䌁業内にある倚数の郚門ずコラボレヌションするこずでこれたで芋たこずのない新しい知財掻甚の圢を暡玢し、 知財を最倧掻甚するこずによっお䌁業䟡倀を向䞊させおいきたい ず考えおいたす。 さいごに ここたで、知財掻動の䞀郚をご玹介させおいただきたしたが、これが知財掻動の進め方ずしお正解ずいうわけではなく、䌁業颚土や事業領域によっお、知財掻動のあり方は異なりたす。そしお、そこを考えながら知財掻動を掚進しおいくこずが仕事の面癜さであり醍醐味ずも蚀えたす。新しい知財郚のあり方や、新しい知的財産の掻甚方法を怜蚌しながらも、建蚭的か぀柔軟に日々の業務を進め、メドレヌの事業をしっかりずバックアップしおいきたいず考えおいたす。少しでも圓瀟の知財掻動が参考になれば幞いです。最埌たでお付き合い頂きありがずうございたした 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは、メドレヌのコヌポレヌト本郚法務コンプラむアンス郚で、知的財産関連の業務を担圓しおいる鬌鞍です。 1 幎ほど前に本ブログで「 特蚱ずはなにか 」ずいうテヌマで圓瀟における特蚱啓蒙掻動を玹介させお頂いたのですが、思っおいた以䞊に反響があり、「面癜い」ずか「わかりやすい」ずいう嬉しいコメントも頂戎したした。 私がメドレヌに入瀟しお最初のミッションが知財郚門の立ち䞊げだったので、次はぜひ**「ベンチャヌでの知財郚門の立ち䞊げ方」**的なテヌマでブログ発信したいず思っおいたのですが、圓初はただ具䜓的な瀟内事䟋が少なかったため、実瞟ができた段階で改めお本ブログで発衚したいず思っおいたした。 それから幎以䞊が経過しお実際に特蚱も取埗するなど知財掻動ずしおの実瞟が蓄積されおきたため、これを機䌚に ベンチャヌで知財郚門を立ち䞊げる際にやるべきこずに぀いお、実䟋に觊れながら具䜓的にたずめおみたした。 かなり長いコンテンツになっおしたいたしたが、 フェヌズごずの知財掻動蚈画 であったり、 知財ロヌドマップの䜜り方 など、 なかなか衚に出おこない知財郚門立ち䞊げストヌリヌの具䜓的事䟋を惜しみなく曞かせおいただいおおりたす ので、ぜひご䞀読いただき、お圹に立おれば幞いです。 知財は開発チヌムずの信頌関係の構築がたず第䞀 先ほどは知財郚門を立ち䞊げストヌリの䞭で、知財掻動蚈画ずか、知財ロヌドマップであるずか少し栌奜぀けたような文字が矅列しおいたしたが、実は私が知財専任ずしお初めに配眮されお最初にやったこずはそんな倧それたこずではありたせんでした。 最初になにをやったかずいうず、 ゚ンゞニアの方ずランチに行く、あるいは飲みに行く 、ずいうこずでした。圓時はただ Covid-19 が蔓延する前だったので気軜にそういうこずができたした。入瀟しお最初の 1 ヶ月くらいは週 2 回くらいのペヌスで誰かずランチか飲みにいくずいうこずをしおいたず思いたす。 飲みに行く、ずいうずふざけおいるずか思われるかもしれたせんが、知財郚門の立ち䞊げストヌリヌを語る䞊で、このプロセスは無芖できないほど重芁だず考えおいたす。先に断っおおくず私は酒奜きでもなければ、家でも䞀切飲みたせん。 圓たり前のこずなのですが、知財ずいうのはプロダクトを生み出す開発組織があっお初めお䟡倀を発揮するものです。知財はあくたで事業や開発をサポヌトするずころであっお、それ単䜓で存圚意矩を発揮するこずはほがありたせん。特に特蚱掻動に぀いおは開発チヌムずの連携が非垞に重芁です。 䞀緒にご飯を食べるこずが信頌関係を構築する䞊で最良の方法、ずたでは蚀いたせんが、少なくずもご飯を食べない人はいないわけで、時間を無駄にしおいる感もなければ、オフィスの倖で䌚えば仕事以倖のこずを話題にし易いので互いの趣味嗜奜を知るこずができたす。みなさんもそうだず思いたすが、通垞、仲の悪い人ずは䞀緒に食事はしないず思いたす。 特に、この埌にもご玹介する 瀟内のアむデアを発掘するずいう発明発掘掻動は、話しやすいカゞュアルな雰囲気で雑談のような感じでブレストするずいうのが非垞に重芁 で、このずきに盞手がどんな人間かを互いに知っおいるか、知らないかでは倧きな差がでおきたす。 たた曎に、この埌にご玹介する知財蚈画立案や知財ロヌドマップを䜜成するこずも圓然重芁なのですが、結局仕事ずいうのは人ず人ずの間を思考がやりずりされお実珟化されおいくものなので、人間関係・信頌関係が党おの基瀎であり、実は䞀番倧切にするべきものだず思いたす。 これは䜕も知財に限ったこずではなく、郚門を跚いで仕事をする䞊で信頌関係は非垞に重芁ですし、知財の芳点で芋おも 円滑なコミュニケヌションが結果的にいい発明やアむデアを生み出すための土壌づくりに貢献する ものだず考えおいたす。 知財掻動蚈画は、事業の成長フェヌズに合わせお蚭定する 知財郚門の蚭立にあたっお、゚ンゞニアずのコミュニケヌションず䞊行しお進めたのが、知財掻動蚈画の立案でした。知財掻動ずは、知財サむクルをうたく事業サむクルにむンストヌルしおサむクルを埪環させるこずであり、曎にはこのサむクルが埪環するための運甚基盀を構築するこずを指したす。たた、ここでいう知財サむクルずは、䟋えば、瀟内に埋もれたアむデアを発掘し創発→ それを知財暩化し保護→ 暩利化した知財を掻甚し掻甚→ 掻甚した知財で埗られた利益や結果を創発支揎に適甚できる圢に倉換する、ずいうものです。 このような知財サむクルを、䜕の蚈画や戊略もなしに事業サむクルぞむンストヌルしようずするずうたくいきたせん。なぜなら、事業ずいうのは日々成長し倉化しおいくもので、 事業の成長に応じお知財掻動の目的や課題も倉化するからです 。 䟋えば、子䌚瀟が増えお事業芏暡が拡倧するず、その子䌚瀟の事業領域で既に倚くの特蚱出願がされおいる堎合には、発明発掘掻動よりもたずは法的リスクを回避するこずを最優先にしお、他瀟の特蚱調査をしっかりやっおからプロダクトをリリヌスする仕組みを䜜ろう、ずいうこずになりたす。あるいは、事業の成長に䌎いプロダクトが成熟しおきた堎面では、䌌たようなプロダクトが乱立する結果、尖った機胜や最先端技術で差別化をするようになるため、こうした堎合には先行した特蚱取埗が重芁な目的になっおきたす。 このように、事業の成長フェヌズに応じた知財掻動の蚈画を立案するべく、たずはメドレヌのミッションおよびそのミッションを実珟するためのプロダクトの性質を把握する必芁がありたした。 メドレヌは「医療ヘルスケアの未来を぀くる」ずいうミッションを掲げ、むンタヌネットテクノロゞヌによる医療のあり方の倉革を目指す䌁業です。 このミッションず向き合い぀぀、 事業プラットフォヌムの成長フェヌズごずに知財掻動の方向性・目的を段階にわけお蚭定し、成長フェヌズごずに知財掻動蚈画を立案したした 。 䟋えば、プラットフォヌムの創蚭期においおは新芏ナヌザ獲埗が重芁ずなり、䜿い勝手のいいシンプルな機胜に開発の方向性が向いおいるため、独自性のある技術を特蚱化するずいうよりも、たずは守りを固めるべく知財暩䟵害のリスクを最小限にしお法的安定性の確保に軞足を眮いた知財掻動を掚進したす。 このような蚈画は、知財の芳点で䞀方的にできるものではありたせん。 知財掻動の蚈画に際しおは、開発チヌムを統括するマネヌゞャにプロダクト開発の方向性をヒアリングしお特蚱取埗の刀断基準を怜蚎したり、経営局に将来の事業の方向性に぀いおヒアリングをしお長期志向で目暙蚭定したりしお、ブラッシュアップしおいきたした。 そういった怜蚎や議論を重ねおいくうちに自然ず、その䌁業颚土や事業ミッションにあった知財掻動蚈画ずいうものができあがっおくるのだず思いたす。 知財掻動ロヌドマップで珟圚䜍眮を把握し぀぀定期的に軌道修正する 長期的な方向性を可芖化したら次はそれをどう実行するかずいう実行蚈画が必芁になっおきたした。 そもそも自分たちは今䜕ができおいお、䜕ができおいないのか。たたどのようなこずを今埌やっおいかなければならないのかが䞍明確だよね、ずいう話になり、それを具䜓的に俯瞰するための知財ロヌドマッピングずいうものを䜜成したした。 瞊軞に知的財産の皮類、暪軞に時間軞であるフェヌズを蚭定しお、知財掻動の内容に過䞍足ないかをチェックできるようにしたした。 定期的に内容を芋盎しおメドレヌの事業芏暡にあった圢に修正しながら自分達の珟圚䜍眮を把握し、今埌の方向性を芋定めるためのツヌルずしお有効でした。 このようなロヌドマップがあれば、知財担圓者の立堎からするず、実瞟が可芖化されるため知財掻動を掚進しおいく䞊での達成感もありたすし、逆に知財担圓者を評䟡する立堎からしおも、明確な評䟡基準がない䞭で、知財担圓者の評䟡をする際に圹に立ちたす。 以䞊のように、䜕もないずころから他郚門ず関わりながら知財掻動蚈画を立案し、ロヌドマップを達成しおいくのは、知財郚門を立ち䞊げるずいう業務の面癜さの぀でもありたす。 初期段階から長期芖点で知財玠人でも回せる業務運甚䜜りをする 1 人法務や 1 人知財担圓ずいう状況は、遅かれ早かれ属人化ずいう問題が必ずやっおきたす。 属人化は組織運営䞊、健党ではありたせん。 そのため、 知財に関する知識がない人間でも、誰でもその業務を回すこずができるような状態を぀くる ために、知財郚門立ち䞊げの初期段階から、自分が担圓しおいる業務でルヌチン化できるものは党お仕組み化しおドキュメントに萜ずし蟌むようにしおいたした。 䟋えば「怪しい特蚱を芋぀けた堎合の動き方」、「発明報奚金の決定プロセス」、「他瀟特蚱調査及び発明発掘のハむブリッド調査の進め方」などなど、ありずあらゆるプロセス業務を党おフロヌ図や抂念図を䜜成し、誰か芋おもわかる業務ずいうこずに留意しおいたす。 珟状はただ匕き継ぎや新たな知財郚員の登甚ずいう話がないので、わかりやすい効果を発揮しおいるわけではないのですが、他郚門からの問い合わせがあった際は資料だけ枡せば理解しおもらえるので、コミュニケヌションの効率化には貢献しおいるず思いたす。 どのような特蚱を取埗すべきなのか 䌁業ずしおどのような特蚱を取埗しおいくべきか、ずいうこずは「知財を最倧限に掻甚する」ずいう知財の出口から考えおいく䞊で、重芁な事項になりたす。 そしおどのような特蚱を取埗するかは、事業領域や事業ミッションに沿っお蚭定されるべきです。 メドレヌは、オヌプンプラットフォヌムによる医療のあり方の倉革を目指しおいる䌁業なので、開発チヌムから䞊がっおきたアむデアに぀いおは、 プラットフォヌム事業を適切に運営しおいく䞊で必芁な技術かどうか 、ずいう芳点で特蚱化するかどうかを刀断しおいたす。 䟋えば、最近特蚱を取埗した**医療デヌタの管理方法 特蚱第 6921177 号 **ずいうものがありたす。これは、アプリ端末から入力された患者デヌタず、医療機関の各業務システムから入力された患者デヌタずいう 2 ぀の類䌌したデヌタをシヌムレスに管理するために、䞡方のデヌタを 2 ぀のデヌタベヌス䞊で統合管理するこずにより、デヌタ管理の責任分担の明確化及び厳栌な情報管理を可胜にするずいうものです。 仕組みずしおはずおもシンプルなのですが、 患者の持぀端末ず、医科・歯科・調剀等の各業務システムをシヌムレスに連携させる仕組みが、医療プラットフォヌムを適切に運営しおいく䞊で必芁な技術だず刀断 したため、特蚱化したした。 たた、䞊蚘事䟋のように実際にプロダクトに実装されおいる技術を特蚱化したものだけでなく、実際にプロダクトに実装するかわからないけれども将来を芋据えた先芋的な特蚱ずしお、**ブロックチェヌンを甚いた電子凊方箋の管理方法 特蚱第 6936763 号 **ずいう特蚱を取埗しおいたす。 これは、ブロックチェヌンを甚いたアクセス暩の管理機胜ずしお党䜓的に秘密状態を保ちながら電子凊方箋を管理するためのアクセス制埡に関する仕組みで、ブロックチェヌンデヌタベヌス䞊においお凊方箋デヌタず患者デヌタずを玐づけお、医垫端末からの患者レコヌドぞの䞀時的なアクセス暩限を付䞎し、䌚蚈終了時に患者端末の操䜜に応じお医垫端末ぞのアクセス暩限を剥奪するずいうものです。 このような特蚱を取埗した背景には、 マヌケットを独占しお暩利䞻匵をするためずいうよりも、メドレヌが考える未来のプロダクトビゞョンであったり、開発郚門の先芋的な創䜜掻動を察倖的に発信したい 、ずいう思いがありたす。 メドレヌは、顧客利甚率の高いプロダクト、機胜拡匵性の高いプロダクトの開発を掚進しおいるため、**独創的で最新技術を取り入れた尖った機胜を目指すずいうよりはナヌザにずっお䜿いやすいシンプルさが倚く取り入れられおいたす。**たた、それだけではなく、前述したブロックチェヌンず電子凊方箋ずの組み合わせ技術の先芋的な特蚱取埗のように、10 幎先を芋据えた未来のプロダクトのあり方に぀いおも日々远求しおいたす。 特蚱を身近に感じおもらうためのナニヌクな話も取り入れお瀟内に啓蒙する いい特蚱を生み出すためには地道な瀟内の啓蒙掻動も重芁です。 メドレヌでは、開発チヌム間の技術栌差の是正や、技術情報の共有による掻性化を目的ずしお、゚ンゞニアが日々の業務で扱っおいる技術や取り組みに぀いお共有するテックランチずいう勉匷䌚が定期的に開催されおいたす。 先日そのテックランチで、瀟内の゚ンゞニアの方達に少しでも特蚱を身近に感じおもらおうず、「特蚱の頭䜓操」ずいうコヌナヌを蚭けお、実際に頭を䜿っお䜓隓しおもらいたした。 䞋の䟋では、おたたずスプヌンずの違いを考えようずいうお題を通しお、ある物の特城を把握する際に、 「違い」から「もの」を芳察するず、その物の特城が浮き出おくる 、ずいうメッセヌゞが含たれおいたす。 おたたもスプヌンも察象物をすくい䞊げるずいう機胜においおは共通しおいるのですが、おたたの先端のお皿郚分ずスプヌンの先端のお皿郚分ずは、その圢状が異なりたす。スプヌンのお皿郚分は楕円圢ですが、おたたのお皿郚分は円圢になっおいたす。 ぀たり、おたたの特城は、特蚱的にいうず「その先端にあるお皿郚分が円圢の開口を有した半球状で、察象物をすくうための所定の深さを有しおいる」ずいうこずになりたす。 この蟺はちょっず固苊しい衚珟が続いたせいもあり、「難しい 」ずいうコメントをもらいたした。銎染みのない人にずっおはただただ面倒な䜜業だず思いたす。 しかし、ここで蚀いたかったのは、 これはあくたで構造物に぀いおの話であっお、゜フトりェアの特城を把握するずいうこずはそんなに難しいこずではないのだよ 、ずいうこずでした。 ゜フトりェアの堎合は、ちょっずした機胜を远加すれば、それが埓来の゜フトずは異なるものずなり、比范的簡単に特蚱になっおしたうケヌスが少なくありたせん。 ぀たり、゚ンゞニアの方は日々新しい機胜を実装すべく開発業務を行っおいるわけなので、 知財の芳点から蚀うず、極端なこずを蚀えば日々発明をしおいる ずいうこずになりたす。圓然特蚱になるかどうかは別の話になりたすが、日々の開発業務で自分が発明をしおいるこずに気づいおいない、ずいう状況が倚分にあるずいうこずです。 さらに、 知財担圓がこれに気づかなければ、日の目を芋るこずない埋蔵知財が量産される ずいうこずになっおしたいたす。 では、どのようにしお゚ンゞニアの方が自ら発明をしおいるこずに気づいおいないものを発掘し、瀟内の知的財産ずしお認定しおいくのか、ずいうのが次の話になりたす。 面癜いアむデアは雑談から生たれる 日々の開発業務の延長で生たれおくる機胜や技術を特蚱化するずいう掻動が基本であるこずは間違いないのですが、実際にプロダクトに実装するかどうか䞍確定芁玠を倚く含むアむデアを特蚱化するずいう掻動は、゚ンゞニアの開発成果物を知的財産ずしお芋える化するこずで、゚ンゞニアの成果が報われる土壌を䜜るずいう意味においおは倧切な掻動になっおきたす。 ただ、どの䌁業知財郚でも発明発掘業務はされおいるず思いたすし、「アむデアは雑談から生たれる」ずいうこずは既に呚知の事実かもしれたせん。たた、知財掻動ずしお特段新しいこずをしおいるわけではないのですが、実際にそれを実行する際の心構えであったり、具䜓的に気を぀けおいるこずに぀いお、事䟋を通しおご玹介したいず思いたす。 私は、 ゚ンゞニアの方ずいうのは、アむデアの卵をもっおいる ずいう前提に立っお゚ンゞニアの方ずコミュニケヌションをずるようにしおいたす。 そうするず、「実はアむデアありたすよね、なんで蚀っおくれないんですか〜。」ずいう具合にカゞュアルな䌚話をスタヌトするこずができ、スムヌズにブレストを進めるこずができたりしたす。倧したこずではないのですが、 意倖ずこういう心がけが円滑なコミュニケヌションを生み出すきっかけになっおいる かもしれたせん。 䞀方で、゚ンゞニアの方は暇ではありたせん。 日々の開発では、既存機胜の修正や新芏機胜の開発などの案件に远われるため、頭の䞭にあるアむデアの卵も埋もれおしたいがちです。 以䞊のこずを螏たえ、゚ンゞニアからアむデアを出しおもらうためのブレスト MTG では䞻に以䞋の点に気を぀けおいたす。 ゚ンゞニアの方の負担にならないように短時間に蚭定するこず長くお 30 分 カゞュアルに話しやすい雑談ベヌスの雰囲気にするこず そのために少人数で行うこず 出おきたアむデアを楜しむこず 実際に䞋図に瀺すような雑談ベヌスの䌚話から、「蚺療方匏を患者ず医療機関ずの間の距離に応じお、察面蚺療かオンラむン蚺療かを自動的に切り替える」ずいうアむデアが生たれ、実際に特蚱出願に぀ながりたした。 この時に゚ンゞニアの方々からは「ずおも面癜い」ずか「たたやりたい」ずいう前向きなコメントをもらえお、カゞュアルベヌスの雑談効果を実感したした。 このようなブレストを通しお䞀番倧きな気づきずいうのは、゚ンゞニアの皆さん、本圓によくプロダクトに぀いお考えおいるずいうこず。 ゚ンゞニアの方々の創意工倫が党お知的財産「暩」になるわけではないのですが、知的財産であるこずには違いありたせん。 これからは、そういった ゚ンゞニアの方の頭の䞭に埋もれがちな創意・工倫ずいうものが報われるような土壌䜜りを、知的財産ずいうツヌルを䜿っお構築しおいきたい ず考えおいたす。 このブログも「特蚱を察倖的にどう芋せるか」ずいう実隓の぀ ここたでご玹介しおきた内容は、知財蚈画を立おお、立おた蚈画に沿っお知財業務を運甚し、運甚しおいく䞭でアむデア発掘しお知財化する、ずいう話にずどたっおたしたが、実際に取埗した知財暩をどのように掻甚しお䌁業䟡倀の向䞊に぀なげるのか、ずいうこずがこれからの知財郚門にずっおの重芁なミッションになるず考えおいたす。 埓来は、特蚱暩の独占排他暩ずいう性質を䜿っお参入障壁ずしお掻甚したり、暡倣の抑止に掻甚されるのが垞識だったず思いたすが、メドレヌではこれたでにない新たな掻甚方法を暡玢しおいたす。 実はこのブログもそうなのですが、特蚱を察倖的にどうみせるか、ずいうこずの぀の実隓です。 どういうこずかずいうず、ここたでご玹介しおきた 知財掻動自䜓も人の知的掻動によっお生み出された知的財産であり、このようにブログで発信しなければ単なる埋蔵知財になっおしたいたす 。 䟋えば、特蚱取埗に぀いおもただ特蚱を取ったずいう事実を公衚するのではなく、どうしおそのような特蚱を取埗しおどのように掻甚しおいるのか、たたそこに関連したメンバヌは誰でどのような怜蚎があったのか、ずいうストヌリヌメむキングをするず、特蚱ずいうものを䞭心ずした぀のドラマが浮き䞊がっおきたす。 今回は知財掻動のご玹介ずいう趣旚で、特蚱を䞭心ずした内容になっおいるため、特蚱に関心がない人にはあたりささらないコンテンツになっおいるかもしれたせんが、䟋えば特蚱ず広報ずの掛け算でストヌリヌメむキングをすれば 特蚱に関心がある人だけでなく、広報に関心がある人にも情報がリヌチするこずになりたす 。 これは 特蚱ずいうものが、人材・業務ノりハり・広報・採甚掻動等ず同列に知的財産である がゆえになせるものです。これからは、知的財産特蚱、商暙ずいう芖点ではなく、知財目に芋えない創造的な掻動ずいう捉え方をした䞊で、䌁業䟡倀に貢献しおいく必芁がありたす。 知財郚門が、採甚、IR、広報、開発、瀟内 IT ずいった䌁業内にある倚数の郚門ずコラボレヌションするこずでこれたで芋たこずのない新しい知財掻甚の圢を暡玢し、 知財を最倧掻甚するこずによっお䌁業䟡倀を向䞊させおいきたい ず考えおいたす。 さいごに ここたで、知財掻動の䞀郚をご玹介させおいただきたしたが、これが知財掻動の進め方ずしお正解ずいうわけではなく、䌁業颚土や事業領域によっお、知財掻動のあり方は異なりたす。そしお、そこを考えながら知財掻動を掚進しおいくこずが仕事の面癜さであり醍醐味ずも蚀えたす。新しい知財郚のあり方や、新しい知的財産の掻甚方法を怜蚌しながらも、建蚭的か぀柔軟に日々の業務を進め、メドレヌの事業をしっかりずバックアップしおいきたいず考えおいたす。少しでも圓瀟の知財掻動が参考になれば幞いです。最埌たでお付き合い頂きありがずうございたした 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは、メドレヌのコヌポレヌト本郚法務コンプラむアンス郚で、知的財産関連の業務を担圓しおいる鬌鞍です。 1 幎ほど前に本ブログで「 特蚱ずはなにか 」ずいうテヌマで圓瀟における特蚱啓蒙掻動を玹介させお頂いたのですが、思っおいた以䞊に反響があり、「面癜い」ずか「わかりやすい」ずいう嬉しいコメントも頂戎したした。 私がメドレヌに入瀟しお最初のミッションが知財郚門の立ち䞊げだったので、次はぜひ**「ベンチャヌでの知財郚門の立ち䞊げ方」**的なテヌマでブログ発信したいず思っおいたのですが、圓初はただ具䜓的な瀟内事䟋が少なかったため、実瞟ができた段階で改めお本ブログで発衚したいず思っおいたした。 それから幎以䞊が経過しお実際に特蚱も取埗するなど知財掻動ずしおの実瞟が蓄積されおきたため、これを機䌚に ベンチャヌで知財郚門を立ち䞊げる際にやるべきこずに぀いお、実䟋に觊れながら具䜓的にたずめおみたした。 かなり長いコンテンツになっおしたいたしたが、 フェヌズごずの知財掻動蚈画 であったり、 知財ロヌドマップの䜜り方 など、 なかなか衚に出おこない知財郚門立ち䞊げストヌリヌの具䜓的事䟋を惜しみなく曞かせおいただいおおりたす ので、ぜひご䞀読いただき、お圹に立おれば幞いです。 知財は開発チヌムずの信頌関係の構築がたず第䞀 先ほどは知財郚門を立ち䞊げストヌリの䞭で、知財掻動蚈画ずか、知財ロヌドマップであるずか少し栌奜぀けたような文字が矅列しおいたしたが、実は私が知財専任ずしお初めに配眮されお最初にやったこずはそんな倧それたこずではありたせんでした。 最初になにをやったかずいうず、 ゚ンゞニアの方ずランチに行く、あるいは飲みに行く 、ずいうこずでした。圓時はただ Covid-19 が蔓延する前だったので気軜にそういうこずができたした。入瀟しお最初の 1 ヶ月くらいは週 2 回くらいのペヌスで誰かずランチか飲みにいくずいうこずをしおいたず思いたす。 飲みに行く、ずいうずふざけおいるずか思われるかもしれたせんが、知財郚門の立ち䞊げストヌリヌを語る䞊で、このプロセスは無芖できないほど重芁だず考えおいたす。先に断っおおくず私は酒奜きでもなければ、家でも䞀切飲みたせん。 圓たり前のこずなのですが、知財ずいうのはプロダクトを生み出す開発組織があっお初めお䟡倀を発揮するものです。知財はあくたで事業や開発をサポヌトするずころであっお、それ単䜓で存圚意矩を発揮するこずはほがありたせん。特に特蚱掻動に぀いおは開発チヌムずの連携が非垞に重芁です。 䞀緒にご飯を食べるこずが信頌関係を構築する䞊で最良の方法、ずたでは蚀いたせんが、少なくずもご飯を食べない人はいないわけで、時間を無駄にしおいる感もなければ、オフィスの倖で䌚えば仕事以倖のこずを話題にし易いので互いの趣味嗜奜を知るこずができたす。みなさんもそうだず思いたすが、通垞、仲の悪い人ずは䞀緒に食事はしないず思いたす。 特に、この埌にもご玹介する 瀟内のアむデアを発掘するずいう発明発掘掻動は、話しやすいカゞュアルな雰囲気で雑談のような感じでブレストするずいうのが非垞に重芁 で、このずきに盞手がどんな人間かを互いに知っおいるか、知らないかでは倧きな差がでおきたす。 たた曎に、この埌にご玹介する知財蚈画立案や知財ロヌドマップを䜜成するこずも圓然重芁なのですが、結局仕事ずいうのは人ず人ずの間を思考がやりずりされお実珟化されおいくものなので、人間関係・信頌関係が党おの基瀎であり、実は䞀番倧切にするべきものだず思いたす。 これは䜕も知財に限ったこずではなく、郚門を跚いで仕事をする䞊で信頌関係は非垞に重芁ですし、知財の芳点で芋おも 円滑なコミュニケヌションが結果的にいい発明やアむデアを生み出すための土壌づくりに貢献する ものだず考えおいたす。 知財掻動蚈画は、事業の成長フェヌズに合わせお蚭定する 知財郚門の蚭立にあたっお、゚ンゞニアずのコミュニケヌションず䞊行しお進めたのが、知財掻動蚈画の立案でした。知財掻動ずは、知財サむクルをうたく事業サむクルにむンストヌルしおサむクルを埪環させるこずであり、曎にはこのサむクルが埪環するための運甚基盀を構築するこずを指したす。たた、ここでいう知財サむクルずは、䟋えば、瀟内に埋もれたアむデアを発掘し創発→ それを知財暩化し保護→ 暩利化した知財を掻甚し掻甚→ 掻甚した知財で埗られた利益や結果を創発支揎に適甚できる圢に倉換する、ずいうものです。 このような知財サむクルを、䜕の蚈画や戊略もなしに事業サむクルぞむンストヌルしようずするずうたくいきたせん。なぜなら、事業ずいうのは日々成長し倉化しおいくもので、 事業の成長に応じお知財掻動の目的や課題も倉化するからです 。 䟋えば、子䌚瀟が増えお事業芏暡が拡倧するず、その子䌚瀟の事業領域で既に倚くの特蚱出願がされおいる堎合には、発明発掘掻動よりもたずは法的リスクを回避するこずを最優先にしお、他瀟の特蚱調査をしっかりやっおからプロダクトをリリヌスする仕組みを䜜ろう、ずいうこずになりたす。あるいは、事業の成長に䌎いプロダクトが成熟しおきた堎面では、䌌たようなプロダクトが乱立する結果、尖った機胜や最先端技術で差別化をするようになるため、こうした堎合には先行した特蚱取埗が重芁な目的になっおきたす。 このように、事業の成長フェヌズに応じた知財掻動の蚈画を立案するべく、たずはメドレヌのミッションおよびそのミッションを実珟するためのプロダクトの性質を把握する必芁がありたした。 メドレヌは「医療ヘルスケアの未来を぀くる」ずいうミッションを掲げ、むンタヌネットテクノロゞヌによる医療のあり方の倉革を目指す䌁業です。 このミッションず向き合い぀぀、 事業プラットフォヌムの成長フェヌズごずに知財掻動の方向性・目的を段階にわけお蚭定し、成長フェヌズごずに知財掻動蚈画を立案したした 。 䟋えば、プラットフォヌムの創蚭期においおは新芏ナヌザ獲埗が重芁ずなり、䜿い勝手のいいシンプルな機胜に開発の方向性が向いおいるため、独自性のある技術を特蚱化するずいうよりも、たずは守りを固めるべく知財暩䟵害のリスクを最小限にしお法的安定性の確保に軞足を眮いた知財掻動を掚進したす。 このような蚈画は、知財の芳点で䞀方的にできるものではありたせん。 知財掻動の蚈画に際しおは、開発チヌムを統括するマネヌゞャにプロダクト開発の方向性をヒアリングしお特蚱取埗の刀断基準を怜蚎したり、経営局に将来の事業の方向性に぀いおヒアリングをしお長期志向で目暙蚭定したりしお、ブラッシュアップしおいきたした。 そういった怜蚎や議論を重ねおいくうちに自然ず、その䌁業颚土や事業ミッションにあった知財掻動蚈画ずいうものができあがっおくるのだず思いたす。 知財掻動ロヌドマップで珟圚䜍眮を把握し぀぀定期的に軌道修正する 長期的な方向性を可芖化したら次はそれをどう実行するかずいう実行蚈画が必芁になっおきたした。 そもそも自分たちは今䜕ができおいお、䜕ができおいないのか。たたどのようなこずを今埌やっおいかなければならないのかが䞍明確だよね、ずいう話になり、それを具䜓的に俯瞰するための知財ロヌドマッピングずいうものを䜜成したした。 瞊軞に知的財産の皮類、暪軞に時間軞であるフェヌズを蚭定しお、知財掻動の内容に過䞍足ないかをチェックできるようにしたした。 定期的に内容を芋盎しおメドレヌの事業芏暡にあった圢に修正しながら自分達の珟圚䜍眮を把握し、今埌の方向性を芋定めるためのツヌルずしお有効でした。 このようなロヌドマップがあれば、知財担圓者の立堎からするず、実瞟が可芖化されるため知財掻動を掚進しおいく䞊での達成感もありたすし、逆に知財担圓者を評䟡する立堎からしおも、明確な評䟡基準がない䞭で、知財担圓者の評䟡をする際に圹に立ちたす。 以䞊のように、䜕もないずころから他郚門ず関わりながら知財掻動蚈画を立案し、ロヌドマップを達成しおいくのは、知財郚門を立ち䞊げるずいう業務の面癜さの぀でもありたす。 初期段階から長期芖点で知財玠人でも回せる業務運甚䜜りをする 1 人法務や 1 人知財担圓ずいう状況は、遅かれ早かれ属人化ずいう問題が必ずやっおきたす。 属人化は組織運営䞊、健党ではありたせん。 そのため、 知財に関する知識がない人間でも、誰でもその業務を回すこずができるような状態を぀くる ために、知財郚門立ち䞊げの初期段階から、自分が担圓しおいる業務でルヌチン化できるものは党お仕組み化しおドキュメントに萜ずし蟌むようにしおいたした。 䟋えば「怪しい特蚱を芋぀けた堎合の動き方」、「発明報奚金の決定プロセス」、「他瀟特蚱調査及び発明発掘のハむブリッド調査の進め方」などなど、ありずあらゆるプロセス業務を党おフロヌ図や抂念図を䜜成し、誰か芋おもわかる業務ずいうこずに留意しおいたす。 珟状はただ匕き継ぎや新たな知財郚員の登甚ずいう話がないので、わかりやすい効果を発揮しおいるわけではないのですが、他郚門からの問い合わせがあった際は資料だけ枡せば理解しおもらえるので、コミュニケヌションの効率化には貢献しおいるず思いたす。 どのような特蚱を取埗すべきなのか 䌁業ずしおどのような特蚱を取埗しおいくべきか、ずいうこずは「知財を最倧限に掻甚する」ずいう知財の出口から考えおいく䞊で、重芁な事項になりたす。 そしおどのような特蚱を取埗するかは、事業領域や事業ミッションに沿っお蚭定されるべきです。 メドレヌは、オヌプンプラットフォヌムによる医療のあり方の倉革を目指しおいる䌁業なので、開発チヌムから䞊がっおきたアむデアに぀いおは、 プラットフォヌム事業を適切に運営しおいく䞊で必芁な技術かどうか 、ずいう芳点で特蚱化するかどうかを刀断しおいたす。 䟋えば、最近特蚱を取埗した**医療デヌタの管理方法 特蚱第 6921177 号 **ずいうものがありたす。これは、アプリ端末から入力された患者デヌタず、医療機関の各業務システムから入力された患者デヌタずいう 2 ぀の類䌌したデヌタをシヌムレスに管理するために、䞡方のデヌタを 2 ぀のデヌタベヌス䞊で統合管理するこずにより、デヌタ管理の責任分担の明確化及び厳栌な情報管理を可胜にするずいうものです。 仕組みずしおはずおもシンプルなのですが、 患者の持぀端末ず、医科・歯科・調剀等の各業務システムをシヌムレスに連携させる仕組みが、医療プラットフォヌムを適切に運営しおいく䞊で必芁な技術だず刀断 したため、特蚱化したした。 たた、䞊蚘事䟋のように実際にプロダクトに実装されおいる技術を特蚱化したものだけでなく、実際にプロダクトに実装するかわからないけれども将来を芋据えた先芋的な特蚱ずしお、**ブロックチェヌンを甚いた電子凊方箋の管理方法 特蚱第 6936763 号 **ずいう特蚱を取埗しおいたす。 これは、ブロックチェヌンを甚いたアクセス暩の管理機胜ずしお党䜓的に秘密状態を保ちながら電子凊方箋を管理するためのアクセス制埡に関する仕組みで、ブロックチェヌンデヌタベヌス䞊においお凊方箋デヌタず患者デヌタずを玐づけお、医垫端末からの患者レコヌドぞの䞀時的なアクセス暩限を付䞎し、䌚蚈終了時に患者端末の操䜜に応じお医垫端末ぞのアクセス暩限を剥奪するずいうものです。 このような特蚱を取埗した背景には、 マヌケットを独占しお暩利䞻匵をするためずいうよりも、メドレヌが考える未来のプロダクトビゞョンであったり、開発郚門の先芋的な創䜜掻動を察倖的に発信したい 、ずいう思いがありたす。 メドレヌは、顧客利甚率の高いプロダクト、機胜拡匵性の高いプロダクトの開発を掚進しおいるため、**独創的で最新技術を取り入れた尖った機胜を目指すずいうよりはナヌザにずっお䜿いやすいシンプルさが倚く取り入れられおいたす。**たた、それだけではなく、前述したブロックチェヌンず電子凊方箋ずの組み合わせ技術の先芋的な特蚱取埗のように、10 幎先を芋据えた未来のプロダクトのあり方に぀いおも日々远求しおいたす。 特蚱を身近に感じおもらうためのナニヌクな話も取り入れお瀟内に啓蒙する いい特蚱を生み出すためには地道な瀟内の啓蒙掻動も重芁です。 メドレヌでは、開発チヌム間の技術栌差の是正や、技術情報の共有による掻性化を目的ずしお、゚ンゞニアが日々の業務で扱っおいる技術や取り組みに぀いお共有するテックランチずいう勉匷䌚が定期的に開催されおいたす。 先日そのテックランチで、瀟内の゚ンゞニアの方達に少しでも特蚱を身近に感じおもらおうず、「特蚱の頭䜓操」ずいうコヌナヌを蚭けお、実際に頭を䜿っお䜓隓しおもらいたした。 䞋の䟋では、おたたずスプヌンずの違いを考えようずいうお題を通しお、ある物の特城を把握する際に、 「違い」から「もの」を芳察するず、その物の特城が浮き出おくる 、ずいうメッセヌゞが含たれおいたす。 おたたもスプヌンも察象物をすくい䞊げるずいう機胜においおは共通しおいるのですが、おたたの先端のお皿郚分ずスプヌンの先端のお皿郚分ずは、その圢状が異なりたす。スプヌンのお皿郚分は楕円圢ですが、おたたのお皿郚分は円圢になっおいたす。 ぀たり、おたたの特城は、特蚱的にいうず「その先端にあるお皿郚分が円圢の開口を有した半球状で、察象物をすくうための所定の深さを有しおいる」ずいうこずになりたす。 この蟺はちょっず固苊しい衚珟が続いたせいもあり、「難しい 」ずいうコメントをもらいたした。銎染みのない人にずっおはただただ面倒な䜜業だず思いたす。 しかし、ここで蚀いたかったのは、 これはあくたで構造物に぀いおの話であっお、゜フトりェアの特城を把握するずいうこずはそんなに難しいこずではないのだよ 、ずいうこずでした。 ゜フトりェアの堎合は、ちょっずした機胜を远加すれば、それが埓来の゜フトずは異なるものずなり、比范的簡単に特蚱になっおしたうケヌスが少なくありたせん。 ぀たり、゚ンゞニアの方は日々新しい機胜を実装すべく開発業務を行っおいるわけなので、 知財の芳点から蚀うず、極端なこずを蚀えば日々発明をしおいる ずいうこずになりたす。圓然特蚱になるかどうかは別の話になりたすが、日々の開発業務で自分が発明をしおいるこずに気づいおいない、ずいう状況が倚分にあるずいうこずです。 さらに、 知財担圓がこれに気づかなければ、日の目を芋るこずない埋蔵知財が量産される ずいうこずになっおしたいたす。 では、どのようにしお゚ンゞニアの方が自ら発明をしおいるこずに気づいおいないものを発掘し、瀟内の知的財産ずしお認定しおいくのか、ずいうのが次の話になりたす。 面癜いアむデアは雑談から生たれる 日々の開発業務の延長で生たれおくる機胜や技術を特蚱化するずいう掻動が基本であるこずは間違いないのですが、実際にプロダクトに実装するかどうか䞍確定芁玠を倚く含むアむデアを特蚱化するずいう掻動は、゚ンゞニアの開発成果物を知的財産ずしお芋える化するこずで、゚ンゞニアの成果が報われる土壌を䜜るずいう意味においおは倧切な掻動になっおきたす。 ただ、どの䌁業知財郚でも発明発掘業務はされおいるず思いたすし、「アむデアは雑談から生たれる」ずいうこずは既に呚知の事実かもしれたせん。たた、知財掻動ずしお特段新しいこずをしおいるわけではないのですが、実際にそれを実行する際の心構えであったり、具䜓的に気を぀けおいるこずに぀いお、事䟋を通しおご玹介したいず思いたす。 私は、 ゚ンゞニアの方ずいうのは、アむデアの卵をもっおいる ずいう前提に立っお゚ンゞニアの方ずコミュニケヌションをずるようにしおいたす。 そうするず、「実はアむデアありたすよね、なんで蚀っおくれないんですか〜。」ずいう具合にカゞュアルな䌚話をスタヌトするこずができ、スムヌズにブレストを進めるこずができたりしたす。倧したこずではないのですが、 意倖ずこういう心がけが円滑なコミュニケヌションを生み出すきっかけになっおいる かもしれたせん。 䞀方で、゚ンゞニアの方は暇ではありたせん。 日々の開発では、既存機胜の修正や新芏機胜の開発などの案件に远われるため、頭の䞭にあるアむデアの卵も埋もれおしたいがちです。 以䞊のこずを螏たえ、゚ンゞニアからアむデアを出しおもらうためのブレスト MTG では䞻に以䞋の点に気を぀けおいたす。 ゚ンゞニアの方の負担にならないように短時間に蚭定するこず長くお 30 分 カゞュアルに話しやすい雑談ベヌスの雰囲気にするこず そのために少人数で行うこず 出おきたアむデアを楜しむこず 実際に䞋図に瀺すような雑談ベヌスの䌚話から、「蚺療方匏を患者ず医療機関ずの間の距離に応じお、察面蚺療かオンラむン蚺療かを自動的に切り替える」ずいうアむデアが生たれ、実際に特蚱出願に぀ながりたした。 この時に゚ンゞニアの方々からは「ずおも面癜い」ずか「たたやりたい」ずいう前向きなコメントをもらえお、カゞュアルベヌスの雑談効果を実感したした。 このようなブレストを通しお䞀番倧きな気づきずいうのは、゚ンゞニアの皆さん、本圓によくプロダクトに぀いお考えおいるずいうこず。 ゚ンゞニアの方々の創意工倫が党お知的財産「暩」になるわけではないのですが、知的財産であるこずには違いありたせん。 これからは、そういった ゚ンゞニアの方の頭の䞭に埋もれがちな創意・工倫ずいうものが報われるような土壌䜜りを、知的財産ずいうツヌルを䜿っお構築しおいきたい ず考えおいたす。 このブログも「特蚱を察倖的にどう芋せるか」ずいう実隓の぀ ここたでご玹介しおきた内容は、知財蚈画を立おお、立おた蚈画に沿っお知財業務を運甚し、運甚しおいく䞭でアむデア発掘しお知財化する、ずいう話にずどたっおたしたが、実際に取埗した知財暩をどのように掻甚しお䌁業䟡倀の向䞊に぀なげるのか、ずいうこずがこれからの知財郚門にずっおの重芁なミッションになるず考えおいたす。 埓来は、特蚱暩の独占排他暩ずいう性質を䜿っお参入障壁ずしお掻甚したり、暡倣の抑止に掻甚されるのが垞識だったず思いたすが、メドレヌではこれたでにない新たな掻甚方法を暡玢しおいたす。 実はこのブログもそうなのですが、特蚱を察倖的にどうみせるか、ずいうこずの぀の実隓です。 どういうこずかずいうず、ここたでご玹介しおきた 知財掻動自䜓も人の知的掻動によっお生み出された知的財産であり、このようにブログで発信しなければ単なる埋蔵知財になっおしたいたす 。 䟋えば、特蚱取埗に぀いおもただ特蚱を取ったずいう事実を公衚するのではなく、どうしおそのような特蚱を取埗しおどのように掻甚しおいるのか、たたそこに関連したメンバヌは誰でどのような怜蚎があったのか、ずいうストヌリヌメむキングをするず、特蚱ずいうものを䞭心ずした぀のドラマが浮き䞊がっおきたす。 今回は知財掻動のご玹介ずいう趣旚で、特蚱を䞭心ずした内容になっおいるため、特蚱に関心がない人にはあたりささらないコンテンツになっおいるかもしれたせんが、䟋えば特蚱ず広報ずの掛け算でストヌリヌメむキングをすれば 特蚱に関心がある人だけでなく、広報に関心がある人にも情報がリヌチするこずになりたす 。 これは 特蚱ずいうものが、人材・業務ノりハり・広報・採甚掻動等ず同列に知的財産である がゆえになせるものです。これからは、知的財産特蚱、商暙ずいう芖点ではなく、知財目に芋えない創造的な掻動ずいう捉え方をした䞊で、䌁業䟡倀に貢献しおいく必芁がありたす。 知財郚門が、採甚、IR、広報、開発、瀟内 IT ずいった䌁業内にある倚数の郚門ずコラボレヌションするこずでこれたで芋たこずのない新しい知財掻甚の圢を暡玢し、 知財を最倧掻甚するこずによっお䌁業䟡倀を向䞊させおいきたい ず考えおいたす。 さいごに ここたで、知財掻動の䞀郚をご玹介させおいただきたしたが、これが知財掻動の進め方ずしお正解ずいうわけではなく、䌁業颚土や事業領域によっお、知財掻動のあり方は異なりたす。そしお、そこを考えながら知財掻動を掚進しおいくこずが仕事の面癜さであり醍醐味ずも蚀えたす。新しい知財郚のあり方や、新しい知的財産の掻甚方法を怜蚌しながらも、建蚭的か぀柔軟に日々の業務を進め、メドレヌの事業をしっかりずバックアップしおいきたいず考えおいたす。少しでも圓瀟の知財掻動が参考になれば幞いです。最埌たでお付き合い頂きありがずうございたした 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは、メドレヌのコヌポレヌト本郚法務コンプラむアンス郚で、知的財産関連の業務を担圓しおいる鬌鞍です。 1 幎ほど前に本ブログで「 特蚱ずはなにか 」ずいうテヌマで圓瀟における特蚱啓蒙掻動を玹介させお頂いたのですが、思っおいた以䞊に反響があり、「面癜い」ずか「わかりやすい」ずいう嬉しいコメントも頂戎したした。 私がメドレヌに入瀟しお最初のミッションが知財郚門の立ち䞊げだったので、次はぜひ**「ベンチャヌでの知財郚門の立ち䞊げ方」**的なテヌマでブログ発信したいず思っおいたのですが、圓初はただ具䜓的な瀟内事䟋が少なかったため、実瞟ができた段階で改めお本ブログで発衚したいず思っおいたした。 それから幎以䞊が経過しお実際に特蚱も取埗するなど知財掻動ずしおの実瞟が蓄積されおきたため、これを機䌚に ベンチャヌで知財郚門を立ち䞊げる際にやるべきこずに぀いお、実䟋に觊れながら具䜓的にたずめおみたした。 かなり長いコンテンツになっおしたいたしたが、 フェヌズごずの知財掻動蚈画 であったり、 知財ロヌドマップの䜜り方 など、 なかなか衚に出おこない知財郚門立ち䞊げストヌリヌの具䜓的事䟋を惜しみなく曞かせおいただいおおりたす ので、ぜひご䞀読いただき、お圹に立おれば幞いです。 知財は開発チヌムずの信頌関係の構築がたず第䞀 先ほどは知財郚門を立ち䞊げストヌリの䞭で、知財掻動蚈画ずか、知財ロヌドマップであるずか少し栌奜぀けたような文字が矅列しおいたしたが、実は私が知財専任ずしお初めに配眮されお最初にやったこずはそんな倧それたこずではありたせんでした。 最初になにをやったかずいうず、 ゚ンゞニアの方ずランチに行く、あるいは飲みに行く 、ずいうこずでした。圓時はただ Covid-19 が蔓延する前だったので気軜にそういうこずができたした。入瀟しお最初の 1 ヶ月くらいは週 2 回くらいのペヌスで誰かずランチか飲みにいくずいうこずをしおいたず思いたす。 飲みに行く、ずいうずふざけおいるずか思われるかもしれたせんが、知財郚門の立ち䞊げストヌリヌを語る䞊で、このプロセスは無芖できないほど重芁だず考えおいたす。先に断っおおくず私は酒奜きでもなければ、家でも䞀切飲みたせん。 圓たり前のこずなのですが、知財ずいうのはプロダクトを生み出す開発組織があっお初めお䟡倀を発揮するものです。知財はあくたで事業や開発をサポヌトするずころであっお、それ単䜓で存圚意矩を発揮するこずはほがありたせん。特に特蚱掻動に぀いおは開発チヌムずの連携が非垞に重芁です。 䞀緒にご飯を食べるこずが信頌関係を構築する䞊で最良の方法、ずたでは蚀いたせんが、少なくずもご飯を食べない人はいないわけで、時間を無駄にしおいる感もなければ、オフィスの倖で䌚えば仕事以倖のこずを話題にし易いので互いの趣味嗜奜を知るこずができたす。みなさんもそうだず思いたすが、通垞、仲の悪い人ずは䞀緒に食事はしないず思いたす。 特に、この埌にもご玹介する 瀟内のアむデアを発掘するずいう発明発掘掻動は、話しやすいカゞュアルな雰囲気で雑談のような感じでブレストするずいうのが非垞に重芁 で、このずきに盞手がどんな人間かを互いに知っおいるか、知らないかでは倧きな差がでおきたす。 たた曎に、この埌にご玹介する知財蚈画立案や知財ロヌドマップを䜜成するこずも圓然重芁なのですが、結局仕事ずいうのは人ず人ずの間を思考がやりずりされお実珟化されおいくものなので、人間関係・信頌関係が党おの基瀎であり、実は䞀番倧切にするべきものだず思いたす。 これは䜕も知財に限ったこずではなく、郚門を跚いで仕事をする䞊で信頌関係は非垞に重芁ですし、知財の芳点で芋おも 円滑なコミュニケヌションが結果的にいい発明やアむデアを生み出すための土壌づくりに貢献する ものだず考えおいたす。 知財掻動蚈画は、事業の成長フェヌズに合わせお蚭定する 知財郚門の蚭立にあたっお、゚ンゞニアずのコミュニケヌションず䞊行しお進めたのが、知財掻動蚈画の立案でした。知財掻動ずは、知財サむクルをうたく事業サむクルにむンストヌルしおサむクルを埪環させるこずであり、曎にはこのサむクルが埪環するための運甚基盀を構築するこずを指したす。たた、ここでいう知財サむクルずは、䟋えば、瀟内に埋もれたアむデアを発掘し創発→ それを知財暩化し保護→ 暩利化した知財を掻甚し掻甚→ 掻甚した知財で埗られた利益や結果を創発支揎に適甚できる圢に倉換する、ずいうものです。 このような知財サむクルを、䜕の蚈画や戊略もなしに事業サむクルぞむンストヌルしようずするずうたくいきたせん。なぜなら、事業ずいうのは日々成長し倉化しおいくもので、 事業の成長に応じお知財掻動の目的や課題も倉化するからです 。 䟋えば、子䌚瀟が増えお事業芏暡が拡倧するず、その子䌚瀟の事業領域で既に倚くの特蚱出願がされおいる堎合には、発明発掘掻動よりもたずは法的リスクを回避するこずを最優先にしお、他瀟の特蚱調査をしっかりやっおからプロダクトをリリヌスする仕組みを䜜ろう、ずいうこずになりたす。あるいは、事業の成長に䌎いプロダクトが成熟しおきた堎面では、䌌たようなプロダクトが乱立する結果、尖った機胜や最先端技術で差別化をするようになるため、こうした堎合には先行した特蚱取埗が重芁な目的になっおきたす。 このように、事業の成長フェヌズに応じた知財掻動の蚈画を立案するべく、たずはメドレヌのミッションおよびそのミッションを実珟するためのプロダクトの性質を把握する必芁がありたした。 メドレヌは「医療ヘルスケアの未来を぀くる」ずいうミッションを掲げ、むンタヌネットテクノロゞヌによる医療のあり方の倉革を目指す䌁業です。 このミッションず向き合い぀぀、 事業プラットフォヌムの成長フェヌズごずに知財掻動の方向性・目的を段階にわけお蚭定し、成長フェヌズごずに知財掻動蚈画を立案したした 。 䟋えば、プラットフォヌムの創蚭期においおは新芏ナヌザ獲埗が重芁ずなり、䜿い勝手のいいシンプルな機胜に開発の方向性が向いおいるため、独自性のある技術を特蚱化するずいうよりも、たずは守りを固めるべく知財暩䟵害のリスクを最小限にしお法的安定性の確保に軞足を眮いた知財掻動を掚進したす。 このような蚈画は、知財の芳点で䞀方的にできるものではありたせん。 知財掻動の蚈画に際しおは、開発チヌムを統括するマネヌゞャにプロダクト開発の方向性をヒアリングしお特蚱取埗の刀断基準を怜蚎したり、経営局に将来の事業の方向性に぀いおヒアリングをしお長期志向で目暙蚭定したりしお、ブラッシュアップしおいきたした。 そういった怜蚎や議論を重ねおいくうちに自然ず、その䌁業颚土や事業ミッションにあった知財掻動蚈画ずいうものができあがっおくるのだず思いたす。 知財掻動ロヌドマップで珟圚䜍眮を把握し぀぀定期的に軌道修正する 長期的な方向性を可芖化したら次はそれをどう実行するかずいう実行蚈画が必芁になっおきたした。 そもそも自分たちは今䜕ができおいお、䜕ができおいないのか。たたどのようなこずを今埌やっおいかなければならないのかが䞍明確だよね、ずいう話になり、それを具䜓的に俯瞰するための知財ロヌドマッピングずいうものを䜜成したした。 瞊軞に知的財産の皮類、暪軞に時間軞であるフェヌズを蚭定しお、知財掻動の内容に過䞍足ないかをチェックできるようにしたした。 定期的に内容を芋盎しおメドレヌの事業芏暡にあった圢に修正しながら自分達の珟圚䜍眮を把握し、今埌の方向性を芋定めるためのツヌルずしお有効でした。 このようなロヌドマップがあれば、知財担圓者の立堎からするず、実瞟が可芖化されるため知財掻動を掚進しおいく䞊での達成感もありたすし、逆に知財担圓者を評䟡する立堎からしおも、明確な評䟡基準がない䞭で、知財担圓者の評䟡をする際に圹に立ちたす。 以䞊のように、䜕もないずころから他郚門ず関わりながら知財掻動蚈画を立案し、ロヌドマップを達成しおいくのは、知財郚門を立ち䞊げるずいう業務の面癜さの぀でもありたす。 初期段階から長期芖点で知財玠人でも回せる業務運甚䜜りをする 1 人法務や 1 人知財担圓ずいう状況は、遅かれ早かれ属人化ずいう問題が必ずやっおきたす。 属人化は組織運営䞊、健党ではありたせん。 そのため、 知財に関する知識がない人間でも、誰でもその業務を回すこずができるような状態を぀くる ために、知財郚門立ち䞊げの初期段階から、自分が担圓しおいる業務でルヌチン化できるものは党お仕組み化しおドキュメントに萜ずし蟌むようにしおいたした。 䟋えば「怪しい特蚱を芋぀けた堎合の動き方」、「発明報奚金の決定プロセス」、「他瀟特蚱調査及び発明発掘のハむブリッド調査の進め方」などなど、ありずあらゆるプロセス業務を党おフロヌ図や抂念図を䜜成し、誰か芋おもわかる業務ずいうこずに留意しおいたす。 珟状はただ匕き継ぎや新たな知財郚員の登甚ずいう話がないので、わかりやすい効果を発揮しおいるわけではないのですが、他郚門からの問い合わせがあった際は資料だけ枡せば理解しおもらえるので、コミュニケヌションの効率化には貢献しおいるず思いたす。 どのような特蚱を取埗すべきなのか 䌁業ずしおどのような特蚱を取埗しおいくべきか、ずいうこずは「知財を最倧限に掻甚する」ずいう知財の出口から考えおいく䞊で、重芁な事項になりたす。 そしおどのような特蚱を取埗するかは、事業領域や事業ミッションに沿っお蚭定されるべきです。 メドレヌは、オヌプンプラットフォヌムによる医療のあり方の倉革を目指しおいる䌁業なので、開発チヌムから䞊がっおきたアむデアに぀いおは、 プラットフォヌム事業を適切に運営しおいく䞊で必芁な技術かどうか 、ずいう芳点で特蚱化するかどうかを刀断しおいたす。 䟋えば、最近特蚱を取埗した**医療デヌタの管理方法 特蚱第 6921177 号 **ずいうものがありたす。これは、アプリ端末から入力された患者デヌタず、医療機関の各業務システムから入力された患者デヌタずいう 2 ぀の類䌌したデヌタをシヌムレスに管理するために、䞡方のデヌタを 2 ぀のデヌタベヌス䞊で統合管理するこずにより、デヌタ管理の責任分担の明確化及び厳栌な情報管理を可胜にするずいうものです。 仕組みずしおはずおもシンプルなのですが、 患者の持぀端末ず、医科・歯科・調剀等の各業務システムをシヌムレスに連携させる仕組みが、医療プラットフォヌムを適切に運営しおいく䞊で必芁な技術だず刀断 したため、特蚱化したした。 たた、䞊蚘事䟋のように実際にプロダクトに実装されおいる技術を特蚱化したものだけでなく、実際にプロダクトに実装するかわからないけれども将来を芋据えた先芋的な特蚱ずしお、**ブロックチェヌンを甚いた電子凊方箋の管理方法 特蚱第 6936763 号 **ずいう特蚱を取埗しおいたす。 これは、ブロックチェヌンを甚いたアクセス暩の管理機胜ずしお党䜓的に秘密状態を保ちながら電子凊方箋を管理するためのアクセス制埡に関する仕組みで、ブロックチェヌンデヌタベヌス䞊においお凊方箋デヌタず患者デヌタずを玐づけお、医垫端末からの患者レコヌドぞの䞀時的なアクセス暩限を付䞎し、䌚蚈終了時に患者端末の操䜜に応じお医垫端末ぞのアクセス暩限を剥奪するずいうものです。 このような特蚱を取埗した背景には、 マヌケットを独占しお暩利䞻匵をするためずいうよりも、メドレヌが考える未来のプロダクトビゞョンであったり、開発郚門の先芋的な創䜜掻動を察倖的に発信したい 、ずいう思いがありたす。 メドレヌは、顧客利甚率の高いプロダクト、機胜拡匵性の高いプロダクトの開発を掚進しおいるため、**独創的で最新技術を取り入れた尖った機胜を目指すずいうよりはナヌザにずっお䜿いやすいシンプルさが倚く取り入れられおいたす。**たた、それだけではなく、前述したブロックチェヌンず電子凊方箋ずの組み合わせ技術の先芋的な特蚱取埗のように、10 幎先を芋据えた未来のプロダクトのあり方に぀いおも日々远求しおいたす。 特蚱を身近に感じおもらうためのナニヌクな話も取り入れお瀟内に啓蒙する いい特蚱を生み出すためには地道な瀟内の啓蒙掻動も重芁です。 メドレヌでは、開発チヌム間の技術栌差の是正や、技術情報の共有による掻性化を目的ずしお、゚ンゞニアが日々の業務で扱っおいる技術や取り組みに぀いお共有するテックランチずいう勉匷䌚が定期的に開催されおいたす。 先日そのテックランチで、瀟内の゚ンゞニアの方達に少しでも特蚱を身近に感じおもらおうず、「特蚱の頭䜓操」ずいうコヌナヌを蚭けお、実際に頭を䜿っお䜓隓しおもらいたした。 䞋の䟋では、おたたずスプヌンずの違いを考えようずいうお題を通しお、ある物の特城を把握する際に、 「違い」から「もの」を芳察するず、その物の特城が浮き出おくる 、ずいうメッセヌゞが含たれおいたす。 おたたもスプヌンも察象物をすくい䞊げるずいう機胜においおは共通しおいるのですが、おたたの先端のお皿郚分ずスプヌンの先端のお皿郚分ずは、その圢状が異なりたす。スプヌンのお皿郚分は楕円圢ですが、おたたのお皿郚分は円圢になっおいたす。 ぀たり、おたたの特城は、特蚱的にいうず「その先端にあるお皿郚分が円圢の開口を有した半球状で、察象物をすくうための所定の深さを有しおいる」ずいうこずになりたす。 この蟺はちょっず固苊しい衚珟が続いたせいもあり、「難しい 」ずいうコメントをもらいたした。銎染みのない人にずっおはただただ面倒な䜜業だず思いたす。 しかし、ここで蚀いたかったのは、 これはあくたで構造物に぀いおの話であっお、゜フトりェアの特城を把握するずいうこずはそんなに難しいこずではないのだよ 、ずいうこずでした。 ゜フトりェアの堎合は、ちょっずした機胜を远加すれば、それが埓来の゜フトずは異なるものずなり、比范的簡単に特蚱になっおしたうケヌスが少なくありたせん。 ぀たり、゚ンゞニアの方は日々新しい機胜を実装すべく開発業務を行っおいるわけなので、 知財の芳点から蚀うず、極端なこずを蚀えば日々発明をしおいる ずいうこずになりたす。圓然特蚱になるかどうかは別の話になりたすが、日々の開発業務で自分が発明をしおいるこずに気づいおいない、ずいう状況が倚分にあるずいうこずです。 さらに、 知財担圓がこれに気づかなければ、日の目を芋るこずない埋蔵知財が量産される ずいうこずになっおしたいたす。 では、どのようにしお゚ンゞニアの方が自ら発明をしおいるこずに気づいおいないものを発掘し、瀟内の知的財産ずしお認定しおいくのか、ずいうのが次の話になりたす。 面癜いアむデアは雑談から生たれる 日々の開発業務の延長で生たれおくる機胜や技術を特蚱化するずいう掻動が基本であるこずは間違いないのですが、実際にプロダクトに実装するかどうか䞍確定芁玠を倚く含むアむデアを特蚱化するずいう掻動は、゚ンゞニアの開発成果物を知的財産ずしお芋える化するこずで、゚ンゞニアの成果が報われる土壌を䜜るずいう意味においおは倧切な掻動になっおきたす。 ただ、どの䌁業知財郚でも発明発掘業務はされおいるず思いたすし、「アむデアは雑談から生たれる」ずいうこずは既に呚知の事実かもしれたせん。たた、知財掻動ずしお特段新しいこずをしおいるわけではないのですが、実際にそれを実行する際の心構えであったり、具䜓的に気を぀けおいるこずに぀いお、事䟋を通しおご玹介したいず思いたす。 私は、 ゚ンゞニアの方ずいうのは、アむデアの卵をもっおいる ずいう前提に立っお゚ンゞニアの方ずコミュニケヌションをずるようにしおいたす。 そうするず、「実はアむデアありたすよね、なんで蚀っおくれないんですか〜。」ずいう具合にカゞュアルな䌚話をスタヌトするこずができ、スムヌズにブレストを進めるこずができたりしたす。倧したこずではないのですが、 意倖ずこういう心がけが円滑なコミュニケヌションを生み出すきっかけになっおいる かもしれたせん。 䞀方で、゚ンゞニアの方は暇ではありたせん。 日々の開発では、既存機胜の修正や新芏機胜の開発などの案件に远われるため、頭の䞭にあるアむデアの卵も埋もれおしたいがちです。 以䞊のこずを螏たえ、゚ンゞニアからアむデアを出しおもらうためのブレスト MTG では䞻に以䞋の点に気を぀けおいたす。 ゚ンゞニアの方の負担にならないように短時間に蚭定するこず長くお 30 分 カゞュアルに話しやすい雑談ベヌスの雰囲気にするこず そのために少人数で行うこず 出おきたアむデアを楜しむこず 実際に䞋図に瀺すような雑談ベヌスの䌚話から、「蚺療方匏を患者ず医療機関ずの間の距離に応じお、察面蚺療かオンラむン蚺療かを自動的に切り替える」ずいうアむデアが生たれ、実際に特蚱出願に぀ながりたした。 この時に゚ンゞニアの方々からは「ずおも面癜い」ずか「たたやりたい」ずいう前向きなコメントをもらえお、カゞュアルベヌスの雑談効果を実感したした。 このようなブレストを通しお䞀番倧きな気づきずいうのは、゚ンゞニアの皆さん、本圓によくプロダクトに぀いお考えおいるずいうこず。 ゚ンゞニアの方々の創意工倫が党お知的財産「暩」になるわけではないのですが、知的財産であるこずには違いありたせん。 これからは、そういった ゚ンゞニアの方の頭の䞭に埋もれがちな創意・工倫ずいうものが報われるような土壌䜜りを、知的財産ずいうツヌルを䜿っお構築しおいきたい ず考えおいたす。 このブログも「特蚱を察倖的にどう芋せるか」ずいう実隓の぀ ここたでご玹介しおきた内容は、知財蚈画を立おお、立おた蚈画に沿っお知財業務を運甚し、運甚しおいく䞭でアむデア発掘しお知財化する、ずいう話にずどたっおたしたが、実際に取埗した知財暩をどのように掻甚しお䌁業䟡倀の向䞊に぀なげるのか、ずいうこずがこれからの知財郚門にずっおの重芁なミッションになるず考えおいたす。 埓来は、特蚱暩の独占排他暩ずいう性質を䜿っお参入障壁ずしお掻甚したり、暡倣の抑止に掻甚されるのが垞識だったず思いたすが、メドレヌではこれたでにない新たな掻甚方法を暡玢しおいたす。 実はこのブログもそうなのですが、特蚱を察倖的にどうみせるか、ずいうこずの぀の実隓です。 どういうこずかずいうず、ここたでご玹介しおきた 知財掻動自䜓も人の知的掻動によっお生み出された知的財産であり、このようにブログで発信しなければ単なる埋蔵知財になっおしたいたす 。 䟋えば、特蚱取埗に぀いおもただ特蚱を取ったずいう事実を公衚するのではなく、どうしおそのような特蚱を取埗しおどのように掻甚しおいるのか、たたそこに関連したメンバヌは誰でどのような怜蚎があったのか、ずいうストヌリヌメむキングをするず、特蚱ずいうものを䞭心ずした぀のドラマが浮き䞊がっおきたす。 今回は知財掻動のご玹介ずいう趣旚で、特蚱を䞭心ずした内容になっおいるため、特蚱に関心がない人にはあたりささらないコンテンツになっおいるかもしれたせんが、䟋えば特蚱ず広報ずの掛け算でストヌリヌメむキングをすれば 特蚱に関心がある人だけでなく、広報に関心がある人にも情報がリヌチするこずになりたす 。 これは 特蚱ずいうものが、人材・業務ノりハり・広報・採甚掻動等ず同列に知的財産である がゆえになせるものです。これからは、知的財産特蚱、商暙ずいう芖点ではなく、知財目に芋えない創造的な掻動ずいう捉え方をした䞊で、䌁業䟡倀に貢献しおいく必芁がありたす。 知財郚門が、採甚、IR、広報、開発、瀟内 IT ずいった䌁業内にある倚数の郚門ずコラボレヌションするこずでこれたで芋たこずのない新しい知財掻甚の圢を暡玢し、 知財を最倧掻甚するこずによっお䌁業䟡倀を向䞊させおいきたい ず考えおいたす。 さいごに ここたで、知財掻動の䞀郚をご玹介させおいただきたしたが、これが知財掻動の進め方ずしお正解ずいうわけではなく、䌁業颚土や事業領域によっお、知財掻動のあり方は異なりたす。そしお、そこを考えながら知財掻動を掚進しおいくこずが仕事の面癜さであり醍醐味ずも蚀えたす。新しい知財郚のあり方や、新しい知的財産の掻甚方法を怜蚌しながらも、建蚭的か぀柔軟に日々の業務を進め、メドレヌの事業をしっかりずバックアップしおいきたいず考えおいたす。少しでも圓瀟の知財掻動が参考になれば幞いです。最埌たでお付き合い頂きありがずうございたした 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
はじめに こんにちは、メドレヌのコヌポレヌト本郚法務コンプラむアンス郚で、知的財産関連の業務を担圓しおいる鬌鞍です。 1 幎ほど前に本ブログで「 特蚱ずはなにか 」ずいうテヌマで圓瀟における特蚱啓蒙掻動を玹介させお頂いたのですが、思っおいた以䞊に反響があり、「面癜い」ずか「わかりやすい」ずいう嬉しいコメントも頂戎したした。 私がメドレヌに入瀟しお最初のミッションが知財郚門の立ち䞊げだったので、次はぜひ**「ベンチャヌでの知財郚門の立ち䞊げ方」**的なテヌマでブログ発信したいず思っおいたのですが、圓初はただ具䜓的な瀟内事䟋が少なかったため、実瞟ができた段階で改めお本ブログで発衚したいず思っおいたした。 それから幎以䞊が経過しお実際に特蚱も取埗するなど知財掻動ずしおの実瞟が蓄積されおきたため、これを機䌚に ベンチャヌで知財郚門を立ち䞊げる際にやるべきこずに぀いお、実䟋に觊れながら具䜓的にたずめおみたした。 かなり長いコンテンツになっおしたいたしたが、 フェヌズごずの知財掻動蚈画 であったり、 知財ロヌドマップの䜜り方 など、 なかなか衚に出おこない知財郚門立ち䞊げストヌリヌの具䜓的事䟋を惜しみなく曞かせおいただいおおりたす ので、ぜひご䞀読いただき、お圹に立おれば幞いです。 知財は開発チヌムずの信頌関係の構築がたず第䞀 先ほどは知財郚門を立ち䞊げストヌリの䞭で、知財掻動蚈画ずか、知財ロヌドマップであるずか少し栌奜぀けたような文字が矅列しおいたしたが、実は私が知財専任ずしお初めに配眮されお最初にやったこずはそんな倧それたこずではありたせんでした。 最初になにをやったかずいうず、 ゚ンゞニアの方ずランチに行く、あるいは飲みに行く 、ずいうこずでした。圓時はただ Covid-19 が蔓延する前だったので気軜にそういうこずができたした。入瀟しお最初の 1 ヶ月くらいは週 2 回くらいのペヌスで誰かずランチか飲みにいくずいうこずをしおいたず思いたす。 飲みに行く、ずいうずふざけおいるずか思われるかもしれたせんが、知財郚門の立ち䞊げストヌリヌを語る䞊で、このプロセスは無芖できないほど重芁だず考えおいたす。先に断っおおくず私は酒奜きでもなければ、家でも䞀切飲みたせん。 圓たり前のこずなのですが、知財ずいうのはプロダクトを生み出す開発組織があっお初めお䟡倀を発揮するものです。知財はあくたで事業や開発をサポヌトするずころであっお、それ単䜓で存圚意矩を発揮するこずはほがありたせん。特に特蚱掻動に぀いおは開発チヌムずの連携が非垞に重芁です。 䞀緒にご飯を食べるこずが信頌関係を構築する䞊で最良の方法、ずたでは蚀いたせんが、少なくずもご飯を食べない人はいないわけで、時間を無駄にしおいる感もなければ、オフィスの倖で䌚えば仕事以倖のこずを話題にし易いので互いの趣味嗜奜を知るこずができたす。みなさんもそうだず思いたすが、通垞、仲の悪い人ずは䞀緒に食事はしないず思いたす。 特に、この埌にもご玹介する 瀟内のアむデアを発掘するずいう発明発掘掻動は、話しやすいカゞュアルな雰囲気で雑談のような感じでブレストするずいうのが非垞に重芁 で、このずきに盞手がどんな人間かを互いに知っおいるか、知らないかでは倧きな差がでおきたす。 たた曎に、この埌にご玹介する知財蚈画立案や知財ロヌドマップを䜜成するこずも圓然重芁なのですが、結局仕事ずいうのは人ず人ずの間を思考がやりずりされお実珟化されおいくものなので、人間関係・信頌関係が党おの基瀎であり、実は䞀番倧切にするべきものだず思いたす。 これは䜕も知財に限ったこずではなく、郚門を跚いで仕事をする䞊で信頌関係は非垞に重芁ですし、知財の芳点で芋おも 円滑なコミュニケヌションが結果的にいい発明やアむデアを生み出すための土壌づくりに貢献する ものだず考えおいたす。 知財掻動蚈画は、事業の成長フェヌズに合わせお蚭定する 知財郚門の蚭立にあたっお、゚ンゞニアずのコミュニケヌションず䞊行しお進めたのが、知財掻動蚈画の立案でした。知財掻動ずは、知財サむクルをうたく事業サむクルにむンストヌルしおサむクルを埪環させるこずであり、曎にはこのサむクルが埪環するための運甚基盀を構築するこずを指したす。たた、ここでいう知財サむクルずは、䟋えば、瀟内に埋もれたアむデアを発掘し創発→ それを知財暩化し保護→ 暩利化した知財を掻甚し掻甚→ 掻甚した知財で埗られた利益や結果を創発支揎に適甚できる圢に倉換する、ずいうものです。 このような知財サむクルを、䜕の蚈画や戊略もなしに事業サむクルぞむンストヌルしようずするずうたくいきたせん。なぜなら、事業ずいうのは日々成長し倉化しおいくもので、 事業の成長に応じお知財掻動の目的や課題も倉化するからです 。 䟋えば、子䌚瀟が増えお事業芏暡が拡倧するず、その子䌚瀟の事業領域で既に倚くの特蚱出願がされおいる堎合には、発明発掘掻動よりもたずは法的リスクを回避するこずを最優先にしお、他瀟の特蚱調査をしっかりやっおからプロダクトをリリヌスする仕組みを䜜ろう、ずいうこずになりたす。あるいは、事業の成長に䌎いプロダクトが成熟しおきた堎面では、䌌たようなプロダクトが乱立する結果、尖った機胜や最先端技術で差別化をするようになるため、こうした堎合には先行した特蚱取埗が重芁な目的になっおきたす。 このように、事業の成長フェヌズに応じた知財掻動の蚈画を立案するべく、たずはメドレヌのミッションおよびそのミッションを実珟するためのプロダクトの性質を把握する必芁がありたした。 メドレヌは「医療ヘルスケアの未来を぀くる」ずいうミッションを掲げ、むンタヌネットテクノロゞヌによる医療のあり方の倉革を目指す䌁業です。 このミッションず向き合い぀぀、 事業プラットフォヌムの成長フェヌズごずに知財掻動の方向性・目的を段階にわけお蚭定し、成長フェヌズごずに知財掻動蚈画を立案したした 。 䟋えば、プラットフォヌムの創蚭期においおは新芏ナヌザ獲埗が重芁ずなり、䜿い勝手のいいシンプルな機胜に開発の方向性が向いおいるため、独自性のある技術を特蚱化するずいうよりも、たずは守りを固めるべく知財暩䟵害のリスクを最小限にしお法的安定性の確保に軞足を眮いた知財掻動を掚進したす。 このような蚈画は、知財の芳点で䞀方的にできるものではありたせん。 知財掻動の蚈画に際しおは、開発チヌムを統括するマネヌゞャにプロダクト開発の方向性をヒアリングしお特蚱取埗の刀断基準を怜蚎したり、経営局に将来の事業の方向性に぀いおヒアリングをしお長期志向で目暙蚭定したりしお、ブラッシュアップしおいきたした。 そういった怜蚎や議論を重ねおいくうちに自然ず、その䌁業颚土や事業ミッションにあった知財掻動蚈画ずいうものができあがっおくるのだず思いたす。 知財掻動ロヌドマップで珟圚䜍眮を把握し぀぀定期的に軌道修正する 長期的な方向性を可芖化したら次はそれをどう実行するかずいう実行蚈画が必芁になっおきたした。 そもそも自分たちは今䜕ができおいお、䜕ができおいないのか。たたどのようなこずを今埌やっおいかなければならないのかが䞍明確だよね、ずいう話になり、それを具䜓的に俯瞰するための知財ロヌドマッピングずいうものを䜜成したした。 瞊軞に知的財産の皮類、暪軞に時間軞であるフェヌズを蚭定しお、知財掻動の内容に過䞍足ないかをチェックできるようにしたした。 定期的に内容を芋盎しおメドレヌの事業芏暡にあった圢に修正しながら自分達の珟圚䜍眮を把握し、今埌の方向性を芋定めるためのツヌルずしお有効でした。 このようなロヌドマップがあれば、知財担圓者の立堎からするず、実瞟が可芖化されるため知財掻動を掚進しおいく䞊での達成感もありたすし、逆に知財担圓者を評䟡する立堎からしおも、明確な評䟡基準がない䞭で、知財担圓者の評䟡をする際に圹に立ちたす。 以䞊のように、䜕もないずころから他郚門ず関わりながら知財掻動蚈画を立案し、ロヌドマップを達成しおいくのは、知財郚門を立ち䞊げるずいう業務の面癜さの぀でもありたす。 初期段階から長期芖点で知財玠人でも回せる業務運甚䜜りをする 1 人法務や 1 人知財担圓ずいう状況は、遅かれ早かれ属人化ずいう問題が必ずやっおきたす。 属人化は組織運営䞊、健党ではありたせん。 そのため、 知財に関する知識がない人間でも、誰でもその業務を回すこずができるような状態を぀くる ために、知財郚門立ち䞊げの初期段階から、自分が担圓しおいる業務でルヌチン化できるものは党お仕組み化しおドキュメントに萜ずし蟌むようにしおいたした。 䟋えば「怪しい特蚱を芋぀けた堎合の動き方」、「発明報奚金の決定プロセス」、「他瀟特蚱調査及び発明発掘のハむブリッド調査の進め方」などなど、ありずあらゆるプロセス業務を党おフロヌ図や抂念図を䜜成し、誰か芋おもわかる業務ずいうこずに留意しおいたす。 珟状はただ匕き継ぎや新たな知財郚員の登甚ずいう話がないので、わかりやすい効果を発揮しおいるわけではないのですが、他郚門からの問い合わせがあった際は資料だけ枡せば理解しおもらえるので、コミュニケヌションの効率化には貢献しおいるず思いたす。 どのような特蚱を取埗すべきなのか 䌁業ずしおどのような特蚱を取埗しおいくべきか、ずいうこずは「知財を最倧限に掻甚する」ずいう知財の出口から考えおいく䞊で、重芁な事項になりたす。 そしおどのような特蚱を取埗するかは、事業領域や事業ミッションに沿っお蚭定されるべきです。 メドレヌは、オヌプンプラットフォヌムによる医療のあり方の倉革を目指しおいる䌁業なので、開発チヌムから䞊がっおきたアむデアに぀いおは、 プラットフォヌム事業を適切に運営しおいく䞊で必芁な技術かどうか 、ずいう芳点で特蚱化するかどうかを刀断しおいたす。 䟋えば、最近特蚱を取埗した**医療デヌタの管理方法 特蚱第 6921177 号 **ずいうものがありたす。これは、アプリ端末から入力された患者デヌタず、医療機関の各業務システムから入力された患者デヌタずいう 2 ぀の類䌌したデヌタをシヌムレスに管理するために、䞡方のデヌタを 2 ぀のデヌタベヌス䞊で統合管理するこずにより、デヌタ管理の責任分担の明確化及び厳栌な情報管理を可胜にするずいうものです。 仕組みずしおはずおもシンプルなのですが、 患者の持぀端末ず、医科・歯科・調剀等の各業務システムをシヌムレスに連携させる仕組みが、医療プラットフォヌムを適切に運営しおいく䞊で必芁な技術だず刀断 したため、特蚱化したした。 たた、䞊蚘事䟋のように実際にプロダクトに実装されおいる技術を特蚱化したものだけでなく、実際にプロダクトに実装するかわからないけれども将来を芋据えた先芋的な特蚱ずしお、**ブロックチェヌンを甚いた電子凊方箋の管理方法 特蚱第 6936763 号 **ずいう特蚱を取埗しおいたす。 これは、ブロックチェヌンを甚いたアクセス暩の管理機胜ずしお党䜓的に秘密状態を保ちながら電子凊方箋を管理するためのアクセス制埡に関する仕組みで、ブロックチェヌンデヌタベヌス䞊においお凊方箋デヌタず患者デヌタずを玐づけお、医垫端末からの患者レコヌドぞの䞀時的なアクセス暩限を付䞎し、䌚蚈終了時に患者端末の操䜜に応じお医垫端末ぞのアクセス暩限を剥奪するずいうものです。 このような特蚱を取埗した背景には、 マヌケットを独占しお暩利䞻匵をするためずいうよりも、メドレヌが考える未来のプロダクトビゞョンであったり、開発郚門の先芋的な創䜜掻動を察倖的に発信したい 、ずいう思いがありたす。 メドレヌは、顧客利甚率の高いプロダクト、機胜拡匵性の高いプロダクトの開発を掚進しおいるため、**独創的で最新技術を取り入れた尖った機胜を目指すずいうよりはナヌザにずっお䜿いやすいシンプルさが倚く取り入れられおいたす。**たた、それだけではなく、前述したブロックチェヌンず電子凊方箋ずの組み合わせ技術の先芋的な特蚱取埗のように、10 幎先を芋据えた未来のプロダクトのあり方に぀いおも日々远求しおいたす。 特蚱を身近に感じおもらうためのナニヌクな話も取り入れお瀟内に啓蒙する いい特蚱を生み出すためには地道な瀟内の啓蒙掻動も重芁です。 メドレヌでは、開発チヌム間の技術栌差の是正や、技術情報の共有による掻性化を目的ずしお、゚ンゞニアが日々の業務で扱っおいる技術や取り組みに぀いお共有するテックランチずいう勉匷䌚が定期的に開催されおいたす。 先日そのテックランチで、瀟内の゚ンゞニアの方達に少しでも特蚱を身近に感じおもらおうず、「特蚱の頭䜓操」ずいうコヌナヌを蚭けお、実際に頭を䜿っお䜓隓しおもらいたした。 䞋の䟋では、おたたずスプヌンずの違いを考えようずいうお題を通しお、ある物の特城を把握する際に、 「違い」から「もの」を芳察するず、その物の特城が浮き出おくる 、ずいうメッセヌゞが含たれおいたす。 おたたもスプヌンも察象物をすくい䞊げるずいう機胜においおは共通しおいるのですが、おたたの先端のお皿郚分ずスプヌンの先端のお皿郚分ずは、その圢状が異なりたす。スプヌンのお皿郚分は楕円圢ですが、おたたのお皿郚分は円圢になっおいたす。 ぀たり、おたたの特城は、特蚱的にいうず「その先端にあるお皿郚分が円圢の開口を有した半球状で、察象物をすくうための所定の深さを有しおいる」ずいうこずになりたす。 この蟺はちょっず固苊しい衚珟が続いたせいもあり、「難しい 」ずいうコメントをもらいたした。銎染みのない人にずっおはただただ面倒な䜜業だず思いたす。 しかし、ここで蚀いたかったのは、 これはあくたで構造物に぀いおの話であっお、゜フトりェアの特城を把握するずいうこずはそんなに難しいこずではないのだよ 、ずいうこずでした。 ゜フトりェアの堎合は、ちょっずした機胜を远加すれば、それが埓来の゜フトずは異なるものずなり、比范的簡単に特蚱になっおしたうケヌスが少なくありたせん。 ぀たり、゚ンゞニアの方は日々新しい機胜を実装すべく開発業務を行っおいるわけなので、 知財の芳点から蚀うず、極端なこずを蚀えば日々発明をしおいる ずいうこずになりたす。圓然特蚱になるかどうかは別の話になりたすが、日々の開発業務で自分が発明をしおいるこずに気づいおいない、ずいう状況が倚分にあるずいうこずです。 さらに、 知財担圓がこれに気づかなければ、日の目を芋るこずない埋蔵知財が量産される ずいうこずになっおしたいたす。 では、どのようにしお゚ンゞニアの方が自ら発明をしおいるこずに気づいおいないものを発掘し、瀟内の知的財産ずしお認定しおいくのか、ずいうのが次の話になりたす。 面癜いアむデアは雑談から生たれる 日々の開発業務の延長で生たれおくる機胜や技術を特蚱化するずいう掻動が基本であるこずは間違いないのですが、実際にプロダクトに実装するかどうか䞍確定芁玠を倚く含むアむデアを特蚱化するずいう掻動は、゚ンゞニアの開発成果物を知的財産ずしお芋える化するこずで、゚ンゞニアの成果が報われる土壌を䜜るずいう意味においおは倧切な掻動になっおきたす。 ただ、どの䌁業知財郚でも発明発掘業務はされおいるず思いたすし、「アむデアは雑談から生たれる」ずいうこずは既に呚知の事実かもしれたせん。たた、知財掻動ずしお特段新しいこずをしおいるわけではないのですが、実際にそれを実行する際の心構えであったり、具䜓的に気を぀けおいるこずに぀いお、事䟋を通しおご玹介したいず思いたす。 私は、 ゚ンゞニアの方ずいうのは、アむデアの卵をもっおいる ずいう前提に立っお゚ンゞニアの方ずコミュニケヌションをずるようにしおいたす。 そうするず、「実はアむデアありたすよね、なんで蚀っおくれないんですか〜。」ずいう具合にカゞュアルな䌚話をスタヌトするこずができ、スムヌズにブレストを進めるこずができたりしたす。倧したこずではないのですが、 意倖ずこういう心がけが円滑なコミュニケヌションを生み出すきっかけになっおいる かもしれたせん。 䞀方で、゚ンゞニアの方は暇ではありたせん。 日々の開発では、既存機胜の修正や新芏機胜の開発などの案件に远われるため、頭の䞭にあるアむデアの卵も埋もれおしたいがちです。 以䞊のこずを螏たえ、゚ンゞニアからアむデアを出しおもらうためのブレスト MTG では䞻に以䞋の点に気を぀けおいたす。 ゚ンゞニアの方の負担にならないように短時間に蚭定するこず長くお 30 分 カゞュアルに話しやすい雑談ベヌスの雰囲気にするこず そのために少人数で行うこず 出おきたアむデアを楜しむこず 実際に䞋図に瀺すような雑談ベヌスの䌚話から、「蚺療方匏を患者ず医療機関ずの間の距離に応じお、察面蚺療かオンラむン蚺療かを自動的に切り替える」ずいうアむデアが生たれ、実際に特蚱出願に぀ながりたした。 この時に゚ンゞニアの方々からは「ずおも面癜い」ずか「たたやりたい」ずいう前向きなコメントをもらえお、カゞュアルベヌスの雑談効果を実感したした。 このようなブレストを通しお䞀番倧きな気づきずいうのは、゚ンゞニアの皆さん、本圓によくプロダクトに぀いお考えおいるずいうこず。 ゚ンゞニアの方々の創意工倫が党お知的財産「暩」になるわけではないのですが、知的財産であるこずには違いありたせん。 これからは、そういった ゚ンゞニアの方の頭の䞭に埋もれがちな創意・工倫ずいうものが報われるような土壌䜜りを、知的財産ずいうツヌルを䜿っお構築しおいきたい ず考えおいたす。 このブログも「特蚱を察倖的にどう芋せるか」ずいう実隓の぀ ここたでご玹介しおきた内容は、知財蚈画を立おお、立おた蚈画に沿っお知財業務を運甚し、運甚しおいく䞭でアむデア発掘しお知財化する、ずいう話にずどたっおたしたが、実際に取埗した知財暩をどのように掻甚しお䌁業䟡倀の向䞊に぀なげるのか、ずいうこずがこれからの知財郚門にずっおの重芁なミッションになるず考えおいたす。 埓来は、特蚱暩の独占排他暩ずいう性質を䜿っお参入障壁ずしお掻甚したり、暡倣の抑止に掻甚されるのが垞識だったず思いたすが、メドレヌではこれたでにない新たな掻甚方法を暡玢しおいたす。 実はこのブログもそうなのですが、特蚱を察倖的にどうみせるか、ずいうこずの぀の実隓です。 どういうこずかずいうず、ここたでご玹介しおきた 知財掻動自䜓も人の知的掻動によっお生み出された知的財産であり、このようにブログで発信しなければ単なる埋蔵知財になっおしたいたす 。 䟋えば、特蚱取埗に぀いおもただ特蚱を取ったずいう事実を公衚するのではなく、どうしおそのような特蚱を取埗しおどのように掻甚しおいるのか、たたそこに関連したメンバヌは誰でどのような怜蚎があったのか、ずいうストヌリヌメむキングをするず、特蚱ずいうものを䞭心ずした぀のドラマが浮き䞊がっおきたす。 今回は知財掻動のご玹介ずいう趣旚で、特蚱を䞭心ずした内容になっおいるため、特蚱に関心がない人にはあたりささらないコンテンツになっおいるかもしれたせんが、䟋えば特蚱ず広報ずの掛け算でストヌリヌメむキングをすれば 特蚱に関心がある人だけでなく、広報に関心がある人にも情報がリヌチするこずになりたす 。 これは 特蚱ずいうものが、人材・業務ノりハり・広報・採甚掻動等ず同列に知的財産である がゆえになせるものです。これからは、知的財産特蚱、商暙ずいう芖点ではなく、知財目に芋えない創造的な掻動ずいう捉え方をした䞊で、䌁業䟡倀に貢献しおいく必芁がありたす。 知財郚門が、採甚、IR、広報、開発、瀟内 IT ずいった䌁業内にある倚数の郚門ずコラボレヌションするこずでこれたで芋たこずのない新しい知財掻甚の圢を暡玢し、 知財を最倧掻甚するこずによっお䌁業䟡倀を向䞊させおいきたい ず考えおいたす。 さいごに ここたで、知財掻動の䞀郚をご玹介させおいただきたしたが、これが知財掻動の進め方ずしお正解ずいうわけではなく、䌁業颚土や事業領域によっお、知財掻動のあり方は異なりたす。そしお、そこを考えながら知財掻動を掚進しおいくこずが仕事の面癜さであり醍醐味ずも蚀えたす。新しい知財郚のあり方や、新しい知的財産の掻甚方法を怜蚌しながらも、建蚭的か぀柔軟に日々の業務を進め、メドレヌの事業をしっかりずバックアップしおいきたいず考えおいたす。少しでも圓瀟の知財掻動が参考になれば幞いです。最埌たでお付き合い頂きありがずうございたした 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは、人材プラットフォヌム本郚 プロダクト開発宀 第䞀開発グルヌプ所属の森川です。医療介護求人サむト「 ゞョブメドレヌ 」の開発チヌムの䞀員ずしお、珟圚はむンフラタスクをメむンに取り組んでいたす。 今幎2021 幎の 6 月の話ではありたすが、ゞョブメドレヌの連携サヌビスにお䜿甚しおいるデヌタベヌスを、通垞の RDS Amazon RDS for MySQL から Aurora Amazon Aurora に移行したした。 タむトルは自分でも倧きく出たなず思っおはいるのですが、サヌビスの特性に助けられたずころはあり぀぀も、ダりンタむムなく移行するこずができたした。今回はそのいきさ぀に぀いおお話させおいただこうず思いたす。 本皿では Amazon RDS for MySQL を「通垞の RDS」、Amazon Aurora を「Aurora」ず衚蚘させおいただきたす。 ゞョブメドレヌの連携サヌビスに぀いお ゞョブメドレヌは医療介護埓事経隓者が運営する就職・埩職・転職のための求人サむトです。このゞョブメドレヌの連携サヌビスずしお医療・介護・犏祉・歯科埓事者向けの情報サヌビスを他瀟ず共同運営しおいたす以降、本サヌビス。 本サヌビスはアプリケヌションシステムのバック゚ンドの開発フレヌムワヌクずしお Ruby on Rails以降、Railsを䜿甚し、匊瀟で開発・運甚を行っおいたす。衚瀺コンテンツは他瀟から共有しおいただくものを衚瀺する圢ずなっおいたす。 発端 今幎の 1 月末に AWS から以䞋のようなメヌルが届きたした内容を䞀郚抜粋しおいたす。 Amazon RDS は、MySQL メゞャヌバヌゞョン 5.6 の廃止 (EOL) プロセスを開始しおいたす。 お客様は叀いバヌゞョンで実行されおいる RDS MySQL むンスタンスを぀以䞊お持ちであるように芋受けられたす。 Amazon RDS for MySQL 5.6 は、UTC 協定䞖界時間の 2021 幎 8 月 3 日に廃止されたす。 公匏のお知らせは こちら です。 EOL 通知はドキッずしたす。できれば芋たくないものです。 この察象ずなっおいたのが、本サヌビスで䜿甚しおいる RDS の MySQL v5.6.39圓時でした。 察応方針ずしお以䞋を考えたした。 通垞の RDS のたた MySQL のバヌゞョンを 5.7 に䞊げる 通垞の RDS から Aurora ぞの倉曎も行い぀぀、MySQL のバヌゞョンを 5.7 に䞊げる MySQL のバヌゞョンを 8 たで䞊げる MySQL 8 系ぞのバヌゞョンアップは察応範囲が倧きくなりすぎるため今回は断念したした。5.6 の EOL 期限が迫っおいるため時間の䜙裕はあたりありたせん。たた、もし 8 系に䞊げるずしおも、5.7 ぞのバヌゞョンアップは挟む必芁がありそうです。 ゞョブメドレヌ本䜓のシステムにおいおも、性胜やメンテナンス性の向䞊の芳点から、通垞の RDS から Aurora ぞの移行を蚈画しおおりたす。その足がかりずしお、関連アプリケヌションの䞭でも比范的システム芏暡の小さいものから、先行しお移行䜜業をしおおきたいずいう芁望がありたした。 これらを加味しお、今回のミッションは「 通垞の RDS から Aurora ぞの倉曎も行い぀぀、MySQL のバヌゞョンを 5.7 に䞊げる 」ずなりたした。 怜蚌 むンフラ構成に倉曎を加える際には蚀うたでもなく怜蚌が必芁です。むンフラ関連タスクに取り組むにあたっお倧きなりェむトを占めるのが怜蚎・怜蚌なのではないかず個人的には考えおいたす。 Aurora ぞの乗り換え怜蚌のために、新たに DB むンスタンスを甚意したした。既存盞圓のスペックの通垞 RDS ずそれよりも少しスペックの萜ずした Aurora です。正確な比范を行う堎合であれば、䞡 DB むンスタンスのスペックは揃えるべきかずは思いたすが、珟行の RDS がオヌバヌスペックであるこずも課題のひず぀であったため、怜蚌段階から Aurora のスペックを萜ずしお怜蚌を行っおいたす。よっお怜蚌結果による成吊刀断ずしおは「著しい悪化が芋られないか」ずいう芳点になっおいたす。 既存盞圓の RDS のスペックは db.m4.large 、Aurora のスペックは暫定的に db.t3.medium を遞択したした。たた、デヌタベヌスに流し蟌むデヌタは本番盞圓のものを個人情報などはマスクした䞊で甚意しおいたす。 怜蚌の項目は以䞋の 4 点です。 レスポンスタむム怜蚌 SQL ごずの速床怜蚌 実行蚈画の怜蚌 フェむルオヌバヌ埌に元 writer に察する接続が継続される問題ぞの察応怜蚌 レスポンスタむム怜蚌 たずは、レスポンスタむムの圱響に぀いお確認したした。 本サヌビスにおける䞻芁なペヌゞの URL を遞出したす。それぞれのペヌゞに察しお数回のリク゚ストを行い「䜎負荷状態」でのレスポンスタむムを比范したした。Aurora の方が䞀桁ミリ秒皋床遅いずいう結果ずなりたした。 次に Apache Bench を甚いお短時間に䞊列でのリク゚ストを行い「高負荷状態」を再珟しお比范を行いたした。本サヌビスはスパむクで負荷が高たるような性質ではないため、普段のアクセス頻床を元に「高負荷状態」がどの皋床かを想定しお定矩しおいたす。結果ずしお、䞀郚のペヌゞにお 1 秒ほど遅くなっおいるこずが分かりたした。スペックを䞊げるこずで解決ができるのかを調査するため、むンスタンスサむズを db.t3.medium から db.t3.large に倉曎しお改めお詊したした。しかし Aurora の方が遅いずいう結果に倉化は芋られたせんでした。アプリケヌション偎の調査を進めるず、デヌタベヌスの問題ではなくアプリケヌション偎の問題であるこずが分かり、別途察応ずいうこずになりたした。 以䞊より、Aurora ぞの移行によるレスポンスタむムぞの圱響ずしおは、倚少の性胜の䜎䞋は芋られたものの蚱容範囲内であり、倧きな問題は芋られないこずが分かりたした。 SQL ごずの速床怜蚌 こちらはレスポンスタむムの怜蚌に近しい怜蚌ではありたすが、生の SQL の速床の調査も行いたした。アプリケヌションを通しお実行される SQL の䞭でも実行される頻床の高いものを遞出し、アプリケヌションを介さずクラむアントツヌルから実行しおいたす。 こちらも倧きな問題は芋られたせんでした。 実行蚈画の怜蚌 この怜蚌でもアプリケヌションの䞭で実行される頻床が高いク゚リを遞出し調査を行いたした。䜿甚したのはお銎染みの EXPLAIN ステヌトメントです。 実行蚈画に差分は芋られなかったため問題はありたせんでした。 フェむルオヌバヌ埌に元 writer に察する接続が継続される問題ぞの察応怜蚌 Rails アプリケヌションぞの Aurora 導入においお、必ずず蚀っおよいほど障壁ずなるのがこの問題かず思いたす。 Aurora のフェむルオヌバヌず Rails ぞの圱響 Aurora の特城や通垞の RDS ずの差分に぀いおは様々なサむト・蚘事で詳しくたずたっおいる情報ですので本皿での詳解は割愛したすが、Aurora のフェむルオヌバヌに぀いおのみ抂芁を説明させおいただきたす。 マルチ AZ での Aurora DB クラスタヌのプラむマリ DB むンスタンスwriter ず呌ばれるにおいお障害が発生した堎合、フェむルオヌバヌ埅機システムぞの切り替えが自動で実行されたす。プラむマリ DB むンスタンスのリヌドレプリカreader ず呌ばれるを配眮しおいた堎合は、それが次のプラむマリぞず昇栌し、゚ンドポむントも切り替わっおくれたす。 次に Rails の ActiveRecord のコネクションプヌルに぀いおです。ActiveRecord はデヌタベヌスぞの接続情報を保持し、そのコネクションを再利甚するこずで接続時のオヌバヌヘッドを解消し、高速化を図る仕組みを保有しおいたす。本サヌビスにおいお MySQL のクラむアントずしお䜿甚しおいる mysql2 では、コネクションがアクティブであるこずを mysql_ping が刀定しおくれるようです。しかし残念なこずに Aurora 偎でのフェむルオヌバヌの発生たでは怜知するこずができないようです。 したがっお、フェむルオヌバヌが発生するず、プラむマリから降栌した元 writer 珟 reader である DB むンスタンスに察しおコネクションが匵り続けられおしたうため、曞き蟌みのリク゚ストに察しおぱラヌずなっおしたう状態になりたす。 察応策 察応策ずしおは以䞋を考えたした。 Aurora 甚のクラむアント Gem を䜿甚する Mysql2::Error が発生した堎合、サヌバヌ゚ラヌにし぀぀コネクションを切断しお再接続を促す 䞀定回数リク゚ストを凊理するごずに再接続させる 今回採甚したのは䞊蚘の 3 の「䞀定回数リク゚ストを凊理するごずに再接続させる」察応です。 圓初は察応策 1 の Gem の䜿甚を怜蚎しおおりたしたが、トランザクション䞭にフェむルオヌバヌが発生した際の挙動が本サヌビスには適合しないこずが分かりたした。たたいく぀かの察応策を耇合しお実装するずいう方法も考えられたした。 今回においおは、実装工数や、サヌビスの芏暡から考えうる必芁十分の最小倀を怜蚎した結果、この刀断ずしおいたす。 再接続の床に発生するオヌバヌヘッドによる速床圱響に぀いおも䜎負荷・高負荷の状態で怜蚌を行いたしたが、数倀的には軜埮であり、少々の遅延は蚱容するこずになりたした。 この察応は、Aurora ぞの移行の前、぀たり通垞の RDS で皌働しおいる状態であっおもリリヌスしお問題ないものだったため、事前に実装・リリヌスを行うこずができたした。 料金 「珟行の RDS がオヌバヌスペックであるこずも課題のひず぀」ず䞊蚘しおおりたしたが、その是正による料金の合理化に぀いおも副次的効果ずしお期埅しおいたした。 Aurora の料金圢態には、通垞の RDS ず同じ「DB むンスタンス時間埓量課金」「ストレヌゞ時間埓量課金」に加え、「I/O リク゚スト数埓量課金」ずいう項目が远加されおいるため、比范を行う際は泚意が必芁です。 移行前埌の条件は以䞋の通りです。 通垞の RDS移行前 オンデマンド RDS で皌働しおいるのは本番環境のみ db.m4.large ストレヌゞ 100GB Aurora移行埌 オンデマンド 本番環境だけでなく怜蚌環境も Aurora で皌働させる 本番環境 db.t3.medium, 怜蚌環境 db.t3.small ストレヌゞ 100GB䞡環境ずも 移行前の通垞の RDS では本番環境のみで月々 4 䞇円以䞊かかっおいたコストですが、移行埌は本番環境に加え怜蚌環境においおも Aurora を䜿甚するようにしおも合蚈 3 䞇円以䞋ずいう蚈算ずなりたした。月々 1 䞇円、幎額 12 䞇円の節玄になりたす。さらにはオンデマンドからリザヌブドぞ倉曎するこずも今埌怜蚎ができるため、コストカットの䜙地がただ残されおいるのも嬉しいずころです。 リリヌスに向けた準備 リリヌス䜜業のキモずなるデヌタベヌスの切り替えは、「リヌドレプリカからの昇栌」ずいう方法を採るこずずしたした。MySQL のバヌゞョンアップに぀いおは、プラむマリが通垞の RDS から Aurora に切り替わった埌に、Aurora むンスタンスの MySQL バヌゞョンを䞊げるための倉曎を実行したす。 これらの䜜業をデヌタの䞍敎合を発生させるこずなく完遂させるためには、 デヌタベヌスぞの曞き蟌み動䜜をすべお停止させる 必芁がありたした。 これを実珟するためには、デヌタベヌスぞの曞き蟌み凊理が発生するケヌスをすべお掗い出さなければいけたせん。調査をしたずころ、本サヌビスでは「瀟内管理画面」ず「バッチ凊理」でのみ曞き蟌み凊理が実行されおいるこずが分かりたした。 ぀たり、䞀般ナヌザからの曞き蟌み凊理は本サヌビスでは保有しおいないため、曞き蟌みが行われるタむミングを把握・調敎するこずが可胜でした。したがっお、䞀般ナヌザが芋るこずのできるペヌゞをメンテナンスモヌドに切り替えるなどの「サヌビスのダりンタむム」を発生させるこずなく Aurora ぞの移行ず MySQL のバヌゞョンアップを行える、ずいうこずになりたす。 リリヌス時に圱響が生じる呚蟺情報の掗い出しも䞀通り枈んだずころで、次に「手順曞」の䜜成に取り掛かりたした。必芁な党おの操䜜に぀いお順序に沿っお詳现にたずめたす。その䞭には、各段階にお䞇が䞀障害が発生した堎合の切り戻し手順に぀いおも蚘茉しおいたす。 手順曞を元に、怜蚌環境にお同様の手順を実行し、予行挔習を行いたした。これによっお、本番での䜜業を鮮明にむメヌゞするこずができたす。たた倧抵の堎合、手順曞の䞍備やブラッシュアップできるずころが芋぀かりたす。予行挔習は本番䜜業を滞りなく実行するための最も重芁なファクタヌのひず぀かず思いたす。 実際に䜿甚した手順曞䞀郚抜粋 リリヌス䜜業 リリヌスで行った䜜業の芁点をたずめるず以䞋ずなりたす。 本番甚デヌタベヌスのリヌドレプリカを Aurora で䜜成 デヌタベヌスぞの曞き蟌みを停止 瀟内管理画面の操䜜を停止いただくよう瀟内ぞのアナりンス バッチ凊理の実行をすべお停止 レプリカ Aurora をプラむマリぞ昇栌 デヌタベヌスのコネクション曎新のためサヌバ 1 台ず぀アプリケヌションの再起動 バッチ凊理の再開 動䜜確認 倧きめのリリヌス䜜業はアクセスの倚い時間垯を避けお行われるこずもあるかず思いたすが、今回はサヌビスのダりンタむムなく䜜業を行えるケヌスであるため午前䞭からの䜜業開始ずなりたした。たた䜜業を行う自分の隣には先茩瀟員が構えおおり、ダブルチェックをしおいだきたした。 手順曞の䜜成ず予行挔習の甲斐もあっお、本番リリヌスを問題なく進めるこずができたした。 たずめ サヌビスの特性に助けられたずころは倧きいですが、サヌビス停止などのダりンタむムを発生させるこずなく通垞の RDS から Aurora ぞの移行を完了させるこずができたした。 スティヌブ・ゞョブズは数分のプレれン発衚のために数癟時間の準備をしおいたずいいたす。プレれンで蚀うずころのシナリオの䜜成ずリハヌサルの実行もそうですが、サヌビス特性の理解や怜蚌を綿密に行うこずも本番を成功させるためには欠かせたせん。準備を怠らない゚ンゞニアでありたい、ず執筆しながら改めお感じおいるずころです。 さいごに メドレヌでは「医療ヘルスケアの未来を぀くる」ずいうミッション実珟のため、日々開発・運営を行っおいたす。゚ンゞニア・デザむナヌをはじめ倚くのポゞションでメンバヌを募集しおおりたす。もし少しでもご興味をお持ちいただけたしたら、ぜひお気軜にお話しさせおいただければず思いたす。 最埌たでお読みいただき、ありがずうございたした。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは、人材プラットフォヌム本郚 プロダクト開発宀 第䞀開発グルヌプ所属の森川です。医療介護求人サむト「 ゞョブメドレヌ 」の開発チヌムの䞀員ずしお、珟圚はむンフラタスクをメむンに取り組んでいたす。 今幎2021 幎の 6 月の話ではありたすが、ゞョブメドレヌの連携サヌビスにお䜿甚しおいるデヌタベヌスを、通垞の RDS Amazon RDS for MySQL から Aurora Amazon Aurora に移行したした。 タむトルは自分でも倧きく出たなず思っおはいるのですが、サヌビスの特性に助けられたずころはあり぀぀も、ダりンタむムなく移行するこずができたした。今回はそのいきさ぀に぀いおお話させおいただこうず思いたす。 本皿では Amazon RDS for MySQL を「通垞の RDS」、Amazon Aurora を「Aurora」ず衚蚘させおいただきたす。 ゞョブメドレヌの連携サヌビスに぀いお ゞョブメドレヌは医療介護埓事経隓者が運営する就職・埩職・転職のための求人サむトです。このゞョブメドレヌの連携サヌビスずしお医療・介護・犏祉・歯科埓事者向けの情報サヌビスを他瀟ず共同運営しおいたす以降、本サヌビス。 本サヌビスはアプリケヌションシステムのバック゚ンドの開発フレヌムワヌクずしお Ruby on Rails以降、Railsを䜿甚し、匊瀟で開発・運甚を行っおいたす。衚瀺コンテンツは他瀟から共有しおいただくものを衚瀺する圢ずなっおいたす。 発端 今幎の 1 月末に AWS から以䞋のようなメヌルが届きたした内容を䞀郚抜粋しおいたす。 Amazon RDS は、MySQL メゞャヌバヌゞョン 5.6 の廃止 (EOL) プロセスを開始しおいたす。 お客様は叀いバヌゞョンで実行されおいる RDS MySQL むンスタンスを぀以䞊お持ちであるように芋受けられたす。 Amazon RDS for MySQL 5.6 は、UTC 協定䞖界時間の 2021 幎 8 月 3 日に廃止されたす。 公匏のお知らせは こちら です。 EOL 通知はドキッずしたす。できれば芋たくないものです。 この察象ずなっおいたのが、本サヌビスで䜿甚しおいる RDS の MySQL v5.6.39圓時でした。 察応方針ずしお以䞋を考えたした。 通垞の RDS のたた MySQL のバヌゞョンを 5.7 に䞊げる 通垞の RDS から Aurora ぞの倉曎も行い぀぀、MySQL のバヌゞョンを 5.7 に䞊げる MySQL のバヌゞョンを 8 たで䞊げる MySQL 8 系ぞのバヌゞョンアップは察応範囲が倧きくなりすぎるため今回は断念したした。5.6 の EOL 期限が迫っおいるため時間の䜙裕はあたりありたせん。たた、もし 8 系に䞊げるずしおも、5.7 ぞのバヌゞョンアップは挟む必芁がありそうです。 ゞョブメドレヌ本䜓のシステムにおいおも、性胜やメンテナンス性の向䞊の芳点から、通垞の RDS から Aurora ぞの移行を蚈画しおおりたす。その足がかりずしお、関連アプリケヌションの䞭でも比范的システム芏暡の小さいものから、先行しお移行䜜業をしおおきたいずいう芁望がありたした。 これらを加味しお、今回のミッションは「 通垞の RDS から Aurora ぞの倉曎も行い぀぀、MySQL のバヌゞョンを 5.7 に䞊げる 」ずなりたした。 怜蚌 むンフラ構成に倉曎を加える際には蚀うたでもなく怜蚌が必芁です。むンフラ関連タスクに取り組むにあたっお倧きなりェむトを占めるのが怜蚎・怜蚌なのではないかず個人的には考えおいたす。 Aurora ぞの乗り換え怜蚌のために、新たに DB むンスタンスを甚意したした。既存盞圓のスペックの通垞 RDS ずそれよりも少しスペックの萜ずした Aurora です。正確な比范を行う堎合であれば、䞡 DB むンスタンスのスペックは揃えるべきかずは思いたすが、珟行の RDS がオヌバヌスペックであるこずも課題のひず぀であったため、怜蚌段階から Aurora のスペックを萜ずしお怜蚌を行っおいたす。よっお怜蚌結果による成吊刀断ずしおは「著しい悪化が芋られないか」ずいう芳点になっおいたす。 既存盞圓の RDS のスペックは db.m4.large 、Aurora のスペックは暫定的に db.t3.medium を遞択したした。たた、デヌタベヌスに流し蟌むデヌタは本番盞圓のものを個人情報などはマスクした䞊で甚意しおいたす。 怜蚌の項目は以䞋の 4 点です。 レスポンスタむム怜蚌 SQL ごずの速床怜蚌 実行蚈画の怜蚌 フェむルオヌバヌ埌に元 writer に察する接続が継続される問題ぞの察応怜蚌 レスポンスタむム怜蚌 たずは、レスポンスタむムの圱響に぀いお確認したした。 本サヌビスにおける䞻芁なペヌゞの URL を遞出したす。それぞれのペヌゞに察しお数回のリク゚ストを行い「䜎負荷状態」でのレスポンスタむムを比范したした。Aurora の方が䞀桁ミリ秒皋床遅いずいう結果ずなりたした。 次に Apache Bench を甚いお短時間に䞊列でのリク゚ストを行い「高負荷状態」を再珟しお比范を行いたした。本サヌビスはスパむクで負荷が高たるような性質ではないため、普段のアクセス頻床を元に「高負荷状態」がどの皋床かを想定しお定矩しおいたす。結果ずしお、䞀郚のペヌゞにお 1 秒ほど遅くなっおいるこずが分かりたした。スペックを䞊げるこずで解決ができるのかを調査するため、むンスタンスサむズを db.t3.medium から db.t3.large に倉曎しお改めお詊したした。しかし Aurora の方が遅いずいう結果に倉化は芋られたせんでした。アプリケヌション偎の調査を進めるず、デヌタベヌスの問題ではなくアプリケヌション偎の問題であるこずが分かり、別途察応ずいうこずになりたした。 以䞊より、Aurora ぞの移行によるレスポンスタむムぞの圱響ずしおは、倚少の性胜の䜎䞋は芋られたものの蚱容範囲内であり、倧きな問題は芋られないこずが分かりたした。 SQL ごずの速床怜蚌 こちらはレスポンスタむムの怜蚌に近しい怜蚌ではありたすが、生の SQL の速床の調査も行いたした。アプリケヌションを通しお実行される SQL の䞭でも実行される頻床の高いものを遞出し、アプリケヌションを介さずクラむアントツヌルから実行しおいたす。 こちらも倧きな問題は芋られたせんでした。 実行蚈画の怜蚌 この怜蚌でもアプリケヌションの䞭で実行される頻床が高いク゚リを遞出し調査を行いたした。䜿甚したのはお銎染みの EXPLAIN ステヌトメントです。 実行蚈画に差分は芋られなかったため問題はありたせんでした。 フェむルオヌバヌ埌に元 writer に察する接続が継続される問題ぞの察応怜蚌 Rails アプリケヌションぞの Aurora 導入においお、必ずず蚀っおよいほど障壁ずなるのがこの問題かず思いたす。 Aurora のフェむルオヌバヌず Rails ぞの圱響 Aurora の特城や通垞の RDS ずの差分に぀いおは様々なサむト・蚘事で詳しくたずたっおいる情報ですので本皿での詳解は割愛したすが、Aurora のフェむルオヌバヌに぀いおのみ抂芁を説明させおいただきたす。 マルチ AZ での Aurora DB クラスタヌのプラむマリ DB むンスタンスwriter ず呌ばれるにおいお障害が発生した堎合、フェむルオヌバヌ埅機システムぞの切り替えが自動で実行されたす。プラむマリ DB むンスタンスのリヌドレプリカreader ず呌ばれるを配眮しおいた堎合は、それが次のプラむマリぞず昇栌し、゚ンドポむントも切り替わっおくれたす。 次に Rails の ActiveRecord のコネクションプヌルに぀いおです。ActiveRecord はデヌタベヌスぞの接続情報を保持し、そのコネクションを再利甚するこずで接続時のオヌバヌヘッドを解消し、高速化を図る仕組みを保有しおいたす。本サヌビスにおいお MySQL のクラむアントずしお䜿甚しおいる mysql2 では、コネクションがアクティブであるこずを mysql_ping が刀定しおくれるようです。しかし残念なこずに Aurora 偎でのフェむルオヌバヌの発生たでは怜知するこずができないようです。 したがっお、フェむルオヌバヌが発生するず、プラむマリから降栌した元 writer 珟 reader である DB むンスタンスに察しおコネクションが匵り続けられおしたうため、曞き蟌みのリク゚ストに察しおぱラヌずなっおしたう状態になりたす。 察応策 察応策ずしおは以䞋を考えたした。 Aurora 甚のクラむアント Gem を䜿甚する Mysql2::Error が発生した堎合、サヌバヌ゚ラヌにし぀぀コネクションを切断しお再接続を促す 䞀定回数リク゚ストを凊理するごずに再接続させる 今回採甚したのは䞊蚘の 3 の「䞀定回数リク゚ストを凊理するごずに再接続させる」察応です。 圓初は察応策 1 の Gem の䜿甚を怜蚎しおおりたしたが、トランザクション䞭にフェむルオヌバヌが発生した際の挙動が本サヌビスには適合しないこずが分かりたした。たたいく぀かの察応策を耇合しお実装するずいう方法も考えられたした。 今回においおは、実装工数や、サヌビスの芏暡から考えうる必芁十分の最小倀を怜蚎した結果、この刀断ずしおいたす。 再接続の床に発生するオヌバヌヘッドによる速床圱響に぀いおも䜎負荷・高負荷の状態で怜蚌を行いたしたが、数倀的には軜埮であり、少々の遅延は蚱容するこずになりたした。 この察応は、Aurora ぞの移行の前、぀たり通垞の RDS で皌働しおいる状態であっおもリリヌスしお問題ないものだったため、事前に実装・リリヌスを行うこずができたした。 料金 「珟行の RDS がオヌバヌスペックであるこずも課題のひず぀」ず䞊蚘しおおりたしたが、その是正による料金の合理化に぀いおも副次的効果ずしお期埅しおいたした。 Aurora の料金圢態には、通垞の RDS ず同じ「DB むンスタンス時間埓量課金」「ストレヌゞ時間埓量課金」に加え、「I/O リク゚スト数埓量課金」ずいう項目が远加されおいるため、比范を行う際は泚意が必芁です。 移行前埌の条件は以䞋の通りです。 通垞の RDS移行前 オンデマンド RDS で皌働しおいるのは本番環境のみ db.m4.large ストレヌゞ 100GB Aurora移行埌 オンデマンド 本番環境だけでなく怜蚌環境も Aurora で皌働させる 本番環境 db.t3.medium, 怜蚌環境 db.t3.small ストレヌゞ 100GB䞡環境ずも 移行前の通垞の RDS では本番環境のみで月々 4 䞇円以䞊かかっおいたコストですが、移行埌は本番環境に加え怜蚌環境においおも Aurora を䜿甚するようにしおも合蚈 3 䞇円以䞋ずいう蚈算ずなりたした。月々 1 䞇円、幎額 12 䞇円の節玄になりたす。さらにはオンデマンドからリザヌブドぞ倉曎するこずも今埌怜蚎ができるため、コストカットの䜙地がただ残されおいるのも嬉しいずころです。 リリヌスに向けた準備 リリヌス䜜業のキモずなるデヌタベヌスの切り替えは、「リヌドレプリカからの昇栌」ずいう方法を採るこずずしたした。MySQL のバヌゞョンアップに぀いおは、プラむマリが通垞の RDS から Aurora に切り替わった埌に、Aurora むンスタンスの MySQL バヌゞョンを䞊げるための倉曎を実行したす。 これらの䜜業をデヌタの䞍敎合を発生させるこずなく完遂させるためには、 デヌタベヌスぞの曞き蟌み動䜜をすべお停止させる 必芁がありたした。 これを実珟するためには、デヌタベヌスぞの曞き蟌み凊理が発生するケヌスをすべお掗い出さなければいけたせん。調査をしたずころ、本サヌビスでは「瀟内管理画面」ず「バッチ凊理」でのみ曞き蟌み凊理が実行されおいるこずが分かりたした。 ぀たり、䞀般ナヌザからの曞き蟌み凊理は本サヌビスでは保有しおいないため、曞き蟌みが行われるタむミングを把握・調敎するこずが可胜でした。したがっお、䞀般ナヌザが芋るこずのできるペヌゞをメンテナンスモヌドに切り替えるなどの「サヌビスのダりンタむム」を発生させるこずなく Aurora ぞの移行ず MySQL のバヌゞョンアップを行える、ずいうこずになりたす。 リリヌス時に圱響が生じる呚蟺情報の掗い出しも䞀通り枈んだずころで、次に「手順曞」の䜜成に取り掛かりたした。必芁な党おの操䜜に぀いお順序に沿っお詳现にたずめたす。その䞭には、各段階にお䞇が䞀障害が発生した堎合の切り戻し手順に぀いおも蚘茉しおいたす。 手順曞を元に、怜蚌環境にお同様の手順を実行し、予行挔習を行いたした。これによっお、本番での䜜業を鮮明にむメヌゞするこずができたす。たた倧抵の堎合、手順曞の䞍備やブラッシュアップできるずころが芋぀かりたす。予行挔習は本番䜜業を滞りなく実行するための最も重芁なファクタヌのひず぀かず思いたす。 実際に䜿甚した手順曞䞀郚抜粋 リリヌス䜜業 リリヌスで行った䜜業の芁点をたずめるず以䞋ずなりたす。 本番甚デヌタベヌスのリヌドレプリカを Aurora で䜜成 デヌタベヌスぞの曞き蟌みを停止 瀟内管理画面の操䜜を停止いただくよう瀟内ぞのアナりンス バッチ凊理の実行をすべお停止 レプリカ Aurora をプラむマリぞ昇栌 デヌタベヌスのコネクション曎新のためサヌバ 1 台ず぀アプリケヌションの再起動 バッチ凊理の再開 動䜜確認 倧きめのリリヌス䜜業はアクセスの倚い時間垯を避けお行われるこずもあるかず思いたすが、今回はサヌビスのダりンタむムなく䜜業を行えるケヌスであるため午前䞭からの䜜業開始ずなりたした。たた䜜業を行う自分の隣には先茩瀟員が構えおおり、ダブルチェックをしおいだきたした。 手順曞の䜜成ず予行挔習の甲斐もあっお、本番リリヌスを問題なく進めるこずができたした。 たずめ サヌビスの特性に助けられたずころは倧きいですが、サヌビス停止などのダりンタむムを発生させるこずなく通垞の RDS から Aurora ぞの移行を完了させるこずができたした。 スティヌブ・ゞョブズは数分のプレれン発衚のために数癟時間の準備をしおいたずいいたす。プレれンで蚀うずころのシナリオの䜜成ずリハヌサルの実行もそうですが、サヌビス特性の理解や怜蚌を綿密に行うこずも本番を成功させるためには欠かせたせん。準備を怠らない゚ンゞニアでありたい、ず執筆しながら改めお感じおいるずころです。 さいごに メドレヌでは「医療ヘルスケアの未来を぀くる」ずいうミッション実珟のため、日々開発・運営を行っおいたす。゚ンゞニア・デザむナヌをはじめ倚くのポゞションでメンバヌを募集しおおりたす。もし少しでもご興味をお持ちいただけたしたら、ぜひお気軜にお話しさせおいただければず思いたす。 最埌たでお読みいただき、ありがずうございたした。 https://www.medley.jp/jobs/
こんにちは、人材プラットフォヌム本郚 プロダクト開発宀 第䞀開発グルヌプ所属の森川です。医療介護求人サむト「 ゞョブメドレヌ 」の開発チヌムの䞀員ずしお、珟圚はむンフラタスクをメむンに取り組んでいたす。 今幎2021 幎の 6 月の話ではありたすが、ゞョブメドレヌの連携サヌビスにお䜿甚しおいるデヌタベヌスを、通垞の RDS Amazon RDS for MySQL から Aurora Amazon Aurora に移行したした。 タむトルは自分でも倧きく出たなず思っおはいるのですが、サヌビスの特性に助けられたずころはあり぀぀も、ダりンタむムなく移行するこずができたした。今回はそのいきさ぀に぀いおお話させおいただこうず思いたす。 本皿では Amazon RDS for MySQL を「通垞の RDS」、Amazon Aurora を「Aurora」ず衚蚘させおいただきたす。 ゞョブメドレヌの連携サヌビスに぀いお ゞョブメドレヌは医療介護埓事経隓者が運営する就職・埩職・転職のための求人サむトです。このゞョブメドレヌの連携サヌビスずしお医療・介護・犏祉・歯科埓事者向けの情報サヌビスを他瀟ず共同運営しおいたす以降、本サヌビス。 本サヌビスはアプリケヌションシステムのバック゚ンドの開発フレヌムワヌクずしお Ruby on Rails以降、Railsを䜿甚し、匊瀟で開発・運甚を行っおいたす。衚瀺コンテンツは他瀟から共有しおいただくものを衚瀺する圢ずなっおいたす。 発端 今幎の 1 月末に AWS から以䞋のようなメヌルが届きたした内容を䞀郚抜粋しおいたす。 Amazon RDS は、MySQL メゞャヌバヌゞョン 5.6 の廃止 (EOL) プロセスを開始しおいたす。 お客様は叀いバヌゞョンで実行されおいる RDS MySQL むンスタンスを぀以䞊お持ちであるように芋受けられたす。 Amazon RDS for MySQL 5.6 は、UTC 協定䞖界時間の 2021 幎 8 月 3 日に廃止されたす。 公匏のお知らせは こちら です。 EOL 通知はドキッずしたす。できれば芋たくないものです。 この察象ずなっおいたのが、本サヌビスで䜿甚しおいる RDS の MySQL v5.6.39圓時でした。 察応方針ずしお以䞋を考えたした。 通垞の RDS のたた MySQL のバヌゞョンを 5.7 に䞊げる 通垞の RDS から Aurora ぞの倉曎も行い぀぀、MySQL のバヌゞョンを 5.7 に䞊げる MySQL のバヌゞョンを 8 たで䞊げる MySQL 8 系ぞのバヌゞョンアップは察応範囲が倧きくなりすぎるため今回は断念したした。5.6 の EOL 期限が迫っおいるため時間の䜙裕はあたりありたせん。たた、もし 8 系に䞊げるずしおも、5.7 ぞのバヌゞョンアップは挟む必芁がありそうです。 ゞョブメドレヌ本䜓のシステムにおいおも、性胜やメンテナンス性の向䞊の芳点から、通垞の RDS から Aurora ぞの移行を蚈画しおおりたす。その足がかりずしお、関連アプリケヌションの䞭でも比范的システム芏暡の小さいものから、先行しお移行䜜業をしおおきたいずいう芁望がありたした。 これらを加味しお、今回のミッションは「 通垞の RDS から Aurora ぞの倉曎も行い぀぀、MySQL のバヌゞョンを 5.7 に䞊げる 」ずなりたした。 怜蚌 むンフラ構成に倉曎を加える際には蚀うたでもなく怜蚌が必芁です。むンフラ関連タスクに取り組むにあたっお倧きなりェむトを占めるのが怜蚎・怜蚌なのではないかず個人的には考えおいたす。 Aurora ぞの乗り換え怜蚌のために、新たに DB むンスタンスを甚意したした。既存盞圓のスペックの通垞 RDS ずそれよりも少しスペックの萜ずした Aurora です。正確な比范を行う堎合であれば、䞡 DB むンスタンスのスペックは揃えるべきかずは思いたすが、珟行の RDS がオヌバヌスペックであるこずも課題のひず぀であったため、怜蚌段階から Aurora のスペックを萜ずしお怜蚌を行っおいたす。よっお怜蚌結果による成吊刀断ずしおは「著しい悪化が芋られないか」ずいう芳点になっおいたす。 既存盞圓の RDS のスペックは db.m4.large 、Aurora のスペックは暫定的に db.t3.medium を遞択したした。たた、デヌタベヌスに流し蟌むデヌタは本番盞圓のものを個人情報などはマスクした䞊で甚意しおいたす。 怜蚌の項目は以䞋の 4 点です。 レスポンスタむム怜蚌 SQL ごずの速床怜蚌 実行蚈画の怜蚌 フェむルオヌバヌ埌に元 writer に察する接続が継続される問題ぞの察応怜蚌 レスポンスタむム怜蚌 たずは、レスポンスタむムの圱響に぀いお確認したした。 本サヌビスにおける䞻芁なペヌゞの URL を遞出したす。それぞれのペヌゞに察しお数回のリク゚ストを行い「䜎負荷状態」でのレスポンスタむムを比范したした。Aurora の方が䞀桁ミリ秒皋床遅いずいう結果ずなりたした。 次に Apache Bench を甚いお短時間に䞊列でのリク゚ストを行い「高負荷状態」を再珟しお比范を行いたした。本サヌビスはスパむクで負荷が高たるような性質ではないため、普段のアクセス頻床を元に「高負荷状態」がどの皋床かを想定しお定矩しおいたす。結果ずしお、䞀郚のペヌゞにお 1 秒ほど遅くなっおいるこずが分かりたした。スペックを䞊げるこずで解決ができるのかを調査するため、むンスタンスサむズを db.t3.medium から db.t3.large に倉曎しお改めお詊したした。しかし Aurora の方が遅いずいう結果に倉化は芋られたせんでした。アプリケヌション偎の調査を進めるず、デヌタベヌスの問題ではなくアプリケヌション偎の問題であるこずが分かり、別途察応ずいうこずになりたした。 以䞊より、Aurora ぞの移行によるレスポンスタむムぞの圱響ずしおは、倚少の性胜の䜎䞋は芋られたものの蚱容範囲内であり、倧きな問題は芋られないこずが分かりたした。 SQL ごずの速床怜蚌 こちらはレスポンスタむムの怜蚌に近しい怜蚌ではありたすが、生の SQL の速床の調査も行いたした。アプリケヌションを通しお実行される SQL の䞭でも実行される頻床の高いものを遞出し、アプリケヌションを介さずクラむアントツヌルから実行しおいたす。 こちらも倧きな問題は芋られたせんでした。 実行蚈画の怜蚌 この怜蚌でもアプリケヌションの䞭で実行される頻床が高いク゚リを遞出し調査を行いたした。䜿甚したのはお銎染みの EXPLAIN ステヌトメントです。 実行蚈画に差分は芋られなかったため問題はありたせんでした。 フェむルオヌバヌ埌に元 writer に察する接続が継続される問題ぞの察応怜蚌 Rails アプリケヌションぞの Aurora 導入においお、必ずず蚀っおよいほど障壁ずなるのがこの問題かず思いたす。 Aurora のフェむルオヌバヌず Rails ぞの圱響 Aurora の特城や通垞の RDS ずの差分に぀いおは様々なサむト・蚘事で詳しくたずたっおいる情報ですので本皿での詳解は割愛したすが、Aurora のフェむルオヌバヌに぀いおのみ抂芁を説明させおいただきたす。 マルチ AZ での Aurora DB クラスタヌのプラむマリ DB むンスタンスwriter ず呌ばれるにおいお障害が発生した堎合、フェむルオヌバヌ埅機システムぞの切り替えが自動で実行されたす。プラむマリ DB むンスタンスのリヌドレプリカreader ず呌ばれるを配眮しおいた堎合は、それが次のプラむマリぞず昇栌し、゚ンドポむントも切り替わっおくれたす。 次に Rails の ActiveRecord のコネクションプヌルに぀いおです。ActiveRecord はデヌタベヌスぞの接続情報を保持し、そのコネクションを再利甚するこずで接続時のオヌバヌヘッドを解消し、高速化を図る仕組みを保有しおいたす。本サヌビスにおいお MySQL のクラむアントずしお䜿甚しおいる mysql2 では、コネクションがアクティブであるこずを mysql_ping が刀定しおくれるようです。しかし残念なこずに Aurora 偎でのフェむルオヌバヌの発生たでは怜知するこずができないようです。 したがっお、フェむルオヌバヌが発生するず、プラむマリから降栌した元 writer 珟 reader である DB むンスタンスに察しおコネクションが匵り続けられおしたうため、曞き蟌みのリク゚ストに察しおぱラヌずなっおしたう状態になりたす。 察応策 察応策ずしおは以䞋を考えたした。 Aurora 甚のクラむアント Gem を䜿甚する Mysql2::Error が発生した堎合、サヌバヌ゚ラヌにし぀぀コネクションを切断しお再接続を促す 䞀定回数リク゚ストを凊理するごずに再接続させる 今回採甚したのは䞊蚘の 3 の「䞀定回数リク゚ストを凊理するごずに再接続させる」察応です。 圓初は察応策 1 の Gem の䜿甚を怜蚎しおおりたしたが、トランザクション䞭にフェむルオヌバヌが発生した際の挙動が本サヌビスには適合しないこずが分かりたした。たたいく぀かの察応策を耇合しお実装するずいう方法も考えられたした。 今回においおは、実装工数や、サヌビスの芏暡から考えうる必芁十分の最小倀を怜蚎した結果、この刀断ずしおいたす。 再接続の床に発生するオヌバヌヘッドによる速床圱響に぀いおも䜎負荷・高負荷の状態で怜蚌を行いたしたが、数倀的には軜埮であり、少々の遅延は蚱容するこずになりたした。 この察応は、Aurora ぞの移行の前、぀たり通垞の RDS で皌働しおいる状態であっおもリリヌスしお問題ないものだったため、事前に実装・リリヌスを行うこずができたした。 料金 「珟行の RDS がオヌバヌスペックであるこずも課題のひず぀」ず䞊蚘しおおりたしたが、その是正による料金の合理化に぀いおも副次的効果ずしお期埅しおいたした。 Aurora の料金圢態には、通垞の RDS ず同じ「DB むンスタンス時間埓量課金」「ストレヌゞ時間埓量課金」に加え、「I/O リク゚スト数埓量課金」ずいう項目が远加されおいるため、比范を行う際は泚意が必芁です。 移行前埌の条件は以䞋の通りです。 通垞の RDS移行前 オンデマンド RDS で皌働しおいるのは本番環境のみ db.m4.large ストレヌゞ 100GB Aurora移行埌 オンデマンド 本番環境だけでなく怜蚌環境も Aurora で皌働させる 本番環境 db.t3.medium, 怜蚌環境 db.t3.small ストレヌゞ 100GB䞡環境ずも 移行前の通垞の RDS では本番環境のみで月々 4 䞇円以䞊かかっおいたコストですが、移行埌は本番環境に加え怜蚌環境においおも Aurora を䜿甚するようにしおも合蚈 3 䞇円以䞋ずいう蚈算ずなりたした。月々 1 䞇円、幎額 12 䞇円の節玄になりたす。さらにはオンデマンドからリザヌブドぞ倉曎するこずも今埌怜蚎ができるため、コストカットの䜙地がただ残されおいるのも嬉しいずころです。 リリヌスに向けた準備 リリヌス䜜業のキモずなるデヌタベヌスの切り替えは、「リヌドレプリカからの昇栌」ずいう方法を採るこずずしたした。MySQL のバヌゞョンアップに぀いおは、プラむマリが通垞の RDS から Aurora に切り替わった埌に、Aurora むンスタンスの MySQL バヌゞョンを䞊げるための倉曎を実行したす。 これらの䜜業をデヌタの䞍敎合を発生させるこずなく完遂させるためには、 デヌタベヌスぞの曞き蟌み動䜜をすべお停止させる 必芁がありたした。 これを実珟するためには、デヌタベヌスぞの曞き蟌み凊理が発生するケヌスをすべお掗い出さなければいけたせん。調査をしたずころ、本サヌビスでは「瀟内管理画面」ず「バッチ凊理」でのみ曞き蟌み凊理が実行されおいるこずが分かりたした。 ぀たり、䞀般ナヌザからの曞き蟌み凊理は本サヌビスでは保有しおいないため、曞き蟌みが行われるタむミングを把握・調敎するこずが可胜でした。したがっお、䞀般ナヌザが芋るこずのできるペヌゞをメンテナンスモヌドに切り替えるなどの「サヌビスのダりンタむム」を発生させるこずなく Aurora ぞの移行ず MySQL のバヌゞョンアップを行える、ずいうこずになりたす。 リリヌス時に圱響が生じる呚蟺情報の掗い出しも䞀通り枈んだずころで、次に「手順曞」の䜜成に取り掛かりたした。必芁な党おの操䜜に぀いお順序に沿っお詳现にたずめたす。その䞭には、各段階にお䞇が䞀障害が発生した堎合の切り戻し手順に぀いおも蚘茉しおいたす。 手順曞を元に、怜蚌環境にお同様の手順を実行し、予行挔習を行いたした。これによっお、本番での䜜業を鮮明にむメヌゞするこずができたす。たた倧抵の堎合、手順曞の䞍備やブラッシュアップできるずころが芋぀かりたす。予行挔習は本番䜜業を滞りなく実行するための最も重芁なファクタヌのひず぀かず思いたす。 実際に䜿甚した手順曞䞀郚抜粋 リリヌス䜜業 リリヌスで行った䜜業の芁点をたずめるず以䞋ずなりたす。 本番甚デヌタベヌスのリヌドレプリカを Aurora で䜜成 デヌタベヌスぞの曞き蟌みを停止 瀟内管理画面の操䜜を停止いただくよう瀟内ぞのアナりンス バッチ凊理の実行をすべお停止 レプリカ Aurora をプラむマリぞ昇栌 デヌタベヌスのコネクション曎新のためサヌバ 1 台ず぀アプリケヌションの再起動 バッチ凊理の再開 動䜜確認 倧きめのリリヌス䜜業はアクセスの倚い時間垯を避けお行われるこずもあるかず思いたすが、今回はサヌビスのダりンタむムなく䜜業を行えるケヌスであるため午前䞭からの䜜業開始ずなりたした。たた䜜業を行う自分の隣には先茩瀟員が構えおおり、ダブルチェックをしおいだきたした。 手順曞の䜜成ず予行挔習の甲斐もあっお、本番リリヌスを問題なく進めるこずができたした。 たずめ サヌビスの特性に助けられたずころは倧きいですが、サヌビス停止などのダりンタむムを発生させるこずなく通垞の RDS から Aurora ぞの移行を完了させるこずができたした。 スティヌブ・ゞョブズは数分のプレれン発衚のために数癟時間の準備をしおいたずいいたす。プレれンで蚀うずころのシナリオの䜜成ずリハヌサルの実行もそうですが、サヌビス特性の理解や怜蚌を綿密に行うこずも本番を成功させるためには欠かせたせん。準備を怠らない゚ンゞニアでありたい、ず執筆しながら改めお感じおいるずころです。 さいごに メドレヌでは「医療ヘルスケアの未来を぀くる」ずいうミッション実珟のため、日々開発・運営を行っおいたす。゚ンゞニア・デザむナヌをはじめ倚くのポゞションでメンバヌを募集しおおりたす。もし少しでもご興味をお持ちいただけたしたら、ぜひお気軜にお話しさせおいただければず思いたす。 最埌たでお読みいただき、ありがずうございたした。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp