打造高质效的技术团队 —— 混乱篇

wKioL1TPZijQpnKhAAocUAjXwjU842.jpg

2012年平安夜,我离开工作了近十年的通讯行业投身互联网行业,入职了当时阿里巴巴旗下的淘宝浏览器开发团队。过去的两年,这个团队完成了从淘宝浏览器过渡到UC浏览器电脑版开发团队的巨变。之所以说是巨变,是因为整个开发团队的工作方法、工作质量和精神风貌在过去的两年发生了翻天覆地的变化。在这个过程中,我作为“领头羊”引领着开发团队向前发展,并在最近有机会成为了带领包含开发和测试在内的整个技术团队继续向前发展的负责人。

 

个体在两年内取得巨大变化相对容易,而对于一个团队来说挑战就大了很多,因为其中包含了技术和管理两方面的内容,甚至是我个人对于软件行业的理解及所持有的技术和管理理念。在目前中国IT行业的大环境下,UC浏览器电脑版开发团队何以取得如此之大的进步相信被不少人所好奇。也正因如此,我想通过文章与大家分享。与此同时,通过这些文章与我的团队共同总结过去两年所发生的变化和让团队知晓将来如何发展得更好。

 

为了避免这类文章过于空洞,本文将基于我个人在过去两年所看到的、所想的,以及所采取的方法的形式加以展开。

 

混乱

二年前我之所以选择加入淘宝浏览器团队,正是因为看中了Google的Chromium开源项目,因为淘宝浏览器正是基于它的二次开发产品。那次面试时其实并没有多少Windows的编程经验(只有大约半年),当时面试官之所以看中我,最大的原因是我有Motorola的架构师经历。入职后,在一封主管回复给我的邮件中他告诉我:“其实,将你招聘进来是一次非常大的冒险。因为,一是你没有互联网行业的经验;二则担心你这次转行适应不了新环境。然而,从你的邮件来看,这种担心完全是多余的,你进入角色的速度远远超出我的预期”。收到这封邮件的回复时,我入职并在Chromium的软件架构上已花了有一个星期的时间。

 

在接下来的三个星期里,因为我是一名新人,所以没有被安排具体的开发任务,而我也一直将时间投到了掌握Chromium的软件架构上。即便在之上当时总共花了大约一个月的时间,但对于Chromium这一被我称之为“恐龙级”的项目来说,这点时间真的是杯水车薪。

 

之后,我被安排从事一些简单的界面编程工作。对于我这个新人来说,当时团队对于项目计划的乐观程度着实让我吓了一大跳。对于那些在项目上有经验的人来说,很简单的工作要我二天完成其实并不容易。原因在于,我之前并没有将时间投入到了解界面与程序中类的对应关系,团队也没有在这方面有任何文档沉淀帮助我上手工作。好在有周围同学们的帮助,加上自己的钻研,我还是如期地完成了被安排的开发工作。

 

第一次接触淘宝浏览器的代码真可用“震惊”两个字去形容当时的心情。首先,代码的组织完全忽视了Chromium的软件架构。这造成的问题有二方面。一方面是代码目录结构与层级一片混乱,每位同学想怎么处理都行,结果就是自有代码很难维护;二则,由于没有很好地关注Chromium的软件架构,这使得自有代码与Chromium的原生代码耦合度很高,从而导致升级Chromium内核工作很是困难。其次,编码格式没有统一的标准,“不堪入目”的代码让人一瞄就知道编程效率和质量不可能高到哪儿。

 

在入职的前半年时间里,我一边“独善其身”地工作着,力争让自己的工作成果与Chromium的保持高度一致;一边不时地通过即时通(阿里是用旺旺的)和邮件指出所看到的不良编程行为和分享自己的一些思考。坦白说,作为一名新人,在开始指出他人的问题时并不能让人愉快地接受。相反,很容易让人觉得“这个人怎么到处在挑刺?”主管看到我时常指出团队的问题,很是担心这样团队接受不了我,为此专门在一次谈话中向我提及该事。在这种背景下,之前出书、写博客的经历,加上在指出问题时往往会告知背后的原理,以及自己以身作则的各种工作习惯,让我慢慢地博得了大家的认可与信任。最终结果向良性方向发展的关键在于,大家看到了我的能力,以及感受到我希望团队发展得更好的做事初衷。

 

