エンジニアリングで真のインパクトを出すための3つの拘り ― 現地現物、真因探求、仮説検証

モノグサでエンジニアリングマネージャー(EM)を務めている深谷です。

今回は、エンジニアリングを通じていかにインパクトを最大化させていくかについて、私が日頃大切にしている考え方やチームでの実践を共有します。

モノグサのエンジニアの皆さんは非常に高い技術力を持っており、求められたものを形にする能力は高いと感じています。

しかし、技術的成果物をデリバリーしたからといって、それが必ずしも「ユーザーの行動変容」という形のインパクトに繋がるとは限らず、不確実性が伴います。

開発に時間を投じたものの、狙い自体が外れることもあります。(一定やむを得ないことではありますけれども。)

なぜ、作ったものがインパクトに繋がらないことがあるのでしょうか。

その本質的な原因は、結局のところ「デリバリしたものがユーザーの問題を真に解決しきれていない」点にあると考えています。

例えば、以下のような状況が考えられます。

  • ユーザーが抱える課題を十分に理解しないまま、チームの思い込みで開発を進めてしまう
  • ユーザーから寄せられた要望の背景や目的を十分に掘り下げないまま実装し、根本的な課題解決に至らない
  • 解決策の質が不十分、あるいは副作用で別の問題を引き起こしてしまう

「問題が分かれば、答えは半分わかったと同じだ」という言葉の通り、多くの場合は真の問題を特定できていないことこそが最大の問題です。

本記事では、ユーザーの真の課題を解決し、インパクトを出すための3つのプラクティスを紹介します。

1. 「現地現物」に拘り、自分事化する

モノグサの開発チームは実際に学校現場などのユーザーのもとへ足を運び、導入の案内をしたり、ユーザーの生の声を聴いたりしています。

Slackなどのテキスト情報や又聞きでは伝わりづらい「空気感」や「切実さ」があるからです。

ここで重要なのは、「現地現物」とは単なる視察ではないということです。

トヨタ自動車の豊田章男氏は、「現地現物」について、単に現地を視察することではなく、目の前で起きていることを自分事として捉え、より良くするために行動することだと述べています。

Monoxerのアプリでは、以前「ログイン時に意図せず個人用スペースに入ってしまう」という課題がありました。

オフィスで事象だけを聞いていたときは、「少し不便な状態」程度に捉えていました。しかし、実際のオンボーディング現場で、その影響の大きさを知りました。

ログイン時に組織を選ぶ

オンボーディングでは、カスタマーサクセス(CS)の担当者が、約50分という限られた時間の中で、操作方法だけでなく、Monoxerを活用する価値まで伝えようとしています。 しかし、ログインステップのつまずきのせいで、肝心の説明の時間が削られてしまいます。

この光景を目の当たりして「自分事」として捉えたことで、ログイン時の無駄やつまずきをなくす改善の優先度を上げました。その結果、オンボーディングが本格化する時期にリリースでき、現場でのスムーズな導入につなげることができました。

後日談として、別の学校に行ったときに、

先生「登校が難しい児童生徒にも使ってほしいが、ログイン手順の案内が大変なんですよね」

先生「(Chromebookで)アプリの画面サイズを最大化したりとか」

私「お手数をおかけしましたが、最新バージョンではデフォルトで最大になるように修正が入りました!」

とタイムリーに修正を入れることができたとお伝えできました。

2. 「なぜなぜ分析」で、課題の真因を捉える

現場で起きた事象が見えたら、次はその構造を紐解く「なぜなぜ分析」を行います。表面的な不満に対して安易な解決策を当てはめないためです。

例えば、ユーザーから「学習計画の進捗がなかなか進まない」という不満があったとします。「進捗計算を甘くして早く進むようにする」という解決策が思いつきそうですが、これだけでは本質的な解決になるかわかりません。

ここでは、多角的にクリティカルシンキングすることが必要です。

  • 進捗そのものが遅いのか。それとも、ユーザーが「なかなか進まない」と感じる体験になっているのか
  • 記憶がなかなかできていない結果、進捗が遅くなっていないか?(コンテンツの難易度や、学習サイクルの設計に問題はないか)
  • 記憶はできているのに、アプリの判定ロジックがそれを拾えていないのか?

ユーザーがなかなか記憶できていない場合はなぜ覚えてもらっていないのかを解決する必要がありますし、 実際にはユーザーは記憶しているのにアプリ側で正しく記憶済みと判定できないなら判定論理を変更する必要があります。

こうした分析を階層化し、ビジュアライズすることで、チーム内の意識を統一し、「本当に解くべき問題」にフォーカスできるようになります。

なぜなぜ分析シート

3. 仮説検証サイクルを高速化する

問題が特定できれば、次は解決策の検証です。

モノグサでは厳密な仮説検証の手法としてABテストを重視していますが、以前は実施頻度が低いという課題がありました。

そこで、「ABテストの頻度を1Qに1回から、10回へ増やそう」という目標を掲げ、開発プロセスを抜本的に見直しました。具体的に実践した改善は以下の通りです。

  • 仮説/施策候補の管理台帳(Notion)の運用:全メンバーがアイデアを出し、定期的に議論する仕組み作り
  • MVP(最小機能開発)の徹底:作り込みすぎず、検証に必要なプロトタイプを作り、期待された効果が確認できなければ本実装を見送る
  • BtoBtoC特有の顧客調整フローの確立:CSと連携し、学校や塾の運用状況、学習者の利用環境への影響を考慮しながら、検証の対象範囲や期間を設計
  • 分析の自動化(Colab作成):クエリ作成や集計ミスを排除し、誰でも即座に結果を可視化できる環境整備
  • レポート雛形の改善:単なる数字の羅列ではなく、結果に対する「解釈」を残し、チームの資産にする

