大数据, 提高编码能力
在阅读过程中不仅关注本题的解决,更要关注解决这个问题过程背后的思想,既培养了兴趣,又提高了解决问题的能力。
在计算机上学习算法首先需要熟悉编程语言和数据结构
从基础来讲,要深入理解数据结构,至少要非常熟练地掌握一种排序算法,各种线性表的插入、删除算法,树的遍历和插入、删除算法,图的遍历算法等等。然后要多学习,掌握一些常见问题的解决模式,比如穷举算法如何应用,动态规划算法如何应用等等。最后要勤思考,对应已经掌握并解决的算法,要想想为什么用这种方法解决,有没有其他方法,类似的问题怎么办,提高举一反三的能力。
当我们遇到一个新的问题的时候,通常有两种解决问题的方式,一种方式是创造一种新的方法来解决这个问题,另一种方式是将新问题分解、转化成已知问题,然后用已知的方法解决这个问题。这两种方式都很需要抽象思维能力,现实生活中很少有机会锻炼抽象思维能力,而学习数学是一种很好地培养这种能力的方法。我强调数学学习的目的不是说要学好算法就必需成为数学大咖,而是通过学习数学促进抽象思维能力的提高。
建立模型还需要抽象的逻辑思维能力,简单地说,就是运用抽象的逻辑思维,抓住问题的主要因素,忽略次要因素,建立问题的框架。算法设计之难体现在思维方式的转换和模型的建立,前面说过,这需要有抽象思维能力,缺乏这种能力,连问题都很难想明白,更不用说设计解决问题的算法了。幸运的是这种能力是可以培养的,学好数学,多研究一些算法,积累些经验,都是很好的提高抽象思维能力的方法。
数据挖掘和机器学习常用的方法,比如决策树、贝叶斯学习、神经网络、遗传算法等等,在其他领域也都是有应用的。神经网络、遗传算法作为启发性搜索算法在人工智能和最优化求解领域也得到了广泛应用,本书中就介绍了遗传算法,只不过所举的例子是用来解决0-1背包问题,有点“大材小用”。贝叶斯学习在一些电子邮件应用程序中也有应用,主要用于垃圾邮件的识别。在人工智能领域或各种专家系统中,决策树算法也是常用算法。各种算法之间的联系还是很普遍的,在不同的领域扮演着不同的角色,本质上没有区别。
编码能力
随意堆砌网上搜来的代码,根本不管可读性和可维护性
Java编码规范,对类,以说明职责为主;对方法,以说明意图为主;对方法体,以说明实现思路为主。对于大段大段的代码,要分段,使用空行隔开,并使用行内注释进行说明。
思维的条理性,写代码之前,先简单计划一下,用自然语言把流程写下来,用于整理实现思路。不要看了需求或设计之后,马上就敲代码了,敲完代码马上 就debug。花点时间思考,敲代码只是最后一个很简单的工作,不要把自己变成一个代码打字员,编写边想,写了删,删了写。安安静静把实现过程想清楚,在 脑子里先实现一遍。再去敲代码,水到渠成。
面向对象思维能力
掌握这些比面向对象语言本身更重要,比如 对继承,多态,重载的理解。对面向对象基本原则的理解,比如开闭原则,接口隔离原则,单一职责原则等。在此基础上,应该掌握常用的设计模式,比如工厂模 式,策略模式,观察者模式,模板方法模式,命令模式等等。我面试过很多程序员,没有一个能说得上几句的。
利用工具能力
工具是为目的服务的,好用,提高效率就行,形式无所谓。
经常去浏览大牛的blog,逐个网站访问很麻烦,去看了又可能没有更新,可以借助于RSS订阅工具,我是用iGoogle桌面工具,每天早上花半个小时扫一下,大牛的最新文章尽收眼底了
英语能力
多阅读英文资料,使用金 山词霸,google的firefox插件等工具配合,贵在坚持。
学习能力
首 先要认清自己的目标,自己短期目标是什么,1年后,3年后,5年后的目标是什么。结合这些目标,确定自己的学习计划,人的精力毕竟是有限的。当然,多掌握 几门编程语言也是好的,可以扩充自己的知识面,重要的是为自己的目标服务。
要想系统的学习一门技术或工具,看书是最好的方法。看完后,然后上网找相关资料,进行深入学习。学习要抓紧一切可以利用的时间,比如电脑启动要花1分多钟,旁边放一本书,可以看上几页了。公交车上,地铁上也可以看。
当然,不能只学习技术,要经常练习自己的软技能,比如沟通能力,表达能力。你可以把自己学到的东西,解释给自己的同事听,既加深了理解,又增进了同事之间的交流。学习的最高境界就是你能够把学到的东西解释给别人听,这才说明你理解了。在学习心理学上,称之为构成主义。
每个人可能都有自己的学习方法, 意识到学习的重要,并能够根据需要补充自己的知识,这种能力更重要。
创造能力
文档能力
写代码也相当于写文档,只不过用的 是编程语言。同样,写文档,用自然语言,也相当于写程序,简单明了,清晰易懂,这样的“程序”谁看谁舒服。
优雅的代码
如果你发现你经常做一些重复的工作,就要警惕了,是否违背了这个原则,想一些办法将他们自动化。
技术与架构设计
依赖于我们的编程经验,我们可以在特定的时候创造一些框架。而架构的设计本身就是一件有意思的事,大抵是因为程序员都喜欢创造
从不会写代码,到写代码是从0到1的过程,但是要从1到60都不是一件容易的事。无论是刷Github也好(不要是自动提交),或者是换工作也好,我们都在不断地练习。
-
而练习是要分成不同的几个步骤,不仅仅局限于技术:
编码
架构
设计