需求分析要做的:
确定用户的真实需求,项目具体功能需求、界面需求等。
1.1 非互联网公司
比如一个连锁餐饮公司需要开发一款线上点餐的APP,他们没有自己的软件开发团队,就需要找一些外包公司进行开发。那这个系统就需要有对应点餐用户和餐厅服务员的前端服务;还要有处理用户订单数据的服务端。
在这个例子中,
用户:餐饮连锁公司
真实需求:
前端服务,用餐的客户可以通过软件浏览实体分店提供的套餐,然后进行下订单,付款等一系列的操作;店里的服务员可以看到客户下的订单,然后进行烹制、出餐等操作。
后端服务,存储、处理用户的订单数据等。
1.2 互联网公司
有的公司本身就是互联网公司,他们会做一些产品,作为自己公司的主流项目。比如阿里巴巴,他们开发有自己的支付宝、蚂蚁金融等产品。
那这样的互联网公司往往都有一个岗位,产品经理。
产品经理职责:及时、准确地捕捉市场需求,去开拓优秀的并被大多用户所需求的产品,以便能够给公司带来新的盈利点,提高公司的市场竞争力。
公司最终开发出来的产品能否在市场中占有一席之地,取决于用户会不会去使用它,也就是能够满足用户的真实需求。所以产品经理捕捉并确定市场用户的真实需求是相当重要的。
确定项目的整体难度,可行性分析、技术分析
如果是一个较为简单的项目,就需要在较短的时间内完成,这样可以效益最大化;如果是一个大型项目,那就需要适当地规划时间久一点,否则可能产品不能按时交付,或者产品性能不是太好。所以根据项目的难以程度,合理的规划工期及资源配置是相当重要的。
可行性分析,并不是所有的需求在技术上都可以实现,有句话叫做“理想很丰满,现实很骨感”。有些需求是当前技术实现不了的,比如要开发一款像人一样智能的语音交互系统,可以像人一样思考问题,可以理解人类的每一句话,那这个就是目前的技术达不到的。(智能语音助手例子)
所以对用户的需求,需要做可行性分析,哪些是目前的技术可以实现的,哪些是暂时实现不了的。对于实现不了的需求考虑有没有折中的办法,或者可以引入一些其他的资源等。比如我们在做爬虫项目抓取数据的时候,需要爬取一个网站的数据,但是这个网站的反爬机制很严格,根本爬不进去,服务端就不返回数据。怎么办?我们可以使用selenium借助浏览器拿数据。那这个就是一个折中的办法,但是这种方法是以降低效率为代价的。
技术分析,就是在技术可以实现的情况下,选择哪种技术可以更好的应用到开发中,提高开发效率和软件性能。比如有个项目需要短期完成,但后期系统的运行效率可以不严格要求,那么就可以选择使用python来开发,提高开发的效率。
需求分析文档,用户确认
把最终的需求分析结果形成文档,让用户确认是否满足用户的真实需求。只有满足了用户的真实需求,才可以继续下一步的开发工作。
需求分析是对外的,概要设计是对内的。在互联网公司还有一个岗位叫架构师,负责整个系统的设计,确定实现方向等。那这些人往往是部门的领导或者骨干人员。(薪资不菲)
在系统设计的时候需要布局整体组织结构,确定使用的什么样的框架等,比如需要开发一个web应用,使用Java SSM(Spring+SpringMVC+Mybatis)框架,还是使用python的Django框架,一般都需要架构师来决定。
概要设计用来指导开发人员后续的开发工作。
确定功能模块。
一个完整的系统都要进行功能模块的划分,这样才能够在团队中明确分工,提高开发效率。
各模块的可行性分析,搭建整体架构图
这里的可行性分析与需求分析中的可行性分析不同,需求分析中的是某个需求能不能使用当前的技术实现;而这里的可行性分析是针对拆分的功能模块,使用指定的技术能否很好的实现。搭建出整体的架构图是必需的,一个好的架构可以满足后续的业务扩展,产品的更新迭代,延长一个产品的生命周期。对于一个不好的架构,那产品可能就存活1-2年就无法继续更新,那就要重新设计、重新开发,这样对于公司来说,投入的成本就太高了。
确定技术思路和使用的框架
对于web应用,使用Java开发的话,一般使用SSM框架;
使用Python开发就使用Django、Flask框架等。
形成概要文档,指导开发流程
确定开发工作的先后顺序
有些项目很大,需要一个团队或者几个团队配合完成,整个系统划分功能模块后,哪些可以先完成,哪些可以后完成,要有一个鲜明的计划。按照计划开发才能有条不紊。
确定时间节点。
计划好每一个时间节点的完成度,规定到达一个时间节点必须完成指定的工作,必须保质保量完成规定的功能模块。在每个时间节点,检查团队的开发进度,保证项目的开发工作稳步推进。
3.人员分工
在每个团队内部确定好人员分工,细化工作要求。
详细设计文档:项目的思路、逻辑
人员流动,便于新人了解项目(单纯的看代码效率不高);
便于项目的后期维护,逻辑流程一目了然。
对于一些外包公司,他们特别重视详细设计,可以重用之前项目的相关的架构和代码,实现快速开发,减少时间和人力成本。如果每次都重新设计系统架构,重新编写代码,那就会投入很大的人力成本,相应的收益就会减少。
功能说明,技术点说明,数据结构说明
在详细设计中,要对系统实现的功能、使用的技术、设计的数据结构等信息进行详细的说明,越详细越好,这样才能更好地帮助别人快速了解项目。
重点代码说明
重点代码需要详细说明,便于后续的理解。一些逻辑功能比较复杂的代码,即使是开发者自己,经过一段时间后再来阅读,理解起来也是不太容易。为了后续便于维护和更新,对重点代码作详细说明相当必要。
在大型互联网公司,这部分一般是由测试工程师完成,通过黑盒测试、白盒测试等技术,设计不同的测试场景,从不同的角度分析软件的缺陷。测试工程师对于产品的改进优化,往往起着至关重要的作用。
但是也有些创业公司不太重视测试这部分工作,就让开发人员自己去测试。那这样的产品没有经过全方位的系统测试,潜在的Bug可能会更多。
测试工程师职责:
按时完成项目与项目时间不足之间的矛盾
需要根据预先制定的时间节点,按时完成规定内容,如果时间不足,不能按时完成就需要额外加班,赶赶进度。如果最终没有按时完成项目开发,导致产品不能准时交付客户,那么公司需要赔付客户违约金。软件开发加班与否,其实还是取决于工作量的完成度,如果在每个时间点检讨项目进度的时候,都能按时完成任务,那么也是可以不用加班的。相反完不成任务就要留下加班了,有时赶上项目发布的时候,甚至通宵达旦也是经常的事。
项目实施人员之间的冲突
技术能力很强的人员之间意见冲突(不知听取谁的意见)
技术能力强与技术能力弱的之间冲突(一快,一慢)
这些冲突需要项目经理去协调。
抓大放小,不过于追求完美
整体功能实现大部分,不在小的问题上花费过多的时间。在有限时间内,先把任务完成,一些小的问题可以放在技术攻关再解决。
开发工具的熟练使用
pycharm/eclipse等
git版本控制工具
word文档的编写、ppt编写