サービス障害とその対策についてのTech talk

f:id:corp_monoxer:20211119154643p:plain

自己紹介

皆様はじめまして。ソフトウエアエンジニアの加藤です。

今回はサービスの障害についてとそれに対する弊社での取り組みについて書いていきたいと思います。

不具合の原因について

利用者から「サービスを利用しようとしたけどログインできない。」と言われた場合、原因として考えられることは一体何でしょうか?

例えば、ログインの画面が表示されないといったことやIDとパスワードが入力できたとしても、アプリケーションの処理に問題があってログインできないかもしれません。このようにサービス側に何らかの問題があるケースが主に考えられます。

一方、IDとパスワードの組み合わせが違っていたやインターネットに接続されていないといったような利用者やその環境が起因のケースが考えられます。 この場合は、利用者側の環境で問題があることに気づいてもらって解決してもらうか、 必要があればパスワードリセットのような解決するための機能が必要になるでしょう。 f:id:corp_monoxer:20211126131805p:plain

ここではサービスが原因の不具合(サービスの障害)について詳しく話を進めていきたいと思います。

サービスの障害が発生する原因

それではサービスの障害がなぜ発生するのでしょうか? その主な原因はサービスを変化させるときに発生するものです。

サービスを変化させるというのは、以下のようなことが該当します。

・新しい機能をリリースする

・サービスの内部で利用しているソフトウェアを変更する

・使わなくなった機能を取り除く

・DBのデータ操作やアプリケーションに関するコマンドの実行

このときに何らかのミスをすると不具合が発生する場合があります。

また、障害発生の原因は他にも以下のようなものがあります。

・ハードウェアの破損

・利用しているサービスの停止

・想定以上のアクセスによって処理が詰まってしまう

前者については、Webアプリやスマホアプリのような頻度高く更新が行われる開発では根本的な解決は難しいと考えられます。

後者については、適切なインフラ設計やパフォーマンスの改善などで一定数発生を防ぐことができます。

ではサービスの障害を減らすことや、起きたときに影響を小さくするためにはどのようなことをすればよいのでしょうか?

サービスの障害の予防・抑制

ここからは障害の予防の観点と障害への対応という観点から話をします。

障害の予防のためには、開発時にミスを起こりにくくし、リリースまでにミスを検知できる状態にすることが大事になります。 具体的には以下のような方法が考えられます。

QAや受け入れテストの強化

・受け入れテストを開発プロセスに組み込んだり、専属のQAエンジニアを設けるなどが考えられます。

CIを使った自動テストやリントチェックの導入する

・コンパイルエラーを始めとしたケアレスミスを防ぐ

・自動テストで期待と異なる処理が発生している箇所を特定する

クリティカルな操作の制限

・例えば、サーバの停止ボタンやルート権限などを誰もが利用できる状況をなくすといったことです。セキュリティの観点からも重要ですが、内部の人間が間違って押してしまったやコマンド実行できたなどの危険を事前に減らすことができます。

オートスケーリングの導入

・1台あたりのサーバに対する負荷が増えたら、自動でその負荷を減らすように新しいサーバを追加する機能があります。これにより負荷にによるサービス不全を防ぐことが可能になります。

続いて障害への対応についてです。 具体的には障害が起きた際にその影響を最小限に抑えることについてです。

障害の影響は復旧までの時間と対象の機能を利用するユーザー数が大きいほど大きくなります。 影響を小さくするには「障害を早く発見すること」と「発見した障害に早く対処すること」が重要になります。

障害を発見する方法

主に自動で検知するケースと利用ユーザーから連絡が来るケースがあります。 自動で検知できる仕組みがあると、問題に気づくのがより早くなります。

異常な状態のスパイクを検知

・エラーログが通常よりも増えている ・CPUの負荷がしきい値を超えている

顧客からの連絡

・問い合わせフォーム

・CSへの連絡

