こんにちは。
画像処理と動物が大好きな現役エンジニアの”はやぶさ”@Cpp_Learningです。
すごい真面目に『動物の行動観測カメラ』を開発し、良い成果が出せたので…
このカメラシステム開発を題材にした『ソフトウェア開発入門のチュートリアル記事』を書きました!
本サイトで動物といえば…そう!可愛い”あの子”のことです!!
以降から茶番を交えながら、真面目に!楽しく!カメラシステム(ソフトウェア)開発手順を説明します。興味のある人は肩の力を抜いて続きをご覧ください(*・ω・)ノ♪
ゆーちゅーばー”くるる”のお願いてくてく…てくてくてく……てく 小気味よい小さな足音が聞こえてくる。
本サイトに再び!あの人気フクロウ”くるる”@kururu_owl が遊びに来てくれました!
くるる
飛ぶという行動は非常にエネルギーを使うため、飛ぶよりも歩くことを好むフクロウもいる。
はやぶさ
こんにちは”くるる”ちゃん!また用事があって来てくれたのかな?
くるる
↑なかなか凄いワードが並ぶ”くるる”から東北弁の「んだー」が飛び出たことに少々驚いたが、小刻みに頷くだけにして、話しを促す。
くるる
あぁ”スサー”ね……
はやぶさ
マジで分からない…YouTuberの間で流行ってる言葉なのか?(くるるは自分のチャンネルをもつ正真正銘のYouTuberです!)
くるる
はやぶー画像処理とか得意でしょ?”スサー”撮るカメラ作って!
くるるが目を輝かせながらお願いしている!断れるわけがない!!
はやぶさ
わーい!足元でぴょんぴょん跳ねる”くるる”が今日も可愛い!笑
要求分析”スサー”が何か分からないことには開発しようがない…
はやぶさ
クライアント”くるる”に対し、なんとなく”様”を付けたが”くるる”は全く動揺しない。実に堂々とした2歳児だ!!
くるる
はやぶー”スサー”知らないの?鳥業界の常識だよ!!
人間界の常識じゃないことに少し安心しました。
「しょうがないなぁー」と言いながら”くるる”が1枚の写真を見せてくれた↓
おお~確かに”スサー”って感じだ!要するに鳥が”羽を伸ばす行動”を”スサー”というらしい。
スポンサーリンク 課題抽出”スサー”が何か分かったところで疑問が沸いてきた。
はやぶさ
”くるる”ちゃん 自分が”スサー”するタイミングでカメラ回せば良いのでは?
「ぶっぶー!!」今日一番の大きな声でダメ出しされた…
くるる
はやぶーは自分が”あくび”するタイミングでカメラ回せる?!
言われてみれば。。
はやぶさ
くるる
鳥は1時間に何度も”スサー”するときもあれば、3時間待っても”スサー”しない日もあります。
また”スサー”してからカメラを構えると警戒して、しばらく”スサー”してくれない…
くるる
…だそうです。意外と難しそうだけど”スサー”撮れたら希少映像で話題沸騰かも!!
燃えてきた!!
クライアントやチームメンバーと開発するソフトについて、しっかり議論することで、課題を明らかにしましょう!
仕様検討課題をまとめてみる↓
【課題】
この課題を解決するには『”スサー”するタイミングで定点カメラのシャッターを切る』という方法がスマートだと考えた。
では『”スサー”するタイミングとは?』休日にフクロウをじっくり観察します(・ω・)じーーっ
すると以下のことが分かってきました。
【くるるの行動パターン】
一般的なフクロウも↑と同じ行動パターンなのかは不明だが、少なくとも”くるる”の行動パターンはこんな感じでした。
ここまで分かれば開発するソフトの仕様が見えてきます↓
動物の行動観測カメラ開発の仕様
”クライアントの有無”や”チーム・個人での開発”など、ケースバイケースですが、仕様検討のざっくりとしたポイントは以下の通りです。
仕様が固まったら、今度はその仕様を満たすための機能を検討・調査します。具体的には以下のことを検討⇒調査しました。
【調査リスト】
ソフト屋の『調査する』=『徹底的に”ググる”』だと思って問題ないと思います。
…で!検討・調査の結果、以下の機能で仕様を満たせることが分かりました。
【開発する機能(アルゴリズム)】
次は【開発する機能】を実現するための、ソフトウェア設計図(UMLによるモデル図)を作成後、ソースコードを作成するのですが…その前に大事なことを確認しておかねば!!
はやぶさ
”くるる”ちゃん いつまでにソフト作ってほしいの?
くるる
なるはや…だと!?誰だ”くるる”にこんな恐ろしい言葉教えたやつは!!
「なるはや」とは「なるべく早く」の略で、何が大変って人によって「なるはや」の感覚が違うのだ!2週間以内という人も知れば、1日という人もいる…
今回の開発はスピード勝負!とりあえず3日後の完成を目標に開発を進めます。
開発期間が長い場合は、ソフトウェア設計図(UMLによるモデル図)を作りこみ、メンテナンス性・保守性・変更容易性などを考慮した構造やソースコードの振る舞い(動作)をモデル図で確認した後でソースコードを作るのですが…
今回は、もう時間がないので…いきなりソースコードを作り始めます!
まずは開発予定のソースコードに近いサンプルソースがないか”ググって”探します。
あった!開発者様ありがとう!!参考元ソースコードで機能の❶~❷は実現できます。
残りの機能も参考ソースコードをベースに作りこみます。…で完成したソフト”Animal_Cam.py”が以下です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
import cv2
import numpy as np
from timeit import default_timer as timer
from enum import Enum
class State(Enum):
Wait = 1
Ready = 2
SaveVid = 3
# Esc キー
ESC_KEY = 0x1b
# s キー
S_KEY = 0x73
# r キー
R_KEY = 0x72
# 特徴点の最大数
MAX_FEATURE_NUM = 1 # 500
# 反復アルゴリズムの終了条件
CRITERIA = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)
# インターバル (1000 / フレームレート)
INTERVAL = 30
# ビデオデータ
# VIDEO_DATA = 'kururu.MOV'
VIDEO_DATA = 0
class Motion:
# コンストラクタ
def __init__(self):
# 表示ウィンドウ
cv2.namedWindow("motion")
cv2.namedWindow("output") #add
# マウスイベントのコールバック登録
cv2.setMouseCallback("motion", self.onMouse)
# 映像
self.video = cv2.VideoCapture(VIDEO_DATA)
# インターバル
self.interval = INTERVAL
# 現在のフレーム(カラー)
self.frame = None
# 現在のフレーム(グレー)
self.gray_next = None
# 前回のフレーム(グレー)
self.gray_prev = None
# 保存用のフレーム(カラー)
self.vid = None
# 特徴点
self.features = None
# 特徴点のステータス
self.status = None
# メインループ
def run(self):
# 最初のフレームの処理
end_flag, self.vid = self.video.read()
self.frame = self.vid
self.gray_prev = cv2.cvtColor(self.frame, cv2.COLOR_BGR2GRAY)
# init
pre_x = 0
pre_y = 0
state = State.Wait.value
frame_count = 501
while end_flag:
# グレースケールに変換
self.gray_next = cv2.cvtColor(self.frame, cv2.COLOR_BGR2GRAY)
# 特徴点が登録されている場合にOpticalFlowを計算する
if self.features is not None:
# オプティカルフローの計算
features_prev = self.features
self.features, self.status, err = cv2.calcOpticalFlowPyrLK( \
self.gray_prev, \
self.gray_next, \
features_prev, \
None, \
winSize = (10, 10), \
maxLevel = 3, \
criteria = CRITERIA, \
flags = 0)
# 有効な特徴点のみ残す
self.refreshFeatures()
# フレームに有効な特徴点を描画
if self.features is not None:
for feature in self.features:
# 点描画
cv2.circle(self.frame, (feature[0][0], feature[0][1]), 4, (15, 241, 255), -1, 8, 0)
# Check State
# print('Check State:%d' %state)
if state == State.Wait.value:
print('===== State:' + State.Wait.name + ' =====')
state = State.Ready.value
elif state == State.Ready.value:
print('===== State:' + State.Ready.name + ' =====')
# Calculate diff
fx_diff = abs(pre_x - feature[0][0])
fy_diff = abs(pre_y - feature[0][1])
if fy_diff >= 8.0:
print('------------------------------------------')
print('Xpre:{0}, Ypre:{1}'.format(pre_x, pre_y))
print('Xnow:{0}, Ynow:{1}'.format(feature[0][0], feature[0][1]))
print('Xdif:{0}, Ydif:{1}'.format(fx_diff, fy_diff))
# Set vid data
curr_time = timer()
videoName = 'output_vid/' + 'kururu' + str(curr_time) + '.mp4'
# Define the Codec and File Name
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter(videoName, fourcc, 20, (640,480))
frame_count = 1
state = State.SaveVid.value
# elif state == State.SaveVid.value:
# print('===== State:' + State.SaveVid.name + ' =====')
# if frame_count < 500:
# out.write(self.vid)
# frame_count += 1
# else:
# frame_count = 501
# state = State.Wait.value
# 更新
pre_x = feature[0][0]
pre_y = feature[0][1]
# 表示
cv2.imshow("motion", self.frame)
# cv2.imshow("output", self.vid)
# 次のループ処理の準備
self.gray_prev = self.gray_next
end_flag, self.vid = self.video.read()
self.frame = self.vid # add
if end_flag:
self.gray_next = cv2.cvtColor(self.frame, cv2.COLOR_BGR2GRAY)
# Write the video(Save 500 frams)
if state == State.SaveVid.value:
print('===== State:' + State.SaveVid.name + ' =====')
if frame_count < 500:
out.write(self.vid)
frame_count += 1
else:
frame_count = 501
state = State.Wait.value
# 表示
cv2.imshow("output", self.vid)
# インターバル
key = cv2.waitKey(self.interval)
# "Esc"キー押下で終了
if key == ESC_KEY:
break
# "s"キー押下で一時停止
elif key == S_KEY:
self.interval = 0
elif key == R_KEY:
self.interval = INTERVAL
# 終了処理
cv2.destroyAllWindows()
self.video.release()
# マウスクリックで特徴点を指定する
# クリックされた近傍に既存の特徴点がある場合は既存の特徴点を削除する
# クリックされた近傍に既存の特徴点がない場合は新規に特徴点を追加する
def onMouse(self, event, x, y, flags, param):
# 左クリック以外
if event != cv2.EVENT_LBUTTONDOWN:
return
# 最初の特徴点追加
if self.features is None:
self.addFeature(x, y)
return
# 探索半径(pixel)
radius = 5
# 既存の特徴点が近傍にあるか探索
index = self.getFeatureIndex(x, y, radius)
# クリックされた近傍に既存の特徴点があるので既存の特徴点を削除する
if index >= 0:
self.features = np.delete(self.features, index, 0)
self.status = np.delete(self.status, index, 0)
# クリックされた近傍に既存の特徴点がないので新規に特徴点を追加する
else:
self.addFeature(x, y)
return
# 指定した半径内にある既存の特徴点のインデックスを1つ取得する
# 指定した半径内に特徴点がない場合 index = -1 を応答
def getFeatureIndex(self, x, y, radius):
index = -1
# 特徴点が1つも登録されていない
if self.features is None:
return index
max_r2 = radius ** 2
index = 0
for point in self.features:
dx = x - point[0][0]
dy = y - point[0][1]
r2 = dx ** 2 + dy ** 2
if r2 <= max_r2:
# この特徴点は指定された半径内
return index
else:
# この特徴点は指定された半径外
index += 1
# 全ての特徴点が指定された半径の外側にある
return -1
# 特徴点を新規に追加する
def addFeature(self, x, y):
# 特徴点が未登録
if self.features is None:
# ndarrayの作成し特徴点の座標を登録
self.features = np.array([[[x, y]]], np.float32)
self.status = np.array([1])
# 特徴点を高精度化
cv2.cornerSubPix(self.gray_next, self.features, (10, 10), (-1, -1), CRITERIA)
# 特徴点の最大登録個数をオーバー
elif len(self.features) >= MAX_FEATURE_NUM:
print("max feature num over: " + str(MAX_FEATURE_NUM))
# 特徴点を追加登録
else:
# 既存のndarrayの最後に特徴点の座標を追加
self.features = np.append(self.features, [[[x, y]]], axis = 0).astype(np.float32)
self.status = np.append(self.status, 1)
# 特徴点を高精度化
cv2.cornerSubPix(self.gray_next, self.features, (10, 10), (-1, -1), CRITERIA)
# 有効な特徴点のみ残す
def refreshFeatures(self):
# 特徴点が未登録
if self.features is None:
return
# 全statusをチェックする
i = 0
while i < len(self.features):
# 特徴点として認識できず
if self.status[i] == 0:
# 既存のndarrayから削除
self.features = np.delete(self.features, i, 0)
self.status = np.delete(self.status, i, 0)
i -= 1
i += 1
if __name__ == '__main__':
Motion().run()
Anaconda 5.2 / Python 3.6.1 / OpenCV3.4.1で動作確認しました。
以降からの説明は「ソフトウェア設計の勉強に関する内容」なので、一度ソースコードをコピーして、ソースコードを別ウィンドウに表示させて、本記事と見比べながら学習を進めると効果的です(*・ω・)ノ♪
スポンサーリンク Animal_Cam.pyのポイント参考ソースコードと同じ部分は説明を割愛し、改造(追記)した部分のみ説明します。
【変更点】
(Gitでソフトをバージョン管理すると変更点が簡単に確認できるけど、Gitがよく分からない人のために、今回は手書きしました。Gitってツールがあることは覚えておいてね!)
➎状態遷移図の実装 以外は、そんなに難しくないと思います。➎については少々複雑だったので、状態遷移図を書いてから実装しました。状態遷移図を見せる前に…振る舞いについて少し勉強しましょう(*・ω・)ノ♪
システム(ソフトウェア)の振る舞いについて今回に限らずソフトウェアの振る舞い(処理の流れ)を検討するとき、【行動ベース】か【状態ベース】で考えると”スッキリ”します。
例えば、以下のような『ボタンの色に合わせてライトが点灯するシステム』を作ったとします。
青⇒黄⇒赤の順に”自動でライトを点灯”させたい場合、【行動ベース】と【状態ベース】で振る舞いの考え方が変わってきます↓
【行動ベース】
となり、システム(ソフトウェア)の振る舞いが行動(アクション)により変化すると考えます。これを表現するのに使うモデル図がフローチャートやアクティビティ図です。
【状態ベース】
となり、システムの振る舞いが状態(ステート)により変化すると考えます。これを表現するのに使うモデル図が状態遷移図やステートマシン図です。
Animal_Camの振る舞い(状態遷移図)話を戻して、Animal_Camの状態遷移図を示します。
❶~➎を繰り返す。キーボードの「esc」を押すと、どの状態でもシステムを強制終了させます。
(SaveVidのみ「終了の◎」と接続していますが、本当は全ての状態と◎を接続するのが正解です。ただし、矢印だらけで振る舞いが分かりにくいと、モデル図の意味がなく、実装する人が困るので、今回は「上図+言葉の補足」にしました。)
モデル図の”モデル”とは”本物”に似せたものという意味(例.プラモデル)で、ソフトウェア開発でいうモデル図とは以下の通りです。
今回の開発はスピード重視なので、ソフトウェア構造(クラス図)の作りこみはせず、振る舞い図(状態遷移図)のみ作成しました。
ソフトウェアの振る舞い設計(検討)について【状態ベース】と【行動ベース】どちらで振る舞いを考えるとスマートか?については、開発するソフトウェア(システム)次第ですが…
今回の場合は、「マウスクリック」・「シャッターを切る」という行動で考えるより、「録画中(SaveVid)」という状態で考えた方がスマートだと考えました。
行動のみで考えると、シャッターを切る瞬間は把握できるけど、録画を終了したタイミングがわかりにくい。
この状態遷移図(モデル図)に基づき以下のコードを実装しました。
❷コード6~9行目:システムの状態を定義
➎コード93~132行目:状態遷移図の実装
状態遷移図の実装ポイントは以下の通りです。
※pythonなどswich文が書けない場合はif文で代用する
状態遷移図などソフトウェアのモデル図を書く作業を『ソフトウェア設計』と呼び、モデル図…言い換えれば、設計図に基づきソースコードを書く作業を『コーディング(実装)』と呼びます。(設計図なしでコーディングする場合もあります。)
「設計はできるけどコーディングができない人」や「コーディングはできるけど設計ができない人」など色んな人がいますが、各チームメンバーの長所/弱点を考慮して、上手に仕事する現場が多いと思います。
ただし…設計・コーディング両方できるとカッコイイので…
はやぶさ
本記事をきっかけに”状態遷移図の書き方”と”その実装方法”だけでも覚えてくれると嬉しいなぁ
今回はカメラシステムだけど、ロボットなどのソフトウェア開発でも使えるテクニックなので、覚えておいて損はないと思いますよ!
Animal_Cam.pyの試験(使い方含む)完成したソフトが上手く動作するか試験します。
”Animal_Cam.py”に対する入力インターフェース(キーボード・マウス)の操作は参考ソースコードと同じでなので割愛し、追加した機能について説明します。
以下 試験手順
”くるる”の前に定点カメラを設置(私はノートPC内蔵カメラを使用しました)
ターミナルから以下のコマンドで”Animal_Cam.py”を起動
python Animal_Cam.py
「motion」と書かれたウィンドウ内の”くるる”の頭をマウス左クリックし、黄色い点が付いたことを確認する。
ターミナルの表示が「State:Wait」から「State:Ready」に変わった(状態が遷移した)ことを確認後…4時間ほど昼寝して待ちます。
私が寝ている間に、くるるが”すさー”すると「State:Wait」が「State:SaveVid」に状態遷移し、Animal_Camが録画を開始します。(Visual Studio Codeのターミナルです)
録画中は”くるる”が何をしても25秒間の動画ファイルを生成します。
Animal_Cam.pyと同じ階層に”output_vid”というフォルダを作ってください。そこに動画ファイルが保存されます。(この作業は最初の1回だけで大丈夫です)
目が覚めたらキーボードの「escキー」を押してAnimal_Camを終了させ、ニヤニヤしながら動画ファイルを確認します(・∀・)ニヤニヤ
Visual Studio CodeからAnacondaのターミナルを使う方法が気になった人は以下の記事を確認!
【拡張機能未使用】Visual Studio CodeのターミナルからAnacondaを使うこんにちわ!”Visual Studio Code”と”Anaconda”ヘビーユーザーの”はやぶさ”です! 日々”Visual ...
Animal_Cam.pyの改良実は 1回目の昼寝1回目の試験では、動画ファイルを大量に生成してしまい、かつ”スサー”は撮れていませんでした(´・ω・)
開発機能『➌指定座標のy方向の移動量を算出』の実装はコード102~105行目で、当初は”くるる”の頭がy方向+5pixel移動したらシャッターを切るという設定でした。
しかし、これだと感度が良すぎて、”スサー”以外の小さな動きにも反応してしまいました。
なので、y方向+8pixel移動したらシャッターを切るように105行目のコードを修正!
if fy_diff >= 8.0:
この”8.0”というパラメータを決定するためにも、簡単な試験を実施してました。
以下 パラメータ調整試験の手順
コード106~109行目で移動量などのパラメータをターミナルに表示させ、映像を見ながら、微調整
また、コード119行目が「SaveVid状態」に遷移させるコードなのですが、パラメータ調整試験の最中は録画状態に遷移してほしくないので、この部分をコメントアウト
# state = State.SaveVid.value
これでずっと「Ready状態」をキープできます。
きっちり『状態遷移図を設計⇒実装』という流れでソフトウェア開発を実施すれば、ある状態だけテストするなども簡単に実施できます。
Animal_Cam.py完成!普段はほとんど動かないフクロウ”くるる”の動く映像だけが撮れる奇跡のカメラができました!
多数撮れたものから、希少映像をピックアップして大公開!
【タイトル:スサーからのエンジェル!!】
くるる
”スサー”だけじゃなくて”エンジェルポーズ”まで撮れた!”はやぶー”ありがとう!!
あの両羽を伸ばす行動は”エンジェルポーズ”というそうです(鳥業界の常識!)
大喜びで動画を何度も再生する”くるる”マジ天使!!
【タイトル:ダンス!ダンス!ダンス!】
くるる
これは遠くの空にカラスが見えたから、警戒してるの!
フクロウは眼も耳も良く、危険予知を怠りません!それにしても、すごい遠くのカラス・ぬいぐるみ・飛行機にも反応するので、”くるる”はフクロウの中でも”ビビり”なのかも(?)
くるる
”はやぶー”本当にありがとう!このカメラを『”スサー”カメラ』と名付けよう!!
…え?『動物の行動観測カメラ』か『録画機能付き物体追跡カメラ』とかにしようかと…
まぁ名前なんて、なんでも良いか!今回は『動物の行動観測用』として、本ソフトを開発しましたが、様々な用途に使えると考えています。なので…色々と遊んでみて下さい!
また、『(移動量や方向などの)パラメータ変更』・『状態の追加』などの改良を行い…
Animal_Cam.pyをベースに自分オリジナルのカメラを作ったよ!
という人が現れたら最高に嬉しいです(*・ω・)ノ♪
まとめ長文読解お疲れさまでした。本記事を最後まで読んでくれた人は以下のことを学べたと思います。
❶については現場によって開発手法が変わるので、一例だと思ってくださいな。
また、今回の開発期間は3日間(内訳:調査/検討1日・設計/実装1日・試験/改良1日)で、費用も発生しないため、スケージュールはあってないようなものでした。
本来なら、ここに費用・日程・投入する人数などの工数を計画してから、開発作業にとりかかるのですが…
本記事では、スケジュールに関する説明を割愛しました。ただし、大事なことなので興味のある人は『開発手法』を勉強してみてください。(基本情報技術者試験にも出ますよ)
本記事は『ソフトウェア開発の流れを雰囲気だけでも伝えたい!』という想いで書きました。チュートリアルの題材は『”スサー”カメラ』じゃなくても良かったけど…自分の好きなものじゃないと熱量たっぷりの記事を書けない気がしたので、私の好きな題材を選びました!笑
本記事を読んで…
という人が少しでもいたら嬉しいなぁ(*・ω・)ノ♪
はやぶさ
(完)
おまけ -メッセージとおすすめの書籍-時間に余裕のある人は読んでみてね↓
メッセージ”くるる”ちゃん 本当に何度も”スサー”動画見てるよ…楽しいのかな?
そんな可愛い”くるる”の頭を撫でると動画を見るのを止めて喋りだした
くるる
はい!仕事ではバリバリ設計図(モデル図)書いてますᕦ(ò_óˇ)ᕤ
まぁプライベートでは設計しないで、ちゃちゃっとソフト作ることが多いので”くるる”が知らなくても無理はない。
ただ、ちょっと複雑なアルゴリズムになると今回のように振る舞い(フローチャートや状態遷移図)を書くことがあります。
「開発手法」・「ソフトウェア設計」・「実装(プログラミング)」は、どれも本当に重要かつ内容が濃いため、各項目を説明した”良質な記事”や”書籍”は沢山あります。
ただ、少し内容が薄くても3項目をコンパクトにまとまった記事が書けないかなぁと思い、本記事【ソフトウェア開発入門】のチュートリアルを書きました。
長文だし勉強なので、眠くなる人もいると思い、飽きないような文章にしたつもり…
本記事の内容だけでは、全然足りないことは重々承知していますが、参考になると嬉しいなぁ
プログラミング言語の修得だけでなく、ソフトウェア設計や開発手法にも興味を持ってくれる人が増えると嬉しいなぁ(*・ω・)ノ♪
くるる
くるるは今日も良い子でした!笑
おすすめの書籍うずうず…”くるる”が羽毛を揺れしながら呟く
くるる
ソフトウェア設計をもっと勉強したい!おすすめの本教えて!
はい!「もっと勉強したい!」というモチベーションの高い人のために以下の本を紹介!
UML徹底活用本記事では、状態遷移図しか紹介できませんでしたが、その他のモデル図(ソフトウェア設計図)についても丁寧に説明している良本です。図解も多いので、文字だらけの説明資料が苦手な人にもオススメできます。ソフトウェア設計図について学ぶなら、こちらの本が一押しです。
組込みソフトウェア開発のための構造化モデリングソフトウェア設計手法には様々なものがあり、組み込みの現場だと『構造化モデリング』という設計手法を採用することがあります。この本は「話題沸騰ポット」の開発を題材に『構造化モデリング』について説明する良本です。
組込みソフトウェア開発のための オブジェクト指向モデリング上の本と同じシリーズの本です。この本では『オブジェクト指向』という設計手法について説明しています。上の本と同様に、「話題沸騰ポット」の開発を題材に『オブジェクト指向』について説明する良本です。『オブジェクト指向言語』なんて呼ばれるプログラミング言語もあります。組み込み現場はもちろん、その他の現場でも使える一冊です。
C言語は歴史あるプログラミング言語ですが『オブジェクト指向』には向いていない・修得が難しいという理由から初心者から嫌われている印象…。しかし、現場ではC言語がバリバリ現役なところも多いです。『C言語だってモダンなプログラミングができるぜぇ』を説明してくれる良本。本記事の状態遷移図の実装では、この本が大変参考になりました。
プログラミング言語を修得したら、次はソフトウェア設計手法を修得するのはいかがですか?設計スキルを修得して、設計も実装もできるカッコイイ技術者を目指そう!
(完)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4