はじめに

プログラマーには数学知識が必要といわれることがあります。

しかし、近年では数学が苦手であるはずの文系出身のプログラマーも増加し活躍の場を広げていますね。

実際のところは、プログラマー職において「数学は不要」という見方が強くなっています。とはいえ、プログラミングの際に数学が必須の分野があるのも事実です。

ここでは、プログラマーに数学が不要といわれるようになった根拠や、実際に求められるスキル、数学が必要とされる分野についてまとめました。


プログラマーに数学が不要な理由

なぜプログラマーには数学が不要といわれるになったのでしょうか。


プログラマーが登場した背景は?

まず、プログラマーという職業が生まれた背景を説明しましょう。一般的な認識として、プログラマーは設計書に基づきコーディングを行う人を指します。

情報技術が生まれた当初はこのようにコーディングに特化した職業区分はありませんでした。なぜなら、プログラミング言語自体がまだなかったためです。

プログラミング言語はハードウェア上でソフトウェアを思い通りに動かすための道具ですが、この開発ではハードウェア制御のために膨大な物理と数学の知識が必要でした。

「プログラマーには数学が必要」といわれることがあるのもこれが所以で、今でも大学のコンピューター・サイエンス専攻(情報科学科)では数学が必修科目となっています。

情報科学分野の専門家たちは苦労の末にプログラミング言語を生み出すと、それを使ってさらに高等なソフトウェアを多く開発しました。

そうして便利なソフトウェアが搭載されたパソコンが広まり、情報技術がさらに発展して今日に至ります。

専門家でなくともプログラミングできる環境が整い、IT技術需要に供給が追いつかなくなってきたため、コードを書く部分を分業化してプログラマーという職業が生まれたのです。


コーディングルールの習得で十分

以上のことから、プログラマーはコーディングするにあたり、使用する言語ごとの最低限のコーディングルールさえ理解していればよく、数学の知識は一切不要です。

自動車の開発者と運転手に例えると分かりやすいでしょう。鉄の塊をガソリンの爆発力で動かすためには、熱力学や機械工学、その他様々な専門知識が必要です。

しかし開発者が専門知識をフル活用して自動車を完成させてしまえば、運転手は運転方法(コーディングルール)を教えてもらうだけで自動車を動かすことができますね。

運転手は目的地まで車でたどり着く(アプリを完成させる)為に、熱力学や機械工学について学ぶ必要がありません。これと同じことです。


コンピューター・サイエンスの背景知識が不要

しかし、本来プログラミングには流儀があり、メモリをより効率的に使ったり、より演算量が少なく済むようなコードの書き方を意識する必要があります。

この部分の理解には数学を根底とするコンピューター・サイエンスの知識が必要なのですが、近年は高機能な言語が増え、意識せずに済むようになっています。

実行中にメモリ空間を自動で最適化したり、予め演算量の少ない命令をまとめてモジュール化しておき、プログラマーはそれを呼び出すだけで良い等です。

このことも自動車に例えられ、燃費の良い高性能なエコカーが出てきて昔ほどブレーキのかけ方等を意識しなくて済むようになったことと似ていますね。


プログラマーに必要とされる能力

それでは、プログラマーにはどのような能力が必要とされるのでしょうか。数学は不要でも、いくつか身につけておいた方が良い能力があります。


論理的思考力

ざっくりと考えれば、プログラミングは「想定される全ての入力パターンについて出力パターンを書き込む」作業といえます。

抜け漏れが無いようにパターンを網羅したり、パターン同士の関係性に問題がないか検証するための論理的思考力が必要です。

センスがものをいう分野とはいわれますが、鍛えることは可能なので、苦手意識のある人は有名なアルゴリズムの読解を行うと良いでしょう。


体力・精神力

これらを能力とは呼ばないかもしれませんが、とても重要なことです。

プログラマーは手を動かすだけでなく、場合によってはバグ取りもして動作保証まで行う必要があります。

限られた納期の中で、原因の検討もつかないバグの解明に追われ、寝たいのに寝られず…という最悪のシチュエーションにも耐えられる体力と精神力が求められます。

