【ソースコードを読めるようになりたい】

コンピュータ言語を学んで幾星霜、何も書けるようになりません。
むかしLinuxを弄っていたときに、こんな話を読みました。
「XFree86のソースコードを読んで、後々役に立った」と。
また学生時代の同窓生は、先輩のC++のコードをJAVAに直して書いて卒論としました。

書けるようにならないのは、例えばフリーのソフトのソースを読めず、
それ故どう書けばいいのか分からない所為かと思うようになりました。

HTML → C++ → Perl → JAVA → C → Python →VB →VBScriptと来ましたが、挫折しました。
それで読む段階で何をやっているのか分からない事が多いですが、
今回の場合、教科書を理解できるレベルであると仮定して下さい。
その後にソースコードを読んで、C#/JAVA/C/C++に
移植する事で勉強したいと思っていますが、ここで本題の、
どんなプログラムのソースコードを読めばいいのか教えて頂きたく思います。
開発環境はWindows 7 です。必要に応じてUbuntu/Debianでも導入しようかと思っています。
要は、読めるようになれば書けるようになるのではないか、と言う事です。
ご回答お待ちしております。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2010/12/04 16:10:05
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Haga No.13

回答回数9ベストアンサー獲得回数1

ポイント13pt

書けるようになりたいのであれば、

「どのように勉強すれば・・・」等の遠回りの道のりを考えて時間を費やすのではなく、

とにかく書きまくりましょう。必要性に迫られるのが大事です。

例えば、「obcの勘定奉行と全く同じものをVBで作る!!」とか決意してみたらどうですか。

こんな決意をしたら、まず画面を真似ようとしますよね。

本やネットで検索しながら必死で書いてたらそりゃ書けるようになりますよ。

複数サブシステムを記述していく内に、

ERも事前にキチンと考えておかないと必ず破綻することも経験するでしょう。

こんな経験から、SQL Profilerを使用して勘定奉行のERをリバースする事をひらめき、

必死に勉強すればとっくに一人前のDBアプリエンジニアです。

Connectionをオープンにしっぱなしにして実装していく内に、

「かたまっちゃった!!」 → 最大コネクション数に達したんだ・・・

             → コネクションをクローズしなきゃダメなんだ。

             → 1回1回クローズしたら遅いな・・・

             → コネクションプーリングか、なるほどね・・・

てなるでしょう。


大型システムを記述していく内に、

処理の記述の集約の大事さがわかるでしょう。

オブジェクト指向の大事さがわかるでしょう。

いきなり本で「現代はオブジェクト指向が主流」とか学習するのではなく、

何も考えずに書き痛い目を見ましょう。そっちのほうがはるかに良い理解です。

J2EEレイヤの一方通行性の重要さがわかるでしょう。

DAOの重要性がわかるでしょう。

例えばJavaでabstractとかprotectedとか学びましたよね?

本当にその意義を教科書から読み取れますか?

例えば、abstractはフレームワーク側でよく使いますよ。

個別実装の具体的な内容がわからない状態で、フレームワークの処理順序を記述します。

protectedは、個別実装範囲から見えてはいけないもの、

例えばConnection Poolからしか管理させないConnectionオブジェクトとかのアクセス範囲を限定する為に、

よく使います。

それも経験から習得した事です。

id:cpplearner000

ご回答ありがとうございます。

拝読致しまして溜飲の下がる思いをしました。

上の方でまだ初めてのGUIを使った小さいプログラムを作るご回答があり、それを実践しようかと。

私がもしこれから作るなら、OpenJane (Delphi)をC#に移植する事でしょうか。と言うか作りたいです。

それをやっているうちに、プログラマーの端くれになれるという事ですね。

拝読する限り、やり方が間違っている、と。

今回よく分かったのが、「とにかく書け」の意味です。よく分かり、理解できました。

心より感謝を申し上げます。

2010/12/01 10:39:25

その他の回答12件)

id:ykanzaki No.1

回答回数267ベストアンサー獲得回数8

ポイント14pt

読む以前にプログラムを作る必要があるのでないでしょうか

具体的に自分の行いたいことをはっきりさせ

最初は数行でもかまいませんが自分でプログラムを作り

動かし、色んなエラーがでます。

その原因を一つ一つ確認し修正し実際に

目的にかなうように動かしてみる

この作業を繰り返してみてください。

この基礎体力が身についた上で、参考になるプログラムの

ソースを読むことです。

実際に、プログラムのコーディング行い

