Classi開発者ブログ

教育プラットフォーム「Classi」を開発・運営するClassi株式会社の開発者ブログです。

セキュリティインシデントと大規模障害を経てClassiは開発組織をどう変化させたのか

こんにちは、元テックリード、この10月からVPoT(Vice President of Technology)に就任した、Classiの丸山(id:nkgt_chkonk)です。

前回の記事では、前CTO(現VPoE=Vice President of Engineer)の佐々木が「Classiで発生した2つの問題を繰り返さないために我々が取り組んでいること」というタイトルで、社内体制を変更したことをお伝えしました。

今回はわたしから、組織体制の変更の背景や、現在どのような体制で、どのような課題に取り組んでいるのかをさらに詳しくお伝えしたいと思います。

4月~5月にかけての2つの問題の原因となった「甘え」

前回の記事でお伝えしたとおり、2020年の4月〜5月にかけて、Classiは外部の攻撃者による不正アクセスおよびデータの漏洩という大きなセキュリティインシデントと、アクセス増による大規模なアクセス障害を起こしてしまいました。その根本的な原因は、長い間取り組むべき課題の優先順位を間違えてしまっていたというひとことに尽きると思っています。

なお、セキュリティインシデントの直接の原因については、すでに対策を講じており、外部のコンサルタントの協力を得て、さらなる改善を継続的に行っております。この記事では、遠因となった組織体制の問題について述べたいと思います。

アクセス障害の背景として、Classiは学校が導入し、年間を通じて使っていただくサービスであるという特性上、突発的にユーザー数が大きく増減することのないサービスでした。そのため、たとえば、他のコンシューマアプリなどのように、テレビで紹介されていきなりアクセスがスパイクする、というような急激なアクセス増加の蓋然性は低い、という「甘え」が、技術上の意思決定層に存在していました。実際には、今回の新型コロナウイルス感染拡大に伴う学校一斉休校のように、社会の状況が変われば、サービスの使われ方は変わり、負荷のかかり方も大きく変わることが生じてしまったわけです。

さらに、今となって問題を振り返ってみると、当時から「もっと既存のサービスを改善していくべきだ」「もっと投資のバランスを検討したほうがいいのでは」という声が、社内の開発現場からしっかりと上がっていたにも関わらず、きちんと現場の課題を見極めることができず、先延ばしの意思決定してしまっていたことに対して、後悔の気持ちでいっぱいです。

CTOの果たすべき役割の変化を認識できなかったという反省

なぜこのような状況を生み出してしまったのかを改めて考えたとき、わたしたちは「サービスのフェーズが変わって、それに応じて意思決定のあり方も変化していかなければならなかったのに、変化できていなかった」ということに気づきました。

佐々木のCTO就任当時は、ふたつの大きな課題が存在していました。ひとつは「学校 x ICT」というのは今と比べても未知なことが多く、学校現場に求められているサービスがどんなものなのかまったくわからないし、それを理解しにいくための足がかりすらない中でサービスを作らなければならなかったこと。もうひとつは、サービス開発のノウハウが社内にほとんどない中で、手探りでサービス開発を進めなければならないこと。

このふたつの課題に対して必要となるCTOの役割は、強い推進力であったと思います。なにがなんでもサービスを形にして、まずは協力してくださる学校に使ってみてもらうこと。ゼロからはじめて、オーナーシップを持って意思決定して、やり遂げる力こそが、CTOに求められる役割でした。その中で、佐々木は替えの効かない役割を果たしてくれたし、その結果として、多くの生徒、先生、保護者のみなさまにサービスを届けられるようになったことを、わたしは(あとから入ったメンバーではありますが)誇りに思っています。

