我仍然不知道如何编程?


122

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

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

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

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

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

似乎编写程序所涉及的内容比书或课堂上所学的更多。我感觉好像有些东西。

我怎样才能走上正确的道路?


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

3
您认为什么“有用”?

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

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

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

Answers:


93

建立更复杂的程序需要经验。刚开始编程时,我想如果它超过25行(并且必须使用滚动条)就很好了(现在我必须使用滚动条)。现在,我多年来在同一项目应用程序上每天写数百行。

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

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


13
+1对于Bill所说的和讨论“作家的障碍”。
David Weiser 2010年

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

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

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

1
作家的街区。你钉在那里!
阿贝尔

70

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

没人做到。至少在最初。

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

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

例:

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

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

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

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

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

因此,您花了一两个星期来构建该功能。大约在这个时候,一位朋友决定为您提供帮助。您可以共同努力,完成并发布它。

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

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

...等等。

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

我的建议:

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


是的,这几乎就像是来自个人经验……
NickAldwin 2010年

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

这几乎描述了我编写的每个程序。
蒂姆·波斯特

这样吧。库尔特·冯内古特(Kurt Vonnegut)遇见计算机编程
Zoot 2010年

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

28

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

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

但是,从一开始就应该注意一些事项:

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

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

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

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

15

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

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

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

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

一旦确定了要在内部编写的模块,就可以执行相同的过程。弄清楚每个模块的各个部分,如何将它们组合在一起,以及自己编写的内容以及在其他地方获得的内容。继续分解,直到每一个小到足以让您牢记在心,让您说:“是的,我可以写下来!” 然后这样做。当您这样做时,您将在程序的各个部分如何组合在一起时遇到无法预见的障碍。这些将令人沮丧,但它们是您了解更多有关手工艺品的机会,因此应以这种方式加以考虑。

最初,您只能在程序中保留很小的程序段(例如单个函数),因此在开始编码之前,您必须将事情分解很多。当你获得的经验,你会觉得功能,而不需要考虑有关的功能,并开始思考有关的对象。然后你会想对象和思维大模块。最后,你会想模块和思考关于全,大,真正的程序。

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

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

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

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


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

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

+1对于想开始小东西,然后移动到想同样的东西,关于大的事情。
gablin 2010年

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

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

9

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

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


7

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

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

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


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

10
大家吗 大胆主张。

4
我不是从游戏开始的。我发现除复杂= P之外
Josh Smeaton 2010年

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

4
您的第一条评论可能比您的回答要好- 闪亮而漂亮的东西正在激励您。那才是最重要的。
Scorchio 2010年

6

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

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


6

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

如果教科书示例对您而言已经太基础了,那就太好了!是时候移动一些更复杂的东西了-您已经可以自己找出一些具有挑战性的练习。

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


5

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

耳炎会让您立刻拥有100个源文件和数百个KLOC :)


5

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

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

我们不知道您是怎么失败的,或者出了什么问题。我们无法告诉您您在哪个轨道上。

不知何故,您脑子里有个想法是您没有交流。

软件-编程-就是将一个概念带入某种语言(Python,Java,英语等)中。

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


投票赞成,我对OP在该主题上的回答非常感兴趣。
Scorchio 2010年

5

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

  1. 想出一个主意。听起来您已经拥有了。
  2. 将您的想法简化为基本核心-您认为可能可以解决的问题
  3. 可以将UI放在一张纸或餐巾纸上。
  4. 尝试在您的开发环境中布置UI。
  5. 如果您在Google,Google,Google上遇到困难,请对stackoverflow提出问题,请利用互联网资源中的垃圾来获取帮助。要求是程序员的朋友和同事在特定情况下为您提供帮助。返回步骤4。
  6. 开始编写应用程序的逻辑。如果遇到困难,请转到上一步,然后重试。
  7. 很快,您很快就会工作。

为工作流程+1-应该可以正常工作。我无法说出第二步的重要性。也许这是决定您是否可以执行任务的步骤。
Scorchio 2010年

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

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

如果您能想到工具/应用程序,那会更好。扔掉项目可能会使人沮丧。不管是什么,从小处开始,然后从那里开始。我建议使用命令行工具。
Carlosfocker 2010年

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

