プログラマというお仕事

プログラマは職人だ!プロならもっと腕を磨け。
世の中ヘボいプログラマが多すぎる。
少々過激な意見でも言っちゃうよ。

プログラマ

デキるプログラマとは?

ブログネタ
「できるヤツ」ってどんな人? に参加中!

そこそこ経験も積んで、なんとか一人前にプログラムも書けるようになってきた。そんな3年から5年程度のキャリアのプログラマが実は一番難しかったりします。何が難しいって、その後の育て方です。
このくらいの時期にひとつターニングポイントが来るような気がします。

まずは自身過剰タイプ。自分はもう一人前だ。どんなプログラムだって自分だけの力で書けるし、もう人から教わる事なんて大して無いよ。むしろこれからは俺が新人君を指導してやるぜ。
言うまでもなく、こういう人はこの時点で成長が止まります。今後新しい技術をキャッチアップしていくのは難しいでしょう。プライドが高く生意気な性格なので周りとのつまらないトラブルも多いですね。

しかし彼の場合、モチベーションという意味では決して低いわけではないんです。
もっとタチ悪いのは、やる気の無い自身過剰タイプです。
自分はもう一人前だ。どんなプログラムだって自分だけの力で書けるよ。ここまでは前者の彼と同じなんですが。
だからもうあんまり新しい事とか覚えるのもしんどいし、普通に仕事してれば給料貰えるわけだし。勉強とかやる必要なくない? あ〜あ、他にもっと給料高くて楽な仕事ないかなぁ...

最悪なのはやる気の無い言い訳タイプ
日々勉強して新しい技術を身に付けようという意識が無いのは前者と同じ。さらにはそれを他人のせいにして自分を正当化しようとするところが、怠け者なのを自認している前者の彼よりタチ悪いです。
私「VBしかできないんじゃこの先駄目でしょ。そろそろ他の言語も勉強してみたら?」
彼「でも仕事が来なきゃなかなか勉強できませんよ。ならそういう仕事ください。」
私「仕事が来てから勉強始めたんじゃ遅いでしょ。それじゃひとまず課題でも出すからやってみたら。」
また別の時
彼「給料いつになったら上がるんですか。」
私「君のスキルがどれだけあって、それが会社にどのくらい貢献できてるかをアピールしてくれれば上がるよ。」
彼「そんなのまず会社が評価してくれるべきじゃないですか!」
私「結果を出せてるなら評価しますけどね。ところで半年前のあの課題、どんな具合?」
彼「・・・(しばし沈黙)・・・やっぱ仕事じゃないと思うとやる気起きませんよねえ。やっても残業代とか出ないんでしょ!?」
こういう人は、こっちが良かれと思って待遇や勤務環境などを考えてあげても、それに甘えるだけで生産性アップの方向には向かいません。加えて自分の権利や都合はキッチリ主張してきます。

自分にある程度自信を持ちつつも常に謙虚である。上には上がいる事をちゃんと知っている。
新しい知識を吸収する事に貪欲だ。盗める人間からは何でも盗んでやると思っている。
日々努力し勉強している。というか本人には努力という意識もない場合が多い。
あれこれ主張や言い訳しない。給料増やせと言う前に結果を出して上司を納得させる。
俺に任せときゃ間違いない、とは言わない。彼に任せれば間違いないね、と他人に言わせる。
あとは黙ってても勝手に給料上がってる。

こういう人がいいプログラマになると思うんですが、どうでしょう。

やさしいJAVA?

ブログネタ
Javaの学習法 に参加中!

初心者がプログラムを独学で覚えるのは難しいと思います。失敗すると間違った方法で勉強を進めてしまい、スキルアップのベクトルを誤ってしまう危険がかなり高いと感じています。プログラミングを覚え始める最初の1年目で方向を誤るとその後の進歩に大きなマイナスになります。

独学で本を読んで勉強した経験のある初心者以上,中級者未満の人に対して、現在プログラミングスクールでJAVAを教えています。やはり勉強の方法を間違えてしまっていて、言語の文法の表面をなぞった程度の知識しかない人です。『まず本から得た知識はいったん全て忘れるように』と言うのが最初の講義でした。私の教え方は本に書いてある事とは違う方向からの説明なので変な先入観はかえって邪魔です。特にオブジェクト指向の考え方については、変な予備知識があるほど間違って理解されてしまいがちです。

