TECH PLAY

KINTOテクノロジーズ

KINTOテクノロジーズ の技術ブログ

969

前置きと自己紹介 今回はKINTOテクノロジーズでフロントエンドを担当しているイケダがお送り致します。最近はKINTO ONEの開発運用や新規サービス・プロジェクトの立ち上げなどをしています。 自己紹介もそこそこに前置きへ。 前置き 昨今、React / Vue.js / AngularJS / Preact / Ember など様々なJSフレームワークが台頭しています。ここ最近ですとSvelteとSolidの勢いがありますね。(個人的にMithril.jsにもっと伸びてほしい)もっと知りたい方はこちらへ https://mithril.js.org/ その中でも今回はKINTOのコーポレートサイト、KINTOテクノロジーズのコーポレートサイト、そして現在進行しているプロダクトでも採用しているSvelteを使用してみての所感、そして簡単なSGまでのコードを紹介したいと思います。 本記事で紹介するSG(静的サイトジェネレーター)とは フロントエンド目線になりますが、ブログ記事などを取得するのにAPI GET、詳細画面を取得するのにAPI GETと、それぞれアクセスするたびにリクエストが走ってしまいますね。 そうではなく、ビルド時に関連するAPI GETしてすべて静的コンテンツとして生成しておこう、といったものがSG(静的サイトジェネレーター)になります。 メリットの一例として、上記を例にするとブログ一覧画面から詳細画面への遷移時にAPI通信が走らないため、遷移が非常にスムーズです。 他にもSPAやISR、SSRなど様々なアーキテクチャがあります。   Svelteとは ビルドサイズが非常に小さく、かつ後述でも紹介している通り非常に書きやすい、読みやすいフレームワークです。 またJSフレームワークといえばニアリーイコールで仮想DOMというものがありますが、Svelteはコンパイル時にVanilla JSでDOMへの変更処理なども記述されるため、仮想DOMを含みません。 再レンダリングに必要な仮想DOMなどを構築しません。DOMの状態が変更されるとそのまま実DOMを置き換えるのです。 詳しくはこちらを読みください。 Write less code をコンセプトにしたJSフレームワーク https://svelte.jp/blog/write-less-code プロダクト紹介 KINTO コーポレートサイト https://corp.kinto-jp.com/ KINTOのコーポレートサイトはSvelteKit(SG) on[S3 + CloudFront]という構成で作られており、コーディング後、とあるブランチにマージするとGitHub Actions経由でbuildタスクが実行されS3に反映、CloudFrontで配信といった形をとっています。 ※SvelteKitはSvelteを利用したアプリケーションフレームワークです。Reactを利用したNext.jsのような立ち位置です。 詳しくはこちらへ https://kit.svelte.dev/ KINTOテクノロジーズ コーポレートサイト https://www.kinto-technologies.com/ KINTOテクノロジーズ コーポレートサイトはSvelte(SPA) on [S3 + CloudFront]を使用しています。 KINTOのコーポレートサイトがSGであるのに対して、KINTOテクノロジーズのコーポレートサイトがSPAという手法を取っているのは、KINTOテクノロジーズのコーポレートサイトのリポジトリを立てた段階ではコンテンツ数が少なかった、かつSvelteKit β版がリリースされていなかったため、Svelte(SPA)を採用しました。 が、コンテンツ数が増えてきておりSGでもいいのでは・・・?という思惑が生まれてきているのためSvelteKitへのリプレイスが待ち構えています。 Svelteの他とは違うところ 一番大きいのがライブラリではなく、 コンパイラ であるといったところでしょうか。 VueにしてもReactにしてもライブラリファイルのサイズがそれなりにビルドサイズを占めるためどうしてもビルドサイズが大きくなります 読込速度が速い = 正義 だと思っている自分にはぴったりなフレームワークです。 もちろん他のフレームワークでも読込速度、実行速度など存分に改善できるように工夫やプラグインなどが充実しています。 実導入してみてはまったところ 本当にはまったところが少ないです。 簡単なインクリメントもこれくらいの少ない行数で書けます <script> // coutを定義 let count = 0; // onclickで使用する関数 function handleClick() { count += 1; } </script> <button on:click={handleClick}> Clicked {count} {count === 1 ? 'time' : 'times'} </button> あるとするならばβ版というだけあって、まだまだ破壊的な変更が入ってくる故その都度情報の拾い上げなどが必要な程度です。 Svelte特有のSyntaxもわかりやすくて初見でもハマりにくいのではないでしょうか。 もうひとつ独特なSyntaxとして Await blocks というものがあります。 以下のクリックする度にfetchするだけのComponentをご覧ください、awaitをそのままHTMLとして書けます、リーディングに長けてますね。 <script> let promise = getRandomNumber(); async function getRandomNumber() { const URL = "xxx" const res = await fetch(URL); const text = await res.text(); if (res.ok) { return text; } else { throw new Error(text); } } function handleClick() { promise = getRandomNumber(); } </script> <button on:click={handleClick}> generate random number </button> {#await promise} <p>...waiting</p> {:then data} <p>{data}</p> {:catch error} <p style="color: red">{error.message}</p> {/await} 「本当にそんな簡単にできるのかよ、贔屓目じゃないの。」と思っている閲覧者の方へ 論ずるより手を動かせ、です。 実際にやってみましょう。 実導入してみよう! 実践 https://kit.svelte.jp/ SvelteKit公式サイトを参考に作っていきます。 まずは npm init svelte static-site-sveltekit と適当なディレクトリで実行しSvelteKitプロジェクトを作りましょう。 次いで選択肢が出てきますので Skeleton project を選択肢、他はお好みでどうぞ。 CLIがあるのは便利ですね 一通り選択すると以下のような構成になっているかと思います。 本記事では以下を採用 eslint + JavaScript with JSDoc comments + prettier + Playwright Static Site Generateしよう 今回は所謂Jamstackをやってみようと思うので、なにかしら通信をしたいと思います。 dev.to からSvelteに関する記事を取得してみようと思います。 ※本記事ではスタイリングは一切行いません、ボリュームが増えるため。 まずは記事一覧ページを作ってみます。 <script context="module"> export async function load() { let articles try { articles = await fetch(`https://dev.to/api/articles?tag=svelte&per_page=5&page=1`); articles = await articles.json(); console.log(articles) } catch (e) { console.log(e) } return { props: { articles } } } </script> <script> export let articles const PostArticles = articles </script> <svelte:head> <title>Blog</title> </svelte:head> <div> <h1>Svelte devto Articles</h1> {#each PostArticles as article} <div> <header> <h2>{article.title}</h2> <h4>Tags: {article.tags}</h4> </header> <p> {article.description} </p> <a href={`/blog/${article.id}`}>MORE</a> </div> {/each} {#if PostArticles.length === 0} <div>No Articles</div> {/if} </div> async await でdev.to APIをfetchして記事を取得、articlesに格納後 PostArticlesに代入、そしてSvelteのeach構文で描画。 context="module" で書いたものはエクスポートできます。つまり同じComponent内でも呼び出せます。 そして次のscriptセクションでDOMへ渡して、パース。 明解です。 Svelteの良いところは、セクションがはっきりしているので書き手に優しい、見通しが大変いいところに有ると思います。 Vueはeasy、Reactはsimple と聞きますが、 Svelteはeasyかつsimple なのではないでしょうか。 話が飛んでしまいましたが、次は詳細記事を作りましょう。 <script context="module"> export async function load({ fetch, params }) { let article try { article = await fetch(`https://dev.to/api/articles/${params.slug}`); article = await article.json(); console.log(article) } catch (e) { console.log(e) } return { props: { article } } } </script> <script> export let article const post = article </script> <svelte:head> <title>{article.title}</title> </svelte:head> <div> <div> <h1>{post.title}</h1> <section> {@html post.body_html} </section> </div> </div> 以上です、paramsに様々な情報が入っているのでその情報を受け取り、渡して描画。 たったこれだけです。 buildしてみよう あらかたコードは書けました。 最後です、buildをしましょう。 このままでは svete.config.js の中にstatic generateしたいという命令がありません。 https://kit.svelte.jp/docs/adapters 上記にもある通り @sveltejs/adapter-static を使用しましょう。 インストールします yarn add @sveltejs/adapter-static@next -D 次にsvelte.config.jsを書き換えます import adapter from '@sveltejs/adapter-static'; /** @type {import('@sveltejs/kit').Config} */ const config = { kit: { // prerenderを入れないとエラーになる prerender: { default: true }, adapter: adapter({ pages: 'build', assets: 'build', fallback: null }) } } export default config; いざ yarn build || npm run build buildディレクトリに生成物が格納されました。実際に記事を取得できてるのか見てみましょう。 yarn preview || npm run preview 無事に見れましたね。 あとはS3やホスティングサービス、またはレンタルサーバーなど、プロジェクトに応じて生成物を置くだけです。 所感 実際に手を動かす、目でコードを見てもらうことでSvelteの良さが伝わったと信じております。 Svelteのコンセプトにもある  Write less code コード量が少なくアプリケーションを作れる。が実感出来たのではないでしょうか。 まだまだβ版で発展途上のjsフレームワークではありますが、それでもたくさんの良さが感じられたかと思います。 では、みなさま良いSvelteライフをお過ごしください。
アバター
By Ikki Ikazaki, MLOps/Data Engineer at Analysis Group This is the first part of a multi-part series on how KINTO Technologies Corporation(KTC) developed a system and culture of Machine Learning Operations(MLOps). Subsequent posts will cover batch patterns as the prediction serving pattern using SageMaker Pipelines, SageMaker Experiments to track the experiments conducted by data scientists, and "Benkyo-kai", a series of internal study sessions, to form the common knowledge about SageMaker and MLOps with other departments. Situation We have been working on various projects using ML techniques such as demand forecast, present and residual value prediction of the used car, image classification task, and some ranking algorithms, etc. Also, there are a few data scientists in Analysis Group and it comes to the conclusion that we need to build a common platform on which we can develop, manage, and develop machine learning models using MLOps technique. However, the question is what is MLOps and how we can integrate it with the ongoing relevant projects. Actually, the term MLOps is ambiguous and some people say "it is a kind of a buzzword." — and agreed to some extent. Task Considering the above, this blog post tries to define the scope of KTC MLOps by referring to some papers and documents the predecessor had published before. When talking about MLOps, the below image (Sculley et al., 2015) is often cited in Japan as a good illustration that shows ML code is actually a fraction of the whole system. To deploy and operate at a production environment, you need to be familiar with the skills and culture of software engineering and DevOps practices, which is different from the ones of data scientists. However, there are much efforts done these days by ML experts to define the scope of MLOps and now fortunately we could refer to. In 2020, ml-system-design-pattern is published by Shibui et al at Mercari, inc., at that time, and our basic concept of MLOps is greatly influenced by such design patterns. Kreuzberger et al. (2022) also conducted some interview and literature review to try to summarize the latest basic principles and technologies usually required by MLOps. Now it is time to promote those ideas and develop them in depth within our teams. Action Goal First of all, we set the goal of our MLOps. It is not much different from the one defined by the others: to bring ML proofs of concept into production "efficiently" and "reliably" . Also, the key concepts of MLOps is depicted in the decision-tree-like-format using MindMeister, a useful mind map tool, so that it can be easily referenced by the colleagues. The below is the artifact. MindMeister was really useful when illustrate a vague concept like MLOps because of its feature to display or clear the child topics in the tree diagram. We just display the topic of scalability above not to bother you by showing the whole and mess tree of MLOps. Then, we associate the key concepts with our goal and organized like below. Note that the term "Efficiently" in our goal is rephrased as "PJ Management With Speed" in the above picture and "Reliably" is expressed as "Reliable System Integration". Both strategies are important, of course, but we prioritize "PJ Management With Speed" first. The next coming posts of multi-part series will get into the details about "Pipeline" which I think requires and thus belongs to "Scalability" subtopic and "Metadata Management" often called "Experiment Tracking" by data scientists. In this section, I just introduce those concepts in a general way. Scalability Scalability is the term to refer to the flexibility of computing resources or human workload in the organization. There are some technical words in computer science using this term such as scale out, scale in, scale up, and scale down. For data scientists, scalability is crucial at the step of the model building because it is difficult to estimate the computational capacity required to run data processing and train the machine learning algorithms in advance. Could you guess how much data and what kind of format is available in KTC for demand forecast? If you could, what happens if our business suddenly expands which leads to a rapid increase in data? It may cause system resource error and require either proper scale out in the cluster or scale up per instance. In a sense, data itself stands for uncertainty and thus we need a scalable platform on which we can process data to train and host ML models by mitigating the risk. Metadata Management(Experiment tracking) The aim of metadata management is to manage the experiments for model development by tracking its metadata and reproduce its result without the help of by data scientists or developers who conducted the experiment. It is often said that because data science is a relatively new discipline and its technique is too technical for other roles to understand — sometimes even among data scientists — , it often becomes a black box. In this situation, nobody can reproduce the model building process except for the one who created it, which leads to the risk in management once he or she is on leave. Even if other data scientists are familiar with the techniques used, without the exact information - i.e. data extracted and hyper parameters - the model building process cannot be reproduced. Thus, the ML platform needs to have the ability to easily track the metadata on the processing environment, data, models, hyper parameters, objective metrics, and any comments, etc. The well-structured metadata repository not only brings the team the blueprint of data science but also accelerates the experiment cycle for data scientists. It is well suited as one of MLOps goals. Result By clarifying the entire scope of MLOps, it becomes easier to form a common knowledge among team members by pointing out the term or requirement in the scope. This entire map is just version one in KTC and expects continuous improvement. Like AWS Well-Architected tools, it will be great if it becomes a primary source in the project initiation which needs ML integration. Sounds interesting? Next time we deep dive into how we bring the DataScience project into production with the technique of MLOps: batch pattern as the prediction serving pattern using SageMaker Pipelines. Part 2 is available from here and follow KTC Tech Blog for future posts to stay up to date. Reference Kreuzberger, D., Kühl, N., & Hirschl, S. (2022). Machine Learning Operations (MLOps): Overview, Definition, and Architecture. ArXiv, abs/2205.02302. Sculley, D., Holt, G., Golovin, D., Davydov, E., Phillips, T., Ebner, D., Chaudhary, V., Young, M., Crespo, J.-F., & Dennison, D. (2015). Hidden Technical Debt in Machine Learning Systems.. In C. Cortes, N. D. Lawrence, D. D. Lee, M. Sugiyama & R. Garnett (eds.), NIPS (p./pp. 2503-2511), . Shibui, Y., Byeon, S., Seo, J., & Jin, D. (2020). ml-system-design-pattern[GitHub Pages]. Retrieved from https://mercari.github.io/ml-system-design-pattern/
アバター
はじめに こんにちは、共通サービス開発グループで決済プラットフォームのバックエンドを担当しているGo.Wadaです。 担当しているプロダクトでは、システム立ち上げ当初からドメイン駆動設計を用いた開発をスクラムで実施しています。 この記事では、そこで得られた経験を踏まえ、チームで効率よく導入した実例をご紹介します。 ドメイン駆動設計(DDD)とは ソフトウェア開発手法の一つです。 モデリングによってソフトウェアの価値や問題解決力を高めることを目指します。 例えば、ユースケース図、ドメインモデル図といった手段でモデルを表現していきます。 また、ユビキタス言語、つまり開発者のみならずビジネスメンバー含めた関係者が同じ言葉で会話できることを目指します。 もちろん、テクニカルな面でコード品質を上げるのも目的の1つです。 例えば、疎結合・高凝集な実装を行い、スパゲッティのように絡まないようにすることで変更に強くなるようにします。 集約を守り、「尋ねるな、命じよ」(Tell, Don't Ask!)のチェックをし、SOLIDを意識するといった具合にです。 ※補足:「ドメイン」とは 「ソフトウェアで問題解決しようとする対象領域」のことです。 チームの課題感 ドメイン駆動設計を導入するにあたり、チームには次のような課題感がありました。 ソフトウェア設計手法としてDDDを選択したが思ったより難しい 個人学習するものの、理解に差がある そもそも初めて一緒に働く仲間でチームを組んでいる 一方で、チームの方針や未来像としては、 効率よく開発を進めたい システムのメンテナンス性を上げて、将来の開発でも機能開発のスピードを上げていきたい(あるいは、軌道に乗った後はスピードを落としたくない) 開発は学びの機会でもあるので、チームでうまくで学習したい というイメージをしていました。 課題感に対する解決案の1つとしての輪読会 課題感を解決する方法はいくつもありますが、ドメイン駆動設計関連書籍の輪読会を開催することで、立ち向かうことにしました。 次の点を狙ってのことです。 DDDをチームの力で読み解く 学習を効率化、より深いものにする(チームとしてのスキル向上) 輪読会で発生する雑談を通してお互いを理解し、共通認識を醸成する 前提知識を合わせることで、プルリクエストでの会話を減らす 輪読会での雑談や議論を通して、チームの一体感もより持てるようにする 輪読会の実施方法 次のような方法で輪読会を実施しました。 松岡幸一郎氏の書籍「ドメイン駆動設計 モデリング/実装ガイド」を輪読 https://little-hands.booth.pm/items/1835632 プロダクトメンバー全員の合意で全員参加 週1回30分、章毎に担当者を決めて発表 事前に担当章を読み、要点を資料にまとめる 大体発表に15分、ディスカッションに15分 輪読会でのディスカッション 記憶を頼りに書き起こしてみましたが、次のような旨の会話をしていました。 常に正しいインスタンスしか存在させない方が整合性上よさそう ドメインサービスの在り方はこうだ(迂闊に作るな、責務を限定したらよき) バリデーションのやり方の1つ、仕様オブジェクトを使ったほうが良さそう 値オブジェクトの捉え方(集約ルートを構成する要素をVOとすると安全なのでは?) presentation層とapplication層が混じってない?名づけで混乱したな アーキテクチャをどうするか(レイヤードアーキテクチャ、オニオンアーキテクチャ、クリーンアーキテクチャ、など) モデリングに着手する コードを書きたいという気持ちを抑えられないのも山々ですが、モデリングも重要ですので、毎スプリント内で定期的に時間を取ってチーム全員で臨みました。 ドメインエキスパートは決済関連システムや業務に精通しているメンバーが務めました。(ビジネスという点よりも、決済機能自体がシステムで実現されてしまっているので、システムに詳しい点も重要) 実施した内容は大まかに次の通りです。 miroを使って、決済にまつわる概念に何があるかを付箋を利用しブレストしました。 ブレスト成果物 挙がってきた概念を整理し、次のような点を議論しました。 決済プラットフォームとして必要な決済にまつわる動作は何か 動作を時系列に並べるとどうなるのか 集約ルートはどれか どのように概念整理をすると効果的に収まるのか 他の類似システムではどのようになっているか 概念整理イメージ図 ※ブレスト後だけではなく、違和感がある度に、この図に立ち返って検討しなおしました。 ブレスト進行状況イメージ図 ※デフォルメした作業進行イメージです。 議論の結果を、ドメインモデル図やユースケース図に描きました。 ドメインモデル ドメインモデル抜粋 もちろん、モデルは作っておしまいではなく、幾度となく改善を重ねました。 例えば、決済集約の決済カードエンティティを初めは専用の集約にしようと考えていました。 決済カードには決済会社の情報を持たせるイメージがあり、外部システムなので集約を分けた方が取り扱いやすいと判断したためです。 一方で、ある決済にて、このキー値を決済会社とやり取りしたという情報が発生しますが、「決済」とは切り離せない関係でもありました。 強い整合性があると判断を見直し、同一集約に含めることにしました。 ユースケース図 ※ユースケース図については、作成してみたものの、他のドキュメントと内容が被っており廃止しました。 用語集を作りました。 ブレストやモデルの作成中に、同じことを説明するのに、メンバー毎に別の言葉を使っていることに気付きます。 そこで、複数ある言葉からチームで合意できる適切な言葉を用語集で定義しました。(日本語と英語両方定義しました。) 定義した言葉は必ず使えるように、間違ってしまった場合はメンバー間で優しく(冗談を言いながら)指摘し合いました。 例えば、決済プラットフォームを導入するシステムからみて、決済前に所謂注文単位に契約が必要だとします。その契約のことを「決済指示」と呼ぶようにしました。「契約」は様々な意味にとれてしまうと思慮したためです。 また、この用語集は別のシステムやプロダクト(境界付けられたコンテキストの外側)で利用される用語と混同しないことも目的としています。 用語集イメージ 輪読会とモデリングを実施しての学びや効果 輪読会 業務と並行した輪読会は、次のような学びや効果がありました。 即実践で生かせるので、学ぶ量もプロダクトの精度も上がってよい 活かす機会が近いうちにやってくるアジャイルに合っている 共通認識ができることでプルリクエストのレビュー観点が他に向くので質が向上する 気になって関連書籍にも手が伸びる(勢いで学べる) 業務からの部分の学びだけでなく、体系的な学びもできるので学びの汎用性が高い 関係ないテーマの輪読会よりも、輪読会に能動的になれる 能動的な会話によって、チームの雰囲気がさらに良くなるため、リモートワークによる疎外感の対策にもなる ※盛り上がったため、タイムキーパーが重要でした。 モデリング モデリングを時間を取って定期的に実施することで、次のような学びや効果がありました。 実装に目が向きがちなところ、モデルから考えようという習慣がつく モデルレベルで全体像の把握が出来る 実装で迷ったときにモデルに立ち戻って頭を整理できる 今後の展望 書いてきた通りにプラクティスを実施してきましたが、執筆時点で実運用はこれからになります。 現状の開発中の状態では、成功しているように見えます。 一方で、実際の運用から受けるフィードバックを元に、これらの活動が良かったのか、課題点は何だったのかを評価したいと考えています。 また、ドメイン駆動設計自体決定論理というよりも考えるための道筋のような部分が大きいです。 運用で得られる情報も含めて更なる知見の蓄積をしていきたいと考えています。 本記事記載のプラクティスを通して学んだことまとめ 業務と並行した輪読会では、 学びのインプット/アウトプット、プロダクトへの反映、メンバーの成長をほぼ同時に達成できる 業務からの学びと体系的な学びがリンクする 関係者が能動的に関われるし、会話を通してチームの一体感が生まれる という学びがありました。 また、ドメイン駆動設計のモデリングの習慣は、 実装に目が向きがちなところ、モデルから考えようになる モデルレベルで全体像の把握が出来るので実装が局所的になりにくい 実装で迷ったときにモデルに立ち戻って頭を整理できるので混乱しにくい という学びに繋がりました。
アバター
こんにちは。分析グループ(分析G)でMLOps/データエンジニアしてます伊ヶ崎( @_ikki02 )です。 こちらは「KINTOテクノロジーズ株式会社にてどのようにMLOpsを適用していくのか」というテーマでの連載1本目です。後続の記事では、SageMaker Pipelinesを用いたバッチ推論、SageMaker Experimentsを用いた実験管理、そして、他部署も巻き込んで開催した勉強会のお話などをしていければと考えています。 背景(Situation) KINTOテクノロジーズでは機械学習を用いた様々なプロジェクトに取組んできました。新車の申込台数予測、中古車の残価予測、画像の類似度判定、ランキングアルゴリズムの開発など、様々なドメインや機械学習タスクがあります。また、分析グループにはデータサイエンティストが何名か在籍しており、それぞれの実行環境やお作法が異なったり、実験結果のスムーズな共有が難しかったことがありました。そのため、EDA(探索的データ分析のこと)やモデル開発にあたって、共通のプラットフォームが求められており、MLOpsという言葉も社内で使われるようになってきました。 ところで、MLOpsとは何でしょうか。また、既存のプロジェクトに対して、どのように組み込んでいけばよいのでしょうか。個人的にはMLOpsという言葉は抽象度が高すぎて、できれば避けたい言葉だったりします(正確には、成し遂げたい課題に対して、より適切な要素技術や言葉があるはず、と考えています)。 業務(Task) そこで、この記事では、いくつかの論文やドキュメントを参考にしながら、MLOpsの全体像を明確にしつつ、KINTOテクノロジーズで特に重要視している要素技術についてご紹介していければと思います。MLOpsの話をする際に親の顔より見た絵としてよく以下の図が紹介されているかと思います(Sculley et al., 2015)。 この図では機械学習に関連するコードはアプリケーション全体のほんの一部であることが示唆されています。実際、機械学習を本番環境のアプリケーションにデプロイする際には、ソフトウェアエンジニアリングやDevOps等の技術に習熟する必要があり、データサイエンスとはまた異なるスキルセットや文化が求められます。一方で、MLOpsはバズワード化することもなく多くの研究者等によってその定義やスコープが明確にされつつあるようにも思えます。Kreuzberger et al. (2022)は様々な分野で活躍する機械学習の専門家に対してインタビューや文献調査を実施し、MLOpsの9つの原則と要素技術の解説をまとめています。また、メルカリ社により公開されているml-system-design-patternでは、機械学習システムを本番稼働させるためのデザインパターンがまとめられており(Shibui et al., 2020)、MLOpsの社内定義に際して、大いに参考にさせていただきました。 これらの情報をKINTOテクノロジーズの内部にてよく使われている用語や技術をベースに再整理し、社内展開できるようにまとめていきました。 やったこと(Action) 目的とスコープ まず、MLOpsの目的を明文化します。目的については、KINTOテクノロジーズ独自の要素を織り交ぜるわけではなく、ある程度一般性を持たせた形にしています。すなわち、 機械学習のPoCを「効率よく」本番環境へ 「信頼性高く」デプロイし運用する その上で、MindMeisterというマインドマップツールを用いて、要素技術を樹形図状に可視化してみました。 MindMeisterは樹形図の項目を表示したり隠したりできるので、MLOpsという広範な概念をまとめる際に重宝しました。すべての項目を表示すると、見通しが悪くなるので、上記の図では「スケーラビリティ」の一部の項目を中心に展開しています。 また、この樹形図と上述の目的を照らし合わせ、以下の形式でスコープを整理しました。 目的の「効率よく」という文言に図中の「(A) PJ管理・高速化」、「信頼性高く」という文言に「(B) 信頼性を高めるシステム連携」という戦略を割当て、優先度に応じて各項目を手段(戦術)として検討できるようにしています。 いずれの戦略も重要ですが、KINTOテクノロジーズではまず「(A) PJ管理・高速化」に焦点をあて、要素技術の開発ないし普及に努めていこうと考えています。今後投稿予定の連載では、この中の「パイプライン」および「メタデータ管理(実験管理)」について取組みを詳しく紹介していこうと考えており、この記事ではその概要についてご紹介できればと思います。 スケーラビリティ 樹形図の通り、KINTOテクノロジーズでは「スケーラビリティ」という大項目の中に「パイプライン」を位置付けています。スケーラビリティとは、コンピューティングリソースや組織の人的資本に関する拡張性のことを指し、スケールアウトやスケールインといった使われ方をします。データサイエンスのプロジェクトにおいて、このスケーラビリティは重要です。データには非決定的な性質があり、予め必要なコンピューティングリソースの見積もりが難しいためです。仮に既存の設定値でうまく動作していたとしても、たとえばCMや新商品の投入といった需要喚起策で急激にスパイクした場合はいかがでしょうか。アプリケーション内で使われているMLのモデルにもよりますが、メモリやCPU(GPU)のリソース不足で障害の原因となることがよくあります。そのため、このようなリソース不足のエラーに対して柔軟にスケールアウトやスケールアップする(不要時にはうまくスケールインまたはスケールダウン)仕組みが重要になってきます。データサイエンティストがモデルを開発する「学習基盤」、モデルをデプロイし推論結果を提供する「推論基盤」、それらの橋渡しとなる「パイプライン」において、このスケーラビリティの確保は重要です。 メタデータ管理(実験管理) メタデータ管理では、開発したデータサイエンティストや機械学習エンジニア当人のサポート無しに実験結果やモデル開発を再現できるように、その過程のメタデータを記録し管理することが求められます。データサイエンスは組織においてまだまだ新しい領域だとみなされることも多く、特に他の職種の人々にとってその業務内容や関わり方について十分に認識できていることは少ないと考えます。時にはデータサイエンティスト同士でさえ、専門性(e.g. 時系列、画像、言語、テーブルデータ、地理空間、因果推論、ベイズ統計学など)が異なれば、そのデータサイエンスプロジェクトは容易にブラックボックス化してしまうことでしょう。このような状況では、データサイエンスプロジェクトの管理は属人的になり、作った当人がいない状況では誰もその業務を引継ぐことはできません。また、仮に他のデータサイエンティストがプロジェクトで使われている技術に習熟していたとしても、結果を再現するには具体的にどのようなデータがいつ使われ、ハイパーパラメータの正確な値は何であるのか、なぜそう設定したのかなど、膨大かつ厳密な情報が必要になります。そのため、良き機械学習基盤には、実行環境やデータ、利用するMLアルゴリズム、ハイパーパラメータ、評価指標、解釈などの自由記述文といったメタデータを容易に記録し保存できる機能が求められます。必要な情報がうまく管理されているメタデータレポジトリがあれば、それは実験結果やモデル開発を再現するための青写真となり、また情報を思い出すための試行錯誤も減らせるため、結果として実験サイクルを回すのにかかる時間を短縮し、プロジェクトの高速化が期待できます。そのため、メタデータ管理はMLOpsの目的に沿った戦略と考えます。 結果(Result) MLOpsの全体像を可視化することで、図中の項目や要件を指しながら、必要な範囲の業務スコープを洗い出したり、他の部署のメンバーと共通認識が持ちやすくなったと思います。ただし、この全体像はまだバージョン1なので、業務で活用していく中で継続的な改善をしていきたいです。理想としては、AWSのWell-Architectedのように、機械学習プロジェクト立上げ期に真っ先に参照されるようなフレームワークへ成長させ、定着させていけたらいいなと考えています。 いかがでしたでしょうか。次回の連載では、本記事(のスケーラビリティの項)で軽く触れたパイプラインについて、SageMaker Pipelinesを用いたバッチパターンの推論基盤についてご紹介しています(Part2は こちら よりご確認ください)。引続きご覧いただけると嬉しいです。 Reference Kreuzberger, D., Kühl, N., & Hirschl, S. (2022). Machine Learning Operations (MLOps): Overview, Definition, and Architecture. ArXiv, abs/2205.02302. Sculley, D., Holt, G., Golovin, D., Davydov, E., Phillips, T., Ebner, D., Chaudhary, V., Young, M., Crespo, J.-F., & Dennison, D. (2015). Hidden Technical Debt in Machine Learning Systems.. In C. Cortes, N. D. Lawrence, D. D. Lee, M. Sugiyama & R. Garnett (eds.), NIPS (p./pp. 2503-2511), . Shibui, Y., Byeon, S., Seo, J., & Jin, D. (2020). ml-system-design-pattern[GitHub Pages]. Retrieved from https://mercari.github.io/ml-system-design-pattern/
アバター
はじめに KINTOテクノロジーズで KINTO FACTORY のリードエンジニアをしている 中西 葵 です。現在KINTO FACTORYプロジェクトでは今後の対応車種や商品の拡充、全国展開を見据えてシステムの見直しを行っており、システム開発もモダンな技術や開発フローを取り入れている先進的なプロジェクトです。 本記事ではKINTO FACTORYで取り組んでいるスキーマファースト開発について解説します。 スキーマファースト開発とは? スキーマファイルを定義しコードジェネレーターを使用してコードを生成しAPIを開発する手法で以下のような課題を解決します。 結合してみたら型が違って動かない ドキュメントが古くてコードが正しい クライアントの実装が言語毎に重複 1. 結合してみたら型が違って動かない フロントエンド、バックエンド、各マイクロサービス間、外部サービスなどとのインターフェースとしてスキーマを定義する為、データ構造の齟齬などが発生しにくくなります。 2. ドキュメントが古くてコードが正しい ドキュメントの生成もジェネレーターを用いて出力することで運用が続くと発生しがちなドキュメントとコードの内容が乖離する状況も回避できます。 3. クライアントの実装が言語毎に重複 Webアプリ, モバイルアプリなどクライアントの開発言語が何であっても定義したスキーマファイルからコードを自動生成するため同一機能の別言語実装など開発工数のムダも防ぐことができます。 その他 チームに経験者がいない場合導入の壁が高いと感じる方も多いですが、他にも値のバリデーション、モックサーバー用コードの自動生成、git上でバージョン管理など、開発者にとっては良いこと尽くめの開発手法がスキーマファースト開発です。 KINTO FACTORYのシステム構成 KINTO FACTORYではマイクロサービスアーキテクチャを採用して以下の通り ブラウザからはGraphQL サードパーティシステムからはREST API 各マイクロサービス間はgRPC(Protocol Buffers) のような構成で通信を行う設計になっています 定義言語(IDL) 一般的にそれぞれのAPI設計において以下のようなIDL(Interface Description Language)を用いて定義していきます。 Interface IDL GraphQL GraphQL Schema https://graphql.org/learn/schema/ REST API Swagger Spec https://swagger.io/specification/ gRPC Protocol Buffers https://developers.google.com/protocol-buffers ※複数の定義言語を学ぶことは学習コストも高く効率的ではありません スキーマ変換ツール それぞれのIDLは名称や型などを定義してコードを生成することが出来るのであればSchema間での相互変換も可能ではないか?と考えて調査を進めたのが以下の表になります。 変換前 \ 変換後 GraphQL Schema Swagger Spec Protocol Buffers GraphQL Schema - ? ? Swagger Spec openapi-to-graphql - openapi2proto Protocol Buffers go-proto-gql protoc-gen-openapiv2 - GraphQL Schemaをベースに変換するツールは情報が少ない Swagger Specをベースに変換するツールは長期間メンテされていない Protocol Buffersをベースに変換するツールは上記より選択肢や情報が多い 以上の調査結果より Protocol Buffersで定義して他のSchemaに変換を行う選択をしました。 ソースファイル(.proto) 準備 1 https://github.com/googleapis/googleapis からRest APIを定義する上で必要なファイルを取得 google/api/annotations.proto google/api/http.proto google/api/httpbody.proto 準備 2 https://github.com/danielvladco/go-proto-gql からGraphQL Schemaを定義する上で必要なproto定義ファイルを取得 protobuf/graphql.proto 定義ファイル(example.proto) ※以下の定義ファイルはテックブログの記事を例に本稿用に作成したものです syntax = "proto3"; package com.kinto_technologies.blog; option go_package = "blog.kinto-technologies.com"; import "google/api/annotations.proto"; // 準備1で取得したファイルの読み込み import "protobuf/graphql.proto"; // 準備2で取得したファイルの読み込み // 記事 message Article { // タイトル string title = 1; // 著者 string author = 2; // コンテンツ string content = 3; } // リクエスト message Request { uint64 id = 1; } // 結果 message Result { uint64 id = 1; } // テックブログサービス service TechBlog { // 記事投稿 rpc PostArticle(Article) returns (Result) { option (google.api.http) = { post: "/post" }; option (danielvladco.protobuf.graphql.rpc) = { type: MUTATION }; } // 記事取得 rpc GetArticle(Request) returns (Article) { option (google.api.http) = { get: "/get/{id}" }; option (danielvladco.protobuf.graphql.rpc) = { type: QUERY }; } } .proto -> .graphql への変換 go-proto-gqlのインストール リポジトリをクローン git clone https://github.com/danielvladco/go-proto-gql.git cd go-proto-gql Protoc pluginsをインストール cd ./protoc-gen-gql go install .proto から .graphqlに変換 protoc --gql_out=paths=source_relative:. -I=. example.proto 出力ファイル(.graphql) """ テックブログサービス """ directive @TechBlog on FIELD_DEFINITION """ 記事 """ type Article { """ タイトル """ title: String """ 著者 """ author: String """ コンテンツ """ content: String } """ 記事 """ input ArticleInput { """ タイトル """ title: String """ 著者 """ author: String """ コンテンツ """ content: String } type Mutation { """ 記事投稿 """ techBlogPostArticle(in: ArticleInput): Result } type Query { """ 記事取得 """ techBlogGetArticle(in: RequestInput): Article } """ リクエスト """ input RequestInput { id: Int } """ 結果 """ type Result { id: Int } .proto -> .swagger.json への変換 protobufのインストール brew install protobuf protocol-gen-openapiv2のインストール go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest .proto から .swagger.json への変換 protoc -I . --openapiv2_out=allow_merge=true,merge_file_name=./example:. example.proto 出力ファイル(.swagger.json) { "swagger": "2.0", "info": { "title": "example.proto", "version": "version not set" }, "tags": [ { "name": "TechBlog" } ], "consumes": [ "application/json" ], "produces": [ "application/json" ], "paths": { "/get/{id}": { "get": { "summary": "記事取得", "operationId": "TechBlog_GetArticle", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/blogArticle" } }, "default": { "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/rpcStatus" } } }, "parameters": [ { "name": "id", "in": "path", "required": true, "type": "string", "format": "uint64" } ], "tags": [ "TechBlog" ] } }, "/post": { "post": { "summary": "記事投稿", "operationId": "TechBlog_PostArticle", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/blogResult" } }, "default": { "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/rpcStatus" } } }, "parameters": [ { "name": "title", "description": "タイトル", "in": "query", "required": false, "type": "string" }, { "name": "author", "description": "著者", "in": "query", "required": false, "type": "string" }, { "name": "content", "description": "コンテンツ", "in": "query", "required": false, "type": "string" } ], "tags": [ "TechBlog" ] } } }, "definitions": { "blogArticle": { "type": "object", "properties": { "title": { "type": "string", "title": "タイトル" }, "author": { "type": "string", "title": "著者" }, "content": { "type": "string", "title": "コンテンツ" } }, "title": "記事" }, "blogResult": { "type": "object", "properties": { "id": { "type": "string", "format": "uint64" } }, "title": "結果" }, "protobufAny": { "type": "object", "properties": { "@type": { "type": "string" } }, "additionalProperties": {} }, "rpcStatus": { "type": "object", "properties": { "code": { "type": "integer", "format": "int32" }, "message": { "type": "string" }, "details": { "type": "array", "items": { "$ref": "#/definitions/protobufAny" } } } } } } まとめ 本稿では、スキーマファースト開発の紹介と、複数のスキーマ定義を最小限に抑えて運用する方法としてスキーマ定義を変換するツールについて紹介しました。 複数の定義言語が入り乱れている状態を解消したい方、特にProtocol Buffersの定義からGraphQL Schemaへの変換、Swagger Specへの変換について検討している方の一助になれば幸いです。 ドキュメントの生成やバリデーション処理の自動生成、コードの自動生成などについては別の記事として公開したいと思います。 Follow us! KINTOテクノロジーズのTwitterアカウントも運用開始しました。最新情報を発信していきますのでぜひフォローをお願いします https://twitter.com/KintoTech_Dev We are hiring! KINTOテクノロジーズでは一緒にモビリティの未来を創る仲間を募集しています。カジュアル面談なども行っておりますのでご興味をお持ち頂けましたらぜひお気軽にご連絡ください。 https://www.kinto-technologies.com/#/recruit/job
アバター
はじめに my route開発Gの木下です。 普段はモバイルアプリ、フロントエンド、バックエンドを跨ぎ、PoCで先行開発を行っています。 今回は、認定スクラムマスター研修を受講する機会をもらい、無事に試験に合格し、LSMの資格取得しましたので、その経験をまとめていきます。 LSMとは 今回取得したLSMについてですが。LSMは、Scrum Inc.の認定資格で、Scrum Inc.認定スクラムマスター(Licensed Scrum Master)になります。Scrum Inc.認定スクラムマスター研修を受けた後、試験に合格すると貰える資格です。 スクラムマスターの認定団体は複数あり、それぞれで資格の名前が異なります。 名前 認定団体 URL 費用 ライセンス更新費用 LSM、Licensed Scrum Master、認定スクラムマスター Scrum Inc https://scruminc.jp/ 200,000円 / 税抜 $50 / 年 CSM、Certified Scrum Master、認定スクラムマスター Scrum Alliance https://www.scrumalliance.org/ 300,000円 / 税込 $100 / 年 PSM、Professional Scrum Master、プロフェッショナルスクラムマスター Scrum.org https://www.scrum.org/ $150 なし [参考: https://www.ryuzee.com/faq/0034/ ] LSMは、2日間のコースで講義とワークショップが含まれた内容でした。このコースを修了することで、受験資格をもらうことができます。 資格取得後は毎年の更新が必要となり、$50と更新時の試験の合格が必要になります。そのため、継続するかを検討する機会が毎年あります。 なぜ受けたのか KINTOテクノロジーズは、先端なWeb企業の組織を目指し、日本製造業としての文化・風土の足かせとなる部分を変え、ベンダーロック剥がしやレガシーシステムの改修、業務フローのシステム化を行うなど、現在進行系でDX化を進めています。 進めている中で、手法としてアジャイル開発を選択できる機会も多くなってきました。 自分の所属するグループも、アジャイル開発を選択して進めています。その中で、上長からスクラムマスター研修を薦めてもらいました。 多くの小さい規模の開発チームと同様に私が所属しているmy routeチームでもチームのメンバーの少なさから、プロダクトオーナーがスクラムマスターを兼任している現状でもありました。 薦めを受けた後に、友人や知り合いにスクラムマスターと開発者を兼任しているチームの話を多く聞き、少しずつ興味を持ちました。 再度、上長と会話し以下の考えを持ったため、受講することを決めました。 スクラムマスターを行うに当たり必須のものでは無く、無くても行うことは問題ありませんが、これまで体系的に学ぶことをしていないこともあり、良き学ぶ機会にできる スクラムやアジャイルを進めるに当たり、スクラムの人脈ネットワークの構築を行うことができる可能性 例えば、セミナーの中で弊社と同じような組織課題を抱えた会社の人と、進め方について情報交換できるのかもしれない 開発者の目線でも、スクラムマスターの考えや気持ちを学ぶことは、動き方を知る上でメリットが多い LSMを選んだ理由 資格の取得は目的ではないため、PSMは選択肢にありませんでした。 最初は、社内の人から知名度のあるCSMの方を教えてもらっていましたが。 別の社内の人からスクラムのコミュニティーネットワークを構築できるかもしれないとLSMお勧めしてもらい、またトヨタグループのTRI-AD(現ウーブン・プラネット・ホールディングス株式会社)が導入をしていたことからグループとしての相性が良かったことで、社内における信頼感が増してLSMを選びました。 事前知識 研修受講前の知識量としては、 SCRUM BOOT CAMP THE BOOK と スクラムガイド を読み終えた程度です。 また、経験値としては、かっちりとスクラムを取り入れた組織で働いたことはなく、アジャイルをふわっと取り入れているチームで働いたことがある程度になります。 研修でやったこと 研修はZoomを繋いでのオンラインでした。 参加者をいくつかのチームに分けて進めるワークショップを交えながら、講義を進めていく感じでした。 研修の前日に、以下の内容を含んだメールが届きます。 スクラムガイド 用語集 テキスト Zoom チームごとのワークシート MURAL という、オンラインホワイトボードツールのURLを貰います。 ワークシートは修了後、PDFでダウンロード可能です。 学習内容としては、スクラムマスターというものについて、歴史を含め、何をすべきなのか、そのためにどういう行動をすべきなのかを、学問的に深く学ぶ内容でした。 メンバー編成については、研修開始直後にチームビルドのワークが行われ、初めてそこで一緒にワークを行うメンバーを知ることになります。 何名か会社の同僚と一緒に受講しましたが、なるべく同じ会社、近い業種の人と組合わさらないようにと気配りがあり、自分のチームでは、全く別業種の方と組むことができました。 そのため、日々の業務の中では得られない感覚と知見に触れることができました。 進め方は、学習ステップが1つ終わるたびに、座学からワークに移って問題文が出され回答or実践する形で、説明した内容を理解するように進みます。 学習する内容はボリュームがあり、個人的にはワークよりも講義が長いと感じることが多かったです。 しかし、話を聞いていないとワークで何もできなくなるため、集中力を保つことが大事な2日間でした。 試験について 資格試験は、コース修了後すぐに受験可能でした。 回答時間は無制限ではあるものの、研修の内容、テキストとスクラムガイドを理解していないと回答できない、理解の深さを問う問題が多いと感じました。 アジャイルやスクラム未経験の人には、少し辛いところもあるかもしれません。 ですが、1回までは再受験が無料ですぐ受けられるらしい(無事に1度目で合格したため、再受験については説明で聞いた話をそのまま書いています。)ので、合格のチャンスは多いです。 まとめ・感想 チームのメンターやメンバーは、明るくてノリが良かったこともあり、終始ワークショップは暖かい空気で進みました。 ワークショップを通して普段接しない業界のメンバーと進めていけるのは新鮮で、特にとても良かったです。 しかし、リモートであるためインタラクションが少なく、打ち解ける速さや深さは、実際に会って行うとでは雲泥の差がありました。 また一緒に受講した同僚は、1日目はあまり打ち解けあえず冷めたまま進んでいたようで、自分のチームのやり取りを聞いて、「なんて羨ましい…!」とこぼしていました。 メンバーやトレーナーの質によっては、上手くチームビルドができないというガチャ要素があります。 (同僚の場合は、2日目に「あれからすごく話すようになった!やっぱりアイスブレイク大事!!」と言っていたので、無事に打ち解け合えたようです。) 研修の内容に関しては、スクラムマスターというものに対して、学問的に深く学ぶ内容でした。 業務で困っているスクラムの取り入れられない組織での解決方法などを学ぶものではないため、普段の業務での困難についての銀の弾丸を直接に得るものではありませんでした。 研修を通して学問的に学んだものを、チームや組織、仕事にどのように活かすのは自分たち次第になります。 そのため、学習したもの全てをそのまま組織に取り込めて、上手く活かせる会社は稀なので、個々の会社それぞれが、何が合うのかを試し実践を繰り返していくのが大事になっていきます。 可能ならば、ワークで知り合ったチームメンバーでもいいですし、過去の参加者など、外部の人と共有し合える機会を持てる場や機会とか、運営団体のイベントなどで用意があれば、もっと知見が広がり更に良いと思いました。 いざ自身の会社に活かすことを考えると ワークしたチームメンバーに話を聞いたところ、他社もスクラムを活かしにくい環境で、また近しい課題感を抱えているところも多くありました。 それらを踏まえ、以下3パターンの適正があるのではと考えています。 作るものが決まっている場合は、スクラムよりウォーターフォールが適する 作るものが決まっておらず、やりながら作り込む場合は、スクラムは適する サービスを高めようと業種の垣根を超えて、チームが組める風通しが良い場合、スクラムは適する 自社で学びの内容の効果を最大限に発揮するには、考えた適正のように実践しやすい環境から整える必要がありますが、いきなり整えることは一筋縄ではいきません。 時折り完成の定義が崩れてしまうプロダクトインクリメントを正したり、社内の点々と散らばった小さなスクラムチームが繋がる取っ掛かりを探して Scrum of Scrum を目指したりと、少しづつ取り組むことで現状より改善に向けていければを結びの言葉にします。
アバター
はじめに こんにちは、KINTOテクノロジーズでフロントエンドを担当している渡邊です。普段はKINTO開発グループの一員として、国内向けKINTO ONEサービスをReact.jsなどのフレームワークを用いて開発しています。エンジニア集団であるKINTO開発グループでは、毎月数名の新メンバーを受け入れていますが、規模の大きなシステムで業務領域全体を理解することは複雑であると考えています。そこで、毎月中途入社者向けのオリエンテーションを実施し、新メンバーがいち早く活躍出来るようサポートしています。本記事では、なぜ中途入社者向けのオリエンテーションは重要なのかと、実際に行っているオリエンテーションの中身をご紹介したいと思います。 グループ内オリエンテーションのアナウンス オリエンテーションを実施するべき理由 中途入社者がいち早く社内で活躍するためには、早期に職場環境に慣れ、日常的なコミュニケーションからチームでの人間関係を構築することが不可欠です。新卒社員とは異なり、社会人経験があるため、中には「オリエンテーションは必要ない」と考える方もいるかと思います。しかしながら、中途入社者であっても環境の変化にすぐ適応できるとは限りません。前職との仕事のやり方の違いや業界や社内の専門用語が分からないために、入社間もないにも関わらず、不安やモチベーション低下を感じている方もいるかと思います。私たちのチームでもオリエンテーションを行っていなかった当時は、具体的な業務にアサインされるまで何から手をつけていいのか分からず、自席で困惑しているメンバーも見受けられました。また先輩社員も業務の合間を縫って、手取り足取りレクチャーすることは負荷がかかります。 このような課題に対し、KINTO開発グループでは、独自に設計したオリエンテーションを通じて、中途入社者の不安や戸惑いを解消することで、その後の業務にも良い影響を及ぼすと考えています。中途入社者にいち早く会社に馴染んでもらえるよう、以下の3つを目的にオリエンテーションを設計・実装しました。 KINTOのサービス理解を深めてもらう 自身の役割やバリューを把握してもらう 新しい環境・職場を好きになってもらう オリエンテーションを組み立てる4つのアプローチ それでは、私たちが実際に行っているオリエンテーションを4つご紹介いたします。各回60分ほどの講義形式になっていて、先輩社員が講師役を担って進行します。 プロダクト・チーム紹介(KINTO開発グループへようこそ!) グループ内のどのチームでどのような業務を行っているかを、顔つきの相関図を用いて紹介します。入社したばかりで顔と名前が一致しない中でいきなり業務に入ることに不安を感じるという声が多く、オリエンテーションの一番初めに実施しています。チーム構成やプロダクトメンバーを何となくでも把握しておくことで、困ったときに誰に聞いたらいいかを明確にすることが出来ます。 サービス・業務説明(ハンズオンを通じてサービスの流れを体験しよう!) KINTO ONEのサービスの流れをハンズオン(シナリオ)を通じて体験してもらいます。サービスに登場する様々なアクターになりきって、ウェブ画面を操作することで、今後業務で関わるステークホルダーを把握することが出来ます。また、登場人物や用語などを図を介して説明することで、自動車業界に携わってない方でも、理解を深めることが出来ます。 システム概要説明(使われているシステム・技術について理解しよう!) 実際に稼働しているシステムの裏側について、鳥瞰図を用いて紹介しています。システム全体の構成要素や機能、相互作用について事前に把握することで自身の担当・専門領域が明確になり、スムーズにプロジェクトイン出来ると考えています。技術スタックについての質疑応答もこちらのオリエンテーションを通じて行われます。 ウェルカムランチ(先輩社員と仲良くなって会社を好きになろう!) 実は一番大事なコンテンツだと考えています!複数の先輩社員とざっくばらんと会話することで、社内の雰囲気を感じることが出来ます。堅苦しい内容は抜きにして、新入社員の方に居心地の良さを感じてもらうことを目標に実施しています。オフィス周辺のランチ情報をSlackチャンネルに流したりと社内にはグルメな方が多いです😋(座敷や掘りごたつがあるお店などを選ぶと会話が弾みます笑) オリエンテーションを実施してみて分かったこと オリエンテーションを毎月行っていく中で、多くの知見や課題を発見することが出来ます。 オリエンテーションは自由に作れる 普段の開発業務と同様に、オリエンテーションも設計や実装が必要です。バックグラウンドや年齢が異なる中途入社者だからこそ、メンバーに合わせて、言葉を噛み砕いて説明・議論しています。特にクルマの知識がない方でも理解していただけるように、サービスの関わる登場人物を図を用いて説明したり、逆質問から認識齟齬が無いように努めています。全行程終了時には理解度や有効度を測るためにアンケートを取り、今後のオリエンテーションのためにナレッジを蓄積します。月ごとに柔軟にカスタム出来るのもオリエンテーションの面白さの一つです。 同期の仲が深まる 入社間も無く不安を感じている中途入社者にとって、同期入社のメンバーは心の拠り所になると思います。新メンバーには同タイミングで研修やハンズオンを体験してもらうので、メンバー同士で試行錯誤する風景が見受けられます。そこで毎月入社する新メンバーとオリエンテーション担当者でのSlackチャンネルを作成し、気心が知れた同期とコミュニケーションが生まれるように工夫しています。実際、「大人数がいるチャンネルより小規模のグループの方が発言しやすい」という方が多いです。入社オリエンテーションを通じて、同期の仲が深まるきっかけになることは、オリエンテーションを担当していてやりがいを感じる瞬間です。 先輩社員(担当者)の業務理解が深まる オリエンテーションは先輩社員による講義形式で行われます。オリエンテーション用のドキュメントを作成する中で、他グループからヒアリングをしたり、再度ハンズオンをトライすることで、これまで知らなかった・気づけなかった業務知識が増えたりします。そのためにも、定期的なドキュメントのアップデートも必要です。オリエンテーションは新入社員のためのものと思われがちですが、先輩社員にとっても有意義なものです。先述したアンケートも毎回担当者に共有しています。 まとめ エンジニア組織において、オリエンテーションの最大の効果は、新メンバーの「不安を取り除き」ながら、短期集中して「業務知識を得る」ことで、いち早く「プロジェクトに貢献」出来、ユーザーに「価値を提供」し続けられることだと思います。 中途入社者は、細かな指導をしてもらう機会はなかなかありません。分からないことがあれば自分で調べるという風潮があります。もちろん自力解決が一番ですが、入社して間もない仲間をサポートする体制を作ることで、円滑なコミュニケーションが取れる風通しの良いチームになると思います。 今後は、これまで以上に中途入社者をサポート出来るよう、アンケートやツールを用いてオリエンテーションをアップデートしていきたいです。また、多くのグループメンバーがオリエンテーションに携わることで、多角的にコミュニケーションが生まれ、よりクオリティが高くオリジナルなオリエンテーションが作れると思います。 皆さんの会社で実施している面白いオリエンテーションなどもシェアしていただけると幸いです!
アバター
はじめに はじめまして、KINTOテクノロジーズでモビリティマーケットの開発・運用を担当しているリナです。 普段はフロントエンジニアとして、Next.jsを用いて実装しています。 この度、KINTOテクノロジーズでテックブログを始めます!! KINTOテクノロジーズ設立から約1年、弊社で取り扱うプロダクトや社員数も増え、ようやくテックブログを始めることができました👏 KINTOテクノロジーズは、年齢・性別・国籍問わず多様なメンバーが在籍しており、トヨタグループのモビリティサービスの世界展開を実現する技術集団として、日々さまざまな課題に取り組んでいます。 このブログでは、そうした課題への取り組み内容や日々の業務の様子、また、AWSを始めとしたインフラ技術やフロントエンド・バックエンド開発に役立つ情報などをエンジニアから発信していきます。 初回エントリは、KINTOテクノロジーズで取り扱うサービスと弊社の個性豊かなエンジニアによるAdvent Calender2021の記事をご紹介します! KINTOサービス紹介 KINTOテクノロジーズでは、30ヵ国で展開するグローバルモビリティブランド『KINTO』関連プロダクトや、マルチモーダルモビリティサービス『my route』など、「クルマに乗る人」に焦点を当てた新しいサービスの開発・運用を行っています。 現在(2022年7月11日時点)展開しているサービスは、以下7つです。 KINTO Global KINTO KINTOマガジン ![KINTO](/assets/blog/authors/rina.k/blog-start/kinto_logo.jpg =200x) ![Global KINTO](/assets/blog/authors/rina.k/blog-start/kinto_logo.jpg =200x) ![KINTOマガジン](/assets/blog/authors/rina.k/blog-start/kinto_magazine_logo.png =300x) my route モビリティマーケット KINTO FACTORY Vintage Club ![my route](/assets/blog/authors/rina.k/blog-start/myroute_logo.png =150x150) ![モビリティマーケット](/assets/blog/authors/rina.k/blog-start/mobility_market_logo.png =200x) ![KINTO FACTORY](/assets/blog/authors/rina.k/blog-start/kinto_factory_logo.png =200x) ![Vintage Club](/assets/blog/authors/rina.k/blog-start/vintage_club_logo.png =200x) ここで、各サービスを簡単にご紹介します。 1. KINTO 国内向けのサービスの「KINTO ONE」は、車両代金・自動車税・保険料などマイカーにかかる費用がコミコミ&月々定額のサービスです。WEB申し込みで簡単申し込みが可能、トヨタの人気車種やレクサス車からお好きな車両を選ぶことができます。付随サービスとして、 のりかえGO や わりかんKINTO があります。 2. Global KINTO グローバルに展開しているKINTOサービスです。ハイブリッド車を利用したカーシェアサービスの「KINTO SHARE」やライドシェアサービスである「KINTO JOIN」など、6つのサービスを提供しています。 3. KINTO マガジン KINTOやクルマにまつわる情報をコラムや漫画を通じてご紹介しています。 4. my route 移動手段の検索・予約・決済まで、移動に関する一連の機能をひとつのアプリ内で完結できるサービスです。電車・バス・タクシー・サイクルシェア・カーシェアなど、街の色々な移動手段を組み合わせたルートをご提案しています。 5. モビリティマーケット クルマライフの楽しさを広げるサービスです。ドライブしたいと思い立ったときにぴったりなお出かけ先はもちろん、愛車のお手入れに役立つサービスなど、多彩なプログラムをWEBサイトでご紹介しています。 6. KINTO FACTORY クルマのオーナーに向けた愛車のカスタム・機能向上サービスで、お乗りのトヨタ・レクサスのクルマに最新の安全装備等を後付けするサービスです。 7. Vintage Club みなさんとKINTOが一緒に旧車を楽しむためのコミュニティです。SNSフォロワー限定の試乗会やイベントのほか、YouTubeなどオリジナルコンテンツをお届けしています。 Advent Calender 2021 昨年のAdvent Calenderにて、個性豊かなエンジニアがインフラ・開発・マネジメントなど、多岐にわたるテーマの記事を執筆しました! 今回は、私の独断と偏見で一部のおすすめ記事を紹介します。 AWS SES。もう自前バウンス対応は不要かも。 by @okinocchi Amazon Managed Service for PrometheusにECSからアプリケーションメトリクスを収集する by @sokasanan PRテンプレートを使ってチーム力アップ! by @MrSmart 完全コンテナベースのローカル開発環境を構築する(Docker+Spring Boot+MySQL+Flyway+Spock) by @chiggg 他の記事は こちら から閲覧できます。 おわりに 本エントリでは、KINTOテクノロジーズで取り扱うサービスとAdvent Calender2021を紹介しました。少しでも弊社のサービスに興味を持っていただけると幸いです。 そして、KINTOテクノロジーズでは、一緒に働ける仲間を募集しています!詳しくは こちら から 国内だけでなく、グローバルな取り組みも毎週配信していく予定です。 今後の「KINTO Technologies Tech Blog」にご期待ください!
アバター
Introduction Hello, my name is Rina and I’m involved in Mobility Market development and operation at KINTO Technologies. Usually I work as a front-end engineer implementing websites using Next.js. We are excited to announce that we are starting a KINTO Technologies Tech Blog !! It’s been almost a year since KINTO Technologies was established, during which we saw an increase in number of employees as well as the amount of projects we handle, and we are finally able to start a tech blog! 👏 KINTO Technologies is a diverse team who tackles a multitude of challenges each day as a technical group for the global development of Toyota Group’s mobility services. In this blog, our engineers will share the details of these challenges, the state of our daily operations, and useful information on AWS and other infrastructure technologies as well as front-end and back-end development. Our first entry is about the services we offer at KINTO Technologies as well as the Advent Calendar 2021 articles by our engineers full of personality. KINTO Services Introduction KINTO Technologies develops and operates new services focusing on "people in cars", including products related to the "KINTO" global mobility brand, which is available in 30 countries, and the "my route by KINTO" multimodal mobility service. KINTO Services to be Deployed Globally As of December, 2022, the following seven services are being deployed. Service name Description ![KINTO ONE](/assets/blog/authors/rina.k/blog-start/service_logo/Kinto-One.png =600x) Subscription service that allows the customer to drive one model during the contract period. ![KINTO FLEX](/assets/blog/authors/rina.k/blog-start/service_logo/Kinto-Flex.png =600x) Subscription service that allows customers to drive multiple models during the contract period. ![KINTO JOIN](/assets/blog/authors/rina.k/blog-start/service_logo/Kinto-Join.png =600x) A corporate program that allows employees to share rides when commuting by car, thereby helping to ease traffic congestion in the surrounding area, solve parking shortages and even reduce CO2 emissions. ![KINTO SHARE](/assets/blog/authors/rina.k/blog-start/service_logo/Kinto-Share.png =600x) Car sharing service available by the minute. ![KINTO RIDE](/assets/blog/authors/rina.k/blog-start/service_logo/Kinto-Ride.png =600x) A service that calls up vehicles via an online platform and provides door-to-door transport. ![KINTO GO](/assets/blog/authors/rina.k/blog-start/service_logo/Kinto-Go.png =600x) Multi-modal services that combine several modes of transport according to customers needs and present travel route options. ![KINTO FACTORY](/assets/blog/authors/rina.k/blog-start/service_logo/Kinto-Factory.png =600x) A service that makes you 'evolve' your Toyota/Lexus vehicle by updating software, hardware features and items in a timely manner in accordance with subsequent technological innovations of your already purchased Toyota/Lexus vehicle. For more information, see here ( KINTO's global expansion ). KINTO services and related products in Japan Of the above services, the following three are currently operating in Japan (as of December 2022). ![KINTO ONE](/assets/blog/authors/rina.k/blog-start/service_logo/Kinto-One.png =600x) ![KINTO GO](/assets/blog/authors/rina.k/blog-start/service_logo/Kinto-Go.png =600x) ![KINTO FACTORY](/assets/blog/authors/rina.k/blog-start/service_logo/Kinto-Factory.png =600x) KINTO ONE KINTO ONE, a service for the domestic market, is a monthly subscription service that includes the vehicle price, automobile tax, insurance premiums, and other costs associated with a personal car. You can easily apply online and choose your favorite vehicle from popular Toyota and Lexus models. Additional services include のりかえGO (Norikae GO) and わりかんKINTO (Warikan KINTO) . KINTO also provides services such as 'my route by KINTO' and 'KINTO Magazine' as other KINTO-related products. Related service name Description ![my route](/assets/blog/authors/rina.k/blog-start/myroute_logo.png =600x) This mobility service allows customers to perform different actions, from searching for means of transport to booking and payment, to be completed within a single app. The app will suggest you routes that combine various means of transportation within a city, such as trains, buses, taxis, cycle shares, and car shares. ![Vintage Club by KINTO](/assets/blog/authors/rina.k/blog-start/vintage_club_logo.png =600x) A community for you and KINTO to enjoy vintage cars together. In addition to test driving and exclusive events for social media followers, we also upload original content on YouTube. ![Mobility Market by KINTO](/assets/blog/authors/rina.k/blog-start/mobility_market_logo.png =600x) This service extends the enjoyment of your life with a car. Our website introduces a variety of programs, such as services that help you take care of your beloved car, as well as destinations that are perfect for when you want to go for a drive. ![KINTO Magazine](/assets/blog/authors/rina.k/blog-start/kinto_magazine_logo.png =600x) Information on KINTO and cars is introduced through articles and cartoons. ![Prism Japan](/assets/blog/authors/rina.k/blog-start/prism_logo.svg =600x) A destination-inspired AI app that finds the perfect place for you. ​ ![のるウェイ!(Noruwaaaaaaaay)](/assets/blog/authors/rina.k/blog-start/noruway_logo.svg =600x) A web magazine that provides information on cars for those who feel a bit lost and want to relieve their feeling of "I wish I knew that" about cars. Advent Calendar 2021 At last year's Advent Calendar our engineers wrote about their unique take on a wide variety of themes such as infrastructure, development, and management. This time, I will introduce some recommended articles based on my personal preferences. https://qiita.com/okinocchi/items/dfc1db62d9f3988e213d https://qiita.com/sokasanan/items/738c69c7f4d6fd47378a https://qiita.com/MrSmart/items/89a9dec8e9f2a0288da9 https://qiita.com/chiggg/items/4976615fe98d5a437011 Other articles can be viewed here . Summary In this post, we introduced the services we have in KINTO Technologies as well as the content on the Advent Calendar 2021. We hope that this sparked your interest in our services. We plan to post about not only domestic but also global initiatives every week. Please look forward to what’s next in store for the "KINTO Technologies Tech Blog"! Furthermore, KINTO Technologies is looking for people to work with us! You can find more information here
アバター