二十多年前,刚从大学毕业,对软件开发认识非常有限,掌握的技能也不多。
第一份工作
第一份工作是搭建一个BBS论坛,模仿当时流行的三夫户外论坛。
那时,对知识如饥似渴。由于买不起书,我常常去书店找到相关的ASP书籍,用钢笔将代码抄写在笔记本上,第二天再输入到电脑中。结合手头的书籍,认真学习ASP,虽然辛苦,但那段时光充实而愉快。
在这份工作中,我设计了一个不限层级的论坛帖子浏览树结构,这成为我职业生涯中引以为豪的成果之一。采用添加层级号和动态分级的方法来实现。同时,这也是我第一次接触**.NET和C#**,并学会了安装和初步使用,为后续的技术发展奠定了基础。
第二份工作
第二份工作是开发一个综合钻井平台,也是第一次在真正的项目中从事客户端开发。
印象最深的是我们团队曾在大山里进行封闭开发。
在这段时间里,重新阅读了数据库相关的书籍,加深了对数据库的理解。
后来,参与了对日外包项目。外包软件的要求非常严格,甚至包括Excel的格式。在这期间,我的Excel水平逐渐提高。
对日开发的流程非常正规和严格,我用心学习和体会,对计划、量化和评审有了深刻的理解。例如,做计划时要有计划时间、实际时间以及两者的差距;写代码时,错误率是可以量化的;评审时,要先了解上下文,按照上下文进行评审,评审后要有跟进;如果出现问题,除了解决当前问题外,还要排查是否有类似问题存在,找出来并解决,不要留到以后。这些经验在后来的CMMI3认证中起到了很好的作用。详见博客CMM的感想和对CMM的理解。
在做对日外包期间,对Excel和Word的使用更加熟练。印象比较深的是,对日外包要求写详细设计,并且要求写单元测试。
当时对单元测试不太理解,甚至对私有函数都进行测试,想尽各种办法测试。现在回想起来,虽然有些脸红,但这是我成长的必经之路。后来,对单元测试有了深入的理解,并将其视为开发人员的“登山杖”。在多个公司中,即使我不是唯一的单元测试倡导者,也是少有的实践和推进者。
面向对象编程的启蒙
在此之前,对面向对象编程的理解还很浅薄,写代码时往往是想到哪写到哪。接下来的几年中,我逐渐对面向对象编程有了深入的了解,并开始关注软件开发过程和业务。
代码生成器
工作几年后,第一次接触到了代码生成器。当时的工作主要是使用C#进行增删改查操作,代码生成器非常有用。于是,主动维护这个工具。在此后的十几年中,我逐步完善和丰富这个代码生成器,从中学习到很多技术,也得到了很多感悟。我将这段经历整理在回顾我的软件开发经历:我与代码生成器的涅槃之路。
编写代码生成器时,《C# Primer Plus》这本书让我受益匪浅。边读边用边思考,有时想法走在前面,再通过阅读寻找技术支撑;有时阅读走在前面,再从代码生成器中找到合适的使用点。这种阅读体验非常奇妙。
通过编写代码生成器,对重构有了深入的理解和实践,并在此后的工作中成为重构的积极实践者和倡导者。
在这段时间里,还有几个让印象深刻的事情:1. 试图理解和编写详细设计,这是当时的理解和感悟对详细设计的理解,后续还会对详细设计有新的理解和感悟。2. 试图理解和编写概要设计对概要设计的初步理解。
敏捷开发的实践
这段时间,正在阅读《敏捷软件开发:原则、模式与实践》,结合工作中的感悟,感觉这本书说得太好了,很多问题与我们的现实非常相似。推荐同事们一起阅读,并尝试在工作中应用。我们先实现无逻辑的前端页面,实现跳转。通过前端页面的演示,我们对业务有了深入的理解,再实现功能,取得了很好的效果。
这段时间,也尝试带领团队做业务,感触最深的是接触客户、抓住业务重点,这是驱动团队的有效手段。坐在办公室研究竞品,也需要用心,带着想法去研究,多交流,否则会流于表面,团队也会很被动,没有动力。这是当时的一些思考软件开发中的一些想法。
书籍的影响
开始阅读一本对我影响很大的书——《程序员修炼之道--从小工到专家》。当时看这本书时并没有太多收获,但在未来的几年里,会反复阅读这本书。在工作中,书中的很多观点会不自觉地浮现在脑海中,例如:石头汤与青蛙、DRY原则、正交性、不找借口等。
这段时间,我还阅读了另一本书《.NET框架设计:深入理解公共语言运行时(CLR)》。通过阅读,我对.NET有了深入的理解,掌握了MIL、垃圾回收机制、.NET内存布局、反射、程序集和元数据、异常处理等。现在想来,这本书对我的ORM框架帮助很大。
此外,我还阅读了《数据仓库》,感觉写得很好,很有收获。虽然在后续工作中并没有实际应用,但它的很多思想在我设计数据库时不知不觉地用上了。我还为自己写了一个记录花销、分析花销记录的程序,很多设计思路就来自《数据仓库》。
国家级预研项目
接下来的工作是一个国家级预研项目,类似于现在的高德地图导航。通过综合道路、交通、天气、施工等各种信息,为出行者提供精确的出行指导。
那个时候还没有滴滴和高德。系统非常复杂,各类数据也很多,最初搞得我焦头烂额。
后来,想起大学时学到的管理信息系统中有类似的部分,于是重新阅读了管理信息系统的课本,发现其中的数据流图特别适合梳理系统。
尝试为这个系统画数据流图,虽然现在想来画得并不好,但当时我用这个图理清了业务,也设计了系统,感觉非常明了。
同事们对此也非常肯定,认为我前一阵工作进度不明显,用了数据流图后,效果显著,能够清楚地跟别人讲解做什么、怎么做。这是一次非常好的体验。
C++的初次尝试
在做这个项目的过程中,我需要编写一个导航程序,这是我第一次使用C++。导航程序是用C++写的Windows程序,有界面,但没有使用MFC。
我根据自己编写代码生成器的经验,使用面向对象的方法,写成了一个类似MFC的程序,通过配置文件配置界面,通过继承和观察者模式处理事件。在当时看来,还是比较满意的。由于初次使用C++,很多技术不太懂,经常请教其他同事,也拿这个程序与同事交流,得到了同事的肯定。
在这个程序中,面向对象编程发挥了它的效力,但也有一些问题我当时没有理解到。记得聊天时,有同事说他现在喜欢写类似的C程序,感觉看起来流畅,不喜欢C++的跳来跳去。当时我不理解,现在有了新的感悟,虽然不完全赞同,但不过度使用面向对象观点是正确的。在后来的工作中,我会有意进行尝试:使用面向对象;不使用面向对象;接口不使用面向对象,实现不刻意回避面向对象等。
这段经历让我深刻体会到,技术的学习和应用是一个不断探索和调整的过程,每一次尝试都为未来的成长奠定了基础。