発見した障害への対処

発見した障害を解決するには、障害の原因特定と原因への対処が必要です。 原因を特定するためには具体的な状況を知る必要があります。

エラーログの情報

・どのような処理でエラーが発生したかわかる。 ・ログのカスタマイズ次第では対象のユーザーなどの詳細な情報も知ることが可能。

発見したユーザーからの情報

・使用デバイスやバージョン、時刻、再現方法など。

このようにユーザーやログから情報を集めて、原因の特定を行います。原因の特定ができたら複数の部署が連携して対応をします。

・ソフトウェアエンジニアが原因を特定し、問題を解決する。

・必要に応じてですが障害の状況を外部へ発信します。

弊社での取り組み

ここまでは一般的なサービスの障害とそれに対する対策について説明してきました。 最後に弊社でどのようなことに取り組んでいるかについて簡単にお話をしたいと思います。

自動テスト・自動Lintチェック

・github上でリモートのブランチを更新したタイミングで実行されるようになっており、チェックをが通らないとリリースブランチにはマージできない仕組みになっています。 f:id:corp_monoxer:20211124091020p:plain

異常の検知

・CPU利用率などがしきい値を超えたらslack上にアラートが出るようにしています。 f:id:corp_monoxer:20211124091110p:plain

ログの整備

・GCPのログやCrashlyticsを利用して、エラーログや処理が遅いリクエストを閲覧できるようにしています。

最後に

今回はサービスの障害の原因や対策について簡単に説明をさせていただきました。

サービスの障害への対策はプロダクトの価値を高めることに直接的には繋がらないですが、 サービスが問題なく安定して稼働することは利用者にとって重要なことです。 さらには従業員にとっても安心して通常の業務に集中できるようになるなど大事なことになります。

この記事を読みサービスの障害について少しでも知識が増え、関心を持っていただければ幸いです。 最後まで読んでいただきありがとうございます。

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

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

careers.monoxer.com

競プロ部をつくって PG Battle 2021 に参加しました

f:id:corp_monoxer:20211119123428p:plain モノグサ株式会社のソフトウェアエンジニア、Tobisatis (@tobisatis)です。 今回は、当社の部活のひとつである競技プログラミング部(通称、競プロ部)より、活動報告をお届けします。

競プロ部は、2021年8月に設立された部活です。競技プログラミングが趣味の社員が順調に増えてきた頃を見計らって、4人以上のメンバーが集まりそうだと確信を得てすぐに設立宣言をしました(当社では4人以上の部員を集めることで部活を設立できます)。競プロ部のSlackチャンネルには、現在12人が参加しています。

f:id:corp_monoxer:20211119121033p:plain
競プロ部のSlackチャンネルの様子

モノグサ競技プログラミング部として初めての大会参加として、2021年10月23日開催の「PG BATTLE 2021」に出場しました。PG BATTLEは、同じ会社内や学校内の3人を1チームとして出場する競技プログラミングの団体戦です。学生向けと比べて社会人向けの団体戦は開催される数が少ないため、会社で参加できる貴重な機会となりました。

チーム結成

競プロ部設立直後の集会で話し合いを行い、1チームが結成されました。出場する3人のメンバーは、AtCoder(日本最大の競技プログラミングのサービス)でのレベルがそれぞれ黄色、黄色、青色です。当日に解く問題は、普段のコンテストの成績などを考慮して決められました。 チーム名はメンバーで話し合い、「モノグサで行こう」に決まりました。

問題と考察

それぞれのメンバーが大会中に行った考察を一部紹介します。 解法などを含みますので、問題を自力で解きたい方は解いてからご覧ください。 問題は公式サイトから確認できます。 products.sint.co.jp

・ましゅまろ2問目

次の考察で正解となります。 f:id:corp_monoxer:20211119135728p:plain

・ましゅまろ3問目

