【インターン】ニフティ株式会社の5daysインターンを振り返る

## はじめに

この記事では、ニフティ株式会社さんで2024.8.5~8.9にかけて実施された開発職向けインターンシップにおいて、5日間で学んだことや取り組んだことについてまとめました。
なお、この記事はニフティ株式会社さんから許可をいただいたうえで掲載しております。
### 目次

1. インターンの概要
    - 5日間の流れについて
    - 自チームの成果物
    - 担当した部分
    - 使用した技術
    <br>
2. 参加した当時の技術レベル
    - プログラミング歴半年程度
    - 開発経験
    <br>
3. 事前準備
    - 事前に配布された資料に目を通す
    - Flaskで簡単なAPIを実装
    - 簡単なメール送信機能を実装（インターン中）
    <br>
4. インターンを通して学んだこと
    - Gitの理解
    - Flaskを使ったバックエンド開発
    - リーダーでないときの立ち回り方
    - ビジネス視点
    <br>
5. 参加するメリット
    - スクラム開発について学ぶことができた
    - Gitの使い方を学んだ
    - ニフティおよびISPの理解が深まった
    - 他のエンジニア学生のレベル感を知れた
    - メンター社員から手厚いサポートが受けられるので、経験が浅くてもなんとかなる
    - チーム開発経験が得られる
    - 対面のインターンなのでオンラインよりコミットメントが高い
    <br>
6. やってよかったこと
    - 事前準備
    - 技術的な挑戦
    <br>
7. もっとこうすればよかった点
    - 次はリーダーとして
    - 詰まったときの対処
    <br>
8. まとめ

## 1. インターンの概要

### 5日間の流れについて

1日目~2日目：
- 成果物決め
    - 経営課題に沿ったテーマについてチームで話し合い、課題を解決するためにどのようなサービスを開発すべきかを考えました
    - 私たちのチームでは、プロバイダの一般的な認知度が低いことや、新規契約者にとってどのプロバイダと契約すべきか判断が難しいという課題に着目し、そのハードルを下げるためのアイデアを出しました
    - その結果、私たちは「ニフシミュレーション」という、ユーザーが自分に合ったプロバイダを簡単に見つけられるWebアプリケーションを開発することに決まりました
    - 2日目か3日目にAWSのセットアップなどの環境構築を説明を聞きながらやりました

3日目~5日目：
- 開発
    - 3日目からはスクラム開発で成果物の完成に向けて開発を進めました
    - テーマに沿って実装すべき機能を書いた付箋をホワイトボードに貼りながら、何を実装するか、どこから実装するかについて優先度を立てました
    - 優先度の基準は、ざっくり「難易度」「必要性」の2点で決めていました
    - 毎朝デイリースクラムで簡単な振り返りをしてから各自担当する部分の開発に取り組みました
    - 1日のスケジュールが終わったらチームごとに今日取り組んだ内容についてレビューをしました
    - 5日目の午後には企画部長やエンジニア社員に向けてプレゼンテーションを行いました。


### 自チームの成果物

私たちは「ニフシミュレーション」という、ユーザーが自分に合ったプロバイダを簡単に見つけられるWebアプリケーションを開発しました

#### 主な機能

**① サービス名や月額料金などを表示する機能**

「価格.com」を参考に、プロバイダのサービス名、月額料金、通信速度などの情報をデータベースに格納し、ユーザーがこれらを簡単に確認できるようにしました。
<br>

**② 契約中の携帯キャリア、エリア、価格などの条件での並び替え機能**

ユーザーが自分のニーズに合ったプロバイダを見つけられるよう、契約中の携帯キャリアやエリア、月額料金といった条件でプロバイダを並び替える機能を実装しました。この機能により、ユーザーはより精度の高い検索結果を得られるようになりました。
<br>

**③ 他社サービスとの比較機能およびニフティのサービスに絞った検索機能**

ユーザーが他社のプロバイダと比較できる機能を実装し、複数の選択肢から適切なサービスを選べるようにしました。また、ニフティのサービスに絞って検索できる機能も提供し、ユーザーが信頼性のある情報に基づいて選択できるようにしました。
<br>