しかし、サービスの拡大にともない、開発に関わるメンバーが増えるに応じて、CTOが本来担うべき役割は、わたしたちが気づかないうちに変化していました。多くの機能が存在するサービスに対して、一人ですべての意思決定を行うことはできませんし、技術的な課題に対しても目が届かなくなっていきます。本来であれば、サービスの拡大に伴い、開発現場の課題をよくわかっているメンバーに意思決定を移譲していかなければならなかったところ、オーナーシップを持って意思決定してやり遂げる役割のまま、CTOに意思決定が集中するという状況を生み出してしまいました。どのような課題に取り組むか? そのために誰になにをやってもらうか? そのために必要な人材の採用・育成は? という全てをCTOが決定する形になっていたわけです。

その構造が、開発現場から「これはまずい」という声が出ているにも関わらずそれを吸い上げきれない、という状況を生み出してしまったし、アクセス障害などの緊急時に意思決定のボトルネックとなってしまったと感じています。

意思決定をプロダクトチームへ移譲

以上のような反省のもと、最初は全ての機能、すべてのコードに対して、どのプロダクトチームが責任を持つかを決めることから体制の再構築をはじめました。その上で、各チームにチーム責任者と、テックリードという役割を置きました。

チーム責任者は、一般的にプロダクトオーナーと呼ばれる存在に近く、自分のチームの責任範囲にあるサービスで取り組むべき課題の優先順位を決定する責務を負います。

テックリードは、技術的な「やばいところ」に目を光らせ、チーム責任者に対して技術的な課題の優先順位を提案します。今までは、テックリードは全体を見る役割でわたしひとりだったのですが、今回テックリードの役割を再定義し、それぞれのチームの中の技術に責任を持つように変更した形です。

また、各チームが抱えている課題を解決するために必要な開発プロセスの改善や、採用戦略についても、プロダクトチームが一人称で動いていけるように、権限の移譲を進めています。

そのような体制を作っていきながら、何度も現場のメンバーに今なにに困っているかや、最近よかったことをヒアリングをしました。その結果、現体制の良い点として、ようやく技術的にもサービス的にもプロダクトを改善するために力を使えるようになったという声を聞くことができ、この点に関しては一定の成功を収めていると言えそうでした。

一方、「チームの中で技術的な決定をしていくことに不安がある」「プロダクト改善をはじめた結果、別のところに組織的なボトルネックを感じはじめている」「プロダクトチーム内で意思決定するとはいえ、会社としての意思決定の軸がなくて困っている」「このプロダクトの価値を判断するための会社としての指針が欲しい」というような声も上がってきました。その他にも、「自分の伸ばしたいことと今やっていることに乖離がある」「仕事の仕方を相談できる相手がいない」などの、仕事のしやすさや働き方についての問題点を指摘する声も聞こえてきました。

責務を見直してVPoTとVPoEによるスケーラブルな体制を構築

ちょうどその頃、佐々木と丸山を中心に「CTOの役割の再定義が必要」という課題に取り組んでいたこともあり、「こういう、プロダクトチームの内部だけでは解決できない問題に対して、解決となる構造を与えるのが、現在のClassiに求められるCTOの役割ではないか」という議論を進めていきました。その結果として、

技術的な視点として:

  • 各プロダクトチーム間にトレードオフが生じるときに、そのトレードオフをどこに落とし込むのかを決める意思決定の役割
  • テックリードが迷った時の駆け込み先
  • Classi全体の技術的アセットを健全に保つ仕組みづくり

というような役割を、

また、メンバーマネジメントの視点として:

  • CTOや部長が少ない人数で全体を見るのではなく、各メンバーに対してエンジニアメンターを置き、さまざまな悩みに対して最初の相談先を明確にする
  • そのエンジニアメンターが拾い上げた相談ごとのうち、組織として対応が必要なものを解決する仕組みや構造を作る役割
  • エンジニアが成長し、キャリアを積んでいける仕組みづくり

というような役割を、今のClassiのCTOは果たすべきではないか、と仮定しました。

この仮定をもとに佐々木と協議したところ、ふたりは得意分野が異なり、わたしはメンバーマネジメントが得意ではないけれど、技術的な視点では役にたてるところがあると感じていること、一方で佐々木は、メンバーマネジメントの分野で多くの現場メンバーから期待されていることが見えてきました。

