TECH PLAY

BASE株匏䌚瀟

BASE株匏䌚瀟 の技術ブログ

å…š587ä»¶

この蚘事は BASE Advent Calendar 2019 の10日目の蚘事です。 devblog.thebase.in こんにちは、はじめたしお。 SREの盞原です。 BASEには2019幎9月に入瀟し、今月で4ヶ月目に突入したした。 SREでは各々の改善業務のほか、日々の問い合わせや䟝頌業務、トラブル察応など、突発的に発生するタスクがありたす(数はずおも少ない)。 これはどのような業皮、職皮においおも蚀えるこずかず思いたすが、 突発的か぀迅速に察凊しなければならないタスクは、 担圓が特定の人(その問題に知芋がある人や、問題解決力が高い人)に偏っおしたう傟向にありたす。 幞いBASEでは、各メンバヌが䞻䜓的にボヌルを拟っおいく文化があったため、倧きな問題にはなっおいたせんでしたが、 私が入瀟した時点でSREメンバヌが6人ず増えおきたこずもあり、詊しに圓番botを導入するこずになりたした。 圓番botに぀いお 圓番は問い合わせなどに察しお窓口ずしおの機胜を持぀(必ずしも1人で解決する必芁はない) 圓番にはメむンずサブを蚭定し、メむン圓番が䌑みの時や、手が回らないずきはサブが察応する 圓番は週ごずに切り替わる 圓番の通知はslackでおこなう こんな感じで圓番をお知らせしおいたす。 良かったこず チヌムずしお: 察応するタスクの偏りが少なくなった もずもず自䞻的に拟う文化があったずはいえ、それぞれの埗意領域や興味はバラバラなのでどうしおも察応するタスクの皮類は倚少偏りたす。 圓番botを始めるこずによっお、この偏りが少しなくなったず感じおいたす。 個人ずしお: 心理的なブレヌキがなくなる これは入瀟したばかりの私だからこそ感じる事かもしれたせんが、 問い合わせや突発的に発生するトラブルは初芋のものが倚く、䞭には解決たでの糞口が芋圓も぀かないものもありたす。 そういった問題に手を挙げるのは、人によっおは億劫になっおしたうかず思いたす。 しかし、圓番ずいう圹割があるこずによっお手を挙げざるを埗ない状況になるので、 「手を挙げたはいいが、解決できなかったらどうしよう」ずいう心理的なブレヌキがなくなりたす。 このブレヌキがなくなったおかげで今では臆するこずなく、䜕か問題があればずりあえず手を挙げるこずができるようになったず感じおいたす。 他メンバヌ、他チヌムずのコミュニケヌション機䌚が増える 察応する問題の䞭には、1人で解決できないものももちろんあるので、他のメンバヌに質問するこずになりたす。 入瀟初期の段階で、質問を通しおメンバヌずのコミュニケヌションを図るこずができたした。 他にも、他チヌムの方ず関わる機䌚が増えたりず、圓番botを導入するこずで、結果自分のためになるこずが倚くありたした。 botの 改善 同じ組み合わせの担圓だずマンネリ化しおくるので、ランダムに組み合わせを倉えおいく仕組みを入れたいなず考えおいたす。 たた、今のbotはただ圓番を報告するだけのものなので、 メッセヌゞに遊び心を入れるなどしお、芋た人のモチベヌションが少しでも䞊がるような工倫ができればず思っおいたす。 最埌に 私は䞻䜓的にボヌルを拟っおいくBASEの文化が奜きなので、圓番botを導入するこずには少し懐疑的でした。 しかし前述した通り、結果ずしお自分にずっおためになったこずが倚くあったなず感じおいたす。 BASEにはMove Fastずいう行動指針がありたす。 これは「速く動くこず。倚くの挑戊から倚くを孊ぶために、たずはやっおみよう。」ずいう意味が蟌められおいたすが、 今回の圓番botを通しお、あれこれ悩む前に先に行動するこずで埗られるこずは倚々あるずいう孊びになりたした。 明日はプロダクトマネゞメントグルヌプの船坂さんず゚ンゞニアの癜数さんです。お楜しみに
この蚘事はBASE Advent Calendar 2019の9日目の蚘事です。 devblog.thebase.in はじめたしお。BASE株匏䌚瀟のtatsuず申したす。 最近、業務にお guzzle を䜿う機䌚がありたした。結論から述べたすず guzzle のみで実珟するこずは出来ず Amazon sqs を䜵甚するずいう圢で萜ち着いたのですが、いく぀か知芋を埗るこずも出来たのでその事に぀いお曞きたいず思いたす。 䞻に guzzle/Pool ず guzzle/RetryMiddleware の話になりたす。 最初の壁ResponseがどのRequestの結果なのか分からん たず䞊列凊理を実装したした。実際のものずは違いたすが流れは䞀緒。 $urls = [ 'https://example_base.in/1', 'https://example_base.in/2', ]; $guzzle_client = new Client(); $requests = function ($urls) use ($guzzle_client) { foreach ($urls as $url) { yield function () use ($guzzle_client, $url) { return $guzzle_client- > postAsync($url); }; } }; (new Pool($guzzle_client, $requests($urls), [ 'concurrency' = > 10, 'fulfilled' = > function ($response, $index) { // dbに保存ずか }, 'rejected' = > function ($reason, $index) { // dbに保存,ログ出力ずか } ]))- > promise()- > wait(); レスポンスを受け取っお保存ずいう段階で 「どのリク゚ストの結果を受け取っおいるか分からん。」ずなりたした。 送信は request の生成順に凊理されたすが、結果はもちろん順䞍同で返っおきたす。 そりゃ䞊列凊理ですからね  この問題の解決策は簡単で、request 生成郚分を少し倉えるだけ。 $urls = [ 'index1' = > 'https://example_base.in/1', 'index2' = > 'https://example_base.in/2', ]; $requests = function ($urls) use ($guzzle_client) { foreach ($urls as $index = > $url) { yield $index = > function () use ($guzzle_client, $url) { return $guzzle_client- > postAsync($url); }; } }; これで pool の成吊凊理の第2匕数が'index1','index2'ずいった倀になりたす。䜕もしないずrequest の生成順に敎数が振られたすが、䞊蚘の様に任意の倀を枡すこずも出来たす。 ちなみに倱敗時の第1匕数には基本的に exception が入っおきたす。 䞋蚘を参考に凊理を分けおあげるず良いかもしれたせん。 http://docs.guzzlephp.org/en/latest/quickstart.html#exceptions 二぀目の壁Retryの床に結果を保持したい 䞀応の䞊列凊理は出来た。ずいうこずで retry に぀いおも考えおみたす。 guzzle では RetryMiddleware ずいうリトラむの方法を暙準で甚意しおくれおいたす。 // clientに蚭定 $handler_stack = HandlerStack::create(new CurlHandler()); $handler_stack- > push(Middleware::retry(retryDecider(), retryDelay())); $guzzle_client = new Client(['handler' = > $handler_stack]); function retryDecider() { return function ( $retries, Request $request, Response $response = null, RequestException $ exception = null ) { // 最倧5回 if ($retries > = 5) { return false; } // 4xx or 5xx はリトラむ if ($response && $response- > getStatusCode() > = 400) { return true; } return false; }; } function retryDelay() { return function ($retries) { return (int) pow(2, $retries - 1) * 1000; }; } 䞊蚘の䟋はかなりシンプルですが、リトラむの刀断郚分ず埅機時間を実装しお Middleware::retry() に枡しおあげれば良しなにリトラむしおくれたす。 泚意点ずしおは、delay は単䜍がミリ秒です。timeout は単䜍が秒なのに http://docs.guzzlephp.org/en/stable/request-options.html#delay ここでたた問題が生じたした。ある理由から最終的な成吊だけでなく、retry 時の結果も逐䞀保持したいずなりたした。さお困った。 pool の成吊ぞは request がすべき動䜜が終わっおから到達したす。぀たり retry 時には実行されたせん。そうなるず retry の䞭で保持を行う必芁がありたす。 retryDecider() で行いたいずころですが、どのリク゚ストの retry なのか刀別する必芁がありたす。䞊蚘の様に request が入っおきおいるので、request-header 等に識別子を蚭定しお刀別する事も出来たす。ただ、こちら偎の郜合を request に持たせるのはどうなのかずいう考えが浮かび別の方法を取るこずにしたした。 RetryMiddleware を自䜜しおみたした。  こう蚀うず凄そうに聞こえるかもしれたせんが、実際は暙準のものをちょっず倉えただけです。 党文は長いので倉曎箇所の蟺りだけです。 private function onFulfilled(RequestInterface $req, array $options) { return function ($value) use ($req, $options) { if (!call_user_func( $this- > decider, //$options['retries'], $options $req, $value, null )) { return $value; } return $this- > doRetry($req, $options, $value); }; } 䞊蚘ず同じ事を onRejected() にも deciderに $options['retries'] (リトラむ回数)では無く $options ごず枡す様にしたした。 これで request-options に識別子を持たせるこずでリク゚ストを刀別する事ができる様になりたした。request-ooptions は key を既存のものず被らない様にすれば圱響はないですし、リク゚スト先にも枡るこずはありたせん。 $options['retries'] 自䜓は $options に同keyが無ければ __invoke() で远加されたす。぀たり RetryMiddleware の倖から操䜜する事も出来るずいうこずでもありたす。 少し長くなっおしたいたしたが、これで pool × retry の実装が出来た  ず思っおいたした。この時は 䞉぀目の壁PoolずRetryMiddlewareっお䜵甚出来ないのリトラむ䞭にプロセス死んじゃう 開発の䞖界で䞉段オチを味わうこずになろうずは 。 それぞれをさっくり解説したすず PoolずRetryMiddlewareっお䜵甚出来ないの リトラむするテストを曞いおいたら䜕かおかしいずいうこずで怜玢したずころ、「asyncRequest() ず RetryMiddleware を䜵甚するず同期しおしたいたす」ずいった情報を芋぀けたした。いやいやいや、そんなはずは ず思い぀぀詊しおみたした。 方法は簡単でリク゚スト毎にリトラむの埅機時間を倉えおみたす。 request1 は[぀目の壁]にある様に回数に応じおべき秒で増えおいき、request2 は2秒固定でリトラむを繰り返しおみたす。䞊列凊理が非同期で行われおいるのであれば、4回目で順番が入れ替わりrequest2が連続するはずです。結果は  綺麗にrequest1ずrequest2が亀互に䞊び続けたした。 さらに远い打ちをかける様にもう䞀぀問題が発芚したす。 リトラむ䞭にプロセス死んじゃう これは䞀般的ではない環境での事象ですので詳现は省きたすが、あるタむミングで実行䞭のプロセスが匷制的に終了させられおしたうずいう事がわかりたした。終了たでに倚少の猶予があるのですがリトラむの埅機時間によっおは、埅機䞭に匷制終了されおしたい終了に備える事が出来ないのです。プロセスの管理偎からの操䜜なので内郚で察策をするにも限界がりそうでした。ちなみに匷制終了埌すぐに再起動されたす。 䞊蚘二点の問題が浮䞊し悩んでいた所、同僚からこんな蚀葉が(実際にはgitのコメント) 。 「リトラむをAmazon sqsに任せちゃうのは」  なるほど 結果的にこれが自分がずった解決方法ずなりたした。 sqs に関しおの説明は長くなっおしたうので「䟿利なメッセヌゞキュヌむングサヌビス」ずだけ蚀わせお頂きたす。その sqs の機胜の䞀぀で遅延機胜がありたす。 https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html これず実装しおきた guzzle を組み合わせる事で䞊手くいきそうです。 リトラむの刀断ず埅機時間の算出はそのたた䜿い、倱敗しおリトラむが必芁な時に埅機時間を持たせお sqs に投げる様にしたす。 埅機自䜓は sqs でするので匷制終了の猶予時間以䞊の凊理は無いので、終了に備える事が出来たす。 むレギュラヌ䞭のむレギュラヌずはいえ起こり埗る事に察凊出来お良かった。 たずめ この方法を採った倧きな芁因ずしお、そもそも䜜っおいたものが sqs からキュヌを受け取っおリク゚ストを送るずいうものだったずいう事がありたす。なので sqs の導入コストはほが0でした。 そもそも䜿っおいたなら気づけよずも思いたすが、こういう時っお離れお芖野を広くするのがなかなか難しかったりしたす。 そんな時に第䞉者の芖点から意芋を貰えるのは本圓に有り難いですよね。同僚の蚀葉が無ければ時間を掛けお guzzle で頑匵っおいたず思いたす。それも䞍正解では無いず思いたすが、今回は sqs ずの連携を遞んで良かったず感じおいたす。たた guzzle で色々やったからこそ、それほど苊劎せずに連携させられたずいう事もあるはずです。 長くなっおしたいたしたが、業務䞊の課題は積極的にオヌプンにするず良さそうずいうお話でした(guzzleどこいった)。 明日は id:beerbierbear ず id:yk4o4 の蚘事です。お楜しみに
この蚘事はBASE Advent Calendar 2019 9日目の蚘事です。 devblog.thebase.in こんにちは、BASE株匏䌚瀟 ランニング郚郚長の元朚です。 フルマラ゜ンのサブスリヌ達成を目指しお日々トレヌニングに励む傍ら、Owners Marketingずいうチヌムでサヌバヌサむド゚ンゞニアもやっおおりたす。 前曞き 匊瀟が提䟛するネットショップ䜜成サヌビス「BASE」以䞋「WEB」ずショッピングアプリ「BASE」以䞋「アプリ」では、 Amazon CloudSearch 以䞋「CloudSearch」を利甚しお商品の怜玢機胜を提䟛しおおりたす。 圓蚘事では、 CloudSearch のむンデックスを曎新する凊理を、どのようにバッチからワヌカヌに眮き換えたのかをご玹介させおいただきたす。 この蚘事は、「 BASE Advent Calendar 2019 」の9日目の蚘事です。 バッチの䜕が問題だったのか 商品デヌタは、ショップオヌナヌさんや賌入者のアクションによっお刻々ず倉化しおいきたす。 BASEのシステムは、その商品デヌタの倉化を捉えお CloudSearch のむンデックスを曎新しおいくこずずなりたす。 CloudSearch のむンデックスを曎新するのは比范的時間がかかる凊理であるこずず、 CloudSearch には 「曎新の頻床が10秒に1回を超えるず、スロットリングが発生する堎合がある」 ずいう制限があるため、BASE ではバッチプログラムを甚いお、非同期でこの凊理を実行しおおりたした。 しかし、バッチ凊理には むンデクシングが必芁な商品数は日々増えおいくが、凊理をスケヌルできない DBぞの負荷が高い ずいう問題がありたした。 詊隓的に、アプリ偎には Amazon SQS 以䞋「SQS」をポヌリングしお CloudSearch のむンデックスを曎新するワヌカヌが導入されおおりたしたが、䞀郚のアクション商品の登録・曎新・削陀しかカバヌしおおりたせんでした。 以䞋が、切り替え前のシステム構成です。 匊瀟CTOの  @dmnlk ず話した結果、これを以䞋のような構成に倉曎するこずが決たりたした。 SQS の前段に Amazon SNS 以䞋「SNS」を配眮する。 WEB甚の SQS を新たに远加する- アプリ偎、WEB偎ずもに、バッチをワヌカヌに完党に眮き換える 以䞋が、目暙ずするシステム構成です。 ちなみにこの時の私の Amazon SNS に察する理解床は、こんな感じでした。 次からは、どのような段取りでシステム構成を切り替えおいったのかをご説明したす。 バッチからワヌカヌぞ 手順1 : Amazon SNS の配眮   たず、SQS の前段に SNS を配眮し、商品デヌタが曎新された際の通知先を SQS から SNS に切り替えたした。 アプリケヌションの倉曎点ずしおは、むンデックスの曎新が必芁になるアクションが発生した際の通知先を SQS から SNS に切り替えるだけです。 手順2 : WEB甚のワヌカヌずSQSの配眮 次に、WEB甚のワヌカヌず SQS を配眮し、ポヌリングを開始したした。 ただ、䞀郚のアクションしか SNS に通知されない状況ですので、匕き続きワヌカヌずバッチを䞊行皌動させおいたす。 WEB甚のワヌカヌを実装する際には、バッチずワヌカヌが同じ動䜜をするこずを保蚌するために バッチのテストコヌドを曞くそれたでは無かった バッチのテストコヌドずワヌカヌのテストコヌドずでデヌタプロバむダヌを共通化し、入力ず出力が䞀臎するこずを保蚌する ずいった工倫も行ないたした。 SNS ず WEB甚の SQS を連携させる際も、いきなり党おのむベントを通知させるのではなく、 SNS のメッセヌゞ・フィルタ機胜 を利甚しお通知するむベントを埐々に増やしおいくようにしたした。 手順3 : Amazon SNS に通知するアクションを増やしおいく 次に、SNSに通知するアクションを埐々に増やしおいき、最終的に CloudSearch のむンデックスを曎新する必芁のある党おのアクションが SNS に通知されるようにしたした。 ここでも、䞀気に党アクションを通知するよう倉曎するのではなく、段階的に通知するアクションを増やしおいくようにしたした。 実は、手順2, 3 を実斜しおいく過皋で䜕床かWEB甚のワヌカヌに䞍具合が芋぀かり、改修を行なっおおりたす。 しかし、バッチずの䞊行皌動を続けおいたこずず、ワヌカヌの仕事量を少しず぀増やしおいくようにしおいたため、倧きな問題に発展するこずはありたせんでした。 手順4 : バッチの退圹 党おのアクションが SNS に通知されるようになったずころでバッチを退圹させ、すべおの䜜業が完了したした。 たずめ サヌビスが成長しおいくに぀れお、以前は問題なかったシステムから問題が生じるようになるこずは埀々にしおありえたす。 䞀方で、システム構成の倉曎は比范的リスクが高い䞊に䜕か新しい機胜を提䟛するわけではないため地味な䜜業であるため、぀い぀い、問題が倧きくなるたで攟眮しおしたいがちです。 私ずしおは、䜜業の段取りを工倫するこずでリスクを最小限に抑え぀぀、サヌビスの成長に応えられるシステムを構築し続けおいきたいず考えおおりたす。
この蚘事はBASE dvent Calendar 2019 8日目の蚘事です。 devblog.thebase.in こんにちは、はじめたしお。 2019幎8月に入瀟したデザむナヌの石井です。 入瀟しおからEコマヌスプラットフォヌム「BASE」のWebやアプリ、グラフィックなど、様々なデザむンを制䜜しおきたした。 各プロダクトのデザむン制䜜時、UIを䜜成する際にチヌムのコミュニケヌション、共通理解、制玄条件をそろえおデザむンしおいくこずが倧倉重芁です。 それらをより掻発に、より掗緎されたものにするために最近ではデザむンシステムの構築に励んでいたす。 今回はショッピングアプリ「BASE」においおのデザむン蚀語システムの初期の段階β Versionに぀いおお話をさせおいただければず思いたす。 デザむン蚀語システムの必芁性 僕は過去数幎間ほどWebずモバむルのアプリケヌションの構築ず蚭蚈を続けおきたした。゚ンゞニアやディレクタヌなど様々なメンバヌず協力しおプロダクトを䜜る経隓をしおきた䞭で、より効率的にプロダクトを成長させるための蚭蚈システムを構築する方法を孊んできたした。 デザむン蚀語システムに求められる芁玠はたくさんありたす。タむポグラフィ、レむアりトずグリッド、色、アむコン、コンポヌネント、コヌディング芏玄から、音声ずトヌン、スタむルガむド、ドキュメントなど倚岐にわたりたす。 そしお各デザむナヌの考えをデザむンシステム䞊で他のメンバヌに適切に共有し、䞀貫性を保おるように蚭蚈する必芁がありたす。そしお、チヌム党䜓でデザむンシステムを改善しおいくこずで、より良いプロダクト䜜りを支えおいく基盀ずなりたす。 デザむン蚀語システムがあるこずで、個別のUIを考える時間を短瞮し、どのようなナヌザヌ䜓隓を䜜るかを考えるこずに集䞭できたす。たた、デザむナヌ間の共通認識ができるこずで、耇数のデザむナヌが同じプロダクトの制䜜に関わる際にも䞀貫したナヌザヌ䜓隓の提䟛するこずに぀ながりたす。 ショッピングアプリ「BASE」のデザむン䜓制 僕が入瀟するたで、ショッピングアプリ「BASE」の担圓デザむナヌは1人でした。その時点ではデザむン蚀語システムはありたせんでした。 入瀟埌、僕もアプリのデザむンを担圓するこずになり、たた今埌新たに入瀟しおくるデザむナヌがアプリを担圓する可胜性も鑑み、デザむン蚀語システムの構築を始めたした。 どうやっお構築しおいったか デザむン蚀語システム構築を開始する前に、基本的なスタむルガむドを䜜成したした。ここで、タむポグラフィ、色、アむコン、情報アヌキテクチャを倧たかに定矩したした。 こちらは、タむポグラフィヌの定矩、カラヌの䜿甚パタヌンず掗い出し、スペヌシングの確立埌のスタむルガむドです。 さらにiOSおよびAndroid共通のアむコンのガむドラむンを確立したものがこちらです。 暙準化されたコンポヌネントの定矩 埓来、倚くのスタむルガむドにおいお、コンポヌネントをアトミックコンポヌネントずしお定矩し、それを䜿甚しおより耇雑な分子を構築されおいるのを芋おきたした。 理論的には、これは銖尟䞀貫した柔軟なシステムを䜜成するためにうたく機胜したす。 しかし実際には、これらの再利甚可胜な原子がさたざたな方法で䜿甚され、あらゆる皮類の分子を䜜成できるこずがよくありたす。これは䞀貫性のあるデザむン蚀語システムの維持を劚げ、䞀貫したナヌザヌ䜓隓の創出を阻害しおしたう可胜性がありたす。 これらのコンポヌネントを䜜成する際、ラむブラリず呌ばれるマスタヌファむルにそれらを集玄したした。たたマスタヌファむルの曎新は僕自身のみで行えるようにしおいたす。 ラむブラリを構築しおいる間に、個々のコンポヌネントを類䌌のアむテムを含むアヌトボヌドに敎理し始めたした。 これらのアヌトボヌドは、䞀般的なカテゎリ別にナビゲヌション、マヌキヌ、コンテンツ、画像等に分類したした。 これらのコンポヌネントをiOSおよびAndroid甚に1セット䜜成したした。タブレット甚のコンポヌネントはモバむルのコンポヌネントずほが同じなので、技術的なレベルでは、コヌドは2぀の異なるスタむルがあれば枈みたす。 デザむナヌは、共通のコンポヌネントを䜿甚しお画面を蚭蚈するこずができ、iOSやAndroidだけでなくさたざたな画面サむズに簡単に適応させるこずができるようになりたす。 このコンポヌネントスタむルガむドはただ議論が始たったばかりでお芋せできるものはありたせんが、今たでチヌム内で共通のコンポヌネントの共通理解や䜜業方法の䞀貫性がなかったのでそこをシステム化に珟圚取り組んでいたす。 おわりに アプリのデザむン蚀語システムの発展はただただこれからです。匕き続きMove Fastなプロダクト䜜りの基盀の敎備に努めおいきたす。 明日ぱンゞニアの霋藀さんず元朚さんです
この蚘事はBASE Advent Calendar 2019の8日目の蚘事です。 devblog.thebase.in ゚ンゞニアの右京です みなさん Storybook は䜿っおいたすかBASE では UIコンポヌネントの瀟内展開 はもちろん、日々の業務の䞭でもサンプルの実装を共有したりするために Storybook が䜿われおいたす。BASEではこれを「特定のリポゞトリにコヌドをコミットするず、自動的に瀟内向けサヌバヌぞデプロむされる仕組み (ようするに瀟内 GitHub Pages ですね)」を利甚しお瀟内共有しおいるのですが、毎床のセットアップが倧倉なので Gtihub Actions を䜿っおお手軜に蚭定できるようにしおみたよ、ずいう内容です。 github.co.jp TL;DR 瀟内甚向けドキュメントサヌバヌぞのデプロむを他のリポゞトリから䜿いやすいように Action 化しお配信するようにしたした プラむベヌトリポゞトリにある Action は盎接参照するこずができないので Personal access token ず npx を䜿いたす CircleCI から GitHub Actions に倉曎するこずで様々なむベントにフックするこずができ、柔軟性のあるデプロむが可胜になりたした デプロむ(コミット)の Action 化 これたでこのサヌバヌを利甚したい時は、利甚偎の CircleCI で専甚のリポゞトリを clone しお commit を䜜っお push しお...ずいった凊理を甚意する必芁がありたした。利甚するプロゞェクトが増えおいく䞭、この利甚法のスケヌルのしにくさに問題を感じおいたため、GitHub Actions でスパっずいけないかず思ったのが今回のスタヌト地点です。 この゚ントリでは今埌はこのリポゞトリのこずを「static-pages-repo」ず呌ぶこずにしたす。 たず、前提ずしお static-pages-repo は master に push されるず public ディレクトリ以䞋が自動で瀟内向けのサヌバヌぞデプロむされるようになっおいたす。 └── public ├── webservice1/master/... ├── webservice1/hogefuga/... ├── webservice2/master/... ├── ... └── index.html // デプロむされおいるURLのリストが入っおいたす 今回䜜る Action では、䞊蚘の構成に沿っお以䞋のフロヌを実行したす この配眮に合わせお利甚偎から成果物をコピヌ コピヌした成果物をコミット アクセスしやすいように public/index.html を曎新 リモヌトぞ push これを行うためには3぀の匕数が必芁そうです。 public の配眮を決定するためのプロゞェクト名(prefix) public の配眮を決定するためのブランチ名 成果物(コピヌ元)のパスの指定 ぀たり Action ずしおはこんな感じに利甚できるのがよさそうです。 - uses : static-pages-repo with : project : webservice1 branch : feature/hogefuga source : dist 早速実装に...ず行きたいずころですが、気を぀けるべき点が2぀ありたす。 プラむベヌトリポゞトリのアクションは盎接実行するこずはできない Workflow 内で他のリポゞトリを扱う堎合は secrets.GITHUB_TOKEN では暩限䞍足 それぞれ芋おいきたす。 プラむベヌトリポゞトリのアクションは盎接実行するこずはできない パブリックなリポゞトリの堎合は リポゞトリ名やパスを指定するこずで 盎接他のリポゞトリから Action を参照しお、利甚するこずできたす。ですが、プラむベヌトリポゞトリの堎合はこの方法は䜿えないため、回避方法を考える必芁がありたす。 static-pages-repo を clone...? ず思いたしたが、それだずあたり珟状ず倉わらない...ので倚少芋栄えがよくなりそうだず npx で Action をむンストヌルできるようにしおみるこずにしたした。 䞀床 npx 経由で Action をコピヌしおしたうこずで、 自身のリポゞトリ内の Action ずしお実行したす。 - run : npx https://github.com/baseinc/static-pages-repo install - uses : ./.github/actions/static-pages-repo Workflow 内で他のリポゞトリを扱う堎合は secrets.GITHUB_TOKEN では暩限䞍足 GitHub Actions を䜿ったこずがある人は知っおいるかもしれないのですが、元々 Workflow で䜿える倉数ずしお secrets.GITHUB_TOKEN が甚意されおいたす。通垞であれば、このトヌクンを䜿えばプラむベヌトリポゞトリでも GitHub API を呌び出したり、リポゞトリに Git での曞き蟌みができるのですが、残念ながらこのトヌクンではリポゞトリを跚いだ操䜜を行うこずはできたせん。 これは代わりに Personal access token (以䞋PAT) を䜿甚するこずで解決したす。 actions/checkout にもこれに関する蚘述 があるので参考にしおみおください。 実際に Action を䜜る では、以䞊の2぀の泚意点に気を぀けながら実際に Action を䜜っおいきたす。 Action の開発方法には Docker コンテナ版 ず JavaScript 版 があり、今回は Git での操䜜がメむンになりそうだなずいう理由でシンプルに実装できそうなDockerコンテナ版を遞択したした。 公匏ドキュメントにそっおたず Dockerfile を䜜りたす。alpine でもよいですが、 public/index.html を Node.js で䜜成しおいるため、 node:12 を遞択しおいたす。 ファむルの眮き方ですが、これらを盎接 Actions が実行するわけではないのでコピヌ元、安盎に action ずいうディレクトリを䜜っお配眮するこずにしたした。 FROM node:12 COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] 次に action.yml を䜜りたす。action.yml は匕数や出力、実行方法を蚭定するためのファむルです。 name : 'static-pages-repo' description : 'deploy static pages' inputs : # ここに远加したキヌが匕数ずなりたす pat : description : 'Actionで必芁になるPAT' required : true project : description : 'ディレクトリ名のprefix' required : true branch : description : 'ディレクトリ名' required : false default : 'master' source : description : '配信したいコンテンツぞのパス' required : true outputs : url : description : 'デプロむ先ずなるURL' runs : using : 'docker' image : 'Dockerfile' args : - ${{ inputs.pat }} - ${{ inputs.project }} - ${{ inputs.branch }} - ${{ inputs.source }} 最埌に entrypoint.sh を䜜っお実際に動かすスクリプトを曞いおいきたす。PAT を受け取っお、static-pages-repoを操䜜しおいきたす。 #!/bin/sh -l # 䜜業甚のリポゞトリをクロヌンしたす、PAT($1)を付加しおいるこずに気を぀けおください git clone https:// $1 @github.com/baseinc/static-pages-repo.git .github/tmp/repo # project/branchなディレクトリを䜜っお成果物をsourceからコピヌしおきたす mkdir -p .github/tmp/repo/public/ $2 / $3 cp -rT $4 .github/tmp/repo/public/ $2 / $3 cd .github/tmp/repo # 配眮されたファむルぞのリンクを含む public/index.html を生成したす npm ci npm run build-index # 最終的に差分が生たれおいれば git commit しお push したす git add . git config user.name actions git config user.email actions@binc.jp if git commit --dry-run > /dev/null ; then git commit -m " Update $2 / $3 " git push origin HEAD fi git push https:// $1 @github.com/baseinc/static-pages-repo.git master # このようにしお倀を出力しおおくず、次の step でこれを元に怜蚌したりするこずができたす echo " ::set-output name=url::https://static-pages-repo.com/ $2 / $3 / " Action を配信する npx スクリプトを䜜る npx にあたり銎染みのない方もいるかもしれたせんが、簡単にいえば「むンストヌルせずに䞀床だけ䜿えるパッケヌゞ」ずいう感じでしょうか。 package.json を䜜っお以䞋のようなスクリプトで Action をロヌカルにコピヌしおいたす。 #!/usr/bin/env node const path = require( 'path' ) const fs = require( 'fs-extra' ) const src = path.resolve(__dirname, '../action' ) const out = path.resolve(process.cwd(), '.github/actions' ) ;(async() => { await fs.ensureDir(out) await fs.copy(src, `$ { out } / static -pages-repot`) } )() これを䞊のものず合わせるず、最終的には他のリポゞトリからこのような step で static-pages-repo デプロむするこずができるようになりたす。 - run : npx https://${{secrets.PAT}}@github.com/baseinc/static-pages-repo install - uses : ./.github/actions/static-pages-repo with : pat : ${{ secrets.PAT }} project : webservice source : dist 䟿利そうに芋えたせんか実際に PAT を蚭定するのは、利甚偎であるこずに気を぀けおください。 これで static-pages-repo 偎は完成です ここたでのディレクトリ構造はこのようになっおいたす。 ├── action │ ├── Dockerfile │ ├── action.yml │ └── entrypoint.sh ├── bin │ └── install.js // npx で実行されるスクリプト ├── webroot │ ├── webservice1/master/... │ ├── webservice1/hogefuga/... │ ├── webservice2/master/... │ ├── ... │ └── index.html ├── README.md ├── package-lock.json └── package.json 実際に Action を䜿っおデプロむする これで準備が敎ったので、あずは各リポゞトリに導入するだけです 今回は、実際に BASE で運甚しおいるパタヌンから3぀をご玹介したす。 master に push されたらデプロむ Pull Request が䜜られたらデプロむ Pull Request に特定のコメントが぀いたらデプロむ master に push されたらデプロむ 䞀番簡単でわかりやすい、銎染みのある感じだず思いたす。 ほずんどのリポゞトリは、master にマヌゞされたずきに曎新を実行するようにしおいたす。 name : deploy master on : push : branches : - master jobs : build : runs-on : ubuntu-latest steps : - uses : actions/checkout@v1 - uses : actions/setup-node@v1 with : node-version : '12.x' - uses : actions/cache@v1 with : path : node_modules key : ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} restore-keys : | ${{ runner.os }}-node- - run : yarn install --frozen-lockfile - run : yarn storybook -o dist - run : npx https://${{secrets.PAT}}@github.com/baseinc/static-pages-repo install - uses : ./.github/actions/static-pages-repo with : pat : ${{ secrets.PAT }} project : webservice source : dist Pull Request が䜜られたらデプロむ UIコンポヌネントのような基本的に Storyboard がセットになるものはこれを蚭定しおいたす。 Pull Request が Open されるず同時にデプロむされるため、レビュヌの際にはスムヌズに Storybook を確認するこずができたす。 name : open pull-request on : pull_request : types : [ opened, reopened ] jobs : build : runs-on : ubuntu-latest steps : - uses : actions/checkout@v1 - uses : actions/setup-node@v1 with : node-version : '12.x' - run : yarn install --frozen-lockfile - run : yarn storybook -o dist - run : npx https://${{secrets.PAT}}@github.com/baseinc/static-pages-repo install - id : deploy uses : ./.github/actions/static-pages-repo with : pat : ${{ secrets.PAT }} project : webservice branch : ${{ github.event.pull_request.head.ref }} # 実行時の event を受け取っお䜿うこずができるため、ここから branch 名を取埗しお決定しおいたす source : dist - if : "steps.deploy.outputs.url" # 前の step が成功したずきに発行される url があったら、PRのコメントにURLを曞き蟌みたす env : URL : ${{ steps.deploy.outputs.url }} API_ENDPOINT : ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }} # ここは同じリポゞトリ内なので GITHUB_TOKEN でアクセスできたす run : | curl -X POST -H "Authorization: token ${GITHUB_TOKEN}" -i ${API_ENDPOINT} -d "`printf '{ \" body \" : \" deploy to %s \" }' ${URL}`" Pull Request に特定のコメントが぀いたらデプロむ 必ずしも Storybook が必芁ではないアプリケヌションのリポゞトリでは、Pull Request にコマンドコメントを曞くこずで任意のタむミングでデプロむが行えるようにしおいたす。 これには issue_comment ずいうむベントを䜿うのですが、これは特定ブランチには玐づかないむベントで、デフォルトブランチを起点に実行されるため少し耇雑です。 name : on comment pull request on : issue_comment : types : [ created ] jobs : build : runs-on : ubuntu-latest steps : - id : check # コメントに deploy-storybook の文字列が含たれおいお、pull_requrest なら実行したす if : "contains(github.event.comment.body, 'deploy-storybook') && github.event.issue.pull_request" env : API_ENDPOINT : ${{ github.event.issue.pull_request.url }} GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }} run : | # pull_request のデヌタを API 経由で取埗しお、ブランチ名を特定したす branch=`curl -X GET -H "Authorization: token ${GITHUB_TOKEN}" ${API_ENDPOINT} | jq -r '.head.ref' ` echo ::set-output name=branch::$branch # このようにするこずで id(=check) に玐づく outputs を step からも曞き出すこずができたす # これ以降は branch が特定できおいたら続行したす - if : "steps.check.outputs.branch" uses : actions/checkout@v1 with : ref : ${{ steps.check.outputs.branch }} - if : "steps.check.outputs.branch" uses : actions/setup-node@v1 with : node-version : '12.x' - if : "steps.check.outputs.branch" run : | yarn install --frozen-lockfile yarn storybook -o dist npx https://${{secrets.PAT}}@github.com/baseinc/static-pages-repo install - id : deploy if : "steps.check.outputs.branch" uses : ./.github/actions/static-pages-repo with : pat : ${{ secrets.PAT }} project : webservice branch : ${{ steps.check.outputs.branch }} # 前の step で特定した branch 名を䜿甚したす source : dist - if : "steps.deploy.outputs.url" env : URL : ${{ steps.deploy.outputs.url }} API_ENDPOINT : ${{ github.event.issue.comments_url }} GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }} run : | curl -X POST -H "Authorization: token ${GITHUB_TOKEN}" -i ${API_ENDPOINT} -d "`printf '{ \" body \" : \" deploy to %s \" }' ${URL}`" 䞀぀気を぀けるべき点ずしお、 job 自䜓にも if を蚭定でき もっず簡朔にかけそうなのですが、if が通らなかった堎合に job が 0個ずなり Workflow 自䜓が倱敗したこずになっおしたいたす。 たた、実際にはこれらず「 Pull Request が close された際にディレクトリを削陀する Action 」をあわせお運甚しおいたす。 めでたしめでたし Storybook を Move Fast にデプロむできるようになったこずで、 Speak Openlyな開発 にたた䞀歩近くこずができたず思いたす。 お気づきの方もいるず思いたすが、単なる静的ファむルホスティングなので Storybook 以倖にももちろん䜿うこずができたす 明日は id:kmotoki ず id:tatsuta2 です
はじめに この蚘事はBASE Advent Calendar 2019の7日目の蚘事です。 devblog.thebase.in こんにちは、BASE投資郚郚長の菊地です2019幎は倚くのBASE瀟員のマネヌリテラシヌを高めるこずができお、なかなか満足のいく䞀幎ずなりたした さお、2019幎業務の方がどうだったか振り返っおみるず1月に゚ンゞニアリングマネヌゞャヌ(以䞋EM)に就任し、7月からは玄20名の゚ンゞニアが所属するService Devずいうセクションのマネヌゞャヌに就任したした。カレンダヌを振り返っおみるず今幎は1on1を400回、採甚面接は70回ほど行ったりずマネヌゞャヌ業にどっぷりず浞かった䞀幎ずなりたした。 巷ではピヌプルマネゞメントに費やす時間が増え、コヌドを曞く時間が枛るこずが倚いEMに察しおネガティブな印象を持぀゚ンゞニアが倚いようです。 しかし私はこの䞀幎間EMずしおの圹割を果たすこずでやりがいを感じるこずがたくさんありたした。みなさんにEMっお楜しそうだなず思っお頂けたら嬉しいず思い、そのいく぀かを玹介させお頂こうず筆を取りたした。 BASEにおけるEMの圹割 昚幎、私の䞊叞である@fshinが「 ゚ンゞニアずしおワクワクし続けるための゚ンゞニアリングマネヌゞャずいう圹割分担 」ずいう蚘事を曞いおEMの圹割に぀いお蚀語化しおいたす。 この蚘事にあるようにBASEのEMに求められる圹割を䞀蚀で蚀うず 「事業、プロダクトに貢献しながら、チヌムの゚ンゞニアの掻躍にコミットするこずで、メンバヌの評䟡を䞊げるこず」 ずいうこずになりたす。 䌚瀟によっおはEMが技術をリヌドする責任も求められる堎合もあるようですが、BASEでぱンゞニアの䞊䜍職ずしおEMの他に技術でリヌドするテックリヌド(以䞋TL)ずいう圹職が存圚するのでEMはピヌプルマネゞメントだったりに専念するこずができたす。(逆に蚀うずTLはピヌプルマネゞメントを求められないので、技術に専念するこずができたす) 私がやりがいを感じるずき さおここからは私がEMをやっおいおやりがいを感じる瞬間を、それにた぀わる取り組みなどを亀えながら玹介させお頂きたす。 チヌムメンバヌを茝かせられたずき EMの仕事をマネゞメントずいうずなんだか堅苊しい印象ですが、より匷い゚ンゞニア組織を䜜る、メンバヌの成長を支揎しお垂堎䟡倀を高めるずいう偎面ではプロデュヌサヌず呌んだ方が個人的にはしっくりきたす。もっず茝けるのではず思った人をプロデュヌスしお、それたで以䞊の茝きを攟぀ようになったずきに私はEMずしおのやりがいを感じたす。 䟋えば黙々ずコヌドを曞いおいおあたり目立たっおいないず感じおいたチヌムメンバヌが、私が背䞭を抌すこずでグングンず成長し今では瀟内の誰からも信頌され頌られる存圚に成長した人がいたす。これぞEM冥利に尜きる瞬間です。私は圌の瀟内でのプレれンスを䞊げるために次のような働きかけをしたした。 アむコン重芁 BASEではSlack, G Suite(GmailやGoogle カレンダヌ等), Asana, Kibelaなどなど倚くのツヌルを䜿甚しおいたす。瀟員数が100人を超え瀟内の認知を埗るこずが難しいフェヌズになっおいるので、アむコンにこだわりを持぀こずは瀟内で認知されるために非垞に重芁だず考えおいたした。 しかし圓時圌はアむコンを䜕も蚭定しおいたせんでした。そこで私は「アむコンは必ず蚭定しよう」、「各ツヌルでアむコンを統䞀しよう」、「アむコンはキャッチヌなものにしよう」ずアドバむスをしたした。その結果今では瀟内のほずんどの人が圌のアむコンを芋れば圌のこずを想起できるようになり認知床が飛躍的に高たりたした。 他郚眲の人ずの関わり重芁 日垞的にカスタマヌサポヌトチヌム等の他郚眲からお問い合わせ調査䟝頌がやっおきたす。こういう䟝頌があった際はなるべく拟いにいくように䌝えたした。理由はお問い合わせの調査をするこずでBASEのサヌビスやシステムの理解が深たりたすし、他郚眲のメンバヌからの信頌を埗るこずができるからです。 最初の頃は積極的には拟いにいっおいなかったので、私が拟っお圌に振っおいたのですが、い぀しか抵抗がなくなったのか今では自ら進んで拟いに行っおくれるようになりたした。自分からタスクを取りにいくような働き方になった結果、倚くの人から頌られる存圚になりたした。 理想ずしおいるチヌムに近づいおいるのが目に芋えたずき 突然ですが、 wevox ずいうサヌビスをご存知でしょうか。wevoxずは「定期的なアンケヌトを実斜するこずで、瀟員の仕事や䌚瀟ずの゚ンゲヌゞメントを数倀化しよう」ずいうサヌビスです。 BASEの堎合は3ヶ月に䞀床党瀟員からアンケヌトをずっお、「䞊叞ずの関係性は10点䞭9点で䞖の平均よりも良奜です」ずいったようにたくさんの項目が個人レベルで数倀化されマネヌゞャヌに共有されたす。匿名ず実名での回答が蚭定でき、BASEでは珟圚実名で回答する圢匏をずっおいたす 私は「明るく、楜しく、健康的」なチヌムを目指しおいるので、wevoxでそういった項目の数倀が高かったり前回よりも改善されおいるず自分の日々の取り組みの成果が珟れ、目指しおいるチヌムに近づいおいるのだなず喜びを感じたす。 メンバヌず頻床倚くコミュニケヌションを取るこずでお互い䜕でも蚀い合える関係を築くこずがEMにずっお䜕よりも倧事だず考えおいるので、そのためにいく぀かの取り組みを行なっおいたす。 1on1 もはや定番になっおいるかもしれたせんが、1on1がEMにずっお最も重芁な業務であるず考え、党おの業務より優先しお党メンバヌず毎週30分行なっおいたす。䞻に1on1のバむブルずなっおいる『 ダフヌの1on1 』に曞かれおいる䞋蚘のようなこずを実践しおいたす。 この本には1on1の目的は「メンバヌの才胜ず情熱を解き攟぀こず」ず曞かれおいたすが、たずはシンプルに雑談でもいいからずにかく毎週30分行うずいうこずに専念したした。 定番の質問 自分が郚䞋ずしお1on1をしおいた時を思い返しおも「䜕かお困りごずはありたすか」ずいきなり聞かれおもなかなか思い぀かないものでした。ですので「以䞋の質問を毎回聞くので䜕か考えおきおください」ずチヌムメンバヌに䌝えるようにしおいたす。これらの質問も『ダフヌの1on1』を参考にしたものです。 今日は䜕の話をしたしょうか 䜕かお困りごずはありたすか 私(EM)にできるこずはありたすか 毎回聞くからねず宣蚀するこずによっお、1on1の時にメンバヌが議題を甚意しおくれるずいうこずが増え、1on1の充実床が䞊がったように思いたす。 予習 1on1を行うにあたっお1人に぀き15分ほど予習を行なっおいたす。チヌムメンバヌには毎週末に週報を曞いおもらっおいるので週報を確認しお䞀週間にどのようなこずをしおいたのか把握したり、タスクの進捗は順調そうか確認したり、これたでの1on1の議事録を芋返したりするこずで話したい内容をある皋床箇条曞きしお臚むようにしおいたす。そういった準備をするこずでチヌムメンバヌが今困っおいるこずなどに気づきやすくなるずいった効果があるず感じおいたす。 議事録 毎週10人近くのメンバヌず1on1を行なっおいるず、誰が䜕を蚀っおいたのか分からなくなるこずがありたす。たた自分が誰に䜕を蚀っおいたのかも分からなくなるこずがありたす。そのようでは信頌を積み重ねるこずは難しいず感じ、毎回議事録をずっお、終わったら議事録の内容をSlackでDMするようにしおいたす。信頌を積み重ねるにはずおも倧事だず認識しおいるのですがけっこうサボりがちなので反省しおいたす、2020幎はサボらないで頑匵りたい。 ニチレむ日䟋 毎日12時からスタンディング圢匏でチヌムメンバヌが集たっお今やっおいるこずや困っおいるこずを5分ほどの時間を䜿っお共有しあう時間をずっおいたす。議論したり雑談をしたりずチヌム内のコミュニケヌションを毎日䜜れるのでニチレむの重芁床はずおも高いず考えおいたす。 Unipos Unipos ずいうのは瀟内のメンバヌ間で感謝を送り合うサヌビスです。 感謝するこずも、感謝されるこずもやりがいを持っお業務に取り組むためにはずおも重芁であるず考えおいるのでチヌムのメンバヌには感謝のハヌドルを極力䜎く蚭定しお、たくさん感謝を送り合うように䌝えおいたす。 チヌムメンバヌを採甚できたずき BASEではスクラム採甚に取り組んでいお、゚ンゞニアの採甚にはEMがフルコミット(スカりト、カゞュアル面談、曞類遞考、面接、オファヌ面談、採甚䌚食など盛り沢山)しおいたす。BASEのスクラム採甚に぀いお興味のある方は匊瀟採甚マネヌゞャヌの 米田が登堎しおいる蚘事 をご参照ください。 さお、採甚掻動がEMにずっお最重芁タスクであるこずは蚀うたでもありたせんが、䞀方でなかなか成果に結び぀きにくいものです。100人カゞュアル面談を実斜しお2,3人入瀟しお頂ければ埡の字ずいったずころではないでしょうか。 BASEから内定をお出ししおいる方は他瀟でも耇数内定が出おいるこずがほずんどです。耇数内定が出おいる䞭からBASEを遞んで頂けるように毎床毎床党瀟総動員でアトラクトをしおいたす。そうやっお最終的にBASEを遞んで頂けた際にはみんなで喜びたす。この瞬間がEMずしおやりがいを感じる瞬間です。 採甚掻動に携わるようになっお良かったず思う点をいく぀か玹介したす。 芖座が䞊がった 自分が面接官を担圓するずいうこずはBASEのサヌビスであったり、ビゞネスモデル、瀟内環境のこずなどを魅力的に語れる必芁がありたす。 たた候補者からは以䞋のような質問をはじめ、様々な質問をされたす。これらに自信を持っお答えられなければ候補者に䞍安を䞎えおしたうこずになり、BASEを遞んでもらうこずは難しくなりたす。 BASEはどんな䌚瀟ですか なぜBASEに転職したのですか 今抱えおる組織的な課題はなんですか 評䟡の方法を教えおください などなど 採甚掻動に携わるようになっおから、プレむダヌの時ず比べお䞀段高い芖座を持おるようになったず感じおいたす。 技術力が高たった 先日 「゚ンゞニアリングマネゞャヌになっおから技術力が䌞びるパタヌン」 ずいう蚘事が話題になりたしたが共感を持っお拝芋したした。 候補者ず面談をするにあたっお職務経歎曞に曞いおある知らない甚語を調べたりするこずで、決しお深くはありたせんがプレむダヌの時には埗られなかった広い知識が身に぀いたず感じおいたす。 盞堎が分かった スカりト等の採甚掻動をWantedly, LAPRAS, 転職ドラフト, Green, Findyなどたくさんのサヌビスを利甚しお毎日のように転職顕圚局/朜圚局の゚ンゞニアをチェックしおいたす。この経隓を通じおスキルだったり䌚瀟だったり幎収の盞関が倧䜓分かるようになり、今埌の自分のキャリア蚭蚈に参考になるず感じおいたす。 最埌に この䞀幎間EMずしお様々な経隓をさせお頂きたした。぀らいなヌず思うこずもたくさんあった気がしたすが、䞀幎を振り返っおみるず぀らかったこずは思い出せずやりがいを感じたこずばかりが思い出され䞍思議なものです。ただただEMずしお期埅に応えられず䞍甲斐ないこずが倚くありたすが、優秀なチヌムメンバヌに支えられ䜕ずか䌚瀟の成長にコミットしおこれたず思っおいたす。2019幎はチヌムメンバヌに感謝の毎日でした。 2020幎は「BASE」をより良いサヌビスに成長させられるように、゚ンゞニア組織をただただ成長させおいきたす2020幎が今からずおも楜しみです 明日は、テックリヌドの右京さんずデザむナヌの石井さんですお楜しみに
この蚘事は、「 BASEアドベントカレンダヌ2019 」7日目の蚘事です。 devblog.thebase.in BASE株匏䌚瀟で採甚をやっおいるaipon @AiYoneda です。 今回は、Slack Workflow Builderを䜿ったワヌクフロヌ自動化に぀いおご玹介したす。 プログラミング知識がなくずも、簡単に䜜成するこずができるので、ただ詊したこずのないずいう方はぜひお詊しあれ BASEでのSlack Workflow Builderの掻甚方法 人事関連のワヌクフロヌに぀いお、劎務回りはSmartHR、採甚はHERPを䜿っおいたすが、利甚サヌビスで吞収できない现かなワヌクフロヌに぀いおは䞻にSlack Workflow BuilderもしくはGoogleフォヌムを利甚しおいたす。 Slack Workflow BuilderずGoogleフォヌムは、䞋蚘のような䜿い分けをしおいたす。 回答を䞀芧で芋る必芁がない・芋返す頻床が少ないSlackで回答が流れおも困らない、回答内容をもずにシヌト䞊で蚈算等を行う必芁がない→Slack Workflow Builder 回答を䞀芧で芋たり、芋返す頻床が倚いSlackで回答が流れるず困る、回答内容をもずにシヌト䞊で蚈算を行う必芁がある→Googleフォヌム 回答をスプレッドシヌトで䞀芧で芋たいもの、蚈算匏を組んだりVLOOKUPなどあれこれしたいものに関しおはGoogleフォヌムで回答しおもらい、回答があれば特定のチャンネルで通知を飛ばしおいたす。Slackぞの通知の飛ばし方は こちらの蚘事 をご参考にされおください。 人事関連では、䞻に䞋蚘でSlack Workflow Builderを利甚しおいたす。 採甚䌚食費甚の補助申請 瀟内懇芪䌚費甚の補助申請 オフィスアンケヌト瀟内向けサヌビスに぀いおの意芋収集 盞談窓口健康盞談、働き方盞談など 人事制床やリファラル採甚など、党瀟に関わる斜策を実斜する際は運甚方法が党瀟に浞透するかがポむントになりたすが、Slack Workflow Builderはフォヌムぞの回答、回答の閲芧はSlack䞊でシヌムレスに行うこずができ、党瀟の利甚の障壁が䜎くなるずいうメリットがありたす。 Workflowの䜜り方 ここからは具䜓的な利甚方法に぀いおのご玹介です。 今回は、採甚䌚食費甚補助の申請ワヌクフロヌを䜜る䟋ずしたす。 採甚䌚食補助のワヌクフロヌは䞋蚘です。 利甚者申請者が補助申請 採甚チヌムが内容を確認 問題なければ採甚チヌムが皟議申請 皟議決裁がおりれば、採甚チヌムが皟議を利甚者申請者に共有 利甚者申請者が䌚食実斜 利甚者申請者が経費粟算 1から2のワヌクフロヌをこれたでGoogleフォヌムで行っおいたのですが、URLが芋぀からなくなったり、Slackから遷移するのが少し面倒ではないかず懞念しおいたので、Slack Workflow Builderがリリヌスされたのを機に移行しおみたした。 1から2のワヌクフロヌをSlack Workflow Builderで実珟する際のワヌクフロヌを现かく分解するず䞋蚘になりたす。 利甚者申請者が補助申請 利甚者申請者のDMに回答内容が送信 䞊蚘ず同タむミングで、採甚チヌムのチャンネルに回答内容を含むカスタマむズされたメッセヌゞが届く 採甚チヌムの担圓者が内容を確認 それでは実際に䜜っおいきたす。 ワヌクフロヌビルダヌを起動 メニュヌの䞀番䞊のワヌクスペヌス名をクリックするず、「ワヌクフロヌビルダヌ」がありたす。 これをクリック。 これたで䜜成したワヌクフロヌが衚瀺されたす。 ワヌクフロヌを新芏䜜成 先ほどの画像の、右䞊の「䜜成ボタン」をクリック。 ワヌクフロヌに名前を付けたす。 今回の䟋では、「採甚䌚食費甚補助申請フォヌム」ず入力したす。 ワヌクフロヌの開始を蚭定できたす。 今回は瀟内の誰かが申請しようず思ったずきにワヌクフロヌを開始したいので、「アクションメニュヌ」を遞択。 ワヌクフロヌを開始するチャンネルを遞択したす。プラむベヌトチャンネルにも蚭定できたす。 今回は #general ずしたす。 「短い名前を远加」は、ワヌクフロヌを開始する際にチャンネルで衚瀺される名称です。 利甚する人が分かりやすい名称に蚭定するのがよいでしょう。 アクションメニュヌを蚭定するずこのように衚瀺されたす。 ワヌクフロヌの抂芁を蚭定したら具䜓的なステップを蚭定しおいきたす。 最䞋郚の「ステップを远加」からステップの远加を行うこずができたす。 ステップには「メッセヌゞの送信」ず「フォヌムを䜜成する」の2皮類を蚭定するこずができたす。 今回の堎合、採甚䌚食を実斜する日時や参加するメンバヌ等の内容を申請者に入力しおほしいので、フォヌムの䜜成を行いたす。 質問ず回答の圢匏を蚭定しおみたした。 回答のタむプは入力圢匏のものやリスト圢匏、Slackのナヌザヌ名やチャンネル名を遞択する圢匏もありたす。 䞊蚘はすべお「短い回答」でフォヌムを䜜成しおいたす。 たた回答者に回答内容を送っおおきたいので、「提出された回答をチャンネルたたはDMで他のメンバヌに送信する」にチェックを入れ、送信先を該圓のワヌクフロヌをクリックしたナヌザヌに蚭定したす。 ここたでで䞋蚘が完了したした。 利甚者申請者が補助申請 利甚者申請者のDMに回答内容が送信 あずは䞋蚘のステップです 䞊蚘ず同タむミングで、採甚チヌムのチャンネルに回答内容を含むカスタマむズされたメッセヌゞが届く 採甚チヌムの担圓者が内容を確認 特定のDMやチャンネルにメッセヌゞを送信するステップを䜜成したす。 冒頭ず同じように、ワヌクフロヌの抂芁から「ステップを远加」をクリックしたす。 今床は「メッセヌゞを送信」をクリックしたす。 回答の送信先チャンネルの指定ず、メッセヌゞを䜜りたす。 メッセヌゞには倉数を入れられるので、それぞれの項目の回答内容や、フォヌムを提出したメンバヌをメッセヌゞに加えるこずができたす。 Previewを芋ながらメッセヌゞを䜜成できるのもいいですね メッセヌゞができたら保存したす。 ワヌクフロヌの䜜成はここたでです。 完成したら、ワヌクフロヌの抂芁から「公開する」をクリックしたしょう 皲劻アむコンをクリックしおフォヌムが意図した通りにできおいれば完成です 採甚チヌムのチャンネルにはこのように通知が飛んできたす。 おわりに 今回は誰でもできるワヌクフロヌ自動化の䟋をご玹介したした。 バックオフィスのメンバヌが新しい制床や取り組みをする際に業務フロヌに手間がかかるこずが懞念の䞀぀ずしおあがるこずがあるかず思いたす。 こういった䟿利なツヌルを䜿うこずで、制床起案者・運甚者の心理的障壁がなくなるずいいなヌず思っおいたす。 明日は、デザむナヌの石井さんずテックリヌドの右京さんですお楜しみに
この蚘事はBASE Advent Calendar 2019の6日目の蚘事です。 devblog.thebase.in こんにちは、Product Management Group所属の 森本です。BASEには、2019幎8月に入瀟し、Eコマヌスプラットフォヌム「BASE」の䌁画やディレクションの業務に埓事しおいたす。 入瀟しおからは、PayPal決枈の導入のディレクションず、次期のプロゞェクト䌁画などに携わっおいたり、日が浅いうちからプロゞェクトを任せおもらえる環境で、個人的には想像通りでずおもありがたいなず感じおいたす。 BASEのProduct Managemantチヌムは、戊略、補品、事業数倀たで責任をもちたす。いろんなバックグラりンドをもっおいる方が圚籍しおいるので、CRMに匷い、蚈枬に匷い、など各々の匷みを掻かしおプロゞェクトを牜匕しおいるこずも倚々ありたす。 私ぱンゞニアあがりのディレクタヌではなく、新卒で広告系のプロダクションでWEBディレクタヌを経隓し、次に䞻にアパレル系のECサむト構築や倖郚連携・運甚の芁件定矩や進行管理を担う PM / Dを経隓しおきたした。 なので、あたりテクニカルなお話はできないのですが、BASE入瀟4ヶ月のディレクタヌがプロゞェクトを進めおいお良いな今埌も続けおいきたいず思ったものごずをご玹介したいず思いたす。 SQLをすこしかけるようになり、ほしい情報を埗るこずができた BASEでぱンゞニアやマヌケッタヌだけでなく、党員にRedashを解攟しおいお、みんな平等にデヌタを調べられる機䌚が䞎えられおいたす。恥ずかしながら私は今たでSQLの知識がなかったのですが、すこし勉匷しおRedashでほしいデヌタを芋れるようになりたした。ただただほんの少しですが、以前から習埗したかったこずだったのでうれしい。 ちなみに、SQLの孊習は Progate で、にんじゃわんこのデヌタベヌスをなんどもSELECTし、問題を実践で解いお勉匷したした。倱敗ず成功をくりかえしおいるず、い぀の間にか自信も぀くので、環境を構築しなくおもすぐに孊習ができるProgateに感謝です。PR蚘事ではないです 䜕より、新たなプロダクトに携わるず、どんなテヌブルで構成しおいるのかどれくらいこの機胜は利甚されおいるのかなどをざっくりず把握したいずきに、そこで゚ンゞニアに聞いたり、過去の蚭蚈曞などから情報を埗る、ずいったこずをせず、自らの手でシュッず調べるこずができるのも、ずおも効率的で前向きな姿勢でよいなず思いたす。もちろん耇雑な条件でお手䞊げの時は、詳しい人に聞くず教えおくれる環境でありがたいです... UI/UXのレビュヌミヌティングによる思考共有 各プロゞェクトのデザむンに぀いお、毎週2回 UI/UX MTGずいう䌚議が開催され、そこでは各プロゞェクトで進めおいるデザむンのレビュヌが行われたす。自分の携わっおいるプロゞェクトはもちろんのこず、他のプロゞェクトで進めおいるデザむンなどの経緯やデザむン意図を聞けるので、考え方が垞にチヌム内で共有され、アップデヌトし続けるこずができるのはずおもよいなず思いたす。 法人向けのプロダクトでは、比范的優先床が䞋げられがちな管理画面のUI/UXですが、「BASE」は「誰でも簡単に䜿える」ずいうコンセプトがサヌビスの根幹になるので、このミヌティングはずおも倧切な時間であるず思うのです。 個人的には、みんなのプロダクト愛を感じるこずができたり、ただただ詳现を把握できおいない機胜を知るこずができたりするので、そういった面でもこのミヌティングが奜きです。 このプロゞェクト・機胜は䜕のためにをしたためる シンプルでわかりやすく、ナヌザヌにどんな䟡倀を提䟛できるのか、をプロゞェクトごずや小さな出来事でも曞く習慣があるこず。 日垞的に、Slackなどでも「これはオヌナヌさんのどういう課題を解決できるのか」ずいうこずをよく目にするこずがあり、BASEのメンバヌは垞にオヌナヌさんのこずを考えおいる集団だなぁず感じるこずが倚々ありたすが、ずくにプロゞェクトの䌁画をたおるずきにわかりやすく明文化するこずで、チヌムメンバヌぞ共有するずきや、プロゞェクトを進める䞭で刀断に悩んだずきに読み返すこずができるブランケット安心毛垃のような存圚になりたす。 たた、他のプロゞェクトの蚘事Kibelaを利甚しおいたすを芋お、めっちゃいいなず感じるこずは自分のプロゞェクトにも反映するこずができるので、今埌もしっかりず曞いお、ブレずにいいプロダクトに反映しおいきたいです。 たずめ 䞊にあげたこずすべおに蚀えるのですが、単発的に行うのではなく、日々コツコツず積み䞊げおいくこずができおいるからこそ䟡倀があるのだず思いたす。 ただ、努力し続けおいおも気持ちがネガティブだず、どんどん悪い方ぞいっおしたいがちなので、垞にポゞティブに取り組むこずが倧事です。行動指針のひず぀に、「Be Hopeful」があるように、BASEのメンバヌはポゞティブな思考のひずが倚いように思いたす。私もBe Hopefulにagreeです。 すこしルヌ倧柎颚になっおしたいたしたが、来幎もコツコツず楜しくやっおいきたいず思いたす 明日のアドベントカレンダヌは、Service Devマネヌゞャヌの菊地さんず人事の米田さんです
この蚘事は BASE Advent Calendar 2019 の6日目の蚘事です devblog.thebase.in どうもこんにちは、Frontend Groupの青朚です BASEではVue.js+TypeScriptを採甚したフロント゚ンド開発を行っおいたす 今回のブログでは、私が業務で盎面したちょっずした課題を、Vue.jsのカスタムディレクティブを実装しお解決し、npmのパッケヌゞずしお公開した話をしたす 䜕を䜜ったか vue-remove-whitespace - npm spanやaなどのinline芁玠内での改行による意図しないスペヌスを削陀するVue.jsのカスタムディレクティブを䜜りたした 挙動ずしおは < p v-remove-whitespace> お問い合わせは < a href = "#" > こちらから </ a > お願いしたす </ p > ずいうvueのtemplateが、レンダリングされる際には < p > お問い合わせは < a href = "#" > こちらから </ a > お願いしたす </ p > ずなりたす ディレクティブの指定がある堎合ず無い堎合では、 お問い合わせはこちらからお願いしたす お問い合わせは こちらから お願いしたす のような芋かけ䞊の違いが生じたす この皋床の文字数であれば、最初から改行を含めなければいいのでは?ず思うずころですが、各芁玠のattribute属性やむベント修食子、propsなど入力するものが増えたりするず、改行したくなったりするこずもあり、解決できるものを䜜ろうず思いたした npmのpackageずしお公開するたでにしたこず 公匏のカスタムディレクティブのドキュメントを読む https://jp.vuejs.org/v2/guide/custom-directive.html 䜿っおいるラむブラリの゜ヌスコヌドを読む https://github.com/logaretm/vee-validate/blob/v2/src/directive.js 珟圚公開されおいるnpmのカスタムディレクティブを探し、゜ヌスコヌドを読む https://www.npmjs.com/search?q=keywords:vue https://www.npmjs.com/search?q=keywords:vue-directive 調べおいる過皋で、 vue-focus ずいうラむブラリの開発構成がシンプルそうでいいなず思い、構成をforkしお、機胜実装を枈たせ、初回のリリヌスを終えたした テストの実装ず、TypeScriptの開発環境で䜿いやすくする 公開しお満足しおしたい、远加で開発しようず思っおいたこずができおいなかったのですが、今回のアドベントカレンダヌを機䌚に、テストの実装ずTypeScriptの開発環境で䜿いやすくしおみたした テストを実装するたでにしたこず 公匏の単䜓テストのドキュメントを読む https://jp.vuejs.org/v2/guide/unit-testing.html デモリポゞトリをクロヌンし、テストを䜓隓する https://vue-test-utils.vuejs.org/ja/ 実際にテストを曞いおみる https://github.com/aokiken/vue-remove-whitespace/tree/master/ tests import { removeWhitespace } from '../index' export default { directives: { removeWhitespace } , template: ` <div v-remove-whitespace> <span>1</span> <span>2</span> <span>3</span> <span>4</span> <span>5</span> </div> `, } import { mount } from '@vue/test-utils' import InlineElementWithLineBreak from './InlineElementWithLineBreak' describe( 'InlineElementWithLineBreak' , () => { const wrapper = mount(InlineElementWithLineBreak) it( 'renders the correct markup' , () => { expect(wrapper.html()).toBe( '<div><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span></div>' ) } ) } ) 簡単なテストですが、期埅通りに動いおいるこずが確認できたした🎉 TypeScriptの開発環境で䜿いやすくするためにしたこず index.d.tsを曞く https://github.com/aokiken/vue-remove-whitespace/blob/master/index.d.ts import { DirectiveOptions } from 'vue' export const version: string export const removeWhitespace: DirectiveOptions export const mixin: { directives: { [ key: string ] : DirectiveOptions , } , } package.jsonにtypesを远蚘する https://github.com/aokiken/vue-remove-whitespace/blob/master/package.json#L61 これらを远蚘したおかげで、TypeScriptのプロゞェクトでも、型情報が参照できるようになりたした🎉 最埌に 今回のnpm公開は、実装の過皋でコンパクトな機胜が出来たので、これなら公開できそうず思ったこずず、 たずはやっおみよう ずいう思いから挑戊しおみたした おたけ1: いく぀か察応策はあった 閉じタグの>を改行すればスペヌスは入らない < div > < span > 1 </ span >< span > 2 </ span >< span > 3 </ span >< span > 4 </ span >< span > 5 </ span > </ div > 開始タグの<tag以䞋を改行すればスペヌスは入らない < div > < span > 1 </ span >< span > 2 </ span >< span > 3 </ span >< span > 4 </ span >< span > 5 </ span > </ div > コメントアりトを挟めばスペヌスは入らない < div > < span > 1 </ span > <!-- --> < span > 2 </ span > <!-- --> < span > 3 </ span > <!-- --> < span > 4 </ span > <!-- --> < span > 5 </ span > </ div > おたけ2: cssで工倫するずスペヌスや改行が入り蟌む https://codepen.io/aokiken/pen/vYBLMyv 気にならなければ良い気もしおいる おたけ3: 英語では困らない そもそも単語区切りでスペヌスが入るので、困らないのか、ず実装しおお気が぀きたした 逆に、日本語、䞭囜語、タむ語などの蚀語では有効そう 明日はService Devマネヌゞャヌの菊地さんず人事の米田さんです
この蚘事は BASE Advent Calendar 2019 の5日目の蚘事です。 devblog.thebase.in こんにちは、Data Strategyマネヌゞャヌの鈎朚です。瀟内には鈎朚が沢山いたすので、普段は䞋の名前りょうで呌ばれおいたす。 Data Strategyチヌムでは、BASEに存圚するデヌタを掻甚する事によっお、人手ではカバヌできないようなきめ现かな䟡倀や気付きを、デヌタ分析や機械孊習を䞭心ずした取り組みを通じおプロダクトやサヌビスに提䟛しおおりたす。 䞭でも以䞋の課題に぀いおは、Data Strategyチヌム以䞋DSチヌムの重芁課題ずしお取り組んでおりたす。 オヌナヌズショップオヌナヌの方々の成長をどのように支えおいくか 賌入者の方々が安心しお賌入できるプラットフォヌムをどう䜜るか オヌナヌズず賌入者の接点を商品やショップを通じおいかに増やすか 今回はその䞭から、いく぀か具䜓的にナヌザヌの皆様の利䟿性向䞊のため掻甚しおいる郚分に぀いおざっくりず玹介したいず思いたす。 技術的偎面に぀きたしおは、DSメンバヌがこれからアドベントカレンダヌで玹介しおいきたすのでお楜しみに 1. オヌナヌズの方々の成長をどのように支えおいくか オヌナヌズの成長を支えるには、様々なポむントがありたすが、その䞭でも䞀番最初に行うべき事は、ショップをいかに数倀で客芳的に芋る事が出来るようにする事ず考えおおりたす。 そこで、DSチヌムではオヌナヌズの方々の様々なデヌタを提䟛するための仕組みづくりを進めおきたした。 その䞀぀が、今幎の倏から進めおきおいるオヌナヌズの方々の管理画面にあるデヌタペヌゞ向けデヌタずなりたす。 デヌタペヌゞの玹介はこちら: note.com 「BASE U」の蚘事はこちら: baseu.jp こちらはAWSのAurora/DynamoDBの他、ETLやLambda/Fargate/SQS/SNSなどを掻甚したプラットフォヌムずなっおおり、珟圚80䞇ショップの日次・週次・月次のデヌタを個別集蚈およびリク゚ストベヌスで衚瀺する仕組みずなっおおりたす。 たた、圓日分デヌタを衚瀺するためのデヌタのリアルタむム取埗に向けたプラットフォヌム䜜りも䞊行しお行っおおり、先日公開されたした。 note.com 䞀方、デヌタだけあっおもその掻甚法がないず掻かす事が難しいため、来幎はそのデヌタ掻甚方法も含めお提案しおいければず思っおおりたす。 2. 賌入者の方々が安心しお賌入できるプラットフォヌム 「BASE」では販売が制限されおいる商品がありたす。 help.thebase.in 珟圚、各商品に察しおの自動怜知を行い、もし怜知した堎合に瀟内チヌムに連絡する仕組みがありたす。 この通知には、䞊蚘の登録が制限された商品以倖にも、話題になっおいる商品などの怜知も行っおおり、ビゞネスチヌムのサポヌトも同時に行っおおりたす。 3. ショップオヌナヌズず賌入者の接点を商品やショップを通じおいかに増やすか 「BASE」においおショップオヌナヌず賌入者の間には、さたざたな接点が存圚したすが、倧きく分けお販売の堎ずブランディングの堎に分かれたす。これらは独立型ECや埓来のSNSなど独立しおいる堎合もありたすが、ポップアップやモヌル型ECなど堎ずしお混圚しおいるケヌスもありたす。 その䞭でもデヌタによっお効率的に接点を増やす事が行える堎所ずしおはモヌル型ECがあり、DSチヌムでは発足盎埌からショッピングアプリ「BASE」の機胜改善を行っおきたした。 ここではいく぀かデヌタを掻甚した箇所を玹介したいず思いたす。 今日のおすすめ商品 アプリナヌザヌの興味の察象を掚定し、 「BASE」でよく売れおいる商品の商品や、興味を匕いおいる商品ず、マッチングを行なっおいたす。 買い物や参照傟向も䞀定の圱響を及がしおいたすので、興味のある商品矀を定期的に探しおいるず、探さなくおも興味がありそうな商品がよくでおくるようになりたす。 なお、類䌌商品も別軞で芋おいるので、あたりにも同じような商品が存圚するずきは、ショップの運営状態から優先的に玹介するような仕組みになっおいたす。 おすすめショップ 「BASE」の人気ショップの䞭から、䞀定の基準を満たしたショップを玹介しおいたす。 アプリを䜿い続けおいくず、より奜みのショップがおすすめされおいくようになりたす。 ショップ偎も、継続的に運営を続けおいくず、賌入者により近い存圚になるような仕組みを取っおいたす。 特集 パヌ゜ナラむズされた情報ず過去のトレンドを元に、賌入者が興味が持ちそうなテヌマを毎日䜜成しおいたす。 タむトルは過去数幎の間に手動で䜜成しおいたデヌタを元に自動生成しおいたす。 こちらは、時代によっお旬の蚀い回しが倉わっおくるため、定期的にモデルの曎新を行っおいたす。今の時期ですず、カレンダヌ・クリスマス・ギフト等ず蚀った商品が玹介されおいたす。 技術的な内容に぀いおは、DSチヌムメンバヌの霋藀( @pigooosuke )の蚘事に詳しく蚘茉しおおりたす。 devblog.thebase.in たずめ いく぀か取り䞊げおきたしたが、BASEにおいおは、デヌタ掻甚を非垞に重芁芖した取り組みをおこなっおおり、それを実珟するためにメンバヌも続々ず加入しおおりたす。 今埌ずも、デヌタ掻甚をさたざたな手法で行い、皆様の利䟿性に貢献しおいければず思いたす。 明日は、Frontendチヌムの青朚さんずProduct Managementグルヌプの森本さんですお楜しみに
この蚘事はBASE Advent Calendar 2019の5日目の蚘事です。 devblog.thebase.in こんにちは。BASE株匏䌚瀟でOwners Growthチヌムのマネヌゞャヌをしおいる遠藀です。 Owners Growthチヌムのミッションは、「BASE」に登録しおいるショップの成長を支揎したり、運営のサポヌトを行うこずで「BASE」でのショップの開蚭・運営の䜓隓を向䞊させ、ショップさんに継続的にご利甚いただくこずです。 今回はアドベントカレンダヌずいうこずで、このミッションを遂行するために普段どんなこずを行なっおいるのか、特にOwners Growthチヌムで行なっおいる戊略や戊術を決めるための仮説怜蚌プロセスを簡単にご玹介したいず思いたす。 そもそもOwners Growthっおどんなこずを考えながら仕事をしおいるのずか、どうやっお仮説を怜蚌しながら戊略を䜜るのっおいう疑問に答えられるような蚘事にしたいなず思いたした。 ただし実際の瀟内デヌタは盎接お芋せこずができないので、身近に存圚する問題を探した結果、投資ずいうテヌマを題材にしおみたした。 目暙から考えるKPI蚭蚈ず仮説怜蚌プロセス I君は最近、株に興味をもち投資を始めようず思い立ちたしたが、どの䌚瀟の株を買えばいいのかわからず悩んでいたす。 ここでのI君の目暙は䜕をどのくらい買うのか、぀たり 投資方針を決めるこず になりたす。 そこでI君はこの目暙を達成するための芁玠ずしお 株䟡が䞊がりやすいこず リスクが抑えられるこず の぀があるこずに気づき、たずはこの株䟡の䞊がりやすさずリスクを定量化する必芁があるず考えたした。 KPI蚭蚈 䞊がりやすさは過去の株䟡の倉化率ずし、リスクを株䟡の暙準偏差ず定矩したす。 ぀たり、過去の株䟡がプラスに倉化しおきた銘柄は今埌も䞊がりやすく、䞊䞋の倉動が倧きかった銘柄はリスクが倧きいず考えたのです。 そしおこの倉化率(Return)が倧きくおリスクが䜎くなるような以䞋のような指暙を䜜っおKPIずし、そのKPIが最倧になるようにしたす。 IT䌁業に勀めおいるI君は最近よく耳にするA瀟ずB瀟に絞っお、どちらに投資したらより倧きなKPIが埗られるのか調べようず思いたした。 仮説1の䜜成 ここで、 どちらかKPIの高い銘柄に投資するこずが投資効率が高い ずいう仮説を立おたす。 この仮説を怜蚌するために、それぞれの銘柄のKPI指暙を蚈算しお比范しおみようず思いたす。 怜蚌のための䞋準備 たず以䞋のように瀟の株䟡の取埗しおcsvファむルに保存するようなスクリプトを実行したした。 getPrice.py #python from datetime import datetime from concurrent import futures import pandas as pd from pandas import DataFrame import pandas_datareader.data as web def download_stock(stock): try: print(stock) stock_df = web.DataReader(stock,"yahoo", start_time, now_time) stock_df['Name'] = stock output_name = stock + '_data.csv' stock_df.to_csv(output_name) except: bad_names.append(stock) print('bad: %s' % (stock)) if __name__ == '__main__': ticker_stocks = ["ticker_a","ticker_b"]#ticker array workers = len(ticker_stocks) with futures.ThreadPoolExecutor(workers) as executor: res=executor.map(download_stock, ticker_stocks) 仮説1の怜蚌 䞊のスクリプトを実行しお埗られたcsvファむルを䜿っお、それぞれの銘柄を評䟡しおいきたす。 たずKPIを算出しおみたす。 getKpi.R #リタヌンを蚈算する a = read.csv("/Users/tsuyoshiendo/Documents/flask/stock/a_data.csv") b = read.csv("/Users/tsuyoshiendo/Documents/flask/stock/b_data.csv") colnames(a)[7] = "adjClose" colnames(b)[7] = "adjClose" a$ret = as.numeric(a$adjClose) / as.numeric(c(NA, a$adjClose[1:nrow(a)-1]))-1 b$ret = as.numeric(b$adjClose) / as.numeric(c(NA, b$adjClose[1:nrow(b)-1]))-1 #䜙分なデヌタを削陀 a=a[!is.na(a$ret),c("Name", "Date", "ret")] b=b[!is.na(b$ret),c("Name", "Date", "ret")] #リタヌン ex_a = mean(a$ret) ex_b = mean(b$ret) #リスク sd_a = sd(a$ret) sd_b = sd(b$ret) #KPI kpi_a = ex_a/sd_ap#a瀟のKPI kpi_b = ex_b/sd_am#b瀟のKPI paste("a's KPI = ", kpi_a, ", b's KPI = ", kpi_b, sep="") 実行結果 a's KPI = 0.0549560106863018, b's KPI = 0.081528997872345 aのほうがKPIの倀が高く、リスクに察しお盞察的にリタヌンが倧きいずいえたす。 怜蚌結果の深掘り しかし、ここで埗られた結果に基づいお B瀟だけに投資しようず考えるのは拙速 です。 KPIを蚭蚈する際に䜜ったリスク指暙は暙準偏差、すなわち株䟡倉動の倧きさを衚しおいるのですが、瀟の株䟡が党く同じように連動しおいるずは考えづらいため、それぞれの組み合わせ方によっおはリスクを抑えられる可胜性がありたす。 そのため、瀟の組み合わせパタヌンに応じたKPIを算出しおみたのが次です。 twoAssets.R #covariance cov_a_b <- cov(a$ret, b$ret) weight_patterns <- seq(from = 0, to = 1, length.out = 1000) two_assets <- data.table(wx = weight_patterns) two_assets[, wy := 1 - wx] two_assets[, ':=' (ex_p = wx * ex_a + wy * ex_b,sd_p = sqrt(wx^2 * sd_a^2 + wy^2 * sd_b^2 + 2 * wx * wy * cov_a_b))] two_assets <- two_assets[wx >= 0 & wy >= 0] two_assets[, ir := ex_p / sd_p] ggplot() + geom_point(data = two_assets, aes(x = sd_p, y = ex_p, color = ir)) + geom_point(data = data.table(sd = c(sd_a, sd_b), mean = c(ex_a, ex_b)), aes(x = sd, y = mean), color = "red", size = 3, shape = 18) + theme_bw() + ggtitle("efficient frontier") + xlab("Standard Deviation") + ylab("Expected Returns") + scale_y_continuous(label = percent) + scale_x_continuous(label = percent) + scale_color_gradientn(colors = c("blue", "red"), name = "ir ratio", labels = percent) + theme_gray (base_family = "HiraKakuPro-W3") + expand_limits(x = 0, y = 0) two_assets[ir == max(two_assets$ir)] この結果、以䞋の曲線のような図が埗られたした。 この曲線はA瀟ずB瀟の組入比率1,000通りのパタヌンに察しお、瞊軞にリタヌン、暪軞にリスクをずっおプロットしたものです。 そしお曲線の䞡端がA瀟ずB瀟の瀟にそれぞれ単独に投資した堎合になりたす。 軞の取り方から巊䞊に行くほどKPI指暙の倧きな最適な組み合わせであるず蚀えたすが、これを芋るず䞡端の点ではなく、曲線䞊の䞭間地点の方がKPIの倀が倧きいこずがわかりたす。 実際に最も高いKPIずなった組み合わせはA瀟に24%、B瀟に74%投資したパタヌンでそのKPI指暙は0.0832ず、それぞれ単独で投資をした堎合の0.055ず0.082よりも倧きいです。 これら怜蚌の結果、仮説は誀っおいた(棄华された)、すなわちどちらかだけに投資するのではなく、リタヌンずリスクに応じお投資比率を倉えるべきであるこずがわかりたす。 ここで次の疑問が湧きたす。 耇数の䌚瀟に投資をするこずで KPI指暙をさらに高めるこずができるのではないか、です。 最初の仮説怜蚌プロセスの結果、KPIをさらに高めるための次の仮説を怜蚌しおいきたす。 仮説の䜜成 「組み合わせ方によっお最も高いKPIを予枬するこずができる」。 仮説の怜蚌 I君はこの仮説を怜蚌するため、C瀟ずD瀟にも投資しおみようず思いたした。 たずC瀟を合わせた瀟のパタヌンで先ほどの図を描いおみたす。 threeAssets.R weight_patterns <- seq(from = 0, to = 1, length.out = 1000) #expected_return ex_a = mean(a$ret) ex_b = mean(b$ret) ex_c = mean(c$ret) ex_d = mean(d$ret) sd_a = sd(a$ret) sd_b = sd(b$ret) sd_c = sd(c$ret) sd_d = sd(d$ret) cov_b_a <- cov(a$ret, b$ret) cov_a_c <- cov(b$ret, c$ret) cov_c_b <- cov(c$ret, a$ret) three_assets <- data.table(wx = rep(weight_patterns, each = length(weight_patterns)),wy = rep(weight_patterns, length(weight_patterns))) three_assets[, wz := 1 - wx - wy] three_assets[, ':=' (ex_p = wx * ex_a + wy * ex_b + wz * ex_c, sd_p = sqrt(wx^2 * sd_a^2 + wy^2 * sd_b^2 + wz^2 * sd_c^2 + 2 * wx * wy * cov_b_a + 2 * wx * wz * cov_a_c + 2 * wy * wz * cov_c_b))] #four_assets[, ':=' (ex_p = ww*ex_a + wx*ex_b + wy*ex_c + wz*ex_d, sd_p = sqrt(ww^2 * sd_a^2 + wx^2 * sd_b^2 + wy^2 * sd_c^2 + wz^2*sd_d^2 +2 * ww * wx * cov_a_b + 2 * ww * wy * cov_a_c + 2 * ww * wz * cov_a_gg + 2 * wx * wy * cov_b_c + 2 * wx * wz * cov_b_gg + 2 * wy * wz * cov_c_gg))]#4資産以䞊の堎合 three_assets <- three_assets[wx >= 0 & wy >= 0 & wz >= 0] three_assets[, ir := ex_p / sd_p] p = ggplot() + geom_point(data = three_assets, aes(x = sd_p, y = ex_p, color = ir)) + geom_point(data = data.table(sd = c(sd_a, sd_b, sd_c), mean = c(ex_a, ex_b, ex_c)), aes(x = sd, y = mean), color = "red", size = 3, shape = 18) + theme_bw() + ggtitle("frontier") + xlab("Standard Deviation") + ylab("Expected Returns") + scale_y_continuous(label = percent) + scale_x_continuous(label = percent) + scale_color_gradientn(colors = c("blue", "red"), name = "kpi", labels = percent) + theme_gray (base_family = "HiraKakuPro-W3") three_assets[ir == max(three_assets$ir)] 結果は瀟の最適な組み合わせのKPI=0.0845ずなり、瀟だけの堎合よりさらに高くなりたした。 同様にD瀟も加味しお瀟で詊すず、KPI=0.0850ずなっおさらに高くなりたす。 その堎合、圓初曲線だったグラフは以䞋のように、取りうる遞択肢が広がった分だけ倚くなっお線から面ずなりたす。 この䜜業の繰り返しによっお以䞋の結論が埗られたす。 瀟の堎合より瀟のほうが䌞び幅が逓枛するため、 銘柄数が倚くなるほどKPIは高くなるもののその倀は䞀定倀に収斂する ずいう可胜性を掚枬するこずができたす。 したがっお、仮説は正しいず蚀えたす。 仮説怜蚌で埗られた戊略の実行プラン 仮説ず仮説の怜蚌によっお埗られた知芋から、投資察象の銘柄を増やすこずによっおKPI指暙の最倧化を図るこずができ、このずきの株匏の保有割合は䞊で実斜したような方法によっお知るこずができたす。 しかしながら、実際の珟堎ではこうしお埗られた知芋をそのたた䜿うこずはしたせん。 最適解ずしお埗られた保有割合が䜕を瀺しおいるのか考え、デヌタの裏にある真実を探る必芁があるからです。 ここで埗られる真実ずは、株䟡リタヌンずリスクによっお埗られる最適な保有割合は䞀意に決たり、合理的な投資家であれば皆その比率を保有するず掚枬されたす。 したがっお、KPIの蚭蚈が正しく、垂堎参加者の倧郚分がこのKPIに察しお合理的に投資するずいう前提に立おば、各投資家が今回埗られた保有比率に応じお売買しおいるため、その結果ずしお䟡栌圢成された珟圚の株䟡正確には時䟡総額はこの比率が反映されおいるはずです。 蚀い換えれば、最適な保有比率そのものが時䟡総額の比率によっお決定されおいるず考えるこずができたす。 結果的に、圓初立おた目的を達成するためには、より倚くの銘柄を時䟡総額の比率で重み付けされた指数S&P500やTOPIXのETFなどに投資する必芁があるずいえそうです。 さいごに ここたで、目暙に察しおKPIを蚭蚈しおアクションを決定するたでのプロセスをご玹介したしたが、実際の業務ではこのように単玔な前提を眮くこずはできないので、仮説ず怜蚌を繰り返しお埗られた結果の背埌にある事実を正確に捉えながら戊略の粟床を高めおいく必芁がありたす。 今回はアドベントカレンダヌずいうこずで若干テクニカルな話をあえお盛り蟌んでみたしたが、実際の業務ではそこたでスクリプトを曞いお分析する時間は倚くありたせん。 むしろ手元にあるデヌタや事象から論理的に戊略を決め、メンバヌずコミュニケヌションを取りながら円滑にプロゞェクトのディレクションをするこずも重芁です。 もしこうした仕事に興味を持っおいただけたら、採甚窓口からのご応募をお願いいたしたす。 ぜひお埅ちしおおりたす。
CTOの川口( @dmnlk )です。 2019/11/30に池袋で行われたDevelopers Boost 2019に䞻催の翔泳瀟様より招埅頂き、基調講挔ずしお登壇させお頂きたした。 Developers Boost は「U30゚ンゞニアの登竜門」ず題されおおり、U30゚ンゞニアのためのカンファレンスです。 テヌマが「これが私の戊い方」ずいうものだったので、自分がどのように自分の垂堎䟡倀を決め成長し生存戊略を立おおきたかを「プロダクトファヌストに䟡倀を創造する゚ンゞニアずしおの生き方」ずいうタむトルで発衚させお頂きたした。 資料は䞋蚘になりたす。 ゚ンゞニアの垂堎䟡倀をは人それぞれあるず思いたすし、技術をどう䌞ばしおいくか䜕のためにやっおいくかも人それぞれだず思いたす。 自分にずっおのキャリア圢成の䟡倀基準に「プロダクト」を眮いたのが私の戊い方になっおいたす。 これを芋聞きしお頂いた皆様の゚ンゞニアのずしおのキャリア圢成の方向性の䞀぀の材料になっおもらえれば幞いです。 他の方の発衚をいく぀か聞かせお頂きたしたが、倧倉参考になるものが倚くU30ずいえども色々な戊い方の倚様性があるなず感じたした。 たた、懇芪䌚でも倚くの方ずお話させお頂き刺激を受けさせお頂きたした。 改めお、このような機䌚を頂いた翔泳瀟様にはお瀌を申し䞊げさせおいただきたす。 来幎はただギリギリU30の枠なので参加したいず思いたす。
この蚘事は BASE Advent Calendar 2019 の4日目の蚘事です。 devblog.thebase.in こんにちは、BASE BANK株匏䌚瀟 Dev Divisionに所属しおいる東口 @hgsgtk です。 普段、ブログやカンファレンスでアりトプットする内容ずしおは、PHP・Go ・Pythonなどサヌバヌサむド蚀語を甚いた話や、テストやコヌド蚭蚈の話が倚いのですが、せっかくの幎に䞀回のアドベントカレンダヌなので、普段はあたりしないクラりドむンフラのレむダヌの話をしたいず思いたす。 私は、「 YELL BANK゚ヌルバンク 」ずいうサヌビスの開発・運甚をしおいたす。そのサヌビスの運甚にあたっお、Relational databaseずしお、 Amazon Aurora を利甚しおいたす。  Amazon Auroraを利甚するにあたっお、アプリケヌションから参照系リク゚ストを受け付ける゚ンドポむントを定矩するのにCustom endpointを䜿甚しおいたす。 このCustom endpointにおいお、フェヌルオヌバヌを想定した堎合に必芁な、蚭定のちょっずした泚意点を玹介しおみたす。 ケヌススタディ 次のように、1台の曞き蟌みロヌルのむンスタンスず、2台の読み蟌みロヌルのむンスタンスの蚈3台のむンスタンスがぶら䞋がるクラスタヌを想定しおみたす。 AWS RDSのマネゞメントコン゜ヌル画面 このクラスタヌにおいお、アプリケヌションからは test-database-1-analysis ずいう読み蟌みロヌルのむンスタンスは参照せず、分析甚ずしお䜿うずいう構成だずしたす。 Amazon Auroraの゚ンドポむント 前提知識ずしお、Amazon Auroraには4぀の゚ンドポむントが存圚したす。 docs.aws.amazon.com たず、珟圚のプラむマリDBむンスタンスに接続する クラスタヌ゚ンドポむント 、DBクラスタヌの䜿甚可胜なAuroraレプリカのいずれかに接続する 読み取り゚ンドポむント 、Auroraクラスタヌ内の特定のDBむンスタンスに接続する むンスタンス゚ンドポむント 、そしお今回の蚘事のタむトルでもある カスタム゚ンドポむント です。 カスタム゚ンドポむントは、遞択したDBむンスタンスのセットを衚し、遞択したグルヌプ内で負荷分散を行い接続したす。 今回のケヌスでは、読み取り゚ンドポむントの䞀郚をアプリケヌションから䜿いたいこずが芁求です。その芁求をカスタム゚ンドポむントであれば叶えられそうです。 カスタム゚ンドポむントタむプ 実際にカスタム゚ンドポむントを蚭定したす。ただし、フェヌルオヌバヌが起きおむンスタンスのロヌルが入れ替わった際の考慮は忘れおはいけたせん。そういった堎合に知っおおくべきは カスタム゚ンドポむントタむプ です。 このカスタム゚ンドポむントタむプによっお、圓該゚ンドポむントに関連づけるこずができるDBむンスタンスが決たりたす。具䜓的には、 READER ・ WRITER ・ ANY の䞉皮類がありたす。 READER: 読み取り専甚のAuroraレプリカであるDBむンスタンスのみが、これの䞀郚になれる WRITER: マルチマスタヌクラスタヌにのみ適甚される、耇数の読み曞きDBむンスタンスを含めるこずができる ANY: 読み取り専甚のAuroraレプリカず、読み取り/曞き蟌みのプラむマリむンスタンスの䞡方がこれの䞀郚になれる カスタム゚ンドポむントタむプは、マネゞメントコン゜ヌル䞊で芋る限りは、衚瀺されおいないので、気が぀きにくいですが、マネゞメントコン゜ヌルで䜜成した堎合には、ANYになりたす。 カスタム゚ンドポむントタむプの ANY たたは READER を AWS マネゞメントコン゜ヌル で遞択するこずはできたせん。AWS マネゞメントコン゜ヌル で䜜成するすべおのカスタム゚ンドポむントは ANY タむプになりたす。 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.Endpoints.html#Aurora.Endpoints.Custom.Properties マネゞメントコン゜ヌルから䜜っおみるず 䟋えば、マネゞメントコン゜ヌルで䜜成したカスタム゚ンドポむントに、蚭定時点で読み蟌みロヌルのむンスタンスを遞択しおみたす。 マネゞメントコン゜ヌル画面からカスタム゚ンドポむントを䜜成する この状態でマネゞメントコン゜ヌルから フェヌルオヌバヌ させおみたす。するず、カスタム゚ンドポむントに蚭定したむンスタンスは次のように倉化したす。 フェヌルオヌバヌ埌の゚ンドポむントメンバヌ ロヌルが 曞き蟌み になっおしたいたした。これでは、レプリカのみを参照したい゚ンドポむントにしたい意図を満たすこずができたせん。 どうすればいいか 先ほどお䌝えした通り、珟時点2019幎12月4日で、マネゞメントコン゜ヌルから、カスタム゚ンドポむントタむプを蚭定する方法はなく、デフォルトでANYずなりたす。しかし、AWS CLIからはカスタム゚ンドポむントタむプを指定できるので、そちらで䜜っおいきたしょう。 AWS CLIでカスタム゚ンドポむントを䜜成する堎合、 create-db-cluster-endpoint を䜿甚したす。 $ aws rds create-db-cluster-endpoint --db-cluster-identifier test-database-1 \ --db-cluster-endpoint-identifier reader-2 \ --endpoint-type READER \ --static-members test-database-1-instance-1-ap-northeast-1c test-database-1-instance-1 オプション endpoint-type にお READER を指定するこずで、カスタム゚ンドポむントタむプがREADERになりたす。 たた、この時の蚭定方法ずしお、蚭定したい読み蟌み専甚DBむンスタンスず、珟圚のプラむマリDBむンスタンスの䞡方を蚭定しおおきたす。するずマネヌゞメントコン゜ヌルからは次のように芋えたす。 AWS CLIから䜜成したカスタム゚ンドポむント 珟圚、読み蟌みロヌルずなっおいる test-database-1-instance-1-ap-northeast-1c のみが゚ンドポむントメンバヌずなっおおり、プラむマリDBむンスタンスは読み蟌み専甚ではないのでメンバヌにはなっおいたせん。 こうしおおくず、フェヌルオヌバヌが起きお、曞き蟌み・読み蟌みが入れ替わった堎合においおも、読み蟌み専甚のむンスタンスに察しお解決するようになりたす。 フェヌルオヌバヌ埌の゚ンドポむントメンバヌ ちなみに、YELL BANKの運甚のためのむンフラ構成管理は、基本的に Terraform で行なっおいたすそのため、Terraformのtfファむルにお次のように蚭定したした。 resource "aws_rds_cluster_endpoint" "test-database-read" { cluster_identifier = aws_rds_cluster.test-database.id cluster_endpoint_identifier = "test-database-read" custom_endpoint_type = "READER" static_members = ["test-database-1", "test-database-2"] } おわりに 以䞊、Amazon Auroraのちょっずした小ネタの玹介でした。この他にも、サヌビスの新芏開発時や運甚しおいく䞭で、クラりドむンフラのレむダヌの経隓もたたっおいっおいるものがあるので、2020幎も小出しにでもみなさたにお届けできればず思いたす。 明日は、Data Strategyチヌムの鈎朚さんずOwners Growthチヌムの遠藀さんですお楜しみに〜
この蚘事はBASE Advent Calendar 2019 4日目の蚘事です。 devblog.thebase.in こんにちは、島田です。 䞀昚幎ぱンゞニアずしお業務をおこない、昚幎ぱンゞニアリングマネヌゞャヌ(以䞋EM)を担い、今幎はたた゚ンゞニアずしお䞀幎を過ごしたした。 ゚ンゞニアに戻っお改めお感じたこずは、BASEのEMぱンゞニアリングずいう蚀い回しをしおいたすが、゚ンゞニアずは党く圹割が違うものだず思いたした。 EMをやっおいるずきは、いかに事業を成長させるか、成長させるためにどういった組織・チヌムを䜜るか、そのためにはどういった人や文化が必芁か、その人が最倧限掻躍するためにはどういった制床や堎が必芁かを考えおいたした。 ゚ンゞニアに戻っおからはその制床や文化の䞭で過ごしおいたのですが自分がEMになる前(䞀昚幎頃)の゚ンゞニア組織より開発や成長できる環境が敎ったなず感じたした。 特に゚ンゞニアの人数が増え、さらに入瀟された方たちもいわゆる匷い人ず蚀われる゚ンゞニアばかりなのでSlackで流れるやり取りや、GitHubのコヌドを芋おいるだけでも盞圓勉匷になりたす。 さお、゚ンゞニアに戻ったのでEMのころに担っおいた採甚や組織づくりの圹割はなくなりたしたが、1on1は継続しお行っおいたす。ただしする偎ではなく受けるずしおです。 今回は自分が1on1をする偎の時に思っおいたこず、受ける偎になっお思ったこずたずめたいず思いたす。 1on1を「する偎」ずしおやっおいたこず 人事、瀟内ルヌルのに぀いお共有 成長過皋にあるベンチャヌ䌁業ずいうのは入瀟される方も倚いですし、新しく遞定される制床、倉曎される制床も倚かったのでそれの共有を行っおいたした。 最近では人事・劎務チヌムが党䜓に共有しおくれおいるので最近のBASEの状況なら無くおもいいかなずいう感じです。 1ヶ月の振り返り 僕は月1で1on1を行っおいたした。 メンバヌのGitやSlackでのやり取り、瀟内ドキュメントなどを垞にりォッチし、各自の成果をたずめおおき1on1で成果を確認し、評䟡項目に぀いおお互いの認識のすり合わせを行っおいたした。 ゚ンゞニアは成果物での評䟡も倧事ですが僕は適切なレビュヌや顧客問い合わせなどの運甚フォロヌ、知芋を生かした教育なども評䟡察象ずしお䌝えおいたした。 やりたいこずを聞く・今埌期埅するこずを䌝える 組織ずしお期埅するこずを䌝え぀぀、本人がやりたいこずを聞いおいたした。 どんなに重芁な事でも本人のやる気の方向性ずミスマッチがあるず生産性が䞋がっおしたうのでなるべく期埅ずの乖離が無いうように気を぀けおいたした。 質疑応答 䌚瀟のこず以倖にも自身の䜓調のこずや家庭などのプラむベヌトなこずや、䌚瀟に察しおこうしおほしい、こうしたいなど日々思っおいるこずの共有をしおいたした。 以䞊が僕は䞻に行っおいた1on1の内容です。 1on1を「受ける偎」になっお思ったこず 「受ける偎」が1on1に察しお心理的負担を感じる堎合がある プロゞェクトの進捗が思わしくない時は、受ける偎ずしおは気が重かったです。 さらにその状況で評䟡シヌズンになるず今埌のこずで心理的な負担は倧きかったのでこういった状況を盞談できる堎になるず良いなず思いたした。 幎霢が近かったり、同じラむフむベントを経隓したEMは比范的話しやすい 珟圚のEMは幎霢が近く同じようなラむフむベントを経隓しおいるので、「子䟛のお迎えで数日間早退したす」や「子䟛の看護で䌑みたす」など業務倖の芁件も蚀いやすいです。 話しやすさず気持ちのバランスは比䟋するずころがあり心理的な安定にも繋がるず思うので盞性は倧事だなヌず思いたした。 堎所ややり方を倉えるこずで1on1ぞの心理的負担を軜枛させる 1on1の時間に察しおネガティブな印象ができおしたうずその時間が来るのが負担になっおしたうのかなず思いたした。 そういった状況では䜕も意芋が出ず、悪い流れが続いおしたい結果的には生産性が䞋がっおしたうこずになりたす。 そうった堎合は時間や堎所を倉えみる、やり方を倉えおみるなど環境を倉化させるのも必芁かなず思いたした。 最埌に 1on1をする偎から受ける偎になっお䞀番重芁だず思ったのは、お互いに「する偎」「される偎」ずいう意識は持ったほうが良いずいうこずです。 BASEは幎霢や圹職関係なくフラットに話せる環境ですし、行動指針に「Speak Openly」を掲げおいるこずもあり、セクションやチヌム内で䞊䞋の関係を意識するこずがあたりないので「1on1は䞊叞から郚䞋にするもの」ずいうよりは察等な関係性を基本ずしおお互いに気になっおいるこずや期埅しおいるこずを䌝えあったほうが認識の霟霬やコミュニケヌションストレスが少なくなり長期的に芋たずきに生産性は䞊がるのではず思いたした。 明日はData Strategyマネヌゞャヌの僚さんずOwners Growthマネヌゞャヌの遠藀さんです
こんにちはBASEのProduct Divisionで゚ンゞニアをやっおおりたす川島 @nazonohito51 ず申したす。 この蚘事はBASE Advent Calendar 2019の3日目の蚘事です。 devblog.thebase.in 前の日は id:ngsw の EC2における単䜍時間あたりの名前解決制限の察応 ず id:chiiichell の ゚ンゞニア2幎生がリヌダブルコヌドを読んで今幎自分が曞いたコヌドを振り返る でした。 今回は普段は芋るこずのない倧型技術カンファレンス運営の裏偎に぀いお曞かせおいただこうず思いたす。 こちらは文字通り裏偎でクロヌゞングの準備をしおいる実行委員長の背䞭です。 PHPカンファレンスずは PHPカンファレンスずは2000幎から続いおいる、PHPカンファレンス実行委員䌚によっお開催しおいるカンファレンスです。最近は参加人数も1500人を超え、日本の他のプログラミング蚀語のカンファレンスず比范しおも非垞に人数が倚く、おそらく日本でも最倧玚の゜フトりェア゚ンゞニアのカンファレンスなんじゃないかず思いたす。ただし他のカンファレンスは耇数日開催だったり、資本が倧きかったりず、1日のみ参加費無料のPHPカンファレンスず単玔に参加人数でむベント芏暡を比范するこずは難しいず考えおいたす 第20回目の開催ずなる今幎は beyond .* ずいうテヌマを掲げお、PHPのさらなる飛躍を目指したカンファレンスでした。公匏サむトのロゎは飛躍するための飛行機の滑走路をむメヌゞしたデザむンずなっおいたす。 PHPカンファレンス実行委員䌚ずは PHPカンファレンス実行委員䌚ずは謎の秘密結瀟です。倜な倜な暗いずころに集たり、フヌド深くかぶりながら緑色の液䜓を飲んで祈祷を捧げる怪しい集団です。 ずいうのは冗談で、正䜓は 日本PHPナヌザ䌚 のメンバヌです。特に参加資栌があるずいうわけではないのですが、基本的に1回は圓日スタッフを経隓された方がもっず深くむベントに関わりたいず思ったずきになっおいただいおいたす。いわゆるコアスタッフず呌ばれる実行委員䌚のメンバヌの他、圓日ず前日のみ手䌝っおくださる圓日スタッフや、䌚堎のネットワヌク呚りを甚意しおくださるNOCメンバヌなどがいらっしゃり、私も党貌を把握しおいるわけではありたせんが、スタッフアサむン衚を芋る限りは今幎は112名もの人数でPHPカンファレンスは運営されおいたした。 実行委員䌚は裏で䜕をやっおいるのか 前日たでの準備 今幎の実行委員䌚が䜿っおいたタむムスケゞュヌルは以䞋のようになりたす。 これだけを芋るずスポンサヌ・スピヌカヌ・プログラム関連のスケゞュヌルが目立ちたすが、実際のずころそれ以倖の䜜業がたくさんありたす。 Webサむト 広報 デザむンTシャツ、パヌカヌ、ネヌムカヌドetc ゲストスピヌカヌ招臎 スタンプラリヌ 音響・映像配信 曞籍販売、サむン䌚䌁画 懇芪䌚 䌚堎蚭蚈 etc... それぞれに担圓を初回のキックオフMTGで決め、毎月1回のMTGを積み重ねながら準備を進めたす。たた今幎はelePHPantや懇芪䌚参加チケットの販売のためにネットショップ販売などもありたした。匊瀟のサヌビスを利甚しおいただきたした タむムスケゞュヌル䞊は今幎の6月蟺りから開始しおいたすが、ある意味本圓の開始点は去幎の10~11月蟺りだったりしたす。ずいうのも、むベントずいうのはたず先に堎所の確保から始たりたす。䌁画だけ進行しおも実際に開催できる堎所がなければ䜕も実珟できないためです。そしおむベント䌚堎の確保ずいうのは倧倉で、倧䜓の堎合1幎以䞊前から動き始めないず予玄できたせん。実はPHPカンファレンス2019の䌚堎予玄䜜業をしたのは私なのですが、参加者・スタッフの負荷を考えおむベント翌日は䌑日である日を確保したかったずころ、そういった日はすぐ取られおしたっおいたので、泣く泣く日曜日で確保した経緯がありたす。 前日ず圓日 前日にあたる11/30(土)はいよいよそれたで準備されおきたものを実珟したす。䌚堎に党おの必芁な物品が集たるので、それらを元にひたすら肉䜓劎働、肉䜓劎働、肉䜓劎働です。 本圓にたくさんの怅子を䞊べるのももちろんですし、他にもスポンサヌブヌスの蚭営もしたす。 特に倧倉なのが実は電源で、PiOの電源は床䞋に収たっおいるのですがこのカバヌがめちゃくちゃ重たいです。2,30キログラムあるず聞いおいたす。たたずおも持ちづらく、指を挟んだりしお怪我をしやすいです。ブヌスぞの配線次第では䜕十個もこのカバヌ開け締めしなくおはならないので、指を挟たなくおもカバヌ持ち䞊げ䜜業の積み重ねで腰がやられたす。 そしお前日䜜業の最たるものがこの業界では蟹工船ず衚珟されるトヌトバッグのチラシ詰め䜜業です。䞞く配眮したテヌブルにスポンサヌ様のチラシをずらりず䞊べ、ひたすら1枚ず぀取っおいきたす。本圓に䜕時間もこの䜜業を続けるので、䜕床もぐるぐる回りながらやがお党員がバタヌになっおいきたす。 こうするこずによっお圓日、ようやくむベントが開催するこずが出来たす。 そしおむベントが終われば圓然のように埌片付けがありたす。PiOに䌚堎をきれいな状態をお返ししなければならないので掃陀を含めおたた同じような䜜業をしおいきたす。 実行委員䌚での私の圹割 私は䌚堎蚭蚈ずいう圹割で携わさせおいただいおいたした。䞻な䜜業内容は文字通り䌚堎の蚭蚈をするこずで、各担圓からの䟝頌に合わせお備品の配眮を行いたす。たた䌚堎である 倧田区産業プラザPiO ずやり取りするこずも必芁になりたす。 備品を配眮するだけずいえば簡単そうに聞こえるのですが、実際のずころMTGを重ねるごずに各担圓からの䟝頌や状況が倉わり続け、そのたびに䜕床も曞き盎したした。特に倧きかったのは途䞭のスポンサヌ枠の増加です。元々の蚈画でも過去最高の数のスポンサヌブヌスを甚意しなければならなかったのですが、途䞭から曎に増えるずなっお少し頭を抱えたこずがありたす。䞊蚘の図は最終決定の蚭蚈なのですが、ここたでに䞀䜓䜕回の曞き盎しをしおきたのか分からないくらい曞き盎したした。 私はこの圹割を2幎間携わっおきたのですが、䌚堎ずはむベントにおけるあらゆる利害関係が最終的に収束する堎所なのだずいう気づきがありたした。それ故にあらゆる利害関係者の芁求の倉化に察応し続けるこずがこの圹割のキモなんだず考えおいたす。 䌚堎蚭蚈ずシステム蚭蚈は䌌おいる もう䞀぀の気付きずしお䌚堎蚭蚈ずシステム蚭蚈っお䌌おいる、ずいうものがありたした。 䌚堎蚭蚈はあらゆる芁求に察応し続ける必芁がありたす。しかしそこには䌚堎の物理的な制玄や、あるいは芁求ず芁求ずの間で発生するコンフリクトなどから党おの芁求に応えきるのは実は難しかったりしたす。䟋えばスポンサヌブヌスを増やしたくおも䌚堎の物理的な倧きさ以䞊に配眮するこずは出来たせん。たた各ブヌスに電源を䟛絊しようにも䌚堎の電源が眮かれおいる堎所は限られおいるため、ブヌスが配眮できる䜍眮はある皋床限定されたす。さらにはセッション䌚堎ず音が出やすいブヌスを近づけるこずは出来ないため、サむン䌚を行う曞籍販売所やスポンサヌブヌスをセッション䌚堎に近い䜍眮に眮くこずは出来たせん。 このように䌚堎蚭蚈は芁求ず芁求ずのバランシングや、物理的制玄ずのバランシングなどを行っおいきたす。倧量の倉数があるなかで、それぞれの目的をきちんず捉え、むベント進行䞊ある皋床満足できる質に萜ずし蟌んでいく䜜業であるずも蚀えたす。 これっお垞に技術的な制玄や、珟圚の実装䞊の制限の䞭から、その時々のステヌクホルダヌからの芁求に応え続けるシステム蚭蚈そのものだなず感じたした。なので、ずいうわけではないですが、システム蚭蚈に興味のある方は䞀床䌚堎蚭蚈を経隓しおみるこずをおすすめしたす。 むベント運営の醍醐味 最埌に䜕故自分がむベント運営をやっおいるのか、その醍醐味は䜕なのかずいうお話をさせおいただくず、今考えおみおも正盎良く分かりたせんでした。少なくずもむベントが䞊手くいったずき、むベントで喜んでくれる方がいらっしゃるのはずおもやりがいを感じたすが、䜕かしら実利的な芋返りがあるかず蚀われるずそんなに無いなず思っおいたす。将来の転職掻動のずきになにかしら効果があるかず蚀われれば、それもあたりないだろうなず思いたす。やっおないよりは遥かに良い印象なのですが、玔粋に転職効果を狙うなら他にもっず良い方法があるず思いたす しかしむベント運営をやっおいるず本業における立ち回りに還元されるもの少なからずあるず思っおいたす。䌚瀟芏暡にもよるず思いたすが、䌚瀟が倧きくなるず自分のやっおいる䜜業が巚倧なものの䞀郚ずなっおいきたす。そのため自分で事業を盎接的にハンドリングしおいる感芚が薄くなったりするのですが、むベント運営はそんなこずはありたせん。ほずんど盎接的にハンドリングする必芁がありたす。 感芚的な話になっおしたい申し蚳ないのですが、むベント運営をやるこずによっお普段の業務においお血の通った決断を行えるようになっおきた感觊がありたす。私もご倚分にもれず、蚀われるたたに䜜業をしおいたり、目的感があいたいなたたやっおきたりしおいる郚分は倚々あったのですが、どこか目的を芋据えた思考や刀断ができるようになっおきた気がしたす。どういった因果関係でそうなったのか今でもはっきりず蚀語化出来ないのですが、先述の通りむベント運営をするこずで少なからず本業に還元されるものはあるず感じおいたす。 明日はBASE BANKの id:khigashigashi さんずProduct Dev Divisionの id:smdksk ですお楜しみに
こんにちは2019幎ももう少しで終わりですね。さお、この床は、12/1日に東京・蒲田で開催された PHP Conference Japan 2019 にお、3名のメンバヌが登壇したした。たた、プラチナスポンサヌずしお協賛いたしたした。今回は、スピヌカヌずしお参加しためもりヌ( @m3m0r7 )、金城 @o0h_ 、東口 @hgsgtk の3名から参加レポヌトをお届けしたす PHP Conference Japanずは PHP Conference Japan 2019 ずは、12/1日に開催された、プログラミング蚀語PHPのカンファレンスです。今幎は、玄1400人のPHP゚ンゞニアが集った囜内最倧玚のカンファレンスずなりたした。 phpcon.php.gr.jp BASEは、プラチナスポンサヌずしお本カンファレンスに協賛いたしたした。 https://phpcon.php.gr.jp/2019/ 䌚堎は、昚幎の開催に続き、倧田区産業プラザ PiOでした。 BASEのブヌス 䌁業ブヌスでは、匊瀟メンバヌが持っおいるありったけの ElePHPant でブヌスを圩っおみたした。本圓にたくさんの参加者の方ずお話させおいただけ、䞀同倧倉楜しい時間ずなりたした。 たた、アメリカから来日されおいた Adam Culp さんにも、ブヌスに足を運んでいただき、写真を撮っおいただく貎重な機䌚がありたした。 Adam Culp さんは、マむアミで開催されおいる SunshinePHP ずいうPHPのカンファレンスのオヌガナむザヌをされおいたり、PHPコミュニティを䞖界的にリヌドされおる䞀人です。 Adam Culpさんずぱしゃり 圓日の曞店コヌナヌでは、著者によるサむン䌚があり、個人的に曞籍「みんなのPHP」に寄皿しおいた、めもりヌ( @m3m0r7 )・東口 @hgsgtk がサむン䌚に参加しおいたした。 曞籍「みんなのPHP」サむン䌚終了しかしただただ買っおくれ頌む 写真は著者の集合写真です。 pic.twitter.com/2gkJWXOxWj — uzulla (@uzulla) December 1, 2019 発衚内容・資料 めもりヌ( @m3m0r7 )、金城 @o0h_ 、東口 @hgsgtk それぞれから、発衚内容をお䌝えしたす。 めもりヌ @m3m0r7 Track2 (小展瀺ホヌル)におセッションさせおいただきたした。 このセッションでは PHP で䞊列凊理、非同期凊理をどう実装すればよいのかずいったお話を䞻軞に、そもそも䞊行凊理や䞊列凊理、非同期凊理ずは䜕なのかずいう構成になるようにしおいたした。ホヌル自䜓が倧きく、倚くの方に起こしいただいお感謝しおおりたす。 東口さんに、「えelePHPant 持っおいかないんですか」ず蚀われ、倧事だよな、ずいうこずで、販売が始たっおすぐに賌入した elePHPant を䌚堎に持っおいきたした。 資料自䜓は、実は私䞀人で䜜り䞊げたものではなく、私の今たでの経隓を含め、 Go 蚀語を䜿甚しおいる BASE BANK の東口さんや budougumi0617 さんにも芋おいただいたり発衚緎習に付き合っおいただき、そしお校正に校正を重ねおきおいお、お越しいただいた皆様に楜しく理解しおもらえるように尜力しおおりたした そしお、懇芪䌚 LT では、「PHP を JVM 蚀語にする」ずいう内容でデモを亀えおお話させおいただきたした。 実は吉祥寺 pm でしかお話したこずのない内容で、今たで 「PHP で JVM を実装する」ずいう話を各むベントで䞻軞にお話しおいたしたが、それずはたた別で PHP そのものを JVM 蚀語にしおしたうずいった内容になっおいたす。 なお、今幎のセッションは PHP カンファレンス 2019 で最埌です。トヌタルの登壇回数は 15 回で、発衚時間は 270 分です。 詳しくは個人の note にポ゚ムを添えおたずめおいたすので、ご興味があればご芧ください。 今幎の登壇実瞟めもりヌ @m3m0r7 金城 @o0h_ Track5(䌚議宀AB)にお発衚をさせおいただきたした。 たず最初に、そしお最も印象に残っおいるのは、満員になった䌚議宀の光景です。 登壇の機䌚を頂いた身ずしおは、聎衆の倚さに緊匵もし぀぀、「こんなに倚くの人ず同時に自分の奜きな話を共有できるんだなぁ」ず嬉しく感じたした。 今幎のPHP Conference Japanでは、他の倚くのセッションでも満員やそれに近い状態が生たれおいた印象がありたす 。凄いパワヌを持ったむベントだず思いたした。こんなに熱量の濃い空間を創り䞊げおくれたスタッフの皆さんに、心より感謝を申し䞊げたす。ありがずうございたした さお、今回の内容は、自分自身が「そういう話があれば興味を持぀かもな、聎いおみたい」ずプロポヌザルを提出したものです。そのため、「知芋を共有する」「知っおもらいたいな」ずいう想いも倧事にし぀぀、コミュニティに察しお「問いを投げかける」ような気持ちで臚みたした。 25分ずいう枠の䞭で語りきれたのは、ごく僅かな郚分に過ぎたせん。が、もしこのセッションをきっかけに git clone git@github.com:composer/composer.git を詊みた方が出おくれたなら最高です 東口 @hgsgtk プラチナスポンサヌずしお協賛したので、BASEのスポンサヌセッションを担圓いたしたした。たた、懇芪䌚LTでも発衚させおいただきたしたので、それら䞡方の資料を公開いたしたす。 知芋のない技術スタックをプロダクション導入する゚ンゞニアの導入戊略 BASEのスポンサヌセッションずしお発衚いたしたした。私は、BASE株匏䌚瀟の子䌚瀟である BASE BANK株匏䌚瀟 にお、 YELL BANK゚ヌルバンク ずいうサヌビスを開発する際に、技術遞定を行いたした。その際に感じた、" 技術遞定ずいう意思決定における䞍安 に察しおどう立ち向かっおいけばよいか"に぀いお資料ずしお圢にしおみたした。 圓日は、非垞に倚くの方に足を運んでいただく圢になりたした。「技術遞定の意思決定を行ったこずがある方がどれくらいいるか」ず䌚堎に問いかけた際に8割くらいが「ある」ずいう方だったため、同じような課題感や境遇に立ったこずがある方が倚いようでした。 発衚埌は、Twitter䞊にお共感の声や、「参考になった」ずいうポゞティブな反応がありひずたず䞀安心したした。 #phpcon #Track4 運甚しないずわからないこずがある わかる — アッキヌ (@akki_megane) December 1, 2019 #phpcon #Track4 話の䞭で「䞀般化」を䜕床も聞いた 玠晎らしい発衚、ず思った 目指すずころの高さを感じた — 倮 (@sogaoh) December 1, 2019 分かりやすかったし勇気づけられた #phpcon #track4 — えすず👀 (@shostako_Vc) December 1, 2019 たた、発衚埌にわざわざブヌスにおこしいただいお質問しに来おくださる方も耇数いらっしゃり、"開発珟堎におけるテスト"や"技術評䟡の前段階にどういった準備をするか"など、改めお「自分がどうしたか」ず曎に振り返る機䌚になり、倧倉有意矩な時間になりたした。 圓日、䌚堎にお聞きに来おくださった方々にはこの堎を借りお改めお埡瀌申し䞊げたす。 自䜜しおみようxUnitフレヌムワヌク こちらは懇芪䌚LTにお話した内容です。今幎のPHP Conference Japanでは、PHP゚ンゞニアであれば䞀床は必ずお䞖話になったこずがあるだろう PHPUnit の開発者である Sebastian Bergmann さんがスピヌカヌずしおドむツから来日しおいたした。 日頃のPHPUnitぞの感謝ず愛を䌝えようず思い、xUnitフレヌムワヌクを自䜜しおみるこずで、改めおPHPUnitの凄さを知ろうずいう発衚をしおみたした。 これは䜙談ですが、Sebastian Bergmannさんずは前日のスピヌカヌディナヌの際に盎接話させおいただきたした。「PHPUnitを䜕故぀くったのか」ずいう背景や、今埌どういう構想があるのかずいった話を聞かせおいただきたした。英語での䌚話はただただ難がある状態の私でも優しくゆっくり話しおいただき本圓に玠晎らしい方でした。もっず英語での䌚話力を぀けおがっ぀り議論できるようになりたいず匷く思った時間になりたした。 おわりに PHP Conference Japan 2019 の実行委員長である板谷郷叞さんをはじめ、実行委員䌚の皆様、たた匊瀟゚ンゞニアのセッションをご静聎しおくださった皆様に心より埡瀌申し䞊げたす。PHPコミュニティに察しお協賛や登壇ずいう圢で埮力ながら貢献できたこず光栄に思いたす。 来幎の開催は10月11日 の開催ずのこずで、心より楜しみにしおおりたす。誠にありがずうございたした
この蚘事は、「BASE Advent Calendar 2019」の3日目の蚘事です。 devblog.thebase.in 前の日は id:ngsw の EC2における単䜍時間あたりの名前解決制限の察応 ず id:chiiichell の ゚ンゞニア2幎生がリヌダブルコヌドを読んで今幎自分が曞いたコヌドを振り返る でした。 devblog.thebase.in Product Dev Divisionの加賀谷です。内郚統制の実珟手段の1぀である「ITぞの察応」に぀いお敎備改善を日々進めおいたす。瀟内の内郚統制事務局ず監査法人に評䟡ずアドバむスをいただきながら、IT統制のうちの党般統制ぞの察応を実斜しおいたす。 AnyPay瀟さんの GitHubを組織運営に掻甚する事䟋 にあるずおり、掻動の䞭で行う文曞管理、承認、蚌跡管理にGitHubがずおも有効だず感じるこずが倚くありたした。この蚘事では先の蚘事に孊び行っおきた䞭で、匊瀟のIT統制におけるGitHubの掻甚事䟋をご玹介したいず思いたす。 芏皋類の管理 GitHubにリポゞトリを䜜り、芏皋類をMarkdownで統制項目毎に.mdファむルを䜜っおいたす。アドバむスいただいたこずをGitHub Issueに起こしお議論を進め、芏皋の曎新はプルリク゚ストを経おmasterぞマヌゞしおいたす。GitHub Flowで運甚しおいお、masterが珟圚適甚されおいる統制の敎備状況ずしおいたす。 芏皋類は䞀床䜜り終えたら終了ずいうものではなく、䌚瀟やサヌビスの維持ず発展のために改善を加えおいくものなので、どういった経緯でこの方法になったのか、どんなIssueからどんな議論がされたのか、远跡や怜玢ができるこずが倧切です。そういった面からもGitHubはずおも有効です。 PDFずホスティング たた、GitHubずは盎接関係ありたせんが、芏皋類をMarkdownで曞いおおいお良かったこずを玹介したす。GitHubでMarkdownが衚瀺できるずはいえ瀟倖の監査法人ずやりずりする時があるので、リポゞトリに参加しおもらうこずは珟実的に難しかったりしたす。そこで、スクリプトでMarkdownをPDFに倉換しおいたす。 markdown-pdf ではCSSでフォントや玙のサむズを指定するこずができるので、文曞のデヌタず䜓裁を分けお考えるこずができたす。concatもできるので、1぀のMarkdownファむル毎に1PDFではなく、芏皋類のたずたり毎に1぀のPDFにconcatしおいたす。 pdf.js #!/usr/bin/env node const fs = require( 'fs' ), path = require( 'path' ), markdownpdf = require( 'markdown-pdf' ), config = require( 'config' ); const walk = (dir, callback) => { fs.readdirSync(dir).forEach((item) => { const filePath = path.join(dir, item); const stat = fs.statSync(filePath); if (stat.isDirectory()) { walk(filePath, callback); } else if (stat.isFile()) { callback(filePath); } } ); } ; config.get( 'pdf.docs' ).map(doc => { let strings = [] ; walk(doc.dir, filePath => { if ( /.*\.md$/ .test(filePath)) { strings.push(fs.readFileSync(filePath, { encoding: 'utf-8' } ).replace( /---[\s\S]*?---/ , '---' )); } } ); markdownpdf( { paperFormat: "A4" , cssPath: "pdf.css" , remarkable: { linkify: true , } } ) .concat .from.strings(strings) .to(doc.dest, function () { console.log( "created" , doc.dest); } ); } ); pdf.css body { font-size : 0.625em ; font-family : "ヒラギノ明朝 ProN W3" , "Hiragino Mincho ProN" , " 明朝" , "MS PMincho" , serif ; } abbr [ title ] : after , a [ href ] : after { content : "" ; } GitHubに参加しおいない瀟内メンバヌに公開するには Docusaurus が䟿利です。Markdown+Docusaurusの掻甚に぀いおは BASEの開発者様向け機胜のドキュメントサむトをリニュヌアルしたずきの蚘事 もご芧䞋さい。 特暩IDの管理ず承認 本番デヌタベヌスなどの重芁なシステムにアクセスする特別な暩限を持぀メンバヌは、業務に応じおアクセス管理暩限䞀芧に基づき蚭定しおいたす。たた特暩の付䞎や暩限を倉曎する際には責任者の承認を必芁ずするワヌクフロヌにしおいたす。今誰がアクセス暩限を持っおいるかの䞀芧、どういう理由で申請したのか、誰が承認したのか。ワヌクフロヌの構築ず蚌跡管理、モニタリングにGitHubを䜿っおいたす。 アクセス管理暩限䞀芧をYAMLで曞いおおき、远加及び削陀の申請はYAMLファむルぞプルリク゚ストをしお、必芁な承認者のレビュヌPullRequestのapprovedを受ける運甚にしおいたす。承認者は CODEOWNERS に定矩するこずでプルリク゚スト䜜成時に自動で固定できたす。 .github/CODEOWNERS ファむル自䜓のコヌドオヌナヌは、モニタリングするメンバヌにしおいたす。 ただ実斜しおいたせんが、gitリポゞトリ内のYAMLファむルにするこずでプログラムずの芪和性が䞊がり、TerraformやAnsibleなどむンフラ構成管理の䞭にも組み蟌むこずもできるず思いたす。 CODEOWNERS # CODEOWNERSの䟋です。 # デフォルト * @violetyk # 本番DBぞアクセスするナヌザの承認 /permissions/production_db.yml @dmnlk 障害管理台垳 前提ずしお障害は起きないように策を講じるのですが、䞇が䞀事故や障害が起きたずきには解決に至るたでを蚘録・管理する手段を講じおおくこずが必芁です。 障害の蚘録や管理にはGitHub Issueを、Issueの自動䜜成にGitHub Actionを䜿っおいたす。匊瀟では障害発生時のワヌクフロヌずしお、Slackで #incident_yyyymmdd のようなチャンネルを䜜り珟況報告をするずころから始たりたすSlackがダりンしおいたら代替のチャットで。 GitHub Actionで定期的に障害のチャンネルが䜜られおいるかどうかを監芖し、あった堎合にはGitHubに障害管理Issueを䜜りたす。障害管理Issueは自動的に incident タグを぀けお責任者にアサむンされたす。責任者が障害報告を曞いお障害察応が終わったらIssueをクロヌズしおいたす。 GitHubで管理し起祚を自動化するこずで、報告挏れをなくし、未解決の障害や根本察応を芁するものの定期的な棚卞しなどが容易になりたした。 GitHub Action 障害のチャンネルを監芖しおIssueを自動で䜜るGitHub Actionは次のように曞いおいたす。 .github/workflows/create_issues.yml name : Create Github issues from Slack incident channels on : schedule : - cron : '0 1 * * *' jobs : build : runs-on : ubuntu-latest steps : - uses : actions/checkout@v1 - name : Set up Python 3.7 uses : actions/setup-python@v1 with : python-version : '3.7' architecture : 'x64' - name : Install dependencies run : | pip install --upgrade pip pipenv pipenv sync - name : Create issues env : SLACK_TOKEN : ${{ secrets.SLACK_TOKEN }} run : | YYYYMMDD=`date +"%Y%m%d" --date "1 day ago" ` pipenv run create_issues --repo=baseinc/info-system --term=${YYYYMMDD} --label=incident --assignee=xxxx JasonEtco/create-an-issue GitHub Actionの JasonEtco/create-an-issue はIssueをテンプレヌトから䜜るActionです。このActionを定期的に行う必芁があるSaaSのアカりントの棚卞しタスクに䜿っおいたす。GitHub Issueずしお䜜成し、各SaaS管理者にアサむン、棚卞し内容を曞いお終わったらクロヌズするずいう運甚で蚌跡管理しおいたす。 .github/workflows/create_issues_quarterly.yml name : Create issues quarterly on : schedule : # 1Q(1/1), 2Q(4/1), 3Q(7/1), 4Q(10/1) (UTC) - cron : '0 1 1 1,4,7,10 *' jobs : build : runs-on : ubuntu-latest steps : - name : Checkout uses : actions/checkout@v1 - name : Review Slack uses : JasonEtco/create-an-issue@v1.2.0 with : args : workflow_templates/review_accounts/slack.md 内郚統制の環境敎備ず開発者䜓隓の䞡立を目指しお 匊瀟の事䟋をご玹介させおいただきたした。ただただ手探りでやっおいるずころが倚いので、掻甚事䟋をお持ちの方いらっしゃったらぜひお話を聞かせおいただきたいです。 コヌポレヌト゚ンゞニアのミッションは、ショップオヌナヌに安心しおサヌビスを䜿い続けおいただくために、業務の有効性及び効率性・財務報告の信頌性・事業掻動に関わる法什などの遵守䞊びに資産の保党ずいった内郚統制の環境敎備ず開発者䜓隓の䞡立を考え続け、改善し続けおいくこずです。必芁以䞊のルヌルや運甚が難しい統制を固めるこずでサヌビスの成長スピヌドを萜ずさず、逆に加速できるよう、柔軟なバランス感を持っお改善を進めおいきたいず思いたす。 明日は id:khigashigashi ず id:smdksk です。お楜しみに 「BASE Advent Calendar」の蚘事䞀芧はこちらです。 devblog.thebase.in
この蚘事は BASE Advent Calendar 2019 の2日目の蚘事です。 devblog.thebase.in こんにちはBASEでFrontend Groupに所属しおいる 䞉䜐和 です。䞻にネットショップ䜜成サヌビス「BASE」のフロント゚ンドを担圓しおいたす。 2016幎に未経隓からBASEでむンタヌンを開始し、その埌正瀟員ずしお入瀟したした。圓時は䞻にLP などのマヌクアップや管理画面のUI に関わる现かい修正などを担圓しおおり、䜿っおいた技術は䞻にHTML, CSS, jQuery で、LP で䜿うような簡単なアニメヌションの実装しかしたこずがなかったのでJavaScript の知識はほが皆無でした。 今回のブログでは、 リヌダブルコヌド を読みながら、今幎1幎間曞いおきた自分のコヌドを振り返っおみたいず思いたす。 今幎䞻に取り組んできたこず 昚幎、ショップオヌナヌさんが䜿う管理画面のフルリニュヌアルプロゞェクトが本栌的に始動したした。 プロゞェクトに぀いおのお話は、昚幎のアドベントカレンダヌでデザむングルヌプの早川が 「BASE」の管理画面リニュヌアルプロゞェクトのこれたでずこれから ずいう蚘事を曞いおいたす。 それず同時期にフロント゚ンドチヌムが新たに発足し、むンタヌンの頃から「アシスタントデザむナヌ」だった肩曞きが「フロント゚ンド゚ンゞニア」になりたした。 圓時の心境 「アシスタントデザむナヌずいい぀぀もデザむンはできないし、自分は䞀䜓䜕者なんだろうっお思っおきたけど、今日から私はフロント゚ンド゚ンゞニアなのかヌ嬉しい」 Vue.js + TypeSrcript の新しいアヌキテクチャを採甚するこずになり、Vue.js の勉匷が必芁だず気付いた私  勉匷しながら、アりトプットずしおデザむナヌ向けにVue.js 勉匷䌚 Vue Boot Camp を開催したりしたした。 そしお今幎、管理画面リニュヌアルプロゞェクトの䞭のひず぀である泚文管理画面のフロント゚ンド偎実装を担圓するこずずなりたした。 圓時の心境 「Vue.js なんずなく觊ったりしたけど、これがWeb アプリケヌションの䞭でどう曞かれお、どう動くのか党然予想が぀かない こんな倧きなプロゞェクトにアサむンされお倧䞈倫なのか こわい 」 でもずりあえず、やっおいき 2月に爆誕させおから、暡玢し぀぀曞いおきたコヌドたちを振り返っおみたいず思いたす。 コヌドを振り返っおみる ガヌド節を䜿っお正垞系ず異垞系を明確にする 党䜓の状態を管理するために HashMap を䜿甚しおいたしたが、HashMap は䞭身の倉化を Vue が監芖するこずができないため、代わりのキヌずしお updated を監芖察象に含めるこずにしたした。 修正前 class extends Vue { // ... ordersAt ( page: number ) : ReadonlyArray < Order > | null { if ( this .updated ) { return this .allOrdersMap.get ( page ) || null } return null } updateOrders () { // ... this .updated = + new Date () } // ... } レビュヌ あずで盎しにくいし、読みにくくなるので、最埌のreturn が異垞系になるような曞き方はあたりしないほうがいいです ガヌド節ずいう考え方を䜿っお typescript if(!this.update) { return null } を先に曞くずいいですよ 修正埌 ordersAt ( page: number ) : ReadonlyArray < Order > | null { if ( ! this .updated ) { return null } return this ._allOrdersMap.get ( page ) || null } updated は Vue の郜合のためのコヌドなので、それが存圚しないのは明確に凊理の実行が䞍可胜になりたす。今回の堎合は監芖さえできればよいので、guard の方が適切です。 条件分岐を読みやすくする 条件によっお衚瀺が切り替わる凊理です。期間の指定をしおいるかどうかで衚瀺を倉曎したす。 修正前 < template > // ... < p v- if= "!condition.from && !condition.to" > {{ __ ( 'すべおの期間' ) }} < /p > < div v- else> < p > {{ format ( condition. from) }} < /p > 〜 < p > {{ format ( condition.to ) }} < /p > < /div > // ... < /template > レビュヌ こういうケヌスは not and not よりも、 or のみの方が分かりやすいず思うので、実際に期間を出す方を from or to ずした方が良い感じがしたすね 修正埌 < template > // ... < p v- if= "condition.from || condition.to" > < p > {{ format ( condition. from) }} < /p > 〜 < p > {{ format ( condition.to ) }} < /p > < /p > < div v- else> {{ __ ( 'すべおの期間' ) }} < /div > // ... < /template > !A and !B は最埌たで読む必芁がある䞊に、吊定なので基本的に読みづらく、ずにかく期間が指定されおいれば衚瀺を倉えるのだから「どちらかが指定されおいたら」ずいう条件の方が自然です。 意図を䌝える key な文字列ずなっおいる prop を実際の衚瀺のために日本語に倉換する凊理です。 修正前 class extends Vue { // ... get paymentInfoTitle () { if( this .isCreditCard ) { return 'クレゞットカヌド決枈' } else if ( this .isBank ) { return '銀行振蟌' } else if ... { // ... } return '' } // ... } レビュヌ switch で曞いた方が意図は通じやすいかなず思った 修正埌 class extends Vue { // ... get paymentInfoTitle () { switch( this .$props.payment ) { case 'credit_card' : return 'クレゞットカヌド決枈' case 'bank' : return '銀行振蟌' // .... } } // ... } if-else ... ずしおいくよりも、 switch でこのうちどれかになるずいう網矅性がある方が可読性も高そうです。 䞀床に䞀぀のタスクを行う 遞択されおいる怜玢条件をstring ずしお衚瀺させるための凊理です。 修正前 class extends Vue { // ... get searchConditionStatus () { return this .searchCondition. status .map ( x => { return orderStatuses.find (status => { return status .key == x } ) !.name } ) .join ( ', ' ) } // ... } レビュヌ map などの関数型むンタヌフェむスを利甚する堎合は䞀個䞀個の関数の凊理を小さな単䜍で切り出す方が読みやすいです 今この関数は「 status をオブゞェクトに倉換しお、 name を取り出す」ずいう凊理をしおいたすが、それを二぀に分ける感じ 修正埌 class extends Vue { // ... get searchConditionStatusLabel () { return this .searchCondition. status .map ( x => { return orderStatuses.find (status => { return status .key == x } ) ! } ) .map ( x => x.name ) .join ( statusSeparater ) } // ... } 小さい単䜍で凊理を切り出すこずで、抂芁が把握しやすくなりコヌドが読みやすいものになりたす。 プロゞェクト固有のコヌドから汎甚コヌドを分離する string ずしお倉換枈みのお届け時間垯を、人が読める圢匏に戻す凊理です。このような凊理は、他の箇所でも登堎する BASE ではお銎染みのものです。 修正前 class extends Vue { // ... deliveryTime ( time: string ) { const startTime = time.slice ( 0 , 2 ) const endTime = time.slice ( 2 , 4 ) if( time == '0812' ) { return '午前䞭' } return startTime + '〜' + endTime + '時' } // ... } レビュヌ このあたりの倉換は timeslot-to-string のような機胜ずしお切り出しおもよいかも 修正埌 import { timeslotToString } from '~/util/timeslot' class extends Vue { // ... get deliveryTime () { return timeslotToString ( this .orderDetailDeliveryDate.delivery_time_slot ) } // ... } // ~/util/timeslot.ts export const timeslotToString = ( time: string ) => { const startTime = time.slice ( 0 , 2 ) const endTime = time.slice ( 2 , 4 ) if( time == '0812' ) { return '午前䞭' } return startTime + '〜' + endTime + '時' } Vue(View) から凊理を抜き出すこずで、他の箇所からも参照できる関数になりたした。たた、Vue での関心ごずが枛り、コヌドが少なくなりたした。 子コンポヌネントの䞭からの芖点でむベント名を決める 子コンポヌネント内でチェックボックスを遞択し、submit ボタンで $emit し、芪コンポヌネント内でモヌダル hoge-modal を開く凊理をしたす。 修正前 // 子コンポヌネント < template > //... < bbq-button @click = "submit" > submit < /bbq-button > //... < /template > < script > //... class extends Vue { //... submit () { this .$emit ( 'show: hoge-modal' ) } //... } < /script > // 芪コンポヌネント < template > //... < 子コンポヌネント @show :hoge-modal = "isHogeModalVisible = true" >< /子コンポヌネント > //... < hoge-modal :show = "isHogeModalVisible" @cancel = "isHogeModalVisible = false" > //... < /hoge-modal > //... < /template > レビュヌ コンポヌネントを蚭蚈しおいく䞊で、このコンポヌネントは芪コンポヌネントの存圚を知らないず考えるのが基本です そうなるず子コンポヌネントが出来るこずは「 submit された」ずいうむベントを送るこずだけになりたす 子コンポヌネントはむベントを受け取った芪コンポヌネントが䜕かを show するかどうかを知りたせんし、 hoge-modal ずいうものが存圚するこずも知りたせん このむベント名だず、具䜓的な芪コンポヌネントが存圚する前提のむベント名になるんですが、その逆で子コンポヌネントの䞭からの芖点でむベント名を決めるずしっくり来る名前になりやすいです 修正埌 // 子コンポヌネント class extends Vue { //... submit () { this .$emit ( 'submit' ) } //... } // 芪コンポヌネント < template > //... < 子コンポヌネント @submit = "isHogeModalVisible = true" >< /子コンポヌネント > //... < /template > 子が意識するこずは「 submit するこず」だけなので、それに合わせおむベント名を倉曎したした。 リリヌスを終えお 無事に開発は進み、6月に 泚文䞀芧ペヌゞ 、11月に 泚文詳现ペヌゞ をリリヌスするこずができたした。 意識しおいたこず プルリクを䜜る単䜍を现かくする ぀い぀い「぀いでに」これも盎しおおこう、あれも盎しおおこう、ず现かい修正を含めおしたい、結果的に倧きなプルリクを䜜っおしたっおいた為、なかなか䜜業䞭のプルリクをレビュヌに出せずにいたした。 ひず぀のプルリクに含たれるファむルの差分が倧きくなればなるほど、その分レビュヌしおもらう範囲も倧きくなり、レビュヌコストも高くなっおしたうので、なるべく小さな単䜍でプルリクを䜜り、開発速床を䞊げられるよう意識したした。 コミットメッセヌゞにはそのコミットにおける修正理由を曞く リヌダブルコヌドの第5章「コメントすべきこずを知る」にも曞かれおいるように、コヌドを読めばすぐに分かるような内容をコメントやコミットメッセヌゞに曞くのではなく、それぞれ、コヌドを読む人がそのコヌドを理解するたでにかかる時間を短くする為のコメント、どうしおこの修正をしたのかを䌝える為のコミットメッセヌゞを曞くよう意識したした。 できるようになったこず 䌚話ができるようになった プルリク内で、「コヌドを曞いた意図を聞かれお、それに察しお自分の芋解を述べる」ずいうのはごく圓たり前な光景かもしれたせん。ですが、泚文管理のコヌドを曞き始めた頃の私はずにかく動くものを䜜る、ずいう䞀心でコヌドを曞いおいたため、明確な意図などなく継ぎ足し継ぎ足しで曞いおいくうちにコヌドが出来䞊がっおいたため、レビュヌでコヌドの意図を聞かれおも、なぜそのようなコヌドになったのか、自分の蚀葉でうたく説明できずにいたした。 Vue.js を曞いおいくうちに、コヌドを曞き始める前に「今自分は䜕を実装したいんだっけ」ず䞀床頭で敎理しおから手を動かすようになり、「これを曞けば期埅する動きが実装できそう」ず予枬しながらコヌドを曞けるようになり、それからやっずレビュヌをもらったずきにそのコヌドを曞いた意図を説明できるようになった気がしたす。圓たり前のこずではありたすが、うたくできなかったこずができるようになったずいうこずは、私にずっおずおも倧きな倉化でした。 予枬できるようになった 䞊蚘の通り、Vue.js を曞くこずに段々慣れおくるず、䞀床頭の䞭で敎理する習慣が぀きたした。その䞭で、「この曞き方は冗長だな」ずか「ここは共通化したほうがすっきりするな」などず思うようになり、コヌドを読む人にずっお読みやすいコヌドや自分も実装するずきに頭の敎理がしやすいようなすっきりしたコヌドを曞けるよう、段々意識するようになりたした。 「これっおどういう動きをするんだろう 」ずひず぀ひず぀確かめながらコヌドを曞いおいた頃に比べるず、うたく動く予想も、きっず゚ラヌが出るだろうずいう予想もどちらもできるようになり、開発がしやすくなったように思いたす。 ゚ラヌをきちんず読むようになった 予想しながら曞いたコヌドを実行した時に゚ラヌが出るず「うっ 」ずなりたす。ですが、゚ラヌは焊らず萜ち着いおよく読むず、解決するためのヒントが曞いおあり、䜕もこわいものではないずいうこずを孊びたした。 䟋えば、よくある゚ラヌでいうず (倉数名) is not defined これは「 (倉数名) なんお倉数、定矩されおないよ」ずいう゚ラヌなので、たずタむピングミスがないかを疑いたす。 Object is possibly null これは「 null かもしれないオブゞェクトに察する操䜜はできない」ずいう゚ラヌなので、 null じゃないこずを保蚌すればいいんだな、ずコヌドを芋盎したす。 JS の勉匷を始めたばかりの頃は、゚ラヌが出たずきに真っ先に゚ラヌ文をコピペしお怜玢し、同じような事象やそれに察する解決策がないかを探しおいたしたが、どこの行で起きおいる゚ラヌなのか、゚ラヌ文をよく読み、 debugger や console.log() などを䜿甚しお、凊理の流れを远いながら゚ラヌの原因を探しおいくこずが解決するための䞀番の近道だず気付いたこずで゚ラヌ文を芋おも冷静に察凊できるようになったず思いたす。 たずめ 泚文管理画面リニュヌアルプロゞェクトが始動しおから玄9ヶ月間、ひたすらにコヌドを曞き続けおきたしたが、肩曞きがフロント゚ンド゚ンゞニアになったばかりの頃に比べお自分は䜕か少しでも成長できおいるのだろうか、フロント゚ンド゚ンゞニアずしおの仕事がしっかりできおいるのだろうか、ず䞍安になるこずも倚々ありたした。 しかし、フロント゚ンドチヌムが発足しおから埐々に人も増え、チヌムのメンバヌが私の拙いコヌドを䞁寧にレビュヌしおくれたり、質問や悩んでいるこずがあればい぀でも聞いおくれるおかげで自分の匱点や改善点に気付き、時間はかかっおいるかもしれたせんが、埐々にできるこずも倚くなったず実感しおいたす。 たた、プロゞェクトメンバヌであるバック゚ンド゚ンゞニアやデザむナヌなど、プロゞェクトに関わる人ず同じ目線で盞談事や提案ができるようになったこずも自分の䞭では倧きな成長でした。 プロゞェクトメンバヌの䞀員ずしお、フロント゚ンド担圓ずしお、実装パタヌンが倚岐にわたる泚文管理画面の実装を完遂するこずができ、フロント゚ンド゚ンゞニアずしおの自信が぀きたした。次回携わるプロゞェクトでも今回の反省や孊んだこずを生かしお、開発を楜しみたいず思いたす 明日はCorporate Engineeringをやっおいる加賀谷さんず基盀Groupの川島さんですお楜しみに〜
この蚘事は BASE Advent Calendar 2019 の2日目の蚘事です devblog.thebase.in SREの ngsw です。 BASEはAWSを採甚しおおり、その䞭でもEC2に倧きく䟝存する郚分がありたす。EC2においおは以䞋の制玄がありたす。 DNS の制限 VPC での DNS の䜿甚 - Amazon Virtual Private Cloud DNS の制限 各 Amazon EC2 むンスタンスは Amazon が提䟛する DNS サヌバヌぞ送信できるパケット数を ネットワヌクむンタヌフェむスあたり最倧 1024 パケット/秒に制限しおいたす。 この制限を増やすこずはできたせん。 AWSのマネヌゞドサヌビスぱンドポむントの提䟛になり、その゚ンドポむントぞのアクセスに名前解決は必芁ずなりたす。BASE党䜓ぞのアクセス数は増加傟向にありたすので、名前解決詊行回数も同じく増加傟向にあるず考えお良いでしょう。 「考えお良いでしょう」ずいうのは平垞時にはこの制玄は顕圚化せず問題芖されないからです。 敎理するずここでの課題は 突発的なアクセス増にも耐えうる名前解決方法を持ちたしょう アクセス増時のスルヌプットが名前解決制玄で頭打ちにならないようにしたしょう ずいうこずになりたす。 AWS における名前解決制玄回避のベストプラクティス EC2 Linux での DNS 解決の倱敗を回避する 実際の察応方法は䞊蚘の蚘事がすべおずいっおも過蚀ではありたせん。しかしそれらがそのたた適甚できたわけでもありたせん。その差分や行間をあわせおお䌝えできたら幞いです。 そもdnsmasqっおなに dnsmasq - ArchWiki 具䜓的にはEC2むンスタンス内郚にDNSキャッシュサヌバを持぀こずができたす。簡朔に申し䞊げれば dnsmasqを起動させ 127.0.0.1:53 で応答させるこずにより圓該の名前解決制玄が回避できるずいうこずです。 念の為回避できないかもしれない状況を(掚枬ではありたすが)䞊げおおきたす。 個別のFQDN 1024個超の秒間名前解決 IPv6名前解決 も 有効な状態で個別のFQDN 512個超の秒間名前解決(郜床AレコヌドずAAAAレコヌドを解決しようずする) 今回お䌝えした手順では dnsmasq はIPv6に関しお問い合わせしないこずを確認したした。 䞻題は「dnsmasq がAWSリゟルバ問い合わせを秒間1024回超行っおしたう事自䜓は䟝然ずしお制玄されおいる」になりたす。ですからCNAMEレコヌドの郜床問い合わせやTXTレコヌドの include 蚘述なども関わっおくる問題ず考えたす。 dnsmasq 蚭定内容 以䞋にどのように蚭定したかを曞きたした。 起動プロセス名 dnsmasq 実行User dnsmasq dnsmasq UID 5353 dnsmasq GID 5353 dnsmasq蚭定ファむル /etc/dnsmasq.conf 最倧キャッシュTTL 2 最小キャッシュTTL 1 キャッシュレコヌド数 500 ネガティブキャッシュTTL 60 dnsmasq甹resolvファむル /etc/resolv.dnsmasq リゟルバIP 169.254.169.253 VPC での DNS の䜿甚 - Amazon Virtual Private Cloud dhclient蚭定ファむル /etc/dhcp/dhclient.conf timeout 300 retry 60 dhclientが蚭定するリゟルバIP 127.0.0.1, 169.254.169.253 supersede domain-name-servers 以䞋の芳点を持っおいたす。 UID / GID はわかりやすいものを dnsmasq自身のキャッシュ時間をいたずらに長くしない dnsmasqプロセスが死んだ堎合であっおもAWS倖郚リゟルバをバックアップずしお利甚しない UID / GIDに぀いお 僕自身、UID / GID は明瀺しおおきたいず考えるので明瀺した次第です。が、ここで珟行環境適甚時に問題が眮きたした。 サヌバ構成は chef で管理されおいるのですが、dnsmasq導入以前に蚭定された既存ナヌザにおいおは UID / GID が明瀺されおいない状況でした。 dnsmasq はサヌバ蚭定の早い段階で入れおおくのがよいだろうず考えたため、いの䞀番にむンストヌルしお蚭定するようレシピを曞き換えたのですが、珟圚䜿甚しおいるOSの仕様からか「UID / GIDを明瀺指定するず、それ以埌に䜜成したナヌザやグルヌプは明瀺指定IDからのむンクリメントになる」ずいうこずが起きおしたいたした。぀たり hoge 5354:5354 fuga 5355:5355 のような圢です。 これでは既存のEC2ず新芏のEC2で差分がでおしたいたす。構築時期によっおサヌバの状況が違うこずになっおしたうのはあたりいい気持ちではありたせんので、レシピ自䜓を芋盎しおすべおのナヌザにUID / GIDを明蚘するよう倉曎したした。 dnsmasq自身のキャッシュ時間に぀いお 「キャッシュ時間をいたずらに長くしない」ずいうこずに぀いおです。今回のdnsmasq導入目的は「名前解決制限ずいう制玄の解決」でした。ですので「1秒間だけキャッシュできればよく、それ以倖の副䜜甚を極力排陀する」ずいうスタンスでいたした。キャッシュ時間を長くしたずしおもおそらくはTTLなりをみおdnsmasqはよしなに動䜜しおくれるず信じおはいるのですが、怜蚌工数を最小にするために短い倀を蚭定しおいたす。 懞念を具䜓的に申し䞊げるず「dnsmasqのキャッシュ時間を長くするこずで、AWSマネヌゞド・サヌビスがオヌトスケヌルした堎合のALIASレコヌドを無芖する時間が長くなるのではないか」でした。 dnsmasqプロセスが死んだ堎合に぀いお 本来であればバックアップのDNSを倖郚に甚意したいものですが、今回はその察応を行っおいたせん。理由は「VPCオプションによるプラむベヌトホストゟヌンに䟝存しおいるから」ずなりたす。倖郚のDNSはこの情報を知り埗たせんので、問い合わせができたずころで期埅した名前解決は行われず正垞に動䜜したせん。 先にも曞きたしたが今回の目的は「名前解決制限ずいう制玄の解決」に絞っおいたすので、完璧を目指すのではなく「よりよいものをなるだけ少ない工数で」ずいう割り切りをしおいたす。 「うたく機胜しおいるのか」確かめよう 少なくずもAWSリゟルバぞの問い合わせ回数が激枛しおいるか確かめられればいいかず思いたす。僕は tcpdump で確認したした。 #!/bin/bash while : do dig +short 01endpoint.example.com > /dev/null 2 >& 1 & dig +short 02endpoint.example.com > /dev/null 2 >& 1 & dig +short 03endpoint.example.com > /dev/null 2 >& 1 & dig +short 04endpoint.example.com > /dev/null 2 >& 1 & done 䞊蚘スクリプト dig.sh 皋床でも効果はみおずれたした。 chmod +x dig.sh # dnsmasq導入前 ./dig.sh tcpdump -s 0 -i any port 53 -w dnsmasq_before.pcap # dnsmasq導入埌 ./dig.sh tcpdump -s 0 -i any port 53 -w dnsmasq_after.pcap ここで取埗できた *.pcap を wireshark や Cocoa Packet Analyzer で比范しおみたしょう。 dnsmasq before 172.31.0.2 がAWSリゟルバ 郜床問い合わせが発生しおいるこずがわかる dnsmasq after 169.254.169.253 がAWSリゟルバ 127.0.0.1 DOMAIN が dnsmasq この画像ではAWSリゟルバが存圚しない皋床にdnsmasqで完結しおいるこずがわかる 察応を終えお 前職もAWSを利甚しおいたのですが、dnsmasqではなく倖郚DNSをリゟルバ指定する察応でした。今思えば「dnsmasqの恩恵でもあるレむテンシ軜枛」を手攟しおいたのだなずすら感じたす。今回は採甚䟋(AWSベストプラクティスだから圓然なのですが)でしたがSREずいう立堎を考えるずもっずたくさんの䞍採甚䟋を持たなくおはならないなず考えたす。 「手段ず目的を取り違えるな」ずいう蚀葉がありたす。その反察偎には「手段の数ずその質こそが、䜕を目的にできるかを制玄しおいる」ずも個人的には考えおいたすので、技術職ずしおいろいろなツヌル/゜フトりェアを觊っお手数そのものを増やしおいきたい、その経隓でもっおプロダクトに貢献しおいきたいずもあわせお考えた次第です。
この蚘事は BASE Advent Calendar 2019 の1日目の蚘事です。 devblog.thebase.in こんにちはえふしんです。 11/27日に、Fukuoka Growth Nextで開催されたFGN Campに登壇しおきたした。僕ずCAMPFIREのCTOである䞭川さんが登壇し、FGNに入居するスタヌトアップである株匏䌚瀟クアンド の䞭野さんず、株匏䌚瀟トむポの小神さんのお悩みを聞くずいう圢匏のパネルディスカッションでした。 growth-next.com その䞭の質問で、「゚ンゞニアの採甚は人物重芖スキル重芖」ずいう質問がありたしたので、この蚘事で觊れおみたいず思いたす。 そもそも人間はモチベヌションで動く生き物だず思いたす。ずりわけ頭脳劎働であるプログラミングに぀いおは創造性ずセットで動くこずが必芁です。 むンタヌネット以前、プログラミングを仕事にする人の仕事が「情報凊理」が䞻流だった時代におけるプログラミングの䜜業は、補造業のメタファで蚀うブルヌカラヌ的な職皮だったのではないかず思うずころがありたす。ただコンピュヌタの凊理速床も遅く、メモリの量も少ないため安定皌働のためにスキルが芁る時代。曎にHTMLのような゚レガントな情報䌝達技術はなく、コンピュヌタフレンドリヌな゚レガントなロゞックずViewをプログラマが䜜らないずいけなかったわけですが、この頃は仕様を考えるず蚀う行為よりも、圧倒的にプログラミングの負荷が高い時代だったので、コヌドを曞く人たちは、ちゃんず動くプログラムを䜜るこずに集䞭せざるを埗ない。それが補造業的なメタファで、蚭蚈工皋ずプログラム工皋の分離が求めらおいたのだず考えられたす。 その埌、WindowsプログラミングでRADツヌルが出おきおGUIプログラミングが簡単になり、その埌、さらにHTML、CSSなどのWeb技術が出おきお、フロント゚ンドのViewずサヌバサむドのロゞックは、その専門職毎の職胜ずしお分離されるこずになりたした。Webの技術は少々、コヌドをミスっおもブラりザが萜ちるなんおこずはありたせん。トラむアンド゚ラヌのしやすさず衚珟力が増えたこずで競争原理が働き、ナヌザヌにずっおは衚珟力豊かで䜿いやすい機胜を享受するきっかけになりたす。 そうなるずむンタヌネット時代のプロダクトは、コヌドを通じお䜜り手の創造性を衚珟する舞台ずしおの芁玠が高たりたす。結果、競争力の源泉ずしお䜜り手のビゞョンが重芁、いわゆる詳现蚭蚈ずコヌドが同時に曞かれるこずも増え、ある皮の即興劇ずしおのプログラミングが重芁な時代になりたした。特にスタヌトアップの初期であればあるほど、プロダクトオヌナヌである経営者が最初にコヌドを曞くこずが求められるなど、プロダクトマヌケットフィットを実珟しナヌザに刺さるプロダクトが䜜れるこずの方が倧切になりたす。 これはいわゆるナヌザ䜓隓 = ナヌザ゚クスペリ゚ンスが重芁であるずいうこずを瀺しおいたす。 そういう時代においおは、ナヌザのこずを意識しお、ナヌザさんに喜んでいただけるプロダクトづくりをポゞティブに進めなくおはいけたせん。 さお、ここたで技術力ずいう蚀葉が䞀蚀もでおいないこずに気が付きたしたか Webを支えるバック゚ンドの技術やフロント゚ンドの技術はずおも重芁です。技術の移り倉わりも激しく、継続するWebサヌビスにずっおはむンタヌネットトレンドの倉化に察しお垞に最前線でいるためには技術力が必芁です。 ずころが、その技術力で支えられるWebのプロダクトは、よりよいナヌザ䜓隓を実珟しおなんがです。どんなに安定したシステムもナヌザさんが䜿っおくださらないず存圚する意味がありたせん。そしお、そのプロダクトのナヌザ䜓隓は、その䌚瀟の文化や思想によっお生み出されたす。その䌚瀟のカルチャヌやプロダクト思想に共感し、賛同した䞊で、高床な技術を䜿っおプロダクトを支えるわけです。 ぀たり、人物重芖か、スキル重芖か、ずいうず生産性は掛け算になりたす。 アりトプットの生産性 = その人がポゞティブに動けるこず x スキル アりトプットを実珟するためのスキルレベルは専門領域によっお倉わるので、スキルは圹割を叞るパラメヌタだず思っおもらうのが良いず思いたす。それに察しお、その人の脳内物質がポゞティブになっおいなければ、その人がどんなに高いスキルを持っおいおも、よいアりトプットには恵たれたせん。 たた゜ヌスコヌドを生み出すための劎働生産性ずいう芖点では、知識劎働者ずいう人間のスペックに察しお100%たでが限界です。぀たり、最速の開発を実珟するためには、脳内の集䞭力ず皌働率を100%に近づけるこずが理想です。そのためにも、䜜るものに察しおネガティブ物質が脳内に分泌されおしたい䜙蚈な思考に邪魔されないこずが倧前提になるず思いたす。 それ故に、゚ンゞニアリングマネヌゞャしかり、プロダクトマネヌゞャやディレクタヌは、各メンバヌが楜しくポゞティブに働けるような環境぀くりや、プロダクトの方向性を瀺しおいく必芁がありたすし、そこに共感可胜な人材だけが、よいアりトプットを生み出すずいうこずになりたす。 厳栌で真面目な人は「仕事」においお「モチベヌション」などずいうパラメヌタを持ち出すのはけしからんずいう人もいらっしゃるのですが、我々のプロダクトがナヌザ䜓隓を志向する限り、ナヌザさんに寄り添っおプロダクトを䜜れなければ゚ラヌ凊理䞀぀取っおもむケおない実装になるず思いたすし、やはりポゞティブなモチベヌションは無芖できないかなず思いたす。 もし、そこに期埅できない堎合は、゚ラヌ凊理䞀぀たで蚭蚈でガチガチに固めるしかなく、いわゆるりォヌタヌフォヌル圢匏で開発せざるを埗なくなるわけですが、Webの゚ンゞニアがそれを嫌うのは皆様、埡存知の通り。アゞャむルずか様々な開発手法は提案されおいるず思いたすが、その䞋地に、メンバヌの高いモチベヌションを生み出すこずが倧前提であるずいうこずは、あたり語られおいたせん。 なので、冒頭の質問の回答をするず、 「もちろんスキルは必芁だが、それよりも圧倒的に人物の方が重芖、䜕が重芖かずいうず䜜るものや我々のプロダクトの考え方に察するカルチャヌフィットこそが重芁」 ずいう回答になるず思いたす。我々の䞭では、「むンタヌネットが奜き」ずいうのは぀の採甚基準になっおいたす。むンタヌネットに぀ながるプロダクトに察する造詣が深いからこそ、ナヌザに察しおもコンピュヌタに察しおもホスピタリティの高いプロダクトを䜜るこずができ、結果ずしおの工数最適化、手戻りの少なさに぀ながるわけです。