说句心里话,作为一名软件开发工程师,我特别不喜欢被别人称为码农。因为我觉得这是在贬低这个职业,至少从从业资格来看,不是任何人都可以做软件开发工程师的。哪怕你不是相关专业,至少你也要是一名大学毕业生(那些逆天的存在都是小概率事件),并且你自身要非常热爱编程,再或者是你经过相关机构的培训,才有可能真正从事这个行业。聪明的你也许会说,有从业资格又怎么样,砌墙也是一个技术工种,好的砌墙技术人员收入也是很高的。说到这里,我们就要说说砌墙和编程行业的本质区别了。
最近看了万维钢老师《精英日课》中的一篇文章,文章标题是——软件开发的六个经验。其中提出了软件开发和砌墙的最本质区别:
每个软件都是新的。程序员是个永远都在做新东西的职业。他们真不是砌墙,他们就好像搞艺术创作一样,讲究手艺。
是呀,做了7年软件开发工程师,想想自己做了这么多的功能模块,虽说确实是有很多功能是相似的,但是好像真没有说你接到了一个新功能,可以把原来的功能原样拿过来就可以用的。因为使用的场景在变化,使用的人在变化,总是会有新的需求。所以说每一次的功能开发,总是会有和原来不一样的地方。
除了上面的最本质区别,软件开发还有不少自身的特别,下面我会结合《精英日课》中的这篇文章和自身的开发经验,给您详细的介绍一下软件开发的一些特点。如果你是行业外的人,希望您能对这个行业有一个新的认识,如果有幸您就是一个编程人员,则真正的希望您把自己作为一个有追求的开发工程师。
1.重要的事情说三遍——算法、算法还是算法;
如果说程序员是一个讲究手艺的行业,那看一个程序员手艺高不高,就要看这个程序员掌握了多少算法,以及对掌握的算法运用是否熟练了。这就是为什么几乎所有的公司在面试的时候,都要考察被面试者的算法功底。也许被面试者在以后的工作中,永远都不会用到被面试的那些算法题,但面试者知道,算法的功底,是这个程序员以后写出真正优秀软件功能的基础。因为同样一个功能,一个好的程序员能够用最少的代码,完成效率最高的实现,这就是算法的作用。
学习算法是一个痛苦的过程,它需要一定的数学基础,还需要不断的练习。从自身这几年的开发经验来看,我觉得判断一个好的程序员是否能够被称为工程师(工程师是一个高大上的称谓,是我们自己把这个称谓用烂了),就要看他有没有工程师精益求精的精神。因为,同样一个功能,使用更好的算法和数据结构,效率是可以提高很多的,尤其是使用场景发生变化时,好算法的重要性就更突出了(比如数据的数量级一下增大了好几倍)。
算法就是一个程序的灵魂。对于一个软件来说,美不止是前端的UI设计,简洁的逻辑是一种美,漂亮的解决思路也是一种美,编程的美更多在于后者。
2.软件开发是一个需要“投掷想法”的行业;
干了这么多年的程序员,开发功能的时候有一个惯例,就是当你功能开发的差不多的时候,你的成品要给领导看看。以前一直觉得给领导看看无非就是汇报一下自己的工作,让领导知道我的工作在计划内的时间完成了。但看了这篇文章之后,我领悟到其实不是这样的,给领导展示功能最重要的地方在于——你的软件需要领导“投掷想法”。
一个好的技术Leader,他也许也还在编程,但他在团队里更重要的角色应该是投掷想法。
一个是向自己团队内的成员,一个是向使用这个产品的客户(演示和推广)。向自己团队的程序投掷想法,重要性不言而喻,尤其是对于一些刚刚入职的程序员,一个好的想法和解题思路,能让他们节省很多的开发时间。而向客户投掷想法,则决定了这个产品是否能够真正成功。他要给使用这个产品的客户打电话,把产品的功能和进度向用户进行介绍,当产品开发的差不多的时候,他要向用户演示和推广产品的功能,把产品的实现的功能和想法投掷给客户。可以这样说,一个产品是否真的好,也许就看Leader是否可以把这个产品实现的想法投掷好。
看完上面的解释,我觉得您应该认识到:
大部分的程序员也许就是一个程序员,但是能够演讲而且统筹大局的程序员,那绝对是逆天的。
所以说,如果你是一名程序员,在行业外要提高什么技能,应该有一些认识了吧。
3.开发一个功能,你永远无法估算它的实际开发时间;
砌墙是一个很容易估算完成时间的行业,因为它的工作速度是固定的,人手增加一倍完成时间就能缩短一半,但软件开发则不是。如果你的软件,新的功能特别多,特别是如果你要实现以前没有做过的功能,那就更是每个人都是第一次做。没有人能够预期中间会有什么困难,没有人估计需要多长时间做完。
其实影响实际开发时间的因素有很多,即使新的功能不多,项目的需求有时候也会改变,而更多的则是增加功能需求,或者是有些需求之前低估了难度。另外,开发过程中经常会出现一些无法预料的问题,比如出个BUG之类的,或者是需要学习新技术才能够完成等等。
基本事实是,时间永远是不够的。正是因为软件开发的不确定性,软件开发其实就是一种不可能量化的工作。
以上就是我对软件开发这个行业的认识。也许说不上是正本清源吧,但是我从心底里觉得,程序员应该把自己的行业看的高大上一些,去磨练自己的心劲,真正成为一名有理想,有追求,并且有精益求精品格的软件开发工程师。
我是徐建航,这是我写的第26篇文章,欢迎你加入007社群,七天写一篇,一起写七年,七年之后一起去南极。