This page looks best with JavaScript enabled

「プログラマー初学の人へ61の質問」に答えてみる

 ·   ·  ☕ 13 分で読めます
✏️

はじめに

プログラマー初学の人へ61の質問を見ました。
そもそも全くわからないものもたくさんあったのですが、わかると思っていたことも言葉で説明はできないなと感じました。なので、この機会に調べてまとめることにします。

前半の19番目まで説明ができれば初学のスキルとしては十分だと思う。

とのことです。
ちなみに盛大に未完成です。

言語

  • Ruby
  • たまにJavaScript

答えてみる

1. 変数と定数の違いは何ですか?

変数
再代入が可能。
Rubyでは小文字で定義する。foo = 'foo'
JSではletで定義する。let bar = 'bar'

定数
再代入しない。再代入した場合、Rubyでは警告が出る(再代入自体は可能)。JSではエラーが出る(再代入不可能)。
Rubyでは大文字から始まるものを定数と認識する。実際使っているのを見る限りは全て大文字にしている。FOO = 'foo'
JSではconstで定義する。const bar = 'bar'

2. 変数と定数はどのように使い分けますか?

Rubyでは基本的に変数を使う。
VERSIONとしてモジュール内で定義したりするときに定数を使う(らしい。まだ実際に使ったことがない)。また、Rubyには組み込み定数(例:ENV)もある。

JSでは基本的に定数を使う。
配列の中身が変わるのは定数でも問題ない。
letが出たら「お、再代入するものなんだな」という心構えをする。

3. コメントの書き方はわかりますか?

1
<!-- コメント -->
1
/* コメント */
1
2
3
4
5
6
console.log("hoge"); // 同一行のコメント

/*
複数行の
場合
*/
1
2
3
4
5
6
7
8
9
puts 'hoge' # 同一行のコメント

=begin
複数行の
場合
=end

__END__
これ以降すべてコメント

4. 四則演算はどのように行いますか?

 1 +  1  # => 2 加算
 2 -  1  # => 2 減算
 2 *  3  # => 6 乗算
 2 ** 4  # => 16 累乗
 6 /  2  # => 3 除算
10 /  3  # => 3 余りは切り捨て
10 %  3  # => 1 余り

小数点で表したい場合は、どちらかの数字にto_fを付ける。

10 / 3.to_f
=> 3.3333333333333335
10.to_f / 3
=> 3.3333333333333335

5. WIP 演算子、論理式、比較子って何ですか?

演算子

代数演算子:
Ruby 入門 - 演算子

論理式

比較子

演算子 記述例 意味
== a == b b が a に等しい
!= a != b b が a に等しくない
> a > b b より a が大きい
>= a >= b b より a が大きいか等しい
< a < b b より a が小さい
<= a <= b b より a が小さいか等しい

引用:関係演算子

=====
Rubyで使われる記号の意味

演算子 記述例 意味 別の演算子
&& a && b a と b が共に真の場合に真 and
|| a || b a か b の少なくとも 1 つが真の場合に真 or
! !a a が真の時に偽、偽の時に真 not

引用:論理演算子

&& ||and orより意味が重い。

6. 三項演算子って何ですか?

こういう書き方のこと。if returnの文を一行でスッキリ書ける。

条件式 ? trueのときの返り値 : falseのときの返り値
1
2
3
4
5
6
7
8
n < 5 ? 'nは5より小さいです' : 'nは5より小さくありません'

if n < 5
  return 'nは5より小さいです'
else
  return 'nは5より小さくありません'
end
# この例ではreturnは不要だが

7. Integer型とFloat(Double)型の違いは何ですか?

Ingeger型
整数。誤差はない。

Float型
浮動小数点数。
誤差があり得る小数のことだが、ざっくり小数という認識でいい気がする。誤差があるのは仕方ない、らしい。

1
2
3
4
100.times.reduce(0){|s,_| s+0.01 }
=> 1.0000000000000007
100.times.reduce(0){|s,_| s+0.1 }
=> 9.99999999999998

参考:浮動小数点って何?

8. 分岐処理の構文を教えてください。

if文

if n == 2
  puts 'その数は2です'
elsif n.even?
  puts 'その数は偶数です'
else
  puts 'その数は奇数です'
end

case文

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
price = case food
        when '卵'
          100
        when 'トマト'
          50
        when '鶏肉'
          300
        else
          200
        end

case文での比較は==ではなく===による。

9. ループ構文を教えてください。

for文

1
2
3
4
5
6
7
8
for n in 1..3 do
  puts "#{n}回目の処理です。"
end

1回目の処理です。
2回目の処理です。
3回目の処理です。
=> 1..3

while文

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
n = 0
while n < 3 do
  puts "n = #{n}"
  n += 1  # これを忘れると無限ループになる
end

n = 0
n = 1
n = 2
=> nil

Rubyに関して

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

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

この辺りはよく知らずに使っていました。

例えば、メソッド#timesは配列の中身をそれぞれ取り出して処理をしている。
メソッドによるというのが大きな違い。

Array(1..3).each do |n|
  puts "#{n}回目の処理です。"
end
n = 0
loop do
  break if n >= 3
  puts "n = #{n}"
  n += 1
end

ちなみに、それぞれの処理速度は以下の通り。
速度は多少変動はあるものの、順位は変わらず。

       user     system      total        real
for 1000000
  0.066308   0.005508   0.071816 (  0.075733)
each 1000000
  0.076021   0.007584   0.083605 (  0.090589)
times 1000000
  0.070877   0.007122   0.077999 (  0.092721)
while 1000000
  0.038416   0.004368   0.042784 (  0.045299)
