投稿日時:

皆さん、こんにちは。フロンティアリンクの佐藤です。前回の第一回コラムでは「世の中を動かす力-『プログラミング』技術」と題して、現在の世の中に欠かすことの出来ない技術である「プログラミング技術」について、その特色を述べました。今回のコラムでは、プログラミング技術は開発者・技術者だけでなく、ビジネスに携わる全ての人々にとって有効なスキルであり、プログラミングスキルがあらゆる仕事に共通の「基礎体力」を形成することに役立つことを述べていきたいと思います。

「ビジネスにおける基礎的な能力」というと、皆さんはどのようなスキルを想像されますでしょうか? 2012年8月に日経BPコンサルティング社が20代の若手社員及び40代の管理職合わせて約1,000名に対して行った「企業で必要なスキルと大学教育に関する調査」によると、「課題設定力」「グローバル視点」「能動性」「創造力」「伝達力(コミュニケーション力)」「視覚化力(プレゼン力)」等がビジネス上の必要な能力であるとのことでした。

私自身がビジネスに必要な基礎的能力を3点挙げるとすれば「創造力」「論理思考力」「コミュニケーション力」となります。先程の調査結果における「課題設定力」「伝達力」「視覚化力」は全て「論理思考力」がベースとなりますし、「創造力」を高めるためには自ずと「グローバル視点」や「能動性」が必要となります。そのため、どのようなビジネスにも共通の基礎スキルとしては「創造力」「論理思考力」「コミュニケーション力」の3点が重要であると私は考えますが、実はプログラミングスキルを習得することで、これら3点の力を「全て同時に」引き上げることが出来るようになります。だからこそ、私はプログラミング技術は開発者・技術者だけでなく、ビジネスに携わる全ての人々が習得すべき「基礎スキル」であると思っています。

まず、プログラミングスキルと創造力の関係について説明しましょう。前回のコラムで、プログラミングとは「人間の思考様式と行動を自動的に再現することによる価値創造手段」であると書きましたが、プログラミングとは「価値創造ツール」すなわち「無から有を生み出すことが出来る」ツールであるということが言えます。ただし、プログラミングだけで全ての価値が創造できるわけではありません。プログラム=ソフトウェアと、それと組み合わされるハードウェア=機械、さらにはそれらを活用する「人間」が存在することで、初めて様々な価値が創造されます。ここでの大切なポイントは、新しい価値を創造したいと思った際に、それが「ソフトウェアのみで出来ること」なのか、「新たなハードウェアも必要となるもの」なのか、あるいは「人間の関与が不可欠なもの」なのかを見極めることになります。この見極めこそがまさに「創造力」が最も発揮される領域なのですね。

ビジネスの目標を達成するために、

1. パソコンやスマートフォン等の既存ハードウェアや、その上で動作する既存ソフトウェアを活用し、目標達成のためのソフトウェアのみを新規作成する必要がある
2. 既存ハードウェアだけでは目標達成が出来ないので、追加ハードウェアを作成または購入し、さらにそのハードウェア用のソフトウェアも新規作成する必要がある
3. ハードウェアやソフトウェアでは解決しないので、人手をかける必要がある

これら3つのケースが存在するとした場合、必要なトータルコストは一般的には1→2→3の順に増加します。言い換えれば、実現したいことを出来るだけ「1」=ソフトウェアの開発のみで達成できるように様々な視点で考えることが必要ですが、この検討を進める上では「出来ること」「出来ないこと」の切り分けはもちろんのこと、ありとあらゆる代替手段を検討したり、あるいはビジネス目標(または目的)に立ち返り、本当に必要なものなのかどうかを熟考するなど、非常に高い「創造力」が要求されます。

この創造力を高めるためには、まずは当然ですが「ソフトウェアで出来ること・出来ないこと」の見極めが出来なければなりません。例えばある業務改善を行うために「Excel+マクロ/VBA」(=ソフトウェア)だけで処理が出来るのか、それとも「専用のデータベースサーバー」(=ハードウェア)との連携処理が必要なのか、というイメージですね。これが出来ないと「マンパワーの力業で解決する」という非効率な選択肢しか出てこなくなる可能性があります。そのためにはまずは「プログラミングスキル」を習得し、「プログラムとは何か」「プログラム=ソフトウェアで出来ることは何か」を知る必要があるということになります。逆に「ソフトウェアで出来ること・出来ないこと」の判断が可能になれば、思考回路の範囲を拡張し「人間でなければ解決できないこと」を創造的に検討することも可能となります。すなわち、プログラミングスキルは創造力を高めると同時に「問題の本質」を考えることにも役立つということになります。

