Здатний читати Код, але з усіх сил намагається його написати [закрито]


22

Нещодавно у мене був перший іспит з програмування ... і я досить сильно його провалив. Зовсім не велике. Я винен лише сам, як поза межами коледжу, я майже нічого не робив.

Зараз у мене ще один літній час, і я не дозволяю, щоб це повторилося. Вже пару тижнів я читав, читав і читав ще кілька. Я продовжую перебирати старі речі, які я пропустив, і новіші речі, які ми робимо. Тож явно я можу помітити величезну різницю в моєму розумінні мови. Однак саме про це. Я можу прочитати код, і тепер у мене є уявлення про те, що відбувається в коді ... але коли мені доводиться писати код, я просто незрозумілий. Наче я ніколи не знаю, до якого підходу підходити, і ніколи не можу реально повністю зрозуміти питання.

Я щодня читав неабияку кількість читань (робив близько 5-6 годин протягом останнього місяця або близько того) ... Але коли я відкриваю свій ІДЕ, я завжди відчуваю себе приреченим, це справді демотивує. Тим більше, що я знаю вузли, списки, масиви архівів, інтерфейси і т. Д., Окрім того, як читати їх на сторінці, про яку йдеться. Я можу зазначити саме все, що відбувається в програмі, так що коментуючи код преамплексу, я вважаю прекрасним ... але написання власного коду - інша історія.


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
@Brandon: тоді це вправляння налагодження добре і рано.
Брайан Боттчер

Ось так, навчившись, кожен вчиться кодувати, або повинен навчитися кодувати.
mrudult

1
Обніміть свій внутрішній Nike і "просто зробіть це".
NotMe

15

Чудове запитання! Важливо усвідомити, що у вас є кілька кривих навчання, щоб піднятися. Просто так, що ви не думаєте, що вивчаєте лише мову програмування. Ви робите зовсім трохи більше, ніж це.

Ви дізнаєтесь про ...

  1. Інструменти, які ви використовуєте для написання коду. Ваше середовище розробки, редактор, налагоджувач, ваш компілятор. Для всіх цих інструментів є посібники та довідкові файли, ознайомтеся з ними. Чим більше ви знаєте інструменти, тим простіше створити код.
  2. Синтаксис мови програмування, що вивчається, з вашого допису звучить так, що ви тут зосереджуєтеся на великій увазі, і вам, безумовно, потрібно.
  3. Навички дизайнерських рішень . Як зібрати корисну, ремонтабельну частину коду. Це м'яз, який потрібно наростити. Як і інші плакати вказували, ви вчитесь, роблячи.

Я підозрюю, що це точка три, де ти борешся. Ви вчитеся говорити речі в коді (синтаксисі), але насправді ви запитуєте нас, що я повинен говорити в коді. Чи є правильний і неправильний спосіб робити речі?

Я б запропонував вам прийняти виклик. Погляньте на наступне як на вправу.

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

Зараз це складний виклик. Ви повинні розмістити вісім королев на шаховій дошці, щоб кожна з королев була в безпеці один від одного.

Отож, як учень, це може бути надмірно досяжним, проте ви можете подивитися на цю проблему та використати її, щоб навчитися писати код.

Ось стратегія, щоб спробувати ...

  1. Перезавантажте проблему набагато простіше, ніж заявлену проблему потрібно вирішити . Забудь про вісім цариць. Зосередьтеся лише на одному. Дізнайтеся, як написати код для представлення шахової дошки в пам'яті, розмістіть на цій дошці одну королеву, а потім відобразіть її користувачеві на екрані лише текстом.

  2. Після того, як ви зробили удар на кроці 1. Поставте дві королеви на такі, щоб вони були в безпеці.

  3. Нарешті, попросіть розмістити на дошці понад 2 королеви, щоб вони були в безпеці.

Наведені вище кроки є поворотом стратегії дизайну, яка називається Покрокове уточнення. Це трохи старої школи з точки зору дизайну, але це перенесе вас від порожнього екрана до цікавого коду за короткий час.

Існують і інші стратегії проектування та впровадження: Тестово-керований дизайн, Об'єктно-орієнтований дизайн та Шаблони дизайну, щоб назвати декілька.