另外,前半年工作时间除了让我慢慢融入团队,还给了我很多观察团队的机会,让我看到了团队其他更多的问题。首先,整个团队的工作方式过于原始,基本上是采用编码后测试验证通过就发布软件的方法。由于概要设计和代码走查流程的缺失,使得开发工作差不多就是各自为政,技术方案的优劣和编码质量的高低都没有把关。其次,严重存在“重新发明轮子”的问题。由于项目计划总是过于乐观,在项目时间并不充裕的情况下,大家一拿到需求的第一反应就是开干,而不是先研究Chromium是否存在为我所用的方案、模块和函数、结构是否与Chromium的保持一致。概要设计和代码走查流程的缺失使得“重新发明轮子”的行为很难发现和被纠正。再次,整个团队在知识管理方面一片空白。团队中找不到任何一份文档指导个体如何开展开发工作,也由于个体所掌握的知识没有通过文档化的方式输出,使得整个团队的个体成为了“知识孤岛”,个体的学习成本更高,团队效率更低。最后,完全“闭门造车”。作为一款基于Chromium开源项目二次开发的产品,除我之外几乎没有人关注开源社区的动向,大家只是低着头干,视野很是局限。

 

前半年工作时间还让我形成了自己的一些思考。

 

互联网行业的产品对于用户体验很是考究。然而,让人分裂的是,产品后面的团队似乎并不关注自己的工作体验。他们用着原始的工作方法,采用简单加班的苦劳方式,却无法从本质上改变自己的工作和生活质量。

 

互联网行业对于“天下武功,唯快不破”存在严重误解。从功夫的角度,武林人士之所以能做到“快”(形式)的跟本在于他的内功(能力),也就是说没有深厚的内功则“快”跟本没有支点。然而,大家在引用“唯快不破”时,只看到了表象,甚至将之当作解释自己工作质量不尽人意的借口。在我看来,对于“快”的正确理解应是产品的所有功能根据一定的优先级、以满足可持续发展所需的质量要求的方式分阶段实现,而非以牺牲赖以可持续发展的工作质量去换取。有一点我们一定不能欺骗自己的是,因为“内功深厚”而有意忽视质量求快呢?还是根本不知道如何获得高质量而以“快”做幌子?“唯快不破”之所以运用广泛,是因为创新产品存在巨大的用户红利,而这种红利很可能快速变成产品的用户粘性而形成竞争优势。即便如此,“唯快不破”并没有隐含“牺牲质量换取速度”。对于目前已一片红海的PC浏览器市场,如果没有形成自己的核心技术竞争力,则很难用低质量的“快”打出自己的一片天地。

 

淘宝浏览器时期的团队还存在极为严重的内核升级之痛。Chromium大约一个半月推出一次大版本,而基于Chromium的淘宝浏览器别说跟上Chromium的发展步伐,就是做一次内核升级也因为得重放大量的代码而周期很长。由于Chromium的发展步伐很快,且每一个版本几乎都存在对已有功能的代码重构而导致大量的变更,一旦跟不上其发展步伐,就会造成大量的变更被累积到下一次内核升级工作之时,从而使得下次内核升级的工作量更为巨大。

 

现在回过头来看,那时的淘宝浏览器团队虽然不少同学有很好的技术积累,但由于做事方法缺乏规则的约束和不具专业性而难以发挥团队的效能。团队走过了不少弯路、犯过了不少错,只是那时的团队还没有完全意识到。此外,那时的团队也根本没有意识到Chromium项目所蕴藏的软件开发方面全方位的知识宝藏。

 

整个团队正等待着一次全面改善的机会!

 

相信读者对于像淘宝浏览器这样的团队并不陌生,甚至正经历着这样的团队。或许,有的人对于这样的团队并不感到有何不妥,因为在他们看来,这样的团队同样能够在业务上取得巨大成功,业务成败与团队的水准似乎毫无关系。然而,我想提醒的是,对于大家都骑马前往目的地时,总会有骑马的人先达到;但如果其中有某位是驾车前往时,最先到达目的地的一定是他。而且,两种出行方式的过程舒适度截然不同!


作者微博:@至简李云


