2021年1月10日日曜日

プログラミングスクール上がりでソフトウェアエンジニアになろうとしている君へ

最近はエンジニア採用関連の業務もちょいちょいやっているんですが、つい最近までプログラミングスクールに通っていたと思われる人からの応募が来ることがあります。

コロナ禍のご時世、リモートワークに向いているソフトウェアエンジニアに注目が集まるのはとてもよく理解できるんですが、現実はそんなに甘くないと思ってください。

あるいは「プログラミングスクールを出ればスキルが身につくしリモートワークできて定時に上がれて給料が高いキラキラホワイト大手IT企業に就職できる🎶」と思っているのかもしれませんが、どちらにしても現実は甘くありません。

今回は、ソフトウェアエンジニア採用時にどういうところを見られているのかを採用する側の視点でお話しします。言いたいことが山ほどあるのでちょい長いです

ちなみに今回の内容は、多くのスクール生が目指すであろうウェブ業界を想定しています。IT業界は色々ありますが、プログラミングスクール上がりで基幹系エンジニアになりたい!という人はあまり多くないと思いますので。そのため、以下の文章では特に断りのない限り「エンジニア」を「ウェブ系のソフトウェアエンジニア(フロントエンド / バックエンド)」という意味で使います。

なにが甘くないのか

甘くないポイント、要するにこれからエンジニアになろうとしている人の勘違いポイントは主に2つありまして、

  • プログラミングスクールに通えばエンジニアとして食っていけるレベルのスキルが身に付く
  • IT業界はリモートワークできて給料が高く、AIやらIoTやら最先端の技術を扱っているキラキラした世界だ

前者はプログラミングスクールに対する幻想、後者はIT業界に対する幻想です。

スキルが身につくかどうかはあなた次第

例えば、あなたがジャグリングを教えてくれるスクールに通ったとしましょう。ボールとかトーチとかをめっちゃ器用に扱うアレ。

「ジャグリングスクールに通えば食っていけるだけのスキルが身に付く!」と思いますか?思わないですよね。

スクールで教えてもらえるのはあくまで基礎。プロのジャグラーとして食っていくにはそこから終わりのない研鑽が必要ですし、技術だけではなく観客を楽しませる工夫も必要です。そもそも適性がなければアマチュアレベルにすらなれないのは想像に難くないでしょう。

ジャグリングできないのにエラそうなこというのもアレですが。

プログラミングスクールも同じことです。基礎は教えてもらえるでしょうが、それだけでは食っていけるレベルにはなりません。顧客を楽しませる必要はありませんが、報連相などの最低限のコミュニケーション能力がなければ仕事はできません。「エンジニアはコミュニケーション能力がなくても技術さえあれば務まる」と思っている人もいるかもしれませんが、個人事業でアプリやサービスで一山当てようとしない限り、進捗報告や困っていることの相談など最低限のコミュニケーション能力は必要です。

そして、ジャグラーがプライベートでも技を磨いているのと同様、エンジニアは生涯勉強だと思ってください。少なくとも技術の習得をを趣味として楽しめない人はエンジニアとしての適性がないと思ってください。特にウェブ業界は技術トレンドの移り変わりが激しいので就職してから苦労しますよ。

ただ、エンジニアの適性がないことが人間としてダメなわけでは決してありません。エンジニアに向いていないなら別の業界に行けばいいだけで、エンジニアが偉いわけでも何でもありません。むしろエンジニアは(自分を含め)色々な意味で性格がひねくれている人が少なくないので、エンジニアに向いていないからといって落ち込む必要は全くありません。

バグを探すために普通の人がやらないような操作を考えたり、境界値テストのために数値に厳密になったりするのがひねくれる原因でしょうか。それともひねくれている人じゃないとバグ探しや厳密なテストができないからエンジニアに向いていないのでしょうか。

自社プロダクトだけのIT企業は多くない

有名なウェブサービスを目にして「こんな業界に入りたい!」と夢見る人もいるかもしれませんが、自社プロダクトを持っているIT企業の割合はあまり高くありません。正確な数値は知りませんが。

そして多くの企業は受託開発やSESなどをメインの収益としていて、自社プロダクトを持っている企業でも受託開発もやっているところは少なくありません。

そのため、自社プロダクトを持っている企業に入社する=そのプロダクトを開発できる、とは限らないことに注意してください。

プログラミングスクールについて

スクール自体は悪ではない

まずは当たり前の話ですが、個々のスクールの実態は置いておいて、プログラミングスクールという存在自体が悪いわけではありません。

そしてプログラミングスクール界隈にはよろしくない話が色々ありますが、スクールの内情を知っているわけではないのでこれ以上は掘り下げません。おすすめのスクールとかも知りません。

とは言っても身構えてしまう

とは言っても、応募者がスクールの卒業生だとわかると多少身構えてしまうのは事実です。というのも、明らかにスクールの授業で言われたままに作ったであろうウェブサービス(架空のショッピングサイト等)をそのままポートフォリオとして提出してくる人がいるからです。最近ではポートフォリオのウェブサービスがRailsで作られていると身構えるようになってしまいました。

せめてこれくらいの質問には答えられるようにしてほしいです。

  • 苦労したところは?
  • 工夫したところは?
  • セキュリティー面で気をつけたところは?
  • 今後改善したいところは?

自分で作ったものを理解できていますか?

別に「プログラミングは好きになったけど、何を作ればいいかわからないからとりあえず課題に出されたものをポートフォリオにした」でもいいんですよ。個人的には。

ただ、それならフレームワークのテンプレを何も考えずに使うのではなく、自分なりの工夫がほしいですね。

例えばJamstack構成にしてみたとか、WebSocketを使ってリアルタイムで情報更新できるようにしてみたとか。