そこで、今のClassiでは、CTOの役割を

  • 技術を見るVPoT
  • 人を見るVPoE

に分割した上で、VPoTを丸山、VPoEが佐々木が担う体制を作り上げました。

この体制の運用は始まったばかりで、まだ何がうまくいって何がうまくいかないかは十分には見えてきていません。VPoTとVPoEにはこういう役割が必要なのではないか、と立てた仮説も、まだ十分に検証されてはいません。一方で、この方向に改善を進めていくこと自体に間違いはないという手応えも得つつあります。

ClassiのMissionである「子供の無限の可能性を解き放ち、学びの形を進化させる」を実現するために、仮説を立てて終わりではなく、それで本当に子供の無限の可能性を解き放ち、学びの形を進化させるためのプロダクト作りに寄与できているのか? ユーザーのみなさまの学びの機会を奪ってしまうような失態を繰り返さないための構造を作れているのか? ということを定期的に問い直し、前向きに組織の改善を続けていきたいと思っています。

終わりに

Classiは、大きな失敗により、多くの先生・生徒・保護者のみなさまに多大なるご心配と迷惑をおかけし、多くの信頼を失ってしまったと思います。しかしながら、当社のメンバーは「子供の無限の可能性を解き放ち、学びの形を進化させたい」と本気で強く思っており、この思いの強さには自信があります。このMissionに向かっていくためには、一つひとつ、いまある課題を解決していく必要があると思っています。わたし自身、新しいポジションについたばかりで、毎日失敗を繰り返しながら、すこしずつ学びながら課題に向き合っています。

そして、これらの課題に取り組み続けるためには、今後も多くの力がClassiには必要になってきます。そのため、今、Classiでは、この大きなチャレンジに力を貸してくれるエンジニアを、積極的に募集しています。決して天国のように整った環境ではなく、むしろたくさんの成長痛をともなうような現場ではありますが、手強く解きがいのある課題が盛りだくさんで、自分が手を動かせば動かしただけ課題を解決できる、力を振るいたいエンジニアにとってはその力を存分に発揮できる現場ですし、「天然物」の課題に取り組む中で大きく成長できる現場だと思っています。

Missionに共感していただけて、腕に自信のあるエンジニアはぜひ、採用情報からご一報いただけるとうれしいです。一緒に課題を解決していきたいです。

Classiで発生した2つの問題を繰り返さないために我々が取り組んでいること

はじめに

こんにちは、Classiの佐々木(@sasata299)です。前回の投稿からだいぶ間が空いてしまい、季節はすっかり秋になってしまいました。

この期間、Classiでは外部の攻撃者による不正アクセス(4月)があり、また、サービスの高負荷によるアクセス障害(4月・5月)が続くなど、利用者の方々には多大なるご心配とご迷惑をおかけしました。この9月までClassiのCTOとしてサービスとお客様に向き合ってきた立場として、改めてお詫びを申し上げます。

本記事では、この2つの問題について改めて振り返りると共に、当時の状況と今我々がどのように対策を進めているのかについてお伝えします。
(※当社のCTOの変更については、後日改めて記事を出す予定です)

外部の攻撃者による不正アクセスが発覚(4月)

「Classi」は、学校現場の多様なシーンで活用されるクラウドサービスです。スマートフォン・タブレット・PCなどのデバイスを問わず利用でき、先生・生徒・保護者をつなぐサービスとして、主に高校(一部中高一貫校を含む)を中心にサービスを提供しています。

「Classi」は、4月5日(日)夕刻に予期しない事象が発生し、緊急でサービスを停止しました。不正アクセスの疑いを含めて調査を開始し、外部専門会社の協力も得てログの解析等を行ったところ、外部の攻撃者により不正アクセスが行われていたこと、この不正アクセスにより閲覧された可能性(のちに漏洩であることが判明)のある情報の範囲とその内容が11日(土)に確定し、13日(月)に全国のお客様に対して公表しました。

