地元のプロコンで優勝し図に乗った僕は、業務に入り現実を知る

こんにちは。Webエンジニアの長期インターンでの業務を始め、早3ヶ月の@tsuboyataikiです。

いつもは簡単な技術的な記事を書いています。が、今回は「**図に乗っていた自分への戒め**」として、このような記事を書くことにしてみました。どうか笑ってやってください...。

# 高校時代の成果

僕は去年まで埼玉県の情報技術科の高校に通っていました。普通科高校出身の方からは想像がつかないかと思いますが、この学科では大学のように、実習のレポートや**卒業研究**のようなものがあります（正確には『課題研究』という）。

僕はその研究として、「**レシートの文字を認識し冷蔵庫の食材を一括で管理するAndroidアプリ**」を4人で開発しました（僕はそのリーダーでした）。夏休みも毎日実習室に引きこもり、進路も考えながらひたすら開発に没頭する日々でした。そして僕たちは、2019年11月に開催された「**埼玉県工業高等学校プログラミングコンテスト**」という地元の比較的規模の大きくない作品提出形式のプロコンに参加することになります（参加作品数は75とかだけどクオリティはピンキリ）。

結果、テーマ性・完成度・プレゼンのどれもが高く評価され、見事最優秀賞を受賞しました（[プロコン結果報告](http://www2.spec.ed.jp/krk/kogyo/saikouken/?page_id=59)）。正直めちゃめちゃ嬉しかったです笑。さらに後から先生に聞いた話によると、過去30年近く開催された中で、「２位との差が過去最大」かつ「Androidアプリでの優勝は初」という二つの快挙だったことを知らされ、僕はもう完全に舞い上がってしまいます。もちろん学内での研究発表でも、高い評価を得ていました。

<img width="710" alt="スクリーンショット 2020-07-19 21.02.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305969/1b498ebd-27d3-23a8-a691-03c54b2bb964.png">

# 自分...もしかして優秀...？

コンテストに参加していた会場の全員、校長先生、教頭先生、普段は厳しい学科の先生、家族や親戚、友人知人、先輩後輩。周囲にいる皆という皆が僕を祝福し、完全に持て囃されます。

こうなると、誰も僕の鼻を折ろうとしません。実際クラスメイトから来るプログラムの質問にも答えられて、授業での成果もあったので、僕自身が気が付くことなんてありません。完全に「**井の中の蛙**」状態です。

そしてコンテスト優勝から約1ヶ月。僕は公募推薦入試という形で、倍率高めの大学を受験しました。結果、見事『**不合格**』となりました（これは図に乗っていたからではなく実力で落ちた）。これを期に僕は少しずつ目を覚まします。浪人は経済的に厳しく、普通科でもなく予備校経験もない僕には非現実的と考え、専門学校への進学を決めます。

同時に、**『学歴』という大きなステータスを掴めなかった**という悔しさ、そして**「自分が井の中の蛙になっているかもしれない」**という強烈な危機感を感じ、「**開発スキルだけは誰にも負けたくない**」、「**得意分野を見つけたい**」という漠然とした目的から、長期インターンへの挑戦を入学と同時に決めます。

# 業務に入り現実を知る

2020年4月。Webエンジニアの長期インターンの面接で「一緒に働こう」と社長に言っていただき、熱い思いで入社しました。しかし、「俺はコンテストで多少成果出してるし、絶対に活躍して周囲の全員に恩返ししてやる」。僕の中の慢心はまだ少なからずありました。

そして「井の中の蛙かもしれない」という懸念は**思ったより早く、そして大きな現実**としてのしかかります。以下はそのリストです。

1. **Linuxなどのコマンドがまともに使えない&環境のセットアップが出来ない** → 学校での開発環境は先生がセットアップor統合開発環境なので、使えるのはせいぜい`ls`,`cd`,`cat`,`vi`くらい。なので「開発には仮想環境のDockerを使って、◯◯コマンドはDockerの中に入って操作して....」みたいな指示をもらってもちんぷんかんぷん。「環境変数ってなに？！」って感じでした。もちろんGitでのバージョン管理だって業務ではじめてやりました。

2. **「動けばいい」は許されない** → 「開発環境は整った！いざ鍛え上げた得意のコーディング！」。しかし、実装できただけで満足していた高校生の頃のプログラムと、実際の業務のプログラムとではまるで違います。例えば、「変数名やメソッド名、クラス名は既存コードや慣習に合わせ、勘違いされないように命名する」、「DBに投げるクエリや発生するインスタンスをきちんと確認して冗長なものがないかを調べる」、「動作確認後も、どこか外部の要因でエラーが発生しそうな場合のエスケープを考える」なんてことを考えながら実装します。時々コンテスト当時のコードを見ることがありますが、正直見るに耐えない部分が多くあります笑。

3. **ビジネスの視点&Whyで考えるという考え方を知らない** → 当たり前ではありますが、開発業務というプロセスは、ビジネスの一貫であり、企業やプロジェクトの目的・理念のもとにある活動であって目的ではありません。僕はコンテストに臨むにあたり、「世の中をこう良くしたい」という思いも持ちつつ、「コンテストで優勝したい」という思いを強く持っていました。プログラミングは確かに面白いし、コンテストで結果を出すことだって簡単ではありません。しかし、プログラムはあくまで『手段』であるにも関わらず、僕は目指すゴールを見間違えていたのです。だからこそ、「なぜこの修正issueが必要なのか」、「新規機能のビジネス的な着想はどこにあるのか」みたいな、『なぜ』、『どうして』が必要であり、僕に圧倒的に足りなかった考え方だったのです。

はい、以上から分かる通り、僕は世間知らずの小さな井戸の蛙だったわけです。
実際入社当初からリモートだったこともあり、環境のセットアップの時点でかなり苦戦し、たしか２日目くらいは本当に泣いていたような気がします笑。

現在は周りの社員さんの超絶丁寧なサポートを受け、なんとか小さなissueを担当できるようになり、もう直ぐ新規機能作成の大きな案件があるので、かなり楽しみです。

# コンテストは何だったんだろう...

ここまでの話の流れから、「じゃあコンテストっているの？」なんて声が聞こえてきそうです。まあ必要かどうかは置いといて、僕なりにメリット・デメリットをまとめてみます。

### メリット

- 比較的同世代同士での公平な競争ができる
- そこそこの開発技術は必要なので何もしていない人と比べると実力は圧倒的に付く
- スポンサーのつく大きなコンテストでは世間に名が知れ、顔が広くなる
- 自由にテーマを決め、自由に環境などを選べる

### デメリット

- コンテストで結果を出すことが目的になってしまいがち
- 実務での技術には及ばない
- ソースコードの綺麗さや内部的な動作の詳細は見てもらえない可能性が高い

僕が感じたメリット・デメリットはざっとこんな感じです。
先ほどまでプロコンに対するマイナスなところにばかり触れていましたが、コンテストの経験がなければ臆せず業務用の大きなソースコードを見れたり、ログに出る大量の真っ赤なエラーにビビらず対処したりはできなかったと思います。そして何より、「同年代の仲間と目標に向かって切磋琢磨」みたいな青春ドラマのような泥臭い経験はできなかったと思います。

ただそれが「**業務レベルに通用するか**」は別問題だったということです。

# 今僕はなにを目指したらいいだろう

Webアプリ開発の業務を始めた今、僕が「何を目指していけばいいか」が少しずつ見えてきました。それを漠然とした一言で表すと、『**自立したエンジニア**』です。あまりに漠然としているので、例をもってまとめてみます。

- 開発ツールなどのおかしな挙動の原因を特定＆対処ができる
- 使ったことがないツールやライブラリ、環境でも、設定ファイルやリファレンスなどから詳細を調べたりして対応できる
- レガシー・モダン問わず様々なシステム・環境構築ができる
- 実装だけでなく、ビジネス的視点からもプロダクトを俯瞰的に捉えられる

今の僕が目指している理想像はこのようなエンジニアです。幸い、現在のインターン先の企業は、尊敬できる技術力を持った素晴らしい方々ばかりです。まさに理想・目標といえる周りのエンジニアの技術を吸収しまくって、圧倒的に成長します。

# おわりに

最後まで僕の独り言に付き合っていただきありがとうございます。

こんなことをここで言うのもどうかという感じですが、今のインターン先の企業には感謝しきれないほど感謝しています。技術の「ぎ」の字もない僕に期待し、要領が悪くとも責めるようなことなく、常に解決に向けたヒントを提示してくれます。

自身の成長のため、会社のため、自社サービスを利用してくださるすべてのユーザのため、全力で成長してみせます。