**④ 新規登録時に登録完了メールを自動送信する機能**

新規登録が完了したユーザーには、捨てメアドからユーザー宛に登録完了メールが自動で送信されるようにしました。
<br>

**⑤ ログイン機能の実装**

ユーザーのニフティポイントと連携させるため、ログイン機能を実装しました。なお、ログインしていないユーザーでも料金比較ができるように、トップページで分岐させる仕様にしました。
<br>

**⑥ポイント獲得通知機能**

ログインしたユーザーには、ナビゲーションバーに現在のポイント数を表示する機能を追加しました。また、新規登録時には「ご契約ありがとうございます！」というメッセージとともに、100ニフティポイントが付与される仕様にしました。
<br>

### 担当した部分

私は上記の機能のうち、
「① サービス名や月額料金などを表示する機能」
「④ 新規登録時に登録完了メールを自動送信する機能」
を主に担当しました。

さらに「② 契約中の携帯キャリアによる並び替え機能」と「⑥ ポイント獲得通知機能」の一部にも携わりました。


- **① サービス名,料金の表示機能**
    - バックエンドを担当し、データベースに新しいテーブルやカラムを作成するところから、空のテーブルにデータを挿入するシーディングまでを実装しました
    - シーディングの際には、`Seeder`というPythonのライブラリを使用しました
    - このライブラリを使用することで大量の製品情報を入力する作業が効率化され、他のチームやメンターから高評価を得ることができました
    - 多くのチームは手動でデータを挿入していたため、ライブラリを活用した点が評価されました

Seederについて

https://qiita.com/ichi_zamurai/items/9e449603e39e8054e301

- **④ メール通知機能**
    - `flask-mail`とSMTPプロトコルを使用して、`test.takutosan@gmail.com`という捨てメアドから新規ユーザー宛に自動的にメールが送信される仕組みを実装しました
    - 最終的にメンター社員さんのサポートを受けて完成させましたが、事前に自分でメール送信のスクリプトを作成してから臨んだことで、プロジェクトの進行がスムーズになりました
        - メール送信機能の事前準備については、[現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/?couponCode=LOCLZDOFFPJPCTRL) の「メール送信」の章を視聴して、前日に自分で試してました
    - メンター社員さんから「メール通知機能を実装したのはここ数年のインターンシップで初めて」としてポジティブなフィードバックをいただきました

また、
- 「2. 並び替え機能」
- 「6. ポイント獲得通知機能」

については、事前準備として、Flaskで簡単なREST APIを実装した際のソースコードをチームメイトに共有し、実装をサポートしました。
具体的には、CRUD処理やDBセッションの確立をFlaskアプリケーションで行うためのコードを提供しました。
これにより、GETやPOSTメソッドを使用した並び替え機能の実装がスムーズに進み、新規登録完了時に100ニフティポイントをデータベース上に保存し、ユーザーに通知する機能を実現する足掛かりとなりました。

こちらについては改めて[3. 事前準備]()の章で説明します

### 使用した技術

自分のチームが使用した技術について、覚えている範囲で書きます

- **Python**: バックエンド
- **JavaScript:** フロント
- **Flask**: Pythonフレームワーク
- **Docker**: 開発環境
- **Git**: バージョン管理
- **AWS**: プロダクトのデプロイ先

Pythonライブラリ
- **pymysql**: mysqlデータベースとの連携
- **flask-migrate**: データベースのマイグレーション管理
- **flask-sqlalchemy**: ormによるデータベース操作
- **flask-mail**: メール送信機能の実装
- **flask-login**: ユーザー認証とセッション管理
- **rye**: パッケージ管理とプロジェクト環境の管理
- **スクラム開発**: アジャイル手法によるチーム開発



## 2. 参加した当時の技術レベル

