如何真正掌握编程语言?


103

我知道学习语言,您只需购买一本书,按照示例操作,并尽可能尝试练习。但是,我真正要寻找的是一旦学习了该语言,该如何掌握它。

现在我知道经验是一个主要因素,但是学习语言的内部知识,底层结构是什么等等。

那里有文章说读这本书,读那本书,做这个游戏以及那个游戏。但是对我来说,这并不意味着要精通一门语言。我希望能够阅读别人的代码并理解它,无论这样做有多困难。了解何时使用功能以及何时使用其他功能等。

名单可以继续下去,但我相信我已经指出了。:)

最后,如果需要,可以使用任何语言作为示例,尽管最好以C作为示例。


11
经验就是一切。除非您可以实际应用,否则您所擅长的所有理论都是无用的。
西蒙·怀特海德2012年

2
为此语言实现一个编译器。实际上,这是尝试任何新语言的我最喜欢的方式。如果听起来过于简单和无聊,请尝试使用K框架或类似方法来定义正式的语言语义。
SK-logic

6
“人,土豆是恐龙,汽车世界”。掌握一种语言无关紧要,如果代码不好并且没有意义,那么仍然很难理解。
Renato Dinhani 2012年

2
我感觉好像有点遗漏了。语言不断发展,因此对语言没有掌握,随着语言的发展,使用它的次数越多,您必须学习的越多。
nycynik 2012年

2
编写代码并读取代码。随机抽取一部分Linux内核(C编程),找出函数的作用。
亚历克斯·哈特

Answers:


166

我必须回答:“以上所有。” 人们争辩说编码是一门艺术,一门手艺,一门工程学科还是一门数学分支,我认为最公平的说法是其中的每一种。因此,您掌握的语言技术越多越好。以下是部分列表:

  • 每天都使用这种语言。通常,这意味着要全职使用该语言。

  • 阅读有关该语言的所有知识。特别是“最佳做法”和成语。

  • 加入一个用户小组,与其他人讨论该语言及其用途。

  • 与他人的代码一起工作!没有什么比学会在某人做某件事很糟糕之后必须清理的更快的方法来学习某种语言。

  • 支持您编写的代码-每个错误都将带给您最糟糕的决策!

  • 全面学习计算机科学和语言

  • 学习一种非常不同的语言。对C语言的一个很好的补充是像Lisp这样的函数式语言。这将彻底改变您对过程语言的思考方式。

  • 学习使用适用于该语言的框架和API。

  • 花点时间用这种语言做自己的实验。SICP不适用于C,但是通过测试语言极限来学习语言的态度是一种非常有效的态度。

  • 阅读语言的历史,以了解为什么采用这种语言。

  • 参加会议以听取语言作者的讲话,或听取行业领导者对该语言的看法。

  • 上语言课。

  • 向其他人教语言(感谢Bryan Oakley

总之,尽您所能想到的一切。无法完全了解大多数语言。您使用的每种学习技巧都会为您的理解带来新的视角。


76
+5为支持您编写的代码-每个错误都将带给您最糟糕的决策!
珍妮弗·S

8
仅针对最后一句话+1:Every technique you use to learn brings and additional perspective to your understanding.
Izkata 2012年

1
@Izkata:天哪,我写了吗?我实际上是说英语的人!我已经改正了。谢谢!
GlenPeterson 2012年

2
@GlenPeterson ...实际上,我只是复制粘贴而没有非常注意句子“ off”。+1确实是出于其背后的意图。= P
Izkata 2012年

13
+1表示“学习一种非常不同的语言。对C语言的一个很好的称赞是Lisp之类的功能语言。这将彻底改变您对过程语言的思考。” -这可能是最重要的。它可以帮助您学习如何学习编程(即在什么情况下寻找什么)。
naught101 '09

53

练习需要10,000小时。

阅读“十年自学编程”

上面的要点:

  • 获取感兴趣的节目,并做一些,因为它很有趣。确保它保持足够的乐趣,以便您愿意投入十年/ 10,000小时的时间。
  • 程序。最好的学习方法就是边做边学。
  • 其他程序员交谈;阅读其他程序。

1
那就是我要发布的内容!显然,我在P.SE上的时间还不够。
Martijn Pieters 2012年

@MartijnPieters::-D
vartec

8
一本书的好标题!我迫不及待地想着续集《 20年自学编程》!
GlenPeterson 2012年

16
但是,您必须确保不要重复10小时1000次相同的操作……
Izkata 2012年

没有大量的技术专长可以帮助某人知道要自动化或为其创建程序的内容。这就像在说-去体育馆,做十年的篮球运动,每天做1个小时。of!您是篮球巨星(大师)……不,不仅仅是技术能力。因此,我不认为这是问题的答案,即如何成为大师?这可能是解决方案的一部分,但不是掌握管理权的魔力。我知道-我不是大师!
oemb1905

36

除非您实现了比这更好的语言,否则请不要认为自己是整个语言的精通者。这意味着,要从下面了解特定语言的工作方式,请购买一本书,教您该语言的编译器/解释器概念。例如:

  • C:LCC编译器书

  • C ++:C ++的设计和演化(然后继续构建自己的C ++编译器,或者至少了解使用GNU C ++编译器代码的实现)

  • Java:获取“ Inside JVM”并获取javac源代码。“ java”的.C代码也很有帮助

  • Python:CPython实现。

  • ObjectiveC:Apple提供的有关ObjC运行时环境和编译器源代码内部的几乎所有材料都将为您提供帮助。

  • Lisp:SICP书籍(教您Scheme和有关Lisp的语言的基本解释器-编译器):Lisp in Small Pieces(另一本好书)。


1
现在,这就是我所说的答案。我已经接受了,但是如果它早一点的话,这应该是“最佳答案”
cprogcr 2012年

2
您不知道您的答案有多大帮助。我正在阅读您提到的书,而这正是我所需要的。
cprogcr 2012年

呵呵,我从他们那里学到了东西。很高兴为您提供帮助:-)
Aniket Inge 2012年

