プログラマー初学の人へ61の質問

## はじめに
これからプログラムを学ぶ人や、現在学んでいる途中の人が学んでおいたほうが良いことを質問形式で記載してます。
`オブジェクト指向型言語`全般で共通する質問事項ですが、一部特定の言語に特化している質問もあります。
（ただし、他の言語の質問に関しても押さえておいた方が良いと思う部分を記載してます。）

下に行けば行くほど質問は難しくなっていきます。
なお、回答は記載してませんので分からない質問については調べてください。

※注意
僕の知識がベースとなっているので、質問が偏っている可能性があります。

## 1. 変数と定数の違いは何ですか？
オブジェクト指向（手続き型言語）で変数や定数は避けて通れません。
はじめに覚える事でしょう。

## 2. 変数と定数はどのように使い分けますか？
変数と定数の使い分けのルールは現場ごとに違うところがありますので、この質問は現場に対しての質問になるかもしれません。
また、まだ現場に入っていない人は一般的にどのようなものを定数として扱うかを知っておくといいでしょう。

## 3. コメントの書き方はわかりますか？
コメントは重要！
書かない人が多いけど、、、

## 4. 四則演算はどのように行いますか？
基本的な計算はどの言語でも必ず使います！

## 5. 演算子、論理式、比較子って何ですか？
使ってる言語で使用できる演算子は念のため確認しておきましょう！

## 6. 三項演算子って何ですか？
使えると便利な構文。無い言語もある。

## 7. Integer型とFloat(Double)型の違いは何ですか？
型による性質の違いを把握しておきましょう。
言語によりますが、C系の言語の場合は定義することによって確保されるメモリ領域についても知っておきましょう。

## 8. 分岐処理の構文を教えてください。
プログラムで分岐処理を避けて通ることはできません。
基本中の基本なので少なくても２つ以上の方法を把握しておきましょう。

## 9. ループ構文を教えてください。
上記同様でループさせるプログラムは基本です。
言語によりますが、やはり２つ以上の方法を知っておくといいでしょう。

### Rubyに関して
Rubyの場合は以下のような記述が可能ですが、以下の書式は厳密には基本構文ではありません。
以下のプログラムは関数ブロックを利用したループ処理になります。
Rubyを学習している方は以下の書式と上記の回答の違いについても教えてください。

```ruby
[1,2,3].each{|index|
	# 処理
}
```

## 10. 配列の構文を教えてください。
Arrayクラスと配列がある言語の場合はこの違いも教えてください。

## 11. ハッシュ（辞書）の構文を教えてください。
配列との違いと利点も合わせて教えて下さい。

## 12. 関数（メソッド）の構文を教えてください。
基本的な関数（メソッド）の書き方はどの言語でも知っておくべき事です。
また、定義した関数（メソッド）の呼び出し方法も教えてください。

## 13. 関数（メソッド）を使用する利点を教えてください。
そのままメイン処理に記述するのと関数化するのでは何が違うのでしょうか？

また、一箇所でしか呼び出されない関数を定義する必要はありますか？
ある場合はなぜですか？

## 14. 標準出力の方法を教えてください。
Hello world!!

## 15. 文字列の連結、検索方法を教えてください。
大体の言語は文字列連結は簡単にできる・・・objective-cは痛い。。。

## 16. クラスの構文を教えてください。
オブジェクト指向の中核となっているクラスの構文は是非抑えておきましょう！

## 17. インスタンス変数とは何ですか？
普通の変数とインスタンス変数の違いは抑えておきましょう。

## 18. クラス変数とインスタンス変数の違いは何ですか？
メモリ空間の使い方に関しても説明できる回答できると良いです。

## 19. スタティック領域とは何ですか？
クラス変数について理解があれば大した質問ではありません。
クラス変数もしくはスタティック領域のどちかしか回答できない人は知識が不十分です。勉強しましょう！

## 20. クラスの継承構文を教えてください。
言語によって書き方は違いますが、結構似てます。