Вчасно ви додасте ці стратегії до арсеналу і використовуватимете їх як і коли потрібно. Чим більше стратегій дизайну ви вивчаєте та практикуєте, тим легше стане.

Нехай джерело буде з вами.


Чим OO Design відрізняється від шаблонів дизайну? Або ви збираєте це двоє разом?
П’єр Арло

1
Покрокове вдосконалення і ОО не є взаємовиключними, але ви, мабуть, це знаєте. Нехай джерело буде з вами. +1
Гусдор

15

Швидкий передмова

Навчіться робити: знання та ноу-хау

Існує величезна різниця у знанні та ноу-хау. Новим учням є звичайною помилкою думати, що оскільки вони можуть "зрозуміти" програму під час її читання, вони насправді розуміють, як міркування програми написано таким, яким воно є.

І єдиний спосіб дістатися до тієї другої частини - це практикувати. Сядьте, відкрийте текстовий редактор, командний рядок і спустіться до нього.

Програмування в малому

Цілком ймовірно (і очікується), що на цьому етапі ваша здатність розуміти, як кілька складних компонентів програмного забезпечення взаємодіють між собою, обмежена. І це насправді гарна річ, оскільки вона змушує вас почати з основ. Не стрибайте з пістолета і рухайтеся в потрібному темпі: почніть з невеликих вправ для невеликих завдань.

Якщо чесно, я ніколи не був переконаний, що починати вивчати програмування на Java - це шлях, який я ходив (я вчив програмування для життя в університеті, а ще час від часу займаюся приватним навчанням). Це саме по собі занадто складно, щоб почати роботу, і більшість книг Java здасться досить страшною. Тим не менш, це, безумовно, можна зробити (принаймні, для деяких областей того глобального знання, якого ми очікуємо від програмістів), якщо ви обмежитеся навчанням поетапно.

Книги

Якщо ви налаштовані на Java, і якщо вам потрібна гідна книга Java, я рекомендую:

  • Мислення на Java . Це нормально, хоча зараз трохи застаріло.
  • Підручник з Java . Це не зовсім найкращий супутник учня, але чудова посилання, яку слід тримати під рукою, оскільки вона охоплює всі основи та наводить приклади. Навчання Мова Java Trail , ймовірно , слід бути у вашому списку читання, хоча я думаю , що це може бути складною для початківців , як він вводить поняття , які можуть бути важко зрозуміти , в першу чергу.
  • Ефективна Java . Це не чудова книга для навчання, але і приголомшлива довідка, яку ви повинні мати під рукою для подальшого. Не для читання в один присідок, а в шматки розміру з укусом.

Я лише згадую це, оскільки не знаю, що ви використовуєте на уроці. Є багато інших книг. Деякі - це добре. Деякі будуть калічити студентів на роки.


Ваш процес навчання

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

Відтепер я б радив дотримуватися цього 2-крокового процесу для всіх вправ та зразків коду, які ви бачили в класі:

  1. читати та вивчати
    1. читайте вправи
    2. переконайтесь, що ви їх зрозуміли
  2. код
    1. закрити книгу
    2. сісти перед комп’ютером із цим редактором коду та командним рядком
    3. спроба переписати програму самостійно

У разі відмови

Якщо вам не вдасться і вам здається, що вам потрібно заглянути до книги, ваш збій, швидше за все, буде:

  • (швидше за все), що ви насправді не зрозуміли рішення,
  • (менше шансів), що ви забули, як виглядає конкретний біт рішення: синтаксис, використання API, ...

Перша причина, ймовірно, полягає в тому, з чим ви стикаєтеся найчастіше. Другий - анекдотичний. І те й інше вирішується періодичною практикою.

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

Не сприймайте це легковажно. Кожен раз, коли ви відчуваєте бажання сказати собі "так, добре, я знаю це" або "Я на 90% там, це майже так само добре, як зроблено", і хочете перейти до іншого розділу, боройтеся з цим закликом назад і починайте спочатку. Дуже важко чесності зізнатися собі, що ти не повністю зрозумів концепцію.

Побічна примітка: Я вважаю великим сумнівом, що більшість шкільних програм зараз намагаються "прискорити" курси програмування, скидаючи речі занадто багато і надаючи інструменти, які є занадто передовими для студентів: мета - не зробити ваше життя нещасним або для вас занадто навчитися напам’ять речі, які пізніше у вашій кар’єрі будуть автоматизовані вашими інструментами і які ви іноді навіть ледве запам’ятаєте. Це навчити вас усіх шматочків, які плавають навколо.