結びに:アウトプットをアウトカムに変えるために

これらの取り組みの結果、1Qで9回のABテストを実施でき、プロダクトKPIの伸び(ABテスト結果の積み上げベース)は昨年の約8倍にまで跳ね上がりました。

エンジニアリングの本質的な価値は、コードを書くことそのものではなく、その先の「ユーザーに価値を届けること」にあります。

これからも現地現物で課題に向き合い、真因を射抜き、高速に検証を回し続けることで、教育における革新的なインパクトを創出していきたいと思います。

Monoxer Intern Report #23_CSV Data Export機能の改修と新予約画面開発

※このインターンレポートは2026年3月末に執筆されたものであり、最新の状況とは異なる部分があります。

自己紹介

はじめまして。モノグサの春季インターンに参加させていただいている、小澤と申します。普段は情報学部で学業に励んでおり、春休みを終えたら3年生になります。主にIT系の技術に広く興味があり、いろんなものに手を出しています。強いて言えばセキュリティに興味が強いです。

今回のインターンでは、主にReactを用いたWebフロントエンドの開発に関わり、Scalaによるバックエンド開発も少し行いました。それに対して、インターン前の私のReact経験は1ページだけ作ったことがある程度で、Scalaは見たこともありませんでした。Javaならそれなりに使ったことがありました。

参加を決めた理由

まず、何らかのインターンに参加したいと思い、それからモノグサのインターンに決めたという流れでした。よって、この2つに分けて記述します。

何らかのインターンに参加したかった理由

第一に、「仕事として取り組む」ことを体験したかったためです。自己紹介でも言及した通り、私はIT系の技術に広く興味があります。その中で、具体的に何を仕事にしていきたいのかまだ絞り込めていません。その判断材料にするため、何かに仕事として取り組むという体験をしてみたいと思っていました。

第二に、自分のスキルがどこまで仕事で通用するか見極めたかったためです。開発系で具体的には、「自分の書いたコードが実際のサービスで使えるかどうか」「世の中で実際に動いているサービスのコードとはどんなものか」の2点を特に確かめてみたいと思っていました。

モノグサを選んだ理由

インターンに参加することを決めたのはいいものの、世の中には無数のインターン募集があり、どこから調べていいものかと途方に暮れていました。そんなベストなタイミングで、AtCoder Jobs経由でこのインターンのスカウトをいただきました。待遇や内容、技術スタックなどを見ると、文句のつけどころのない理想的な内容だったため、誘われるがままに説明会に参加し、取り組めそうだという自信を持ち、そのまま応募を決めました。

取り組んだこと

私が主に関わったのはCSV Data Exportと呼ばれる機能です。これは、ユーザーの学習回数などのデータを集計してCSV形式で出力する機能です。出力したデータは、管理者が分析したり、学校であれば成績処理に用いたりなど、様々な用途があります。1000組織程度で有効な機能であり、毎月200件程度の予約があります。組織によっては結果が10万行程度にもなり、集計対象データはさらに多いことから、まず予約をし、データの準備が出来てからダウンロードするという形式になっています。

従来の記憶度の出力予約画面

新予約画面の開発

CSV Data Exportは「Bookの記憶度」「管理者アクティブ率」など様々な出力対象に対応しています。それらの予約を行う画面は別々に存在しており、それぞれのデータに関連する画面から遷移できるようになっていました。

具体的には、以下の画像のような操作によって遷移していました。これらはそれぞれ見ると合理性はあるものの、他UIの都合もあり一貫性がなく、欲しい機能を見つけるのが難しいという問題がありました。これにより社内でも知られていない機能などが発生し、すでに存在する機能の実装要望が来ることなどもありました。

そこで、全出力対象のデータ出力を一箇所で扱える新たな予約画面を作成することになりました。それに併せて、管理画面全体のUXを統一する試みの一環として、UIの見直しなどを行いました。

従来の記憶度の出力予約画面を開く手順

従来の学習回数の出力予約画面を開く手順

従来の管理者アクティブ率の出力予約画面を開く手順
作成した画面

以下が私の作成した画面です。まず出力対象を選択し、それに応じて次画面で細かい設定を行います。最後に内容の確認をし、予約を送信します。

新出力予約画面:出力対象選択

新出力予約画面:種類選択

新出力予約画面:種類選択

この画面には、現在の学習データ出力履歴画面から遷移できるようになる予定です。現状ではBookの記憶度とBookの学習回数にしか対応していませんが、将来的にはすべての予約が新画面で実施できるようになる予定です。これにより、全ての種類の出力を1つの画面から行うことができ、種類ごとにボタンを探し回る必要がなくなります。また、別で開発された新しい「配信」画面と近い操作となり、UXの改善を見込んでいます。

新画面にアクセスするボタンのイメージ(未実装)
デザイン/仕様検討

モノグサにはデザイナー職が存在します。このフォームもデザイナーの方が作成したものを元に実装しています。

しかし、インターン期間を含む時間の制約から、デザインが完全に完成する前に実装を並行して行うことになりました。そのため、実装過程で生じた課題や懸念などを積極的に共有し、チームで議論を重ねつつ、デザインと実装で相互にすり合わせながら改善を行いました。

モノグサには「細部にこだわる」という行動指針があります。これに基づき、ほぼしないであろう操作により生じるエッジケースの処理など、細部に至るまで議論し仕様決定を行いました。

コードの構造化と共通化

