第23話 エンジニアで生き抜くために
最近の経済ニュースを見ていると、不況が続くのかこれから良くなるのかいまいちピンと来ない感じがまだまだします。就職・転職の状況においても同じで、エンジニアかどうかにかかわらず非常に厳しいと思います。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の普及具合も比べ物にならないぐらい違います。すべてを同列に比較することはあまり意味はありませんが、本質部分はなんら変わっていないと思います。
プログラミングが好き過ぎて、他の人のコードが稚拙に見えることもあるでしょうし、自分の持てる技術をフル稼働して開発に貢献したいと思うでしょう。でも、現場が求めているのはそれだけではありません。一定の基準に沿って同じような品質でシステムの開発が行えるエンジニアを求めています。それには技術的なスキル以外も必要です。
本当にエンジニアで生き抜きたいなら、固定観念は捨てて、柔軟に取り組む方が恐らく良いでしょう。それは妥協ではありません。仕事は別で趣味でプログラミングも良いと思います。ソフトウェア開発のスキルはプログラマでもプログラミング技術だけではもはや不足でしょう。ネットワークやシステム構築方法もある程度知る必要があります。そういう現状を踏まえると、わたしは「何でもできなければ(やろうとしなければ)エンジニアとして生き残ることは難しい」と思っています。
ひとりよがりにならず、バランス良くスキルを磨いてお客様から「必要とされるエンジニア」を目指して欲しいと思います。それがこれからエンジニアで生き抜くために必要な考え方だと思います。
(今回も長かったですね……読んでいただき、ありがとうございます)
コメント
インドリ
同意見です。
経験が長く、技術力があるにゃん太郎さんと同じ意見でうれしいです。
やはり、これからの時代何でも出来ないとだめですよね。
すぐには無理ですが、にゃん太郎さんを見習って電気も学習する予定を立てています。
私はこれからもただひたすらに幅広い意味での技術力を鍛え続けます。
人間これでいいと思ったらだめですよね。
一つの事に拘らず、必要なものは全て習得する姿勢でこれからも生きてゆきます。
10年後にはにゃん太郎さんにの技術力に追い付いているかな・・・
にゃん太郎
インドリさん、ありがとうございます。
技術力ならソフトウェアでは多分インドリさんの方が上だと思いますよ。エンジニアの究極の遊びは自分でハード設計して自分でOSとアプリを作る事だと思います。それを目指してみてください。地道に勉強していけばインドリさんならできると思いますよ。
でも、勉強ばかりじゃなくてたまには外で遊んで下さい(笑)
saki1208
にゃん太郎さん、こんばんは。
毎度々考えさせられるネタで今回も頷きながら読ませていただきました。
自分自身の出来うる限りのことを駆使して開発してみたい欲と周りに合わせて
やるべきだと考える自分とその両方の思いに頭を抱える現実とのギャップにど
うするべきか答えの出せない自分が常に存在しています。
大抵の場合は仕事としてやる以上、周りに合わせるしかないのですけど...
理想論を口にして他人の作ったものにケチをつけるのは簡単で誰でも出来るの
ですが、その場でしか答えの出せない問題もありますし当事者以外では簡単に
口にするべきではない場合もあります。
新卒で就職してAround 20ですが、今でも仕事に関する色んなバランスには
気を使いますね。
上手く行ってなくて苦労することもしばしばですorz
にゃん太郎さん、こんばんは。
今回もガッツリと拝読させて頂きました。ご自身の経験ベースと前置きされての内容でしたが、全面的に同意です。先輩であるにゃん太郎さんの御考えと、現在の私の認識とが一致したことで一定の安心感を得ているところです。
コラム本文を思いっきり端折ると『マルチへのススメ』ですよね。加えて『ボーダーレス精神』と、散漫しないための『基礎』。もし本文の内容と逆方向に進んでいるとなれば、プロジェクト参画の機会損失を自ら高めていると言えます。このことは私が従事する特定労働者派遣事業では特に顕著ですから、重要な指針であると思いました。
残念ながら当コラムの内容を理想論と解釈される方々が予想されるのですが、実践できている人と出会えているかで大きく変わると思います。私も20代半ばでスーパーマルチな先輩エンジニアと一緒に仕事をした際、その先輩を見て『人間はここまでやれるのか!』という意識改革がありました。今にして思えば、これは一つの転機だったと思います。
やはり、スーパーSEの凄さを間近で体感しないと『どこまでできるのか』、さては『やっていいのか』という根本的なアウトラインや目標が見え難いですよね。
人との出会いが占めるファクターは大きいですから、私も若手にこんな刺激を与えられるエンジニアでありたいと再認識しました。ありがとうございます。
saki1208
saki1208です。
ちょりぽんさんのコメントを読んで...
先のコメントではなんか非常に誤解を受けそうな書き方をした気が...
コラムの内容には全面的に同意です。
にゃん太郎さんの経験には遠く及ばないでしょうけど、私自身も色んな人と色んな
仕事をしてきました。そんな中で「スペシャリストも良いけどジェネラリスト」と
言う考えを持つようになりました。
# 本当に浅くてはダメなんですけどね。
>理想論を口にして他人の作ったものにケチをつけるのは簡単で誰でも出来るの
>ですが、その場でしか答えの出せない問題もありますし当事者以外では簡単に
>口にするべきではない場合もあります。
これは目先の問題だけ知ったような顔で議論して過去の経緯やなんかを無視する
人が周りに多いので...
本質を理解できれば使う道具なんて関係ないと思います。
自身が出来ているかは疑問も残りますがorz
saki1208さん、こんばんは。
『理想論』というワードが被ったのは認識しています(笑)
ですが、もちろん他意はありません。
saki1208さんも、にゃん太郎さんも誤解はしないだろう、というジャッジで投稿しました。
一応、認識はしていたというご報告です(笑)
インドリ
おはようございます。にゃん太郎さん。
そう言って頂けると大変うれしいです。
それから、たまには外で遊ぶことにします。
にゃん太郎
saki1208さん、ありがとうございます。
> 大抵の場合は仕事としてやる以上、周りに合わせるしかないのですけど...
まぁ、これが現実でしょうか。私自身、若い時は「一生プログラマだ!」なんて思っていましたが、経験と転職でそうそう思い通りに行かず、仕方ないので流れに身を任せていたらこうなっていました。ただ、結果としては非常に幸運だと思っています。
今からエンジニアを目指す若い人もおそらくいろいろ理想を持っていると思いますが、昔よりは厳しくなっているので少しだけ気の毒だと思います。でも、昔以上に自分から情報発信も出来るので、可能性は広がっているとも思います。
独立しようが社員・アルバイト・派遣だろうが結局、必要な事はバランスを取って協調しながらプロジェクトを進める事にあります(他の業種でもそうでしょうが)どんな仕事でも自分の糧だと思って腐らずに続ければいつかそれは実を結ぶと私は実感しています。
若いうちの苦労は…ってやつですね。
にゃん太郎
ちょりぽんさん、ありがとうございます。
いや、ここまで言われてしまうと返事するのが非常に恥ずかしいです。
私は「理想論」を理想で片付けてしまっては勿体ないと思う事が良くあります。そしてPG以外の役割を良しとしないPGもなんか勿体ないと思います。
仕事として捉えるなら、どんな役割でも嫌な顔せず引き受けてくれてそれぞれで平均以上の結果を出せるエンジニアなら上から見たら非常に「ありがたい存在」になります。これは経営者になると非常に実感しますが、それと同時にそういう人が少ない事も思い知らされます。派遣やフリーランスなら認めてもらわなければなかなかプロジェクトにも参画出来ないと思います。正社員でいるとややこの辺りがおろそかになりがちなので考えて欲しいと思う時はあります。
結果として私の職務経歴はたいていの要件に合うぐらいバラエティに富んでいます。今でも時々、お仕事のお誘いがあります。ありがたい存在になる事はそれだけ自分にとって有利に仕事が出来ますし、たいていは「好きにやっていいよ」と言われます(ついでに若いエンジニアをメンバーにして教育もしてと言われますが)
それは例外なく一朝一夕では無理なので、理想を理想で片付けずに目指して頑張って欲しいです。
みりゅ
自分がよく聞いたのは、I型ではなくてT型やΠ型になれでしたね。
つまり、ひとつの分野に特化する(I)だけではなく。その周辺( ̄)のことを
うまく融合させる(T)知識を持っておいた方がよい。また、特化する部分が
ひとつだと弱い場合があるので(Π)のように複数の分野が得意な方がよい
というようなことです。
もっとも、(I)型が成功するのは、より深い理解と専門性が必要でしょう。
( ̄)型は、どちらかというとジェネラリストです。
----
>(4)言語にこだわるな
のような話には共感する部分はありますが、個人的には少し
違うような気がします。
むしろ、システムを作るというのは、より広い意味では
そのシステムの特性を引き出すようにすることです。
>案件の規模や予算でどんな環境や言語で開発するかということが
>重要になってきます
とおしゃっているように、この部分で言語なども決まってくる部分が
多いと思われます。
もちろん、プログラミング言語そのものは、手続きを行うことですので
得手不得手があっても、大体のことは実現できます。
Javaで作る、またはC, C++, PHPなど、特定の言語で作るというのは
ライブラリなどの使い方を含めて、その言語の特徴で作るということでしょう。
例えば、Javaで作ったあるプログラムが一応動作するにしても、
ある程度のスキルを持ったJavaの使い手から見てJavaらしくないと感じられ
ようでは、それは良い方法やコードとは思えないです。
概念・仕組み・ある部分のアルゴリズムを理解しておくという話は
まさにその通りですが、「アルゴリズムを中心」というというと
一部分のみを取り上げているように思われます。
同期・非同期処理やマルチタスク処理などの話は、(3)基礎 の
話という気がします。
OSがあるかないかとか、時間を制御する対象にもよります。
設計上では、シーケンス図やタイミング図を描いた方が、分かりやすい
場合もあるでしょう?
オブジェクトがメモリ上にどのように展開され割り付けられるか
というのも仕組みの問題かもしれません(環境に大いに依存している
でしょうが)。
>一定の基準に沿って同じような品質でシステムの開発が行える
>エンジニアを求めています。
たしかにそうです。ただ、明らかに改善できると思ったときには
提案も大事なのでは?
>他の人のコードが稚拙に
などの部分は、まさにコーディングに関するものです。
実際には技術的な背景や作法によっていますね。
コードを自動生成する都合である場合や、静的解析するためで
あることもあるでしょう。
もっとも、コーディング規約そのものがなければ、言語仕様の
詳細が理解されずこのようなことも起き得ます。
(コーディング規約は必要か? にも書きましたが)
----
開発環境/手法・テスト環境/手法・製品 これらは日々進化して
いますが、やはり技術の向上の結果として私たちはこれらと享受
しています。簡単にできるということと、知識を持っているという
ことは別なので、知識・経験があればより深い洞察ができることも
あるでしょう。それは、より新しい開発や改善などにも役立つように
思えます。
ただ、情マネ流マーフィーの法則(23)
http://www.atmarkit.co.jp/im/cits/serial/murphy/23/01.html
のような話を聞くと
情報システムに限らず、現実はそんなに簡単でないかな? とは
思えます。
にゃん太郎
みりゅさん、ありがとうございます。
> 概念・仕組み・ある部分のアルゴリズムを理解しておくという話は
> まさにその通りですが、「アルゴリズムを中心」というというと
> 一部分のみを取り上げているように思われます。
毎回コメントしている気がしますが、私のコラムは基本的に一部分に特化している部分があります。基礎やアルゴリズム、言語の話はみりゅさんのように分かっていらっしゃる方には「それだけじゃない」と思われるでしょうし、私もその通りだと思います。でも、そんなこと書いても正論でしかなく、コラムの性格上、それではあまり意味が無いでしょう(別にわざわざ正論を並べるために来ている訳ではないので)もっとも根本的に私自身にそれをまとめるだけの文章表現力が無いのですが。
> ある程度のスキルを持ったJavaの使い手から見てJavaらしくないと感じられ
> ようでは、それは良い方法やコードとは思えないです。
私はこの考えはどうかと思います。それは「使い手」の基準が多分無いからです。経験のある者が使い手とは限りませんし、良い方法やコードもある程度手本はありますが使い手が決める事ではないと思っています(この話はまた別なコラムのネタなんで、今回はあまり書かない様にします)
昔はコンパイラが吐き出したアセンブラを見て善し悪しを判断したりもしましたが、今じゃあまり意味が無さそうです。最適化すれば良いってもんじゃないみたいですし。
> たしかにそうです。ただ、明らかに改善できると思ったときには
> 提案も大事なのでは?
それはそうだと思いますし、それはすれば良い事です。と言うより「するな」とも書いた記憶は無いですが。最低限、一定の基準や品質をクリア出来るエンジニアである必要があるとは考えていますが、改善提案とはまた別だと思っています。
> 情報システムに限らず、現実はそんなに簡単でないかな? とは
> 思えます。
どんな業界でも簡単ではないでしょう。正直、運もあると思います。それでも生き抜くためにというテーマなのでやはり仕事では自分は「こうした方が絶対に良い」と思ってもそれを飲み込まなければならない時もあると思います。心構えと実務は違いますので、まずは「どうしたら良いか」を考える事が一番だと思っています。みりゅさんさんのおっしゃる事はその上での事だと思います。
みりゅ
にゃん太郎 さん コメントありがとうございます。
>> コラムの性格上、それではあまり意味が無いでしょう
コンピュータ利用は、多数ある要素を複合して使用していますので、
すべてを書くのには無理がある点はよくわかります。
逆に、ある主張を強めたいときには、もっと特化してもよいようにも
思われます。
特に経験のある方の話は、なんでもないような、その経験が無いと分からない
部分にノウハウや肝があるときがあります。
もっとも、語る範囲が狭まれば、特定の技術論に終始しているようになり
想いが伝わらないということになることも分かります。
> あまり言語に縛られてソフトウェアを考えてしまうと、
> 逆に自分のスキルの幅を狭める結果になります。
そういう点では「アルゴリズムありき」(というか仕組みや手続き、
データと入出力 ありきです) です
(確かに正確さで伝えようとすると難しいです)。
----
以下は、今回のお話には、あまり関係ない部分でした。
枝葉の話に過ぎないですね。
この点は、失礼しました。
>> ある程度のスキルを持ったJavaの使い手から見てJavaらしくないと感じられ
>> ようでは、それは良い方法やコードとは思えないです。
それを承知で、書かれないとおしゃられたことに、
コメントを書くのは、失礼でもありますが、書かせて下さい。
内容的には、開け足取りなものです。
>> それは「使い手」の基準が多分無いからです
確かにそうなのですが、何もよりよい方法にいきなりたどり着く
ようなものではないと思います。
ただ、自分が見たり書いたものに対して、自身は何がしかの判断
ができるはずです。その点では基準は「自分」ですし、他人のコード
や、納得できる手本があればそれが「その時点での基準」です。
複数人で開発していれば、よりよく書くにはということをメンバー
で考えていけば、それが「コーディング作法」となったり、ライブラリの
使用方法に関する「ドキュメント」になるでしょう。
より大きい枠では、自分たちが使っているコードで汎用的かつ
効果的に利用されているものが、自然とライブラリになっていくかも
しれません。
プログラムに関する技術は、日々進化しているので基準も変わって
いきますが、その時々の指標となるものは必要に思われます。
極端な話、「コードレビュー」をするにしても指標がなければ、
レビューの目的はバグの発見のみとなります。その他の開発者たち
発言は個人個人の感想にしかなりません。
しかし、何かの判断をするということは「理由」が存在するはずです。
(仕組みや動作的に正しいことの検証もレビューの意義ですが、
正しいからといって、数行で済む箇所を冗長な記述をしているなどは問題
でしょう。実際には、敢えて冗長な記述が必要になる理由があるときもあります)
このあたりの話は、「第20話 エンジニアは育つのか育てるのか」
で、MASASHIGE さんがコメントされている フレームワークの選定や
使い方に関する話に通じる ようにも思われます。
もっとも、現場では、他社のライブラリや、CPUなどのハードなどに
思わぬ挙動があって悪戦苦闘を余儀なくされることもありますが
そういう部分の「理由」も含めて「使い方」と言いたいです。
----
関係ない話
個人的には、アセンブラで遊ぶなら、今は
TK-80 エミュレータで遊んでみたいかな?
(半分以上、うそですが)
http://ascii.asciimw.jp/books/books/detail/4-7561-3401-7.shtml
にゃん太郎
みりゅさん、ありがとうございます。
> 逆に、ある主張を強めたいときには、もっと特化してもよいようにも
> 思われます。
あまり一部「だけ」を主張しすぎると今度は原理主義的になりかねない部分もあります。その兼ね合いが非常に難しいと思っています。とは言っても、ここのコラムでは基本的に技術的に掘り下げる気はあまりないと思うのでそこまで極端にはならないでしょうが。
まぁ、自分の考えを人に正確に伝える事はきちんと仕様書を書くより難しいと思います。経験則だけは想像してもらう以外ないですし、それでもダメなら「ごめんなさい」でしょうか。
> プログラムに関する技術は、日々進化しているので基準も変わって
> いきますが、その時々の指標となるものは必要に思われます。
時々、本当に「進化」しているんだろうか、とまじめに思ってしまう時はありますが、指標なんてのは個人レベルではバラバラですから結局は軸になる人次第でしょうね。技術的なやり手なら良いのですが、世渡り上手だけなら結構悲劇です。それでも職業ならばうまい事立ち回る必要はあります。この辺をうまく切り替える事が必要でしょうね。
#TK-80…なつかしいなぁ。結構おもしろいハードだったけど。
あとむ
にゃん太郎さん
いつも拝見してます、あとむです。
余談ですが、私はGoogleリーダー越しで@ITを見ていて
タイトルで惹かれた記事を読むようにしており、
おっ?と思って読む記事がにゃん太郎さんのものが多いのです(笑)
今回のコラムについて非常に共感しました。
私がもしコラムを書くなら、ほとんど同じ内容のことを書いただろうな、
と失礼ながら思ってしまいました^^;
以前も同様のことを書いたかもしれませんが、
コラムを読みながら、個人的にはPMか独立の方向性が、
少なくとも私の性に合っているかなと再確認できました。
再確認できたきっかけを与えて下さったにゃん太郎さんに
感謝の思いを伝えたく、コメントしました。
ありがとうございますm(_ _)m
にゃん太郎
あとむさん、ありがとうございます。
> タイトルで惹かれた記事を読むようにしており、
そうです、実はタイトルを考えるのが一番悩んだりします(笑)そういう意味では戦略的に成功かと。
> 再確認できたきっかけを与えて下さったにゃん太郎さんに
> 感謝の思いを伝えたく、コメントしました。
いえいえ。もう、コラムを書く理由はそれぞれの人が自分に置き換えていろいろ考えてもらうためなので、再認識して頂けたならわたし的には満足です。目標を定めて頑張ってもらえればそれが先輩エンジニアとして一番嬉しい事です。
また読んでもらえるようタイトルも内容も精進します。