また、日頃から体調を崩さずかつ安定した精神状態を保てるよう、体調管理能力メンタルコントロール力を持つことも重要です。


コミュニケーション力

大きな案件であればあるほど、1つのサービスやアプリケーションを複数人のプログラマーでコーディングすることになります。

コーディング中に設計の不備を見つけて、他モジュールとのインターフェイス部分を変更する必要性が出てくるケースも考えられます。

その2モジュール間での調整だけで済めば良いのですが、見えないところに影響が及ぶ可能性もありますね。

もしかすると、重大なバグの原因になり、かつなかなか見つけてもらえないということにもなりかねません。

こっそり対応するのでなく、早い段階で関係者を巻き込んで調整リスクヘッジできるような、高いコミュニケーション力も重要視されます。


英語の読解力

コーディングしていて書き方がわからない部分があれば、逐一インターネットで検索しますね。

日本語サイトがあれば良いのですが、比較的新しい言語やフレームワークの場合はまだ英語のドキュメントしかないことがよくあります。

英語をペラペラと話せる必要はありませんが、こういった場合にアレルギーを起こさず自力で単語の意味を調べながらでも読解する力が必須です。

また、大企業の案件であれば、海外部署との連携プロジェクトやオフショア先との共同開発ということで設計書が英語の場合もあります。

こういったケースでも英語読解力が非常に重要です。


数学が必要な分野①画像処理

では、数学が必要とされるのはどのような開発分野でしょうか。ここからはいくつかの例を見ていきましょう。1つめは画像処理です。

Adobe社のPhotoshopや、近年ではスマートフォンのカメラアプリにも「フィルタ」が導入されていますが、これは主に画像へフーリエ変換を適用することで実現されます。


フーリエ変換での周波数解析

フーリエ変換とは、与えられたデータ列に対して周波数解析を行うためのデータ変換アルゴリズムです。

元々、フーリエ変換は音声データから何の音程の音が含まれるかを解析するために適用されました。音声は波形なので、周波数解析ができるのは何となくピンと来ますね。

しかし、画像は波形ではないのになぜ周波数解析ができるのか疑問に思われるかもしれません。

実際は、画像のピクセルごとに明るさや色を示す「画素値」を持っているのが画像データで、隣り合うピクセル同士で画素値がどれだけ変化するかを波形で表すことができます。

画像の場合はこの波形に対してフーリエ変換を行い周波数成分を取り出すわけです。


画像処理の仕組み

隣同士のピクセル間で画素値の変化が激しい部分、例えば人の顔の輪郭やパーツのエッジ部等は高周波、逆にぼんやりした部分は低周波となります。

低周波と高周波の成分が取り出せれば、それぞれの成分に異なる処理をすることが可能です。

例えば「ハイパスフィルタ」という処理では、高周波成分だけを抽出するので画像の輪郭をくっきりさせられます。

このようにフーリエ変換を使って周波数成分ごとに様々な処理を使い分けることで、ノイズ除去やぼかしを実現しているのが画像処理の仕組みです。


数学が必要な分野②データ圧縮

近年はインターネットのバンド幅も上がり、それに伴いやり取りされるデータの量も膨大になっています。

通信インフラが整ったおかげで大容量データが定額プラン内で送受信できるようになったので、クラウド音楽サービスや動画配信を楽しむ人も増えていますね。

とはいえ、通信キャパには限界があるのでデータはそのままのサイズで送るのではなく、圧縮して送る必要があります。

この圧縮方法には用途に合わせて様々ありますが、紐解くとその正体はほとんどが数学を用いたデータ変換です。


様々な圧縮技術

例えば音楽データでは、人間が聞き分けられない周波数を除去してサイズを小さくする手法がありますが、周波数解析のために画像処理でも登場した「フーリエ変換」が用いられます。

また、画像や動画データでは、1つ1つのピクセルを同じデータサイズで表現するよりも、出現頻度に合わせて違うデータサイズの符号を与えるとサイズダウンが可能です。