ここまででは、ただ既存の画面をくっつけてデザインを変えたというだけの話に見えますが、実はコードとしては大幅な変更を行っています。

旧フォームは、種類ごと別々に作っていました。もちろんパーツの共通化はある程度行われていましたが、それでも重複コードがかなり多くなっており、関連するコードが離れた行にあることも多くありました。

新フォームでは共通部分を見極め、切り分け方を統一することで、重複コードを減らし、メンテナンスを効率化しました。実際に出力対象を追加する作業を行った際も、少ない作業量とレビュー負荷で実装できました。

構造化イメージ
React Hook Form + Zodの導入

このフォームでは、有名なライブラリであるReact Hook FormとZodをフル活用しました。実は、これら2つのライブラリが社内に導入されてからは、Zodは1年少々、React Hook Formに至っては4ヶ月しか経っておらず、知見があまり溜まっていない状態でした。また、私個人としても名前すら聞いたことがありませんでした。

そんな中、メンターの手厚いサポートを受けながら、複雑なフォームを作ることができ、有用な実例を残せたと思っています。

出力完了メールにタイトルを入れる

こちらはインターン期間の最初の方にサブタスクとして行ったものです。

先ほどと同じくCSV Data Exportの話ですが、フロントエンドの変更ではなく、バックエンドで送信されるメールの変更です。CSV Data Exportでは、処理が完了した際にメールで通知するという機能があります。また、予約には最近「タイトル」というメモ欄のような自由入力欄が追加されました。このタイトルをメール通知にも含めるようにするという変更を行いました。

実際にできたもの

デザイナーの方からアドバイスや提案を受けながら、件名には最大15文字で切り捨てたタイトルを含め、本文には「タイトル」項目とタイトル全文を追加しました。

件名に予約タイトルが付加されたメール一覧

件名と本文に予約タイトルが追加されたメール
テンプレートエンジン

見た目は単純な変更ではありますが、今まで含まれていなかったユーザー入力コンテンツを表示することになるため、サニタイズを行う必要があります。そこで、今までは単純な文字列処理で行っていたHTMLメール本文の生成を、Play Frameworkのテンプレートエンジンを使うように切り替えました。

モノグサの自動テストは整備途中ですが、メールの生成についてはしっかりと単体テストが実装されていたため、挙動に変化がないことが保証されたままテンプレートエンジンへの置き換えを行うことができ、安心感がありました。

「文字数」とは

タイトルを15文字で切り捨てるという仕様はシンプルに見えますが、実は複雑です。というのも、「1文字」として使われうる概念は、「Byte」「Unicode Code Unit(コード単位)」「Unicode Code Point(コードポイント)」「Unicode Grapheme Cluster(書記素クラスタ)」の4つが存在しています。

私は元々Code Unitという概念を知らず、さらにCode Pointで数えれば十分だと思っていました。そのつもりで実装を行ったところ、ドキュメントのlengthの説明における「コード単位」という表現をCode Pointの翻訳揺れだと思い込み、コードレビューで「lengthだと絵文字などのサロゲートペアが壊れるためCode Pointなどで数えるべき」という旨の指摘を受けました。

これを受けてよく確認した結果、そもそも文字は複数のCode Pointで構成される場合があることに気づきました。そこで、社内で方針を相談しつつ、本メールでは書記素クラスタを用いた文字数カウントを行うことにしました。

その他

入門用の簡単なタスクや、主なタスクが進められない時に進めるタスクを、CSV Data Export関連でいくつか割り当てられていたので、それらを行いました。内容はリファクタリングやバグ修正など様々ありました。

また他の課題をいくつか発見したため、社内での共有や修正対応などを行いました。私はバグを見つけるパッシブスキルを持っていると自認しており、特にバグの発見に多く貢献しました。

その他依頼を受けたタスクとは別で、本番環境で起きた不具合の原因特定を行ったり、メール配送のトラブル分析なども対応しました。

インターンの感想

全体として、とてもいい経験でした。

仕事として取り組むということの負荷がどんなものか経験して感覚的に想像できるようになったのはインターンに参加した重要な成果だと思っています。同時に、この環境だからこそ負荷が通常よりも軽く済み、高いパフォーマンスを発揮できたことも感じています。

モノグサは働き方の自由度がとても高く、ラッシュを避けて通勤できたり、朝起きるのが遅くなっても夜まで働けば問題ないことにとても助けられました。私は夜型な人間なため、朝早く起きると体力が削られます。インターン期間の2ヶ月以上をしっかりフルタイムで働き抜くことができたのは早起きせずに済んだおかげだと思います。

また、私のスキルは業務に通用するものの、まだまだ上は広いことを確認できました。作成したコードには丁寧なレビューをしていただき、たくさんの指摘をいただきました。たくさんの指摘をいただいたということは、それだけ穴だらけのコードだったということであり、まだまだ伸びしろがあるということです(ポジティブな表現)。

同時に、たくさん褒めてもいただき、業務で戦力になれる水準ではあることも確認できました。既存のソースコードを見ても、自分が作るよりもよくできているコードと、自分が作った方がうまくできそうなコードの両方があったように思います。今回の経験を活かし、より高品質な成果を出せるように、今後も精進を続けていきたいと思います。

Monoxer Intern Report #22_生成AIによるコメント入力支援機能で学習回数を増やそう!

自己紹介

初めまして。モノグサのソフトウェアエンジニア(SWE)インターンに参加させていただいた叶洋瑞です。普段は東京科学大学(旧東京工業大学)の融合理工学系で学んでおり、日常的には主にバックエンドのコードを書いています。

取り組んだこと