高負荷によるアクセス障害が発生(4月・5月)

3月から4月にかけては、新型コロナウイルスの感染拡大に伴い、全国の小中学校と高校、特別支援学校への臨時休校要請もあり、「Classi」の採用校も一斉休校となりました。 皆さんご存知のとおり、Beforeコロナの学校はほぼオフラインが前提でした。それが突然、学校は休校となり、オンラインにて学校運営を行わざるを得ない状況となりました。

当時、学校現場やそれを支援する企業側でどのようなことが起きていたのかについては、多くの先生方やメディアが発信されているので、そちらをご覧いただければと思います。


一方、「Classi」を導入している学校では、普段から学校と保護者との連絡や課題提出などがClassi上で行われ、比較的スムーズにオンラインを活用した学校運営に移行できたという声をいただきました。

しかし、このコロナ禍でのサービス運営は、我々にとってもサービス開始から約6年の間に経験をしたことのない未曾有なものでした。3月以降、特に春休みが明けて1学期が始まった4月・5月には、全国規模で一斉に先生・生徒・保護者が「Classi」を利用されるようになりました。

この頃から、「Classi」の校内グループでの毎朝の連絡、学習記録での振り返りをきっかけとしたコミュニケーション、課題の提出などでの利用が大きく増え、またアンケートを使った体温調査が行われるなど、通常時とは異なる使い方が見られました。我々もリクエストが増えることはもちろん想定していたものの、想定を大きく上回る、ユーザー数で3倍、リクエスト数で7倍となったことで、4月・5月には慢性的につながりづらい状況を引き起こしてしまいました。

f:id:sasata299:20201022115225p:plain
あるサーバのリクエスト数の推移(2月1日〜5月25日)


Datadog等を見ながら負荷となっている箇所の改善を日々進めていましたが、ボトルネックとなっていた箇所を改善すると次のボトルネックが発生するという状況で、少しずつ改善はするものの根本的な解決には至らない、、、本当に苦しい日々が続きました。自分たちのプロダクトにも関わらずコントロールが効かない、まるでコントロールを失った飛行機を操縦しているような、そんな絶望的な感覚でした。

なんとかこの危機的状況を改善したいと、毎日のように社内で対策を検討し、パフォーマンスの改善はもちろん、負荷となっていた部分の機能を一部止めたり、「Classi」本体のサービスとは切り離した代替機能を準備したりと全社一丸となって全力で対応にあたっていました。

6月以降の動き

6月以降は、つながりづらい状況を引き起こす根本的な原因の調査と、その解決に向けて動く社内体制の構築を急ピッチで進めていきました。これを社内では「再建プロジェクト」と呼んでいます。

6月に入ると徐々に休校が解除となり、分散登校や時差通学などで学校への登校が再開され、リクエスト数も落ち着いてきました。安定してご利用いただける状況となったのですが、今後また休校などによってリクエストが大きく増えた際にもサービスを安定してご利用いただけるように、7月以降は「再建プロジェクト」と「セキュリティ強化」を最優先で進めています。

セキュリティ強化では、既報の外部の攻撃者による不正アクセスの再発防止策(4月時点で実施済み)に加え、より安心・安全なサービスを提供できるよう、さらなるセキュリティ強化策について検討、実施しています。4月の不正アクセスと直接関連するものではありませんが、潜在的なリスクを減らすために、フレームワークやライブラリのアップデート、ネットワーク構成の見直しなども進めています。

再建プロジェクトでは、まず現状の分析からはじめ、技術的な課題やつながりづらい状況を引き起こした組織的な課題を一つひとつ明らかにすることからはじめました。その結果、組織的な課題として、チームの責任範囲が明確でないことや、一部のリポジトリのメンテナンス責任が曖昧、といったことが根本的な原因の一つとして浮かび上がってきました。

体制変更

