如何教一个没有编程经验的聪明人,如何编程?[关闭]


100

我被要求雇用我们的IT部门的一名人员,他没有编程经验,但是是一个聪明而又干练的人,可以说是一个支持现有.Net应用程序的入门级开发人员来帮助他进行编程。我绝对相信这个人可以做到,但是我正在寻找最快的方法来使他快速。我有很多想法,但想看看别人的想法。我知道这也将高度依赖于他的学习方式,但我通常是在谈论。

那么问题来了:您认为让非开发人员快速加快开发速度的最佳方法是什么(在本例中为.Net)?



我听说“ 学习Python困难之路”对于非程序员入门非常有用。
john2x 2011年

看看Small Basic。它很简单,但对初学者很有用。

3
我认为,向没有任何思想模型的人解释编程是没有用的。弄清楚您要说的是哪种语言,并让他们点击教程并动手,然后进行解释。他们将奋斗,您将迅速加入并加快学习过程。
松饼人

1
我想请他阅读Edgser Dijkstra的|“关于真正教授计算科学的残酷|”,让他了解该文章的原因,以便他可以警惕被普遍接受的做法可能对他造成的脑部损害编程教学方式
vfclists

Answers:


125

对于那些想学习编程的人,我通常会规定相同的顺序。这是非常理论上的,但奠定了良好的基础。全日制学习需要三到四个月的时间,但是编程并不是一夜之间就能学到的东西。

如果您无法按此顺序进行操作,那么您将无法编程,因此您最好现在就放弃。

  1. 代码,由Charles Petzold撰​​写。
  2. C语言编程,K&R
  3. 计算机程序的结构和解释,Abelson和Sussman。

我的规则是:如果有必要,用极大的力量逐步浏览这三本书。提出任何问题,但只有在自己设法解决问题之后。如果您能通过这三本书来取得成功,那么恭喜您,您是一名程序员,现在我可以在15分钟之内给您PERL,或者在Java大书架的书店里扔给您任何垃圾,您将可以很好地进行管理。如果您不能通过那三本书来完成它,就放弃,回家吧,您永远都不会得到它。

老实说,我认为您不需要学习C和Scheme。它们只是未来学习的基础。这两本书相当简单,表面上都很简单(C和Scheme是超简单的语言),但是它们对编程的真正艺术非常深入,并且不会浪费时间使语法混乱,因此,它们非常适合重新连接你的大脑成为一个好的程序员。

尝试捷径直接进入想要立即学习的确切知识的尝试(例如从C#和ASP.NET开始)注定了失败。


25
由于有些人不得不对那些因其C#能力而受到强烈推荐的“程序员”大打出招,但是却无法做一些简单的事情,例如实现一个很好记录的基类,在c和c ++程序中发现内存泄漏,我同意,或者只是自己解决问题或以中等速度学习新想法。这不是精英主义;这是常识。如果您不能掌握指针和递归,那么对于任何需要开发人员自己解决问题的开发人员来说,这将永远是无用的。
乔纳森·亨森

53
不,这不是成为一名优秀程序员的唯一途径。但是,如果三本书是“令人生畏的清单”,那么您可能会低估程序员所做的事情。
乔尔斯波斯基

32
乔尔,有时您会失去联系。
罗伯特·S。

46
抱歉,报纸要花几天时间才能到达我的私人俱乐部,因为在看到它们之前,需要先用代客熨烫它们。
乔尔斯波斯基

19
不幸的是,这个答案使up to speed quickly部分失败。
rlb.usa 2011年

30

让非开发人员快速入门的最佳方法就是激励他们

为了获得成功,候选人必须至少对编程感到好奇,即使不是很热情(无论平台如何)。

尽管我在理想候选人的情况下同意乔尔的观点,但我还是要注意不要将太多的理论塞进虚弱的头脑中-只会使他们失望。如果他们受到启发,好奇并充满激情,他们将在看完魔术之后想了解理论。

我完全同意@karudzo-自我成就感和建设性的评论可能会非常鼓舞人心。


29
“如果你想建造一艘船,不要鼓动人们去收集木头,不要给他们分配任务和工作,而要教他们渴望无尽的海洋。” -圣艾修伯里·安托万
朱利安·查

朱利安-太好了!究竟!
jkoreska 2011年

我完全同意您的观点!我曾经辅导过许多没有经验的开发人员,有时甚至不知道他们最终会成为程序员。我只是通过引导他们前进的方式做到了这一点...他们的好奇心和热情将他们带到了最终结果。如果他们没有这两个属性中的任何一个,我认为他们不可能实现他们所取得的成就。我与太多缺少一个或两个属性的程序员合作,只是因为有很多工作要做,真是太糟糕了!
2013年

我同意。我觉得学习编程的问题是从字面上回答的。人们学习事物是有原因的。人们学会编程来解决问题,帮助人们并将想法变成现实。我遇到了在此过程中忘记了这一点的人,当他们重新发现它时,他们重新发现了对编程的热爱。当您真正享受某些东西时,您将学习,您将找到学习的方法,并且您会变得更好。
路易斯·佩雷斯

12

我正在寻找最快的方法来使他加速。

最快的方法可能是给他花些时间,尽管那很容易是一两年。

当然,教给他一种简单的语言似乎很容易(如果他要编写.NET,则可以使用C#语言),但是学习一种语言并不是在学习编程。

如果他从未编程过,那么,除了至少一种语言的语法和库之外,他还必须学习数组,链接列表,所学语言的编译模型,模块化,资源管理,范式,模式,Big- O标记-整个墨西哥卷饼。这是很多事情,我们大多数人只花了几年时间就学习了这些基础知识,甚至还花了很多时间才成为一名真正的专业程序员。

有材料在那里,涵盖了很多这方面的(如Stroustrup的最新著作,教编程用C ++,而不是教语言C ++),但不是非常多的,并没有涵盖所有的。因此,这个家伙必须乐于学习,并阅读许多书籍和文章。

关于如何执行此操作:我手头没有完整的课程表可粘贴到此处。(对不起。)
但是,我建议从教给他一种编程语言开始,这样他就有机会取得一些快速的初步进步并获得令人鼓舞的结果。有很多书籍可以教这些语言,挑选一本您熟悉的语言。如果书中有很多练习,并且他愿意这样做,则准备花很多时间帮助他。如果这本书没有任何内容,那么就应该开始思考自己的书,但是要准备好使它们适应他的理解水平/速度。
如果该第一语言不是C或C ++,那么IMO他应该接下来学习其中的一种。K&R对此非常有帮助,Stroustrup的TCPL也是如此,或者,如果他能(在您的帮助下)应对陡峭的学习曲线,那么Koenig / Moo就是如此。我之所以建议这样做的原因是,一旦您知道C或(最好是IMO)C ++,就可以相对容易地选择任何C派生类,例如C#,Java,ObjC ...

其余的,给他提供源源不断的好书和文章。我认为如果我们建议的建议太多,并不会很有帮助,因为1)必须适合您公司的文化,以及2)您必须告诉他学习这些东西,您必须放心。


