Может читать код, но в основном изо всех сил пытается его написать [закрыто]

22

Недавно у меня был первый экзамен по программированию ... и я его провалил. Не очень хорошо. Я могу винить только себя, потому что вне студенческого времени я почти ничего не делал.

Теперь у меня есть еще один подход к летнему времени, и я не позволю этому случиться снова. Уже пару недель я читаю, читаю и еще читаю. Я продолжаю изучать старые вещи, которые я пропустил, и новые вещи, которые мы делаем. Итак, очевидно, я могу заметить огромную разницу в моем понимании языка. Тем не менее, это об этом. Я могу читать код, и теперь у меня есть представление о том, что происходит в коде ... но когда дело доходит до написания самого кода, я просто не понимаю. Как будто я никогда не знаю, какой подход выбрать, и никогда не смогу полностью понять вопросы.

Я каждый день много читаю (около 5-6 часов в течение последнего месяца или около того) каждый день ... Но, открывая IDE, я всегда чувствую себя обреченным, это действительно демотивирует. Тем более, что у меня есть знания об узлах, списках, массивах, интерфейсах и т. Д., Кроме того, что я читаю их на странице, которая об этом. Я могу точно указать на все, что происходит в программе, поэтому аннотирование кода предварительной выборки мне кажется прекрасным ... но написание собственного кода - другая история ...

user3339333
источник
8
Это помогает иметь цель. Например, если вы хотите создать игру, вы можете загрузить фреймворк или библиотеку и следовать вводным учебным пособиям. Если что-то менее сложное, вы можете начать с поиска примеров этих программ, разобрать их и изменить в соответствии с вашими потребностями или интересами.
Кай Цин
10
Читайте меньше и программируйте больше. Находите простые проекты и делайте их. Не беспокойтесь об этом, просто заставьте их делать то, что они должны делать. Затем подумайте, как вы можете сделать лучше.
Филипп
1
Уже пару недель я читаю, читаю и еще читаю. - Чтение - это начало, на самом деле кодирование намного лучше. Попробуйте написать программу в формате psuedocode на бумаге, а затем перевести ее на Java. Это немного проще, если вы уже знаете, что делать.
Андреас
1
Я нашел это очень интересной статьей, пытаясь понять, как кодировать и обучать других основам кодирования: у верблюда есть два горба . Некоторые люди просто получают это немедленно, другие никогда не получат - но большинство из нас может учиться. Если вы умеете читать и понимать код, вы отлично начинаете :)
brichins

Ответы:

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
Ваш второй пример не должен быть скомпилирован, потому что вы обращаетесь к нестатической переменной в статическом контексте.
Брэндон
34
@ Брэндон: тогда это отладочное упражнение, хорошее и раннее.
Брайан Бетчер
Я думаю, именно так все учатся кодировать или должны учиться кодировать.
Mrudult
1
Обними свой внутренний Nike и "просто сделай это".
NotMe
15

Отличный вопрос! Важно понимать, что у вас есть несколько кривых обучения, чтобы подняться. Просто для того, чтобы вы не думали, что изучаете только язык программирования. Вы делаете немного больше, чем это.

Вы узнаете о ...

  1. Инструменты, которые вы используете для написания кода. Ваша среда разработки, редактор, отладчик, ваш компилятор. Есть руководства и файлы помощи для всех этих инструментов, проверьте их. Чем больше вы знаете инструменты, тем легче создавать код.
  2. Синтаксис изучаемого языка программирования, из вашего поста звучит так, будто вы уделяете много внимания здесь, и вам, безусловно, нужно.
  3. Навыки дизайна решений . Как собрать полезный, поддерживаемый кусок кода. Это мышцы, которые вам нужно нарастить. Как и другие постеры, вы учитесь на практике.

Я подозреваю, что это третий пункт, где вы боретесь. Вы учитесь говорить вещи в коде (синтаксис), но на самом деле вы спрашиваете нас, что я должен говорить в коде. Есть ли правильный и неправильный способ делать вещи?

Я хотел бы предложить вам принять вызов. Посмотрите на следующее как упражнение.

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

Теперь это сложная задача. Вы должны поместить восемь королев на шахматную доску, чтобы каждая из них была в безопасности друг от друга.

