现存项目里加人是一场豪赌

带语气视频版:https://www.bilibili.com/video/BV1ut421a7r1/

副标题:谈软工圣经《人月神话》

我的专业是软件工程,顾名思义,软件和土木之类的相似,也是一个系统性的工程,系统就不免牵扯到人、机、料、法、环的方方面面,其中占据主导因素的就是参与项目的人。

软件工程,研究的便是如何将「软件项目」以标准化「工程项目」的方式去运作,即,尽量剥离掉人的主观能动性,发挥哪里需要哪里搬的“螺丝钉”作用。而不是像现在众多开源兴趣项目那样,以个人开发者的身份掌管一切、运作一切,一旦原作者弃坑,那么项目即宣告死刑,像ReiserFS作者,进监狱之后,Linux内核就把它标记为了Deprecated,无人问津。

但是任何人都不是等同的,作为“螺丝钉”也会有不同的型号,这里先不谈作为个体的独特个性,仅仅是为了能够有效的协作,身处同一个项目的“螺丝钉”们就需要不断地交流来对抗信息差,也即同步信息

以下常见的协作问题很容易遇到:

  1. 大家对项目最终愿景的理解不同(不明白设计初衷/不了解最终客户需求)
  2. 同一职能的人们水平不同(项目中老带新非常常见/某些新技术只有少数人理解)
  3. 分工角色和责任不明确(同一问题可以从不同方面解决/团队中某小团体更为强势)

对于一些小项目可能无关痛痒,十人以内还属于可以有效对齐的规模,依靠定期的会议沟通,即可同步所有人。但一旦超出规模,还按照原先的方式沟通,项目就可能会脱离控制,因为人与人之间的沟通是全连接型的,这时候人们往往会按职能来拆分小团体解决,比如前端团队、后端团队、运维团队、测试团队,本质上还是各个团队的领头人,即leader,承担了原先的职能作用。

设想一下,这样的项目团队,在正常的开发迭代周期内,现在接到了加快推进项目的任务,领导决定派遣更多人手来支援、分担项目任务,新加入项目的人可以直接上手干吗?

很明显不太可能,新人至少需要知道项目需求,阅读项目开始至今的开发文档、会议记录,再和项目组已有的成员沟通细节,才能尽可能地无缝加入项目进程。

而加入一个人,则意味着团队原先的N人,都新增了N条沟通链路,再加一个人,就又是N+1条链路,人越多只会越乱,最终大家在沟通同步上浪费越来越多的时间,导致项目虽然看上去增加了人手,但效率只会越来越低。

有没有一种解决方法呢?我认为有,因为问题的本质出在全连接沟通上,假如有这么一个人,他和所有人交流,并且把所有人的信息都同步到和他一致,那全连接的n²级别链路就简化为了n级别,这个人就是项目经理,所以项目经理这样一个角色,职责非常重要,他是项目不至于陷入混乱的前提和保证。

项目经理就有点类似BGP组网中的路由反射器RR,常规的IBGP节点之间都需要建立全连接关系,有了路由反射器之后,反射器可以作为中间节点汇聚所有路由信息,然后同步给其他IBGP节点,这样节省了节点之间的巨量连线和处理路由信息的额外负载。

https://www.sdnlab.com/20294.html

原图链接:https://img1.sdnlab.com/wp-content/uploads/2017/11/EBGP-IBGP-fig-6.png

当然《人月神话》作为软件工程的圣经,肯定不止告诉了我们这些,后续我看看结合现实再写一篇心得体会,好书值得慢慢回味~

个人能力和个人资源哪个更重要?论“关系户”的合理性

带语气视频版:https://www.bilibili.com/video/BV1vt4y1R7gF/

讨论:/t/1008613#reply38

