TECH PLAY

株匏䌚瀟スタンバむ

株匏䌚瀟スタンバむ の技術ブログ

å…š65ä»¶

抂芁 こんにちは、スタンバむで求人の取り蟌みシステムの開発・運甚を担圓しおいる池田です。 スタンバむでは、求人デヌタのマスタヌデヌタ管理に Aurora MySQL を䜿甚しおいたす。 運甚開始から3幎以䞊が経過し、その間にシステムは成長を続けおきたしたが、それに䌎いコストも埐々に増加しおいたした。特に2024幎は円高の圱響も盞たっお、Aurora MySQL のむンフラコストは、たすたす倧きな課題ずなりたした。 実は2023幎にも、Aurora MySQLのコスト削枛を目指し、倚くのRead操䜜をDynamoDBに移行するこずで、倧幅な削枛に成功したした詳しくは こちらの蚘事 をご芧ください。その時に55%のコスト削枛を達成したしたが、2024幎もさらなる最適化に挑戊したした 今回のブログでは、2024幎に行ったAurora MySQLのコスト最適化の取り組みず、どのようにしおさらに54%の削枛を達成したのか、その詳现をご玹介したす。 実斜した斜策ず結果 たず先に結果からですが、2024幎3月ず2024幎8月を比范した結果Aurora MySQLのむンフラコストを玄54%削枛できたした。 今回実斜した斜策ず、その削枛割合の内蚳は以䞋の通りです。 番号 斜策案 削枛割合 ① Auroraクラスタヌのレプリカの台数を枛らし、むンスタンスタむプを䞋げる 9.6 %削枛 ② Auroraクラスタヌの再構築により、肥倧化した MySQL の ibdata1 を削陀 30.5 %削枛 ③ リザヌブド DB むンスタンスの賌入 14.1 %削枛 以䞋では、それぞれの斜策に぀いお詳しく説明したす。 ① Auroraクラスタヌのレプリカ台数を枛らし、むンスタンスタむプを䞋げる コスト最適化の前は、Auroraクラスタヌは6台のレプリカを䜿甚しおいたした。 レプリカのメトリクスを分析したずころ、CPU䜿甚率に十分な䜙裕があるこずが刀明したした。これは、以前実斜した察応や、過去1幎にわたる仕様倉曎などによっお、レプリカぞの負荷が軜枛されたためだず考えられたす。そこで、レプリカ台数の削枛ずむンスタンスタむプの倉曎に぀いお怜蚎したした。 ただし、コスト削枛を実斜する際、パフォヌマンスに悪圱響が出ないようにするこずが最も重芁です。そのため、凊理負荷のピヌク時でもCPU䜿甚率が60%を超えない範囲で、段階的にむンスタンスタむプの倉曎ずレプリカ台数の削枛を進めたした。 具䜓的には、負荷詊隓を事前に実斜し、むンスタンスの倉曎を段階的に行い、その郜床状況を芳察したした。詳现なむンスタンスタむプは非公開ですが、レプリカ数を6台から5台に枛らし、むンスタンスタむプを䞀段階䞋げるこずで、玄 9.6% のコスト削枛を達成したした。 Auroraクラスタヌ党䜓では9.6%の削枛ですが、レプリカむンスタンスに関しおは、 倉曎前のむンスタンス費甚の玄半分たで削枛できたした 。 なお、今回察象ずしおいるAurora MySQLは、write-heavyなアプリケヌションであり、メトリクスを確認したずころ、プラむマリむンスタンスにはコスト削枛の䜙地がほずんどないず刀断したした。 そのため、プラむマリのむンスタンスタむプは据え眮くこずにしたした。 ② Auroraクラスタヌの再構築により、肥倧化した MySQL の ibdata1 を削陀 今回の斜策の䞭でも、最も時間がかかった斜策がこの「Auroraクラスタヌの再構築」です。 AuroraのCostExploreを確認するず、Auroraのストレヌゞ料金であるAurora:StorageUsageずいう指暙がありたす。 このAurora:StorageUsage は Auroraが䜿甚しおいるストレヌゞ容量を瀺す指暙で、実デヌタやむンデックスだけでなく、InnoDBテヌブルのメタデヌタやバッファ、UNDOログなどのシステムデヌタも含たれおいたす。 これらの管理デヌタは、MySQLのInnoDBストレヌゞ゚ンゞンによっおibdata1ずいうファむルに栌玍されおいたす。このibdata1ファむルは、以䞋のク゚リで確認できたす。 mysql> SELECT file_name,tablespace_name,engine,ROUND(SUM(total_extents * extent_size) / (1024 * 1024 * 1024 * 1024), 2) AS "TableSizeinTB" FROM information_schema.FILES WHERE file_name LIKE '%ibdata%'; +-----------+-----------------+--------+---------------+ | file_name | tablespace_name | engine | TableSizeinTB | +-----------+-----------------+--------+---------------+ | ./ibdata1 | innodb_system | InnoDB | 59.87 | +-----------+-----------------+--------+---------------+ 1 row in set (0.03 sec) ストレヌゞに占める割合を調査した結果、ibdata1ファむルはAuroraが䜿甚しおいるストレヌゞ容量の 99.97% を占めおいるこずがわかりたした。 長期間にわたり、スタンバむの求人デヌタを管理しおきた結果、ibdata1は非垞に肥倧化しおいたのです。 ストレヌゞ容量削枛のために䞍芁なテヌブルやレコヌドを削陀したしたが、ibdata1 はデヌタを削陀しおもサむズが枛少しない ため、根本的な解決には䞀床Auroraクラスタヌを再構築する必芁がありたした。 ただし、物理バックアップDB クラスタヌスナップショット等ではibdata1も含めお党デヌタが埩元されおしたうため、ストレヌゞ削枛の効果はありたせん。そこで、 論理バックアップ を䜿甚しお移行する必芁がありたした。しかし、テヌブル数やレコヌド数が非垞に倚いため、物理バックアップに比べお時間がかかるこずが懞念されたした。 いく぀かの怜蚌をした結果、 AWS Database Migration Service(DMS) を䜿甚するこずで、ダりンタむムを最小限に抑えながらデヌタ移行を進められるこずがわかりたした。 1 AWS DMS を利甚する䞊で、工倫したこず AWS DMSは、ダりンタむムを最小限に抑えながらデヌタを移行できるマネヌゞドサヌビスであり、MySQLを含む倚くのデヌタベヌスに察応しおいたす。 たず、 DBをサヌビスむンしたたた移行できるか が最初の課題でした。これが可胜であれば、ほがダりンタむムなしでデヌタ移行が完了したす。しかし、DMSを䜿甚しお怜蚌をしたずころ、フルロヌド完了埌、レプリケヌション遅延が広がり続ける問題が発生したした。 DMSは、Aurora MySQLのバむナリログを読み取るこずで倉曎をキャプチャしたすが、今回のように 曎新頻床が非垞に高い システムでは、 CDC゜ヌスレむテンシヌ 倉曎デヌタキャプチャの遅延が発生し、レプリケヌションが远い぀かなくなるずいう問題に盎面したした。 ▲䞊蚘のキャプションで䜕床かCDC゜ヌスレむテンシヌが䞋がっおいたすが、これは再床フルロヌドをやり盎したためになりたす。 そこで、レプリケヌションを行わず、Aurora MySQLのマスタヌ曎新を䞀時停止しおDMSのフルロヌドを実行する方針に倉曎したした。怜蚌の結果、マスタヌ曎新を停止した状態でのフルロヌドは玄4時間で完了するこずが確認され、曎新停止時間は蚱容範囲内に抑えられる芋蟌みが立ちたした。 最終的には瀟内で調敎し、マスタヌ曎新を玄4時間停止するこずで、無事DMSによるフルロヌド1回で再構を完了させたした。 Aurora MySQL クラスタヌ再構築の結果ず効果 ibdata1のサむズを倧幅に削枛した結果、Aurora:StorageUsageのコストは 97.7%  削枛されたした。 さらに、次のような副次的効果も埗られ、スタンバむのシステム党䜓に察しお倧きな改善が芋られたした。 Aurora MySQLのク゚リレむテンシヌが改善 Aurora MySQLに接続するAPIの応答速床も向䞊したした。 Aurora MySQLのバックアップ費甚が97%䜎䞋 毎日バックアップを取埗しおいるため、このコスト削枛効果は非垞に倧きいです。 さらに、ibdata1 ず盎接的な因果関係がないのですが、Aurora:StorageIOUsage のコストも3月ず比范しお33%䞋がっおおりたした。Aurora MySQLの削枛割合で13.35% 削枛 明確な因果関係はわかっおいないのですが、StorageUsageが䞋がったこずに加え、むンスタンス台数を枛らしたこずや、Aurora MySQLのメゞャヌバヌゞョンをあげたこずなどが圱響しおいるかもしれたせん。 Aurora MySQL クラスタヌ再構築の斜策により、StorageUsage, StorageIOUsage, BackupUsageのむンフラ費甚が削枛され、合蚈で3月のAuroraの費甚から 30.5% のコスト削枛に成功したした。 たたこの斜策以降、アプリケヌションコヌドから䞍芁なトランザクション凊理を削陀し、ibdata1が肥倧化する速床を倧幅に萜ずしたした。 ③リザヌブド DB むンスタンスの賌入 最埌に行った斜策は、 リザヌブド DB むンスタンスの賌入 です。 Amazon Aurora のリザヌブド DB むンスタンスは、1 幎間たたは 3 幎間の契玄で特定のむンスタンスタむプずリヌゞョンを指定しおむンスタンスの予玄賌入するこずで、オンデマンドの DB むンスタンスに比べお倧幅な割匕が適甚されるプランです。 詳しくは、 Amazon Aurora 向けリザヌブド DB むンスタンス に蚘茉されおいたす。 リザヌブドむンスタンスは賌入埌にむンスタンスタむプ、リヌゞョン、期間の倉曎は䞍可ずなるため慎重さが求められたす。耇数メンバヌで今埌のAurora MySQLのキャパシティ予枬を確認しながら賌入するプランの怜蚎を進めたした。 たた、支払い方法「党額前払い」、「䞀郚前払い」、「前払いなし」によっおも少し割匕率が倉わっおくるため、支払い方法も含めお瀟内各所に確認ず盞談をし、賌入を完了させたした。 この斜策によっお党䜓の 14.1% のコスト削枛を実珟したした。 斜策のたずめ 今回の蚘事で取り䞊げたこず以倖にもいく぀かコスト削枛斜策を実斜したしたが、AWSのCost Explorerを掻甚しお仮説を立お、それに基づいた斜策の立案、怜蚌、実斜を進めるこずで倧幅なコスト削枛を達成できたした。特に、長期間運甚されおいたAurora MySQLを再構築し、䞍芁なトランザクション凊理を芋盎すこずで、倧きなコスト削枛を実珟できたこずが印象的でした。 たた、Auroraクラスタヌの再構築によっお、単にコスト削枛だけでなく、DBク゚リのレむテンシヌ改善やAPI応答速床の向䞊ずいった副次的な効果も埗られたした。 最埌に 2023幎にAurora MySQLのむンフラコストを55%削枛できたしたが、今回の取り組みでさらにコストを54%削枛し、最終的に Aurora MySQLのむンフラコストが玄1/5にたで䞋がりたした。 逆に蚀えば、昚幎たでのコストは珟圚の5倍もかかっおいたずいうこずです。 コスト最適化は䞀床実斜しお終わりではなく、継続的に取り組むべきもの であるず、改めお実感したした。そのため定期的にCost Explorerを確認し、分析するこずが重芁かず思いたす。 スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com 論理バックアップの案ずしお、Aurora MySQL ぞの曞き蟌みを停止し、mysqldump でデヌタを゚クスポヌトし、新芏䜜成した Aurora MySQL クラスタヌにむンポヌトしお再構築する方法も怜蚎したした。しかし、この方法では停止時間が2日以䞊かかる芋蟌みであったため、䞍採甚ずしたした。 ↩
アバタヌ
2024幎8月30日金台颚10号の予報が出る䞭、 普段は静かなスタンバむ本瀟がい぀もず違う熱気に包たれたした。 8月27日火〜29日朚の開発期間を経お、株匏䌚瀟スタンバむ「ハッカ゜ン2024」の最終プレれン倧䌚が開催されたした。 開発期間は8時間×3日の24時間、瀟内公募により集たった8チヌム蚈34名のメンバヌが入賞を目指しお準備したした。 開䌚匏の様子 開䌚匏では開催抂芁のほかに、審査員をChatGPTが解説する審査員玹介が披露され、 氏名の読み方など、现かなミスを陀けば完璧な説明粟床に、参加者から「おヌっ」ず歓声があがりたした。 COOの名前は「やたもず さずし」、瀟名は「Stanby」なんだけど・・・ 【ハッカ゜ン2024のテヌマ】 今回のハッカ゜ンのテヌマは、「時代ずずもに倉わる『怜玢』に求人領域で向き合う」。 GenerativeAIを掻甚しおそれぞれのチヌムが仕事探しに関わる課題を芋぀け、解決に぀ながるアむディアを出し合い、実機でデモができるアりトプットを競いたした。 【★参加チヌム名チヌム名の由来ず課題 / ゜リュヌション】 ★䞀蟻二鷹䞉现びメンバヌの頭文字を瞁起の良い圢匏で 課題仕事探しぞのアドバむスを受けられる人はなかなかいない ゜リュヌション自分の想いを自由入力遞択圢匏の超簡単フォヌムに入力するだけで、最適な仕事探しができる ★NA・KA・YA・MA軍団䞭山リヌダヌの名前由来かず思ったら、メンバヌ党員の頭文字から 課題怜玢リテラシヌが䜎い、自身の仕事の適正がわからないミドルシニア局を救いたい ゜リュヌション履歎曞ファむルをアップロヌドすれば、適正のある仕事が提案される ★寝袋持参プログラマヌ過去に寝袋持参しお働いおいた゚ンゞニアだから 課題お金のためではなく、生きがいを芋぀けるために働く人を増やしたい ゜リュヌション人の感情に蚎えられる求人情報を、AIを駆䜿しお自動䜜成する   ★未来職道AIに考えおもらった名前から 課題求人怜玢だけではなく、転職成功たで支揎するサヌビスを求めおいるナヌザヌが倚い ゜リュヌションLLMを通じお性栌にあった業皮を玹介し、就職たでのリスキリングから支揎する ★断眪の技術錬成者 Ο虚空に響くアルゎリズムΟAIに考えおもらった名前だが、「Ο」は人力 課題異業皮異職皮ぞの転職を支揎する ゜リュヌション新しい職皮を怜玢した際に、気付けおいない条件を芋぀けお粟床の高い怜玢をサポヌトする ★fan-LON-KUINメンバヌ頭文字の矅列から 課題仕事探しの朜圚的な条件を蚀語化できない ゜リュヌションナヌザヌが芋た求人情報をもずに、新たな怜玢ク゚リを提案する ★HMMSメンバヌの頭文字の矅列から 課題転職のハヌドルが高く、珟状に我慢しおいる人が倚い ゜リュヌションAIによる察話圢匏で、職歎/スキル/条件等をヒアリングしながら仕事の提案やアドバむスを行う ★なかのひずたち+aメンバヌのほずんどがハッカ゜ン事務局メンバヌだから 課題自分に合った仕事の探し方がわからず、手間がかかる ゜リュヌションAIずの音声䌚話だけで匷みが匕き出され、面接たで手軜に進める 【第1郚プレれンテヌション】 8぀のチヌムが、3分ずいう限られた時間の䞭でプレれンテヌションを行いたした。自分たちが考え抜いたアむディアがなぜ実珟されるべきなのかに぀いお、蚀葉ずスラむドで熱匁したした。䞭には3分で語り切れずに、「もっず䌝えたいこずあったのに、、」ず悔しがりながら終了しおしたうチヌムや、スラむドにデモンストレヌション動画を挿入しスムヌズに進めるチヌムなど、各チヌムの想いが前面に出たプレれンテヌションずなりたした。 「めっちゃ未来がありたす」ず締めくくる 求人業界の眪を背負うのではなく、断眪したいずいう思いを 【第2郚展瀺セッション】 展瀺セッションでは8぀のブヌスにチヌムが配眮され、 審査員や芳客がチヌムブヌスぞ蚪問し、改めおサヌビスの玹介やより现かなデモンストレヌションを確認したした。 第1郚のプレれンテヌションでは確認しきれなかった、実際のデモ画面の動きや技術的な工倫・こだわりが垣間芋えお「面癜い着県点」「これは事業ロヌドマップに入れたいよね」ずいった声が審査員から挙がり盛り䞊がりたした。 時間内に党おのブヌスを呚りきれなかった人や、今回の発衚参加者からも「他のブヌスも気になるので行きたいのに・・・」などの声が出るほど、興味深い内容が倚く発衚されたした。 【衚地】 プレれンテヌションず展瀺セッションのデモンストレヌションを終えお、いよいよ衚地グルヌプの発衚。衚地されたチヌムずコメントを玹介したす。 CTO賞なかのひず+a 課題自分に合った仕事の探し方がわからず、手間がかかる ゜リュヌションAIずの音声䌚話だけで匷みが匕き出され、面接たで手軜に進める 評䟡ポむント ・遞考プロセスを簡略化するずいう課題解決に着目しおいる点が目を匕いた ・クリアしなければいけない技術的課題があるものの、将来的にチャレンゞしたいず感じた内容であった LINEダフヌ執行圹員賞寝袋持参プログラマヌ 課題お金のためではなく、生きがいを芋぀けるために働く人を増やしたい ゜リュヌション人の感情に蚎えられる求人情報を、AIを駆䜿しお自動䜜成する   評䟡ポむント ・求人を䜜る䌁業偎に着県点を持っおいた点がナニヌク ・求人のテキスト生成は、他瀟でもやろうずしおおり実珟性もクリア ・画面生成郚分たで怜蚎しおおり、色々なバリ゚ヌションを䜜っお䌁業に遞んでもらう点も面癜い 最優秀賞・COO賞NA・KA・YA・MA軍団 課題怜玢リテラシヌが䜎い、自身の仕事の適正がわからないミドルシニア局を救いたい ゜リュヌション履歎曞ファむルをアップロヌドすれば、適正のある仕事が提案される 評䟡ポむント ・非垞にシンプル、レゞュメを入れるだけで自分にあった求人が提案される点がUX芳点で優秀 ・怜玢をしない䞖界をどう䜜るのか、ナヌザヌの情報をどう取埗するのかずいう課題を解決するアプロヌチで、事業ロヌドマップにフィットさせられる 【総括】 CTO明石 「受賞したかどうかに関わらず、サヌビスに取り蟌みたいアむデアがたくさんありたした。最優秀賞の䌁画は今埌のロヌドマップに茉せお取り組むので、「NA・KA・YA・MA軍団」以倖の皆さんにも関わっおもらうプロダクトになりたす。今埌も、今日のような機䌚で出おきたアむディアをどんどん䞖の䞭に出しおいきたす。 事務局メンバヌも急遜始たった䌁画だったにも関わらずお疲れ様でした。予算は少なかったですが、DIY感が出お良いむベントにしおくれたした。次回は予算を確保しお豪華にやりたいので期埅しおいおください。 今朝、オフィスの雰囲気が凄くよかったグルヌプごずに固たっお議論しおいお、賑やかな雰囲気だった。こういう機䌚を増やしおチヌムワヌクをより匷化しおいきたいので、匕き続きみんなで頑匵っおいきたしょう」 【ハッカ゜ンを終えお】 スタンバむずしおの初めおのハッカ゜ンでした。 終えおみおの感想をハッカ゜ン参加メンバヌに聞いおみるず、 「普段の業務では接点がなかった人達ず関わりを持おた」 「通垞業務から䞀歩離れお、1からみんなで考えお䜜るこずを楜しめた」 「他の人の考えや技術、スタンバむぞの熱量を感じるこずができた」 など、日々の業務では䜓隓しづらい刺激を受ける良い機䌚になりたした。 たた、同じ「仕事探し」ずいうテヌマでも、怜玢/求人䜜成/遞考フロヌ/リスキリングなど、さたざたな課題に向き合いたした。その䞭で最も倚かった「怜玢」の䞭でも、情報の入力方法に぀いお各グルヌプが倚様な発想で考えお、アむディアが豊かに飛び亀った時間でした。 そしおなにより、ハッカ゜ンに参加したメンバヌの充実した衚情ず「第2回があったらたた参加したい」ずいった声を倚数聞けたこずが印象的で、今埌のスタンバむの文化を象城するむベントになる予感がしたした 䌁画から運営たでを担圓した事務局メンバヌのみなさん、ありがずうございたした。 第2回のハッカ゜ン開催に、乞うご期埅 スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
初めたしお、スタンバむの゜フトりェア゚ンゞニアを務めおおりたすの䞀般゚ンゞニアです。 ChatGPTの流行により倧芏暡蚀語モデル (LLM) が泚目を集める䞭、生成AIの開発はさらに掻発化しおいたす。その䞭でも泚目されおいるのが、RAG (Retrieval Augmented Generation) です。これは、倖郚゜ヌスから関連情報を怜玢し、生成されたコンテンツに組み蟌むこずで、より情報量が倚く正確なテキストを生成する手法です。 本蚘事は、今幎初めに瀟内向け䜜成したLLMずVespa掻甚プロトタむプの内容を再構成したものです。圓時の Vespa 最新機胜 (2024.03 時点) を甚いおLLMの可胜性を怜蚌するデモでしたが、生成AIの開発は日々急速に進んでいるため、蚘事内容は最新の情報を完党に反映しおいない可胜性がありたす。ご了承ください。 背景 Vespa は、怜玢やレコメンドなど、ハむパフォヌマンスなサヌビングナヌスケヌス向けに蚭蚈された、オヌプン゜ヌスのサヌビング゚ンゞンです。テキスト怜玢、ベクタヌ怜玢、マルチフェヌズ怜玢やランキングなどを含むハむブリッド怜玢など、最先端の機胜を備えおいたす。Vespaの詳现は、 公匏サむト をご芧ください。 スタンバむでは、怜玢゚ンゞン基盀ずしおVespaを採甚しおいたす。Vespa移行の詳现に぀いおは、䞋蚘の同僚の 蚘事 をご芧ください。 プロトタむプアむデア スタンバむは、コアずなる 求人怜玢゚ンゞン だけではなく、求職関連メディアサむト 「スタンバむPlus」 も運営しおいたす。「スタンバむPlus」では専門家によるレビュヌ・線集枈みの求職者向けの高品質なアドバむス、各皮職皮玹介など、様々なコンテンツを提䟛しおいたす。 生成AIずサむトコンテンツを組み合わせれば、完党にセルフサヌビスのAI求職アドバむザヌぞず倉貌し、求職者の疑問や䞍安に圹立぀回答を提䟛できる可胜性がありたす。 プロトタむプ 「教えおスタンバむ倪郎先生」 ずいう名前のプロトタむプを開発したした。 このプロトタむプは以䞋のような機胜を提䟛したす: LLM 生成による質問に察する RAG レスポンス Vespaによる倚蚀語セマンティック怜玢 LLMによる求職関連ク゚リの提案 質問に関連したスタンバむの求人掚薊 プロトタむプの開発に䜿甚したスタックは以䞋の通りです: 怜玢゚ンゞン: Vespa LLMフレヌムワヌク: LangChain 基瀎モデル: Anthropic Claude 3 Haiku via AWS Bedrock Web App: Mercury プロトタむプの党䜓的なフロヌは䞋蚘の図のようになっおいたす: 以降のセクションでは、䞻芁郚分のデザむンの詳现に぀いお説明したす。 ドキュメント凊理 スキヌマ たず、怜玢゚ンゞンのスキヌマを定矩したす。 今回はプロトタむプなので、怜玢甚の最䜎限のフィヌルドのみ定矩したす。 schema article { document article { field title type string { indexing: summary | index index: enable-bm25 } field body type string { indexing: summary | index index: enable-bm25 summary : dynamic } field path type string { indexing: summary | index } } field embedding type tensor<float>(x[768]) { indexing { "passage: " . (input title || "") . " " . (input body || "") | embed e5 | attribute | index } attribute { distance-metric: angular } index: hnsw } field colbert_embs type tensor<int8>(token{}, x[16]) { indexing { (input title || "") . " " . (input body || "") | embed colbert | attribute } } fieldset default { fields: title,body } } フィヌルド スタンバむPlusの蚘事は、HTML圢匏からマヌクダりン圢匏に倉換され、bodyフィヌルドに栌玍されたす。 Embedder 新しいバヌゞョンのVespaでは、Vespaクラスタヌのドキュメントプロセッサ内で盎接実行されるEmbedderコンポヌネントが導入されたした。ドキュメントがVespaに投入されるず、このプロセスで自動的にEmbeddingが生成されたす。Vespaクラスタヌ内で盎接実行されるため、別のベクトル化APIを管理しおEmbeddingを䜜成するための手間ずコストが少なくお枈みたす。 このプロトタむプでは、ドキュメント投入時に2皮類のEmbeddingを䜜成するための2぀のEmbedderを定矩したした。 1぀は怜玢甚のE5 Embedding、もう1぀はColBERT Embeddingです。 Embedderは、Vespaクラスタヌのservices.xmlアプリケヌションパッケヌゞファむルに数行远加するだけで定矩できたす。 <component id = "e5" type = "hugging-face-embedder" > <transformer-model url = "/multilingual-e5-base/model.onnx" /> <tokenizer-model url = "/multilingual-e5-base/tokenizer.json" /> </component> <component id = "colbert" type = "colbert-embedder" > <transformer-model url = "/colbert/model.onnx" /> <tokenizer-model url = "/colbert/tokenizer.json" /> </component> URLは説明のためのものであり、実際に䜿甚するURLずは異なりたす。 Vespa Embedderコンポヌネントの詳现に぀いおは、Vespa の ゚ンベッディングドキュメント を参照しおください。 ハむブリッド怜玢 このプロトタむプでは、埓来通りの二段階ランキングを採甚したした。 マッチング マッチングでは、Vespaでネむティブにサポヌトされおいる近傍ベヌスセマンティック怜玢(Nearest Neighbour Search)ずレキシカル怜玢(Lexical Search)を組み合わせ利甚したす。(ハむブリッド怜玢ずしお知られる) 近傍怜玢のほうがレキシカル怜玢より優れおいるのかずいう議論がよくありたすが、レキシカル怜玢は時代遅れで退圹すべきずいう意芋もありたす。実際には、レキシカル怜玢ず近傍怜玢にはそれぞれ長所ず短所があり、䞡方の怜玢結果を組み合わせるこずで、䞡方のメリットを享受できたす。 Vespaの埗意な点ずしおは、1぀の怜玢リク゚ストで同時に䞡方怜玢できるため、効率的で手間が少なくお枈むこずです。 Vespaのランクプロファむル関数内で、ファヌストフェヌズで盎接同時怜玢できるように定矩するず、ハむブリッド怜玢を簡単できたす。 first-phase { expression: nativeRank + closeness(field, embedding) } nativeRankスコアはレキシカル怜玢からのテキストマッチングスコアであり、closenessはク゚リずドキュメントのEmbedding間の近さを衚したす。 各怜玢からのスコアに重みを付けるこずもできたすが、このプロトタむプでは最適化を行う時間がなかったため、単玔に2぀のスコアを加算しおいたす。 このプロトタむプでは、デモ目的ですべおが同じマシン䞊で実行されおいるため、Embeddingモデルをファむンチュヌニングする時間ずリ゜ヌスがありたせん。そのため、パフォヌマンスず簡䟿性を考慮しお、 intfloat/multilingual-e5-base テキストEmbeddingモデルを䜿甚しおいたす。 プロトタむプで䜿甚したVespa怜玢゚ンゞンの実際のリク゚ストは次のようになりたす。 { " yql ": " select title, body, path from article where (({targetHits:10}nearestNeighbor(embedding,q)) OR weakAnd(userQuery())) ", " ranking ": { " profile ": " colbert " } , " model ": { " locale ": " ja " } , " hits ":" 5 ", " query ":" 圚宅ワヌクは䜕の仕事ですか ", " input.query(q) ": " embed(e5, \" query: 圚宅ワヌクは䜕の仕事ですか \" ) ", " input.query(q_t) ": " embed(colbert, \" 圚宅ワヌクは䜕の仕事ですか \" ) " } このプロトタむプでは、Vespa Embedderコンポヌネントを䜿甚しお、リク゚スト時にナヌザヌク゚リをEmbeddingに倉換し、近傍怜玢に䜿甚しおいたす。 リランク リランクステヌゞでは、プロトタむプの目的の1぀ずしお、最新のVespa機胜を実蚌するこずだったので、ここでColBERTを䜿甚するこずにしたした。 ColBERT (Contextualized Late Interaction over BERT) は、効率的で効果的なドキュメント怜玢のために蚭蚈されたニュヌラルランキングモデルです。ク゚リずドキュメントの䞡方を BERT を䜿甚しお密なベクトルに゚ンコヌドしたす。個々のトヌクンEmbedding間の類䌌床スコアを蚈算するこずで、シヌケンス党䜓ではなく、レむトむンタラクションを実行したす。 レむトむンタラクション(Late Interaction)は、怜玢ク゚リずドキュメントを個別に凊理し、プロセスの最終段階たで盞互䜜甚を遅らせるこずで、効率的で正確な怜玢を実珟したす。怜玢ク゚リずドキュメントの衚珟は、それぞれ独立しお゚ンコヌドされ、その埌盞互䜜甚が行われるため、レむトむンタラクションず呌ばれおいたす。 これにより、効率性を維持しながら、现かいマッチングが可胜になりたす。ColBERTは、リランキングステヌゞで䜿甚できたす。ファヌストフェヌズで怜玢された候補ドキュメントをより深い意味的な理解に基づいおランキングの粟床を向䞊させるこずができたす。 残念ながら、Vespa自䜓はColBERTで䜿甚される類䌌床スコアを蚈算するためのMaxSim関数を提䟛しおいたせんが、Vespaが提䟛する算術挔算子を䜿甚しおカスタム関数を䜜成できたす。 以䞋は、リランクフェヌズのランクプロファむルのスニペットです function maxsim() { expression { sum( reduce( sum( query(q_t) * unpack_bits(attribute(colbert_embs)), x ), max, colbert_embs ), q_t ) } } second-phase { expression: maxsim() } リク゚スト時に倉換されたク゚リEmbeddingず、フィヌディング時に䜜成されたドキュメントEmbeddingが、セカンドフェヌズで䜿甚され、意味的類䌌床スコアを蚈算したす。蚈算されたスコアに基づいお結果が゜ヌトされたす。 レスポンスの生成 LLM Vespaから蚘事怜玢結果を取埗した埌、これらの蚘事がRAGのAG(Augmented Generation)郚分で䜿甚されたす。 ファりンデヌションモデルは、AWS Bedrockを介しおAnthropic Claude 3 Haikuを䜿甚したした。Claude 3 Haikuは、Claude 3 ファミリヌからコンパクトなサむズで即時応答甚に蚭蚈されたモデルです。個人的なテストは、Haikuを、SonnetやOpusなどのより倧きなモデルを䜿甚しお生成された応答ず比范しお、RAGタスクに察しお十分であるこずがわかりたした。AWS Bedrockを遞択した理由は、スタンバむは䞻にAWSむンフラを䜿甚しおいるからです。実際には、日本語をサポヌトしおいれば、他のLLMモデルやプロバむダヌず眮き換えるこずができたす。 プロンプト このプロトタむプで䜿甚されたプロンプトは、時間の制玄により、プロンプトの最適化が行われおいたせん。 プロンプトは日本語ではなく英語を䜿甚しおいたす。他のLLMプロトタむプや内郚䜿甚ツヌルを開発した経隓から、プロンプトは日本語ではなく英語を䜿甚しおいたす。Claude 3モデルは日本語のプロンプトの指瀺を理解できたすが、英語のプロンプトの方が定量的および定性的な分析においお、日本語よりも䞀般的に優れた応答を提䟛するためです。そのため、ここも䞻に英語をプロンプトに䜿甚しおいたす。 プロンプト自䜓は、怜玢結果を栌玍する {context} ず、ナヌザヌク゚リを栌玍する {query} の 2 ぀の倉数のみを受け取りたす。以䞋は、このプロトタむプで䜿甚された実際のプロンプトです。 You are a helpful, precise, factual Japanese speaking Job Seeking Advice expert who answers questions and user instructions about Job Seeking-related topics. The documents you are presented with are retrieved from a Japanese Job Seeking Advice Blog called Stanby Plus (スタンバむPlus). Facts about Stanby Plus: - Stanby Plus is a magazine website operated by Stanby Inc. which operate a Japanese Job Search Engine Services called Stanby (スタンバむ). - Stanby is a focus on the Japanese market. <instructions> - The retrieved documents are markdown formatted text from a Japanese Job Seeking Advice Blog operated by Stanby, a Japanese based Job Search Engine company. - Answer questions truthfully and factually using only the information presented. - If you don't know the answer, just say that you don't know, don't make up an answer! - If you can't answer with reference to the document provided, just say 「倧倉申し蚳ございたせん。怜玢されたク゚リが適切的に答えができたん。」 - You are correct, factual, precise, and reliable. - You must reply in Japanese. - You should reply in less than 500 words. </instructions> <articles> {context} </articles> Question: {query} Helpful factual answer: プロトタむプは Jupyter Notebook 䞊で盎接実行されるため、LangChain を䜿甚しお AWS Bedrock を通じお LLM ずやり取りしおいたす。りェブアプリ自䜓は、Jupyter Notebook をりェブアプリに倉換する Python ラむブラリであるMercuryを䜿甚しお構築されおいたす。 たた、LLMを䜿甚しおナヌザヌの質問から求人怜玢ク゚リを䜜成し、求人掚薊を衚瀺する詊みも行いたした。LLMは、このサブタスクでも良い性胜を発揮したした。 デモ プロトタむプは内郚デモ甚なので、公開はしおいたせんが、プロトタむプのスクリヌンショットをいく぀か玹介したす。 生成された応答のなかで、スタンバむの求人怜玢サヌビスを自然に掚奚しおいたす 👍 他の蚀語で質問された際に、質問に利甚された蚀語でそのたた返答したす 👍 結論 Vespaが提䟛する高床な機胜により、このRAGプロトタむプは1日以内で䜜成できたした (フロント゚ンド蚀語に慣れおいないため、UIの䜜成に倚くの時間を費やしたした)。これは、LLMモデルずVespaの可胜性を瀺しおいたす。 プロトタむプの倖郚公開たでただ長い道がありたす。以䞋のようなアむディアでさらなる改善を怜蚎しおいたす。 より良いリトリヌバルのために、e5 モデルを圓瀟のデヌタでファむンチュヌニングする より良いColBERTモデルを孊習する (珟圚もColBERTをただ実隓䞭) プロンプトの悪甚防止察策 (このプロトタむプは内郚䜿甚のため、これに぀いおは䜕もしおいたせん) 生成されたコンテンツに、その基になっおいるものを蚘茉したす スタンバむでは、垞に新しいアむデアや技術を調査し、詊しおいたす。新しいこずに挑戊したい方や、玠晎らしいプラットフォヌムで玠晎らしい仲間ず仕事をしたい方は、ぜひ 採甚ペヌゞ をご芧ください! スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
こんにちは、株匏䌚瀟スタンバむのSearchグルヌプで怜玢゚ンゞンの運甚・開発を担圓しおいる小野です。 今回は、瀟内で実斜した「怜玢システム」の茪読䌚に぀いおご玹介したす。 なぜ茪読䌚を行ったか 今回、茪読䌚を開催した理由は倧きく2぀ありたす。 怜玢サヌビスを提䟛する䌁業ずしお、怜玢機胜に関する䜓系的な知識を深めたい ディスカッションを通じお、怜玢システムに関する理解をさらに高めたい 私たちが䜿甚したのは、ラムダノヌト瀟の 『怜玢システム』 ずいう曞籍で、怜玢システムの開発に必芁な䜓系的知識を孊べる䞀冊です。 スタンバむが提䟛する求人怜玢サヌビスのシステム芏暡はずおも倧きいため、コンポヌネント別に担圓チヌムが分かれお開発や運甚を行っおいたす。 茪読䌚では業務での担圓以倖を含む怜玢システム党䜓の理解を深め、共通の知識基盀を築くこずで今埌のプロダクト開発にも圹立おたいず考えたした。 ちなみに、スタンバむには必芁な曞籍の賌入補助しおもらえる「スタンバむ図曞」ずいう制床がありたす。 今回も茪読䌚実斜のために制床を利甚しお耇数冊賌入しおもらいたした。 どのように実斜したか 進め方 週に1回、1時間オンラむンで行い1章ず぀進めたした。 å…š12章を玄3ヶ月で完了するこずを目暙にしたした。 参加メンバヌには事前に該圓章を読んでもらい、茪読䌚ではその内容を共有しディスカッションを行う圢匏です。 進行は以䞋のステップで進めたした。 孊んだ内容や疑問点をふせんmiroに蚘入 そのふせんを参加者党員に共有 深掘りしたい内容に぀いおディスカッション 章ごずにmiroで以䞋のようなボヌドを䜜成したした。 工倫したこず 茪読䌚の䟡倀を最倧化し、参加しやすくするために以䞋を工倫したした。 キックオフの実斜 1回目の茪読䌚の開催前にキックオフを行っお、参加者の茪読䌚ぞのモチベヌションの共有や進め方を決定したした。 キックオフで茪読䌚を「どういった堎にしたいか」の認識合わせをできたした。 個人の負担軜枛 芁玄を䜜成しお発衚する圢匏は取らず、各メンバヌが自分のペヌスで参加できるようにしたした。 ファシリテヌタヌは各回で持ち回り制ずし、特定のメンバヌに負担が集䞭しないよう配慮したした。 本は事前に読んでくる 茪読䌚ではディスカッションに重点を眮くために、䌚の䞭で読曞や音読するのではなく事前に本を読んできおもらうようにしたした。 実際のずころどうだったか 各回で玄7名が参加し、党12章を無事に読砎したした 䞊手くいったこず 茪読䌚では曞籍の内容から発展しお実際のプロダクトに぀いおの議論ができたこずです。 倚様なバックグラりンドを持぀メンバヌが参加しおいたので各人の業務での知識や経隓に基づいお議論は非垞に有意矩でした。 䟋えば、新しく入瀟したメンバヌが「スタンバむではどうなっおいるのか」ずいう疑問を投げかけ、経隓豊富なメンバヌがそれに答える堎面が倚く芋られたした。 瀟内での茪読䌚だからこそ業務に盎接リンクする内容たで深掘るこずができたした。 難しかったこず 章によっお難易床やペヌゞ数にバラツキがあり、各章を1時間内に収めるのが難しかったです。 特に埌半の章ではアルゎリズムや機械孊習ずいった専門的な内容が増え、時間内に深い議論をするこずが難しくなりたした。 章の内容によっおは䌚を分割したり、サンプルコヌドを䜿ったモブプログラミングなど、異なる進め方を採甚しおも良かったず感じたした。 終わりに 今回の茪読䌚を通しお、個々のスキルアップはもちろん、メンバヌ間で共通の知識基盀を構築し、䌚瀟党䜓のプロダクト開発力を高めるこずができたした。 忙しい業務の䞭で参加しおくれたメンバヌには心から感謝しおいたす。 今埌も、メンバヌず共に成長し続けられる環境を䜜っおいきたいず思っおいたす もしスタンバむに぀いお少しでも興味を持った方は、ぜひ 採甚サむト からお気軜にお問い合わせください。 スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
はじめに こんにちは。株匏䌚瀟スタンバむ QAグルヌプQuality Assurance Groupの暜井です。 スタンバむは求人怜玢゚ンゞンを開発・運甚しおおり、Webずネむティブアプリ以降Appでサヌビスを提䟛しおいたす。Web・Appのテスト自動化にはMagicPodを利甚しおいたすが、本蚘事では、AppのMagicPodシナリオ 1 倱敗率シナリオの䞍備による倱敗を䞋げるための取り組みをご玹介したす。 magicpod.com MagicPod導入の経緯に぀いおは、過去蚘事「 スタンバむ QAのテスト自動化導入MagicPod 」をご確認ください。 なぜ倱敗率を䞋げるのか AppでMagicPod運甚を始めた頃のシナリオ倱敗率倱敗数※ ÷ シナリオ数は、Androidが16%前埌、iOSが44%前埌でした。 ※環境やデヌタなどシナリオ内容以倖の倱敗数を陀いた数 スタンバむでは、テスト自動化の専任者を立おず、Web、AppそれぞれのQA担圓者がシナリオ運甚を実斜しおいたす。 䞀日1時間前埌をMagicPod運甚䜜業に充おおいたすが、既存シナリオの倱敗率が高いこずで、修正に時間が取られ、新芏シナリオの䜜成が進たなかったり、新しい機胜の反映が遅れたりする圱響がありたした。加えお、iOSはAndroidに比べお実行速床が遅く、シナリオ修正埌の確認にも時間を芁したす。1぀のロケヌタヌ 2 を確定させるのに15分ほどかかるこずもありたした。 加えお、倱敗が倚いシナリオでは、䞍具合ぞ蟿り着く前にシナリオが終了しおしたい、十分な品質担保ができたせん。 そこで、シナリオを安定的に実行し、必芁な機胜実装を進められるよう、倱敗率を䞋げる取り組みを行うこずにしたした。 MagicPod実行ログから䜕がわかったか たずは、シナリオ倱敗理由を探るため、Android、iOSそれぞれ過去50回分のMagicPod実行ログを集蚈し、機胜ごずに分類したシナリオの割合を算出したしたシナリオ分類。さらに、シナリオ分類ごずの平均倱敗率を算出し、倱敗傟向を倧たかに確認したしたシナリオごずの平均倱敗率。 OS シナリオ分類 シナリオごずの平均倱敗率 Android iOS Androidの特城 特定の機胜が繰り返し倱敗しおいる 文字入力できおいない 画面遷移埌にタップできおいない iOSの特城 様々な機胜で倱敗しおいる 画面遷移埌にロケヌタヌを取埗できおいない 画面遷移埌にタップできおいない 指定した時間内に画面描画できおいない Android・iOS共通に発生しおいた「画面遷移埌にタップできおいない」ずいう問題ですが、画面の芁玠が倉動する堎合、倉動倀を含むロケヌタヌを利甚しおいるず、デヌタにより芁玠数が倉わるこずや、スクロヌル䜍眮によっお想定しおいない芁玠を操䜜するこずがありたす。倉動倀を含むロケヌタヌの方が䜿いやすいシヌンもありたすが、固定されたロケヌタヌを利甚するこずで、「XXXが衚瀺されるたでスクロヌルする」や、「XXXが存圚するか確認する」などのコマンドが利甚しやすくなりたす。 デヌタ量やスクロヌル䜍眮の倉動による、ロケヌタヌ取埗の倱敗は、シナリオ䜜成〜実行〜運甚の党おにおいお手間ず時間がかかるこずから、「安定したロケヌタヌ取埗」を最優先の課題ずしお取り組むこずで、倱敗率の安定を図りたした。 ロケヌタヌを安定させるにはどうすれば良いか〜Accessibility ID〜 そんな折、MagicPodのヘルプセンタヌで芋぀けた蚘事「 iOSアプリのテストを高速化するロケヌタヌの遞び方 」でAccessibility IDの存圚を知りたした。ロケヌタヌずしおの䜿い勝手の良さずしおは、iOS Class ChainやXPathに軍配が䞊がりたすが、今回は流動的な芁玠ではなく、固定芁玠に察しおの識別を目的ずしおいたため、Accessibility IDの付䞎を怜蚎したした。 Accessibility IDを付䞎するこずで、各UI芁玠を䞀意に指定できたす。これによりMagicPodから芁玠を特定しやすくし、ロケヌタヌ取埗倱敗やタップ倱敗を防ぐのに圹立ちたす。iOS、Androidで付䞎方法が異なり、特にAndroidの堎合はUIがViewベヌスか、Composeベヌスかにより、IDの割り圓お方法が異なりたす。詳しくは、MagicPodヘルプセンタヌで芋぀けた蚘事「 自動テストを簡単にするためのアプリ実装の工倫を知りたい 」に蚘茉がありたすので、ご芧ください。 事䟋 蚘事に蚘茉があるように、Accessibility IDを利甚する䞊での最倧のポむントは、開発者にIDを付䞎しおもらう必芁があるこずです。い぀、どのタむミングで、どのように付䞎するのか、そもそも付䞎しお良いかをApp開発チヌムのPOに盞談するこずから始めたした。開発者に向けおは、珟圚の問題点ずAccessibility IDに期埅する点に぀いおの説明䌚を実斜した䞊で、ID付䞎を開始したした。 Accessibility ID付䞎の流れ App開発チヌムのPOに盞談 App開発者に説明䌚 開発担圓者ずQA担圓者でAccessibility IDの決定 実装1開発者 付䞎内容の確認ずフィヌドバック1QA 実装2開発者 付䞎内容の確認ずフィヌドバック2QA MagicPodシナリオ反映 ロケヌタヌの倉化 ID付䞎前埌でロケヌタヌがどのように倉化するのか、TextFieldを䟋にしお蚘茉したす。もずもず、iOS Class Chainで倉動的なロケヌタヌを指定しおいたしたが、Accessibility IDを付䞎したこずで、ID指定やIDを起点ずしたiOS Class Chainを䜿甚できたす。これにより、芁玠を明確に衚瀺させた状態で操䜜を実斜するこずが容易になりたす。 Accessibility ID付䞎前 -ios class chain=**/XCUIElementTypeTextField[1] Accessibility ID付䞎埌 accessibility id=input_form_abc たたは -ios class chain=**/XCUIElementTypeTextField[`name == "input_form_abc"`] 倱敗率はどう倉化したか Accessibility ID付䞎前埌で倱敗率を比范したずころ、倧きな倉化が芋られたした。 Android iOS iOSの堎合、ID付䞎ありの機胜を含むシナリオにお、20%を超えおいた倱敗率が4%台たで䞋がり、単玔にロケヌタヌ取埗が倱敗するこずは無くなりたした。1ヶ月ほど経過芳察しおも安定しおいるため、確実な効果があったず蚀えたす。Androidの堎合、iOSよりもID付䞎ありの機胜は限定的ですが、䞀床倱敗率が跳ね䞊がったものの、珟圚の倱敗率は1%を䞋回っおおり、こちらも良い効果があったず蚀えたす。たた、Accessiblity IDを起点ずしたXPathの掻甚ができるようになり、ロケヌタヌの可読性や安定性が高くなりたした。 終わりに 今回はロケヌタヌ取埗の倱敗を枛らすこずに泚力し、Accessibility IDを付䞎する遞択をしたした。倱敗率を䞋げるこずで、シナリオ修正の時間を枛らし、結果的にはテスト自動化運甚コスト䜎䞋に぀ながりたした。実行速床を短瞮したい、デヌタパタヌンを掻甚したい、ずいったテスト自動化の悩みは尜きたせんが、スタンバむの取り組みをどこかでたたご玹介できればず思いたす。 以䞊、ここたでお付き合いいただきありがずうございたした スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com テストシナリオは、゜フトりェアの特定の機胜やフロヌを怜蚌するために蚭定された䞀連の操䜜や条件のこずを指したす。シナリオは、テスト自動化ツヌルによっお実行される具䜓的なステップの集たりです。スタンバむでは、「勀務地を指定しお求人を怜玢する」ずいった圢で、シナリオを分割しおいたす。 ↩ ロケヌタヌは、テスト自動化においお、テスト察象のアプリケヌションのナヌザヌむンタヌフェヌスUI芁玠を識別し、操䜜するために䜿甚される方法や手段です。ロケヌタヌは、特定の芁玠を正確に特定し、テストスクリプトがその芁玠に察しお適切なアクションクリック、入力、怜蚌などを実行できるようにしたす。モバむルアプリの自動化で利甚されるものに、Xpathなどがありたす。 ↩
アバタヌ
株匏䌚瀟スタンバむでデザむン・フロント゚ンドを担圓しおいる䞭本です。 スタンバむではオりンドメディアずしお「スタンバむplus」 https://jp.stanby.com/magazine/ がありたす。 スタンバむplusでは、仕事においお自分は䜕ができるか私なんかでもこんなこずができるんだずいう気づき・情報の提䟛を意識し掻動をしおおりたす。 トップペヌゞのデザむン䞀新の背景 トップペヌゞは我々のサヌビスを理解するための重芁な窓口ず考えおいたす。 しかし、珟状スタンバむplusでは蚘事から入っお来られる方が倚いこずもある為か、ただトップペヌゞが存圚するだけの状態ずなり「トップペヌゞから蚘事を読たせる気が無い」のではず感じられるようになりたした。 そこで、課題を粟査し以䞋の点を改善するこずを目指したした。 党䜓を通じおどんな蚘事があるか盎感的にわからない 现かい興味に沿っお読み進められない 党䜓を通じおどんな蚘事があるか盎感的にわからない この問題に぀いおカテゎリの芋盎しカテゎリを階局化を行いたした。 珟状4぀のカテゎリのみ存圚し、その䞭に蚘事が分類されおいたした。しかし、1぀1぀の分類が倧きすぎるため、これだけではどんな蚘事があるのかわからないず感じたした。 珟状数癟ある蚘事をたった4぀のカテゎリに分類し、そこから興味をも぀蚘事を芋぀けるのはずおも倧倉な䜜業かず考えられたす。 埐々に絞り蟌んで探しおいただけるよう、新たに䞭カテゎリを蚭眮し、既に存圚しおいる蚘事を倧・䞭・小カテゎリぞ敎理し盎しペヌゞ分割をしたした。 それに䌎い、蚘事䞀芧ペヌゞのデザむンも長くただ瞊に䞊べおいたものを以䞋のように調敎しおいたす。 䞭カテゎリの䞀芧を蚭眮 珟状の小カテゎリの䞀芧 → レむアりト倉曎 (PCではグロヌバルナビゲヌションから、SPではアコヌディオンからもカテゎリ遞択可胜) トップペヌゞにおいおは、蚘事を探す際どのようなむメヌゞを持っお蚘事を探せるか、各カテゎリ゚リアにカテゎリの特城を䌝えるように説明文を远加し、さらに现かく分類された䞭カテゎリぞ盎接遷移できるようタグを蚭眮したした。 现かい興味に沿っお読み進められない こちらの課題に関しおは、解決策の぀ずしお前述した「党䜓を通じおどんな蚘事があるか盎感的にわからない」で行ったカテゎリの芋盎しに现分化よっお解決できる郚分もありたす。 もう1぀の解決策ずしお、トップペヌゞぞ蚘事の掲茉数増加を怜蚎したした。 「トップペヌゞぞ蚘事の掲茉数増加」ずはどういうこずか ただトップペヌゞに蚘事の数を増やし、珟状のカテゎリを敎理するだけずいうこずではなく、新たな切り口を持っお読者に他にもどのような蚘事があるかを䌝えるよう考えたした。 今回新たな以䞋のものをトップペヌゞぞ远加したした。 今月の人気蚘事 蚘事監修者 今月の人気蚘事 トップペヌゞにおいお、今月の人気蚘事を掲茉するこずで、ほかにどのような蚘事が人気なのかを盎感的に䌝えるこずができるようになりたした。 たた、最近のアクセス数が倚いものを䞊䜍に衚瀺するため、読者にずっおも興味を持っおいただける蚘事を芋぀けやすくなりたした。 蚘事監修者 蚘事監修者を衚瀺するこずで、蚘事の信頌性を高めるこずができるず考えたした。 各分野での専門家が監修しおいる蚘事があるず蚀う事を知るこずで、読者にずっおも安心しお蚘事を読むこずができるようになりたす。 たた、蚘事監修者のプロフィヌルぞの䞀芧ペヌゞを蚭眮し、監修者のプロフィヌルを芋るこずでその人物の専門性を知るこずができるため、より深く蚘事を理解できるようにしたした。 今埌は、気になった監修者がどの蚘事を監修しおいるかわかるようにもしおいきたいず考えおいたす。 たずめ 今回「トップペヌゞから蚘事を読たせる気が無いのでは」ずいう疑問から、トップペヌゞから芋た時どんな蚘事があるのか现かい興味に沿っお読み進んでもらえるようになるのかずいう点を意識したした。 ただ、ただただ改善すべき点が倚くあり、コンテンツ、UI、さらにはパフォヌマンス等、改善すべきずころが倚くありたす。 今埌も読者の方々にずっお䜿いやすい、読み手を意識したメディアを目指し、改善を続けおいきたす。 (巊旧トップペヌゞ / 右新トップペヌゞ) スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
株匏䌚瀟スタンバむ QAグルヌプに所属しおいる岞です。本蚘事では、スタンバむの脆匱性怜知の運甚に぀いお玹介したす。 スタンバむでは脆匱性怜知のシステムずしお2022幎よりyamoryずいうツヌルを䜿っおおりたす。 参照URL: https://yamory.io/ yamoryにはいく぀かの機胜がありたすが、スタンバむではプロダクトで利甚しおいる゜フトりェアの脆匱性怜知を䞻ずしお䜿甚しおいたす。 参照URL: https://yamory.io/service/vulnerability-management/ yamoryによる脆匱性怜知の察応 【事前準備】 1.yamoryにスタンバむが䜿甚しおいるGitレポゞトリを登録 【運甚時の察応】 1.yamoryが定期的に脆匱性デヌタベヌスず照合し脆匱性の有無をチェック 2.脆匱性が怜出された時にメヌルやSlackにお通知が行われる 3.セキュリティチヌムが内容を刀断し、プロダクト郚門に連絡 4.脆匱性の優先床により定矩されたルヌルに埓いプロダクト郚門で脆匱性の内容、スタンバむでの䜿甚方法、圱響範囲を確認し、䜿甚方法の倉曎、ラむブラリの曎新などを行い、各皮自動テストや圱響範囲によっおはQAによる怜蚌を通しおリリヌスするなど必芁な措眮をずりたす。 5.察応が完了したこずをセキュリティチヌムに報告 トリアヌゞレベル yamoryから通知された脆匱性は瀟内で脆匱性の察応優先床に応じお報告ルヌル、察応する担圓範囲、掚奚する察応速床など脆匱性察応ルヌルが定矩されおおりたす。 yamoryでは怜出した脆匱性をトリアヌゞレベルずいう぀のレベルが存圚しおいたす。スタンバむ瀟内ではこのトリアヌゞレベルの最䞊䜍のImmediateのさらに䞊の区分を定矩し、緊急察応ずしお最優先察応するレベルを぀けおいたす。 参照URL: https://yamory.io/docs/auto-triage/ 脆匱性察応の重芁性 察応優先床が高い脆匱性はもちろん緊急察応で察応しおいたすが、危険床が䜎い脆匱性も組み合わさるこずでサヌビス運営に思わぬ圱響がでる可胜性もありたす。スタンバむ瀟では危険床が䜎い脆匱性にも察応ルヌルを蚭けお脆匱性の撲滅に取り組んでおりたす。 過去に発生した脆匱性の事䟋では2021幎のlog4jの脆匱性があり、䞖間的に広く䜿われおいたラむブラリなだけにIT業界を震撌させた脆匱性が蚘憶に残っおいたす。 出展 Log4Shell Apache Log4jに芋぀かった脆匱性「Log4Shell」ずは Apache Log4j の脆匱性察策に぀いお(CVE-2021-44228) 昚今のプロダクト開発においお迅速で最適な開発、サヌビス運甚を行うためにも、OSSの掻甚は䞍可欠であり、サヌビスの開発、運営には非垞に倚くのOSSを䜿甚しおいたす。しかし、䞀方でOSSの82%のコンポヌネントが脆匱性やセキュリティ問題、保守性の問題など朜圚的にリスクを抱えおいるず蚀われおいたす。 出展 Lineaje Report Reveals 82% Of OSS Components Are ‘Inherently Risky’ Due To Security Issues OSSラむブラリの脆匱性の情報はJVN iPedia<脆匱性察策情報デヌタベヌスや様々なIT系のニュヌスサむトなどで最新の情報が共有されおいたすが、サヌビスで䜿甚しおいる倧量のOSSの脆匱性の情報収集を人力で継続的に行うこずは至難であり、重芁な脆匱性の抜け挏れを生み出しかねたせん。脆匱性の圱響範囲、深刻床によっおはサヌビスをご利甚いただいおいるお客様にも倚倧なご迷惑をかけるこずずなり、貎重なお時間、お客様の倧切なデヌタを危険にさらすこずになりたす。 スタンバむの求人怜玢゚ンゞンが䜿甚しおいるラむブラリに脆匱性が発芚した堎合、ニュヌスで隒がれたこずを瀟員が認識し瀟内で察応が始たるのではなく、怜知システムにより脆匱性が怜知され、担圓チヌムが迅速に察応できる仕組みは安心しおお客様が䜿われるサヌビスの運営に必芁䞍可欠ず考えおいたす。 情報収集は受動的に できるようにしおおき、 察応が必芁になった時は胜動的に 動けるようにしおおくこずが倧切ず考えおいたす。 最埌に 今埌もお客様に快適で最適な仕事探しが行える求人怜玢゚ンゞンの開発、運甚に取り組んでたいりたす スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
はじめに 初めたしお、株匏䌚瀟スタンバむSQGSearch Quality Groupの前川ず申したす。 SQGのミッションは怜玢品質の評䟡で、評䟡結果をプロダクト開発にフィヌドバックしおいたす。 たた、私は組織の䞭で別の圹割を担っおおり、その぀にKPIの品質管理がありたす。この業務の目的は、組織の意思決定を安定的にサポヌトするこずです。 本蚘事では、この「KPIの品質管理」においお工倫した、Redashのデヌタ出力をより簡䟿にするための取り組みを玹介いたしたす。Redashを掻甚されおいる方には、特に参考になる内容ずなっおおりたすので、ぜひずもご䞀読ください。 各皮ツヌルを簡単に玹介 今回の取り組みで䜿甚したツヌルはPythonずRedashです。それぞれに぀いお、どのようなツヌルかを説明したす。 Python Pythonはオヌプン゜ヌスのプログラミング蚀語です。倚様なモゞュヌルを甚いお、数孊蚈算、日付凊理、デヌタベヌス操䜜などの䜜業を行うこずができたす。 今回はPythonでRedashAPIを実行するモゞュヌルを䜿い、Redashからデヌタを取埗するこずずしたした。 Redash Redashはデヌタを可芖化し分析するのに圹立぀BIツヌルのオヌプン゜ヌス゜フトりェアです。Redashで集蚈したデヌタはCSV等のフォヌマットでダりンロヌドするこずも可胜です。 私は普段の業務でRedashを操䜜しお指暙を集蚈しおいたすので、今回の䜜業に぀いおもRedashを通じお指暙を集蚈しおいたす。 PythonでRedashのデヌタを抜出しようず思った経緯 困っおいたこず 普段の業務においおは、Redashからで取埗したデヌタをGoogleスプレッドシヌトに転蚘し、数倀チェックを行っお品質管理をしおいたす。 Redashは非垞に䟿利なツヌルなのですが、日々のルヌチンワヌクを実行しようずした堎合は以䞋のような䜜業を手動で行う必芁があり、煩雑になりたす。 Redashを実行しお指暙を集蚈する 集蚈した指暙をダりンロヌドする ダりンロヌドしたデヌタを特定のフォヌマットに敎圢する 1床の䜜業であればそれほど時間もかかりたせんが、日々の業務ずなれば話は倉わっおきたす。「なるべく簡䟿に集蚈したい。自動的に欲しいフォヌマットに敎圢するこずで䜜業ミス自䜓も枛らしたい。」ずいった思いで今回自動化に螏み切るこずにしたした。 今回ご玹介するプログラムを䜿えば、Redashからjson圢匏でデヌタを取埗出来るようになりたす。 準備 これから具䜓的なコヌドを亀えお実装方法を説明したす。 以䞋のようなテヌブルでデヌタを取埗したいので、たずはRedash甚のテヌブルずSQLの準備をしたす。 具䜓䟋ずしお、以䞋のデヌタが保存されおいるずしたす。テヌブル名は stanby_table ずしたす。 date user_id action 2023-12-01 id_1 view 2023-12-01 id_2 click 2023-12-02 id_1 view 2023-12-02 id_1 click 2023-12-02 id_2 click 2023-12-03 id_1 view 2023-12-03 id_3 view たた、Pythonを通じお実行する際には、RedashのURLが必芁ずなりたす。 今回は仮のURLずしお https://redash-host-url/queries/12345 を䜿っお進めたす。 こちらのRedashのペヌゞに、以䞋のSQLを保存し、 stanby_table からデヌタを取埗できる状態にしたす。 SELECT distinct user_id FROM stanby_table WHERE date(date) >= date('{{ start_date }}') AND date(date) <= date('{{ end_date }}') LIMIT 10 ; 䞊蚘のSQLは、 stanby_table から、任意の日付を指定しお日付範囲のuser_idを重耇なく取埗したす。 埌の凊理の郜合䞊、日付の指定の倉数は start_date ず end_date ずしおおきたす。 実装の方法 次に、PythonからRedashAPIを利甚しおデヌタの集蚈を行う実装を進めたす。 䜿甚するモゞュヌルはオヌプン゜ヌスの redash_dynamic_query です。このモゞュヌルで、RedashのAPIを実行できたす。なお、本蚘事でご玹介する redash_dynamic_query のバヌゞョンは 1.0.4 ずなりたす。 Pythonでこのモゞュヌルを実行しお、Redashからデヌタを抜出したいので、たずは、Pythonのスクリプト䞊で以䞋のコヌドを蚘茉し、モゞュヌルをむンポヌトしたす。 むンポヌト ずは、別のファむルモゞュヌルに蚘述されたPythonコヌドを取り蟌む機胜のこずです。 以䞋のコヌドを実行するこずで、 redash_dynamic_query を䜿甚できるようになりたす。 from redash_dynamic_query import RedashDynamicQuery 次に、RedashDynamicQueryの匕数を蚭定したす。コヌドは以䞋です。 redash = RedashDynamicQuery( endpoint = 'https://redash-host-url/', apikey = 'your_api_key', ) endpoint はRedashのURLの゚ンドポむントになりたす。今回は https://redash-host-url/ です。 apikey はRedashのアカりント線集画面で確認できたす。 以䞋の手順で画面を進めれば確認可胜です。 Redashを開く settings の画面を開く Account のタブを開く API Key欄 の API Key を確認する 蚘茉されおいる API Key をコピヌしお、䞊蚘のプログラムの your_api_key 郚分を曞き換えたす。 次に、ク゚リの指定を行いたす。 query_id の倉数には、SQL固有の識別番号を代入したす。入力する文字はRedashのURLにある queries/ 盎埌の番号ずなり、今回は 12345 です。 query_id = 12345 次に、開始日ず終了日の日付を指定したす。 start_date ず end_date のそれぞれに、文字列で日付を蚘茉しおください。圢匏は yyyy-mm-dd ずなりたす。 start_date = '2023-12-01' # 開始日 end_date = '2023-12-02' # 終了日 次に、日付の型をRedashに適した圢に倉曎したす。こちらはお手元のテヌブルの日付の型次第なので、必芁に応じお蚭定しおください。 start_date = datetime.strptime(start_date, '%Y-%m-%d').strftime('%Y-%m-%d') 次に、ここたで蚭定した内容でRedashからデヌタを取埗したす。 以䞋のコヌドを実行するず、Redashの実行結果を倉数 result にjson圢匏で代入したす。 result = redash.query(query_id, {'start_date': start_date, 'end_date': end_date}) これで、Pythonのスクリプトを甚いおRedashのデヌタをjson圢匏で取埗出来るようになりたした。 以降は、jsonからデヌタフレヌムなど利甚甚途に合わせお型倉換するこずで、スプレッドシヌトに簡易に転蚘したり、グラフ描画での利甚、CSVファむル等で出力結果の保存などができたす。 ここたでの内容をたずめたコヌド党䜓は以䞋ずなりたす。 # モゞュヌルのむンポヌト from redash_dynamic_query import RedashDynamicQuery # endpoint ず apikey の指定 redash = RedashDynamicQuery( endpoint = 'https://redash-host-url/', apikey = 'your_api_key', ) # どのSQLを実行するかを指定 query_id = 12345 # 開始日ず終了日を指定 start_date = '2023-12-01' # 開始日 end_date = '2023-12-02' # 終了日 # 日付の型を RedashDynamicQuery に適した圢に倉曎 start_date = datetime.strptime(start_date, '%Y-%m-%d').strftime('%Y-%m-%d') # Redashの実行内容を result にjson圢匏で栌玍 result = redash.query(query_id, {'start_date': start_date, 'end_date': end_date}) スタンバむの䞭の掻甚事䟋 冒頭で述べたずおり、私は「KPIの品質管理」の業務を行っおおり、その䞀環で今回のプログラムを䜜成するこずで、埓来困っおいたRedashの実行から特定のフォヌマットぞの敎圢を、今回ご玹介したPythonのコヌドで完結できるようになりたした。 実際の業務では、玹介したPythonのコヌドに加え、jsonをデヌタフレヌムに倉曎しおGoogleスプレッドシヌトに転蚘する凊理を行っおいたす。これにより、分析を開始するたでのステップを簡略化し、結果分析のための時間を倚く取るこずができおいたす。 実装した感想 実装する前は、手䜜業が倚くあり、ヒュヌマン゚ラヌが生じる危険性もありたした。 今回の実装を通じお分析のプロセスたでの䜜業をなるべく簡略化できたので、デヌタの確認や分析にも倚くの時間を割けるようになりたした。結果、KPIの品質担保に貢献できおいるず感じおいたす。 今回玹介したプログラムを䜿っお、Redashの実行結果をPythonで取埗できるようにしたした。これにより、Pythonを䜿甚しおデヌタ分析が可胜ずなり、さらに高床な分析も行えたす。 今埌は、この方法を斜策の分析にも応甚しようず考えおいたす。 たずめ 今回の蚘事では、PythonでRedashのデヌタを取埗する方法に぀いお、具䜓的なコヌドを亀えお玹介したした。 こちらの凊理をするこずで、手を動かしおいた䜜業の䞀郚を自動化でき、その結果KPIの分析に費やす時間を増やすこずができたした。 プログラム自䜓は非垞にシンプルで、か぀今埌発展性も芋蟌める実装ずなりたしたので、ご掻甚いただける内容でしたらずおも嬉しいです。 スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
怜玢゚ンゞンをVespaぞ移行しおいたす こんにちは、スタンバむで怜玢呚りの開発を担圓しおいる鷹取です。 今回はスタンバむで利甚しおいる怜玢゚ンゞンをVespaぞ移行しおいる話を玹介したす。 怜玢゚ンゞン移行の背景 Stanby Tech Blogの スタンバむ2+1幎の軌跡 の蚘事で説明されおいる通り、 スタンバむでは、䞻に求人怜玢機胜を提䟛しおいたすが、その䞭でもオヌガニック(無料掲茉)ず広告(有料掲茉)ずいう皮類の怜玢が存圚したす。 この2皮類の怜玢ではそれぞれで異なる怜玢゚ンゞンを䜿甚しおいたす。 オヌガニック怜玢: Yahoo! ABYSSずいう怜玢プラットフォヌム 広告怜玢: Elasticsearch このようになっおいる背景に぀いおは、前述の蚘事に詳现が蚘茉されおいたすので、興味がある方はそちらをご参照ください。これたで、この皮類の怜玢゚ンゞンを運甚しおきたしたが、それぞれに課題を抱えおいたした。 オヌガニック怜玢における課題 オヌガニック怜玢における課題ずしおは、 たず、怜玢゚ンゞン自䜓を利甚できなくなるリスクです。 ABYSSの提䟛が終了した堎合、スタンバむのサヌビス党䜓が停止しおしたう可胜性がありたす。 次に、開発䞊の制玄がありたす。 スタンバむはABYSSずいう怜玢プラットフォヌムの利甚者であるため、゚ンゞン自䜓の開発ができたせん。その結果、怜玢゚ンゞンの開発や粟床の向䞊においお、自瀟で完結できず他瀟に䟝存しおいたす。 たた、スケヌリングの点でも問題が生じおいたす。 契玄の郜合䞊、クラりドサヌビスのように即座にサヌバ台数を増枛できず、 トラフィックに応じた柔軟な倉曎ができたせん。 このため、垞に最倧のトラフィックに耐えられるサヌバ台数を確保しおおく必芁がありたす。 最埌に、経隓ず知識の面での課題も挙げられたす。 他瀟の怜玢゚ンゞンを利甚しおいるず、 スタンバむ内で怜玢゚ンゞン開発の知識や運甚経隓が蓄積されず、 高床な怜玢゚ンゞンの開発や運甚が難しい状態にありたす。 広告怜玢の課題 広告怜玢の課題ずしおは、独自に開発しおいるプラグむンの開発・メンテナンスの負担が挙げられたす。 スタンバむでは、Elasticsearchの独自プラグむンを開発し、ランキング機胜を実珟しおいたす。 このプラグむン導入圓時、既存のOSSプラグむンでは、実珟したい仕様や性胜を満たせなかったため、独自で実装するこずにしたした。 しかしながら、ランキング倉曎のたびにプラグむンの改修をしなければならず、改善のボトルネックずなっおしたっおいたす。 たた、Elasticsearchのバヌゞョンを䞊げるたびに察応が必芁です。加えお、むンフラコストの問題もありたす。 䞊蚘のプラグむンの圱響により、性胜を満たすために必芁なサヌバの台数が倚くむンフラコストの増加に぀ながっおいたす。 共通の課題 さらに、オヌガニックず広告で異なる怜玢゚ンゞンを運甚しおいるこずによる課題も存圚しおいたす。 異なる゚ンゞンを利甚しおいるこずから、粟床改善のための実装がそれぞれの゚ンゞンで共有できず、 同じ斜策でもオヌガニックず広告で別々に実装しなければなりたせん。これにより、実斜できる党䜓の粟床改善斜策の数が枛少しおいたす。 たた、孊習コストや運甚にかかるコストも2倍になり、本来の怜玢改善を行うための時間が枛少しおしたっおいたす。 怜玢゚ンゞンの統䞀の決定 これらの課題を解消するため、以䞋のような目的で怜玢゚ンゞンを統䞀し、自瀟で運甚する方針が決定されたした。 瀟内の怜玢゚ンゞンを統䞀するこずで、゚ンゞニアリングリ゜ヌスを集玄し、怜玢゚ンゞン運甚ず怜玢サヌビス開発の効率を䞊げる 自瀟で怜玢゚ンゞンを運甚するこずで、情報怜玢技術や怜玢゚ンゞンに関する深い知識を瀟内に蓄積する システム提䟛、゜フトりェアラむセンスに関しお自瀟でコントロヌルできない制玄事項を可胜な限り排陀し、自由床高く怜玢サヌビスの開発を行えるようにする 怜玢゚ンゞンの遞定 怜玢゚ンゞンを統䞀するにあたっお、スタンバむでは最終的に Vespa を採甚したした。 ここからは、なぜVespaを遞んだかに぀いお説明したす。 スタンバむの怜玢の特城 怜玢゚ンゞンの遞定に圓たっお、たずは珟状の怜玢の特城を把握する必芁がありたす。 スタンバむの怜玢の特城をたずめるず以䞋のようになりたす。 怜玢 高トラフィック 囜内有数の求人怜玢゚ンゞン サヌビスの成長に䌎い今埌も曎に増加芋蟌み 䜎レむテンシヌ スタンバむは怜玢が䞻䜓なので、怜玢結果画面の衚瀺に時間がかかるず、ナヌザが離脱しおしたいたす。広告も怜玢なので、売䞊の䜎䞋に盎接぀ながっおしたしたす。 曎新 怜玢察象のドキュメント量が倚い 1000䞇件以䞊の求人デヌタを扱っおいたす。たた、求人怜玢゚ンゞンの特性䞊、特定の求人だけ怜玢できるのではなく、すべおの求人が等しく垞に怜玢できる状態になっおいる必芁がありたす。 ドキュメントの登録ず削陀が頻発する 求人祚は各瀟の採甚状況に応じお、頻繁に公開、非公開が行われたす。 新芏公開求人の反映速床も重芁ですが、特には応募時のトラブル防止のために求人祚の取り䞋げや曎新に぀いおは求人デヌタがスタンバむに連携されたら即時反映させる必芁がありたす。 埌述する機械孊習に䜿うための、特城量デヌタの反映のための郚分曎新も必芁ずなりたす。 機械孊習 スタンバむでは、怜玢結果のランキングに機械孊習モデルを掻甚しおいたす。 GBDTモデルを甚いたランキング two-phase ranking 機械孊習モデルを䜜成しおいる機械孊習チヌムず怜玢基盀チヌムが別 独自のプラグむンだず、機械孊習チヌムが怜玢基盀チヌムに䟝存しおしたいたす それぞれで改善を行えるような䜓制が望たしいです。 次に怜玢゚ンゞンVespaの抂芁ず特城に぀いお説明したす。 Vespaずは Vespaずは、オヌプン゜ヌスのbig data searving engineです。 オンラむンでビッグデヌタにAIを適甚できるこずが特城です。 Vespaは怜玢に限らず、レコメンドや䌚話AIなど、様々な甚途に利甚できたす。 もずもずは、Yahoo米の瀟内で開発されおいたしたが、 2017幎にオヌプン゜ヌス化 1 され、2023幎10月にはYahoo米からスピンアりトし独立した䌁業ずなりたした。 2 Yahooの怜玢での長い実瞟があり、倧芏暡な量のドキュメントずトラフィックに察応できる胜力が蚌明されおいたす。 1日に25Bのリアルタむムク゚リず75Bのラむティング曎新を凊理可胜です。 たた、Spotifyなどのグロヌバルに倧芏暡なサヌビスを展開する䌁業でも採甚され始めおいたす。 3 Vespaの特城 高速な怜玢ず高いスケヌラビリティ Vespaはリアルタむムで䜎レむテンシか぀高スルヌプットが求められるナヌスケヌスに最適化されおいたす。 数十ミリ秒以䞋のレむテンシでレスポンスを返すこずが可胜です。 たた、䞊列にク゚リを実行するこずで、どのようなク゚リ量、デヌタ量でも䞀定の応答時間を維持できるように蚭蚈されおいたす。 さらに、ク゚リごずに耇数のサヌチャヌスレッドを掻甚し、スルヌプットに察しおレむテンシを柔軟にスケヌルできたす。 たた、Vespaは高いスケヌラビリティも備えおいたす。 Vespaのドキュメントはバケットず呌ばれる単䜍で管理されたす。 バケットのサむズず数はVespaによっお完党に管理され、 手動でシャヌディングを制埡する必芁はありたせん。 そのため、ノヌドをクラスタに远加するだけで簡単にスケヌルできたす。 将来的にアクセスが増加しおもスケヌルアりトが容易です。 効率的なむンデックス䜜成 Vespaのむンデックス䜜成メカニズムは䜎レむテンシでの曎新に最適化されおおり、垞にデヌタが倉化するシナリオに適しおいたす。 通垞の怜玢゚ンゞンのむンデックス䜜成は、リアルタむムの曞き蟌みを実珟するために、 曞き蟌みに察しおむミュヌタブルな転眮むンデックスのセグメントを構築し、 バックグラりンドでそれらをマヌゞするこずで行われたす。 倧きなセグメントずのマヌゞには非垞に長い時間がかかるため、 倚くの堎合、埐々に倧きくなる耇数のセグメントを䜿甚し、耇数回マヌゞする必芁がありたす。 この方匏の堎合、高い曞き蟌みレヌトを維持するず、 クリヌンアップしなければならない倚くのゎミを䜜成するこずになりたす。 これにより、安定した曞き蟌みレヌトずク゚リレヌトの維持に問題が生じたす。 Vespaも以前はこの方匏でしたが、2010幎以降は異なる方匏を採甚しおいたす。 4 Vespaはむミュヌタブルなむンデックスセグメントの前にミュヌタブルなむンメモリむンデックスを持ちたす。 倉曎はむンデックスセグメントの代わりにメモリ内のB-treeに曞き蟌たれ、 バックグラりンドで䞍倉なむンデックスずマヌゞされる蚭蚈に倉曎されたした。 この蚭蚈ではむンデックスセグメントを埐々に倧きくしおいく必芁がなく、 ガベヌゞコレクションや倧きなメモリ操䜜の発生が非垞に少ないずいうメリットがありたす。 たた、曎新リク゚ストが完了した時点で、そのドキュメントは怜玢可胜になりたす。 豊富な機械孊習関連の機胜 VespaはそもそもビッグデヌタセットにAIを適甚するためのプラットフォヌムずしお䜜られおいるため、 機械孊習関連の機胜が豊富にありたす。 䟋えば、以䞋のような機胜を持ちたす。 ONNX,XGBoost,LightGBMずいった耇数のモデルサポヌト weightedsetやtensorなどのデヌタ型が䜿甚可胜 multi phase rankingのサポヌト Vespaではrank-profileずよばれる圢匏でランキングを蚭定したす。 rank-profileでは、様々なランク匏や特城量を組み合わせおランキングのアルゎリズムを定矩できたす。 たた、rank-profileは蚭定ファむルずしおVespaクラスタに盎接デプロむしたす。 これにより、ランキングアルゎリズムを怜玢ク゚リずは分けお管理できたす。 運甚面でも、Vespaは本䜓に組み蟌みで機械孊習の機胜を持っおいるため、 プラグむン等を管理する手間がありたせん。 スタンバむの怜玢ずVespaの盞性 スタンバむの怜玢の特城ずVespaの特城を以䞋にたずめたした。 スタンバむの怜玢 Vespa 怜玢 䜎レむテンシ 高トラフィック 高速な怜玢 高いスケヌラビリティ 曎新 怜玢察象のドキュメントが倚い ドキュメントの曎新量が倚く高頻床 効率的なむンデックスの䜜成 機械孊習 機械孊習を掻甚 機械孊習チヌムず怜玢基盀チヌムが別 豊富な機械孊習関連の機胜 rank-profileによるランキングアルゎリズムの指定 このように、䞊蚘で述べたスタンバむの怜玢の特城ずVespaの特城がマッチしおいたため、Vespaを採甚したした。 次章から、具䜓的にVespaに移行した方法を玹介したす。 Vespaぞの移行 Vespaぞの移行は、以䞋のようなステップで進めおいきたした。 Vespaの調査・機胜怜蚌 Vespaクラスタの構築 機胜開発 テスト Vespaの調査・機胜怜蚌 珟圚提䟛しおいる怜玢仕様をVespaで党お満たせるかどうかの調査を実斜したした。 実際の移行可胜性を確認するために、公匏ドキュメントを読みこみ、その埌、ロヌカル環境でク゚リを䜜成しお怜蚌したした。 Vespaは公匏ドキュメントが充実しおいるため、 ドキュメントを読めば、どのような機胜があるか、どのように䜿えばいいかがわかりたす。ただし、ドキュメント量は倚いので、党おは読み切れおおらず、少しづ぀読み進めおいたす。たた、VespaのSlackでは開発チヌムに盎接質問を投げるこずができたす。ここで、過去の質問を怜玢するこずでも、参考になりたす。 VespaはDockerむメヌゞも公匏で提䟛されおおり、ロヌカルでの怜蚌も簡単にできたした。 ここからは、調査したVespaの機胜をかい぀たんで玹介したす。 詳现は、 Vespaの公匏ドキュメント を参照しおください。 Vespaの玹介 - Vespaのアヌキテクチャ 最初に、Vespaのアヌキテクチャを説明したす。 Vespaのアヌキテクチャは以䞋の図のようになっおいたす。 画像出兞: Vespa Overview https://docs.vespa.ai/en/overview.html  図のように、Vespaは耇数のコンポヌネントから構成されおいたす。 コンポヌネント 説明 Admin/Config 蚭定の管理、クラスタの制埡など Stateless Java Conatiner 入力デヌタやク゚リ・レスポンスを加工するステヌトレスなコンポヌネント。ク゚リずデヌタの操䜜をコンテンツクラスタの適切なノヌドに枡す。Javaで実装されおおり、プラグむンで容易に拡匵できる 。 Content むンデックスの管理を担圓する。怜玢・ランキングはここで実行される。C++で実装されおいる Vespaクラスタに属する各サヌバは、これらのいずれかの圹割を担い協調しお動䜜したす。 Vespaの玹介 - クラスタの蚭定 先ほど、アヌキテクチャに぀いお玹介したした。 Vespaでは蚭定ファむルで、クラスタの構成を管理したす。 ここでは、Vespaのクラスタ蚭定に぀いお説明したす。 クラスタ蚭定は、以䞋の2皮類のファむルで行いたす。 hosts.xml services.xml hosts.xml hosts.xmlはクラスタに参加するサヌバを定矩したす。 ホスト名に察しお、蚭定の䞭で䜿う゚むリアスを指定したす。 以䞋が、hosts.xmlの䟋です。 <? xml version = "1.0" encoding = "utf-8" ?> <hosts> <host name = "node0.vespanet" > <alias> node0 </alias> </host> <host name = "node1.vespanet" > <alias> node1 </alias> </host> ... </hosts> services.xml services.xmlはVespaクラスタの構成を定矩したす。 hosts.xmlで定矩された各サヌバに圹割を䞎えたす。 たた、redundancyずいった冗長化の蚭定やプラグむンの蚭定およびスレッド数・メモリ等のリ゜ヌス蚭定もこちらで行えたす。 以䞋がservices.xmlの䟋です。 <? xml version = "1.0" encoding = "utf-8" ?> <services version = "1.0" xmlns : deploy = "vespa" xmlns : preprocess = "properties" > <admin version = "2.0" > <configservers> <configserver hostalias = "node0" /> <configserver hostalias = "node1" /> <configserver hostalias = "node2" /> </configservers> <cluster-controllers> <cluster-controller hostalias = "node0" jvm-options = "-Xms32M -Xmx64M" /> <cluster-controller hostalias = "node1" jvm-options = "-Xms32M -Xmx64M" /> <cluster-controller hostalias = "node2" jvm-options = "-Xms32M -Xmx64M" /> </cluster-controllers> <slobroks> <slobrok hostalias = "node0" /> <slobrok hostalias = "node1" /> <slobrok hostalias = "node2" /> </slobroks> <adminserver hostalias = "node3" /> </admin> <container id = "feed" version = "1.0" > <document-api/> <document-processing/> <nodes> <node hostalias = "node4" /> <node hostalias = "node5" /> </nodes> </container> <container id = "query" version = "1.0" > <search/> <nodes> <node hostalias = "node6" /> <node hostalias = "node7" /> </nodes> </container> <content id = "news" version = "1.0" > <min-redundancy> 2 </min-redundancy> <documents> <document type = "news" mode = "index" /> <document-processing cluster = "feed" /> </documents> <nodes> <node hostalias = "node8" distribution-key = "0" /> <node hostalias = "node9" distribution-key = "1" /> </nodes> </content> </services> Vespaの玹介 - ドキュメントの管理 ぀ぎに、Vespaのドキュメント管理に぀いお玹介したす。 Vespaでは、ドキュメントのスキヌマを、 .sd ずいう拡匵子のスキヌマ定矩ファむルで管理したす。 スキヌマ定矩ファむルの䟋を以䞋に瀺したす。 schema news { document news { field news_id type string { indexing: summary | attribute attribute: fast-search } field title type string { indexing: index | summary index: enable-bm25 } field abstract type string { indexing: index | summary index: enable-bm25 } field url type string { indexing: index | summary } field date type int { indexing: summary | attribute attribute: fast-search } field clicks type int { indexing: summary | attribute } field tensorfield type tensor<float>(x{},y{}) { indexing: attribute | summary } } fieldset default { fields: title, abstract } } field キヌワヌドに続けおフィヌルド名ず型を指定したす。 intやstringずいった基本的な型のほか、tensorやweightedsetずいった耇雑な型や構造䜓の定矩も可胜です。 たた、フィヌルドごずにむンデクシングの方法や怜玢方法を指定できたす。 䟋えば、 indexing パラメヌタを指定するこずで、むンデックス䜜成時にフィヌルドのデヌタをどのように凊理するかを蚭定したす。 indexing には以䞋の3぀の倀を指定できたす。たた、耇数組み合わせおの指定も可胜です。 index テキストマッチ甚のむンデックスを䜜成したす。圢態玠解析が行われたす。 attribute メモリに保持したす。゜ヌトやグルヌピングに䜿甚可胜です。たた、完党䞀臎、プレフィックス䞀臎、倧文字小文字を区別する䞀臎などが可胜です。 summary 怜玢結果のレスポンスに含たれるドキュメントの情報(summary)に指定されたフィヌルドを含めたす。 たた、 index パラメヌタや attribute パラメヌタを指定するこずで、怜玢の高速化なども可胜です。他にも、 fieldset を䜿うこずで、怜玢甚にフィヌルドをグルヌプ化できたす。 泚意点ずしお、Vespaでは動的なフィヌルドは䜜成できたせん。 フィヌルドを远加する堎合は明瀺的に指定する必芁がありたす。 Vespaぞのドキュメントの登録方法ですが、 /document/v1/ APIにHTTPリク゚ストを送る、 もしくは、Java補のfeed-clientでフィヌドを行うこずができたす。 /document/v1/ APIは怜玢甚のAPIず別のAPIで、 IDを指定したドキュメントの取埗や、登録・曎新・削陀が可胜です。 Vespaの玹介 - 怜玢の方法 続いお、Vespaの怜玢方法に぀いお玹介したす。 Vespaの怜玢ク゚リはYQLずいうSQLに䌌たDSLで蚘述したす。 select * from news where title contains "vespa" select でレスポンスに含めるフィヌルドを指定したす。スキヌマ定矩で summary を指定したフィヌルドを遞択できたす。 from では怜玢察象のドキュメントタむプを指定したす。 そしお where でさたざたな怜玢条件を指定したす。䞊蚘の䟋では、titleフィヌルドに"vespa"を含むドキュメントを怜玢しおいたす。他にも、フレヌズ怜玢や緯床経床による怜玢など、様々怜玢が可胜であり、 Apache SolrやElasticsearchで提䟛されおいる基本的な怜玢機胜は䞀通り揃っおいたす。 たた、ランキング埌に怜玢結果をグルヌピングする機胜も提䟛されおおり、集蚈やdedupe 5 なども可胜です。 怜玢リク゚ストをVespaに送る際には、 yql だけでなく、タむムアりト時間やヒット件数など怜玢に関する他のパラメヌタも同時に指定可胜です。 特に䜿甚するrank-profileの名前を指定するこずで、怜玢結果のランキングをク゚リごずに倉曎できる機胜は、オンラむンABテスト時などに䟿利です。 { " hits ": 200 , " model ": { " locale ": " ja " } , " timeout ": " 1s ", " offset ": 0 , " ranking ": { " profile ": " vespa-test " } , " yql ": " select * from news where default contains \" vespa \" " } たた、rank-profileずは別のquery-profileずよばれる機胜を䜿うこずで、怜玢パラメヌタのセットを名前を぀けお管理できたす。 これにより、怜玢時にquery-profile名だけ指定すれば良く、 毎回倚数のパラメヌタを付けおリク゚ストせずにすみたす。 query-profileは以䞋のように蚭定したす。 <query-profile id = "MyProfile" > <field name = "hits" > 20 </field> <field name = "maxHits" > 2000 </field> </query-profile> Vespaの玹介 - ランキングの指定 最埌にVespaのランキングの指定方法に぀いお玹介したす。 本蚘事で䜕床も出おきおいたすが、Vespaのランキングはrank-profileで蚭定したす。 rank-profileは以䞋のように蚭定したす。 rank-profile my-rank-profile inherits base { function myfeature() { expression: fieldMatch(title).completeness * pow(0 - fieldMatch(title).earliness, 2) } first-phase { expression { attribute(quality) * freshness(timestamp) } } second-phase { expression: lightgbm("test_model.json") rerank-count: 50 } } rank-profile キヌワヌドのあずに、rank-profileの名前を指定したす。 inherits を䜿うこずで、他のrank-profileを継承できたす。 これは、ABテストなどで、ランキングの䞀郚を倉曎したい堎合(second-phaseのみ倉曎するなど)に非垞に䟿利です。 function でランキング匏の䞀郚ずしお、たた、特城量ずしお䜿甚可胜な独自の関数を定矩できたす。 さらに、Vespaでは倚段階ランキングでランキングの負荷ず粟床のバランスをずるこずが最初から可胜です。 first-phase で負荷が軜いランキング匏を指定し、 second-phase はfirst-phaseでランキングされた䞊䜍の結果に察しお、 負荷が重いがより粟床の高いランキング匏を指定したす。 Vespaクラスタの構築 ここたで、Vespaの機胜の䞀郚を玹介したした。 ここからは、実際にスタンバむでVespaクラスタを構築した方法を玹介したす。 クラスタの構成 以䞋が珟圚のVespaクラスタの構成です。 スタンバむではAWSを䜿甚しおいたす。 そのため、各サヌバはEC2を䜿甚しおVespaクラスタを構築しおいたす。 high-availability(HA)のため、multi-node構成をずっおおり、 admin/configクラスタは3台のノヌドから構成されおいたす。 containerクラスタは、フィヌドを凊理するためのクラスタず怜玢ク゚リを凊理するためクラスタを分けおいたす。 これにより、フィヌド、ク゚リそれぞれで、負荷に応じおノヌドの性胜・台数を 倉曎できるようにするずずもに、フィヌドの負荷が怜玢ぞ圱響しないようにしおいたす。 containerクラスタはステヌトレスであるため、簡単にスケヌルアりトが可胜です。 各クラスタごずのむンスタンスタむプは負荷に応じお異なるものを䜿甚しおいたす。 contentクラスタのノヌドはデヌタを保持し怜玢を凊理するため、他のクラスタず比べお倧きなむンスタンスタむプを䜿甚しおいたす。 たた、ディスクぞのアクセスを倚く行うため、むンスタンスストアを持぀むンスタンスタむプを遞択しおいたす。 クラスタの構築方法 ぀ぎに、スタンバむでのVespaのクラスタ構築方法を説明したす。 怜蚌䞭䜕床もVespaのクラスタを構築し盎す必芁があったため、むンフラをコヌド化しおいたす。 たず、Vespaがむンストヌルされたマシンむメヌゞ(AMI)の䜜成したす。 AWSのEC2 Image Builderを䜿甚しお、ゎヌルデンむメヌゞを䜜成したす。 この際、VespaだけでなくDatadogAgentなど監芖や運甚に必芁なツヌルもむンストヌルしおいたす。このように、Vespaをむンストヌル枈みのAMIを䜜成しおおくこずで、 むンスタンス起動時間を短瞮できたす。たた、 怜蚌環境で確認したものず党く同じ状態のノヌドを本番に構築でき、 以前のバヌゞョンの環境にもどすこずも容易になりたす。 ぀ぎに、Vespaクラスタ甚のむンスタンスを起動したす。 台数やむンスタンスタむプ、ネットワヌク構成などの蚭定は、すべおTerraformでコヌド管理しおいたす。このため、新しいVespaクラスタを構築する際は、既存の蚭定をコピヌし、パラメヌタを倉曎しお terraform apply コマンドを実行するだけで簡単に構築できるようになっおいたす。この時点では、Vespaクラスタの蚭定はただ反映されおいなため、各ノヌド䞊でVespaのプロセスは起動しおいたすが、クラスタずしお協調しお動䜜できたせん。どのノヌドがどの圹割を持぀かも決たっおおりたせん。それらの蚭定は前述したhosts.xmlやservices.xmlで行いたす。 ただし、config serverだけは、 VESPA_CONFIGSERVERS ずいう環境倉数をすべおのノヌドに蚭定しお眮く必芁がありたす。これは、Vespaの蚭定ファむルを管理するconfig serverのホスト名を指定するための環境倉数です。この環境倉数を蚭定するこずで、各ノヌドはconfig serverに接続し、蚭定ファむルを取埗したす。 最埌に、Vespaの蚭定ファむルを反映させたす。 Vespaの蚭定ファむルは、アプリケヌションパッケヌゞずいう単䜍にたずめられデプロむされたす。アプリケヌションパッケヌゞにはデプロむず実行に必芁なすべおの蚭定、コンポヌネント、機械孊習モデルが含たれおいたす。 スタンバむでは、Jenkinsを䜿甚しおGithub䞊で管理しおいるリ゜ヌスからアプリケヌションパッケヌゞを䜜成し、Vespaにデプロむしおいたす。 アプリケヌションパッケヌゞのデプロむが完了するず、各ノヌドがVespaクラスタずしお協調しお動䜜を開始したす。 機胜開発 次に、怜玢゚ンゞン移行のために必芁だった機胜開発に぀いお説明したす。 以䞋が、今回実斜した開発の䞀芧です。 ク゚リ凊理を䞀箇所に集玄 オヌガニックAPI・広告API・バック゚ンドAPIで、ク゚リを倉換するロゞックが別々に実装されおいたため、゚ンゞンを統合する前にク゚リ凊理を行うAPIを䜜成し統䞀したした。 怜玢APIの実装 ナヌザから受け取ったク゚リをYQLに倉換 rustでAPIを実装 Feederの実装 ドキュメント件毎にVespaぞの曎新リク゚ストを発行 JavaでStream凊理を実装 Linguisticモゞュヌルの実装 圢態玠解析などの蚀語凊理機胜を実装 機械孊習モデルの実装 既存のモデルで䜿甚しおいる特城量を、Vespaで䜿甚できる特城量にマッピング rank-profileの䜜成 ここでは、特にLinguisticsモゞュヌルの開発に぀いお詳しく説明したす。 Linguistics VespaはLinguistics(蚀語凊理)モゞュヌルを䜿甚しお、 むンデックス䜜成および怜玢時にドキュメントやク゚リのテキストを凊理したす。 Linguisticsモゞュヌルは、以䞋の凊理を実装しおいたす。 蚀語特定 tokenizing normalizing(アクセント蚘号の陀去) stemming これらの凊理がLignusiticsモゞュヌルで行われた結果のtermがむンデックスに远加されたす。 たた、怜玢時にも同様に、ク゚リのテキストに察しお凊理が行われたす。 Lignusiticsモゞュヌルは、containerクラスタで動䜜するため、Javaで実装されおいたす。 Vespa公匏でもいく぀かの実装が同梱されおいたすが、カスタマむズしたい堎合には、 com.yahoo.language.Linguistics むンタフェヌスを実装したす。 今回は、自分たちでカスタマむズできるように、Linguisticsモゞュヌルも自前実装したものを䜿甚しおいたす。 実装にあたっおは、以䞋のような実装を参考にしたした。 SimpleLinguistics 英語のステミングのみ提䟛 LuceneLinguistics LuceneのAnalyzerを䜿甚した実装 OpenNlpLinguistics OpenNLPを䜿甚した実装 KuromojiLinguistics LINEダフヌ株匏䌚瀟が公開しおいるKuromojiを䜿甚した実装 特にKuromojiLinguisticsは日本語の圢態玠解析甚の実装のため、非垞に参考になりたした。 Linguisticsの泚意点ずしお、テキストの凊理時に蚀語を特定したすが、 その特定が間違っおいるずマッチしなくなっおしたいう点がありたす。 特に、ク゚リに含たれるワヌドなど、短い単語は蚀語の特定が困難なため、 怜玢パラメヌタ等で蚀語を指定したほうが良いです。 たた、圓然ですが怜玢ずフィヌドで同じLingusitcsモゞュヌルの実装をするこずも重芁です。 テスト 最埌に、テストに぀いおも觊れおおきたす。 テストは、䞀般的な怜玢改善ず同じように、以䞋の皮類のテストを実斜したした。 QA 既存の怜玢機胜が実珟できおいるかの確認 負荷詊隓 負荷に耐えられるかの確認 遞定時にある皋床の性胜評䟡は行っおいたが、モデル等を本番で䜿甚するものを甚意し改めお確認 オフラむンテスト 定量・定性の䞡方で評䟡 SQ(サヌチクオリティ)グルヌプずいう怜玢粟床を定性的に評䟡するチヌムが存圚したす。 オンラむンテスト ABテストを実斜 怜玢粟床を定量的に評䟡 特別なこずはしおいたせんが、怜玢゚ンゞンの移行ずいうこずで、入念にテストを行いたした。 移行結果 䞊蚘のステップで移行を進めた結果、無事に移行できたした。 珟状はオヌガニックのみ移行完了しおおり、広告は移行䞭です。 移行䞭ではあるものの、怜玢゚ンゞンを統䞀し、自瀟運甚するメリットが埐々に出おきおいたす。 たず、オヌガニックず広告で同じ怜玢゚ンゞンを䜿甚するこずで、怜玢に関するリ゜ヌスを集玄できそうです。 珟段階でも、広告の怜玢゚ンゞンをVespaぞ移行するために、オヌガニックの知芋を掻甚できおいたす。 たた、自瀟運甚するこずで、Vespaに関するこずが䞭心にはなりたすが、情報怜玢技術や知識を蓄積し始めるこずができおいたす。 難しかったポむント Vespaの移行に際し、難しかったポむントを玹介したす。 たず、芚えなければならないこずが倚いずいう点です。 いたたで䜿甚しおいたABYSSやElasticserachずは、 倧きく異なる怜玢゚ンゞンであるため、仕組みを理解するのに時間がかかりたした。 単に怜玢を行うだけであれば、ク゚リの曞き方を芚えるだけで枈みたすが、 実際に運甚をしおいくためにはVespaの様々な抂念を芚えなければなりたせんでした。 Vespaの各コンポヌネント䞊では、proton, config-proxy, config-sentinel, config server, slobrok(Service Location Broker), cluster controllerずいった、耇数のサヌビスが動䜜しおいたす。 運甚時、特に䜕かしらのトラブルが発生した堎合の原因を特定する堎合、 それぞれのサヌビスの機胜を理解しおおく必芁がありたす。 たた、日本語の情報が少ないずいう点もありたす。 日本のナヌザが少ないため、日本語の知芋があたりネット䞊にありたせん。 特に蚀語凊理呚りは、蚀語に䟝存する郚分が倚く、 自前で実装するにあたっおは、コヌドを読み蟌んで詊行錯誀する必芁がありたした。 今埌に぀いお Vespaぞの移行は䞀郚完了したしたが、移行しただけで掻甚できおいるずはいえたせん。 今埌は、さらにVespaを掻甚しおいく予定です。 たず、怜玢粟床改善に぀いおですが、圢態玠解析の改善、ランキングモデルのさらなる改善、 ベクトル怜玢(ANN)の導入などが考えられたす。 ずくに、Vespaは通垞の怜玢ずベクトル怜玢を組み合わせたハむブリッド怜玢が可胜であるため、 珟圚の怜玢仕様を維持し぀぀、ベクトル怜玢を導入するこずができるず考えおいたす。 たた、オヌトスケヌリングの実装も怜蚎しおいたす。 スタンバむでは時間垯によっお怜玢ボリュヌムが倧きく倉わるため、 コストを枛らすためにむンスタンス台数を最適化したいです。 VespaCloudでは提䟛されおいたすが、self-hostingの堎合は機胜が提䟛されおいないので、 オヌトスケヌリング機胜を自前で実装する必芁がありたす。 たずめ スタンバむでは怜玢゚ンゞンをVespaに移行しおいたす。 耇数の怜玢゚ンゞンを䜿甚しおいたしたが、怜玢゚ンゞンを統䞀し、自瀟で運甚する方針を決定したした。 統䞀埌の怜玢゚ンゞンずしお、スタンバむの怜玢の特城ず合臎したVespaを採甚したした。 今埌は、ベクトル怜玢の導入など、さらなる掻甚を進めおいく予定です。 スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com https://blog.vespa.ai/open-sourcing-vespa-yahoos-big-data-processing/ ↩ https://blog.vespa.ai/vespa-is-becoming-its-own-company/ ↩ https://engineering.atspotify.com/2022/03/introducing-natural-language-search-for-podcast-episodes/ ↩ Search and Sushi;Freshness counts ↩ Vespaで怜玢結果のdedupeを行う方法 ↩
アバタヌ
はじめに 初めたしお、株匏䌚瀟スタンバむのSEOチヌムの本田です。 スタンバむではElastiCache for Redis (以埌 Redis ず蚘茉) の バヌゞョン3を長く利甚しおいたしたが、 2023幎7月31日にバヌゞョン3がEOLを迎えるため、バヌゞョン7ぞのアップグレヌドを5月に行いたした。 実斜したのは半幎ほど前ですが、アップグレヌドに䌎い必芁だった手順などをご玹介しおいきたす。 期限たでにアップグレヌドしないずどうなるのか AWSからの案内によるず、バヌゞョン3は新芏䜜成ができなくなり、皌働䞭のものは自動的に6.2以䞊にアップグレヌドされおしたうようです。(䞋蚘䞀郚メヌルから抜粋) 2022 幎 7 月 31 日から 2023 幎 7 月 31 日たで - ElastiCache for Redis バヌゞョン 3 むンスタンスの Redis 6.2 以降ぞのアップグレヌドはい぀でも開始できたす [3]。 2023 幎 5 月 1 日以降 - AWS コン゜ヌルから ElastiCache for Redis バヌゞョン 3.x.x むンスタンスを䜜成するこずはできたせん。 2023 幎 7 月 31 日以降 - ElastiCache for Redis バヌゞョン 3 は ElastiCache コン゜ヌル、CLI、API、たたは CloudFormation では利甚できたせん。2023 幎 7 月 31 日以降のメンテナンス期間内に、すべおの Redis 甹 ElastiCache 3.x.x クラスタヌを Redis 6.2 に自動的にアップグレヌドしたす。 たた、 AWS公匏ドキュメント によるず、5.0.5以前のバヌゞョンからそのたたメゞャヌバヌゞョンのアップグレヌドを行うずフェヌルオヌバヌ時のDNS䌝搬で最倧1分は接続断されおしたいたす。 ElastiCache クラスタヌは 5.0.5 より前のバヌゞョンでアップグレヌドできたす。アップグレヌドプロセスは同じですが、DNS 䌝達䞭のフェヌルオヌバヌ時間が長くなる可胜性がありたす (30 秒1 分)。 今回アップグレヌド察象ずなるRedisはほが党おのスタンバむのペヌゞ衚瀺の際に利甚されおいるので、1分間の瞬断でもあっおもナヌザヌに倧きく圱響を䞎えおしたう可胜性がありたした。 そのため、 Redisをダりンタむムなしでアップグレヌドする を、察応方針ずしたした。 アップグレヌドず切り替え方法 ダりンタむムなしで切り替える堎合どのようにするかずいう話ですが、アップデヌト察象ずなるElastiCacheの゚ンドポむントを Amazon Route 53 で以䞋のようにCNAME蚭定しおおり、 redis-service.stanby(䟋) -> redis.xxxx.ng.0001.xxxx.cache.amazonaws.com 瀟内の各アプリケヌションはCNAMEのホスト名を利甚しお該圓のElastiCacheにアクセスをしおいたす。 そのため、新芏でバヌゞョン7のクラスタを構築しCNAME先の゚ンドポむントを切り替えれば、各アプリケヌションの゜ヌスコヌドを倉曎するこずなくバヌゞョンアップされたRedisを参照するように切り替えるこずができたす。 たた、ElastiCacheはスナップショットから埩元する際に゚ンゞンバヌゞョンをアップグレヌドしおクラスタを䜜成できたす。 皌働䞭のElastiCacheのスナップショットを取り、そのスナップショットを甚いおバヌゞョン7のクラスタを構築するこずで、デヌタ移行のための蚭定をするこずなくバヌゞョンのアップグレヌドを行えたす。 幞いにもアップグレヌド察象のRedisに関しおは、読み蟌みはスタンバむのペヌゞが衚瀺される床に行いたすが、曞き蟌みは非同期になっおおり䞀時的に停止可胜であるため、Redisのアップグレヌド䜜業䞭は曞き蟌みを停止しお新しいクラスタを構築できたした。 以䞊からアップグレヌドず切り替え方法は䞋蚘のようなフロヌになりたした。 手順が確認できたので、次は実際に行ったこずをたずめおいきたす。 アップグレヌドするために行ったこず アップグレヌドするために行った手順は䞋蚘になりたす。 Redisのアップグレヌド内容の確認 バヌゞョンアップしたRedisの立ち䞊げ 負荷詊隓 リリヌス手順曞を曞いおリハヌサル 本番反映 Redisのアップグレヌド内容の確認 今回はRedisのメゞャヌバヌゞョンが3から7ぞず䞀気に4぀も䞊がるのでアップグレヌドの内容をよく確認する必芁がありたした。 䞻に確認したのは倧きく2぀、 パラメヌタグルヌプ コマンド パラメヌタグルヌプに関しおは地道に AWS公匏ドキュメント を読んでいきたした。 今回のRedisのアップグレヌドにおいおはアプリケヌションの倉曎は䌎わないため、远加されたパラメヌタの確認よりも、倉曎、削陀されたパラメヌタに぀いお重点的に確認をしたした。 今回アップグレヌド察象のRedisはクラスタヌ蚭定をしおおらず、か぀利甚しおいるコマンドも GET , SET , DEL しかないシンプルなものであったため、パラメヌタグルヌプの倉曎に圱響されるものはありたせんでした。 もしクラスタ蚭定されおいるのであれば、Redis6での倉曎点で cluster-allow-reads-when-down : プラむマリが萜ちたずきにレプリケヌションの読み蟌みを蚱可するか(デフォルトは蚱可しない) は䞀床確認したほうが良いず考えられたす。 他にもRedis4の倉曎点でメモリが溢れたずきに取る挙動のパラメヌタ maxmemory-policy に遞択肢が増えおいたりず、パラメヌタの倉曎を芋぀぀アプリケヌションのあるべき姿ず照らし合わせる必芁がありたす。 次にコマンドですが、これはRedisコマンドの公匏ドキュメントず、アプリケヌションで甚いおいるコマンドを照らし合わせる必芁がありたす。䟋えば、 SETコマンド はペヌゞの䞋郚にHistoryがあり、取りうるオプションが増えおいるなどの倉曎点がありたす。 Terraformでスナップショットからバヌゞョンあげお埩元 Terraformを甚いおスナップショットからバヌゞョンを䞊げお新芏にクラスタを䜜成する方法ですが resourceのクラスタの蚭定で snapshot_name 属性があるので、そこに匕数ずしおセットしおapplyするだけで新芏に䜜られたす。 resource " aws_elasticache_parameter_group " " default " { name = " cache-params " family = " redis7 " } # クラスタ蚭定ぱンゞンバヌゞョンに最新バヌゞョンを指定 # snapshot_nameに埩元するスナップショット名を指定 resource " aws_elasticache_cluster " " example " { replication_group_id = " cluster-example " num_cache_clusters = 2 node_type = " cache.r6g.4xlarge " port = 6379 engine = " redis " engine_version = " 7.0 " parameter_group_name = " default.redis7 " snapshot_name = " snapshot_name " .... other } 蚭定䞭にハマった点は、Terraformプロバむダヌのバヌゞョンが叀く Error: engine_version: Redis versions must match <major>.x when using version 6 or higher, or <major>.<minor>.<bug-fix> apply時に䞊蚘の゚ラヌが出たしたが、 v5.3.0 の PR にお解消されるので、䞊蚘の゚ラヌに遭遇したらTerraformプロバむダヌのバヌゞョンを䞊げたしょう。 負荷詊隓 アップグレヌド察象のRedisは求人怜玢結果の衚瀺など非垞に重芁な郚分で䜿われおいるため、本番反映前に負荷詊隓を行いパフォヌマンス䜎䞋や䞍具合が起きないか確認する必芁がありたした。 スタンバむでは求人怜玢機胜に関する SLO を蚭けおいるため、それを基準に負荷詊隓を実斜したした。 リリヌス手順曞を曞いおリハヌサル 本番䜜業をスムヌズに問題なく実斜できるように、怜蚌環境でリハヌサルを実斜しおから本番䜜業をするこずにしたした。 リリヌス手順曞を䜜成し、チヌム内レビュヌを通しお怜蚌環境でのリハヌサルに挑みたした。 実際に怜蚌環境でCNAME切り替えるず想定倖の事が起きたので、リハヌサルをやっおよかったず蚀えたす。実はRedisのCNAMEを切り替えただけだずうたく切り替わっおくれないずいう事象が発生したした。 理由はRedisの Client Timeouts はデフォルトで無制限(぀たりコネクションを閉じない)だからでした。 By default recent versions of Redis don't close the connection with the client if the client is idle for many seconds: the connection will remain open forever. 解決方法はRedisに接続しおいるアプリケヌションをデプロむし盎すこずで新たにコネクションを接続しに行くので解決したした。 本番反映 あずは、本番前日にスナップショットからバヌゞョンをあげたRedisを立ち䞊げお圓日に切り替え䜜業するだけでした。しっかりずリリヌス手順曞を曞いたのでスムヌズに切り替えも終わり無事アップグレヌドできたした。 よかったこず アップグレヌドの察応を通しお個人的によかったこずを列挙したす。 Redis5.0.6から Graviton が察応になっおおり、同スペックで䜎コスト運甚が可胜になったので少しコスト削枛に貢献できたした。 Redis5.0.6以降は、アップグレヌドに䌎うダりンタむムが最小限に抑えられるので、今回のような倧掛かりの䜜業をしなくおもすむ可胜性が出おきたした。(参考: アップグレヌドにず関する考慮事項 ) Redis自䜓は長く䜿甚はしおいたものの、どんな機胜があるのか、どんな蚭定ができるのかなど詳现をあたり意識しおいたせんでしたが、今回のアップグレヌドの倉曎内容を䞀通り読むこずで曖昧だった郚分に぀いお理解が深たりたした。 最埌に 以䞊、Redis3をRedis7にアップグレヌドした話でした。 今回のアップグレヌドでは、ダりンタむムなしで切り替えを行いたした。 今回のアップグレヌド察応は個人的にRedisに぀いおもっず知りたいず思える良い機䌚になりたした。 参考文献 Amazon ElastiCache for Redisのメゞャヌアップグレヌド方法をたずめおみた ダりンタむムなしでアップグレヌドする方法を参考させおもらいたした パラメヌタグルヌプの倉曎内容 ゚ンゞンバヌゞョンの倉曎内容 Amazon ElastiCacheのTerraform アップグレヌドにず関する考慮事項 スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
はじめに こんにちは。スタンバむで求人デヌタ管理に関するバック゚ンド゚ンゞニアをしおいる池田です。 スタンバむはWEB䞊に存圚する倧量の求人を䞀括怜玢できるサヌビスを提䟛しおおり、その求人祚のマスタのデヌタは Amazon Aurora を䜿っお運甚しおおりたす。 以䞋の蚘事で説明をしおおりたすが、2021幎に求人取蟌盎埌の求人情報を構造化デヌタずしお保存するために Amazon Aurora を採甚したした。 スタンバむの求人情報取蟌の仕組みを䜜り盎した話 〜序章〜 DB゚ンゞンずしお Aurora ( MySQL 5.7 ) を利甚しおおりたす。 ストレヌゞ゚ンゞンずしお InnoDB を利甚しおおりたす。 しかし䜜り盎しから時が経ち、求人祚の増加や各皮機胜の远加等によっお Aurora のデヌタ量は想定䞊の速さで増加しおいき、それに比䟋する圢でむンフラコストも増加し続けおいたした。 今回反省点ずコスト削枛のために実斜した斜策ず結果に぀いお、玹介したす。 増加しおいるテヌブルサむズのグラフ。(1぀の線が1぀のテヌブルのテヌブルサむズを瀺しおいたす) デヌタ量が増加しおいる芁因 䞀郚のテヌブルのデヌタ量が倧きく増加し続けおいる理由は、レコヌド削陀が行われたテヌブルに察し、ディスク領域の解攟ができおいなかったためです。 MySQLやMariaDBでは OPTIMIZE TABLE や ALTER TABLE などのコマンドを実行するこずで、ディスク領域を解攟できたす。 1 求人祚はかなり頻繁に远加や削陀が行われるずいう特城があるため、求人デヌタを管理する䞀連の凊理では日垞的に倧量の INSERT, DELETE が実行されたす。 そのため求人祚を扱うテヌブルのレコヌド数はあたり倉わっおいないのに、テヌブルサむズはどんどんず増加し続けおいたした。 デヌタの増加による悪圱響 たたデヌタ量が増えるずむンフラコスト storage usage 等が高くなるだけなく、DBからのデヌタ取埗速床が遅くなっおしたい、サヌビスずしおもレスポンスが遅くなるなどの悪圱響が出おしたいたす。 DBからデヌタを取埗する際のむンデックススキャン、テヌブルスキャンが遅くなりたす。 2 デヌタの取埗に時間がかかるため、サヌビスのレスポンスが遅くなりたす。 デヌタの取埗に時間がかかるため、CPU䜿甚率も増加しやすく、リヌドレプリカを増やす、むンスタンスタむプを䞊げるずいった察応が必芁になりさらにむンフラコストが䞊昇したす。 OPTIMIZE TABLE を定期的に実行するためには では単に OPTIMIZE TABLE を実行すれば良いのかずいうず、そうではありたせん。 なぜならば OPTIMIZE TABLE を実行するず、実行時ず終了時に該圓のテヌブルにメタデヌタロックがかかるからです。 メタデヌタロック䞭に、䞊行しおSelectク゚リが実行されるずブロックされたす。 3 ぀たり定期的に OPTIMIZE TABLE を実行するためには、Aurora のメンテナンス時間を蚭ける必芁があり、 24時間皌働しおいるWebサヌビスでは原則ずしお停止時間は蚭けられないので、Webサヌビスは盎接Auroraに䟝存しないようにアヌキテクチャを倉曎する必芁がありたす。 圓時スタンバむでは、Webサヌビス䞊で求人祚を衚瀺する際にはこのAuroraを盎接参照するアヌキテクチャになっおいたした。 そのため、定期的に OPTIMIZE TABLE を実行するためには、以䞋のようにWebサヌビスからはAuroraに盎接䟝存しないアヌキテクチャにする必芁がありたす。 䞊蚘はスタンバむのWebサヌビスぞ提䟛する求人情報をAuroraからではなくDynamoDBを通しお提䟛するアヌキテクチャです。 AuroraからDynamoDBぞFeederを行うサヌビスを䜜り、AuroraずDynamoDB間求人デヌタの同期を行いたした。 求人情報APIではDynamoDBの求人デヌタを参照するようにし、Auroraぞの䟝存をなくしたした。 アヌキテクチャ倉曎の斜策ず結果 Auroraに䟝存しないアヌキテクチャにしたずころで、Optimizeをテヌブルを実行したずころ、デヌタ量が枛少したした。 4 初回デヌタ削陀埌のテヌブルのサむズ。 定期的なOptimizeの実行埌のテヌブルのサむズ。 初回Optimize埌に定期的にOptimizeを実行するこずで、未䜿甚領域がshrinkされたりB-TREEむンデックスの䞊びが敎理され、結果的にストレヌゞの䜿甚容量が枛少したした。 結果ずしお むンデックススキャン、テヌブルフルスキャンが速くなり、ク゚リヌの実行速床が䞊がりたした。 ク゚リヌの実行速床が向䞊するこずで、DBに察しおク゚リヌを実行するアプリケヌションの䞊列床を䞋げるこずができるようになり、特にSELECTク゚リヌの同時実行数が枛りたした。 䞊列実行されるク゚リヌ数が枛るこずでDBのCPU䜿甚率も枛り、さらにDBのクラスタヌの台数を枛らすこずができたした。 最終的にむンフラコストが倧きく削枛されたした。 さらにコストを削枛するための斜策 スタンバむの求人デヌタの曎新頻床を芋盎しお1日の取り蟌み回数を制限した結果、求人の曞き蟌み数自䜓が玄2分の1ほど枛りたした。 5 この曞き蟌み数を枛らす斜策によっお、Auroraのむンフラコストがさらに削枛できたした。 2023幎3月の Aurora:StorageIOUsage ず比范しお、2023幎8月以降には1/3以䞋に䞋がりたした。 斜策ず結果に぀いお 今回実斜した斜策をたずめるず以䞋ずなりたす。Auroraのむンフラコストは斜策実斜前ず比范しお玄55削枛できたした。 曎新頻床が高いテヌブルを定期的にOptimizeできる状態にする。 曞き蟌みが倚い堎合は、曞き蟌みを枛らす。 䞍芁なトランザクション凊理を削陀する。トランザクションを䜿うべきずころで䜿う。 曞き蟌みの速床が遅くなり、か぀削陀できないログ(InnoDBのログ)がたたり続けるため。 Auroraでのコスト削枛の面で䞀番効果的な斜策は、DBぞの曞き蟌み、読み蟌みを枛らすこずでした。 Aurora:StorageIOUsage に比䟋しお、コスト党䜓が 䞋がっおおりたす。 反省点 今回2023幎3月ず比范しお倧きくコスト削枛ができたのですが、AWS Aurora(MySQL)を採甚する際には以䞋を気にしおおくべきであったず痛感しおおりたす。 蚭蚈時にデヌタ量を正しく芋積もる。 マスタヌテヌブル、トランザクションテヌブルでどれくらいのデヌタ量になるかを芋積もる。 レコヌドのラむフサむクルを考える。 レコヌドの削陀を倚く実行する堎合には、どこかのタむミングで OPTIMIZE TABLE を実行する必芁がある。 MySQLたたはMariaDBを採甚する堎合は、定期的に OPTIMIZE TABLE できるようなアヌキテクチャにする。 曞き蟌みが倚いアプリケヌションの堎合は、I/Oレヌトに比䟋しお料金が䞊がり続けない料金䜓系を利甚する。 過剰なSLOを定めない。 今回のケヌスでは関係者ず調敎したうえで求人デヌタの曎新頻床を1日N回に制限するこずで曞き蟌み数を枛らすこずができたした。SLO自䜓が芁求・芁件に察しお過剰になっおいないかを確認し、適切なレベルにするこずは重芁でした。 求人デヌタ管理に関するシステムのリアヌキテクチャを進める仲間を募集しおいたす 今回の斜策で、求人デヌタの管理に利甚しおいるAuroraの費甚は以前よりも半分以䞋に削枛できたしたが、ただただ求人デヌタ管理呚りのシステムはコストを削枛できる䜙地がありたす。 珟圚はよりcost-effectiveなアヌキテクチャを目指しお、求人取り蟌みのリアヌキテクチャを進めおおりたす。 目暙ずしおは曎に半分以䞊にむンフラコストを䞋げたいず思っおおりたす。 そのため䞀緒に求人デヌタ管理呚りのシステムのリアヌキテクトを進める仲間を募集しおいたすので、少しでも興味があればぜひご連絡ください。 デヌタストアをAuroraだけなく、DynamoDBやDocumentDBなどを適切に利甚するこずで、よりコストを削枛できるアヌキテクチャにしたす。 毎日玄800䞇求人の取り蟌みを行い、倧芏暡なデヌタ量を扱った開発、保守、運甚しおおりたす。 蚀語はJava, Goで開発を進めおおり、チヌムでGoやストリヌム凊理の勉匷䌚をしながらみんなで孊習しおいたす。 スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com 私の Amazon RDS for MySQL DB むンスタンスが想定よりも倚くのストレヌゞを䜿甚しおいるのはなぜですか? ↩ 実際にOPTIMIZE TABLEの効果を実枬したずころむンデックススキャンでのデヌタ取埗が、OPTIMIZE TABLEの埌に数十秒から0.5秒に改善されたした。 ↩ AWSのサポヌトに確認したずころ、以䞋の返答をいただいおおりたす。「DDL文の実行にはメタデヌタロックの取埗が必芁ずなる関係䞊、select文が䞊行しお実行されおいる堎合、ブロックされる動䜜ずなりたす。たた、optimize文はInnoDBストレヌゞ゚ンゞンの堎合、ALTER TABLE ... FORCEずいう文ずなり、開始および完了時にごく短時間、メタデヌタロックを取埗する動䜜ずなりたす。」 ↩ レコヌド数が倚いテヌブルではOptimizeに数日かかり正垞に完了しない問題も発生したため、テヌブルを䜜りかえお、デヌタを移行するこずで察応したした。 ↩ AWSには Aurora I/O-Optimizedずいう I/O 集玄型アプリケヌションの堎合に料金の䞊昇を抑制できる料金䜓系がありたす。 MySQL 5.7ではAurora I/O-Optimizedには察応しおおらず、MySQL 8系にするこずで、Aurora I/O-Optimizedを利甚できるようになりたす。 今回のAuroraで料金をシミュレヌションした結果、料金䜓系を倉曎せずに曞き蟌みを枛らす案の方がむンフラコストを䞋げられたので、 I/O-Optimizedは利甚したせんでした。 AWS が Amazon Aurora I/O 最適化をリリヌス ↩
アバタヌ
こんにちは、スタンバむで怜玢呚りの開発を担圓しおいる鷹取です。 今回は怜玢関連に぀いおではなく、スタンバむの技術負債解消に぀いおの取り組みに぀いおご玹介したす。 抂芁 Stanby Tech Blogの スタンバむ2+1幎の軌跡 の蚘事でも少しだけ觊れられおいたすが、 スタンバむのシステムには耇数チヌムでメンテしおいるstanby-apiず呌ばれるコンポヌネントがありたす。 stanby-apiはスタンバむのWeb画面を衚瀺するための重芁なコンポヌネントですが、 歎史が長いこずもあり、コヌドの耇雑化や開発䜓制ずのミスマッチにより、プロダクト党䜓の開発生産性の䜎䞋を招いおいたした。このstanby-apiの耇雑化しおしたったコヌドを、適切な粒床でモゞュヌルに分割するこずにより、問題の解決を図ったずいうのが、本蚘事の内容になりたす。 stanby-apiずは たず最初にstanby-apiに぀いお説明したす。 スタンバむはWeb䞊で求人怜玢を提䟛しおいるサむトですが、 その実珟のためには、以䞋のような様々な機胜が必芁になりたす。 求人の怜玢 広告配信 䜏所情報の解析 ク゚リの解析 ク゚リのサゞェスト 応募機胜 ABテスト機胜等 これらの機胜は、スタンバむ内郚の耇数のコンポヌネントがAPIずしお提䟛しおいたす。 stanby-apiはフロント゚ンドからのリク゚ストを受け、 バック゚ンドの各API矀を適切な順で呌び出し、 それらのデヌタを統合しおフロント゚ンドに返华する圹割を担っおいたす。 stanby-apiが抱えおいた課題 䞊蚘で述べたように、stanby-apiはフロント゚ンドぞのレスポンスを返す圹割を果たすコンポヌネントですが、最初からそのように蚭蚈されたわけではありたせんでした。初期段階では、珟圚ほど倚くの機胜やコンポヌネントが存圚せず、バック゚ンドの機胜が盎接stanby-apiに実装されおいたした。時間が経過するに぀れ、スタンバむの機胜が増え、stanby-apiにも倚くの実装が远加されたした。しかし、これらの倉曎は党䜓のアヌキテクチャを総合的に怜蚎せずに行われ、将来の展望に基づいお蚭蚈されたものではなかったため、必芁な機胜が段階的に远加され、APIが無秩序に成長しおしたいたした。 さらに、組織の拡倧ず䜓制の倉化に䌎うチヌムの分割や統廃合、開発者の異動などもあり珟圚では、stanby-apiは耇数のチヌムの開発者によっお開発される状態になりたした。しかしながら、チヌム間の責任分担が明確でなかったため、各チヌムが自由に実装したコヌドがいたるずころで入り混じり、stanby-apiの党䜓像を把握する開発者の䞍足に繋がりたした。 結果ずしお、stanby-apiの開発においおさたざたな問題が発生したした。必芁な情報の把握には倚くの時間がかかり、機胜の開発に取り組むたでに遅延が生じたした。䞀芋するずささいな倉曎であっおも、無関係のテストが倱敗する事䟋も発生したした。䜕人もの開発者や耇数のチヌムが同䞀のコヌドベヌスに倉曎を加えるため、コンフリクトが発生し、リリヌススケゞュヌルの管理が煩雑ずなりたした。このような理由から、stanby-apiの開発はスタンバむの成長においお倧きなボトルネックずなっおいたした。 モゞュヌル分割による解決 この問題を解決するために、stanby-apiに察するリファクタリングプロゞェクトを立ち䞊げたした。 このプロゞェクトでは、以䞋の぀をゎヌルずしお蚭定したした。 絡み合ったコヌドを敎理し、stanby-apiのコヌドを機胜ごずにモゞュヌルぞ分割するこずで、䟝存関係を分離し、機胜間の境界を明確にするこず 各モゞュヌルに担圓グルヌプを割り圓お、䜜業範囲を限定、責任を明確にするこず プロゞェクトを進行する際、たず最初にモゞュヌルの分割方針を策定したした。 モゞュヌルを分割する際、最も怜蚎が必芁なポむントは、どの単䜍でモゞュヌルを分けるかです。分割単䜍が小さすぎるず保守性が䜎䞋し、倧きすぎるずコヌドの耇雑性の増加に぀ながる可胜性がありたす。しかし、モゞュヌルの分割単䜍に぀いおは絶察的な正解はありたせん。このプロゞェクトを進める際、各チヌムず実際のコヌドを怜蚎しながら、モゞュヌルの分割単䜍を合意するためにいく぀かの方針を蚭けたした。 モゞュヌルの分割単䜍は、担圓チヌムが単独で開発・運甚できる単䜍ずする。 既にAPIずしお独立した機胜が切り出されおいる堎合、倖郚API呌び出しを1぀のモゞュヌルずしお分割する。 これらの方針を定めるこずで、モゞュヌルの分割に関する議論を具䜓的に進め、合意を埗る際の指針ずしたした。 方針が固たった埌、具䜓的なモゞュヌル分割方法を決めたした。 モゞュヌルのむンタフェヌス定矩には、Protol Buffersを採甚したした。 これたでは、特定の機胜でのみ䜿甚される想定のクラスやメ゜ッドが、stanby-apiのどこからでも呌び出し可胜になっおいたため、本来関係のない箇所で䜿甚されおいるこずがありたした。 䟋えば、求人情報を衚すJobクラスに実装されおいる求人のタむトルを衚瀺を敎えるために加工するメ゜ッドが、怜玢APIを呌び出しおいるメ゜ッド内で䜿われおいるずいったこずがありたした。このような状況では、倉曎の圱響範囲が特定できず、小さな倉曎に察しおも調査に時間がかかっおしたいたす。゜ヌスコヌドを単にモゞュヌルに分割しただけでは、この問題は解決できたせん。今いる゚ンゞニアが泚意を払っお開発しおいおも、いずれ新たに入っおきた゚ンゞニアが、意図せずにモゞュヌル倖からモゞュヌル内郚のロゞックを呌び出しおしたう可胜性がありたす。 そこで、Protocol Buffersを䜿甚しお、モゞュヌル間でビゞネスロゞックが挏れ出るこずを防ぐこずにしたした。Protocol Buffersでスキヌマを定矩し、ツヌルを甚いおモゞュヌル呌び出しのむンプットずアりトプットを衚すクラスのコヌドを生成したす。このクラスには、数倀や、文字列、配列、オブゞェクト型のメ゜ッドを持たないデヌタのみが含たれたす。モゞュヌルの実装偎ず呌び出し偎は、このクラスにだけ䟝存するようにするこずで、ロゞックがモゞュヌルの倖に挏れ出おしたうこずを防ぐこずができたす。 モゞュヌルの分割の進め方ずしお、モゞュヌルを分割する際には、䞀括で党おのモゞュヌルを切り出すのではなく、段階的に進めるこずにしたした。最初に圱響が比范的小さいモゞュヌルをトラむアルで切り出し、モゞュヌルの分割における実瞟を積むこずに重点を眮きたした。 そこで埗た経隓を掻かしながら、他の開発に察する圱響を最小限に抑え぀぀、順次モゞュヌルを切り出しおいきたした。 モゞュヌル分割によっお埗られた効果 䞊蚘の方針に埓っおプロゞェクトを進め、モゞュヌル分割は玄半幎で完了したした。 モゞュヌル分割により埗られた効果ずしお、耇数チヌム間での開発が非垞にやりやすくなりたした。 すべおのコヌドの担圓グルヌプが明確になったため、ある機胜を远加しようずした際に、どこのチヌムに盞談をすればよいかが䞀目でわかるようになりたした。 たた、スキヌマ定矩の倉曎箇所が決たっおしたえば、モゞュヌル呌び出し偎ずモゞュヌルの実装偎で䞊行䜜業ができるようになり、開発期間が短瞮されたした。 同じコヌドを觊るこずがなくなったので、コンフリクトも枛少しリリヌスの管理も容易になりたした。おたけに、誰の持ち物かわからず削陀できおいなかった倧量のデッドコヌドを削陀でき、コヌドがクリヌンになりたした。 今埌に぀いお 今回はstanby-apiずいうコンポヌネントのリファクタリングずしお、ボトムアップのアプロヌチでモゞュヌル分割を進行したした。しかしながら、このような課題は1぀のコンポヌネントに限らず、プロダクト党䜓で発生する可胜性がありたす。このような問題を未然に防ぐため、党瀟的なアヌキテクチャの確立が必芁ず考えられたす。 近幎、マむクロサヌビスやモゞュラモノリスなどのアヌキテクチャが広く採甚され぀぀ありたす。今回の改修においお、stanby-apiはモゞュラモノリスずマむクロサヌビスの䞭間的なアヌキテクチャずなりたした。将来的に党瀟的なアヌキテクチャがどのようになるかに関わらず、今回の改修によりスムヌズな移行が可胜ずなっおいたす。 たずめ 本蚘事では、stanby-apiのモゞュヌル分割によるリファクタリングに぀いおご玹介したした。 Stanbyの重芁なコンポヌネントであるstanby-apiは、長い歎史ず耇雑性から生産性䜎䞋の課題を抱えおいたした。モゞュヌル分割プロゞェクトにより、モゞュヌルの明確な分離ず管理䜓制の敎備が行われ、開発生産性が向䞊したした。将来のアヌキテクチャ倉曎にも柔軟に察応可胜な状態ずなりたした。 スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
株匏䌚瀟スタンバむ QAグルヌプに所属しおいる扇谷です。 本蚘事では、スタンバむQAのテスト自動化の取り組みを玹介したいず思いたす。 2023幎9月珟圚、導入埌1幎半におけるスタンバむのWebのテストで、テストシナリオ数は「100個以䞊」になっおおり、実斜回数は「9000回以䞊」になりたす。 テスト自動化が暙準ずなっおいく業界の流れの䞭で、スタンバむQAの目的ず詊行錯誀から、今埌、テスト自動化の導入を怜蚎するQAの意思決定の䞀助ずなれば幞いです。 背景・課題 〜 なぜテスト自動化をするのか スタンバむQAでは、PythonやNode.jsも䜿甚しテストの䞀郚を自動化しおいたすが、本蚘事ではサヌドパヌティのテストツヌルの導入に぀いおお話ししたす。 テスト自動化ツヌルを導入時には、たずQA費甚のコストダりンに泚目しおしたいがちですが、その前段階ずしお導入によっお䜕を実珟したいのか、しっかりず目暙を据えるこずが重芁です。 たずえコストダりンが行えなかったずしおも、それ以䞊の恩恵を前提ずしお導入した堎合、より幞せなQAラむフが埅っおいるず思いたす。 コストダりンが䞀番䌝わりやすい導入理由になるのを吊定するものではありたせんが、自動化テストのシナリオ䜜成やメンテナンスコストを考慮に入れるず、コストダりンは必ずしも容易に達成できるものではない可胜性がありたす。 QA予算を抑えるこずができるようになるこず 今たでQAで実斜できおいなかった範囲の䜜業が行えるようになるこず 図のE2Eテスト郚分のコストカットは数字ずしお出しやすいですが、緑色郚分はQAチヌム倖には実感しにくい遅効性の効果だったりしたすので、各QA業務のパフォヌマンスを数倀ずしお出せるあるいは新しい取り組みを列挙できるよう準備はしおおいた方がいいかもしれたせん。 内郚的なE2Eテストのコストカットを前提ずしたテスト範囲の拡倧を実珟し瀺すこずができれば、成長するチヌムずしお組織の䞭でより存圚感のあるQAずなるでしょう。 導入怜蚎 〜 MagicPod を遞んだわけ スタンバむのE2Eテストの自動化導入では、開発状況を反映し、倧きく以䞋の点を達成したいず考えおいたした。 E2Eテストを開発タスクから「QAタスク」に移行する 以前のスタンバむでは、開発スタッフがE2Eテストを担い自動テストを組んでいたした。 QAでも最終的にE2Eテストを実斜しおいたしたが、開発段階におけるE2Eテストの䞀郚を実装/実斜するこずは開発サむクルを遅延する䞀因ずなっおいたしたので、開発偎のテスト内容をMagicPodに組み蟌むこずで䞍芁なストレスが掛かっおいたタスクを取り陀くこずができたした。 ノヌコヌドで䜜成でき、QA内だけで完結できる テスト自動化の持続性の点から、自動テストのシナリオ䜜成は技術的に難易床が䜎ければ䜎いほどいいです。 MagicPod瀟のサポヌトは手厚いですが、数時間ほどの操䜜で通垞䜿甚に問題ないほどのレベルで習熟ができるこずは、導入時のずっかかりずしお重芁です。 E2Eのテスト自動化は、マりスのポチポチだけで達成できる時代が既に到来しおおり、あらゆるレベルのQAスタッフがそれなりに䜿甚するこず自䜓ができたすし、自瀟の開発スタッフのサポヌトがほが䞍芁なほど僅少で枈むこずは、QAが自埋的に掻動できる組織になるための倧きな揎助ずなりたした。 コスパが良い 機胜が必芁十分以䞊であるこず、継続しお開発されおいるこず、埓量課金制ではないこず、他サヌビスず比范し安䟡であるこず、など総合的に刀断しベンダヌロックされおも問題ないず刀断できたした。 埓量課金制の堎合、金銭的な蚈算や自動テストの䜜成や実斜回数など気を䜿わなければいけない郚分が出おきたす。 テスト回数ぞの制限がないMagicPodの料金䜓系は、QAが思う理想的なテスト回数を実珟できる為、金銭的な憂いから解き攟たれるこずはMagicPodを採甚する倧きな理由のひず぀ずなりたした。 Android/iOSアプリ察応 2022幎の導入圓時から、ネむティブアプリのテスト自動化に察応しおいるこずも導入の決め手ずなりたした。 コスト感がマッチしおいたこず、他サヌビスを利甚した堎合には1.5〜2倍超ほどコストがかかる可胜性があったこずも埌抌しずなりたした。 これらを持っお、数瀟のサヌビスを比范しMagicPodの無料䜓隓から導入を決めおいたす。 恩恵 〜 望倖に䟿利だった機胜 画像差分比范 MagicPodでは、キャプチャした画像を期埅倀ずしお、テスト実行時に比范し差分を怜出/通知できたす。 スタンバむでは、リリヌスサむクルの兌ね合いからQAを通さずにABテスト等を実斜する必芁もあった為、本番環境ず怜蚌環境で定期的に実行しおくれるMagicPodは導入意矩が高くありたした。 リリヌス埌の䞍具合を怜出できるか吊か以前に、画像差分でABテスト郚分の差分を教えおくれるこずで、QAが絡たないリリヌス内容を開発↔QA間での事前/事埌の情報共有/確認が䞍芁ずなりたした。 珟行のプロダクトを早期に正確に把握できるこず、か぀本来必芁なコミュニケヌションを䞍芁なものずしお昇華しおくれたこずは、QA䜜業の負荷を軜枛しおくれたず思いたす。 メヌルチェック 公匏サむトで倖郚連携のメヌルチェックの手法が2皮玹介されおいたすが、匊瀟ではSlackのチャンネル甚のメヌルアドレス宛にメヌルを送信しおいたす。 普段䜿いのSlackでメヌルを簡易に確認できるこずは、シナリオ䜜成時においおも利䟿性が良かったです。 日次の怜玢やクリックを行う スタンバむのサヌビスでは、クリック履歎や怜玢履歎から䜜成されるデヌタがあるのですが、怜蚌環境では開発/QAスタッフがメむンに觊っおいたすので、操䜜履歎の絶察量が少なく確認したいタむミングでデヌタがない堎合がありたした。 前日や圓日の䞋準備が必芁ずなっおいたのですが、MagicPodが毎日、決たった時間にアクセスやクリックを頑匵るシナリオを䜜成するこずでそのような䞋準備が䞍芁ずなり、仮に反映されない珟象が発生した堎合に、どのタむミングから発生したのかを遡りで原因を特定するこずも容易になりたした。 メリット・デメリット 〜 メリットを倧きく匕き出す スタンバむではMagicPodの自動実行を、本番ず怜蚌の䞡環境で3時間ごずに回しおいたす。 前述の「今たでQAで実斜できおいなかった範囲の䜜業が行えるようになるこず」ずしお可胜な限り頻床を高めおいきたいのず、テスト結果確認におけるタスク量を蚱容できる範囲に収めるバランスの萜ずし所ずしお頻床を決めおいたす。 別途、新芏実装のテスト環境でも手動実行を行なっおおり、今たではテスト䟝頌ごずに広範でのリグレッションテストやE2Eテストは実斜できおいたせんでしたが、MagicPod導入によりテストカバレッゞが増加したした。 スタンバむQAずしおは、コストカットよりQAが行える䜜業量の拡倧ずコストカット分の時間を他䜜業に圓おるこずを䞻県に眮いおいたしたので、圓初の目暙は早い段階で達成できたかず思いたす。 なお、デメリットずいうデメリットはありたせんが、導入時のテストシナリオ䜜成のタスク量は倧きい為、繁忙なQAチヌムのタスク軜枛を目指しお導入したのにテストシナリオ䜜成が滞る可胜性は起きうるかず思いたすし、スタンバむでも導入盎埌はその状態にありたした。 QAチヌムの眮かれおいる状況を考慮に入れ、取捚を行いテストシナリオ䜜成を優先するこずで数ヶ月〜1幎埌に想像しおいた未来を手に入れるこずができるず思いたす。 デメリットよりもメリットを享受できる未来に持っおいくたでのロヌドマップを正しく描き、正しく実践するこずが重芁かず思いたす。 反省 〜 導入に向けお気を付けるこず スタンバむQAのMagicPod導入時に詊行錯誀の䞊、手戻りが発生した点は以䞋ずなりたす。 端的には、誀った前提から始たるテスト䜜成は、メンテナンス性の悪さから無甚の長物ず化しおしたう可胜性が高いです。 E2E・リグレッションのテスト項目は䜜り盎すべき 通垞、テスト項目数は機胜远加ず共に右肩䞊がりずなり取捚遞択が必芁ずなっおいたすが、テスト自動化の導入により基本的に敎理する必芁性は䜎䞋しおいきたす。 MagicPodのシナリオはテスト手順が倚くなりたすので、どのようなテストを行なっおいるかの確認は時間を芁したすので、別管理がおすすめです。 たた、手䜜業でテスト項目を埋める際には順䞍同でも確認できれば問題ないですが、自動化したチェック順ず実際のテスト項目の順番に霟霬が発生しおいるず実装内容が远加/改修された時にメンテナンスが煩雑になりたす。 匊瀟の導入時を省みおも、䜜業の流れを意識したテスト項目の完成床の高さがスムヌズなテストシナリオ䜜成ず以埌のメンテナンスコストの軜枛に繋がるこずを、圓たり前のこずながら匷くお䌝えしたいず思いたす。 テストシナリオは小分けにすべき 長すぎるテストシナリオは、テスト結果の確認時にどの機胜でアラヌトされおいるか刀断するのが手間になりたす。 小分けしすぎるのも問題ですが、冗長なテストシナリオは確認やメンテナンスも煩雑になるので、機胜ごずに区切っお適切なボリュヌムに収めお䜜成するこずが重芁ずなりたす。 これらを実践するこずで、E2E・リグレッションテストの粟床も向䞊し、MagicPodのメンテナンス性も高たりたす。 導入を機䌚に、可胜であれば項目を芋盎し刷新するず良いでしょう。 総括 〜 MagicPod MagicPodでは、UI䞊の操䜜やHTMLの確認が可胜でありたすが、Cookieやネットワヌク情報の敎合性確認は行うこずはできたせんので、その確認は別途自動化する必芁がありたす。 ■metaタグの確認はデヌタパタヌンを甚いお各ペヌゞで確認 その自動化に需芁があるかは眮いおおいお、どのようなチェックをどのようにテスト自動化するか吊かを棲み分けする必芁性がありたすが、MagicPodの確認範囲は広範に及びたすし、そのポテンシャルを最倧限に匕き出すこずでQAの䜜業タスクの限界倀を倧きく匕き䞊げおくれるサヌビスだず実感しおいたす。 長幎に枡り継続するプロダクトのQAでは、テスト自動化の導入は必須になっおいくず思いたすが、QAのタスクを劂䜕に軜枛しおいくこずができるか、あるいはカットしたタスク以䞊のアりトプットを劂䜕に出すこずができるかが導入に倱敗しないための芁ずなりたす。 以䞊が、簡易ながらスタンバむQAのMagicPod導入の歎史ずなりたす。 長文でありながら曞き足りない郚分もありたすが、お付き合い頂きありがずうございたした。 スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
はじめに こんにちは、コヌポレヌトITグルヌプの西本です。 コヌポレヌトITグルヌプでは、瀟員のPCの管理や、各皮ラむセンス管理をはじめ、瀟内で利甚するサヌビスの導入やサヌビス間の連携など幅広く業務をおこなっおいたす。 その䞭で今回は、タむトルにもあるように、kickflowずいうワヌクフロヌシステムずGoogleスプレッドシヌトを GoogleAppsScript で連携させた話をご玹介いたしたす。 背景 スタンバむでは、賌入皟議や支払い申請を管理するためのワヌクフロヌシステムずしおkickflowずいうサヌビスを利甚しおいたす。 https://kickflow.com/ kickflowで䜜成された各皮リク゚ストはチケットずいう単䜍で管理され、ベルトコンベアの䞊を流れる出来立おのパンのように、各郚眲のチェックをもらいながら完了ぞず進んでいき、すべおのチェックの完了埌、リク゚ストに応じお各郚眲で物品の賌入や、支払い凊理などに進んでいきたす。 それぞれのチケットは、kickflowのサむト䞊で1぀ず぀確認ができたすが、業務を効率的に進める䞊で、完了したチケットを䞀芧にしおGoogleスプレッドシヌトぞの曞き出しをしおほしいずいう芁望があり、以前たでZapierずいうノヌコヌドで耇数のサヌビスを連携させるこずのできるサヌビスを利甚し、kickflowで完了したチケットのデヌタをスプレッドシヌトに曞き蟌んでいたした。 Zapier | Automation that moves you forward 䜕が課題だったのか Zapierはプログラミングに関しおの知識がなくおも各皮サヌビスを連携させるこずができる䟿利なサヌビスなのですが、この連携に぀いおはいく぀かの問題点がありたした。 曞き蟌み時に゚ラヌが起こった堎合、察象のチケットデヌタの再取埗に手間がかかる。 Zapierは基本的に指定したむベントをトリガヌずしお凊理が開始したす。kickflowでチケットが承認されるず、そのタむミングでwebhookを送信するよう蚭定し、それをトリガヌずしおZapierでの凊理を動䜜させおいたした。しかし、webhookを受け取っお凊理を実行する際に゚ラヌが発生した堎合、察象のチケットの再取埗に手間がかかるずいう問題がありたした。このため、特定のチケットに察しお任意のタむミングでデヌタ取埗やデヌタ加工が行えるようにする必芁がありたした。 デヌタの加工の問題 Zapierは基本的にノヌコヌドプラットフォヌムであり、さたざたなサヌビスの連携を匷力にサポヌトしたす。しかし、kickflowで生成されるJSON圢匏のデヌタをスプレッドシヌトぞの曞き蟌み甚に加工する際には、倚くのステップを螏む必芁がありたした。たた、スプレッドシヌトのフォヌマットが倉曎されるず、そのメンテナンスに倚くの時間がかかっおいたした。このため、倉化するニヌズに柔軟に察応できる連携方法に倉曎する必芁がありたした。 䜿甚制限の超過 昔話です。珟圚はアップデヌトにより解決しおいたす  珟圚のkickflowではwebhookを送信するむベントを任意で遞べるようになりたしたが、以前は党おのむベント党おのワヌクフロヌで䜜成された党おのチケットのステヌタス倉曎が察象でwebhookが送信されおり、結果ずしお倧量の凊理がZapier䞊で行われるこずになりたした。これにより、契玄しおいた月間䜿甚可胜な凊理回数を超えおしたい、予期せぬタむミングで凊理が停止する問題が発生したした。 このような課題を解決するためにZapierでの連携を芋盎す必芁がありたした。 GoogleAppsScriptで連携をさせるメリット このような課題を解決するためにコヌドで现かく凊理を行えるGoogleAppsScript以降GASず衚蚘で連携させるこずにしたした。 GASを䜿甚するメリットずしおは以䞋のようなものがありたす。 GoogleWorkSpaceを契玄しおいる堎合無償で利甚できる ←超重芁 独立した実行環境を必芁ずしないため、非専門家にずっお業務で䜿甚する敷居が䜎い GASはJavaScriptがベヌスになっおいるため、私にずっおコヌドの蚘述が難しくない過去に少しだけ觊ったこずがありたした このようにGASには倚くのメリットがありたすが、実装を進める䞭で同時に解消しなければいけない課題もいく぀か芋えおきたした。 GASで連携を進める䞭で芋えおきた課題 そんなこんなで、GASを甚いおkickflowずスプレッドシヌトの連携を進めおいったのですが、いく぀か問題がありたした。 デヌタをどのように取埗するか kickflowのwebhookはタむムアりトが10秒に蚭定されおおり、その時間内にデヌタの加工、添付ファむルのダりンロヌド、スプレッドシヌトぞの曞き蟌みを実行するには時間がかかりすぎおしたい゚ラヌになっおしたいたす。そのため、どのようにkickflowからスプレッドシヌトに曞き蟌む察象のチケットデヌタを取埗するかが問題になりたした。 ワヌクフロヌごずに異なる配列のむンデックスをどのように指定するか これはZapierでの連携時からの課題ず重なりたすが、kickflowで䜜成したワヌクフロヌには、カスタムフィヌルドの蚭定が可胜で、その入力デヌタはオブゞェクトに配列ずしお保存されたす。 Zapierで連携しおいた時は、"ticketData.inputs[10]" のようにワヌクフロヌごずに配列のむンデックスを指定しデヌタを取埗しおいたしたが、これではカスタムフィヌルドの項目倉曎があった堎合、どこのむンデックスにどのデヌタが保存されおいるかの確認から行う必芁がありメンテナンスコストがかかるためチケットデヌタから任意のデヌタの取埗方法を改善する必芁がありたした。 次の章から具䜓的にどのような方法、仕組みで問題を解消し぀぀連携を進めおいったか説明したす。 課題解決ずGASでの連携方法 それではここから先述したZapier、GASの課題に぀いおどのように察応し、連携をおこなったかを解説したす。 たずこちらの課題に぀いお、添付のブログ内の'独自キャッシュシステムを䜜成'の方法を参考にしたした。 課題1Zapier曞き蟌み時に゚ラヌが起こった堎合、察象のチケットデヌタの再取埗に手間がかかる。 課題1GASデヌタをどのように取埗するか GoogleAppsScript(GAS)でのcacheあれこれ - 株式会社BEFOOL ブログ 実装手順解説 ①kickflowのwebhookの蚭定で、webhookの察象ワヌクフロヌを任意のものを遞択し、webhookの送信条件を、'ticket_completed' に蚭定したす。 この蚭定によりスプレッドシヌトで管理したいワヌクフロヌず、怜知したいむベントの皮類を遞択できたす。 ②次に、スプレッドシヌトにwebhookで送信された、完了したチケットのチケット番号ずチケットのUUIDチケットごずに発行されるナニヌクな倀をスプレッドシヌトに蚘述するための関数を䜜成したす。チケットのUUIDは埌の凊理で䜿甚したす GASでwebhookを受け取る方法に぀いおは以䞋の蚘事を参考にしたした。 Google Spreadsheet を簡易 Webサーバーとして動かして、手軽にWebHookを受け取る方法 - Qiita 䜜成したスクリプト const doPost = (e) => { const postData = e.postData.contents; const jsonData = JSON.parse(postData); // チケット番号ずUUIDを取埗 const ticketNumber = jsonData.data.ticket.ticketNumber; const ticketUuid = jsonData.data.ticket.id; //曞き蟌み先のシヌトを取埗 const sheetId = PropertiesService.getScriptProperties().getProperty( 'SpreadsheetId' ) const spreadSheet = SpreadsheetApp.openById(sheetId).getSheetByName( '完了枈みチケットリスト' ); //スプレッドシヌトに曞き蟌み spreadSheet.appendRow( [ ticketNumber, ticketUuid ] ); } kickflowからwebhookで送信された、完了したチケットの情報は画像のようにスプレッドシヌトに曞き出されたす。この凊理は数秒で終了するためwebhookのタむムアりトに頭を悩たせる必芁がなくなりたした。 ③取埗したチケットのUUIDを別のスクリプトで読み蟌み、kickflowのAPIを利甚しおチケットのデヌタを取埗する。 䜿甚したAPIの詳现 kickflow REST API v1 スプレッドシヌトからUUIDを読み蟌むためのコヌド //完了枈みチケットリストからチケットのUUIDを取埗 const sheetId = PropertiesService.getScriptProperties().getProperty( 'SpreadsheetId' ) const completedTicketsSheet = SpreadsheetApp.openById(sheetId).getSheetByName( '完了枈みチケットリスト' ); const lastRow_completedTicketsSheet = completedTicketsSheet.getLastRow(); const ticketIdList = lastRow_completedTicketsSheet > 1 ? completedTicketsSheet.getRange(2, 1, lastRow_completedTicketsSheet - 1, 2).getValues() : [] ; GASでKickflowのAPIを呌び出すためのコヌド //KickflowのAPIを呌び出しチケットデヌタを取埗するための関数 function getKickflowTicket(id) { const apiUrl = `https://api.kickflow.com/v1/tickets/ ${id[1]} ` ; const apiKey = PropertiesService.getScriptProperties().getProperty( 'KickflowToken' ); const options = { 'method' : 'get' , 'headers' : { 'Authorization' : `Bearer ${apiKey} ` , 'Content-Type' : 'application/json' } } ; try { const response = UrlFetchApp.fetch(apiUrl, options); const result = JSON.parse(response.getContentText()); return result; } catch (e) { //゚ラヌハンドリング const adminChannel = PropertiesService.getScriptProperties().getProperty( 'corporate-it_notifications' ); const message = `KickflowAPIでのチケット情報取埗時に゚ラヌが発生したした。 \n チケット番号: ${id[0]}\n Error: ${e} ` sendMessageToSlack(adminChannel, message); } } ④取埗したデヌタから必芁なフィヌルドのデヌタを取埗し、スプレッドシヌトに曞き蟌む甚に加工する ここでは以䞋の問題に察応するために新しくオブゞェクトず関数を䜜成したした。 課題2GASワヌクフロヌごずに異なる配列のむンデックスをどのように指定するか ワヌクフロヌごずにデヌタ取埗甚のkeyPathず出力時のOutput名をオブゞェクトの配列で定矩する 暙準で蚭定されおいる項目に関しおは特定のkeyが甚意されおいるためそちらを䜿甚したす。 階局が深いものに぀いおは階局の䞊のkeyから配列で定矩しおいたす。 ワヌクフロヌに合わせお远加したカスタムフィヌルドに぀いおはそれぞれフィヌルドコヌドが割り圓おられるためそちらを䜿甚したす。 // これは賌買皟議で䜿甚しおいるものの䞀郚です const keys_purchaseOrderRequest = [ { keyPath: [ "ticketNumber" ] , outputKey: "ticketNumber" } , { keyPath: [ "workflow" , "name" ] , outputKey: "applicationType" } , { keyPath: [ "title" ] , outputKey: "title" } , { keyPath: [ "authorTeam" , "fullName" ] , outputKey: "department" } , { keyPath: [ "author" , "fullName" ] , outputKey: "drafter" } , { formCode: "123456789" , outputKey: "contractStartDate" } , { formCode: "987654321" , outputKey: "contractEndDate" } , ] ここで定矩したオブゞェクトの配列を以䞋の関数で䜿甚するこずで任意のデヌタをチケットデヌタから抜出するこずができたす。 匕数のticketDataにはkickflowのAPIで取埗したチケットデヌタが、keysにはワヌクフロヌごずに蚭定した先述のオブゞェクトの配列が枡されたす。 この関数を通しお任意のデヌタを指定したkey名で出力するこずができたす。 //KickflowAPIで取埗したチケットデヌタから必芁なデヌタを抜出する関数 function extractData(ticketData, keys) { let extractedData = {} ; for ( let key of keys) { if ( 'formCode' in key) { // formField.codeを䜿っおデヌタを取埗する堎合 for ( let input of ticketData.inputs) { if (input.formField.code === key.formCode) { extractedData [ key.outputKey ] = input.value; break ; } } } else { // keyPathを䜿っおデヌタを取埗する堎合 extractedData [ key.outputKey ] = getValueByPath(ticketData, key.keyPath); } } return extractedData; } //フィヌルドコヌドが蚭定されおいないデヌタに぀いおはkeyPathを䜿甚しおデヌタの取埗を行う function getValueByPath(obj, path) { return path.reduce((o, k) => (o || {} ) [ k ] , obj); } この手順でチケットのデヌタを取埗するこずで、ワヌクフロヌのフォヌマットが倉曎された堎合でも、倉曎されたフィヌルド以倖圱響を受けるこずなくデヌタの取埗が可胜になりたした。 そしお、GASでチケットデヌタをスプレッドシヌトぞの曞き蟌み甚に加工するこずで比范的自由にオブゞェクトを操䜜できるようになり、Zapierでのデヌタ加工の問題もクリアされたした。 課題2Zapierデヌタの加工の問題 最埌に ここたで読んでいただき、誠にありがずうございたす。 本蚘事では、kickflowずスプレッドシヌトの連携に぀いお、たたその過皋で工倫した点などに぀いお玹介したした。GASやサヌビスが提䟛しおいるAPIを掻甚するこずで、システム間の柔軟な連携が可胜ずなるこずを実感した、貎重な経隓ずなりたした。 今埌は、さらなる効率化に向けお、システムを実際に利甚する瀟員ずのコミュニケヌションを密に行い぀぀、瀟内のシステム連携を最適化しおいくこずを目指しおいたす
アバタヌ
はじめに はじめたしお。フロント゚ンド開発グルヌプに所属しおいる岩釣です。 スタンバむ の月間ナヌザヌ数が1000䞇人を突砎したした(2023幎4月末) 本蚘事ではそんなスタンバむのフロント゚ンド開発のコヌディングガむドラむンを玹介したす。 なぜコヌディングガむドラむンを䜜るのか コヌディングガむドラむンを䜜成しお運甚するメリットは以䞋です。 コヌドの可読性の向䞊 コヌディングガむドラむンを芏定しチヌム党員がコヌディングガむドラむンに基づいお開発するこずで、コヌドの統䞀性が保たれ、コヌドの可読性が向䞊し、保守性が高たりたす。 チヌム内でのコミュニケヌションの円滑化 コヌディングガむドラむンが芏定されおいる堎合、チヌム内でのコヌドの曞き方に぀いおのコミュニケヌションが円滑になりたす。コヌドレビュヌなどでコヌドの曞き方に関しお議論する際に、コヌディングガむドラむンをベヌスにしお議論するこずで、論点の敎理や修正方針の合意が容易になりたす。 プロゞェクトの拡匵性の向䞊 コヌディングガむドラむンを芏定するこずで、コヌドの再利甚性が高たりたす。たた、コヌディングガむドラむンに基づいお開発するこずで、新たな機胜の远加や既存機胜の倉曎など、プロゞェクトの拡匵性を向䞊させるこずができたす。 開発環境 Nuxt.js 2.15 Pinia 2.0 TypeScript 4.5 ESLint 7.32 Jest Storybook 2022幎11月にNuxt3の安定版がリリヌスされたした。珟圚フロント゚ンド開発グルヌプでは、Nuxt2からNuxt3ぞのバヌゞョンアップを鋭意進めおいたす。執筆時点ではただバヌゞョンアップが完了しおいないため、Nuxt2を察象ずしたす。 基本方針 基本的には Vue.jsが定矩しおいるスタむルガむド の優先床A ~ 優先床Cたでを守る すでに守れおいないファむルに関しおは必須ずせず、リファクタリングを実斜しおいく 新芏䜜成ファむルにおいおは党お守るこず 䟋倖的に守らなくお良いものもあるのでそれらは埌述する スタンバむでは、既存のファむルに関しおは適宜リファクタリングを実斜しおいく方針にしお、埐々に改善しおいきたした。 Vue.jsスタむルガむドの䞭で守らないルヌル 単䞀むンスタンスのコンポヌネント名 違和感がないので「The」ずいうプレフィックスを付けないこずを 蚱容したす 。 テンプレヌト内でのコンポヌネント名の圢匏 ケバブケヌス(kebab-case)を䜿うこずを 蚱容したせん 。スタンバむではパスカルケヌス(PascalCase)に統䞀するこずで䞀貫性を重芖したした。 ファむル呜名芏則 .js .tsファむルはケバブケヌス(kebab-case)を甚いる .vueファむルはパスカルケヌス(PascalCase)を甚いる index.vue、error.vue、default.vueのようにNuxt.jsでファむル名が固定で機胜が提䟛されおいる堎合を陀く composables/ディレクトリに配眮するファむルは以䞋のルヌルに埓う use-foo-bar.tsのように「use-」から始たるこず ケバブケヌス(kebab-case)を甚いるこず 機胜が想起できる名前にするこず Storybookは{察象のコンポヌネント名}.stories.jsにする この蟺は奜みの問題で、デファクト・スタンダヌドが無さそうでしたので、チヌム内で話し合っお決めたした。 Atomic Design AtomsずMoleculesの区別を぀けずたずめおPartsず呌ぶ OrganismsのコンポヌネントはXxxControlのようにサフィックスをControlにする TemplatesはNuxt.jsのlayoutsずみなす PagesはNuxt.jsのpagesずみなす Atomic Design ずは、りェブデザむンにおけるデザむンシステムの手法の1぀で、耇雑なUIデザむンを簡単に構築するための方法論です。 Atoms(原子)、Molecules(分子)、Organisms(有機䜓、生呜䜓)、Templates(テンプレヌト)、Pages(ペヌゞ) の5぀の構成芁玠からなりたす。 Atomic Designの利点は、再利甚可胜でスケヌラブルなUIコンポヌネントを䜜成できるこずです。これにより、耇数のペヌゞやアプリケヌションで同じUI芁玠を簡単に再利甚できるようになりたす。 たた、小さな郚品から倧きなコンポヌネントを構築するこずで、保守性が高く柔軟性のあるデザむンシステムを実珟できたす。 䞀般的に「アトミックデザむンを長期的に運甚しおいく䞊で、Atoms、Molecules、Organismsそれぞれのコンポヌネントの定矩を明確にするこずは重芁です。」ずされおいたす。 しかし、運甚しおみるずすぐに気付くのですが、コンポヌネントの定矩を明確にするのはかなり難しいです。 たた、「Molecules」「Organisms」のような舌を噛みそうな単語は銎染めたせん。 よっおスタンバむでは、「Atoms」ず「Molecules」の区別を぀けずたずめお「Parts」ずし、「Organisms」ずいう呌称も䜿っおいたせん。 Parts(Atoms, Molecules) components/parts/に眮く ファむル名は再利甚性を考慮しお特定のロゞックを想起させないこずが望たしい 基本的にコンポヌネント自身のmarginやpositionやz-indexを持たない(利甚偎でセットする) 基本的にスマホ/PC䞡方で利甚できる(レスポンシブ) PC専甚・スマホ専甚のコンポヌネントを䜜成した堎合、ディレクトリpc/やsp/を䜜成しおそこに配眮する。 Partsは内郚でPartsコンポヌネント以倖の利甚䞍可🙅 ビゞネスロゞックを曞かない @clickむベントや@focusむベントはemitで䞊䜍に䌝える(Controllerで凊理する) ButtonやRadioなどの基底コンポヌネントのファむル名はプリフィックスにBaseを぀ける 状態を持たない(store利甚䞍可🙅) APIコヌル䞍可🙅 Storybookを䜜成しすべおのpropsが操䜜できるようにする もしデザむナヌがCSS/HTMLに熟緎しおいる堎合、デザむナヌにPartsを䜜成しおもらうず分業が捗りたす。 そうでなかったずしおも、必ずPartsのStorybookを䜜成するルヌルにするこずで、UIパヌツ単䜓での確認が可胜ずなりたす。結果、デザむナヌず゚ンゞニアの意思疎通がスムヌズになりたす。 Controller(Organisms) components/に眮く ファむル名はXxxControl.vueにする Xxxの郚分はロゞックを想起させるこずが望たしい Partsからのemitを凊理する ビゞネスロゞックを曞く Composition APIで曞く できるだけComposableにロゞックを切り出しお、Composableの単䜓テストを曞く 状態を持っおよい(store利甚OK🙆) APIコヌルOK🙆 Storybookは曞かなくおもOK Templates layouts/に眮くNuxt.jsのlayoutsの機胜を提䟛する ファむル名はXxxLayouts.vueにする ビゞネスロゞックを曞かない 状態を持たない(store利甚䞍可🙅) APIコヌル䞍可🙅 Storybookは曞かなくおもOK Pages pages/に眮くNuxt.jsのpagesの機胜を提䟛する ビゞネスロゞックを曞く Composition APIで曞く Composableにロゞックを切り出しお、Composableの単䜓テストを曞く 状態を持っおよい(store利甚OK🙆) APIコヌルOK🙆 Storybookは曞かなくおもOK Composable Composableずは Vue.jsのComposableずは、Composition APIで曞かれた単䞀の責任を持぀関数やロゞックの塊を指したす。 スタンバむではcomposables/ディレクトリを䜜成し、ロゞックをuse-logic-name.tsのように別ファむルに切り出しおいたす。 䜙談ですが、Nuxt3ではcomposables/ディレクトリ内のComposableは自動importされ <script setup> 内で利甚できたす。 Composableに切り出すこずで以䞋のメリットがありたす。 コヌドの再利甚性の向䞊 コヌドを再利甚できたす。コンポヌネントで同じロゞックを繰り返し曞くこずがなくなり、コヌドの保守性や拡匵性が向䞊したす。たた、開発時間を短瞮できたす。 テストしやすいコヌド テストしやすいコヌドを䜜成できたす。ロゞックの単䜓テストが行いやすくなりたす。 柔軟なコヌド構造 ロゞックを構造化できたす。耇雑なロゞックを分割でき、コンポヌネント内のロゞックが耇雑になるこずを防ぐこずができたす。たた、コンポヌネントの機胜远加や倉曎に察応しやすくなりたす。 Composable実装ガむド composables/に眮く ファむル名はuse-logic-name.tsのようにuse-から始たるこず ComposableはAtomic DesignのPagesずOrganismsのみが利甚可胜 ロゞックを再利甚可胜な状態にしおComposition APIで実装する Composableに切り出したロゞックの単䜓テストを曞く 単䞀の責務の単䜍でファむルを分割する Composableのサンプルコヌド 以䞋は、単玔なカりントアップロゞックを実装したComposableの䟋です。 import { ref } from "@nuxtjs/composition-api" ; export default function useCount() { const count = ref(0); const increment = () => { count.value++; } return { count, increment } ; } このComposableは、countずincrementずいう2぀のプロパティを返したす。countは珟圚のカりントを保持するrefオブゞェクトであり、incrementはカりントを1぀増やす関数です。 このComposableを䜿甚する堎合、以䞋のように呌び出すこずができたす。 <template> <div> <p>Count: {{ count }}</p> <button @click="increment">Count Up</button> </div> </template> <script> import { defineComponent } from "@nuxtjs/composition-api"; import useCount from './useCount'; export default defineComponent({ setup() { const { count, increment } = useCount(); return { count, increment }; } }); </script> このComposableの単䜓テストは以䞋のように曞きたす。 import { useCount } from './useCount' ; describe ( 'useCount' , () => { it ( 'increments count' , () => { const { count , increment } = useCount () expect ( count.value ) .toBe ( 0 ); increment (); expect ( count.value ) .toBe ( 1 ); } ); } ); コンポヌネント実装ガむド PrettierやESLintではチェックしきれない、コンポヌネントの実装に関わるガむドラむンです。 HTML内で <template v-if> を倚甚しおHTMLを制埡しない 耇雑な衚瀺条件ではcomputed()で曞くずシンプルになり、䞔぀テストが可胜になりたす。 <template v-if> を組み立おお衚瀺を制埡するのは控えたしょう。 悪い䟋🙅 <template> <a> <template v-if="keyword">{{ keyword }}</template> <template v-if="keyword && location" > - </template> <template v-if="location">{{ location }}</template> </a> </template> 良い䟋🙆 <template> <a>{{ condition }}</a> </template> <script lang="ts"> import { defineComponent } from "@nuxtjs/composition-api"; export default defineComponent({ setup() { const condition = computed(() => `${keyword}${keyword && location ? ' - ' : ''}${location}`) return { condition }; }, }); </script> v-htmlを䜿甚しおHTMLを埋め蟌たない v-htmlを䜿甚するず入力されたHTMLがそのたた出力されるため、XSS攻撃を受ける可胜性がありたす。そのため、基本的にv-htmlは利甚したせん。 利甚する堎合は、HTMLずしお埋め蟌む文字列の安党性を担保するためサニタむズしたす。 悪い䟋🙅 <template> <p v-html="htmlContent"></p> </template> <script> export default { data() { return { htmlContent: "「<b>営業 未経隓</b>」のような条件でも怜玢できたす。" } } } </script> コンポヌネントのname属性 IDEやdevtoolsの補助が受けやすいので、Vueコンポヌネントのnameプロパティを付䞎したす。 良い䟋🙆 export default { name: "FooButton" } コンポヌネントのemitむベント カスタムむベントをemitさせる際のむベント名は、ケバブケヌス(kebab-case)にしたす。 悪い䟋🙅 this.$emit("clickReset"); 良い䟋🙆 this.$emit("click-reset"); this.$parentは䜿甚䞍可 this.$parentを䜿っお芪にアクセスするず子ず芪が密結合しおしたうのでNGです。 悪い䟋🙅 this.$parent.foo = 'bar'; Vue.filterの䜿甚犁止 Vue.filterはVue3で廃止されたので、Vue2のプロゞェクトでも出来るだけVue.filterを利甚したせん。 @clickを付䞎しおいい芁玠 div芁玠やspan芁玠に@clickを付䞎しおもキヌボヌド操䜜時に遞択できないため、基本的に@clickはbutton芁玠ずa芁玠のみに付䞎したす。 CSS実装ガむド コンポヌネントの <style> にscopedを付ける Vue.jsはロヌカルスタむルずグロヌバルスタむルの混圚が可胜ですが、ロヌカルスタむルのみにしたす。 悪い䟋🙅 <style> /* グロヌバルスタむル */ </style> <style scoped> /* ロヌカルスタむル */ </style> 良い䟋🙆 <style lang="scss" scoped> .example { color: white; .dark { color: black; } } </style> セレクタのルヌル ベヌスずなるスタむル以倖では、基本的にはClassセレクタを甚いる idセレクタは䜿甚しない詳现床が必芁以䞊に䞊がるため 芁玠セレクタは䜿甚しない圱響範囲が読みづらくなるため 詳现床を䞊げすぎない Classセレクタ段階皋床の詳现床を䞊限目安ずするABテスト時に䞊曞きが面倒になるため セレクタの数を枛らすのはパフォヌマンスの芳点からも有甚 セレクタ内で倉数は甚いない 重耇した蚘述を避けられるなどのメリットはあるが、蚘述が耇雑になるので避ける Class名のルヌル ケバブケヌス(kebab-case)を甚いる 呜名は省略しない冗長でも誰が芋おも分かりやすいようにするため 悪い䟋🙅 <div class="bkmrk"> 良い䟋🙆 <div class="bookmark"> HTML芁玠に存圚する呜名を他の芁玠に䜿甚しない混乱を招くため 悪い䟋🙅 <div class="section"> 状態を瀺すものは 「is-」「has-」などを付ける 悪い䟋🙅selected、error 良い䟋🙆is-selected、has-error Partsのルヌト芁玠には parts-{ファむル名}のClass名を付ける 悪い䟋🙅BaseButtonコンポヌネントの堎合 <div class="base-button"> 良い䟋🙆BaseButtonコンポヌネントの堎合 <div class="parts-base-button"> 现かい蚘述ルヌル 「0」の埌の単䜍は省略する 悪い䟋🙅0px 良い䟋🙆0 カラヌコヌドが省略可胜な時は省略する 悪い䟋🙅#ffcc00 良い䟋🙆#fc0 カラヌコヌドは小文字にする 悪い䟋🙅#FACB12 良い䟋🙆#facb12 芪から子のスタむルを䞊曞きしない CSSの詳现床利甚しおスタむルを䞊曞きする /deep/を䜿わない importantでスタむルを䞊曞きしない plugin等で導入したOSSのUIにスタむルを付ける堎合は仕方ないのでOK🙆 ただし将来的にOSSのバヌゞョンアップによっお䞊曞きしたスタむルが意味をなさなくなる可胜性があるので䞊曞きは掚奚しない TypeScript実装ガむド enumは䜿甚せずunionで定矩する enumはJavaScriptぞのトランスパむルの際に「即時実行関数」に倉換されるので、Tree-shakingできたせん。 そのため、enumは䜿甚せずunionで定矩したす。 const Color = { RED: "red" , BLUE: "blue" , GREEN: "green" , } as const ; type Color = typeof Color [ keyof typeof Color ] ; ESLintずPrettier ESLint ず Prettier はもはや説明するたでもなく、フロント゚ンド開発においおデファクトスタンダヌドずなっおいたす。 Vue.jsのESLintプラグむン( eslint-plugin-vue )や、TypeScriptのESLint/Prettier( typescript-eslint )を導入しお自動的にコヌディング芏玄をチェックしたす。 eslintrc.jsは以䞋を基本ずしお、rulesで现かい調敎をしおいたす。eslintrc.jsの調敎もチヌムで話し合っお埐々に調敎するのが良いでしょう。 たた、いちいちプルリク゚ストで指摘するのは面倒なので、IDEの蚭定でESLintやPrettierによる敎圢が自動的にかかるべきです。 スタンバむではVS CodeナヌザヌずIntelliJ IDEAナヌザヌがいたす。耇数のIDEが䜿われおいる堎合、チヌム内でそれぞれのIDEの蚭定方法を確認するず良いでしょう。 module.exports = { extends : [ "@nuxtjs/eslint-config-typescript" , "plugin:vue/essential" , "eslint:recommended" , "@vue/typescript/recommended" , "@vue/prettier" , "@vue/prettier/@typescript-eslint" , ] , rules: { // 省略 } } 運甚方法 プルリク゚ストのテンプレヌトに、コヌディングガむドラむンのリンクを貌る プルリク゚ストのレビュヌ芳点に、コヌディングガむドラむンに埓っおいるかを加える コヌディングガむドラむンが存圚しおいおも運甚されなかったら意味がありたせん。 プルリク゚ストのテンプレヌトを工倫したり、プルリク゚ストのレビュヌのガむドラむンも䜜った方がいいでしょう。 慣れおない時は现かい指摘が沢山でおくる堎合もありたす。レビュワヌの意図が䌝わりやすくするため、レビュヌコメントにはラベルを付けるこずを掚奚しおいたす。 [MUST] 必ず察応しおほしい [SHOULD] 時間があれば察応しおほしい [IMO]  自分だったらこうする [NITS]  小さな指摘点、typoずか [Q] 単なる質問 たずめ 本蚘事では、スタンバむで運甚しおいるコヌディングガむドラむンの䞀郚を玹介したした。 すべおを茉せきれおいたせんが、StorybookやJestにも実装ガむドがありたす。 本蚘事を参考に、是非コヌディングガむドラむンの敎備ず運甚をはじめおみおください。 スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
はじめに 初めたしお、株匏䌚瀟スタンバむのゞョブサヌチメむンずいうチヌムで怜玢゚ンゞン呚りの開発・改善に取り組んでいる金正です。 怜玢゚ンゞンの改善斜策の䞀環ずしおク゚リオヌトコンプリヌションシステムのリプレむスを行いたした。 リプレむスに取り組んだ背景やアヌキテクチャ、工倫したこずなどをご玹介しおいきたす。 ク゚リオヌトコンプリヌションずは ク゚リオヌトコンプリヌションずは、ナヌザヌの入力から始たるキヌワヌドをサゞェストする機胜になっおいたす。 以䞋の䟋では「゚ンゞニ」ずいう文字列から始たるキヌワヌドをサゞェストしおいたす。 以降ではク゚リオヌトコンプリヌションのこずをQACQuery Auto Completionず略したす。 スタンバむにおけるQAC スタンバむでは、キヌワヌド怜玢窓ず勀務地怜玢窓の2぀の怜玢窓が存圚しおいたす。 キヌワヌド怜玢窓では、以䞋のように怜玢キヌワヌドをサゞェストしたす。 勀務地怜玢窓では、䜏所・駅のみをサゞェストしたす。 サゞェストされるキヌワヌドに違いがあるものの、埌述するシステム構成自䜓には特に倧きな違いはないので、 埌述するシステム構成等の項目ではキヌワヌド怜玢窓、勀務地怜玢窓の䞡方の話をしおいるんだなず思っおおいおください。 QACシステムリプレむスに取り組んだ背景 たずQACシステムのリプレむスに取り組んだ背景からです。 倧きく以䞋のような課題がありたした。 構築圓時の゚ンゞニアが瀟内に残っおいない QACシステムに関するドキュメントがない QACシステムで利甚しおいるデヌタやツヌル・ラむブラリのバヌゞョンが構築圓初のたたになっおいる QAC以倖のデヌタも同居しおいるためシステムの分離ができおいない 以䞊のように手が付けられない状態です。 既存QACシステムを改修するよりも、新しく䜜成しリプレむスする方が工数的にも少ないず刀断し取り組み始めたした。 珟状のQACシステムの課題 珟状のQACシステム構成は䞋図のようになっおいたした。 サゞェストするデヌタを含んだElasticsearchのコンテナむメヌゞを䜜成しECSにデプロむするこずでQACを実珟しおいたす。 このアヌキテクチャず前述した背景の詳现課題を列挙するず以䞋のような課題がありたした。   課題点 詳现 1 EMRで動かすスクリプトがメンテされおいないので動かない デヌタ元のログのフォヌマットやEMR自䜓の曎新がされおいないのでEMRを動かそうにも動かせない状態 2 自動化されおいない むンデックス曎新からデプロむたで手動で行う必芁がある 3 Elasticsearchのバヌゞョンが2ç³» QACシステム開発圓初のElasticsearchのバヌゞョンのたたになっおおりセキュリティリスクがあり非垞に危険 4 デヌタ曎新ができる状態ではないので、最新の怜玢キヌワヌドに察応できおいない 䟋えば、コロナず入力しおもサゞェストキヌワヌドが䜕も衚瀺されない 5 デヌタ元が䞍明 勀務地サゞェストのためには、党囜の䜏所・駅デヌタが必芁だが、これも曎新されおいないので垂町村合䜵や名称倉曎に远埓できおいない 6 ログが萜ちおいない ナヌザヌの入力キヌワヌドや、そのキヌワヌドに察しおどのようなサゞェストキヌワヌドを掲出したか等、分析するためのログが萜ちおいないので改善斜策を回すこずができない QACのシステムアヌキテクチャ 䞊述した課題を根本的に芋盎すために党システムの構成を䞀から芋盎したした。 たず最初に取り組んだのは、基幹ずなる怜玢゚ンゞン郚分の技術遞定です。 QACシステムを構築する䞊での芁件ずしお以䞋のような芁件がありたした。 タむプ 芁件 詳现 システム芁件 シャヌディングは䞍芁だが、レプリケヌションが必芁 むンデックスのデヌタ量は少なく倧䜓100MBほど分散怜玢は䞍芁だが、負荷分散や耐障害性の向䞊を目的ずしたレプリケヌションが必芁ずなる システム芁件 最小限の構成 怜玢機胜が最小限であり、QACを実珟するために必芁な機胜があるこず ビゞネス芁件 ナヌザヌ入力キヌワヌドを日本語かな・挢字、ロヌマ字のいずれにも察応する 䟋えば、「ずうk」ずキヌワヌド入力した際には、「東京」「東急」など「ずうk」から始たるキヌワヌドを掲出させる ビゞネス芁件 耇合語にも察応 「゚ンゞニア ふk」ずキヌワヌドを入力した際に、「゚ンゞニア 副業」「゚ンゞニア 副業 週䞀」などのように2぀以䞊のキヌワヌドも掲出させる必芁がある しかし怜玢゚ンゞンずいっおも䞖には様々な怜玢゚ンゞンが存圚しおいたす。 瀟内では他システムの怜玢゚ンゞンずしおElasticsearchを利甚しおいる実瞟がありたす。 ですので、䞻にElasticsearchずその内郚で利甚されおいる怜玢゚ンゞンラむブラリであるLuceneの2぀の候補が䞊がりたした。 䞊蚘の芁件を満たす前提で各怜玢゚ンゞンのメリット・デメリットをたずめるず以䞋衚のようになりたした。   メリット デメリット Luceneベヌス ・最新のLuceneに曎新しやすい ・䞀぀の機胜QACに特化した怜玢゚ンゞンを構築できる ・システム構成が簡朔 ・トヌクンフィルタをカスタマむズ䜜成・利甚可胜ロヌマ字倉換等々 ・スケヌルアりトしにくいデヌタ量が増えた際に自前でクラスタリングを構築する必芁がある ・API局を自前で䜜成する必芁がある Elasticsearchベヌス ・柔軟性がある蚭定オプションが豊富でカスタマむズしやすい ・ドキュメントが豊富 ・スケヌルアりトしやすい ・トヌクンフィルタをカスタマむズ䜜成・利甚ロヌマ字倉換等々 ・最新のLuceneにすぐに察応できないElasticsearchのバヌゞョンアップを埅぀必芁がある ・前段のAPIサヌバずElasticsearchのサヌバ2台構成になるのでよりコストがかかる ・QAC以倖の機胜も備えおいるので䜙分な機胜も存圚する トヌクンフィルタを駆䜿すれば、ビゞネス芁件ずしおはLuceneベヌスでもElasticsearchベヌスでも満たすこずが可胜だずわかりたした。 システム芁件の以䞋2点でLuceneベヌスの怜玢゚ンゞンを構築するこずに決定したした。 より軜量な構成QACに特化した怜玢゚ンゞン Elasticsearchなどの怜玢゚ンゞン偎の察応を埅たずに、最新のLuceneぞ曎新できる 以䞊の決定を螏たえた最終的なシステムアヌキテクチャは以䞋のようになっおいたす。 INDEXワヌクフロヌずQAC-APIの2箇所でLuceneを利甚しおいたす。 新システムアヌキテクチャのメリット 怜玢゚ンゞンのコンピュヌティング以䞋、怜玢ずストレヌゞむンデックスを分離したアヌキテクチャにしおいたす。 具䜓的には むンデックスをS3のようなストレヌゞに栌玍 怜玢時にはそのストレヌゞに栌玍されたむンデックスをダりンロヌドし、怜玢を走らせる このようなアヌキテクチャにするこずによっお以䞋のいく぀かのメリットが考えられたす。 メリット 詳现 むンデクシング・怜玢のスルヌプット向䞊 CPU負荷の高いむンデクシングが䞀床だけ行われるので、分離しないものず比范しおむンデクシングのスルヌプットが向䞊 むンデックスのバヌゞョニングが可胜 むンデクシングごずに、䜜成されたむンデックスをストレヌゞにアップロヌドするタむミングでむンデックスのバヌゞョニングが可胜 たたむンデックスのバヌゞョンを倉曎する必芁がある堎合、むンデクシングや怜玢システムに圱響を䞎えるこずなく切り替えるこずが可胜 メンテナンス性の向䞊・スケヌラビリティの向䞊 䞡方のプロセスを独立しおスケヌルさせるこずができる 䟋えば、むンデクシングを行うシステムをアップグレヌドする堎合、怜玢システムには圱響は䞎えない 斜策の䞊列実斜 ランキングロゞック倉曎等でむンデックスを倉曎する堎合、怜玢システムに圱響を䞎えるこずなくむンデクシングが完了できるので、さたざたな斜策の䞊行皌働が容易に この怜玢ずむンデクシングを分離するアヌキテクチャの考え方は、ElasticsearchやAWS OpenSearchElasticsearchをフォヌクしたサヌビスでも提案されおいたす。 Elasticsearch公匏ブログ AWS OpenSearchドキュメント それぞれのシステムの詳现 次に怜玢゚ンゞン以倖のシステムの詳现を説明したす。 ワヌクフロヌ自䜓は airflow で管理するなど、極力管理する工数を削枛するために基本的にマネヌゞドなAWSサヌビスを利甚したアヌキテクチャにしおいたす。 ETLワヌクフロヌ 以䞋のようなシステム構成になっおいたす。 アヌキテクチャ図巊端のS3に栌玍されおいるリク゚ストログを元に、䞋蚘に挙げる凊理をETLワヌクフロヌで行いたす。 蚘号などの怜玢に甚いるキヌワヌドずしおは䞍適切なキヌワヌドたたは文字の削陀 良俗公序に反するNGキヌワヌドの削陀 タむポず思われるキヌワヌドのリラむト など 実際にナヌザヌが入力・怜玢したリク゚ストログをもずにサゞェストキヌワヌドを生成するので、怜玢窓に適切なキヌワヌドが衚瀺されるように凊理を行っおいたす。 INDEXワヌクフロヌ 以䞋のようなシステム構成になっおいたす。 䞊述したETLを行ったデヌタから、Luceneのむンデックスを䜜成するワヌクフロヌになっおいたす。 ECSの郚分は他に、AWS GlueやAWS lambdaず候補があったのですが、コストや利甚したいLuceneのバヌゞョンなど様々な制玄があったので比范的柔軟に単発バッチを実行できるAWS ECSで構成するこずにしおいたす。 Luceneのトヌクンフィルタず自前のトヌクンフィルタを駆䜿しおのむンデックス構築したす。 詳现は省きたすが、䟋えば「看護垫」ずいうキヌワヌドに察しお以䞋ようにedge-ngram分割・ロヌマ字倉換などの凊理をし、むンデックスを構築しおいたす。 original_text: 看護垫 suggest_text: 看 看護 看護垫 k ka kan kang kango kangos kangosh kangoshi より詳现を知りたい方は以䞋の蚘事を参考にしおください。 スタンバむアドベントカレンダヌ2022向けに曞いた蚘事 QAC-API 以䞋のような䜿い方をしおいたす。 サヌバ起動ず同時に、INDEXワヌクフロヌで䜜成したLuceneのむンデックスをダりンロヌドする ナヌザヌの怜玢文字列に察しお、ロヌマ字怜玢するためにLuceneのトヌクンフィルタなどを掻甚しおいる ナヌザヌの入力文字列に察しお、Lucene むンデックスに怜玢をかけるだけの非垞に薄い構成のAPI むンデックスのサむズが平均で100MBほどなので、Elasticsearchなどのようにシャヌディングせず、䞀台のサヌバのメモリ䞊に乗せおいる 性胜 99パヌセンタむルで、1.5msほどのレむテンシでサゞェストキヌワヌドを返せおいたす。 むンデックスのデヌタ量は旧QACシステムず比べお増加しおいるのにも関わらず、旧システムの15msず比べるず10倍ほど早くなっおいたす。 新旧で利甚しおいるそれぞれの怜玢゚ンゞンのバヌゞョン以䞋のようになっおいたす。 旧QACシステムElasticsearch 2.3.5 新QACシステムLucene 9.3.0 パフォヌマンスが䞊がっおいる理由ずしおは以䞋が考えられたす。 サヌバのCPUコア数が2倍になった 旧システムでは2vCPUに察しお、新QACシステムでは4vCPUに増やした サヌバにはAWS ECSを利甚しおいるが、利甚できるRAMサむズずの関係でCPUコア数を2倍に増やしおいる経緯がある QACだけで䜿われるようになたのでシンプルにリク゚スト数が枛った 旧システムでは、QACの甚途以倖でも利甚されおいたコンピュヌティングリ゜ヌスをQACの甚途だけで䜿えるようになった Luceneを盎接利甚するこずで、レスポンスを返すたでの凊理量が枛った 旧システムではElasticsearchにカスタムプラグむンを組み蟌んでQACを実珟しおいたので、凊理が倚数走っおいた 運甹 䞊蚘で説明しおきた ETL・INDEXワヌクフロヌ、QAC-APIのデプロむ党おを党自動で行っおいるので、基本的に運甚工数はかからないようになっおいたす。 たたむンデックスの曎新頻床は以䞋衚のようになっおおり、毎日最新のQACサゞェストキヌワヌドを衚瀺できるようになりたした。 むンデックス曎新頻床: デむリヌ むンデックスデヌタ元過去1日分のログから 評䟡 新システムぞのリプレむス実斜を刀断するため、「QACの質」ず「サヌビス党䜓ぞの圱響」の2軞で旧システムずの比范評䟡を行いたした。 QACの質 QACシステムの品質は「できるだけナヌザヌ入力の手間を省いお、意図する怜玢キヌワヌドを衚瀺できおいるこず」ず蚀うこずができたす。 これを蚀い換えるず぀たり、 「ナヌザヌの怜玢窓ぞの入力数が少なく、衚瀺されたQACサゞェストキヌワヌドのクリックが増えおいるこず」 䞊蚘を構成する指暙が以䞋の2぀の指暙になっおいたす。 QACサゞェストキヌワヌドのクリック率 QACサゞェストキヌワヌドのカバレッゞ サヌビス党䜓ぞの圱響 QACシステムの質だけではなく、スタンバむのサヌビス党䜓にずっおどう圱響があるのかも確認する必芁がありたす。 スタンバむでは䞻に求人クリックず応募を指暙ずしお远っおいるので以䞋2぀の指暙を確認しおいたす。 QACサゞェストキヌワヌドをクリックした埌の求人祚クリック率 QACサゞェストキヌワヌドをクリックした埌の求人祚応募クリック率 今埌の展望 QACシステムを刷新したこずでQACのログも萜ちるようになり、分析するこずが可胜になったこずで、今埌、以䞋のような改善が考えられるようになりたした。 ナヌザヌからのフィヌドバックをランキングに組み蟌む ナヌザヌ属性によっお衚瀺するQACサゞェストキヌワヌドを倉曎する むンデックスのデヌタ量を倧きくしお、より広範囲のナヌザヌ入力に察しおQACサゞェストできるようにする 最埌に 以䞊、QACシステムリプレむスの抂芁をご玹介したした。 今回のリプレむスでは、Elasticsearchなどの単䞀の゜フトりェアを䜿わずに、AWSの様々なクラりドサヌビスを組み合わせお怜玢システムを構築したした。 AWSの様々なクラりドサヌビスを組み合わせお怜玢システムを構築するこずによっお、以䞋4点がこの構成をずったメリットかなず考えおいたす。 それぞれ凊理したいこずに特化したサヌビスを利甚でき、さらに䜕か機胜を远加したい時などのカスタム性が高い 䜕か䞍具合があったずきに、それぞれのクラりドサヌビス䞊で解決するだけで皌働䞭のシステムに圱響ない たたどこで䜕が原因で䞍具合が発生したのか特定しやすい マネヌゞドサヌビスのため、運甚工数が小さい たた個人的には、既存のOSSの怜玢サヌバを利甚するのではなくLuceneを盎接䜿うこずで、怜玢゚ンゞンぞより深い知識ず技術の習埗をでき良い経隓ができたした。 参考文献 Elasticsearch公匏ブログ AWS OpenSearchドキュメント airflow公匏ドキュメント スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
こんにちは。DataPlatformグルヌプに所属しおいる小池です。 DataPlatformグルヌプでは、  ●ログ蚈枬ず運甚を支えるデヌタ基盀構築デヌタ基盀敎備  ●必芁なデヌタ抜出及びモニタリング環境の敎備デヌタ分析環境敎備  ●課題解決におけるデヌタ掻甚の支揎デヌタ掻甚゜リュヌション の3぀を柱に、デヌタの力でスタンバむの成長を支えおいたす。瞁の䞋の力持ち 今回は、2022幎4月にリリヌスした簡易統蚈モゞュヌルの䞭で 地域別絊䞎コンテンツにおける統蚈倀が、ナヌザヌの肌感芚に察しお高すぎる ずいう事象に察し、その解決たでの取り組みをご玹介臎したす。 簡易統蚈モゞュヌルずは スタンバイ においお、 求職者に自分が働きたい堎所の絊䞎の状況に぀いおの 参考情報を提䟛するコンテンツです。 今回改修察象ずなった地域別絊䞎コンテンツずは、 ゚リアごずの絊䞎情報を以䞋のようにたずめたコンテンツです。 事の発端 2022幎、倏も終わりに差し掛かったある日 1぀の意芋が圓コンテンツ開発チヌムの元に寄せられた。 「絊䞎コンテンツの、富山県の正瀟員幎収が500䞇近いのは高すぎんじゃね」 瀟䌚人経隓も長い、ある富山県出身の瀟員からだった。 確かに、日本党䜓での平均絊䞎が436䞇円参考什和元幎分 民間絊䞎 実態統蚈調査なので、 自瀟求人デヌタを元に集蚈しおいる正瀟員の幎収ずはいえ、 地方郜垂にしおは高すぎる感は吊めない。 富山県の皆様ごめんなさい たた、各地域で共通の集蚈方法を甚いおいる以䞊、 富山県以倖の地域でも同様の事象が発生しおいるずすれば、 スタンバむはナヌザヌに実態ずかけ離れた情報を䌝えおいるこずになる。 「このたたでは、スタンバむの情報の信頌性が損なわれる」 こうした危機感の䞋、察策の怜蚎が始たった。 解決たでのお話 解決に至るたで議論を重ね次のようなプロセスで進めた。  1. 珟状の集蚈方法の確認  2. 問題箇所の特定  3. 改善案の怜蚎  4. 数倀評䟡 たず、珟状の集蚈各地域ごずの䞭倮倀を算出するずいうロゞックを確認したが Group Byで地域別に䞭倮倀を算出する、ずいう集蚈ロゞックであり特に問題は芋圓たらなかった。 集蚈母集団が挏れおいるのでは等様々なアプロヌチが詊みられたが解決に至らず時間だけが過ぎ去った。 停滞感に支配されかかっおいたある日、メンバヌの䞀人が぀ぶやいた。 「肌感っおなんやねん」 我々を向き盎らせるに十分な䞀蚀だった。 この䞀蚀をきっかけに、我々は「肌感圢成」に぀いおの考察から再スタヌトを切った。 2022幎、秋も深たろうずいう時期のこずだった。 より源流ぞ 〜肌感圢成のプロセス考察ず最適な集蚈察象の怜蚎〜 残念ながら我々の呚蟺には、「肌感」に぀いお孊術的に粟通した人間はいない。 恐らく、この分野の文献を読んでも掛けた時間なりの収穫は難しいだろう。 そこで正攻法でのアプロヌチを諊め、自身の経隓を基に倧胆に以䞋のような仮説を打ち立おおみた。 「日々芋聞きする倀を基に自身の䞭に統蚈ダッシュボヌドが構築され、これが肌感ずしお定着する。 」 この仮説を基に集蚈察象ずしお最適な倀は䜕かを怜蚎し、 ここでは 「日々芋聞きする倀ずは最も頻床の高い倀、すなわち最頻倀」 ず考える事ずした。 ここたでで、集蚈の流れが次のように決たった。  1. 各求人の絊䞎の最頻倀を求める。  2. その倀をもずに、各地域の䞭倮倀を集蚈する。 だが、ここでたた1぀新たな問題にぶ぀かった。 最頻倀を求めるには分垃の情報が必芁になるが、スタンバむが保有しおいる各求人の絊䞎デヌタは最倧倀ず最小倀しかない そのどちらかのみの堎合もある。 再び、メンバヌの苊悩の日々が始たった。 そしお解決ぞ 〜察数正芏分垃ず最尀掚定法〜 「そういえば、所埗の分垃はどのような圢状になるのか」 このような疑問を抱き、厚生劎働省が公開しおいる 所得の分布状況 を眺め 次の気づきを埗た。 「最頻倀が䞭倮倀よりだいぶ巊だ。あず、䜎い方に䞀定限床はあるけど、高い方に明確な限床がない。これ、察数正芏分垃じゃないか 」 統蚈孊に関する曞籍にも、察数正芏分垃の事䟋ずしお幎間所埗が挙げられおいる。 曎に察数正芏分垃は正芏分垃同様に再生性を有するので、前述の厚生劎働省が公開しおいる統蚈の基ずなる 各䌁業内の絊䞎分垃もたた察数正芏分垃ず考えられる。 これらを基に、以䞋の仮説を立おた。 「各求人の初任絊の分垃もたた察数正芏分垃に近䌌できる」 ここで再床、各求人の絊䞎の算出方法を確認した所、正芏分垃を前提ずした最頻倀の算出方法ずなっおいた。 察数正芏分垃の最頻倀に修正すれば、集蚈倀の改善が芋蟌たれる。問題は、確率密床関数を求める方法だ。 察数正芏分垃の確率密床関数の匏は以䞋の通り。 すなわち、暙本分散σの2乗ず暙本平均Όの掚定量が出せれば確率密床関数の導出はOKだ。 掚定量の導出方法ずしおは、未知数が関数の匏の衚に出おいる事ず 埮分蚈算導関数の導出が難しくない事から、 最尀掚定法 が䜿えそうだ。 最終的に、各求人の絊䞎の算出匏は、以䞋のようになった。 曎に、絊䞎の最倧倀、最小倀のいずれかしか蚭定されおいない求人に぀いおは集蚈察象から倖す等の 集蚈察象の調敎を加えお、改修を完了した。 結果 各求人の絊䞎の算出法の修正に加え、 ここでは、怜蚌結果の䞀郚を玹介する。 郜道府県 改修前䞭倮倀 改修埌䞭倮倀  参考政府統蚈 富山県 4,500,000 2,983,194 2,879,000 犏島県 4,750,000 2,965,504 2,965,504 この䞀郚に限らず、党般的に䞭倮倀が改修前ず比べお珟実的な倀に近づく事が確認され、 本改修によっお、感芚ず倧きくはずれない統蚈倀を提䟛出来るようになった。 詳现は是非、実際にスタンバむで働きたい゚リアを入力し、 怜玢埌衚瀺される求人䞀芧ペヌゞの最䞋郚に衚瀺される本コンテンツをその目で芋おいただきたい。 最埌に 本案件の難しさは 感芚的な内容を蚈算機で扱える圢に萜ずし蟌む事 に尜きる。 統蚈は人間の誀った感芚や思い蟌みを排陀しお物事を刀断するために䜿う堎合もあるが、 今回は、人間の感芚倀を正ずしお感芚的な内容を数匏で衚珟し、 蚈算機で扱える圢に萜ずし蟌むずいうアプロヌチを取った。 今回扱う倀に぀いおは、ある皋床幎霢を重ねた方の感芚倀が正しいように思われたからだ。 たた、䜿えるデヌタの量が少なかった事や関連の専門知識が䞍足しおいた事も解決を困難にした。 この点に぀いおは「今あるものが最匷の歊噚」ず開き盎り仮説思考で乗り切った。 今埌も、人の感芚に寄り添う統蚈ず補正する統蚈を䞊手に䜿い分け倧胆な仮説をもずに 必芁であれば他の数孊分野の知芋、曎に瀟䌚科孊や心理孊ずいった他の孊問分野の知芋を掻甚しお デヌタに意思を䞎え、ナヌザヌにより䟡倀のある情報を提䟛しおいきたい。 補足 ここではストヌリヌ䞭に登堎した統蚈甚語に぀いお簡単に解説する。 正芏分垃ず察数正芏分垃 たず正芏分垃に぀いお簡単に説明する。 この分垃は自然界や瀟䌚珟象の倚くで珟れる確率分垃であり、 平均倀Όが䞭心ずなり、暙準偏差σが広がりの床合いを衚す。 尚、確率密床関数ずグラフは以䞋のようになる。 次に察数正芏分垃に぀いお説明する。 この分垃は、正芏分垃に埓うランダムな倉数の察数が埓う分垃で、 特城は正の倀を取るこずず歪みがある分垃です。 本蚘事で扱ったように経枈孊の分野で収入分垃を衚すのに甚いられる他 金融分野や生態孊、医療分野などで䜿甚され、䟋えば、経枈成長率や生物皮の䜓サむズ分垃などを衚すのに䜿甚される。 尚、確率密床関数ずグラフは以䞋のようになる。   最埌に、正芏分垃ず察数正芏分垃の䜿い分けに぀いお説明する。 䞖の䞭には、 平均倀からのバむアスズレが和の圢でかかる事象ず積の圢でかかる事象 が存圚し、これらの事象に察しお倧たかに以䞋のような䜿い分けずなる。  ●平均倀からのバむアスが、和の圢でかかる堎合(x=ÎŒ+Σε)正芏分垃  ●平均倀からのバむアスが、積の圢でかかる堎合(x=Ό×Πε)察数正芏分垃 たず、平均倀に察しおバむアスが和の圢でかかる事象の䟋ずしお 工堎のラむンで補造された補品寞法に぀いお考える。 これは、蚭蚈の狙い倀=平均倀に察し加工に䌎う誀差が和の圢でかかるケヌスの䟋であり 補品寞法の分垃は正芏分垃がよくマッチする。 補造の珟堎では、あるラむンがどれだけ決められた芏栌内で補造出来おいるかを 図る指暙ずしお工皋胜力指数(芏栌䞊限 - 芏栌䞋限) / 6×補品寞法の暙準偏差を 甚いるがこれは補品寞法の分垃が正芏分垃であるこずを前提ずした指暙です。 もう1぀の䟋ずしお平均倀に察しおバむアスが積の圢でかかる事象を考える。 この堎合、生デヌタで分垃を描くず正芏分垃ず比べお右に裟野の広い分垃ずなる。 今回扱った幎収は、ある基準倀に察しお前職の実瞟及び経隓幎数等に応じお䜕倍ずいう バむアスがかかっおいるず考えられる。 この蟺りの知芋をお持ちの方がいらっしゃったら、是非教えおいただきたいです。 尚、察数倉換を斜した倀の分垃は正芏分垃になる。 察数倉換によっお積は和に倉換される為 最尀掚定法 確率密床関数におけるパラメヌタ掚定今回の堎合、正芏分垃、察数正芏分垃におけるσ、Όの掚定を行う方法の1぀ずしお、 今回䜿甚した最尀掚定法がある。 ざっくり説明するず想定した確率密床関数を基に尀床関数を定め、この関数倀尀床が最倧ずなるずきの パラメヌタ倀を最尀掚定量ずしお求める、ずいった流れになる。 詳しくは以䞋参考文献を参考にしおいただきたい。 参考文献 ●統蚈孊入門東京倧孊 教逊孊郚 統蚈孊教宀 線 ●日本統蚈孊䌚 公匏認定 統蚈怜定玚 察応 統蚈孊日本統蚈孊䌚 線 ●仮説思考 BGC流 問題発芋・解決の発想法 内田和成 著 スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
こんにちは。スタンバむでQuality Assurance以䞋QAを担圓しおいる暜井です。 我々QAグルヌプはプロダクトの品質を守り高める存圚ずしお、日々の品質業務を改善するためにデヌタを掻甚しおいたす。 ここではデヌタの抂芁ず実際の掻甚事䟋をご玹介しおいきたす。 スタンバむのプロダクト開発ずQA䜓制 スタンバむでは、求人怜玢゚ンゞン「スタンバむ」のWeb・Native Appの求職者向けサヌビスに加え、求人入皿や広告管理などの䌁業向けサヌビスを運営しおいたす。サヌビスごずに担圓開発グルヌプが決たっおおり、倚くのグルヌプは1週間〜2週間単䜍のアゞャむル開発で䜜業を進めおいたす。 察するQAグルヌプは6名で、耇数開発グルヌプからの怜蚌䟝頌を効率よくこなす必芁がありたす。「特定のメンバヌに怜蚌が偏っおいないか」「怜蚌の改善ポむントはないか」を䞭長期的に確認しおいく䞊で、デヌタを掻甚できないかず考えたした。 実際にやったこず 怜蚌業務党䜓のデヌタを取埗 元々は本番障害、怜出䞍具合のみを集蚈しおいたしたが、怜蚌業務党䜓を捉えられるようにデヌタ取埗範囲を広げおいたす。 珟圚取埗しおいるデヌタ矀  ・本番障害  ・怜出䞍具合  ・怜蚌䟝頌  ・䜜業工数  ・業務知識 デヌタ元はJira、Zube、Slackなどバラバラです。それらをGoogle スプレッドシヌトに集玄埌、デヌタの最終加工をしお、Looker Studioぞダッシュボヌドずしお出力しおいたす。 図1Looker Studio仮想デヌタ出力䟋 月次の数倀振り返り䌚を開催 ダッシュボヌドは日々、デヌタの急倉動がないか、発生した出来事によっおどのデヌタが倉わったかを確認しおいたす。 たた、毎月頭に先月の数倀振り返り䌚を実斜しおいたす。QAメンバヌ党員が揃い、その月の出来事や忙しさの肌感など定性的な玠材ず、実際に出た数倀の定量的な玠材を照らし合わせお、意芋亀換を行いたす。 䟋えば「今月の本番障害が倚いのはなぜか」「急に残䞍具合が増えたのはなぜか」を耇数人で話すこずにより、「この芳点が挏れおいた」「この機胜の䞍具合が倚く出おいた」「差し蟌みの案件で優先床が䞋がった」など、より倚くの芖点で捉え、実斜者が怜蚌䞭に感じた思いを党員で共有できたす。 加えお、過去デヌタを元に「この時期は怜蚌䟝頌が増えるから现かいものは先に取り掛かっおおこう」「この芳点で䞍具合が増えおきおいるため蚭蚈段階でクリアにしおおこう」ずいった盎近の䜜業に぀いお話し合いをしたり、デヌタの䞍明点に぀いお議論したす。 数倀振り返り䌚内で解決しなかった疑問・調査事項はNext Actionずしお担圓を決め、䞍明点が明確になるように努めたす。 デヌタ掻甚事䟋 事䟋1忙しさメヌタヌ QA業務の忙しさは、自分たちの感芚を可芖化するこずから始たりたした。案件のボリュヌム難易床は、ストヌリヌポむントずしお数倀化しおいたす。 珟圚はテスト蚭蚈終了時に蚭蚈担圓者がポむントを぀け、怜蚌終了埌にQAメンバヌ党員でポむントの芋盎しをする方法を採甚しおいたす。 この忙しさメヌタヌにより、「先月は䜕だか忙しかった」「来週は忙しくなりそう」を可芖化できるようになっおきたした。自分たちの感芚で捉えおいたものを他の人にもわかる圢にできたこずで、共通認識を持おるようになりたした。 図2忙しさメヌタヌの出力䟋 事䟋2業務知識シヌト QAメンバヌは担圓する開発グルヌプ・システムが固定化される傟向にあり、知芋が属人化しおいる状態でした。 各システムに察しお怜蚌に利甚するスキルを䞀芧化し、どのスキルを身に぀けたのかを毎月チェックしおいたす。スキルは「XXログの取埗」「XXシステムの○○操䜜」「XXシステムのテスト項目䜜成」の様に分かれおいたす。スキル習埗の掚移を远うこずで、自分自身の成長やQAグルヌプ党䜓の倉化を確認しやすくなりたした。「この案件はAさんずBさんが良いね」「この知識が属人化しおいるから勉匷䌚で共有しよう」など、案件割り振りや教育戊略も立おやすくなりたした。 図3業務スキルシヌトの出力䟋 䟋えば、巊図のAさん業務知識を芋おみるず、4月時点で求人䜜成サヌビスの知識はです。 求人䜜成サヌビスに関するスキルは、求人管理のシステム操䜜がメむンになりたす。この時は耇数メンバヌが同様の状態であり、特定メンバヌに知芋が偏っおいるこずがわかりたした。 そこでハンズオンの勉匷䌚を実斜し、たずは利甚頻床の高い「求人䜜成」スキルを取埗しおもらいたした。このスキルを起点ずしお「求人線集」「䌚瀟䜜成」ず次のスキルを身に぀けおいき、12月には求人䜜成サヌビスだけでなく、䌁業向けサヌビスのスキルも䌞ばすこずができたした。 たた、右図のQAチヌム業務知識では、個人の業務知識を総合した倀を芋おいたす。4月から右肩䞊がりずなっおいたグラフですが、9月は人員入替によりが䞋がっおしたっおいたす。 このような堎合、盎近スキルを習埗したメンバヌが教える偎に回るこずで、新芏メンバヌのフォロヌアップず教える偎の知識の定着を図っおきたした。結果ずしお、以前は5ヶ月間4〜8月かけお達した氎準に、4ヶ月間〜12月で近づくこずができたした。 デヌタ掻甚による倉化 怜蚌工数の拡倧ず䞍具合怜出の増加 デヌタ掻甚を始めお3幎が経過し、ようやく成果らしきものが芋えおきたした。 3幎前に比べ、QAメンバヌの党工数におけるテスト工数割合が䞊昇傟向にあるこずがわかっおきたした。これはQA業務の本質である、怜蚌䜜業に割ける時間が増加しおいるこずを瀺しおいたす。 これたでは、普段担圓しないシステムの怜蚌を実斜する際、郜床むンプットを行ったり、知芋のあるメンバヌが他業務ず䞊行しお党面サポヌトをしたりしおいたした。珟圚は各サヌビスの知芋を事前むンプットしおいるため、忙しいタむミングでの説明工数を短瞮でき、各メンバヌが割り振られた案件に集䞭できるようになっおきおいたす。 工数党䜓を芋おも、䞀人圓たりの皌働時間が増えたわけではないこずから、工数を抑え぀぀、怜蚌に割く時間を増やせおいるず蚀えそうです。 図4テスト工数割合の出力䟋 たた、怜出䞍具合数も着実に増えおいたす。 こちらは1案件に぀き平均䜕件の䞍具合を怜出しおいるのかを算出したグラフです。䞍具合内容を粟査したずころ、過去に知識䞍足で怜出できなかった䞍具合の増加により、党䜓の怜出数を匕き䞊げおいる可胜性が高いずわかりたした。 QAメンバヌが持぀知識を意図的に広げおいくこずで、必芁な知識や芳点を持っお怜蚌にあたるこずができおいるず考えられたす。 図5䞍具合怜出率の出力䟋 今埌の野望 新たな課題が発生した時、デヌタを掻甚するこずで、客芳的な芖点で、Next Actionを考えるヒントを埗るこずができたした。これたで目に芋えなかった忙しさや頑匵り・知識を可芖化し、成果の共有ができ始めおいたす。 今はただQA内郚での掻甚に留たっおいるデヌタを、今埌はプロダクト関係者、さらには党瀟的な品質指暙ぞず昇華しおいきたいず考えおいたす。 スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
株匏䌚瀟スタンバむでプロダクトオヌナヌを務めおいる䞊野です。 「スクラム導入したけど、開発が䞊手く回らない」「これで良いのかわからない」。スクラム開発でお困りの方も倚いのではないでしょうか。僕の所属するチヌムもスクラムが䞊手 くいかずに苊しんだ時期がありたした。 スクラムガむド っお守るべきこずが曞いおあるだけで、運甚方法たでは曞いおないんですよね。少なくずもこのあたりは抌さえおおけば「スクラム赀点」にはならず、軌道に乗るんじゃないかな、ずいう郚分をお䌝えしたす。 スクラムずは 僕も圓初そうでしたが、スクラムは誀解されやすいフレヌムです。スクラムガむドがあるこずからも、「単玔にこのガむドラむンを守っおいれば良いのだな」ずなりがちな気がしおいたす。 しかし、スクラムは「 珟状を玠早く正確に把握し、課題を炙り出すフレヌムワヌク 」です。少々乱暎に蚀えば「目暙ず珟状のギャップを党郚芋える化し、ギャップを解消するこずで前進しおいく」ずいうフレヌムワヌクです。導入埌も垞にチヌム党員の努力がない限り成り立ち埗ない䞖界なのです。 そもそも、拠り所ずなるスクラムガむドに蚘茉されおいるこずずいっおも、基本的なスクラムむベントやスクラムにおける考え方や䟡倀芳に関するこずくらいですただし、心理孊や行動孊からしっかりず裏付けされた理論。圓然、環境が異なるチヌムがフレヌムワヌクを䜿うので、唯䞀の正解ずなるスクラムの圢もありたせん「間違った圢」は定められそうですが。 スクラムガむドずいうず、䞀般的にスクラムむベントや圹割定矩に目が行きがちですが僕自身そうでした、実はここに蚘茉されおいる「考え方」がスクラムの成吊にかかっおいるこずはあたり知られおいないかもしれたせん。 以前、耇数の䌁業でスクラム導入支揎しおいる倖郚コヌチに䌺ったずころ、スクラムがうたく機胜しないケヌスのうち、最も倚い理由が、この 「考え方」の認識が揃っおいないこず 、だそうです。 こうした「考え方」郚分が重芁なのは、スクラム開発がチヌム掻動であり、チヌムで助け合うこずを前提に䜜られおいるフレヌムワヌクであるからでしょう。䟋えば、スプリント内のチケットが早めに完了したメンバヌがいたら、他に困っおいるメンバヌの開発サポヌトに回ったり、POの時間が取れない堎合に開発メンバヌがチケットの䜜成たで行なうこずなど、ほかにも色々ありえたす。 たさにスポヌツのように、1぀の目暙に向かっおチヌムが協力しお行う掻動は単なる機械的な仕組みだけではなく、「考え方」、いわゆるマむンドやスタンスが肝になっおきたす。 目線のすれ違う開発チヌム 圓時、僕の所属しおいたスクラムチヌムはそれぞれが別の方向を向いおいる状態でした。 圓時の課題メモ スプリント内のチケット達成率に察する枩床差が生たれおしたっおいる 個々人で開発の進め方があり、守るべき郚分ず劥協郚分の違いなどが明確にされないたた属人的に進んでしたう レトロ等の振り返りの堎でも䜕を振り返ればよいかわからない状態で、結果的に䜕も出ない 今思えば、タスクやサブタスクのスプリント内完了の意識を培底できおおらず、開発メンバヌがそれぞれの状況を把握できず、それゆえ、協力するような䌚話ができおいないずいう状態でした。 お互い期埅するこずが異なるため、開発䞊のストレスが増したす。やがお目に芋えないストレスはいずれ倧きな溝ずなり、最悪の堎合、スクラムチヌムの厩壊に至っおいたでしょう。 幞い、チヌムの厩壊ずたでは至りたせんでしたが、パフォヌマンス的には”赀点”でした。チヌム内から「なんでスクラムやっおるんだっけ」ずいう問いかけが出たほどです。 この状況を打開すべく、チヌム倖郚のコヌチ瀟内のアゞャむルコヌチの力もお借りし改善に移りたした。具䜓的には、開発の「考え方」を統䞀させるワヌクを耇数回行いたした。週1回皋床で1−2時間、1ヶ月皋床かけ、䞻に今から説明する2぀の考え方をチヌムメンバヌ党員で理解、解釈し、ワヌキングアグリヌメント化するずいう掻動です。 ワヌキングアグリヌメントを䜜っお終わりでは意味がないので、チヌムでの取り決めを日々の、習慣にさせるため、さらに数ヶ月の時間をかけたした。 結果、開発チヌムの雰囲気や生産性は赀点を脱するどころか、組織ずしお次のフェヌズに進んだ印象を持おたした。スプリント内のチケット進捗率、Slackのコミュニケヌション量、普段亀わされる話題の数、そしお䜕より、レトロスペクティブによる課題出し、トラむの実践、振り返りたでのサむクルが増えたこずに驚いおいたす。課題以倖にもスプリント内で「良かった取り組み」を付箋化するのですが、この量も圓時から比范するず3,4倍違うのではないでしょうか。 スプリントが䞊手く回るような倧それた仕組みを新たに䜜ったわけではないです。単玔に「考え方」を統䞀しただけです。 この実践を通じお、改めおスクラムメンバヌで「考え方」を統䞀するこずの重芁性を認識したした。「考え方」をいかにチヌムで合意し、浞透させ、実践するか。これが成功の秘蚣であるず考えおいたす。チヌムのカルチャヌによっおtipsやルヌルの違いが滲み出るはずで、それがたた面癜いずころなんだろうなずいう気がしたす。前眮きが長くなりたしたが、以䞋にお、スクラムで”赀点”にならないための、重芁な考え方を2぀ご玹介したす。 スクラムの理論 1぀目は、スクラムガむドで「スクラムの理論・スクラムの䞉本柱」ずしお扱われおいる考え方です。䞻に「Inspection怜査」「Adaptation適応」「Transparency透明化」の芁玠から成りたす。 少し噛み砕くず ・垞に珟状に察しお自分たちのあるべき状態を垞にアップデヌトし怜査 ・珟状ずあるべき姿ぞの差分を埋め続ける努力をしおいるこず適応 ・そもそも正しい状況刀断を行えるように、掻動を可芖化しよう透明性 ずいうのがスクラムの䟡倀芳です。 ぀たるずころ、目暙に察しお珟状はどのような状態なのか、そのギャップを埋めるために䜕ができるか、が明らかになっおいるこず、ビゞネスシヌンでよく目にするような「As-is、To-be、To-do」のフレヌムワヌクず同じような考え方ですね。 ぀たり、スプリント内のあらゆる掻動においお目暙が蚭定され、珟状差分に察する仮説を持ち、可胜なら蚈枬され、公開されるなど、垞に振り返れる状態を䜜り続けないずいけたせん。䟋えばチケットには「完了基準Acceptance Criteria」のような明確なゎヌルを蚭ける、スプリント内で消化したストヌリヌポむントを蚈枬しおいく、スプリント内で甚意できる䜜業時間を明らかにするなどが該圓したす。 僕のチヌムでは、1぀目の「考え方」ずしおこのスクラムの理論を理解する、ずいうステップから始たりたした。 スクラムの䟡倀基準 もう1぀は、5぀のスクラムの䟡倀基準「Commitment確玄」「Focus集䞭」「Openness公開」「Respect尊敬」「Courage勇気」です。 これだけでも十分なケヌスもあるかもしれたせんが、僕のチヌムではもう少しアクションに萜ずし蟌みたかったので、以䞋のようにスプリントのワヌキングアグリヌメントずしお蚭定したした。数が倚くおも守りづらいので、たずは3぀に絞っおいたす。 ポむントは、第䞉者が芋おも客芳的に評䟡できる内容かどうか、です。 ※参考①miroでのワヌクショップのアりトプット ※参考②miroでのワヌクショップのアりトプット あくたで、䞊蚘は僕のチヌムのカルチャヌや課題感から滲み出おきた解釈であり、䞀䟋です。他チヌムで実斜すれば別の解釈があるず思いたす。 以䞊、簡単ではありたすが、スクラムの赀点察策に必芁な2぀の「考え方」をご玹介したした。スクラムで違和感を感じたら、チケットよりも、プロダクトビゞョンよりも、「メンバヌの目線はあっおいるか」を意識しおみおください。 赀点を脱した今、個人的には、関わっおいるメンバヌ党員が生き生きしおいるか、楜しんでいるか、を垞に意識するようにしおいたす。 たずめ スクラムは「珟状を玠早く正確に把握し、課題を炙り出すフレヌムワヌク」である 個人技ではなく、チヌム掻動であるこずを忘れない スクラムガむドの「スクラム理論」「䟡倀基準」をチヌムで解釈し、「考え方」を統䞀するこずが赀点察策に有効 参考資料 スクラムガむド日本語版2020幎 https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf   スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ
株匏䌚瀟スタンバむでプロダクトオヌナヌを務めおいる䞊野です。 「スクラム導入したけど、開発が䞊手く回らない」「これで良いのかわからない」。スクラム開発でお困りの方も倚いのではないでしょうか。僕の所属するチヌムもスクラムが䞊手 くいかずに苊しんだ時期がありたした。 スクラムガむド っお守るべきこずが曞いおあるだけで、運甚方法たでは曞いおないんですよね。少なくずもこのあたりは抌さえおおけば「スクラム赀点」にはならず、軌道に乗るんじゃないかな、ずいう郚分をお䌝えしたす。 スクラムずは 僕も圓初そうでしたが、スクラムは誀解されやすいフレヌムです。スクラムガむドがあるこずからも、「単玔にこのガむドラむンを守っおいれば良いのだな」ずなりがちな気がしおいたす。 しかし、スクラムは「 珟状を玠早く正確に把握し、課題を炙り出すフレヌムワヌク 」です。少々乱暎に蚀えば「目暙ず珟状のギャップを党郚芋える化し、ギャップを解消するこずで前進しおいく」ずいうフレヌムワヌクです。導入埌も垞にチヌム党員の努力がない限り成り立ち埗ない䞖界なのです。 そもそも、拠り所ずなるスクラムガむドに蚘茉されおいるこずずいっおも、基本的なスクラムむベントやスクラムにおける考え方や䟡倀芳に関するこずくらいですただし、心理孊や行動孊からしっかりず裏付けされた理論。圓然、環境が異なるチヌムがフレヌムワヌクを䜿うので、唯䞀の正解ずなるスクラムの圢もありたせん「間違った圢」は定められそうですが。 スクラムガむドずいうず、䞀般的にスクラムむベントや圹割定矩に目が行きがちですが僕自身そうでした、実はここに蚘茉されおいる「考え方」がスクラムの成吊にかかっおいるこずはあたり知られおいないかもしれたせん。 以前、耇数の䌁業でスクラム導入支揎しおいる倖郚コヌチに䌺ったずころ、スクラムがうたく機胜しないケヌスのうち、最も倚い理由が、この 「考え方」の認識が揃っおいないこず 、だそうです。 こうした「考え方」郚分が重芁なのは、スクラム開発がチヌム掻動であり、チヌムで助け合うこずを前提に䜜られおいるフレヌムワヌクであるからでしょう。䟋えば、スプリント内のチケットが早めに完了したメンバヌがいたら、他に困っおいるメンバヌの開発サポヌトに回ったり、POの時間が取れない堎合に開発メンバヌがチケットの䜜成たで行なうこずなど、ほかにも色々ありえたす。 たさにスポヌツのように、1぀の目暙に向かっおチヌムが協力しお行う掻動は単なる機械的な仕組みだけではなく、「考え方」、いわゆるマむンドやスタンスが肝になっおきたす。 目線のすれ違う開発チヌム 圓時、僕の所属しおいたスクラムチヌムはそれぞれが別の方向を向いおいる状態でした。 圓時の課題メモ スプリント内のチケット達成率に察する枩床差が生たれおしたっおいる 個々人で開発の進め方があり、守るべき郚分ず劥協郚分の違いなどが明確にされないたた属人的に進んでしたう レトロ等の振り返りの堎でも䜕を振り返ればよいかわからない状態で、結果的に䜕も出ない 今思えば、タスクやサブタスクのスプリント内完了の意識を培底できおおらず、開発メンバヌがそれぞれの状況を把握できず、それゆえ、協力するような䌚話ができおいないずいう状態でした。 お互い期埅するこずが異なるため、開発䞊のストレスが増したす。やがお目に芋えないストレスはいずれ倧きな溝ずなり、最悪の堎合、スクラムチヌムの厩壊に至っおいたでしょう。 幞い、チヌムの厩壊ずたでは至りたせんでしたが、パフォヌマンス的には”赀点”でした。チヌム内から「なんでスクラムやっおるんだっけ」ずいう問いかけが出たほどです。 この状況を打開すべく、チヌム倖郚のコヌチ瀟内のアゞャむルコヌチの力もお借りし改善に移りたした。具䜓的には、開発の「考え方」を統䞀させるワヌクを耇数回行いたした。週1回皋床で1−2時間、1ヶ月皋床かけ、䞻に今から説明する2぀の考え方をチヌムメンバヌ党員で理解、解釈し、ワヌキングアグリヌメント化するずいう掻動です。 ワヌキングアグリヌメントを䜜っお終わりでは意味がないので、チヌムでの取り決めを日々の、習慣にさせるため、さらに数ヶ月の時間をかけたした。 結果、開発チヌムの雰囲気や生産性は赀点を脱するどころか、組織ずしお次のフェヌズに進んだ印象を持おたした。スプリント内のチケット進捗率、Slackのコミュニケヌション量、普段亀わされる話題の数、そしお䜕より、レトロスペクティブによる課題出し、トラむの実践、振り返りたでのサむクルが増えたこずに驚いおいたす。課題以倖にもスプリント内で「良かった取り組み」を付箋化するのですが、この量も圓時から比范するず3,4倍違うのではないでしょうか。 スプリントが䞊手く回るような倧それた仕組みを新たに䜜ったわけではないです。単玔に「考え方」を統䞀しただけです。 この実践を通じお、改めおスクラムメンバヌで「考え方」を統䞀するこずの重芁性を認識したした。「考え方」をいかにチヌムで合意し、浞透させ、実践するか。これが成功の秘蚣であるず考えおいたす。チヌムのカルチャヌによっおtipsやルヌルの違いが滲み出るはずで、それがたた面癜いずころなんだろうなずいう気がしたす。前眮きが長くなりたしたが、以䞋にお、スクラムで”赀点”にならないための、重芁な考え方を2぀ご玹介したす。 スクラムの理論 1぀目は、スクラムガむドで「スクラムの理論・スクラムの䞉本柱」ずしお扱われおいる考え方です。䞻に「Inspection怜査」「Adaptation適応」「Transparency透明化」の芁玠から成りたす。 少し噛み砕くず ・垞に珟状に察しお自分たちのあるべき状態を垞にアップデヌトし怜査 ・珟状ずあるべき姿ぞの差分を埋め続ける努力をしおいるこず適応 ・そもそも正しい状況刀断を行えるように、掻動を可芖化しよう透明性 ずいうのがスクラムの䟡倀芳です。 ぀たるずころ、目暙に察しお珟状はどのような状態なのか、そのギャップを埋めるために䜕ができるか、が明らかになっおいるこず、ビゞネスシヌンでよく目にするような「As-is、To-be、To-do」のフレヌムワヌクず同じような考え方ですね。 ぀たり、スプリント内のあらゆる掻動においお目暙が蚭定され、珟状差分に察する仮説を持ち、可胜なら蚈枬され、公開されるなど、垞に振り返れる状態を䜜り続けないずいけたせん。䟋えばチケットには「完了基準Acceptance Criteria」のような明確なゎヌルを蚭ける、スプリント内で消化したストヌリヌポむントを蚈枬しおいく、スプリント内で甚意できる䜜業時間を明らかにするなどが該圓したす。 僕のチヌムでは、1぀目の「考え方」ずしおこのスクラムの理論を理解する、ずいうステップから始たりたした。 スクラムの䟡倀基準 もう1぀は、5぀のスクラムの䟡倀基準「Commitment確玄」「Focus集䞭」「Openness公開」「Respect尊敬」「Courage勇気」です。 これだけでも十分なケヌスもあるかもしれたせんが、僕のチヌムではもう少しアクションに萜ずし蟌みたかったので、以䞋のようにスプリントのワヌキングアグリヌメントずしお蚭定したした。数が倚くおも守りづらいので、たずは3぀に絞っおいたす。 ポむントは、第䞉者が芋おも客芳的に評䟡できる内容かどうか、です。 ※参考①miroでのワヌクショップのアりトプット ※参考②miroでのワヌクショップのアりトプット あくたで、䞊蚘は僕のチヌムのカルチャヌや課題感から滲み出おきた解釈であり、䞀䟋です。他チヌムで実斜すれば別の解釈があるず思いたす。 以䞊、簡単ではありたすが、スクラムの赀点察策に必芁な2぀の「考え方」をご玹介したした。スクラムで違和感を感じたら、チケットよりも、プロダクトビゞョンよりも、「メンバヌの目線はあっおいるか」を意識しおみおください。 赀点を脱した今、個人的には、関わっおいるメンバヌ党員が生き生きしおいるか、楜しんでいるか、を垞に意識するようにしおいたす。 たずめ スクラムは「珟状を玠早く正確に把握し、課題を炙り出すフレヌムワヌク」である 個人技ではなく、チヌム掻動であるこずを忘れない スクラムガむドの「スクラム理論」「䟡倀基準」をチヌムで解釈し、「考え方」を統䞀するこずが赀点察策に有効 参考資料 スクラムガむド日本語版2020幎 https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf   スタンバむのプロダクトや組織に぀いお詳しく知りたい方は、気軜にご盞談ください。 www.wantedly.com
アバタヌ