コードを読むことはできるが、主にそれを書くのに苦労している[終了]


22

私は最近、初めてのプログラミング試験を受けました...そして、私はかなり失敗しました。まったくうまくいきませんでした。大学時代以外のことを責めるのは自分だけです。ほとんど何もしませんでした。

今、私は夏の時間の近くに別の予定を立てていますが、これが二度と起こらないようにしています。ここ数週間、私は本を読んで、読んで、もう少し読んでいます。私は見逃した古いことと、私たちがしている新しいことを続けています。ですから、明らかに、言語の理解に大きな違いがあることに気付くことができます。しかし、それはそれについてです。私はコードを読むことができ、コードで何が起こっているのかがわかりました...しかし、自分でコードを書くということになると、私は無知です。どのアプローチを取るべきかわからないので、質問を完全に理解することはできません。

私は毎日かなりの量の読書をしてきました(過去1か月かそこらで5〜6時間くらいしていました)。特に、ノード、リスト、アレイリスト、インターフェースなどの知識を持っているが、それについてのページでそれらを読む以外に。プログラムで起こっていることすべてを正確に指摘することができますので、プリサンプルコードに注釈を付けます。しかし、自分のコードを書くことは別の話です。


8
目標を立てるのに役立ちます。たとえば、ゲームを作成したい場合は、フレームワークまたはライブラリをダウンロードして、入門チュートリアルに従うことができます。それほど複雑ではない場合は、これらのプログラムの例を探して解体し、ニーズや興味に合わせて修正することができます。
カイ清

10
読む回数を減らして、プログラムを増やします。簡単なプロジェクトを見つけて実行します。完全にそれを行うことを心配しないでください、彼らが彼らがしていることになっていることをするように彼らにしてください。次に、どのように改善できるかを考えてください。
フィリップ14

1
ここ数週間、私は本を読んで、読んで、もう少し読んでいます。-読書は始まりであり、実際にはコーディングの方がはるかに優れています。紙の上に擬似コードでプログラムを書いて、それをJavaに翻訳してみてください。あなたが何をしなければならないかをすでに知っているなら、それは少し簡単です。
アンドレアス14


1
コーディングの方法を理解し、コーディングの基本を他の人に教えることを試みているときに、これは非常に興味深い記事であることがわかりました。すぐにそれを手に入れる人もいれば、そうしない人もいますが、私たちのほとんどは学ぶことができます。コードを読んで理解できれば、素晴らしいスタートを切ることができます:)
brichins 14

回答:


45

プログラムを書くことにより、プログラムの書き方を学びます。

しかし、あなたは小さく始めなければならない、男。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}  

そこから、構築を開始...

public class HelloWorld {
    static String test = "This is a test";

    public static void main(String[] args) {
        System.out.println(test);
    }
}

その後...

public class HelloClass {
    String test;

    public void setTest(String str)
    {
        test = str;
    }  

    public String getTest()
    {
        return test;
    }
}

public class HelloWorld {
    HelloClass myHelloInstance;

    public static void main(String[] args) {
        myHelloInstance = new HelloClass();
        myHelloInstance.SetTest("Hello World.")
        String myResult = myHelloInstance.getTest();
        System.out.println(myResult);
    }
}  

... 等々。オブジェクトがどのように機能するかの基本を理解すれば、より大きなプログラムを書くのがはるかに簡単になります。


8
2番目の例は、静的コンテキストで非静的変数にアクセスしているため、コンパイルに失敗するはずです。
ブランドン14

34
@Brandon:それはデバッグ作業として素早いものです。
ブライアンベッチャー14

これは、誰もがコーディングを学ぶ方法であり、私は推測するか、コーディングを学ぶべきです。
mrudult

1
内側のナイキを抱きしめて、「やるだけ」。
NotMe 14

15

いい質問です!登るには複数の学習曲線があることを認識することが重要です。プログラミング言語を学んでいるだけだと思わないように。それ以上のことをしています。

あなたは学んでいます...

  1. コードを書くために使用するツール。開発環境、エディター、デバッガー、コンパイラー。これらすべてのツールのマニュアルとヘルプファイルがあります。チェックしてください。ツールを熟知すればするほど、コードを簡単に作成できます。
  2. 調査中のプログラミング言語の構文は、あなたの投稿から、あなたがここに多くの焦点を当てているように聞こえます。
  3. ソリューションデザインスキル。有用で保守可能なコードをまとめる方法。これはあなたが構築する必要がある筋肉です。他のポスターが指摘したように、あなたはすることによって学びます。

