最近读了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页介绍了有效沟通的重要技巧之一——倾听,分为被动听、主动听和...
"软件开发部员工绩效考核表.pdf" 软件开发部员工绩效考核表是对软件开发部员工的工作表现进行评价和考核的表格。该表格包括多个项目,分别对员工的工作业绩、技术资料汇总、工作能力、沟通能力、灵活应变能力、工作...
在IT行业进行对日外包软件开发时,熟悉并掌握一定的日语知识是极其重要的。这不仅涉及基本的沟通交流,还包括对专业软件开发词汇的理解和使用。根据提供的文件内容,我们可以总结出以下几个方面的知识点: 1. 基本...
在软件开发过程中,需求分析是至关重要的第一步,它决定了项目的成功与否。需求分析的主要目标是理解和定义用户的需求,确保开发出的软件能够满足客户的实际需求,直指问题的核心。在这个阶段,我们需要与用户进行...
### 从架构师的角度解析软件开发流程 #### 需求分析阶段的重要性 软件开发是一项复杂而精细的任务,尤其在需求分析阶段尤为重要。这一阶段决定了后续设计、编码、测试等环节的方向与效果。架构师在需求分析阶段...
软件开发项目经理提到了客户需求的变化、数据库设计的重要性、软件界面的设计等问题,并提出了自己的看法和解决方案。 通过这篇自我评价范文,我们可以了解到软件开发项目经理的经验和体会,了解到软件开发过程中的...
6. Java 软件开发的看法:本篇记录中作者也提到了其对 Java 软件开发的一些看法,例如 Java 软件开发的能力、跨平台的能力、资源损耗大等。这些都是 Java 软件开发中需要注意的看法。 7. 实习经验教训:本篇记录中...
然后,本文档提出了我们的想法,即框架和开发标准免费提供给企业使用,联合培训机构,对学生进行培训,培训机构按框架标准培训学生,软件开发企业接收经过培训的学生,使用开发框架来开发软件。这将有助于解决软件...