我的软件开发经历和收获

05年毕业至09年,大多数时间是做电气自动化方面的工作。在工作的同时,我一直保持着对编程兴趣爱好。在工作之余,常常编写小程序,当作娱乐消遣。所以在09年,我经过深思熟虑,决定放弃电气自动化工作,专门做编写软件。在我辞掉工作后,开始了软件开发工作。因为之前我在电气自动化行业,所以软件开发也是面向这个行业。 在电气自动化行业的软件,一般叫做上位机,上位机的软件在通常情况下,没有复杂的算法,常用功能就是通过串口Rs232/485采集下位机数据(这基本上是必须的),然后在上位机处理,并界面以各种形式显示,比如动画、列表、曲线等。在我专门做软件开发后,名义上在朋友公司,而实际上是自由职业者,上位机开发业务,除了一部分是朋友介绍外,大部分都是我自己去谈、去承接。 我之前做编写软件只是兴趣爱好,并没有系统的做过软件项目。所以真正做软件的时候,遇到了很多难题,比如客户更改需求后,不容易修改相应的代码。在不同的项目中,实现相似的功能,总是重复编码。特别是在项目后期,无法控制代码,甚至整个软件需要推到重来。原来我以为写软件只要实现客户要求的功能就可以了,没什么难的,可真正做软件项目后,我才发现自己对软件开发的各个方面非常不了解,软件开发并不是这么简单。特别是因为自己做,只有在完成项目后才可以拿到“薪水”,所以经济压力特别大。“技术”和“业务”两头双重压力,让人真的很痛苦。 在“技术”和“业务”的双重压力下,我开始摸索软件开发真正道路。首先是,我开始重视面向对象和重构。,“面向对象”这四个字,早就听说过,可能是因为天天听日日看,感觉作用被人夸大了,不过就是些类和对象而已。其实则不然,面向对象的作用是通过封装、信息隐藏,对软件进行解耦(内聚、模块化等词内涵应该于此相似)、代码重用,以降低软件复杂度,并最终保障软件可以按期和高质量完成,并且软件功能正确、运行可靠、代码是易于维护的(当时我没理解这么深入,只是觉得面向对象很重要,不过我想软件工程的其他技术也应该是这个目的)。面向对象有一个难题,如何抽象出一个类,一个类应该代表怎么事物,一个类应该有什么的属性、方法。在学习同时,我不断在项目中实践。通过学习和实践,我注意一个词——”抽象“,这个词有让我豁然开朗的感觉,也就是说,一个类应该是抽象的,不一定要代表实际的事物,一种行为或活动,只要是一种抽象就可以是一个类. 在学习面向对象的同时,我也在学习重构。因为我在项目遇到修改代码困难的难题,学习重构技术是很自然的。当时我在对代码无法修改而困扰时,非常欣喜的发现了重构。重构非常有用,因为根据热力学原理,一个不加管理的系统,最终会走上混乱(熵增加),这也是代码最后修改困难的一个原因,而重构给了整理优化软件代码的方法和机会。在学习重构的过程中,很自然的会问一个问题,重构的目标是什么?所以我又发现了设计模式。当我把这些技术应用到项目中的时候,工作很轻松了。 面向对象、设计模式、单元测试、对接口编程等技术最终目的,都是代码重用、降低复杂度。我感觉软件工程在微观上主要是这些内容,其他的还剩下一个就是软件架构。好的软件架构应该是稳定的、简单的、可扩展的。 同时还有一个更重要问题,一个软件功能即使再好,但是客户不需要,那等于做了无用功。所以软件必须满足客户的需求。在和客户沟通发掘客户需求中,我发现快速原型法,是一个很好的办法。有时候,客户自己也无法说清楚自己到底需要什么样的功能。开始根据客户的大体描述,迅速开发一个有简易功能的软件(不宜做过多功能,尽量用少量的时间,否则就失去快速原型法的意义了),然后发给客户,让客户确认是否可以满足要求,客户往往能提出更多的要求,如果客户还说不清楚的时候,很自然的会询问客户的目的什么,然后可以很自然向客户建议(这相当于掌握了一部分主动权)。等客户意见反馈后,根据客户的意见,捡主要的自己认为不会变化的需求完成(不必完全完成,因为客户的要求往往还会变化,这不是他们的错,只是当时没想清楚而已),再让客户确认。如此反复,中间再运用各种面向对象技术,最终按期圆满完成软件项目。让自己和客户都得到满意的结果。 我认为,快速原型法的本质,发掘客户真正需求,减少或避免做无用功。因为软件行业最大的成本便是人力。有些我没说到的也很重要,比如编码风格、命名规则等。应该还有一大方面重要,那就是算法和数据结构。(因为我做的上位机复杂算法很少,所以没多大收获。)数据结构很重要,合理的数据结构,可以很好的降低软件复杂度。 最后我想说说“超级程序员”。我不知道这个世界上有没有真正的超级程序员,假如真有,他可以同时在几十个维度上思考问题,而且不会混乱,那软件工程对他来说,大部分没必要,除了代码重用外(即使超级程序员也要代码重用),因为不管软件再怎么复杂,他都可以从顶层抽象和底层抽象一眼看穿,任意修改代码而不会出错,那他不太需要软件工程。因为软件工程是这样一种可以弥补智力的不足的技术。

你可能感兴趣的:(我的软件开发经历和收获)