我已经阅读了很多有关各种编程语言,Java,Python,C等的书籍。我了解并了解语言的所有基础知识,并且了解算法和数据结构。 (相当于说两年的计算机科学课)

但是,我仍然不知道如何编写一个可以做任何有用的程序。

所有编程书籍向您展示如何编写语言,但不向您展示如何使用它!编程示例都是非常基础的,例如为图书馆或简单的游戏建立卡片目录或使用算法等。它们没有向您展示如何开发实际上可以做任何有用的复杂程序!

我已经看过SourceForge上的开源程序,但是它们对我来说没有多大意义。每个程序中有数百个文件,数千行代码。但是我该如何学习呢?我在亚马逊上可以买到的任何书都不会给我提供编写任何这些程序的工具。

从阅读Java或Python编程入门或C编程语言等知识到如何发展..实际上可以说,我对X程序有想法吗?这就是我要开发的方式吗?

似乎编写一个程序所涉及的工作比从书本上或课堂上学到的更多。我感觉好像有些东西。

我怎么能走上正确的路?

评论

有些人并不打算编程。只有您可以回答是否有其他方法可以解决您的问题,或者是否该尝试其他方法。您不太可能在这里得到有用的答案。

您认为什么“有用”?

@Michael-我(其中一个)被选为Off-Topic,现在转到P.SE。我认为那将是一个将编程作为职业和手工艺进行讨论的更合适的地方。

@duffymo:有些人并不想对问题发表评论。

我认为您的进步太长了。从本书示例到成熟的Sourceforge项目,这是巨大而艰巨的。相反,请尝试扩展已经构建的内容。添加功能,添加GUI,添加网络功能;很快,我想您将在Sourceforge上拥有自己的项目。

#1 楼

构建更复杂的程序需要经验。当我第一次编程时,我以为如果长度超过25行(并且必须使用滚动条)就很好了(现在我不得不使用滚动条)。现在,我多年来在同一项目应用程序上每天写数百行。

您可能会发现此页面很有趣,“十年内自学编程” http://norvig.com/21-days.html

顺便说一句:启动程序非常困难。作家可能将其称为“作家障碍”。相反,我建议您开始编写代码并加以改进。不要害怕删除无法满足您需求的大型部分。重新开始,这一次您将对自己的工作有一个更好的了解。重新开始,您会发现您不需要上次编写的内容的一半。当一个作者写一个故事时,需要花费很长时间,需要大量的写作和重写等。大量的评论和反馈,只有在必须出版(发行)时才完成。

评论


+1对于Bill所说的以及讨论“作家的障碍”。

–David Weiser
2010-12-29 21:51

gawd,我已经这样做了几年(10 + -2),但我仍然偶尔编写一堆代码,最后将其删除。我做了几天的“重构”,但由于我是个迟钝者(不言而喻),因此不知所措(通过源代码控制)。

–肯·亨德森
2010-12-30在1:41

+1类似于写一个故事。我的程序仍处于“从前……”阶段。

–安迪
2010-12-30 10:46

关于编程的最可怕的事情之一是空文档。一旦克服了这一障碍,您就会取得良好的进步。

–加布林
2010-12-30 20:53

作家的街区。你钉在那里!

– abel
2011年5月23日在18:09

#2 楼

大型项目也总是让我不知所措,例如在SourceForge或GitHub上找到的项目。我想知道任何人,甚至一个团队,怎么能理解成千上万行代码在10或100个文件中发生的事情。

没人能做到。至少在一开始。

项目是有机的。最初是一个非常简单的想法,但可以迅速扩展成庞大的工作。我认为,这是进行迭代开发的主要原因,而不是经典的瀑布方法。

考虑制造汽车。从外部看,它看起来很简单,但您只需细心研究一下,就会发现需要处理大量的考虑因素,权衡取舍和无辜案件。

示例:

对于半大型项目,通常从小规模开始。 “我想构建一个缓存服务器”。因此,您花了几天的时间进行黑客攻击,并得出了一些行之有效的方法,但可以大大改善。因此,您添加了线程化的概念。

然后,由于该线程化,您会遇到并发问题。因此,您可以通过更改为并发数据结构来进行修复。

现在,该过程已经变慢了。因此,您将并发数据结构更改为常规数据结构,但提供了用于同步的锁定机制。

一切似乎都运行良好,只是用户开始抱怨操作不是原子的并且数据已损坏。

因此,您添加了一些经典的原子操作,例如增量和保存。这有效,并且您的用户很高兴。但是有人打开票证询问是否可以执行列表操作。

,所以您花了一两个星期来构建该功能。大约在这个时候,一位朋友决定为您提供帮助。您可以一起完成,完成并释放它。

会打开两张票。列表处理中有一个错误,并且有一些罕见的情况会导致死锁。

在您解决死锁的同时,您的朋友正在处理列表处理错误。您意识到需要对原子操作进行相当重要的重写。

