最近读了Aaron生前写得《The Pokayoke Guide to Developing Software》原文地址:
http://pokayokeguide.com/,收获很多,分享一下。
需求
- 客户需求是一个好项目的基石。不要做没人想用的东西。
- 一个客户的准确需求比60亿人的理论需求靠谱。因为准确需求即意味着一个忠诚客户,60亿人的理论需求可能意味着nothing;另外,人性是共通的,一个忠诚客户意味着你很容易找到更多相同的客户。
- 做自己能感受到的需求,最好是需求自己来源于自己。如果不是,那么你最好能够按照目标用户的生活方式去感受一下,是否真的存在这个需求;如果这也做不到,那么你至少需要仔细研究你的目标用户,弄清楚他们的真实需求。
- 弄清真实需求和虚假需求,有时候,对某个Idea的过度热爱,会蒙蔽你,让你觉得真的有这样的需求。因此,对于自己过度热爱的想法,最好能找到一个无关人员的需求和你的一致。
想法
- 有了需求之后,需要的是实现这个需求的想法,冷静客观的评估你的想法,是否真的能满足所有需求。想法必须以需求为基础,而不是因为对某个想法的喜爱,而在自己心中设想许多不存在的需求。只从一个需求出发,去认真思考一个想法,比想同时满足多个需求好。
- 想法源于一个需求,并不是说不存在同时满足多个需求的想法。好的想法可以,但是这个想法天生就是某几个问题的解决方案,但是其本来是来源于一个需求的。而不是把一个解决方案拧巴成能够适应多个需求的想法。
- 当有了一些基础的想法之后,千万不要过早的进入各个细节。但是,基础想法进入你的脑袋之后,无可避免的会有各种各样的附加想法,特性钻进你的脑袋,好像你不做点关于新想法的事,就没办法安心。这个时候,只需要把所有的想法写到一个文档中,在记录的过程中,就有机会把所有的想法列出优先级。也许你以后都不会再去看这个文档,但是找个地方,安静的写下这些想法,可以防止这些想法一直骚扰你。
假设前提
- 确认了解决方案之后,接下来就是实现它,这个时候,很容易整个人投入进去,开始一步一步的构建一个完整系统,生怕自己做得少了,其实,在项目刚开始的时候,开发者应该想的不是怎么做更多,而是怎么做更少。
- 每一个想法都是基于一些假设的,如果这些前提假设是错误的,那么想法毫无疑问是会失败的。因此,做最少的事情去验证想法里面的每一个假设,使用Lean Startup的MVP(Minimum Valuable Product)概念,和验证环,一步一步的构建你的产品。
团队
- 想法有了,如何验证产品假设的策略也有了。接下来可以开始构建产品了,第一步就是确定该产品的“Product Owner”,就是这个产品的“乔布斯”,“张小龙”。 该Owner的责任是保证所有完成特性的一致性。
- 使用卡片管理描述每一个Task,它的目标用户是哪些,这个Task能够给用户带来哪些价值以及如何验证这个Task的效果。这样,整个产品的构建过程就被分成了一张张的卡片。
- 有了卡片之后,需要根据优先级排列,越重要的假设前提需要越早验证。排定好优先级之后,团队的UX和Product Owner选取最高优先级的卡片,开始设计该特性的用户体验,一定确定,由Product Owner拍板,然后转交给开发人员开始开发该特性。
- 在实际的开发过程中,如果实现或者实际使用过程中导致多次修改原来的用户体验设计,那么就有必要引入Product Owner来对每次修改进行把关。
开发
- 测试自动化是必须的。
- Pair Programming,让开发人员更有融洽,更有乐趣一点吧。
- 每次提交之前,请检测一下所有的代码改动。
架构
- 所有的代码都放到同一个版本库中,如果该系统涉及多个团队维护的多个模块,那么建议拆分为多个应用,以Service Interface的形式相互协作。
- 显式声明所有的依赖,不依赖任何不曾使用的库。
- 所有在各个环境会使用不同值的东西,使用单独的文件保存,并且能够很容易的切换使用不同的配置文件。
- 所有的后台服务都当做远程服务,不要把本地的和远程的区别对待,它们都是通过网络服务的。
- 代码部署分为3个阶段, build(包括代码的编译,构建等), release(获取对应的配置文件,放置到对应的服务器上), run(运行系统)。 这3个阶段必须是相互隔离,不能在一个阶段做另一个阶段的事。
- 系统的所有进程是无状态,所有关于状态的信息,都应该统一保存在某一个后台服务中。
- 每个应用都是自我完备的,只需要 通过端口和外部通信。
- 应用应该可以Scale out,可以通过增加新的instance就可以提升吞吐率。
- 应用应该很容易启动,关闭,并不对系统造成任何损害。
- 开发环境和产品环境尽可能一致,最好是只有配置文件上的一点差别。
- 由基础设施提供日志功能,而非应用本身,应用只需要把日志内容写到标准输出流。
- 所有的管理任务应该只是一次性流程。
- 使用Chaos Monkey测试系统的健壮性。
部署
- 每一个后台服务的Code Change都应该通过migration服务完成,该服务知道如何回滚所有的变更。每次的变更都要同步,保持代码中的版本,和后台运行的版本一致。migration服务功能一定要严格测试。
- 不要使用code brunch,所有人都向Main Line提交代码。如果实在是有没完成的特性变更,可以使用Feature Toggle使该部分代码不影响当前版本的系统行为。
- 每一次代码提交都应该触发CI,重新Build,测试整个系统。
- 构建一个监控系统,监控整个部署过程,如果一些关键的业务指标被新版本影响,该监控系统需具备自动回滚到前一版本并通知开发团队的能力。
- 任何没有经过Product Owner查看过的特性代码不能出现到产品行为中,开发代码特性的控制权给Product Owner,让他们可以选择性的添加某些用户使用某些特性,以验证某些业务假设。如果效果好,就可以逐步开放直到该特性开放给所有的用户。
发布
有人喜欢好莱坞式的发布流程,发布前几个月就开始造势什么时候发布什么东西,这对于电影,硬件可能是对的,但是对于软件系统来说,这并不是一个好的发布宣传,因为软件产品的bug是在所难免的,造势太早,导致把一些小问题暴露在过多的用户面前,而且很多用户会对功能吹毛求疵,对系统开发会造成很大影响。
软件系统发布更倾向于一种温和的,逐步提升的发布方式,先拥抱小部分迫切需求客户,让他们使用系统,同时根据他们的反馈改进系统,再通过他们邀请更多的用户,在研究新的客户价值,在这个不断循环的过程中,你就拥有了一个好的系统,和很多的用户。
分享到:
相关推荐
业主意见是指客户对软件开发项目的看法和建议。 验收签字是软件开发项目验收报告的最后一个步骤,包括项目验收确认单、项目名称、项目经理、验收地点、验收时间、序号、功能模块、验收内容、验收意见等方面。 软件...
- 时间管理:由于精力有限,一些创新的想法未能付诸实践。 4. **解决方案** - 主动学习:在做好本职工作的同时,Nancy计划研究新的技术,以填补技术盲点。 - 软技能提升:通过专门练习和学习,Nancy将致力于提高...
### 软件开发的201个原则 #### 一、概述 《软件开发的201个原则》是一本全面阐述软件开发过程中应当遵循的原则性指导书籍。该书内容丰富,覆盖了从项目启动到交付的各个阶段,旨在帮助软件开发团队提高产品质量、...
只有当这些元素都得到妥善考虑和实施,才能确保软件开发项目得以顺利进行,生产出高质量的软件产品,同时也为企业的长期发展打下坚实基础。团队建设的成功与否,直接影响到软件开发的效率、质量,乃至企业的竞争力。...
### 编程修养:软件开发人员的个人修养 在当今高度依赖信息技术的社会中,软件开发已成为推动科技进步的关键力量之一。而作为软件开发的核心——程序员的角色显得尤为重要。一名优秀的程序员不仅需要掌握扎实的技术...
"软件开发技术面试常见题目" 本资源摘要信息收录了软件开发面试中常见的题目,涵盖了通用问题和专业问题两方面。通用问题涵盖了项目经验、技术栈、问题解决、团队协作等方面;专业问题涵盖了 Java、C、C++、数据...
### 软件工程思想与软件开发的关键知识点 #### 一、软件工程的基本概念与重要性 《软件工程思想》这本书讲述了软件开发的核心理念以及如何成为一名优秀的程序员。它强调了软件工程的重要性,尤其是在解决“软件...
### 软件开发流程与质量管理之迭代式开发详解 #### 一、软件开发活动概述 软件开发是一项复杂且精细的工作,涉及多个阶段和活动,每个环节都对最终产品的质量和性能有着不可忽视的影响。通常,软件开发过程涵盖...
- **Scott Splavec**(高级软件工程师):表示即使自己已经拥有了Pragmatic Bookshelf系列的其他书籍,但《敏捷软件开发实践》依然带来了很多新的想法和见解,非常适合新开发者或希望转型敏捷的开发团队。...
- **沟通的不可能性**:第17页指出,在软件开发领域,即使是最基本的概念和想法也很难通过语言或文字完全传达给他人。 - **倾听的三个层次**:第22页介绍了有效沟通的重要技巧之一——倾听,分为被动听、主动听和...
在IT行业进行对日外包软件开发时,熟悉并掌握一定的日语知识是极其重要的。这不仅涉及基本的沟通交流,还包括对专业软件开发词汇的理解和使用。根据提供的文件内容,我们可以总结出以下几个方面的知识点: 1. 基本...
在软件开发过程中,需求分析是至关重要的第一步,它决定了项目的成功与否。需求分析的主要目标是理解和定义用户的需求,确保开发出的软件能够满足客户的实际需求,直指问题的核心。在这个阶段,我们需要与用户进行...
### 从架构师的角度解析软件开发流程 #### 需求分析阶段的重要性 软件开发是一项复杂而精细的任务,尤其在需求分析阶段尤为重要。这一阶段决定了后续设计、编码、测试等环节的方向与效果。架构师在需求分析阶段...
在这一部分,读者能够领略到软件开发中理论知识的重要性,这些理论知识是将想法转化为现实的科学工具。 除了科学性,软件开发还具有显著的艺术性。在这一部分,书中探讨了创造性问题解决、用户体验设计和团队协作的...
软件开发项目经理提到了客户需求的变化、数据库设计的重要性、软件界面的设计等问题,并提出了自己的看法和解决方案。 通过这篇自我评价范文,我们可以了解到软件开发项目经理的经验和体会,了解到软件开发过程中的...
然后,本文档提出了我们的想法,即框架和开发标准免费提供给企业使用,联合培训机构,对学生进行培训,培训机构按框架标准培训学生,软件开发企业接收经过培训的学生,使用开发框架来开发软件。这将有助于解决软件...
本文是关于大学生软件开发实习的总结报告。通过实习,作者不仅获得了软件开发的实践经验,还获得了宝贵的人生经验。 知识点1:软件开发的重要性 文章强调了软件开发的重要性,在软件开发中,团队合作和沟通是非常...