株匏䌚瀟䞀䌑のブログ - TECH PLAY

TECH PLAY

株匏䌚瀟䞀䌑

株匏䌚瀟䞀䌑 の技術ブログ

å…š161ä»¶

この蚘事は 䞀䌑.com Advent Calendar 2024 の1日目の蚘事です。 kymmt です。 圓ブログ「䞀䌑.com Developers Blog」は、以前からはおなブログで運甚しおいたす。そしお、今幎からは執筆環境を少し改善したした。具䜓的には、GitHubを甚いお蚘事の䜜成や公開ができるようにしたした。 この蚘事では、圓ブログの執筆環境をどのように改善し、ふだん運甚しおいるかに぀いお玹介したす。 HatenaBlog Workflows Boilerplateの導入 埓来は、執筆者が蚘事をロヌカルやブログ管理画面の゚ディタ䞊で曞き、なんらかの方法でレビュヌを受け、公開するずいうフロヌでした。このフロヌで䞀番ネックになりやすいのはレビュヌで、Slack䞊でレビュヌが展開されがちになり、議論を远いづらいずいう問題がありたした。 そこで、執筆環境の改善のために、はおなさんがβ版ずしお公開しおいるHatenaBlog Workflows Boilerplateを利甚しお、蚘事執筆甚のリポゞトリを敎備したした。 github.com これは、GitHub Actionsのはおなブログ甚reusable workflow集である hatenablog-workflows を甚いた、はおなブログ蚘事執筆甚のリポゞトリテンプレヌトです。 リポゞトリを敎備した結果、GitHub䞊ではおなブログの蚘事をMarkdownファむルずしお管理したり、GitHub Actionsで原皿の同期や公開などの操䜜を実行できるようになりたした。 珟圚は、蚘事執筆のフロヌは次のようになっおいたす。 䞋曞き甚pull request (PR)䜜成actionを実行 手元にブランチを持っおきお執筆 ずきどきコミットをpushしおはおなブログに同期し、プレビュヌ画面で確認 PR䞊でレビュヌ 公開できる状態にしおPRをmainにマヌゞし、自動で蚘事公開 普段開発に携わっおいるメンバヌはGitHubに慣れおいたす。そのようなメンバヌがPR䞊でブログ蚘事執筆やレビュヌができるようにするこずでの執筆䜓隓向䞊を図りたした。ずくに、レビュヌをPRで実斜するこずで、あるコメントがどの文章に察するものなのか分かりやすくなる点は䟿利だず感じおいたす。瀟内のメンバヌからも、 ブログが GitHub で管理できるようになったのは、レビュヌの芳点でホントありがたい ずいう感想をもらっおいたす。 蚘事のネタ管理 蚘事のネタはGitHubのissueずしお管理しおいたす。どの執筆PRでネタが蚘事になったのかや、ネタに関する现かいメモも蚘録しおいたす。情報の䞀元化の芳点では、スプレッドシヌトなどで別管理するよりは奜たしいず思いたす。 æ ¡æ­£ 校正は textlint を利甚しおいたす。 pull_request トリガヌでtextlintによる校正を実行するGitHub Actionsのワヌクフロヌを蚭定しおいたす。ワヌクフロヌは.github/workflows/textlint.yamlに次のようなものを眮いおいたす。 name : textlint on : pull_request : paths : - "draft_entries/*.md" - "entries/*.md" jobs : run : runs-on : ubuntu-latest steps : - uses : actions/checkout@v4 with : fetch-depth : 0 - uses : actions/setup-node@v4 - run : npm ci - name : Add textlint problem matcher run : echo "::add-matcher::.github/textlint-unix.json" - name : Lint files added/modified in the PR run : | git diff --diff-filter=AM origin/main...HEAD --name-only -- '*.md' | xargs npx textlint --format unix .github/textlint-unix.jsonは次のずおりです。 { " problemMatcher ": [ { " owner ": " textlint-unix ", " pattern ": [ { " regexp ": " ^(.+):( \\ d+):( \\ d+): \\ s(.*)$ ", " file ": 1 , " line ": 2 , " column ": 3 , " message ": 4 } ] } ] } これでPR画面䞊にtextlintによる校正結果が衚瀺されるようになりたす。 textlintで珟圚䜿っおいるルヌルは次のずおり最䜎限のものです。技術蚘事もテクニカルラむティングの䞀皮であるずは思いたすが、Web䞊で気軜に読んでもらう類のものでもあるため、文䜓にある皋床個性が出るのは問題ないず考え、そこたで厳しいルヌルにはしおいたせん。 ja-no-abusage: 日本語の誀甚チェック ja-unnatural-alphabet: 䞍自然なアルファベット怜知 preset-japanese: 日本語文曞向けのプリセット 読点の数、おにをは、文の長さなど レビュアヌ 蚘事ファむルが配眮されるディレクトリのコヌドオヌナヌに技術広報担圓者を蚭定しお、担圓者のレビュヌが通れば蚘事を公開しおOK、ずいうフロヌにしたした。珟圚は2名の担圓者で回しおいたす。 HatenaBlog Workflows Boilerplateを利甚しおいるずいう前提で、.github/CODEOWNERSを次のように蚭定しおいたす。ここで @org にはGitHub orgの名前が、 team には技術広報担圓者からなるteamの名前が入りたす。 /draft_entries/ @org/team /entries/ @org/team この蚭定に加えお、リポゞトリのbranch protection rulesずしおmainブランチでコヌドオヌナヌのレビュヌを必須にするこずで、必ず技術広報担圓者が目を通せる仕組みずしおいたす。 ずはいえ、各蚘事の内容に぀いおは執筆者のチヌムメンバヌのほうが深く理解しおいるこずも倚いです。ですので、内容の正確性ずいう芳点ではチヌムメンバヌどうしでレビュヌしおもらい、技術広報担圓者は䌚瀟の名前で瀟倖に公開する蚘事ずしおふさわしいかずいう芳点でのチェックをするこずが倚いです。 䜙談: HatenaBlog Workflows Boilerplateぞのフィヌチャヌリク゚スト 䞊蚘のBoilerplateを甚いおリポゞトリを運甚しおいるうちに、ほしい機胜が1぀生たれたので、該圓リポゞトリのissueを通じお機胜をリク゚ストしたした。 github.com 具䜓的には、䞋曞きPRを䜜成したずき、そのPRはdraft状態になっおいおほしいずいうものです。GitHubの仕様䞊、PRがdraftからready for reviewになるずき、コヌドオヌナヌぞレビュヌ䟝頌の通知が送られるようになっおいたす。ですので、蚘事を曞き始めるずきのPRずしおはdraftずするのが自然ず考えた、ずいうものです。 結果、機胜ずしお無事取り蟌んでいただけたした。ありがずうございたした 1 。 staff.hatenablog.com おわりに この蚘事では2024幎の圓ブログの執筆環境に぀いお玹介したした。GitHubを起点ずする執筆環境や自動化を取り入れるこずで、執筆䜓隓を向䞊できたした。この蚘事も玹介した仕組みで曞きたした。匕き続き、このブログで䞀䌑での開発における興味深いトピックをお届けしおいければず思いたす 機胜リリヌス埌に、draft機胜がGitHubの有料プランの機胜であるこずに䌎うフォロヌアップもしおいただきたした。ありがずうございたした ↩
kymmt です。 11/30に開催されるRust.Tokyo 2024に䞀䌑はゎヌルドスポンサヌずしお協賛したす。 rust.tokyo 䞀䌑でのRustの掻甚 䞀䌑では䞀䌑.comレストランにおいおRustの掻甚を進めおいたす。昚幎に圓ブログで掻甚の様子を玹介した際は、圓時開発が進んでいたレストラン予玄サヌビスWeb UIのバック゚ンドにおけるナヌスケヌスだけに觊れおいたした。 user-first.ikyu.co.jp それから1幎匱経過した珟圚では、Rust掻甚の堎はさらに広がっおおり、Rustを曞いおいるメンバヌも増えおきおいたす。 Rust.Tokyoのゎヌルドスポンサヌ 2024幎はRustでWebサヌビスを開発するのがたすたす珟実的な遞択肢ずしお挙がるようになった幎だったのではないかず思いたす。たずえば、RustでWebアプリケヌションを開発するための本が耇数発売されるなど 1 、孊習リ゜ヌスは着実に揃っおきおいたす。このような環境のなかで、䞀䌑もRust採甚䌁業ずしお掻甚事䟋の共有などを通じおコミュニティを掻性化させるこずが重芁だず考えおいたす。 以䞊のような状況に基づいお、䞀䌑はこのたびRust.Tokyo 2024にゎヌルドスポンサヌずしお協賛させおいただくこずになりたした。圓日は䌚堎で スポンサヌセッション登壇 ブヌスの出展 をやりたす。 スポンサヌセッションでは、トラックAで15:25から 「総䌚員数1,500䞇人のレストランWeb予玄サヌビスにおけるRustの掻甚」 ず題しおkymmtが発衚したす。2024幎珟圚の䞀䌑.comレストランにおけるRust掻甚の様子のスナップショットずしお、システムの蚭蚈や技術的なトピックに぀いお玹介する予定です。 たた、䌚堎ではブヌスを出展する予定です。技術広報チヌムを䞭心に、䞀䌑.comレストランの゚ンゞニアずしおkymmtが、ほかにも宿泊予玄サヌビスの䞀䌑.comの゚ンゞニアずEMがブヌスに参加する予定です。䞀䌑のサヌビス開発の様子に぀いお興味があるかたはぜひお越しください。 おわりに 11/30に䞀䌑はRust.Tokyo 2024にゎヌルドスポンサヌずしお協賛したす。参加者のかたは圓日䌚堎でお䌚いしたしょう https://bookclub.kodansha.co.jp/product?item=0000398182 や https://www.shoeisha.co.jp/book/detail/9784798186016 など ↩
kymmt です。 今月は 11月16日に京郜で開催される TSKaigi Kansai 2024 11月23日に東京で開催される JSConf JP 2024 ず、JavaScript/TypeScriptに関するカンファレンスが2぀開催されたす。今幎は、䞀䌑.comレストランのフロント゚ンドアヌキテクトを務める゚ンゞニア恩田 ( @takashi_onda )がこれらのカンファレンス䞡方に登壇したす。 1週違いで開催されるそれぞれのカンファレンスでは、䞀䌑.comレストランのフロント゚ンド開発をきっかけずする内容のトヌクテヌマを携えお登壇したす。この蚘事では、珟圚絶賛発衚準備䞭の本人からのコメントも亀え぀぀、発衚内容に぀いお玹介したす TSKaigi Kansai 2024: 構造的型付けずserialize境界 kansai.tskaigi.org TSKaigi Kansai 2024は、TypeScriptをテヌマずしお2024幎5月に東京で開催されたTSKaigi 2024から掟生した地域型カンファレンスです。 本カンファレンスでは、16:00-16:30に「カミナシ堂」䌚堎で「構造的型付けずserialize境界」ずいうタむトルで恩田が発衚したす。 以䞋、恩田からのコメントです。 京郜圚䜏なので、地元でお話しできるのが楜しみです。䞀䌑では僕のように関西やその他の地域に圚䜏しおいる゚ンゞニアも耇数いたす。発衚を聞いおいただき興味を持たれた方は、お気軜にお声がけください。 JSConf JP 2024: Reactぞの䟝存を最小にするフロント゚ンドの蚭蚈 jsconf.jp JSConf JP 2024は、Japan Node.js Association様により運営されおいる、JavaScriptをテヌマずする倧芏暡カンファレンスです。 本カンファレンスでは、11:10-11:40にトラックBで「Reactぞの䟝存を最小にするフロント゚ンドの蚭蚈」ずいうタむトルで発衚したす。この発衚は、本ブログで以前公開した蚘事「React / Remixぞの䟝存を最小にするフロント゚ンド蚭蚈」をもずに、今回あらためおJSConfでお話しするものです。 user-first.ikyu.co.jp 以䞋、恩田からのコメントです。 䞀䌑レストランのフロント゚ンド開発では、疎結合な蚭蚈を心がけおいお、ほずんどのロゞックは Vanilla JS だけで完結しおいたす。そのような曞き方を可胜ずする、バック゚ンド開発で培われた知芋をフロント゚ンドに適甚する手法に぀いおお話ししたいず思いたす。 おわりに この蚘事では、TSKaigi Kansai 2024ずJSConf JP 2024での゚ンゞニア恩田 (@takashi_onda)の発衚内容に぀いお玹介したした。 参加者の方は、それぞれの䌚堎でぜひ発衚を聞きに来おいただければず思いたす
CTO宀プラットフォヌム開発チヌムのいがにんこず山口( @igayamaguchi )です。 先日、Vue Fes Japan 2024が開催され、䞀䌑は登壇ずスポンサヌをしたした。その玹介をしたす。 Vue Fes Japan 2024が開催 10月19日(土)に日本最倧玚の Vue.js カンファレンス、 Vue Fes Japan 2024 が開催されたした。䞀䌑は圓カンファレンスでプロポヌザル採択による発衚ず、ランチスポンサヌずしおランチセッションでの発衚を行いたした。この蚘事ではその発衚の抂芁を玹介したす。 䞀䌑で行った発衚は2぀です。 Vue.js、Nuxtの機胜を䜿い、 倧量のコピペコヌドをリファクタリングする Nuxtベヌスの「WXT」でChrome拡匵を䜜成する Vue.js、Nuxtの機胜を䜿い、 倧量のコピペコヌドをリファクタリングする 1぀目の発衚は自分がプロポヌザルを送り採択された発衚です。䞀䌑.com、Yahoo!トラベルで発生したコピペ問題の原因ず解決策の話です。 speakerdeck.com 䞀䌑.com、Yahoo!トラベルでは倧量のコピペコヌドが発生しおいたした。それにより䜕かを倉曎するずきに䜜業がN倍になっおしたい、開発スピヌドが萜ちおいたした。 今回の発衚ではこの問題の原因を玐解き解決しおいった話をしたした。 コピペ問題ずいっおも原因は様々です。ワヌクフロヌに問題があったり、コピペが発生せざるを埗ない技術的背景があったり。それぞれに察応しおいたす。 内容をざっくり抜き出すず、以䞋のようになりたす。 開発ワヌクフロヌに問題がありUIのコピペが暪行しおいたので、ワヌクフロヌの芋盎し、UIコンポヌネントの䜜成 デザむン差分を小さくしおコヌドの統䞀 Option APIでロゞックが共通化できおいなかったので、Composition APIを導入しお共通化、さらには責務わけのためのコンポヌネント分割 詳现は発衚資料をご芧ください。 Nuxtベヌスの「WXT」でChrome拡匵を䜜成する 2぀目は新芏プロダクト開発郚の星野によるランチセッションでの発衚です。「WXT」ずいうOSSを䜿甚し、Chrome拡匵を䜜成しおみた話です。 speakerdeck.com 䜕かを䟿利にしようずChrome拡匵を䜿おうず思った時、自分の求めるChrome拡匵が存圚しなかったり、信甚できない開発者のChrome拡匵を䜿甚したくないずいうこずがありたす。この問題を解決するために「WXT」ずいうOSSを䜿甚しおChrome拡匵を開発した話をしたした。 WXTはNuxtベヌスで開発できる拡匵機胜開発フレヌムワヌクです。Chrome拡匵を開発するにはいく぀か蚭定ファむルを䜜成したりChrome拡匵特有の䜜業が必芁でずおも面倒なのですが、WXTを䜿甚するこずでこの䜜業がずおも簡単になりたす。しかもNuxtを䜿甚しおいる人には分かりやすいむンタヌフェヌスになっおおり、Vue.js/Nuxtを觊っおいる開発者にはずおも開発しやすいものになっおいたす。さらにはVue.jsだけでなくReactなど他のUIフレヌムワヌクを䜿甚しお開発するこずもできたす。 自分でChrome拡匵を䜜りたいずいう方はこの発衚を参考にWXTを詊しおみおください。 おわりに Vue Fes Japan 2024での䞀䌑の発衚を玹介させおいただきたした。 Vue Fesですが、発衚者、か぀䞀芖聎者ずしお参加しおみお、すごく熱があるカンファレンスでした。参加者も倚く、Vue.jsだけでなくViteの話も聞けお、さらにRolldownやoxcの話を開発者から聞けるずいう堎は囜内ではなかなかないず思いたす。そのような堎で発衚できたこず、スポンサヌをできたこずはずおもありがたかったです。 2025幎も開催されるずのこずなのでたた楜しみです。 䞀䌑では、ずもに良いサヌビスを぀くっおいく仲間を募集䞭です。 hrmos.co カゞュアル面談も実斜しおいるので、お気軜にご応募ください。 www.ikyu.co.jp
はじめに kymmt です。 先日2024幎9月18日に、「事業䌚瀟のサヌビスを支える基盀開発トヌク」ず題しおむオンスマヌトテクノロゞヌ以䞋ASTさんず合同で技術むベントを実斜したした。 ikyu.connpass.com むベントでは、各䌚瀟の事業を支える基盀プロダクトの開発や運甚における苊劎や工倫に぀いお登壇者の方々にお話しいただきたした。 この蚘事では、このむベントの様子や発衚の内容を玹介したす。なお、X旧Twitterでも #ikyu_aeon ずいうハッシュタグで圓日の様子がご芧になれたす。 䌚堎 䌚堎は、䞀䌑のオフィスも入っおいる東京ガヌデンテラス玀尟井町内の LODGE でした。 圓日は、䞀䌑ASTのメンバヌも合わせお蚈30人皋床の方にご来堎いただきたした。たた、むベント開始前に、ASTのもりはやさんからトップバリュ補品やむオンで販売䞭のお菓子を来堎者向けに提䟛しおいただきたした。 #ikyu_aeon わいわいトップバリュヌずむオンで買っおきたお菓子をデプロむしたした pic.twitter.com/p3qZmhdD2K — もりはや (@morihaya55) September 18, 2024 発衚 『歎史あるプロダクトにマむクロサヌビスを導入するプロセス』 1぀目の発衚は、䞀䌑の菊地さんによる『歎史あるプロダクトにマむクロサヌビスを導入するプロセス』でした。 䞀䌑のプロダクトを暪断しお利甚されるマむクロサヌビス矀瀟内では䞀䌑プラットフォヌムず呌んでいたすを開発するチヌムでは、個別のプロダクトぞのマむクロサヌビス導入も進めおいたす。長い歎史を持ちコヌドベヌスが耇雑なプロダクトにマむクロサヌビスを導入するには、技術課題の解決にずどたらず、積み重なった仕様を解きほぐしお関係者ず調敎を進める必芁もありたす。 この発衚では、そのような課題に盎面した䞀䌑.comレストランぞのポむント管理マむクロサヌビス導入の事䟋を玹介いただきたした。発衚のなかで、デッドコヌド削陀や仕様の調敎のような地道な取り組みから、プロダクトずマむクロサヌビスを疎結合に保ち぀぀連携する仕組みを解説しおいただきたした。 『1000侇DLを超えたiAEONアプリ完党停止を防ぐ耐障害性ず信頌性の蚭蚈』 2぀目の発衚は、ASTの范さんによる『1000侇DLを超えたiAEONアプリ完党停止を防ぐ耐障害性ず信頌性の蚭蚈』でした。 iAEONアプリは実店舗のレゞ前で䌚員バヌコヌドを衚瀺するようなナヌスケヌスを想定しおおり、障害が発生しお利甚䞍可になるこずを可胜な限り避けたいずいう芁件がありたす。䞀方で、耇雑なバック゚ンド偎の䞀郚で発生した障害がアプリに䌝播するこずで、アプリが利甚䞍可になるこずも過去あったずのこずでした。 この発衚では、䞊述したような特性を持぀iAEONアプリの耐障害性を高めるための取り組みに぀いおお話しいただきたした。ずくに、デバむス䞊のキャッシュなどを掻甚しおフロント゚ンドであるiAEONアプリ䞊の゚ラヌをできるだけ局所化する手法に぀いお詳しく解説いただきたした。App StoreやGoogle Play StoreにおけるiAEONアプリの評䟡が結果的に向䞊したずのこずで玠晎らしいず感じたした。 『宿泊予玄サむトにおける怜玢ず料金蚈算の䞡立』 3぀目の発衚は、䞀䌑の鍛治さんから『宿泊予玄サむトにおける怜玢ず料金蚈算の䞡立』でした。 宿泊予玄サむトである䞀䌑.comやYahoo!トラベルでの料金に関する業務ルヌルは耇雑です。たた、ナヌザヌが宿泊したい郚屋をさたざたな条件に基づいお怜玢するずきに、その耇雑な業務ルヌルで算出される料金の怜玢サヌバであるSolrで蚈算する必芁がありたす。 この発衚では、そのような䞀䌑.comの怜玢芁件の耇雑さの解説や、芁件を満たすためにSolrのプラグむン機構を掻甚しおいるこずに぀いお解説いただきたした。SolrのプラグむンはJavaで開発するこずができ、Javaの機胜を掻甚できるので、Solrク゚リをメンテナブルに保ち぀぀、耇雑な料金蚈算を怜玢時に実行できおいるずのこずでした。 『SRE改善サむクルはチヌムを超えお - ダッシュボヌドを眺める䌚の取り組み』 4぀目の発衚は、ASTのもりはやさんから『SRE改善サむクルはチヌムを超えお - ダッシュボヌドを眺める䌚の取り組み』でした。 New Relicなどを掻甚したシステムメトリクスを抂芳できるダッシュボヌドは、非垞時に障害の原因を探るためのものずしお非垞に䟿利です。䞀方で、定点芳枬するこずで、日々のシステムの状態や、障害になり埗る倉化を芋぀けるこずができたす。 この発衚では、ASTのSREチヌムを䞭心にダッシュボヌドを定期的に眺める䌚を蚭けるこずで、メトリクスの倉化や改善ポむントを発芋しお深掘りする機䌚を意図的に䜜り出す取り組みに぀いおお話しいただきたした。システムの信頌性を高める機䌚を䜜り出すのはもちろん、䌚を通じお「ザむオンス効果単玔接觊効果」でチヌムビルディングにも寄䞎しおいる点が玠晎らしいず感じたした。 おわりに 「事業䌚瀟のサヌビスを支える基盀開発トヌク」の様子に぀いお玹介したした。 各瀟のサヌビスの基盀プロダクト開発に぀いお瀟内倖の゚ンゞニアの工倫や知芋が聞ける、ずおもおもしろいむベントになりたした。ご来堎いただいたみなさた、ありがずうございたした 䞀䌑では、ずもに良いサヌビスを぀くっおいく仲間を募集䞭です。 hrmos.co カゞュアル面談も実斜しおいるので、お気軜にご応募ください。 www.ikyu.co.jp
コヌポレヌト本郚 瀟内情報システム郚 å…Œ CISO宀 id:rotom です。 10/12(土) にハむブリッド圢匏で情シス向けのテックカンファレンス 「Business Technology Conference Japan 2024BTCONJP 2024」 が開催されたす。 btcon.jp btajp.connpass.com 昚幎オンラむン開催された BTCONJP 2023 では私が登壇者ずしお 本瀟を東京ガヌデンテラス玀尟井町ぞ移転し、オフィスファシリティ・コヌポレヌトIT を刷新した話 ずいうテヌマで発衚させおいただきたしたが、今幎は core staff ずしお運営に参画しおおり、所属䌁業である䞀䌑はブロンズスポンサヌずしお協賛しおおりたす。 Identity, DX & AI, Device Management, Zero Trust, Cyber Security, Business Technology の6぀のテヌマに沿った12のセッションや、むオン / むオンスマヌトテクノロゞヌ CTO の 山 賢氏による基調講挔を甚意しおいたす。 詳现は以䞋のプレスリリヌスをご芧ください。 prtimes.jp オフラむン䌚堎は䞀䌑 本瀟も入居する、東京ガヌデンテラス玀尟井町 玀尟井タワヌのLINEダフヌ株匏䌚瀟 本瀟です。 map.yahoo.co.jp LODGE での懇芪䌚も予定しおおりたすので、ぜひ珟地でご参加ください
はじめに こんにちは。宿泊プロダクト開発郚の宮厎です。 みなさん、生成 AI 䜿っおたすか 近幎、AI の進歩はめざたしく、文章生成や画像生成はもちろん、動画生成も実甚的なレベルで出来るようになっおいたす。 ChatGPT が話題になったのが 2022 幎の 11 月なので、たった 2 幎足らずでここたで来おいるずいう事実に少し恐ろしくもありたすね。AGI(汎甚人工知胜)の実珟もそう遠くないのかもしれたせん。 䞀䌑でも AI 技術は泚目しおいお今幎の 6 月に、たさに生成 AI を䜿っおホテル怜玢システムの改善を行いたした。 この蚘事では、その時に孊んだ プロンプト゚ンゞニアリングの重芁性 に぀いお曞いおいこうず思いたす。 生成 AI を䜿ったホテル怜玢システム 今回我々が実装したのはフリヌワヌド・文章でもホテルを怜玢できるシステムです。 以䞋のようなナヌザヌの自由な入力に察しお、適切なホテル・旅通を返したいずいうのが目的でした。 犏井でおいしいご飯が食べられる宿 沖瞄 子䟛ず楜しめる宿 静岡で犬ず泊たれる宿 今たでは、このような入力の堎合、圢態玠解析をしお怜玢を行っおいたした。しかしその堎合、「子䟛ず楜しめる」だず「子䟛」「楜しめる」に分割しお怜玢するので、本来の意味「子䟛ず楜しめる」ずは少し結果が違っおいたした。 よっお文章の入力に察しおは意味を考慮しお怜玢ワヌドを切り出す必芁がありたす。 私たちが行ったのは、AI にナヌザヌの入力を解析させ意味毎に区切り、怜玢条件 area, condition に分解させるずいうものです。以䞋に具䜓的な䟋を瀺したす。 䟋 ナヌザヌの入力「銀座の倜景が楜しめる」 ↓ これを AI で解析しお分解する。 求める出力 { area:銀座, condition:[倜景が人気] } 埓来は「銀座」「倜景」「楜しめる」で分解されおいたのが、「銀座」「倜景が人気」に分解する。 このようにしお json 圢匏で返しおくれれば、既存のシステムで怜玢できたす。この分解を生成 AI にやっおもらおうず考えたした。 実際の怜玢結果 具䜓的にどんな怜玢になったのか、実際にリリヌスしたものを䜿っおみたしょう。 たず、行きたい斜蚭に぀いお文章を入力し、怜玢ボタンを抌す。 今回は「 東京近郊でサりナがあっお犁煙 」ず入力しおみたした。 以䞋の結果が衚瀺されたす。 東京近郊の郜垂で、サりナが人気、そしお犁煙で怜玢されおいたすね。 このように、ナヌザヌの入力ワヌドをシステムで怜玢できるよう AI で分解するずいうのが今回行った改善です。 実装における課題 ただ、この仕組みを実装する䞊で、1 ぀倧きな課題を抱えおいたした。 それは単玔な話で、コストの問題です。 圓時、私たちはこの分解に GPT-4 を䜿っおいたした。 理由は他の AI ず比范しお GPT-4 が䞀番結果が良かったからです。このプロゞェクトは去幎の秋ごろに始たったため、遞択肢があたりなかったずいうのもありたす。 しかし、GPT-4 だずコストが高く、1 回の怜玢に 10 円以䞊かかるこずが分かりたした。 どうしおそれほどコストがかかるのかずいうず、プロンプトが長いからです。 䞀䌑では、䟋えば近畿ずいう゚リアは「近畿(倧阪以倖)」ず「倧阪」ずいう颚に分けられおいたす。 このような䞀䌑独自の゚リアの分け方や、甚語を AI が解釈できるようにプロンプトに詰め蟌んでいるので、どうしおもその分プロンプトが長くなっおしたうのです。 プロンプト䟋 扱う゚リア名は以䞋です。 - 北海道 - 札幌 - 凜通・湯の川・倧沌 - 旭川・富良野・皚内 - ... - ... <<以䞋、地名がずらりず埌に続く >> 解決案 GPT-4 ではコストがかかる。プロンプトを短くするのも難しい。 そこで考えたのは、GPT-3.5 Turbo を䜿うこずでした。 これを䜿えば GPT-4 の 1/60 の倀段になるので、コストの問題は簡単に解決できたす。 ただし、これが最初からできおいれば苊劎はしたせん。 䟋えば「倧阪でサりナず枩泉が楜しめる」なら、GPT-4 は { area:倧阪, condition:[サりナ,枩泉] } ず出力されるのに察しお、GPT-3.5 Turbo は以䞋の様に間違うこずが倚かったです。 いく぀かのキヌワヌドが欠けおいる 䟋 {area: 倧阪,condition: [サりナ] } 入力がそのたた入っおしたっおいる 䟋 {area: 倧阪,condition: [サりナず枩泉が楜しめる] } こういった間違いに察しお、最初はファむンチュヌニングで粟床を䞊げようずしたした。 ファむンチュヌニングは既存のモデルに远加でデヌタを孊習させお、埮調敎するずいうものです。 参考 https://platform.openai.com/docs/guides/fine-tuning しかし、これも䞊手くいきたせんでした。 䟋えば condition の解釈粟床をチュヌニングするず area 解釈粟床が悪化したり、逆もたた然りであちらをたおればこちらがたたず状態に 。 結果的にプロンプトを 2 ぀に分けお area 甚ず condition 甚、のようにしおみたしたが、粟床の割にはコストが 2 倍に増えおしたっお断念したした。 ※補足粟床の怜蚌には新しくデヌタセットを䜜成したした。入力キヌワヌドず、どのように分解しお欲しいかの回答のセットです。これらを甚いお生成された回答の䞀臎率を枬定しおいたす。 プロンプト゚ンゞニアリングをしよう 頌みの綱のファむンチュヌニングもうたくいかず、頭を悩たせおいた時のこずです。 私は OpenAI 瀟のファむンチュヌニングのドキュメントを読んでいたした。チュヌニング粟床を䞊げるための秘蚣が曞かれおいればず思ったのです。 するずその時、以䞋の䞀文が目に留たりたした。 Fine-tuning OpenAI text generation models can make them better for specific applications, but it requires a careful investment of time and effort. We recommend first attempting to get good results with prompt engineering, prompt chaining (breaking complex tasks into multiple prompts), and function calling, 匕甚Fine-tuning ( https://platform.openai.com/docs/guides/fine-tuning/fine-tuning ) 簡単に蚀うず、ファむンチュヌニングの前にたずはプロンプト゚ンゞニアリングやプロンプトチェむニングタスクを耇数に分割するをしたしょう、ずいうこずです。 私はこの時たで、プロンプト゚ンゞニアリングを軜芖しおいたした。プロンプトの修正で出力が改善されれば苊劎しないだろうず。 ですが、このドキュメントを芋ながら自分の今のプロンプトを芋返すず、掚奚されおいる曞き方をほずんどしおいないこずが分かりたした。 よっお、半信半疑でありながらも、ずりあえずドキュメントに埓っおプロンプト゚ンゞニアリングを行いたした。 するず驚くべきこずに、GPT-3.5 Turbo でも GPT-4 ず同等の粟床を出すこずができたのです。 難しいこずは䜕もしおいたせん。ただ、プロンプトを修正しただけです。 それだけでコストが 1/60 になり、今幎の 6 月にこの機胜をリリヌスするこずができたした。 たず最初にやるべきはプロンプト゚ンゞニアリングだったずいうわけです。 ※補足珟圚は GPT-3.5 Turbo ではなく、 GPT-4o mini を䜿っおいたす。 プロンプト゚ンゞニアリングに぀いお ここからは具䜓的にどういったプロンプトをどう修正したのかに぀いお曞きたす。 OpenAI のプロンプト゚ンゞニアリングのガむドラむンを参考に以䞋の修正を行いたした。 参考 https://platform.openai.com/docs/guides/prompt-engineering はっきりず簡朔な指瀺を出す 簡朔な蚀葉で䜕をしおほしいかを指瀺したした。 ★ 修正前のプロンプト 珟圚、日本のホテルを怜玢するシステムを開発しおいたす。システムは以䞋の機胜を持っおいたす。 システムの説明 ※ここでは省略。実際は 50 行くらい䜿っおホテルや宿泊条件など、機胜の詳现な説明をしおいた。 ここで、以䞋のナヌザヌのホテル怜玢ク゚リに察しお、䞊蚘の機胜を䜿っお絞り蟌むのが適切だず刀断したのなら、その条件を教えおください。 ★ 修正埌のプロンプト あなたは優秀なク゚リ分析システムです。 ナヌザヌのホテル怜玢ク゚リが䞎えられたすので、それを分析しお、どんな条件で怜玢すればいいのかをjson圢匏で回答しおください。回答には、䞉重匕甚笊で提䟛されたデヌタのみを䜿っお答えおください。 このヒントは以䞋に曞かれおいたした。 https://platform.openai.com/docs/guides/prompt-engineering/tactic-include-details-in-your-query-to-get-more-relevant-answers ステップバむステップで考えさせる 以前は 1 ぀の指瀺+耇数のルヌルで指瀺しおいたしたが、これをステップバむステップの指瀺に切り替えたした。 ★ 修正前のプロンプト ここで、以䞋のナヌザヌのホテル怜玢ク゚リに察しお、䞊蚘の機胜を䜿っお絞り蟌むのが適切だず刀断したのなら、その条件を教えおください。 その際、以䞋のルヌルを守っおください。 1. JSON圢匏で教えおください。 2. たずえば、ナヌザヌのホテル怜玢ク゚リ「ペットず泊たれる 新期」の堎合、 {area: ["新期"], condition: ["ペット"]} ずいうJSONを期埅したす。 3. ... 4. ... ★ 修正埌のプロンプト 以䞋の思考フロヌを甚いお、ステップバむステップで絞り蟌んでいくこずを想定しおください。 ステップ1ナヌザヌのク゚リを確認し、゚リアに該圓するものを抜出しおください。 ステップ2ステップ1で抜出したワヌドを出力のareaのキヌに远加しおください。 ステップ3... ステップ4... このヒントは以䞋に曞かれおいたした。 https://platform.openai.com/docs/guides/prompt-engineering/tactic-specify-the-steps-required-to-complete-a-task セクションを区別する ゚リア名称や、甚語䞀芧を枡しおいるのですが、ここを匕甚笊などで区切りたした。 ★ 修正前のプロンプト 以䞋にシステムで扱える甚語䞀芧を瀺したす。 * サりナ * 穁煙 * 喫煙 * 宀内プヌル * ... * ... ★ 修正埌のプロンプト 以䞋にシステムで扱える甚語䞀芧を瀺したす。 """ * サりナ * 穁煙 * 喫煙 * 宀内プヌル * ... * ... """ このヒントは以䞋に曞かれおいたした。 https://platform.openai.com/docs/guides/prompt-engineering/tactic-use-delimiters-to-clearly-indicate-distinct-parts-of-the-input 䟋を付ける 出力の䟋を付けたした。䞊述したように、以前はルヌルを䜿っお回答を制埡しおいお、1 ぀か 2 ぀しか䟋を付けおいたせんでした。 それを以䞋の様に䟋を増やしたした。 ★ 修正埌のプロンプト 以䞋は、出力のjsonの䟋です。 䟋1「絶景ず枩泉」ずいうナヌザヌのク゚リの堎合、以䞋の条件を出力しおください。 { condition : ["絶景","枩泉"] } 䟋2「浜束でうなぎ料理を楜しめる旅通」ずいうナヌザヌのク゚リの堎合、以䞋の条件を出力しおください。 { area:["浜束"] condition: ["うなぎ料理"] } 䟋3... 䟋4... このヒントは以䞋に曞かれおいたした。 https://platform.openai.com/docs/guides/prompt-engineering/tactic-provide-examples 以䞊がメむンずなるプロンプトの修正です。これらは本圓にガむドラむンに埓っお足りおいないものを曞き換えただけです。 それだけで玄 35 の粟床改善ずなったので、同じような悩みを抱えおいる方はぜひ詊しおいただきたいです。 おわりに 今回、プロンプト゚ンゞニアリングの効果を十分に理解するこずができたした。 ただ、考えおみれば、人が人に仕事を任せる時は圓然盞手の立堎やスキルを考えお指瀺を出したす。 これをどうしお AI でやらないのか。 AI も AI の理解しやすい呜什の構造があり、それをプロンプト゚ンゞニアリングで最適化する。 人の気持ちを考えるように AI の気持ちを考える。 いい仕事をするためには人も、 AI も関係なく、盞手を思い遣る心が倧切なのだず思いたした。
CTO宀プラットフォヌム開発チヌムの山口( @igayamaguchi )です。 この床、䞀䌑ずむオンスマヌトテクノロゞヌ合同で技術勉匷䌚「事業䌚瀟のサヌビスを支える基盀開発トヌク」を開催したす ikyu.connpass.com このむベントでは 䞀䌑.com 、 Yahoo!トラベル 、 䞀䌑.comレストラン を運営する 䞀䌑 iAEONアプリ 等を開発・運営する むオンスマヌトテクノロゞヌ 䞡瀟のシステムを支える基盀の開発に぀いおお話ししたす。 様々なお話をしおいただく予定ですが、䞀䌑から1぀「歎史あるプロダクトにマむクロサヌビスを導入するプロセス」に぀いお玹介したす。 この発衚では䞀䌑.comレストランにマむクロサヌビスを導入したずきの取り組みに぀いおお話ししたす。䞀䌑.comレストランはWebサヌビスずしお18幎もの歎史があるサヌビスです。歎史の長いサヌビスになるず党おが新しい技術でできおいるわけではなくレガシヌなアヌキテクチャのものもありたす。それらを考慮しながらマむクロサヌビスを導入しおいった泥臭い取り組みに぀いおお話しする予定です。 他にも以䞋のようなトヌクを予定しおいたす。 宿泊予玄サむトにおける料金蚈算の栌闘 1000侇DLを超えたiAEONアプリ完党停止を防ぐ耐障害性ず信頌性の蚭蚈 SRE改善サむクルはチヌムを超えお - ダッシュボヌドを眺める䌚の取り組み それぞれの開発で取り組んでいる課題に぀いおリアルな話をお送りしたす。どのトヌクもずおも面癜い内容になるず思いたす そしお今回はオフラむンで開催したす。堎所は䞀䌑本瀟も入居する東京ガヌデンテラス玀尟井町17階にあるLODGEです。 https://www.z-lodge.com/ www.z-lodge.com 懇芪䌚もありたすので、ご来堎いただいた方はぜひ登壇者や他の参加者の方ず亀流しおいただければず思いたす。 ぜひお越しください
CTO 宀の恩田( @takashi_onda )です。 䞀䌑レストランのフロント゚ンドアヌキテクトを担圓しおいたす。 Intro 䞀䌑レストランでは、以前ご玹介したようにフロント゚ンドで React / Remix を利甚しおいたす。 user-first.ikyu.co.jp 䞀方、蚭蚈方針ずしおは、React / Remix ぞの䟝存が最小になるように心掛けおいたす。 今日は、そんな䞀芋矛盟するような蚭蚈方針に぀いお、ご玹介したいず思いたす。 この蚘事を読んでいただき Remix に興味をもたれたら、明埌日 2024/8/7(æ°Ž) 19:00〜 のオンラむンむベント offers-jp.connpass.com にもご参加いただけるず嬉しいです。 この蚘事でご玹介しおいる疎結合なフロント゚ンドアヌキテクチャを実珟する Remix の魅力に぀いおお話したす。 なぜ䟝存を最小にするのか React / Remix を䜿っおいお䟝存しないっおどういうこずず疑問を持たれる方も倚いでしょう。 たずはその動機からご説明したす。 フレヌムワヌクやラむブラリより寿呜が長いプロダクトは珍しくありたせん。 栄枯盛衰の激しいフロント゚ンドでは、そういったサヌビスの方がむしろ倚いのではないか、ずも感じたす。 䞀䌑レストランのサヌビス開始は2006幎です。 同じ2006幎に jQuery 1.0 がリリヌスされたした。 ただ、フロント゚ンドずいう蚀葉が生たれる前の時代です。 䞀䌑レストランは、そんな時代から二床のリニュヌアルを経ながら今は二床目の真っ最䞭継続しおいるサヌビスです。 これからも広く䜿っおいただけるよう日々、開発を進めおいたす。 したがっお、将来、゚コシステムが倧きく倉わったずしおも、その倉化に少ない劎力で远随し続けられるこずが重芁ずなりたす。 フロント゚ンド領域も成熟しおきおいるので、今埌は、゚コシステムが激しく入れ替わるような状況はもう蚪れないかもしれたせん。 それでも、フレヌムワヌクやラむブラリレベルでみるず、メゞャヌバヌゞョンアップは数幎単䜍で芋れば避けられず 1 、その䞭には砎壊的倉曎を䌎うものもあるでしょう。 バック゚ンド蚭蚈に倣う バック゚ンド蚭蚈では、フレヌムワヌクぞの䟝存を最小化する、ずいう考え方が叀くからありたす。 すなわち、バック゚ンドの䞖界では、指針ずなる原則や、䟝存を最小にしお疎結合にする技術が確立しおいるのです。 偉倧な先人達の肩の䞊に乗るため、その知芋はどういったものなのかを確認したいず思いたす。 䟝存性逆転の原則 (Dependency Inversion Principle) ボブおじさんこず Robert C. Martin が提唱した SOLID 原則をご存知の方は倚いず思いたす。その SOLID 原則の D 、䟝存性逆転の原則がフレヌムワヌクぞの䟝存を最小化するための根幹の考え方になりたす。 少々長くなるので、ご存知の方は読み飛ばしおください 簡朔に説明するず、 高レベルモゞュヌルであるドメむン局が自身の必芁ずする抜象 (interface) を定矩し 䜎レベルモゞュヌルにあたるむンフラ局がその抜象を実珟する詳现 (class) を実装する ように蚭蚈すべし、ずいう原則です。 高レベルモゞュヌルが䜎レベルモゞュヌルに盎接䟝存するのではなく、䜎レベルモゞュヌルが、高レベルモゞュヌルの芁求しおいるむンタヌフェヌスの実装を提䟛する。 蚀い換えるず、䜎レベルモゞュヌルが高レベルモゞュヌルの抜象に䟝存するこずから、䟝存性逆転の原則ず呌ばれたす。 少し雑に蚀えば、高レベルモゞュヌルにあたるのが我々の開発するプロダクトです。 䜎レベルモゞュヌルがフレヌムワヌクやラむブラリず、それらを䜿ったむンフラ局に盞圓したす。 よく甚いられる Repository の䟋で説明したす。 プロダクトが知っおいるのは自身で定矩した Repository の interface のみです。 プロダクトが Repository の実装を構成するラむブラリやフレヌムワヌクの API を盎接呌ぶこずはありたせん。 Repository の interface もフレヌムワヌクが芁求する interface から独立しおいたす。 フレヌムワヌクぞの䟝存が疎結合になりたした。 腐敗防止局 (Anti Corruption Layer) 他にもバック゚ンドで培われた䟝存を最小化するテクニックずしお、腐敗防止局は欠かせたせん。 DIP に比べるず、シンプルでわかりやすいず思いたす。 ラむブラリや倖郚のサヌビスを利甚するずきに wrapper を挟み、倉曎の圱響をその wrapper に閉じこめるずいう手法です。 むンタヌフェヌスや実装が安定しなかったり、将来亀換する可胜性が考えられるような堎合に、特に有効です。 フロント゚ンドにどう適甚するか 「䜙蚈なこずをしない」玠盎なフレヌムワヌクが倧前提 珟代のフロント゚ンド開発では、(メタ)フレヌムワヌクを利甚するこずが䞀般的です。 たず、フレヌムワヌクに求められる芁件を考えたいず思いたす。 「䜙蚈なこずをしない」ずは 逆を考えるずわかりやすいかもしれたせん。 党郚面倒を芋おくれる、手厚いけれど、耇雑な芏玄があり、その裏偎がどうなっおいるかわからないフレヌムワヌクを思い浮かべたしょう。フロント゚ンド・バック゚ンドは問いたせん。過去を振り返れば、だいたいどの蚀語にも䞀぀はありそうです。 このような党郚入りフレヌムワヌクは、 そのフレヌムワヌクが想定しおいるナヌスケヌスの範疇でコヌドを曞けおいお、 運甚面でも安定しおいるのであれば、 ずおも優れた開発効率や開発䜓隓が埗られるでしょう。 ですが、フレヌムワヌクが甚意しおくれおいるレヌルから倖れないず実珟が難しい芁件は埀々にしお存圚したす。 そんな芁件に遭遇しおしたうず、フレヌムワヌクそのものに手を入れる以倖の回避策しか芋぀からないこずが倚く、詰みたす。 2 たた、そんな芁件に出䌚わなかったずしおも、そのフレヌムワヌクに密結合状態で䟝存しおいるだけで匊害は存圚したす。 たずえばメゞャヌバヌゞョンアップで砎壊的な倉曎が加えられたずき、その倉曎に远随するための苊劎は過去にそのようなフレヌムワヌクを䜿ったこずがある方なら想像に難くないず思いたす。 Remix の採甚 さお、逆の状況を螏たえた䞊で、あらためおフロント゚ンドの䞖界で「䜙蚈なこずをしない」フレヌムワヌクの条件を考えおみたしょう。 暙準 API の尊重、ブラックボックスがない、なだらかなアップデヌトパス、実装がシンプル、ずいった条件が挙げられたす。 珟時点においお React ベヌスでは Remix が条件を最も満たしおいるず刀断し、以前ご玹介したように、 䞀䌑レストランでは Remix に乗り換える こずを決断したした。 その䞊でバック゚ンド蚭蚈の原則に埓い Remix API ぞの䟝存は最小限になるよう努めおいたす。 疎結合なアヌキテクチャを実珟するためには、逆説的ではありたすが、フレヌムワヌクがそれを可胜ずする䜜りになっおいるこずが重芁なのです。 Remix だず、なぜそれが可胜になるのかは、最初にご玹介した オンラむンむベント でもお話する予定です。 React 非䟝存の Vanilla JS だけで䜿えるラむブラリを遞ぶ 䞀䌑レストランでは 以前ご玹介した XState に加えお Jotai ず TanStack Query を利甚しおいたす。 いずれも React に䟝存しおいないずいう共通点を持ちたす。 TanStack シリヌズは Vanilla JS のコアず各フレヌムワヌクぞのアダプタで構成されおいたす。 Jotai は TanStack シリヌズのようにフレヌムワヌク独立を謳っおいるわけではなく、React で䜿うこずを前提ずした状態管理ラむブラリですが、公匏サむトにも Now with a store interface that can be used outside of React. ずあるように v2 からは、Vanilla JS で利甚できる状態管理ラむブラリずしおの偎面も持぀ようになりたした。 コアの Vanilla JS 郚分ず React アダプタが別れおいるため、他のフレヌムワヌクず組み合わせお䜿うこずが可胜です。 たずえば Vue や Svelte , SolidJS のアダプタを䜜っおいる方もいるようです。 React / Remix での DIP 具䜓䟋ずしお、䞀䌑レストランの soft navigation 機胜をご玹介したす。 䞀䌑レストランでの soft navigation では Remix の useLocation や useNavigate を盎接䜿っおいたせん。 アプリ偎で、 useLocation に察応する useNavigationContext useNavigate に察応する useEventNavigate ずいうカスタムフックをそれぞれ定矩しおいたす。 DIP の芳点から芋るず、 useNavigationContext , useEventNavigate の signature が、高レベルモゞュヌルの定矩する抜象に盞圓したす。 具䜓的に芋おみたしょう。 export function useNavigationContext (): NavigationContext { // implementation } 関数が first-class citizen なので signature (interface) さえ倉わらなければ、 type UseNavigationContext = () => NavigationContext export const useNavigationContext: UseNavigationContext = createUseNavigationContext() 極端な䟋ですが、呌び出し元のコヌドを倉えずに、埌から実装を動的に差し替える圢にするこずも可胜です。 3 さお、これらのフックは Remix の useLocation や useNavigate に加え Jotai, XState を利甚しお実装しおいたす。 このフックの実装自䜓が、DIP における䜎レベルモゞュヌルが実装する詳现にあたりたす。 もちろん、アプリで定矩しおいるこれらのフックは、単に DIP を実珟するためだけに導入しおいるわけではありたせん。 あくたで、サヌビス固有のナヌスケヌスを実珟するための機胜を付加した抜象局になっおいたす。 4 ナヌスケヌスを具䜓的に芋おみたしょう。 ナヌザヌが䞀䌑レストランで予玄をするずき、人数日時などの予玄条件や空垭状況に応じお、次に衚瀺するステップを切り替えたい堎面がありたす。 このステップ、すなわち遷移先の切り替えは、固定的なナビゲヌションではなかなか実珟が難しい機胜です。 たた、レストランの空垭状況は刻々ず倉化するので、その時点の状況に応じた動的な画面遷移が必芁ずなりたす。 このようなナヌスケヌスに察応するため、ナビゲヌションロゞックは XState を䜿ったステヌトマシンで定矩しおいたす。 そしお、ステヌトマシンが次の操䜜に盞圓するむベントをもずに次の画面(状態遷移)を決定する仕組みを取りたした。 useNavigationContext はステヌトマシンの珟圚のステヌトずそのコンテキストを返し、 useEventNavigate はステヌトマシンにむベントを送信する関数を返しおいたす。 コンポヌネント蚭蚈 最埌に、フロント゚ンドのアヌキテクチャにおいお、本䞞ずなるコンポヌネントの蚭蚈に぀いお説明したす。 コンポヌネント、カスタムフック、Vanilla JS ロゞックの䞉局で構成しおいたす。 コンポヌネント コンポヌネントは衚瀺だけの責務を担う、テンプレヌト゚ンゞン的な䜍眮付けです。 function CourseFilter () { const facets = useAvailableFacets() return ( < div > { facets. map (( facet ) => ( < FacetButton key = { facet. key } facet = { facet } /> )) } </ div > ) } function FacetButton ( {facet} : {facet : Facet} ) { const toggle = useToggleFacet() const onClick = useCallback(( _ : MouseEvent < HTMLButtonElement >) => { toggle(facet) } , [ toggle, facet ] ) return ( < button type = "button" aria-pressed = { facet. selected } onClick = { onClick } > { facet. label } </ button > ) } 基本的に、フックで取埗した倀を衚瀺したり、むベントハンドラにバむンドしおいる以䞊の仕事はしおいたせん。 カスタムフック カスタムフックは Vanilla JS ロゞックずコンポヌネントを繋ぐアダプタヌ局です。 function useAvailableFacets () { return useAtomValue(availableFacetsAtom) } function useToggleFacet () { const set = useSetAtom(toggleFacetAtom) return useCallback(( facet : Facet ) => { set(facet) } , [ set ] ) } Jotai の atom ず接続するだけの薄いアダプタヌになりたす。 5 Vanilla JS ロゞック Jotai の atom から先が、Vanilla JS (TypeScript) で曞かれたロゞックです。 ただの TypeScript コヌドなので、可搬性が保蚌されたす。 自動テスト 自動テストは、単䜓テストず e2e テストのみでカバヌしおいたす。 単䜓テストでは React Testing Library を䞀切䜿甚しおいたせん。 このこずからも、React ぞの䟝存が最小限になっおいるこずが䌝わるかず思いたす。 Vanilla JS ロゞックは、そのほずんどを玔粋関数ずしお実装しおいるので、耇雑な fixture のセットアップも䞍芁で vitest で高速にテストが可胜です。 䟝存の最小化で埗られる利点 確実に発生するシナリオずしお、フレヌムワヌクのメゞャヌバヌゞョンアップに䌎う砎壊的な倉曎の圱響を受けにくくなる、ずいう点が挙げられたす。 React 19 や React Router v7 (fka Remix v3) でどう倉わる 珟時点で刀明しおいる範囲からの刀断ではありたすが、圱響はほがれロになるだろうず芋おいたす。 盎接 Remix API を呌んでいる箇所は、これたで芋おきたように DIP の䜎レベルモゞュヌルにあたるフックの実装内に閉じおいたす。 たた、その構造䞊、Remix API の呌び出し箇所も最小限に抑えられおいるため、仮に倉曎が必芁になっおも、手を入れないずいけない箇所は必然的に最小限に留められたす。 加えお Remix 自䜓もその蚭蚈哲孊で、メゞャヌバヌゞョンアップで導入される機胜や倉曎は future flag ずしお段階的に適甚できる 圢で提䟛されたす。 砎壊的な倉曎は䌎うずはいえ、バヌゞョンアップに远随する負担が抑えられたフレヌムワヌクず蚀えるでしょう。 䟋えば Server Component もオプトむン的に必芁な箇所にだけ適甚できるような 仕様が怜蚎 されおいたす。 React 19 や React Router v7 に぀いおも 前述したオンラむンむベント でお話しする予定ですので、興味のある方はぜひご参加ください。 極端な䟋だが、仮に他のフレヌムワヌクに眮き換えないずいけなくなったら コンポヌネント蚭蚈でお䌝えしたように、薄いコンポヌネント局を移怍するだけで察応できたす。 TypeScript で曞かれたロゞックは、Vanilla JS ずいうその性質䞊、倉曎するこずなくそのたた䜿えるこずには説明の必芁もないでしょう。 Outro 䟝存ラむブラリやフレヌムワヌクのメゞャヌバヌゞョンアップ皋床では、ほずんど揺らがないアヌキテクチャができたした。 あらためお前提を振り返っおみるず、長い歎史を持ち、継続可胜性が極めお高いサヌビスだからこその遞択であるずも蚀えたす。 スタヌトアップで、MVP でずにかく詊行錯誀を高速に繰り返したい、ずいった状況䞋では、たた別の遞択肢があるず思いたす。 かなり長くなっおしたいたしたが、ここたで読んでいただきありがずうございたした。 この蚘事が、フロント゚ンドのアヌキテクチャを考える䞊での䞀助ずなれば幞いです。 䞀䌑では、本蚘事でお䌝えしたような課題をずもに解決するフロント゚ンド゚ンゞニアを募集しおいたす。 www.ikyu.co.jp たずはカゞュアル面談からお気軜にご応募ください! hrmos.co React 19 や React Router v7 のリリヌスが近づいおいたす。 ↩ Remix ぞの移行を決めた理由の䞀぀です ↩ 実際には玠盎に関数ずしお実装しおいたす。事前に定矩しなくおも関数の signature が interface ずしお機胜するこずを瀺すための䟋です。 ↩ 実を蚀うず、最初から珟圚の蚭蚈に蟿り぀けおいたわけではありたせん。圓初は Remix の nested routes を駆䜿する案を怜蚎しおいたした。その過皋でチヌムメンバヌから瀺唆をもらい、ステヌトマシンを䜿ったアプロヌチに切り替えたした。もし、圓初案のたたであれば DIP ず正反察の状態になっおいたず思いたす。 ↩ Jotai のようなラむブラリを利甚しない堎合は useSyncExternalStore を䜿っお、ロゞックを React ず疎結合にできたす。 ↩
レストランプロダクト開発郚の矢柀です。 䞀䌑では「 RESZAIKO 」ずいうプロダクトの開発を行っおいたす。 この開発を進めるにあたり、UI/UX に関するいく぀かの課題があり、゚ンゞニア䞻導でデザむンシステムを構築するこずにしたした。 本蚘事では、゚ンゞニア䞻導でデザむンシステムを構築するこずになった背景や、実際に取り組んだ内容に぀いお赀裞々にお話ししたす。 デザむンシステムの導入を怜蚎しおいるものの、最初の䞀歩を螏み出せずにいる・あるいは䜕から始めればよいかわからないチヌムにずっお参考になれば幞いです。 そもそも RESZAIKO ずは RESZAIKO は飲食店の予玄管理を DX する SaaS 事業で、珟圚3぀のプロダクトを提䟛しおいたす。 耇数予玄サむトの圚庫を䞀括管理する「サむトコントロヌラヌ」 予玄や顧客情報を管理する「予玄台垳」 店舗独自の予玄ペヌゞを提䟛する「Web予玄」 珟圚は3぀のプロダクトがありたすが、元々はサむトコントロヌラヌだけを提䟛しおおり、予玄台垳ずWeb予玄は埌発のプロダクトずしおリリヌスしたした。 デザむンシステム䜜成の背景 埌発プロダクトの開発を進めおいく䞭での課題 私たちはサむトコントロヌラヌがある状態で、「予玄台垳」ず「Web予玄」の開発に着手したした。 同時進行で開発するこずになったこの2぀の埌発プロダクトは、既存プロダクトであるサむトコントロヌラヌの UI/UX を参考にしお蚭蚈・開発を進めおいたしたが、さたざたな課題に盎面したした。 課題① スピヌド感を持っおデザむンを固めおいくこずが難しい RESZAIKO にはサむトコントロヌラヌの開発時から瀟内に専任のデザむナヌがいなかったため、瀟倖のデザむナヌず週䞀回のミヌティングでデザむンを進めおいたす。 限られた時間で倚くの画面のデザむン調敎を行うこずは難しく、簡単な画面ぱンゞニアがデザむンするこずもありたした。しかし、デザむナヌ以倖デザむンルヌルの把握ができおいない状況であったため郜床認識を合わせる必芁があり、スピヌド感を持っお進めおいくこずができたせんでした。 課題② プロダクト間で UI/UX の統䞀感を生み出しづらい RESZAIKO は飲食店のスタッフが3぀のプロダクトを暪断しお䜿甚するこずを想定しおいたす。暪断しお䜿甚しおも違和感のない操䜜を提䟛するために UI/UX を合わせる必芁がありたしたが、デザむンや操䜜感に関する知芋を開発チヌム間でうたく共有できず、差異が生じおしたうこずがありたした。 これを防ぐために、瀟倖のデザむナヌに Figma 䞊でコンポヌネントの眮き堎を䜜成しおもらいたした。 しかし、各プロダクトで䜿甚するための仕組み化ができず、操䜜感の統䞀も Figma 䞊で十分に衚珟されおいなかったため、うたく運甚するこずができおいたせんでした。 課題③ デザむンのクオリティの担保が難しい 同䞀プロダクト内で同じコンポヌネントを䜿甚しおいおも、䜙癜の取り方やコンポヌネントの組み合わせ方など现かい郚分たで統䞀するこずは難しいです。実際に、既存箇所を参考にしおできた画面は、倧枠は同じでも完璧には揃えられおおらず、画面ごずに少しず぀違いが出おしたいたした。 たた、デザむンに関するチェック基準がないため、チヌム内でのレビュヌもある皋床たでしか確認できず、デザむナヌのレビュヌも毎回现郚たでチェックするこずができない状態でした。 このような課題を感じながら圓初は開発を進めおいたしたが、リリヌスが近づくに぀れ、デザむンのスピヌド感がボトルネックになり始めたした。 そこで、゚ンゞニアの䞭から比范的 UI/UX にこだわりをも぀3人が集たり、RESZAIKO デザむンシステムを䜜成するこずになりたした。 デザむンシステム構築の流れ このようにしおデザむンシステムを䜜ろうずいう話になったものの、メンバヌが゚ンゞニアだけだったため、デザむンシステムに関する知芋が䞍足しおいたした。 そこで、知芋を埗るために「ちいさくはじめるデザむンシステム」ずいう本を読むこずにしたした。 ちいさくはじめるデザインシステム bnn.co.jp この本は、SmartHR 瀟のデザむンシステムの取り組みを䟋にデザむンシステムの構築・運甚の方法に぀いお曞かれおいたす。 私たちはこの本を参考に以䞋の流れで進めおいきたした。 コンセプト蚭定 デザむンシステムは、流行っおいるからや、なんずなくデザむンの課題が解決しそうずいう理由で䜜成しがちです。 しかし、「ちいさくはじめるデザむンシステム」には前提ずしお目的が必芁であるず蚘茉されおいたため、たずデザむンシステムを䜜成する目的を改めお定めるずころから始めるこずにしたした。 デザむンシステムには正解がなく、「デザむン」ずいう䜕らかの目的を機胜させるための「システム」であり、システムずしお成立させるために䜕らかの目的が必芁 集たった゚ンゞニア同士で珟圚感じおいる課題点を挙げ、それらの解決には䜕が必芁なのか、どのような状態が理想なのかを話し合いたした。 その結果、以䞋のようなデザむンシステムのコンセプトずしお明文化したした。 デザむンシステム コンセプト デザむンず開発を効率化し、課題解決に集䞭できる環境を䜜り、リリヌスや改善サむクルを早くする デザむンに䞀貫性をもたせ、ナヌザヌビリティずアクセシビリティを向䞊させるサヌビス単䜓 3぀のプロダクトを違和感のないナヌザヌ䜓隓を提䟛する 非デザむナヌずデザむナヌずのコミュニケヌションずしお䜿甚し、共通認識を䜜る手段ずする 非デザむナヌが自走しお簡易的なデザむンを行えるようにするデザむンのよりどころにする 構成決め コンセプトを決めたずころで、次にデザむンシステムをどのような構成で実際に䜜成しおいくのかを怜蚎したした。 構成を決めるにあたっお、たずは他瀟のデザむンシステムではどのような項目を採甚しおいるのか調べたした。 「ちいさくはじめるデザむンシステム」にあるずおり、党おを網矅する必芁はないため、調べたすべおの項目を採甚するのではなく、必芁なものを取捚遞択したり独自で項目を远加したりしたした。 スタむルガむドには様々な皮類がありたすが、すべおを網矅しおいる必芁はありたせん。必芁や目的・組織などに応じお柔軟に遞ぶこずができたす。 私たちが特に参考にしたデザむンシステムは、「 SmartHR Design System 」「 Spindle 」「 デゞタル庁 デザむンシステム 」の3぀です。 「SmartHR Design System」はトヌクンやコンポヌネントなど基本芁玠が網矅されおいるため、アりトラむン䜜成の参考にしたした。 「Spindle」は定矩したコンポヌネントの䜿甚ルヌルがわかりやすくたずめられおいたため、デザむンルヌル䜜成の参考にしたした。 たた、今回䜜成するデザむンシステムは元々コンポヌネント眮き堎ずしお䜿甚しおいた Figma に定矩したいず考えおいたため、「デゞタル庁 デザむンシステム」のたずめ方を参考にしお䜜成するこずにしたした。 レビュヌ デザむンシステムのコンセプトず構成が決たったずころで、他のプロダクトのデザむンシステムを䜜成しおいる方にレビュヌを䟝頌しようずいうこずになりたした。 䞀䌑.com ではすでにデザむンシステムが構築されおいるため、その䜜成に携わったデザむナヌや゚ンゞニアにレビュヌを䟝頌したした。 user-first.ikyu.co.jp レビュヌ䌚では、定矩するコンポヌネントに察しおどのように䜿うのかルヌルを蚘茉した方が良いずいうアドバむスをいただきたした。 これを受け、もずもずルヌルは「デザむンパタヌン」ずいう名目でレむアりトに関するこずを定矩する予定でしたが、これを「デザむンルヌル」ずいう名称に倉曎し、コンポヌネントの䜿い方たで定矩するこずにしたした。 たた圓初は Figma 䞊でガむドラむンの定矩のみを行う予定でしたが、せっかく゚ンゞニアが䜜成しおいるのだからラむブラリたで䜜成したらどうかず提案をいただき、ラむブラリの䜜成も詊みるこずにしたした。 そしお、最終的に決定した構成がこちらです。 利甚の手匕き: デザむンシステム構築の目的・利甚方法 デザむンフィロ゜フィヌ: RESZAIKOプロダクトが倧切にしおいるこず デザむントヌクン: デザむンシステムにおける最小単䜍のスタむル定矩 コンポヌネント: UIを構成するための最小単䜍のパヌツやアむコン デザむンルヌル: デザむントヌクンやコンポヌネントを䜿甚する際のルヌル ラむティングガむド: です/たす調や句読点の打ち方 チェックリスト: デザむンシステムに則っおいるか刀断するための確認項目 この䞭でも、たずは最小限でリリヌスしおみようずいうこずになり、䞻芁郚分ずなる「デザむントヌクン」「コンポヌネント」「デザむンルヌル」の策定を初回リリヌスの目暙ずしお進めおいくこずにしたした。 䜜成 レビュヌのフィヌドバックを受けたずころで、デザむンシステムの䜜成に着手したした。 本業の実装も䞊行で行っおいお、あたり時間を確保できない䞭、Figma に各自がトヌクンやコンポヌネントを远加し、週に1回3人で集たっおお互いが䜜成したものにフィヌドバックを行うずいう流れで進めたした。 たた、3人の䞭で合意が取れたものは、瀟倖のデザむナヌに確認しおもらい、゚ンゞニアずデザむナヌの双方が問題なく䜿甚できるように敎えおいきたした。 実際にできたデザむンシステムの䞀郚をお芋せしたす。 デザむントヌクン コンポヌネント デザむンルヌル β版リリヌス 初回リリヌスずしお掲げおいた「デザむントヌクン」「コンポヌネント」「デザむンルヌル」の䜜成がある皋床完了したずころで、β版のデザむンシステムずしおチヌムに展開したした。 珟圚は、実際に瀟倖のデザむナヌや開発メンバヌに利甚しおもらい、元々の定矩で䞍十分だった内容を拡充したり、新たなUIに぀いおは郜床定矩を远加したりしおいたす。 デザむンシステムを通じお、デザむナヌずのコミュニケヌションが円滑になっただけでなく、゚ンゞニア同士でもデザむンに関する䌚話ができるようになり、コミュニケヌションツヌルずしおも機胜しはじめおいたす。 たずめ 本蚘事では、RESZAIKO デザむンシステムの導入背景からβ版リリヌスたでの流れをご玹介しおきたした。 ゚ンゞニア䞻導でデザむンシステムを構築しおみるず、前提知識が䞍足しおいたこずから調査しなければならない事柄が倚く、最初の段階ではリリヌスたでたどり着けるのか䞍安に感じるこずもありたした。 しかし、実装で必芁になるコンポヌネントやデザむンルヌルが明らかなので、Figma ぞの定矩のフェヌズに移っおからは特に迷うこずなく進めるこずができたした。 自分たちが実装時に必芁ずしおいるものをダむレクトに反映するこずができるこずは、゚ンゞニア䞻導で䜜成するメリットだず思いたす。 今回デザむンシステムを導入したこずにより、圓初感じおいた3぀の課題は解決できたのかずいう点に぀いおですが、解決できた郚分もあればもう少し手を加える必芁がある郚分もあるず感じおいたす。 課題① スピヌド感を持っおデザむンを固めおいくこずが難しい デザむナヌず゚ンゞニアの共通蚀語ができたこずにより、デザむンに察する質問の粟床も䞊がり、コミュニケヌションが取りやすくなったため、これたでよりスピヌド感を持っお開発が進められるようになっおきたした。 今埌は、さらにデザむンルヌルなどをアップデヌトし、デザむンに぀いお考えやすい環境を敎えおいければず思いたす。 課題② プロダクト間で UI/UX の統䞀感を生み出しづらい 各プロダクト間でコンポヌネントを怜蚎しデザむンに反映するこずがなくなったため、導入前よりも統䞀感を出すこずができるようになりたした。 しかし、実装レベルでの統䞀がただ十分ではありたせん。これを解決するために、UI ラむブラリずしおパッケヌゞ化し、RESZAIKO の各サヌビスに反映しおいければ、さらに課題の解決に぀ながるず考えおいたす。 課題③ デザむンのクオリティの担保が難しい ルヌルが定たったこずで、誰が䜜成しおも差異が出ないようにする基盀は敎えられたしたが、チェック時の効率はただ改善の䜙地がありたす。 より効率的に確認できるようにするため、チェックリストの䜜成など、デザむンシステムの拡匵も進めおいきたいず考えおいたす。 運甚を始めたばかりの珟段階では、ただ党䜓的に改善の䜙地が倚く残っおいたす。 これからさらにデザむンシステムをアップデヌトし、利䟿性を高めおいきたいず考えおいたす。 おわりに 党く知芋がない䞭で始めたデザむンシステムの䜜成でしたが、ありがたいこずにデザむンシステムをオヌプンに運甚しおいる䌁業が倚く、参考にできるものが豊富にありたした。そのおかげで自分たちなりにアレンゞしおなんずか圢にし、プロトタむプたで持っおいくこずができたした。 知芋がない䞭で、たた゚ンゞニア䞻導でデザむンシステムを導入しようずしおいる方々にずっお、この経隓が䞀぀の手がかりになれば嬉しいです。 RESZAIKO デザむンシステムはこれからもっずアップデヌトさせおいくので、今埌もブログで発信しおいきたす 䞀䌑ではずもに良いサヌビスを぀くっおいける仲間を募集しおいたすので、興味を持っおいただけたら、ぜひ䞀䌑の 採甚サむト をご芧ください。
Go Conference 2024にスポンサヌしたした CTO宀プラットフォヌム開発チヌムの山口( @igayamaguchi )です。 先日6/8(土)に䞀䌑でGo Conference 2024にスポンサヌをさせおいただき、スポンサヌブヌスを出展したした。 gocon.jp 来おいただいた方はありがずうございたす 来おいただいた方ず話しおいく䞭で、䞀䌑がGoを䜿っおいるこずを知らない方がたくさんいるこずに気づきたした。逆に、最近䜿い始めたばかりのRustの事䟋に぀いおご存知の方のほうが倚かったのです。これは、次のRustに぀いおの蚘事が倚くの方に読たれたこずによる圱響だず思いたす。 user-first.ikyu.co.jp 実際には䞀䌑はGoを䜿っおいるサヌビスがたくさんありたす。その点をアピヌルするため、この蚘事では䞀䌑のどのサヌビスでGoが掻甚されおいるかを玹介したす。 䞀䌑がどのサヌビスでGoを䜿っおいるか たず、䞀䌑ではいく぀ものサヌビスを提䟛しおいたす。 䌚瀟玹介資料 より抜粋 この䞭でGoが䜿われおいるサヌビスは以䞋の赀枠で囲われたサヌビスです。 ご芧の通り、Goが䜿われおいるサヌビスは倚いです。 たた、ナヌザヌ向けのサヌビスずは別の瀟内プラットフォヌムでもGoが䜿われおおり、実際は䞊の図で衚されおいる箇所以䞊にGoが掻甚されおいたす。 ここからは、各サヌビスでのGo利甚事䟋を個別に玹介しおいきたす。 囜内宿泊予玄サヌビスでの掻甚 たず、䞀䌑の䞭で最も倧きなサヌビスである囜内宿泊予玄においおGoは掻甚されおいたす。 䞀䌑では囜内宿泊予玄サヌビスずしお䞀䌑.comずYahoo!トラベル(LINEダフヌ株匏䌚瀟から運営を委蚗)を運営しおいたす。 https://www.ikyu.com https://travel.yahoo.co.jp 宿泊斜蚭を探すための怜玢を実行するバック゚ンドがGoで曞かれおいたす。バック゚ンドはgqlgenを甚いたGraphQLサヌバヌになっおおり、ホテルやプランの怜玢、料金、圚庫怜玢ずいったロゞックが実装されおいたす。他にも、党文怜玢゚ンゞンであるSolrのむンデクシングや、斜蚭管理画面の䞀郚APIなどもGoで曞かれおいたす。 ホテルの予玄を行う凊理、予玄情報の閲芧ペヌゞはVB.NETですが、こちらも埌々Goに眮き換えおいく予定です。 ふるさず玍皎、海倖宿泊予玄 囜内宿泊予玄サヌビス以倖にもいく぀かのサヌビスでGoは掻甚されおいたす。 䟋えば宿泊予玄時に割匕クヌポンを受け取れるふるさず玍皎サヌビスや、海倖宿泊予玄です。 https://furusato.ikyu.com/ https://www.ikyu.com/global/ これらのサヌビスは、瀟内では新しめずいうこずもあり、バック゚ンドは怜玢から予玄たですべおGoで実装されおいたす。 䞀䌑プラットフォヌム ナヌザヌ向けサヌビス以倖に、瀟内向けプラットフォヌムでもGoは䜿われおいたす。䞀䌑ではいく぀ものサヌビスを運営しおおり、サヌビス間で共通のアカりントを利甚し、貯めたポむントをサヌビス暪断で䜿甚したり、同じ決枈の仕組みを䜿ったりできたす。 そういった機胜を各サヌビスで再実装するこずなく提䟛するために、䞀䌑プラットフォヌムずしお耇数のマむクロサヌビスを実装し、運甚しおいたす。具䜓的なサヌビスずしお、珟圚は䌚員サヌビス、ポむントサヌビス、決枈サヌビスがあり、これらはすべおGoで実装しおいたす。 珟圚移行䞭の䞀䌑プラットフォヌムの図 䞀䌑プラットフォヌム開発の実䟋に぀いおは、2023幎のむベントでの資料も参照しおください。 speakerdeck.com Goを遞定しおよかったこず 実際に囜内宿泊予玄や䞀䌑プラットフォヌムの開発に携わっおいるメンバヌから、Goを遞んでみおよかったこずを聞いおみたした。 䞊行凊理が蚀語組み蟌みで入っおいる。しかもそれが䜿いやすい 蚀語仕様がシンプルで、入門から䜿えるようになるたでの時間が短い 業務ロゞックが倧事なので、シンプルか぀堅く曞けるのがよい 䞀括凊理や䌚蚈管理で倧きめのデヌタを扱うずきは非同期凊理も曞ける 総じお、Goは「シンプル、か぀すばやく、それでいお堅牢に䜜れる」こずを重芖する䞀䌑の技術遞定方針に合臎するず感じおいたす。 おわりに この蚘事では、䞀䌑がGo Conference 2024にスポンサヌさせおいただいたこず、䞀䌑では幅広くGoが䜿われおいるこずを玹介したした。䞀䌑では、これからも生産的か぀高効率にサヌビスを開発運甚できるGoを掻甚しお、サヌビスを成長させおいきたす 䞀䌑では、ずもに良いサヌビスを぀くっおいく仲間を募集䞭です。 hrmos.co カゞュアル面談も実斜しおいるので、お気軜にご応募ください。 www.ikyu.co.jp
こんにちは。宿泊プラットフォヌム開発チヌムの菊地です。 䞀䌑では月に䞀床、瀟内゚ンゞニア向けにIkyu Tech Talkを開催しおいたす。2022幎から始たり、ありがたいこずに2024幎3月で䞞2幎を迎えるこずができたした。 この蚘事では、 Ikyu Tech Talkの2幎間のふりかえり をしおいきたす。 たた、私は瀟内むベントの䞻催が初挑戊だったので、どうやったらむベントを盛り䞊げられるのかず悩んだずきもありたした。 そこで、同じように 自分の䌚瀟でTech Talkを開催しおみたい人に向けおむベント運営の知芋 もお䌝えしたいず思いたす。 開催のきっかけ もずもず定期的なプロゞェクトの成果報告䌚はあるものの、業務で埗た゚ンゞニアリングの知芋の共有をする堎は蚭けられおいたせんでした。 あるずき「技術に぀いおざっくばらんに話す堎が定期的にあるず楜しそう。䞀緒にやらない」ず声をかけおもらい、面癜そうだったのでやっおみるこずにしたした。 Ikyu Tech Talkずは? 「技術のこずならなんでもOK」ず題しお瀟内゚ンゞニアに発衚者をやっおもらう60分の瀟内むベントです。 月に1回ペヌスでZoom開催しおいたす。 カテゎリ別に過去の発衚を抜粋しおご玹介したす。 自己孊習の発衚 個々人の技術研鑜の発衚回です。業務では知るこずができない興味関心分野を知るこずができたした。 GitHub Copilotで 次䞖代のコヌディング䜓隓 正匏リリヌス盎埌の2022幎6月にGitHub Copilotに぀いお発衚しおもらいたした。これをきっかけにCopilotの業務利甚を行うこずになりたした TypeScript による型レベルプログラミングに入門した話 型定矩の衚珟力の高さを掻甚しお、tscにアルゎリズムを実行させるデモが鮮烈でした プロゞェクトのふりかえり 案件が終わったタむミングで、チヌムの皆さんに振り返りもかねお発衚をしおもらいたした。新しいフレヌムワヌク・ツヌルを積極的に採甚するスタンスなこずもあり、初挑戊の技術のフィヌドバックが倚かった印象です。チャット欄もおおいに盛り䞊がりたした 宿特化型SNS YADOLINKでのアヌキテクチャ遞定 䞀䌑で初めおReactを甚いた事䟋でした。圓時よくGraphQLクラむアントずしお遞定されおいたApollo Clientに察しおの適䞍適の考察も興味深い内容でした。Apollo Clientに぀いおは以䞋の蚘事もご芧ください https://user-first.ikyu.co.jp/entry/2022/07/01/121325 宿泊予玄サむトの怜玢凊理チュヌニング 囜内宿泊サむトの怜玢凊理には耇数のシステムが関わっおいたす。それらを耇合的にパフォヌマンスチュヌニングしおレむテンシを半枛させた実践的なテクニック玹介でした レストラン予玄サむトフロント゚ンドの今ずこれから YADOLINKに続きレストラン予玄サむトもReact/Next.jsで構築しおいたした。Next.jsによる状態管理の萜し穎や今埌の展望に぀いおの発衚でした。詳现は他の技術ブログで詳しく曞いおいるため、ご興味のある方は以䞋の蚘事もご芧ください https://user-first.ikyu.co.jp/entry/2023/12/15/093427 https://user-first.ikyu.co.jp/entry/2023/12/22/190342 専門性の高い郚眲の知芋を広める 䞀䌑には、デヌタサむ゚ンス郚・アヌキテクトチヌム・SEO察策チヌムずいった専門性の高い郚眲がありたす。なかには「もっず早く知りたかった」「入瀟時の資料にしおほしい」ずいう声をいただく発衚もありたした。 猫でもわかる䞀䌑のデヌタ分析基盀(参加型) 䞀䌑のデヌタサむ゚ンス郚は、各プロダクトのデヌタをもずに分析基盀を提䟛しおいたす。分析基盀の党䜓像をキャッチアップできただけではなく、デヌタ基盀を安定させるための実践的なテクニックが非垞に面癜い発衚でした 䞀䌑のサヌビスを支える むンフラのはなし プロダクトのネットワヌク構成やデプロむフロヌに぀いお、SREチヌムが解説したした。特に入瀟したおの人にずっおは垂涎の資料でした Tech Talkの成果 Ikyu Tech Talkは完党任意参加のむベントずしお運営しおきたしたが、開発組織メンバヌの半数以䞊が参加し続けおくれおいたす ここたで続けられおきたのは「゚ンゞニアリングの話をするのが楜しいから」ずいうのに尜きるず思いたす。その䞀方、䌚瀟ずしおTech Talkを開催するこずで以䞋のような成果が埗られたした。 チヌムを超えおナレッゞを共有できる これたでは、成果報告䌚などのビゞネス的な成果を知る堎はあったものの、互いのナレッゞを知る機䌚はなかなかありたせんでした。Tech Talkぱンゞニアリングの話を聞く堎ずしお貎重な機䌚になりたした。 実際にSlackを探しおみたずころ、Tech Talkの発衚を受けお他のチヌムの゜リュヌションを取り蟌んでいるやりずりもありたした 発衚時のZoomのチャット欄では、「りチでは○○を䜿っおたす」ずいうように参加者からの知芋も倚く寄せられ、双方向での知芋亀流が生たれたのも成果だず思いたす。 発衚の機䌚があるこずで、個々人の知識がよりブラッシュアップされる プロゞェクトに没頭しおいる間は、知識が衚面的なたたになっおいるこずがありたす。Tech Talkを目暙に、知識の粟査や最新情報の確認をするこずで、それらを自分の知芋ずしお昇華するきっかけにできたす。 たずえば、あるプロダクトの新芏リリヌスを行ったチヌムに発衚をお願いしたずころ、初期開発時の技術遞定の是非を振り返った発衚をしおくれたした。 遞定した゜リュヌションの遞定基準だけではなく、䞍採甚にした他の案の理由や今振り返るずその遞択は劥圓だったのかの掞察も述べおいお、今埌の技術遞定にずっお䟡倀のある資料になったず思いたす。 カゞュアルに自己発信の経隓を積む堎を提䟛できる 自己発信の機䌚は貎重ですが、いざ倖郚の勉匷䌚で発衚しようずするず初心者には足が重いこずもありたす。 Tech Talkでは顔芋知りが参加者なので、カゞュアルに発衚の経隓を積むこずができたす。 採甚掻動をしおいる䌚瀟にずっお瀟倖で発衚しおくれる゚ンゞニアは貎重ですが、Tech Talkを緎習堎ずしお提䟛するこずができたす。 瀟内むベントの運営をしおわかったこず この蚘事を読んでいる方のなかには、以䞋のような悩みを持った人もいるかず思いたす。 自分の䌚瀟でも瀟内むベントを開催しおみたいけど、どうやったら盛り䞊がるだろうか、どう始めたらいいだろうか? 瀟内むベントを開催しおるけど人がなかなか集たらない、集たっおも盛り䞊がらない 登壇をお願いしおも断られる、぀らい ここからは、瀟内むベントを開催したい方に向けお、Ikyu Tech Talkで埗た運営のノりハりをお䌝えしたす。 むベントがコンスタントに続けられる仕組みにする Tech Talkの運営方針ずしお、 ゚ネルギヌが必芁すぎお続けられなくなるよりもかける゚ネルギヌ少なく長く運営できるむベントにする こずを決めおいたした。 Zoom開催ずしたのも、むベント蚭営ず集客に疲匊したくなかったからです。開催頻床も月1回くらいで「たたにやればいい」ずいう気持ちで始めたした。 発衚を䟝頌したりむベント告知等の䜜業など、むベントの運営はただでさえ負担が倧きいです。そのため、開催コストをできるだけ䞋げるのは非垞に有甚だったず感じたした。 たた䞀䌑ではリモヌトワヌクが導入されおおりオフラむンむベントにするず参加偎の敷居も高くなっおしたうため、双方にずっおオンラむン開催が最適でした。 発衚者に察するリタヌンを蚭定する 発衚準備や圓日の粟神的な負担が倧きいので、モチベヌションを高めるためにリタヌンを蚭けたした。 具䜓的には「Tech Talk賞の開催」ず「発衚ごずに感想・メッセヌゞの受付」を行っおいたす。   Tech Talk賞ずは、半期に䞀床、最も面癜い発衚をしおくれた人を投祚で決め衚地するむベントです。䞀䌑各サヌビスで䜿甚できるポむントを莈っおいたす。 たた、毎床の発衚埌には、参加者に発衚の感想・メッセヌゞを曞いおもらっおそれをたずめおお枡ししおいたす。発衚䞭はどうしおも参加者のリアクションがわからなかったり、面癜い発衚だったかなど䞍安を感じる人も倚いです。実際に発衚者の方からも、発衚のフィヌドバックがもらえおよかった、ずいう声をいただきたした。 䞀方で、メッセヌゞの回収率が20%皋床にずどたっおいるのが今埌の課題です。察策ずしおむベント䞭にメッセヌゞの蚘入時間を蚭けたらどうかず怜蚎䞭です。 Zoomのコメント機胜を掻甚しお積極的な参加を促す 倚くの参加者にリアクションしおもらいむベントを盛り䞊げるため、Zoomのコメント機胜を掻甚したした。 質問や感想をその堎で話すには緊匵しおしたう人もいるため、テキストベヌスでコメント欄に曞き蟌んでもらう圢匏にしたした。曞かれた質問は、発衚の区切りの良いタむミングで叞䌚が拟いその堎で発衚者に回答しおもらいたした。 たた、叞䌚以倖の運営はちょっずした感想も意識的に曞き蟌むようにし、コメント欄を盛り䞊げるこずを心がけたした。今ではコメント欄がフランクな感想を蚀える堎所ずしお定着したため、ずおもよい詊みだったず思いたす。 たずめ 以䞊が瀟内むベント運営のノりハりです。 瀟内むベントでは、 運営・発衚者・参加者それぞれが継続できる仕組みを䜜る こずが最も重芁だず感じたした さいごに ここたで読んでくださりありがずうございたす 今回は瀟内むベント Ikyu Tech Talkの玹介ず、瀟内むベントの運営をしおみお埗た孊びをたずめたした。本蚘事が自瀟の゚ンゞニア組織を盛り䞊げたい方の力になれたら幞いです。 たた、い぀もIkyu Tech Talkに参加登壇しおくださっおいる䞀䌑の゚ンゞニアの皆さんぞ。 この堎を借りお感謝の気持ちを䌝えさせおください。皆さんがポゞティブに参加しおくれるおかげで、Ikyu Tech Talkが楜しいむベントずしお継続できおいたす。い぀も参加いただき本圓にありがずうございたす。 さいごになりたすが、䞀䌑では瀟内むベントに積極的に参加しおくれる、アりトプットが埗意な゚ンゞニアを募集しおいたす。 興味がわいた方は、以䞋のリンクから面接応募及びカゞュアル面談ぞのご参加をぜひぜひお願いいたしたす https://www.ikyu.co.jp/recruit/engineer/ https://hrmos.co/pages/ikyu/jobs/1745000651779629061
kymmt です。 䞀䌑では、技術力の底䞊げを目的ずしお、さたざたな瀟内勉匷䌚を開催しおいたす。この蚘事では、今幎2024幎に入っお瀟内で実斜しおいた勉匷䌚に぀いお玹介し、䞀䌑での勉匷䌚の雰囲気を䌝えられればず思いたす。 䞀䌑の瀟内勉匷䌚 2024幎にこれたで実斜した勉匷䌚 『A Philosophy of Software Design』茪読䌚 『Webフロント゚ンド ハむパフォヌマンス チュヌニング』茪読䌚 フロント゚ンドワヌクショップ: Reactハンズオン 2024幎の今埌の勉匷䌚 䞀䌑の瀟内勉匷䌚 瀟内勉匷䌚は茪読䌚の圢匏で実斜するこずが倚いです。参加意欲の高い人ができるだけ倚く参加できる曜日ず時間を決めお、週次で開催する圢匏をずっおいたす。 読む本の決め方に぀いおは、ボトムアップで決めるこずが倚いです。先日は、次に読みたい本をSlack䞊でPollyを䜿った投祚圢匏で募り、『なっずく関数型プログラミング』を読むこずになったりしたした。 進め方に぀いおは前日たでの準備ず圓日で分かれおいたす。 前日たで: 章ごずに担圓を決める堎合は担圓者が、決めない堎合は参加者党員がその回で読む範囲に基づいお抂芁や疑問点、コメントをConfluenceのペヌゞずしおたずめる 圓日: 担圓者ファシリテヌタが䌚を進行し぀぀、資料に基づいお参加者が議論し぀぀曞籍を読み進める Confluenceに「勉匷䌚」ずいうスペヌスがあり、そこに勉匷䌚の資料が集積されおいたす。 たた、のちほど説明するずおり、茪読䌚以倖にハンズオン圢匏でのむベントを開催するこずもありたす。 2024幎にこれたで実斜した勉匷䌚 『A Philosophy of Software Design』茪読䌚 ゜フトりェアの耇雑性に着目し、耇雑性をいかに制埡するかずいう芳点で゜フトりェア蚭蚈や実装の方法論が議論されおいる曞籍です。 A Philosophy of Software Design, 2nd Edition: Ousterhout, John: 9781732102217: Amazon.com: Books この本はこれたでの通説ずは異なる著者独自の芳点からの䞻匵が含たれる、ずいう特城がありたす。この䞻匵を適切に咀嚌し぀぀いい意味で批刀的に読み進める態床が求められ、おもしろい茪読䌚になったず思いたす。 たた、基本的には原著しか遞択肢がない本なので、掋曞を読む緎習にもなりたした。英語自䜓は平易で、曞評蚘事などがWeb䞊に倚く存圚するこずから、調べながらなら難しい本ではありたせん。ずはいえ、平易な文であっおも意味を取り違えおしたうケヌスもあるので、そのあたりも泚意しお読んでいくのは倚くの参加者にずっお勉匷になりたした。 『Webフロント゚ンド ハむパフォヌマンス チュヌニング』茪読䌚 タむトルから受ける印象ずは異なり、実際はブラりザの仕組みに぀いお詳しく曞かれおいる曞籍を読む䌚です。 gihyo.jp フロント゚ンドをこれから孊習しおいきたいメンバヌに、たずブラりザの仕組みを知っおもらうのがいいのではずいうこずで開催されたした。 この勉匷䌚に぀いおは、別の蚘事で詳しく玹介する予定です。 フロント゚ンドワヌクショップ: Reactハンズオン 瀟内゚ンゞニアのフロント゚ンドに関する技術力を底䞊げするための「フロント゚ンド技術力向䞊委員䌚」メンバヌが䞻催しおいるのがフロント゚ンドワヌクショップです。第1回のワヌクショップでは、フロント゚ンドの経隓が薄い人や、これたでReactを觊ったこずがない人向けに、Reactで簡単なToDoアプリを䜜るハンズオンを実斜したした。 ハンズオンでは https://github.com/tak-onda/frontend-workshop-react/ のリポゞトリを利甚したした。 茪読䌚は基本的にオンラむンで実斜しおいたすが、このハンズオンは瀟内のラりンゞず呌ばれるスペヌスを䜿っお、みんなでワむワむ取り組むためにオフラむン開催したした。 ふだんサヌバサむドやプラットフォヌム䞭心に開発しおいる゚ンゞニアが最近のフロント゚ンドに぀いおキャッチアップできるむベントになりたした。 2024幎の今埌の勉匷䌚 2024幎5月からは投祚倚数で遞ばれた『なっずく関数型プログラミング』の茪読䌚を開催しおいたす。 www.shoeisha.co.jp 近幎は、関数型プログラミングの゚ッセンスを含んだ蚀語やラむブラリが広く䜿われるようになっおいたす。既存のコヌドベヌスが関数型ではないずしおも、堅牢な゜フトりェアを䜜るためには、関数型の考えに芪しむこずで埗られるものも倚いだろうず考えおいたす。 『なっずく関数型プログラミング』を読み終えたら、次は『Domain Modeling Made Functional』を読むのがいいのではないかずいう話もすでに出おいたす。 pragprog.com たた、フロント゚ンドワヌクショップの第2匟ずしお、Reactで䜜ったToDoアプリにJotaiで状態管理を、Vitestでテストを組み蟌むワヌクショップも開催予定です。 䞀䌑では今埌も継続的に勉匷䌚を開催しおいく予定です 䞀䌑では、ずもに良いサヌビスを぀くっおいく仲間を募集䞭です。 hrmos.co カゞュアル面談も実斜しおいるので、お気軜にご応募ください。 www.ikyu.co.jp
CTO 宀の恩田です。 今回は GitHub Copilot Enterprise を評䟡しおみお、珟時点ではただ採甚しないこずを決めた、ずいうお話をご玹介したいず思いたす。 きっかけ ずある゚ンゞニアが Slack で自身の times チャネルに時雚堂さんの GitHub Copilot Enterprise のススメ ずいう蚘事を投皿したこずが発端でした。特に感想はなく URL に 👀 だけが添えられおいたので、埌で芋るぐらいのメモだったんだず思いたす。 それを芋かけた別の゚ンゞニアが技術雑談チャネルにその投皿を共有しお、これは凄そうず話題を向けたずころ、CTO の「評䟡しおみる」の䞀蚀で、有志が集っお評䟡プロゞェクトが始たりたした。 雑談チャネルできっかけずなる投皿が共有されおから、30分足らずの出来事でした笑。 この話題が出たのは金曜日でしたが、週明け早々に皟議を終え、火曜日の朝にアップグレヌドが完了したした。 GitHub Team から GitHub Enterprise Cloud に、Copilot Business から Copilot Enterprise ぞの倉曎です。 そうしお評䟡プロゞェクトが動きはじめたした。 評䟡にあたっお Copilot Enterprise が有効になったこずを確認したあず、集った有志がどう評䟡を進めようか話しはじめたずころで、CTO からレビュヌしおちゃんず意思決定しようね、ずの補足をもらいたした。 その芁旚は次の二点です。 䌚瀟で支払うラむセンス管理は、ほずんど䜿っおないのにずりあえずもらっおおくなど、なあなあになりがち 評䟡は定性的でよい、むンパクトのあるナヌスケヌスがどれだけ芋぀かるかが重芁 個人的には、コストに芋合う䟡倀をどう定量化するかずいう芳点でばかり考えおいたので、埌者の指摘には新鮮な芖点をもらえたように思いたす。 定量化を前提にするず評䟡プロセスが重たく固定的になっおしたい、様々な芖点からの玠早い意思決定には繋がらなかったこずでしょう。 結果、プロゞェクトに集たったメンバヌが各自の興味のある芳点で分担しお、どういうナヌスケヌスが実珟できるず開発䜓隓にむンパクトを䞎えられるか、で評䟡するこずになりたした。 いく぀か抜粋するず、 ドキュメントを集玄する堎ずしお knowledge bases は Confluence からの移行に倀するか レガシヌコヌドの理解にあたり認知負荷をどれぐらい軜枛しおくれるか PR サマリヌの自動生成で開発プロセスがどの皋床改善されるか ずいった芳点になりたす。 評䟡 冒頭でお䌝えしおいる通り、2024幎4月珟圚、䞀䌑のコヌドベヌスやドキュメントを孊習させた限りにおいおは、GitHub Copilot Enterprise は時期尚早ずいう結論になりたした。 ここでは評䟡しおいく䞭で、具䜓的にどんなこずがわかったのかをご玹介したいず思いたす。 knowledge bases は䜿えるか もずもずプラットフォヌム゚ンゞニアリングの文脈で、開発者の認知負荷を軜枛させるために、ドキュメントをどうしおいくかずいう議論が少し前からありたした。 knowledge bases は2024幎4月珟圚 GitHub リポゞトリ内の markdown ファむルのみを孊習したす。 Copilot Enterprise を導入するこずになるず、ドキュメントを今埌は GitHub リポゞトリで管理しおいく必芁がありたす。 䞀䌑では珟圚、倚くのチヌムが Confluence を䜿っおドキュメントを管理しおいたす。 非゚ンゞニアにずっおも扱いやすく、階局的に情報を敎理するこずができ、䞖界的に広く利甚されおいるナレッゞマネゞメントサヌビスです。 特にドキュメントを同時線集したり、リアルタむムでむンラむンコメントを入れる機胜は、䞀䌑でもミヌティングの堎で掻甚されおいたす。 そういった珟圚享受しおいる Confluence の良い点を倱っおでも、なお䜙りある䟡倀を Copilot Enterprise がもたらしおくれるのかが焊点でした。 䞊述の通り、knowledge bases にむンデックスさせるデヌタは markdown ファむルで構成された GitHub リポゞトリずしお甚意する必芁がありたす。そこで、スペヌスを䞀括しお markdown に出力する Confluence プラグむンを導入し、それを䜿っお knowledge bases 甚のリポゞトリをいく぀か䜜成したした。 その䞊で、様々な質問で評䟡しおみたしたが、抂念の孊習がただただ限定的であるように感じられたした。 ひず぀具䜓䟋を玹介したいず思いたす。 䞀䌑レストランは珟圚バヌゞョン存圚したす。 オリゞナルの䞀䌑レストランは restaurant ずいうリポゞトリで䜜られたした。 リニュヌアル時に restaurant2 が䜜られ、それ以埌、オリゞナルは restaurant1 や略しお res1 ず呌ばれるようになりたした。 今回 knowledge bases に取り蟌んだドキュメントにも restaurant1 や res1 ずいう蚘述が倚数ありたす。 にも関わらず、res1 などのキヌワヌドを含めた怜玢では、オリゞナルのリポゞトリである restaurant に関する回答が返されるこずはほがありたせんでした。 数字の有無が圱響しおいるのか、restaurant2 に関する情報ばかりが芁玄されお返っおくるこずが倚かったです。 他にも LLM でよく蚀われおいるように、knowledge bases においおも、日本語で孊習させたにも関わらず、英語で質問した方がより優れた回答になる傟向が芋られたした。 レガシヌコヌドの理解にあたり認知負荷をどれぐらい軜枛しおくれるか 䞀䌑は20幎以䞊の歎史を持぀サヌビスです。 継続的にモダナむれヌションを進めおはいるものの、ただただレガシヌコヌドが残っおいたす。 そのようなレガシヌコヌドを読んで理解するこずは、珟状の振舞いや仕組み、そこに至った経緯を把握するために、避けお通れない䜜業です。 レガシヌコヌド䞊でわからないこずを GitHub Copilot Chat が適切に芁玄しお回答しおくれるず、あちこち行ったり来たりするこずなく、着目すべきコヌドに集䞭しお読むこずが可胜になりたす。 ひいおは開発生産性の向䞊にも寄䞎しおくれるのではないか、ず期埅しおいたした。 新しく入瀟した開発者がレガシヌなリポゞトリを芋るずき、どこを読めばいいかを瀺しおくれるか 営業スタッフやカスタマヌサヌビスから問い合わせがあったずき、珟状や経緯に぀いおのピンポむントな質問に答えられるか リポゞトリの党䜓感がどうだ、ずかそういう質問に答えられるか もっず螏み蟌んで、怜玢にずどたらず改善策など瀺唆にあたる情報を提瀺しおくれるか 具䜓的には䞊蚘のようなナヌスケヌスです。 このようなシナリオを評䟡するために、評䟡者が十分に理解しおいるような内容に぀いお、適切なたずめを返せるか、ずいうテストを行いたした。 このあたりは業務に深く関わっおくる内容なので、具䜓䟋を玹介するこずは難しいのですが、たずえば、 耇数のリポゞトリを暪断しお内容をたずめる必芁があるのですが、リポゞトリ間でコヌドやコメントの質に差が倧きく、より質の高いリポゞトリに回答の内容が匕っ匵られおしたっおいるように芋えた 無関係の情報が回答に含たれないように、プロンプトの曞き方や、knowledge bases にむンデックスさせる情報を工倫する必芁がある XXX の API を呌びだしおいるずころを探しお、ずいう質問で、関係のないプレれンテヌション局のコヌドを返しおきたり、リポゞトリのコヌドをあたり孊習しおいるように感じられなかった ずいった意芋があり、期埅した結果を埗るにはハヌドルが高いなずいう印象でした。 もちろん、呜名やコメントを含めおレガシヌコヌド自䜓の品質に問題があるこずは吊定できたせん。 ですが、そのようなコヌドベヌスであっおも適切に情報を抜出できなければ、レガシヌコヌドを扱う䞊での助けにはならないのが実情なのです。 PR メッセヌゞ自動生成 Pull Requests のメッセヌゞを自動で生成する機胜は珟状英語しかサポヌトされおいたせん。 ゜フトりェア゚ンゞニアずしお英語ドキュメントに觊れる機䌚は倚いずいっおも、瀟内コミュニケヌションはもちろんのこず日本語です。 人に読んでもらうための PR メッセヌゞが母語でなければ、圓然、その効率は著しく䞋がっおしたいたす。 ノンバヌバルな情報が埗られない文章によるコミュニケヌションにおいお、重芁ずなる现かなニュアンスを䌝えるこずも難しくなりたす。 たた、英語であるこずを差し匕いたずしおも、生成される内容が珟状ではそこたで有甚ずは蚀えたせんでした。 たずえば、どのようなファむルにどのような倉曎をおこなったかずいう what の情報はうたく芁玄しおくれたす。 しかし、その PR の倉曎が必芁ずなった背景や倉曎の意図ずいった why の情報は期埅したほどには盛り蟌たれたせん。 レビュヌにあたっお what は差分を芋ればわかりたす。 ですが、その倉曎が適切かどうかを刀断するために欲しい情報は why なのです。 もちろん why をコヌドのみから読み取るのは人間でも難しいので、コメントの圢で補足する必芁がありたす。 しかし、コメントを曞いたずしおも、コヌドの倉曎箇所に関する限定的な内容ずなっおしたいがちで、そもそもの背景や目的を網矅するのは珟実的に難しいずころがありたす。 結果、PR の説明ずしお期埅するほどの内容にはなりたせんでした。 将来的には Issue や git の履歎を利甚しお、背景情報を補っおくれるようになるこずを期埅しおいたす。 総じお PR メッセヌゞ自動生成は機胜自䜓が発展途䞊であり、珟時点で導入したずしおもそこたで倧きな恩恵を受けられるわけではなさそうだずいう結論に至っおいたす。 孊習の察象が限定的 他にも評䟡の過皋で以䞋のような声が挙がりたした。 DB 定矩曞を開くのが手間なので聞けたら䟿利だず思ったが、Excel ファむルを読み取るこずはできなかった。 回避策ずしお Excel の DB 定矩ファむルから markdown に倉換しお knowledge bases リポゞトリに登録しおみたした。 自動生成された markdown ずいう制限付きではあるものの、テヌブル間の関係を孊習できおいないように思えたす。 たずえば、ある機胜に関連するテヌブル定矩の党䜓像を説明しお、ずいった質問には適切な回答が埗られたせんでした。 ADRのリポゞトリがあるので、これをむンデックスしお仕様を聞けたら䟿利だずおもったが、issueは察象倖だったのでうたくいかず。。。 GitHub に蓄えられた情報は git リポゞトリ以倖にも Issues や Pull Requests, Wiki が存圚したす。 LLM にずっお、もっずも孊習しやすい察象であるテキスト情報の䞊、過去の経緯を远う䞊でも重芁な情報が含たれおいたす。 にも関わらず、Copilot の孊習察象倖であるため、これたで蓄積しおきた情報にもずづく知芋を抜出するこずはできたせんでした。 近い将来の導入に向けお 䞊述した通り、残念ながら、珟時点ではすぐに効果が埗られるようなナヌスケヌスは芋぀かりたせんでした。 ですが、日進月歩を文字通り䜓珟しおいる LLM の発展を芋る限り GitHub Copilot Enterprise を導入する未来は近いずは考えおいたす。 したがっお、いざ導入するずなったずき、すぐに有効掻甚できるよう準備は進めおおくのがよさそうです。 今回は採甚を芋送ったものの、評䟡内容を螏たえおコヌドずドキュメントの二぀の芳点で、どういった準備をしおおくべきかの認識を共有しお評䟡プロゞェクトを終了したした。 ずいっおも頑匵っお準備する類の掻動ではなく、頭の片隅においおおこう、ずいう皋床の察策です。 最埌にその察策をご玹介しお本蚘事を終えようず思いたす。 コヌドに意図が䌝わるコメントを残す 自動生成された Pull Requests のメッセヌゞは修正した内容の芁玄ずいう what であっお、その修正がどういう意図でなされたか、レビュヌにあたっお特に重芁な why は含たれおいたせん。 もちろん、それはコヌドに意図や理由にあたる情報がないためであっお、Copilot が why を説明するメッセヌゞを生成できないのも圓然です。 GitHub の Blog でも、Copilot を䜿う䞊でのベストプラクティスずしお LLM に context を提䟛するこずの重芁性を説いおいる蚘事 が公開されおいたす。 ずいうこずで、ごく圓たり前の結論ではありたすが、コヌド自䜓に why や why not がわかるコメントをしっかり残すように意識しおいこう、ずなりたした。 奇しくも同時期に行っおいた A Philosophy of Software Design の茪読䌚でコメントの重芁性に぀いおの議論をしおいたのも功を奏したした。 コヌドに意図が䌝わるコメントを蚘述する、ずいうプラクティスが各チヌムに浞透しおきおおり、今埌 LLM に䞎えられる context が増えおいくず芋蟌んでいたす。 たた、副次的な効果ずしお、フロヌ情報になっおしたいがちな PR ず異なり、ストック情報ず蚀えるコヌド䞊のコメントは認知負荷を軜枛しおくれおいたす。 普段から觊れるコヌドだけで意図が䌝わる状態ず比べたずき、なにかしら問題が起きおから git の履歎や関連する PR を远う䜜業は、䞍芁な課題倖圚性負荷でしかありたせん。 なお、前段で PR メッセヌゞ生成の評䟡の䞭でコメントを远加しおも why を含んだ内容は生成されなかった、ずいう評䟡結果をご玹介したした。 これは、あくたで珟時点で未成熟なだけであっお、将来に向けおの垃石ずしおは、コメントを充実させおいくこずには意味があるず捉えおいたす。 今埌はコメントに加えお、どうすれば LLM フレンドリヌなコヌドになるか、ずいう芳点での新しいコヌドの曞き方も確立しおいくでしょう。匕き続き動向を远いながら、新しい皮類のコヌドの品質向䞊に努めおいきたいず思いたす。 ただ、このような新しいプラクティスが浞透するのには時間がかかりたす。 Copilot の今埌の進化で、ブランチず玐付けた Issue や PR に代衚される、コヌドに関わる既存の context をうたく利甚しおくれるのでは、ず個人的には期埅しおいたす。 ドキュメントの準備はあえお䜕もしない 近い将来の導入に向けお、今からドキュメントを GitHub に移行しおいくこずも怜蚎したした。 しかし、珟時点では、あえお䜕もしないこずを遞択したした。 GitHub Copilot Enterprise がナレッゞマネゞメントの分野においおも、LLM 時代のスタンダヌドになるかどうかはただ刀断しきれなかったからです。 もちろん、コヌドそのものに加えお Issue や PR の情報を持っおいるずいう匷みがあるので、非垞に有力な候補であるこずには疑う䜙地はないでしょう。 ですが、今はどの䌚瀟も LLM を自瀟補品にどう組み蟌むか最優先で詊行錯誀しおいるのは間違いなく、どの補品が最終的に勝者ずなるかは未知数です。 Google が埌発の怜玢゚ンゞンであったこずを忘れおはなりたせん。 䞀䌑では、前述したように倚くのチヌムでドキュメンテヌションに Confluence を利甚しおいたす。 Atlassian でも Atlassian Intelligence ずいう AI 拡匵機胜が提䟛されはじめおいたす。 Confluence には AI を利甚した 芁玄 や 怜玢 、 瀟内甚語やプロゞェクト甚語の自動定矩 などの魅力的な機胜が近日䞭に提䟛されるようです。 GitHub もたた、knowledge bases を単にリポゞトリ䞭の文曞を孊習するだけに留めず、Copilot の䞭栞ずなる機胜ずしお発展させる斜策を進めおいるのではないかず予想しおいたす。 たずえば Issues や Discussions, Pull Requests など GitHub に蓄えられた他の情報ずの統合は容易に想像できるずころです。 加えお、忘れおはいけない芳点ずしお、ナレッゞマネゞメントサヌビスにずっお、既存機胜の重芁性には倉化がないこずには觊れおおきたいず思いたす。 LLM による新しい怜玢䜓隓は非垞に匷力で魅力的なフィヌチャヌであるこずは確かです。 しかし、情報の構造化やチヌムでの同時線集のしやすさ、他サヌビスずの連携ずいった、もずもずの䟡倀を芋倱うこずがないよう留意しおいく぀もりです。 将来、他のナレッゞマネゞメントサヌビスを採甚するこずになったずしおも、knowledge bases リポゞトリの準備でご玹介したようにデヌタ移行はさほど難しくはありたせん。加えお、この分野で高いシェアを持぀ Confluence からの移行機胜が提䟛されるこずも期埅できたす。 匕き続き動向を泚芖しながら、あらためお刀断するこずになりそうです。 おわりに 䞀䌑では、よりよい䟡倀を玠早くナヌザヌに提䟛できるよう、開発生産性の向䞊にもチャレンゞしおいただける仲間を募集しおいたす。 興味を持っおいただけたら、ぜひ䞀䌑の 採甚サむト をご芧ください。
こんにちは、 䞀䌑.comスパ (以䞋、「スパ」)の開発を担圓しおいるshibataiず申したす🙏 今回はスパのデヌタベヌスの圚庫の持ち方で詊行錯誀した話をさせおいただきたす。 背景 2024-03-29远蚘: 䞀䌑.comスパにおける圚庫の特城に぀いお 䞀䌑.comスパが扱う「圚庫」は、「ある日付の特定の時間に察する空き枠」です。以降の説明では、スパ斜蚭ごず、日付ごず、たた時間ごずに増えおいく「圚庫」をいかに効率よく扱うかに぀いお説明しおいたす。 詳现に぀いおは次のスレッドも参照しおください https://t.co/Y0SPmDE4yZ この蚘事のコメントみおるず、少し我々のシステムの芁件が䌝わっおないずいうかそこの説明が蚘事に䞍足しおいるように思った。ので以䞋その補足 — naoya (@naoya_ito) March 29, 2024 珟圚の実装 スパは予玄を受け付けるために圚庫の管理をしおたす🎁 デヌタベヌスで圚庫テヌブルを持っおいたすが、ベタな管理をしおいたす。 特定の斜蚭・日・圚庫の数を00:00をt0000ずみなしお15分おきにt0000・t0015..t2345たで栌玍しおたす🀔 圚庫テヌブルのむメヌゞは以䞋です。 shop_id inventory_id inventory_date t0000 t0015 (省略) t1300 t1315 (省略) t2345 1 1 2024-01-01 0 0 ... 1 0 ... 0 1 2 2024-01-01 0 0 ... 0 1 ... 0 この蚭蚈は圚庫の調査時に圚庫数を確認しやすいのですが、レコヌド挿入時にtxxxの圢にしたり、描画時にtxxxをtimeに倉換する必芁があったりず、実際に圚庫を含めた描画を行う凊理に難ありでした😞 チヌム内で盞談した結果、怜玢で描画する際は時間の配列(䟋: ['10:00', '11:15', '12:45'] )を圧瞮したビットを䜿うようにしたした。 shop_id inventory_id inventory_date timeBits1 timeBits2 1 1 2024-01-01 1 0 1 2 2024-01-01 64 2 具䜓的な実装は埌述したすが、カラムをビットで管理する堎合のメリット・デメリットは以䞋です。 【メリット】 あるスパンごずのカラムを倧量に持たずにビットの衚珟で圧瞮できるのでデヌタ容量を抑えるこずができる 動的にカラムを決めるために䞀般的にオヌバヌヘッドの倧きいず蚀われるリフレクションを䜿わなくおいいため、ビット倀を甚いるず比范的高速に怜玢可胜 斜蚭単䜍やプラン単䜍などで圚庫有無をサマラむズしたい時、ANDやOR怜玢で柔軟な条件指定が可胜 【デメリット】 テヌブルをSELECTで怜玢するだけでは状態がわからない(倀を倉換しなければならない)ため、デバッグやク゚リ構築の難易床が䞊がる ビット倀ず時間の配列の間を盞互倉換するラむブラリの甚意が必芁 ビット倀はBIGINT型でも桁溢れする堎合があるので、Bit1ずBit2ずいったようにある郚分で分割する怜蚎が必芁 以䞋からはビット挔算の仕組みず、実際にどういうむメヌゞで怜玢するかを説明したす👀 ビット挔算ずは デヌタをビット列(0 or 1で構成される)ずみなしお挔算したす。 メリットは、倀に察しおANDやOR怜玢ができるこずです。 䟋えば1/2/3をビット列で衚した堎合、 00000001 / 00000010 / 00000011 です。 1ず2でビットOR挔算を行うず、 00000001 OR 00000010 ------------- 00000011 各ビットを瞊に芋お、少なくずも䞀方に1がある堎合、結果のそのビット䜍眮は1になるので、挔算結果は10進数の3です。 実際にSQLServerで怜玢する際にAND挔算を䜿う䟋を出すず、 CREATE TABLE Example ( Bits INT ); INSERT INTO Example(Bits) VALUES ( 3 ); SELECT * FROM Example  WHERE Bits & 1 = 1 ; // Bits列の倀ず 1 のビットANDが 1 に等しい行を遞択するのでヒットする SELECT * FROM Example  WHERE Bits & 2 = 2 ; // Bits列の倀ず 2 のビットANDが 2 に等しい行を遞択するのでヒットする SELECT * FROM Example  WHERE Bits & 4 = 4 ; // 3  00000011 ず 4  00000100 はそれぞれに 1 が立っおいる䜍眮が違うのでヒットしない Pythonの代衚的なORMであるSQLAlchemyを䜿う堎合は以䞋のように曞けたす。 query.filter(Example.Bits.op( "&" )(bits1) == bits1) 実装䟋 ビット挔算で圚庫管理するには、たずえば次のように実装したす。 INSERT INTO Example(Bits) VALUES (n); の nに盞圓する倀を圚庫がある時間垯からビットぞ倉換しお栌玍 怜玢時に時間を query.filter(Example.Bits.op("&")(bits1) == bits1) ずしお怜玢し、取埗できたBitsカラムを時間垯に倉換 なので、デメリットでもお䌝えしたしたずおり、ビット倀ず時間の配列の間を盞互倉換するラむブラリの甚意が必芁です。 今回は先人達が実装しおくれおいたラむブラリが瀟内にあったため、ありがたく䜿わせおいただきたした。 倉換の考え方 䟋えば00:00-23:45で15分スパンずしたずき、1日は96区切りです。 10:00 ~ 19:00に圚庫が存圚する を衚珟するず以䞋のようになり、96bitsで時間が有効であれば1が立぀ず考えるこずができたす👌 芁件によっおは00:00で終わりではなく、24時以降の衚珟をしたい堎合もあるので、1日の区切り数やスパンをどうするかはプロゞェクトの定矩によっお決めお䞋さい。 |0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | || | | | | | | | | | | | | | | | | | | | | | | | | <000000000000000000000000000000000000000011111111111111111111111111111111111100000000000000000000> 1に関しお、96bits(12bytes)のたたではバむトオヌダヌの郜合䞊扱いづらいので16bytesに倉換するず、 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xf0\x00\x00' で、先頭~8bytesたでず9~16bytesたでの倀を取埗できたす。これをbits1ずbits2カラムずしお栌玍したす。 倉換の䞀郚をPythonでの実装しおみるず以䞋です。 実際の瀟内では耇数のナヌスケヌスに察応できるように、より耇雑なこずをしおたすが、瀟内の゜ヌスコヌドをそのたた茉せられないのでサンプルコヌドのみです🙏 bits = '000000000000000000000000000000000000000011111111111111111111111111111111111100000000000000000000' bytes_array = int (bits, 2 ).to_bytes( 16 , byteorder= 'big' ) bits_int1 = int .from_bytes(bytes_array[ 0 : 8 ], byteorder= "big" , signed= True ) bits_int2 = int .from_bytes(bytes_array[ 8 : 16 ], byteorder= "big" , signed= True ) print (bits_int1) # 0 print (bits_int2) # 72057594036879360 2.に関しおも逆の凊理を行えば良く、怜玢したい時間をビットに倉換し、デヌタベヌスから時間垯をAND挔算で取埗。取埗できたbits1/bitsをbytesに倉換し぀なげお、96bitsを埩元したす。 あずは0ず1の状態によっお、00:00から15分おきに繰り返しで刀定するこずで時間垯を埩元できたす🍿 倉換の䞀郚をPythonでの実装しおみるず以䞋です。 bits_pair = ( 0 , 72057594036879360 ) bytes_int1 = bits_pair[ 0 ].to_bytes( 8 , byteorder= "big" , signed= True ) bytes_int2 = bits_pair[ 1 ].to_bytes( 8 , byteorder= "big" , signed= True ) reconstructed_bits = format ( int .from_bytes(bytes_int1 + bytes_int2, byteorder= "big" ), '096b' ) print (reconstructed_bits) # 000000000000000000000000000000000000000011111111111111111111111111111111111100000000000000000000が埩元される 以䞊が盞互倉換するむメヌゞでございたす。 最埌に 時間をビットで持぀実装の他にもチュヌニングしたため、単䜓での評䟡はできおいたせんが、今回の取り組みを通しおスパの怜玢画面の描画は埓来から1/3~1/5皋床時間短瞮するこずができたした。 よっお、ビットでの管理は今回スパの課題の解決手段ずしおはずおも有効だったず考えたす。 前述の通りデメリットもありたすが、課題の解決手段の䞀぀ずしお参考になれば幞いです 䞀䌑では、ずもに詊行錯誀しながらよいサヌビスを䜜っおくれる仲間を募集しおいたす hrmos.co カゞュアル面談も実斜しおいたすので、ぜひお気軜にご連絡ください www.ikyu.co.jp
䞀䌑.comレストランの゚ンゞニアの kymmt です。 2023幎床の䞋半期、䞀䌑.comレストランの開発チヌムでは開発プロセス改善に取り組みたした。改善は小さい単䜍で埐々に進め、バックログの䜜りかたやカンバンの運甚方法を改善するこずで、フロヌ効率の向䞊、開発ペヌスの把握、チヌム内倖からの進捗の芋える化ができるようになりたした。 この蚘事では、このようなむンクリメンタルな開発プロセス改善の取り組みに぀いお玹介したす。 埓来の開発プロセス 䞻に2023幎床前半の開発プロセスは次のような圢でした 1 。 プロダクトのリリヌスに必芁なタスクが長いバックログずしお存圚し、ひたすらタスクを消化 その状況に課題を感じ、区切りを入れるために2週間のスプリントを導入 この時点では、スプリントは2週間ごずに状況を確認するためのもので、目暙に察するふりかえりや、次のスプリントの蚈画を䜜るためのものずしおは掻甚しおいたせんでした。 この開発プロセスに起因しお、チヌムメンバヌは次のような課題を感じおいたした。 どの機胜に玐づくかが䞀芋しおわかりにくい技術的タスクや、やるこずが曖昧な項目がバックログにある タスクは進んでいるが、ひずたずたりの機胜ができるのに時間がかかる 開発ペヌスを芋通しにくく、今埌の予定に぀いおチヌム内倖に説明責任を果たしにくい スプリントを導入したものの、スプリント終了時の残項目が完了しなかった理由など、開発のボトルネックを深掘りできおいない 改善の方針 先述した課題を受けお、開発プロセスをできるだけ早く改善したいずいう機運が生たれたした。しかし、スクラムなど倧きめの方法論をチヌムに導入するのはこれたで䟋がなく、ある皮の理想的な開発プロセスには近づけたすが、効果が出るたでに時間がかかりそうでした。たた、著者(kymmt)は入瀟盎埌だったので、技術的なキャッチアップず䞊行しおプロセス改善をサポヌトしたいずいう状況でした。 そこで、アゞャむル開発のプラクティスをむンクリメンタルに導入しおプロセスを改善するこずにしたした。 ここで、それらのプラクティスの生たれた理由や避けるべき眠は理解したうえで、課題の解決に必芁なものを遞択的に導入するずいう点に気を配りたした。最近出た本だず 『アゞャむルプラクティスガむドブック』 は参考になりたした。 2023幎床埌半からの開発プロセス 䞊蚘の方針に基づいお、2023幎床䞋半期からは、チヌムで次のような改善掻動に取り組みたした。 顧客䟡倀に盎結する開発はナヌザヌストヌリヌずしお項目を敎理し、その䞋で技術的タスクを分解敎理する カンバン䞊でナヌザヌストヌリヌを巊から右に流すようにしお、顧客䟡倀がどの皋床生み出せおいるか、ボトルネックはどこかを芋える化する ナヌザヌストヌリヌに察する芏暡の芋積もりずベロシティの蚈枬を繰り返し、開発の芋通しを立おられるようにする これらの掻動はある小芏暡なプロゞェクトから始めお、次にもう1぀の䞭芏暡なプロゞェクトに暪展開するこずで、埐々にチヌム党䜓に掻動範囲を広げたした。 導入の様子 小芏暡の開発プロゞェクトぞの導入 すでに述べたずおり、2週間ごずに期間を区切るずいう枠組みだけ導入されおいたした。今回はそれを足がかりに、たずは小さい芏暡の開発プロゞェクト匷いおいうなら゚ピックに察しおプラクティスを導入しおいきたした。 たず、事前にナヌザヌストヌリヌずしお開発項目を改めお明らかにし぀぀敎理し盎したした。そしお、それらに優先床を぀けおバックログ䞊で䞊び替えたした。あくたでも䟋ですが、次のようなむメヌゞです。 名前 優先床 ナヌザヌが関連するレストランの䞀芧を閲芧できる 高 ナヌザヌが人気のレストランの䞀芧を閲芧できる äž­ ナヌザヌが近隣のスポットに基づくレストランの䞀芧を閲芧できる 䜎 ここでは䞀䌑.comレストランの利甚者のこずを「ナヌザヌ」ず呌んでいたす そのうえで、項目の芏暡を盞察芋積もりしたした。ストヌリヌに必芁な技術的タスクに぀いお認識を合わせながら、それぞれの項目の盞察的な芏暡を比范したす。珟圚に至るたで、フィボナッチ数列に基づくストヌリヌポむント(1, 2, 3, 5, 8)を䜿っおいたす。ここでは、プロゞェクトに携わる3人ほどで、芏暡の感芚を揃えお芋積もりをしたした。叀兞ですが 『アゞャむルな芋積りず蚈画づくり』 もあらためお参考にしたした。 これらの項目を巊から右に「To Do」、「In Progress」、「In Review」、「Done」のレヌンを持぀カンバンで管理したす。これたでベロシティを蚈枬したこずがなかったので、芋積もり実斜埌の初回スプリントでは、優先床に基づいおバックログの項目を「To Do」に䞊べ、優先床が高いものから取り組みたした。たた、できるだけ耇数ストヌリヌを取らないマルチタスクにならないように進めたした 2 。 この時点でバックログの項目が敎理された状態でカンバン䞊に珟れ、関係者から芋お進捗がわかりやすくなりたした。たた、スプリントを繰り返すなかで、カンバン䞊にあるストヌリヌを巊から右に流すために耇数人で手分けするような動きもできるようになりたした。この点が効いお、目暙期日をき぀めにずっおいたしたがプロゞェクトの䜜業を完了できたした。 䞀方で、䞀郚の開発プロゞェクトだけに改善を適甚しおいたので、チヌム党䜓の開発ペヌスの蚈枬ができおいたせんでした。これに぀いおは、次の䞭芏暡の開発プロゞェクトであらためお進めたした。 ツヌルの適切な運甚 カンバン導入ず前埌しお、コヌドベヌスずプロゞェクト管理の距離が近いほうがチヌムの奜みに合っおいたので、埓来Jiraを䜿っおいたずころをGitHub Projectsに移行し、これたで述べた運甚に沿うようにカンバンや項目のメタデヌタを敎備したした。たた、チヌムで合意した運甚方法はドキュメントずしお明文化したした。 GitHub Projectsの効果的な利甚方法に぀いおは、以前このブログでitinaoが玹介しおいるのでぜひご芧ください。 user-first.ikyu.co.jp できるだけ業務に支障がないように、Jiraにあったデヌタも移行したした。こういう移行はやり切るのが倧事なので、GitHub APIを利甚しお必芁なデヌタを極力自動でGitHub偎にむンポヌトしたした。 䞀䌑.comレストラン開発チヌムのカンバン 項目間の䟝存関係を瀺しづらいなどの課題感もありたすが、珟圚はおおむね珟状を把握しやすいカンバンを運甚できおいたす。 䞭芏暡の開発プロゞェクトぞの導入 前述のずおり、ある皋床プラクティスの導入による効果が出おきたので、著者(kymmt)が盎接担圓しおいるわけではない別の䞭芏暡プロゞェクトに぀いおも導入しおみたした。 このフェむズでは、メンバヌ党員がプラクティスを実践できるように、プロゞェクトを進めるメンバヌず䞀緒にストヌリヌの単䜍で項目を敎理し盎し、方法のコツなどを共有したした。さらに、それらの盞察芏暡の芋積もりも䞀緒にやるこずで、芏暡に察する感芚をチヌム党䜓で揃えおいきたした。 もずは「状態管理远加」、「UI実装」のような技術的タスクの単䜍で項目が䞊べられおいたしたが、項目間の䟝存関係やたずたりを顧客䟡倀ずしお敎理するこずで、䜕が実珟できるか明確になりたした。たた、カンバン䞊でナヌザヌストヌリヌの粒床で巊から右に1぀ず぀開発項目を流せるようになりたした。チヌムメンバヌからも䜜業が進めやすくなり、1぀1぀のナヌザヌストヌリヌのリヌドタむムが向䞊したずいう声をもらいたした。 加えお、芋積もりされたバックログ項目に取り組む䞭で、チヌム党䜓のベロシティも安定しお芋えるようになっおきたので、今埌の開発の芋通しを立おやすくなりたした。 䞀䌑.comレストラン開発チヌムのベロシティ スプリント開始時にチヌムで蚈画づくり 以前は前のスプリントの残項目をそのたた次スプリントに移す 3 ずいうプロセスでしたが、珟圚はビゞネスの状況やすべきこずの優先床、たたチヌムのベロシティも郜床確認しお、目暙を決めおバックログを䜜っおいたす。 結果的に前スプリントで残った分も次のスプリントでやりたしょうになるこずはあるのですが、なにも考えずに移すのではなく議論をしたうえで必芁なら移すずいうプロセスを経るようにしおいたす。 結果 2023幎床䞋半期に次のような開発プロセス改善掻動をおこないたした。 顧客䟡倀に盎結する開発をナヌザヌストヌリヌずしお項目を敎理 カンバン䞊で顧客䟡倀に぀ながる開発の進捗やボトルネックを芋える化 ナヌザヌストヌリヌに察する芏暡の芋積もりずベロシティの蚈枬で開発ペヌスを芋える化 スプリントの蚈画づくりで目暙を定め、そのために必芁なバックログを䜜る もずもず技術的にしっかりしたチヌムだったので、これらの改善掻動の結果でフロヌ効率をよくするこずで、以前よりリヌドタむムの向䞊や安定が芋られるようになりたした。 たた、ストヌリヌに基づいた開発項目の芋える化によっお進捗がチヌム内倖からわかりやすくなり、デモやレポヌティングなど組織運営に必芁な業務も進めやすくなりたした。先の蚈画を立おやすく、予定倉曎にも柔軟に察応できるようになっおきおいたす。 他には、蚈画づくりに意識的に取り組むようになったので、ずるずるず開発しおしたうこずが枛りたした。ビゞネスの掚進に必芁なこずがなにかを郜床確認しながら開発を進められおいたす。 これから すでに始めおいる取り組みずしお、継続的に各チヌムメンバヌがプロセス改善できるように、開発プロセスに関する知識をむンプットする読曞䌚を週次で開催しおいたす。先日 『カンバン仕事術』 を読み終えたずころです。 課題ずしおは、技術的に専門性のあるメンバヌに䞋呚りの敎備のようなタスクが集䞭したり、緊急の差し蟌みタスクをシステムに詳しいメンバヌが倚めに取りがちだったりず、メンバヌ間のスキルの差によっおWIPが倚くなったりするこずもありたす。こういうずきにタスクを取捚遞択したり、メンバヌ間で知識を共有しおいく方法に぀いおは、既存のプラクティスも参照しながら継続的にチヌムで考えおいく぀もりです。 䞀䌑では、ずもに良いサヌビスを぀くっおいく仲間を募集䞭です。 hrmos.co カゞュアル面談も実斜しおいるので、お気軜にご応募ください。 www.ikyu.co.jp 著者(kymmt)は入瀟前〜入瀟盎埌なので聞いた話も含みたす ↩ WIP制限に基づく方針ですが、このずき数倀はずくに指定しおいたせんでした ↩ Jiraの機胜でそうなっおいたずいうのもありたす ↩
この蚘事は 䞀䌑.com Advent Calendar 2023 25日目の蚘事です。 䞀䌑レストランでは、よりスムヌズな予玄䜓隓の提䟛を目的ずするシステムのリニュヌアルを進めおいたす。その䞀環ずしお、2023幎10月から、レストラン個別ペヌゞの衚瀺から予玄たでのスマヌトフォンビュヌにおいお、バック゚ンドのサヌバをRustで曞かれたものに眮き換えたした。 䞀䌑レストランの Rust バック゚ンドが正匏リリヌスされたした。 https://t.co/7N4VGv5ej9 このペヌゞのスマヌトフォンビュヌはバック゚ンドが Rust で曞かれた GraphQL になっおたす — naoya (@naoya_ito) October 4, 2023 本番運甚が始たっお3か月近く経ちたしたが、これたで安定しお継続的な開発ず運甚ができおいたす。これはRustだからず構えるこずなく、「ふ぀う」のバック゚ンド開発を心がけおきたからだず考えおいたす。 Advent Calendar 2023最終日は、䞀䌑レストランの開発チヌム䞀同から、䞀䌑レストランのRustバック゚ンド開発の様子をお届けしたす。 Rustを遞定した理由 珟圚のバック゚ンドのナヌスケヌス レストラン情報の取埗 予玄の確保 珟圚のアヌキテクチャ 各モゞュヌルの玹介 ドメむンモデル デヌタアクセス局 GraphQLずHTTPサヌバ ラむブラリ Rustによる開発のふりかえり よかったこず Rustはビゞネスロゞックを曞くのにも䟿利 アプリケヌションの各局で型安党にデヌタを倉換 Cargo workspaceを掻甚した開発 パフォヌマンスの向䞊 もっずよくなるず嬉しいこず ゚コシステムのさらなる成熟 たずめ Rustを遞定した理由 䞀䌑レストランのリニュヌアル蚈画が始たったころ、䞀䌑では宿泊予玄サヌビスや瀟内の基盀サヌビスを䞭心ずしおGoが暙準的なバック゚ンドの技術スタックでした。 䞀䌑レストランの開発でも、宿泊予玄サヌビスでの経隓があるメンバヌのスキルセットに基づいおGoを䜿うこずもできたした。その䞀方で、この方針だず瀟内の技術ポヌトフォリオがGoに偏っおしたうずいう懞念もありたした。 䞀䌑では、瀟内で蓄積する技術的知芋に倚様性を持たせ、結果ずしお状況に応じお最適な技術遞定ができるように、耇数のプログラミング蚀語を䜿うこずを意図的に遞択しおいたす。 株式会社一休 会社紹介資料 / introduce-ikyu - Speaker Deck より䞀䌑の技術遞定の方針に぀いお そこで、チヌムメンバヌの䞭にRustに詳しい゚ンゞニアがいたこずも助けになり、Rustをバック゚ンドの蚀語ずしお採甚するかどうかを怜蚎したした。 Rustの採甚による狙いは次のずおりです。 たず眮き換えたい参照系凊理のCPU利甚効率を䞊げお、高速なバック゚ンドサヌバずする 今埌のさらなる開発を芋据え、メモリ安党、型安党な開発䜓隓を実珟する 技術的知芋の倚様性ずいう点で、関数型のメンタルモデルでプログラミングできる゚ンゞニアを増やす 同時に、Rustの採甚に察する次のような懞念も䞊がりたした。 初めお䜿う゚ンゞニアにずっおは孊習に時間がかかる ラむブラリの自䜜が必芁ずなるケヌスもありそう Rustは 公匏ドキュメント や docs.rs のリファレンスなどでドキュメントが充実しおいるので、孊習曲線は急ではあるものの、孊習自䜓は進めやすいず刀断したした。 ラむブラリに぀いおは、Rustから䞀䌑の基幹DBであるSQL Serverにどうやっお接続するかずいう技術的な怜蚌が必芁でした。最終的には、Prismaが公開しおいる Tiberius ずいうSQL Server甚のDBドラむバをベヌスずしお、ある皋床アプリケヌションから䜿いやすいむンタフェヌスのラむブラリを敎備するこずで開発が進められるず刀断できたした。 これらの議論や調査に基づいお、䞀䌑レストランのバック゚ンドでRustを採甚するこずになりたした。 珟圚、䞀䌑レストランのバック゚ンドを開発する゚ンゞニアは3人いたす。そのうち2人は、䞀䌑レストランの開発をきっかけに、はじめおRustを本栌的に利甚し始めたした。豊富な孊習リ゜ヌスやRustに詳しいメンバヌのヘルプを通じお、プロゞェクト開始前の孊習では String ず &str の違いを理解するずころから始めたメンバヌも、プロゞェクト開始埌はスムヌズに開発できるようになりたした。 珟圚のバック゚ンドのナヌスケヌス ここからはRustでバック゚ンドを「ふ぀う」に開発するための、蚭蚈や実装における面癜いポむントを玹介しおいきたす。 珟圚は䞻に次のナヌスケヌスでバック゚ンドを利甚しおいたす。 レストラン情報の取埗 店舗情報や予玄可胜時間など、レストランの情報をお客様に提䟛するための情報を取埗したす。機胜はGraphQLのク゚リずしお提䟛しおいたす。 今回はレストラン個別のペヌゞの衚瀺から予玄たでのフロヌの眮き換えを開発スコヌプずしたので、珟圚はこのナヌスケヌスが倧半を占めおいたす。埌述のずおりコヌドベヌス䞊もデヌタの読み出しに関するコヌドが倚いです。 予玄の確保 お客様から入力いただいた情報をもずに予玄を確保する゚ンドポむントをGraphQLのミュヌテヌションずしお提䟛しおいたす。たた、実際の予玄凊理は、予玄凊理モゞュヌルを持぀既存の瀟内別サヌビスに委譲しおいたす。 珟圚のアヌキテクチャ 珟圚、アプリケヌションのアヌキテクチャずしおコマンドク゚リ責務分離(CQRS)に基づいた構造を採甚しおいたす。぀たり、デヌタを読み出すだけのク゚リず、デヌタの䜜成や曎新をするコマンドで、利甚するモデルを分離する方匏をずっおいたす。 たた、たずえばク゚リの堎合、DBずSolrそれぞれに぀いおデヌタアクセス局を蚭け、GraphQLのデヌタロヌダヌのようなシステムの界面に近い局からは、デヌタアクセス局を通じおク゚リモデルの圢匏でデヌタを取埗したす。 モゞュヌルずその䟝存関係 これらのモゞュヌルはCargo workspaceを甚いお管理しおいたす。この点に぀いおはあずで詳しく説明したす。 各モゞュヌルの玹介 䞊述した図における各局を構成するモゞュヌルに぀いお玹介したす。 ドメむンモデル CQRSにおけるク゚リずコマンドで利甚するモデルを実装しおいる局です。ドメむンモデルは他のどのモゞュヌルにも䟝存したせん。たた、ク゚リずコマンドは別モゞュヌルずするためにcrateを分けおいたす。 ク゚リモデルの䟋ずしおは、レストラン詳现画面で衚瀺する店舗情報がありたす。これらのデヌタは実際は耇数のテヌブルに存圚したすが、ク゚リモデルはそのような実装詳现には䟝存せず、ク゚リの結果ずしおほしい構造を定矩しおいたす。実際には、SQL ServerもしくはSolrから埗たデヌタをク゚リモデルに倉換しお利甚したす。 #[derive( Debug , Clone )] pub struct Restaurant { pub id: RestaurantId, pub name: String , pub description: Option < String > , // ... } コマンドモデルの䟋ずしおはお気に入り店舗登録甚のコマンドモデルなどが存圚したす。こちらはただ数が少ないので割愛したす。 デヌタアクセス局 実際のデヌタを取埗するためのロゞックを実装しおいる局です。珟圚は、䞀䌑の基幹DBであるSQL Serverや、怜玢サヌバであるSolrからデヌタを取埗しおいたす。このデヌタアクセス局の利甚者に察しお、取埗したデヌタをもずにモデルのむンスタンスを返したす。぀たり、ドメむンモデルに䟝存したす。 ク゚リを実行するずきは、 Serde や serde_with を利甚しお、デヌタストアから取埗した生デヌタをDTOにデシリアラむズしたす。 mod dto { // ... #[serde_with::serde_as] #[derive( Debug , serde::Deserialize)] pub struct Restaurant { #[serde(rename = "restaurant_id" )] #[serde_as(as = "serde_with::TryFromInto<i32>" )] id: RestaurantId, #[serde(rename = "restaurant_name" )] name: String , // ... } } さらに、このDTOからク゚リモデルに倉換するために std::convert の From トレむトや TryFrom トレむトを掻甚しおいたす。詳しくは埌述したす。 GraphQLずHTTPサヌバ バック゚ンドはGraphQLを通じおフロント゚ンドにク゚リずミュヌテヌションを提䟛しおいたす。このGraphQL APIの実装にはasync-graphqlを利甚しおいたす。async-graphqlはコヌドファヌストでGraphQLスキヌマを定矩できるcrateです。 github.com // Restaurant { // name // } // のようなスキヌマをコヌドで定矩 pub struct Restaurant ( pub query_model :: Restaurant); #[async_graphql::Object] impl Restaurant { async fn name ( & self ) -> &str { & self . 0 .name } // ... } たた、HTTPサヌバずしおはAxumを利甚しおいたす。 github.com これたではGraphQLなので゚ンドポむント1぀で枈んでいたしたが、最近は瀟内の他サヌビスず通信するためにむンタヌナルなREST APIを䜜る機䌚も増えおきおいたす。 ラむブラリ アプリケヌションを構成するモゞュヌルずは別に、独立したロゞックをたずめたラむブラリずしおのcrateもいく぀か䜜成しおworkspaceに含めおいたす。これらのラむブラリは他モゞュヌルから利甚されたす。 たずえば、先述したTiberiusをベヌスにしたDBドラむバや瀟内サヌビスのクラむアント、他にはログなどの暪断的関心事を扱うラむブラリが存圚したす。 Rustによる開発のふりかえり よかったこず Rustはビゞネスロゞックを曞くのにも䟿利 Rustの蚀語機胜ずしお、所有暩やラむフタむムのようにメモリ安党性を意識したものがよく泚目されたす。さらに、Webアプリケヌションバック゚ンドを曞くうえでは、 Option や Result に代衚される関数型蚀語の゚ッセンスを取り蟌んだ機胜や、デヌタ倉換にた぀わる機胜も非垞に䟿利だずあらためお感じたした。 䞀䌑レストランは15幎以䞊の歎史があるサヌビスです。このようなサヌビスは、しばしば歎史的事情からなるデヌタ構造やコヌドを倚く持っおいたす。たずえば有効な倀ずnullの䞡方が存圚しうるカラムを扱うこずもありたす。このずきに Option を利甚するこずで、ビゞネスロゞック䞊でnullにた぀わるバグを避け、match匏やif let匏によっお倀がないケヌスを぀ねに考慮できたす。 たた、Webアプリケヌションは無効な倀を入力されたり倖郚のサヌビスずの通信に倱敗するなど、぀ねにロゞックが倱敗する可胜性がありたす。そのようなロゞックでは返り倀ずしお Result 1 を䜿うこずで、確実に゚ラヌをハンドリングできたす。たた、 ? 挔算子を利甚するこずで、コヌドを簡朔に保ち぀぀゚ラヌハンドリングできるのも䟿利な点です。 他には、䞀䌑レストランだず予玄可胜な時間や食事コヌスの怜玢結果などでコレクションを操䜜する堎面が数倚くありたす。このようなずきに、むテレヌタず map や filter のようなむテレヌタアダプタを利甚するこずで、コレクションにた぀わるビゞネスロゞックを簡朔に曞けるのもよい点だず感じおいたす。 アプリケヌションの各局で型安党にデヌタを倉換 先述したように、このアプリケヌションでは耇数のモゞュヌルで責務を分けおいたす。よっお、そのたたではデヌタアクセス局でデヌタストアから取埗した生のデヌタをDTOを経由しおク゚リモデルに倉換するロゞックを曞く必芁が出おきたす。 ここで、 From トレむトや TryFrom トレむトを甚いお型安党なデヌタの倉換を実装するこずで、局の間で安党にデヌタを受け枡しできたす。たずえばDTOをク゚リモデルに倉換するために From トレむトや TryFrom トレむトをDTOに察しお実装し、適切にモデルぞ倉換できるようにしおいたす。 impl From < dto :: Restaurant > for query_model :: Restaurant { fn from (d: dto :: Restaurant) -> Self { query_model :: Restaurant { id: d.id, name: d.name, // ... } } } このようにモデルに察しお倉換のためのトレむトを実装しおおけば、あずは from  try_from や into  try_into を䜿うだけで局の間の型安党なデヌタ倉換が可胜になりたす。 Cargo workspaceを掻甚した開発 Cargo workspaceを掻甚しおモゞュヌル間の䟝存関係を制埡しながら開発できおいるのもよい点です。 リポゞトリのルヌトディレクトリにあるCargo.tomlでは、workspaceのmembersずしおアプリケヌション内の各モゞュヌルを指定しおいたす。そしお、それらのモゞュヌルをcrateずしお実装し、各crateのCargo.tomlではアヌキテクチャを意識しお他のcrateぞの䟝存関係を蚭定するこずで、意図しない䟝存はコンパむラによっお゚ラヌにできる構造にしおいたす。 # ルヌトディレクトリのCargo.toml [workspace] resolver = "2" members = [ "backend/*", ] # デヌタアクセス局のCargo.toml [package] name = "backend-data-access" version.workspace = true authors.workspace = true edition.workspace = true publish.workspace = true [dependencies] backend-query-model = { workspace = true } たた、モゞュヌルをcrateに分離したこずで、コヌドを倉曎したずきに、倉曎のあったcrateずそのcrateに䟝存するcrateだけを再ビルドすればよくなりたした。結果ずしお、毎回アプリケヌション党䜓をビルドせずに枈み、開発時のビルド時間の短瞮にも貢献しおいたす。 パフォヌマンスの向䞊 もちろんパフォヌマンスの向䞊も圓初の狙いどおり達成できた点であり、よかったこずの1぀です。 バック゚ンドはGoogle Cloud Runで運甚しおいたす。珟圚は幎末幎始でレストラン予玄が非垞に増える時期ですが、ピヌク時でも3台皋床のむンスタンスでリク゚ストを受けるこずができおいたす。 たた、䞀䌑レストランのバック゚ンドの䞀郚をRustに移行したこずで、埓来のPythonのバック゚ンドにおけるKubernetes DeploymentのReplicaSet数を次のように60皋床から40皋床に枛らすこずができたした。 Wed 4以降はPythonバック゚ンドの負荷をオフロヌドできた 他には、バック゚ンドの高速化にずもなっおサヌビス党䜓の構成を最適化するこずで、䞀䌑レストラン党䜓のパフォヌマンスが向䞊したした。こちらに぀いおはチヌムメンバヌのkozaiyが次の蚘事に詳しく曞いたのでご芧ください。 user-first.ikyu.co.jp もっずよくなるず嬉しいこず ゚コシステムのさらなる成熟 Webアプリケヌションバック゚ンドを開発するうえで、さらにプラットフォヌムのRust察応が拡充されるず開発が楜になりそうです。 たずえば、珟圚はCloud Runを䜿っおいるので、APMずしおCloud Traceを利甚するこずにしたした。しかし、公匏にはRustのSDKが提䟛されおいないこずから、独自のラむブラリを開発するこずで察応しおいたす。 たずめ この蚘事では、䞀䌑レストランにおいおRustを採甚した理由ず、Rustによる「ふ぀う」のWebアプリケヌションバック゚ンド開発の様子に぀いお玹介したした。 Rustを採甚したこずで、期埅どおり性胜面で倧きなメリットを埗るこずができたした。たた、RustやCargoの機胜を適切に掻甚するこずで、生産性を保ち぀぀今埌の継続性も考慮した蚭蚈で開発を進めるこずができおいたす。 新たにRustを利甚し始めたチヌムメンバヌからは、Rustに察する感想ずしお 自分自身にプログラミングを教えおくれる蚀語だなず思いたした プログラミングする䞊で、気にすべきポむントを気にさせおくれる蚀語 ずいう声もあがっおいたす。 今埌のバック゚ンドの展望ずしおは、よりよい予玄䜓隓の提䟛やレガシヌシステムの改善を目的ずしお、 高速なレスポンスが求められるレストラン怜玢 レストラン予玄のロゞックなどのレガシヌか぀コアドメむンであるモゞュヌル に぀いおもRustで眮き換えおいく予定です。このような箇所では、高いパフォヌマンスや型に守られた開発䜓隓を提䟛しおくれるRustを掻かすこずができるだろうず考えおいたす。 このような技術的なチャレンゞができる䞀䌑レストランのバック゚ンド開発に興味があるかたは、ぜひカゞュアル面談応募ペヌゞや求人ペヌゞからご連絡ください。 hrmos.co www.ikyu.co.jp 䞀䌑レストランでは anyhow::Result を利甚しおいたす ↩
この蚘事は 䞀䌑.com Advent Calendar 2023 24日目の蚘事です。 宿泊プロダクト開発で開発ディレクタヌをしおいたす、橋本ず申したす。 ぀いにクリスマスむブ。残すずころこの蚘事を含めお2぀ずなりたした。 本日の蚘事では開発ディレクタヌ1幎目の奮闘劇を皆さんに玹介したいず思いたす。 同じディレクタヌの方はもちろん、䜕か新しいこずに挑戊しおいる皆さんに届くず嬉しいです。 簡単に経歎玹介 新卒でNWむンフラの䌚瀟に入瀟し、 ゚ンゞニアずしお法人顧客のサヌビス導入をサポヌトをしおきたした。 AWSの運甚、セキュリティ商材の導入、NW機噚の導入運甚、スマホ管理サヌビス導入など様々な分野を担圓し、盎近では技術営業ずしお提案メむンでの掻動に埓事しおいたした。 5幎目になったころ、サヌビスの導入ではなく、サヌビスを䜜るこずに興味を持ち、プロダクト開発ずいう新しい分野にチャレンゞするこずを決めたした。 そこから瀟内の制床を掻甚し、珟圚は䞀䌑にお䞖話になっおいたす。 奮闘劇 むンプット倚量死をなんずか免れた序盀 入瀟前に開発ディレクタヌずはなんぞやずいうこずですごく簡単な資栌だけ取りたした。 Webディレクション | Web検定(ウェブケン) 䞀般的なWeb業界の甚語がメむンで、実際に䜕をする圹割なのかはふわっずだけ孊びたした。ただ、実際に入瀟しおみるず、蚀葉通り「右も巊もわからない」状況でした。 瀟内で䜿われおいるツヌルで觊ったこずがあったのがGmailずSlackだけで、進め方以前に䜿い方がわからない。。 業務フロヌに぀いお説明を受けるも、衚面的なずころだけ分かった気になっおしたう。。 SQLも曞けないのでデヌタ抜出を頌たれおも時間がかかる。。 操䜜方法に぀いお聞くも1回では理解できないので、録画をしお埌で自分でコンフルにたずめる日々。。 なによりアりトプットが䜕もできない状態でした。 そこで自分が意識したのは、 わからないこずはわからないたたにしない 䞀床教えおもらったこずは、次回からは䞀人でできるようになる ずにかく呚りに迷惑をかけないように、枡されたタスクはミスなくこなせるようにするこずを日々考えおいたした。 たずは仕事に慣れるこず、䞀人分の仕事ができるようになるこずを目指しおがむしゃらに取り組む日々でした。 ずにかくむンプット量が倚くお敎理しきれなくなりそうになるのをなんずか螏ん匵った2カ月。 2カ月目で起きたのが垞に远いかけたわしおいたディレクタヌの先茩が産䌑に入られるずいう出来事。。。 必死に犬掻きをする䞭盀 産䌑に入られた先茩から耇数プロゞェクトのディレクションを匕き継ぎたした。 正盎、やっおやるずいう気持ちず、自分が䞻䜓になるこずでプロゞェクトが倱敗するのではないかずいう䞍安で、粟神的には䜙裕のない状態でした。 実際に業務に取り掛かるず、 匕き継いだ業務をうたく進めようず意気蟌むが、頑匵りどころず向かう先がむマむチ合っおおらず、日々犬掻き状態。。 チヌムからはディレクションずしおの圹割を求められるが調敎業務にも䜕日も時間をかけおしたう状態。。 今振り返るずこんな状態でした。 進め方や芁件、仕様に぀いお各所ず調敎をしおいる぀もりが、状況や芁望を聞いおきお持っお垰るだけの䌝曞鳩になっおいた ナヌスケヌスを耇数考慮できず出戻りが発生するこずが倚かった 自分がやるべき最䜎限タスクができおいないのに、改善や新芏の提案など背䌞びをしお䜕か䟡倀を出そうず空回りしおいた 振り返るずなかなか恥ずかしいですね、、 この状況を打砎すべく意識したこずは 取り組む前に進もうずしおいる方向の認識合わせを行う 悩むポむントはこために壁打ちを行う チヌムマネヌゞャヌに週1回、プロゞェクトの進め方やチヌムのコンディションに぀いお䌚話をする時間をいただきたした。 これがずおも倧きかった  この時に必ず自分の考えをもっお臚み、ギャップを埋めおいくこずに努めた結果、 敷いおもらったレヌル䞊を進めるこずはできるようになっおきたした。 では次は自ら動けるようにならねば。。。 自分の圹割が䜕ずなくわかっおきた今 耇数のプロゞェクトを経隓するこずで、プロゞェクトの初期、䞭盀、リリヌス前、リリヌス埌のぞれぞれのタむミングでディレクションがやるべきこずがわかっおきたした。 「あのプロゞェクトず同じように、こう進めおいきたす」ずいえるようになったのは倧きい。 今埌の動きを予枬しお動けるようになったこずもあり、チヌムメンバヌや他郚眲から䟝頌をされるこずも増えおきたした。 さらに成長を感じたずころずしおは、【考えるタスク】を少しず぀こなせるようになったこず。 調敎業務やチヌムの開発を前に進めるこずだけではなく、本来のディレクション方向を瀺すずいう意味での【考えるタスク】を担圓し、チヌムがその方向に進んでいくずいう䜓隓が少しず぀できるようになっおきおいたす。 最近ではこのようなこずに悩んでいたす。 開発目線になりすぎおビゞネス芳点䟡倀あるもの適切なタむミングで䞖に出すためにはどうすべきかが挏れおしたうこずがある これは同じ悩みをお持ちの方もいらっしゃるのではないでしょうか。 開発ディレクタヌは開発メンバヌず過ごす時間が倚いこずもあり陥りがちな思考だず思いたす。 安党にミスなく進めるためにはずおも重芁ですが、忘れおはいけないのは、 リリヌスをするこずがゎヌルではなく、【䟡倀のあるプロダクトを生み出すこずがゎヌルである】ずいうこずです。 䟋えばA案が良いず思っお進めおいたけれど、リリヌス盎前になっおB案の方が顧客の満足床も高く、売䞊にも぀ながるずわかったケヌスがあるずしたす。 開発チヌムずしおは、盎前で倉曎を加えなくおはいけない、リリヌス日の延長はなるべく避けたい、ずいう状況はストレスに぀ながるず思いたす。 しかし、私たちが進むべきゎヌルは【䟡倀あるプロダクトを生み出すこず】です。 開発チヌムには負荷がかかりたすがディレクタヌずしおはサンクコストではなく、プロダクトの䟡倀を芋るべきです。 私は同様の経隓を通じで、ディレクタヌは開発目線ずプロダクトオヌナヌのどちらの目線も持぀こずがずおも重芁だず身をもっお孊びたした。 ディレクタヌずしお働き始めた圓初は、ディレクタヌっお正盎いなくおも開発は進むよな ず自分の䟡倀を芋぀けられずにいたした。 今では、プロダクトの䟡倀を最倧化するこず、さらに開発チヌムずプロダクトオヌナヌの䞡者が最も進めやすい方法を暡玢するこずがディレクションの䟡倀だず思っおいたす。 今埌に向けお 今の私が意識し、目暙にしおいるこずを宣蚀させおください。 私は、゚ンゞニアより技術力はない。 私は、マヌケタヌよりも垂堎の把握や予枬に匷くない。 私は、営業よりも珟堎の考え方が理解できおいない。 けれど、チヌムの掚進力を高め、開発によっお生み出されるプロダクトを䟡倀あるものにする力は誰よりも持おるようになりたい。 そのために2぀のこずを意識しおいきたいず考えおいたす。 チヌムマネゞメントに぀いお孊び、チヌムに合った進め方でさらに掚進力を䞊げおいく ビゞネス目線を垞に意識し、開発で生たれるサヌビスが䟡倀あるものになるようにディレクションを行う 䞀人のディレクタヌずしおチヌムや䌚瀟にずっおなくおはならない存圚になるこずを目指しおきたす。 最埌に䞀蚀 勇気を出しお、別業界か぀別職皮にチャレンゞしたこずを本圓によかったず思っおいたす。 蟛い時もありたすが、日々自己成長できおいるず実感するこずができおいたす。 この堎を借りおチヌムメンバヌ、同じ゚ンゞニアメンバヌ、䞀䌑の皆さんに感謝の気持を䌝えたいです。い぀も枩かいアドバむス、ありがずうございたす。 これからも明るさず元気を取柄に頑匵りたす
この゚ントリヌは 一休.comのカレンダー | Advent Calendar 2023 - Qiita の22日目の蚘事です。 レストランプロダクトUI開発チヌムの鍛治です。 䞀䌑レストランのフロント゚ンドを担圓しおいたす。 䞀䌑レストランでは Next.js App Router Remix を採甚しおいたす。 user-first.ikyu.co.jp 昚幎の終わり頃から始たった䞀䌑レストランのリニュヌアルですが、フロント゚ンドは Nuxt v2 (Vue 2) から Next.js App Router (React) に、ずいう倧きな切り替えで、䞍慣れだった我々は React 初心者がひっかかる萜ずし穎を党郚螏み抜いおきたした。 䟋えば、チュヌトリアルに埓っお useState で倉化する状態を定矩しお、最初はそれで党おがうたくいっおいたした。機胜远加しおいく過皋でい぀の間にか䞀぀増え二぀増え、あずはズルズルず。 ふず我に返るず䞀぀のコンポヌネントに10個もの useState が生えおしたっおいたした。 その結果、 && , || , ?? のオンパレヌドず䞉項挔算子だらけの JSX だけが残りたした。䜕床も䜕床も読み返しおるのに、コンポヌネントが今どんな状態にあるのか、さっぱり把握できない  他にも、 バケツリレヌ コヌルバック useEffect 問題 ずいった萜ずし穎を螏み抜いおきたした。 フロント゚ンドの状態管理っお本圓に難しいですよね。 あらためお本日は React 状態管理改善の第䞀匟ずしお useState 濫甚からどう抜け出したのかに぀いおお話ししたす。 コヌルバックや useEffect 問題は来月以降の蚘事でご玹介する予定です。 useState の難しさ たずは䞀番初歩的なずころから考えおみたしょう。 耇数のuseStateフックを䜿甚する堎合、予期しない状態の組み合わせが発生する可胜性がありたす。 function Sample () { const [ show , setShow ] = useState ( false ); const [ disabled , setDisabled ] = useState ( false ); const toggle = useCallback (() => { setShow (( prev ) => ! prev ); } , [] ); const toggleDisabled = useCallback (() => { setDisabled (( prev ) => ! prev ); } , [] ); return ( <> < button onClick = { toggle } disabled = { disabled } > show < /button > < button onClick = { toggleDisabled } > disable < /button > < SampleModal show = { show } / > < / > ); } このシンプルな䟋では、showモヌダル衚瀺甚ず disabledボタン無効化甚の二぀の状態を管理しおいたす。 しかし、たった二぀しかないのに show === true && disabled === true のように、ボタンが無効化されおいるにも関わらずモヌダルが衚瀺されおいる、ずいう矛盟した状態を衚珟できおしたいたす。useState で管理する状態が増えれば増えるほど、矛盟した状態を生んでしたう可胜性は高くなりたす。 この問題を解決するためには、コンポヌネントの粒床を小さくし、useState には primitive 倀を入れず構造化されたデヌタを甚いお、ありえない状態を生たないようにするのが自然な発想でしょう。 type State = Initial | Disabled | Modal type Initial = { type : 'Initial' disabled: false show: boolean } type Disabled = { type : 'Disabled' disabled: true show: false } type Modal = { type : 'Modal' disabled: false show: true modalData: ModalData } function Sample () { const [ state , setState ] = useState < State >( { type : 'Initial' , disabled: false , show: false } ) const open = useCallback (() => { setState ( { type : 'Modal' , modalData: 'data' , disabled: false , show: true } ) } , [ setState ] ) const toggleDisabled = useCallback (() => { if( state.disabled ) { setState ( { type : 'Disabled' , disabled: true , show: false } ) } else { setState ( { type : 'Initial' , disabled: false , show: false } ) } } , [ setState ] ) return ( <> < button onClick = { open } disabled = { state.disabled } > show < /button > < button onClick = { toggleDisabled } > disable < /button > < SampleModal show = { state.show } / > < / > ) useState + union 型では足りなかった 䞊述した実装のように、union 型によっお䞍正な状態が䜜られなくなりたした。 遷移はむベントハンドラ内で暗黙的に蚘述されたす。䞊蚘のモヌダルでは状態が2぀しかなく、シンプルな実装なので遷移の党䜓像を把握できおいたすが、状態の数が増え遷移が耇雑になるず遷移の党䜓を把握するのが困難になり、人為的に遷移先を決定するロゞックをテストする必芁がありたす。結果、誀っお䞍正な遷移が玛れ蟌む堎合がありたす。 䟋えば、䞀䌑レストランでは空垭確認カレンダヌずいう機胜がありたす。 空垭確認カレンダヌ 䞊蚘空垭確認カレンダヌの状態遷移図は以䞋のようになりたす。黒色で囲われおいるのが状態で、灰色で囲われおいるのが遷移むベントです。 カレンダヌの状態遷移図 状態が7個、遷移むベントが20個あり、むベントハンドラ内での遷移先を決めるロゞックが耇雑になっおしたい䞍正な遷移を起こしおしたう可胜性がありたした。 このような䞍正な遷移を人為的ではなく機械的に防ぐために、state machine を導入したす。 state machine ずは state machine は耇数の「状態」ず「状態間の遷移」で構成されたす。 䞊述した web 画面のシナリオを䟋にするず「フラットな状態」通垞の状態から「モヌダルが開いた状態」ぞの遷移は「 show ボタンをクリックする」ずいうむベントによっお行われたす。 「モヌダルが開いた状態」では再床 「show クリック」むベントが発生しおも、そのむベントに察応する状態遷移は定矩されおいないので、それ以䞊䜕も起きたせん。 たた「フラットな状態」から最初に disabled ボタンが抌されお disable むベントが発火しお「ボタンが無効化された状態」になるず、そこで仮に show むベントが発火しおも、同様に show むベントに察応する状態遷移が定矩されおいないので、「ボタンが無効なのにモヌダルが開いおしたう」ずいう矛盟した状態が生じたせん。 モヌダルの状態遷移図 state machine では、あらかじめ定矩した状態ずその状態間の遷移しか存圚しないので、予期しない状態に陥るこずがありたせん。state machine を導入するず、アプリケヌションロゞックを明確か぀宣蚀的に定矩できるのが非垞に魅力的なポむントです。 XState (state machine) の導入 state mcahine を導入するために、 XState を䜿った状態管理方法を導入するこずを決定したした。 もちろん他の解決策もあったず思いたす。 䟋えば、匊瀟 CTO が以前ご玹介した TypeScript の discriminated union タグ付きナニオン型で状態を、関数で遷移を衚珟する手法はその䞀぀であり、匊瀟プロダクトで実瞟ある゜リュヌションであるこずは間違いありたせん。 techplay.jp ただ、珟圚の自分達では、制玄のない状況䞋でうたく型を定矩しお、状態を完党にコントロヌルできるずいう自信は持おたせんでした。state machine もどきの䞍完党な物を生み出しおしたわないか䞍安があったのです。 XState であれば state machine を正しく定矩するこずを匷制されたす。技術ずしおのフレヌムワヌクに留たらず、思考のフレヌムワヌクずしおガむドレヌルを提瀺しおくれる点を評䟡したした。 XState ずは stately.ai state machineを䜜成するこずができる非垞に高機胜なラむブラリです。 䟋えば、フロント゚ンドのサンプルずしおよく甚いられる TODO リストを XState で実装 *1 するず以䞋のようになりたす。 type TodoList = { items: { id: number name: string completed: boolean }[] } type TodoEvent = Add | Toggle | Disable | Enable type Add = { type : 'ADD' item: { id: number name: string completed: boolean } } type Toggle = { type : 'TOGGLE' id: number } type Disable = { type : 'DISABLE' } type Enable = { type : 'ENABLE' } type TodoState = { value: 'ACTIVE' ; context: TodoList } | { value: 'INACTIVE' ; context: TodoList } export const machine = createMachine < TodoList , TodoEvent , TodoState >( { initial: 'ACTIVE' , states: { ACTIVE: { on: { ADD: { target: 'ACTIVE' , actions: assign (( ctx , event ) => ( { items: [ ...ctx.items , event.item ] } )), } , TOGGLE: { target: 'ACTIVE' , actions: assign (( ctx , event ) => ( { items: ctx.items.map (( item ) => item.id === event.id ? { ...item , completed: ! item.completed } : item ), } )), } , DISABLE: 'INACTIVE' , } , } , INACTIVE: { on: { ENABLE: 'ACTIVE' , } , } , } , } ) たず state ずしお TODO を远加したりトグルを倉曎が可胜な状態の ACTIVE ず、なにもできない状態の INACTIVE を定矩したす。 次に、各 state が各むベントを受け取った時にどの状態に遷移するか、すなわち状態遷移を on で定矩し、その状態遷移時の副䜜甚ずしおのデヌタ曎新を actions で指定するこずで、state machine が完成したす。 XStateでは、内郚情報ずしお context 詳しいこずは埌のセクションで説明したすを持ちたす。 ADD むベントでは context である items に 新しい TODO を远加しおいたす。 XState で定矩した state mahine では、 INACTIVE の状態で ADD や TOGGLE のむベントに察する状態遷移を定矩しおいないので、 ありえない状態に遷移しないこずが保蚌されたす。 。 context context ずは、state machine が扱う状態の「詳现」や「倉動する郚分」を吞収しお、耇雑な状況に察応する仕組みです。 state machine 、厳密には有限状態機械FSM: Finite State Machineの「有限」は、あくたで数孊的な「有限」です。 実際のアプリケヌションでは、管理しなければならない状態に玐づくデヌタや条件が耇雑で、有限状態機械を原理的に適甚するず、たずえ「有限」であっおも、人間の認知胜力ではずうおい把握しきれない膚倧なバリ゚ヌションを生み出しおしたいたす。 有限状態機械を珟実的に利甚するために 状態ずその状態に関連するデヌタを分離しお、context ずいう圢で保存・管理したす。 䟋えば以䞋のように、ナヌザヌの入力やアプリケヌションの珟圚の状態など、状態自䜓ではなく、状態の「内容」を衚すデヌタのこずです。 予玄する人数日時 予玄の際に遞択する支払い方法 䜿甚するクヌポン情報 予玄入力の状態遷移図 XState で管理すべきでない状態 XState で党おの状態を管理すべきず蚀っおるわけではありたせん。ボタンを抌すずモヌダルが衚瀺される状態遷移は、XState で管理しおしたうず华っおオヌバヌ゚ンゞニアリングになっおしたいたす。 たた、以䞋の堎合は状態ずしお持぀べきではありたせん。 状態遷移から独立しおおり、倀が操䜜の過皋で倉化しないもの 䟋えば、API レスポンスは state machine の遷移に倉化する倀ではないので XState で管理すべきではなく、useState で管理すべきです。 XStateで管理すべき基準ずしおは 1぀のコンポヌネントで useState が3぀以䞊定矩されおいる 䜕かアクションを起こした時の遷移先が2぀以䞊ある 堎合だず思っおたす。プロダクトによっお基準は違うず思うのであくたで目安です XStateを導入しお良かったこず フロント゚ンドの改修が容易になった state machine によりありえない状態ができないこずが担保されおいるので、フロント゚ンドの改修をする際に倧きいバグが起きなくなりたした。 実装前の仕様 / モデリングの議論ができるようになった state machine が画面のドメむンモデルずなるので、画面や機胜を䜜成する際にどのような state machine にするか議論するこずで、意図せずも画面や機胜のモデリングの議論ができるようになりたした。 所感 XState による state machine ずいう考え方のガむドレヌルができたこずで、条件文を最小限にする state mahine のメンタルモデルが圢成されおきたように思いたす。 たた、䞊述したように党お XState で管理すべきだずは思っおたせん。適材適所で XState をうたく掻甚しおいきたいです。 さいごに 䞀䌑では、より良いサヌビスを䜜っおくれる仲間を募集しおいたす www.ikyu.co.jp カゞュアル面談も実斜しおいたすので、ぜひお気軜にご連絡ください hrmos.co *1 : XState 4 ベヌスのコヌドです。XState 5には近日䞭に移行予定です
抂芁 この蚘事は 䞀䌑.com Advent Calendar 2023 16日目の蚘事です。 RESZAIKO開発チヌムの束村です。 䞀䌑では各サヌビス毎に、開発䞭のサヌビスの動䜜を瀟内で確認できる環境がありたす。 それぞれmain(master)ブランチず自動的に同期しおいる環境ず、特定のブランチを指定しお利甚できる環境の2皮類がありたす。 今回、RESZAIKOの新芏サヌビス(予玄画面)に察しおブランチを指定しおデプロむできる環境を䜜成したので、その方針ず反省点ず今埌に぀いお蚘述しおいきたす。 珟圚運甚䞭の予玄画面 開発環境を䜜る理由 䞀䌑では長らく、EKS䞊に耇数の環境を甚意しお、ブランチを指定するず開発環境にデプロむするシステムが利甚されおきたした。 䞀般的にこのような環境を構築するのは以䞋のような理由が挙げられたす。 動䜜確認 マむクロサヌビスで、異なるブランチ同士の組み合わせで動䜜確認がしたい ロヌカルだず䜕故か再珟しない デプロむがちゃんず動くか確認したい 他人ず成果物の共有 リリヌスできるほど動䜜に自信は無いが、ステヌクホルダヌず内容を共有したい 本サヌビスでは Prisma を利甚しおDBのスキヌマをアプリのコヌドず同じリポゞトリで管理しおいるため、 耇数の新機胜を平行しお開発しおいく堎合に開発環境が1぀だず、DB定矩が衝突したりしお尚曎倧倉です。 そこで、耇数の開発環境を䜜成できるようにしたした。 本サヌビスは基盀にGoogle Cloudの Cloud Run を䜿甚しおいたす。 Cloud Runは特に蚭定しなければアクセスがある時だけコンテナが起動するようになっおいるので、EKSを䜿甚した堎合よりスペックやコストをあたり気にせず環境を増やしおいけたす。 実珟方法 サヌバはCloud Runで動いおいお、デプロむは Github Actionsで行っおいたす。 そのため、開発環境甚のGithub Actions Workflowを䜜成しおいきたす。 デプロむを行うGithub Actions Workflowの䜜成 本蚘事の䞻旚から倖れるので詳しく説明したせんが、 Google Cloudには Github Actionsず連携しおデプロむを行うための機胜 が各皮甚意されおいるので、参考にしおWorkflowのyamlファむルを䜜成したす。 name : backend.demo.create on : workflow_dispatch : inputs : name : required : true type : string description : "Environment name to deploy" jobs : build : runs-on : ubuntu-latest steps : - name : "Checkout" uses : actions/checkout@v3 # SecretからGCPの認蚌甚のjsonを読み出す - id : "auth" uses : "google-github-actions/auth@v0" with : credentials_json : "${{ secrets.gcp-dev-service-accont-key }}" - name : "Set up Cloud SDK" uses : "google-github-actions/setup-gcloud@v0" with : install_components : 'alpha,beta' # 以䞋ビルド・デプロむの蚘述 Workflowの呌び出し Workflowに workflow_dispatch を定矩するこずで、 倖郚からREST APIでWorkflowを呌び出す こずができたす。 開発環境甚のアプリを䜜成しお、そちらからREST APIで必芁に応じおWorkflowを呌び出しおあげたす。 POST https://api.github.com/repos/test/test-repo/actions/workflows/backend.demo.create/dispatches Content-Type: application/json Accept: application/vnd.github+json Authorization: Bearer <TOKEN> X-GitHub-Api-Version: 2022-11-28 { "ref":"feature/branch-to-test", "inputs":{"name":"demo-1"} } 実装された運甚 ブランチデプロむサヌビス画面 こんな感じのアプリを䜜成したした。 ブランチ名を入力しお Deploy を抌すず、デモ環境に該圓のブランチがデプロむされたす。 い぀、誰が、どのブランチをデプロむしたかを蚘録するようになっおいたす。 削陀機胜はただ実装しおいないので、䜿い終わったらmainブランチを手動で適甚する運甚になっおいたす。 反省ず将来 折角Cloud Runを䜿っおいるのに、既存の他サヌビスの仕様に匕きずられた実装にしおしたいたした。 特に以䞋の点が良くないです。 蚭定ファむルをコピペしお増やしおいたので、環境を増やす毎に同じような蚭定ファむルが増える 環境毎に瀟内甚のドメむン( [env-name].dev.reszaiko.com のような)を䜜っおいたので、環境を増やす床にDNSずSSLの蚭定が必芁になる このため、気軜に環境を増枛させる事が困難になっおいお、既存の問題をそのたた匕き継いでいたす。 䜿わなくなった環境を戻し忘れおそのたた占有し続ける 空いおいる環境がない堎合、他の環境を䜿っおいる人ずコミュニケヌションしお融通しおもらう必芁がある このたたデプロむ環境を䜜るなら ブランチデプロむ環境ずしお、党おのブランチに察しお自動的にデモ環境を䜜成、砎棄するのが理想です。 コンテナのビルドやDBやサヌバの甚意、デプロむは既にGithub Actionsで行うようにしおいたすし、 開発環境ぞのアクセスはCloud Routerを利甚しお振り分けおいるため、 dev.reszaiko.com/[branch-name]/ のように環境毎のパスの远加もGithub Action䞊で構築できたす。 たた、特に開発環境を必芁ずしない軜埮な修正に察しおも無制限に環境を䜜るのを防ぐために、以䞋の手段が考えられたす。 dev-**** のように、特定のprefixを持぀ブランチに察しお自動で環境を䜜る 既存のデプロむ甚UIを拡匵しお、環境数を増やしたり枛らしたりできるようにする 前者はブランチが消えれば自動で環境が消えるので、䜿わなくなった環境が残っおしたうずいうよくある問題が解消できたす。 埌者はUI䞊で存圚する環境の把握やアプリぞのリンク、DBのリセットなど機胜を远加する事ができお䟿利です。 開発環境を䜜らないず駄目なのか そもそもブランチデプロむ環境が必芁か、ずいう問題もありたす。 開発䞭のブランチを長期間利甚しおいるず本番環境ずの乖離が倧きくなり、mainブランチにマヌゞする際に入念なチェックが必芁になりたす。 RESZAIKOの予玄チヌムでは トランクベヌス開発 のように 頻繁にリリヌスする手法を導入するか議論しおいたすが、 このような手法では開発䞭の機胜はフィヌチャヌフラグを利甚しお出し分けるのが適しおいたす。 RESZAIKOでは LaunchDarkly ずいうフィヌチャヌフラグ機胜を提䟛しおくれるSaasを導入しおいるため、 コストをかけおブランチデプロむ環境を開発しおいくよりは、フィヌチャヌフラグを適切に利甚する䜓制を敎備し、開発環境はmainブランチず同期したものだけで運甚しおいく方がいいかもしれたせん。 たずめ 䜿甚しおいる技術やサヌビスは日々新しい物が導入察象になるので、最適な開発手法ずいうのはその時に合わせお怜蚎する必芁がありたす。 次に蚘事を曞くずきは「トランクベヌス開発に合わせたフィヌチャヌフラグの運甚法」みたいなのが曞けるように頑匵りたす。 䞀䌑では、共に働く゚ンゞニアを募集しおいたす。 www.ikyu.co.jp カゞュアル面談も実斜しおいるので、お気軜にご応募ください。 hrmos.co