1
“支持现有.Net应用程序的入门级开发人员”……“他将必须学习数组,链接列表,所学语言的编译模型,模块化,资源管理,范例,模式,位O表示法”都是“拥有的东西”,但是我敢打赌,编写代码的开发人员中有很大一部分没有这些技能。
柯克·布罗德赫斯特

1
@KirkBroadhurst:如果是这样,那么您的公司出了点问题。
2011年

@sbi我想您会发现很多公司都出了问题。OP的公司建议将非程序员(但他是个“聪明的家伙”!)转移到提供应用程序支持的角色中。我不知道在哪里工作...但是根据我的经验,这就是“现实世界”。真正优秀的,能干的程序员是个例外-像在大多数行业中一样,大多数人都做得足够好。
Kirk Broadhurst

1
@KirkBroadhurst:我的工作是我的决定。我因能力不强而逃离了公司,如果没有开发人员至少不了解这些事情,我就会逃离。
2011年

7

我不会在.NET上启动它们。我犯了太多次这个错误。不要因为时间而让雇主向您施加压力,要求他们创建一个无能的程序员。.NET可能是一个快速的开发平台,但它并不强迫开发人员学习编程。仅在C#中,您会发现开发人员陷入了引用类型,对象生存期的困扰,他们将留下大量的内存泄漏(是的,在.NET中是可能的),并且设计不佳。最好在C或C ++上启动它们(可能是c ++,因为它们将需要使用OOP概念),然后说类似这样的东西:“现在,如果为您管理内存,那不是很好,每件事都是对象导向,而您不必处理所有这些讨厌的指针?” 这是C#和JAVA。如果他们精通c ++,他们将在一个星期或两周内征服这两个领域。我推荐乔尔的团。那是我的CS 101老师给我的清单,因此,当我进行数值分析时,我的表现要好得多。这也将使您能够更早地发现候选人是否会切芥菜。同样,一旦您掌握了c和c ++,在阅读了本书的介绍之后,您将自动了解c#和java。您不仅会理解它们,而且比不了解c和c ++的人更了解它们。


4
““如果现在为您管理内存,每件事都是面向对象的,而您不必处理所有这些讨厌的指针,那会不是很好?”您的意思是这是STL。 。为什么从一开始就不教我使用C ++中的STL ?!
Raynos 2011年

好吧,STL很不错。就Windows编程而言,我是指Windows API。Windows API在设计时并未考虑OOP。我发现用c ++中的API编写一些应用程序要花些功夫,这是一个很好的练习。然后,我让他/她编写一个Window类并封装事件循环,依此类推……您知道了,使其面向对象。然后在他们终于可以使用后,我向他们展示Windows窗体。它确实迫使他们处理一些基本概念(即Windows应用程序的工作方式),如果有人跳入.NET,他们将永远无法获得。
乔纳森·亨森

