[读书笔记]《卓有成效的管理者》(1/3)

  • 管理者的贡献意识应该关注三个方面:
    1. 直接成果:利润、行业排名等
    2. 信念感/企业文化/存在价值/荣誉感/自豪感
    3. 培养接班人
  • 管理(企业/组织)的优势
    • 实现个人做不到的事
    • 超越个人生命而持续发展
  • 传统管理者的时间属于别人
    • 遇到问题解决问题
    • 救火的消防员
  • 管理者的价值在于依靠自身的知识才干和贡献意识促进组织产生成果
  • 知识不等于成果。只有通过有效的管理工作,知识才能转化为成果
  • 区别于体力/技能工作者,对知识工作者无法进行严密、细致的督导,只能对其进行协助。知识工作者本人必须自己管理自己,自觉地完成任务,自觉地作出贡献,自觉地追求工作效益。
  • 管理者必须面对的四个现实问题,也是管理者缺乏有效性的现实因素
    1. 管理者的大部分时间都属于别人,而不是属于自己
    2. 被迫忙于“日常工作”
    3. 最重要的人,不是直系下属,而是兄弟部门甚至自己的上司,要使这些人能利用自己所做出的贡献,表明自己是“有用”的人
    4. 不要局限于组织内部的事务,要放眼外部。因为成果存在于组织之外。
  • 组织是能使个人才干得以增值的一种工具。
  • 组织存在的唯一理由就是为外部环境提供良好的产品或服务。
  • 卓有成效的五个要素
    1. 知道时间用在了什么地方。善用有限的时间
    2. 重视对外界的贡献。并非为了工作而工作,而是为了成果而工作
    3. 善于利用长处:包括自己的长处、上司的长处、同事的长处已经下属的长处。不把工作建立在自己的短处上
    4. 集中精力于少数重要领域
    5. 善于做有效决策

以上内容都来自于推荐序


  • 导致时间浪费的四个因素
    1. 缺乏制度或远见
      • 同样的问题,如果出现了第二次,就绝不应该出现第三次
      • 把它设计成例行作业:一套有系统有步骤的处理方式
    2. 人员过多
    3. 会议太多
    4. 信息不流畅

《卓有成效的管理者(珍藏版)》,彼得·德鲁克(著),许是祥(译)

[读书笔记]《人件》

  • Get what you want, or just get old.
  • 管理
    • 你可以让人活跃(摸鱼),但无法让他们有创造力,有创新,有思想
    • 脑力劳动与体力劳动的区别
    • 目标:工作得更少(活更少,干活时间更少),但更有效率或意义
  • 质量
    • 从不同角色看质量
      • 用户(大部分):能用就行
      • Builder:要完美
      • 市场部/销售部/老板:有人愿意掏钱就行
    • 际产品应该满足的质量要求(从低到高)
      • 满足用户:最低的。要比用户要求的做得更多
      • 满足市场:要吃饭的嘛
      • 满足Builder:完美很难达到,但可以不断追求
  • 对效率影响甚微甚至没有影响的因素
    • 编程语言(汇编除外)
    • 工作时间(六个月以上,差别不再明显)
    • 缺陷数(缺陷多不代表效率差)
    • 薪资(薪资高不等于效率高)
  • 重复
    • 即使是错的(不能太离谱),重复多了,人们也会信以为真
    • 广告
    • 三人成虎
  • 电话那头的人 VS 你面前的人
    • 电话的优先级比面前的人还高?
    • 作者吐槽一段亲身经历:窗口前排着队,店员还接电话。有电话来了就接起电话,中断面对面的交流
    • “对不起,我接一下电话”,这句话你一定听过或对别人说过
  • 领导力
    • 是一种“工作提取”的能力
    • 是一种服务意识。是催化剂粘合剂,而不是引导者
    • 领导与创新。创新不能保证一定成功。所以创新需要靠个人魅力引导,而不是通过行政命令空降一个领导
  • 招聘
    • 能力倾向测试,可以有。但只是一个参考,不能一刀切
    • 组员也要参与面试,不一定要面对面,可以打分(不见面怎么打?根据面试官的评语?)。这样,进组后就不是一个完全陌生的人,是你同意他进组的,对他已经有了一些了解
  • 挑战之所以重要,不是因为它本身有多重要,而是因为它在某种程度上激发了团队的凝聚力
    • 例如,共克时艰
  • 允许犯错才是自由
  • 一次成功能促进更多的成功,一次和谐可以带来更多的和谐 #团队管理
    • 团建
    • 团队之间做一些简单的容易成功的事。例如一次野餐/烧烤。光聚餐(餐厅吃饭)是不够的,没有协作
  • 建立里程碑很重要
    • 成功的意义和重要性
  • 没有永远有效的方法论
    • “新”才能带来效率的提高
    • 当新标准成为了行业标准,只有“更”新才能带来更高的效率
    • 不断创新,不断改变
  • 站立会议
    • 没有桌子,没有椅子,一个完全“空”的房间
    • Stand-Up Meeting Room
  • 头脑风暴
    • 类比/联想
    • 逆向思维
    • 沉浸式地投入想象
  • 让团队成员见过彼此糟糕的一面,能拉近彼此间的距离。如凌乱的头发、邋遢的胡茬……如何做到呢?搞一个需要通宵的活动/竞赛
  • 组织的进步主要靠中层
    • 高层,只顾着赚利润
    • 底层,没有影响力
  • 霍索恩效应:指工人(学生等)因受到研究人员的关注而增加产量(提高成绩等)
  • 交流的五大主题
    • 哲学/形而上学:存在的意义,世界的本质
    • 看法/认知/洞察
    • 行为准则,道德规范
    • 政治
    • 美学

