🧐

「エンジニアに数学が必要か」は、そもそも違うだろうという話

2022/01/09に公開
8

きっかけ

Twitterで「エンジニアに数学が必要か」という議論が盛んに行われていたので。これについて、簡単に議論したいと思いました。その内容を、この記事に書こうと思います。

私の結論

私がこれまで受けてきた教育の中と、これから議論する参考文献などから、私の結論は「数学を使わない技術者はエンジニアではない」です。
ここで重要なのは「エンジニアは数学が必要」とか「エンジニアは数学は不要」とかいうことではないということです。

そもそも「エンジニア」とは何かについて

エンジニアと似た言葉に、ソフトウェア開発業界では「プログラマ」や「コーダー」といった言葉があります。ではエンジニアとはなにかということを考えたいと思います。

エンジニア(Engineer)とは辞書的な意味で

明鏡国語辞典[1]によれば

エンジニア[Engineer]: 機械・電気・土木・建築などの技術者。技師。

とあります。この定義では、「技術者」とあるので、プログラマやコーダーも「エンジニア」ではないかと思いますね。では、「技術者」とはなんでしょう。同じく明鏡国語辞典[1:1]によれば

技術者: 専門の科学技術を身に着け、それを応用することを職業とする人

とあります。ふむふむ、専門の「科学技術」を身に着けて、それを「応用」する人なのか。では、「科学技術」とはなんだろう。これは、明鏡国語辞典や広辞苑にはなかったのでネットで「科学技術とは site:ac.jp」で調べてみたところ、東京大学の堀先生の記事[2]がありました。この記事の中では、「科学」と「技術」を独立して別物として扱いたいといった議論がなされています。この記事でも英語に直した「science and technology」という観点から考察しているので、この考え方を参考にしたいと思います。ではscienceとは何でしょう。釈迦に説法ですが念の為、ジーニアス英和辞典[3]で調べると

science: 科学、科学的知識、(学問分野としての)科学、自然科学、技術、わざ、術

とあります。「技術、わざ、術」の用い方があるのは驚きでした。ではtechnologyとは何でしょう。こちらは技術だと思いますが、念の為ジーニアス英和辞典[3:1]で調べると

technology: 科学技術、工業技術、テクノロジー、工学、…中略…科学技術的方法

うーん…この辞書はあまり好きではないですね、technologyの説明に「テクノロジー」と入れてしまうのですから。念の為、明鏡国語辞典[1:2]で調べるとテクノロジーは「技術学、工学、科学技術」とあります。
科学技術を科学技術という言葉で説明する循環に入ってしまったので、ここまでで、「科学技術」の言葉自体の素の意味という意味では十分な気がします。

では次に、実際、「エンジニア」とは、どの様な対象を指すのが適しているかについて議論したいと思います。その前に、上の文献調査を纏めましょう。辞書的な意味で噛み砕くと「エンジニア」とは

エンジニアとは広く技術者のことを指す。技術者とは専門の科学技術、ここでは科学的知識や科学技術・工学技術を身に着け、それを応用することを職業とする人を指す。

と言って良さそうです。恐らく、キーワードは「科学」「技術」の2つです(全ての単語の説明に含まれています)。この時点で「科学」は数学を包括するので、技だけではエンジニアとは言えなさそうです。

実際、「エンジニア」とは、何を指すべきなのか

恐らく、ざっくりというと、エンジニアは科学技術を駆使する人です。
科学技術、すなわち「科学」「技術」については、前章の説明だとぼやけているのですが、堀先生の記事[2:1]には以下のような記載もあります。

しかし、science and technologyという言い方をする時のscienceはもともとの大きな意味のscienceではなく、19世紀以降に矮小化された小さな意味でのscienceでしょうね。
一方、technologyのほうの語源はギリシャ語のart, skillだそうです。こちらは、小さな意味でのscienceが大きく発展するよりもずっと前から、砲術、医術、建築術などとして、存在しつづけてきました。

つまり、「科学技術」の「科学」は狭い意味でのscience、つまり自然科学、人文科学、社会科学などの基礎科学のことを指し、技術は「技」という意味だそうです。ここで、前者は数学などを含み、後者はartやskillなので必ずしも数学などを含みません(所謂「ノウハウ」と言っていいと思います.
熟練の技という感じです)。