エラーに遭遇し、そのエラーを自分で教科書を確認しながら

修正した経験無しに他のソースプログラムを読んでも分かりません


自分で動くプログラムを完成させたら、自然と次にすることが

分かってきます

id:cpplearner000

メイクアンドトライという奴ですね。

小さいプログラムでも有効そうですね。

2010/11/28 11:36:13
id:deflation No.2

回答回数1036ベストアンサー獲得回数126

ポイント14pt

Rubyコアのコードを読んでみましょう。

Rubyには数多くの機能があるので、まずは分野を決めて読み進めていけばいいでしょう。

id:cpplearner000

無理でしょう・・・

2010/11/28 11:36:37
id:TAK_TAK No.3

回答回数1136ベストアンサー獲得回数104

ポイント14pt

質問の意図を完全には理解できていませんが、

ここで本題の、どんなプログラムのソースコードを読めばいいのか教えて頂きたく思います。

この字面に従うとすれば、

テスト駆動開発

失敗するテストを書く

できる限り早く、テストがパスするような最小限のコード本体を書く

コードの重複を除去する(リファクタリング)

目的達成のために必要最小限のコードだけが書かれたソースコードを読むべきです。


実際のシステムでは

余計なこと、複数目的用、デバッグ用、...など、プログラムの理解に邪魔なコードが多く在ります。

id:cpplearner000

Sourceforge あたりからプログラムを落としてくればいいでしょうかね。。。

2010/11/28 11:37:46
id:SweetSmile1978 No.4

回答回数199ベストアンサー獲得回数31

ポイント14pt

書けるようになるためには、やはり「書く」ことが必要かと思います。

通常の語学も外国語を聞かないと聞き取れるようにはなりませんし、

外国語を話さないと話せるようになるのは難しいですね。

コードが書けないというのはいくつか理由があると思います。

一つはただなんとなくプログラムを学んで

ただなんとなくプログラムを書こうと思っても

なんとなくだからいまひとつ身が入らないというかんじでしょうか。

そういう点では「こういうのを作りたい!」というものを

まず見つけないとだめですね。

そういうのを見つけた後次に躓くのが

言語を理解していても、目的を実現するために

どういう処理をすればいいのかわからないということでしょうか。

たとえば、mp3 を扱えるようになりたい!といったばあい

プログラミング言語とは別に mp3 についての知識が必要になります。

それがわからないとどうにもなりませんから。

そういう点でプログラミング言語に限らず

自分が作りたいプログラムに関して

なにかを学ぶ必要があることもあります。

そういう点では他の人がどういう処理をしているのか

読んで参考にすることは非常に有意義だと思います。

ただ、やはりプログラムは

その分野・目的に応じて処理はばらばらです。

ですので、特定の分野について理解したからといって

別の分野ですらすら書けるようになるほどかんたんではないと思います。

共通する部分はないわけではありませんが。

自分がどういうプログラムを作りたいか考え、

類似のオープンソースプログラムを探し

それを参考にしながらとにかく書いてみるしかないかなと思います。

id:cpplearner000

上述のsourceforgeあたりか、そう言うコードのを載せているサイトから

落としてくるのが良いでしょうかね。。。

2010/11/28 11:38:46
id:garyo No.5

回答回数1782ベストアンサー獲得回数96

ポイント14pt

私はいくつも言語を覚えて来ていますが、

GUI系の言語であればまず最初に行うプログラムというのがあります。


まず、「テキストボックスに入れた文字をボタンを押すとメッセージボックスで表示する」というプログラムです。

これができれば、基本の入出力ができていることになるので、後は演算の問題だけになります。

次は、「ファイル選択ダイアログ」を表示させて、「ファイルの入出力」ができれば、簡単なツールが作成できるようになります。

その後、スレッド・タイマーなどで時計アプリを作ったりします。

その次にネットワーク系のアプリを作ってみます。

このくらいまでできれば、大抵のことはできると思います。

本で行けば、入門書を1冊完読したら、次は逆引き本を買って、自分が作りたいプログラムに必要な所を読んで行けば良いと思います。

何か他のプログラムを読めば良いというより、質問者の方は作りたいプログラムが無いのではないでしょうか。

ごく簡単なツール(何かの作業を自動化するとか)で良いので、自分で色々作って行くのが一番の早道だと思います。

id:cpplearner000

これですが、マイクロソフト公式の「プログラムを作ろう!Visual C# 2008 Express Edition"と言う、

教科書を持っています。

長らく眠らせていましたが、試してみます。