Peopleware: Productive Projects and Teams (3rd Edition), Tom DeMarco, Timothy Lister

MIT 6.824 (2022) Lab 1: MapReduce解题思路与问题总结

写在前面:

  • 尊重课程的要求,未公开源码。
  • 本文主要是给有需要的小伙伴一些提示,避开一些弯路和坑。
  • 只是分享我的思路,我的解题方案。一家之言,难免有错漏,请多指教。

如果你问我做题花了多久,我只能回答很久很久:思考怎么开始动手花了很久;调试花了很久。
但我想,小伙伴们应该跟我一样,主要目的是学习,而不是为了交作业。所以,多长时间不重要,有没有收获才重要。

第一只拦路虎

按照课程说明(见文末链接:说明与提示,下文简称“说明与提示”),执行第一个go命令go build -race -buildmode=plugin ../mrapps/wc.go就失败了:-buildmode=plugin not supported on windows/amd64
有点挫败,也有点失望,对Windows失望。

刚好近期学习了Docker,试验下来发现Docker+MIT6.824课程简直绝配:

  • 编译环境随便选,即使你在Windows上开发,也可以让你的代码在Ubuntu环境下编译和运行
  • 源码下载下来,相同包下的相同函数会编译报错(GoLand),相同的目录下(mrapps)有多个main函数也会报错。这样就无法在GoLand中调试代码

Continue Reading »

[摘录]如何衡量自己是否进步了?

