プログラミング修羅道。新しい技術や知識を学習するのに疲れ果てたプログラマー達へ。

##次々に生まれては消える技術と足りない学習時間。消えゆくモチベーション 
異国でのコロナロックダウンと、長年やっていたビジネスのシャットダウンを受け、昔やっていたプログラミングを再度勉強し直し始めて早１０か月あまり。 
最初は２０２０年のモダンな環境で、フルスタックというネーミングに憧れ、とりあえずウェブサービスを作れるくらいになりたいなぁと始めたのですが、やればやるほど深みに嵌っていく底なし沼。次々に現れる新しい敵。毎月開発される新しいライブラリやフレームワーク。どんどんdeprecatedになり、使えなくなっていくモジュール類。アップデートされる言語仕様。半年も経てば移り変わるトレンド。 
何かを一つ手に入れたと思えば、過去に手にしたものを忘れ去り、何かを実装しようと思えば、さらに新しい概念の習得が必要となり、まさに砂漠に水を撒いてるような感覚になり、モチベーションが下がる。多分、ほとんどのプログラマー諸先輩も経験されているのではないかと思います。 
自分もこういう穴に孤独に嵌りつつあり、他の神の様なトッププログラマー諸先輩は、どのようにモチベーションを保ち、学習時間を確保し、どういう勉強方法で次々に新しい技術にキャッチアップしていってるのかに興味が湧き、沢山の前線にいるプログラマーの生の声を掘っていくと、驚くほど皆同じような事を言ってるんだよね。 
で、これはシェアする価値があるんじゃないかと思ったので、備忘録的に書いてみるよ。  
##プログラミングで一番重要なスキルはgoogling  
どのプロフェッショナルなプログラマーも言ってるのは、検索スキル。これは自分の知りたい事やエラーの解決方法を的確に調べて解決するスキルの事。プログラミングでは非常に重要なワークフローで、時間の大半はリサーチや検索作業に費やしているといってるプログラマーが本当に多いね。
ここで重要なのは、分からなければググれ　では無く、ググるという作業自体がすでにプログラミングの超重要な部分を占めているという事。 
で、具体的なサイトとしていつも上がるのが、https://stackoverflow.com/ と MDN(https://developer.mozilla.org/en-US/)。 
あと、重要だと挙げられているのは、**公式ドキュメントをちゃんと読め**。という事。てめえの知るべき事は、全てはそこに書いてあると。
##プログラムは暗記するな。時間の無駄  
ほぼ、どのデヴェロッパーも言ってるのが、個別の関数やモジュールなんかは覚える必要なし。で、それを一生懸命やっているとするなら時間の無駄である。という事。一番重要なのはコンセプトを理解すること。個別の関数やシンタックスは、その都度ググればよい。プログラミングに関する事なら、１００％オンライン上にドキュメント化されている。 
脳の記憶は一度覚えると変わらないけど、プログラミングの世界は絶えず変わっていってるので、それはすぐに役に立たないものになる。
##コンセプトを理解する  
色々なプログラミング言語が世の中には存在するが、コンセプトは共通しているものが多い。 
プログラムをコントロールする仕組み。ループや条件分岐、データ型の考え方はほぼ全ての言語で共通しているので、違いは書き方の違いだけである。なので、これを理解しておけば、どんな言語でも理解が容易になる。あとは、データ構造とアルゴリズム。 
また、個別の関数レベルでも、覚えるべきはコンセプト。例えば、DOMはどういうコンセプトで操作するのかを理解すれば、個別の関数は覚えなくても良い。そうすれば、覚えるべきことはグッと少なくなる。
個別の関数や、シンタックスは覚えてもきりが無いので、時間の無駄。でも、コンセプトはきっちり理解しよう。
あと、プログラミングの入門として、pythonかjavascriptをリコメンドしている人が多い印象。
##ラビットホールに嵌るな。自分の手で自分のプロジェクトを作れ  
最初に新しいことを学ぶ際は、YouTubeやUdemyのチュートリアルはとても役に立つし、コードを真似して書いていくことで学べる事は沢山ある。 
ただ、人のコードをなぞったりコピーしてみて何かを作っても、いざ自分が一から何かを作ろうとしたときに、全く何からやっていいのか分からないというパターンに陥ることがほとんどである。
何かに行きつくには、プログラマーがいればそのプログラマーの数だけ方法があり、道筋がある。一つの正解しかないという事はあり得ない。 
なので、自分の手を汚す。小さなスニペットでも良いので、自分のプロジェクトを作って、自分で自分のコードをググりながら書いてみることが何よりも重要で、そこから学べる事はけた違いである。
練習用のプロジェクトとして、出来るだけ人のコードをコピペせず、自分の興味のあるもの、機能が１－２個だけの小さなプロジェクトから始めると挫折せずにやりやすい。
##本当に重要な技術はそんなに沢山無い 
日夜新しいライブラリやフレームワークが開発され、リリースされ、ネット上には膨大な情報やそれにまつわるチュートリアルや解説をしているコンテンツがあるし、そういうのを見ていると、ストレスが溜まるし、燃え尽きる様な気分になると思う。ただ、本当にあなたにとって重要なものはそれほどあるわけでは無い。
自分が何がやりたいか、それには何が必要なのかを冷静に考えると、本当に必要な技術はそれほど多くないことに気付くはずである。 

##コードを書く時の3原則
- KISS(Keep It Simple Stupid) : コードはstupidな位シンプルにしろ
- DRY(Don’t Repeat Yourself) : 繰り返しは極力避けろ(１つの使い回せるファンクションにまとめる)
- YAGNI(You Aren’t Gonna Need It) : 今実際に必要なコード以外は書くな  

##どんなデヴェロッパーも最初からエラーの無いコードが書けるわけではない  
最初に書くコードは、エラーが出ることが普通。 
YouTubeとかで、どんなにスムースにコードを書いてる様に見えるプログラマーでも、相当に事前にリサーチをしてテストをしている。
一見凄いプログラマーでも、やっぱり新しい技術を覚えるときは、初心者みたいにYoutube見たりブログ見たり、オンラインのクラスをとったりして勉強し、自分で小さなコードを書いて、トライ＆エラーを繰り返しながら習得している。
ひょっとすると、「世界のトッププログラマーがやってる凄い学習法！Google、Amazonのプログラマーが絶賛！」みたいな釣り本的内容を期待された方もいるやも知れませんが、初心者も、経験のあるプログラマーも、結局学習のプロセスにはそんなに差がなく、とにかくググれ、書いてみろっていうのが共通して言ってることで、凄いプログラマーだから、何か特別な方法があるという事ではなく、ある意味対等なんだなあという印象を受けました。
というわけで、栄光に近道無し！  

***

やはり、基本は独学。自分なりの独学法を見つけたものが栄光への近道なのであって、無料で使える海外独学サイト一覧を作ったよ↓
[ビギナー向け、無料で最強の海外独学サイトリスト](https://qiita.com/monsoonTropicalBird/items/a5a89cc689a81e6ba71e)

###参考にした動画や記事　
https://www.youtube.com/watch?v=askbjJx-BQg&t=1s

https://www.youtube.com/watch?v=vP2MNhC_Igw&t=1s

https://www.youtube.com/watch?v=MHPGeQD8TvI
 
https://www.youtube.com/watch?v=Mj3QejzYZ70

https://www.youtube.com/watch?v=UPO-9iMjBpc