はじめに
先日まで新卒社員向けの研修を行っていました。グループワークをやらせている間暇だったので(ぉぃ)、「どうしたら、書籍等でプログラミング言語学びました!な段階から次のステップに進めるか」を考えていました。
以下、研修中の出来事も踏まえて所見を述べます。研修の題材がC言語とArduino(組み込みシステム)だったので例に偏りがありますがそこそこ一般化しているはずです。
データの構造化
グループワークのお題は「Arduino使って何かおもしろいもの作れ」です。
おもしろいものと言われると大体ゲームを作ります。その際、「自分のHP、自分の残弾、敵のHP、敵の残弾、・・・」
ここで、「あれ?HPと残弾まとめられるな」と構造体を作ろうと思った人は合格。こちらが「データの構造考えて、ちゃんと設計書に書いてね」と言っても結構な数がべたに「構造化してない」変数を羅列したプログラムを書きます。
モジュール化(ファイル分割)
バージョン管理システム導入してない理由なんでだっけ?まあそれはともかく、「複数人でプログラムを作る」というのに、「それぞれが書いたコードを一つのファイルにマージ」するチームがいます。ここ数年同じようなグループワークをしていますが大体毎年います。
これはつまり、処理を意味のあるまとまりごとに分けるモジュール化の概念がないということだと思います。よく思うとモジュール分割はカリキュラムに入ってない気がしますが(ぉぃ
言語機能の使い方
プログラミング言語の研修をしていると鉄板で聞かれる質問は「これ(言語機能)って実務でどのように使われるのですか?」です。
答えも鉄板で「無茶苦茶使う。だが今の君では具体的な使用例を説明しても理解できん(と、直接的には言いませんがw)。だからとりあえずこんなものがあるってだけ覚えてくれ」と言うのですが大体納得されません。
で、「自分でシステム作れ」と言うと、「やり方がわからない・・・」という状況になることが多いです。以下に例を示します。
ビット演算
組み込みではビット操作の理解は必須です。グループワークで使っていた機材で言うとLCD(HD44780互換)をドット単位で制御するにはビットをシフトしたりアンドしたりが必要になります。
暇だったので私が「ドット単位でキャラをスクロールするサンプル」を作りましたがw、「こういうことをしたい」「こんな処理をすればいい」「この言語で言うとこう書けばいい」という思考の流れと実装力を身に付けることができれば初心者は脱出だと思います。
ポインタとはなんなのかを理解しているか
受講生から呼ばれたので行ってみたところ、「ゲームを一回終えてタイトルに戻るとキャラ表示がおかしくなる」とのことでした。とりあえずゲームのフローに沿ってプログラムを読み進めていくと、
recvMsg(&id); // 実際のコードではありません
のように書くべきところを
recvMsg(0x106); // 待ち受けるID書いてた
と書いていたため、ArduinoのRAMは0x100から始まる&そこにキャラのドットパターンがあるというコンボでメモリ内容が破壊されていました。
APIの使い方が間違っていたのが原因ですが、「何故かおかしくなる」というときに「メモリ内容が変になっているのでは?」という推論とそれに沿った調査ができるとだいぶ上級者かなと思います。
また、別のグループではmemcpyにアドレス渡す時に
memcpy(data[2], value, 2); // 正しくはmemcpy(&data[2], value, 2);
のように書いており1、「アドレスとはなんなのか」はやはり初心者の方には難しいのだなと思いました。
ポインタは一回メモリをぶっ壊したらよくわかるというのが持論なわけですがw
おわりに
以上、「プログラミング言語習った」から、「プログラム中級者、上級者」になるにはどのようなことが必要かを事例ベースで述べてきました。まとめると以下のようになります。どの言語でも大体当てはまることかなと思います。
- データの構造を考える
- モジュール構造を考える
- 言語機能(ライブラリ含む)を一通り把握していて適用できる
最後に、「じゃあどうやったらこれが身に付くのか」という質問に対する回答。
「優秀なソフトのコードを読め。そして感じろ」
-
Arduinoはデフォルトで「警告オフ」なので「型がおかしい」ワーニングが表示されません。 ↩