转注:英文原文写于 2011 年

导读:没有人比Linus Torvalds更了解软件开发项目管理中的酸甜苦辣了。作为Linux的创建者,Torvalds在过去二十年指导了数以千计的开发者共同改进开源操作系统内核。

文章内容如下:

Linus Torvalds说,有两件事,世界上大都数人,无论是独立开发者还是公司级别的开发团队,都有普遍的错误认知。

其一:“大都数人认为可以把事情丢给其他人,让他们帮忙。在你公开你的想法后,你得假设自己一个人要干完全部的活,然后你在网上征求人们的意见,你应该询问自己该干什么,而不是他们该干什么。或许开始他们会偶尔帮助你解决一些实际问题,但是,必须从一开始就告诉自己这份工作只有你一个人负责,并且做好完成它的准备。”

如果你一开始就认为全世界的人们都会联合起来为你的项目工作,一起创造一个更美好的世界,那么你可能不会走得很远。

其二:“人们往往认为自己写的代码是最重要的东西,而事实不是这样。即使你编写了100%的代码;即使你是世界上最好的程序员并且从来不需要任何帮助。然而最重要的东西也不是你写的代码,而是代码的用户。代码本身不重要;只有当用户真正用到它的时候项目才是有用的。之所以提到这一点是因为它不只是一个程序员的问题,我见过一些公司把追求完美的程序当做事情的全部。”

Torvalds就第二个问题上继续展开言论,他说:“这就是为什么Linux内核团队无法容忍这种‘脱离本质’的东西。比如,为了“修复”某个问题而打破原来的用户体验绝对是错误的观点;千万不要这么干。如果你破坏了用户体验,或许你觉得是在修复问题,但你就犯了刚才说到的第二个错误——你以为代码质量比用户重要,大错特错。”

Torvalds最后总结道:“有太多的项目将代码质量置于用户之上,结果两边都不讨好,而且还不肯承认错误,因为他们觉得是在“修复”问题,并且一点都没错。”

关于开发工具的重要性

关于SCM(Software Configuration Management软件配置管理系统 )工具,比如,以Git版本控制系统的问题为例,他回答说:“我不认为工具是最重要的。”

“现在重要的是你的项目是否有一个好的工作流程,工具当然能够启到帮助的作用,”他说,“但是,大多数的项目其实并不是必须要使用这些工具。许多项目其实并没有那么多改动,多到必须要在他们整个工作流程中使用这些工具;如果你在每个release中只有几百个补丁,你可以随便怎么维护他们,完全手动也不是问题。”

当然,Linux就绝对不是同一个层次的了,“对于内核,我们每个release都有成千上万个补丁,而且基本上每三个月就有一个release,所以对我们来说SCM工具就尤其重要了。”他说,“但我仍然不认为这所有大的错误是因为最初几年开发的目标球和补丁,这是一个小得多的项目,而且直到很多年后是因为缺乏管理工具才显现出来。”

他还说,“一些工具积极鼓励工作流程,我认为CVS(Concurrent Versions System并发版本控制系统)”例如已经影响了很多项目,使他们有了一个概念“承诺团体”,

Torvalds继续说,“我个人认为tar-balls和补丁相比他来说要好得多,因为他们使开发者都是“平等”的。而且你不会遇到这种情况:一些开发者有委员权限而其他的人都是二级权限。有时全部人都只有二等权限要比有人有特权要好得多。”(注:Torvalds很熟悉CVS很而且非常讨厌有很多年时间了。就如他在Google Talk 2007所说的,“我讨厌带着许可证的CVS”。)Torvalds还说:“比工具更重要的是人,是维护者和他们的思想。”

如何把大家都保持在正轨上

现在的人们是怎么一起工作的呢?我向Torvalds提问了关于正在实施中的LKML(Linux Kernel Mailing List ,用来将讨论话题转发给各位开发者。)他回答说:“我认为过去在LKML上发生的讨论比现在的多。LKML中的signal-to-noise和纯信息量表明大多数开发者没有时间仔细地去读LKML——最多他们会扫一下标题栏。所以,现在我主张大多数开发者都在独自完成工作,然后他们会在一个大的开发者范围中发送email告之对方是如何完成的”。

