したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |
レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。

おちゃめくらぶ掲示板

2531御茶目菜子:2017/01/04(水) 02:06:21
プログラミング上達法
Miiverseで初心者に向けた「プログラミング上達法」を書いてみたにょ。
https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0flviIwFA

リンク先にも書いているけどプログラミングの上達に必要なのは「試行錯誤」の経験にょ。
「試行錯誤」と書くとダメ元でとりあえず適当にやってみるみたいなイメージを持っている
人もいるかもしれないけど実際は「いろいろ試して失敗しつつ完成に近づけてゆくこと」と
なるにょ。

つまり、試行錯誤を繰り返すというのは「失敗をしつつも完成に近づけた経験」を繰り返す
という意味合いにょ。
プログラミングの経験というと成功経験、つまり完成作品の紹介ばかりが語られることが
多いけど実のところ初心者に知って欲しいのはその完成に至るまでの失敗経験にょ。
初心者の多くは完成まで少しずつ形ができていくようなイメージがあるけど実際は「作って
壊して」の連続でスムーズに完成に到達できることの方が少ないにょ。
簡単なプログラムであればスムーズに完成ということも可能ではあるけど慣れている人が
思い浮かべる簡単なものでも初心者にとっては難しいものにょ。
したがって、「失敗経験を繰り返しながら完成に近づける」という試行錯誤の経験こそが
初心者にとっては重要となってくるにょ。

誰しも失敗はしたくないし可能な限りそのリスクを抑えたいというのは分からなくもないにょ。
しかし、作る前からすべて人に聞いて教えて貰うというのはこれからプレイするゲームに
おいてクリアまでの過程を教えて貰うのと何ら変わりがないにょ。
プログラミングというのは「自分が考えたものがプチコン上で動く」ということが一番
楽しいと私は思うにょ。
とはいえ、最終的に自分で考えたものが動くならばすべて人任せだろうと自力で作ろうと
変わらないという人もいるかもしれないにょ。
でも、その考えには私は同意しがたいにょ。

これは「クリア画面を見るのが目的で他人から聞いたりしてすべて分かった状態でゲームを
プレイしてエンディングを迎えた時」と「分からない状態で初めて少しずつ分かっていき
(少しずつクリアできるようになり)エンディングを迎えた時」とで同じ感覚で
エンディングを迎えられるかというとそうではないというのと同じだからにょ。
より端的に言えば推理小説で最初から犯人とその理由が分かった状態で読み始めて
「知らない状態で読んだ場合」と同じ気分になれるかで考えてもらってもいいにょ。

したがって、試行錯誤によって少しずつ完成に向けて近づいていくという過程こそが
プログラミングの醍醐味と言えるにょ。
これはプチコン3号のプログラミングにおいてはいくら失敗しても人的被害は全くないし
失敗しても3DS本体が壊れるという心配もないためにょ。
もしも、失敗したら死亡事故に繋がるようなものであれば識者に十分な確認をして安全を
確かめた状態で始めるようにすべきだけどプログラミングでそんな必要はないにょ。
そして、その試行錯誤こそが完成したときの喜びを何倍にも増幅してくれるにょ。

しかし、試行錯誤では完成の目処が立たずそのまま投げ出してしまう場合もあるかも
しれないにょ。
そうなる前にようやく「他人に聞く」ということが重要になってくるにょ。
あくまで他人に聞くのは最終手段となるにょ。
試行錯誤を繰り返しても分からずネット等で調べても分からず本当に分からなくて
どうしようも無くなったときにも他人に聞けないというのは逆に良いことではないにょ。
分からないことは恥じることではないためにょ。
上達のためには「分からないことを分かろうとすること」が重要なので自分で考える前に
他人に丸投げするというのが良くないことであってちゃんと考えた上(もちろん考えて
試行錯誤を行った上)で分からないことを聞かずにできないよりはちゃんと聞くことが
大切ということにょ。

したがって、「試行錯誤」というのは非常に重要なものといえるにょ。
私もプログラミング経験が30年以上であっても未だに試行錯誤の連続にょ。
もちろん、作り慣れているものであればスムーズに完成に到達が可能だし頭の中で
すべての処理が見えている場合もほとんど問題ないけど作ったことがないものは頭の
中だけではどうしようもないからね。
確かにネットで調べればその解決策が簡単に分かったりする場合も多いけどその
解決策(要するにアルゴリズム)を考えるのが楽しいのでできるだけ自力で行うように
しているにょ。
これは「車輪の再発明」という言葉にもあるように効率という面では決して良いこと
ではないけどその代わりこの経験は自分自身の確実な力になっていくにょ。

