研究生参与项目经验谈

来源:互联网 发布:微信小视频模板软件 编辑:程序博客网 时间:2024/04/29 23:04

作为计算机专业的研究生,参加实际项目无论对于我们将来找工作,还是从事科学研究,都有着非常重要的意义。这个过程不仅可以提高我们的软件开发能力,同时也是对我们多年所学专业知识和能力的有效检验,让我们这些涉世未深、经验尚浅、知识结构不够清晰、但同时有些自负或迷茫的研究生们对自己的知识水平和技术有一个更加清楚和认识。下面是本人在一次不成功的项目开发后的一点点心得:

一、项目与用户需求脱节,或需求分析不充分,对需求变化的适应能力差。对于成功的软件开发而言,技术本身并不是最重要的,而是对用户需求的理解程度。大多数时候,用户需求无法在需求阶段就能完全搞清楚,而且用户也弄不清楚他们到底需要什么,即使一开始确定了用户需求,但到后来,比如维护阶段,用户的需求也可能发生变化。可以这么说,需求的变化本身也是一种需求,这可能是隐藏在软件开发中最具挑战性的需求,这要求我们对软件进行更具弹性的设计,使之尽可能地适应或最大限度地适应要求的变化,从而使后期修改及维护的成本更低(对于公司而言,高成本意味着更多资金的投入;对于我们从事软件开发的工作者而言,则是时间和精力的过多消耗,甚至在项目期限压力下心理力的更多支出,比如,排除错误或修改功能时的那种焦头烂额的状态)。也就是说,我们要能构造出可进化的,平滑地适应需求变化的系统,使得当用户提出新的需求时,少修改或不修改原来的代码,而仅仅是新功能的添加。这是我们的理想,也是我们努力的目标。由于我们一直以来太过专注于技术细节和功能的实现,以至于这方面的能力太差了。

二、编程陷阱多,动手须谨慎。每写一行代码,特别是编码和设计同时进行的情况(我们大多使用这种编程方法),我们都要想到,新增的代码既可以完成某个功能或解决某个问题,也可能带来BUG。虽然BUG在所难免,但要尽量减少它。单元测试在项目开发过程中不能忽视,并尽可能使用断言,这样会大大减少代码中隐藏的BUG。不要以为这样会浪费时间,会影响项目的按期交付,这些看起来附加的步骤所花费的时间比起将来在测试阶段排除错误所花费的时间,简直不值一提。而且从长远角度而言,这会使项目的开发效率越来越高,软件的质量也越来越好。当然最重要的,我们的开发水平也会有很大的提高,因为一旦这些优秀的实践形成习惯,它就会对我们软件开发的方方面面产生积极的影响。

三、要有一种无私的软件开发精神。不要认为我只要正确地实现了某个功能就算OK,一定要在编程过程中,哪怕是自己的小练习,都要想着自己写的这段代码是要给他人阅读的。如果代码可读性太差,别人就无法从中获取你的设计思想,也就无法通过代码进行有效的交流,当然也就无法对你的代码做出任何的修改或改进,而且其中隐含的错误也就难以被他人发现,最终这段代码会被当作垃圾扔掉。采用无私式的软件开发原则,有利于我们写出清晰、条理、可复用、易维护、易修改、组织良好的代码,从而提高我们的软件开发水平。

四、不要抱有“把一切BUG都留给测试阶级去发现和处理吧”的想法。这是典型的“短视”作法。在测试阶段发现问题时,因为开发者对自己所写代码的印象已经不像编码时那样清晰,所以也就不容易对错误进行定位并修改之。因此,尽量在开发阶段采用单元测试的方式去发现和修改错误。虽然这不能发现所有BUG,但会大大减少BUG的数量,从而大大减少测试阶段排除BUG所花费的时间,保证整个项目的进度。

五、只有做了非常充分的设计和严格的编码规范,以至于编码是一个机械的“组装”过程,才能用“卡时间”的方式来提高编码效率。其实,这已经不算做程序设计(编程)过程了,而是“输入”程序了。因为创造性的工作已经在详细设计阶段完成,所谓的编程阶段只是一个“组装”过程。在软件过程管理中个人软件过程强调编程速度,这是有前提的,前提便是充分的前期准备(充分的需求分析、详细而全面的设计)。对于我们这种很少做前期设计工作,即基本上是在编码的同时进行设计(类似极限编程)的开发方式而言,就不能用“卡时间”的方式来追求编程的速度。特别对于复杂的功能模块,更不能急于求成,一旦匆忙完成任务,将来所付出的代价将比这个时候多花些时间思考如何进行更好的设计大得多。“卡时间”的方式只能用于提高那些简单的重复性的、机械的任务的效率,但如果要进行设计或需要创新,这种“卡时间”的方式往往会导致拙劣的设计。

六、简单就是最好。尽量使用最简单的方式去组织程序,不要使各模块之间的交互关联过于复杂。同样的问题,往往有很多种解决方案,一般脑中最先闪出的解决方案并不是最有效或最简单的。动手之前,要多加思考,再三权衡,选择针对当前问题最简单最有效的解决方案,不要急于实现。要做到这一点,首先要对待解决的问题做出深入理解,在对问题深入理解后,好的解决办法往往就在脑中呈现出来了。

