2020年9月26日土曜日

プログラミングのロジックはアナログから考えろ

こんにちは。

経験が浅いプログラマーは、
「このプログラムのロジックが思いつかない。」
「プログラミングのロジックってどうやって考えれば良いの?」
と悩むことがあると思います。

ロジックというのは、処理の手順のことです。

私は、以下の方法でロジックを考えています。
  1. プログラミングのロジックはアナログから考える
  2. アナログな方法を抽象化する
  3. ループ処理を入れ子にしない

私は10年以上プログラマーとして働いて来た。
経験が浅い頃は、ロジックが分からなくで悩んだりしていました。
でも、今ではロジックが分からなくて悩むことはなくなりました。

いろんなロジック考え実装してみて、たどり着いた結論が上の3つの方法になります。

以下で細かく説明していきます。

1.プログラミングのロジックはアナログから考える

プログラミングのロジックは、
アナログな処理を自動化することです。

なので、まずは、
「自分がこの処理をするなら、どうやってやるか?」
を考えてみましょう。

例えば、
与えられた2つの数字から、その間の合計を計算するロジックを考えてみます。
与えられる数が1と10なら、55を返えします。

その場合、
1+2+3+4+5+6+7+8+9+10=55
と計算しますよね。

なのでロジックとしては、以下になります。
  1. 与えられた小さい数に1を加える
  2. 与えられた小さい数を合計に加える
  3. 合計に1で作成した値を加える
  4. 1で作成した数に1を加える
  5. 3、4を繰り返す
  6. 4で作成した数が与えられた大きな数になったら終わり
  7. 合計を返す

でも、実際にプログラマーとしてロジックを作っていると、
アナログな方法が分からないこともあります。

そんな時は、プログラミングの依頼内容が理解できていないのです。

なので、プログラミングを依頼して来た人に聞いてみましょう。

つまり、プログラミングのロジックを考えるにはアナログな方法を考えるのが1番です。

2.アナログな方法を抽象化する

上で書いた方法は、アナログなロジックです。

プログラミングする上では、アナログなロジックでも良いのですが、
処理速度が遅くなることがよくあります。

上の例だと、与えられる小さい数と大きい数の差が大きい場合、時間がかかってしまいます。

そこで用いるのが抽象化の考えです。

上の例だと、数学に強い人はすぐに分かると思いますが、
以下の式で求めることができます。

合計 = n * (a + b) / 2
aとbは与えられた数
nは、aとbの間の個数 (b - a + 1)

このように、ロジックを抽象化することで、
常に同じ処理時間で処理できるロジックを作ることができます。

3.ループ処理を入れ子にしない

これは、プログラミングのロジックを考える方法ではないのですが、
ロジックを考える上で、常に頭に入れておいた方がいいことです。

ループ処理というのは、繰り返し行う処理のことです。

つまり、繰り返し処理の中で、繰り返し処理を行わないということです。

ループ処理が入れ子になると、処理時間がかかるからです。

例えば、
10回ループする処理の中で、100回ループする処理が入っていたとします。
すると、その処理の中では、1000回の処理が実行される事になるのです。

ループの回数が固定なら、同じ処理時間で終わるのでいいのですが、
ループの回数が与えられた数で変動する場合は、処理を見直した方がいいです。

特にwebシステムの場合は、データが多くなるにつれて処理が重くなり、
挙句の果てに、画面表示がタイムアウトする事になります。

このような不具合はよくある事で、
最初はサクサク動いていたのに、使っていくうちに重くなっていくのです。

どうやって勉強すればいいの?

最後に、プログラミングのロジックの勉強方法について書きますね。

プログラミングのロジックは、
「どんなシステムを作るのか」
「どんな処理を作るのか」
とさまざまです。

なので、勉強して覚えられることではありません。

でも、いろんなロジックを見ていると、
「あそこで使ってたロジックが使える」
「あのロジックを少し変えれば使える」
と思い出せるようになります。

経験が浅いうちは、ソースコードを読む事も少ないと思います。

しかし、Web上には多くのシステムのソースコードが公開されています。

公開されているソースコードをまずは読んでみましょう。

何故このようなロジックになっているのか
を考える事でプログラミングのロジックを鍛える効果があります。

また、プログラミングについても知識を増やせると思います。

まずは試してみてください。

では、今日はこの辺で。

2020年9月10日木曜日

プロジェクトのリスクはマネージメントする事で軽減できる

「プロジェクトのリスクをマネージメントするにはどうしたら良いか?」

