UX DAYS TOKYO 2025の感想 ~成長を生み出すインサイトの見つけ方~

UX DAYS TOKYO 2025の感想 ~成長を生み出すインサイトの見つけ方~

はじめに

「宿泊施設の掲載数を倍にしてください」


あなたなら、このミッションにどう挑みますか?

この目標に対して、常識では考えられないアプローチで成果を出したのが、
私が参加したワークショップの講師、エリン・ウィーゲルさんです。

エリンさんは、UXデザインとリサーチの分野で15年以上の経験を持つエキスパート。
DeliverooやBooking.comといったグローバルテック企業でプロダクトデザイナーとして活躍し、
数々の複雑なデザイン課題を解決してきました。

この問いは、彼女がBooking.com在籍時に実際に直面したチャレンジでした。

コンバージョンデザインについて

その答えをお伝えする前に、エリンさんの思考の核となっている
「コンバージョンデザイン(Conversion Design)」という考え方について、少しだけご紹介させてください。
(※答えだけ知りたい方は、このまま最後までスクロールしていただければ大丈夫です)

コンバージョンデザインとは、
デザイン(人間中心の問題解決)、科学(科学的手法)、ビジネス(価値創造とステークホルダーへの価値提供)の3つを組み合わせたプロセスです。

この考え方の目標は、
「どのような変化が必要なのか」
「その変化によって恩恵を受ける人・受けない人は誰なのか」
を正しく理解した上で、企業が顧客に価値を届ける流れ=バリューサイクル(下図参照)をより良くしていくことにあります。

バリューサイクル

(参照:『Design for Impact』)

そしてもう一つの重要な目的は、
その変化が本当に意図した成果に結びつくのかを確実にすることです。

このプロセスは、以下の7つの相互に関連するステップから成り立っています(下図参照)

コンバージョンデザインプロセス

(参照:『Design for Impact』)

1. 理解する(Understand)

顧客の課題を、ビジネス目標の視点から深く理解し、インサイトを得ます。

2. 仮説を立てる(Hypothesize)

得られたインサイトを、テスト可能なアイデアに変換します。 ここでは、実験によって答えを導けるような問いを設定し、科学的手法(構造化された思考プロセス)を使って仮説を立てます。

3.優先順位を付ける(Prioritize)

仮説の中から、どれが顧客にとって価値があり、ビジネスに最も大きな影響を与えるかを見極めます。 短期的な効果と長期的なビジネス目標を天秤にかけながら、実行順を戦略的に決めていきます。

4.実験を作る(Create)

選んだ仮説を、具体的なテスト可能なコンセプトに落とし込みます。

5.テストする(Test)

A/Bテストなどの手法を使って検証し、信頼できるデータ(エビデンス)を集めます。

6.分析する(Analyze)

集めたデータを分析し、「仮説は正しかったのか?」を見極め、そこから学びを得ます。

7.決定する(Decide)

学びに基づき、最適な意思決定を行います。

そして、このようにして得られた知見や価値は、再びバリューサイクルへと還元され、 次の改善へとつながっていきます。

つまり、コンバージョンデザインは一度きりの施策ではなく、価値を生み出し続けるループなのです。

ワークショップに参加して

ワークショップの中で紹介された、ジャレッド・スプールさんの「デザインとは意図を表現すること」という言葉が、今でも心に残っています。

正直なところ、これまで「デザイン」という言葉に対して、どこか“魔法”のようなもの——
つまり、デザイナーの個人的なセンスや感性に任せられたもの、というイメージを持っていました。

しかし、エリンさんの話を聞き、さらに参加者の多くを占めていた現役デザイナーの皆さんの意見に触れる中で、
「感性があること」はもちろん、それを実現するためのロジックや手法がきちんとあるということに気づかされました。

コンバージョンの語源は「変えること」。
つまり、デザインを通じてユーザーの行動を意図的に変えること。そのために、観察し、考え、試して、学び続ける——。
今回のワークショップを通じて、そんなひたむきな姿勢を持つデザイナーたちの在り方に、深く心を動かされました。

エリンさんが選んだ「変化の起こし方」

最後に、エリンさんが実際にとった行動をご紹介します。

彼女が選んだのは、なんと「家を買う」というアクションでした。

観光地の近くで実際に家を購入し、自らBooking.comに宿泊施設のオーナーとして登録。
さらに、競合であるAirbnbなどのサービスにもホストとして登録し、
それぞれの審査プロセスを比較・分析しました。

オーナー申請から登録完了までのプロセスをすべて記録し、
スクリーンショットを撮りながら、Figmaなどのツールを使ってユーザーストーリーを作成。

その中で、他のサービスではできているのにBooking.comではできていないこと、
ユーザー(=エリンさん自身)が不快に感じた体験などを洗い出し、
改善ポイントとして社内に持ち帰りました。

そしてそれが、ユーザー視点に立った具体的な改善提案となり、
最終的にサービス全体の品質向上へとつながっていったのです。

おわりに

UX DAYS TOKYO 2025の感想…と言いつつ、気づけばほとんどエリンさんの紹介がメインになってしまいました。
それほどまでに、彼女のデザインに対する情熱が強く、私自身も大きな刺激を受けました。

……と、ここまで書いてきて、最後の最後に UX DAYS TOKYO そのものについての紹介をすっかり忘れていたことに気が付きました。失礼いたしました。

UX DAYS TOKYO は、国内外の第一線で活躍するUXデザイナーやリサーチャーが集い、最前線の知見や実践を学べる日本最大級のUXカンファレンスです。講演やワークショップを通して、UXにまつわる多様な考え方や手法に触れることができます。2025年は「持続的に成長する組織へ」をテーマに開催されました。

参加のきっかけは、実は弊社がスポンサー(シルバー)を務めたことです。初日のカンファレンス、2日目のワークショップなど、どれも実り多く、控えめに言っても最高のイベントだと感じました。講演を聴いたり、他の参加者と交流する中で、デザイナーたちの思考の本質に、ほんの一端でも触れることができたように思います。

このような貴重な学びの場を提供してくださった運営の皆さま、そして参加の機会をくださったアットウェアの先輩方に、心より感謝いたします。

本当に、ありがとうございました。

参考

セミナー「Collaboration Canvas Vol.1 開発ベンダー視点で解説!システム開発を成功に導くための鍵」を開催しました!

セミナー「Collaboration Canvas Vol.1 開発ベンダー視点で解説!システム開発を成功に導くための鍵」を開催しました!

【告知】5月29日(木)に「Collaboration Canvas Vol.2 IT知識ゼロから始める!AIで描く、あなたのビジネスアイデア実現ワークショップ」を開催します!詳細は記事末尾をご覧ください。

2025年1月28日、WeWork Ocean Gate みなとみらいにて「Collaboration Canvas Vol.1 開発ベンダー視点で解説!システム開発を成功に導くための鍵」を開催しました。ご多忙の中、ご参加いただいた参加者の皆様に心より感謝申し上げます。

「システム開発を成功に導くためには、発注者様と受注者の良好な協力関係と円滑なコミュニケーションが不可欠である」というテーマのもと、開発ベンダーの視点からプロジェクトを円滑に進めるための心構えやポイントについてお話ししました。

第一部 「コミュニケーションとアジャイル」

セミナーの前半は、弊社のアジャイルコーチの梶平よりシステム開発におけるコミュニケーションの大切さとアジャイルについてご説明しました。

弊社アジャイルコーチ 梶平による説明の様子

撮影場所:WeWork Ocean Gate Minatomirai

システム開発においては、作りたいものが何なのか、どのようなリスクがあるのか、進捗はどれくらいかなどといったことを伝え合う必要があります。しかし、 伝えること、理解すること は非常に難しいことです。

ここでコミュニケーションの難しさを体感いただくために簡単なワークショップを行いました。一名の参加者の方に一枚の絵を見ていただき、その絵に何が描かれているのかを言葉だけで説明していただきます。他の参加者の皆様にはその説明だけを頼りに絵を描いていただきました。

説明者の方による的確なご説明により、多くの方が説明された絵とほとんど同じ絵を描くことができました。しかし、細部を見ると、位置や形、描かれている場所に違いがありました。

このように自分の意図を正確に伝え、相手に完璧に理解してもらうことは、実に難しいことです。私たちは普段のコミュニケーションにおいても、相手によく理解してもらえるように丁寧に説明したり、逆に相手の説明を真剣に聞いて理解しようと努めていたりするにも関わらず、どこかで認識のずれが生じることがよくあります。

システム開発の現場においても同じことが言えます。そして残念なことに、このようなコミュニケーションの行き違いが原因で、プロジェクトが失敗に終わってしまうことがあります。プロジェクト失敗の主な原因の約半分は、発注側の要件定義の不明確さと受注側の要件理解不足にあると日経クロステックの調査は指摘しています。

この問題を回避するためには、関係者間での緊密かつ継続的なコミュニケーションが不可欠です

米ハーバード大学で故野中郁次郎氏と竹内弘高氏により発表された論文『The New New Product Development Game』は、成功している製品開発の共通点を論じています。その中で提示されているリレー方式とラグビー方式という2つの開発方式をコミュニケーションの点で比較してみましょう。

「The New New Product Development Game」 図1を元に作図

1つ目のリレー方式は、製品開発を企画、実現可能性、試作、開発、試験、生産のようにいくつもの工程に分けて、各工程の専門家や専門チームが作業を行い、終われば次の工程に進みます。リレー走のようにバトンを受け継いで開発を進めていくことからこの名前で呼ばれます。専門家の作業範囲が明確な分業によって、一歩一歩地面を踏み固めるように確実に進めていけるというメリットがある一方で、手戻りが発生した場合は前の工程にバトンを戻すことになってしまいます。工程間でのコミュニケーションは限定的で、工程を一通り終えてから行うことになります。この方式ではコミュニケーションの範囲が狭く、工程内では深い議論を行えるでしょうが、全体的な視点に立った深い議論が難しくなります。

2つ目のラグビー方式は、各工程を厳密に分けるのとは対照的に、前段が完了していなくても次の工程に着手していきます。この方式には、部分的にでも次の工程を進めることで、前の工程にフィードバックを提供できるというメリットがあります。ラグビーでボールをパスしあうように、工程の間を行ったり来たりを繰り返すイメージから名付けられています。このためには、各工程の専門家が1つのチームとなって、緊密なコミュニケーションを取って進めていく必要があります。フィードバックを反映する際や手戻りなどの課題が発生した際には、専門家が知識を持ち寄って対処します。また、最終的に製品を利用する消費者、原料や部品を提供する供給者の意見も参考にします。緊密なコミュニケーションを必要としているため、チーム内での意見の対立のような緊張も起きやすいという特徴があります。この方式ではコミュニケーションの範囲が広く、様々な意見を元に判断を行えます。チームメンバーは自分の専門を超えて、全体的な視点に立った本質的な課題について深く議論できます。

成功している製品開発の現場では、ラグビー方式が採用されているといいます。緊密なコミュニケーションによって、チーム全員が製品を深く理解したうえで課題に立ち向かうことができます。

システム開発の成功には、発注者と受注者の双方がシステムについて深く理解することが欠かせません。ラグビー方式のコミュニケーションの考え方は、要件定義の不明瞭さや受注側の仕様の理解不足という課題に立ち向かう一つの手段となります。

ラグビー方式の考え方を取り入れ、アジャイルにソフトウェアを開発し、価値を生み出すためのフレームワークに弊社でも採用している 「スクラム」 があります。

(詳細については、公式の解説書『スクラムガイド』が参考になるかと思います)

スクラムは透明性、検査、適応という三本柱を前提としています。

  • 透明性:プロセスや作業を、その作業を行う人とその作業を受け取る人に見えるようにします。
  • 検査:作成物と合意されたゴールに向けた進捗状況を、頻繁かつ熱⼼に検査するようにします。
  • 適応:プロセスのいずれかの側⾯が許容範囲を逸脱していたり、成果となるプロダクトが受け⼊れられなかったりしたときには、適⽤しているプロセスや製造している構成要素を調整するようにします。

これらの前提に基づき、スクラムでは開発工程を「スプリント」という短い期間に区切り、様々なイベントや作成物が定義されています。例えば、スプリントで実施する作業の計画をチーム全体の協働作業によって作成する「スプリントプランニング」、スプリントで行う作業がリアルタイムに反映される「スプリントバックログ」、品質と効果を高める方法を計画する「スプリントレトロスペクティブ」、スプリントの成果を検査し、今後の適応を決定する「スプリントレビュー」などがあります。

これらのイベントはいずれもチームのコミュニケーションを促進してくれます。コミュニケーションには困難が伴う事が多々ありますが、スクラムにはそれを支援する実践的な方法が組み込まれています。

第一部では、弊社アジャイルコーチの梶平よりシステム開発におけるコミュニケーションの難しさと重要性を説明いたしました。システム開発の成功のためには緊密なコミュニケーションが不可欠であり、スクラムはそのための有効なフレームワークとなります。

第二部 「トークセッション」

セミナーの後半では、参加者の皆様を交えて、年齢や関わったプロジェクトの異なる複数の弊社社員とのトークセッションを行いました。

撮影場所:WeWork Ocean Gate Minatomirai

開発を担う若手のエンジニア、プロジェクトを成功に導くプロジェクトマネージャー、そしてお客様との窓口となる営業担当といった様々な立場の社員が登壇し、それぞれの視点の意見をご紹介しました。

当日のセッションからいくつかの対談をご紹介いたします。

システム開発会社が大切にしていること

  • ベテランPM 若杉お客様とのコミュニケーションはとても大切にしています。ここがうまくいくかどうかが、プロジェクトの成否の大きな分かれ道となります。また、システムは作って終わりというわけではなく、継続的な改善が必要となります。そうした改善へのサポートも大事だと思っています。
  • PM/営業 石上 : PMBOK『プロジェクトマネジメントの12の原理・原則』 に大切なことがよくまとまっています。特にリスクに備えておくことが大切です。リスクとは、遅延やコスト増大といった悪影響を招く不確実性のことを指しています。影響の大きなものについて早めに対処していくことが重要です。発注側と一緒にリスクに向き合えるような関係を作っていきたいと思っています。
  • 若手エンジニア 岡本技術選定が大切だと思っています。機能を実現できるのかという点は当然ですが、コストがどの程度かかるのか、将来的な継続性があるのかという点も考慮しています。また、ソフトウェアの規模が拡大するにしたがって、当初の設計とうまく噛み合わない部分が出てきたり、納品を重視してプログラムのメンテナンス性が損なわれたりすることがあります。そうした技術的負債があると、新機能の追加に時間がかかってしまったり、バグにつながったりすることがあり、定期的に解消していくことが大事だと考えています。

システム開発で必要なものとは

  • ベテランPM 若杉 : 典型的には要件定義・分析、設計、テスト、環境構築、プロジェクト管理、保守・運用といった工程で進めていきます。
  • PM/営業 石上 : ここに載っていないものでいうと、例えばユーザに利用してもらうためにはまずシステムにたどり着いてもらう必要があり、その方法を考えることも開発の上では必要となるでしょう。また、システムの完成後も保守・運用が必要となりますが、誰が担当するのか、他の人が担当するのであればどうやって引き継いで行くのかということも考えなければなりません。要件定義では業務の流れを考えるのですが、業務がスムーズに流れる場合だけでなく、どこかで異常がある場合についても考慮が必要です。
  • 質問 : 何をどれくらい揃えたらシステムを作ってもらえるのでしょうか?どうした会話をしていけばシステムを作れるのでしょうか?
    • 若手エンジニア 岡本 : どういうものが作りたいか、どれくらいの期間で作りたいか、どれくらいのお金が用意できるのかというところが分かっていれば、相談いただければと思っています。
    • ベテランPM 若杉 : コミュニケーションの話にもつながってきますが、はじめにお客様が本当に実現したいことは何なのかをよく話し合うことにしています。よく話し合うことが、良い開発、良い製品につながると思っています。
    • 来場者の方 : 何を使ってくださいと伝えるよりも、何をしたいんだということを伝えることが大事なのだと理解しました。
    • ベテランPM 若杉 : お客様から聞き出すことも私達の仕事だと考えています。こうしてほしいという要望があれば伝えていただければと思います。もしもより良いものがあればご提案できればと思っています。

