初めてのハッカソンに挑戦

## **参加したハッカソン**

- 開催日： 2024/08/03 ~ 2024/08/04
- イベント名： **【技育CAMP2024】ハッカソン Vol.11【オンライン開催】**
- 人数：5人

## **作ったもの**
**「ASEticle: Google Scholarに付加価値を」**

スライド

https://www.canva.com/design/DAGM3A9pZL4/eOLBEvwRsx4jDZExG3IY6w/view?utm_content=DAGM3A9pZL4&utm_campaign=designshare&utm_medium=link&utm_source=editor


## **技術スタック**

- バックエンド
    - Python(Flask)
- フロントエンド
    - Next.js
- ソース管理
    - GitHub

## 機能一覧
- クエリから論文検索
    - IEEE
    - arXiv
    - ACM
- ソート機能
    - NEW: 学会ランキング
    - NEW: 被引用数
    - 関連度
    - 日付
- フィルタ機能
    - NEW: 日付ごとのフィルター機能
    - NEW: 論文投稿サイトのフィルタ機能
:::note
NEWはGoogle Scholarにない、新しく追加した機能
:::

## アプリ開発動機
私たちは研究を進める上で、自分のテーマに近い論文を検索する機会が多い。論文検索ツールの一つにGoogle Scholarがある、。Google Scholarは高速にクエリとの関連度が高い論文を表示してくれるサービスである。シンプルで使いやすいサービスだが、論文自体の信憑性は詳細を見ないとわからないことがある。特に私たちの研究室では、有名な学会でその論文が評価されているかを吟味すべきだとご教授いただいている。したがって論文が発表もしくは査読されているかを確認する必要がある。その作業を効率化するため、このアプリ開発に取り組んだ。将来的には、研究に取り組む学生に貢献できるアプリになることを目指している。学生が効率よく信頼性の高い論文を見つけ出し、自身の研究を進展させる一助となるようなツールを提供することを目標としている。









## やったこと

- フロントエンドの入力受付と送信
- バックエンドのルーティング
    - それらのAPI接続周り
- IEEEの論文取得

## 良かった点

- **要件定義を行なったこと**: なにを作るか考えたときに自分たちがよく使うものの中で困っているところを効率化するアプリを軸に考えた。アプリケーションは使う人がいて初めて意味を成すものだと考えているため、要件定義を考え抜いたことで開発のモチベーションに繋げることができた。いくつか案が出たが準備期間含めて1週間でできるものと、ユーザ価値が高いものを判断基準にしで今回の案を選択した。
- **なんとか形にできたこと**: Webアプリ開発に初めて挑戦する人が多く大変だったが、わからないことはすぐにDiscodeで質問、共有することができる環境を用意してチーム全員で開発できてよかった。特にフロントとバックの統合作業に苦戦していたが、本番当日にはバックから入手した情報を表示するところまでできてよかった。

- **GitHubのPRコメントやprefix等を指定したこと**: チーム開発ではメンバー個人個人の記法や個性が色濃く出るためあらかじめ統一したことはよかったと思う。それによってレビューがしやすくなったと感じている。

## **反省点**

- **設計が甘い**： アイデア出しの後、入出力や画面構成などが曖昧で、実装段階に設計のやり直しが何度もあった。完璧に設計をするのは難しいが、一通り設計してから実装に移るようにすると無駄な時間が発生せず、マージ作業もやりやすいと感じた。
    - ハッカソン初参加ということもあり、限られた時間の中で成果物を出さないといけない不安があった。また、5人で役割分担するのが難しかったため早い段階でコード実装を行なってしまった。

- **設計通りに実装していないことがあった**： Figmaを用いてクラスごとの入出力や依存関係を設計した。しかし、実装後に設計通りではないコードでPRを作成してしまい、無駄な時間を過ごしてしまうことが多かった。PRのコメントを作成する時に以下のようなチェック項目を作成するとスムーズにレビューができるのではないかと振り返っている。
    1. 設計に従っているか
    2. エラーがないか
    3. 依存関係は正しいか
    4. 無駄なコードがないか
    5. 例外処理があるか


<br/>

- **設計図を作る**: 実装に入る前には、機能の洗い出しが必要である。そのためには機能の可視化が必要である。Figma等に可視化することでチーム内の完成イメージが統一されやすいため、まとまって開発しやすい。
- **コメントが少ない**: 個人で開発する時も同じだが、他人が書いたコードはすぐに理解できないことが多い。今回の開発ではコメントをあまり書かずPRを出してしまうことが多かった。従って最低限クラス単位や関数単位でコメントを書くことが大事だと考えている。

## **その他の感想・学び**

### マネジメント

- わからないことや困っていることを共有しやすい環境の大切さを再確認できた。実装で詰まった時にペアプロで同時に開発していただき実装できたものも多くあるため今後チーム開発に取り組むときは雰囲気作りもしていきたいと思う。
- タスク管理の難しさを学ぶことができた。今回のハッカソンはかなり時間が短いため、タスクを一覧化して優先度をつけることが大事だと学んだ。開発過程で割り当てられたタスクが終わり、何が残っているかわからなくなった時があった。さらに優先度をつけることで効率的に作業を進められるとわかった。

### 技術

- Pythonの相対パスに苦戦した。TypeScriptでは呼び出し元ファイルからの相対パスで指定を行う。しかし、Pythonでは階層を上がって指定することは(デフォルトでは)できないようになっていた。Pythonはさまざまなライブラリがあるが、そのなかで外部から指定した予期せぬファイルアクセスを禁止するために上階層のアクセスはできないことが原因だった。ここから、言語ごとの違いを知ることができて面白いと感じた。

- フロントとバックを異なるリポジトリで管理しているため、CORSの設定も学んだ。この技術はウェブブラウザが、あるオリジンから別のオリジンへのリソース要求を制限するセキュリティ機能である。flask-corsを使って実装したが、ポートの関係でうまく通信ができず苦戦した。それを解決すると共にdocker-compose.ymlについての知識もつけることができた。

## まとめ

デプロイおよび受賞は叶いませんでしたが、最後の懇親会で多くの方々から「使ってみたい」とのお声をいただき、頑張った甲斐があったと感じました。

今回は論文検索の効率化を目標にアプリを開発しましたが、身の回りにはまだまだ解決すべき課題が残っています。そのため、今後も開発を継続し、効率化とユーザビリティ向上に向けて取り組み、より多くの人々の役に立つアプリを目指していきます。


## ソースコード

https://github.com/lxzLocus/ASEticle-Backend

https://github.com/lxzLocus/ASEticle-Frontend