なるほど、GUIから勉強をしても良いのですね。

2010/11/28 11:41:15
id:tisei No.6

回答回数247ベストアンサー獲得回数6

ポイント14pt

私も最初は教科書レベルのプログラマーでした。

書けるようになったのは、

仕事で実際に動いているプログラムのソースコードをコピペして、

部分的に新しく書き換えて使ってみました。

ちょこちょこエラーが出るので、それを修正して繰り返し、進めていくうちにかけるようになりました。

まずは動くプログラムのソースコードをどこかでコピペして動かしてみてはいかがでしょうか。

id:cpplearner000

一緒にコードを作成する友人でも居ればいいのですがね。。。

2010/11/28 11:41:37
id:ratbeta No.7

回答回数132ベストアンサー獲得回数9

ポイント14pt

> どんなプログラムのソースコードを読めばいいのか

質問者さんがどの程度理解しておられるのか分からない(本当に教科書を理解しているのなら問題なくコードを書けると思います)ので何とも言えませんが、最初から難しいものを読もうとせず、Hello world!なプログラムのソースから読み始めてみてはどうでしょう。

上手い書き方の作法を知ったり、コードの雰囲気を知ったりするのには実際のプログラムのソースを眺めることは有用だと思うのですが、いきなりXFree86のような巨大なソフトのソースを読んでも理解できないと思います。足し算ができないのに微積分の参考書を眺めているようなものではないでしょうか。

質問者さんが日頃使っている、もしくは興味があるプログラムのうち、一番小さいオープンソースのものを探して読まれることをお勧めします。


> 読めるようになれば書けるようになるのではないか

他の方の回答にもありますが、質問者さんがどのようなプログラムを書きたいのかが分かりません。遍歴にある言語もHTMLのようなマークアップ言語であったり、PythonのようなWebスクリプト系の言語であったり、CやJavaのような本格的なプログラミング言語であったりとばらばらですし。

プログラミングが上達するためには、どんなプログラムを作りたいのかをしっかり考えることが一番だと思います。それに応じて適切な言語や知識が決まってきますから、その範囲の外にあるプログラムのソースを読んだとしても、そこから得られるものはそう多くないのではないでしょうか。

CNNのサイトの英文をただ漫然と眺めていても内容を理解することはできませんよね。何か興味を引くような内容があってはじめて、文章を訳してみようという気が起こるのではないかと思います。


これは個人的な勧めですが、動作に不満があるプログラムのソースを、自分の希望する動作を行うように修正してみることから始められてみてはどうでしょうか。

やはりゼロからプログラムを書くことは大変なので、まずは既成のプログラムをちょっとだけ直すところからされると良いのではないかと思います。

他の方の回答と殆ど重なってしまっていますがご容赦ください。

では。

id:cpplearner000

直す・・・とすると、JaneStyle の VBScript とか JScript の WSH を弄る事でしょうかね。

そう言うできている物を改造とかしてみたいと思います。

2010/11/28 11:43:03
id:grankoyama No.8

回答回数560ベストアンサー獲得回数170

ポイント14pt

>どんなプログラムのソースコードを読めばいいのか

てっとりばやいのは、バグや変更したい箇所のあるプログラム。

移植なんて大層なことを考えずに、同じ言語でバグを治したり、動作の追加や変更したらよいと思います。


今は、いろいろオープンソースなものがたくさんあります。あぱっちでもりなっくすでももっとちいさななんかでも。

プログラムを覚える以外の目的があるほうが、ためにもなるし、やる気も持続すると思います。


もしくは自分で書いたプログラムだと思います。

とりあえずなんかいろいろ作っていけばよい。読むより書け!迷わず行けよ!


全部前の方々がおっしゃってますね。ポイントはいりません。

id:cpplearner000

ソースコードが転がっていれば、それを弄れるようになりたいですね。

改造しているうちに自分のコードになれば幸いです。

2010/11/28 11:43:59
id:a-kuma3 No.9

回答回数4973ベストアンサー獲得回数2154

ポイント14pt

教科書レベルはクリアしてるとのことなので、テキストファイルを読み込んで加工したり、

データを並べ替える程度のプログラムは、何となく理解できるレベルではある、ということですよね。


昔は、unix のコードを読め、みたいなことをよく言われたけど、質問で上げてもらった範囲だったら、

JDK のソースを読んでみるのが一番良いんじゃないかな。

アルゴリズム的なところから入りたいのなら、java.lang.* とか、java.util.* とか。


