微软研发致胜策略 06:学无止境
这是一本老书,作者 Steve Maguire 在微软工作期间写了这本书,英文版于 1994 年发布。我们看到的标题是中译版名字,英文版的名字是《Debugging the Development Process》,这本书详细阐述了软件开发过程中的常见问题及其解决方案,强调团队合作、项目管理和开发流程的优化。该书成为软件开发和项目管理领域的经典著作,受到了广泛的认可和赞誉。
不记录,等于没读。
领导者必须让让团队成员只专注于改善产品的工作上。然而,如果领导者希望他们的项目真正取得成功,他们必须关注培训,以确保每个团队成员定期学习各种广泛有用的新技能。确保团队成员积极成长的一种方法是将个人成长目标与项目里程碑对齐,这可以使每个团队成员每年获得至少六项重要的新技能。程序员在日常工作中确实会获得技能,但这种被动学习的方式使他们的成长速度要慢得多。通过工作分配和明确的教育目标来确保程序员积极学习新技能,领导者不仅帮助项目和公司,也推动了程序员的职业发展。
25 年前的花样滑冰冠军表演,放在现在连小镇上的比赛冠军都拿不到。以现在的眼光看,当年的表演太过于简单了。现在的花样滑冰选手并不比 25 年前的选手条件更好,而是滑冰选手每年都在提高自己的标准,他们都想胜过上一届的全国或世界冠军。
Tom DeMarco 和 Timothy Lister,《人件》一书的作者,他们经常举办“程序设计大战”,用于研究不同公司程序设计师技术水平的差异。他们有两个发现:
- 程序设计师之间的表现可谓天壤之别,所需时间甚至有 1:11 的差距;
- 来自同一家公司的程序设计师技术水平会差不多。如果一位很差,另一位也好不到那里去,如果一位很棒,另一位也会表现不错,即使这两位程序设计师分属不同的部门也是一样。
这种差异的原因,作者认为是“公司培养程序设计师的环境不同”造成的。作为团队负责人,要对团队成员的技术水平有更高的追求,不能只是达到公司平均水平后就停滞不前。
如果程序设计师只是完成预期的程序设计工作,那还不够好。管理者应该不断提高对下属的要求标准,就像花样滑冰选手的教练一样。当你提高了团队的编程标准时,最终将提高整个公司的平均水平。
五年资历的笨蛋
做的久不是问题,问题是一直做同样的工作。
如果一直在一个岗位,工作个几年就能成为这个领域的专家。但一直在一个岗位会剥夺他们扩展新视界、学习新技术的机会。如果一位工程师在第一年成为文件转换的专家,于是在以后的四年里专门为各种产品的文件格式写转换的程序,这件工作绝对是重要的,但是他的技术只有在第一年里大幅提升,其余四年都在重复工作,没有学新的技术。他有五年的工作资历,但不是五年的工作经验,他只是用五年的时间重复第一年的经验罢了。
从长远来看,培养团队成员的各方面专长,即使导致当前工作进度慢些,几年后你就拥有一个强大的团队。团队中的任何一人,都有能力处理任何一种问题。
受用无穷的技术
在微软,对于刚加入项目的新人,通常会派给他基础性的工作,例如追踪 BUG、修改程序等等。慢慢的新人比较熟悉这个软件后,就可以增加工作难度。这是一种循序渐进的培养方式。当分配工作时,要设法让每个人都能在所分配的工作中学习到新的技术。
训练新员工时,先培养对整个公司所有项目都有价值的技术,然后才培养本项目独有的技术。
让专家再重新学习
总有一天,当初的新人会把本项目所有的程序全部摸熟,他们就暂时没有成长空间了。这个时候,你应该把没有新东西可学的程序设计师推到别人项目去。把所有的程序设计师放在他们可以成长、可以进步的地方,这是管理者对程序设计师和公司的义务之一。
作者刚当上函数库组长的第一周,首席程序设计师想去另一个小组,因为他本人对于一直做同一套软件感到厌倦,他需要扩展到新的技术领域。作者经过确定后,认为这是个让组员学习的好机会,于是慷慨放人。事情的发展出乎意料的好:
- 组内其他成员自告奋勇承担起首席程序设计师的工作,这给了新人学习成长的机会
- 首席程序员进入了新的技术领域,他所在的新的项目因为他的加入也出乎意料地顺利
总的来说,市区最棒的程序设计师虽然短期内难免要挣扎适应,但长期来看少了一位停滞不前的程序设计师,多了两位积极学习的程序设计师,和一个进行十分顺利的项目。员工成长,公司资产增加。
最近读过什么好书吗
我个人经常读书,充实自己的知识,不断了解新的观念。选一本好书,用几天的时间就可以吸取别人多年来从错误中获得的体会,这是很划算的。
- 读策略性的书籍,比如《编程精粹—— Microsoft 编写优质无错 C 程序秘诀》、《C陷阱与缺陷》
- 软件开发方面的书
- 技术领域之外的书,比如《在哈佛学不到的管理知识》
作者鼓励组员自由选择想追求的技术,但要求大家的个人目标必须符合:
- 这项技术必须是对程序设计师本人、项目、公司三方面都有用的。
- 目标必须是可以在大约两个月的时间内完成的。
- 目标必须有一个可供评量的指标。
- 最理想的情况,我希望目标是对项目立即派得上用场的。
确定每位组员每两个月都有一项技术上的进步。
即使反馈
一发现某处需要改进,就立即采取更正的行动。
主管对属下的表现有任何意见都应该立即表示出来,迟来的纠正通常毫无效果。比如主管在年终考评时给某一位程序员很差的成绩,但是在一整年中从来没有提过对他什么地方不满意。程序员并不清楚自己哪里有问题,如果一开始就和他沟通,效果可能会更好。
要点
绝不让团队成员一直做相同的工作,这样会限制他的进步,使他停滞在原来的领域。一旦程序设计师精通了某一个领域,就让他换别的领域做做看,永远让他们学习新的技术。
各种技术的用途范围有所不同,有的技术在一般的项目都用得上,有的技术只有在特定性质的项目才用得上。当你训练团队成员时,必须让他们的技术能在公司发挥最大的用处。最好的办法就是,把应用范围最广的技术放在训练的最前期,应用范围最小的技术放在最后训练。
为了确保每位程序设计师的技术都在稳定地进步,一定要让每个人有个努力的目标,最好的方法是把个人的成长和项目阶段性目标相结合,项目阶段性目标一般是两个月,这样一年就至少六次进步了。假定一位组员在公司工作了五年,那么他会学会30种新技术、或是30本好书……
最好的成长目标来自于即时反馈。如果发现团队成员工作效率低下或重复出现相同错误,请抓住机会制定一个特定的改进目标,使团队成员可以立即采取行动。因为这种即时反馈可以他们立即采取明确的行动。
每一份打赏,都是对创作者劳动的肯定与回报。!