Так что, как ученик, это может быть непосильным, однако вы можете посмотреть на эту проблему и использовать ее, чтобы научиться писать код.

Вот стратегия, чтобы попробовать ...

  1. Перефразировать проблему намного проще, чем заявленная проблема, подлежащая решению . Забудь восемь королев. Сосредоточиться только на одном. Узнайте, как написать код для представления шахматной доски в памяти, поместите одну королеву на эту доску и затем отобразите ее пользователю на экране в виде простого текста.

  2. После того, как вы сделали удар в Шаге 1. Поместите две королевы так, чтобы они оба были в безопасности.

  3. Наконец, попытайтесь разместить более 2 ферзей на доске, чтобы они все были в безопасности.

Вышеуказанные шаги являются поворотом стратегии проектирования, называемой пошаговым уточнением. Это немного старая школа с точки зрения дизайна, но она быстро перенесет вас с пустого экрана на интересный код.

Существуют и другие стратегии проектирования и реализации: тестовое проектирование, объектно-ориентированное проектирование и шаблоны проектирования.

Со временем вы добавите эти стратегии в арсенал и будете использовать их по мере необходимости. Чем больше дизайнерских стратегий вы изучаете и практикуете, тем легче вам станет.

Пусть источник будет с вами.

обкрадывать
источник
Чем OO Design отличается от Design Patterns? Или ты собираешь их вместе?
Пьер Арло
1
Пошаговое уточнение и ОО также не являются взаимоисключающими, но вы, вероятно, знаете это. Пусть источник будет с вами. +1
Gusdor
15

Быстрое Предисловие

Учись на практике: знание против ноу-хау

Там огромная разница в знаниях и ноу-хау. Для новых учеников является распространенной ошибкой думать, что, поскольку они могут «понимать» программу во время ее чтения, они на самом деле понимают, почему программа написана так, как она есть.

И единственный способ добраться до этой второй части - тренироваться. Сядьте, откройте текстовый редактор, командную строку и приступайте к ней.

Программирование в малом

Вероятно (и ожидается), что на этом этапе ваша способность понимать, как несколько сложных программных компонентов взаимодействуют друг с другом, ограничена. И это на самом деле хорошо, так как заставляет вас начинать с основ. Не прыгайте с пистолетом и двигайтесь в правильном темпе: начните с небольших упражнений для небольших задач.

Честно говоря, я никогда не был убежден, что начинать учиться программированию на Java - это путь (я раньше преподавал программирование для жизни в университете, и до сих пор время от времени учусь в частной школе). Само по себе это слишком сложно, чтобы начать, и большинство книг по Java будут выглядеть довольно устрашающими. Тем не менее, это, безусловно, может быть сделано (по крайней мере, для некоторых областей этого глобального знания, которые мы ожидаем от программистов), если вы ограничиваетесь обучением шаг за шагом.

книги

Поскольку вы настроены на Java, и если вам нужна приличная книга по Java, я бы порекомендовал:

  • Мышление на Яве . Все нормально, хотя сейчас немного устарело.
  • Учебник по Java . Это не совсем лучший компаньон ученика, но отличный справочник, который нужно держать под рукой, так как он охватывает все основы и предоставляет примеры. Обучение Язык Java Trail , вероятно , следует быть в вашем списке чтения, хотя я думаю , что это может быть сложной для начинающих , как он вводит понятия , которые могут быть трудно понять , в первую очередь.
  • Эффективная Java . Это не отличная книга для обучения, но и замечательный справочник, который вы должны иметь под рукой на будущее. Не читать за один присест, а кусками размером с укус.

Я упоминаю об этом только потому, что не знаю, что вы используете в классе. Там тонны других книг. Некоторые хороши. Некоторые будут калечить студентов в течение многих лет.


Ваш учебный процесс

Основной рабочий процесс

С этого момента я бы посоветовал вам следовать этому двухэтапному процессу для всех упражнений и примеров кода, которые вы видели в классе:

  1. читать и учиться
    1. читать упражнения
    2. убедитесь, что вы их поняли
  2. код
    1. закрой книгу
    2. сядьте перед компьютером с этим редактором кода и командной строкой
    3. попытаться переписать программу самостоятельно

В случае отказа