データ処理もグラフィックも、それなりにカバーされているので、書きたいと思ってるコードに近いパッケージのクラスのコードを読んでみて、どうしてこういう書き方になっているのか、ということに対して、自分なりの理解をしていけば良いんじゃないだろうか。

「どうして、このような書き方になっているのか分からない」というところがあれば、聞けば教えてくれる人はいっぱいいる。

クラスによっては、コードの書き方云々ではなく、アルゴリズムを理解して無いと読めないものがあるので、それはまたそれで、聞けば良いんじゃない?


ただ、ソースコードを読んでるだけじゃ、(多分)クラス設計ができるようにはならない。

個人的にお勧めなのは、古いけど OMT(残念ながら、絶版)。

isbn:4810185273


個人的な感想として、「まず、書いてみる」のは、モチベーションを上げる(or 維持する)のには良いと思うけど、

レベルを上げるためには、あまり良い方法だとは思わないな。

頑張って、いろいろ試行錯誤して、独力で動かせたときの満足感というのは捨てがたいものがあるけど、

逆に、変な癖がついちゃう(かもしれない)ことも否めない。

変な癖がついちゃうと、「良いじゃん、これでも動くんだから」みたいな感じになって、なかなか治らないんだ(職業プログラマにありがち)。

id:cpplearner000

もちろん書けるようになりたいのですが、文法を覚えて、まねて弄るというのをしたかったのです。


書いてくださった皆様、参考になりました。

感謝申し上げます。

2010/11/28 11:45:19
id:xatosi No.10

回答回数9ベストアンサー獲得回数0

ポイント14pt

「教科書に書いてあるソースコード」では駄目なのでしょうか?

仮にも教科書目的として出版されている本に書いてあるコードなら、それなりに良質なコードが記載されていると思います。

(真っ当な技術系出版社の本なら、ちゃんと監修が入っていると思います。)

そのコードを、勉強したい言語のコードに移植してみるというのはいかがでしょうか。

それなりにスキルがある方なら、バグ持ちやクセのあるコードを読むのも勉強になりますが、経緯を見る限りそこまでのスキルはお持ちでないようなので、むしろあまり変なコードは読まない方がよいと思います。

今の段階では、良いコードを読む事の方が大事だと思います。

あと、完成したアプリケーションのソースコードだと、プロの開発者でもちゃんとした設計書無しでは読めない事が多いです。

サンプルコードレベルから始める事をおすすめします。

id:cpplearner000

サンプルコードという事とフリーの開発環境という事で、

Visual Studio 2010 Express Edition を使おうかと思います。

今更 Linux には戻りたくない(Emacsを除く)ので・・・

すると、VB.Net や C# になると思うのですが、下のご回答で、PHPが推薦されていますね。

言語をどれにするかは神学論争でしょうが、上のご回答の GUI で作る、と言うのに惹かれました。

いままではコマンドラインみたいなものばかりだったので、気持ちを一新する意味においてです。

ご回答ありがとうございます。

2010/11/29 17:19:52
id:auient No.11

回答回数4ベストアンサー獲得回数0

ポイント14pt

wikiを活用してソースを読む手法として「ひらメソッド」があります。

試してみてはいかがでしょうか。

http://hira-consulting.com/wiki/index.php?2005_6_23%A5%AB%A1%BC%...

WikiソフトウェアにはTiddlyWikiをオススメします。

1つのプロジェクトで1つのファイルにすると管理がしやすいと思います。

http://ja.wikipedia.org/wiki/TiddlyWiki

id:cpplearner000

HTMLをベースとしてCSSとJavaScriptを含むというのに惹かれます。

ご回答ありがとうございます。

2010/11/29 17:21:39
id:niwa-mikiho No.12

回答回数516ベストアンサー獲得回数40

ポイント13pt

まずそのアプリが何をやってるのかわからなければ、動作は分からないかと思います。


みんなが何をやってるのか分かり易いものとして掲示板があります。


掲示板は、投稿を受け付けて、データファイルに追記して、投稿が無いアクセスは過去の投稿を表示と、

何をやってるのか把握しやすい。


そしてそのプログラムをリファレンス本 (必須!!) を片手に読み解いてください。

また、読み解くプログラムは PHP にせよ Perl にせよ、色々読むのではなく1つの言語をある程度

読めるようになってください。


色々手を付けては混乱するだけです。


リファレンス本が必須なのは、WEB で無料で見られるとはいえ、ウィンドウを行き来しなくてはならないし、

初心者にはオススメできないです。