...如此,就可以了。

这似乎是项目成长的典型代表。在几周内,大约有10个文件增长到了20个。添加了原计划未包含的新功能。添加了复杂的错误修复程序,使代码异常大。

我的建议:

不要被淹没。如果您有想法,请实施一些功能。如果之后值得追求的话,请逐点添加。让您的项目自然发展。

评论


是的,这几乎就像是来自个人经验...

– Nick Aldwin
2010-12-30在4:01

@Nick,我们对项目“ X”的功能“ Y”和“ Z”是否也有类似的体验?去年我有两个类似的项目。他们都不是Redis = P

–乔什·斯梅顿(Josh Smeaton)
2010-12-30 9:55

这几乎描述了我编写的每个程序。

– Tim Post
2010-12-30在16:37

这样吧。 Kurt Vonnegut遇到了计算机编程问题

–动物园
2010-12-30 17:06

很好的例子,但是如果它开始时可以缩小一点,那就更好了。例如,从构建一些数据结构开始,然后是为这些数据结构提供API的一些代码,然后是使用此API实现缓存功能的一些代码,最后是在此之上的GUI。瞧,您已经编写了一个缓存服务器!

–加布林
2010-12-30在20:51

#3 楼

即使是最大的程序也要从一个想法开始,一次写一行。

学习如何编写实际程序的最好的(也许是唯一的)方法是开始做。遇到问题时,您可以在网上搜索或在此处寻求解决方案。最终,您将获得经验,而不必经常问。

但是,从一开始您就应该意识到一些事情:


如今,几乎没有任何大型应用程序是完全从头开始编写的。如果使用现有的高质量库和框架,则可以在更短的时间内完成更多工作。开始使用这些程序通常比自己做起来令人沮丧,需要做更多的工作,但这几乎从来不是真的。
一旦程序变大,仔细考虑如何构造程序(如何设计程序)就非常重要。花一些时间,并阅读一些有关设计(特别推荐“清洁代码”)和软件工程以及技术基础的书籍。


评论


“学习如何编写实际程序的最好(也许是唯一)方法就是开始做。”我差不多要说什么。您只能阅读和“理解基础知识”太多了……橡胶必须在某个地方上路。

–WernerCD
2010-12-30在16:27

为“开始做”行+1。您无法从书中学习经验。

–riwalk
2010-12-30 18:29

+1代表提及“清洁代码”这本书。您应该始终使代码可读。易于阅读==易于理解==易于修改

–伊戈尔·波波夫(Igor Popov)
2011年1月7日在16:56

#4 楼

您所谈论的是软件工程,而不是编程。它有点架构,有点“最佳实践”和“设计模式”,有点与他人合作。尽管有很多书可以提供帮助,但其中大部分都是来自经验。没有人开始编写Microsoft Word。

考虑要编写的大型“真实”程序。现在考虑一下您需要构建的各种组件,以使其以所需的方式工作。例如,在现代的第一人称游戏中,您将需要3D图形引擎,非玩家角色AI,音乐/声音模块,物理引擎以及执行游戏规则的顶级模块(了解(地图),各种字符之间的互动方式等)。然后是艺术品,角色设计和音乐,它们都不是代码,但对于完整游戏来说是必不可少的。

现在:您将自己构建其中哪些,而您将构建哪些?去别的地方?大多数大型软件项目不是从头开始编写的。也许您将使用现成的3D引擎和音乐/声音模块,并仅对使您的游戏与众不同的内容进行编程。好的,因此您必须弄清楚将要使用哪些第三方模块,这将涉及诸如成本,它们使用的语言,它们具有的功能,API的设计方式(即,它的完整性)等因素。是,它与您的个人编程风格的适合程度等)。也许您将为各种第三方模块编写一两个候选程序来编写“概念证明”或测试程序,以确保它们能够满足您的所有需求并且易于使用。

同样,即使您想要编写自己的代码,对于您自己来说也无法完成您想要的时间范围内的工作。您还需要多少其他程序员从事该项目?您将如何分工?如何设计各个模块,以便即使它们是由不同的人编写的,它们也可以组合在一起?你们将如何在不破坏彼此更改的情况下使用相同的源代码(答案:版本控制,当您独自工作时非常有用,而在与他人一起工作时则必不可少)。

已经弄清楚了要在内部编写哪些模块,然后执行相同的过程。弄清楚每个模块的各个部分,如何将它们组合在一起,以及自己编写的内容以及在其他地方获得的内容。继续分解,直到每个小到足以让您牢记在心,让您说:“是的,我可以写下来!”然后这样做。在执行操作时,程序的各个部分如何组合在一起将遇到无法预见的障碍。这些将令人沮丧,但是它们是让您有机会了解有关手艺的更多机会,因此应该以这种方式加以审视。例如,每个功能都在您的脑海中,因此在开始编码之前,您必须将事情分解很多。随着经验的积累,您将考虑功能而不是考虑功能并开始考虑对象。然后,您将在对象中进行思考,并在考虑更大的模块。最后,您将在模块中进行思考,并在考虑整个,大型,真实的程序。