その例として上記のリンク先には「簡易毛筆 for 3DS」における試行錯誤した内容が記述
されているにょ。
その部分のみ下記にコピペしたので簡易毛筆において「にじみ」や「かすれ」がどういう
原理でてきているのかとか私がどういった試行錯誤をしたのかというのに興味があれば
初心者に限らず中級者以上であってもぜひ読んで欲しいにょ。


======= 以下Miiverseの私の投稿からコピペ =======

私はBASICを初めてから30年以上経ちますが未だに試行錯誤の連続です。
一例として冒頭にある簡易毛筆について少し書いてみます。

ご存じの人も多いかと思いますが、私は小さいプログラムを作るのが好きでQSP(WIDTH 16を
使用時の1画面プログラム)も多く作っています。
そんな私が1年少々前に作ったのが簡易毛筆QSPです。

https://miiverse.nintendo.net/posts/AYMHAAACAAADVHkm7urBQQ

これはリンク先に書いているようにペンを動かす速さによって「入り」「抜き」が表現
されています。(しかも、QSPで)
これは、すでに単色お絵かきソフトであるPETIT PAINT QSPを作っていたからこそできたので
そこから語る必要がありますが、長くなるので「入り」「抜き」対応の簡易毛筆QSPがあると
いう段階でスタートします。

毎年恒例となる書き初め大会を今年はプチコンBIGコミュでもやりたい。
  ↓
簡易毛筆QSPをプチコンBIGで動作させてみたところBIGのバグによって正常に動かないことが発覚。
  ↓
それならばプチコンBIG用に作り直せばいい。
  ↓
単純移植だとつまらないのでBIGならではの要素が欲しい。
  ↓
高解像度だけではインパクトに欠けるので行数制限無しで作るならば「にじみ」「かすれ」
にも対応してみたい。

というわけで、プチコンBIG専用の簡易毛筆を作り始めたのでした。
しかし、12月29日でお正月の書き初め大会に間に合わせるのは3日しかないという状況下でした。

「にじみ」「かすれ」といってもそんなものは作ったことがないのでどこから手を付けるか
で迷いましたが、単純にエアブラシを作ってみたところ「ふわふわするだけで全然毛筆っぽく
ない」ためこれをどのようにしたら毛筆っぽくなるかで考えることにしました。

そこで、思いついたのが乱数に意図的な偏りを持たせるというものです。
これは以前も書きましたが、乱数を複数発生させてその平均を取ると中心極限定理によって
正規分布に近づくというのが知られています。
https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0fQKcdeZg
簡単に言えば、発生させる数が多いほど平均付近の値が出やすくなるということです。

その考えに基づいたブラシがこれです。
半径がRとするとブラシの中央からR/2付近の値が出やすくなるためこのようなドーナツ型の
ブラシになるわけです。

複数発生させて平均を取れば平均付近の値が出やすくなるということは平均付近を離れた
値は出にくくなるわけで乱数の発生回数によって簡単ににじみをコントロールできると
いうわけです。
どれくらいが適切なのかは考えてもすぐには出てこないため実際にプチコンBIG上で動かして
確かめてみました。
発生させる乱数の数によってどの程度変わるかはプチコンBIGで確かめたところ1ドットあたり
4回くらいがちょうど良い感じに思えました。

この「にじみ処理」はかなり重い処理となるわけですが、簡易毛筆QSPでは線形補間の処理
(ペンを速く動かした場合に線が途切れないようにその間を埋めていく処理)を1ドット単位
で行っていたのに対して「簡易毛筆 for U」はブラシの半径分の線形補間(これより大きい
と隙間ができてしまう)によって処理落ちせず60fpsをキープできました。

「にじみ」ができれば「かすれ」はループ回数を増減によってコントロール可能になります。
(面積あたりの)ループ回数が減ればドットの密度が減ってかすれたようになり、ループ
回数が増えればドットの密度が上がって濃くなるわけです。
同じループ回数ならばペンを速く動かせば必然的に面積当たりではループ回数が減るため
どの速度以上ならばかすれが多く発生するかさえ分かれば良いです。

これも頭の中で考えるのは難しいため実際に動作させて調べてみました。
速く動かすと線が細くなる(ブラシの半径が小さくなる)ような処理になっているため
「速く動いている」というのは線の太さとのバランスも考える必要があります。(十分太い
線になっているのにかすれているということがないようにしなければならない)

普通のエアブラシだとブラシの「中央付近が濃く」「端の方は薄い」という処理になるため
ループ回数を減らしたら端の方からどんどん薄くなるのですが、この乱数を複数発生させた
ドーナツ型のブラシが幸いして「いい感じ」でかすれが発生しました。(端だけではなく
ブラシの中央もかすれてくる)
普通のエアブラシでループ回数を減らせばブラシ中央もかすれるようになるのですが、その
場合は周辺はさらにかすれた感じになりエッジが完全に無くなります。

