浅谈设计模式和面向重构编程
这两天面试被问到了什么是“设计模式”,作为野路子码农,我不知道什么是设计模式,只知道 MVC 等软件架构,既然被问到了,那就了解一下吧。看了几个模式后我发现,其实在平时写代码的时候已经用到过部分模式了,只是当时并不知道而已。
关于设计模式,已经有各种专业书籍和文章了,我就不在这里献丑了,只谈谈对于“什么时候应该学习设计模式”的看法。
初学编程你根本不需要知道什么设计模式,甚至连 OOP 是什么都不需要知道,写个 hello world 都要了解什么是设计模式,简直是本末倒置。作为程序员,你当然需要知道什么是设计模式,但是当你连怎么写一个通用框架都不知道的时候,甚至是连没有隐藏 bug 的代码都写不出来的时候,又何必去背诵设计模式的定义呢?当你已经用过各种主流框架,看过其代码,即便是不知道什么是设计模式,一个框架运行原理也能大致清楚的时候,才应该去学习设计模式,因为这时候,你已经不需要去背各种设计模式的定义,也能写出符合某一设计模式的代码了。多写、多读代码是学习设计模式的最好方式了。
因为刚接触编程的时候在数据类型上吃过亏,年初去华大基因给冬令营的学生讲 Python 的时候,写完 hello world 我就跟学生讲起了 Python 的数据类型,然而台下的学生并没有什么兴趣,最后我发现我竟然走了应试教育的老路,写个 hello world 需要知道什么是数据类型吗?写个 hello world 需要用到类型转换吗?学习编程,最好的方式是“站在巨人的肩膀上”,先去抄个 hello world,然后改改别人的代码,再造几个轮子,慢慢地你就能靠编程吃饭了。当然理论和算法也很重要,但回过头来再补也无妨。
我个人不喜欢用很重的框架,这些框架是能极大得提高开发效率,比如 Django 自带一个管理后台,直接调用就能省去写后台的麻烦,但这些框架也带来了一些我不需要的功能,限制了我写代码的方式。所以在个人项目中,我更喜欢用一些很轻的框架,自己实现想要的功能,也能提高自己的设计能力。当然在工作中我不会这么做,毕竟完成工作任务永远是第一位的。
虽然我是野生码农,但也写了三年代码,一般需求已经不需要想怎么去构建代码了。对于复杂的逻辑,如果一时想不出更优雅的实现方式,我会先完成需求,然后过一段时间再来看,说不定就有好方法了(也说不定需求改了或者 PM 把功能砍了 :P)。大部分时候,重构代码并不能提升程序运行速度、提高用户体验,反而容易出现新的 bug。但是作为程序员,重构代码使其更优雅是职业素养,无关用户体验。
前些日子我花时间简单研究了一下编码问题,其实大部分时候你根本无需关心 ASCII 跟 Unicode 有什么区别,只知道用 UTF-8 就好了,只有真的遇到编码问题的时候才需要去了解它。我碰到几家公司笔试或面试时问 HTTP status code,但估计我说 RFC 2616(现已被 RFC 7230——RFC 7237 替换),大部分出题的估计都不知道是啥。人人都有不了解的知识,像我面试时如果扯什么(非)对称加密、编码问题,甚至是生信相关(当然我不敢在生物专业的人面前扯,生信领域我也是半吊子)的话题,大部分面试官也只能点头,但我会尽量避免扯这些东西,因为公司招我是来干活、解决问题的,在工作不相关的领域有多深入又有何意义呢?所以面试时我尽量实话实说,问啥答啥,说些跟工作内容有关的东西。面试不过短短几十分钟的时间,很难全面地了解一个人的技术水平,所以“Talk is cheap. Show me the code.”。