とあるお兄さんの雑記

基本的に技術系の内容を書きますが、何を書くかは私の気分です。

エンジニアとして早く成長する方法とは~vol.3

ある日友人から以下のブログのネタをいただきました。なにげ最終回です。

第1弾:エンジニアとして早く成長する方法とは~vol.1
第2弾:エンジニアとして早く成長する方法とは~vol.2

テーマ→人の成長
エンジニアの世界にもいろんな技術があるけど

  1. 何か一つの技術を極めてから、他の技術に手を出す
  2. いろんな技術に触れ、自分の好きや得意を見定めてから極める

どっちが成長できるのか?

人の成長と考えると非常に広いテーマになりますが、一旦ここはエンジニアに限定して話を進めることにします。

加えて、一人で考えてもそれは独りよがりな考えにしかたどり着きませんので、周りの知人に上記についてどう考えるかを聞いてみました。いずれも一意見ですので、批判することなく、参考程度にお願いします。

※意見を聞いた当時の状況をできるだけ再現したいと思い、「対話形式」で書いています。誰一人として対話なんてしていないのですが、まぁ、そこはご容赦ください。

Dさんの考え

:上記のテーマについてどう考えますか?
D:...。
:...? Dさん...?
D:...。
:...?

~~~~~~~~~~~~~~~~ 質問後、10分経過 ~~~~~~~~~~~~~~~~

:(時間が経ちすぎて、質問を忘れちゃったかもしれない。もう一度聞くか。)
:もう一度お聞きしますが、上記のテーマについてどう考えますか?
D:...。
:...?
D:...。
:...。

~~~~~~~~~~~~~~~~ 質問後、20分経過 ~~~~~~~~~~~~~~~~

:...。
D:...。
:(...ただの屍かな?)

~~~~~~~~~~~~~~~~ 質問後、30分経過 ~~~~~~~~~~~~~~~~

D:人によりそうですね。
:え...?あ、先の質問の回答ですかね?
D:はい。

:もう少し、具体的にお願いできますか?
D:その人の適性によるんじゃないでしょうか?

:...少し、質問を変えましょう。この30分でどう考えたらそうなったんでしょうか?
D:いや、いろいろ考えたんですが、「成長」というアバウトさしかないので、どうしてもこういう回答しかできないんですよね。

D:例えば、私は2つの視点で考えてみました。
:ほう。2つの視点とは?

D:一つは他者から求められる場合の視点です。
D:要は他者から求められている技術を学べばいいという考えです。
D:例えば、その人がSE(システムエンジニア)として求められているならば、SEとして求められる分野だけできればいいので、一つに特化したほうがいいと考えます。
D:一方で、研究職など他者から創造性を求められるような技術の場合、様々な場面に対応しなければいけません。そうなると、広く浅く技術を学んだ方が良いと思います。

:なるほど。では、もう一方の視点というのは?
D:もう一方の視点は、自分視点、というかモチベーションですかね。

D:私はどちらかというと、1つを完璧にこなしたいと考える人です。そのため、1つを完璧にこなすことを目標としてモチベーションが維持できるのであれば、前者を選べばよいかと思います。
D:一方、複数に手を出した方がモチベーションを維持しやすく、成長していると実感できるのであれば、後者でよいと思います。
D:このあたりはその人の好みに分かれるので、どちらが勝っているとは言えません。

D:そんな風に考えた結果、人によるという回答をしたのです。
:なるほど。Dさんなりに考えた結果の回答だったのですね。ありがとうございます。

Dさんの結論

  • 他者から求められる場合

    • ある技術だけを求められるのであれば、その必要とされる技術を極める
    • 他者から創造性を求められるような場合、様々な技術を広く浅く学ぶ

  • モチベーションの維持を考える場合

    • 一つを完璧にこなすことでモチベーションを維持できるなら、一つの技術を学ぶ
    • 複数の技術に手を出した方がモチベーションを維持しやすいなら、複数の技術を同時に学ぶ
    • ただし、その人の学習スタイル(性格)によるので、どちらが勝っているとは言えない。成長していると実感できる方を選べばいい。