最後に

今回のセミナーが皆様の今後のシステム開発プロジェクトを成功に導くための一助となれば幸いです。

株式会社アットウェアは 「システムで人々をしあわせにする」 を掲げ、AWSとJavaとアジャイルを組み合わせたシステム開発を行っております。システムをどう作っていくのかというご相談、システム開発、システムの維持・改善まで、包括的にご支援させていただきます。弊社はお客様がシステムに求める本当のニーズを理解し、お客様と心を一つにして共にシステムを育てていく「恊働型SI」を目指しております。

本セミナーの「Collaboration Canvas」というタイトルは「恊働」の精神のもと、来場者の皆様とコラボレーションした未来を描いていきたいという思いから名付けました。今後もビジネスを皆様と共に描いていけるようなセミナーの開催を企画してまいります。

システム開発に関するご相談や、今回のセミナー内容についてさらに詳しくお知りになりたい点がございましたら、どうぞお気軽にお問い合わせフォームよりご連絡ください。

【次回開催のお知らせ】

第二回となる、 Collaboration Canvas Vol.2 を開催いたします。

テーマは「IT知識ゼロから始める!AIで描く、あなたのビジネスアイデア実現ワークショップ」です。

「やりたいことはたくさんあるけれど、ITのことはよくわからない……」
「システムを作りたいけれど、どう伝えたらいいのかわからない……」

そんな悩みを持つ方々のためのワークショップを開催します!IT初心者の方でも、AIの力を借りてビジネスアイデアを具体化させていくことができます。