私は主に学校様向け管理画面における新機能開発と、バックエンドの改善タスクに携わらせていただきました。その中でもメインタスクとして、「生成AI(LLM)を利用したリアクションコメントの自動生成」の開発に取り組みました。

 

メインタスクの背景

Monoxerには、管理者が学習者に対してスタンプやコメントを送信し、学習を褒めたり励ましたりする「リアクション機能」があります。しかし実際の利用データを分析してみると、送信されるリアクションのコメント率は約1割にとどまり、残り約9割はコメントが添えられていない(スタンプのみが送られている)状態でした。この最大の原因は、管理者が一人ひとりの学習状況を確認し、手動でコメントを入力する際の「心理的・時間的負荷の高さ」にあると推測されました。

一方で、直近のデータを分析した結果、非常に興味深いことが分かりました。単なるスタンプのみを受け取った学習者と比較して、「コメント付きのリアクション」を受け取った学習者は、翌日の学習回数が大きく向上することが統計的にも有意に証明されたのです。

つまり、「コメント付きのフィードバックは学習のモチベーションアップに絶大な効果があるが、入力する管理者の負荷が高いため十分に活用されていない」という課題がありました。

生成AIによるコメント自動生成の実装

そこで本プロジェクトでは、管理者の負担を大幅に減らしつつ、質の高いフィードバックの流通量を増やすために、LLMを用いた入力支援機能を実装する意思決定と一部の開発をしました(本記事執筆時点では開発中であるため、実際のリリース時には仕様が一部変更となる可能性があります)。

具体的には、管理者がスタンプを選択すると、対象者の「直近の学習データ」を取得し、選択したスタンプが持つトーン(例:励まし、称賛など)等に合わせて、AIがパーソナライズされたコメント案を自動生成します。生成された文章はテキストボックスに展開され、管理者はそれを確認・微調整して送信するだけで済むようになります。

実装上の工夫と意思決定

本機能の実装にあたり、エンジニアリングの観点からいくつかの重要な意思決定を行いました。

1. モデルの選定とUXの最適化

AIモデルには、既存の機能で既に実績があったGeminiシリーズの中から、最終的に「Gemini 3.1 Flash-Lite」を採用しました。 コストパフォーマンスが非常に高く、推論の設定を最適化することで、比較的に高速なレスポンスを実現できました。これにより、管理者の操作を妨げないスムーズなUXを提供できます。

2. 一斉送信(バルク送信)時の仕様の取捨選択

クラス全員に対してリアクションを一斉送信する際の仕様について、チームで深く議論を重ねました。 「学習者一人ひとりのデータを使って個別生成する」案や「クラス全体のサマリーデータから生成する」案も検討しましたが、APIコストの増大や、AIが不自然な文章を生成してしまうリスクを考慮し、最終的には「一斉送信時はあえて学習データを使わず、スタンプに合わせた自然な励まし定型文を生成する」という仕様に着地させました。パーソナライズの度合いは下がりますが、致命的な事故を防ぎつつ管理者の負荷を下げるというMVP(Minimum Viable Product)としての最適解だったと考えています。

3. データドリブンなリリース範囲の決定

新機能を全環境へ一斉にリリースするのではなく、初期フェーズは「学校向け管理画面」に限定してリリースすることに決定しました。
背景として、Monoxer上のリアクションを送信できる画面は多岐にわたるため、初期から全箇所に一括実装してしまうと、開発やQAなどのリソース負荷が過大になってしまうという懸念がありました。

そこで「どこから優先的に導入して価値を検証すべきか」をデータ分析に基づいて検討しました。その結果、学校向けの環境は「管理者一人あたりの担当学習者数」が多いため業務上の負担が大きく、本機能による業務効率化の価値が最も見込めること、そして何より「学校の先生からのコメントは、他の環境に比べて学習者の学習回数を劇的に向上させる(効果のインパクトが非常に大きい)」ことがデータから裏付けられたため、まずは学校様向け管理画面にターゲットを絞ってリリースを行う決断をしました。

その他のタスク

メインタスクの合間には、Webフロントエンドでの細かなUI改善(パンくずリストの対応など)や、バックエンドにおける学習回数ランキング集計ロジックの移行等にも少し携わらせていただきました。

インターンの感想

今回のインターンでは、ただ言われた通りにコードを書くのではなく、「実際のデータを見て仕様の仮説を立てる」というデータ・ドリブンな意思決定を経験できたのが非常に面白かったです。

また、正式な Design Docを執筆したのも初めての経験でした。自分のアイデアをドキュメントにまとめ、社員の皆さんと議論しながら最適なアーキテクチャや仕様に落とし込んでいくプロセスは、SWEとして大きく成長できた実感があります。

LLMという強力な技術を使って、プロダクトの価値をいかに拡張していくかを最前線で体感できた、非常に充実した約2ヶ月間でした。手厚くサポートしてくださったメンターさんをはじめ、モノグサの皆様には心から感謝申し上げます。

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

ひとはいつ未体験に挑戦するのか?〜Monoxerの学習データから探る〜

こんにちは、データエンジニアの田中です。
最近ミカンの皮をむくのが得意になりました。
最初に思い切りを持って二つに割くとやりやすくなります。

ということで、本記事はモノグサAdvent calender2025の23日目の記事です。

 

今年のテーマは「未体験への挑戦」です。

本記事ではMonoxerのデータを使って「ひとはいつ未体験に挑戦するのか」について書いてみようと思います。

新たな一歩を踏み出すきっかけって実は些細なことなのでは?、意外な違いで継続できるかどうかが変わってくるかも?など、未体験への挑戦についてデータから描けるものがないかみていきます。

