初学者目線で見たプログラミング学習において最も大切な｢質問する｣ことについて

# 0. はじめに
Laravelを使ったECサイトの共同開発を約3ヶ月行いました｡
その中で私が感じた最も大切な｢質問すること｣について私なりに書いてみます｡
初学者の方や､プログラミング初めてまだ間もない方､自分に自信が無い方などの考え方に少しでも良い影響を与えられれば幸いです｡

# 1. 共同開発について
概要
・開発期間:3ヶ月
・週1回のミーティング

構成メンバー
・開発チーム：未経験4名
・メンター:現役プログラマー2名(レビュー)


# 2. 質問について
今回学習していく中で私が一番感じたことは｢質問すること｣の大切さです｡
プログラミングしていく上で難しい箇所は数多くあり､詰まってしまうこと､どうにも手が出せずにフリーズしまうこと､あると思います｡
今回私はセッションを使ったカート処理について構築したのですが､これがもうほんとに難しかったです｡
よく自分の実装できるちょっと上の機能を実装すると能力が上がるなどと聞きますが､今回はちょっと上どころではなかった気がします｡(汗)

で､どうにも壁にぶち当たってしまい自分の力だけでは解決できないときにどうするかというと､誰かの力を借ります｡
つまり**｢質問する｣**わけですね｡
ですので､この**｢質問すること｣**ということに関しては共通して大事なことかと思います｡

# 追記: 大前提として
大前提を書いておくのを忘れるという大チョンボしでかしました!!(汗)
まずは信頼できるメンターさんを見つけましょう｡
質問できる環境があるかないかで成長できるスピードは大きく変わります｡
完全独学で成果が出るのはおそらく一部のスーパーマンだけです｡
少なくとも私のような凡人にはメンターさんは必須と言えます｡

### 自己の成長のための投資は惜しんではいけません｡
初学者の方(progate卒業したばかりの方)の次にやるステップは**メンターの確保**です｡
これは間違いないです｡

# 3.わからないところにぶつかったときに私が考えていたことはこんな感じです｡
･ わからないところがわからない
･ 質問したいけど質問の仕方がわからない
･ 質問したときに来る｢こんなこともわからないのか｣というダメ出しへの恐怖
･ 自分で解決したいという無駄なプライド
･ 自分で解決した方が身につくと考えるため
･ 考える時間が長くなりすぎて収集がつかなくなる
####こんなようなことを考えていたので無駄に時間を溶かしてしまっていました｡

### 順に細かく解説していきます
## ･わからないところがわからない
自分がいったいどこに詰まっていて何から手をつけてよいのかわからない状態ですね｡
かなり厳しい状態です｡実装したこともないコードを実装するには何から手を付ければいいのかわからないですよね｡(初学者であれば特に)
####解決策
→それをするためにはどうしたらよいかタスクの洗い出しを行う
→タスクの洗い出しすら難しいときもあるのでその場合はタスクについてからまず質問を入れる

### ･質問したいけど質問の仕方がわからない
どうやって質問していいかわからない
質問の仕方がわからない状態ですね｡
ダメな例ということで私が初期の段階でした質問はこんな感じでした↓

>とりあえずコードは書き写しましたが､イマイチよくわかりません｡
関数を見るとやっていることはわかるのですが､何故この関数を使うに至ったのか､どういう思考法､どういうググり方でこの解法に至ったか教えていただきたいです

ダメダメですね｡｡

その節はメンターさんに大変ご迷惑をおかけしました｡
####解決策
→質問のテンプレートに沿って質問する｡
(初期の頃はみんなテンプレート使ってるなぁとは思っていましたがテンプレートを使いこなすことすらできませんでした｡)

→情報が必要なのか不必要なのかわからない場合はとにかく全部書く｡情報は足りないよりは多すぎるくらいがいい｡

## ･質問したときに来る､｢こんなこともわからないのか｣というダメ出しへの恐怖
実際一番恐れていたのはここですね｡
自分のちっぽけなプライドを守るのに必死でした｡｡
####解決策
→初学者のうちはわからないことだらけなのでしょうがない｡
おそらく相手も初学者にそこまで過度な期待していないはずなので､開き直る笑


##･自分で解決したいという無駄なプライド
####解決策
→無駄なプライドは捨てる｡
わからなくてもしょうがないと割り切る｡
開発が進まないと､結果皆に迷惑を掛けてしまうので無駄なプライドは一刻も早く捨てる｡
自分のちっぽけなプライドとチームスケジュールのどっちが大切かなんて､
大人だったらわかるでしょ｡


##･ 自分で解決した方が身につくと考えるため
半分正解､半分間違い｡物事には限度がある｡
####解決策
全く悩まないですぐに質問してしまうのはNGだが､
同じ問題で1日､2日､3日と時間を溶かしてしまってはムダでしか無い｡
自分の手札(使えるコード､知識)が少ないが中で悩んでも限界があるので早めに助けを求めるべき｡

## ･ 考える時間が長くなりすぎて収集がつかなくなる
･適切な質問時間を守らないと自分でどこまでやったのかわからなくなる｡
･試したことや調べたページの数が膨大になるので､質問しづらくなってしまう｡
# では､いつ質問するのか
こちらはいろいろな方が書いていたり､現役エンジニアさんからも実際に聞いていますが
# 15分が目安です
短っ!!って思いましたよね?私も思いました｡
ですが､
##｢Google人工知能チームのルール｣
>最初の15分は自分で解決を試みる
15分後も解決してなければ必ず人に聞く
前者を守らなければ他人の時間を無駄にし､
後者を守らなければ自分の時間を無駄にする｡