苦労しているのはポイント3だと思う。あなたはコード内で物事を言う方法を学んでいますが(構文)、実際にあなたは私たちにコードで何を言うべきかを尋ねています。物事を行う正しい方法と間違った方法はありますか?

挑戦することをお勧めします。次の演習をご覧ください。

http://en.wikipedia.org/wiki/Eight_queens_puzzle

今、これは難しい挑戦です。各クイーンが互いに安全になるように、チェス盤に8人のクイーンを配置する必要があります。

したがって、学習者としてはこれは行き過ぎかもしれませんが、この問題を見て、それを使ってコードの書き方を学ぶことができます。

ここに試してみる戦略があります...

  1. 述べられた問題が解決されるよりはるかに単純になるように問題を再記述してください。8人の女王を忘れてください。1つだけに焦点を当てます。メモリ内のチェス盤を表すコードの記述方法を学び、その盤上に単一の女王を置き、それを画面上でテキストだけでユーザーに表示します。

  2. ステップ1で刺し終えたら、2人の女王を置き、両方が安全になるようにします。

  3. 最後に、ボードに2人以上のクイーンを配置して、全員が安全になるようにします。

上記のステップは、ステップワイズリファインメントと呼ばれる設計戦略のひねりです。デザインの面では少し古臭いですが、すぐに空白の画面から興味深いコードに移動できます。

他にもいくつかの設計および実装戦略があります。テスト駆動設計、オブジェクト指向設計、および設計パターンです。

そのうち、これらの戦略を兵器庫に追加し、必要に応じて使用します。より多くの設計戦略を研究し、実践すればするほど簡単になります。

ソースがあなたと一緒にありますように。


OOデザインはデザインパターンとどう違うのですか?それとも、2つを組み合わせていますか?
ピエールアラード14

1
段階的な改良とオブジェクト指向も相互に排他的ではありませんが、おそらくそれを知っています。ソースがあなたと一緒にありますように。+1
ガスドール14

15

はじめに

実践による学習:知識とノウハウ

知識とノウハウには大きな違いがあります。新しい学習者にとって、プログラムを読んでいるときにプログラムを「理解」できるので、プログラムがそのように書かれている理由を実際に理解していると考えるのはよくある間違いです。

そして、その2番目の部分に到達する唯一の方法は、練習することです。座って、テキストエディタ、コマンドラインを開き、そこに進みます。

小さなプログラミング

この段階では、いくつかの複雑なソフトウェアコンポーネントが相互にどのように相互作用するかを理解する能力が制限されている可能性があります(予想される)。そして、基本から始めなければならないので、実際には良いことです。銃をジャンプして正しいペースで動かさないでください。小さなタスクのために小さなエクササイズから始めてください。

