22

过去,我在自学编程方面有过几次错误的开端。我已经阅读了几本书(主要是 C 和 Python),最后只是学习了语法,却没有觉得我可以坐下来真正为自己编写一个程序。当我尝试在 Codeplex 或 Sourceforge 上查看项目的源代码树时,我似乎永远不知道从哪里开始阅读代码——依赖关系似乎是四面八方的。

我觉得好像我没有像“在街上”那样学习编程,所以我想我会采取不同的方法来询问新手应该如何学习如何编码。如果您必须重新学习编程,您不会做哪些事情?你花时间做什么,你现在知道浪费了你数周或数月?

4

22 回答 22

49

我看到初学者浪费数周或数月的时间是在键盘上打字。计算机的响应速度非常快,并且会在编辑-编译-运行周期中愉快地消耗您数小时的时间。如果您正在学习,您将节省很多时间

  • 在您使用计算机之前,您可以在纸上计划好您的设计。无论您选择哪种设计方法,或者您从未听说过一种设计方法,都没有关系。只需在您的大脑全神贯注且不受计算机干扰的情况下写下一个计划。

  • 当代码无法编译或无法产生正确答案时,如果您无法在五分钟内修复它,请远离计算机。去想想发生了什么。 打印出您的代码并在上面乱涂乱画,直到您相信它是正确的。

这些只是帮助实现在编写代码之前要考虑的简单但困难的旧建议的工具。

我在学习的时候,从计算中心到我家步行 15 分钟,解决了无数问题。可悲的是,对于现代 PC,我们没有 15 分钟 :-) 如果你无论如何都能学会接受它,你将成为一个更好的程序员,更快。

于 2008-12-29T02:35:23.167 回答
23

我当然不会从查看“真正的”软件项目开始。就像你说的,很难知道从哪里开始。这在很大程度上是因为大型项目更多的是关于它们的大规模设计,而不是关于单个算法或程序流程。一方面,您可能正在查看具有多线程等的复杂 GUI 应用程序。实际上没有任何地方可以“开始”查看代码。

学习编程的最好方法是有一个你想要(需要)解决的问题,然后去解决它。但最重要的是,编写代码。当你阅读编程书籍时,做所有的练习。确保你做对了。没有什么可以替代编写代码。不能代替拧紧然后修复它。

于 2008-12-29T02:38:28.827 回答
19

Stack Over F.. wait no, heh.

The biggest time-sinks for me are generally in respect to "finding the best answer." I often find that I will run into a problem that I know how to solve but feel that there is a better solution and go on the hunt for it. It is only hours/days later that I come to my senses and realize that I have 7 instances of Firefox, each containing at least 5 tabs sprawled out across 46" of monitor space that I realize that I've been caught in the black hole that is the pursuit of endless knowledge.

My advice to you, and myself for that matter, is to become comfortable with notion of refractoring. Essentially what this means (incase you are are not familiar with the term) is you come up with a solution for a problem and go with it, even if there is quite likely a better way of doing it. Once you have finished the problem, or even the program, you can then revisit your methodology, study it, and figure out where you can make changes to improve it.

This concept has always been hard for me to follow. In college I preferred to to write a paper once, print, and turn it in. Writing code can be thought of very similarly to writing a paper. Simply putting the pen to the pad and pushing out whats on your mind may work - but when you look back over it with a fresh pair of eyes you will, without question, see something you will wish you had done differently.

于 2008-12-29T03:51:01.253 回答
13

我刚刚注意到您谈到阅读其他人项目的源代码树。 阅读别人的代码是个好主意,但你必须更有选择性地阅读。很多开源代码很难阅读,也不是你应该模仿的东西。因此,请避免阅读您尊敬的程序员未推荐的任何代码

提示:Jon Bentley、Brian Kernighan、Rob Pike 和 PJ Plauger,他们都是我尊敬的程序员,发表了很多值得一读的代码。在书中。

于 2008-12-29T02:38:58.013 回答
8

学习如何编程的唯一方法是编写更多代码。阅读书籍很棒,但编写/修复代码是最好的学习方式。不做就学不到任何东西。

于 2008-12-29T02:30:28.700 回答
3

您可能还想看看这本书,如何设计程序,以获得更多关于设计的观点而不是语法细节。

于 2008-12-29T02:37:20.480 回答
3

我所做的唯一浪费了数周或数月的事情就是担心我的设计是否是实施特定解决方案的最佳方式。我现在知道这被称为“过早的优化”,我们都在某种程度上受到了它的影响。学习编程的正确方法是解决一个问题,衡量你的解决方案以确保它表现得足够好,然后继续研究下一个问题。一段时间后你会遇到一堆你已经解决的问题,但更重要的是,你会了解一门编程语言。

于 2008-12-29T02:41:18.820 回答
3

这里有很好的建议,在其他帖子中。以下是我的想法:

1) 学习打字,原因在Steve Yegge的这篇文章中解释过。这将比你想象的更有帮助。

2)阅读代码通常被认为是一项艰巨的任务。因此,最好是获得一个开源项目,编译它,然后开始更改它并以这种方式学习,而不是阅读和尝试理解。

