[翻译Joel On Software]无痛功能规范 – 第三部分:不过…如何去做?/Painless Functional Specifications - Part 3: But... How?

本文探讨了程序经理在软件开发中的重要角色,包括需求收集、规范编写及跨部门协调等职责,并强调了其对于产品方向性和团队凝聚力的重要性。

Joel on Software

Painless Functional Specifications - Part 3: But... How?

无痛功能规范第三部分:不过如何去做?

by Joel Spolsky Wednesday, October 04, 2000

Now that you'veread all about why you need aspec and what a spechas in it, let's talk about who should write them.

既然你已经了解了为什么你需要规范规范包含了那些部分,让我们聊聊谁应该写规范。

Who writesspecs?

谁应该写规范。

Let me give you alittle Microsoft history here. When Microsoft started growing seriously in the1980s, everybody there had read TheMythical Man-Month, one of the classics of software management. (If youhaven't read it, I highly recommend it.) The main point of that book was thatwhen you add more programmers to a late project, it gets even later. That'sbecause when you have n programmers on a team, the number ofcommunication paths is n(n-1)/2, which grows at O(n2).

让我先给你讲一点微软的历史。严格来说,20世纪80年代的微软开始增长的时候,每个人都读过 人月神话 ,软件管理的经典之一。(如果你没读过,我极度推荐你去读读。)那本书的主要观点是当你往一个延迟的项目加派程序员的时候,项目会延迟的更多。 因为当你的团队里有n个程序员的时候,沟通路径为n(n-1)/2,以O(n2)渐进速度增长。

So theprogrammers at Microsoft were worried about how to write bigger and biggerprograms, when the prevailing wisdom of the day was that adding programmersjust makes things worse.

因此微软的程序员担心如何来编写越来越大的程序,因为那个时候盛行的观点认为往项目加派程序员只会把事情变得更糟。

Charles Simonyi,Microsoft's long time "chief architect", suggested the conceptof master programmers. The idea was basically that one masterprogrammer would be responsible for writing all the code, but he or she wouldrely on a team of junior programmers as "code slaves". Instead ofworrying about debugging every function, the master programmer would basicallyjust prototype each function, creating the bare outline, and then throw it toone of the junior programmers to implement.  (Of course, Simonyi would bethe Master Master Programmer.) The term "Master Programmer" was a bittoo medieval, so Microsoft went with "Program Manager."

Charles Simonyi,微软长久以来的“首席架构师”,提出了称为“主程序员”的概念。主要观点是:一个主程序员负责所有代码的编写,但是他或她可以依赖一个团队的初级程序员-“码奴”。主程序员基本上应该给出每个程序的原型,仅创建大致的轮廓,然后把它扔给初级的程序员去实现而不是担心去调试每一个函数。(当然,Charles Simonyi自己是主程序员。)“主程序员”的这种概念太中世纪了,所以微软使用了“程序经理”这一称谓。

Theoretically,this was supposed to solve the Mythical Man-Month problem, because nobody hasto talk to anyone else -- every junior programmer only talks to the one programmanager, and so communication grows at O(n) instead of O(n2).

理论上,这应该可以解决“人月神话”问题的,因为没有人需要跟其他人交谈了—每个初级的程序员只和一个程序经理交流,因此交流以O(n)而非O(n2)渐进增长。

Well, Simonyi mayknow HungarianNotation, but he doesn't knowPeopleware.Nobody wants to be a code slave. The system didn't work at all. Eventually,Microsoft discovered that despite the alleged Mythical Man Month, you can stilladd smart people to a team and get increased output, although at decreasingmarginal values. The Excel team had 50 programmers when I was there, and it wasmarginally more productive than a team of 25 would have been -- but not twiceasproductive.

恩,Simonyi也许知道匈牙利符号表示,但他不知道人件。没有人想要成为码奴。这种体系根本无法工作。实际上,微软发现虽然有宣称的人月神话,但你还是可以把聪明人加入到团队里获得增长的家国,虽然边际效值减了。当我在的时候Excel团队有50个程序员,边际上来讲是比25个人的团队更加有效率的, 应该是 – 但不是两倍那么有效率。

The idea ofmaster/slave programming was discredited, but Microsoft still had these peoplecalled program managers bouncing around. A smart man named Jabe Blumenthalbasically reinvented the position of program manager. Henceforth, the programmanager would own thedesign and the spec forproducts.

主/从编程的概念被扫地出门了,但微软还是到处保留着这些叫做程序经理的人。一个叫做Jabe Blumenthal的聪明人基本上重新发明了这种程序经理的职位。从那以后,程序经理负责产品的功能规范和设计。

Since then,program managers at Microsoft gather requirements, figure out what the code issupposed to do, and write the specs. There are usually about 5programmers for every program manager; these programmers are responsible forimplementing in code what the program manager has implemented in the form of aspec. A program manager also needs to coordinate marketing, documentation,testing, localization, and all the other annoying details that programmersshouldn't spend time on. Finally, program managers at Microsoft are supposed tohave the "big picture" of the company in mind, while programmers arefree to concentrate on getting their bits of code exactly right.

从那以后,微软的程序经理搜集需求,搞清楚代码应该要做什么,然后编写规范。 通常一个程序经理配有5个程序员;这些程序员负责用代码实现程序经理用规范描述的功能。程序经理同时需要协调销售,文档,测试,本地化,以及其他所有程序员不应该花时间的繁琐细节。最后微软的程序经理应该脑海中有公司的“大方向”,而程序员可以自由地专注在把他们的代码写对。

Program managersare invaluable. If you've ever complained about how programmers are moreconcerned with technical elegance than with marketability, you need a programmanager. If you've ever complained about how people who can write good codenever do a good job of writing good English, you need a program manager. Ifyou've ever complained about how your product seems to drift without any cleardirection, you need a program manager.

程序经理是无价的,如果你曾经抱怨过程序员应该专注员技术优雅而不是销售,那么你需要个程序经理。如果你曾经抱怨过能够写得一手好代码的人绝不可能写出好英语文章,那么你需要个程序经理。如果你曾经抱怨过你的产品如何漂浮着找不到方向,那么你需要个程序经理。

How do you hirea program manager?

怎样招聘程序经理?

Most companiesdon't even have the concept of program manager. I think that's too bad. In mytime, the groups at Microsoft with strong program managers had very successfulproducts: Excel, Windows 95, and Access come to mind. But other groups (such asMSN 1.0 and Windows NT 1.0) were run by developers who generally ignored theprogram managers (who weren't very good anyway, and probably deserved to beignored), and their products were not as successful.

大多数公司甚至没有程序经理的概念。这太糟糕了。在我那个年代,微软有着优秀程序员的团队有着非常成功的产品:Excel,Windows95和Access浮现在脑海里。但其他的团队(例如MSN1.0和WindowsNT1.0)由通常忽视程序经理(实际上没那么好,应许应该被忽略[w1] )的开发者运行,他们的产品就没那么成功。

Here are threethings to avoid.

三件事性应该避免。

1.      Don't promote a coder tobe a program manager.  The skills for being agood program manager (writing clear English, diplomacy, market awareness, userempathy, and good UI design) are very rarely the skills for being a good coder.Sure, some people can do both, but they are rare. Rewarding good coders bypromoting them to a different position, one that involves writingEnglish, not C++, is a classic case of the PeterPrinciple: people tend to be promoted to their level of incompetence.

2.     不要把程序员提升成程序经理。 当好程序经理需要的技能(清晰的英语写作,沟通能力,销售意识,深入用户,好的界面设计)通常不会是好的程序员的技能。 当然有的人两样都能做,但是这很少见。奖励好的程序员但把他们提升到不同的职位上,这个职位要求的是好的英语写作水平而不是C++编写水平,这种情况是典型的Perter原则:人们倾向于被提升到他们不擅长的水平。

3.     Don't let the marketingpeople be program managers. No offense, but Ithink my readers will agree that good marketing people rarely have a goodenough grasp of the technology issues to design products.

4.    不要让销售人员担任程序经理。无意冒犯,但我觉得读者们都会同意好的销售人员几乎不可能足够了解技术问题来设计产品。

Basically,program management is a separate career path. All program managers need to bevery technical, but they don't have to be good coders.  Program managersstudy UI, meet customers, and write specs. They need to get alongwith a wide variety of people -- from "moron" customers, toirritating hermit programmers who come to work in Star Trek uniforms, topompous sales guys in $2000 suits. In some ways, program managers are the glueof software teams. Charisma is crucial.

基本上,项目管理是个完全不同的职业发展。所有的程序经理都必须是非常技术类型的,但他们不需要成为很好的程序员。程序经理研究UI,拜会顾客并且编写规范。他们需要和各种各样的人搞好关系 -- 从“白痴”客户,到穿着星际迷航制服来上班的烦人的隐士程序员,到自大的穿着2000美金的销售人员。 在某种程度上程序经理是软件团队的胶水。魅力是至关重要的。

3. Don't havecoders report to the program manager. This is a subtle mistake. As a program manager at Microsoft, Idesigned the Visual Basic (VBA) strategy for Excel and completely speced out,to the smallest detail, how VBA should be implemented in Excel. My spec ran toabout 500 pages. At the height of development for Excel 5.0, I estimated thatevery morning, 250 people came to work and basically worked off of that hugespec I wrote. I had no idea who all these people were, but there were about adozen people on the Visual Basic team alone just writing documentation forthis thing (not to mention the team writing documentation from the Excel side,or the full time person who was responsible for hyperlinks in the help file.)The weird thing was that I was at the "bottom" of the reporting tree.That's right.NOBODY reported to me. If I wanted people to dosomething, I had to convince them that it was the right thing to do. When BenWaldman, the lead developer, didn't want to do something I had speced out, hejust didn't do it. When the testers complained that something I had speced wasimpossible to test completely, I had to simplify it. If any of thesepeople had reported to me, the product wouldn't have been as good. Someof them would have thought that it's inappropriate to second-guess a superior.Other times, I would have just put my foot down and ordered themto do it my way, out of conceit or nearsightedness. As it was, I had no choicebut to build consensus. This form of decision making was the best way toget the right thingdone.

不要让程序员汇报给程序经理。 这是个细微的错误。作为微软的程序经理, 我设计了ExcelVisualBasic(VBA)策略,完整的规范了所有最小细节,VBA在Excel里应该如何实现。 我的规范大概有500多页。 在Excel5.0开发的时候,我预计每天早上,250个人来上班,都在实现那个大规范里的东西。 我完全不知道这些人是谁,但是仅VisualBasic团队就有几十个人在负责为这个东西文档(更不要说为Excel那边写文档的团队了,或者是负责为帮助文件创建超链接的那些人了)奇怪的是,我处于汇报层级的底端。这是对的。没人汇报给我。如果我想要人们做点儿什么,我必须说服他们这是正确的要做的事情。当开发领导Ben Waldman不想要做我规范里的东西的时候,他就没做,当测试人员抱怨说我规范里的东西无法完整测试的时候,我就要去简化它。如果这些人汇报给我,产品就不会像现在这样好。他们中的某些人认为不应该猜测上级。其他时候,实际上是的,处于短见和虚荣,我就会把腿放下命令他们以我的方式来做。 这种形式的决策制定是做好正确事情的最佳方式。

The final article inmy series on specs talks about how to write good specs that people want toread.

这一系列里的最后一篇文章讨论了如何写出人们想要读的功能规范。


 [w1]

源码下载地址: https://pan.quark.cn/s/a4b39357ea24 谷歌公司设计了一款无费用且具备开源特性的网络浏览器,名为Chrome,因其卓越的速度、稳定性和安全性而广受赞誉。该浏览器运用了前沿的Web渲染引擎Blink以及JavaScript引擎V8,旨在保障网页载入与脚本运行的卓越效能。为应对无网络环境下的Chrome安装需求,特别准备了离线安装包。此压缩文件内含32位与64位两种规格的Chrome浏览器离线安装方案,具体文件名分别为"chromedev_x64-v68.0.3423.2.exe"与"chromedev_x86-v68.0.3423.2.exe"。在文件命名中,"x64"标识64位版本,适用于64位操作系统平台,而"x86"则对应32位版本,适配32位操作系统。文件名中的"v68.0.3423.2"代表Chrome的一个特定版本号,各版本可能涵盖安全补丁、性能改进或新增功能。与32位Chrome相比,64位版本具备如下长处:能够处理更多内存容量,从而提升多任务作业能力;针对现代硬件的优化使其运行更为迅猛;64位版本更具备高级别的安全防护,能更周全地抵御恶意软件的侵袭。尽管如此,32位版本对于仍在使用32位操作系统的用户,或是在系统资源需求不高的场景下,依然适用。在部署Chrome浏览器时,用户需依据其个人计算机的操作系统平台,挑选匹配的版本进行安装。通过双击相应的.exe文件,安装流程将自动启动,一般包含接受使用许可、确定安装路径及构建桌面快捷方式等环节。若在安装阶段遭遇难题,可参照提示信息或联系技术支援获取协助,同时该压缩文件发布者亦表明欢迎用户以留言形式反映问题。Chrome浏览器的主要特质涵盖:直观的用户界面设计...
内容概要:本文围绕直驱式永磁同步电机(PMSM)矢量控制系统的建模与仿真展开研究,基于Simulink平台构建了完整的控制系统仿真模型,涵盖了电机本体数学建模、三相/两相坐标变换(Clarke/Park变换)、磁场定向控制(FOC)、电流环与速度环双闭环PID控制策略、空间矢量脉宽调制(SVPWM)技术以及转速调节器设计等核心技术环节。通过仿真实验验证了该控制策略在动态响应速度、稳态运行精度及抗负载扰动能力方面的优良性能,充分体现了矢量控制在实现电机高性能调速中的优势,为永磁同步电机在工业驱动、新能源汽车和高端装备制造等领域的实际应用提供了可靠的理论依据与技术支撑。; 适合人群:具备电机学、电力电子技术和自动控制原理基础知识的电气工程、自动化、机电一体化等相关专业的研究生、高校教师、科研人员,以及从事电机驱动系统、新能源汽车电驱、工业自动化设备研发的工程技术人员。; 使用场景及目标:①深入理解永磁同步电机矢量控制的基本原理与实现机制;②掌握在Simulink中搭建高精度电机控制系统仿真模型的方法与技巧;③为电机控制算法的设计、优化与参数整定提供高效的仿真验证平台;④服务于高校课程设计、毕业课题研究、科研项目前期验证及企业产品开发中的控制策略测试。; 阅读建议:建议结合经典电机控制教材进行对照学习,重点关注各功能模块间的信号流向、反馈机制与参数耦合关系,动手复现并调试仿真模型,通过改变PI参数、负载条件和给定转速等方式观察系统响应,从而深入掌握控制策略的内在逻辑与性能优化方法。
代码下载地址: https://pan.quark.cn/s/a4b39357ea24 Java学习路线(鱼皮)是一个全面且循序渐进的Java开发技能培养方案,该路线从基础入门直至高级应用,致力于协助学习者高效地掌握Java编程的全部核心内容。此学习路线的独特之处在于其新颖性、系统性、实践性、开放性以及社区回馈与持续迭代更新。其核心构成涵盖了预备阶段、Java入门知识、Java进阶技能、Java高级技术、Java框架应用以及Java项目实践等多个学习模块,每个模块均整合了相应的知识点、学习策略与资源指引。在预备阶段,学习者需配置在线编程环境、选择笔记工具、熟悉Markdown文档编等基本技能,为编程学习奠定基础。在Java入门阶段,学习者应重点掌握Java编程的基础理论、开发环境配置、IDEA集成开发环境的使用、项目创建与执行调试、界面设置及插件配置等关键技能。在Java入门阶段,学习者还须深入理解Java基础语法、数据结构类型、程序流程控制、数组操作、面向对象编程、方法重载机制、封装原则、继承特性、多态表现、抽象类的概念、接口定义、枚举类型、常用类库、字符串处理、日期时间管理、集合框架、泛型编程、注解应用、异常处理机制、多线程技术、IO流操作、反射机制等核心知识点。在Java进阶阶段,学习者需要重点学习Java 8的更新特性、Stream API的应用、Lambda表达式的使用、新的日期时间处理API以及接口默认方法的实现。在Java高级阶段,学习者需要掌握Java框架的应用、Spring Boot框架的搭建、Spring Cloud微服务架构的实施等高级技术。在Java项目阶段,学习者需要学习Java项目开发的全过程操作,包括项目架构设计、项目编码实现、项...
内容概要:本文围绕基于Matlab代码实现的卫星信号传播模拟研究,系统阐述了卫星信号在大气层及空间环境中传播特性的数值仿真方法。研究通过建立精确的数学模型,对信号衰减、传输延迟、多普勒效应以及噪声干扰等关键物理现象进行建模与仿真分析,全面还原实际通信场景下的信号行为特征。该仿真体系不仅可用于验证通信链路设计的可靠性,还能为星地链路预算、抗干扰策略优化及接收机算法开发提供理论依据和技术支持。; 适合人群:具备一定Matlab编程能力、通信原理基础和电磁波传播知识的高校研究生、科研机构研究人员及从事卫星通信系统设计与仿真的工程技术人员。; 使用场景及目标:①用于高校课程中卫星通信相关理论的教学演示与实验教学;②支撑航天通信项目的链路性能评估与系统参数优化;③为新型调制解调、纠错编码和信号增强算法的研发提供可验证的仿真平台;④辅助科研人员开展低轨星座、深空探测等前沿领域的通信建模研究; 阅读建议:建议读者结合经典通信理论教材,深入理解各模块的物理意义,动手运行并调试提供的Matlab代码,尝试调整轨道参数、大气模型和噪声水平等变量,观察其对信号质量的影响,进而拓展模型以适配不同卫星轨道类型或复杂多径环境,提升综合仿真与分析能力。
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 ### 常用电流电压检测电路:详细解析与实际应用 在电力电子技术范畴内,电流电压检测电路是达成各类电力设备控制与监测的关键构成部分。本资料将详细研究几种普遍应用的电流电压检测电路,意图辅助读者深入掌握其运行机制、设计要素及实际运用环境。 #### 一、电网电压同步检测电路 电网电压同步检测电路主要致力于完成电力系统中逆变器输出与电网电压之间的精确同步。以DSTATCOM(配电网静态同步补偿装置)为例,其系统硬件主要由主回路、控制回路以及检测与驱动回路三大部分组成。其中,检测电路负责采集3路交流电压、6路交流电流、2路直流电压和2路直流电流,同时还包括电网电压同步信号。 1. **常用电网电压同步检测电路及其特性** - **RC滤波模块**:用于滤除电网电压中的高频杂波,保障电压检测信号的纯净度。例如,在图2-2中,由电阻R5(1KΩ)和电容C4(15pF)构成的RC滤波装置,其时间常数远小于系统输出频率,有效降低了系统与电网的相位偏差。 - **过零比较单元**:如LM311,用于识别电网电压的过零时刻,从而实现电压信号的同步处理。过零比较单元输出的方波信号可用于控制单元的同步操作。 - **上拉限幅与非门电路**:用于强化驱动能力,确保信号符合微控制单元的输入标准,如TMS320LF2407的输入信号标准。 2. **脉宽调制PWM同步信号电路**:基于ADMC401芯片的PWM发生装置,通过PWMSYNC引脚提供与开关频率同步的PWM同步脉冲信号。此电路结合光电隔离元件TLP521与D触发器MC14538,实现精确的过零时刻检测与信号同步。 3. **缓冲与比较单元电路...
源码链接: https://pan.quark.cn/s/976d0efeb74a 最近重装了Windows10,发现风扇转动异常,查看任务管理器发现系统和压缩内存进程占用CPU达20%-30%,在网上查阅了2天资料,找到了解决方法,如是分享出来,让大家更好的使用Windows10系统。 在Windows 10操作系统中,有时用户会遇到一个令人困扰的问题,即“系统”和“压缩内存”进程占用大量的CPU和内存资源,导致计算机性能下降,甚至风扇高速运转,这可能对用户的日常使用体验造成不小的影响。 这种情况通常与系统的内存管理机制有关,特别是涉及到Windows的内核组件ntoskrnl.exe。 ntoskrnl.exe是Windows操作系统的核心系统文件,它负责管理和调度系统资源,包括内存管理。 在某些情况下,尤其是系统进行自我优化或内存清理时,这个进程可能会占用大量CPU资源。 而“系统”进程则包含了Windows 10内核及一些基本服务,当它与“压缩内存”进程一同高占用,可能意味着系统正在进行内存压缩以释放空间,或者是因为某些后台活动导致了额外的压力。 要解决这个问题,一种可能的方案是禁用内存自检任务,这个任务可能会在系统空闲时触发,导致不必要的CPU和内存负载。 具体步骤如下: 1. 通过搜索栏或控制面板进入“管理工具”。 2. 在管理工具中找到并打开“任务计划程序”。 3. 在任务计划程序库中,导航到“Microsoft” > “Windows” 节点。 4. 在该节点下,你会看到“MemoryDiagnostic”子目录,双击进入。 5. 你会发现有两个与内存诊断相关的任务,通常是“RunFullMemoryDiagnostic”和“RunMemoryDiag...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值