Если вы терпите неудачу и чувствуете, что вам нужно взглянуть на книгу, ваша ошибка может быть либо:

  • (скорее всего), что вы на самом деле не поняли решение,
  • (менее вероятно), что вы забыли, как выглядит конкретная часть решения: синтаксис, использование API, ...

Первой причиной, вероятно, будет то, с чем вы сталкиваетесь чаще всего. Второй анекдотичный. Обе эти проблемы решаются путем повторяющейся практики.

Каждый раз, когда вам не удается реализовать один из этих ранних примеров, снова посмотрите книгу, затем закройте ее снова. Не пишите код, глядя на книгу. Я даже советую вам удалить все ваши решения и начать заново. Повторение является раздражающей, но важной частью процесса обучения.

Не воспринимай это легко. Каждый раз, когда вы чувствуете желание сказать себе: «Да, хорошо, я знаю это» или «Я там на 90%, это почти так же хорошо, как сделано», и вы хотите перейти к другому разделу, бороться с этим побуждением и начать все сначала. Очень трудно честно признаться себе, что вы не до конца поняли концепцию.

Дополнительное замечание: я считаю большой плохой услугой то, что большинство школьных программ в настоящее время пытаются «дать старт» курсам программирования, слишком затухая и предоставляя инструменты, которые слишком сложны для учащихся: цель не состоит в том, чтобы сделать вашу жизнь несчастной или для вас тоже учиться наизусть вещи, которые позже в твоей карьере будут автоматизированы твоими инструментами, и которые ты иногда даже почти не помнишь. Это чтобы научить вас всем, что плавает вокруг.

В случае успеха: выйти за рамки!

Если вам удается выполнить упражнение, не обязательно переходить непосредственно к следующему. Попробуйте посмотреть, что вы можете сделать, чтобы улучшить это. Можете ли вы изменить вывод, который был запрошен? Добавить небольшую функцию? Опция? Постарайтесь, поскольку вы сейчас находитесь в этой веселой зоне, где вы преодолели основную сложность, и эти навязанные самим собой крошечные требования с большей вероятностью будут поднимать вам настроение.

Однако не заходите слишком далеко: вы не переходите от печати алфавита и его переворота к внезапному отображению его по диагонали на экране с градиентом цветов. Делай маленькие шаги. Обучение - это длительный и итеративный процесс, и вам нужно подходить к проблемам с возрастающим уровнем сложности (например, посмотрите, как я обычно думаю об объяснении рекурсии ).


Это просто обучение - сравнение

Ваша проблема на самом деле не связана с программированием. Это та же самая проблема, с которой сталкиваются тысячи людей, пытаясь выучить математику.

Если вы дадите им проблему, они не поймут, как проложить себе путь к решению. Однако, если вы напишите решение для них, большинство поймет это и подумает: «Черт, это было так просто!». Тем не менее, вы дадите им аналогичную проблему с различными мерами и гипотезами, и они не смогут ее решить: они не поняли логику, стоящую за этим, и им нужна практика, чтобы иметь возможность сделать это самостоятельно.

Обратите внимание, что это общая проблема с математикой, но, по моему мнению, вы видите ее в тоннах других областей, где требуется некоторая логика: изучение сольфеджа, грамматика языка, физика и т. Д. И это не просто «естественная» способность чтобы понять эти вещи: это просто сводится к практике (будь то в этой области или в других, которые приводят человека к более легкому пониманию концепций в этой области).

Там нет причин, вы не можете научиться писать код. Ты просто продолжаешь пытаться, пока не достигнешь "ах ах!" Эврика Момент. Затем переходите к следующей, более сложной проблеме.


Это также может помочь (позже):

haylem
источник
6

Я знаю, что это не тот ответ, который вы захотите услышать, но: напишите больше кода!

Точнее рассмотрите код, который вы понимаете. Это часто помогает мне «перевести» это на обычный английский (поскольку я относительный новичок).

Не бойтесь мозгового штурма своей идеи сначала написать кусок кода (например, «Я хочу объявить переменную здесь, выполнить итерации по этому сегменту и т. Д.»), И ТОГДА по кусочкам посмотреть, как сделать эти различные сегменты.

Помните, что кодирование - это не упражнение на запоминание, а нахождение способа конструирования чего-либо из строительных блоков. Подобно изучению реального иностранного языка, понимание приходит на первом месте, это хороший знак того, что вы уже в пути.