loop 1000000
  0.087187   0.008145   0.095332 (  0.101498)
code : while = 0.05[sec]
code : for = 0.08[sec]
code : each = 0.09[sec]
code : times = 0.09[sec]
code : loop = 0.10[sec]

コードはこちらのものを使用:Ruby..rb のループ(loop, each, while, for)の速度のベンチマーク

10. 配列の構文を教えてください。

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

1
2
3
4
5
array = [1, 2, 3]
array[1] => 2

array2 = ['太郎', 12, { message: "メッセージ" }]
array2[3][:message] => "メッセージ"

何でも入れられる。

array = []
array = Array.new

11. ハッシュ(辞書)の構文を教えてください。

1
2
{ key => value }
{ key: value }
taro = { '名前' => '太郎', '年齢' => 10 }
taro['名前'] => "太郎"

hanako = { name: '花子', age: 13 }
hanako[:age] => 13

ハッシュは日本語でもいいが、英語にしたほうが無難。

12. 関数(メソッド)の構文を教えてください。

1
2
3
4
5
def method(arg)
  # 処理
end

method(arg)
const name = function (arg) {
  // 処理
};

name(arg);

Rubyは引数がない場合は()を省略できるが、JSは()省略不可。

13. 関数(メソッド)を使用する利点を教えてください。

  • 処理ごとに細分化できる
  • 使い回しができる

そのままメイン処理に記述するのと関数化するのでは何が違うのでしょうか?

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

保守性……テストをしやすいようにするため、かなあ。

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

1
puts 'Hello world!'
console.log("Hello world!");

15. 文字列の連結、検索方法を教えてください。

1
2
3
4
5
6
7
# 連結
pen = 'ペン'
pineapple = 'パイナッポー'
apple = 'アッポー'
piko = pen + pineapple + apple + pen
piko = pen<<pineapple<<apple<<pen
=> "ペンパイナッポーアッポーペン"

<<を使うこともできるのか。これは初知り。

Rubyの文字列連結に関して知っておくべきこと

1
# 検索 WIP

16. クラスの構文を教えてください。

1
2
class Hoge
end

17. インスタンス変数とは何ですか?

@hoge
範囲が広い。グローバル。
普通の変数は定義したスコープの外からは取得できない。

18. WIP クラス変数とインスタンス変数の違いは何ですか?

メモリ空間の使い方に関しても説明できる回答できると良いです。

19. WIP スタティック領域とは何ですか?

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

20. クラスの継承構文を教えてください。

1
2
3
class Hoge < Foo
  # Fooを継承したHogeクラス
end

21. WIP 型キャストはできますか?

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

22. 型チェックの構文を教えてください。

1
2
10.is_a?(Integer)
=> true

23. 関数(メソッド)の初期値って設定できますか?

1
2
3
def method(name = '太郎')
  # 処理
end

24. インターフェース(objective-cやswiftではプロトコル)とは何ですか?

25. インターフェース(objective-cやswiftではプロトコル)はどのような局面で使用しますか?

26. クラスの継承をするメリットは何ですか?

継承、ポリモルィズムは併用して使われることが多いです。

27. 自分自身のクラスを示すキーワードは何ですか?

this? self?
super は何を指してます?

28. ポリモルフィズムとは何ですか?

オブエジェクト指向の三大要素の一つです。
継承と一緒に抑えておくと良いでしょう。

29. ダックタイピングとポリモルフィズムの違いを教えてください。

Ruby を行っているとインターフェースの出番がない代わりにダックタイピングが発生します。
Java ではダックタイピングはできませんが言葉は知っておくと良いでしょう。

30. カプセル化のメリットは何ですか?

スクリプト言語ではあまり恩恵を感じないカプセル化ですが、、、抑えておきましょう。

31. アクセス演算子って何ですか?

カプセル化が分からないとこれもわからない。

32. タプルとはなんですか?

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

33. クラスを使うメリットは何ですか?

これは手続き型言語とオブジェクト指向型言語の違いを把握しているかどうかの質問になります。

34. 例外処理はどうやって書きますか?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
begin
  # 処理
  # この中でエラーが起きたら下のrescueでキャッチする
rescue RuntimeError
  # 例外処理
rescue => e  # StandardErrorは省略可
  puts e.message
  # 例外処理
end

raise RuntimeError  # 指定の例外を発生させる

Exceptionはrescueするなという教えがある。特に引数を指定しなければStandardErrorになる。

35. バージョン管理システム(SCM)とは何ですか?

  • ファイルA
  • ファイルA 5/4 時点
  • ファイルA 〇〇が編集中
  • ファイルA 最新版
  • ファイルA 最新版(1)
  • ファイルA これが最新!

ってならないようにするためのもの。
更新日時と編集者、ファイルの差分などをまとめて管理してくれる。

36. バージョン管理システム(SCM)は何を使ってますか?

Git以外使ったことがない。

プル/プッシュ/フェッチ/クローンなどのコマンドの使い方を教えてください。

  • git pull

リモートhogeブランチの状態をローカルのhogeブランチに反映する。git pull origin developみたいな使い方。
git fetchgit mergeの合わせ技。

  • git push

ローカルブランチhogeの変更をリモートブランチhogeに反映させる。

  • git fetch

リモートhogeブランチの状態をローカルのorigin/hogeブランチに反映する(場合によってはoriginじゃないけど)。

  • git clone

リモートのデータをリポジトリごとローカルに丸ごと持ってくる。

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 は一種のモナドです。

おわりに

「聞いたことはあるけど説明できない」というものはまだまだあるので、随時書いていきたい。

Share on

END
END
@aiandrox

目次