日時:2025年5月29日(木)18:30 〜 20:00
場所: Ocean Gate みなとみらい 8階 WeWork(地図
参加費:無料

ワークショップ終了後には、懇親会を予定しております。ワークショップの内容に関する疑問点や、システム開発に関するご質問など、普段なかなか聞くことのできないような話題についても、この機会にぜひお気軽にご質問ください。

参加申込みはこちらから!

初海外×Startup Weekend:エンジニア横山が語るダナン挑戦記

初海外×Startup Weekend:エンジニア横山が語るダナン挑戦記

※この記事は、先日(25/3/21 - 3/23)ベトナム・ダナンで開催されたStartup Weekendに参加した後輩エンジニアへのインタビューをもとに構成しています。

今回が初めての海外渡航であり、Startup Weekendへの参加も初めての経験でした。

—— まずは、Startup Weekendダナンへの参加を決めた理由を教えてください。

横山:アットウェア20周年パーティーの時に特定非営利活動法人StartupWeekendの理事である中本さんに出会ったのがきっかけです。過去にアットウェアからの参加者がいたこともあって興味を持ちました。それに「海外に行って何かしてみたい」という気持ちがあって。周りの話を聞いていると、Startup Weekendってけっこうハードなチャレンジみたいで、そういう経験もしてみたいと思ったんです。

—— 初めての海外渡航でのイベント参加は緊張しませんでしたか?

横山:かなり緊張しました。初めての海外だからわからないことが多くて不安でした。実はイベント自体もあんまり調べずに行ったので、どんな結末になるのか、自分が活躍できるのかなど、色々と不安でした。

—— 実際にベトナムに着いた時の第一印象はどうでしたか?

横山:まず「外国人多いな」と思いました(笑)。あとは人の態度がなんか色々強い、パワフルだなという印象です。誘導する時もアグレッシブなジェスチャーで誘導してきたり、声が大きかったり。タクシーの運転手さんもめっちゃ話しかけてくるんですよ。それから、イベント前にFacebookのグループに入って、参加者の自己紹介投稿を見たんですが、みなさんの経歴がすごくて驚きました。

—— Startup Weekendの雰囲気はどうでしたか?

横山:とにかく活気がありました。みんな勝手に喋る感じで。ただ、よく見ると他の人も最初は緊張している雰囲気がしました。参加者の経歴を聞くと、すでに会社経営している人もいて、すごいなと感じましたね。

イベントの最初にハーフベイクドという、無作為に選ばれたキーワードでアイデアを考えるセッションがあって、私たちは「洞窟」と「タピオカ」というキーワードで話し合いました。最初は「バインミー」というキーワードだったんですが、もっと突飛なものにしたくて取り直したんです。15分という時間がすごく短く感じました。でも意外と自分も意見を言えて、それが採用されたりして、参加できている感覚がありました。みんな初対面だったので全然まとまらなかったですけど(笑)。

—— アイデアピッチにも挑戦したそうですね?

横山:はい。ピッチした方がよいと言われていて、せっかくだからとアイデアがなかったけど手を上げることにしました。半分以上の人がピッチに立候補していたから、するかどうか迷ってたんですが、チャレンジしようという気持ちになりました。ピッチ自体はやってよかったです。上手くはできなかったけど、自分なりに頑張れたし、ちょっとウケたのが嬉しかったですね。

—— どんなアイデアをピッチしたんですか?

横山:英語で話したい日本人と日本文化に興味がある外国人をマッチさせる通話アプリを提案しました。

—— チーム選びの時はどうやって選びましたか?

横山:正直、ピッチだけでそれぞれのアイデアを理解するのは難しかったです。だから、アイデア自体より「自分が活躍できるチーム」を探しました。最終的に「ベトナム進出を考える日本の物販業者のテストマーケティングを支援し、ベトナムで日本食を展開するライブコマースのサービス」というアイデアのチームに入りました。

興味深かったのは、自発的に興味がある人に話しかけに行く形式だったこと。自ら動かないとチームにすら入れないんです。「やっぱりそうだよね」と少しびっくりしました。

—— チームではどんな役割を担当したんですか?

横山:エンジニアの役割をしました。アプリがあるサービスだったので、画面モックを作ったり、デモ画面を作ったり、システム的なことで意見を言ったりしました。

—— 最終的な結果はどうでしたか?

横山:チーム自体は2位に選ばれました!最終ピッチではリーダーと私でプレゼンをしました。私は画面の説明を担当しましたが、プレゼン自体は少し時間が押してしまったものの、概ねよかったと思います。「実際に困っている業者がいる」という課題設定が評価されたようです。

—— Startup Weekendを通じて学んだことは何ですか?

横山:いくつかありますが、まず「強みを発揮することの大切さ」です。指示を待っていたら、本当にいらない人間としてチームにいられなくなることを感じました。「君は何ができる?」と聞いてくれる人はいないんです。何もしなかったら勝手に進んで、何も貢献できなくなってしまう。だから無理やり発言したり、自分が役に立ちそうな場では率先して手を挙げました。そのおかげでチームの人と関係を築けたと思います。

次に「エンジニアとして素早くプロトタイプを作ることの重要さ」です。普段の開発と違って、半日で人に見せるものを作らないといけない手法が自分にはなかったんです。その場でツールを調べて、AI生成や画面モックツールを見つけてなんとか作ることができました。もっと普段から、スピーディーにプロトタイプを作る方法を確立していたら、モックの質も上げられたと思います。ビジネスチャンスがあっても、プロトタイプがなければ逃してしまうという感覚を実感できました。作ることが目的ではなく、いかに重要な部分をアピールするかが大事だと感じました。

また「チームメンバーの自発性」にも驚きました。黙っている人はいないんです。リーダーから「一番大人しい」と言われていた人でも、自分から見れば自ら行動していました。発表の後に自然に反省会が始まる様子も熱意を感じました。

一方で「チームビルディングの難しさ」も痛感しました。1+1が2以上にならない感覚を味わったんです。目の前の作業を片付けることに集中してしまって、最初にちゃんとチームビルディングをしなかったことを反省しています。アジャイル開発で解決しようとしている課題と似ている部分があるのかなと思いました。最終日のチームの目指すところを先に共有せずに進んでしまい、最終的なゴールがわからないまま作業したのは反省点です。

実際の起業家やコーチからもらったフィードバックも貴重でした。「仮説をしっかり立てること」「手段を決めて、すぐに検証することの大切さ」という指摘。机上の議論を重ねても意味はなく、実際にアイデアを試し、検証を繰り返すことが何より大切。「血と汗が滲むほど検証を重ねる」という言葉が印象に残っています。

—— この経験は今後のキャリアにどう影響すると思いますか?

横山:今まで頭でわかっていたことが、体で感じられたのが大きいです。具体的には「やった方がいいかな」「言った方がいいかな」と思ったらとにかく行動するということ。このパラダイムシフトを感じました。すぐには完璧にはできないと思いますが、どんどんできるようにしていきたいです。

あと、3日間でたくさん初めて会う人とコミュニケーションをとりましたが、やっぱり苦手だなと実感したので、そこは今後の課題です。

—— 同じように初めてのStartup Weekendへの参加を考えている人へのアドバイスをお願いします。

横山:一緒に来てくれる人(矢納さん、トミーさん)のサポートがあったから安心して参加できた面はあります。そういう仲間がいると心強いですね。あとは、ぶっちゃけきついですけど、劇的な経験になるので挑戦する価値は絶対にあります!

—— ありがとうございました。これからの活躍を楽しみにしています!

横山:こちらこそ、ありがとうございました!

---

Startup Weekendとは?

Startup Weekendは54時間で行われる起業体験イベント。金曜の夜に始まり、日曜の夜に終わるまでの間に、参加者はチームを組み、アイデアを形にし、実際に動くプロトタイプやビジネスモデルを作り上げます。世界各国で開催されており、起業家精神を育む場として知られています。

関連記事

StartupWeekendダナンに参加して:航空業界の課題に挑む54時間 | トミー

 一緒に参加したトミーさんによるレポートです。他のチームの取り組んだ内容や別の視点からの経験を知りたい方はぜひこちらもご覧ください。

株式会社アットウェア創設20周年を迎え

株式会社アットウェア創設20周年を迎え

2024年12月24日、株式会社アットウェアは創設から丸20年を迎えました。 これもひとえに、非常に多くのお客様、パートナー様のご支援と、社員とその家族の努力の賜物と思っています。 皆様にあらためて御礼申し上げます。誠にありがとうございます。

20年を迎えるにあたって、創設からのことをふりかえってみました。 まぁ我ながらいろんなことをやってきたなぁと、そしてこれは決して私一人でなしえたものではもちろんなく、多くの仲間たち、社員、特に創業者であり共に取締役を務める重田、松舘、北野の功績であります。仲間たちとともに歩んできた道は、決して平坦ではなく、むしろうまくいかないことばかりの険しい道でした。ですが、今思えばそのすべてが本当に楽しい日々でした。重田、松舘、北野、そして多くの社員のみなと20年ともに過ごせたことに深く感謝しています。

20年というと、人間だと生まれた子どもが成人を迎え、社会的にも自立する年でもあります。生みの親である私たち創業者が何よりも大切な我が子、アットウェアとどう関わっていくのがよいかをずっと考えていました。

アットウェアは創設間もないころから「システムで人々をしあわせにする」をミッションとして掲げておりますが、祖業であり、本業でもあるSI、受託ソフトウェア開発において、「システム」とはすなわち「コンピュターシステム」であり「ソフトウェア」であります。わたしたちが開発したシステム、ソフトウェアを使ってくださる多くの人々がしあわせになっていただけることを夢見てミッションとして掲げました。一方、「システム」という単語には「相互に影響を及ぼしあう要素から構成される、まとまりや仕組み」という意味があり、いつのころからかコンピューターシステムに留まらず、「仕組み」によってより多くの人をしあわせにすることを目指してまいりました。 本業のSIは、私たち取締役が先頭に立って引っ張る体制から、自律した組織体制、経営体制への移行を進めてまいりました。現在は、社内カンパニー制をしき、株式会社アットウェアの下にSIカンパニーとして事業推進、経営を進めています。私たち取締役はSIカンパニーには属せず、すなわちカンパニーの経営、事業には直接的には関わらず、サポートとコーチ役に徹しています。SIカンパニーの若いリーダーたち、執行役員が中心となって、ただしわたしたち取締役に替わって執行役員だけで経営をするのではなく社員誰もが経営、事業に関心をもち、積極的に関わっていく運営を行ってくれています。苦労も多く、決してすべてが順調とはいきませんが、様々な経験と学びを重ねながら取り組んでいる姿を頼もしく思っています。

一方で、そのSIカンパニーと並んで、いくつか異なる事業の展開を進めてきました。現在は事業子会社として、株式会社未来シェア株式会社函館ラボラトリ株式会社zabutonatWare Vietnam Co. Ltd.を設立、またシリウスビジョン株式会社様と共に株式会社UniARTSを設立、恊働させていただいています。 あらためて言うまでもなく、現代においていかなるビジネスも、そのプラットフォームとなる IT なくしては成長も成功もなしえません。そのIT、システムを開発するチームをSIカンパニーとして有するということは、株式会社アットウェアとそのグループにとっての大きな強みであると考えています。手前味噌で恐縮ではありますが、アットウェアの社員たちは本当に優秀で、すばらしいシステムを生み出せるエンジニア、チームだと自負しています。 ただ、いいかえれば、いかにシステム開発能力が高くとも、それがビジネスと繋がり、社会に価値を届けられなければただの独りよがりでしかありません。だからこそ、これまでも様々な方々と繋がり、協働し、それがいくつかの事業会社、関連会社となり、新たな社会価値の創造へとつなげてまいりました。

先日の弊社20周年記念イベントでは、基調講演として三名の方にご登壇いただき、これまでの私たちの取り組みの一端と、それぞれのご専門分野での先進的なお話しを伺う機会を頂戴しました。私たちも引き続き、そんな先進的な未来に、より一層の社会的価値を生み出していくパートナーとなれるよう努力してまいりたいと思います。

また一方で、私たち取締役と社員は、いまココ、現在の株式会社アットウェアとそのグループにとどまらず、様々な方とのコラボレーションを強め、これからも新たなビジネスの創出に積極的にチャレンジしていきたいと考えています。 これまで大変お世話になってまいりましたお客様や関係者の皆様はもちろんのこと、これからの未来ご縁あって、あるいはたまたま偶然居合わせた人たち、企業様とご一緒できること、チャレンジできることを楽しみにしています。

私個人としては、コロナ禍にベトナム人の仲間たちと設立したatWare Vietnam Co., Ltd.の事業にここ数年は深く関わってまいりました。当初は日本で優秀な人材を採用しチームを作ることがますます難しくなっている状況を鑑み、ベトナムで理想のチームを作ることを目標に日本のお客様に開発体制を提供してまいりました。現在は、アットウェアとグループ全体の事業の拡大、ミッションである「システムで人々をしあわせにする」に基づいて、世界中のより多くの人々をしあわせにできるよう、日本に留まらない事業の展開を図っています。まだまだ人数的には小さな組織ですが、理想に近い開発チームに育ちつつあり、また日本以外のお客様との恊働も少しずつ広がりつつあります。 日本の株式会社アットウェアともども、世界一の開発チームと言われるような組織を目指していきたいと思っています。

20年を経ましてもまだまだ小さな組織、チームであります。SIの事業におきましては、これまでのお客様とのより一層の関係を強化してまいり、お客様のビジネスの成功に貢献できるよう、ご期待に応えてまいりたいと存じます。 引き続き、皆様からのご指導、ご鞭撻を賜りますよう、心からお願い申し上げます。

4回連続でスポンサーとして支援したVimConf 2024を終えて

4回連続でスポンサーとして支援したVimConf 2024を終えて

コロナ禍でしばらく開催されていませんでしたが、2023年の縮小版開催を経てVimConf 2024が先月に開催されました。 2019年にBramさんが基調講演をした時のレポート記事で想いを綴りましたが、このたび2017年から継続して4回連続(昨年の縮小版では公式でのスポンサー募集はなかった)でスポンサー活動を行うことができましたので、カンファレンスを終えた感想をお伝えしたいと思います。

当時、私はこの様に述べました。

誤解を恐れず大げさに言うと、「一企業がこうやって貢献できたということに、無限の可能性が秘められているんだ」ということを伝えたいです。 実際に活動してみると、テーマとビジョンを持って「最高のものにしたい」と心の底から思い、本気で取り組んでいるVimConfコアスタッフの皆さんの考え・意思決定・アクションは凄くて、そこから刺激を受けながら、自分もスタッフの一員としていい経験ができました。

こういったスポンサーや個人活動は、弊社くらいの小規模の会社で働いている人にとってもすごくお勧めできるアクションだと言える実感を持ちました。なぜなら、一個人や企業ができることは多くはないかもしれないけど、一人が何かを成し遂げたいと思う原動力(私の場合は「今と未来を繋げるこのカンファレンス」に最大の貢献をしたいという気持ち)は凄まじいと感じたからです。そうした皆の気持ちを、スポンサーとして応援することができれば、世の中にとって掛け替えのないことが実現できると信じています。社内でもこういう事例があと数個でたら、すごいこと(いい意味で)になりそうだと想像してしまうほどでした。

一企業としては、カンファレンスのスポンサーになることはお金の捻出ができるかという事はさることながら、企業として意義を見出して活動に繋げていくことが大事だなと考えています。

「三代続けば末代続く」ということわざではありませんが、1回だけがんばって活動しても、社内の理解がなければ続けていくことは難しくなるし、2回試して「なんか違うなぁ」と思えば、継続することに意義を見出せなくなるかもしれません。 それを4回続けることができたのは、企業のレガシー(legacy)という言い回しで表現される「伝承」や「伝統」というのは大げさかもしれませんが、草の根としてしっかり張ることができたのかなと思います。

特に、Bramさんが亡くなったことを受けて、今年はChristianさんが「The new Vim project - What has changed after Bram」というタイトルで引き継ぎと変化をテーマにして、持続継続性についても触れた基調講演でしたので、コードのメンテナンスや機能の追加以外の幅広いことに視点を向けることができて、聞いていてとても刺激を受けました。

Bramさんが30年以上かけて培ってきたレガシーを引き継ぐための基調講演で、彼が人生をかけて行ってきたウガンダへの支援のことも含めて引き継いでこれからも続けていくことを表明しており、Vimらしさ(ポリシー)がわかりました。

どのLinuxディストリビューションにも入っていることが当たり前になっているVimが、人の手によって支えられていることを改めて実感でき、これからもVimを使っていけるんだという未来の姿を想像できました。

そして、もう一つの基調講演である TJ DeVriesさんの「(Neo)Vim Made Me a Better Software Developer」という基調講演も素晴らしく、'Personalized Development Environment' という表現でNeovimを通し如何にして自分が成長できたのかという、どんなエンジニアにも響くような発表でした。一緒に参加していた弊社メンバーも心に響いたという話をしており、午後の部ではいろんな方の発表を聞き、懇親会で社外の方との会話も経て、翌週からはさっそく新たにNeovim環境へ変更し、自分らしい環境を模索している様子が見られました。

観たい聞きたいと駆けつける参加者がいて、遠方から招待に応じて来日し発表してくださる方、いろんな層や境遇の中で経験したことをCFPに書き上げて申し込み発表してくださる方、そしてこういう場を開催してくださるVimConf準備会のスタッフの方々あっての開催です。ありがとうございました。

弊社を含めた企業以外にも、参加した方々の体験からスポンサー企業が増えて、「来年も参加したい!」という声が実現できるような、持続可能なカンファレンスになってもらえるといいなと思っています。

小さな企業の貢献であっても、主催で尽力してくださっているスタッフには一つひとつが大きな支えになっていて、「これで招待発表者の旅費にあてることができます」とお金の活用についてのリアルな声と感謝の言葉を頂きました。会場にいた中から、まだ見ぬ新しい発表者がでてくるなど、コミュニティと共に未来を作っていけるといいですね!

今年配布したノベルティ

「とばっとうぇあ」という鮭とばを以前に配布させていただきましたが、今年は「ビルド中にほっと一息」できるような紅茶を配布しました。 同封のQRコードにアクセスしてお茶のお供に読み物もぜひお楽しみください。

アジャイルコーチングサービスのご紹介

アジャイルコーチングサービスのご紹介

こんにちは。株式会社アットウェアで、アジャイルコーチやスクラムマスターとして活動している梶平です。

この記事では、弊社が提供している「アジャイルコーチに関係する2つのサービス」について詳しくご紹介させていただきます。

まず最初に「アジャイルコーチング」というサービスです。

このサービスの目的は「アジャイルとコーチングの力をかりて、強いチーム/強い組織に成長していきたい」というニーズに対応することです。ユースケースとしては下記のようなイメージです。

  • 新たにアジャイルチームを立ち上げたいが、社内に経験者がいないので支援して欲しい
  • 既存のアジャイルチームでもっと効果的に活動できるように支援して欲しい
  • 組織の改善にアジャイルの力を借りたいので支援して欲しい

次にご紹介させていただくのは「アジャイルトレーニング」というサービスです。

このサービスの目的は「アジャイルやスクラム、カンバンを実践に繋げるために基礎を学びたい」というニーズに対応することです。ユースケースとしては下記のようなイメージです。

  • アジャイルの基礎的な内容について学びたい
  • これからスクラム/カンバンを導入してプロダクト開発を行いたい
  • トレーニングを受けずにスクラム/カンバンを採用しているチームに参画しているが、スクラム/カンバンについてもっと学習したい

上記サービスを提供させていただいている中で、お客様からは下記のようなとても嬉しいメッセージもいただいております。

  • アジャイルコーチング
    • アジャイルコーチが体現しているアジャイルのマインドセットが、我々のチームメンバーに浸透していっているのを感じている(会社経営者)
    • スクラムマスターがファシリテートしてくれたふりかえりの場が凄いと思いました。我々のチームメンバーが本音でディスカッションし自分たちで自分たちのチームを更に効果的にするためのアイデアを出しそれを実行していることがとても嬉しく感じました(プロダクトオーナー)
    • 初めて担うスクラムマスターという役割に不安も多々あったが、アジャイルコーチの支援によりスクラムチームへのアプローチの仕方、コミュニケーションの取り方、何を気にしなければならないかなどの考え方について自信が持てるようになってきた(スクラムマスター)
  • アジャイルトレーニング
    • 座学に加え、スクラムを体験できるワークショップをつうじてスクラムを採用して活動していくことへの意義や自信を感じることができた
    • 事前にカンバンについてインターネットで調べてみたがそれだけでは実務で活用できるイメージが沸かなかった。このトレーニングを受講することでイメージが湧いてきた
    • 同僚とはそれなりに会話しているつもりだったが、あそこまで白熱した深いレベルでのディスカッションができたのは後にも先にもあの場だけだった

これらのメッセージをいただいた際に、私がいつも最初に感じるのは「アジャイルの力は本当に凄いな」と改めて強く実感する気持ちと、アジャイルの力を理解することに尽力できたのだなという喜びです。

次に、このような仕事をしていける環境についての大きな感謝の気持ちが湧いてきます。自社に対してもそうですし、我々にご相談いただいたお客さまに対しても本当にありがたいなと思います。

そして、我々にお声がけいただいたお客さまの将来を、もっと素敵な状態に近づけていくために、私自身ももっともっと成長しなければと身が引き締まり、「よしこれからも、やっていける、やっていくのだ!」という勇気も湧いてきます。

関係者のみなさまに、この場をお借りして、改めて感謝いたします、本当にありがとうございます。

さて、最後になりますが、まず手始めにアジャイルについてのライトな感じの勉強会を開催したい、試しにアジャイルコーチと会話してみたいというご要望にも柔軟に対応させていただいております。

少しでも上記の中で思い当たる内容があれば、お気軽にお問い合わせいただければと思います。

今後、事例紹介なども掲載していきたいなと思っております。最後まで読んでいただいて、どうもありがとうございました。

JJUG CCC 2024 Fall で LT をしました

JJUG CCC 2024 Fall で LT をしました

10月27日に新宿で開催された JJUG CCC 2024 Fall にて、Lightning Talk をしてきました。

弊社の先輩から、 「昨晩からJJUG CCC の懇親会で LT 募集開始しているんだけど、やってみない?」 と声をかけられたのが10月16日。

10月27日まで、あと一週間ちょっとしかない! しかも 「LT した経験もぜひ Blog に書いてほしい」だって?! いつもありがとうございます。

せっかくのチャンスなので勢いで応募しました。 ゆるい LT の場で発表しただけなのですが、自分にとっては新鮮な経験で、 会場には200人くらい(?)いたので緊張しました。

という経験を踏まえ、感じたことなどを書きます。

「Multi-Project Build の魅力」というタイトルで発表を行いました。 LT した内容は以下のとおりです。

練習は大事(当たり前)

経験上、ちょっとした発表なら資料を作りながらイメージするだけで特段練習したりしていませんでした。 弊社の先輩から進められたこともありますが、ほぼ初めてきちんとした公の場で話しますし、発表時間も3分しかなかったので発表練習をたくさん行いました。

終わってみて、「いやぁー練習は大事。」と思いました。

まず練習しないとわからない改善点が多くありました。 実際、「3分ならこれくらいかな」と適当につくった資料で試してみたら8分弱かかるオーバーぶりでした。(それは練習しなくてもわかるやろ) 練習を繰り返すことで表現に改善の余地が見つかり、資料の改善・スクリプトの改善・試行を繰り返しました。

また、緊張などで自分のコンディションは一定ではないし、本番では想定外なことが起きると思います。 練習はそういったときにパフォーマンスを安定させてくれるものだと今回強く感じました。 発表中、頭の中は少しモヤがかかった様に回転が悪い感覚を覚えましたが、練習していたことで頭より先に口が動いてくれました。

Output は学習効果バツグン

こちらも頻繁に言われていることなので当然ですが、やはり Output を経て知識がより自分のものになりました。 今回の LT の前に内容のプログラムを色々試しましたし、正確な表現を Document で調べました。 結果、知識の足りない部分が補完され頭の中に前より定着しました。

自分の学習のためにも、学んだことを仲間に共有する機会を今まで以上につくるのが良さそうです。

実際に経験するということ

実際に経験することって貴重だよねというお話です。

「頭では分かっている」と「身にしみて知っている」の間では厚い壁があり、そこのブレイクスルーのために必要なのが "強い感情を伴う実際の経験" なんだと思いました。 ここに書いているようなことも当たり前だと理解していましたが、以前よりも意識的に感じられるようになっています。 その理解を活かす時も、今までより強いモチベーションで取り組むことができそうです。

今回の経験で、今後勉強会に参加してなにか発表するというハードルが何段階も下がるし、 より難しいことに挑戦できるでしょう。(しらんけど)

シンプルに JJUG CCC の内容が面白かった話

LT と直接関係ありませんが、シンプルに JJUG のメインセッションがすごく面白かったです。 自分の知識体系が広がり、知識人の発表の中でしか得られない養分を得ることができます。 以前より分かることが増えたことでより面白く感じました。

これからも積極的に外部の勉強会に参加しよう! そして頭の中がぐわっと広がるような勉強会を社内でも行いたいです。

話術は大事

学んだとは書きましたが、やはり難しかったです。 自身ではクオリティは低く、手放しで褒められる成果ではなかったと感じています。

対して JJUG のメインセッションで聞いた話は面白くて学びがありました。 そういうことができるエンジニアは "すごい"。

魅力的に伝わり、人に影響を与えられるような話はどんな場面でも有効だと思います。 対外な発表はもちろん、チームのマネジメントしかり、ちょっとした同僚との会話まで。 これは理路整然と説明することとは別ベクトルであり、しかし同程度以上のウェイトで重要、 メガライアー級の威力を持っている能力だと感じました。

面白く (interesting)、そして面白い (funny) 。 そんな技術者にワタシハナリタイ。

稼働中のサービスのデータベースをRDS for MySQL 5.7からAurora MySQL 3に移行した話

背景

開始から9年間稼働中のサービスで利用しているRDS for MySQL 5.7の標準サポートが2024年2月末に終了となるため、RDS for MySQL 8.0へアップグレードすることになりました。
また、RDSと比較するとインスタンスの耐障害性が高く、インスタンスの選択や構成を工夫することでコスト面でメリットがある(約100万円/年のコストが削減できる)ことから、併せてAurora MySQL 3(MySQL 8.0 互換)へ移行することになりました。

Aurora MySQL 3(MySQL 8.0 互換)への移行方法の検討

これらのドキュメントなどを参考に移行方法を検討し、DB クラスターのスナップショットからの復元の方法を採用することにしました。

「RDS for MySQL 8.0へアップグレード」→「RDS for MySQL 8.0からAurora MySQL 3へ移行」の2つの対応をおこないます。

移行スケジュール

契約更新の関係上、Aurora MySQL 3への移行は2024年1月に実施することが決まっていました。
「RDS for MySQL 8.0へアップグレード」と「Aurora MySQL 3への移行」を同時に行うか検討しましたが、実施中に問題が発生した場合の対応(調査や切り戻しなど)が複雑になる可能性を考慮して別々に行うことにしました。
別々に実施することでサービス停止が2回必要になってしまいますが、より確実・安全に実施することを優先しました。

MySQL 8.0へのアップグレードにおける変更点の確認

こちらのドキュメントにSQLの変更がまとめられています。

ローカル環境でMySQL 8.0における変更点を確認し、必要な対応をおこないました。 また、各アプリケーションの動作も確認しました。

予約後の追加(MySQL 8.0 の新しいキーワードおよび予約語

「lead」という単語が予約語に追加されていました。既存のテーブルのカラム名に「lead」を使用していたため、カラム名を変更する対応をおこないました。

暗黙的ソートの変更(ORDER BYの最適化

GROUP BY句、DISTINCT句の暗黙的ソートが廃止になり、ORDER BY句を使う必要が生じました。
こちらについては元々ORDER BY句を使うようにしていたので影響はありませんでした。
お客様の別のサービスでは、この影響による修正にかなり手間取ったそうです。

検証環境でRDS for MySQL 8.0へアップグレード

次は検証環境でアップグレードをおこない、各アプリケーションの動作を確認します。

手順は以下の通りです。
本番環境で計画通りに実施できるようにするため、検証環境での確認は非常に重要だと考えています。

  1. 各アプリケーションの停止
  2. RDS for MySQL 5.7のスナップショットの取得
  3. RDS for MySQL 8.0用のパラメータグループの作成および内容の変更
  4. RDS for MySQL 8.0へアップグレード
  5. 各アプリケーションの起動

RDS for MySQL 8.0へのアップグレードはスムーズにおこなうことができました。

本番環境でRDS for MySQL 8.0へアップグレード

ローカル環境、検証環境で確認ができたので、本番環境でRDS for MySQL 8.0へアップグレードを行います。
予定したメンテナンスの時間内にサービスへの影響もなく、無事にアップグレードを完了させることができました。

検証環境でAurora MySQL 3へ移行

次は検証環境でAurora MySQL 3へ移行します。

手順は以下の通りです。
こちらも本番環境で計画通りに実施できるように意識しながら実施します。

  1. 各アプリケーションの停止
  2. RDS for MySQL 8.0のスナップショットの取得
  3. Aurora MySQL 3のリードレプリカを作成
  4. Aurora MySQL 3のリードレプリカの昇格
  5. Route 53 のDB接続用レコードのエンドポイントをRDS for MySQL 8.0からAurora MySQL 3に変更
  6. 各アプリケーションの起動

この手順でAurora MySQL 3への移行を進めていきます。

「3. Aurora MySQL 3のリードレプリカを作成」を実行すると以下のメッセージが表示されました。

「Cannot upgrade from mysql 8.0.35 to aurora-mysql8.0.mysql_aurora.3.05.1.Specify a current active database version, the latest active minor version for mysql 8.0 is 8.0.33.」

RDS MySQL 8.0へアップグレードしたときにバージョンを当時の最新である「8.0.35」にしました。
ですが、当時のAurora MySQL 3では「8.0.35」へのサポートがされていませんでした。
ちなみに、現在はサポートされています。(Amazon Aurora MySQL 3.06 (MySQL 8.0.34 互換) の一般提供が開始

事前の調査・確認が足りていませんでした。 AWSのドキュメントをしっかり確認すべきでした。

どうやってAurora MySQL 3へ移行するか

Aurora MySQL 3へ移行するためにはRDS for MySQL 8.0のバージョンを「8.0.32」にする必要がありました。
AWSのコンソールではRDS for MySQLのダウングレード(「8.0.35」から「8.0.32」)はできません。
そこでRDS for MySQL 8.0へアップグレードした時に取得したRDS for MySQL 5.7のスナップショットを利用してRDS for MySQL 8.0(8.0.32)へアップグレードすることにしました。
スナップショットから別インスタンスとして復元させるため、本来なら必要がないインスタンスを一時的に作成することになりますが、やむを得ない状況でした。

また、RDS for MySQL 5.7から再実施するため、RDS for MySQL 8.0(8.0.35)の最新データを取得しておき、RDS for MySQL 8.0(8.0.32)へアップグレードした後にインポートする必要があります。
マイナーバージョンが下がるため MySQL 8.0 Release Notes を確認し、ローカル環境で適用可能であることを確認しました。
インポートについては差分インポートも考えましたが、手順や確認が複雑になることや本番環境のデータでどれくらい時間が短縮できるかわからないといった懸念点があったため、全量インポートにすることにしました。

以下の手順でAurora MySQL 3へ移行することができました。

  1. 各アプリケーション、バッチを停止
  2. RDS for MySQL 8.0(8.0.35)のdumpを取得(最新データを復元するため)
  3. RDS for MySQL 5.7のスナップショットから別インスタンスとして復元(RDS for MySQL 8.0(8.0.32)へアップグレードするため)
  4. RDS for MySQL 8.0(8.0.32)へアップグレード(Aurora MySQL 3(3.05.1)のサポート対象)
  5. 2.で取得したデータをインポート(RDS for MySQL 8.0(8.0.35)の最新データを復元)
  6. Aurora MySQL 3(3.05.1)へ移行(リードレプリカを作成、昇格)
  7. Route 53 のDB接続用レコードのエンドポイントをRDS for MySQL 8.0からAurora MySQL 3に変更
  8. 各アプリケーション、バッチを起動

本番環境への対応は稼働中のサービスを停止させる必要があり、サービス停止時間を決定するために各作業の所要時間を計測します。
9年間運用してきましたが、本番環境の全データのインポートは実施したことがなく、どれくらい時間がかかるか見当がつきませんでした。
そこで本番環境と同等のインスタンスを検証環境に用意して確認したところ、本番環境の全データのインポートは約40分かかることがわかりました。
事前に検証する作業工数やAWSの利用コストは発生してしまいますが、稼働中のサービスで問題を発生させてしまう方が損害になりうると考え、お客様にもその必要性を理解していただきました。

本番環境でAurora MySQL 3へ移行

検証環境で確認できたので、本番環境でAurora MySQL 3への移行を実施します。
稼働中のサービスなので、サービスの停止時間は極力短くすることを意識します。
「スナップショットから復元」と「RDS MySQL 8.0(8.0.32)へアップグレード」は別インスタンスとして実施できるため、別途事前対応としました。
朝4時から準備・事前対応を開始、4時30分から移行作業を実施し、予定通り7時30分にサービスを開始することができました。

本番環境での実施時間は以下の通りでした。

準備・事前対応

  1. RDS for MySQL 5.7のスナップショットから別インスタンスとして復元(約10分)
  2. RDS for MySQL 8.0(8.0.32)へアップグレード(約15分)

Aurora MySQL 3への移行作業

  1. 各アプリケーション、バッチを停止(約10分)
  2. RDS for MySQL 8.0(8.0.35)のdumpを取得(約15分)
  3. 2.で取得したデータをインポート(約45分)
  4. Aurora MySQL 3(3.05.1)へ移行(約60分)
  5. Route 53 のDB接続用レコードのエンドポイントをRDS for MySQL 8.0からAurora MySQL 3に変更(約5分)
  6. 各アプリケーション、バッチを起動(約10分)

最後に

今回はRDS for MySQL 5.7をRDS for MySQL 8.0にアップグレードし、その後にAurora MySQL 3に移行したお話でした。
いろいろと対応することはありましたが、それぞれしっかり確認しながら進めれば恐れることはないと思います。
ドキュメントの確認不足という反省点はあったので、今後に生かしたいです。

対応コストはかかりますが、本番環境での実施を想定した検証環境での事前の検証や懸念点を解消することは重要だと考えます。
そのため、検証の重要性をお客様に説明することも欠かせません。
今回、検証のコストや環境を用意することへ理解していただいたことに改めて感謝しています。

これからも様々な運用保守対応や追加改修が続いていきますが、しっかりと対応していきたいと思います。

ScalaMatsuri2024に大名スポンサーをしました

ScalaMatsuri2024に大名スポンサーをしました

2016年に初めてスポンサーをさせていただいてから、早いもので8年が経とうとしています。

当時はScalaという言語とそれを取り巻くフレームワークなどに新たな可能性を見出し、Scalaコミュニティの方々から学ばせていただくことも多くありました。

業務導入でのScalaという言語だけでみると経験が浅い中、弊社を頼ってお仕事を発注して頂き、分析プラットホームでのデータ処理から、企業向けサービスのがっつりした機能開発、保守が必要なレガシーコードとの対峙やマイグレーション対応まで、幅広く経験を積んできました。

そのように挑戦的なプロジェクトが進んでいるさなか、数年にわたって働き方を含め社会的影響を及ぼしたコロナ禍が訪れ、ScalaMatsuriだけでなく様々なイベントやカンファレンス界隈がオンラインやハイブリット開催へ切り替えることを余儀なくされました。

そして、ついに今年は完全オフラインでお台場にある「東京国際交流館 プラザ平成」に戻ってきて本格開催しますという発表がありました!

運営メンバーの世代交代もあり、今までのScalaMatsuriを踏襲しつつも新しい試みや変化もあり、どんなカンファレンスになるかを楽しみにして、今年もスポンサーをさせていただきました。

カンファレンス前の準備に練ったこと

さきほども言及したように環境変化が大きく、様々なことが様変わりしました。

私も例にもれず、コロナ禍でリモートワークを余儀なくされました。 以前から、リモートワークを推進したくオンライン・オフラインどっちでもうまくやっていく力を引き出したいという想いがありました。 そこで、コロナ禍が落ち着いた今も、対面で必要な時はオフィスに出社してホワイトボードを使いながらミーティングをすることもあるのですが、環境におかれてこそきづいたり、工夫しようという努力があるのでリモートワークを重点において日々仕事に取り組んでいます。

そこで、気づいたのがオフィスで普段から恩恵を受けていた数々の福利厚生やサービス。 コーヒーやお茶もフリードリンクで用意して頂き、オフィス移転前は大きな冷蔵庫に社員の声で導入されたカルピスなどの飲み物があったりして、うれしかったことを覚えています。(今はWeWorkからドリップ式の本格コーヒーや豆乳など様々なドリンクが提供されています)

自宅でも飲みたいものを飲んではいますが、オフィスと違って同僚からの差し入れや品のローテーションなどの意外性ある出会いが減ってしまうのも事実でした。 私以外にも同じ思いをもってScalaMatsuriに参加している方々は多いんじゃないかなと考えました。

そこで、みなとみらいのオフィスからほど近い場所にある、自店でスリランカから直輸入している紅茶専門店のおいしい紅茶(私も普段愛用しています!)を、みなさんにノベルティとしてお届けできたら、意外性も含めて喜んでいただけるのではないかと思って、お店に相談をしてノベルティ用の専用ティーパックを袋詰していただけることになりました。

どうしても自宅で一人で作業していると、根を詰めてしまうこともあるし少しばかりのリフレッシュとして、お茶を飲んでいる時間に弊社メンバーが過去に書いた技術ナレッジや組織的な取り組みのブロク記事や、他社の方とお話する中で生まれたScala先駆者インタビューという連載記事、弊社が受けたインタビュー記事などを、お茶のお供に読んでいただければと思い、ピックアップして専用の teatime.atware.co.jp というドメインでランディングページを用意することにしました。 (スポンサーをする時のベネフィットも考えて弊社をよりよく知っていただければということも考慮しました!)

当日を迎え

冒頭でカンファレンスの運営のやり方も変わったことがお伝えしましたが、その中のひとつとして、ノベルティ配布方法が事前に運営が袋詰をして全スポンサーの全ノベルティーを一律に参加者全員へ配布するのをやめ、デスクにノベルティを各社が並べ、参加者が各自欲しいものをもらっていくというスタイルになりました。

自分も参加者としてカンファレンスに参加することがあるので気持ちがよくわかるのですが、パッと見だと、紅茶なのかコーヒーなのか、それともウェットティッシュなのかもわからないこともあります。ノベルティをもらいにカンファレンスに来るわけではなく、セッションを聞いたり、参加者と懇親をするのが主目的となるので、どうしても配布ブースはサッと眺めて素通りとなりがちなんですよね。

そこで、気づいていただきやすいように、人の通りがあるようなお店の様にディスプレイして、直感的に感じ取ってもらえるようにお盆とお皿にのせて、粘土で作った「クレイケーキ」も並べてみました。選んでもらえる楽しみも盛り込もうと思って、産地でもミルクティー向き茶葉やストレート向き茶葉やチャイに向いている形状(CTC)など、複数の種類を用意し、特色の違いもわかる資料を置きました。

補充をスポンサー自身で行う必要があったということもあり、受付開始の序盤には自身で補充しながらもらってくださる方の反応を見ていたのですが、海外からの来場者が「Oh!! Sri Lanka tea! Uva〜、Ruhuna〜」と産地名を読み上げながら、どっちにしようかなと悩んでいるのを見かけました。

補充をしている時には、他のスポンサーさんともお話するきっかけにもなりましたので、全参加者に一律にモノを配布する形とこのスタイルも一概にどっちがいいとは言えませんが、今回のような形態は、能動的な行動を促すことになるので、ポジティブな面も多くあるなと思いました。

懇親会タイムでは、ノベルティをもらっていなかった方々が終盤に次々ともらっていってくださり、用意した分はほぼなくなってしまうほどで、弊社からのホスピタリティを考えて作ったモノがまずはお手元に届けることができてよかったです。

ScalaMatsuriでの出会いと感じたこと

今までと同じ会場でしたが、メイン会場とサブ会場の同時並列度は少なく、ほぼメイン会場での発表でした。 セッションを聞いて身になったなと思ったことはありますが、私にとっては久々のリアル懇親会で、スタッフの方は知人の方、また初めてお会いした方々と技術談義や普段の悩みや、最近のScalaや言語事情、組織での課題感をお話でき、すごく有意義な時間を過ごすことができました。

当日、お話してくださった方どうもありがとうございました!楽しかったです。

最後に

初めてお会いした方も「アットウェアさん毎年スポンサーしてますよね」と言ってくださり、存在を認識していただいていることに嬉しく思っています。 コミュニティの発展への寄与、エンジニアングを中心としたシステムづくりのプロとして「システムで人々をしあわせにする」というミッションを果たしていきたいです。

こういう弊社で一緒に働いてくださる方、お仕事の相談をしたいなと思う方、ぜひお気軽にお声がけください!

今年もScalaMatsuriの運営のスタッフの方々お疲れ様でした。カンファレンスを開催していただきありがとうございました。

UX DAYS TOKYO 2024 スポンサーに向けて

UX DAYS TOKYO 2024 スポンサーに向けて

UX DAYS TOKYO 2024が明日、3月15日(金)に開催されます。

アットウェアとしてはUX DAYS TOKYOというカンファレンスに、初めてスポンサーをさせていただくことになりました。
ブログでもUXに言及した記事を公開したことはなく、UXをテーマとした取り組みは少し新鮮に感じる方もいらっしゃるのではないでしょうか。

以前に別のカンファレンスでスポンサーをする時にこんなことをお伝えしたことがありました。

過去にもアットウェアは幾つかのカンファレンスのスポンサーをさせていただいてきました。 弊社メンバーがカンファレンスに参加するときに大事だなと思っているのは、その場を楽しめる空気感です。 これは、セッション内容だけでなく、いろいろな立場の人が気軽に参加できる心遣いやおもてなしの心も大きいのではないかと考えています。

私達自身が参加したいと思えて、そのセッションやカンファレンスの趣旨に同調したいと思えることはとても重要で、このカンファレンスにも同様の想いを感じました。

アットウェアでは創業当初からアジャイルプロセスを導入し試行錯誤しながら、顧客やエンドユーザへ限られた時間とコストを考慮したうえで、よりよい価値を届けることを主眼においてやってきました。

その中で、「強力なフレームワークや言語や開発手法をうまく使いこなして、システムをしっかり作り込めるようになる」ところへのアプローチについては、シビアな非機能要件をクリアするためにそれはそれでとても大事でやったきたことなのですが、エンドユーザがシステムを日々使い続けることに焦点を当て、その体験が最良なモノになるかを模索するために、分析・改善・設計を絶えず行っていくことも大事になると考えています。

その2つのテーマを両軸でやっていくと、オーダーメイドでシステムを開発するうえで、付随する大事な要素が高まりあいます。
UXはアジャイルという考え方に親和性があり、それは目新しいことでもなければ、今までにやってきたことも含まれるかもしれません。

今回スポンサーさせていただくきっかけとして、さきほど述べた、カンファレンスの趣旨に共感したという点以外に、弊社が焦点を当てているテーマと近かったので、シルバースポンサーとしてスポンサーをさせて頂くことになりました。

今年のUX DAYS TOKYOのセッションを見てみると、UIやビジュアルデザイン以外のテーマがほとんどです。

  • AI×デザイン:未来を創造する
    • ユーザー中心設計と技術能力の融合によるAIプロジェクト成功へのバランスの取れたアプローチを学びます。
    • 技術的パフォーマンス、価値、リスクの評価方法についても探ります。
  • ビジュアル・シンキング:アイデアを視覚化して問題を解決しよう
    • ビジュアルシンキングとスケッチを活用してアイデアを視覚的に表現することの価値と考え方を学びます。
    • 普段の業務やコミュニケーションにおける視覚的スキルの重要性とその効果と価値が理解できます。
  • 最もクリエイティブな人と企業の秘密
    • クリエイティブな分野で最も先駆的で独創的な人物のクリエイティブのプロセスを紹介します。
  • 未来を創る:UXキャリアデザイン
    • 自己を見つめ直し正しい方向へ個人のキャリアを伸ばす方法を説明します。
    • ユニークな能力をもつ個人の集合体は強いチームを組成し組織に貢献します。
  • 影響力の高いチームの組成とメトリクス
    • 影響力の高いプロダクトチームの構築について解説します。
    • 多くのチームが重要でないタスクに焦点を当てている現状を振り返り、共通のビジョンと高いビジネス目標に向かう方法を提供します。

紹介文をみると、わくわくしますね。
私たちが、より仕事をうまくやり、価値を創造できる組織になるためのヒントをこのカンファレンスから学べることを期待しています。

世界で活躍されている方を国外からスピーカーとして招くのは大変な準備と意気込みが必要ですよね。
限られた人数で活動されてる主催者の方々におきましては、当日は運営で大変だとは思いますが、陰ながらスポンサーという形で応援いたします。

アットウェアのTechbashを紹介します‼

アットウェアのTechbashを紹介します‼

こんにちは。技術推進ワーキンググループ(以下、技術推進 WG)の西川です。

この記事では私たちが社内で取り組んでいる活動について紹介します。

 

技術推進 WG とは、技術トレンドのキャッチアップや社内の技術力向上を目的に活動しているアットウェアの有志からなる集団です。

読書会や勉強会の開催などの取り組みを通じ、社内の技術的な交流を促進しています。

 

TechBash とは、アットウェア社内向けの LT 大会です。技術推進WGが主体となり、数ヶ月ごとに開催しています。

 

TechBash以前にアットウェアではビアバッシュを行っていました。ビアバッシュとは、ビールを飲みながらワイワイ話すイベントですが、コロナの感染が拡大してから開催をやめてしまいました。対面で行われていた数々のイベントが中止となる中、当時のアットウェアには、社員が気軽に交流する機会が無くなってしまうのではという危機感がありました。

技術推進WGでは、危機感に加えて、社内を技術で盛り上げていきたい思いとカジュアルに技術の話をする場を作りたい思いがありました。そこで、2020年10月からTechBashとしてオンラインで技術交流活動を行うことにしました。

 

TechBashでは、Java 新バージョンの機能紹介といった技術的なものや、ペアプロについて語る開発手法的なものなど、幅広いジャンルの話が行われます。時々、技術的なお悩み相談の場になったりもします。

過去の開催の発表内容を一部紹介します。

2023 年 11 月(テーマ: パフォーマンス)

  • パケット解析プログラムでのパフォーマンスついての悩み事
  • 最短経路問題におけるダイクストラ法を用いた解法紹介
  • パフォーマンス改善入門
  • 水平スケーリング or ボトルネック特定のためのオブザーバビリティ入門
  • k6 で負荷試験入門

2023 年 8 月(テーマ: 書籍紹介)

  • 技術書のおもひで
  • テスト駆動開発(仮)
  • 法務的な本のお話
  • AWS ではじめるインフラ構築入門
  • 技術書経験ほぼゼロの私、技術書に対する印象が変わる?!(仮)
  • 達人プログラマー
  • 関数型プログラミングってなんだろう

 

 長らくオンライン開催で行ってきたTechBashですが、去年の 8 月はオフィスで開催しました。

 

当初はビールを飲みながらLTをして、技術について語り合う場にしたいという感じで始まったTechBashですが、この記事を書いている2024年1月時点で計32回の開催が行われました。

参加者に感想を聞いてみると、「自分の知らない世界を知れて楽しかった」、「発表してみて伝え方やスライドの作り方が鍛えられた」、「自分の好きなことを自由に伝えられてよかった」といった声がありました。

手前味噌ではありますが、様々な方に参加いただき、交流イベントという観点からみると最高のイベントになったと思います。

今後もTechbashがより良いイベントになるように努めていきたいです。

2023年の振り返りと私の新たな目標に向けて

2023年の振り返りと私の新たな目標に向けて

はじめに

こんにちは、アットウェアの北村です。

2024年がスタートし、気持ちを新たに生活されているであろう今日この頃、 みなさまはいかがお過ごしでしょうか? 2023年を振り返り、新年の抱負などを定められたでしょうか?

私自身の2023年は、転機と新しいことに挑戦する1年となりました。 ここでは、昨年の振り返りと今年の抱負を少しばかりさせていただけると幸いです。

これまで

昨年を振り返る前に少しだけ自分についてです。

私は18年に新卒でアットウェアに入社しました。 新人研修を終え、OJTでとあるプロジェクトに配属となりました。 そこでは良い先輩エンジニアの方々に恵まれ、開発・運用・保守など、様々なフェーズの経験を積ませていただきました。

こちらのプロジェクトには 4 〜 5 年という長い期間携わらせて頂いて感謝しかないです。 その一方で、周りの若手社員達がプロジェクトの移動をしているのを見て

自分も新しいプロジェクト・新しい技術に挑戦したい これまで関わることのなかった社員の方と一緒にお仕事したい

と、思うことが多くなっていました。 しかし、その反面で

新しいプロジェクトでもやっていけるのか イチから技術を学びながら、周りから期待されるスピードでタスクをこなせるのか(プロジェクトの進行を妨げないか) 一緒に仕事をする方とソリが合わなかったらどうしよう

等々、ネガティブな気持ちも膨らんでゆき、新たな一歩を踏み出せず二の足を踏んでいるような状況に陥ってました。

このままではいつまで経っても先に進めないと思い、 まずは自力をつけることで、すこしでも不安な気持ちを払拭しようと考え、 『新しい技術にチャレンジする』という目標を持って2023年へと踏み出しました。

2023年 ~転機・新しいことへの挑戦~

気持ちも新たに勉強・仕事の日々を送っていた矢先に、新規プロジェクトの立ち上げのお話があり、自分にやってみませんかとお話をいただく機会がありました。

お話をいただいた当初はどうしても不安な気持ちが大きく、お断りしたいと思いましたが、 プロジェクトの内容として、今まで経験してきた内容とは異なる技術を新たに学べ、これまでと違った内容のシステムを開発する経験が得られるチャンスでもあったので、不安な気持ちと戦う覚悟を持って、新しいプロジェクトに携わらせていただくことにしました。

新しいプロジェクトでは、これまで自分が使用していた技術やフレームワークとは異なるものを新たに学びながら実装するのに苦戦することが多く、なかなか成果が出せずに思い悩むこともありましたが、新しいことに挑戦している楽しさのほうが苦労よりも勝っていたため、楽しさを持って取り組むことができました。

挑戦するモチベーションのキープ

プロジェクトで忙しくなってきた際に、どうしても『新しい技術にチャレンジする』ための時間を確保することが難しかった頃、時間を確保してやらなければいけないという思いが引っかかりつつも、目の前のタスクをこなすことに精一杯で、日々の技術面への学びという意味での積み重ねの頻度が減って、次第にモチベーションも下がっていき、「忙しいからしょうがない...」を言い訳にしてやらない時期がありました。

そこで大学時代の友人に相談すると、細かいスキマ時間を使って勉強するというアドバイスを頂いたので実践してみたところ、参考書を読んでみると細かい章ごとでいい感じに区切って読むことができたり、実装したりすると小さなメソッドごとに分けて進めることができ、自分にとっての勉強法としてマッチしていました。

再び取り組む内容が自分にとって有意義・楽しいと思えるようになってきて、コツコツと日々新しい技術に取り組むことで、学習するのが苦痛にならず、次にどんなことを知りたい・実装してみたいといったモチベーションが継続的に湧き上がってくることにも繋がりました。

2023年をふりかえって

2023年は不安を克服し、挑戦することで良い結果を得られました。 その中で感じたこととして

安定することも大事だが、それによって変化することを恐れてはいけない 挑戦することは大変だけれども、同時に楽しいことでもある

この2つがとても大事な考え方だと感じました。 特に、楽しんで挑戦することは自身のモチベーションを保ち、また新たな挑戦をするためのエネルギーになるので、日々挑戦することを続けていきたいと思います。

2024年の抱負

自分も30歳を超え、今後のキャリアについて考えていかなければいけない時期だと思うので、2024年は新しい技術等を学ぶことを続けつつ、キャリアにつながるようなスキルについて挑戦していきたいです。

AWS Lambda SnapStart を使って Java での AWS Lambda 関数を高速化する

AWS Lambda SnapStart を使って Java での AWS Lambda 関数を高速化する

AWS Lambda SnapStartがどの程度効果があるのか、実際のプロダクションで利用できる性能なのか、気になっていたのでAWS Lambda SnapStart をためしてみました。

AWS Lambda SnapStart は、Java で開発が進められている CRaC を AWS Lambda ランタイムに転用したモノです。
CRaC は、Javaのプロセスイメージをスナップショットとして取得し、再起動時にスナップショットからプロセスを復元することで、Java特有の起動の遅さを解決することを企図したプロジェクトです。

まずはSpring Cloud Function を使って AWS Lambda Function上で動作させる簡単なRest APIを用意します。

このようなパッケージ構成で、パラメータで受け取った値を大文字にして返却するRest APIを作りました。

├── java
│   └── com
│       └── example
│           └── sample
│               ├── SampleApplication.java
│               └── functions
│                   └── Uppercase.java
└── resources
    └── application.yaml

このコードをデプロイし、SnapStartを使わずに、このRest APIをcurlコマンドを使って速度を測ってみました。起動時間などを含めたパフォーマンスを計測するため、 -w オプションを付けています。

curl https://***.lambda-url.ap-northeast-1.on.aws/ -H "Content-Type: text/plain" -d "hello, spring cloud function!" \
  -w " - http_code: %{http_code}, time_total: %{time_total}\n"

上記結果は下記のようになりました。

"HELLO, SPRING CLOUD FUNCTION!" - http_code: 200, time_total: 5.306902

AWS Lambda 関数としてただしく動作していることがわかります。 トータル時間が 5秒 となっているのは、いわゆる Java のコールドスタート問題で、Spring の起動に時間がかかっているためです。 この直後にもういちど同じコマンドを実行すると、以下の様になります。

"HELLO, SPRING CLOUD FUNCTION!" - http_code: 200, time_total: 0.069804

すでに起動しているので、実行時間は 0.07秒 となっており、想定していた通りのレスポンス速度でした。では、次にSnapStartで動作させる設定をしてデプロイ後、実際に測定してみましょう。

AWS Lambda の設定

SnapStart を有効にするのは簡単で、コンソールでは関数の一般設定で、SnapStart の項目を None から PublishedVersions に変更することで有効となります。 AWS CLI では、以下の様なコマンドで有効にできます。

aws lambda update-function-configuration --function-name SpringCloudFunctionSample \
  --snap-start ApplyOn=PublishedVersions

「PublishedVersions」なので、公開されたバージョンに対して実行されることになります。 この設定をして以降は、バージョンを作成する度に、スナップショットが取得されるようになります。 バージョンを発行するには、コンソールの「バージョン」タブで新規に作成するか、AWS CLI では、以下の様なコマンドで実行できます。

aws lambda publish-version --function-name SpringCloudFunctionSample

バージョンを作成すると、スナップショットをとるのに数分を要します。 CloudWatchでログを見ると、INIT START して Spring が起動しているログが確認できる場合があります。 (ときどき出力されないときがありそこは今後調べたい)

INIT_START Runtime Version: java:11.v19    Runtime Version ARN: arn:aws:lambda:ap-northeast-1::runtime:*****
(中略)
:: Spring Boot ::               (v2.7.10)
(中略)

このバージョンに対して AWS Lambda Function URL を作成して、下記 curl コマンドを投げてみます。

curl https://*****.lambda-url.ap-northeast-1.on.aws/ -H "Content-Type: text/plain" -d "hello, spring cloud function!" \
  -w " - http_code: %{http_code}, time_total: %{time_total}\n"

結果は以下の様になりました。

"HELLO, SPRING CLOUD FUNCTION!" - http_code: 200, time_total: 1.452490

Snapstartを使わない時がtime_total: 5.306902 だったので、70% 程度高速化していることがわかります。 なお、CloudWatch のログを確認すると、以下の様に出力されています。

RESTORE_START Runtime Version: java:11.v19    Runtime Version ARN: arn:aws:lambda:ap-northeast-1::runtime:***
RESTORE_REPORT Restore Duration: 315.26 ms

スナップショットから 315.26 ms かけて復元したことが確認できます。 設定をちょっと変えただけで高速化したのスゴイですね!

ランタイムフックの設定

SnapStart によって AWS Lambda の起動が高速化されることが確認できました。 しかし、SnapStart はプロセスのスナップショットをとるという仕組み上、プロセスに状態を保持すると、その状態が使い回されてしまいます。例えば、以下の様な場合に考慮の必要がありそうです。

  • RDSとの接続状態
  • 認証情報
  • 処理で利用する一時データ
  • 一意性が必要なデータ

こうした問題に対処するために、ランタイムフックを利用して、復元時に実行する動作を設定出来るようになっています。 ランタイムフックの実装は、以下のように行います。

CRaCの依存性を build.gradle 追加

ext {
    set('springCloudVersion', "2021.0.6")
    set('awsLambdaCoreVersion', '1.2.2')
    set('awsLambdaEventsVersion', '3.11.1')
    set('cracVersion', '0.1.3') // 追加
}

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-function-webflux'
    implementation 'org.springframework.cloud:spring-cloud-function-adapter-aws'
    compileOnly "com.amazonaws:aws-lambda-java-core:${awsLambdaCoreVersion}"
    compileOnly "com.amazonaws:aws-lambda-java-events:${awsLambdaEventsVersion}"
    implementation "io.github.crac:org-crac:${cracVersion}" // 追加
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

関数クラスに、CRaC の Resource インターフェースを実装し、メソッドをオーバーライドしコンストラクタで関数クラスをコンテキストに登録

public class Uppercase implements Function<String, String>, Resource {

    private static final Logger logger = LoggerFactory.getLogger(Uppercase.class);

    public Uppercase() {
        Core.getGlobalContext().register(this); // CRaC のグローバルコンテキストに登録
    }

    @Override
    public void beforeCheckpoint(Context<? extends Resource> context) throws Exception {
        logger.info("Before checkpoint");
        // チェックポイント作成前の操作をここに書く
    }

    @Override
    public void afterRestore(Context<? extends Resource> context) throws Exception {
        logger.info("After restore");
        // スナップショットからの復元時の操作をここに書く
    }

    @Override
    public String apply(String s) {
        return s.toUpperCase();
    }
}

上記変更を行ってデプロイし、確認用の curl コマンドを投げると以下の様な結果となりました。

"HELLO, SPRING CLOUD FUNCTION!" - http_code: 200, time_total: 1.295677

コンテキストに追加する処理を書いたせいか、実行時間が短くなっていますね。誤差かもしれませんが。

なお、CloudWatchLogs でログを見ると、以下の様なログが出力されています。

2023-04-21 02:47:55.708  INFO 8 --- [           main] com.example.sample.functions.Uppercase   : After restore

ランタイムフックが正しく動作していることがわかります。

同時接続での速度確認

Java で AWS Lambda を実装する場合の問題は、同時接続が発生したときにコールドスタートが多発して速度が遅くなってしまうことでした。 そこで、SnapStart でその状況が改善されるかを確認するために、 Apache Bench を利用して、同時接続が発生した場合のパフォーマンスを測定してみました。

ab -n 100 -c 10

上記コマンドで、リクエスト 100 件を、並行数 10 で行ってくれます。イメージとしては、10ユーザーが同時に10リクエストを要求している感じです。 結果は、以下の通り。

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       27   71  33.4     68     156
Processing:    23  160 304.9     57    1286
Waiting:       23  156 305.6     52    1285
Total:         53  230 308.2    127    1362

Percentage of the requests served within a certain time (ms)
  50%    127
  66%    171
  75%    183
  80%    211
  90%    916
  95%   1118
  98%   1285
  99%   1362
 100%   1362 (longest request)

トータルでみると、最大が 1362 ミリ秒、最小が 53 ミリ秒。 この最大値が許容できれば、REST API として利用するのもアリかもしれません。

まとめ

SnapStart を利用することで、Java で実装した AWS Lambda が劇的に高速化することがわかりました。 SpringBoot アプリケーションでも問題無く利用できることがスゴイですね!

気をつけなければいけない点として現時点では、AWSのドキュメントに記載があるように以下のような制限があります。

  • ランタイムとして Java11とJava17を利用可能
  • Graviton2 が使えない
  • Amazon EFSが使えない
  • エフェメラルストレージが512MB固定

これらを許容できて、かつ、スナップショットからの復元時間が許容できるものであれば、REST API を作る技術の候補として選択して良いかも知れません。

株式会社ゆめみさんと合同LT大会を開催しました

株式会社ゆめみさんと合同LT大会を開催しました

5月に株式会社ゆめみさんと関連企業の未来シェアと合同LT大会を開催しました。 開催してから少し時間が経ってしまいましたが、楽しく充実した試みになったのでブログに書いてみることにしました。 コロナ禍に入ってから勉強会やイベントはオンライン開催が普通でしたが、今回は久しぶりのオフライン開催でした。

アットウェア x 未来シェア x ゆめみ 合同LT会 in 横浜

当日は、総勢11名の発表者が集まり日々の業務で得たナレッジや趣味で得た経験などを共有しました。 Flutter、React、Android、Dockerやレシートプリンター(Android端末)の開発記など多岐に渡る内容でとても面白かったです。 みなさん5分じゃ話足りないくらい充実した内容でした。 ゆめみさんからは1年目の方がたくさん発表されており、しかもとても堂々とした立ち振る舞いで驚きました。 この積極性は弊社も見習いたい。

発表を受けて弊社にもレシートプリンターを買った方がいました。 レシートプリンターで名刺印刷を実装した話で実際に会場でも使用されていて、 名刺交換してもらった時かっこよくてワクワクしました。 私も欲しいなと思いました。宣伝効果ありですね。

私はReactのコンポーネント設計に関する日頃の悩みをテストファーストという観点から考えてみた時のことを話しました。 社外イベントでLTをするのは初めてだったので良い経験になりました。 その場で参加者の顔を見ながらわいわいした雰囲気を体感して発表できるのはオフラインイベントの醍醐味だなと思いました。

発表資料

LT後には懇親会を行い、話し足りない発表内容について話したり、エディタやテスト、スクラムなど技術談義で盛り上がりました。 Swiftでの単体テストの粒度、E2Eテストをやるか結合テストでカバーするのかといった話やAndroidでのDDDなど、私は普段はやらないモバイル開発の話を聞けて勉強になりました。 フロントエンドという括りでは似たような悩みや考えがあったり、はたまた全く違うような話も聞けて面白かったです。 LT大会も懇親会もみんな技術が好きだとを感じることができる時間でした。

オフラインでのLT大会の雰囲気が良かったので、8月に社内でもオフラインのLT大会をコロナ禍以来久しぶりに開催しました。 オフラインにはオフラインならではの良さがあり、今後も定期的にオフラインイベントもやっていきたいです。 また、社外のエンジニアの方との交流も普段扱わない技術に関して知見を得ることができるし、 何より技術好きな方達との出会いはとても良い刺激になったと思うので交流する場を増やしていきたいです。

JSON vs MessagePack vs Protocol Buffers

JSON vs MessagePack vs Protocol Buffers

実業務で大きなサイズのデータをブラウザと交換する機会があったのですが、その際のデコード処理の負荷が課題となっており、効率的にエンコード・デコードできるデータフォーマットを探していました。候補としてProtocol BuffersとMessagePackが挙がり、詳しくパフォーマンスを知るために今回検証を行いました。この記事ではその調査結果をご紹介します。

主にブラウザでデータを受け取るという観点から デコードが早いかどうか を中心に測定を行いました。

なお、計測に使った環境は次のとおりです。

  • MacBook Pro 14インチ、2021 (Apple M1 Pro) / 32GB
  • Node.js 20.5.0 (V8 11.3.244.8-node.10)
Passmark PerformanceTest 11.0.1000

CPU Mark                      22,049
Integer Math                  46,634 MOps/Sec
Floating Point Math           65,615 MOps/Sec
Prime Numbers                    281 Million Primes/Sec
Sorting                       33,605 Thousand Strings/Sec
Encryption                    12,497 MB/Sec
Compression                  280,803 KB/Sec
CPU Single Thread              3,902 MOps/Sec
Physics                        2,957 Frames/Sec
Extended Instructions (NEON)  11,078 Million Matrices/Sec

Memory Mark                     3,927
Database Operations	            9,486 KOps/Sec
Memory Read Cached             24,395 MB/s
Memory Read Uncached           22,894 MB/s
Memory Write                   24,052 MB/s
Latency                            26 ns
Memory Threaded               118,100 MB/s

MessagePack

MessagePackはJSONと同じスキーマレスなデータ構造です。

MessagePackのためのJavaScriptライブラリとしては、次が人気のようです。

インターネット上でも少し探すとベンチマークが見つかります。この結果を見ると、JSONの方が10倍ほど高速のようです。

バイナリフォーマットと比べてJSONのパフォーマンスがこれほど高いのは意外でした。その理由は@msgpack/msgpackのREADMEのベンチマークで説明されていました。

Run-time performance is not the only reason to use MessagePack, but it's important to choose MessagePack libraries, so a benchmark suite is provided to monitor the performance of this library.

V8's built-in JSON has been improved for years, esp. JSON.parse() is significantly improved in V8/7.6, it is the fastest deserializer as of 2019, as the benchmark result bellow suggests.

(和訳) MessagePackを使う理由は実行時のパフォーマンスだけではありません。それでもどのMessagePackのライブラリを選ぶのかは重要です。そのため、このライブラリのパフォーマンスを観察するためのベンチマークスイートを用意してあります。 V8に組み込まれたJSONライブラリは何年も掛けて改善されており、特にJSON.parse()はV8/7.6で目を見張る改善がなされました。下のベンチマーク結果が示唆するように、2019時点では最も早いデシリアライザです。

ChromeのJavaScript実行エンジンのV8はC++で書かれており、パフォーマンスが高いのは納得できます。

とはいえ、2019年からもう4年が経過しており、多少状況が変わっている可能性はあります。

ベンチマーク

そこで現時点の実際のパフォーマンスを知るために、@msgpack/msgpackのリポジトリ内のベンチマークを実行してみます。

比較しやすいように出力結果は整形してあります。また、比較のために一部のテストケースにJSONを追加しています。

npx node -r ts-node/register benchmark/benchmark-from-msgpack-lite.ts

Benchmark on NodeJS/v20.5.0 (V8/11.3)

operation                                         |   op    |   ms  |  op/s
------------------------------------------------- | ------: | ----: | ------:
(エンコード)
buf = Buffer.from(JSON.stringify(obj));           | 1084100 |  5000 |  216820
buf = require("msgpack-lite").encode(obj);        | 1001900 |  5000 |  200380
buf = require("@msgpack/msgpack").encode(obj);    | 1260600 |  5000 |  252120
buf = /* @msgpack/msgpack */ encoder.encode(obj); | 1311300 |  5000 |  262260
buf = require("msgpackr").pack(obj);              | 2915100 |  5000 |  583020
(デコード)
obj = JSON.parse(buf.toString("utf-8"));          | 1737500 |  5000 |  347500
obj = require("msgpack-lite").decode(buf);        |  575700 |  5000 |  115140
obj = require("@msgpack/msgpack").decode(buf);    | 1536000 |  5000 |  307200
obj = /* @msgpack/msgpack */ decoder.decode(buf); | 1546600 |  5000 |  309320
obj = require("msgpackr").unpack(buf);            | 1424700 |  5000 |  284940

node benchmark/msgpack-benchmark.js

./sample-large.json: (7598 bytes in JSON)

(encode) json             x 82,388 ops/sec ±0.54% (96 runs sampled)
(encode) @msgpack/msgpack x 31,050 ops/sec ±0.16% (100 runs sampled)
(encode) msgpack-lite     x 29,034 ops/sec ±0.76% (96 runs sampled)
(encode) notepack.io      x 28,766 ops/sec ±0.13% (98 runs sampled)
(encode) msgpackr         x 66,822 ops/sec ±0.65% (97 runs sampled)
(decode) json             x 80,895 ops/sec ±0.73% (98 runs sampled)
(decode) @msgpack/msgpack x 32,898 ops/sec ±0.12% (98 runs sampled)
(decode) msgpack-lite     x 15,715 ops/sec ±0.27% (98 runs sampled)
(decode) notepack.io      x 21,699 ops/sec ±0.90% (100 runs sampled)
(decode) msgpackr         x 67,720 ops/sec ±0.21% (99 runs sampled)

結果を見ると、デコーディングに関してはJSONが依然として早いことがわかります。デコーディングにおけるパフォーマンスが低い理由は、JSONと同じくスキーマレスで構造がわからないというのが大きな理由だと考えられます。

ライブラリの中でも msgpackrは早いことがわかります。MeasureThat.netにはmsgpackrの異なるテストケースが載っています。

数値や真理値等を中心としたデータの多次元配列をデコードする MsgPack Numbers Decode というテストケースではJSONと比べて2.6倍程度早いようです。データの読み取りが単純な数値であれば、決まったデータを読み取って変換(ビット演算等)するだけであり、早いのは納得できます。

一方、文字列のデコードを中心とした MsgPack String Decode はJSONに比べて遅いという結果が出ています。MessagePackでは、ヌル終端文字列ではなくPascal文字列を採用しています。つまり、文字列長を最初のバイトに含めるようになっています。これにより、読み取り速度を大幅に向上させられます。しかし、それでも遅いという結果が出ているということは、V8のC++で実装されたJSON.parse()の方がJavaScriptで書かれたmsgpackrよりも早いのだろうと推測しています。

文字列データが支配的でない単純な配列であれば、MessagePackの方が早いのではないかと考えられます。実際にそのようなデータを試してみたところ、JSONよりも1.5倍程度早いという結果が得られました。とはいえ、配列の何番目にデータが入っているという知識を事前に共有しておく必要があり、データ構造の変更に注意を払う必要が出てきます。実用性を考えると好ましいとはいえないでしょう。なお、ここでは Chrome/115.0.5790.114 (V8 11.5.150.16) を計測に利用しました。

エンコードしたデータ

[
  ["hello", 123, true],
  ["world", 456, false],
  ["java", 541, true],
  ["javascript", 231, false],
  ["c", 852, true],
  ["cpp", 142, false],
  ["basic", 431, true],
  ["python", 591, false],
  ["hello", 123, true],
  ["world", 456, false],
  ["java", 541, true],
  ["javascript", 231, false],
  ["c", 852, true],
  ["cpp", 142, false],
  ["basic", 431, true],
  ["python", 591, false],
]
operation              |   op
---------------------- | ------:
JSON Numbers Decode    |   968,421 ops/sec ±0.83% (68 runs sampled)
JSON String Decode     | 1,104,092 ops/sec ±0.54% (69 runs sampled)
JSON Simple Decode     |   923,841 ops/sec ±0.22% (69 runs sampled)
MsgPack Numbers Decode | 1,593,083 ops/sec ±0.17% (69 runs sampled)
MsgPack String Decode  |   994,357 ops/sec ±1.79% (65 runs sampled)
MsgPack Simple Decode  | 1,366,154 ops/sec ±0.13% (69 runs sampled)

MessagePack自体はスキーマレスなデータ形式ですが、亜種のmsgpackrではスキーマを定義するための仕組みもあるようです。msgpackrに掲載されているベンチマークを実行してみました。

operation                                                  |    op    |   ms  |   op/s  |    size   |
---------------------------------------------------------- | -------: | ----: | ------: | --------: |
(エンコード)
msgpackr w/ shared structures: packr.pack(obj);            | 15845200 |  5000 | 3169040 |           |
msgpackr w/ random access structures: packr.pack(obj);     | 16235200 |  5000 | 3247040 |           |
require("msgpackr").pack(obj);                             | 10741900 |  5000 | 2148380 |           |
bundled strings packr.pack(obj);                           |  9101900 |  5000 | 1820380 |           |
buf = Buffer(JSON.stringify(obj));                         |  6359300 |  5000 | 1271860 |           |
(デコード)
msgpackr w/ shared structures: packr.unpack(buf);          | 34135500 |  5000 | 6827100 |        63 |
msgpackr w/ random access structures: packr.unpack(buf);   | 21832500 |  5000 | 4366500 |        58 |
require("msgpackr").unpack(buf);                           |  6387800 |  5000 | 1277560 |       143 |
bundled strings packr.unpack(buf);                         | 15376400 |  5000 | 3075280 |        74 |
obj = JSON.parse(buf);                                     |  7323000 |  5000 | 1464600 |       180 |

require("msgpackr").unpack(buf) とJSONでは、JSONのほうが早いという結果が出ています。一方、スキーマを定義したmsgpackr w/ shared structuresでは、4.7倍という非常に早い結果が出ています。

上記のベンチマーク結果を見ると、JSONのデコードとMessagePackのデコードのパフォーマンスに大きな差がないため、JSONと比べてもおよそ4倍程度の差だと推測できます。これは、後述するスキーマベースのProtocol BuffersがJSONと比べて4倍程度早いこととも一致します。

Protocol Buffers

Protocol Buffersは、スキーマに基づくデータフォーマットです。スキーマはデータ構造の定義のことで、これを事前に定義して送信者と受信者で共有し、エンコードとデコード時に用います。JSONやMessagePackでは、実際にデータを読み取らなければ構造がわかりませんでしたが、Protocol Buffersでは事前に分かっているため、高いパフォーマンスが期待できます。

Protocol BuffersのためのJavaScriptライブラリとしては、protobuf.jsgoogle-protobufが人気のようです。

protobuf.jsのREADMEに載っているベンチマーク結果は、i7-2600KとNode.js 6.9 (2016年)のもので結果が古くなっています。

ベンチマーク

protobuf.jsのリポジトリ内のベンチマークを実行してみます。

ただし、以下の点で変更があります:

  • 静的コードの再生成
    • pbjs --target static data/bench.proto > data/static_pbjs.js
  • google-protobufの更新
    • 3.11.3 -> 3.21.2
> protobufjs@7.2.4 bench
> node bench

benchmarking encoding performance ...

protobuf.js (reflect) x 1,544,621 ops/sec ±0.21% (96 runs sampled)
protobuf.js (static)  x 1,580,495 ops/sec ±0.17% (97 runs sampled)
JSON (string)         x 1,165,063 ops/sec ±0.18% (95 runs sampled)
JSON (buffer)         x   872,308 ops/sec ±0.19% (97 runs sampled)
google-protobuf       x 1,015,041 ops/sec ±0.16% (99 runs sampled)

   protobuf.js (static) was fastest
  protobuf.js (reflect) was  2.3% ops/sec slower (factor 1.0)
          JSON (string) was 26.3% ops/sec slower (factor 1.4)
        google-protobuf was 35.8% ops/sec slower (factor 1.6)
          JSON (buffer) was 44.8% ops/sec slower (factor 1.8)

benchmarking decoding performance ...

protobuf.js (reflect) x 3,936,820 ops/sec ±0.14% (99 runs sampled)
protobuf.js (static)  x 4,269,989 ops/sec ±0.20% (97 runs sampled)
JSON (string)         x   949,356 ops/sec ±0.14% (99 runs sampled)
JSON (buffer)         x   868,264 ops/sec ±0.15% (100 runs sampled)
google-protobuf       x   909,006 ops/sec ±0.18% (95 runs sampled)

   protobuf.js (static) was fastest
  protobuf.js (reflect) was  7.7% ops/sec slower (factor 1.1)
          JSON (string) was 77.8% ops/sec slower (factor 4.5)
        google-protobuf was 78.7% ops/sec slower (factor 4.7)
          JSON (buffer) was 79.7% ops/sec slower (factor 4.9)

benchmarking combined performance ...

protobuf.js (reflect) x 1,057,638 ops/sec ±0.14% (96 runs sampled)
protobuf.js (static)  x 1,106,991 ops/sec ±0.19% (98 runs sampled)
JSON (string)         x   491,279 ops/sec ±0.16% (99 runs sampled)
JSON (buffer)         x   420,535 ops/sec ±0.21% (99 runs sampled)
google-protobuf       x   462,041 ops/sec ±0.31% (95 runs sampled)

   protobuf.js (static) was fastest
  protobuf.js (reflect) was  4.4% ops/sec slower (factor 1.0)
          JSON (string) was 55.6% ops/sec slower (factor 2.3)
        google-protobuf was 58.3% ops/sec slower (factor 2.4)
          JSON (buffer) was 62.0% ops/sec slower (factor 2.6)

公式サイトに掲載されているデータは、Node.js 6.9.1(V8 5.1系)であり、JSON.parse()の改善前のものでした。 今回のNode.js v20によるデコードの結果を見ると、差はやや縮まっているように見えますが、それでも4倍程度はprotobuf.jsのほうが早いことがわかります。

Protocol Buffersがなぜこんなにも早いのかを考察してみます。MessagePackでは文字列のデコードが遅いことが分かっていましたが、Protocol Buffersでも文字列の表現(Pascal文字列)には違いがありません。そのため、(検証は行っていないのですが)Protocol Buffersでも文字列が多いデータのデコードは早くないだろうと予想できます。MessagePackでオブジェクト(Map型=JSONのオブジェクトのような連想配列)を表現したい場合、フィールド名を文字列として表現しなければなりません。一方、Protocol Buffersではスキーマという形でフィールド名が事前に送信側と受信側で共有されており、フィールド名の代わりにフィールドのID(整数値)を使ってエンコードが行われます。Protocol Buffersは文字列のエンコードをしなくてよい分、早いのだろうと思います。他の要因としてデコード処理の効率化の程度の違いやデコード時の型チェックの省略による影響も考えられます。

まとめ

Protocol Buffers(特にprotobuf.js)は非常に早く、 JSONと比べて4倍以上高速 にデコードできることがわかりました。

MessagePackはJSONより遅くなる場合がありました。特に文字列を中心としたデータではパフォーマンスが出ないようです。一方、数値を中心とした単純な配列のようなデータであれば高いパフォーマンスを示しました。また、事前にスキーマを用意しておける亜種のmsgpackrを使えばProtocol Buffersに近い性能を発揮できるようです。

スキーマベースのデータフォーマットが高いパフォーマンスを発揮できる理由は、構造の情報を事前に共有してあることで、プロパティ名・フィールド名(JSONのキーに相当)のような構造の情報を実行時に読み取る必要がないためだろうと思われます。

ただ、桁が変わるほど、つまり10倍、100倍、1000倍といった大きな差があるわけではありませんでした。数KBのデータのデコードにかかる時間は数マイクロ秒程度であり、1000倍のデータ(数MB)がやってきたとしても単純計算で数ミリ秒しか掛かりません。ブラウザ上で更に大きなデータを大量に扱うという場合であれば役立つ可能性はありますが、パフォーマンスだけを考慮するならば、多くのケースでJSONでも十分だと考えられます。

一方、大量のリクエストやデータに応えなければならないサーバ側では、大量のデコード処理を行う必要が出てくるでしょう。サーバ側で使われるCやJavaのようなコンパイル型の言語であればバイナリフォーマットされたデータのデコードにおいてJavaScriptの実装よりも高いパフォーマンスを発揮できると予想されます。デコード処理を効率化できれば、その他のことにCPU時間を利用できるため、パフォーマンスは僅かながら向上するのではないかと期待できます。大規模システムではその小さなパフォーマンスの差が費用に大きな違いを生むかもしれません。

パフォーマンス以外にもスキーマベースのプロトコルには様々なメリットがあることを忘れてはなりません。スキーマによって送受両端でフォーマットの食い違いを予防すること、データフォーマットを安全に更新できること、型安全なプログラミングを実現できること、gRPC等のフレームワークに則った開発ができることなどといった利点があります。そういった他の効果も踏まえて検討をする必要があります。

今回は調べられなかったProtocol Buffersにおける文字列のデコード速度は、いつか測定できればなと考えています。また、今回はライブラリのテストケースをそのまま実行しましたが、条件の異なる様々なテストケースを作成して比較してみたいと考えています。

今回の結果はNode.jsで測定したもので、ブラウザによってはベンチマークの結果が大きく変わります。今回は記載していませんが、Safari(JavaScriptCore)や Firefox(SpiderMonkey)では JSON.parse() のパフォーマンスが異なります(その場合でもフォーマット間のパフォーマンスの差という意味ではあまり変わりません)。

ECSの起動繰り返しが及ぼす料金課金の実態

ECSの起動繰り返しが及ぼす料金課金の実態

クラウド環境が充実してきて、Webサービスのホスティング方法も多様な形になってきました。 AWSで言えば、EC2・Lambda・ECS・EKS・Elastic Beanstalk・Lightsailなどの選択肢があります。

今回はECSで開発環境向けの利用で頻繁にECSの起動終了を繰り返す処理があったことで、意外な所に余波があり、きづいたことをお伝えしようと思います。

料金形態とライフサイクルを意識する

どのサービスを使おうかと検討する際に、クラウド費用の料金と自分たちの運用・用途にあわせて選ぶことになります。

ECSは秒単位の課金がされますので、常に起動していても、任意のタイミングで起動・終了しても1ヶ月でかかるコンピュートリソース料金の換算の仕方はEC2とそれほど変わりありません。

ライフサイクルとしてはコンテナ単位なのかOS単位なのかという違いがあり、コンテナの方が包括範囲が小さいです。

仮に10秒毎に起動終了の処理を繰り返したとしても1ヶ月料金に近い料金がかかるくらいだろうという推測でした。

クラウドで複数サービスを使うということ

クラウドでは複数のサービスを組み合わせて便利に使うことが多く、今回気づいた「意外な所に余波を及ぼしていた」という話もECS単体では発生せず、他サービスと組み合わせて発生する事象となります。

今回の環境はそれなりの規模のリソース量(金額・数量ともに)ということもあり、請求書ダッシュボードを定期的にチェックしています。その際に、他のサービスに比べて絶対的な金額としてはそこまで高くないけど、「このサービスにしては少し費用が高めだなぁと気になりました」項目がありました。それがAWS Configです。

AWS Configはリソースの構成をロギングし、評価、監査、診断ができるサービスです。 このサービスを使うと、生成されたリソース群に対して自分たちのルールに準拠された設定がされているか、などのチェックができます。

料金としては ロギングされた記録1つあたり $0.003 費用が発生します。 1件あたりとしてはそこまで高くなく、仮に1000回記録されても$3です。

ライトユーザーでも気軽に使える料金体系となっていて、利用しないという選択肢の方が少なくなってきているのではないでしょうか。

繰り返し処理の罠

今回陥った罠としてはECSの繰り返し処理でした。 リソースの立ち上げ・終了で発生する課金は、クラウド破産のパタンとして「あるある」な勘所や考慮が必要なポイントなので臭いますね。

ECSのライフサイクル特有の仕様となるのですが、EC2内でサービスを起動する時にはAWSリソースが新たに生成されることがないのですが、ECSは起動・終了の度にセキュリティグループが生成・削除されその度にAWS Configのレコーディングが発生します。

今回のECSの実行するアプリケーションでは、起動時に関連サービスの状態をチェックして「起動する必要がない時は終了する」という処理にしてありました。

この起動・終了を繰り返す処理が非常に短い間隔で行われていたことから、AWS Configのレコーディングログが大量に生成されていました。想定より50〜100倍程度課金が発生してしまっていました。

EC2インスタンスを立ち上げて、待ち受けるのとそれほど変わらない処理に見えても、AWSリソースにアクセスし・操作・トラフィックが流れているという状況では、利用している全てのサービスに気をかける必要がありますね。

運用を始めてすぐのリソース使用状況だと積み重ねがされていないのできづきにくいけど、定期的に費用のチェックをしたりBudgetアラートを仕込んだり項目ごとに適切にしていく設定値を見直していくことで、きづけるようになります。

対策と運用について

コンテナでサービスを起動するというやり方は変えず、ECSは使い続けました。 関連サービスの状態でサービスを起動するという方法をやめました。

というのも、関連サービスの状態が変わるタイミングは手動実行をしていたので、同じタイミングでこのECSアプリケーションも起動・終了をするようにしました。

起動スクリプト修正さえ対応すれば、運用上の手間やフローは今までとそれほど変わらず、Croud Configの料金を想定通り1/10程度に抑えることができました。

まとめ

今回の事例から、あらためて以下のような学びがありました。

  • 空気のようにあるようなサービスにも気を使おう
  • 運用とライフサイクルを結びつけて最適なクラウドサービスや処理方法を検討する
  • 何にどれだけ料金が発生しており妥当かどうかをチェックすることは大事

AWS Lambdaでも「再帰ループ」の検出と停止ができるようになりましたが、意図したイベントループ・繰り返しの場合でも注意が必要です。 考慮漏れはどんな時でも発生し得るので、きづけること・原因を把握できるようになっていきたいです。

参考サイト

新卒1年目からのリモートワーク生活 1年くらい経ってみての感想

はじめに

 はじめまして!

 アットウェアでエンジニアをやっているニシカワと申します。

 アットウェアがリモートワーク制度を導入してから約1年と半年が経過しました。

 横浜に残って働くという選択をしたメンバーがいる中で、過去のリモートワークについて書かれた記事で紹介されたように、全国に移住していくメンバーもいました。

 私も移住を選択した1人です。

 当時の私は新卒1年目。右も左も分からない状況でした。そんな状況でどうして移住を決断したのか、実際に生活してみてどうだったのか、自身のふりかえりも兼ねて記事にしてみたいと思います。

移住のきっかけ

 突然ですが、私は現在、兵庫県の豊岡市という街に住んでいます。

 

 関東圏に住まれている方にはあまり馴染みのない地名かもしれません。コウノトリや城崎温泉が有名な、人口7万人ほどの街です。

 引っ越す前、私はアットウェアがある横浜に住んでいました。

 横浜に住んでいたときは、よく近くの公園で散歩したり近所の商店街で食べ歩いたりと、平凡ながらも楽しく暮らしていました。

 

 しかし、そんな中で、ずっとこのままでも良いのだろうかと思い始めました。たしかに今の生活には満足している、しかし、毎日同じような生活で何か得るものはあるのだろうか、と。

 もともと色々なところに行くことが好きで、学生の頃は青春18きっぷで日本各地を巡っていた身です。一箇所にずっといることがむしろ苦手だったのかもしれません。

 そんなこんなで地方移住しようと思ったのですが、問題は行き先です。それに関しては幸いなことに候補がいくつかに絞られていました。

  • 小田原市

  • 京都の二条付近

  • 豊岡市

 いずれも過去に訪れたことがあり、良さそうな場所だと感じていました。ただ、どうせ行くなら一番遠く、日本海側にしようと思いました。

 それで豊岡市に引っ越したのですが、住んでみると住み心地が良くて、気が付いたら1年くらい経ってしまいました。

業務内容とか1週間の流れとか

 せっかくなのでエンジニアらしく技術的なこともちょこっと書いてみます。

 現在の仕事は、特定の画像データから抽出された情報をまとめたサイトの開発・運用を行っています。技術スタックは、React、Java、AWSあたりを使って開発を進めています。

 

 学生時代に一応プログラミングの経験はあったものの、チーム開発の方法やテストの手法など、入社してから初めて学んだことも沢山あります。

 1週間の流れは、過去のリモートワークについて書かれた記事で紹介されている方達とあまり変わらないです。平日は業務、週末は家でゆっくり過ごしたり外に遊びに行ったりします。出勤の時間がない分、趣味や勉強の時間は取りやすいと感じてます。

 ただ、リモートワークだと徐々に運動をしなくなってしまうので、そこだけ注意しています。

1年くらい経ってみての感想

 移住から1年くらい経ってみて、意外とリモートでも働けるなという感想をもっています。

 開発はクラウドサービスが主なので現地に行かなくても作業できます。作業で止まったときは、Discord(通話アプリ)にチームで常駐状態になっているので、すぐに相談できる環境にあります。どうしても1人だけの環境だと心が荒れていく(個人的な見解です)ので、適度にチームや会社の仲間と話す時間は大切だと実感しました。

 それでも、リモートワークが出社に勝るかと問われれると、一概にそうとは言い切れないと思います。移住してからしばらく経ち、チームの雰囲気にも大体慣れたかなというタイミングで出社の機会があったのですが、普段とはまた違う良い時間となりました。

 出社の際は、同じ画面を見ながら実装することで、リモートワークでは得られない適度な緊張感や一体感に包まれ、チームの仲間との絆を深めることができました。

 仮にこの1年を出社して過ごしていたとしたら、直接の交流から得られる力で、また別の学びがあったと思います。

 リモートワークと出社、どちらか極端に偏るというよりも、チームの状況や雰囲気に合わせて適度に使い分けることが大切だと感じました。

週末の楽しみ

 プライベートなことだと、日本海側の冬を経験し、雪の大変さを実感しました。横浜は雪が降ってもせいぜい数cmですが、豊岡市の雪は足が埋まります。雪用に新しく長靴や上着を買ってなんとか乗り切りました。

 

 買ったものつながりだと、車も買いました。必要なものは徒歩で買える場所にあるのですが、車があると遠出の際に便利です。 

 週末は家でゆっくり過ごしたり外に遊びに行ったりしますが、時間があるときは京都や大阪まで足を伸ばします。

 写真は日本三景の天橋立です。自宅から車で2時間くらいの距離にあり、週末のドライブにもってこいの場所です。

おわりに

 この1年を振り返ってみて、色々とやりたいことができた1年になったと感じています。

 エンジニアとしては将来に繋がる開発のスキルやチームで動く大切さを学び、プライベートでは様々な場所を巡ることができました。

 新卒だからという枠組みに囚われず、自らが得たいものを考えて生きることが大事だと思いました。

 課題への素早い対応や他のメンバーへのサポートなど、まだまだ学ぶことは多いですが、自身の成長に繋がった1年だったと思います。また、学びを深め、いつかリモートワークで海外生活もしてみたいという憧れも芽生えました。

 将来、また横浜に戻り出社を選択するのかは分かりません。しかし、リモートワークであっても出社であっても、エンジニアとして根本的なこと、チームで協力して全力で課題の解決に望むことや、atWareのミッションである「システムで人々をしあわせに」ということは決して変わらないと思います。

 今後も、この1年で学んだことを活かし、一生懸命励みたいです。

VPC Traffic Mirroringを使ってみた話

今回はAWSのVPC Traffic Mirroringについて、某案件で検証を行なったので、紹介/注意点/使い所について書きます。

展開中のノードへの通信をサクッと覗きたいなど特定用途として使えるケースがあると思うので参考になればと思います。


はじめに

  • 今回導入を考えたシステムについて、顧客からの要件としては外部システムから本番環境への通信をテスト環境へ転送し、本番環境と同一のデータでテストを行いたいというものでした。
  • 複数ある外部システムとはWebSocketでそれぞれとコネクションを確立し、システムは一度に最大100MB程のデータpushを受信し続けます。
  • VPC Traffic Mirroringを利用してデータの転送が可能であるかを検証し、使えそうならシステムに組み込みたいという流れです。

VPC Traffic Mirroringの概要

  • 大まかにいうと特定インスタンスのNIC(ENI)に流れてきたネットワーク上のpacketを特定のノードへ転送することが可能です。
  • AWSからの説明そのままですが、ユースケースとして以下のようなものを想定しています。
    • コンテンツ検査
    • 脅威の監視
    • トラブルシューティング
  • 転送先はリージョンまたぎやVPC間も考慮されており、マネージメントコンソールのグルーピングとしてはVPCのページから設定が可能です。
  • 料金
    • Traffic Mirroringを有効にしたENIが起動している間、料金がかかります。
    • 東京リージョンであると0.018USD/hour(2023/2現在)
      • 1ヶ月30日とすると30日×24時間×0.018=12.96USD/month
    • そこまでの値段ではないですが、転送先の仕組みなども用意することも考えたら使う時だけ有効にするのが良いかと。

動作/設定

  • Traffic Mirroringを使う際のリソースは以下の呼称で呼ばれます。以降の説明はこの呼称でしていきます。
    • ソース: 転送元(指定したノード(ENI)への通信を転送)
    • ターゲット: 転送先(EC2/NLB/GLB(他VPC宛など))
    • フィルタ: 転送対象(ポート/プロトコルなど指定)
    • セッション: 上らをまとめたもの
    • 設定例は以下。
      • ミラーフィルタ/ミラーターゲット/ミラーセッションの順に上記リソースを設定します。

ターゲット側の準備

  • 転送されてきたpacketをどう扱うかターゲットに仕組みが必要です。
  • 例1. packet解析ソフトウェアにかけて分析
    • tcpdump
    • Wireshark/tshark
    • AWS公式からは以下のようなツールも紹介している
    • 例えばtcpdumpでpacket captureし、出力されたpcapをS3に置くなど。
  • 例2. packetを処理するようなアプリを自作する
    • ターゲットのNICに対しpacket captureをするようなアプリを自作する。
    • この際、転送されてきたpacketのみ処理するような仮想NICを作るなど工夫がいる(後述)
    • 検証ではGo(gopacket)/Java(pcap4j)でアプリを実装した実績あり。

転送されてくるpacketについて

  • ターゲットに流れてくるpacketはVXLANというL2->L3トンネリングプロトコルの形式で流れてきます。
  • VXLANはUDPで扱います。なので再送/フロー制御は期待できません。また、NLBなどを転送先にする場合には順番が維持できないことがあるとのこと。
  • packetにはVXLANのヘッダ(40byte)が付与されており、その後ろに元のpacketが繋がる形。
  • すなわち、元のpacketを取り出したい場合にはVXLANヘッダ部を取り除く必要がありますが、LinuxであればVXLANタイプの仮想NICを以下のようなip(iproute2)コマンドで作成することで自動的に行うことが可能です。
    • 作成した仮想NICをcaptureすることでVXLANヘッダを除外した元のpacketを取得できます。
    • VNIというVXLAN packetのグループを識別するためのIDと転送時に使用するUDPポートを指定します。(マネージメントコンソールで設定した値)
    • Amazon Linux2で動作確認済み。(kernel versionやdestiributionの細かいところの条件は未確認)
    • NICのMTUについての注意もあるので参考に。
      • 説明の通り、VXLANで転送されたpacketはオリジナルpacketよりHeader分サイズが大きくなります。
      • そのため、ソースNICのMTU < ターゲットNICのMTUという関係になっていないとpacketが切り捨てられる可能性があります。(必要なMTUサイズ設定については上のリンクを参照)

$ sudo ip link add vxlan0 type vxlan id 1 dev eth0 dstport 4789
$ sudo ip link set vxlan0 up


検証とそこから見えた注意点

  • 実際の構成を想定して右図のような仮の環境を用意し、要件に合うか検証してみました。

問題

  • 想定するデータ量を外部システムノードからソースに送信->転送した際、分割されたpacket群の途中から転送されて来ない。。。
    • WebSocketでデータpushするデータを1MB/10MB/100MBと順に上げていってみたところ、10MBぐらいから後半のpacket転送がされていないことが判明しました。
    • ソースに配置したアプリへは正しくデータが送られており、最初はターゲット側のpacket captureアプリ設定なりがおかしいのかと思い試行錯誤したがどうもうまくきません。

原因

  • 「なんでじゃ」と夜も寝られなくなった中、よくよくヘルプを見直すと次のようなものを発見しました。
  • Traffic bandwidth and prioritization
    • Mirrored traffic counts toward instance bandwidth. For example, if you mirror a network interface that has 1 Gbps of inbound traffic and 1 Gbps of outbound traffic, the instance must handle 4 Gbps of traffic (1 Gbps inbound, 1 Gbps mirrored inbound, 1 Gbps outbound, and 1 Gbps mirrored outbound).
      • つまりは、ソースの帯域幅について、想定するトラフィックの2倍〜4倍を見積もっておかないといけない。
      • 今回の要件では上り方向への通信のみ転送したいので本番+テスト環境のインバウンドトラフィック用に2倍必要。
      • ポイントはソース(転送元)の帯域幅が大事ということ。
    • Production traffic has a higher priority than mirrored traffic when there is traffic congestion. As a result, mirrored traffic is dropped when there is congestion.
      • つまりは、ソースの帯域が輻輳した場合、packetがドロップされ転送されない。
  • 問題が起きた流れとしては、以下と考えられます。
    1. 大きいデータをソースに向けてドカっと送る
    2. ソースの帯域で輻輳が起こる
    3. 輻輳のために本番トラフィックが優先される
    4. データの途中から転送が行われなくなる
  • ヘルプの通りCloudWatchを監視してみたところ、データ転送に失敗した場合、輻輳によるpacket dropのメトリクスの値が増えており、上記の制限によりpacketがdropされてしまっていることがわかりました。

対策検討

ソースへの通信の輻輳が起こらないようにデータ流量をコントロールできれば良いのではと思い、以下のようなことを試してみました。

  • ソースのインスタンスタイプを上げて、ネットワーク帯域を強いもの(c5n.largeなり)に上げてみる。
    • 100MBを一斉に送ると、変更前よりも転送された量は多くなったが、後半のpacketがdropされてしまう。
  • ソースで輻輳が起こらないようなインスタンスタイプの関係にしてみる。
    • 外部システム(t2.micro) -> ソース(c5n.large)というようにソースへの通信がゆっくり流れる(?)であろう関係にすると100MBのデータも転送ができる場合が増えた。
    • 当然ながら転送対象のデータだけがネットワーク上に流れているわけでもないため、うまくいったりいかなかったり完璧ではない。
  • AWSへ質問を出してみる。
    • どうにかして輻輳を起こらないようにする方法がないかAWSへも問い合わせてはみましたが、今回用途に合致するような方法は見つからなかった。
    • NLBなどにはデータ流量をコントロールするような機能は公開されていない。
    • また、流量をコントロールする用の別ノードを用意するのは今回用途(テスト環境に流す)に対して、対応が大きすぎる。本番環境に影響が出ては元も子もない。

結果

対策の検討結果より、今回用途に適さないところから「使用しない」という結論に至りました。

  • テスト環境へのデータ転送のためpacket dropしても問題はないが、本番環境と同じデータで動作再現したいことから極力dropは避けたい。(そもそもVXLANがUDPということもある。)
  • インスタンスタイプ(ネットワーク帯域)による制御については、今後増加しうる外部システムが増えるごとにサイジングし続けないといけなくなり、現実的でない。
  • 流入制御する別ノードの必要性など本番環境に影響を与えない形での実現が難しい。

まとめ/使い所

  • 「稼働中ノードへの通信を少し覗き見したい」などのケースにおいてはとても有用なプロダクトかと思います。
    • 通信の監視がアプリ組み込みせずとも後付けで可能。
  • システムに取り込むような本格的な利用となると、検証結果を踏まえて以下のポイントを抑えておくと良いかと思います。
    • 転送するデータ量がどのくらいか
    • packet欠損が起きても問題がないか
    • ソースのネットワーク帯域が輻輳を起こさない環境であるか
  • 制限事項がいくつかあります。特にここは一通り目を通しておくべきです。
    • 検証内容から得た教訓として「困ったら基本に戻ってヘルプを読め」というのを実感させられました。
  • その他参考

以上。

yamoryという脆弱性管理サービスを実案件で活用しました

yamoryという脆弱性管理サービスを実案件で活用しました

前エントリーでは組織として社内へ脆弱性対策への取り組みの一環として、yamoryという脆弱性管理サービスを導入するまでをお伝えしました。 今回はyamoryを実践で実際に使ってみて、各々が個別に最適して工夫した所や所感をご紹介したいと思います。

最初はImmediate(即時に影響を受ける可能性)を無くすところから

1つ目の適用プロジェクトの事例です。

スタートアップ系の案件となります。ビジネスモデルを立証や確立を目指していくところから始めるので、コストも限られていて機能実装のバランス感覚が非常に重要になってきます。

プロジェクトが始まってから数年経過していますが、現在もユーザを獲得したり市場の要望に応えていくフェーズの真っ只中で、たくさんのモジュールや個別対応などシステムも大きくなってきています。

その中には初期頃に作ったモジュールも含まれており、特段理由がなければライブラリを最新バージョンにはアップグレードせず、当時の最新版を利用しているモノもありました。

社内にyamoryが導入されたということで、試しにyamoryを使ってスキャンしてみたところ、幾つかキャッチできていなかった危険な脆弱性が見つかり、取り急ぎ対応しました。

やはり、逐一開発チームだけで脆弱性情報をキャッチしていくには時間の都合上無理があるとは感じていたので、yamoryがあると非常に助かるということで、チーム内で相談して本格導入が決まりました。

yamoryを導入すれば脆弱性情報が公開されて即時に対処できるようになるので、対応基準とフローを検討することにしました。

対応方針

  • 危険な脆弱性は迅速に対応して0を維持する
  • 週間レポートで脆弱性が発生したら普段使っているITS(課題管理システム)でチケット化して対応する
  • MinorやDelayedについては把握はしておき、いつ対処するかは状況によりけりということにする
  • 判断できる基準を設けてワークフローを策定し作業をルーチン化する

ということにしました。

ざっくり言うと、赤タグ(Immediate)は逐次対応して即時リリースしていくという方針です。基本的には遅くとも1週間ごとに対応が回っていきます。

yamoryで自動スキャン・作業をワークフロー化することにより、着手予定の実装・運用系タスクやスプリント目標に影響せず、リソースも集中してリズムよく取り組めています。

以下のワークフローが、今回決めて取り入れたバックエンドのJava/Springフレームワークモジュール向けのもので、この他にもフロントエンド向けのワークフローも作りました。

yamory対処ワークフロー

今回立てたワークフローと方針で暫く試してみると、想定していた運用ができ、うまく回っていきました。

手始めにプログラムモジュールに対して脆弱性のスキャンを適用しましたが、Dockerコンテナで運用しているシステムもあります。yamoryにはコンテナの脆弱性スキャン機能も用意されてされているということで、どうするかを検討しています。 コンテナイメージの共有スコープは極力狭めたいという考えがあり、コンテナのスキャンについてはyamoryで行うか、それともコンテナをホストしているクラウドベンダーが提供しているSaaS機能を使うかが焦点になっています。 簡単でしたが、1つ目の脆弱性管理の実践の紹介でした。

CIに簡単に組み込めて安心感を得ることができました

次に、2つ目の適用プロジェクトの事例です。

新規事業のスクラッチからの案件で、スピード感を高めてフィードバックループのサイクルを早めていくことはもちろんこと、機能開発もどんどん行っています。

まず、チームには脆弱性対応へのアイディアとしてyamory活用の提案を出し、採用を即決し、存在する全てのリポジトリのCI Hookにyamoryを追加しました。

設定後は、だいたい月曜日にメールで脆弱性検知の通知が届くので、通知に「気づいた人が対応する」という運用で始めてみました。

暫く運用してみると、yamoryを採用したいと言った人が率先して対応していく流れになり、気づけばいつも特定の人(採用を推進した人)ばかりが対応しているという状況が生まれてしまいました。

個人依存にはしたくないなと思っていたところ、定期的に立てているプロジェクト全体目標の中に「様々なことで個人依存を減らし自動化をすすめる」というモノがあり、チームで対応策を考えてみました。

検討した結果、「検出したらチケット管理システムに脆弱性検知チケットを起票し、チームリーダーが担当者を割り振る」という案が出て、それを実行してみることに決めました。

これで、誰かが率先して対応するという形ではなくなりましたが、誰もが脆弱性対応に貢献できるようになりました。

続いて、yamoryを導入して気づいたことや所感をお伝えしたいと思います。

お悩み発生

yamoryを導入してからは「あぁ、これアップグレードをしないと...」と気にかけなくても済むという安心感を得ることができ、開発リソースも少なく済むという時間を得られた反面、導入した副作用のような悩みも発生しました。

それは何かというと、サービスの課金体系とプロジェクトのモジュール管理体系との兼ね合いです。

本案件ではイベントドリブンでデータを処理するバリエーションが多く、Serverless Functionのモジュールをたくさん用意しています。バリエーションが多い分、コードリポジトリをたくさん作っていたのです。

yamoryは契約毎に「合計スキャンアセット数の上限」が決められており、超えてしまうと追加でパック購入する必要が出てきてしまうそうで、もしかしたら「他プロジェクトや予算を圧迫してしまっているのではないか」という懸念に気づきました。

リポジトリの分け方は、開発スタイルやアーキテクチャ設計や運用設計にも影響してきます。yamoryで契約している数を超えないように、「節約のために本来しなくてもいいモジュールをまとめたり、リポジトリの数を節約しようかな」という意識がでてきます。

他にも、お金とリソースの配慮面でステークホルダーが増えて別視点で配慮する必要が増えました。

幸いなことに、まだ全社のプロジェクトを合わせても上限数には達していないということなので、リポジトリ数(スキャンアセット数)の精査や対応はしていませんが、yamory導入プロジェクトが増えてきたスキャンアセット数割当やプロジェクト毎に利用量に応じたコスト計算や利用料徴収などをしていくことになるのかなという将来をイメージしました。

さらにデータパターンなども増えてくる可能性もあるので、もしかしたら私達のプロジェクトはyamoryの料金形態と相性が悪いかもしれないのかなと。

料金によってSaaSやクラウドサービスを選択したりアーキテクチャを設計するように、yamoryもSaaSと考えれば、料金形態と案件特性との相性で取捨選択をしていき、設計や運用のし易さを加味して、トレードオフすることになりそうです。

ちょっとしたツラミ

もう一点気になったことが、依存ライブラリが内部で使っているライブラリに脆弱性が発見された時の事象です。緊急性が高くないMinorな脆弱性だとyamoryのトリアージで「今は対応しない」としてマークし、検知情報を消し込むのですが、暫く経つと同じ脆弱性がスキャンすることで検知されてしまい、「またこのライブラリが...」となって、警告に対して億劫になってしまいました。

感想をまとめると

悩みは発生したものの基本的にはyamoryを導入してよかったです。 想定していた課題感が別に出たのも興味深かったです。

その他には以下のようなことを感じました。

  • 安心感を含め心理的な影響は多大だなと実感した
  • 脆弱性検知ツールに頼るということは違うプロジェクトでも活用できそう
  • 導入の敷居の壁は料金次第で技術要素としては問題なくフィットする
  • 脆弱性検知ツールの仕様有無に関わらずセキュリティ情報はベストエフォートでキャッチするし情報交換するということはしたい
    • 安心できるから何もしないということにはならなかった
    • 世の情報を全部把握するということを課さなければ負荷に感じない
    • もしかしたら情報収集は一種のライフワークかもしれない

まとめ

今回は2つのプロジェクトで実践した結果のご紹介をしました。 CIに組み込みやすいということで、導入しようと実践したプロジェクトではすんなりと設定・運用までもっていくことができたようです。新たな気づきもありました。

いくら脆弱性対応をしても何かが便利になるというわけではありませんが、安全にシステム運用してユーザさんにも安心してサービスを使い続けて頂くには必要なことですので、これからも目に見えない持続的な価値提供をできように取り組みを拡げていきたいと思います。

心を合わせてともに働く前にやるといいかもしれないワークショップ資料を公開します

心を合わせてともに働く前にやるといいかもしれないワークショップ資料を公開します

突然ですが...

  • チームで仕事をすることってよくありますか?

  • チームで仕事をする際、人間関係に起因しそうな問題で、ストレスを感じることってありませんか?

  • もっともっと効果的なチームになりたいですか?

上記のような問いにあてはまる方は、ぜひ読んでみていただければなと思います。

かくいう私達も上記の問いにはあてはまりますし、なんとかしたいなぁと思っています。そして、私たちは人間の力、そしてチームの力を信じています(信じたい、信じられるシチュエーションを増やしたい。の方がより適切かもしれません)

異なる背景を持ち、違う考え方をするもの同士が「共通の目標を達成するのだ!」

と話し合い、その過程でおきるであろう化学変化と、その結果に価値があると信じています。

効果的な化学変化を生み出すために必要なことはいくつかありそうですが、チームメンバーがお互いのことを知り、安心して意見を言い出せる関係もその一つだと思っています。

このような世界を作ることに貢献できることを期待して下記のようなワークショップをデザインしてみました

  • 参加者が「これからともに働く上で知りたい/表明しておきたい」価値観を洗い出す

  • 上記で洗い出された価値観について、各々が自身の考え(価値観)を表明し、お互いにそれを理解する

  • 上記で表明し理解した、お互いの価値観を尊重する約束事を作成してみる

そして、このワークショップの名前を「心を合わせてともに働くときにやったほうがいいかもしれないワークショップ」と名付けてみました。

具体的にどんなワークショップか、ワークショップ資料をダウンロードしてのぞいてみませんか?もし気に入っていただけたら、ファシリテーターズガイドも用意しているので、すぐにお試しいただけるかなと思います。

資料は以下からダウンロードできます。

ご参考までに、我々が想定しているユースケースの一部を共有してみます。

  • チームが発足したとき

    • チームビルディングの一環として

  • 現在のチームの効果性をあげたいとき

    • チームメンバのことをもっと理解する試みの一環として

  • その他(もしかしたら、下記のケースでも使えるかもしれません)

    • 学校で、新しいクラスになったとき

    • チームスポーツで、チームとして纏まりたいとき

    • 結婚前提のお付き合いを始めるとき

おまけに、弊社内でこのワークショップを実施した際の意見のいくつかを共有してみます。

  • 下記は参加者6名からのフィードバックの5段階評価をグラフ化したものです

  • これは良いものだと思いますね。共有すること・発信することは大事だと思います
  • 時間が足りなくてマニフェストは作成できませんでしたが、対話で価値観のすりあわせができました
  • 新しくチームを作る時はやれたらいいな、と思いました

このワークショップが、よりよいチームになることへのキッカケになれば幸いです。

板垣 哲二、栗山 弘子、梶平 昌邦