能够阅读代码,但主要为编写代码而苦苦挣扎


22

我最近第一次参加编程考试...而且我几乎失败了。根本没有做得很好。大学时代以外,我只能怪自己,我几乎什么也没做。

现在,我又在夏季临近时又来了一次,我不允许这种情况再次发生。几周以来,我一直在阅读,阅读和阅读更多内容。我一直在处理我错过的旧事物和我们正在做的新事物。因此,很明显,我对语言的理解有很大的不同。但是,仅此而已。我可以阅读代码,现在我对代码中发生的事情有所了解...但是当涉及到我自己编写代码时,我却一无所知。就像我永远不知道该采取什么方法,也永远无法真正完全理解这些问题一样。

我每天都做大量的阅读工作(过去一个月左右的时间大约是5-6个小时)……但是打开IDE时,我总是注定要死,这确实很无用。尤其是因为我了解节点,列表,数组列表,接口等方面的知识,但除了在有关页面的页面上阅读它们之外。我可以指出程序中正在发生的所有事情,因此给预采样代码添加注释就可以了……但是编写自己的代码则是另一回事了。


8
有目标是有帮助的。例如,如果您想制作游戏,则可以下载框架或库并遵循入门教程。如果不太复杂,则可以从搜索这些程序的示例开始,对其进行解构并进行修改以满足您的需求或兴趣。
Kai Qing

10
少读,多编程。查找简单的项目并执行。不必担心做得完美,只需让他们去做他们应该做的事情即可。然后考虑如何做得更好。
菲利普2014年

1
几周以来,我一直在阅读,阅读和阅读更多内容。-阅读是一个开始,实际上编码要好得多。尝试在纸上用psuedocode编写程序,然后将其翻译为Java。如果您已经知道要执行的操作,它会容易一些。
Andreas


1
我发现这是一篇非常有趣的文章,同时试图弄清楚如何编码并教别人编码的基本知识:骆驼有两个障碍。有些人会立即获得它,其他人则永远不会-但是我们大多数人都可以学习。如果您能够阅读和理解代码,那么您将有个不错的开始:)
brichins 2014年

Answers:


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:那么这是一个很好的调试工作,而且很早。
Bryan Boettcher 2014年

我想,这就是每个人学习编码的方式,或者应该学习编码的方式。
mrudult 2014年

1
拥抱内心的耐克,“做就做”。
NotMe 2014年

15

好问题!重要的是要意识到您有多个学习曲线可以攀升。只是为了避免您认为自己只是在学习编程语言。您要做的不止这些。

您正在学习...

  1. 用于编写代码的工具。您的开发环境,编辑器,调试器,编译器。所有这些工具都有手册和帮助文件,请检出。您对工具了解得越多,创建代码就越容易。
  2. 在您的帖子中,正在研究的编程语言的语法听起来像您在这里集中了很多精力,并且确实需要这样做。
  3. 解决方案设计技巧。如何将有用的,可维护的代码组合在一起。这是您需要增强的肌肉。就像其他海报指出的那样,您可以边做边学。

我怀疑这是您在努力的第三点。您正在学习如何在代码中说(语法),但实际上您是在问我们我应该在代码中说什么。做事有正确的方法和错误的方法吗?

我建议您接受挑战。请看以下练习。

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

现在,这是一个艰巨的挑战。您必须在棋盘上放置八个皇后,以便每个皇后彼此之间都可以安全。

因此,作为学习者,这可能是一个范围过大的问题,但是您可以查看此问题并将其用于学习如何编写代码。

这是尝试的策略...

  1. 陈述的问题要重述的问题要简单得多。忘了八个皇后。只关注一个。了解如何编写代码以表示内存中的国际象棋棋盘,在棋盘上放置一个皇后,然后在屏幕上以纯文本形式向用户显示。

  2. 一旦您在步骤1中刺了一下,就将两个皇后放在两个安全的地方。

  3. 最后,可以在板上放置2个以上的女王,以便它们都安全。

以上步骤与称为逐步优化的设计策略有所不同。就设计而言,这有点老套了,但它会立即将您从空白屏幕带入一些有趣的代码。

还有其他设计和实现策略:测试驱动设计,面向对象设计和设计模式等。

您会及时将这些策略添加到武器库中,并在需要时使用它们。您学习和实践的设计策略越多,它就会变得越容易。

愿消息来源与您同在。


OO设计与设计模式有何不同?还是您将两者放在一起?
皮埃尔·阿洛德

1
逐步优化和OO也不互斥,但您可能知道这一点。愿消息来源与您同在。+1
Gusdor

15

快速前言

边干边学:知识与专有技术

知识和专有技术之间存在巨大差异。对于新学习者来说,通常会犯这样一个错误,他们认为,因为他们可以在阅读程序时“理解”程序,所以他们实际上了解了按原样编写程序的原因。

达到第二部分的唯一方法是练习。坐下,打开文本编辑器,命令行,然后进入。