然后您会发现您仍然有很多东西要学习...但是确实如此。如果作为程序员,您曾经停止学习,那么您已经过时了,将被更新的模型取代。

无论如何,不​​要害怕,也不要担心这听起来...可怕或不可能,而您毕竟并不想真正成为一名程序员。不是每个人都适合。我喜欢音乐和甜点,可以稍微弹奏键并煮一些菜,但是我不愿意花时间去成为一名出色的音乐家或大厨。

事实证明,您不想成为编写大型,实际桌面应用程序的程序员,还有其他类型的编程工作。例如,您可以成为嵌入式程序员。编写嵌入式程序会涉及很多有趣的挑战,您正在做有用的工作,但通常这些程序要比桌面应用程序小。或者您可以编写Web应用程序。在网络上,将少量功能粘合在一起很容易,因此您可以编写(例如)网络注释系统,即使它不是整个Web应用程序,它也很有用。也很容易逐步改进Web上的内容,因此您可以从(例如)基本的Web邮件客户端开始,然后随着时间的推移,将其演变为类似Gmail的客户端。 (但不要那样做,因为那样您就会与Gmail竞争。)

如果您根本不想成为一名程序员,但仍然想使用计算机,那么您可能可以进入IT或其他技术领域。在这些情况下,了解与您已有的编程一样非常有用,因为您的同辈甚至可能没有那么多。或者,您知道的话,请成为一名音乐家,因为(像大多数领域一样)它涉及当今的计算机。编写一些小程序,以各种巧妙的方式处理音频或MIDI文件,从而使您成为更好的音乐家。您会发现,无论您拥有什么编程技能,都可以在许多领域中应用,以使您的工作变得更好。

评论


我不同意嵌入式程序通常比桌面应用程序小。过去可能是这样,但是我开发了一些嵌入式产品,这些产品花费了100多个人年的开发时间,而且这些产品并不是特别大。

–巴特·范·恩根·舍瑙(Bart van Ingen Schenau)
2010-12-30 15:39

我猜这将取决于您所说的“嵌入式”。如果您指的是智能手机或集成汽车系统之类的东西,我可以相信您的100个工作年。但是,在该空间中仍有许多较小的系统需要处理。

– Kindall
2010-12-30 17:02

+1是从思考较小的事物开始,然后转向思考相同的事物和较大的事物。

–加布林
2010-12-30 20:56



与GMail竞争有什么害处?如果您单手编写的内容实际上可以与Google发布的内容竞争,那么您可以认为自己是一个非常该死的优秀程序员。

–加布林
2010-12-30 21:00



主要原因是我认为GMail解决了Web邮件。大多数程序员在处理已经被其他人解决(并且很好解决)的问题时并不觉得很有趣。您可能会发现一个尚未解决的问题,并且会有更多的乐趣-并有可能将其推向市场,而不必与800磅的大猩猩竞争。

– Kindall
2010-12-30 21:04



#5 楼

除非您要面对真正的任务,否则您不会弄清楚如何编程。任何理论都无法取代简单的现实世界任务。在开始研究黑白场景之前,我天真地阅读了很多书籍,包括所有示例,但是当我遇到一个真正的问题时,我只是无法收集所有的理论知识来完成任务。如果您是入门者,建议您从任何地方获取任务。除非您解决了它们,否则不要认为它们没有用。第一步,尝试解决数据结构问题,例如对链表进行排序,在树,图上执行DFS,BFS等。这不仅会提高您的编码技能,更重要的是,它将提高您的分析和算法技能,相信我是宝贵的知识。然后,当您知道可以使用指针,递归,引用等进行操作时,请尝试实现简单的线性方程求解器或类似的方法。

底线。这都是关于练习的。只需继续挖掘和编写代码,代码,代码。

#6 楼

与其他所有人一样,从计算机游戏开始。好的游戏既是编程挑战,也是设计挑战,需要仔细考虑内部结构,并且使用可以教很多东西的方式使用系统库,但不要轻易打破常规,也不需要“有好结果的好理由”就像实际的“有用”软件一样。

一般规则是,在编写足够的东西之后,不可避免地会发生某种启发。

一个不错的起点(如果您觉得像C)是http://gamedev.net/,尤其是http://nehe.gamedev.net/。也有许多其他好的出发点:D

评论


(哦,我才意识到为什么每个人都从游戏开始。闪亮而漂亮的东西正在激励人。)

–Mirek Kratochvil
2010-12-29 22:21

大家?大胆主张。

–克利福德
2010-12-29 22:24

我不是从游戏开始的。我会发现,除了复数= P

–乔什·斯梅顿(Josh Smeaton)
2010-12-29 22:26