Dさんの余談

:できれば、考え方の過程までも言語化して話していただきたかったです。
D:まぁ、私は文章書くのが苦手なので(笑)。
:そういう答え方をするところがDさんらしいと思ってしまいます。

kurasherの考え

:上記のテーマについてどう考えますか?
kurasher(以下、k):私としては、前者の一つの技術を極めてから他の技術に手を出す方が良いと思います。

:それはなぜでしょうか?
k:これは私の経験論ですが...。私は初めにJava言語を学びました。そのおかげもあってか、他のプログラミング言語を学習するときのコストが低かったんですよね。
k:と言っても、ほとんどJavaPythonしか書けないのですが。
:確かに、C言語や、Java言語から入れば、お互い似ているところも多いため戸惑うことは少なくなりますね。
k:そうですね。

k:ただ、条件があると思っています。
:条件とは?
kできるだけ基礎の広いものを選ぶべきだと考えています。
:基礎の広いもの?それはどういうことでしょうか?
k:基礎が広いものを初めて学習する場合、基礎が広いため勉強自体が大変です。しかし一度自分のものにしてしまえば、基礎が広いため基礎の上に乗っかる応用的な技術も広く習得できると考えるからです。

k:ちょうど下の図が分かりやすいかもしれません。三角形の黒く塗りつぶされている部分を基礎の部分とし、その上に乗っかっている白い三角形を応用的な部分としましょう。

f:id:kurasher:20200821215250p:plain
基礎が広い技術(左の赤い三角形)と狭い技術(右の濃い緑の三角形)。 基礎の広さで、応用できる技術の数が変わる

k:左の赤い三角形は基礎が広い技術です。プログラミング言語で言えば、Java言語やC言語にあたります。基礎が広いため学習コストは高いかもしれませんが、一度分かってしまえば、他の言語にも応用が利きやすいです。
k:一方、右の濃い緑の三角形は、左の三角形に比べ基礎が狭いです。基礎が狭いため学習コストは低いものの、応用が利きづらいというデメリットがあります。プログラミング言語で言えば、難解プログラミング言語のひとつであるBrainfuckでしょうか。
Brainfuck?とは何でしょうか?
k:ググってください。
:...。
k:...。

:...えと、話を戻しましょうか。
kurasherさんは基礎が広いモノからやるべきとおっしゃっていました。しかし、例えばプログラミング言語を初めて学ぶ場合、初学者からすればどのプログラミング言語が基礎が広く応用が利きやすいというのは分からないと思います。
:その場合、初学者はどうすればよろしいでしょうか?

k:難しい話ですが、まずは自分の目的に合わせたプログラミング言語を学ぶべきかなと。
kDさんがおっしゃっていたように、業務で求められる技術があれば、優先的にそれを学んでいけばよいのではないでしょうか?
k:社会人が求められることが、究極は社会に利益を還元することだとするなら、社会に還元できない技術を学んでも誰も喜ばないでしょう。
k:それぐらいだったら、現在求められる技術を学んで社会に利益を還元したほうが良いかと考えます。

:なるほど。まずは、自分の置かれた状況に合わせて必要な技術を学ぶと。
k:そうですね。もし、それで「このままやっていけるのか、成長できるのか」という不安がよぎるのであれば、欲張っていろいろな技術を学べばいいと思います。
:...? ...そうすると、いろいろな技術に手を出し過ぎてしまって、触れた技術すべてが中途半端になってしまいそうな気がしますが。
k:学んでいるうちに自然と優先順位がつくのではないかなと思います。

k:面白そうなものだから触ってみたけどあまり自分に合わなかったとか、反対にこれは学びやすかったとか、この技術は業務で必要になりそうだからとか。
k:自分でつけた優先順位で技術を学んでいけばいいと思います。