次に、プログラミングスキルと論理思考力の関係について説明しましょう。プログラミングは「プログラミング言語」と呼ばれるプログラム記述のための仕組みを使って作成されます。実は、プログラミング言語のルール自体はさほど難しくはありません。実際、例えば弊社のVBAやJava等のプログラミングセミナーでは、プログラミングの基本ルールは1-2日で習得出来るようにカリキュラムを設定しています。ただし、ルール自体はそれほど難しくなくても、実際に「どのようにルールを適用するか」言い換えれば「自分が実現したいことを、どのようにプログラミング言語で書き表すか」を自分自身で考えられるようになるためには、膨大な練習が必要です。これがまさに「論理思考力」を強化するプロセスになるのですね。

論理思考の基本は「ピラミッド思考」すなわち「論点(階層)の掘り下げによる詳細化」「同一階層における事由や状況の網羅」
「各論点・事由等の順序指定」によって行われますが、プログラミングはまさにこの「詳細化」「網羅」「順序指定」を行うことで作成を進めていくことになります。開発したいテーマがピラミッドの最上段にあり、その機能毎に詳細化を行い、詳細化を行った各ブロックに対して、そのブロックに必要な開発要素を網羅し、さらに各要素間の実行順序を指定することで、全てのプログラムは作製されます。

言い換えれば「開発テーマはどのような大まかな要素に分解することが可能か」「それぞれの大まかな要素を実際にプログラムとして記述するためには、何をどのような順番で網羅すれば良いか」ということを繰り返し考えていくのがプログラムのロジック・アルゴリズム作成の基本的な流れであり、この作業を開発テーマ毎に何度も行うことになります。さらに論理思考を考える上での大切なポイントである「MECE(Mutually Exclusive and Collectively Exhaustive)=『漏れ・ダブり無し』」の考え方についても、「重複する機能・プログラム記述をひとまとめにして共通化する」ことを通じて「ダブり無し」の状態を徹底的に創り上げ、その上で必要な開発要素を「漏れなく」網羅していくことで、MECEの考え方を「実践的に」習得することが出来ます。まさに「よいプログラムはMECEである」と言えるわけです。

私自身も論理思考=ロジカルシンキングをプログラミング以外にもMBA等を通じて習得し、また実際にセミナーでも教える立場にありますが、自分自身の経験や、他の論理思考に関する書籍等を読んで思うのは「プログラミングほど論理思考の習得に適した仕組みはない」ということです。通常の論理思考の学習方法が抱える一番の問題は「現実(=業務上)のテーマに対する答えが分かりにくい」ことと「自習に適さない」ことにあります。論理思考を「考え方に筋道が通っているかどうか」と読み替えれば、筋道がきちんと通っているかどうかを判断することは最初は専門家(コンサルタントや講師等)の手助けを借りなければ、自分だけではなかなか出来ません。従って、通常の論理思考の学習方法は「仕組みは理解できるけれど応用が利かない」「自分一人では学習を進めにくい」というものがどうしても多くなってしまっているのが事実だと思います。

一方でプログラミングの場合、そのロジック・アルゴリズム=論理を考えてプログラムを記述し、実行して結果を得ることができれば「自分の考え方は一応は合っている」ことが分かるわけです。「一応は」と付けたのは、重複する記述を共通項にくくり出していなかったり、非効率な(=プログラムのステップ数が多い)記述をしていたりしていても「実行」は出来るため、その点については自分自身で気をつける必要があるからなのですが、この点についても「同じことを実行するプログラムであれば、ステップ数が少ない方が良い」という原則を守るだけで、アルゴリズムのブラッシュアップも自分で出来るようになります。言い換えれば「より洗練された論理思考」を「自習で」身に付けることがプログラミングの場合は可能であるということなのです。

最後に、プログラミングスキルとコミュニケーション力の関係について説明しましょう。プログラミングスキルの習得とコミュニケーション力向上に関連性があるということには、少し意外に思えるかもしれません。特に先程の「論理思考力」との関連で、プログラミングは「自習」出来る点が他の論理思考力向上法よりも優れていると書きましたので。

「コミュニケーション」の定義を広辞苑で調べると

コミュニケーション【communication】社会生活を営む人間の間に行われる知覚・感情・思考の伝達。言語・文字その他視覚・聴覚に訴える各種のものを媒介とする。

