株式会社CyberOwlで22卒エンジニア内定者アルバイトをしている佐藤です。

今回、業務で利用するサービスをインターンアルバイトのチームで開発しましたのでレポートにさせていただきました。

この記事を通してCyberOwlという子会社や内定者アルバイトの雰囲気が伝われば幸いです。

CyberOwl ってどんな会社?

「調べる」を豊かに”  をMissionに掲げ、ライフスタイルメディアの企画・開発・運営や メディアコンテンツ制作事業を展開しているサイバーエージェントの子会社です。 

メディアは塾・予備校・家庭教師・オンライン塾などの習い事に関する総合情報サイト「テラコヤプラス by Ameba」、他には金融や美容な生活商品など、様々なメディア運営をしています。

CyberOwlでは独自のエンジニアインターン採用があり、インターンでは実務に取り組む実践型の長期インターンを実施しています。

※現在、CyberOwlはサイバーエージェント本体の採用とは別で子会社採用を行っております。

 

今回は独自のエンジニアインターン採用のフローで課題がありました。

エンジニアインターンの採用フローと課題

独自のインターン採用ではWebテストを含む以下の採用フローになっていました。

Webテストの内容も独自で考案したプログラミングテストです。

 

書類選考→Webテスト→人事面談→最終面談

 

Webテストでは問題の送付・評価・管理が手作業になっていたため、効率改善が課題としてありました。

今回、効率改善とプログラミングテストの内容のリニューアルを目的とした、インターンアルバイトを主体とする新規プロジェクト「Owlet(アウレット)」を立ち上げることになりました。

※Owletは CyberOwl entranceの略称として名付けました

Owletのルートページ

Webテストの主な要件

プログラミングテストのため、実際にそのコードが正常に動作することの検証が必要です。

今までは採点者のPC環境でコードの実行をしていましたが、今回はWebサービスのためWebブラウザ上でコード実行をして検証をするインフラ環境の構築が求められました。

また採点者がコードを確認をする管理画面も必要になりました。

実装について

owletはVue.jsを使ったSPAで作成しており、裏側はAWSを使ったサーバーレスアーキテクチャを採用しています。全体で使用した技術は以下の通りです。

選択技術

フロントエンド

Vue.js

バックエンド

Node.js

インフラ

Docker,  AWS SAM,  AWS API Gateway,  AWS lambda,  AWS S3,  AWS DynamoDB

 

ローカル環境はAWS SAMとDockerを組み合わせて構築しました。

AWS SAMはAWSが出しているフレームワークで、template.yamlに設定を記述することで、ローカルでAPI GatewayとLambdaの環境を再現することができます。また、作成したtemplate.yamlファイルからのデプロイも可能です。

DockerではVue.jsコンテナとAWSが出しているDynamoDB-localというDynamoDBのDocker Imageを使用して作成しました。

本番環境は下図のようになっていて、一般的なAWSを用いたサーバーレスアーキテクチャで構築しましたが、一部こだわっている部分があります。

 


 

こだわった部分

OwletではS3ホスティングの通信暗号化にCloudFrontを使用せずに、API Gatewayの機能だけで実装しました。この仕組みはチャレンジの意味もありますし、Owletのサービスの特性上アクセスするユーザーは限られるため、CloudFrontよりもコストがかかるこの仕組みを採用することができました。

この仕組みのメリットとしてはインフラをSAMのみでコード化できることにあります。AWS SAMではtemplate.yamlとswagger.yamlにAPI GatewayとAWS Lambdaの設定を記述することで、簡単にデプロイが可能です。そのためCloudFrontを使用せず、代わりにAPI Gatewayの機能を使用することで、インフラをコード化し、管理することができます。

# template.yaml
Resources:
  OwletApi:
    Type: AWS::Serverless::Api
    Properties:
      Name: owlet-api
      StageName: !Ref EnvName
      DefinitionBody:
        Fn::Transform:
          Name: AWS::Include
          Parameters:
            Location: swagger.yaml

この仕組みを実現するためにAPI Gatewayのproxyの機能を使用しましたが、ユースケースがほとんどなかったため実装するのに苦労しました。

実装や試行錯誤については、以下のブログで詳しく紹介しているので興味がある方は見てみてください。

https://www.cyberowl.co.jp/blog/technology/1453

出会った問題

Webテストサイトなので、ユーザーのコードを安全に実行し、正しいレスポンスを返せる仕組みを実装することが重要でした。そのため、想定しうるコード実行を調べました。その中でもメモリーオーバーフローになるコードは大きな課題でした。

AWS lambdaでは、メモリーエラーになると実行自体が停止してしまうため、意図したレスポンスが取得できませんでした。AWS lambda自体のメモリーを増やすことも考えましたが、メモリを逐次計算する必要があることや、実行時間も採用の評価基準に含まれていたため、余計な処理が含まれてユーザーコードの正確な実行時間が測定できないと考え、採用しませんでした。

そこでこの問題を解決するために、プロセスのフォークの仕組みを利用しました。ユーザーコードを実行するための子プロセスを実行することで、メモリーエラーが起きても親プロセスは動くので、lambda側でレスポンスを正しく制御することができるようにして解決することができました。

プロジェクトの成果

このプロジェクトによりWebテストの送付という対応がURLを送るだけになり、エンジニアリングマネージャーの作業を丸々なくすことができました。

また運用を開始して1〜2ヶ月で応募が数十の中でWebテスト合格者は3人であったのですが、その内の2人を採用するという精度の高い結果を出せました。

CyberOwlのCTOも優秀なインターンを採用できたと嬉しく仰ってくれました。

上長からのコメント

社員のフォローはありましたが、インターンメンバーが自分たちで考えて質問や相談をし、主体でプロジェクトを進行してくれた点がお互いの成長に繋がり、良いプロジェクトを実現できたと彼らの成長から実感しています。今後もこういったチャレンジの機会を作ってゆければと考えています。

感想

内定者バイトが始まって一番最初のタスクで、新しいプロジェクトを立ち上げるところから携わらせていただきました。

今回のプロジェクトでは納期が決まっていたので、メンバーのシフトや技術に合わせてどのようにすれば納期に間に合うのかを意識して開発をしました。コロナ禍だったこともあり、ほとんどリモートでのチーム開発でしたが、積極的にコミュニケーションをとって進捗確認をしたり、メンバー全体のタスク管理表を作成したりと、実際の業務でのタスク管理を意識した開発をすることができました。

また、AWSを使ったインフラ構築や、デザイナーさんを交えたUIの作成など、非常に裁量があると感じたと共に、このプロジェクトを通じて多くのことを学ばせていただきました。

特に、CyberOwlの多くのエンジニアの方々に協力していただきました。

コードを実装したメンバーだけでなく、エンジニアの方々も真剣にレビューしていただいたおかげて満足のいくサービスを作ることができたと実感しています。実際にサービスが稼働して成果を出すことができ、採用に貢献できたというのは非常に嬉しい経験をさせていただきました。

今後はフィードバックを受けて、Owletの品質をより向上させることで、エンジニアリングで採用に貢献していきたいです。