## 21. 型キャストはできますか？
クラスのキャストができる条件なども教えてください。
あと、どういう時に使いますか？

## 22. 型チェックの構文を教えてください。
型によって処理分岐する事ってたまにありますよね〜。

## 23. 関数（メソッド）の初期値って設定できますか？
Javaの場合はオーバーライドを駆使するしか無いかも・・・。

## 24. インターフェース（objective-cやswiftではプロトコル）とは何ですか？
Rubyではほとんど出番がありませんが、抑えておくといいでしょう。

## 25. インターフェース（objective-cやswiftではプロトコル）はどのような局面で使用しますか？
JavaとObjective-c/Swiftでは使用局面が違いますので、調べる際には注意してください。（概念は同じで使い方も同じですが、使われ方が違います。）

## 26. クラスの継承をするメリットは何ですか？
継承、ポリモルィズムは併用して使われることが多いです。

## 27. 自分自身のクラスを示すキーワードは何ですか？
this? self?
superは何を指してます？

## 28. ポリモルフィズムとは何ですか？
オブエジェクト指向の三大要素の一つです。
継承と一緒に抑えておくと良いでしょう。

## 29. ダックタイピングとポリモルフィズムの違いを教えてください。
Rubyを行っているとインターフェースの出番がない代わりにダックタイピングが発生します。
Javaではダックタイピングはできませんが言葉は知っておくと良いでしょう。

## 30. カプセル化のメリットは何ですか？
スクリプト言語ではあまり恩恵を感じないカプセル化ですが、、、抑えておきましょう。

## 31. アクセス演算子って何ですか？
カプセル化が分からないとこれもわからない。

## 32. タプルとはなんですか？
Javaや.NETの場合はタプルは構文でサポートされてませんが、擬似的には行えますので知らない場合は調べておいてください。

## 33. クラスを使うメリットは何ですか？
これは手続き型言語とオブジェクト指向型言語の違いを把握しているかどうかの質問になります。

## 34. 例外処理はどうやって書きますか？
Swiftにはまだない・・・。（1.2現在）
Objective-cでも基本的には使わないけど、使い方は覚えていたほうがいいです。

## 35. バージョン管理システム(SCM)とは何ですか？
現在の開発では切っても切れないもの。個人でも使う事を強くお勧めする。

## 36. バージョン管理システム(SCM)は何を使ってますか？
CVS,SVNはもう古い。
VSSは進化の過程がわからない。
やはりGitを使う事をお勧めする。

### プル/プッシュ/フェッチ/クローンなどのコマンドの使い方を教えてください。
少なくてもSVNの概念を把握しておこう！

## 37. スクリプト言語とコンパイル言語の違いは何ですか？
あと、メリット・デメリットも！

## 38. データベースって何ですか？
もはやどのシステムを使っても切っても切れない関係。
最近はNoSQL系も切れない関係になりつつある。

## 39. トランザクション管理って何ですか？
アトミック性とかの把握は重要です。

## 40. スレッドって何ですか？
スレッド発行はJavaで作るとコード量が少し多くて面倒臭い。

## 41. プリミティブ型とオブジェクト型って何ですか？
メモリまで考えて回答お願いします！

## 42. 無名関数/匿名関数って何ですか？
Javaでは、、、いや`Android Java`では多用する。

## 43. メタプログラミングって何ですか？
概念だけは知ってたほうがいい言葉。

## 44. Optionalはどのようなケースで使用しますか？(java/Swift)
Swiftでは言語仕様に組み込まれていますので、必須です。
Javaの場合は使ったほうが強固なシステムが作れますが、コード量が増えるので少し微妙かも・・・。
でも、覚えておきましょう！

## 45. リフレクションとは何ですか？
そもそも言葉を知らない人は覚えておきましょう。
ただし、業務コードでは使わない方が無難です。