範囲内のすべてのマスを使って目的地に行く場合の数から、封鎖されたマスを通って目的地にいく場合の数を引いて解くことができました。封鎖されたマスが範囲外であるパターンにも気づいて正解できました。

・ましゅまろ4問目

数列の数え上げ問題で、尺取り法を使って解くことができました。与えられたテストケースが少ないこともあり場合分けが正しいか不安でしたが、テストケースを自作することで正解できました。

・せんべい2問目

最大値最小値を求める問題で、二分探索によって解くことができました。バグを解消するのに時間がかかりましたが、丁寧に作成したサンプルケースの成果もあり正解できました。

・せんべい4問目

UnionFindを使った貪欲法などを考えていましたが、十分に早い方法を時間内に思いつけませんでした。

・かつおぶし1問目

ある整数の階乗の桁数を求める問題で、対数などを用いて解くことができました。数学の関数を使いやすいPythonに切り替えて解いたところ、正解できました。

・かつおぶし3問目

imos法のような考え方の実装に挑みましたが、時間内に解ききれませんでした。

結果と振り返り

12問中8問を正解し、全体で19位でした。 出場したメンバーはチーム結成以降、AtCoder(日本最大の競技プログラミングのサービス)でほぼ毎週開催されるコンテストに出場して、結果や考察の共有を社内のSlackで行っていました。本番はAtCoderのコンテストとの形式の違いなどで慣れない点もあったようですが、日頃の練習の成果もあり、大変良い結果を残してくれたと私は感じています。

終わりに

会社のおやつ会だけでなく独自のおやつ会を開催するなど、競技プログラミング部ではあらゆるメンバーが楽しめるような環境を整えています。 モノグサ競技プログラミング部に興味のある方、ぜひ一度お話ししてみませんか?

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

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

careers.monoxer.com

みんなで一緒に!5分でCSSアニメーション

f:id:corp_monoxer:20211108175648p:plain

こんにちは、モノグサ開発チームのliminです。今回は誰でもCSSアニメーションを作成できるように実例で説明したいと思います。

そもそもCSSとは?

一言で言うと、「web要素(HTML tag)の見た目(styles)を指定できる言語」です。 ブラウザはHTML tagsをそれぞれデフォルトの形で表示させます。そして、CSSはそのデフォルトのstylesをオーバーライトできます。 さらに、CSSは静的stylesを指定できた上、動けるstyles、つまり「CSSアニメーション」も作成できます。

f:id:corp_monoxer:20211108141352g:plain
例:画像を動かすように

実例1:実例を参考しながら始めましょう!

まず、こちらで一番目の実例から見てみましょう。

アニメーションは以下の真ん中の一行のみで指定できます。ちなみに、一行目はターゲットのHTML要素を指定するCSS selectorsです。

f:id:corp_monoxer:20211108141544p:plain

animation: の後ろに4つのパラメーターがあり、以下のものになります。

  • animation-name
  • animation-duration  
  • animation-timing-function
  • animation-iteration-count  

animation-name 事前に定義した keyframes の名前を指定するフィールドです。

keyframes @keyframesとは一回のアニメーションの中でどんな動きをするかを指定できる属性です。 f:id:corp_monoxer:20211108142113p:plain 0%は開始時点での状態、そして100%は終了時点の状態です。0%, 100%の指定は必須です。それ以外はいくら「X%」を増やして状態を指定しても良いのです。 今回の実例は0%と100%で指定しかないため、途中の1%, 2%, ...99%などの状態が「線形補間」で自動生成されます。 f:id:corp_monoxer:20211108142155p:plain ちなみに、transformは回転以外、他の行為(移動、拡大)も指定できます。詳細はこちらで確認してください。

animation-duration アニメーションを1回回す時間を指定するフィールドです。こちらは1秒の場合「1s」です。