这个话题其实开始于大概三年前的一次讨论,当时我身为学校实验室的负责人,在忙活一年一度的招新工作。大致介绍下我们实验室的情况,说是实验室,其实更偏向因兴趣结合,有导师带队的项目工作坊,在机器人竞赛方面有着深厚的经验积累和历年优秀的战绩。大家呢基本都是技术出身,每个人在上位机视觉、下位机控制、硬件和机械结构方面各有所长,因为我是软件方面做得比较多,所以软件类的招新题是我来出。

在我们软件组内部商量的时候,就有人提出考核的方式是更偏现场小题,还是工程项目类似的综合大题,前者可以确保考察到个人能力,但是考察方面并不全面,现场如果加上偏整体的简答题,招新时间就会太长,后者自己购置材料,完成类似循迹小车、倒立摆一样的综合课题,现场以硬性的性能指标验收,更能反应综合实力和对自动化、电控等方面的理解,但是会存在作弊的问题,即作品可能是由哪些学长学姐、自己家人帮助完成的,招新现场时间较短,可能提问反映不出来到底是不是自己靠实力独立完成的。

后面我们依然选择了后者,辅以招进来之后集中培训三个月,再来一场笔试考察大家的学习能力。简要讲讲我当时的看法,我和副组长的分歧集中在,面试者如果借用了外力的帮助,这个外力算不算他实力的一部分。我认为算,因为我们招新的目的就是打比赛、写论文、搞专利、做项目,需要能打的人,在项目中遇到一些困难,不管是技术上的困难,还是经济、流程上的困难,都需要人来克服。他这一次通过自己的关系,解决了问题,达成了目的,那下一次在我们的项目中,他也可以继续使用关系来构成帮助,这对我们是有益的。尽管你可能说,这不是他个人实力的一部分,可能做技术的人瞧不起这样没有真才实学的“混子”,但是为了集体的利益目标,他的存在有一定的合理性,而且人不会一直甘愿当一个混子,肯定他也会努力学习,提升自己的实力和话语权的。

从学校出来步入社会后,我发现工作中也是如此,虽然不想承认,但是“关系户”手里的关系,属于个人资源,确实也是个人实力的一部分。有些事情确实就需要这样的人出马,能减轻工作中很多繁琐,这也是我认为的,能够解决问题就是好的,有一点结果导向论了。奋斗、努力、刻苦钻研,最终解决了一个技术问题固然令人称赞,但是现实世界很多问题都不属于技术问题,纯粹是管理、流程类问题。在这些事情上,你的努力很可能就是事倍功半的,搞不好还会出幺蛾子,所以有时候追寻技术的纯粹性是好,也不能忽视别人在另一条路线上的能力。

常常听到,你十年寒窗,凭什么比得上我三代经商。那么普通人就毫无翻身之力吗?我认为也不是,现代教育制度其实已经给大家尽可能的机会平等了,在普世追求面前,给自己孩子安排一个工作,子承父业之类的桥段其实已经少了很多,至少看起来已经很不容易了。阶层固化依然存在,但如果不付出努力,大家的阶层都在往下掉,想要保住还是需要后天,不会出现皇子一出生就世袭这样的事情了。

以上。

分享: 第四次博客重构

视频介绍版:https://www.bilibili.com/video/BV1r14y1i71f/

背景

断断续续博客也重构了四次了

博客园:https://www.cnblogs.com/licsber

语雀:https://www.yuque.com/licsber/blog

目前

自建:https://licsber.site

灾备:https://blog.licsber.site

技术栈

  1. 博客本体:Hexo(基于NodeJS)
  2. HTTPS: Let’s Encrypt 泛域名证书
  3. 灾备:Github Pages
  4. CI/CD:手动build Docker镜像
  5. 镜像仓库:阿里云ACR服务(个人免费)
  6. 静态文件服务:nginx
  7. 反向代理服务:Traefik
  8. 图床服务:Minio + Cloudflare反代(防刷流量)
  9. 服务管理:K8s(杀鸡用激光炮

欢迎友链~