关于分工的思考 (Thoughts on Division of Labor)
Did you ever have the feeling that adding people doesn't help in software development? Did you ever think about the reason? And do you have any idea to make a change?
Traditional software engineering emphasizes on division of work by modules, values cooperation between developers. This looks reasonable at first glance, because it is what we are used to do in the production line of traditional industry. But software development is not a production process, this is why we call it software development rather than software production. The closer analogy for software development is the new production development in traditional industry.
The major challenge of software development is in design, which is about idea but labor. The quality of design can't be improved by adding hands. It even hurts sometimes, because more people means diffusion of responsibility and higher communication cost, which is considered one of the major problem in software development. We usually see that to implement a feature, modification can be made in module A or module B, the owners of the modules argue with each other to reject the modification in their own module. Division of work causes people think from their own local point of view, and protect their own interests, however the whole system hurts. Remember that modules can be loosely-coupled, but people have to work closely to make the whole system work. Traditional software engineering emphasizes on improving cooperation, but I think the otherwise, the better way is reducing unnecessary cooperation, in other words, reducing unnecessary division of work.
Instead of adding hands, what really makes sense is finding the intelligent brains. Quality comes from intelligent brains. As we know, most of the master pieces don't come from cooperation, and so is the good design and implementation in software. For a highly-cohesive complex system like Android, it really doesn't need dozens of people and division of work to have it come true, actually only 2 or 3 intelligent people is enough. In which case dozens of people are really needed? It must be many unrelated systems, such as, Bing, Office and MSN in Microsoft. For any highly-cohesive complex system, I didn't see any reason that 2 or 3 excellent developers are not enough. If 3 people can't make it, 100 neither. The point is not in hands, it's in brain.
Besides finding the intelligent brains, provided currently available people configuration, what can we do better? In my development practice, I value the following practices:
1) Collective Ownership. That means we don't assign a module to a specific developer, instead every developer can write code for any module. The ownership of code is equally shared within the team. Everyone Know All is the philosophy behind. I really appreciate this philosophy in software development. Some say it's too hard for every developer to know every module, this saying is not true. Average IQ is enough to handle every module of complex system like Android, I believe it without any doubt. Do you think your system is more complex than Android? The key is your determination.
2) Feature/Issue Ownership. Code ownership is shared, but every feature or issue should has an owner, and we need to track the status regularly. The owner should be able to work on many modules to finish the task or resolve the issue. Compared with module ownership, feature/issue ownership reduces unnecessary communication cost, avoids many argues between developers of different modules. It also makes developers focus on features that really make sense to user, and think from the system level.
3) Pair Programming/Peer Review. Pair Programming/Peer Review is totally different from traditional division of work. It's not division, it's working together. Pair Programming and Peer Review give inspiration to design, and give feedback to implementation, so they really improve the quality a lot. Even more, people grow much faster in this environment.
To sum up, the idea of having many people and division of work by modules is not a good fit for software development. Remember the 2 golden rules for software development: 1) We need brains but hands. 2) Don't divide, integrate!
关于分工的思考 (Thoughts on Division of Labor)的更多相关文章
- terminal(终端),shell,tty,console(控制台)区别
原文地址 stackexchange:What is the exact difference between a 'terminal', a 'shell', a 'tty' and a 'con ...
- agnentX学习存在疑问?
在RFC2741中这样定义: 4.3中有如下段落: A general architectural division of labor between master agent and subage ...
- 第5章 Hyperledger Fabric功能
Hyperledger Fabric is a unique implementation of distributed ledger technology (DLT) that delivers e ...
- 福大软工 · 第八次作业(课堂实战)- 项目UML设计(团队)
Team information 队名: 彳艮彳亍团队 各成员短学号.名: 学号: 姓名: 本次博客链接: 041602209 黄毓明(临时队长) https://www.cnblogs.com/m ...
- 智课雅思词汇---十三、前缀ab-是什么意思
智课雅思词汇---十三.前缀ab-是什么意思 一.总结 一句话总结:分离,脱离;相反;加强意义 前缀:ab- [词根含义]:分离,脱离;相反;加强意义 [词根来源]:来源于拉丁语前缀ab-. [同源单 ...
- OpenMP for Fortran
OpenMP for Fortran OpenMP Directive Syntax of OpenMP compiler directive for Fortran: !$OMP Directive ...
- IOS 7 Study - UIViewController
Presenting and Managing Views with UIViewController ProblemYou want to switch among different views ...
- [HIve - LanguageManual] Join Optimization (不懂)
Join Optimization Join Optimization Improvements to the Hive Optimizer Star Join Optimization Star S ...
- 对PostgreSQL的prepared statement的深入理解
看官方文档: http://www.postgresql.org/docs/current/static/sql-prepare.html PREPARE creates a prepared sta ...
随机推荐
- 制作bat脚本,抓取Android设备logcat
::bat制作抓取Android设备的logcat,并保存以时间命名的txt文件至设备目录 1 @ECHO off adb wait-for-device ECHO 正在连接设备 adb logcat ...
- qtranslate
qtranslate可以帮助用户快速的建立多语言网站平台,qTranslate 插件就是一个功能强大的 WordPress 多语言插件. 它允许用户在配置页添加新的语言.在 URL 结构方面,qTra ...
- mac+phpstorm+xampp断点调试
1.下载xdebug文件 http://xdebug.org/wizard.php 将phpinfo()的源代码复制到文本框中,xdebug会提示如何配置和下载哪个版本的xdebug. 全部下载地址: ...
- h5容易遗忘的内容
1.表单中 input类型 小补充: 2.常用的表单元素 3.表单属性 4.表单事件 5.多媒体:音频和视频 5.1音频 5.2视频 6.Dom拓展
- ASP.NET探讨:技术的学习顺序问题
作者: シtearシ 来源: 博客园 发布时间: 2011-09-27 08:40 阅读: 7675 次 推荐: 25 原文链接 [收藏] 摘要:很多人对于ASP.NET的入门和学 ...
- 如何关闭eslint
在vue-cli搭建webpack中,使用eslint进行代码规范化检查. 进行关闭,在根目录下有个.eslintignore直接将不想要检查的文件丢进去就可以了 也可以在重构的时候把它关闭掉
- bzoj3631树链剖分
虽然是水题1A的感觉太爽了O(∩_∩)O~ 题意相当于n-1次树上路径上每个点权值+1,最后问每个点的权值 本来想写线段树,写好了change打算框架打完了再来补,结果打完发现只是区间加和单点查 前缀 ...
- java与javac命令的功用
一.javac用来编译java程序,比如说我写了一个Server.java文件,首先通过命令行进入.java文件所在的路径, 然后通过输入 javac Server.java 命令行来完成编译,编译之 ...
- less杂记
less最管用的就是嵌套,让css关系很清晰,虽然增加代码量,我认为也是值得的,不用less的话会有些怀念嵌套的各种优势,但是层次太多,嵌套太长会让可读性变得很差,这点也是个问题. 1.less中的& ...
- SICAU教务系统登录密码加密算法的VB方式实现
关于一个算法.这个算法是SICAU教务系统在账号登录时采取的一个加密算法.算法的实现并不复杂. 具体如下: Function Form1pwdvalue(ByVal pwdvalue As Strin ...