animation-timing-function 少し複雑なパラメーターですが、簡単に言うと「1回のアニメーションでどのように進行するのか」を設定できるフィールドです。「どのように進行する」はcubic-bezier関数で決められます。 基本的には以下のどちらかを設定すれば大丈夫です。 f:id:corp_monoxer:20211108144215p:plain

cubic-beizer関数はどのようにアニメーションに影響するのか、以下のリンクでご自由にお試しください。

https://cubic-bezier.com/ https://cubic-bezier.com/

animation-iteration-count デフォルトは1回で止まってしまいますが、infiniteで設定すれば無限ループができます。

実例2:遅延時間の応用

以下はこちらの実例で説明します。

今回のアニメーションは簡単。scaleを使って、「拡大⇨戻す」を繰り返すだけです。

f:id:corp_monoxer:20211108150054g:plain

animation-delay アニメーションの開始時間を遅らせる属性です。実例のように5つの要素が全部同じアニメーションでも、それぞれ違う遅延時間を指定すれば...

f:id:corp_monoxer:20211108151210g:plain

完全にローティングっぽい感じになりますね。 つまり、animation-durationanimation-delayをちゃんと合わせて調整すれば、簡単でいい感じなアニメーションが作れます。

f:id:corp_monoxer:20211108150439p:plain

f:id:corp_monoxer:20211108150251p:plain

他の属性変化も入れてみよう! 実例2のanimation-nameを変更してみよう!

f:id:corp_monoxer:20211108150936p:plain

f:id:corp_monoxer:20211108151009g:plain

f:id:corp_monoxer:20211108150950p:plain

f:id:corp_monoxer:20211108151029g:plain

本来のscale以外、背景色(background)、透明度(opacity)などの属性で指定すると全然違うアニメーションになります。

おまけ:自ら考えて試してみよう

f:id:corp_monoxer:20211108151110g:plain

できた方、おめでとうございます!上記で紹介した内容をしっかりと把握していただけたら、この動画のようなアニメーションを自分で作れるはずです。試してみましょう!

MonoxerはCSSアニメーションを使っていますか?

f:id:corp_monoxer:20211108151336g:plain 一番わかりやすいところは、ローディングのアニメーションです。これはreact-spinnersというライブラリのCSSアニメーションを使っています。今後はもっと多くの自作的なアニメーションを導入していくかもしれません。

以上です。最後までお読みいただき、ありがとうございました!

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

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

careers.monoxer.com

Monoxer Intern Report #4_API設計と追加(yokozeki)

自己紹介

こんにちは、モノグサでソフトウェアエンジニアのインターンをさせていただいた横関です。 お茶の水女子大学の4年生で、プログラミング言語の基礎理論を扱っている研究室に所属しています。

参加した理由

AtCoderJobsというサイトで夏季インターンを探していたところ、モノグサのインターンに興味を持ち、応募しました。興味を持ったきっかけは、記憶にまつわる課題をソフトウェアの力で解決しているところが創造的で素敵な会社だと思ったことでした。また、期間が長く勉強になることが多そうだったことも魅力的でした。 参加の最終的な決め手は、面接の時の雰囲気が終始穏やかだったことです。

取り組んだこと

今回のインターンでは、Monoxer APIという外部APIにいくつかのAPIを追加しました。インターンの前半はアカウント管理のためのAPIの追加をしていました。後半は主テーマとして、振り分けルールという便利な機能のAPIを新しく作っていました。

Monoxer APIとは
Monoxerはただの学習アプリではなく、塾・学校・会社など、記憶させたいものがある組織に向けて記憶のプラットホームを提供しています。学習者に何を記憶させたいかは、学習者の属性(所属クラスや志望校など)によって変わります。そのためMonoxerには、学籍番号などのID、〇年〇組といった所属など、色々な情報を登録できます。 クラス変更や学習者の追加などが発生した場合、その情報をMonoxerに反映したいときがあります。その反映は管理画面から行うことが出来るのですが、組織の規模が大きい場合は、管理画面からではなく、その組織のシステムから直接行うと便利です。