小型编程

在这一阶段,您理解(理解)多个复杂软件组件之间如何交互的能力很可能受到了限制。这实际上是一件好事,因为它迫使您从基础开始。不要跳步枪,以正确的步伐前进:从小练习开始做一些小任务。

老实说,我从来没有说过要开始学习使用Java编程是要走的路(我曾经在大学里教过编程,但有时还是上私人课)。它本身太复杂了,无法入门,并且大多数Java书籍看起来都令人生畏。但是,只要您将自己限制为逐步学习,就可以做到(至少对于程序员期望的全球知识的某些领域而言)。

图书

当您开始使用Java时,如果您需要一本不错的Java书籍,我建议:

  • 用Java思考。可以,尽管现在有点过时了。
  • Java教程。它不完全是最佳学习者的伴侣,而是一个很好的参考书,因为它涵盖了所有基础知识并提供了示例。在学习Java语言开拓者也许应该是你的阅读清单上,但我认为它可以是艰巨的完整的初学者,因为它引入了概念可能很难在第一把握。
  • 有效的Java。这不是一本好学的书,但也是以后应该掌握的精彩参考。不是一口气读,而是一口大小的东西。

我只说这是因为我不知道您在课堂上使用什么。还有很多其他书籍。有些很好。有些会削弱学生多年。


您的学习过程

基本工作流程

从现在开始,我建议您按照此两步过程来完成您在课堂上看到的所有练习和代码示例:

  1. 阅读和学习
    1. 阅读练习
    2. 确保你了解他们
    1. 合上书本
    2. 坐在那个代码编辑器和命令行的计算机前
    3. 尝试自己重写程序

如果失败

如果您失败并觉得自己需要看一眼这本书,则失败的原因可能是:

  • (很可能)您实际上并不了解解决方案,
  • (不太可能)您忘记了该解决方案的特定外观:语法,API使用...

第一个原因可能是您最常遇到的问题。第二个是轶事。两者都通过反复实践得到解决。

每当您未能实现这些早期示例之一时,请再次阅读该书,然后再次关闭它。看书时不要编码。我什至建议您删除整个解决方案,然后重新开始。重复是学习过程中令人讨厌但很重要的部分。

不要掉以轻心。每次您想告诉自己“是的,好的,我知道这一点”或“我在那里90%,这几乎和完成的一样好”时,您想要跳到另一部分,反击这种渴望并重新开始。要诚实地承认自己对概念不完全了解是非常困难的。

旁注:我认为,大多数学校课程现在试图通过过多地愚弄事物并提供对学生而言过于先进的工具来试图“启动”编程课程,这是一个极大的伤害:目标不是让您的生活痛苦或对您太学习内心深处,您职业生涯后期的事情将通过您的工具实现自动化,有时您甚至几乎不会记得。这是要教你所有漂浮的零碎。

成功案例:超越!

如果您成功实现了练习,则不必直接跳到下一个练习。尝试看看您可以做些什么来改善这一点。您可以更改请求的输出吗?添加一个小功能?一个选项?尝试一下,因为您现在正处在克服主要困难的有趣区域中,这些自我强加的微小要求更有可能使您精神振奋。

不过,不要走太远:从打印字母并反转字母到突然使它以彩色渐变出现在屏幕的对角线上,您都不会走过。采取小步骤。学习是一个漫长而反复的过程,您需要以越来越高的难度来解决问题(例如,查看我通常如何解释递归)。


只是学习-比较

您的问题实际上根本与编程无关。这是成千上万的人在尝试学习数学时遇到的相同问题。

如果您给他们带来问题,他们将看不到如何解决问题。但是,如果您为他们写下解决方案,则大多数人都会理解它,并认为“该死,这是如此简单!”。但是,您将使用不同的度量和假设为他们提供类似的问题,而他们将无法解决问题:他们不了解其背后的逻辑,他们需要实践才能自己做到。

请注意,这是数学中的一个普遍问题,但我认为您会在其他许多需要逻辑的领域中看到它:学习语言,语言语法,物理等……而且这不仅仅限于“自然”能力理解这些东西:这只是要实践(无论是在那个领域,还是在其他领域中,使人们更容易掌握该领域的概念)。

没有理由您不会学习编写代码。您只是不断尝试直到达到“啊啊!”。/尤里卡时刻。然后继续研究下一个更困难的问题。


这些可能也有帮助(以后):


6

我知道这不是您要听到的答案,但是:写更多代码!

更具体地说,剖析您确实了解的代码。它通常可以帮助我将其“翻译”为常规英语(因为我是一个相对的初学者)。

不要害怕集思广益,首先编写一段代码(例如,“我想在这里声明一个变量,遍历此段等”),然后,逐步查找如何执行这些不同的段。

请记住,编码不太像是背诵的练习,而是像想办法用积木构造东西。就像学习一门实际的外语一样,理解力是第一位的,这是一个很好的信号,表明你过得很好。

