专访邱俊涛:高级JavaScript程序员代码应结构清晰、模块化良好
本文关键词:JavaScript核心概念及实践,由笔耕文化传播整理发布。
在谈到敏捷开发时,邱俊涛认为那些一成不变,或者认为“只有这样才是敏捷,那样不是”的教条想法,都是绝不足取的
邱俊涛,2008年毕业于昆明理工大学计算机科学与技术专业,目前就职于ThoughtWorks。著有《JavaScript核心概念及实践》一书,对动态语言和函数式编程有很高的热情和兴趣。主要开发经历涉及J2EE,Web前端开发,Linux下的网络服务等方面。喜欢开源软件,热爱知识分享,崇尚简洁,轻量的设计和模式。
我是一个开源软件爱好者CSDN:请和大家介绍下你及从事的工作。
邱俊涛:大家好,我叫邱俊涛,目前就职于ThoughtWorks,是一名软件工程师。如果加上毕业前为期一个月的实习的话,到现在我已经工作了5年了。在加入ThoughtWorks之前,我曾在另外两家IT公司工作过,涉及过的技术主要包括J2EE、Web前端和Linux下的服务开发等方面。
在ThoughtWorks,工作主要内容仍然是开发,但是几乎每个项目的技术栈可能都会有所不同,因此可以尝试到各种框架,各种语言,以及和各种牛人一起开发和学习,这些都是非常有趣的体验。
CSDN:你首次接触计算机是什么时候?那个时候很多人都觉得解脱了,并开始痴迷于游戏,你为何会选择去钻研电脑技术?
邱俊涛:我首次接触计算机程序开发是在2004年的夏天(接触计算机是在2001年,但是真正做出一个可以运行的程序,则是在2004年),当时高中毕业,在等待录取通知书的期间,我去了石家庄找我的兄长邱俊锋。
邱俊峰当时也是在做软件开发,而且一度痴迷UNIX,他在他们公司的一台废弃已久且没有显示器的机器上安装了FreeBSD,然后把我安排在他同事一台闲置的机器上,这样我可以通过SSH登陆到那台FreeBSD服务器上。在他的指导下,我用FreeBSD下的开发工具cc/ld/make等编写出了第一个可以运行的程序——比打印“Hello,world”稍微“高级”一点——它可以计算两个数字的和。正是这次经历,使我对于基于命令行的、简洁的开发方式产生了浓厚的兴趣。
我觉得这种对于计算机软件的兴趣,或者说痴迷,和其他同学对于旅游、运动和打游戏等的痴迷并无二致,当然也无高下之分。只不过我正好找到了一个自己既感兴趣,又正好看起来不是那么“不务正业”的方向而已。
CSDN:能聊下你为什么喜爱在Linux以及Linux命令行环境做开发,它哪里吸引了你?
邱俊涛:首先,作为一个开源软件的爱好者,Linux本身就是一个最大的开源软件,而且运行于其上的绝大多数软件都是以开源的形式出现,这些事实无疑对我有很大的吸引力。相对于图形界面,命令行展现出的强大的可定制性和灵活性,可以极大的提高开发效率,命令行对于开发者有一种天然的吸引力:本质上来讲,它可以把命令理解为函数,命令的选项理解为参数,管道为函数调用链,这样的话,在命令行工作本身就变成了编程!
Linux下有许多很顺手的小工具可以帮助程序员完成日常的开发工作,以及一些服务运行状况的监控等。另外,当发现一些重复的工作时,可以编写一个脚本将命令组合在一起,然后再交给crontab来自动运行,可以节省程序员很多时间。
CSDN:毕业后你从事的第一份工作是什么?据说这份工作主要和Java相关,后来为什么会去学习JavaScript?当初做选择主要是基于什么考虑的?
邱俊涛:2008年,我大学毕业,在一家做报表产品的外企工作(Jinfonet),公司中大部分团队都使用Java开发,而我们组主要工作为基于Web报表的展现。也就是在这时候,我开始认真学习JavaScript,并真正把它当做一门编程语言来看待。几个月后,当我理清了JavaScript中众多容易被混淆的概念之时,我觉得应该把我的理解分享出来,于是就有了《JavaScript核心概念及实践》的前身,这个系列做出后发表在ITeye(当时还叫JavaEye),并且收到了很多鼓励和帮助。
坚持,让我在JavaScript路上越走越远CSDN:工作后很多程序员有这样一种情况:对现状不满足,却又萎靡不振懒得改变,像你有没有这种情况?会去找一些项目来满足自己的兴趣和挑战欲望吗?平时都会干嘛?
邱俊涛:非常好的问题,我觉得是这样的:当你每天早上起床要去公司的时候,如果你内心沉重,打不起精神去工作;而到下班的时候,你恨不得立刻离开公司;在工作之余,你永远不希望同事或者其他人问你关于工作的任何事情;那你应该意识到:是时候做出改变了。事实上,改变不一定总是好的,但是如果工作无法让你感到快乐,而你又无力与这种现状斗争,那就需要改变了,套用一句老话:失去的只是枷锁,而得到的是整个世界。
我自己也经历过这样一段时期:在第一家公司出来之后,我去了一个很大的公司,但是每天的工作内容非常无聊,毫无挑战,连续一周我每天这样问自己:“现在这种方式是我想要的吗?”,在得到了七次否定的回答之后,我就离职去另外一家公司。现在回想,那是我当年或者是我此生做的最明智的决策之一。这个经历可能是一个极端,可能大部分公司不会让人感觉到那么糟糕,可能一直处于“还好”或者“还行”的尴尬境地,这事实上也是一种非常危险的处境。
比如我曾经呆过的一家公司,这是一家“还好”的公司,薪水不算丰厚,但是也不至于让员工“冻馁其妻子”,偶尔会出差几周,偶尔会加班,但一张一弛,不会让人觉得无法忍受。对于这种情况,我在工作之余通过不断的学习来充实自己,比如参加一些开源的项目,研究学习其他的技术,比如动态语言,并尝试在工作中使用,通过博客看一看别的程序员的工作方式、工作内容等。
如果你对现状不满,而又看不到立刻改变的方向,那么就应该去不断的学习。在学习到了新技术或者新理念之后,可以尝试在现有的环境中使用并推广。如果足够幸运,那么在得到很多认同感之后,可能会改善这种“萎靡不振”的状态;而如果你发现与环境格格不入且无法改变,那就可以尝试换一个环境,无论如何你可能觉得环境会很不舒适,但是不要自己放弃自己。
CSDN:首先恭喜你新书《JavaScript核心概念及实践》这个月出版,据说这本书和你在ITeye写博有关,能不能和大家回顾下这段经历?另外把博文整理成书有没有遇到什么困难?这段经历给你带来哪些收获和好习惯?此外新书为什么用杜虎符作为封面?
邱俊涛:谢谢!这本书最早发表在ITeye上,事实上是先有一些草稿后才逐篇发表的,但是每一章在发表之前都很粗糙,在发表之前都会进行很多的改动(以免有明显的错误误导初学者等),这样事实上也是一种潜在的促进。而几乎每一篇都有大量的留言,也有很多关注,没有这些读者的支持,这本书可能根本无法坚持到最后,在这里也郑重的感谢一下ITeye这个平台以及这个平台上的那么多热心读者。
说到困难,我觉得坚持本身是最大的困难,如果留意一下这个系列发表时间表的话你可能会发现,某些章节之间的跨度较大,而后来甚至有半年都没有更新。一方面是由于部分内容本身正在修改中,另一方面也是在纠结于继续写下去还是到此为止,很幸运最后终于坚持了下来,这样给自己的信心有很大的正面作用。也就是说,如果我写第二本书的话,最终能够写完的概率会增大一些。
另一个比较大的感受是:尽量将自己学习到的东西分享出去,一方面可以锻炼总结能力和表达能力,另一方面,当你可以很轻松的将一个复杂的技术描述清楚,并使得读者/听众也能明白的时候,那才是你真正掌握了该知识。在做到这点之前,需要查阅很多资料,也需要自己动手去验证一些想法,但整个过程的收益会非常大。
虎符是古代用于调兵遣将的凭证,寓意JavaScript小巧但是功能强大。
本文为CSDN原创文章,未经允许不得转载,如需转载请联系market#csdn.net(#换成@)
在谈到敏捷开发时,邱俊涛认为那些一成不变,或者认为“只有这样才是敏捷,那样不是”的教条想法,都是绝不足取的
邱俊涛,2008年毕业于昆明理工大学计算机科学与技术专业,目前就职于ThoughtWorks。著有《JavaScript核心概念及实践》一书,对动态语言和函数式编程有很高的热情和兴趣。主要开发经历涉及J2EE,Web前端开发,Linux下的网络服务等方面。喜欢开源软件,热爱知识分享,崇尚简洁,轻量的设计和模式。
我是一个开源软件爱好者CSDN:请和大家介绍下你及从事的工作。
邱俊涛:大家好,我叫邱俊涛,目前就职于ThoughtWorks,是一名软件工程师。如果加上毕业前为期一个月的实习的话,到现在我已经工作了5年了。在加入ThoughtWorks之前,我曾在另外两家IT公司工作过,涉及过的技术主要包括J2EE、Web前端和Linux下的服务开发等方面。
在ThoughtWorks,工作主要内容仍然是开发,但是几乎每个项目的技术栈可能都会有所不同,因此可以尝试到各种框架,各种语言,以及和各种牛人一起开发和学习,这些都是非常有趣的体验。
CSDN:你首次接触计算机是什么时候?那个时候很多人都觉得解脱了,并开始痴迷于游戏,你为何会选择去钻研电脑技术?
邱俊涛:我首次接触计算机程序开发是在2004年的夏天(接触计算机是在2001年,但是真正做出一个可以运行的程序,则是在2004年),当时高中毕业,在等待录取通知书的期间,我去了石家庄找我的兄长邱俊锋。
邱俊峰当时也是在做软件开发,而且一度痴迷UNIX,他在他们公司的一台废弃已久且没有显示器的机器上安装了FreeBSD,然后把我安排在他同事一台闲置的机器上,这样我可以通过SSH登陆到那台FreeBSD服务器上。在他的指导下,我用FreeBSD下的开发工具cc/ld/make等编写出了第一个可以运行的程序——比打印“Hello,world”稍微“高级”一点——它可以计算两个数字的和。正是这次经历,使我对于基于命令行的、简洁的开发方式产生了浓厚的兴趣。
我觉得这种对于计算机软件的兴趣,或者说痴迷,和其他同学对于旅游、运动和打游戏等的痴迷并无二致,当然也无高下之分。只不过我正好找到了一个自己既感兴趣,又正好看起来不是那么“不务正业”的方向而已。
CSDN:能聊下你为什么喜爱在Linux以及Linux命令行环境做开发,它哪里吸引了你?
邱俊涛:首先,作为一个开源软件的爱好者,Linux本身就是一个最大的开源软件,而且运行于其上的绝大多数软件都是以开源的形式出现,这些事实无疑对我有很大的吸引力。相对于图形界面,命令行展现出的强大的可定制性和灵活性,可以极大的提高开发效率,命令行对于开发者有一种天然的吸引力:本质上来讲,它可以把命令理解为函数,命令的选项理解为参数,管道为函数调用链,这样的话,在命令行工作本身就变成了编程!
Linux下有许多很顺手的小工具可以帮助程序员完成日常的开发工作,以及一些服务运行状况的监控等。另外,当发现一些重复的工作时,可以编写一个脚本将命令组合在一起,然后再交给crontab来自动运行,可以节省程序员很多时间。
CSDN:毕业后你从事的第一份工作是什么?据说这份工作主要和Java相关,后来为什么会去学习JavaScript?当初做选择主要是基于什么考虑的?
邱俊涛:2008年,我大学毕业,在一家做报表产品的外企工作(Jinfonet),公司中大部分团队都使用Java开发,而我们组主要工作为基于Web报表的展现。也就是在这时候,我开始认真学习JavaScript,并真正把它当做一门编程语言来看待。几个月后,当我理清了JavaScript中众多容易被混淆的概念之时,我觉得应该把我的理解分享出来,于是就有了《JavaScript核心概念及实践》的前身,这个系列做出后发表在ITeye(当时还叫JavaEye),并且收到了很多鼓励和帮助。
坚持,让我在JavaScript路上越走越远CSDN:工作后很多程序员有这样一种情况:对现状不满足,却又萎靡不振懒得改变,像你有没有这种情况?会去找一些项目来满足自己的兴趣和挑战欲望吗?平时都会干嘛?
邱俊涛:非常好的问题,我觉得是这样的:当你每天早上起床要去公司的时候,如果你内心沉重,打不起精神去工作;而到下班的时候,你恨不得立刻离开公司;在工作之余,你永远不希望同事或者其他人问你关于工作的任何事情;那你应该意识到:是时候做出改变了。事实上,改变不一定总是好的,但是如果工作无法让你感到快乐,而你又无力与这种现状斗争,那就需要改变了,套用一句老话:失去的只是枷锁,而得到的是整个世界。
我自己也经历过这样一段时期:在第一家公司出来之后,我去了一个很大的公司,但是每天的工作内容非常无聊,毫无挑战,连续一周我每天这样问自己:“现在这种方式是我想要的吗?”,在得到了七次否定的回答之后,我就离职去另外一家公司。现在回想,那是我当年或者是我此生做的最明智的决策之一。这个经历可能是一个极端,可能大部分公司不会让人感觉到那么糟糕,可能一直处于“还好”或者“还行”的尴尬境地,这事实上也是一种非常危险的处境。
比如我曾经呆过的一家公司,这是一家“还好”的公司,薪水不算丰厚,但是也不至于让员工“冻馁其妻子”,偶尔会出差几周,偶尔会加班,但一张一弛,不会让人觉得无法忍受。对于这种情况,我在工作之余通过不断的学习来充实自己,比如参加一些开源的项目,研究学习其他的技术,比如动态语言,并尝试在工作中使用,通过博客看一看别的程序员的工作方式、工作内容等。
如果你对现状不满,而又看不到立刻改变的方向,那么就应该去不断的学习。在学习到了新技术或者新理念之后,可以尝试在现有的环境中使用并推广。如果足够幸运,那么在得到很多认同感之后,可能会改善这种“萎靡不振”的状态;而如果你发现与环境格格不入且无法改变,那就可以尝试换一个环境,无论如何你可能觉得环境会很不舒适,但是不要自己放弃自己。
CSDN:首先恭喜你新书《JavaScript核心概念及实践》这个月出版,据说这本书和你在ITeye写博有关,能不能和大家回顾下这段经历?另外把博文整理成书有没有遇到什么困难?这段经历给你带来哪些收获和好习惯?此外新书为什么用杜虎符作为封面?
邱俊涛:谢谢!这本书最早发表在ITeye上,事实上是先有一些草稿后才逐篇发表的,但是每一章在发表之前都很粗糙,在发表之前都会进行很多的改动(以免有明显的错误误导初学者等),这样事实上也是一种潜在的促进。而几乎每一篇都有大量的留言,也有很多关注,没有这些读者的支持,这本书可能根本无法坚持到最后,在这里也郑重的感谢一下ITeye这个平台以及这个平台上的那么多热心读者。
说到困难,我觉得坚持本身是最大的困难,如果留意一下这个系列发表时间表的话你可能会发现,某些章节之间的跨度较大,而后来甚至有半年都没有更新。一方面是由于部分内容本身正在修改中,另一方面也是在纠结于继续写下去还是到此为止,很幸运最后终于坚持了下来,这样给自己的信心有很大的正面作用。也就是说,如果我写第二本书的话,最终能够写完的概率会增大一些。
另一个比较大的感受是:尽量将自己学习到的东西分享出去,一方面可以锻炼总结能力和表达能力,另一方面,当你可以很轻松的将一个复杂的技术描述清楚,并使得读者/听众也能明白的时候,那才是你真正掌握了该知识。在做到这点之前,需要查阅很多资料,也需要自己动手去验证一些想法,但整个过程的收益会非常大。
虎符是古代用于调兵遣将的凭证,寓意JavaScript小巧但是功能强大。
本文为CSDN原创文章,未经允许不得转载,如需转载请联系market#csdn.net(#换成@)
CSDN:听说你下个计划是打算写轻量级的Web应用开发的一些编程实践,为什么选择写这个方面的书?在这方面,能不能和大家提前分享一些特别有价值的内容?
邱俊涛:在ThoughtWorks,我们日常可以接触到大量这方面的工作,比如后端的Sinatra、Haml模板引擎、DataMapper映射器和前端的JavaScript框架backbone.js等,这些小巧而轻量级的库或者框架组合起来可以很好地完成Web应用程序的搭建,而由于这个应用程序的每个层都采用轻量级的库或者框架,它们都更有优化的余地,而如果有更好的框架,也可以更快速且容易地替换。
轻量级的另一个含义是开发过程的轻量化,比如很少的人,用很少的时间去完成一个Web应用的开发。这个在之前是很难做到的,但是通过搭建持续集成环境,将测试自动化等敏捷开发实践,可以很容易地将开发过程轻量化。
工作后的成长:贵人帮助和良好的开发氛围 让我深刻理解软件开发CSDN:在介绍中你特别提到Jinfoent的胡东先生给了你极大的帮助,为什么会着重提到他?这段经历中最让你记忆深刻的事情是什么?
邱俊涛:胡东先生是一个有丰富软硬件开发经验的大师级程序员,同时他又非常的低调。他是一个UNIX的忠实拥趸,命令行控,这些相似点可能使得我更容易理解他的设计思路。
印象最深的是有一次,他让我在业余时间做一个类似于网络爬虫的程序:给定一个URL指定的资源,然后建立网络连接去下载这个资源,分析下载到的内容中有没有其他的URL,如果有的话,则派生出一些新的工作者线程,并发地去执行上述的操作。我写出了第一个版本,然后拿给他看。这个版本当然很粗糙,而且大部分面向对象的概念还都没有建立,他就帮我一步步重构,我自己又重写了一遍,然后又请他指导,这样重复了好几次。经过几次的重构之后,这个程序的结构变得非常清晰,而且也很容易做进一步的扩展(事实上,后来我们又尝试将它扩展成一个基于RMI,可以分布在局域网络内的爬虫程序)。这段经历对我的帮助很大,之前如口头禅般的“继承、封装和多态”都变成了活生生的例子,甚至通过这个例子,也纠正了我之前对Java语言的一些误解。我非常感激能在刚出校门就遇到这样的一位编程大师,而且在传授知识和经验时他也非常地耐心和细心。
CSDN:你还表示在胡东先生的帮助下,你对面向对象编程、设计模式、重构和UNIX设计哲学等有了新的认识,能不能分享下相关心得?
邱俊涛:胡东先生是中国早期程序员中的一员,他在上学时甚至用过传说中的PDP-11(Unix的第一版就是运行于其上)。可能是长期基于硬件编程的原因,他对面向对象编程的理解更深入一些:毕竟,拿在手里的硬件就是一个个的对象啊!
上边提到的那个关于网络爬虫的例子中,我们在调试的时候发现多个线程的打印往往会混在一起,因此需要一个同步的打印线程:所有的线程要打印的时候,都向一个加过锁的队列里放入需要打印的内容,然后立即返回。当我们最后写出代码来后,他才告诉我,这个是单例模式。另外比如网络爬虫需要向负责报告的线程发消息,而负责报告的线程要负责所有爬虫线程的状态收集,这样需要一个注册-监听的机制,而当代码实现之后,他才教给我这个是观察者模式。
如果事先知道模式,然后再去想方设法的把程序跟模式关联,这种生搬硬套的方式效率极低;而他则反其道而行之,通过一个活生生且可以运行的例子告诉我应用了什么模式,并促进我举一反三地掌握。
另外一个例子是,当时我们在设计产品中一个功能时发现,当页面上相互关联的组件非常多的时候,纯粹用jQuery来关联这些组件间的时间将会非常的繁复,而且一旦需求改变(事实上需求一直在变),就需要重写很多代码。在午饭的时候,他向我描述了sub-pub这种模型,并向我演示了他之前用Java实现过的一个例子。然后我就花了两三天时间将我们已有的代码做了重构,使得这部分代码基本符合MVC的模型:页面上的组件完全由JavaScript绘制,而组件间的关系存放在一个对象上(model),然后页面的基本布局来源于另一次请求得到的模板上(view),然后将自定义的事件响应函数放在一个全局表中,组件之间要发生通信时,只需要发起一个事件,并带上足够的信息即可。然后事件分发器会在全局表中查看注册了响应该事件的处理函数,并依次执行。
这个模型非常有用,特别是在处理UI事件相关的场景下。它也使我对这些抽象于语言之上的如设计模式和面向对象的思想等产生了新的认识。
CSDN:后来你进入了ThoughtWorks公司,这是一家全家IT软件公司,它帮助企业改善IT组织改进软件开发方法并对IT行业进行革新,你作为其中一员,可以分享下你们的软件开发方法以及日常实践都是如何操作的?
邱俊涛:请容我郑重介绍一下自己所在的这家公司:ThoughtWorks是一个追求公平、组织机构很扁平的公司,其实她更像是一个大的开发者社区。这里汇集了非常多的对软件卓越本身充满激情的年轻人,我的同事们都非常热情,非常有活力。我们很乐于为整个软件社区做一些事情,通过卓越的软件来把世界变得更美好一些,比如我们经常组织的技术讲座,让更多的人参加到软件行业中来,来改善整个社区的现状;比如我们参加的社会公益项目,改善贫困学生的学习条件等等,虽然每一步都可能微不足道,但是我们一直在努力尝试。
关于一些常用的开发方式,和很多IT公司都有很大的差异。比如测试自动化,结对编程,代码评审等,这些实践可以很好地提高软件的质量,也使得我们和客户都对软件更有信心。
CSDN:能不能谈谈你对敏捷开发的一些认识?你认为在实际工作中如何做好敏捷开发?
邱俊涛:敏捷开发在本质上来讲是为了消除软件开发过程中的种种浪费,而为了做到这一点,敏捷开发包含许多行之有效的实践,比如提倡高效的交流、短周期的迭代、定期做回顾会议、结对编程、代码评审、测试驱动开发、自动化测试和持续集成等等。而这一系列的实践内容并非一成不变,我们在回顾会议上会对近期所做的所有事情分析,并通过投票决定哪些应该被保留,哪些应该停止做下去,不断地调整以求最大的消除浪费。
比如我们发现,短周期的迭代非常好:一方面它可以尽快的让客户看到产品的样子,另一方面如果实现和需求有所偏差,我们可以及时做出调整,以避免更大的浪费。又比如通过代码评审,我们可以很容易的从团队中其他成员的反馈中看出,代码的设计有没有可以改进的余地,或者设计对测试友好不友好等。这样则可以提高代码质量,减少测试人员的工作量。
软件开发界有一句很有名的话:“唯一不变的就是变化本身”,所以在实际工作中,可以尝试一些敏捷开发的具体实践,并根据实际情况迅速地做出调整,最后保留下来的就是那些既对团队自身有价值,并且也对客户有价值的实践。我认为那些一成不变,或者认为“只有这样才是敏捷,那样不是”的教条想法,都是绝不足取的。
本文为CSDN原创文章,未经允许不得转载,如需转载请联系market#csdn.net(#换成@)
JavaScript,初学者应从Python、Ruby等高级语言开始
CSDN:有人称JavaScript是一门比较简单的语言,但也有人称JavaScript简单却难以精通,对此你是怎么看的?
邱俊涛:就我自己经验来看,JavaScript并没有比其他语言更为简单,也没有比其他语言更为艰深。但是JavaScript作为一门编程语言,的确有很多有趣的特性。比如它初看起来像是Java,但是细细深究,又可以感觉到它和函数式编程语言颇有渊源。而其动态性和弱类型等特点相较于静态语言又具有很高的灵活性,开发者可以用很精简的代码来表示复杂的逻辑,特别是基于其函数式编程的特性,使得开发者可以使用一套构建在原有语法其上的“新”语法来编写程序。比如非常流行的JavaScript库jQuery,从一定程度上jQuery是一个基于JavaScript的DSL(领域特定语言),在Web开发中,使用jQuery写出的代码非常具有表达力,而且看起来好像是为操作DOM元素而生的原生语言一样。
CSDN:从入门、基础学习、进阶学习到精通后拓展性学习,你觉得该如何系统学习JavaScript?另外你还建议初学者应从一些“高级”语言(Python、Ruby)开始学习,这是为什么?
邱俊涛:编程是一门实践的艺术,需要不断地练习。开始时可以找一些讲解JavaScript的书籍或者视频来学习,然后不断地练习这些知识,并尽可能地在所有可能使用的场景下去使用,我觉得学习任何一门编程语言都可以采取这种模式。
对于初学者,我更建议他们从“高级”一些的语言如Python、Ruby等开始。这些语言的语法都比较简单,语言级别上会包含大量的库(比如正则表达式,XML解析等),而且在很多地方将开发者和一些底层实现细节隔离了开来。这样可以让初学编程的人更加专注于问题本身,从而更容易对编程本身产生兴趣。而如果从一个静态,强类型语言入手,则需要学习很多于问题本身无关的细节,比如对内存的管理,数据类型间的转换,甚至基本数据类型的实现(比如链表,哈希表等)等等。
一旦兴趣培养起来了,那么学习任何技术都会非常快,而且会使工作或者学习变得非常有意思。
CSDN:你日常是如何学习其他的新技术的?经常看到你在博客上分享自己技术文章以及学习经验,可不可以跟大家分享一下这方面的体会,对于初学者又有什么建议?
邱俊涛:学习新技术的方法有很多,比如比较系统地去读相关的书籍,文档等;或者纯粹的从实践中学习,通过一些具体的例子来学习;或者将两者结合起来,读一读书,做一做练习,如此交替。我自己通常是这样的:对于偏重于实践的,或者说工作上比较紧急需要掌握的,我会通过不断练习的方式尽快掌握:比如GIT的基本用法,如何用rspec写测试等。而对于那些我自己感兴趣,而我也认为值得花很多时间去钻研的,比如大数据的相关理论,人工智能中的一些有意思的算法等,我会找一些书籍来读,并同时做一做练习。
在日常工作之余,我会阅读很多博客及技术文档,当我对某些概念/技术有了了解之后,我会尽量用示例和简单的文字将这些问题描述清楚,并分享出来。在准备分享和分享的过程中,自己经常可以学到更多的相关知识。因为要向别人描述清楚一个概念,而又不想输出一些低级错误,那么自然会驱使你花费更多的精力去研究,这样可以使得自己对该概念掌握的更好。
高级JavaScript程序员,应能编写出有规模、模块化良好和结构清晰的代码CSDN:闭包(Closure)可以说是JavaScript的一个难点,能够熟练使用闭包也是迈向高级JavaScript程序员的必经之路,你能不能和大家分享下闭包学习和平时应用闭包的一些经验和心得?
邱俊涛:对于JavaScript程序员来说,闭包是一个应该掌握的知识点。的确,闭包的概念对于只有命令式编程背景的程序员来说,理解起来也需要花费一些时间。但是对于有函数式编程经历的程序员来说,又显得天经地义。而且另外一个有意思的事实是:如果是在DOM中使用JavaScript的话,很可能大部分程序员都已经在使用闭包而不自知。
我觉得闭包未必难学,熟知JavaScript中的闭包概念也未必就成了高级JavaScript程序员。我今年年初读了由李晶(拔赤)翻译的《基于MVC的JavaScript Web富应用开发》,觉得能做到书中所讨论的那种编程方式,才可以算是高级的JavaScript程序员,也就是说,把JavaScript当成其他的“主流”的编程语言,使用它来编写有足够规模、模块化良好和结构清晰的代码,这才是最重要的,也才是界定一个JavaScript程序员是否“高级”的标准。
关于对闭包的学习,由于我和很多人一样,都是来自于命令式编程的世界,所以也学习了挺长时间才理解,我建议大家可以尝试一些函数式编程语言,比如Scheme,建立起一些对应的概念之后再去看JavaScript中难以索解(比如词法作用域和闭包)的概念,就会有豁然开朗的感觉。
CSDN:能和大家分析下常用的JavaScript框架?其中哪些是你经常使用的?为什么?
邱俊涛:现在流行的前端框架非常多,如纯粹用于搭建SPA(Single Page Application,单页应用)的框架就有很多种:AngularJS、Backbone.js、Ember.js和KnockoutJS等等,而用于测试的如QUnit.js(jQuery团队的测试框架)和jasmine.js(最流行的BDD测试框架)。还有很多的JavaScript的工具库,如jQuery、underscore.js等,这些都是前端开发应该大致了解的工具。我经常使用的有jQuery、backbone.js和jasmine.js。基本的选择原则还是看一个框架/库本身是否简洁,使用这些框架能否使代码的结构更为清晰,比如backbone.js强调的MVC,在一定程度上在强迫开发人员考虑将代码分层(纯前端的MVC)。这种略带强迫的方式可以使得开发者写出来的代码更容易和其他人的代码集成。
轻量级开发,能让开发者更清爽CSDN:很多框架如今早已显得太过臃肿,内置了太多复杂组件,你能不能分享一些更为轻量级的Web应用程序开发方式?这种方式能给开发人员带来哪些好处?
邱俊涛:如果在7,8年前,用Java开发一个Web应用程序可能是一个好的选择,特别是当SSH(Spring + Struts 2 + Hibernate)黄金组合风行天下的时候,紧接着的Ruby On Rails则可以快速而方便的生成一个可以工作的Web应用程序。但是现在来看,这些框架都已经显得太过于臃肿,内置了太多复杂的组件。
这种情况当然是每个框架都无法逃脱的宿命,几乎每个框架在诞生之初都是为了替换掉另一个老旧且臃肿的框架,在最初的几个版本中,新出现的框架往往可以保持精简而清晰,而发展到最后,这些框架又都变得大而全,无所不包,然后又被其他更为轻量级的东西替代。我更想分享一些更为轻量级的开发方式,比如后端纯粹提供RESTFul的API层,而使用前端框架如Backbone.js来搭建应用程序,或者使用诸如sinatra之类的轻量级后端库,以及一些可以自由搭配的ORM框架(比如ActiveRecord或者DataMapper)和模板引擎。这些轻量级的开发方式使得开发人员更能把注意力集中在业务逻辑上,而且可以使得代码更清晰、更容易维护,也更容易测试。
CSDN:能不能和大家分享下你常用的开发工具列表(比如测试、调试、压缩和HTTP监控……)?另外能分析下开发工具:基于命令行的工具集和IDE孰优孰劣?
邱俊涛:在ThoughtWorks,开发环境基本都是Mac OS操作系统,这个系统对于开发者本身就非常友好(Mac OS本身就是基于UNIX的操作系统),Mac系统经常为人诟病的是其中大部分软件都是要收费的,而且通常都比较昂贵,但是大部分用来开发的工具都是可以免费获得的。
我常用的用于提高开发效率的工具有这些:
对于开发工具的选择上,我个人更倾向于基于命令行的工具集。相对于IDE,命令行工具更灵活,更快速。通常来讲,IDE会将命令行的工作做一层包装,提供图形界面的设置,很大程度上提高了软件的易用性。对于普通的计算机用户来说,图形界面提供了易用性,从而就“提高”了他们使用计算机的效率;但是对于开发人员,从某种程度上来说,易用性和使用效率是两个不同的方面。另外,IDE封装了背后的一些工作,理解点击“运行”按钮之后发生了什么,对成为一个好的开发人员非常有用。
在刚开始使用命令行,学习曲线无疑会稍微陡峭一些,但是如果坚持一段时间,并投入时间去练习,必然可以得到数十倍的效率回报。
CSDN:调试代码是程序员最常做也最耗时的工作,根据工作经验,你觉得有没有什么调试技巧可言?另外在开发效率上是不是也有什么心得和大家分享?
邱俊涛:应该说,在传统的开发方式中,调试代码是程序员常做也最耗时的工作。我在之前的公司也遇到了这种问题,而对于调试本身,它应该是程序员必须熟练掌握的一种技能,我并不认为有一种方法可以使得调试更快速或者更有效率,这些只能来源于经验和对代码库本身的熟悉程度(可能还依赖于编程语言和调试器本身)。但是我觉得可以通过其他的编程方式来减少调试本身。比如测试驱动开发就是一种可能的方式,而后续的自动化测试和持续集成(在软件被做成一个可以发布的包之前,需要经过所有已有测试的验证)可以将这种减少进一步保持。有了测试的保证,程序员可以很有信心的对代码进行重构,使得原来复杂的逻辑变简单,而程序对外部的行为又不会受到影响。这样一来,软件的质量会得到很大的提升,调试的机会自然会降低。
当然,不论什么样的编程实践,都无法绝对避免调试。除了一些常用的通用方法外,我觉得没有什么捷径可以遵循,对于不同的语言特性、不同的平台特性、不同的应用场景等,都需要很长时间的积累,也就是说,,这项技能非常依赖于经验。
CSDN:你是什么时候接触ITeye和CSDN的?如今你还会经常访问ITeye和CSDN吗?在上面都会做些什么呢?
邱俊涛:我接触CSDN大概在2006年左右,那时候经常去看别人的博客,而在毕业后,自己工作的主要内容是Java后,才知道了ITeye,那已经是2008年(当时还叫JavaEye)。后来由于有了自己的博客,我访问ITeye和CSDN的机会就不那么多了,但是偶尔也会去看看,比如看一些IT新闻,语言的,或者关于某个框架的讨论等。
ITeye和CSDNCSDN:你离开ITeye博客已有一段时间了,能不能谈下当初为什么将自己博客迁走?因此,你对ITeye和CSDN有什么建议吗?
邱俊涛:首先要说的是,ITeye是一个非常好的技术平台,甚至有一些看似“严厉”的防止“灌水”的规定,还有很好的投票/投诉系统,这些可能会降低一些便利性,但是从长远来看,可以很好地保证博客或者论坛帖子的质量。我当时要迁移一方面是由于ITeye的博客还不支持模板(或许有,但是我没有找到),我无法定制自己的页面,另一个原因是我想要一个更有意思的域名。
CSDN是最大的中文开发者社区,也有非常多的技术牛人都将博客搭建在其上,我印象中的CSDN的页面的风格有些老旧,但是对于最近的改版让我觉得非常震撼,现在页面总体已经做得非常漂亮,设计也显得非常的“现代”,另外听说最近博客部分也在逐步完善,希望可以做得更好,更容易定制化。(文/张勇 责编/魏兵)
若想获悉邱俊涛更多动态,请关注:个人博客:请点此进入 个人微博:请点此进入
社区之星访谈系列文章专访许雪松:深入理解嵌入式开发
专访雷果国:从1.5K到18K 一个程序员的5年成长之路
更多精彩内容,请点击社区之星查看。
本文为CSDN原创文章,未经允许不得转载,如需转载请联系market#csdn.net(#换成@)
本文关键词:JavaScript核心概念及实践,由笔耕文化传播整理发布。
本文编号:181582
本文链接:https://www.wllwen.com/wenshubaike/mishujinen/181582.html