2015年12月27日日曜日

C++をマスターする方法

以前の記事で
「過去社内で、C++を使っているプロジェクトを横目で見ていたが、習得するためには血反吐を吐くような厳しいOJTを乗り越えなければならないイメージがあった。個人的にも何度かC++ の勉強をトライしたことがあるが失敗に終わっている。あれから大分たったので、多少は状況は改善されているんじゃないかという望みももっていたが、ネット 上で調べると今でも相変わらずのようだ。仕事で仕方なく覚えるのでも困難なものを趣味で覚える場合、時間不足という制約も追加されるので、まず不可能だ。 しかしながら、100人に一人になるためには、なにかしら困難のあるものをやり遂げる必要があるので安易にできないと言うべきではない。ただし、C++を マスターするには根性論では無理なので、何か作戦が必要なのだ。たとえばC++を使うような社内のプロジェクトに加入するとか。(以下略)」
と書いたが、最近仕事でC++の物件をやったのでその際に、もっとこう進めればよかった
と感じたことを書き残しておこう。

自分が最近やったC++の物件も大変な仕事で、残業など体力で乗り切った面も多い。
以前C++を独習したとき大変だった点は、
①オブジェクト指向の機能が複雑で覚えるのが大変。
②しかもウインドウを制御をする仕組みが難しい。OSから受信したメッセージを処理するとか。
③MFCをおぼえるのが大変(MFCの仕様が必ずしも適切でないことが関係あり)
とどめに、DRAWイベントを受信したら、アプリケーションの再描画を自分でやらなければならない。ということがわかって、そんなのやってられるか!!と腹を立ててしまったのだった。


上記を今回の自分の仕事と対比してみると、
>①オブジェクト指向の機能が複雑で覚えるのが大変。
・これは事前に自習しておくしかない。C++を独学するための本は最近はたくさん出ているのでできないことではない。

>②しかもウインドウを制御をする仕組みが難しい。OSから受信したメッセージを処理するとか。
>③MFCをおぼえるのが大変(MFCの仕様が必ずしも適切でないことが関係あり)
>とどめに、DRAWイベントを受信したら、アプリケーションの再描画を自分でやらなければならない。
>ということがわかって、そんなのやってられるか!!と腹を立ててしまったのだった。
・これについては最近のC++は.NET FRAME WORK対応になっていてソフトでOSが送信したメッセージを処理しなくてもよいし、MFCも覚えなくてよくなっていた。
しかしながら.NETの機能を解説している本は少なく、ネット頼みになってしまったが、結局みつかるサンプルはc#のものばかりでc++ではそのまま使用することはできず苦労した。

また、VisualStudioを使い慣れていないことと、VisualStudio自身に不具合が多いことにも本当に困った。
以上のことから、C++をマスターする方法はこんなだろうかと思う。

【C++をマスターする方法】

①まずC言語をマスターする。
もともとC++はCの上位互換だった(今は厳密には違う)のでこれが第一関門となるだろう。今となってはCは必ずしもメジャーな言語ではないのでこれは困難かもしれない。

②C→C++で拡張されたオブジェクト指向の文法的ついても勉強しておく。
VisualStudioのC++を用いコンソールアプリケーションみたいなものを作ってもよい。上でも述べたように、今なら解説された本もたくさんあるのでできなくないはずだ。 ただしここで使う本は、あくまでもC++の文法的な部分に特化したものが良く、一冊で文法からVisualStudioの使い方まで網羅したものは結局解説不足で役に立たないこと多いように思う。

③Visual Studioを使いC#をマスターする。
なぜここでVisualStudioでC++ を使わず、C#かというと、C++は難しいので独学でマスターすることが困難だからである。VisualStudioの使い方を解説した本は少なく、内容は難しい上不具合も多い。不具合が発生した場合の対策に習熟しておく必要がある。また.NET FRAMEWORKの使い方もマスターする必要があるが、.それらはC++でプログラムを作成中に並行してやることは難い。.NETはネット上に解説やサンプルが多くあるが、C#かVBのものが多く、ズバリC++のものは少ない。C++に詳しい人に.NETの質問をしにいくと、「C#の.NETでできることはC++でもできる」といわれることが多く、C#の記事をもとにC++でのコーディング方法を自力で読み替える必要があり、事前にC#をやっとけば良かったと思うことが多かった。またオブジェクト指向の考え方はC#とC++で通じるものがある。