実は現役のプロのプログラマの中でもオブジェクト指向を真に理解し実践できる人はほんのわずかです。その理由を考えてみると、オブジェクト指向以前の古いプログラミングスタイルの知識が邪魔をして、技術のパラダイムシフトに着いて行くのを難しくしているのではないかと思います。
このような古い考え方から抜け出せない技術者が寄ってたかって設計したシステムが旧態依然のひどいものである例を、私は今までいくつも見てきました。その話もいずれ書きたいと思います。

話を戻して、この受講生が独学に使ったという本を買ってきて参考までに読んでみました。割と有名な本らしく、ネット上などでも良い評判が多く見られました。まぁ、あまり期待はしていませんでしたが、これはひどい...
世の中のプログラミング初心者は本当にこの本を読んで『やさしい』と感じるんでしょうか。この本を読んで本当に実用的なプログラムを書ける人がいるとしたら、その人は最初からどんな本で勉強したって出来るくらい頭のいい一部の人間に違いないです。

だって、乗り物クラスを継承して車や飛行機を作ろうだの、動物クラスから犬クラスを継承して「吼える」メソッドを呼んだら画面に「ワン」と表示されますだの、いったい何の話をしてるのやら。『それがいったい何の役に立つんだ』という部分の説明が全くないんです。
上記の『オブジェクト指向を真に理解できていないプロ』の人達にも共通する点はここです。実際の業務システムのどの場面でどのように役に立つかの説明がないまま、単に文法の仕様書を『やさしいつもり』に書き直してるだけです。東大を卒業できるほど基本的に頭がいい人ならともかく、万人が理解できる説明ではないんじゃないでしょうか。

決して特定の固有名詞を出して筆者の方たちを悪く言うつもりはありませんが、私の個人的な見解では『○○言語入門』とか『やさしい○○言語』のようなタイトルの本は決して『優しく』ありませんでした。私ならそれをもっと『易しく』教える自信があります。採算を考えずに私がプログラミングスクールを続けている理由はその一点です。

偽装請負? 二重派遣? で?

で、何が問題なの?

イヤ、もちろん法律で駄目だと決められてるんでしょう。労働者を本人の意思に反して不当に扱っちゃイカンと。確かにここ数年、悪質なケースが話題になりました。けしからんという感情を持つのはわかります。私自身も『技術者の値段』で、このような二重派遣を生業とする名ばかりのシステム開発会社を批判的に書きました。ただソフトウェア業界ではこのような形態でプログラマが現場で仕事するのは、もう何十年も前から普通に行われていた事だったりします。だから「え!?それっていけない事だったの?」というのが、大企業も含めてこの業界にいる大半の人達の正直な感想だったと思います。

わざと挑発的な書き出しにしてしまいました。もちろん駄目なもんは駄目というのはわかります。しかし私があえて誤解を恐れずに言いたいのは「法に違反している事自体が問題なのか」という点です。「何も問題ないよね?」と言いたいのではなく「問題の根本はどこですか?」と問いたいのです。

例えば偽装請負ですが、派遣の許可を持っている会社なら何も問題ないですか?それなら会社が何割マージン取ろうが、残業時間が何百時間だろうが、派遣先の社員からいわれの無い不当な扱いを受けようが構いませんか?
もしくは国会で法案が通って明日からは違法でなくなれば、今文句を言ってる人たちは、それなら無問題だと黙るんですか?

私が問題視しているのは技術者個々人の労働環境です。無茶なスケジュールを押し付けられ、徹夜や休日出勤を当然のように強制され、リリース間際の仕様変更や自分に非の無い不具合などの為に管理職連中やユーザーから責められるような事態は、会社間の契約が法に触れていたから起こった事なのでしょうか。

