contents memorandum はてな

目次とメモを置いとく場

『プログラムはこうして作られる――プログラマの頭の中をのぞいてみよう』(平山尚 秀和システム 2013)

著者:平山 尚[ひらやま・たかし](1977-)(株式会社セガ
Jacket Design:Shiki Design Office (Okazaki yoshiyasu)
NDC:007.64 : 情報科学 >> データ処理.情報処理 >> プログラミング
備考:独自の疑似プログラミング言語が使用されている。


プログラムはこうして作られる プログラマの頭の中をのぞいてみよう - 秀和システム あなたの学びをサポート!

[サポートページ]
https://www.shuwasystem.co.jp/support/7980html/3925.html



【目次】
但し書き [002]


Chapter 0 この本は誰に何を提供するか 003
    なぜこの本か?
0.1 これまでの教え方が持つ三つの問題 004
  0.1.1 要素がバラバラ
    プログラムにレシピ本はあるか?
  0.1.2 プロ向けの道具がもたらす挫折
  0.1.3 できなくても仕方ないと思われている

0.2 この本は何が違うか 004
  0.2.1 一つのプログラムを最初から最後まで作る
    このために犠牲になること
  0.2.2 専用に道具を用意する
    このために犠牲になること
  0.2.3 本当に初めての人を対象にする
    他の本に依存しない
    前提条件を極力下げた
    このために犠牲になること

0.3 では、始めよう! 011


目次 [012-021]


Chapter 1 プログラム作りを始める前に 022
1.1 あのゲームを作るためにはどうしたらいいか 023
  1.1.1 あのゲームに必要なプログラム技術とは何か
  1.1.2 あのゲームはどんなものか
    お手本を動かす方法
    ダウンロードと展開
    フォルダの中を開けて、ソフトウェアを動かす
    Windows8 の場合
    サンプルを動かしてみる
  1.1.3 プログラムとは何なのか
    「お手本」というファイルは何なのか
  1.1.4 この奇妙な文章は何なのか
  1.1.5 君の目標はどのくらいの高さにあるのか
    売り物はどれくらいなのか?

1.2 どこから手をつけるか 036
  1.2.1 プログラミング言語の学び方
  1.2.2 どこから作り始めるか
  1.2.3 何か手のつけやすい要素を抜き出せないか

1.3 この章で伝えたかったこと 039


Chapter 2 メモリに触れてみる ~四角を描く~ 040
2.1 書いたプログラムを動かす 040
    もう一度整理
    ファイルを作る
    最初のプログラム
    ファイルの保存
    動かす
    ファイルの名前を他のものにする
    書き加えたり直したりしてまた実行する

2.2 四角を描く 044
  2.2.1 四角を描くための最低限のルール
  2.2.2 この一行は何を意味しているのか
    ちょっといじってみる
    左の数字をいじる
    右の数字をいじる
    まとめると
  2.2.3 メモリとは何か
    ダイアルのイメージ
    短い言い方
    メモリの番号の範囲
  2.2.4 メモリをいじると点が出るのはなぜか
  2.2.5 コンピュータとはどういう機械か
    メモリはスイッチになる
  2.2.6 画面の点は何番のメモリにつながっているか
    画面とは何か
    画素とメモリの関係
    四角を描く
    写真だって描ける
  2.2.7 メモリに覚えさせる数と色の関係
    色の作り方
    どんな絵でも描ける

2.3 好きな場所に四角を描く 058
  2.3.1 画面の真ん中に赤い四角を描く
    塗る順番を考える
    まず横方向を真ん中にする
    10マスで考えてみる
    100マスに戻してみる
    縦も真ん中にする
  2.3.2 1足したり引いたりが面倒だ! 
    0からはじめるやり方
    100×100で考える
  2.3.3 なぜ0始まりか
    なぜメモリは0始まりか
    そもそもなせ我々は1から始めているのか
    1始まりが厄介な時
    マイナスがなくても0始まりが便利なことがある
    プログラムではどちらが便利か
    〜番目、〜個目という言い方はしない
  2.3.4 これであのゲームの絵を描けるか

2.4 この章で伝えたかったこと 071


Chapter 3 くり返し ~プログラムを短くする~ 072
3.1 行数を減らす 073
  3.1.1 一行で複数のメモリをいじりたい 
    一行の内容を増やす
    一行で複数のメモリをいじる文法
    一行を何度も使う
  3.1.2 なぜくり返しか 

3.2 くり返しの使い方 076
  3.2.1 くり返しの文法 
    くり返し条件行
    くり返し範囲
  3.2.2 何があれば四角を描くのに使えるか
    何が必要か
  3.2.3 固定していない数
    実行する式の置き換え
    スイッチてない番号を使う
  3.2.4 1回実行して終わりにする
  3.2.5 2回実行して終わりにする
    まずは日本語で考える
    くり返した回数を増やす
    計算の導入
    プログラムの動きを頭で再現してみる
  3.2.6 16回実行して終わりにするにはどうするか
  3.2.7 好きな回数くり返す方法
  3.2.8 くり返す度に別の画素を塗るにはどうするか
    置き換えが行われるのはどこか
    メモリを余計に使わないでやる
    最後に塗るのは何番?

3.3 くり返しで四角を描く 090
  3.3.1 だがそう簡単には行かない
    右にずれるところだけを考える
    プログラムは短くなったか
  3.3.2 くり返しをくり返すにはどうするか 
    まず外側だけ
    内側をはめ込む
    空白を足す
  3.3.3 このプログラムの何が悪いのか
    最初にやること
    二つの方針
  3.3.4 頭の中で動かす
    確かに4つしか塗っていない
  3.3.5 結果から考える
    下にずらす
    計算順序を変える括弧
    16点塗る
    根本的な間違いは何か
    何番を使うかは問題ではない
  3.3.6 思ったように動かない時にすべきこと
    思ったように書くための三つの思考
  3.3.7 くり返しで書くことに価値はあるか 
    元々なぜくり返しを使おうと思ったか
    くり返しの価値
  3.3.8 画面の真ん中に描くにはどうするか
    変更を楽にする効果

3.4 この章で伝えたかったこと 108


Chapter 4 プログラムの変形 ~四角をたくさん描く~ 110
4.1 くり返しで壁を描く 111
  4.1.1 四角を描くことをくり返す
    外側のくり返しを書く
    中見【※原文ママ】をはめ込む
    動かしてみる
  4.1.2 20個描く
    途中で改行
    無視される空白
    完成
  4.1.3 この調子で右の壁や底も描く
    右の壁
    底
    完成
  4.1.4 注釈
    注釈の必要性
    短くしよう!

4.2 もっと短くしたい 123
  4.2.1 くり返しをくっつける 
    さらにくっつける
    さらにさらにくっつける
  4.2.2 まだやれることはないか 
  4.2.3 底も含めてもっと短く書く方法はないか
    くり返しの内と外を入れ替える
    くり返しをくっつける
    さらにくっつける
  4.2.4 これはわかりやすいプログラムか 
    何のためにやるのか
    答えは一つではない

4.3 この章で伝えたかったこと 136


Chapter 5 プログラムを分ける ~四角を楽にたくさん描く~ 138
5.1 行を使い回すための、くり返し以外の手段 139
  5.1.1 参照が使えたとしたらどうなるか 
    参照されるプログラム
    参照するプログラム
  5.1.2 参照のわかりやすさ 
    プログラム以外でも

5.2 Sunabaにおける「参照」 141
    参照される側は前か後か
    私は後で書く
  5.2.1 実行について
    実行について
  5.2.2 部分プログラムが役立つために必要なもの
  5.2.3 参照する度に違う点を塗りたい

5.3 部分プログラムを使って壁と底を描く 149
    部分プログラムを作る
  5.3.1 左右も部分プログラムを使って描くには
    このままでは動かない
    底と壁で違う点がある
    ラーメン量のトッピング食券
    部分プログラムを使う前にメモリに設定する数
    3番にセットして数は何か?
  5.3.2 部分プログラムに価値はあるか 
    部分プログラムのわかりやすさ

5.4 もっとわかりやすく 157
  5.4.1 注釈はなぜ必要か 
    部分プログラムの利用
  5.4.2 「変な数」に注目する
    まずどう使いたいかを考える
    マス目単位で考えたい
    部分プログラムを改造する
    試してみる
    それでこうなる
    楽をするためのちょっとした手間

5.5 この章で伝えたかったこと 166


Chapter 6 動きのあるプログラム ~四角を落とす~ 167
6.1 次は何をすべきか 168

6.2 四角を落とす 169
    実験は小さく
  6.2.1 点を落としてみる
    次の場所に
    点を消す
    もっと遠くまで
    くり返しで動かす
    くり返しで消しながら動かす
  6.2.2 四角を落としてみる
    部分プログラムを作る
    部分プログラムを改造する
    やっぱり動かない
  6.2.3 間違いを直す
    どう間違っている必要があるかを考える
    疑わしい場所に注目してプログラムを頭の中で動かす
    問題の原因
    直す
    この間違いの本当の原因は何か
  6.2.4 問題を直す
    部分プログラムは二つも必要か
    好きな色の四角を描く部分プログラム
    わかりにくくはないか

6.3 もっと速く塗りたい 186
  6.3.1 手加減をやめさせるには
  6.3.2 手加減とは何か
    メモリが覚える数を変えると何が起こるか
    前はなぜ塗られていたのか
    コンピュータの中と外
  6.3.3 手紙を送る
    手紙をいつ送るか
    間違って送ると
    今後は「手加減オフ」で

6.4 ここまでを組み合わせる 192
  6.4.1 まずはくっつけるだけ
  6.4.2 壁と底を描く
  6.4.3 手加減をやめる
  6.4.4 落ちる四角を真ん中に

6.5 この章で伝えたかったこと 198


Chapter 7 メモリに名前をつける ~もっと日本語で~ 200
7.1 今のプログラムは何が悪いか? 201
    注釈でどうにかする
  7.1.1 どんな道具がほしいか
    四角を描く部分プログラムで考える
    メモリに名前をつける
  7.1.2 番号を自分で決めたくない
    もっと楽をしたい
    楽をしすぎると欠点もある
    もしこんな機能があればこうなる

7.2 Sunabaでメモリに名前をつける 208
    番号指定はできない
  7.2.1 とりあえず使ってみる
  7.2.2 メモリの番号を決めなくていい、ということ
    名前付きメモリがあれぱ
    なぜ最初から使わなかったのか!

7.3 名前付きメモリのルール 212
  7.3.1 名前付きメモリが作られるのはいつか
  7.3.2 名前付きメモリは部分プログラムごと
    部分プログラムからは出られない
    部分プログラムの外は見えない
    勘違いしやすい例
  7.3.3 くり返しの外からは見えない

7.4 この章で伝えたかったこと 217


Chapter 8 操作できるプログラム ~四角を動かす~ 218
8.1 操作するとはどういうことか 219
  8.1.1 キーボードに反応する
  8.1.2 プログラムはどうやって外のことを知るか

8.2 操作できるようにする 223
  8.2.1 押す暇がないし、押せてもわからない
  8.2.2 動いている間にキーを押したい
  8.2.3 点を動かしてみる
  8.2.4 手加減をオフに
  8.2.5 下以外にも動くように
  8.2.6 四角を動かす

8.3 動きっぱなしを避ける 232
  8.3.1 まずは小さく始める
  8.3.2 動き続けないとはどういうことか
  8.3.3 前回押されていなければ、をどうするか
  8.3.4 ホワイトボードを見てどうするか決める
  8.3.5 式を思いつく
  8.3.6 上下左右に動けるようにする
  8.3.7 四角に戻そう

8.4 落ちてくる四角を動かせるようにする 245
  8.4.1 壁と底を描いて、すぐできる改造をする
  8.4.2 落とす

8.5 この章で伝えたかったこと 248


Chapter 9 「計算」の本当の意味 ~ゆっくり落とす~ 250
9.1 ゆっくり落とすということ 251
  9.1.1 毎回動かないプログラム
  9.1.2 前動いたら今回動かない
  9.1.3 割り算を使う
  9.1.4 もう一つの方法

9.2 条件実行 258
  9.2.1 行を実行したりしなかったりする 
  9.2.2 くり返しを1回で止める
  9.2.3 条件実行はおいしいか?

9.3 Sunabaで条件実行 264
  9.3.1 前の例はどうなるか
  9.3.2 ゆっくり線を引く
  9.3.3 ここまでを組み合わせる
  9.3.4 押しっぱなしへの対処を整理する

9.4 計算の本当の意味 272
  9.4.1 条件式が正しいということ
  9.4.2 < は一体何なのか....
  9.4.3 Sunabaの計算記号
  9.4.4 では使ってみよう
  9.4.5 使ってみよう

9.5 この章で伝えたかったこと 282


Chapter 10 メモリをまとめて使う 〜四角を積み上げる〜 284
10.1 当たるということ 285
  10.1.1 底に当たるとはどういうことか
  10.1.2 壁にも当ててみる
  10.1.3 次に起こることを考える

10.2 メモリをかたまりで使う 294
  10.2.1 問題を変形する
  10.2.2 積もった順に覚えていく
  10.2.3 全てのマス目がどうなっているか覚える
  10.2.4 二つの方法を比べてみよう

10.3 積み上げる 305
  10.3.1 どんなふうにやるかを整理する
  10.3.2 出発点
  10.3.3 床に当たったら、そこに積もらせる
  10.3.4 新しい四角を出す
  10.3.5 底以外にも積もらせる
  10.3.6 短くしたい
  10.3.7 壁と左右移動を復活させる
  10.3.8 プログラムを整理する
  10.3.9 積もらせる部分プログラム
  10.3.10 落ちる速さと押しっぱなし対応

10.4 この章で伝えたかったこと 328


Chapter 11 メモリに名前をつける 〜列を消す〜 330
11.1 とりあえず消すだけ 331
  11.1.1 おおまかな手順 
  11.1.2 消すプログラム 
    消す条件
    長い!
    くり返しにする
    積もったか覚えていいるメモリを0にする
    マス目を黒で塗って消す
    くっつけると
    実際に使える形にする
  11.1.3 組み合わせる 
    「食券」は買い直すべきか?
    動かしてみよう
  11.1.4 楽に確認したい 
    最初から積もらせておく
    確認を楽にする手間は割に合うか
    テストの部分プログラム化
  11.1.5 落ちないことを確認しておく

11.2 プログラムを良くする 343
  11.2.1 番号指定のメモリに名前がつけられない 
    なぜ番号指定するのか
    番号指定がもたらす問題
    ルールで軽減はできるが
  11.2.2 部分プログラムから部分プログラムを使う時 
    「中央の縦」について補足
  11.2.3 部分プログラムに情報を伝える新しい方法 
    どう動くのか
    用語
    入力の数    
  11.2.4 入力を使ってみる 
    「四角」も改造する
  11.2.5 入力で問題は解決するのか 
    部分プログラムの中で部分プログラムを使う時はどうか
  11.2.6 全体を入力を使うように直す 
    なぜ最初から紹介しないのか

11.3 落とす 358
  11.3.1 一番簡単な例 
  11.3.2 プログラムにする 
    「ずらす」の中身
    条件行
    動く前のマスを消す
    動いた後のマスを出す
    動かしてみよう
  11.3.3 上にたくさん乗っているとどうなるか 
  11.3.4 上に乗るもの全部を落とす 
    順番が問題
    プログラムを完成させる
  11.3.5 もう一つのやり方 
    出発点
    何度も使う
  11.3.6 どちらがいいか 
    修正と作り直し

11.4 この章で伝えたかったこと 371


Chapter 12 全てを組み合わせる 〜四角を回す〜 373
    この章で作るもの
12.1 2つに増やす 375
  12.1.1 落ちてくる四角は今どう表現されているか 
  12.1.2 2個赤い四角を出す単純な方法 
    左右の移動
    条件行の途中改行について
    右も
    落ちる部分
    絵を描く
    動かしてみよう

12.2 回すとはどういうことか 381
  12.2.1 回転以外の要素を一旦忘れる 
    まず2つ現れるだけ
    上キーに反応する
  12.2.2 結果から考える 
    回転の具体例を挙げてみる
    とりあえず緊急回避
  12.2.3 回転には4通りある 
    回った状態にしてみる
    もっと回す
    馬鹿正直な方法の問題
  12.2.4 もっと賢く書く 
    回転を賢くする
    相対位置

12.3 回転を組み込む前に 391
  12.3.1 2つ並べるプログラムを思い出す 
  12.3.2 小さくまとめていく 393
    壁と底
    積もって消える
    四角を消して描く
    結果
  12.3.3 動かせるかを調べる方法を考え直す 
    日本語で書いてみる
    そもそもほしい結果は何なのか
  12.3.4 別のやり方 
    まず左右
    そして下
    プログラムにする
    移動量を名前つきメモリに覚えておく
    何かおかしい
    どう直すか
    これで本当にいいのか?
  12.3.5 2マス分の位置を覚えるのをやめる 
  12.3.6 もっと部分プログラムを活用したい 
    条件行を前もって計算しておく
    部分プログラムにする
  12.3.7 部分プログラムの出力 
    使ってみる
    出力について補足
  12.3.8 整理はもう十分だろう
    まだできることもあるが

12.4 回転を組み込む 410
  12.4.1 回転が入ってくると変わること 
    回転状態
    キー操作
    2マスの位置関係
    これらを想像できるか
  12.4.2 おおまかに書いてみる 
  12.4.3 入力を追加する部分プログラム 
  12.4.4 マス目の場所を計算する 
    でも一旦動くようにする
    動かしてみる
  12.4.5 本当に回す 
    回転は360度で戻ってくる

12.5 ちゃんと動くのか? 420
  12.5.1 おかしい 
    現状どうなっているか
  12.5.2 どのようにおかしいはずか 422
    正しく消えた時はどうだったか
    消えなかった時はどうだったか
  12.5.3 直す 424
    どうやって上から消すか
    プログラムにしてみる
    消してずらしたら終わる
    あれ? もしかして…
    気づかなかったらどうする?

12.6 この章で伝えたかったこと 429


Chapter 13 「表」という考え方 〜ゲームの完成〜 431
13.1 3マスづつ落とす 431
  13.1.1 2と3のプログラム上の違い 432
    「重なってる?」を直す
    「積もらせて列を消す」を直す
    「四角を動かす」を直す
    「マス目位置を計算する」を直す
  13.1.2 3マスつなげる方法は1つではない 
    形はいくつあるか
    代表マスはどれか
    回す前の形を決める
  13.1.3 プログラムにする 
    入力が増える
    とりあえず動かす
  13.1.4 2種類の形が出るようにする 
    回転なしで
    1番も出るように
    間違いを直す
  13.1.5 回転も入れる 
  13.1.6 表という考え方 
    部分プログラムを使う
    相対的な位置に取り換える
    条件実行を消す
    回転が4を超えた場合
  13.1.7 表を前もって作っておく 
    表にしておく、という考え方
    絵も表である

13.2 4マスづつ落とす 451
  13.2.1 3マスと4マスで何が違うか 
    3つの部分プログラムを直す
    3つの部分プログラムを整理する
    「マス目位置を計算する」を直す
  13.2.2 4マスになると種類はどれだけあるか 
    数え上げてみる
  13.2.3 代表のマスと、回す前の形を決める 
  13.2.4 プログラムにしてみよう 
    表を作る
    プログラムに表を入れる
    表を使う
    全種類が出るように
    完成!
  13.2.5 本当にこれでいいのか? 
  13.2.6 手間を省くために 
  13.2.7 あの表には何が書いてあるのか? 
    種類は減らせるのか?
    回転状態は減らせるか?
  13.2.8 回転に関する表を減らす 
    180度回してみると?
    270=90+180
    これを利用する
    もうちょっと整理
  13.2.9 回転に関する表をもっと減らす 
    そのマスはどこへ行くか?
    縦横入れ替えてひっくり返す、ってどういうこと?
    プログラムにしてみる
    「マス目位置を計算する」を書く
    「表から数を取り出す」
    「回転回数だけ、縦横を入れ替え、横のプラスマイナスをひっくり返す」
    「代表の縦横に足してメモリに覚えさせる」
    これで完成

13.3 この章で伝えたかったこと 473


Chapter 14 砂場を出よう 〜始まりの終わり〜 475
14.1 ここまで使ってきた考え方 475
  14.1.1 結果から考える 476
  14.1.2 問いかけ方 476
    問いの変形
    変形の方法
  14.1.3 目標と手段 478
    目的に合うか
    プログラムの技術も手段
  14.1.4 複数の選択肢を用意しろ 
  14.1.5 まとめよう 

14.2 さらに進むために 481
  14.2.1 もうちょっとSunabaで遊んでみる 482
    お手本豪華版
  14.2.2 実用言語に移る 484

14.3 実用言語の大変なところ 484
  14.3.1 使えるようにするのが大変
  14.3.2 動かすための手順
  14.3.3 文法が複雑
  14.3.4 絵や音を出すのが大変 486
  14.3.5 オブジェクト指向プログラミング 486
    オブジェクト指向とはどんな道具か?
    対戦格闘ゲーム
  14.3.6 英語っぽい必要がある 488
  14.3.7 メモリが見えない 489
  14.3.8 おすすめはJavaScript 490
    あのゲームを作ってみた


終わりに、そして感謝 [492-494]
索引 [495]





【抜き書き】

・50頁

 プログラムとは「どういう順番でどのメモリにいくつを覚えさせるか」がひたすら書かれたものだ。プログラムはメモリをいじることしかできない(※)。

 ※ 英語のプログラム(program)という言葉は、「何をどういう順でやるかが書かれたもの」という意味である〔……〕。

・52頁

 なお、メモリの本業は数を覚えることで、一部スイッチとしても働くものもある、という程度である(※)。

 ※ 厳密にはウソだ。むしろスイッチがメモリのフリをしてると言う方が近い。今後も私は説明を簡単にするために積極的にウソをつくが、今のところは「そういうものか」と思っておいてほしい。