Microsoft Visual C++は、プログラミング教育の癌 (2)

続、独断と偏見に満ちたアンチC++オヤジの妄言です

内容は、ただでさえ挫折しがちなプログラミング学習の現場に、時代遅れで複雑怪奇なVisual Studio と C++が大きな顔をしている、実にけしからんというお話です。

有害無益なC++の入出力データストリーム

C++入門というキーワードで検索すると、多くのサイトでcout, cinを使った例が最初に紹介されています。

(例)C++入門 – asahi-net.or.jp から

C++入門2   coutを使った出力
C++入門3   cinを使った入力
C++入門4   オブジェクト指向について
C++入門5   クラスを作ろう

学生がこれを使ったプログラムを書いて(コピペ?)行き詰っているのにつきあっていて、このcin, coutという書き方は有害無益だと思うようになりました。

cinに誤った文字列を与えると黙って処理をさぼるようになる

cinに誤ったパラメータを読ませると黙り込んで処理を流すするようになります。
学生が次のようなプログラムを書いて「処理がうまく行きません。」と質問してきました。

double xa, ya;
while (true)
{
  // データ受信
  ...
  // データ送信
  cout << "input xa ya:" << endl;
  cin >> xa
  cin >> ya;
  // xa, ya に入れたデータを送信
  ...
}

具体的には一回目は入力待ちで止まるが、次から無限ループになるという症状です。

C++に拒否反応があり知識がない私でも、デバッガで確認すればcinが反応しなくなっていることがわかり、Webで調べれば解決策もすぐ見つかるので、C++のエキスパートにとっては「なんだ、そんなこともわからないのか。」という感覚なのでしょうが、デバッグの仕方もよくわからない初心者に取ってエラーで黙りこんでしまう言語仕様は最悪です。

 変数xの型にかかわらず cin >>  x でコンソール入力した文字列の値をxに読み込めるということは、裏で値に応じた変換がおこなわれているということで、うまく働いているときは便利な書き方に見えます。

しかし上の例のようにcinを使って2つの変数にどのように値を読み込むかがわからず、変数の型もよく分かっていない初心者に cin がプログラムの基本的な書き方ですよと教えるのは間違いだと思うのです。

cin, coutはC++を格好よくみせるためだけのものではないのか?

cin はコンソール入力用の記述ですから、コマンドラインアプリケーションを書くために使うことになります。
しかし、Windowsで新しいコマンドラインアプリケーションを書くことなど殆どなく、簡単なプログラムでもウィンドウが開くGUIアプリケーションになります。

コマンドラインアプリケーションを書くとしたら入力文字列にエラーがあるときはそれに対応した処理をするのが必須であることを考えても cin など誰かが思い付きで作って実用的なアプリケーションでは使われない言語仕様が未だに初心者向け文法として大きな顔をしているだけのように思えてなりません。

実際のところ、cin cout が無いと効率的にコンソールアプリを書くことが出来ないと思って使っているベテランプログラマがいるのでしょうか。

Microsoft Visual C++は、プログラミング教育の癌(1)

続、独断と偏見に満ちたアンチC++オヤジの主張です

内容は、ただでさえ挫折しがちなプログラミング学習の現場に、時代遅れで複雑怪奇なMicrosoft Visual  C++が大きな顔をしている、実にけしからんというお話です。

スキルアップのために選ぶべきプログラミング言語

プログラムを勉強するなら、多くの人が使っている・これから使うプログラミング言語を選ぶのが鉄則です。
 出来ればこれから伸びる言語の方が、需要と供給のバランスを考えるとプログラミング技能を売り込むために有利です。

また、流行っている言語向けには便利で使いやすい開発環境が出てきますが人気のない言語の開発環境は古臭くなりサポートが無くなっていきます。
便利で使いやすい開発環境の有無は、実用上でも学ぶためにも大きな効率差となります。

世の中の流行りすたりを調べるにはグーグルトレンドが便利です。
グーグルトレンドで、どの言語が世界中で人気があるかを調べてみると次のようになります。(2004ー2019/11現在)

カテゴリはコンピュータ 家電で検索キーワードの多さのグラフです。

グーグルトレンドで見ると死んでいるMicrosoft Visual C++

C++,Python,Cはプログラミング言語で、DelphiとVisual C++は統合開発環境なので公平な比較ではありませんが、C++に対するVisual C++の人気度や同じPascalベースの開発環境DelphiとVisual C++を比較するためにどちらも表示しました。

注目すべき点は、メジャーなC++ベースのVisual C++が、マイナーなPascal言語ベースのDelphiに圧倒的な差をつけられていたことと、C++の開発環境としてVisual C++が如何に人気がないかということです。

それなのに、Visual C++がマイクロソフトのネームバリューと早くから無償版を提供していたことで、日本の教育界でいまだに多く使われていることが問題です。

 

地域を日本に絞ると次のようになっています。全ての国を対象にしたグラフに比べてPythonへの注目度が高くなっています。

 

最近5年間の傾向を見るとC言語に関する検索はほぼ横ばいで、Pythonへの関心が近年急速に高まっていることがわかります。

 

こちらは開発環境に対する人気度をしめすグラフで、教育界では全く人気のないDelphiがいまも検討していることとPythonの開発環境Pycharmの人気が徐々に高まっていることが注目されます。

Visual C++の人気がないのはGUIアプリケーションを開発するには効率が悪すぎるし、C++の開発環境としてもWindowsの都合による縛りが強すぎて使い勝手が悪すぎるためだと思われます。

Visual C++は止めてPythonを学ぶべき

スキルアップのためにプログラミングを勉強するなら、C++は止めてこれからはPythonを選ぶべきだと言えるでしょう。
少なくともVisual C++を学生に使わせて、ただでさえ少ないソフトウェアエンジニアの目を枯らす愚は避けるべきです。

 

Visual Studio と C++は、教育分野の癌

先生からの依頼で大学生が作る制御プログラムの参考となるサンプルプログラムを作っています。

通信回線を経由してロボットを動かすプログラムで、開発環境が大嫌いな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を学生に学ばせて、ただでさえ優秀なプログラマが不足している日本で、活躍するかもしれない若い芽を枯れさせてしまうのは,実にもったいないことだと思うのです。