人月神话的困境:项目经理的挑战与转变

线性思维的束缚与局限

很多“聪明人”的思维都是线性思维,拿到任务,分解成小项,逐个完成,一步一步的像是在做证明题:期待着攒够一个又一个的事实和推理,最后拼图一般将它们串起来,达成某项任务。逻辑层面上看起来无懈可击,仿佛一切困难都可迎刃而解。

不可否认的是这套思维在应试方面屡试不爽,因为有一个天然的假设是存在的:“所有问题都有标准答案,问题在设计上就是逻辑可解的”。但是习惯这套“逻辑“的人,在处理现实世界的问题时,往往会不自觉地将自己带入死胡同。

逻辑、事实关联的对立与统一

我将以上方法论称之为逻辑关联,与之相对的即是事实关联,生活中不乏遇到这种思维陷阱:

  • 白菜3块钱一斤,15块钱可以买五斤白菜
  • 你们工厂一个月可以生产3000个零件,那明天先给我10个吧
  • 这个项目比较急,上次排期的工时是一周,我再给你一倍的人,三天给我做出来

有时候其实很难意识到这样的思考模式存在的问题,这也是《人月神话》里屡次提到的困境,可能上面的例子不太直观,代入下现实生活:

  • 生一个孩子需要9个月,生一对双胞胎需要18个月
  • 生一个孩子需要9个月,9个妈妈是不是只要1个月?!

专注解决问题的思维方式久了,就会慢慢开始只在乎逻辑关联,而忽略事实关联,就会开始期待一种“银弹”,说是缘木求鱼也不过如此。

初级项目经理常见的误区与反思

很多初级项目经理最常犯的错误就在这里,总是期待着任何事情都有一个进度条,这样就可以直观的反馈当前进展,自己要做的也就不过是按照排期表往下催进度。

这种人最喜欢问的问题就是“你这个要多久才能做出来?”,行使着身为“管理者”的特权,却不承担应有的角色义务。

项目经理这个角色,真正应该问的问题是“你还需要哪些其他的帮助可以提升你的速度?”。优秀的项目经理知道,项目进度不是靠完成了多少来判断,而是靠如何拥有足够的资源进行最大规模的试错。项目经理确保的应该是满足需求,成功交付。

然而现实中X-Y本末倒置的现象非常普遍,即为了完成某个目标,制定了一些KPI(关键绩效指标),最后完全忽视了原初的目标,而去追求后定的KPI。就像是前段时间北京环卫工人买新鲜白菜当厨余垃圾事件,政策目标是垃圾分类,管理者制定了每种垃圾必须的数量指标,然后只考察这个数量指标,下面执行的人就变了味,偏离初衷,最终酿成悲剧。

软件行业里人的特殊性

再者,项目经理在向上汇报进度的同时,也在享受作为一个管理者的荣誉,以及成功后收割胜利果实。这使得执行层面的人本身就对这些只能汇报进度,却无法承担执行工作的人非常敌视。

况且在软件开发这个对人依赖非常大的领域,管理起来更需要一定的水平积累。项目经理每天跟人打交道,要知道人是有感情的,绝对不是你给他输入1+1,他就给你输出2。同一个功能点同一个人,由于其工作状态的差别,也会产生巨大的差异,如果主动积极做,可能只要1天,消极怠工的做,就无法预期了。这在传统行业是无法想象的,因为只要按规定的程序和规范来建房子,即使换一拨工人,也可以在同样的时间建造出来,建出来的房子的质量也不会相差太远。要知道,再烂的挖土机也能挖出一个大坑。

结果导向与过程管理的平衡:避免悲剧的关键

执行时,对软件工程师来说,遇到问题,解决问题。但如果遇到的问题占用了比预期更多的时间,则是对自己能力和自信的打击。此时如果项目经理也不专业,硬推进度,工程师就会出现一些掩盖问题的行为。

我总觉得,负责技术攻坚的人也去追进度就很可惜。悲剧的根源是管理能力和技巧的不足,如果真的想做到结果导向,需要的是目标的制定和拆解,工作计划的精确评估和执行,真实有效的复盘,信息同步与应对突发状况的能力,这些都对领导者有很高的要求,如果能力不足以管理结果,那大家就只能来管理过程,最终陷入恶性循环。

参考

工程师想要做管理?先改变你的思考方式

从程序员到项目经理:为什么要当项目经理

