2021 Lablupインターンシップレビュー

*この記事は韓国語から翻訳したものです。不十分な部分があれば、いつでもフィードバックをいただければありがたいです！ ([オリジナル記事](https://blog.chungjungsoo.dev/dev-posts/lablup-internship/), 同じく私が作成しました。)*

2021年6月から8月までの8週間のラブルアップインターンシップの感想を書きたいと思います。

## 応募の流れ

3年生の1学期が終わり、次の学期から卒業制作を準備しなければならない時期がやってきました。今回の休みに何か有意義な活動をしたいと考えていたところ、Facebookでラブルアップインターンシップの公開採用の投稿を見ました。

![internship_position_opening.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896189/37ff0b90-3d09-bafa-8525-a5d714ee9794.png)

採用公告を読んだ後、本当に逃してはいけない機会だと思った。 すでに知っているスタートアップ企業の一つであり、私たちの学校と連携して行う現場実習企業と比較した時、インターンシッププログラムが最も充実していると思った。すぐに応募書を作成することになりました。申請書は主にプログラミング、プロジェクト経験に関する質問が多かった。

申請書を提出した後、しばらくして面接のメールが届いた。 とりあえず書類に合格したことは嬉しかったが、初めての技術面接だったので不安が大きかった。どの部分を準備すべきか悩んだ結果、結局、技術的な部分はあまり準備できず、応募書で作成したプログラミングとプロジェクト経験に関する部分を準備し、ビデオ会議に参加しました。

面接は幸いにもプログラミングとプロジェクトについて多く聞かれました。CSの技術的な質問もされましたが、あまり答えられませんでしたㅠㅠ。今更ですが、当時はとても恥ずかしくて頭がクラクラして、本当に倒れるかと思いました。 (今考えると、どうやって合格したのか不思議です)

面接が終わって数週間後、終業式を終えて夏休みの計画を立てていたところ、合格のメールが届き、とても嬉しかったです！！インターンシップの希望開始日を一週間後にして、一週間は楽しく遊びました。



## インターンシップの課題・生活

ラブルアップのインターンシップは、会社で各分野ごとに基礎的な作業を解決してみるブートキャンプの課題を1週目に行い、残りの週は自分がもっと経験してみたかった分野や興味のある分野の作業/問題を担当して解決してみるという方式で行われました。

ラブルアップのコアプラットフォームはオープンソースです！そのため、インターンシップの課題もGitHubで公開されました。



### Bootcamp Assignment

ブートキャンプの課題を大きくまとめると次のようになります。

* Backend.AIの使い方を学ぶ。
* Backend.AIを利用して機械学習/ディープラーニングモデルを学習させる。
* Backend.AIをローカルで開発可能な環境にインストールする。

Backend.AIはラブルアップのコア製品です。ブートキャンプの課題が終わったら、実際のBackend.AIの開発課題が出る予定だったので、その課題は完璧に解決して進まなければなりませんでした。

### Backend.AI Webserver

[![add_ping_api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896189/fb952e4b-daf5-1fa8-f300-86ec7c60e31e.png)](https://github.com/lablup/backend.ai-webserver/pull/38)

ブートキャンプの課題が終わった後、Backend.AIのソースコードを熱心に読んでいた時、初めて担当したgood first issueでした。ウェブサーバーがうまく動いているか確認できるping APIを追加する課題でした。Backend.AIのウェブサーバーはaiohttpを使うので、[次の](https://github.com/lablup/backend.ai-webserver/pull/38/commits/7512e75ed140d937aca331c1b0dcb5c8ad49f80f)のようにコードを作成し、PRを送った結果、追加修正なしでPR approvalを受けることができました。




### Backend.AI Agent

![add_path_to_default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896189/8bed1410-ab44-ac0b-4572-b4862f08ad64.png)

次はagent側のissueを担当しました。Backend.AI agentは演算ノードにインストールされてコンテナを管理や制御する部分です。今回は、Backend.AI agentでコンテナを生成する時、コンテナのPATH環境変数に `~/.local/bin` パスが常に含まれるようにする課題でした。 Backend.AI agent側の膨大な量のコードを見て最初はどうしたらいいのかとても戸惑いましたが、CTOのキム・ジュンギさんが`ai.backend.kernel`側の`BaseRunner`オブジェクトが生成される時実行されるコード部分を見ればいいというヒントをくれて、うまく解決することができました！

p.s. 今回の課題で調べてみたところ、`~/.local`フォルダは`/usr/local`フォルダと同じようにローカルやサードパーティパッケージをインストールするときに使われますが、`/usr/local`が全ユーザー用であるのに対して、`~/.local`フォルダはシングルユーザー用だそうです。特にpipが使います...! (もちろんbinにはexecutablesが含まれています)



### Backend.AI Manager

![duplicate_target_dir_check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896189/8ed83b34-a5e3-acc7-0f47-f2497039460f.png)


次の課題はこの[PR](https://github.com/lablup/backend.ai-webui/pull/1082)をレビューしている時にできた課題でした。このPRは仮想フォルダにaliasを設定してセッションを作ることができる機能をwebuiに追加するPRでしたが、レビュー中にaliasの名前が重複して入ってしまうバグを見つけました。Webui上でaliasの名前が重複して入ると、実際にBackend.AI agentでセッションが作成される時、同じディレクトリに同じ名前のフォルダが二つあることはできないので、エラーが発生して正常に動作しなくなります。もちろん、その部分はパッチを当ててPRが正常にマージされましたが、Backend.AI manager側にも安全なコーディングがあればいいという意見があり、その案件を私が担当することになりました。作業をしながらフォルダ名重複検証だけでなく、バックポートされて重複したコードも整理してPRを送ったし、正常にPRがマージされました。



### Backend.AI Test

![add_new_cli_based_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896189/78f97a99-db3d-ea8c-6d6d-9f27a0615b70.png)


最後の課題は他のインターンさんと一緒にコラボする特別な課題でした。他のインターンさんがBackend.AI CLIコマンドをリファクタリングして、私はリファクタリングされたCLIコマンドを利用して統合テスト(Integration Test)を作成する役割を担当しました。各コマンドでCRUDを含むコマンドを実行した後、正常な値や結果が出るか確認する過程でテストケースを作成しました。思ったよりコマンドが多くて作業するのに予想より時間がかかりましたが、その分、一番やりがいを感じました。 このように一人の人がコミットしたコードをベースに同時に他のコードを作ったという点で、変わった経験だったと思います。

### OKRミーティング

![okr_tracker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896189/a4c6b70c-176f-3abf-4dc2-e885aa218664.png)


ラブルアップのインターン生は毎週一回、OKR Meetingに参加しなければなりません。OKR Meetingとは、今週はどこまでやったのか、作業中にどのような過程で行き詰まったのか、そしてそれをどのように解決したのかをまとめて発表するMeetingです。また、発表をすると、ラブルアップのチームメンバーが各作業に対するフィードバックをしてくれます。フィードバックを受けることで、不足していた部分を補うことができ、他のインターンの発表も聞きながら、自分が担当していない他の部分の内容も知ることができ、有益でした。



## インターン生の感想

![dog_ai_cat.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896189/eb3516f4-834c-cbe3-c13c-124eb3a112b0.jpeg)

会社は宣陵(ソンルン:선릉)駅から5分のところに位置しています。オフィスはあまり大きくないですが、様々な福祉施設があります。ストレス解消用に遊べるXbox、電子ピアノなどがあります。(Xboxにはultimate game passが購読されています！)仕事中に集中できない時や休息が必要な時は、いつでも遊びに来ることができます。

会社はとても自由な雰囲気で、水平的なコミュニケーションを重視しています。みんなとても親切で、質問にもよく答えてくれます。おかげで、最初はあまり人見知りすることなくうまく適応できたと思います。外国人の方もいらっしゃるので、ほとんどのコミュニケーションは英語で行います。英語力もアップすることができます！

毎朝10時にAll-hands Meetingを通じ、簡単に他の人の仕事と成果をトラッキングし、今日のスケジュールを共有します。また、ラブルアップで行われるMeetingは誰でも参加することができます。インターン生も同様に様々なミーティングに参加し、実践的な知識を積むことができるので、本当に良い文化だと思います。

インターンシップ期間中、様々な課題をこなすことで、少しずつ実務に近づいていると感じました。まだ先は長いですが、簡単なissueから始まり、様々な部分で会社の製品に貢献できたことを誇りに思いました。 実務課題を解決する過程で様々な問題が立ちはだかりましたが、解決する過程で本当に多くのことを学べたと思います。 また、Backend.AIのコードは今まで扱ったプロジェクトの中で最もコードが多く、複雑でしたが、これを順番に解釈しながらどのように動作するかを知ることができたので、達成感が高かったです。

会社に出勤してメンターの隣で様々な経験を積みたかったのですが、残念なことに、インターンシップが始まると同時に社会的距離置きの段階が4段階になり、会社にあまり行けなかったのが残念でした。