質問: ### 前提・実現したいこと 個人で、Unityを使ってオンライン対戦のテキサスホールデムポーカーのアプリを作りたいと考えています。またオンライン麻雀サイトの天鳳のような形で、ランキングやレートシステムを導入したいと考えています。天鳳の公式サイトへ ### 発生している問題 オンライン対戦のテキサスホールデムポーカーのアプリを作りたいのですが、その作成の道筋が明確になっていません。 サーバー構築やオンラインの通信技術については全く分かりません。なので自分の立てた計画に対してアドバイスをいただきたいです。 ### 計画について ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/42bc99adc1787f452a4d34be1dd25d03.jpeg) ### アドバイスしていただきたい内容 ・計画の抜けや、もっとこうした方がいいというアドバイス ・サーバー構築についての期間・おすすめの書籍 ・オンライン通信技術に関しての期間・おすすめの書籍 ・テスト環境に関しての期間・おすすめの書籍 ### 補足情報 私はプログラミング歴1年ほどです。はじめはUnityとC#をTechAcademyのUnityコースで3か月間学びました。 その後、Unityについては書籍をひよこ本、Unityの教科書を読了しました。またWeb上に落ちているUnityの2Dサンプルゲーム10個ほど作成しています。(2DUFOgameやシューティングゲームなど) またC#については、書籍をC#超入門、独習C#を読了。デスクトップアプリなどのサンプルを10個ほど作成しています。簡単な税の計算ソフトや、描画アプリなどです。 使用しているのはWindowsです。はてしなく大変だというのは理解したうえで取り組んでいるつもりです。でもどうしても作りたいです。ぼくの夢なんです。よろしくお願いいたします。
回答: 自分のやりたいことを実現するために努力するのはとてもよいことです、頑張ってください。 本気で作成したいとのことで、長くなりますがご容赦ください。 おそらく、学生かフリーターの方だとお見受けしますので、アドバイスについてですが、まず、厳しいことをいいます。 ### 見積もりその他が甘すぎる そもそも、1週間というのはどのくらいの作業量を想定していますか? たとえば1日2時間の作業で1週間であれば楽に達成できるでしょう。 逆に、1日12時間以上の作業で1週間であったら「個人で作成する」という前提であるなら作業以外の日常生活に必要な時間を考えると非現実的ですよね。 プロジェクトを計画するにあたって、まず第一に必要なのが「どれくらい時間がかかるか」という部分ですが、基本的に「1人日」や「1人月」という考え方をします。 普通に会社で朝から提示まで働いた場合8時間なので、1人日=1人で1日にできる作業量=8時間です。 また、平均して一か月に作業する日数は一週間に5日(週休二日)として大体20日なので、1人月=1人で1か月にできる作業量=8×20日=160時間です。 そして、その時間を割り振る際にはメンバー(今回は貴方だけですが)のスキルから考えてどのくらいかかるかを計算しなければなりませんが、「これから勉強を始める」レベルでその先を決めるのは無意味です。 たとえば「サーバー側のプログラム」について3日と見積もっていますが、100%不可能だと思います。 また、計画にプログラミング部分を入れていますが、「ランキングやレート」の実装をしたいのに「DBの構成」について記述がないですね。 スコアやユーザ情報、ログイン情報などが必要なプログラムになると思いますが、それを保存するためにはDBは必須です。 「個人的」に天鳳と同じような機能の充実したアプリを作成するのであれば、短く見積もってもチームでの作業で年単位になると思われます(これから勉強するならなおさら)。 どうするべきか ======== はっきり言います。その計画、白紙に戻しましょう。 先を見据えることはとても良いことですが、良い目標ばかり先に立ててしまっても百害あって一利なしです。 通常の業務においてすら、リスケジューリングの繰り返し、納期が迫るとデスマーチ。。。ということは往々にしてあることで、個人でその繰り返しをしてしまうと、モチベーションを保つことが難しいからです。 たとえば、学習の完了までに倍かかったとして、完了時に自分のスキルが上がったからこそ見えてくる問題点も出てくるでしょう。そうした場合に「じゃあこれあと何年もかかるかも。。。半年のつもりだったのにどうしよう」となったとき、夢だったとしても、あくまで個人の趣味の範囲なので「あきらめる」という選択肢が出てきてしまいます。 それじゃ、せっかくの目標がもったいないですよね。 白紙に戻してどうするの? ============= 要件定義(やりたいことの書き出し)をしましょう。 というのも、「実現したいこと」に記述されているあいまいな部分ではなく、「具体的に」です。 「ユーザー登録」→「ログイン」→「モード選択」→「各モード」 といった画面はもちろん、画面ごとにどんなパーツが必要で、動かすにはどんなデータ(細かい定義でなく、ユーザー名を表示させたいとか、スコア・レートを表示させたいとか)が必要なのか。 どんな機能を追加していきたいのか。 この部分は、DBやプログラムの知識がなくてもできるものです。 この「要件定義」については、プログラミングに限らず、夢(やりたいこと)を実現するために自分の現状と何が必要なのかをまとめる点で重要な資料にもなります。 要件定義ができたら? =========== 今回のように「最後まで」一気に計画を立てるのではなく、「phpの学習(1人月)」、「C#の学習(1人月)」、「オンラインポーカープログラムの仕様作成(未着手)」、「DB構成(未着手)」。。。といったように進捗度毎にカテゴリを分別し、カテゴリを始める際に計画を立てる方が良いでしょう。 ロードマップ(工程表)に対してマイルストーン(区切り)を設定して、近い目標に向けて作業を行う方がモチベーションを保ちやすく、また工程の管理もしやすくなります。 また、実際の作業としては「要件定義」→「基本設計」→「詳細設計」→「製造」→「テスト」→「本番」と進めていきましょう。 設計がきちんとしてないと製造時に痛い目を見ます。 最後に ==== これがベストだ!というやり方はなかなかありませんが、目標を近いところ近いところに設定して少しずつレベルアップさせるのが挫折しないコツです。 まずは自分の作りたいものを要件定義時に絵でもいいので書いてるのもいいでしょう。 最終目的が可視化されるというのもモチベーションを上げる要素になりますよ!