具体的には、赤色が100ピクセル、青色が5ピクセルしか出てこないならば前者を8ビット、後者を16ビットの情報量で表すように符号をあてがいます。

これはエントロピー符合と呼ばれる方法で、統計や確率論の手法が応用されたものです。


数学が必要な分野③テキストマイニング

膨大な量のテキストデータから有益な情報を取り出す手法をテキストマイニングといいます。

顧客アンケートや営業が収集したVOC、コールセンターに寄せられた意見等をマイニングし傾向や重大な問題点を洗い出すためのツールです。

これには機械学習が用いられ、その中でも「サポートベクターマシン」という方法が多く採用されます。

サポートベクターとは外れ値ではない、本当に必要なデータのことで、これらにベクトル処理を適用することでデータの分類が可能です。


数学が必要な分野④データ可視化

上記の③もそうですが、近年は分野を問わず、収集したビッグデータの活用方法が注目されています。

膨大なデータを解析してビジネス側へ報告や提案を行うデータサイエンティスト職では、わかりやすく伝えるためにデータを可視化する技術が必要です。

そもそもデータ解析の段階で統計学の知識が必要ですし、どんな見せ方をすれば伝わりやすいのかの検討に幾何学の知見も重要となります。


数学が必要な分野⑤ゲームプログラミング

ゲームプログラミングの分野でも大きく2つの場面で数学知識が必要とされます。


GPUプログラミング

まず、ゲームを作るには、美麗なグラフィックと高速なレスポンスを実現するためにグラフィックボード(GPU)を使用することが多いです。

GPUはピクセルの並びを行列データとして取り扱い、行列変換によって一括で高速に画像処理を行います。どんな処理を行うかの設計のために線形代数の知識が必要です。


ムーブメントデザイン

また、ゲーム内のキャラクターやオブジェクトを現実世界の物であるかのように自然に動かすためのムーブメントを設計する必要があります。

必要な知識はどちらかというと物理学寄りですが、実際の動きは数学の公式を用いてプログラミングすることになるでしょう。


数学が必要な分野⑥チューニング

非常に高速なレスポンスが求められるアプリケーションでは、プログラムの実行速度を限界まで速くするためのチューニングが必要です。

例えばドローン自動車の自動制御では、指示を出した後ほんの僅かでもレスポンスが遅れれば墜落や衝突等、取り返しのつかないことになってしまいます。

プログラムを速く動かすには、計算量の少ないアルゴリズムを使うこと、もしくは計算量の少ない自作のアルゴリズムを使うことが重要です。


速いアルゴリズムを選定するには

いくつかの整数を昇順に並べ替えたい場合、バブルソート・マージソート・クイックソート等のアルゴリズムから最も計算量の少ないものを使わなければなりません。

データの数によっても変わるので、計算量を自分で計算し選定する必要があります。


自作アルゴリズムにも工夫が必要

既存のアルゴリズムが適用できない場合は自分でアルゴリズムを作らなければなりませんが、最も計算量が少なく済むように数学知識を活用すべきです。

極端な例をわかりやすくいえば、縦と横の長さが与えられて四角形の面積を出力する場合、縦と横の長さだけforループで1を足しても動きますが、計算量が膨大となります。

数学公式である「四角形の面積=の長さ×の長さ」を知っていれば、1回の演算で済むのです。

このように、なるべくプログラムが計算しなければならない量を減らすために数学知識を駆使して計算量を減らしてあげるスキルが必要になります。


まとめ

プログラマーにとって数学知識は不要であることとその理由について説明しました。しかし、主に高度なデータ処理を行う分野では数学知識が必要です。

上記で述べている「数学が必要な分野」の③については近年需要の高まる人工知能(AI)に分類されます。

また、④についてはデータサイエンティストに必須の技術ですね。

数学知識がなくても問題がないとはいえ、逆に数学知識があればかなり付加価値の高い技術開発に携わることができます。

単価も倍以上となることが多いので、苦手でなければ年収アップを目指して数学の勉強を始めてみてはいかがでしょうか。