- プログラミング歴半年程度
    - 文系学部でしたが、独学でPythonを使って統計学やデータサイエンスを3ヶ月程度勉強していました
    - 授業では一切プログラミングをしていませんでした
    - Web系の言語を使った開発歴は3ヶ月程度で、Udemyの講座を見ながらアプリを作ったりProgateでいくつかの言語の基礎文法を学んだ程度でした
<r>

- 開発経験
    - 長期インターンに参加して1ヶ月程度でしたが、当時はまだ開発系のタスクをやったことがありませんでした
    - ProgateでJS, React, Git, コマンドライン, Ruby, PHPなどを一通りやっていました
        - 気づいたらLv.172になってました（8講座分）
    - UdemyでDjangoの講座でブログアプリを作っていました
        - [【個人開発】DjangoでつくるはじめてのWebアプリケーション](https://qiita.com/takutosan/items/15088a2951b177c7f081)

<r>

- 参加した理由
    - スクラム開発について学びたかったから
        - スクラム開発という開発手法があることは知っていても、実際に何をしているかわからなかったためインターンを通して勉強したいと思いました
    - 5日間で技術力伸ばしたかったから
        - 「5days以上のインターンは就職活動で有利になる」とどこかで聞いていたのもありましたが、技術力を伸ばしたいと思っていたので3~5daysのインターンに積極的に応募していました
        - 本当のところは、マイナビのインターンで大手企業のインターンを探していてたまたまニフティのインターンを見つけたので応募してみたら通りました（笑）
    - 他のエンジニア学生のレベル感を知る
        - 文系学部で周りにエンジニアを目指す学生がゼロだった自分にとって、外の世界を知るいいきっかけになると思い、他社含め積極的にインターンに応募していました

<br>

## 3. 事前準備

- 事前に配布された資料に目を通す
- Flaskで簡単なAPIを実装
- 簡単なメール送信機能を実装（インターン中）
<br>

- **事前に配布された資料に目を通す**
    - インターンに先立って、Slackなどで事前にDockerやスクラム、Flaskの入門サイトが紹介されていたので目を通しました
    - 完全に理解しなくても大丈夫だと思います
    - 当日はAWSやDockerのセットアップをした記憶がありますが、この辺はニフティさんが指定した手順にそってやっていくのであまり心配いらないです
    
<br>

- **Flaskで簡単なAPIを実装**
    - Udemyで酒井潤さんの講義を購入していましたが、その中にFlaskの入門があったので事前に視聴しておきました
    - Flaskを使ったCRUDの実装例として大変参考になりました

ソースコード: 
[Flaskで簡単なAPIを実装](https://qiita.com/takutosan/items/e45f420544f75b32ad5f)

参考: 
Flask
[現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/learn/lecture/8451958#overview)

<br>

- **簡単なメール送信機能を実装**
    - こちらも酒井さんの動画講義にあったので、事前に視聴しローカルで実際に動かしてみました
    - インターン4日目の夜にホテルで講義を視聴し、捨てメアドからメールが手元に来るか検証しましたが、メールが届きませんでした
    - 5日目にメンター社員の方に見てもらったところ、Googleで必要な登録処理をしなければならなかったので、それを済ませてからインターンシップの環境設定で改めて検証したところ、メールが届きました

参考: 
メール送信機能
[現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/learn/lecture/8519076#overview)


## 4. インターンを通して学んだこと

- **「Gitの理解」**
    - 本格的にGitを使ったのはこのインターンが初めてでした
    - ローカルとリモートの違いがわからなかった自分でしたが、メンター社員の方が図で説明してくださったおかげでGitの理解が深まりました
    - 私たちのチームはコンフリクトに悩まされましたが、どういう条件でコンフリクトが起こるのか、なぜ同じファイルを複数の開発者が同時に触るべきでないのか理解することができました

<br>

- **「Flaskを使ったバックエンド開発」**
    - Seederでデータベースに価格.comで調べた製品のデータを格納したり、メール送信機能を実装したりとさまざまな機能の実装について学びました
    - チーム開発経験がほぼゼロの自分でしたが、メンター社員さんの助けを借りつつバックエンドの機能を実装できたことは自信につながりました
    - また、ほぼPythonしか触ったことのなかった自分にとって、Pythonのフレームワークで開発できたことは学習コストの面からも非常に助かりました

<br>

- **「リーダーではないときの立ち回り方」**
    - これは非常に重要なことだと思います。
    - インターンシップに参加すると、自分よりリーダーシップに優れたメンバーや技術力があるメンバーがいて、その時点では経験やスキルで勝てないことがよくあります
    - そんな時こそ、「今、自分に何が求められているのか」を考えて立ち回ることが重要かと思います
    - エンジニアとして仕事をするときも恐らく会社が自分に求めていること(やって欲しいこと)と、自分がやりたい仕事がマッチしないことがあるかと思います
    - ですが、チームで成果を出す場面では周りと協調し、その裏で自分のやりたい仕事をするために足りないスキルや経験を埋める努力をすることが大事なのではないかということに気づけました
<br>

- **「ビジネス視点」**
     - このインターンシップの特徴として、経営課題に沿ったプロダクトを考えるといった上流工程に重きを置いている点があります
     - 実際に初日と2日目は資料をもとに会社の現状を分析するという時間がありました
     - 私自身、商学部の学生なので多少はビジネス視点というところに強みがあり、アイデア出しでは積極的に意見を出しました
     - 特に、資料だけではわからない構造的な部分についても言及しました
     - 例えば、テレビCMをしていないためプロバイダの認知度が低いことが背景にあるといった指摘や、ノジマが主に関東地区に展開していることから、関西のお客様はターゲットにしにくいことなど、マーケティングや経営者の視点から課題に対してアプローチしました
     - このように、文系学部だからできることを発揮できたことがもう1つの成果だと思います


## 5. 参加するメリット

- **スクラム開発**について学ぶことができた
- **Git**の使い方を学んだ
- **ニフティおよび*ISPの理解**が深まった
- 他のエンジニア学生の**レベル感**を知れた
- **メンター社員**から手厚いサポートが受けられるので、経験が浅くてもなんとかなる
- **チーム開発経験**が得られる
- **対面**のインターンなのでオンラインよりコミットメントが高い

*ISP: インターネットサービスプロバイダ
<br>

スクラム開発とGitについてはすでに述べたのでそれ以外のことについてコメントします
- **ニフティおよびISPの理解**が深まった
    - 私は西日本に住んでいることもあって、ノジマやニフティのことは全く知りませんでした
    - 普段の生活でISPを意識することはありませんが、インターンを通じて業界のことや事業内容を知ることができました
<r>

- 他のエンジニア学生の**レベル感**を知れた
    - インターンでは全国からさまざまなバックグラウンドの学生が集まります
    - プログラミングの経験はあるけど情報系ではなかったり、逆に院生で4年以上プログラミング歴や開発経験が豊富な学生もいました
    - インターン中は「普段どんなことしてるの？」みたいな話はしませんでしたが、5日間のうち何日かは夜ご飯一緒に食べに行って就職活動の話や研究の話などを聞けました
    - 私の場合、みんな自分より優秀だったので、そういった学生から得られたものも大きかったです
<r>

- **メンター社員**から手厚いサポートが受けられるので、経験が浅くてもなんとかなる
    - インターンに応募・参加する上で技術力に自信がなかったり、「自分が参加して浮かないかな」と不安になったりするかもしれません
    - しかし、インターンでメンターとしてついてくださるニフティの社員の方は若いエンジニアの方も多く話しやすかったですし、エラーの解決を手伝ってくださるので気軽に質問できる環境が整っています
    - なので、置いていかれる心配はないのでわからなかったら積極的に聞きましょう
<r>

- **チーム開発経験が得られる**
    - 5日間とはいえ意外とあっという間なので、目に見える変化はないかもしれません
    - しかし、インターン終了後に他のインターンに参加するにしろ、2,3ヶ月後に本選考を受けるにしろ、チーム開発経験や自分が実装を担当した経験は次につながります
        - 実際に、現在参加している長期インターン（開発アルバイト）でもインターンの経験が活きています
        - 例えば、Gitで他のブランチの変更取り込んだりPR出したりと当たり前に使いますし、与えられた要件に沿って決められた期限を意識しながら開発することも多いです
        - 本選考でも、自分が開発したもの（ポートフォリオ）だけでなく、チームで何か開発した経験があるかについてもよく聞かれました
    - このように、実務でも他のインターンでも基本的にはチーム開発なので、5日間を通して得られた経験は次につながります
<r>

- **対面のインターンなのでオンラインよりコミットメントが高い**
    - これはあくまで自分の感想ですが、オンラインのインターンと対面のインターン両方参加してみて一人一人のコミットメントの違いを感じました
        - オンラインのインターンであれば、基本的に中心となる学生（つよつよエンジニア？）が意見を出して他の人がそれに賛同するみたいな流れになりがちですが、
        - 対面のインターンでは割と一人一人考えやアイデアを話す機会が多いので、自分にとっては対面の方が積極的に取り組めた気がします
    - また、それぞれが今何しているかを把握しやすいので、作業の進捗を意識して取り組めるのも特徴かと思います
    - なお、交通費と宿泊費は会社が負担してくださったので、遠方の学生でも費用面で心配ありません

## 6. やってよかったこと

インターン前や期間中にやってよかったことは以下の2つです。

- 事前準備してよかった
- 技術的な挑戦
<br>

- **「事前準備してよかった」**
    - これは先程も紹介したように、インターンの事前準備としてFlaskで簡単なREST APIを実装したこと、また、インターン期間中にメール通知機能を実装すると決まってから、事前にflask-mailとGmailで簡単なメール通知機能を実装したことの2点が挙げられます
<br>

- **「技術的な挑戦」**
    - メール通知機能の反響が良かったことが印象に残っています
    - メール通知機能を最終日ギリギリに実装できたのですが、最終発表のときにニフティ社員の方や幹部社員の方、他チームの人からの反響が大きかったです
    - 特に、メンター社員の方から「メール通知機能を実装したのはここ数年のインターンシップで初めて」と言われ嬉しかったです
    - また、最終日のプレゼンでも、幹部社員の方から「メール通知がきてポイントが付与されるのは面白いね」という評価をいただけました
    - もちろん、メンター社員の方のフォローやポイント付与機能を実装したチームメンバーの頑張りなしでは完成し得ませんでしたが、これまでやったことの無い実装にチャレンジする楽しさを感じることができました


## 7. もっとこうすればよかった点


より充実したイベントにするためには以下の2つが必要だと思いました。

- 次はリーダーとして
- 詰まったときの対処
<br>

- **「次はリーダーとして」**
     - 今回はスクラムマスターやプロダクトオーナーに立候補することができなかったので、次はリーダーとしてチームに貢献出来ればと思います
     - インターンシップではたいてい技術力のあるメンバーがリーダーを務めることが多いですが、進捗管理やタイムキーパーなど技術力が関係ないようなポジションであれば自分にもできるのでもっと積極的に手を挙げられたらと思います
<br>

- **「詰まったときの対処」**
    - これは4日目の出来事ですが、朝VScodeを開いてさあ開発を始めようというときに、VScodeが開けないということが起きました
    - さらに、悪いことは続くものでVScodeをアンインストールして始めたあと、今度はDockerが立ち上がらないということが起き、メンバーと進行にだいぶ差が生まれてしまいました
    - 焦るとともにイライラしましたが(笑)、自分で解決できなそうなら早めにメンター社員を頼るべきだったと思います(自分だけで抱えて悩むより共有した方が早い)
    - また、その際も、「ここまではわかったけどここからがわからない」と伝えることができれば、相談を受ける相手も理解しやすくなるかなと思いました

## 8. まとめ

ニフティさんのインターンシップでは非常に多くのことを学ぶとともに、オフラインということもあってチームメンバーと仲が深まって色々な話を聞けたのでよかったです。27卒以降の方には是非おすすめしたいインターンシップですので、来年度も開催されるのであれば応募してみてはいかがでしょうか。