Monoxer APIは、そのような場面で使われていて、Monoxerサーバーと外部システムとの間のインターフェースとなっています。 f:id:corp_monoxer:20211007120035p:plain

振り分けルールAPIの追加
Monoxerにはクラスという単位があり、クラスごとに学習者に記憶させたいものを指定できます。振り分けルールとは、アカウントをクラスに自動で振り分けたいときに適用されるルールです。アカウントの情報とクラスの情報を組み合わせて、あらゆるパターンでルールを作ることができ、組織の仕組みに柔軟に対応できるようになっています。

インターン前半で取り組んだアカウント管理APIの方はすでにいくつかのAPIが存在していたのですが、後半の振り分けルールAPIの方は既存のAPIがありませんでした。そのため、JSONの構造や、「どのようなAPIを揃えて振り分けルールの管理を可能にするか」という点から考えました。

API設計
どのようなAPIを揃えるかという部分では、分かりやすく使いやすいAPIにするためにきれいな設計を心がける必要がありました。 Monoxer APIは、RESTの原則に基づいてAPI設計されています。リソース指向アーキテクチャについて勉強してみると、統一的で分かりやすく、おもしろいと思いました。

f:id:corp_monoxer:20211007120131p:plain

得た学び

実際の製品のコードを読んだり書いたりする体験ができて、今まで勉強できていなかった部分(読みやすいコードを書く・APIの設計・データベース周辺)が勉強できました。レビューがとても機能していて、社員の方から、可読性に関するレビューをたくさんいただきました。 Scalaという言語を初めて使ったのですが、Scalaについても色々なことが分かるようになりました。

社員さんとのやりとり

初日にメンターさんから1:1の頻度はどのくらいが良いか聞かれ、小まめに見てもらえるとありがたいと答えたところ、毎日1:1を設定していただけることになりました。心強かったです。
レビューやミーティングではどの社員さんも言葉遣いが柔らかく、働きやすかったです。 またコロナ禍で控えめだったのですが、ボードゲームや、社員の方々・他のインターン生との会話も楽しかったです。

さいごに

エンジニアとして働いたことが無かったので、インターンには勉強になることがたくさんありました。モノグサのみなさま、2ヶ月間ありがとうございました。

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

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

careers.monoxer.com

Monoxer Intern Report #3_手書き文字評価の改善(chikai)

自己紹介

モノグサ社にてソフトウェアエンジニアインターンとして参加した伊藤 誓です。 現在は東京大学大学院に所属しており、VR環境におけるユーザーインターフェースについての研究を行なっています。

なぜモノグサのインターンに参加したのか

夏期インターンを探している最中に、AtCoderJobsというサイトに乗っている掲載を見て応募しました。参加の決め手になったのは、自社開発を行なっている会社で、幅広い技術領域を取り扱っており新しい技術経験が出来ると感じたことや、「記憶」に対して科学的観点からアプローチしていくというアプリのコンセプトが興味を引いたことなどでした。

取り組んだこと

今回のインターンでは、手書き文字評価周りの改善に取り組みました。その中でも、大きく分けると3つのことに取り組みました。

アルファベット対応
元々、アルファベットの手書き文字評価を行うのには以下のような課題がありました。

  • 十字線の上に表示されていて不自然
  • フォントの形が不自然
  • 1画ずつ分けて書く必要がある

内部で実装されている言語IDやテキストの内容から「アルファベットの問題である」と判断された場合には、十字線ではなく四本線の表示を行いました。

フォントの形に関しては、デザイナーさんとも打ち合わせしつつ、svgファイルの変更を行いました。また、背景に表示する4本線と合うように、svgファイルを編集する処理を行いました。52個もあるファイルに対して編集をするのは面倒なので、ファイルの情報を自動で編集するスクリプトを記述しました。

f:id:corp_monoxer:20211007114724p:plain

