TypeScript未経験の学生がSkyWayの開発に取り組んでみた(インターンシップ体験記)

この記事では、2023年度現場受け入れ型インターンシップの活動内容をご紹介します。現場受け入れ型インターンシップを通して得られた学びを参考情報として共有します。

目次

はじめに

こんにちは、インターンシップに参加した鈴木 誉写です。大学院ではオーバーレイネットワークプロトコルの研究・開発を行なっています。

2023年8月28日から9月8日までの2週間、”オンライン英会話・オンライン医療などのビデオ通話を実現するプラットフォームサービス「SkyWay」の技術開発”というテーマで、NTTコミュニケーションズの現場受け入れ型インターンシップに参加しました。

この記事では、インターンシップに参加した経緯や活動内容について紹介します。

参考:現場受け入れ型インターンシップとは ドコモが仕掛ける数多くの事業の中から厳選したポストにて、実務を体験していただきます。業務体験を通じて通信/ICT業界の仕事が理解できるだけでなく、皆さん自身の成長をお約束する2weeksのインターンシップです。

現場受け入れ型インターンシップ | インターンシップ情報 | NTTドコモ採用

❗ 2022年に行われたNTTドコモ・NTTコミュニケーションズ・NTTコムウェアの統合により、本インターンシップの受け入れ先はNTTコミュニケーションズですが、募集はNTTドコモを経由しています。

参加に至った経緯

これまでは競技プログラミングに取り組んでいたり、ワークショップ型のインターンシップに参加したことがあったりと、楽しみながら技術力を向上させる機会は多くありました。しかし、これらの経験だけでは、エンジニアとして働く環境にはどのようなものがあるのかを知ることができないと感じていました。

そんな中で、NTTコミュニケーションズの現場受け入れ型インターンシップが目に留まりました。このインターンシップなら、ワークショップ型のインターンシップと比べて、より現場のリアルを体感できます。そのため、本インターンシップなら技術的成長のみならず、社会から求められる力や観点を学べると考え、応募しました。

受け入れ先について

募集要項は、以下のようなものでした(2023年9月21日時点)。

17.オンライン英会話・オンライン医療などのビデオ通話を実現するプラットフォームサービス「SkyWay」の技術開発

●業務内容 以下の業務を体験していただきます。 ・SkyWayの新機能: 録画・録音/通話品質計測/IoT向けSDKなどの開発 ・SkyWayが提供するJavaScript/iOS/Android SDKのアジャイル開発 ・ビデオ通話機能を実現するサーバ群の機能開発 ・WebRTCの技術情報のリサーチ

詳細はご本人の希望・適正に応じて、決定します。 SkyWayに関してはhttps://skyway.ntt.com/を参照ください

●応募要件 【必須】 ・下記いずれかの言語を用いたプログラミング経験が半年以上あること →HTML/CSS/JavaScript, Swift, Kotlin, Java, C++ ・リアルタイムコミュニケーションに興味と学習意欲を持っていること ・エンジニアリングへの興味・関心が高いこと ・プロダクトを見据えたソフトウェア開発を行う意欲があること ・新機能開発に興味があること ・Github/GitLab/BitBucketなどのソースコード管理システムを利用した開発の経験、もしくは知識があること 【推奨】 ・WebRTC/WebSocketなどのリアルタイム通信に関する知識があること

●受け入れ会社 NTTコミュニケーションズ株式会社

●勤務地 〒108-8118 東京都港区芝浦3-4-1 グランパークタワー

現場受け入れ型インターンシップ | インターンシップ情報 | NTTドコモ採用

SkyWayとは、リアルタイムコミュニケーションを実現するプラットフォームサービスです。SkyWayは、WebRTCの利用に必要な機能を提供し、サービス開発をサポートします。これにより、ソフトウェア開発者は、自身のアイディアの実現に集中できるようになります。

