数理最適化のPoCから本番実装、未経験からAWS Top Engineerへ──NRIのエンジニアたちの技術探求心と挑戦
アーカイブ動画
配送最適化ライブラリの本番開発にて導入したソフトウェアアーキテクチャ
株式会社野村総合研究所
プラットフォームサービス開発一部
シニアアソシエイト 砂長谷 健氏
2018年にテクニカルエンジニアとしてNRIに入社した砂長谷健氏。大規模金融システムやWebアプリの開発プロジェクトにおいて、テックリードを経験。現在は量子コンピュータや数理最適化案件に従事しており、NRIが自社開発する配送最適化ライブラリの設計・開発プロジェクトなどを担当している。
今回は小売事業者での配送最適化プロジェクトにおけるPoCと本番実装との違いを、プログラミングコードの観点から紹介した。
「PoCコードとプロダクトコードは別物」だと述べる砂長谷氏。実際のアジャイル開発では要件は頻繁に変わったり、増えたりする。加えて、PoCでは少人数かつ短期間でデモを作成することが求められるが、実際の開発における運用フェーズでは開発者の出入りなども増えるからだ。
砂長谷氏は、プログラミングにおける自身が好きな部分であるという「関数の外側」、処理を記述する部分以外の領域について解説。PythonのWebフレームワークFastAPIを例に挙げ、説明した。
「配送最適化プログラム・ライブラリの自社開発においては、ソフトウェアアーキテクチャ設計が必要になります。その取り組みを紹介したいと思います」(砂長谷氏)
改めて「関数の外側」とは、フレームワークやソフトウェアアーキテクチャ領域のことを指していたことを補足し、さらに、ソフトウェアアーキテクチャについて、Webフレームワークを見本に解説していった。
まず紹介されたのは、Webフレームワークの役割や他の領域とのやり取り・流れなどである。
「フレームワークには分かりやすく便利な機能が用意されています」(砂長谷氏)
続いて、FastAPIのサンプルコードを再び例に挙げ、データの構造を定義し、関数の引数にclassを与えるだけで、リクエストボディの内容が定義済みのデータ構造に変換されるなど、具体的な便利機能を示した。
もうひとつ“強調したい”との前置きで触れたのが、フレームワークが開発の流れを決める役割を持っていることだ。というのも、コードを読むことでどこに何を実装すればよいのかが分かるからである。
「それはソフトウェアアーキテクチャ設計を意味します。」(砂長谷氏)
砂長谷氏は先の前置きを踏まえた上で、配送最適化ライブラリについて「アーキテクチャ設計の必要はあるのかどうか、考えてみてください」と参加者に投げかけた。
そして、「複数の処理においてお互いに関連し合うことが多く、どこに、何を実装したら良いか分からないことが多かったため、アーキテクチャ設計を行いました」という解を述べた。
例えば、車両の荷台の積載上限など、入力として受ける計算条件の数は、初期開発と比べると3割ほど増えた。加えて、入力条件はあくまで業務の切り分けであったため、数理モデルに落とし込む必要もあった。
そのため、上記スライドの右側領域が複雑となった。同領域は計算条件が増える度にさらに複雑になることが明白であった。
このような背景から、「ソフトウェアアーキテクチャ設計が必要だという結論に至った」と、砂長谷氏は取り組みの経緯を述べた。
砂長谷氏は、アーキテクチャを意識しなかった際に、最適化の実行プログラムがどうなっていたかについて、PoCコードを例に紹介した。
具体的には、「複雑度が推奨値と比べ遥かに高かったこと」「拠点間の移動距離など、いくつかの条件が重なると発生する矛盾の確認が煩雑であること」を挙げた。
だが、PoCコードがダメだったわけではない。PoCコードはあくまでスピード重視であり、拡張性の配慮などをする必要がなかったからだ。
「むしろPoCコードとしては、よくまとまっていたと思います」(砂長谷氏)
続いて砂長谷氏は、実際にどのようなフレームワークに落とし込んだかについて紹介した。具体的にはパイプラインアーキテクチャというソフトウェアアーキテクチャを採用し、自作のフレームワークを用意することとした。
矛盾の確認一つひとつをジョブという単位に切り分け、フラグ管理はフレームワークに任せるようにした。流れは、get_job_executorとのメソッドでフレームワークを呼び出し、ジョブ名、実体、ジョブの依存関係などを定義していった。
ジョブの実行においては、「ステージ単位でジョブを実行できるように工夫した」という砂長谷氏。ステージとはジョブを1つにまとめる単位であり、どのステージを実行するかで、指定した全ジョブが実行できるようにした。
砂長谷氏は取り組みを振り返り、メリット・デメリットを紹介した。
【メリット】
・実装の見通しが立てやすい
・柔軟性の高いリリースが可能
・テストがしやすい
【デメリット】
・学習コストが若干かかる
・フレームワークの表現力の限界に直面すると、フレームワークの再検討が必要
そして、PoCコードとプロダクトコードは別物であること、ソフトウェアアーキテクチャ設計はライブラリ開発にも必要であることを繰り返し伝え、次のように述べセッションを締めた。
「今回のケースのように既存のフレームワークが存在しない場合には、自作するのもよいと思います。そしてNRIであれば、このような特殊な仕事も含めいろいろな経験を積むことができます」(砂長谷氏)
技術コミュニティを活用することで、未経験からAWS Top Engineerに
株式会社野村総合研究所
プラットフォームサービス開発二部(旧:OpenStandia事業部)
シニアアソシエイト 前原 良美氏
続いて登壇したのは、2023年にJapan AWS Top Engineerに選出された前原良美氏だ。前原氏は、AWS資格試験の問題集の執筆に携わるなど、AWS領域でさまざまな活躍をしている。
しかし、入社当時はAWSもWeb開発も未経験だったという。だが、GitHubなどオープンな技術的コミュニティや、NRIならではの社内コミュニティなどに積極的に参加していくことで、現在に至るまでのスキルを得ていった。
どのように技術コミュニティを活用してエンジニアとして成長し、活躍するようになっていったのか。前原氏は、その歩みを時系列で丁寧に紹介した。
前原氏は、まず技術コミュニティとは何なのかについて触れた。技術コミュニティとはGitHubやQiitaに代表されるように、世の中のためになるソースコードや技術記事などをアップ・共有・閲覧できるオープンな場である。
「チーム・部署・企業を超えて、同じテーマについて関心を持つ集団であり、テーマを共有することが技術コミュニティの活用だと考えています」(前原氏)
具体的には記事やソースコードを共有したり、イベントを企画したり、参加したりすることである。前原氏は、NRIに入社する以前は、技術コミュニティに触れる機会はまったくなかったという。
しかし、社内で関わった先輩たちが社内外問わず、技術コミュニティに積極的に参加していたこともあり、前原氏も次第に参加するようになる。
当初はイベントに参加したり、技術記事を読んで感想を書いたりするだけであったが、次第に自ら執筆したり、登壇して発表したりするなど、深く関わっていくようになる。当時の様子を、次のように振り返る。
「当時は技術の右も左も分からない状態でしたが、私なりに調べた内容を発表し、それに対して先輩方がコメントしてくれる。さらには対等な立場で、意見を言うことができる。そのような場を得られたことが、貴重な経験だったと思っています」(前原氏)
NRIでは定期的に開催される勉強会が複数存在する。技術コミュニティの魅力やメリットを感じた前原氏は、これらに参加していくようになる。
また、泊まり込みで部主催のハッカソンにも参加したとのこと。このハッカソンについて、前原氏はその魅力を次のように語った。
「完全に社内のクローズドなイベントなので、途中で温泉に行ったり、バーベキューをしたりするなど、自分たちが思うがまま、ゆるい感じで進めることができました。OBやOGなども参加してくれて、楽しい思い出しかないイベントです」(前原氏)
前原氏は楽しみながらも、技術コミュニティのおかげで着実にスキルアップしていったと振り返る。自ら手を動かすことによる技術理解の深まりが大きいが、それだけではないと前原氏は言う。
登壇することに対して上司も含め、まわりからの応援や仲間が増えることの喜びが大きかったからだ。さらには発表を見てくれた他のメンバーから、自分がそのテーマに興味があることを認知してもらうようになり、新たな流れも生まれていった。自分が興味あるテーマの案件やイベントへのオファーである。
例えば、Reactを活用したWebサイトの開発である。学生時代、同経験がまったくなかった前原氏だが、ハッカソンでReactに触れていたことを上司が把握していたことから、React関連の案件にアサインされることとなった。そして、次々とReactに関する案件の担当になっていく。
続いては、執筆案件のオファーである。前原氏が技術コミュニティ、Qiitaに初めて記事を書いたのは2019年のこと。まわりから背中を押されるような形で当時は行ったという。
そして、ここでも前原氏の記事を目にした社内のメンバーから声がかかる。クラウド関連の内容を社外に発信するオウンドメディア、NRI atlax編集部からオファーが届いたのである。
前原氏は記事執筆に加え、他のメンバーが執筆するイベントの取りまとめも担当することとなり、その役割も全うする。
3つ目は、企画運営における成果だ。部内ハッカソンで前原氏が幹事(運営)を担ったことがきっかけで、「会社主催のハッカソンの運営メンバーにならないか」という声がかかったという。
同イベントが継続して成功していたこともあり、社内のプログラミングイベントの企画運営なども手伝うようになっていく。そして、現在の前原氏のキャリアに大きく寄与する、社外AWSイベントの運営メンバーのオファーが届く。
単に企画運営スキルを評価されただけで、メンバーに抜擢されたわけではない。前原氏は技術コミュニティなどを通じて、AWSに詳しい先輩と多く出会う機会を得ていたのだ。
そして他の領域のテーマと同じく、「AWSもより詳しく学んでみたい」「AWSに携わる仕事がしてみたい」と考え、ここでも前原氏は「学ぶ」という努力を重ねていった。
例えば、前原氏はOpenStandia事業部(現プラットフォームサービス開発二部)というNRIのオープンソースを取りまとめた部署に所属し、技術調査などが本来の業務であった。そのため各種OSSを検証するためのAWS環境が存在していた。
このような実務環境を活かし、AWS環境の管理業務を自ら行いたいと、申し出たのである。さらには自由に技術スタックを選べる際などには、AWSを積極的に選択した。
インターン生のインストラクターにも立候補し、AWSを題材とした課題も作成。このように、本業を通じてもAWSのスキルアップに努めていった。並行して、資格取得も積極的に行った。
前原氏は資格取得に際しての業務との調整や、勉強時間の捻出なども紹介し、次のようにNRIならではの裏話的な内容を語った。
「社内にはAWSの資格本を執筆している方が結構いて、コミュニティを通じて面識があるメンバーも少なくありませんでした。テスト勉強をしようと見た記事が、その方が執筆していたりすることもありました。会った際には『おかげさまで受かりました』と、報告できるような環境もとても面白かったです」(前原氏)
また、AWS関連の記事執筆、AWSがテーマのイベントに登壇するなど、AWS関連の活動も増えていった。
このような流れの一環で、資格本の執筆などにも携わるようになる。そして、「Japan AWS Top Engineer」や「AWS Community Builders」に選出されるまでに成長していった。
そして、NRIには社内外のコミュニティを通して自らのキャリアを切り開いた社員が他にもいる。技術コミュニティを大切にするNRIの風土は他社からも評価され、AWSのVice President & Chief EvangelistであるJeff氏とNRIのコミュニティ参加メンバーが意見交換する機会も得た。
前原氏は、この出来事に対して次のように述べ、セッションを締めた。
「多くの人が長年かけて大切に継続してきた、NRIのコミュニティ活動が評価されたことを嬉しく感じています。これからは、私たちが素敵な文化を後進に引き継いでいきたいと思っています」(前原氏)
【Q&A】参加者からの質問に登壇者が回答
セッション後はイベントを聴講した参加者からの質問に、登壇者が回答した。抜粋して紹介する。
Q.フレームワーク設計はどのように学んだのか?
砂長谷:私の場合は入社して最初に触ったフレームワークの動きに違和感を覚え、そこから現場を通じてソフトウェアアーキテクチャを知り、学んでいきました。
ソフトウェアの基礎に関するオライリー・ジャパンから出ている書籍などを読む、今触っているフレームワークのエントリーポイントなどを調べるなどが、体系的に学べてよいと思います。
Q.AWS初心者は何から取り組むのがよいか?
前原:まさに最近、AWSさんが公式で「AWS 初学者向けの勉強方法 6 ステップ!2024 年版!」という記事を出しています。こちらの記事を参照しながら始めるのがおすすめです。また、実際に触ることが大事だと思います。