エーアイセキュリティラボに入社してからの約半年を振り返って

## はじめに
こんにちは、株式会社エーアイセキュリティラボ　開発部の大桶です。
早いもので、入社してから半年が経とうとしています。

最初の3ヶ月は、巡回エンジンの開発に向けた研修期間でした。座学による基礎知識の習得だけでなく、簡易クローラー開発などの課題もあり、習熟度を確認しつつ進んでいきました。
研修を終えてからの3ヶ月は業務にアサインされ、巡回エンジンのバグ修正と機能追加を担当しました。その他イレギュラーなタスクとして、AeyeScanの手動巡回を補助するchrome拡張機能のバージョンアップ業務にも取り組むこととなり、かなり色々な経験を積むことができたと思います。

ここに至るまでに何か特別なことをしてきたつもりはないのですが、コツコツ研修を通じて基礎を積み上げてきたことが今に繋がっているのではと思い、入社してからの半年間を振り返ってみたいと思います。


## 取り組んだ研修や業務とその感想
### 4月 基礎知識の習得1
4月は、業務に必要な基礎知識を書籍で学んでいました。
学んだことは、HTMLやJavaScript、PHPの基本的な文法や仕様などです。例えば、HTMLの学習では要素の名前と役割、主要な属性などを一通り確認しました。JavaScriptの学習では条件分岐や反復などの基本的な処理の記法や、HTMLの操作やJQueryについてなどを学びました。
学生時代にプログラミング経験自体はあったため、この時学んだ内容はまだ理解がしやすかったと思います。

4月の時点では、学習した内容も初歩的なことが多く、実際の業務内容についてはあまり想像できていませんでした。しかし、この時学んだ基礎のおかげで、後の研修での知識習得や、業務の理解がスムーズになったと感じたことは多いです。
そのため、まず初めにしっかりと基礎を学ぶことができて良かったと思います。


### 5月 基礎知識の習得2
5月は、Node.jsやSQLについて主に書籍での学習を行っていました。
Node.jsはAeyeScan開発のメインとなる言語のため、他の書籍と比べて特に時間をかけて読みました。Node.jsの特徴の1つはイベントループによる非同期処理ですが、非同期プログラミングは今まであまり経験がありませんでした。そのため、コードから動作を理解するのが難しかったです。

Node.jsの知識習得は4月の研修と比べて大変でしたが、学習中に感じたひっかかりや疑問についても気軽に質問できたことが助かりました。また、業務に関係の深い章と、あまり関係がない章を事前に教えていただいたので、読むうえで力を入れるところがわかりやすかったです。
これらの点から、書籍を自分だけで読むより効率良く学習できたと思います。
5月に学んだ内容は4月より少し発展的なもので、実際の業務にも近づいてきた感覚がありました。

### 6月 簡易クローラー開発
6月は、今まで学んだことのまとめとして、研修用の簡易クローラーを作成していました。
こちらの様子は[私が以前書いた記事](https://qiita.com/AeyeScan/items/b442ca1aae70922de18b)でも紹介しております。仕様や苦労した点について、詳しくはそちらをご参照ください。

簡易クローラーの作成では、設計・開発・テストまでを行いました。そのうち、6月は主に設計と開発に取り組みました。サンプルコードなどはなく一からの開発となるため、これまでの研修と比べてかなり手を動かした月となりました。その分、HTTP通信やNode.jsについて、書籍の内容に沿った学習では覚えづらい細かい仕様の理解が深まりました。

実際の製品に組み込まれた巡回エンジンと比べると、この研修で作成したのはかなり簡易的なものです。
それでも、一度自分で実装してみることで、巡回エンジンの仕様を理解する足がかりになったと思います。

### 7月 類似判定機能のルール追加
7月は、6月から引き続き簡易クローラーを作成し、こちらを完成させました。
7月は主にテスト工程を行いました。テスト中には当初想定していなかった入力への対応などに苦労しました。簡易クローラーの作成は、今までの研修の総まとめという位置付けであり、完成した時には達成感がありました。

その後には、初の実務として、AeyeScanの類似判定機能にルールを追加しました。
AeyeScanは自動でWebサイトの巡回を行ってページを取得しますが、多くの場合、巡回中には類似のページや、全く同じページを取得することがあります。例えば、サイト中に「 前へ<< 1 2 3 4 5 >>次へ」 のような形のリンクがある場合、1, 2, 3のリンク先はそれぞれ類似のページの可能性が高いです。このように、既に巡回済みのページと類似のものを判別してスキップするために、AeyeScanには類似判定機能が備わっています。
類似判定機能には先に述べた例の他にも、色々なケースを想定したルールがあります。
この時私が作成したルールは、ECサイトの商品検索結果などの画面を想定して、商品詳細ページへのリンクを類似判定するものです。

この業務は、実装にかかった時間は簡易クローラーより少なかったものの、仕様を定義することに難航しました。本来は類似でないページを誤って類似と判定することを防ぐため、様々な構造のWebサイトを想定して判定ルールを考えることが難しかったです。
また、色々なWebサイトで実験用のコードを試しては修正する、というプロセスを繰り返すにあたり、先の研修でNode.jsのコーディングに慣れていたことで作業が早まったと思います。

### 8月 手動巡回プラグインのv3移行1
8月には、7月に開発した類似判定機能のルール追加が完了しました。
自分が書いたコードがはじめて製品に組み込まれるというのはなかなか緊張しました。
その分、テストコードとコードレビューを通過してmergeされた時は嬉しかったです。

また、手動巡回用プラグインのmanifest v3対応を始めました。AeyeScanは基本的に自動でサイトを巡回しますが、自動巡回が難しいサイトのために手動巡回機能があります。手動巡回機能では、専用のchromeプラグインを使用します。このプラグインはchrome拡張機能のmanifest v2で記述されています。2023年1月にmanifest v2が廃止される予定のため、v3に移行作業を行いました。

v3移行作業では、ライブラリやフレームワークのドキュメントを読まないとわからない情報が必要なことが多々ありました。6、7月の簡易クローラー作成でもこのようにドキュメントを読む機会があったため、4月当初よりは必要な情報を探す力がついていたと思います。

### 9月 手動巡回プラグインのv3移行2
9月は、主に8月から引き続き手動巡回用プラグインのmanifest v3対応を行い、無事に完成させることができました。
9月の割と早い段階で、行儀の良い操作をすれば動くようにはなっていました。しかし、少し想定外の操作をするとすぐにエラーが出ることが続き、一つのエラーの原因特定や修正がなかなか終わらないことも何度かありました。このような時、上司や先輩に相談しつつ、「どのような条件でエラーが発生するか」、「コードのどの部分が関わっているか」などを少しずつ切り分けて対応していきました。

今回の作業では、上記の通り上司や先輩と相談しつつエラーを解決したことが多くありました。相談すると自分では思いつかなかったアプローチや視点が得られ、とても勉強になりました。
今後も業務を通じて色々な知識や視点を吸収していき、できることを増やしていきたいです。

## おわりに
今回の記事では、入社してから半年間でやったことを振り返ってみました。
研修の時点ですでに難しかったものの、初歩的な内容から順序立てて学んでいけたので付いて行くことができました。業務でも苦労したことは多いですが、わからないことは相談ができるところは安心できます。
こうして振り返ってみると、この半年間で新たな経験が多くありました。まだまだ学ぶべきことは多いので、今後も頑張ります！