見出し画像

230万ユーザーを抱えるシステムの「秘伝のタレ」問題。テックリード起案で進める長期視点での技術投資

Progate

バグを改善したり、ユーザーさんからの問い合わせに応じたり、機能追加したり。

エンジニア組織の多くは、どうしても日々目の前の課題に対応するだけで精一杯な傾向にあります。一方で、さらなる成長を実現するためには、システムや開発体制の抜本的な刷新も必要です。

Progateでは、このような直近の課題解決と中長期的な成長の両輪を意識しながら、開発に取り組んでいます。具体的にどんな課題があり、そこにアプローチしようとしているのか、テックリードとしてサーバーサイド領域に携わる2人の対談から明らかにします。

森田 裕祐(もりた ゆうすけ)
CAMPFIREにてサーバーサイドエンジニアに従事。現在、「Learning Experience」チームのテックリードを担う。
島津 真人(しまづ まこと)
Googleにてソフトウェアエンジニアとして5年間 Chromeの Service Worker の開発に従事。テックリードを経験した後、 Progate に入社し、 現在は新規サービスの企画・開発を担う。

ユーザーの学習体験向上に向けて技術面を牽引するテックリードたち

画像1

‍――まずは所属するチームならびに、テックリードとしての役割について、ご紹介ください。

森田:私がテックリードをしているLearning Experienceチームは、ユーザーさんの学習体験に関する内容を担当しています。具体的には、ユーザーさんが学習をスムーズに進めることができるようにすることが目的ですね。

現在は主にメンテナンス性を向上させるための開発に取り組んでいます。今あるコンテンツを改善しやすくするのと並行して、新しいコンテンツを開発しやすい環境の整備・構築をしています。

テックリードとしての役割は、大きく2つあります。1つは、チームメンバーからの技術的な相談を受けること。今まさに現場エンジニアが抱えている、技術的な課題解決のサポートですね。もう1つは長期的な視点に立った施策。今後取り入れるべき技術スタックなどについて、チームリーダーと一緒になって考えています。さらに1人のエンジニアとしてもサーバサイドをメインに開発業務にも携わっています。

島津:私が所属するPathチームは、今あるProgateのプロダクトではなく、ある程度プログラミングができるようになったユーザーさんが「創れる人」になるために、さらに学びを深めていけるようなコンテンツを新しく作ろうとしているチームです。

その中でテックリードとして、コンテンツプランニングチームが考えた案が技術的に可能なのかどうか、実際にどうやって作っていけば良いのかといったことを考えながらプロダクトを作っています。エンジニアの数が1.5人くらいのチームなので、実際に手を動かしてコードも書いています。

プログラミング教育は自分が通ってきた道なので、そこで「このときは、こういうコンテンツがあればいいな」みたいな思いがあるんですよ。それを実際に反映できるのはすごく嬉しいですね。


まるで「秘伝のタレ」、複雑なシステムが抱える課題

画像2

‍ーー世界中で230万人のユーザーを抱えるProgateですが、既存コンテンツや新しいコンテンツ制作のための開発環境改善、整備、構築などに取り組む中で、今どんな課題を抱えているんですか?

森田:メンテナンス性の面で大きく2つの課題があります。

1つは、互換性を崩すようなレッスン内容の更新ができないシステムになっている点です。互換性を崩すような変更をリリースすると、その演習に現在取り組んでいる、あるいは以前取り組んだユーザーさんのコードが急に動かなくなってしまいます。なので、実質そのような変更はリリースできません。

Progateのレッスンでは、まずスライドでレッスンの概要の説明があります。その後、実際にユーザーさんがコーディングするUIを表示し、そのUIでは実際に書いたコードを実行してすぐに結果を表示できるようになっています。さらには、ユーザーさんが書いたコードに問題がある場合は、問題の箇所を確認できる設計になっています。ブログなどテキストメインのサービスと異なり、各種データの管理・保存が難しく、複雑になっているんです。

もう1つはシステムの話というよりレッスン構成の話ですね。Progateではユーザーさんに馴染みやすく楽しんでもらえるよう、レッスン同士がつながって1つのストーリーになっています。でもそれがメンテナンス性の観点では課題になってしまっているんです。一部を変更しようとすると、ストーリーがつながっているために後の部分も全て変更する必要があるんです。