あるいはオレオレフレームワークを作ってみた、とかでもいいんですよ。業務でオレオレフレームワークなんて使われたら迷惑もいいところですが、仕組みの理解という観点の学習題材としては決して悪くないと思っています。

大手内定率10%?

「当スクールはキラキラホワイト大手IT企業の内定率が10%です」と聞いてどう思いますか?

「てことはワイもこのスクールに通ってキラキラホワイト大手IT企業を100社受けたら10社くらい受かるんやな!」

なわけねーだろ!

一応ね、念のために説明するとね、「当スクールの卒業生のうち、10%の優秀な子たちがキラキラホワイト大手IT企業に内定しました」という意味です。

そしてその優秀な子たちは、もともとセンスというかエンジニアとしての適性があったので、プログラミングスクールに通わなくても自学してキラキラホワイト大手IT企業の内定をもらえる可能性はかなり高いでしょう。今は情報があふれているので、その気になればプログラミングくらいいくらでも無料で学習できます。

少なくとも、スクールの授業内容を理解しないままコピペしたり、プログラミング自体を楽しめない人はキラキラホワイト大手IT企業とは無縁だと思ってください。

IT企業に応募する前に

それでもエンジニアになりたい人は、闇雲にプログラミングをするのではなく、ちょっと立ち止まってこんなことをしてみましょう。

遠回りに見えるかもしれませんしあまり興味がわかないかもしれませんが、プログラミング「しか」できないライバルより確実にリードできます。

英語を勉強しよう

英語圏で仕事をするのでなければペラペラになる必要はありません。しかし、エンジニアとして生きていくのであればある程度の英語力がないと壁にぶち当たります。

例えば、エラーメッセージが英語で表示されるものも多いです。エラーメッセージに使われる単語のパターンはあまり多くないので慣れれば読むのもそこまで大変ではないのですが、英語と言うだけで拒否反応が出るレベルだとこの先大変ですね。

また、ライブラリーやフレームワークなどでわからないことが出てきたら、一次情報(大抵英語)を確認することも大事です。

最近は自動翻訳の精度も上がってきているので、英文をぶっこめばニュアンスどころか自然な日本語と遜色ないレベルで翻訳される場合もあるんですけどね。

ソフトウェアの品質を高めよう

ソフトウェアは一度作っておしまいではありません。後から機能を追加したり、バグがあれば修正もします。

そのために必須なのがリファクタリングテストです。

リファクタリングは、プログラムの外から見た動作を変えずに中身を作り変えることです。勢いに任せてコーディングしたり、うまい解決方法が思いつかなくて強引な方法で実装したりといったことは誰しもあると思います。そんなコードを読みやすく書き換えるのがリファクタリングです。

読みやすいコードについては、以前Qiitaに書いた「読みやすいコードを書くために」もごらんください。

テストは、「作ったコードはこう動くべきだ」というテストコードをあらかじめ書いておいて、そのテストコードをパスするように実装をしていきます。「こういう入力に対してはこういう出力が返るはず」「こういう入力に対してはこういうエラーが返るはず」のように、正常系だけではなく異常系のテストもしっかり書いてください。というか異常系のテストのほうが重要です

テストの主な効用は以下の3つです。

  • バグがあったらすぐにわかる(テストの本来の目的)
  • テストコードが使い方のマニュアルにもなる
  • 大規模なリファクタリングを気軽に行える

特に最後は重要です。リファクタリングが関数内やファイル内で完結する場合はあまり問題になりませんが、全体の見直しで色々と構成を変更する場合は「どこか変更漏れがないかな?」と不安になってきます。そんなときにちゃんとテストを書いていれば、「テストが通ったから変更漏れはない」と断言できるようになります。

さらに今は、コードに変更を加えるたびにテストを自動的に走らせることもできるようになりました。GitHubにもコードをpushしたらテストを走らせる仕組みがあるので、わざわざ能動的にテストを実行しなくてもエラーがあればすぐにわかります。

リファクタリングやテストのことをスクールで教えてくれるのかは知りませんが、ソフトウェアの品質を高めるにはこれらは必須です。キラキラホワイトIT企業はまず例外なくこれらを重視していると考えてください。

個々の言語やフレームワークより、コンピューターサイエンスの知識を

ウェブアプリケーションを作るためにRubyの書き方やRailsの使い方を覚えるのはもちろん大事ですが、一通り覚えたらその次はより低いレイヤーであるコンピューターサイエンスの知識を身につけることをおすすめします。

具体的には、アルゴリズム・計算量などの理論からOS・プロセス・スレッドなどのコンピューターが動く仕組み、さらにネットワークやセキュリティーなどの知識などがあります。ぶっちゃけとてつもなく広いです。

これらの知識を身につけると、新しいもの・未知のものへの理解が早くなります。

例えば新しい技術が出てきたときに「この技術の応用だな」のように要点をサッと理解できたり、ややこしいバグに直面したときに「こういう動作をするということはここが原因だな」と当たりをつけやすくなったりします。こういったことができるかどうかでエンジニアとしての価値が大きく変わると言っても過言ではありません。

何より技術を楽しもう

色々作ってGitHubに公開してみましょう。あるいは技術を調べてQiitaZenndev.toなどに投稿してみましょう。

何より、これらの作業を楽しみましょう。好きこそものの上手なれ。

おわりに

ちょい長くなるかなと思ったら、思ったより長い記事になってしまいました。色々書きすぎてビビってしまったらごめんなさい。

趣味を仕事にして必ずしもうまくいくとは限りませんが、エンジニアの世界は技術を趣味にできないと間違いなく辛いです。がんばってください。

0 件のコメント:

コメントを投稿