于 2008-12-29T04:10:16.033 回答
3

我能理解你的情况。通读书籍,即使很多也不会让你成为程序员。您需要做的是开始编程。

在我看来,实际上编程很像游泳,即使你只知道一点语法和更少的编码技术,无论如何都要开始编码。制作一个小型应用程序、一个家庭清单、一个费用目录、一个日期表、一个 CD 编目器,任何你喜欢的东西。

我们的想法是深入了解它的本质。一旦你开始编程,你就会遇到现实世界的问题,你解决问题的能力会随着你与这些问题的斗争而发展。这就是你每天如何成为更好的程序员的方式。

所以进入它的深处,然后直接游过去......这就是你成功的方式。

祝你好运

于 2008-12-29T04:45:50.860 回答
3

我认为这个问题对于不同的人会有截然不同的答案。

对于我自己,我曾经尝试过 C++(我大约 10 岁,并且已经编程了一段时间),使用的是单击和拖动 UI 构建器。我认为这是一个错误,我应该直接使用 C 和指针等。因为我就是这样的人。

在你的情况下,听起来你想被某人引导到正确的道路上,并且对自己跳进去做某事感到有点胆怯。(你已经读了几本书,现在你在问什么不该做。)

我会告诉你我是怎么学到的:通过做很多有趣的、相对较短的项目,难度稳步增长。我从 QBasic 开始(我认为它仍然是一个很棒的学习工具),在那里我开发了我的大部分编程技能。从那时起,它们当然得到了扩展和改进,但在那些日子里,我已经能够进行良好的设计。

您可以从事的项目类型取决于您的兴趣;如果您有数学倾向,您可能想尝试使用素数生成器或将 3D 点投影到屏幕上;如果您对游戏设计感兴趣,那么您可以尝试克隆 pong(简单)或扫雷(更难);或者,如果您更喜欢黑客,您可能想要制作一个简单的聊天程序或文件加密软件。

自己做这些项目,不要担心你是否以“正确”的方式做事。只要你让它发挥作用,你就学到了很多东西。在你完成一个项目一段时间后,你可能想重新审视它并尝试把它做得更好,或者只是看看其他人是如何做到这一点的。

考虑到你似乎想要被引导的方式,也许你应该给自己找一个导师。

于 2008-12-29T04:46:45.913 回答
2

不要学习如何使用指针以及如何手动管理内存。你提到了C,我花了很多时间试图修复由混合 *x 和 &x 引起的错误。这是邪恶的...

找到一些要解决的问题,写下或画出解决问题的算法的草图,然后试着写出来。要么使用Python(这对初学者更友好),要么只使用C和静态分配的内存。并使用书籍/教程。他们提供了多种带有解决方案的练习,因此您可以将自己的练习与他们进行比较并查看其他方法。

一旦您觉得您实际上可以编写一些简单的东西,请查看一些面向对象设计的书籍/教程。这不是世界上最好的,但它可能会变得很直观。如果不是,请检查函数式编程(如 LISP、Scheme 或 Haskell 语言)或逻辑编程(如 Prolog)。也许那些会更适合你。

还有——找个伴侣。一个你可以谈论编码、代码维护和设计的人。这样的人,比一本书还值钱。

致所有 C 爱好者: C 语言真的很棒。它允许将内存使用优化到 Python 或 Ruby 等高级语言中不可能实现的程度。编译的代码也非常快,是 RTOS 或现代 3D 游戏引擎的唯一选择。但这对初学者来说不是一个好的切入点,这就是我所相信的。

哦,祝你好运!不要羞于问!如果你不问,答案就更难找到了。

于 2008-12-29T02:55:49.460 回答
2

假设您有不错的数学技能,请尝试http://projecteuler.net/它提出了一系列需要解决的越来越难的问题,这些问题应该可以通过编写短程序来解决。这应该让您有解决特定问题的经验,而不会迷失在开源项目的细节中。

于 2008-12-29T04:32:48.627 回答
1

I think you should stop thinking you've wasted time so far-- instead I think you're education is just incomplete, and you've taken a step you're not really ready for. It sounds like the books you've read are useful, you're learning the intricacies of the language. It sounds like you're just not accustomed to the tools you'd use then to package that code together so it runs. Some books cover that focus on topics like language syntax, design patterns, algorithms and data structures will never mention the tools you need to actual apply that information. These books are great but if its all you've touched I think it would explain your situation.

What development environment are you using? If you're developing for windows you really should be proficient with creating projects, adding code, running and debugging in Visual Studio. You can download Visual Studio Express for free from Microsoft.

I recommend looking for tutorial like books that actually step you through the UI of development environment you are using. Look for actual screenshots with dropdown menus. Look at what the tutorials walk you through, and if its something you don't know how to do consider buying that book. Preferably it will have code you can copy'n'paste in, not code you write yourself.

I personally don't like these books as I can anticipate how to do new things in VS based on how I'd do other things. But if you're training is incomplete from a tools-usage perspective this could move you in the right direction.

It is probably harder to find these types of tutorial books for Python or C development. There is an overabundance of them for .Net development though.

