はじめに
プログラマーの皆様へ
このページでは、プログラミング歴の浅い方が楽しくプログラミングをするための手助けになるかもしれない私の持論をまとめたものです。
人によって全く異なる意見をお持ちの方も多くいらっしゃることをお伝えしておきます。
また、以下の前置きは皆様の時間を浪費させるだけの無意味な文章です。賢明な皆様におかれましては、とっとと次節に進むことをお勧め致します。
さて、プログラミング力とは何でしょうか。
コードの短さ・美しさ、言語の知識、可読性……。あるいはタイピングのスピードこそ重要という人もいるかもしれません。
今このページを見ているあなたは何だと思いますか?
当然、業務の内容や時間によって答えは変わるでしょう。しかし、どんな状況でもあればあるだけ良い力があります。
それは『発想力』です。
例えば、突然「入力された数以下の素数を列挙するプログラムを作成してください」と言われて、ぱっと作り方が浮かびますか?(作り方というのは、コードの中身ではなく流れのことです)
もしあなたがプログラムをしたことがないのであれば、思いついた方法があなたの発想の限界です。もし経験者であれば、同様のプログラムを作ったことがあってすらすら答えられる方もいるでしょう。
つまり、発想力とは経験値なのです。
何を当たり前のことを、といった感じですが、これを意識するのとしないのとでは大違い。
3つの発想、と銘打ちながらまだ1つめにも入っていないこの文を読むくらいなら、面白そうな言語のIDE(統合開発環境)をインストールしたほうが良いくらいには、経験を積むのは大切なことです。
本ページでは、プログラム未経験者の方や始めたばかりの方が、意識の隅に置いておくと少しだけ作業が捗るかもしれない3つの知識をお伝えします。
プログラミングで生計を立てている方には当たり前のことかと思いますが、熟練者は恐らくこのページを開いていないと思われますので問題ないでしょう。
熟考の発想 ~目標達成へのビジョンを立てる~
さて、突然ですが問題です。
問:トランプ52枚を使ったゲームを作りたい。
シャッフルしたカードを、n人のプレイヤーにすべて配るプログラムを書け。
あなたはどう作るでしょうか。見た瞬間から書き始められますか?
きっと、すぐに書き始めるのは難しいと思います。そうしたとしても、不要な部分や足りない部分が出てきて、同じ場所を書き直すことになるでしょう。
そこでお勧めしたいのが、『作りたいものができたとき、まずはどういうプログラムを書くかをまとめること』です。
まとめる場所はノートでもメモ帳でもコメント文でも構いません。とにかくこれを見れば何をプログラムすればいいのかわかるという流れ図のようなものを書くのです。
例えばこの問題なら、
まず52個の数字を格納できる配列(リスト)変数を作る
そこに1~52を順に入れる
それをランダムに並び替える
52/n個ずつ先頭から数字を取り出して、順に1,2,3…人目の手札の番号とする
最後に、その数字をそれぞれ対応するマーク・数字に変換して手札とする
こういったふうにまとめておけば、その過程で、52枚を等分できない人数のときはこのプログラムは成り立たないことが分かりますし、それを回避するためには先頭プレイヤーから順に1枚ずつ配るのを52回繰り返したほうが効率がいいということも分かって来るのです。
この作業は、作りたいものが複雑であればあるほど効いてきます。上に書いたものをさらに詰めていけば、最終的には必要な変数、クラス、ヘッダファイルなどなどがすべて見えるようになってくるのです。
では次に、その構想をより確固たるものにするための方法のひとつを、具体的に見てみましょう。
算数の発想 ~四則演算を駆使して処理を減らす~
問:ボタンを押すたび、xの値が0なら1に、1なら0にするにはどうすればいいか。
ここで聞きたいのは、ボタン入力の受け取り方ではありません。ボタンで入力があったとしたとき、0と1を交互に切り替えるにはどうすればいいでしょう。
答えは簡単ですね。
もしxが0なら…xを1にする
そうでなければ…xを0にする
プログラムで言う、If-else文というものです。(もし~ならA、そうでなければB)
ですが、これをもう少しエレガントに書きたいと思いませんか?思ってください。
この動作は、こう書くことが出来ます。
x=1-x
どうでしょう。さっきの冗長なif文よりはずっと短く、美しくなったと思いませんか?(補足1)
もし皆様の中で、初めにこの方法が浮かんだ人が居るなら、あなたは柔軟なプログラムの発想力を持っているでしょう。
では続いての問題です。ヒントは『商と余り』。
問:1~52の数字を、それぞれトランプの数字とマークに割り当てるにはどうすればいいか。
これを、もし1なら…2なら…と52回書くのはプログラマーとして非常によろしくないのは明白です。ではどうするか。こうしましょう。
数字:n=(x-1)%13+1
マーク:x=x%4
(%は余りを表す演算子。7%3=1、50%6=2といった感じ。)
xに1~52の数字を入れます。
例えば1なら、数字:(1-1)%13+1=1
、マーク:1%4=1
となりました。
51なら、数字:(51-1)%13+1=12
、マーク:51%4=3
となります。
つまりこの式で、数字を1~13、マークを0~3に分類できるのです。(理由2)
このように、小学生レベルの算数でもうまく使ってやれば処理を短く・軽くすることができます。
注意する点としては、パッと見で理解しづらい数式になることもあるので、しっかりコメントをつけておくことです。思い出すのに時間がかかっていては時間がもったいない。
引用の発想 ~先人の知恵を最大限生かす~
プログラミングの力を高めようとするとき、一番良いのはいろいろなプログラムをとりあえず書いてみることと完成させること。どんなに簡単なものでも、完成したときの達成感というのはプログラミングを続けるモチベーションの上昇につながるスパイスです。
しかしここで陥りやすいのが、自分の力だけで完成させようという発想。
大変良い心がけですし、実際それでも力量は大いに上がります。
ですが、あなたが新しいプログラムを学ぶとき、その発想は後々になって思いもしない影響を及ぼすことになり得るのです。
というのも、プログラム言語というのは目的・用途別に向き不向きが存在します。つまり、たいていの言語はその目的に準じた機能が多めについていたりするのです。
そのため、特に2つ目以降の言語を学ぼうとしたときに多いのですが、頑張って1から実装した関数・クラスが、実はその言語には元から存在した関数だった3などという事態が往々にして起こるのです。
それを回避するためにも、あなたが新しい言語に触れる際は、積極的にWeb上のサイトや掲示板などを活用するようにしましょう。プログラミングの教本も大いに役立ちますが、特に初心者向けに書かれたような本には、マイナーなコマンドの記載がないということもあります。時間の無駄を起こさないためにも、最初は先達の知恵を借りるということを忘れないようにしましょう。(自分で書くのは時間の無駄だ、というわけではありませんよ!)
おわりに
長々と書きましたが、簡単に言ってしまえば、
『書く前に考えて、数値を扱うときも考えて、分からなければ誰かに聞く。』
みなさんのプログラミングライフが楽しいものでありますように。
脚注
-
このように、数値・状態を入れ替える動作をトグルと呼びます。今回は0と1のトグルなので、論理否定の演算子(一般に
^
)を用いて、x=x^1
、あるいはx^=1
と書くこともできます。 ↩ -
同じ数字1になる番号である1,14,27,40は、それぞれマークを表す数字が1,2,3,0になります。これは他の数字でも同様で、かぶりが生じません。これはなぜかというと、13と4は互いに素(1以外の公約数を持たない)であるためです。
例えばトランプが48枚、数字が1~12だったとすると、数字が1になる番号は1,13,25,37となり、マークを表す数字はすべて1になってしまいます。これは、12と4は互いに素ではない(2,4が公約数)であるためです。
これを解消するにはどういうコードを書けばいいか、などを考えるのも楽しいかもしれません。 ↩ -
このページを書くきっかけにもなった、私の実体験です。
どれだけ本を見ても分からずに2週間経ったプログラムが、掲示板で質問したら知らないコマンドを教えられて、それを検索して使ってみたら20分で出来たという……。 ↩