これに対しC#は独学でもある程度マスターできVisualStudioの使い方が解説された本は多い。上で述べたように.NETの疑問点もネット上で簡単に調べられる。このため、回り道のように思えてもC#をマスターしておいたほうが良い。

これを省いていきなり実務でC++をやったら血反吐を吐くことになるだろう。小さなプログラムでよいから、いろんな種類のソフトをたくさん作って環境に慣れておくのだ。またVisual StuioではCやVBも使えるが、Cで.NETを使えるかどうかは良く知らないし、いまからVisualBasicをやる意義があるかどうかもわからないのでC#が良いと思う。

④C#をマスターし自由にプログラムが組める段階に達したら周囲に周知する。

⑤C++で開発をしているチームに加わり作業をする。
今までもさんざん知識を蓄積してきただろうがそれでもわからないことは多いと思う。C++向けに技術解説した本は少ないので、おそらくネット上で調査することが多いだろう。.NETの場合はC#のサンプルが多いかもしれないが、自力でC++に読み替えて使う。また開発チームの人に質問できる体制を強いておく。そして結局最後は仕事でぶっ倒れるぐらいまでC++を使い込んで習得する。


こんな流れだろうか。

こうしてみると、誰にでもできる作業ではないなぁと実感するし不人気なのも納得いく。

というわけで私も2016年は暇があればC#をがんばるよ。

2015年12月26日土曜日

AIや海外に負けませんように!!

最近、あと数十年もすると人間はAIやロボットに負けて大半が失職するという話をよくきく。

一言で言えば、将来、ルーチンワークはAIに置き換わってしまいクリエイティブな仕事をしていない人は失職する。また、AIに変わらなくとも、クラウドや海外での開発に負ける可能性もあるということだ。このようなことから「ルーチンワークじゃない仕事をする」が自分的な合言葉になってきている。

「あと20年でなくなる50の仕事」の中には、AIやロボットに負けてなくなる仕事のことがたくさん書かれていて、その中には弁護士もやばいとあったので真っ青だったが、プログラマーはなくならないだろうとのことだったのでホッとした。しかし下記のような記述があった

かつて優秀で高性能かつ個別企業向けにカスタマイズされていたソフトウエアがパッケージとして販売されユーザはこれを高額で購入し自社システムに導入していたが、クラウドの普及により、高額なパッケージソフトを購入しなくともユーザが必要なサービスだけをこわけにして利用可能になり、個別ソフト作成のためのSIerは不要となるかもしれない。 

これ、業務系ソフトの話?別な本にも同様なことが書かれていたのを読んだことがある。 自分は業務系ソフトじゃなくてよかった・・とおもってしまった。同書ではさらに、

ソフトウエアの開発者は将来的にもいなくなることはないだろう。現在でもたりないとされているし、ソフトの重要性がたかまれば、さらに必要とされるかもしれない。
しかし今のような形で存在し続けるかは疑問だ。今後、多くのシステムがクラウドに移行して企業が情報システムを自社で開発保有することが少なくなれば、それに関係するSIerは減って行き、日本だけで生き残ることはむずかしくなるかもしれない。
顧客と話ができて、それをふまえたアーキテクチャをつくることのできる一部の人を除けばプログラマーが国内にいる必要はない。海外のプログラマーたちとは開発プロジェクト管理もクラウド上のシステムで共有することができるのだがら。

システムのプログラムを請け負う仕事がへっていったとしても、自らのシステムを構築するという仕事は必須であり、プログラマー自体の需要は高いままだろう。しかし、求められるアプリケーションや言語の変化の中、生き残れるのは最上級のスキルを持っていて常に変化に対応できるプログラマーに限られる、ともいえるだろう

といった記述もあった。もっとショッキングなかこともたくさんかかれていたが、ここでは割愛する。常に変化に対応できるようにするには、新しいソフトが出るたびにこちらも負けずに覚えるというイタチゴッコなので大変な作業ではある。それでもAIやロボットが相手ではなく、人対人の勝負なのでまだ救いようがある。よって、顧客と話ができて、それをふまえたアーキテクチャをつくることのできる技術者であり続けることを目標にしよう。