へっぽこソフト&ハード兼任エンジニアになって気づいたこと

私は今の会社に新入社員で入社し、約半年の研修を終え、去年の9月に配属されてからほぼ1年、エンジニアとして比較的楽しく仕事ができていると感じています。
大学の専攻はハードウエア(電磁波)、配属されて数ヶ月もハード、移動になってソフトハード兼任のようなポジションにいます。ハードとソフト（と言っても分野が狭いですが）両方を触ってみて、開発において大事だと感じたことを、今日はメモ書き程度ですが、私のようなへっぽこエンジニアの方々に参考になればなと思って書き殴りしてます。

# メモを取れ
多分これは大昔から先人に耳にタコができるほど言われ続けて、耳でタコが繁殖してると思いますが（そのタコじゃない）、すっごく大事です。

なぜかって単純で、ずばり「昨日のことを今日忘れているから」です。

これはソフトをやっててもハードをやってても共通です。何か課題があった時メモしないと、次の日、さらには昼休み後にはもう忘れていることがあります。そうすると後々同じ検証やバグとりをもう一度やる羽目になるだけでなく、そういう課題はあとで気づく方が直すのが大変です。まぁ改めて言われなくてもわかってますよね。

## メモは誰でも見えるところに書け
これは僕個人がこうした方がいいと思ってるところなのですが、日々の呟き、小さい気付き、やり残した課題点など、自分だけが見える場所に置いとくと、自分だけでどうかしなくてはいけなくなります。他の人に頼りたい時も、その人に改まってお願いしに行かないといけません。非効率だなぁーと思います。

そこで、メモをTeamsやSlackで公に書いてみたとしましょう。ちょっとやっただけで以下のようなメリットがありました。

1. 助け舟が向こうからやってくる。
2. 些細なメモが重要ファクターなことがある。
3. 他の人の仕事を加速できる。

1ですが、メモ書きはあくまでメモですから「他の課題やりたいのにめんどいなぁ」とか個人の感情を書いておくと、たまーに「僕ちょっと空くからやってみようか？」とか言ってくれる人が出てきたり、専門家の意見を聞けたりします。リソースを分配することは本来マネージャーの仕事だと思うかもしれませんが、僕のチームではこう言った自主的な分担ができることで、チーム全員がモチベーション高く働けていると感じます。仕事は楽しく！

2も同じようなことですね。自分が気づけないことに他の人が気づいてくれたりして、自分も勉強になります。逆に、すごく重要課題だと思っていたらそうでもなかったパターンもあります。

3は１、２でいう「誰か」に自分がなるということです。的外れでもちょっと意見してみたりすると、意外に的を得ていることもあります。

これは少し課題点もあって、チャット活用に対して全員が同じモチベーションではありません。あまり活用しない人も多いため、なんらかの手段でこちら側に引きずり込む努力が必要なこともあります。私は自らチャットを使って見せて(相手にチャットベースで会話を持ちかける)布教しています。

# 「とにかくやってみよう」は「とにかく実装してみよう」ではない
これはソフト開発をするときに特に思うことです。

その前に話を変えて、よく「ソフトエンジニアは数学が重要」と言われます。確かにそうです。僕もそう思います。しかし僕の意見ですが「ハードエンジニアはもっと数学が重要」だと思います。

前者の意見が出てくる理由はおそらく、ソフト開発は「数学をそのまま実装する」からだと思います。最近は確率統計が重要などとよく言われますが、ソフトの場合はそれをモンテカルロ法などでそのまま実装するため、「数学が重要」なのだと感じます。

僕の意見、後者の理由は「ハードは数学を基にした別のものを使う」からです。数学をそのまま使うわけではないので埋もれていますが、物理現象は須く数学の上に成り立っています。昨今の開発業務はシミュレータを頻繁に使うと思いますが、数学ベースでシミュレーションを理解していると、シミュレータが絶対ではないことがよくわかります。それをわかってる人とわかっていない人では、次のアクションが変わってくるので非効率な開発をしてしまったり、実測のデバッグに大量の時間を割かれてしまうかもしれません。シミュレーションで細かいところをケアするためには、数学を理解して、その下位概念の物理を理解しておくことが重要だなぁと感じます。

