質のいいプログラムを書くには　~できない人がやりがちなこととその対処法~

# はじめに
質のいいプログラミングができるようになるために、原因とその行為が引き起こす影響、そして対処法について書いていきます。
この記事は私が実際にプログラミングをしてきて感じた問題点とその対処法について書いたものです。
この記事の対象読者はまだプログラミングを初めて間もない方向けに書いてあります。
そのため、基本的な内容が多いかもしれません。
予めご了承ください。

# 原因1: 変数名が不正
変数名はプログラマーが自由に付けれます。
そのため、良く考えずに変数名を付けがちです。
## 影響
変数の役割が変数名から判断できず、ソースを読んで確認するハメになる。
## 対処法
その変数が何をしているのかを意識する。
その上で適切な変数名をつけることを意識する。
## 例
入力した数を2の乗数の値にする関数

`#悪い例
 a = int(input())
 b = 2 ** a
 print(b)
`

`#良い例
input_sum = int(input())
total = 2 ** input_sum
print(total)
`


# 原因2: エラーメッセージが読めない
いっぱい流れているエラーメッセージを読むことができない。
英語に対する苦手意識よりも、自分の思っていたことと違う結果が返ってきたことによる混乱が起きる。
単語の指示している問題点が理解できないため英語が読めない以上の混乱を招いている。
## 影響
意図した処理がいつまでたっても終わらない。
## 対処法
プログラミングの作業は１度でうまくいくものでなく、何度も何度も修正を繰り返しながら作っていくものだと教える。
エラー=壊したでなく、エラー=直すべき箇所という考え方をする。

# 原因3: デバッグができない
エラーメッセージは読めてもどうしてそのエラーが発生するのかの特定ができず、混乱する。
## 影響
むやみやたらとググったり、質問サイトを探し回る羽目になる。
## 対処法
どこでその処理が止まっているのかを特定したり、変数に何が格納されているのかを確認するためにデバッグの方法を覚える(最初はprintデバッグで大丈夫)。


# 原因4: 質の悪い記事を表面だけ詰って問題を解決しようとする
早く解決しようと焦るあまり、信頼できない情報を参考にしてしまう。
google検索で見つかる情報はバージョンが古かったり、投稿者の認識が間違っていたり、場合によっては検証すらされていないコードを参考にして余計に混乱する。
## 影響
余計にコードが絡まってしまい、かえって問題が発生する。
## 対処法
信頼できる情報提供がされているサービスを利用する。
少し大変でも質のいい記事や公式ドキュメントを読む癖をつける。

# 原因5: 当たりをつけず、調べる癖がある
google検索で調べるのはいいことですが、あらかじめ当たりをつけていないといつまでたっても検索する羽目になります。
## 影響
調べる範囲が広範囲になり検索しているだけで疲れてしまう。
## 対処法
エラーメッセージから何が原因かを推察し、デバッグ、そして検索をするという流れが理想的です。

# 原因6: 悩みすぎる
一定時間悩んで調べてもわからない場合は基礎的な知識が欠落している場合があります。
## 影響
時間と労力を消耗してしまう。
## 対処法
とりあえずそのジャンルについて体系的に書かれた本を読むことや、理解が深まっているかを確認するためにアウトプットをして、できる人に見てもらうといった行為が大切です。

# 原因7: 勉強しすぎで能率低下
プログラミングは結構疲れる作業です。
特に自分の書いたコードのエラー解消などは自分の前提が間違っているので非常にエラーが見つけにくいです。
そんなときに時間で対処しようとすると能率が落ちます。
## 影響
うまくいかないことが増えてプログラミング自体が嫌になってしまったり、プライベートが犠牲になる。
## 対処法
適度な休憩やリフレッシュを大切に。

# 原因8: 設計がない
とりあえずプログラミングをするという行為をしてしまう。
## 影響
作業中に後々あの機能も必要かもと考え機能を追加してしまったり、勉強したばかりの新しい技術を追加したりしてコードが膨らんでいき、いつまでたっても終わらない。
## 対処法
まずは作る機能を洗い出して、そのために何が必要か、どの技術を勉強しないといけないのか、どれくらいの時間がかかりそうなのかを検討する。
さらにその際にかかる時間には余力を持たせる。

# 原因9: 余計なタスクを抱え込んでいる
人から呼ばれたり、急な作業を任されたりして作業が中断する。
## 影響
いったん集中力がきれると流れがわからなくなります。
そのためまた理解に時間がとられてしまいます。
## 対処法
プログラミングは集中力が必要な作業です。

# 原因10: PCのスペックが低い
一定レベルのメモリやCPUを積んでいない、古いPCを無理やり使っている。
## 影響
一般的な環境との乖離があると公式がサポートをしていないという問題があります。
また容量不足やマシンパワーが低いと処理速度が遅くて、作業の間にタイムラグが発生しその分能率が落ちるなどデメリットは大きいです。
## 対処法
きちんとしたPCを購入する。

# 原因11: 変わったツールを導入しようとしすぎる
会社の都合だったり、いい加減な記事にたぶらかされ、変わったツールを使ってしまう。
## 影響
知見が少ないため、ググっても出てこない現象にぶち当たる。
## 対処法
流行っているツールで操作に慣れ、ある程度の理解が深まったら少しずつ別のツールを取り入れていく。

# 原因12: エラーが起きた時に一度に解決しようとしすぎる
早くエラーを解消しようとしすぎて強引な解決方法を取ってしまう。
## 影響
エラーは一気に解消できることは稀なので結局エラーは解消できないままとなる。
## 対処法
エラーは1つずつしっかりと取り除いていく。

# 原因13: 自分の理解より深い理解が必要ということをしらない
例えばpythonにおいては型が動的なためnum = 1と定義するとint型となっている。
しかしnum = input()で数字を入力するとその型はstr型となる。
inputにおいては文字列として処理されるためです。
こういった理解ができていないで数字はint型として処理されるものだと思い込んでしまう。
## 影響
一定以上のプログラミングができなくなってしまう。
## 対処法
時には自分の理解が間違っているかもと疑い、簡単なテストを実行してみる。

# 原因14: 検証のための方法を知らない
原因13で解説したような問題が起きた際にtypeメソッドという型を調べるメソッドを知っていればわざわざ調べなくても型を調べて原因の特定が可能となる。
## 影響
いつまでたっても検証が下手になるため、ググる必要が出てくる。
## 対処法
問題が起きた時に使えるメソッドの知識を増やす。


# おわりに: **理解したら遊んでみよう**
例えばprint("hello world")を出して終わるのでなく、出力ができるなら別の単語を入れてみるのはどうだろうとか、printの後に文字を追加してprintlnでも動くのだろうかと試してみるのが理解の助けになります。
この作業は一見時間を無駄にしているように感じますが、この作業を行うことで理解の幅が広がりますし、他の知識と結びつけることもできます。
すぐに身に着けようとするのではなく、じっくり長い年月をかけてプログラミングと付き合っていくのだと考えてください。
プログラミングは地道で大変な作業です。
けれどその地道な作業を続けていきコードが意図したとおりに動いた時の感動は一入ですし、誰かの問題を解消できるコードであれば感謝されたりもします。
この記事が自身のスキルを高めたいと考えている方にとって役に立てば幸いです。