アプリを開発してみてわかった、自分の勘違い、失敗、未熟なところ。

すごろくアプリを作っていて、自分がいかにプログラム設計能力がないのかが、ありありとわかりました。
コンソール上でしか動かないものですら、自分には決して簡単ではありませんでした。
ですがそこから重要な知見も得られたと思うので、今後の方針と合わせて以下にまとめてみたいと思います。
以下、目次です。

アプリの完成イメージを持たないまま作り始めてしまった。

これは実際に作ってみないとわからない部分もあると思うので、必ずしも悪いことではないかもしれません。
ですが自分くらいの実力では、書きながら考えるというのは少し難しかったです。
作りたいものが曖昧なままスタートしてもいいけど、書き始める前に一瞬立ち止まって考えるようにした方が、結果的には早くいいものが作れそうな気がします。

I/Oが決まっていないものにTDDを導入しようとした。

これはプログラム設計能力というより、TDDがどういうものなのかと言うのがわかっていなかったという反省点です。
自分がTDDを導入しようとしたのは、「実際に起動して動作確認するのが面倒くさかったから」なのですが、正確に言うと「後半に動作するメソッドの動きをさっさと確認したかったから」です。


すごろくアプリは、以下のような動作をイメージして作っていました。

  1. プレイヤーを登録する。
  2. 順番にサイコロを振って駒を進める。
  3. ゴールした順をランキングとして表示する。


このうち、1と2はほぼ出来上がっていたのですが、3がまだうまく作れていませんでした。
作ったら動かしてみないと正しく動作するかがわかりませんが、普通に動かして3の動作を確認するのは、1と2の動作を経なければならず、かなり面倒です。


そこでTDDならば、動作を確認しながら、出来ていない処理も作り込んでいけるのでは、と考えたのです。


実際はそんなことはありませんでした。
自分はまだ、ランキングの処理をどのように実装するか、具体的なイメージが出来ていなかったため、テストケースを書くことができなかったのです。
これは先述した、「アプリの完成イメージを持たないまま作り始めてしまった」と同じ問題とも言えるかもしれません。


プログラムは入出力をするものなのだから、どういうアルゴリズムにするかはともかく、入出力のイメージが曖昧すぎては書くことが出来ません。
経験豊富な人なら別かもしれませんが、自分にはそれだけの実力がありませんでした。

単純にアルゴリズムに関する知識が足りなかった。

すごろくアプリは、思いついたままに楽しく作るのが目的だったので、思いついた機能はどんどん追加していきました。ランキング表示もそのひとつです。
ですが、どのようにすればランキング表示機能が作れるのかがよくわかりませんでした。


配列やソートなどを使えばいいことはなんとなくわかるのですが、それをどう実現すればいいのか、という具体的なレベルの解答を、自力で出すことが出来ませんでした。


アプリの完成イメージが持てないこと、TDDを誤解していたことは、個人的にはまだ仕方ないと言えなくもなかったのですが(イチから開発した経験、TDDの経験がないから)、これに関してはもうただただ恥ずかしい話です。


それほど大した仕事をしているわけではなくとも、一応ソフトウェア開発の企業で働いているのに……顔から火が出るとはこのことかと思いました。

クラスの使い方が、たぶんあまり良くない。

ここに関しては、正直よくわからないです。
オブジェクト指向でプログラミングしたことがないので、いいも悪いも評価できないからです。
ですが使いこなせているという実感はないし、メソッドも変数もどういう根拠でそう設計したのかと問われると答えられないので、仮に良い設計をしていたとしても、それは自分の実力ではありません。
(ネット上で簡単に調べただけでも、あまりいい設計じゃなさそうなのはわかってきましたが……)

まとめと対策

  • アプリの完成イメージを持たないまま作り始めてしまった。
  • I/Oが決まっていないものにTDDを導入しようとした。
  • アルゴリズムに関する知識が足りなかった。
  • クラスの使い方が良くない。


……こんなところでしょうか。
そして、それぞれに対する策を考えてみました。

  • アプリの完成イメージを持つために、どんなものを作りたいかを紙に書き出しながら作る。I/Oも極力明確にする。

いいものを作りたかったら、完成イメージを明確にするよりも、自由な想像力で自由に書いてもいいのではないかと思いますが(それこそ絵や詩のように)、いまの自分にはそんな実力はありません。
ちゃんと完成させるためにも、せめて外側から見たときにどんな振る舞いをするかくらいは決めてから作ろうと思います。
そのために、完成イメージはできるだけ具体的に、紙に書き出すようにします。
こうすれば、TDDも導入できそうです。

  • アルゴリズムについての知識を身に付けるために、本を一冊読む。

Amazonで評判のよかった、この本を読んでみようと思います。

珠玉のプログラミング 本質を見抜いたアルゴリズムとデータ構造

珠玉のプログラミング 本質を見抜いたアルゴリズムとデータ構造

アルゴリズムは、単に答えを覚えるだけでは意味がありません。
それならば調べれば済む話です。実際、他の勉強を優先したほうがよいのではとも思いました。
ですが考え方を身につければ、それはいろんな場面で応用できそうです。
考え方の過程が詳しく書いてあると評判の本のようなので、身に付けられるように頑張ります。

  • クラス設計の知識を身に付けるために、本を一冊読む。

クラス設計については、この本を読んでみようと思います。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

有名な本で、評価も高かったのでこれにしてみました。
Javaはあまりわかりませんが、細かい文法が違うだけで、本質は同じだと思いますので、読めないことはないと思います。


デザインパターンについて書かれたネットの記事が面白かったので、勉強というよりは普通に楽しめそうな気がします。
合理的に組み上げられたものの仕組みを知るのって、好きなんですよね。


対策としてはこんなところでしょうか。
まだすごろくアプリは完成していませんが、自分に足りないところが明確になっただけでも、取り組んでよかったと大いに思います。


これからも食っていけるプログラマ目指して頑張ります。