5days インターンシップ 2024 を開催しました (その2) #internship
はじめに
8月19日(月) ~ 8月23日(金) の 5 日間、クリエーションラインでのソフトウェア開発を知っていただくためのインターンシップ (2回目) を開催しました!参加していただいた 4 名の学生さんには、成果の報告と感想を以下のブログにまとめてもらいましたので、ここに公開させていただきます。
インターンシップの概要
クリエーションライン株式会社の富山事業所で開催された5daysインターンシップに参加しました。本インターンシップはWebアプリの開発を中心に進めました。
本インターンシップで開発したアプリについて
アプリ名:TripAgent
- 現在地と複数の目的地、旅行日数、予算を入力すると、天気を考慮した旅程を提案する
- 天気情報はOpen-Meteoから取得、緯度経度情報は国土交通省国土地理院APIから取得する
- AIの出力はSemantic Kernelを使用
インターンシップの特徴
現場で実践されているソフトウェア開発の技術とノウハウを学ぶことができました。”アーキテクチャの意識”を持ったアプリ開発、DevContainerやCursorエディタを用いたモダンな開発環境、モブプログラミングを採用したインターンシップ参加メンバー共同で行うソフトウェア開発などがあげられます。
また、代表取締役や人事の方との座談会や、社員の方々とインターンシップ参加メンバーで行う懇親会が開催されました。これらによってクリエーションラインの雰囲気や、システムエンジニアの仕事への姿勢を感じることができました。
モブプログラミングの様子
作業スペースの様子
日ごとの活動報告
取り組んだ内容を日ごとにまとめていきます。
1日目
1日目は会社説明からスタートしました。インターンシップ参加メンバーと社員の方々と自己紹介を行い、会社の説明を聞きました。その後、アプリ開発で用いられる技術の講習が行われました。Cursor Editor、AIエージェント、Docker、Devcontainer、モブプログラミングについて、学びました。
Cursor EditorはAIを搭載したコードエディタです。本インターンシップではAIを用いてコード開発を進めました。ただし、AIが間違った情報を渡すこともあったため、使用する際には注意が必要でした。
AIエージェントは機械学習されていないデータと既存のLLM(SLM)モデルを組み合わせたソフトウェアです。AIに旅行予定を出力させる際にAIエージェントを用いました。
Dockerは「コンテナ」という仮想環境でアプリケーションを実行するためのプラットフォームです。コンテナとは、アプリケーションとその依存関係をまとめてパッケージ化したもので、アプリケーション開発をする際の動作テストで非常に便利です。
Devcontainerは開発環境をコードで定義して、コンテナにより再現可能にするためのツールです。どのローカルOSでも同じ出力を得られる、ローカルOSに影響を与えない、開発環境の切り替えが容易であるなどの特徴があります。
モブプログラミングは複数人のエンジニアが協力しな がら問題を解決していく、共同でのソフトウェア開発手法です。今回のアプリ開発ではモブプログラミングを行い課題解決に取り組みました。
2日目
2日目はシステムアーキテクチャとソフトウェアアーキテクチャ (レイヤード) について学びました。
ソフトウェアアーキテクチャ (レイヤード)
システムアーキテクチャ
システムアーキテクチャとは、システム全体の構造と機能を定義する設計思想のことで、今回はOrder側とAIProcessing側に分けて考えました。Order側では、エンドユーザーから入力された現在地や目的地を緯度・経度に変換した後、同じく入力された旅行日数、予算のデータと一緒にデータベースに送ります。AIProcessing側ではOrder側から送られてきたデータと天気予報を用いてAIに旅行案を出力させます。
ソフトウェアアーキテクチャにはレイヤードアーキテクチャを採用しました。レイヤードアーキテクチャとはソフトウェアを複数の層(レイヤー)に分割して設計する手法です。層には、
- アプリ利用者との入出力を処理するプレゼン層
- ビジネスロジックを実行しユースケースを処理するアプリ層
- ビジネスルール(業務知識)やモデルを管理するドメイン層
- データベースや外部システムとのやり取りを担当するインフラ層
があります。レイヤードアーキテクチャのメリットとして、保守性の向上や開発の効率化、特定の層だけスケールアップが可能、セキュリティ対策を層ごとに行いやすいなどが挙げられます。
このシステムの中には、WebUI、Order側のWebAPI、バッチアプリ、AIProcessing側のWebAPIの4つのアプリがあり、それぞれレイヤードアーキテクチャを用いて開発されています。
次に、AIに旅行案を決めてもらうときにエンドユーザーが入力する項目として何を加えるべきかを話し合いました。具体的には、時間を決めて付箋に自分のアイデアを書き出し、集まった付箋の内容を分類わけして、話し合いました。そして予算を追加することに決めました。
出てきたアイデア
そして、初めてモブプログラミングをしました。予算という入力値を加えたことによってorder側のWebAPIのコードをどう変更すればよいかをみんなで考えながら、Javaのコードを書きました。
3日目
3日目は、Order側のDBにデータが送信されたときに、その情報をバッチアプリに送信するKafkaと、天気情報をAIに渡す時に使用されるSemantic Kernelについて学びました。
そして、モブプログラミングで3つのワークに取り組みました。
まず、天気を考慮した旅程の提案において位置情報(現在地と複数の目的地)、旅行日数に加えて予算を入力できるようにWebUIの変更を行いました。HTMLでのコーディングがほとんど無かったため、ワーク外のコードを参考にしたり、AIを活用したりすることで課題を解決することができました。しかし、AIの答えが誤情報であることもあったため、AIに提供された情報は参考にしつつもしっかり疑う必要があることを改めて学びました。
次に、テストについて学び実際にUnit Testのコードを書きました。これを行うことでプログラムが想定通りに動いているか確認することができました。
最後に、旅程を考えるときに考慮してほしい天気情報を考え、それらの情報を扱えるようにバッチアプリへの追加を行いました。事前に設定されていた情報(天気コード、最高気温、降水量の合計)に加えて、よりAIが適当な旅程を提案してくれるように最低気温、紫外線指数、最大風速の情報を追加しました。今回のWebアプリではOpenMeteoというAPIを利用して天気情報を取得しました。
4日目
4日目はプロンプトのテンプレートの中身を書きました。
2,3日目に話し合ったことから取り入れた内容
- 予算
- 天気(最高気温、紫外線)
- 目的地に行くまでの移動手段
- 移動時間
AIに送るプロンプト
AIに出力させるフォーマット
入力画面
実行結果
プロンプトに書く内容やその時の言葉の使い方によってAIの提案が大きく変わりました。またAIに同じ内容を与えても毎回違う内容が出力されたりしました。
同じ場所に何度も行ったり、また目的地に一回も行かなかったりしました。
そこで毎回同じ答えが出力されるようにまず最初に優先順位のルールを提示してその後に天気と移動に関するルールを書きました。
しかし、「目的地から次の目的地までの移動手段」のところでは何度も出力を行ったけどなかなかAIが提示をしなかったため、自分たちで例を考えてAIに提案すると書いてくれるようになりました。
また、「現在地から1日目の目的地までの移動」では最初は現在地からの移動からスタートではなく、1日目の目的地からスタートになりました。そこでAIに送るプロンプト内に「1日目は現在地から目的地に移動します。」という文章を付け加えました。付け加えることによって提示してくれるようになりました。
5日目
本ブログの執筆を行いました。
インターンシップ感想
O.M
今回の5日間のインターンシップを通して、アプリの開発を行いました。今まで一度もアプリを開発したことがなく、初めて知ることがたくさんあり、アプリ開発に必要な知識を学ぶことができました。実際に自分達でプログラムを書く際に、コードがどういう意味を表しているのかを理解するのがとても大変で、モブを使ったグループ活動ではコードがあまり理解できていなかったため、自分の意見をいうことができませんでした。5日間のインターンシップを通して自分のプログラミングの知識が全然足りないことに気づきました。少しずつプログラミングのコードが理解できるようになるためにもしっかりと自分で勉強をしたいと思います。今回のインターンシップで色々なお話を聞き、自分のためになることがたくさんあったので、これからの就職活動に生かしていきたいと思います。
N.Y
今回のインターンシップでは、Webアプリ開発の様々な工程について学び、実際に体験することができてとても面白かったです。はじめてのアプリ開発だったため、これまで触れたことのない言語でのプログラミングや初めて知る概念、技術も多く難しかったです。しかし、座学で学び、それらを用いてモブプログラミングに取り組み1つ1つ問題を解決することで、学びが深まるとともに大きな達成感を得ることができました。モブプログラミングで互いに意見を出し合ったり、AIを活用したりすることで課題を解決することができてとても感動しました。しかし、AIが思うように答えてくれなかったり、間違った情報を提示したりすることがあったため、改めてAIの活用について考える時間になりました。5日間ご指導いただきありがとうございました。
Y.M
今回のインターンシップで、プログラミングの奥深さを痛感することができました。今までは1つのファイルに全てのコードを書くという手法でしかコードを書いたことがありませんでしたが、実際にアプリのコードにふれたりレイヤードアーキテクチャを学習したりしてみて、コードの意味やファイル管理などまだまだたくさん勉強することがあるなと感じました。また、モブプログラミングをしてみて、他のメンバーがいてくれたからアプリを作ることができたと思います。他の人と意見を交換する必要性を感じることができました。これからは自分のスキルを高めながら、自分の意見を論理的に伝えることができるように頑張っていきます。
M.C
今回のインターンシップはどのようにアプリ開発が行われるのかを学ぶことと、IT企業の雰囲気とシステムエンジニアの方々の働き方を知ることが目的で参加しました。アプリ開発では企業が作るプログラムに触れ、一つのアプリを機能ごとに細かく分け、機能を追加するときや1つの機能でバグが起きた時に対応できるようにしていたりとプログラミングの奥深さに触れることができました。また、モブプログラミングでは複数の視点からアプリ開発が 進められとても参考になりました。アプリ開発はグループのメンバーにたくさん助けてもらい、完成した時には非常に大きな達成感を得ることができました。また、座談会や懇親会では会社の雰囲気を感じることができました。今回のインターンシップではさまざまなものを得ることができました。5日間大変お世話になりました。