やはり 「紙に書かれたもの」 は偉大です ^-^


そして1つのプログラムをある程度分かったらとりあえず終了させ、最初に読み解いたプログラムとは違う

言語の掲示板を読み解きます。


そしてそれも読めるようになったら、移植してみてください。


順を追わずに一気にやろうとするから何も出来ないんだと思います。



で、オススメの言語ですが。


php > java > perl


です。

当方は perl が大好きではありますが、あまりオススメできません。

というのも、1つを実現するのに方法は沢山ある。 というのが perl の方針らしく、1つのやりたい事に対して

多くの書き方が存在します。

これでは初心者の方は最良の方法を選べといわれても選ぶことが出来ず、見るサンプルそれぞれが違う書き方なので

混乱しますw


なので、これから学ぶのであれば php と java が鉄板かなと。

ただ、java の掲示板は少ないので、php <-> perl で同じものが作れれば十分だと思います。

java はお仕事で覚えればいいと思いますし、 php <-> perl が出来てれば、java を覚えるのもそんなに苦では無いかなと・・・

id:cpplearner000

力がこもったご回答ありがとうございます。

Javaに限らず、文法を学習して、それでどうなるともなかった事が思い出されます。

PHPは勉強をした事がないのですが、あなた様のリファレンス本を脇に置く、と言うのは為になりました。

最初、本格的には Perl で学習したのですが、全然分かりませんでした。

その原因がいろいろな書き方があるという事だったのですね。

上で書いたVisual Studio 2010 Express Edition と一緒に、Eclipse 3.6 Helios も入れました。

気持ち新たにGUIなソフトを勉強して、その後実践としてPHP等を勉強しようと思います。

ご回答ありがとうございます。

2010/11/29 17:26:37
id:Haga No.13

回答回数9ベストアンサー獲得回数1ここでベストアンサー

ポイント13pt

書けるようになりたいのであれば、

「どのように勉強すれば・・・」等の遠回りの道のりを考えて時間を費やすのではなく、

とにかく書きまくりましょう。必要性に迫られるのが大事です。

例えば、「obcの勘定奉行と全く同じものをVBで作る!!」とか決意してみたらどうですか。

こんな決意をしたら、まず画面を真似ようとしますよね。

本やネットで検索しながら必死で書いてたらそりゃ書けるようになりますよ。

複数サブシステムを記述していく内に、

ERも事前にキチンと考えておかないと必ず破綻することも経験するでしょう。

こんな経験から、SQL Profilerを使用して勘定奉行のERをリバースする事をひらめき、

必死に勉強すればとっくに一人前のDBアプリエンジニアです。

Connectionをオープンにしっぱなしにして実装していく内に、

「かたまっちゃった!!」 → 最大コネクション数に達したんだ・・・

             → コネクションをクローズしなきゃダメなんだ。

             → 1回1回クローズしたら遅いな・・・

             → コネクションプーリングか、なるほどね・・・

てなるでしょう。


大型システムを記述していく内に、

処理の記述の集約の大事さがわかるでしょう。

オブジェクト指向の大事さがわかるでしょう。

いきなり本で「現代はオブジェクト指向が主流」とか学習するのではなく、

何も考えずに書き痛い目を見ましょう。そっちのほうがはるかに良い理解です。

J2EEレイヤの一方通行性の重要さがわかるでしょう。

DAOの重要性がわかるでしょう。

例えばJavaでabstractとかprotectedとか学びましたよね?

本当にその意義を教科書から読み取れますか?

例えば、abstractはフレームワーク側でよく使いますよ。

個別実装の具体的な内容がわからない状態で、フレームワークの処理順序を記述します。

protectedは、個別実装範囲から見えてはいけないもの、

例えばConnection Poolからしか管理させないConnectionオブジェクトとかのアクセス範囲を限定する為に、

よく使います。

それも経験から習得した事です。

id:cpplearner000

ご回答ありがとうございます。

拝読致しまして溜飲の下がる思いをしました。

上の方でまだ初めてのGUIを使った小さいプログラムを作るご回答があり、それを実践しようかと。

私がもしこれから作るなら、OpenJane (Delphi)をC#に移植する事でしょうか。と言うか作りたいです。

それをやっているうちに、プログラマーの端くれになれるという事ですね。

拝読する限り、やり方が間違っている、と。

今回よく分かったのが、「とにかく書け」の意味です。よく分かり、理解できました。

心より感謝を申し上げます。

2010/12/01 10:39:25

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません