エンジニアとしての成長スピードを上げるための4つの心構え

# はじめに
この記事は、[Why you learn the most when you feel like you’re struggling as a developer](https://medium.freecodecamp.org/why-you-learn-the-most-when-you-feel-like-youre-struggling-as-a-developer-7513327c8ee4)を翻訳したものです。

この記事を読んで、毎日の仕事の中で少しだけ心構えを変えるだけで、エンジニアとしての取り組み方が変わり、成長スピードが早くなると感じました。

英語を日本語に直訳すると不自然で読みにくくなるため、主張を壊さないことを前提に意訳します。ミス等あれば指摘ください。


# エンジニアとしての成長スピードを上げるための4つの心構え

私が開発スキルが大きく上がったと感じる瞬間は、めげずに頑張って新しいことを学んだ時、そして諦めなかった時である。それが簡単なことだと感じたことはない。ただ、小さな心構えを見つけたことで、困難を乗り越えられるようになっただけだ。

難しい技術的な問題に直面した時、当たり前のようにフラストレーションがたまる。私も時にはフラストレーションを抱え、直面する問題を投げ出したくなる。このような状況では、もっと自分にできることに時間を使いたくなったり、そもそもこの問題は自分のレベルを超えているんだと感じてしまうものだ。それは私だけの話ではないと思う。

Reddit（アメリカ版2ちゃんねる）では、授業で課された問題について議論が交わされている。そして自分自身もプロフェッショナルなエンジニアと会話する。彼ら彼女らは、同僚が簡単にやってのける複雑な問題すら、自分には把握する能力がないのではないかと不安になっている。

簡単な話ではないが、そのような問題に辛抱強く取り組むことはとても価値のあることである。ここ数年間かけて、私はこのような難しい局面を乗り越える手助けとなる心構えを作りあげてきた。

以下は、そのような問題に対して私を奮い立たせてくれる心構えである。


## 1. 一生懸命取り組むことと努力によってエンジニアとしてのレベルが上がる

素晴らしいエンジニアになるために必要なのは才能か、それとも一生懸命取り組むことか？

一部の人は素晴らしいエンジニアとして生まれて、ほとんどの人は努力を通じて素晴らしいエンジニアになると思うか？

この質問に対する答えは「分かるわけがない」である。だから私は、**努力を通じてエンジニアとしてのレベルが上がっていく**と信じるようにしている。

つまり、必死になって何かを習得しようとすることが一生懸命取り組むことをしていることに繋がると考えている。

物事がいつも簡単で楽しいとは限らない。一生懸命で時には辛い取り組みは必要なのだ。

## 2. 初めての事に取り組むことは概して難しい。そしてすぐに得意になることはない。

エンジニアとして、自分が理解すべきだとわかっているけれど理解できないことに直面すると非常にフラストレーションがたまります。

gitを使っていてgitのエキスパートがたくさんいる会社に入ったことがある。
得意だと思っていたSQLのスキルがそうでもなかったと気付いたときもある。

これらの例においては、gitやSQLのようなスキルが得意であるべきだと思っていた。結局自分は何年もの経験を積んだフルスタックエンジニアではなかったのかという不安にも狩られた。

結局、私はたくさんの経験を積んだエンジニアであるにも関わらず、その現実は変えることができなかった。私はそれらのスキルをしっかりと始めから学ばなければいけなく、最初はどちらも全然できなかったのだ。

新しく何かを学ぶことは簡単なこともあるけれど、難しいことも多い。ここで私は、**初めて学ぶことが最初からそんなに得意になることは少ない**と感じた。

こんな感じだ。

「Javaはやったことがないから得意なわけはない。だから私はこの講義を受けているのだ」

「gitレポジトリにコミットしたことはないからやり方が分かるわけがない。だから同僚に助けを求めているのだ」

このような考え方は「私はダメダメで失敗してしまうだろう」という心の声を和らげる。「絶対失敗する」というのも「きっとダメだろう」という考え方もよくない。**初めてだからきっとうまくいかないだろう、だからやってみるんだ**という考え方が成長につながる。

## 3. コードを書くことはいつも楽しいとは限らない。そしてタスクが楽しくなくてもやり遂げなければならない。

時々、開発において楽しくないタスクと出会うことがある。

Spark clusterでのデータ加工のコードの一部によりノードがランダムに失敗する。もしくは、絶対動くはずのライブラリがどう頑張っても動かない。

これらの状況は楽しくない。動くとわかっている他のタスクに時間を使いたくなる。

結局、コーディングはいつも楽しいわけではなく、時々は「やるか！」と自分を奮い立たせてやるしかない。たとえ難しいと感じても、絶対に希望の光はある。**困難なことに取り組むことでの学びが一番多いのである。**


## 4. とても困難な局面に出くわした時に学びは一番大きくなる。時には失敗してもそれが普通である。

自分には難しすぎる問題に必死に取り組んでいる時、とても学びが多いことに気が付いた。

例はたくさんある。

> - 初めてプログラミングの本を取った時があった。とても苦しんだがなんとか理解しようともがいた。そしたら突然コードを理解できた。

> - 今までよりも大きなアプリケーションを設計した時があった。なんとか頑張った結果、エンタープライズアーキテクチャを発見し、デザインパターンも学ぶことができた。その時、数カ月かけて構築したコードを全て捨てて、1からやり直したが、新しいデザインパターンでは数週間でアプリケーションを完成させることができた。

> - 本気でSQLを学ぼうとした時がある。その後、自社のデータサイエンスチームで仕事ができるスキルを手に入れることができた。

> - 自社のデータプロセシングのインフラをweb-appの技術を使って構築しようとしたことがある。頑張った結果、データレイク、ETLパイプライン、分散コンピューティングについて学ぶことができた。

それぞれの経験において、苦しい瞬間があった。なんども行き詰まったし、たくさんのコードを書いては消した。たくさんのことを試して、たくさん失敗した。たくさんである。

しかし、このようなプレッシャーのおかげで新しいスキルを身につけられたし、エンジニアとしてのレベルが上がったと思う。このようなプレッシャーがなかったら、こんな心構えも気がつかなかった。

最近は、**キツイなと感じるときや、もがき苦しんでいるときや、少しナーバスになっているときは、良いことだなと思うようにしている。もがき苦しんでいるのだ、だから学んでいる。**

そして、そのようなナーバスな気持ちを受け入れるようにしている。決して気持ちがいいものではない、しかしそれによる学びはとても価値のあるものだ。

**心構えは強力なツールである。あなたは何を信じるかを決めることができる。そしてそれは困難を押しのける勇気を与えてくれる。そうすれば最終的には素晴らしいエンジニアになることができるだろう。**

ここで紹介した心構えが、困難を乗り越える助けとなることを願っている。

諦めるな。進み続けろ。

何か理解できないことがあっても、努力を続け、理解しようとしろ。やってみるだけで、自分がどれほど能力があるか驚くだろう。