したがって、ここまでの議論で「エンジニア」が指すものは
エンジニアとは広く技術者のことを指す。技術者とは専門の科学(自然科学、人文科学、社会科学)的知識と技(技術)を身に着け、それを応用することを職業とする人を指す。

ということです。この時点で自然科学、人文科学、社会科学を用いてないと「エンジニアではない」と言って良いのではないでしょうか。 つまり、科学的知識と技(ノウハウ)を上手く融合するのがエンジニアと言えそうです。

ここで終えても良いのですが、更に、違う切り口から議論したいと思います(私的には、以下の説を推しています)。
これは、私も学んだことですが、適宜文献を引用して説明したいと思います。
私はいわゆる、工学系の学部出身なのですが、授業の中で工学とは何かについて考え学びます。工学の英語訳は「Engineering」です。どこかで見ましたね。そうです、エンジニア「Engineer」の派生になります(厳密には動詞の派生だそうです)。では、工学とはなにか。徳島大学工学部では、このように書かれています。

工学とは、通常「数学と自然科学を基礎とし、時には人文社会科学の知見を用いて、公共の安全、健康、福祉のために有用な事物や快適な環境を構築することを目的とする学問である」と言われています。

「数学と自然科学を基礎とし」とあります。このように、工学は自然科学に立脚し、技を用いて課題を解決する学問という意味が強いです。つまり、エンジニアリングを行うエンジニアには科学の視点が必要不可欠ということです。

以上のことから、「エンジニア」とは
専門的な科学的知識(数学を含む)と技(ノウハウ)を身につけ、それを応用することを職業とする人

と言って良いのではないでしょうか。

では、なぜ『「エンジニアに数学が必要か」は、そもそも違うだろ』なのか

実はこれには、強い制約があります。どういうことかというと、例えば言語学を勉強して、文法の知識とノウハウを駆使してプログラムを書いていますというのであれば、ひょっとすると数学を使わない場合が出てくるかもしれません(実際は、統計的に処理をしたり言語をベクトルとして扱うことも多く、そういうことをひっくるめると、数学を使っていると言えると思いますが、本当に数学を使わない人文科学の知識を移植している可能性もあります)。
ですので、大多数の私達が使用しているシステムを構築しているエンジニアに限って言えば、計算量や探索のアルゴリズムなど、数学を使う場面は多く、その様な環境にいるにも関わらず、それらを考えずしてコードを書いたり設計している人は「エンジニア」とは言えないのではないかという、想定するエンジニアが働く環境に制約があるということです(しかし、人数で言うとこの制約は尤もなものだと思います)。

この制約の下、「エンジニア」には

  1. 科学的知識
  2. 技(ノウハウ)

が必要で、どちらが欠けても駄目。なので「エンジニアに数学が必要か」という議論は、多くの言語の意味の定義と今までの議論に立ち返ればおかしく(なぜなら、エンジニアに科学(数学)が必要だから)、「数学を使わないのであればエンジニアと言えない」がより正確なのではないかと思います。

エンジニア、プログラマ、コーダーの違い

最後に、一番はじめにさっと触れた「エンジニア」「プログラマ」「コーダー」の違いについて述べたいと思います(伏線回収)。
もう、上のように丁寧にはしませんが、私の中では

  • エンジニア:専門的な科学的知識と技(ノウハウ)を身につけ、それを応用することを職業とする人
  • プログラマ:コンピューターのプログラムを作成する人(エンジニア以外)
  • コーダー:コードを書く人(デザインをHTMLとCSSで実装するとか)

という認識です。
ちなみにですが、一応、エンジニアとプログラマとコーダーについて別の分け方が存在していることは承知しています[4]

最後に

「エンジニア」「プログラマ」「コーダー」というふうに言葉があるのに、なぜ「プログラマ」や「コーダー」という言葉を使わないのかなと思いました。
専門家の方もいらっしゃると思いますので、意見をいただける方はコメント欄へお願い致します。

追記)
とはいえ、エンジニアと名乗るのに医師のように資格は要りませんので、皆さん自由に名乗っていいと思いますし、それぞれの考え方があると思いますので、それでいいと思っています。
今回この記事を書いたのは、大学時代に学んだ「工学とは何か」についてかなり関連の深い話題でしたので、ぜひ書きたいと思って書かせていただきました。

