組み込みエンジニアのための徒手空拳のすゝめ
この記事は Calendar for Akerun | Advent Calendar 2021 - Qiita の 23 日目の記事です.
初めまして,2021 年度の tarotene - Qiita です.
今年 1 月より新卒インターン1として FW チームにジョインし,4 月からはそのまま FW チームで製品の開発・運用に携わっております.
FW チームに求められる守備範囲はざっくりと
の開発・運用・その他諸々ですが,実は私はこれらの分野がほぼ全て未経験でした!
実際,Linux は多少のコマンドが打てる程度2で,リアルタイムシステムに至っては概念すら全く知らない状況でした.
にも関わらず,入社から 1 年が経過した現在では製品の運用にがっつり関われるようになった(と自分で自分を評価しています).
もちろん,これはよくある「未経験から最短でITエンジニアへ」みたいな騙し文句のサクセスストーリーではなく,随所に見えない仕掛けを施してきた人間の生き様です.
本記事では,そんな私が元々どういった人間で,組み込みエンジニアとしての業務を軌道に乗せるまでに何をやってきたかを簡単にお話しします.
似たようなキャリアを歩まれたい方の参考になれば幸いです.
エンジニアリングとの接点
プログラミングとの出会い
この手の話でキーワードになるのは何といっても「プログラミング」でしょう.
私は元々,大学の学部・大学院で物理を専攻しており,たまに必要に駆られて数値計算のためにプログラミングを覚えるといった程度でした3.
Twitter で希によくいる「高校時代に情報オリンピックで金メダルを取りました」とか「計算機科学の分野で特別栄誉賞をいただきました」みたいなのとは完全に無縁の生活です.
でも,実際に勉強してみると,当時の観察対象とは一見異なる「自然法則」が計算機を支配しているように感じられ,徐々に惹かれていきました.
プログラミングとの中途半端な関係
難しいことに,研究のためにプログラミングをただ使役するだけだと,どうしてもソフトウェアの「設計」とか「運用」を意識する場面がほとんどありません4.あっても,教科書レベルのコーディングガイドラインを守る程度.例えばデザインパターンやテスト技法についての勉強は完全におざなりで,本気で時間を捻出すればできたかも知れないけど,そこまでのモチベーションが持てないというのが実情でした.
そこで,研究も何となく詰んできたことだしチョットくらい気が紛れる遊びに手を出そうと思い,知人から紹介されて某競技プログラミングサービスに手を出しました.この時点で,雀の涙程度のアルゴリズムとデータ構造についての知識が身に付き,わずかながら C++ を触れるようになりました.
面白いのが,数式中心の文化で生きてきたこともあり,計算と言えば「有限個のパラメータ集合を一つ定めると一意的に結果が求まる」ものがほとんどと思っていた自分にとって,「手続き的に何かをやると(やはり一意的に)結果が求まる」ケースの多いプログラミングは控えめに言ってパラダイムシフトでした.でも,よくよく思い返すと,例えばモンテカルロシミュレーションは「確率アルゴリズムによって時系列を所望の確率分布に収束させる」というそれ自体が数学的に保証された手続きなので,数学・計算機科学に共通の側面を 1 nm
程度理解したというのが妥当かも知れません.
プログラミングを超えてエンジニアリングへ
段々と見出しが仰々しくなってきましたね.
プログラミングは飽くまで道具だとする研究中心の生活と同じくらい,ソフトウェアエンジニアとして真っ向からプログラミング(もといエンジニアリング)に取り組むキャリアも魅力的だと思ったのは研究生活も終盤の頃です.
それで,紆余曲折あり Photosynth にジョインする運びとなりました5
この時点で,学生時代には手すら出さなかった新しいことをやろうと決めていました.それは,概ね
- 学習コスト度外視で組み込みならではのコア技術に習熟し,ゆくゆくは技術選定にも関われるようになる
- 商用ソフトウェアならではの設計・テスト・運用・... の経験を積む
という 2 点です.
前者の「組み込みならではのコア技術」については挙げるとキリがないのですが,個人的にはプロダクト依存度の非常に高い Bluetooth Low Energy (BLE) や各種リアルタイム OS の仕組みを知るのが優先課題といったところです.
後者の「設計・テスト・運用・...」は広い意味でのソフトウェアエンジニアとして,です.コーディングから離れることで初めて見えてくる開発者特有のニーズとかそういうものを大事にすることで業務の幅も広がると思っています.
エンジニアリングにおける「徒手空拳」
いよいよ,本記事の本題である徒手空拳編(?)にシフトします.
ソフトウェアエンジニアとしての私は
- 物事を原理原則から理解し,知識を宙に浮いた状態にしない
という態度を非常に大切にしています.この態度によって,
- ソースコード上の知識片を統合し,本来あったはずの設計情報を看破できる
- 設計情報をストーリー形式でチームメンバーに共有できる
- (特に FW 設計で)電子回路・機械の事情を考慮した最適なコードを書ける
といった実利はもちろんですが,いざという場面で徒手空拳で知識を作れるといった強みがあります(タイトル回収).
世の中,知識は良いものも悪いものも指数関数的に増大していく一方です.こうした知識の洪水の中を生き抜き,少しでも信頼性・汎用性・寿命に富む知識を手に入れるには「自ら知識を作る」という態度が肝要だと思います.
知識を作るというのは大変な行為で,苦労して編み出した知識が既出だったというケースは割合多いです.でも,そうやって自らの血肉をベースにして出来上がった知識は一生モノです.また,既存の知識を組み合わせるだけですごいことに気づいてしまうパターンもあります.つまりギャンブルです.
組み込みだとまとまった知識が世の中にない,特に日本語で書かれた文献が少ない,などの理由で調査コストが大きくなりがちです.つまり,知識を作るチャンスが山ほど転がっています.例えば,社内にある組み込み機器をリモートで J-Link デバッグしようと思い,ざっと以下のことを調べた記憶があります:
- 端末多重接続技術(tmux, screen, byobu, etc...)
- Raspberry Pi OS に J-Link Commander をインストールする方法
- 組み込み機器の CPU を停止・リセットする方法
この手の調べ物で
- なるべくオリジナルの文献にあたる
- 自ら手を動かして失敗パターンを潰しておく
といったことを心がけておくと,知識の寿命や適用範囲を伸ばすことにつながり,周りのエンジニアもハッピーになれます.
ここにエンジニアリングの本質があるような気がします.実際,やっていることは
- 得られた事実から,適用範囲と主張の強さのバランスが取れた命題を導く
- 導かれた命題に対して,事実ベースの検証・改良も継続的に行なっていく
の 2 つに尽きます.今のところ,入社してからの経験値の振り分は大体
上に書いたことの純粋な質的向上 >> 特定の OS や言語,フレームワークに関する技術的スキルの積み上げ
といった感じですが,上手くバランスをとりながら生きていきたいものです.
ブックガイド
最後に,業務知識の集約がてらこの半年間で手を付けてきた名著(?)の数々をご紹介します.
ほぼ積読状態のものもあれば,何度も読み返した本もあります.コメントと共にお楽しみください.
『組み込みソフトウェア開発スタートアップ』
ソフトウェアを浅く広く知っている状態で組み込みの世界に飛び込むためのバイブル.ソフト設計はもちろん,製造・テスト治具やそもそものテストの話がカバーされているなど,とにかく話題が豊富.参考文献も付いていて更に進んだ学習を促してくれるのが Good.今すぐポチりましょう.
『MEMS開発&活用スタートアップ』
ネタ枠.書泉ブックタワーで何故か『組み込みソフトウェア開発スタートアップ』の隣にあったので一緒に買ってしまいました.半導体デバイスをはじめとするナノスケールの世界に興味がある人向けです.C 言語のコードっぽいモノもチラッと載っているのであながち無関係でもないと思います...
『達人プログラマー』
これは恐ろしい本です.プログラミングパラダイムを片っぱしから紹介してくれる本です.プログラミングパラダイムはどうしても言語で縛られるので,なかなか目線を上げる機会がないなと思ったなら読むと良いでしょう.ソフトウェア設計の本でもあるので,ビジネスロジック分かっているマネージャが技術選定のために読むという使い方もできそうです.
『リーダブルコード』
紹介すると徳を積めると思ったので載せました.微妙なプラクティスも少なからずあるみたいですが,
- 「簡潔なコメントを書こう.」->(でも概念を知らなければいいコメントは書けない,だから様々な概念を知ることから心がけよう)
- 「コーディングガイドラインに沿う範囲で良い変数名,もとい英単語を選定しよう.」->(でも知らなければできない,だから英語にも慣れよう)
といった具合に,書かれた内容から裏のメッセージを読み解くのが良いと思います.
Bluetooth Low Energy: The Developer's Handbook
今読んでいる本です.LaTeX で組版されている読み物はやはり落ち着きますね.英文も平易なので読みやすく,それでいて BLE の仕様についてほぼ完全な解説を提供してくれる優れものです.こういうのを血肉にしたいものです.
『組み込みC/C++プログラミング入門』
たまにある C 言語でクラスベースのオブジェクト指向を実現する系の指南書です.組み込みだとコード品質とフットプリントの軽さを両立することが求められるので,時にはこういった技術も求められます.手を動かして練習するのに向いています.むしろ言語設計とかやりたい人に最適かも知れません.
『シェル・ワンライナー160本ノック』
めちゃくちゃキャッチーなシェル芸の本.組み込みでは Real-time transfer (RTT) という Segger 社のログ出し機能を使うことがあり,サーバー・インフラ屋のログ監視とよく似ています.そういう場面ではシェルコマンドによる労力削減は必須なので練習して覚えたかったらこの本を読みましょう.序章はちょっとしんどいかも.
『組込み開発のための実践的プログラミング』
AVR マイコンを使って手を動かしながら組み込みプログラミングを覚える本で,実践志向かつちょっと中級者向きです.手を動かさずに読んだ感想は Very Good.
『ディジタル回路の設計入門』
アナログ回路からスタートしてデジタル回路の実装,カウンタやタイマ,クロックなどの各種 IC の実装と進んでいき,最終的に VHDL にもちょろっと触れる計算機屋向けの電子回路の本です.
『これなら通じる技術英語ライティングの基本』
コミットメッセージやコード中のコメント等,明確(clear)・正確(correct)・簡潔(consice)な英語を書くことをよく求められます.こうしたケースで,日本人エンジニアが最小限の労力で良い英語を書くための指南書のようなものです6.
株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 hrmos.co
Akerun Proの購入はこちらから akerun.com
-
当社の製品である Akerun Remote を社内で開発・テストしやすくするツールを Python で書いたりしていました.その時の話はまたいずれします.↩
-
拙いシェルスクリプトくらいは書けるが,勉強不精だったので業務で役に立つログ解析系の TIPS とかは完全に無でした.シェルスクリプトの勉強に関しては後述のブックガイドを参照.↩
-
実際に使っていたのは Python と Fortran 90 だけ.C に至っては教科書を手を動かしながら読んだくらいで,成果物すら無です!↩
-
批判が来そうなのであらかじめ言い訳をしておくと,近年では HPC 分野の発展がめざましいので,その運用に合った綺麗なソフトウェアを書こうという動きは広がっている(例えば https://ma.issp.u-tokyo.ac.jp/ に情報がまとまっている).また,最近でなくとも,綺麗なソフトウェアを書ける非計算機科学分野の研究者は昔からたくさん居る.↩
-
選択の軸はシンプルな Web サービスよりも低レイヤ技術を駆使する事業に興味があったという点です.↩
-
余談ですが,学位論文を書く時はこれを使っていました.書かれているガイドラインを守るだけで指導教員の赤入れの量が面白いほど減ったのを今でも覚えています.↩