精华内容
下载资源
问答
  • 如何细化开发过程 [原]

    千次阅读 2007-07-13 12:42:00
    我和一个研究生一起开发一个新项目。主要是读取gerber文件,并且要在屏幕上绘制这个文件,然后将该文件保存为0/1制的图形文件,工人利用给...开始工作很顺利,我已经可以绘制出大部分的图形了,(我自己构造的模拟数
    我和一个研究生一起开发一个新项目。主要是读取gerber文件,并且要在屏幕上绘制这个文件,然后将该文件保存为0/1制的图形文件,工人利用给文件在光绘机上印刷为胶片,再利用此胶片制造电路板。我的主要任务是编写绘图部分和保存文件的代码,而那个研究生主要负责从gerber文件读取文件并将数据保存早一个定义好的数据链表中用于数据传递给我。开始工作很顺利,我已经可以绘制出大部分的图形了,(我自己构造的模拟数据),当我要开始做图形文件存贮的时候,那个研究生的朋友却突然告诉我,他那部分有问题,读取数据的代码经常出问题,而且很难调试。需要我过去帮忙。
       我到了他那里,看了一下他的代码。发现他的代码层次设计的不是很合理,主要是函数的功能比较复杂,代码段都比较长,试着运行了一下他的程序,发现各种问题很多,而且后时候连他自己也说不明白是怎么回事,针对这种情况,我认为主要是他的体系结构设计有问题。在问了一下他的开发过程,发现主要在实现的开始阶段,他没有做详细的分析,而又希望一下子完成任务,所有就胡子眉毛一把抓,将所有的问题都集中在一起解决,这样,问题的难度一下子增加了很多。
       针对这种情况,我决定放弃他原来的所有代码,带着他编写一段程序,帮他养成一个比较好的编程习惯。
    首先是分析需求,因为我自己在编程的时候已经将所有的gerber的文件中数据元素分析的比较细致了,所有这部分的工作不是很重,只要将从网络上下载的gerber文件规范给他再讲解一下,他就明白了所有的gerber文件中数据定义,他犯的一个错误是虽然也用了很大的心思去琢磨gerber文件的格式,但对其中很多的细节问题了解的不是很细致,很多地方的数据定义是相互关联的。比如圆这个图形元素就分为实心圆和空心圆,而这两种圆的定义的数据个数,数据排列的先后顺序是不一样的。我们花了2个小时首先将所有这些图形元素的数据的表示方法都统一了(这里有几个问题需要大家注意一下,1要勇于放弃不好的代码,放弃自己编写的代码是一件很痛苦的事情,但实践证明这是很关键和重要的一步,重新编写代码往往比修改一个很糟糕的代码花的时间少,2对需求一定仔细,不能存在开发人员说不清楚的地方,凡是说不清楚的地方,就是实现的时候出问题的地方,3开发人员的表示方法一定要一致。我们用了两个小时统一对数据的认识和形成了统一的表示方法,对以后的交流有很大帮助。)
        然后是建立一个基本框架。由于程序比较简单,我没有写文档,而直接用代码实现,首先我编写了一个函数readgerberfile(GerberFirstpoint  *gerberpoint); gerberpoint是一个头指针,用于将所有的读取的gerber数据保存在这个文件中。函数体是这样的
    {
        FILE *fp1=NULL;
        if(openGerberfile(fp1)==0){
            readGerberData(fp1,gerberpoint);
            fclose(fp1);
        }else{
            printf(“文件打开失败!/n”);
        }
    }
       这个函数的主要做作用是定义我的主要工作内容,将文件的读取分为文件打开的文件读取,在这里需要注意的文件可能打开失败,所以一定要做错误处理------打开文件失败的处理。
       这个函数函数编写完之后,我做的下一个工作是利用其他的gerber制作工作,做一个简单的gerber数据文件。我做了一个只画一个圆的(注意几个问题,我先做一个gerber文件主要是验证我之后的代码是否可以运行,而只做一个圆是为了简化工作,没有必要上来就将所有的gerber图形都定义好,这样不但浪费时间而且难度也比较大)。接着我扩充了openGerberfile这个函数,这个函数比较简单就不说了,readGerberData的函数的扩充比较复杂,它的结构如下:
    {
        int loop=0;
        string tempstring1 = “”;
        Gerberstruct *gerberstruct = NULL;
        while(readlin(fp1,tempstring1)){
            if(length(tempstring1)>0){
                处理一行数据函数(tempstring1, gerberstruct);
                if(gerberstruct != NULL){
                     将新建立的gerberstruct放到gerberpoint链表中(gerberstruct,gerberstruct)   
                }
                loop++
             }
             if(loop == 0){
                 printf(“该文件为空文件!/n’)
             }
        }
    }
    这个程序主要从gerber文件中读取一行数据,如果文件一行数据都不存在或者不存在一行符合标准的数据,程序都可以检查出来,并提示用户知道(这也是一种错误处理,而且一般新的开发人员总会忽视这种情况。
    下一步是扩充处理一行数据函数。这个函数主要是,先对读入的一行的数据进行词法分析,或的数据的类型,参数的多少,并构造出新的数据结构。其结构如下
    {
       获得数据类型函数(tempstring1);
       if(是一个圆类型){
           构造一个圆的函数(tempstring1, gerberstruct)
       }else if(是一个线段类型){
           构造一个线段类型函数(tempstring1, gerberstruct)
       }else{
           非法的类型处理函数;
       }
    }
    这个函数,我第一次编写的时候只有圆类型和线段类型的判断,其他的类型没有加入,因为我主要是为了构造出一个框架,所以很多想类似的部分都省略了。但以后补充起来都很简单。所以可以先不写。另外大家也看到了这个函数也有一个错误处理函数,这个函数可以不写内容,但在调试的时候可以将该函数编写出来,在调试的时候可以方便你的错误定位。另外还是要提醒大家的是任何时候都要做错误处理,虽然有时候这种可能性不是很高,但这绝对是个好习惯,为什么用if, else if  而不有用case,我也说不太明白,原来一个老鸟告诉我要这样做,说结构比较好,估计他是吃过很多亏,所以我也养成了这个习惯。
    下边的程序在扩充就是一些纯技术问题了,我这里不再细说了,我们用了2个小时基本确定了这个框架,后边的工作只是在这个框架上扩充了,这个部分的开发基本框架也确立了,
    总结一下,首先要对需求进行比较详细的分析,不过系统是都简单,都可能有你不清楚的地方,检查的方法就是自己提问,看是否和开发有关的所有问题你都可以回答,(不要自己骗自己,否则你肯定吃亏),第二,不要太急于编码,先做框架设计,我之所以敢不先做设计一个是这个部分很简单,另外一个是12年的经验的积累,所以不要看一些靠同志不做设计,你也不做设计。先设计可以让你的代码更完善。通过设计可以让你的程序有一个比较好的架构,这样不用总是重构,而不断重构是新开发人员要花费很多时间的一个重要原因。第三将复杂问题简单化,简单化的方法两个,一个是将处理步骤逐步分解,开始的时候不要管下边的细节问题。新同志在开始这么做的时候容易考虑不周全,但做几次考虑问题就会全面了,会增加设计的成功率。另外一个是不要胡子眉毛一把抓。比如我做这个程序就只做了读圆这个类型的数据,其他类型的读取只要在适当的地方添加一些函数和对最后一个函数做一些修改即可,而这些函数的添加和修改对整体框架的影响都不是很大。至于增量开发和新版本发布,就不用在说了,我本身就是分了一个步骤,而且由于有了一个简单的gerber数据文件,不但可以测试,而且也可以发布新版本,我的版本分为几个,1个是可以读取文件(只要打开就算成功)2个是读出一个字符串(必须是正确的)3个是读取一个圆,并放到链表中。4个是读取好几个圆(当然需要修改gerber数据文件)5个读取含有线段的文件(多个线段元素,别忘了改文件),最后一个是,交叉含有圆和线段的数据文件。当我完成了第六个版本的时候,到了下班的时间,于是,我告诉哪个研究生,下边的都是他的了,我回家了,(不好意思)。
     
    展开全文
  • 通过对分析模型中所有对象和类的分析,明确对象的属性和操作,指定属性的类型特征,不全对象之间的关系,并在不断细化的基础上,把分析模型转化为详细描述如何解决问题如何实现软件系统的对象模型; 面向对象设计...

    面向对象设计:

    面向对象设计是以面向对象分析阶段产生的分析模型作为输入,通过对分析模型中所有对象和类的分析,明确对象的属性和操作,指定属性的类型特征,不全对象之间的关系,并在不断细化的基础上,把分析模型转化为详细描述如何解决问题如何实现软件系统的对象模型;

    面向对象设计工作的主要工作步骤:

    • 细化和重组类
    • 细化和实现类间的关系,明确其可见性
    • 增加遗漏的属性,指定属性的类型和可见性
    • 分配职责,定义执行每个职责的方法
    • 对消息驱动的系统,明确消息传递方式
    • 利用设计模式进行局部设计
    • 画出详细的顺序图或者协作图

    细化和重组类:

    该工作主要是以面向对象分析过程中得到的分析类为基础,以前面提到的对象继承和聚合粒度相关的原则为依据,正确地确定继承树的层次和聚合关系的细化程度;对于架构分析中确定的各个子系统,需要进一步细化其内部设计

    从屏幕类(FG_Screen)和窗口类(FG_Window)提取它们的共性--二者都可以容纳很多其他的对象--------生成一个新的基类,那么这个基类的代码就可以被屏幕类和窗口类共享(称为容器类FG_Gontainer),从逻辑上来说,容器来也属于一种窗口元素,因此容器类本身是窗口元素类(FG_Object)的一个派生类;

    所有的控件类可以被分为两种:有文字的控件类和没有文字的控件类,因此可以从控件抽象类(FG_Widget)中继承出一个文字控件抽象类(FG_TextWidget)用来管理空间中的文字。没有文字的控件都直接从抽象的控件类中继承而来

    细化和实现类间关系,明确其可见性:

    • 关系的可见性指的是一个对象能够‘看见’并且引用另一个对象的能力
    • 属性可见性:对象A的一个属性指向或者引用了对象B,是一种相对持久的关系,只要A存在就能引用对象B
    • 参数可见性:即对象B是对象A中一个方法的参数,对象A只有在该方法内才能发送消息给对象B
    • 局部声明可见性:即对象B是对象A中一个方法内部定义的局部变量,同样得,对象A只有在该方法中才会发送消息给对象B
    • 全局可见性:即对象B是全局变量,对象A任何时刻都可以发送消息给对象B(可能会对系统整体结构造成很大的危害),在面向对象设计中应该尽量避免全局可见性

    关系的分类:可以参见 http://blog.csdn.net/u012829152/article/details/41863641

    在面向对象分析过程中,可以确定类间关系包括一对一的关系,一对多的关系,多对多的关系和归纳关系等;在面向对象设计阶段,从语义角度,将类间关系分为依赖关系,关联关系,聚合关系,双向关系等几种类型

    依赖关系:依赖关系是一种比较弱的关系,只是表示Class1需要依赖或使用Class2,这种使用方式可能只是以参数可见性或者局部声明可见性的方式使用。Class3和Class4的关系比前者更深了一层,前者不仅依赖于后者,而且还是后者的友元类

    关联关系:表示在Class5的对象实例中,某个数据成员指向Class6的对象实例,通过该数据成员,Class5在自己的生命周期中可以随时向Class6的对象实例发送消息(在C++语言中,这个数据成员一般是指针的形式而不是引用)

    聚合关系:是一种特殊的关联关系,表达的是整体和部分之间的关联,Class7的对象包含了一个或者多个Class8的对象

    组合关系:是一种更强的聚合关系Class9的对象除了包含Class10的对象之外,还要负责class10对象的创建维护释放等工作(一个类包含另外一个类的对象实例并且全面管理后者的声明周期的聚合关系)

    从实现层面上看,在C++语言中,组合关系最常见的实现方法是包含者中直接定义一个被包含者的对象实例(不通过指针或引用来实现)所以组合关系有时被称为值聚合关系,相应的是,普通的聚合关系大多以指针或引用方式实现,有时被称为引用聚合关系


    双向关系:关联关系和聚合关系都有可能发展为双向关系,双向的关联关系既可以画成一条没有箭头的连接线,也可画成两条表示关联关系的带箭头的连接线。在C++语言中,两个类各自通过一个指向对方的指针来实现双向的关联关系。在这两个类的生命周期中,它们可以随时互发消息。

    实际上,双向的聚合关系描述的是:基类中包含多个派生类的对象,而每个派生类都知道其基类,并且可以向基类发送消息的逻辑关系

    FIshiGUI的类间关系:

    定时器管理器类(FG_TimerManager)中组合了若干个定时器类(FG_Timer)的对象,这时一种组合关系

    键盘映射表管理器类(FG_KeyMap)中组合了若干个键盘映射表元素类(FG_KeyMapItem的对象,这也属于组合关系

    FG_TImer和FG_Object之间以及FG_KeyMapItem和FG_Widget之间是普通的关联关系

    FG_Container中包括若干个FG_Object的对象,是组合关系

    FG_window把一个FG_KeyMap的对象组合在自己内部

    FG_Object有一个关联关系只想自己,它表示的是窗口对象可以访问其父窗口或子窗口


    展开全文
  • 表达关系的术语—泛化、细化、依赖及如何使用0 目录9 UML-29.4 表达关系的术语—泛化、细化、依赖及如何使用9.4.1课堂重点9.4.2测试与作业9 下一章 0 目录 9 UML-2 9.4 表达关系的术语—泛化、细化、依赖及如何使用 ...

    慕课北京大学.软件工程.第九章.UML-2.表达关系的术语—泛化、细化、依赖及如何使用

    0 目录

    9 UML-2

    9.4 表达关系的术语—泛化、细化、依赖及如何使用

    9.4.1课堂重点

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    9.4.2测试与作业

    1单选(2分)Jack在Google工作,是公司市场组的一名成员。那么描述Jack的类目Employee和描述Google的类目Company之间是_____关系。
    A.关联2.00/2.00B.泛化C.细化(实现)D.依赖
    正确答案:A

    2单选(2分)以下表达类目之间关系的术语中,其正确的表示方法是无箭头实线线段的是____。
    A.关联2.00/2.00B.泛化C.细化D.依赖
    正确答案:A

    3单选(2分)在用UML对关系进行建模时,以下策略错误的是_____。
    A.仅当要建模的关系不是结构关系时,才使用依赖。
    B.仅当关系是“is-a-kind-of”关系时,才使用泛化。
    C.应保持泛化关系的平衡:继承的层次不要多深,不要过宽。
    D.考虑到建模的复杂性,可以引入循环的泛化关系。
    正确答案:D

    4判断(2分)判断题:对象的依赖关系是一种使用关系。
    A.2.00/2.00B.
    正确答案:A

    9 下一章

    博客地址:

    展开全文
  • ◆回滚,而回滚会取消事务执行的所有工作。 ◆由于死锁时回滚而由应用程序重新提交。 下列方法有助于最大限度地降低死锁: ◆按同一顺序访问对象。 ◆避免事务中的用户交互。 ◆保持事务简短并...

    虽然不能完全避免死锁,但可以使死锁的数量减至最少。将死锁减至最少可以增加事务的吞吐量并减少系统开销,因为只有很少的事务:

     

    ◆回滚,而回滚会取消事务执行的所有工作。

     

     

    ◆由于死锁时回滚而由应用程序重新提交。

    下列方法有助于最大限度地降低死锁:

     

    ◆按同一顺序访问对象。

     

     

    ◆避免事务中的用户交互。

     

     

    ◆保持事务简短并在一个批处理中。

     

     

    ◆使用低隔离级别。

     

     

    ◆使用绑定连接。

    按同一顺序访问对象

    如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。例如,如果两个并发事务获得 Supplier 表上的锁,然后获得 Part 表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在 Supplier 表上。第一个事务提交或回滚后,第二个事务继续进行。不发生死锁。将存储过程用于所有的数据修改可以标准化访问对象的顺序。

    1259953.jpg

    避免事务中的用户交互

    避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例如答复应用程序请求参数的提示。例如,如果事务正在等待用户输入,而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。

     

    保持事务简短并在一个批处理中

    在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致死锁。

     

    保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。

     

    使用低隔离级别

    确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。

     

    使用绑定连接

    使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然,因此不会相互阻塞。 (责任编辑:卢兆林)

     

     

    转载于:https://www.cnblogs.com/smallfa/archive/2010/03/16/1687478.html

    展开全文
  • 如何做项目工作量估算

    千次阅读 2019-07-25 16:14:48
    如人才培训考试拆分后有课程视频管理、课程学习、知识点推送、定时作答、培训时长统计、题库管理、组卷方案设定、考生信息导入、考生成绩管理等功能,进行细化后预估的工作量有10人月,如果两个系统中均有人才培训...
  • 如何有序、高效、全面做好软件架构设计呢?作为一名软件架构师,应该具备的基本素质是:掌握架构设计的基本步骤,且清晰每个步骤的工作内容。本文结合实际项目经验,将对软件架构设计的步骤及工作内容进行介绍。 在...
  • 今天和老大聊到如何带领需求团队进行规模较大的项目调研,获益颇多...在敲定整个项目范围后,以总-分-总的思路进行工作划分,根据带领的团队结合项目情况划分WBS,让团队各成员分别细化所负责的需求(即需求规格化工作
  • 整点实际的,不总整这些虚的东西了!...我们这里假设需求调研,需求反馈等前期工作已经做完并已经有了业务流程这一步.通过和客户交流,我们确定整个流程中B,C,两个部分是可以自动化的,也就是说可以通过编写软件来帮...
  • 今天接触了好多如何工作、解决问题都信息,虽然大部分都是很早之前都知道的,但既然又被动输入了这些方面的信息,还是再总结思考一下。主要是两个: 一个主题是问题分析与解决。主要讲 1. 明确界定问题,问题要是...
  • 项目验收是公司乃至每个项目成员都想要的结果,一旦验收对公司来说就是,可以收验收阶段的款了,不需要再投入那么多人力到项目当中...如果我们在最终验收前,已经将很多阶段的工作细化并得到认可执行,那么项目验收也就
  • 众所周知,数据是互联网时代营销的决定性因素,数据的好坏关乎到营销能力的强弱,而细化到EDM行业中,数据细分变得极为重要,根据数据形态的不同,将会涉及到多种不同的细分方法,有效的利用这些方法,将会大大的...
  • 有这样一个被经常使用的比喻,这是一个古老的问题,问:“你如何吃掉一头大象?” 图片来自58pic.com,版权归原作者所有 回答当然是:“一次吃一口。” 完成一个大的战略目标,正如吃一头大象,是通过一层一层...
  • 按计划完成任务,是我们比较理想的工作顺序。但实际过程中往往会打破现有的顺序,多任务、突发事件的穿插,多件事情都需要一个人来处理时,就会出现由于交叉点拥堵而导致,后面的分支无法继续下去。 如果让计划...
  • 具体的整合Spring,使用的一下的这些类,下面的一章描述了如何使用这些类,看的比较晕的,可以多看看直接的配置,了解mina的运行流程。 完整的项目架构: 统一通信类 规范消息类型  目的:使用统一的封装...
  • 程序设计之分类细化

    2005-07-22 12:50:00
    如何让人的思想以电脑的形式表现出来,如何让计算机以人的思想表现出直观的东西,这就是程序员的工作。长久以来,程序工作者所进行的工作都是让计算机更人性化的工作,无论你用哪种语言,无论你用什么系统,计算机的...
  • 也就是说协同工作的人员每次最小的Check Out对象只能细化到PBL,没有办法Check Out到单独的对象,如一个按钮,一个Datawindow。很多用户在安装配置VSS上有些迟疑,其实VSS V6要比VSS V2005复杂一些。在这里首先说明...
  • 首先要熟悉Maya、ZBrush等软件的重要工具的使用技巧以及一些流程中的注意事项,再利用Maya、ZBrush进行建模的创建、身体局部的捏造,头部、手臂、腿部、手指、脚趾的形状细化。 2.模型精雕 在ZBrush中对模型进行...
  • 软件开发成本估算过程可进一步细分为软件规模估算、工作量估算、成本估算和确定软件开发成本等四个过程。其中成本估算需要对直接人力成本、间接人力成本、间接非人力成本及直接非人力成本分别进行估算。 国家标准...
  • 销售团队的士气和精神状态直接影响到工作的效率和效果,士气低落的...那么如何将低落的团队打造的更有精气神,更积极主动的迎接挑战呢,笔者对于“爆破”低落团队,向高士气团队蜕变浅谈自己的一些看法!  案例:G
  • 上一章分享了如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新,本章继续进行下一步,用户授权。涉及到的例子也以上一章的为基础。(ASP.NET Core 系列目录) 一、概述  首先说一下认证(authentication)...
  • 项目的可视性,是项目经理和高层经理最关注的问题。提高可视性,就能够即使掌握项目进展,及早做出准确的决策。从路线图可以看出该里程碑的完成度为87%...将工作任务分解、细化,建立更小的迭代,进而获得更快的用户反
  • 工作总结写法

    2021-01-23 20:50:39
    描述是如何做这件事情的。 3、工作任务 描述具体包括哪些任务。 4、工作成果 取得了哪些工作成果,可包括具体的分析成果,也可以包括分析问题、解决问题的技术规程。可另外搭配细化的文档等资料 5、经验和教训 5.1...
  • 本章是从面向分析的工作过度到软件设计 典型的OO系统设计的基础是若干架构层,如UI层、应用逻辑(领域)层 本章简要考察逻辑分层架构和相关UML表示法 2.逻辑架构和层 逻辑架构 逻辑架构是软件类的宏观...
  • 产品待办列表如何精化?

    千次阅读 2016-09-20 07:37:31
    Scrum中安排了精化活动,早期版本的英文是Grooming, 现在是Refinement,原来翻译为细化,最新版Scrum Guide中文版采用了“精化”。最新Scrum是这样说明精化的。产品待办列表精化指的是为产品待办列表项增添细节、...
  • 减少流程等级 与内部管理相比更强调外部客户 挑战传统的管理方式 减少无效的工作 充分利用信息系统 在新的系统中采用新的流程 避免人员的重复使用 BPR目标 Level 6 与核心流程人员协同工作 将流程细化 完成流程的...
  • 细化工作分工以后,汇总到项目经理,单对单沟通后上会讨论,形成会议纪要。 2.时间、范围、成本等出现问题时候,项目经理难以解决,可以背靠领导资源去争取,比如关键资源申请不到,可以协调领导帮忙推进一下。 3....
  • 计划不是摆设,上篇我们说了计划应该有什么内容,本篇将会分享如何写出实用的计划。写计划的几个要点:1.要站在战略的高度;2.明确计划的“输入”;3.用估算来控制计划,由计划来调整估算;4.制定可执行可检查的进度...
  • 文章内容建设是提高网站收录和关键字排名的基础,而具体的就落在如何细化的进行这些工作。个人感觉细节做好才是重点。 每天发布多少文章合适? 一直在想这个问题。个人感觉搜索引擎 比较偏重博客程序,因此在建立...
  • 如何做需求分析

    万次阅读 多人点赞 2018-01-31 16:32:26
    通常,软件开发工程师和软件测试工程师的工作都开始于软件需求说明书成型的基础上。那么软件需求说明书到底是怎么来...那么需求的分析梳理细化,直至成文这个过程,就是需求分析师的主要工作内容了。 需求一般分为四种

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 283
精华内容 113
关键字:

如何细化工作