Monoxerにおける「未体験」とは

Monoxerは解いて憶える記憶アプリです。

ビジネスとしては未就学児から社会人まで幅広いユーザーを対象にしていますが、現在メインのユーザーは中高生で、学校や塾に契約いただき、生徒がMonoxerで学習する形が多いです。その場合、学校や塾で学んだことを記憶するニーズがメインですので、「未体験」とはやや言い難い気がします(もちろん挑戦ではあり、非常に意義があることです!)。

今回のテーマに沿うような行動がアプリ上にないでしょうか?実はあります。

Monoxerでは、アプリをダウンロードして皆がすぐに学習を体験できるように、「初期搭載無料Book」というコンテンツが用意されています。例えば、かな点字や百人一首、ウクライナ語などのコンテンツは(おそらく学校や塾で学習を指導されるケースは多くはないため)、ユーザーが自主的に見つけて学習してみるケースが多いでしょう。

今回の記事ではこれらの初期搭載コンテンツ(以下、「該当コンテンツ」と呼びます)の学習を題材に、「未体験への挑戦」についてデータから探っていきたいと思います。

ひとはいつ未体験に挑戦するか

まずは、該当コンテンツを初めて学習する瞬間にフォーカスをあてて、「いつ未体験に挑戦するのか」を見ていきます。

最初はベーシックなところで、時間帯(朝・日中・午後)で分けて見てみましょう。

新しいことを始めるというと朝のイメージがありますが、今回の結果では、該当コンテンツを初めて学習する時間帯は、普段の学習よりも朝に行う割合が若干少ないという結果になりました。
(以下、具体的な定義や数字はマスクしています)

また、平日か土日かで分けてみると、普段よりも、該当コンテンツの初回学習をしやすいのは土日のほうだと分かります。

学校や塾では、授業のなかで明示的にMonoxerの学習を促すケースもあり、そこで該当コンテンツの初回学習をする可能性は低いため、いつもと違うタイミング(土日)でアプリを開いたケースが多いのではないかと推察されます。

では次に、「その時のアプリ利用のなかで該当コンテンツを初回学習するタイミング」を見ていきます。

アプリを開いたものの、なんとなくやる気が起きなくて該当コンテンツを開いてみるようなケースが多いのか、それとも普段学習しているものをある程度まとまった時間解いたあとに、気分転換としてアプリ内のほかのコンテンツとして該当コンテンツにたどり着いたケースが多いのでしょうか。

これに関しては、該当コンテンツを初めて学習した日、その前に別のコンテンツを何回学習していたかを見てみます。

その日の最初の学習として該当コンテンツを解いているケースもあれば(0回)、別のコンテンツを学習した後に該当コンテンツを解くケースもありそうです(1回以上)。

個人的にはアプリを開いたもののやる気が起きない際に他の場所を漁ることが多いので、6回以上別のコンテンツを解いたあとに該当コンテンツに挑戦する層がこれだけいるのは少し意外な結果でした。

未体験への挑戦は継続されたか

ここまではいつ該当コンテンツの学習に着手するのか、という観点で見てきました。

記憶として定着させるためには、単に一回だけ学習するのではなく、それを継続することが重要なのは言うまでもありません。

そこで、該当コンテンツの初回学習を終えたあと、そのコンテンツの学習が継続されたかどうかという切り口でも見ていきたいと思います。

上記と同じように時間帯や曜日で見てもあまり面白みはなかったので省略しますが、「いつもと同じ時間帯に初回学習を行ったかどうか」で比較すると、いつも勉強している時間帯とは別の時間帯に初回学習を始めたユーザーのほうが、やや継続的に該当コンテンツを解いていただけるようでした。

ちなみに一番継続していたケースに多かったのが「普段は夜の時間帯に最も学習しているユーザーが、朝の時間帯に該当コンテンツの初回学習を始めた」ケースだったので、新しいことを始めるのに適しているタイミングは朝、というのは一理あるのかもしれません。


続いて、先ほど円グラフで示した「該当コンテンツの初回学習前に、別のコンテンツを何回学習したかの人数比」について深掘り、その後学習が継続されたかを比較してみます。全体的には、アプリを開いて最初に該当コンテンツを解いたケースよりも、他の学習を何度かした後に該当コンテンツを解いたケースのほうが継続日数が多くなっています。

また、少し不思議なことに、1〜5回と6〜15回では前者のほうが継続的に学習いただいているという結果になっていました。
今回の簡単な集計だけでは多くのことは分かりませんが、もしかすると初回学習したときの疲れ具合や集中力によって、その後の継続率に違いがでている、といった傾向があるのかもしれません。

終わりに

ということで、今回はMonoxerの学習データから「未体験への挑戦」について見てきました。

実は私はモノグサに数か月前に転職してきたのですが、全人類がいきいきと人生を送れる社会となるように貢献していきたいという思いが転職のきっかけでした。

当社の行動指針の1つである「未体験への挑戦」は、自分たちがそれを体現するだけではなく、それを後押しするという意味でもすごく素敵だなと思っています。

今回分析の対象としたコンテンツを解いてもらうことがサービスの目的ではないですが、このような示唆をよりよい学習体験の設計のために生かしていければと思います。

実は今回紹介したコンテンツはアプリをダウンロードすれば誰でも無料で学習できます。

ぜひ解いてみてください!

 

また、モノグサ株式会社では一緒に働く仲間を募集しています。少しでも興味を持ってくださった方は、ぜひお話しましょう!

qiita.com

careers.monoxer.com

 

QL(Quality Lead)を導入しました

 

