質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

ソースコードのお手本を見て勉強したいです。おすすめの学習法はありますか。

解決済

回答 6

投稿

  • 評価
  • クリップ 1
  • VIEW 6,478

score 7

こんにちは。

プログラミング初心者です。C#を独学しつつ、簡単なものを自己満足の範囲で作っています。

学習不足でまだまだ理解できてないことが多いというのもありますが、コードがうまくありません。
冗長というか、無駄が多く、「こういう仕組み(アルゴリズム?)で書いとけばよかった」と見直して思うことが多いです。

自力で考えてすっきりとした最短のコードを書けないので、お手本といいますか、
他の方のコードを見ながら引き出しを増やしたいと思っています。
イメージとしては英語学習でよく言われる「英作文は英借文」をプログラミングでもできたらといった感じです。

こういう学習方法が邪道でしたら他のおすすめの学習方法や、
そうでなければ、おすすめのソースコード集のような本など教えてください。

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2019/10/25 23:51

    複数のユーザーから「問題・課題が含まれていない質問」という意見がありました
    teratailでは、漠然とした興味から票を募るような質問や、意見の主張をすることを目的とした投稿は推奨していません。
    「編集」ボタンから編集を行い、質問の意図や解決したい課題を明確に記述していただくと回答が得られやすくなります。

回答 6

+9

最短のコードを書きたいというところが少しひっかかります。
短さは必ずしも善ではありません。そこにこだわって読みにくくするのではなく、読みやすいコードを心掛ける方が良いと思います。

とにかく一流の人が書いたコードが読みたいというのであれば、.NET Framework のライブラリを読んでみるのも良いのではないでしょうか。

Reference Source .NET Framework 4.8

もともとは超一流企業のライブラリ作成者というエリート中のエリートが書いたものですし、今はオープンソースとして世界中のハッカーたちによって磨かれているものですから、参考になるところは多々あるのではないかと思います。

私のおすすめは System.Linq.Enumerable です。LINQ の中枢であり、様々な発見があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/24 19:23

    アプリケーションソフトのソースと違い、普段使っているなじみのあるクラスのソースですから、仕様がわかっていて理解もしやすいという利点もあります。

    また、他のクラスをたくさん使っているソースを読もうとすれば、その依存するクラスも読まなければいけませんが、Enumerable はそれほど他のクラスに依存していないので、前提として読まなければならない部分も少なく、あちこちジャンプして追いかけなくて済みます。

    キャンセル

  • 2019/10/25 10:55

    公開されているということ自体知りませんでした…!著作権の関係でみんな見せないんだろうなと思い込んでいたもので…。
    せっかく教えていただいたのですが、少し私には早かったようで、自分の血肉にできるほどに理解できるレベルになるには時間がかかりそうです。真似できそうなところから少しずつ真似していきます。
    ありがとうございます!

    キャンセル

  • 2019/10/25 11:04 編集

    そのレベルであれば、人のコードを見て真似するのはかえって良くありませんね。検索で見つかる「わかりやすい」コードは、初心者が口伝えしてきたものが多く、危険なコードであったり問題を抱えるコードであったり用語が間違っていたりする確率が高いので、ある程度技術力がついて取捨選択することができるようになるまでは参考にしない方が安全です。それよりもまずチュートリアルを終わらせましょう。

    https://docs.microsoft.com/ja-jp/dotnet/csharp/tutorials/

    キャンセル

  • 2019/10/26 13:45

    1冊かなり易しい本を読んだものの、実際に手を動かして応用となると抜け落ちている基礎の部分が多いと自分でも感じていたので、参考になりました。ありがとうございます!

    キャンセル

checkベストアンサー

+5

見やすいコード、ということだと