4

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

一些想法:

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

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


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

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

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

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

3

好吧,让我们从对程序X的想法开始,做一些有用的事情,然后将其分解:

  • 使用纸质,思维导图或图表软件来布局程序的逻辑流程。

  • 由于您刚开始,请选择其中一项(最好是在开头附近),然后进一步分解。

  • 首先为此编写代码,并使用它来构建

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

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


3

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

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

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

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


3

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

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

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

问题1的完整措辞是:

如果我们列出所有低于10的自然数,它们是3或5的倍数,则得到3、5、6和9。这些倍数的总和为23。

找出1000以下3或5的所有倍数的总和。

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


3

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

您必须学习如何阅读他人的代码,如何维护它,如何讨厌他们(代码和编码人员),如何进行改进,如何认为自己可以做得更好,几个月后大声喊叫。会杀死写过这段代码的人!!!只是在源代码版本控制中找到的是您!

您必须了解书籍是非常具体的,对于那些已经知道如何开发软件的人来说,有些时候是必须的。

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

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

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

在必须修复您的第一个实时生产紧急错误之前,您将不知道什么是软件错误!

:)


2

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


15
新手程序员不应尝试加入开源项目。你简单的方式获得。开源项目并不适合初学者。

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

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

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

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

2

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

它不是很有用,但是您会学到很多,而且看起来很漂亮。


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

2

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

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

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

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

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


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

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


2

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

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

另外,您可以从某种东西开始,例如老虎机(您实际上不需要动画,甚至不需要图片。只需使用A =苹果,L =柠檬,S =开始,P =李子等)。

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

我走这条路很远。我逐步学习了如何读出键盘状态或鼠标,以及如何使用图形代码。我了解了有关语言本身的更多信息(我从PASCAL开始),并以此来增强我现有的游戏或刚刚开始一些新的东西。

我认为游戏真的非常适合学习编程。即使经验不足,您也可以创建一些小东西,这些小东西会让您感到自豪。因为您创造了东西,所以很有趣。构建实际的应用程序是没有意义的,因为创建一件实际上有用的东西需要花费大量的工作,而创建一个小型的游戏却令人上瘾,这非常简单。

您可能想要实际使用教育语言(在我的情况下,这是PASCAL,回顾起来,我认为这是一个不错的选择)。它们中的许多都是专门用于创建游戏等的。

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


2

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

我建议以下一项或多项:

  • 下载一个开源项目,并添加一些内容。它不一定有用或很好,但是您必须查看结构,这将使您对构建大型项目有一种感觉。

  • 只需在纸上设计最终项目,并使用箭头表示依赖关系即可。如果您要制作蛇,则可能会有蛇头,蛇尾,食物,空的空间,墙壁,木板,当前方向等。如果您的项目比您想象的要大得多,它可能会帮助您意识到。

  • 进行一个基础项目,使其越来越大。您可能会进行很多重构,希望您将学习如何制作可以轻松添加的较小项目。

  • 如果您知道有人经验丰富,请告诉他们您对项目的想法,然后让他们编写您的类和一些重要的方法,大概需要一个小时左右。这样,您就可以填写方法,并且始终知道下一步需要做什么。

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

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