Просто верьте, что чем больше вы пишете и читаете код, тем больше это будет иметь смысл.

Xelad1
источник
5

Как уже говорили другие, это тот случай, когда вы должны практиковаться, практиковаться, практиковаться.

Напишите несколько небольших программ, которые решают только одну проблему

Иногда самая сложная часть - это придумать что-то стоящее программирования. Если вы можете, попробуйте поработать над темой, с которой, по вашему мнению, вы боретесь, - например, с классами, наследованием и т. Д. Некоторые идеи мне не нравятся:

  • Сгенерируйте 1000 случайных чисел и вставьте их в коллекцию (очередь, список и т. Д.). Сортируйте коллекцию, не используя предоставленные методы, которые сортируют коллекцию для вас.
  • Перечислите 10 человек, которых вы знаете. Сначала сортируйте их имена по именам и отображайте их. Затем сортируйте их имена по фамилиям и отображайте их. Затем попытайтесь отсортировать их по шаблону «последний, первый» (т. Е. Смит, Эндрю были бы раньше Смита, Джессика).
  • Найти все простые числа от 1 до 100.
  • (Наследование) Создайте класс Polygon и дайте ему функцию GetArea. Теперь сделайте классы Triangle и Rectangle наследуемыми от Polygon и убедитесь, что они реализуют GetArea. Продолжайте делать это для полигонов более высокого порядка (пятиугольник, шестиугольник и т. Д.).
  • Попробуйте выбрать вещи из биржи стека гольф-кодов *

* Цель кода гольф состоит в том, чтобы выполнить поставленную задачу, используя наименьшее количество символов, байтов или какой-либо другой показатель, указанный в вопросе. Если вы прочитаете некоторые ответы, вы быстро оцените умные способы решения этих проблем. Не зацикливайтесь на решении проблемы в наименьшем количестве байтов! Люди, которые пишут в гольф, очень опытные программисты. Но некоторые вопросы предлагают простые задачи сами по себе.

Несколько забавных примеров игры в гольф:

  • Полномочия 4 . Не беспокойтесь о решении с помощью регулярных выражений (это довольно сложно, как вы можете видеть по ответам). Но вместо этого решите вопрос: «Задана ли строка s, делится ли ее длина на 4?» Вы также можете делать ответвления: делится ли длина строки на 4? Это делится на 6? Это простое (это трудно для длинных струн, так что попробуйте, если получите смелость!)?
  • Подстроки . Учитывая строку s, выведите все возможные подстроки.
  • Подсчет слов . Это может быть сложно, в зависимости от того, как далеко вы в ваших исследованиях программирования. Есть несколько вещей, которые делают это очень легко (например, ассоциативные коллекции), но если вы не знаете этих вещей, это может быть сложно.
  • Если название звучит для вас загадочно, просто проигнорируйте вопрос. Как я уже сказал, Code Golf предназначен для опытных программистов. Просто сосредоточьтесь на простых проблемах и попробуйте найти простой ответ.

Базовая структура решения проблемы:

Многие из них дают вам хорошее представление о том, как должна выглядеть функция. Учитывая 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, отображать их в порядке убывания. Как человек, это легко решить. Сложная часть - это перевод ваших идей в построчные инструкции, чтобы компьютер мог их решить.

Попробуйте придумать свои собственные идеи. Это может быть сложно, но даже самые простые программы могут научить вас чему-то, чего вы не знали. Все дело в том, чтобы тренироваться с основами, пока они не станут второй натурой.

Shaz
источник
4

Вы не получите ничего, просто читая код; вам нужно писать код. Просто напишите код. Не волнуйтесь, если код, который вы пишете, дерьмо; каждый написал дерьмовый код. Некоторые люди зарабатывают на этом. Никто не начинает писать хороший код, и я считаю, что во время обучения почти необходимо писать плохой код, потому что только тогда разница между хорошим и плохим кодом становится действительно очевидной.

Трудно оценить разницу между хорошим и плохим кодом при чтении двух блоков кода, которые делают одно и то же, но когда вы написали сценарий и у вас есть кто-то знающий, чтобы просмотреть его и предоставить обратную связь, разница часто становится намного более очевидной, потому что Вы можете непосредственно применить это к тому, что вы знаете.