于 2008-12-29T03:03:23.143 回答
1

在基本的语言语法之后,您需要学习设计。这很难。 这本书可能会有所帮助。

于 2008-12-29T02:30:38.280 回答
1

作为一个只做了 6 个月的程序员的人,我可能不是帮助你前进的最佳人选,但由于不久前我几乎一无所知,所以我的脑海里很新鲜。

当我开始我目前的工作时,编程不会成为我工作描述的一部分,但是当有机会做一些编程的时候,我不能放弃它。

我花了大约 1 个月的时间在About.com 的 Delphi 部分做教程。尽管人们对 about.com 不屑一顾,但Zarko Gajic 的教程易于理解且易于遵循。一旦我掌握了语言和 IDE 的基本知识,我就直接进入了一个项目,该项目为一个名为“Adept”的程序导出会计数据。花了我一段时间,但我到了那里......

对我来说最大的帮助是进行个人项目。我为一个名为Soldat的蹩脚 2D 游戏用 Java 开发了一个 IRC 机器人。通过规划和编写自己的项目,我学到了很多东西。

现在我对 Delphi Pascal、SQL、C# 和 Java 非常熟悉。我认为,一旦你掌握了一种 OOP 语言的窍门,你就可以学习另一种语言的语法,而且它会更容易掌握。

于 2008-12-29T03:55:27.407 回答
1

也许从一个小的现有项目开始,并在其中找到一些东西来处理它所做的一些核心部分 - 然后使用调试器,逐步完成它并从你要求它为你做那件事的那一刻开始跟随它正在做的事情.

这可以通过多种方式帮助您。当代码尝试完成其请求时,您开始更好地掌握代码所涉及的所有各种事物。此外,您还学习了许多开发人员似乎缺乏的宝贵调试技术 - 虽然您通常可以通过重复 printf() (或等效)调用最终发现问题所在,但如果您可以调试,则可以解决一个数量级的问题快点。

我发现从概念上讲,抽象地理解编程的一个很好的心理模型是数据流模式。当用户操作数据时,它是如何被程序改变以进行消化和存储的?它是如何转变为以对他们有意义的形式重新呈现给用户的?从根本上说,代码是关于数据的转换,所有代码都可以分解为各种大小的结构,其目的是以一种或另一种方式改变数据,围绕程序员对数据的期望之间的不匹配形成错误,多高编码人员使用的库处理数据,以及数据实际到达的方式。使用调试器跟踪代码可以帮助您通过观察发生的变化来充分理解这种转换。

于 2008-12-29T06:52:53.523 回答
0

您应该阅读 Mike clark 的文章:我是如何学习 Ruby的。本质上,他使用 Ruby 的测试框架来测试语言的不同元素。

我使用这种技术来学习 python,它非常非常有帮助。我不仅学习了语言,而且在练习结束时我非常精通 Python 的测试框架。一旦你掌握了基础知识,你就可以开始阅读代码,然后着手构建一些更大的项目。

于 2008-12-29T13:40:52.217 回答
0

标准答案是做某事;选择一种简单的语言来做这件事很好,但不是必需的。更多的是在你自己的脑海中解决问题,修复它,因为它不起作用,这真的教会了你。对我来说,当我尝试我从未完成但总是从中学习的永恒梦想项目(游戏)时,总是会发生这种情况。

于 2008-12-29T02:27:13.107 回答
0

我认为我会避免的事情是在孤立的片段中学习一门语言,这些片段并没有真正联系在一起,而只是教授特定语言的各个方面。正如其他人所说,真正困难和重要的是学习设计。我认为最好的方法是通过一个教程来引导你创建一个实际的应用程序,并在此过程中教授设计。通过这种方式,您可以了解做出某些决定的原因,并了解如何完成实现设计选择所需的内容。

例如,我发现使用 Rails 进行敏捷 Web 开发是学习 Ruby on Rails 的一种非常简单的方法,比简单地阅读 Ruby 手册或什至在零散的网络教程中摸索要好得多。

于 2008-12-29T02:28:55.367 回答
0

我要避免的另一件事是孤立地开发代码,也就是说,在我进行过程中不要让人们看到它。从导师那里获得反馈将帮助您在做出选择和正确使用语言习语方面保持正确的轨道。

于 2008-12-29T02:48:25.310 回答
0

找到你生活中的一个问题,或者你觉得做的事情可能更有效率,然后写一个小解决方案。它可能只是一个脚本,但当您开始看到有用的工作成果时,您会对自己的能力更有信心。当您对使用该解决方案感兴趣时,您也会更有动力完成它。从简单的小项目开始,然后逐渐转向更大的项目。

当您从事一个小项目时,请专注于以质量构建一切。我认为有些程序员会忽略这一点,他们认为如果他们的软件包含大量功能,但通常这些功能做得不好或不可用,他们的软件会更令人印象深刻。如果您专注于为实际问题构建高质量的解决方案,您将成为一名出色的程序员。

祝你好运!

于 2008-12-29T02:53:54.253 回答
0

处理您已经知道如何部分解决的项目/问题

于 2008-12-29T03:01:18.437 回答