第一篇:高质量软件模块开发总结
当开始进行模块开发时,系统负责人会给模块开发负责人描述模块功能与要求,但是此时模块功能与需求一般是比较粗线条和不完备的,例如很多细粒度异常情况处理需求一般系统负责人可能会考虑不到。
模块负责人通过详细设计完成:细化和确定模块的功能(包括异常处理需求)、识别关键问题和实现策略与流程、以及主要静态类和线程结构设计等。
详细设计完成并通过评审之后,模块负责人根据详细设计指导,进行编码并实现模块。
需要指出的是即使详细设计,但一般只是初步设计了主要的类和线程结构,以及一些比较大方面的异常情况处理。虽然可能不同的人完成的详细设计的细致粒度存在差别,即使是设计比较细致的详细设计一般不能到达可以直接根据详细设计自动生成代码的粒度,当然个人认为类和线程结构等实现方面的设计也没有必要太过细致,要把握好度,不要太过也不要不够。因此即使在编码和实现阶段其实也存在大量的设计工作,此时设计的粒度较为细致,一般是类级别的详细设计和编码实现(包括详细划分和确认类的功能规格说明书,并实现类的功能)。
虽然个人认为在详细设计阶段类和线程结构等实现方面的设计不必要太过细致,但是对模块功能规格(包括异常处理需求)的确认和细化一定要尽可能细致和想全。对关键问题和实现策略也一定要尽可能的细致和想全。对实现方面的类和线程结构设计能够想细还是细的为好,即尽量想细一点为好。所谓“谋定而后动”,只有先设计好了,想好了后面才能少出错。
根据上面论述,我们可以得出不管是详细设计还是编码实现都包括两个阶段工作:首先确认和细化功能规格,然后是实现功能规格。对详细设计而言是确认和细化模块的功能规格,并初步设计如何实现模块功能。对编码实现而言是确认和细化各个类的功能规格,然后实现各个类功能,最终实现模块功能。
而导致模块质量不高的主要原因是整个开发过程,没有明确地区分“确认和细化功能规格”和“实现功能规格”两个阶段,很多开发者的开发过程是两个过程混在一起,整个过程属于没有明确方向和不断变化的状态,恶果是导致很多例外情况没有考虑到并进行妥当处理,最终导致大量BUG的出现。具体表现如下:
详细设计时,模块功能需求确认不够细致,甚至是一直到编码实现阶段都是处于模糊状态,导致很多情况没有想到。例如各个对外提供接口的功能细节,特别是在一些异常情况下的返回值细节或者响应细节都不是很明确。
详细设计时,不仔细考虑会存在哪些异常情况,以及设计相应异常处理措施,导致在设计阶段很多异常根本没有考虑。详细设计时,不识别模块实现中关键问题,导致很多关键实现策略要到编码时才确定,但是由于编码时一般思维焦点是当前类,导致确定实现策略时缺乏全局考虑,同时加上还要考虑如何实现,因此会导致采用不是最优的或者是错误的实现策略。详细设计时,类、类状态变化、线程结构设计等考虑太粗。由于详细设计时能不考虑具体实现,会忽略一些细节,这样更能集中精力从整体和全局来考虑一些关键的实现策略和以及类和线程结构设计。而实现阶段一般更加关注细节,但只关注当前类细节和局部细节,因此详细设计时类、类状态变化、线程结构设计等考虑太粗会导致这些问题遗留到开发阶段,使得整个编码过程混乱,最终很多例外情况想不到。至少要保证详细设计完成后,模块开发者能在自己大脑里面把模块跑起来。
编码实现阶段,还没有制定清楚每个类、类方法的详细功能规格说明(即要处理哪些情况,异常情况下如何处理等)的情况下,就开始编码实现。明确区分两个阶段的好处是每次大脑只需要集中精力考虑一个方面问题,这样大脑考虑问题会比较轻松,使得问题能够容易想全,出现纰漏的概率要小一些。
1详细设计过程明确划分为两个阶段
第一个阶段是明确模块的需求,能够以详细的功能规格说明书的方式,明确模块的功能需求,重点考虑模块要处理哪些例外和异常情况,尽自己最大努力把情况想全。
例如对本模块对外提供的接口要详细写清楚,各种输入参数情况下的行为是什么,以及返回什么值。对本模块要调用的外部接口,要写明白本模块要求的响应是什么,以及调用失败情况下的处理策略等。
此阶段同时要描述清楚本模块运行环境包括:与周围模块交互描述、对内存以及磁盘的要求等对外围环境的需求、模块部署方式(多机并发部署、还是单节点运行)等。注意此时只集中精力考虑需求,不要考虑如何实现。
第二阶段是设计中的实现阶段。此阶段要求必须包括有:关键问题与实现策略、主要静态类图设计和说明(主要类、主要方法说明)、线程结构说明(包含哪几类线程、每类线程个数、每类线程职责、每类线程会访问到的类和对象等,如果比较复杂则要说清楚为什么这些设计,设计目标是解决什么问题)、在线程结构基础上描述互斥策略以及线程间关系等、主要的处理活动图(个人推荐更多使用泳道图,能更直观看到对象之间的职责划分和交互过程)。如果类对象的状态比较多,则建议采用状态机图的方式描述清楚,并通过审查状态机变化来检查是否有情况没有处理。
2编码阶段建议采用三个步骤
先想清楚,并写出类和每个方法详细功能规格说明(可以先把类名和方法名写好,然后以注释的方式把类的职责、关键实现策略、以及每个方法的功能规格说明<重点是例外和异常情况的处理与返回值>)。根据规格说明中列举情况,写出相应测试代码。编写实现代码,并通过测试。编写模块功能规格说明书,重构代码经过编码阶段之后,模块功能已经非常明确了,此时应该细致、清楚地编写模块功能规格说明书。原因如下:
1)模块功能规格说明中描述的功能会比详细设计中更为细致和清楚。另外经过编码阶段,此时模块实现的功能可能与详细设计时考虑的模块功能在细节方面可能会有些变化。项目描述本模块的功能说明,可以方便自己和其他人日后进行系统维护工作。
2)通过编写该功能规格说明可以弥补详细设计万一考虑不细情况下,一些例外和异常情况是否处没有处理或者处理不周到。由于在详细设计阶段,设计出模块的类和对象构成以及运行机制还是有一些模糊,因此很可能存在某些例外、特别分布式情况下某些状态组合没有考虑到的情况发生。但是在编码阶段,由于一般只会关注当前类和当前的方法的实现,因此考虑问题一般比较局部。为此在完成整个模块编码后,所有细节都已经明确(特别是在写代码过程中会发现存在一些新的异常情况需要处理<详细设计时没考虑到>),此时必须再一次从整体来考虑模块运行起来后在处理逻辑是否有缺陷,这样能更早发现以前设计中缺陷,避免上线后才发现缺陷。此时重点考虑是否还有情况没有考虑到或者某些处理不到位。
很多BUG难以发现和定位原因是在不同类和对象之间的发生交互和联系后,组合排列后的情况非常多,从而想不到某些组合。这种BUG只有从整体考虑、考虑不同类和对象之间交互关联后才可能想到。模块详细设计指南与规范
模块详细设计要完成两个方面工作:一是明确模块的功能需求和非功能需求、二是设计如何完成和实现模块的功能需求,包括类结构、线程结构设计等。本节根据后台模块特点,描述了两部分工作需要考虑和设计的关键点。
3.1确定模块的功能规格
1)本模块概述
概述主要描述了本模块所属子系统,以及在子系统中所承当职责的简单描述。2)本模块在系统中与周围模块关系和交互情况 很多模块一般要依赖周围的模块或者数据库,为此建议以图形方式描述本模块与本模块依赖的其他模块或者数据库之间交互情况。交互方式主要包括: 基于接口调用的交互、基于数据流的交互,直接访问数据库。
基于接口交互要描述:接口实现方式(ICE、WCF等)、接口调用目的、以及什么时候调用等。
基于数据流交互要描述:传输数据类型,传输方式等。对数据库或者存储要描述:需要访问的数据库名称、表格名称以及表格存储数据含义、访问数据库中表格的目的等。
3)本模块部署角色以及对基础软硬件要求 描述本模块将要部署的角色、部署模式、对操作系统要求、对基础软件要求、对硬盘要求、对内存要求等。
部署模式主要考虑是分布式多机部署、还是只会单实例部署。操作主要考虑需要对操作系统版本的要求。
基础软件主要包括:jdk版本要求、需要安装其他基础软件以及版本等。对硬盘要求:是否需要临时存储、大概需要多大(尽量能不用存储就不用)。对内存要求:大概需要多大内存等。4)本模块所处理数据的数据格式描述
对数据预处理模块,描述本模块对待处理数据的格式的假定和要求。5)本模块调用接口描述
详细描述清楚需要调用接口:接口名字、参数类型、参数单位、接口功能、接口执行时间要求(超时处理)、分片传输(消息大小限制导致分片传输需求)。接口功能部分重点要描述清楚异常情况下接口返回值和应该执行操作,例如调用的接口是否会返回NULL等。
6)本模块功能性需求描述
以功能点方式详细描述本模块功能。
如果是涉及对外提供接口的,明确描述:接口名字、参数类型、参数单位、各种输入参数下预期行为和返回值、接口应该满足执行时间要求。
7)例外与异常情况下描述与处理要求
详细考虑本模块第2)、3)、4)、5)中所描述本模块依赖的外部环境不满足本模块要求情况下的处理方式。
3.2设计与实现部分
1)关键问题与策略
只要有一点复杂或者难度模块的设计工作都会存在几个有难度或者关键问题去解决,这些关键问题的解决方案好坏决定了整个模块实现质量。一般而言这些关键问题解决方案会有多种,并且有好有坏,且会存在较大争议。相反一般非关键点设计就比较没有异议。关键问题与策略是开展设计评审的重点。模块设计评审就是审查两点:是否存在有些关键问题没考虑到、二是每个关键问题的解决方案是否是最优的。因此要求模块设计人员,在确认了功能规格后,第一件事就是要考虑本模块设计中存在哪些关键问题,然后再思考对应解决方案。在确定了所有影响比较大的关键问题的解决方案之后,剩余的类结构设计和线程设计等就会比较顺利。
此部分要求设计人员要反复问自己:一是否所有值得斟酌的问题都想到了、二目前设计的策略是否是最好的(好的策略一般是简单策略),要敢于否定自己已经设计好的策略。
衡量优秀实现策略的标准是:“用最简单方式满足最重要需求”。后台设计过程中要避免的事情是:不要为了某个不常用、但是听起来很美好的功能点导致设计很复杂。有时候为了模块运行简单和稳定,宁肯不要太完美。特别是很多时候很多需求是矛盾和有冲突的,作为设计人员一定要能识别哪些是主要需求,哪些是次要需求。
例如某全文检索检索模块,第一版本为提高检索性能,设计了检索结果缓存功能。但是实际使用过程中发现缓存命中概率很低,而这个功能导致整个模块设计复杂很多。
2)静态类结构设计 类结构设计,主要设计出本模块主要类以及类之间的关系,并利用类图的方式表达出来。
在静态类结构设计中,除类图外,还需要对各个类的职责分工,以及类中主要的方法要进行描述。另外要仔细考虑哪些类是主动类。
在静态类结构设计好坏,主要取决与设计人员面向对象设计的能力。要求设计人员考虑以下几个方面:
是否可以采用现成的设计模式。
是否违反了面向对象的几个原则:单一职责原则、开放封闭原则、替换原则、依赖倒置原则、接口隔离原则。
为了提高自己此方面设计能力,希望大家多看一些面向对象设计方面的书,以及一些经典优秀开源软件的结构,能真正领会设计模式和面向对象的几个原则的精髓,并能指导自己模块类结构设计。
另外如果感觉自己负责多个模块存在重复部分,例如感觉可能几个模块大的处理步骤基本相同,只是在处理细节上不同,则可以考虑将其中相同部分抽出来设计成一个具备一定通用性的框架或者共用代码,并贡献出来。
3)线程结构与同步互斥策略设计 后台模块一般会涉及多线程的处理,因此线程结构设计是后台组模块设计经常会遇到的问题。
线程结构设计必须描述以下几个部分: 包括那几类线程以及每类线程的职责
每类线程的个数
每类线程的启动和停止时间
线程间的协作关系:消费者-生成者关系、同步互斥、共享变量等。为了清楚描述和思考同步互斥问题,建议采用图的方式划出每类线程与每类线程会访问到公共对象,这样就能很直观识别出需要保护的对象,然后在详细设计和描述同步互斥策略。
线程结构设计基本经验是: 尽量减少线程间的交互。例如有三类线程,本来可能需要每类之间都要交互,则可以考虑以以某类线程作为枢纽,其他两类线程都和该线程交互,而其他两类线程之间不交互。
同步互斥在后台性能不是很重要情况下,可以考虑加锁的粒度粗一点。例如多个线程都要从一个队列取任务,并执行任务,且修改任务状态,则可以每次都锁整个队列,包括修改队列中某个任务的状态也变成队列类中的一个被同步保护的方法,而不是直接调用任务类的修改状态的方法。被同步互斥保护代码禁止有访问数据库、访问文件、调用远程接口等操作,必须都是只访问本地内存的操作,确保不会长期被锁住。被同步互斥保护代码只应该是“控制”代码而不能是“干活”的代码。
4)主要执行流程
描述本模块所需要处理的主要业务事件对应的处理过程。建议多采用泳道图来表示,好处是能直观的看到各类在该业务处理过程中的职责,方便设计人员对类的职责进行调整。
5)模块配置项设计
模块配置项设计主要为提高模块通用性,减少模块修改,让设计人员多考虑将很多参数作为配置而不要写死。
对于配置项考虑:
哪些配置项是全局配置、哪些配置项只是本模块需要读的。哪些配置项和建设方案有关、哪些配置项和建设方案无关。对全局配置项和与建设方案有关的配置项,应该放入到系统配置中去。方便系统部署时,可以实现设备安装与建设方案无关,实现设备安装程序标准化。
3.3与应用运维相关的考虑
为了与即将实现的应用运维系统进行对接。每个模块在设计时要考虑两个方面问题:一是如何从模块外面对模块运行状态进行监控,以及判断模块是否正常运行的标准是什么;二是如果是因为外部环境无法满足本模块要求,则在日志里面表达清楚。代码编程指南与过程规范
强烈建议采用测试驱动的模式来完成代码编程。测试驱动开发中编写测试代码目的是利用测试代码来描述和确认类的功能规格,然后编写实现代码来实现测试代码规定的功能规格并利用测试来验证编写的代码确实是符合事先设计好的功能规格。
根据前面的阐述,在详细设计时是不可能把每个类设计的很细,也就是每个类很细致的功能规格是没有设计好的。此部分工作是留在代码编写阶段来完成的,即在代码编写阶段包括:类功能规格设计和实现。
大部分开发者在编码时其实是在一边在编码实现、一边在确定类和方法的功能规格,并且会不断的调整(有时候会因为突然想到一种以前没考虑到的情况没处理、有时候是为了代码实现简单等等)。此时由于大部分精力是在考虑实现,并且是局部的实现,很容易导致某些需要全局考虑的一些例外或者异常情况没有考虑到,从而出现BUG。通过测试驱动模式可以强制大家把第二部分所讲的两个阶段区分开。
4.1代码编写建议采取以下步骤
写代码前,先站在使用者角度考虑清楚将要实现的类功能规格。类分为高层类和低层类(例如数据库连接池代码,数据库连接池类属于高层类、数据库连接类属于低层类)。一般情况下会出现一个高层类和多个低层类组成一个内聚的包。在这种情况下,可以先写出整个包或者高层类的功能职责,然后逐步下低层的,也可以先写低层再写上层,具体过程看大家自己。因此不管怎么样,都会出现类职责调整的情况发生。编写类名和类中间的方法,但是不实现。
以注释方式,描述类的职责、本类一些关键或者复杂的策略(方便别人能读懂你的代码)、本类需要处理的情况(要求从设计上,每个类职责要单一,否则这里就会写的很复杂)。以注释方式,详细描述public方法功能规格,特别是各种异常和例外情况下的处理方式(此时还没有私有方法,类的职责是通过public方法来体现的)。
根据上述注释,以类为单位编写测试代码。实现各个方法,并通过测试。
4.2对于编写测试代码的建议如下必须先写测试代码
尽可能的去写测试代码
要以类的使用者角度来编写测试代码。
针对类的功能点来写测试代码,而不是针对方法
不要采取为每个Public方法编写一个测试方法的模式来编写测试方法。每个测试方法应该测试的是该类需要处理的某一种情况。因为类的一个功能点可能要涉及多个Public方法。
类似软件测试每个测试用例,都对应一个测试点一样。每个测试方法其实都是测试类的一个功能点。
例如:一个队列类,有pop和push两个public 方法。则不要写两个测试代码:一个是testPop,一个是testPush。
而是要站在使用者角度来考虑队列类的功能规格: 1)如果队列为空,则弹出空对象。2)队列应该保证先进后出。3)如果队列满,则Push失败。
然后针对以上三种情况,分别对应写出三个测试函数。模块功能说明编写规范5.1编写模块功能说明的目的编写完整个模块后,从模块整体思考和检查所实现的模块是否符合设计要求,以及在相应细节处理方面是否存在BUG,或者不合理的情况。方便开发人员和维护人员日后的维护
5.2功能说明内容及规范
编写功能说明时,由开发人员站在使用者角度来描述和重新审查模块
1、模块部署环境和与周围模块交互情况描述
以图方式描述本模块与周围模块的交互情况,以及部署方式。本模块调用的外部接口描述。
本模块对基础环境要求:内存、网络、磁盘等。
2、模块配置说明
配置文件设计理由,那些固定不变的,哪些是应对业务变化。仔细描述各个配置文件的含义
说明如何通过配置来对应业务变化
3、模块功能说明
详细描述本模块的功能点。对每个功能点,一般描述以下几个方面: 功能名
与该功能相关的配置文件中的配置项 处理流程 故障处理
可能存在的问题。
例如: 功能N:按比例删除老数据 相关参数
STORE_POLICY :各数据类型的存储比例
PARTITION_MIN_FREESIZE_GB:每个分区应该保留的剩余空间 DELETE_INTERVAL_MINUTE:老数据覆盖的触发间隔。
处理流程
1)判断是否所有磁盘分区的数据块都被扫描,如果存在退出 2)判断是否获取了所有磁盘分区的总空间TotalSpace,如果存在某个分区因故障无法获取,则退出。
3)针对本小组内每种数据类型执行下列步骤
4)根据块信息计算出本数据类型所有数据块的总大小UsedSpace 5)UsedSpace <(TotalSpace– 磁盘个数* minFreeSpace)* storagePer则退出类型处理
6)计算UsedSpace-(TotalSpace – 磁盘个数* minFreeSpace)* storagePer得到需要删除空间needDelSize。
7)依次删除登记表中本类型最老数据块,直到删除块总大小大于needDelSize,或者删除干净。
故障处理
1.被删除数据块不存在:删除逻辑直接返回删除成功。
2.被删除数据块删除失败(远程代理通讯失败、该分区目前不能访问、被占用无法访问等):将该数据块加入到“删除失败数据块列表”,定期重试。
3.磁盘分区故障: 导致从来没有成功获取过总空间,会导致所属小组会覆盖停止工作,导致没有成功扫过数据块,会导致所属小组覆盖停止工作。
4.MASTER重起,会导致“删除失败数据块列表”被清空,不过MASTER重起会扫描到所有数据块,并重新删除。
可能存在问题
1)实际数据块分布与MASTER记录不一致,导致错误删除老数据。例如有人手工删除了一块比较新数据。
2)有些删除失败数据块,会导致实际剩余空间不够。
4、模块故障诊断说明
模块故障诊断用于当开发人员不在时,维护人员可以根据此部分初步判断出模块工作不正常时的原因。
由于一般模块出问题,开发人员去维护,一般都是先检查是否是本模块依赖的其他模块或者环境不正常,如果本模块所依赖的环境和模块都正常,那么可能是本模块的问题。诊断说明里要描述所有的检查步骤。可以依次写出所有的检查步骤,每个检查步骤包括:
检查方法:如何检查(检查日志中的异常输出、检查基础环境)异常原因:XXX硬件故障、XXX软件故障、XXX模块异常
第二篇:软件开发心得总结
有感于网盘开发过程
有感于网盘开发过程..............................................................................................................................1
一、软件开发个人体会:.................................................................................................................2
二、做软件开发我觉得要明白:.....................................................................................................2
三、在开发中遇到问题应该怎么去解决?......................................................................................2
四、怎么样才能提高自身的能力?..................................................................................................2
五、怎么样才能做好软件开发?.....................................................................................................2
六、文档的重要性.............................................................................................................................3
七、我的收获.....................................................................................................................................3
八、网盘项目开发的最大体会.........................................................................................................4
九、软件测试(单体测试和连接测试)..........................................................................................4
常熟理工学院SIG小组
3/28/2013
一、软件开发个人体会:
1.软件领域中的知识在于积累。
2.做软件开发,就类似算数学题和世界杯足球赛一样:重在结果,而不在乎过程。3.软件服务于人类,软件是在解决一些生活中的问题和错误,问题决定解决方案。
二、做软件开发我觉得要明白:
1.职业的乐趣:
(A)用自己的智慧去创建新事物的快乐(B)开发对别人有用的东西(C)不断学习来充实自己 2.职业的苦恼:(A)总是追求完美
(B)所有要实现的功能由他人而定
(C)概念设计计是有趣的,但找Bug总是很苦恼的
三、在开发中遇到问题应该怎么去解决?
1.2.3.4.不明白就多问,不要自已一直去琢磨。
一个问题如果30分钟还没有解决就应该考虑是不是问问别人。一个问题在没有用过3种以上的方法解决过就不要去问别人。解决问题思路是关键:
相信问题总归有解决的办法,就算连技术上都没法实现的问题,相信通过良好的沟通终究也会有解决的方法。
5.解决问题的前提是:理解别人的意思,理解别人的需求,多沟通,及时给客户反馈信息。
四、怎么样才能提高自身的能力?
1.程序员怎么样进步最快? - 理论结合实践
2.不要怕出错,不怕遇到错误,有错误就有挑战,这样才可以进步,但不要让同一个石头把你绊倒2次。
五、怎么样才能做好软件开发?
1.首先要明白解决的问题是什么,理解问题,其次再决定怎么解决这个问题 2.碰到很复杂的问题,我们就简单想,把问题简单化,细化到能够实现为止
常熟理工学院SIG小组
3/28/2013
3.出了问题,我们要先分析问题,然后知道引起问题的原因,最后并想出问题的解决办法 4.我们应该从2个方面去把握一个项目:从业务角度和项目的关键问题上去把握一个项目
(A)从不同的系统场景
(B)从不同的用户角色(充当什么角色)(C)从不同的系统使用角度(拥有那些权限)
5.其实我觉得开发人员说实在应该要比使用系统的人更了解系统需求,只有真正彻底的了解了项目的业务需求,我们才能做真的做好这个项目
六、文档的重要性
记得我当初刚开发项目的时候都是写个大致的需求说明书,做一个E-R图,画几个大致的数据流程图,然后建立数据字典和表结构关系。再接着搭建一个开发环境,配置几台服务器,划分一下模块,分工,我们就可以Coding了,一直到项目结束了,也没有完整的设计文档,更没有完整的测试文档,虽然这样的确是很快的完成了Coding工作,感觉上好像节省了好多成本和开发时间,但后期的维护和Bug 就是经常出现的事。
小项目没有文档关系不大,但如果遇到一个大项目的时候,那这样的开发方式就很有问题很危险的。
大项目没有文档: 首先维护就很麻烦,也很乱,写的代码,过几天都不知道它是完成什么功能的了,其次系统的稳定性和可靠性也让人怀疑,扩展性就不用说了。
七、我的收获
A.程序员大多都不喜欢写文档,我们以前也是特讨厌,记得以前都是系统开发完了,为了应付项目验收,就匆匆忙忙的一组人在那里补文档。在我们的思想里,所谓的文档就是一些废话,一句话硬是用十句话来代替的无聊透顶。B.代码风格要规范
以前做项目,我们都是不怎么去注意代码风格和写代码的规范,都是稍微想一下就直接开始写代码了。注释也很少用,总感觉我们自己写的代码,我们怎么会不知道它做了些什么事呢 ?总觉得我们自己写的代码我们怎么会不知道它是用来做什么的呢。一直都不相信这是个事实,但事实上,项目验收后,系统刚开始使用的人少,也就不会出现潜在的错误,随着时间的增加,久而久之,当大量用户并发访问的时候,系统的Bug 就暴漏出来了,那时你再用熟悉的Eclipse打开整个项目的源码时,再去看自己写的代码的时候,真的发现,我们定义的这个变量名是什么意思啊 ? 我们的这个Flag 是用来判断什么的啊 ?我们的if()中条件不知道是判断什么? Function()也忘记是什么功能了? 想想好可怕啊。难道真的都忘记了吗 ?回答是肯定的: 真的忘了。C.心得体会: 通过做该网盘项目,在这2年的锻炼中,我们才真的体会到,良好的文档是正规研发流程中非常重要的环节,一个好的程序是先写好设计文档再进行编程的,在设计文档的指导下,才能写出安全的代码。如果你不写文档,一开始就写程序,这样你就不会按已设计好的路线走,而是想到哪写到哪。小功能还好说,要是大功能,就容易混乱.常熟理工学院SIG小组
3/28/2013
刚开始我们还很不习惯这一系列的编程风格,很多的规范,尤其是命名,方法和注释,都有这着很多限制,让我们觉得真罗唆,写个程序完成功能不就可以了吗,明明1小时做完的事情非得让人用3、4个小时去做,我们现在真的明白这样做的好处了,我们已经习惯这样的编程风格了,这也养成了我们的一个编程习惯了,深有体会啊。
最忙的时候就是我们成长和收获最多的时候。
八、网盘项目开发的最大体会
我们觉得项目开发的开始时候,应该由项目负责人很好的对项目是什么项目,具体大概做什么事情,是谁提出来的,目的是解决什么问题,以及里面用到的很多专有名词做个细致的说明,而不是从一开始就分几本式样书,给个静态Html 的Demo看看,然后搭建好开发环境就按照式样设计书来开发。
九、软件测试(单体测试和连接测试)
我们首先认为,编写程序的时候不要想出了问题再解决,而是要想如何不会出现问题,要根据经验来预测可能出现的问题,然后避免出现。
测试,说的直接点就是给软件找错误。
很多人认为发现错误是软件测试的唯一目的,查找不出错误的测试就是没有价值的测试,实际上我们不这么认为。
我们觉得对开发人员来说,我们要把测试出来的Bug都应该做个分析,知道错的原因之后,我们就应该在下个项目中防止类似的错误发生,而真正来提高我们开发的效率。
常熟理工学院SIG小组
3/28/2013
第三篇:648软件开发总结
内部
648软件开发介绍
一 DM648介绍
DM648属于TI达芬奇系列,采用单核C64X+定点CPU,支持最高频率1.1GHz,有两个乘法器支持四个16bits*16bits(结果32bits)单个clock cycle或者八个8bits*8bits(结果16bits)单个clock cycle。还有6个ALU。
648的片上存储器有L1P(32KB),L1D(32KB),L2(512KB)648集成了五个视频口VPORT,省去FPGA做FIFO,可以节省产品成本。
648集成了丰富的外设,包括edma(64个通道),SPI,I2C,UART,EMIF,DDR2,Ethernet,gpio(32个),McASP,PCI。
二 搭建软件开发环境 2.1操作系统环境
Win7 32位或win-XP环境 2.2软件安装和配置
需准备的安装软件 Ccs3.3
bios3.08 648dvsdk perl Bios是TI针对DSP开发的实时嵌入式操作系统。
Dvsdk是基于BIOS系统的视频开发包。Perl是脚本工具,烧写程序时将out文件转换为ais文件。
建议所有软件安装到默认目录下,安装完后
配置操作系统环境变量
修改BIOS_INSTALL_DIR变量为 C:/CCStudio_v3.3/bios_5_31_08 配置CCS的组件管理器,如图2-1
点“开始->所有程序->TI->component manager,修改Target Content(DSP/BIOS)->TMS320C64XX为当前版本的DSP/BIOS
图 2-1 2.3 DVSDK目录文件介绍
默认安装到C:dvsdk_1_11_00_00_DM648目录下,其中
edma3_lld_1_05_00是edma3驱动包
examples 包含很多基于BIOS的示例应用工程,我们参考video_preview示例程序作为框架,添加图像处理算法和通讯驱动。flashutil 包含flash烧写工程norwriter,bootloader程序ubl,ais文件生成脚本
ndk_1_92_00_22_eval 网络开发软件包 pspdrivers_1_10_00 包含了TI提供的很多基于BIOS系统的驱动,我们参考其中VPORT的驱动,将按帧采集修改为按场采集的功能 xdc_2_95_02 xdc工具安装路径,xdc是ccs的子工具,是一个javascript编译工具,用于编译cfg文件,cfg文件在后面讲。如图2-2安装XDC后,会在工程的编译选项界面增加XDC选项。
图2-2 2.4仿真器
TDS560USB PLUS
在CCS setup界面选择TDS560USB PLUS platform和C64x+ family的DM648。如图2-3.图2-3 三 VPORT+EDMA工作原理 3.1 VPORT介绍
DM648集成了五个VPORT口,用于视频输入输出,每个VPORT可以配置为capture或display模式。Capture模式又分为双通道8bit BT656,单通道16 bit Y/C模式。Display模式又分为单通道8bit BT656, 单通道16 bit Y/C模式。
目前,capture和display模式都采用8bit BT656子模式,PAL视频编码芯片和解码芯片也设置为BT656模式。3.2 BT656标准简介
BT656标准将4:2:2格式YCbCr数据统一封装在一个数据流中,按照CbYCrY顺序排列,Y的数据数量是Cb,Cr的2倍。
BT656数据流中,ffh和00h保留用于时序标示。在视频数据每行的开头和结尾有标示SAV(start of video),EAV(end of video)。SAV和EAV的格式是ffh,00h,00h,XYh,前三个字节固定,第四个字节包含场标示,场消隐状态和行消隐状态,如图3-1。
图3-1 3.3 VPORT FIFO 每个VPORT有一个FIFO存储进入的数据或者从FIFO输出。
BT656 capture模式中,FIFO分成A、B两个通道,如图3-2,A通道接收VDIN[9-2]管脚的数据,B通道接收VDIN[19-12]管脚的数据。每个通道又分Y,Cb,Cr三个缓存,每个缓存区有独立的读寄存器。
图3-2 BT656 display模式中,如图3-3,只有一路输出,FIFO分为Y,Cb,Cr三个缓存区,每个缓存区有独立的写寄存器。
图3-3 VPORT和EDMA配合在FIFO和外部或片上存储器之间移数。我们可以编程FIFO的阈值寄存器,当FIFO达到设置满度(fullness)(对于捕获模式)或者低于设置满度(对于显示模式)时,生成EDMA事件,触发相应EDMA通道移数。
每个VPORT对应6个EDMA事件,分别是
VPxYEVTA,VPxCbEVTA,VPxCrEVTA,VPxYEVTB,VPxCbEVTB,VPxCrEVTB 例如,我们用VP0口的A通道做为BT656视频输入,VP1口做为BT656视频输出。
设置VP0口A通道Y,Cb,Cr三个缓存区的阈值为720,360,360。当PAL图像数据传输完一行后,三个缓存区都达到阈值,生成VP0YEVTA,VP0CbEVTA,VP0CrEVTA三个事件,触发对应的三个EDMA通道将三个FIFO缓存区的一行图像数据移入DDR2缓存区。
设置VP1口Y,Cb,Cr三个缓存区的阈值为720,360,360。当三个缓存区数据数量低于阈值时,生成VP1YEVTA,VP1CbEVTA,VP1CrEVTA三个事件,触发对应的三个EDMA通道将DDR2缓存区的一行图像数据移入三个FIFO缓存区。
四 应用程序及驱动解析
4.1两个重要文件
基于BIOS/DSP系统开发软件,有两个重要工程文件tcf和cfg文件,如图4-1中红圈1和2。
图4-1
tcf文件包含了DSP/BIOS的配置信息。红圈3的global settings设置DSP工作频率,L1,L2 cache size,大小端,L2 cache 128kB。Memory section设置程序和数据各部分在存储器中的段地址。
红圈4 HWI(hardware interrupt)处,添加硬件中断处理函数
红圈5 添加BIOS/DSP的线程
cfg文件包含了库链接路径信息,使用javascript语言,如图红圈6。使用XDC工具编译cfg文件,生成库链接信息,供C编译器链接库时使用。cfg文件常链接的库有vport驱动,edma驱动程序。
4.2图像缓存分配和管理
Edma在VPORT和SDRAM之间搬数,CPU要访问SDRAM最新的图像数据,程序采用多个图像缓存区循环的方式将这两个过程并行化。
应用层创建捕获或显示通道时,调用驱动层程序在DDR2分配存放图像数据的缓存区。分配之前,驱动根据通道的配置参数计算每个缓存区的大小。
例如,vp0按场采集,vp1按帧显示。Vp0的每个缓存区的大小是720*288*2,vp1的每个缓存区的大小是720*576*2。
应用程序使用FVID_dequeue()出队函数和FVID_queue()入队函数或FVID_exchange()交换函数,在应用程序和驱动程序之间交换图像缓存区。
捕获和显示驱动的缓存管理方法不同,如下面两图4-2和4-3:
图中蓝块表示应用程序的图像缓存区,白块表示驱动程序的图像缓存区。
图像捕获缓存区,初始时所有的缓存区都在捕获队列里,捕获驱动程序以循环的方式填充每个缓存区。
当应用程序调用FVID_dequeue()函数时,将放有最新图像数据的缓存区出队并返回给应用程序,驱动在余下的队列里循环填充,如(a)到(b)和(b)到(e)。
当应用程序调用FVID_queue()函数时,将一个空的缓存区交给驱动程序并加入队列,如图(b)到(a)和(e)到(b)。
当应用程序调用FVID_exchange()函数时,应用程序交给驱动一个空的缓存区,驱动交给应用程序放有最新图像的缓存区,相当于同时调用FVID_dequeue()和FVID_queue()两个函数,如图(b)到(c)和(c)到(d)。
图4-2
图像显示缓存区,初始时只有一个缓冲区用于显示,其它缓存区等待出队,如图(a),黄块表示显示驱动队列里准备出队的缓存区。显示驱动程序重复显示一个缓存区的图像。
当应用程序调用FVID_dequeue()函数时,从驱动获得一个缓存区,应用程序向它填充显示数据,同时驱动仍然显示之前的缓存区,如图(b)和(d)。当应用程序调用FVID_queue()函数时,应用程序给驱动程序一个准备显示的缓存区,同时驱动将它设置为当前的缓存区,如图(b)到(c)到(d)。
当应用程序调用FVID_exchange()函数时,应用程序给驱动一个准备显示的缓存区,从驱动得到一个空的缓存区,相当于同时调用FVID_dequeue()和FVID_queue()函数,如图(d)到(e)。
图4-3
4.3 应用程序框架介绍
基于dvsdk_install_dir/example目录下的video_preview示例程序,做为项目软件框架
应用程序主要包含三部分:
Main函数
Video_preview线程
自添加的中断处理函数
许多实时DSP应用都需要同时执行很多不相关的功能,这些功能一般是对外部事件的响应,这些功能就加线程。
DSP/BIOS支持4种线程:
(1)硬件中断(HWI):频率可达200KHz(5us)(2)软件中断(SWI):SWI允许HWI将一些非关键处理在低优先级上延迟执行,这样可以减少在中断服务程序中的驻留时间。
(3)任务(TSK):任务与中断不同点在于,任务在执行过程中可以被挂起。
(4)后台线程(IDL):空闲循环,运行那些没有执行时间限制的函数。
上电加载完操作系统内核后,首先执行main函数。
Main函数执行完后,启动video_preview线程,线程生命期直到执行结束后。此线程主要功能有图像采集,处理,字符叠加,显示。
Video_preview线程第一步调用FVID_create()函数为vp0口创建捕获通道对象capChan,初始化vp0寄存器,为vp1口创建显示通道对象disChan,初始化vp1寄存器。
第二步调用FVID_allocBuffer()为capChan和disChan分别分配三个图像缓存区,然后调用FVID_queue()将三个缓存区组成队列,同时为capChan和disChan分配edma通道,设置edma参数表。
第三步调用FVID_control()函数使能vp0,vp1口,vp0开始捕获,vp1开始输出显示。
第四步调用FVID_dequeue()从capChan和disChan的缓存队列中各出一个缓存。
第五步 进入while(1)循环,在循环中执行两次FVID_exchange()。FVID_exchange(capChan,pImg1)捕获新的一场图像数据,FVID_exchange(disChan,pImg)显示新的一帧图像。捕获两次,显示一次。
FVID_exchange(capChan,pImg1)后面添加图像处理算法和叠加字符。
4.4添加图像处理算法
在FVID_exchange(capChan,img)函数捕获图像后添加图像处理算法。为了减少CPU访问图像数据时间,将图像数据和访问频率高的中间数组放在L2 RAM里。DM648 L2的大小512KB,其中128KB用于cache,剩余384KB可用于应用程序存放图像数据。
4.5 VPORT驱动调试方法
VPORT驱动采用BIOS的两层驱动模型class/mini-driver,BIOS现在抽象定义了三种class驱动,PIP/PIO,SIO/DIO,GIO,应用程序通过这三类BIOS API接口与mini driver通讯,在一个应用工程中可以同时使用这三种API 接口。
Mini层通过CSL层访问外围硬件的寄存器,存储器,中断资源,如图4-6。
图4-6 Video_preview应用工程中使用了BIOS GIO接口API,如图4-7是GIO和mini diver层包含的API,FVID函数是GIO API的宏定义,如下:
#define FVID_create(name, mode, status, optArgs, attrs)
GIO_create(name, mode, status, optArgs, attrs)#define FVID_exchange(gioChan, bufp)
GIO_submit(gioChan, FVID_EXCHANGE, bufp, NULL, NULL)#define FVID_control(gioChan, cmd, args)
GIO_control(gioChan, cmd, args)
图4-7 VPORT的mini driver层实现工程vport_bios_dm648_drv_lib.pjt在dvsdk_install_dir/pspdriver目录下,将其设置为video_preview_PAL.pjt的依赖工程(Dependent Projects),如图4-8,这样应用工程重新编译之后就可以同时调试应用工程
和mini driver层。
图4-8 五 flash芯片烧写程序
在烧写程序之前需要准备两个文件ubl.ais和video_preview_PAL.ais,使用Dvsdk_install_dirflashutil目录下的perl脚本命令create_ais.bat将ubl.out和video_preview_PAL.out生成对应的ais文件。
Ubl(user boot loader)是DSP启动加载器,DSP上电后会自动将UBL代码从 flash加载到存储器中,开始执行UBL,ubl先初始化pll,ddr2,emif,再将video_preview_PAL工程从flash加载到存储器中,然后开始执行应用程序。
准备好ais文件后,加载运行norwrite工程Dvsdk_install_dirflashutilDM647_8CCSDM648_NORWriter,norwriter包含四个步骤:
(1)设备初始化,pll,ddr2,emif初始化。(2)擦写flash块0xa000 0000-0xa002 0000,将UBL二进制文件写入该flash块。
(3)擦写flash块0xa002 0000-0xa008 0000,将video_preview工程二进制文件写入该flash块。
(4)擦写flash块0xa060 0000-0xa060 2000,将轴位写入该flash块
第四篇:软件开发期末总结
MTTF:平均无故障时间;MTBF:平均故障间隔时间
1软件开发的本质:高层概念到低层概念的映射。2.软件的本质特征:构造性,演化性
3面向对象的四个原则:抽象,继承,多态,封装。4抽象概念的理解:对抽象事物的理解;归纳概括;总结事物共同点;进行逻辑思维和推理 java最大特点:简单,面向对象,可移植,最大限度利用网络 java与C++区别:全局变量;goto语句;指针;内存管理;类型转换;头文件
7软件危机: 软件的开发和维护过程中所遇到的一系列严重问题。不仅只软件不能运行,几乎所有的软件都存在这些问题,所包含:如何开发软件;如何维护
软件过程 一系列任务步骤和框架
8软件工程: 是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
9中间件 定义:是位于平台(硬件和操作系统)和应用之间的通用服务,这些服务具有标准的程序接口和协议。目的:提出中间件的概念是为解决分布异构问题。分类:基础中间件;业务中间件;领域中间件。构件:是系统中实际存在的可更换部分,它实现特定的功能,符合一套接口标准并实现一组接口 组件:组件技术就是利用某种编程手段,将一些人们所关心的,但又不便于让最终用户去直接操作的细节进行了封装,同时对各种业务逻辑规则进行了实现,用于处理用户的内部操作细节,甚至于将安全机制和事物机制体现的淋漓尽致。而这个封装体就常常的被我们称作组件。12 软件生产线:是共享同样的体系结构和实现平台的软件系统的集合,它是具有公共的系统需求集的软件系统。这些需求是针对一组共享公共的设计和标准(或构件)的产品族,或者是一类特定的行为或任务。
13操作系统发展趋势:操作系统内核将呈现多平台统一的趋势
14软件开发趋势
开源:两个作用,社区和标准的建立。SOA:面向服务的体系结构;IT治理:公司治理的一部分。
15软件开发技术趋势(1)下一代Web开发;(2)企
业应用2.0(SOA).(3)系统开发.(4)开发工具和语言.(5)项目管理及安全 不同的软件开发方法(1)结构化开发方法(2)面
向对象开发方法(3)统一软件开发过程(4)敏捷软件开发.软件的体系结构:一个程序或系统各构件的结
构,他们之间的相互关系及进行设计的原则和指导方针;本质:对复杂事物的抽象; 一定时间内保持稳定 三要素:构件的层次结构;构件之间交互方式;数据结构
组成元素从静态模式转向动态模式,组件模块有被动调用转向主动调用以适应系统环境 软件架构技术:根据项目情况分析系统行为,设计系统组件,给出构架表示方式,描述构架的各个方面,最后对系统构架进行精化。框架比架构更加具体 数据库设计 方法:(1)属性主导设计(2)实体主
导设计; 遵循原则:(1)信息隐藏(2)适当冗余(3)慎用外键 数据一致性:域完整性,实体完整性,引用完整性,数据有效性 插件 定义:系统运行时的功能单元,是一种遵
循一定规范的应用程序结构编写出来的程序。呈现方式:运行时根据外部配置文件来定 基本功能:插件注册,管理和调用 软件质量定义 明确声明的功能和性能需求,明
确文档化过得开发标准,以及专业人员开发的软件应具有的所有隐含特征 软件需求是进行质量度量的基础,软件质量特性反应了软件的本质。影响软件质量的4个方面:开发技术;人员素
质;成本时间,进度;过程质量 软件项目管理 为了使软件项目能够按照预定的成本,进度,质量顺利完成,对成本,人员,进度,质量,风险等进行分析和管理的活动。24 软件配置: 计算机程序(源代码和可执行程序);
描述计算机程序的文档(针对开发技术者和用户); 数据(包含程序内部和外部)软件维护和软件配置管理的区别: 维护是发生
在软件以交付给客户,并且投资运行后的一系列软件工程活动;软件配置管理则是当软件项目开始,并且仅仅当软件退出运行后在终止的一组跟踪和控制活动 软件过程成熟度:指一个特定的软件过程被显示定义、管理、度量、和能行的程度 JavaBean开发的三个阶段:构造阶段,内造阶段,执行阶段; 包含的基本元素:属性,方法,事件 一个Java对象具有以下特征就可以是JavaBeans 定制、持久性、通信、反省 简单的时说(1)作为一个类必须被声明为public(2)必须要有get/set方法(3)有构造函数但不能有参数 29 引发事件 当javaBean触发某个事件是,javabean讲点用该事件的监听对象的响应函数 30 监听事件 javabean被添加到某个类改事件的监听队列中,并且具有该事件的响应函数,被监听类的此事件被激发时被监听类就会调用javaBean的响应函数
JDBC工作的四个主要组件 java应用程序,JDBC驱动器管理器、驱动器,数据源
数据源的种类 用户DNS、系统DNS 文件DNS 33 java多线程的生命周期 新建状态;就绪状态或可运行状态;运行状态、阻塞状态、消亡状态 33 J2EE规定的web曾包括 jsp页面、基于web的java applet、以及用于动态生成的html页面的Servlet构成。
作业 1简述Servlet设计中涉及的类和接口
(1)Servlet interface: 所有的servlet直接或间接实现这个interface, 它提供安排servlet与客户端联系的方法.最关键的方法是Service,负责处理ServletRequest对象和ServletResponse对象。2)HttpServlet class: 实现Servlet interface,重写了Service方法以区分请求(常见的HTTP请求类型是GET和POST),并调用相应的方法来处理(doGet、doPost)。
servlet接收来自客户端的调用请求, 它接收两个对象: 一个是ServletRequest,另外一个是ServletResponse。
3)HttpServletRequest interface: 概括从客户端到服务器之间的联系,实现该接口的对象包含了客户端的请求信息。
4)HttpServletResponse interface: 概括从Servlet返回客户端的联系,实现该接口的对象提供了方法,使Servlet向客户端发回响应。
1.现有数据库db位于名为lz的MS SQL Server
服务器上,用户名为sa,密码为空,请编写数据库连接dbConnect类,实现数据库的连接、返回连接对象及重载有关的close()方法。public class dbConnect {
public dbConnect(){
try{
Class.forName(“com.microsoft.jdbc.sqls
erver.SQLServerDriver”);
}
catch(ClassNotFoundException ee){
}
}
public static Connection getconn()throws SQLException{
String url
=
“jdbc:microsoft:sqlserver://lz:1433;DatabaseName=
db”;
String username= “sa”;
String password= "";
return
DriverManager.getConnection(url,username,password);
}
public static void close(ResultSet rs){
try{
rs.close();
}
catch(Exception ex){
}
}
public static void close(Statement stmt){
try{
stmt.close();
}
catch(Exception ex){
}
}
public static void close(Connection conn){
try{
conn.close();
}
catch(Exception ex){
}
}
private static dbConnect dbconn = new dbConnect();
}
第五篇:一份高质量的总结如何写
一份高质量的总结如何写?
到了年尾,各公司开始忙着写年终总结,班组年终总结,个人年终总结,销售年终总结,财务年终总结„„很多人为此头疼不已,不知道年终总结该如何写?下面一篇文章,教你如何写出一篇高质量的年终总结。
一份高质量的总结究竟应该如何写呢?
一、要充分认识到总结的要义。总结是最好的老师,没有总结就没有进步,总结是一面镜子,通过总结可以全面地对自己成绩与教训、长处与不足、困难与机遇的进行客观评判,为下一步工作理清思路,明确目标,制订措施,提供参考和保障。所以总结不仅仅是给领导看的,更是对自己进行全方位的剖析,使自己更加认识自己,发挥优点,弥补不足,不断提高。为此,必须认识到总结的重要意义。当然各级领导也要重视总结的重要性,要让下属广开言道,言无不尽,言者无罪,实事求是,客观认真地总结。
二、对一年来工作的回顾。对一年来各项工作的完成情况进行总结,全面总结成绩:各项计划完成了多少、销售指标(销量、销售额、回款、利润)完成情况、与去年同期相比各项任务是否有增长、产品结构是否得到优化、渠道建设和客户关系是否得到加强、经销商的素质是否得到提高、经销商与消费者对品牌的满意度和忠诚度是否得到提升、竞争对手衰退了没有、如果作为团队领导还要总结团队建设、培训学习等方面的内容。
三、分析取得成绩的原因。没有人会随随便便成功,每一个成功的后面都是付出的艰辛努力。认真分析取得成绩的原因,总结经验,并使之得以传承,是实现工作业绩持续提升的前提和基础。成绩固然要全面总结,原因更要认真客观分析:
1、成绩的取得客观因素分析:行业宏观环境的势利性、竞争对手失误所造成的机会、公司所给予的资源支持程度、团队领导在具体方面的指导、同事的帮助。
2、成绩取得的主观因素分析:自己对目标任务的认识和分解、自己对市场的前瞻性认识、自己的困难的挑战意识、自己自我学习素质提升、解决问题能力提升、自己对市场变化的反应能力。
四、分析导致工作目标没有达成的失误和问题。人贵有自知之明,总结并不是要总结得形势一片大好,必须认真客观的分析在工作中的失误和存在的问题。通过分析问题,查找原因,认识不足,不断改进和提高,实现工作质量的持续提高。来反思自己为什么没有进步。一般来说工作中往往会存在以下的失误和问题:
1、主观认识不足,思路不够高度重视。
2、自身没有远大理想与目标,对自己不能严格要求,对下属和自己过于放任。
3、计划制订得不合理,脱离客观实际。
4、对计划的分解不到位,执行和过程监控不到位。
5、对竞争对手的跟踪分析不深入,市场反应速度滞后。
6、产品结构、价格策略、促销组合、渠道建设、品牌传播计划不合理、执行不到位。
7、团队管理能力差、个体成员素质差,不能胜任工作的要求。
8、来自于竞争对手的强大压力,使自身的优势不能突显。
五、对当前形势的展望与分析。总结不仅要回顾过去,还要展望未来。要对当前的形势现状与未来的发展进行客观深入的分析:
1、外界宏观与微观环境分析:行业发展现状与发展、竞争对手现状与动向预测、区域市场现状与发展、渠道组织与关系现状、消费者的满意度和忠诚度总体评价。
2、内部环境分析。企业的战略正确性和明晰性、企业在产品、价格、促销、品牌等资源方面的匹配程度。
3、自身现状分析。自身的目标与定位、工作思路和理念、个人素质方面的优势与差距。通过对现状与未来的客观分析,能够更加清楚所面临的困难和机遇。从而对困难有清醒的认识和深刻的分析,找到解决困难的方法,对机遇有较强的洞察力,及早做好抢抓机遇的各项准备。
六、下一工作计划与安排。总结上年工作当然是总结的重点,但更好的筹划和安排下年工作才总结的目的,所以下一工作计划和安排同等重要。
1、明确工作的主要思路。战略决定命运,思路决定出路,良好的业绩必须要有清楚正确的思路的支撑。否则人就变成了无头苍蝇,偏离了方向和轨道,就会越走越远。
2、新一工作的具体目标:销量目标、回款目标、利润目标、渠道建设目标、区域市场发展目标、团队建设目标、学习培训目标。
3、完成计划的具体方法:团队整体素质与协作能力的提升、资源需要和保障措施、目标任务的分解、渠道的开发与管理、产品结构的调整与优化、市场秩序的规范管理、客户关系管理与加强、品牌策略创新与高效传播
年末岁尾,正是各单位、各部门总结工作的时候,要做好年终总结工作,余以为必须做到“五忌、五体现”:
一忌事无俱细,体现突出重点的原则。全年工作方方面面,大小事情很多,无需事无俱细地对所有工作进行总结,芝麻西瓜一起抓。重点应该是本单位、本部门承担的任务指标完成情况,队伍建设情况,以及为完成指标克服困难所采取的措施等。用事实和数字说话,做到有理有据。
二忌成绩注水,体现实事求是的原则。总结成绩必须是事实成果的汇总归类和条理化,既不能人为拔高,注水膨胀,也不能把别人成果拿来共享,把年初工作计划变换口气当成绩来总结,更不能笔下生花,无中生有,闭门造车。
三忌简单罗列,体现依事说理的原则。工作总结不仅仅是工作量的罗列汇总,而是要通过总结上升到理性的高度来认识所做的工作。要通过对全年的工作总结得出一般性规律,形成有益的经验,达成一致的认识,使其对今后工作具有指导作用,对他人具有借鉴作用,没有经验体会的总结是不全面的,不完整的,也是毫无意义的。
四忌回避问题,体现一分为二的原则。总结的目的全在于应用、发展和提高。“成绩不讲跑不掉,问题不讲不得了”。在总结成绩的同时,要客观地查找工作中存在的不足和问题,正视缺点,以警示今后的工作,少走弯路,避免在将来的工作中犯同样的错误,切忌“一路颂歌,满地鲜花”。
五忌单一行为,体现全员参与的原则。有总结才会有提高,才会有进步。工作总结不能靠办公室一个部门来做,也不能由秘书一个人来完成,而应该由各系统、各部门、各岗位共同来做,领导干部本人也不能例外。只有大家都来总结,才能做到人人长经验,个个有提高,才能促进整体工作的协调健康发展。