見出し画像

【実践的スキル!?】最適化プログラミングがSTEM教育に効果的な理由3選

30年以上プログラミングをしている、サムライアプスのムンペイです。
カメラで撮影した画像から製品の微細な傷を検出する処理をDSPという並列プロセッサ向けにプログラミングすることなどを行ってきました。

ソフトウェアというものは良い作り方をすると、同じハードウェアなのにずいぶんと性能が良くなるもので(いわゆる軽い)、時にはその比率は10倍、100倍になる場合もあります。このようなハードウェアの性能を引き出すプログラミングを最適化と呼んだりします。私はそんな最適化プログラミングを20年以上仕事としてきましたが、その前の10年はそれを趣味で学んでいました。

最近は子供の教育などで、STEM(あるいはSTEAM)(※1)というキーワードをよく聞くようになり、プログラミング教育もちょっとしたブーム前夜という雰囲気を醸し出していますが、最適化プログラミングも実はSTEM/STEAM教育に適していると感じています。3つの切り口で紹介したいと思います。

※1:文部科学省では、AIやIoTが進展した今後の社会に対応するため、文系・理系といった枠にとらわれず、STEM (Science, Technology, Engineering, Mathematics) や、Artsを加えたSTEAMと呼ばれる学習を推進しようとしています。 



1.状況分析がつく

最適化プログラミングとは、ハードウェアの性能を最大限に引き出す作業です。そのため、ハードウェアの能力を正確に分析することが必要です。CPUの計算能力、メモリアクセス能力、ディスクやネットワークを使う必要があればその性能をそれぞれ掌握する必要があります。

そして、作りたいアプリケーションが最も必要とする能力は何かも正確に分析する必要があります。

そして、ハードウェアのどの能力によってアプリケーション性能が頭打ちになるのかを検討します。このようなボトルネック(※2)の分析は、最適化プログラミングでは最も重要な作業の1つであり、基本です。トップレベルの最適化プログラマーは、CPUの各命令が何サイクルで実行が完了するかを、新しいCPUが出るたびに説明書で確認していたりします。

※2:ワインボトルの細い部分を想像してください。

ボトルネックを観察する最適化プログラマー

STEM/STEAMも含めた問題解決能力を考える場合も、CPUやメモリではないにせよ、おかれている状況で使える道具(リソース)を洗い出す作業と置き換えて考えれば、必ず求められる技能だと思います。

2.解決能力がつく

状況分析の次は、解決方法の検討です。最適化プログラミングでは、アプリケーションが最も求める能力を、ハードウェアから最大限引き出すことが目標となります。

計算がメインのアプリケーションであれば、CPUの計算能力の限界を目指すことが最適化の目標になります。計算量はそれほどでもないがデータ量がとても多い場合はメモリアクセス能力の限界が最適化の目標になります。ネットワーク経由でデータを集める作業であれば、ネットワークアクセス自体を高速化することに加えてデータが戻ってくるまでの待機時間をほかの作業に使えないか、と言ったことを考えます。

男性の通信完了を待つ間に他の作業をしている女性とCPU

また、計算の仕方、メモリアクセスの仕方、・・・が、もっと効率の良い方法はないかということも同時に考えます。アルゴリズムによって、計算量が激減することがありますし、メモリアクセスも冗長性を減らしたりまとめてアクセスすることで何割も何倍も改善することがあります。これらの工夫で、計算能力がボトルネックだと思っていたが、メモリアクセスがボトルネックに変わった、などと言うこともしばしば起こります。そういうことも想定して計算能力の最適化からまずアプローチする、という段階的な対応もよく行います。

どうでしょう。プログラミング用語を置き換えれば、まさに問題解決能力そのものではないでしょうか。

3.言語化能力がつく

いよいよ、見出した解決策を、プログラミングして実現する段階です。ここでも、プログラミング言語の能力を引き出すことが必要です。

プログラミング言語というのは、コンピュータの機能を、人間がわかりやすいように抽象化したものです。ですので、どのようにプログラミングするとどのようにコンピュータが動くのか想像できることが必要です。文法的にあっている書き方であっても、期待した性能で動く書き方は別にある、ということは頻繁にあるのです。

その言語はどのような使い方のために作られたものなのかを知り、ある一連の書き方(イディオム=熟語という呼び方もします)がコンピュータにどのように解釈されるのか、と言ったことを、時にはその言語の成り立ちまで含めて知り、かつ使えるように訓練しておくことも必要です。

まさに日本語や英語など人間が話す言語(プログラミング言語に対して、自然言語と呼ぶことがあります)と同じですね。文法的にあっているからと言って、正しいニュアンスで伝わるとは限りません。存在する言い回しだからと言って、歴史や文化を理解していないと、失礼なことを言ってしまっていることもあり得ます。

一生懸命話しかけるもニュアンスが伝わらずコンピュータを困惑させるプログラム

実はプログラミング以外が大事

3つのうち2つについて、タイピングしてソースコードを記述するいわゆるプログラミングのことは出てこなかったことにお気づきでしょうか。そうなのです。優れたプログラマーは、実はプログラミングそのものに加えて、分析や解決能力の設計が優れています。そして、さながら優れた探偵のようにうまい解決策を見出してそれをプログラムという形で表現していくことに面白さを感じているのです。

プログラミング講座を多く見かけるにようになりました。各社でいろいろな観点から工夫をしているようですが、まだ新しい分野だけに有効性については各社手探りの部分もあると聞きます。最適化プログラミングのような問題解決の妙味に面白さを感じてもらえるものもいつか登場してくれるといいなと思いますが、この話はまたの機会に・・・。

これにて御免!

この記事が気に入ったらサポートをしてみませんか?