入社1年半のソフトエンジニアの振り返り

ソフトエンジニアとして採用されて1年半が経ちました。私の大学(院)での専攻はコンピュータと縁がないところだったので、情報工学出身の皆さんと比べるとビハインドを持ったスタートです。それでも、組み込みのアプリケーションやドライバ開発、テスト技術、IoTやらセキュリティやら様々な経験を積ませていただいています。また、個人でも様々なことを試してきました。これまでいろいろなことを吸収してきたつもりです。せっかくなので、これまでに知ったことや学んだこと、考えたことをまとめてみようと思います。

組み込みの世界について

現在組み込みエンジニアをやっているので、本業についての話になります。

組み込みの紹介

まずは、組み込みの世界に関する紹介をします。開発に使用している言語はC言語ですが、C++を使うこともできます。電気屋さんが基板を作り、ソフト屋が基板の上で実行するプログラムを作成します。組み込みプログラムの基本は所定のアドレスに何等かの値を設定することです。マイコンにはGPIOやSPI通信などの機能モジュールが(1つ以上)内蔵されており、レジスタに値をセットすることでその機能を利用します。ハードウェアの処理が完了したことは電気信号としてマイコンにフィードバックされ、マイコンはそれを割り込みとして検出します。これをソフトウェア上で処理しながらいろんなことをやるのが組み込みの世界です。

組み込みの世界はリソースが限られています。Windowsといった汎用OSが実行されるコンピュータのメモリは4GB, 8GBが当たり前ですが、組み込みの世界ではKB, MBの世界です(その代わりに実行するプログラムは1つだけである)。OSはよく聞くWindowsやLinuxではなく、Realtime-OS(RTOS)や組み込み用のOSを使います。組み込み用のOSは汎用OSとは作りが異なり、ハードウェアの性質を意識しなければなりません。また、開発途中では画面がないので何が起きているかわかりませんし、printfすら満足に動かないことがあります。

このほかにも動的メモリ確保が難しいという小話もありますが、紹介が終わりそうにないので、ここで終わりとします。

課題

こういった組み込みの世界の複雑さ、使用可能なツールの制約、さらに会社の開発体制の問題や人材不足はソースコードの品質に直接響いています。例を挙げると:英語力不足による謎の関数名、構造化されていない手続き型のコード、コメントがないテストコード(そもそも動かない)などがあります。とはいえ、こうなった原因をスキル不足や努力不足と言うのは非生産的です。ソフトウェア開発の生産性を上げていくこと、上げられるような体制を構築することが重要です。そして、改善するにはスキルが必要なのは言うまでもありません。

今後やりたいこと

最近はデバイスドライバについて考えているのですが、これが結構悩ましいです。優れたAPI設計をするためにデバイスとその使い方のモデル化が必要ですし、開発フローも改善しなければなりません。開発フローといえば、Web業界ではgitと組み合わせたCI/CDが広がっていますが、組み込みの世界で実践できたらおもしろそうです。インフラ周りではDockerを代表するような仮想化が流行しており、組み込みの開発環境と仮想化の組み合わせは気になっています。テスト技術として、組み込みソフトの不具合は安全性に直結するためとても重要です。しかし、組み込みのテスト自動化が難しく、実現するに至っていません。ドライバ開発からテストまで、考えること、やることいっぱいですが少しずつ解きほぐしていきたいです。

スキル面に関してもまだまだ未熟です。最近だと、限られた最大メモリのうち、OSや静的変数の使用量を意識してタスク設計できていなかったことに気づきました。テストに関してはISO規格を代表とする品質モデルへの理解やテスト観点の整理、テスト技法の活用などがあります。自動ビルドや自動テストを実施するためのツールへの理解も必要ですね。うへ。

Web技術(フロントエンド)

JavascriptやらCSSといった、Webアプリケーションのクライアント側に関する技術にも。世の中はAIやらビッグデータやらと、データを活用する動きが活発です。同時に、サービスはクラウド化してWebを介して提供されるようになりました。

