Web系未経験の学生が就業型インターンで学んだこと

はじめに

こんにちは、エキサイト株式会社で1ヶ月の就業型インターンに参加させていただいている久米です。

今回は、8月の1ヶ月間で学んだことについてご紹介します。

自己紹介

情報系大学院に通っている修士1年です。

大学院では深層強化学習の研究をやっていたりします。趣味で統計学の勉強していて、統計検定準1級を持っていたりします。技術的なことでは、基本的にPythonを触っているのでWeb系の言語はほぼ触ったことないですし、実務経験などもありません。

本稿では、1ヶ月の流れについて、また何を学んだのかについて述べようと思います。

やったこと

私は、SaaS・DX事業部のKUROTENに配属されました。元々事前面談でGo言語を触ってみたいと言っていたこともあってKUROTENのバックエンド側の開発に携わらせていただきました。

主なタスクとしては、一つのエンドポイントをMVCからクリーンアーキテクチャに移行するといったものです。

この記事によると、元々KUROTENはMVCを採用していました。現在はMVCからクリーンアーキテクチャに移行中とのことです。

今回のインターンでは、Go言語を用いて一つのエンドポイントをMVCからクリーンアーキテクチャに移行するタスクを実際にプルリクを出し修正するところまで行いました。

インターンの流れ

ここからは章別に学んだことや為になったこと、苦労したことなどについて語っていこうと思います。

環境構築編

最初にやらなければならなかったのが、環境構築です。KUROTENの開発をするためにまずはローカル環境でKUROTENを立ち上げる必要がありました。

大きなサービスを一つ立ち上げるということで、さまざまなツールをインストールしたり、コマンドを打ったりしていました。分からないことも多く、調べて分からなかったことはメンターさんに質問したりして解決していきました。 その甲斐あって、比較的早く環境構築が完了でき、メンターさんには頭が上がりません。

自分で考え抜くことはとても重要なことですが、それでも分からない場合はメンターさんに質問し、解決を仰ぐことが重要だと感じました。

クリーンアーキテクチャ

環境構築が完了してから実際にタスクを割り振っていただきました。それが、ある一つのエンドポイントをMVCからクリーンアーキテクチャに移行するというタスクです。

自分の中ではGo言語も全くの素人なのに新しいアーキテクチャの勉強もしなければいけないということで頭はパニックになってました。 こちらの記事を元にクリーンアーキテクチャについて学びました。

ここで、サービスを運用していく上でアーキテクチャは非常に重要なんだなと思いました。アーキテクチャについて考えることで新しい機能の追加や修正、メンテナンスなどがしやすくなるためです。

実装編

クリーンアーキテクチャの概要を理解したところで、実際のコードを書くところに移ります。しかし、私はバックエンド未経験、Go言語未経験なため、まずはGo言語の書き方について勉強しました。

ここで私はGo言語の勉強をネットの記事ではなく実際のコードを読みながら学習していきました。KUROTENのコードを読んで思ったことは、やはりコードでは命名規則がきっちり決まっており、変数名も用語集にまとまっていました。また、コードも綺麗だったため読みやすく、理解しやすかったです。やはり、チーム開発では他の人が読みやすく改修しやすいように書くことが重要なんだと思いました。

自分のコードと会社のコードの相違点として、例えば、個人で開発しているときは人数を表す変数を"num"や"number"と書きがちですが、KUROTENでは"numberOfPeople"など一目見て人数だと分かる変数名を使用していました。具体的に下記に今回私が書いたコードの一部の載せます。(※許可はいただきました)

if _, ok := totalNumberOfPeopleMap[averageKey]; !ok {  
    totalNumberOfPeopleMap[averageKey] = nil  
}

上記のコードは生成したtotalNumberOfPeopleMapに対してnilを格納しているコードです。ここでaverageKeyとは文字列の"average" が格納されています。個人で書くとtotalNumberOfPeopleMap["average"]と直で書いてしまうところ、きちんと変数を使っていることが分かります。

for _, numberOfPeople := range t.numbersOfPeople {  
    strYearMonth := strconv.Itoa(int(numberOfPeople.YearMonth))  
  
    if totalNumberOfPeopleMap[strYearMonth] == nil {  
       totalNumberOfPeopleMap[strYearMonth] = getRoundValues(numberOfPeople.NumberOfPeople.Float64)  
       continue  
  }  
    if totalNumberOfPeople, ok := totalNumberOfPeopleMap[strYearMonth].(float64); ok {  
       totalNumberOfPeopleMap[strYearMonth] = getRoundValues(totalNumberOfPeople + numberOfPeople.NumberOfPeople.Float64)  
    }  
}

上記のコードは生成したtotalNumberOfPeopleMapの年月に対して何も入っていなかったら値を入れ、値が入っていたら合計していくコードです。値を格納するコードなんかは横に長くなってしまっていますが、読むのが苦になったりはしないなと思いました。

私の中で長めの変数名を使うことは可読性が低くなることや書きにくくなることに繋がると思い避けてきましたが、全然そんなことはなく、むしろ変数名を見ることでどういう値が格納されているのかが一目で分かり、コードの理解にかかる時間を大幅に短縮することができました。 個人で開発をしていると変数の命名などおざなりになってしまいがちですが、長く開発していくことやデバッグすることを考えると最初に命名規則などをしっかり決めておくことが重要だと感じました。

実際にコードを書いてみると既存のコードを活用できる場面もありました。しかし、書いて勉強しているわけではないので考えていた実装が実はGo言語では出来なかったり、コードの書き方があやふやでエラーを連発してしまったりしました。

しかし、1ヶ月触れていると自然と書けるようになる場面も少しずつ増えてきたので、インターン終了後も継続して個人・チーム開発を続けていきたいなと思います。

メンターさんが口癖のように「Go言語の良いところをたくさん知ってもらって今後も書いていってほしい」と仰っていて、案の定、そのシンプルな書き方や言語思想などを学んでいく過程でGo言語を書くのが好きになりました。ありがとうございます。

プルリク編

実装が済み次第、各層に分けてプルリクを出しました。チーム開発をしたのもほぼ初めてだったためプルリクを出すのも緊張しました。 皆さんに自分のコードをレビューしていただきて、その都度修正を行いました。

自分では大丈夫だと思っていてもレビューしてもらうとミスが見つかったので、客観的な視点というのは重要なんだなと強く感じました。

おまけ:面談編

今回のインターンではSaaS・DX事業部や他事業部の方、人事の方やビジネス職の方、同期の皆さんなど、様々な方とお話させていただきました。普段の業務や就活の話であったり、技術的な話、趣味の話などもお話できました。 総じて、エキサイトの方々は皆さん優しくて面白く、お話してて楽しかったです。

まとめ

この1ヶ月間、Web系未経験の私が実際のサービスの業務に携わらせていただきました。環境構築から実際の実装、プルリクまで一通り学ぶことができました。しかし、概念を理解しても実際にそれをコードに落とし込むことは難しく、助けていただく場面が多かったです。今回のインターンで学んだことを糧にして、今後も成長し続けていきたいと思っています。

最後に

メンターさんをはじめ、業種問わずさまざまな方達に良くしていただき、たくさんのことを学ぶことができました。社員さんのおかげで非常に充実した時間を過ごすことができました。 1ヶ月間、ありがとうございました。