如今,大多数人都从Web应用程序入手,进入门槛要低得多(仅仅是文字)。

– slebetman
2010-12-29 23:33

您的第一条评论可能比您的答案要好-闪亮而漂亮的东西令人振奋。那才是最重要的。

– Scorchio
2010-12-30在0:05



#7 楼

您正在查看整个大型程序,这似乎是不可能的。但是整个过程都是由一些愚蠢的程序组成的,例如您所说的“不要做任何有用的事情。”

您需要的是将巨大的复杂任务分解为微小的简单任务的经验。那是所有编程的根源。剩下的只是语义。

#8 楼

就像开车或做饭一样,编程是您边做边学的东西。实践是不可替代的。

如果教科书示例对您而言已经太基础了,那就太好了!该花些时间做些更复杂的事情了-您已经可以自己找出一些具有挑战性的练习。

,或者,如果您有特定的想法,可以将其分解为零。首先解决一小部分问题。然后展开。当将新代码集成到现有代码中变得困难时,则需要重新设计所有内容。

#9 楼

编写一个200行的脚本。然后开始对其进行改进。

特征主义将立即使您拥有100个源文件和数百个KLOC :)

#10 楼


“他们没有向您展示如何开发实际上可以做任何有用的复杂程序!”


如果没有“有用”的定义,我们实际上无能为力,无法使您走上“正确”的轨道。

我们不知道如何你失败了,或者出了什么问题。我们无法说出您所走的路。

以某种方式,您脑子里有个想法是您没有交流。

软件-编程-就是要让您的想法浮现在某种语言(Python,Java,英语等)中。

编程(和询问问题)的一个重要步骤是定义术语。 “做什么有用的东西”是什么意思?要非常清楚,非常完整和非常精确。

评论


投票赞成,我对OP对此主题的回答非常感兴趣。

– Scorchio
2010-12-29 23:53

#11 楼

我一直被问到这个问题,例如如何开始。真的很简单。这是逐步的。


提出一个想法。听起来好像已经有了。
将您的想法简化为基本核心-您认为可以解决的问题
将UI放在一张纸或餐巾纸上,无论如何。
尝试并在您的开发环境中布局UI。
如果遇到困难,谷歌,谷歌,谷歌,请问有关stackoverflow的问题,请利用互联网资源中的废话获得帮助。要求是程序员的朋友和同事在特定情况下为您提供帮助。返回第4步。
开始编写应用程序的逻辑。如果遇到困难,请转到上一步,然后重试。
很快,您很快就会有工作了。


评论


为工作流程+1-应该可以正常工作。我不能说第二步很重要。也许这是决定您是否可以执行任务的步骤。

– Scorchio
2010-12-30在0:03

“听起来像你已经有了。”我会对此表示怀疑。如果有一个主意,那将是问题的一部分。

– S.Lott
2010-12-30在3:34

实际上,恕我直言,您应该首先编写应用程序的逻辑,然后将UI添加到其中。更简单。

–CaffGeek
2010-12-30 14:44

如果您能想到工具/应用程序,那会更好。扔掉项目可能会激励人们。无论是什么,从小处开始,然后从那里开始。我建议使用命令行工具。

–卡洛斯福克
2010-12-30在16:38

@乍得,我不同意你的看法。对于菜鸟来说,逻辑是抽象的,但UI易于掌握。相反的是经验。

–AngryHacker
2010-12-30 17:02

#12 楼

创建一些小东西。别介意,您的程序将是这样做的第1000个。

一些想法:


时钟(首先是数字,然后是模拟外观),
自动阴唇创建器,
目录结构显示,
mp3专辑列表器,
等。

选择平台,工具是任务的一部分。

评论


实际上,我原则上同意你的看法。 OP正在询问有用的软件。 mp3专辑列表器将是一个不错的选择。一个基本的mp3播放器会更好,因为他会经历一个项目所面临的困难。包括LOC。

–乔什·斯梅顿(Josh Smeaton)
2010-12-30 9:58

@Josh,对于初学者来说,mp3解码非常重要。

–user1249
2011年3月12日上午10:19

@Thor,绝对是不平凡的。但这很有用,并且可以非常迅速地教程序如何变得如此之大。所有细微差别,错误修复,极端情况。在这种特定情况下可能不合适,但总体上可能合适。自己能够使用自己编写的软件非常棒。

–乔什·斯梅顿(Josh Smeaton)
2011年3月12日在11:40

@Josh,我仍然认为MP3解码器不是小东西,也不适合用于此目的。

–user1249
2011-3-12在11:44

#13 楼

好吧,让我们从对程序X的想法开始,它可以做一些有用的事情,并分解为以下内容:


使用纸张,思维导图或图表软件来布局逻辑流程。 )。
由于您刚开始,请选择其中一项(最好是在开头附近),然后进一步分解。
首先为该代码编写代码,然后将其用于构建

