2020年振り返り【ほぼ開発未経験で組込みLinuxでIoTシステムをリリースした話】

# はじめに
この記事はTechCommit AdventCalenderの投稿です。

(投稿日時はあまり突っ込まないで下さい。すみません)

2020年の3月に会社に転職し、同年の8月からRaspberryPiを使った組み込みLinuxボードでIoTシステムを開発しました。

それから12月までの5ヶ月間は、自身のエンジニアキャリアにおいて非常に濃密な経験を得られました。

この経験を無駄にしないため、また開発プロジェクトで起こした失敗を繰り返さないために記事を残します。
# 目次
* 概要
	* 開発プロジェクトの簡単な説明
* プロジェクトにおいて、自身の業務内容
* 学べたこと
* どのように学んできたか
* 課題点
* 自分と同じ失敗をしないためにやるべきこと
* 2021年の目標

# 概要
## 開発プロジェクトの簡単な説明
* 遠隔で機器を操作する目的のシステム。
* 機器の内部の処理はマイコン(低リソース)で制御
* Androidアプリで機器の操作を行うために、RaspberryPiが基板へ橋渡しする
* 遠隔操作のために、Bluetooth(BLE)を扱う
* 言語はC,Python

## ブロック図
![block_Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432868/c63629b3-d454-35ec-89e5-a8e758e6c5d7.png)

# プロジェクトにおいての、自分の業務内容
* IoT製品の RaspberryPi部分の要件定義から試験までの一貫した開発業務
	* 技術調査
	* 機能設計書/詳細設計書作成
	* 試験仕様書作成
	* 客先との折衝(要件定義・仕様詰め合わせ)
	* プロジェクトマネジメント
# この1年で学べたこと
## プログラミング(実装)以外の開発業務の経験
* 設計
	* 外部設計書/詳細設計書
        * 通信仕様書(BLE通信/SPI通信)
	* UML作成(シーケンス図、クラス図)
* プロジェクトマネジメント
	* 要求仕様を固める
	* 要件定義
	* Redmineによるチケット管理

## C/C++,Pythonを使った開発経験
* C/C++
    * マルチスレッドプログラミング(pthread)
    * システムコール
    * File制御
    * 保守性(可読性)の工夫
    * プロセス間通信(FIFO)
    * C/C++でBLE開発([ライブラリURL: https://github.com/nettlep/gobbledegook](https://github.com/nettlep/gobbledegook))
 
* Python
   * logging
   * multiprocessing
   * pyudev (Udevのラッパー)
   * プロセス間通信(FIFO)
   * PythonでBLE開発 ([ライブラリURL: https://github.com/Adam-Langley/pybleno](https://github.com/Adam-Langley/pybleno))

## その他の技術要素の経験
* BlueZ(Linuxで標準搭載されているBluetoothのソフトウェアスタック)
* BLEの知識
* SPI通信知識
	* SPI通信の解析 
* アプリケーションの自動起動設定方法
	* crontab
	* systemd
	    * 自作ソフトウェアをサービス(.service)にする
	    * サービス起動順番を変える
* rsyslogによるソフトウェアの出力を`/var/log`に記録させる
    * rsyslog.confの作成
* Udevによる、USBのマウント監視設定
    * Udevrulesの作成

# どのように学んできたか
## 1. Bluetooth/BLE
下記の2冊を読んで、暇があったら学んでいました。

### [基礎からわかる「Bluetooth」―近距離に特化した無線通信規格 ](https://www.amazon.co.jp/dp/4777518922)
* Bluetoothとは何ぞやから始められる本
* BLEの内容はあまり記載されていない
* メインはBluetooth Classicの内容
* プロトコルやプロファイルはBLEでも共通する部分は多くあるので、読んで無駄ではない
* 簡単な電磁気学や無線工学(変復調)が記載されている

### [Bluetooth Low Energyをはじめよう](https://www.amazon.co.jp/dp/4873117135/)
* 対象読者は、組込みエンジニア・アプリケーションエンジニア
* BLEの内容がメインでかなり詳しい
* 10章構成
    * １～4章までがBLEの概念や通信の説明 (これだけでも買う価値アリ)
    * 5~10章までが実践的な開発手法の説明 (ハードウェアやツールが必要になる)
* ~~オライリー本なので、少し読みにくい。慣れが必要(筆者の感想)~~

### 参考になった記事
* [Bluetoothのはなし](https://www.silex.jp/blog/wireless/2012/12/bluetooth4.html)
* [BlueZのAPI/サンプルコードのメモ](https://qiita.com/ffmatsu/items/b7ca6a944b5a1ea9c7a6)

## 2. Linux全般
* [Linuxコマンド集](https://www.amazon.co.jp/dp/B00Z5OCH1G/) 
* [Ubuntuサーバ管理](https://www.amazon.co.jp/dp/4798155764/)
* [Linux全般知識の把握](https://www.amazon.co.jp/dp/4798160490/)

## 3. C/C++
* マルチスレッドについて
    
    [Linuxとpthreadsによる マルチスレッドプログラミング入門 ](https://www.shuwasystem.co.jp/book/9784798053721.html)

## 4. Python
* 基礎知識
    * [入門 Python3](https://www.amazon.co.jp/dp/4873117380)
* logging
    * [Python3 logging 公式ドキュメント](https://docs.python.org/ja/3.7/library/logging.html#module-logging)
* multiprocessing
    * [Python3 multiprocessing 公式ドキュメント](https://docs.python.org/ja/3.7/library/multiprocessing.html#module-multiprocessing)
* pyudev
    * [pyudev](https://github.com/pyudev/pyudev)
    * [pyudevドキュメント](https://pyudev.readthedocs.io/en/latest/index.html)

* Udemy講座
以前から購入していたが、multiprocessing,loggingなど標準ライブラリを学ぶために再度視聴した
    * [Udemy講座](https://www.udemy.com/share/1013hk/)


# 課題点
* 設計を程々にして、コード実装した方がよかった
* コードの中で設計思想を盛り込むべきだった
* オブジェクト指向でコード実装するべきだった
* Linuxのサーバ管理の技術を早めに知るべきだった
* OSやイメージのバックアップをコマ目に取るべきだった
* 開発や環境構築のメモをまとめて、同じフォルダに置いておけばよかった

# 同じ失敗をしないためにやるべきこと
* RaspberryPiなど、容量に強い制限がないならC++で開発するようにする
* Cで実装するならオブジェクト志向で開発する手法を学ぶ
    * Cはスパゲティになりやすい言語なので、工夫しないと直ぐに汚くなる
    * グローバル変数は便利だが、コードが汚くなる
    * C言語でもデザインパターンを学ぶべき
    * [このような本](https://www.amazon.co.jp/dp/4798121134)があったので、これを基に学習してみたい

* ソースレビューはコマ目に行い、できるだけ多くの人間に見てもらう
* 開発タスクは進み具合が不明なものから優先して行う
* 基板到着を待たないためにも擬似デバイス(プログラム含む)の作成は必須

# 2021年の目標
* LPIC1,LPIC2に合格する
* UMLを学ぶ(シーケンス図,クラス図,ステート図)
* C++を学んでオブジェクト指向を意識して実装できるようになる
	* Cで書いたソースをC++に作り替えて、全く同じ処理を作る 
* 小さいことでも良いので、会社に技術的に貢献する
	* C/C++のコーディングルールを作る
	* プロジェクトで得た開発知識・技術を社内で共有する