У випадку успіху: виходьте далі!

Якщо вам вдасться виконати свою вправу, не обов’язково переходити безпосередньо до наступної. Спробуйте побачити, що ви можете зробити, щоб покращити це. Чи можете ви змінити вихідний запит? Додати невелику функцію? Варіант? Постарайтеся, оскільки ви зараз перебуваєте в тій веселій зоні, де вам пройшли основні труднощі, і ці самовиражені крихітні вимоги, швидше за все, трохи стримують ваш настрій.

Однак не заходьте занадто далеко: ви не переходите до друку алфавіту і повернення його назад, щоб раптом зробити його по діагоналі на екрані з градієнтом кольорів. Робіть невеликі кроки. Навчання - це тривалий і ітеративний процес, і вам потрібно підходити до проблем із підвищенням рівня складності (наприклад, подивіться, як я зазвичай думаю про пояснення рекурсії ).


Це просто навчання - порівняння

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

Якщо ви дасте їм проблему, вони не бачать, як працювати над їх вирішенням. Однак якщо ви запишете для них рішення, більшість зрозуміє це і подумає "чорт, це було так просто!". Тим не менше, ти поставиш їм подібну проблему з різними заходами та гіпотезами, і вони не зможуть її вирішити: вони не розуміли логіки, що стоїть за нею, і їм потрібна практика, щоб мати можливість це зробити самостійно.

Зауважте, що це звичайна проблема з математикою, але, на мою думку, ви бачите це в багатьох інших областях, де потрібна певна логіка: вивчення солфежу, граматики мови, фізики тощо ... І це не зводиться до "природних" здібностей щоб зрозуміти ці речі: це просто зводиться до практики (будь то в цій галузі або в інших, які приводять людину до легшого розуміння понять у цій галузі).

Ви не можете навчитися писати код. Ви просто джевве, щоб продовжувати намагатися, поки не досягнете цього "а-а-а!" / Момент Еврика. Потім переходите до наступної, більш важкої, проблеми.


Вони також можуть допомогти (пізніше):


6

Я знаю, що це не відповідь, яку ви хочете почути, але: Напишіть більше коду!

Більш конкретно розчленувати код, який ви розумієте. Це часто допомагає мені "перекласти" його на звичайну англійську (так як я відносний початківець).

Не бійтеся замислюватись на ідеї щодо написання фрагмента коду спочатку (тобто "я хочу декларувати змінну тут, повторити цей сегмент тощо"), а потім детально шукайте, як робити ці різні сегменти.

Пам’ятайте, що кодування менш схоже на вправу на запам'ятовування і як на пошуки способу побудови чогось із будівельних блоків. Так само, як вивчення фактичної іноземної мови, спочатку розуміння, це хороший знак того, що ти добре йдеш.

Просто вірите, що чим більше ви будете писати та читати код, тим більше це матиме сенс.


5

Як говорили інші, це випадок, коли ви повинні практикувати, практикувати, практикувати.

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

Іноді найважча частина насправді придумує щось, що варто програмувати. Якщо можете, спробуйте попрацювати над темою, з якою, на вашу думку, ви боретесь - як, наприклад, заняття, спадщина тощо. Деякі ідеї вгорі голови:

  • Створіть 1000 випадкових чисел та вставте їх у колекцію (чергу, список тощо). Сортуйте колекцію без використання наданих методів, які б сортували колекцію для вас.
  • Перелічіть 10 людей, яких ви знаєте. Спочатку сортуйте їхні імена на основі імен та покажіть їх. Потім сортуйте їхні імена, грунтуючись на їх прізвища та відображіть їх. Потім спробуйте сортувати їх за шаблоном "останнє, перше" (тобто таким чином Сміт, Ендрю був би перед Смітом, Джессікою).
  • Знайдіть усі прості числа від 1 до 100.
  • (Спадщина) Складіть клас Полігон та надайте йому функцію GetArea. Тепер переконайтесь, що класи Трикутник та Прямокутник успадковуються від 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, відобразити їх у порядку зменшення. Як людину, це легко вирішити. Важкою частиною є переклад ваших ідей у ​​покрокові інструкції, щоб комп'ютер міг їх вирішити.

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