システム開発は家作りに似ています。私がよく言っている例え話です。大手ハウスメーカーは顧客の要望に沿って設計図面を書きます。それを元に下請けの大工や左官屋や電気工事屋に発注をして、実際に建築を始めます。この段階では大手メーカーは各下請けの仕事の進捗を管理して、顧客にその状況を伝え、問題や遅れがないか確認するのが主な仕事です。
ここで顧客であるあなたが建物の進み具合を見学しに建築現場に行ってみたら、若い大工見習いの兄ちゃんが、かったるそうにチンタラ仕事している姿を目にしました。オイオイもっと真面目にやってくれよ、と一言注意すると、その兄ちゃんは『俺は○○工務店に雇われてんだからお前に指図される筋合いはねぇ』と。そこであなたが取るべき態度は?

顧客であるあなたは、彼に対して何の文句も言う権利は無い、というのが法律です。

どんな大企業でも大きな案件の全てを常に自社の技術者だけでまかなうのは不可能です。自然と他社の技術者の応援を頼まざるを得なくなります。そのようなニーズに答える為に中小システム会社の存在価値があります。さらにその下請け一社だけでまかなえなければ協力会社にも応援を要請する事になります。そのようにして集められた技術者達は一致団結して顧客の要望に答えるべく、より良いシステムを開発する為に仕事をします。そのようなチームでは皆が仲間意識を持って同じ目標に向けて働くし、誰がどこの会社からどういう契約でやって来たかなんてどうでもいい事です。

私も業界に入ったばかりの頃は色々な現場に派遣させられました。その当時の私の頭にあったのは、いかにして自分のスキルを上げて一人前のプログラマとして成長するかという一点だけでした。会社の規模やネームバリュー、ましてや契約形態がどうのこうのなんて、現場にいる私には関係ありません。ただの素人に勉強させてくれるどころか給料まで貰えるなんて、感謝こそすれ、文句なんて出てくるはずもないです。

今となっては立場上、常駐という形態の仕事は受けたくても受けられなくなってしまいました。もう十数年も受託の仕事しかしていません。ある意味ではスケジュールや人材のアサインなどこちらの裁量で自由にできるのは楽なのですが、何と言うか刺激がないんですよね。色々な会社からやって来たプログラマ同士が切磋琢磨して開発に携わる、あの現場の緊張感というか。初めて出会う技術者の、例えばエディタを使いこなす鮮やかな手さばきに『おお〜っ』と感動するあの新鮮さを体験する機会が全く無くなってしまいました。短期間でいいから開発現場に常駐して働きたいなぁ、と懐かしく思う事があります。

違法な契約だと祭り上げて告発や問題提起をする事がいけないと言っているのではありません。というか法的には正しい事なんでしょう。そこを責めたいのではありません。むしろそんなビジネスモデルだけしかない、名ばかりのシステム開発会社はこの世から無くなって欲しいとさえ願っています。そうではなく、自分がまともな職場環境に付けないのは自分の能力不足ではなく違法な事をしてる会社のせいなんだと訴えておいて、そのくせ、じゃああなたはどんな能力を持ち合わせているのですか、という問いに対して主張できない人達の甘えの構造はどうなんだろう?という点に疑問を感じるのです。

JAVAってそんなにいい?

作ろうとしているシステムに一番いい言語は何かを決めるのはSEと呼ばれる人の仕事のひとつです。顧客の要件を分析し、開発工数やランニングコストなどを総合的に判断して最適なプラットフォームを決定します。が、そのSEがコードすら書けないようなダメ人間だと別の基準でプラットフォームを決めてしまい、その後の開発工程でやっかいな事になるケースが多々あります。別の基準とは『最近流行ってるみたいだから』という、その辺のコギャルと同程度の思考回路です。

最近は何にでもJAVAを使いたがるシステムを良く目にします。スタンドアロンで特定の端末でしか使用しない小さなプログラムなのにEXEにしないでJAVAアプレット。セキュリティが問われる情報を扱うでもなく、IT専門の部署がある訳でもないし、とにかく安価に拠点間を結んで情報共有したいというだけのニーズなのに、自前でサーバを立ててJAVAサーブレット。こんなソリューションを提案するSEの頭の中にあるのは『JAVAなら安心安全で生産性も高くて、なんだか知らんけど立派なシステムなんでしょ?』みたいな、どこで聞いたかわからないあやふやな知識だけです。
JAVAならみんな使ってるから、JAVAなら有名だから、JAVAならオブジェクト指向だから・・・だってJAVAなんだから・・・。