既然您以C为例,请允许我再给我两本书的名字作为礼物,我过去常常像手背一样熟练掌握C:1. OOC.PDF(可在线免费获得)和2。 Minix书(尽管是一本OS实现者的书,但这是Linus Torvalds在实现Linux之前阅读的书)
Aniket Inge 2012年

1
是的,Andrew Tenenbaum就是那本书。任何版本都很好阅读。它并没有告诉您“ C”的工作原理,但是当您看到C库是如何实现以与您构建的操作系统一起工作时,您会更好地理解C!也许足以让您对其进行修改。(这就是OOC的
用处

12

尝试将语言用于本来不打算使用的内容。用Python编写设备驱动程序,或用COBOL编写矩阵操作库。我认为掌握一种语言的最好方法之一就是真正推动它,力求使其优势克服劣势。


1
当我上大学时,一旦我用Pong写了Pong,我就会决定要“掌握”一种语言。在我学习MIPS之前,这一直很好。我还有噩梦。
冷冻豌豆罗迪(Roddy of the Frozen Peas)2012年

用C做网站?
2013年

10

我会让你轻松。您永远不会精通一门语言。期。如果您认为自己拥有,那么很显然你没有。您没有突然到达的山顶,说:“好,现在,我已经完全掌握了该语言。现在怎么办?” 即使是使用同一种语言数十年的经验丰富的程序员也会告诉您,有时他们仍然遇到新的想法,过程,做法等。真正的目标是掌握您对一种或多种语言的概念性理解。学习新概念的能力以及您采用该语言的新功能或更改功能的速度比对每个关键字和语法的死记硬背要重要得多。不必再担心“掌握”一种语言,而只需要担心不断改进和完善代码的质量和效率。


2
The true goal is to master your conceptual understanding of a language or languages.究竟。我就是这个意思
cprogcr 2012年

任何编程语言都是有限的。它由有限数量的概念组成,需要有限数量的惯用技巧。因此,很容易掌握任何一种语言。当然,一般人不能精通编程,总是有进一步改进的潜力,但是问题是关于一种给定的语言
SK-logic

SK-logic:编程语言会发生变化,它们的库和环境也会发生变化。结果,您使用语言的方式也会发生变化。例如,jQuery改变了我们使用Javascript的方式。
orlp 2012年

可能是真的,没有人能真正掌握C ++之类的语言,但是对于像Scheme这样的一些极简主义的语言来说,它应该是完全有可能的-正如@ SK-logic所说,实际上,无论是哪种语言,编程都无法被掌握,因为应用领域是无限的。
大约

1
@nightcracker,语言不会“进化”。C99永远是C99,永远不会改变。即使被下一代语言取代,C ++ 11仍将始终保持C ++ 11。是的,环境确实在“进化”,但是jQuery没有引入其他语言社区以前不知道的任何新技术。它们只是狭窄的Javascript社区中的新手。
SK-logic

5

你已经知道答案了

  • 您必须使用该语言。很多。尽可能解决各种各样的问题
  • 您必须阅读(最好是与他人一起工作)其他人的代码,最好是具有一定熟练度(即对语言的至少某些方面有深刻理解)的人。顺便说一句,如果您可以与其他人讨论解决语言问题的方法,那就更好了。

这归功于艰苦的工作和决心,以及一切您可能永远无法实现的目标。

想一想我们从何处获得该术语-要成为大师级工匠,您必须先成为徒弟,然后再成为熟练工,只有他们才有机会成为大师。这样一来,您将被教导,练习,观察和质疑他人的手艺,并(希望)向他们学习。

没有魔术子弹...


2

首先阅读并理解什么是SDLC(又称软件开发生命周期)。这是一个反复不断的过程,涉及自我完善,学习,**practicing, practicing...**

在此处输入图片说明

这将打开您需要学习或改进哪些领域的视野。一旦您自己构建了几个应用程序,就会发现几本核心软件工程书籍对于阅读非常有用。

此外,一旦您对OOP语言充满信心,就可以开始学习设计模式了Head First Design模式是一本值得考虑的好书。我喜欢这本书。


1
谢谢。在阅读本文时,我已经选择了答案,但绝对会接受您的建议。
cprogcr's

不知道为什么投票失败,请让我知道需要改进的地方。
EL Yusubov 2012年

2

经验是无可替代的。为了掌握某些东西,您必须经常将其用于许多不同的事物。

因此,继续使用该语言进行练习(例如Euler项目)和个人项目,您实际需要的东西或您认为有趣的东西。编写游戏,编写Web应用程序,编写解析器,随心所欲。并且在每个步骤中,都努力了解您在做什么,而不仅仅是粘贴代码或遵循说明。

我希望能够阅读别人的代码并理解它,无论这样做有多困难。

一旦了解了基本语法,就可以立即执行此操作。只需花一些代码,然后花一些时间详细了解它即可。查找您不了解的内容,或在诸如Stack Overflow之类的地方提出具体问题。


2

在问题的高级方面,了解体系结构:如何组织项目,其结构是什么。不要只是让它们随机生长。

在中等水平上,学习不同的技术和范例。曲目中使用的工具越多样化,您所拥有的力量就越大。如果您只研究过Java,Python和ruby,那么您仅会接触到很少一部分编程空间。学习命令式和函数式编程,学习序言和J。这个想法不是“掌握”数百种语言,而是学习解决相同问题的不同方法。

从问题的低端来看,可以帮助您成为一个更好的程序员(实际上无论您做什么都更好)的一件事是拥有良好的平台思维模型。例如,您可以学习C控制结构的工作方式并了解最常见的库,但是如果您没有关于指针和内存如何工作的思维模型,那么使用适度复杂的表达式会遇到麻烦。


1

我可以提出几点建议吗?

首先,如果您能找到一位导师与您讨论语言的使用,获得最佳技巧和窍门,以及在一种技术优于另一种技术时进行回答。

其次,尽可能多地练习,并尝试最大程度地使用该语言!我曾经在一个团队中工作过,那会(每天很有趣)每天从手册中挑选动词或其他编程语言。如果您能在当天进行编码的工作,那将是一个荣誉。这意味着整个编程团队需要查看并理解(有时)晦涩的术语,以便有效地理解和使用它。有时候我们失败了,但是那个团队很有趣,可以在技术上真正启动!!


0

编程语言反映了针对通用软件开发或用于开发专用软件而开发的编程范例背后的思想。例如,像Java这样的程序语言表示面向对象的程序范例,但是AspectJ(Java的扩展)用于根据面向方面的程序进行编程。

给出了简短的介绍,为了真正掌握一种语言,仅靠自己购买和阅读书并不会有多大帮助。您需要了解使用所需语言进行编程的环境,了解该范例,更重要的是使用该语言构建有意义的应用程序。构建一个小型应用程序可以带您领略该语言提供的各种工具,这是一种非常有用的学习方法。

我见过那些来自纯C社区的人,他们没有学习任何有关面向对象的知识,也没有在学习Java或Objective-c时费劲。我还看到人们在没有真正理解用户界面元素,事件驱动的编程等方式时,就很难对用户界面进行编程。

我希望这有帮助!


0

我要在格伦的清单中添加两个项目

  • 尝试解决别人有的难题,例如在SO上给出答案
  • 阅读语言设计师的博客/书。那是深度知识的最佳资源。您会知道原因X背后的设计决策是什么。

0

以@TMN所说的为基础。通过用不同的语言编写相同的程序,我在学习语言方面取得了巨大的成功。

例如,编写一个程序以读取CSV文件,然后分析文本,然后以相反的顺序将其写回到第二个CSV文件中。

像这样,

列1,列2,列3

第3列,第2列,第1列

这将使您对语言有基本的了解。然后看看您还能做什么。也许允许值替换,重新排序或从命令行读取。使它尽可能复杂。

我也想@GlenPeterson说的话,

学习一种非常不同的语言。对C语言的一个很好的补充是像Lisp这样的函数式语言。这将彻底改变您对过程语言的思考方式。

是个好主意。我建议使用类似Haskell的语言,因为在最新版本中,您可以使用OO,过程,逻辑或函数的所有四个编程范例进行编程。即使它实际上是一种功能语言,您也可以花一些力气实现其他范例,这将是一次很好的学习体验。

很棒的语言。


0

您不能从书中学习一种语言。您只需要练习和练习。不要以为您可以从特定的书或特定的来源学习语言,只是认为编程语言与人类的语言相同。您不能通过阅读特定的书来简单地学习英语或法语。日常生活。从头开始编写代码,扩展其功能,尝试构建一些会让您满意的东西。如果您想精通一门语言,因为它了解全部语言,并在实际编码中使用编程语言的每个元素,那么您将无法。甚至即使可能,也可能需要10到15年的时间。

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.