というのがあるらしく､天下のgoogleさんがそうなのだから実際そうなのでしょう｡
実際の現場ではこれくらい時間にシビアにならなければいけないということなんですね｡

#大事なことは質問力ではなくマインドセット
質問について書いてきてちょこちょこ触れてますがいちばん大事なのはここです｡
質問をすることで恥をかくかもしれませんが､プライドなんてあっても役には立たないことを常に意識することが大切です｡
｢聞くは一時の恥､聞かぬは一生の恥｣というありがたいことわざがあるように
自分のプライドを守ることではなく結果を出すことにこだわること｡
これが何より大事だなと思います｡

#良い質問の定義
できるだけやり取りが少なく終わること｡一回で終わったら理想｡
答えてくれる相手の時間を奪いすぎないこと｡


# 質問テンプレート
こちらは調べれば色々と出てくるのでサラリと流しますが､
最終的に私はこんな感じで質問するよう意識していました｡
###1.解決したいこと1行まとめ
###2.起きている問題について(起きている現象/エラーコード/スクショ)
→できるだけ詳細に
###3.ソースコード(関連するソースコード/全ソースコード)
→自分では想定していないところに原因があるかもしれないので､情報はたくさん提供しよう
###4.問題解決のために試したこと(コードもあれば追記)
###5.解決のために調べたサイト
→これをしないとメンターに自分の調べたサイトを貼られてしまうかもしれません｡
→実は調べたサイトの中に答えが書いてあり､自分で見つけきれていないだけかもしれません｡
###6.問題について自分なりの考察(デバッグ結果/原因/自分なりの原因予想)
→できれば(どうしようもないときは省略)

#追記: 質問力を上げるには
とにかく質問しましょう｡習うより慣れろです｡そのうちに段々と自分の能力も上がってきて的確な質問を入れられるようになるでしょう｡


# 知っておくと役に立つ(かもしれない)学習テクニック
これは私が学習中に教わった作業効率を上げる方法です｡
集中力が続かなくて悩んでいる方にはぜひ試していただきたいと思います｡

#ポモドーロテクニック
>ポモドーロテクニックは、「25分（集中）・5分（休憩）・25分（集中）・5分（休憩）…」のリズムで仕事をするという、取り入れやすく、かつ、効果も絶大な仕事術・時間術です。

本来人間の集中力とはそう長く続かないようにできているそうです｡
ですので､集中力が続かなくて悩んでいる方はそんなもんだと諦めていただいて､このテクニックを試してみてください｡
[JustFocus](https://apps.apple.com/jp/app/just-focus/id1142151959?mt=12)
↑こちらのアプリ簡単な操作で作業時間25分と休憩5分を計ってくれて使いやすいのでおすすめです｡

## ポモドーロテクニック活用術
私が考えるこちらのテクニックの使い方は
･15分作業､10分で質問作成し投稿､5分休憩､次のサイクルへ(15分計る必要あり)
･25分作業､5分休憩後にわからなければ次のサイクルで質問(初学者のうちは15分で質問
だと短すぎるかもしれないので)
このどちらかのサイクルで学習すると良い｡･･･と思う｡
適宜組み合わせて使用してみると効果が上がるかも｡

##アンビエントミュージック
環境音楽というもので､適度に雑音混じりのほうが人間は集中力が増すというエビデンスがあるみたいです｡

使ってみるとなるほど確かに作業に集中できます｡もっと早く知りたかった｡｡｡

[Weightless](https://www.youtube.com/watch?v=qYnA9wWFHLI&t=15s)


#どんなコードを書いていいかわからないときは
[実務未経験者が初めての共同開発経験をまとめてみた]
(https://qiita.com/ryota100100/items/6b48f38b34d1cebaac0a)
こちらの記事のこの方法が参考になります｡


>完成形は想像できるけど、どんなコードを書いていけばいいか想像つかないということが何度かありました。
ネットの記事もありますが、求めている実装は意外と無かったりしました。参考にする資料の幅を広げるのはすごく重要かなと思っています。
そこで、GitHubを使った検索方法が非常に役立ったので紹介します。
例えばlaravelのcontrollerファイルに絞って検索したい場合、
〇〇 path:/app/Http/Controllers/
例）laravelのviewファイルに絞って検索したい場合
〇〇 path:/resources/views/
これを、GitHubの検索欄にコピペして〇〇に調べたいワードを入力するだけです。
実際にsessionを使ったカート機能を実装するときは、〇〇にcart sessionと入れて参考にできる資料を探したりしていました。
この方法を見つけてから、実装力を上げることができました。

良記事ですのでこちらの記事にも目を通してみてください｡


## 自分でエラーを読み解くには
自分でエラーを読み解くための良記事教えていただいたのでリンク置いておきます｡

[エラーメッセージの読み方と対処, 検索や質問の原則](https://qiita.com/cannorin/items/eb062aae88bfe2ad6fe5)

やはり思考放棄はいけません｡
まずはしっかり自分の頭で考える｡
１次情報から解決を試みるなどしてから質問フェーズに移るようにしたいですね｡

#おわりに
ここまで駄文を読んでいただいた方ありがとうございました｡
質問することに悩む初学者の力に少しでも慣れれば幸いです｡
でもこんなこと書いていてもteratailとかは私もまだまだ怖いです｡
優しいメンターさんを見つけましょう笑