この記事は モノグサ Advent Calendar2025 2日目の記事です。

こんにちは!やまもと@テスト番長です。
日差しがすっかり冬らしくなり、朝は布団から出られなくなった今日この頃、皆様いかがお過ごしでしょうか?
今年のモノグサアドカレのテーマは「未体験への挑戦」ということで、モノグサQAチームでのトライについて少しお話ししたいと思います。

今年、私たちQAチームは様々な新しい試みに踏み出しました!
その中の一つが「QL(Quality Lead)」というロールの運用です。

エンジニアリングの世界では「Tech Lead(TL)」という役割が一般的ですが、QAでは一般的ではありません。TLがチームの技術面をリードするのと同じように、“品質のリード役”が居たら良いのではないか──そんな問題意識から始まりました。

QLとは

QLは簡単に言えば「QA版のTech Lead」です。
QLはプロダクトの『品質・コスト・納期(QCD)』を軸にチームをリードします。制度設計そのものはTLと同じでありつつ、対象が“開発プロセスやコード”から“品質プロセス”に変わったイメージです。

もちろんこれまでもQAエンジニアは、テスト計画やリリース判断など品質に深く関わってきました。
しかし、それらの活動は担当者個人のホスピタリティによって支えられている面が大きいのが現状でした。そこで、QAチーム内で検証プロセスや品質の方向性を見極め、リードする役割としてQLを設けることにしました。

ちなみにモノグサ社内では、Devチームで規定されている「TL」ロールのサブセットという建て付けになっています。(制度上はTLということです。)

QLの主な役割は、大きく2つあります。
1つは検証プロセスのリード。テスト計画やテストケースのレビュー、リリースチェックリストの確認などを通じ、開発チーム全体の品質活動を整理・加速させます。

もう1つはプロダクトマネジメントへの橋渡し。バグ管理やアサイン調整を行いながら、PdMが長期計画を立てる際に品質観点から助言したり、他職種と連携してプロセス改善に取り組んだりします。

一方で、QLは「人のマネジメント」はしません。
チームメンバーのタスクを補助することはありますが、あくまでフォーカスは“品質そのものの推進”にあります。
モノグサでのTLの建て付けもそのようになっており、マネジメント関連の制度設計とは分離されています。

今年の4月に1人、9月にもう1名が任命され、チームの牽引役として活躍してくださっています。

QL導入の効果は?

運用を始めたばかりの今は、まだ手探りで動いていただいている状態です。
QLの成すべきことはケースバイケースで、「品質をどう定義し、どうリードするか」という問いに正解はありません。
それでも、開発と品質の間を行き来しながら、プロダクトの「良い体験」を支え、新たに作っていくために新しい形を模索しています。

具体的な動き方としては、気になることがあるとメンバーにヒアリングやアドバイスを行ったり、テストツールの使い方をハンズオンしていただいたりする機会は結構あります。
裁量という点でノンタイトルより動きやすく、お節介を焼きやすくなった、というのはあるかもしれません。

マネージャーが頻繁に細かな指摘をしてしまうと、「口うるさく言われている」ように感じてしまい、チームの雰囲気が暗くなりがちです。その役割をQLという別のロールが担ってくれることで、必要な指摘はしっかり行いながらも、雰囲気は守られていると思います。

“未体験への挑戦”とは、未知の領域に飛び込むこと。
QL制度の導入は、まさにその第一歩でした。
品質をリードするという役割が、チームとプロダクトにどんな変化をもたらすのか——この挑戦の続きを、来年も続けたいと思います。

モノグサQA募集中です

色々なことを考えたり試しながら、毎日わいわい楽しく仕事をしております。

面白そうだなと思った方は、ぜひご応募ください!

このブログ記事が何かのご参考になりましたら幸いです。

 

モノグサ株式会社では一緒に働く仲間を募集しています。

少しでも興味を持ってくださった方は、ぜひお話しましょう!

careers.monoxer.com

qiita.com

 

Monoxer Intern Report #21_Book編集画面のUI/UX改善

自己紹介

モノグサのソフトウェアエンジニアインターンに参加させていただいた、青柳と申します。普段は早稲田大学で計算機科学を専攻しています。また、学業とは関係なく趣味でもソフトウェア開発をよくやっていて、最近は特にWebサービスを作っていることが多いです。例えば、今年(2025年)は主に自分の知り合い向けにTwitterクローンを開発しました。

参加を決めた理由

今回モノグサのインターンに申し込んだきっかけとしては大きく分けて二つあります。

まず一つは大学のサークルの後輩からオススメされたことです。彼は昨年度既にモノグサのインターンに参加していたので、その口コミがモノグサに興味を持つきっかけになりました。

もう一つのきっかけは、以下の大橋さんの記事です。

note.monoxer.com

自分は普段趣味でよく音楽ゲーム(いわゆる音ゲー)をプレイしていて、この記事の題材であるSOUND VOLTEX(サウンドボルテックス)というゲームも最近よく遊んでいるので、この記事を読んで「おもしろい会社だなあ」と思っていました。

今年の夏季のインターンを考える時期になり改めてモノグサの募集を確認したところ、タスクによってフロントエンド/バックエンド、Web/モバイルをどれくらいやるか自分で決められそうというのと、給与面なども他のところと比較して高い水準だったので今回このインターンに申し込むことにしました。

取り組んだこと

背景

今回私が主に担当したのは、Web管理画面の中にあるBook編集画面の改修です。まず「Web管理画面とは何か?」というところから解説します。