変更履歴

2022-01-11)誤字脱字、日本語がおかしいところを修正しました。

脚注
  1. 明鏡国語辞典、大修館書店、2002-2010(電子辞書) ↩︎ ↩︎ ↩︎

  2. 「科学技術」か「科学・技術」か / 堀 浩一 (東京大学)http://www.ailab.t.u-tokyo.ac.jp/horiKNC/representation_units/24 (2022-01-09閲覧) ↩︎ ↩︎

  3. ジーニアス英和辞典(第4版)、大修館書店、2006-2010(電子辞書) ↩︎ ↩︎

  4. 【解説】エンジニア・プログラマー・コーダーの違い / PARADIGM SHIFT https://paradigm-shift.co.jp/column/21/detail ↩︎

Discussion

naarynaary

「エンジニア」「プログラマ」「コーダー」とい>うふうに言葉があるのに、なぜ「プログラマ」や>「コーダー」という言葉を使わないのかなと思い>ました。

これに関しては、言葉の定義よりは慣習が関係しているような気がします。
システム開発を受託するベンダーでは、設計する人を「システムエンジニア」(よく建築士に例えられる)、設計を元にコードを書く人を「プログラマ」(よく大工に例えられる)と呼びがちです。

「システムエンジニア」ではなく「エンジニア」というと自社でサービスを開発している会社で働く技術者を指すことが多いイメージです。
そういう会社ではそもそもビジネスモデルが違うので働き方も変わってくるわけですが、その上でざっくりと「ただコードを書いているだけではない」という意味合いを表したくて「エンジニア」という言葉を使ってるんだろうな、という印象があります。

「プログラマ」が「システムエンジニアに指示された要件を満たすコードを書く人のこと」だとすれば、Web業界では「設計もできる、コードを書く以外にもインフラもやれる、よりよいユーザー体験とは何かを考え、それに基づいて提案・改善を行う」…といったことも求められるので、「プログラマ」では自分の仕事内容を表す言葉として不足があると感じるのかもしれません。

そういうわけで、Web業界における「エンジニア」という呼称・自称は、「I'm engineer」というよりは「I'm not programmer」という意味合いの方が強いんじゃないかな?というのが個人的な印象です。

実際に「『プログラマ』に甘んじていてはだめですよ、もっと上のことができる『エンジニア』にならないと」みたいなことをハッキリいう人がいますし。

Akira KashiharaAkira Kashihara

コメントいただきありがとうございます。

これに関しては、言葉の定義よりは慣習が関係しているような気がします。

はい、その通りかと思います。この記事を書くにあたり、いくつか記事を読みましたが、まさしく

システム開発を受託するベンダーでは、設計する人を「システムエンジニア」(よく建築士に例えられる)、設計を元にコードを書く人を「プログラマ」(よく大工に例えられる)と呼びがちです。

とご指摘いただいた通りの印象でした。
私は受託業務はおろか会社員として働いたことはないので、詳しいことは分からないのですが、設計の際にもレスポンスタイムを規定の値にするために計算量を考えたり、設計の際の動線を最適にするためにグラフを使ったり、無意識の間に「数学」を使っているのではないかと想像しています。つまり、私のイメージでは「設計」という業務の中に通常は「数学」を利用する場面があるため「エンジニア」と言っていいだろうということです。実際はどうなのでしょうか。

つまり、コメント中にある

Web業界では「設計もできる、コードを書く以外にもインフラもやれる、よりよいユーザー体験とは何かを考え、それに基づいて提案・改善を行う」

が出来れば、推測するに数学も(無意識のうちに?)使ってエンジニアと言って良いのではないかなと思います。
このコメント中の「ユーザー体験」については、実務経験がなく詳しくは知らないのですが、いくつかの記事を読んだ限り、私は、まさしく科学の一部だと思っておりまして、恐らくユーザーに使っていただいた後にフィードバックをもらって改善をするという作業をしているかと思います。「こうすれば良くなるだろう」という仮設を立てて、定性的かつ定量的にデータを取り検証して、考察し修正するというのは、まさしく科学的プロセスに似ており、この中にも、恐らく「〜人中〜人はいいと回答した」や「自分たちがターゲットとするユーザー(想定ユーザー)の〜割は良いと回答した」など統計を用いているのではないかなという、勝手な想像です(実際のところはどうなのか、よろしければご教授いただければ幸いです)。一方で「正しい統計」や「正しい数学」を使えているかどうかは別の議論であると思っております。