SkyWayを開発している組織は、ビジネス領域・開発領域・運用領域の全てを取り仕切っています。また、担当する業務のドメインや開発物に応じて、内部的に複数のチームに分かれており、相互に連携して開発を進めています。本インターンシップでは、リアルタイムコミュニケーション用サーバやJavaScript用SDKの開発・運用を行なっているチームに受け入れていただきました。

リアルタイムコミュニケーション用サーバは、一般的なWebアプリケーションサーバで求められる要件に加え、高い安定性やパフォーマンスといった観点も要求されます。また、SDKはお客さまが直接使うものであるため、開発体験の良さも求められます。今回受け入れてくださったチームでは、これらの観点も考慮しながらシステムを開発・運用していました。

インターンシップで取り組んだこと

オンボーディング

SkyWayのサーバサイドアプリケーション開発では、主にTypeScriptを利用しています。一方、私は選考時点でTypeScriptを書いたことがなく、その旨を社員の方に共有していました。そのため、オンボーディング用課題を提示していただきました。

この課題は、npmパッケージの名前を受け取り、そのインストール数などに基づいて、インストールしても大丈夫そうか否かを返答するAPIを開発するものでした。まず、APIの設計やドキュメンテーションを体験しました。その後、TypeScriptの基本をご指導いただきながら、コーディングを進めました。さらに、テストコードを書く経験を通して、describetestの挙動や、beforeAllbeforeEachafterAllafterEachの働きを学びました。加えて、初歩的なCI/CDの構築を体験しました。作成したコードはこちらで公開しています。ローカル環境での動作例は以下のとおりです。

<サーバサイド>

$ npm run start

> npm-checker@1.0.0 start
> node build/main.js

Server listening at http://0.0.0.0:8080

Package Name:       react
Repository:     facebook/react
Last Modified:      Sat Sep 23 2023 01:15:32 GMT+0900 (日本標準時)
Count of Download:  85877299
Contributors:       zpao, gaearon, acdlite, sophiebits, sebmarkbage, jimfb, trueadm, bvaughn, petehunt, chenglou, vjeux, benjamn, yungsters, lunaruan, subtleGradient, kassens, gnoff, rickhanlonii, nhunzaker, necolas, syranide, eps1lon, cpojer, flarnie, koba04, aweary, mondaychen, dependabot[bot], marocchino, kohei-takata

<クライアントサイド>

$ curl -X POST -v http://localhost:8080/check-package/react
*   Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /check-package/react HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< content-type: application/json; charset=utf-8
< content-length: 28
< Date: Mon, 25 Sep 2023 08:11:14 GMT
< Connection: keep-alive
< Keep-Alive: timeout=72
<
* Connection #0 to host localhost left intact
{"can_use":true,"reason":""}%

エラーハンドリングの追加

次なる業務として、SkyWayで稼働しているサーバにおいてハンドリングが漏れていたエラーに対処するというタスクに取り組みました。まずは、既存のコードを読み、課題が残されている箇所の理解を深めました。コードを読む中で、今まで触れてこなかった"階層型アーキテクチャ"や"DI"の概念を学びました。その後、適切にハンドリング処理を追加しました。コーディングはペアプロの形式で実施したため、実践的な知識を得る良い機会になりました。結果的に、修正を加えた箇所は無事マージされました。

E2Eテストのデプロイ

今回私を受け入れてくださったチームは、DevOps1の思想に準拠し、SkyWayの開発のみならず運用も担っています。そのため、サーバの状態を監視したり、検出した異常な挙動を報知したりする機構を管理しています。E2Eテストとは、その一環で利用する、SkyWayを用いたE2E通信の実施可否を定常的に確認するシステムです。下図のように現在時刻を画面に描画し、それをリアルタイムで送受信することで、エンドユーザ目線からSkyWayサーバの稼働状況を確認できます。

今回は、E2Eテストにて利用するSDKのバージョンをアップデートした後、デプロイ作業を実施しました。このような本番環境を扱う作業は、手違いが無いよう複数人で実施します。今回は、私もその一員として参加させていただきました。その結果、開発と運用の両面を担うチームの働き方を実感できました。

JavaScript用SDKに対する機能追加