Webアプリを作る場合、フロントエンドの開発は避けられません。そう思いVue.jsに手を出してみました。基本的にGUI開発は手続きが多く苦手です。双方向データバインディングを使えるのは魅力的でした。ただ、手を出すたびにJavascriptに苦しめられている気がします。CやC++で培ったモジュール化の考えがなぜか通用しないこと、クライアントの環境を意識しないといけないこと、言語仕様の複雑さが原因でしょうか。Typescriptにも挑戦しましたが、きちんと活用できませんでした。babelやwebpackといった技術が当たり前に使われていることもハードルが高く感じます。フロントエンドの進化の速さには驚きますし、それに追従している世の中のフロントエンド屋さんには脱帽します。

そういえば、このブログもJavascript(Node.js)の技術で成り立っています。Node.jsは扱いが簡単でいいですね。言語仕様への理解と快適な開発環境が整えばもっといろいろできそうな気がします。

Web技術(バックエンド)

インフラ屋ともいいます。こちらもクラウド対応に苦労されている様子。最近DockerやKubernetesが本番環境でフル活用されていること、AWSやGCPがもはやただのクラウドサーバーではなく、ありとあらゆるサービス提供マンと化していることを知りました。

肝心の自分はというと個人所有VPSどまりです。少し前ならHerokuとか、今ならAWSを使ってみたい欲があるのですが、肝心な技術が追い付いていません。アイディアもありませんし。VPSで稼働するサービスはDockerで運用するようにしました。運用をもっと楽にしたいと思うことがありますが、自動化にかかるコストをペイできる気がしないのでしていません。Let'sEncryptでSSL証明書を取得したりもしましたね。クラウドは金銭的に高いので手を出せていません。

最近は開発と運用を区別せず、DevOpsとしてサービスを提供する話をよく聞くので、両者を区別する必要性は薄れている気がします。インフラ周りは自動化をテーマに学習を続けたいと思います。

デスクトップアプリ開発

最近はWeb技術が台頭しているので魅力が少なく感じますが、ツールとしての使いやすさを考えるとまだまだ重要なデスクトップアプリ開発。そう思って今年の頭にWPF開発を試みました。

あまり流行していないので何とも言えませんが、C#は使いやすい言語です。簡単なことは簡単にできますが、言語仕様が巨大なため扱いきれていません。今から頑張って覚えるべきかどうか、非常に悩みどころです。

アプリ開発

人気のアプリ開発。私がPC>スマホ派だったので軽視していましたが、社会人になってからPCを使う頻度が減り、プライベートでタブレットPCを使うようになったので魅力的に感じています。デスクトップアプリよりも開発が難しいことを忘れてはいけません。

iOS向けにはMacマシンとSwiftの知識が、Androidアプリ開発にはJavaの知識が必要です。意外とハードルが高いのです。

ソフトウェア工学

ソフトウェア開発を円滑に進めるための手法を指しています。最近私が遭遇する問題はこれで解決できそうな気がしており、上記に上げた技術の学習よりもこれを優先しています。何を作りたいのかを整理する要求工学、何をどう作るのがいいのかを理解する品質工学、作りたいものを人に伝えるためのUMLなど、PG向けの記事では軽視されていると時々感じますが、その威力は計り知れません。日本語の勉強だって重要なのです。

機械学習

一度はすべきだと常に感じていますが、手を出せていません。Windowsマシンでもできますか・・・?

データ処理

同上。かつての基礎研究で、新しい実験の未知データの解釈に苦しめられました。統計の知識が求められますが、統計ができても真実が導けるわけではありません。リベンジしたいですが、苦手意識があります。

信号処理もデータ処理といえるでしょうか。信号処理も大学で学ぶことが無かったので、コツコツ勉強しています。数学は苦手です。