今回は、フツパーの主力サービス「メキキバイト」を始めとしたサービスの開発をPythonからC#に移行した理由や、そのモダンな開発環境について、大阪本社から和田さんに、関東支社から廣谷さんに参加していただき、詳しく深堀りしていきます!
【メキキバイトとは?】
外観検査業務をAIで自動化するサービス。現場の環境や検査要件に併せた高精度なAI及び関連ハードウェア一式を自社で構築。検査結果を管理図へ自動変換する品質管理機能を備えた管理アプリケーションにより、良品か不良品かを判定して終わりではなく、不良原因の分析までサポート可能。
~対談者紹介~
廣谷 貴志 / 東日本AIエンジニアリング部 部長
群馬県出身。群馬大学工学部情報工学科を卒業後、パシフィックシステムにて画像処理検査システムの開発に従事。上流工程から、実装、現場導入、保守まで多くのプロジェクトを経験。マルチスレッドプログラミングが得意。2022年9月よりフツパーに参画。
和田 悟 / 西日本AIエンジニアリング部 メキキバイトソフトウェア開発チーフ
5歳でスーパーファミコンに出会う。ゲーム漬けの日々が始まる。ゲームプログラミングの専門学校を経て、テレビゲーム制作会社に入社。ゲーム会社では、主にコンピューターグラフィクスを担当。趣味で電子工作にハマる。2023年1月よりフツパーに参画。
今回の対談にはインターンの峯澤と山元が参加し、質問をさせていただきました!!
ソフトウェア開発をなぜPythonからC#に移行したのか
メキキバイトのソフトウェア開発言語をPythonからC#に移行した理由を教えてください!
和田さん:
フツパーではこれまで、少ないコード量で成果物が作りやすいpythonを使用していましたが、処理スピードや汎用性を考えたらC#の方が良いということで、昨年の夏くらいからC#への移行を行ってきました。
廣谷さん:
そうですね、おっしゃる通りです。メキキバイトは外観検査のサービスなので、カメラや照明をはじめとするハードウェアが必須ですが、創業当時はカメラ一台、照明一台みたいなシンプルなデバイスの構成の案件が多かったのでPythonでも充分機能していました。
ですが、フツパーが最終的にはスマートファクトリーや、無人工場を目指していく中で今後カメラ以外の設備と連動したり、いろんなセンサーからデータを取ったり、そのシステムとしての使い勝手や機能を拡張していくと考えたときに、Pythonだと処理能力や拡張性の点で足りない部分があったのでC#に移行することになったという流れですかね。
C#に移行しよう!となったきっかけはあったのでしょうか?
廣谷さん:
私が入社してすぐ社長から工作機械の異常検知プロダクトの「振動大臣」の開発を依頼されたんですが、その管理アプリケーションとしてグラフィカルで直感的な操作が出来るという要件に応えるため、またそれを短期間で完成させるためにをC#でつくったんですよね。その過程で作ったコードが振動大臣の中でしか使えないのはもったいないので、並行して他製品でも使えるようにC#のライブラリを強化していきました。それがフツパーのなかでのC#での開発の始まりです。
当時、社内的には振動大臣を除けば全部Pythonで対応していたのですが、関東支社のほうでデバイス構成が複雑な案件が増えてきたんですよね。そういったこともあって、将来的にはC#のシステムじゃないとカバーできないだろうなと思い、未来に備えてライブラリを強化していました。
とはいえ、これまでAIはPythonで記述されることが多かったので、当時は完全移行は難しいと思っていました。そんな中、フツパーのテクノキングである今井さんが頑張ってAIを標準化してくれたんですよね。それでPhythonだけでなくC#とも組み合わせができるようになっていったんです。そこで一気に移行の方向に進みました。性能的にもそうですし、お客さんのシステムとの連携を考えたときに、標準的にモノを作っていくのがいいだろうということでそのタイミングでPythonからC#に移行することにしました。
C#への移行の流れ
PythonからC#への移行はそんなに簡単にできることではないですよね?
和田さん:
簡単にできることではないです!
カメラ・照明・クラウドへの送信など、多岐に渡った知見が必要になります。そこは、廣谷さんが多忙なスケジュールのなかでC#のライブラリを積み重ねて基礎を作ってくださったので、大変助かりました。PythonのコードをC#のコードに一発変換みたいにできたらいいんですけどね。
廣谷さん:
移行の作業は置き換えというより一からの作り直しに近かったです。作業は大変でしたが、関西側にも和田さんという強力な人がいてくれて、私が作った基礎部分に、たくさん機能追加をしていってくれているので心強いです。
では主に廣谷さんの和田さんと二人で移行を行ったのでしょうか?
和田さん:
関東で廣谷さんが半年かけて基礎やライブラリを作ってくださってたものを、関西側にもバトンパスしてもらって、今は関東では廣谷さん、関西では私が中心になって、インターン生を含め合計4、5人で開発を続けている状況です。
廣谷さんがクラス選択やモジュール結合度の値、読みやすいプログラムをしっかり作ってくださっていたので、関西で引き継いでも開発が進めやすい良い状況を作ってもらいました。
廣谷さん:
私は前職でFA現場向けの検査システムを作ってきた経験があるのですが、検査ができるのは当たり前のことで、そのうえで、24時間365日耐えられるかとか、処理時間の安定性などを考慮しながら設計しているんですよね。なのでライブラリもそういう観点を持って作っています。
和田さんはその点を理解してくれているので、C#を始めたばかりのメンバーに対しても早さだけではなく安定性を重視した書き方であったり、現場を意識した実践的な教育ができる環境があると思います。関東は私、関西は和田さんが他のメンバーへの指導を担当して開発を進めているという感じですね。
処理速度の話が出ましたが、C#はPythonに比べたら汎用性でも優れているんですよね? そこも工夫して基礎を作られたのでしょうか。
廣谷さん:
そうですね、産業用カメラはいろんなメーカーがあるので、その都度みんなが好き勝手に開発していると手間もお金もかかってしまうんですよね。なのでどのカメラが来ても大丈夫な汎用的な設計にするとか、ライブラリを作るときはそこを工夫しますね。そしてそれを可能にできるのがC#の強みだと思います。
和田さん:
産業用カメラって、Omron SentechとかBaslerとかThe Imaging Sourceとか、いろんなメーカーさんがカメラを作っているんですけど、それを扱うソフトフェアも動かし方も全部違うんですよね。そしてカメラメーカーごとの処理を書くのは結構面倒です。なのですが、廣谷さんの基礎はどのカメラがきても同じボタンを押したらカメラが動くというような汎用性を持たせて作ってくださっていて、それがすごいところだと思います。
基礎の時点でこんなに工夫が詰まっているんですね!基礎をバトンパスされた後はどのような業務を行っているのでしょうか?
和田さん:
廣谷さんが作った部分だけでもメキキバイトは動かすことが出来ていますが、さらにより汎用性を持たせたいとか、設定を柔軟にしたいとか機能を付け加えたいっていう要望があるので、そこをさらに作っていってますね。
それはフツパー内のC#経験者が中心にやっていったのでしょうか?
和田さん:
実は、フツパーは元々Pythonを使っていたのもあって、C#の経験があるのは廣谷さんと西日本AIエンジニアリング部部長の山本さんしかいなかったので、その他のエンジニアは移行に合わせて勉強会を開いて覚えていきました。
私もC#は前職でちょっとしたものを作った経験があるくらいで、C++が一番のメインでしたが、移行に合わせて覚えて、頑張って教えました。
勉強会は具体的には月3回程度開いて、業務の中でも覚えていってもらって、最近はC#を書ける人がそこそこ出てきたという感じです。C#始めたての時は、みんなコードを読むのすら大変で、書くなんてほど遠いみたいな状況でしたが、できることから挑戦していって、徐々に難しいことをお願いしていった結果、ある時をすぎたら逆に私が指摘されるくらいになってきてました(笑)
そういう時は嬉しいですし、助かる~!と思います。着実に成長しているのは感じますね。
廣谷さん:
関東支社のAIエンジニアの小池さんと上原さんもC#は全くの初心者でしたが、今は実際の案件で自分でコードを書いて作ったアプリを納品してっていうところまできるようになってきています。
関東支社の様子 左から小池さん、廣谷さん、今井さん、上原さん
勉強会について
C#の教育のカリキュラムもないなかでの指導だったと思うのですが、教育の中で気を付けていることはあるのでしょうか?
和田さん:
関東は廣谷さん、関西は私のほうで勉強会を開催しているんですが、それぞれのチームのメンバーのスキルレベルがバラバラなので、廣谷さんは廣谷さんで、こう教えていったら一番良いだろうという考えで教えていたと思うし、私も同じように関西はこの教え方がいいだろう思うやり方で教えていってました。
プログラミングは15年ぐらいやっているので、こういう順番で学べば早いっていう感覚があったのと、いろんなサイトにC#のチュートリアルや説明動画があるので、そういうのをかいつまみながらこれをしようみたいな感じでやっていました。
教育に関して廣谷さんはどう考えていますか?
廣谷さん:
和田さんもそうだと思いますが、プログラミングは個人個人でレベルが違うので、そこを一緒にやるのはなかなか難しく、カリキュラムの部分は正直手探りでやってるという感じです。
気を付けていることとすれば、文法や決まり事の話ばかりになってしまうと面白くないと思うので、実際の開発につなげていけるようなサンプルコードとかを作ることに重きをおいていますね。プログラミングに限らず、何かを習得するとき、最初はマネから入るので、どれだけいいものに触れてマネするかっていうのは上達の早道かなと思っています。なので今はそういう観点でサンプルコードを作ったり選んだりしています。
フツパーのC#開発環境の面白さを教えてください!
和田さん:
モダンな開発環境とコンピューターサイエンスの2つがあります。
~モダンな開発環境~
和田さん:
前者のモダンな開発環境は新しいサービスを取り入れて使ってみたりとか、面白いライブラリを積極的に使っていったり、そういう新しい技術への取り組みですね。
C#が主に使われているところはゲームや業務用アプリケーションだと思うのですが、業務用アプリケーションになってくると、大企業が作ってたりすることも多いんですよね。そうすると携わる人が多くて新しいライブラリを入れづらかったりとか、固定観念を持ったままでソースコードを書いてしまったりとかもあると思うんですけど、フツパーは人数も少ないのもありますが、みんな新しい技術に積極的なのでかなり柔軟に新しいライブラリも取り入れていますね。
例えばSentryという、エラーが起こった際にすぐSlackに通知がきて修正できるSaaSと連携したりしています。あとはTOMLっていうファイルのフォーマットを使ったりとか、必要だったらどんどん新しいものを入れています。
ただライブラリに依存する量が多すぎるとメンテコストがかかるので、とりあえず新しいものをいれて機能を足したらいいわけではなく、そのあたりを注意しつつ新しいものを取り入れているという感じです。
あとはGithubアクションというのがありまして、製品に自分が作ったものを入れたときに、問題がある状態で入れたらダメなので、一回テストを挟むんですよね。そのテストをつくれるのがGithubアクションなんですけど、それも徐々に拡張中で、そういうナウいことも頑張っております。
拡張はどのようなことをするのですか?
和田さん:
今はGithubアクションで簡単なテストしかできてないんですけど、より複雑なテスト、例えば新たなプログラムを入れることでメモリーの使用量が増えすぎていないかとか、パフォーマンスに悪影響を与えたりしないかというテストも今後はしていこうと思っています。
廣谷さん:
こういうモダンな開発はたぶん和田さんの方が詳しくて、ナウい方は和田さんがリードしてくれています!
~コンピューターサイエンスの理解~
和田さん:
後者のコンピューターサイエンスの理解に関しては、そこを理解してC#を書いたほうが処理速度が速くなるんですよね。例えば検品検査用のAIでいうと、1秒に5回しか検査できなかったのが、コンピューターサイエンスを理解してコードを書くだけで1秒で10回に増えたりとか、そういうコンピューターへの知識の深さに関する話になっています。
フツパーでは、ガベージコレクションの挙動を理解してプログラミングしていたり、メモリリークの調査方法と直し方の勉強会を行ったりしています。あとはソースコードの可読性も大事にしてますね。
ガベージコレクションとはどういうものですか?
和田さん:
メモリ上の不要なデータを削除する仕組みのことですね。 C#って注視しておかないと結構簡単にメモリーリークするんですよね。そうなった時に、なんでそれが上がっていくのかとか、どのオブジェクトがメモリーに乗っかりっぱなしになっちゃってるのかとか、どういう条件でメモリーが増え続けてしまうのかの知識が必要になってくるんですよね。
そういったことも勉強会で学んでいくのですか?
和田さん:
関西ではやりましたね。
廣谷さん:
関東の場合はさっきも話したように良いサンプルを用意して、画像データを扱うプログラム特有のガベージコレクタの挙動まで意識した書き方を癖づけてもらいました。
ソースコードの可読性はどうやって確保するものなのでしょうか?
和田さん:
僕は、日本語を上から読むみたいにプログラムが書かれているコードが一番美しくて読みやすいと思っているので、皆がそう書けるようになることを目指して頑張っています。そこに至るまでに、プログラミングの規則っていうのがたくさんありまして、KISS(Keep It Simple, Stupid.)とかYAGUNI(You Aren’t Going to Need It.)とかDRY(Don’t Repeat Yourself.)とかオブジェクト指向とかSOLID原則とか、いろいろプログラミングするうえで知っておいたほうがいいことやマナーがあるんですけど、今はそういうものを勉強会で教えていって徐々にメンバーのレベルが上がってきているという状況です。
でも、DRY原則のように、二回同じことは書かないようにしようと言ってはいるものの、実際に二回同じことを書かないように作るのはかなり難しいんですよね。なので、作ったコードを製品版に入れる時はその都度Githubのプルリクエストという機能を使って、コード管理者(和田さん・廣谷さん)がレビューをするようにしています。
~PCやマルチコアの性能を引き出す挑戦~
廣谷さんはコンピューターサイエンスの理解についてどう考えていますか?
廣谷さん:
コンピューターサイエンスの部分の面白さに関してだと、私が社会人になったころに比べて、PCの性能やマルチコアの性能もかなりあがっているので、それをどれだけ引き出せるかという挑戦ができるフツパーの環境は、C#のエンジニアにとってグッとくる環境なのではないかと思います。
画面を作って表示したりとかは勉強すれば誰でも出来るんですけど、現場で使える、現場で耐えるための最適化を突き詰めるみたいなところはそれはフツパーだからこそ挑戦できることだし、楽しいところです。
あとはプログラミングそのものの話じゃないですけど、カメラやPLCだったり、お客様の現場の設備と連携したり、実際に動くものを見ながらプログラムを作ってその結果を自分で見れるっていうのもすごく楽しい環境だと思います。
和田さん:
同意見です!
廣谷さん:
C#での開発は独学だとどうしてもたどりつけない部分ってあると思っているんですけど、フツパーには最適化や処理性能の追及に関して和田さんを始めとしたプロのメンバーがいるので、それに追従していけば他では得られないスキルが得られると思っています。
あとは、メンバーが年齢や国籍もバラバラで個性的なところも魅力として伝えたいですね。
和田さん:
確かに、バラバラですね!中国出身の方もいるので、お互いが努力してもどうしても伝わりきらない部分もたまにあるかもしれないんですけど、チームとしてはうまくいっていますね。
廣谷さん:
C#メンバーの全員が日本語のやりとり以上にプログラミング言語でつながっていると思っています!
◆和田さんによるC#開発ノートはこちら
https://www.wantedly.com/stories/s/tech_note