- ベストアンサー
入門書レベルのことが、どう実践の役に立つのか?
私は興味と暇つぶしでC言語の入門本を読んでいる者です。 プログラマーになるつもりは全くないです。 純粋に興味で質問させていただきます。 入門書レベルのことと実際の仕事ではだいぶ差異があると聞きましたが、では入門書レベルのこと(※)が実践やその勉強で具体的にどう必要で、どう役に立っていくのでしょうか? ある程度技術的な説明を、ド素人にもわかりやすくお願いしたいです。 「基礎だから」というお答えでしょうが、そこのツッ込んだ解説を知りたいわけです。 (困難な要求ですいません!) ※---------------------------- if,switch,for,while 2次元配列、自作関数、ポインタ、 関数への・コマンドプロンプトでの引数の渡し方 ファイルへの読み込み・書き出し バイナリファイルの入出力 構造体、共用体と列挙体、マクロ、 複数ファイルのプログラム malloc関数 ----------------------------
- みんなの回答 (25)
- 専門家の回答
質問者が選んだベストアンサー
そもそも「技術的な説明が難しい」のではなく、 質問そのものが「技術的に説明できない」たぐいものです。 実務面から見ても、※で挙げられた要素は全て、仕事でも使います。 では、入門書と実務とでどう違うかというと、 入門書では、それぞれの要素を個別に説明していますが、 実務では「それらの要素をいかに組み合わせる」かが重要になってきます。 入門書が「ポインタは○○するものである」といった感じで、各要素について、その意味を理解するものになっているのに対し、 実際にプログラムを組む場合は、「○○するためにポインタを使えばよい」といった感じになります。 「プログラムを組む」とは、プログラムで実現すべき処理内容を把握した上で、それを実現できる要素を当てはめていく作業なのです。 それが出来るようになるためには、前提知識として、個々の要素を知っていないといけません。知らなければ「当てはめる」こともできませんから。だからこその入門書ですね。 例えば、JPEG圧縮された画像を読み込んで展開するプログラムを考えます。 JPEG画像を読み込むためにはバイナリファイルの入力が必要です。 読み込んだデータを保持するメモリ領域の確保にはmalloc関数が必要です。 JPEG画像のヘッダ情報を取り扱うには構造体を使い、そのヘッダの記録内容を表現するのには列挙体を使うのが普通です。 よく使う数値はマクロを使わないと保守が難しくなります。 1ファイルが大きくなると管理が難しくなりますから、処理内容ごとに複数ファイルに分けるのが基本です。 読み込んだ圧縮画像を展開する処理は複雑ですので、個々の処理に分割して自作関数を作るのが必要です。 関数を使うからには、関数への引数の渡し方はわかってないとダメです。 バイナリデータの取り扱い時にはポインタを使った方がデータの取り扱いが楽になります。 読み込んだデータを処理するには、forもしくはwhileでループを回す必要があります。データの内容によって処理が変わりますから、その判定にはifかswitchが必要です。 展開して出来た画像は2次元配列で表現するのが普通です。 といった感じで、※で挙げられた要素は全部出てきますね。
その他の回答 (24)
- BLK314
- ベストアンサー率55% (84/152)
申し訳ありません。 誤記がありました。 ADOXはADO.NETと読み替えてください 以上です。
お礼
かくご回答いただいて失礼ですが、私の質問内容とはだいぶ関係ないことを記述されているようです。
- BLK314
- ベストアンサー率55% (84/152)
まず、全くの個人的見解であることをお断りしておきます。 私が思うに"プロ"であるならば、”プログラムの分かりやすさ"が重要です。 共同作業になることもありますし、"未来の自分は赤の他人"ととらえないと 人間の記憶なんてそんなにあてになるものではありません。 モジュール分割、関数分割、適度なコメントなどです。 私の先輩に"プログラム作成が凄く速い"と評判の人がいました。 彼は"プログラム作成の達人"ではなく、 エディタ操作の達人です。 そう、コピぺしまくりです。 "どう分割するか?ネーミングはどうするか?" 考えている暇があったら手を動かせ!! というわけです。 私は、これは"プロ"の仕事ではないと考えます。 1回きりの使い捨てなら良いかもしれません。 仕様変更などでメンテナンスする羽目になったら大変です。 しかも、他人が引き継ぐとしたら.... 理解するだけでもう大変です。 きちんとレイヤーに分けて、さらに関数化する 私は、”小さな関数をたくさん作る"ことを 別の先輩から叩き込まれました。 理由は、関数が小さければ、 その関数が正しく動作しているか 検証するのも楽だからです。 検証済みの関数をまた小さなサイズで組み合わせれば そのモジュールが正しく動作しているか検証するのも簡単です。 これらは最近流行りの"テスト・ファースト"にもピッタリマッチします。 簡単な関数なので境界条件とうも分かりやすく、 危ない所を確実に拾い出すことができます。 そのテストを通ったプログラムであれば、安心して使えます。 最新技術の勉強も大事ですが 流行り・廃りもあるので それ程、神経質にならなくても良いと思います (ex DAO ==> RDO ==> ADO ==> ADOX と学んできましたが これからDBを始めるなら いきなりADOXで構わないのでは? DAOなんてわからなくてもよいのでは?) 以上です。
お礼
せっかくご回答いただいて失礼ですが、私の質問内容とはだいぶ関係ないことを記述されているようです。
- aris-wiz
- ベストアンサー率38% (96/252)
> 「入門書程度では何一つもできない」というネット上の > プロの方の発言を読んで、その差異を埋めたくて、 > それが何なのかが気になったので質問をしました。 入門書によって良し悪しもあります。 その「プロの方」の発言にとらわれる事が、 そもそもの如何なものかと思います。 # プログラマってプロの境界がすごくあいまいな職業だと思うので それこそ、1つのことを行うのにプログラミングでは 人の数だけ考え方があるわけですから、 (もちろん考え方はある程度統一されるでしょうが。) 「プロが言っていた」というだけで、それを鵜呑みにするのは 良くない事だと思います。 「入門書レベルじゃ何もできない」って言っていても、 それは入門書を読んでいたから分かるわけで、 読むことが無駄とも思いませんし、「何もできない」= 「不要・役に立たない」と言うことも無いでしょう。 >1.異常事態の考慮 >2.性能要件の意識 >3.メンテナンス性の考慮 職場との環境の違いとすれば、 4.グループでの開発・コミュニケーション 入門書レベルであれば、自分で書いて動かせばそれで完結ですね。 しかし、実際の現場では既にあるプログラムを誰かから引き継いだり 逆に自分が持っていたプログラムを誰かに引き継いだり、 新しい機能をつけるときに、他の分担されている機能を持っている 人と話し合ったりという、コミュニケーションも発生します。 5.開発環境や動作環境の進歩や最新技術への対応 入門書では、主に成り立ちや過去の確立された技術を紹介しますが、 職場では例えば、WindowsやLinuxなどのOSも常に同じものが 使われるわけでは無く、新しい技術は常に発表され続け、 それへの対応も行う場合もあります。 もちろん、新しい技術なのでこれという教科書など無く、 技術文書などを読むことになります。 こういうことは、やはり経験していかないと 分からないこともあるのでは無いかと思います。
お礼
4.グループでの開発・コミュニケーション 5.開発環境や動作環境の進歩や最新技術への対応 ご回答ありがとうございます!
- zwi
- ベストアンサー率56% (730/1282)
>ありがとうございます。 >(1)~(5)までのことならば、具体的には無理でも、私でもなんとなくのプログラムの骨子はイメージできそうです。 >そんなに入門書の内容とかけ離れたものではなさそうですね? これだけだと、そうですね。 でも、C言語の入門書を読んでいるだけでは実際にプログラムを書けなかったりします。いざ書こうとすると出来ないんですよね。知識はあるけど使い方が判らないって感じですかね。 今回の自販機のプログラムも擬似的には、コマンドプロンプトで実行できるプログラムが作れますので作ってみてはどうでしょうか?キーボードから金額を入力して、買う商品の番号を選んで、お釣りが表示されるって感じですかね。C言語のコンパイラも無料で入試可能ですし。 実際の自販機のプログラムだとハード制御のタイミングやら割り込み処理やら異常時の処理やらノウハウが必要な面が沢山ありますが、プログラムってどんなものだと言うこと理解するにはよろしいかと。
お礼
ありがとうございます。 せっかくのご提案ですが、私は「何となくC言語がどんなもんか雰囲気を知ってみたいなぁ」程度の純粋な興味のみの人間なので、プログラムを書くつもりは全くありません。 ------------- 余談ですが23年ほど前、小学生の時にBASICというプログラマー教育用プログラム言語をやっていました。ポケコンですね。 なので、zwiサンがおっしゃる「いざ書こうとすると出来ない」というのや、プログラミングというものは完成したつもりでもエラーエラーで修正修正の連続の作業だという雰囲気も少しだけ知っています。
- tatsu99
- ベストアンサー率52% (391/751)
例えば1つの課題として、 ファイルを読み込み、その内容をそのまま別のファイルに書き出す。 という課題があるとします。 そうすると、基本的には、入門レベルのやり方と同じ方法で、やればその課題はクリアできます。 では、実践(本番業務)では、なにが違い、何が求められるのかということですが、それは概ね以下のようなことになります。 1.異常事態をどこまで考慮しているか。 ファイルの読み込み中にエラーが発生したらどうなるか、またどうすべきか。書き込み中にエラーが発生したらどうするか。またどのような種類のエラーが発生することが予想されるか。 これらのエラーの原因が適切に特定できる仕組みをプログラムに埋め込む必要があります。又、エラーの内容によっては、そこでギブアップではなく、ある一定期間、リトライするような場合もあり、エラー毎にプログラムは、適切な対応が必要とされます。 入門レベルは、基本的にこのことを一切考慮していません。 2.性能要件をどれだけ意識しているか。 その処理が完了するまでに、どれだけの時間がかかるかを意識する必要があります。いくら処理の内容が正しくても、非常に時間のかかるプログラムは基本的には使えません。データが小量な場合は、それほど気になりませんが、非常に大きなデータを処理させても耐えるかどうかの試験も行う必要があります。それで、だめな場合は、もう一度処理のやり方を見直す必要があります。 性能としては、そのほかに、CPU時間の消費率、メモリの消費率などがあり、これらを異様に消費すると、他のプログラムの実行に影響をあたえるので、それらがないかをチェックする必要があります。 入門レベルでは、上記のことは一切意識していません。 3.メンテナンス性の考慮 上記のプログラムは、しばらく使用していると、他にも機能を付け加えたい(例えば、もう1つのファイルを指定してそちらにも書き込みたい等の要求)ことや、プログラムの不具合が原因で、そのプログラムを修正・改造する必要が発生します。そのプログラムを作成した本人が、永久にそのプログラムを保守してくれるなら、それでよいのですが、現実的にはそれはありえないので、ほかの人がその改造を行うことになります。そうすると、そのプログラムは第三者からみて、非常にわかりやすいものでなければ、いけません。変数名にa,b,cなどをつけるのは、作成者本人は簡潔でわかりやすいでしょうが、他の人には全くわかりませんので、そのような変数名を使用することは、プロジェクトの規約(コーディング規約)で禁止されることが多いです。入門レベルでは、上記のことは一切意識していません。 ほかにもありますが、概ね、以上が、実際に業務で使用されるプログラムに求められるものです。 もちろん、上記の要件が厳しく求められない場合は、入門レベルのプログラムでも十分実用に耐えます。
お礼
入門レベルと実務の差異 1.異常事態の考慮 2.性能要件の意識 3.メンテナンス性の考慮 上記の要件が厳しく求められない場合は、入門レベルのプログラムでも十分実用に耐える 私のような入門レベル以下の人間にも非常によくわかりました。 そして最後の一行はある程度勇気のいる発言かと想像します。 (私が)真意はなんとなく捉えられていると思います。 ご回答ありがとうございます。
- gachinco
- ベストアンサー率20% (32/156)
「日本の歴史をアメリカ人に分かるように英語の文章で作ってください」 と言われた時に まず英語の文法とか単語知らないと 英語の文章が書けないでしょ 英語の文法とか単語を完璧に覚えたとしてもさ 今度は 「日本の歴史」を知らない人だったら、これまた書けないよねぇ それと同じじゃん
お礼
せっかく回答してもらって失礼ですが、この文章では何がどう何と同じなのかさっぱりわかりません。 gachincoにはわかってても私にはC言語の具体的なことが何一つ伝わりません。 冷やかしなら回答してもらわなくて結構。
- zwi
- ベストアンサー率56% (730/1282)
「百聞は一見にしかず」と言うし簡単なプログラムを作ってみてはどうでしょう。プロになる気は無いとおっしゃられてますが、本を読んでいる以上はプログラムなさる気も御有りかと。 世の中には職業も別にあるアマのプログラマの方も沢山いらっしゃいますし。 そうそう。 >入門書の最初の方で出てくるif~elseだけで全部作れてしまいそうな気がしてしまいます >「もしも△△のボタンが押されたら、○○しろ」 >「もしも△△のボタンが押されたら、○○に収まってるジュースを出せ」(ジュース自販機) >「もしもMUTEボタンが押されたら、スピーカーの音を消音しろ」(オーディオ機器) これだけだと確かに作れそうですね。でも自販機だと本当に必要なことはこれだけじゃないですよ。 (1)投入されたコインの金額管理 (2)おつりの金額をコインに分けて取り出す処理。 (3)押されたボタンに応じた商品の取り出し処理。 (4)取り出された商品の金額に合わせて金銭の減額。 (5)在庫を判定して商品ランプを点灯・消灯。 と大雑把に考えてもこのぐらいあります(実際にはもっと処理がありますが)。例に挙げられたのは(3)の部分だけです。
お礼
ありがとうございます。 (1)~(5)までのことならば、具体的には無理でも、私でもなんとなくのプログラムの骨子はイメージできそうです。 そんなに入門書の内容とかけ離れたものではなさそうですね?
- don_go
- ベストアンサー率31% (336/1059)
スポーツの場合は、基本ができていなければその結果は はっきりと出てきます。 プログラムの場合には、サンプル通りにすれば、それなりに 動いてくれるので、基本はもう十分に理解できたと 勘違いしてしまう部分があります。 後は、実際に試合に出て(プログラムを書いて)みて 自分の力量がどの程度なのか、どれ程力不足なのか を体感してみなければ判断はできないでしょう。
お礼
ご回答ありがとうございました。
- superside0
- ベストアンサー率64% (461/711)
> 入門書の最初の方で出てくるif~elseだけで全部作れてしまいそうな気がしてしまいます >「もしも△△のボタンが押されたら、○○しろ」 たしかに、その論法なら、どんなプログラムもif文だけでかくことができます。 でも、if文では ”もしも” と ”しろ”しかかけないので ”△△のボタンが押され”ていることをどうやって調べて、 ”○○する”命令を、どうやって書くのかが 論点から抜け落ちていますよ。
お礼
ありがとうございます。 プログラムは”もしも” と ”しろ”だけで、あとはハード機器が電流を流していくもんだと思ってました。
- superside0
- ベストアンサー率64% (461/711)
技術的な内容をですか・・・ どんな専門分野についてかを聴きたいかがわからなければ 答えようがないと思いますよ。 たとえば、 UNIX系であれば、システムコールや通信制御やプロセス制御のやりかたが必要なるし 会計系ならDBエンジンやトランザクションあたりだろうし ゲームやってればグラフィックやサウンド関係や割り込み制御になるだろうし Windows系ならAPIとか、.NETフレームワークとかだろうし、 デバドラやってる人なら、もっとハードよりの制御しらないといけないし。 (私はこれらは専門外なので想像ですが) 今の時点では、これらをあげられたような、if文~malloc()だけで書くのは無理 ということだけ、理解されていればよいとは思います。
お礼
ありがとうございます。 例えばジュースの自動販売機や電化製品の制御(組み込み系っていうのですか?)なんかどうでしょう? 入門書の最初の方で出てくるif~elseだけで全部作れてしまいそうな気がしてしまいます 「もしも△△のボタンが押されたら、○○しろ」 「もしも△△のボタンが押されたら、○○に収まってるジュースを出せ」(ジュース自販機) 「もしもMUTEボタンが押されたら、スピーカーの音を消音しろ」(オーディオ機器)
お礼
「作品(プログラミング)は個別の要素をいかに効率よく組み合わせれるかであり、入門書はその個別要素の基礎を解説しているものである」 非常に明確でわかりやすい説明をありがとうございました。