誤解の無いように言っておくと、私自身はJAVAは割と好きな言語なんですよ。特にオブジェクト指向は正しく使えばとても強力な考え方だと思います。しかし上記のようなヘボいシステムでは、まず間違いなくオブジェクト指向とは程遠いコードで書かれています。もっとはっきり言います。世の中の自称JAVAプログラマの95%はオブジェクト指向を知りません。かなり過激な意見だと思うでしょうが、私の経験上では決して大げさではなく実感です。

そのシステム、PHPとMySQLで良くない?
こう言うと訳知り顔の技術者(上記のヘボSEを含む)から一斉攻撃に合います。それを承知で、そんな攻撃を技術的に論破できるだけのスキルを持ち合わせた上であえて勇気を持って主張できる人って本物の技術者だと思います。
技術者はユーザーの満足の為にシステムを開発するべきです。ユーザーが良しとするならそれでいいんです。自身の知的欲求や自己満足の為であってはなりません。そういうのは趣味で好きなだけやって下さい。我々はプロなんですから。

あなたはなぜプログラムが書けるようにならないか

自分はこんなに努力している。頑張って勉強している。なのにいつまでたってもプログラムが書けるようにならない。
こんな悩みを持っている人はいないでしょうか。
プログラムを独学で勉強しようとする人は結構多くいるようです。そのような人達の大半はまずは「入門○○言語」のようなタイトルの本を探したりするところから始めるのが普通だろうと思います。

私がプログラミングを覚えた頃はコンピュータ関連の本などほとんどありませんでした。今ではどこの本屋にもプログラム言語の入門書などが並んでいるし、インターネットにもいくらでもプログラミング関連の情報が転がっています。今はいい時代だなあと感じると同時に、そのように情報が簡単に手に入ってしまう為にかえって間違った勉強の仕方をしてしまう人も多いのではないかと思います。

買ってきた入門書に載っているサンプルコードをその通りに打ち込んでみて、コンパイルして実行したら動いた!といって喜んでいる人を見かける事があります。本人は真剣に、これでプログラミングを勉強しているつもりになっています。信じられない事なのですが、こういう人が結構な割合で本当にいるんですよ。

またクラスライブラリに含まれるクラスの使い方をとにかく覚えようとする人もいます。特にListBoxとかDataGridとかのGUI部品の使い方をネットで検索して、コードをコピペして見様見真似で動かしてみるとか。ライブラリに含まれるクラスの使い方を覚える事がプログラムを覚える事だと信じているのですが、これもまた驚きです。
もっとひどいのになると、VisualStudioなどの開発ツールの使い方を一生懸命覚えようとしたりします。

あなたはこのような勉強法で『無駄に』頑張ってはいませんか?
このような勉強法では一生プログラムは書けるようにはなりません

私の頃はそもそも個人がコンピュータを所有してプログラムを書くなど考えられない時代で、プログラミングなんて本当に一部のマニアックなオタクだけの趣味でしかありませんでした。だから、とりあえず手っ取り早く動かしてみる、という事ができません。本に載っているコードをどうするかというと、とにかく読むのです。「読む」というのは、文章を読むようにサラサラっと流すのではなく、ここで何故これをやってるのか、この時どの変数がどんな値になってるのか、という事を1行1行考えながら見ていくのです。実際に動かしてみたらこう動くはずだよね、という事を自分の頭の中で確認する、つまり自分がコンピュータになってコードを擬似実行してみるという作業です。

そう!要するに我々が普段やっている机上デバッグというやつですね。
最近の若いプログラマは机上デバッグが出来ないのが多いなと感じます。実機でしかデバッグ出来ない人ですごいスキルのプログラマなんて見た事がありません。自分一人で自由に使えるマシンが目の前にあるのが当たり前の環境で育ったプログラマには仕方のない事かもしれませんが、だからこそ、誰かが勉強の仕方を教えてあげるのが非常に重要なのだと思います。

以前にも書きましたが、プログラムの勉強はそれを始める最初の1年が一番大事だと思っています。ここで方向性を間違うと後から修正が効かなくなるのは経験上はっきり言えます。
独学で勉強を始めようと思っている人は、安易に間違った勉強の仕方をしてしまう危険を知り、頑張りを正しい方向に向けるようにしてください。