TECH PLAY

株匏䌚瀟mediba

株匏䌚瀟mediba の技術ブログ

å…š167ä»¶

こんにちは、medibaの゚ンゞニアカルロスです 昔、暗号(crypto)に匷い関心があったにもかかわらず、暗号通貚にはあたり興味が持おたせん。Bitcoinは始たったころに少し採掘しおいたしたが、倧した量は皌げずりォレットのログむン方法も芚えおいたせん。 尚、生掻偎面の党おを蚈装化された経枈に移行するこずに察する珟代の興奮には共感できたせん。 厳密に蚀えば、技術的なレベルだず、私はただ信者になれおいたせん。 そこで、珟圚web3に぀いお泚目すべき点をふたえた䞊で、いく぀かの点を培底的に勉匷しお、芋逃しおいるこずがあるか確認するこずにしたした。 Web 1.0ず2.0に぀いおの意芋 web3はやや曖昧な甚語であり、web3の野心を厳密に評䟡するこずは困難ですが、䞀般的な理論では、以䞋になりたす。 web1:分散化 web2:すべおをプラットフォヌムに集䞭化 web3:すべおを再び分散化 web3はweb2の豊かさを提䟛し぀぀、分散化されおいたす。 たずは、集䞭型プラットフォヌムが䜕故登堎した理由をある皋床明確にするほうがいいでしょう。私の考えでは、説明は非垞に簡単です! 誰も自分のサヌバヌを管理したくないし、決しおしたせん web1の前提は、ネット䞊の党おの人がコンテンツの発行者であるず同時に消費者であり、むンフラストラクチャの発行者ず消費者でもあるずいうこずでした。 皆が、個人サヌバヌの䞊に個人りェブペヌゞをホストし、個人のメアドのための個人のメヌルサヌバヌを甚意し、個人のステヌタスメッセヌゞ甚の個人のフィンガヌサヌバヌがあるようにしたす。 しかし、匷調しおもしすぎるこずはないだろうず思いたすが、䞀般ナヌザヌがこれを望んでいるこずではないでしょう。䞀般ナヌザヌは自分のサヌバヌを管理したくないし、それはオタクでもしたくないこずです。゜フトりェアを開発しおいる組織でさえ、珟時点ではサヌバヌを管理したくないです。私たちがこの䞖界に぀いお孊んだこずを1぀挙げるずしたら、それは人間がサヌバヌを管理したくないずいうこずです。 だから、代わりにそのサヌビスを提䟛しおくれる䌚瀟は成功したした。そしお、それらのネットワヌクの䞊の可胜であるこずを拡匵しお新しい機胜をむテレヌション(※)した䌚瀟はさらに成功したした。 プロトコルはプラットフォヌムよりもはるかにゆっくりず移動したす 30幎以䞊経っおも、電子メヌルはただ暗号化されおいたせん。䞀方、WhatsAppは1幎で暗号化されおいない状態から完党なe2eeに移行したした。 未だにIRCを介しおビデオを確実に共有するこずを暙準化しようずしおいたすが、䞀方、Slackでは、ナヌザヌの衚情に基づいおカスタムのリアクション絵文字を䜜成できたす。 これは資金調達の問題ではなく、䜕かが完党に分散化されおいるず、倉曎が非垞に難しくなり、時の流れの䞭で取り残されたたたになるこずがよくありたす。これはテクノロゞヌの問題であり、゚コシステムの動きが非垞に速くお垞に䞊走しおいなければ眮いおいかれたす。膚倧な数の人々のグルヌプを線成しお早く移動できるようにする方法を芋぀けるこずが非垞に重芁であるため、アゞャむルのような方法論の定矩ず改善に焊点を圓おた䞊行業界党䜓が存圚するのでしょう。 テクノロゞヌ自䜓が動きよりも停滞を助長するずなるず倧問題です。成功の確実な秘蚣は、時間に远われおいた90幎代のプロトコルを採甚し、それを集䞭化しお、迅速に反埩するこずだず考えられたす。 しかし、web3の意図は違うずころにあるので、そのこずを確認しおみたしょう。技術の感じを぀かんで将来がどうなるかをよりよく理解するためにいく぀かのdAppを利甚しおNFTを䜜成するこずにしたした。今埌自分で䜜成したいみたいず思いたすが… 分散型アプリケヌション(dApp)を䜿っおみたした web3を感じ取るために AutonomousArt ずいうdAppを䜿っおみたした。これにより、NFTに芖芚的な貢献するこずで、誰でもNFTのトヌクンを発行できたす。芖芚的な貢献をするためのコストは時間の経過ずずもに増加し、貢献者がミントのために支払う資金は以前のすべおの貢献者に分配されたすこの財務構造はピラミッド型に䌌たものになりたす。 そしお、原資産を远跡する金融デリバティブのように、原資産を远跡するNFTデリバティブを䜜成、発芋、亀換させおくれる FirstDerivative ずいうdAppも䜿っおみたした。 どちらもdAppの仕組みを感じさせおくれたした。正盎にいうず、アプリ自䜓に぀いお特に「分散」されおいるものはありたせんでした。アプリは通垞のReactのりェブサむト… その「分散性」ずは、ステヌトずそのステヌトを曎新するためのロゞック/暩限が存圚する堎所になりたす。その堎所は「集䞭型」デヌタベヌスではなく、ブロックチェヌンの䞊です。 私がい぀もおかしいず思っおいるのは、クラむアント/サヌバヌのむンタヌフェむスぞの泚意の欠劂です。誰かがブロックチェヌンに぀いお話すずきには、信頌の分散、指導者のない総意、そしお仕組みがどのように動いおいるかに぀いお話したすが、倚くの堎合最終的にクラむアントができないこずは䜕であるかがうやむやになっおいるように思えたす。 どんなネットワヌク図にも茉っおいるものはサヌバヌばかりで、信頌モデルもサヌバヌ間のものであり、すべおはサヌバヌに関するものです。ブロックチェヌンはピアのネットワヌクずしお蚭蚈されおいたすが、モバむルデバむスたたはブラりザがピアになれるようには蚭蚈されおいたせん。 たずえば、モバむルでもPCでも、AutonomousArtやFirstDerivativeのようなdAppは、ステヌトの倉曎たたはレンダリングするため䜕らかの方法でブロックチェヌンずやり取りする必芁がありたす。ただし、ブロックチェヌンはモバむルデバむスもしくはブラりザヌ䞊で動䜜できないため、クラむアント偎からこれを行うこずは実際には䞍可胜でしょう。したがっお、唯䞀の代替手段はどこかのサヌバヌ䞊でリモヌトで実行されおいるノヌドを介しおブロックチェヌンず察話するこずです。 やっぱりサヌバヌだでも、すでに曞いたように、人はサヌバヌを管理したくありたせん。偶然にも、サヌビスずしおetheriumノヌドぞのAPIアクセスを販売する䌁業が出珟し、分析、拡匵API、および履歎トランザクションぞのアクセスを提䟛しおいたす。なんか聞いたこずありたすよね…珟時点で、ほずんどすべおのdAppは、ブロックチェヌンず察話するために2぀の䌚瀟を䜿っおいたす。InfuraたたはAlchemy。実際、MetaMaskのようなりォレットをdAppに接続し、dAppがりォレットを介しおブロックチェヌンず察話する堎合でも、MetaMaskはInfuraを呌び出しおいるだけです。 これらのクラむアントAPIは、ブロックチェヌンの状態や応答の信頌性を承認しようずしおいたせん。結果は眲名すらされおいたせん。AutonomousArtのようなアプリは、「このスマヌトコントラクトでのこのビュヌ機胜の出力は䜕ですか」ず蚊いお、AlchemyたたはInfuraは、「これは出力だよ」ずいうJSON BLOBで応答し、アプリがそれをレンダリングしたす。 これは驚きでした。信甚䞍芁(※2)の分散型コンセンサスメカニズム(※3)の構築には倚倧な劎力、゚ネルギヌ、時間が費やされおきたのに、それにアクセスしたいほずんどのクラむアントは、怜蚌なしに、この2぀のサヌビスからの出力を単に信頌しおいたす。たた、プラむバシヌの面からも最善ではないでしょう。すべおのwriteトラフィックは、もちろんブロックチェヌン䞊ですでに公開されおいたすが、この2぀のサヌビスはほがすべおのdAppのナヌザヌからの読み取り芁求を可芖化するこずが可胜ずなっおいたす。 NFTを䜜る それから、もう少し䞀般的なを䜜成しおみたいず思いたした。ほずんどの人は、NFTに぀いお考えるずきに画像やデゞタルアヌトに぀いお考えたすが、普段はNFTがそのデヌタをチェヌン䞊に保存しおいるわけではありたせん。ほずんどの画像のNFTの堎合、これは非垞に費甚のかかるものです。画像のデヌタをチェヌンに保存する代わりに、デヌタを指すURLになっおいたす。この暙準に぀いお私が驚いたのは、URLにあるデヌタにハッシュコミットメントがないこずです。数十ドル、数癟ドル、たたは数癟䞇ドルで販売されおいる人気のある垂堎のNFTを芋るず、そのURLは、Apacheを実行しおいるVPSを指しおいるこずがよくあるようです。そのマシンにアクセスできる人、将来そのドメむン名を賌入する人、たたはそのマシンを䟵害する人は、NFTの画像、タむトル、説明などをい぀でも奜きなように倉曎できたすそのトヌクンを「所有」しおいないにもかかわらず。NFT仕様には、画像が「こうであるべき」や、「正しい」かどうか確認させおくれるものは䜕もありたせん。 むンタヌネットを再珟する web1がweb2になった理由を考えるず、web3の奇劙なずころは、ethereumのような技術がweb1で既に明らかになっおいるはず倚く眠で構築されおいるこずです。これらの技術を䜿甚可胜にするために、プラットフォヌムを䞭心に統合されおいたす。たた同じこずが起こっおいたす。あなたの代わりにサヌバヌを運営し、出珟する新しい機胜をむテレヌションするサヌビス。それはInfura、OpenSea、Coinbase、Etherscan、などです。 同様に、web3プロトコルの進化は遅いです。 䟋えば、 First Derivativeは原資産の䟡倀のパヌセンテヌゞずしおミントの䟡栌を蚭定するこずもできたけれど、そのデヌタはチェヌン䞊にありたせん。OpenSeaが提䟛するAPI内にありたす。倚くの人がクリ゚むタヌに利益をもたらす方法でNFTの特蚱暩䜿甚料に期埅しおいたすが、䜿甚料はERC-721で指定されおおらず、倉曎するには遅すぎたす。そのため、OpenSeaには、web2スペヌスにその䜿甚料を構成する独自の方法がありたす。集䞭型プラットフォヌムでの迅速な反埩は、すでに分散プロトコルを䞊回り、制埡をプラットフォヌムに統合しおいたす。この方法だず暗号通貚りォレットでのNFTのビュヌがOpenSeaのNFTのビュヌになっおいるずしおも驚きはないでしょう。OpenSeaは、暙準を倉曎するこずが䞍可胜/困難で、可胜な範囲を超えおプラットフォヌムを反埩するこずに忙しいため、眮き換え可胜な玔粋な「ビュヌ」ではないこずに驚くこずではありたせん。 これはメヌルの状況ず非垞に䌌おいるず思いたす。自分のメヌルサヌバヌを運甚するこずはできたすが、プラむバシヌ、怜閲ぞの抵抗、たたは制埡に関しおは、私が送受信するすべおのメヌルの裏にGMailがいるから、結局意味がありたせん。分散型゚コシステムが利䟿性のためにプラットフォヌムを䞭心に集䞭するず、䞡方の䞖界の悪い郚分だけを抜出した圢になっおしたいたす。集䞭管理されおいたすが、時間内に混乱するほど十分に分散されおいたす。自分のNFTマヌケットプレむスを構築するこずはできたすが、OpenSeaがナヌザヌが䜿甚するりォレット内のすべおのNFTおよび゚コシステム内の他のすべおのアプリのビュヌを仲介するため特別な制埡は䜕も提䟛できたせん。 創造性は十分ではないかもしれたせん web3を詊しに少しやっおみただけですが、この小さな詊しの芖点から芋おみるず、なぜこれほど倚くの人たちがweb3゚コシステムをずおもきれいだず思うのかが簡単にわかりたす。集䞭化されたプラットフォヌムから離せおくれる軌道になっおいるこずやテクノロゞヌずの関係が根本的に倉わるずは思いたせんし、プラむバシヌのずころもすでにむンタヌネットの氎準を䞋回っおいるず思いたすが、私のような開発者がここで䜕かを構築するこずに興奮しおいる理由もわかりたす。少なくずも新しいものであり、初期のむンタヌネット時代を思い出させる創造性/探玢出来るようなスペヌスになっおいるからです。皮肉なこずに、その創造性の䞀郚は、おそらくweb3を非垞に䞍栌奜にする制玄から生じおいたす。今目にしおいる創造性ず探求が前向きな結果をもたらすこずを願っおいたすが、過去のむンタヌネットず同じ垰結を防ぐために十分かどうかはわかりたせん。 テクノロゞヌずの関係を改善したいのなら、意図的にやらなければならないず思うのは むンフラストラクチャを分散させずに信頌を分散できるシステムを蚭蚈するこずで、皆が自分のサヌバヌを管理しないずいう前提を受け入れる必芁がありたす。 ゜フトりェア構築の負担を軜枛するよう努めるべきです。 しかし、正盎いうずGameStopずLoopRingが䜜ろうずしおいるマヌケットプレむスには少し期埅がありたす 私からは以䞊です。最埌たで読んでいただきありがずうございたした。 参考 ※1 https://it-trend.jp/development_tools/article/32-0022 ※2 https://komugi.jp/?p=859 ※3 https://support.okcoin.jp/hc/ja/articles/4403552067865
アバタヌ
こんにちは、デヌタアナリストの巊海です。 最近アサむンされたプロゞェクトにおアプリ/WebのGoogle Analytics 4(以䞋GA4)での蚈枬を怜蚎しおいたしたが、私自身アプリもGA4も知芋がなかったため、SwiftUIでネむティブアプリを䜜成しログ怜蚌を行うこずにしたした。 ※なお、Apple Developer Programを契玄しおいないためiOS Simulatorを䜿甚しおいたす。 実行環境 XcodeのVersion13.2.1 (13C100) iOS Simulatorの名前iPhone 13 iOSのversioniOS 15.2 最終的にできたもの 以䞋の通り、テストアプリを䜜成しGA4のDebugViewでscreen_viewむベント、カスタムむベントが意図したタむミングで飛んでいるか怜蚌可胜になりたした。 䜜業手順 以䞋の䜜業手順の通りに進めおいきたす。 SwiftUIでネむティブアプリの䜜成を行う ネむティブアプリぞFirebase SDKを远加する GA4のDebugViewでログを怜蚌する それでは、ネむティブアプリ䜜成の流れ、Firebase SDKの远加、GA4を甚いたログ怜蚌に぀いお説明しおいきたす。 1.SwiftUIでネむティブアプリの䜜成を行う 画面遷移のむメヌゞ たずは、XcodeでFirebase SDK远加に必芁なアプリの䜜成を行いたす。 ここでは、3぀の画面を䜜成したす。画面遷移は添付画像のようなむメヌゞです。 ContentView SubView MyWebView ContentViewの䜜成 ContentViewから䜜成したす。ContentViewでは、SubView、MyWebViewそれぞれに遷移するリンクを䜜成し、Buttonも画面右䞊郚に配眮したす。加えお、むベント送信凊理も远加したす。 画面遷移は以䞋の通り NavigationLink を甚いたす。 destination には遷移先のView名を、 Text() にはリンクに衚瀺する文字列を蚘述したす。 NavigationLink(destination: SubView()) { Text("Go SubView") } NavigationLink(destination: MySecondWebView(urlString: "https://test-c1632.web.app/")) { Text("Go WebView") } screen_viewむベントはむンスタンスメ゜ッド onAppear でContentViewが描画されたタむミングで送信したす。 むベントパラメヌタヌずしお、 screen_name ず screen_class を定矩しおおきたす。 同様の凊理をSubView、MyWebViewでも蚘述しおいきたす。 .onAppear() { Analytics.logEvent(AnalyticsEventScreenView, parameters: [AnalyticsParameterScreenName: "\(ContentView.self)", AnalyticsParameterScreenClass: "\(ContentView.self)"] ) } 次に、画面右䞊郚のButtonをタップした際に送信するカスタムむベント button_tap を远加したす。むベントパラメヌタずしお button_name を定矩したす。今回送信するむベント送信凊理の蚘述は以䞊です。 Button(action: { let button_name = "hoge" Analytics.logEvent("button_tap", parameters: ["button_name" : button_name as NSObject,] ) } SubViewの䜜成 ContentViewの遷移先であるSubViewの䜜成を行いたす。ここではダミヌの遷移先を蚭定しおおきたした。 MyWebViewの䜜成 ContentViewの遷移先であるMyWebView画面の䜜成を行いたす。MyWebView画面は私が䜜成したWebサむトを衚瀺したす。 WebサむトはFirebase Hostingで公開しおいたす。 これでアプリの䜜成は終了です。以䞋の通り、問題なくビルドするこずができたした。 2.アプリぞFirebase SDKを远加する アプリに接続するFirebase プロゞェクトを新芏䜜成する 䜜成したアプリにFirebase SDKを远加したす。たずは、 Firebase コン゜ヌル でアプリに接続するための Firebase プロゞェクトを新芏䜜成したす。 䜜成したアプリをFirebaseに登録する プロゞェクト抂芁 > iOS+ アむコン > 蚭定ワヌクフロヌに進みたす。するず、Apple バンドルIDの入力を求められたす。 ナビゲヌタヌ゚リアの䞊のプロゞェクト名 > TARGETS のプロゞェクト名 > General タブでApple バンドルIDを確認できたす。 蚭定ファむルのダりンロヌド ダりンロヌドした GoogleService-Info.plist ファむルをXcode プロゞェクトのルヌトに移動し、すべおのタヌゲットに远加したす。 Firebase SDKを远加する Firebase SDKはいく぀かむンストヌル方法がありたすが、今回はCocoaPodsを利甚したす。 Podfileを䜜成する プロゞェクトディレクトリのルヌトから次のコマンドで、Podfileを䜜成したす。 pod init PodfileにFirebaseAnalyticsを远加する アプリで䜿甚する'Firebase/Analytics'をPodfileに远蚘したす。 # Add the Firebase pod for Google Analytics pod 'Firebase/Analytics' # For Analytics without IDFA collection capability, use this pod instead# pod ‘Firebase/AnalyticsWithoutAdIdSupport’ # Add the pods for any other Firebase products you want to use in your app# For example, to use Firebase Authentication and Cloud Firestore # pod 'Firebase/Auth' # pod 'Firebase/Firestore' Podをむンストヌルする pod install を実行したす。ただし、M1 Macだず䞊手くむンストヌルできないこずがあるようです。 私の環境䞋ではタヌミナルのアヌキテクチャに䟝存しおいたので以䞋のペヌゞを参考に、タヌミナル > 右クリックで「情報を芋る」 > 「Rosettaを䜿甚しお開く」 に事前にチェックを入れたす。そうするこずで、問題なくPodがむンストヌルできたした。 【参考】M1 Macでpod installを実行する pod install Podむンストヌルが完了するず、 .xcworkspace ファむルが䜜成されたす。以降は .xcworkspace ファむルからXcodeプロゞェクトを開きたす。 初期化コヌドを远加する アプリ起動時に Firebase を接続するには、Xcodeプロゞェクトの@mainアトリビュヌションの指定の堎所に指定のコヌドを远加したす。 import SwiftUI import Firebase //远蚘 @main struct testApp: App { var body: some Scene { WindowGroup { ContentView() } } init() { FirebaseApp.configure() //远蚘 } } これで、Firebase SDKの远加は完了です。 3.GA4のDebugViewでログ怜蚌を行う 最埌に、GA4でログ怜蚌を行いたす。早速ログ怜蚌ずいきたいずころですが、事前にいく぀か蚭定を行う必芁がありたす。 Debug Modeを有効にする Xcodeを開き、メニュヌバヌ > Product > Scheme > Edit Scheme > Run > ArgumentsのArguments Passed On LaunchにFIRDebugEnabledを远加するこずで、Debug Modeを有効にしたす。 Firebaseの自動ログ取埗をオフにしお手動ログ取埗を蚭定する 今回SwiftUIずの盞性かもしれたせんが、自動ログ取埗では画面遷移でscreen_viewむベントが飛んだり飛ばなかったりしおいたので、手動でログ取埗をする実装にしおいたす。 Info.plist ファむルに以䞋を远加するこずで自動ログ収集をオフにしたす。 KeyFirebaseAutomaticScreenReportingEnabled ValueNO(Boolean) デバック時にXcodeのReport Navigatorで以䞋のようなログが確認できれば、自動ログ収集がオフになっおいたす。 Analytics screen reporting is disabled. UIViewController transitions will not be logged. ログ怜蚌 Debug Viewでscreen_viewむベント、buttun_tapむベントが蚈枬されおいるのが分かりたす。問題なくログが飛んでいたす、怜蚌完了です。 BigQuery連携 BigQueryに連携しお゚クスポヌトされおいるログを確認したした。添付画像のカスタムむベントbutton_tapのログは実装した通り、button_name に蚭定した倀 hoge が栌玍されおいたす。 おわりに 今回無事にアプリを完成させおログ怜蚌を行うこずができたした。私自身プログラミング未経隓だったため、取り組む前は分からないこずだらけでした。具䜓的には、プログラミングの基瀎がなく、゚ラヌの解決方法が分かりたせんでした。他にもタヌミナルやGitHubで䜕ができるのかすら知りたせんでした。 しかし、Udemyで孊習したり、分からないこずを䞀぀䞀぀怜玢゚ンゞンで調べるこずで問題解決するこずができたした。アプリ制䜜の堎面ぱラヌの連続でしたが、゚ラヌを解決した瞬間が最も楜しかったです。 そしお、䜕を取り組むにしおも「やればできる」ず自信が぀くようになりたした。これからもさたざたなこずにチャンレンゞしおいきたす。 どなたかの参考になれば幞いです。
アバタヌ
はじめたしお、mediba FE゚ンゞニアの楊です。 最近猫パンチ避け䞊手になっおいるので、猫を困らせおいたす。 React Native初芋 ネットで調べおみお、第䞀印象は「可愛いかった」です。 その他に感じた印象は䞋蚘です。 facebookのcross-platformフレヌムワヌクで、1回曞いたらAndroid、iOS、Web党郚動くだろう。 React Native以䞋RNずいう名前付けなので、React開発者にずっお、䜿いやすいだろう ずいう浅い認識で、チヌムメンバヌず䞀緒にRNのプロゞェクトを曞いおみたした。 React Native振り返る ある皋床コヌドを曞いおみるず、以䞋の事に気が付きたした。 バヌゞョンアップが早い 最近のリリヌスを芋るず1幎間3個のメむンバヌゞョンがもうリリヌスされお、RNのバヌゞョン管理が課題になりそう、特にキャッチアップには、互換性の問題が目の前に debugの難しさ Web開発ず比べるず、RNでよくみる真っ赀な画面の゚ラヌ画面あるが、それのメッセヌゞだけで、フロントかネむティブかの゚ラヌの刀断は難しい 芁玠の高さがスクリヌンの高さを超えたらスクロヌルできない Webだず生たれ぀きでスクロヌルできるけど、RNの堎合䞀番倖偎にスクロヌル可胜の゚レメントでwrapしおあげないず iOSずAndroidにおいおの違い ある皋床RNがその違いを埋めおくれおたすが、それぞれの環境に䟝存した凊理がある倖郚libで枈む堎合も リストの遞択 RNのリスト、元々listViewずflatList二぀もあっお、listviewは性胜的な問題で攟棄されお、flatListが掚奚されおたす実際カルヌセルを䜜った際に困っおた ぀たり、RNは䟝存心の匷い子でした。 印象的ポむント RNを觊っおみお、䞀番興味深いずころずいうず、native codeで曞いたSDKを扱える郚分でした、いわゆる Native Module Bridging ずいうものです。 前述の通りある皋床RNがiOSずAndroidの違いを埋めおくれおたすが、それぞれのOSに䟝存したAPIはJSでの扱いは䞍可なものもあり、あるいはより高いパフォヌマンス的、マルチスレッド的に䜜りたい堎合、native moduleを介しおそれを実珟できたす。 実際手を動かしお、 公匏ドキュメントをみながら、自分なりに簡単な「hello-world」を䜜っおみたした。孊校でJavaを孊んでたので、個人的に芪切な Android を遞んだ^^ ステップ 環境蚭定 なんずなく動くnative code曞く RNを介しお、native moduleずしお、JS偎にに披露(expose)する JS偎で呌び出し 環境蚭定 公匏ドキュメント に沿っお環境蚭定できたす。JavaScript(以䞋JS)、TypeScript(以䞋TS)䞡方䜜れたすが、 自分はTSのテンプレヌトを䜜りたした(TS最高) なんずなく動くnative code曞く 環境蚭定終わりたしたら、䞋蚘のandroidのフォルダで䜜業をしおいきたす自分はJavaの構文あたり自信ないから、Android Studioでandroidフォルダヌを開いおコヌドを曞いおいるw android/app/src/main/java/com/awesomeproject の配䞋で HelloModule.java ずいう新芏Javaファむルを䜜りたす。 ファむルの䞭身はこんな感じ public class HelloModule extends ReactContextBaseJavaModule {    private static ReactApplicationContext reactContext;    HelloModule(ReactApplicationContext context) {        super(context);        reactContext = context;    }    public static void setTimeout(Runnable runnable, int delay){        new Thread(() -> {            try {                Thread.sleep(delay);                runnable.run();            }            catch (Exception e){                System.err.println(e);            }        }).start();    }    @ReactMethod    public void sayHelloToPopUp(String name) {        Toast.makeText(reactContext,"Hello World,"+name,Toast.LENGTH_LONG).show();    }    @ReactMethod    public void sayHelloAfterThreeSecond(String name, Promise promise) {        setTimeout(()->promise.resolve("Hello after 3 seconds,"+name),3000);    }    @NonNull    @Override    public String getName() {        return "HelloModule"; //この呜名でNativeModulesに远加    } }; ずりあえず詊しに、䞋蚘二぀の関数を䜜っおみたした。 AndroidのToastを䜿っお出力できる sayHelloToPopUp Promiseを返す sayHelloAfterThreeSecond App(JS偎)に披露(expose)する init埌に自動生成された android/app/src/main/java/com/awesometsproject/MainApplication.java の䞭身を芋おみるず protected List getPackages() {          @SuppressWarnings("UnnecessaryLocalVariable")          List packages = new PackageList(this).getPackages();          // Packages that cannot be autolinked yet can be added manually here, for example: ※        // packages.add(new MyReactNativePackage()); ←この行を解攟          return packages;        } 既に甚意しおくれたPackage名でpackageを䜜りたす。䞊蚘のファむルず同じフォルダヌ配䞋で MyReactNativePackage.java のファむルを䜜成し、nativePackage䜜り、NativeModuleに先皋䜜成したHelloModuleを远加すれば完成です。 public class MyReactNativePackage implements ReactPackage {    @NonNull    @Override    public List createViewManagers(@NonNull ReactApplicationContext reactContext) {        return Collections.emptyList();    }    @NonNull    @Override    public List createNativeModules(            @NonNull ReactApplicationContext reactContext) {        List modules = new ArrayList<>();        modules.add(new HelloModule(reactContext));        return modules;    } } JS偎で呌び出し 最埌の䞀歩は、App.tsxで䜿うこずですね。   import { NativeModules } from 'react-native';   たずNativeModulesをimport,それから先皋䜜った sayHelloToPopUp ず sayHelloAfterThreeSecond を呌び出したす  const { HelloModule } = NativeModules  const sayHello = React.useCallback((words)=>{    HelloModule.sayHelloToPopUp(words)  },[])  const sayHelloThreeSecondsLater = React.useCallback(()=>{    HelloModule.sayHelloAfterThreeSecond('lalalalala').then((res)=>sayHello(res))  },[]) ... <button title="{"> 最埌、rootでyarn androidすれば、起動を埅ち、シミュレヌタヌが立ち䞊がっおアプリむンストヌル完了、アプリでpressボタンをポチる 3秒埌に添付画像のトヌストが出おきたす 感想 RNのようなクロスプラットフォヌムのフレヌムが宣䌝したように、「䞀回曞いたらどのプラットフォヌムでも動ける」ずいう理想があるが、 実際にプロゞェクトを䜜るに圓たっお、ネむティブアプリもフロントを党郚理解し、䞀人でのiOS,AndroidずWeb党おのコヌドを曞けるこずはありえない。 しかしRNを架け橋に、ネむティブチヌムずフロントチヌムを連携し、斬新なビッグB.I.Gフロントチヌムを生み出せるではないでしょうか。 こずわざの通り「理想なき者に成功なし」^^
アバタヌ
こんにちは。Eng6G バック゚ンド゚ンゞニアの土屋( @hrktcy )です。もうすぐ瀟䌚人2幎目ずいうこずで月日の流れがずおも早く感じたす。 はじめに 珟圚開発䞭のプロダクトで、API リク゚ストパラメヌタに含たれるお客様の個人情報をデヌタベヌスに暗号化しお栌玍するためにAWS Key Management Service(KMS) を導入するこずになりたした。導入するにあたり、KMS での暗号化のリク゚ストパフォヌマンスが、開発䞭のシステムに定めたSLA に耐えうる性胜かを怜蚌する必芁がありたした。本蚘事ではその結果を共有したいず思いたす。 怜蚌項目 出力するものは以䞋の3぀です。 平均暗号化凊理時間(ms) 各暗号化凊理時間を昇順に゜ヌトした際の90パヌセンタむル倀(ms) 最倧暗号化凊理時間(ms) 環境 ロヌカル環境でGolang で怜蚌甚のサンプルコヌドを曞きたす。そしおクロスプラットフォヌムビルドによっお生成されたバむナリファむルをS3 にPUT し、EC2から実行したす。 蚀語 Golang SDK aws-sdk-go-v2 実行堎所 EC2(t2.micro/x86) 暗号化する文字列を䜜成する関数を定矩する たず、怜蚌甚の文字列[0-9a-zA-Z](32文字)を生成する関数を定矩したす。生成には math/rand パッケヌゞを甚いおランダムな文字列を生成するようにしたす。生成数はコマンドラむン匕数から指定できるようにしおおきたす。 package main import ( "math/rand" ) func randomStr(n int) string { letters := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" lettersLen := len(letters) dst := make([]uint8, n) for i := 0; i < n; i++ { l := rand.Intn(lettersLen - 1) dst[i] = letters[l] } return string(dst) } 暗号化凊理を行う関数を定矩する 暗号化凊理を行うexec 関数を定矩したす。この関数をgoroutine で䞊行凊理するようにしたす。sync.waitGroup のDone() をdefer するこずで、凊理の最埌に完了を知らせるようにしおおきたす。 var wg sync.WaitGroup var keyID = "*******" // マスタヌキヌのKeyID var client *kms.Client // data 結果栌玍甚構造䜓 type data struct { Encrypted []byte ProcessTime time.Duration } func exec(plain string, results *[]data) { defer wg.Done() // 蚈枬開始 start := time.Now() // keyIDず暗号化する文字列を代入 input := &kms.EncryptInput{ KeyId: &keyID, Plaintext: []byte(plain), } // 暗号化リク゚スト output, err := client.Encrypt(context.TODO(), input) if err != nil { fmt.Printf("Got error encrypting data:%v\n", err) return } // 暗号化文字列ず凊理時間をdata型の倉数に代入する result := data{ Encrypted: output.CiphertextBlob, ProcessTime: time.Since(start), } *results = append(*results, result) } main 関数を実装する 前述の関数を甚いおmain 関数を実装したす。main 関数ではrandomStr 関数で生成した文字列を栌玍する配列を甚意し、KMS クラむアントを生成しおから暗号化凊理をgoroutine で䞊行凊理させたす。なお、for ルヌプの䞭でtime.Sleep() させるこずでTPS を調敎できるように蚭定し、ルヌプ凊理が終了したら怜蚌項目を蚈算しお出力するようにしたす。 package main import ( "context" "flag" "fmt" "log" "math/rand" "sort" "sync" "time" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/kms" ) // data 結果栌玍甚構造䜓 type data struct { Plain string Encrypted []byte ProcessTime time.Duration } var wg sync.WaitGroup var keyID = "*******" // KeyID var client *kms.Client var num = flag.Int("num", 100, "暗号化実行回数") var interval = flag.Int("interval", 1, "-interval ") // randomStr ランダム文字列を生成する関数 func randomStr(n int) string { letters := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" lettersLen := len(letters) dst := make([]uint8, n) for i := 0; i < n; i++ { l := rand.Intn(lettersLen - 1) dst[i] = letters[l] } return string(dst) } // exec 䞊列凊理する関数 func exec(plain string, results *[]data) { defer wg.Done() // 蚈枬開始 start := time.Now() // keyIDず暗号化する文字列を代入 input := &kms.EncryptInput{ KeyId: &keyID, Plaintext: []byte(plain), } // 暗号化リク゚スト output, err := client.Encrypt(context.TODO(), input) if err != nil { fmt.Printf("Got error encrypting data:%v\n", err) return } // 暗号化文字列ず凊理時間をdata型の倉数に代入する result := data{ Encrypted: output.CiphertextBlob, ProcessTime: time.Since(start), } *results = append(*results, result) } func main() { flag.Parse() // 怜蚌甚文字列準備 maxStrLen := 32 plainList := make([]string, *num) for i := range plainList { plainList[i] = randomStr(maxStrLen) } // KMSのクラむアントを䜜成 loadOptions := []func(*config.LoadOptions) error{config.WithRegion("ap-northeast-1")} sdkCfg, err := config.LoadDefaultConfig(context.TODO(), loadOptions...) if err != nil { panic("configuration error, " + err.Error()) } client = kms.NewFromConfig(sdkCfg) // 暗号化凊理実行 results := make([]data, 0) for _, v := range plainList { wg.Add(1) go exec(v, &results) time.Sleep(time.Millisecond * time.Duration(*interval)) } // 終了を埅぀ wg.Wait() // 結果刀定 success := len(results) if success < 1 { log.Fatal("empty success result") } // あらかじめ昇順で゜ヌトしおおく sort.Slice(results, func(i, j int) bool { return results[i].ProcessTime < results[j].ProcessTime }) // 平均暗号化凊理時間を蚈算 total := int64(0) for _, v := range results { total = total + v.ProcessTime.Milliseconds() } fmt.Printf("avg:%dms\n", total/int64(success)) // 90パヌセンタむル倀を蚈算 percentile := int(float64(success)*0.9 - 1) fmt.Printf("Percentile:%dms\n", results[percentile].ProcessTime.Milliseconds()) // 最倧暗号化凊理時間を蚈算 fmt.Printf("max:%dms\n", results[success-1].ProcessTime.Milliseconds()) } 怜蚌結果 500(req/sec)で400個の文字列暗号化を行った堎合 avg(ms) 90 percentile(ms) max(ms) 9 9 68 500(req/sec)で1000個の文字列暗号化を行った堎合 avg(ms) 90 percentile(ms) max(ms) 7 8 61 暗号化凊理を増やした堎合でも各暗号化凊理時間に倧きな差は生たれたせんでした。しかし、最倧暗号化凊理時間は90パヌセンタむル倀よりも倧幅に時間がかかっおいるこずがわかりたした。この倀は初回暗号化凊理時間の倀でしたので、2回目以降はKMS クラむアントを䜿い回しおおり、初回はKMS クラむアントを読み蟌んでいる分時間がかかっおいるのではないかずいう掚枬をしたした。 暗号化凊理毎にKMSクラむアントを読み蟌んでみたらどうか main 関数内で行っおいるKMS クラむアント䜜成凊理をexec 関数内に移動し、暗号化リク゚ストの郜床クラむアントを䜜成するように倉曎しおリク゚ストパフォヌマンスを怜蚌しおみたす。 同様の条件で怜蚌を詊みたずころ、以䞋のIMDSの認蚌゚ラヌが生じおしたい暗号化が行えたせんでした。 Got error encrypting data:operation error KMS: Encrypt, failed to sign request: failed to retrieve credentials: no EC2 IMDS role found, operation error ec2imds: GetMetadata, http response error StatusCode: 429,request to EC2 IMDS failed [参考]:429 Too Many Requests そこで、暗号化凊理数を枛らしお凊理速床を蚈枬しおみたす。 500(req/sec)で10個の文字列暗号化を行った堎合 avg(ms) 90 percentile(ms) max(ms) 52 65 73 500(req/sec)で100個の文字列暗号化を行った堎合 avg(ms) 90 percentile(ms) max(ms) 749 2113 2158 凊理数を増やすず応答時間が長くなるこずが分かりたした。TPS を䞋げおみたらどうなるでしょうか。 100(req/sec)で100個の文字列暗号化を行った堎合 avg(ms) 90 percentile(ms) max(ms) 28 39 54 TPS を䞋げるず各凊理時間もだいぶ萜ち着きたした。 たずめ KMS クラむアントを䜿い回すパタヌンでは初回暗号化凊理時間に少し時間がかかるものの、暗号化凊理数を倉えおも各凊理時間に倧きな差は生たれたせんでした。䞀方、郜床KMS クラむアントを読み蟌たせるパタヌンでは、応答時間が長くなる+倧量の暗号化凊理を行う堎合はTPS を䞋げる必芁がありそうです。
アバタヌ
初めに こんにちは。゚ンゞニアの野厎です。最近は珟堎でプロダクトの開発を行い぀぀、 兌務ずしおCTO準備宀に所属しテックリヌドずいうロヌルを持ち、耇数のプロダクトにたたがるテクノロゞヌセンタヌの課題を 技術的な点を軞にしながら解決に向けお取り組んでいたす。 ※参考蚘事 2020幎床゚ンゞニア組織に぀いお | mediba Creator × Engineer Blog 本蚘事では、テックリヌドの取り組みずしお21幎床䞊期に怜蚎し取り組み始めた 「新芏開発時の技術遞定の指針」 に぀いお その内容ず背景をお䌝えおしおいきたす。 特に今埌゚ンゞニアずしお匊瀟に入瀟を怜蚎頂ける方に向けお、 どのように技術ず組織に぀いお考えおいるかをお䌝えお出来ればず思いたす。 これたでの技術遞定方針 これたでは、新芏開発時には各プロダクト毎に利甚する技術ツヌル・゜フトりェア)を遞定しお来たした。 各プロダクト毎に利甚する技術ツヌル・゜フトりェア)を遞定するこずで、 プロダクトやそのチヌムにあった開発をし、新しいものを積極的に取り入れるこずを目指しおいたした。 この方針で数幎たちたしたが、この点は達成できおきたした。 ただ、その䞭で特に運甚保守においお䞊手くいかない点・歪みが生たれおきたした。 今回「新芏開発時の技術遞定」の指針にお、郚分的に利甚する技術(ツヌル・゜フトりェアの指針を蚭けるこずによっお 耇数のプロダクトにおいおも暪断的に運甚保守をより効率的に品質高く行うこずを目指したものになりたす。 新芏開発時における技術遞定の指針 今回取り決めた「新芏開発時の技術遞定」の指針に぀いお、 そのたた公開は出来たせんので、3点にポむントを絞っお説明したす。 ■指針1. 以䞋の領域においお、基本ずなるツヌル・゜フトりェアを指針を定矩する パブリッククラりド コンピュヌティング バック゚ンドアプリケヌション開発のプログラミング蚀語 デヌタベヌス CI/CD環境 ここでは党お蚘茉したせんが、 䟋えば「パブリッククラりド」においおは「AWS」を利甚するこず基本ずする、ずいった内容です。 たた、ここに挙げた領域以倖のもので怜蚎䞭のものもありたす。 䟋えば「ネむティブアプリケヌション」に぀いおですが、 瀟内で開発運甚実瞟もありたすが担圓するチヌムが䞀぀になっおいるこずもあり、怜蚎しおいる段階になりたす。 領域やツヌル・゜フトりェアの遞定に圓たっおは、 プロダクトにずっおコアずなる技術領域か、ラむフサむクルはどのくらいを芋蟌んでいるかなど鑑み、 既存システムでの採甚事䟋・既存メンバヌのスキルセットを重芁芖し遞定を行いたした。 ■指針2.「指針1」に蚘茉されおいない堎合は、センタヌ内で話し合い決定する 今埌新芏開発時の芁求芁件によっおは、「指針1」で定矩したものでは実珟出来ない可胜性ももちろんありたす。 その堎合は、新芏開発の担圓チヌムだけではなく、他の開発チヌムも含めセンタヌ内で話し合っお決定しおいきたす。その䞊で、導入事埌のフィヌドバックを行い再評䟡したす。 ■指針3.「指針1」の内容は1幎皋床のスパンで芋盎しを行う 「指針1」の内容も、長い幎月を経るず継続的なメンテナンスに問題が出たり、 より良い代替のツヌル・゜フトりェアが出おくる堎合もありたす。 そういったメリット・デメリットを評䟡せずに技術を硬盎化させるこずは望んではいないため、 定期的に内容を評䟡・芋盎しおいきたしょう、ずいうこずです。 これら指針を軞に、 「暪断的な怜蚎→詊行→評䟡」のサむクルを目指すこずが骚子にあたりたす。 medibaにおける開発の特城 ここでは、medibaにおける開発の特城を取り䞊げ、 「新芏開発時の技術遞定」の背景を説明したす。 倧きな特城ずしお、 䞀぀のプロダクト(システムの新芏開発から運甚グロヌスフェヌズ・保守たで、 瀟内で䞀気通貫で察応するこずが挙がりたす。 たた、「新芏開発」や「運甚」を専門にするチヌムはなく、 あくたでプロダクト毎でのチヌムで担圓するのも特城的です。 瀟内で扱うプロダクトサヌビス数は数十ほどあり、 必然的にチヌム組成の機䌚が倚くなりたす。 䞋蚘の図を䜿っお説明したす。 䟋ずしお、プロダクトAずBの時系列で「新芏開発」「運甚」「保守」のフェヌズず その時点で必芁ずされる゚ンゞニアを図瀺しおみたした。 プロダクトBの運甚フェヌズ開始時に぀いお考えおみたす。 簡単のためにプロダクトAの運甚メンバヌが、プロダクトBの運甚を担うこずになる堎合、 プロダクトAずBの採甚技術が倧きく異なる堎合、 その技術的な習埗、オンボヌディングなどに倧きく時間を取られおしたい、 本来運甚グロヌスフェヌズに期埅されるような積極的な開発やシステムの安定性を高める取り組みが達成できない、 あるいはそもそもチヌム組成が難しいずいった課題が発生しおきたした。 このような背景から䞊述の「新芏開発時の技術遞定」の指針を䜜成したした。 最埌に ビゞョン「良いもの」を届け続ける テクノロゞヌセンタヌのビゞョンずしお、『「良いもの」を届け続ける』がありたす。 日々珟堎での業務を行っおいるず、 短期的な玍期や自チヌムのメンバヌにしか意識が集䞭するこずが倚く、芖点が狭くなりがちです。 時にはこう蚀ったビゞョンに立ち返り、長期的に組織党䜓や業界党䜓にも目を向け぀぀ 「良いもの」を届け続けるために、自分たちが䜿う技術をより良く倉化させおいくこずは、 組織ずしおも個人ずしおも曎なる成長に繋がるず信じおいたす。 ビゞョンの実珟のために、 地道に䞀歩ず぀䞀緒に取り組んで頂ける゚ンゞニアの方の応募をmedibaではお埅ちしおおりたす。
アバタヌ
mediba Advent Calendar 2021 の 18 日目の蚘事です。 こんにちは。゚ンゞニアの䞭畑 @yn2011 です。最近は Switch の月姫で盎死の魔県に぀いお孊んでいたす。 初めに プロダクトを新芏に開発する際に、どんな Lint ツヌルを導入し、どのような蚭定で利甚するかは悩むこずが倚いです。最終的にはチヌムメンバヌず議論をしお決めおいく必芁がありたすが、瀟内倖の他のプロダクトでどのようにしおいるか参考事䟋が欲しい堎合がありたす。業務で開発したプロダクトのコヌドベヌスは瀟倖に公開されるこずは少ないため、他瀟でどのような Lint ツヌルを導入しおいるのかを知る機䌚は少ないです。 そういった背景から、盎近のプロダクト開発においお ① どんな Lint ツヌルを導入しおいるか、② 特に工倫しおいる蚭定は䜕か、 ずいう Lint にフォヌカスした内容を曞いたらどうだろうず考え、今回の蚘事のテヌマずしたした。 昚幎から匕き続き、mediba のプロダクトでは Next.js の採甚が増えおいたす。その䞭のずある Next.js 採甚プロダクトを䟋ずしお今回ご玹介したす。 tsc TypeScript です。Next.js 9 以降は、TypeScript 関連の機胜はビルトむンされおいお yarn build 時に型怜査を行いたすが、型怜査だけを任意のタむミングで行う堎合は、 tsc -p . --noEmit のようなコマンドを実行したす。Lint ツヌルではありたせんが、型怜査のためにだけ䜿甚しおいるので䞀応蚘茉したした。 ESLint ESLint です。Next.js 11 以降は、ESLint 関連の蚭定をビルトむンするようになり、 next lint で実行ず蚭定ができたす。 Next.js 向けのコンフィグずしお、 eslint-config-next がありたす。以䞋のルヌルはオフにしおいたす。 "@next/next/no-img-element": "off", "@next/next/no-html-link-for-pages": "off", "@next/next/next-script-for-ga": "off", "@next/next/no-sync-scripts": "off", Next.js の機胜を掻甚するためのルヌルをなぜオフにしおいるか疑問に思われるかもしれたせんので理由を説明したす。 no-img-element は、Next.js が提䟛する next/image を䜿甚せずに、img 芁玠を䜿甚しおいる堎合に譊告を行うルヌルです。プロダクトでは、SSR ではなく、SSG を䜿甚しおいお next/image は未䜿甚なのでオフにしおいたす。 no-html-link-for-pages は、Next.js が提䟛する next/link を䜿甚せずに anchor 芁玠のみを䜿っおリンクを実装しおいる堎合に譊告を行うルヌルです。next/link を䜿甚するこずで、CSR でペヌゞ遷移を実珟するこずが可胜になりたすが、mediba で利甚しおいる Google Analytics 向けの実装ではペヌゞ遷移時の集蚈に懞念があるこずが分かっおいたす。そういった理由から意図的に next/link を䜿甚しないようにしおいるため、ルヌルをオフにしおいたす。 next-script-for-ga ず no-sync-scripts は、 next/script の仕様をきちんず調査できおいなかったので暫定的に script 芁玠を䜿甚しおいたしたが今埌察応するかもしれたせん。 Stylelint Stylelint です。プロダクトでは、styled-components のような JS in CSS ではなく、 .scss ファむルに定矩した CSS を CSS Modules から利甚しおいるためプロパティの䞊び順の auto fix 等、Stylelint の機胜を党お掻甚するこずができおいたす。 プロパティの䞊び順定矩は、 stylelint-config-recess-order を䜿甚しおいたす。定矩されおいるプロパティの数ずメンテナンスの頻床の面で、他のラむブラリや自身で䜜成するよりも良さそうだったため遞定したした。 たた、 Prettier を䜿甚しおいるので stylelint-config-prettier で競合を防いでいたす。 markuplint markuplint です。HTML Living Standard の仕様に準拠した HTML になっおいるかを怜蚌できたす。React (JSX) にも察応しおいたす。 ルヌルを独自に远加しおいたす。 { "nodeRules": [ { "selector": "meta[property]", "rules": { "invalid-attr": { "option": { "attrs": { "property": { "type": "String" }, "content": { "type": "String" } } } } } } ] } meta 芁玠の属性に぀いおです。SNS でペヌゞを共有された際の挙動を定矩するため、このような meta 芁玠を実装するこずが倚いず思いたす。 <meta content="ペヌゞタむトル"> この実装は markuplint が 2 ぀譊告を出したす。たず、HTML Living Standard の meta 芁玠の仕様には、property 属性が定矩されおいないため譊告を出したす。 たた、name 属性が定矩されおいない堎合に、content 属性を䜿甚するこずができないため、こちらに぀いおも譊告を出したす。 では䞀䜓この属性は䜕なんだ、ずいう話になりたすが、property 属性に぀いおは RDFa で定矩されおおり、 OGP に埓っおこの meta 芁玠を SNS 偎が解釈したす。したがっおここでは䟋倖ずしお取り扱うようにルヌルを倉曎しおいたす。 なお、React 独自の属性 key や dangerouslySetInnerHTML ) は @markuplint/react-spec に含たれおいるため独自にルヌルを远加する必芁はありたせん。䟿利です。 たずめ 盎近の Next.js 採甚プロダクトを䟋に、䜿甚しおいる Lint ツヌルず、その蚭定に぀いおご玹介したした。これらの Lint ツヌルは党お GitHub Actions で commit push をトリガヌにしお実行しおいたすので、ルヌルに違反しおいるコヌドをコミットするずすぐに気づくこずができ、Lint ツヌル運甚の圢骞化を防ぐこずができおいたす。 Lint ツヌルの導入によっお、コヌドベヌスをクリヌンに保぀こずはもちろんですが、暙準仕様やベストプラクティスを知る良いきっかけにもなっおいたす。 Lint ツヌル導入時の参考になれば幞いです。最埌たでお読み頂きありがずうございたした。
アバタヌ
はじめたしお、mediba 新卒2幎目 デヌタアナリストの巊海です。 mediba Adventカレンダヌ 10日目ずいうこずで、私からはGTMを䜿甚しお自瀟サむトにMicrosoft Clarity(ヒヌトマップツヌル)を蚭定したお話を曞いおいきたす。 Microsoft Clarityでできるこず Clarityずは、Microsoft瀟から2020幎10月にリリヌスされた無料のヒヌトマップツヌルです。 Clarityでできるこずは、䞻に以䞋の3぀です。 サむト蚪問者数、離脱者数、任意のペヌゞにおけるスクロヌルされた割合など基本数倀を把握できる 1ナヌザヌにフォヌカスしお、サむト䞊でどんな行動をしたのかセッションレコヌディング(録画)できる どこをクリックしお、どこたでスクロヌルしたのかヒヌトマップで芖芚的に可芖化できる 導入線 蚭定手順 GTMを䜿甚する堎合は、以䞋の順に蚭定しおいきたす。 Microsoft Clarity アカりントを䜜成する GTMを䜿甚し、Clarity tracking codeを配信する GTMのプレビュヌで、蚭定したタグが配信されおいるか確認埌、公開する Clarityの管理画面で、正しく数倀が蚈枬されおいるか確認する Microsoft Clarityのアカりントを䜜成する Microsoft Clarity にアクセスし、赀枠箇所をクリックしおアカりントを䜜成したす。その埌、必芁事項を蚘入したす。 GTMを䜿甚し、Clarity tracking codeを配信する Clarity管理画面 > Settings > SetupからClarity tracking codeをコピヌし、GTMのタグ蚭定画面のHTMLに貌り付けたす。 GTM偎で、タグの䜜成ずトリガヌの蚭定を行いたす。 タグの䜜成は、GTM 管理画面 > タグ > 新芏 から䜜成をしたす。タグずトリガヌの蚭定は以䞋の通りです。 タグの皮類カスタムHTML トリガヌの蚭定All Pages 以䞊で、タグの䜜成ずトリガヌの蚭定は完了です。 GTMのプレビュヌで、䜜成したタグが問題なく配信されおいるか確認する GTMのプレビュヌ画面のTags FiredにMicrosoft Clarityタグが確認できたした。問題なく、タグが発火されおいるようです。公開ボタンをクリックしたす。 GTMの蚭定は以䞊になりたす。 Clarityの管理画面で、正しく数倀が蚈枬されおいるか確認する 最埌に、Clarityの管理画面で、問題なく数倀が蚈枬されおいるか確認したす。タグ公開から2時間ほどで、Clarityのダッシュボヌド画面に数倀が反映されたした。 ヒヌトマップのデヌタも反映され、掻甚できるようになっおいたす。 GTM経由で、自瀟サむトにClarityの蚭定が完了したした。 Session Recordingsに぀いお 以䞋の通り、Session Recordingsも掻甚できるようになっおいたす。ナヌザヌのカヌ゜ルの動きが鮮明に閲芧できたす。 掻甚方法の怜蚎 Clarityはどういった堎面で掻甚するこずができるのかを怜蚎したした。ここでは、仮蚭ずしお、任意のペヌゞの次のペヌゞぞの遷移率が枛少傟向であるずしたす。そうするず、以䞋のような課題発芋から意思決定たでの流れがが考えられたす。 課題発芋 たずは、課題を蚭定したす。ここでは、仮の課題ずしお、「任意のペヌゞの次のペヌゞぞの遷移率が枛少傟向である」ずしたす。 珟状把握・芁因調査 GAの定量デヌタを䜿甚し、課題の芁因を突き止めようずしたす。しかし、定量デヌタだけでは、特に芁因が分かりたせん。 次に、Clarityを䜿甚しお、任意のペヌゞで䜕が起こっおいるのかセッションレコヌディングずヒヌトマップで芁因を調査したす。䟋えば非掻性箇所がクリックされおいるような堎合には「誀クリックで離脱しおいる」ず蚀えるかもしれたせん。 方策 方策ずしお以䞋の案が浮かぶのではないでしょうか。 クリックできない箇所をクリックできるように掻性させる 以䞊のように、GAの定量デヌタでは普段発芋できないようなナヌザヌの行動でもClarityを䜿甚すれば、簡単に把握するこずができるでしょう。その結果、意思決定に぀ながるず考えおいたす。 おわりに GTMを䜿甚するこずで、゚ンゞニアに䟝頌せずずも、Clarityを蚭定できるのは䟿利かず思いたす。 Clarityは無料でか぀実装に手間がかかりたせん。そしお、ヒヌトマップやセッションレコヌディング機胜など倚様な機胜も魅力的です。ぜひご自身のサむトにClarityを導入しおみおはいかがでしょうか。 どなたかのご参考になれば、幞いです。
アバタヌ
こんにちは。゚ンゞニアの䞭畑 @yn2011 です。千葉県は最高です。 今回は NewRelic ブラりザモニタリング を䜿甚しお JavaScript の゚ラヌ収集を行おうずした際に、NewRelic の゜ヌスマップアップロヌド機胜の仕様で色々ずハマっおしたったずいうお話をしたす。 ゜ヌスマップアップロヌド API に぀いお NewRelic ブラりザモニタリングでは、゜ヌスマップずいうファむルを利甚しお発生した JavaScript ゚ラヌのスタックトレヌスを取埗するこずができたす。 ゜ヌスマップは、以䞋のような内容のファむルです。 { "version": 3, "file": "static/chunks/254-be419541614271942b8c.js", "mappings": "gFAAoEA,... } NewRelic ブラりザモニタリングには゜ヌスマップのバヌゞョン管理機胜があり、゜ヌスマップにナニヌクな識別子をアップロヌド時に付䞎するこずができたす。提䟛されおいる゜ヌスマップのアップロヌド API を利甚しおアップロヌド時に識別子の付䞎ができたす。 publishSourcemap({ sourcemapPath: './dist/bundle.js.map', javascriptUrl: 'https://example.com/assets/bundle.js', ... releaseName: 'OPTIONAL RELEASE NAME', // 远加 releaseId: 'OPTIONAL RELEASE ID', // 远加 }, function (err) { console.log(err || 'Source map upload done')}) releaseName ず releaseId を指定できるこずに違和感を持った方もいるかもしれたせん。これは次項の䌏線です。 ハマリポむント releaseId ず releaseName は䞡方必須 早速䌏線を回収したす。NewRelic ブラりザモニタリングでバヌゞョン管理を行う堎合は、 releaseName ず releaseId の䞡方が必須になりたす。 ドキュメントに蚘茉はないように認識しおいたすが、 @newrelic/publish-sourcemap の実装を確認するず、しっかり条件匏に含たれおいたした。 if (releaseName && releaseId) { console.log('Using release name:', releaseName, 'and release id:', releaseId) request = request.field('releaseName', releaseName) request = request.field('releaseId', releaseId) } コミットハッシュを掻甚する堎合など、どちらか 1 ぀の項目を利甚できれば十分なこずが倚いず思いたす。なぜこのような仕様になっおいるのかは分かりたせんでした。 コンフリクト゚ラヌ ゜ヌスマップのバヌゞョン管理を行わない堎合は、 releaseName ず releaseId を指定する必芁はありたせん。しかし、1 床これらの項目を空でアップロヌドしおしたうず、次にアップロヌドする際に releaseId ず releaseName を指定しおアップロヌドしおもコンフリクト゚ラヌずいうレスポンスが返り、アップロヌドが倱敗したす。 コンフリクト゚ラヌは、NewRelic に同䞀の゜ヌスマップをアップロヌドした堎合に発生する仕様ずなっおいたす。 releaseName ず releaseId が異なる堎合は別の゜ヌスマップずしお解釈されるためアップロヌドが可胜です。 バヌゞョン管理を行う堎合は、1床、 releaseName ず releaseId が空の゜ヌスマップを削陀し、再床アップロヌドする必芁がありたす。 ブラりザ偎で addRelease を呌び出す必芁がある ゜ヌスマップのバヌゞョン管理を行う堎合、ブラりザ偎で browser agent API から次のメ゜ッドを呌び出す必芁がありたす。 newrelic.addRelease(string $release_name, string $release_id) このメ゜ッドを呌び出さないず、発生した JavaScript ゚ラヌを正しいバヌゞョンの゜ヌスマップにマッピングするこずができたせん。メ゜ッドを呌び出さずに JavaScript ゚ラヌを発生させた堎合、NewRelic の画面䞊では releaseName ず releaseId は空になりたす。 addRelease の呌び出しの実装ずしおは、スニペットの末尟ぞの远加が可胜です。 NewRelic ブラりザモニタリングを利甚する堎合は、New Relic から提䟛されるスニペットをブラりザで実行する必芁がありたす。このスニペットの実行埌に、browser agent API が利甚可胜になるため、以䞋のように末尟に呌び出しを远加したす。 // 省略... applicationID:"${config.applicationID}",sa:1}; newrelic.addRelease("foo", "bar"); // 远加 addRelease の呌び出しは、類䌌サヌビスである Sentry では䞍芁であったため、怜蚌時に気づかずハマっおしたいたした。 たずめ NewRelic ブラりザモニタリングの゜ヌスマップに関するハマりポむントを 3 ぀曞きたした。 最終的に、プロダクトでは゜ヌスマップバヌゞョン管理機胜の導入は芋送りたしたが、今埌必芁に応じお察応を怜蚎する予定です。 最埌たでお読み頂きありがずうございたした。
アバタヌ
はじめに こんにちは、SRE Unitの北浊( @kitta0108 )です。 圓ブログは、執筆掻動をモブでやったらどうかずいう新しい詊みをしおおりたしお、 テクノロゞヌセンタヌ6G Managerの䞋地さん( @primunu )、 SRE Unitの板谷さん( @mary_tuba )、 そしお北浊の3人でお送りしおおりたす。 さお、皆さんはアプリケヌションの実行基盀ずしおのコンテナむメヌゞを遞定するずき、どのような関心軞を持っお望んでたすか 今回はDistrolessむメヌゞに぀いお、䜕の嬉しみがあるのか、どのような優䜍性があるのかなどを深掘りっおいきたいず思いたす。 皆さんの匕き出しの䞀぀ずしお、知芋に加えおいただけるようなこずがあったならずおも嬉しく思いたす 察象者 むメヌゞを遞定する人 = DockerFileを曞く人 むメヌゞの脆匱性察応を匷めたい人 コンテナサむズの軜量化を远い求めたい人 抂芁 Distrolessずは、Googleが公開しおいるアプリケヌションずそのランタむム䟝存のみが含たれたDebian10(buster)に基づいお䜜成されたコンテナむメヌゞです。 https://github.com/GoogleContainerTools/distroless 必芁な䟝存のみが含たれるずは Distrolessにはアプリケヌションの実行に必芁な䟝存しか含たれおいたせん。 なので、Shellはおろか、aptやcdずいった機胜も有しおいたせん。 だが、それが良い。それで良いのです。以䞋をご芧ください。 この図はAWSのECRにそれぞれ以䞋のプレヌンむメヌゞをプッシュした結果になりたす。 Goのアプリケヌションを動かすずいう前提でむメヌゞを遞んでたす。 alpine:3.13 golang:1.16.5-buster gcr.io/distroless/static-debian10 どうでしょうか。この時点で嬉しみポむントが2぀芋えおいたせんか 嬉しみポむントその1 軜量であるずいうこず Debianの318MBずいうのは眮いおおいおw Alpineの2.81MBず比范しおもDistrolessの0.66MBはめちゃくちゃ軜いです。 コンテナを扱う䞊では、むンフラの振る舞いずしお、スケヌリング性胜や可搬性の向䞊を期埅したいですから、この軜量ポむントは嬉しいですよね。 嬉しみポむントその2 セキュアであるずいうこず 実はこっそりずECRにImage Scanning機胜をONにしおおきたした。 ここでもDistrolessむメヌゞは堂々のNoneの文字が… アプリケヌションを実行する䞊で䜙分な䟝存が含たれないずいうこずは、それだけ脆匱性が露呈する可胜性が䜎くなるこずにも繋がりたす。 コンテナむメヌゞのレむダヌでここを抑えられるのは嬉しいポむントですよね。 むメヌゞのバヌゞョン䞊げ䜜業の頻床も少なくなりそうです。 たずめ 今回はアプリケヌションコンテナのむメヌゞずしおDistrolessを玹介しおみたしたがいかがでしたでしょうか。 利甚しおいる蚀語がDistrolessに察応しおいるのであれば、積極的に利甚を怜蚎しおもいいず個人的には思いたす。 ただし、Distrolessを利甚したむメヌゞの䜜成にはShellが含たれおいないずいう点でちょっずしたコツが必芁になりたす。 時間があったら、むメヌゞの䜜成方法などを具䜓的にしたものを曞いおみようかな…
アバタヌ
はじめたしお、2021幎床新卒の朚村です。 フロント゚ンド゚ンゞニアずしお テクノロゞヌセンタヌ5G に所属しおいたす。 今回は、Nuxt.js ならびに TypeScript を利甚しお、簡単な抜遞ツヌルを䜜成しおみた内容に぀いおご玹介したす。 Nuxt.js ず TypeScript Nuxt.js は、Vue.js ベヌスの JavaScript のフレヌムワヌクです。Webペヌゞ構築に有甚な UI 以倖の機胜 Ajax やサヌバヌサむドレンダリングなどをたずめお利甚できる環境を提䟛しおくれたす。 Nuxt.js 公匏サむト TypeScript は、省略可胜な静的型付けずクラスベヌスオブゞェクト指向を加えた JavaScript のスヌパヌセット䞊䜍互換です。䞀蚀で蚀うず「型定矩できる JavaScript 」。 TypeScript 公匏サむト なぜ抜遞ツヌルを䜜ったのか 䞻な理由は、以䞋の2点です。 私の所属するチヌムで扱っおいる Nuxt.js および Typescript の抂芁を掎むため チヌム内でMTGのファシリテヌタが偏っおしたう課題を解決するため 完成物 さっそくですが、完成した物がこちら。 ランダムにナヌザヌを抜遞できるシンプルなツヌルです。 デザむンは近幎流行ったニュヌモヌフィズムを取り入れおみたした。 少ない配色でも凹凞によっお奥行きができるので、シンプルなツヌルでも芋栄えが良くなりたす。 䜿った技術 Nuxt.js 2.15.7 TypeScript 4.2.4 Vue.js 2.6.14 Vuex 3.6.2 firebase 8.7.1 tailwindcss 2.2.4 sass 1.35.1 環境 M1 Mac VSCode yarn 機胜 今回の抜遞ツヌルの機胜は以䞋ずおりです。 ナヌザヌを登録・削陀する ナヌザヌ情報をDBで保持する 登録したナヌザヌからランダムに抜遞する 完了した人・䌑みの人にチェックし、抜遞察象から倖す 抜遞終了埌、遞ばれた人は自動で完了チェックされる 党員チェックしたら䞀括リセットできる 䜜成手順 党䜓的な流れは以䞋のずおりです。 環境構築 各機胜䜜成 Vuex導入 firebase導入 1. 環境構築 create-nuxt-appを利甚しお環境を構築したした。 create-nuxt-app 公匏サむト ず Nuxt.js 入門の蚘事 を参考にしたした。 2. 各機胜䜜成 前述した各皮機胜を実装しおいきたす。 欠垭者の察応 完了した人だけでなく、䌑みの人など抜遞察象から陀倖したい堎合を想定しお、完了チェックずは別に陀倖したいナヌザヌを指定できるようフラグを持たせおいたす。 コンポヌネントに぀いお 個人的に苊劎したのはコンポヌネント呚りです。 たず、どのくらいの単䜍で区切れば良いのかがわかリたせんでした。 そこで今回は Atomic Design を参考に切り出したした。 たた、他の箇所でも䜿えるように汎甚的に䜜るこずです。 クリックなどのむベントは党お芪ぞ枡し、スタむルや衚瀺の倉曎は芪から倀を枡すようにするこずで、atoms単䜍のコンポヌネントがどこでも䜿えるよう心がけたした。 䟋えばボタンコンポヌネントは、予めいく぀かのスタむルを定矩しおおき、芪コンポヌネントで䜿うずきに䞋蚘のように props で必芁なスタむルを枡すずずもに、$emit でクリックむベントを芪に枡しおいたす。 //Button.vue <div> <button :class="[ colorStyle[buttonColor], sizeStyle[buttonSize], fontStyle[buttonFont], ]" @click="$emit('button-click')" > <slot></slot> </button> </div> //Input.vue <Button button-color="gray" button-size="short" button-font="small"> ADD </Button> そしおコンポヌネント間のデヌタの受け枡しです。 䟋えばナヌザヌ情報は、子から emit で芪コンポヌネントに倀を匕き枡し、さらに別の子コンポヌネントに props で枡しお衚瀺しおいたす。 今回はシンプルなツヌルなのでコンポヌネントも少ないですが、こうした受け枡しが重なっおくるずコヌドが煩雑になりメンテナンスがしづらくなりたす。そこで、Vuex を導入し状態管理をするこずにしたした。 3. Vuex 導入 Vuex のストアでナヌザヌ情報の状態を管理したす。 今回はDBも䜿う予定なので、actions でDBに接続した埌、倀を state に反映させおいたす。 Nuxt.js は store ディレクトリにファむルを䜜成するだけでストアを有効化しおくれるので䟿利ですね。今回は管理するのがナヌザヌ情報だけなので、index.ts を䜜らず users.ts を盎䞋に䜜りたした。 Vuex ストアでデヌタを䞀元管理できるので、本圓にわかりやすくなりたした。コンポヌネントを超えお共有される情報を管理するには、ずおも匷力なツヌルだず思いたす。 䞀方で、Vuex を䜿甚する際には、泚意点もありたす。 䟋えば、小さいレベルのコンポヌネントからは Vuex を䜿甚しない方が良いでしょう。 コンポヌネントの䜿い回しが難しくなるのず、画面の䞭で耇数の箇所から Vuex のストアぞの参照ず倉曎が入り組んだ堎合、凊理が远いにくくなるためです。 参考 Vuexはなるべく避ける     Vuexで䜕をするか、䜕をしないか Vuex を利甚する際は、 Atom や Molecule レベルのコンポヌネントの䞭では䜿わない 、 state を盎接参照しない 、などのルヌルを蚭けお運甚したいず思いたす。 4. firebase 導入 DBずデプロむは firebase を利甚したす。 firebase は以前にも䜿ったこずがありたしたが、やはり firestore を䜿えば面倒な手間をかけずにDBが実装できたすね。䞇歳。 デプロむも firebase の Hosting を䜿っお行いたした。 さらに、今回は瀟内向けツヌルなので、デプロむにあたり倖郚からのアクセスを制限するため、 Authentication を䜿甚しおログむン認蚌を远加したす。管理者アカりントずしおナヌザヌを䞀人だけ登録し、簡単なPWを打おば誰でも䜿えるようにしたした。 ログむンしおいない状態では認蚌埌のペヌゞぞ飛べないようにするため、匷制的にindexぞリダむレクトするmiddlewareも远加しおいたす。 const auth = firebase.auth() const middleware: Middleware = ({ route, redirect }) => { auth.onAuthStateChanged((user) => { if (!user && route.name !== 'index') redirect('/') }) } たた、Authentication の認蚌状態は、デフォルトではナヌザヌがブラりザを閉じた埌でも氞続的に維持されるようになっおいたす。 今回は管理者アカりント䞀぀だけの䜿甚になるため、ログアりトせずにりィンドりを閉じおしたうず、他の人がアクセスした時でも前のセッションが続くこずになりたす。 そこで、 firebase.auth().setPersistence メ゜ッドで氞続性タむプを SESSION に倉曎するこずで、りィンドりやタブを閉じるたびにログむン状態がクリアされるようにしたした。 ちなみに、Nuxt.js には nuxt/firebase ずいうモゞュヌルがありたす。firebase をより簡単に利甚できるので、興味があればご芧ください。 詰たったずころ sass の導入 sass の導入で沌りたした。どうやら node のバヌゞョン16 か぀ M1チップ だず node-sass が動かないようです2021/09 執筆時点。node のバヌゞョンを䞋げるこずで解決したした。 型定矩 Vuex での型定矩、props での型定矩、firebase で扱う日時の型定矩  型掚論が効かず、気づけばanyになっおいる型に苊しめられたした。 特に Vuex は、ストアぞアクセスするための䟿利な型がなく、今回䜿甚した this.$store は Nuxt.js で型指定されおいたせん。 自前の型を䜿うか、 nuxt-typed-vuex を利甚するこずで改善するしかないようです。 たた、 TypeScript ず Vuex の盞性は良くなく、コンポヌネントから store を呌び出したずきに型安党が守られない、むンテリセンスが効かないずいった問題がありたす。 次に TypeScript で Vuex を扱う際は、Nuxt.js 公匏で掚奚されおいる vuex-module-decorators を䜿甚したいず思いたす。 振り返り さお、ここたで長々ず曞いおきたしたが、今回のアりトプットを通しお Nuxt.js ず TypeScript の抂芁は倧䜓掎めたかな、ずいう感じです。 結論、Nuxt.js 䟿利 日本語ドキュメントが充実しおいおほが誰でも簡単に始めるこずができる ルヌティングを自分で䜜成する必芁がない SSRなどモヌドを遞べるお柔軟なサむト蚭蚈ができる  など、Nuxt.js を䜿うこずで盎感的にDOMの内容を操䜜でき、より簡単に抜遞ツヌルを䜜るこずができたした。 たた、TypeScript に぀いおも、型定矩のおかげで、コンポヌネント間のデヌタの受け枡しでもどういう型か刀断でき、コヌドが芋やすくなりたす。 さらに、力補完のおかげでコヌドを曞く時間を短瞮できる、゚ラヌチェックを機械に任せるこずができる、など倚くのメリットがありたした。 䞀方で、Vuexずの連携は公匏で掚奚されおいるパッケヌゞを䜿うなど、改善の䜙地がありたす。 最埌に 以䞊、Nuxt.js を利甚しお抜遞ツヌルを䜜成しおみた内容の玹介でした。 最埌たで読んでいただき、ありがずうございたした。 どなたかの参考になれば幞いです。
アバタヌ
こんにちは。゚ンゞニアの䞭畑 @yn2011 です。8 月から千葉県民になりたす。 先日、新チヌム発足にあたり、チヌムビルディングのワヌクショップずしお有名なむンセプションデッキの䜜成にチャレンゞしたした。その際に改めおむンセプションデッキに぀いお勉匷し盎したのですが、 実際にチヌムがどういった経緯で、どのようにむンセプションデッキを䜜成したか 、ずいう具䜓的な事䟋の公開が少ないなず感じたした。 そこで今回は、私達が ① なぜむンセプションデッキを䜜成し、② どのようにワヌクショップを進めたのか、③ そしお䜕が埗られたのか に぀いお曞きたいず思いたす。 なぜむンセプションデッキを䜜成したか 新チヌム発足 新プロダクトの開発が決たり、ビゞネスチヌムが先行しお䌁画ず芁求の掗い出しを行っおいたした。ある皋床の敎理が完了したため、デザむナヌず゚ンゞニアが合流し、本栌的に開発を始めおいくぞ、ずいう経緯で新しいチヌムが圢成されたした。 したがっお、ここで蚀う「チヌム」ずは、特定の職皮のみで構成されたチヌムではなく、ビゞネスのメンバヌやデザむナヌ等プロダクト開発に必芁な党おの職皮を含むチヌムです。 ちなみに、゚ンゞニア同士、ビゞネスのメンバヌ同士はこれたでも同じチヌムで仕事をしおいたしたが、゚ンゞニアずビゞネスのメンバヌ同士はほが䞀緒に仕事をしたこずがありたせんでした。 䜕が課題だったか デザむナヌず゚ンゞニアは途䞭からビゞネスチヌムに合流したわけなので、これから開発するプロダクトの目的やプロゞェクトずしお䜕を重芁芖しおいるのか等をしっかり理解できおいたせんでした。したがっお、 プロダクトの芁求事項が曞かれたドキュメントを読んでも、それが適切なのか、なぜ必芁なのかずいう郚分の理解や玍埗床が䜎い 状態でした。 たた、プロダクトの開発を始めるためには、芁求を芁件に萜ずし蟌んだ䞊で初回にリリヌスをする範囲(MVP) を決める必芁もありたした。 どうするか この 2 ぀の課題に぀いお、チヌムメンバヌず盞談し、むンセプションデッキを䜜成するこずず、ナヌザヌストヌリヌマッピングを行うこずで課題を解決するこずになりたした。なお、この蚘事ではむンセプションデッキに぀いおのみ取り扱いたす しかし、やろうずいうのは簡単ですが、実際に私がむンセプションデッキ䜜成のワヌクショップを䌁画するにあたり、いく぀もの課題に盎面するこずずなりたした。ずおも珟堎感溢れるものです。 䟋えば時間の面では以䞋の課題がありたした。 参加しお欲しい関係者は 15 人以䞊で、党員が参加可胜な日皋の調敎が難しい 既に倚くの予定が組たれおいお、1 時間以䞊の時間の確保が難しい プロダクトのリリヌス日は倧たかに決たっおいたこずから、できるだけ早く完了させなければいけない これらの制玄から、むンセプションデッキは 10 個の項目で構成されおいたすが、重芁だず思ういく぀かの項目を遞択し、それ以倖の項目は怜蚎察象から倖したした。そしお、ワヌクショップは 1 回 1 時間で、耇数回に分割するこずずしお、䜕ずか党員参加のワヌクショップ実斜の芋通しを立おるこずができたした。ちなみに、参加可胜なメンバヌだけで実斜しお埌で結果を共有する、ずいったやり方はせず極力党員参加に拘りたした。むンセプションデッキは結果ず同じぐらい構築過皋の議論が倧事だず考えおいたためです。 たた、内容の面では以䞋の課題がありたした。 むンセプションデッキのワヌクショップを実際にファシリテヌトした経隓のあるメンバヌがいない そもそもむンセプションデッキを知らないメンバヌも倚い これらに぀いおは、私が曞籍や Web から情報を埗぀぀創意工倫しお実斜しおいくこずになりたした。 どのようにむンセプションデッキを䜜成したか 怜蚎の結果、ワヌクショップのアゞェンダは以䞋になりたした。かなり厳遞し、最䜎限必芁だず思う 3 ぀の項目のみを遞びたした。 自己玹介 むンセプションデッキの説明 我々はなぜここにいるのか ゚レベヌタヌピッチ トレヌドオフスラむダヌ 分割しおワヌクショップを行うこずにしおいたので、初回は「我々はなぜここにいるのか」たでで、次回に残りのアゞェンダを消化したした。 では、それぞれどのように進めおいったのか、圓日の様子ず合わせおお䌝えしおいきたす。「自己玹介」、「むンセプションデッキの説明」に぀いおは䞀般的なものなので省略したす なお、付箋を䜿いたいこずず、原則圚宅勀務のため Miro を䜿甚しおオンラむンで実斜したした。 我々はなぜここにいるのか 「我々はなぜここにいるのか」は、プロゞェクトの目的に぀いお認識を合わせるためのワヌクショップです。 最初に個人ワヌクの時間を取っお、1 人ず぀自分の考えを付箋に曞いおもらいたした。その埌に共有の時間を取り、ファシリテヌタヌが補足や質問ず、䌌おいる意芋のグルヌピングをしおいきたした。 こちらが実際のワヌクショップの結果です。 グルヌピングは難しいですが、倧きくは定性的なものず定量的なもので 2 ぀に分けたした。䞊の図では 3 ぀に分かれおいたすが、定性のものを曎に 2 ぀に分割しおいたす。 䟋えば、定性的な目的は「ナヌザに〜ずいう䟡倀を提䟛する」等で、定量的な目的は「利甚率 x % 向䞊」等です。 基本的にどの意芋も間違っおいるずいうこずはないのですが、どうしおも定性的なものほど達成できたかどうかを刀断しにくく解釈にもブレがありたす。定量的で、 達成できなければプロゞェクトが解散になるものはどれか ず問い盎すこずで、明確な目的を探しおいきたした。ここは前提ずなっおいるむンプットの差もあるので、ビゞネスチヌムの方々にリヌドしお決めお頂きたした。ただし、今回はこの時点では具䜓的な数倀たでは盛り蟌めたせんでした。ひずたずはプロゞェクトが向かっおいく方向の認識を合わせるこずが倧事なので、蚈枬可胜な指暙であるならば良いのかなず思いたす。 ゚レベヌタヌピッチ ゚レベヌタヌピッチは、事前に甚意されたテンプレヌトを埋めるこずで、プロダクトの骚栌を明らかにするワヌクショップです。 ちなみに、通垞 ゚レベヌタヌピッチは 1 プロダクトに察しお䜜成したすが、今回は関連するプロダクトが耇数存圚しおいたので同じ時間に耇数の゚レベヌタヌピッチを䜜成したした。耇数プロダクトを同時に開発する必芁があったのです珟実は教科曞通りにはいかないずいうこずが実感できたす ゚レベヌタヌピッチの進め方ずしおは、テンプレヌトの項目を 1 ぀ず぀埋めおいく方法を取りたした。1 ぀の項目毎に、個人ワヌク → 共有 → グルヌピング → 最終的な答えずいう手順を螏みたした。初めは、䞀気に党おの項目を埋めおもらい 1 人ず぀共有しおもらったのですが、付箋の敎理がしにくいのず、最初の項目の認識が合っおいないず埌半の内容も異なっおくるのでやり方を倉えたした こちらが実際のワヌクショップの結果です。右の付箋が個人ワヌクで曞いお頂いたもので、巊の赀い付箋が敎理した結果です。 ゚レベヌタヌピッチで意芋が分かれやすかったのは「ナヌザは誰なのか」ず「差別化芁玠は䜕なのか」でした。定矩が難しいからなのか、 経隓䞊この郚分が曖昧なたたプロダクトの開発が進行するこずも倚いので最初に確認できる のはこのワヌクショップの利点だず感じたした。 トレヌドオフスラむダヌ トレヌドオフスラむダヌはプロゞェクトプロダクトで䜕を倧切にするかの優先順䜍を決めるワヌクショップです。 今回はプロダクトずいうよりは初回のリリヌスたでに時間を区切ったプロゞェクトずしおの優先順䜍ずしお怜蚎したした。 けっこう悩みたしたが、進め方は以䞋にしたした。付箋をドットシヌルずしお利甚するむメヌゞです 個人ではなく職皮ごずに色分けした付箋を利甚する゚ンゞニアなら黄色等 個人毎に自分の職皮に該圓する付箋を利甚しお、1 番優先順䜍が高いず思うものに投祚 次に 1 番優先順䜍が䜎いず思うものに投祚 投祚結果を元にプロゞェクトずしおの合意を圢成する こちらが実際のワヌクショップの結果です。今回は郜合により予算は怜蚎から倖したした予算の増枛が実質的に䞍可 スラむダヌの各項目は、スコヌプ、時間、品質等の蚀葉が䜿われたすが、必芁に応じお蚀い換えを行うこずによっお参加者の認識霟霬を防いでいたす。 個別の芁玠の評䟡倀が 2 なのか 3 なのかずいった郚分はあたり議論せず、重芁なものに぀いおざっくりず認識を合わせたした。優先順䜍が䞭間のものに぀いおは、正盎あたりプロゞェクトの進行䞭に意識されるこずは少ないず思ったためです。たた、個人毎ではなく、職皮毎にしたのは参加人数が倚いためです。職皮毎の傟向を倧たかに把握した方が効率良く議論できるず考えたした。 トレヌドオフスラむダヌによっお、 リリヌスの期日に察するステヌクホルダヌの枩床感等、プロゞェクトの制玄に぀いお党員の認識を揃えるこずができる のは利点だず感じたした。たた、プロゞェクト䞭盀での機胜远加や方針倉曎に察しお、トレヌドオフスラむダヌの優先順䜍に埓っお意思決定や議論を行える点も魅力的です。 むンセプションデッキをやっおみおどうだったか むンセプションデッキのワヌクショップの終了埌に、参加者の方々から感想を頂きたした。 むンセプションデッキの䜜成がどういったものか知るこずができた ワヌクショップ圢匏で議論ができたこずによっお、プロダクトに぀いお理解が深たったり認識霟霬があるこずに気づけた ずいったポゞティブな感想を頂きたした。むンセプションデッキによっお、 圓初の課題であった「プロゞェクトの目的や䜕を重芁芖しおいるのかの理解䞍足」を補うこずに貢献できたず蚀えそうです 。 たた、プロダクトに぀いおも゚レベヌタヌピッチによっお耇数芳点から議論するこずで、以前より理解が深たりたした。 テンプレヌトが決たっおいるこずによっお、芳点挏れが少ないのず、質問しにくいこずも党お議題に乗せるこずができる のも良かったです。次の工皋であるナヌザヌストヌリヌマッピングを行うための最䜎限の共通認識の圢成にも圹立ちたした。 䞀方で 発蚀に偏りがある ツヌルの䜿い方には少し戞惑った 最終的なたずめをもう少ししっかりやりたい ずいった意芋も頂けたした。 発蚀の偏りに぀いおは、私のファシリテヌション胜力が足りおいないのず、ワヌクショップの時間にゆずりを持たせるこずができなかったこずも䞀因だず思いたす。時間に远われおいお、進行を優先しすぎおいたした。 ファシリテヌションの際には、 むンセプションデッキを完成させるこずだけが目的ではなく、党員でフラットな議論をするこず・共通の認識を䜜るこずも意識するこずが倧事 ずいう孊びがありたした。 たた、最初に Miro の䜿い方に慣れる時間や、最埌にむンセプションデッキ党䜓を振り返る時間も考慮したアゞェンダを䜜成するずより良いものになりそうです。 たずめ 新チヌムの発足にあたり、むンセプションデッキの䜜成を行うに至った経緯ず、ワヌクショップの実斜方法、その結果埗られた成果や知芋に぀いお曞きたした。 新しいプロゞェクトを始める際や既存のプロゞェクトの方向性が曖昧になっおしたっおいるず感じられおいる方は、むンセプションデッキの䜜成に挑戊しおみるず䜕らかの手がかりになるかもしれたせん。 最埌たでお読み頂きありがずうございたした。
アバタヌ
はじめに はじめたしお、2021幎4月新卒入瀟の土屋( @hrktcy )です。バック゚ンド゚ンゞニアずしお6月にテクノロゞヌセンタヌ Eng6G に所属したした。 背景 Eng6G では スマプレチャレンゞ ず呌ばれるサヌビスを、サヌバレスなシステムを構築しお開発・保守・運甚しおいたす。たたバック゚ンドには Go を採甚しおおり、比范的モダンな技術スタックによるプロダクト開発が行われおいたす。 [参考]mediba に入瀟したらアゞャむル志向のチヌムで最高だった件〜モブワヌク無双でテレワヌクを超越したす〜 Go は基本的に暗黙的型倉換が認められないため、開発関連のタスクを党おモブで行う匊チヌムにおいお、ナビゲヌタヌがレビュヌしやすいずいうメリットがありたす。たたモダンな技術を扱うこずで、゚ンゞニアずしおの垂堎䟡倀も高たるず考えおいたす。 そこで Go 未経隓の私がバック゚ンド゚ンゞニアずしおゞョむンするにあたり、孊習ずアりトプットを兌ねお、本皿では  Go でスクレむピングした  mediba+  の蚘事を Slack に投皿するバッチを䜜った話 を備忘録ずしお残したいず思いたす。 開発環境 M1 Mac Docker 20.10.7 Golang 1.14 Terraform 1.0.1 AWS provider 3.49.0 事前準備 Slack API トヌクンを生成しおおく Slack に投皿する App を䜜成し、予め API トヌクンを取埗しおおきたす。   Slack API  ぞアクセス 「  Create an app  」をクリック 「  Create New App  」をクリック 「 名前 」ず「 ワヌクスペヌス 」を指定する アプリを䜜成した埌に衚瀺されたペヌゞで「  Permissions  」をクリック 「  Scopes  」の項目で  chat:write  暩限を蚭定 「  Install App to Workspace  」をクリックし API トヌクンを取埗する バッチの仕様を固める Go でスクレむピングした mediba+ の蚘事を Slack に投皿するにあたり、たずはバッチの仕様を固めるこずにしたした。 スクレむピング方法 スクレむピング系のパッケヌゞ(  goquery  , etc. )を甚いるこずもできたすが、今回は mediba+ の RSS フィヌドをパヌスするこずでスクレむピングを行いたす。圓たり前ですがスクレむピング先の情報が曎新される床にフィヌドの内容は倉曎されたす。バッチ実行時点の日時ず、スクレむピング先の蚘事日時を参照する必芁がありたす。そこで今回は、バッチ実行時点の日時に曎新された蚘事のみを Slack に投皿するようにしたす。 同䞀蚘事を重耇しお投皿しない バッチを実行するたびに同䞀蚘事が投皿されるのは避けたいです。これに぀いおはテヌブルにスクレむピングした蚘事情報を栌玍しおおき、 Slack に投皿する文章を生成する前段階で、蚘事が投皿されたものなのかを刀定する必芁がありたす。 バッチの運甚方法 バッチプログラムを任意の日時に実行されるような環境を敎えたいです。これに぀いおは ECS Fargate + CloudWatch Events で任意の日時にバッチが実行されるような環境を構築するこずで解決したす。本皿では以䞋のシステムを構築したした。本システムは Terraform によっお䞀元管理しおいたす。 ゜ヌスコヌド 1. DB ぞ接続する Go の OR マッパヌずしお提䟛されおいる  gorm  を甚いお、 env ファむルに蚘茉した DB の情報から接続を行いたす。 DBTYPE := "mysql" USER := os.Getenv("USER") // ナヌザ名 PASS := os.Getenv("PASS") // パスワヌド ENDPOINT := os.Getenv("ENDPOINT") //゚ンドポむント DBNAME := os.Getenv("DBNAME") //デヌタベヌス名 CONNECT := USER+":"+PASS+"@tcp("+ENDPOINT+":3306)/"+DBNAME+"?charset=utf8&parseTime=True&loc=Local" db, err := gorm.Open(DBTYPE, CONNECT) if err != nil { fmt.Println("DB接続倱敗") panic(err) } fmt.Println("DB接続成功") 今回接続先のテヌブル情報は䞋図の通りです。 蚘事タむトル(title)ず URL (link)、投皿枈み刀定(status)の3぀のカラムを定矩しおありたす。 2. mediba+ の蚘事をスクレむピングする RSS フィヌドからバッチ実行時の日時に投皿された蚘事をスクレむピングしテヌブルぞ insert したす。フィヌドの取埗には  gofeed  を甚いたす。 # mediba+をスクレむピングする fp := gofeed.NewParser() feed, _ := fp.ParseURL("https://koho.mediba.jp/feed/") 倉数 feed にはパヌスされたフィヌドが栌玍されおおり、 feed.Items で投皿蚘事党おを取埗するこずができたす。今回はバッチ実行時点の日時に曎新された蚘事のみを取埗するために、芁玠1぀1぀を for 文で回し、各蚘事の投皿日時ずバッチ実行時の日時を比范したす。 比范するにあたり、パヌスされた PubDate(UTC) は string 型なので time 型ず比范するこずができず、スクレむピング先によっおはフォヌマットも違う可胜性があるため合わせおあげる必芁がありたす。たた PubDate を JST にする必芁もありたす。 こちらに぀いおは RFC1123Z フォヌマットで統䞀したした。たず PubDate を time.Parse で倉換したす。さらにそれを RFC1123Z のフォヌマットに倉換し、タむムゟヌンを JST にするこずで、投皿日時ずバッチ実行時の日時を比范したす。公匏フォヌマットは こちら から参照できたす。 // RSS構造䜓 type Article struct { link string published string } // RSSのPubDateを文字列→日時の型に倉換、それをRFC1123ZのFormatに倉換し、タむムゟヌンをJSTにする for _, item := range feed.Items { m := make(map[string]Article) if item == nil { break } var timeParse = time.Time{} timeParse, _ = time.Parse(time.RFC1123Z, item.Published) pubDateJST := timeParse.In(time.FixedZone("Asia/Tokyo", 9*60*60)).Format(time.RFC1123Z) // 以䞋Insert凊理 ... } 投皿日時ずバッチ実行時の日時が同じ時、構造䜓 m に蚘事の情報を栌玍し、 gorm を甚いおテヌブルに insert すれば OK です。このずき、 status カラムにはデフォルト倀ずしお false を入れおおきたす。 3. Slack に投皿する Slack に投皿する凊理は以䞋の通りです。 // envファむルに蚘茉したAPIトヌクンからクラむアントを生成する tkn := os.Getenv("TOKEN") c := slack.New(tkn) _, _, err := c.PostMessage("#チャンネル名", slack.MsgOptionText( " テキスト " , true)) if err != nil { panic(err) } else { fmt.Println("投皿完了") } テヌブルに栌玍されおいる、投皿日時がバッチ実行時の日時ず同じ䞔぀ status が false の蚘事のタむトルずリンクを取埗し、 slack.MsgOptionText の第䞀匕数に代入したす。蚘事1぀1぀を連投するず Slack の通知が倚くなり煩わしく感じるので、 string 配列の䞭に取埗した蚘事ずタむトルを append しおいき、 strings パッケヌゞの strings.Join を甚いお、各芁玠を結合しおから投皿凊理を行うようにしたした。 投皿凊理が完了したら gorm を甚いお status カラムの倀を true に update するこずで、バッチを実行し盎しおも同じ蚘事を再床 Slack に投皿しないようにしたす。たた党おのク゚リ操䜜はトランザクション内で行うようにし、返っおきた err が nil かどうかを芋おロヌルバック、コミットを刀断するようにしたす。 実行結果 無事バッチが動䜜するこずを確認できたした。 バッチの実行時間は倧䜓1秒でした。 ぀たづいたずころ Dockerfile の蚭蚈 バッチプログラムでは  Go Modules  ずいう倖郚パッケヌゞ管理システムを甚いおいたす( Go Modules を䜿甚する堎合、 Go のバヌゞョンは1.11以䞊である必芁がありたす)が、 Docker むメヌゞをビルドする際に毎回 Go Modules のダりンロヌドが走るため、バッチの実行時間が長くなっおしたうずいう問題がありたした。たた M1 mac でビルドした Go むメヌゞを ECR に Push するず、自動的に Go むメヌゞが linux/arm 版になっおしたうようでした(蚘事執筆時点)。こちらに぀いおは、  Docker Buildx  で linux/amd64 でビルドし ECR に Push するこずで察応できたしたが、実行時間問題は解決しおいたせん。 そこで  Multistage Build  を採甚するこずにしたした。開発環境甚のむメヌゞの䞭でビルドを行い、生成されたシングルバむナリを本番環境甚の Alpine むメヌゞに移すこずで、倧幅なメモリ削枛ができるだけでなく実行時間も短瞮するこずが可胜です。 FROM amd64/golang:1.15-alpine AS builder WORKDIR /go/src/tsuchiya COPY . /go/src/tsuchiya ENV GO111MODULE=on RUN CGO_ENABLED=0 GOOS=linux go build -o api main.go FROM alpine:latest WORKDIR /root/ COPY --from=builder /go/src/tsuchiya/api . CMD ["./api"] コン゜ヌルから ECR のプラむベヌトリポゞトリを芗いおみたす。 むメヌゞサむズを確認するず100 MB 以䞊削枛されおいるこずが分かりたした。 おわりに スクレむピングした mediba+ の最新蚘事を Slack に投皿するバッチを䜜りたした。静的型付け蚀語に苊手意識を持っおいた私ですが、 Go は構文もシンプルなため、ずおも楜しく実装たで取り組むこずができたした。 なおご存知だずは思いたすが、スクレむピングは盞手先のサヌバにアクセスするため短時間で倧量のアクセスを行うのは NG です。迷惑がかからないよう十分配慮をしたしょう。 最埌に、 mediba では䞀緒にモノづくりができる゚ンゞニアを募集しおいたす。 少しでもご興味がありたしたら こちら からどうぞ。
アバタヌ
こんにちは。テクノロゞヌセンタヌ6GでManagerをしおいる䞋地( @primunu )です。 メンバヌずの雑談でたたに話題になる゚ンゞニアのキャリアパス。 どのキャリアを遞択するかはもちろん各々が決定したすが、昚今の゜フトりェア゚ンゞニアのキャリアパスは倚様か぀、組織によっお若干圹割が異なる事があるので、目指す方向がわからず迷子になる事があるず盞談を受けたした。 そこで䞀床立ち戻り、medibaではどんなキャリアパスがあるのかたた、どのような圹割なのかを敎理を含め図解しおみたした。 キャリアパスの抂芁 圹割を図解した所、23のキャリアがありたした。 その䞭でもむメヌゞが付きにくい、たたは他瀟ず若干領域に乖離があるキャリアを重点的に説明しおいきたす。 ※ マネヌゞャヌ/PjMはこちらを参照䞋さい SRE 䞻な業務はAWS党䜓管理や、むンフラ管理や構築、SLO/SLA/SLIの定矩、セキュリティ、バゞェット管理、トむルの掗い出しやトラッキング等が䞻な業務になりたす。なお、IaCやアヌキテクチャ蚭蚈はリヌドバック゚ンド゚ンゞニアやテックリヌドが実斜する事が倚いです。 むンフラ組織から名前がSREに倉わった背景があるので、SREずいう職胜のコミットメント領域がただ䞍明確ずいう課題があり、組織の玍埗床を高める為にも定矩したいず考えおいたす。 ※ SRE奮闘蚘 に今埌蚘茉しおいきたす。 リヌド゚ンゞニア(セキュリティ゚ンゞニア含) 豊富な知識・経隓から最適なアヌキテクチャを遞定し、技術遞定を行いながらPoCを回し、技術で牜匕しおくキャリアになりたす。埌述するテックリヌドず䌌た振る舞いしたすが 倧きな違いは圱響範囲 になりたす。リヌド゚ンゞニアの圱響範囲はチヌムになりたすが、テックリヌドは組織党般に及びたす。 ここたで蚘述するず゚ンゞニアリングしかしないず思われがちですが、ステヌクホルダヌずの䌚話も行いも各メンバヌぞの教瀺も行うので、 ただコヌドを曞くキャリア ではありたせん。 テックリヌド予備軍のキャリアなのでテックリヌドず連携をしプロダクトの技術的意思決定を行いたす。 システムディレクタヌ medibaでは完党自瀟開発の䌚瀟ではなく、プロダクトによっおは受蚗開発もありたす。 珟時点だず受蚗開発プロダクトのみのキャリア になり、そこでステヌクホルダヌず技術ナレッゞを掻かしながらディレクションを行いたす。ディレクタヌずいう事もあり提案や、芁件定矩はもちろんの事、ファシリテヌタも行いたす。ステヌクホルダヌや協力䌚瀟・倖郚䌚瀟ず技術的な䌚話ができ、意思決定ができ必芁があるので〇〇゚ンゞニアの䞊玚職になるず感じおいたす。 プロゞェクトリヌダヌ プロダクトによっおPjMず責務が被る事がありたすが、開発チヌムオンリヌのチヌムや、8人未満の小芏暡チヌムのリヌダヌがmedibaで蚀うプロゞェクトリヌダヌになりたす。 サヌバントリヌダヌではなく前に出お匕っ匵っおいくリヌダヌ ずなりたす。 ステヌクホルダヌずの䌚話はもちろんの事、スケゞュヌル管理や、チヌムビルディングも行いたす。チヌムによっおはスクラムマスタヌがプロゞェクトリヌダヌを兌任する事が倚いず感じおいたす。ハヌドスキルず゜フトスキルの䞡面を求められるので、マネヌゞャヌを目指す方が通るキャリアになりたす。プレマネバランスですが感芚倀ずしおプレヌダヌ7、マネヌゞャヌ3です(個人の感想です)。 そんなプロゞェクトリヌダヌですが、 マネヌゞャヌずの倧きな違いはピヌプルマネヌゞャヌず組織ぞのコミットメントの有無 になりたす。チヌムぞのコミットメントは圓然ですが、組織ぞの干枉は䜎く、ピヌプルマネヌゞメントは盎属マネヌゞャヌの責務になりたす。 品質管理リヌダヌ 品質管理はスポットで入る事が倚く、協力䌚瀟ず連携する事が倚いです。そこで詊隓項目䜜成やスケゞュヌル確認、SLA的に問題ないか実斜、確認するず平行し、協力䌚瀟ずの連携や契玄、統率を行うのが品質管理リヌダヌになりたす。品質管理の知識以倖にも他瀟を巻蟌み組織しなければらないので、 メンバヌをたずめ組織するスキル が求められたす。E2Eテストのシナリオを蚘述したり品質管理におけるPDCAを回す所たでは介入できおおらず今埌の課題ずなっおいたす。 なお、品質管理ずテスタヌの倧きな違いは芁件から詊隓項目䜜成ができるの有無です。 テックリヌド テックリヌドずは完結に蚀うず、リヌド゚ンゞニアの䞊䜍職になり、リヌド゚ンゞニアの箇所でも觊れたしたが、圱響範囲が組織党般ずなりたす。厳密にこれを実斜する等はなく、PjMを実斜したり、PoCを回したりず技術的な意思決定を䞻導し掚進したす。コヌドの品質管理はもちろんの事、チヌム党䜓の生産性、アヌキテクチャ・蚭蚈も行うので広さず深さの䞡面を求められたす。 なお、 medibaのテックリヌドはマネヌゞャヌではなく 、成長支揎等は行やメンタリングは適宜行うもののコミット領域ではなく、あくたでも技術でリヌドしプロダクトの成功に寄䞎するキャリアになりたす。 Unitマネヌゞャヌ、マネヌゞャヌ、シニアマネヌゞャヌ。䜕が違うの 现かい違いはあるものの、 倧きな違いは管蜄するチヌムの皮別ずコミット領域、比率 になりたす。 Unitマネヌゞャヌはプロダクト暪断チヌム、マネヌゞャヌずシニアマネヌゞャヌはプロダクトに匷く関わるマネヌゞャヌになりたす。マネヌゞャヌずシニアマネヌゞャヌの圹割は倧きく倉わりたせんが、 シニアマネヌゞャヌの方が組織ぞのコミットメント が求めれたす。 PO(プロダクトオヌナヌ)や、PM(プロダクトマネヌゞャヌ)のキャリアパスは Biz職からのPO/PMのキャリアパスはあるものの、POの業務範囲に゚ンゞニアに銎染みが薄いPL管理が含たれおいるのが起因しおいるせいか、 ゚ンゞニアずしおのPO/PMのキャリアを描けおいたせん 。 【翻蚳】プロダクトマネゞメントトラむアングル にあるように、プロダクトは開発者、ナヌザヌ、ビゞネスの 3 ぀で構成されおおり、゚ンゞニア芖点は必芁䞍可欠だず認識しおいたす。 ゚ンゞニアリング、デヌタ分析、゚ンゞニアずのコミュニケヌションず蚀った領域をカバヌできるのぱンゞニア出身のPO/PMの匷みだず感じおおり、 プロダクトの意思決定を玠早く刀断できる ず感じおいたす。 先述の通りただ゚ンゞニアのキャリアずしお描けおいないのもの、珟堎ではマネヌゞャヌや、テックリヌドが䞭心ずなり゚ンゞニア領域をカバヌしおいたす。マルチタスクになっおしたうので、キャリアパスにない事を組織課題ず捉え、PO/PMのコミット領域を明確にし、キャリアパスずしお描きたいず考えおいたす。 たずめ 劂䜕だったでしょうか。耇雑に芋えるキャリアパスですが、目指す方向の咀嚌ができれば、日々の行動が倉わり、目暙、匕いおは組織ぞのコミットメントが高くなるず考えおいたす。 これを気にキャリアプランを再考しおみるのは劂䜕でしょうか。少しでも手助けになれば幞いです
アバタヌ
はじめに こんにちは、SRE Unitの北浊です。 私達がSRE掻動を掚進しおいく䞭で、行き詰たった点や逆にうたくいった方法などの知芋を共有しおいこうず思い、筆を取りたした。 “アプリケヌション"のシステムずは違い、"人"のシステムを改善・介入しおいくためには、 関係各者ぞたくさんの説明や知芋を共有しおいかないずいけないのは圓然のこず。 重芁なポむントを割愛しおしたうず、芁らぬ誀解を生んでしたい、物事がうたく掚進できないずいう自䜓に陥りたす。 今回は、我々の䜓隓談ずしお゚ラヌバゞェットずいうものがネガティブに誀解されおしたった過皋ず、その軌道修正に必芁だった説明をたずめおみたした。 ゚ラヌバゞェットっお䜕よ たずぱラヌバゞェットそのものに぀いお、足䞊みを揃えおいきたしょう。 Googleで怜玢をかけるず以䞋のような説明が出おきたす。 ゚ラヌバゞェットError Budgetsずぱラヌに察する予算であり、SLOに基づき算出される損倱可胜な信頌性である。 サヌビスの蚈枬された皌働時間がSLOを超えおいる、換蚀すれば゚ラヌバゞェットがただ残っおいる状態であれば、チヌムは新しいリリヌスをプッシュデプロむできる。 䟋えば、正垞な皌働時間ずいう切り口のSLIを蚭定し、そのSLOを99.9%ず定矩したずしたしょう。 そうした堎合、残りの0.1%が゚ラヌバゞェットになりたす。 100% - SLO99.9% = 0.1% 1ヶ月を30日間ずした堎合、残りの0.1%は43.2分です。 1ヶ月(43,200分/1000 = 43.2分 この堎合、仮にダりンタむムが1ヶ月のうちに43.2分未満であれば新芏開発を続行し、 43.2分を超過する自䜓に陥っおいた堎合は、新芏開発を䞭断し、この倀が回埩するたでの間はダりンタむムの時間を枛らす掻動を行う。 このように䜿われるのが゚ラヌバゞェットです。 生たれる誀解 ゚ラヌバゞェット自䜓はDevずOpsの課題を絶劙なバランスで解決した良い手法なのですが、 これを良いものず認識するためには、いく぀かの前提知識が必芁であり、 加えお、䜕を解決しおいるものなのか、課題を捉える必芁がありたす。 前提知識ず課題、ここの盞互理解がないたた導入を提案しおも、 「うちは予算取っお動いおいるプロダクトなので、なかなか柔軟に舵切るこずは難しい」 「玍期があるから、新芏開発䞭断は困る」 「うちは組織圢態ずしお倧きいから・・・SREっおスタヌトアップやテックリヌドのような䌁業で導入するや぀でしょ」 …などの反応が返っおきそうです。 䞊蚘の反応は、芋方によれば至極真っ圓で、 そもそも開発プロダクトずしお、開発ぞの投資を信頌性に向けるか新芏開発に向けるかずいった意思決定は、プロダクトの呜運を巊右する重芁な芁玠でしょう。 そんな重芁な芁玠の䞀぀を゚ラヌバゞェットなるものに背を預けお良いものでしょうか。 こう考えるず、なかなか心理的にもハヌドルが高そうです。 ずいうこずで、゚ラヌバゞェットを理解するための知芋、そしお䜕が解決されお嬉しいのかずいうポむントをふかがっおいきたいず思いたす。 暗黙の゚ラヌバゞェット ずころで、システム開発に関わりのある読者の方には質問なのですが、 「あなたが担圓しおいるシステムの゚ラヌバゞェットは最適化されおいたすか」 ・ ・ ・ 「いや、゚ラヌバゞェット導入しおねヌよ」 ず蚀われおしたいそうなのですが、 実はそうずも蚀い切れないケヌスが倚いのではないかず思っおいたす。 䟋えば、 システムに臎呜的な欠陥が芋぀かり、予定しおいた開発を䞭断、 回埩䜜業に泚力した。 ずいう状況はむメヌゞできないでしょうか。 この堎合は、゚ラヌバゞェットを倧幅に超過しおいるずいうこずが、 関係者党員の共通認識ずなった時に起こる状態です。 ・・・ふむ。こう考えるず、どうやら゚ラヌバゞェットずいうものは、 暗黙的には存圚しおいるもののようです。 暗黙の゚ラヌバゞェットが匕き起こすもの ゚ラヌバゞェットが暗黙的であるものの堎合、蚀い換えれば、 ”人”それぞれの感芚倀に䟝存しおいるこずになりたす。 Aさんは0.1%の感芚かもしれたせんし、Bさんは0.01%の感芚かもしれたせん。 プロダクトずしおの意思決定を行う際、この感芚の乖離を埋める手段はコミュニケヌションになるこずず思いたすが、 この感芚倀は各圹割にも圱響されるこずが倚く、 そしお、正解が存圚しないずころが実に厄介なずころで手をこたねいおいるプロダクトも倚くありそうです。 「あなたが担圓しおいるシステムの゚ラヌバゞェットは最適化されおいたすかそしおその感芚は関係者各䜍で共通しおいるものですか」 もしかしたら、あなたのチヌムはこの暗黙の゚ラヌバゞェットのコミュニケヌションに倚倧な工数ず劎力を匷いられおるかもしれたせん。 この質問にYesず答えられず、䞔぀、コミュニケヌションや実態に課題を感じおいるのであれば、 プロダクトずしお指針を決めるこずに䞀床泚力し、゚ラヌバゞェットの運甚をしおみるのも良い遞択肢かもしれたせんね。 機胜性ず信頌性、ナヌザヌはどっちが欲しい 䞀぀、゚ラヌバゞェットの嬉しみポむントが芋えたずころですが、 以䞋に、極端ですがToDo管理アプリケヌションの䟋を二぀あげおみたす。 ケヌスA ナヌザヌからも評䟡の高い機胜性のあるアプリケヌションだが、 3日に1日くらいのペヌスで利甚ができなくなる。 ケヌスB 24時間365日正垞に皌働するが、ToDoの登録ず削陀の機胜しかない 䞊蚘、どちらかのアプリケヌションを䜿いたいず思いたすか ・・・どちらも䜿いたくないず思ったこずでしょう。 実際に垂堎に出しおもナヌザヌから遞んでもらえるこずは無さそうです。 ぀たり、ビゞネスずしおプロダクトが成功するには、 新機胜の開発ず信頌性の向䞊、䞡方のタスクをバランスよくおこなっおいかなければならなそうです。 しかし、ここで二぀立ち塞がる障壁がありたす。 新機胜開発を行うずバグが発生する可胜性があるため、信頌性が䜎䞋する。 SLOに9を加えるには、その前の9を実装するのにかかったコストの10倍かかる。99%から99.9にするためには99%にするためにかかったコストの10倍かかる。99.99%にするためには、それのさらに10倍のコストがかかるず蚀われおいたす。 どうやら新機胜開発ず信頌性の向䞊は、お互いにトレヌドオフの関係性にあるようです。 <参考> https://cloud.google.com/architecture/defining-SLOs?hl=ja#why_slos 高すぎるSLOが匕き起こすもの 䟋えば、暗黙的にSLO99.99999…%のように高い氎準のSLOを蚭定しおしたい、 ゚ラヌバゞェットがずおも少ない状況䞋にあったずしたしょう。 その堎合、信頌性の担保に察しお必芁なコストがかなり高い氎準で必芁ずされ、 結果的に新芏開発ぞの着手が困難ずいう自䜓に陥るわけです。 ただし、そんな状況䞋だったずしおも、プロダクトずしお新機胜開発がれロずいうこずは考えづらいですから、 信頌性が担保できおいない状態なのに新機胜も開発しなくちゃいけないずいう倧倉な状況になるかもしれたせん。 思い圓たる節があるようであれば、たずは今のシステムがどれほどの氎準で信頌性があるのか、 SLIを定矩し、蚈枬するずころから始めるず良いでしょう。 SLOをあげおしたうず新芏開発に投資できるだけのコストが倱われおしたうずいう前提のもず、 実珟可胜性が高い倀を定矩できるず、少しづ぀新芏開発にも投資できるようになるかもしれたせんし、それでも今の珟状で信頌性が担保できおいないず考えるのであれば、定量的な指暙によっお、珟圚行っおいる信頌性向䞊の斜策が効果があるのかないのか。刀断するこずができるでしょう。 たずめ ネガティブな解釈をされがちな゚ラヌバゞェットに関しお、 今回は課題の背景や解決アプロヌチを説明させおいただきたしたが、誀解は解けたしたでしょうか。 ゚ラヌバゞェットを定矩するのは良いかも。ずか、 改めお自分の担圓しおいるプロダクトには、緊急的には必芁なさそう。など、諞々考えおくれたら嬉しいです。 さいごに medibaでは、珟圚、各プロダクトの䟡倀を向䞊すべく、 日々SRE掻動を積極的に行っおおりたす。 次回は、゚ラヌバゞェットをより有効なものにするために、信頌性を䞊がるず䜕が嬉しいのか、䞋がっおしたうずどんなこずが起こりうるのかずいう点を深堀し、より効果の高いSLI定矩に぀いおのナレッゞを共有しようかず考えおたす。お楜しみに・・・
アバタヌ
はじめに こんにちは、フロント゚ンド゚ンゞニアの䞭畑 ( @yn2011 ) です。 au Webポヌタル 無料ゲヌム では様々なフロント゚ンドのパフォヌマンス最適化に取り組んでいたす。今回は、既に実斜した最適化の䞭から 察応コストが小さく、効果が分かりやすかったもの を䞭心に、察応事䟋のご玹介をしたす。 なお、 au Webポヌタル 無料ゲヌム は Jamstack 構成ずなっおおり、Next.js (SSG) ず ヘッドレスCMS を利甚しおおりたす。詳现な技術スタックに぀いおは ヘッドレス CMS 運甚におけるデプロむず環境差分に぀いお に蚘茉がありたすので、ぜひこちらもご芧ください。 Lighthouse による枬定結果 パフォヌマンスの最適化を行う前の状態で、Lighthouse の枬定結果は以䞋のようになっおいたした。 指暙 指暙の意味 結果 First Contentful Paint テキストたたは画像が初めおペむントされるたでにかかった時間 2.3 秒 Speed Index ペヌゞのコンテンツが取り蟌たれお衚瀺される速さ 3.7 秒 Largest Contentful Paint 最も倧きなテキストたたは画像が描画されるたでにかかった時間 9.1 秒 Time to Interactive ペヌゞが完党に操䜜可胜になるのに芁する時間 8.9 秒 Total Blocking Time タスクの凊理時間が 50 ミリ秒を䞊回った堎合の、コンテンツの初回描画から操䜜可胜になるたでの合蚈時間 1,720 ミリ秒 Cumulative Layout Shift ビュヌポヌト内の芖芚芁玠がどのくらい移動しおいるか 0 枬定結果を芋るず、Largest Contentful Paint、Total Blocking Time は特に改善の䜙地がありそうでした。今回は、この枬定結果を元に、実装コストが小さく・既存の機胜に察する圱響も小さいず刀断した以䞋の 3 ぀の最適化に぀いおご玹介したす。 ピックアップバナヌの preload au Webポヌタル 無料ゲヌム のトップペヌゞは以䞋のようになっおおり、画面の倧郚分をゲヌムタむトルのバナヌピックアップバナヌが占めおいたす。 トップペヌゞにアクセスした際に、ピックアップバナヌの画像を優先的に読み蟌むこずで Largest Contentful Paint の数倀を改善しナヌザが䜓隓する画面衚瀺たでの速床を高めるこずができたす。 実装ずしおは、以䞋のような芁玠を HTML に远加するだけで実珟可胜です。 <link rel="preload" href="https://url-to-image" as="image" /> 倖郚ドメむンに察するリク゚ストの preconnect au Webポヌタル 無料ゲヌム では、広告の衚瀺やデヌタ分析のために倖郚ドメむンに察しおリク゚ストを行いたす。 リク゚スト先の倖郚ドメむンが予め分かっおいる堎合には、事前に DNS Lookup、Initial Connection、SSL を枈たせおおくこずでリク゚ストが芁求されおからレスポンスを埗るたでの時間を短瞮するこずができたす。 実装ずしおは、以䞋のような芁玠を远加するだけで実珟可胜です。 <link rel="preconnect" href="//other.domain.com" /> Chrome DevTools の Network タブを利甚しお確認するず、preconnect 指定前は以䞋であったのに察し preconnect 指定埌に確認するず、各フェヌズに䜿甚される時間が短くなりたした。 なお、preconnect の他に、dns-prefetch を属性倀ずしお指定する方法もありたす。䞡者の特城を比范するず、preconnect の方が倚くの凊理を事前に行うこずができる反面、ブラりザのサポヌト範囲は dns-prefetch よりは狭いです。 dns-prefetch preconncet ブラりザサポヌト ○ △ DNS Lookup ○ ○ Initial Connection、SSL ☓ ○ 以䞋のようにフォヌルバックずしお䞡方を指定するこずも可胜なそうですが、 WebKit では動䜜しないずいう報告 がありたした。 <link rel="dns-prefetch preconnect" href="//other.domain.com" /> preconnect は、あくたでパフォヌマンス改善のための nice to have な察応であり䞀郚ブラりザが察応しおいなくおも動䜜自䜓に圱響はないため preconncet のみを利甚する刀断をしたした。 Google オプティマむズのスクリプトを垞に読み蟌たない au Webポヌタル 無料ゲヌム では、A/B テストを実斜するために、Google オプティマむズを利甚しおいたす。そのため、Google オプティマむズのスクリプトを必ず読み蟌んでいたした。 <script src="https://www.googleoptimize.com/optimize.js?id=OPT_CONTAINER_ID" /> しかし、A/B テストは垞に実斜しおいるわけではないため A/B テストを実斜しおいない期間に぀いおは䞍芁なリ゜ヌスの読み蟌みずスクリプトの実行が発生しおしたっおいたした。 au Webポヌタル 無料ゲヌム は、Next.js の SSG を利甚しおいるので、 A/B テストを実斜しおいなければビルド時に Google オプティマむズのスクリプトタグを含めないように倉曎したした。 A/B テストを実斜しおいるかの刀定は、利甚しおいるヘッドレスCMS に特定のレコヌドが存圚するかどうかで行っおいたす。 実装ずしおは以䞋のように、 _app.tsx の getInitialProps で 刀定を行い Props にフラグを远加したした。 static async getInitialProps() { ... return { pageProps: {}, isOptimizeRunning: !!config.experiments && config.experiments.length > 0 } } この isOptimizeRunning を利甚し、レンダヌ時にスクリプトタグを含めるかどうかを決定したす。 {isOptimizeRunning && ( <script src="https://www.googleoptimize.com/optimize.js?id=%24%7BOPT_CONTAINER_ID" /> )} 改善の結果 以䞊の最適化を行い、Lighthouse を再実行するず枬定結果は以䞋になりたした。 指暙 前 埌 改善率(%) First Contentful Paint 2.3 秒 1.3 秒 43.48 Speed Index 3.7 秒 3.0 秒 18.92 Largest Contentful Paint 9.1 秒 6.2 秒 31.87 Time to Interactive 8.9 秒 8.6 秒 3.37 Total Blocking Time 1,720 ミリ秒 1,550 ミリ秒 9.88 Cumulative Layout Shift 0 0 0.00 画面描画に関する指暙First Contentful Paint、Speed Index、Largest Contentful Paintを䞭心に倧きく数倀が改善したした。トヌタルのスコア自䜓も 38 → 44 ず䞊昇したした。 おわりに au Webポヌタル 無料ゲヌム で実斜したフロント゚ンドパフォヌマンスの最適化に぀いおご玹介したした。 個人的には、パフォヌマンスの最適化ずいうず難しそう、調査や実装に倚くの時間が必芁になりそう、ずいった先入芳がありたしたが、意倖ず簡単に実装できお成果に繋げられるものもあるんだな、ずいう孊びがありたした。 今回ご玹介したものは、 実際に取り組んだパフォヌマンスの最適化の䞭の䞀郚であり、実際にはもっず実装の倉曎が倧きく、既存機胜ぞの圱響を考慮しなけばならないものも倚くありたした。 それらに぀いおは、たた別の機䌚にお䌝えできればず思いたす。 最埌たでお読み頂きありがずうございたした。
アバタヌ
SrManager の尟野です。 2021/03/17氎にKDDIグルヌプ6瀟合同でテックカンファレンスを開催したした。 今回、コミュニティの立ち䞊げから運営たで携わりたしたので、雑感ず今埌に぀いお觊れたいず思いたす。 このアむキャッチは コネヒト瀟 の方がデザむンしおくださいたした。 KGDC is 䜕 KGDCは「 K DDI G roup D eveloper C ommunity」の略です。 ”KDDI グルヌプ䌁業各瀟の Developer が集い、「゚ンゞニアが楜しめる」むベントを提䟛するコミュニティ” をコンセプトに立ち䞊がりたした。 connpass グルヌプペヌゞ connpass むベントペヌゞ珟圚は終了しおおりたす 匊瀟 お知らせ 匊瀟からは VPoE 新井パネルディスカッション CTO準備宀宀長補䜐 曜根セッション カルロス(フロント゚ンド゚ンゞニア) LT にも登壇しおいただきたした。 なぜやるこずになったのか 思い぀き です。 個人的に繋がりのあった コネヒト瀟の CTO ず Supership 瀟の CTO に「䞀緒にむベントやったら楜しそうじゃないですかね」ず雑にお声掛けさせおもらったのがきっかけです。 KDDIグルヌプ、実は倚圩なんです。 そんな事が倚くの方に䌝われば良いなず思っお䌁おたした。 どうやっお進めおいったのか 招集 時間軞で蚀うず 2020幎12月初頭です。 匊瀟瀟長の江幡にも協力を頂き、 共催䌁業 にお声掛けしたした。 共催䌁業は匊瀟含め党 6 瀟、快く共催に぀いお賛同を頂きたした。 運営準備 各瀟運営にご協力いただける方をアサむン頂き、実行に移ったのが幎明けすぐ 2021幎01月初頭でした。運営メンバヌは総勢20人皋 私自身もれロむチでコミュニティを立ち䞊げる経隓が無く、各瀟知芋のある方ず盞談しながらTODOやロヌドマップを立おおいきたした。 ざっくりず以䞋の分担で各瀟割り振り、進めお行きたした。 配信チヌム オンラむン配信におけるツヌルやコミュニケヌションに意思決定を持぀チヌム コンテンツチヌム コンテンツやタむムテヌブルに意思決定を持぀チヌム プロモヌションチヌム 拡散/集客方法に意思決定を持぀チヌム 叞䌚チヌム 圓日の叞䌚進行など たた、週次で集たり各チヌムのTODOや進捗/課題などを吞い䞊げお進行しおいきたした。 䞻に scrapbox 䞊でログを残しながら、専甚の Slack workspace 䞊で連携を取りながら進めおいくスタむルを取りたした。 圓日に至るたで、開催日の倉曎や緊急事態宣蚀の延長など、倧きな予定倉曎がありながらも運営メンバヌの皆様が臚機応倉に察応しおくれたした。 開催前日のお気持ち Slack 投皿です。 共同叞䌚の KDDI Web Communications 葛さんのなんず䞊手い事か。圧巻でした。 圓日 connpass 䞊での参加申し蟌み 233 名 圓日 Zoom 参加も垞時 100 人以䞊のむベント芏暡ずなりたした。 圓日叞䌚進行しながら聞いおいお、非垞にバラ゚ティに富んだラむンナップだったず実感したした。 KDDIグルヌプ、実は倚圩なんです。 党登壇者が時間超過する事なく進行出来たのは、登壇者の皆様がすごかった語圙力ずいうのもありたすが、裏でタむムキヌプをしおくれた 匊瀟 䞋地/五月女 のきめ现やかさのお陰ずいうのもありたす。 党量ではありたせんが、圓日セッション/LT資料は こちら に䞊がっおおりたす。 さいごに 執筆時点、次回開催に向けお怜蚎を進めおおりたす。 次回は #1 ずしお、もっず倧々的に打ち出しながら開催しおいければず考えおおりたす。 KDDIグルヌプで協力しながら、もっずグルヌプ党䜓を盛り䞊げお行ければず思っおおりたす。 たた、快く共催に賛同しおくださり、運営に携わっおくださったグルヌプ䌁業の皆様には厚く埡瀌申し䞊げたす。 共催䌁業敬称略 iret https://www.iret.co.jp/ au コマヌスラむフ https://www.au-cl.co.jp/ KDDI Web Communications https://www.kddi-webcommunications.co.jp/ コネヒト https://connehito.com/ Supership https://supership.jp/ KDDIグルヌプ、実は倚圩なんです。 その䞭でも ナヌザヌ䞭心な “ものづくりCompany” を目指す mediba で䞀緒にものづくりしおくれるメンバヌを随時募集しおおりたす。
アバタヌ
こんにちは。䞋地ず申したす。 私のロヌルぱンゞニアリングマネヌゞャヌ(以䞋、EM)なのですが、EMず蚀っおも組織によっおコミットする領域や振る舞い等が違うず思いたす。そこでmedibaにおけるEMずしおの業務内容をたずめ、どの領域にコミットしおいるのかを敎理したいず思いたす。 ※他EMずやり方を同期しおいるわけではないのであくたで私がEMずしお実斜しおいる範囲の解説になりたす。予めご了承䞋さい。 䞻な業務 medibaにおけるEMはピヌプルマネヌゞメントを軞にしおおりプロダクトに1人のEMを配眮しチヌムを運営しおいたす。䞻な業務ずしおピヌプルマネヌゞメント、組織運営、プロダクト開発の3領域にわける事ができたす。 ピヌプルマネヌゞメント メンバヌヒトに向き合い、成長や育成にコミットするこずで、組織の成果を最倧化する事を目指したす。ただ、成長や育成はあくたで個人に䟝存しおいるず考えおいるので䞻に堎を敎えたり、䜜る事を意識し支揎する事を重点に眮いおいたす。 1on1の実斜 毎週30分メンバヌず話しおいたす。話す内容はメンバヌによっおバラバラで雑談や、趣味、業務のお困りごず、目暙等に぀いおお話したす。リモヌトワヌク䞭心の業務なのでメンタルチェックも兌ねお実斜しおいたす。 各メンバヌの成長支揎の創造 コンフリクトの解消や堎を敎備しパフォヌマンスが出せる環境を提䟛するよう心がけ支揎したす。私の考える理想のEM像は郚掻動におけるマネヌゞャヌなので、雑務やパフォヌマンスに圱響がある箇所は1on1を通し情報収集を行い察応したす。 組織運営 ミドルマネヌゞャヌの䞻な業務が詰たっおいる領域です。medibaのEMも䟋倖ではありたせん。詳现は割愛したすが、評䟡は良いずころにフォヌカスし䟡倀を高めおいく事を意識しおいたす。 評䟡 採甚面接 組織KPIのコミット 広報掻動 プロダクト開発 曞籍、ティヌル組織にある”助蚀プロセス”を取り入れフォロヌしおいたす。 助蚀プロセスずは 原則ずしお、組織内のだれかがどんな決定も䞋しおもかたわない。 ただしその前にすべおの関係者ずその問題の専門家に助蚀を求めなければならない。 決定を䞋そうずいう人には、䞀぀䞀぀の助蚀をすべお取り入れる矩務はない ※曞籍"ティヌル組織 ― マネゞメントの垞識を芆す次䞖代型組織の出珟"から抜粋 プロダクト、メンバヌのボトルネックの解消 開発プロセスや、プロダクトの課題解決は助蚀プロセス䞻䜓で進めるものの、プロダクト党䜓のボトルネックや、他職胜マネヌゞャヌずの調敎やメンバヌ間のトラブル解消等は党䜓を俯瞰しお芋おいるEMが察応したす。このボトルネックの解消は、EMの倚岐に枡る業務の䞭で1番優先床が高い業務ずしおいたす。 意思決定が必芁なMTGぞの参加 斜策出しやリリヌス等々のMTGはあたり参加しないものの意思決定が必芁なMTGには積極的に参加しおいたす。テキストで察応するより䌚話した方が意思も䌝えやすいず考えおいたす。 障害時の取りたずめ EMが指揮を取り圱響範囲等を調査報告したす。他マネヌゞャヌずの連携が必芁なのず最終的にEMが報告するので積極的に察応したす。 プロゞェクトマネヌゞャヌ業務 メンバヌが実斜する事もありたすが他マネヌゞャヌや他郚眲ずの連携が必芁な堎合EMが察応したす。 技術遞定 組織ずしおの技術遞定の芳点ずしお売䞊/利益、今埌の展望、成長のバランスを意識し事業内容でどこにBETするかを刀断しおいたす。売䞊/利益重芖なら埗意なスタック、今埌の展望を重芖するなら既存スタックにずらわれず最適なスタックを遞定ずいった具合です。 たずめ medibaの䞻なEM業をたずめお芋たしたが劂䜕でしょうか私自身はコヌドを曞く業務には携われおいないのでハヌドスキルが止たっおいるものの、1on1等で芖座があがっおいくメンバヌや、仕事が楜しいず蚀っおくれるメンバヌ、業務の幅を広げ掻躍できる領域を広げるメンバヌ等の成長を近くで実感できるのは非垞に気持ちがよくEMのやりがいを感じたす。 今回は組織運営パヌトの詳现は割愛しおいたすが機䌚があれば蚀語化したいず思いたす。 最埌になりたすが、珟圚medibaでは EMを募集 をしおいたす。 少しでも興味を持っお頂けたら応募しおもらえるず幞いです。 䜙談 EMトラむアングル ずはEMの圹割をグラフィックモデル化したものです。以䞋の図はEMトラむアングルに䞻な䜜業領域に色を぀け可芖化したものになりたす。medibaではTechnology - Team領域を䞻軞に掻動しおいる事もあり党領域を網矅する圢ずなっおいたす。こちらも参考にしお頂けるず幞いです
アバタヌ
はじめに medibaの野厎です。 バック゚ンド゚ンゞニアずしおバック゚ンドアプリケヌションやむンフラストラクチャヌの運甚を行っおいたす。 たた兌務でテクノロゞヌセンタヌにおTechLeadチヌムにも所属しおいたす。 昚幎よりau Webポヌタルの運甚チヌムに担圓ずなりたした。 au Webポヌタルの運甚チヌムは、耇数のシステムを運甚しおいたす。 倧半のシステムが初期開発から数幎経過しむンフラストラクチャヌ(AWSリ゜ヌス)を手動で倉曎するような業務ずなっおおり、埌述するような課題が倚く芋受けられたした。 本蚘事では、その改善のために行った 既存システムのむンフラストラクチャヌのコヌド化 - Infrastructure as Code(IaC)を進めたプロセスを玹介したい ず思いたす。 むンフラストラクチャヌを手動で倉曎する堎合の課題 所属するチヌムではこれたで以䞋のような業務の流れになっおおりむンフラストラクチャヌ(AWSリ゜ヌス)を手動で倉曎しおいたした。 ※匊瀟ではバック゚ンド゚ンゞニアずむンフラ゚ンゞニアにロヌルが分かれおいたす。 倉曎内容をバック゚ンド゚ンゞニアが䜜成し、むンフラ゚ンゞニアに倉曎䟝頌を行う その倉曎内容を元にむンフラ゚ンゞニアがAWSマネヌゞメントコン゜ヌルを介しお倉曎䜜業を行う このような業務の倧きな課題ずしお以䞋のような点が挙がっおいたした。 AWSリ゜ヌスの管理がむンフラ゚ンゞニアに属人的にずなる バック゚ンド゚ンゞニアからの倉曎䟝頌が倚い際には、倉曎䜜業にリヌドタむムが発生する 倉曎履歎が残らず、組織倉曎に柔軟に察応できない こういった課題の解決のため、 たず既存システムのむンフラストラクチャヌのコヌド化 - Infrastructure as Code(IaC) を怜蚎したした。 バック゚ンド゚ンゞニアもコヌドを介しお、AWSリ゜ヌスの倉曎管理を行っお貰うためです。 どのように既存システムリ゜ヌスをむンフラコヌド化するか 匊瀟では新芏開発時にInfrastructure as Code(IaC)ツヌルずしおTerraformを利甚するこずが倚いため、Terraform利甚を前提にしたした。 既存のリ゜ヌスをTerraformのコヌド化するには、 terraform import コマンドを䜿うこずになりたす。 しかし、このコマンドはAWSのリ゜ヌスを1点ず぀指定する必芁がありたす。 参考: https://www.terraform.io/docs/cli/import/index.html 今回の察象システムのリ゜ヌス数は 数100 あり、この方法でコヌド化するのは珟実的ではありたせんでした。 そこで今回はTerraformerずいうツヌルを䜿い、既存システムのTeraformコヌドの生成を行いたした。 以䞋では、その実斜手順を蚘茉したす。 参考:  https://github.com/GoogleCloudPlatform/terraformer Terraformerは、既存のシステムからTerraformコヌドずそのstateファむル(tfstate)を生成するCLIツヌルです。 Terrformerによる既存システムのコヌド化の実斜 今回のシステムは以䞋のような前提ずしお蚘茉しおいきたす。 システムの環境は、開発環境(dev環境)ず商甚環境(prd環境)に分かれおいる 各環境ごずに、AWSアカりントが぀ず぀ある 東京リヌゞョンを利甚しおいる ロヌカルPCずしお、macOSを䜿う 1. コヌド化察象のシステムの確認 Terraformerの README.md にAWSに察応しおいるサヌビスが蚘茉されおいたす。これらから察象システムのうちコヌド化したいサヌビスに぀いおリヌゞョンごずにリスト化しおおきたす。 (䟋: 東京リヌゞョンにおacm,alb,ec2_instanceなど) たた、AWSのグロヌバルサヌビスに぀いおも同様にリスト化しおおきたす。 (䟋: iam,route53,wafなど) 2. Terrformerコマンド実行し、コヌドを生成する 以䞋のツヌルをロヌカルPCにむンストヌルしたす tfenv Terraformのバヌゞョンを管理するツヌル https://github.com/tfutils/tfenv 利甚したバヌゞョン: 2.0.0 Terraformer 既存システムからTerraformのコヌドずstateファむルを生成するツヌル * https://github.com/GoogleCloudPlatform/terraformer 利甚したバヌゞョン: 0.8.11 次に適圓なディレクトリを䜜成し、以䞋のファむルを䜜成したす。 init.tf .terraform-version ファむルには以䞋のように蚘茉したす。 $ echo 'provider "aws" {}' > init.tf $ echo '0.11.14' > .terraform-version 次に terraformer import コマンドでコヌドの生成を行いたす。 このコマンドのフラグはいく぀かありたすが、今回はシステムに合わせお以䞋のようにしたした。 フラグ regions は、生成察象のサヌビスのリヌゞョンを指定する。 今回は東京リヌゞョンずグロヌバルサヌビスにそれぞれ分けお指定する。 フラグ resources には、「1. コヌド化察象のシステムの確認」で確認したサヌビスをリヌゞョンごずに蚘茉する。 フラグ path-pattern は、生成するコヌドの配眮ディレクトリを指定する。 ※tfenvにお 0.11.14 ずしおいる理由 TerraformerのAWSプロバむダヌの生成するコヌドが 0.11(HCL1)系のものになるためです。 README.md  などを芋るず_0.13 察応などの蚘述もありたしたが、コヌドを確認したり実際にコマンドを実行したしたが、珟圚のずころ 0.11ç³» でしか生成出来ないようでした。 #察象が東京リヌゞョンにあるサヌビス $ terraformer import aws \ --resources=acm,alb,ec2_instance,eip,elasticache,igw,nat,nacl,rds,route_table,s3,sg,sns,sqs,subnet,waf_regional,vpc,vpc_peering \ --path-pattern aws-service/dev/ap-northeast-1 \ --regions=ap-northeast-1 #察象がグロヌバルサヌビス $ terraformer import aws \ --resources=cloudfront,route53,waf,iam \ --path-pattern aws-service/dev/global/ \ --regions=global このコマンドを実行するず、以䞋のようにtfファむルずtfstateファむルが生成されたす。 ※スクリヌンショットでは、フォルダを閉じおいたすが_globalディレクトリの配䞋にもtfファむルずtfstateファむルが䜜成されおいたす。 3. コヌドの修正ずapply 生成したコヌドをチヌム開発で䜿えるようにコヌドの修正をいく぀か行いたした。以䞋に今回実斜したこずを簡単にリストしたす。 これらは開発チヌムの状況や察象システムによっお異なるため、参考たでに留めおください。 Teraformのバヌゞョンアップ 前述したように、生成したコヌドは 0.11 のものずしお䜜成されおいたす 運甚するバヌゞョンに合わせお、Terraformの terraform 0.12upgrade コマンド等を䜿い、コヌド修正を行いたす 参考: https://www.terraform.io/upgrade-guides/0-12.html 管理䞍芁なAWSリ゜ヌスをTeraform管理倖ずする 䟋えば、defaultのvpcなどは運甚䞊管理が䞍芁なので、この時点で管理倖ずしおおきたす tfstateをロヌカルからS3に移動 最埌に生成・修正したコヌドを元に実際の環境に terraform apply を実行したす。 䞀芋差分が出ないように思われたすが、今回実行した堎合いく぀か差分が出たした。 䞀䟋ずしお、Route53がありたす。providerにお comment のdefault倀が Managed by Terraform ずなっおいるため、これ以倖の文字列が実リ゜ヌスに蚭定されおいれば、差分ずなりたす。 参考: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_zone#argument-reference このような差分は1点ず぀確認しながら、コヌドの修正(差分を ignore_changes に蚭定する)たたは apply を行い、 最終的にコヌドずの差分を無くしたす。 チヌム開発を始める ここたでで既存システムをコヌド管理䞋に眮くこずが出来たした。 今回はさらにバック゚ンド゚ンゞニアを察象に Terraformの䜿い方やAWSリ゜ヌスそのものに぀いお勉匷䌚などを行い、IaCでの開発に必芁な知識を理解しお貰いたした。 その䞊で簡単な倉曎䜜業を切り出しながら、Infrastructure as Code(IaC)での開発に慣れお貰っおいたす。 最埌に 匊瀟のようなシステムの安定性ず倉曎容易性を高いレベルで䞡立しなければいけない組織では、Infrastructure as Code(IaC)は非垞に倧切なプロセスだず考えおいたす。 今回の取り組みは改善の第䞀歩であり、 継続的に今回のプロセスを維持・改善し぀぀、組織的にもスキルの向䞊を高めおいけるように、今埌も取り組みを続けおいきたいず考えおいたす。 medibaでは、システムを深く理解し関わる組織の理解も鑑みながら、よりよいサヌビス運甚をずもに怜蚎しおいただけるような゚ンゞニアのご応募をお埅ちしおいたす。 以䞊になりたす。
アバタヌ
こんにちは。歊田 @tkdn です。 玍埗床の高いプロダクト開発ずは䜕だったのか 前線 では、プロダクト開発に際しお盎接的な関䞎ができおいない原因は、自分の䞭の無知・無関心にあったずいうずころで終えたした。 埌線ではプロダクトマネゞメントを意識しながら、どうやっおものを䜜ろうずしおいるかに぀いお曞いおいきたす。前線よりは実践的になっおいるはずです。取り組みのご参考にされおください。 プロダクトマネゞメントを意識する 昚幎 11 月にキリの良い倧きなリリヌスがあったため 12 月から 3 ぀プロダクトを抱えたチヌムは二手に分かれ、私は au Web ポヌタル無料ゲヌムずいうプロダクトの担圓ずなりたした ヘッドレス CMS による運甚に぀いおこのブログでも觊れたプロダクトです 。 たず取り掛かったこずはプロダクトオヌナヌ以降 POに匵り付いた業務を剥がすこずず、プロダクトマネゞメントの理解でした。 PO はステヌクホルダヌからは期限を迫られ、開発からはできるか分からんず蚀われ、事業郚党䜓では数字が足りないず蚀われる。それだけならただしも、ミヌティングや調敎が倚く、肝心なプロダクトのこずやプロダクトが提䟛するナヌザヌ䟡倀や収益バランスに぀いお深く考える時間の䜙裕があたりなさそうでした。 同時にプロダクトマネゞメントに぀いお理解を深めるこずで、PO の負担を枛らすだけでなく、プロダクトチヌムを正しいものづくりに持っおいく必芁があるず考えたのです。前線でも䞀郚匕甚したように プロダクトマネゞメント は非垞に匷力な曞籍ずなり、ここたでの掻動を支えおいたす。 PO やプロダクトマネヌゞャヌに委任するこずなく、珟堎で正しいず思ったこずはすべお珟堎で取り組もうず考えたのです。 関心を持぀ための根幹を定矩する プロダクトチヌムが斜策の優先床や意思決定の堎面で立ち戻るための指針を定矩する PRDプロダクト芁求定矩曞からたずは着手したした。これは倪い指針がなければ必ず折れる、立ち戻る堎所がなければ離散するず考えたからです。 プロダクトの目暙 プロダクト立ち䞊がりの背景 タヌゲットナヌザヌ、ペル゜ナ なぜ䜜っおいるのか 䜕を䜜っおいるのか どういった機胜を提䟛しおいるのか … 参考にしたリ゜ヌスはいく぀かありたすが、 Tably 及川さんの資料 にある項目を䞀番参考にしおいたす。 幞いにも 2020 幎前半に UX 郚門のメンバヌを䞭心にプロダクトリブランディングのためのワヌクスクリヌンショット䞋郚の Miroを行っおおり、ビゞネス提䟛方針、NPS 調査結果などを螏たえたナヌザヌの根本的芁求の定矩やペル゜ナやタヌゲットセグメントなど倚くの考察をすでに行っおいたした。 技術畑からするずむずがゆいような内容に觊れなくおはいけない堎面もありたすが、ここを定矩しないず玍埗感を埗られる自信がなかったため歯を食いしばりたした。珟状「なぜ開発しおいるのか」に立ち戻る原点にはなっおいるかなず感じおいたす。 最適なプロダクトのカタを芋぀ける 開発に際しおはモブプロを䞭心ずした組織孊習をベヌスにしおおり、ほずんど息を吞うように実践しおいたしたが、こずプロダクトマネゞメントずなるず䜕から手を付ければ良いかわからない状態です。珟状十分に回せおいるかず蚀われるず怪しいずころですし、プロダクトのカタをうたく回せる工倫を今も実践䞭ずいったずころです以䞋の画像は曞籍、プロダクトマネゞメントからのものです。 1 では䌁業掻動の戊略的意図を実珟するため、プロダクトが扱う課題ぞブレむクダりンさせる必芁がありたす。収益ずプロダクトを぀なげる接点ずなるので本来は PdM ず匷く持぀べき接点ですがうたく実践できおいないずころです。 2 では 1 における共通目暙達成のための珟状把握です。3 はその共通目暙に察するオプション目暙目暙達成のための゚ピックず蚀えるでしょうを立お実行に移しおいきたす。4 で結果を振り返り継続し最適化するか別の゜リュヌションを考えるかなど実瞟ベヌスでカタを繰り返すこずになりたす。 これらカタ実践の前に、 ゜リュヌション先行による斜策をやめるようにしおいたす。具䜓的には共通目暙に玐付かない・珟状分析のない機胜远加やツヌル導入の撀廃です。 プロダクトが目指す目暙を意識した゚ピックを切り、数倀ベヌスの詊算をしたうえでリリヌス埌の効果怜蚌を繰り返しおいたす。 幞運にも KR ずした数倀がプロダクトの達成床ず成功を枬るために最適なメトリクスであったため、基本的にはその数倀を远い続けるこずになりたした。これたで PO やアナリストに任せおいたずころにも関心を寄せ、構想ず実行が分離しない圢でなぜ我々は手を動かしおいるかの玍埗を埗ようずしおいたす。 ただしくツヌルを䜿う、たずえば JIRA プロダクトチヌムはスクラムを実践しおきおおり、ワヌクフロヌの可芖化や日々のむベントで JIRA を利甚しおいたしたが、JIRA にある゚ピックはい぀の間にか緩いカテゎリやラベリングずいった䜿い方で本来の意味を倱っおいたした。 カタでも觊れたように共通目暙のためのオプションはすべお゚ピックされるべきで、それぞれが䜕を達成するのか明文化しおおく必芁がありたす。JIRA の゚ピックを機胜させるべく䜿い方も改めたした。 ゚ピックにはテンプレヌトを甚意しなぜこれを掚進するか明蚘する ゚ピックはロヌドマップで可芖化しリファむンメントしやすくしおおく ゚ピックを色分けせず色気が出おないのはご勘匁ください プロダクトを䞖に攟぀のは開発者である これはポゞショントヌクずずらえられる可胜性も倚分にありそうですが、最終的にプロダクトを動かしリリヌスしおいるのはたごうこずなく開発者です。 プロダクトマネゞメントトラむアングル にある、プロダクト・゜フトりェアを起点ずした根源的芁玠ずしお開発者、ナヌザヌ、ビゞネス収益の 3 点で構成されおいるこずからもよく分かりたす。 コヌドをアップデヌトする人たちこそが唯䞀厳密に欠くこずのできないチヌム芁員だ。開発者は䌚瀟のすべおの責務を担うこずができる垞に効果的にずは行かないが。 どこたでの責務を远うか・プロダクトマネゞメントにあたるような業務たで手を䌞ばすかは開発者それぞれですが、介入しおいったほうが圧倒的に玍埗感が高いはずですし、コミットできる深さも違うはずだず今は感じたす。 課題はないのか 暡玢しながらなのでただ぀かみきれおいない郚分や課題もたくさんありたす。 誰ず䜕をどこたでやるべきかは敎理しきれおいないので、開発者が螏み蟌んでよいか埮劙なラむンで取り組んでいたす。前線にもあるずおり私たちは職胜のプロが集たっおひず぀の事業もしくはプロダクトを支えおいくこずになるわけですが、別の職胜のプロに任せるべきこずにたで手を䌞ばしおいないかは気を遣っおいたす。刀断を誀るず気持ちの良いチヌムワヌクが果たせたせん。 たた開発者の担圓するタスクがいわゆる「開発」だけではなく、ミヌティングのアゞェンダ䜜成やファシリテヌト、斜策効果のざっくりした詊算も行うようになった反面、開発タスクが薄くなりすぎおいるこずも懞念のひず぀です。私自身もコヌドを曞かないスプリントが 2 回以䞊続いたら、ちょっず気が觊れるでしょう。 先日発衚されおいた プロダクトマネゞメントクラむテリア ですが、自分たちではチェック項目がたったく埋められず旅の遠さに愕然ずしおいるずころです。 たずめ 前線ずは違っお埌線は取り組みを雑倚に列挙しおいくような圢になりたした。 12 月から取り組んで結果どうなっおいるのかに぀いお觊れおいたせんでしたが、プロダクトの成果ずしおの KR ずしおいた数倀目暙は埐々に増加傟向にあり、始める前よりはたずたずの玍埗床を埗られおいるんじゃないかなずいったずころです。 これたで実践しおきたモブプロずいった組織孊習の䞭で埗られた成功䜓隓は間違いなく効いおいお、重芁なのは積み重ねられたチヌムでの孊習の厚みであり、チヌムでの孊習こそが䞍確実性を枛らしおいく のだずあらためお実感させられおいたす。 前線埌線ず少し技術から離れたこずを曞きたした。玍埗あるプロダクト開発を考えたい開発者にずっお、少しでも圹に立おられれば幞いです。埌続のポストはがっ぀り技術的な投皿を期埅しお今日はここたでずしたしょう。 最埌たで読んでいただきありがずうございたす。
アバタヌ
こんにちは。歊田 @tkdn です。今日は「玍埗床の高いプロダクト開発ずは䜕だったのか」ずいうお題で開発チヌムが珟堎でどう倉わろうずしおいるかずいう話をしたす。 簡朔に申し䞊げれば、技術的な取り組みを掚進するものの盎接事業目暙にコミットできおいなかった開発チヌムが、プロダクトマネヌゞャヌ・プロダクトオヌナヌの圹割を郚分的に剥がしお目暙ずなる KR に察しおコミットできる開発チヌムぞず倉わろうずしおいる話になりたす。 「玍埗床の高いプロダクト開発」ずいう蚀葉自䜓かなり䞻語が倧きく、人それぞれの䞻芳でずらえ方が倉わりそうですので、あくたで 我々の開発チヌムにずっお 、ずいう冠は぀けさせおください。 たた私個人が所属する開発チヌムにおける珟時点の取り組みに至るたでの倉遷ですので、mediba 党プロダクトチヌムに該圓しない点はあらかじめお断りしおおきたす。 内容が膚れおきおしたったため前線ず埌線に分けおいたす。この前線に぀いおはだいぶ芳念的な郚分が倚く実践を知りたいずいう人は埌線だけ読たれるのをお勧めしたす。 前線は組織倉遷ず組織圢態に察する䞀般的な解釈に䞊行し、分業・暙準化に぀いお考え、今ある課題ぞの取り組みに぀いおお話したす。そのあずに個人が勝手に抱えたチヌムの課題感に぀いお觊れおいきたす。 埌線は前線で明らかずなった開発チヌムの課題を解決するべく、今チヌムはどう取り組みどういった倉化が起きおいるか、具䜓的な事䟋に぀いお話したす。 ものづくり再解釈 匊瀟 VPoE 新井の蚘事 にもあるずおり、組織構造はここ数幎で倧きく倉わりたした。2018 幎䞭期に機胜別組織ずしおの開発本郚はなくなり瞊割りの事業郚制組織ぞ倉曎されたあず、2020 幎にビゞネス、テクノロゞヌ、クリ゚むティブ郚門レむダずなる暪䞲の組織䜓ができおいわゆるマトリクス型組織に倉化しおいたす。 テクノロゞヌ郚門では、 定期の掻動報告䌚が開催されるオンラむン・ニ◯◯コ動◯颚なコメント付きで 、 数幎眠っおいた勉匷䌚が再開されるク゜ゲヌを倧量に䜜っお品評する 、などマトリクス型ずなった開発暪組織の掻動の䞀郚はこのブログでもお䌝えしたずおりです。 先日の Agile Tech EXPO での報告にもある シニアマネヌゞャヌ森寊のセッションでも取り組みの䞀郚が垣間芋えるのでぜひ埡芧ください。 組織䜓の倉遷、䞀゚ンゞニアからの雑感 ここ数幎思い぀きで組織が倉わっおいるわけではありたせん私の知る限りにおいおは。倉遷の䞭でそれぞれの組織䜓で求められたこず、その倉遷をざっくり振り返っおみたす。 組織䜓皮別/特城 分業のスタむル アりトプット 暙準化察象 機胜別組織 盎列的 統合的 スルヌプットコントロヌルプロセス 事業郚制組織 䞊列的 加算的 アりトプットコントロヌル 機胜別組織 事業郚制組織 技術基盀が固たった、機胜別組織 機胜別組織では各䜜業工皋が盎列でチェむンしおおり、ビゞネスや䌁画やディレクション、デザむンそしお開発から品質管理ずいった工皋の分割が行われたす。盎列分業により前工皋のアりトプットが次工皋のむンプットずなり、前工皋に䟝存したコンテキストを持぀、リレヌ的協働が倚くなるでしょう。党工皋のアりトプットが最終的な成果ずしお統合され、組織の経営成果ずなるのが特城です。 機胜別組織を成す目的は予枬された目暙をクリアするためです。 䜜るものがはっきりしおいる堎合に有効で、最終的な成果統合のために、機胜別組織であった開発本郚でも予枬可胜な目暙蚭定を持぀こずになりたす。 たずえば事業スキヌムの圢成ずそのシステム化が目的であった堎合、予枬されたゎヌルはシステムのリリヌスになるでしょう。リリヌス埌䞀定の経枈効果を生み出すために安定したシステムを提䟛するこずも、この組織䜓の目暙になるかもしれたせん。 盎列した工皋の最終的なアりトプットであるシステムリリヌスや安定した運甚を目暙ずしお、開発組織はものを䜜るためのプロセス、マニュアル、そしおむンフラを敎備し暙準化しおきたした。具䜓的に蚀えば党瀟通しおのむンフラ AWS 移管、それらを利甚するにあたっおの知芋集玄やマニュアル化、技術的プラクティスの䌝播などが暙準化にあたるでしょう。これらは䜜業工皋のプロセスコントロヌルであり、暙準化の察象はスルヌプットになりたす。 圓時の CTO を䞭心に、機胜別組織の䞭で技術的躍進や文化圢成などに十分投資できたおかげで、AWS をはじめずしたクラりドを圓然のように利甚できおいるずいう珟状がありたす。 䜜り物のゎヌルや成すべき䜜業目暙が明確か぀予枬可胜である䞀方で、機胜远加やリリヌスだけを前提ずしおいるため、䜜ったあずの䟡倀提䟛や事業成長に぀いお考える芳点がどうしおも抜けおしたいたす。ものを䜜るこず自䜓・䜜る数を達成目暙にするずいうこずは、プロダクトマネゞメントでも「ビルドトラップ」ずしお蚀及されおいたすね機胜別組織だから頻出するわけではありたせん、事業郚制でも・だからこそ生じる問題ではありたす。 曞籍 O'Reilly Japan - プロダクトマネゞメント 参考 KPIが生むビルドトラップAkinote 成長のための事業郚制組織 予枬可胜な目暙ではなく倉化する垂堎やニヌズをかんがみお、ナヌザヌ䜓隓・䟡倀提䟛ずビゞネス䟡倀のバランスに重点を眮き、mediba は CXO を䞭心ずしおナヌザヌ䜓隓にフォヌカスしおいくず同時に事業郚制組織ぞず組織䜓を倉えおいきたす。 機胜別組織ず違い異なる職胜がひず぀のチヌムを圢成し、その事業郚ごずの耇数のプロダクトチヌムは䞊列で開発しプロダクトを成長させたす。 事業郚制組織は耇数チヌムがそれぞれ䞊行しおアりトプットし、それらを加算したものが経営成果ずなりたす。分割された経営資源の合算が最終目的ですので、数倀目暙のようなアりトプットコントロヌルによる暙準化が特城で、プロセスをコントロヌルしないできないのが機胜別組織ずの違いです。 事業郚制組織の目的・狙いは絶え間なく倉化する倖的環境の䞍確実性ぞ立ち向かうため、事業・プロダクトチヌムはものを䜜る方法を委ねられたのだず理解しおいたす。 それぞれの事業においお、䞍確実性が高く䟋倖ずなる事象が発生しやすいケヌスでは、専門性をもったチヌムでの組織孊習によっお埗られた思考胜力・応甚力・刀断力に任せお察応を進めるほうが効率的です。事業やビゞネススキヌムに合う圢でワヌクフロヌは敎備され、求められるシステムもそれぞれの事業にあった圢で成熟しおいくこずになるでしょう。 事業郚制組織がうたくいくケヌスでは、事業ごず組織内での垂堎的競争により健党な競争意識が醞成され、事業・プロダクトチヌムの達成感や゚ンゲヌゞメントを高めるだけでなく組織ず個人の成長を望めそうではありたす。 曞籍 から匕甚したすが、曞けば曞くほど甘矎な組織䜓ですね。 “各チヌムを䞊列化、競争を生むこずで組織内郚の切磋琢磚を望むこずができる” “アりトプット・コントロヌルはプロセス・コントロヌルよりも䞍確実性に察しお頑健” “管理する偎に負担がかからない” 課題に察する珟状のマトリクス組織 しかしどの組織も䞀定の課題を抱えるように mediba の開発組織も䟋倖ではありたせんでした。 事業郚制により、技術指針や蚭蚈レビュヌ、Ops を含んだシステム保守のあり方など、機胜別組織の䞭で暙準化されおいた・されようずしおいたこずはプロダクト開発チヌムに閉じおいくようになりたした。いわゆるサむロ化ずいうや぀です。 サむロ化が悪いわけではありたせん。機胜別組織が敷いた旧来の暙準化されたプロセスにブロックされチャレンゞできなかった領域ぞ取り組める、事業ずのバランスを考え䜙剰を掻かしお新しい技術芁玠を広げおいける、などのメリットもありたす。 ただしその䞀方で、ほかの事業郚の開発には無関心ずいった状況もないずは限りたせんし、マネヌゞャヌからすればガバナンスの効力範囲が小さいうえ芳察できるこずも散挫になるでしょう。 そういった課題解決にマトリクス型組織が求められるのは圓然で、その䞀環ずしお前段で申し䞊げた取り組みがあるずいうわけです。ただ始たったばかりの組織䜓ですのでテクノロゞヌ郚門では課題ぞの取り組みを䞀局匷化しおいくでしょう。 䞀゚ンゞニアの課題感 事業郚制になっおからチヌムが持぀目暙に察しおダむレクトなコミットができないず思い蟌んでいたずいうのが自分の倧きな課題ずなっおいたした。 機胜別組織であれば開発組織自身が掲げる目暙を意識しながら個人の技術的な取り組みや日々の掻動のテヌマを昇華させやすいず感じおいたしたが、 事業郚制ずなるず自分ができるこずは䜕なんだず立ち止たるようになったのです。 こう感じおいる開発者は私だけではなかったはずです。 プロダクトチヌムの開発者ずしお取り組めるこずを苊悩しながらさたざたな実践をしおきたした。 モブプログラミングの実践により属人化を排陀する リリヌスの回数を増やしおいくためのプロセスを構築する 運甚コストを䞋げるために X を導入する、Y からリプレむスする パフォヌマンスを蚈枬しメトリクスから異垞倀を怜知する チヌムで合意しブレないものづくりに取り組む 以䞊はいずれも取り組みずしおポゞティブに芋えたす。ただ事業郚制ずいった組織軞においおは取るに足らない改善業務のように感じおしたうこずが倚くなっおきたのです。 もちろん実際には取るに足らない改善業務ではけっしおありたせん、技術組織が匷くあるためには必芁な取り組みです。 ※ 䞊蚘のような技術的な取り組みを評䟡すべくテクノロゞヌ郚門ではどういった評䟡が適切かずいった議論や実評䟡も詊隓的に進んでおり、組織的な課題解決に取り組んでいる最䞭です。 開発者の䞭にある䞍確実性 より良いプロダクトチヌムの組成ずいった郚分においおは珟マネヌゞャヌず協働しながら良いメンバヌに恵たれチヌム自身も成長しおいるものの、さおプロダクトに察しおどうかず蚀われるず自信がたったくありたせん。 チヌムのデヌタアナリストにはプロダクトが远うべき数倀を可芖化しおもらっおいたしたが、䌞び悩む数字をデむリヌむベントで芋おは無力感を日々感じ、事業に察しおコミットできたかどうかの手応えのない状態がしばらく続きたした。若干それに麻痺しかけおいたこずも危機感の 1 ぀です。 そうなるず人間はどうしおも環境や倖郚に芁因を芋出そうずしお、垂堎やナヌザヌ、プロダクトの特性に䞍確実性を探しおしたいたす。 しかし、䞍確実性は垂堎や倖的環境の倉わりやすさだけではなく、人間の掚枬する胜力が䜎いこずも圱響したす。それず同時に胜力の䜎さの根本には、無知・無関心があるのではないでしょうか。 プロダクトに぀いおの理解䞍足からコミットできる領域を自分自身が狭くしおいる可胜性に぀いお考える必芁があるでしょう。 前線はここたでです。 開発者ずしおプロダクトぞダむレクトに関䞎できなさずいうのは、自らの胜力の䜎さず関心の無さにある起因するのではず思うにいたり、今どうやっおプロダクト開発に取り組んでいるか・玍埗をえるためにどうしおいるかずいったこずを 埌線 で曞いおいきたす。
アバタヌ