web-dev-qa-db-ja.com

コードを読むことはできるが、コードを書くのに大いに苦労している

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

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

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

22
user3339333

プログラムを書くことでプログラムの書き方を学びます。

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

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);
    }
}  

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

45
Robert Harvey

すばらしい質問です。登るには複数の学習曲線があることを理解することが重要です。あなたがあなたがプログラミング言語を学んでいるだけだとは思わないようにだけです。あなたはそれよりもかなり多くやっています。

あなたが学んでいる...

  1. コードの記述に使用するツール。開発環境、エディター、デバッガー、コンパイラー。これらすべてのツールのマニュアルとヘルプファイルがあります。チェックしてください。ツールについて理解を深めるほど、コードの作成が容易になります。
  2. 研究中のプログラミング言語の構文、あなたの投稿から、あなたはここに多くの焦点を当てているように聞こえますが、確かにそれが必要です。
  3. ソリューション設計スキル。便利でメンテナンス可能なコードをまとめる方法。これはあなたが作り上げる必要がある筋肉です。他のポスターが指摘したように、あなたは行うことによって学びます。

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

あなたが挑戦することをお勧めします。演習として以下をご覧ください。

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

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

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

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

  1. 記述された問題が解決されるよりもはるかに単純なように​​問題を言い直します。 8つの女王を忘れてください。 1つだけに集中してください。メモリ内のチェス盤を表すコードを記述し、その盤に1つのクイーンを配置し、テキストで画面に表示する方法を学びます。

  2. ステップ1で刺し傷ができたら、2人のクイーンを配置し、両方が安全になるようにします。

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

上記のステップは、Step-wise Refinementと呼ばれる設計戦略のひねりです。デザインの面では少し古い学校ですが、空白の画面から興味深いコードにすぐに移動できます。

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

そのうちに、これらの戦略を武器に追加し、必要に応じてそれらを使用します。学習して実践する設計戦略が多ければ多いほど、それは簡単になります。

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

15
Rob Kielty

序文

実践学習:知識vsノウハウ

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

そして、その第二部に到達する唯一の方法は、練習することです。座って、テキストエディタ、コマンドラインを開き、それに取り掛かります。

小さなプログラミング

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

正直に言うと、Javaでプログラミングを学ぶことから始める方法だと私は確信していませんでした(私は以前、大学での生活のためにプログラミングを教えていましたが、時々私的な授業も行っています)。それ自体は複雑すぎて始められません。ほとんどのJava=本はかなり気の遠くなるように見えます。それでも、確かにそれは可能です(少なくとも、プログラマーに期待する世界的な知識の一部の領域については) )、ステップバイステップでの学習に限定する限り。

あなたがJavaに設定しているので、まともなJava本が必要な場合は、お勧めします:

  • Javaで考える 。大丈夫ですが、少し古くなっています。
  • Javaチュートリアル 。すべての基本をカバーし、例を提供するので、これはまさに最良の学習者の仲間ではありませんが、手元に置いておくのに最適なリファレンスです。- Java LanguageTrail の学習は、おそらくあなたの読書リストにあるはずですが、完全なものになるのは難しいかもしれませんが最初は理解しにくいかもしれない概念を紹介する初心者。
  • 有効なJava 。これは学習に適した本ではありませんが、後で手元に置いておかなければならない素晴らしいリファレンスでもあります。一度に読むのではなく、一口サイズのチャンク。

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


あなたの研究プロセス

基本的なワークフロー

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

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

失敗した場合

失敗して本をのぞく必要があると感じた場合、失敗は次のいずれかである可能性があります。

  • (おそらく)あなたは実際に解決策を理解していなかった、
  • (可能性は低い)ソリューションの特定のビットがどのように見えるかを忘れた:構文、APIの使用、...

最初の原因は、あなたが最も頻繁に直面するものである可能性があります。 2つ目は逸話です。どちらも繰り返しの練習で対処されます。

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