花开堪折直须折

给你讲一个故事吧。

母校湖边有一处牌子,上面写着“花开堪赏直须赏,莫要折花空赏枝”。

我觉得不好。花期到了,恰是最美的时刻。似,恰同学少年,风华正茂,更需把握时机,趁春光正好,趁风头正劲,发挥好这一刻。

哪怕为了这一刻就此香消玉殒,也要勇敢地去追求,积极地去争取,莫要让时间风化一切,人生从来不是活365天,而是活在每一个耀眼的瞬间。

依我看来,这正是“花开堪折直须折,莫待无花空折枝”。

Docker使用buildx来取代传统build并同时构建多架构镜像

简介

Docker更新了build流程,提供了全新的构建工具,原先的docker build命令已经被标记为@deprecated啦!是时候学习新的buildx工具,开始装逼啦努力追上时代啦~

1
2
# sudo pacman -S docker-buildx
sudo docker buildx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Usage:  docker buildx [OPTIONS] COMMAND

Extended build capabilities with BuildKit

Options:
--builder string Override the configured builder instance

Management Commands:
imagetools Commands to work on images in registry

Commands:
bake Build from a file
build Start a build
create Create a new builder instance
du Disk usage
inspect Inspect current builder instance
ls List builder instances
prune Remove build cache
rm Remove a builder instance
stop Stop builder instance
use Set the current builder instance
version Show buildx version information

Run 'docker buildx COMMAND --help' for more information on a command.

使用方法

其实吧,和普通的build相比,没啥区别,但是多了好多集成化的功能,请看示例:

1
2
3
4
5
sudo docker buildx build \
--platform $PLATFORM \
-t "$IMAGE:$TAG" \
-t "$IMAGE:latest" \
--pull --push .

可以看到,pull(始终拉取新镜像,指FROM里的内容),push(自动build后push),platform(新增多架构构建),还是有着节省行数的好处的(

另外,x86的机器上也可以直接构建arm镜像啦,这里使用树莓派常用的arm64(也就是aarch64)举例,首先我们要建立一个buildx环境:

1
2
3
4
5
sudo docker buildx create \
--name multi_platform \
--use --platform \
linux/amd64,linux/arm64 \
--driver docker-container

然后用ls命令即可看到这个环境支持的架构:

1
sudo docker buildx ls
1
2
3
4
5
NAME/NODE         DRIVER/ENDPOINT             STATUS  BUILDKIT             PLATFORMS
multi_platform * docker-container
multi_platform0 unix:///var/run/docker.sock running v0.12.5 linux/amd64*, linux/arm64*, linux/amd64/v2, linux/amd64/v3, linux/amd64/v4, linux/386
default docker
default default running v0.11.7+d3e6c1360f6e linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/amd64/v4, linux/386

可以看到,后面有些奇怪的东西,x86怎么还有v2、v3、v4,这激发了我的好奇心,搜索发现,其实是指令集更新的区别,这里Golang给的最直观:

来自:https://go.dev/wiki/MinimumRequirements

1
2
3
4
GOAMD64=v1 (default): The baseline. Exclusively generates instructions that all 64-bit x86 processors can execute.
GOAMD64=v2: all v1 instructions, plus CMPXCHG16B, LAHF, SAHF, POPCNT, SSE3, SSE4.1, SSE4.2, SSSE3.
GOAMD64=v3: all v2 instructions, plus AVX, AVX2, BMI1, BMI2, F16C, FMA, LZCNT, MOVBE, OSXSAVE.
GOAMD64=v4: all v3 instructions, plus AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL.

检测

关于自己的发行版目前支持的指令集,可以用以下命令查看:

1
/lib/ld-linux-x86-64.so.2 --help | grep "x86-64-v"
1
2
3
x86-64-v4 (supported, searched)
x86-64-v3 (supported, searched)
x86-64-v2 (supported, searched)

还有不少人(Gentoo狂热者?)把自己电脑里所有程序都改成v4构建的,以提高性能,Ubuntu文档里就有这样说:

https://cn.ubuntu.com/blog/optimising-ubuntu-performance-on-amd64-architecture_cn

还有Arch系的大佬介绍:

https://blog.chyk.ink/2022/08/11/arch-linux-upgrade-to-x86-64-v3-microarchitecture/

视频演示

B站:https://www.bilibili.com/video/BV14A4m1V7zT/