Программирование - это не то, что вы можете выучить наизусть; это не похоже на ваши временные таблицы или даты в истории. Программирование - это практический навык, который требует постоянной практики, чтобы оставаться острым. Обучение программированию без написания кода похоже на обучение плаванию, читая книгу.

Рой
источник
1

На этот вопрос уже есть несколько действительно хороших ответов, но есть несколько мыслей, которые я еще не видел.

Изучение языка программирования очень похоже на изучение «настоящего» языка: его всегда намного легче читать, чем писать, будь то одно предложение, научная статья или книга. При чтении многое можно понять только из контекста, понимая текст или код по мере того, как вы его читаете. Когда вы видите слово, которое вы не знаете, может быть, вы знаете другое слово с таким же основанием; когда вы видите метод, имя метода дает вам хорошее представление о том, что он делает. При написании вы должны помнить не только синтаксис, но и фактические слова для использования. И то же самое для программирования.

Как уже говорили другие, вы не можете научиться писать программы только из чтения программ.

Начните с малого. Ищите учебник по Java и выполняйте все модули один за другим. И когда вы достаточно уверены, выберите небольшой проект, чтобы проверить свои навыки, возможно, какую-то простую игру, которую вы хорошо знаете, которая не требует слишком большого взаимодействия с графическим интерфейсом. Когда вы решили, не просто открывайте Eclipse и смотрите на «пустую страницу». Создайте раскадровку. Вам не нужно рисовать сложные UML-диаграммы, просто подумайте о том, как можно решить некоторые аспекты программы, - так сказать, как разворачивается история или ваш аргумент. А при написании кода начните с черновика. Я обычно пишу много комментариев, описывающих, что должна делать программа, в каком порядке, а затем начинаю заполнять фактический программный код.

tobias_k
источник
1

Как говорят другие, вам просто нужно попрактиковаться в написании кода. Для того, чтобы это было выполнено, вам необходимо решить какую-то проблему, будь то печать предопределенных сообщений, создание простого интерактивного калькулятора или решение какой-то конкретной задачи.

Если вам не хватает вдохновения, Project Euler предлагает множество упражнений по математике и программированию, которые становятся все сложнее. Они ставят перед вами четкие и сложные задачи и должны помочь вам более комфортно разрабатывать программы.

Эмиль Лундберг
источник
1

Просто подумал, что я буду вмешиваться в эту тему, потому что это действительно близко к дому.

Вам просто нужно начать кодирование. Не поймите меня неправильно, чтение - это замечательно, но то, что действительно дает вам знание кодирования, на самом деле что-то строит. Из одного летнего размещения я узнал больше, чем читал об этом в предыдущем году.

Я должен также добавить, что вы не должны просто начать писать вслепую . Сделайте проект для себя. Вам нужно какое-то направление, чтобы понять, что вы хотите сделать. Вы будете удивлены, увидев, как много вы узнаете быстро. Если вы просто откроете интегрированную среду разработки и начнете делать простые примеры из мира приветствия, это демотивирующее чувство быстро на вас нарастет. Найдите что-то с небольшой глубиной, и, прежде чем вы это узнаете, вы углубитесь в это.

SeanWM
источник
кажется, это добавляет что-то существенное по сравнению с тем, что уже было опубликовано в предыдущих ответах
gnat
@gnat Я предполагаю, что вы имели в виду "не делает", и это ваше мнение. Я прошел через ту же ситуацию, что и он, и делюсь тем, что мне помогло. Если вы забыли вступление к его вопросу, вот оно: «Не могли бы вы, ребята, дать какие-нибудь советы ...»
SeanWM
@SeanWM - Программисты немного отличаются от того, к чему вы привыкли в SO. Если что-то уже получено хорошо, повторение тех же пунктов в вашем собственном ответе не так уж и конструктивно. И это независимо от того, спрашивает ли ОП советы или мнения. Это просто не для хорошего Q & A. Лучше проголосовать за существующие ответы и, возможно, оставить конструктивный комментарий с указанием пропущенного аспекта.
+1, этот ответ добавляет что-то важное в микс. Вот почему важно иметь настоящий проект для работы, а не только примеры и небольшие тестовые программы.
GrandmasterB