私は、プロジェクトを任されると、いつもこの疑問にぶち当たってしまいます。
特に、初めてプロジェクトを任された時は、この疑問が重くのしかかって来ました。
なので、今回は、そんな自分へ向けて、解決策を明示したいと思います。

結論を言うと以下になります。
  1. 管理
  2. 監視
  3. 見直し

私は、これまで大きなプロジェクトのマネージメントの経験はありません。
しかし、複数の小さなプロジェクトをマネージメントして来た。
また、その中で、大きな問題は発生してしまい、何度も失敗を繰り返して来ました。
そんな私が、以下で説明していきます。

プロジェクトのリスクはマネージメントする事で軽減できる。

プロジェクトでは、複数のリスクが発生します。 そのリスクを回避する事で、プロジェクトは利益を得るのです。

では、どのようにマネージメントするのかについて、以下で書いていきます。

1.管理

管理する内容は以下になります。
  • リスク内容
  • 判断基準の作成
  • 対応策の作成

リスク内容

プロジェクトのリスクは、経験上、似た内容のリスクが考えられます。
そのため、経験を詰めは、リスク内容は現実的になって来ます。
システム会社ならば、それまでの実績からリスクの一覧は既にあるでしょう。
なので、リスク内容の精査をするだけで、リスク内容の一覧はできるでしょう。

判断基準の作成

こちらも、既にある判断基準を利用できます。
しかし、プロジェクトの規模によって判断基準は変わって来ます。
なので、判断基準は、プロジェクトごとに見直す必要があります。

対応策の作成

対応策については、プロジェクトごとに考える必要があると、私は考えています。
マネージャーによっては、既存の対応策を使用する方もいます。
しかし、プロジェクによって状況が違うため、対応策については、その都度考える必要があると思っています。

2.監視

監視は、上記で書いたリスクの一覧をもとに、プロジェクトを監視します。
プロジェクトの状況が、判断基準を超えないようにすることが重要です。

プロジェクトは、状況が刻々と変わっていきます。
そのため、リスクの判断基準の監視を忘れていると、いつの間にか超えていたと言う状況になるのです。

ただ、マネージャーを経験したことのある方は分かると思いますが、マネージャーの仕事は多いのです。
しかし、リスクが発生してしまうと、大きな損失を被る可能性が高いので、リスクの監視は常に行うようにしましょう。

良い方法としては、定期的に行うことです。
例えば、朝と定時前に判断基準をもとに確認することです。

リスクによっては、数時間間隔で確認する必要があるかもしれません。
その時は、数時間間隔で確認をするのです。

特に、判断基準に近づいているリスクなどは、数時間間隔で監視した方が良いです。

3.見直し

リスク一覧は、定期的に見直すことも必要です。

プロジェクトは、時々刻々と変化しています。
そのため、プロジェクト初期に作成されたリスク一覧は、工程やフェーズによって見直す必要があるのです。

もちろん、対応策についても見直しが必要となります。

私の経験から言うと、工程ごとにリスクは違って来ます。
また、後工程になるほど、対応策が具体的になって来ます。

何故、後工程ほど対応策が具体的になるかと言うと、プロジェクトの初期は、自分のチームで解決する必要があることでも、後工程になるとお客様の状況も分かるようため、お客様を含め解決策を返答することができるのです。

例えば、プロジェクト初期では、試験工程に遅延が発生したとしても、マンパワーでやり切るしかなかったリスクも、後工程になると、お客様に手伝ってもらう対策も打てるようになるのです。

ただし、プロジェクト初期でリスク対策を検討する時に、お客様を当てにするのは間違いです。
十分にコミュニケーションを取った後で、もしもの時は手伝ってもらえる状況が作れた時にお手伝いをお願いする事になります。

なので、それまでに、お客様の状況や立場を十分に理解し、プロジェクトの状況も共有して理解してもらう必要があるのです。

このように、リスクは、工程やフェーズで見直す必要があるのです。

まとめ

今回は、プロジェクトのリスクをマネージメントする方法についてまとめてみました。

結論は、リスク一覧を作成し、プロジェクト中はリスクの監視をします。 そして、工程ごとにリスクを見直しするのです。

こうしてプロジェクトのリスクマネージメントについて書いていると、そんなに難しくないように思えるかもしれません。 しかし、実際にやってみると、これが凄く難しいのです。

私も、これからも試行錯誤していくと思います。

では、今日はこの辺で。