当你有了以下这样的感觉时,你其实就是成长了:

  • 你感到了你生活的意义和目的
  • 你知道了自己是什么人,理解了自己是独一无二的,知道成为你自己是一件愉快的事,不与任何其他人相比、相争
  • 用慷慨和宽宏大量的精神对待自己和他人——这样你就更容易谅解别人和忘记不愉快的事
  • 你认识到当你越减少以自我为中心,你越可以更多地与其他人交流,并且更多地参与周围的生活。你自己会感到自己是一个优秀的人
  • 当你对生活和对人有了更深刻的理解时,你会感到自己变得更聪明了。这种感觉的相当部分是在于你对人,对生活,对事的来龙去脉、互相关系、互相影响有了一个更全面的印象和理解
  • 你变得更全面了,这意味着你将很轻松地让自己性格中男性和女性的两面因素更好地结合以达到一个健康的平衡。例如,如果你是一位男性,你会感到更乐意去尝试读诗、写诗或学做饭;如果你是一位女性,你感到学做家具或钓鱼也并不是男人的专利
  • 你更乐意去试一试某些挑战,哪怕有可能失败或陷入窘境,你也不愿意让你的梦永远只是一个梦
  • 当你感到精神上及内心的不和谐、矛盾,你不是在那里反复细细咀嚼那些错误东西,而是看自己能做什么
  • 你还有更多能力和感觉去管理自己的生活,知道怎么可以使事情向好的方向发展
  • 就像是你体力上更灵活、健康一样,当你心理、精神上发展了,你会感到更活跃、精力充沛、对生活充满兴趣——同时你会得到精神、感情上的安宁
  • 你更倾向于接受别人。因为你认识到我们都是人类的一份子,没有人是完美的,而且我们之中大部分人都是做了自己最大和最好的努力的——当然结果会因人而异
  • 你内心充满欢乐,你会体验到更多的宝贵时光

注:以上内容摘自《人生的关键是态度》,作者:(美)道蒂·比林顿

读《怎样解题》(一):分析与综合

问题

一个原始人(没有船也没有桥)想要渡过一条河。但他今天不能像往常一样渡河了,因为河水在昨晚上涨了。

渡河就成了一个问题。怎样渡河就是这道题的未知量x

分析

这时,他回忆起曾经踏着一棵倒下的树渡过了另外一条河。于是他四处寻找倒下的树。这时,有没有倒下的树就成了这道题新的未知量y

他没有找到合适的树。但是岸边长着大量的树。他希望其中有棵树能倒下来。他能不能让一棵树倒下来并横架在河的两岸呢?这又成了渡河这道题的新的未知量z

综合

用石斧砍树,并把它推到横架在河面上,即求得了未知量z。

有了横跨两岸的树,y也得解了。

踩着树过河,x解决了,渡河问题也就解决了。

总结

  • 分析在前,综合在后
  • 分析存在于思维之中,综合存在于行动之中
  • 它们的步骤/次序刚好是相反的。怎样渡河(未知量x),是分析时遇到的第一个未知量,却是综合时完成的最后一个动作
  • 分析是创造,综合是执行
  • 分析是设计一个方案,综合是执行这个方案

MIT 6.824 (2022) Lab 1: MapReduce

写在前面:这篇实验课的说明(原版)和代码前前后后看了很多遍,还是一团糨糊,不知从何入手。看到后面,又忘记了前面。于是想把它翻译一遍,希望能把题理解得更透彻点。果然,翻译过程中发现几个之前忽略的点。

原文地址:https://pdos.csail.mit.edu/6.824/labs/lab-mr.html

简介

在这节实验课里你将构建一个MapReduce系统。你需要实现一个工作程序(worker process)和一个调度程序(coordinator process)。工作程序用来调用Map和Reduce函数,并处理文件的读取和写入。调度程序用来协调工作任务并处理失败的任务。你将构建出跟 这篇MapReduce论文 里描述的类似的东西。(注意:本实验中用”coordinator”替代里论文中的”master”。)

开始

首先需要搭配好Go的开发环境,无需赘述。 接着可以通过git来获取本实验所需的初始代码:

git clone git://g.csail.mit.edu/6.824-golabs-2022 6.824

我们在src/main/mrsequential.go提供了一个简单的MapReduce实现。它在同一个进程里执行里Map函数和Reduce函数。我们也提供了一些MapReduce的应用程序:单词计数器(mrapps/wc.go)和文本检索器(mrapps/indexer.go)。你可以通过以下命令来执行单词计数器程序:

cd 6.824
cd src/main
go build -race -buildmode=plugin ../mrapps/wc.go
go run -race mrsequential.go wc.so pg*.txt
more mr-out-0

注意:-race选项打开了Go语言的竞争探测器。我们建议你在开发和调试6.824实验代码时都加上这个选项。我们在评分时不会使用这个选项。尽管如此,如果你的代码里存在竟态,我们测试时不用竟态探测器它也会失败。

