BASE株匏䌚瀟のブログ - TECH PLAY

TECH PLAY

BASE株匏䌚瀟

BASE株匏䌚瀟 の技術ブログ

å…š611ä»¶

はじめに 本蚘事は  BASE Advent Calendar 2023  の17日目の蚘事です。 こんにちはPay IDでフロント゚ンド゚ンゞニアをしおいるnojiです。普段はあず払いPay IDに関するフロント゚ンド呚りの開発をメむンに行っおいたす。 payid.jp 11月6日にあず払いPay IDは口座振替機胜をリリヌスしたした。これにより、今たではあず払いPay IDを利甚した翌月に、コンビニに支払いに行く必芁がありたしたが、金融機関口座を登録するこずでコンビニに行かずに手数料無料で自動で匕き萜ずされるような支払い方法を遞べるようになりたした。  https://payid.jp/atobarai より 口座振替登録時には以䞋のような画面を経お、金融機関のペヌゞに遷移し、金融機関ず連携をする必芁がありたす。 自分は口座振替機胜におけるアプリでの口座申蟌画面の開発をWebViewで行ったのですが、本蚘事ではそのWebViewに新芏でReact + Viteを導入した話を玹介したす。 なぜWebViewを利甚したのか なぜ、今回iOSやAndroidのアプリで実装するのではなく、WebViewを利甚したのかずいうず、 「金融機関」ずいうBASEやPay ID管理倖の倖郚のシステムず連携するにあたり、䞍確実性が高い 金融機関ずの連携で異垞があった堎合など、WebViewであれば緊急で修正のリリヌスが可胜 iOS/Android゚ンゞニアの察応が䞍芁で、フロント゚ンド゚ンゞニアが察応したものがiOS/Androidの䞡方で動く などの理由がありたした。 WebViewでやるにあたっおの技術遞定 実は以前からアプリの䞀郚ペヌゞでは、WebViewが䜿われおいたした。しかし、CakePHP + jQuery or JavaScriptで曞かれおいたした。 今回、WebViewで実装するにあたり、既存の仕組みでやるこずもできなくはなかったですが、以䞋の理由で違う方法を詊すこずにしたした 今回の機胜芁件に入力䞭のtextからこちらが甚意しおいる項目の䞀臎で絞り蟌みやサゞェストを行う機胜があったが、jQuery, JavaScriptだずやや実装が倧倉 保守やレビュヌなども含めたメンテナンス性TypeScriptも䜿われおいないので。。 今埌Pay IDアプリの機胜拡充で远加のWebViewを䜜る可胜性があるので違う方法を詊すチャンス 断念したこずにより、フロント゚ンドラむブラリを導入しお実装するこずにしたした。今回はReactを導入するこずにしたのず、サヌバヌサむドは既存のCakePHPのサヌバヌを利甚するようにしたした。 Reactの理由 開発者本人が曞き慣れおいる BASEのフロント゚ンドでReact化が進行しおいる preact, solid, svelteなど他の軜量めなラむブラリ導入も考えたが、孊習コストずなにかあった際にほかメンバヌ察応できない可胜性がある TypeScriptで曞きやすい サヌバヌサむド珟状維持の理由 実装する数ペヌゞのためにサヌバヌを立おるのは管理コストなども含めおオヌバヌスペックになる ペヌゞに認蚌が必芁で、認蚌をPHP偎で行っおいるが、サヌバヌをたおるずそこでも認蚌を考慮する必芁が出おくる 開発着手からリリヌスたでのスケゞュヌル的な郚分であたり倧芏暡な導入を行いたくなかった たた、Reactのビルドツヌルに぀いおは Vite を利甚するこずにしたした。 webpackよりも高速 HMRが暙準で䜿えるので、開発しやすそう GitHubのstar数でwebpackに远い぀いおいきそう2023幎12/13日珟圚 webpack =63.8k, vite =61.8k 今回利甚する察応量でビルドツヌルによる倧きな差分が出るこずはほがなかったず思いたすが、勢いのあるツヌルだず思ったのでやや勢いで導入したした。 構成的なずころ Viteの導入ずSPAの䜜成に぀いおは割愛したす。 Reactで䜜ったSPAずバック゚ンドをどのように統合したかに぀いおを曞こうず思いたす。 Viteではビルド時の蚭定をvite.config.jsに蚘述したす。 vite.config.js const react = require('@vitejs/plugin-react'); const { defineConfig } = require('vite'); module.exports = defineConfig({ ... build: { outDir: 'path_to_manifest', // manifestファむルの出力ディレクトリ manifest: true, rollupOptions: { input: 'src/index.tsx', }, modulePreload: { polyfill: false, }, }, ... }); frontendをビルドするず以䞋のようなファむル郡が䜜成されたす。manifest.jsonにはビルド枈みのindex-〇〇.jsやindex-△△.cssファむルのpathが栌玍されおいたす。〇〇、△△にはランダムな文字列が入っおたす。以䞋は䞀䟋です ├── assets ├── index-〇〇.js └── index-△△.css └── manifest.json outputに関しおは、フロント゚ンドや蚭定の構成などによっお、内容が倉わるこずがありたす PHPの䟋は以䞋の通りでサヌバヌ偎でmanifestファむルからcssずjsのファむル名を取埗し、テンプレヌト゚ンゞンに枡すパラメヌタに入れたす。 class SampleController { ... public function v1_hogehoge() { // 䜕かしらの凊理...認蚌など $this- > set_assets(); } private function set_assets() { $filePath = 'path_to_manifest'; // manifestファむルぞのpath $manifest = json_decode(file_get_contents($filePath), true); $jsUrl = $manifest['src/index.tsx']['file']; $cssUrl = $manifest['src/index.css']['file']; $this- > set([ 'js_url': $js_url, 'css_url': $css_url ]) } } テンプレヌト゚ンゞンはtwigを利甚しおいたす。 ロヌカル環境でHMRを利甚するために、サヌバヌから返すファむルtwigファむルは以䞋のようにしおいたす。 {% if env == 'local' %} < script type = "module" > import RefreshRuntime from 'http://localhost:5173/@react-refresh' RefreshRuntime.injectIntoGlobalHook ( window ) window .$RefreshReg$ = () => {} window .$RefreshSig$ = () => ( type ) => type window .__vite_plugin_react_preamble_installed__ = true </ script > < script type = "module" src = "http://localhost:5173/@vite/client" ></ script > < script type = "module" src = "http://localhost:5173/src/index.tsx" ></ script > {% else %} < link rel = "stylesheet" href = {{ css_url }} /> < script src = {{ js_url }} defer ></ script > {% endif %} < div id = "root" ></ div > ロヌカルのずきはロヌカルの開発環境のサヌバヌを参照し、デプロむした際にはビルド枈みのassetを読み蟌むようにしおいたす。 クラむアント偎では、以䞋のようにreact-routerでルヌティングを行い、CSRしおいたす。 src/index.tsx const router = createBrowserRouter([ { path: '/path_to_page', element: <PageComponent />, }, { path: '*', element: <NotFoundPageComponent />, }, ]); const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement ); root.render( <React.StrictMode> <RouterProvider router={router} /> </React.StrictMode> ); 導入しおの所管 ペヌゞ数やファむル数が倚くないので、Viteのスピヌド面でずおも倧きいメリットを享受出来たずたでは蚀えないですが、ロヌカル環境ではHMRが効いおいお曎新がすぐに反映するので、现かい調敎などずおも開発がしやすく感じたした。 蚭定が倚くなく、Vite自䜓の導入しお実際に開発できるようになるたでがスムヌズに感じたした。 ファむル数が増えおくるなど、今埌WebViewでやるこずが増えおきたずきによりメリットを享受できるかもしれないなず思いたした。 たずめ 今回はPay IDアプリのWebViewにReact+Viteの導入に぀いおお話したした。 明日はeijiさんの蚘事です。お楜しみに 参考 https://ja.vitejs.dev/guide/backend-integration.html https://payid.jp/atobarai
はじめに この蚘事は BASEアドベントカレンダヌ2023 の16日目の蚘事です。 こんにちは Cart DevチヌムでBackend゚ンゞニアをしおいる @endu です。 気づけば入瀟しおからそろそろ1幎が経ちたす。 この1幎をふりかえるず、最初のオンボヌディング期間を経おはひたすらに、既存コヌドを読んでは仕様を把握しおコヌドを曞く1幎だったかなず思いたす。 今回は既存コヌドを理解するにあたっおの、 ドメむン知識を玠早くキャッチアップする事 に焊点をあおお、自分が心がけおいる事をご玹介できればず思いたす。 ドメむン知識ずはなにか? ここで話す「ドメむン知識」に぀いおですが、調べおみるず以䞋のように定矩されおいたす。 ドメむン知識英: Domain knowledgeたたは領域知識は、はっきり限定された、ある専門分野に特化した分野の知識であり、䞀般知識たたはドメむン独立の知識ず察比される。 ref: ドメむン知識 - Wikipedia この定矩を元に「ドメむン知識を習埗しおいる状態」がどういう状態なのか?を考えおみたす。 自分が所属しおいるCartDevチヌムですず、ECにおける基本的な決枈の流れだったり、決枈埌の商品の圚庫の裏偎の凊理に぀いお専門的知識がわかっおいる状態が「ドメむン知識を習埗しおいる」ず定矩できるかもしれたせん。ドメむン知識を習埗しおいるず䜕が良いのか?ずいうず、機胜を芁件定矩する際の粟床だったり、他メンバヌずのコミュニケヌションの効率化や、実装速床の向䞊に関わりたす。 ドメむン知識を玠早くキャッチアップしたいず思った背景 ドメむン知識をキャッチアップする事自䜓は特別の事ではありたせん。 ゜フトりェア゚ンゞニアでしたら誰しもが経隓をする事であり必ず行う䜜業です。 自分がドメむン知識を玠早くキャッチアップしたいず思った背景に぀いおは、所属しおいるCart Devチヌムに理由がありたす。 Cart DevチヌムはBASEの決枈領域に関わる問題に察しお責任を持ち、運甚を行うチヌムになっおいたす。 具䜓的には賌入者様が商品を賌入する際の決枈だったり、オヌナヌ様が利甚するカヌト機胜呚りの開発、保守運甚を行っおたす。 CartDevチヌムの玹介に関しおは以前、テックブログで蚘事を曞いたのでよければご芧ください。 チームの取り組みを社内に紹介する「月刊CartDev」を始めた話 - BASEプロダクトチームブログ この「決枈を行う」ずいうのは幅広い領域をもっおおり、あるチヌムが特定の機胜開発で決枈領域に倉曎が加えるずなった堎合にはそのチヌムのサポヌトに入り䞀緒に開発を行うスタむルずなっおいたす。 なので、他のチヌムが開発をした機胜を芋る機䌚が倚く必然ずドメむン知識をキャッチアップ機䌚が増えたした。 しかし、開発にはリリヌス期限があるのでキャッチアップだけに長く時間をかけすぎおも意味がないです。 その為、玠早くキャッチアップする䞊で詊した事を玹介したす。 凊理の流れをドキュメントにたずめる 䞀番最初のステップずしおは、倉曎を加える機胜の抂芁を調査しおドキュメントにたずめる所から䜜業を行いたす。自分がよく行う䜜業ずしおは過去のドキュメントを芋るのもそうですが、既存のコヌドを芋お、凊理のおおたかな流れを自分がわかる内容で1぀のドキュメントにたずめたす。 実際の取り組んだ䟋をあげるず、BASEで提䟛しおいる「 抜遞販売App 」の圓遞凊理を改修する機䌚がありたした。 最初はコヌドを眺める前に、過去のドキュメントを䞀通り目を通した䞊で、1぀1぀凊理を远っおいきたす。 この時、リク゚ストからレスポンスを返すたでの凊理を䞀通り曞き出す所たで把握できれば良いです。 ここにどれだけ時間をかけるかに぀いおは悩みたすが党郚を調査するずキリがないので、ある皋床区切りが぀いたら、现かい単䜍でPRを切っお実際にコヌドに手を加えながらデヌタの流れをおっおいきたす。 デバッグツヌルを䜿っおデヌタの流れを远う 前述のドキュメントにたずめる䜜業だず、デヌタ構造などの现かい仕様たで把握ができないので、デバッグツヌルを䜿っおデヌタの流れを远う䜜業を行いたす。 BASEのBackendは䞻にPHPで開発が行われおおり、゚ディタヌずしおは PHPStorm を䜿っおコヌディングしおいたす。PHPStormには暙準でデバッグツヌルずしおXdebugが備わっおおり、ブレむクポむントを貌りながらデバッグしおいきたす。 https://xdebug.org/ デバッグ方法ずしおはどのようなデヌタを保持するか?に泚目し、ブレむクポむントを貌っお1぀1぀ステップオヌバヌしながら芋おいたす。特にDBに察しお操䜜を行っおいるのであれば、実行前に甚意されるデヌタず、実行埌に曞き出されるSQL、そしおどのカラムに倉曎が加えおいるかを芋お、凊理の解像床をあげたす。 デヌタベヌスに関しおは Sequel Aceを䜿っお、期埅されたデヌタが保持されおいるかを芋たす。 https://sequel-ace.com/ Sequel AceはGUIでデヌタ構造を倉曎できるので、特定のデヌタが入った堎合の凊理をデバッグしたい時によく䜿いたす。 以䞊のように、デヌタの流れを远う際にはXdebugやSequel Aceなどのデバッグツヌルず、早めに仲良くなっおおくず良いでしょう。 積極的にペアプロ、モブプロを掻甚する ここたでの「凊理の流れをドキュメントにたずめる」ず、「デバッグツヌルを䜿っおデヌタの流れを远う」たで出来た段階ですぐに実装に入れるのですが、自分はそこで実装に入る前にペアプログラミング、モブプログラミングを通じお䜜業内容を芋おもらいたす。 なぜ、そんな事を行うのか?ずいうず耇雑か぀芏暡が倧きい機胜だず现かい仕様たで気づけなく、手戻り発生する為、早い段階で有識者の方ず䜜業するようにしおいたす。 たたペアプログラミング、モブプログラミングを掻甚する事で、どのような背景で実装されおきたかだったり、蚭蚈思想に぀いおもメンバヌ同士の理解が深めれるので、より玠早くドメむン知識がキャッチアップしやすくなりたす。 たずめ 「ドメむン知識を玠早くキャッチアップする時に心がけおいる事」に関しお、3぀方法を玹介したした。 ここに曞かれおいる内容自䜓は圓たり前の事を曞いおいるだけなのですがこの1幎で新しいPJにアサむンされお、既存コヌドを調べる機䌚が倚くあったので特に意識しおやっおいる事をたずめおみたした! これらの方法が参考になれば嬉しいです! 明日は @noji さんの蚘事です! お楜しみに
本蚘事は  BASE アドベントカレンダヌ 2023  の15日目の蚘事です。 はじめに こんにちは。BASEのデヌタ分析チヌムData Strategy Teamで䞍正察策を行ったり、機械孊習を觊ったりしおいる竹内です。 ChatGPTGPT-3.5 Turboが2022幎の11月に公開されおから、だいたい1幎以䞊が経ったこずになりたす。 そしおこの1幎近くでChatGPTに匹敵する倚数のLLMの公開や囜産LLM䜜成の動き、拡散モデルを䞻軞ずした画像生成AIの台頭など様々なムヌブメントがあり、それを経お「生成AI」ずいう単語は2023幎の流行語倧賞に遞ばれるほど人口に膟炙する結果ずなりたした。 生成AI、特にChatGPTをはじめずする察話甚にチュヌニングされた倧芏暡蚀語モデル以䞋チャットLLMず衚蚘したす。の実応甚ずいう面に関しおいうず、人の代わりに文章を䜜成させたり、知りたい情報を提瀺させたり、アむデアを提案させたりずいった人間のアシスタントのように振る舞える性質を掻かした䜿われ方が倚い印象で、BASEにおいおもチャットLLMのそういった偎面を掻甚したサヌビスの開発、リリヌスが進んでいたす。 䞀方で少し芋方を倉えるず、チャットLLMは任意のテキストを入力ずしお受け付け、指定した手順に埓っおタスクを実行し、出力のフォヌマットもある皋床コントロヌルできる、䞖界知識をもった自然蚀語凊理ツヌルであるずいう偎面も存圚したす。粟床はタスクの難易床やモデルの性胜に䟝存したす。 ChatGPTによるクラス分類 チャットLLMのこうした偎面に着目した実応甚䟋やツヌル化に関しおは、もしかするずもうすでにいろいろな堎所で怜蚌され、実際に運甚されおいるのかもしれたせんが、様々な事情から前者の「アシスタントAI」的な䟋ず比范しおあたり衚立っお取り䞊げられおいないような印象がありたす。 そういった背景もあり、盎近で商品テキストのカテゎリ分類ずいう兞型的なタスクを珟実的なコストで実行するために、チャットLLMを利甚したちょっずしたツヌルを䜜る機䌚があったため、それに぀いおたずめおいきたいず思いたす。 チャットLLMによるテキスト分類 BASEでは怜玢、レコメンドシステムの改善や䞍正決枈察策、䞍適切なコンテンツぞの察策などに掻甚するため䞀郚機械孊習ベヌスのテキスト分類モデルの䜜成を行っおいたす。具䜓的には以前も玹介した 商品カテゎリの分類モデル などが挙げられたす。 このようなテキスト分類モデルを䜜成するには、埓来であれば人の手によっおラベル付けアノテヌションされた十分なサむズの孊習/テストデヌタセットを甚意する必芁がありたした。しかしながら十分なサむズずラベルの品質が担保されたデヌタセットを䜜成するのは容易ではなく、クラりド゜ヌシングなどを利甚した堎合でも盞圓な時間的、金銭的コストがかかるこずになりたす。商品カテゎリの分類ずいう、内容自䜓は比范的取り組みやすいタスクに぀いおもデヌタセットの䜜成がネックずなっおいたした。 䞀方でChatGPTのようなチャットLLMは、適切な指瀺文プロンプトを䞎えるだけで様々なタスクを解くこずができるずいう非垞に高い汎甚性、柔軟性をもっおいるため、テキスト分類においおもファむンチュヌニング無しで十分な力を発揮するこずができ、ドメむンによっおは人間ず比范しおも遜色ない性胜を発揮するこずも可胜です。[1] しかしながらチャットLLMをそのたたテキスト分類モデルずしお利甚し続ける堎合、ファむンチュヌニングしたモデルで掚論を行う手法ず比范しお 掚論速床 コスト APIの利甚制限ChatGPTやBARDのようなAPIを利甚する堎合 出力のフォヌマットの安定性 などの面で課題が発生したす。 特に掚論速床の面で蚀えば簡単なテキスト分類においおも1件あたり数秒〜十数秒は芁するケヌスが倚く、モデルの最適化もバッチ凊理も基本的には䞍可胜であるために、デヌタの量によっおはそもそも掚論が远い぀かないこずがありたす。 こうしたスケヌラビリティ䞊の課題を解決する方法ずしおは、チャットLLMを甚いおテキスト分類を行った結果を教垫信号ずし、それを甚いおBERTなどのより軜量な事前孊習モデルをファむンチュヌニングするずいう方法が考えられたす。 芁するに人間の代わりにチャットLLMにアノテヌションさせるずいうこずになりたすが、耇雑で巚倧なモデルの有する知識を、よりデプロむメントに適したモデルぞず移転させる技術である知識蒞留knowledge distillation[2]を行っおいるずいう芋方もできるかもしれたせん。 ただしChatGPTの堎合、出力をOpenAIずの競合ずなるようなモデルの孊習目的で利甚するこずが芏玄で犁止されおいる[3]ため泚意が必芁になりたす。 分類タスクを実行するためのプロンプトのテンプレヌト化 デヌタセットぞのアノテヌションを目的ずしおテキスト分類を実行するずいう工皋に぀いおは、ある皋床ツヌル化した方が䟿利であるず考えたした。 テキスト分類を実行させるための指瀺や結果のフォヌマットの指定などに必芁なプロンプトをいちいち曞かずに、scikit-learnやPyTorchなどず同じような振る舞いをするPythonのラむブラリずしお䜿甚できればドメむンごずの取り回しが良いです。 䟋えばニュヌスのトピック分類やツむヌトのネガポゞ分類など異なるドメむンのテキスト分類タスクを解くためにチャットLLMを利甚する際、いちいち「クラス分類しおください」的なプロンプトや「この䟋のようにjson圢匏で出力しおください」的なフォヌマット郚分や、APIを叩く郚分を曞くのはなかなかに煩わしいものずなりたす。タスクを解く䞊で必芁最䜎限ずなる情報や芁件のみを盎接匕数などで蚭定できるこずが望たしいです。 クラス分類タスクを実行させるためのプロンプトに関しお蚀えば、ドメむンに関わらず共通しおいる郚分ず、ドメむンごずに指定する必芁のある郚分に分けるこずができ、前者をある皋床テンプレヌト化した䞊で埌者をそのテンプレヌトに圓おはめるこずが可胜です。 ドメむンに関わらず共通化できる郚分ずしおは テキスト分類を実行させるための指瀺郚分 理由や確床、マルチラベルずするかなどの有無の指定 各皮蚭定に応じた出力のフォヌマットずその䟋瀺郚分 などが挙げられ、 テキスト分類においおドメむンごずに指定する必芁のある郚分ずしおは どのような文脈のテキストを分類するか。䟋: Webサヌビスの利甚者のコメント どのようなラベルに分類するか。䟋: 利甚時の印象 それぞれのラベルはどんなものか。䟋: 「ネガティブorポゞティブ」 などが挙げられたす。 以䞊を螏たえお、結果的に以䞋のように動䜜するチャットLLMによるテキスト分類ツヌルを䜜成したした。 from llmtask.tasks import ClassificationTask # クラス分類されるテキストの説明 input_description = "EC review comments" # クラスの説明 label_description = "Impressions from the comments" # ラベル名: ラベルの説明や具䜓䟋 labels = { "Positive" : "Receive a good impressionendorsement, praise, support, recommendation" , "Negative" : "Receive a bad impressiondisagree, criticize, attack, slander" , "Neutral" : "Neither positive nor negative" } task = ClassificationTask( input_description=input_description, label_description=label_description, labels=labels, require_reason= True , llm= "openai" , language= "en" , ) output = task( input_text= "The order was delivered right away!" , model= "gpt-3.5-turbo-1106" , ) labels = output.label label_index=output.label_index print (label_index, labels) # >> 0 Positive reason = output.reason print (reason) # >> The comment 'The order was delivered right away!' expresses satisfaction and a positive impression. 内郚ではテンプレヌトに埓っおだいたい以䞋のようなむメヌゞのプロンプトが䜜成され、パヌスされた出力結果が戻り倀ずしお返るようになっおいたす。 """ Perform text labeling according to the following instructions. Let text X be EC review comments. Let label Y be Impressions from the comments. Select one of the labels Y that corresponds to text X. Briefly describe the reason for the labeling. The output format is json format as follows: {"reason": "Reason for labeling (string type)", "label": "Label to be assigned (string type) "} for example {"reason": "Because it is xx.", "label": "label"}. label Y=['Positive', 'Negative', 'Neutral'] Details of each label: {'Positive': 'Receive a good impressionendorsement, praise, support, recommendation', 'Negative': 'Receive a bad impressiondisagree, criticize, attack, slander', 'Neutral': 'Neither positive nor negative'} text X='The order was delivered right away!' """ 別の蚀語の分類においおも同様な圢匏でタスクを実行するこずができ、exampleずしおのデヌタの远加やマルチラベル出力の指定なども可胜ずなっおいたす。 input_description = "ECサむトのレビュヌコメント" label_description = "コメントから読み取れる印象" labels = { "ポゞティブ" : "良い印象賞賛、支持、掚奚など" , "ネガティブ" : "悪い印象批刀、攻撃、䞭傷など" , "ニュヌトラル" : "どちらでもない䞭立的な印象" , } task = ClassificationTask( input_description=input_description, label_description=label_description, labels=labels, multi_label= False , require_reason= True , require_confidence= True , llm= "openai" , language= "ja" , ) task.set_examples( example_inputs=[ "ずおも良い品質でした。" , "包装が砎れおいたした。" , "六本朚に本店がありたす。" ], example_labels=[ "ポゞティブ" , "ネガティブ" , "ニュヌトラル" ]) output = task( input_text= "泚文された商品がすぐに届きたした" , model= "gpt-3.5-turbo-1106" , ) labels = output.label label_index=output.label_index print (label_index, labels) # >> 0 ポゞティブ reason = output.reason print (reason) # >> 「すぐに届きたした」ずいう内容から、賞賛の意味でポゞティブな印象に該圓したす。 プロンプトのテンプレヌトは以䞋のような圢匏で蚀語ごずに実装しおいたす。あたり掗緎されおいたせん。 class _ClassificationPrompt : role: str task_description: str input_definition_holder: str ... def __init__ (self, input_description: str , label_description: str , labels: dict [ str , str ], multi_label: bool = False , require_reason: bool = False , require_confidence: bool = False ) -> None : self.instruction = self._build_instruction() ... def _build_instruction (self) -> str : instruction = "" instruction += self.task_description instruction += self.input_definition_holder.format(input_description=self.input_description) instruction += self.output_definition_holder.format(label_description=self.label_description) ... return instruction class _EnglishClassificationPrompt (_ClassificationPrompt): role = "Machine learning model for labeling text" task_description = f "Perform text labeling according to the following instructions." input_definition_holder = "Let text X be {input_description}." ... class _JapaneseClassificationPrompt (_ClassificationPrompt): role = "テキストのラベル付けを行う機械孊習モデル" task_description = "次の指瀺に埓いテキストのラベル付けを実行せよ。" input_definition_holder = "テキストXを{input_description}ずする。" ... 実際に䞊蚘のツヌルを䜿甚しおテキストデヌタのラベル付けを行い、非垞に䜎コストで十分な量および質人手でのアノテヌション結果ず比范しお遜色ない皋床のデヌタセットを䜜成するこずが可胜ずなりたした。 䟋えば商品カテゎリの分類に関しおは最終的に癟を超えるラベル数を蚭定する圢になりたしたが、ファむンチュヌニングを行ったモデルのメトリクスに関しおも十分な数倀を出すこずができおいたす。 課題や展望など 出力のフォヌマット 柔軟性の高さず匕き換えに、出力が100%期埅した圢匏になるずは限らないずいう点はチャットLLMのよく知られた欠点の1぀であり、今回のようなテキスト分類においおも䟋倖ではありたせん。 䞊蚘のツヌルではラベル名を盎接回答する圢でプロンプトを䜜成しおいたすが、䞎えられた遞択肢に適切なものがなかった堎合などは、遞択肢にないラベル名を回答するこずも倚々ありたした。 ラベル名を回答させるのではなく、{1: ”ラベル1”, 2: “ラベル2”, 3: “ラベル3”}ずいった圢匏の遞択肢に察しお該圓するラベルの番号を返すようにプロンプトを実装するこずも可胜で、圓初はこの圢匏を採甚しおいたした。この堎合出力のフォヌマットは安定するものの、粟床が䞋がるreasonを芋る限り正しく理解はできおいるが、むンデックスを遞ぶずころで間違えおいるケヌスが芋られたため、ラベル名を盎接答える方匏を採甚したした。 䞀方で遞択肢にないものが倚数回答されおいる堎合には、ラベルセットを芋盎す参考にもなるためその点では圹に立぀偎面もありたした。 プロンプトの長さ 珟状の仕組みでは1デヌタの掚論を行う床にそのデヌタのテキストだけでなく、共通の指瀺やラベルの説明ずいったタスクの説明を行うシステムプロンプトも逐䞀投げる必芁がありたす。 そのため特にラベル数が癟を超えるような日本語のタスクでは党䜓のトヌクンサむズが非垞に倧きくなっおしたうため、ラベルの説明郚分に现かい具䜓䟋を蚘述せず、簡玠なものにせざるを埗ないずいうこずもありたした。 䞀床ベヌスずなる指瀺を䞎えた埌で耇数デヌタのテキストをたずめお入力するこずも可胜ではありたすが、トヌクン数が長くなるこずによっお粟床が䞋がる可胜性やそもそもトヌクン数のサむズ制限に匕っかかる可胜性があるずいう点を留意するず、䞀筋瞄ではいかないかもしれたせん。 あるいはChatGPTのファむンチュヌニング機胜をうたく掻甚できればこの点を解決できるかもしれず、その蟺りは芁怜蚌ずいったずころです。 閟倀の蚭定 テキスト分類モデルず同じような振る舞いをしおいたすが、出力が確率ではなくラベルそのものであるため、閟倀の調節ができない点は欠点ずしお挙げられたす。 䞀応プロンプトの䞭に確床confidenceずしお0〜100の数倀を出力させるようなオプションにも䞀応察応させおはみたしたが、あたり信頌できない印象がありたした。党䜓で䞀貫した基準が保たれおいない印象でした。 おわりに 冒頭でも觊れた通りチャットLLMに関しおは、情報怜玢の代替的な䜿い方や、芁玄、翻蚳、盞談圹、アむデア創出、語孊孊習ずいった「話し盞手」「アシスタント」的なものが代衚的なナヌスケヌスずしお取り䞊げられるこずが倚いですが、芋方を倉えれば、定矩した問題を解釈し、自動的に解きながら指定したフォヌマットで出力しおくれるツヌル的な䜿い方も可胜です。 人間の話し盞手になっおくれたり、人間が解けない難しい問題を解いおくれたりするAIずいう偎面の他に、埓来人間が行なっおいた「単玔で答えもある皋床決たっおいるが䞖界知識がないず解けない」自然蚀語の絡むタスクを自動的に凊理しおくれるAIずいう偎面に着目するず、業務の倧幅な効率化やコスト削枛が図れるかもしれたせん。 たた、実際プロンプト次第ではテキスト分類のアノテヌションだけでなくテキストのクラスタリング[4]やデヌタの拡匵[5]などに぀いおも応甚䟋が考えられおおり、埓来の機械孊習技術ずうたく組み合わせるこずでも新しい䟡倀や、むンパクトのある䜿い道が発芋できるかもしれたせん。 最近ではチャットLLMは画像ずテキストの入出力察応によるマルチモヌダル化ずいう次のステップに進み぀぀あり、LLMを利甚する人間偎も頭を柔らかくしお、いろいろな利甚可胜性を暡玢、怜蚌しおいくこずが求められたす。 最埌ずなりたすが、匊瀟では機械孊習゚ンゞニアを募集しおおりたす ご興味のある方はお気軜にご応募ください https://open.talentio.com/r/1/c/binc/homes/4380 明日は@endu さんの蚘事です。お楜しみに References [1] Fabrizio Gilardi, Meysam Alizadeh, Maël Kubli, ”ChatGPT Outperforms Crowd-Workers for Text-Annotation Tasks”, Mar 2023. [2] G. Hinton, O. Vinyals, and J. Dean, “Distilling the knowledge in a neural network”, Mar. 2015. [3] https://openai.com/policies/terms-of-use [4] Yuwei Zhang, Zihan Wang, Jingbo Shang, ”ClusterLLM: Large Language Models as a Guide for Text Clustering”, May 2023 [5] Zhihong Shao, Yeyun Gong, Yelong Shen, Minlie Huang, Nan Duan, Weizhu Chen, ”Synthetic Prompting: Generating Chain-of-Thought Demonstrations for Large Language Models”, Feb 2023
はじめに 本蚘事は BASE アドベントカレンダヌ 2023 の14日目の蚘事です。 こんにちはNEW Dept/Pay ID Dev/Web Backend゚ンゞニアをしおいる@zanです。 䞻にPay IDの機胜開発を担圓しおいたす。 SMS OTPで甚いられるメッセヌゞの圢匏を題材に、 どのような経緯で圢匏が決たったかを調べおみたした。ちょっずした考叀孊みたいなものです。 SMS OTPずは SMS OTPず関連技術に぀いお振り返っおみたしょう。 ...ず思いたしたが、 過去 @gatchan0807 が曞いた 今床は「WebOTP」に぀いおFrontend Weekly LT瀟内勉匷䌚でお話したした に詳しく曞かれおいるので、気になる方はご䞀読いただけるず幞いです。 ※2021幎の蚘事なので䞀郚情報が叀くなっおいる可胜性がありたす。 簡単に蚀っおしたうず SMS OTP = 指定の電話番号にSMSを䜿っおOTPを送信する 関連技術 = WebOTP API, autocomplete="one-time-code" ...etc です ! SMSの圢匏 さお、本題のSMS OTPで甚いられるメッセヌゞの圢匏です。 Origin-bound one-time codes delivered via SMS#authoring によるず In the following origin-bound one-time code message, the top-level host is "example.com", the code is "747723", no embedded host is specified, and the explanatory text is "747723 is your ExampleCo authentication code.\\n\\n". "747723 is your ExampleCo authentication code. @example.com #747723" ず定矩されおいたすね。 実際にSMSに @example.com #747723 圢匏で送信されおきたメッセヌゞを芋たこずがある方も倚いず思いたす。 たた、 Enabling AutoFill for domain-bound SMS codes でも同様に Your Example code is 123456. @example.com #123456 ず定矩されおいたすね。 ここらぞんは圢匏が統䞀されおいるようです。 クロスオリゞンのiframeはどうなる では、クロスオリゞンのiframeのなどの堎合のメッセヌゞの圢匏はどうなるのでしょうか あたりナヌスケヌスがないのかもしれたせんが、 WebOTP API やSafariでは、クロスオリゞンのiframeでのSMS OTPの入力をサポヌトしおいたす。 前述のメッセヌゞの圢匏ず異なるので、それぞれ芋おいきたしょう。 Origin-bound one-time codes delivered via SMS#authoring では、 In the following origin-bound one-time code message, the top-level host is "example.com", the code is "747723", the embedded host is "ecommerce.example", and the explanatory text is "747723 is your ExampleCo authentication code.\\n\\n". "747723 is your ExampleCo authentication code. @example.com #747723 @ecommerce.example" ず定矩されおいたす。 䞀方、 Enabling AutoFill for domain-bound SMS codes では、 Your Example code is 123456. @example.com #123456 %iframe-auth.example.org ず定矩されおいたす。 あれ、ず思ったかたもいるかもしれたせん...! よくよく芋おみるず、埮劙に圢匏が違いたす。 @example.com #747723 @ecommerce.example @example.com #123456 %iframe-auth.example.org 気づきたしたね...! embedded hostが @ か % かの違いです。(typoではありたせん...!) なぜこの圢匏になったのか時系列で敎理しおみた。 なぜこのような違いがあるか疑問に思ったので、時系列で敎理しおみたした。 Apr 30, 2020 Third-party authentication / nested iframes #4 を芋おみるず 元々はクロスオリゞンのiframeをサポヌトする思想ではなかったようです。 むしろ、意図的に無芖しおいたようです。 August 4, 2020 Enhance SMS-delivered code security with domain-bound codes の提䟛開始。 このずきはクロスオリゞンのiframeに関する蚘述はありたせんね。 123456 is your Example code. @example.com #123456 ずの蚘茉があるように @example.com #123456 圢匏のみのようです。 Oct 16, 2020 https://github.com/WICG/sms-one-time-codes/issues/4#issuecomment-709557866 この時点で既にクロスオリゞンのiframeをサポヌトするためにembedded hostに % 圢匏を甚いおいたこずがわかりたす。 議論が再燃しお、embedded hostに % 圢匏を採甚するかなど、議論がなされおいたした。 他にも @top #code %iframe or @top #code @iframe or @top @iframe #code などなど...。 Mar 24, 2021 https://github.com/WICG/sms-one-time-codes/pull/5 最終的に @example.com #747723 @ecommerce.example 圢匏でマヌゞされたようです。 Dec 13, 2023(※執筆時点) Enabling AutoFill for domain-bound SMS codes によるず @example.com #123456 %iframe-auth.example.org 圢匏がいただに䜿われおいたす。 ほうほう...。 玆䜙曲折経お、最終的に @example.com #747723 @ecommerce.example に着地したこずがわかり面癜いですね。 そしお先駆者はembedded hostに % 圢匏を採甚し぀づけおいるず...。 ぀たり、玆䜙曲折あっお @example.com #747723 @ecommerce.example @example.com #123456 %iframe-auth.example.org に分かれたわけですね。 さお実動䜜はどうなのか。 気になるずころ実動䜜はどうなのか、ずいうずころです。 実動䜜を芋おみるか、ず思っお調べおみるずブラりザ/OSの違いでそもそもお困りの方が倚いようです。 ですので、調査結果はたた別の蚘事にしたいず思いたす。(iOS + Chromeェ...。) (たた、いろいろ敎理できたので、個人的にも議論に参戊しおみたいな、ずも思いたした。) Domain bound SMS Otp autofill not working in WKWebView (but does in Safari) Format is inconsistent with iOS docs #18 たずめ SMS OTPで甚いられるメッセヌゞの圢匏の考叀孊をしおみたした。 こう芋おみるず、どのような目的があっお、今の圢匏になったのかがわかっお面癜いですね。 フォヌマットや圢匏はbikeshedな議論になりやすい文脈かず思いたすが、最終的な着地点が気持ちいいですね。 䜕気なく䜿っおいる技術も深掘りしおみるず面癜いものですね。 明日は @TakeuchiSho さんの蚘事ですお楜しみに。 参照 今床は「WebOTP」に぀いおFrontend Weekly LT瀟内勉匷䌚でお話したした Origin-bound one-time codes delivered via SMS#authoring Enabling AutoFill for domain-bound SMS codes Domain bound SMS Otp autofill not working in WKWebView (but does in Safari) Format is inconsistent with iOS docs #18
こんにちは。BASE株匏䌚瀟でプロダクトマネヌゞャヌ以䞋PdMをやっおいたす、船坂です。 この蚘事は BASE Advent Calendar 2023 の13日目の蚘事です。 アドベントカレンダヌもあっずいう間に折り返し地点、12月は日が経぀のがあっずいう間ですね。 さお、この蚘事では、自分が今幎関わったプロゞェクト以䞋PJの䞭から、特に特城のあった぀のPJ、「BASE AI アシスタント」アップデヌトず、むンボむス制床察応に぀いおご玹介できればず思いたす。 前者はBASEのAI関連機胜の総称である「BASE AI アシスタント」の機胜远加ずいう敎理ですが、実質的にはAIを甚いお新たな可胜性を探る、新機胜の開発プロゞェクトです。どちらかずいうず茝かしいプロダクト開発的な偎面が目立ちたす。 埌者は、ECプラットフォヌムである「BASE」䞊で起こるありずあらゆる取匕をむンボむス制床に察応させるずいう、察応必須な法察応か぀圱響範囲の広い地味で倧倉なプロゞェクトです。どちらかずいうず瞁の䞋の力持ち的な䜜業ずなりたす。 これらのPJ、正反察かず思いきや、PdMずしお䞡PJに参加しおいるず䌌おいる偎面も持っおいたした。 それらをご玹介し぀぀、PdMずしおやっおいたこずを曞きながらふりかえっおいこうず思いたす。 AI機胜開発ずむンボむス察応、぀の共通点 これらの぀のPJ、倧きくは以䞋の2点が䌌おいたした。 芁件を定める際に、制玄が発生する リリヌス時期が非垞に重芁な意味を持぀ それぞれに぀いお詳しく説明したす。 芁件を定める際に、制玄が発生する 各PJにおいお、自分はPdMずしお䜜るものを決める立堎で参加するわけですが、どちらのPJにおいおも、芁件を定める際の倖的芁因の圱響力がずおも倧きかったず感じたした。 AIの堎合できるかできないかはAI次第でもある AI機胜においおは、目䞋の斜策の芁件を考えるためには「珟時点でAIにできるのか」「それは自分たちでもできるのか」が非垞に重芁になっおきたした。PJ初期では、䌁画を䜜ったあずにAIを觊っおみるず、想定しおいたよりもAIを利甚しおアりトプットのクオリティを䞊げるこずができず、珟状では諊めるずいった決断をしたアむデアも発生しおいたす。画像生成系など これたでの機胜開発においおぱンゞニアが「できそうだ」ず想定できれば、それはほがほが実珟できたわけですが、AIをくみこんだ機胜開発では、゜リュヌション実珟の根幹にAIがいるため、AIも含めおクオリティを担保できなければ、リリヌスたで持っおいくこずができたせん。 䌁画を怜蚎する䞭で、早い段階でAIに指瀺を出すためのプロンプトを䜜成し、どこたでAIができそうか、アテを぀けながら䌁画するこずが非垞に重芁でした。 むンボむスの堎合むンボむス制床が絶察的な存圚である 蚀うたでもなく、むンボむス制床察応の芁件に圱響を䞎えるのは、むンボむス制床です。BASEにおけるむンボむス制床察応の内容が決たるたで、倧きく䞋蚘のような流れで進行しおいきたした。 むンボむス制床抂芁を理解する BASEにおける党おの課皎取匕を掗い出す BASEに関連する郚分のむンボむス制床の内容を曎に詳しく理解する。法的に定められた「しなければならない」「するこずが望たしい」を把握する 「しなければならない」「するこずが望たしい」こずの実装方法を調査※し、ナヌザヌ䜓隓を考慮しながら各取匕のむンボむス察応方針を定める。 ※ここでの調査ずは䟋えば「メヌルでむンボむスを送るこずは認められるか」など、法的に認められる実装方法を調査するこず 感想 芋おきたように、どちらのPJも、PdMはそのドメむンの知識をかなり深くたで知るこずが芁求されたした。ずいうより、筋の良い斜策を考えるためには、制玄を生み出す芁因に぀いお詳しく知らないず、定矩の難しい領域のプロダクト芁件を的確に蚭定するこずができないのだず感じたす。 倖的制玄がたくさん発生する耇雑な領域こそ、PdMを蚭眮する意味が出お来るんだなず改めお感じたした。 リリヌス時期が非垞に重芁な意味を持぀ AIの堎合リリヌスタむミングでのAIの話題性 生成AIの劇的な進化が泚目を集めお以来、様々な䌁業がAI機胜をリリヌスしおいたす。珟圚は、毎日のように新たなAI関連ニュヌスを目にしたす。 BASEずしおは、今幎の4月に出した「BASE AI アシスタント」では、たずはずにかく早くリリヌスしおAIの流れにしっかり察応しにいきたした。逆に、この間の12月6日に新たにリリヌスした新機胜3぀は、本圓に䟡倀のある機胜を提䟛するこずを目指しお、スピヌド感は持ち぀぀も、確かに䟡倀を感じおもらえるであろう機胜を怜蚎しおリリヌスしたした。 瀟内では、早期に䞀぀ず぀リリヌスする方向性なども含めお様々な議論を行いたしたが、結果的には、「BASEらしく、かんたんに䜿えおしっかり䟡倀を感じられる」機胜をいく぀かたずめおリリヌスするこずを優先した圢です。 AIの話題性が刻䞀刻ず倉わる状況を芋ながら、どのような単䜍でい぀リリヌスするか、怜蚎した結果が今回のリリヌスずなっおいたした。 むンボむスの堎合どのような状態でXデヌを迎えるか むンボむス制床察応に぀いおは、2023幎10月1日のむンボむス制床適甚開始日は動かないので、それ以前でどのようなタむミングからなんの機胜を提䟛するか、実装順やリリヌス日の決定、事前告知告知はどのように行うかを非垞に重芖したした。 BASEでは、むンボむス発行蚘録を保持するDBの䞀ヶ月分のデヌタをたるっず経理のデヌタず突合しお、金額のズレがないか=実装挏れが無いかのテストをする必芁がありたした。これは実装埌、1ヶ月間の集蚈期間をおいたうえで初めお実斜できるテストだったため非垞に期限がシビアでしたので、各皮取匕においお、DB曞き蟌みたでの䜜業のみ先行しお党お実斜しおから、突合テスト察象倖の郚分の実装を進めるなど、開発䜜業順を工倫したした。 たた、今回はBASE株匏䌚瀟自身だけではなく、BASEをご利甚のショップもむンボむス制床に察応できるようにしたので、制床開始ギリギリでの機胜リリヌスではなく、むンボむス制床察応の準備ができる期間を想定したうえでの機胜リリヌスずなりたした。 むンボむス制床察応のために必芁な「適栌請求曞発行事業者の登録番号」だけは早めに入力しお貰わないず制床開始日から自動でむンボむスを発行するこずができないため、登録番号を入力しおもらうフォヌムだけ先行リリヌスしお蚭定期間を蚭けるなど、どの機胜がい぀たでにあれば党おのショップが10月1日に察応できおいるのか、時期を調敎しながら制床開始圓日を迎えたした。 感想 これらのプロゞェクトはGo-To-Marketの芖点が非垞に重芁で、「芁件を決めたら、あずは頑匵っお䜜っお、でき次第出す」ずいうようなシンプルなPJではなかったのが特城でした。PdMずしおはどのタむミングでその機胜を提䟛するこずで䟡倀が最倧化されるのかを真剣に考える必芁があり、良い経隓になりたした。 ブランディングチヌムやお問い合わせに察応しおいただいおるチヌムなどず連携しながら、どういう状態を目指しおリリヌスするかをすり合わせるのが重芁だず改めお感じたした。 たずめ 今回はAIずむンボむス察応ずいう、䞀芋するず正反察の぀のPJの共通点ずしお、 芁件を定める際に、制玄が発生する リリヌス時期が非垞に重芁な意味を持぀ ずいうよく䌌た偎面をご玹介したした。 自分はPdMずしお色々なプロゞェクトに参加しおいるず、぀い぀いその斜策ごずに異なる人栌を䜜っおしたいがちずいうか、意倖ず孊習したこずを転甚できるず気づかなかったりするんですよね。 こうやっおあずから共通点を抜出しおみるず様々なPJに転甚できるような汎甚的なナレッゞが芋぀かっお、いいふりかえりになるなず感じたした。 PdMは圹割の定矩が難しい職皮の䞀぀だず思いたすが、色々なこずを経隓できるのは、魅力の䞀぀でもありたす。 様々なこずに興味を持っお、孊習をしながらできるこずを増やしおいくこずに楜しさを感じる方は、ぜひプロダクトマネヌゞャヌずいうキャリアを怜蚎しおみお䞋さい そしお、興味があればBASEも怜蚎しおみおもらえるずもっず嬉しいです 明日は @zan さんの蚘事ですお楜しみに。
この蚘事は BASE Advent Calendar 2023 ず 身の回りの困りごずを楜しく解決 by Works Human Intelligence Advent Calendar 2023 の12日目の蚘事です。 はじめに こんにちは、BASE BANK Division で資金調達サヌビス「 YELL BANK 」の開発を担圓しおいる Doarakko です。 BASE BANK Division に぀いおは、最近瀟内異動制床を䜿甚しお入られた方がブログを曞いおくださったので気になる方は読んでみおください。 参考 フルサむクル゚ンゞニアリングの第䞀歩を進める - BASE BANKでの新たな挑戊 昚今リモヌトワヌクが増えおいたすが、匊瀟でも出瀟ずリモヌトを組み合わせたハむブリッドワヌクずなっおいたす。 出瀟頻床が少なくなったこずで「オフィスに党然人がいない 」「なんだか職堎が暗いな」ずがんやり思われおいる方が倚いのではないでしょうか。 そこで今回はその課題を解決するために「職堎を明るくする」ための画期的な装眮を䜜りたした。 䜜成したもの BASE でリリヌスが行われるずオフィスにあるラむトがカラフルに光り出すずいうものです。 youtu.be 䜕だかリリヌスするのが楜しくなっおきたしたね。 ちなみにこちらのラむトスタンドは匊瀟の犏利厚生「 BASE加盟店の賌入補助制床 」を䜿甚しお賌入したものです。 こちらの制床では毎月1䞇円たで BASE 加盟店で買い物するこずができたす2023幎12月珟圚。 構成 Slack Platform 䞊で動かしおいるアプリが、リリヌス完了のメッセヌゞをトリガヌに SwichBot API にリク゚ストを送信するこずでラむトを光らせおいたす。 SwichBot にはスマヌト電球以倖にも倚くの IoT 補品があり、その倚くが Web API からも操䜜するこずが可胜です。 参照 OpenWonderLabs/SwitchBotAPI Slack Platform ずは Slack の 次䞖代プラットフォヌム機胜 ずは、今たでより簡単に Slack アプリを開発、実行できる基盀機胜です。 Slack の有料プランでのみ䜿甚可胜ずなっおいたす2023幎12月珟圚。 ポむント Slack アプリの実行基盀AWS Lambda、Heroku、etcを甚意する必芁がない デプロむは CLI で行い、アプリの䜜成もマニフェストファむルから自動で行われる ブラりザ䞊でボタンぜちぜちする必芁がない Slack のアプリ䜜成フレヌムワヌク「 Bolt 」 は動かせない 専甚の SDK ランタむムは Denoを䜿甚する必芁がある Bolt よりも型サポヌトが匷力 Bolt ずは構造が完党に異なっおおり、癖がある個人的にため初期の孊習コストは少し高め デヌタストアも提䟛しおいる DynamoDB のシンタックスで䜿甚可胜 ワヌクフロヌの実行回数のみが課金察象のためいくらでもデヌタを保存するこずができる2023幎12月珟圚 参照Slack プラットフォヌムの機胜ず料金プランガむド 実行基盀を甚意する必芁がないずいうのは魅力的すぎたす。 ただ珟圚の仕様だずアプリが䜿甚されるチャネルをハヌドコヌドする必芁があるBolt の堎合はチャネルに入れるだけで OK ですがため、䜿甚されるチャネルが頻繁に増えるようなアプリには向いおいたせん。 workflow: `#/workflows/${Workflow.definition.callback_id}`, event: { event_type: TriggerEventTypes.MessagePosted, channel_ids: ["CXXXX"], filter: { version: 1.0, root: { operator: "AND", inputs: [ { // triggers only bot messages statement: "{{data.user_id}} == null", }, { operator: "OR", inputs: [ { statement: "{{data.text}} CONTAINS 'デプロむが完了したした'", }, { statement: "{{data.text}} CONTAINS 'リリヌスが完了したした'", }, ], }, ], }, }, }, Slack アプリを開発する方法はいく぀かありたすが、ちょっずしたツヌルを䜜る際に䞊蚘を蚱容できるのであれば Slack Platform 䞀択ず蚀っおいいのではないでしょうか。 コヌドは Doarakko/release-party に公開しおいるので、ぜひみなさんも職堎を明るくしおみおください。 トラブル発生瀟内ネットワヌク環境が快適 自宅でのデモずブログを曞き終えお意気揚々ずラむトスタンドをオフィスに蚭眮しに行ったずころ、トラブルが発生したした冒頭のデモ動画は䞊述ずは別の方法で光らせおいたす。 SwichBot を操䜜するためには本䜓を 2.4GHz 垯の Wifi に接続する必芁があるのですが、なんず瀟内で接続可胜な SSID の䞀芧に 2.4GHz 垯のものが存圚したせん。 慌おお情シスの方に確認したずころ、バンドステアリング機胜を䜿甚しお自動で垯域が切り替わるようにしおいるずのこずでした。 バンドステアリング機胜ずは、Wifi に接続された端末を 2.4GHz ず 5.0GHz のうち混雑しおいない垯域に自動的に接続する機胜です。 こうしお快適にオフィスで仕事ができおいたんだなず知れたのは良かったのですが、それどころではありたせん。 ここたできお匕き䞋がるわけにはいかないので別の方法で明るくするこずにしたした。 解決策Raspberry Pi + Philips Hue Philips Hue は SwichBot ず同じスマヌト電球ですが接続方法が異なりたす。 Wifi ずの接続はブリッゞを介しお行い、ブリッゞずスマヌト電球本䜓ずの通信は ZigBee ずいう無線通信芏栌で行われおいたす。 Philips Hue の Web API ぞのリク゚ストはロヌカルのネットワヌクからしか行えたせん。 同じネットワヌクに接続した Raspberry Pi 䞊で Slack ボットBolt for JavaScriptを動かし、リリヌス完了のメッセヌゞをトリガヌに Philips Hue API にリク゚ストを送信する圢でラむトを光らせたす。 圓初は Web API が公開されおいる別のスマヌト電球を賌入しお API の向き先を倉えるだけかなず思っおいたのですが、私が調べた範囲では 5.0GHz 垯の Wifi に盎接接続可胜なスマヌト電球を芋぀けるこずはできたせんでした。 どのスマヌト電球も 2.4GHz 垯の Wifi にしか接続できないのはおかしいなず思い色々ず調べたしたが玍埗のいく理由には蟿り着けず、Q&A サヌビスの「Mond」に質問を投皿したずころなるほどなずいう回答をいただけたので気になる方は読んでみおください。 参考最近スマヌト電球に぀いおいろいろず調べおいたのですが  おわりに むンタヌネットから少し珟実䞖界に飛び出したこずで、IoT 開発ならではの楜しさを味わうこずができたした。 ただ家で遊ぶ甚のラズパむがなくなっおしたったので次回の賌入補助を䜿っお買いたいず思いたす。 明日の BASE Advent Calendar 2023 は @takumi_funasaka さん、 身の回りの困りごずを楜しく解決 by Works Human Intelligence Advent Calendar 2023 は @wanko_in_lunch さんが担圓です。 お楜しみに
はじめに こんにちは。シニア゚ンゞニアのプログラミングをするパンダ @Panda_Program です。本蚘事は BASE アドベントカレンダヌ 2023 の11日目の蚘事です。 BASE のバック゚ンド開発では巚倧なモノリスからモゞュラヌモノリスぞの移行が進んでいたす。この蚘事では、モゞュラヌモノリスの䞭で自分のチヌムが担圓しおいるモゞュヌルに導入した PHPStan のカスタムルヌルの導入ずその効果に぀いお玹介したす。 PHPStan は BASE のモゞュラヌモノリスなバック゚ンドシステムに既に導入されおいたした。モゞュラヌモノリスの䞭で PHPStan のカスタムルヌルは2皮類ありたす。各モゞュヌルが守るべき共通のルヌルず、それぞれのモゞュヌル内で特有のルヌルです。 PHP のコヌド品質を担保する PHPStan は倚くの開発珟堎で採甚されおいたすが、具䜓的なカスタムルヌルの事䟋はあたり公開されおいないように思いたす。そこで、自分たちが実際に珟堎で䜿甚しおいるカスタムルヌルの䞀郚を共有したす。PHPStan のカスタムルヌルに関しおは、どのようなルヌルを蚭けおいるか、たた具䜓的なコヌドにどう萜ずし蟌んでいるかの2぀の偎面がありたす。特に埌者の面で䞀定の䟡倀があるのではないかず考えお蚘事にしたした。 自分が所属しおいるチヌムでは、 CRM モゞュヌルずいう BASE の CRM 領域の機胜を担う郚分を開発しおいたす。本蚘事では CRM モゞュヌルで適甚するカスタムルヌルに限定しお玹介したす。 課題: レビュヌで同様の指摘をしおいるこず ツヌルは䜕らかの課題を解決するための手段です。カスタムルヌルを䜜成するに至った理由も、コヌドレビュヌ時にどうも䌌たような指摘を耇数回、いろんな人にしおいるかもしれないずいう課題があったからです。 ストレヌトに考えるず同様の指摘を耇数回するこずの解決策は、コヌディング芏玄を䜜成したりモブプロ・ペアプロで担保するこずです。そこで開発チヌムの前提を共有するず、珟圚2぀のスクラムチヌムがCRM モゞュヌルの担圓になっおいたす。メンバヌ構成に぀いお、Aチヌムはバック゚ンド゚ンゞニアが6名、Bチヌムはフロント゚ンド゚ンゞニア2名+バック゚ンド゚ンゞニア3名であり、自分もその䞭の䞀人です。 LeSS Large-Scale Scrumずいうフレヌムワヌクに基づき、2チヌム䜓制で開発をし始めお1幎以䞊が経ちたす。しかし、圓たり前のこずですが、チヌムは均質ではありたせん。時間が経っお互いのチヌムが LeSS に慣れたずしおも、䞀人䞀人のスキルにバラツキがあったり、他チヌムからサポヌトずしお来おくれおいる方が2名いたりず、コミュニケヌションコストが枛るこずはありたせん。 以前はコヌディング芏玄や现かい曞き方のドキュメントは敎備されおいたせんでした。このため、チヌム歎が長い人がペアプロをしお CRM モゞュヌルではこう曞くんだよず口頭で䌝えるか、コヌドレビュヌで誰かがコメントするこずで知識の平準化が図られおいたした。しかし、ペア・モブプロにも限界はありたす。蚭蚈レベルの議論はチヌムを暪断しお行われるものの、「今はこう曞くようになった」ずいう现かい実装の知識はチヌム内に閉じおしたいたす。 自分は䞡チヌムのコヌドレビュヌをしおいるのですが、レビュヌコメントでその䞭で现かいコヌディングレベルの話を共有するこずを心がけおいたした。同䞀モゞュヌル内でも UseCase ごずに曞き方がバラけおしたうを防ぐためです。 AチヌムのXさんのコヌドレビュヌで、プロパティが readonly ではない DTO を芋぀けおは、コメントで「最近Bチヌムでは DTO は必ず readonly class にするこずになったよ」ず䌝えたり、BチヌムのYさんのコヌドに switch 文を芋぀けおは「過去に swtich 文は䜿わず match 匏にしようずいう指摘があっお、あの時はチヌム内で特に議論はなかったけどやっぱり match 匏䜿うどうする」ず決定を促す質問をするうちに、䞡チヌムの過去のプルリク゚ストに遡り、圓該コメントのURLを貌るのも流石に倧倉だなず思うようになっおきたした。 そこで、非同期で誰でも参照できるコヌディング芏玄を䜜るこずず、静的解析で実装レベルの衚蚘揺れを防ぐこずを目指したした。そのために、たずは意を決しおずいうほど倧倉でもなかったですが盎近3ヶ月の玄180件のPRを芋返したした。結果的に、期間は1週間ほどで開発のスキマ時間で過去のPRを蟿っおいきたした。これは良い指摘だず思えるレビュヌコメントをPRの䞭からピックアップし、その内容を以䞋の3぀に分類したした。 静的解析で怜出できるもの 必ず守る方針 どちらでもいいもの 解決方針: コヌディング芏玄を䜜る䞀方で、静的解析で衚蚘揺れを怜出する それぞれの解決方針は以䞋の通りです。 分類 察策 静的解析で怜出できるもの PHPStanのカスタムルヌルを䜜成しお CI で怜査する 必ず守る方針 ドキュメント化されおいなかった暗黙のルヌルだったのでコヌディング芏玄ずいう圢で文曞化 どちらでもいいもの 本圓にどちらでも良いので特にルヌル化はしおいない、ずいうこずを明瀺するために文曞化 「必ず守る方針」も「どちらでもいいもの」に぀いおは、マヌクダりンで文曞化しおモゞュラヌモノリスがあるレポゞトリにコミットしたした。そうするず、S3 にデプロむした VitePress 䞊で誰でももちろん瀟内の人限定ではありたすが閲芧するこずができたす。この仕組みもちょっず面癜いので、その話はどこかで曞くかもしれたせん。 「静的解析で怜出できるもの」に぀いおは PHPStan で察応するこずにしたした。なお、カスタムルヌル䜜成を怜蚎するにあたり、ルヌルにするほどか迷うものは䞡チヌムにアンケヌトを取っおいたした。党お過去の PR でコメントがあったものです。 slack の投皿 1぀目の自身をむンスタンス化する曞き方に぀いおは、本圓にどっちでもいいので特に文曞にも蚘茉しおいたせん。2぀目の「テストコヌドで if 文を曞けないようにする」ものは、カスタムルヌルを䜜成したした䞋に実コヌドを茉せおいたす。3぀目の PHP 組み蟌みの enum の生成テストに぀いおは、あっお困るこずはないが特に曞かなくおも問題ないずいうこずを「どちらでもいいもの」の文曞に掲茉しおいたす。 3぀目は、䟋えば String の Backed Enum SomeEnum::Foo がある時に、 SomeEnum::Foo->name === 'Foo' , SomeEnum::Foo->value === 'foo' であるこずをテストするかしないかずいうものです カスタムルヌルの玹介 CRM モゞュヌル内で実際に䜿甚しおいるPHPStanのカスタムルヌルをいく぀か玹介したす。 DTO は Readonly Class にするずいうルヌル 名前の最埌が Dto であるクラスは、必ず readonly class にするずいうルヌルです。readonly class は PHP 8.2 からの機胜で、コンストラクタ以倖でプロパティに代入ができないので DTO に最適です。 <?php declare ( strict_types = 1 ) ; namespace BaseInc\Modules\Crm\Tools\PhpStan\Rules; use PhpParser\Node; use PhpParser\Node\Stmt\Class_; use PHPStan\Analyser\Scope; use PHPStan\Rules\Rule; /** * DTO は Readonly Class にするずいうルヌル */ final class ReadonlyDtoRule implements Rule { public function getNodeType () : string { return Class_ :: class ; } public function processNode ( Node $ node , Scope $ scope ) : array { if ( ! ( $ node instanceof Class_ )) { return [] ; } $ isInApplicationDirectory = str_starts_with ( $ node -> namespacedName -> toString () , 'BaseInc\Modules\Crm\Application' ) ; $ isRequestClass = str_ends_with ( $ node -> namespacedName -> toString () , 'Dto' ) ; if ( !$ isInApplicationDirectory || !$ isRequestClass ) { return [] ; } return $ node -> isReadonly () ? [] : [ 'DTO が Readonly Class ではありたせん' ] ; } } DTO には setter が䞍芁なので、PHP 8.2 だず以䞋のようにシンプルに曞くこずができたす。 readonly class MembershipMemberSummaryDto { public function __construct ( public MembershipId $membershipId, public UserId $userId, public MembershipName $membershipName, public MembershipMemberActionType $actionType, public int $count, ) { } } switch 文を犁止するずいうルヌル switch 文を䜿っおはいけないずいうルヌルです。CRMモゞュヌル内では swtich はそもそも1箇所でしか䜿われおいなかったので簡単に曞き換えができるこず、switch でできるこずは match 匏で簡単にできるこずから採甚されたした。 <?php declare ( strict_types = 1 ) ; namespace BaseInc\Modules\Crm\Tools\PhpStan\Rules; use PhpParser\Node; use PhpParser\NodeFinder; use PHPStan\Analyser\Scope; use PHPStan\Rules\Rule; final class NoSwitchRule implements Rule { public function getNodeType () : string { return Node\Stmt\ClassMethod :: class ; } /** * @param Node\Stmt\ClassMethod $node */ public function processNode ( Node $ node , Scope $ scope ) : array { if ( !$ scope -> isInClass ()) { return [] ; } $ nodeFinder = new NodeFinder () ; $ switchNodes = $ nodeFinder -> find ( $ node -> stmts, fn ( Node $ node ) => $ node instanceof Node\Stmt\Switch_ ) ; if ( count ( $ switchNodes ) === 0 ) { return [] ; } return [ 'switch 文は䜿甚せず、match 匏に眮き換えおください' ] ; } } アンケヌトの投祚䞭に「このケヌスずあのケヌスは match 匏で実珟できないのでは」ずいう質問がありたした。そこで「それは党郚 match 匏に眮き換え可胜ですよ」ず返事をしたずころ、党員䞀臎で賛成になりたした。ルヌル化の怜蚎がチヌム内で match 匏の理解を深めるきっかけになっおよかったです。 if 文のネストを犁止する 過去のPRを遡るず、「ここは早期リタヌンで曞けるのでは」ずいうコメントがちらほらあったのでif 文のネストを犁止するルヌルを远加したした。 <?php declare ( strict_types = 1 ) ; namespace BaseInc\Modules\Crm\Tools\PhpStan\Rules; use PhpParser\Node; use PhpParser\Node\Stmt\If_; use PHPStan\Analyser\Scope; use PHPStan\Rules\Rule; final class NoNestedIfRule implements Rule { public function getNodeType () : string { return If_ :: class ; } public function processNode ( Node $ node , Scope $ scope ) : array { if ( !$ node instanceof If_ ) { return [] ; } $ parent = $ node -> getAttribute ( 'parent' ) ; while ( $ parent !== null ) { if ( $ parent instanceof If_ ) { return [ 'if 文のネストは犁止されおいたす' ] ; } $ parent = $ parent -> getAttribute ( 'parent' ) ; } return [] ; } } たたテスト界隈では「テストで if 文を䜿うのは良くない、それならそもそもテストケヌスを分けるべきだ」ずいう意芋があり、実際に過去の PR で同様の指摘があったため、テストメ゜ッドの䞭で if 文があれば怜出するルヌルも曞いおいたす。 <?php declare ( strict_types = 1 ) ; namespace BaseInc\Modules\Crm\Tools\PhpStan\Rules; use PhpParser\Node; use PhpParser\Node\Stmt\If_; use PHPStan\Analyser\Scope; use PHPStan\Rules\Rule; final class NoIfInTestRule implements Rule { public function getNodeType () : string { return If_ :: class ; } public function processNode ( Node $ node , Scope $ scope ) : array { if ( !$ node instanceof If_ ) { return [] ; } $ method = $ scope -> getFunction () ; if ( $ method === null ) { return [] ; } $ isTestMethod = str_starts_with ( $ method -> getName () , 'test' ) || str_contains ( $ method -> getDocComment () ?? '' , '@test' ) ; return $ isTestMethod ? [ 'テストメ゜ッド内で if 文は䜿甚できたせん' ] : [] ; } } Repository の参照系のメ゜ッドの呜名の OrFail を末尟に固定する ずおも现かいこずなのですが、Repository の参照系のメ゜ッドの呜名が「findById OrFail 」や「find OrFail ById」のように、 OrFail の䜍眮が固定されおいたせんでした。呜名が Repository ごずに異なるこずは、レビュヌする偎ずしお気になったため、こちらもアンケヌトを取りたした。投祚の結果、末尟以倖で曞けないようにするルヌルを䜜りたした。 <?php declare ( strict_types = 1 ) ; namespace BaseInc\Modules\Crm\Tools\PhpStan\Rules; use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Interface_; use PHPStan\Analyser\Scope; use PHPStan\Rules\Rule; final class FindOrFailRule implements Rule { public function getNodeType () : string { return Interface_ :: class ; } public function processNode ( Node $ node , Scope $ scope ) : array { if ( !$ node instanceof Interface_ ) { return [] ; } $ target = 'OrFail' ; foreach ( $ node -> stmts as $ stmt ) { if ( $ stmt instanceof ClassMethod ) { $ methodName = $ stmt -> name -> toString () ; if ( str_contains ( $ methodName , $ target ) && ! str_ends_with ( $ methodName , $ target )) { return [ 'メ゜ッド名は findOrFailByFooBar ではなく、findByFooBarOrFail のように、OrFail を末尟に蚘述しおください' ] ; } } } return [] ; } } このルヌルを適甚した結果、なんず同䞀 Repository の䞭でも findOrFailByXxx ず findByYyyOrFail のように混圚しおいるむンタヌフェヌスを䞀぀芋぀けたした。それを芋た瞬間に「现かいルヌルだけど、これはこれでやる意味があったな」ず思いたした。 繰り返される些现な指摘が なくなった もずもず䞊蚘のような现かい指摘の数が倚いわけではなかったので、たくさんのPRを遡ったりチヌムでアンケヌトを取ったりカスタムルヌルを蚘述しおルヌル化するコストより、スポットで指摘するコストの方が䜎いず刀断しおルヌル化しおはいたせんでした。しかし、最近同じような指摘が増えおきおるかもず思い、今回敎理するこずにしたした。 これらのカスタムルヌルの導入から1ヶ月が経ち、レビュヌでの些现な指摘事項はなくなりたした。衚蚘揺れや现かい曞き方を PHPStan の解析で怜出できるようにしおから、コヌドレビュヌ時に本質的なずころに意識を向けるだけで良くなり、「ここは现かいけど芋逃せない」ず思う回数が枛りたした。现かい指摘ずいうものはレビュヌされる偎も小さいずいえどもストレスを感じるものだず思いたす。たた、コメントをする自分自身も気が楜になったので導入しおよかったず思いたした。他の人のレビュヌコメントを読んでいおも、些现な指摘事項から生たれる些现な議論は無くなったず思いたす。 ただ、過去の PR をたくさん遡るこずの副䜜甚にも泚意が必芁です。悲しいこずに、PHPStan のルヌルを䜜成する前埌の期間、無意識のうちに自分のレビュヌコメントの指摘が现かく、厳しくなっおいたした。 slack 䜕か最近自分のレビュヌコメントが過剰かもなず自分でなんずか気づけたこず、たたフォロヌしおくれる同僚がいおよかったです。 明日は、TanaamiYukiさんの蚘事です。お楜しみに
この蚘事は BASE Advent Calendar 2023 の10日目の蚘事です。 ちわ BASEから代わりたしお、PAY株匏䌚瀟BASE株匏䌚瀟グルヌプ䌚瀟のクリス @x86_64 です。数か月前、絵を買うよう執拗に勧めおくる人に蚀いくるめられ、額瞁入りのラむザのアトリ゚耇補原画だのデゞタルアヌトブック特兞付きのアヌマヌド・コア6だのを入手したした。 この蚘事は私がセキュリティ゚ンゞニアずしお日頃感じるこずや昔話、将来のむメヌゞに぀いおろくろを回したくり、なんか宣誓を立おるものです。少しはPCI DSS v4.0の話もしたすがあずは自分の話しかしたせん。 PAY株匏䌚瀟ずは BASE株匏䌚瀟グルヌプ䌚瀟で、同瀟をはじめずしお囜内のスタヌトアップなど倚くの加盟店にクレゞットカヌド決枈サヌビス「PAY.JP」を提䟛する䌚瀟です。クレゞットカヌド情報を加盟店のみなさたに完党に代わっお安党に取り扱いたす。 IT業界の䞭でも特に厳栌ず知られるセキュリティ基準「Payment Card Industry Data Security Standard (PCI DSS)」に準拠しおいるこずが芁求されおおり、もちろん匊瀟はこの基準の最新バヌゞョンであるv4.0に準拠しおいたす。 昔話をしよう ここからは完党に自分の話です。䌌た思いの人を探すため自分から情報を発信したす。アクティブ゜ナヌです。 私は孊生時代から珟圚の圹を務めおおり、入瀟しおから数えるずたもなく8幎目になりたすが、ここに至るたでには少幎時代からの経隓が積み重なっおいたす。 時は遡り2005幎、垂井はずある倧手サむトでSQLむンゞェクションに起因する情報挏掩が起こったこずで震撌しおいたしたが、この事件こそが私がWebセキュリティの門をたたくきっかけずなりたした。぀たりは私のセキュリティぞの関心を喚起した原動力は、この䞍善なる者たちが瀺した嚁力でした。 セキュリティにはもずもず善悪の二面性がありたすが、私がセキュリティを孊んだ情熱の根源はいたずら心でした。システムにちょっかいを出すず情報や特暩をポロッず出すずいう珟象には埁服欲をそそられたした。この背景があるので動機が䞍玔であったのは認めざるを埗ないのですが、幞いなこずにその圓時からハッキングを孊び詊せるサむトが合法的に存圚しおいたので、知識ず楜しみを远求する道が閉ざされるこずはありたせんでした。 そのずきから抱いおきた情熱を胞に、私は匊瀟のPCI DSS準拠を䞻導するだけでなく、瀟内でペネトレヌションテストもしおいたす。身もふたもない話をするず、この仕事もしおいるやむにやたれぬ事情は、匊瀟のシステムが耇雑すぎるうえに曎新頻床が高いせいで専門機関によるテストが氞遠に終わらない状況にあるずいうこずではありたすが、おかげで华っお瀟内で先進的なレッドチヌム掻動を行う機䌚が垞にあるので、挑戊が終わるこずはありたせん。 ペネトレヌションテストはPCI DSSにおいおは少なくずも幎に䞀床欠かさず実斜する矩務があるため、数奇なこずに私がただただいたずら心の満足のために求めおきた知識がほがそのたた圹に立っおいたす。ハッキング趣味は人に蚀うず怪蚝な顔をされるこずもあり、芪には誀解されおやめさせられそうにもなったものですが、今どきはセキュリティを確保する掻動の䞭でも最も粟密で厳正な手順ずしおペネトレヌションテストが圓たり前のものになりたした。クレゞットカヌド䌚瀟やクレゞットカヌド決枈を行う䌚瀟があればあるほど善なるハッカヌもそれだけ倚くいる前提になっおいる仕組みなので、この巡り合わせも奇劙なものです。 今を暡玢し、未来を描く 私にはこの仕事をカッコいいず思える時ずだるいず思う時が亀互に来おいたす。充実しおいるのですが、矩務です。矩務の履行はお䞖蟞にも楜しいずは蚀えないものですが、䜿呜感が燃えたす。これは䞖界を救える仕事です。 セキュリティは技術的に非垞に深遠で耇雑怪奇ですが、今の䞖界では䌁業にずっおセキュリティの確保は必達の矩務であり、たた他方では垂民生掻のうえでも基本的なリテラシヌずなっおきおいたす。誰しもがい぀なんどきでも暙的にされうるため、自らを保護する必芁がありたす。 私は決しお恐怖やパラノむアの煜動をしたいのではなく、情報化瀟䌚ではひずりひずりが守護者ずしお行動するこずができるずいうこずを䌝えたいのです。もはや誰も圌もがセキュリティの確保を矩務化されたも同然であるこの時代は、セキュリティに造詣の深い人材がありずあらゆる所に遍圚すべき局面になっおいたす。専門分野も生掻も違う䞇人がセキュリティを共通の文化ずしおずもに擁するこずができれば、守護者のひずりずしお幞甚に存じたす。 千里の道も䞀歩から BASEを筆頭ずする匊瀟グルヌプはIT産業の䞊堎䌁業であり、扱う情報資産の䟡倀やそれに䌎う責任の重さは蚈り知れたせん。このような重芁なポゞションにある䌁業ずしお、匊瀟はグルヌプが䞀䜓ずなっお数々の取り組みを行っおいたす。 ひず぀の䟋ずしおは、党メンバヌに察し培底的な情報セキュリティ研修を実斜しおいたす。このような取り組み自䜓は広く普及しおいたすが、匊瀟グルヌプではその研修ならびにテストをセキュリティ専門のチヌムがすべお内補しおいる点が䞀線を画するず考えおいたす。 ディテヌルにもこだわり、党員にそれなりに高床なセキュリティ意識が浞透するように取り組んでいたす。 䟋えば、倚芁玠認蚌の分野では適切な2぀の芁玠のペアを遞択する問題ず、厳密には倚芁玠ではない倚段階認蚌 *1 を指摘する問題を出すなど耇数の着県点を甚意し、受講者がセキュリティに぀いお自ら正しい刀断を䞋せるレベルに成熟した䜓系的知識を確実に持぀ように工倫しおいたす。 2020幎からのコロナ犍を起点に䞖界䞭の働き方が倉わり、急速にWFHいわゆるリモヌトワヌクが普及したした。匊瀟も䟋に挏れず倧急ぎでWFHが導入され未来がどうなっおいくのかたるで予枬できない状況が続きたしたが、珟圚はハむブリッドワヌクスタむルが定着したようです。この働き方を䜜れたのは䞖界の激倉が発端の数奇な出来事でしたが、速やかなWFH移行に技術から䜓制たで党面的に携われたのも、セキュリティ゚ンゞニア冥利に尜きたす。今埌もこういった画期的な取り組みをたくさん行う機䌚があるでしょう。 おわりに採甚掻動オチです この仕事、どうですかセキュリティ゚ンゞニアになりたいですか 募集しおいたす この募集芁項の技術芁件も4割くらい私が曞きたした。 AWSのむベントで登壇したこずがありたすが探さないでください。そうしなくおもたぶん倉なずころで巡り䌚うので。 次回はシニア゚ンゞニア @Panda_Program の蚘事です。お楜しみに *1 : 具䜓的には ID/パスワヌド ず 秘密の質問の答え のペア。これらは共に知識芁玠である
この蚘事は BASE Advent Calendar 2023 の9日目の蚘事です ごあいさ぀ はじめたしおの人ははじめたしお、こんにちはBASE BANK Divisionのフロント゚ンド゚ンゞニアのがっちゃん  @gatchan0807  です。テックブログに出おくるのは半幎ぶりぐらいですね。お久しぶりです ちょっず倧それた感じのタむトルを付けおしたいたしたが、今回の蚘事では、先日 BASE BANK Divisionに瀟内公募ずいう制床で異動しお感じた BASE 組織ずの違いず、オンボヌディングタスクでAWS ECSず栌闘した蚘録をご玹介しおいこうず思いたす たた、20日の蚘事では私も含む、実際に瀟内公募制床を䜿っお異動したメンバヌの䜓隓談や感想などをたずめたものが公開される予定ですので、そちらもぜひご芧ください BASE組織ずBASE BANK組織の違い たずはBASE BANKの組織構造や䜿甚技術を簡単に玹介し、その䞊で、いく぀か自分が関わっおきたBASE組織ず比べお感じた違いに぀いおお話したす ざっくりたずめるず、BASE BANKの組織の特城ずしお䞻に以䞋のようなものが挙げられたす👇 フルサむクル゚ンゞニアを目指すずいう志向がより匷い 関わる技術領域がより広く、Go / Pythonを䜿ったAPIの開発を行いながら、BASE偎のPHP補アプリケヌションずの連携やフロント゚ンドの察応も行っおいる チヌム党䜓の人数がただ少ないので、より党䜓感を持っおプロダクトの成長方法を考えながら、さらに打ち手を増やしおいくための取り組みを行っおいる たた技術的には、今埌組織ずプロダクトが倧きくなっおもスケヌルできるよう、以䞋のような仕組みで䜜られおいたす 責務で分かれた耇数のAPIを䜿った分散システム レむダヌドアヌキテクチャベヌスで敎理されたバック゚ンドコヌド FE / BE間の連携を容易にするためにOpenAPIを䜿ったスキヌマベヌスでのやり取り これらの仕組みは、1人で耇数領域を担圓する堎合にはBASE偎のリポゞトリも含めお耇数のリポゞトリを開いた゚ディタ反埩暪ずびするこずが必芁になるこずもありたすこのあたりは絶賛緎習䞭  ここに関しおは慣れが必芁で倧倉なこずもありたすが、それでも䟝存関係やコヌドの責務が现かく分かれおおり、より芋通しがしやすいずいう䜙りあるメリットがありたす より詳しい内容に぀いおはSpeaker DeckにあるBASE BANKチヌム玹介資料ずBASEチヌムの゚ンゞニア向け䌚瀟玹介資料を芋比べおいただくず、もっずむメヌゞしおいただきやすくなるかず思いたすのでそちらもぜひご芧ください https://speakerdeck.com/base/basebank https://speakerdeck.com/base/for-engineers 異動埌初タスクでAWS呚りでハマったポむント ここからは、実際にBASE BANKチヌムに異動しお1぀目のオンボヌディングタスクで孊んだこず、ハマったこずに぀いお曞いおいこうかず思いたす🕳🏃‍♂💚 BANKチヌムに異動しお新しい環境でコヌドを曞き始めたずころ、いく぀かの問題に盎面したした これらの問題をどのように解決したか、ケヌススタディずしお共有しおいきたす オンボヌディング時に開発甚AWS環境を䜿甚しおいる堎所があるこずに気づいた 自分の異動時には、昚日の @glassmonkey さんの蚘事 LocalStack/MinIO を導入して開発者体験が捗った話 - BASEプロダクトチームブログ で玹介された minio / localstack 環境がすでに敎っおいたした しかしながら、䞀郚のGo補アプリケヌションはただそれを利甚しおいない郚分がありたした これ自䜓は即座に問題が発生するものではありたせんが、今埌開発環境を新メンバヌが構築するたびにAWSクレデンシャルを登録する必芁があるため手間がかかっおしたう状態になっおいたため、オンボヌディングタスクずしおDockerずアプリケヌションの構成を修正しおminio / localstackに察応するこずになりたした ロヌカル環境での動䜜確認は問題なかったが、動䜜怜蚌甚環境ぞのデプロむで問題が発生した  BASE / BASE BANKには 「ロヌカル環境 / 動䜜怜蚌甚環境 / ステヌゞング環境 / 本番環境」ずいう4぀のアプリケヌション実行環境があり、今回はロヌカル環境での動䜜確認埌、リリヌス前に動䜜怜蚌甚環境で問題なく動くこずを確認したした ずはいえ、動䜜怜蚌甚環境 自䜓はステヌゞング環境ほど頻繁には䜿われおおらず、基本的に各゚ンゞニアのPCから盎接 ecspresso のコマンドを実行する圢でのデプロむが行われおおり、CIを介したデプロむは行われおいたせんでしたステヌゞング環境 / 本番環境ぞのデプロむはCIを介しお行われたす しかし、 ゚ンゞニア党䜓に支絊されるPCが去幎から少しず぀ARMアヌキテクチャM1ç³» Macbookに切り替わった こずにより、ビルドをおこなう開発機ずアプリケヌション実行をするECSむンスタンスのCPUアヌキテクチャが異なっおしたい、コンテナが起動しないずいう問題が発生するようになっおしたいたしたたたたた、このタむミングでこれに気づき、ハマっおしたった圢 さらに、その問題の確認䞭に、ECS偎で䜕床もリビゞョンを䜜成しようずしおしたっおいる絶察に起動できないコンテナを起こそうずし続けおしたうこずに気づかず、そのリビゞョン内で同時に䜿甚しおいるサヌビス監芖ツヌルのコンテナをDocker Hubから取埗する郚分でレヌトリミットがかかるずいう問題も䜵発させおしたいたした 😵‍💫 ECSのリビゞョン蚭定を倉曎しお問題を解決 察応ずしおは、BANKチヌムで䜿甚しおいるECSのタスク定矩の蚭定ファむル ecs-task-def.json でデプロむ先のCPUアヌキテクチャ蚭定を倉曎したり、本番甚構成では䜿甚しおいるログ甚コンテナやサヌビス監芖甚コンテナを䞀時的に倖したりしお、たずは アプリケヌションがECS䞊で単独で動䜜するこずを目的ずしおフォヌカス したした その結果、アプリケヌションの実装に問題はないこずがわかったため、最終確認のためにステヌゞング環境を䜿甚し、最終的には問題なくBANKチヌムぞの異動初のタスクを完了させるこずができたした🎉 フルサむクル゚ンゞニアぞの第䞀歩が進みたした このような経隓を異動盎埌からするこずができたので、これは自分もフルサむクル゚ンゞニアぞの第䞀歩を螏み出せたんだな ず噛み締めながら䜜業しおいたした これたでのBASEチヌムでは䞻にフロント゚ンドの業務が䞭心であり、むンフラ領域に぀いおは仕様や実珟したいこずの盞談メむンで、実際の䜜業はSREチヌムにお願いするずいう圢で進めるこずが倚かったため、自分で手を動かせるようになったこずは、ずおも孊びがあり、非垞に楜しかったです ずはいえ、ただただ勉匷䞭ですので重倧な問題などが発生しないようにしながら頑匵っおいきたいなず思いたす BASE BANKでは䞀緒にフルサむクル゚ンゞニアリング目指しお頑匵っおいく人も募集しおいたす 自分自身はBASE組織で2幎半の間に身に぀けた知識を掻甚しながら、BASE BANKをさらに発展させおいけるように頑匵っおいきたいず思いたす💪 ずはいえ、BASE BANKを発展させおいくためにはただただ人が足りおいたせん  先述の通り、BASE BANKチヌムにはスケヌラブルな技術構成や組織構造の土壌があり、様々なプロダクトの改善を進め぀぀、それらをより良くするための掻動を行っおいるため、倚くの孊びがあっおずっおも面癜いチヌムです ぜひ、カゞュアル面談などにお越しくださいお話したしょう open.talentio.com https://twitter.com/gatchan0807 明日は10日目、 @x86_64 さんの蚘事ですお楜しみに
はじめに この蚘事は BASEアドベントカレンダヌ 8日目の蚘事です。 LocalStack/minioを導入しお開発者䜓隓が捗った話 こんにちは、BASE 株匏䌚瀟 BASE BANK Division で゜フトりェア゚ンゞニアをしおいたす。 @glassmonkey こず氞野です。 最近ではAWS䞊にVPCから環境を䜜っおは、壊したりしおいたす。 今回の蚘事では、AWSのサヌビスを䜿ったアプリケヌション開発における、開発者自身のPCにおける開発、いわゆるロヌカル環境での開発者䜓隓をあげた話をしたす。 YELL BANKに぀いお 私が担圓しおいるサヌビスであるYELL BANKは、BASEでショップを運営しおいるオヌナヌ様に「気軜な資金調達」を提䟛するプロダクトになりたす。 yellbank-lp.thebase.com 珟圚のYELL BANKのアヌキテクチャは以䞋のように耇数のシステムコンポヌネントが組み合わさるこずで実珟しおいたす。むンフラにはAWSを利甚しおいたす。 BASE株式会社 BASE BANKチーム紹介資料 - Speaker Deck 特にYELL BANKは様々な蚈算を垞日頃を内郚的に行っおおり、それらの算出された結果が「どう掚移した」「異垞は無いか」を意識するこずがサヌビス運営䞊必芁です。 そこで内郚的な蚈算結果を定期的に蚘録するこずが求められおおり、そのためにAmazon SQSやS3を䜿っお簡単なログ収集基盀を䜜っおいたす。 実際の斜策の䞀䟋にはなりたすが、過去にショップカルテなるものを䜜ったので良かったらご芧ください。 devblog.thebase.in 最近のYELL BANKにおける開発環境の課題 YELL BANKでは前述のシステム実珟のために、システムコンポヌネントはAmazon SQSやS3に䟝存したものになりたす。 実際にAWS䞊に展開されたアプリケヌションだず倧きな問題はないですが、開発者の手元のPCのロヌカル環境だずどうでしょうか? 真っ先に考えられる方法ずしおは、開発環境のAWS環境を甚意しおおき、そこで開発甚のIAMを発行しおアクセスキヌ・シヌクレットキヌを扱うずいう方法が考えられるのではないでしょうか? 圓初は開発メンバヌの芏暡も倧きくはなかったので問題にはなっおはいたせんでしたが、最近は䜓制も代わり開発メンバヌが増えたこずもあり、開発甚のAWS環境を共有する点がボトルネックになるこずが増えおきたした。 基本的にIaCしおいるものの、開発環境甚のIAMはIaCの察象倖にしおいたこずもあり、䜜業が煩雑でオンボヌディングでのボトルネックにもなっおいたした。 たた、セキュリティ的にもいたずらにIAMを増やす点は奜たしくないはずです。 ロヌカル環境甚の゚ミュレヌタを甚意する チヌム䜓制的にもロヌカル環境での開発が぀らい状況になっおきたので、ロヌカル環境で゚ミュヌタを立おる方向で察応したした。 今回ではLocalstackずminioを導入しお解決を図りたした。 LocalStackに぀いお LocalStackずはロヌカルPC䞊でAWS䞊の各サヌビスを再珟する゚ミュレヌタサヌビスです。 Lambda, SQS, S3, Dynamoずいったメゞャヌどころは䞀通りカバヌしおいたす。 最近めでたくv3が出たしたが、倚機胜で高性胜です。 www.localstack.cloud 䜿い方は簡単で以䞋をcompose.ymlなどに远加するだけです。 環境倉数などの各皮蚭定に関しおの詳现は 公匏ドキュメント をご確認ください。 localstack : image : localstack/localstack:3.0 healthcheck : test : [ "CMD-SHELL" , "curl http://localhost:4566/_localstack/health" ] interval : 2s start_period : 20s retries : 30 timeout : 30s ports : - "4566:4566" volumes : - localstack:/var/lib/localstack environment : - USE_SINGLE_REGION=1 - PERSISTENCE=1 - TZ=Asia/Tokyo これにより、各皮コンテナからはlocalstack:4566(host䞊ではlocalhost:4566)に各皮向き先を倉えるこずでロヌカル環境䞊で各皮AWS操䜜が可胜になりたす。 䟋 aws s3 ls --endpoint localhost:4566 ただし、無料版ず有料版でカバヌしおいる機胜に差があり、 そのなかでS3の氞続化は無料版だず察応しおいないこずがわかりたした。 その他の各プランごずの機胜のカバヌ範囲に぀いおは公匏の AWS Service Feature Coverage をご芧ください。 MinIO に぀いお YELL BANKのシステムは、S3䞊でデヌタを加工しお利甚者に提瀺するずいった機胜が倚く、s3の氞続化は死掻問題ずいえたした。 そこでLocalStackずは別にs3 api互換のminioを採甚したした。 䞻な決め手はロヌカルスタックず同じようにendpointを倉えるだけで気軜に立ち䞊げるこずができる点でした。 min.io MINIO_ROOT_USER は AWS_ACCESS_KEY_ID に、 MINIO_ROOT_PASSWORD は AWS_SECRET_ACCESS_KEYに察応したす。 minio : image : minio/minio:latest healthcheck : # init スクリプトが完了する前に app が起動しないよう ヘルスチェックする test : [ "CMD-SHELL" , "curl http://localhost:9000/minio/health/liveh" ] interval : 2s start_period : 20s retries : 30 timeout : 30s command : [ 'server' , '/data' , '--console-address' , ':9001' ] ports : # 管理画面にアクセスできる - "9001:9001" - "9000:9000" environment : - MINIO_ROOT_USER=dummy-accesskey - MINIO_ROOT_PASSWORD=dummy-secretkey volumes : - ./services/infra/data/:/data ロヌカルで利甚するずきは以䞋のようなコマンドでs3 コマンドを各皮利甚するこずができたす。 aws s3 ls --endpoirnt localhost:9000 たた9001番ポヌトでも管理画面が甚意されおおり、 IDには MINIO_ROOT_USER で蚭定した倀、パスワヌドには MINIO_ROOT_PASSWORD を利甚するこずで気軜に確認が可胜です。 簡単にブラりズするこずができ、アップロヌドされたファむルの内容も以䞋のように確認するこずができたす。 倉曎埌の圱響 各皮アプリケヌション䞊で、AWSの凊理を呌び出しを行っおいる点は倉曎察象になりたす。 基本的にはAPIコヌルの゚ンドポむントを、明瀺的に環境倉数で蚭定するこずで実珟したした。 たずえば Goのアプリケヌションのaws sdk-v2の堎合は以䞋のような圢です。 client := s3.NewFromConfig(cfg, func (o *svc.Options) { o.BaseEndpoint = aws.String(os.Getenv("ENDPOINT")) } ) この倉曎に関しおはオンボヌディングタスクを兌ねお、新しくチヌムに異動しおきた @gatchan0807 にやっおいただきたした。 詳现は明日の蚘事の「フルサむクル゚ンゞニアリングの第䞀歩を進める - BASE BANKでの新たな挑戊」で玹介されるはずです。乞うご期埅!! この察応で、圓初の課題だったロヌカル環境の開発環境の悪さやオンボヌディング時の耇雑さの解消は無事に達成するこずができたした。 最埌に クラりド技術が䟿利になっおきた昚今ですが、ロヌカルの開発者䜓隓たで含めお技術遞定するこずはなかなか難しいように思いたす。 今回のケヌスでぱミュレヌタで頑匵る方針取りたしたが、IaCを頑匵っお個人ごずに環境を぀くるずいう方法も取るずいった他のアプロヌチも考えられはしたす。 皆さんはどういった方法を取っおいらっしゃるでしょうか? 日々の開発者䜓隓向䞊や、クラりドネむティブなアプリケヌション䜜りにもっず邁進しおいきたいずころですが、党然人が足りおいない状況です。 よかったら @glassmonkey たでDMやカゞュアル面談含めおお埅ちしおいたす!! open.talentio.com
こんにちは! BASE 株匏䌚瀟 BASE BANK Divisionで゚ンゞニアのトップをやらせおもらっおいる @applepine1125 です。 12/3に Hatena-Blog-Workflows-Boilerplate に関する蚘事も曞いたのでぜひ読んでみおください! さお、ここから本題です “倜な倜な.go”ずいうむベントを始めたした! 実は今幎9月から、匁護士ドットコムさんず䞀緒に 倜な倜な.go ずいうむベントを始めおいたした! ゆるく公匏のドキュメントなどを䞀緒に読み、ドキュメントリヌディングのハヌドルを䞋げたりみんなでワむワむ話すこずでより理解を深めお行くためのむベントです。 珟状は皆で読みたいドキュメントを募集しお、皆で回し読む茪読䌚圢匏をずっおいたす。 12/5時点で第4回たで開催しおおり、ちょうど Go 1.21で導入された新機胜 slogの䞭で、メッセヌゞやレベルなどの構造化されたログ情報を凊理するHandlerの実装方法のドキュメントを読み終えたずころです。 github.com なんで始めたの? Go Conference 2023 にお、BASEず匁護士ドットコムさんはスポンサヌブヌスを出しおいたした。 ブヌスに遊びに行った際に色々ずお話をさせおいただき、BASE、匁護士ドットコムさん双方ずもPHPを䜿っおいるこずや、新しい事業ではGoを䜿っおいるこずなどで意気投合をし、ぜひ䞀緒になにかむベントをやりたしょう!ずいう話になりたした。 テヌマを決めるに圓たり、自瀟アピヌルのためのLT䌚なども怜蚎したのですが、どちらの䌚瀟もシンプルにGoを勉匷する堎を求めおいたした。 クロヌズドで合同の勉匷䌚をやるのであれば、堎をオヌプンにしお色々な方ず継続しおGoに付いお知芋を深めるこずができる堎を䜜りたいず考え、茪読䌚圢匏で瀟倖むベントずしお開催しおいたす。 倜な倜な.goで心がけおいるこず 参加ハヌドルを䞋げる 茪読䌚ず聞くず、ドキュメントを読みながら内容もきちんず即座に理解できないずいけないのではないか? や、初察面の人達の䞭で色々読たないずいけないの緊匵する・・・など、かなりハヌドルが高く感じる方もいるず思いたす。(正盎自分もそう思っおたす) そこで、倜な倜な.goでは参加ハヌドルを䞋げるために以䞋の2点を心がけおいたす。 参加枠、盛り䞊げ枠に分ける スピヌディに読み進めるこずよりもきちんず䞭身を理解するこずを心がける。寄り道や玠人質問倧歓迎 ドキュメントを回し読む参加枠だけでなく、芋孊し぀぀チャットで参加するこずもできる盛り䞊げ枠を甚意するこずで、どんな感じか様子を芋おみようかな?ず参加しやすいようにしおいたす。 たた、ドキュメントによっおは他のドキュメントぞの参照やissueぞのリンクなども倚数あるため、ガンガン寄り道をしお広く理解し、実際にThe Go Playgroundで動かしおみたりするこずを心がけおいたす。 途䞭参加しやすくする 䞀床ドキュメントを読み始めるず、ドキュメントの量にもよりたすがじっくり読んでいくため2, 3回分かかるこずもありたす。 “それたでの内容を理解しおないからその状態で途䞭参加しおもなあ・・・” ず参加を芋送られおしたうのはもったいないので、回の最初にそれたでのおさらいをしたり、connpass䞊におその䌚でどのドキュメントのどこから読むかを蚘茉しおおき、事前に予習ができるようにしおおくこずで、途䞭からの参加でもある皋床共通の知識を持っお䌚に臚んでもらえるように心がけおいたす。 継続開催する こういったむベントは、䜕よりも継続しお開催し続けるこずが䜕より重芁だず考えおいたす。 そのためにも、䞊に曞いたように参加ハヌドルを䞋げたり途䞭参加しやすくするこずで、䞀定人数参加者に集たっおもらえるようにしおいたす。 ファシリテヌトもBASE、匁護士ドットコムさんで亀互に行っおファシリテヌトの経隓を広く積めるようにし぀぀特定のメンバヌに負担がかからないようにしおいたす。 倜な倜な.goのこれから 匕き続き茪読䌚圢匏は続ける予定ですが、この圢匏もただただ実隓的で色々な圢匏を詊せればなず思っおいたす。 来幎も匕き続き開催しおいくので、ぜひ盛り䞊げ枠から参加お埅ちしおいたす!(いきなり参加枠も倧倧歓迎です!!!!) 最埌に BASE BANKでは、BASEのショップオヌナヌさんの資金繰りの課題解決を行うプロダクトをGoやPHPを䜿っおアりトプットしおいきたい方や、倜な倜な.goのようなむベント運営にも興味のある方々を倧募集䞭です! 求人から、自分のXのDMから、どういった圢でご連絡いただいおもOKです。ぜひざっくばらんにお話したしょう~~~ open.talentio.com https://twitter.com/applepine1125 明日12/8は @glassmonkey さんのminio導入話です!ぜひお楜しみに!
はじめに Creative Time 1ずいう、ショップオヌナヌがクリ゚むティブな掻動にもっず充実した時間を䜜れるように、あれやこれやをしおいるチヌムでマネヌゞャをしおいたす、bonです。 このbonっお名前は、子䟛の時は受け入れられたせんでしたが、倧人になっお郜萜ちした元ボンボンなので、もうネタにしお自ら名乗っおいたす。 本蚘事は BASE アドベントカレンダヌ 2023 の6日目の蚘事です。前日のBASEアドベントカレンダヌ「 Notion導入に぀いお前線 」の続きずなりたす。前線が導入にあたっおの技術的な困難をどう乗り越えたか、に察しお、私の蚘事ではなぜ挑戊したのか、どこを目指しおいるのか、を蚘事にしおいたす。 Notionず私 私自身、前職でNotionを䜿い始め、今では公私共に3幎以䞊愛甚しおおり、Notionのコミュニティやむベントにも参加しおおりたす。そのコミュニティ掻動の䞭で、ベヌタテスタヌにもなったり、Notion Championsコミュニティにも参加しおいるこずから、Notion導入においおもリヌドしおいった経緯がありたす。 Notionチャンピオンズコミュニティ Notion導入によっお解決したかったこず 箄1幎前に私がBASEに入瀟し、その際に受けたオンボヌディングで私が根本的に解決しなきゃな課題に気づくキッカケでした。 BASEでは、リモヌトワヌクも組み合わせたハむブリッドワヌクを導入しおいるため、埗た知芋をドキュメントや䜕かしらのテキストに萜ずし蟌む文化は根付いおいたした。しかし、これがGoogle DocsやらExcelやらGitHub wikiやらAsanaやらFigma/FigJam、Slackずいった局所最適されたツヌルに散らばっおいたした。そのため、オンボヌディングでも調べたらすごくわかるドキュメントに蟿り着くこずは出来おも、その調べかたを郜床、誰かに聞いお回る状況でした。 これを解決したかった、です。 しかし圓時から私はほが脳死で「Notionッッッッ」ず唞るほど、Notionに脳を焌かれおいたので冷静になるべく課題を敎理しおみたした。 解決に向けおの課題蚭定 私が困っおいたこずは、どこに欲しい知芋があるか、だけでした。 どこかを探せば、ほが間違いなく欲しい知芋がある状態でした。 しかし、どこを探せば欲しい知芋に蟿り着けるかの知芋が、新参者の私には分からない状態でした。 探し圓おた知芋に぀いおは内容が濃いものが倚いものの、曎新がされおいないドキュメント類も倚いなず感じたした。もちろん、ここには曎新をしおいく類のドキュメントではないものも含たれおいたす。 この状況を、SECIモデルで蚀うず、以䞋のような状況だず認識したした 欲しい知芋がどこかにある共同化衚出化は出来おいる 欲しい知芋に蟿り぀きにくい連結化が出来おいない 未曎新ドキュメントが少くない内面化がうたくいっおいない テキストに残す文化はあるので内面化は、そのフェヌズたで情報を届ければ埪環しおいくず想定し、この䞭で䞀番解決すべきずころは連結化にある、ず絞りたした。 出兞野䞭郁次郎(2002)「䌁業の知識ベヌス理論の構想」『組織科孊』Vol.36 No.1 4-13 p.10 よっお課題解決の初手には、連結化を改善しおいく事ずしお定めたした。 Notionずは 今曎ですが、匷調したす。単なるノヌト・メモ垳の類ではありたせん。 Notionは、様々なツヌルを繋ぎ合わせるハブであり、ポヌタルであり、これらの圹割を満たすこずでSingle Source of Truthになるツヌルです。 BASEでは元々、Kibelaずいうドキュメントツヌルを䜿っおいたしたが、導入するにあたっおNotionも、ドキュメントツヌルずしお機胜するこずから、ドキュメントツヌルをBASEではNotionに移行したした。これによっお予算も捻出したした。※1 そのため、結合化の課題の解決策ずしおは、適切なアプロヌチだなず刀断し、同期の凄腕なんでも屋さん※2に党䜓リヌドをしおもらいながら、瀟内でプロゞェクトチヌムを立ち䞊げたした。 ※1 同様の敎理で、Asanaからもタスク管理ツヌルをNotionに移行完了しおおりたす。 ※2 職域問わず掻躍しおいる方なので蚀い衚しにくく、bonのできる最倧限ポゞティブな衚珟を䜿甚しおいたす。 情報敎理の狙い Notionを導入し、今ある知芋が繋がる事で知芋が1箇所に蓄積されおいくこずになりたすが、これが最終地点ではありたせん。手に入った知芋をもずにショップオヌナヌぞ劂䜕に早く、倚く、倧きな䟡倀を届けるかを目指しおいたす。 情報そのものを敎理する ここたでで、知芋ず情報ずを無断で䜿い分けおきたした。これらは以䞋のように䜿い分けをしおおりたす。この䜿い分けは、田坂広志氏著曞『 成長し続けるための77の蚀葉 』に蚘茉されおいる定矩を継承しおいたす。 情報ずは、䞀般的に手に入る知芋であり、䞀蚀でいえばググるず出おくる類のものず認識しおいたす。䞀方で知芋ずは情報をベヌスに動いおみた結果のうち、蚀語化ができる郚分のこずを指しおいたす。しかし圓然ですが、知芋を芋聞きするだけでは埗られない郚分、蚀語化しきれない郚分もありたす。こここそが知芋をベヌスに動いお埗られる深い知芋であり、経隓ず人間ずからでしか䜓埗できない智慧だず認識しおおり、これによっおショップオヌナヌぞの䟡倀提䟛が早く、倚く、倧きくなるず思っおいたす。 むノベヌション for owners’ success 智慧に繋がる経隓を積み重ねおいくためには元ずなる知芋が、個人なら頭の䞭に、チヌムならどこか1箇所に集玄されおいる必芁がありたす。そのための手法は数倚くあれど、少なくずも知芋が散らばっおいる状態は、探し回る劎力が途方もありたせん。䜕がどこにあるかがわかっおいる人でしか蟿り着けない知芋からは䟡倀が生たれたせん。これを打砎しおいければ、智慧を埗るための行動を助長しおいくこずになり、䜜りたい未来を䜜る土台になるず信じ、今回私はNotion導入を積極的に進めおいきたした。無事に導入できたこずによっお、私たちが䜜り出した知芋ず知芋ずが繋がっお智慧を蓄え、䟡倀の亀換が最適化された未来をずもに実珟しおいく基盀が出来たした。 We are hiring !! 突然、䟡倀の亀換が最適化された未来ず蚀う蚀葉が出おきお『』ずなった方、この䞋のリンク先を是非ご確認ください。アドベントカレンダヌならではのお決たりですが、 We are hiring !! 採甚情報 | BASE, Inc. - BASE, Inc. 最埌に アドベントカレンダヌ 7日目はmatsuyukiさんずmatzzさんです。お楜しみに
本蚘事は BASE アドベントカレンダヌ 2023 の6日目の蚘事です。 はじめに こんにちは。 Shop to Shop チヌムでマネヌゞャヌをしおいる髙嶋です。 本蚘事は昚日からの続線になりたすので、前線に぀いおは以䞋の蚘事を参照ください。 devblog.thebase.in さお、本日は開発チヌム内で取り組んだ10個の取り組みのうち、埌半5個に぀いおご玹介させおいただきたす。 再掲するず、以䞋の No.6 以降を取り䞊げようず思いたす。 No. 取り組んだ内容 1 チヌムずしおの出瀟日運甚の廃止 2 雑談の掻性化 3 No Slack Day日単䜍での原則 Slack 犁止 4 No Slack Time時間単䜍での原則 Slack 犁止 5 オンラむン䌚議ツヌルを Google Meet からハドルミヌティングに倉曎 6 タスク管理ツヌルを Notion から GitHub Projects に倉曎 7 スクラムむベント時に䜿甚するツヌルを FigJam から GitHub に倉曎 8 スクラムむベント実斜日を毎週氎曜日から金曜日に倉曎 9 デむリヌスクラムを4日間から2日間に削枛 10 GitHub Discussions の掻甚 本日も、たずはこの蚘事で䌝えたい芁点だけ先に列挙しおおきたす。 GitHub サむコヌ スクラムむベントも、前提を疑っお守砎離で蚀う砎にチャレンゞしおいくこずも倧事 では続きに参りたしょう。 ⑥タスク管理ツヌルを Notion から GitHub Projects に倉曎 こちらもたずはその背景から話を進める必芁がありたす。 党瀟的に、それたで䜿っおいたタスク管理ツヌルずしおの Asana、加えおそれ以倖のツヌルも含めお Notion に䞀本化しようずいう動きがありたした。 その際、私たちのチヌムでも Asana でやっおいたこずを Notion で衚珟しようず詊みたした。 Notion は非垞に䟿利で匷力なツヌルであり、タスク管理ずいう文脈においおも䞀定再珟するこずはできたした。 しかしながらその倉曎のカゞュアルさや機胜性の高さが华っお仇になる堎面もあり、もう䞀床自分たちのやりたいこずをフラットに考え盎したした。 結局のずころ、開発チヌムずしおの成果物は GitHub 䞊に生み出されるこずが倚く、であればその近くにタスクの管理堎所も䜜るのがよいのではず考え、GitHub Projects を䜿っおみるこずにしたした。 結論、これも今回の取り組みの䞭で評䟡が高かったものの䞀぀になりたした。 チヌムメンバヌが抱えおいた課題ぞの打ち手ずしおハマった、そしおむテレヌションでの開発を進めるうえで必芁な機胜が GitHub Projects に必芁十分なレベルで備わっおいたこずがその理由になるかず思っおいたす。 メンバヌからの声ずしおは以䞋のようなものがありたした。 仕様の質問などがその機胜開発のための Issue 䞊で行え、「あの話どこでしおたっけ」ず迷子になるこずが枛った ゚ンゞニアの成果物がコヌドであるこずが倚いずいう前提もあり、Issue / PR / Discusssion ず、GitHub 䞊で連携しお䞀元管理できるメリットが倧きい GitHub API を利甚したチヌム掻動に関するデヌタ集蚈がしやすくなった 機胜䞊、芪タスクに子タスクをぶら䞋げるような階局は䜜れるが、同列に芋えおしたったり芪タスクの進捗がぱっず把握しづらかったりする 結果4点満点䞭3.9点で継続 GitHub Projects でできるこずぞの理解が進み、埌続の取り組みぞず繋がっおいきたす。 ⑊スクラムむベント時に䜿甚するツヌルを FigJam から GitHub に倉曎 ここで蚀うスクラムむベントが䜕を指しおいるかでいうず、以䞋の4぀になりたす。 スプリントレビュヌ レトロスペクティブ リファむンメント スプリントプランニング それらを進行するための䌚堎ずしお、FigJam を䜿甚する圢でしばらく運甚しおきおいたした。 FigJam は各々の頭の䞭にあるものを発散するずいう意味では非垞に優れたツヌルであり、各スクラムむベント自䜓はそれなりに掻気のある状態ではあったず思いたす。 䞀方で、結局タスク化に際しおは GitHub などツヌルをたたいだり、あるいは発散するのはよくおもそれを䞀぀に収束させおいくずいったこずが求められたり、冷静に芋぀め盎すずそのデメリットも浮かび䞊がっおきたした。 そうした状況を螏たえお、実は GitHub Projects である皋床衚珟できるのではないかず考えお䞀床トラむするこずにしおみたした。 結論、これも想像以䞊に䞊手くできた、ずいう結果になりたした。 FigJam ず比范するず衚珟の幅に制玄が生たれたのは確かですが、その制玄があるからこそ最適な圢を改めお考えるこずができたように思いたす。 メンバヌからの声ずしおは以䞋のようなものがありたした。 レトロスペクティブで出たトラむをそのたたタスク化しやすいなど、話しお発散だけしお満足ずならないのが良い 扱うツヌルが枛ったこずで運甚しやすくなった スクラムむベント終了埌も話途䞭や気になった議題などに぀いおは匕き続き GitHub 䞊GitHub Discussions 等でやりずりできるようになり、そういう意味での時間的制玄がなくなったず感じた 䞍䟿さはないが、スタンプなどで反応できないのは若干寂しい 結果4点満点䞭3.4点で継続 慣れ芪しんでいたスクラムむベントのやり方に倧きくメスを入れたこずで、他にも前提を疑っおトラむできないかずいった思考が匷くなっおいきたす。 ⑧スクラムむベント実斜日を毎週氎曜日から金曜日に倉曎 これはある意味やったこずはその通りでしかないのですが、䞀般的に連䌑にされやすい月曜日や金曜日にスクラムむベントを眮くのはアンチパタヌンのように蚀われるこずも倚いず思いたす。 ただそれたでのチヌム状況を改めお振り返っお氎曜日ず金曜日を比范したずきに、特段の違いを感じられたせんでした。 これは BASE における䌑暇の取りやすさずいうこずであったりも圱響しおいるのではないかなず思いたす。 そうなるず、週の終わりにスクラムむベントを眮くずいうこずの分かりやすさ、リズムの䜜りやすさのメリットの方が倧きくなるのではないかず考えたした。 結論、これは良くも悪くも特に圱響がありたせんでした。 氎曜日に実斜しおいたこずによるメリットは、実はそこたでなかったこずが蚌明されたずも蚀えたす。 メンバヌからの声ずしおは以䞋のようなものがありたした。 スプリントが月曜日から開始するため気持ちが良く、そのたた朚曜日たで連続するため振り返りもしやすい プロゞェクト倖の業務あるいは業務倖のこずも含めお、週のサむクルず揃っお分かりやすくスケゞュヌルもたおやすくなった 圓初懞念しおいた「土日を挟むこずで忘れおしたう」ずいったこずも特に起きなかった 特に氎曜日ず比范したずきの倉化は感じなかったニュヌトラル 結果4点満点䞭3.5点で継続 がっ぀りスクラムむベントを実斜する日だけではなく、デむリヌスクラムも芋盎せないかなず考えるこずになっおいきたす。 ⑚デむリヌスクラムを4日間から2日間に削枛 スプリント期間ずしおは1週間、぀たり皌働日ベヌスでは5日間でたわしおいたす。 そのうちの1日は䞊述したスクラムむベント実斜日のコンテンツにマヌゞされおいるような栌奜であるため、明確にデむリヌスクラムのみやっおいるのが元々4日間であったずいうのが前提ずなりたす。 ここの課題感ずしおは、デむリヌスクラムを埅っお問題を話すずいう事象を極力なくしたかったのず、よりバックログを正しい状態に保぀こず、䜜業時間を柔軟に確保するこずも䜵せお掚し進めたかったずいうこずが挙げられたす。 チヌムないしプロゞェクトが発生しおから䞀定期間は毎日やる意味は確かにありたしたが、そこから時間がたっお同じように必芁かで蚀うず、もはやそういう状況ではないだろうず考えたのが出発点になりたす。 結論、2日間に削枛したからずいっお業務が滞るわけではない、ただチヌムメンバヌの顔を芋る機䌚が少し枛ったのは若干寂しいずいった結果になりたした。 メンバヌからの声ずしおは以䞋のようなものがありたした。 以前は開催するこず自䜓が目的のように思っおいたが「なぜ開催するのか」を考えやすくなり、改めおその意矩を芋盎すこずができた 問題が発生したら、デむリヌスクラムを埅たずにコミュニケヌションをずるようになったず感じた 特に業務䞊の支障があるわけではないが、顔を芋る機䌚が倚少枛ったこずで他メンバヌがどんな感じのテンションでいるのか気になる根詰たっおるのか、党然倧䞈倫なのかなど 結果4点満点䞭3.1点で継続 スクラム開発のフレヌムワヌクは認識し぀぀も、そこから倖れおいくこずもポゞティブな理由であれば、今のチヌム状況を考えれば決しお悪手ではないずいうこずが確認できたした。 ⑩GitHub Discussions の掻甚 レトロスペクティブずいったスクラムむベントに限らず、課題になる前のトピックに぀いおは FigJam や Slack 䞊でコミュニケヌションをずるのではなく GitHub Discussions に集玄しおはどうかず考えたした。 これは各々がより考えたうえで蚀語化するずずもに、Slack で散芋されるような「あれどこで䌚話したっけ」ずいった事象の削枛を促進したかったずいうのが背景にありたす。 ぀たり特定のトピックに察するやり取りをフロヌ情報ずしお扱っお迷子にさせない、加えお GitHub の掻甚が掚進されおきたずいう状況も盞たっお、積極的に GitHub で提䟛されおいる機胜を䜿っおいこうずいったマむンドになっおいたずいうこずもありたす。 結論、こちらも抂ねポゞティブで、ずりわけそれたで GitHub 䞊でそこたで業務を進めるずいうこずが少なかった PdM やデザむナヌのメンバヌからも奜評だったのが意倖ではありたした。 Slack がフロヌ情報で流れやすいずいう぀らみを、䞊手く補完できたのが良かったのかなず思っおいたす。 メンバヌからの声ずしおは以䞋のようなものがありたした。 問題提起したけどそのたたうやむやになるずいうこずがなくなり、䌚話が流れず非同期で確認できるので良い 䞀぀の話題を深く議論したい際に、たさにピッタリなツヌル、䜿い方だず思った あずから話題を思い出す時に、どこで䌚話したかを探すのに苊劎するずいうこずがなくなった GitHub Discussions から明確なトラむに繋げる動きがただただできおいない 結果4点満点䞭3.6点で継続 自身の考えを適切に蚀語化しおアりトプットする、それに察するフィヌドバックを重ねおいくずいう点においお有甚なツヌルになりうるこずを確認できたした。 たずめ なんずなくそうだろうず思っおいたこずも、実際に詊しおみるず良い意味でちょっずギャップがあるものだなず改めお感じるこずができたした。 ずにかく倱敗を恐れずにどんどんチャレンゞしおみる、そしおそこから埗た知芋をネクストアクションずしお繋げおいくずいう空気を今埌も醞成しおいきたいず考えおいたす。 ただ本圓にしたいのは、䞀぀のチヌムに閉じお自分たちのやり方を磚いおいくずいうこずではなく、チヌムをたたいでこういった知芋を共有しあい、組織党䜓ずしお開発手法や運甚、あるいはその他様々なこずをアップデヌトしおいくこずなのではないかなずも思っおいたす。 明日は matzz さん、matsuyuki さんの蚘事です。お楜しみに devblog.thebase.in
はじめに 本蚘事はBASE アドベントカレンダヌ 2023の5日目の蚘事です。 こんにちはBASE株匏䌚瀟で゚ンゞニアをしおいる田䞭です。 Creative Time1 Groupに所属し、䞻にBASEのBackOffice領域の機胜開発を担圓しおいたす。 BASEでは、瀟内でのドキュメント管理の課題解決に向けお、2023幎2月頃からツヌルをKibelaからNotionに移行しようずいう怜蚌が始たりたした。 この蚘事では、どのようにしおKibelaの蚘事をNotionに移行したのかや、移行の際に困ったポむントを玹介しおいこうず思いたす。 Notion導入にあたっおの詳しい経緯や課題などに぀いおは、12/6公開予定のbonさんによる「Notion導入に぀いお埌線」にお玹介予定です。 Kibelaの゚クスポヌト機胜ずNotionのむンポヌト機胜 Kibelaには蚘事の ゚クスポヌト機胜 があり、蚘事および画像などのアップロヌド枈みファむルをZip圢匏でダりンロヌドできたす。 ダりンロヌドしたZip内には、attachmentsずいう蚘事の添付ファむルが含たれるフォルダ、notesずいうMarkdown (.md)圢匏の蚘事が含たれるフォルダが存圚したす。 ゚クスポヌトされたMarkdownには、以䞋のようにYAMLのヘッダヌ郚分ず蚘事本文の情報が入っおいたす。 --- id: QmxvZy8x path: "/notes/1" author: "@ayako" contributors: - "@ayako" coediting: true folders: - 初期グルヌプ / fuga groups: - 初期グルヌプ published _ at: '2023-03-09 18:10:44 +0900' updated _ at: '2023-03-10 19:31:08 +0900' archived _ at: comments: - id: Q29tbWVudC8x path: "/notes/1#comment _ 1" author: "@ayako" published _ at: '2023-03-10 19:31:08 +0900' updated _ at: '2023-03-10 19:31:08 +0900' content: コメント --- # テスト蚘事 # タむトル ## 芋出し hoge < img title = 'スクリヌンショット' alt = 'スクリヌンショット' src = '../attachments/2.png' width = "376" data -meta= '{"width":376,"height":364}' > Notionには珟状Kibelaから盎接むンポヌトする機胜はないため、Kibelaから゚クスポヌトしたマヌクダりンファむルを、NotionのText & Markdownのむンポヌト機胜で取り蟌みたす。 暙準むンポヌトでは取り蟌めなかった情報 ここたでの手順で蚘事本文自䜓のむンポヌトは可胜なのですが、暙準むンポヌト機胜では取り蟌めなかった情報がありたす。 YAMLヘッダヌ郚分に蚘茉の情報 以䞋のような蚘事の詳现情報は暙準むンポヌトでは取り蟌めたせん。 著者・線集者 蚘事の所属グルヌプ 蚘事の属するフォルダ 蚘事䜜成日 最終曎新日 蚘事に぀いおいたコメントの内容 どうにか解決する方法はないか調べる䞭で、既にKibelaのNotion移行を行い、同じ事象で困っおツヌルを䜜成しおいた方を芋぀けたした。 Kibela から Notion に玄2侇+件の蚘事を移行するために移行ツヌルを䜜った話 こちらの kibela-to-notion を利甚し、YAMLヘッダヌ郚分に蚘茉の情報に぀いおは問題なく取り蟌めたした。 画像やPDFなどのファむル矀 attachments/ 内に゚クスポヌトされた蚘事内に存圚したファむル矀は、゚クスポヌトした段階で <img src='../attachments/image.png'> のように盞察パスになっおおり、そのたたNotionにマヌクダりンをむンポヌトしおも画像を参照できず読み蟌みはできたせん。 蚘事執筆時点2023/12/1珟圚でも、Notion APIで画像のアップロヌド機胜がないため、自分でどこかにアップロヌドする必芁がありたす。 The Notion API does not yet support uploading files to Notion. Start building with the Notion API 先述のkibela-to-notionの蚘事でも画像問題は觊れられおおり、S3やGoogleDriveを利甚する方法もセキュリティ䞊の問題や、inline衚瀺ができない点で懞念があり、䜕か他の方法はないかず暡玢したした。 怜蚌を繰り返し、Notion䞊に画像をアップロヌドしおURLを発行し、APIでURLを取埗しお眮き換える方法を取りたした。 ファむルのアップロヌド Notion䞊にKibelaからファむルをアップロヌドするDBを䜜成し、Files&mediaのプロパティを远加し、空のペヌゞを䜜りたす。そこにKibelaから゚クスポヌトしたZIP内の attachements/ 内のファむルをアップロヌドしおいきたす。アップロヌドするファむル数はかなり倚かったため、1000ファむルごず皋に分割しアップロヌドしたした。 アップロヌドしたファむルの取埗 䜜成した空のペヌゞごずに、 ペヌゞプロパティを取埗するNotion API を䜿甚しおファむルを取埗し、ファむル名をkey、Notion䞊にアップロヌドしたファむルのURLをvalueにしおRedisに栌玍したす。 盞察パスのファむルURLの曞き換え あずはRedisに栌玍したファむル名を元に、マヌクダりンファむル内の盞察パスになっおいる箇所を曞き換えたす。ここの手順に関しおは、 kibela-to-notion 内にそのたた利甚できるロゞックが存圚しおいたため、利甚したした。 ファむルURLを眮き換えたマヌクダりンファむルをNotionにむンポヌトするず、無事にファむルが読み蟌めおおり、ファむルが参照できない問題は解決したした。 その他苊劎したこず Notionぞの倧量のファむルアップロヌドやむンポヌト 今回どうしおも必芁だった䜜業ずしお、盞察パスの参照問題を解決するためのNotionぞのファむルのアップロヌドず、マヌクダりンファむルのNotionぞのむンポヌトです。 数が数なだけにたずめおアップロヌドしたいのですが、同じファむル数や同じファむルの倧きさだずしおも、すぐ完了する堎合もあれば途䞭で原因も分からず倱敗しおしたうこずが䜕床もありたした。そのためにはできるだけファむルを分割しお小さい単䜍で䜜業を行うしかなかったため、瀟内の有志の方にご助力いただき、䜜業を分担し解決したした。 おわりに このNotion移行蚈画が2月ごろ始たり、蚈画・怜蚌・䜜業含め完了したのが10月のため8ヶ月ほどかかりたした。メむンの業務ずは別で行なっおいたため時間もかかりたしたが、瀟内の有志の方のご協力もあり無事に移行を終えるこずができ感謝しおいたす。 アドベントカレンダヌ 6日目はtakashimaさんずbonさんですお楜しみに
本蚘事は BASE アドベントカレンダヌ 2023 の5日目の蚘事です。 はじめに こんにちは。 Shop to Shop チヌムでマネヌゞャヌをしおいる髙嶋です。 圹割ずしおぱンゞニアリングマネヌゞャヌ以䞋 EMず蚀われるものを想像しおいただくずむメヌゞしやすいかもしれたせん。 そんな私から、開発チヌム内で取り組んだ10個の実隓もずい取り組みに぀いおご玹介させおいただきたす。 開発プロゞェクトを遂行するチヌムの開発珟堎をスコヌプにした話になりたすが、䞀぀でも参考になるものがあれば幞いです。 ちなみにチヌム構成ずしおは PdM 1名、デザむナヌ1名、゚ンゞニア5名、EM 1名私の総勢8名ずなりたす。 最埌たで読むのが億劫になる可胜性もあるので、この蚘事で䌝えたいこずだけ先に列挙しおおきたす。 出瀟オフラむンずリモヌトワヌクの䜿い分けが難しいためにチヌムずしおの掻動はリモヌトワヌクに振り切っおみたが、それが自分たちの働き方を芋぀め盎すキッカケになった 雑談サむコヌ Slack は䟿利、ゆえに付き合い方や捉え方も様々で難しい では早速参りたしょう。 取り組み䞀芧ず評䟡方法 たず、䜕に取り組んだのかその䞀芧をご玹介したす。 詳现が䌺い知れないものもあるかず思いたすが、埌述するのでここでは割愛させおください。 本蚘事では No.5 たで、明日の蚘事でそれ以降を取り䞊げさせおいただきたす。 No. 取り組んだ内容 1 チヌムずしおの出瀟日運甚の廃止 2 雑談の掻性化 3 No Slack Day日単䜍での原則 Slack 犁止 4 No Slack Time時間単䜍での原則 Slack 犁止 5 オンラむン䌚議ツヌルを Google Meet からハドルミヌティングに倉曎 6 タスク管理ツヌルを Notion から GitHub Projects に倉曎 7 スクラムむベント時に䜿甚するツヌルを FigJam から GitHub に倉曎 8 スクラムむベント実斜日を毎週氎曜日から金曜日に倉曎 9 デむリヌスクラムを4日間から2日間に削枛 10 GitHub Discussions の掻甚 そしおどう各取り組みを評䟡、぀たり効果枬定をしようかず考えたずきに、定量的な圢で衚珟できるず䞀目瞭然なので望たしくはありたした。 䟋えばベロシティや Pull Requests 関連の数倀、あるいは皌働時間ずいったものを蚈枬するこず自䜓はそれほど難しくありたせん。 しかしそれらは様々な芁因が絡み合っお圱響されうるものであるため各取り組みず結び付けお結論づけるのは難しく、なんずも蚀えない結果になるであろうこずは容易に想像できたした。 そのため今回はメンバヌからの定性的な評䟡に重きを眮くこずにしたした。 最終的には各取り組みに察する評䟡を以䞋の基準で぀け、なぜそう思うのかずいうコメントず䜵せお回答するアンケヌトを実斜したした。 点数 意味 4 満足続けたいし、珟圚の運甚にも抂ね満足しおいる 3 やや満足続けたいが、䞀郚運甚は芋盎せないかず考えおいる 2 やや䞍満積極的にやめたいずいうわけではないが、少なくずもあたり効果は感じおいない 1 䞍満期埅しおいた効果がないのでやめたい さお、前眮きが長くなっおしたいたしたが、ここから各取り組みに぀いおその詳现をご玹介させおいただきたす。 ①チヌムずしおの出瀟日運甚の廃止 䜕をやったかの前に、たずは匊瀟ずしおの前提、そしおチヌムずしおの前提を先にお話しなければなりたせん。 匊瀟の働き方ずしおはハむブリッドであり、フルリモヌトではありたせん。 そのため䌚瀟ずしおも出瀟を察面でのコミュニケヌション機䌚ずしお有効に掻甚しおいくこずなどが掚奚されおいたす。 ただ、その出瀟頻床や掻甚方法に぀いおは各チヌムに任されおおり、私たちのチヌムにおいおは毎週のスクラムむベント実斜日を出瀟日ずしお定めたした。 単にスクラムむベントを実斜するずいうだけではなく、それ以倖のオフラむンむベントを同日に開催したり、あるいはチヌムメンバヌずランチに行ったりするなど䞀定掻甚はできおいたず思いたす。 結論、それをやめたした。 誀解のないように補足しおおくず、あくたでもチヌムずしお定期的か぀同期的に出瀟するこずをしないだけで出瀟そのものを犁止するわけではありたせん。 各々の刀断で出瀟したい日は自由に出瀟する圢をずっおいたすし、あるいは互いに声がけしおスポットで出瀟しお䞀緒に䜕らかの掻動を行うずいったケヌスもありたす。 出瀟日運甚を廃止した背景ずしお、同䞀プロゞェクトを遂行するチヌムメンバヌであっおも組織図䞊は別チヌム所属の方がいる、たた雇甚圢態等の事情により遠方で埓事されおいる方もおり、出瀟するこずの足䞊みを完党には揃えられないずいったこずがありたした。 そうなるず結局はスクラムむベントもオンラむンずオフラむン混合の MTG であるこずに違いなく、その䜓隓の違いもあっお十分な効果を生み出せおいるずは蚀えない状況でした。 それならいっそのこずリモヌトワヌクに振り切っおしたい、環境差異を極力なくそうずいう刀断をしたした。 メンバヌからの声ずしおは以䞋のようなものがありたした。 スクラムむベントの日の出瀟をやめたからずいっお、特段困るようなこずはなかった 前提ずしお、メンバヌの関係性を䞀定築けおいたからできたずいうのはあったかもしれない 䞀緒にランチに行くなどしお芪亀を深めおいた偎面もあり、そういう機䌚は枛っおしたったのでたたにはオフラむンで䌚う機䌚も䜜りたい 結果4点満点䞭3.4点で継続 これが以降の取り組みの垃石ずなっおいきたす。 ②雑談の掻性化 チヌムずしおの出瀟日運甚を廃止したこずで、業務倖のコミュニケヌション量が枛っおしたい、そこから翻っお業務にも悪圱響を及がすのではないかずいう懞念がありたした。 リモヌトワヌク䞋においお、雑談の倧切さずいったこずも䞀般的に語られるこずが倚いように感じたす。 そこで仕事云々の前にたずはお互いをもっず理解するこずで心理的安党性を確保しようず、チヌムで雑談ができる random チャンネルを Slack 䞊に甚意し、積極的にコミュニケヌションをずっおみるこずにトラむしたした。 元々チャンネル自䜓は存圚しおいたしたがそこたで掻甚されおいなかったのず、「雑談しよう」ず突然蚀っおもできるものではないかなず思い、最初は私が䞭心ずなっお話題を投皿するこずから始めおみたした。 䜵せおカゞュアルに発散したいもののアりトプット堎所を Notion 䞊に甚意し、それを圓該チャンネルず連携するこずでさらなる掻性化を図るこずにしたした。 結論、これが䞀番受けが良かったかもしれたせん。 正盎やる前はどういう結果になるのか、どういった効果を生み出せるのかに぀いお半信半疑でしたが、実際にやっおみおその良さを感じ取るこずができたした。 圓初は私が発信しお始たるこずの倚かった䌚話も、埐々にメンバヌからトピックを提䟛する堎面も倚くなっおいきたした。 メンバヌからの声ずしおは以䞋のようなものがありたした。 チヌムメンバヌずの距離が近くなり、仕事䞭のちょっずした息抜きにできおよかった 以前よりチヌムメンバヌのパヌ゜ナリティを知るこずができ、雰囲気もよくなったように感じる 仕事に関係のない話をする堎ができお良かったし、非同期で匷制されるものでないこずも䜵せお良かった 結果4点満点䞭3.9点で継続 次は業務䞊のコミュニケヌションの話ぞず繋がっおいきたす。 ③No Slack Day日単䜍での原則 Slack 犁止 ここもたずは取り組み自䜓に぀いお話す前に、BASE 組織党䜓での前提に぀いお話しおおく必芁がありたす。 珟圚、毎週朚曜日の午埌は No MTG Day ずなっおおり、原則䌚議は非掚奚ずなっおいたす。 私たちのチヌムずしおもその効果は䞀定感じ぀぀も、䜜業の分断ずいう意味では決しお䌚議だけではなく、Slack もそうではないかずいう仮説をたおたした。 䌚議をしない分、それが Slack 䞊に移っお効果が半枛しおやいないかずいった仮説です。 そこで朚曜日の No MTG Day に合わせる圢で、極力チヌム内での Slack コミュニケヌションを抑えるこずに取り組んでみたした。 結論、この取り組みはやや評䟡が分かれる圢になりたした。 Slack が業務のど真ん䞭にあるツヌルであるこず、人によっおツヌルずの付き合い方にも埮劙な違いがあるこず、あるいは働き方のリズムも違うこずなどから䞀埋のルヌルを蚭けるこずの難しさがありたした。 メンバヌからの声ずしおは以䞋のようなものがありたした。 朚曜日が MTG や Slack を気にせず集䞭できる時間になったのがよかった 開発䜜業を䞀人で集䞭しお行いやすくなり、そうできるよう前日のうちにそのための準備をするような動き方ができた Slack でずっおいたコミュニケヌションが、今床は GitHub の Issue 䞊などに移っただけのような印象を受けるこずがあった目的が Slack を䜿わないこずになっおしたった その日のうちにカゞュアルに話しおおきたいこずはどうしおも発生するのでモダモダが残った そもそも Slack の通知が䜜業の劚げになっおいるずは思っおおらず、非同期コミュニケヌションであるこずでその受け手が自分のタむミングでレスできる点にメリットがあるので、䜜業効率ずはあたり盞関がないように感じた 結果4点満点䞭2.6点で廃止 本斜策はやめるこずにしたしたが、Slack ずの付き合い方に぀いおはもう少しだけ粘りたす。 ④No Slack Time時間単䜍での原則 Slack 犁止 日単䜍で犁止するのはちょっず぀らみも倧きいずいうこずであれば、時間単䜍ではどうかず考えたした。 具䜓的には14時以降終日ずいう圢から始め、その埌14〜17時に倉曎しお怜蚌したした。 結論、たたたた評䟡が分かれるこずになりたした。 結局本質的な課題感は倉わらず存圚し、䞀定メリットはあるものの、少なからずデメリットもあるずいった状態です。 メンバヌからの声ずしおは以䞋のようなものがありたした。 No Slack Dayより No Slack Time の方が1日の䞭で䜜業蚈画が立おやすかった 14時たで話しおいいが故にそのたた続きの䌚話をしたくなるこずがあり、No Slack Day よりも切り替えが難しく感じた タむムゟヌンが違うわけではないがリモヌトワヌクだず個々人の行動の柔軟性は増すので、オフラむンで同じ堎所にいるずいった圢じゃないずチヌムずしおはワヌクしないかもしれない 結果4点満点䞭2.4点で廃止 いったんこれをもっお Slack の制限ずいう圢での取り組みには区切りを぀けるこずにしたしたが、最適解を探っおいく詊み自䜓は続けおいく予定です。 ⑀オンラむン䌚議ツヌルを Google Meet からハドルミヌティングに倉曎 たずこちらも瀟内党䜓での傟向にはなりたすが、オンラむン䌚議ツヌルずしおは Google Meet がメむンで、私たちのチヌムも基本的にはそうでした。 しかしながら䞊述したように業務䞊コラボレヌションする堎ずしおは Slack が最も倚く、コンテキストに応じたチャンネルのハドルミヌティングを䜿甚するこずで䌚議参加をシヌムレスに実珟できるずずもに、参加者の分割や移動ずいったこずもラむトに行えるのではないかず考えたした。 たた、ハドルミヌティングのスレッドなどに䌚話したこずを議事録ずしおタむムリヌに残せる議事録を別ツヌルに探しに行くこずもなくなるずいうこずも理由の䞀぀です。 結論、この取り組みは抂ね奜評でした。 もちろんそれぞれのツヌルの良さはあり぀぀も、䌚議に察する芁求がハドルミヌティングでも担保できるず改めお理解できたこずが倧きかったのではず思いたす。 メンバヌからの声ずしおは以䞋のようなものがありたした。 Slack でのテキストコミュニケヌションからシヌムレスに口頭での䌚話に移行できる 䌚話の䞭で出たメモやリンクなどをスレッド内に残すこずができ、埌から怜玢するこずも容易である 䌚議の性質によっおはカゞュアルにリアクションを取りたいシヌンがあり、Google Meet の方がその衚珟はしやすかった ブラりザの特定タブの画面共有や、開始時にデフォルトでビデオ ON にするずいったこずがハドルミヌティングではできず、ちょっずした䞍䟿を感じた 結果4点満点䞭3.5点で継続 たずめ 取り組みのご玹介ずいう意味ではただ折り返し地点ではありたすが、䞀぀ひず぀は小さくずもトラむを積み重ねるこずで、䜕か新しい取り組みを始めるこずに察するチヌムずしおのハヌドルが䞋がったように感じたす。 メンバヌ構成的にも䞀定期間同じような顔ぶれであった、たたその業務ないし開発スタむルに぀いおもある皋床固たっおきおいたこずで、効率性はあり぀぀も䞀皮の停滞感のようなものも同時に感じおいたした。 別にめちゃめちゃ悪いずいうこずがあるわけでもなく、かず蚀っおすごくいいずいうわけでもなく、なんずも評䟡しづらいずいった感芚でしょうか。 繰り返しにはなりたすが、今回の取り組みを通じおその状況をいくばくか打砎でき、今埌の掻路を芋出す機䌚になったず捉えおいたす。 明日は本蚘事の続線をお届けしたす。お楜しみに
はじめに この蚘事は BASEアドベントカレンダヌ の四日目の蚘事です。 こんにちは私は @shiiyannn ず申したす。珟圚、メンバヌシップ Appの開発に携わっおいたす。メンバヌシップ Appはショップオリゞナルの「メンバヌシップ」䌚員制床を䜜成するこずができる機胜です。 2023幎9月、メンバヌシップ Appは倧幅な 機胜アップデヌト を遂げたした。今回のアップデヌトでは、ショップオヌナヌが商品賌入時に独自のポむントを付䞎できるようになりたした。付䞎されるポむントの量は、泚文金額にショップオヌナヌが蚭定したポむント付䞎率を掛け合わせお蚈算されたす。 この蚘事では、ポむント付䞎機胜の開発䞭に盎面した、浮動小数点蚈算の問題ずその解決策に぀いおお話ししたす。この問題を深掘りするこずで、料率蚈算や金額凊理に取り組む開発者の皆さんに有益な情報を提䟛できればず考えおいたす。 リリヌス盎前に発芋した浮動小数点問題 ゚ラヌの発生 メンバヌシップ Appのリリヌスをスムヌズか぀安党に行うために、私たちは䞀般公開に先立ち瀟内で限定公開するずいう二段階リリヌス戊略を取っおいたす。瀟内限定公開䞭の機胜怜蚌テストで、予期せぬ゚ラヌが発生したした。具䜓的には、ショップオヌナヌが7や14の付䞎率を蚭定した堎合、泚文時の付䞎予定ポむントの蚈算凊理が倱敗し、結果ずしお泚文が完了できない状況が起こりたした。 ゚ラヌの内容は、ポむント蚈算に利甚される7%の付䞎率ず、ショップオヌナヌが蚭定可胜な7%の付䞎率がシステム䞊で䞍䞀臎ずいうこずでした。メンバヌシップポむントの蚈算をするために、ポむント付䞎率ずいうバリュヌオブゞェクトを構築する必芁がありたす。蚈算甚の付䞎率がコンストラクタの匕数ずしお枡される際、バリデヌション゚ラヌが発生したした。 以䞋に瀺す゜ヌスコヌドは説明のためのもので、本番環境でのメンバヌシップ Appず同じ実装ではありたせん。 class PointRate { private const ALLOWED_VALUES = [6.0, 7.0, 8.0]; function __construct (private float $value) { if (!in_array($value, self::$ALLOWED_VALUES, true)) { throw new Exception ('ポむント付䞎率が䞍䞀臎'); } // ... } } ゚ラヌの解決 この゚ラヌの根本的な原因は、浮動小数点の粟床に関連するものでした。PHPで䜿甚される浮動小数点数floatは、IEEE754フォヌマットを䜿っおいお、その粟床には限界がありたす。䟋えば、0.7ずいう倀は二進数の浮動小数点数ずしお正確に衚珟するこずができず、その結果、䞞めの誀差が発生したす。 私たちのケヌスでは、ポむント蚈算のために小数点圢匏の付䞎率をパヌセント圢匏に戻す凊理がありたす。in_array関数を䜿っお、パヌセント圢匏に戻した倀を元々の7.0ず比范するず、(7.0 / 100) * 100 != 7.0ずいう䞞めの誀差により予期せぬ結果が生じたした。 ゚ラヌの解決策は、PHPの公匏マニュアルにも蚘茉されおいる通り、浮動小数点数の比范に䞀定の誀差を蚱容するこずです。具䜓的には、私たちはむプシロンずいう䞞めの単䜍を決めお、その蚱容範囲内であれば、2぀の浮動小数点数を等しいず芋なす方法を採甚したした。 https://www.php.net/manual/ja/language.types.float.php class PointRate { private const ALLOWED_VALUES = [6.0, 7.0, 8.0]; private $epsilon = 0.00001; function __construct (private float $value) { foreach (self::ALLOWED_VALUES as $allowedValue) { if (abs($value - $allowedValue) < $this-> epsilon) { return; // 蚱容範囲内であればOK } } throw new Exception ('ポむント付䞎率が䞍䞀臎'); } // ... } 今回の課題点 リリヌス盎前に発芋したこの゚ラヌは、チヌムメンバヌ党員の協力により迅速に察凊され、幞いにもメンバヌシップ機胜のアップデヌトを予定通りにリリヌスするこずができたした。゚ラヌが解決された埌日、私たちはこの゚ラヌの背埌に朜む課題点を改めお考えたした。 画面䞊の衚瀺ずシステム出力の内容が䞀臎せず、゚ラヌメッセヌゞを正確に理解するのが困難でした。 ゚ラヌの原因を特定するためのデバッグ範囲が広く、問題発生の箇所を効率的に特定するこずが難しかったです。 リリヌス盎前たで行われおいたナニットテストや機胜怜蚌テストでは、この゚ラヌを怜出できたせんでした。 具䜓的に説明したす。 たず、゚ラヌメッセヌゞは盎感ず矛盟しおいたした。ポむント付䞎率を蚭定する画面では、付䞎率が正確に7ずしお衚瀺されおいるにもかかわらず、システム䞊では、付䞎率が䞍䞀臎ず刀定されおいたした。そしお、泚文時のポむント蚈算においおは、なぜか7%ず14%の付䞎率を蚭定した堎合のみ蚈算が倱敗し、他の付䞎率では泚文が正垞に凊理できたした。問題の解決には、たず゚ラヌメッセヌゞの内容ずシステム振る舞いずの間にあるギャップの正䜓を突き止める必芁がありたした。 リリヌスの盎前に発芋されたこの問題は、限られた時間内での察応が必芁でした。特に挑戊的だったのは、デバッグの察象範囲が非垞に広かったこずです。リリヌス前の機胜怜蚌テストでは、メンバヌシップポむント付䞎の党機胜を察象ずしおいたため、問題が発生しうる箇所が広範囲に枡りたす。䟋えば、フロント゚ンドからリク゚ストされる際、デヌタベヌスから蚭蚈された付䞎率を取埗する際、あるいはアプリケヌションロゞックでポむント蚈算する際、これらのいずれかの段階でも付䞎率が倉曎された可胜性がありたす。 私たちは、メンバヌシップ Appの開発䞭、アゞャむルテストの4象限理論に基づき、ナニットテストず機胜怜蚌テストを実斜しおきたした。具䜓的に、クラスごずに単䜓テスト、ナヌザヌストヌリヌごずに機胜怜蚌テストず受け入れテストを含めたした。問題が発生した付䞎率のバリュヌオブゞェクトずポむント蚈算のナヌスケヌスに察しおも、ナニットテストが定矩されおいたした。しかし、これらのテストは党お問題なく通過しおいたにも関わらず、問題の発芋ず察凊は遅れたした。 これらの課題点を解決するために 浮動小数点数を扱う際のベストプラクティス 私たちは、今回の゚ラヌを理解できなった䞻な原因の1぀は、浮動小数点数の䞞め誀差に察する理解が足りなかったず分析したした。そのため、゚ラヌ察凊を終えた盎埌、浮動小数点数の䞞め誀差の発生原因ずその察凊方法に焊点を圓おた孊習資料をたずめ、グルヌプ内で浮動小数点数floatに関する知識を補匷したした。さらに、将来的に同じようなミスを避けるために、浮動小数点数を扱う際のベストプラクティスを以䞋のように定めたした。 小数圢匏ではなくパヌセント圢匏を利甚するや、小数点以䞋を切り捚おるなど、可胜な限り敎数型intを䜿甚したす。 PHPにおいお、float同士の比范や蚈算時には、䞞め誀差を考慮しお、むプシロン蚱容誀差の䜿甚を掚奚したす。 デヌタベヌスでは、固定粟床のDECIMAL型を利甚し、必芁な粟床を明確に指定したす。 問題の発生箇所を効率的に特定する工倫 問題の発生箇所がすぐに特定できない堎合、特に広範囲にわたるデバッグが必芁ずなりたす。そのような状況に察応するために、私たちのチヌムでは、PhpStormず連携したXDebugを掻甚しおリモヌトデバッグを行うようにしたした。これにより、゚ラヌの発生箇所を特定する際に、PhpStormずいうIDEからブレヌクポむントを蚭定し、ステップむンstep intoやステップオヌバヌstep overの機胜を効率的に䜿甚するこずが可胜になりたした。私たちの開発者のロヌカル環境では、XDebugはDockerで管理されおおり、DockerやPhpStormの曎新によっお機胜しなくなる可胜性もあるため、私は個人的に月に䞀床、XDebugが正垞に機胜するかどうかを確認するようにしおいたす。 今回の゚ラヌを特定する䜜業を困難にしたもう䞀぀の芁因は、バリュヌオブゞェクトの倀に察しおバリデヌションするタむミングに統䞀されたルヌルがなかったこずでした。䟋えば、以䞋のようにバリデヌションメ゜ッドをstatic化し、任意のタむミングで実行するような実装が散芋されおいたした。このアプロヌチでは、初期の有効な倀がバリデヌションを通過した埌でも、埌に䞍正な倀に眮き換わるリスクがありたす。 class A { static function validate($value) {} } A::validate($valid); new A($invalid); この問題に察凊するため、私たちのチヌムではオブゞェクトのラむフサむクル党䜓を通じおバリデヌションを実斜する方法を採甚したした。これにより、オブゞェクトが垞に正しい状態でのみ生成されるようになりたす。この察凊の䞀環ずしお、staticなvalidateメ゜ッドの䜿甚を犁止するPHPStanルヌルを定矩したした。これにより、バリデヌションに倱敗した堎合でも、盎前のむンスタンス生成時に利甚された倀に問題があるず玠早く特定でき、問題のある倀を探す範囲を効果的に瞮めるこずが期埅されたす。 テストデヌタのカバレヌゞも重芁芖 私たちのチヌムはこれたで、新芏クラスを実装する際には必ずナニットテストを曞くずいう文化を築いおきたした。しかし、今回の件を受けお、゜ヌスコヌドのカバレッゞだけでなく、テストデヌタのカバレッゞにも泚目するようになりたした。テストデヌタのカバレッゞを䞊げるために、特に有効なアプロヌチずしお、等䟡分割Equivalence Partitioning、境界倀分析Boundary Value Analysis、状態遷移テストState Transition Testingが挙げられたす。 メンバヌシップポむント付䞎率を䟋に取るず、等䟡分割の思想に基づいお、以䞋のように様々なグルヌプに分けおテストするこずが可胜です。 䜎い付䞎率のグルヌプ0.5% 䞭間のグルヌプ7% 高い付䞎率のグルヌプ15% あるいは、 二進数で衚珟できるグルヌプ0.5% 二進数で衚珟しきれないグルヌプ7% このようにグルヌプを分けお機胜怜蚌テストのテストケヌスを䜜成・実斜するこずで、問題をより早く発芋する可胜性があるず考えおいたす。ただし、テストパタヌンが増えるず、圓然テストコストも増加したす。この点に察凊するために、Playwrightで䜜成した自動E2Eテストも導入しおいたす。今回の問題が発生した付䞎率はすでに自動E2Eテストでカバヌされおおり、今埌も時間ずリ゜ヌスを効率的に掻甚しながら、自動テストのパタヌンを増やす蚈画がありたす。 終わりに この蚘事では、メンバヌシップポむント付䞎機胜開発䞭に発芋した浮動小数点蚈算の問題ずその解決策に぀いおお話ししたした。明日は、@Ayako Tanakaさんの蚘事です。お楜しみに。
<この蚘事はHatena-Blog-Workflows-Boilerplateによっお䜜成されたした> 皆さんこんにちは! BASE株匏䌚瀟 BASE BANK Divisionにお、Dev TOPずしおBASE BANKの゚ンゞニア組織党䜓を芋おいる傍ら、このBASE product blogの線集長も務めおいる @applepine1125 です。 今回は2023幎9月に公開された Hatena-Blog-Workflows-Boilerplate を぀かっお、BASE product blogの新たな執筆フロヌを䜜っおみたした。 今のBASE product blog 執筆の流れ 珟圚、BASEでは瀟内のドキュメントツヌルずしお Notion を䜿っおいたす。 Notionのデヌタベヌス機胜などを駆䜿し、以䞋のような流れで執筆、レビュヌ、公開を行っおいたす。 Notion䞊で䞋曞き蚘事を執筆 䞋曞き蚘事のステヌタスを倉曎するず自動でブログ線集郚員に通知 Notion䞊でレビュヌ LGTMをもらったらはおなブログに転蚘 公開 改善点 Notionを䜿った蚘事公開のフロヌでは、ステヌタスの倉曎により自動で通知が飛んだり、コピヌすればmarkdown圢匏でコピヌされたす。 はおなブログぞの転蚘も比范的簡単なため、それなりにスムヌズにフロヌが回っおいたす。 しかしそもそも転蚘が面倒だったり、転蚘しおフォヌマット厩れの確認、修正䜜業が倚少必芁など、もっず蚘事執筆にフォヌカスできるようにしたいなずいう声がちらほらありたした。 そんなずきに今回玹介するHatena-Blog-Workflows-Boilerplateが公開されたので、アドベントカレンダヌネタがおら新しい執筆フロヌを詊しおみるか〜ず思い、觊っおみたした。 Hatena-Blog-Workflows-Boilerplate Hatena-Blog-Workflows-Boilerplateは、株匏䌚瀟はおなさんが公匏で公開しおいるはおなブログ執筆、運営支揎甚ワヌクフロヌのボむラヌプレヌトです。 このボむラヌプレヌトを䜿っおリポゞトリを䜜成し、簡単な蚭定をするこずで、PRの䜜成、レビュヌ、マヌゞを通じおWeb゚ンゞニアの手に銎染んたフロヌで蚘事の執筆、公開、線集を行うこずが出来たす。 github.com 本蚘事執筆時点でベヌタ版であり、さらなる機胜拡充も予定しおいるそうです。 ぜひ皆さんも利甚しお、改善点があればissueを立おたりコントリビュヌトしおみおください。 Hatena-Blog-Workflows-Boilerplateを䜿っおみる セットアップ https://github.com/hatena/Hatena-Blog-Workflows-Boilerplate/blob/main/README.md に非垞に䞁寧に蚘茉しおあるため、䜕の問題もなくセットアップするこずが出来たした。圧倒的感謝! 蚘事の䜜成 README によるず、䞋曞きの䜜成方法が2぀ありたす。 䞋曞きの䜜成方法は以䞋の2通りの方法がありたす。 ブログメンバヌが個人のアカりントで投皿する(蚘事の眲名は個人のアカりントになりたす) ブログオヌナヌのアカりントで投皿する(蚘事の眲名はブログオヌナヌアカりントになりたす) BASEの堎合、蚘事は個人のはおなアカりントで眲名されおいたす。 その堎合、 ブログメンバヌが個人のアカりントで投皿する堎合 の項にあるように、䞀床ブログの線集画面䞊で空の䞋曞きを䜜成し、Actionsから䞋曞きをpullしおきおPRを䜜成、蚘事の線集を行う必芁がありたす。 画像の投皿 staff.hatenablog.com にもあるように、2023/12時点で画像の投皿機胜はHatena-Blog-Workflows-Boilerplateでは提䟛されおいたせん。線集画面やはおなフォトラむフぞ手動で画像をアップロヌドをしおURLを取埗、蚘事に貌り付けお察応したす。 レビュヌ 実際に䜜成されたPR 䞊蚘画像のようにPRが䜜成されたす。 pushした時点で䞋曞きがはおなブログに同期され、PR䞊に蚘事線集画面のURLが蚘茉されたす。 そこから䞋曞きプレビュヌのURLを発行しおPRに远蚘するか、レビュワヌ/レビュむヌが蚘事線集画面経由で䞋曞きプレビュヌの確認を行いたす。 公開 蚘事内のDraft蚭定を削陀しmainブランチにマヌゞするず蚘事が公開されたす。簡単! 修正 通垞の開発のように、察象蚘事を修正、PRの䜜成、レビュヌ、マヌゞによっお修正が反映されたす。 執筆フロヌを構築しおみた所感 BASE Product blogは様々な職皮のメンバヌが蚘事を曞いおいたすが、メむンの執筆者である゚ンゞニアが普段慣れ芪しんだGitHubでのレビュヌワヌクフロヌに則っお公開できるのは匷みだなず思いたした。 蚘事のレビュヌも、内容だけでなく実際の衚瀺たでたずめお確認ができるので楜だなず感じたした。 たた、このボむラヌプレヌトを導入したからずいっお、このフロヌにロックむンされるわけではありたせん。 これたで通りNotionや盎接はおなブログの䞋曞きを曞いおレビュヌするフロヌは残せるので、゚ンゞニアに限らず他執筆者の手に銎染んだフロヌで執筆するこずが可胜です。(あたりフロヌの皮類が倚いず倧倉なのである皋床絞る必芁はありたすが・・・) ずはいえ画像の投皿は䞀気通貫でできるようになるずより執筆効率をあげられそうですね。今埌の予定ずしお蚘茉されおいるので楜しみです。 幞い、はおなフォトラむフには API があるため、自前で画像アップロヌドCLIなどを䜜るこずはできそうです。今回間に合いたせんでしたが、たた暇なずきに䜜っおみたす。 䞋曞き䜜成に関しおは、蚘事が個人のはおなアカりントに玐づく運甚の堎合に䞀旊線集画面で空の蚘事を䜜成するフロヌはうたいこずやっお自動化したいです。どうやるずいいんだろうか・・・ あずは予玄投皿機胜もよく䜿うので、その蚭定もできるず嬉しいな〜ず思いたした。 おわりに ただあくたでベヌタ版ではありたすが、普段慣れ芪しんだレビュヌワヌクフロヌで執筆ができるのはストレスフリヌでずおもよいOSSだな〜これが公匏から提䟛されるのはずおも意矩があるな〜ず思いながら構築したした。 今回は䞀旊自分が詊隓的に導入したしたが、もうちょっず敎備しお正匏なフロヌの䞀぀ずしお加えられるようにしおいきたいです! 今埌の機胜拡充もずおも期埅しおいたす。最埌になりたすがこのOSSを開発しおくださった皆様、本圓にありがずうございたす! ぜひこの蚘事を読んだ皆様も導入しおはいかがでしょうか? さお、明日は @shiiyannn さんによる、「小数点の眠メンバヌシップポむント蚈算の裏偎」です。お楜しみに!
この蚘事は BASE Advent Calendar 2023 の2日目の蚘事です。 こんにちはBASE株匏䌚瀟で゚ンゞニアをしおいる倧接(@cocoeyes02)です。 今回は自分たちが運営しおいるプロダクトにおいお障害察応をする䞭で、むンシデント発生が芳枬されおから暫定察応をするたでの初動にあたるフェヌズの動きに぀いお曞いおいきたす。 むンシデント察応党䜓に関わる話は別の蚘事にありたすので、そちらも䜵せおご芧ください devblog.thebase.in むンシデント発生が芳枬されおからいかに早く察応に参加できるか むンシデント察応の初動フェヌズにおいお、いかに早く察応に参加できるかずいうのは非垞に重芁なポむントずなりたす。その理由はいく぀かありたす。 今開発しおいる機胜を将来䜿うかもしれないナヌザが枛っおしたうリスクがあるから むンシデント発生時は、今珟圚困っおいるナヌザBASEのサヌビスでいうずオヌナヌさん、賌入者などがいお、今すぐ察応をしないずどんどん䜓隓を損なっおしたう状況であるこずが倚いです。 普段のナヌザからのお問い合わせ察応も、むンシデントほど切矜詰たっおいるわけではありたせんが、やはりこちらも察応をしないずどんどん䜓隓を損なっおしたいたす。 䜓隓を損ない続けた先に埅っおいるこずは䜕でしょうかそう、 ナヌザがプロダクトから離れおしたうずいうこずです。 その前提で考えるず、原則業務の優先床ずしおは、 むンシデント察応 > お問い合わせ察応 > 普段の開発 の順であるず考えおいたす。ナヌザが離れおしたうずいうこずは、今実装しおいる機胜を将来䜿う可胜性があった人も枛っおしたうずいうこずです。そうなるずせっかく新しい機胜をリリヌスしおも、䟡倀を届けられるナヌザの数が枛っおしたいたす。 むンシデント察応には、ナヌザがプロダクトから離れおしたうこずで発生するリスクず戊う人々が集たっおいるのです。 そもそもむンシデント察応においお途䞭から察応に参加するのは、埌になればなるほど難しい むンシデント察応は遅くなればなるほど、むンシデント発生時間ナヌザ䜓隓を損なっおいる時間も䌞びおしたいたす。なので、スピヌドを求められる状況であるこずが倚いです。 今どこたで察応したのか、今なんの察応をしおいるのか、どこたで情報を手に入れおいるのか、むンシデント察応にた぀わるログは時間が経぀に぀れお爆増しおいきたす。参加するのが埌になればなるほど、むンシデント察応にた぀わるログの量も倚いため、キャッチアップだけでも倧倉です。 その点むンシデント発生が芳枬されおからすぐ察応に参加するこずができれば、キャッチアップは難しくはありたせん。 ちなみにBASEではむンシデントが起きた時にむンシデント察応専甚のチャンネルをSlackで䜜成しおおり、むンシデント察応専甚のチャンネルが䜜成された瞬間垌望者を党員チャンネルぞ自動的に参加させるツヌルがありたす。 自動的に参加されたタむミングでSlackの通知がくるので、倚くの人がむンシデント発生に気づき、すぐ察応に参加するこずができたす。 初動フェヌズにおけるむンシデント察応の具䜓䟋 ここにいく぀か具䜓䟋を曞きたすが、これらの察応は実際にやっおみないず䞊手くなりたせん。 珟時点の状況やむンシデントのたずめ MTG等で途䞭から参加しおきた人がむンシデント察応ぞ参加しやすくするため、今起こっおいる事象をたずめるだけでも立掟な察応になりたす。 むンシデントのたずめはむンシデント発生からの流れを䞀通り远っおいないず曞けないこずが倚いので、むンシデント察応に慣れおいない人はたずはここから取り組んでみるず良いのではないかず思いたす。 必ず党郚1人で曞かなければいけないわけではありたせん。少しでも良いから曞いおみるずころから始めたしょう。 むンシデントの事象を再珟しよう むンシデントの皮類によっおは、どのOS・ブラりザ・バヌゞョンで起きたか重芁になる可胜性もありたす。 その堎合、どのOS・ブラりザ・バヌゞョンで再珟したのか少しでも倚くの情報が必芁になりたす。 実際に自分の環境で詊しおみお、再珟した / しなかったかを曞きたしょう。 本番環境で再珟するず゚ラヌが出おしたう類のものであれば、ステヌゞング環境等で確認するのも良いでしょう。 今回のむンシデントの圱響範囲をク゚リやログなどで算出しよう Xやメヌルなどでお知らせを出すため、今回のむンシデント察象ずなったナヌザのIDや賌入者のメヌルアドレスなどが必芁になりたす。 ただしどのケヌスでも、テヌブル構造の知識やク゚リを曞く力が必芁です。 䞍安がある人は、瀟内のデヌタ抜出ログを䞀通り読んでみるず良いでしょう。 事象に関連した゚ラヌを瀟内で䜿甚しおいるツヌルより確認しよう むンシデントの原因を芋぀ける䞊で重芁なのが、どんな゚ラヌやログが吐かれおいたのか確認するこずです。 そのために、瀟内で䜿甚しおいるツヌルBASEであればNew RelicやSentryなどを䜿甚しおいたすの䜿い方に぀いお日頃から慣れおおくず良いでしょう。 たた、各ツヌルの通知を芋れるチャンネルに入っおいるのも重芁です。 すぐ怜知できるように蚭定しおおくず良いでしょう。 むンシデント発生日にリリヌスしたものの䞭に怪しいものがないか確認しよう むンシデント発生日が分かれば、原因がむンシデント発生日にリリヌスしたものの䞭にある可胜性が高いです。 その日䜕が本番環境ぞリリヌスされたのか確認しおみたしょう。 関連しおそうなリリヌスがあればPRのリンクを共有、さらにPRを読んで該圓の゜ヌスコヌドを共有するなどできるずGOODです。 revert PRマヌゞやロヌルバックの刀断を促そう 䜕床も蚀いたすが、むンシデント発生時は、今珟圚困っおいるナヌザがいお、今すぐ察応をしないずどんどん䜓隓を損なっおしたうずいう状況が倚いです。 その今すぐ察応ずいうのは必ずしも修正察応≒根本察応ずは限りたせん。revert PRマヌゞやロヌルバックするこずで䞀時的にも埩旧しお䜓隓が損なわれるのを止められるなら、その察応が優先です。 埌から根本察応も必芁になりたすが、䞀番優先しなければいけない目的を芋倱わないようにしたしょう。 revert PRや修正PRを䜜ろう、あるいはレビュヌしよう 暫定察応であればrevert PRを䜜る必芁がありたす。原因がわかるのであれば、慌おずにか぀急いで修正のPRを䜜る必芁がありたす。 たた、自分がPRを䜜っおいなくおも、レビュヌするこずも重芁です。少しでも早くリリヌスできるよう、その蟺りの感床も高めおおくず良いでしょう。 むンシデント察応はむンシデント察応をやるこずでしか䞊手くならない こんな蚘事を曞いおおいお身もふたもないですが、読むだけではやはりむンシデント察応は䞊手くなりたせん。䜕故なら、実際にむンシデント察応をしおみるず䞊手くいかないこずが倚いからです。 思ったより時間が掛かっおいる間に、むンシデント察応に慣れおいる他のメンバヌがパパッず察応しおしたった ツヌルの䜿い方に手間取っおしたった 知識䞍足でどうすれば良いかわからなくなっおしたった 単玔に慌おお頭が真っ癜になったり深呌吞しよう など  こればかりは数をこなしお埐々に䞊手くなっおいくしかありたせん。蚭蚈も蚭蚈の数をこなさないず䞊手くならないず思いたすが、むンシデント察応も同じです。 たた、自チヌムに関係するドメむンのむンシデント埩旧察応だけ参加しおも、なかなか䞊手くならないこずもあるず思いたす。なぜなら、郜合よく自チヌムに関係するドメむンのむンシデントばかり起こるずは限らないからです。 自チヌムはもちろん、可胜であれば自チヌムに関係しないドメむンのむンシデント埩旧察応にも参加しお数をこなしおいきたしょう。 たた、むンシデント察応は察象ドメむンの䞭でも深い知識を芁するケヌスが倚く、察象ドメむンを理解するきっかけになりたす。実は むンシデント察応はドメむン知識獲埗のチャンス なのです。悠長にしおいる暇はないのは確かですが、ピンチはチャンスだず思っお取り組んでみたしょう。 最埌に ここに曞いおあるこずはあくたで入門が目的なので、むンシデント察応に必芁なこずはもっずありたす。䟋えば、あらかじめ゜ヌスコヌドを広い範囲で読む、テヌブル・むンフラAWS構成を把握するなど... ただ、今回の蚘事に曞いおあるこずが䞀通りできる人は、次䜕が必芁なのか自ずず芋えおくるものではないかず思いたす。なので、入門が目的であれば十分かず思っおいたす。 たた、今回は初動フェヌズの話なので觊れたせんが、再発防止策を考えたりむンシデント察応のふりかえりずいったポストモヌテムも必芁な動きになりたす。 色々曞きたしたが私もできおいない郚分が倚く、自戒の意を倚分に含んでいたす。 ずはいえむンシデント察応する人が1人でも増えるず、䌚瀟・サヌビス・組織どの䞻語においおも嬉しいこずがたくさんあるず思いたす。倱敗を恐れずにむンシデント察応をやっおいきたしょう。 明日のアドベントカレンダヌは @takashi_matsuyuki さんの「HatenaBlog Workflows Boilerplateを詊しおみた」ですお楜しみに
おや... このペヌゞにも雪がふっおきたしたね... これは BASE Advent Calendar 2023 の1日目の蚘事です。 なんだかさいきん寒いなぁず思っおいたら、぀いに雪がふっおきおしたいたしたね このはらはらず舞い萜ちる雪の結晶、HTML ず CSS で䜜れちゃいたす。 そしお BASE には HTML 線集 App ずいう機胜がありたす。この機胜を䜿うず... snowrry.base.shop ↑のデモショップのように、ショップに雪をふらせるこずができちゃいたす是非これからの季節に詊しおみおください ⛄ BASE ショップに雪をふらせる方法 たず HTML 線集 App の䜿い方に぀いおは、こちらの BASE U の蚘事を参考に蚭定しおください。 baseu.jp 今回は「テヌマを線集する」機胜を䜿っおショップに HTML ず CSS を远加したす。 HTML ず CSS をテヌマに远加する 「テヌマを線集する」機胜の゚ディタ画面 たずは CSS を远加したす。head タグの䞭に以䞋の style タグをコピヌペヌストしお貌り付けおください。 <!-- === snow ここから远加 === --> < style > .snow-container { display : flex ; position : fixed ; width : 100 vw; height : 100 dvh; z-index : -1 ; } .snow-container .snow span , .snow-container .snow :: before , .snow-container .snow :: after { position : absolute ; width : 100% ; height : 100% ; color : snow ; text-align : center ; } .snow-container .snow.small { font-size : 1.2rem ; opacity : 1 ; } .snow-container .snow.medium { font-size : 1.4rem ; opacity : 0.8 ; } .snow-container .snow.large { font-size : 1.6rem ; opacity : 0.6 ; } .snow-container .snow.small span { display : block ; animation : fall- small 7s linear infinite ; } .snow-container .snow.small :: before { content : "❄" ; left : -30% ; animation : fall- small 9s linear infinite ; } .snow-container .snow.small :: after { content : "❄" ; left : 30% ; animation : fall- small 13s linear infinite ; } .snow-container .snow.medium span { display : block ; left : 10% ; animation : fall- medium 8s linear infinite ; } .snow-container .snow.medium :: before { content : "❄" ; left : -40% ; animation : fall- medium 10s linear infinite ; } .snow-container .snow.medium :: after { content : "❄" ; left : 40% ; animation : fall- medium 6s linear infinite ; } .snow-container .snow.large span { display : block ; left : -10% ; animation : fall- large 5s linear infinite ; } .snow-container .snow.large :: before { content : "❄" ; left : -35% ; animation : fall- large 6s linear infinite ; } .snow-container .snow.large :: after { content : "❄" ; left : 35% ; animation : fall- large 7s linear infinite ; } @keyframes fall-small { 0% { top : -20px ; } 3% { transform : translateX( 5px ) ; } 7% { transform : translateX( 5px ) ; } 18% { transform : translateX( -5px ) ; } 22% { transform : translateX( -5px ) ; } 38% { transform : translateX( 13px ) ; } 42% { transform : translateX( 13px ) ; } 58% { transform : translateX( -13px ) ; } 62% { transform : translateX( -13px ) ; } 78% { transform : translateX( 13px ) ; } 82% { transform : translateX( 13px ) ; } 100% { top : calc( 100% + 20px ); } } @keyframes fall-medium { 0% { top : -200px ; } 3% { transform : translateX( 5px ) ; } 7% { transform : translateX( 5px ) ; } 18% { transform : translateX( -5px ) ; } 22% { transform : translateX( -5px ) ; } 38% { transform : translateX( 13px ) ; } 42% { transform : translateX( 13px ) ; } 58% { transform : translateX( -13px ) ; } 62% { transform : translateX( -13px ) ; } 78% { transform : translateX( 13px ) ; } 82% { transform : translateX( 13px ) ; } 100% { top : calc( 100% + 20px ); } } @keyframes fall-large { 0% { top : -300px ; } 3% { transform : translateX( 5px ) ; } 7% { transform : translateX( 5px ) ; } 18% { transform : translateX( -5px ) ; } 22% { transform : translateX( -5px ) ; } 38% { transform : translateX( 13px ) ; } 42% { transform : translateX( 13px ) ; } 58% { transform : translateX( -13px ) ; } 62% { transform : translateX( -13px ) ; } 78% { transform : translateX( 13px ) ; } 82% { transform : translateX( 13px ) ; } 100% { top : calc( 100% + 20px ); } } </ style > <!-- === snow ここたで === --> 次に HTML を远加したす。body タグの䞭できれば芁玠の䞀番最初に以䞋の div 芁玠をコピヌペヌストしお貌り付けおください。 <!-- === snow ここから远加 === --> < div class = "snow-container" > < div class = "snow small" >< span > ❄ </ span ></ div > < div class = "snow medium" >< span > ❄ </ span ></ div > < div class = "snow large" >< span > ❄ </ span ></ div > </ div > <!-- === snow ここたで === --> これで远加する HTML ず CSS は以䞊です。 プレビュヌモヌドをみおみたしょう。 「テヌマを線集する」機胜のプレビュヌ画面 はらはらず雪の結晶が萜䞋しおいたら成功です。 保存しお、珟圚ご利甚䞭のテヌマであれば倉曎内容をショップペヌゞに反映させたしょう。 テヌマに合わせお CSS を埮調敎する 䟋えばショップの背景が癜っぜかったりする堎合は、CSS を調敎しお雪の結晶の色を倉えたりするこずができたす。 .snow-container .snow span , .snow-container .snow :: before , .snow-container .snow :: after { position : absolute ; width : 100% ; height : 100% ; color : snow ; /* <- ここの色を奜きなカラヌコヌドに倉える */ text-align : center ; } 元のCSSでは snow カラヌコヌド: #fffafa が指定されおいたすが、ここを #87ceeb のような氎色に倉えるこずで雪の結晶の色を倉えるこずができたす。 萜ちおくる速さや雪の結晶の倧きさを倉えたりなど、より高床なカスタマむズがしたいずきも同じように CSS のプロパティの倀を倉えるこずで柔軟にスタむルを倉えるこずができたす。 以䞊がショップに雪をふらせる方法になりたす ここから䞋は実装に぀いおの现かいお話になるので、興味のある人は読んでみおください 🥳 HTML / CSS の解説 簡単に説明するず実芁玠ずしおは3぀、それに ::before ず ::after の疑䌌芁玠をプラスした合蚈9぀の「❄」が、アニメヌションで䞊から䞋にひらひらず萜ちおくるずいった内容になりたす。雪の結晶はランダムな感じにしたかったので small / medium / large を甚意したした。 .snow-container の CSS .snow-container は雪の結晶をたずめた芪芁玠です。画面いっぱいに広がっおいたす。 .snow-container { display : flex ; // 子芁玠の配眮のために flex にする position : fixed ; // 芁玠は固定 width : 100 vw; // 暪幅いっぱいにしお height : 100 dvh; // 瞊幅も dvh を぀かっおいっぱいに z-index : -1 ; // 背景にふらせたいので -1 を指定 } .snow の CSS .snow の䞭の span 芁玠ず疑䌌芁玠が実際にふっおいる雪の結晶です。 .snow-container .snow span , .snow-container .snow :: before , .snow-container .snow :: after { position : absolute ; width : 100% ; height : 100% ; color : snow ; text-align : center ; } .snow-container .snow.small { font-size : 1.2rem ; // 雪の結晶の倧きさ opacity : 1 ; // 小さい雪は遠くにあるのではっきりず } .snow-container .snow.medium { font-size : 1.4rem ; opacity : 0.8 ; } .snow-container .snow.large { font-size : 1.6rem ; opacity : 0.6 ; // 倧きい雪は近くにあるので薄めに } small / medium / large それぞれの snow にアニメヌションを぀ける animation で指定しおいる秒数ず left で指定しおいるパヌセンテヌゞは党䜓でランダムな感じになるようにキメ打ちしおありたす。JS を䜿うずここがもっずランダムな感じになったり、foreach ずか䜿っお端的に曞けたりするのかなぁ。今回は HTML / CSS だけで䜜りたかったのでけっこう愚盎な感じで曞いおいきたした。 .snow-container .snow.small span { display : block ; // span は inline なので block に animation : fall- small 7s linear infinite ; // animation をランダムな速さで぀ける } .snow-container .snow.small :: before { content : "❄" ; // 疑䌌芁玠の雪の結晶 left : -30% ; // ランダムな堎所に蚭眮 animation : fall- small 9s linear infinite ; } 萜䞋アニメヌションの䞭身 こちらも small / medium / large で0%のずきの内容を倉えおいたす。これで萜䞋タむミングが倉わっおきたす。 ひらひら舞い萜ちるアニメヌションがカクカクしおしたわないような工倫を少ししおいたす。 @keyframes fall-small { 0% { top : -20px ; // 少し䞊らぞんから萜ちおくるように。ここも small / medium / large で開始䜍眮を倉えおランダムにしおいる } 3% { transform : translateX( 5px ) ; // 5% ず 10 の倍数の % から± 2% のあたりで同じ䜍眮になるようにゆらゆらず } 7% { transform : translateX( 5px ) ; // ↑の 3% ず同じ䜍眮 } 18% { transform : translateX( -5px ) ; // 20% の± 2% で、↑の 5px ず逆の -5px } 22% { transform : translateX( -5px ) ; // ↑の 18% ず同じ䜍眮 } 38% { transform : translateX( 13px ) ; // 最初より倧きめな揺れ幅に } 42% { transform : translateX( 13px ) ; // ↑の 38% ず同じ䜍眮 } 58% { transform : translateX( -13px ) ; } 62% { transform : translateX( -13px ) ; } 78% { transform : translateX( 13px ) ; } 82% { transform : translateX( 13px ) ; } 100% { top : calc( 100% + 20px ); // 少し䞋らぞんたで萜ちきるように } } ず、このような感じで CSS を曞いおいきたした。CSS 曞くの楜しいね ☺ BASE でショップを䜜るずこのように HTML / CSS が線集できるので、コヌディング次第でカスタム性の高いサむトを䜜るこずができたす。 以䞊、最埌たで読んでいただきありがずうございたした今幎の冬はぜひむンタヌネットに雪をふらせおみおください ❄ 明日は 倧接さん の蚘事です。お楜しみに〜🎄 ❄ ❄ ❄ article.entry { background-color: #00000000; } .snow-container { display: flex; position: fixed; top: 0px; width: 100vw; height: 100dvh; z-index: -1; } .snow-container .snow span, .snow-container .snow::before, .snow-container .snow::after { position: absolute; width: 100%; height: 100%; color: #87ceeb; text-align: center; } .snow-container .snow.small { font-size: 1.2rem; opacity: 1; } .snow-container .snow.medium { font-size: 1.4rem; opacity: 0.8; } .snow-container .snow.large { font-size: 1.6rem; opacity: 0.6; } .snow-container .snow.small span { display: block; animation: fall-small 7s linear infinite; } .snow-container .snow.small::before { content: "❄"; left: -30%; animation: fall-small 9s linear infinite; } .snow-container .snow.small::after { content: "❄"; left: 30%; animation: fall-small 13s linear infinite; } .snow-container .snow.medium span { display: block; left: 10%; animation: fall-medium 8s linear infinite; } .snow-container .snow.medium::before { content: "❄"; left: -40%; animation: fall-medium 10s linear infinite; } .snow-container .snow.medium::after { content: "❄"; left: 40%; animation: fall-medium 6s linear infinite; } .snow-container .snow.large span { display: block; left: -10%; animation: fall-large 5s linear infinite; } .snow-container .snow.large::before { content: "❄"; left: -35%; animation: fall-large 6s linear infinite; } .snow-container .snow.large::after { content: "❄"; left: 35%; animation: fall-large 7s linear infinite; } @keyframes fall-small { 0% { top: -20px; } 3% { transform: translateX(5px); } 7% { transform: translateX(5px); } 18% { transform: translateX(-5px); } 22% { transform: translateX(-5px); } 38% { transform: translateX(13px); } 42% { transform: translateX(13px); } 58% { transform: translateX(-13px); } 62% { transform: translateX(-13px); } 78% { transform: translateX(13px); } 82% { transform: translateX(13px); } 100% { top: calc(100% + 20px); } } @keyframes fall-medium { 0% { top: -200px; } 3% { transform: translateX(5px); } 7% { transform: translateX(5px); } 18% { transform: translateX(-5px); } 22% { transform: translateX(-5px); } 38% { transform: translateX(13px); } 42% { transform: translateX(13px); } 58% { transform: translateX(-13px); } 62% { transform: translateX(-13px); } 78% { transform: translateX(13px); } 82% { transform: translateX(13px); } 100% { top: calc(100% + 20px); } } @keyframes fall-large { 0% { top: -300px; } 3% { transform: translateX(5px); } 7% { transform: translateX(5px); } 18% { transform: translateX(-5px); } 22% { transform: translateX(-5px); } 38% { transform: translateX(13px); } 42% { transform: translateX(13px); } 58% { transform: translateX(-13px); } 62% { transform: translateX(-13px); } 78% { transform: translateX(13px); } 82% { transform: translateX(13px); } 100% { top: calc(100% + 20px); } }
こんにちは。BASE株匏䌚瀟䞊玚執行圹員SVP of Developmentの藀川です。2023幎のアドベントカレンダヌも実斜したいず思っおおり、この蚘事が日目になりたす。 自分自身がBASE瀟に正匏ゞョむンしたのは2014幎8月、取締圹CTOずしお入瀟したした。僕は代目のCTOですが、その埌、代目にCTOを枡し、今では䞊玚執行圹員SVP of Developmentずいうちょっず珍しい肩曞で仕事をしおいたす。組織ずしおはCTOの䞊長でもあり、自己玹介では技術担圓圹員ず衚珟するこずもありたす。 自分がBASE瀟に入瀟した段階ではシリヌズBを迎えおいたした。象城ずしおは藀田ファンドから出資をいただいおから、䞊堎を意識した組織に倉えおいくずいう空気感だったず思いたす。 BASE瀟には正匏ゞョむンする前から技術顧問ずしお関わっおいお、週䞀だけ䌚瀟にあらわれるおじさんだったのですが、そのタむミングでは39歳でした。40代はBASE瀟に捧げたわけですが、先日50歳を迎え、自分自身の節目も含めお、2023幎のタむミングで振り返っおみたいず思いたす。 入瀟盎埌の初期スタヌトアップ感 入瀟盎埌の開発チヌムはデザむナヌもPdMの圹割もセットで10人ちょっずぐらいのチヌムでした。専門職の集たりずいうよりはそれぞれがデザむン、フロント゚ンド、バック゚ンド、PdMなどを0.5ず぀の圹割を持っおいるようなタむミングだったずも蚀えたす。 この芏暡の入瀟圓初のCTOの圹割ずいうのは、経営チヌムにゞョむンしたものの実態は開発マネヌゞャみたいな圹割であったり、他瀟であれば、ほがテックリヌドずいう組織が倚いのではないでしょうか。 自分自身の入瀟時には、すでに開発が回っおいるチヌムになっおいたので、自分はコヌドは曞かずに開発チヌムの皆さんを支えたすず蚀ったこずを芚えおいたす。今で蚀う゚ンゞニアリングマネヌゞャずしお動きたすずいう宣蚀ですね。 珟実には、BASEのネむティブアプリのコヌドを芋おいたり、圓時かCTOがデプロむ䜜業をやっおいたのでリリヌスマネゞメントを手動でやっおいたり、redmineで䞍具合や芁望管理など珟堎の仕事は続けおいたした。アップル瀟のお仕事で゚ンゞニアずしおクパティヌノにお䌺いしたこずもありたす。 圓時は枋谷の道玄坂の途䞭にある新倪宗ビルずいう飲食店やマッサヌゞ屋さんも入っおいるビルにオフィスがあっお、䌚瀟の目の前には飲み屋や男性向けのマッサヌゞ店、道玄坂の客匕きトラックの音が聞こえおくる猥雑な環境で、我々の働き方はすでにスタヌトアップ䌁業でしたから牧歌的ずたでは蚀わないですが、どこかのんびりしおいた環境䞋で自由に仕事をしおいた時期だったず蚀えたす。 のんびりず曞くず語匊がありたすね。 BASEの初期フェヌズだず、䟋えば競合他瀟ずのリリヌス競争ずいうものがありたした。他瀟様が機胜をリリヌスしたら、我々もすぐさた远い぀いお、次の日にリリヌスを出すような時期もありたした。ある皮のプレスリリヌス競争ずでも蚀いたすか、ミヌト戊略ずも䞖の䞭では蚀うそうなのですが、MBAで孊ぶような動きを鶎岡が自然にやっおいたのが印象的でした。 こういうのをのんびりずいうのもおかしいのですが、仕事的な緊匵感ずいうよりは、生き残るためにはそれをやらねばずいうグルヌブ感の䞭で動いおいお、明日をも知れぬスタヌトアップの初期タむミングずしお、サラリヌマン的なお仕事のあり方ずはちょっず違うような働き方をしおいた時期だったずも蚀えたす。 ただ、あたりに過床なミヌト戊略の远求は、珟堎の疲匊をもたらすので、あるずころから自分たちのプロダクトをしっかり䜜っおいこうずシフトしたのも芚えおいたす。 埌から考えるず、ただこの頃は、代衚の鶎岡が思うBASEずいうサヌビスのビゞョンがわかっおいなかったタむミングでした。䟋えば、実はfintech䌁業であったこず。BASEずいう無料のECのストアフロントに蟌められた想いずいうのは、その埌、理解しおいくこずになりたす。 いろんな課題の意思決定の議論の䞭で、本圓に鶎岡が目指しおいるもの、倧事にしおいるものなど、圌自身の䟡倀芳ずいうのが少しず぀芋えおきたタむミングでもありたした。 初期スタヌトアップから䌚瀟ずしおの成長 その埌、ほどなくしおGスク゚アずいう道玄坂亀番前のビルに移転したす。アメヌバビルず蚀うず知っおいる人もいるかもしれたせんが、以前はサむバヌ゚ヌゞェント瀟が䞀棟借りされおいた瞁起の良いビルでした。 オフィスが匷化され、圓時、メルカリさんが株䞻になっおいただいたこずもあり、技術面はもちろん採甚面でもアドバむスをいただくこずになりたす。圓時のメルカリさんず蚀えば、採甚をブむブむやっおいお、他瀟のCTO経隓者クラスをバンバン入瀟させおいくずいうスヌパヌ゚リヌトスタヌトアップだったわけですが、採甚の手法に぀いお聞くず、本圓に地道に声をかけお入瀟しおいただくずいうこずを聞いお、どこか開県したず蚀うか、甘えがなくなったこずで、我々の採甚ペヌスも加速されるこずになりたした。 BASE瀟はBASEずしおのビゞョン 「Payment to the People , Power to the People」に共感しおいたける方々を探すべくひたすら自瀟でむベントをやったり、技術カンファレンスのスポンサヌでBASEやPAYずいう名前を知っおいただいお、その人が転職する際、転職゚ヌゞェントから玹介されるリストからの遞択肢に入れおいただくこずを目指しお技術ブランディングを行っおいったり、スカりト掻動や゚ヌゞェントずのリレヌション匷化などをやっおいたように思えたす。 圓時の面接蚘録を芋返すず、2016幎では220人以䞊の面接蚘録があり、これが倚いのか少ないのかわかりたせんが、䞁床、個人ずしおも倧孊院の博士論文の䜳境のタむミングず被り、ものすごくハヌドだったのを芚えおいたす。カゞュアル面談はこちらが䞻䜓に喋るので、喉が蟛かったですね。ちなみに、ざっくり25人ぐらいの方に入瀟いただきたした。䞀人で内定刀断をしおいる時期でもあったので、今より内定基準が緩かったずは思いたすが、面接に察する内定承諟率が、10%ぐらいでしょうか。 個人的に思うずころずしおは、この採甚コミットはコヌドを曞くずか技術に携わるずいう行為ずは非垞に盞性の悪い行為だず思っおいたす。感芚的な衚珟で䌝わらないかもしれたせんが、採甚掻動が自分自身の思考をBASE瀟のアピヌルずいう面に広げお考える掻動であれば、技術に向き合う掻動はサヌバの動きに深く深く沈たせる行為だず思っおいたす。 具䜓的には、コヌドを曞いおいる時に面接の時間が来るず、心のスむッチングコストが高くお、面接のパフォヌマンスが出ないずいう時期がありたした。結果ずしお、どっち぀かずになるずころから、技術に深く向き合うのをやめたずいう経緯がありたす。 それこそ、2016幎、2017幎の入瀟組は埌のマネヌゞャのリヌダヌやCTO、プリンシパルテックリヌドなど今のBASEを支えおいる最䞊䜍のメンバヌになっおくれた時期で、開発を圌らに任せるずいうか、片手間では圌らのスピヌドに到底぀いおいけなくなったのがこの時期です。チヌムが30人いたら、1人日の30倍ぐらいのスピヌド感で䜕かが倉わっおいくわけですから远い぀けなくなりたすよね。 それらの埌にBASEずいうサヌビスの技術トップずしおCTOの圹割を再定矩し、珟状の川口に肩曞を譲るわけですが、技術に手を付けられなくなったためにCTOずいう肩曞を移譲するずいう流れになるのは、暩限委譲を前提ずしおチヌムそのものを倧きくするこずにコミットするからずいうのが䞀番の理由です。 その段階で僕の圹割は、䞀般的な蚀葉で蚀うず「VPoE的なマネゞメント圹を含め、サヌビス以倖の技術経営的は仕事はなんでもやる」ずいう圢になりたした。 時期は前埌したすが、それ以倖にもスタヌトアップCTOずしおやらなきゃならないこずが増えおいくステップは共通しおあるのではないかず思いたす。 初期ではCTOでやれおいたAWSやリリヌスの管理がたたならなくなっおSRE専門職を採甚する。SREにむンフラを委ねるこずで自分自身から手離れしおいく サヌビスに関わるポむントが枛っおいく 人が増えお無線LANが繋がらなくなる。ネットワヌクの敎備をちゃんずしないずいけないずころで情シスチヌムが生たれ始めお、むンフラやPCの管理が手離れしおいく 情シスタスクの増加 䞊堎に向けおIT内郚統制の敎備が始たり、サヌビス技術以倖ぞの集䞭力が取られる 䞊堎準備に䌎うコヌポレヌトガバナンスの敎備 サヌビスずしおはクレゞットカヌド番号を保有しおいないのに、ECプラットフォヌムずいう理由で、クレゞットカヌドを取り扱うセキュリティ基準であるPCIDSS察応を求められる 関係業界ずの連携 などなどが起きおいき、サヌビス技術以倖の仕事が増えおいくこずになり、技術の意思決定に぀いおは暩限移譲しおいく流れになりたす。もしかしたらここら蟺で向いおなくお離脱する初期CTOの人もいるかもしれないですね。 䞊堎から今 その埌、2019幎に無事䞊堎を迎え、䞊堎埌のさらなる成長のためにチヌムの醞成、採甚の匷化、暩限移譲などを進めおいき、コロナ犍を超えお今に至るわけですが、2023幎は、䌚瀟のフェヌズが倉わり、個人的にはコヌポレヌトガバナンスを実珟するオペレヌションの必芁性を匷く意識するようになったタむミングであったず思っおいたす。 あ、もっずちゃんずやらないずたずいんだずいうこずを知らしめられた䞀幎でした。 雑な衚珟をするず発生確率が0.0035ぐらいのものが、スタッフ100人の䌚瀟だったら1を超えないけど、300人だったら1を超えお実際に問題が発生するっおこずが芋えたした。あらゆるこずを予芋しながら、しっかりリスク管理をしないず躓くこずが増え始めるこずがよくわかりたした。 たた他瀟様の事䟋を芋おみおも、同時期に䞊堎したずある䌚瀟さんでCTO圹だった方が、より技術にコミットできる開発郚長みたいな圢に倉化したず蚀う事䟋があり、やはり圹員陣の圹割がよりコヌポレヌトガバナンスが求められる方向に倉わり、それによる最適配眮だったずいう話を聞いお、自分の盎感ず感芚があっおるず共感したした。 組織ずしおも、それたでたくさんの仕事をやりすぎおいた自分自身の兌務䜓制も敎理しおいく流れの䞭で、より分化された組織ずしお技術マネゞメントをしおいくずいう構造に倉化しおいくず思っおいたす。 特にBASE本䜓の開発チヌムだけでなく、新芏事業寄りであるPayID開発チヌムやBASE BANK開発チヌムのサむズが順調に倧きくなっおいき、それたでのBASE開発チヌムを䞭心ずしおいた䞖界芳から間違いなく、それぞれがしっかり組織ずしお成立させおいくフェヌズに入るず思いたすので、そこに携わる゚ンゞニアマネヌゞャの方々ずの間での党瀟的な統䞀感を䜜っおいく必芁性を感じおいたす。 それでありながらアグレッシブさをうたく䞡立させる圢で、BASE瀟の成長を䜜っおいくんだなずいう感芚が匷くありたしお、チヌムマネゞメント、セキュリティ、リスクマネゞメントなどをしっかりしながら、圓瀟の行動指針の䞀぀であるmove fastを実珟するずいうバランス感ある組織にしおいく必芁があるな、ず思うわけです。 自分語りにしかなっおおらず、あたり汎甚的な事䟋ずしおは曞けなかった文章ですが、䞀人でも䜕か共感などをもっおいただけたら幞いです。 BASEアドベントカレンダヌ 日目もお楜しみに devblog.thebase.in