程序X是否需要打开文件,对其进行操作并创建输出文件?第一步,看看是否可以打开并回显文件。您想要一个漂亮的用户界面吗?构建一个可以运行文件回显程序等的代码。您不仅将逐步构建可在复杂程序中使用的代码,而且还将构建语言知识,因为您必须搜索和查找信息。

俗话说-侏儒不是一天建成的:-)

#14 楼

(上面的评论中已经回答了。建议您在重新打开问题后将其作为答案提交。)

从问题开始-您要解决的问题-无论多么复杂你以为是。然后,您将这个问题记录下来,并开始将其分解为较小的问题。然后,您可以分解那些较小的问题,等等。直到您有了一些已经知道如何解决或可以通过某些努力解决的原始方法。您开始对每个部分进行编码,并将它们组织成不同的功能或不同的类,等等。

然后处理下一个子问题。在处理每个问题时,您可以编写一些小的测试用例,并实际上看到您取得了进展。一路上总会有挑战,但绝不会认为它太过巨大甚至无法解决(现在似乎正在处理)。对于编程和生活中的许多挑战都是如此。他们的关键是将其分解。

关于做什么-这个想法。您可以尝试发明一些新事物,但也可以采取一些您可能已经怀有热情并已经存在的事物,但是只是使其变得更好甚至与众不同。我目前正在业余时间为Android编写吉他调音器应用。我知道已经存在许多其他吉他调音器应用程序,但是我认为这将是一个有趣且具有挑战性的项目,因此我继续进行下去。最初,这似乎几乎是不可能的,但是在我将问题分解为更小的步骤之后,实际上可以很好地融合在一起。分而治之,坚持目标。

#15 楼

当您是初学者时,最难的事情之一就是设定现实的目标,以达到在当前水平上应该包含的“我该如何改善”的运动。

因此,我建议您选择练习解决小规模的给定练习,因为根据给定规格完成程序的能力对于每个以谋生为目的的编程者来说都是一件非常有价值的事情。

我建议您仔细看看http: //projecteuler.net/,其中包含大量练习和自动化的“检查答案”系统,可让您按照自己的节奏进行工作。练习用词讲得好,但可能需要您思考。有些甚至可能要求您多想,但即使解决不了这些,也会教给您一些有用的知识。

问题1的完整措辞是:


如果我们列出所有低于10的自然数
,它们是3或5的倍数,
我们得到3、5、6和9。这些
倍数的总和是23。 />
找到1000以下的3
或5的所有倍数之和。


您认为可以解决这个问题吗?那就做吧!

#16 楼

您需要真实世界的经验!没有书可以教你!

你必须学习如何阅读别人的代码,如何维护它,如何讨厌他们(代码和编码者)如何改进它,如何思考。您可以做得更好,几个月后大声喊叫,我将杀死曾经编写这段代码的人!!!只是要在源代码版本控制中找到的就是您自己!

所以我建议您找一些编程工作。如果需要,请申请最基本的入门级别。可能您将不会获得应有的报酬,而是花几个月的时间来学习如何在现实世界中开发软件(而且它并不总是那么完美,并且拥有我们在网络上阅读的所有优美的最佳实践) ,很多时候,代码质量很低,取决于您在哪里工作,但这只是经验的一部分)

继续阅读书籍,您会发现,每年您都了解一点点更多(或不同)同一主题,因为您可以通过经验了解到它。

如果您设法与有才华的开发人员一起工作,那就更好了。向他们学习,不要害怕犯错误。

直到必须修复您的第一个实时生产紧急错误,您才知道什么是软件错误!

:)

#17 楼

尝试一个开源项目,看看您是否可以适应。从下载源代码开始,看看您是否可以买到一些门票

评论


新手程序员不应该尝试加入开源项目。您只会遇到麻烦。开源项目并不适合初学者。

–格伦·梅纳德(Glenn Maynard)
2010-12-29 21:37

直接参与其中的一种替代方法是派生一个项目的源代码,并尝试在自己的分支上修复票证,而只需将其留在那儿即可。阅读由多人编写和审查的代码的价值,组织良好的项目结构并可以用作您自己的创作的模板,并了解协作过程的工作原理。只需观察公共部分,然后私下处理代码即可。

–水母树
2010-12-29 23:21

@jellyfishtree,如果您无法编程,那可能会有点野心。

–user1249
2010-12-30 0:00

@Thorbjorn肯定是,但是我希望当我第一次开始时会做更多的事情。像其他任何事情一样,我认为您仅通过渗透和潜水就可以学到很多东西。至少,您可以更好地衡量您不知道/不了解的内容-当您刚开始并渴望知道在哪里设定目标以及如何努力时,这些东西会更有价值。

–水母树
2010-12-30 7:29

@jellyfish,当然,我敢肯定,这是一个很好的步骤,但是在这种情况下还不是。

–user1249
2010-12-30在7:36

#18 楼