なので、ナワさんから頂いたコメント中に出てくる具体例は、全て「エンジニア」といって良いのではないかなと私個人は思っております。難しい数学(機械学習、統計処理など)を使っている必要は無いという認識です。
では、プログラマは全員エンジニアだろうという指摘があるかもしれませんが、このコードはどのアーキテクチャで書くべきか、if文で実装すべきかswitchで実装すべきか、どの言語で書くのが最適か、非同期処理をどのように書くか、などを考えて実装するに留まる人がプログラマという私個人のイメージです(実際はfor文をなるべく使わないとか、処理速度をとかを実装中に考えると思うので、対象人数は、ごく僅かであるかもしれません)。

DROP TABLE USERDROP TABLE USER

エンジニアの定義に関してはおおむね同意で、更に今回は Science=Computer Science だと思うので、CSの学位を持っていればエンジニアと名乗るのに不足はないと思いました。

また、当記事では「エンジニアに数学が必要か」を「エンジニアと名乗るのに数学が必要か」という解釈で進めていますが、「エンジニアの仕事は数学がないとできないか」という解釈で言っている人も中にはいると思いました。
後者の観点においては、エンジニア向けの仕事には数学の知識が必要ないものが数多くありますし、CSの学位が無くても十分な実力を発揮している人がいるのも事実かなと思っています。

なので厳密なことを言えば、

エンジニアと名乗るにはCSの学位が必要だけれども、エンジニア向けの仕事すべてにおいてCSの専門知識が無ければ成果を出せないということではない。

ということかと思いました。

Akira KashiharaAkira Kashihara

コメントありがとうございます。

CSの学位を持っていればエンジニアと名乗るのに不足はないと思いました。

これについては、そうかと思います。
しかし、記事でも述べましたが「エンジニア」はコンピューター関係限定の言葉ではないので、多少行き過ぎた制約かと思います。
土木や電気、機械などもエンジニアに入ってくるかと思います。
したがって「不足はない」という点には同意ですが、エンジニアならばCSの学位ではないとは思います。つまり

エンジニアと名乗るにはCSの学位が必要だけれども

という点には、私は「CSの学位」という制約は厳しすぎるかと思います。話は少し変わりますが、ちなみに、日本の大学でCSの学位を取れるところはあるのでしょうか…(Informaticsは存じ上げるのですが)

エンジニア向けの仕事すべてにおいてCSの専門知識が無ければ成果を出せないということではない。

これについては、私も同意です。

DROP TABLE USERDROP TABLE USER

という点には、私は「CSの学位」という制約は厳しすぎるかと思います。話は少し変わりますが、ちなみに、日本の大学でCSの学位を取れるところはあるのでしょうか…(Informaticsは存じ上げるのですが)

たしかに私の言っていることは、日本以外に限定されることが多いようですね。

また、日本以外の国においては「エンジニア」の称号には工学士の学位が必要とされるなど明確な制限がある場合が多く、日本語での「技術者」「エンジニア」は、こうした国においては別の職種とみなされる「テクニシャン」(技能者)に相当することも多いため注意が必要である
https://ja.wikipedia.org/wiki/技術者

ただ個人的には、誰でもエンジニアと名乗れることに何のメリットがあるんだろうという疑問もあります。

例えば、以下のパターンを考えてみます。

  1. CSの学位を持っている → CSのエンジニア
  2. Informaticsの学位 → Informaticsのエンジニア
  3. どちらも持っている → CSとInformaticsのエンジニア
  4. どちらも持っていない → 何のエンジニアでもない

もし「エンジニアです」っていう人がいて「何のエンジニアですか?」って聞かれたら、どの分野の学位を持っているか答えれば話が通じるようになります。
それがコンピュータ企業の面接なら、全く関係ない分野の学位を応えられても面接官の頭にもハテナが浮かぶと思うので、今回の記事の場合はCSとInformaticsなどのコンピュータ・情報処理関連の学位をターゲットと考えて問題ないと思います。