正直なところ、私はJavaでプログラミングを学び始めることが道であるとは確信していませんでした(私は大学で生活するためにプログラミングを教えていました。それを始めるには複雑すぎるため、ほとんどのJavaの本は非常に困難に思われます。それにも関わらず、あなたが一歩一歩学習することを制限する限り、(少なくともプログラマーに期待するグローバルな知識のいくつかの分野では)確かにそれを行うことができます。

Javaを使用しているので、まともなJavaの本が必要な場合は、以下をお勧めします。

  • Javaで考える。大丈夫ですが、今は少し時代遅れです。
  • Javaチュートリアル。それは正確に最高の学習者の仲間ではありませんが、すべての基本をカバーし、例を提供するので、手元に置いておくのに最適なリファレンスです。学習Java言語トレイルは、私はそれが最初に把握するのは難しいかもしれ概念を紹介して、それは完全な初心者のために困難なことができると思うだろうけれども、おそらく、あなたの読書リストにする必要があります。
  • 効果的なJava。それは学習のための素晴らしい本ではありませんが、後で手元にあるべき素晴らしい参照でもあります。一度に読むのではなく、一口サイズのチャンクで読みます。

あなたがクラスで何を使うのかわからないので、私はこれに言及しているだけです。他にもたくさんの本があります。いくつかは良いです。何人かは何年も生徒を不自由にするでしょう。


学習プロセス

基本的なワークフロー

これからは、クラスで見たすべての演習とコードサンプルについて、この2段階のプロセスに従うことをお勧めします。

  1. 読んで勉強する
    1. 演習を読む
    2. それらを理解したことを確認してください
  2. コード
    1. 本を閉じる
    2. そのコードエディターとコマンドラインでコンピューターの前に座る
    3. 自分でプログラムを書き直そうとする

失敗した場合

あなたが失敗し、あなたが本を覗く必要があると感じたら、あなたの失敗は次のいずれかである可能性が高いです:

  • (おそらく)あなたは実際に解決策を理解していなかった、
  • (あまりありません)ソリューションの特定の部分がどのように見えるかを忘れていること:構文、API使用、...

最初の原因は、最も頻繁に直面するものです。2番目は逸話です。両方とも、繰り返し行われる方法で対処されています。

これらの初期例の1つを実装することに失敗するたびに、本をもう一度見てから、もう一度閉じてください。本を見ながらコーディングしないでください。ソリューション全体を削除して最初からやり直すことをお勧めします。繰り返しは、学習プロセスの煩わしいが重要な部分です。

これを軽視しないでください。「はい、わかりました、これを知っています」または「私は90%そこにいます。それはほぼ同じです」と言いたい衝動を感じるたびに、別のセクションにスキップして、その衝動に立ち向かい、やり直します。コンセプトを完全に理解していないことを正直に認めることは非常に困難です。

サイドノート:ほとんどの学校のプログラムは、物事をあまりにも馬鹿にせず、生徒にとって高度すぎるツールを提供することで、プログラミングコースを「キックスタート」しようとするのは大きな障害だと思います。キャリアの後半でツールによって自動化され、時にはほとんど覚えていないこともあります。それはあなたに浮かぶすべてのビットを教えることです。

成功の場合:超えてください!

演習の実施に成功した場合、必ずしも次の演習に直接ジャンプする必要はありません。それを改善するためにできることを試してみてください。要求された出力を変更できますか?小さな機能を追加しますか?オプション?あなたが今あなたが主な困難を通り抜けているその楽しいゾーンにいるので、試してみてください、そしてこれらの自己課せられた小さな要件はあなたの精神を少しでも維持する可能性が高いです。

ただし、行き過ぎないようにしてください。アルファベットを印刷して、それを反転させて、画面の対角線に突然色のグラデーションを付けて表示することはありません。小さな一歩を踏み出します。学習は長く反復的なプロセスであり、難易度を上げながら問題に取り組む必要があります(たとえば、再帰説明について私が通常どのように考えているかを参照してください)。


学習中-比較

あなたの問題は、実際にはプログラミングとはまったく関係ありません。これは、数千人が数学を学ぼうとするときに直面する問題と同じです。

あなたが彼らに問題を与えた場合、彼らは解決への道をどのように進めるかを見ません。しかし、彼らのために解決策を書き留めると、ほとんどの人はそれを理解し、「くそー、それはとても簡単だった!」と思うでしょう。それでも、あなたは彼らに異なる尺度と仮説で同様の問題を与え、彼らはそれを解決できません。彼らはその背後にある論理を理解していなかったし、彼らはそれを自分でできるようにするための練習が必要です。

これは数学の一般的な問題ですが、ソルフェージュ、言語文法、物理学などの学習が必要なロジックが必要な他の分野の多くで見られます。これらのことを理解するために:それはただ練習に行き着きます(それはその分野で、または個人がこの分野の概念をより容易に理解するように導く他の分野で)。

コードを書くことを学ぶことができない理由はありません。「ああああ!」に到達するまで挑戦し続けるだけです。/ユーリカの瞬間。次に、次のより困難な問題に進みます。


これらも役立つ可能性があります(後で):


6

これはあなたが聞きたいと思う答えではないことを知っていますが、もっとコードを書いてください!

より具体的には、理解しているコードを分析します。私はそれを通常の英語に「翻訳」するのに役立ちます(私は比較的初心者です)。

最初にコードを書くというアイデアをブレーンストーミングすることを恐れないでください(つまり、「ここで変数を宣言し、このセグメントを反復する」など)。次に、これらのさまざまなセグメントの実行方法を1つずつ調べます。

コーディングは暗記の練習ではなく、ビルディングブロックから何かを構築する方法を見つけ出すようなものではありません。実際の外国語を学ぶのと同じように、理解が最初になります。これはあなたが順調に進んでいる良い兆候です。

コードを書いたり読んだりするほど、それが意味をなすと信じてください。


5

他の人が言ったように、これはあなたが練習、練習、練習しなければならない場合です。

1つの問題だけを解決する小さなプログラムの束を書く

時には、最も難しい部分は実際にプログラミングに値するものを思いつくことです。可能であれば、クラス、継承など、苦労していると思われるトピックで作業してみてください。私の頭の上のアイデア:

  • 1000個の乱数を生成し、それらをコレクション(キュー、リストなど)に挿入します。コレクションをソートする提供されたメソッドを使用せずにコレクションをソートします。
  • 知っている10人をリストします。最初に名前に基づいて名前を並べ替えて表示します。次に、姓に基づいて名前を並べ替えて表示します。次に、パターン「最後に、最初に」に基づいてそれらを並べ替えてみてください(つまり、スミス、アンドリューはスミス、ジェシカの前になります)。
  • 1から100までのすべての素数を見つけます。
  • (継承)Polygonクラスを作成し、それに関数を与えますGetArea。次に、TriangleクラスとRectangleクラスをPolygonから継承し、GetAreaを実装するようにします。これを高次のポリゴン(五角形、六角形など)に対して続けます。
  • コードゴルフスタックエクスチェンジから物を選んでみてください*

*コードゴルフの目的は、質問に記載されている最小量の文字、バイト、またはその他のメトリックを使用して、提供されたタスクを実行することです。いくつかの答えを読むと、人々がこれらの問題を解決する賢い方法にすぐに感謝します。 最小バイトで問題を解決することに集中しないでください!ゴルフのコードを投稿する人は、経験豊富なプログラマーです。しかし、いくつかの質問はそれ自体で簡単なタスクを提供します。

いくつかの楽しいコードゴルフの例:

  • 4の累乗。正規表現で解決することを心配しないでください(答えでわかるように、それは非常に難しいです)。しかし、代わりに、「文字列が与えられた場合、その長さは4の累乗で割り切れますか?」という質問を解決します。派生も可能です:文字列の長さは4で割り切れますか?6で割り切れますか?プライムですか(これは長い文字列には難しいので、勇気が出たら試してください!)?
  • ストリング。文字列sを指定すると、可能なすべての部分文字列を出力します。
  • 単語カウント。これは、あなたがプログラミング研究のどの程度進んでいるかによっては難しいかもしれません。非常に簡単にするもの(連想コレクションなど)がいくつかありますが、それらのことを知らないと難しい場合があります。
  • タイトルがわかりにくい場合は、質問を無視してください。私が言ったように、コードゴルフは経験豊富なプログラマー向けです。単純な問題に焦点を合わせ、簡単な答えを考えてみてください。

問題解決の基本構造:

これらの多くは、関数がどのように見えるかについての良いアイデアを提供します。Xが与えられ、Yを実行すると、結果はZになります。

void foo()
{
    // Set up X here

    // Do Y here

    // Display Z here
}

基本を学び、言語に精通するためには、上記のテンプレートで十分です。よりオブジェクト指向のテンプレートは次のようになります:

Z foo(input X)
{
    Z result;
    // Do Y to X
    return result;
}

役立つ場合は、紙にも書き留めてください。あなたが人間としてこの問題をどのように解決するかというプロセスを通して自分自身について話してください。例:番号i、j、およびkを指定して、降順に表示します。人としては、簡単に解決できます。難しい部分は、コンピューターで解決できるように、アイデアを行ごとの指示に変換することです。

独自のアイデアも考えてみてください。難しいこともありますが、最も単純なプログラムでさえ、知らないことを教えてくれるかもしれません。全体のポイントは、それらが第二の性質になるまで、基礎を身につけることです。


4

コードを読むだけでは何も得られません。コードを書く必要があります。コードを書くだけです。書いたコードがくだらない場合でも心配しないでください。誰もががらくたコードを書いた。一部の人々はそれで生計を立てています。良いコードを書き始める人は誰もいません。学習中に悪いコードを書く必要があるのは、良いコードと悪いコードの違いが本当に明らかになるからです。

同じことをするコードの2つのブロックを読むとき、良いコードと悪いコードの違いを理解するのは難しいですが、スクリプトを書いて、それをレビューしてフィードバックを提供する知識を得た人がいると、違いがしばしば明らかになります。知っているものに直接適用できます。

プログラミングは暗記によって学ぶことができるものではありません。時刻表や履歴の日付とは異なります。プログラミングは実用的なスキルであり、鋭く保つためには絶え間ない練習が必要です。コードを書かずにプログラミングを学ぶことは、本を読んで泳ぐことを学ぶことに似ています。


1

この質問にはすでにいくつかの本当に良い答えがありますが、まだ見たことのない考えがいくつかあります。

プログラミング言語を学ぶことは、「本物の」言語を学ぶことによく似ています。一文、科学論文、または本であっても、書くよりも読む方がずっと簡単です。読んでいるときは、コンテキストからだけで多くを理解でき、読んでいるテキストやコードを理解できます。知らない単語を見たら、同じ語幹を持つ別の単語を知っているかもしれません。メソッドが表示されると、メソッドの名前からその機能の概要がわかります。書くときは、構文だけでなく、使用する実際の単語も覚えておく必要があります。プログラミングでも同じです。

他の人が言ったように、プログラムを読むだけではプログラムを書くことを学ぶことはできません。

小さく始めます。Javaチュートリアルを探して、すべてのユニットを次々に実行します。そして、十分に自信があれば、スキルをテストするための小さなプロジェクトを選びます。多分、GUIのやり取りをあまり必要としない、よく知っている簡単なゲームです。決めたら、Eclipseを開いて「空白ページ」を見つめるだけではいけません。ストーリーボードを作成します。複雑なUMLダイアグラムを描く必要はありません。プログラムの特定の側面をどのように解決できるかを考えてみてください。そして、コードを書くときは、大まかなドラフトから始めます。私は通常、多くのコメントを書き、プログラムが何をすべきか、どのような順序で行うべきかを説明し、実際のプログラムコードの入力を開始します。


1

他の人が言っているように、コードを書く練習をするだけです。それを実現するためには、事前定義されたメッセージの印刷、簡単なインタラクティブな計算機の作成、特定のタスクの解決など、何らかの問題を解決することに挑戦する必要があります。

インスピレーションが足りない場合、Project Eulerには、難易度を上げる数学/プログラミングのエクササイズがたくさんあります。明確でやりがいのある目標を達成し、プログラムをより快適に設計するのに役立つはずです。


1

それは本当に近くにヒットするので、私はちょうどこのトピックでチャイムだと思った。

コーディングを開始するだけです。誤解しないでください、読書は素晴らしいですが、実際にコーディングの知識が実際に何かを構築していることをあなたに与えます。前年に読んだことよりも、夏の単一の配置から多くを学びました。

また、盲目的にコーディングを開始するべきではないことも付け加えてください。自分でプロジェクトを作成します。自分が何をしたいのかを理解するために、何らかの方向性が必要です。どれだけ早く学べるかに驚かれることでしょう。IDEを開いて簡単なHello Worldの例を作成し始めると、そのやる気を起こさせる気持ちがすぐに忍び寄ってきます。少し深みのあるものを見つけて、それを知る前にそれを拡大します。


これは、既に前の回答に掲載されたものに比べて大幅何も追加するように見えるん
ブヨ

@gnatあなたは「してはいけない」という意味だと思いますが、それはあなたの意見です。私は彼が行っているのとまったく同じ状況を経験し、私が助けたものを共有しています。あなたはここに彼の質問にイントロを忘れた場合は、次のとおりです。「君たちは、任意のヒントを与えることができる...」
SeanWM

@SeanWM-プログラマーは、SOで慣れているものとは少し異なります。何かがすでに適切に回答されている場合、あなた自身の回答で同じポイントを繰り返すことはそれほど建設的ではありません。そして、それはOPがヒントや意見を求めているかどうかに関係ありません。良いQ&Aにはなりません。既存の回答に賛成票を投じ、見落とされたファセットを示す建設的なコメントを残すことをお勧めします。

+1、この答えは重要なものをミックスに追加します。これは、例や小さなテストプログラムだけでなく、実際のプロジェクトで作業することの重要性です。
GrandmasterB 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.