2

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

  • 注册学生项目。我参加了(CSUA)一群志趣相投的学生,为我大四的狂欢节摊位制作了一款游戏。如果您继续喜欢它,并认为您想扩大自己的参与范围,那么请真正利用资源。了解项目,与同学,教授交谈,并获得实习机会。

  • 与经验丰富的程序员坐在一起。在我的历史中,当我观看另一个真正鼓舞人心的节目时,大约有三遍。对于他们来说,他们只是在编写代码并大声思考。毫不夸张地说,我觉得自己从听音乐中吸取的精力比我独自一人要多年。如果遇到更多,您就会变得更加富有。我们很幸运,身处一个时代,我们可以观看视频,检查完整的资源库并即时搜索庞大的在线知识商店。它不能替代亲自体验,但是在没有导师的情况下,它是对传统材料的巨大改进。但是,仅由他人查看原始代码可能不会导致任何结果。您将需要牢记一些东西,并且要有一个好的调试器来踏入逻辑。我最喜欢的时刻之一是制作Quake mod,而Mod本身并没有什么值得纪念的东西。它看到了卡马克的游戏逻辑。mod只是我潜入的原因。

  • 练习解释和回答实验室合作伙伴提出的问题。自愿帮助教书。也许组成一个研究小组,要求每个成员成为班上话题的专家。然后烤那个人,让他们烤你。当您被迫回答问题时,您必须自己学习答案。当您可以向他人清楚地解释概念时,您已经丰富了自己的理解,可以将其传达到书本和思想之外。

  • 最后,不要害怕学习困难的方法,弄脏双手,犯错。这也可以称为体验。关于您的代码库笨拙且文件数量大的项目的问题,作为一个更实际的示例,请执行以下练习:将单个文件用于您的工作。真的我不是在开玩笑。实际上,我现在和以前的公司都遇到过同样的问题。在这里,另一位开发人员发现我更喜欢为每个类保留一个文件。对于他来说,这似乎很陌生,并且在相关问题上,他也不喜欢部分课程。因此,让您了解何时何地将逻辑拆分为单独的文件的一种方式就是从一个文件开始。在多个项目上实践了一个文件规则之后,希望这会增加复杂性,您可能会遇到一个项目,在该项目中,一个文件中有太多类,以致于难以阅读或由于版本控制而变得难以协作。此时,您要创建单独的文件以对不同的类进行分组。根据您的喜好,您可以尽早决定喜欢一个文件中的所有数据类。然后,也许再以后,您可能会决定甚至在数据类之间将您喜欢单独的文件作为一个组。


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

1

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


1

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

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

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

将骨架保存在您的VCS中(用这一种来挑选您的毒药,并在引发圣战时坚持下去)。一旦开始使用VCS,不断地对其进行小的更改就成为了第二天性,但请务必启动。

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

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

现在选择另一个功能,重复并重复并重复。

一旦您认为它运作良好,就将它展示给朋友。朋友不必知道如何编程,甚至不必知道程序做什么。向别人展示时您会感觉很好,而向他人展示它会帮助您准确了解系统的工作。

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

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


1

可能有帮助的是,您想到了一个日常的简单问题,您可以用铅笔和纸做的事情可以用程序代替。

这为您提供了一个相对简单的问题,即一个只需要一定程度自动化的已知解决方案。请记住,这不必是下一个MS Word /写字板/笔记本。可以解决您(简单)问题的东西。

例如,使用新语言时我不断重新实现的问题是一个简单的计时应用程序。该应用程序用于跟踪一天中不同项目的计费时间。一个相当简单的程序,有很多小陷阱,例如您如何在一天中的一天处理重启,或者如何从列表中添加/删除项目。


1

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


1

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

  1. 从理论上了解一种语言并不意味着您会“说”该语言:这是阅读英语和说英语之间的区别。同样,大量可用于编译,链接和编辑源代码的不同工具也会使您大吃一惊。

  2. 在学习如何编程时,大多数时间是使用终端输入/输出文本的时间,因为这是处理编程的最简单方法。实际上,程序员使用库(例如Qt),框架(我猜是django)和其他快捷方式代码来提高工作效率。当然,如果您觉得自己可以编写自己的轮子,请不要重新发明它,也不要阅读有关编译器设计和内核设计的书:在这些书中有很多东西可以学到:也许您认为开发不需要很多东西的应用程序是愚蠢的的技术性。

  3. 发明点东西!当然,您可以执行文本编辑器,游戏等操作。问题是,如果您看不到任何理由,就不会这样做:如果您考虑的所有内容都已经制作完成,那么这些程序对您将无用。我仍然梦想有一个个性化的角色,能够将聊天,脱机消息等一种类似于Facebook的分散式p2p协议编码为一体,以便可以与无线嵌入式设备一起使用。互联网提供了很多可能性,请不要忘记考虑它。

  4. 实际上,该理论是实践所必需的,但还不是全部:算法和技术不是编程理论的一部分,有许多范式和其他“标准”方式来编写代码:设计模式,链表,等等等


1

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

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

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


1

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

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

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

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

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.