一つのひとつの現象と根本的な原因を丁寧に分析し、その結果に対して、適切に遂行できるよう社内の体制も変えました。

7月からは、動作しているすべてのコードに対して、チームの責任範囲を明確にしました。また、技術的な課題をそれぞれのチームの責任において改善するような動き方にも変えました。やるべきことが明確(「再建プロジェクト」と「セキュリティ強化」が最優先)で、かつ、チームが主体となって意思決定する形にしたことで、現在は各チームが担当する機能やリポジトリをしっかりとメンテナンスしていく、そんな体制になってきたと思います。

その形をより強化するために、また、やるべきことを今後もぶらさないために、「技術的負債を適切にコントロールする」「技術的な意思決定を行う」ことを責務として、10月からは各チームにテックリードを置く形に変えました。各チームのテックリードが目を光らせることで、健全にメンテナンスしていける仕組みを作りたいと思います。

これらは一例ですが、今後も間違いなく課題は出てくるでしょう。いわゆる銀の弾丸はないので、プロダクト同様、組織についても少しでも良い形にできるように改善を続けていきます。

終わりに

「Classi」は、サービスの提供から約6年で、日本中の高校の半分以上、高校生の3人に1人に使っていただく、いわばライフラインとも言えるサービスにまでなりました。今現在も多くの学校、そして家庭で、先生・生徒・保護者の方々にご利用いただいています。

ユーザーの皆さんに、本当に使いたいときに当たり前に使っていただける。今回振り返ってみて、まず我々がやるべきことは、安心・安全なサービスを、安定して提供することだと改めて強く感じています。そのためにも、引き続き、全社一丸となって「再建プロジェクト」と「セキュリティ強化」をしっかりと進めていきます。

新型コロナウイルスの影響で全国の学校が休校になってどうなったか

みなさん、こんにちは。 Classiデータ/AI部でデータサイエンティストをしている、てつろう(@tetsuroito)です。 Classiでもエンジニアやデータサイエンティストの人数も増えてきたことから、テックブログを開設し、積極的に情報を発信していこうという機運が高まり、新たにブログを開設しました。今後の情報発信にご期待ください!

新型コロナウイルスへの対応

今はどこもかしこも新型コロナウイルス関連で大変な時期に差し掛かっていますね。いち早く事態が収束することを願ってやみません。 当社でも1月末ごろからプロジェクトチームが発足し、現在は全社員が原則在宅勤務にて対応するという状況になっています。 詳細は当社のお知らせに記載がありますので、もしご興味があればご覧いただければと思います。

さて、教育業界の対応についてですが、ニュースなどでも盛んに報道された、2020年2月27日に開催された「第15回新型コロナウイルス感染症対策本部」にて、安倍 晋三総理大臣は全国全ての小学校・中学校、高校などに、2020年3月2日から春休みに入るまで臨時休校を要請する考えを表明しました。

それに伴い、当社でも全国の学校向けに一部の機能を無償で提供する対応を実施しています。

参考:新型コロナウイルスの影響で学校活動を休止する全国の高校へ一部サービスを無償提供

これまで当たり前だった学校に行って、学ぶという前提が大きく崩れ、学校へ行かずとも学びを止めないという考え方へ急遽シフトせざるを得なくなりました。実際に多くの学校でClassiを使った様々な対応を現場の先生方がなされており、その対応の臨機応変さに感動しました。

休校対応のClassiへの影響

多くの学校でClassiを活用し、学校の連絡や学習の状況についてのやりとりするという状況が始まりました。Classiでもエンジニア部門がこれまでの想定よりも多くの負荷を捌くために、様々な対応をしていたり、マーケティング部門がこういった場合にどのような使い方をすれば、影響が大きくならないかを考え、それぞれの学校へ密に連携するなど、急場な対応を迫られました。 データ/AI部では、これらのサービスの利用がすぐに可視化できるように、これまで整理してきたデータ基盤を有効活用し、すぐさまダッシュボードを作成しました。 今回はそこから抜粋し、Classiが休校対応でどのように使われていたかを説明します。

