ファームウェアエンジニア中林 (id:tomo-wait-for-it-yuki) です。チームメイトの的場さんが、ファームウェアエンジニアからバックエンドエンジニアに転向してからちょうど1年が経過しました。絶対面白いからブログに書いてよ、と私からお願いしたところ「自分で書いてはみたが職務経歴書みたいになって全く面白くないので、助けて欲しい」ということで突撃インタビューを実施しました!バックエンドエンジニアの北原さんにも同席してもらい、Natureでのソフトウェアエンジニア同士のコミュニケーションをお届けしたいと思います!
登場人物
導入〜1年で取り組んだこと〜
中: 最初に、軽くバックエンドになってから1年間担当したことを教えてください。
的: 主にNatureスマート電気の開発で、一番最初がプラン変更ですね。最初はスマートプランしかなかったんですけど、そこにフラットプランとハイブリッドプランを追加して、スマートプランから新しいプランに変更できるようにしました。プラン追加に伴って、料金計算のシミュレーションも担当しています。
的: 次はエリア拡大ですね。最初、関東関西しかなったのを沖縄以外全部対応する、っていうのをやりました。そのあと何やったっけな…?
中: 色々やりすぎて思い出せないと(笑
北: 申し込み受け付けやってくれてたんじゃない?
的: ああ、そうだ!家電量販店でユーザーを獲得するための申し込みやキャンペーンをやっていました。このあたりは社内のビジネス側から施策を伝えられて、はいかしこまり、みたいな感じになってしまって、今思い返すとあまり良い思い出ではないですね(笑
的: 最近は、再点*1対応というのをやっていて、これは自分主導でけっこううまくやれたんじゃないかな、と思っています。
Nature入社前
中: せっかくなのでファームウェアの話も少ししたくて、時間軸戻りますけど、そもそもNatureに入る前は何やっていたんですか?
的: アイシン精機で車載ECUのテストをやっていました。配線をがちゃがちゃつなげてパソコンから信号送れるようにハードウェアを用意して、自家製スクリプトでテストを作る、という末端構成員みたいな仕事から始まりました。
中: 末端構成員 (笑
的: 途中からテストのマネジメントよりなって、スケジュールや業務委託先のマネジメントもやっていました。と言ってもやってることはテストなので末端から上がったわけじゃないですけど。
的: あとはAUTOSARというプラットフォーム規格にも少し関わったのですが、自動車業界でしか味わえないような仕事をしていましたね。
中: (苦笑) 車載のソフト開発ってNatureでやっているような開発とは求められるものが全然違いますよね (補足: 中林は組込みSIer時代、車載開発が嫌で逃げ回っていた過去がある) 。私がやりたいソフト開発とは結構違っていて、そのへんの辛さはありますよね。
北: それは、ずっと (車載) に居る人たちは辛くないの?目線がずれているから辛いのか、どうして辛いと感じるんですか?
的: 僕も今となってはそう思う、というだけで、当時はそういうものだと思って仕事していたのであまり意識していなかったです。ただそれがめっちゃ楽しいって言って仕事している人は見たことないですけど
一同: 笑笑
Nature入社後
中: Natureに入社してからはどうですか?
的: Nature Remo3発売前でmornin’plusのBluetooth連携周りをやっていました。車載しかやってないので正直全然よくわからなかったんですけど
的: ただ当時使っていたBludroidというBluetoothスタックがめちゃくちゃ不安定という問題があって、ちょうど新しく出てきたNimBLEを使うようにしました。これがけっこう良い感じだったんで今でもNimBLE使っています。
北: 入った直後からmornin’plusなんだっけ?
的: 入社直後は (ファームウェア開発メンターの) 亀田さんが小さいタスクを良い感じに用意してくれていて、それをやっていたので、その後ですね (mornin'plusは) 。
中: その後はQrioとかやってたんでしたっけ? (補足: このあたりで中林が入社)
的: そうですね。Qrio LockとのBluetooth連携が一番最初の大きなやつで、これは自分でプロジェクトをマネジメントしながらコードも書いていました。まるっきり新しい機能ということで頑張ってやりました。
的: mornin’plusのときにBluetooth周りのコードがうまく書けていないところがあって、Qrioのときは反省を活かしてきれいに書けたので、「やったぜ!」みたいな感じでしたね。リリース自体もオンスケで終わりました。
中: ファームウェアSDKのversion upとかCI環境構築とかもやってましたよね?
的: そうですね。GitHub Actions使って将来的にセルフホストランナーが欲しくなるだろう、と考えてその環境構築をやっていました。オフィスに2代目CTOの村瀬さん*2が置いていったパソコンがあって、これ適当に使って良いですか?って本人に聞いてみて、いいよ、って言われたのでUbuntuインストールしてセットアップを進めました。
的: ファームウェアSDKのversion upも着手したんですけど、全然安定しなくて、一回諦めて次の機会を待つ、ということになりましたね。で、ここでちょっと手持ち無沙汰になったときにサーバーやってみる、ってなりました。
中: なるほど。ここでタイミング良く手持ち無沙汰になった、と。
的: チャンスとばかりに!サーバーはずっとやりたい、って言っていたので、ファームとしてもまだまだ仕事あったとは思うんですけど。
転機はBLUE GIANT
中: 先ほど「ずっとサーバーやりたいって言っていた」という話だったのですけど、これはどこでやりたいって言ってた感じですか?
的: 1 on 1の度に (当時CTOの) 松木さんと (メンターの) 亀田さんに言ってましたね。特に隠していたわけではないので、エンジニアは大体知っていたのでは?
中: 的場さんをバックエンドにする、っていうのを決めたのって誰なんです?
北: 決めたのは多分僕…なんだけどすごいうろ覚えなんですよね。この頃 (的場さんがバックエンドしたいっていうのを) あまり周知されていなかったので温度感までは知らなかった気がする。
北: どうしよっかなー、とタイミングを悩んでいた記憶はあるので、決定したのは僕…な気がする。歴史を改変しているかもしれないけど
中: 真相は記憶の中にしかないので大丈夫ですよ (笑
的: とにかく電気に人が足りない、ってなっていて、的場を使い物にしなければ!という雰囲気だった気がする
北: いや…
中: なんか違うみたいですよ?
北: 思い出してきた。最初サーバーのファームウェア段階リリース機能をファームウェアで開発する、という話があって
中的: (あー、あったなぁ)
北: ふーん、って言いながら、でもちょっと (段階リリースは) タスクとして少しまだ重いかな、という気持ちになって、それだったら電気で僕とか松木さんと一緒にやったほうが伸びるのでは、という話をした。
北: ここだけはすごい明確に覚えてるんだけど、ちょうどその時に「BLUE GIANT」という漫画を読んでいたら、困っているヒッチハイクの人を乗せてサンフランシスコに行く、って話があって、「なるほど!」ってなって「とりあえず乗せてみるか」って
的: な、なるほど…
北: BLUE GIANT読んでいて、こういう気持ちが大切だ!ってなって、やってみよう!
的: 僕がヒッチハイクの人なんですね。「つよつよサーバーエンジニア行き」みたいなやつ持っていて (笑
中: じゃあBLUE GIANT読んでなかったら、的場さんはサーバーやっていなかった?
北: もうちょっと遅れてたかもしれない (笑
的: BLUE GIANTに感謝しないと…
中: 的場さんこの話は知ってたんですか?
的: いや、初耳ですね
中: 衝撃のBLUE GIANTのおかげで早くサーバーに入れたという。ただ、それが結果的に色々助かった、というのは今から思い返すとありますよね。
北: そうですね (笑
北: 全てがずれている可能性があるから
一同: 笑笑
想定の30%増しで伸びてる
中: 的場さんがサーバーやりたいって聞いた時のファースト・インプレッションはどうだったんですか?
北: やればできるだろうなぁ、と思っていたけど、ジャンルが違うので1年くらいの長期的な目で色々伸びてもらう感じかなぁ、と。ただそのとき自分がいっぱいいっぱいだったので、そこまでケアできるかどうかが心配だった。
北: やりたいのはやれば良いと思っている
中: ちょうど1年経ちましたけど、どうですか?
北: まだまだやることはたくさんあるなぁ、というのはありつつ、Remoは特殊で、電気の方がいわゆるWebっぽい。クライアントもHTMLとJavaScriptで、DBあって、バッチがあって。そのあたりが一通りさわれるようになった。
北: 大体このクオーターまでにここまで出来て欲しい、みたいな計画をしていて、1クオーター分くらい早く成長してるかな、と
中: すごい。1年で1クオーター先行しているということは、想定の30%増し、と
北: すごい。
的: まじっすか
中: のびのびじゃないですか
的: 先生の指導が良いので (笑
なめるなよ、小僧
北: これ、亀田さんと僕との教え方の対比されちゃうやつですよ
中: 良いアイデアもらったので、それいきましょう。どうですか?亀田さんと一緒に仕事するのと、北原さんと一緒に仕事するので違いあります?
的: (だいぶ考えたあとに) そんなに無い気がしますね
的: 亀田さんの方は入社直後だったので用意してくれている感はあったけど、困っている時の相談にどれくらい答えてくれるかは同じ水準
北: 水準とかじゃなくて特徴とかないの、特徴
的: 特徴…か。北原さんはひたすら正論でグーパンしてくれる (笑
北: やべーやつじゃん
的: 大変だよね、とか言いながら劉さん (電気チームのビジネス開発メンバー) に
的: でも結局亀田さんも似たような…?
中: 亀田さんもグーパン?
的: グーパンではないかな…。難しいな。共通点だったらいっぱい言えるんですけど
北: いいんじゃない共通点でも
的: これNatureの人全員だと思うんですけど、半端な対応はしないですね。一度受け入れる、と決めたら徹底的に教えてくれる。最初入るときは「なめるなよ、小僧」くらいに思っていたと思うですけど (笑
的: お陰様で成長できました
中: 良い話じゃん。あまり2人で違いがない、っていうのは面白いですね。北原さんは違いがない、って言われたことにたいしてどう思いますか?
北: 亀田さんとも長いからなぁ
的: ニコイチ感
2022年になっても俺達はSOAPを触っているんだ!
中: チームレベルだとファームとサーバーで違いがありました?人のことでも開発プロセスの話でも良いのですけど
北: いろいろ喋れるでしょ
的: 人でいうとどちらも雰囲気が良い。サーバーチームの方がチームとしてのコミュニケーション機会が多い、っていうのはありますね。ほぼ毎日夕方に集まって話ししたり。今のファームチームだと全員集まるのって週一ですよね。
中: そうですね。
的: ファームのサブモジュール地獄から解放されて嬉しい、みたいな (補足: 歴史的経緯でファームウェアのリポジトリは複数のsubmoduleに分かれている)
一同: 笑笑笑
中: 直してるんで!今期中になんとかするので!
的: CI周りはサーバーの方が整っているので、入りやすいですね。リリースもmain branchにmergeするだけなので。ただ、裏で何が動いているのか、はまだ把握しきれていない。ファームでは自分が作る側だったので把握しているのですけど。
中: サーバー側って本番環境って考え方あるじゃないですか?そのあたりファームとのギャップはありますか?
的: ありますね。一番大きいのはDBですかね。本番のデータが入っていたり。外部APIもテスト環境だと自前で用意する感じになるので。
的: ファームはファームでテストが大変なんですけど、サーバーは外とつながるものが多いので、違う難しさがあります。外部APIの挙動の想定が足りていないと意味のないテストになってしまって、本番のデータでこけちゃう、みたいなのはちょいちょいやってしまったので、あれー?みたいな
北: 笑
的: Remoの方はまだやっていなくて、そっちのほうが本番環境との差分が大きそう。30万台繋がっているけど、それをテスト環境で再現しようがないので、どうなのかな、というのはあります。
中: 電気だとパフォーマンスとかスケールするか、とか意識してますか?
的: 遅いクエリは書かないように意識しています。連携先のAPIが1秒に1回しか呼び出すな、みたいなのがあって、そこに合わせて作ると自分のところがボトルネックになることはないですね。
中: 解説の北原さん、どうですか?
北: Remoとは現状のリクエスト数が全然違う、というのはあります。逆に電気側は全くモダンじゃない外部とのやり取りがある。SOAPとか。2022年になっても俺達はSOAPを触っているんだ!
的: そうですね。パフォーマンス問題に取り組んでいる方がサーバーやっている感が出るのかもしれませんが。
1年間の振り返り
中: 人の不幸な話を聞くのが楽しい、ということで、言えるギリギリの失敗したことや大変だったことを教えてください。
的: イケてない外部APIとのやり取りが大変でしたね。パラメータがめちゃくちゃ多くて、しかもなぜか全部文字列なんですよね…。各家庭のアンペアって、50A, 40A, 30Aとか入る値って決まっているのですけど、それも全部文字列で、極稀に「20.0」とか (小数点入っていることが) あってパースできなくてエラーになる、みたいな (笑
北中: 笑笑
中: 逆うまくいったこと、やってやったぜ、というのは?
的: 最近の再点はうまくできたんじゃないかな、と。進め方的にもコード的にも。だいぶ北原さんのコードを真似しましたけど (笑
北: そんなことないよ
北: 進め方もそうだし、フロントとかDB運用、CSチームとのコミュニケーションとかもあったよね
的: 反省を活かして、CSチームとのコミュニケーションは密にしてうまくやれるようにしました
的: スキーマ設計もこなれてきた感じがしますね。テーブルを適度に分解しながら考えられるようになったり。以前は1つのテーブルでなんとかしようとして手が止まってしまったこともありましたが、今ではテーブルの分割を1つのパターンとしてうまく表現できるようになってきました。
中: そのあたり北原さんとしてはどうですか?
北: (めっちゃ難しい顔して5秒くらい考え込む)
北: DB設計は運用して腹落ちしないとわからない、ってところもあるので、何回かイテレーション回って、パターン化してきており冷静に考えられるようになっているのでは。
自分のサイクルがうまく回るようになってきている
中: この1年で触った技術は?
的: Goを本格的に。コードレビューを受けながらそれなりに書けるようになってきました。MySQL / DB を本番で使うのは初で、SQLも自然と書けるように。
的: フロントもちょっとやったので React / TypeScript も。あとインフラ周りで Datadog や Docker など。
中: 的場さんのコードのクオリティが上がってきて嬉しい、みたいは話がありましたけど
北: チームで作って運用して、社内の別チームとコミュニケーションして、お客さん実際に何に困っているんだっけ?と考えて優先度付けてやる、というのって、知らないドメインや技術分野だとできないじゃないですか?
中: そうですね
北: そこが1年でできるようになって、自分のサイクルがうまく回るようになってきていて、再点とかうまくいったんじゃないかな。
北: 質問コードのクオリティの話だっけ?
北: ほめことばになるかどうかわからないけど、コードの設計が自分に似てきている。最近は大塚*3さんも戻ってきて、また自分とはスタイルが違って面白いので、そちらも見てね、という話をしている。
中: ベースとなる設計のスタイルが1個ないと、そこから先に行けないというのがあると思っていて、そこがバックエンドでもある程度できてきている、という話なのかな、と
北: そうですね
中: Goの話は受けが良いので、Goを書く上で1年前と変わったことを教えてください。
的: C言語知っていればある程度書けるので、めちゃくちゃ苦労した感じではないですね。ただ、インターフェースの使い方は良くなったんじゃないかな、と思います。ポリモーフィズムを実現する方法として活用できるようになってきています。
今後のアドバイス
中: 北原さん、ぜひ今後のアドバイスを
北: 色んな人のコードを読むのが良いと思います。今は自分のコードをいっぱい読んでいると思いますが、大塚さんのコードとか、Goは標準ライブラリに色んなコードがあったり、多くのプロダクトがGoで書かれているのでそれを読んでみるのが良いと思います。
北: バックエンドに関してはやって度胸を付けていくのが良いかな、と思います。やって失敗することもあると思いますが。失敗を分析して次に活かせれば。
的: 度胸は大切な気がしますね。色々ビビるので…
中: 的場さん、今後挑戦していきたいことは?
的: パフォーマンス考えるところとかバックエンドの面白みだと思うので、そのあたりができると良いですね。インフラにも興味があるのですが、手を回せてないので、やっていきたいです。
的: 大塚さんのコードも読むようにしているのですが、読み終わる前にマージされちゃって、やばい、みたいな (笑
中: 読むよりマージされる方が早い、と
的: 北原さんあの速度でレビューできてるのすごいな、って
北: そこに時間割いているので!
お互いに質問
中: せっかくなのでお互いに質問ないですか?
北: 今後どういう人と働きたいですか?採用っぽい良い話になった!
的: 個人的には自分がそうだったので多少スキルが足りてなくても良いので、人柄が良くて色々吸収できる人と一緒に働けたら、わかるわかる、みたいな感じを共有できて楽しいのかな、と思います。
的: 北原さんは駆け出しの頃どうやって勉強したんですか?
北: (当時の社内の人だと) 大塚さん、村瀬さん、社外の人だととくひろむさん*4とかのコード (perl) を永遠に読んでいた
的: 書くより読むのに時間を使っていました?
北: 3人共ライブラリたくさん公開していたので、普段からそれに目を通しておいて、自分で書く時に「もっとかっこいい書き方ないかな」と思って再度見てみると、「うんうん、なるほど」となり学びがあった
北: 運用は小さいやつに関わりながら勉強させてもらっていた
中: お二人ともありがとうございました!的場さんは次から自分で書いてください (笑
的: はい (笑
エンジニア積極採用中です
Natureでは自分の専門領域を超えて、一緒に開発してくれる仲間を募集しています。
カジュアル面談も歓迎なので、ぜひお申し込みください。
*1:利用者の入居等による新規契約にともない,止めてあった電気を再び使えるようにすること