多くのブラウザは、通信環境などの統計情報を取得するWebRTCのAPIを備えています。この統計情報をサーバに集約することで、お客さまサポート時のログ解析などに活用できるようになります。そこで今回は、SkyWayのJavaScript用SDKパッケージから統計情報を受け取り、それらを整形した上でサーバに送信するサポートパッケージを開発しました。この業務の遂行にあたり、本パッケージに必要な機能の洗い出しから参加させていただきました。

コーディングに際しては、通信が失敗した際に再送の有効性に応じて処理が分岐する複雑なロジックに苦戦しました。また、Utility Typesの利用や、以前に送信したデータに依存性がある処理といった、テクニカルな実装が求められる場面もありました。しかしながら、インターンシップ開始時点でTypeScript未経験だったのにもかかわらず、最終的には開発を自走できました。このことを通じて、社会人基礎力の一端である主体性や実行力の向上を感じられました。そのため、"現場を体感することで社会から求められる力や観点を学ぶ"という、本インターンシップの目的を達成できました。

感想

CI/CDの構築方法やTypeScriptの便利記法など、多くの技術的な成長を感じられた2週間でした。さらに、社員の方々と共に働いたことで、エンジニアの働き方についても多くの学びを得ることができました。例えば、タスクの重み付けの考え方や、TeachingとCoachingの使い分けなどです。これらの学びは、今後もぜひ活かしていきたいと感じました。

加えて、自分の弱点が明らかになった2週間でもありました。社会に出る前に自身の弱点を自覚できたことは、今後の成長の足がかりとして、とても有意義であったと感じます。

おわりに

本記事は、2023年度現場受け入れ型インターンシップの参加記として、活動内容や感想について書かせていただきました。

親身にサポートしてくださったトレーナーのsublimerさん、暖かく出迎えてくださったイノベーションセンターならびにSkyWayチームの皆さま、成長機会をくださったNTTコミュニケーションズの皆さま、大変学びの多い2週間をご提供いただき、本当にありがとうございました。

トレーナーからのコメント

鈴木さんのトレーナーを担当した、イノベーションセンターの@sublimerです。 鈴木さん、2週間のインターンシップ、お疲れ様でした。

2週間というとても短い期間、かつ、TypeScript未経験という状況で、本当に素晴らしい成果を残してくれたと思っています。 TypeScriptを書いた経験が無いことは事前に伺っていたので、今回のインターンシップでは最初の数日間で学習用の課題に取り組んでいただきました。 学習用の課題は、ゴールを「必須」、「ここまでできるとGood」、「できなくても大丈夫」の3段階に分けて設定し、とりあえず必須のゴールだけ達成できれば業務に取り組めるように設計していました。 しかしながら、鈴木さんには「できなくても大丈夫」のゴールまで達成していただき、スキル習得のスピードにとても驚かされました。

また、インターンシップ後半では、今後リリース予定のSkyWayの新機能開発に取り組んでいただきました。 SDKの機能をゼロから実装していくという業務は、社員でもなかなか経験できるものではないため、苦労した点も多かったかもしれません。 そのような業務にも臆することなく取り組み、短い期間で大きな成果を残していただきました。 通信の状況を収集、記録する機能は、お客さまがトラブルシューティングする際に役立つ、非常に重要な機能になると考えています。 鈴木さんが書いたコードは今後お客さまのサービスに組み込まれ、多くのリアルタイムコミュニケーションを支える機能の一部となります。 リリースされるのはもう少し先ですが、楽しみにしていただければと思います。

最後になりますが、この2週間の経験が鈴木さんの今後の人生に少しでも役立つものとなれば、トレーナーとしてとても嬉しく思います。 そして、今後の研究活動、大学院生活がより充実したものになることを祈っています。 SkyWayでのインターンシップのご参加、ありがとうございました!!

参考文献


  1. Bass, Len, Ingo Weber, and Liming Zhu. DevOps: A software architect's perspective. Addison-Wesley Professional, 2015.
© NTT Communications Corporation All Rights Reserved.