学习一门新的语言是一种冒险。我老是热衷于尝试新的东西——学习新的语法,了解不一样的模式,乃至完全改变思惟方式。不幸的是,许多开发人员对此不觉得然,甚至多是深恶痛绝的——学习新语言,就得走出温馨区,花时间花精力来学习新的理念和方法。html
这段日子,我天天都要用大约5种不一样的语言来写不一样的项目!python
我应该先学哪一种语言?android
有关这方面的讨论真可谓数不胜数。不少刚进入编程社区的初学者,都会问这个问题,简直就是前赴后继。有些人建议先学不费力的,如Python和Ruby,也有的人认为应该先学例如C、C++和GO这类难一些的低层次的内容。我要说的是咱们在选择新的语言以前,应该注意如下几个要点。ios
类型系统git
从个人经验和先前的学习路径看,这是最重要的概念之一。我很庆幸我一开始学的是C,接着尝试了C ++,一段时间以后,我又投入了Java的怀抱。而后是Scala,以及如今我开始玩Ruby。同时,我对Objective-C、Python、甚至是OCaml也有所涉及。哦,对了,最近我正在捣鼓Swift和CoffeeScript。程序员
若是我一开始学的是JavaScript、Python或Ruby,那么后面去理解什么是类型和变量就会很是困难。理解静态和动态以及弱类型和强类型系统之间的区别,对于领悟语言的工做原理是相当重要的。我没法想象,若是我一开始不能掌控类型,那么后面涉及到的声明与定义,以及汇编与解释之间的差别,会是让人多么头大的一件事。github
不过,也有不少开发人员但愿能有立竿见影的效果:既想快速看到结果,又不肯意过多地了解细节。他们喜欢接轨新的应用程序。最好是不用动脑子的语言,碰到这样的他们最开心了。由于在他们眼中,掌握 integer、string和boolean是学习编程的超级大障碍。最好可以毋须分辨类、对象和方法,直接写代码:golang
scala> println(“Hello World!”)算法
Hello World!npm
>>> print "Hello World!"
Hello World!
2.2.1 :001 > puts "Hello World!"
Hello World!
不能否认这种途径可以给人信心,让人以为本身学到了新的东西。
首先,请明确你属于哪一种类型,摆正本身的位置。你想要探究隐藏起来的工做原理吗,喜欢深刻研究本地执行吗?愿意去理解语言结构吗?又或者你只在意能有快速的结果,不想了解虚拟机和编译工做,而且语言内部机制对你而言也一点都不重要?
从本身的利益角度考虑
你可能须要处理哪些数据?你打算写复杂的业务系统仍是相对简单的CRUD创业公司?请基于可能会让本身感兴趣的内容来肯定工做领域。
因此,若是你肯定你想要去企业工做,那么你能够试试Java或者.NET。若是你倾向于黑客并高度注重安全问题,那么不妨学习C/C ++或Bash。若是你梦想成为一名Web开发人员,那么先掌握PHP、JavaScript或Ruby吧。若是你想要编写一些机器、机器人、汽车或其余电子方面的程序——也行,先学C ++或Python吧。你喜欢捣鼓移动设备?那么Java、Swift或C#就应该是你的首选。若是你喜欢数学和算法,那么Lua、Erlang或R就很适合你。等等等等,不胜枚举。总之——一切取决于你的目的和爱好。
语言内部机制
你有组织化的堆栈内存吗?你在程序中传递变量时使用引用类型仍是只使用值类型?你是否利用指针和析构函数来控制对象的生命周期?你是自行清理存储器仍是使用相关的垃圾收集器?你是否计算和跟踪引用类型和子类?
这些都是咱们平时不会关心的问题。可是有时候,它们倒是一些你不得不处理的概念,因此理解内部机制很重要。虽然如今你会以为这些概念很复杂,理解起来很难,由于终有一天,你会庆幸本身如今的选择,有道是,书到用时方恨少,不要到用的时候追悔莫及。
我应该学习哪些语言?
社区——StackOverflow、Reddit
下面是一些Reddit上面有关于通用编程的内容:
●http://www.reddit.com/r/programmers
●http://www.reddit.com/r/cscareerquestions/
●http://www.reddit.com/r/learnprogramming/
●http://www.reddit.com/r/programming
你也点击http://stackoverflow.com/tags 或http://www.reddit.com/subreddits在特定的语言社区中寻求帮助。许多乐于助人的高手就在那里等你。
函数库
函数库之因此重要是由于它能让你有效利用现有资源,而没必要再“从新发明轮子”。咱们一般须要解决特定问题,实现业务规则,处理重要进程,从数组中找出所需元素,利用给定字符串,过滤特定集合等等。最好语言自己或者第三方函数库可以提供一些能够加快开发进程的实用程序、辅助工具和数据结构。
下面是一些不一样语言的社区函数库代码仓库:
●iOS:https://cocoapods.org/
●Android:https://android-arsenal.com/
●Java、Scala、Groovy:https://search.maven.org/
●Haskell:https://hackage.haskell.org/packages/
●GO:http://golang.org/pkg/
●Ruby:https://rubygems.org/
●Python:https://pypi.python.org/pypi
●.NET:https://www.nuget.org/packages
●JavaScript:https://www.npmjs.com/
保持对第三方支持可扩展性、开放性和易于集成等方面的审查。
从创造者/维护人员那儿得到文档和支持
你阅读文档吗?文档是否是易于理解的,全面的,最新的?更新频率如何?有多少维护人员,是否也在社区中?从文档中你能提取多少信息?你可否轻松驾驭不一样的部分?
这是一个很是有效的观察报告。只要有创造者提供有助于学习和理解语言的文档,其余的其实无所谓。例如,Ruby就有很多提供文档的网站,如:https://www.omniref.com/,http://ruby-doc.org/。 Scala也有至关不错的API说明书http://www.scala-lang.org/api/current/。
语言的创造者对待社区的态度也很重要。他可否像Ruby创始人Matz同样愿意接受和倾听反馈?他是否像Scala之父Martin Odersky同样有着纯粹的经营方针?又或者他是否会像Clojure的发明者同样鼓励社区发展?
资源和实例——博客、GitHub代码仓库
下面是一些可做为起步指导的好例子:
●http://docs.scala-lang.org/overviews/
●https://www.ruby-lang.org/en/documentation/
●https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html
●http://arcturo.github.io/library/coffeescript/,http://autotelicum.github.io/Smooth-CoffeeScript/
至于网上教程,下面这些是很不错的门户网站,如:
●https://www.codeschool.com/
●http://www.codecademy.com/
●http://www.pluralsight.com/
●http://teamtreehouse.com/
●http://tutsplus.com/
●http://www.lynda.com/
●https://www.udemy.com/
不妨去看一看。
资金
没错,前面咱们谈论了思想、激情,以及一些抽象的概念,可是最后全部这一切都归结到资金,也就是金钱。在选择语言以前最好先搞清楚哪一种薪酬/需求相对比较高。固然,你也能够纯粹是由于好玩而选择它。新事物总在不断地出现和发展,虽然这能够拓宽咱们的视野,但学一些有用的东西仍是很是重要的。在这种状况下你有如下两种解决方案:
●学习当前市场上最流行/需求量最大的语言/技术/框架。这能确保你不但能找到工做,还能得到优渥的报酬。
●按照本身的观点学习。这可能有点不可思议。由于谁也不能打包票说下一个流行的就必定是这种编程语言。试想一下,10年前你要是说Ruby会成为当前社会的宠儿,谁会相信。还有Scala和GO,没人知道以后,好比说,5年之后它们会发生什么变化。若是你如今选择了它们——那么,要么你将成为高薪专家,由于之后会变得很是普及;要么你只是掌握了一种没用的,被淘汰的语言。
点击这里查看市场分析:https://gooroo.io/analytics。
我要不要一次学习多种编程语言?
刚开始——不要这么作。从长远来看——是的,你应该学习多种编程语言。
当你刚踏上编程之旅时,你应该只专一于一种语言。你须要掌握全部的概念,全神贯注于学习某个特定区域。
当你已是一个有必定经验的程序员,那状况就有所不一样了。因为你已经知道内部机制和程序的工做原理,这时你须要作的就是学习新的语法和新的范式,由于不少概念在不一样语言里面都是相通的。
万事开头难,一旦正确起步以后,就会像滚雪球同样越滚越顺。
总结
那么归根究底咱们为何要学习新的语言呢?由于没有哪一种工具是适用于全部目标的。而咱们有着不一样的项目,不一样的问题,不一样的体系结构。也许在启用新的应用程序和选择技术堆栈以前,咱们首先应该考虑的是解决实际的业务问题,而后才能选择出最切合实际的最佳工具。
不要从工具和兴趣爱好入手。要从问题着手,而后找出解决方案。只有在了解这些的基础上,你才能选出合适的语言,帮助你用最有效的方式实现业务规则。
固然,若是你通晓多种编程语言,那你确定能更快,更高效。由于你老是能够挑选出完美的工具,用最经济的方式解决问题,并提供最有力的实现。
书籍
下面这些是我认为对你们学习初级概念颇有帮助的书。
工具
下面这些工具能够用于比较编程语言——不但包含语法,还包括社会普及程度和社会支持程度。
●http://learnXinYminutes.com/
●http://HyperPolyglot.org/
●http://RosettaCode.org/wiki/Rosetta_Code
●http://githut.info/
资源
下列资料展现了学习不一样的语言和新架构的方法和原理。
●https://www.youtube.com/watch?v=lkVI4JmnMAM
●https://www.youtube.com/watch?v=FPBVxpl8NMo
●http://www.slideshare.net/squixy/scala-vs-ruby-45694031
最后,若有不一样意见,欢迎指正。