在中国程序员的职称多种多样,但都会有软件工程师和高级软件工程师之分,这两个实际上和考试,个人能力毫无关系,只是公司设置的一个职位。
记得我2006刚进第一家公司时,当时的职称就是软件工程师,这个职称和我当时几乎什么都不懂只会写几句C代码的能力实在名不副实。过了三年,有一次需要对外提起职称时,我的职称就自然变为高级软件工程师。软件工程师和高级软件工程师之分实际上是个人熟练程度产生的。
我对于代码质量这个概念是从自己参与的项目中逐渐学习到。
刚开始工作时,我学习php刚入门,这样要求的代码质量就是实现功能,例如我的一个工作代码就是连查询数据库。这个就是《代码质量》里提到的质量功能性。
我的上司那时带领我逐步接触项目,他给我下完第一个任务后,我完成后,他审核我的代码。我当时还很高兴这么快完成任务。但是他看完后,虽然我完成了任务,给我提了三个问题
虽然就十来句代码,但是没有注释,可读性差
我没有执行mysql_close关闭数据库连接,虽然php会自动关闭,但是不用时就应该关闭。
没有异常处理,mysql_connect失败如何处理,mysql_query查询失败如何处理。
我看了他发给我的代码规范之后,看完之后不以为然,但是还是照着做了。直到半年后我参加开发symbian S60软件项目时,才知道代码规范的重要性,因为Symbian SDK(Nokia的手机系统)的代码不开源,我们只能通过阅读API的注释去使用API.
Mysql数据库连接用完即关的道理,直到我独立做一个项目时才明白这个深刻的道理,这个项目并发性非常高达到124 rps(request per second),当时就我写的一个php程序都搞到服务器几乎挂了(出现了非常多提示”Too many connections”),直到我把mysql_connect从页尾移动到查询完后立即关闭然后再执行运算。其他一切资源应该都是用完立即销毁,以免占用过多的资源。
异常处理是必须的,比较懒的人比较粗暴地把所有异常都归到一个错误提示,殊不知会导致查询错误源非常困难。
工作两年后,随着我对程序的熟练程度飞快增长,我由于工作需要也学习了很多编程语言例如java,c++,perl,asp,shell,javascript等。了解了各种语言各自的特性后,我对于编程这门手艺有自己的理解,要实现一个功能,前期的设计决定了功能性,编码可以考虑用不同的语言,哪种方便就使用哪种,甚至于可以使用两种语言组合、各取长处。最终决定是否成功是由代码质量来控制。代码质量不好的话,会出现无尽的bug修复,甚至出现返工的现象。
《代码质量》中提到效率,效率中有时间特性和资源利用,我在开发智能DNS时就遇到这样效率问题。
我第一版设计是满足功能性,当时把一切安装数据库标准设计好,做出了原型。测试出功能性满足客户要求。
但是客户要求的并发性是8000rps,响应时间是2ms.我的原型测试结果才3000rps.
为了达到这个要求,我第二版设计思想是以空间换时间,于是对于每个域名的记录我全部放到内存,直接关联IP库,这个等于说每个域名有自己的IP库。这样能够达10000rps,已经到客户要求。但是测试单个域名内存达到128MB,也就是说一台4GB的机器只能32个域名,太少了。
这时时间和空间出现矛盾了。
于是我冥思苦想想在时间和空间中间找个平衡点。最终我在IP库自身的特性上找到了方便查询IP库的算法,把单个域名的内存进行压缩,提取共享内容。最终我用更复杂的查询算法在时间和空间中找到一个平衡点,实现了客户的性能要求和数量要求。
对于《代码质量》中提到的程序可以移植性,实际上我没有怎么考虑这方面,一般我们开发平台和运行平台都是linux+ apache+php+ mysql、linux+C+mysql或者linux+Tomcat+java+mysql,这些软件都是开源,移植性都非常好。
我随着项目的变化,开始是从比较低级语言譬如C,C++开发,逐渐向中级语言perl,shell,再向高级语言php,java,javascript转移。对于代码质量的考虑,我也从功能性,到效率性,到安全性,易用性,扩展性方面考虑。
这几年计算机硬件在迅速发展,cpu速度越来越快,内存和硬盘等资源越来越廉价。
而同时程序开发框架越来越多,已经出现了代码生成框架,这种框架能够生成我们所需要的大部分功能甚至于安全性都已经生成了,但是这种程序只是考虑功能性,没有考虑其他质量特性例如效率,特点就是快。
各种cms系统遍地开花,我们不再需要开发一个前后台了,只需要用cms填充页面元素就可以在一两天就生成一个网站。
现在android和IOS的手机软件的兴起,人们更多的追求的是趣味性和酷炫,手机开发人员花大部分时间在于软件的界面美化。
而我们的客户要求今天提需求,恨不得明天就上线,对于网站的要求也就是比较炫,比较酷,有功能就可以了。
我负责招聘的过程中发现现在的程序员比较浮躁,面试的基础sql语句不会,基本语法精通。就会使用各种IDE例如Microsoft Visual Studio 2008或者java框架配置,连接数据库都是通过Hibernate去连接完全不知道数据库执行的SQL语句。但是这些人实际上只要懂得会用cms就可以自己搭建一个网站。
我开始有疑惑了,是不是我这几年积累的代码质量的经验就没有用了?一个1年经验的初学者就可以很轻易使用cms系统搭出一个很炫的网站。网站可以不用考虑效率,只要买一台好配置的机器即可,反正现在硬件很便宜很高性能。对于代码质量的要求,完全由cms自己解决了。
从去年开始管理公司的一些cms系统的项目和一些使用框架做的项目开始,我逐渐解除疑惑了。
首先cms系统不是万能的,虽然使用了cms系统能够快速搭出一个网站。但是cms系统本身带来的问题也不比开发简单。首先cms系统本身也是软件工程师开发的,本身有各种bug,例如语言混乱,缓存交叉出错,由于cms系统后台偶尔有损坏的节点等等。技术部光是维护cms系统带来的bug就得投入2个工程师专门解决。其次我们所用的cms太庞大,我们光靠官网的文档无法了解其内部结构,若是我们想加一些我们自己的扩展或者自己特有的功能,这时发现难如登天,源代码虽然在手,阅读量太庞大。
其次cms系统的安全性是否够?一般的cms系统都会对sql注入进行处理,但是对于xss攻击基本上都没有做处理,我们在前台的页面都得自己做安全性处理。
今年我交给一个下属程序员做一个考试系统,做完后在第一次模拟考试系时,没有抗住并发2000人的请求,服务器挂了。于是我仔细阅读他的代码,发现了几个问题:
1.使用了mvc框架,使用mvc框架对于网站框架无可厚非,但是这是一个并发非常高的系统,而php的mvc框架完全靠apache的urlrewrite完成等于一次请求变为请求多次(请求先交给index.php,然后交给action,最后交给view)。
2.我们数据库使用的redis,redis并发2万/秒应该没有问题,但是在考试系统中出现了连接数太多的情况,检查发现每次查询都打开一次数据库连接,而没有关闭连接,这样一个php里打开了多个数据库连接。
3.相同的数据重复从数据库里取,不共享。
针对这3点,只能把代码重写,能够重用的是功能性代码。
到了真正考试时,服务器负载非常轻。
对于javascript这种运行在客户端的程序也要考虑代码质量问题。我有一个项目需要用到自动完成功能,开始时,我是用jquery的插件autocomplete的,发现在IE下最多能够支持300个下拉选项(模拟的下拉框),多于300个IE基本上是假死状态,用户体验非常不好。找了多个都是有相同的问题,于是我自己写一个,用标准的下拉框可以减少浏览器资源消耗,对于每次输入的字符进行判断,若是输入和上一次则不查数据库,每次查完就缓存,若是本次输入的字符包含上一次字符,则可以在缓存里查找。
随着代码经验的丰富,我有一次重新读我以前写的自以为写得非常好的代码,发现原来非常复杂的功能可以用几行代码就搞定了,非常清晰和简洁。也就是说以前觉得质量很好的代码,当重新换个时刻换个角度思考时,有可能会发现更好的解决方法。没有质量最好的代码,只有代码质量不断优化,否则就不会出现程序的版本管理了。
无论以后科技如何发展,如何智能化编程,我始终认为质量管理不会过时。