「エンジニアがエンジニアたるべき所以は何にあるの」を何回かに分けて整理しようと思います。
近現代のエンジニアとそれ以前の(そういう職業はなかったかもしれないけれど)エンジニアには違いがあると同時に同じところもあると考えています。
同じところは
利用できるものは何でも使う
ところであり、その利用できるものの対象の原理が良く分かっていなくても、程度の差はあれ、あまり気にしないところでしょうか。
例えば現代文明を支えている工学の成果として IC を見てみましょうか。
もし、「原理を完全に理解していなければ利用しない」という立場なら、IC の構成要素としては半導体によるトランジスタ(ダイオードや FET なども)があるので、IC の利用場面でトランジスタなどを理解していなければいけない。そしてトランジスタなどの動作原理は、量子力学の領域の理解を要求するため、量子力学を理解できていなければならなくなります。
厳密に考えるなら、量子力学を「完全に理解」しないといけないわけですが、そもそも現代の量子力学でさえ詳細がまだつまっていない(そもそもこういうものはつまらないものですが)状況で「完全な理解」とは?となるはず。
全部を全部理解しないなら使っちゃダメというなら、何もできなくなる。
程度の問題であって、利用するに問題ないだけ分かっていれば十分という考えがあります。逆に言えば、どういう理解の仕方であれ利用するに問題のないだけ分かっていなければ困る。
先ほどの IC の話で言えば、少なくともその IC についてのデータシートに書かれていること・情報を使って設計などできるくらいでないと「問題ある」と思います。
;;; アマチュアが人に迷惑にならない範囲でやっている分にはかまわないでしょうけれど。
別な話で言えば、C 言語を使ったソフトウェアの作成において、C 言語コンパイラの詳細を知らなくてもある程度プログラムは作れてしまいます。
よくある Hello World 程度のプログラムならコンパイラの動作原理など全然しらなくても、コンパイラの使い方さえ分かっていれば問題は起きないでしょう。
しかし、タイトなタイミングで動く制御プログラムを書くなどといった仕事の場合は、コンパイラの動作原理は明確に分かっていないにしても、コンパイラにどういう指示を出すとどんなオブジェクトコード(出来上がりのプログラムの部品のようなもの)を出力してくれるかくらいは分かっていないとちゃんとした仕事にならないはず。
また、コンパイラの原理というよりは言語の意味解釈の法則の理解といった話になるけれど、文法的に正しいソースコードであり、コンパイルももちろん正常に終了するけれど、動かすと期待した動作をしないといったコードがよくあったりするわけですが、これも言語の意味解釈をよく理解していれば、そのコードでは、その期待に沿った動作はしないと分かります。
ですから、「そんなコードを書く」なら「その程度には意味解釈の仕方を理解」していないと困るわけです。
まあ現実には、その程度には意味解釈の仕方を理解していてもよく変な動作をするコードを書いてしまうものですが、そこは人間ですから。
ただ、理解していればおかしなことが起こっても割りとすぐに解決つきます。知らないとずうっと解決つかないことがよくある。もしくは別な手段で解決つけてしまうか。エンジニアとしての最低の態度は、「オレは悪くない!コンパイラや言語が悪いんだ!」と言って逃げることでしょうか。これはもう使う程度にも理解していない人なので、エンジニアとは呼びたくはありません。
「利用できるものは何でも使う」ということでは、昔の映画で「ペティコート作戦」という潜水艦コメディー映画があるのですが、この中でディーゼル機関の制御系に必要なバネ部品が欠乏し代替でブラジャー(ゴムでビヨーンと伸びるから)を使うという場面があるのですが、それをやった看護婦はエンジニアの素養があったわけです。;-)
「利用できるものは何でも使う」ためには、自分の専門分野に固執してられませんから、広い知識と柔軟な考え方が必要になってきます。発明の才に近いものでしょうか。