再谈程序员思维

http://blog.sina.com.cn/s/blog_493a845501017nqr.html

关于这个话题前面已经谈到过不少,再做一些必要的总结,思维和技能一直是每个人最重要的两个方面的内容。有时候是知识和技能的积累,推动了思维意识的转变;有时候又是转变了思维意识后加速了知识技能的积累。这个关系很类似渐修和顿悟的关系,渐修到一定程度后顿悟,而顿悟后还得不断实践和落地。

将思维有点类似经验性质的东西,没有基础的技能积累讲经验没有用,而有了一定技术积累后停滞不前的时候,思维的转变就相当重要了,走到一定的深度再往下走难,很多时候已经不是单纯的实践和技能的问题,而是思维的问题。思维意识不转变,再多实践也没用。

软件开发是一种高智力的劳动,而非简单的代码堆砌。说了很多年的软件工厂,到现在来看离这一天还很遥远。很简单,如果程序员完全是蓝领,是代码工人,那么程序员的工作就应该完全可以被机器代替,但是短期来看是不可能的。在软件实现过程中有很多自动化的工作这不否认,但是要完成现实世界到抽象代码世界的自动化翻译,程序员的思考在里面却起到很重要的作用。代码可以自动生成,但是建模过程很少听说也可以自动生成。

言归正题,说下个人对程序员应有的思维习惯的理解:

自动化和复用

个人感觉这是作为一个合格程序员的最基本的思维意识,对于完全重复东西的自动化这个很多人可能有这个意识,但是这个还不够,更加重要的是对于虽然不是完全重复,但是存在共性的东西也能够自动化和可配置化。没有完全一样的事物,关键是我们要能够找到共性,识别差异,把差异的东西转化为入口参数或可配置项,以这种方式来完成自动化。

很多时候我们发现的就是程序员不思考,天天说自己做的东西重复没新东西学习,但是从来却不会看自己每天重复做的事情能否自动化掉,天天不断的粘贴拷贝,搜索替换也绝对不去想能否从繁琐的不增值工作中解脱出来。有时候我们谈程序员的勤和懒,重点就是要勤于思考,而懒于做重复性的东西。

自动化我们可以看做是一种复用,而复用有更深更广的含义,特别是在项目和团队内,复用核心是任何相同的事情不重复做多遍,我们将软件开发中共性的内容全部提取出来只做一套供所有人,所有模块使用。这一方面是提升开发效率,统一规范标准,另外一方面是后续运维和变更的便利。复用本身又分为组件级的黑盒复用和代码函数级的白盒复用,我们需要的往往是黑盒复用。黑盒复用可以进一步加强我们组件化和接口的思想。

抽象和接口

软件开发本身要做的事情就是现实世界的需求转化为软件世界里面的应有程序。这里面的一个核心就是抽象,有了抽象思维才有了业务建模和系统建模的基础。包括面向对象分析和设计中的类,就是抽象的体现,有时候类还不够我们又进一步抽象到接口。

现实世界我们看到的都是一个个的实例,而软件建模我们是要抓住对象的核心。只有先识别出关键的对象,才能给进一步根据现实世界中的活动去分析对象应有的行为特征。

封装,继承和多态,讲的是面向对象的基础思维。封装本身很重要,一个对象时封装,一个组件也是封装,封装本身是应用系统模块间高内聚,松耦合思维的落地。除这个外,更加重要的是抽象,类和继承是抽象,进一步的抽象是面向接口的编程思维。如对象间交互通过接口,组件交互通过接口,通过接口来实现组件和对象间的解耦。

技术狂热和客户价值

把这两个词放在一起说是两者都很重要而且都不能忽视。一个程序员必须要有对技术的兴趣和狂热,有的程序员认为他们只不过在依葫芦画瓢,而有的觉得每天都在创造和改变。程序员的核心价值不在于已有模式下问题的解决和实现,而在于面对新需求下新模式的建立和解决。而要达到后面的能力,一个核心就是对技术的兴趣,对技术的执着和刨根究底。确实现在很多东西已经不需要我们从头创造,而更多的是一种微创新,但是这种创新更加重要,需要的是不断的思考和技术的积累。很多时候不能等到新问题来了才发现自己很多技术都没接触过,而是平时就关注新知识和技术的积累和学习,一到新问题来了只是这些新技术的融会贯通和实践而已。

对于解决关键技术问题同样如此,一个关键技术问题的独立解决比你开发10个功能往往更加有意义,但是我们很多程序员一看到技术难题就往后面躲,没有一种攻克难关誓不罢休的态度。你没有独立解决过关键问题,那么很多经验你就一直掌握不了,一直只能做低层次的工作。拿我自己来说,虽然已经很多年没有写代码,但是关键技术问题一来,往往有一种兴奋感,有一种攻克不下睡不好觉得急迫感,会反复的思考问题本身,思考的方法,解决的途径,假设和验证的过程等,这些思考会将你很多知识全部融合起来。

技术狂热本身又不是痴迷于技术,技术本身没有价值,技术的价值体现到软件最终为客户服务而带来的价值。所以很多时候技术狂热者思维又走到另外一个极端,即技术主导而非实现客户价值主导。要知道我们不是做一个应用了各种先进技术的玩具,而是要做一个对客户实用的产品。产品本身可能并没有实用最新的技术,但是产品被客户使用,提升客户管理和效率,这才是最终的价值。

程序员第一思考的是掌握了一种新技术,但是更加重要的思考是这种技术能够应用到产品里面,这种技术确实是为了解决客户需求或产品需求服务的。一个技术难点的攻克,到一个产品核心功能的形成还是很长的路要走,为了技术而技术,完全脱离产品和客户是一定要避免的。简单来说,我们思维模式应该是需求需要我们使用哪些技术来解决,而不是有什么新技术不管需求如何都一定要用进去。包括我们谈的过度设计,为了模式而模式等都是同样的道理。我们看到太多应用了新技术,先进的开发框架而导致产品失败的例子,必须要能够得到警示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值