合同会社モリカワのブログ

森川敬一。CTOとして30年やってきました。集大成としてCTOを増やすという事を目標にやってます。

難題を切り刻め!

皆さんは、難題を目の当たりにした時にどうしてますか?
難題の種類といしては、
・問題が大きすぎて全体像がよく見えない
・体験した事が無いのでよく分からない
・色んな情報が錯綜していて問題の本質が見えない
等があると思います。

そんな時は、難題を切り刻め!

中学でならった因数分解。これの目的って覚えてますか?
因数分解は、2次方程式や3次方程式等の方程式を解くための前準備でした。公式に当て込む事が出来れば解を求める事が出来ますが、問題に出てくる式は、そのままでは利用出来ません。そのため、事前に因数分解をやって、公式に当てはまる形に変換して公式をときます。
これと同じで、難題も小さく分解していけば、実は過去に扱った公式に当てはめて解決できる事が多いです。
いきなり問題を解こうとするのではなく、事前準備が大事という事です。

問題が大きすぎて全体像がよく見えない時は

先ずは現状を小さく分解して整理します。現状が小さく整理できれば、今度はそれを抽象化すれば全体像が見えてきます。一度小さくして、抽象化する。これにより、課題の数や課題の関係性、ボトルネックが見えてきます。
よく見る失敗例としては、問題が大きすぎて全体像がよく見えない状態で、1つの課題に対してフォーカスして解決しようとする事です。局所的に課題を対処しても課題が絡み合っている時は、全く解決しない事が多いです。
これは、フィードバックの連続によって世の中が成り立っているからです。つまり、ある事象が起こると次の事象につながる。更にその事象から次の事象へと雪だるま式に起こるので、ただ1点の課題を解決しても他の事象が起こるし、そもそも、その解決しようとしている課題は、別の場所から発生した課題の可能性もあります。
先ずは、一度小さくして、抽象化してみてください

体験した事が無いのでよく分からない時は

目的を分解して、出来るタスクに分解して下さい。
例えば、来Qでシステムのパフォーマンスを10%アップさせる。コストを15%ダウンさせる。
こんな時、どこから手をつけて良いのか分からない事が多いと思います。
こんな時は、先ずは、出来るタスクに分解して下さい。
システムのパフォーマンスをアップさせるためには、
1.サーバーのパフォーマンスを向上させる
1−1.プログラミングでCPU利用を減らす
1−2.プログラミングでメモリ利用を減らす
1−3.プログラミングでDBアクセス数を減らす
1−4.プログラミングでAPIアクセス数を減らす
といった具合に小さなタスクに分解すれば、やる事が見えてきます。オートマチックに小さなタスクをクリアすれば、大きな目的がクリア出来る状態に変化しているでしょう。

色んな情報が錯綜していて問題の本質が見えない時は

情報を整理して、どこが課題がを分析してみて下さい。
例えば、Lineメッセージ配信で負荷が掛かってシステムがダウンしたけど、サーバーが悪いという人、データベースが悪いという人、プログラミング(SQL)が悪いという人。色々とあると思います。
こんな時は、
・ネットワークの問題(ネットワークトラフィックやLB)
・サーバーの問題(CPUやメモリ、ロードアベレージ
・データベースの問題(CPUやメモリ、ロードアベレージ
・外部APIの問題(レスポンススピード、回数)
・キャッシュの問題(レスポンススピード、回数)
等、全てをチェックしボトルネックを把握し対処していきます。もちろん、一つのボトルネックが解消されると別の部分がボトルネックになったりするので、これを何度も繰り返します。
負荷が高いからと言ってサーバーのspecだけを上げてもコストの無駄になるだけです。課題を整理して分析しましょう。

最後に

この他にも難題に対して、動けなくなる時は沢山あると思いますが、難題なんて小さくすれば怖くない!
全ての難題は、小さく切り刻めば、自分の手のひらで解決できます。
怖がらずに、焦らずに対処してみて下さい