相关文章:
微软研发致胜策略 06:学无止境
这是一本老书,作者 Steve Maguire 在微软工作期间写了这本书,英文版于 1994 年发布。我们看到的标题是中译版名字,英文版的名字是《Debugging the Development Process》,这本书详细阐述了软件开发过程中的常见问题及其解决方案&a…...
学习大数据DAY21 Linux基本指令2
目录 思维导图 搜索查看查找类 find 从指定目录查找文件 head 与 tail 查看行 cat 查看内容 more 查看大内容 grep 过滤查找 history 查看已经执行过的历史命令 wc 统计文件 du 查看空间 管道符号 | 配合命令使用 上机练习 4 解压安装类 zip unzip 压缩解压 tar …...
【18】Android 线程间通信(三) - Handler
概述 接下来我们会从native层来分析一下,Handler做了什么,以及之前提到过的应用层的两个native的调用链。 nativeWake 最早接触这个方法还记得是什么时候吗?MessageQueue#enqueueMessage中,在这个方法的末尾,我们看…...
静态路由技术
一、路由的概念 路由是指指导IP报文发送的路径信息。 二、路由表的结构 1、Destination/Mask:IP报文的接收方的IP地址及其子网掩码; 2、proto:协议(Static:静态路由协议,Direct:表示直连路由) 3、pref:优先级(数值和优先级成反比) 4、cost:路由开销(从源到目的…...
SpringBoot缓存注解使用
背景 除了 RedisTemplate 外, 自Spring3.1开始,Spring自带了对缓存的支持。我们可以直接使用Spring缓存技术将某些数据放入本机的缓存中;Spring缓存技术也可以搭配其他缓存中间件(如Redis等)进行使用,将某些数据写入到缓存中间件…...
@RequestBody接收到的参数中如何限制List的长度?
在Spring MVC中,你可以使用Valid注解和自定义的验证注解来限制List的长度,防止DOS攻击。具体步骤如下: 创建自定义注解:首先,创建一个自定义注解来验证List的长度。 import javax.validation.Constraint; import jav…...
Linux C语言 54-目录操作
Linux C语言 54-目录操作 本节关键字:Linux、C语言、目录操作、遍历目录 相关C库函数:opendir、readdir、closedir 遍历目录 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <dirent.h> #include <…...
Java实战中如何使用多线程(线程池)及其为什么使用?
这个话题在入行之前就想过很多次,很多8古文或者你搜索的结果都是告诉你什么提高高并发或者是一些很高大上的话,既没有案例也没有什么公式去证明,但是面试中总是被问到,也没有实战经历,所以面试时一问到多线程的东西就无…...
kafka集群搭建-使用zookeeper
1.环境准备: 使用如下3台主机搭建zookeeper集群,由于默认的9092客户端连接端口不在本次使用的云服务器开放端口范围内,故端口改为了8093。 172.2.1.69:8093 172.2.1.70:8093 172.2.1.71:8093 2.下载地址 去官网下载,或者使用如…...
【python】Numpy运行报错分析:IndexError与形状不匹配问题
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
你有多自律就有多自由
当你失去对时间的控制权,生活也就失去了平衡。 真正对自己有要求的人,都是高度自律的人。 追求自己想要的生活,任何时候开始都不会晚,关键在于你能够坚持下去,以高度自律的精神,日复一日、年复一年的坚持下…...
Codeforces Round 959 (Div. 1 + Div. 2 ABCDEFG 题) 文字讲解+视频讲解
Problem A. Diverse Game Statement 给定 n m n\times m nm 的矩形 a a a, a a a 中的每一个数均在 1 ∼ n m 1\sim nm 1∼nm 之间且互不相同。求出 n m n\times m nm 的矩形 b b b, b b b 中的每一个数均在 1 ∼ n m 1\sim nm 1∼nm 之间且互…...
WSL2 Centos7 Docker服务启动失败怎么办?
wsl 安装的CentOS7镜像,安装了Docker之后,发现用systemctl start docker 无法将docker启动起来。 解决办法 1、编辑文件 vim /usr/lib/systemd/system/docker.service将13行注释掉,然后在下面新增14行的内容。然后保存退出。 2、再次验证 可以发现,我们已经可以正常通过s…...
分布式锁-redisson锁重试和WatchDog机制
抢锁过程中,获得当前线程,通过tryAcquire进行抢锁,该抢锁逻辑和之前逻辑相同。 1、先判断当前这把锁是否存在,如果不存在,插入一把锁,返回null 2、判断当前这把锁是否是属于当前线程,如果是&a…...
ESP8266模块(2)
实例1 查看附近的WiFi 步骤1:进入AT指令模式 使用USB转串口适配器将ESP8266模块连接到电脑。打开串口终端软件,并设置正确的串口和波特率(通常为115200)。输入以下命令并按回车确认: AT如果模块响应OK,…...
Docker安装笔记
1. Mac安装Docker 1.1 Docker安装包下载 1.1.1 阿里云 对于10.10.3以下的用户 推荐使用 对于10.10.3以上的用户 推荐使用 1.1.2 官网下载 系统和芯片选择适合自己的安装包 1.2 镜像加速 【推荐】阿里镜像 登陆后,左侧菜单选中镜像加速器就可以看到你的专属地…...
《昇思25天学习打卡营第21天|Pix2Pix实现图像转换》
Pix2Pix 是一种图像转换模型,使用条件生成对抗网络(Conditional Generative Adversarial Networks,cGANs)实现图像到图像的转换。它主要由生成器(Generator)和判别器(Discriminator)…...
Python和MATLAB网络尺度结构和幂律度大型图生成式模型算法
🎯要点 🎯算法随机图模型数学概率 | 🎯图预期度序列数学定义 | 🎯生成具有任意指数的大型幂律网络,数学计算幂律指数和平均度 | 🎯随机图分析中巨型连接分量数学理论和推论 | 🎯生成式多层网络…...
在jsPsych中使用Vue
jspsych 介绍 jsPsych是一个非常好用的心理学实验插件,可以用来构建心理学实验。具体的就不多介绍了,大家可以去看官网:https://www.jspsych.org/latest/ 但是大家在使用时就会发现,这个插件只能使用js绘制界面,或者…...
机器学习·概率论基础
概率论 概率基础 这部分太简单,直接略过 条件概率 独立性 独立事件A和B的交集如下 非独立事件 非独立事件A和B的交集如下 贝叶斯定理 先验 事件 后验 在概率论和统计学中,先验概率和后验概率是贝叶斯统计的核心概念 简单来说后验概率就是结合了先验概…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
