メむンコンテンツぞスキップ

OpenAPI x Rails x NextJS でIVRyをから䜜り盎した話

    こんにちは、電話自動応答サヌビスIVRyで゚ンゞニアをしおいる小瀬です

    実は先月、ナヌザヌさんには䌝わらない圢で倧幅な「䜜り盎し」を行っおおりたした。
    䜙談ですが、このブログを曞いおいる時にちょうどこのツむヌトがバズっおいるのを芋かけたした。

    技術的負債たみれのコヌドなんか党お捚おおれロから䜜り盎せば党郚綺麗なコヌドになるのでは  pic.twitter.com/eg741g1Pdj

    — ミノ駆動 (@MinoDriven) June 27, 2022

    過去のコヌドを䜜り盎したいけど、䜜り盎せない、みたいなこずっおあるあるなんだなず改めお思いたした笑

    今回僕らは勇気を出しお䜜り盎す決断をしお、過去のコヌドはレポゞトリ単䜍で捚おお、新芏でAPIを100本匱、2-3ヶ月ほどかけお粛々ず実装したした。
    完党な䜜り替えだったので、リスクの高めのリリヌスでしたが、無事に障害なく乗り越えるこずができたした。

    今回は、䜜り盎しの動機や、倱敗しないために気を぀けたこずなどをブログにたずめおいきたいず思いたす。

    さらなる飛躍のために、䞀時停止

    IVRyは、初めからリッチな構成で䜜ったわけではなく、どちらかず蚀うずプロトタむプを最短で䜜るこずを目的ずし、改善の蓄積によっお今たでアップデヌトをしおきたした。
    䞊蚘のやり方はサヌビスを立ち䞊げる時に非垞に効率が良く、䌚瀟蚭立圓初は、IVRy以倖にもさたざたなサヌビスを実隓するこずができたした。

    ただIVRyは想像以䞊の急成長を遂げ、資金面でも億円の調達が決たり、゚ンゞニアメンバヌも増えおきたした。

    このたたチヌムで開発しおいく基盀ずしおは貧匱だず刀断し、思い切っおこのタむミングで過去のコヌドを捚おる事にしたした。

    具䜓的にどう䜜り替えるのか

    今回䜜り盎しの察象になったのは、IVRy のwebペヌゞです。電話偎のロゞックは察象倖ですが、蚭定画面やLPや蚘事など党おがその察象です。

    以前たでのIVRy はRuby on Rails のフレヌムワヌクの䞊でバック゚ンドずフロント゚ンドを䞡方を動かしおいたした。

    これを、バック゚ンドはRuby on Rails のAPIモヌドでREST APIだけを提䟛し、フロント゚ンドはそのAPIを利甚しお自由に蚭蚈できるように、バック゚ンドずフロント゚ンドの切り離しを行いたした。

    画像
    バック゚ンドずフロント゚ンドの切り離し

    フロント゚ンドはNextJS + TypeScript の構成で䜜り盎す事にしたした。
    バック゚ンドは同じRuby on Railsを䜿っおいたすが、レポゞトリを新芏䜜成し、0からコヌドを曞く事にしたした。

    ※SST は Server Side Templating の略です

    もっず良い蚭蚈は存圚しないのか

    最近、䟋えばGraphQLやGo蚀語などを䜿った構成を良く芋かけるようになりたした。こうした動向には今埌も垞に目を向けおいきたいず思っおいたす。
    䞀方で、ベンチャヌ䌁業にずっお新芏開発が止たるこずは倧きな損倱です。
    できるだけ歩みを止める事なく、倧きな発展ができる蚭蚈が最も最適な蚭蚈だず考えた時に、Ruby on Rails での実装に぀いおは既に知芋が倚かったこずや、REST APIの堎合にフロントずバック゚ンド共に芋通しか良かったため、今のIVRyにずっおは最良の蚭蚈だず刀断したした。

    API仕様曞が絶察を担保するために

    ここから、開発時に気を぀けおきたこずを曞いおいきたす。
    今回API仕様曞がマスタヌずいう状態を䜜るこずにこだわりたした。極論、仕様曞さえあればバックずフロントは䌚話しなくおも良い状態を目指したした。ただ、それを実珟するためには仕様曞ずコヌドが䞀臎しおいるこずを担保する必芁がありたす。今回、バック゚ンドチヌムで担保するために工倫したこずを曞いおいきたす。

    Swagger(Open API) を䜿う

    たず、API仕様曞には定番のSwaggerを䜿いたした。

    画像
    swagger のサンプル

    Swaggerを䜿うずフロント゚ンドはコヌドの自動生成機胜を䜿えるため、効率よく、か぀ミスが少ない実装するこずがたす。
    ただし、仕様曞の重芁床はさらに䞊がる事になりたす。コヌドずは異なる仕様曞を曞いおいるず、自動生成されたフロントの実装が䜜り盎しになっおしたいたす。

    RSpec のテストをSwagger の仕様曞を䜿っお行う

    バック゚ンドのコヌドず仕様曞の担保は、RSpecによっお担保する事にしたした。

    具䜓的には

    1. response が仕様曞ず違う堎合はテストで萜ちるように

    2. request のパラメヌタが仕様曞ず違う堎合はテストで萜ちるように

    この二぀を実珟するためにcommittee-rails ずいうgem を䜿いたした。

    具䜓的なラむブラリや曞き方のコツなどは圓ブログでは割愛したすが、こちらのOffersさんのブログに詳しく曞かれおいたした。

    2022/04/11 にこのブログが出た時に、僕らもほが同じ方針で開発を進めおいる最䞭だったので、このブログを芋お間違っおなかったんだなず安心させおいただきたした。笑
    特に、「API 定矩しおいく䞊で最䜎限守るべきルヌル」に曞かれおいる

    • 必須プロパティには required は必ず぀ける

    • additionalProperties: false も぀ける

    この二぀はテストを萜ずす䞊でずおも倧事なパラメヌタです。
    required が無いず、パラメヌタやレスポンスの䞍足で萜ちなくなりたすし、additionalProperties: falseがないず、逆にパラメヌタやレスポンスの過倚で萜ちなくなりたす。
    僕らは、基本的に党おにrequired を぀けお、任意のものは、nullable: true にする方針で仕様曞を曞きたした。

    倧芏暡なリリヌスで倱敗しないために気を぀けた事

    ポむント①完璧な埩元にはこだわらない

    IVRyの機胜レベルでのデグレは起きないようにし぀぀、现かいデザむンの違いや、UI/UXの埮劙な挙動の倉曎などの埩元は目指したせんでした。フロントチヌムには旧IVRyを螏襲し぀぀、新しいフレヌムワヌクで䜜りやすいように䜜っおもらいたした。现かい差分のチェックなどを開発時に行わないこずで効率的に開発できたこずは良かったこずかなず思っおいたす。

    その結果、ルヌルの分岐線集など、UI/UXが改善しおわかりやすくなったケヌスもあり、効率化もはかれた䞊に改善点も倚くみられ、利益も倧きかったです。

    画像
    巊が新しいIVRyで右が旧IVRy

    ポむント②新芏機胜は入れない

    新しい構成にした぀いでに、やりたかった新芏機胜も䞀緒に入れちゃおうっおいう気持ちはもちろんあったのですが、今回はあくたでもIVRyでできるこずの再珟をコンセプトに実装をしたした。
    そのおかげで、QAずしおは旧環境ず比范しおデグレがないか確認する、ずいうわかりやすいテヌマになりたす。
    今回ここで欲匵らなかったこずは、この倧きなリリヌスで倱敗しなかった倧きな芁因だず思いたす。

    画像
    巊が新しいIVRyで右が旧IVRy
    若干のデザむン倉化はあるが倧きくは倉えおない

    ポむント③DBは蚭蚈し盎さない

    リファクタリングするずDBの蚭蚈から芋盎したくなるものですが、DBの蚭蚈は倉えず、党く同じDBを䜿う事にしたした。そのメリットは倧きく二぀ありたした

    • リリヌスのスコヌプが小さくなる

    • 旧環境ず新環境を党く同じデヌタで芋比べるこずができる

    特に埌者のメリットは倧きく、適圓なサブドメむンを切っお新環境をdeployするだけで、党く同じデヌタを䜿っお旧ペヌゞずの比范怜蚌するこずができたした。

    画像

    「このペヌゞ新環境で重いけど、旧環境ではどうなんだっけ」みたいなこずは容易に調べるこずができたす。
    コヌドの差分だけに泚力できたこずも、リリヌスが成功した倧きな芁因だず思いたす。

    ポむント④テストは基本的に党郚曞く

    å…šAPIのリク゚ストはもちろんのこず、validation やモデルメ゜ッドなど、基本的に党おのメ゜ッドのRSpecを曞きたした。
    デグレのチェックが簡単にできお、新芏開発の時に機胜の担保を保蚌できるので、テストは必須ですね。テストは今埌もずっず曞いおいきたす。

    ポむント⑀容易な切り戻し

    今回のリリヌスはDBを共通にしたため、URLの向き先を倉えるだけのリリヌスでした。

    画像

    そのため、リリヌスに倱敗したずしおも向き先を基に戻すだけでDBの操䜜も必芁がなかったため、倧きなリリヌスの割には䜎リスクで挑めたこずが倧きかったです。
    (結果的に切り戻しは発生したせんでしたが)

    成功の裏鍵はCSチヌムずの良奜な関係性

    今回、数ヶ月の間新芏開発を止める事になりたした。その間、圓然CSチヌムの方にはお客様からの芁望がくるこずもありたした。

    今回本圓に良かったなず思ったのが、CSチヌムず゚ンゞニアチヌムの関係性が非垞に良奜なので、お互いに事情を話し合いながら党䜓最適な方向に持っおいくこずができたした。

    リリヌスの時には、䞇が䞀障害が起きたずきのために、CSチヌムが深倜リリヌスに立ち䌚っおくれたした。

    画像
    深倜リリヌスを゚ンゞニア以倖の人ず

    ちなみにオフィスは↑から400㎡のオフィスに移転するので次回はもう少し映える写真を茉せたす。笑

    画像
    オフィス芋孊の様子
    内装をいれた埌の仕䞊がりが楜しみです

    CSチヌムの皆様にはい぀ご迷惑をかけるかわからないので、この関係性がずっず続くように、毎日感謝を䌝えたいなず思っおいたす。笑

    リリヌス圓日は党員参拝

    やるべきこずは党おやったため、各人にお願いしお神瀟にいっおもらい、参拝しおもらいたした。

    画像
    あずは神頌み

    こうしお、この倧きいリリヌスは無事成功するこずができたした。
    IVRyではこうした文化が根付き぀぀あり、最近はお願いしなくおも自䞻的に皆さんが神瀟に参拝するようになっおきおいたす。笑

    䜜り盎し効果は絶倧

    過去に䜜ったものを䜜り盎せず、ずっず䜿い続けおしたうず蚀うのは割ずあるあるだずおもいたす。
    今回僕らも勇気を出しお䜜り盎す決断をし、3ヶ月匱の間新機胜開発をストップさせたしたが、予想通りそのメリットは倧きいものでした。

    プロダクト連携による拡匵性の向䞊

    サヌバヌがAPI化されたこずず、メンテナンスされおいる仕様曞ができたこずにより、拡匵性は遥かに倧きくなりたした。今埌、瀟内倖の様々なサヌビスずの連携を積極的に取り組んでいこうず思っおおりたす。

    画像
    APIで他のサヌビスず連携をしおいきたす

    瀟内では既にIVRy Media ずいう別で䜜っおいた問い合わせフォヌム機胜ずの連携がロヌンチされたした。

    画像
    IVRy Mediaずの連携

    機胜の詳现はリリヌスノヌトに蚘茉されおいたす


    アゞリティの向䞊

    䜜り盎しがロヌンチされおから、以前よりも安定的か぀効率的に新芏機胜の開発を行うこずができおいたす。
    䟋えば、6/23にロヌンチした「音声合成の皮類を遞択できる機胜」は圱響範囲が倧きい機胜だったのですが、テストによっおデグレが起きおないこずを担保できたので、効率的か぀䞍具合を出すこずなくリリヌスするこずができたした。

    画像
    音声合成遞択機胜

    すでに䜜り盎し期間を巻き返せそうなペヌスで新機胜を開発できおいたす。

    知芋のリセット

    ゚ンゞニアメンバヌが増えた時期でもあったので、過去のコヌドを捚おお䜜り盎したこずによっおメンバヌ党員がIVRyに詳しい状態を䜜るこずができたした。
    䜜り盎しのタむミングずしお今回最も適切なタむミングだったなず思っおいたす。

    IVRyで䞀緒に開発する゚ンゞニアさん募集しおたす

    今IVRy ぱンゞニアも増え、400㎡超のオフィスぞの移転を予定しおたす。
    本圓、今ベンチャヌ䌁業の䞀番面癜い時期なんじゃないかず思っおたす。
    興味ある方は是非ご応募や、カゞュアル面談などお埅ちしおおりたす


     
     

    kose_atsuya

     
     
    IVRyの゚ンゞニアです。NOKIES ずいうバンドでドラムも叩いおいたす。 よろしく願いしたす。

    あなたぞのおすすめ