あたりを読む、もありでしょうが……うーん、迂闊に初心者に勧めてよいものか(汗
※ある程度コードが読める人でないとかえって混乱させそうですし

余談:
The Art of Computer Programming には手を付けてはいけません(w あれは書いてあることは大変素晴らしいのですが、読むのにものすごく労力を取られますから(w
※大学で高度な専門授業受けるようなものですから……

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/24 21:26

    リーダブルコードの書籍は、自分も進めようと思った次第です…。
    「すっきりとした最短のコード」が書きたいとお見受けしました…。

    リーダブルコードを読めば、無駄な処理や意味不明な変数名の記述などを避ける基礎知識が得られるはずです…。

    あとは、気になるプログラムを記述している人がいたら、その人のGitHubアカウント等を見つけて、公開しているソースを見るのが良いのではないかと存じます…。

    あと、自分がプログラムを記述してて「ああああ!この記述似たような記述が多すぎてめんどくせぇ!!!!」って思った時点で、ラクな記述が無いかなるべく検索する癖をつけるのもよろしいかと…

    キャンセル

  • 2019/10/25 10:26

    そうなんです。無駄な処理や、変に書いたせいで行数も多いし、見返して「読みづらいコードってこんなのなんだろうなぁ」と我ながらがっくりということが多いんです。しかも大体が1か月後くらいに見返すと、簡単な関数1個作るだけでマシになったりするという…。

    自分がどの程度コードが読めるのかという力試しの意味でも、おすすめされた2冊を早速本屋に買いに行こうと思います。
    The Art of Computer Programmingは読めるレベルになったら読みたい本リストに入れます笑

    キャンセル

  • 2019/10/25 10:41 編集

    「過去の自分のコードがゴミに見える」というのは,その頃と比べて成長している証ですから,喜ぶべきことであり,がっくりする必要はないです.
    (後で見て「なにこれゴミ?」とならないならば,そのコードを書いた時点から進歩がないということで,むしろ危機感を覚える.)

    キャンセル

  • 2019/10/25 10:49

    ばりばりの現役でも、見返すと読みづらいコードが、なんてのは日常茶飯事です。
    最近は IDE でリファクタリングとかしやすくなりましたが。

    あと、最短のコードは必ずしも読みやすいコードではないです。わかりやすくするために敢えて冗長にする場合もあります。

    キャンセル

+5

「こういう仕組み(アルゴリズム?)で書いとけばよかった」と

これが思えるだけでも十分です。
過去の自分のソースを読んで「こう書けばよかった」をやっていけばいいんですよ。リファクタリングというやつです。

いきなり他人の意図のわからないコードを読んでも宇宙コードとして混乱するだけなので、自身を少しずつリファクタリングしていくのが最も確実で効率的です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/24 17:54

    早速の返信ありがとうございます。
    確かにトライして内省して自己研鑽、というのが王道ですよね。
    理解があやふやでアルゴリズムも冴えないまま手を動かしていることに焦っていて、ズルというか近道をしたくなったのかもしれません。
    言われて気づきました。ありがとうございます。

    現在独学が五里霧中状態でどんな情報でもありがたいので、もうしばらく回答を募集しておきます。

    キャンセル

  • 2019/10/24 18:00

    王道はないのでひとつひとつ、小さな階段を作ってのぼっていくと良いです。そうすればいつか必ず拓けます。

    キャンセル

+2

※回答番外編としてお読みください。

質の高いプログラムソースコードを読んで、そのコードが意図するものは何(what)か、何故(why)そうなり、どう(how)実装したのかの理由を考え続けることはまったくの正道だと思うのですが、反対に、「これは悪い」と言われる既知のコードを読み、なぜ悪いのか、自分がそうなっていないかを考えるのも、直近で効く薬になると思います。「アンチパターン」と言うやつです。

質問者さんはプログラミング言語としてC#をメインにお使いということで、直接はあたらないのですが、「Cプログラミング診断室」と言う書籍があります。初版が平成5年(1993年!)とかなり昔のものとなりますが、著者様のホームページがあって、
Cプログラミング診断室
ここではなんと、ホームページ上で内容を無償で公開されています。内容は辛口かつC言語ですが、言わんとすることは他言語使いのプログラマー諸氏にも伝わると思うので、ベテランから初心者プログラマーへのコードレビューとして読んでみると面白い(胸が苦しい)かもしれません。

それと、その手のアンチパターンとしてはやはり書籍の、
新装版アンチパターン~ソフトウェア危篤患者の救出 SBクリエイティブ
がコンパクトで読みやすく、個人的に面白かったです。製品としてダメな成長をするパターンがいくつか紹介されています。内容は設計手法寄りですが、実業務に携わっていると「あるある」なことが良く分かります。

ただ、残念ながらどうも絶版のようで、現時点では古本や図書館の蔵書をあたるしかないようです。
amazon - アンチパターン―ソフトウェア危篤患者の救出

自分で挙げておいてなんですが、読み物として面白いレベルのものであるので、今の質問者さんがあえて苦労して手に入れ、読むほどではないかもしれません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

他の方のコードを見ながら引き出しを増やしたい

何をするコードなのかという内容がわかるコードを他の人に書かせればよい,ということになりますね.
方法は…

  • プログラミングができる知人が存在するような状況なら
    何かお題を出して勝負するみたいな遊びをするだとか,一緒に何かを作る等が考えられますが… (実現難度が高すぎて回答になりませんね.)
  • 「特定の問題をどう解けばよいのか?」という話に落とし込んで,こういう場所で質問する,という手も有り得るかもしれません.
  • 仕事なら隣の人間の書いたソースを(あえて読みたければ)読み放題なのですが.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/25 10:07

    現在学生で学部も文系、周りに仲間がいないという状態で完全に自己完結するしかない独学状態です。
    プログラミング入門の他学部公開講座は受けたのですが、基礎の基礎といった感じで…

    >「特定の問題をどう解けばよいのか?」という話に落とし込んで,こういう場所で質問する,という手も有り得るかもしれません.
    なるほどです。自己添削の後にここでダメ出ししてもらうというのは、たくさんの先達からアドバイスがもらえるのでためになりますね。ありがとうございます。

    キャンセル

+1

まだ、閉じていないみたいなので、、、

英語学習でよく言われる「英作文は英借文」をプログラミングで

プログラムでは、無理みたいです。なんせ、変化が速すぎです。
コンピュータの最初の頃は、Fortran/Cobol だったか? 次が、C言語?
まあ、多少の異論はあっても、たった50年ほどの時間です。英語は(まあ、日本語でも) そんなに大きな変化は無いでしょう。変な言い回し、と思ってもとりあえず、意思は通じるものです。
また、プログラミングと言っても、ここで話題になる事の多いゲーム系、Web系、そして、組み込み(ここだと、RasPi?) あまり、話題にはならないみたいですが、経理とかの業務系。それらは結構、違います。大学で言ったら、文学部と、理学部とか、果たして専門的な言葉は通じるのでしょうか? ってところです。
(日本では大抵、日本語での講義ですね)

まずは、その辺を絞られる事を勧めます。

あと、古き良き時代は、Unixのソースを読め、なんて言われた事もあります。
仕事で縁あって見た事がありますが、簡単に手を出せるものではありませんでした。当時の多様な機種に対応するため、 条件コンパイルの山。

何をしたいかを明確にして、地道にやるしかないのでは? と思います。
あと、ここの質問にあるコードを読んでみるのも良いかもです。良い悪いは別にして、自分と異なる視点で書かれたコードばかりで、色々と参考になります。
(長いコードも少ないし、、)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る