张大胖刚入行的时候就听牛人说:程序员每年都应该学习一门新的编程语言。
张大胖热爱新技术,觉得这个建议不错,多学一门语言,技多又不压身, 于是除了自己用来吃饭的Java之外,还学了C#, Python, Ruby , JavaScript,Go 等等在当年最流行的语言。
不过由于时间的关系和环境的限制,张大胖并没有机会在真实项目中去做实战,语言的学习无法深入,很多语言都是学习了语法,流程控制语句等最基本的东西, 在Google的辅助下,可以写一点不考虑代码质量小程序。
学得多了,张大胖开始沾沾自喜: 这么多编程语言都差不多嘛,都是套路:
数据类型,内置的数据结构,可以定义函数,类, 有流程控制语句,文件操作,网络操作, XML文件,正则表达式,线程......等等。
沾沾自喜的同时也有点迷茫: 那我每年学一门语言有什么用?很多细节都忘记了!
有一天,办公室的大神Bill和同事聊起来领域特定语言(DSL),张大胖说:“这个东西我好像见过啊”
Bill说:“你当然见过,你不是会Ruby吗,Ruby有着强大的元编程,非常适合来构建DSL。”
元编程? 张大胖感觉有点懵逼,Bill说的东西自己似乎看过,但是并没有在意。
他把自己的疑惑给Bill说了一下, Bill说:“其实吧,大部分语言基本的东西就是你总结的那些,但是你去学习新语言的时候,不能只学习共性的东西, 得把重点放到这个语言独特的东西,这样每年学习一门新语言,才能真的有收获啊。”
“独特的东西?”
“比如刚才说的DSL,就充分地利用了Ruby 元编程的强大功能,还有Ruby的mix-in, Ruby on Rails的编程哲学(约定重于配置, Don't repeat yourself), 这些才是让Ruby及其系统与众不同的特性和精华,值得你花大精力去学习、体会。 ”
“再比如说Go语言,goroutine 和 channel 绝对是你值得深入研究的、独特的东西。”
张大胖想了想,确实是这样,在没有项目历练的情况下,每年一门语言,很难把这门语言学精通,用熟练,自己学了太多共性的知识, 看起来很多,但是自己的知识积累却不够高。
“那我也不知道一个语言独特的东西是什么啊?” 张大胖追问。
“不用担心,一方面要善用Google,另一方面要养成‘比较’的好习惯,你现在对Java很熟悉了,当你去学Python的时候,可以Java做个比较,看看对同样的问题, Python是怎么解决的,发掘Python独特的地方,对语言的认识就会深入一层,比如你发现Python的变量是没有类型的,像个指针,可以指向任何类型的对象, 这和Java就不同,反映了静态语言和动态语言的区别。 ”
“再比如JavaScript,利用原型法也能实现对象,继承等概念,这和Java基于类的方式大相径庭,可以说是另外一个编程泛型,值得深入研究。 ”
“总之,在不断地比较的过程中, 你就能找到这个语言的独特之处。” Bill做了最终的总结陈述。
张大胖感到受益颇多,也更有信心了:“好! 我这就试试去。”