私は今まで「なんとか関数」を記憶してプログラミングを行ってきました。
最近、職場に未経験の新人が入ってきて、「関数とは?」「メソッドとは?」
「クラスとオブジェクトの違いとは」・・・など根本的なことを聞かれたのですがハッキリと言うことができませんでした。
”私の仕事はWEBエンジニアです"
よく他人にこう言ってきたのに、こんな初歩的な質問にすら答えられない。
焦りと恥ずかしさから、もうウェブエンジニアを名乗るのを辞め、脳死コーダーと名乗ろうかと本気で考えたぐらいです。
話が逸れましたが、「なんとか関数(echoとかstringとか)」を書いたらなぜ効くのか、なぜ動くのかを
理解していないので、「書けば動く!覚えろ!」としかアドバイスできなかったのだと思います。
例えば、echoを書いたら裏でこうなって、こういう処理があって、だから出力されるんですよ
みたいな風に、根本から教えられるようになりたいです。
そのため、"なんとか関数"の根本的な仕組みを教えて頂けるとありがたいです。
_______
なんとか関数は組み込み関数のことでした。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答10件
0
ベストアンサー
私は若い頃「コンパイラの中身」がどうなっているのかとても知りたいと思いました。コンパイラこそがプログラミングの根源だと思ったからです。実際はそうでもなかったとあとで気づきましたが。
で、どうしたかというと、自分でコンパイラを作りました。まだインターネットのない頃でしたが、コンパイラの本は何種類もあるので、10冊以上買って読みました。自分で手を動かして、非常に小さなものから、少し大きめのものまでいくつも作りました。
最近では、非常に趣味的ですが、以下のものを作りました。
現在仕事でコンパイラを作ることはありませんが、「コンパイラの中身の勉強」は現在の仕事にも、間接的に役に立っています。私はソフトウェアの脆弱性を扱う仕事ですが、脆弱性の中には、コンパイラの動作の原理を知っていないとわからないものも多いです。
しかし、コンパイラの中身の原理を知らなくても、プログラミング言語は使うことができます。echo(厳密には関数ではない)の中身を知らなくても、echoを利用することは容易です。
そして、そのこと自体がプログラミングの本質だと思うのです。echoはブラックボックスであり、中身の動作原理をわからなくても使うことができる。だからこそ、echo等多数の機能や関数を使った巨大なプログラムを作ることができるのです。
だから、他の方も言っておられるように、ブラックボックスの中身を知ることには、あまりこだわらなくてもいいと思います。私も、echoの中がどうなっているかは知りません。だいたいこうだろうなと見当はつきますが、詳細を知る必要もないことなので、詳しく知ろうとは思いません。
一方、「中がどうなっているのか知りたい」という知的好奇心は、エンジニアとして大成する上でとても重要なものです。その気持は大切になさってください。ただ、ご質問はteratailのQ&Aで回答できるような小さなものではありません。かつて私がしたように、書籍その他の方法で勉強されるのがよいと思います。
10行で回答された内容は、所詮は 10行程度の価値でしかありません。そのようなちんけなものを求めているのではないと理解しました。
投稿2018/12/12 22:22
総合スコア11701
0
どこが根本的な質問?かはさておき
「人間はどうやって生きていられるのか」「空はなぜ青いのか」
と同類の質問の仕方だと思います。
もちろん理由はきちんとあるにはあるのですが(知るのも説明するのもかなり困難ですが)、それを知ってどうしたいの?
というところを考えた上で質問させてください。
そこまで気にしながら生きている人間は大人にはそうそういないのと同じように、そこまで気にして開発に携わっている技術者もいません。
まあ知ったところでその関数やら機能を使えることにはならないのですが(どういう効果をもつか持つか、サンプルコードならPHPマニュアルにあるし大抵はそれで事足りるから)、
もし「自分も言語を作りたいのだ」というのでなければ、頓珍漢なことを聞いているのだと気づかせてあげる必要がありますし、本当にそう思ってるなら言語の開発者のもとに務めるようにすすめてください。
それかPHP自体はC言語で作られているのでそのC言語のソース(公開されてますので探せばすぐ見つかるはず)を読むように言うか。
いずれにしてもQAサイトで「ちょっと教えてよ」で済む話ではないですね。
失礼を承知で言うとこの質問自体も場所を間違えてます。
まあ、私なら
興味を持つのは結構だけど多少でも一人前にコード打てるようになってから言えと、追い払いますけど。(私もCのソースほとんど読んだことないですけど)
自分の仕事もその新人の仕事も進みませんし、一文のお金にもなりませんし。
所謂、言語を取り扱う開発者、技術者は利用者であって研究者ではありません。
このあたりで気づいてもらえたらいいのですが、つまり
”私の仕事はWEBエンジニアです"
よく他人にこう言ってきたのに、こんな初歩的な質問にすら答えられない。
焦りと恥ずかしさから、もうウェブエンジニアを名乗るのを辞め、脳死コーダーと名乗ろうかと本気で考えたぐらいです。
あなたはエンジニアとしてやってきてるので何の問題もありません。
初歩でもなんでもないので。
ちょっと回答の方向性ずれてたかもしれないので追記。
雰囲気からOJTでの指導を行っていてあなたはその先輩側のようですが、OJTにもルールはあります。
Wikipedia:OJTの「OJT概史」の4つのステップより
2.作業をして見せる - 注意深く、根気よく、説明し、見せ、図示し、そして質問する。キーポイントを強調すること。一度に1点ずつ、はっきりと完全に教えること、しかし彼らがマスターできる限度を超えてはいけない。
既に別回答についていますけど、その新人君はそこまで求めてるんでしょうか。
私も単に使い方や意味(どういう場面でどのように使えるか)くらいのものだと思うのですが・・・
もしその求める範囲を超えていたり離れていることを教えようとしているのだとしたら、
あなたも新人君も共倒れになるので今すぐ軌道修正してください。
PHPマニュアル読ませてその効果を実感できそうなちょっとした課題でミニマムコード組ませるだけで終わるかもしれないですよ。
※もちろんあなた自身がそれができる前提。もしできそうにないのでしたら新人君が見ていないところで猛勉強してください。
蛇足。
「なんとか関数(echoとかstringとか)」
かなり細かいですがechoはPHPマニュアル的にはfunctionの中にありますが、実際は関数ではないですし、
※PHPマニュアルより:echo は実際には関数ではありません (言語構造です)。このため、使用する際に括弧は必要ありません。
stringに至っては型なので「関数」として括るのは無理があります。(文字列操作系の関数を総合して仰っているなら表現は正確にすべきです)
そのあたりの用語と用法をしっかりすると見えてくることもあるのではないでしょうか。
間違った知識や技術を教える前にあなた自身がやれることはたくさんあります。
投稿2018/12/12 20:06
編集2018/12/13 00:12総合スコア80765
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
echo を使うと裏で加工されて適切にエンコードされ、標準出力に出力され、OS を経由して HTTP サーバーに渡され、ネットワークを通じてクライアントに渡され、ブラウザによってデコードされて構文解析され、レンダリングして OS とデバイスドライバを通して画面に描画されます。だから表示されるんですよ。TCP/IP のパッケージ処理とか色々省きましたが、大まかにこんなところです。
ただ、その後輩はそんな答えは求めていないと思います。
先輩から「何とか関数を使え」って言われたら私でも「何とか関数って何ですか?」って聞きます。
先輩と自分が違う言葉をしゃべっていたのでは話が通じませんから、まず独自の言葉を作るのをやめて正しい用語を使ってください。
裏でどう動いているかなんてどうでもいい場面です。「関数とは」と聞かれたら、たとえ知っていても自分のイメージを語るのではなくその場で調べ、それを後輩とともに読んで共通認識を作ってください。
投稿2018/12/12 21:07
編集2018/12/12 21:27総合スコア28656
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/12 21:13
2018/12/12 21:20
2018/12/12 21:26
2018/12/12 21:29
0
「関数とは?」「メソッドとは?」「クラスとオブジェクトの違いとは」
と
「なんとか関数(echoとかstringとか)」を書いたらなぜ効くのか、なぜ動くのか
は問題のレイヤというか在り処というか質というか、みたいなものが違うと思いますが、その違いは認識できていますか。
前者はしょせん振る舞いと言葉の定義の問題なので、入門書とか仕様書を読めば答えが得られる質問です。
後者は、とりあえずソフトウェアのレイヤに限るとしてもインタプリタ、ソケット通信、OSあたりの各レイヤで(もっとあると思いますが、思いついたのを)どんな処理がされるのかを問うている訳で、とても大変な問題です。普通の「エンジニア」は明確には答えられません。
(エンジニアは自分の仕事に直接関わる領域だけ詳細に理解していて、あとはその周辺をなんとなく雰囲気で知っている……という形で理解しているのが普通です。なので、たとえば言語のエンジニア、ソケット通信のエンジニア、OSのエンジニアの3人を呼んできてそれぞれ話を聞けば答えが得られるかもしれません(実際問題、そんなに単純なものでもありませんが))
前者を聞いた新人は分をわきまえているというか、とりあえず答えられる質問をしています。teratailで聞いても直接的な回答がつくと思います。
(低評価がたくさんついた挙げ句、「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典とかが貼られそうではありますが(要するに「ggrks」「そんな面倒くさいことをQAサイトで他人に書かせようとするな」ということ))
質問者様はなぜ後者の、
「なぜ効くのか、なぜ動くのかを理解していないので、「書けば動く!覚えろ!」としかアドバイスできなかったのだと思います」
という発想に飛んだのでしょうか。
心情的にはわからなくはありません。「よくわからないものは分解してみると仕組みを理解できてわかるようになる」みたいな。子供が玩具を分解する心理ですね。
ただ、分解して仕組みがわかるのは作りが単純なものだけで、今どきの玩具を子供が分解しても緑色の基板が出てきて「なんだ、いくら眺めても仕組みがわからない、ダメだこれ」となるのがオチだと思います。
なので、そのアプローチは一回封印した方が良いです。
ところで以前の質問では確かwebデザイナーと名乗られていましたが、違うんですか?
「コーディングも多少できるwebデザイナーです」って名乗れば、それで良い気がするのですが。
投稿2018/12/12 21:13
編集2018/12/12 21:37総合スコア30933
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/12 21:22
2018/12/12 22:07 編集
2018/12/12 21:51
2018/12/13 03:16
2018/12/13 03:20
2018/12/13 03:36
2018/12/13 03:50 編集
2018/12/13 03:53 編集
0
php の根本的な事が知りたいのであれば、マニュアルが網羅的です。
PHP マニュアル
合わせて
PHP: The Right Way
の内容が説明できれば、新人に説明する程度には十分だと思います。
質問内容の修正に伴っての補足というか蛇足
コンピュータの世界って、関連する技術が非常に広い範囲にわたるので、先人達は「なんとか責務を分解しよう」と工夫してきました。ワリと大きな区分としては「OSI参照モデル」や、プログラミングの世界では「オブジェクト指向」とか。これらは、隣接した内容すら内部詳細を知らなくても良いように、利用の手続きのみを公開し詳細は隠蔽してしまいます。
少し複雑なことを行おうとすると、内部詳細を確認していく必要が発生しますが、新人に内部詳細の調査方法を伝えるのは先人の知恵に逆らうことになります。逆に「知らなくて良いための方法が提供されている」ことと「知らなくて良い仕組みの作り方」を教えてあげることが、先輩の役割になると思います。
投稿2018/12/12 16:24
編集2018/12/13 00:23退会済みユーザー
総合スコア0
0
あなたが知らない事は教えなくて大丈夫。
だって知らなくても仕事に差支えは無いって事ですから。
早くに戦力になってもらうには無駄を排除するのも必要ですから、仕事に必要のない事を教えるのは非効率というものです。
ただ、質問してくるというのは好奇心の現れですから、それを阻害しない指導に腐心されてはどうですか。
投稿2018/12/13 02:08
総合スコア25138
0
学習法は2種類あるといわれます。
- ボトムアップ式 (詳細情報を各個撃破で覚えていく)
- トップダウン式 (全体像を掴んでから、詳細を覚えていく)
その新人は典型的なボトムアップ型だと思いますが、ボトムアップは各個撃破する前にその前提となる知識を積み重ねている必要があります。
「メソッドとは?」と質問するなら、「関数」の知識が必要ですし、「クラスとオブジェクトの違いとは?」なら、データ型や変数の知識が前提になります。
まず、質問者に対し、「自分が理解している範囲を相手に共有する必要性」と「質問の意図をめいかくにする重要性」を伝えて実践させて下さい。
その上で「理解している部分」「理解できない部分」を明確にすれば、容易に説明出来ると思います。
取り上げられた質問はあまりにも端的すぎて、回答する為の情報が足りていません。
前提知識があまりにも欠如しているなら、質問の解消を保留して、前提知識を一つずつ学習させて下さい。
(※特に初心者は「仮定に仮定を積み重ねて覚えているケース」が多く、仮定で思い込む考え方を改めさせる必要がある場合があります)
Re: brainfog さん
投稿2018/12/13 03:50
総合スコア18156
0
質問者はすごく違う方向に行っている印象です。
例えば子供にテレビの使い方を教えるときには「チャンネルリモコン」の使い方を教えると思います。
子供には
「1から12くらいのボタンがあって、押したボタンに対応したチャンネルになる」
ことを教えればいいですよね。
「なぜリモコンの1のボタンを押したらそのチャンネルになるのか」
「そもそもリモコンでなぜ離れたテレビが操作できているのか」
とかは子供にとってはどうでもいいと思います。無意味とまではいいませんが理解の有無で結果が変わらず影響を与えられないですし、それが正しいかどうか証明することもほぼ不可能なので不毛です。
投稿2018/12/13 00:28
総合スコア3828
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/13 03:11 編集
2018/12/14 01:10
0
関数は、プログラムを塊にしたもの。
ちなみに、echo は関数じゃないです。ステートメントと言います。
何れにしてもステートメントも、ビルトイン関数も、誰かが、動く様に作ってくれてるから、動くのです。効くのです。
クラスもオブジェクトもオブジェクト指向の用語だけど、同じ。
慣用的に、オブジェクトの定義をクラスと言って、
クラスをインスタンス化したものをオブエジェクトと言う方が多いかも。
クラスの中に書いたfunctionを、メソッドというだけ。
メソッドを、クラスの中の関数と言うと笑う人は居るけど
functionで定義するんだから関数なのですよ。
投稿2018/12/14 03:22
総合スコア45
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/13 03:34 編集
2018/12/13 04:17