4

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

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

Програмування - це не те, чого ви можете навчитися запам'ятовуючи повороти; це не так, як таблиці ваших часів чи дати в історії. Програмування - це практична навичка, яка вимагає постійної практики залишатися різкими. Навчання програмуванню без написання коду - це як навчитися плавати, читаючи книгу.


1

На це питання вже є кілька справді хороших відповідей, але є кілька думок, яких я ще не бачив.

Вивчення мови програмування дуже схоже на вивчення «реальної» мови: читати її завжди набагато простіше, ніж писати, будь то одне речення, науковий документ чи книга. Читаючи, багато чого можна зрозуміти просто з контексту, розуміючи текст чи код під час його читання. Коли ви бачите слово, яке ви не знаєте, можливо, ви знаєте інше слово з тим же стеблом; коли ви бачите метод, назва методу дає вам хороше уявлення про те, що він робить. Пишучи, ви повинні пам’ятати не лише синтаксис, а й фактично вжиті слова. І те саме для програмування.

Як говорили інші, ви не можете навчитися писати програми лише з програм читання .

Почніть з малого. Шукайте підручник з Java та виконайте всі підрозділи один за одним. І коли ви досить впевнені, оберіть невеликий проект, щоб перевірити свої вміння, можливо, якась проста проста гра, яку ви добре знаєте, яка не вимагає занадто багато взаємодії з графічним інтерфейсом. Коли ви вирішили, не відкривайте Eclipse і дивіться на 'порожню сторінку'. Створіть раскадровку. Вам не доведеться малювати складні діаграми UML, просто подумайте, як можна вирішити певні аспекти програми - як розгортається історія чи ваш аргумент, так би мовити. А при написанні коду почніть з грубої чернетки. Зазвичай я пишу безліч коментарів, описуючи, що програма повинна робити, в якому порядку, а потім починаю заповнювати фактичний код програми.


1

Як кажуть інші, вам просто потрібно практикувати написання коду. Для того, щоб це було виконано, вам потрібно кинути собі вирішення якоїсь проблеми, будь то друк заздалегідь визначених повідомлень, виготовлення простого інтерактивного калькулятора чи вирішення якоїсь конкретної задачі.

Якщо вам не вистачає натхнення, Project Euler має безліч вправ з математики / програмування, що збільшують труднощі. Вони дають вам чіткі та складні цілі, які потрібно досягти, і повинні допомогти вам більш комфортно розробляти програми.


1

Я просто подумав, що я задзвонюся на цю тему, тому що це дійсно вражає близько до дому.

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

Я також повинен додати, що вам не слід просто сліпо починати кодування . Складіть проект для себе. Вам потрібен якийсь напрямок, щоб поставити себе, щоб ви знали, що ви хочете зробити. Ви здивуєтеся, побачивши, як багато швидко навчитесь. Якщо ви просто відкриєте IDE і почнете робити прості привіт з привітним світом, це мотиваційне почуття швидко повзе на вас. Знайдіть щось з невеликою глибиною, і перш ніж ви дізнаєтесь про це, ви будете розширювати його.


це , здається, додати що - небудь істотне за те , що вже писав в попередніх відповідях
комар

@gnat Я припускаю, що ти мав на увазі " Ні ", і це твоя думка. Я пережив таку саму ситуацію, з якою він ходить, і я ділюся тим, що мені допомогло. Якщо ви забули вступ до його питання ось так: "Не могли б ви порадитись ..."
SeanWM

@SeanWM - Програмісти дещо відрізняються від того, до чого ти можеш звикнути. Якщо на щось вже відповіли добре, повторне повторення тих же пунктів у вашій власній відповіді не все так конструктивно. І це незалежно від того, чи вимагає ОП поради чи думки. Це просто не приносить корисних питань. Краще проголосувати існуючі відповіді та, можливо, залишити конструктивний коментар із зазначенням пропущеної грані.

+1, ця відповідь додає щось важливе в суміш. У цьому важливо мати реальний проект, над яким можна працювати, а не лише приклади та невеликі тестові програми.
ГрандмайстерB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.