“并不是说LKML不重要,而是说LKML已经成为了独立开发者的公共纽带。所以事情最后会变成这样:你其实只有4-5个人一同参与一个讨论,但是LKML会转发并且让其他人有机会能够参加进来,而不是让他成为一个封闭的讨论。”

接下来说说它怎么工作的,“大多数人其实不阅读LKML,他们经常让它自动存档,只对某几个关键词或关键人物参与的话题感兴趣。”它其实有点类似于某种存档机制。人们可以在日后查阅它,而且很多Bug可以通过Google找到LKML中以前报道的记录。如果某人提出了一个问题,它可能只是个别硬件问题,但如果Google后发现在LKML中已经被提交过几次了,那这个问题原因会有点不确定,但必然不是个案。”

“所以我认为LKML非常重要,但我们不是通过它来保持人们走在正轨上的。所有的开发者都非常主动积极,而且他们都有非常好的意见和想法(核心成员之所以是核心成员因为他们的自我定位)。LKML很重要,因为这是公开讨论的,即使实际中参与某些特定问题的只有特定的一小组人。在开源项目中事情就是和其他不一样。”Torvalds总结道。

关于信任,托付和保持清醒

曾经Linux是一个个人项目。现在他有成千上万的提交者和贡献者。接下来我问道:“现在有多少工作你是交付给其他人做的?对于如何分配才能保持人们思路清晰和遵循工作流程你有什么想法?”

“如果我从中学到了什么的话,那就是你必须学会放手,不要试图控制别人和他们的代码。如果你不信任别人,而一定要监视着他们的话,还是早点放弃这个负责人位置吧。”

他说:“是的,我经常会跟别人纠结一些细节,但不是因为我不信任别人或不愿分配给他们权限。而是因为一些小错误最后会闹到我头上。要么是个Bug(而且都是一些平时忽视的小错误),要么是一些把我弄烦了的工作流程问题(就像今天早些时候我向一个分负责人抱怨开发者的名字显示不正常)。”

Torvalds还说,“你只能偶尔关注一下细节,而不是老是站在开发者后面监视他、检查他写的每一句代码。我相信分负责人做的事99%都是没问题的,然后偶尔我会大声抱怨一些东西。”比如说GNOME桌面系统正在怎么改进,或者根本没有改进。

以上就是全部内容了。这就是Torvalds怎么做的,如果你觉得你比他好,先问问自己:有创造过一个在大多数超级计算机、股票交易和类似于Google这样的网站上运行的世界级的操作系统吗?如果你的答案是没有,如果我是你,我会重新读一遍他的答案并且好好想想自己是怎么维护项目的。