繋げ書きに関しては、内部のアルゴリズムの根幹に関わる部分なので、まず既存のライブラリの中身を理解する必要がありました。その後、アルファベットにも対応できるように、「複数回の繋げ書き」「離れたストロークを補間する処理」などを実装しました。

アルゴリズムのテストツールの開発
2つ目に、アルゴリズムのテストツールの開発に着手しました。手書き文字評価では、正解の文字と、ユーザの書いた文字を照らし合わせて正解/不正解を判定しますが、評価の精度が低いとユーザ体験の質の低下に繋がってしまいます。そのため、出来る限り精度を上げる必要があります。しかし、アプリに直接組み込まれている状態でアルゴリズムの精度を評価するのは非常に大変です。そこで、一連の評価/デバッグの流れを簡単にするためのテストツールを開発しました。

アルゴリズムに変更を加えた後、コマンドを1つ叩けば、データベースから作成したデータセットに対してアルゴリズムが実行され、変更による寄与の大きいケースをまとめて出力してくれます。さらに、実行時間やスコアの構成要素などのログも閲覧可能にすることで、より詳細なデバッグが可能になっています。

f:id:corp_monoxer:20211007114830p:plain f:id:corp_monoxer:20211007114840p:plain

アルゴリズムの改善
3つ目に取り組んだこととしては、手書き評価アルゴリズムの改善です。自分で開発したテストツールを用いて、上手くいかないケースを探しつつ、改善に取り組んでいきました。

自分は競技プログラミングを趣味の一つとしていますが、感覚としてはヒューリスティックコンテストで出題される問題に非常に近かったです。一方で、普段のコンテストと違っていると感じた点として、入力ケースのほとんどが暗黙の制約を満たしている場合があったり、最悪計算量が悪いアルゴリズムでもほとんどの入力ケースでは上手くいくため事実上問題ない場合などがあったりして、非常に面白かったです。

学び

自分にとっては、他の人と共同開発しながらプログラムを書くという経験があまりなかったので、その部分は非常に勉強になりました。Pull Requestの出し方や、コードレビューへの応答など、円滑なコミュニケーションを取る上では気をつけるべきことがたくさんありました。

また、自分のコードが本番のアプリケーションに統合される経験も新鮮で、「どのようにして出来るだけ安全なコードを書くか?」といったことを考えるのも新しい経験でした。今までは、強い型付けのある言語のメリットが実感できていませんでしたが、実行時エラーの許されない環境で Kotlin を書いていると、型推論をしてくれる有り難さが身に染みた気がします。

社員さんとの関係

コロナ禍でのインターンでしたが、出社して働くかリモートワークするかが比較的自由に選べる環境でした。私は、週に2回出社して残りはリモートという感じでした。リモートの場合でも、1日に1回はメンターさんとの 1on1 ミーティングが用意されたので、特に困るといったことはありませんでした。

相談したいことがあった場合でも、基本的にメンターさんに Slack を送れば即座に反応してくれるので、助かりました。他にも、Jira などを用いてプロジェクトが管理されており、他部署の社員の方も含めて柔軟な議論をすることができました。社員全員がプロダクトの品質向上に対して真摯に向き合っている様子が伝わってくるので、働いているだけで創造性が刺激される素敵な環境でした。

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

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

careers.monoxer.com

Monoxer Intern Report #2_誤答生成の改善(egashira)

はじめに

モノグサでソフトウエアエンジニアのインターンに参加した江頭叙那です。現在は慶應義塾大学の環境情報学部3年に在籍していて、VR空間での運動が実空間での動作に与える影響について研究しています。

参加を決めた理由

私は学生時代から学習アプリなどを用いて、いかに楽に暗記できるかを工夫してきた経験があり、モノグサの記憶を手助けするサービスはとても興味があるものでした。また、アプリからフロントエンド、バックエンドまで幅広く開発を経験できることが魅力的でした。

