先生からの依頼で大学生が作る制御プログラムの参考となるサンプルプログラムを作っています。
通信回線を経由してロボットを動かすプログラムで、開発環境が大嫌いなVisual StudioとCPPなのです。
多くの大学では、Windows上で動くプログラムならVisual Studio & C++が基本という信仰がまだまだ残っているようで、ロボット制御でも、学生はVisual Studio+CPPで、プログラミング学習をしています。
Visual Studioを使う話など、他からの依頼なら頭からお断りする話なのですが、お世話になっている先生で学生もその環境しかわからないということなので学生とやりとりをしながら短いサンプルプログラムを作っています。
Visual Studio と C++は、教育分野の癌
その過程で痛感したのはVisualStudioとC++のせいで学生の学ぶ機会が、いかに浪費されているかということです。
Visual Studioプロジェクトの複雑さが癌
Visual Studioで新規プロジェクトを作ろうとすると、多くのプロジェクト形式が表示されます。
言語をC++だけに絞ってもコンソール、GUI、NETなど、初心者はどれを選んだらよいものか戸惑います。
選択した新規プロジェクトでゼロからプログラムを書いていくなら問題は発生しませんが、プログラミングに不慣れな学生の場合、どこかで見つけてきたサンプルプログラムを切り貼りしようとすると、たちまち意味不明なエラーが発生して途方に暮れることになります。
テキストのコード変換の複雑さが癌
ロボット制御ではLANやシリアル回線を使ったPCとロボットとの通信に関する理解が不可欠な要素です。
制御プログラムを学び始めた学生は、PCプログラムの変数と通信ラインを流れるデータを区別して考え、データの変換をどのようにプログラムするか良いかを考えるところから始める必要があります。
昔、通信回線が低速だった頃は数値を送るときに高速化のために、バイナリデータをそのまま流そうとして様々なプロトコルが考え出されました。
通信回線が高速になった今では、殆どの場合数値を1文字1バイトのASCII文字列(=char配列)にして送るようになっています。
数値を文字列で表現するのは解りやすくて良いのですが、入門編ではprintfではなくこれがC++の格好いい書き方ですよとばかりに、ストリームを使ったサンプルばかりが紹介されるようになりました。
#include <iostream> using namespace std; int main() { cout << "Hello iostream" << endl; return 0; }
ストリームで使われる文字列は多言語対応のためchar配列と互換性がないのでコンソール出力したデータを通信回線に送ろうとするとエラーが発生して、初心者を悩ませることになります。
解決のためには、C++の標準文字列strをchar配列に変換すれば良いのですが、C++のクラスが言語の構造を意味もなく隠蔽しているせいで、よほど頭が回る学生でない限り挫折してしまうことになります。
Visual Studio と C++は既に死につつある無駄に複雑な言語パラダイムで学生の足を縛るだけ
ほんの10年前までは、「Visual Studio と C++ でGUIプログラムを書けるのが真のプログラマだ」と勘違いの主張をする人が結構いました。
私や会社の仲間は、Microsoftに無駄な忠誠を誓うつもりがないので Visual Studio & C++ より一桁効率よくGUIアプリケーションの開発が出来るDelphiやC++ Builderを使いましたが、それらの開発環境も既に歴史の波に飲み込まれつつあり、マルチプラットホームを対象としたオープンソースの開発環境が主流になりつつあります。
プログラム資産として大切なのは、言語構造ではなく高度な処理を簡単に使えるようにしてくれるライブラリです。
今では名前しか聞くことがなくなったFORTRANで書いた膨大なプログラムも他の言語に変換あるいは他言語でラッピングしたライブラリとして今も活躍しています。
C++は比較的新しい言語なのでさらに多くの有用なC++で記述されたプログラムがライブラリとして活躍していますが、C++は初心者が学んでためになる言語ではなくなりつつあります。
そのようなC++と、無駄に複雑なVisual Studioを学生に学ばせて、ただでさえ優秀なプログラマが不足している日本で、活躍するかもしれない若い芽を枯れさせてしまうのは,実にもったいないことだと思うのです。