只要相信,您编写和阅读的代码越多,意义就越大。


5

正如其他人所说,在这种情况下,您必须练习,练习,练习。

编写一堆只能解决一个问题的小程序

有时,最困难的部分实际上是想出一些值得编程的东西。如果可以,请尝试处理您认为自己正在苦苦挣扎的主题,例如类,继承等。有些想法浮现在脑海:

  • 生成1000个随机数并将其插入到集合(队列,列表等)中。对集合进行排序,而无需使用提供给您的对集合进行排序的方法。
  • 列出您认识的10个人。首先根据名字对他们的名字进行排序并显示它们。然后,根据姓氏对名字进行排序并显示出来。然后,尝试根据模式“ last,first”对它们进行排序(即Smith,Andrew将在Smith,Jessica之前)。
  • 找出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,以降序显示它们。作为一个人,这很容易解决。困难的部分是将您的想法转换为逐行说明,以便计算机可以解决。

尝试提出自己的想法。这可能很难,但是即使是最简单的程序也可能会教给您一些您不知道的东西。关键是要用基础知识来训练自己,直到它们成为第二本性。


4

仅仅阅读代码,您将一无所获。您需要编写代码。只需编写代码。如果您编写的代码是废话,请不要担心。每个人都写了废话代码。有些人靠它谋生。没有人开始编写好的代码,我认为在学习的同时,几乎必须写坏的代码,因为只有这样,好代码和坏代码之间的区别才真正显现出来。

读取两个执行相同功能的代码块时,很难理解好的代码与不好的代码之间的区别,但是当您编写了脚本并得到有知识的人对其进行审查并提供反馈时,这种区别通常会变得更加明显,因为您可以将其直接应用于您所知道的。

不能通过死记硬背来学习编程。这不像您的时间表或历史记录中的日期。编程是一项实用技能,需要不断练习才能保持敏锐。无需编写代码即可学习编程,就像通过读书来游泳一样。


1

这个问题已经有了一些非常好的答案,但是有些想法我还没有看到。

学习编程语言就像学习“真实”语言一样:它总是比写起来容易得多,无论是一句话,一本科学论文还是一本书。阅读时,可以从上下文中了解很多内容,在阅读时理解文本或代码。当您看到一个不知道的单词时,也许您知道另一个词干相同的单词。当您看到一个方法时,该方法的名称为您提供了一个很好的方法。在编写时,不仅要记住语法,还要记住要使用的实际单词。和编程一样。

正如其他人所说,您不能仅从阅读程序中学习编写程序。

从小开始。寻找Java教程,然后一个接一个地完成所有单元。当您有足够的信心时,选择一个小项目来测试您的技能,也许是一些您熟知的简单游戏,不需要太多的GUI交互。确定后,不要只是打开Eclipse并凝视“空白页”。创建一个情节提要。您不必绘制复杂的UML图,只需考虑如何解决程序的某些方面-可以这么说,故事或您的论据如何展现。在编写代码时,请先准备一份草稿。我通常会写很多注释,描述程序应该以什么顺序执行,然后开始填写实际的程序代码。


1

就像其他人说的那样,您只需要练习编写代码。为了实现这一目标,您需要挑战自己,以解决某种问题,无论是打印预定义的消息,制作简单的交互式计算器还是解决某些特定任务。

如果您缺少灵感,Euler项目将提供大量难度不断增加的数学/编程练习。它们为您提供了明确而富有挑战性的目标来完成,并应帮助您获得更舒适的设计程序。


1

只是认为我会喜欢这个话题,因为它真的很接近家。

您只需要开始编码。别误会我的意思,阅读很棒,但是真正让您知道,熟练的编码知识实际上正在积累一些东西。我从一个暑假实习中学到的知识要比前一年阅读的更多。

我还要补充一点,您不应该只是盲目地开始编码。为自己做一个项目。您需要某种方向来投入自己,以便知道自己想做什么。您会惊讶地发现您会很快学到很多东西。如果您只是打开一个IDE并开始制作简单的hello world示例,那令人沮丧的感觉将很快蔓延到您身上。找到一些深度,在您不了解它之前,您将对其进行扩展。


这似乎确实
比先前

@gnat我假设您的意思是“不”,这是您的意见。我经历了他所经历的完全相同的情况,我正在分享帮助我的东西。如果您忘记了他的问题的介绍,那就是:“你们能给我一些提示吗……”
SeanWM 2014年

@SeanWM-程序员与您可能习惯使用SO有所不同。如果已经很好地回答了问题,那么在您自己的回答中重复相同的观点并不是那么有建设性。而且这与OP是否要求提示或意见无关。只是没有进行良好的问答。最好是对现有答案进行投票,并可能留下建设性的意见,以表明遗漏了一个方面。

+1,这个答案的确增加了一些重要的东西。那就是拥有一个真正的项目进行工作的重要性,而不仅仅是示例和小型测试程序。
GrandmasterB 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.