とてもエキサイティングな本に出会い、一気に読んでしまいました。感想を書こうと思います。
- モダンC言語プログラミング - 花井志生
ターゲット読者層は組込み分野!
この本のターゲット読者はズバリ、組込みエンジニア。ソースコードのサンプルも、ズバリ組込みな内容を扱っています。C言語を使う人=組込みの人と決めつけているよう。書籍のあちこちで、このアプローチを組込み開発で適応するためにはどうすればいいかという考察が入るのがよい。
TIOBEというプログラミング言語の統計を見ると、C言語を利用している人がプログラマの2割程度いることがわかる。自分はこのデータを初めて知ったけれども、まずこの事実をしれたことは嬉しい事だ。C言語はいかに重要なのかという論題が冒頭で熱く語られる。
内容について
各章のテーマは、広く浅く書かれているので、もう少し各章の突っ込んだ内容がほしいところだけれども、それはこの本の趣旨には合わないのだろう。
内容は、自分の日々考えていることに非常にマッチしていて、とてもエキサイティングな読後感でした。以下、自分の過去記事も整理しつつ、各章の覚書。
開発環境について
開発環境である、Ubuntuの導入方法と、Eclipseの使い方が紹介されていた。ここは、得るものはなしかな。
- 全C/C++ プログラマに捧ぐ!Eclipse CDTを使う時のオススメ機能/プラグインまとめ | Futurismo
- Windows上のCentOSをVmwarePlayerからVirtualBoxへ移行した手順 | Futurismo
- WindowsでVMware Player上のUbuntuを動かしてみたメモ | Futurismo
オブジェクト指向
C言語でオブジェクト指向のようにコーディングするためのテクニックが紹介されている。半分知っているようで、知らなかった。C言語でも、オブジェクト指向なプログラミングは可能だと気づかせてくれる。
あとは、Cでオブジェクト指向を勉強するならば、ズバリこの本でしょう。これもオススメ。
C言語によるオブジェクト指向プログラミング入門 - 坂井 弘亮
デザインパターン
自分の来年の重点学習目標の一つが、デザインパターンをマスターすること。この章は、C言語を利用したデザインパターンの実装方法が紹介されている。この章は知らないことが多く、とても興味深かった。
以下のパターンが紹介されている。
- ステート
- テンプレートメソッド
- オブザーバ
- チェインレスポンシビリティ
- ビジター
C言語に特化したデザインパターンの本をまだ知らない。これが自分が出会った中で、もっともよくかかれた本かも。この本でも勉強するつもり。まだ読んでない。
いづれにしろ、この章は再読しよう。
TDD リファクタリング
テストフレームワークとして、GoogleTestが紹介される。レガシーコードに対するリファクタリングの実践がサンプルとして載っているのがうれしい。しかも、内容が組込みなので、実践的。パフォーマンスに関する考察もある。
namespaceを利用して、static関数を強引にテストケースに組み込む方法が紹介されていた。C++系のxUnitで利用できるテクニック。
namespace unit_test {
#include "hogehoge.c"
TEST(hoge,hogehoge) {
EXPECT_EQ(3, hoge(1, 2));
}
}
モックやスタブの定義についての言及は、自分の認識とは違うのだけれども、まあよい。モッキングフレームワークはC言語でいいものがないと書かれていた。そんなことはない、CMockやfffがあるではないか!
- 恐るべきレガシーコードの救世主になるか?!ドロドロ依存なモジュールたちを『CMock』ですっ裸にする | Futurismo
- レガシーコードをC言語のTDD用フレームワーク『Fake Function Framework (fff)』ですっぽんぽんにする | Futurismo
CでTDDをするならば、この本が必読本。
テスト駆動開発による組み込みプログラミング ―C言語とオブジェクト指向で学ぶアジャイルな設計
継続的インテグレーション
Jenkinsの紹介。これもあまり新しきことはなし。
ビルドスクリプトとして、sConsが紹介されている。なかでも、感心したのが、スモークテストでのPytyonを利用した受け入れテストのアプローチ。pyhthonコードからシリアル接続を経由してテストする方法。この作者はPythonが好きなのかな?自分は、Rubyで同じことをやろうとした。
- C言語のビルドでほのぼのrakeでmakeするよ | Futurismo
- 組込み開発のシステムテスト・機能テストを自動化できるか?Rubyのminitestで非同期テストを実施する方法を本気出して考えてみた | Futurismo
- これぞテストの最終形態!FitNesseとRubySlimで実現するエンドツーエンドテスト | Futurismo
また、Valgrindを使ったメモリ破壊との戦いも、組込みならでは。こういうことにページを割くところも高評価。ValgrindはLinux用ツールなので、まだ使ったことがないけれども、今度調べてみようかな。
まとめ
組込みの現場ではなぜ、これらのテクニックが浸透しないのだろうか?
Eclipseが浸透しないのは、べつによい。エディタはEclipseだけではないし、EmacsやVimはEclipseに負けないくらいだ。
オブジェクト指向やデザインパターンが浸透しないのは、実行速度やメモリが関係しているのだろう。また、TDDもオブジェクト指向のほうが実施しやすい。(とくにMock)CIは、文化的なものだと思う。
- 古い考えの人がCProgrammerには多いのだろうか?
- レガシーコードをメンテナンスしていると、新しいテクニックは不要なのだろうか?
- 過去の手続き型でかかれたレガシーコードを流用しているから、新しいテクニックを試す場がないのだろうか?
どれも、決定的な理由にはならない。一つ思うのは
「無知」
だからということ。自分もCに関わるいろんな情報を集めているものの、ほかの言語とくらべて、Cは圧倒的に情報量が少ない。Eclipsしかり、TDDしかり、Jenkinsしかり。
C Programmerに足りないものは、道標となるような情報や、書籍だ。C言語は使用率第一位の言語なのだ。これからも、こういう書籍がドンドン出てきてほしい。