本文出自 “至简李云” 博客,请务必保留此出处http://yunli.blog.51cto.com/831344/1610878

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
一般实现session共享,最常用的一种方法就是通过memcached-session-manager。下边我就说一下,怎么通过memcached-session-manager实现session共享。 首先建一个放软件的目录,进入此目录。 [root@node1~]#mkdir-p/taokey/tools[root@node1~]#cd/taokey/tools/ 2.把下载好的apache-tomcat-7.0.57.tar.gz和jdk-7u71-linux-x64.gz软件包上传到服务器上。 [
项目环境: 系统版本: centos6.6-x86kernel:2.6 HAproxy 版本: haproxy-1.5.2-2.el6.x86_64 Keepalived 版本: keepalived-1.2.13-4.el6.x86_64 拓扑结构: 前端使用 HAproxy 调度客户请求,部署 keepalived 避免单节点故障,有两个站点 www.test.com 和 www.dragon.com 的业务需求,后端部署四台服务器为两个站点做动静分离 , 把 www.dragon.com 的 DNS
[前言] 都说Docker是最当红的热点,但是我没环境测试,怎么办哪?没关系,只要你有Windows 8或者Windows 10就行啦!还告诉大家如何利用docker来快速构建、启动WordPress博客! 参考文档 http://blogs.msdn.com/b/scicoria/archive/2014/10/09/getting-docker-running-on-hyper-v-8-1-2012-r2.aspx 本文将和大家一起分享如何在Windows系统里快速构建boot2docker测试环境,
准备工作 环境: RedHat 5.8 (我这里用的是 redhat5.8 的版本,可以根据自己的情况灵活进行选择其它的发行版,但是编译环境和依赖的库一定要具备) 软件: apr-1.4.6. apr-util-1.5.4 httpd-2.4.12 libmcrypt-2.5.8 mcrypt-2.6.8 mhash-0.9.9.9 pcre-8.33 php-5.4.38 xcache-3.0.1 mysql-5.5.41-linux2.6 一、编译安装 apache 1 、解决依赖关系 (1) 编译安
一、我们可以重新搭建服务器,也可以利用我前面的搭建方法编译安装,地址: http://wangzan18.blog.51cto.com/8021085/1605480 ,本次我们使用yum的方法来安装httpd和mysql,我的搭建环境还是我们的CentOS6.6 x86-64位mini版,其中可以有许多依赖软件包是没有安装的,搭建视情况而定;如果搭建使用我上述源码编译的httpd,记得开启cgi模块,如有需求也可以开启suexec模块;现在已经有我安装好的邮件服务器,大家可以注册登录进去查看:mail.
MongoDB 日志切换(Rotate Log Files)实战 1. 在mongo shell下,执行logRotate命令: useadmindb.runCommand({logRotate:1}) 需要在mongos,mongod,config server运行。 该方式的变种: a) 在unix shell下运行: mongolocalhost/admin
这两天在几家客户那里介绍微软的Windows Azure,有几个精彩的demo我还录制了视频。没成想迅雷播放器在我的Windows 10预览版上似乎得了水土不服之症,每次打开视频,最起码要卡10~15秒钟才正常开始播放,让我有一种很强的挫败感。 作为一名IT技术人员,自然不能无视这个故障,也不能简单地重装其他播放器。----深入其虎穴,捉得虎子,才是硬道理。 Windows工程师手边最好的排错工具,当然是Sysinternals Suite。有性能问题,首先得找Process Monitor,所以赶紧用来
Netfilter/Iptables Layer7 应用层过滤策略 Netfilter/Iptables 作为一个典型的包过滤防火墙体系,对于网络层,传输层的数据包过滤具有非常优秀的性能和效率,然而,对于一些面向局域网上网用户的Linux网关服务器,有时候还需要使用QQ,MSN等聊天,使用BT下载工具等现象进行封锁。下面将介绍如何为Netfilter/Iptables 增加应用层过滤。 QQ,MSN等聊天,使用BT下载工具均使用了相对固定的应用层协议。使用L7-filter项目的补丁文件包可以为linux

linux网卡的vlan配置 - 2015-04-20 06:04:18

如果服务器上连的交换机端口已经预先设置了TRUNK,并允许特定的VLAN可以通过,那么服务器的网卡在配置时就必须指定所属的VLAN,否则就不通了,这种情形在虚拟化部署时较常见。 例如在一个办公环境中,办公所在VLAN为1020,虚拟化的物理主机上有两块万兆网卡,分属与3111和3112VLAN,这三个VLAN间可以互通,那么该如何配置呢? 一 . 首先要确认 Linux 系统内核是否已经支持 VLAN 功能: 当前使用内核以及操作系统版本: [root@test ~]# cat /etc/redhat-r
系统:CentOS 6.6 x86_64(两台虚拟机) 安全:SElinux disabled 网络:业务网络 + 心跳网络 Heartbeat版本:v3.0.6 Cluster Gule版本:v1.0.12 Resource Agents版本:v3.9.6 软件包安装方式:源码安装 Heartbeat 3.0以后是由 gule、heartbeat、agents 三部分组成。因此,我们需要分别安装。 事先必须安装好必要的基础工具及编译工具: gcc 系列 flex 和 bison编译解析 net-snmp