「Monoxer」というアプリケーションは、学習者が使うモバイルアプリと管理者(学校の先生など)が使うWeb管理画面の2要素から構成されています。管理画面では、記憶する対象をまとめたものである「Book」の作成・編集・配信や、小テストの作成・配信などを行うことができます。

以下に、実際のBook編集画面をお見せします。

 

このBook編集画面では収録されているエントリ(学習で記憶したい対象)が一覧になって表の形式で並んでおり、必要に応じてエントリを編集することができます。ただし、編集することができるのは下書き状態(学習者には公開されていない)のエントリのみで、一度公開してしまったエントリについては直接編集をすることができない仕様になっています。しかしそういう仕様とはいえ、公開されているエントリの内容を後から修正したくなることもあります。

これは例えば、問題文や解答に誤植があったときや、時代に合わせて問題文・解答などを修正したいときのようなケースです。このような場合、従来のBook編集画面でエントリを編集するには①一度編集したいエントリを複製して同内容の下書きエントリを作成し、②作成した下書きエントリにて修正をして、③複製元のエントリを削除して、④修正した下書きエントリを公開する——という手続きを踏む必要がありました。エントリの編集をしたいのに複製をするというのはあまり直感的な操作ではありませんし、必要な操作のステップも多いです。こういった背景があり、今回のインターンではこのBook編集画面のエントリ編集のUI/UX改善というテーマに取り組むことになりました。

改善手法

前述した仕様を変更して公開済みエントリを編集できるようにするためにはバックエンド(サーバー側で行う処理)の改修も必要となり簡単なタスクではないため、まず「フロントエンド(クライアント側で行う処理)だけで対応できないか?」という方向で実装を決めていきました。結果としては、以下の図のように公開済みエントリのメニュー内に「下書きに戻し編集」機能を追加する形になりました。

この機能を呼び出すと指定したエントリが下書き状態に戻り、かつ自動的にエントリの内容の入力欄(以降は単に入力欄と呼びます)が開いた状態になるので、そのまますぐに内容を編集できます。

これは内部的には、エントリを複製して下書きエントリを作成したあとに自動的に複製元エントリを削除して、下書きエントリの編集画面を開くという機能の組み合わせによって実装されています。従来のBook編集画面でのエントリの編集フローで必要だった操作のうち、いくつかをまとめて扱いやすくした形です。

ただし、既に学習者に配信済みのエントリを編集してしまうと学習者の「記憶度」や学習計画の進捗といったデータに影響を与えてしまうため、「下書きに戻し編集」ボタンを押した際には以下のようなモーダルを表示して、意図せずにエントリを編集してしまうことを防ぐようにしています。

実際の開発の流れ

今回のインターンタスクに取り組むにあたって、まず「UIをどのように変更するか?」という点をデザイナーの方と相談しました。画面のレイアウトなどに変更が加えられる機能の開発になるため、エンジニアの自分1人だけで全て進めることはできません。このようなケースでは、デザインのプロであるデザイナーさんと共同で作業を進めていくことになります。

モノグサでは、画面のデザインについて議論する場として主に Figmaを利用しています。今回の開発では最初にデザイナーの方にベースとなる案を作成していただき、そこにコメントをつけていく形でディスカッションを行っていました。また、「この点については詳細に意見を共有したい」というときにはミーティングを適宜設けて話し合いをすることもありました。必要な議論が一通り済んだ段階でデザインがfixの状態となり、その後は決められたUIとなるようにエンジニア側で実装を進めていく形になります。

デザインの話し合いの段階では、公開済みのエントリについても下書きエントリと同様に「削除」ボタンの左に「編集」ボタンを表示するという案や、最終的に採用された仕様ではモーダル内に表示しているアラートをエントリの入力欄内で表示する案がありましたが、「配信済みエントリを編集することの影響を知らないまま編集をしてしまわないか?」などの観点から最終的には現在のような画面デザインとなりました。

実装の段階では大きく分けて二つの対応をしました。一つはエントリの複製処理の改修で、もう一つはエントリ一覧の表コンポーネントの状態管理の改修です。順番に説明します。

公開済みエントリのメニューから「上に複製」あるいは「下に複製」を選択すると、公開済みエントリの内容をコピーした下書きエントリを作成するエントリの複製処理が呼ばれます。下書きに戻す処理を実装しようとしたときに、エントリの複製自体はこの既存の機能を流用することでできるのですが、今回のケースでは複製したあとに作成された下書きエントリの入力欄を自動的に開くようにしたいです。このために下書きエントリの情報(IDなど)を複製の後続処理で使えるようにしたいのですが、従来の仕様では複製時には複製処理を呼び出すだけで返り値を受け取っておらず、まずこの部分を変更する必要がありました。これが大きな変更点の一つ目です。

ただ、複製して作成された下書きエントリを受け取るようにすることはできたものの、肝心の入力欄を自動で開くというところにもう一つ壁がありました。

それは、それぞれのエントリは自分自身以外の「編集中かどうか」フラグを操作できないという点です。今回の機能では複製元エントリを複製した後に作成した下書きエントリの状態(編集中フラグ)を操作したいのですが、これらは異なるエントリであるため従来の実装ではお互いの状態を変更することはできませんでした。

そこで、それぞれの行のコンポーネントで状態管理を行っていたところを親であるエントリ一覧のテーブルのコンポーネントで状態管理を行うように変更しました。これが二つ目の変更点です。

この二点の改修さえしてしまえば、あとは既存の機能をいくつか組み合わせることで今回のメインタスクの実装をすることができます。実際ここまで開発が進んだ後は、かなりスムーズに残りの実装が進みました。

インターンの感想

モノグサでのインターンは6週間というかなり長めの期間でしたが、その分かなり詳細にモノグサの文化を知ることができました。