モノグサでのインターンで主に取り組んだこと

私は今回のインターンで主に誤答生成の改善に取り組みました。 モノグサではBook内(学習する問題群)から誤答を生成する機能と、Book外から誤答を生成する機能があり、私はBook外から生成される誤答の改善に取り組みました。Book外から生成される誤答は、正解の単語と文字類似度が近い物が候補として選ばれるような仕組みとなっており、以下のような課題がありました。

  1. 品詞が一致していない場合がある
  2. 誤答の難易度が、正解と大きく異なる場合がある
  3. 十分な誤答候補数を得られなかった場合に、ランダムで関係のない単語が選ばれる

f:id:corp_monoxer:20211007112552p:plain

上記の課題によって、学習者が選択肢の中から消去法で正解を選べてしまうという問題がありました。

誤答の改善方法 

単語に頻度や品詞が紐づいたデータが必要だったため、単語と頻度が紐づいたデータを入手し、それらに品詞の情報を付与しました。品詞情報の付与にはStanza*1 を使用しました。 そして頻度や品詞別に単語をグループ分けし、グループ分けされた単語の中から、正解の単語と近い文字類似度を持つものを誤答として選ばれるようにしました。また、頻度や品詞別で取得した誤答の数が足りなかった場合には既存の手法で誤答を取得し、それらの単語が正解の品詞と頻度が近いほど選ばれやすいようにする改善を行いました。
具体的には誤答生成の流れを以下のように改善しました。

f:id:corp_monoxer:20211007112715p:plain f:id:corp_monoxer:20211007112734p:plain

誤答生成の流れを上記のように改善したことによって、品詞や頻度が異なる単語が誤答として選ばれにくくなりました。さらに新しいデータで単語を取得するステップを追加したことで、候補数が足りずに完全ランダムで誤答が追加されるケースも大幅に減りました。下記の改善例では正解と誤答の品詞が統一されており、消去法で選ばれにくくなったと思います。

f:id:corp_monoxer:20211007112803p:plain

得た学び

チーム開発は少し経験があったのですが、しっかりと会社でレビューを受けて開発を行うプロセスは初めてだったため、多くの学びがありました。まず入社して印象的だったのは、コードにコメントがほとんど書かれていない点でした。初めのうちはコードを読むのに苦労しましたが、開発のガイドラインに書かれていた「コメントがあっても、わかりにくいCodeを正当化することはできません。」という一文に非常に納得しました。おかげで変数名や可読性を意識してコードを書くようになりました。また、インターンで取り組むテーマの実装なども自分で考えることができたため、自分の実装計画を他の人に伝えるプロセスも大変勉強になりました。  

社員やメンターさんとの交流

メンターさんとは週に1~2回ほど1on1ミーティングがあったため、テーマの実装などの相談をしたり、業務以外のことも話すことができました。私は週3日ほど出社していたので、出社時に直接お話できたのがよかったです。他の社員さんやインターン生とはおやつ会などで話す機会があり、エンジニア以外の業務の話なども聞くことができました。また、CEOの竹内さんがたまに話しかけてくれたのが印象に残っています。インターン生である私のテーマや進捗も把握されていて、驚いたと同時に嬉しかったです。

インターンを通じての感想

私はインターン前まではReactを軽く触ったことがある程度の開発経験だったため、インターンでアプリ(iOS Android)、フロントエンド、バックエンドまで触ることができたのはとても貴重な経験でした。また、私が今回取り組んだ誤答改善のテーマは、既存の誤答生成の方法を大きく変えるものであったため、責任感を持ちながら開発に取り組むことができたのも非常に楽しかったです。

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

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

careers.monoxer.com

*1:Stanza - A Python NLP Package for Many Human Languages https://stanfordnlp.github.io/stanza/

Monoxer Intern Report #1_ファイル検索機能の追加(sakabe)