また、私は学位を持っていないので「4」なわけですが、CSの学位を持ったどのエンジニアよりもプログラミングにおいて劣っているとも思っていないので、特にエンジニアと名乗る必要性も感じていません。
「プログラマ」と名乗りつつも、プログラミング以外の仕事の経験もあるので、被採用時に困ることもないです。
逆に下手に名乗ってしまうことで、エンジニア=何かの学位を持っている人、という認識を持つ人に突っ込まれても困るな、くらいの認識でいます。

ただ、この話も結局「こうしたらよくない?」という理想論なので、現実そうでないことももちろん理解しています。
むしろ、そうなっているのはなぜだろうという点に興味があるくらいですね。

Akira KashiharaAkira Kashihara

返信ありがとうございます。

ただ個人的には、誰でもエンジニアと名乗れることに何のメリットがあるんだろうという疑問もあります。

はい、これについては同意です。その通りだと思います。

もし「エンジニアです」っていう人がいて「何のエンジニアですか?」って聞かれたら、どの分野の学位を持っているか答えれば話が通じるようになります。

この点についても、その通りだと思います。
大学や大学院で勉強し、知識と技能ともに認められれば学位を授与されるものだと認識しています。つまり、学位を持っていれば、取得学位の分野については、ある程度話ができ技を活かせるといった意味だと思います(学位の種類によって、もっと深い能力もあるとおもいますが、ここでは省きます)。

また、私は学位を持っていないので「4」なわけですが、CSの学位を持ったどのエンジニアよりもプログラミングにおいて劣っているとも思っていないので、特にエンジニアと名乗る必要性も感じていません。

私は学位を一応持っているので、工学のエンジニアと言えるかもしれないのですが、私個人の考え方では、「エンジニアやプログラマなど肩書は、基本的に第三者がつけるものであって、自分でつけるものではない」と思っていますので、私自身はまだエンジニアとは、言いたくないなと思っています(こんな記事を書いていて、何だよと思われるかもしれないですが…)。その理由は、自称ほど怪しいものはないと思っていまして、それなら「私はこういうサービスや製品を作ったことがあります」や「私は〜という会社で、こういう業務をしていました。」と自分のしていることや、してきたことを主張するほうがいいと思っているからです(ですので、肩書は大学から頂いた「学生」で、私はポートフォリオを公開しているのですが…)。こういう考え方からか「特にエンジニアと名乗る必要性も感じていません。」という点については非常に共感致しました。

ただ、この話も結局「こうしたらよくない?」という理想論なので、現実そうでないことももちろん理解しています。
むしろ、そうなっているのはなぜだろうという点に興味があるくらいですね。

はい、私もこの点については理解しているつもりです。そして私も、記事の初めに書きましたが「不思議だな」と思いながら書いていました。
重ねてになりますが、肩書は本質ではないかと思いますので、話す前に「土木エンジニアです」と言われたら「自分と分野が少し違うから噛み砕いて話そう」などコミニュケーションの助けといった、そういうふうな意味で肩書を認識しています。つまり、他分野の人にも見せる名前(肩書)だからこそ、名前の本来の意味であったりというのを考えながら、使いたいなと思っています。コンピュータエンジニア界隈であれば「インフラやってます」でいいと思いますから(土木や電気、水道インフラエンジニアもいるので、コンピュータ界隈以外で使うとまずいですが)。

DROP TABLE USERDROP TABLE USER

丁寧なご返信ありがとうございます。
曖昧にしていた知識が詳細化され、あなたのような聡明な方と話せた機会を嬉しく感じました。

蛇足ですが、LEADYOUいいですね。
私自身、いくつかパッケージをライブラリに公開しているものの充実しないREADMEに不満を感じていました。
活用させていただきます。

Akira KashiharaAkira Kashihara

こちらこそ、活発な議論を、本当にありがとうございました。

LEADYOUの方も、見ていただき、ありがとうございます。
友人と二人で作りました。
アプリの動作自体には問題なく、URL入れて生成するまでは問題なく出来るかと思うのですが、About UsやHow to useのほうは見られなくなっていますので、近日中に修正致します。
簡単な使い方は、こちらの記事に書いていますので、よろしければ是非参照ください。
https://qiita.com/Kyome/items/2112e9d1871ec0a367ea