当我想学习一种新语言时,通常会尝试实现一些分形图。这样一来,您将立即获得反馈,以了解它是否有效并且非常有意义。有很多方法可以改善分形。 mandelbrot的幼稚实现很慢。

并没有什么用,但是您学到了很多东西,看起来很漂亮。

评论


我喜欢这种方式-一种学习新语言的富有诗意的方式。但是我不知道我们是否应该为初学者推荐这个:D

– Scorchio
2010-12-30 0:00

#19 楼

编程是关于解决问题和沟通,而不是编写大量代码。
代码只是必需的,您通常应该尝试编写更少的代码,而不是编写更多的代码。

如果您不知道从哪里开始,也许您没有任何问题!

看看Linux和其他类似Unix的系统:它们都由许多只做一件事但做得很好的小型应用程序组成。

当我需要一个脚本来在计算机上的文件夹中找到10个最大的文件时,我不是在读书。我只是用Google搜索并使用了现有的解决方案之一。
我是否编写了任何代码? -不。
问题解决了吗? -是的。
单行程序有用吗? -是的。

包含数千行代码的程序通常由多个程序员编写。您将无法单独编写整个操作系统,也不需要这样做。他们还经常使用作弊功能,例如版本控制和单元测试。

评论


请不要将版本控制和单元测试称为“秘籍”。备份工作并进行处理是必要的。版本控制只是有助于保持理智。单元测试也是如此:每个编写一行代码的人都知道必须进行一些测试,为什么不将其组织起来呢?

– Scorchio
2010-12-30 10:26

@Scorchio我的意思是,使用版本控制和单元测试可以使您比不使用它们的人有更多的优势。特别是在处理大型项目时。

– kolobos
2010-12-30 11:22

#20 楼

分而治之。

就这么简单或困难。

#21 楼

当我开始编程时,我喜欢计算机游戏。因此,只要有手头的工具,我便开始编写自己的游戏。

很自然地,我的第一个游戏是文字冒险。同样,您可以从测验或其他内容开始,或者从某种猜谜游戏开始。

此外,您也可以从诸如老虎机的内容开始(您实际上不需要动画,甚至不需要图片。只需使用A =苹果,L =柠檬,S =开始,P =李子等)。

这将教您一些处理用户输入,维护游戏状态并相应地生成输出的基本知识。

我走这条路很远。我逐步学习了如何读出键盘状态或鼠标,以及如何使用图形代码。我了解了有关语言本身的更多信息(我从PASCAL开始),并以此来增强我现有的游戏或只是开始了一些新的东西。即使经验不足,您也可以创建一些小东西,这些小东西会让您感到自豪。因为您创造了东西,所以很有趣。构建实际的应用程序是没有意义的,因为创建一件实际上有用的东西需要花费大量的工作,而创建一个小型游戏却令人上瘾,这非常简单。

您可能会我想实际使用一种教育语言(就我而言,这是PASCAL,回想起来,我认为这是一个不错的选择)。其中很多都是专门用于创建游戏等的。

创建应用程序不仅仅是创建算法。您必须设计功能,需要在不同的层和模块中组织和构造代码。与您在大学里遇到的“原子”问题不同,有时最好以增量方式开发应用程序。您从某事物开始,然后在其之上添加事物。因此,已经有了一些起点(就像您在Wikipedia文章中列出的某些语言中一样),您就省了很多挫败感,并立即开始创建一些东西。 (我的一个同事通过编写地震2 mods开始编程)。在某个时候,您会发现这些易于使用的工具的局限性,但是在此之前,您将获得更多的见识和理解。要重新实现他们给您的功能,可能就足够了。

#22 楼

在大学里,有一门叫做编程实践的课程,基本上教授了这种方法。早期,您获得了用于基本购物应用程序的UI,并且必须编写后端代码,最后一个月是从零开始的Tetris。我认为大约有50%的新生(不参加课程)失败了,因为从小到大的过渡非常困难。

我建议以下一项或多项措施:


下载一个开源项目,然后添加一些内容。它不一定有用或很好,但是您必须查看结构,这会让您有一个大型项目的感觉。
只需在纸上设计最终项目,并带有箭头即可依赖性。如果您要制作蛇,则可能会有蛇头,蛇尾,食物,空的空间,墙壁,木板,当前方向等。如果您的项目比您想象的要大得多,可能会帮助您意识到。
一个基本的项目,并使其越来越大。您可能会进行大量的重构,并希望您将学习如何制作可以轻松添加到较小项目的方法。
如果您知道有经验的人,请告诉他们您对项目的想法,并让他们编写您的课程+一些重要的方法,大概需要一个小时左右。这样,您就可以填写方法,并始终知道下一步需要做什么。

最后,无论您做什么,都应该使用基本的MVC(模型,视图,控制器)设计模式。无需赘述,将视图(UI)分为1+类,将控制器(Input,Output等)分为1+类,并将模型(Logic,Data,基本上是其他所有东西)分为几个类。这是获得基本组织的一种简便方法。

