不断出现在Programmers.SE上的一种类型的问题是,在您认识其他几种语言的情况下(通常是通过大量的经验或教育),如何学习一种特定的语言。
但是,在某些情况下,可能需要快速起步才能完成工作,个人发展,甚至是检验热门的新平台。
根据您的经验,您使用了哪些一般策略来快速选择一种新语言?在开始感冒时,您会尝试着重于某种语言的特定方面吗?您认为在此过程中有哪些类型的资源有用?
不断出现在Programmers.SE上的一种类型的问题是,在您认识其他几种语言的情况下(通常是通过大量的经验或教育),如何学习一种特定的语言。
但是,在某些情况下,可能需要快速起步才能完成工作,个人发展,甚至是检验热门的新平台。
根据您的经验,您使用了哪些一般策略来快速选择一种新语言?在开始感冒时,您会尝试着重于某种语言的特定方面吗?您认为在此过程中有哪些类型的资源有用?
Answers:
我发现学习一种新语言的最好方法是边做边做,而不仅仅是阅读。因此,当我想要(或需要)学习一种新语言时,通常会阅读一本有关语法的参考书中的几章,但随后我会继续学习并创造一些东西,而不是一本又一本地读书。
我发现随着问题的出现,答案就会找到(通常是在互联网上)。我也认为这就是为什么在职培训如此宝贵的原因,因为您大部分时间都在制作工作产品,即使它是草稿也是如此,因此您正在边做边学。
我鼓励人们只考虑他们感兴趣的内容,而后直接去编写代码或创建表单等。
稍后,在一个接一个地创建一个项目之后,一本好的参考书将教给您一些精美的细节,这时您可以更轻松地掌握它们。
而且,这些项目通常从较小的项目开始,并且复杂性不断增加-从简单的“ Hello World”应用程序到规模不大但用途不大的项目,再到完整的应用程序。在我关注语言的哪些方面方面,这取决于该语言的应用用途-我从不学习要启动的每个API或框架(例如,以.NET为例)。这将花费太长时间。我学习了核心语法,然后从那里分支出来,根据需要研究每个扩展。使用诸如CSS或XSLT之类的模块化程度较低的语言,我只需首先学习最受欢迎的结构,然后根据需要添加其他结构。
这对我有用:
对于“ 阅读”步骤,我尝试选择该语言的“ the”参考。例如“ C编程语言”。需要精炼到一定程度,并逐步建立您的知识。然后我读了它的封面。我是一个快速的读者,我不喜欢第一次阅读。然后,当我尝试使用该语言时,我将回过头来参考特定的要点。我可能会花更多时间在本书中的代码示例上。
您需要的第一件事是语法。不知道它是BEGIN还是{还是块缩进,还是如何声明变量,就无法编写任何内容。作者通常将首先介绍较重要的部分,或者会提供涵盖该语言基本用法的教程。很难提供更一般的指导,因为某些语言与其他语言非常不同。接下来是对语言的总体感觉,总体哲学是什么,如何在语言的上下文中解决问题。
要记住的另一件事是“使用它或失去它”的概念。如果您有一段时间没有使用某种语言,那么您将需要一些时间来恢复自己的速度(尽管这段时间会随着经验的积累而缩短)。掌握了语言的语法后,您将需要了解库等。
因此,这是一个反复的过程。每次迭代都更深入。没完没了。即使使用一种语言20年之后,仍然有一些东西需要学习。
从我的角度来看,当您实际需要学习某些东西时,它会更容易学习。对我来说,这是使用javascript进行的,因为我接受了一个有两个月时间框架的大型项目,因此冒了风险。我每天晚上每天晚上都在这里努力争取这个自由职业者项目的成果,并且在一个半月的时间里该项目就完成了。
我也偶然在那儿学习了一些SQL,然后我在大学里完成了对SQL的学习,然后猜猜,我也度过了一段轻松的时光。
上一点的实际关键是解决现实世界中的问题...但是我在压力下工作得更好(我喜欢压力,我认为这很有趣,而且我可能会受到伤害,所以...)。如果您不喜欢,那就去研究一个您感兴趣的开源项目,并使用您想要学习的语言并尝试做出贡献。如果您的代码很烂,您可能会得到一些反馈,具体取决于社区。
您可能仅通过学习代码就可以取得进步。
其中包括几本书,官方文档以及您可以获得的所有参考。很有可能那样,您将知道如何以不同的方式来做同样的事情。
其他社区(例如论坛,邮件列表等)也可以作为参考。
有许多学习新语言的方法,但并非所有方法都同样有效。我发现这三个准则最适合我:
绘制一张您不知道的东西的地图
事先弄清楚您需要学习什么。查找以抽象术语描述该语言的概述或常规文档来源。这样一来,您通常就可以大致了解该语言的含义。使用该概述突出显示您不知道但被认为是该语言核心的区域。尾递归是您真正需要掌握的语言概念吗?也许您需要更好地了解您的正则表达式,因为该语言专门处理字符串操作。或者,也许您真的必须开始学习代数,因为语言中的许多概念都直接来自代数概念。
获取良好的资源来帮助您学习不了解的内容
您可能想对代数公式有一个很好的参考,或者也许只想购买“ Javascript,好的部分 ”。对于某些学习曲线,这项工作已经部分完成。如果您想从Java背景中学习C#(反之亦然),则有许多博客文章和网站会指出差异,并包含参考/资源以帮助您学习。
确保资源不只是参考-确保它们包括测试或练习,以帮助您评估您是否正确地学习了概念。阅读有关尾递归的内容是一回事,而抱怨如何以您选择的语言实现它是另一回事。
建立真实的东西
如果没有明确的目标,几乎不可能进行任何形式的实际学习。对于应用艺术尤其如此,这就是编程语言的用途。确保您有一个真正的目标针对-建立东西通常是最佳选择。
考虑到您已经知道如何编程和了解几种语言,除非该语言带来了非常深刻的范式转变,所以(同时)我会说:
经典的99个Prolog拼图(此处为Scala的99个拼图)或Euler项目通常是寻找小型拼图重新实现的好地方。或潜伏于StackOverflow并用目标语言重新编写一些不错的答案,尝试不进行逐行重写,而是抓住新语言的精髓。
与困惑者一起学习,阅读侧面的博客和文章,以更深刻地理解该语言,并了解新社区的工具和圣战,并编写测试项目以应用新发现的知识和技能,看看您遇到了什么颠簸。
分享并公开自己。(不过不要太多。)
也许您还想访问一个本地用户组,找到与之进行编码的伙伴(以获得一些建设性的批评,而不是将自己锁定在特定的思维方式中),并订阅该可怕的IRC频道或邮件列表,在其中他们丢弃有关AST的奇怪字眼树木并写出关于莫纳德人不是莫纳德人的哲学故事,以及一旦遇见某个陌生女孩便不能回去。
作为仅使用该语言的具体建议:
这个过程往往比编写另一个玩具程序更令人满意,但是比从头开始创建自己的完整项目要容易得多。您会接触到自然语言环境中的一些语言习语,并且(如果有运气的话)有人对好的代码的外观有所了解。
另一方面,它也可能非常令人沮丧,特别是如果您选择了一个令人讨厌的错误,或者如果开发人员在未正确解释原因的情况下拒绝了您的补丁程序,则尤其如此。