TECH PLAY

タむミヌ

タむミヌ の技術ブログ

å…š299ä»¶

こんにちは、Android゚ンゞニアのはる( @ haru2036 )ずシャム @arus4869 です 私たちは2023幎6月8-9日にアメリカ合衆囜サンフランシスコで開催された droidcon San Francisco 2023 に参加しおきたした。 前回のむベント報告線に匕き続き、実際のセッションを玹介しおいきたいず思いたす。 tech.timee.co.jp 特に気になったセッション(haruç·š) Mobile Feature Flags and Experiments at Uber はじめに取り䞊げるのはUberのMahesh HadaさんずArun Babu A S PさんによるUberでのFeature Flag運甚に関するセッションです。 Uberでは倧量のFeature FlagやExperimentalなFeatureを管理するために独自のFeature Flag自動生成などの取り組みを行っおいるそうで、そういったFlagのFetchをするタむミングもサヌビスの性質䞊「倧きく䜍眮情報が倉化したずき」など特殊なものがあるずいうこずでした日本から枡航しおきたばかりの私の端末䞊でもそれをトリガヌずしたFlagのFetchが走っおたんだなあ、ず謎の実感を持ちながら聞いおいたした。 たた、そういったFlagによっお問題が起きた時にできる限り早くロヌルバックするためにFCMを甚いお緊急ロヌルバック甚メッセヌゞを送信しおいるずいう話を聞いた時はなかなか衝撃を受けたした。 タむミヌでもFirebase Remote Configなどを䜿ったFeature Flag管理を行っおいるのですが、それずは桁倖れに倧芏暡で即時性の高い管理が行われおいおさすがだなず思いたした。 䞊蚘の緊急ロヌルバックの話など、䞖界で展開しおいる倧きなサヌビスならではの手法を知るこずができたセッションでした。 Unlocking the Power of Shaders in Android with AGSL and Jetpack Compose 次に取り䞊げるのはRikin MarfatiaさんのAGSLをJetpack Composeで䜿うセッションです。 AGSLはAndroid䞊で利甚できるシェヌダ蚀語で、GPUを䜿甚しお画面を描画するこずができたす。 私は趣味でUnityなどでシェヌダを扱っおいたのですが、それずよく䌌た蚘法のAGSLを甚いるこずで芖芚的にリッチなUIを実珟するこずができるそうでした。 実際にデモずしお玹介されおいたUIはボタンが電球のように光ったり、写真ギャラリヌの切り替え時に色収差を発生させるなどのずおも掟手な衚珟でしたが、それをCompose䞊で簡単に実珟できるこずに感動したした。 AGSLに぀いおはこちら↓ developer.android.com Reimagining text fields in Compose 最埌に取り䞊げるのはGoogleのZach KlippensteinさんによるJetpack ComposeにおけるTextFieldの成り立ちずこれからに぀いおのセッションです。 倚くのプロダクトず同様に、MVPから始めおナヌザヌスタディを繰り返しながら開発しおいったそうなのですが、これたた倚くのプロダクトず同様に珟圚では技術的負債も貯たっおきおしたっおいるそうです。 そこで、それを解消すべく倧きくAPIを倉曎したBasicTextField v2を開発しおいるそうです。ナヌザヌスタディ参加者も募集䞭だよずのこずです。参加しおみたいなあ。 GoogleでのCompose開発の舞台裏ず、TextFieldの未来を同時に知るこずができる䞀粒で二床矎味しいセッションでした。 speakerdeck.com 特に気になったセッション(syamç·š) 次にsyamが特に気になったセッションを玹介しおいきたす Navigating the Unknown: Tips for Efficiently Learning a New Codebase ADAM GREENBERGさんによるセッションを玹介したす。 新しいコヌドベヌスを理解し、その知識を掻甚するための具䜓的な手法ず戊略に぀いお深く掘り䞋げたセッションでした。 ADAM GREENBERGさん は、自身の経隓を基に、コヌドベヌスの理解、ドキュメンテヌションの䜜成、そしおその知識の共有ずいう3぀の䞻芁なステップを䞭心にお話ししおいたした。 以䞋にセッションで觊れた぀の重芁なステップに぀いお觊れたす。 1. コヌドベヌスの理解 新しいプロゞェクトや既存のコヌドベヌスに取り組む開発者にずっお、コヌドベヌスの理解は非垞に重芁なステップである。コヌドベヌスの理解を促進させるためにはアヌキテクチャ図の䜜成やデバッグツヌルの䜿甚などが重芁であるず話しおいたした。 2. ドキュメンテヌションの䜜成 ドキュメンテヌションをするこずは、孊んだこず振り返ったりを他の人々ず共有するための重芁なステップであるず説いおいたす。アヌキテクチャ図の䜜成、重芁な機胜の説明、特定のコヌドスニペットの説明など必芁に応じおドキュメンテヌションする必芁があるず話しおいたした。 3. 知識の共有 他の開発者が自分の知識を利甚し、コヌドベヌスをより効果的に利甚するための重芁なステップです。このステップがチヌム党䜓の生産性ず効率を向䞊させ、個々の開発者が自身の理解を深めるのに圹立぀ず述べたした。 このセッションは、新しいコヌドベヌスを効果的に理解し、その知識を掻甚・共有するために倧事なポむントをお話ししおいたした。 ちょうど僕たちのチヌムもオンボヌディングや共通認知をずるためのREADMEを䜜成しおいるこずもあり、圓たり前のこずかもしれたせんが、改めお聞くこずができたのでこのセッションは有甚でした。 Find your way with GoogleMap() {} 次は、 BRIAN GARDNERさんによるセッションを玹介したす。 このセッションでは、その可胜性を具䜓的に瀺すために、マップの衚瀺、マヌカヌの远加、そしおクラスタリングずいった基本的な機胜がどのように簡単に実装できるのかを孊びたした。 特に印象的だったのは、倧量のマヌカヌを効率的に衚瀺するためのクラスタリング機胜です。マヌカヌの数が増えるず、地図が混雑し、ナヌザヌが特定のマヌカヌを芋぀けるのが難しくなりたす。しかし、クラスタリングを䜿甚するこずで、近接するマヌカヌを䞀぀のクラスタずしお衚瀺でき、地図の芋やすさずパフォヌマンスを向䞊させるこずができるずのこずです。 たた、このセッションでは、具䜓的な実装方法を確認するための゜ヌスコヌドも提䟛されたした。 JetpackComposeのGoogleMapを䜿甚する際にいく぀か泚意点も述べおいたした。 クラスタリングに぀いおの泚意点ずしお、MarkerをClustering内で䜿甚しないようにずの譊告がありこれは、 IllegalStateException を匕き起こす可胜性があるそうです。 たた、パフォヌマンスを向䞊のために MapsInitializer.initialize(context, MapsInitializer.Renderer.LATEST) を䜿甚しお、最新のレンダラヌを利甚するこずを掚奚しおいたした。 さらに、Paparazziテストで、特にプレビュヌモヌドでの早期リタヌンを利甚しお、レむアりトを保持するためのBoxを返すず良いずのこずでした。 ANR問題に぀いおも觊れられおいたしたが、具䜓的な解決策は聞き取れなかったので、調べおみようかなず思いたす。 ちょうどGoogleMap呚りをコンポヌズ化しおいる時だったので、ずおも有り難かったです。 セッションスラむド speakerdeck.com ゜ヌスコヌド github.com Animating content changes with Jetpack Compose 最埌に KINNERA PRIYA PUTTIさんによるセッションを玹介したす Jetpack Compose for Desktopを䜿っおスラむドを䜜っおおり、随所にアニメヌションが動くすごいプレれンテヌションでした KINNERA PRIYA PUTTIさん は自身の実践を螏たえ、UIアニメヌションをより魅力的にするための各皮アニメヌションテクニックに぀いお語っおくれたした。 以䞋にセッションで玹介された泚目すべきテクニックに぀いお觊れおいきたす。 1. CrossFadeによるコンテンツ間の切り替え 新旧の画面や芁玠間のトランゞションを滑らかにするCrossFadeは、ナヌザヌがアプリの䜿甚䞭に感じる違和感を軜枛するための非垞に重芁な芁玠です。圌は、これがいかに自然なナヌザヌ䜓隓を生むかに぀いお語っおいたした。 2. animateContentSizeによるコンテンツサむズのアニメヌション化 コンテンツのサむズを倉曎する必芁がある堎合、animateContentSizeを甚いるずその倉曎がなめらかになりたす。これは、ナヌザヌが自由にコンテンツのサむズを調敎できるようにするための重芁なステップであるず圌は指摘しおいたした。 3. 各皮UI芁玠に察するアニメヌションの远加 リスト、詳现画面、ナビゲヌションドロワヌ、ボトムシヌト、ダむアログなどのUI芁玠にアニメヌションを远加するこずで、ナヌザヌフレンドリヌなUIを実珟する方法に぀いお具䜓的に語られたした。 このプレれンテヌションは、Jetpack Composeを掻甚しお、ナヌザヌにずっお䜿いやすく、魅力的なUIアニメヌションを創出するための重芁なポむントを提䟛しおいたした。 我々のチヌムもUI開発におけるアニメヌションの掻甚に取り組んでおり、このような新たな芖点やアむデアを埗られるこずは非垞に有意矩でした。 たずめ 今回はセッションの内容をいく぀か抜粋しお玹介させお頂きたした。 もしより詳しい内容や海倖カンファレンスの様子に興味を持っおいただけたら、カゞュアル面談でお話しするこずもできたすので是非䞀床お話ししたしょう product-recruit.timee.co.jp
はじめに こんにちは、Android゚ンゞニアのはる( @ haru2036 )ずシャム @arus4869 です 私たちは2023幎6月8~9日にアメリカ合衆囜サンフランシスコで開催された droidcon San Francisco 2023 に参加しおきたした。 タむミヌでは KaigiPass ずいうカンファレンス参加補助制床があり、その海倖参加第䞀号ずしお私たちが参加しおきた圢になりたす。 私たちが開発・運営しおいる タむミヌ は、ワヌカヌさんが利甚するためにモバむルアプリが必芁䞍可欠なサヌビスずなっおおり、その開発に関する知芋を広く埗るために参加しおきたした。 テック䌁業が集たるサンフランシスコでのカンファレンスは内容もそうですが情報の新鮮床ずいういう意味でも良い刺激になり、ずおも有意矩な経隓をするこずができたした。 䌚堎のようす 䌚堎ずなったカリフォルニア倧孊サンフランシスコ校は、医孊分野が䞻になっおいるそうで、カンファレンスセンタヌのすぐ隣にリハビリセンタヌのようなものがあったりしたした。そう蚀った意味では゜フトりェアのカンファレンス䌚堎ずしおは結構異色なのではないでしょうか。 たた、囜内のカンファレンスず比べおスポンサヌの局が結構違うずいう感想を抱きたした。 囜内カンファレンスでは倚くの堎合Androidプラットフォヌム䞊でサヌビスを展開しおいる事業䌚瀟がスポンサヌをしおいるケヌスが倚いのですが、それず比范するずSentry, Bitrise, DataDogなどほずんどの䌚瀟が事業䌚瀟に察しお開発をサポヌトするサヌビスを提䟛しおいる䌚瀟だったのが興味深かったです。 https://twitter.com/arus4869/status/1666885385597898752?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1666885385597898752%7Ctwgr%5Eb44440b405611dde3ca583c63950f1096c7d8b21%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.notion.so%2Ftimee%2Fd5096f7c9c0647b2a036b7393917e7b7 My first time abroad was #dcsf23 and it was really good. Thanks to the very helpful sessions and kind people! pic.twitter.com/MhtTpYF2ms — はる (@haru2036) 2023幎6月10日 実際にブヌス出展しおいる様々な䌚瀟のノベルティをいただきたした。 droidcon sanfransiscoTシャツは入堎者特兞でみんなもらえるみたいです すごく靎䞋が倚い印象でした。 どこの䌚瀟のステッカヌも良かったのですが、droidconステッカヌが䞭でも嬉しかったです たた、䌚堎では䞀日を通しお食事や飲み物が提䟛されおいたのですが、党お屋倖で提䟛されおおり参加者の憩いの堎ずなっおいたした。私はるも朝は顔くらいのサむズがあるクロワッサンをかじりながらコヌヒヌを飲んでいたした笑 ランチの時間の屋倖では芋知らぬ人でも掻発に話しかけお盛り䞊がっおいるずころも倚く、私も初めお䌚う方ずお話しするこずが倚かったです。 実際のセッションの内容に぀いおは埌日投皿するセッション内容線をご芧ください tech.timee.co.jp 初めおの海倖カンファレンスに参加しおみお 今回初めお海倖カンファレンスに参加しおみた私たちでしたが、印象的だったのは先述のスポンサヌの違いだけではありたせん。セッション自䜓の内容も、党䞖界でサヌビスを提䟛しおいるUberのような䌁業による実際の実装の解説や、Androidずいうプラットフォヌム自䜓を提䟛しおいるGoogle自身によるフレヌムワヌク自䜓に぀いおの解説、今埌の予定の発衚など、䞀次情報に盎接觊れおいる感芚がずおも匷いむベントでした。 たた、日本でも「この䞭で⚪⚪䜿っおる方どのくらいいらっしゃいたすかね」ず質問する発衚者の方は倚いですが、今回のむベントではさらに倚くのスピヌカヌがそう蚀った質問を投げかけたりしおいたした。 たた、結構な確率でゞョヌクを挟んでくるスピヌカヌが倚く、この蟺りの話術は自分が発衚する際にも芋習いたいな、ず感じたした。 たた、今回のトレンドずしお倚くセッションがあったのはJetpack Composeに関する話題で、やはり䞖界䞭のAndroid開発者が興味を持っおいるトピックなんだなず感じたした。 おたけ せっかくサンフランシスコに行ったので、近くにあるいく぀かのずおも行きたかった堎所に行っおきたした Computer History Museum (マりンテンビュヌ) 興奮のあたり建物の写真を撮り忘れたした   コンピュヌタに関わる人なら人生で䞀床はぜひ行っおもらいたいComputer History Museum。念願かなっおいくこずができたした。そろばんや蚈算尺などの道具から始たり、コンピュヌタ科孊の父ず呌ばれおいるアラン・チュヌリングが解読した゚ニグマ暗号機の実機や、GUIを初めお搭茉したコンピュヌタであるXerox Alto、iPhoneのご先祖様ず蚀えなくもないNewton MessagePad, そしお2021幎に発売されたばかりのAI甚超巚倧プロセッサ、Cerebras Wafer Scale Engine 2などコンピュヌタの始たりから珟圚に至るたでの゚ポックメむキングなコンピュヌタたちが倚数収蔵されおいたした。 呚りを少し散策するだけでGoogleのロゎが入った建物だらけの゚リアに迷い蟌んでしたうので、これぞシリコンバレヌずいう感じの堎所でした。 Twitter X本瀟 圓時は、この看板が倖れるずは思いたせんでしたが、Twitterの看板が倖れる前に芋るこずができおよかったです たずめ 今回の海倖カンファレンスぞの参加では、垰囜しおすぐにコヌドベヌスの改善に掻かせる情報から、これからのAndroidを取り巻く情報たでの幅広い知芋たちだけではなく、実際にその堎にいるこずによっお埗られる肌感芚のようなものや海倖の開発者ずの新しい出䌚いなど、絶察にその堎にいないず埗られないものをたくさん持ち垰っおくるこずができたず思いたす。 たた、タむミヌでは䞀緒にサヌビスを成長させおいく方を募集しおいたす。もし少しでも興味を持っおいただけたら、カゞュアル面談受け付けおおりたすので是非䞀床お話ししたしょう product-recruit.timee.co.jp
こんにちは、マッチング領域でバック゚ンド゚ンゞニアをしおいるぜこひで ( @pokohide ) です。 前回はRails edgeでCIを回し始めた話を玹介したした。 tech.timee.co.jp 今回は、実際に匊瀟でCIをRails edgeで回し始めた事で芋぀けた゚ラヌの䟋を玹介しおいきたす。蚘事公開時点2023幎7月のバヌゞョンは䞋蚘の通りです。 $ ruby -v ruby 3.2.2 (2023-03-30 revision e51014f9c0) +YJIT [aarch64-linux] $ rails -v Rails 7.0.6 ActiveRecord::DangerousAttributeError object_id is defined by Active Record この゚ラヌに関する参考蚘事はこちらです。 euglena1215.hatenablog.jp 䞀郚のモデルで object_id ずいうカラム名を定矩しおいたため以䞋のような゚ラヌが発生し、そのレコヌドを生成しおいるテストが軒䞊み萜ちたした。 ActiveRecord::DangerousAttributeError: object_id is defined by Active Record. Check to make sure that you don't have an attribute or method with the same name. # /usr/local/bundle/gems/factory_bot-6.2.1/lib/factory_bot/decorator/new_constructor.rb:9:in `new' # /usr/local/bundle/gems/factory_bot-6.2.1/lib/factory_bot/decorator.rb:16:in `send' ... Objectクラスで、オヌバヌラむドされるず予期せぬ圱響を䞎えうるメ゜ッド名ず同じ名前を利甚できなくなったからでした。 object_id に限らず dup , freeze , hash , class , clone なども利甚できなくなるのでそういったカラム名を䜿わないようにする必芁がありたす。 この゚ラヌは object_id を object_identifier ずリネヌムする事で察応したした。 Rails7.0.5.1からの create_association の挙動倉化による゚ラヌ 巷で話題のcreate_associationの挙動倉曎による゚ラヌです。既存レコヌドが存圚する堎合にナニヌク制玄によりバリデヌション゚ラヌが発生するずいっおテストケヌスがありたしたが、そちらのテストが萜ちたした。Rails edgeを回し始めた頃はRails v7.0.4だったため、この゚ラヌに遭遇したした。 Rails v7.0.5.1から create_association の挙動が「別々のトランザクションでinsertしおからdeleteする」から「同䞀トランザクションでdeleteしおからinsertする」に倉わりたした。この圱響により、DBのレコヌドに䟝存するバリデヌション䟋 validates_uniquness_of が効かなくなりたした。この挙動倉化に関する内容はこちらをご参考ください。 blog.willnet.in parser gemを利甚しおcreate_associationの呌び出し箇所を調査し、圱響範囲を䞀぀ず぀確認、必芁な箇所に条件文を远加するなどしお察応したした。 既にリリヌスされおいる倉曎ではありたすが、Rails edgeでCIを回し始めたこずで早期に問題を発芋でき、create_association削陀する前に怜蚌を挟む新しいオプションの提案をrails/railsぞのPR *1 を通しお行うなどしたした。 NoMethodError: undefined method `reading_role' for ActiveRecord::Base:Class Rails7.1から ActiveRecord::Base.reading_role がなくなるため、この蚘述を行っおいた箇所のテストが萜ちたした。 irb(main): 002 : 0 > ActiveRecord :: Base .reading_role { " severity " : " WARN " , " message " : " DEPRECATION WARNING: ActiveRecord::Base.reading_role is deprecated and will be removed in Rails 7.1. \n Use `ActiveRecord.reading_role` instead. \n (called from xxxxx) " } => :reading irb(main): 003 : 0 > ActiveRecord :: Base .writing_role { " severity " : " WARN " , " message " : " DEPRECATION WARNING: ActiveRecord::Base.writing_role is deprecated and will be removed in Rails 7.1. \n Use `ActiveRecord.writing_role` instead. \n (called from xxxxx) " } => :writing この問題に関しおは元々出おいたWarningの内容に埓い、 ActiveRecord.reading_role を代わりに䜿う事で察応したした。 partialsにむンスタンス倉数をlocalsずしお枡す挙動が削陀されたこずによる゚ラヌ 匊瀟では請求曞PDFを生成するために ActionController::Base#render_to_string を甚いおHTML文字列を取埗しおいたす。その凊理の䞭でpartialsにむンスタンス倉数をlocalsずしお枡しおいたしたが、そこで゚ラヌが発生したした。 今たでWarningが出おいた内容ではありたすが、Rails7.1からむンスタンス倉数をlocalsで枡せなくなったためです *2 。 むンスタンス倉数ではなくロヌカル倉数ずしお枡すこずで察応を予定しおいたす。 before_type_castの返り倀の型が倉わったこずによる゚ラヌ # create_table :posts, force: true do |t| # t.integer :foo, default: 1, null: false # end class Post < ActiveRecord :: Base enum foo : { x : 1 , y : 2 } end Integer型でEnumを定矩しおいるカラム foo を持぀モデルのレコヌドに察しお record.foo_before_type_cast で参照するず、元々の環境ではInteger型で返っおいたものが、Rails edge環境䞋ではString型で返るようになったため萜ちおいるテストケヌスを芋぀けたした。 record = Post .new( foo : :x ) # 怜蚌圓時の環境(Rails v7.0.6) record.foo_before_type_cast => 1 # Rails edge record.foo_before_type_cast => " 1 " 今回の゚ラヌを再珟するコヌド *3 を甚意し、 git bisect *4 を利甚しお二分探玢で挙動が倉わったをコミットを調査したした。その埌のコミットやPRを远ったずころ、rails v7.1からDBの型で倀を取埗する *_for_database が远加されおいるこずに気づいたため、その実装をバックポヌトしお䜿うように修正するこずで察応を行いたした。 # frozen_string_literal: true case Rails :: VERSION :: STRING when /^ 7 \. 0 / # 以䞋の定矩を読み蟌むために䜕もしない。 when /^ 7 \. 1 / # v7.1 には含たれおいるため読み蟌たない。 return else # v7.2 以降で削陀し忘れないように䟋倖を投げる。 raise ( ' Consider removing this patch ' ) end module ActiveRecord module AttributeMethods module BeforeTypeCast # refs: https://github.com/rails/rails/pull/46283 def read_attribute_for_database (attr_name) name = attr_name.to_s name = self .class.attribute_aliases[name] || name attribute_for_database(name) end end end end 最埌に 今回は、Rails edgeでCIを回すこずによっお芋぀けた将来動かなくなるコヌドの早期発芋やその察応、原因に぀いおの簡単な解説を行いたした。たた玹介しきれおいないですが、゚ラヌだけでなくRails 7.2からの廃止予定を知らせるWarningもいく぀か確認できたした。 Rails edge導入圓初は112個のテストケヌスが萜ちたしたが、埐々に察応を行なっおいき萜ちるテストケヌスは22件にたで枛りたした。こういった掻動を継続するこずでRubyやRailsのコミュニティの進化に远随できるので匕き続き頑匵っおいこうず思いたす。 タむミヌでは䞀緒にサヌビスを成長させおいく方を募集しおいたす。もし少しでも興味を持っおいただけたら、カゞュアル面談受け付けおおりたすので是非お話ししたしょう product-recruit.timee.co.jp *1 : https://github.com/rails/rails/pull/48643 *2 : https://github.com/rails/rails/commit/8241178723d02123734a1efd01c12b9fda2f4fea *3 : https://gist.github.com/pokohide/b310ea180e7de0467360c96debbb8363 *4 : https://git-scm.com/docs/git-bisect
こんにちは、タむミヌのデヌタ統括郚デヌタサむ゚ンス以䞋DSグルヌプ所属の小関です。 今回はDSグルヌプがMLパむプラむン構築時に掻甚しおいるVertex AI Pipelinesを効率的に開発するための取り組みを玹介したいず思いたす Vertex AI Pipelinesずは Vertex AI Pipelines ずは、Google Cloudが提䟛しおいるMLパむプラむンをサヌバヌレスに構築・実行できるサヌビスです。 Vertex AI Pipelinesを掻甚するこずで、䞋蚘のようなデヌタをBigQeuryから取埗し、特城量の䜜成・デヌタセットの分割埌、モデルを孊習するようなML パむプラむンが比范的容易に構築できたす。 Vertex AI Pipelinesで構築したMLパむプラむンのサンプル Vertex AI Pipelinesの掻甚事䟋ず挙げられた改善点 タむミヌのDSグルヌプでは、䞋蚘のようなML パむプラむンをVetex AI Pipelinesで開発・運甚しおいたす。 ワヌカヌに察しお、おすすめの募集を出力するパむプラむン クラむアントの離脱を予枬するパむプラむン 各皮KPIを予枬するパむプラむン ML パむプラむンを構築しおいく䞊で、以䞋のような改善点が挙げられおいたした。 パむプラむンのリポゞトリのディレクトリ構成や、CI/CDを共通化したい Google Cloud䞊での凊理を共通化し、より䜿いやすい圢で凊理を呌び出せるようにしたい 各パむプラむンに必ず入れ蟌む必芁があるKubeflow Pipelines *1 の蚘述を共通化したい Vertex AI Pipelinesを効率的に開発するための取り組み 挙げられた課題に察しお、DSグルヌプでは以䞋の3぀の取り組みを行なっおいたす。 1. Vertex AI Pipelines開発甚のテンプレヌトリポゞトリの構築 cookiecutter を䜿甚しお、パむプラむン開発に関わるディレクトリや、CI/CDに甚いるyaml, shell scriptを生成しおくれるテンプレヌトを䜜成したした。パむプラむンの開発開始時にこのテンプレヌトを利甚しおいたす。 䞋蚘のようにcookiecutterコマンドでプロゞェクトを生成し、プロゞェクト名・プロゞェクトの説明・Pythonのバヌゞョン・䜜成者を入力するこずで、開発甚のテンプレヌトが生成されたす。 $ cookiecutter [開発甚のテンプレヌトリポゞトリのパス] > project_name [project_name]: > project_description []: > python_version [3.10.1]: > author [timee-dev]: # Vertex AI Pipelines開発甚のテンプレヌト . ├── .github │   ├── PULL_REQUEST_TEMPLATE.md │   └── workflows │   ├── CI/CDのyamlファむル ├── .gitignore ├── Makefile ├── README.md ├── pyproject.toml ├── src │   └── pipeline_template │   ├── components │   │   └── component │   │   ├── パむプラむンを構成するコンポヌネントの゜ヌスコヌドずDockerfile │   ├── pipelines │   │   ├── パむプラむンをコンパむル、実行するための゜ヌスコヌド │   ├── pyproject.toml └── tests ├── テストコヌド 2. Google Cloudの凊理を集玄した瀟内ラむブラリの構築 Google CloudのPythonラむブラリ をラップしお、BigQueryでのク゚リ実行・ク゚リ結果のDataFrame化・テヌブルの曞き蟌みや、Cloud StorageにおけるファむルのI/O凊理などを行える瀟内ラむブラリを構築しおいたす。こちらの瀟内ラむブラリは、DSグルヌプ党䜓で保守・運甚を行なっおおり、バヌゞョン管理ずデプロむの自動化をした䞊で、Artifact Registryにプラむベヌトパッケヌゞずしお眮いお利甚しおいたす *2 。この瀟内ラむブラリに関しおは、Vertex AI Pipelinesに限らずVertex AI WorkbenchやCloud Runなど、他のGoogle Cloudのサヌビスでの実装でも掻甚されおいたす。 簡単な利甚䟋ずしお、SQLファむルのク゚リを実行しお、 pd.DataFrame ずしお取埗する凊理を玹介したす。 # 瀟内ラむブラリからBigQuery関連の凊理をたずめおいるクラスをimport from [瀟内ラむブラリ名].bigquery import BigQueryClient # project_idにGoogle Cloudのプロゞェクト名、sql_dirにSQL fileを栌玍しおいるディレクトリ名を指定 bq_client = BigQueryClient(project_id=PROJECT_ID, sql_dir=SQL_DIR) # test.sql内でJinjaテンプレヌトで定矩されおいるパラメヌタヌをquery_paramsで受け取り、ク゚リの実行結果をpd.DataFrameずしお受け取る test_df = bq_client.read_gbq_by_file( file_name= 'test.sql' , query_params= dict (loading_start_date=LOADING_START_DATE, loading_end_date=LOADING_END_DATE), ) -- SQL_DIR/test.sql DECLARE LOADING_START_DATE DEFAULT ' {{ loading_start_date }} ' ; DECLARE LOADING_END_DATE DEFAULT ' {{ loading_end_date }} ' ; SELECT * FROM `project_id.dataset_id.table_id` WHERE event_data BETWEEN LOADING_START_DATE AND LOADING_END_DATE 3. Kubeflow Pipelinesにおいお共通化できる凊理を集玄した瀟内ラむブラリの構築 コンポヌネント間のアヌティファクトの受け枡し・Cloud StargeぞのI/O凊理や、yamlで定矩されたコンポヌネントの情報を取埗しおくる凊理 *3 などを行える瀟内ラむブラリを構築しおいたす。こちらもDSグルヌプ党䜓で保守・運甚を行なっおおり、バヌゞョン管理ずデプロむの自動化をした䞊で、Artifact Registryにプラむベヌトパッケヌゞずしお眮いお利甚しおいたす。 利甚䟋ずしお、孊習デヌタを受け取り、それを特城量ずタヌゲットに分割するコンポヌネントにおけるアヌティファクトの受け枡し・Cloud StargeぞのI/O凊理の実装を玹介したす。 # pipeline_name/components/component_name/src/main.py from dataclasses import dataclass import pandas as pd from [瀟内ラむブラリ名].artifacts import Artifacts from [瀟内ラむブラリ名].io import df_to_pickle @ dataclass class ComponentArguments : train_dataset_path: str @ dataclass class OutputDestinations : x_train_path: str y_train_path: str def main (args: ComponentArguments) -> pd.DataFrame: train_dataset = pd.read_pickle(args.train_dataset_path) x_cols = [ 'x1' , 'x2' ] y_col = [ 'y' ] X_train, y_train = train_dataset[x_cols], train_dataset[y_col] return X_train, y_train if __name__ == '__main__' : # アヌティファクトのパスを取埗 artifacts = Artifacts.from_args(ComponentArguments, OutputDestinations) # むンプットずなるアヌティファクトのパスを受け取り、main関数を実行 X_train, y_train = main(artifacts.component_arguments) # パむプラむンのアヌティファクトを管理するCloud Storageのバケットぞpickle圢匏でX_train, y_trainを曞き蟌む df_to_pickle(artifacts.output_destinations.x_train_path, X_train) df_to_pickle(artifacts.output_destinations.y_train_path, y_train) 取り組みから感じたメリット 䞊で挙げた取り組みを通じお、グルヌプ党䜓で感じおいる䞻なメリットを玹介しおいきたす。 開発のスピヌドが䞊がる。特にパむプラむンのテンプレヌトが甚意されおいる事で、開発の初動が倧幅に速くなりたした。 テンプレヌトやラむブラリを通しお、ファむル構成や凊理に共通知があるので、メンバヌ間でのレビュヌがしやすくなっおいる。 個別に開発した凊理を瀟内ラむブラリに远加しおいくこずで、グルヌプ党䜓の資産ずしお蓄積しおいる。 属人化されおいるコヌドが枛っおいくので、新芏メンバヌのキャッチアップがし易くなる。 今回玹介した取り組み以倖にも、MLパむプラむンの゜ヌスコヌドのモノリポ化などDSグルヌプでは垞に瀟内のMLOps基盀を匷固にしおいく掻動を続けおいたす We’re Hiring! タむミヌのデヌタ統括郚では、ずもに働くメンバヌを募集しおいたす product-recruit.timee.co.jp *1 : Kubeflow Pipelines SDK で実装したパむプラむンをVertex AI Pipelinesで動䜜させおいたす *2 : Artifact RegistryのプラむベヌトパッケヌゞをPoetryで扱う方法は こちら が参考になりたす *3 : Kubeflow Pipelinesにおけるパむプラむンの定矩ファむルで䜿甚したす
DREグルヌプの 石井 です。 先日ずいっおももうしばらく前ですが、Techmeeずいうむベントで生産性に぀いおトむルの蚈枬をしおそれを䞀定に抑える取り組みをしおいるずいう話をさせお頂きたした 。 https://timeedev.connpass.com/event/275750/ www.youtube.com これはDREグルヌプ内の生産性を維持する=䞀定以䞊のアりトプットが出せる状態を䜜り出すための取り組みでした。 しかし、生産性ずいえば、叀くはコヌド量で蚈枬されおいたような(最も、コヌド量は良い指暙ではありたせんが)ものや今で蚀えばfourkeysずいったようなもので、どれだけアりトプットに繋がっおいるかが倧切になりたす。 私の所属するDREグルヌプでは、䞻に色々なデヌタ゜ヌスからデヌタを抜出し、䟿利に分析しやすい状態にするこずに責任を持぀ず同時に、デヌタ基盀の運甚も担圓しおいたす。 そのため、私達のグルヌプはもずより、他の分析者の生産性を䞊げるこずに責任を持っおいかないずいけたせん。 今回はDREグルヌプで始たったfourkeysによる生産性の蚈枬ず今埌の展望に぀いお曞かせおいただこうず思いたす。 前提ずしおfourkeys 今回の蚈枬に圓たっおはfourkeysをベヌスずしお考えるこずにしたした。 これに぀いおは曞籍や色々な発衚資料などを持り、グルヌプ内で勉匷䌚などを通しおある皋床共通理解を埗お我々の蚈りたいものに察しおたずはこれでいっおみよう、ずいう合意が埗られたためです。 我々が考える生産性に぀いおは埌述したすが、前提ずしおのfourkeysは以䞋の本や資料などを読んでいただけるず理解が進むかず思いたす。 State of DevOps 2021 https://services.google.com/fh/files/misc/state-of-devops-2021.pdf (2022もありたすが、フォヌム入力が必芁なためパブリックに公開されおいるこちらを貌っおいたす)  ゚リヌト DevOps チヌムであるこずを Four Keys プロゞェクトで確認する https://cloud.google.com/blog/ja/products/gcp/using-the-four-keys-to-measure-your-devops-performance 継続的デリバリヌの゜フトりェア工孊 https://bookplus.nikkei.com/atcl/catalog/22/12/01/00531/ DREグルヌプの考える生産性の定矩 我々DREグルヌプは瀟内向けのデヌタ基盀を提䟛するグルヌプです。 ぀たり、生産性蚈枬の察象が1぀のチヌムに閉じるずは限らず、䜕なら耇数グルヌプの掻動が党お終わっお1぀の機胜提䟛が完了するずいうケヌスも倚くありたす。 䟋えば、新芏デヌタを぀なぎ蟌みモデリングした䞊でダッシュボヌドを提䟛しようずするケヌスでは、DREグルヌプだけでなく、モデリングを担圓するBIグルヌプが絡んできたす。このずき、DREグルヌプが担圓するステヌゞング凊理たでが完了したずしおも䟡倀が提䟛できおいるず蚀えるでしょうかそうではなく、デヌタの取り蟌み、ステヌゞング凊理、モデリング、ダッシュボヌド化のすべおが完了しお䟡倀を提䟛できおいるず蚀えるず考えおいたす。 そのため、開発はもちろんですが、その2グルヌプの連携がスムヌズに流れるこずも重芁な芁玠であり、その点も改善の察象ずなっおくるはずです。䟋えば、もしドキュメントが足りなくおBIグルヌプがモデリングに入れないのであればそれをスムヌズに提䟛するべきだし、䟝頌内容が曖昧でヒアリングに時間がかかりすぎるならそこも改善察象かもしれたせん。 ぀たり、スルヌプットずしおは絵にするず以䞋の党䜓で蚈枬・改善を行う必芁があるず考えおいたす。 たた、単に速床だけを远求しおしたうず障害を起こしたくる仕組みになっおしたいかねたせん。 そのため、同時に安定性の指暙ずしお障害も蚈枬する必芁があるのですが、デヌタ基盀の堎合シンプルにデプロむによる倱敗を蚈枬すればよいかずいうずそういうこずでもなく、どうしおもデヌタ゜ヌス偎の倉曎などにより「䜕もしおないのに壊れた」ずいうこずが発生するこずも倚くありたす。 そのあたりを考慮しお実装を考えおいく必芁がありたす。 実装 実装は以䞋の様になりたした。 基本的にDORAが公開しおくれおいる実装を䜿い、Github䞊の営みをBigQuery䞊に収集しおいたす。 デプロむ呚りに぀いおは、 ほずんどのリポゞトリはmain merge時にデプロむ自動化されおいるので、マヌゞをデプロむの代替指暙ずしお採甚する 障害は珟圚Notion䞊のポストモヌテムDBで管理できおいるのでそこから匕っ匵っおくる ずいうこずにしおいたす。 珟時点では通垞のfourkeysを取埗できるようにしおいたすが、今埌は䞊述した通りのリヌドタむムをNotion䞊にあるバックログなどず連携させお取埗しおいく予定です。 考察ず今埌に぀いお 珟時点ではほが玠のfourkeysが取埗できた状態です。 最初に蚈りたかったものからするずやや乖離がある状態ですが、それでもいく぀かの瀺唆を埗るこずができたした。 䟋えば、dbtのリポゞトリでDREグルヌプのリリヌス速床は十分早いのですが、デヌタのモデリングを行うBIグルヌプはかなりの時間がかかっおおりなにか課題がありそうなこずが特定できたした。 これに぀いおはヒアリングを行っおおり、実際にメンバヌ間でモデリングに぀いおの習熟床や前提条件の理解などの差があるために、レビュヌで倧きな時間がかかっおいるこずがわかりたした。 たた、圓たり前ですがDREグルヌプだずしおも意図しお倧きいPRを出すずマヌゞたでの時間が圧倒的に䌞びおいるこずがわかりたす。 どちらも担圓ベヌスでは理解のあるこずず思いたすが、具䜓的な数倀ずしお芋えおくるず議論の俎䞊にも䞊がりやすく、解決に向けお動きやすくなるのでシンプルなfour keysでも意味のある可芖化なのではないかず思いたす。 ただ、やはりこれでは最初に曞いたような課題は芋えおこない郚分はあるので、少しず぀アップデヌトしおいき、゚ンドツヌ゚ンドのfourkeysを枬れるようにしおより生産性の高いデヌタ基盀を実珟する瀎にしおいければず思っおおり、そのあたりはたたブログ等で発衚できればず思っおいたす。 おわりに 我々DREグルヌプはデヌタ基盀を提䟛する裏方の郚門ではありたすが、デヌタを䜿った業務の生産性を最倧化するために業務に取り組んでいたす。 こういった話に興味がある、少しでも気になった方はお気軜に カゞュアル面談 に申し蟌みいただけるず嬉しいです。
こんにちは、マッチング領域でバック゚ンド゚ンゞニアをしおいるぜこひで ( @pokohide ) です。 冷やし䞭華はじめたした的なタむトルですね。分かりたす。 今回はタむミヌが本番運甚しおいるRailsアプリケヌションに察しおRails edgeでCIを回すようになった話を玹介したす。翌週には「〜芋぀けた゚ラヌ線仮〜」ず題しお、実際に匊瀟で芋぀けた゚ラヌの䟋を玹介しおいきたす。蚘事公開時点2023幎7月のバヌゞョンは䞋蚘の通りです。 $ ruby -v ruby 3.2.2 (2023-03-30 revision e51014f9c0) +YJIT [aarch64-linux] $ rails -v Rails 7.0.6 匊瀟ではRubyもRailsも積極的に最新バヌゞョンにあげる掻動をしおいたす。今回の蚘事はRailsに関しおですが、Rubyのアップグレヌドも同様に行っおいたす。過去にはRuby3.2にし、YJITを有効化にした蚘事を公開しおいるので興味があれば、ご䞀読ください。 tech.timee.co.jp Rails edgeずは? ChatGPTに聞いお楜をしおみたした。 この蚘事ではChatGPTず同様に rails/rails のmainブランチを指すこずずしたす。 Rails edgeは、安定版ではなく開発版なので以䞋のような特城がありたす。 将来のリリヌスで利甚可胜になるかもしれない新機胜が含たれおいる 正匏リリヌスされおいない既知のバグ修正が含たれおいる 安定版ではなく、ただ評䟡されおいない機胜やバグが含たれおいる可胜性があるため、本番環境で䜿甚する際には泚意が必芁です。GitHubでは、毎週本番環境で䜿うRailsをedgeにアップデヌトしおいるそうです *1 。 なぜRails edgeでCIを回すのか タむミヌでは、RubyやRailsのコミュニティの進化に継続的に远随するこずで、高速化や機胜远加などの恩恵を受け、ナヌザヌに最倧限の䟡倀を提䟛しおいきたいず考えおいたす。 Rails edgeでは、将来のリリヌスで利甚可胜になる新機胜を事前に怜査できるため、朜圚的な圱響を確認するこずができたす。たた、バグや互換性の問題を早期に発芋し、解決策を芋぀けるこずも可胜です。その他にも、最新の機胜や修正に関しお䜕かあれば、安定版リリヌス前に異議申し立おをしやすいずいったメリットもありたす。 これらの利点を考慮し、Rails edgeでCIを回すこずにしたした。 Rails edgeでCIを回す rails以倖のgemはそのたた利甚したいため、既存のGemfileを読み蟌み、railsのみを rails/rails に䞊曞きするこずでRails edge甚のGemfileを甚意したす。 # frozen_string_literal: true # 既存のGemfileを読み蟌む eval_gemfile File .expand_path( ' ../Gemfile ' , __dir__ ) # 䞊曞きしたい䟝存関係を削陀する dependencies.delete_if { |d| d.name == ' rails ' } # rails/railsのメむンブランチに䞊曞きする gem ' rails ' , branch : ' main ' , github : ' rails/rails ' 䜿甚するgemのバヌゞョンが倉曎されたので専甚のlockファむルを甚意する必芁がありたす。 BUNDLE_GEMFILE を指定する事で指定したGemfileを䜿甚できたす。 $ BUNDLE_GEMFILE=gemfiles/rails_edge.gemfile bundle install これによりRails edgeず他のGemずの䟝存関係を定矩したファむルの甚意が完了したす。次にこれらのファむルを利甚しおCIでテストを実行する準備をしおいきたす。実際の蚭定ファむルを簡略化しお玹介しおいたす。なお、匊瀟ではCIツヌルずしおCircleCIを利甚しおいたす。 version : 2.1 orbs : ruby : circleci/ruby@2.0.1 jobs : test : parameters : gemfile : type : string default : Gemfile environment : BUNDLE_GEMFILE : << parameters.gemfile >> BUNDLE_PATH_RELATIVE_TO_CWD : true docker : - image : cimg/ruby:3.2.2 steps : - checkout - ruby/install-deps : key : gems-<< parameters.gemfile >> gemfile : << parameters.gemfile >> - run : name : Test command : bundle exec rspec workflows : version : 2 workflow : jobs : - test : filters : branches : only : - master - /^rails_edge.*$/ matrix : parameters : gemfile : - "gemfiles/rails_edge.gemfile" 今回はmasterブランチず rails_edge.* ブランチでのみ実行するようにしたした。 Orb - circleci/ruby で定矩されるコマンドである install-deps ではgemfileパラメヌタを枡すず指定したGemfileを利甚しおbundle installを実行しおくれるため、その機構を利甚しおいたす。 たた、 BUNDLE_PATH_RELATIVE_TO_CWD を利甚するこずで、Gemfileではなくカレントディレクトリに察しお盞察的にパスを指定するのでGemの競合を回避でき、キャッシュを有効掻甚できたす。 Rails edgeで萜ちるテストに印を぀ける 埌出しですが今回の目的は「 Rails edgeでCIを回す 」こずであり、党おのテストを修正するこずではありたせんでした。そこで、今回は萜ちたテストをpendingするこずにしたした。 skipではなくpendingを採甚したのは、mainブランチの远埓によりテストが成功する可胜性があるためです。skipはテストの成功・倱敗に限らずテストを実行したせんが、pendingはテストの倱敗時のみ保留にするため修正に気づくこずができたす。 䟿宜䞊、これから出るであろうRails7.1で動かないこずずそれたでに盎すぞずいう意味合いも蟌めお以䞋のようなメッセヌゞを衚瀺するようにしおいたす。ここは適圓に倉えおいただくのが良いかず思いたす。 # frozen_string_literal: true module PendingIfRailsEdge def pending_if_rails_edge ' PENDING: Rails 7.1で動くように盎す ' if Rails :: VERSION :: STRING .start_with?( ' 7.1 ' ) end end RSpec .configure do |config| config.extend PendingIfRailsEdge end 以䞋のように䜿えたす。こうするこずでテストコヌドをgrepした時に萜ちおいるコヌドをすぐに芋぀けるこずができるの䟿利でもありたす。 context ' foo ' , pending : pending_if_rails_edge do ... end it ' bar ' , pending : pending_if_rails_edge do ... end これでRails edgeでCIを回すこずができるようになりたした。 Rails edge甚のlockファむルを远埓させる masterブランチず rails_edge.* ブランチでRails edgeでCIを回す運甚を開始しおから、featureブランチでGemの远加や削陀を行ったが rails_edge.gemfile の曎新を忘れおmasterブランチにマヌゞしたため、masterブランチでRails edgeでのCIがfailするケヌスが発生したした。 本番環境に圱響がないずはいえmasterブランチのCIがfailしおいるのはモダモダするこずや、せっかく導入した仕組みが圢骞化しおしたうため、masterブランチマヌゞ前に気づける仕組みを導入したした。 具䜓的には BUNDLE_GEMFILE=gemfiles/rails_edge.gemfile bundle install を実行しお差分が発生すれば倱敗するステップを远加し、featureブランチでも実行するようにしたした。 jobs : check_outdated_gemfile : parameters : gemfile : type : string docker : - image : cimg/ruby:3.2.2 steps : - checkout - ruby/install-deps : key : gems-<< parameters.gemfile >> gemfile : << parameters.gemfile >> - run : name : re-bundle install command : bundle install - run : name : check file changes command : | if [ `git diff --name-only << parameters.gemfile >>.lock` ] ; then echo 'Please run `BUNDLE_GEMFILE=<< parameters.gemfile >> bundle install`' exit 1 else exit 0 fi 最埌に 今回はRails edgeでCIを回し始めた背景や導入する方法に぀いお玹介したした。 今回の取り組みを通しお、将来のRailsアップグレヌドにおいお遭遇するであろうバグに早期に気づき、迅速な察応ができるようになりたした。ただGitHubのように *1 、 Rails edgeを毎週取り蟌める状態ではないですが、匕き続き頑匵っおいこうず思いたす。 次回は、Rails edgeでCI回し始めたこずで芋぀けた問題を玹介しおいきたす。蚘事公開時には公匏Twitter ( @TimeeDev ) でアナりンスしおいくのでフォロヌしおいただけるず嬉しいです。 たた、タむミヌでは䞀緒にサヌビスを成長させおいく方を募集しおいたす。もし少しでも興味を持っおいただけたら、カゞュアル面談受け付けおおりたすので是非お話ししたしょう product-recruit.timee.co.jp *1 : https://github.blog/2023-04-06-building-github-with-ruby-and-rails
こんにちは、タむミヌのデヌタ統括郚デヌタサむ゚ンス以䞋DSグルヌプ所属の 小栗 です。 今回は、DSグルヌプのメンバヌにおすすめの本を聞いおみたのでご玹介したす *1 おすすめ本を通しお、DSグルヌプの雰囲気や、業務で掻甚するスキル・知識に぀いお、みなさんに䌝わればいいなず考えおいたす。 デヌタサむ゚ンスDSグルヌプの玹介 本題に入る前に、軜くDSグルヌプの玹介をさせおください。 DSグルヌプは、タむミヌの事業成長をデヌタ・アルゎリズムで支揎するこずを目的ずしおいたす。 䟋えば、以䞋のような業務を日々行なっおいたす。 Google Cloudを利甚した機械孊習パむプラむン基盀の開発・運甚 ナヌザヌぞ仕事を掚薊するレコメンド゚ンゞンの開発 営業掻動を支揎する予枬モデルの開発 ビゞネス斜策の効果怜蚌 珟圚、専任・兌任・業務委蚗のメンバヌで構成されおおり、今埌も芏暡を拡倧する予定です。 Web䌁業、コンサル䌁業、AIベンチャヌなどで、デヌタサむ゚ンティスト/機械孊習゚ンゞニアずしお経隓を積んできたメンバヌが圚籍しおいたす。 特に、機械孊習システム蚭蚈、機械孊習モデル実装、効果怜蚌などに匷みがあるメンバヌが揃っおいたす。 DSグルヌプおすすめ本の玹介 それでは、DSグルヌプの各メンバヌに聞いた「心からおすすめできる本」を、掚薊メンバヌからのコメントを茉せ぀぀玹介したす。 ゞャンルずしおは、機械孊習、因果掚論、開発、組織に関する曞籍を取り䞊げたす。 機械孊習のおすすめ本 Rによる統蚈的孊習入門 Rによる 統蚈的孊習入門 䜜者: Gareth James , Daniela Witten , Trevor Hastie , Robert Tibshirani 朝倉曞店 Amazon メンバヌからのコメント↓ カステラ本ずしお有名な 『統蚈的孊習の基瀎』 を手掛けた著者が曞いた、機械孊習の入門曞。 『統蚈的孊習の基瀎』は良曞ではあるものの内容・分量がヘビヌなので、実務家に䞀番最初におすすめしたいのはコレかなず思っおたす。 説明の平易さが適切であり、個人的に入門曞の䞭で䞀番わかりやすかったです。 ベむズ掚論による機械孊習入門 機械孊習スタヌトアップシリヌズ ベむズ掚論による機械孊習入門 䜜者: 須山敊志 講談瀟 Amazon メンバヌからのコメント↓ ベむズ掚論による孊習・予枬を䞁寧に数匏レベルで远うこずができる良曞です。 ギブスサンプリングや倉分掚論を理論から理解したい方におすすめしたいです。 自然蚀語凊理の基瀎 IT Text 自然蚀語凊理の基瀎 䜜者: 岡盎芳 , 荒瀬由玀 , 鈎朚最 , 鶎岡慶雅 , 宮尟祐介 オヌム瀟 Amazon メンバヌからのコメント↓ 自然蚀語凊理の基瀎から始たり、近幎の深局孊習ベヌスの手法たで䞁寧に解説した本。 Transformer、BERT、GPTなど、倧芏暡蚀語モデルの興隆を支える新しい技術の解説もあり、和曞ずしおは貎重です。 掚薊システム実践入門 掚薊システム実践入門 ―仕事で䜿える導入ガむド 䜜者: 颚間 正匘 , 飯塚 掞二郎 , 束村 優也 オラむリヌゞャパン Amazon メンバヌからのコメント↓ 掚薊システムに぀いお、アルゎリズムの解説に留たらず、䌁画段階やデザむンたで幅広く扱った実践的な䞀冊です。 本曞を教材にDSグルヌプで勉匷䌚を開くなど、実務で重宝したした 因果掚論のおすすめ本 効果怜蚌入門 効果怜蚌入門〜正しい比范のための因果掚論蚈量経枈孊の基瀎 䜜者: 安井 翔倪 技術評論瀟 Amazon メンバヌからのコメント↓ RCTだけでなく、芳察デヌタを甚いた因果掚論の手法をわかりやすく解説した、実務家向けの䞀冊。 DSグルヌプではビゞネス斜策の効果怜蚌を行うこずも倚く、仕事をする䞊で基瀎になっおいたす。 DSグルヌプず同じ郚眲に属するBIグルヌプも勉匷䌚で本曞を䜿っおいたので、䞀緒にわいわい孊びたした。 統蚈的因果掚論の理論ず実装 統蚈的因果掚論の理論ず実装 Wonderful R 䜜者: 高橋将宜 , 石田基広 , 垂川倪祐 , 高橋康介 , 高柳慎䞀 , 犏島真倪朗 , 束浊健倪郎 共立出版 Amazon メンバヌからのコメント↓ 図衚を亀えた解説がわかりやすい、理論ず実装のバランスが良いなど、非垞に掗緎された曞籍です。 『効果怜蚌入門』では深く説明されなかった手法も解説されおおり、䜵せお読むのがおすすめです。 開発系のおすすめ本 ロバストPython ロバストPython ―クリヌンで保守しやすいコヌドを曞く 䜜者: Patrick Viafore オヌム瀟 Amazon メンバヌからのコメント↓ Pythonで保守しやすい、堅牢なコヌドを曞くための情報がよくたずたっおいたす。 機械孊習モデリングやデヌタ凊理を含む実隓コヌドを本番環境に乗せおいく際に、本曞や 『リヌダブルコヌド』 に立ち返っお開発やレビュヌするこずを意識しおいたす。 単䜓テストの考え方/䜿い方 単䜓テストの考え方/䜿い方 䜜者: Vladimir Khorikov マむナビ出版 Amazon メンバヌからのコメント↓ 単䜓テストの考え方を網矅的か぀深くたずめた曞籍。 DSグルヌプではアドホック分析のコヌド以倖はテストを実装するこずにしおいるため、䟡倀のあるテストケヌスを぀くるため手元に眮いおいる䞀冊です。 デヌタマネゞメントが30分でわかる本 デヌタマネゞメントが30分でわかる本 䜜者: ゆずたそ , はせりょ , 株匏䌚瀟颚音屋 Amazon メンバヌからのコメント↓ 䞭身も芋た目もヘビヌすぎる DMBOK を独自に芁玄しおたずめた本。 DMBOKの本質が簡朔にたずめられおおり、倧半のケヌスではこちらを参照するこずで問題を解決できる気がしおいたす。 ゜フトりェア芋積り 人月の暗黙知を解き明かす ゜フトりェア芋積り 人月の暗黙知を解き明かす 䜜者: スティヌブ マコネル 日経BP Amazon メンバヌからのコメント↓ 有名な「䞍確実性コヌンプロゞェクトの進行に䌎っお䞍確実性が枛少するこずを衚した図」の初出本。 ゜フトりェア開発における芋積もりに関しお、本質的な芖点を提䟛しおくれたす。 開発に関わるすべおの人におすすめできる曞籍です。 組織系のおすすめ本 ゚ンゞニアリング組織論ぞの招埅 ゚ンゞニアリング組織論ぞの招埅 䞍確実性に向き合う思考ず組織のリファクタリング 䜜者: 広朚 倧地 技術評論瀟 Amazon メンバヌからのコメント↓ ゚ンゞニアリング組織における課題の解決方法に぀いおたずめられた本。 アゞャむル的な思考や、䞍確実性の考え方ぱンゞニアだけでなくデヌタサむ゚ンティストにずっおも重芁なので、おすすめです。 恐れのない組織 恐れのない組織――「心理的安党性」が孊習・むノベヌション・成長をもたらす 䜜者: ゚むミヌ・C・゚ドモンド゜ン , 村瀬俊朗 英治出版 Amazon メンバヌからのコメント↓ 「心理的安党性」の提唱者である゚ドモンド゜ン博士が、心理的安党性が組織にもたらす圱響に぀いおたずめた本。 関連曞籍は今たくさんあるのですが、これ䞀冊読めば心理的安党性のコアがわかり、応甚が効くず思っおいたす。 デヌタ統括郚では 心理的安党性勉匷䌚 を開催するなど、文化の浞透をはかっおいたす。 We’re Hiring! タむミヌのデヌタ統括郚では、こういったおすすめ本の情報が日々Slackに飛び亀っおいたり、勉匷䌚を定期的に行なっおいたりしたす。 孊習意欲や奜奇心のある人にずっお嬉しい環境ではないかず、手前味噌ながらいちメンバヌずしお思っおいたす。 タむミヌでは、デヌタサむ゚ンティストや゚ンゞニアをはじめ、䞀緒に働くメンバヌを募集しおいたす product-recruit.timee.co.jp *1 : 先日、デヌタ統括郚メンバヌのおすすめ本も note で玹介したしたので、興味があればご䞀読ください。
はじめに 初めたしお、タむミヌのDREチヌムData Reliability Engineering Teamで゚ンゞニアをしおたす、筑玫です。 今回DREチヌムで実斜した合宿぀いおご玹介させお頂こうず思いたす。 DREのカルチャヌを少しでも知っお頂けたら嬉しいです。 DREチヌムに぀いお玹介 DREチヌムでは、瀟内の様々デヌタを集玄し、クレンゞングを行い、瀟内倖で利掻甚できる圢で提䟛するためのデヌタ基盀プロダクトの開発・運甚を行なっおおりたす。 デヌタ基盀の詳现に぀いおは、ProductOwner以降POず蚘茉の土川の蚘事をご参照ください。 tech.timee.co.jp 今幎の4月に私を含め2人入瀟したこずでメンバヌの入れ倉えもあり、デヌタ基盀の開発䜓制が新しくなりたした。 メンバヌが倧きく倉わったこずもあり、開発を進める䞊で今たでのデヌタ基盀の歎史的背景や方向性の理解にメンバヌ間で差分があるこずが課題になっおいたした。 DREチヌムのMissionず合宿の目的 DREではチヌムずしおのMissionを定めおいたす。 ここでいうMissionずは、ビゞネスシヌンでよく甚いられる組織やチヌムのMVVMission・Vision・ValueのMissionで、組織やチヌムの存圚意矩、果たすべき䜿呜を指したす。 Missionを定めお、チヌムずしおの明確な目暙をチヌムの共通蚀語にするこずで、チヌムの圹割や責任範囲を明確化し、成果の向䞊や成功に぀ながるデヌタ基盀プロダクトの開発を効率的に進めるこずができたす。 たた、Missionは倖郚ずのコミュニケヌションをスムヌズにし、チヌムのモチベヌションを高める芁玠ずもなりたす。 元々のMissionは以䞋の通りです。 『信頌性の高いデヌタ基盀を敎備し、掻甚のための環境を提䟛する』 ただ、Missionを定矩した頃から時間も経っおいるこず、たたチヌム構成が倧きく倉わったこずもあり、アップデヌトしたい機運が高たっおいたした。 今のチヌムでMissionを再怜蚎するこずで、䞊述の課題も含め解消できるのではずいう話になり、DREチヌムのMissionを決めるワヌクショップを開催するこずになりたした。 合宿の内容 普段はリモヌトワヌクが倚いチヌムですが、合宿は1日だけ東京オフィスに集たり、䌚議宀を貞し切っお実斜するこずになりたした。 Missionを決めるにあたっお、たずは、DREチヌムの存圚意矩に぀いおメンバヌそれぞれポストむットで意芋を出し合い、それを議論しながらクラスタリングしたした。 その結果を基に、Missionの方向性を導き出す圢で進めたした。 ただ、ポストむットの結果からMissionずいう圢で、抜象床高いフレヌズを抜出するこずに苊戊したした。 重芁芖する芁玠に぀いおは、メンバヌ間で認識が抂ね揃っおいたものの最終的にMissionずいう圢でどう衚珟するかに難儀したした。 議論䞭で、元々のMissionに入っおいた、”信頌性”ずいうワヌドを採甚するこずになりたした。 タむミヌのDREチヌムにおける“信頌性”ずは、スピヌド、品質、安定性、ナヌザビリティを総合的に衚珟したものであり、ナヌザがデヌタを利掻甚する䞊で、DREチヌムではこれらの芁玠を特に重芖しおいたす。 特にスピヌドに぀いおは、デヌタが生成されおから掻甚されるたでの時間を短瞮しおいきたいずいうPOの思いがあり、たた、これからリアルタむム性を求められる芁求に察応しおいくためにも枩床感の高い指暙になっおきおいたす。 たた、高い”信頌性”を達成するための手段ずしお、DataOpsずいう芳点を導入するこずになりたした。 DataOpsは、ガヌトナヌ瀟が提唱しおいる抂念で、デヌタパむプラむンの構築、自動化、監芖、デプロむメントの迅速化、デヌタ品質の向䞊などを重芖するこずで、組織のデヌタ管理者ず利甚者の間の連携促進し、デヌタの収集、凊理、分析、展開のプロセスを効率化するためのプラクティスです。 このプラクティスを甚いお、”信頌性”あるデヌタ基盀を構築しおいくこずをMissionずするこずになりたした。 その埌議論が進み、最終的に以䞋のMissionに決たりたした。 『DataOpsを実珟し、信頌性の高いデヌタ基盀プロダクトを提䟛する』 たずめ 日頃このようなチヌムの方向性などを深く話を機䌚が少ないので、ずおも貎重な時間を過ごせたした。 チヌム内でMissionを定めるこずができ、同じ方向を向いおプロダクト開発を進めおいけそうで、メンバヌ間での満足床も高く、良かったず思いたす。 たた、それ以䞊にチヌムで議論しながら、デヌタ基盀プロダクトの構想や方向性をPO+開発メンバヌ間で共有できたずいう、その過皋にずおも䟡倀がある䌚だったず思いたす。 今回定めたMissionを持っおデヌタ基盀プロダクトの成長を加速させおいきたいず思っおたす。 最埌に、タむミヌでぱンゞニア・デヌタサむ゚ンティストを初め、様々な職皮のメンバヌを募集しおたす product-recruit.timee.co.jp
こんにちは。2023幎1月に株匏䌚瀟タむミヌに入瀟したバック゚ンド゚ンゞニアの id:euglena1215 です。 RubyKaigi 2023 がずうずう明日に迫っおきたした。楜しみですね。 タむミヌは RubyKaigi で初めおブヌス出展を行いたす。至らぬ点もあるかず思いたすが、RubyKaigi を䞀緒に盛り䞊げおいければず思っおいたすどうぞよろしくお願いしたす。 今回はタむミヌが本番運甚しおいる Rails アプリケヌションに察しお Ruby 3.2.2 ぞのアップデヌトず YJIT の有効化を行い、パフォヌマンスが倧きく改善したこずを玹介したす。 RubyKaigi で「Ruby 3.2+YJIT 本番運甚カンパニヌです」ず蚀いたいので粛々ず進めおいる — Shintani Teppei (@euglena1215) 2023幎4月19日 前提 タむミヌを支えるバック゚ンドの Web API は倚くのケヌスで Ruby の実行よりも DB がボトルネックの䞀般的な Rails アプリケヌションです。JSON ぞの serialize は active_model_serializers を利甚しおいたす。 今回の集蚈では API リク゚ストぞのパフォヌマンス圱響のみを集蚈し、Sidekiq, Rake タスクずいった非同期で実行される凊理は集蚈の察象倖ずしおいたす。 今回は Ruby 3.1.2 から Ruby 3.2.2 ぞのアップデヌトず YJIT 有効化を同時に行いパフォヌマンスの倉化を確認したした。そのため、パフォヌマンスの倉化には Ruby のバヌゞョンアップによる最適化ず YJIT 有効化による最適化の䞡方の圱響があるず考えられたすがご容赊ください。 結果 以䞋のグラフは API リク゚スト党䜓のレスポンスタむムの 50-percentile です。アップデヌト前埌でレスポンスタむムが 箄10%高速化されおいる こずが確認できたした。 API リク゚スト党䜓のレスポンスタむムの 50-percentile リク゚スト党䜓ずしおは倧きく高速化されおいるこずが確認できたした。それでは、レスポンスが遅く、時間圓たりのリク゚スト数が倚いアプリケヌションの負荷の倚く占める゚ンドポむントではどうでしょうか そこで、タむミヌの Web API のうち2番目に合蚈の凊理時間 *1 が長い゚ンドポむントぞのパフォヌマンス圱響を確認したした。 *2 以䞋のグラフは2番目に合蚈の凊理時間が長い゚ンドポむントのレスポンスタむムの 50-percentile です。Ruby アップデヌトの数日前に GW 䞭の負荷察策のためのスケヌルアりトを実斜したこずで倉化が少し分かりにくくなっおいたすが、Ruby 3.1.2 から Ruby 3.2.2+YJIT にしたこずによっお 10%以䞊高速化されおいる こずが確認できたした。 2番目に合蚈の凊理時間が長い゚ンドポむントのレスポンスタむムの 50-percentile 元々十分に高速な゚ンドポむントだけでなく、アプリケヌション負荷の倚くを占めおいた゚ンドポむントのパフォヌマンスも改善されおいるこずが分かりたす。Ruby 3.2 アップデヌト+YJIT 有効化はパフォヌマンスチュヌニングぞの十分実甚的な打ち手ず蚀えるのではないでしょうか。 たずめ Ruby 3.1.2 から Ruby 3.2.2 ぞのアップデヌトず YJIT を有効にしたこずでリク゚スト党䜓のレスポンスタむムの 50-percentile が玄10%高速化されたした。たた、アプリケヌション負荷の倚くを占めおいた゚ンドポむントも同様に10%以䞊高速化されおいるこずを確認できたした。 Ruby 3.2’s YJIT is Production-Ready でも YJIT によっお Shopify が 5~10% 高速化されたず蚘されおいるこずから、「Ruby 3.2 の YJIT は䞀般的な Rails アプリケヌションを 10%皋床高速化させる」ず考えお良いのではないかず思っおいたす。 これほどの高速化に尜力しおいただいた Ruby コミッタヌのみなさん、本圓にありがずうございたした。 䜙談ではありたすが、自瀟で YJIT を有効化したこずによっお YJIT ずいう技術がより自分ごずになり、内郚で䜕が行われおいるのかをきちんず理解したいず思うようになりたした。 RubyKaigi 2023 で理解を深めようず思いたす。 宣䌝 冒頭で説明したように、タむミヌは RubyKaigi 2023 でブヌス出展を行いたす。今回の蚘事ではパフォヌマンス改善の結果のみ玹介したしたが、タむミヌでのこういった技術改善における取り組み方など話したいこずは色々あるので、ぜひブヌスでお話しさせおください たた、RubyKaigi 埌 5/16火にはスポンサヌ振り返り䌚を Qiita さん、Wantedly さんず実斜予定です。 「自分の䌚瀟も RubyKaigi スポンサヌをしおほしいず思っおいる゚ンゞニア」をタヌゲットにしたちょっずニッチな䌚ですが、もしかしお自分タヌゲットかも ず思う方はぜひご参加ください wantedly.connpass.com *1 : 合蚈の凊理時間 = 平均レスポンスタむム x hits数 *2 : 最も合蚈の凊理時間が長い゚ンドポむントはGWの繁閑の圱響でレスポンスタむムに倉化が生じ、比范が困難であったため陀倖しおいたす。
こんにちは。2022幎11月に株匏䌚瀟タむミヌに入瀟した sinsoku です。 最近は GitHub Actionsの YAML を曞く機䌚が倚く、 YAML も耇雑化しおきたした。 しかし、日垞的に YAML を觊っおいる職人以倖にはパッず読めないこずも倚いので、瀟内の方々が読めるように GitHub Actionsの YAML の曞き方をたずめたいず思いたす。 目次 䞉項挔算子 環境倉数env 倉数outputs 関数workflow_call 関数 + 配列dynamic matrix GitHub CLIの掻甚 たずめ 䞉項挔算子 GitHub Actions には 䞉項挔算子 がないため、代わりに論理 挔算子 を䜿いたす。 - steps : - run : echo "${{ (github.ref == 'refs/heads/main' && 'production') || 'staging' }}" 参考: Expressions 環境倉数 env 環境倉数 を䜿いたい堎合は env で定矩したす。 env : TIMEE_CEO : ryo TIMEE_CTO : kameike jobs : job-env : runs-on : ubuntu-latest steps : - run : echo $TIMEE_CEO # この実装だず眮換埌の文字列 `echo kameike` を実行する - run : echo ${{ env.TIMEE_CTO }} ただし、 env で env の倀を指定するず゚ラヌになるケヌスがあるので泚意しおください。 env : DEPLOY_ENV : ${{ (github.ref == 'refs/heads/main' && 'production' ) || 'staging' }} # Unrecognized named-value: 'env'. Located at position 1 within expression: env.DEPLOY_ENV == 'production' IS_PROD : ${{ env.DEPLOY_ENV == 'production' }} jobs.<job_id>.env でも同様の゚ラヌが出たす。 jobs : job-error : runs-on : ubuntu-latest # Unrecognized named-value: 'env'. Located at position 1 within expression: env.DEPLOY_ENV == 'production' IS_PROD : ${{ env.DEPLOY_ENV == 'production' }} jobs.<job_id>.steps[*].env であれば゚ラヌになりたせんが、同じ階局の env の倀は参照できたせん。 env : TIMEE_CTO : kameike jobs : job-env : runs-on : ubuntu-latest steps : # この実装だず `echo "true, foo, -bar"` を実行する - run : echo "${{ env.IS_KAMEIKE }}, ${{ env.FOO }}, ${{ env.BAR }}" env : IS_KAMEIKE : ${{ env.TIMEE_CTO == 'kameike' }} FOO : foo BAR : ${{ env.FOO }}-bar 参考: Workflow syntax for GitHub Actions 倉数outputs 汎甚的な名前の 環境倉数 を定矩するず、䜕かの CLI コマンドに圱響する可胜性がありたす。 これを避けるために、outputs で倉数を定矩するこずもできたす。 steps : - id : var run : | echo "x=foo" >> "$GITHUB_OUTPUT" echo "y=bar" >> "$GITHUB_OUTPUT" # この実装だず `echo "foo, bar"` を実行する - run : echo "${{ steps.var.outputs.x }}, ${{ steps.var.outputs.y }}" outputs は env ず違い、 bash の凊理結果を倉数に定矩するこずができたす。 steps : - uses : actions/checkout@v3 - id : var run : | echo "terraform-version=`cat .terraform-version`" >> "$GITHUB_OUTPUT" # この実装だず `echo "1.4.4"` を実行する - run : echo "${{ steps.var.outputs.terraform-version }}" 参考: Defining outputs for jobs 関数workflow_call ワヌクフロヌの䞀郚を別のファむルに定矩し、関数のように呌び出すこずができたす。 # .github/workflows/_say.yml name : say on : workflow_call : inputs : name : required : true type : string jobs : hello : runs-on : ubuntu-latest steps : - run : echo "Hello, ${{ inputs.name }}." bye : needs : hello runs-on : ubuntu-latest steps : - run : echo "Bye, ${{ inputs.name }}." 䜿い方は以䞋の通りです。 jobs : job-say : uses : ./.github/workflows/_say.yml with : name : kameike 参考: Reusing workflows 関数 + 配列dynamic matrix workflows_call の入力には真停倀、数字、文字列しか䜿えたせん。 The value of this parameter is a string specifying the data type of the input. This must be one of: boolean, number, or string. 匕甚: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onworkflow_callinputsinput_idtype しかし、少し工倫するこずで配列を扱うこずができたす。 # .github/workflows/_say_multi.yml name : say_multi on : workflow_call : inputs : names : required : true type : string jobs : matrix : runs-on : ubuntu-latest outputs : names : ${{ steps.set-matrix.outputs.names }} steps : - id : set-matrix run : | names=`echo '${{ inputs.names }}' | jq -csR 'split("\\n") | map(select(. != ""))' ` echo "names=$names" >> $GITHUB_OUTPUT hello : needs : matrix runs-on : ubuntu-latest strategy : matrix : name : ${{ fromJSON(needs.matrix.outputs.names) }} steps : - run : echo "Hello, ${{ matrix.name }}." 䜿い方は以䞋の通りです。 job-say-multi : uses : ./.github/workflows/_say_multi.yml with : names : | ryo kameike GitHub CLI の掻甚 GitHub API を䜿うこずで、チェックアりトせずにファむル名を取埗するこずができたす。 job-gh-matrix : runs-on : ubuntu-latest outputs : files : ${{ steps.set-matrix.outputs.files }} steps : - id : set-matrix run : echo "files=`gh api '/repos/{owner}/{repo}/contents/.github/workflows?ref=${{ github.sha }}' --jq '[.[].name]'`" >> $GITHUB_OUTPUT env : GH_REPO : ${{ github.repository }} GH_TOKEN : ${{ github.token }} job-gh-echo : needs : job-gh-matrix runs-on : ubuntu-latest strategy : matrix : file : ${{ fromJSON(needs.job-gh-matrix.outputs.files) }} steps : - run : echo "${{ matrix.file }}" 画像のようにファむル名の䞀芧で䞊列にJobを実行できたす。 たずめ YAML むずかしいですね。 この蚘事が読んだ方の参考になれば幞いです。 たた、匊瀟の GitHub Actionsやデプロむフロヌに぀いお気になるこずがあれば、フッタヌの採甚ペヌゞのURLから面談の申し蟌みをどうぞ
こんにちは、フロント゚ンド゚ンゞニアの暫犏です。 タむミヌのフロント゚ンドの開発に関わる゚ンゞニアの人数が増えおきたした。倧人数で開発しながら品質を高い状態に保぀には、品質に察する共通認識を䜜るこずが倧切です。 このたび、チヌムでフロむント゚ンドの 単䜓テスト に぀いおの勉匷䌚を開催したした。 testing-library ずいうフロント゚ンドのテストに䜿うラむブラリを䟋に挙げ、具䜓的な手法よりも、テストを実装する前に抑えおおきたい思想に぀いおフォヌカスしたした。 フロント゚ンドでテストしたい項目 フロント゚ンドの単䜓テストを難しくする芁因 testing-library を䜿っお壊れにくいテストを䜜る方法 芁玠を芋぀けるク゚リ ナヌザの動䜜をシミュレヌションする user-event 芁玠の状態を怜査する jest-dom 実際にテストを曞いおみる テストが曞けないケヌス 運甚するずきの泚意点 単䜓テストを䜜る目的を明確にする アクセシビリティのガむドラむンを定める おわりに フロント゚ンドでテストしたい項目 フロント゚ンドでテストしたい項目には次のようなものがあるず思いたす。 ナヌティリティ関数や ビゞネスロゞック が正しく実装されおいるこず 意図しない芋た目の倉曎が起こらないこず ナヌザの動䜜に察しお期埅した正しい応答が返っおくるこず ナヌティリティ関数や ビゞネスロゞック は関数やクラスずしお切り出し、それらに察しおの 単䜓テスト を曞くこずになりたす。基本的には入力に察する出力を確認する出力倀ベヌステストでテストしたす。クラスで実装する堎合にはアクションに䌎っお倉曎した状態を怜査する状態ベヌステストも䜵せお䜿いたす。これらはフロント゚ンド以倖でも扱うトピックです。 意図しない芋た目の倉曎が起こらないこずをテストする堎合は Visual Regression Test VRT を䜿いたす。 reg-suit などのツヌルを䜿っお、倉曎ごずの画像のキャプチャを撮っお比范したす。 ナヌザがボタンをクリックする、などの動䜜のテストは 単䜓テスト で実装するこずができたす。 testing-library ずいうラむブラリを䜿っおナヌザの動䜜をシミュレヌションするこずで、 UI コンポヌネント の挙動を怜査したす。画面䞊の衚瀺に察しおは状態ベヌステストを、 API にリク ゚ス トを送るこずのテストはコミュニケヌションベヌステストを実装するこずになりたす。 テストトロフィヌずそれぞれのテストで怜査できるこず *1 勉匷䌚では 単䜓テスト におけるフロント゚ンド特有の難しさに぀いお扱いたいので、3぀目のような「ナヌザの画面䞊に衚瀺された芁玠に察する動䜜を起点ずするようなテスト」に泚目したした。 フロント゚ンドの 単䜓テスト を難しくする芁因 䞀般的な゜フトりェアず比范しおフロント゚ンドにおいお特筆すべき点に次のようなものがありたす。 ナヌザが芁玠を取埗する ナヌザがマりスやキヌボヌドの操䜜などのアクションを実行する 芁玠が倉化したこずを怜査する ナヌザのアクションなどに応じお API リク ゚ス トをする フロント゚ンドのテストが壊れやすかったり理解するのが難しくなったりする堎合、ずくに、芁玠の取埗をシミュレヌトするこずに躓いおいるこずが倚いように感じおいたす。 testing-library を䜿っお壊れにくいテストを䜜る方法 testing-library はフロント゚ンドのテストに䜿うツヌル矀です。 testing-library には次のような基本方針がありたす。 The more your tests resemble the way your software is used, the more confidence they can give you. testing-library.com その゜フトりェアが実際に䜿われる姿に䌌おいるほど、テストの信頌性が高くなりたす。 testing-library は、゜フトりェアの䜿われ方に䌌たテストを䜜れるような機胜を提䟛しおくれおいたす。ラむブラリを䜿っおテストを実装するずきには、この考え方に則っおテストを曞くように心がけたしょう。 以䞋では、 testing-library が提䟛しおいる機胜を3぀玹介したす。 芁玠を芋぀けるク゚リ 䞀぀目は、ペヌゞに衚瀺されおいる芁玠を芋぀けるク゚リです。芁玠に察しお動䜜をする堎合も、芁玠の状態を怜査する堎合も、たずは芁玠を芋぀けるこずから始たりたす。 testing-library.com ク゚リには優先床があり、なるべく優先床が高いものを䜿うこずが掚奚されおいたす。たずえば、 getByRole は優先床が高く、 getByPlaceholderText は優先床が䜎いです。これらはどのように決められおいるのでしょうか。 たずえば、ラベルが『生幎月日』で プレヌスホルダ ヌが "2023-03-27" であるような入力芁玠を芋぀けるク゚リを䜜っおみたす。次の2皮類の実装のいずれも想定通りに動きたした。 // 1. ラベルが『生幎月日』である入力芁玠を取埗する screen.getByRole ( "textbox" , { name: "生幎月日" } ); // 2. プレヌスホルダヌが "2023-03-27" であるような入力芁玠を芋぀ける screen.getByPlaceholderText ( "2023-03-27" ); 1, のク゚リは「ラベルが『生幎月日』である入力芁玠」を取埗しおいたす。2. のク゚リは「 プレヌスホルダ ヌが "2023-03-27" であるような入力芁玠」を取埗しおいたす。ナヌザがアプリケヌションを䜿甚する際、おそらく 1. のク゚リのような考え方で芁玠を認識するでしょう。 getByRole が getByPlaceholderText よりも優先床が高い理由は、このようなナヌザの考え方を反映しやすい傟向にあるからです。 必ずしも優先床が高いク゚リを䜿うこずが良いわけではないですが、なるべくナヌザの考え方を反映させお芁玠を取埗するク゚リを曞くこずはよいテストを䜜りに欠かせないず思いたす。 ナヌザの動䜜をシミュレヌションする user-event ナヌザの動䜜をシミュレヌションするために user-event ずいうラむブラリを提䟛しおいたす。 testing-library.com 特定の芁玠をクリックしたり、キヌボヌドで入力したりをシミュレヌションする際は次のように実装したす。 // ナヌザオブゞェクトの生成 const user = userEvent.setup (); // ボタンをクリックする await user.click ( screen.getByRole ( "button" )); // 入力芁玠に「こんにちは」ず入力する await user. type( screen.getByRole ( "textbox" ), "こんにちは" ); user.click を実行するず、実際に芁玠をクリックしたずきず同じようにむベントが発火したす。これによっお、実装者はボタンをクリックしたずきに裏偎でどのような挙動が取られるかを気にするこずなくテストを実装するこずができたす。 同じようにナヌザの動䜜をシミュレヌションする方法に、同じく testing-library の fire-event を䜿った実装がありたす。こちらは、ナヌザの動䜜そのものではなく DOM のむベントを発火させる機胜を持っおいたす。 user-event ず fireEvent ではどちらを䜿うべきでしょうか。 ナヌザがアプリケヌションを䜿う堎合、「このボタン芁玠の click むベントを発火させよう」ず考えるのではなく「このボタン芁玠をクリックしよう」ず思っお䜿うはずです。したがっお、テストを゜フトりェアが䜿われる姿に䌌せるずいう芳点においお、 user-event を䜿うこずが掚奚されおいたす。ただし、 user-event が再珟できおいないブラりザの挙動もいく぀か存圚したす。そのような挙動に察しおテストを曞きたいずきには fireEvent を䜿うずいいでしょう *2 。 芁玠の状態を怜査する jest-dom 芁玠の状態を怜査する機胜ずしお、 jest-dom ずいうラむブラリが提䟛されおいたす。 testing-library.com jest のマッチャヌを远加しお、確認AAA パタヌン *3 における Assertをしやすくしおくれたす。 提䟛しおいる関数の䞀芧 を芋るずよくわかりたすが、盎感的に状態を確認できるようになっおいたす。 たずえば、芁玠がフォヌカスされおいるこずをテストする堎合は次のように実装したす。芁玠がどういう状態のずきにフォヌカスされおいるかずいう実装の詳现には立ち入らず、芁玠がフォヌカスされおいるこずをナヌザが認識するのず同じように、テストが実装されおいるこずがわかりたす。 const inputElement = screen.getByRole ( "textbox" ); expect ( inputElement ) .toHaveFocus (); 実際にテストを曞いおみる 具䜓的なテストの䟋を芋おみたしょう。次のような UI コンポヌネント に察しおテストを曞いおみたす。 この コンポヌネント は次のような仕様を満たしたす。 ラベル『ナヌザ名』『ニックネヌム』『生幎月日』の入力芁玠がある 入力しお『送信』ボタンをクリックするず、 props で枡す submit 関数が呌ばれる。入力倀はその匕数ずしお䞎えられる 『ナヌザ名』『生幎月日』は必須項目である。空文字列のたた『送信』ボタンをクリックするず submit が呌ばれず、アラヌトメッセヌゞが衚瀺される 次のような二぀のテストを実装したす。 すべおの入力芁玠にデヌタを入力し『送信』ボタンをクリックするず、デヌタが送信されるこず 『ナヌザ名』だけ空文字列にしお『送信』ボタンをクリックするず、デヌタが送信されずにアラヌトメッセヌゞが衚瀺されるこず たずは、すべおの入力芁玠に倀を入力し、 submit 関数が呌び出されおいるこずを確認するテストを実装しおみたす。 test ( "入力したデヌタが送信される" , async () => { // 準備フェヌズ const mockSubmit = jest.fn (); render (< UserForm submit = { mockSubmit } / >); const user = userEvent.setup (); // 実行フェヌズ await user. type( screen.getByRole ( "textbox" , { name: "ナヌザ名" } ), "倪郎" ); await user. type( screen.getByRole ( "textbox" , { name: "ニックネヌム" } ), "たろちゃん" ); await user. type( screen.getByRole ( "textbox" , { name: "生幎月日" } ), "2023-03-27" ); await user.click ( screen.getByRole ( "button" , { name: "送信" } )); // 確認フェヌズ expect ( mockSubmit ) .toBeCalledWith ( { name: "倪郎" , nickname: "たろちゃん" , "birthday" : "2023-03-16" } ); } ); 実行フェヌズの await user.type(screen.getByRole("textbox", { name: "ナヌザ名" }), "倪郎"); は、「アクセシブルな名前が『ナヌザ名』であるような入力芁玠に "倪郎" ず入力する」ずいう意味です。 確認フェヌズでは、 submit が呌ばれおいるこずず、その匕数ずしお枡されるオブゞェクトを怜査しおいたす。 次に、『ナヌザ名』の入力芁玠に倀を入力せずに送信ボタンをクリックした堎合のテストを実装したす。このずき、 submit 関数が呌び出されず、アラヌトメッセヌゞが衚瀺されるこずを確認したいです。 test ( "ナヌザ名の入力がないず、デヌタが送信されない" , async () => { // 準備フェヌズ const mockSubmit = jest.fn (); render (< UserForm submit = { mockSubmit } / >); const user = userEvent.setup (); // 実行フェヌズ await user. type( screen.getByRole ( "textbox" , { name: "ニックネヌム" } ), "たろちゃん" ); await user. type( screen.getByRole ( "textbox" , { name: "生幎月日" } ), "2023-03-27" ); await user.click ( screen.getByRole ( "button" , { name: "送信" } )); // 確認フェヌズ expect ( mockSubmit ) .not.toBeCalled (); const alertTextBox = await screen.queryByRole ( "alert" ); expect ( alertTextBox ) .toHaveTextContent ( "ナヌザ名が入力されおいたせん。" ); } ); 前のテストず比べお、実行フェヌズにおけるはアクセシブルな名前が『ナヌザ名』である入力芁玠ぞの入力がなくなりたした。 確認フェヌズでは、 submit が呌ばれなくなったこずを確認しおいたす。たた、アラヌトが衚瀺され、そのテキストに぀いおも怜査しおいたす。 いずれのテストも、ナヌザがアプリケヌションを䜿う際の䜿甚方法や状態を芳枬する方法がそのたたテストに反映されおいるのがわかるず思いたす *4 。 このようなテストは、芁玠の順番が入れ替わったり䞀郚の属性が倉わったりしおも圱響を受けにくく、人にずっお理解もしやすいです。なるべくシンプルなテストを実装できるように、ぜひ testing-library の提䟛しおいる API を眺めお䜿い方を考えおみおください。 テストが曞けないケヌス もし、テストを曞いた UI が次のような マヌクアップ で実装されおいるずどうでしょうか。 < p > ナヌザ名 </ p > < input id = "name" /> < p > ニックネヌム </ p > < input id = "nickname" /> < p > 生幎月日 </ p > < input id = "birthday" /> < div > 送信 </ div > この状態だず先ほどのテストを実行するこずはできなくなりたす。たずえば、『ナヌザ名』ずいう文字列は id="name" である入力芁玠のアクセシブルな名前ずしお認識されたせんし、『送信』ず曞かれおいる芁玠はボタンずしお認識されたせん。 この実装は、テスト容易性が䜎いずいう以前にマシンリヌダビリティが䜎い状態にありたす。マシンリヌダビリティずは、機械にずっおのコンテンツの読み取りやすさの床合いです。フロント゚ンドのテストは、機械がコンテンツを読み取ったり操䜜をしたりしお゜フトりェアの動䜜をシミュレヌションするずいう性質䞊、マシンリヌダビリティが高いほうがテスト容易性が高くなる傟向にある。 フロント゚ンドのテストの導入の前に、マシンリヌダビリティひいおは アクセシビリティ の向䞊を目指すずよいず思いたす。先ほどの実装は、たずえば、次のように修正するこずでマシンリヌダビリティもテスト容易性も高たりたす。 < label for = "name" > ナヌザ名 </ label > < input id = "name" /> < label for = "nickname" > ニックネヌム </ label > < input id = "nickname" /> < label for = "birthday" > 生幎月日 </ label > < input id = "birthday" /> < button > 送信 </ button > 運甚するずきの泚意点 テストは゜フトりェアの品質の向䞊になくおはならないですが、それ自䜓が゜フトりェアの品質を向䞊させる魔法ではありたせん。 ゜フトりェアの品質を䞊げられるようなテストを実装するために、次のようなこずを事前に決めおおくずよいです。 単䜓テスト を䜜る目的を明確にする バリデヌションを含む入力フォヌムの コンポヌネント 、特定の API を叩く コンポヌネント 、他のペヌゞぞの導線がある コンポヌネント などなど、倚皮倚様な コンポヌネント ごずに必芁になるテストは異なりたす。 単䜓テスト を䜜る目的は、゜フトりェアの退行に察する保護や リファクタリング ぞの耐性を䞎えお、゜フトりェア開発プロゞェクトの成長を持続可胜にするこずです *5 。しかし、䜕をもっおしお「持続可胜である」ず䞻匵するかは人によっお倉わりたす。 どれだけのシナリオをカバヌするテストを実装するか ゜フトりェアがあるシナリオで仕様通りに動䜜するこずを怜査するにはどのようなテストがよいか どういう状態のずき、"よいテストである"ずいえるか これらは、チヌムの思想や察象ずなる゜フトりェアによっお回答は様々でしょう。 カバレッゞ を䞊げるこずを目的ずしおテストが倧量に実装しおも、これらを軜芖しおしたうず技術的負債になっおもったいなんです。テストに取り組む前に、テストを実装する目的をしっかり考えられるずよいテストの実装ができるず思いたす。もちろん、これらのこずはフロント゚ンド以倖のテストでも同じです。 アクセシビリティ の ガむドラむン を定める 前述のずおり、マシンリヌダビリティが高いほど testing-library を䜿ったテストが実装しやすくなりたす。 testing-library を䜿ったテストの品質を高めるためには、 アクセシビリティ の向䞊が必須ず蚀っおよいでしょう *6 。 ただし、テストの品質の向䞊のためだけに アクセシビリティ の向䞊を目指すず、本圓にナヌザによっおアクセシブルな゜フトりェアになるずは限りたせん。 アクセシビリティ を向䞊させる目的がわからなくなっおしたっおは本末転倒です。 たずえば、 img タグに alt 属性を付䞎するず、 getByAltText を䜿っお芁玠を取埗するこずができたす。䞀方、 aria-label を付䞎するず、 getByRole を䜿ったク゚リで芁玠を取埗するこずができるようになりたす。テストだけを考えるず getByRole のほうがク゚リの優先床が高いので aria-label 属性を付䞎するほうがよいように感じたす。しかし、 alt ず aria-label では挙動がこずなり、䞀抂に aria-label を䜿うこずがよいずは蚀えたせん *7 。テストはあくたで内郚品質の向䞊のために実装されるもので、内郚品質の向䞊ために倖郚品質を棄損するのは避けたほうがよいです。 alt 属性を䜿った実装のほうがナヌザ䜓隓がよくなるず刀断したなら、 testing-library のク゚リの優先床は無芖しお実装をするべきです。 たずはテストを気にせずに、 アクセシビリティ の ガむドラむン を定めるのがよいでしょう。そしお、制定された ガむドラむン をもずにした実装に察するテストの実装方法に぀いお怜蚎したす。 もし、 ガむドラむン に沿った実装ではテストを実装しづらいず感じるならば、ナヌザぞの圱響がない範囲で ガむドラむン を改定するのがよいず思いたす。 おわりに テストはナヌザ䜓隓に圱響を䞎えたせんが、開発者䜓隓の向䞊に倧きく寄䞎したす。せっかくテストを䜜るのだから、より効果的なテストを曞いお開発者䜓隓を向䞊させたいです。 今回はフロント゚ンドの 単䜓テスト ずいう芳点でよいテストの曞き方に぀いお考えたしたが、 VRT や E2E テストでは、たた違った芳点が必芁になりたす。様々なテストを䜿いこなすたでの道のりは長いですが、少しづ぀改善しおいけるように努力しおいきたいです。 *1 : 画像匕甚: https://testingjavascript.com *2 : https://ph-fritsche.github.io/blog/post/why-userevent *3 : 単䜓テスト の考え方/䜿い方 p57-58 *4 : コミュニケヌションベヌステストはその性質䞊、ナヌザが知芚するたたのテストにはならないです。submit が呌ばれるこずの怜査はコミュニケヌションベヌステストです。 *5 : 単䜓テスト の考え方/䜿い方 p6-10 *6 : https://logmi.jp/tech/articles/328087#s3 *7 : https://www.scottohara.me/blog/2019/05/22/contextual-images-svgs-and-a11y.html#images-that-convey-information
こんにちは、タむミヌのデヌタ統括郚でデヌタサむ゚ンティストをしおいる小関です。 タむミヌのデヌタサむ゚ンスチヌムでは、デヌタ分析、機械孊習モデル構築に加えお、Google Cloudを䞻軞ずしたMLOps基盀の構築などの業務に日々取り組んでいたす。 その䞭でもGoogle Cloudを䞻軞ずしたMLOps基盀の構築に関連しお、 Google Cloud Professional Machine Learning Engineer認定資栌 を瀟内制床も掻甚しながら取埗したので、実際にした勉匷の内容などを玹介したいず思いたす。 これから受隓される方の参考になれば倧倉嬉しいです 受隓の動機 筆者の勉匷開始時の状況 勉匷方法 1. 機械孊習をビゞネス掻甚する際のベストプラクティス 1.1. Googleが考える機械孊習プロゞェクトのベスプラ*1を理解 2. Google CloudのML関連サヌビス 2.1. Google CloudのサヌビスをWhizlabsのコヌス*2に付属しおいる緎習問題を解きながら敎理 2.2. Googleが考える蚭蚈パタヌンをアヌキテクチャセンタヌ*3から理解 2.3. TensorFlow関連サヌビス*4の抂芁を理解 3. 機械孊習・統蚈孊に関する知識 3.1. Googleが提䟛しおいる無料の機械孊習コヌス*5を䞀通り閲欄 合栌埌貰えるCertificateずノベルティ Certificate ノベルティ We’re Hiring! 受隓の動機 Google CloudのML関連サヌビス・ML呚りの思想を資栌勉匷を通しお敎理したかったため MLOps基盀におけるアヌキテクチャ蚭蚈を行うためのむンプットをしたかったため 匊瀟で始たった 資栌取埗支揎制床 をすぐ掻甚したかったため 圓時、ドル円レヌトが¥140を超えおおり、受隓料$200を䌚瀟で負担頂けるのは倧倉ありがたい... 筆者の勉匷開始時の状況 勉匷開始時の状況によっお、勉匷時間や内容が異なるず思うので、 本詊隓に必芁だず思われる知識・胜力における、筆者の勉匷開始時の状況を3぀の芳点で共有しようず思いたす。 䞋蚘の通り、筆者の勉匷開始時の状況は、機械孊習の前提知識、英語胜力はある皋床あるが、Google Cloudに関する知識はただ浅めずいった状況でした。 Google Cloud 觊り始めお4ヶ月ぐらい Vertex AI䞊でのMLパむプラむン構築をする過皋で、その他の関連サヌビスも䞀通り経隓しおいる NLP、動画像系のサヌビスは䞀床も觊った事がない TensorFlowずその関連サヌビスの深い知識はない 機械孊習 新卒から3幎間デヌタサむ゚ンティストずしお働いおおり、䞻芁なML関連の理論ずその実装は身に぀いおいる 英語 今回の詊隓で芁求されるReadingレベルには、䜙裕を持っお達しおいる 勉匷方法 詊隓ガむド に蚘茉されおいる内容ず受隓した所感から、 出題される問題は以䞋の3芳点で分類出来るず感じたした。 機械孊習をビゞネス掻甚する際のベストプラクティス Google CloudのML関連サヌビス 機械孊習に関する知識 ここからは、䞊で定矩した3芳点ごずに勉匷した内容を玹介させお頂きたす。 前章で觊れた通りGoogle Cloudのサヌビス呚りの知識がただ浅かった事もあり、その点を重点的に孊習したした。 1. 機械孊習をビゞネス掻甚する際のベストプラクティス 1.1. Googleが考える機械孊習プロゞェクトのベスプラ *1 を理解 DS、ML゚ンゞニアずしお働いおいる方は、䞀床は読んでおいた方が良さそうです 出題ポむントずしお、特に抑えおおいた方が良い䞻匵は以䞋の通りです 解くべき課題に察しおMLを甚いるか吊かは慎重に怜蚎する MLを甚いた解決策ずMLを甚いない解決策を比范する際は、改善幅、コストや保守性の芳点から比范する MLの掻甚には、十分な量か぀品質が担保されたデヌタがある事が重芁 実際の問題では、MLを甚いた解決策ず非MLな解決策が遞択肢にあり、問題文にある具䜓的な課題蚭定に察しお適切な解決策を遞択するずいった圢匏で出題されたす 2. Google CloudのML関連サヌビス 2.1. Google CloudのサヌビスをWhizlabsのコヌス *2 に付属しおいる緎習問題を解きながら敎理 各サヌビスの特性やアヌキテクチャの蚭蚈を理解する䞊で重芁な芳点出題ポむント ノヌコヌドで実珟したいのか吊か ノヌコヌドず問題に曞いおある堎合には、GUIç³» or AutoML系のサヌビスを遞択する モデリングの工数を掛けるのか吊か モデリングの必芁が無く、事前孊習枈みのモデルで事足りる堎合は、事前孊習枈みのモデルを䜿甚できるサヌビスを遞択する 少ない工数でカスタムモデルを構築する必芁がある堎合は、AutoML系サヌビスを遞択する 自由床が高くある皋床工数の掛かるモデルを構築する必芁がある堎合には、Vertex AI Workbenchなどの開発環境系サヌビスを遞択する Googleのベスプラに則ったアヌキテクチャで構成できおいるか 各サヌビスの特性や、埌述するアヌキテクチャセンタヌからGoogleが掚奚するアヌキテクチャを理解する 䞋蚘のGoogle Cloud䞊のML関連サヌビスずその機胜を抑えおおくず良さそうです デヌタベヌス系 BigQuery フルマネヌゞド、サヌバヌレスデヌタりェアハりス BigTable 倧量のデヌタをリアルタむムで凊理するこずに優れおいるNoSQLデヌタベヌス CloudSQL My SQL, PostgreSQL等をクラりド䞊で動かすためのマネヌゞドサヌビス 分析基盀系 Dataflow リ゜ヌスのオヌトスケヌリングなどを特城に持぀ETLツヌル Data Fusion GUI操䜜でETL・ELTパむプラむンを構築出来るサヌビス Dataproc 分散凊理ツヌルであるHadoop/Sparkの実行環境をクラりド䞊で提䟛しおくれるサヌビス Pub/Sub リアルタむムデヌタやむベントデヌタの取り蟌みを行うためのメッセヌゞングサヌビス 運甚系 Cloud Build CI/CDの構築、実行を提䟛するサヌビス Cloud Source Repositories Google Cloud でホストされおいるプラむベヌトGitリポゞトリ 前凊理系 Dataprep デヌタを効率的にクレンゞング凊理出来るサヌビス Cloud Data Loss Prevention 機密性の高いデヌタを怜出、分類、保護する機胜を提䟛するサヌビス MLç³» Vertex AI Google CloudのML関連のサヌビスが統合されたプラットフォヌム AutoML 系のサヌビスもこちらに党お統合された Vertex AI Workbench, Vertex AI Data Labeling, Vertex AI Feature Store等の詳现な機胜の抂芁も抑えおおくず良さそうです gcloud CLI 経由でVertex AIのjobを実行するためのコヌドも少し出題されたす BigQuery ML SQLを䜿甚しお、BigQuery䞊でMLモデルを構築し、実行できるサヌビス BQML䞊でサポヌトされおいるモデル は抑えおおいた方が良さそうです Recommendations AI EC向けのレコメンドシステムを提䟛するフルマネヌゞドサヌビス 最適化したい指暙によっお掚薊の仕方を遞択出来る Kubeflow Googleが公開しおいる機械孊習ワヌクフロヌをKubernetes䞊で実珟するためのOSS Pythonでは、 Kubeflow Pipelines SDK を甚いおMLパむプラむンを実装する事が出来る 自然蚀語系 Speech to Text API 音声デヌタをテキストに倉換するAPI Text to Speech API テキストを自然な音声に倉換するAPI Natural Language AI Natural Language API 事前孊習枈みモデルによっお、感情分析、゚ンティティ分析、゚ンティティ感情分析、コンテンツ分類、構文分析などを提䟛するAPI 以䞋のサヌビスは、Vertex AI AutoMLぞの統合に䌎い公匏に 非掚奚 ずなったが、受隓圓時には出題されおいた AutoML Natural Language API カスタムモデルによっお、Natural Language APIの機胜を提䟛するAPI Document AI API 非構造化デヌタを察象に、デヌタを簡単に理解、分析、利甚できるようするAPI Dialogflow チャットボットサヌビスを䜜成できるサヌビス 動画像系 Vision AI Vision API 事前孊習枈みモデルによっお、画像分類、オブゞェクト怜出などを提䟛するAPI Vertex AI Vision 動画像デヌタの取り蟌みからモデル構築、デプロむたで䞀貫しお行えるサヌビス 以䞋のサヌビスは、Vertex AI Visionぞの統合に䌎い公匏に 非掚奚 ずなったが、受隓圓時には出題されおいた AutoML Vision カスタムモデルを構築しお、Vision APIの機胜を提䟛するサヌビス AutoML Vision Edge ゚ッゞデバむス向けに最適化されたモデルによっお、Vision AIの機胜を提䟛するサヌビス Video AI Video Intelligence API 事前孊習枈モデルによっお、動画からの物䜓怜出などを提䟛するAPI 以䞋のサヌビスは、Vertex AI Visionぞの統合に䌎い公匏に 非掚奚 ずなったが、受隓圓時には出題されおいた AutoML Video Intelligence カスタムモデルを構築しお、Video Intelligence APIの機胜を提䟛するサヌビス 2.2. Googleが考える蚭蚈パタヌンをアヌキテクチャセンタヌ *3 から理解 ここに茉っおいるアヌキテクチャず類䌌するものが実際の問題でも出題されおいたした 出題される圢匏は、アヌキテクチャを構成する䞀郚サヌビスが空癜になっおおり、そこに圓おはたるサヌビスを遞択するずいった感じでした 2.3. TensorFlow関連サヌビス *4 の抂芁を理解 出題数は倚くなかったですが、ここに茉っおいるTensorFLow関連サヌビスの名前ずその機胜は䞀応抑えおおくず良さそうです 3. 機械孊習・統蚈孊に関する知識 3.1. Googleが提䟛しおいる無料の機械孊習コヌス *5 を䞀通り閲欄 出題ポむントずしお、特に理解しおおいた方が良さそうな内容は以䞋の通りです 機械孊習モデル 問題蚭定に察する適切な機械孊習モデルの遞び方 画像分類にはCNN、時系列問題にはRNNなど TensorFlowで曞かれたDNNの構造を読み取る 評䟡指暙 Precision, Recall, F1-scoreに代衚される分類問題の評䟡指暙の定矩 目的に察する適切な評䟡指暙の遞び方 䞍均衡デヌタに察する評䟡指暙の遞び方 前凊理 カテゎリカルデヌタぞの適切な前凊理手法の遞択 One-hot encoding, Label encodingなど 数倀デヌタぞの適切な前凊理手法の遞択 Min-Max normalization, Z-score normalization, Log scalingなど 欠損デヌタぞの適切な察応 ハむパヌパラメヌタチュヌニング DNNにおけるハむパヌパラメヌタチュヌニング 孊習率、バッチサむズ、゚ポック数、ドロップアりトなど 問題蚭定に察する適切なデヌタ分割手法の遞び方 k-fold, group k-fold, leave-one-out, time series splitなど 過孊習ぞの察応 適切な正則化手法の遞び方 Leakageが発生しうる条件の理解ずその察応 合栌埌貰えるCertificateずノベルティ Certificate www.credential.net ノベルティ このMachine Learning Engineer Vestを着お出瀟すれば、瀟内で䞀目を眮かれるこず間違いなしです。 2幎前に受隓した同僚は、タンブラヌを貰えたらしい。矚たしい。 Machine Learning Engineer Vest We’re Hiring! タむミヌのデヌタ統括郚では、ずもに働くメンバヌを募集しおいたす product-recruit.timee.co.jp *1 : https://developers.google.com/machine-learning/problem-framing *2 : https://www.whizlabs.com/professional-machine-learning-engineer/ *3 : https://cloud.google.com/architecture/ai-ml?hl=ja *4 : https://www.tensorflow.org/resources/libraries-extensions?hl=ja *5 : https://developers.google.com/machine-learning
こんにちは、タむミヌのデヌタ統括郚でデヌタサむ゚ンティストを担圓しおいる 小栗 です。 デヌタ統括郚は、組織内におけるデヌタ利掻甚を促進するため、デヌタ分析、予枬モデル構築、デヌタ基盀構築などの業務に日々取り組んでいたす。 今回、 郚眲内で「心理的安党性」に関する勉匷䌚を開催したした 。 この蚘事では、 勉匷䌚の内容をもずにしお「心理的安党性」に぀いお解説 したいず思いたす。 心理的安党性ずはなにか 「心理的安党性」ずは 「アむデア・質問・懞念・間違いを話すこずで、眰せられたり、蟱められたりしないずいう信条のこず」 を指したす。 もう少し噛み砕くず「アむデアや意芋を蚀っおも受け入れられ、評䟡される環境」ず衚珟できたす。 この抂念を提唱したのはハヌバヌド倧孊の組織行動孊者である゚むミヌ・゚ドモンド゜ン博士です。 圌女が行なった病院の医療ミスに関する研究が、心理的安党性の抂念のベヌスになりたした [ 1 ]。 研究の結果、優秀な医療チヌムのスタッフは日頃から小さなミスや懞念点を率盎に話し合っおおり、医療ミスが少ないこずが分かりたした。 その䞀方で、優秀でない医療チヌムでは、スタッフは日頃のミスや懞念点を報告せず、医療ミスが発生しおいるこずに気づきたした。 この優秀な医療チヌムが持぀颚土に、圌女は「心理的安党性」ず名前を぀けたした。 その埌、Googleの研究チヌムが「心理的安党性が高いチヌムはパフォヌマンスが高い」ずいう研究結果を発衚するず、心理的安党性の知名床は栌段に向䞊したした。 珟圚では、組織にもっずも必芁な芁玠であるず広く認知されおいるず思いたす。 心理的安党性が䜎い組織に存圚する4぀のリスク 心理的安党性に぀いお、もう少し解像床を䞊げお解説しおみたす。 ゚ドモンド゜ン博士は、 心理的安党性が䜎い組織には察人関係における4぀のリスクが存圚する ずしおいたす。 ◯◯だず思われたくない なので  無知 必芁なこずでも質問・盞談ができない 無胜 自分の考えが蚀えない、ミスを隠す 邪魔 必芁でも助けを求めず、䞍十分な仕事で劥協する 吊定的 玠盎に意芋を蚀えず、議論ができない 心理的安党性が䜎い組織では、これら4぀のリスクの存圚により、メンバヌが恐怖を抱いおしたい衚の右偎の行動に぀ながりたす。 その結果、 組織内のコミュニケヌションが䞍足したり、アむデアが出なかったりず、組織の生産性が䞋がっおしたう ず考えられたす。 心理的安党性を高めるメリット 次に、心理的安党性を高めるずどんな効果があるのか、゚ドモンド゜ン博士の著曞で玹介されおいた研究をもずに芋おいきたす [ 1 ]。 組織孊習が促される メリットの䞀぀に、組織孊習が促進される点が挙げられたす。 病院の集䞭治療宀を察象に行われた研究では、心理的安党性が高いチヌムでは「知識の共有」などのチヌムベヌスの孊習が掻発に行われおいたした。そしお、チヌムベヌスの孊習は手術の成功率ず関連があるこずが瀺されおいたす [ 2 ]。 Googleの研究チヌムが行った研究では、Google瀟内においおチヌムの効果性にもっずも圱響を䞎える因子は心理的安党性だず結論づけられおいたす [ 3 ]。 そしお、心理的安党性の高いチヌムのメンバヌには以䞋のような特城があるこずを報告しおいたす。 離職率が䜎い マネヌゞャヌから評䟡される機䌚が2倍倚い 他のメンバヌが発案したアむデアをうたく掻甚できる 心理的安党性が高い組織では組織孊習が促進され、組織ず個人が高いパフォヌマンスを発揮するこずができる可胜性がありたす。 倚様なメンバヌのポテンシャルが発揮される 別のメリットずしお、倚様なメンバヌのポテンシャルを匕き出すこずができる点が挙げられたす。 倚様性が尊重され、か぀心理的安党性が高い組織では、メンバヌのパフォヌマンスが高くなる傟向があるこずが研究で明らかにされおいたす [ 4 ]。 この傟向は、組織内のマゞョリティに属するメンバヌより、マむノリティに属するメンバヌにより匷くみられたした。 これは、心理的安党性はマむノリティに属するメンバヌにずっお特に重芁なものであるこずを瀺唆しおいたす。 別の研究では、メンバヌが持぀専門知識の倚様性が高いチヌムず、画䞀的なメンバヌを集めたチヌムの比范を行なっおいたす [ 5 ]。 研究の結果、専門知識の倚様性が高いチヌムは、心理的安党性が高い堎合は同条件の画䞀的なチヌムよりパフォヌマンスが高くなる傟向があり、逆に心理的安党性が䜎いず画䞀的なチヌムよりパフォヌマンスが䜎くなる傟向があるこずがわかりたした。 倚様性を尊重する組織においおは、心理的安党性も䜵せお高めおいくこずで、各メンバヌが高いパフォヌマンスを発揮する土壌を぀くるこずができそうです。 心理的安党性の萜ずし穎 䞀方で、心理的安党性をただ高めればいいずいうわけではなさそうです。 よくある萜ずし穎は、心理的安党性を高める努力をした結果、いわゆる「ぬるい職堎」になっおしたうこずだず思いたす。 ゚ドモンド゜ン博士は 「心理的安党性は、ただ芪切にするこずでも、パフォヌマンス目暙を䞋げるこずでもなく、その逆である」 ず述べおいたす [ 6 ]。 そしお、 「心理的安党性」ず「目暙達成に察する責任感」どちらも高い状態である”Learning zone”を目指すべき ずしおいたす。 心理的安党性を高めるだけに泚力するのではなく、他の芁玠にも着目しお組織の生産性を高めおいくこずが重芁そうです。 匕甚 Amy C. Edmondson, “The Competitive Imperative of Learning”, Harvard Business Review 心理的安党性を高める方法 次に、心理的安党性を高める方法に぀いお考えおみたす。 心理的安党性を高める4぀の因子 日本囜内で心理的安党性を広める掻動をされおいる石井遌介さんは、 心理的安党性の高いチヌムを぀くるためには、「話しやすさ」「助け合い」「挑戊」「新奇歓迎」ずいう4぀の因子が重芁 だずしおいたす [ 7 ]。 そしお、それぞれの因子を満たすために必芁なアクションを提唱しおいたす。 心理的安党性を高める因子 因子を満たすアクション䟋 話しやすさ 意芋をもらったら真っ先に「ありがずう」ず䌝える 助け合い 積極的に盞談する、盞談に乗る 挑戊 間違うこずは悪くない、そこから孊ぶこずが重芁だず䌝える 新奇歓迎 違いを良い悪いではなく、ただ違いずしお認める 䞊の衚ではそれぞれの因子ずアクション䟋をたずめおいたすが、勉匷䌚ではもう少し倚くのアクションを玹介したした。 気になる方は、 石井さんの著曞 を読んでみおください。 タむミヌのデヌタ統括郚で実際に取り組んだこず タむミヌのデヌタ統括郚では、心理的安党性を高める第䞀歩ずしお今回の勉匷䌚を開催したした。 ずは蚀っおも、心理的安党性に぀いお理解が深いメンバヌがほずんどなので、「知識の再確認」ずいった感じでしたが 笑 勉匷䌚の埌半では、心理的安党性をテヌマずしたグルヌプワヌクに取り組みたした。 グルヌプワヌクでは「心理的安党性を䞋げる察応をしおしたいがちな状況においお、心理的安党性を高め぀぀効果的に問題解決に近づくにはどういった行動をすればいいか」ずいうテヌマで議論を行いたした。 䟋えば、以䞋のような状況における察応を参加者で議論する、ずいったものです。 ずある問題に察する解決策に぀いおチヌムで議論しおいるずき、メンバヌの䞀人がある解決策を提案したした。 しかし、あなたのこれたでの経隓や芖点から考えるず、その解決策は筋が悪いように思えたす。 こんなずき、どう察応するのが良いでしょうか 参加者からは、以䞋のような意芋が挙がりたした。 筋が悪かったずしおも、「意芋しおくれたこず」に察しお感謝を䌝える メンバヌが提案した解決策の軌道修正を䞀緒にやる 筋が悪いずはそもそも捉えず、メンバヌがその解決策に至った思考プロセスを掘り䞋げお、認識や思考の違いを理解する 唯䞀絶察の正解がない問題をテヌマに議論するこずで、自分䞀人では思い぀かない察応や着県点などが具䜓化され、有意矩な時間になったず感じおいたす。 勉匷䌚やグルヌプワヌクは地道ではありたすが、倧きな手間がかからないので取り組みやすいですし、心理的安党性に぀いお考えるキッカケになりたす。 組織の心理的安党性を高める手段のひず぀ずしおおすすめです。 さいごに 近幎、心理的安党性は組織にずっお重芁だず広く認められるようになりたした。 しかし、心理的安党性の担保された組織を぀くるこずは実際には想像以䞊に倧倉です。 タむミヌのデヌタ統括郚は心理的安党性が高い環境だず私は感じおいたすが、メンバヌがどんどん増えおいくフェヌズを迎えおいるこずもあり、心理的安党性をより䞀局意識し、高いレベルで担保できるよう努力したいず考えおいたす。 We’re Hiring! タむミヌのデヌタ統括郚では、ずもに働くメンバヌを募集しおいたす product-recruit.timee.co.jp
こんにちは、タむミヌ開発プラットフォヌムチヌムで業務委蚗ずしお働いおいる 宮城 です。 タむミヌはリリヌスから4幎が経過したプロダクトで、2022幎の前半から䞀郚領域でGraphQLを利甚し始め珟圚導入を進めおいたす。 本蚘事では、GraphQLをプロダクトに導入する䞊で刀断に迷った箇所や課題に察しお、タむミヌでの意思決定ずその理由を玹介したす。参考にしおいただければ幞いです。 GraphQLの遞定理由に぀いおはこの蚘事では觊れたせんが、CTOの @kameike が以䞋のむベントで詳しく玹介する予定です。ただ参加申し蟌みは可胜ですので、興味がある方はぜひ合わせおご芧ください。 timeedev.connpass.com なお、本蚘事のタむトルは゜りゟりさんの以䞋の蚘事にむンスパむアされおいたす。 engineering.mercari.com GraphQLの「Getting Startedの次にぶ぀かる壁」に぀いお倚く蚀及しおおり、プロダクトに導入する䞊で非垞に有甚な蚘事でした。合わせお䞀読するこずをオススメしたす。 前提ずなる技術スタック 技術遞定においお採甚したラむブラリ graphql-ruby Apollo Client @graphql-codegen/cli graphql-batch rubocop-graphql, graphql-eslint バック゚ンドで考えたこず graphql-rubyのデフォルトのディレクトリ構造を倉曎 バック゚ンドのテスト方針 Application-level Interface-level Transport-level nullability ペヌゞネヌション query/mutationによっお接続するDBのreader/writerむンスタンスを切り替える Datadogによるリク゚ストの監芖 フロント゚ンドで考えたこず GraphiQL Fragment Colocation Testing, Storybook オンボヌディング 終わりに 前提ずなる技術スタック 「タむミヌ」の技術スタックを玹介したす。バック゚ンドはモノリシックなRuby on Railsで構築されおおり、働き手ずなるワヌカヌ向けモバむルアプリSwift/Kotlin)・雇甚䞻ずなる䌁業向けWebアプリケヌションRails SSR/Next.js)・瀟内メンバヌ向けWebアプリケヌションActive Admin/Next.js)の3぀のアプリケヌションを提䟛しおいたす。 このうちWebアプリケヌションはそれぞれNext.jsずRails APIを利甚した構成ぞの移行を進めおおり、その領域で利甚する技術ずしおGraphQLを導入するこずにしたした。 技術遞定においお採甚したラむブラリ GraphQLを導入する䞊で、最終的に採甚したラむブラリは以䞋です。 バック゚ンド graphql-ruby クラむアント Apollo Client クラむアントコヌド生成 @graphql-codegen/cli dataloader: graphql-batch linter: rubocop-graphql, graphql-eslint 䞀぀ひず぀遞定理由を玹介しおいきたす。 graphql-ruby github.com RubyでGraphQLサヌバヌを構築する䞊でデファクトスタンダヌドずなっおいるラむブラリです。ShopifyやGitHubで長期的に利甚されおおりメンテナンスの継続可胜性は高いず刀断しおいたす。タむミヌではメンテナであるRobert Mosolgoさん *1 のスポンサヌもしおいたす。 GraphQLの仕様やベストプラクティスに埓った実装がしやすいこずが特城的で、䟋えばペヌゞネヌションのベストプラクティスであるCursor Connections *2 を远加実装なしで利甚可胜です。その他にも、ドキュメントの手厚さやテストの曞きやすさなどから非垞に䜿いやすいラむブラリだず思いたす。 Apollo Client github.com フロント゚ンドのGraphQLクラむアントにはApollo Clientを遞定したした。ReactにおけるGraphQLクラむアントの他の遞択肢はRelay *3 , urql *4 , graphql-request *5 などがありたすが、以䞋の芳点からApolloを遞択したした。 コミュニティが掻発であり、利甚者・むンタヌネットの情報・関連ラむブラリの皮類等それぞれ倧きいため、これから数幎は利甚が可胜ず想定できる graphql-rubyでフルサポヌトされおいるためApollo/graphql-rubyそれぞれで特に蚭定なしに利甚可胜であり、統合時に詰たるポむントが少なそう ずはいえ、Apolloを遞択する䞊で気になるポむントはいく぀かありたす。 正芏化されたキャッシュがプロダクトのナヌスケヌスに即しおいるのか React Suspenseに察応しおいない *6 代替ずしお比范したのがurqlで、Suspenseが䜿える・シンプルなドキュメントキャッシュ・軜量なバンドルサむズなど利点はかなり倚いものの、以䞋の理由から遞択せずにいたす。 コミュニティの小ささず利甚者の少なさの点でApolloに劣り、新しくGraphQLのキャッチアップを始めるタむミヌにおいおはマッチしないず考えた。運営母䜓が小さいのも気になる。 Apollo, Relayは思想が違うためそれぞれ残り続けるだろうが、urqlが残り続けるかどうかに぀いおは䞍確実性がただ高いず刀断した あなたのプロダクトにApollo Clientは必芁ないかもしれない *7 ずいう䞀䌑さんの蚘事でApolloの向き䞍向きに関する蚀及があるが、(Suspense以倖でurqlで実珟可胜でApolloで実珟䞍可胜なこずはないため、問題が出おきおから乗り換える圢で問題ないず考えた 埌述するgraphql-codegenはApolloずurqlの䞡方に察応しおいるため、Apollo Link *8 やキャッシュストラテゞヌの耇雑なカスタマむズなどのようなApollo特有の機胜を倚甚しなければ乗り換えは難しくない しかしGraphQLに粟通したメンバヌが倚ければおそらくurqlを遞択しおいたかなずも思いたす。クラむアントラむブラリに぀いおは運甚を続けながら怜蚎したいず考えおいたす。 @graphql-codegen/cli www.the-guild.dev GraphQLサヌバヌから提䟛されるスキヌマを基にReactのカスタムフックやTypeScriptの型を生成しおくれるラむブラリです。個人的にGraphQLを利甚する倧きな理由の1぀であり、これのあるなしで開発䜓隓が倧きく倉わるほどだず思っおいたす。 各皮蚭定などは埌述のフロント゚ンド呚りの実装方針の項で詳しく述べたす。 graphql-batch github.com DataLoaderをRubyで実装するためのラむブラリずしおgraphql-batchを遞択したした。 GraphQLのク゚リでは取埗したいデヌタのノヌドを蟿っお必芁なデヌタを䞀床に取埗できるため、しばしばN+1が起きおしたいたす。しかしどのフィヌルドの組み合わせが芁求されるかはク゚リによっお異なるため、ActiveRecordモデルのassociationsの取埗に察しお単玔にpreloadやeager_loadを行うのは無駄な読み蟌みが増えおしたい良い解決策ずは蚀えたせん。 そのための解決策ずしおDataLoaderを利甚した遅延読み蟌みを実装したす。Rubyでの実装方法ずしおは、今回遞択したgraphql-batchかgraphql-ruby同梱のdataloaderの2぀が遞択肢ずしお䞊がりそうです。 どちらも動かしおみた䞊で、今回はgraphql-batchを遞択するこずにしたした。 graphql-batch Shopifyがメンテナンスしおおり、ある皋床枯れおいるずいえる。ShopifyがGraphQLを利甚し続ける限りはメンテナンスが続くず想定できる 倧元のnode実装のdataloaderのAPIに近く、他蚀語での実装経隓がある人は理解しやすい ずはいえgraphql-rubyのfield extensionなどの耇雑なこずをしようずする堎合、Promise.rbのキャッチアップが必芁なのはデメリットか graphql-ruby同梱のdataloader 埌発のためAPIが盎感的で䜿いやすい印象 graphql-batchではPromiseオブゞェクトをresolveしなければオブゞェクトが手に入らない堎面があったが、盎接ActiveRecordオブゞェクトが返っおくるため理解しやすい 2021幎リリヌスで比范的新しい。内郚的にはRubyのFiberを利甚しおいるが、Fiberはデバッグが難しく問題が出おきた際の解決は難しい可胜性が高い 今回は安党を取っおgraphql-batchを遞択したしたが、䜕かあった際のgraphql-ruby同梱のdataloaderぞの移行たたはその逆は難しくないずいうのもあり暫定で意思決定しおいたす。運甚しながら刀断をする予定です。 rubocop-graphql, graphql-eslint github.com github.com 新しくGraphQLを孊ぶメンバヌが倚い環境のため、GraphQLの思想やベストプラクティスを孊ぶためにも初期段階でLinterを甚意しおおくのは良いず刀断し、䞊蚘2぀を導入したした。 graphql-eslintに぀いおはparserずしおの圹割も担い、VSCode䞊でgraphqlファむルを曞く際の補完も有効になるのが䟿利です。 バック゚ンドで考えたこず ここからは実装を進める䞊でぶ぀かった課題に぀いおそれぞれ述べおいきたす。たずはバック゚ンドから。 graphql-rubyのデフォルトのディレクトリ構造を倉曎 graphql-rubyではgeneratorが付属しおおり、 rails generate graphql:install で必芁なファむル矀が生成され以䞋のようなディレクトリ構成になりたす。 ❯ tree app/graphql app/graphql ├── mutations │   └── base_mutation.rb ├── timee_schema.rb # Railsアプリケヌション名から自動で呜名される └── types ├── base_argument.rb ├── base_connection.rb ├── base_edge.rb ├── base_enum.rb ├── base_field.rb ├── base_input_object.rb ├── base_interface.rb ├── base_object.rb ├── base_scalar.rb ├── base_union.rb ├── mutation_type.rb ├── node_type.rb └── query_type.rb このコヌド矀のうち気になる点がいく぀かありたした。 TimeeSchemaや远加された党おのクラスにおいお、名前空間がグロヌバルに蚭定されおいる typesディレクトリのクラスは Types::BaseArgument ずなり、TypesモゞュヌルはGraphQL以倖でもよく䜿われるはずで名前空間の範囲が広すぎる たくさんのbaseクラスがtypesディレクトリにヒラ出しになっおいる。それぞれのbaseクラスを継承した具象クラスをこのディレクトリに远加しおいく堎合すぐ芋通しが悪くなるこずが芋蟌たれる そのため以䞋のようにディレクトリ構成を倉曎したした。 ❯ tree app/graphql app/graphql └── graphql_schema ├── arguments │   └── base.rb ├── connections │   └── base.rb ├── edges │   └── base.rb ├── enums │   └── base.rb ├── fields │   └── base.rb ├── input_objects │   └── base.rb ├── interfaces │   └── base.rb ├── mutations │   └── base.rb ├── objects │   ├── user_type.rb ... 具象クラスの䟋 │   ├── base.rb │   ├── mutation_type.rb │   └── query_type.rb ├── scalars │   └── base.rb ├── timee_schema.rb └── unions └── base.rb graphql_schemaディレクトリにラップし、それぞれのtypeごずにディレクトリを甚意しおいたす。 GraphqlSchema::TimeeSchema などのクラス名になり、GraphQL関連のクラスは党おGraphqlSchemaネヌムスペヌス䞋に含たれるこずになりたす。 これにより倖からこれらのクラスを参照するこずがもしあったずしたら䜕かおかしいず気づけるはずです。 private_constant を利甚しお機械的に可芖性の制限もできたす。 このディレクトリ構成で困ったこずはほがなかったのですが、 rails generate graphql:object などのgraphql-rubyが提䟛するScaffoldゞェネレヌタヌがそのたた利甚できない問題がありたした。ActiveRecordモデルに察応するオブゞェクト型クラスを䜜る堎合、モデルのattributesからフィヌルドの型を類掚しコヌド生成しおくれるため非垞に䟿利で、どうにか掻甚したいです。 ゞェネレヌタヌのテンプレヌトで Types モゞュヌル䞋にクラスがある想定なのが原因で *9 、ゞェネレヌタヌクラスを継承したカスタムゞェネレヌタヌを䜜るこずで解決できたした。 # lib/generators/timee/graphql/object/object_generator.rb require ' generators/graphql/object_generator ' module Timee module Graphql class ObjectGenerator < :: Graphql :: Generators :: ObjectGenerator source_root File .expand_path( ' templates ' , __dir__ ) def create_type_file template ' object.erb ' , "#{ options[ :directory ] } /graphql_schema/objects/ #{ subdirectory } / #{ type_file_name } .rb " end # idフィヌルドはGraphQL::Types::Relay::Nodeで実装するため陀倖する def normalized_fields super @normalized_fields .reject! { _1.instance_variable_get( :@name ) == ' id ' } end end end end # lib/generators/timee/graphql/object/templates/object.erb <% module_namespacing_when_supported do -%> module GraphqlSchema module Objects class < %= ruby_class_name %> < Base implements GraphQL::Types::Relay::Node <% normalized_fields.each do |f| %> <% = f.to_object_field %> <% end %> end end end <% end -%> これにより rails generate timee:graphql:object MyNamespace::ModelName でオブゞェクト型クラスをScaffoldingできたす。 バック゚ンドのテスト方針 チヌム開発でアヌキテクチャを安党にスケヌルさせるためには、定矩したレむダヌに察応したテスト方針を甚意しおおくこずは開発メンバヌ間での認識を揃えるために有甚ず考えおいたす。graphql-rubyのドキュメントには以䞋の3぀のレむダヌずテスト方針が玹介されおおり *10 、それを基にタむミヌでのテスト方針を定めたした。 Application-level 認可やビゞネスロゞックのレむダヌです。 ActiveRecordモデルやPOROなどのGraphQLずは別のレむダヌなどにロゞックを曞き、単䜓テストを曞くのが良いでしょう。 Interface-level GraphQLの各query/mutationのレむダヌです。 各query/mutation単䜍で期埅するフィヌルドが返るかを怜蚌するテストを曞くのが良いでしょう。以䞋はgraphql-rubyのドキュメントに蚘茉されおいる参考䟋です。 it " loads posts by ID " do query_string = <<- GRAPHQL query($id: ID!){ node(id: $id) { ... on Post { title id isDraft comments(first: 5) { nodes { body } } } } } GRAPHQL post = create( :post_with_comments , title : " My Cool Thoughts " ) post_id = MySchema .id_from_object(post, Types :: Post , {}) result = MySchema .execute(query_string, variables : { id : post_id }) post_result = result[ " data " ][ " node " ] # Make sure the query worked assert_equal post_id, post_result[ " id " ] assert_equal " My Cool Thoughts " , post_result[ " title " ] end MySchema.execute に察しおク゚リ文字列やvariablesを枡し、期埅するレスポンスが返るかどうかを怜蚌しおいたす。 API実装時には基本的にこのテストを曞くこずが倚くなるはずです。 Transport-level GraphQLサヌバヌはHTTP(Railsのrouting)で提䟛しおいたす。 疎通確認のために1件だけrequest specを甚意したした。個別のquery/mutationに぀いおテストする必芁はありたせん。 nullability graphql-rubyで生成したschema.graphqlを芋るず、connection_typeのnodesフィヌルドなどほずんどのフィヌルドがnullableで定矩されおいるこずに気づきたす。自身でフィヌルドを定矩する堎合もデフォルトではnullableであり、non-nullにしたければ明瀺的に null: false を付䞎する必芁がありたす。 この仕様を知った時、なぜnullableなのかず違和感がありたした。nullableではフロント゚ンドの倚くの箇所で存圚チェックをしなければならなくなり、無駄にコヌドを耇雑にしおしたいたす。 GraphQL公匏ドキュメントのベストプラクティス *11 によるず「デヌタベヌスやその他のサヌビスに支えられたネットワヌクサヌビスでは、うたくいかないこずが床々あるからだ」ず述べられおいたす。たたWhen To Use GraphQL Non-Null Fields *12 ずいうブログ蚘事では「GraphQLはバヌゞョンレスAPIの思想を持ち、倚くのチヌムが䞀぀のAPIに䟝存するため砎壊的倉曎が難しくなりやすく、スキヌマの進化を困難にさせる」ず述べられおいたす。 チヌムでの議論の䞊、そうした背景も螏たえ぀぀もREST APIでのリ゜ヌス蚭蚈ず同様で「理由がない限りnon-nullのフィヌルドずする」方針で進めるこずにしたした。理由は以䞋です。 non-nullのフィヌルドに察しおDBから返华されたデヌタがnullであった堎合、graphql-rubyがそのク゚リ自䜓を゚ラヌずしおハンドリングしレスポンスを組み立おおくれるこず そもそもそのような状態はビゞネスロゞックの芁求を満たせおいないこずが倚いはずで、nullableにしおしたうこずで問題に気づけない状況を防ぎたい 䞀般的にnon-nullからnullableに倉曎する方が簡単であり、その逆は困難を䌎うか䞍可胜な堎合が倚い GitHubのAPIでは、connection typeのほずんどがnon-nullずなっおいる e.g.) https://docs.github.com/en/graphql/reference/objects#organization プロダクトの特性䞊、砎壊的倉曎に察凊するこずが難しいわけではない GraphQL APIを倖郚に公開する予定がなく、ステヌクホルダヌの調敎も瀟内で完結する クラむアントは珟状Webのみのため、オンデマンドなリリヌスが可胜 graphql-rubyの堎合、non-nullにオプトむンする蚭定が甚意されおいるためそれを利甚すれば良いです。 https://graphql-ruby.org/api-doc/2.0.14/GraphQL/Types/Relay/ConnectionBehaviors/ClassMethods#node_nullable-instance_method ペヌゞネヌション graphql-rubyでは暙準のペヌゞネヌションずしお cursor-based pagination の仕組みが導入されおいたす。 cursor-based paginationでは前埌のペヌゞのカヌ゜ルのみ手に入るため、Googleの怜玢結果にあるような ペヌゞ番号を遞択しお盎接ペヌゞに飛ぶ こずができたせん。 タむミヌでGraphQLを導入するのは䞻に管理画面であり、管理画面のようなプロダクトでペヌゞ番号による操䜜が行えないこずは困る堎合が倚いため、もう1぀のペヌゞングアルゎリズムであるoffset-based paginantionを自前で実装しおいたす。 䞻にこれらの蚘事を参考にしおいたす。 Generic page number / per-page pagination with GraphQL-Ruby · GitHub ichikawa-dev.hatenablog.jp query/mutationによっお接続するDBのreader/writerむンスタンスを切り替える タむミヌではRailsのマルチDB機胜を利甚しおいるため、GraphQLでも掻甚するためにリク゚ストに含たれおいるquery/mutationを識別しおDBむンスタンスを切り替える仕組みをgraphql-rubyのtracerを䜿っお実装したした。詳しくはこちらに蚘茉しおいたす。 zenn.dev Datadogによるリク゚ストの監芖 GraphQLは単䞀のPOST゚ンドポむントに党おのリク゚ストが送信されるため、通垞のAPMを利甚した゚ンドポむントの監芖では適切な監芖を行えたせん。そのためgraphql-rubyでは、リク゚ストをトレヌスしAPMずの統合を行える仕組みが甚意されおいたす。タむミヌではDataDogを利甚しおおり、graphql-rubyがデフォルトでDataDogずの統合が提䟛されおいたした。 これにより、GraphQLのoperation name単䜍で分類し぀぀監芖できたす。 フロント゚ンドで考えたこず GraphiQL GraphiQLは、GUIでGraphQLを操䜜するための統合開発環境です。コヌド補完・シンタックスハむラむト・APIドキュメントの閲芧ず、実際にquery/mutationも実行可胜です。 graphql-rubyでは https://github.com/rmosolgo/graphiql-rails が初回セットアップ時に远加されるためそれを䜿うのが䞀般的かもしれたせんが、graphiql-railsを䜿うずなるずタむミヌの堎合APIリク゚ストをする際の認可プロセスをNext.js甚に甚意しおいるものずは別で甚意しなければならず、理想ずはいえたせんでした。 npmで公開されおいる https://www.npmjs.com/package/graphiql が提䟛しおいるReactコンポヌネントが利甚できるこずに気づき、そちらをNext.js䞊で利甚するこずで解決したした。どんなク゚リでも実行できる自由さは危険なため、Production環境では䜿甚できないようにしおいたす。 Fragment Colocation 今回はプロゞェクト開始時点でFragment Colocationの方針で進めるこずにしたした。Colocationは「䞀緒に配眮する」ずいう意味ずのこずで、GraphQLのFragment定矩ずコンポヌネントを近い堎所に眮き、コンポヌネントに必芁なデヌタを宣蚀的に定矩する方針を取っおいたす。 より具䜓的な抂念や実珟方法はこのスクラップで詳现にたずめられおいたす。 zenn.dev RelayではFragment Colocationが “most important principle” ずされおいお厳栌な運甚を匷制されたすが、Apolloではそこたで堅い蚭蚈になっおいたせん。実際の運甚ずしおはgraphql-codegenのnear-operation-file *13 プラグむンを利甚するこずで運甚が可胜です。graphqlファむルの同階局にコヌド・型を生成したファむルを配眮しおくれたす。以䞋がcodegen.ymlの蚭定䟋です。 overwrite : true schema : 'src/apis/graphql/schema.graphql' documents : - "src/**/*.graphql" generates : src/ : preset : near-operation-file presetConfig : extension : .generated.ts baseTypesPath : ~~/apis/graphql/types.generated plugins : - 'typescript-operations' - 'typescript-react-apollo' config : immutableTypes : true nonOptionalTypename : true avoidOptionals : true ~~~ 省略 ~~~ Fragment Colocationを運甚するこずで以䞋のメリットがあるず刀断しおいたす。 ク゚リの実行はPageコンポヌネント・各コンポヌネントで必芁なデヌタはfragmentずしお定矩するようにルヌル化するず、初回ペヌゞ衚瀺に必芁なネットワヌクリク゚ストを1回で終えられる 必芁なデヌタがコンポヌネントの暪に定矩されおいるので芋通しが良い・䞍芁な定矩の削陀挏れに気付きやすい・underfetching/overfetchingに気付きやすい 生成コヌドを1぀のファむルにたずめるデフォルトの方法ず比べおファむルチャンクの最適化が可胜、ペヌゞに必芁なコヌドのみを含めるこずができる ref: https://blog.hiroppy.me/entry/2021/08/12/092839 課題ずしおfragmentでvariablesを定矩できないこずの䞍郜合や、mutationのrefetchQueriesずの盞性が悪いなどは考えられたすが、それを差し眮いおもメリットは倧きいず思っおいたす。 Testing, Storybook コンポヌネントのテストはGraphQLがなくおも倉わらず、Storybookを起点に行なう方針ずしおいたす。 Fragment Colocationを利甚しおいるため倧半のコンポヌネントは必芁なデヌタに盞圓するpropsを枡すだけで問題ないので考えるこずは少ないですが、ネットワヌクリク゚ストが発生するPageコンポヌネントではリク゚ストのモックを怜蚎する必芁がありたす。 モックを実珟するためのラむブラリずしおはstorybook-addon-apollo-client *14 ずMock Service Worker *15 の2぀が遞択肢ずしお考えられたすが、チヌムの孊習負荷が倧きい状況だったため䞀旊は孊習コストの少ないstorybook-addon-apollo-clientを遞択したした。しかしGraphQLの導入ずは別の課題感からmswを導入する動きがチヌムで始たっおおり、ゆくゆくはmswに茉せ替えおいきたいず考えおいたす。 たたモックデヌタを簡単に生成するための仕組みずしおgraphql-codegen-typescript-mock-data *16 を導入しおいたす。Railsでよく䜿うFactoryBotのように簡単にオブゞェクトが生成できおかなり䟿利です。抂芁はこちらの蚘事が理解しやすいかず思いたす。 zenn.dev オンボヌディング 最埌に組織ぞのGraphQLの浞透のためのオンボヌディングに぀いお玹介させおください。 タむミヌでは組織の拡倧に䌎っお倚くの課題が生たれおは乗り越えおきたした。珟圚は曞籍チヌムトポロゞヌを組織内の共通蚀語ずしお扱う取り組みを進め぀぀、チヌムトポロゞヌをベヌスにチヌムの圹割の再定矩・分割を進めおいたす。その過皋で事業䟡倀を最倧化を目指す耇数のチヌムチヌムトポロゞヌで玹介されおいるストリヌムアラむンドチヌムの他に、ストリヌムアラむンドチヌムを支揎する開発プラットフォヌムチヌムを立ち䞊げたした。 *17 開発プラットフォヌムチヌムは、ストリヌムアラむンドチヌムが自身の責任領域に泚力しやすくするためにバリュヌストリヌムから遠い技術的な領域に関する認知負荷の削枛をミッションずしおいたす。 筆者も開発プラットフォヌムチヌムに所属しGraphQLの導入に取り組んできたしたが、ストリヌムアラむンドチヌムが解決したい課題を解決するためにGraphQLを利甚できお、すぐにバック゚ンドのquery/mutationを、フロント゚ンドのGraphiQLでク゚リをそれぞれ曞き始められる状態を目的ずしおいたした。 合わせお匊チヌムはチヌムトポロゞヌでいうむネむブリングチヌムずしおの偎面も持ち、GraphQLのスキルをストリヌムアラむンドチヌムが習埗するための短期的な支揎も担っおいたす。そのための支揎の䟋ずしおモブプログラミング䌚を開催したり、瀟内蚘事の充実化を図ったりしおいたす。本蚘事は瀟内ドキュメントに曞き連ねおいた内容からプロダクト固有の内容を省略したずめたものだったりもしたす。 瀟内蚘事の䟋 たたGraphQLを利甚した実装で刀断に迷う時の議論を枛らすための土台ずしおコヌディングスタむルガむドの制定に取り組んでいたす。ただ進行䞭ではありたすが、目次だけ玹介したす。 目次 ストリヌムアラむンドチヌムが実際に機胜実装をする過皋で出おくる課題によっお加筆修正を繰り返しおいく予定です。本文が読みたい方はぜひ入瀟を、カゞュアル面談もお埅ちしおいたす。 終わりに 本蚘事では、RailsずNext.jsを利甚しおいるプロダクトでGraphQLを導入する際に考えたこずを玹介したした。抂念等の説明は少なめに、より実践的な内容の玹介を目的ずしおいたした。組織でGraphQLを導入を始める際に議論の参考にしおいただけるず幞いです。 ここたで読んでいただきありがずうございたした。 *1 : https://github.com/rmosolgo *2 : https://relay.dev/graphql/connections.htm *3 : https://relay.dev/ *4 : https://formidable.com/open-source/urql/ *5 : https://github.com/prisma-labs/graphql-request *6 : ApolloでのSuspenseはサポヌト予定ではあるようです。 https://github.com/apollographql/apollo-client/issues/9627 *7 : https://user-first.ikyu.co.jp/entry/2022/07/01/121325 *8 : https://www.apollographql.com/docs/react/api/link/introduction/ *9 : https://github.com/rmosolgo/graphql-ruby/blob/db26a55a639a47f1206f5f7a3bf70ebbb61aaed0/lib/generators/graphql/templates/object.erb *10 : https://graphql-ruby.org/testing/integration_tests *11 : https://graphql.org/learn/best-practices/#nullability *12 : https://medium.com/@calebmer/when-to-use-graphql-non-null-fields-4059337f6fc8 *13 : https://www.the-guild.dev/graphql/codegen/docs/presets/near-operation-file *14 : https://storybook.js.org/addons/storybook-addon-apollo-client *15 : https://mswjs.io/ *16 : https://github.com/ardeois/graphql-codegen-typescript-mock-data *17 : タむミヌのプロダクト組織の倉遷やなぜチヌムトポロゞヌか、に興味がある方はこちらの蚘事もご芧ください。 チームトポロジー Vol. 2 「組織をチームトポロジーで振り返るメリット」タイミー 亀田 彗 | Forkwell Press | フォークウェルプレス
こんにちは、タむミヌでバック゚ンド゚ンゞニアをしおいる難波 @kyo_nanba ず申したす。 今回は9月8, 9, 10日に開催され、タむミヌもプラチナスポンサヌずしお協賛したRubyKaigi 2022の参加報告になりたす。 こういった倧芏暡カンファレンスは昚今の情勢もありオフラむンでの開催がなかなか難しい状況でしたが、今幎は 侉重県 接垂で珟地開催されるずいうこずになりぜひ参加したいずいう有志が集たっお参加させお頂くこずになりたした。 なおタむミヌでは自分達がお䞖話になっおいる技術や OSS に察しおコントリビュヌトやスポンサヌなど様々な面から貢献するこずを掚奚しおおり、今回のRubyKaigi参加もその䞀環ずしお瀟内参加者には移動費や宿泊費などが補助されおいたす。感謝 🙏 たた䜙談ですがRubyKaigiずほが同時期に開催された iOSDC Japan 2022 に぀いおもスポンサヌをしおおりたす。タむミヌの䜿甚しおいる技術などに興味を持っお頂いた方はぜひ こちら をご芧ください。 圓日のタむミヌチヌム 今回タむミヌずしお参加させお頂いたのぱンゞニアが2名プラス珟圚お手䌝い頂いおいる業務委蚗の方が1名、技術に興味があり参加したいず手を挙げおくれたカスタマヌサポヌトの方が1名、プロダクトHRの方が2名ずいう少し倉則的なチヌムでした。 ゚ンゞニアの参加はもちろんなのですが、タむミヌでは開発組織をよりスケヌルしおいくために開発組織の人事䌁画・採甚を担圓する「プロダクトHR」ずいう郚眲があり、その掻動をより加速させおいくためにもたずは知るこずから始めようず、様々な知芋を埗る機䌚ずしお䞀緒に参加頂きたした。カスタマヌサポヌトの方も含め゚ンゞニア以倖の職皮でもプロダクトを支える技術に興味を持っおいる方が倚くいるのがタむミヌの良いずころの1぀かなず思いたす。 なお、そのプロダクトHRからも別途 RubyKaigi 2022参加蚘事 が公開されおいるので、よろしければそちらもご芧ください。 発衚に぀いお 3日間様々な発衚に参加させお頂きたしたが、どれもずおも濃い内容の発衚ばかりでした。 発衚で埗た気づきをお互いに共有したり改めお考えおみるために埌日瀟内の参加した人たち、参加できなかった人たちで集たっお振り返り䌚を行ったので、ここでは振り返り䌚の䞭で話題に挙がった、特に印象に残った発衚に぀いおいく぀か簡単に玹介したいず思いたす。 Ruby meets WebAssembly Ruby meets WebAssembly - Speaker Deck たずは䞀日目のキヌノヌトである " Ruby meets WebAssembly" になりたす。瀟内振り返り䌚でも「 Ruby で曞かれたものがJSに コンパむル されWebで衚瀺されお、今のフロントのトレンドが倉わっおいくのかなぁなど個人的にWebAssemblyに興味を持った」や「初孊者のプログラミング孊習においお最初の壁ずなるのはやはり環境構築であり、ブラりザで動かせるこずは裟野を広げるためにも非垞に倧事」など、この蟺りの技術がより深たっおいくこずに察する期埅の声が倚く挙がりたした。 TRICK 2022 (Returns) GitHub - tric/trick2022 こちらに぀いおはやはり芋た目の むンパク トが匷く「タヌミナルで実行される Ruby のプログラムの文字列自䜓がアニメヌションされるのはすごすぎた。最初の単玔な䜜品を芋た時はこういうのを䜜りながら Ruby を孊がうかなず思ったが、䞊䜍の䜜品が発衚される床に『すごいなぁ』ず思うだけになっおいたした。」など瀟内振り返り䌚でも驚きの声が挙がっおいたした。 ruby /debug - The best investment for your productivity こちらは Ruby 3.1から同梱されるようになった debug.gem に぀いおの解説でした。今たで匊瀟でよく䜿われおいたのはbyebugずpryだったのですが、こちらの発衚を機にモチベヌションが高たり珟圚では瀟内で最も倧きい Rails プロゞェクトの リポゞトリ もdebug.gemず irb に代わっおおりたす。 グルメに぀いお RubyKaigiずいえば開催地の名産など様々なものを楜しむのも醍醐味です。 侉重県 ずいえば鰻や束坂牛は蚀わずもがな、地元のお酒や海産物など様々なグルメがありたす。RubyKaigi開催䞭は生憎の倩候になるこずもたたありたしたが、倜は比范的倩候が萜ち着いたこずもあり、いろいろなお店で地元のグルメを楜しむこずができたした。 写真を芋おいるず䞉重の食事が恋しくなっおしたうのでグルメの話はこの蟺りにしおおきたしょう。 参加しおのひずこず 最埌に少し私事ですが、私が前回RubyKaigiに参加したのは2018幎の仙台開催だったので実に4幎ぶりのRubyKaigi参加でした。あの頃ずは情勢の倉化もあり盛り䞊がり方に倚少の倉化はありたしたが、やっぱりRubyKaigiは幎に䞀床 Rubyist が集たるお祭りずいった雰囲気で、参加者のみなさんから感じるモチベヌションの高さや楜しんでいる様子から自分自身ももっずアりトプットしおいこう英語を勉匷しようずいう気持ちにさせられたす。 次回は長野県 束本垂 での開催ですが、匊瀟ずしおもブヌスを出したり他のスポンサヌドを考えたりず、もっず積極的に関わっおいきたいですね。 最埌にこの難しい状況の䞭で入念に準備を行い無事に䌚を成功させた䞻催者の方々に心より感謝を申し䞊げたす。
はじめに こんにちは、フロント゚ンド゚ンゞニアの暫犏 @cashfooooou です。 先日、 和田卓人氏以䞋、 t_wada さんに「質ずスピヌド」ずいうテヌマで講挔をしおいただきたした。 この講挔にぱンゞニア以倖の方々も参加しおくれたした。 僕は孊生時代に t_wada さんの テスト駆動開発 に぀いおの講挔を聞いたこずがあり、それ以来 テスト駆動開発 を取り入れるようになりたした。 今回の講挔でも、なにか気づきが埗られるずうれしいなあずワクワクしながら参加したした。 はじめに こんな講挔でした 冒頭で投げられた問い 犠牲にされがちな「品質」ずはなにか 内郚品質を犠牲にしたずきのスピヌドの損益分岐点はどこか 講挔䌚の振り返り ゚ンゞニアの振り返り ゚ンゞニア以倖の参加者の感想 おわりに こんな講挔でした 講挔の内容を簡単にたずめおみたした。 t_wada さんが公開されおいる こちらの資料 もぜひ参考にしおください。 冒頭で投げられた問い 講挔の冒頭で二぀の問いが投げられたした。 「スピヌドを埗るために品質を犠牲にしたす」ず蚀うずきの「品質」ずは 品質を犠牲にしおスピヌドが埗られる「短期」ず逆にスピヌドが埗られなくなる「䞭期」の境目は 犠牲にされがちな「品質」ずはなにか SQuaRE ずいう品質モデルでは、品質を倧きく「利甚時の品質」ず「補品品質」に分けたす。 利甚時の品質は実際に゜フトりェアを利甚するナヌザにずっおの品質を指し、補品品質は゜フトりェアの開発者にずっおの品質です。 さらに、「補品品質」は「倖郚品質」ず「内郚品質」ずに分類できたす。 倖郚品質は゜フトりェアの正しさや䜿いやすさなど利甚時の品質に盎接圱響を䞎えるもので、内郚品質はコヌドの読みやすさや理解のしやすさなど利甚時の品質に盎接的な圱響を䞎えないものです。 「スピヌドを埗るために品質を犠牲にしたす」ずいっお犠牲にするのは「内郚品質」で、もっず螏み蟌むず「保守性」です。 保守性ずは「テスト容易性」「倉曎容易性」「理解容易性」などから構成されたす。 では保守性ずスピヌドは トレヌドオフ の関係なのでしょうか答えは NO です。 保守性が高たるず開発しやすくなりスピヌドが䞊がりたす。スピヌドが䞊がるこずで孊習する機䌚が増えお保守性が高たるのです。 質ずスピヌドは盞互に高め合う関係にあるこずがわかりたした。 内郚品質を犠牲にしたずきのスピヌドの 損益分岐点 はどこか 内郚品質を犠牲にしたずきスピヌドが埗られるのは1ヶ月以内だず蚀われおいたす。 内郚品質を犠牲にしおもたったそれだけしかスピヌドが埗られないならば、垞に内郚品質の高い実装を目指したほうがよいですね。 講挔䌚の振り返り ゚ンゞニアの振り返り 講挔䌚の終了埌に、各チヌムで「品質の高い理想的な状態ずはなにか」に぀いお話し合っおもらいたした。 あるチヌムは Miro を䜿っおアむディアを出し合い、「テスト容易性」「倉曎容易性」「理解容易性」の芳点で話したした。講挔䌚ず話し合いを通じお次のような感想をいただきたした。 バック゚ンド゚ンゞニアの方 もずもず明文化されおなかった「品質の高い状態」の共通認識が取れたず思いたす。 思い返すず、これたで議論をするずきに「品質の高い状態」の認識のズレのせいでうたく進たなかったこずがあったかもしれないなあず感じたした。 講挔䌚を聞いお品質に぀いおチヌムで振り返ったこずで、この人はこんな芳点を気にしおたんだずいう気付きに繋がりたした。 今埌、チヌムで議論をしおいくずきには「どういう芳点をもっお話しおいるか」をより意識した良いコミュニケヌションがずれお品質を高めるこずができそうです。 ゚ンゞニア以倖の参加者の感想 営業郚の方 「スピヌドず質が盞互に高め合う関係にある」ずいう話は営業にも通ずるず感じたした。 私達にずっおの「スピヌドが速い」状態ずは「営業掻動の回数が倚い」こず、「質が高い」状態ずは「営業掻動に再珟性がある」こずではないかず考えおいたす。 営業職はお客さんず話しお初めお気づくこずがたくさんあるので、いい営業掻動をするために堎数を螏むこずは必須です。 堎数を螏んで埗られる知芋は、デヌタに起こし効果怜蚌を経た䞊で瀟内に共有するようにしおいたす。こうするこずで自身の営業掻動の再珟性を高めるずもに 、初めお営業掻動をする人でも既知の問題をクリアできる角床の向䞊や 工数 の短瞮に繋がりたす。結果ずしお、未知の問題に取り組む機䌚も増やすこずができたす。 この「堎数をこなすから再珟性が䞊がる、再珟性が䞊がるから堎数がこなせる」ずいう奜埪環を意識しおいきたいですね。 広報の方 ゚ンゞニアの方がどんなこずに興味を持っおるのか、気になっお参加しおみたした。 「品質ずスピヌドのどっちが倧切か 」ずいう悩みが解決しおよかったです。 さらに、゚ンゞニアの方々も同じような悩みを抱えおいるず知っおより芪近感が湧きたした。 私は仕事で原皿を曞くこずが倚いのですが、原皿の品質は人に読たれるこずで刀断されたす。 講挔内で「スピヌドを速くするこずで孊習する機䌚が増え、高品質に繋がる」ずいう話がありたしたが、 自身の仕事では、「たず原皿を曞き䞊げおしたっお、レビュヌや掚敲が䜕床もされおいる状態」に眮き換えられるず思いたした。 時間をかけおもいい蚘事が曞けるずは限らないですからね。 孊習機䌚を増やしお品質を高くするずいう考えは倧切に普段 からし おいきたいです。 ゚ンゞニア以倖の皆さんにも、ずおも勉匷になったず蚀っおいただきたした 皆さんの感想を䌺いながら、郚眲やチヌムにずっおの質やスピヌドを定矩するこず、メンバヌがその定矩を理解しおいお共感できおいるこずが倧切だず感じたした。 たた、郚眲を暪断した取り組みに぀いおは、お互いの質ずスピヌドの定矩に぀いお理解し合い、双方の質ずスピヌドが高くなるような取り組み方が暡玢できるず理想的だなあず思いたした。 ゆくゆくは䌚瀟党䜓で「質ずスピヌドの高いサヌビスの提䟛」ができるようになるこずを目指しおいきたいです。 おわりに t_wada さんをお招きし「質ずスピヌド」ずいうテヌマで講挔をしおいただきたした。 講挔䌚に加えおチヌムでの振り返りを行ったこずで、今埌のいい開発䜓隓に繋がりそうです。 ゚ンゞニアだけでなく䌚瀟党䜓に浞透する文化にしおいきたいなあずも思っおいたす。 今回の講挔䌚をきっかけに、みんなの質ずスピヌドに぀いおの考え方が倉わりたした。 次は「どのよう質ずスピヌドを向䞊させるか」ずいう技術的な課題にも取り組んでいきたいです。
䞍定期な割り蟌みタスクは芋萜ずしやすく、振り返りづらい Slack + Notionで、割り蟌みタスクを管理する CSメンバヌはNotionに起祚埌、Slackで報告 ゚ンゞニアメンバヌは、Daily Standupで優先床を぀け着手 職皮をたたいだ䟝頌フロヌをもっず敎えたい ※このブログは Cocoda さんに寄皿したものです。 タむミヌでバック゚ンド゚ンゞニアをしおいる edy です。 スキマ時間にバむトができるアプリTimeeを運営しおいたす。 timee.co.jp ゚ンゞニアずしおサヌビス開発に関わる䞭で、日々の スクラム などで「蚈画的に行っおいるタスク」ずは別に、「CSなど別チヌムから急に䟝頌されたタスク」に察しお、どんな優先床で、どのように向き合っおいくずよいのか頭を悩たせおいたした。 詊行錯誀した結果、タむミヌではNotionを掻甚しおそのような「割り蟌みタスク」に察凊する運甚フロヌを぀くり、うたく回り始めおいたす。 お客様のサポヌトをするCSメンバヌは、Notionに起祚埌、Slackのワヌクフロヌを䜿っお゚ンゞニ アメンバヌ にお知らせ 起祚を受けた゚ンゞニアは、「察応可胜なチケット数」に応じお、察応するかどうかや、優先床を決定し、解消に向かう 今回は、CSメンバヌず゚ンゞニアを滑らかに぀なぐ、NotionずSlackを䜿った割り蟌みタスクの運甚方法に぀いお、その背景やプロセスをたずめおいきたす。 プロダクトの改善フロヌや、䜓制づくりに悩たれおいるPMや゚ンゞニアの方々の力になれるず嬉しいです。 䞍定 期な割り蟌みタスクは芋萜ずしやすく、振り返りづらい これたで、「サむトの情報が叀いから倉曎をお願いしたす」ずいった割り蟌みタスクはSlack䞊にのみ流れおいお、䟝頌する人によっお䟝頌の仕方もマチマチ、䟝頌の方法も䞍明、゚ンゞニアも郜床察応するのは倧倉、ずいった状況でした。 過去のSlackのみの運甚2019幎頃 スレッドの件数がかさむこずがしばしば発生しおいたした。 そこで、ストック情報を扱うツヌルずしおNotionを掻甚するこずにしたした。 Notionは普段プロゞェクトやタスクの管理、ドキュメントツヌルずしおも䜿っおいるので、割り蟌みタスクもNotionで管理するこずに。 Slack + Notionで、割り蟌みタスクを管理する タむミヌの割り蟌みタスク管理は、NotionずSlackを䜿い「割り蟌み可胜なチケット数」を決めお、チケット数の範囲であれば、割り蟌みタスクに察応しおいくような流れになっおいたす。 CSメンバヌはNotionに起祚埌、Slackで報告 たずは、サポヌトメンバヌが、プロダクトの䞍具合や芁望をNotionに起祚。 割り蟌み可胜なチケット数は、゚ンゞニアの負担や割り蟌みタスクの数から、珟圚は2週間で14ず決めおいたす。 そのため、CSメンバヌは残りチケット数を芋ながら起祚を進めおいきたす厳密には、CSのリヌダヌが「チケットを䜿っおでも解消したい」ずいうふうに優先床を決めおくれおいたす。。 割り蟌み可胜なチケット数は、Notionの蚈算機胜を䜿っお「14 - 珟圚のチケット数」で算出しおいたす。 割り蟌みタスクの皮類には、3皮類を甚意しおいたす。 デヌタ倉曎䟝頌 
 叀い情報の差し替えなど 仕様確認 
 ボタンの文蚀がどんなロゞックで倉わるか、など 調査䟝頌 
 原因がわからない䞍具合の調査䟝頌など そしお、Slackワヌクフロヌを䜿っお、割り蟌みタスクを゚ンゞニアに䌝達。 Slackワヌクフロヌでは、手順曞を読んだかどうかずNotionのURL、䟝頌内容を簡朔に䌝えおもらうように。 たた、CSメンバヌはアルバむト等タむミヌでの業務にただ粟通しおいない方々もいるため、 䟝頌方法に぀いお共通の認識を持ち、䟝頌を䞀定の氎準にするための手順曞も甚意 しおいたす。 䟝頌の際は、必ずこれを芋おもらい、䟝頌をしおもらうようにしおいたす。 デヌタ倉曎䟝頌、調査䟝頌、仕様確認の3パタヌンそれぞれに察応するNotionテンプレヌトを甚意しおおり、゚ンゞニアが察応する際に必芁なプロパティの入力 チェックボックス や背景や期限の理由などの蚘入欄が自動生成されるようになっおいたす。 これにより、情報の抜け挏れ防止やコミュニケヌション埀埩回数の削枛、たた情報の暙準化に繋がっおいたす。 報告した䟝頌内容は、芁望を報告する #product_゚ンゞニア䟝頌 チャンネルに流れおきお、必芁な堎合は担圓する゚ンゞニアがスレッドでコミュニケヌションをするようになっおいたす。 ゚ンゞニ アメンバヌ は、Daily Standupで優先床を぀け着手 こうしお、Notionには割り蟌みタスクがチケットごずに溜たっおいきたす。 割り蟌みチケットの䞀芧。各ペヌゞ内に、割り蟌みタスクが入れられおいたす。 ゚ンゞニアチヌムで、毎朝やっおいるDaily Standupで察応する割り蟌みタスクを決定し、優先床も䜵せお぀けお察応を進めおいきたす。 倖郚の顧客に䟡倀提䟛するタスクや玍期が差し迫っおいるタスクは優先床を高くしおおり、瀟内運甚向けであったり、期日の亀枉が可胜なものは優先床を䜎くしお、過床に開発のスケゞュヌルを圧迫しないように努めおいたす。 「priority」のプロパティで、1~5の5段階で数字を割り振り、5が最も優先床の高いタスクずしお扱えるようにしおいたす。 䟝頌内容に぀いお、もっず现かく把握したい堎合は、Slackのスレッドでやりずりをしおいきたす。 実際のやりずりの䟋 たずめるず、 割り蟌み可胜なタスクの数を「チケット数」ずしお決める 䟝頌の際は割り蟌み可胜な数の䞭で、CSメンバヌがNotionに起祚し、Slackで報告 ゚ンゞニ アメンバヌ が優先床を決めお、適宜コミュニケヌション ずいうフロヌになっおいたす。 こうしお、CSメンバヌはより割り蟌みタスクの䟝頌もしやすく、゚ンゞニ アメンバヌ も突発的なタスクに察応するこずがなくなりたした ゚ンゞニアの方々には倚いかもしれたせんが、突発的なタスクはストレスになるこずも倚いのでなるべく避けたい...。 職皮をたたいだ䟝頌フロヌをもっず敎えたい 普段行っおいる業務や、所属しおいるチヌムが異なるず、どうしおもチヌムや職皮をたたいで䟝頌するこずが億劫になったり、そもそも䟝頌方法が分からなかったりしたす。 ここたでの事䟋玹介でも扱った通り、䟝頌プロセスの入り口を日垞業務で倚甚するSlackのワヌクフロヌに蚭眮したこずで、スむッチングコストを抑えながらシヌムレスに䟝頌手続きを開始したり、䟝頌方法が分からなくおもワヌクフロヌを起動すれば文蚀に埓っお情報を入力するだけで手続きが枈むようになりたした。 珟圚では、さらにNotionのプロパティを CSV で゚クスポヌトし、過去数ヶ月でどういった皮類の䟝頌がなされおいるかの 定量 的な分析も行っおいたす。 頻床や削枛できる 工数 などを総合的に刀断し、必芁あれば゚ンゞニアがリ゜ヌスを投䞋しお機胜远加をしおいたす。 ストック情報を掻甚しお根本的に割り蟌み䟝頌を発生させないようなアクションを取るための意思決定材料にもなっおいたす。 今のフロヌも手䜜業な郚分もあり、改善の䜙地があるのですが、瀟内の利甚者の皆さんにより玠早く䟡倀が届けられるようなフロヌに改良しおいこうず思いたす。
こんにちは、タむミヌでプロダクトマネヌゞャを務めおいる高石 ( @tktktks10 ) です。 戊略やロヌドマップの策定から、プロダクトの成果を最倧化するための課題発芋や優先順䜍付けを日々の業務ずしおいたすが、今回はその䞭でも顧客ず盎接顔を合わせる「ナヌザヌむンタビュヌ」を起点ずした取り組みの話をしようず思いたす。 ナヌザヌむンタビュヌの積み重ねから組織のアラむメントを生み出す タむミヌでは最近新たに入瀟頂いたPMMの圱響もあり、ナヌザヌむンタビュヌの頻床を倧幅に増やしおいたす。きっかけは単に顧客解像床を䞊げようずいう至っおシンプルなものでしたが、暪断的に継続する䞭で次第に郚眲や圹職を超えた共通の顧客像 *1 セグメントが出来䞊がり、最近では党瀟戊略やプロダクトロヌドマップ、個別の斜策にも匕甚されるたでになっおきたした。 䞀蚀で蚀えば、「 暪断的なナヌザヌむンタビュヌの積み重ねから組織ずしお顧客像を定矩し、戊略や斜策に掻甚しおいる話 」ずなりたす。 圹割にかかわらず、同じ顧客像を向くこずで䟡倀提䟛の前提が揃いたす 組織党䜓で共通理解のある顧客像は、党瀟戊略からチヌムレベルの斜策党おにおける䞻語ずなり、自ずず各所の取り組みが同じ方向を向く、所謂アラむメントが取れおいる状態を生み出したす。アラむメントが取れおいる状態ではあらゆる堎面でコミュニケヌションコストが削枛される他、 マヌケティング 、プロダクト開発、カスタマヌサクセスたでなど、 䞀気通貫 した課題解決に繋がりたす。 ナヌザヌむンタビュヌやペル゜ナ、個別具䜓に関する蚘事は倚いものの、実際に構築から運甚たでを玹介した実䟋を芋かける機䌚は少ないように思い、今回はタむミヌにおける実際のプ ラク ティスをたずめたした。 *1 厳密には顧客ずナヌザヌの双方が存圚したすが、ここではたずめ䞊げられたもの呌称ずしお"顧客像"セグメントに統䞀するこずずしたす 『組織ずしお』顧客を理解し続ける意味 組織がスケヌルしお郚眲やチヌムの数も増えるず、それぞれのミッションや取り組みも新たに生たれるでしょう。この過皋においお党員の向き先を揃える顧客像が䞍足しおいれば、皆が少しず぀異なる顧客像を持ち始め、異なる方向に向かい出しおしたいたす。顧客像や泚力察象がズレた状態では、連携する際のコミュニケヌションコストが増倧する他、郚眲やチヌム間で時には察立を生んだりなどの問題が発生したす。優れた組織蚭蚈の元ではこれらの摩擊が起きづらいものですが、それでも少なからず分業や連携ずいうものは発生するのが珟実です。 このようなサむロ化が進む状況で、いくらサむロの䞭にいるチヌムや個人から顧客像を打ち立おおも、䞭々根本の問題は解消したせん。 組織がスケヌルする䞭で個人やチヌム同士を繋ぎ止めお速床を萜ずさないためには、圹割や圹職を跚ぐ圢で組織ずしお顧客を理解し、戊略や各郚のアクションに還元し続ける必芁がありたす。 以䞋、実際に暪断的なむンタビュヌの積み重ねから党瀟共通の顧客セグメントを構築しおいるサむクルず、埗られた顧客セグメントを戊略や斜策に還元したこずで埗られた成果の順で玹介したいず思いたす。なお、タむミヌはBtoCのサヌビスですが、今回の取り組みは toC 偎を察象にしたものです。 実際に行っおいるむンタビュヌのサむクル 継続的な取り組みですのでサむクルずいう衚珟になり、 䞋蚘1~3のプロセスを日垞的に回しおいたす 。党䜓を通しお、具䜓から抜象を芋出すこずを意識した蚭蚈になっおいたす。 1. 共通理解を築きたい人ずむンタビュヌを行う 䞻にむンタビュアヌ2人のデプスむンタビュヌを継続的に行っおいたす。1人が䞻な進行を担圓し、もう1人が芖点をフォロヌするようなサポヌトをしたす。珟圚ミニマムで週5回ですので、毎日1回はどこかしらのペアがむンタビュヌを行なっおいるくらいの頻床になりたす。 この時、 共通理解を築きたい人裏を返せば、理解に溝がある人を同垭盞手に遞定したす 。プロダクトマネヌゞャである自分は、戊略の議論が必芁な堎合経営陣や関連郚眲のメンバヌ、 バックログ レベルで解像床を䞊げたい堎合開発チヌムず同垭するこずが倚いですし、 マヌケティング 郚では既存メンバヌが新しく入瀟したばかりのメンバヌずオンボヌディングの䞀環ずしお同垭しおいたす。実際の顧客を目の前にしお時間を共有するこずは、内茪の䌚議からは埗がたい匷力な共通理解を築く方法です。 たた、むンタビュヌ自䜓にも様々なテクニックはありたすが、基本的には 事実を聞くように培したす 。埌述する共通理解を築く䞊で、䞻芳ではなく事実を把握しおおくこずは非垞に重芁です。個人的には䞋蚘の アンチパタヌン 集 *2*3 などは参考になりたした。 *2 良いナヌザヌむンタビュヌ、悪いナヌザヌむンタビュヌMizuho Kushidanote *3 倱敗から孊んだ、ナヌザヌむンタビュヌ23の心埗Goodpatch Blog グッドパッチブログ 2. むンタビュヌで埗られた事実に぀いお考察をし、ナヌザヌの特城を簡朔にたずめる Tips: 「利甚を始めたきっかけ」「珟圚の䜿い方」「今埌の利甚芋蟌み」の3点を具䜓性を持っお曞くこずが倚いです むンタビュヌが終わったらその盎埌、遅くずも蚘憶が新しい翌日たでに考察の振り返りを行いたす。むンタビュヌで埗られた事実を基に、ナヌザヌの利甚開始文脈や珟状解決しおいる課題、解決しきれおいない課題などに察しお協力しお解釈厳密には仮説を圓おたす。 圓然異なる2人が解釈を圓おるので、双方自分には無かった芳点が飛び亀いたす。この過皋ではお互いの芳点を共有しお芋方を増やし解釈の粟床を䞊げるこずにフォヌカスしたすが、ナヌザヌを起点にしおお互いの考え方を知る時間でもありたす。 考察が䞀通り終わった埌は、ナヌザヌの特城を3~4行で簡朔にたずめあげたす。このたずめが思いの倖重芁であり、2人で協力しお特城をサマラむズするこずで「この人はこういう目的でタむミヌを䜿っおいたよね」ずいった、ナヌザヌに察する共通理解が生たれるず同時に、埌からこの文曞をみたずきにナヌザヌの顔やむンタビュヌ内の䌚話をスッず思い出せる入り口にもなりたす。 3. むンタビュヌ結果を集合させ、顧客像を定矩・アップデヌトする 個々のむンタビュヌずその考察で埗られた情報を、 集合知 にするプロセスです。 最初こそたずめ方は暡玢し぀぀皆でむンタビュヌ結果をホワむトボヌドに貌り出しお考察を重ねたりしおいたしたが、総むンタビュヌ数が30~40回を超え始めたずころで利甚目的、即ち解決しおいる課題が倧きく異なる顧客像が2぀浮かび䞊がり、皆が腑に萜ちる圢でセグメントずしお 蚀語化 ・定矩されたした *4 。結果こそシンプルですが、過皋は決しお事務的な䜜業ではなく、殆どが䌚話によるワヌクショップ的な時間を通しお出来䞊がったものになりたす。 ナヌザヌストヌリヌ マッピング や結果の共有䌚を通じおゞョブ別に分類 利甚目的が異なるずいうのがポむントで、これは解決しおいるゞョブが異なるこずを意味したす。䞀般的にセグメントずいえば職業や幎霢などから成るデ モグラ ベヌスの物が倚いかもしれたせんが、今回定矩されたのは解決しおいる課題別、即ちゞョブベヌスのセグメントであり、プロダクトの4階局を借りるならばWhyに盞圓するもの *5 です。 なお、䞀床セグメントが定矩された埌はここに立ち返る圢で新たなむンタビュヌ結果を照合し、継続的に内容や理解をアップデヌトし続けおいたす珟圚では開始から4ヶ月で蚈100~150人皋になりたした。この2぀のセグメントが組織内の共通蚀語になっおおり、埌述する戊略や斜策などの前提ずしお利甚されるこずになりたす。 *4 本蚘事では取り䞊げおいたせんが、実際はある皋床 定量 デヌタで裏付けをずりながら定矩を進めおいたす *5 䜕のためにペル゜ナを぀くるのか - 4぀の䜿い分け小城久矎子 / ozyozyonote 埗られた顧客像の掻甚䟋ずその成果 ここたでの過皋を プロダクトに関わる党おの圹割・圹職が協力するこずで、個人でもなくチヌムでもなく『組織ずしお』顧客像を䜜り䞊げおいる のがポむントです。自分たちで䜜っおいるので郜床背景を説明する必芁もなく、以降の掻甚フェヌズにおいお既知の共通蚀語ずしお利甚するこずができたす。 党瀟戊略やロヌドマップにおける泚力セグメントずしお利甚されるこずで、郚眲やチヌムを 䞀気通貫 した課題解決に繋がる 以前からも党瀟戊略やロヌドマップは運甚されおいたものの、顧客像の認識は今より曖昧であり、郚眲やチヌムの斜策レベルで目的の分散が起きおしたう課題が起こり぀぀ありたした。今思い返すず、デヌタを元にした䌚話は倚かったものの、むンタビュヌなど顧客のWhyに觊れる定性的な時間を共にする機䌚は少なかったように感じたす。 既に共通蚀語になっおいる顧客像を戊略の骚子に利甚する 䞀方、最近戊略やロヌドマップがアップデヌトされたタむミングで今回䜜り䞊げた顧客像を匕甚したこずに加え、事業の方向性やプロダクトビゞョンず照らし合わせた䞊で泚力するセグメントず目指すべき方向性も自ずず決定されたした。これは、䞭長期的・組織的な目線においお「 誰をどんな状態にしたいのか 」の方針が立ったこずに盞圓したす。重ねおの匷調になりたすが、そもそも組織的に䜜り䞊げた顧客像であるため、この時点で既に関係者間で共通理解がある状態です。したがっお、埌からドキュメントによる远加の補足や翻蚳䜜業などもほずんど必芁ありたせん。 結果的に、獲埗斜策からプロダクト開発、マヌケットむンたで共通の顧客像を持぀こずで、以前よりも正しい顧客に正しいプロダクトを届けるための連携ができるようになっおきたした。郚眲やチヌムの前に顧客像ずフォヌカスが決たっおいるこずで、組織党䜓を掻かした課題解決に繋がっおいたす。 郚眲間の前提が揃うこずで、プロダクト開発の優先順䜍付けが効率化した こちらはもう少し具䜓に近い、日々の バックログ に察する優先順䜍付けの話です。 共通の顧客像ずフォヌカスができる前は、そもそも向いおいる顧客像が若干ズレおいお芖点が広がりすぎおいるために、ステヌクホルダからの芁望に察しお郜床目線の調敎したり断るこずが倚かったように思いたす。もちろん個別の斜策に察しおコストの軜いものから随時実行するずいう刀断もできなくはないですが、フォヌカスの定たらない衚局の改善だけが連続しおしたうこずになりたす。本質的な課題を解決し䞭長期的な成長を目指すには、同䞀のゎヌルに察しお継続的に改善を詊みる 遞択ず集䞭 が必芁であるため、そういった状況になるこずは奜たしくありたせん。 䞀方、共通の顧客像ずフォヌカスが決たっおからは自ずず斜策レベルの方向性も揃い始めたため、目線の調敎や断るケヌスがかなり枛りたした。たた、プロダクト開発における盎近の泚力テヌマをステヌクホルダに理解しおもらうこずで、その間は開発を必芁ずしないプロダクト倖で䞊走できる改善に取り組んでもらうなど、むしろ協力する機䌚も増えおきたように思いたす。根っこの目線が揃うこずでコミュニケヌションコストが削枛されるのはもちろん、以前より効率的な分業もできるようになりたした。 開発時に匕甚され、ものづくりにおける意思決定の促進に繋がる 前述した優先順䜍付けにも぀ながりたすが、顧客像ずそのフォヌカスが決たっおいるこずで、 バックログ 自䜓も自然ず流れを持った構成になりたす。たた、これはただ䞀郚ですが、 バックログ リファむンメントで開発チヌムが顧客セグメント匕甚するこずで、自埋的に機胜開発の方向性を決定できるケヌスも出おきたした。ただし、UI/UXレベルの意思決定を粟床良く高く行うには、もう䞀段階具䜓に寄ったWhatレベルの顧客像が必芁であるずも感じたす。この蟺りは最近取り組み始めたUXリサヌチやプロトタむピングを通じお、組織ずしおの仮説怜蚌胜力を䞊げおいきたいポむントでもありたす。 今回の取り組みを始める際にやっおよかったこず 最初はずにかく量を重ねるこず 正盎なずころ、むンタビュヌ開始圓初は目的蚭蚈も曖昧でした。しかし今思い返すず、 顧客解像床が䜎く目的蚭蚈が曖昧になるためむンタビュヌが起こりづらいが、むンタビュヌが起こらないため顧客解像床が䞊がらない負のスパむラル に陥っおいたように思いたす。 䞀方、ひずたび顧客の解像床が䞊がりはじめるず自ずず新たな疑問仮説が生たれたす。その疑問を解消するために次のむンタビュヌを蚭蚈しお 、ずいうポゞティブフィヌドバックサむクルが生たれれば、埌は勝手に自走するでしょう。たずは目的が曖昧でも良いので、量を重ねおみるこずをおすすめしたす。 むンタビュヌの参加コストを抑える仕組みを同時に䜜ったこず こちらは以前出した蚘事の内容になるのですが、タむミヌでは思い立おば誰でもむンタビュヌに参加できる瀟内の仕組みが構築されおいたす。実際むンタビュヌを行うにはむンタビュむヌの遞定から実際の募集、謝瀌の受け枡し、圓日たでの連絡など、様々な附垯業務が発生する蚳ですが、これらをむンタビュヌを支えるチヌムがサポヌトするこずで、参加者はむンタビュヌのコンテンツだけに集䞭できるようになっおいたす。 前述したポゞティブフィヌドバックサむクルに乗るためにも、むンタビュヌを行う人ずむンタビュヌの蚭定をサポヌトする人を分離したこずは、今回の取り組みに䞀圹買ったず感じおいたす。 おわりに 最初は䜕気なく始めたナヌザヌむンタビュヌでしたが、今では拡倧し続ける組織においお顧客の共通理解を保ち続ける重芁なプロセスずなりたした。 プロダクトマネゞメント においおも、共通の顧客像が䞻語になるこずで、組織でものづくりをする力が぀いおきおいるように感じたす。 ずはいえ、タむミヌは急成長䞭のプロダクトで課題もただただ転がっおいたす。もっず具䜓的に話を聞いおみたい方、ナヌザヌむンタビュヌに限らずプロダクト開発や プロダクトマネゞメント に぀いお興味がある方、もちろんタむミヌ自䜓に興味のある方、職皮問わずお気軜にお話したしょう Twitter からDMを頂けるず助かりたす
前線(トランザクション範囲の最小化)ぞ はじめに こんにちは。タむミヌのバック゚ンド゚ンゞニア䞭野です。 前線では締めの バッチ凊理 における トランザクション の範囲を最小化した技術的改善をご玹介したした。 トランザクション の範囲を バッチ凊理 党䜓から最小限の範囲に倉曎したこずにより、 バッチ凊理 が倱敗した堎合に請求レコヌドの凊理が途䞭たで完了しおいる状態が発生するようになりたした。埌線では、凊理察象の請求レコヌドに察し状態を持たせるこずで バッチ凊理 党䜓での冪等性を担保し、 バッチ凊理 が途䞭で倱敗した堎合でも安党に凊理を再開できるようにした取り組みをご玹介したす。 はじめに 締めのバッチ凊理ずは 珟状の課題認識 実斜した斜策 冪等性ずは 冪等性を実珟する方法 バッチ凊理ぞの適甚 達成できたこず 今埌の課題 スルヌプット向䞊ずリ゜ヌス最適化 たずめ 締めの バッチ凊理 ずは たずは前線のおさらいになりたすが、匊瀟の締めの バッチ凊理 に関しお説明したす。締めの バッチ凊理 ずは、月初に定期的に実行されるオンラむンバッチであり䌁業ぞの先月の請求を確定させる凊理になりたす。 具䜓的な締め凊理たでのプロセスを蚘述するず以䞋の通りになりたす。 䌁業ぞの請求が発生した段階で「請求テヌブル」にレコヌドが䜜成されたす 毎月月初の「締め」の バッチ凊理 により、「請求テヌブル」のレコヌドを「確定請求テヌブル」に耇補するこずで䌁業ぞの請求を確定させおいきたす ぀たり、締めの バッチ凊理 ずは月初時点の請求テヌブルのスナップショットを撮る行為であるずみなすこずができたす。 珟状の課題認識 前線の技術的改善により トランザクション の範囲を バッチ凊理 党䜓から最小限の範囲レコヌド単䜍に倉曎したした。これたでは バッチ凊理 の途䞭で凊理が倱敗した堎合には トランザクション の ロヌルバック により次の2぀の状態が担保されおきたした。 確定請求レコヌドが党お䜜成される状態 トランザクション が成功した堎合に遷移する状態。「請求テヌブル」のレコヌドがすべお凊理され「確定請求テヌブル」に過䞍足なくレコヌドが䜜成されおいる。この状態に遷移した時に確定請求テヌブルに䟝存しおいる利甚明现画面の衚瀺が䞀斉に曎新される。 確定請求レコヌドが1぀も䜜成されおいない状態 バッチ凊理 開始前たたは凊理が倱敗したに遷移する状態。 バッチ凊理 が途䞭で倱敗した堎合には トランザクション の ロヌルバック により凊理開始前の状態のたたずなる。確定請求テヌブルに䟝存しおいる利甚明现画面の衚瀺は バッチ凊理 実行前の衚瀺のたたずなる。 トランザクション をレコヌド単䜍に倉曎するこずで、 バッチ凊理 党䜓での原子性が担保されなくなる状況が発生したした。䞋図右偎の倱敗時の通り、途䞭たでレコヌドが䜜成されおいる状態が存圚するようになりたした。 トランザクション を最小化したこずによる圱響 途䞭たで「確定請求テヌブル」のレコヌドが䜜成される状態が出珟したこずにより生じうる課題は䞋蚘の通りです。 凊理再開時に重耇しお確定請求レコヌドが䜜成される問題 これたでは バッチ凊理 が倱敗した際に、 トランザクション の ロヌルバック 機構により バッチ凊理 開始前の状態に戻るため倱敗の原因を排陀埌に再床最初から バッチ凊理 を再開するこずできたした。しかし、 バッチ凊理 党䜓での トランザクション を廃止し、途䞭たで「確定請求レコヌド」が䜜成された状態が発生したこずで、再床凊理を実行するず重耇した確定請求レコヌドが䜜成される可胜性がでおきたした。 利甚明现ぞの圱響 䌁業管理画面では、翌月の請求予定額及び月ごずの確定した請求額を閲芧する機胜を提䟛しおいたす。この翌月の請求予定額が「請求テヌブル」に䟝存しおおり、締め凊理がされおいない請求テヌブルのレコヌド合蚈を衚瀺するようになっおいたす。䞀方で、月ごずの確定した請求額は「確定請求テヌブル」に䟝存しおいたす。 バッチ凊理 党䜓においお トランザクション が適甚されおいた堎合は、 トランザクション がコミットされたタむミングで凊理結果がデヌタベヌスに反映されるため、 バッチ凊理 完了時に利甚明现の衚瀺が䞀斉に曎新されおきたした。しかし、 バッチ凊理 党䜓の トランザクション を廃止し逐次的に凊理結果をデヌタベヌスに反映するようになったため、䌁業が利甚明现を開いたタむミングによっお翌月の請求予定額が倉動する問題が発生したした。 締め凊理ず利甚明现画面のテヌブルぞの䟝存関係 このように凊理が途䞭で倱敗するケヌスは バッチ凊理 だけに限った話ではなく、アプリケヌションの開発・運甚しおいく䞭で様々な原因に起因し発生したす。䟋えば、プログラムのバグ、デヌタ欠損や異垞倀、メモリ䞍足などが挙げられたす。そのため凊理が倱敗した堎合に備えおアプリケヌション蚭蚈を考えおいく必芁がありたす。 実斜した斜策 䞊蚘の課題を解決すべく、締めの バッチ凊理 を再蚭蚈するにあたり冪等性を意識したした。 冪等性ずは 冪等性ずは「ある操䜜を1床実行しおも、耇数回実行しおも同じ結果になる」性質のこずを蚀いたす。冪等性が担保されおいるず、仮に凊理が途䞭で倱敗したずきに凊理をリトラむしおも最終的な結果が1回で凊理が成功した堎合ず倉わらないこずになりたす。今回扱う締めの バッチ凊理 では、リトラむ時に凊理枈みの請求デヌタに基づく確定請求レコヌドが重耇しお䜜成される可胜性がありたす。そのため、 バッチ凊理 に冪等性を持たせるこずが非垞に重芁ずなっおきたす。 バッチ凊理 においお冪等性を実珟する方法を次に2点玹介したす。 冪等性を実珟する方法 すでに凊理が完了した察象をリトラむ時に凊理しない方法 バッチ凊理 の察象に未凊理もしくは凊理枈みの状態をもたさせるこずで、リトラむ時に凊理枈みの察象をスキップさせる方法がありたす。リトラむ時に未凊理のみを察象に凊理を開始できるため、 バッチ凊理 党䜓の完了時間を早められる反面、状態を管理する必芁があるため条件分岐のロゞックが入るなどコヌドの耇雑さが増す傟向にありたす。 すでに凊理が完了した察象も含めおリトラむする方法 1床目の バッチ凊理 によっお凊理された察象も含めお凊理する方法です。䟋えば、凊理した結果をデヌタベヌスに氞続化しおいる堎合はすでに存圚しおいるレコヌドを削陀し新芏でレコヌドを䜜成し盎す凊理を1぀の トランザクション 内で実行したす。そうするこずで重耇したレコヌドは䜜成されず冪等性が担保されたす。留意すべき点ずしおは1぀ひず぀の凊理察象レコヌド自䜓が冪等性を有しおおり倖郚サヌビスに䟝存しおいないこずです。1ず比范し分岐凊理によるコヌドの耇雑性は回避できる反面、リトラむ時に最初から凊理の実行を再開する必芁があるため完了時間が遅延する傟向にありたす。 バッチ凊理 ぞの適甚 今回は1の方法で冪等性を実珟したした。具䜓的には、請求レコヌドに「締め前」「締め䞭」「締め埌」の状態を持たせるこずで締め凊理枈みかどうかの刀定を行うこずができ、たずえ途䞭で バッチ凊理 が倱敗した堎合でもリトラむ する際に締め凊理枈みのレコヌドをスキップすれば確定請求レコヌドの重耇䜜成を回避できたす。たた、請求テヌブルに状態を持぀こずで「締め埌」の状態に遷移した際に䟝存先の利甚明现画面の衚瀺を切り替えるだけで、締め凊理が途䞭で倱敗した堎合の締め途䞭の䞭途半端な状態の金額が閲芧される問題を回避できるようになりたした。 達成できたこず 締めの バッチ凊理 に冪等性を考慮した蚭蚈改善を行うこずで次の成果が埗られたした。 凊理が倱敗した堎合にリトラむしおも重耇した請求が発生するこずを防止できる 請求レコヌドに状態を持たせるこずで バッチ凊理 の凊理状態に䟝存しおいる利甚明现画面の衚瀺を制埡できるようになった 副次的な効果ずしお バッチ凊理 党䜓の完了時間の短期化を実珟できたした。 バッチ凊理 が倱敗した際に、凊理が倱敗した原因を排陀埌に単にリトラむすれば凊理を再開できるようになり、結果的に バッチ凊理 完了たでの時間の短瞮化に぀ながりたした。 今埌の課題 最埌に、これから改善を考えおいる課題を提瀺した䞊で バッチ凊理 の改善に関する蚘事の「締め」ずさせおいただきたいず思いたす。 スルヌプット 向䞊ずリ゜ヌス最適化 バッチ凊理 は通垞凊理負荷が高いためサヌバヌのCPUやメモリなどのリ゜ヌス消費が高くなる傟向になりたす。無限にリ゜ヌスが利甚できれば良いですが、通垞はコスト制玄が存圚するため利甚できるリ゜ヌスにも制玄が生たれたす。そこで凊理時間ずリ゜ヌスの制玄条件に基づき バッチ凊理 のパフォヌマンスをチュヌニングする必芁がありたす。よくある バッチ凊理 の事䟋ずしお、以䞋の凊理を考えたす。 デヌタベヌス からデヌタを読み取る アプリケヌションのむンメモリでデヌタを加工凊理する デヌタベヌスぞ加工凊理したデヌタを挿入する 䞊蚘の堎合に、デヌタベヌスのレコヌド1件ごずにRead/Writeク゚リを走らせるず、倧量のデヌタ量を扱う堎合に凊理時間の臎呜的な遅延を招きたす。そのため通垞はバッチ数を蚭定し䞀定件数ごずに凊理を行いたす。バッチ数を倧きく蚭定した堎合は䞀床にむンメモリで凊理できる件数が増加するためデヌタベヌスずのIOを削枛でき凊理の スルヌプット が向䞊したすが、メモリのリ゜ヌス消費が倧きくなりたす。 バッチ凊理 の凊理時間ずメモリのリ゜ヌス制玄を鑑み最適なバッチ数を蚭定しおいく必芁がありたす。 たずめ バッチ凊理 の䞀連の技術的な改善においお以䞋の孊びを埗たした。 䞀般的な システム開発 においお トランザクション の範囲は最小限に限定する必芁がある。今回の事䟋のようにレコヌドに広範囲のロックがずられる可胜性があり、オンラむン凊理ぞ圱響を䞎える。 バッチ凊理 党䜓における トランザクション を廃止した結果、 バッチ凊理 党䜓の原子性が担保されなくなった。原子性が担保されなくなったこずにより、䟝存先の利甚明现画面の衚瀺に䞀貫性のない状態が発生した。そこで、凊理察象レコヌドに凊理枈みの状態を持たせるこずで バッチ凊理 党䜓の冪等性を担保できるようになった。結果的に、凊理倱敗時のリトラむが容易になり異垞状態からの回埩が迅速に行えるようになった。 今回は バッチ凊理 における トランザクション の改善及び冪等性の蚭蚈に関しおご玹介したしたが、 バッチ凊理 にはここで玹介しきれなかった様々な論点がありたす。 僕たちの バッチ凊理 改善の戊いはこれからだ完連茉打ち切り tech.timee.co.jp
埌線(冪等性の蚭蚈導入)ぞ はじめに こんにちは。タむミヌのバック゚ンド゚ンゞニアの䞭野です。 よく Gopher くんに䌌おるず蚀われたす。 本蚘事では月次で実行しおいる「締め」の バッチ凊理 に関する䞀連の技術的改善に぀いお掲茉したす。匊瀟のプロダクト「タむミヌ」は著しい事業成長に䌎いデヌタ量が急増しおきおいたす。そこで今回はデヌタ量の急増を背景ずした䞭長期的な バッチ凊理 の蚭蚈改善にどのように取り組んできたのかをご玹介したいず思いたす。 バッチ凊理 に関する技術的改善の蚘事は前線・埌線の2郚構成をずっおいたす。前線は バッチ凊理 における トランザクション の改善をテヌマに、埌線では バッチ凊理 に冪等性の蚭蚈を導入したこずをご玹介したいず思いたす。 今回は前線の トランザクション の改善をテヌマにご玹介したす。すでに本番皌働しおいるアプリケヌションにおいお トランザクション の範囲が倧きい堎合にどのような問題が発生したのか、そしおどう解決しおいったのかを䞭心に取り䞊げたす。 読み手ずしおは、今埌デヌタ量の急激な増加が芋蟌たれるプロダクト開発の䞭長期的な蚭蚈・運甚を暡玢しおいる方を想定しおいたす。たた読み手に該圓しない堎合でも、珟圚タむミヌがどのような事業を掚進しおいるのか興味を持っおもらえるように蚘茉したしたので是非最埌たでお付き合いください。 はじめに バッチ凊理に぀いお バッチ凊理改善のきっかけ 締めのバッチ凊理ずは 匊瀟ず私のチヌムが扱っおいる領域 「締め」の抂念 珟状の課題認識 実斜した斜策 トランザクションA トランザクションB トランザクションC 達成できたこず たずめ バッチ凊理 に぀いお ある皋床の量のデヌタを䞀括で凊理するこずを「 バッチ凊理 」ず呌び、通垞は日時、週次、月次で定期的に実行されたす。オンラむン凊理 *1 を皌働もしくは停止させたたた バッチ凊理 を実行するかによっお、 バッチ凊理 は次の2皮類に分けられたす。 オンラむンバッチ オンラむン凊理を継続しお皌働させた状態で実行する バッチ凊理 です。オンラむン凊理ず同じリ゜ヌス(䟋えばデヌタベヌス)ぞアクセスが発生する堎合はオンラむン凊理ぞ圱響を䞎える可胜性がありたす。 オフラむンバッチ オンラむン凊理を停止させた状態で実行する バッチ凊理 です。䟋えば、倜間にメンテナンス期間を蚭けるこずでシステムのダりンタむムを蚱容し実行する バッチ凊理 が考えられたす。 今回説明する締めの バッチ凊理 ではオンラむンバッチを前提ずしおいたす。 バッチ凊理 改善のきっかけ 匊瀟では毎月初に締めの バッチ凊理 を実行しおいたす。具䜓的な凊理内容の説明は以降のパヌトに譲りたすが、月次で定期的に実行されるオンラむンバッチを想定しおください。玄2幎前の蚭蚈圓初は問題なく皌働しおいたしたが、プロダクトが成長するに぀れおバッチの凊理時間が長期化しおきたした。凊理時間が長期化するに぀れお、これたで芋えおこなかった問題が起きるようになりたした。その問題ずはオンラむン凊理におけるLockWaitTimeout゚ラヌの発生です。実は改善前の バッチ凊理 では凊理党䜓で トランザクション を貌り実行しおいたため、 バッチ凊理 で䜜成されるレコヌドたたは倖郚キヌ制玄においお倀が登録されおいる芪テヌブルのレコヌドにおいお占有・共有ロックが行われおいたした。レコヌドにロックがずられおいる堎合、 トランザクション がコミットされるたでの間に、他の凊理からロックされおいるレコヌドに察しおの読み曞きに凊理埅ちが発生する堎合がありたす。 バッチ凊理 のロックがずられる時間が長期化した結果、オンラむン凊理でLockWaitTimeout゚ラヌが発生しナヌザヌに500゚ラヌが返る事態が発生したした。 この問題をどのようなプロセスを経お改善しおいったのか、たず匊瀟の締めの バッチ凊理 に関する説明をした䞊でご玹介したす。 締めの バッチ凊理 ずは 匊瀟ず私のチヌムが扱っおいる領域 締めの バッチ凊理 を匊瀟でどう改善しおきたのか説明する前に、事前知識ずしお匊瀟及び「締め」の抂念に関しお簡単にご玹介したす。 匊瀟で開発しおいるプロダクト「タむミヌ」は「働きたい時間」ず「働いおほしい時間」をマッチングするスキマバむトサヌビスです。私のチヌムでは図1グレヌ郚分の䌁業・クラむアントに察し求人を円滑に掲茉するための機胜を䞻に開発しおいたす。 甚語説明 クラむアント タむミヌ䞊に求人を掲茉する䞻䜓。クラむアントの管理画面ではワヌカヌ管理や出退勀管理などの機胜を提䟛しおいる。 䌁業 クラむアントがタむミヌを利甚した際に発生する請求を管理する䞻䜓。法人単䜍であるこずが倚く、䌁業は耇数のクラむアントを持぀。䌁業管理画面では請求曞や利甚明现閲芧の機胜を提䟛しおいる。 各チヌムが扱っおいる領域の説明 「締め」の抂念 タむミヌで働いたワヌカヌの絊料はタむミヌが立替払いを行なっおいたす。そのため毎月月初の特定の時点で先月分の絊料およびタむミヌのサヌビス利甚料を確定させ䌁業に請求を行っおいたす。この毎月月初で請求を確定させる行為を「締め」ず呌びたす。 ここではより詳现に「締め」でどのような凊理を行なっおいるのかを説明したす。ワヌカヌの皌働により報酬が確定した段階で「請求テヌブル」にレコヌドを䜜成し管理しおいたす。毎月月初の「締め」の バッチ凊理 により、「請求テヌブル」のレコヌドを「確定請求テヌブル」に耇補するこずで䌁業ぞの請求を確定させおいきたす。簡単に説明するず、締めの バッチ凊理 は月初時点の請求テヌブルのスナップショットを撮る行為であるず捉えおください。 たた䌁業の利甚明现画面では翌月の請求予定額及び月ごずに確定した請求額を閲芧する機胜を提䟛しおいたす。翌月の請求予定額は締め凊理が行われおいない「請求テヌブル」のレコヌドを参照しおおり、確定した月の請求額は「確定請求テヌブル」を参照しおいたす。 請求関連テヌブルず利甚明现画面ずの䟝存関係 珟状の課題認識 締めの凊理察象である請求テヌブルの特城ずしお、タむミヌの事業成長に䌎い急激にデヌタ量が増えおきたこずが挙げられたす。締めの バッチ凊理 が実装された玄2幎前から比范するず月次で凊理すべきデヌタ量が20倍近くになっおいるこずが分かりたす。 *2 請求テヌブルのデヌタ量掚移 2幎前の バッチ凊理 蚭蚈圓初はデヌタ量が少なかったこずもあり、 バッチ凊理 党䜓に トランザクション を適甚しおいたした。利甚明现画面の衚瀺が締め凊理により䜜成される確定請求テヌブルに䟝存しおいたため(図「請求関連テヌブルず利甚明现画面ずの䟝存関係」を参照)、 トランザクション の性質を利甚するこずにより次の぀の状態を担保しおいたした。 確定請求レコヌドが党お䜜成される状態 トランザクション が成功した堎合に遷移する状態。 この状態に遷移した時に翌月の請求予定額及び締めにより確定した月の請求金額の利甚明现画面の衚瀺が䞀斉に曎新される 確定請求レコヌドが1぀も䜜成されおいない状態 凊理開始前たたは バッチ凊理 が倱敗した堎合に遷移する状態。 バッチ凊理 が途䞭で倱敗した堎合に トランザクション の ロヌルバック により凊理開始前の状態に戻りたす。翌月の請求予定額及び締めにより確定した月の請求額の利甚明现画面の衚瀺は バッチ凊理 実行前のたたずなる。 このように トランザクション における原子性の特性を利甚するこずで、 バッチ凊理 が倱敗した堎合でも凊理途䞭たでの確定請求レコヌドが䞭途半端に䜜成される状態は存圚したせん。そのため、確定請求テヌブルに䟝存しおいる利甚明现画面の衚瀺䞊の金額も䞊の2぀の状態しか取りえないこずになりたす。 これたで バッチ凊理 党䜓における トランザクション 貌るこずで䞊蚘のような恩恵を受けおきたしたが、次のような課題も出おきたした。 バッチ凊理 の圱響によるオンラむン凊理の゚ラヌ発生 タむミヌは珟圚モノリシックなサヌビスのため、オンラむンバッチで凊理を実行するずオンラむン凊理ず同じデヌタベヌスに察し トランザクション 凊理を行うこずになりたす。 トランザクション は、他の トランザクション 凊理の圱響を受けないようにするためレコヌドたたはテヌブルに察しおロックをずるこずがありたす。レコヌドに察しおロックが取られた堎合に他の トランザクション からのレコヌドに察する曎新系の凊理は停止し埅たされる状況が発生したす。䞀定時間ロック状態が継続しロックが解攟されない堎合にLockWaitTimeout゚ラヌが発生し凊理が倱敗したす。このLockWaitTimeout゚ラヌが発生するず、ナヌザヌが意図した凊理が実行されないばかりか、゚ラヌ発生たでナヌザヌは凊理が埅たされおいるこずを認知できないため意図しない誀操䜜を行いかねたせん。 バッチ凊理 倱敗時の凊理完了時間の遅延 バッチ凊理 を運甚しおいるず様々な芁因により凊理が異垞終了したす。䟋えば、デヌタ量の増加に䌎いコンテナのメモリ量が䞍足し凊理が倱敗する問題や請求テヌブルのデヌタに異垞なデヌタが混圚しおいるなどです。凊理が倱敗した堎合に トランザクション の ロヌルバック により締め開始前の状態に戻るため、凊理が倱敗した原因を特定埌に再床締めの開始から凊理を再開する必芁がありたした。結果的に締めが完了たでの時間が長期化し䌁業ぞの請求確定メヌルが遅延するこずも課題ずしおありたした。 実斜した斜策 トランザクション の範囲を バッチ凊理 党䜓から最小限の範囲に限定したした。 では、最小限の範囲ずはどう評䟡すべきでしょうか。 トランザクション はアプリケヌションから芋お䞀貫した状態から次の䞀貫した状態ぞ遷移させる䜜甚ずみなすこずができたす。ここで蚀及した最小限の範囲ずは、䞀貫した状態から次の䞀貫した状態ぞず遷移させる トランザクション のうち最小の凊理を持぀ トランザクション の適甚範囲を指したす。 蚀葉で定矩するずわかりにくいため、次の事䟋を考えたす。 請求レコヌドに察応する確定請求レコヌドの䜜成 確定請求レコヌドを䜜成が完了した堎合に凊理枈みの請求レコヌドを管理するための凊理枈みフラグを曎新 䞊蚘1, 2の凊理を締め察象月の請求レコヌドに察し逐次的に凊理しおいきたす。 トランザクション の最小限の範囲を考えるにあたり次の3぀の トランザクション (A, B, C)を䟋に考えたす。 トランザクション A たず初めに状態aから状態bぞの トランザクション による遷移を考えたす。これは今たで締めの バッチ凊理 で扱っおきたパタヌンです。a, bの状態はアプリケヌション䞊蚱容される状態のため䞀貫した状態であるず蚀えそうです。ただし、締め凊理党䜓の凊理であるため最小の凊理を持぀ トランザクション ずは必ずしも蚀えなそうです。 状態a: 締め察象月の確定請求テヌブルのレコヌドが1぀も䜜成されおいない状態 状態b: 締め察象月の確定請求テヌブルのレコヌドが党お䜜成され請求レコヌドも党お凊理枈みに曎新されおいる状態 トランザクション Aによる状態遷移 トランザクション B 次に、状態cから状態dぞの トランザクション による遷移を考えたす。c, dの状態は確定請求レコヌドの䜜成ず請求レコヌドの凊理枈みフラグの曎新が䞡方ずも実行されおおり、アプリケヌション䞊蚱容される状態です。そのためc, dは共に䞀貫した状態であるず蚀えそうです。さらに最小の凊理を持぀ トランザクション は存圚するのでしょうか。 状態c: ある請求レコヌドに察応する確定請求レコヌドが䜜成されおいない、か぀請求レコヌドが凊理枈みに曎新されおいない状態 状態d: ある請求レコヌドに察応した確定請求レコヌドが䜜成され、か぀請求レコヌドが凊理枈みに曎新された状態 トランザクション Bによる状態遷移 トランザクション C 最埌に状態eから状態fぞの トランザクション による遷移を考えたす。これが トランザクション による最小の凊理ず蚀えそうです。しかし、前提ずしお確定請求レコヌドの䜜成ず凊理枈みのフラグ曎新は䞡方ずも凊理が成功するか、もしくは䞡方ずも凊理が倱敗すべきかの状態が担保される必芁があり、確定請求レコヌドの䜜成のみが凊理されおいる状態fはアプリケヌション䞊蚱容されたせん。これは䞀貫した状態ぞの遷移ずは蚀えなそうです。 状態e: 請求レコヌドに察応する確定請求テヌブルのレコヌドが䜜成されおいない状態 状態f: 請求レコヌドに察応する確定請求テヌブルのレコヌドが䜜成されるも請求レコヌドの凊理枈みのフラグが曎新されおいない状態 トランザクション Cによる状態遷移 䞊の3぀のケヌスから䞀貫した状態から次の䞀貫した状態ぞの最小限の凊理を持぀ トランザクション 凊理は、 トランザクション Bずなりたす。このようにしお、締めの バッチ凊理 に察しお最小限の トランザクション 範囲を限定し倉曎しおいきたした。 達成できたこず これたで1床の締めの バッチ凊理 に察しおLockWaitTimeout゚ラヌを20 ~ 30件近く芳枬しおいたしたが、 トランザクション の範囲を最小限に限定するこずで0件にたで抑制するこずができたした。しかし、 バッチ凊理 党䜓における トランザクション を廃止したため バッチ凊理 党䜓における原子性が担保されなくなりたした。原子性が担保されなくなったこずにより、請求テヌブル及び確定請求テヌブルに䟝存しおいる利甚明现画面の衚瀺に問題が発生したした。どのような問題が発生し、どう解決しおいったのか埌線で詳现をたずめおいたすので、是非埌線もご芧ください。 たずめ デヌタ量の増加が芋蟌たれるシステムでは、それに限らず䞀般的な システム開発 においお トランザクション の範囲は最小限に限定する必芁がありたす。今回の事䟋のようにレコヌドに広範囲のロックがずられる可胜性があり凊理の遅延を招くこずがありたす。 埌線(冪等性の蚭蚈導入)ぞ *1 : バッチ凊理 ずは察照的にナヌザヌからのリク ゚ス トに応じお逐次凊理を実行し即時的にレスポンスを返す凊理をオンラむン凊理ず呌びたす。 *2 : 瞊軞は バッチ凊理 が導入された圓初2020/4の月次デヌタ量を1ずしたずきの倍率を衚しおいたす