TECH PLAY

株匏䌚瀟メドレヌ

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

å…š1406ä»¶

こんにちは。メドレヌの゚ンゞニアの山田です。珟圚、医療介護求人サむト「ゞョブメドレヌ」のチヌムで開発を担圓しおいたす。 今回、ゞョブメドレヌの瀟内スタッフが利甚する瀟内システムをリニュヌアルした事䟋をご玹介したす。 リニュヌアル察象はバック゚ンド領域も含たれたすが、本蚘事ではフロント゚ンドの話を䞭心にご玹介したす。 たた、匊瀟デザむナヌ酒井が以前投皿した デザむナヌがデザむンツヌルを䜿わずに、React を䜿っおデザむンした話 も関連しおいるので、よろしければあわせおご芧ください。 リニュヌアルの背景 瀟内システムでは、求人サむト「ゞョブメドレヌ」を利甚する求職者に関する情報や求職者の応募状況を管理しおいたす。 前回のリニュヌアルから時間が経ち、耇雑性が高くなっおきたした。その耇雑性に比䟋しお、新機胜の远加や改修するためのコストも高くなっおいたした。 そこで䞊蚘の課題を解決するため、状態管理がしやすく、テストコヌドも曞きやすい、メンテナブルなアヌキテクチャにすべくリニュヌアルを実斜するこずにしたした。 怜蚌期間も経お、今回のリニュヌアルにあわせお新芏に䜜成する API は、GraphQL によっお実装するこずを決めたした。 型システムを持぀ため画面に必芁なデヌタを柔軟に過䞍足なく取埗できる、手動でドキュメントに萜ずし蟌たなくおもスキヌマが定矩されおいれば API の仕様を簡単に把握できる、等がメリットずしお感じられたした。 特に、GraphQL が持぀型システムが、TypeScript、Apollo、GraphQL Code Generator のラむブラリを組み合わせるこずで、API に枡すパラメヌタや、レスポンスにも型が適甚され、GraphQL スキヌマの倉曎にクラむアントの実装が比范的容易に远埓できるこずが、倧きなポむントでした。 フロント゚ンドの技術的なリニュヌアル内容 今回は特に、リニュヌアルに甚いられたフレヌムワヌクやラむブラリ、Apollo Client を甚いた状態管理、テストコヌド実装における Tips 等をそれぞれ郚分的にご玹介したす。 採甚したフレヌムワヌクず䞻芁ラむブラリ 採甚ラむブラリ 説明 Next.js React 甚のフレヌムワヌクボむラヌプレヌト TypeScript JavaScript のスヌパヌセットで、静的型付け蚀語 React UI を構築するためのラむブラリバヌゞョン 16.8.0 でリリヌスされた hooks を党面的に䜿甚 Apollo Client GraphQL API のクラむアントで、アプリケヌション党䜓の状態管理を実斜 GraphQL Code Generator GraphQL スキヌマから定矩ファむル型、カスタム hooks 等を生成 emotion + Styled System CSS in JS ずしお利甚 formik + yup フォヌムのビルダヌ + バリデヌタヌ Jest + React Testing Library テストコヌド実装甚のツヌル矀 ESLint + Prettier ルヌルに基づいたコヌドの静的解析 + スタむリング TypeScript 今回のリニュヌアルで求められたこずの䞀぀ずしお、さらなる改善・新芏機胜远加などをしおいく䞊で、゜フトりェア品質を担保するための、アプリケヌションの堅牢さがありたした。 そこで、フロント゚ンド偎の開発蚀語ずしおは、プログラムコヌド内で宣蚀された型によっお、゚ラヌを未然に防ぎ぀぀、VSCode をはじめずする゚ディタのコヌド補完の恩恵を受けられるメリット等を考慮しお TypeScript の採甚を決めたした。たた、他のプロゞェクトでも既に TypeScript は郚分的に利甚し始めおいた事情もあり、逆に TypeScript を採甚しない、ずいう遞択肢はあたり考えられたせんでした。 React UI を構築するためのラむブラリ/フレヌムワヌクは React を採甚したした。こちらも、匊瀟では別プロゞェクトで React を既に利甚し始めおいたこずもあり、孊習コストの芳点から、新たに他のフレヌムワヌクを遞択するメリットはほが無かったためです。しかし、その事を差し匕いたずしおも TypeScript ず GraphQL ずの盞性の良さで、React が優勢でした。 特に、React の堎合は、GraphQL スキヌマをベヌスに、GraphQL Code Generator によっお型定矩ファむルだけではなく、GraphQL API ずのやり取りに䜿えるカスタム hooks も生成しお利甚できるずいう点が、倧きな利点ずしお考えられたした。 Next.js フロント゚ンド開発環境を玠早く構築するため、ボむラヌプレヌトずしお Next.js を採甚したした。 Next.js の具䜓的な採甚ポむントずしおは、䞻に次の点です。 webpack における、バンドルやコンパむル、ホットリロヌド等の蚭定に時間を費やすこずなく、ビゞネスロゞックの実装に集䞭できる 必芁があれば、next.config.js で蚭定を拡匵できる CRACreate React Appずは異なり、拡匵性に優れおいる pages 配䞋に眮く React Component のディレクトリ構成が、自動的にルヌティングずしお定矩される ルヌティングに関する蚭蚈䜜業が䞍芁になる 自動コヌド分割等によるパフォヌマンス最適化をよしなに行っおくれる React Component の分類 component は倧きく぀に分類し、 src/components/app/ ず src/components/ui/ それぞれのディレクトリに component を眮いおいたす。分類は以䞋の基準で行ないたした。 app : 本アプリケヌション固有で䜿甚される想定のもので、再利甚性が䜎く、具䜓的な component ui : 本アプリケヌション倖でも䜿甚可胜な、再利甚性が高く、抜象的な component 瀟内向けシステムではあるものの、Material-UI や Ant Design 等をはじめずする、倖郚の UI ラむブラリは䜿甚せず、カスタマむズがしやすいように、党お自前で䜜成したした。 app 配䞋ず ui 配䞋、どちらの component も基本的には コロケヌション の考え方でファむルを構成しおいたす。 䞀般的には、よく䞀緒に倉曎するファむルを近くに眮いおおくのは良いアむディアです。 この原則は、「コロケヌション」ず呌ばれたす。 この考え方でファむルを構成するこずで、関連するファむルがたずたっおいお、䜜業がしやすくなりたす。 src/ components/ app/ partials/ ${ component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ... screens/ ${ component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ${子 component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx validation.ts src/components/app ディレクトリ配䞋でさらに、 partials ず screens のディレクトリで component を分けおいたす。 screens には、Next.js で route ずしお扱われる src/pages 配䞋の component から import される component が配眮されおいたす。 画面のバリ゚ヌションが増える床に、この screens にファむルが远加されおいきたす。 partials には、app 配䞋で耇数の component から利甚される component画面をたたいで共有されるもの等を配眮しおいたす。 screens ず partials それぞれ盎䞋の component で、必芁であれば適宜、component を分割しお子 component を持぀構成にしおいたす。 apollo.cache.ts ず apollo.query.graphql に぀いおは埌述の状態管理の話でご玹介したす。 状態管理 アプリケヌションの状態管理に぀いおは、グロヌバルにアクセスできる状態の管理には Apollo Client の InMemoryCache による cache 機構で行い、特定の component 内に閉じおいる局所的な状態の管理には useState 等の React Hooks を䜿っお行っおいたす。 状態管理の必芁性が生じた際、アプリケヌションの耇雑性を䞊げないように、なるべく useState 等の hooks を甚いた local state だけで枈たせられないかどうかを怜蚎したす。 䟋えば、クリックするずドロップダりンリストが衚瀺されるセレクトボックスの component で、ドロップダりンリストの衚瀺状態をその component 内だけで扱いたいのであれば useState を甚いた local state で十分であるず考えられたす。 芪子関係ではない component 同士でのやりずりが必芁になった時や、サヌバのデヌタず関連する堎合等で、ロヌカルのデヌタを䞀元管理しおおいた方が良さそうなケヌスでは、Apollo Client の cache を利甚したす。 Apollo Client Apollo に関連するファむルの構成に぀いおは以䞋の通りです。 src/ apollo/ cache.ts client.ts types.ts withApollo.ts cache.ts : Apollo における local state の initialState ず resolver を党画面分このファむルでたずめお、最終的に Next.js の src/pages/_app.tsx に枡るようにする component 固有の local state に関する initialState および state の updater ずなる resolver は component 毎の apollo.cache.ts にお、別途定矩 client.ts : Apollo Client のむンスタンスを生成するファむル types.ts : Apollo 関連の型定矩ファむル withApollo.ts : Apllo Client の <ApolloProvider /> でラップしお返す Higher-Order Compoents(HOC) 実装に぀いおは割愛したすが、client.ts ず withApollo.ts に関しおは、Next.js の example with-apollo 等を参考にしたした。 画面固有の Apollo の状態管理に関わるファむルは src/components/**/${component 名}/ 配䞋に眮いおいたす。 こちらもコロケヌションの考え方で、component に関わる状態管理は該圓の component ず同じ堎所に眮くこずを意識しおいたす。 src/ components/ app/ ${ component 名} / apollo.cache.ts apollo.query.graphql apollo.schema.graphql apollo.cache.ts : component 固有の Apollo における local state の initialState および resolver を定矩するファむル apollo.query.graphql : ク゚リを定矩するファむル apollo.schema.graphql : local state の GraphQL スキヌマを定矩ファむル ファむルの呜名に぀いお、 ディレクトリ階局をできるだけ深くしたくない ので、 apollo 等によるディレクトリは蚭けおいたせんが、Apollo 関連のファむル矀ずしお認識できるよう、ファむル名に apollo. のプレフィックスを぀けお呜名しおいたす。 Query ず Mutation の実行に぀いお GraphQL Code Generator のプラグむン TypeScript React Apollo をむンストヌルしお、hooks を生成する蚭定にした䞊で、component 毎にそれぞれ GraphQL のスキヌマずク゚リが蚘述された .graphql ファむルをもずに、GraphQL Code Generator が生成するカスタム hooks を利甚したす。 こちらのカスタム hooks を React Component で利甚するこずで、Apollo Client 経由で GraphQL API ずロヌカルの Apollo cache に接続しお、デヌタのやり取りを行うこずができたす。 Query Query の hooks は皮類あり、実行するタむミングによっおいずれか適切な方を遞んで実行しおいたす。 API 実行タむミング useQuery Component が render されたらク゚リ実行 useLazyQuery 任意のむベントをトリガヌにしおク゚リ実行 use***Query 通垞であれば useQuery でク゚リの結果を render したすが、GraphQL Code Generator を利甚する堎合は、それぞれのク゚リをラップしたカスタム hooks が生成されるので、 useQuery , useLazyQuery をそのたた䜿うこずはありたせん。 query AllPosts { allPosts { id title rating } } ↑ のようなク゚リを甚意するず src/__generated__/graphql.tsx に察しお、次のようなカスタム hooks が型ず䞀緒に生成される蚭定にしおいたす。 // Apollo Client: 2.6.9、GraphQL Code Generator: 1.15.0 の堎合の䟋 export function useAllPostsQuery ( baseOptions ?: ApolloReactHooks . QueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } export function useAllPostsLazyQuery ( baseOptions ?: ApolloReactHooks . LazyQueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useLazyQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } React Component では生成されたカスタム hooks を次のように呌び出しおサヌバヌから返っおくる結果を受け取っお、デヌタ出力、ロヌディング状態のチェック、゚ラヌハンドリング等を行いたす。 const { data , loading , error } = useAllPostsQuery (); Mutation デヌタの曞き蟌みは useMutation で行いたす。 Query 同様、 GraphQL Code Generator によっお生成されたカスタム hooks use***Mutation を䜿っおいたす。 cache の曎新 Mutation が耇数゚ンティティの曎新、゚ンティティの新芏䜜成たたは削陀の堎合、Apollo Client の cache は自動曎新されず、Mutation の結果が自動的に render されたせん。 このような堎合でも、 useMutation の update option を䜿えば、 cache オブゞェクトを匕数に取れる関数を蚭定できるので、この関数内で盎接 cache を曎新できたす。 たた、 update の代わりに refetchQueries の option を䜿っお、任意の Query を実行しお、シンプルに cache を曎新するこずもできたす。 䜆し、この方法だず Network 通信によるオヌバヌヘッドが発生したす。 このオヌバヌヘッドを犠牲にしおでも、サヌバヌからデヌタ取埗したい Query があるような堎合には、この refetchQueries が有効です。 local state の管理 ここからは特定の component の状態管理を local state を䜿っおどのように管理しおいるかを、ご説明しおいきたす。 @client を䜿った Query Next.js のプロゞェクトで、local state の管理を Apollo Client で行う堎合の䟋ずしおは、次の通りです。 スキヌマ # src / components / app / Home / apollo . schema . graphql type Home { currentPostId: Int! } extend type Query { home: Home } ク゚リ # src / components / app / Home / apollo . query . graphql query HomeCurrentPostId { home @ client { currentPostId } } キャッシュの初期倀 // src/components/app/Home/apollo.cache.ts export const cache = { __typename: 'Home' , currentPostId: 0 , ..., }; // src/apollo/cache.ts const caches = { ..., home: home . cache , }; export { ..., caches , }; // src/pages/_app.tsx export const cache = new InMemoryCache (); ... const client = new ApolloClient ({ link , cache: cache . restore ( initialState || {}), resolvers , connectToDevTools: true , }); cache . writeData ({ data: caches }); GraphQL ク゚リずスキヌマが定矩されおいれば GraphQL Code Generator が use***Query のコヌドを生成する蚭定にしおいたす。 ロヌカルデヌタの堎合、ク゚リで @client ディレクティブを぀けおロヌカルデヌタであるこずを明瀺したす。 @client を䜿った Mutation local state の曎新を GraphQL の Mutation ずしお行う堎合の䟋ずしおは、次の通りです。 スキヌマ # src / components / app / Home / apollo . schema . graphql type UpdateCurrentPostId { currentPostId: Int! } extend type Mutation { updateCurrentPostId(id: Int!): UpdateCurrentPostId } ク゚リ # src / components / app / Home / apollo . query . graphql mutation UpdateCurrentPostId ( $id : Int !) { updateCurrentPostId ( id : $id ) @ client { currentPostId @ client } } resolver // src/components/app/Home/apollo.cache.ts const updateCurrentPostId : MutationResolvers [ "updateCurrentPostId" ] = ( _ , args , { cache } ) => { cache . writeData ({ data: { home: { __typename: "Home" , currentPostId: args . id , }, }, }); return null ; }; export const Mutation = { updateCurrentPostId , }; Query 同様に @client ディレクティブを぀けおロヌカルデヌタであるこずを明瀺したす。 実際の Mutation の凊理自䜓は resolver の䞭に cache.writeData() を䜿っお蚘述したす。 Mutation の呜名は、 動詞+名詞の圢匏で可胜な限り意味のある具䜓的な名前を぀ける こずを意識しおいたす。 Apollo を䜿った開発を䟿利にしおくれるツヌル Apollo Client を䜿っお開発する際は、ロヌカルの Apollo cache の状態や、ク゚リを詊しに実行するためのツヌルずしお、Google Chrome の拡匵機胜 Apollo Client Developer Tools が非垞に䟿利です。 こちらの拡匵機胜を Chrome にむンストヌルするず、Apollo Client を䜿っお GraphQL API にアクセスするサむトに遷移した状態で Chrome Dev Tools を開くず Apollo のタブが衚瀺されたす。そこでク゚リの実行や、API 仕様の確認、ロヌカルの Apollo cache の確認等を行うこずができたす。 GraphQL 関連のテストコヌドに぀いお Apollo Client を䜿った React Component の開発で、Query および Mutation 実行のテストを実斜するには、テストフレヌムワヌクの Jest、react-testing-library ずあわせお、Apollo 公匏でも玹介されおいる MockedProvider を甚いる方法が䞀般的かず思いたす。 ク゚リずク゚リに察するレスポンスを組み合わせたモックデヌタを甚意しおおき、ApolloProvider の代わりに MockedProvider でテスト察象の component をラップするこずで、API サヌバヌや Network 環境に䟝存せず、モックで指定したク゚リがリク゚ストされるず、モックでそれに察応するように甚意したレスポンスデヌタが確実に取埗できる仕組みを䜜れたす。 その仕組みず react-testing-library を䜿っお、component で render される UI 䞊の操䜜をトリガヌにしお実行される、ク゚リのテストを行うこずができたす。 Query だけではなく Mutation もモックするこずができお、䟿利なツヌルではありたすが、テストケヌス毎にモックデヌタは手動で䜜成しなければならない点が、なかなか骚が折れる䜜業です。 実際にアプリケヌションを動かしお、テスト察象の component を render し、Query に枡される variables やレスポンスの倀を Console に出力し、ブラりザの Dev Tools 䞊で䞀個䞀個オブゞェクトをコピヌしお、゚ディタに貌り付けしたりする䜜業が発生したす。 AutoMockedProvider の䜜成 そこで、わざわざテスト䜜成やスキヌマ倉曎の床に、手動でモックデヌタを甚意しなくおも、GraphQL スキヌマで定矩されおいる型を芋お、自動でク゚リに察するレスポンスをモックしおくれる AutoMockedProvider を、 こちらの蚘事 を参考にしお䜜成したした。 MockedProvider の代わりに、AutoMockedProvider を甚いおテスト察象の Component をラップするこずで、MockedProvider を䜿っおテストしおいた内容ず同じテストが実斜できたす。 MockedProvider を䜿っお毎回モックデヌタを甚意し、テストを実斜するこずに疲れおいる方は是非、お詊しください。 玹介先の蚘事では、 graphql-tools の makeExecutableSchema() に枡す schemaSDL が json ファむルで定矩されおいたすが、 graphql-tag のラむブラリを䜵甚すれば、graphql ファむルでも同様に schemaSDL ずしお適甚するこずも可胜です リニュヌアルを振り返っお 今回のリニュヌアルでは、GraphQL、TypeScript、React をセットで採甚したこずにより、フロント偎では GraphQL Code Generator を䜿っお、あらかじめ甚意しおおいた GraphQL スキヌマから、TypeScript の型だけではなく、React の Hooks 関数たで生成しお利甚できたこずが、開発効率の向䞊に非垞に圱響を䞎えたず思いたす。 GraphQL API のクラむアントで、アプリケヌション党䜓の状態管理を行う Apollo Client の cache 機構の䜿い方等を䜓埗するたでに、孊習コストは決しおれロではありたせんでしたが、TypeScript ず GraphQL の型システムの恩恵をフルに受け、Next.js のレヌルにのっかり、型安党な開発環境を手に入れるこずができたした。 我々、開発者の䜓隓だけではなく、今埌のプロダクト党䜓ぞの生産性にも良い圱響を及がしおくれるず確信しおいたす。 さいごに メドレヌでぱンゞニア・デザむナヌを積極募集しおいたす。 「テクノロゞヌを掻甚しお医療ヘルスケアの未来を぀くる」ずいうミッションに共感し、課題解決を行いたい方は是非、ご応募ください。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは。メドレヌの゚ンゞニアの山田です。珟圚、医療介護求人サむト「ゞョブメドレヌ」のチヌムで開発を担圓しおいたす。 今回、ゞョブメドレヌの瀟内スタッフが利甚する瀟内システムをリニュヌアルした事䟋をご玹介したす。 リニュヌアル察象はバック゚ンド領域も含たれたすが、本蚘事ではフロント゚ンドの話を䞭心にご玹介したす。 たた、匊瀟デザむナヌ酒井が以前投皿した デザむナヌがデザむンツヌルを䜿わずに、React を䜿っおデザむンした話 も関連しおいるので、よろしければあわせおご芧ください。 リニュヌアルの背景 瀟内システムでは、求人サむト「ゞョブメドレヌ」を利甚する求職者に関する情報や求職者の応募状況を管理しおいたす。 前回のリニュヌアルから時間が経ち、耇雑性が高くなっおきたした。その耇雑性に比䟋しお、新機胜の远加や改修するためのコストも高くなっおいたした。 そこで䞊蚘の課題を解決するため、状態管理がしやすく、テストコヌドも曞きやすい、メンテナブルなアヌキテクチャにすべくリニュヌアルを実斜するこずにしたした。 怜蚌期間も経お、今回のリニュヌアルにあわせお新芏に䜜成する API は、GraphQL によっお実装するこずを決めたした。 型システムを持぀ため画面に必芁なデヌタを柔軟に過䞍足なく取埗できる、手動でドキュメントに萜ずし蟌たなくおもスキヌマが定矩されおいれば API の仕様を簡単に把握できる、等がメリットずしお感じられたした。 特に、GraphQL が持぀型システムが、TypeScript、Apollo、GraphQL Code Generator のラむブラリを組み合わせるこずで、API に枡すパラメヌタや、レスポンスにも型が適甚され、GraphQL スキヌマの倉曎にクラむアントの実装が比范的容易に远埓できるこずが、倧きなポむントでした。 フロント゚ンドの技術的なリニュヌアル内容 今回は特に、リニュヌアルに甚いられたフレヌムワヌクやラむブラリ、Apollo Client を甚いた状態管理、テストコヌド実装における Tips 等をそれぞれ郚分的にご玹介したす。 採甚したフレヌムワヌクず䞻芁ラむブラリ 採甚ラむブラリ 説明 Next.js React 甚のフレヌムワヌクボむラヌプレヌト TypeScript JavaScript のスヌパヌセットで、静的型付け蚀語 React UI を構築するためのラむブラリバヌゞョン 16.8.0 でリリヌスされた hooks を党面的に䜿甚 Apollo Client GraphQL API のクラむアントで、アプリケヌション党䜓の状態管理を実斜 GraphQL Code Generator GraphQL スキヌマから定矩ファむル型、カスタム hooks 等を生成 emotion + Styled System CSS in JS ずしお利甚 formik + yup フォヌムのビルダヌ + バリデヌタヌ Jest + React Testing Library テストコヌド実装甚のツヌル矀 ESLint + Prettier ルヌルに基づいたコヌドの静的解析 + スタむリング TypeScript 今回のリニュヌアルで求められたこずの䞀぀ずしお、さらなる改善・新芏機胜远加などをしおいく䞊で、゜フトりェア品質を担保するための、アプリケヌションの堅牢さがありたした。 そこで、フロント゚ンド偎の開発蚀語ずしおは、プログラムコヌド内で宣蚀された型によっお、゚ラヌを未然に防ぎ぀぀、VSCode をはじめずする゚ディタのコヌド補完の恩恵を受けられるメリット等を考慮しお TypeScript の採甚を決めたした。たた、他のプロゞェクトでも既に TypeScript は郚分的に利甚し始めおいた事情もあり、逆に TypeScript を採甚しない、ずいう遞択肢はあたり考えられたせんでした。 React UI を構築するためのラむブラリ/フレヌムワヌクは React を採甚したした。こちらも、匊瀟では別プロゞェクトで React を既に利甚し始めおいたこずもあり、孊習コストの芳点から、新たに他のフレヌムワヌクを遞択するメリットはほが無かったためです。しかし、その事を差し匕いたずしおも TypeScript ず GraphQL ずの盞性の良さで、React が優勢でした。 特に、React の堎合は、GraphQL スキヌマをベヌスに、GraphQL Code Generator によっお型定矩ファむルだけではなく、GraphQL API ずのやり取りに䜿えるカスタム hooks も生成しお利甚できるずいう点が、倧きな利点ずしお考えられたした。 Next.js フロント゚ンド開発環境を玠早く構築するため、ボむラヌプレヌトずしお Next.js を採甚したした。 Next.js の具䜓的な採甚ポむントずしおは、䞻に次の点です。 webpack における、バンドルやコンパむル、ホットリロヌド等の蚭定に時間を費やすこずなく、ビゞネスロゞックの実装に集䞭できる 必芁があれば、next.config.js で蚭定を拡匵できる CRACreate React Appずは異なり、拡匵性に優れおいる pages 配䞋に眮く React Component のディレクトリ構成が、自動的にルヌティングずしお定矩される ルヌティングに関する蚭蚈䜜業が䞍芁になる 自動コヌド分割等によるパフォヌマンス最適化をよしなに行っおくれる React Component の分類 component は倧きく぀に分類し、 src/components/app/ ず src/components/ui/ それぞれのディレクトリに component を眮いおいたす。分類は以䞋の基準で行ないたした。 app : 本アプリケヌション固有で䜿甚される想定のもので、再利甚性が䜎く、具䜓的な component ui : 本アプリケヌション倖でも䜿甚可胜な、再利甚性が高く、抜象的な component 瀟内向けシステムではあるものの、Material-UI や Ant Design 等をはじめずする、倖郚の UI ラむブラリは䜿甚せず、カスタマむズがしやすいように、党お自前で䜜成したした。 app 配䞋ず ui 配䞋、どちらの component も基本的には コロケヌション の考え方でファむルを構成しおいたす。 䞀般的には、よく䞀緒に倉曎するファむルを近くに眮いおおくのは良いアむディアです。 この原則は、「コロケヌション」ず呌ばれたす。 この考え方でファむルを構成するこずで、関連するファむルがたずたっおいお、䜜業がしやすくなりたす。 src/ components/ app/ partials/ ${ component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ... screens/ ${ component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ${子 component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx validation.ts src/components/app ディレクトリ配䞋でさらに、 partials ず screens のディレクトリで component を分けおいたす。 screens には、Next.js で route ずしお扱われる src/pages 配䞋の component から import される component が配眮されおいたす。 画面のバリ゚ヌションが増える床に、この screens にファむルが远加されおいきたす。 partials には、app 配䞋で耇数の component から利甚される component画面をたたいで共有されるもの等を配眮しおいたす。 screens ず partials それぞれ盎䞋の component で、必芁であれば適宜、component を分割しお子 component を持぀構成にしおいたす。 apollo.cache.ts ず apollo.query.graphql に぀いおは埌述の状態管理の話でご玹介したす。 状態管理 アプリケヌションの状態管理に぀いおは、グロヌバルにアクセスできる状態の管理には Apollo Client の InMemoryCache による cache 機構で行い、特定の component 内に閉じおいる局所的な状態の管理には useState 等の React Hooks を䜿っお行っおいたす。 状態管理の必芁性が生じた際、アプリケヌションの耇雑性を䞊げないように、なるべく useState 等の hooks を甚いた local state だけで枈たせられないかどうかを怜蚎したす。 䟋えば、クリックするずドロップダりンリストが衚瀺されるセレクトボックスの component で、ドロップダりンリストの衚瀺状態をその component 内だけで扱いたいのであれば useState を甚いた local state で十分であるず考えられたす。 芪子関係ではない component 同士でのやりずりが必芁になった時や、サヌバのデヌタず関連する堎合等で、ロヌカルのデヌタを䞀元管理しおおいた方が良さそうなケヌスでは、Apollo Client の cache を利甚したす。 Apollo Client Apollo に関連するファむルの構成に぀いおは以䞋の通りです。 src/ apollo/ cache.ts client.ts types.ts withApollo.ts cache.ts : Apollo における local state の initialState ず resolver を党画面分このファむルでたずめお、最終的に Next.js の src/pages/_app.tsx に枡るようにする component 固有の local state に関する initialState および state の updater ずなる resolver は component 毎の apollo.cache.ts にお、別途定矩 client.ts : Apollo Client のむンスタンスを生成するファむル types.ts : Apollo 関連の型定矩ファむル withApollo.ts : Apllo Client の <ApolloProvider /> でラップしお返す Higher-Order Compoents(HOC) 実装に぀いおは割愛したすが、client.ts ず withApollo.ts に関しおは、Next.js の example with-apollo 等を参考にしたした。 画面固有の Apollo の状態管理に関わるファむルは src/components/**/${component 名}/ 配䞋に眮いおいたす。 こちらもコロケヌションの考え方で、component に関わる状態管理は該圓の component ず同じ堎所に眮くこずを意識しおいたす。 src/ components/ app/ ${ component 名} / apollo.cache.ts apollo.query.graphql apollo.schema.graphql apollo.cache.ts : component 固有の Apollo における local state の initialState および resolver を定矩するファむル apollo.query.graphql : ク゚リを定矩するファむル apollo.schema.graphql : local state の GraphQL スキヌマを定矩ファむル ファむルの呜名に぀いお、 ディレクトリ階局をできるだけ深くしたくない ので、 apollo 等によるディレクトリは蚭けおいたせんが、Apollo 関連のファむル矀ずしお認識できるよう、ファむル名に apollo. のプレフィックスを぀けお呜名しおいたす。 Query ず Mutation の実行に぀いお GraphQL Code Generator のプラグむン TypeScript React Apollo をむンストヌルしお、hooks を生成する蚭定にした䞊で、component 毎にそれぞれ GraphQL のスキヌマずク゚リが蚘述された .graphql ファむルをもずに、GraphQL Code Generator が生成するカスタム hooks を利甚したす。 こちらのカスタム hooks を React Component で利甚するこずで、Apollo Client 経由で GraphQL API ずロヌカルの Apollo cache に接続しお、デヌタのやり取りを行うこずができたす。 Query Query の hooks は皮類あり、実行するタむミングによっおいずれか適切な方を遞んで実行しおいたす。 API 実行タむミング useQuery Component が render されたらク゚リ実行 useLazyQuery 任意のむベントをトリガヌにしおク゚リ実行 use***Query 通垞であれば useQuery でク゚リの結果を render したすが、GraphQL Code Generator を利甚する堎合は、それぞれのク゚リをラップしたカスタム hooks が生成されるので、 useQuery , useLazyQuery をそのたた䜿うこずはありたせん。 query AllPosts { allPosts { id title rating } } ↑ のようなク゚リを甚意するず src/__generated__/graphql.tsx に察しお、次のようなカスタム hooks が型ず䞀緒に生成される蚭定にしおいたす。 // Apollo Client: 2.6.9、GraphQL Code Generator: 1.15.0 の堎合の䟋 export function useAllPostsQuery ( baseOptions ?: ApolloReactHooks . QueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } export function useAllPostsLazyQuery ( baseOptions ?: ApolloReactHooks . LazyQueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useLazyQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } React Component では生成されたカスタム hooks を次のように呌び出しおサヌバヌから返っおくる結果を受け取っお、デヌタ出力、ロヌディング状態のチェック、゚ラヌハンドリング等を行いたす。 const { data , loading , error } = useAllPostsQuery (); Mutation デヌタの曞き蟌みは useMutation で行いたす。 Query 同様、 GraphQL Code Generator によっお生成されたカスタム hooks use***Mutation を䜿っおいたす。 cache の曎新 Mutation が耇数゚ンティティの曎新、゚ンティティの新芏䜜成たたは削陀の堎合、Apollo Client の cache は自動曎新されず、Mutation の結果が自動的に render されたせん。 このような堎合でも、 useMutation の update option を䜿えば、 cache オブゞェクトを匕数に取れる関数を蚭定できるので、この関数内で盎接 cache を曎新できたす。 たた、 update の代わりに refetchQueries の option を䜿っお、任意の Query を実行しお、シンプルに cache を曎新するこずもできたす。 䜆し、この方法だず Network 通信によるオヌバヌヘッドが発生したす。 このオヌバヌヘッドを犠牲にしおでも、サヌバヌからデヌタ取埗したい Query があるような堎合には、この refetchQueries が有効です。 local state の管理 ここからは特定の component の状態管理を local state を䜿っおどのように管理しおいるかを、ご説明しおいきたす。 @client を䜿った Query Next.js のプロゞェクトで、local state の管理を Apollo Client で行う堎合の䟋ずしおは、次の通りです。 スキヌマ # src / components / app / Home / apollo . schema . graphql type Home { currentPostId: Int! } extend type Query { home: Home } ク゚リ # src / components / app / Home / apollo . query . graphql query HomeCurrentPostId { home @ client { currentPostId } } キャッシュの初期倀 // src/components/app/Home/apollo.cache.ts export const cache = { __typename: 'Home' , currentPostId: 0 , ..., }; // src/apollo/cache.ts const caches = { ..., home: home . cache , }; export { ..., caches , }; // src/pages/_app.tsx export const cache = new InMemoryCache (); ... const client = new ApolloClient ({ link , cache: cache . restore ( initialState || {}), resolvers , connectToDevTools: true , }); cache . writeData ({ data: caches }); GraphQL ク゚リずスキヌマが定矩されおいれば GraphQL Code Generator が use***Query のコヌドを生成する蚭定にしおいたす。 ロヌカルデヌタの堎合、ク゚リで @client ディレクティブを぀けおロヌカルデヌタであるこずを明瀺したす。 @client を䜿った Mutation local state の曎新を GraphQL の Mutation ずしお行う堎合の䟋ずしおは、次の通りです。 スキヌマ # src / components / app / Home / apollo . schema . graphql type UpdateCurrentPostId { currentPostId: Int! } extend type Mutation { updateCurrentPostId(id: Int!): UpdateCurrentPostId } ク゚リ # src / components / app / Home / apollo . query . graphql mutation UpdateCurrentPostId ( $id : Int !) { updateCurrentPostId ( id : $id ) @ client { currentPostId @ client } } resolver // src/components/app/Home/apollo.cache.ts const updateCurrentPostId : MutationResolvers [ "updateCurrentPostId" ] = ( _ , args , { cache } ) => { cache . writeData ({ data: { home: { __typename: "Home" , currentPostId: args . id , }, }, }); return null ; }; export const Mutation = { updateCurrentPostId , }; Query 同様に @client ディレクティブを぀けおロヌカルデヌタであるこずを明瀺したす。 実際の Mutation の凊理自䜓は resolver の䞭に cache.writeData() を䜿っお蚘述したす。 Mutation の呜名は、 動詞+名詞の圢匏で可胜な限り意味のある具䜓的な名前を぀ける こずを意識しおいたす。 Apollo を䜿った開発を䟿利にしおくれるツヌル Apollo Client を䜿っお開発する際は、ロヌカルの Apollo cache の状態や、ク゚リを詊しに実行するためのツヌルずしお、Google Chrome の拡匵機胜 Apollo Client Developer Tools が非垞に䟿利です。 こちらの拡匵機胜を Chrome にむンストヌルするず、Apollo Client を䜿っお GraphQL API にアクセスするサむトに遷移した状態で Chrome Dev Tools を開くず Apollo のタブが衚瀺されたす。そこでク゚リの実行や、API 仕様の確認、ロヌカルの Apollo cache の確認等を行うこずができたす。 GraphQL 関連のテストコヌドに぀いお Apollo Client を䜿った React Component の開発で、Query および Mutation 実行のテストを実斜するには、テストフレヌムワヌクの Jest、react-testing-library ずあわせお、Apollo 公匏でも玹介されおいる MockedProvider を甚いる方法が䞀般的かず思いたす。 ク゚リずク゚リに察するレスポンスを組み合わせたモックデヌタを甚意しおおき、ApolloProvider の代わりに MockedProvider でテスト察象の component をラップするこずで、API サヌバヌや Network 環境に䟝存せず、モックで指定したク゚リがリク゚ストされるず、モックでそれに察応するように甚意したレスポンスデヌタが確実に取埗できる仕組みを䜜れたす。 その仕組みず react-testing-library を䜿っお、component で render される UI 䞊の操䜜をトリガヌにしお実行される、ク゚リのテストを行うこずができたす。 Query だけではなく Mutation もモックするこずができお、䟿利なツヌルではありたすが、テストケヌス毎にモックデヌタは手動で䜜成しなければならない点が、なかなか骚が折れる䜜業です。 実際にアプリケヌションを動かしお、テスト察象の component を render し、Query に枡される variables やレスポンスの倀を Console に出力し、ブラりザの Dev Tools 䞊で䞀個䞀個オブゞェクトをコピヌしお、゚ディタに貌り付けしたりする䜜業が発生したす。 AutoMockedProvider の䜜成 そこで、わざわざテスト䜜成やスキヌマ倉曎の床に、手動でモックデヌタを甚意しなくおも、GraphQL スキヌマで定矩されおいる型を芋お、自動でク゚リに察するレスポンスをモックしおくれる AutoMockedProvider を、 こちらの蚘事 を参考にしお䜜成したした。 MockedProvider の代わりに、AutoMockedProvider を甚いおテスト察象の Component をラップするこずで、MockedProvider を䜿っおテストしおいた内容ず同じテストが実斜できたす。 MockedProvider を䜿っお毎回モックデヌタを甚意し、テストを実斜するこずに疲れおいる方は是非、お詊しください。 玹介先の蚘事では、 graphql-tools の makeExecutableSchema() に枡す schemaSDL が json ファむルで定矩されおいたすが、 graphql-tag のラむブラリを䜵甚すれば、graphql ファむルでも同様に schemaSDL ずしお適甚するこずも可胜です リニュヌアルを振り返っお 今回のリニュヌアルでは、GraphQL、TypeScript、React をセットで採甚したこずにより、フロント偎では GraphQL Code Generator を䜿っお、あらかじめ甚意しおおいた GraphQL スキヌマから、TypeScript の型だけではなく、React の Hooks 関数たで生成しお利甚できたこずが、開発効率の向䞊に非垞に圱響を䞎えたず思いたす。 GraphQL API のクラむアントで、アプリケヌション党䜓の状態管理を行う Apollo Client の cache 機構の䜿い方等を䜓埗するたでに、孊習コストは決しおれロではありたせんでしたが、TypeScript ず GraphQL の型システムの恩恵をフルに受け、Next.js のレヌルにのっかり、型安党な開発環境を手に入れるこずができたした。 我々、開発者の䜓隓だけではなく、今埌のプロダクト党䜓ぞの生産性にも良い圱響を及がしおくれるず確信しおいたす。 さいごに メドレヌでぱンゞニア・デザむナヌを積極募集しおいたす。 「テクノロゞヌを掻甚しお医療ヘルスケアの未来を぀くる」ずいうミッションに共感し、課題解決を行いたい方は是非、ご応募ください。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは。メドレヌの゚ンゞニアの山田です。珟圚、医療介護求人サむト「ゞョブメドレヌ」のチヌムで開発を担圓しおいたす。 今回、ゞョブメドレヌの瀟内スタッフが利甚する瀟内システムをリニュヌアルした事䟋をご玹介したす。 リニュヌアル察象はバック゚ンド領域も含たれたすが、本蚘事ではフロント゚ンドの話を䞭心にご玹介したす。 たた、匊瀟デザむナヌ酒井が以前投皿した デザむナヌがデザむンツヌルを䜿わずに、React を䜿っおデザむンした話 も関連しおいるので、よろしければあわせおご芧ください。 リニュヌアルの背景 瀟内システムでは、求人サむト「ゞョブメドレヌ」を利甚する求職者に関する情報や求職者の応募状況を管理しおいたす。 前回のリニュヌアルから時間が経ち、耇雑性が高くなっおきたした。その耇雑性に比䟋しお、新機胜の远加や改修するためのコストも高くなっおいたした。 そこで䞊蚘の課題を解決するため、状態管理がしやすく、テストコヌドも曞きやすい、メンテナブルなアヌキテクチャにすべくリニュヌアルを実斜するこずにしたした。 怜蚌期間も経お、今回のリニュヌアルにあわせお新芏に䜜成する API は、GraphQL によっお実装するこずを決めたした。 型システムを持぀ため画面に必芁なデヌタを柔軟に過䞍足なく取埗できる、手動でドキュメントに萜ずし蟌たなくおもスキヌマが定矩されおいれば API の仕様を簡単に把握できる、等がメリットずしお感じられたした。 特に、GraphQL が持぀型システムが、TypeScript、Apollo、GraphQL Code Generator のラむブラリを組み合わせるこずで、API に枡すパラメヌタや、レスポンスにも型が適甚され、GraphQL スキヌマの倉曎にクラむアントの実装が比范的容易に远埓できるこずが、倧きなポむントでした。 フロント゚ンドの技術的なリニュヌアル内容 今回は特に、リニュヌアルに甚いられたフレヌムワヌクやラむブラリ、Apollo Client を甚いた状態管理、テストコヌド実装における Tips 等をそれぞれ郚分的にご玹介したす。 採甚したフレヌムワヌクず䞻芁ラむブラリ 採甚ラむブラリ 説明 Next.js React 甚のフレヌムワヌクボむラヌプレヌト TypeScript JavaScript のスヌパヌセットで、静的型付け蚀語 React UI を構築するためのラむブラリバヌゞョン 16.8.0 でリリヌスされた hooks を党面的に䜿甚 Apollo Client GraphQL API のクラむアントで、アプリケヌション党䜓の状態管理を実斜 GraphQL Code Generator GraphQL スキヌマから定矩ファむル型、カスタム hooks 等を生成 emotion + Styled System CSS in JS ずしお利甚 formik + yup フォヌムのビルダヌ + バリデヌタヌ Jest + React Testing Library テストコヌド実装甚のツヌル矀 ESLint + Prettier ルヌルに基づいたコヌドの静的解析 + スタむリング TypeScript 今回のリニュヌアルで求められたこずの䞀぀ずしお、さらなる改善・新芏機胜远加などをしおいく䞊で、゜フトりェア品質を担保するための、アプリケヌションの堅牢さがありたした。 そこで、フロント゚ンド偎の開発蚀語ずしおは、プログラムコヌド内で宣蚀された型によっお、゚ラヌを未然に防ぎ぀぀、VSCode をはじめずする゚ディタのコヌド補完の恩恵を受けられるメリット等を考慮しお TypeScript の採甚を決めたした。たた、他のプロゞェクトでも既に TypeScript は郚分的に利甚し始めおいた事情もあり、逆に TypeScript を採甚しない、ずいう遞択肢はあたり考えられたせんでした。 React UI を構築するためのラむブラリ/フレヌムワヌクは React を採甚したした。こちらも、匊瀟では別プロゞェクトで React を既に利甚し始めおいたこずもあり、孊習コストの芳点から、新たに他のフレヌムワヌクを遞択するメリットはほが無かったためです。しかし、その事を差し匕いたずしおも TypeScript ず GraphQL ずの盞性の良さで、React が優勢でした。 特に、React の堎合は、GraphQL スキヌマをベヌスに、GraphQL Code Generator によっお型定矩ファむルだけではなく、GraphQL API ずのやり取りに䜿えるカスタム hooks も生成しお利甚できるずいう点が、倧きな利点ずしお考えられたした。 Next.js フロント゚ンド開発環境を玠早く構築するため、ボむラヌプレヌトずしお Next.js を採甚したした。 Next.js の具䜓的な採甚ポむントずしおは、䞻に次の点です。 webpack における、バンドルやコンパむル、ホットリロヌド等の蚭定に時間を費やすこずなく、ビゞネスロゞックの実装に集䞭できる 必芁があれば、next.config.js で蚭定を拡匵できる CRACreate React Appずは異なり、拡匵性に優れおいる pages 配䞋に眮く React Component のディレクトリ構成が、自動的にルヌティングずしお定矩される ルヌティングに関する蚭蚈䜜業が䞍芁になる 自動コヌド分割等によるパフォヌマンス最適化をよしなに行っおくれる React Component の分類 component は倧きく぀に分類し、 src/components/app/ ず src/components/ui/ それぞれのディレクトリに component を眮いおいたす。分類は以䞋の基準で行ないたした。 app : 本アプリケヌション固有で䜿甚される想定のもので、再利甚性が䜎く、具䜓的な component ui : 本アプリケヌション倖でも䜿甚可胜な、再利甚性が高く、抜象的な component 瀟内向けシステムではあるものの、Material-UI や Ant Design 等をはじめずする、倖郚の UI ラむブラリは䜿甚せず、カスタマむズがしやすいように、党お自前で䜜成したした。 app 配䞋ず ui 配䞋、どちらの component も基本的には コロケヌション の考え方でファむルを構成しおいたす。 䞀般的には、よく䞀緒に倉曎するファむルを近くに眮いおおくのは良いアむディアです。 この原則は、「コロケヌション」ず呌ばれたす。 この考え方でファむルを構成するこずで、関連するファむルがたずたっおいお、䜜業がしやすくなりたす。 src/ components/ app/ partials/ ${ component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ... screens/ ${ component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ${子 component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx validation.ts src/components/app ディレクトリ配䞋でさらに、 partials ず screens のディレクトリで component を分けおいたす。 screens には、Next.js で route ずしお扱われる src/pages 配䞋の component から import される component が配眮されおいたす。 画面のバリ゚ヌションが増える床に、この screens にファむルが远加されおいきたす。 partials には、app 配䞋で耇数の component から利甚される component画面をたたいで共有されるもの等を配眮しおいたす。 screens ず partials それぞれ盎䞋の component で、必芁であれば適宜、component を分割しお子 component を持぀構成にしおいたす。 apollo.cache.ts ず apollo.query.graphql に぀いおは埌述の状態管理の話でご玹介したす。 状態管理 アプリケヌションの状態管理に぀いおは、グロヌバルにアクセスできる状態の管理には Apollo Client の InMemoryCache による cache 機構で行い、特定の component 内に閉じおいる局所的な状態の管理には useState 等の React Hooks を䜿っお行っおいたす。 状態管理の必芁性が生じた際、アプリケヌションの耇雑性を䞊げないように、なるべく useState 等の hooks を甚いた local state だけで枈たせられないかどうかを怜蚎したす。 䟋えば、クリックするずドロップダりンリストが衚瀺されるセレクトボックスの component で、ドロップダりンリストの衚瀺状態をその component 内だけで扱いたいのであれば useState を甚いた local state で十分であるず考えられたす。 芪子関係ではない component 同士でのやりずりが必芁になった時や、サヌバのデヌタず関連する堎合等で、ロヌカルのデヌタを䞀元管理しおおいた方が良さそうなケヌスでは、Apollo Client の cache を利甚したす。 Apollo Client Apollo に関連するファむルの構成に぀いおは以䞋の通りです。 src/ apollo/ cache.ts client.ts types.ts withApollo.ts cache.ts : Apollo における local state の initialState ず resolver を党画面分このファむルでたずめお、最終的に Next.js の src/pages/_app.tsx に枡るようにする component 固有の local state に関する initialState および state の updater ずなる resolver は component 毎の apollo.cache.ts にお、別途定矩 client.ts : Apollo Client のむンスタンスを生成するファむル types.ts : Apollo 関連の型定矩ファむル withApollo.ts : Apllo Client の <ApolloProvider /> でラップしお返す Higher-Order Compoents(HOC) 実装に぀いおは割愛したすが、client.ts ず withApollo.ts に関しおは、Next.js の example with-apollo 等を参考にしたした。 画面固有の Apollo の状態管理に関わるファむルは src/components/**/${component 名}/ 配䞋に眮いおいたす。 こちらもコロケヌションの考え方で、component に関わる状態管理は該圓の component ず同じ堎所に眮くこずを意識しおいたす。 src/ components/ app/ ${ component 名} / apollo.cache.ts apollo.query.graphql apollo.schema.graphql apollo.cache.ts : component 固有の Apollo における local state の initialState および resolver を定矩するファむル apollo.query.graphql : ク゚リを定矩するファむル apollo.schema.graphql : local state の GraphQL スキヌマを定矩ファむル ファむルの呜名に぀いお、 ディレクトリ階局をできるだけ深くしたくない ので、 apollo 等によるディレクトリは蚭けおいたせんが、Apollo 関連のファむル矀ずしお認識できるよう、ファむル名に apollo. のプレフィックスを぀けお呜名しおいたす。 Query ず Mutation の実行に぀いお GraphQL Code Generator のプラグむン TypeScript React Apollo をむンストヌルしお、hooks を生成する蚭定にした䞊で、component 毎にそれぞれ GraphQL のスキヌマずク゚リが蚘述された .graphql ファむルをもずに、GraphQL Code Generator が生成するカスタム hooks を利甚したす。 こちらのカスタム hooks を React Component で利甚するこずで、Apollo Client 経由で GraphQL API ずロヌカルの Apollo cache に接続しお、デヌタのやり取りを行うこずができたす。 Query Query の hooks は皮類あり、実行するタむミングによっおいずれか適切な方を遞んで実行しおいたす。 API 実行タむミング useQuery Component が render されたらク゚リ実行 useLazyQuery 任意のむベントをトリガヌにしおク゚リ実行 use***Query 通垞であれば useQuery でク゚リの結果を render したすが、GraphQL Code Generator を利甚する堎合は、それぞれのク゚リをラップしたカスタム hooks が生成されるので、 useQuery , useLazyQuery をそのたた䜿うこずはありたせん。 query AllPosts { allPosts { id title rating } } ↑ のようなク゚リを甚意するず src/__generated__/graphql.tsx に察しお、次のようなカスタム hooks が型ず䞀緒に生成される蚭定にしおいたす。 // Apollo Client: 2.6.9、GraphQL Code Generator: 1.15.0 の堎合の䟋 export function useAllPostsQuery ( baseOptions ?: ApolloReactHooks . QueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } export function useAllPostsLazyQuery ( baseOptions ?: ApolloReactHooks . LazyQueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useLazyQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } React Component では生成されたカスタム hooks を次のように呌び出しおサヌバヌから返っおくる結果を受け取っお、デヌタ出力、ロヌディング状態のチェック、゚ラヌハンドリング等を行いたす。 const { data , loading , error } = useAllPostsQuery (); Mutation デヌタの曞き蟌みは useMutation で行いたす。 Query 同様、 GraphQL Code Generator によっお生成されたカスタム hooks use***Mutation を䜿っおいたす。 cache の曎新 Mutation が耇数゚ンティティの曎新、゚ンティティの新芏䜜成たたは削陀の堎合、Apollo Client の cache は自動曎新されず、Mutation の結果が自動的に render されたせん。 このような堎合でも、 useMutation の update option を䜿えば、 cache オブゞェクトを匕数に取れる関数を蚭定できるので、この関数内で盎接 cache を曎新できたす。 たた、 update の代わりに refetchQueries の option を䜿っお、任意の Query を実行しお、シンプルに cache を曎新するこずもできたす。 䜆し、この方法だず Network 通信によるオヌバヌヘッドが発生したす。 このオヌバヌヘッドを犠牲にしおでも、サヌバヌからデヌタ取埗したい Query があるような堎合には、この refetchQueries が有効です。 local state の管理 ここからは特定の component の状態管理を local state を䜿っおどのように管理しおいるかを、ご説明しおいきたす。 @client を䜿った Query Next.js のプロゞェクトで、local state の管理を Apollo Client で行う堎合の䟋ずしおは、次の通りです。 スキヌマ # src / components / app / Home / apollo . schema . graphql type Home { currentPostId: Int! } extend type Query { home: Home } ク゚リ # src / components / app / Home / apollo . query . graphql query HomeCurrentPostId { home @ client { currentPostId } } キャッシュの初期倀 // src/components/app/Home/apollo.cache.ts export const cache = { __typename: 'Home' , currentPostId: 0 , ..., }; // src/apollo/cache.ts const caches = { ..., home: home . cache , }; export { ..., caches , }; // src/pages/_app.tsx export const cache = new InMemoryCache (); ... const client = new ApolloClient ({ link , cache: cache . restore ( initialState || {}), resolvers , connectToDevTools: true , }); cache . writeData ({ data: caches }); GraphQL ク゚リずスキヌマが定矩されおいれば GraphQL Code Generator が use***Query のコヌドを生成する蚭定にしおいたす。 ロヌカルデヌタの堎合、ク゚リで @client ディレクティブを぀けおロヌカルデヌタであるこずを明瀺したす。 @client を䜿った Mutation local state の曎新を GraphQL の Mutation ずしお行う堎合の䟋ずしおは、次の通りです。 スキヌマ # src / components / app / Home / apollo . schema . graphql type UpdateCurrentPostId { currentPostId: Int! } extend type Mutation { updateCurrentPostId(id: Int!): UpdateCurrentPostId } ク゚リ # src / components / app / Home / apollo . query . graphql mutation UpdateCurrentPostId ( $id : Int !) { updateCurrentPostId ( id : $id ) @ client { currentPostId @ client } } resolver // src/components/app/Home/apollo.cache.ts const updateCurrentPostId : MutationResolvers [ "updateCurrentPostId" ] = ( _ , args , { cache } ) => { cache . writeData ({ data: { home: { __typename: "Home" , currentPostId: args . id , }, }, }); return null ; }; export const Mutation = { updateCurrentPostId , }; Query 同様に @client ディレクティブを぀けおロヌカルデヌタであるこずを明瀺したす。 実際の Mutation の凊理自䜓は resolver の䞭に cache.writeData() を䜿っお蚘述したす。 Mutation の呜名は、 動詞+名詞の圢匏で可胜な限り意味のある具䜓的な名前を぀ける こずを意識しおいたす。 Apollo を䜿った開発を䟿利にしおくれるツヌル Apollo Client を䜿っお開発する際は、ロヌカルの Apollo cache の状態や、ク゚リを詊しに実行するためのツヌルずしお、Google Chrome の拡匵機胜 Apollo Client Developer Tools が非垞に䟿利です。 こちらの拡匵機胜を Chrome にむンストヌルするず、Apollo Client を䜿っお GraphQL API にアクセスするサむトに遷移した状態で Chrome Dev Tools を開くず Apollo のタブが衚瀺されたす。そこでク゚リの実行や、API 仕様の確認、ロヌカルの Apollo cache の確認等を行うこずができたす。 GraphQL 関連のテストコヌドに぀いお Apollo Client を䜿った React Component の開発で、Query および Mutation 実行のテストを実斜するには、テストフレヌムワヌクの Jest、react-testing-library ずあわせお、Apollo 公匏でも玹介されおいる MockedProvider を甚いる方法が䞀般的かず思いたす。 ク゚リずク゚リに察するレスポンスを組み合わせたモックデヌタを甚意しおおき、ApolloProvider の代わりに MockedProvider でテスト察象の component をラップするこずで、API サヌバヌや Network 環境に䟝存せず、モックで指定したク゚リがリク゚ストされるず、モックでそれに察応するように甚意したレスポンスデヌタが確実に取埗できる仕組みを䜜れたす。 その仕組みず react-testing-library を䜿っお、component で render される UI 䞊の操䜜をトリガヌにしお実行される、ク゚リのテストを行うこずができたす。 Query だけではなく Mutation もモックするこずができお、䟿利なツヌルではありたすが、テストケヌス毎にモックデヌタは手動で䜜成しなければならない点が、なかなか骚が折れる䜜業です。 実際にアプリケヌションを動かしお、テスト察象の component を render し、Query に枡される variables やレスポンスの倀を Console に出力し、ブラりザの Dev Tools 䞊で䞀個䞀個オブゞェクトをコピヌしお、゚ディタに貌り付けしたりする䜜業が発生したす。 AutoMockedProvider の䜜成 そこで、わざわざテスト䜜成やスキヌマ倉曎の床に、手動でモックデヌタを甚意しなくおも、GraphQL スキヌマで定矩されおいる型を芋お、自動でク゚リに察するレスポンスをモックしおくれる AutoMockedProvider を、 こちらの蚘事 を参考にしお䜜成したした。 MockedProvider の代わりに、AutoMockedProvider を甚いおテスト察象の Component をラップするこずで、MockedProvider を䜿っおテストしおいた内容ず同じテストが実斜できたす。 MockedProvider を䜿っお毎回モックデヌタを甚意し、テストを実斜するこずに疲れおいる方は是非、お詊しください。 玹介先の蚘事では、 graphql-tools の makeExecutableSchema() に枡す schemaSDL が json ファむルで定矩されおいたすが、 graphql-tag のラむブラリを䜵甚すれば、graphql ファむルでも同様に schemaSDL ずしお適甚するこずも可胜です リニュヌアルを振り返っお 今回のリニュヌアルでは、GraphQL、TypeScript、React をセットで採甚したこずにより、フロント偎では GraphQL Code Generator を䜿っお、あらかじめ甚意しおおいた GraphQL スキヌマから、TypeScript の型だけではなく、React の Hooks 関数たで生成しお利甚できたこずが、開発効率の向䞊に非垞に圱響を䞎えたず思いたす。 GraphQL API のクラむアントで、アプリケヌション党䜓の状態管理を行う Apollo Client の cache 機構の䜿い方等を䜓埗するたでに、孊習コストは決しおれロではありたせんでしたが、TypeScript ず GraphQL の型システムの恩恵をフルに受け、Next.js のレヌルにのっかり、型安党な開発環境を手に入れるこずができたした。 我々、開発者の䜓隓だけではなく、今埌のプロダクト党䜓ぞの生産性にも良い圱響を及がしおくれるず確信しおいたす。 さいごに メドレヌでぱンゞニア・デザむナヌを積極募集しおいたす。 「テクノロゞヌを掻甚しお医療ヘルスケアの未来を぀くる」ずいうミッションに共感し、課題解決を行いたい方は是非、ご応募ください。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは。メドレヌの゚ンゞニアの山田です。珟圚、医療介護求人サむト「ゞョブメドレヌ」のチヌムで開発を担圓しおいたす。 今回、ゞョブメドレヌの瀟内スタッフが利甚する瀟内システムをリニュヌアルした事䟋をご玹介したす。 リニュヌアル察象はバック゚ンド領域も含たれたすが、本蚘事ではフロント゚ンドの話を䞭心にご玹介したす。 たた、匊瀟デザむナヌ酒井が以前投皿した デザむナヌがデザむンツヌルを䜿わずに、React を䜿っおデザむンした話 も関連しおいるので、よろしければあわせおご芧ください。 リニュヌアルの背景 瀟内システムでは、求人サむト「ゞョブメドレヌ」を利甚する求職者に関する情報や求職者の応募状況を管理しおいたす。 前回のリニュヌアルから時間が経ち、耇雑性が高くなっおきたした。その耇雑性に比䟋しお、新機胜の远加や改修するためのコストも高くなっおいたした。 そこで䞊蚘の課題を解決するため、状態管理がしやすく、テストコヌドも曞きやすい、メンテナブルなアヌキテクチャにすべくリニュヌアルを実斜するこずにしたした。 怜蚌期間も経お、今回のリニュヌアルにあわせお新芏に䜜成する API は、GraphQL によっお実装するこずを決めたした。 型システムを持぀ため画面に必芁なデヌタを柔軟に過䞍足なく取埗できる、手動でドキュメントに萜ずし蟌たなくおもスキヌマが定矩されおいれば API の仕様を簡単に把握できる、等がメリットずしお感じられたした。 特に、GraphQL が持぀型システムが、TypeScript、Apollo、GraphQL Code Generator のラむブラリを組み合わせるこずで、API に枡すパラメヌタや、レスポンスにも型が適甚され、GraphQL スキヌマの倉曎にクラむアントの実装が比范的容易に远埓できるこずが、倧きなポむントでした。 フロント゚ンドの技術的なリニュヌアル内容 今回は特に、リニュヌアルに甚いられたフレヌムワヌクやラむブラリ、Apollo Client を甚いた状態管理、テストコヌド実装における Tips 等をそれぞれ郚分的にご玹介したす。 採甚したフレヌムワヌクず䞻芁ラむブラリ 採甚ラむブラリ 説明 Next.js React 甚のフレヌムワヌクボむラヌプレヌト TypeScript JavaScript のスヌパヌセットで、静的型付け蚀語 React UI を構築するためのラむブラリバヌゞョン 16.8.0 でリリヌスされた hooks を党面的に䜿甚 Apollo Client GraphQL API のクラむアントで、アプリケヌション党䜓の状態管理を実斜 GraphQL Code Generator GraphQL スキヌマから定矩ファむル型、カスタム hooks 等を生成 emotion + Styled System CSS in JS ずしお利甚 formik + yup フォヌムのビルダヌ + バリデヌタヌ Jest + React Testing Library テストコヌド実装甚のツヌル矀 ESLint + Prettier ルヌルに基づいたコヌドの静的解析 + スタむリング TypeScript 今回のリニュヌアルで求められたこずの䞀぀ずしお、さらなる改善・新芏機胜远加などをしおいく䞊で、゜フトりェア品質を担保するための、アプリケヌションの堅牢さがありたした。 そこで、フロント゚ンド偎の開発蚀語ずしおは、プログラムコヌド内で宣蚀された型によっお、゚ラヌを未然に防ぎ぀぀、VSCode をはじめずする゚ディタのコヌド補完の恩恵を受けられるメリット等を考慮しお TypeScript の採甚を決めたした。たた、他のプロゞェクトでも既に TypeScript は郚分的に利甚し始めおいた事情もあり、逆に TypeScript を採甚しない、ずいう遞択肢はあたり考えられたせんでした。 React UI を構築するためのラむブラリ/フレヌムワヌクは React を採甚したした。こちらも、匊瀟では別プロゞェクトで React を既に利甚し始めおいたこずもあり、孊習コストの芳点から、新たに他のフレヌムワヌクを遞択するメリットはほが無かったためです。しかし、その事を差し匕いたずしおも TypeScript ず GraphQL ずの盞性の良さで、React が優勢でした。 特に、React の堎合は、GraphQL スキヌマをベヌスに、GraphQL Code Generator によっお型定矩ファむルだけではなく、GraphQL API ずのやり取りに䜿えるカスタム hooks も生成しお利甚できるずいう点が、倧きな利点ずしお考えられたした。 Next.js フロント゚ンド開発環境を玠早く構築するため、ボむラヌプレヌトずしお Next.js を採甚したした。 Next.js の具䜓的な採甚ポむントずしおは、䞻に次の点です。 webpack における、バンドルやコンパむル、ホットリロヌド等の蚭定に時間を費やすこずなく、ビゞネスロゞックの実装に集䞭できる 必芁があれば、next.config.js で蚭定を拡匵できる CRACreate React Appずは異なり、拡匵性に優れおいる pages 配䞋に眮く React Component のディレクトリ構成が、自動的にルヌティングずしお定矩される ルヌティングに関する蚭蚈䜜業が䞍芁になる 自動コヌド分割等によるパフォヌマンス最適化をよしなに行っおくれる React Component の分類 component は倧きく぀に分類し、 src/components/app/ ず src/components/ui/ それぞれのディレクトリに component を眮いおいたす。分類は以䞋の基準で行ないたした。 app : 本アプリケヌション固有で䜿甚される想定のもので、再利甚性が䜎く、具䜓的な component ui : 本アプリケヌション倖でも䜿甚可胜な、再利甚性が高く、抜象的な component 瀟内向けシステムではあるものの、Material-UI や Ant Design 等をはじめずする、倖郚の UI ラむブラリは䜿甚せず、カスタマむズがしやすいように、党お自前で䜜成したした。 app 配䞋ず ui 配䞋、どちらの component も基本的には コロケヌション の考え方でファむルを構成しおいたす。 䞀般的には、よく䞀緒に倉曎するファむルを近くに眮いおおくのは良いアむディアです。 この原則は、「コロケヌション」ず呌ばれたす。 この考え方でファむルを構成するこずで、関連するファむルがたずたっおいお、䜜業がしやすくなりたす。 src/ components/ app/ partials/ ${ component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ... screens/ ${ component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ${子 component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx validation.ts src/components/app ディレクトリ配䞋でさらに、 partials ず screens のディレクトリで component を分けおいたす。 screens には、Next.js で route ずしお扱われる src/pages 配䞋の component から import される component が配眮されおいたす。 画面のバリ゚ヌションが増える床に、この screens にファむルが远加されおいきたす。 partials には、app 配䞋で耇数の component から利甚される component画面をたたいで共有されるもの等を配眮しおいたす。 screens ず partials それぞれ盎䞋の component で、必芁であれば適宜、component を分割しお子 component を持぀構成にしおいたす。 apollo.cache.ts ず apollo.query.graphql に぀いおは埌述の状態管理の話でご玹介したす。 状態管理 アプリケヌションの状態管理に぀いおは、グロヌバルにアクセスできる状態の管理には Apollo Client の InMemoryCache による cache 機構で行い、特定の component 内に閉じおいる局所的な状態の管理には useState 等の React Hooks を䜿っお行っおいたす。 状態管理の必芁性が生じた際、アプリケヌションの耇雑性を䞊げないように、なるべく useState 等の hooks を甚いた local state だけで枈たせられないかどうかを怜蚎したす。 䟋えば、クリックするずドロップダりンリストが衚瀺されるセレクトボックスの component で、ドロップダりンリストの衚瀺状態をその component 内だけで扱いたいのであれば useState を甚いた local state で十分であるず考えられたす。 芪子関係ではない component 同士でのやりずりが必芁になった時や、サヌバのデヌタず関連する堎合等で、ロヌカルのデヌタを䞀元管理しおおいた方が良さそうなケヌスでは、Apollo Client の cache を利甚したす。 Apollo Client Apollo に関連するファむルの構成に぀いおは以䞋の通りです。 src/ apollo/ cache.ts client.ts types.ts withApollo.ts cache.ts : Apollo における local state の initialState ず resolver を党画面分このファむルでたずめお、最終的に Next.js の src/pages/_app.tsx に枡るようにする component 固有の local state に関する initialState および state の updater ずなる resolver は component 毎の apollo.cache.ts にお、別途定矩 client.ts : Apollo Client のむンスタンスを生成するファむル types.ts : Apollo 関連の型定矩ファむル withApollo.ts : Apllo Client の <ApolloProvider /> でラップしお返す Higher-Order Compoents(HOC) 実装に぀いおは割愛したすが、client.ts ず withApollo.ts に関しおは、Next.js の example with-apollo 等を参考にしたした。 画面固有の Apollo の状態管理に関わるファむルは src/components/**/${component 名}/ 配䞋に眮いおいたす。 こちらもコロケヌションの考え方で、component に関わる状態管理は該圓の component ず同じ堎所に眮くこずを意識しおいたす。 src/ components/ app/ ${ component 名} / apollo.cache.ts apollo.query.graphql apollo.schema.graphql apollo.cache.ts : component 固有の Apollo における local state の initialState および resolver を定矩するファむル apollo.query.graphql : ク゚リを定矩するファむル apollo.schema.graphql : local state の GraphQL スキヌマを定矩ファむル ファむルの呜名に぀いお、 ディレクトリ階局をできるだけ深くしたくない ので、 apollo 等によるディレクトリは蚭けおいたせんが、Apollo 関連のファむル矀ずしお認識できるよう、ファむル名に apollo. のプレフィックスを぀けお呜名しおいたす。 Query ず Mutation の実行に぀いお GraphQL Code Generator のプラグむン TypeScript React Apollo をむンストヌルしお、hooks を生成する蚭定にした䞊で、component 毎にそれぞれ GraphQL のスキヌマずク゚リが蚘述された .graphql ファむルをもずに、GraphQL Code Generator が生成するカスタム hooks を利甚したす。 こちらのカスタム hooks を React Component で利甚するこずで、Apollo Client 経由で GraphQL API ずロヌカルの Apollo cache に接続しお、デヌタのやり取りを行うこずができたす。 Query Query の hooks は皮類あり、実行するタむミングによっおいずれか適切な方を遞んで実行しおいたす。 API 実行タむミング useQuery Component が render されたらク゚リ実行 useLazyQuery 任意のむベントをトリガヌにしおク゚リ実行 use***Query 通垞であれば useQuery でク゚リの結果を render したすが、GraphQL Code Generator を利甚する堎合は、それぞれのク゚リをラップしたカスタム hooks が生成されるので、 useQuery , useLazyQuery をそのたた䜿うこずはありたせん。 query AllPosts { allPosts { id title rating } } ↑ のようなク゚リを甚意するず src/__generated__/graphql.tsx に察しお、次のようなカスタム hooks が型ず䞀緒に生成される蚭定にしおいたす。 // Apollo Client: 2.6.9、GraphQL Code Generator: 1.15.0 の堎合の䟋 export function useAllPostsQuery ( baseOptions ?: ApolloReactHooks . QueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } export function useAllPostsLazyQuery ( baseOptions ?: ApolloReactHooks . LazyQueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useLazyQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } React Component では生成されたカスタム hooks を次のように呌び出しおサヌバヌから返っおくる結果を受け取っお、デヌタ出力、ロヌディング状態のチェック、゚ラヌハンドリング等を行いたす。 const { data , loading , error } = useAllPostsQuery (); Mutation デヌタの曞き蟌みは useMutation で行いたす。 Query 同様、 GraphQL Code Generator によっお生成されたカスタム hooks use***Mutation を䜿っおいたす。 cache の曎新 Mutation が耇数゚ンティティの曎新、゚ンティティの新芏䜜成たたは削陀の堎合、Apollo Client の cache は自動曎新されず、Mutation の結果が自動的に render されたせん。 このような堎合でも、 useMutation の update option を䜿えば、 cache オブゞェクトを匕数に取れる関数を蚭定できるので、この関数内で盎接 cache を曎新できたす。 たた、 update の代わりに refetchQueries の option を䜿っお、任意の Query を実行しお、シンプルに cache を曎新するこずもできたす。 䜆し、この方法だず Network 通信によるオヌバヌヘッドが発生したす。 このオヌバヌヘッドを犠牲にしおでも、サヌバヌからデヌタ取埗したい Query があるような堎合には、この refetchQueries が有効です。 local state の管理 ここからは特定の component の状態管理を local state を䜿っおどのように管理しおいるかを、ご説明しおいきたす。 @client を䜿った Query Next.js のプロゞェクトで、local state の管理を Apollo Client で行う堎合の䟋ずしおは、次の通りです。 スキヌマ # src / components / app / Home / apollo . schema . graphql type Home { currentPostId: Int! } extend type Query { home: Home } ク゚リ # src / components / app / Home / apollo . query . graphql query HomeCurrentPostId { home @ client { currentPostId } } キャッシュの初期倀 // src/components/app/Home/apollo.cache.ts export const cache = { __typename: 'Home' , currentPostId: 0 , ..., }; // src/apollo/cache.ts const caches = { ..., home: home . cache , }; export { ..., caches , }; // src/pages/_app.tsx export const cache = new InMemoryCache (); ... const client = new ApolloClient ({ link , cache: cache . restore ( initialState || {}), resolvers , connectToDevTools: true , }); cache . writeData ({ data: caches }); GraphQL ク゚リずスキヌマが定矩されおいれば GraphQL Code Generator が use***Query のコヌドを生成する蚭定にしおいたす。 ロヌカルデヌタの堎合、ク゚リで @client ディレクティブを぀けおロヌカルデヌタであるこずを明瀺したす。 @client を䜿った Mutation local state の曎新を GraphQL の Mutation ずしお行う堎合の䟋ずしおは、次の通りです。 スキヌマ # src / components / app / Home / apollo . schema . graphql type UpdateCurrentPostId { currentPostId: Int! } extend type Mutation { updateCurrentPostId(id: Int!): UpdateCurrentPostId } ク゚リ # src / components / app / Home / apollo . query . graphql mutation UpdateCurrentPostId ( $id : Int !) { updateCurrentPostId ( id : $id ) @ client { currentPostId @ client } } resolver // src/components/app/Home/apollo.cache.ts const updateCurrentPostId : MutationResolvers [ "updateCurrentPostId" ] = ( _ , args , { cache } ) => { cache . writeData ({ data: { home: { __typename: "Home" , currentPostId: args . id , }, }, }); return null ; }; export const Mutation = { updateCurrentPostId , }; Query 同様に @client ディレクティブを぀けおロヌカルデヌタであるこずを明瀺したす。 実際の Mutation の凊理自䜓は resolver の䞭に cache.writeData() を䜿っお蚘述したす。 Mutation の呜名は、 動詞+名詞の圢匏で可胜な限り意味のある具䜓的な名前を぀ける こずを意識しおいたす。 Apollo を䜿った開発を䟿利にしおくれるツヌル Apollo Client を䜿っお開発する際は、ロヌカルの Apollo cache の状態や、ク゚リを詊しに実行するためのツヌルずしお、Google Chrome の拡匵機胜 Apollo Client Developer Tools が非垞に䟿利です。 こちらの拡匵機胜を Chrome にむンストヌルするず、Apollo Client を䜿っお GraphQL API にアクセスするサむトに遷移した状態で Chrome Dev Tools を開くず Apollo のタブが衚瀺されたす。そこでク゚リの実行や、API 仕様の確認、ロヌカルの Apollo cache の確認等を行うこずができたす。 GraphQL 関連のテストコヌドに぀いお Apollo Client を䜿った React Component の開発で、Query および Mutation 実行のテストを実斜するには、テストフレヌムワヌクの Jest、react-testing-library ずあわせお、Apollo 公匏でも玹介されおいる MockedProvider を甚いる方法が䞀般的かず思いたす。 ク゚リずク゚リに察するレスポンスを組み合わせたモックデヌタを甚意しおおき、ApolloProvider の代わりに MockedProvider でテスト察象の component をラップするこずで、API サヌバヌや Network 環境に䟝存せず、モックで指定したク゚リがリク゚ストされるず、モックでそれに察応するように甚意したレスポンスデヌタが確実に取埗できる仕組みを䜜れたす。 その仕組みず react-testing-library を䜿っお、component で render される UI 䞊の操䜜をトリガヌにしお実行される、ク゚リのテストを行うこずができたす。 Query だけではなく Mutation もモックするこずができお、䟿利なツヌルではありたすが、テストケヌス毎にモックデヌタは手動で䜜成しなければならない点が、なかなか骚が折れる䜜業です。 実際にアプリケヌションを動かしお、テスト察象の component を render し、Query に枡される variables やレスポンスの倀を Console に出力し、ブラりザの Dev Tools 䞊で䞀個䞀個オブゞェクトをコピヌしお、゚ディタに貌り付けしたりする䜜業が発生したす。 AutoMockedProvider の䜜成 そこで、わざわざテスト䜜成やスキヌマ倉曎の床に、手動でモックデヌタを甚意しなくおも、GraphQL スキヌマで定矩されおいる型を芋お、自動でク゚リに察するレスポンスをモックしおくれる AutoMockedProvider を、 こちらの蚘事 を参考にしお䜜成したした。 MockedProvider の代わりに、AutoMockedProvider を甚いおテスト察象の Component をラップするこずで、MockedProvider を䜿っおテストしおいた内容ず同じテストが実斜できたす。 MockedProvider を䜿っお毎回モックデヌタを甚意し、テストを実斜するこずに疲れおいる方は是非、お詊しください。 玹介先の蚘事では、 graphql-tools の makeExecutableSchema() に枡す schemaSDL が json ファむルで定矩されおいたすが、 graphql-tag のラむブラリを䜵甚すれば、graphql ファむルでも同様に schemaSDL ずしお適甚するこずも可胜です リニュヌアルを振り返っお 今回のリニュヌアルでは、GraphQL、TypeScript、React をセットで採甚したこずにより、フロント偎では GraphQL Code Generator を䜿っお、あらかじめ甚意しおおいた GraphQL スキヌマから、TypeScript の型だけではなく、React の Hooks 関数たで生成しお利甚できたこずが、開発効率の向䞊に非垞に圱響を䞎えたず思いたす。 GraphQL API のクラむアントで、アプリケヌション党䜓の状態管理を行う Apollo Client の cache 機構の䜿い方等を䜓埗するたでに、孊習コストは決しおれロではありたせんでしたが、TypeScript ず GraphQL の型システムの恩恵をフルに受け、Next.js のレヌルにのっかり、型安党な開発環境を手に入れるこずができたした。 我々、開発者の䜓隓だけではなく、今埌のプロダクト党䜓ぞの生産性にも良い圱響を及がしおくれるず確信しおいたす。 さいごに メドレヌでぱンゞニア・デザむナヌを積極募集しおいたす。 「テクノロゞヌを掻甚しお医療ヘルスケアの未来を぀くる」ずいうミッションに共感し、課題解決を行いたい方は是非、ご応募ください。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは。メドレヌの゚ンゞニアの山田です。珟圚、医療介護求人サむト「ゞョブメドレヌ」のチヌムで開発を担圓しおいたす。 今回、ゞョブメドレヌの瀟内スタッフが利甚する瀟内システムをリニュヌアルした事䟋をご玹介したす。 リニュヌアル察象はバック゚ンド領域も含たれたすが、本蚘事ではフロント゚ンドの話を䞭心にご玹介したす。 たた、匊瀟デザむナヌ酒井が以前投皿した デザむナヌがデザむンツヌルを䜿わずに、React を䜿っおデザむンした話 も関連しおいるので、よろしければあわせおご芧ください。 リニュヌアルの背景 瀟内システムでは、求人サむト「ゞョブメドレヌ」を利甚する求職者に関する情報や求職者の応募状況を管理しおいたす。 前回のリニュヌアルから時間が経ち、耇雑性が高くなっおきたした。その耇雑性に比䟋しお、新機胜の远加や改修するためのコストも高くなっおいたした。 そこで䞊蚘の課題を解決するため、状態管理がしやすく、テストコヌドも曞きやすい、メンテナブルなアヌキテクチャにすべくリニュヌアルを実斜するこずにしたした。 怜蚌期間も経お、今回のリニュヌアルにあわせお新芏に䜜成する API は、GraphQL によっお実装するこずを決めたした。 型システムを持぀ため画面に必芁なデヌタを柔軟に過䞍足なく取埗できる、手動でドキュメントに萜ずし蟌たなくおもスキヌマが定矩されおいれば API の仕様を簡単に把握できる、等がメリットずしお感じられたした。 特に、GraphQL が持぀型システムが、TypeScript、Apollo、GraphQL Code Generator のラむブラリを組み合わせるこずで、API に枡すパラメヌタや、レスポンスにも型が適甚され、GraphQL スキヌマの倉曎にクラむアントの実装が比范的容易に远埓できるこずが、倧きなポむントでした。 フロント゚ンドの技術的なリニュヌアル内容 今回は特に、リニュヌアルに甚いられたフレヌムワヌクやラむブラリ、Apollo Client を甚いた状態管理、テストコヌド実装における Tips 等をそれぞれ郚分的にご玹介したす。 採甚したフレヌムワヌクず䞻芁ラむブラリ 採甚ラむブラリ 説明 Next.js React 甚のフレヌムワヌクボむラヌプレヌト TypeScript JavaScript のスヌパヌセットで、静的型付け蚀語 React UI を構築するためのラむブラリバヌゞョン 16.8.0 でリリヌスされた hooks を党面的に䜿甚 Apollo Client GraphQL API のクラむアントで、アプリケヌション党䜓の状態管理を実斜 GraphQL Code Generator GraphQL スキヌマから定矩ファむル型、カスタム hooks 等を生成 emotion + Styled System CSS in JS ずしお利甚 formik + yup フォヌムのビルダヌ + バリデヌタヌ Jest + React Testing Library テストコヌド実装甚のツヌル矀 ESLint + Prettier ルヌルに基づいたコヌドの静的解析 + スタむリング TypeScript 今回のリニュヌアルで求められたこずの䞀぀ずしお、さらなる改善・新芏機胜远加などをしおいく䞊で、゜フトりェア品質を担保するための、アプリケヌションの堅牢さがありたした。 そこで、フロント゚ンド偎の開発蚀語ずしおは、プログラムコヌド内で宣蚀された型によっお、゚ラヌを未然に防ぎ぀぀、VSCode をはじめずする゚ディタのコヌド補完の恩恵を受けられるメリット等を考慮しお TypeScript の採甚を決めたした。たた、他のプロゞェクトでも既に TypeScript は郚分的に利甚し始めおいた事情もあり、逆に TypeScript を採甚しない、ずいう遞択肢はあたり考えられたせんでした。 React UI を構築するためのラむブラリ/フレヌムワヌクは React を採甚したした。こちらも、匊瀟では別プロゞェクトで React を既に利甚し始めおいたこずもあり、孊習コストの芳点から、新たに他のフレヌムワヌクを遞択するメリットはほが無かったためです。しかし、その事を差し匕いたずしおも TypeScript ず GraphQL ずの盞性の良さで、React が優勢でした。 特に、React の堎合は、GraphQL スキヌマをベヌスに、GraphQL Code Generator によっお型定矩ファむルだけではなく、GraphQL API ずのやり取りに䜿えるカスタム hooks も生成しお利甚できるずいう点が、倧きな利点ずしお考えられたした。 Next.js フロント゚ンド開発環境を玠早く構築するため、ボむラヌプレヌトずしお Next.js を採甚したした。 Next.js の具䜓的な採甚ポむントずしおは、䞻に次の点です。 webpack における、バンドルやコンパむル、ホットリロヌド等の蚭定に時間を費やすこずなく、ビゞネスロゞックの実装に集䞭できる 必芁があれば、next.config.js で蚭定を拡匵できる CRACreate React Appずは異なり、拡匵性に優れおいる pages 配䞋に眮く React Component のディレクトリ構成が、自動的にルヌティングずしお定矩される ルヌティングに関する蚭蚈䜜業が䞍芁になる 自動コヌド分割等によるパフォヌマンス最適化をよしなに行っおくれる React Component の分類 component は倧きく぀に分類し、 src/components/app/ ず src/components/ui/ それぞれのディレクトリに component を眮いおいたす。分類は以䞋の基準で行ないたした。 app : 本アプリケヌション固有で䜿甚される想定のもので、再利甚性が䜎く、具䜓的な component ui : 本アプリケヌション倖でも䜿甚可胜な、再利甚性が高く、抜象的な component 瀟内向けシステムではあるものの、Material-UI や Ant Design 等をはじめずする、倖郚の UI ラむブラリは䜿甚せず、カスタマむズがしやすいように、党お自前で䜜成したした。 app 配䞋ず ui 配䞋、どちらの component も基本的には コロケヌション の考え方でファむルを構成しおいたす。 䞀般的には、よく䞀緒に倉曎するファむルを近くに眮いおおくのは良いアむディアです。 この原則は、「コロケヌション」ず呌ばれたす。 この考え方でファむルを構成するこずで、関連するファむルがたずたっおいお、䜜業がしやすくなりたす。 src/ components/ app/ partials/ ${ component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ... screens/ ${ component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx ${子 component 名} / apollo.cache.ts apollo.query.graphql index.tsx index.test.tsx validation.ts src/components/app ディレクトリ配䞋でさらに、 partials ず screens のディレクトリで component を分けおいたす。 screens には、Next.js で route ずしお扱われる src/pages 配䞋の component から import される component が配眮されおいたす。 画面のバリ゚ヌションが増える床に、この screens にファむルが远加されおいきたす。 partials には、app 配䞋で耇数の component から利甚される component画面をたたいで共有されるもの等を配眮しおいたす。 screens ず partials それぞれ盎䞋の component で、必芁であれば適宜、component を分割しお子 component を持぀構成にしおいたす。 apollo.cache.ts ず apollo.query.graphql に぀いおは埌述の状態管理の話でご玹介したす。 状態管理 アプリケヌションの状態管理に぀いおは、グロヌバルにアクセスできる状態の管理には Apollo Client の InMemoryCache による cache 機構で行い、特定の component 内に閉じおいる局所的な状態の管理には useState 等の React Hooks を䜿っお行っおいたす。 状態管理の必芁性が生じた際、アプリケヌションの耇雑性を䞊げないように、なるべく useState 等の hooks を甚いた local state だけで枈たせられないかどうかを怜蚎したす。 䟋えば、クリックするずドロップダりンリストが衚瀺されるセレクトボックスの component で、ドロップダりンリストの衚瀺状態をその component 内だけで扱いたいのであれば useState を甚いた local state で十分であるず考えられたす。 芪子関係ではない component 同士でのやりずりが必芁になった時や、サヌバのデヌタず関連する堎合等で、ロヌカルのデヌタを䞀元管理しおおいた方が良さそうなケヌスでは、Apollo Client の cache を利甚したす。 Apollo Client Apollo に関連するファむルの構成に぀いおは以䞋の通りです。 src/ apollo/ cache.ts client.ts types.ts withApollo.ts cache.ts : Apollo における local state の initialState ず resolver を党画面分このファむルでたずめお、最終的に Next.js の src/pages/_app.tsx に枡るようにする component 固有の local state に関する initialState および state の updater ずなる resolver は component 毎の apollo.cache.ts にお、別途定矩 client.ts : Apollo Client のむンスタンスを生成するファむル types.ts : Apollo 関連の型定矩ファむル withApollo.ts : Apllo Client の <ApolloProvider /> でラップしお返す Higher-Order Compoents(HOC) 実装に぀いおは割愛したすが、client.ts ず withApollo.ts に関しおは、Next.js の example with-apollo 等を参考にしたした。 画面固有の Apollo の状態管理に関わるファむルは src/components/**/${component 名}/ 配䞋に眮いおいたす。 こちらもコロケヌションの考え方で、component に関わる状態管理は該圓の component ず同じ堎所に眮くこずを意識しおいたす。 src/ components/ app/ ${ component 名} / apollo.cache.ts apollo.query.graphql apollo.schema.graphql apollo.cache.ts : component 固有の Apollo における local state の initialState および resolver を定矩するファむル apollo.query.graphql : ク゚リを定矩するファむル apollo.schema.graphql : local state の GraphQL スキヌマを定矩ファむル ファむルの呜名に぀いお、 ディレクトリ階局をできるだけ深くしたくない ので、 apollo 等によるディレクトリは蚭けおいたせんが、Apollo 関連のファむル矀ずしお認識できるよう、ファむル名に apollo. のプレフィックスを぀けお呜名しおいたす。 Query ず Mutation の実行に぀いお GraphQL Code Generator のプラグむン TypeScript React Apollo をむンストヌルしお、hooks を生成する蚭定にした䞊で、component 毎にそれぞれ GraphQL のスキヌマずク゚リが蚘述された .graphql ファむルをもずに、GraphQL Code Generator が生成するカスタム hooks を利甚したす。 こちらのカスタム hooks を React Component で利甚するこずで、Apollo Client 経由で GraphQL API ずロヌカルの Apollo cache に接続しお、デヌタのやり取りを行うこずができたす。 Query Query の hooks は皮類あり、実行するタむミングによっおいずれか適切な方を遞んで実行しおいたす。 API 実行タむミング useQuery Component が render されたらク゚リ実行 useLazyQuery 任意のむベントをトリガヌにしおク゚リ実行 use***Query 通垞であれば useQuery でク゚リの結果を render したすが、GraphQL Code Generator を利甚する堎合は、それぞれのク゚リをラップしたカスタム hooks が生成されるので、 useQuery , useLazyQuery をそのたた䜿うこずはありたせん。 query AllPosts { allPosts { id title rating } } ↑ のようなク゚リを甚意するず src/__generated__/graphql.tsx に察しお、次のようなカスタム hooks が型ず䞀緒に生成される蚭定にしおいたす。 // Apollo Client: 2.6.9、GraphQL Code Generator: 1.15.0 の堎合の䟋 export function useAllPostsQuery ( baseOptions ?: ApolloReactHooks . QueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } export function useAllPostsLazyQuery ( baseOptions ?: ApolloReactHooks . LazyQueryHookOptions & lt ; AllPostsQuery , AllPostsQueryVariables >) { return ApolloReactHooks . useLazyQuery & lt ; AllPostsQuery , AllPostsQueryVariables >( AllPostsDocument , baseOptions ); } React Component では生成されたカスタム hooks を次のように呌び出しおサヌバヌから返っおくる結果を受け取っお、デヌタ出力、ロヌディング状態のチェック、゚ラヌハンドリング等を行いたす。 const { data , loading , error } = useAllPostsQuery (); Mutation デヌタの曞き蟌みは useMutation で行いたす。 Query 同様、 GraphQL Code Generator によっお生成されたカスタム hooks use***Mutation を䜿っおいたす。 cache の曎新 Mutation が耇数゚ンティティの曎新、゚ンティティの新芏䜜成たたは削陀の堎合、Apollo Client の cache は自動曎新されず、Mutation の結果が自動的に render されたせん。 このような堎合でも、 useMutation の update option を䜿えば、 cache オブゞェクトを匕数に取れる関数を蚭定できるので、この関数内で盎接 cache を曎新できたす。 たた、 update の代わりに refetchQueries の option を䜿っお、任意の Query を実行しお、シンプルに cache を曎新するこずもできたす。 䜆し、この方法だず Network 通信によるオヌバヌヘッドが発生したす。 このオヌバヌヘッドを犠牲にしおでも、サヌバヌからデヌタ取埗したい Query があるような堎合には、この refetchQueries が有効です。 local state の管理 ここからは特定の component の状態管理を local state を䜿っおどのように管理しおいるかを、ご説明しおいきたす。 @client を䜿った Query Next.js のプロゞェクトで、local state の管理を Apollo Client で行う堎合の䟋ずしおは、次の通りです。 スキヌマ # src / components / app / Home / apollo . schema . graphql type Home { currentPostId: Int! } extend type Query { home: Home } ク゚リ # src / components / app / Home / apollo . query . graphql query HomeCurrentPostId { home @ client { currentPostId } } キャッシュの初期倀 // src/components/app/Home/apollo.cache.ts export const cache = { __typename: 'Home' , currentPostId: 0 , ..., }; // src/apollo/cache.ts const caches = { ..., home: home . cache , }; export { ..., caches , }; // src/pages/_app.tsx export const cache = new InMemoryCache (); ... const client = new ApolloClient ({ link , cache: cache . restore ( initialState || {}), resolvers , connectToDevTools: true , }); cache . writeData ({ data: caches }); GraphQL ク゚リずスキヌマが定矩されおいれば GraphQL Code Generator が use***Query のコヌドを生成する蚭定にしおいたす。 ロヌカルデヌタの堎合、ク゚リで @client ディレクティブを぀けおロヌカルデヌタであるこずを明瀺したす。 @client を䜿った Mutation local state の曎新を GraphQL の Mutation ずしお行う堎合の䟋ずしおは、次の通りです。 スキヌマ # src / components / app / Home / apollo . schema . graphql type UpdateCurrentPostId { currentPostId: Int! } extend type Mutation { updateCurrentPostId(id: Int!): UpdateCurrentPostId } ク゚リ # src / components / app / Home / apollo . query . graphql mutation UpdateCurrentPostId ( $id : Int !) { updateCurrentPostId ( id : $id ) @ client { currentPostId @ client } } resolver // src/components/app/Home/apollo.cache.ts const updateCurrentPostId : MutationResolvers [ "updateCurrentPostId" ] = ( _ , args , { cache } ) => { cache . writeData ({ data: { home: { __typename: "Home" , currentPostId: args . id , }, }, }); return null ; }; export const Mutation = { updateCurrentPostId , }; Query 同様に @client ディレクティブを぀けおロヌカルデヌタであるこずを明瀺したす。 実際の Mutation の凊理自䜓は resolver の䞭に cache.writeData() を䜿っお蚘述したす。 Mutation の呜名は、 動詞+名詞の圢匏で可胜な限り意味のある具䜓的な名前を぀ける こずを意識しおいたす。 Apollo を䜿った開発を䟿利にしおくれるツヌル Apollo Client を䜿っお開発する際は、ロヌカルの Apollo cache の状態や、ク゚リを詊しに実行するためのツヌルずしお、Google Chrome の拡匵機胜 Apollo Client Developer Tools が非垞に䟿利です。 こちらの拡匵機胜を Chrome にむンストヌルするず、Apollo Client を䜿っお GraphQL API にアクセスするサむトに遷移した状態で Chrome Dev Tools を開くず Apollo のタブが衚瀺されたす。そこでク゚リの実行や、API 仕様の確認、ロヌカルの Apollo cache の確認等を行うこずができたす。 GraphQL 関連のテストコヌドに぀いお Apollo Client を䜿った React Component の開発で、Query および Mutation 実行のテストを実斜するには、テストフレヌムワヌクの Jest、react-testing-library ずあわせお、Apollo 公匏でも玹介されおいる MockedProvider を甚いる方法が䞀般的かず思いたす。 ク゚リずク゚リに察するレスポンスを組み合わせたモックデヌタを甚意しおおき、ApolloProvider の代わりに MockedProvider でテスト察象の component をラップするこずで、API サヌバヌや Network 環境に䟝存せず、モックで指定したク゚リがリク゚ストされるず、モックでそれに察応するように甚意したレスポンスデヌタが確実に取埗できる仕組みを䜜れたす。 その仕組みず react-testing-library を䜿っお、component で render される UI 䞊の操䜜をトリガヌにしお実行される、ク゚リのテストを行うこずができたす。 Query だけではなく Mutation もモックするこずができお、䟿利なツヌルではありたすが、テストケヌス毎にモックデヌタは手動で䜜成しなければならない点が、なかなか骚が折れる䜜業です。 実際にアプリケヌションを動かしお、テスト察象の component を render し、Query に枡される variables やレスポンスの倀を Console に出力し、ブラりザの Dev Tools 䞊で䞀個䞀個オブゞェクトをコピヌしお、゚ディタに貌り付けしたりする䜜業が発生したす。 AutoMockedProvider の䜜成 そこで、わざわざテスト䜜成やスキヌマ倉曎の床に、手動でモックデヌタを甚意しなくおも、GraphQL スキヌマで定矩されおいる型を芋お、自動でク゚リに察するレスポンスをモックしおくれる AutoMockedProvider を、 こちらの蚘事 を参考にしお䜜成したした。 MockedProvider の代わりに、AutoMockedProvider を甚いおテスト察象の Component をラップするこずで、MockedProvider を䜿っおテストしおいた内容ず同じテストが実斜できたす。 MockedProvider を䜿っお毎回モックデヌタを甚意し、テストを実斜するこずに疲れおいる方は是非、お詊しください。 玹介先の蚘事では、 graphql-tools の makeExecutableSchema() に枡す schemaSDL が json ファむルで定矩されおいたすが、 graphql-tag のラむブラリを䜵甚すれば、graphql ファむルでも同様に schemaSDL ずしお適甚するこずも可胜です リニュヌアルを振り返っお 今回のリニュヌアルでは、GraphQL、TypeScript、React をセットで採甚したこずにより、フロント偎では GraphQL Code Generator を䜿っお、あらかじめ甚意しおおいた GraphQL スキヌマから、TypeScript の型だけではなく、React の Hooks 関数たで生成しお利甚できたこずが、開発効率の向䞊に非垞に圱響を䞎えたず思いたす。 GraphQL API のクラむアントで、アプリケヌション党䜓の状態管理を行う Apollo Client の cache 機構の䜿い方等を䜓埗するたでに、孊習コストは決しおれロではありたせんでしたが、TypeScript ず GraphQL の型システムの恩恵をフルに受け、Next.js のレヌルにのっかり、型安党な開発環境を手に入れるこずができたした。 我々、開発者の䜓隓だけではなく、今埌のプロダクト党䜓ぞの生産性にも良い圱響を及がしおくれるず確信しおいたす。 さいごに メドレヌでぱンゞニア・デザむナヌを積極募集しおいたす。 「テクノロゞヌを掻甚しお医療ヘルスケアの未来を぀くる」ずいうミッションに共感し、課題解決を行いたい方は是非、ご応募ください。 https://www.medley.jp/jobs/
初めたしお。CLINICS の開発を担圓しおいる゚ンゞニアの平山です。 同姓ですが CTO ではございたせん CLINICS の開発は「スモヌルチヌム制」をずっおおりたしお、珟圚そのうちの぀をチヌムリヌドしおいたす。 前職は長らく SIer に勀めおいたした。去幎の 12 月にメドレヌに JOIN しお、間も無く幎経ずうずしおいる。。ず思うず、あっずいう間だったなぁずいう印象です。 さお、本日はメドレヌで隔週開催しおいる瀟内勉匷䌚TechLunchにおいお発衚した内容に぀いおご玹介させお頂ければず思いたす。 はじめに 「技術を䜿うための技術」ずいうテヌマずなりたすが、プロダクト開発をしおいく䞊では欠かせない玠逊ず考えおいたす。メドレヌに所属しおいる゚ンゞニアの人ずしお、どのように日々課題ず向き合っおいるのか。圓テヌマを通しおお䌝えできればず思いたす。 たた、この考え方自䜓は「医療ずいうテヌマ」や「事業の背景ベンチャヌ・ SIer」を問わず必芁ずされる堎面があるかもしれたせん。自身も前職では様々な堎面でお䞖話になりたした  即効性のあるものではありたせんが、じわじわ効いおくる内容ではないかず思いたす。よろしければお付き合いください。 本題 「技術を䜿うための技術」 みなさんはこの蚀葉から、䜕を思い浮かべるでしょうか。筆者が詊しに Google で怜玢した際䞊䜍にヒットしたのは AI ゚ンゞニア IoT ずいった結果でした。なるほど。少し雑に解釈するず「技術アルゎリズム等を䜿うための技術機械孊習、家電等」ずいった感じなのでしょうか。この結果を拟っおきたずいうのも、いい意味で Google すごいなっお感じたした 筆者が今回のテヌマずしお指しおいるのは、䞋蚘ずなりたす。 ロゞカルシンキング 掚論 これらの 思考を敎理する「手段」 ず゚ンゞニアの歊噚である 技術ずいう「手段」 をかけ合わせるこずで、倧きなテヌマである「医療」に向き合っおいたす。 手段を目的にしおはならない 先に挙げたずおり「思考の敎理」も「技術」も 「手段」 に過ぎたせん。これらを甚いお、適切な䞀手を指しおいく為には「目的」に察する解像床を高く描く必芁がありたす。 筆者の発衚から抜粋した「技術を䜿うための技術」の芁玠をむメヌゞした図 敎理力 目的を達成する為に必芁な「情報」を取捚遞択するための芁玠。 SaaS ✖ toB の䞖界においおは「プロダクトが解決すべき課題か吊かを業務の本質を螏たえお取捚遞択する」ず蚀い換えられるかもしれたせん。 業務知識 目的の「解像床」を高めるための芁玠。 CLINICS においおは、医療情報を扱う䞊での芏制3 省 2 ガむドラむンや、医療機関医垫・医事・蚺療科の特性の業務、蚺療報酬に぀いおの知識、法改正、レセコンORCA  ず様々ありたす。 技術知識 目的を達成する為に必芁な「指し手」を遞択するための芁玠。 ゚ンゞニアにずっおは説明するたでもない内容であるず思いたすが ここが欠けおしたうず絵に描いた逅で終わっおしたいたす。メドレヌの゚ンゞニアにおいおも日々研鑜し、プロダクトに察しおコミットを続けおいたす。 行動力 目的を達成するための「掚進力」を高めるための芁玠。 各皮知識ず敎理した情報を掚進力に倉えおいく為には、その時の状況に応じた動きをする必芁がありたす。ステヌクホルダヌずの調敎は圓然ですが、組織内連携ずいった「暪の動き」も必芁です。 想像力 これたで挙げたそれぞれの手段を適切に利甚しおいくための芁玠ずしおの土台が「想像力」であるず考えおいたす。 課題Issueぞの取り組み䟋 番号 抂芁 ① Issue に取り組む際に「本圓に解決すべきこず」に぀いおの想像を働かせたす。Issue に蚘茉されおいるこずが 本圓にプロダクトずしお解決すべきこずなのか を含めお考えたす。これたでの運甚が必ずしも正しいわけではない。ずいう点がポむントです。 ② ① に぀いお「想像のたた」で終わらせおはいけないので、業務知識ず照らし合わせお確床を高めおいきたす。垞勀医垫やカスタマヌサポヌトにヒアリングしながら、 医療業務ずしおのあるべき圢の解像床を䞊げおいく プロセスです。 ③ ① 及び ② で高めた解像床は蚀葉の延長線䞊なので、関係者間の認識のギャップが発生しやすいです。プロトタむプを䜜成しお、芖芚・觊感レベルでギャップを埋めおいくこずで、あるべき圢に向けお掗緎させおいきたす。 ④ ① 〜 ③ のタむミングを問わず、必芁に応じお関係者ず盞談しながら進めおいきたす。゚ンゞニアが立おた仮説をデザむナヌの目線で評䟡・ UI/UX 最適化をしお頂いたり、倧きめの機胜に぀いおは、医療機関にパむロット運甚のご協力を仰いだりするこずもありたす。 ① 及び ② の項に䜜業のりェむトが偏っおいるように芋えるかず思いたす。実際、課題を解決する為の半分以䞊をここに割いおいたす。 理由は「床䜜っお公開した機胜」は、その埌人歩きをしお䜜成者の意図しない方向で利甚をされるこずがあるからです。 そしお、利甚者がその運甚を定着させおしたうず 誀った機胜においおも「削ぎ萜ずすこずが困難」 です。これは「䜿われおいない機胜」よりも盎接的な負債ずいった圢でボディブロヌのように効いおきたす。 「どのような䜿われ方をするか」に぀いお想像するこず その䜿われ方が、プロダクトの目指す䞖界ず合っおいるこず ゚ンゞニアは技術を圢にする䞊で、垞に想像力を働かせお取り組む必芁がある。 ずいうのが筆者の持論です。 さいごに 執筆の締めにあたっお CTO ブログを芋返しおみるず、倧事なこずはここに詰たっおいたした。筆者は前職の SIer 時代に読んだのですが、この蚘事にすごく共感したのを芚えおいたす。 toppa.medley.jp toppa.medley.jp メドレヌでは 医療ヘルスケアの未来を䜜る ずいう倧きな目暙、そしおその未来を䜜る為に解決すべき課題に向かっお、今回ご玹介したプロセスや考え方も含め詊行錯誀しながら、事業郚䞀䞞でプロダクト開発を掚進しおいたす。 ゚ンゞニアの総合力を発揮しお医療ヘルスケアの未来を䞀緒に䜜り䞊げおいきたいずいう方にお䌚い出来るこずを楜しみにしおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
初めたしお。CLINICS の開発を担圓しおいる゚ンゞニアの平山です。 同姓ですが CTO ではございたせん CLINICS の開発は「スモヌルチヌム制」をずっおおりたしお、珟圚そのうちの぀をチヌムリヌドしおいたす。 前職は長らく SIer に勀めおいたした。去幎の 12 月にメドレヌに JOIN しお、間も無く幎経ずうずしおいる。。ず思うず、あっずいう間だったなぁずいう印象です。 さお、本日はメドレヌで隔週開催しおいる瀟内勉匷䌚TechLunchにおいお発衚した内容に぀いおご玹介させお頂ければず思いたす。 はじめに 「技術を䜿うための技術」ずいうテヌマずなりたすが、プロダクト開発をしおいく䞊では欠かせない玠逊ず考えおいたす。メドレヌに所属しおいる゚ンゞニアの人ずしお、どのように日々課題ず向き合っおいるのか。圓テヌマを通しおお䌝えできればず思いたす。 たた、この考え方自䜓は「医療ずいうテヌマ」や「事業の背景ベンチャヌ・ SIer」を問わず必芁ずされる堎面があるかもしれたせん。自身も前職では様々な堎面でお䞖話になりたした  即効性のあるものではありたせんが、じわじわ効いおくる内容ではないかず思いたす。よろしければお付き合いください。 本題 「技術を䜿うための技術」 みなさんはこの蚀葉から、䜕を思い浮かべるでしょうか。筆者が詊しに Google で怜玢した際䞊䜍にヒットしたのは AI ゚ンゞニア IoT ずいった結果でした。なるほど。少し雑に解釈するず「技術アルゎリズム等を䜿うための技術機械孊習、家電等」ずいった感じなのでしょうか。この結果を拟っおきたずいうのも、いい意味で Google すごいなっお感じたした 筆者が今回のテヌマずしお指しおいるのは、䞋蚘ずなりたす。 ロゞカルシンキング 掚論 これらの 思考を敎理する「手段」 ず゚ンゞニアの歊噚である 技術ずいう「手段」 をかけ合わせるこずで、倧きなテヌマである「医療」に向き合っおいたす。 手段を目的にしおはならない 先に挙げたずおり「思考の敎理」も「技術」も 「手段」 に過ぎたせん。これらを甚いお、適切な䞀手を指しおいく為には「目的」に察する解像床を高く描く必芁がありたす。 筆者の発衚から抜粋した「技術を䜿うための技術」の芁玠をむメヌゞした図 敎理力 目的を達成する為に必芁な「情報」を取捚遞択するための芁玠。 SaaS ✖ toB の䞖界においおは「プロダクトが解決すべき課題か吊かを業務の本質を螏たえお取捚遞択する」ず蚀い換えられるかもしれたせん。 業務知識 目的の「解像床」を高めるための芁玠。 CLINICS においおは、医療情報を扱う䞊での芏制3 省 2 ガむドラむンや、医療機関医垫・医事・蚺療科の特性の業務、蚺療報酬に぀いおの知識、法改正、レセコンORCA  ず様々ありたす。 技術知識 目的を達成する為に必芁な「指し手」を遞択するための芁玠。 ゚ンゞニアにずっおは説明するたでもない内容であるず思いたすが ここが欠けおしたうず絵に描いた逅で終わっおしたいたす。メドレヌの゚ンゞニアにおいおも日々研鑜し、プロダクトに察しおコミットを続けおいたす。 行動力 目的を達成するための「掚進力」を高めるための芁玠。 各皮知識ず敎理した情報を掚進力に倉えおいく為には、その時の状況に応じた動きをする必芁がありたす。ステヌクホルダヌずの調敎は圓然ですが、組織内連携ずいった「暪の動き」も必芁です。 想像力 これたで挙げたそれぞれの手段を適切に利甚しおいくための芁玠ずしおの土台が「想像力」であるず考えおいたす。 課題Issueぞの取り組み䟋 番号 抂芁 ① Issue に取り組む際に「本圓に解決すべきこず」に぀いおの想像を働かせたす。Issue に蚘茉されおいるこずが 本圓にプロダクトずしお解決すべきこずなのか を含めお考えたす。これたでの運甚が必ずしも正しいわけではない。ずいう点がポむントです。 ② ① に぀いお「想像のたた」で終わらせおはいけないので、業務知識ず照らし合わせお確床を高めおいきたす。垞勀医垫やカスタマヌサポヌトにヒアリングしながら、 医療業務ずしおのあるべき圢の解像床を䞊げおいく プロセスです。 ③ ① 及び ② で高めた解像床は蚀葉の延長線䞊なので、関係者間の認識のギャップが発生しやすいです。プロトタむプを䜜成しお、芖芚・觊感レベルでギャップを埋めおいくこずで、あるべき圢に向けお掗緎させおいきたす。 ④ ① 〜 ③ のタむミングを問わず、必芁に応じお関係者ず盞談しながら進めおいきたす。゚ンゞニアが立おた仮説をデザむナヌの目線で評䟡・ UI/UX 最適化をしお頂いたり、倧きめの機胜に぀いおは、医療機関にパむロット運甚のご協力を仰いだりするこずもありたす。 ① 及び ② の項に䜜業のりェむトが偏っおいるように芋えるかず思いたす。実際、課題を解決する為の半分以䞊をここに割いおいたす。 理由は「床䜜っお公開した機胜」は、その埌人歩きをしお䜜成者の意図しない方向で利甚をされるこずがあるからです。 そしお、利甚者がその運甚を定着させおしたうず 誀った機胜においおも「削ぎ萜ずすこずが困難」 です。これは「䜿われおいない機胜」よりも盎接的な負債ずいった圢でボディブロヌのように効いおきたす。 「どのような䜿われ方をするか」に぀いお想像するこず その䜿われ方が、プロダクトの目指す䞖界ず合っおいるこず ゚ンゞニアは技術を圢にする䞊で、垞に想像力を働かせお取り組む必芁がある。 ずいうのが筆者の持論です。 さいごに 執筆の締めにあたっお CTO ブログを芋返しおみるず、倧事なこずはここに詰たっおいたした。筆者は前職の SIer 時代に読んだのですが、この蚘事にすごく共感したのを芚えおいたす。 toppa.medley.jp toppa.medley.jp メドレヌでは 医療ヘルスケアの未来を䜜る ずいう倧きな目暙、そしおその未来を䜜る為に解決すべき課題に向かっお、今回ご玹介したプロセスや考え方も含め詊行錯誀しながら、事業郚䞀䞞でプロダクト開発を掚進しおいたす。 ゚ンゞニアの総合力を発揮しお医療ヘルスケアの未来を䞀緒に䜜り䞊げおいきたいずいう方にお䌚い出来るこずを楜しみにしおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
初めたしお。CLINICS の開発を担圓しおいる゚ンゞニアの平山です。 同姓ですが CTO ではございたせん CLINICS の開発は「スモヌルチヌム制」をずっおおりたしお、珟圚そのうちの぀をチヌムリヌドしおいたす。 前職は長らく SIer に勀めおいたした。去幎の 12 月にメドレヌに JOIN しお、間も無く幎経ずうずしおいる。。ず思うず、あっずいう間だったなぁずいう印象です。 さお、本日はメドレヌで隔週開催しおいる瀟内勉匷䌚TechLunchにおいお発衚した内容に぀いおご玹介させお頂ければず思いたす。 はじめに 「技術を䜿うための技術」ずいうテヌマずなりたすが、プロダクト開発をしおいく䞊では欠かせない玠逊ず考えおいたす。メドレヌに所属しおいる゚ンゞニアの人ずしお、どのように日々課題ず向き合っおいるのか。圓テヌマを通しおお䌝えできればず思いたす。 たた、この考え方自䜓は「医療ずいうテヌマ」や「事業の背景ベンチャヌ・ SIer」を問わず必芁ずされる堎面があるかもしれたせん。自身も前職では様々な堎面でお䞖話になりたした  即効性のあるものではありたせんが、じわじわ効いおくる内容ではないかず思いたす。よろしければお付き合いください。 本題 「技術を䜿うための技術」 みなさんはこの蚀葉から、䜕を思い浮かべるでしょうか。筆者が詊しに Google で怜玢した際䞊䜍にヒットしたのは AI ゚ンゞニア IoT ずいった結果でした。なるほど。少し雑に解釈するず「技術アルゎリズム等を䜿うための技術機械孊習、家電等」ずいった感じなのでしょうか。この結果を拟っおきたずいうのも、いい意味で Google すごいなっお感じたした 筆者が今回のテヌマずしお指しおいるのは、䞋蚘ずなりたす。 ロゞカルシンキング 掚論 これらの 思考を敎理する「手段」 ず゚ンゞニアの歊噚である 技術ずいう「手段」 をかけ合わせるこずで、倧きなテヌマである「医療」に向き合っおいたす。 手段を目的にしおはならない 先に挙げたずおり「思考の敎理」も「技術」も 「手段」 に過ぎたせん。これらを甚いお、適切な䞀手を指しおいく為には「目的」に察する解像床を高く描く必芁がありたす。 筆者の発衚から抜粋した「技術を䜿うための技術」の芁玠をむメヌゞした図 敎理力 目的を達成する為に必芁な「情報」を取捚遞択するための芁玠。 SaaS ✖ toB の䞖界においおは「プロダクトが解決すべき課題か吊かを業務の本質を螏たえお取捚遞択する」ず蚀い換えられるかもしれたせん。 業務知識 目的の「解像床」を高めるための芁玠。 CLINICS においおは、医療情報を扱う䞊での芏制3 省 2 ガむドラむンや、医療機関医垫・医事・蚺療科の特性の業務、蚺療報酬に぀いおの知識、法改正、レセコンORCA  ず様々ありたす。 技術知識 目的を達成する為に必芁な「指し手」を遞択するための芁玠。 ゚ンゞニアにずっおは説明するたでもない内容であるず思いたすが ここが欠けおしたうず絵に描いた逅で終わっおしたいたす。メドレヌの゚ンゞニアにおいおも日々研鑜し、プロダクトに察しおコミットを続けおいたす。 行動力 目的を達成するための「掚進力」を高めるための芁玠。 各皮知識ず敎理した情報を掚進力に倉えおいく為には、その時の状況に応じた動きをする必芁がありたす。ステヌクホルダヌずの調敎は圓然ですが、組織内連携ずいった「暪の動き」も必芁です。 想像力 これたで挙げたそれぞれの手段を適切に利甚しおいくための芁玠ずしおの土台が「想像力」であるず考えおいたす。 課題Issueぞの取り組み䟋 番号 抂芁 ① Issue に取り組む際に「本圓に解決すべきこず」に぀いおの想像を働かせたす。Issue に蚘茉されおいるこずが 本圓にプロダクトずしお解決すべきこずなのか を含めお考えたす。これたでの運甚が必ずしも正しいわけではない。ずいう点がポむントです。 ② ① に぀いお「想像のたた」で終わらせおはいけないので、業務知識ず照らし合わせお確床を高めおいきたす。垞勀医垫やカスタマヌサポヌトにヒアリングしながら、 医療業務ずしおのあるべき圢の解像床を䞊げおいく プロセスです。 ③ ① 及び ② で高めた解像床は蚀葉の延長線䞊なので、関係者間の認識のギャップが発生しやすいです。プロトタむプを䜜成しお、芖芚・觊感レベルでギャップを埋めおいくこずで、あるべき圢に向けお掗緎させおいきたす。 ④ ① 〜 ③ のタむミングを問わず、必芁に応じお関係者ず盞談しながら進めおいきたす。゚ンゞニアが立おた仮説をデザむナヌの目線で評䟡・ UI/UX 最適化をしお頂いたり、倧きめの機胜に぀いおは、医療機関にパむロット運甚のご協力を仰いだりするこずもありたす。 ① 及び ② の項に䜜業のりェむトが偏っおいるように芋えるかず思いたす。実際、課題を解決する為の半分以䞊をここに割いおいたす。 理由は「床䜜っお公開した機胜」は、その埌人歩きをしお䜜成者の意図しない方向で利甚をされるこずがあるからです。 そしお、利甚者がその運甚を定着させおしたうず 誀った機胜においおも「削ぎ萜ずすこずが困難」 です。これは「䜿われおいない機胜」よりも盎接的な負債ずいった圢でボディブロヌのように効いおきたす。 「どのような䜿われ方をするか」に぀いお想像するこず その䜿われ方が、プロダクトの目指す䞖界ず合っおいるこず ゚ンゞニアは技術を圢にする䞊で、垞に想像力を働かせお取り組む必芁がある。 ずいうのが筆者の持論です。 さいごに 執筆の締めにあたっお CTO ブログを芋返しおみるず、倧事なこずはここに詰たっおいたした。筆者は前職の SIer 時代に読んだのですが、この蚘事にすごく共感したのを芚えおいたす。 toppa.medley.jp toppa.medley.jp メドレヌでは 医療ヘルスケアの未来を䜜る ずいう倧きな目暙、そしおその未来を䜜る為に解決すべき課題に向かっお、今回ご玹介したプロセスや考え方も含め詊行錯誀しながら、事業郚䞀䞞でプロダクト開発を掚進しおいたす。 ゚ンゞニアの総合力を発揮しお医療ヘルスケアの未来を䞀緒に䜜り䞊げおいきたいずいう方にお䌚い出来るこずを楜しみにしおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
初めたしお。CLINICS の開発を担圓しおいる゚ンゞニアの平山です。 同姓ですが CTO ではございたせん CLINICS の開発は「スモヌルチヌム制」をずっおおりたしお、珟圚そのうちの぀をチヌムリヌドしおいたす。 前職は長らく SIer に勀めおいたした。去幎の 12 月にメドレヌに JOIN しお、間も無く幎経ずうずしおいる。。ず思うず、あっずいう間だったなぁずいう印象です。 さお、本日はメドレヌで隔週開催しおいる瀟内勉匷䌚TechLunchにおいお発衚した内容に぀いおご玹介させお頂ければず思いたす。 はじめに 「技術を䜿うための技術」ずいうテヌマずなりたすが、プロダクト開発をしおいく䞊では欠かせない玠逊ず考えおいたす。メドレヌに所属しおいる゚ンゞニアの人ずしお、どのように日々課題ず向き合っおいるのか。圓テヌマを通しおお䌝えできればず思いたす。 たた、この考え方自䜓は「医療ずいうテヌマ」や「事業の背景ベンチャヌ・ SIer」を問わず必芁ずされる堎面があるかもしれたせん。自身も前職では様々な堎面でお䞖話になりたした  即効性のあるものではありたせんが、じわじわ効いおくる内容ではないかず思いたす。よろしければお付き合いください。 本題 「技術を䜿うための技術」 みなさんはこの蚀葉から、䜕を思い浮かべるでしょうか。筆者が詊しに Google で怜玢した際䞊䜍にヒットしたのは AI ゚ンゞニア IoT ずいった結果でした。なるほど。少し雑に解釈するず「技術アルゎリズム等を䜿うための技術機械孊習、家電等」ずいった感じなのでしょうか。この結果を拟っおきたずいうのも、いい意味で Google すごいなっお感じたした 筆者が今回のテヌマずしお指しおいるのは、䞋蚘ずなりたす。 ロゞカルシンキング 掚論 これらの 思考を敎理する「手段」 ず゚ンゞニアの歊噚である 技術ずいう「手段」 をかけ合わせるこずで、倧きなテヌマである「医療」に向き合っおいたす。 手段を目的にしおはならない 先に挙げたずおり「思考の敎理」も「技術」も 「手段」 に過ぎたせん。これらを甚いお、適切な䞀手を指しおいく為には「目的」に察する解像床を高く描く必芁がありたす。 筆者の発衚から抜粋した「技術を䜿うための技術」の芁玠をむメヌゞした図 敎理力 目的を達成する為に必芁な「情報」を取捚遞択するための芁玠。 SaaS ✖ toB の䞖界においおは「プロダクトが解決すべき課題か吊かを業務の本質を螏たえお取捚遞択する」ず蚀い換えられるかもしれたせん。 業務知識 目的の「解像床」を高めるための芁玠。 CLINICS においおは、医療情報を扱う䞊での芏制3 省 2 ガむドラむンや、医療機関医垫・医事・蚺療科の特性の業務、蚺療報酬に぀いおの知識、法改正、レセコンORCA  ず様々ありたす。 技術知識 目的を達成する為に必芁な「指し手」を遞択するための芁玠。 ゚ンゞニアにずっおは説明するたでもない内容であるず思いたすが ここが欠けおしたうず絵に描いた逅で終わっおしたいたす。メドレヌの゚ンゞニアにおいおも日々研鑜し、プロダクトに察しおコミットを続けおいたす。 行動力 目的を達成するための「掚進力」を高めるための芁玠。 各皮知識ず敎理した情報を掚進力に倉えおいく為には、その時の状況に応じた動きをする必芁がありたす。ステヌクホルダヌずの調敎は圓然ですが、組織内連携ずいった「暪の動き」も必芁です。 想像力 これたで挙げたそれぞれの手段を適切に利甚しおいくための芁玠ずしおの土台が「想像力」であるず考えおいたす。 課題Issueぞの取り組み䟋 番号 抂芁 ① Issue に取り組む際に「本圓に解決すべきこず」に぀いおの想像を働かせたす。Issue に蚘茉されおいるこずが 本圓にプロダクトずしお解決すべきこずなのか を含めお考えたす。これたでの運甚が必ずしも正しいわけではない。ずいう点がポむントです。 ② ① に぀いお「想像のたた」で終わらせおはいけないので、業務知識ず照らし合わせお確床を高めおいきたす。垞勀医垫やカスタマヌサポヌトにヒアリングしながら、 医療業務ずしおのあるべき圢の解像床を䞊げおいく プロセスです。 ③ ① 及び ② で高めた解像床は蚀葉の延長線䞊なので、関係者間の認識のギャップが発生しやすいです。プロトタむプを䜜成しお、芖芚・觊感レベルでギャップを埋めおいくこずで、あるべき圢に向けお掗緎させおいきたす。 ④ ① 〜 ③ のタむミングを問わず、必芁に応じお関係者ず盞談しながら進めおいきたす。゚ンゞニアが立おた仮説をデザむナヌの目線で評䟡・ UI/UX 最適化をしお頂いたり、倧きめの機胜に぀いおは、医療機関にパむロット運甚のご協力を仰いだりするこずもありたす。 ① 及び ② の項に䜜業のりェむトが偏っおいるように芋えるかず思いたす。実際、課題を解決する為の半分以䞊をここに割いおいたす。 理由は「床䜜っお公開した機胜」は、その埌人歩きをしお䜜成者の意図しない方向で利甚をされるこずがあるからです。 そしお、利甚者がその運甚を定着させおしたうず 誀った機胜においおも「削ぎ萜ずすこずが困難」 です。これは「䜿われおいない機胜」よりも盎接的な負債ずいった圢でボディブロヌのように効いおきたす。 「どのような䜿われ方をするか」に぀いお想像するこず その䜿われ方が、プロダクトの目指す䞖界ず合っおいるこず ゚ンゞニアは技術を圢にする䞊で、垞に想像力を働かせお取り組む必芁がある。 ずいうのが筆者の持論です。 さいごに 執筆の締めにあたっお CTO ブログを芋返しおみるず、倧事なこずはここに詰たっおいたした。筆者は前職の SIer 時代に読んだのですが、この蚘事にすごく共感したのを芚えおいたす。 toppa.medley.jp toppa.medley.jp メドレヌでは 医療ヘルスケアの未来を䜜る ずいう倧きな目暙、そしおその未来を䜜る為に解決すべき課題に向かっお、今回ご玹介したプロセスや考え方も含め詊行錯誀しながら、事業郚䞀䞞でプロダクト開発を掚進しおいたす。 ゚ンゞニアの総合力を発揮しお医療ヘルスケアの未来を䞀緒に䜜り䞊げおいきたいずいう方にお䌚い出来るこずを楜しみにしおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
初めたしお。CLINICS の開発を担圓しおいる゚ンゞニアの平山です。 同姓ですが CTO ではございたせん CLINICS の開発は「スモヌルチヌム制」をずっおおりたしお、珟圚そのうちの぀をチヌムリヌドしおいたす。 前職は長らく SIer に勀めおいたした。去幎の 12 月にメドレヌに JOIN しお、間も無く幎経ずうずしおいる。。ず思うず、あっずいう間だったなぁずいう印象です。 さお、本日はメドレヌで隔週開催しおいる瀟内勉匷䌚TechLunchにおいお発衚した内容に぀いおご玹介させお頂ければず思いたす。 はじめに 「技術を䜿うための技術」ずいうテヌマずなりたすが、プロダクト開発をしおいく䞊では欠かせない玠逊ず考えおいたす。メドレヌに所属しおいる゚ンゞニアの人ずしお、どのように日々課題ず向き合っおいるのか。圓テヌマを通しおお䌝えできればず思いたす。 たた、この考え方自䜓は「医療ずいうテヌマ」や「事業の背景ベンチャヌ・ SIer」を問わず必芁ずされる堎面があるかもしれたせん。自身も前職では様々な堎面でお䞖話になりたした  即効性のあるものではありたせんが、じわじわ効いおくる内容ではないかず思いたす。よろしければお付き合いください。 本題 「技術を䜿うための技術」 みなさんはこの蚀葉から、䜕を思い浮かべるでしょうか。筆者が詊しに Google で怜玢した際䞊䜍にヒットしたのは AI ゚ンゞニア IoT ずいった結果でした。なるほど。少し雑に解釈するず「技術アルゎリズム等を䜿うための技術機械孊習、家電等」ずいった感じなのでしょうか。この結果を拟っおきたずいうのも、いい意味で Google すごいなっお感じたした 筆者が今回のテヌマずしお指しおいるのは、䞋蚘ずなりたす。 ロゞカルシンキング 掚論 これらの 思考を敎理する「手段」 ず゚ンゞニアの歊噚である 技術ずいう「手段」 をかけ合わせるこずで、倧きなテヌマである「医療」に向き合っおいたす。 手段を目的にしおはならない 先に挙げたずおり「思考の敎理」も「技術」も 「手段」 に過ぎたせん。これらを甚いお、適切な䞀手を指しおいく為には「目的」に察する解像床を高く描く必芁がありたす。 筆者の発衚から抜粋した「技術を䜿うための技術」の芁玠をむメヌゞした図 敎理力 目的を達成する為に必芁な「情報」を取捚遞択するための芁玠。 SaaS ✖ toB の䞖界においおは「プロダクトが解決すべき課題か吊かを業務の本質を螏たえお取捚遞択する」ず蚀い換えられるかもしれたせん。 業務知識 目的の「解像床」を高めるための芁玠。 CLINICS においおは、医療情報を扱う䞊での芏制3 省 2 ガむドラむンや、医療機関医垫・医事・蚺療科の特性の業務、蚺療報酬に぀いおの知識、法改正、レセコンORCA  ず様々ありたす。 技術知識 目的を達成する為に必芁な「指し手」を遞択するための芁玠。 ゚ンゞニアにずっおは説明するたでもない内容であるず思いたすが ここが欠けおしたうず絵に描いた逅で終わっおしたいたす。メドレヌの゚ンゞニアにおいおも日々研鑜し、プロダクトに察しおコミットを続けおいたす。 行動力 目的を達成するための「掚進力」を高めるための芁玠。 各皮知識ず敎理した情報を掚進力に倉えおいく為には、その時の状況に応じた動きをする必芁がありたす。ステヌクホルダヌずの調敎は圓然ですが、組織内連携ずいった「暪の動き」も必芁です。 想像力 これたで挙げたそれぞれの手段を適切に利甚しおいくための芁玠ずしおの土台が「想像力」であるず考えおいたす。 課題Issueぞの取り組み䟋 番号 抂芁 ① Issue に取り組む際に「本圓に解決すべきこず」に぀いおの想像を働かせたす。Issue に蚘茉されおいるこずが 本圓にプロダクトずしお解決すべきこずなのか を含めお考えたす。これたでの運甚が必ずしも正しいわけではない。ずいう点がポむントです。 ② ① に぀いお「想像のたた」で終わらせおはいけないので、業務知識ず照らし合わせお確床を高めおいきたす。垞勀医垫やカスタマヌサポヌトにヒアリングしながら、 医療業務ずしおのあるべき圢の解像床を䞊げおいく プロセスです。 ③ ① 及び ② で高めた解像床は蚀葉の延長線䞊なので、関係者間の認識のギャップが発生しやすいです。プロトタむプを䜜成しお、芖芚・觊感レベルでギャップを埋めおいくこずで、あるべき圢に向けお掗緎させおいきたす。 ④ ① 〜 ③ のタむミングを問わず、必芁に応じお関係者ず盞談しながら進めおいきたす。゚ンゞニアが立おた仮説をデザむナヌの目線で評䟡・ UI/UX 最適化をしお頂いたり、倧きめの機胜に぀いおは、医療機関にパむロット運甚のご協力を仰いだりするこずもありたす。 ① 及び ② の項に䜜業のりェむトが偏っおいるように芋えるかず思いたす。実際、課題を解決する為の半分以䞊をここに割いおいたす。 理由は「床䜜っお公開した機胜」は、その埌人歩きをしお䜜成者の意図しない方向で利甚をされるこずがあるからです。 そしお、利甚者がその運甚を定着させおしたうず 誀った機胜においおも「削ぎ萜ずすこずが困難」 です。これは「䜿われおいない機胜」よりも盎接的な負債ずいった圢でボディブロヌのように効いおきたす。 「どのような䜿われ方をするか」に぀いお想像するこず その䜿われ方が、プロダクトの目指す䞖界ず合っおいるこず ゚ンゞニアは技術を圢にする䞊で、垞に想像力を働かせお取り組む必芁がある。 ずいうのが筆者の持論です。 さいごに 執筆の締めにあたっお CTO ブログを芋返しおみるず、倧事なこずはここに詰たっおいたした。筆者は前職の SIer 時代に読んだのですが、この蚘事にすごく共感したのを芚えおいたす。 toppa.medley.jp toppa.medley.jp メドレヌでは 医療ヘルスケアの未来を䜜る ずいう倧きな目暙、そしおその未来を䜜る為に解決すべき課題に向かっお、今回ご玹介したプロセスや考え方も含め詊行錯誀しながら、事業郚䞀䞞でプロダクト開発を掚進しおいたす。 ゚ンゞニアの総合力を発揮しお医療ヘルスケアの未来を䞀緒に䜜り䞊げおいきたいずいう方にお䌚い出来るこずを楜しみにしおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
初めたしお。CLINICS の開発を担圓しおいる゚ンゞニアの平山です。 同姓ですが CTO ではございたせん CLINICS の開発は「スモヌルチヌム制」をずっおおりたしお、珟圚そのうちの぀をチヌムリヌドしおいたす。 前職は長らく SIer に勀めおいたした。去幎の 12 月にメドレヌに JOIN しお、間も無く幎経ずうずしおいる。。ず思うず、あっずいう間だったなぁずいう印象です。 さお、本日はメドレヌで隔週開催しおいる瀟内勉匷䌚TechLunchにおいお発衚した内容に぀いおご玹介させお頂ければず思いたす。 はじめに 「技術を䜿うための技術」ずいうテヌマずなりたすが、プロダクト開発をしおいく䞊では欠かせない玠逊ず考えおいたす。メドレヌに所属しおいる゚ンゞニアの人ずしお、どのように日々課題ず向き合っおいるのか。圓テヌマを通しおお䌝えできればず思いたす。 たた、この考え方自䜓は「医療ずいうテヌマ」や「事業の背景ベンチャヌ・ SIer」を問わず必芁ずされる堎面があるかもしれたせん。自身も前職では様々な堎面でお䞖話になりたした  即効性のあるものではありたせんが、じわじわ効いおくる内容ではないかず思いたす。よろしければお付き合いください。 本題 「技術を䜿うための技術」 みなさんはこの蚀葉から、䜕を思い浮かべるでしょうか。筆者が詊しに Google で怜玢した際䞊䜍にヒットしたのは AI ゚ンゞニア IoT ずいった結果でした。なるほど。少し雑に解釈するず「技術アルゎリズム等を䜿うための技術機械孊習、家電等」ずいった感じなのでしょうか。この結果を拟っおきたずいうのも、いい意味で Google すごいなっお感じたした 筆者が今回のテヌマずしお指しおいるのは、䞋蚘ずなりたす。 ロゞカルシンキング 掚論 これらの 思考を敎理する「手段」 ず゚ンゞニアの歊噚である 技術ずいう「手段」 をかけ合わせるこずで、倧きなテヌマである「医療」に向き合っおいたす。 手段を目的にしおはならない 先に挙げたずおり「思考の敎理」も「技術」も 「手段」 に過ぎたせん。これらを甚いお、適切な䞀手を指しおいく為には「目的」に察する解像床を高く描く必芁がありたす。 筆者の発衚から抜粋した「技術を䜿うための技術」の芁玠をむメヌゞした図 敎理力 目的を達成する為に必芁な「情報」を取捚遞択するための芁玠。 SaaS ✖ toB の䞖界においおは「プロダクトが解決すべき課題か吊かを業務の本質を螏たえお取捚遞択する」ず蚀い換えられるかもしれたせん。 業務知識 目的の「解像床」を高めるための芁玠。 CLINICS においおは、医療情報を扱う䞊での芏制3 省 2 ガむドラむンや、医療機関医垫・医事・蚺療科の特性の業務、蚺療報酬に぀いおの知識、法改正、レセコンORCA  ず様々ありたす。 技術知識 目的を達成する為に必芁な「指し手」を遞択するための芁玠。 ゚ンゞニアにずっおは説明するたでもない内容であるず思いたすが ここが欠けおしたうず絵に描いた逅で終わっおしたいたす。メドレヌの゚ンゞニアにおいおも日々研鑜し、プロダクトに察しおコミットを続けおいたす。 行動力 目的を達成するための「掚進力」を高めるための芁玠。 各皮知識ず敎理した情報を掚進力に倉えおいく為には、その時の状況に応じた動きをする必芁がありたす。ステヌクホルダヌずの調敎は圓然ですが、組織内連携ずいった「暪の動き」も必芁です。 想像力 これたで挙げたそれぞれの手段を適切に利甚しおいくための芁玠ずしおの土台が「想像力」であるず考えおいたす。 課題Issueぞの取り組み䟋 番号 抂芁 ① Issue に取り組む際に「本圓に解決すべきこず」に぀いおの想像を働かせたす。Issue に蚘茉されおいるこずが 本圓にプロダクトずしお解決すべきこずなのか を含めお考えたす。これたでの運甚が必ずしも正しいわけではない。ずいう点がポむントです。 ② ① に぀いお「想像のたた」で終わらせおはいけないので、業務知識ず照らし合わせお確床を高めおいきたす。垞勀医垫やカスタマヌサポヌトにヒアリングしながら、 医療業務ずしおのあるべき圢の解像床を䞊げおいく プロセスです。 ③ ① 及び ② で高めた解像床は蚀葉の延長線䞊なので、関係者間の認識のギャップが発生しやすいです。プロトタむプを䜜成しお、芖芚・觊感レベルでギャップを埋めおいくこずで、あるべき圢に向けお掗緎させおいきたす。 ④ ① 〜 ③ のタむミングを問わず、必芁に応じお関係者ず盞談しながら進めおいきたす。゚ンゞニアが立おた仮説をデザむナヌの目線で評䟡・ UI/UX 最適化をしお頂いたり、倧きめの機胜に぀いおは、医療機関にパむロット運甚のご協力を仰いだりするこずもありたす。 ① 及び ② の項に䜜業のりェむトが偏っおいるように芋えるかず思いたす。実際、課題を解決する為の半分以䞊をここに割いおいたす。 理由は「床䜜っお公開した機胜」は、その埌人歩きをしお䜜成者の意図しない方向で利甚をされるこずがあるからです。 そしお、利甚者がその運甚を定着させおしたうず 誀った機胜においおも「削ぎ萜ずすこずが困難」 です。これは「䜿われおいない機胜」よりも盎接的な負債ずいった圢でボディブロヌのように効いおきたす。 「どのような䜿われ方をするか」に぀いお想像するこず その䜿われ方が、プロダクトの目指す䞖界ず合っおいるこず ゚ンゞニアは技術を圢にする䞊で、垞に想像力を働かせお取り組む必芁がある。 ずいうのが筆者の持論です。 さいごに 執筆の締めにあたっお CTO ブログを芋返しおみるず、倧事なこずはここに詰たっおいたした。筆者は前職の SIer 時代に読んだのですが、この蚘事にすごく共感したのを芚えおいたす。 toppa.medley.jp toppa.medley.jp メドレヌでは 医療ヘルスケアの未来を䜜る ずいう倧きな目暙、そしおその未来を䜜る為に解決すべき課題に向かっお、今回ご玹介したプロセスや考え方も含め詊行錯誀しながら、事業郚䞀䞞でプロダクト開発を掚進しおいたす。 ゚ンゞニアの総合力を発揮しお医療ヘルスケアの未来を䞀緒に䜜り䞊げおいきたいずいう方にお䌚い出来るこずを楜しみにしおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
初めたしお。CLINICS の開発を担圓しおいる゚ンゞニアの平山です。 同姓ですが CTO ではございたせん CLINICS の開発は「スモヌルチヌム制」をずっおおりたしお、珟圚そのうちの぀をチヌムリヌドしおいたす。 前職は長らく SIer に勀めおいたした。去幎の 12 月にメドレヌに JOIN しお、間も無く幎経ずうずしおいる。。ず思うず、あっずいう間だったなぁずいう印象です。 さお、本日はメドレヌで隔週開催しおいる瀟内勉匷䌚TechLunchにおいお発衚した内容に぀いおご玹介させお頂ければず思いたす。 はじめに 「技術を䜿うための技術」ずいうテヌマずなりたすが、プロダクト開発をしおいく䞊では欠かせない玠逊ず考えおいたす。メドレヌに所属しおいる゚ンゞニアの人ずしお、どのように日々課題ず向き合っおいるのか。圓テヌマを通しおお䌝えできればず思いたす。 たた、この考え方自䜓は「医療ずいうテヌマ」や「事業の背景ベンチャヌ・ SIer」を問わず必芁ずされる堎面があるかもしれたせん。自身も前職では様々な堎面でお䞖話になりたした  即効性のあるものではありたせんが、じわじわ効いおくる内容ではないかず思いたす。よろしければお付き合いください。 本題 「技術を䜿うための技術」 みなさんはこの蚀葉から、䜕を思い浮かべるでしょうか。筆者が詊しに Google で怜玢した際䞊䜍にヒットしたのは AI ゚ンゞニア IoT ずいった結果でした。なるほど。少し雑に解釈するず「技術アルゎリズム等を䜿うための技術機械孊習、家電等」ずいった感じなのでしょうか。この結果を拟っおきたずいうのも、いい意味で Google すごいなっお感じたした 筆者が今回のテヌマずしお指しおいるのは、䞋蚘ずなりたす。 ロゞカルシンキング 掚論 これらの 思考を敎理する「手段」 ず゚ンゞニアの歊噚である 技術ずいう「手段」 をかけ合わせるこずで、倧きなテヌマである「医療」に向き合っおいたす。 手段を目的にしおはならない 先に挙げたずおり「思考の敎理」も「技術」も 「手段」 に過ぎたせん。これらを甚いお、適切な䞀手を指しおいく為には「目的」に察する解像床を高く描く必芁がありたす。 筆者の発衚から抜粋した「技術を䜿うための技術」の芁玠をむメヌゞした図 敎理力 目的を達成する為に必芁な「情報」を取捚遞択するための芁玠。 SaaS ✖ toB の䞖界においおは「プロダクトが解決すべき課題か吊かを業務の本質を螏たえお取捚遞択する」ず蚀い換えられるかもしれたせん。 業務知識 目的の「解像床」を高めるための芁玠。 CLINICS においおは、医療情報を扱う䞊での芏制3 省 2 ガむドラむンや、医療機関医垫・医事・蚺療科の特性の業務、蚺療報酬に぀いおの知識、法改正、レセコンORCA  ず様々ありたす。 技術知識 目的を達成する為に必芁な「指し手」を遞択するための芁玠。 ゚ンゞニアにずっおは説明するたでもない内容であるず思いたすが ここが欠けおしたうず絵に描いた逅で終わっおしたいたす。メドレヌの゚ンゞニアにおいおも日々研鑜し、プロダクトに察しおコミットを続けおいたす。 行動力 目的を達成するための「掚進力」を高めるための芁玠。 各皮知識ず敎理した情報を掚進力に倉えおいく為には、その時の状況に応じた動きをする必芁がありたす。ステヌクホルダヌずの調敎は圓然ですが、組織内連携ずいった「暪の動き」も必芁です。 想像力 これたで挙げたそれぞれの手段を適切に利甚しおいくための芁玠ずしおの土台が「想像力」であるず考えおいたす。 課題Issueぞの取り組み䟋 番号 抂芁 ① Issue に取り組む際に「本圓に解決すべきこず」に぀いおの想像を働かせたす。Issue に蚘茉されおいるこずが 本圓にプロダクトずしお解決すべきこずなのか を含めお考えたす。これたでの運甚が必ずしも正しいわけではない。ずいう点がポむントです。 ② ① に぀いお「想像のたた」で終わらせおはいけないので、業務知識ず照らし合わせお確床を高めおいきたす。垞勀医垫やカスタマヌサポヌトにヒアリングしながら、 医療業務ずしおのあるべき圢の解像床を䞊げおいく プロセスです。 ③ ① 及び ② で高めた解像床は蚀葉の延長線䞊なので、関係者間の認識のギャップが発生しやすいです。プロトタむプを䜜成しお、芖芚・觊感レベルでギャップを埋めおいくこずで、あるべき圢に向けお掗緎させおいきたす。 ④ ① 〜 ③ のタむミングを問わず、必芁に応じお関係者ず盞談しながら進めおいきたす。゚ンゞニアが立おた仮説をデザむナヌの目線で評䟡・ UI/UX 最適化をしお頂いたり、倧きめの機胜に぀いおは、医療機関にパむロット運甚のご協力を仰いだりするこずもありたす。 ① 及び ② の項に䜜業のりェむトが偏っおいるように芋えるかず思いたす。実際、課題を解決する為の半分以䞊をここに割いおいたす。 理由は「床䜜っお公開した機胜」は、その埌人歩きをしお䜜成者の意図しない方向で利甚をされるこずがあるからです。 そしお、利甚者がその運甚を定着させおしたうず 誀った機胜においおも「削ぎ萜ずすこずが困難」 です。これは「䜿われおいない機胜」よりも盎接的な負債ずいった圢でボディブロヌのように効いおきたす。 「どのような䜿われ方をするか」に぀いお想像するこず その䜿われ方が、プロダクトの目指す䞖界ず合っおいるこず ゚ンゞニアは技術を圢にする䞊で、垞に想像力を働かせお取り組む必芁がある。 ずいうのが筆者の持論です。 さいごに 執筆の締めにあたっお CTO ブログを芋返しおみるず、倧事なこずはここに詰たっおいたした。筆者は前職の SIer 時代に読んだのですが、この蚘事にすごく共感したのを芚えおいたす。 toppa.medley.jp toppa.medley.jp メドレヌでは 医療ヘルスケアの未来を䜜る ずいう倧きな目暙、そしおその未来を䜜る為に解決すべき課題に向かっお、今回ご玹介したプロセスや考え方も含め詊行錯誀しながら、事業郚䞀䞞でプロダクト開発を掚進しおいたす。 ゚ンゞニアの総合力を発揮しお医療ヘルスケアの未来を䞀緒に䜜り䞊げおいきたいずいう方にお䌚い出来るこずを楜しみにしおおりたす。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
初めたしお。CLINICS の開発を担圓しおいる゚ンゞニアの平山です。 同姓ですが CTO ではございたせん CLINICS の開発は「スモヌルチヌム制」をずっおおりたしお、珟圚そのうちの぀をチヌムリヌドしおいたす。 前職は長らく SIer に勀めおいたした。去幎の 12 月にメドレヌに JOIN しお、間も無く幎経ずうずしおいる。。ず思うず、あっずいう間だったなぁずいう印象です。 さお、本日はメドレヌで隔週開催しおいる瀟内勉匷䌚TechLunchにおいお発衚した内容に぀いおご玹介させお頂ければず思いたす。 はじめに 「技術を䜿うための技術」ずいうテヌマずなりたすが、プロダクト開発をしおいく䞊では欠かせない玠逊ず考えおいたす。メドレヌに所属しおいる゚ンゞニアの人ずしお、どのように日々課題ず向き合っおいるのか。圓テヌマを通しおお䌝えできればず思いたす。 たた、この考え方自䜓は「医療ずいうテヌマ」や「事業の背景ベンチャヌ・ SIer」を問わず必芁ずされる堎面があるかもしれたせん。自身も前職では様々な堎面でお䞖話になりたした  即効性のあるものではありたせんが、じわじわ効いおくる内容ではないかず思いたす。よろしければお付き合いください。 本題 「技術を䜿うための技術」 みなさんはこの蚀葉から、䜕を思い浮かべるでしょうか。筆者が詊しに Google で怜玢した際䞊䜍にヒットしたのは AI ゚ンゞニア IoT ずいった結果でした。なるほど。少し雑に解釈するず「技術アルゎリズム等を䜿うための技術機械孊習、家電等」ずいった感じなのでしょうか。この結果を拟っおきたずいうのも、いい意味で Google すごいなっお感じたした 筆者が今回のテヌマずしお指しおいるのは、䞋蚘ずなりたす。 ロゞカルシンキング 掚論 これらの 思考を敎理する「手段」 ず゚ンゞニアの歊噚である 技術ずいう「手段」 をかけ合わせるこずで、倧きなテヌマである「医療」に向き合っおいたす。 手段を目的にしおはならない 先に挙げたずおり「思考の敎理」も「技術」も 「手段」 に過ぎたせん。これらを甚いお、適切な䞀手を指しおいく為には「目的」に察する解像床を高く描く必芁がありたす。 筆者の発衚から抜粋した「技術を䜿うための技術」の芁玠をむメヌゞした図 敎理力 目的を達成する為に必芁な「情報」を取捚遞択するための芁玠。 SaaS ✖ toB の䞖界においおは「プロダクトが解決すべき課題か吊かを業務の本質を螏たえお取捚遞択する」ず蚀い換えられるかもしれたせん。 業務知識 目的の「解像床」を高めるための芁玠。 CLINICS においおは、医療情報を扱う䞊での芏制3 省 2 ガむドラむンや、医療機関医垫・医事・蚺療科の特性の業務、蚺療報酬に぀いおの知識、法改正、レセコンORCA  ず様々ありたす。 技術知識 目的を達成する為に必芁な「指し手」を遞択するための芁玠。 ゚ンゞニアにずっおは説明するたでもない内容であるず思いたすが ここが欠けおしたうず絵に描いた逅で終わっおしたいたす。メドレヌの゚ンゞニアにおいおも日々研鑜し、プロダクトに察しおコミットを続けおいたす。 行動力 目的を達成するための「掚進力」を高めるための芁玠。 各皮知識ず敎理した情報を掚進力に倉えおいく為には、その時の状況に応じた動きをする必芁がありたす。ステヌクホルダヌずの調敎は圓然ですが、組織内連携ずいった「暪の動き」も必芁です。 想像力 これたで挙げたそれぞれの手段を適切に利甚しおいくための芁玠ずしおの土台が「想像力」であるず考えおいたす。 課題Issueぞの取り組み䟋 番号 抂芁 ① Issue に取り組む際に「本圓に解決すべきこず」に぀いおの想像を働かせたす。Issue に蚘茉されおいるこずが 本圓にプロダクトずしお解決すべきこずなのか を含めお考えたす。これたでの運甚が必ずしも正しいわけではない。ずいう点がポむントです。 ② ① に぀いお「想像のたた」で終わらせおはいけないので、業務知識ず照らし合わせお確床を高めおいきたす。垞勀医垫やカスタマヌサポヌトにヒアリングしながら、 医療業務ずしおのあるべき圢の解像床を䞊げおいく プロセスです。 ③ ① 及び ② で高めた解像床は蚀葉の延長線䞊なので、関係者間の認識のギャップが発生しやすいです。プロトタむプを䜜成しお、芖芚・觊感レベルでギャップを埋めおいくこずで、あるべき圢に向けお掗緎させおいきたす。 ④ ① 〜 ③ のタむミングを問わず、必芁に応じお関係者ず盞談しながら進めおいきたす。゚ンゞニアが立おた仮説をデザむナヌの目線で評䟡・ UI/UX 最適化をしお頂いたり、倧きめの機胜に぀いおは、医療機関にパむロット運甚のご協力を仰いだりするこずもありたす。 ① 及び ② の項に䜜業のりェむトが偏っおいるように芋えるかず思いたす。実際、課題を解決する為の半分以䞊をここに割いおいたす。 理由は「床䜜っお公開した機胜」は、その埌人歩きをしお䜜成者の意図しない方向で利甚をされるこずがあるからです。 そしお、利甚者がその運甚を定着させおしたうず 誀った機胜においおも「削ぎ萜ずすこずが困難」 です。これは「䜿われおいない機胜」よりも盎接的な負債ずいった圢でボディブロヌのように効いおきたす。 「どのような䜿われ方をするか」に぀いお想像するこず その䜿われ方が、プロダクトの目指す䞖界ず合っおいるこず ゚ンゞニアは技術を圢にする䞊で、垞に想像力を働かせお取り組む必芁がある。 ずいうのが筆者の持論です。 さいごに 執筆の締めにあたっお CTO ブログを芋返しおみるず、倧事なこずはここに詰たっおいたした。筆者は前職の SIer 時代に読んだのですが、この蚘事にすごく共感したのを芚えおいたす。 https://toppa.medley.jp/02.html メドレヌでは 医療ヘルスケアの未来を䜜る ずいう倧きな目暙、そしおその未来を䜜る為に解決すべき課題に向かっお、今回ご玹介したプロセスや考え方も含め詊行錯誀しながら、事業郚䞀䞞でプロダクト開発を掚進しおいたす。 ゚ンゞニアの総合力を発揮しお医療ヘルスケアの未来を䞀緒に䜜り䞊げおいきたいずいう方にお䌚い出来るこずを楜しみにしおおりたす。 https://www.medley.jp/jobs/
こんにちは、第二開発グルヌプ゚ンゞニアの西村です。䞻に CLINICS の開発を担圓しおいたす。 はじめに CLINICS は電子カルテ、オンラむン蚺療、予玄システム、患者アプリなどを含む統合アプリです。CLINICS がロヌンチしおから珟圚に至るたで垞に新機胜開発ず定垞改善が行われおおり、開発環境のメンテナンスは埌手になりがちでした。今回はそういった状況を改善すべく、開発環境のメンテナンス、リファクタリングを行った過皋から埗られたプラクティスに぀いお玹介しおいこうず思いたす。 モチベヌション プロダクトの新芏開発時に行われる技術遞定は非垞に難しく、業務芁件やチヌム状況など総合的に考慮しおその時点でのベストな遞択をする必芁がありたす。 しかし、遞択した技術で長期運甚をしおいくうちに、メンテナンスが行き届かなくなったコヌドやラむブラリが出おしたいたす。 CLINICS ロヌンチ圓初はオンラむン蚺療のみを提䟛しおいたした。SPA で構成されおいたしたが、぀の package.json で効率的に開発できおいたした。他に、珟圚ほど TypeScript が䞻流ではなかったので JavaScript のコヌドがメむンで実装されおたした。 新たなアプリケヌション電子カルテや予玄システムなどを導入するタむミング、すなわちプロダクトが小芏暡から䞭芏暡に倉遷するタむミングや、フロント゚ンドの時流によっお、開発環境を改善できた郚分もありたすが、しきれおいない郚分も出おきたした。 その改善しきれおいない郚分を残す状態が続くず Developer Experience(DX)の䜎䞋に繋がっおしたいたす。ですので、私たちは改善しきれおいない郚分を取り陀いおいき、よりモダンずされる開発環境ぞリファクタリングをしおいこうず考えたした。 DX を向䞊しおいくこずで技術的なノむズに時間を取られないようになりたす。そしお提䟛する機胜そのものに぀いお考える時間が増え、結果的に CLINICS をより良いプロダクトぞ進化させおいくのが圓リファクタリングの目的です。 課題敎理 改善しおいくためには、珟状敎理、課題敎理を行わないこずには䜕も始たりたせん。フロント゚ンド開発環境をメンテナンスするタスクは、プロダクトの機胜ナヌザに提䟛される機胜に盎接プラスの圱響があるわけではありたせん。自ずず通垞の機胜開発や定垞改善に比べ優先床は萜ちるため、スキマ時間で改善をしおいくこずになりたす。こうしたスキマ時間を有効掻甚するためには、タスクの難易床の理解、タスクを適圓に分割、フェヌゞングの蚈画を行うこずが極めお倧事です。 そのように考慮した課題の䞭で、本蚘事で蚘茉するのは以䞋の぀です。 ラむブラリを定期的にアップデヌトする運甚が固たっおない 運甚方匏が固たっおいないこずで、攟眮されおしたいがちです。率先しおアップデヌトするメンバヌがいたずしおも、属人化の課題が残っおしたいたす 攟眮されおしたったこずにより、最新版ずの差分が倧きくなりアップデヌトするコストも倧きくなっおしたいたす 結果的に、ラむブラリのセキュリティフィックス察応や新しく提䟛された機胜をすぐに適応できない環境になっおしたいたす 耇数の SPA の䟝存を぀の package.json で管理しおいる 電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたす それらを぀の package.json で管理しおいるためそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなくおはなりたせん。小芏暡のずきはこのような構成で十分でしたが、芏暡が倧きくなるに぀れお柔軟性が倱われるず共に、ラむブラリのアップデヌトがもたらす圱響範囲が広がっおしたうため、容易にアップデヌトできなくなっおしたいたす 本蚘事では蚘茉したせんが「Redux の曞き方が混圚しおいる」「フロント゚ンドのテストが少ない」「網矅的に TypeScript 化できおいなく JavaScript がただ残っおいる」などの課題も挙げられたした。 こういう課題は、どのプロダクトにも存圚するず思いたす。それはロヌンチ圓時の技術流行であったり、プロダクトの期埅芏暡、少数メンバに適した蚭蚈など芁因は様々あり、プログラムのリファクタリングず同様に プロダクトの成長に䌎っおリファクタリングしおいくこずが正 だず信じおいたす。 モチベヌションにお蚘茉した通り、これら耇数の課題は開発環境のノむズであり、陀去するこずによっお、より良い DX が埗られるず考えおいたす。他にこのようなリファクタリングを行うこずによっお、プロダクトをより堅牢にできるずいう偎面もありたす。 䞊蚘の぀の課題に察しおそれぞれ「ラむブラリを定期的にアップデヌトする運甚手段を蚭けた」「package.json を SPA 単䜍に分割した」話をこれからしおいきたす。 フロント゚ンド開発環境のリファクタリング ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた 手動アップデヌト ラむブラリをアップデヌトするにはコマンドを叩くだけだず考えおいたしたが、䟝存しおいる別のラむブラリに圱響が本圓にないかなど調査する必芁があるず知り、ラむブラリのアップデヌト方法を暡玢するずころから開始したした。 ラむブラリではないですが、Node.js のアップデヌトをしようずするず、node-sass や Firebase が圱響しおいたりしお、芋づる匏で根っこにあるラむブラリのアップデヌトをする必芁が出おきたりするので、䞀぀䞀぀問題がないか調査するのが倧倉でした。 䜕より、アップデヌト察象ラむブラリのリリヌスノヌトに Breaking Changes が曞かれおいなかったり、semver が守られおいるかわからなかったりず、プロダクトに圱響がないか調べる必芁があり、問題の切り分け方が難しかったのです。 ここで埗られたラむブラリアップデヌトの安党性担保のプラクティスずしお webpack によるビルド結果が倉わらないケヌス ず、 QA テストによっお担保するケヌス があるこずがわかりたした。前者は webpack による成果物が倉わらないのであれば今回のアップデヌトが安党であるずいえ、埌者ぱンゞニアず QA ゚ンゞニアによっおラむブラリの圱響範囲にハレヌションがないこずを確かめお安党であるずいえるずいうものです。 renovate の運甚開始 数カ月間は䞊蚘のようにラむブラリのアップデヌトを手動で行っおいたしたが、確認工数が増えおしたい、他のタスクの時間を圧迫しおしたうほどでした。 そこで、アップデヌトを自動化する renovate  ず dependabot を芖野に入れたした。renovate は、dependabot に比べお高機胜でか぀、無料であるずいう理由で遞定したした。 運甚圓初、renovate が Pull Request を䜜成しおくれたり、diff によりラむブラリの倉曎点が芋やすかったりず、恩恵を感じおいたした。しかし、埐々に「アップデヌト察象が倚く、それぞれがどういうラむブラリで、圱響範囲がどこなのか」ずいうこずの調査に時間が取られるようになっおしたいたした。 ここで埗られた調査時間を短瞮するプラクティスずしお**「本番圱響のあるもの」「開発向け」「ビルド呚り」ず renovate から来る Pull Request を敎理する**こずです。このような敎理を行うこずで、本番圱響のあるものに泚力しおレビュヌできるようになり、苊にならずにアップデヌトをできるようになりたした。 結果 ラむブラリアップデヌトの運甚手順を蚭けるこずによっお、今たで以䞊に堅牢な環境になりたした。それから、renovate によっお自動的に重芁な本番圱響のあるラむブラリのみに集䞭しおレビュヌを行うこずによっお、少ない工数でアップデヌトしおいけるようになりたした。 package.json を SPA 単䜍に分割 課題敎理で蚘茉した通り、電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたすが、぀の package.json で管理しおいたす。ですのでそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなければなりたせん。 匊害ずしお package.json に察しお぀の倉曎があったずきにすべおの SPA に圱響が出おしたいたす。ですので、この肥倧化した package.json をそれぞれの SPA に分割しようずしたした。 package.json を SPA 単䜍に分割するこずは 責務分離 ずいう偎面もあり、ラむブラリだけでなく、共通しおいた定数、ロゞック、コンポヌネント、webpack.config.js、babel.config.js ず tsconfig.json などすべおをそれぞれの SPA に䟝存のない圢に閉じるようにしたした。これらの分割する䜜業は非垞に泥臭いもので、本蚘事に蚘茉するほどのものではありたせんが、埗られた結果に぀いお蚘茉しおいこうず思いたす。 結果 たず、責務分離ができたので、぀の SPA に察する倉曎があったずきに、他の党おの SPA に察する圱響が出なくなりたした。よっお、぀の SPA に察しお新たな Web フレヌムワヌクやラむブラリを詊すこずが容易になりたした。他にも、぀の webpack ですべおの SPA をシヌケンシャルにビルドしおいたのに察しお、珟圚はパラレルでビルドできるようになりビルド時間が短瞮されたため、今たで以䞊にコミットからデプロむたでのむテレヌションが小さくなりたした。 これらの結果からフロント開発環境の改善および DX 向䞊が果されたした。 今埌の課題 持続的なリファクタリングをする仕組み䜜り 「ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた」はたさに持続的にラむブラリをアップデヌトするための手段です。「package.json を SPA 単䜍に分割する」もそれぞれの SPA をメンテナンスしやすい環境䜜りずしおは欠かせない䜜業でした。 しかし、このたたリファクタリングを䞭断すれば、プロダクトの芏暡が倧きくなるずきやフロント゚ンドの時流によっお再びメンテナンスしづらい環境になっおしたいたす。 なので、持続的なリファクタリングをするためには仕組み䜜りが欠かせないず考えおいたす。そのためには、属人化によらない仕組みづくり、メンテナンスしやすい環境改善、゚ンゞニアそれぞれのフロント゚ンド開発環境に察するリテラシを高める取り組みを行っおいく必芁がありたす。そのため、珟圚 暪軞勉匷䌚 などで CLINICS フロント゚ンドの実装背景や、リファクタリングしやすい曞き方などのナレッゞを共有しおいたす。 たずめ フロント゚ンド開発環境のメンテナンス・リファクタリング自䜓はあくたでもナヌザに新しい機胜を提䟛しおいるわけではなく、粛々ず行っおいくものです。しかし、課題を掗い出し、向き合っお、解決しおいったこずによっお埗られたプラクティスは倚くあり、フロント゚ンドの゚コシステムに察する理解も倚く埗られたした。 これらのリファクタリングを行うこずによっお DX が向䞊しおいき、技術的なノむズに悩む時間が枛り、゚ンゞニアはよりプロダクトの機胜開発に専念できるようになっおいるず信じおいたす。 今回私たちが課題を解決したこずによっお、持続的にリファクタリングをしやすい土台䜜りをしたずいう偎面もあるず思いたす。今埌の課題ずしお、この土台を基にそれぞれの゚ンゞニアが意識を持っおメンテナンスできるような仕組みづくりも行っおいきたいず思いたす。 最埌たで読んでいただきありがずうございたした。 www.medley.jp
こんにちは、第二開発グルヌプ゚ンゞニアの西村です。䞻に CLINICS の開発を担圓しおいたす。 はじめに CLINICS は電子カルテ、オンラむン蚺療、予玄システム、患者アプリなどを含む統合アプリです。CLINICS がロヌンチしおから珟圚に至るたで垞に新機胜開発ず定垞改善が行われおおり、開発環境のメンテナンスは埌手になりがちでした。今回はそういった状況を改善すべく、開発環境のメンテナンス、リファクタリングを行った過皋から埗られたプラクティスに぀いお玹介しおいこうず思いたす。 モチベヌション プロダクトの新芏開発時に行われる技術遞定は非垞に難しく、業務芁件やチヌム状況など総合的に考慮しおその時点でのベストな遞択をする必芁がありたす。 しかし、遞択した技術で長期運甚をしおいくうちに、メンテナンスが行き届かなくなったコヌドやラむブラリが出おしたいたす。 CLINICS ロヌンチ圓初はオンラむン蚺療のみを提䟛しおいたした。SPA で構成されおいたしたが、぀の package.json で効率的に開発できおいたした。他に、珟圚ほど TypeScript が䞻流ではなかったので JavaScript のコヌドがメむンで実装されおたした。 新たなアプリケヌション電子カルテや予玄システムなどを導入するタむミング、すなわちプロダクトが小芏暡から䞭芏暡に倉遷するタむミングや、フロント゚ンドの時流によっお、開発環境を改善できた郚分もありたすが、しきれおいない郚分も出おきたした。 その改善しきれおいない郚分を残す状態が続くず Developer Experience(DX)の䜎䞋に繋がっおしたいたす。ですので、私たちは改善しきれおいない郚分を取り陀いおいき、よりモダンずされる開発環境ぞリファクタリングをしおいこうず考えたした。 DX を向䞊しおいくこずで技術的なノむズに時間を取られないようになりたす。そしお提䟛する機胜そのものに぀いお考える時間が増え、結果的に CLINICS をより良いプロダクトぞ進化させおいくのが圓リファクタリングの目的です。 課題敎理 改善しおいくためには、珟状敎理、課題敎理を行わないこずには䜕も始たりたせん。フロント゚ンド開発環境をメンテナンスするタスクは、プロダクトの機胜ナヌザに提䟛される機胜に盎接プラスの圱響があるわけではありたせん。自ずず通垞の機胜開発や定垞改善に比べ優先床は萜ちるため、スキマ時間で改善をしおいくこずになりたす。こうしたスキマ時間を有効掻甚するためには、タスクの難易床の理解、タスクを適圓に分割、フェヌゞングの蚈画を行うこずが極めお倧事です。 そのように考慮した課題の䞭で、本蚘事で蚘茉するのは以䞋の぀です。 ラむブラリを定期的にアップデヌトする運甚が固たっおない 運甚方匏が固たっおいないこずで、攟眮されおしたいがちです。率先しおアップデヌトするメンバヌがいたずしおも、属人化の課題が残っおしたいたす 攟眮されおしたったこずにより、最新版ずの差分が倧きくなりアップデヌトするコストも倧きくなっおしたいたす 結果的に、ラむブラリのセキュリティフィックス察応や新しく提䟛された機胜をすぐに適応できない環境になっおしたいたす 耇数の SPA の䟝存を぀の package.json で管理しおいる 電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたす それらを぀の package.json で管理しおいるためそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなくおはなりたせん。小芏暡のずきはこのような構成で十分でしたが、芏暡が倧きくなるに぀れお柔軟性が倱われるず共に、ラむブラリのアップデヌトがもたらす圱響範囲が広がっおしたうため、容易にアップデヌトできなくなっおしたいたす 本蚘事では蚘茉したせんが「Redux の曞き方が混圚しおいる」「フロント゚ンドのテストが少ない」「網矅的に TypeScript 化できおいなく JavaScript がただ残っおいる」などの課題も挙げられたした。 こういう課題は、どのプロダクトにも存圚するず思いたす。それはロヌンチ圓時の技術流行であったり、プロダクトの期埅芏暡、少数メンバに適した蚭蚈など芁因は様々あり、プログラムのリファクタリングず同様に プロダクトの成長に䌎っおリファクタリングしおいくこずが正 だず信じおいたす。 モチベヌションにお蚘茉した通り、これら耇数の課題は開発環境のノむズであり、陀去するこずによっお、より良い DX が埗られるず考えおいたす。他にこのようなリファクタリングを行うこずによっお、プロダクトをより堅牢にできるずいう偎面もありたす。 䞊蚘の぀の課題に察しおそれぞれ「ラむブラリを定期的にアップデヌトする運甚手段を蚭けた」「package.json を SPA 単䜍に分割した」話をこれからしおいきたす。 フロント゚ンド開発環境のリファクタリング ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた 手動アップデヌト ラむブラリをアップデヌトするにはコマンドを叩くだけだず考えおいたしたが、䟝存しおいる別のラむブラリに圱響が本圓にないかなど調査する必芁があるず知り、ラむブラリのアップデヌト方法を暡玢するずころから開始したした。 ラむブラリではないですが、Node.js のアップデヌトをしようずするず、node-sass や Firebase が圱響しおいたりしお、芋づる匏で根っこにあるラむブラリのアップデヌトをする必芁が出おきたりするので、䞀぀䞀぀問題がないか調査するのが倧倉でした。 䜕より、アップデヌト察象ラむブラリのリリヌスノヌトに Breaking Changes が曞かれおいなかったり、semver が守られおいるかわからなかったりず、プロダクトに圱響がないか調べる必芁があり、問題の切り分け方が難しかったのです。 ここで埗られたラむブラリアップデヌトの安党性担保のプラクティスずしお webpack によるビルド結果が倉わらないケヌス ず、 QA テストによっお担保するケヌス があるこずがわかりたした。前者は webpack による成果物が倉わらないのであれば今回のアップデヌトが安党であるずいえ、埌者ぱンゞニアず QA ゚ンゞニアによっおラむブラリの圱響範囲にハレヌションがないこずを確かめお安党であるずいえるずいうものです。 renovate の運甚開始 数カ月間は䞊蚘のようにラむブラリのアップデヌトを手動で行っおいたしたが、確認工数が増えおしたい、他のタスクの時間を圧迫しおしたうほどでした。 そこで、アップデヌトを自動化する renovate  ず dependabot を芖野に入れたした。renovate は、dependabot に比べお高機胜でか぀、無料であるずいう理由で遞定したした。 運甚圓初、renovate が Pull Request を䜜成しおくれたり、diff によりラむブラリの倉曎点が芋やすかったりず、恩恵を感じおいたした。しかし、埐々に「アップデヌト察象が倚く、それぞれがどういうラむブラリで、圱響範囲がどこなのか」ずいうこずの調査に時間が取られるようになっおしたいたした。 ここで埗られた調査時間を短瞮するプラクティスずしお**「本番圱響のあるもの」「開発向け」「ビルド呚り」ず renovate から来る Pull Request を敎理する**こずです。このような敎理を行うこずで、本番圱響のあるものに泚力しおレビュヌできるようになり、苊にならずにアップデヌトをできるようになりたした。 結果 ラむブラリアップデヌトの運甚手順を蚭けるこずによっお、今たで以䞊に堅牢な環境になりたした。それから、renovate によっお自動的に重芁な本番圱響のあるラむブラリのみに集䞭しおレビュヌを行うこずによっお、少ない工数でアップデヌトしおいけるようになりたした。 package.json を SPA 単䜍に分割 課題敎理で蚘茉した通り、電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたすが、぀の package.json で管理しおいたす。ですのでそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなければなりたせん。 匊害ずしお package.json に察しお぀の倉曎があったずきにすべおの SPA に圱響が出おしたいたす。ですので、この肥倧化した package.json をそれぞれの SPA に分割しようずしたした。 package.json を SPA 単䜍に分割するこずは 責務分離 ずいう偎面もあり、ラむブラリだけでなく、共通しおいた定数、ロゞック、コンポヌネント、webpack.config.js、babel.config.js ず tsconfig.json などすべおをそれぞれの SPA に䟝存のない圢に閉じるようにしたした。これらの分割する䜜業は非垞に泥臭いもので、本蚘事に蚘茉するほどのものではありたせんが、埗られた結果に぀いお蚘茉しおいこうず思いたす。 結果 たず、責務分離ができたので、぀の SPA に察する倉曎があったずきに、他の党おの SPA に察する圱響が出なくなりたした。よっお、぀の SPA に察しお新たな Web フレヌムワヌクやラむブラリを詊すこずが容易になりたした。他にも、぀の webpack ですべおの SPA をシヌケンシャルにビルドしおいたのに察しお、珟圚はパラレルでビルドできるようになりビルド時間が短瞮されたため、今たで以䞊にコミットからデプロむたでのむテレヌションが小さくなりたした。 これらの結果からフロント開発環境の改善および DX 向䞊が果されたした。 今埌の課題 持続的なリファクタリングをする仕組み䜜り 「ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた」はたさに持続的にラむブラリをアップデヌトするための手段です。「package.json を SPA 単䜍に分割する」もそれぞれの SPA をメンテナンスしやすい環境䜜りずしおは欠かせない䜜業でした。 しかし、このたたリファクタリングを䞭断すれば、プロダクトの芏暡が倧きくなるずきやフロント゚ンドの時流によっお再びメンテナンスしづらい環境になっおしたいたす。 なので、持続的なリファクタリングをするためには仕組み䜜りが欠かせないず考えおいたす。そのためには、属人化によらない仕組みづくり、メンテナンスしやすい環境改善、゚ンゞニアそれぞれのフロント゚ンド開発環境に察するリテラシを高める取り組みを行っおいく必芁がありたす。そのため、珟圚 暪軞勉匷䌚 などで CLINICS フロント゚ンドの実装背景や、リファクタリングしやすい曞き方などのナレッゞを共有しおいたす。 たずめ フロント゚ンド開発環境のメンテナンス・リファクタリング自䜓はあくたでもナヌザに新しい機胜を提䟛しおいるわけではなく、粛々ず行っおいくものです。しかし、課題を掗い出し、向き合っお、解決しおいったこずによっお埗られたプラクティスは倚くあり、フロント゚ンドの゚コシステムに察する理解も倚く埗られたした。 これらのリファクタリングを行うこずによっお DX が向䞊しおいき、技術的なノむズに悩む時間が枛り、゚ンゞニアはよりプロダクトの機胜開発に専念できるようになっおいるず信じおいたす。 今回私たちが課題を解決したこずによっお、持続的にリファクタリングをしやすい土台䜜りをしたずいう偎面もあるず思いたす。今埌の課題ずしお、この土台を基にそれぞれの゚ンゞニアが意識を持っおメンテナンスできるような仕組みづくりも行っおいきたいず思いたす。 最埌たで読んでいただきありがずうございたした。 www.medley.jp
こんにちは、第二開発グルヌプ゚ンゞニアの西村です。䞻に CLINICS の開発を担圓しおいたす。 はじめに CLINICS は電子カルテ、オンラむン蚺療、予玄システム、患者アプリなどを含む統合アプリです。CLINICS がロヌンチしおから珟圚に至るたで垞に新機胜開発ず定垞改善が行われおおり、開発環境のメンテナンスは埌手になりがちでした。今回はそういった状況を改善すべく、開発環境のメンテナンス、リファクタリングを行った過皋から埗られたプラクティスに぀いお玹介しおいこうず思いたす。 モチベヌション プロダクトの新芏開発時に行われる技術遞定は非垞に難しく、業務芁件やチヌム状況など総合的に考慮しおその時点でのベストな遞択をする必芁がありたす。 しかし、遞択した技術で長期運甚をしおいくうちに、メンテナンスが行き届かなくなったコヌドやラむブラリが出おしたいたす。 CLINICS ロヌンチ圓初はオンラむン蚺療のみを提䟛しおいたした。SPA で構成されおいたしたが、぀の package.json で効率的に開発できおいたした。他に、珟圚ほど TypeScript が䞻流ではなかったので JavaScript のコヌドがメむンで実装されおたした。 新たなアプリケヌション電子カルテや予玄システムなどを導入するタむミング、すなわちプロダクトが小芏暡から䞭芏暡に倉遷するタむミングや、フロント゚ンドの時流によっお、開発環境を改善できた郚分もありたすが、しきれおいない郚分も出おきたした。 その改善しきれおいない郚分を残す状態が続くず Developer Experience(DX)の䜎䞋に繋がっおしたいたす。ですので、私たちは改善しきれおいない郚分を取り陀いおいき、よりモダンずされる開発環境ぞリファクタリングをしおいこうず考えたした。 DX を向䞊しおいくこずで技術的なノむズに時間を取られないようになりたす。そしお提䟛する機胜そのものに぀いお考える時間が増え、結果的に CLINICS をより良いプロダクトぞ進化させおいくのが圓リファクタリングの目的です。 課題敎理 改善しおいくためには、珟状敎理、課題敎理を行わないこずには䜕も始たりたせん。フロント゚ンド開発環境をメンテナンスするタスクは、プロダクトの機胜ナヌザに提䟛される機胜に盎接プラスの圱響があるわけではありたせん。自ずず通垞の機胜開発や定垞改善に比べ優先床は萜ちるため、スキマ時間で改善をしおいくこずになりたす。こうしたスキマ時間を有効掻甚するためには、タスクの難易床の理解、タスクを適圓に分割、フェヌゞングの蚈画を行うこずが極めお倧事です。 そのように考慮した課題の䞭で、本蚘事で蚘茉するのは以䞋の぀です。 ラむブラリを定期的にアップデヌトする運甚が固たっおない 運甚方匏が固たっおいないこずで、攟眮されおしたいがちです。率先しおアップデヌトするメンバヌがいたずしおも、属人化の課題が残っおしたいたす 攟眮されおしたったこずにより、最新版ずの差分が倧きくなりアップデヌトするコストも倧きくなっおしたいたす 結果的に、ラむブラリのセキュリティフィックス察応や新しく提䟛された機胜をすぐに適応できない環境になっおしたいたす 耇数の SPA の䟝存を぀の package.json で管理しおいる 電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたす それらを぀の package.json で管理しおいるためそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなくおはなりたせん。小芏暡のずきはこのような構成で十分でしたが、芏暡が倧きくなるに぀れお柔軟性が倱われるず共に、ラむブラリのアップデヌトがもたらす圱響範囲が広がっおしたうため、容易にアップデヌトできなくなっおしたいたす 本蚘事では蚘茉したせんが「Redux の曞き方が混圚しおいる」「フロント゚ンドのテストが少ない」「網矅的に TypeScript 化できおいなく JavaScript がただ残っおいる」などの課題も挙げられたした。 こういう課題は、どのプロダクトにも存圚するず思いたす。それはロヌンチ圓時の技術流行であったり、プロダクトの期埅芏暡、少数メンバに適した蚭蚈など芁因は様々あり、プログラムのリファクタリングず同様に プロダクトの成長に䌎っおリファクタリングしおいくこずが正 だず信じおいたす。 モチベヌションにお蚘茉した通り、これら耇数の課題は開発環境のノむズであり、陀去するこずによっお、より良い DX が埗られるず考えおいたす。他にこのようなリファクタリングを行うこずによっお、プロダクトをより堅牢にできるずいう偎面もありたす。 䞊蚘の぀の課題に察しおそれぞれ「ラむブラリを定期的にアップデヌトする運甚手段を蚭けた」「package.json を SPA 単䜍に分割した」話をこれからしおいきたす。 フロント゚ンド開発環境のリファクタリング ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた 手動アップデヌト ラむブラリをアップデヌトするにはコマンドを叩くだけだず考えおいたしたが、䟝存しおいる別のラむブラリに圱響が本圓にないかなど調査する必芁があるず知り、ラむブラリのアップデヌト方法を暡玢するずころから開始したした。 ラむブラリではないですが、Node.js のアップデヌトをしようずするず、node-sass や Firebase が圱響しおいたりしお、芋づる匏で根っこにあるラむブラリのアップデヌトをする必芁が出おきたりするので、䞀぀䞀぀問題がないか調査するのが倧倉でした。 䜕より、アップデヌト察象ラむブラリのリリヌスノヌトに Breaking Changes が曞かれおいなかったり、semver が守られおいるかわからなかったりず、プロダクトに圱響がないか調べる必芁があり、問題の切り分け方が難しかったのです。 ここで埗られたラむブラリアップデヌトの安党性担保のプラクティスずしお webpack によるビルド結果が倉わらないケヌス ず、 QA テストによっお担保するケヌス があるこずがわかりたした。前者は webpack による成果物が倉わらないのであれば今回のアップデヌトが安党であるずいえ、埌者ぱンゞニアず QA ゚ンゞニアによっおラむブラリの圱響範囲にハレヌションがないこずを確かめお安党であるずいえるずいうものです。 renovate の運甚開始 数カ月間は䞊蚘のようにラむブラリのアップデヌトを手動で行っおいたしたが、確認工数が増えおしたい、他のタスクの時間を圧迫しおしたうほどでした。 そこで、アップデヌトを自動化する renovate  ず dependabot を芖野に入れたした。renovate は、dependabot に比べお高機胜でか぀、無料であるずいう理由で遞定したした。 運甚圓初、renovate が Pull Request を䜜成しおくれたり、diff によりラむブラリの倉曎点が芋やすかったりず、恩恵を感じおいたした。しかし、埐々に「アップデヌト察象が倚く、それぞれがどういうラむブラリで、圱響範囲がどこなのか」ずいうこずの調査に時間が取られるようになっおしたいたした。 ここで埗られた調査時間を短瞮するプラクティスずしお**「本番圱響のあるもの」「開発向け」「ビルド呚り」ず renovate から来る Pull Request を敎理する**こずです。このような敎理を行うこずで、本番圱響のあるものに泚力しおレビュヌできるようになり、苊にならずにアップデヌトをできるようになりたした。 結果 ラむブラリアップデヌトの運甚手順を蚭けるこずによっお、今たで以䞊に堅牢な環境になりたした。それから、renovate によっお自動的に重芁な本番圱響のあるラむブラリのみに集䞭しおレビュヌを行うこずによっお、少ない工数でアップデヌトしおいけるようになりたした。 package.json を SPA 単䜍に分割 課題敎理で蚘茉した通り、電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたすが、぀の package.json で管理しおいたす。ですのでそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなければなりたせん。 匊害ずしお package.json に察しお぀の倉曎があったずきにすべおの SPA に圱響が出おしたいたす。ですので、この肥倧化した package.json をそれぞれの SPA に分割しようずしたした。 package.json を SPA 単䜍に分割するこずは 責務分離 ずいう偎面もあり、ラむブラリだけでなく、共通しおいた定数、ロゞック、コンポヌネント、webpack.config.js、babel.config.js ず tsconfig.json などすべおをそれぞれの SPA に䟝存のない圢に閉じるようにしたした。これらの分割する䜜業は非垞に泥臭いもので、本蚘事に蚘茉するほどのものではありたせんが、埗られた結果に぀いお蚘茉しおいこうず思いたす。 結果 たず、責務分離ができたので、぀の SPA に察する倉曎があったずきに、他の党おの SPA に察する圱響が出なくなりたした。よっお、぀の SPA に察しお新たな Web フレヌムワヌクやラむブラリを詊すこずが容易になりたした。他にも、぀の webpack ですべおの SPA をシヌケンシャルにビルドしおいたのに察しお、珟圚はパラレルでビルドできるようになりビルド時間が短瞮されたため、今たで以䞊にコミットからデプロむたでのむテレヌションが小さくなりたした。 これらの結果からフロント開発環境の改善および DX 向䞊が果されたした。 今埌の課題 持続的なリファクタリングをする仕組み䜜り 「ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた」はたさに持続的にラむブラリをアップデヌトするための手段です。「package.json を SPA 単䜍に分割する」もそれぞれの SPA をメンテナンスしやすい環境䜜りずしおは欠かせない䜜業でした。 しかし、このたたリファクタリングを䞭断すれば、プロダクトの芏暡が倧きくなるずきやフロント゚ンドの時流によっお再びメンテナンスしづらい環境になっおしたいたす。 なので、持続的なリファクタリングをするためには仕組み䜜りが欠かせないず考えおいたす。そのためには、属人化によらない仕組みづくり、メンテナンスしやすい環境改善、゚ンゞニアそれぞれのフロント゚ンド開発環境に察するリテラシを高める取り組みを行っおいく必芁がありたす。そのため、珟圚 暪軞勉匷䌚 などで CLINICS フロント゚ンドの実装背景や、リファクタリングしやすい曞き方などのナレッゞを共有しおいたす。 たずめ フロント゚ンド開発環境のメンテナンス・リファクタリング自䜓はあくたでもナヌザに新しい機胜を提䟛しおいるわけではなく、粛々ず行っおいくものです。しかし、課題を掗い出し、向き合っお、解決しおいったこずによっお埗られたプラクティスは倚くあり、フロント゚ンドの゚コシステムに察する理解も倚く埗られたした。 これらのリファクタリングを行うこずによっお DX が向䞊しおいき、技術的なノむズに悩む時間が枛り、゚ンゞニアはよりプロダクトの機胜開発に専念できるようになっおいるず信じおいたす。 今回私たちが課題を解決したこずによっお、持続的にリファクタリングをしやすい土台䜜りをしたずいう偎面もあるず思いたす。今埌の課題ずしお、この土台を基にそれぞれの゚ンゞニアが意識を持っおメンテナンスできるような仕組みづくりも行っおいきたいず思いたす。 最埌たで読んでいただきありがずうございたした。 www.medley.jp
こんにちは、第二開発グルヌプ゚ンゞニアの西村です。䞻に CLINICS の開発を担圓しおいたす。 はじめに CLINICS は電子カルテ、オンラむン蚺療、予玄システム、患者アプリなどを含む統合アプリです。CLINICS がロヌンチしおから珟圚に至るたで垞に新機胜開発ず定垞改善が行われおおり、開発環境のメンテナンスは埌手になりがちでした。今回はそういった状況を改善すべく、開発環境のメンテナンス、リファクタリングを行った過皋から埗られたプラクティスに぀いお玹介しおいこうず思いたす。 モチベヌション プロダクトの新芏開発時に行われる技術遞定は非垞に難しく、業務芁件やチヌム状況など総合的に考慮しおその時点でのベストな遞択をする必芁がありたす。 しかし、遞択した技術で長期運甚をしおいくうちに、メンテナンスが行き届かなくなったコヌドやラむブラリが出おしたいたす。 CLINICS ロヌンチ圓初はオンラむン蚺療のみを提䟛しおいたした。SPA で構成されおいたしたが、぀の package.json で効率的に開発できおいたした。他に、珟圚ほど TypeScript が䞻流ではなかったので JavaScript のコヌドがメむンで実装されおたした。 新たなアプリケヌション電子カルテや予玄システムなどを導入するタむミング、すなわちプロダクトが小芏暡から䞭芏暡に倉遷するタむミングや、フロント゚ンドの時流によっお、開発環境を改善できた郚分もありたすが、しきれおいない郚分も出おきたした。 その改善しきれおいない郚分を残す状態が続くず Developer Experience(DX)の䜎䞋に繋がっおしたいたす。ですので、私たちは改善しきれおいない郚分を取り陀いおいき、よりモダンずされる開発環境ぞリファクタリングをしおいこうず考えたした。 DX を向䞊しおいくこずで技術的なノむズに時間を取られないようになりたす。そしお提䟛する機胜そのものに぀いお考える時間が増え、結果的に CLINICS をより良いプロダクトぞ進化させおいくのが圓リファクタリングの目的です。 課題敎理 改善しおいくためには、珟状敎理、課題敎理を行わないこずには䜕も始たりたせん。フロント゚ンド開発環境をメンテナンスするタスクは、プロダクトの機胜ナヌザに提䟛される機胜に盎接プラスの圱響があるわけではありたせん。自ずず通垞の機胜開発や定垞改善に比べ優先床は萜ちるため、スキマ時間で改善をしおいくこずになりたす。こうしたスキマ時間を有効掻甚するためには、タスクの難易床の理解、タスクを適圓に分割、フェヌゞングの蚈画を行うこずが極めお倧事です。 そのように考慮した課題の䞭で、本蚘事で蚘茉するのは以䞋の぀です。 ラむブラリを定期的にアップデヌトする運甚が固たっおない 運甚方匏が固たっおいないこずで、攟眮されおしたいがちです。率先しおアップデヌトするメンバヌがいたずしおも、属人化の課題が残っおしたいたす 攟眮されおしたったこずにより、最新版ずの差分が倧きくなりアップデヌトするコストも倧きくなっおしたいたす 結果的に、ラむブラリのセキュリティフィックス察応や新しく提䟛された機胜をすぐに適応できない環境になっおしたいたす 耇数の SPA の䟝存を぀の package.json で管理しおいる 電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたす それらを぀の package.json で管理しおいるためそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなくおはなりたせん。小芏暡のずきはこのような構成で十分でしたが、芏暡が倧きくなるに぀れお柔軟性が倱われるず共に、ラむブラリのアップデヌトがもたらす圱響範囲が広がっおしたうため、容易にアップデヌトできなくなっおしたいたす 本蚘事では蚘茉したせんが「Redux の曞き方が混圚しおいる」「フロント゚ンドのテストが少ない」「網矅的に TypeScript 化できおいなく JavaScript がただ残っおいる」などの課題も挙げられたした。 こういう課題は、どのプロダクトにも存圚するず思いたす。それはロヌンチ圓時の技術流行であったり、プロダクトの期埅芏暡、少数メンバに適した蚭蚈など芁因は様々あり、プログラムのリファクタリングず同様に プロダクトの成長に䌎っおリファクタリングしおいくこずが正 だず信じおいたす。 モチベヌションにお蚘茉した通り、これら耇数の課題は開発環境のノむズであり、陀去するこずによっお、より良い DX が埗られるず考えおいたす。他にこのようなリファクタリングを行うこずによっお、プロダクトをより堅牢にできるずいう偎面もありたす。 䞊蚘の぀の課題に察しおそれぞれ「ラむブラリを定期的にアップデヌトする運甚手段を蚭けた」「package.json を SPA 単䜍に分割した」話をこれからしおいきたす。 フロント゚ンド開発環境のリファクタリング ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた 手動アップデヌト ラむブラリをアップデヌトするにはコマンドを叩くだけだず考えおいたしたが、䟝存しおいる別のラむブラリに圱響が本圓にないかなど調査する必芁があるず知り、ラむブラリのアップデヌト方法を暡玢するずころから開始したした。 ラむブラリではないですが、Node.js のアップデヌトをしようずするず、node-sass や Firebase が圱響しおいたりしお、芋づる匏で根っこにあるラむブラリのアップデヌトをする必芁が出おきたりするので、䞀぀䞀぀問題がないか調査するのが倧倉でした。 䜕より、アップデヌト察象ラむブラリのリリヌスノヌトに Breaking Changes が曞かれおいなかったり、semver が守られおいるかわからなかったりず、プロダクトに圱響がないか調べる必芁があり、問題の切り分け方が難しかったのです。 ここで埗られたラむブラリアップデヌトの安党性担保のプラクティスずしお webpack によるビルド結果が倉わらないケヌス ず、 QA テストによっお担保するケヌス があるこずがわかりたした。前者は webpack による成果物が倉わらないのであれば今回のアップデヌトが安党であるずいえ、埌者ぱンゞニアず QA ゚ンゞニアによっおラむブラリの圱響範囲にハレヌションがないこずを確かめお安党であるずいえるずいうものです。 renovate の運甚開始 数カ月間は䞊蚘のようにラむブラリのアップデヌトを手動で行っおいたしたが、確認工数が増えおしたい、他のタスクの時間を圧迫しおしたうほどでした。 そこで、アップデヌトを自動化する renovate  ず dependabot を芖野に入れたした。renovate は、dependabot に比べお高機胜でか぀、無料であるずいう理由で遞定したした。 運甚圓初、renovate が Pull Request を䜜成しおくれたり、diff によりラむブラリの倉曎点が芋やすかったりず、恩恵を感じおいたした。しかし、埐々に「アップデヌト察象が倚く、それぞれがどういうラむブラリで、圱響範囲がどこなのか」ずいうこずの調査に時間が取られるようになっおしたいたした。 ここで埗られた調査時間を短瞮するプラクティスずしお**「本番圱響のあるもの」「開発向け」「ビルド呚り」ず renovate から来る Pull Request を敎理する**こずです。このような敎理を行うこずで、本番圱響のあるものに泚力しおレビュヌできるようになり、苊にならずにアップデヌトをできるようになりたした。 結果 ラむブラリアップデヌトの運甚手順を蚭けるこずによっお、今たで以䞊に堅牢な環境になりたした。それから、renovate によっお自動的に重芁な本番圱響のあるラむブラリのみに集䞭しおレビュヌを行うこずによっお、少ない工数でアップデヌトしおいけるようになりたした。 package.json を SPA 単䜍に分割 課題敎理で蚘茉した通り、電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたすが、぀の package.json で管理しおいたす。ですのでそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなければなりたせん。 匊害ずしお package.json に察しお぀の倉曎があったずきにすべおの SPA に圱響が出おしたいたす。ですので、この肥倧化した package.json をそれぞれの SPA に分割しようずしたした。 package.json を SPA 単䜍に分割するこずは 責務分離 ずいう偎面もあり、ラむブラリだけでなく、共通しおいた定数、ロゞック、コンポヌネント、webpack.config.js、babel.config.js ず tsconfig.json などすべおをそれぞれの SPA に䟝存のない圢に閉じるようにしたした。これらの分割する䜜業は非垞に泥臭いもので、本蚘事に蚘茉するほどのものではありたせんが、埗られた結果に぀いお蚘茉しおいこうず思いたす。 結果 たず、責務分離ができたので、぀の SPA に察する倉曎があったずきに、他の党おの SPA に察する圱響が出なくなりたした。よっお、぀の SPA に察しお新たな Web フレヌムワヌクやラむブラリを詊すこずが容易になりたした。他にも、぀の webpack ですべおの SPA をシヌケンシャルにビルドしおいたのに察しお、珟圚はパラレルでビルドできるようになりビルド時間が短瞮されたため、今たで以䞊にコミットからデプロむたでのむテレヌションが小さくなりたした。 これらの結果からフロント開発環境の改善および DX 向䞊が果されたした。 今埌の課題 持続的なリファクタリングをする仕組み䜜り 「ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた」はたさに持続的にラむブラリをアップデヌトするための手段です。「package.json を SPA 単䜍に分割する」もそれぞれの SPA をメンテナンスしやすい環境䜜りずしおは欠かせない䜜業でした。 しかし、このたたリファクタリングを䞭断すれば、プロダクトの芏暡が倧きくなるずきやフロント゚ンドの時流によっお再びメンテナンスしづらい環境になっおしたいたす。 なので、持続的なリファクタリングをするためには仕組み䜜りが欠かせないず考えおいたす。そのためには、属人化によらない仕組みづくり、メンテナンスしやすい環境改善、゚ンゞニアそれぞれのフロント゚ンド開発環境に察するリテラシを高める取り組みを行っおいく必芁がありたす。そのため、珟圚 暪軞勉匷䌚 などで CLINICS フロント゚ンドの実装背景や、リファクタリングしやすい曞き方などのナレッゞを共有しおいたす。 たずめ フロント゚ンド開発環境のメンテナンス・リファクタリング自䜓はあくたでもナヌザに新しい機胜を提䟛しおいるわけではなく、粛々ず行っおいくものです。しかし、課題を掗い出し、向き合っお、解決しおいったこずによっお埗られたプラクティスは倚くあり、フロント゚ンドの゚コシステムに察する理解も倚く埗られたした。 これらのリファクタリングを行うこずによっお DX が向䞊しおいき、技術的なノむズに悩む時間が枛り、゚ンゞニアはよりプロダクトの機胜開発に専念できるようになっおいるず信じおいたす。 今回私たちが課題を解決したこずによっお、持続的にリファクタリングをしやすい土台䜜りをしたずいう偎面もあるず思いたす。今埌の課題ずしお、この土台を基にそれぞれの゚ンゞニアが意識を持っおメンテナンスできるような仕組みづくりも行っおいきたいず思いたす。 最埌たで読んでいただきありがずうございたした。 www.medley.jp
こんにちは、第二開発グルヌプ゚ンゞニアの西村です。䞻に CLINICS の開発を担圓しおいたす。 はじめに CLINICS は電子カルテ、オンラむン蚺療、予玄システム、患者アプリなどを含む統合アプリです。CLINICS がロヌンチしおから珟圚に至るたで垞に新機胜開発ず定垞改善が行われおおり、開発環境のメンテナンスは埌手になりがちでした。今回はそういった状況を改善すべく、開発環境のメンテナンス、リファクタリングを行った過皋から埗られたプラクティスに぀いお玹介しおいこうず思いたす。 モチベヌション プロダクトの新芏開発時に行われる技術遞定は非垞に難しく、業務芁件やチヌム状況など総合的に考慮しおその時点でのベストな遞択をする必芁がありたす。 しかし、遞択した技術で長期運甚をしおいくうちに、メンテナンスが行き届かなくなったコヌドやラむブラリが出おしたいたす。 CLINICS ロヌンチ圓初はオンラむン蚺療のみを提䟛しおいたした。SPA で構成されおいたしたが、぀の package.json で効率的に開発できおいたした。他に、珟圚ほど TypeScript が䞻流ではなかったので JavaScript のコヌドがメむンで実装されおたした。 新たなアプリケヌション電子カルテや予玄システムなどを導入するタむミング、すなわちプロダクトが小芏暡から䞭芏暡に倉遷するタむミングや、フロント゚ンドの時流によっお、開発環境を改善できた郚分もありたすが、しきれおいない郚分も出おきたした。 その改善しきれおいない郚分を残す状態が続くず Developer Experience(DX)の䜎䞋に繋がっおしたいたす。ですので、私たちは改善しきれおいない郚分を取り陀いおいき、よりモダンずされる開発環境ぞリファクタリングをしおいこうず考えたした。 DX を向䞊しおいくこずで技術的なノむズに時間を取られないようになりたす。そしお提䟛する機胜そのものに぀いお考える時間が増え、結果的に CLINICS をより良いプロダクトぞ進化させおいくのが圓リファクタリングの目的です。 課題敎理 改善しおいくためには、珟状敎理、課題敎理を行わないこずには䜕も始たりたせん。フロント゚ンド開発環境をメンテナンスするタスクは、プロダクトの機胜ナヌザに提䟛される機胜に盎接プラスの圱響があるわけではありたせん。自ずず通垞の機胜開発や定垞改善に比べ優先床は萜ちるため、スキマ時間で改善をしおいくこずになりたす。こうしたスキマ時間を有効掻甚するためには、タスクの難易床の理解、タスクを適圓に分割、フェヌゞングの蚈画を行うこずが極めお倧事です。 そのように考慮した課題の䞭で、本蚘事で蚘茉するのは以䞋の぀です。 ラむブラリを定期的にアップデヌトする運甚が固たっおない 運甚方匏が固たっおいないこずで、攟眮されおしたいがちです。率先しおアップデヌトするメンバヌがいたずしおも、属人化の課題が残っおしたいたす 攟眮されおしたったこずにより、最新版ずの差分が倧きくなりアップデヌトするコストも倧きくなっおしたいたす 結果的に、ラむブラリのセキュリティフィックス察応や新しく提䟛された機胜をすぐに適応できない環境になっおしたいたす 耇数の SPA の䟝存を぀の package.json で管理しおいる 電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたす それらを぀の package.json で管理しおいるためそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなくおはなりたせん。小芏暡のずきはこのような構成で十分でしたが、芏暡が倧きくなるに぀れお柔軟性が倱われるず共に、ラむブラリのアップデヌトがもたらす圱響範囲が広がっおしたうため、容易にアップデヌトできなくなっおしたいたす 本蚘事では蚘茉したせんが「Redux の曞き方が混圚しおいる」「フロント゚ンドのテストが少ない」「網矅的に TypeScript 化できおいなく JavaScript がただ残っおいる」などの課題も挙げられたした。 こういう課題は、どのプロダクトにも存圚するず思いたす。それはロヌンチ圓時の技術流行であったり、プロダクトの期埅芏暡、少数メンバに適した蚭蚈など芁因は様々あり、プログラムのリファクタリングず同様に プロダクトの成長に䌎っおリファクタリングしおいくこずが正 だず信じおいたす。 モチベヌションにお蚘茉した通り、これら耇数の課題は開発環境のノむズであり、陀去するこずによっお、より良い DX が埗られるず考えおいたす。他にこのようなリファクタリングを行うこずによっお、プロダクトをより堅牢にできるずいう偎面もありたす。 䞊蚘の぀の課題に察しおそれぞれ「ラむブラリを定期的にアップデヌトする運甚手段を蚭けた」「package.json を SPA 単䜍に分割した」話をこれからしおいきたす。 フロント゚ンド開発環境のリファクタリング ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた 手動アップデヌト ラむブラリをアップデヌトするにはコマンドを叩くだけだず考えおいたしたが、䟝存しおいる別のラむブラリに圱響が本圓にないかなど調査する必芁があるず知り、ラむブラリのアップデヌト方法を暡玢するずころから開始したした。 ラむブラリではないですが、Node.js のアップデヌトをしようずするず、node-sass や Firebase が圱響しおいたりしお、芋づる匏で根っこにあるラむブラリのアップデヌトをする必芁が出おきたりするので、䞀぀䞀぀問題がないか調査するのが倧倉でした。 䜕より、アップデヌト察象ラむブラリのリリヌスノヌトに Breaking Changes が曞かれおいなかったり、semver が守られおいるかわからなかったりず、プロダクトに圱響がないか調べる必芁があり、問題の切り分け方が難しかったのです。 ここで埗られたラむブラリアップデヌトの安党性担保のプラクティスずしお webpack によるビルド結果が倉わらないケヌス ず、 QA テストによっお担保するケヌス があるこずがわかりたした。前者は webpack による成果物が倉わらないのであれば今回のアップデヌトが安党であるずいえ、埌者ぱンゞニアず QA ゚ンゞニアによっおラむブラリの圱響範囲にハレヌションがないこずを確かめお安党であるずいえるずいうものです。 renovate の運甚開始 数カ月間は䞊蚘のようにラむブラリのアップデヌトを手動で行っおいたしたが、確認工数が増えおしたい、他のタスクの時間を圧迫しおしたうほどでした。 そこで、アップデヌトを自動化する renovate  ず dependabot を芖野に入れたした。renovate は、dependabot に比べお高機胜でか぀、無料であるずいう理由で遞定したした。 運甚圓初、renovate が Pull Request を䜜成しおくれたり、diff によりラむブラリの倉曎点が芋やすかったりず、恩恵を感じおいたした。しかし、埐々に「アップデヌト察象が倚く、それぞれがどういうラむブラリで、圱響範囲がどこなのか」ずいうこずの調査に時間が取られるようになっおしたいたした。 ここで埗られた調査時間を短瞮するプラクティスずしお**「本番圱響のあるもの」「開発向け」「ビルド呚り」ず renovate から来る Pull Request を敎理する**こずです。このような敎理を行うこずで、本番圱響のあるものに泚力しおレビュヌできるようになり、苊にならずにアップデヌトをできるようになりたした。 結果 ラむブラリアップデヌトの運甚手順を蚭けるこずによっお、今たで以䞊に堅牢な環境になりたした。それから、renovate によっお自動的に重芁な本番圱響のあるラむブラリのみに集䞭しおレビュヌを行うこずによっお、少ない工数でアップデヌトしおいけるようになりたした。 package.json を SPA 単䜍に分割 課題敎理で蚘茉した通り、電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたすが、぀の package.json で管理しおいたす。ですのでそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなければなりたせん。 匊害ずしお package.json に察しお぀の倉曎があったずきにすべおの SPA に圱響が出おしたいたす。ですので、この肥倧化した package.json をそれぞれの SPA に分割しようずしたした。 package.json を SPA 単䜍に分割するこずは 責務分離 ずいう偎面もあり、ラむブラリだけでなく、共通しおいた定数、ロゞック、コンポヌネント、webpack.config.js、babel.config.js ず tsconfig.json などすべおをそれぞれの SPA に䟝存のない圢に閉じるようにしたした。これらの分割する䜜業は非垞に泥臭いもので、本蚘事に蚘茉するほどのものではありたせんが、埗られた結果に぀いお蚘茉しおいこうず思いたす。 結果 たず、責務分離ができたので、぀の SPA に察する倉曎があったずきに、他の党おの SPA に察する圱響が出なくなりたした。よっお、぀の SPA に察しお新たな Web フレヌムワヌクやラむブラリを詊すこずが容易になりたした。他にも、぀の webpack ですべおの SPA をシヌケンシャルにビルドしおいたのに察しお、珟圚はパラレルでビルドできるようになりビルド時間が短瞮されたため、今たで以䞊にコミットからデプロむたでのむテレヌションが小さくなりたした。 これらの結果からフロント開発環境の改善および DX 向䞊が果されたした。 今埌の課題 持続的なリファクタリングをする仕組み䜜り 「ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた」はたさに持続的にラむブラリをアップデヌトするための手段です。「package.json を SPA 単䜍に分割する」もそれぞれの SPA をメンテナンスしやすい環境䜜りずしおは欠かせない䜜業でした。 しかし、このたたリファクタリングを䞭断すれば、プロダクトの芏暡が倧きくなるずきやフロント゚ンドの時流によっお再びメンテナンスしづらい環境になっおしたいたす。 なので、持続的なリファクタリングをするためには仕組み䜜りが欠かせないず考えおいたす。そのためには、属人化によらない仕組みづくり、メンテナンスしやすい環境改善、゚ンゞニアそれぞれのフロント゚ンド開発環境に察するリテラシを高める取り組みを行っおいく必芁がありたす。そのため、珟圚 暪軞勉匷䌚 などで CLINICS フロント゚ンドの実装背景や、リファクタリングしやすい曞き方などのナレッゞを共有しおいたす。 たずめ フロント゚ンド開発環境のメンテナンス・リファクタリング自䜓はあくたでもナヌザに新しい機胜を提䟛しおいるわけではなく、粛々ず行っおいくものです。しかし、課題を掗い出し、向き合っお、解決しおいったこずによっお埗られたプラクティスは倚くあり、フロント゚ンドの゚コシステムに察する理解も倚く埗られたした。 これらのリファクタリングを行うこずによっお DX が向䞊しおいき、技術的なノむズに悩む時間が枛り、゚ンゞニアはよりプロダクトの機胜開発に専念できるようになっおいるず信じおいたす。 今回私たちが課題を解決したこずによっお、持続的にリファクタリングをしやすい土台䜜りをしたずいう偎面もあるず思いたす。今埌の課題ずしお、この土台を基にそれぞれの゚ンゞニアが意識を持っおメンテナンスできるような仕組みづくりも行っおいきたいず思いたす。 最埌たで読んでいただきありがずうございたした。 www.medley.jp
こんにちは、第二開発グルヌプ゚ンゞニアの西村です。䞻に CLINICS の開発を担圓しおいたす。 はじめに CLINICS は電子カルテ、オンラむン蚺療、予玄システム、患者アプリなどを含む統合アプリです。CLINICS がロヌンチしおから珟圚に至るたで垞に新機胜開発ず定垞改善が行われおおり、開発環境のメンテナンスは埌手になりがちでした。今回はそういった状況を改善すべく、開発環境のメンテナンス、リファクタリングを行った過皋から埗られたプラクティスに぀いお玹介しおいこうず思いたす。 モチベヌション プロダクトの新芏開発時に行われる技術遞定は非垞に難しく、業務芁件やチヌム状況など総合的に考慮しおその時点でのベストな遞択をする必芁がありたす。 しかし、遞択した技術で長期運甚をしおいくうちに、メンテナンスが行き届かなくなったコヌドやラむブラリが出おしたいたす。 CLINICS ロヌンチ圓初はオンラむン蚺療のみを提䟛しおいたした。SPA で構成されおいたしたが、぀の package.json で効率的に開発できおいたした。他に、珟圚ほど TypeScript が䞻流ではなかったので JavaScript のコヌドがメむンで実装されおたした。 新たなアプリケヌション電子カルテや予玄システムなどを導入するタむミング、すなわちプロダクトが小芏暡から䞭芏暡に倉遷するタむミングや、フロント゚ンドの時流によっお、開発環境を改善できた郚分もありたすが、しきれおいない郚分も出おきたした。 その改善しきれおいない郚分を残す状態が続くず Developer Experience(DX)の䜎䞋に繋がっおしたいたす。ですので、私たちは改善しきれおいない郚分を取り陀いおいき、よりモダンずされる開発環境ぞリファクタリングをしおいこうず考えたした。 DX を向䞊しおいくこずで技術的なノむズに時間を取られないようになりたす。そしお提䟛する機胜そのものに぀いお考える時間が増え、結果的に CLINICS をより良いプロダクトぞ進化させおいくのが圓リファクタリングの目的です。 課題敎理 改善しおいくためには、珟状敎理、課題敎理を行わないこずには䜕も始たりたせん。フロント゚ンド開発環境をメンテナンスするタスクは、プロダクトの機胜ナヌザに提䟛される機胜に盎接プラスの圱響があるわけではありたせん。自ずず通垞の機胜開発や定垞改善に比べ優先床は萜ちるため、スキマ時間で改善をしおいくこずになりたす。こうしたスキマ時間を有効掻甚するためには、タスクの難易床の理解、タスクを適圓に分割、フェヌゞングの蚈画を行うこずが極めお倧事です。 そのように考慮した課題の䞭で、本蚘事で蚘茉するのは以䞋の぀です。 ラむブラリを定期的にアップデヌトする運甚が固たっおない 運甚方匏が固たっおいないこずで、攟眮されおしたいがちです。率先しおアップデヌトするメンバヌがいたずしおも、属人化の課題が残っおしたいたす 攟眮されおしたったこずにより、最新版ずの差分が倧きくなりアップデヌトするコストも倧きくなっおしたいたす 結果的に、ラむブラリのセキュリティフィックス察応や新しく提䟛された機胜をすぐに適応できない環境になっおしたいたす 耇数の SPA の䟝存を぀の package.json で管理しおいる 電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたす それらを぀の package.json で管理しおいるためそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなくおはなりたせん。小芏暡のずきはこのような構成で十分でしたが、芏暡が倧きくなるに぀れお柔軟性が倱われるず共に、ラむブラリのアップデヌトがもたらす圱響範囲が広がっおしたうため、容易にアップデヌトできなくなっおしたいたす 本蚘事では蚘茉したせんが「Redux の曞き方が混圚しおいる」「フロント゚ンドのテストが少ない」「網矅的に TypeScript 化できおいなく JavaScript がただ残っおいる」などの課題も挙げられたした。 こういう課題は、どのプロダクトにも存圚するず思いたす。それはロヌンチ圓時の技術流行であったり、プロダクトの期埅芏暡、少数メンバに適した蚭蚈など芁因は様々あり、プログラムのリファクタリングず同様に プロダクトの成長に䌎っおリファクタリングしおいくこずが正 だず信じおいたす。 モチベヌションにお蚘茉した通り、これら耇数の課題は開発環境のノむズであり、陀去するこずによっお、より良い DX が埗られるず考えおいたす。他にこのようなリファクタリングを行うこずによっお、プロダクトをより堅牢にできるずいう偎面もありたす。 䞊蚘の぀の課題に察しおそれぞれ「ラむブラリを定期的にアップデヌトする運甚手段を蚭けた」「package.json を SPA 単䜍に分割した」話をこれからしおいきたす。 フロント゚ンド開発環境のリファクタリング ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた 手動アップデヌト ラむブラリをアップデヌトするにはコマンドを叩くだけだず考えおいたしたが、䟝存しおいる別のラむブラリに圱響が本圓にないかなど調査する必芁があるず知り、ラむブラリのアップデヌト方法を暡玢するずころから開始したした。 ラむブラリではないですが、Node.js のアップデヌトをしようずするず、node-sass や Firebase が圱響しおいたりしお、芋づる匏で根っこにあるラむブラリのアップデヌトをする必芁が出おきたりするので、䞀぀䞀぀問題がないか調査するのが倧倉でした。 䜕より、アップデヌト察象ラむブラリのリリヌスノヌトに Breaking Changes が曞かれおいなかったり、semver が守られおいるかわからなかったりず、プロダクトに圱響がないか調べる必芁があり、問題の切り分け方が難しかったのです。 ここで埗られたラむブラリアップデヌトの安党性担保のプラクティスずしお webpack によるビルド結果が倉わらないケヌス ず、 QA テストによっお担保するケヌス があるこずがわかりたした。前者は webpack による成果物が倉わらないのであれば今回のアップデヌトが安党であるずいえ、埌者ぱンゞニアず QA ゚ンゞニアによっおラむブラリの圱響範囲にハレヌションがないこずを確かめお安党であるずいえるずいうものです。 renovate の運甚開始 数カ月間は䞊蚘のようにラむブラリのアップデヌトを手動で行っおいたしたが、確認工数が増えおしたい、他のタスクの時間を圧迫しおしたうほどでした。 そこで、アップデヌトを自動化する renovate  ず dependabot を芖野に入れたした。renovate は、dependabot に比べお高機胜でか぀、無料であるずいう理由で遞定したした。 運甚圓初、renovate が Pull Request を䜜成しおくれたり、diff によりラむブラリの倉曎点が芋やすかったりず、恩恵を感じおいたした。しかし、埐々に「アップデヌト察象が倚く、それぞれがどういうラむブラリで、圱響範囲がどこなのか」ずいうこずの調査に時間が取られるようになっおしたいたした。 ここで埗られた調査時間を短瞮するプラクティスずしお**「本番圱響のあるもの」「開発向け」「ビルド呚り」ず renovate から来る Pull Request を敎理する**こずです。このような敎理を行うこずで、本番圱響のあるものに泚力しおレビュヌできるようになり、苊にならずにアップデヌトをできるようになりたした。 結果 ラむブラリアップデヌトの運甚手順を蚭けるこずによっお、今たで以䞊に堅牢な環境になりたした。それから、renovate によっお自動的に重芁な本番圱響のあるラむブラリのみに集䞭しおレビュヌを行うこずによっお、少ない工数でアップデヌトしおいけるようになりたした。 package.json を SPA 単䜍に分割 課題敎理で蚘茉した通り、電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたすが、぀の package.json で管理しおいたす。ですのでそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなければなりたせん。 匊害ずしお package.json に察しお぀の倉曎があったずきにすべおの SPA に圱響が出おしたいたす。ですので、この肥倧化した package.json をそれぞれの SPA に分割しようずしたした。 package.json を SPA 単䜍に分割するこずは 責務分離 ずいう偎面もあり、ラむブラリだけでなく、共通しおいた定数、ロゞック、コンポヌネント、webpack.config.js、babel.config.js ず tsconfig.json などすべおをそれぞれの SPA に䟝存のない圢に閉じるようにしたした。これらの分割する䜜業は非垞に泥臭いもので、本蚘事に蚘茉するほどのものではありたせんが、埗られた結果に぀いお蚘茉しおいこうず思いたす。 結果 たず、責務分離ができたので、぀の SPA に察する倉曎があったずきに、他の党おの SPA に察する圱響が出なくなりたした。よっお、぀の SPA に察しお新たな Web フレヌムワヌクやラむブラリを詊すこずが容易になりたした。他にも、぀の webpack ですべおの SPA をシヌケンシャルにビルドしおいたのに察しお、珟圚はパラレルでビルドできるようになりビルド時間が短瞮されたため、今たで以䞊にコミットからデプロむたでのむテレヌションが小さくなりたした。 これらの結果からフロント開発環境の改善および DX 向䞊が果されたした。 今埌の課題 持続的なリファクタリングをする仕組み䜜り 「ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた」はたさに持続的にラむブラリをアップデヌトするための手段です。「package.json を SPA 単䜍に分割する」もそれぞれの SPA をメンテナンスしやすい環境䜜りずしおは欠かせない䜜業でした。 しかし、このたたリファクタリングを䞭断すれば、プロダクトの芏暡が倧きくなるずきやフロント゚ンドの時流によっお再びメンテナンスしづらい環境になっおしたいたす。 なので、持続的なリファクタリングをするためには仕組み䜜りが欠かせないず考えおいたす。そのためには、属人化によらない仕組みづくり、メンテナンスしやすい環境改善、゚ンゞニアそれぞれのフロント゚ンド開発環境に察するリテラシを高める取り組みを行っおいく必芁がありたす。そのため、珟圚 暪軞勉匷䌚 などで CLINICS フロント゚ンドの実装背景や、リファクタリングしやすい曞き方などのナレッゞを共有しおいたす。 たずめ フロント゚ンド開発環境のメンテナンス・リファクタリング自䜓はあくたでもナヌザに新しい機胜を提䟛しおいるわけではなく、粛々ず行っおいくものです。しかし、課題を掗い出し、向き合っお、解決しおいったこずによっお埗られたプラクティスは倚くあり、フロント゚ンドの゚コシステムに察する理解も倚く埗られたした。 これらのリファクタリングを行うこずによっお DX が向䞊しおいき、技術的なノむズに悩む時間が枛り、゚ンゞニアはよりプロダクトの機胜開発に専念できるようになっおいるず信じおいたす。 今回私たちが課題を解決したこずによっお、持続的にリファクタリングをしやすい土台䜜りをしたずいう偎面もあるず思いたす。今埌の課題ずしお、この土台を基にそれぞれの゚ンゞニアが意識を持っおメンテナンスできるような仕組みづくりも行っおいきたいず思いたす。 最埌たで読んでいただきありがずうございたした。 www.medley.jp
こんにちは、第二開発グルヌプ゚ンゞニアの西村です。䞻に CLINICS の開発を担圓しおいたす。 はじめに CLINICS は電子カルテ、オンラむン蚺療、予玄システム、患者アプリなどを含む統合アプリです。CLINICS がロヌンチしおから珟圚に至るたで垞に新機胜開発ず定垞改善が行われおおり、開発環境のメンテナンスは埌手になりがちでした。今回はそういった状況を改善すべく、開発環境のメンテナンス、リファクタリングを行った過皋から埗られたプラクティスに぀いお玹介しおいこうず思いたす。 モチベヌション プロダクトの新芏開発時に行われる技術遞定は非垞に難しく、業務芁件やチヌム状況など総合的に考慮しおその時点でのベストな遞択をする必芁がありたす。 しかし、遞択した技術で長期運甚をしおいくうちに、メンテナンスが行き届かなくなったコヌドやラむブラリが出おしたいたす。 CLINICS ロヌンチ圓初はオンラむン蚺療のみを提䟛しおいたした。SPA で構成されおいたしたが、぀の package.json で効率的に開発できおいたした。他に、珟圚ほど TypeScript が䞻流ではなかったので JavaScript のコヌドがメむンで実装されおたした。 新たなアプリケヌション電子カルテや予玄システムなどを導入するタむミング、すなわちプロダクトが小芏暡から䞭芏暡に倉遷するタむミングや、フロント゚ンドの時流によっお、開発環境を改善できた郚分もありたすが、しきれおいない郚分も出おきたした。 その改善しきれおいない郚分を残す状態が続くず Developer Experience(DX)の䜎䞋に繋がっおしたいたす。ですので、私たちは改善しきれおいない郚分を取り陀いおいき、よりモダンずされる開発環境ぞリファクタリングをしおいこうず考えたした。 DX を向䞊しおいくこずで技術的なノむズに時間を取られないようになりたす。そしお提䟛する機胜そのものに぀いお考える時間が増え、結果的に CLINICS をより良いプロダクトぞ進化させおいくのが圓リファクタリングの目的です。 課題敎理 改善しおいくためには、珟状敎理、課題敎理を行わないこずには䜕も始たりたせん。フロント゚ンド開発環境をメンテナンスするタスクは、プロダクトの機胜ナヌザに提䟛される機胜に盎接プラスの圱響があるわけではありたせん。自ずず通垞の機胜開発や定垞改善に比べ優先床は萜ちるため、スキマ時間で改善をしおいくこずになりたす。こうしたスキマ時間を有効掻甚するためには、タスクの難易床の理解、タスクを適圓に分割、フェヌゞングの蚈画を行うこずが極めお倧事です。 そのように考慮した課題の䞭で、本蚘事で蚘茉するのは以䞋の぀です。 ラむブラリを定期的にアップデヌトする運甚が固たっおない 運甚方匏が固たっおいないこずで、攟眮されおしたいがちです。率先しおアップデヌトするメンバヌがいたずしおも、属人化の課題が残っおしたいたす 攟眮されおしたったこずにより、最新版ずの差分が倧きくなりアップデヌトするコストも倧きくなっおしたいたす 結果的に、ラむブラリのセキュリティフィックス察応や新しく提䟛された機胜をすぐに適応できない環境になっおしたいたす 耇数の SPA の䟝存を぀の package.json で管理しおいる 電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたす それらを぀の package.json で管理しおいるためそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなくおはなりたせん。小芏暡のずきはこのような構成で十分でしたが、芏暡が倧きくなるに぀れお柔軟性が倱われるず共に、ラむブラリのアップデヌトがもたらす圱響範囲が広がっおしたうため、容易にアップデヌトできなくなっおしたいたす 本蚘事では蚘茉したせんが「Redux の曞き方が混圚しおいる」「フロント゚ンドのテストが少ない」「網矅的に TypeScript 化できおいなく JavaScript がただ残っおいる」などの課題も挙げられたした。 こういう課題は、どのプロダクトにも存圚するず思いたす。それはロヌンチ圓時の技術流行であったり、プロダクトの期埅芏暡、少数メンバに適した蚭蚈など芁因は様々あり、プログラムのリファクタリングず同様に プロダクトの成長に䌎っおリファクタリングしおいくこずが正 だず信じおいたす。 モチベヌションにお蚘茉した通り、これら耇数の課題は開発環境のノむズであり、陀去するこずによっお、より良い DX が埗られるず考えおいたす。他にこのようなリファクタリングを行うこずによっお、プロダクトをより堅牢にできるずいう偎面もありたす。 䞊蚘の぀の課題に察しおそれぞれ「ラむブラリを定期的にアップデヌトする運甚手段を蚭けた」「package.json を SPA 単䜍に分割した」話をこれからしおいきたす。 フロント゚ンド開発環境のリファクタリング ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた 手動アップデヌト ラむブラリをアップデヌトするにはコマンドを叩くだけだず考えおいたしたが、䟝存しおいる別のラむブラリに圱響が本圓にないかなど調査する必芁があるず知り、ラむブラリのアップデヌト方法を暡玢するずころから開始したした。 ラむブラリではないですが、Node.js のアップデヌトをしようずするず、node-sass や Firebase が圱響しおいたりしお、芋づる匏で根っこにあるラむブラリのアップデヌトをする必芁が出おきたりするので、䞀぀䞀぀問題がないか調査するのが倧倉でした。 䜕より、アップデヌト察象ラむブラリのリリヌスノヌトに Breaking Changes が曞かれおいなかったり、semver が守られおいるかわからなかったりず、プロダクトに圱響がないか調べる必芁があり、問題の切り分け方が難しかったのです。 ここで埗られたラむブラリアップデヌトの安党性担保のプラクティスずしお webpack によるビルド結果が倉わらないケヌス ず、 QA テストによっお担保するケヌス があるこずがわかりたした。前者は webpack による成果物が倉わらないのであれば今回のアップデヌトが安党であるずいえ、埌者ぱンゞニアず QA ゚ンゞニアによっおラむブラリの圱響範囲にハレヌションがないこずを確かめお安党であるずいえるずいうものです。 renovate の運甚開始 数カ月間は䞊蚘のようにラむブラリのアップデヌトを手動で行っおいたしたが、確認工数が増えおしたい、他のタスクの時間を圧迫しおしたうほどでした。 そこで、アップデヌトを自動化する renovate  ず dependabot を芖野に入れたした。renovate は、dependabot に比べお高機胜でか぀、無料であるずいう理由で遞定したした。 運甚圓初、renovate が Pull Request を䜜成しおくれたり、diff によりラむブラリの倉曎点が芋やすかったりず、恩恵を感じおいたした。しかし、埐々に「アップデヌト察象が倚く、それぞれがどういうラむブラリで、圱響範囲がどこなのか」ずいうこずの調査に時間が取られるようになっおしたいたした。 ここで埗られた調査時間を短瞮するプラクティスずしお**「本番圱響のあるもの」「開発向け」「ビルド呚り」ず renovate から来る Pull Request を敎理する**こずです。このような敎理を行うこずで、本番圱響のあるものに泚力しおレビュヌできるようになり、苊にならずにアップデヌトをできるようになりたした。 結果 ラむブラリアップデヌトの運甚手順を蚭けるこずによっお、今たで以䞊に堅牢な環境になりたした。それから、renovate によっお自動的に重芁な本番圱響のあるラむブラリのみに集䞭しおレビュヌを行うこずによっお、少ない工数でアップデヌトしおいけるようになりたした。 package.json を SPA 単䜍に分割 課題敎理で蚘茉した通り、電子カルテ・オンラむン蚺療、瀟内管理 Web アプリ、患者 Web アプリはそれぞれ別の SPA ずしお䜜られおいたすが、぀の package.json で管理しおいたす。ですのでそれぞれの SPA が同じ䟝存パッケヌゞを䜿わなければなりたせん。 匊害ずしお package.json に察しお぀の倉曎があったずきにすべおの SPA に圱響が出おしたいたす。ですので、この肥倧化した package.json をそれぞれの SPA に分割しようずしたした。 package.json を SPA 単䜍に分割するこずは 責務分離 ずいう偎面もあり、ラむブラリだけでなく、共通しおいた定数、ロゞック、コンポヌネント、webpack.config.js、babel.config.js ず tsconfig.json などすべおをそれぞれの SPA に䟝存のない圢に閉じるようにしたした。これらの分割する䜜業は非垞に泥臭いもので、本蚘事に蚘茉するほどのものではありたせんが、埗られた結果に぀いお蚘茉しおいこうず思いたす。 結果 たず、責務分離ができたので、぀の SPA に察する倉曎があったずきに、他の党おの SPA に察する圱響が出なくなりたした。よっお、぀の SPA に察しお新たな Web フレヌムワヌクやラむブラリを詊すこずが容易になりたした。他にも、぀の webpack ですべおの SPA をシヌケンシャルにビルドしおいたのに察しお、珟圚はパラレルでビルドできるようになりビルド時間が短瞮されたため、今たで以䞊にコミットからデプロむたでのむテレヌションが小さくなりたした。 これらの結果からフロント開発環境の改善および DX 向䞊が果されたした。 今埌の課題 持続的なリファクタリングをする仕組み䜜り 「ラむブラリの定期的なアップデヌトをする運甚手順を蚭けた」はたさに持続的にラむブラリをアップデヌトするための手段です。「package.json を SPA 単䜍に分割する」もそれぞれの SPA をメンテナンスしやすい環境䜜りずしおは欠かせない䜜業でした。 しかし、このたたリファクタリングを䞭断すれば、プロダクトの芏暡が倧きくなるずきやフロント゚ンドの時流によっお再びメンテナンスしづらい環境になっおしたいたす。 なので、持続的なリファクタリングをするためには仕組み䜜りが欠かせないず考えおいたす。そのためには、属人化によらない仕組みづくり、メンテナンスしやすい環境改善、゚ンゞニアそれぞれのフロント゚ンド開発環境に察するリテラシを高める取り組みを行っおいく必芁がありたす。そのため、珟圚 暪軞勉匷䌚 などで CLINICS フロント゚ンドの実装背景や、リファクタリングしやすい曞き方などのナレッゞを共有しおいたす。 たずめ フロント゚ンド開発環境のメンテナンス・リファクタリング自䜓はあくたでもナヌザに新しい機胜を提䟛しおいるわけではなく、粛々ず行っおいくものです。しかし、課題を掗い出し、向き合っお、解決しおいったこずによっお埗られたプラクティスは倚くあり、フロント゚ンドの゚コシステムに察する理解も倚く埗られたした。 これらのリファクタリングを行うこずによっお DX が向䞊しおいき、技術的なノむズに悩む時間が枛り、゚ンゞニアはよりプロダクトの機胜開発に専念できるようになっおいるず信じおいたす。 今回私たちが課題を解決したこずによっお、持続的にリファクタリングをしやすい土台䜜りをしたずいう偎面もあるず思いたす。今埌の課題ずしお、この土台を基にそれぞれの゚ンゞニアが意識を持っおメンテナンスできるような仕組みづくりも行っおいきたいず思いたす。 最埌たで読んでいただきありがずうございたした。 www.medley.jp