「いい感じ」になったのは「ブラシ中央が薄いため」だけではなくブラシの半径単位で線形
補間をしたためです。
これによってある程度エッジが効いた状態でかすれが発生するようになりましたが、これも
試行錯誤でループ回数を調整していい感じになるようにできました。

上記の例では1ドットあたり乱数を4回発生させていますが、この数が多いほどドーナツは
はっきりとした形状になります。

BIG版となる「簡易毛筆 for U」がとりあえず完成してやはり次はプチコン3号版となる
「簡易毛筆 for 3DS」を作ってみようとなったわけですが、BIGでさえギリギリ処理落ち
しないレベルのものをプチコン3号でまともに動くのかというのが懸念材料でした。
そんなのやってみないと分からないため解像度だけをプチコン3号用にコンバートした作品を
作ってみたところNew 3DSで動かせばデフォの極太筆でも60fpsをキープでき処理落ちしま
せんでした。
これは画面解像度が低い分だけブラシを小さくしている(半径では約1/2、面積では4分の1)
のが理由でプチコンBIGより3倍くらい遅い(New 3DSで動作する)プチコン3号でプチコン
BIG用のプログラムをほとんど変更無しに動かすことができました。

これでようやく「簡易毛筆 for 3DS」の初期版(ver.1.0.1)が完成しました。

「簡易毛筆 for 3DS」は元々解像度が高いプチコンBIGでの動作を想定しているため
「にじみは抑えられてる」わけだし、旧3DSでの動作は全く考慮されてない(デフォ筆でも
20〜30fpsしか出ないため厳しい)ということもあり、「簡易毛筆 for 3DS」の改良版を作る
ことにしました。

改良するにあたり「にじみ量の調整」「処理速度の向上」は重要な要素ですが、それに
加えて実際に「書き初め大会」での使用者を見ると「太すぎて使いにくい」とか「(普通の
鉛筆書きと同じくらいの速度で書いているため)線が細くなり毛筆っぽさが全然でない」と
いう人もあり、それを改善したイージーモードを用意することにしました。
自分だけで作っているソフトの場合は「分かっていること」前提でバランス調整してしまい
がちです。
しかし、そのソフトを使ったことがない初心者が相手ならば「分からないことを前提」に
しなくてはなりません。

処理の高速化はループ内の処理の極限までの軽量化を行いました。
例えばプチコン3号では乗算より除算の方が速いため乗算処理をすべて除算に書き直しています。
軽量化処理と最適化処理によって実効速度は約3倍になり旧3DS(2DS)では20〜30fpsしか
出なかったデフォの極太筆も60fpsをキープできるようになりました。

というわけで、これが最新のver.1.1.0です。
https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0flPl_jhQ

簡易毛筆QSPが出来てから簡易毛筆 for 3DSが出来るまでの流れ(1年以上の期間があるけど
実質3日分)を書いてみましたが、最初から頭の中だけでできる処理というのは案外少ない
もので多くのものが試行錯誤によって実現されています。
これはどんなジャンルのプログラムにおいても変わらないと思います。

======= コピペ終了 =======

というわけで、初心者に知って貰いたいのは何よりもまずは上達したいならば「試行錯誤」と
いうことにょ。
命令をたくさん覚えたりとかプログラミングの本や講座をたくさん読むなんてことよりも
自分でやってみた経験の方が何倍も大事ということにょ。
自分でやってみてなおかつ不足部分を本や講座等に補えば良いにょ。
これはプログラミングだけに限らず、お絵かき等においても本や講座を読むことで上達する
という誤った考えを持った人が多いけど実際に行った経験(絵ならば描いた経験)が
何よりも重要なものとなるにょ。

絵の場合は見ること(構造を理解すること)というのも重要な経験でありインプットする
経験も必要になるのと同じくプログラミング(ゲーム制作)ならば実際のゲームを見て
ゲームがどのような構造で成り立っているのかを知るというのも上達には必要になって
くるにょ。
しかし、その経験が活きてくるためには実際の試行錯誤があってこそにょ。
それがないと表面だけ見て「分かったつもり」になってしまいがちだけど経験があれば
同じものを見ても受け取る情報は格段に増えるにょ。
これは絵においても同じで見ることが情報のインプットに繋がり重要であるといっても
それを描いた経験がないとどれが必要な情報かも分からずインプットできないにょ。
目の前に見えるものをデッサンするという場合は話は変わってくるけど「情報を自分の
頭の中にインプットする」という目的があるならば事前にその経験を行っているか
否かが非常に重要であり、インプットという過程においてさえも事前の試行錯誤の
経験の有無が重要になってくるということにょ。

そう考えると、初心者が試行錯誤を行うこと無しに質問を繰り返すのは上達という
面では決して褒められるものではないにょ。




掲示板管理者へ連絡 無料レンタル掲示板