これを踏まえて『「とにかくやってみよう」は「とにかく実装してみよう」ではない。』の話ですが、まず、ハード開発でなぜそれが大事かは前の段落で理解できるかと思います。「シミュレータでとにかくやってみよう」「開発時間が足りない！シミュレーションぶん回そう！！」ということになってしまうからです。そうすると、上で書いたように大きな出戻りが出てくる可能性があるのです。

ソフト開発の時はどうかというと、「数学をそのまま実装できてしまう」ところが問題で、ときにそれが近似的であることを忘れてしまいます。「とにかくやってみよう」は「検討する時間を飛ばす」ことであって、「とりあえず式をそのまま実装しよう」ではありません。これを勘違いすると思わぬバグを生み、いい手法だったとしても「バグが出るからやめよう」になってしまうのです。ソフトはなるだけ簡潔な形にしてから実装すべきです。(私はこれを怠って細かいデバッグを大量に生んだことがあります。)

# そもそも日本人は(?)数学ができない
僕が学生だったとき、国際学会で発表している海外の学生と日本の学生を見比べると、海外の方が「数学ベースの物理」、日本は「シミュレーションベースの物理」だと感じました。日本人学生の説明は「こう言う条件で解析するとこうなる」という流れで、海外の学生は「原理上このようだからこうした」という流れで話ます。当然全員がそうではありませんが、傾向としてそのように思いました。

それはなんでかなと思うと、多分ですが「数学が面白い」と思って学んでる人が少ないのではと思います。多くの場合先生もそう思っていません。なので子供たちはテストで点が取れる勉強を求め、塾もその技を教え、大学受験までそのやり方で通ることができるシステムで、いい企業に入るには大学卒業はほぼ必須で、大学院まで行った方がさらに高待遇の企業に入りやすい。だから好きでもない数学を「特に嫌いでもないから」という理由で仕方なくやり大学院までくるが、「好きではない」「重要だと思ったことがない」「重要だと気づいたが答えのない数学に取り組んだことがない」ためにシミュレータに頼る。感覚で開発してしまう。小手先の数式をそのまま実装する。そんなことになってるのだと思います。

そんなこんなで一気にブームになってるのが「AI」でしょう。僕の感覚ですが確率がベースになっているAIは、最後の手段だと思います。いろんな理論、計算では実現できなかったことがAIならできる。そういうものだったはずです。しかし最近の特に家電製品のCMなんかを見ると「それただの移動平均では？」「普通の適応制御じゃん」「手で解けそうな確率密度分布じゃね？」と思いことがよくありますが、彼らはそれを「AI」と呼んでいます。それがただの謳い文句だったらいいのですが、「数学をそのまま実装している」のだとしたら、無駄な計算、無駄な開発プロセスを回していることに他なりません。「ちょっと手間かけて解いたらすごく簡単だった」パターンの物がかなりありそうな気がします。それでもエンジニアでしょうか。と言いたい。

# なんでこんな記事を書いたか
そもそも僕がなんでこんな記事を書いたかというと、正直ハード開発にいたときの非効率なシステムが、今のソフト開発にきて解消したからです。ハードの時は「実績は週単位で振り返り」「自分で考えろの空気」「ハードだけで解決するには高すぎる壁」を感じていました。すぐに行動できない、人に聞きにいけない、他部隊と話し合う機会が少ないことがチームの空気としてありました。異動になって、せっかくだから自分のやりやすいチームにしたい、と思っていろいろ意見してみた結果、成果もそこそこあげれたし、何より楽しい！その仕事スタイルを誰かに共有したいと思い記事にしてみました。チャットで「今から積分を解くので半日ください」と言って通用するチームになってよかったと思います。