mrsequential.go将其输出保存在mr-out-0文件中。输入来自pg开头的txt文件。

可以随意从mrsequential.go中借用代码。你也应该打开mrapps/wc.go看看MapReduce的应用程序是如何实现的。

Continue Reading »

原来这就是表驱动开发

现在需要你提供这样一个函数:获得指定月份的天数(为了方便讨论,忽略闰年)。你会怎么做?
大概率是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
func DaysOfMonthGeneral(month int) int {
	switch month {
	case 1:
		return 31
	case 2:
		return 28
	case 3:
		return 31
	case 4:
		return 30
	case 5:
		return 31
	case 6:
		return 30
	case 7:
		return 31
	case 8:
		return 31
	case 9:
		return 30
	case 10:
		return 31
	case 11:
		return 30
	case 12:
		return 31
	default:
		panic("invalid month")
	}
}

表驱动开发则是这样的:

1
2
3
4
5
var daysPerMonth = []int{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

func DaysOfMonth(month int) int {
	return daysPerMonth[month-1]
}

这个例子太简单?那再看个例子。

根据分数得到等级。

分数 等级
>=90 A
<90 B
<75 C
<65 D
<50 F

你很可能会这么做:

1
2
3
4
5
6
7
8
9
10
11
12
13
func GetGradeGeneral(score float32) string {
	if score >= 90.0 {
		return "A"
	} else if score >= 75.0 {
		return "B"
	} else if score >= 65.0 {
		return "C"
	} else if score >= 50.0 {
		return "D"
	} else {
		return "F"
	}
}

有没有更灵活的方式呢?

有的,还是表驱动法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var (
	rangeUpper = []float32{50.0, 65.0, 75.0, 90.0, 100.0}
	grades     = []string{"F", "D", "C", "B", "A"}
)

// GetGrade 表驱动法
func GetGrade(score float32) string {
	maxGradeLevel := len(grades) - 1

	gradeLevel := 0
	studentGrade := "A"
	// 数据量大时可考虑二分查找
	for studentGrade == "A" && gradeLevel < maxGradeLevel {
		if score < rangeUpper[gradeLevel] {
			studentGrade = grades[gradeLevel]
		}
		gradeLevel++
	}
	return studentGrade
}

总结

表驱动,就是把复杂的条件分支或运算逻辑转移到对“表”的访问上。

这里说的“表”和数据库中的表没有关系,更像是一张表格或者容器。通常可以用数组或者Map实现。

[译文]设计模式13 – 私有数据对象模式(附代码实例)

原文网址:Private Class Data Design Pattern

意图

  • 控制类属性的写访问
  • 将数据和使用它的方法分开
  • 封装类对象的初始化过程
  • 提供新型的 final —— 在构造之后不可变

问题

一个类可能将它的属性(实例变量)暴露给它的方法,即使是这个方法不再需要,例如构造函数。使用私有数据对象模式可以避免这种不良操作。

一个类可能有一次性的不可变的属性,但它又不能定义为 final 类型。这种情况可以使用该设计模式完成一次性设定。

该模式的设计灵感来自于通过缩小属性(数据)的可见性来保护类状态的设计目标。

讨论

私有数据对象模式旨在通过限制属性的可见性来减少其暴露。

它将属性封装进单独的数据对象从而减少了类属性的数量。它允许类的设计者移除那些只允许在构造器中设置的属性的特殊的写操作,甚至是在类的内部也不可更改(final)。

结构

私有数据对象模式通过在目标类中提取一个数据类解决了上述问题,并且在目标类的实例中包含了一个数据类的引用。

核查清单(也可以理解为应用步骤)

  1. 创建数据类。将所有需要隐藏的属性都移入数据类中
  2. 在主类中创建一个数据类的引用
  3. 主类必须通过数据类的构造函数来初始化数据类
  4. 通过 getter 方法将数据类中的属性对外暴露
  5. 通过 setter 方法暴露以后可能需要修改的属性

[译文]设计模式12 – 蝇量模式(附代码实例)

原文网址:Flyweight Design Pattern

意图

  • 通过共享来高效地使用大量的细粒度的对象
  • 用轻量级组件代替重量级组件

问题

对象设计粒度越细越能提供更好的灵活性,但就性能和内存的使用而言,代价可能高得令人无法接受。

讨论

蝇量设计模式描述了如何在合适的粒度上共享对象并且避免过高的开销。每一个”蝇量”对象被分成两个部分:状态依赖的(外在的)部分和非状态依赖的(内在的)部分。内在的状态(共享的)被存储在蝇量对象里。外在的状态被客户端对象存储或计算,在调用蝇量对象时传递给它。

Motif组件就是一个例证,它已被重新设计为轻量级的组件。各组件已经足够的“智能”而独立,各组件与它们所在的布局管理组件有一种依赖关系。每一个布局管理器提供了上下文相关的事件处理机制、资源管理和服务给蝇量组件,而每一个蝇量组件只有跟上下文无关的状态和行为。

结构

蝇量对象存储在工厂的仓库中。客户端克制自己不直接创建蝇量,而是从工厂获取。蝇量对象不能孤立地存在。任何可能导致不能共享的属性必须由客户端在调用蝇量对象时提供。如果上下文有助于“规模经济”(即客户可以很容易地计算或查找所需的属性),则蝇量模式将提供合适的杠杆。

Ant (蚂蚁)类,Locust (蝗虫)类和 Cockroach (蟑螂)类可以被轻量化是因为他们实例相关的状态被反封装或者外在化了,而且必须由客户端提供。

举例

现代浏览器使用这种技术来防止同样的图片被重复加载。当浏览器加载一个页面时,它遍历了页面上所有的图片。浏览器从网络上获取新的图片然后将他们放在缓存中。对已经加载过的图片,蝇量对象被创建了,它会有一些唯一的属性(如在页面中的位置),但其他的都指向了缓存数据。

核查清单(也可以理解为应用步骤)

  1. 确认当前的对象就是需要关注的问题,同时客户端能够并且愿意接受责任的转移。
  2. 将目标对象的状态分为可共享的(内在的)和不可共享的(外在的)。
  3. 将不可共享的状态从类属性中移除,把它作为调用方法的参数。
  4. 创建一个工厂用来缓存和重用已经存在的实例。
  5. 客户端必须使用这个工厂类而不是 new 获取对象。
  6. 客户端(或者第三方)必须找到或计算出不可共享的状态,然后在调用方法时提供这些状态。

经验法则

  • 解释器抽象语法树中的终端符号可以通过蝇量实现共享

(译者注:详细的代码实例请移步 GitHub

一点子智慧001

  1. 只有试过之后才能获得更完美的方案。好的方案来自于实践,而不是空想。(自悟)
  2. 改变沟通方式是自我转变的重要开端。(via《非暴力沟通》)
  3. 除非从我做起,否则我们的梦想就不可能实现。不幸的是,我们总是希望别人先开始改变。(via《非暴力沟通》)

    注:梦想只能自己构建,别人最多是添砖加瓦

  4. 哲学在于实践和反思,对内主抓品质,着眼于品格的提升;对外探寻思考,有所作为地努力奉行。(via 得到网友,《何为良好生活》)
  5. 我们不再条件反射式地反应,而是去明了自己的观察、感受和愿望,有意识地使用语言。(via《非暴力沟通》)
  6. 想,都是问题;做,才有答案。(via 即友)

    注:和第一条异曲同工,但更简练

  7. 对他人的评价实际上反映了我们的需要和价值观。(via《非暴力沟通》)
  8. 失误揭示我们的局限性,并引导我们成长。(via《非暴力沟通》)
  9. 自省时主语用“我”;沟通时主语是“你”。(via《非暴力沟通》)
  10. 一件值得做的事情即使做得不怎么样也是值得的!(via《非暴力沟通》)

2021.11.21-2021.12.14