软件能力,教的会吗?

 软件能力,教的会吗?

 

        这年头,做个软件开发人员可真不容易,说你会编程序,也别怪别人不把你当回事儿,因为那是基本功,必须的。还有基本的数据结构知识,队列、链表、栈等等,这些都会了算是程序员了吧?不算,只能算是“码工”,接下来要了解的东西多了。《编译原理》和《操作系统》这两本书要看一下,还要了解一些基本的软件理论,什么面向对象思想、高内聚低耦合、SIP、OCP、DIP...,总之,Martin和Uncle Bob的两本经典著作也是必须要看。看完之后觉得可以进阶了吧?且慢,还有设计模式,了解吗?不知道就快看GOF的那本经典吧,也是必须的。以上都了解了?那么恭喜你,你入门了。是的,你没看错,我写的确实是:“恭喜你入门了!”
        想贴个“高级程序员”的标签吗?编程语言要深入了解,就算不是精通,至少也不能随便就被人问倒吧?《计算机程序设计艺术》至少要看看卷一和卷二,给个算法要能分析个时间复杂度啥的,不能含糊。基本的软件工程思想也要有,《人月》和《人件》必须要看看。还得懂点软件过程管理理论,CMM(I)有点老了,流行的敏捷理论要了解,目前最流行的也就是极限编程、scrum那点事儿,什么TDD、BDD、FDD、DDD...,你还别晕;故事墙、白板、每日站会、结对编程...,就算没做过也要知道是怎么回事儿。还要提高设计能力,懂点UML,UML这玩意儿争议比较大,但是谁的设计文档里要不弄几个类图、序列图啥的,都不好意思说这是设计。
        想要“资深”一点?继续看书吧,《计算机程序的构造和解释》(SICP)、《深入理解计算机系统》、《离散数学》、《与熊共舞:软件项目风险管理》、《敏捷软件开发》(Cockburn那本)......
        要想成为专家级的开发人员,还要深入了解所在行业现状与前景,精通相关领域的专业知识....
        除此之外,作为软件开发人员,要非常熟练地使用至少一种开发工具,要非常熟练地使用至少一套Office系统,要非常熟练地使用至少一种版本控制工具,要非常熟练地使用至少一种操作系统,要非常熟练地上网和使用搜索引擎......
        想想,做为软件开发人员,容易吗?需要什么样的信念和毅力才能支撑着一个人看这么多书,了解这么多知识?答案就是:兴趣+能力!是的,兴趣是关键因素,此外还有三种能力也不能或缺,后面会介绍是哪些能力。
        尽管很多人不服气,但我还是要说,编程序真的很需要天分,Joel Spolsky在《给软件开发人员的七个建议》一文中也提到过:“如果你喜欢编程,那么你真是受到了上天的眷顾”,我想这是同一个意思。我所说的这个“天分”和智商没有任何关系,其实就是对编程的兴趣,兴趣这东西只能通过引导自主产生,不能教育一个人有什么兴趣,更不能强迫一个人对什么感兴趣。一个人对编程有没有兴趣在他第一次编程的时候就知道了,接触的时间长了也会产生一点兴趣,但都是自发的、主动产生的,这点兴趣真的不是通过教育能灌输的。
        有人总是强调沟通能力和团队合作能力,还有责任心,但是在我看来,这些都是辅助能力,能够大学毕业,甚至拿到研究生、博士文凭,基本的沟通能力和与人合作的能力是具备的,这方面的能力再强一点只能算是锦上添花。至于责任心,这是一种职业精神,任何一种职业都需要责任心。我认为软件开发人员最重要的三种能力是:逻辑思维能力、学习能力和独立解决问题能力。逻辑思维能力是基础,想想计算机处理问题的方式和人类的差异就知道为什么这种能力是基础了,学习能力和独立解决问题能力是相辅相成的,因为独立解决问题的能力是通过学习新的方法和知识获得的,这体现了学习能力。以上三种能力的培养是一个长期的过程,不是去上一门课或参加个什么培训就能瞬间拥有的。
        我曾经参加过一个提升软件设计能力的培训班,课堂上老师精心准备了很多好的设计方案的实例,好处一一讲解,学员们听得心潮澎湃,频频点头,感觉很有收获。但是培训的最后一天要自己实现一个设计方案的时候,多数人还是觉得不知所措,有的甚至还坚持着错误的理念。这是老师的问题吗?不是,老师都是软件设计领域的专家。那原因在哪里?原因在于方式不对。软件设计能力和其它众多的技术行业一样,是“悟”出来的,不是教出来的。好的软件设计的原则都是通用的,不好的设计通常是违反了某些原则,这些软件设计的原则是可以教的,也是很容易学会的,但是自身的设计能力就只能自己觉悟了。悟的过程是一个自己归纳整理的过程,结合自身的实践,对比好的设计和不好的设计,体会好的设计遵循了哪些原则,不好的设计违反了哪些原则,最终悟出“道”之所在。
        软件开发人员的培养应遵循两句话,一句是:“兴趣是最好的老师”,另一句是:“师傅领进门,修行靠个人”。在我参加的面试活动中我通常会问应聘者一个问题:你是否给自己写过代码?如果有就举个例子?这要比直接问应聘者是否喜欢编程更有效(这样问容易被欺骗),一个对编程有兴趣的人工作之余不自己写一些代码是不可思议的。对编程不感兴趣的人入了软件开发这一行真是一种煎熬,有那么多知识要学习,不学习就只能在金字塔的底层徘徊,随着年龄的增长慢慢被淘汰,但是要强迫自己学习不感兴趣的东西也是很痛苦的事情。社会不应该对软件培训机构有太多指望,通过培训顶多只能把一个人带到“码工”的级别,很多培训机构用虚假的广告和根本不可能的高薪职位做诱饵,把很多没有兴趣的人培训成“码工”,引入了软件开发这一行,自己赚到了钱,却把这些人推向了痛苦的深渊。软件培训机构总是宣扬说软件开发领域多么地缺人,动不动就有到某某年会有多少多少人才缺口之类的言论出来,但是我在这一行这么多年的感觉恰恰相反,至少在中国,软件开发人员不是太少,而是太多了。
        优秀的软件人才都是自己成长起来的,在成长的过程中如果有个好的师傅带领一下,真是一件非常幸运的事情。至于现在的高校和培训机构,还是别指望了,至少现在不能指望它们。

你可能感兴趣的:(设计模式,数据结构,编程,敏捷,开发工具,UML)