こんにちは!iGrusの鈴木です。
世間はPHP2Shellで大騒動が起きていますね。
IT業界だけでなく、エンドユーザーにまで実害が及ぶ大きな事変です。
技術が浸透して便利な時代になった反面、万人にある程度のリテラシーと自己防衛力が必要となり、大変な時代になったなぁと思います…。
さて、今回はエンジニアの「技術力」についてのお話です。
エンジニアと聞くと、プログラミングが出来る人、というイメージが強いかと思います。
もちろん間違いではありませんし、Webエンジニアやアプリケーションエンジニアなど、プログラミングを主な仕事としているエンジニアもたくさんいます。
しかし、プログラミングが出来ることと、エンジニアとして仕事が出来ることは同じなのでしょうか?
少し意地悪な質問かもしれませんが、実はこの2つには結構大きな違いがあります。
今回は、プログラミングの学習と実際の開発業務の違い、そして現場で活躍するために必要な能力について、少し掘り下げてみたいと思います。
目次
プログラミングが出来る=エンジニアになれる?
そもそも「プログラミングが出来る」って?
一言にプログラミングが出来ると言っても、そのレベルは人によって様々です。
例えば、HTMLやCSSを使って簡単なWebサイトを作れる人もいれば、複数のプログラミング言語を扱い、大規模なシステムの開発が出来る人もいます。
どちらも広い意味ではプログラミングが出来る人ですが、実際に出来ることには大きな差がありますよね。
では、プログラミングスクールや独学で一通りの学習を終え、自分でWebアプリケーションを作れるようになったとしたら、エンジニアとして仕事が出来るのでしょうか?
結論から言うと、出来る可能性はあります。
ただし、出来ない可能性も十分にあります。
少し曖昧な回答になってしまいましたが、これはプログラミングの能力だけでは判断出来ない部分が多いからです。
以前の記事でも何度かお話ししていますが、IT業界、特にSESの現場では実務経験が重視される傾向にあります。
その理由の一つが、プログラミングを学ぶことと、仕事としてシステムを開発することには、明確な違いがあるためです。
プログラミングはあくまで手段の一つ
そもそも、エンジニアがプログラミングをする目的って何でしょうか?
コードを書くこと自体が好きでエンジニアを目指す方も多いと思いますし、趣味としてプログラミングを楽しむこともあるでしょう。
しかし、仕事となれば話は別です。
お客様は、エンジニアがプログラミングをすること自体にお金を払っているわけではありません。
自分たちが抱えている課題を解決するためだったり、業務を効率化するためだったり、新しいサービスを作るためだったり…。
何かしらの目的があって、その手段としてシステム開発を依頼しているわけです。
極端な話、1万行のコードを書いても、お客様が求めていたものと違えば意味がありません。
反対に、たった100行のコードでお客様の要望を満たせるのであれば、それで十分な場合もあります。
つまり、エンジニアにとってプログラミングは目的ではなく、目的を達成するための手段の一つということになります。
ここを理解しておかないと、技術力が高くても仕事が上手くいかない…ということが起きてしまうんです。
学習と実務の違い
自分の好きなように作れるわけではない
プログラミング学習では、あらかじめ作るものや完成形が決まっていることが多いです。
例えば「ログイン機能を作ってください」という課題があれば、ログイン出来るようにすることが目標になります。
必要な知識を調べ、コードを書いて、実際にログイン出来ればクリアです。
ところが、実務ではそう簡単にいかないこともあります。
例えば、既に運用されているWebサービスへ、新しくログイン機能を追加することになったとします。
その場合、単にログインが出来れば良いというわけではありません。
既存のユーザー情報をどう扱うのか、パスワードを忘れた場合はどうするのか、セキュリティ上の問題がないか、他の機能へ影響が出ないか等、考慮すべきことがたくさんあります。
また、お客様から「こんな機能が欲しい」と言われても、具体的な仕様まで決まっているとは限りません。
実際には、お客様自身もどんな形が最適なのか分かっていないことがあります。
そんな時に、言われた内容をそのままプログラミングするだけでは、後から「思っていたものと違う!」なんてことにもなりかねません。
何を作るべきなのか、何故それが必要なのか、どうすれば実現出来るのか。
コードだけでは説明できない、裏側の部分まで考えながら仕事を進めていく必要があります。
正しく動けば完成、ではない
例えば、ある機能を開発して、想定通りに動作したとします。
学習課題であれば、基本的にはそれでクリアになるでしょう。
しかし、実際の開発では「動くこと」は完成条件の一つでしかありません。
特に大きなシステムになればなるほど、プログラムは一度作って終わりではなく、何年にもわたって修正や機能追加を繰り返すことになります。
仮に、ものすごく複雑なコードを書いて、今のところ問題なく動いていたとしても、半年後に別のエンジニアが修正しようとした際、何をしているコードなのか全く理解出来なかったらどうでしょうか?
調査するだけでも相当な時間がかかりますし、下手に変更すれば別の部分に不具合が発生するかもしれません。
なので、現場では単純に動作することだけでなく、読みやすさや保守性、変更のしやすさなども重要になります。
「自分が理解出来れば良い」ではなく、「他の人でも理解・修正出来るようにする」という考え方ですね。
もっと言えば、動作確認も自分が想定した操作だけでは不十分です。
ユーザーが誤った情報を入力した場合、通信が途中で切れた場合、想定以上のアクセスが集中した場合…。
様々な状況を考慮し、問題が発生しないか検証する必要があります。
とはいえ、こういったことを最初から全て理解している未経験者はほとんどいないと思います。
だからこそ、実際の現場で経験を積むことに大きな価値があるわけです。
納期や予算という制限もある
学習ではあまり意識しないでも良く、逆に実務ではかなり意識しなければいけないのが「時間とお金」です。
趣味で何かを作るのであれば、完成までに1ヶ月かかろうが半年かかろうが、自分が納得出来ればそれで良いでしょう。
しかし、仕事ではそう簡単にはいきません。
開発に使える予算や人員、納期などは基本的に決まっています。
例えば、ある機能を実装するにあたって、Aの方法なら3日、Bの方法なら2週間かかるとします。
Bのほうが技術的には優れていて、将来的な拡張もしやすい。
しかし、実際には納期が1週間後で、追加の開発予算もない…。
そんな状況では、Bを採用することが正解とは限りません。
かといって、納期さえ守れれば良いというわけでもなく、品質やセキュリティを犠牲にして良いわけでもありません。
どこまで作り込むべきなのか、何を優先するべきなのか、将来のことをどの程度考慮するべきなのか。
どうしてもBでなければ製品として成り立たない場合、お客様にどう説明して納得してもらうか…。
エンジニアには、技術以外の条件も考慮した判断が求められます。
プログラミングの教則本だけではなかなか学べない部分ですね。
技術力はどのくらい必要?
ここまでの話を聞くと「じゃあプログラミングが上手くなくても、仕事は出来るんじゃないの?」と思う方もいるかもしれません。
当然そんなことはありません…(笑)
プログラミングを主な業務とするエンジニアにとって、技術力は最も重要な能力の一つです。
お客様の要望を理解出来ても、それを実現する技術が無ければ仕事になりません。
特にIT業界は技術の変化が早く、数年前には主流だった技術が、今ではあまり使われなくなっている…ということもあります。
そのため、エンジニアとして働き続けるためには、継続的な学習も必要です。
ただ、技術力の高さを「知っているプログラミング言語の数」や「書けるコードの量」で判断するのは、少し違う気がします。
知っていることと、使いこなせること
例えば、PHP、Java、Pythonの3つの言語を学習した人と、PHPだけを長年使ってきた人がいたとします。
単純に扱える言語の数だけを見れば、前者のほうが優秀に見えるかもしれません。
ですが、PHPを使用するプロジェクトに参加するのであれば、後者のほうが活躍出来る場面も多いでしょう。
言語そのものの知識だけでなく、その言語を使ってどんなシステムを作ってきたか、どんな問題を解決してきたかという経験があるからです。
もちろん、複数の言語を扱えることにも大きなメリットがあります。
開発出来るものの選択肢が増えますし、異なる技術に触れることで理解が深まることもあります。
ただし、広く浅い知識を身に付けることと、一つの技術を深く理解することでは、得られる強みが違うということです。
未経験の方の中には「とにかく色々な言語を覚えなきゃ!」と考えてしまう人もいるかもしれませんが、最初から何でも出来る必要はありません。
むしろ、まずは一つの技術を使って、ある程度しっかりしたものを作れるようになるほうが、結果的に近道になることもあると思います。
現場で評価されるエンジニアとは
仕事が早い人は優秀?
これはエンジニアに限った話ではありませんが、仕事が早い人というのは評価されやすい傾向があります。
同じ仕事をお願いして、片方は3日、もう片方は1日で完成させたとしたら、後者のほうが優秀に見えますよね。
しかし、仮に1日で完成させたものに大量の不具合があり、修正に追加で5日かかってしまったら?
当初の3日で完成させた人のほうが、結果的には早く仕事を終わらせたことになります。
当然、早くて正確であればそれが一番良いのですが、仕事の早さだけを重視するのは危険です。
また、エンジニアの仕事は自分一人で完結するものばかりではありません。
自分が担当する機能を予定より早く完成させたとしても、他の機能との連携が考慮されていなければ、後から大幅な修正が必要になる可能性もあります。
「自分の仕事が終わったか」だけでなく「チーム全体が上手く進んでいるか」を考えることも必要になります。
少し難しい話ですが、個人としての能力と、チームの中で発揮出来る能力は、必ずしも一致するわけではないんです。
問題が起きた時にこそ差が出る
プログラミングをしていて、エラーが発生したことがない人は恐らくいないでしょう。
コードの書き間違いや、設定ミス、想定外の動作など、原因は様々です。
学習中であれば、エラーが発生する度にインターネットで調べたり、教材を見直したり、講師に質問したりするかと思います。
実際の開発でも同じような作業はありますが、必ずしもインターネット上に答えが落ちているわけではありません。
特に、企業独自のシステムや複雑な構成のプロジェクトになると、調べても同じ事例が見つからないことがあります。
そんな時に必要なのが、問題を整理して原因を特定する能力です。
どの操作で発生するのか、いつから発生しているのか、どこまで正常に動いているのか。
そもそもインターネットに落ちている情報や手法で解決出来る事象なのか。
こういった情報を一つずつ確認し、原因になりそうな部分を絞り込んでいきます。
いわゆる問題解決能力というものですね。
そして、自分ひとりの力では解決出来ないという判断をどれくらい早くでき、報告、質問・相談が出来るかどうかも、「問題を解決すること」を目標に置いたときに大きな能力になります。
私自身、エンジニアを目指していた頃は、エラーが解決出来ずに長時間悩むこともありました。
今思えば、分からないことがある度に答えを探そうとするのではなく、何が原因なのかを自分で考える癖、そして自分で解決できないと判断して相談する癖をもっと早く身に付けておけば良かったな、と思います。
エラーを解決する方法を知っていることも大切ですが、知らない問題に直面した時に、どうやって解決するかを考えられることはより重要です。
経験を積んだエンジニアほど差が出る部分かもしれません。
未経験のうちから意識しておきたいこと
では、これからエンジニアを目指す方は、プログラミング以外に何を学べば良いのでしょうか?
といっても、最初から実務で求められることを全部勉強するのは現実的ではありません。
そもそも、実務で必要な能力を身に付けるためには、実務を経験することが一番です。
少し矛盾しているように聞こえますが、未経験の段階では、全てを身に付けようとするよりも「現場で学べる土台を作ること」が大切だと思います。
作ったものを、もう一度作り直してみる
例えば、Web開発の学習課題で簡単な掲示板を作ったとします。
記事の投稿、編集、削除などの機能を実装して、問題なく動作するようになったら完成。
通常であれば次の課題に進むところですが、ここでもう少しだけ踏み込んでみるのも良いと思います。
例えば、画像の投稿機能や記事の検索機能を作ってみたり、投稿した記事をカテゴリーごとに分類出来るようにしてみたり。何でも構いません。
最初に作ったものに対して、後から機能を追加したり、仕様を変更したりするという経験が重要なんです。
新しく機能を追加しようとすると、既存のコードを修正する必要が出てきます。
場合によっては、最初から違う作り方をしておけば良かった…なんてこともあるでしょう。
でも、それで良いんです。
実際の開発でも、最初に決めた仕様のまま最後まで進むとは限りません。
作って、変更して、また修正して…という経験を積んでおくだけでも、実務に対する理解は深まるはずです。
答えを知るより、理由を知る
もう一つ意識してほしいのは、何かを教わった際に「何故そうするのか?」まで考えることです。
例えば、プログラミングの学習中、講師から「ここの書き方は変えたほうが良いよ」とアドバイスをもらったとします。
その時に、言われた通りにコードを修正するだけでは、同じような問題に直面した時、また同じ質問をすることになるかもしれません。
そうではなく、何故その書き方が良くないのか?どういう問題が起こる可能性があるのか?を理解していれば、別の場面でも応用出来るようになります。
最初は難しいかもしれませんが、これを繰り返していくことで、少しずつ自分で判断出来ることが増えていきます。そして、自分で判断出来ることが増えれば、仕事を任せてもらえる範囲も広がっていくでしょう。
技術の変化が早いIT業界だからこそ、一つ一つの知識を丸暗記するよりも、考え方や仕組みを理解することのほうが長く役立つんじゃないかと思います。
まとめ
プログラミングが出来ることは、エンジニアとして活躍するための大切な能力です。
しかし、プログラミングが出来るようになったからといって、必ずしも実務で活躍出来るとは限りません。
実際の開発では、技術力だけでなく、仕様を理解する能力や問題解決能力、品質や納期を考慮する判断力など、様々な能力が必要になります。でも、これらを最初から全て身に付ける必要はありません。
未経験からエンジニアを目指すのであれば、まずはプログラミングの基礎をしっかり学び、その知識を使って自分で何かを作れるようになることが第一歩です。
実際に仕事を始めてからも学習を続け、経験を積み重ねていくことで、「単にプログラミングが出来る人」から「仕事を任せてもらえるエンジニア」へと成長していくものだと思います。
エンジニアになること自体をゴールにするのではなく、エンジニアになってから何が出来るようになりたいか、どんな仕事をしてみたいかまで考えられると、学習に対する向き合い方も変わってくるかもしれませんね。
最後に
iGrusでは、未経験からエンジニアを目指す方に向けたオリジナルの学習カリキュラムや、現役エンジニアによるメンター制度などを用意しています。
単純に課題をクリアすることだけでなく、学んだ技術をどう活用するのか、実際の現場ではどんなことが求められるのか、といった部分まで学べる環境づくりを目指しています。
毎週の勉強会などを通じて、先輩エンジニアや同じ目標を持つ仲間と交流出来る機会もあります。
まだプログラミングを始めたばかりの方も、これからIT業界への転職を考えている方も大歓迎です!
興味のある方は、是非一度オフィスへ遊びに来てみてくださいね。
最後までお読みいただき、ありがとうございました!