请记住,这一步很难。确实有些人根本无法编程,但是您可能只是停留在这个阶段。祝你好运!

#23 楼

首先,您已经通过上课,阅读参考资料,查看开源项目以及对问题保持好奇心来完成前提条件。我之所以强调这一点,是因为在此人亲自完成腿部工作之前,我本人也曾遇到过类似的问题(特别是,一些人绕过课堂并希望捷径)。现在,我回想起我们有图灵机实验室的时候,以及当时我觉得那不是真正的编程。这些是您将保留的经验,使任何捷径都可以跳过。


注册学生项目。我与(CSUA)一起由一群志趣相投的学生组成,为我大四那年的狂欢节摊位制作了游戏
。如果您继续喜欢它,并且
想扩大自己的参与范围,请真正利用
资源。了解项目,
与同学,您的
教授交谈,并获得
实习机会。
与经验丰富的程序员坐在一起。在我的历史中,当我观看另一个真正鼓舞人心的节目时,大约有三遍。对于他们来说,他们只是在编写代码并大声思考。毫不夸张地说,我觉得自己对自己的聆听比对自己多年的精力吸收了更多。如果遇到更多,您就会变得更加富有。幸运的是,这个时代我们可以观看视频,检查完整的资源库并即时搜索庞大的在线知识商店。它不能替代亲自体验,但是在没有导师的情况下,它是对传统材料的巨大改进。但是,仅由他人查看原始代码可能不会导致任何结果。您将需要牢记一些东西,并且要有一个好的调试器来踏入逻辑。我最喜欢的时刻之一是制作Quake mod,并不是mod本身具有任何令人难忘的东西。它看到了卡马克的游戏逻辑。 mod只是我潜水的原因。练习解释和回答实验室合作伙伴提出的问题。自愿帮助教书。也许组成一个研究小组,要求每个成员成为班上话题的专家。然后烤那个人,让他们烤你。当您被迫回答问题时,您必须自己学习答案。当您可以向他人清楚地解释概念时,您就可以将自己的理解扩展到书本和思想之外。
最后,不要害怕学习艰辛的方法,弄脏双手,犯错。这也可以称为体验。关于您的代码库笨拙且文件数量大的项目的问题,作为一个更实际的示例,请执行以下练习:将单个文件用于您的工作。真的我不是在开玩笑。实际上,我现在和以前的公司都遇到过同样的问题。在这里,另一位开发人员观察到,我更喜欢为每个类保留一个文件。对于他来说,这似乎很陌生,并且在相关问题上,他也不喜欢部分课程。因此,让您了解何时何地将逻辑拆分为单独的文件的一种方法就是从一个文件开始。在可能希望增加复杂性的多个项目上实践一个文件规则之后,您可能会遇到一个项目,在该项目中,一个文件中有很多类,以致于您难以阅读或由于版本控制而变得难以协作。此时,您要创建单独的文件以对不同的类进行分组。根据您的喜好,您可以尽早决定喜欢一个文件中的所有数据类。然后也许再过一遍,您可能甚至在数据类之间将自己决定喜欢单独的文件。


评论


+1好答案。一定要说,与新手一起工作时,与经验丰富的程序员坐在一起可能会令人生畏。加速将花费您大量时间的工作。但是,取决于您的人的类型,类似的事情可能会成为激励因素,并点燃您腹部的某些火苗。推你想踢屁股。

–永恒
2011年1月6日在16:09

#24 楼

您无需为开始编写某些程序就拥有一个好主意。
我将从简单的部分开始。就像您已经使用过的程序一样。尝试制作一些您已经知道它如何工作的东西。面对问题,因此您会更快地学习它。
一旦您有了更多的经验,您就会开始对程序有一些好的想法,从而使编程时的生活变得更轻松,或者只是一个好的程序来完成您的工作从来没有想过。
我从事Java编程已有近一年了,而使用其他语言已有两年了。花时间开始做我真正想做的事。我刚刚开始做自己的事情。多亏了StackOverflow。我以前不知道。

#25 楼

因此,如果我重复已经讲的很多内容,那么会有很多答案可以原谅我,但这是我的2美分。

首先选择一个主意。任何想法都会好起来,简单的事情可能会好于大。项目的范围倾向于快速增长(有人称其为蠕变)。

接下来为项目创建框架。这将需要一些架构和设计知识,并且您可能会在尝试前十次时就弄错了-我做到了。只需布置一个像样的文件结构,也许是一个小的代码框架,即可显示系统的重要部分。

将框架保存在VCS中(用这个来拾取毒药,并在导致危险时继续操作)参加一场圣战)。一旦开始使用VCS,不断地对其进行小的更改就成为了第二天性,但请务必先启动。