就業型インターンに参加するのは実はモノグサが3社目なのですが、他の企業と比較してモノグサの良いところはボドゲ会やおやつ会、TechTalkなどのような直接の業務以外での社内交流の機会があること、そしてそれを可能とするようなゆとりのある働き方ができること、だと思っています。ものぐさで行こう

モノグサでエンジニアとして自分が働く姿を想像できるようになった、インターンらしいインターンだったと思います。

機能の開発に関しては、最終的にはあっさりという感じでしたが途中詰まったりする場面もありました。

自分が元からNext.jsの経験があり、さらにメインタスクもフロントエンドの改修ということで技術的に新しいことをやる感じにはならないのかなと思っていたのですが、エントリの複製処理の改修の際にRedux-Sagaで実装された処理をRedux ToolkitのRTK Queryに移行するという対応をすることになり、どちらもまったく名前も知らないところから作業することになったので大変でしたし、商用サービスでのdata fetchingの勉強になりました。

また、自分が最近になってからReactに入門したこともあり、やや古い方式であるクラスコンポーネントに馴染みが無かったので、最初はコードの意味を読むのに少し苦労しました。こちらは、プロダクトのメンテナンスという面で勉強になった気がします。

インターンを総合して振り返ると、最終的にはインターン期間中にメインタスクの機能を実際にリリースするところまで到達できたのでかなり満足しています。機能リリース後には他のチームの方から「大変ありがたい」というコメントもいくつかいただき、非常に嬉しかったです。

開発を通して、デザイナーの方、エンジニアの方、QAの方などたくさんの人にお世話になりました。プロダクトの開発に対する知識がまた一層深まったと感じます。今回インターンのタスクに関わってくださった全ての方に、ここで改めて感謝をしたいと思います。ありがとうございました。

仕事のあとは

趣味の音ゲーで交流ができて良かったです。#club-rhythm-gameのみなさんありがとうございました!

(左上が私です)



 

競技プログラミングのコンテストを開催しました

 

2025年8月8日、弊社オフィスで 競技プログラミングのコンテストを開催しました。

さまざまな企業や異なるフィールドで働く競技プログラマー同士が垣根を越えて親睦を深めるためのコンテストを開催するという思いを込めて、Monoxer Programming Contest for Engineersと名づけられました。参加者の募集はXの投稿などにて、社員から広くお知らせし、コンテスト当日にはオンラインも含め、計48名の方にご参加いただきました。

ソフトウェアエンジニアの @tobisatisより、主に問題作成者視点での振り返り記事をお届けします。

開催に向けての準備

社員で作問作業を行うプロジェクト自体が、モノグサとして初めての挑戦でした。約2時間のチーム戦を行うことが先に決まっており、逆算しておおまかな配点と問題数を決めていくところから着手しました。2ヶ月強の限られた時間の中、4人のメンバーで問題を完成させる必要がありましたが、全員が経験豊富というわけではなく、特に私は作問自体も初めて、さらに想定解を作成するためのPythonを書くのも初めてという「初めて尽くし」の状態でした。それでも密にSlackなどでのメンバー間でやり取りを行い、また事前に問題を解いてくれた3人のtesterの協力もあって、無事に作問作業を終えることができました。

特にI問題作成(問題はAからLまで12問ありました)において、印象的なエピソードがあります。私が原案から想定解まで作成した問題があったのですが、想定解と解説に重大な誤りがあることを  @kona0001が指摘してくれました。1問につき2人の担当者をつけるという体制を作っていたことが幸いでした。修正後、万全を期すため値が大まかにあっているかを確かめるシミュレーションコードを書いたのですが、それは平均値を比べるだけの根拠のないものでした。それを、  @kobae964が推定値の不確かさまで調べるものに洗練させてくれたことで、問題として完成することができました。チームで助け合うこと、協力し合うことの素晴らしさをあらためて感じた瞬間でした。

もちろん、他の問題にもそれぞれドラマがあります。幅広い難易度を取り揃えた12問となっていますので、ぜひ解いてみてください。

コンテスト中の控室

コンテスト中、作問者は会議室に集まって順位表を眺めていました。

1分も経たないうちに最初の正答コードが提出され、システムが無事に動いていることを確認できたときには、みんながほっとした表情を浮かべました。システムに用いたMOFEの運営者のkichi2004様、ありがとうございました。

順調に問題は解かれていき、各問題において最初の正答コードが提出されるたびに控室は盛り上がりを見せました。私は普段は参加者側なので、順位表を眺めて楽しむというのは初めての経験で、とても新鮮でした。68分が経過し、全問題に正答コードが提出された瞬間、会場の盛り上がりは頂点を迎えました。

コンテスト終了後の懇親会

コンテスト終了後は、ピザや寿司などを食べながら、参加者全員と運営スタッフたちで懇親会を行いました。普段、会うような機会がない業界で働いている方、また出身や年齢もバラバラな方同士が、「コンテスト」という縁で集まり、交流し、繋がっていく。一つのコンテストが人と人を繋げる場となっていることを嬉しく感じました。懇親会の中盤で、それぞれの問題の解説を参加者に行ってもらうパートでは、非常に難しい問題などもある中、みなさま真剣に耳を傾け、熱心に聞かれていたのが、とても印象的でした。

 

終わりに

どのような形になるかは未定ですが、今後もコンテストの開催を続けていきたいと考えています。

「ものぐさで行こう」という文化をもつ我々と競プロを作り上げていく活動に興味のある方、ぜひ一度カジュアル面談にてお話ししてみませんか?

careers.monoxer.com