七、广泛阅读,善于创新。多看大师们写得书,从中学习优秀的软件设计思想。那样虽然不会立即给你带来具体的技术或解决问题的方案,但会告诉你什么样的设计才是最优秀的、如何思考和设计才能更简单更有效地解决问题。软件开发是一个充满创新的过程,这也是好多热爱创造的人选择它作为专业的原因。因为这种创新不需要太大的成本和过多的客观条件,只要有一台电脑作为工具和某种相关的技术(比如掌握某种编程语言)作为手段,就能将自己的创新变为现实。没有创新,技术水平再高,也只是一个熟练工,永远都是在做别人已经做过的事情,永远都是“代码民工”。在技术发展一日千里的今天,迟早会被淘汰。因为软件开发中的创新完全体现在设计之中,所以要培养创新能力,就要在整个软件开发过程中有意识地进行设计,勤于思考,学习和采用各种先进的设计思想并不断创新。只有这样,才能让自己在软件开发的职业生涯中立于不败之地。

八、为用户着想的同时,多为我们自己着想。完成用户所要求的功能,即实现用户需求,是为用户着想。也就是利用我们的技术为用户提供某种可简化其工作的服务。而良好地组织我们的程序、增加模块的可复用度、降低模块之间的耦合性,使之维护和修改更加简单,则是为我们自己着想,为自己负责(现在没有哪个软件就一旦交工,就不用管了,完事了),使我们的软件开发工作不至于太累乃至压力太大,因为平时如果我们注重设计,注重代码的模块性和可复用性,这些可复用的部分就可以用在类似功能的项目中,从而降低我们开发者的劳动强度。总的来说,代码的可读性、模块性,以及模块之间的低耦合度可以降低维护负担,对开发者有利;由于良好的设计对需求的变化响应快,用户的新需求能很快就能得到满足,对用户也有利。可以这么说,学习技术是为了解决用户的的问题,简化其工作;学习优秀的设计思想则是为了简化我们开发者的工作,同时也会增加我们的服务质量,使开发出的软件更加可靠,对用户需求变化的适应力更强。

九、不要在疲惫和高压状态下编程或修改代码,那样带来的BUG往往比解决的还要多。

十、关于学习对于我们计算机专业的研究生而言,学习还是主要任务。开发项目是为了培养实际动手能力,加深对所学知识的理解,最终目的也是为了学习。因此,在开发过程中,一定不要忘记学习这一目标。在每天的项目开发中,重要的不是我们解决了什么样的问题或实现了什么样的功能,而是从中我们收获到了什么。这就是说,在项目开发过程中,我们要尽可能采用好的开发思想和技术。虽然强调这些看起来会增加项目的开发时间,但对于我们学习优秀的设计思想、增加创造力、培养优良编程习惯有着极大的益处,而且会逐渐缩短我们日后开发软件的时间。可见,不是参加项目就一定会提高我们的开发能力,而是我们在开发项目的过程中,是否采用了优秀的、已经被实践证明是有效的开发思想和方法。如果要做一名优秀的开发人员,我们就不能太过功利化,收获好的经验比收获金钱更加重要。对于没有实际项目可做的同学,为了提高自己的开发能力,跟据自己的喜好,不妨自己把自己当作客户,自己给自己提需求,尽量采用优秀的,先进的设计思想和方法,去给自己开发一个具有挑战性的软件。不同类型的项目,学习的测重点也会有所不同。对于技术性要求很强的项目,掌握其中涉及的关键技术是主要的学习目标,从而通过该项目的开发实践提高我们对技术的理解水平和应用能力。但有一点,当技术问题解决了之后,要想一想有没有更好的设计,能不能在不改变软件外在行为的情况下,改善其设计。比如,某些功能模块能不能提取出来,作为可复用的库;某些代码能不能重构,使其更加容易阅读和修改;软件各模块的组织方式能不能重新设计,使各模块间的耦合性更低以及模块的职责划分是否更加明确(即低耦合,高内聚)等等(使用Java,C++,.Net等面向对象语言的开发人员,不妨读一读《重构:改善既有代码的设计》这本书,使用C等面向过程语言的开发人员,不妨读一读《程序设计实践》这本书)。对于技术性要求不高的项目,软件工程的思想和方法就成了我们学习的主要目标和内容。

十一、设计要素:简单、三思学习优秀的设计思想和方法,一方面是让我们知道什么样的设计可以更加有效地解决我们当前遇到的问题,使我们的工作更加轻松;另一方面是通过对这些优秀的设计思想和方法的学习,刺激我们的思维,培养我们创造性地解决问题的能力,即创新能力。因此,我们不能为了设计而设计,不要在实际工作中生硬地套用某种设计方法。这种机械的设计,往往会导致过分设计或设计过于复杂、不合理、增加实现难度。这就要求我们在设计及编码过程中多思考、多商量、多交流,要具体问题具体分析,根据具体情况采取合适的设计方法,要做到简单优雅,通俗易懂。这还是应了我前面说过的一句话:不要机械地设计,不要机械地编程。也就是要多动脑,我发现好多同学做项目时,遇到一个问题,不管三七二十一,直接编程去实现之,理由是,学习计算机要多实践,多编程。诚然,学习计算机是要多动手,多实践,但要明白,动手和实践只是为了实现我们的设计或验证我们的设计是否正确,如果不进行充分的思考、设计,要么难以实现,要么实现的代码仅仅能运行,勉强实现某个功能而已。

十二、学习设计模式的好处 1.当今几乎所有使用面向对象的编程语言编写的框架(如 .net、j2ee等)和类库(如STL、MFC、JDK等)都应用了的设计模式。因此学习设计模式可以使我们更好地、更加熟练地使用这些框架和类库,并从根本上降低学习这些框架和类库的难度。 2.为我们的程序设计质量的提高提供了目标和参考,从而提高我们的程序设计水平。 3.使得我们有可能自己开发可复用的框加和类库。 4.剌激我们的思维和思考问题的方式,提高我们的创新能力。总之,要以用户需要为中心,尽可能地采用先进的技术和优秀的设计思想,以简单、实用、“省事”为原则,多思考、多学习、多交流、广泛阅读、开阔思路,不断提高我们的编程水平和设计能力。