4
为什么有人会用棍子触摸Windows API。我的意思是说hWND80年代以来的权利?显然,您改用了一些不错的抽象(哪个抽象是完全不同的争论)。当然知道它是如何工作的很好,但是您不需要C#.NET进行抽象
Raynos

2
Windows API很棒。无论如何,我只将它用作教学工具。例如,人们通常不了解在Windows程序中如何神奇地触发事件。对于他们来说,必须熟悉事件循环是有帮助的。另外,程序员至少需要熟悉hWND,尤其是当他们要处理任何会迷惑图形的api时-就像您在Unix上不知道如何使用XID的情况下很难做一样。无论如何,它迫使他们学习Windows程序的工作方式。而且,一旦完成,他们就会知道Windows.Forms是如何工作的。
乔纳森·亨森

通常,它不一定是向C#btw的过渡,而只是向.NET的过渡。我认为@Joel上有一篇很好的文章,涉及泄漏抽象定律,这对于为什么程序员在使用框架之前经常在幕后看通常是一件好事。
乔纳森·亨森

6

给他们一些简单但有用的解决方法。让他们摸索一下,并帮助他们完善它。没有什么比能帮助激发他们的小成就(尽管对编程不感兴趣的人)


6

配对编程。在您编写自己的代码-任何代码时,让他们给您留下阴影。在几个小时之内,然后让他们为您输入代码,同时告诉他们该怎么做,即使有必要,也可以逐个击键。回答他们的几个问题,但不要那么多,以免使您的速度减慢很多-只需让他们将其全部浸泡即可。他们还会发现您的错别字和比您想象的更多的错误。在几天之内,他们将能够开始“导航”,告诉您为类似于以前所见任务的任务输入什么代码。

我在一个月内就以这种方式学到了很多关于开发人员的知识,并且以这种方式教会了其他几位新开发人员,其中一位能够在几个月后成为我在一家初创公司的首席开发人员。当我们第一次开始一起工作时,他从来没有写过一行代码。


1
我认为结对编程是教新手程序员的一种非常不错的方法,但是我认为一直以来结对编程都是有问题的。我认为新手程序员需要一些时间单独工作,以学习如何解决问题并建立对自己能力的信心。
Helephant 2011年

是的,让他们进行结对编程,并给出简单的任务-真正的任务,在他们要使用的软件上,以他们要使用的语言,取得真正的成就。审查并指导他们的所有工作,他们将会进步。
Thomas W

2

给他一个好的想法(视觉工作室,快递还是不错的)。教给他60%的常用语法(省掉yield,linq,enums,attribute等),教授类,虚拟和重写。花时间在调试器上(尤其是调用栈)。然后,只要他需要帮助,就告诉他去Google“ msdn functionanme”,这应该可以使他迅速上手。

还要教他永远不要捕捉并吞下异常。告诉他他必须重新抛出或记录它!

奖励:教他如何序列化json数据,以便他可以轻松地读取/写入文件。db是一个矫kill过正的东西,要学习的东西太多了,尽管我可能让每种线型文件通过一个条目来保存/加载字符串数组,但您不想让他编写自定义文件格式。


1

我知道很多人都在谈论语言和这些语言的书籍。我不一样

编程是关于学习分析思维。首先,这个人应该能够在一张纸上思考并提出算法来解决问题所在。您必须指导他们,以便他们获得正确的思维技巧。

接下来是语言的基础知识。让他们开始使用所选的语言。给程序一个问题。

第一次切完之后,让他们做CS基础知识和设计模式。

现在,让他们使用这些新概念对以前的问题进行重新编程。


1

从基础知识入手:变量,循环,while循环,循环,数组,教他基础知识,在屏幕上打印,做一些简单的数学运算。进入方法和基本的OOP,诸如以下如何创建类之类的东西,向他展示为什么而不只是如何。

语言无关紧要,但是选择您知道的东西,这些东西是高度抽象的(java,python等...),这样他就不必担心诸如内存管理,指针等之类的东西了。递归,hanio塔或递归搜索目录。

学习编程是有关Ruby编程的很好的免费资源。使其有趣,轻松且有趣。


1

给他一些挑战,让他学习如何找到资源来自己解决问题。

如果您可以教他如何找到答案并自给自足,那么他自然会学习如何编程。批判性思维和机智是程序员的两个关键技能。

归根结底,激情/兴趣绝对将成为他们快速学习成功的关键因素。如果他没有或没有发现“错误”,那可能是一个缓慢和/或痛苦的过程。如果他确实发现了该错误,那么他将花费大量的时间从事非工作时间的后期编码工作。

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.