これを軽く服用しないでください。 「はい、わかりました、私は知っていますこれ」または「私は90%そこにいます、それはほぼ同じくらい良い」と自分に言いたいと思う衝動を感じるたびにスキップしたいと思います別のセクションに戻って、その衝動と戦い、やり直してください。概念を完全に理解していなかったことを自分に正直に認めるのは非常に困難です。

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

成功した場合:超えて!

エクササイズの実装に成功した場合、必ずしも次のエクササイズに直接ジャンプする必要はありません。それを改善するために何ができるか見てみてください。要求された出力を変更できますか?小さな機能を追加しますか?オプション?主な難題をクリアした楽しいゾーンにいるので、試してみてください。これらの自主的に課された小さな要件は、あなたの精神を少し上に保つ可能性が高くなります。

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


それはただ学ぶことです-比較

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

あなたが彼らに問題を与えた場合、彼らは解決への彼らの方法をどのように動かすかを見ません。しかし、あなたが彼らのための解決策を書き留めれば、ほとんどはそれを理解し、「くそー、それはとても簡単だった!」と考えるでしょう。それでも、あなたは彼らに異なる測定値と仮説で同様の問題を与えるでしょう、そして彼らはそれを解決することに失敗します:彼らはその背後にある論理を理解していなかった、そして彼らは彼ら自身でそれを行うことができるように練習が必要です。

これは数学の一般的な問題ですが、私の意見では、ソルフェージュ、言語文法、物理学など、いくつかのロジックが必要な他の多くの分野で見られます。そして、それは「自然な」能力ではありませんこれらのことを理解するために:それは単に実践に帰着します(その分野、または個人がこの分野の概念をより簡単に理解するように導く他の分野で)。

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


これらも役立つかもしれません(後で):

15
haylem

これがあなたが聞きたい答えではないことは知っていますが、次のコードを記述してください!

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

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

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

コードを読み書きすればするほど、コードが意味をなすようになると信じてください。

6
Xelad1

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

1つの問題のみを解決する小さなプログラムの束を記述します

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

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

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

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

  • 4の累乗 。正規表現で解決することを心配しないでください(答えでわかるように、これは非常に困難です)。しかし、代わりに「文字列sが与えられた場合、その長さは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を指定して、降順で表示します。人として、それを解決するのは簡単です。難しいのは、アイデアを行ごとの説明に変換して、コンピューターで解決できるようにすることです。

あなた自身のアイデアも思いつくようにしてください。それは難しいかもしれませんが、最も単純なプログラムでさえ、あなたが知らなかった何かをあなたに教えるかもしれません。重要なのは、基本に慣れるまで、基本を身につけることです。

5
Shaz

コードを読むだけではどこにも到達しません。コードを書く必要があります。コードを書くだけです。作成したコードががらくたであっても心配しないでください。誰もががらくたコードを書いています。一部の人々はそれから生計を立てています。誰もが良いコードを書き始めることはありません。私は、学習中に悪いコードを書くことはほぼ必要だと私は考えています。

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

プログラミングは、暗記によって覚えることはできません。タイムテーブルや履歴の日付とは異なります。プログラミングは、鋭敏さを保つために一定の練習が必要な実践的なスキルです。コードを書かずにプログラミングを学ぶことは、本を読んで泳ぐことを学ぶようなものです。

4
Roy

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

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

他の人が言ったように、readingプログラムからwriteプログラムだけを学ぶことはできません。

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

1
tobias_k

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

インスピレーションが不足している場合、 Project Euler には、難易度が増す数学/プログラミングの練習問題がたくさんあります。これらは達成するための明確で挑戦的な目標を提供し、プログラムをより快適に設計するのに役立ちます。

1
Emil Lundberg

それが本当に家の近くにヒットするので、私はこのトピックにチャイムを入れようと思っただけです。

コーディングを始めるには、必要だけです。誤解しないでください。読むことは素晴らしいのですが、実際に役立つコーディングの知識が何かを構築しているということです。 1つの夏の配置からそれについて読んだ前年よりも多くを学びました。

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

1
SeanWM