:なるほど。ですが、もし学びたい技術が複数になり、さらに優先順位的にも差がつかないような場合はどうすればよいでしょうか?やはり、一つに絞ってやるべきでしょうか?
k:その人の性格によるとは思いますが、必ず一つに絞らなければならないと思うのはあまりよくないように思います。むしろ、欲張って複数やってみるのも面白いのではないでしょうか?

k:そもそも、エンジニアという世界は一つの技術で完結するものではありません
k:データベースやネットワーク、クラウドなどあらゆる仕組みを知っておかないといけません。そう考えるとエンジニアになるということは、複数の分野を学ぶのが普通のことのように思えます。

:そうかもしれません。しかし、「二兎を追う者は一兎をも得ず」ということわざ通りになりそうな気がしますが。
k:だったら、なぜ失敗したのかを考えてみましょう。そして、失敗を次につなげないようにどうすればよいかを考えればいいかと思います。
k:「実践してみたら確かにことわざ通りだった、残念だったね」で終わるのは簡単です。しかし、そこから一歩踏み込んで考えてみるのも大事だと思いますよ。
:なるほど!ありがとうございました。

kurasherの結論

  • 一つの技術を極めてから他の技術に手を出す方が良い。

    • ただし、できるだけ基礎が広いものを選ぶこと。基礎が広ければそれだけ応用も利きやすい。

  • どの技術から学べばよいか分からない場合、自分の置かれた状況で最も求められている技術から学んでみる

    • もし、成長している実感が湧かなければ、さらに他の技術も学んでみること

  • 二兎を追う者は一兎をも得ずか?

    • 結果的にそうなるかもしれない。しかしそれだけで終わらず、なぜ失敗したのかを考え、次に失敗しないようにするにはどうすればよいかを考えるように!

最後に

:お話いただきありがとうございます。最後に2つお聞きしたいのですが、よろしいでしょうか?
kurasher:はい、何でしょう?
:まず一つ目ですが、このように複数の選択肢があった場合、人によっては「バランスが大事」というアドバイスを出す方もいらっしゃるかと思います。
kurasher:確かに。いらっしゃるでしょうね。

:経験者やある程度勉強を積んだ人であれば、どうバランスを取ればいいか分かると思います。
:しかし、初学者からすると、バランスのとり方が難しいように思います。その場合、どうすればよろしいでしょうか?

kurasher:バランスのとり方が分からないのであれば、一方に全振りしてもいいのではないでしょうか。
kurasher:どれかに全振りした際に、「このままではダメだ」という状況がいずれ来ると思います。その際に、ちょっとずつ比率を変えてどの配分にすれば自分の成長を実感できるのかを調べていけばいいと思います。
kurasher:いきなり、バランスを取れと言われても難しいですからね。
:なるほど。ありがとうございます。

:では、もう一つの質問ですが、
kurasherさんは、将来どのようなエンジニアになりたいですか?

kurasher:そうですね...。具体的に決まっていれば話せるんですが。
kurasher:残念ながら「こんなエンジニアになりたい!」って特にないんですよね。
kurasher:決まっていれば、こんなところで悩んだりせず、すでに動き出していると思うんですよね。

:...なる...ほど...。
kurasher:...反対に、質問しても大丈夫でしょうか?
:あ、はい。大丈夫です。何でしょうか?
kurahser:...ーーさん、あなたならどのようなエンジニアになりたいですか?

:私ですか?私だったら...

:...私はあなたです。あなたが進む道を私も自然と進むのだと思います。

:いま、どんなエンジニアになるか分からなくても。

:先ほどあなたが言ったように、全振りしてバランスの比率を決めてから、どんなエンジニアになりたいかを決めてもいいじゃないでしょうか?

:それが、私らしい決め方、生き方なのだと思います。

~~~~~~~~~~~~~~~~ 終わり ~~~~~~~~~~~~~~~~