## 46. クラス拡張はできますか？
Javaではできないが、RubyやObjective-c/Swiftでは既存クラスにメソッドなどをつけることができる。

## 47. インスタンス変数にメソッドを追加できますか？
Ruby特有の機能です。

## 48. アノテーションはどのように使用しますか？
Javaが圧倒的に使用頻度が高いです。
使用用途も様々なのでさわりだけでも抑えておきましょう。
中級者以上の方はアノテーションの作成方法とどの局面で使用すると効果があるかも抑えておきましょう。

## 49. DIコンテナとは何ですか？
こちらも基本的にJava以外ではほとんど使われません。
最近のJavaでは必須の技術だと思います。

## 50. ガベージコレクションとはなんですか？
Objective-cやSwiftには存在しない概念ですが、オブジェクト指向を支えている重要な技術なので抑えておきましょう。

## 51. ガベージコレクションを使うとなんのメリットがありますか？
気づかないうちに使われている技術ですが、メリット/デメリットは抑えておきましょう。

## 52. ARCとは何ですか？
Objective-cやSwiftのみの概念です。
Objective-cやSwiftを学んでいる人はARCによって受ける恩恵がなんなのかを把握しておきましょう。
また、他の言語を学んでいる人は少しだけ調べておくと知見が広がります。

## 53. Weakキーワードはどのような局面で使用しますか？
Objective-cやSwiftを学んでいる人は抑えておきましょう。
ガベージコレクションがある言語では不要の概念ですが、`Android Java`を学んでいる人は念のため抑えておきましょう。（Javaにも一応存在します。）

## 54. スタック領域とヒープ領域の違いは何ですか？
オブジェクト指向の根底となっている考え方です。是非抑えておきましょう。
このあたりの質問になると中級者でも回答できない場合があります。

## 55. 横断的処理の記述方法を教えてください。
オブジェクト指向の欠点は縦断的処理になってしまい、横断的な処理ができないところがあります。
最近は横断的な処理も記述できるようになってきたので覚えておきましょう。
Rubyはかなり多種な方法がありますので、覚えておくと良いでしょう。
Javaは8からできるようになってます。

## 56. クロージャって何ですか？
変数をバインディングするとかなんとか・・・
objective-cでこの辺のコードを書くのは難しい・・・。

## 57. 高階関数って何ですか？
Javaでは使えない・・・。(Functionがクラスであるため厳格には高階関数にならないだけで、ほぼ同じことができる。でも、Voidが使えないのは痛い。）

## 58. ブロック構文って何ですか？
ブロック構文は確かRubyの用語。なので、他の言語の場合は高階関数を把握しておけばOK!

## 59. 変数に関数を設定してください。
Javaでは出来ません。(Functionは保持できますが、関数はファーストクラスオブジェクトではないため）
関数を持ち運べると関数型言語に興味が出てくる。
無名関数/匿名関数を理解していればたいした事ではない。

## 60. 部分適用とカリー化の違いは何ですか？
分かると簡単なんだけど、、、はじめは何が違うかわからなかった・・・。
ちなみに僕はカリー化したことありません・・・。

## 61. モナドって何ですか？
これをちゃんと説明できる人に会ったことがない。
もちろん、僕も無理！
そもそもオブジェクト指向の話から逸れてるし・・・。
※でも、Optinalは一種のモナドです。

## まとめ
前半の19番目まで説明ができれば初学のスキルとしては十分だと思う。
リフレクション当たりから通常の業務では使用しない用語になりつつあるので、もし理解してても他人への説明は難しくなってくる。

また、Web系の質問は書いてませんがWebプログラマーだった場合は`SQLインジェクション`や`XSS`、`CSRF`などの意識も必要になってくる。
DB系の場合はインデックスの張り方やオプティマイザへの理解などが必要になってくるが本記事の内容から脱線するためこの辺りはあまり言及していない。

全部人に説明できるという人は相当のレベルの人だと僕は思う。
そんな人がいるなら一緒に仕事がしたいです。はい。