第23話 エンジニアで生き抜くために
2010/02/02 17:30:00
最近の経済ニュースを見ていると、不況が続くのかこれから良くなるのかいまいちピンと来ない感じがまだまだします。就職・転職の状況においても同じで、エンジニアかどうかにかかわらず非常に厳しいと思います。IT自体はニーズがあるので、業界自体がすぐにどうこうというのはないでしょうが、それでもこの機会にある程度、淘汰は進むと思います。
こういう時は、人件費を減らすためにプロジェクトのメンバーを減らすことも多々あると思います。減らした状態で何とかプロジェクトを乗り切ると、今度はそれが「デフォルト」になり、減ることはあっても増えることは少なくなるでしょう。もっとも、メンバーや管理者の能力に左右されるので一概に人数で割るのも非常に乱暴ですが、仕事が減らなくても単価が安くなるのはあると思うので、経営側としてはこの機会に見直しを考えても不思議ではなく、自然なことだと言えます。
前回と前々回にも少し書きましたが、開発環境はシステムを「作る」と言う部分においては格段にイージーになっています。開発を巡る環境は「設計」→「作る」→「テスト」においては非常にシームレスになりつつあります。設計についてはある程度経験も必要でしょうが、それ以外は逆に新しい環境に馴染んだ(馴染みやすい)若手の方が生産性は上がるのではないかと思えます。後は保守だけですが、これはある程度経験が必要だとは思いますが、同じ環境(システム)を永遠に使い続けることは100%ないのと、時間的余裕は開発に比べると作りやすいため、世代交代しやすいと思います。これから先はもっと簡単になることも考えられますので、職業エンジニアの敷居は低くなるでしょうし、単価も地位も一般職並みになるかも知れません。
先々の予想は別にして、何が言いたいのかといえば、これからは若手だけでなくベテランも同じようにリストラされてしまう可能性が高いのではないか、ということです。ある程度の経験は必要でしょうが、ただ経験が長いというだけでは生き残れない時代がそこまで来ていると思うべきです。すべて若手では難しいかも知れませんが、ベテランの数を減らすことはあり得ると思います。
その上で、これからも「ソフトウェアエンジニア」を仕事としてやっていきたい人に対して「そのために考えなければならないこと」を少し書こうと思います。一般論もありますが、基本的にわたしの経験がベースになっています。これがすべてでも誰にでも当てはまるものとは限りません。そこはある程度考えてもらえれば幸いです。
■わたしはどうかと言えば……
わたしがソフトウェアエンジニア(以下、単にエンジニアと呼びます)なのは、好き嫌いではなく単に「向いている」と思うからです。経験があることもありますが、ソフトウェア開発は特別好きでもなく、嫌いでもありません。仮に今よりも「稼ぎの良い」、もしくは「やりたいことができる」仕事があれば(できれば)おそらくエンジニアには未練はないと思います。現実にはわたし個人で面倒見ているお客さんがいますので、何のかんの言ってもまだまだエンジニアであるとは思いますが。
わたし自身、実はエンジニアになりたいという願望は全然ありませんでした。将来の夢も小中学校では「漫画家」、高校では「小説家」やバンドをやっていたので、そのまま音楽関係とか。たまたま作った映画で面白さにハマり、今でも映画を作りたいという願望はあります。でも、家庭の事情で夢を追うことは難しかったので、20歳になって現実的に職業を選んでエンジニアになりました。もっとも最初はあまりソフトウェア開発が得意ではなかったのでハードウェア設計で就職しましたが、すぐにソフトウェア開発の方に配置転換されました。
でも、性格的に「向いている」ということは昔から自覚してました。それは小さいころから好奇心が旺盛で、「ラジオはなぜ声が出るのか」「カセットテープはどうして録音や再生ができるのか」「レコードはどうして音が出るのか」「なぜテレビは人が動いているのか(笑)」など、とにかく疑問を考えるガキでしたから。
結果的にテレビ以外は家のものをほぼ分解した記憶があります。テレビは当時は非常に大きくて(足がついていた)高価だったので、さすがに自粛しました(もっとも学校のテレビを分解しようとして怒られましたが)。ファミコンも買った当日に本体もコントローラーもカセットも分解しました。分解しても構造が分かる訳ではないので、そこから勉強して高校に入る頃はひと通り構造は理解していました。ですから、わたしの小学校の卒業アルバムの巻末にある「わたしの20年後の理想と現実」には、以下のように書いてあります。
理想「売れっ子漫画家になる」
現実「漫画家の才能に限界を感じてエンジニアになる」
思いきり正解です。
若いころはある程度「こうしないとダメだ!」みたいな強迫観念に近い思い込みはありましたが、今ではある程度仕事、と割り切ってやっています。あまりソフトウェアやスキルだけに固執すると進まないのと、理想が高過ぎると自分を追い詰めてしまうからです。コラムのサブタイトルに「No Plan」とありますが、あまり役割にこだわらない姿勢が長続きする秘訣かなとも思います。
■エンジニアとして生き残るための術
ソフトウェア開発は人によって「向き・不向き」や「センスの有無」は確かにあると思います。ただ、それと仕事でエンジニアになれる・なれないは関係ないと思っています。センスも才能もないよりはあった方が良いに決まっていますが、それは本人次第でカバーできると思います。基本は他の仕事と同じで「やる気」と「努力」です。
ここからは完全にわたしの経験に基づいた考えです。それが正しいかどうかは分かりませんが、参考になる部分はあると思います。先輩エンジニアのアドバイスだと思って読んでみてください。
(1)役割にこだわるな
ソフトウェア開発に転向して約1年は、ほとんどプログラムを書いたことがありませんでした。大規模プロジェクトのいろいろなグループを束ねるチームだったので、打ち合わせの段取りしたり、資料を作って配ったり、困ったことが起こったら関係各所にお願いしたり、テストするための環境を作成し……などでした。場合によっては資料のコピーのため一日中コピー機の前にいたこともあります(自動給紙、自動ソートしてくれるので、本当に見ているだけでした)。さすがに「プログラマ」になったのに、プログラムを組むことがあまりできなかったので、ある日直属の上司にかみついてしまいました。「プログラムを作らせろ!」って。胸ぐらまで掴んでしまいました。取りあえず、上司の取りなしでその場は収まりましたが、若かりし頃の一番の失敗でした。今でも思い出して反省しています。
この職場では、結局これが理由で辞めざるを得なくなりました。
今の時代、開発環境(言語)といろいろなフレームワークやライブラリのおかげでコードを書く量がけた違いに減ってます。開発するシステムにもよりますが、SE/PGという枠組みも段々曖昧になっており、どちらかといえば、単価を決めるための肩書になっている感じがします。ソフトウェアを作る=プログラマという感じもしますが、わたしはこれはナンセンスだと思っています。設計でも製造でもテストでもそれなりのスキルと経験は必要ですし、これからはどれでもOKという人でないと段々と淘汰されていく可能性もあります。
いや、こだわることができる環境ならこだわっても良いと思います。でも、例えば、今までプログラマだったのに「明日からテストチームね」といわれたり、設計だけやっていたのに別なプロジェクトでプログラム作成がメインになったり、プログラマだがいきなり設計だけになったりする可能性もあり得ます。その時にいやいやではなく、進んでやるようにして欲しいのです。
わたしは上記のいずれの例も体験しています。だからPMになった今でも設計・プログラム・テストすべてのノウハウを持っていますので、役割分担しても自分が主導になってプロジェクトを仕切ることができます。ヤバい点が出てきても、割合早めに対策して潰すことができます(最悪自分で潰せる)。そして何より自分もプログラマとして参加できます(笑)。そうやって考えるといろいろ経験するもの非常に楽しいと思いますし、どれかをやれ、と言われても対応できるのでリストラという面ではリスクは減るかも知れません(会社があれば、ですが)。以前のコラムに書きましたが、これからはどんな役割でもできるような人を求めてくる可能性が高いと思います。それはその方が「使い勝手」が良いからです。
(2)失敗を恐れるな
社風や先輩エンジニアにもよるんでしょうが、若いうちはとにかく失敗することをオススメします。絶対に失敗しろという訳ではなく、なにかする時に「これやって失敗したらどうしよう」と考えるならやってしまえ、ということです。アホみたいに何も考えずやるのはダメですが、一度や二度は失敗がないとなかなか成長しません。わたしは、20代に何回か大きい失敗をやらかして「始末書」を何度か書きました(ここでは具体的に書けませんが)。
失敗した時はまず謝罪します。その上で、どういう考えで失敗したかを考察して書き出してみます。重要な失敗なら多分始末書か顛末書を書かされると思うので、その時に書きます。大事なのは隠さないことと繰り返さないことです。ベテランだったら許されないことも、若手の時にはわりあい寛容に見てくれる場合が多いです。ソフトウェア開発の基本は「トライ アンド エラー」です。とにかく前向きにやりましょう。
わたしは若い部下には「失敗したら俺が責任取るから、とにかく何でも考えてやるように」と言うようにしています。頭の中であれこれ考えても進みませんし、やってみないと自分の糧にはなかなかなりません。当然、こっちも触ってはいけない所だけはきちんとガードして監視しますが。
(3)基礎を覚えろ
パソコンなんて今も昔も規模が異なるだけで基本は同じです。昔のパソコンがあるならそれで勉強するのも手ですが、いまなら「大人の科学 vol.24」がオススメです。4ビットマイコンが付録でついていますが、本当に基礎的なことが体験できます。
わたし自身はこの程度なら自分で設計できますが(元々それが仕事だったので)、スペックが非常に限定的なので勉強には良いと思います。
今の高級言語(この言い方もあまり最近はしませんが)とは非常にかい離しているように感じますが、突き詰めればやってることは同じなので、CPUの仕組みやレジスタ、メモリやアドレスマップなどは頭に叩き込んでおけば、後はそれを広げて行くだけです。実際はI/Oなども複雑に絡んできますが、落ち着いて考えれば多分理解できると思います。
今のCPUは非常に高性能ですが、昔のパソコンのCPUなんかは掛け算や割り算の命令がなかったのでそこから工夫が必要でした。今はあまりビット演算とか使いませんが(使う必要がないことが多いのが多分正しいでしょう)、中でどうやって動いているかが分かればソフトウェアに対する考え方もまた少し変わると思います。
(4)言語にこだわるな
プログラマのスキルは、プログラム言語ではありません。言語はあくまでもソフトウェアを動かすための方法の1つであって、すべてではありません。わたしは、プログラマのスキルは「いかに要求された条件でアルゴリズムを組み立てるか」だと思っています。細かい部分では特定の言語でしかできないこともありますが、極端な話、Javaでプログラムは組めるけどC言語では組めない、というのでは生き残ることは難しいかも知れません。アルゴリズムさえできれば後は指定された言語でコーディングするだけです。経験がないよりはあった方が良いですが、なくても努力次第でいくらでも習得は可能だと思っています。わたしも3日もあればだいたいのことは理解する自信はありますし、1週間もあればそれなりにできる自信はあります。
どんな言語にも得意・不得意な分野がありますし、またSQLのような目的に特化した言語もあります。ある程度システム設計を行うには、案件の規模や予算でどんな環境や言語で開発するかということが重要になってきますので、いろいろ経験することはそういう部分では非常にプラスになると思います。言語を中心にするのではなく、アルゴリズムを中心に据えるようにしてください。
そう思うのは、VBのようなイベント駆動型の言語での開発が多くなったことと、前項でも触れましたが、基礎的なことがあまり重要視されないからか、最近のエンジニアにはアルゴリズムを考えることがあまりうまくないのと、同期・非同期処理やマルチタスク処理の考え方がうまくできない人が多いように感じます。だからスタンドアローンで動作させた時や1つ1つの処理は動いても同時処理をさせるととたんにおかしな動きをすることが多々あります(わたしの周りだけでしょうか?)。
あまり言語に縛られてソフトウェアを考えてしまうと、逆に自分のスキルの幅を狭める結果になります。
(5)独立するか、出世を目指せ
ソフトウェア開発にはなぜか「出世」はPG→SE→PM→管理職という流れが一般的にあります。大きい組織(システム)になるとPGとSE/PMが完全に分離していてそれぞれの中でリーダーや係長・課長なんていう所もあると思います。
イメージ的に「PG=プログラム作成」「SE=設計」「PM=プロジェクト管理」が定着しているからか、「プログラムを作ること」にこだわる人の中には頑固に「SE」以上にはならない(なりたくない)という人もいます。この意見は一見正しいようにも見えますが、組織の中では逆効果の場合もあります。
これはPGとしてどう、というより組織人としての「常識」が疑われてしまうからです。会社は大きくなればなるほど同じ所に同じ人を留めないようにします。ある程度たてば人を回すようにして、組織を活性化させようとします。そのため、SEやグループリーダー程度はある程度経験があれば普通は誰でも回ってくると思って良いと思います。わたしは本当にエンジニアとして生き抜くためには「出世」をオススメします。SEになることが出世か? と言われればちょっと疑問もありますが、一般的に肩書としてPGからSEになると対外的に「単価」が上がるので、そこは建前だけでも出世と言えると思います。
なぜ、出世を勧めるかといえば、その方が自分にとってやりたいことをできる可能性が広がるからです。さすがにいつまでもPGと同じことはできませんが、SEになってもプログラムを作ることは可能ですし、PMだって工夫すれば、わたしみたいに兼業でPGもできます。むしろ今の方が好きな部分だけつまんでいる感覚もあるので、管理という頭の痛い仕事の良い気分転換になっているような気もします。責任は増して、その分プログラムを組む以外の仕事が増えますが、そういう仕事を効率的に行う方法を考えることによって自分に余力が生まれますし、毎日の作業にメリハリが付きます。
「それでも俺の職場では……」とおっしゃるなら独立を勧めます。独立すればプログラムを組むことが必要とされるのが多いからです。とはいうものの、若いうちから「明日から独立だ!」といってもそれは無謀なので、何年かかけて計画すると良いと思います。独立とは自分のやりたいことができる反面、自己責任の世界です。才能があれば儲かるでしょうし、自分からアクションを起こさなければ何もできません。最初の数カ月は収入がないでしょうから(一般に会社は支払いが1カ月以上先なので)、貯えも必要です。自分に売りがなければ仕事も来ませんし、コネも最初は必要だと思います。ですから貯金と勉強(独立したら勉強どころではなくなる時もあるので)、人脈を広げましょう。そうすればプログラマで一生やっていけるかも知れません。会社によっては何年か勤務すると独立を支援してくれる所もあります。実力があって初めて支援してくれるので、そういう会社を探して頑張ることも良いかも知れません。
(6)会社はアテにするな
昔は「社員=家族」という意識が社員にも経営者にもあったのですが、この頃はそんな雰囲気もあまりしなくなりました。
預貯金では資産形成が難しいため、それ以外の資産運用方法がたくさん普及し、個人投資家やデイトレーダーも増えてきました。そのため、大企業ではモノ言う株主の増加で社員よりも株主に向いてしまっている感じはします。株主も、成長よりも利益確保がメインなのでちょっとでも業績が落ちると、やれ「経営陣辞めろ」や「リストラしろ」と叫び、少しでも利益が出たら「株主にもっと配当しろ」となります。個人経営者でもやはり先々が不透明なので、給料やボーナスの還元よりは貯め込むことを優先します。すべてがそうではありませんが、それでも社員の優先順位がやや低くなったような気がします。
そういう意味では、雇用形態にかかわらず、労働者がこの先も同じように働いていける保証はありません。建前上は解雇は簡単にできず、労働基準法も労働者にかなり有利ですが、実際は労働基準監督署もそれほど強制力は持っていません。また、簡単には解雇ができないので、結局は一時帰休や自宅待機で人件費を抑えたり、少し仕事が増えても新たに雇用することによって今度仕事がまた減った時のリスクの方が大きくなるので、採用もできなくなります(このあたりが今の就職難だともいえます)。
個人的には会社がなくなることは、社員としても経営者としても経験しているので、決して会社に過剰な期待はしていませんし、明日会社がなくなっても良いように考えて働いています。派遣として従事している人(正社員として雇用されて派遣されている人も含む)は、なおさらそう考えないと本当に生活の糧や基盤をいきなり失いかねません。そうなると希望の仕事(エンジニア)につくという選択肢は事実上なくなります。生きるためにどんな仕事でも受け入れなければ、住む所すらままなくなり、それができないなら路上生活か生活保護となります。預貯金や頼る身内がいないと、這い上がることも困難です。
会社は社員1人1人の事情まで考慮してくれません。そういう意味では、自己防衛は絶対に必要で、仕事も会社のために頑張るのではなく、自分のために頑張るようにして、それ以外に個人的なネットワークを作ることも心がけましょう(当然、会社の仕事は絶対おろそかにしないように。それでは本末転倒なので)。わたしが独立を勧めるのはこういう事情があります。今日が正社員でも、明日も正社員とは限りません。今月給料があっても来月にあるかは分かりません。スキルアップもそういうことを考慮して行うべきでしょう。
(7)好きなことは趣味でやれ
一口に「ソフトウェア」といってもけっこう幅広くあります。ハードもWindows、Mac、UNIX/Linuxなど、ソフトもWebアプリやデスクトップアプリ、言語もC/C++やVB、JavaやPHPなど、どれを挙げたら良いかキリがありません。
長年やっていると多分一度は経験すると思うのですが、仕事でやってる以上、時々面白くない仕事もあります。これは仕方ないことですし、どうしても好きなことだけで仕事がしたいなら、自分で会社作ってソフトウェアを開発し、販売するしか方法はありません。
かれこれ18年ぐらい前の話ですが、後輩のA君と一緒にUNIXでC言語を使った他メーカーの機器と通信するためのプロトコルを作る仕事をしていました。ある日の打ち合わせであまりコーディングが進んでいないことが分かったので「何で?」と尋ねてみました。すると「(仕様が)抽象的すぎてよく分からないから」といわれてしまいました。あー、わたしが悪いんだ……、なんて思いながら自分の仕様書を見直してみると、そんなに抽象的な感じはしません。
仕方ないので「どこがどのように抽象的で分からないの? 説明するし、書き直すから」って言っても答えがありませんでした。しばらくして「僕は本当はこんなプログラムが作りたかったわけじゃないんです」と意を決したように言い出しました。当然、わたしは「え?」とあっけにとられましたが、気を取り直して「どんなプログラムが作りたいの?」って聞き直したら、
「ゲームが作りたかったんです!」
と、きっぱり言われてしまいました。いやー、そういうソフトを作っている会社ではないので、そういうことをはっきり言われても正直どうしようもありません。仕方ないので、「でも、こんな簡単なプログラムも組めないのにゲームなんて作れるの?」と言ってしまいました。
彼の言い分もちょっとだけ分かります。就職してプログラマになったけど、作るソフトがおそらく「面白くない」んだと思います。その頃はまだWindowシステムも一般的ではなく、パソコンもUNIXマシンの端末として使用していただけなので、文字だけで本当に地味でした。作っていたのもプロトコルなので、画面表示などはあまり関係ないですし。ある意味、理想と現実のギャップに悩むんだと思います。
でも、仕事なのでそこに好き嫌いを持ち込むのは良くありません。やはりお金をもらっている以上、プロとして自覚し、やりたいことがあったら趣味で自宅などでやりましょう。幸い現在は当時と違い安価でたいていのことは自宅でもできると思います。
■好きだからこそ
わたしが就職した20年前と今では社会情勢もITの普及具合も比べ物にならないぐらい違います。すべてを同列に比較することはあまり意味はありませんが、本質部分はなんら変わっていないと思います。
プログラミングが好き過ぎて、他の人のコードが稚拙に見えることもあるでしょうし、自分の持てる技術をフル稼働して開発に貢献したいと思うでしょう。でも、現場が求めているのはそれだけではありません。一定の基準に沿って同じような品質でシステムの開発が行えるエンジニアを求めています。それには技術的なスキル以外も必要です。
本当にエンジニアで生き抜きたいなら、固定観念は捨てて、柔軟に取り組む方が恐らく良いでしょう。それは妥協ではありません。仕事は別で趣味でプログラミングも良いと思います。ソフトウェア開発のスキルはプログラマでもプログラミング技術だけではもはや不足でしょう。ネットワークやシステム構築方法もある程度知る必要があります。そういう現状を踏まえると、わたしは「何でもできなければ(やろうとしなければ)エンジニアとして生き残ることは難しい」と思っています。
ひとりよがりにならず、バランス良くスキルを磨いてお客様から「必要とされるエンジニア」を目指して欲しいと思います。それがこれからエンジニアで生き抜くために必要な考え方だと思います。
(今回も長かったですね……読んでいただき、ありがとうございます)

にゃん太郎
