I wrote this for the m5-201 course, which aims at preparing new programmers for real full-stack development and tech team leader roles.
引言
其实,一个软件从无到有的过程中,书写代码只占了一小部分而已。
与其它工程项目(比如造房子、发火箭、修铁路)一样,开发一个软件,需要使用科学的工程方法。否则,代码写得再好,也必然面临失败。
一般,面向技术人员的软件工程课程会采取乙方的视角。具体的场景是,你的客户(甲方)想要你帮忙开发一个软件,你要做的第一步是与之交谈,明确甲方的需求;之后,你只负责按照甲方的需求去把东西做出来,而不需要去考虑做的东西是不是有用,能为甲方带来多少收益。
但是,我们这次会把视角放宽一些,考察整个产品从无到有的流程,并且介绍其中可能会用到的工具。注意,并没有一个所谓的最好的流程,我们需要根据团队和项目的实际情况进行微调。
产品从无到有的流程
准备工作
痛点/商机的分析
一个项目的想法一定不是凭空产生的。可能你在生活中遇到了不方便,或者认为某些问题有更好的解决办法,所以才产生了开发一个产品的想法。这就是痛点
,或者商机
。
但是,你自认为的痛点,不一定就是准确的。所以,要进行详尽的考察。我们可以通过进行市场调研、用户访谈等,验证我们的洞察,从而精准定义我们的产品要解决的问题。
我们会先成立一个小组去做这些事情,通过 Slack
或者 钉钉
互相沟通、发送通知、管理团队事务。
最终,我们必须十分确定,我们定义出来的问题是真实存在的,而且用户有解决问题的需求。
解决方案/可行性分析
在前一步,我们已经将问题定义好。在这一步,我们开始定义解决方案。
比如,我们通过上一步的工作,确认了在校生存在难以获得申研相关信息的问题,我们打算解决它。
我们可以这样做:为每位同学匹配一位申研成功的优秀学长或学姐,当作申研导师,一对一传授经验。
但是,学长学姐可能很忙,并不能提供太多帮助,所以多半不可行。
我们可以考虑,用人工智能代替真人进行服务,但是这对算法有极高的要求,技术上多半不可行。
或者,我们可以搭一个平台,让申请成功的学长学姐把经验分享在上面。这在各方面似乎都是比较可行的方案。
于是,我们确定了解决方案。这才进入到软件工程的领域。也是在这里,一个项目才正式确立并开始进行。最初的小组会转变成一个正式的项目组,更多人会加入之前创建的 Slack
或 钉钉
小组。
从这里开始,我们就要使用 Trello
或者 Jira
进行项目管理了。具体的做法,我们会在 任务分配和进度把控
板块介绍。
需求分析
上面两个步骤,通常不是纯技术人员主导的(也许是市场或运营部门)。但是,从这里开始,技术人员就开始介入了。
在这一步,技术人员要与其它部门的人紧密合作,将解决方案细化。
上一步的解决方案是,我们要做一个申研经验分享的平台。到了这一步,我们要把它细化到以下程度:
我们的平台需要运行在 Web 和微信小程序端。
我们的平台要让用户登录后使用
用户需要发布申研数据
用户需要浏览其它人发布的申研数据
用户可以在申研数据下自由讨论
用户可以对申研数据进行收藏、点赞、举报、分享到朋友圈。
…
这一步,各位熟悉的 UML
图就可以排上用场。大家可以使用 Visual Paradigm
或者 亿图
之类的绘图软件作图,帮助团队梳理项目的脉络。
非常重要的一点是,我们要评估手上的资源(包括时间、人力、资金等等),将所有的需求分出优先级,必要时进行舍弃。
技术选型
当确认了软件需求之后,我们要选择,用什么软件/框架去开发。
比如,是 Web 端和微信小程序分开做呢,还是直接用 uni-app
写,然后多端编译?我们的后台是用 SpringBoot
,Django
还是 node.js
?如果用 node.js
,我们是用原生 node.js
,还是用 express
?数据库是选择 MySQL
还是 MongoDB
?是使用自建服务器还是云服务器?我们要根据项目和团队的实际情况,进行讨论,分析利弊,谨慎地作出选择。
开发
经历了这么多准备工作之后,这才到了写代码的部分。
我们把项目切碎,分发给每个开发人员,在 Trello
和 Jira
上设置好时间线,通过 GitHub
管理代码,并尽量多地让这些软件之间联动(比如,Jira
可以通过 commit message
追踪 GitHub
的 commit
,非常好用)。
这个过程设计到一些代码规范,比如注释、文档、测试等等,我们之后会接触到。
推广
产品开发到一定程度(具体什么程度要看团队,存在那种还没开始开发就狂吹产品的团队),运营部门就会开始收集素材,包括文案、图片、视频等,然后制作推文、海报等推广用的东西。
完成之后,市场部门就会拿着这些内容到处进行精神污染(i.e. 宣传),恨不得大家睁眼闭眼全是这些东西。
上线
假定我们开发和测试都没啥问题,我们的产品就可以部署、上线了。
不出意外的话,用户会有很多反馈,比如新功能的需求和 bug 报告。技术人员需要一直维护,包括密切监视服务器状况、更新版本等等。当然,运营和市场的人会继续宣传;在必要的时候,法务、公关、财务也需要介入。
任务分配和进度把控
这是涉及项目管理的内容。和开发一样,项目管理也是需要专门去学习的。虽然它的入门门槛不是特别高,但要做好非常困难。我们并非专业,只能根据经验,给出一些建议。以下内容仅代表个人看法。
任务分配和进度把控项目管理的核心之一。在项目的最终目标明确之后,我们要把它拆解成一个一个的小任务,设立好时间线。一个很好用的方法是,采用倒推的办法。
比如,我们的平台八月份要上线,那么我们得七月份左右完成开发和推广内容制作,五月份要开始开发,四月中旬要把需求定好。然后,每个节点,又可以分成更小的任务,直到不能再分。就开发任务来说,通常一个页面的制作,就可以认为是不能再分的最小的任务了。
任务划分好之后,我们要把任务分配到每个人身上。我们的建议是,每个任务,要有且仅有一个负责人,和明确的截止日期。项目经理和部门负责人,每过一定时间,就去观察一下进度,而不是放手不管,在截止日期当天才去问,任务完成了没有。
Trello
和 Jira
是很好用的工具,可以很方便地把以上的 guidelines 落实下来。