除了编程语言,程序员还需要具备哪些能力
最近在讨论 2015 年的团队培训计划问题,Quora 上的一篇文章给了我不少启发。排行第一的回答中有几个很有意思的见解。
抽像思维能力
作者认为这是程序员最重要的能力。我们在编程时,用到的都是一些抽像的概念。作者认为应该把培养抽像思维能力作为平时练习最重要的事情长期做下去。
问题分解能力
现实编程时,我们要解决的问题往往都比较大,比较复杂。怎么样把复杂的大问题分解成一个个小问题,再逐个去解决这些小问题。这个就是问题分解能力。缺少问题分解能力的人,拿到问题时总会没有思路,因为他们不懂地把问题分解成一个个简单地可解决的问题。
模式识别
作者举了个笑话:在一个程序员的面试过程中,面试官问被试者,微波炉着火了怎么办?被试者说把微波炉扔到窗外。面试官继续问如果咖啡机着火了怎么办?被试者说把咖啡机装在微波炉里,然后扔到窗外。
这里作者想提的其实是一种问题转换的思路。把遇到的一个问题分解后,把子问题使用已经有成熟解决方案的方法来解决。其实模式识别就是抽像思维的一种。我在教女儿算数时,就用了这个方法,我先问她你有三个苹果,妈妈吃掉一个还剩下几个。等她理解后,再问她你有三个桃子,妈妈吃掉一个还剩下几个。所以,实际上我是在教我女儿抽像思维的能力,问题的重点不是苹果或桃子,而是三和一。
判断代码质量的能力
这里作者讲的是不要过早,过度去优化代码,不要片面去追求完美解决方案。代码的性能和质量要和问题的复杂度相当。
怎么样去判断代码的质量和效率刚刚好呢?作者没有提,我觉得这个需要有一些 benchmark 工具来测量以及实际使用来衡量。在这一点上,其实我比较少看到程序员犯这方面的毛病,看到更多的是完全没有优化或没去思考性能问题的低级错误。
练习
练习,练习,练习。没有捷径。10000 小时理论在编程这件事情上一定是真理。可能有天才,但只要你不是特别笨,在一个细分领域持续练习,投入时间,一定会成为专家。当然,这里有些人是工作一年,学了三年的经验,有些人是工作了五年,只学了一年的经验。
基本原理
这条是我加的。当学会用 Java 读写文件后, 不管是 Swift 还是 Python ,他们的读写文件的方法都类似。当熟练使用 Java 的多线程编程,并且理解线程的运作方式之后,要用其他语言实现多线程编程,只需要查看 API DOC 很快就可以写出多线程代码。类似的概念还有网络编程,内存管理,进程间通信,设计模式等等。新技术层出不穷,但基本原理却发展异常缓慢,而且基本保持不变。
今日推荐
那么问题来了,怎么样提高这些能力呢?作者没有给出答案。hackerrank 是个不错的选择,长期练习一些有趣的算法题是对这些能力的培养很有帮助。