とあります。この定義をもう少し整理して考えると、発信者から発せられた「情報」が受信者に伝わること、言い換えればコミュニケーションとは「複数の関係者間での情報伝達と共有」と言い換えることが出来ます。プログラミングの場合は確かに基礎的なものであれば一人で開発を進めることが普通ですが、より実践的かつ大規模なプログラミングを行う場合は「外部からの開発テーマ指示」の下に「複数の開発スタッフが機能分担をして」作業を行うことが殆どです。すなわち、実践的なプログラミングの場においては、様々な形での「コミュニケーション」に基づいて、複数の関係者間での役割・機能分担を行うことが一般的ということになるのですね。

プログラミングを進める上でコミュニケーションが欠かせない最大の理由は「開発テーマの決定プロセス」にあります。自分自身で開発テーマの詳細までを全て一人で決められるような立場や状況であればコミュニケーションは不要なのですが、業務上の開発テーマの場合、それが大規模なシステム開発であろうと現場レベルでのExcelを使った業務改善であろうと「自分以外の他者」のニーズ・要望を汲み上げることが殆どの場合で必要となります。要は、自分一人で完璧に完結する仕事であれば何をどのように進めても良いのですが、そのような仕事は一般的に見れば、非常に少ないということです。

従って、開発テーマを決める際には、社内外の関係者の様々な意見をまずは集約し、先程の「創造性」のところで触れたように「出来ること・出来ないこと」を一つずつ検討した上で開発内容の詳細を決めていきます(この作業は「要件定義」と呼ばれます)。この要件定義の際には、関係者それぞれが使う「言葉」の定義一つ一つにも気をつけていく必要があります。なぜならば、同じ言葉であっても人が違えば頭の中のイメージが異なるケースがあるからです。

コミュニケーション能力の高さとはつまるところこのような「人によって異なるイメージを持つ言葉の定義を明らかにし、共通化した上で情報共有すること」が出来るかどうかにあります。プログラミングを行う場合は、言葉の定義が関係者間で実際には異なっており、もし現場のニースと異なるイメージのものを開発してしまった場合には「最初から開発をやり直す」必要がある場合もあるため、できる限り綿密に言葉の定義の明確化を進める必要があります。そのため「言葉の端々まで注意をし、情報に行き違いがないかどうかを確認する」癖が自然と備わることになります。結果として、プログラミングスキルを高め、実践的な仕事を多く経験するようになると、自然とコミュニケーション能力も高まることになるのですね。

このように、プログラミングスキルを習得することで「創造性」「論理思考力」「コミュニケーション力」といった、ビジネスにおいて共通の基礎能力を効率的かつ効果的に高めることが可能となります。しかも、プログラミングスキルを習得することで、現場レベルでの業務効率化も実際に進めることが可能となるメリットも生じるところが、他のいわゆる「机上の学習」とプログラミング学習の最大の違いです。

例えば現場のスタッフがプログラミングスキルの基礎を習得していた場合、様々な業務改善案を実現可能か否かについて効率的かつ創造的に考えることが出来るだけでなく、実際の業務改善を自らの業務として進めることも可能になりますので、他者に任せる場合に比べて時間短縮やコスト低下も期待することが出来ます。さらに、もしマネジメントレベルがソフトウェア・ハードウェア等の技術面にまで踏み込んで「出来る・出来ない」の判断を自らのスキルで出来るようになれば、意思決定に必要な時間も大幅に短縮可能となります。

プログラミングスキルを習得することの最大のメリットは、「プログラミングの仕組み」のイメージを理解することで、様々な業務課題やお客様の抱える問題の解決策をシステマティックに検討することが可能になることです。プログラムによる自動化だけで解決できるのか、新たなハードウェアが必要なのか、それともマンパワーが不可欠なのか、あるいはこれらの組み合わせなのか。この視点で物事を捉えることが出来れば、業務は大幅に効率化し、ビジネスチャンスも大きく広がります。

ここまで読み進めて下さった皆さんには、プログラミングが決して開発者・技術者だけのためのものではなく、ビジネスに携わるあらゆる人々にとって有益なスキルであることをご理解いただけたのではないかと思います。ただし、前回のコラムでも書いた通り、プログラミングの習得には「時間」が必要です。先の「論理思考力トレーニング」の部分に、一般的には2-3年程度の時間が必要となります。早く習得すればその分、早く実務に応用することが可能ですから、興味をお持ちの方は是非、まずは基本的なところから学習を始められることをお薦めいたします。