メンテナンス面以外の課題としては、フロントエンドとバックエンドが密結合な点があります。システム全体が、いわゆるモノリシックな状態で、古から連綿と続く「秘伝のタレ」のような状態となっています。今は中長期的な目線でメンテナンスし続けられるようにしようという意識がエンジニア全体で共有されており、必要に応じて設計を丁寧に議論しながら開発を進めています。

スムーズな学習体験を提供するためには、システムの抜本的解決が必要


――それらの課題に対して、どのようなアプローチをしていこうと考えているんですか?

森田:1つ目の課題に対しては、互換性を崩しても問題を生じさせないような変更ができるようにしようとしてます。当時最新のバージョンを使っていたとしても、数年後には新しいバージョンが出ます。例えば、JavaScriptのコースだとES5からES6に、といった具合ですね。

コンテンツも当然新しいバージョンに追随してアップデートしたいんですが、今はそれができていない状態――つまりユーザーさんが古いバージョンを使って勉強している状態なんです。できれば新しいバージョンを使って学んでいただきたいし、新しくユーザーさんに学んで欲しいものが出てきたら、都度レッスンを追加していきたいと考えています。

島津:細かい問題がいっぱいありそうですよね。レッスンを追加すると、それまで100%クリアだった人が全部クリアではなくなってしまうとか。

森田:そうですね。Progateのサービスは様々なプログラミング言語を扱う多くのレッスンがあり、それぞれに対して複数のバージョンを運用したいと思っています。そのため当然、中の構成も複雑になっています。新しいユーザーさんに対しては最新バージョンを提供すればいいのですが、以前から使っていただいている、例えば古いバージョンを途中までやっているユーザーさんに対して、どのバージョンを出すべきなのかも悩ましいところです。さらに実装する上でも複数バージョンを前提にすることで、修正の影響範囲も多く、苦心している状況ですね。

2点目のレッスン構成に関しては、今まではストーリーが全部がつながっている前提だったので、その前提に依存してしまっているコードが、フロントエンドにもバックエンドにもあります。レッスン構成を変えるのはかなり大きな話なので、いきなり変えるのではなく最低限の実装でβ版のようなものを出そうとしています。その結果で今後の方針が変わるかもしれないので、そのβ版を既存の実装にいかに影響しないように作るかを考えている段階です。

これはエンジニアとしても難しくて面白い部分ですね。

――システムがモノリシックになるのは、ベンチャーあるあるかもしれません。目の前の仕事に向き合いながらも、システムを抜本的に改修するといった、中長期な課題解決にも取り組んでいるわけですね。

画像3

‍‍島津:そうですね。先ほど森田さんが言ったように、私たちが開発しているサービスは、技術的にかなり難しいと感じています。

一般的なWebサービスのようにユーザーさんがフロントエンドで入力したデータがサーバーに飛ぶというだけにとどまらず、ユーザーさんが書いたコードを実行し、判定する環境が必要だからです。

ユーザーさんが書いたコードを適宜保存しておき、次にログインした際にもきちんと以前の環境を復元する。同時に、そのコードを実行し、判定する――それも、JavaScript、Ruby、Goなど、扱っている多数の言語で動作する仕組みを私たちのような小さいベンチャー企業で構築するためには、継続的にメンテナンスできるシステムを構築していく必要があります。

中長期的な課題解決に向けた意見が採用される環境

画像4

‍――実際にProgateに入って感じた、特徴や魅力についても聞かせてください。

森田:中長期的な視点で価値あるアイデアや施策だと認められれば、所属部署やポジション関係なく、誰でも積極的に発言でき、かつ採用されやすい文化です。例えば私が入社したときは、エンジニア、デザイナーなど職種によって、同じものを指しているのに違う言葉を使ったり、同じ言葉なのにちょっと認識がずれたままやり取りされているシーンがよくあって、余計なコミュニケーションコストが生じていたんですね。これはコードや、新メンバーのオンボーディングにも悪影響を及ぼしてしまいます。

そこでメンバー全員の共通の言葉、「ユビキタス言語」を作ろうと提案しました。その結果、ドキュメントや実際のコードベースでは反映されていませんが、Learning Experienceチームが担当する演習周りの概念的なものは整理できている状態になりました。現在も引き続き、ドキュメントやコードベースへの反映を順次行っています。