ClassiのDAU(Daily Active User)

f:id:tetsuro-ito:20200316215427p:plain
DAU

Classiのユーザーには3種類のタイプがあります。学校の先生が利用するアカウント、学校の生徒が利用するアカウント、そしてその生徒の保護者が利用するアカウントの3種類です。

上記のグラフはそれぞれのタイプの日々の利用推移のグラフです。 まもなく年度末に差し掛かる時期だったので、通常であれば安定的な利用状況になるのですが、臨時休校の要請についての発表が行われた2月末を起点に、生徒や保護者の利用が急増しました。

特に顕著なのは保護者のアクセスのスパイクです。これは休校対応によってどうしたら良いのか、学校との連絡を待つため、Classiへ情報を取りにきたことが考えられます。 先生や生徒は実際に学校で普段からご利用いただいている状況ではあったのですが、それでも休校後はアクセスの平均がこれまでよりも上昇しています。

機能利用の内訳

では、実際に各ユーザータイプごとの機能利用状況を見てみましょう。まずは先生からです。

f:id:tetsuro-ito:20200317163354p:plain
先生

圧倒的に利用されているのは学校内での連絡や情報共有のために使われる校内グループです。様々な情報が錯綜する中で、学校側が生徒や保護者に必要な情報を適切に配信していたのがわかります。

つづいて、学習記録という日々の学習時間などを記録する機能がよく利用されています。これは学校で確保されていた授業の時間という前提が崩れてしまったため、家庭学習の記録を促し、先生から生徒へのコメントなどを行なっているものです。 残りの機能は満遍なく利用されていますが、それぞれの学校のスタイルに合わせて各機能をご利用いただけているようです。

次に生徒の利用状況です。

f:id:tetsuro-ito:20200317163440p:plain
生徒

こちらもやはり校内グループの利用が群を抜いています。先生からの連絡を受け取り、みましたというボタンを押してレスポンスする機能があるのですが、これで出欠を取ったり、日々の健康観察のような使い方をしていたために、多く利用されています。 学習記録は前述した通り、日々の学習時間を記録して、先生に伝えるために利用していただいています。 3番目はアンケートの利用が多くなっています。これは先生から生徒に対してアンケートを配信することで、それらを集計する機能ですが、学校にこられない分、いろいろな設問で日々の状況を確認していることがわかります。 4番目の生徒カルテは生徒のこれまでの成績を一覧できる機能です。模試の結果やこれまでの成績を見返していることがわかります。 5番目のWebテストはClassi上で問題を解きながら学習をできる機能です。こちらもアンケート同様、先生が毎日課題を配信して、その課題に対して各生徒が家庭で学習に取り組んでいることがわかります。

上記のように、学校に行くという前提が崩れてしまっても学びは継続的に行われていることがデータからもわかります。

最後に保護者です。

f:id:tetsuro-ito:20200317163633p:plain
保護者

保護者の機能はシンプルなので、基本的には学校からの連絡を受け取るために多く利用されています。 2番目の生徒カルテはお子さんのこれまでの成績が見られる機能です。タイミングが重なって、自分の子供の成績を確認した保護者の方も多くいらっしゃったのかもしれません。また、アンケートなどを一部の学校で保護者に対して取っている形跡も見られます。

最後に

今回の新型コロナウイルスの流行や全国の学校の休校対応など、これまでの常識では考えられなかった事象が起きています。 従来のICT化される前のままであれば、今回の騒動に対応することは難しかったであろうことは想像に難くありません。 学びの形も少しづつ、着実に進歩しています。今回の件で、多少なりともそれが証明できたのではないかと思います。 Classiは今後も引き続き全社ミッションである 子供の無限の可能性を解き放ち、学びの形を進化させるを実現させるために日々頑張っていきたいと思います。 このような課題に対して前向きに取り組んでくれる仲間をいつでも募集しています!

Classi採用ページへ

© 2020 Classi Corp.