并发编程的灵魂:CAS机制详解
最近跟一个阿里的朋友聊到关于程序员如何把事情做得更好,他提到了很多在阿里的感受,让我受益匪浅。
所谓“如何把事情做得更好”,就是跳出写代码这件事,如何把我们的工作做好,获得更多的个人成长,获得更好的绩效考核结果6 4 h 9 `,并能Y E l t b f l在其他人中脱颖而出。
思维碰撞下,得到了很多有效的信息,总结为三个方面的“管理”能力,F G $ q 3 , i目标管理、过程管理、向上管理。
相信每个人看完都能有所启发。
1.目标管理
所谓目标管理,分为两个阶段,提出目标 和5 q n 5 管理目标。
1.1 提出目标
目标管理的前提,是必须先能够提出一个足够有价值的目标,然后再进行达成D M P 9 1。
如果目标本身是没有价值,或者说价值很小的,那即使你花费了很大力气去做,然后达成了,也没有什么意义。
跟莫斯科一样,程序员也是不相信眼泪的。苦劳再多,也比不上功劳。
那如何能提出一个足够有价值的目标呢?
1)来源于自上而下的任务拆解。
经常看到有人在各种社区吐槽华为的“拉通对齐”。但实际上,抛开某些管理者具体执行层面的问题,“拉通对齐”本身是非常有价值的。
公司的管理者在更高的位置,利用更多的信息进行决策,然后获得明年公司的发展目标和方向。然后就是将目标拆解到各个部门,各个部门需要相j z s + ( L @互合作达成目标。作为个人,也会承接到部门内的子任务,这个时候,可以提出自己的一些想法进行讨论,在X Y D ; h充分沟通的基础上,应该达成一致,然后坚决执行。
那么这时候你的目标,就是跟部门目标是一致的,跟公司的大目标也是一致的。
如果你能很好得达成目标,或者说超出预期,那么你对部门和公司的价值就) A 是越大的。
2)来源于自下而上的问题发现与解决
经常可以看到各种社区有人提问,每天C7 v ` y fRUD怎么才能提* I M S j N U ^ I高?
其实这个问题的一个解决思路是,在工作中发现问题,并给出解决方案。
我举一个我们公司的真实案例。
一个后端开发同学,发现自己组内的业务需求经常会有很多离线任务要做。有的人直接使用spring的_ 6 R b * a 8 oAsync注解,有的人自己新建申请一个线程池塞任务,有的人利用redis的blpull/blpus- ) kh来做队列来进行生产消费。
没有统一的方案,有很多 q d W , r b重复劳动,而且容易因为种种原因造成故障(比如没有4 X q Z ;资源隔离@ } i , { l c)。
因此,他提出了一L 0 =个目标,做一个分布式的统一任务& , +调度框架,解决组内的? k 5 . j _这些问题。
目标达成后,还在全公司进行了推广。
后面的结果大家应该能猜到了,升职加薪走上人生巅峰。
有人说,你这个肯定是小厂啊,大厂各种工具都很V 7 ) U # f } e r成熟了,没啥要做的。这话说对了一半,大厂的成熟工具和框架确实很多,但也是其他人发现并且实现的,而且我S H m . ( V T相信没有任何一个公司或者部门,在任何事情上都已经做到完$ O * Q U 3 f美,总会存在问题和不足的地方等待解决的。
1.2 管理目f E L w 7 `标
已经有了一个很有价值的目标了,我们该怎么达成呢?
这时候,我们就需要对目标进行管理。
我个人认为最好的方式是“倒排时间”的mi6 I ) e m Wlestone(里程碑)模式。根据目标deadline来往前倒排时间,拆分不同阶段的里程碑节点,然后按期检查当前进度,最终达成目标。
其实也不是什么新鲜玩意V H $ !,很多公司都有在N y r 8 q做,但是落实到具体部门、小组、个人上,就不太一样S & 8了。
尤其我想说的是个人和小组上。
在我担任 / @ T q d目标了。
以前在做业务开发的时候,产品、前端、后端、测试等角色关联非常密切,因此在敏捷开发过程中,会需要通过每天的站会来沟通进度,及时暴露风险。
现在在做基础架构相关的工作时候,可能项目的周期会更长,比业务开发的敏捷q } u 3 n H q迭代周期要长很多,因此,往往会通过周为单位的进度分享。
只有O ? / ( ? t按时完成每个里程碑节点,我们才有信心按期完成整个目标的交付。
具体的实施,每个公司可m % ] 2 Q能都有自己的目标管理系统,我这里做个简单的表格,更直观地反应如何对目标、里程碑进行管理。
2.过程管理
如果说目标管理是1 y 7 W W { ~ { w我们完成m ) a x y C V E任务的基本要求的话,过程管理可能是我们获得“超出预期”评价的重要部分。
我觉得最好的方式是,在任务DOD(DefinitY Z $ 1ion of Done)的基础上,你有自己独有的一套“过程性DOD~ W z 8 ? = n J”。
一般我们任务的DOD是按照一定时间要求,完成什么功能,上线什么需求。有的可能会带上一些| & N 性能指标,比如接口响应时间低于多少,线下故障数量低于多少等等。
那么如果只是完成了这些要求,那么今天你来做这个事情,和另一个人来做这个事情有什么区别呢?
甚至于如果某个项目,最终由于种种原因/ 9 a没有上线,或者中途被终止了,那么是不是你所做的事情都白费了呢?
所以,你必须有一套自己的“过程性DOD”。
下面,我介绍一些我的经验和我见过的大佬们的经验,大家可以按需取用(业务开发和基础架构开发还是有很大不同的,尤其在迭代压力和做事方法上,所以不能一概而论m U a X ~ R 9制的方法论产出,那么这一次投入和探索的过程可以给未来的无数次探索提供指导建议,甚至于能够快速复制,那就& U l D Y是极高的投入产出比。
对有些更优秀的人来说,可能产出方法论之后,还能从中找出共性和特性,沉淀为平台化的产品,那就是更U I I ) {加的: B C H k I } Q Pniubility了。
举一个例子。之前公司做个一个分库分表的项目,项目上线后,项目成员写了完O l a F 5 c o i整的方法论指导,在公司进行推广分享。还将项目过程中使用的数据校验工具,平台化为技术产品,方便其他业务线能够快速使用类似的功能。这种就是非常好的范例。
方法论的产出,无论I D 6 = 5 对于公司还是对于个人成长,都是绝佳的方式。
过程管理} X - a w 8 u 7的产物,能很好地体现在结果上。同样一年完成了V E * r N j几十个需求,年底review的时候,你只完成了需求,而别人沉淀了几十篇设计文档、最佳实践、方法论,并建立了一定的技术影响力,你可能就是B,别人就是A,这样的差距就是由于过程r & 0 F p n I x %管理造成的。
而且更重要的是能沉淀你自己的学习与思考,这是个人成长非常重要的部分。即使最终由于各种各样的原因,在结果; 5 ~ 6 9 * 0导向上没有一个好+ * ( $ N的成绩,这些过程管理的结果都是你最重要的财富。
一个五年程序员是拥有五年经验,还是一个经验用五年?过程管理往往能告诉你怎么做。
3.向上管理
这部分的内容不多,但是可能比上面的所有内容更加重要,也是大部分程序员容易缺失的思维方式。
所谓“向上管理”,不是说拍老板马屁。而是一种F o 5 % B有效沟通方式,一种科学u v B @ $ P n u 5的上下级合作方式。
有了良好的“目标管理”和“过程管理”后,有的人可能会陷入闭门造车的陷阱,按照计划或迭代不断埋头做事,这是万万不7 g d P C可取的。很多同学容易陷入一种误区,我专心地完成手上的工作,就可以了。但其实这往往是最危险的。因为即使你全部做完了,也可能只是达到要求,没有任何亮点,甚至于由于外部的变化你没有及时获取,还做错了方向。
我们还是需要及时主动跟老板沟F w D z通,沟通自己目前的进度、困难、计划。让老板能及时知道你现在的进展情况。
很多时候,当老板来找你的时候,往往不是什么好事。要么就是你做了什么错事,要么b ) [ G 1 2 S 8 ,就是他想知道你在做g o b什么,做到什么程度了。无论哪种情况,都v # . ; ~ e C不好。
阿里的朋友跟我分享了一些比较好的形式。
- 定期整理任务进度,a B 2 F l将任务进度、遇到的困难、解决方案等简明扼要地整理出来,进行汇报
- 找老板沟通技术规划,然后一起讨~ ! B论哪些能做,哪些需要砍掉,然后把能做的东西一起安排一个计划进行* d +实现
- 多多关注组内同学、老板的周报,如果发现有什么困难,及时提出帮助,共同解决
做事的方法真的很重要,尤其是我们程序员,可能过多地与电脑打交道,而容易缺乏技术外的非技术思维。而好的非技术思维,能帮助我们更好地自我成长,更好地脱颖而出。
与大家共勉~