決して、プログラミングが嫌いになったわけではないのですが、cにしてもどんな言語にしても誰かの作ったものを受け身で使っているだけであるためかモチベーションが下がってします。
opencvの関数などを調べたりしているのですが、ただ覚えているだけのようで 改造したり本質が理解できていないためだと思います。
誰かの作ったものを使うのは仕方ないですが、ヘッダファイルや見慣れない関数、例えば、pcに保存した画像をサイズを決めて表示するプログラムもあるのですが、ブラックボスの部分が多く、pcの画像が保存された場所にどんなプログラムを書けば良いか。そこから、ディスプレイに表示するためのメモリ?に移すプログラムを書けば良いか。
何(本やpcの基本動作のソースコードが書いてある本など)を参照して彼らは以上のようなプログラムを一から、intやprintfなどの型を工夫して作ったのか全然わかりません。
ただ、覚えて、真似て、本質が理解できていないので、自分で好きなようなコードが書けないことが悲しいです。
書店を歩いて回りましたがそのような本は見つからず途方にくれました。
ソースコードを書いている時に、そこに自分なりの工夫やオリジナリティがないような気がしてしまいます。
もしかしたらまだ知らない故に悩んでいるだけかもしれません。
C言語でレジスタやメモリ、とにかくcpuやcpuに繋がる外部装置なども操れる、ハードの部分を操れるソースコードが書きたいです。
もちろん基本的なC言語の勉強は続けています。
皆さんはどうやってハッカーまではいかないにしても、自分で新しい何かを作ったり、GPUやCPUなどのハードを細部にわたって操ってやりたい事をしたのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答15件
0
ソースにオリジナリティなど要りません。
本を読むのを止めてオリジナルのソフトを作ったらどうですか?
投稿2018/01/28 15:33
総合スコア28660
0
こんにちは。
- ソースコードを書いている時に、そこに自分なりの工夫やオリジナリティがないような気がしてしまいます。
- C言語でレジスタやメモリ、とにかくcpuやcpuに繋がる外部装置なども操れる、ハードの部分を操れるソースコードが書きたいです。
まず、Zuisihnさんも言ってますが、ソース・コードそのものにオリジナリティを追求するのはナンセンスです。性能、信頼性、メンテナンス性を追求しましょう。
次に、上記の2つの間には何の関係もないですよ。
ハードの部分を直接操作していないプログラムにも、いくらでもオリジナリティ溢れるプログラムはあります。WEBブラウザで使う様々なサイトがありますが、それらのサイトのプログラムの多くは直接ハードウェアを触っているものは少ない筈です。多くはメモリ管理さえ言語に任せデータベースに接続するようなものが多いと思います。
最後に、プログラムでオリジナリティを追求する意味がある部分は、企画です。他のプログラムにない素晴らしい外見や使い勝手、性能を始めとして、他にはないサービスを提供するプログラムや他にはない面白いゲームなどなどですね。今も多くのオリジナリティ溢れるプログラムが出現しますが、多くの場合、そのプログラムを企画する時にGPUがどうのデバイスドライバがこうのみたいなレベルはあまり考えていないと思いますよ。
投稿2018/01/28 15:50
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
同じ悩みにぶつかったことがあるので、よくわかります。
私はこう考えることで抜け出しました。
「使わせてもらっているんじゃない。
使ってやっているんだ!」
↑のように言うと乱暴かもしれませんが、要は「プログラミング」と「発明」は別物だと言うことが本当に言いたいことです。
だって、結局そう考えざるを得なくなると思いますよ?(以下はテキトーなイメージです。)
今書いてるコード
↓
なにかのライブラリ
↓
言語実装
↓
コンパイラの内部
↓
アセンブラ
↓
CPU
↓
ノイマン型コンピュータって何さ?
↓
数学
↓
…
今まで人類が積み上げてきたものなのですから、キリがありません。
いつまでたっても深く知ることは終わらないので、深い理解ができないことが悩みならその悩みは尽きないということになります。
もちろん、仕組みを知るというのは立派なことですが、「車輪の再開発」という言葉がある通り、これはメインではないはずです。
凄腕ドライバーがいたとしてもその人が車を作っているわけではない、みたいなイメージでしょうか?
凄腕ドライバーはその車のことをよく知るために車の内部を調べたりはするかもしれませんが、それは運転するためです。車を作るためではありません。
プログラミングで言えば、気になったことができればその都度実装を調べるだけでいい、ということです。本当の目的はアプリ等を作ることであって、車輪を開発することではないのですから。
実際、内部実装を知っているかというよりも、いかに新しい情報を仕入れてそれをうまく使うか(運転できるか)の方がよりプログラマに求められる能力だというのを聞いたことがあります。(ソースは忘れました。)
ですから、内部実装を知る、という行為は、補助的なものと捉えていいのではないでしょうか?私はそう考えることで解決しました。
もちろん、内部実装の理解を諦めたわけではありません。これは暇な時にやればいいんです。できなかったからといって、落ち込む必要はないです。メインではないのですから。
そして自分で車輪を再開発する行為は、プログラミングとは別のまさに「再開発」と捉えるべきです。これができなくて悶々としておられるのかもしれませんが、ここまで散々書きましたが別にできなくてもプログラマ失格ではないです。むしろプログラミングと再開発をごっちゃにする奴の方が失格だと個人的に思います。
話は180°ほど変わりますが、ハード→ソフトという繋がりではなく、実際はハード→OS→ソフトという繋がり方ですから、単純にハードについて知りたければ先にOS(具体的にはLinux kernelとか)とそのインターフェイスについて学ぶと何かわかるかもしれません。
始めの方は
誰かの作ったものを受け身で使っているだけであるためかモチベーションが下がってします。
という内容に対してのみの回答です。
C言語でレジスタやメモリ、とにかくcpuやcpuに繋がる外部装置なども操れる、ハードの部分を操れるソースコードが書きたいです。
とのことですが、これらはおそらくLinuxやWindowsに対する理解がまず先に来ると思います。
ただこれはプログラミングの「一分野」という理解しか私はしていません。また、この分野については私は全くわかりませんが、だからといって自分はプログラミングができないとは考えてないです。
私も初心者なので色々抜けがあるかもしれませんが、回答してみました。一部他の回答者様と被っているかもしれません。
また長々と失礼しました。
参考になれば幸いです。m(_ _)m
投稿2018/01/28 17:12
編集2018/01/28 18:10総合スコア2043
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
まだ学習が進んでいない故の悩みですね。
気にしても仕方ありません。
自由自在にコードを書けるようになるには、コードを書く時間を積み重ねるしかありません。
私はこの道15年ほどになります。
まったくのプログラミング未経験の新人を数人育成した経験から言うと、毎日8時間業務でプログラミングに時間を費やせる環境においても、ぶっちゃけ半年は使い物になりません。
ところが、半年~1年、2年目においては飛躍的に伸びて来ます。
質問者の方の環境は分かりませんが、趣味でやっていて毎日コーディングできない状況なら継続して続けることがなにより重要です。
そして、2~3年くらいは今の状態が続くと思ってください。その先にようやく何かをつかめるようになります。
また、ソースコード自体にオリジナリティはぶっちゃけありません。
例えば、Androidアプリで画像生成してJPEG形式で保存するという処理を作りたいとしましょう。
この時、誰が書いても似たようなコードになります。
この事をみなさんはオリジナリティは不要と表現しています。
もちろん、その中で自分なりの工夫というのは入ってきますが、ある程度熟達して来ると、誰でもそうするよね?という形になるのです。
そうではなくて、オリジナリティとはソフトウェア自体の機能や目的、コンセプトにおいて発揮すべきなのです。
投稿2018/01/28 16:10
編集2018/01/28 16:11総合スコア4025
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ただ、覚えて、真似て、本質が理解できていないので、自分で好きなようなコードが書けないことが悲しいです。
質問者さんの悩みの全てはこの1文かなと理解しました。
好きなタイミングで自分のやりたい事をやればいいと思いますし、職業プログラマでないのであれば言語やライブラリを絞って学ぶ必要もないかと思います。あと一見無駄な事をやっている様に見える「真似る事」は実は【とても】重要なので飽きるまで続けられると良いと思います。きっと無駄にならずに戻ってきます。
真似ずに成長した、なんて方はいないはずです。
投稿2018/01/29 01:08
総合スコア5030
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C言語でレジスタやメモリ、とにかくcpuやcpuに繋がる外部装置なども操れる、ハードの部分を操れるソースコードが書きたいです。
CPUの種類を問わないのであれば、マイコンプログラミングであれば、上記のご希望に適ったプログラミングは実現可能でしょう。例えば秋月電子通商で販売されているようなマイコンボードを購入して、その上で動作するプログラムを作成してみるとか。
PCアーキテクチャ上のプログラミングでなければご要望を満たせない、ということであればこの回答は無しにしてください。
投稿2018/01/28 15:41
編集2018/01/28 15:48総合スコア6768
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
ふむ。
実際に何か作ってはいかがでしょうか?
例えば、私なら、
自宅PCはオフラインでどうしても情報がほしいときはネットカフェ等を利用しています。
で、毎回取得できたデータ ( ファイル等 ) はUSB等に入れて自宅に...ですが、
毎回ディレクトリ ( フォルダ ) を生成してその中に...というのがめんどくさいので、
C++等で実行ファイル化します。
するとダブルクリックで自動でやってくれるっていう。
そういう風に一括処理系でもいいので、実際に作ってみる。
そういうものじゃなくても、例えば無料ソフトをリリースしているサイト ( 窓の社 等 ) をチェックしてみて、
『こういうソフト、作ってみたいなぁ』とか『これがあーなればいいのになぁ』と思ったら、実際に作ってみるとか。
そうするとモチベーションキープしやすくなります。
最近凝っているのは、ライブラリの開発でしょうかね。
ライブラリといっても、自分が使いやすいようにするだけですが。
例えばprintf関数の第一引数は フォーマットですよね。
~~文字列を渡すときでもいちいち指定しないといけないから printf関数をラップして
~~
void Print( const char *msg ){
printf( "%s", msg );
}
Windows APIを実装して使う場合、MessageBox関数っていう関数があります。
これの引数がめんどくさいので
C
1void MsgBox( const char *msg, const char *caption ){ 2 MessageBox( NULL, msg, caption, MB_OK ); 3}
みたいにしておくとか。
これだけでも意外と私としては楽しいです。
ですが、これは人によります。
なので、工夫してください。
[追記1]
例えば、シンプルにアイコンをダブルクリックするとアプリが開いたりしますが、これはosのプログラムが行なっているのですか?
だと思います。
もしソフト側だったらプログラマか一般ユーザがやらないといけないはずですし。
( Windows API に起動用の関数がありますから。 )
たぶん、Windows なら Explorer っていうソフト ( Windows付属 ) が行っていると思います。
もちろん、プログラマが別のファイルやソフトを起動することもできますが。
[追記2]
(引用かつ、略) の様な(処理系?の)プログラムを書くための参考書などはないでしょうか?
ないですね。
全く無いわけではないですが、「これやっとけばOK」っていうのはないです。
あってもdocumentationぐらい。
私のやり方としては、
- 作りたいソフトをイメージする ( ノートに記述でもしておく。 )
- 機能としてどういうのがほしいかを考える
- 2を分解して考えていく
- それぞれを検索したり書籍等で調べる
...
これをひたすら繰り返す。
例えばC言語でファイルの書き込みをするときどうします?
処理内容的には ファイルに書き込む
ですが、
実際には
- ファイルを開く
- 書き込む
- ファイルを閉じる
を行っていますよね。
そういう風に分解して考える。
ダブルクリックするとデスクトップに "today"ディレクトリを生成し、その中に"image", "info"...といったディレクトリを生成するとしたら、
- デスクトップのパスを取得する
- ディレクトリを 1 に生成する
- カレントディレクトリを 2 に移動
- imageディレクトリ等を生成
...
みたいに考えることができますね。
こういう風に分解して考えていく。
初段階のうちはフローチャートで考えるといいかも。
後はデータ構造とアルゴリズムをやったり、デザインパターンもやったりとか。
一気に考えようとすると普通は無理。
一気にやって可能なのは、よほど熟練した達人か超人ぐらいのもの。
普通は分解して考えると思う。
投稿2018/01/29 04:33
編集2018/01/29 07:22総合スコア4958
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/29 04:39
2018/01/29 04:43 編集
2018/01/29 04:43
2018/01/29 04:44
2018/01/29 04:48
2018/01/29 04:50
2018/01/29 04:51
2018/01/29 06:57
2018/01/29 06:59
2018/01/29 07:08
2018/01/29 07:24
2018/01/29 07:29
2018/01/29 07:31
0
車に例えて考えてみてください。
あなたは車を作る人です。
工場のベルトコンベアで各パーツを組み上げる作業員と考えてもらってよいでしょう。
各パーツはその分野に精通した人が作り上げたものです。
そのすばらしいパーツを組み合わせて車を組み立てるのです。
あなたが言っているのは、車は作りたいけど、タイヤもハンドルも一から自分で作りたいと言っている様なものです。
更に言えばそのタイヤもゴムを作る人、ホイールを造る人、更にはホイールを設計する人、原料のアルミを作る人、成型する人、など、とにかく沢山の小さいパーツ且つその分野を長い年月をかけてブラッシュアップしてきた技術で成り立っています。
とは言えタイヤを作ってみたいとか、どのような技術で作られているのかという興味があるのもわかります。
そうは言ってもまずは満足に車が作れないと、どのようなタイヤを作っていいのかわかりませんよね。
なので今はパーツを使いこなして車を作り上げられるようになることを目指してください。
投稿2018/01/29 00:04
編集2018/01/29 01:28総合スコア16998
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
他の人の回答とも重なりますが、「ハードウェアを制御する」ところから「OpenCV」までは、相当な距離があります。両方いっぺんに考えようとするのでは、「二兎を追うものは一兎をも得ず」になるだけです。
「ブラックボックス」と言っても、プログラミングで使うようなものは、中身を考えなくて良くなる、いい意味でのブラックボックスです。実際のハードウェアは千差万別なので、1つ1つ対応するようなコードを書いていては、いつになっても終わりません。それこそブラウザ内のJavaScriptがいい例ですが、「どう頑張っても外側に対してできることがない」ことすらあります。GPUなどでは、デバイスドライバもGPUメーカーのプロプライエタリなものなので、メーカー外のプログラマーがアクセスできるのはDirectXやOpenGLのAPIレベルでできることが限界です。
誰かの作ったものを受け身で使っているだけである
下のレイヤでなく、さらに上を見てください。既製品のレゴブロックを組み合わせることで素晴らしい作品を組み上げるクリエーターのように、ライブラリで提供される関数などを部品として、さらに大きなものを組み立てていくのも、間違いなくプログラミングです。
投稿2018/01/28 23:09
編集2018/01/28 23:18総合スコア145184
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/29 04:05
0
プログラミングというか大きな仕組みには強い階層性があります。
自分がどの階層にいるのかをまず意識しなくてはなりません。
ウェブサイトをJavaScriptで作っているのに、物理メモリのマッピングを意識してもナンセンスです。
OSや他諸々がやってくれるものを自分がやろうとしてどうするのですか。
CPUやGPUの命令を個体別に覚えなくて済むようにドライバや高級言語などがあります。
意識すべきはむしろその透過性の方です。
結局そのような難しいことはいきなり分からないからいろいろとコードを読んで勉強しているのに、受け身とか考えてもしょうがないのです。
あなたの今まで勉強した時間以上下積みをした人が、もしかしたらそれ以上の時間をかけて作られたものを特に苦労もなく理解できると思う方が理解不能です。
その理論とかは計算機科学や情報理論になりますが、大学で6年学ぶという選択肢もあります。
終わる頃には、やりたいことをするのにこんなの必要なかった、と思うことでしょう。
個別な作業にはオリジナリティはありませんが、それを組み合わせたものにはあるかもしれません。
それでも誰がすでにやっていることがほとんどですが。
他の人がびっくりするものを作ることが目的ならプログラミングは向いておりません。
https://qiita.com/tatesuke/items/36924274f043f37a391f
なにかを自分で作りたいという気持ちを確かに持つ他ないのではないでしょうか。
あまりぱっとしない業界ですよ。
言語の仕組みを知りたいのなら、
https://www.amazon.co.jp/dp/B01BGEO9MS/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
知識不足の場合ほとんど理解はできないかもしれませんが、雰囲気だけつかめるかもしれません。
投稿2018/01/28 22:02
総合スコア8560
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C言語でレジスタやメモリ、とにかくcpuやcpuに繋がる外部装置なども操れる、ハードの部分を操れるソースコードが書きたいです。
書店を歩いて回りましたがそのような本は見つからず途方にくれました。
他回答でも指摘されていますが、いわゆる低レイヤ=ハードウェア寄りの分野に関心があるように聞こえます。この分野をターゲットとする書籍のご紹介まで(全部読めという訳ではありません。興味を持たれたものをどうぞ):
誰かの作ったものを使うのは仕方ないですが、ヘッダファイルや見慣れない関数、(中略)、ブラックボスの部分が多く、(中略)
ただ、覚えて、真似て、本質が理解できていないので、自分で好きなようなコードが書けないことが悲しいです。
個々の考え方があるとは思いますが、必ずしも「ブラックボックス」をそのまま使うことも悪くはありません。コンピュータに限らず、科学技術の発展によって利用者の “出来ること” は拡大しますが、つねに “なぜそうなるのか” という原理までを理解する必要はありません。もちろん、興味を持った人がその原理を探求していくことは否定しませんが、結局はその利用者が何を重視するか次第です。目的さえ達成すれば満足ならブラックボックスのまま手軽に使えばよいですし、ブラックボックスの中身が気になるなら探求者の道を歩き始めればよいだけです。ぜひご自身の興味対象をみつけて下さい。
投稿2018/01/29 07:01
編集2018/01/29 07:26総合スコア6191
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/29 07:09
0
もしOpenCVを自在に操れるようになりたいのなら、まずはいったんOpenCVは忘れてください。あなたに必要なのはプログラミングスキルを身につけることです。入門書に書かれていることが理解できるまで勉強してください。入門書の中にはゲームとかグラフィックなどを題材にしものもあります。そういうのは成果が目に見えやすいので退屈しないかもしれません。
プログラミングに慣れてきたら、より上級者向けの本で勉強すると良いでしょう。アルゴリズムの解説書などは良い教材になります。入門書で扱ったプログラムをより高度に改造していくのも良いかもしれません。
今時のゲームは高度すぎて一人で組むのは大変ですが、私が初心者だった頃はよくファミコンやゲームウォッチ(いと懐かし)のゲームを真似して作ったものです。
何度も書きますが、段階を踏むことが重要です。そして、何度も何度も作っては動かすということを繰り返すことが、結果的には上達への近道なのです。
一定レベルまで上達すれば、誰にも何も聞かずとも、OpenCVが理解できるようになります。
C言語でレジスタやメモリ、とにかくcpuやcpuに繋がる外部装置なども操れる、ハードの部分を操れるソースコードが書きたいです。
プログラミングが上達していけば、それが必要かどうか判断できるようになります。実際のところ、商用アプリを作る際にそれが必要なケースはほとんどありません。面倒なことはコンパイラーやライブラリーがすべて請け負ってくれていますから。
とはいえ、興味があるのなら放っておくのはもったいないですね、うってつけのものがあります。
→ マイコンボード
投稿2018/01/29 02:22
総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
まず、OpenCV にせよ各種プログラミング言語にせよ、OS そのものにせよ、プログラムという点からすると「道具」です。
言い換えると、絵画を描くのに「この絵の具の特性は」とか「この筆の作りは」とか学んだところで意味がありません。せいぜい「この筆は使いやすい」「この絵の具は発色がいいからこういうシーンに合う」とか描きあげたいものに合わせて選択するのに役立つくらいです。
※日本画や中世画のように「まず絵の具を作るところから始める」なんてのもありはしますが……
あるいは織物で考えましょうか。織物というのは、多種多彩な糸を縦糸・横糸で組み合わせることで見事な図案を表現していますが、それぞれの糸はあくまでも道具でしかありません。図案を考え、それを織り上げる手間と技術こそが作品を素晴らしいものにしているのです。そのような素晴らしい作品を作る人が、糸や生地の作り方・染め方といった細かいことまで気にしているでしょうか?
むろん、道具や部品を作る人も必要なのですが、それらの人はある意味別の世界の人なのです。いつかはその世界に足を踏み入れる必要があるかもしれませんが、一生無縁という場合の方が圧倒的に多いのです。
気になさる必要はないことにこだわるのはやめたほうがよろしいです。
投稿2018/01/29 00:28
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
皆さんはどうやってハッカーまではいかないにしても、自分で新しい何かを作ったり、GPUやCPUなどのハードを細部にわたって操ってやりたい事をしたのでしょうか?
要は、もっと低レベルレイヤーなコードを書きたいということだと思います。
↓この記事が参考になるのではないでしょうか。
低レイヤーの歩き方 - るくすの日記 ~ Out_Of_Range ~
ただ、あらかじめそれなりの実力が備わってないと茨の道だと思いますよ。私は、Z80の機械語を多少書く程度のことはできますが、これはとてもついていけない……
投稿2018/01/29 03:10
総合スコア36115
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/28 15:34
2018/01/28 15:46
2018/01/28 17:17
2018/01/28 17:19