Linus 谈软件开发管理经验(转载)的更多相关文章

  1. Linus 谈软件开发管理经验

    原文出处: linuxtoday   译文出处:CSDN // 伯乐在线转注:英文原文写于 2011 年 导读:没有人比Linus Torvalds更了解软件开发项目管理中的酸甜苦辣了.作为Linux ...

  2. 【转载】浅谈TDD、BDD与ATDD软件开发

    转载自(此处仅供学习):http://blog.csdn.net/zhenyu5211314/article/details/22033295 1. 首先了解一下这三个开发模式都是什么意思: TDD: ...

  3. 郑晔谈 Java 开发:新工具、新框架、新思维【转载】【整理】

    原文地址 导语:"我很惊讶地发现,现在许多程序员讨论的内容几乎和我十多年前刚开始做 Java 时几乎完全一样.要知道,我们生存的这个行业号称是变化飞快的.其实,这十几年时间,在开发领域已经有 ...

  4. Python 浅谈编程规范和软件开发目录规范的重要性

    最近参加了一个比赛,然后看到队友编程的代码,我觉得真的是觉得注释和命名规范的重要性了,因为几乎每个字符都要咨询他,用老师的话来说,这就是命名不规范的后续反应.所以此时的我意识到写一篇关于注释程序的重要 ...

  5. [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套

    转自:https://mp.weixin.qq.com/s?__biz=MzI0MDk0ODcxMw==&mid=2247483680&idx=1&sn=c5fd069ab3f ...

  6. python浅谈编程规范和软件开发目录规范的重要性

    前言 我们这些初学者,目前要做的就是遵守代码规范,这是最基本的,而且每个团队的规范可能还不一样,以后工作了,尽可能和团队保持一致,目前初学者就按照官方的要求即可 新人进入一个企业,不会接触到核心的架构 ...

  7. 浅谈传统语音通信和APP语音通信音频软件开发之不同点

    本人在传统的语音通信公司做过手机和IP电话上的语音软件开发,也在移动互联网公司做过APP上的语音软件开发.现在带实时语音通信功能的APP有好多,主流的有微信语音.QQ电话.钉钉等,当然也包括我开发过的 ...

  8. 音频软件开发中的debug方法和工具

    本文系作者原创.如转载,请注明出处. 谢谢! 音频软件开发同其他软件开发一样,都需要去调试.音频软件调试同其他软件调试方法有相同的地方,也有不同的地方,同时调试时还需要借助一些专门的工具,有了这些方法 ...

  9. nw.js桌面软件开发系列 第0.1节 HTML5和桌面软件开发的碰撞

    第0.1节 HTML5和桌面软件开发的碰撞 当我们谈论桌面软件开发技术的时候,你会想到什么?如果不对技术本身进行更为深入的探讨,在我的世界里,有这么多技术概念可以被罗列出来(请原谅我本质上是一个Win ...

随机推荐

  1. [LeetCode] 329. Longest Increasing Path in a Matrix_Hard tag: Dynamic Programming, DFS, Memoization

    Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...

  2. 《Java程序设计》第一周学习记录(2)

    目录 使用JDB调试程序 系统文件被覆盖的挽救 参考资料 使用JDB调试程序 JDB是JDK自带的基于命令行的调试程序.我们先来man一下吧(说到这里,我之前在翻娄老师的博客的时候看到一篇文章:做中学 ...

  3. MVC5 您不能调用控制器“xx”上的操作方法“xx”,因为该方法是一种泛型方法

    在 MVC5 中当使用   routes.MapMvcAttributeRoutes() 添加路由属性是导致在控制器创建的泛型方法调用错误: Cannot call action method 'Sy ...

  4. 强势龙头股的 VOLM5/35/135 走势,可作为逃顶参考

    强势龙头股的 VOLM5/35/135 走势,可作为逃顶参考

  5. gitlab4.0备份还原

    一,备份 备份默认路径查看: gitlab/config/gitlab.yml 中的backup: 默认tmp/backups ====>这个是gitlab/tmp/backups/  可不是系 ...

  6. 函数max()优化

    函数max的优化 用途:查询最后支付时间-优化max函数 语句: select max(payment_date)from payment 执行计划:

  7. Docker日志

    搜索Redis镜像 docker search redis ***************************** 拉取Redis镜像 docker pull redis ************ ...

  8. 软工网络15团队作业4——Alpha阶段敏捷冲刺7.0

    1.每天举行站立式会议,提供当天站立式会议照片一张. 2.项目每个成员的昨天进展.存在问题.今天安排. 成员 昨天已完成 今天计划完成 郭炜埕 实现前端各界面的跳转连接 学习后端相关知识 郑晓丽 完善 ...

  9. 学习笔记<1>技术体系结构

    Android的系统架构采用了分层架构的思想,如上图所示.从上层到底层共包括四层,分别是   1.应用程序程序层   2.应用框架层   3.系统库和Android运行时 4.Linux内核.   每 ...

  10. STL之Vector容器

    1.Vector容器 1)vector是将元素置于一个动态数组中加以管理的容器. 2)vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). 3)vecto ...