现在为系统选择一个小而重要的功能并加以使用。不必担心确保所有内容都被完美封装,并确保它具有“最佳”设计(随系统而发展)。只要得到一些有用的东西即可。如果定期运行测试,还可以获得一些单元测试,将有助于确保您知道发生故障时发生了什么。

构建系统。这也是获得自动化构建系统和持续集成的好时机。如果您不知道他们是什么,那么要么学习并尝试,要么继续自己承担风险;无论哪种方式都可以继续工作。

现在选择另一个功能,然后重复并重复并重复。朋友不必知道如何编程,甚至不必知道程序做什么。向他人展示时您会感觉很好,而向他人展示它会帮助您准确地了解系统的功能。

如果您对自己所做的事情充满信心,请在线发布并尝试获取反馈。存储库中心或程序员子目录可能会为您提供一些建设性的批评。尝试找到CS / SE教授,并请他/她看一下。也许问一个专业的程序员。只是让另一位程序员发表意见。

完成(或可能之前),您将意识到最初编写的代码比最近编写的代码差很多。这是完全自然的,并且发生在我们所有人身上。现在,您需要找到一个新项目并学习新知识-也许是新的测试策略或如何使用面向服务的体系结构。

#26 楼

可能会帮助您解决一个日常问题,您可以用程序将铅笔和纸做的事情替换为一个程序。

这为您提供了一个相对简单的问题,众所周知仅需要自动化水平的解决方案。请记住,这不必是下一个MS Word /写字板/笔记本。只是可以解决您(简单)问题的方法。例如,当我使用一种新语言时,我不断重新实现的一个问题就是一个简单的计时应用程序。该应用程序用于跟踪一天中不同项目的计费时间。一个相当简单的程序,有很多小陷阱,例如您如何处理一天中的重启或如何从列表中添加/删除项目。

#27 楼

我认为部分问题是,当您阅读编程书籍时,它们只是在教您该语言。他们没有提到要编写几乎所有内容,您需要访问编程LIBRARIES和SDKS等。仅了解语言是不够的。

#28 楼

我想您的问题来自: 1。理论与实践之间的冲突,还有...
2。 ...您必须意识到您的代码将由他人的代码运行。
3。如果不知道自己能做什么,就无法编写代码。
4。您知道一半的困难。


通过理论了解一种语言并不意味着您会“说”它:这是读英语和说英语的区别。同样,大量可用于编译,链接和编辑源代码的工具也会使您大吃一惊。
学习编程时,大多数情况下是使用终端输入/输出文本的时间,因为这是处理编程的最简单方法。实际上,程序员使用库(例如Qt),框架(我猜是django)和其他快捷方式代码来提高工作效率。当然,如果您觉得自己可以编写自己的轮子,请不要重新发明它,也不要阅读有关编译器设计和内核设计的书:在这些书中有很多东西可以学到:也许您认为开发不需要很多东西的应用程序是愚蠢的技术。
发明点东西!当然,您可以进行文本编辑器,游戏等。事实是,如果您看不到任何理由,就不会这样做:如果您考虑的所有内容都已经制作好了,那么这些程序将对您毫无用处。我仍然梦想有一个个性化的角色,能够将聊天,脱机消息等一种类似于Facebook的分散式p2p协议编码为一体,以便可以与无线嵌入式设备一起使用。互联网提供了很多可能性,请不要忘记思考。
实际上,该理论是实践所必需的,但这还不是全部:算法和技术不是编程理论的一部分,其中有一个很多范式和其他“标准”方式来编写代码:设计模式,链表等。


#29 楼

也许您可以选择一种脚本语言来启动。我开始使用C语言进行编程。我认为C语言很容易上手,但是需要更多时间来了解算法和有关操作系统的知识。而且每次我仅使用DOS GUI进行锻炼时,都会感到沮丧。

后来我选择了一种名为ActionScript的脚本语言来启动。脚本语言是一种面向对象的语言,它可以控制Flash电影的行为。脚本语言很容易完成一些接近问题域的工作,就像ActionScript中的trace("HelloWorld")输出字符串一样。它具有强大的IDE,可让您检查程序是否运行良好。

总之,如果您想以一种快速的方式开始编程,那么脚本语言可能是一个不错的选择: -)

#30 楼

编写规范。您想让程序做什么?屏幕(如果是基于UI的程序)的逻辑,输入/输出等。将范围限制为在合理的时间内(一周还是一个月?)可以执行的操作。

然后构建它。坚持规范,使其能够按照规范的要求工作。当然,您会分心,确保您必须做一些研究,因为您之前从未遇到过特定的问题,但是您会构建自己想要构建的东西。这与构建您可以“构建”的东西不同。

完成后,重构代码,尝试使其更高效。然后,如果您认为您的程序仍未完成,请重新开始,改进规格,改进代码,并继续这样做。

请记住,大多数商业软件都可以解决需求。.定义非常重要需求,以及在实际解决问题之前满足需求的解决方案。随着需求的增长,您的软件也将随着时间的流逝而增长!