すごくいいなと思ったのは、会社としてこういった時間をちゃんと確保する判断をしてくれたこと。職種間で認識を揃えていく話し合いのプロセスって、かなり時間がかかるんですよ。今はLearning Experienceチームの活動の一環となっていますが、この活動を始めた頃はCEOやチームリーダーのように忙しい人も入ってくれて、週次で1時間ほどのミーティングを実施していました。

多忙な方々の大事な時間を投下してまで、ここに時間をかけていいという経営判断――長期的に開発速度を維持したいという経営姿勢の表れだと感じて、自社ながらすごいなと思ったんです。

――全社に広がれば、長期的な視点でコスト削減に寄与する大きな取り組みですね。

島津:サーバサイドも含め、部署に限らずアクションを起こすことができるカルチャーは、私も感じています。私の場合は、コードを継続的に良い状態に保てる環境の整備――いわゆるDeveloper Experience(DevEx:デベロッパーエクスペリエンス/開発者体験)向上の観点から、仕組みを整えることを提案しました。

ちょっとサーバーサイドからは離れてしまうかもしれませんが、例えばシステムをモニタリングするためのダッシュボードを作ったり、エラーが増えたらアラートが飛ぶように仕組みを作ったり。まさに森田さんと同じく、現在ではサーバサイドチームを飛び越え、他のチームにも展開されています。

――長期的視点の改善に対して、上司や経営層はすぐにOKしたのですか?

画像5

島津:私の場合は経営層にまで話がいくことはなく、上司にアイデアを伝え、通常業務に影響が出ないのであればとの承諾を得られたので、そのまま進めることができました。これまで所属していた組織と比べ、意思決定がスピーディーだと感じましたね。

ただしこのような環境は、見方を変えれば、誰が何をやっても許されることと表裏一体です。極端な例ですが、全員が個人の判断で好き勝手に仕事を進めていたら、中長期的な目線に立って会社として重要な課題を解決していくことは難しくなってしまいますよね。

この部分に関して、7月から全社でOKRを導入したことにより、各チームや個人がよりスムーズな意思決定を行えるようになったと感じています。ある仕事が全社やグループなどの大きな目標に沿っているかどうか、OKRを見れば判断がつくようになったため、チーム単位で自律して仕事を進めていけるようになったと思います。今回のDevEx向上に関しても、7月からのOKRにきちんと組み込んでもらうことで、エンジニアチーム全体の課題として捉えてもらうことができました。

森田:私が提案したユビキタス言語も、まさに直近の課題解決ではなく中長期的な問題なので、組織によっては却下される場合もあるかもしれません。でも短期的な課題解決ばかりに目を向けるのではなく、並行して中長期的に、しかもOKRといった明確な指標にもとづいてのジャッジなので、以前に増して活発に意見を発しやすい雰囲気になっていると感じています。

――そうはいっても、特に島津さんは入社してまだ数ヶ月。意見を発する前に、メンバーとのコミュニケーションを図る上での課題もあったと思います。

画像6


島津:私からエンジニア全員に、1on1をしたいとのメッセージを送りました。実際、皆さん快く応じてくれましたし、現場エンジニアの場合も、マネージャーにお願いすれば、私と同じように、全員との1on1がセッティングされる環境が整っています。

リモートワーク対策にも積極的だと感じています。私は月2回のコーヒーブレイクが好きですね。zoomのシャッフル機能でランダムにブレイクアウトルームを作って3〜4人で話すんです。今まで話したことがない人とコミュニケーションを図ることができて楽しいです。

森田:僕もコロナ下でフルリモートになった後に入社しました。Progateは職種ではなく、担当範囲でチームが分かれているんですね。Learning Experienceチームには、デザイナーやコンテンツ制作のメンバーがいるので、日々密にコミュニケーションを取っています。

同じ職種同士のコミュニケーションとしては、Progateで「Function」と呼ばれている職種横断の集まりがあります。エンジニアだと定例会があって、困っていることや今やっていることの共有などをしています。

カジュアルなコミュニケーションには、Slackの雑談チャンネルを活用しています。

個人毎に雑談チャンネルが用意されていて、仕事で息詰まった際や、誰かとコミュニケーションを取りたいと思った際、適当に呟くと、興味を持ったメンバーが反応してくれるんですよ。

最近は技術ネタだけでなく、家庭でのハプニングやアニメ・漫画ネタなどをつぶやいて、盛り上がったりしてます。

Progateは一緒に働く仲間を募集しています!
🔸 採用情報


この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!