はじめに

モノグサ株式会社でソフトウェアエンジニアとして約2ヶ月インターンさせて頂きました、sakabeです。名古屋工業大学で情報系の学科に所属しており、ネットワークに関心があります。

なぜモノグサのインターンに参加したのか

モノグサ株式会社との出会いは、AtCoderJobsでした。私は競技プログラミングに取り組んでいて、AtCoderのコンテストに毎週末参加していました。普段から取り組んでいるコンテストサイトにインターンの求人があり、競技プログラミングを取り組んでいることを評価して頂けそうだと思いました。 面接の段階でいくつか取り組む課題を提示して頂き、その課題に取り組んでみたいと思ったので参加を決めました。

モノグサでのインターンで主に取り組んだことと、その中で得た学びや気づき

取り組んだこと

私が担当したのは、共有ライブラリ(先生が生徒に配信する問題や学習計画、小テストを管理する画面)の改善でした。いくつか小さな課題に取り組みましたが、メインテーマはファイルの検索機能の追加でした。 問題背景として、一部の組織では大量にファイルを作成し共有ライブラリに格納しているので、目当てのファイルを探すのに時間がかかることがありました。 最初に思いついたのは、SQLのLIKE句を使うことでした。しかし、ファイルが増えるに連れて検索に時間がかかることが容易に想像できたためすぐに却下されました。 次に思いついたのは、索引(index)を作ることです。文字列のindexの貼り方が大きく2種類あります。意味ごとに分ける形態素解析と、文字数ごとに分けるN-gramという方法です。簡単な例を紹介します。

f:id:corp_monoxer:20211006164942p:plain

形態素解析では日本語の辞書を元に分かち書きします。そして、単語ごとにindexを作成します。N-gramでは、1文字ずつずらしながらN文字ごとindexを作成します。上記の例だと、京都という検索をかけた時に形態素解析では見つかりませんが、N-gramでは見つかります。 ファイルの検索という用途では、固有の文字列が多いことや検索の漏れが少ない方が良いという理由でN-gramを採用しました。このように、実装方針が立っていない課題を与えられ、解決方法を自分で探すことから始まるので、とてもやりがいが大きかったです。

f:id:corp_monoxer:20211006164952p:plain

得た学び

バックエンド、フロントエンドと役割を分けているのではなく、機能ごとにチームが分かれているので2つの言語を使いました。どちらの言語も初めて触りましたが、簡単な課題から取り組むことで徐々に言語に慣れていきました。 チーム開発は初めてで、大規模なコードはどこから編集していいのか戸惑いました。メンターの方に、コードの探し方を教わり、少しずつコードが読めるようになりました。コードのレビューも丁寧で、他の人が読んだときにわかりやすいコードが書けるようになったと思います。なぜそのように書くのか疑問に思ったときに質問をすると、納得する回答が得られました。

モノグサの社員やメンター、他インターン生とのやりとり

隣に座ったインターン生と何度か話すことがありました。他のインターン生もおやつ会を通してコミュニケーションを取ることができました。ここで驚いたのは、それぞれ取り組んでいることが違うことです。どんなことに取り組んでいるのかとても興味深かったです。 お昼にフリースペースでご飯を食べていると話しかけてくださる社員さんもいて、キャリアの相談に乗って頂きました。モノグサには中途採用の方が多いので、前職の話や転職活動についての貴重なお話を聞かせて頂きました。 メンターの方には、毎日1on1をして頂きました。わからないことを質問すると、すぐに答えが帰ってきたのでとても心強かったです。

インターンを通じての感想

ほとんど開発経験もない私ですが、このようなインターンを体験させて頂けて大きく成長出来ました。本物のチーム開発を体験できたことで、個人の開発では、気にしなかったことにも注意が向くようになりました。気軽に質問をする雰囲気を作って頂いたメンターさんには特に感謝しております。

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

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

careers.monoxer.com