MySQL explain执行计划解读

数据库zkbhj 发表了文章 • 0 个评论 • 1935 次浏览 • 2017-08-29 18:59 • 来自相关话题

本文主要介绍了MySQL性能分析以及explain的使用,包括:组合索引、慢查询分析、MYISAM和INNODB的锁定、MYSQL的事务配置项等。

1.使用explain语句去查看分析结果 
如explain select * from test1 where id=1;会出现:id selecttype table type possible_keys key key_len ref rows extra各列。










 
其中, 
type=const表示通过索引一次就找到了; 
key=primary的话,表示使用了主键; 
type=all,表示为全表扫描; 
key=null表示没用到索引。

type=ref,因为这时认为是多个匹配行,在联合查询中,一般为REF。


2.MYSQL中的组合索引 
假设表有id,key1,key2,key3,把三者形成一个组合索引,则如: 
复制代码 代码如下:where key1=....
where key1=1 and key2=2
where key1=3 and key2=3 and key3=2根据最左前缀原则,这些都是可以使用索引的,如from test where key1=1 order by key3,用explain分析的话,只用到了normal_key索引,但只对where子句起作用,而后面的order by需要排序。

 
3.使用慢查询分析(实用)
在my.ini中: 
long_query_time=1 
log-slow-queries=d:\mysql5\logs\mysqlslow.log 
把超过1秒的记录在慢查询日志中 
可以用mysqlsla来分析之。也可以在mysqlreport中,有如 
DMS分别分析了select ,update,insert,delete,replace等所占的百分比


4.MYISAM和INNODB的锁定 
myisam中,注意是表锁来的,比如在多个UPDATE操作后,再SELECT时,会发现SELECT操作被锁定了,必须等所有UPDATE操作完毕后,再能SELECT
innodb的话则不同了,用的是行锁,不存在上面问题。 


5.MYSQL的事务配置项 
innodb_flush_log_at_trx_commit=1 
表示事务提交时立即把事务日志flush写入磁盘,同时数据和索引也更新,很费性能。
innodb_flush_log_at_trx_commit=0 
事务提交时,不立即把事务日志写入磁盘,每隔1秒写一次,MySQL挂了可能会丢失事务的数据。
innodb_flush_log_at_trx_commit=2 ,在整个操作系统 挂了时才可能丢数据,一般不会丢失超过1-2秒的更新。
事务提交时,立即写入磁盘文件(这里只是写入到系统内核缓冲区,但不立即刷新到磁盘,而是每隔1秒刷新到磁盘,同时更新数据和索引),这种方案是不是性价比好一些,当然如何配置,决定于你对系统数据安全性的要求。

explain用法详解
EXPLAIN tbl_name或:EXPLAIN [EXTENDED] SELECT select_options 
前者可以得出一个表的字段结构等等,后者主要是给出相关的一些索引信息,而今天要讲述的重点是后者。 
举例mysql> explain select * from event;
+—-+————-+——-+——+—————+——+———+——+——+——-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————+——+———+——+——+——-+
| 1 | SIMPLE | event | ALL | NULL | NULL | NULL | NULL | 13 | |
+—-+————-+——-+——+—————+——+———+——+——+——-+
1 row in set (0.00 sec) 各个属性的含义





 
id :select查询的序列号
select_type:select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。a.SIMPLE:查询中不包含子查询或者UNION
b.查询中若包含任何复杂的子部分,最外层查询则被标记为:PRIMARY
c.在SELECT或WHERE列表中包含了子查询,该子查询被标记为:SUBQUERY
d.在FROM列表中包含的子查询被标记为:DERIVED(衍生)
e.若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在 FROM子句的子查询中,外层SELECT将被标记为:DERIVED
f.从UNION表获取结果的SELECT被标记为:UNION RESULT
table :输出的行所引用的表。
type :联合查询所使用的类型,表示MySQL在表中找到所需行的方式,又称“访问类型”。






type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是: 
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,一般来说,得保证查询至少达到range级别,最好能达到ref。


ALL: 扫描全表
index: 扫描全部索引树
range: 扫描部分索引,索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询
ref: 非唯一性索引扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
const, system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。system是const类型的特例,当查询的表只有一行的情况下, 使用system。
NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引。 
如下所示:






possible_keys:指出MySQL能使用哪个索引在该表中找到行。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。 
 
key :显示MySQL实际决定使用的键。如果没有索引被选择,键是NULL。
key_len:显示MySQL决定使用的键长度。表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。如果键是NULL,长度就是NULL。文档提示特别注意这个值可以得出一个多重主键里mysql实际使用了哪一部分。
 注:key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

ref:显示哪个字段或常数与key一起被使用。
rows:这个数表示mysql要遍历多少数据才能找到,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数,在innodb上可能是不准确的。
Extra:包含不适合在其他列中显示但十分重要的额外信息。
Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。 
using where是使用上了where限制,表示MySQL服务器在存储引擎受到记录后进行“后过滤”(Post-filter),如果查询未能使用索引,Using where的作用只是提醒我们MySQL将用where子句来过滤结果集。
impossible where 表示用不着where,一般就是没查出来啥。 
Using filesort(MySQL中无法利用索引完成的排序操作称为“文件排序”)当我们试图对一个没有索引的字段进行排序时,就是filesoft。它跟文件没有任何关系,实际上是内部的一个快速排序。 
Using temporary(表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询),使用filesort和temporary的话会很吃力,WHERE和ORDER BY的索引经常无法兼顾,如果按照WHERE来确定索引,那么在ORDER BY时,就必然会引起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。

最后,再看一个查询计划的例子:





 
第一行:id列为1,表示第一个select,select_type列的primary表示该查询为外层查询,table列被标记为<derived3>,表示查询结果来自一个衍生表,其中3代表该查询衍生自第三个select查询,即id为3的select。[select d1.name......]
第二行:id为3,表示该查询的执行次序为2(4→3),是整个查询中第三个select的一部分。因查询包含在from中,所以为derived。[select id,name from t1 where other_column='']
第三行:select列表中的子查询,select_type为subquery,为整个查询中的第二个select。[select id from t3]
第四行:select_type为union,说明第四个select是union里的第二个select,最先执行。[select name,id from t2]
第五行:代表从union的临时表中读取行的阶段,table列的<union1,4>表示用第一个和第四个select的结果进行union操作。[两个结果union操作]

 

关于MySQL执行计划的局限性:

EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
EXPLAIN不考虑各种Cache
EXPLAIN不能显示MySQL在执行查询时所作的优化工作
部分统计信息是估算的,并非精确值
EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看。


备注:

filesort是通过相应的排序算法,将取得的数据在内存中进行排序。
MySQL需要将数据在内存中进行排序,所使用的内存区域也就是我们通过sort_buffer_size 系统变量所设置的排序区。这个排序区是每个Thread 独享的,所以说可能在同一时刻在MySQL 中可能存在多个 sort buffer 内存区域。

在MySQL中filesort 的实现算法实际上是有两种:
双路排序:是首先根据相应的条件取出相应的排序字段和可以直接定位行数据的行指针信息,然后在sort buffer 中进行排序。单路排序:是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序。

在MySQL4.1版本之前只有第一种排序算法双路排序,第二种算法是从MySQL4.1开始的改进算法,主要目的是为了减少第一次算法中需要两次访问表数据的IO操作,将两次变成了一次,但相应也会耗用更多的sortbuffer 空间。当然,MySQL4.1开始的以后所有版本同时也支持第一种算法。
MySQL主要通过比较我们所设定的系统参数 max_length_for_sort_data的大小和Query 语句所取出的字段类型大小总和来判定需要使用哪一种排序算法。如果 max_length_for_sort_data更大,则使用第二种优化后的算法,反之使用第一种算法。所以如果希望 ORDER BY 操作的效率尽可能的高,一定要注意max_length_for_sort_data 参数的设置。如果filesort过程中,由于排序缓存的大小不够大,那么就可能会导致临时表的使用。
max_length_for_sort_data的默认值是1024。
 
原文地址:http://blog.csdn.net/xifeijian ... 73795 查看全部
本文主要介绍了MySQL性能分析以及explain的使用,包括:组合索引、慢查询分析、MYISAM和INNODB的锁定、MYSQL的事务配置项等。

1.使用explain语句去查看分析结果 
如explain select * from test1 where id=1;会出现:id selecttype table type possible_keys key key_len ref rows extra各列。

20140226211124937.png


20140226210509703.png

 
其中, 
type=const表示通过索引一次就找到了; 
key=primary的话,表示使用了主键; 
type=all,表示为全表扫描; 
key=null表示没用到索引。

type=ref,因为这时认为是多个匹配行,在联合查询中,一般为REF。


2.MYSQL中的组合索引 
假设表有id,key1,key2,key3,把三者形成一个组合索引,则如: 
复制代码 代码如下:
where key1=....   
where key1=1 and key2=2
where key1=3 and key2=3 and key3=2
根据最左前缀原则,这些都是可以使用索引的,如from test where key1=1 order by key3,用explain分析的话,只用到了normal_key索引,但只对where子句起作用,而后面的order by需要排序。

 
3.使用慢查询分析(实用)
在my.ini中: 
long_query_time=1 
log-slow-queries=d:\mysql5\logs\mysqlslow.log 
把超过1秒的记录在慢查询日志中 
可以用mysqlsla来分析之。也可以在mysqlreport中,有如 
DMS分别分析了select ,update,insert,delete,replace等所占的百分比


4.MYISAM和INNODB的锁定 
myisam中,注意是表锁来的,比如在多个UPDATE操作后,再SELECT时,会发现SELECT操作被锁定了,必须等所有UPDATE操作完毕后,再能SELECT
innodb的话则不同了,用的是行锁,不存在上面问题。 


5.MYSQL的事务配置项 
innodb_flush_log_at_trx_commit=1 
表示事务提交时立即把事务日志flush写入磁盘,同时数据和索引也更新,很费性能。
innodb_flush_log_at_trx_commit=0 
事务提交时,不立即把事务日志写入磁盘,每隔1秒写一次,MySQL挂了可能会丢失事务的数据。
innodb_flush_log_at_trx_commit=2 ,在整个操作系统 挂了时才可能丢数据,一般不会丢失超过1-2秒的更新。
事务提交时,立即写入磁盘文件(这里只是写入到系统内核缓冲区,但不立即刷新到磁盘,而是每隔1秒刷新到磁盘,同时更新数据和索引),这种方案是不是性价比好一些,当然如何配置,决定于你对系统数据安全性的要求。

explain用法详解
EXPLAIN tbl_name或:EXPLAIN [EXTENDED] SELECT select_options 
前者可以得出一个表的字段结构等等,后者主要是给出相关的一些索引信息,而今天要讲述的重点是后者。 
举例
mysql> explain select * from event;   
+—-+————-+——-+——+—————+——+———+——+——+——-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————+——+———+——+——+——-+
| 1 | SIMPLE | event | ALL | NULL | NULL | NULL | NULL | 13 | |
+—-+————-+——-+——+—————+——+———+——+——+——-+
1 row in set (0.00 sec)
各个属性的含义

图片1.png

 
id :select查询的序列号
select_type:select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。a.SIMPLE:查询中不包含子查询或者UNION
b.查询中若包含任何复杂的子部分,最外层查询则被标记为:PRIMARY
c.在SELECT或WHERE列表中包含了子查询,该子查询被标记为:SUBQUERY
d.在FROM列表中包含的子查询被标记为:DERIVED(衍生)
e.若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在 FROM子句的子查询中,外层SELECT将被标记为:DERIVED
f.从UNION表获取结果的SELECT被标记为:UNION RESULT
table :输出的行所引用的表。
type :联合查询所使用的类型,表示MySQL在表中找到所需行的方式,又称“访问类型”。

图片2.png


type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是: 
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,一般来说,得保证查询至少达到range级别,最好能达到ref。



ALL: 扫描全表
index: 扫描全部索引树
range: 扫描部分索引,索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询
ref: 非唯一性索引扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
const, system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。system是const类型的特例,当查询的表只有一行的情况下, 使用system。
NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引。 
如下所示:

20140303171255812.png


possible_keys:指出MySQL能使用哪个索引在该表中找到行。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。 
 
key :显示MySQL实际决定使用的键。如果没有索引被选择,键是NULL。
key_len:显示MySQL决定使用的键长度。表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。如果键是NULL,长度就是NULL。文档提示特别注意这个值可以得出一个多重主键里mysql实际使用了哪一部分。
 注:key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

ref:显示哪个字段或常数与key一起被使用。
rows:这个数表示mysql要遍历多少数据才能找到,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数,在innodb上可能是不准确的。
Extra:包含不适合在其他列中显示但十分重要的额外信息。
Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。 
using where是使用上了where限制,表示MySQL服务器在存储引擎受到记录后进行“后过滤”(Post-filter),如果查询未能使用索引,Using where的作用只是提醒我们MySQL将用where子句来过滤结果集。
impossible where 表示用不着where,一般就是没查出来啥。 
Using filesort(MySQL中无法利用索引完成的排序操作称为“文件排序”)当我们试图对一个没有索引的字段进行排序时,就是filesoft。它跟文件没有任何关系,实际上是内部的一个快速排序。 
Using temporary(表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询),使用filesort和temporary的话会很吃力,WHERE和ORDER BY的索引经常无法兼顾,如果按照WHERE来确定索引,那么在ORDER BY时,就必然会引起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。

最后,再看一个查询计划的例子:

20140303160058687_(1).png

 
第一行:id列为1,表示第一个select,select_type列的primary表示该查询为外层查询,table列被标记为<derived3>,表示查询结果来自一个衍生表,其中3代表该查询衍生自第三个select查询,即id为3的select。[select d1.name......]
第二行:id为3,表示该查询的执行次序为2(4→3),是整个查询中第三个select的一部分。因查询包含在from中,所以为derived。[select id,name from t1 where other_column='']
第三行:select列表中的子查询,select_type为subquery,为整个查询中的第二个select。[select id from t3]
第四行:select_type为union,说明第四个select是union里的第二个select,最先执行。[select name,id from t2]
第五行:代表从union的临时表中读取行的阶段,table列的<union1,4>表示用第一个和第四个select的结果进行union操作。[两个结果union操作]

 

关于MySQL执行计划的局限性:

EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
EXPLAIN不考虑各种Cache
EXPLAIN不能显示MySQL在执行查询时所作的优化工作
部分统计信息是估算的,并非精确值
EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看。


备注:

filesort是通过相应的排序算法,将取得的数据在内存中进行排序。
MySQL需要将数据在内存中进行排序,所使用的内存区域也就是我们通过sort_buffer_size 系统变量所设置的排序区。这个排序区是每个Thread 独享的,所以说可能在同一时刻在MySQL 中可能存在多个 sort buffer 内存区域。

在MySQL中filesort 的实现算法实际上是有两种:
  1. 双路排序:是首先根据相应的条件取出相应的排序字段和可以直接定位行数据的行指针信息,然后在sort buffer 中进行排序。
  2. 单路排序:是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序。


在MySQL4.1版本之前只有第一种排序算法双路排序,第二种算法是从MySQL4.1开始的改进算法,主要目的是为了减少第一次算法中需要两次访问表数据的IO操作,将两次变成了一次,但相应也会耗用更多的sortbuffer 空间。当然,MySQL4.1开始的以后所有版本同时也支持第一种算法。
MySQL主要通过比较我们所设定的系统参数 max_length_for_sort_data的大小和Query 语句所取出的字段类型大小总和来判定需要使用哪一种排序算法。如果 max_length_for_sort_data更大,则使用第二种优化后的算法,反之使用第一种算法。所以如果希望 ORDER BY 操作的效率尽可能的高,一定要注意max_length_for_sort_data 参数的设置。如果filesort过程中,由于排序缓存的大小不够大,那么就可能会导致临时表的使用。
max_length_for_sort_data的默认值是1024。
 
原文地址:http://blog.csdn.net/xifeijian ... 73795

mysql表建立索引方法

回复

数据库zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3879 次浏览 • 2017-08-29 16:26 • 来自相关话题

PHP中如何判断字符串中是否含有指定字符或字符串?

回复

PHPzkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3986 次浏览 • 2017-08-29 10:58 • 来自相关话题

curl请求https时返回false如何解决?

回复

PHPzkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2845 次浏览 • 2017-08-29 10:57 • 来自相关话题

机械键盘里不同颜色的轴是什么意思?

回复

工具软件zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 5300 次浏览 • 2017-08-28 11:02 • 来自相关话题

Yii2 使用数据库总结(一)

回复

Yii框架zkbhj 发起了问题 • 1 人关注 • 0 个回复 • 3766 次浏览 • 2017-08-24 12:13 • 来自相关话题

慢慢实践自己的饮食食谱

好吃喝zkbhj 发表了文章 • 1 个评论 • 2795 次浏览 • 2017-08-21 09:54 • 来自相关话题

 

QQ图片20170821095508.png

 

如何优化NOT IN 的SQL语句?

回复

数据库zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3974 次浏览 • 2017-08-18 20:24 • 来自相关话题

一个域名可以绑定多个IP吗?由此引发的调查

服务器zkbhj 发表了文章 • 0 个评论 • 12947 次浏览 • 2017-08-18 16:36 • 来自相关话题

今天在周例会上,旭哥给大家分享一些关于平时工作排查问题的时候遇到的一些坑,里面提到了一个域名后面可能会对应多台服务器(多个IP),当然,大家都了解的是公司的服务架构里是有“负载均衡”机器的,也就是在真正的应用服务器之前,会有一台或多台nginx机器,也就是我们常说的“负载均衡”机器,负责分配流量,将不同的请求按照一定的规则分配到不同的机器上,保证系统整体的并发量。但在这个体系中,我们访问的域名,仍然对应解析的是一个域名(这台nginx机器),而非后面多个ip的应用机器,那我们疑问中的一个域名绑定多个IP到底能否实现呢?答案是,可以!
 




百度的www.a.shifen.com.有两条A记录指向两个不同的IP地址 
 

如何实现一个域名绑定多个IP?
说到这,就需要给大家讲一个概念——DNS负载均衡。
 
首先我们来看下“负载均衡”的概念:

负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软体和硬件来完成。

这是来自维基百科的解释,那么什么是“DNS负载均衡”?

DNS负载均衡技术的实现原理是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。

 
这个是百科的定义。
 
看了上面的定义,咱们在具体分析一下这个DNS负载均衡,也就是载均衡之DNS轮询。 

DNS轮循(或DNS的循环机制),是指一种负载分发,负载均衡或者容错性地提供多个冗余的IP服务主机的技术。

 
大多数域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡。
下图的例子是:有3台联通服务器、3台电信服务器,要实现“联通用户流量分摊到3台联通服务器、其他用户流量分摊到电信服务器”这个效果的设置。





 
DNS由于成本较低,所以一般在小型的网站用的比较多。但是大型的网站一般也会将用它和其他负载均衡的方式结合起来一起使用,DNS轮询方式提供的IP地址,在大型网站中往往是一个集群的地址,可能是均衡交换机也可能是均衡服务器。对于小网站的话,挂接多台服务器也没有问题。如:





 
DNS轮询的优点:

零成本:只是在DNS服务器上绑定几个A记录,域名注册商一般都免费提供解析服务;
部署简单:就是在网络拓扑进行设备扩增,然后在DNS服务器上添加记录。

DNS轮询的缺点:

1、可靠性低

假设一个域名DNS轮询多台服务器,如果其中的一台服务器发生故障,那么所有的访问该服务器的请求将不会有所回应,这是任何人都不愿意看到的。即使从DNS中去掉该服务器的IP,但在Internet上,各地区电信、网通等宽带接入商将众多的DNS存放在缓存中,以节省访问时间,DNS记录全部生效需要几个小时,甚至更久。所以,尽管DNS轮询在一定程度上解决了负载均衡问题,但是却存在可靠性不高的缺点。

2、负载分配不均匀

DNS负载均衡采用的是简单的轮询算法,不能区分服务器的差异,不能反映服务器的当前运行状态,不能做到为性能较好的服务器多分配请求,甚至会出现客户请求集中在某一台服务器上的情况。

DNS服务器是按照一定的层次结构组织的,本地DNS服务器会缓存已解析的域名到IP地址的映射,这会导致使用该DNS服务器的用户在一段时间内访问的是同一台Web服务器,导致Web服务器间的负载不均匀。此外,用户本地计算机也会缓存已解析的域名到IP地址的映射。当多个用户计算机都缓存了某个域名到IP地址的映射时,而这些用户又继续访问该域名下的网页,这时也会导致不同Web服务器间的负载分配不均匀。

负载不均匀可能导致的后果有:某几台服务器负荷很低,而另几台服务器负载很高、处理缓慢;配置高的服务器分配到的请求少,而配置低的服务器分配到的请求多。 查看全部
今天在周例会上,旭哥给大家分享一些关于平时工作排查问题的时候遇到的一些坑,里面提到了一个域名后面可能会对应多台服务器(多个IP),当然,大家都了解的是公司的服务架构里是有“负载均衡”机器的,也就是在真正的应用服务器之前,会有一台或多台nginx机器,也就是我们常说的“负载均衡”机器,负责分配流量,将不同的请求按照一定的规则分配到不同的机器上,保证系统整体的并发量。但在这个体系中,我们访问的域名,仍然对应解析的是一个域名(这台nginx机器),而非后面多个ip的应用机器,那我们疑问中的一个域名绑定多个IP到底能否实现呢?答案是,可以!
 
QQ截图20170818163833.png

百度的www.a.shifen.com.有两条A记录指向两个不同的IP地址 
 

如何实现一个域名绑定多个IP?
说到这,就需要给大家讲一个概念——DNS负载均衡。
 
首先我们来看下“负载均衡”的概念:


负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软体和硬件来完成。


这是来自维基百科的解释,那么什么是“DNS负载均衡”?


DNS负载均衡技术的实现原理是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。


 
这个是百科的定义。
 
看了上面的定义,咱们在具体分析一下这个DNS负载均衡,也就是载均衡之DNS轮询。 


DNS轮循(或DNS的循环机制),是指一种负载分发,负载均衡或者容错性地提供多个冗余的IP服务主机的技术。


 
大多数域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡。
下图的例子是:有3台联通服务器、3台电信服务器,要实现“联通用户流量分摊到3台联通服务器、其他用户流量分摊到电信服务器”这个效果的设置。

AFFbYn.png

 
DNS由于成本较低,所以一般在小型的网站用的比较多。但是大型的网站一般也会将用它和其他负载均衡的方式结合起来一起使用,DNS轮询方式提供的IP地址,在大型网站中往往是一个集群的地址,可能是均衡交换机也可能是均衡服务器。对于小网站的话,挂接多台服务器也没有问题。如:

NJfQvy.png

 
DNS轮询的优点:

零成本:只是在DNS服务器上绑定几个A记录,域名注册商一般都免费提供解析服务;
部署简单:就是在网络拓扑进行设备扩增,然后在DNS服务器上添加记录。

DNS轮询的缺点:

1、可靠性低

假设一个域名DNS轮询多台服务器,如果其中的一台服务器发生故障,那么所有的访问该服务器的请求将不会有所回应,这是任何人都不愿意看到的。即使从DNS中去掉该服务器的IP,但在Internet上,各地区电信、网通等宽带接入商将众多的DNS存放在缓存中,以节省访问时间,DNS记录全部生效需要几个小时,甚至更久。所以,尽管DNS轮询在一定程度上解决了负载均衡问题,但是却存在可靠性不高的缺点。

2、负载分配不均匀

DNS负载均衡采用的是简单的轮询算法,不能区分服务器的差异,不能反映服务器的当前运行状态,不能做到为性能较好的服务器多分配请求,甚至会出现客户请求集中在某一台服务器上的情况。

DNS服务器是按照一定的层次结构组织的,本地DNS服务器会缓存已解析的域名到IP地址的映射,这会导致使用该DNS服务器的用户在一段时间内访问的是同一台Web服务器,导致Web服务器间的负载不均匀。此外,用户本地计算机也会缓存已解析的域名到IP地址的映射。当多个用户计算机都缓存了某个域名到IP地址的映射时,而这些用户又继续访问该域名下的网页,这时也会导致不同Web服务器间的负载分配不均匀。

负载不均匀可能导致的后果有:某几台服务器负荷很低,而另几台服务器负载很高、处理缓慢;配置高的服务器分配到的请求少,而配置低的服务器分配到的请求多。

读《技术人员如何成为管理者》读后笔记

读后感zkbhj 发表了文章 • 0 个评论 • 1526 次浏览 • 2017-08-18 12:03 • 来自相关话题

阅读笔记思维导图
 
https://v.qq.com/iframe/player.html?vid=u05351xkwe6&width=500&height=375&auto=0 

 我大概自我介绍一下,我叫唐巧,是小猿搜题的产品技术负责人。我之前在网易做过 2 年服务器的开发。后来和网易的同事一起参与一个之前叫做『猿题库』,现在叫做『猿辅导』的公司的创业。做 iOS 开发,现在做了有 5 年了。

大概 3 年前,2014 年 7 月份的时候我们打算做小猿搜题这个产品,当时没有人负责这款产品,我的老大就说让我来负责,所以从那个时候开始,我就慢慢的从一个纯 iOS 开发者,慢慢开始一边写 iOS 代码,一边管理团队,慢慢到后面这个团队越来越大,现在产品和技术加起来大概有三十多人,也没有时间写代码了。

所以说经历了一个纯的技术人员转变到一个技术管理者的历程,大概 2 年的多的时间,所以说给大家分享一下,技术人如何成长成为一个管理者这样一个话题。这个话题之前我自己也深有感触,写过不少笔记,所以正好借这个机会把自己的心得分享给大家。

我们是讲技术人如何成为管理者,主要是讲如何,How 这个话题的。但是我自己觉得在讨论如何成长为管理者之前我们应该先想明白技术人为什么要成为管理者。就是 Why 这个问题。只有我们搞清楚为什么成为管理者,我们才能去成为管理者,成为管理者更偏向于执行,偏具体的工作,而想清楚 Why 是更难的。

技术人成长为管理者的理由

就我自己来看,我觉得技术人成长为管理者有这样一些理由。

01

突破个人贡献的天花板

第一个是突破个人贡献的天花板,释放更大的贡献。为什么这么说,大家都知道。每个公司都有自己的职位划分,比如说百度的技术T级别,管理可能是 M,产品是 P。阿里的技术是 P 级别,管理是 M 级别,产品经理是什么字母开头的记不清了。但是一次有机会和苹果的人聊,在苹果他们只有两种类型的级别。一种是叫做 IC,另一种是 M。IC 是 Individual Contributor 就是个人贡献者,另外 M 就是 Manager。

在苹果他把一个人的类型分为个人贡献者和非个人贡献者,我认为他就代表着一个职位很大的特征。一个个人贡献者他的所有的贡献产出都来自他自己的,很少依赖别人,比如写代码我的产出就是我的一行行代码所构成的最终的产品,我做设计我的产出就是我的设计稿,我做产品我的产出就是原型图和需求文档。这些都是依赖个人能力贡献出来的。

但是如果你是一个管理者的话,你的产出很多时候是很难说清楚的,你会发现,产品稿不是你做的,设计稿不是你做的,代码也不是你写的,但是你在做什么呢?你做的可能是协助他们把这些给做出来,还有组织这些的沟通和相互协调。是另外一种工作方式,我觉得当你尝试管理工作,他会突破你个人能力的天花板,一个个人能力贡献者,可能他的上限就是每天 24 小时不停的工作也就那样了。他就算是不休息,一周也就是工作 7 天那个样子。

但是一个好的管理者的话,他可以发动身边的团队的人,大家朝着一个目标努力,他的贡献可能是释放了十倍百倍的。我觉得这里一个成为管理让人激动人心的地方。他能驱动更多人朝着一个方向努力。做出一个有更大贡献的一个产品。

02

你终究需要面对管理

有些人说我就不喜欢做管理者,我就喜欢做技术,在国内其实也是这样,有些技术人他往上的职业阶梯很美好,比如说我们老讲的阿里的多隆,他成为了阿里的 11 个合伙人之一,他的级别是 P11。成为每个人的偶像。

就算大家从一个基础的技术者,往后做,做的架构师,做到多隆这样的职位,你终究要面对一个事情,就是你需要管理几个人,或者几十个人,在技术上达到一个目标。那个时候你多多少少是需要和别人协调,你除了自己攻坚那些最难的问题之外,你还需要指导你下面的几个可能几十个技术人,大家一起朝一个方向努力。从那个角度讲其实技术人,即便是做技术也需要一些领导技能的。

即使你是一个架构师,你也需要 Lead 一个技术团队。其实对大家来说,你的未来成长不管是走纯技术路线还是走非技术路线,你都需要增长自己的管理技能。因为到最后你总归是需要管理沟通的,很难出现你级别非常非常的高,但是你还不跟任何人打交道,完全靠自己的个人能力来贡献,我几乎没有见到这样的情况。所以这是我觉得一个技术人为什么要成为管理者的原因。

为什么要成为管理者的误区

讲完原因我觉得还有一个误区大家需要特别关注的。我会见到一些技术人他们想做管理者,但是问这些技术人他们为什么要成为管理者,我觉得他们的理由是不对的。这里我列给大家。

01

期望拿更高的薪水

总有人觉得管理就应该高人一等,拿的比别人多,其实不是的。很多公司技术岗和管理岗都有相应的薪资。做纯技术做到架构师你的工资是很高的。

在很多公司,高级的技术,他的 Manager 的工资是比他低的。就是他技术很牛逼,在业界就那几个人能做到。所以说你要是想拿很高的工资的话,这不是一个很好的理由,因为做纯技术也能够找到很高的回报,之后的一步步的技术提升也很高。所以说不是一个很好的理由。

02

期望指使别人

很多人觉得做管理就是指使别人做事情,你做这个,你做那个,其实不是的。很多时候领导都是,负责背锅,负责给大家抗压力,负责擦屁股,负责端茶倒水的伺候大家的人。我印象最深的时候就是我们刚刚创业的时候,我们做一个网站叫做粉笔网,但是这个网站挂了,当时这个网站有一个功能就是PDF预览功能。我们调研了一下市场上的技术,PDF 只能用 FLASH 来完成,大家知道 Flash 已经是一个日落西山的技术了。

当时我们创业大家都觉得这个技术学了过几年会完全没人用的。所以我们当时所有人都不想做这个东西,都不想学,那怎么办呢,我们 CTO 去学,我们 CTO 当时就是完成我们网站上的 PDF 预览功能。这就是一个很好的例子,他就是负责去擦屁股,去做最脏的活,最累的活,大家都不愿意去做的活。

03

指望更轻松的工作

很多人觉得程序员很累对吧,刚刚听说比 996 还辛苦,我知道整个业界,整个中国互联网大家的压力都很大,有些公司 996 是常态,我们公司还好,但是有时候比如上线的时候,改 BUG 会改到很晚,熬夜加班,大家就会觉得程序员太苦了,是不是我做管理就不用加班了呢?我也不用写代码了。我之前有时候也是这么想的。后来我自己现在转管理了。我发现完全这个想法是错的。

就拿我自己来说,我在之前做 iOS 开发,我下班之后就完全可以去做别的事情,我周末只有工作的事情做完了我就可以自己看看博客,自己写点东西,或者玩些别的事情,但是我发现我做管理之后我发现我的事情做不完。总会有一堆事情堆着。每件事情也没有一个完成的定义。所以我上班也要想着这些事,下班也得想着这些事,周末也得想着这些事。

大家发现我现在写博客的实际比以前更短了,这就是一个很好的例子,做管理其实并不是一个轻松的事情。有人说技术是累体力,管理是累心的工作。我觉得真的是这样。技术你就单单和电脑打交道对吧,代码写好,没有 BUG 你就算是做的很好。但是做管理你需要和人沟通,你需要反复的和别人去交流去解决他的问题。很多时候做法没有标准的,目标也没有最明确的,这个过程你需要非常的劳心劳力去把事情做好,非常的累。

04

指望更容易换工作

刚刚我们说到技术人是一个 Individual Contributor 个人贡献者,个人贡献者就有好处就是这家公司垮了,第二天你就能找到一份好工作,只要你的能力是足够强的,比如你代码写的特别好,没关系啊,这家公司不好,你第二天就能找到一个更满意的公司上班,很容易,前提还是你技术是厉害的。但是一个管理者换工作的难度是相对高的,因为很多时候你的管理能力是取决于你对这个团队和业务的了解。

对于我来说我能管理小猿搜题团队,其实是因为我持续在这个团队工作,我熟悉团队中每一个人的性格特点,他们的擅长的,不擅长的,那些人做得好,那些人是温和的,那些人是激进的,和每个人打交道要用他喜欢的方式,我也非常的了解我们产品的用户特点。我们的用户场景是什么,用户行为是什么样子的,我们为什么要做哪些功能,我们未来的产品发展方向。

大家明白嘛?这些全都是和小猿搜题这团队和产品相关的,如果我要换一个工作,在新工作里面我如果面对不一样的人,不一样的产品,我的整个管理方式可能完全都不一样了。所以说我很难去管理一个新的团队。我想说大家都知道空降一个高官其实是非常难的,管理者大多数时候都是从这个团队里培养出来的,而不是空降到那里的。

对我来说除非我把整个团队带走,这样其实是非常奇怪的。正常情况下你离职,那你很难去融入一个新的团队。价值也很难发挥出来。其实会面临一问题。一个管理者是更不容易换工作的,相对于个人贡献者来说。

所以说基于期望拿高薪,期望指使别人,期望更轻松的工作,或者更容易换工作,基于这些理由找工作的话是非常不合适的。管理者根本就不是这样子的。讲完误区我们来看一下技术人如何成为管理者。

如何管理

01

时间管理

我觉得技术人转管理的第一课就是时间管理。为什么这么说,当我们做程序员的时候,我们每天的工作其实都是有人给你安排好的。可能是产品经理也可能是项目经理,他可能会告诉你这周你要完成一个什么样的产品开发目标。他会把产品稿和设计稿都给你。你会给他估计一个时间,这段时间你要做一个什么事情就已经定了,你每天做这个安排好的工作就完了。这个工作做完之后又会有新的工作过来。

对于一个纯程序员来说他的时间管理是非常简单的。他甚至不需要时间管理,他只需要每天完成别人给他的工作就好了。但是它可能会遇到一些技术挑战,可能会遇到一些延期,他顶多是通过加班,或者项目延期的方式来解决,他不涉及很强的自我时间管理。

但是一个管理者完全不一样,等你管理一个团队的时候你会发现,没人过来说今天你要做什么,明天你要做什么,这个星期你要做什么。所有的事情是你自己来安排,如果你去列下来你会发现你有一堆的 TO DO LIST,还有一堆人在找你,那你就需要做时间管理了。

因为你管理不好的话。你会发现你一天工作下来感觉自己累的要死。但是好像什么事情都没做一样。或者做的东西并不是你想做的。所以时间管理是技术人转管理所遇到的第一个挑战。因为他在之前的工作中并没有得到锻炼。

我在这上面也遇到了很大的困难。我怎么办呢,我就去看各种技术转管理的书,看了这几本书《管理的实践》,《卓有成效的管理者》,《成为技术领导者-掌握全面解决问题的方法》,《格鲁夫给经理人的第一课》,我感觉这是管理者第一个需要学习的。

每本书讲的角度都不一样,但是我发现他们讲的套路都是一样的,就是换着方式在说一件事情,套路就是这四点。怎么做时间管理呢?

你先记录,然后分析,然后改进,然后回顾。

具体怎么做,就是你先拿笔记录下来,你每天的时间花费到底在哪里。比如说,你早上几点到几点做了那些事情全部记录下来。记完之后比如说周末下来你看这一周到底时间花在哪里了。到底是花在和别人沟通上还是花在项目的推进上,还是花在招人上面,还是花在别的事情上面,你把它列出了之后你就知道你每块的占比是多少,然后你就可以做分析了。

我天天盯他们进度或许是不必要的,大家可能很自觉,是不是这块时间我可以减,你和他说你遇到问题了再来找我,如果说进度是正常的话就不用来找我了。那你的这块时间可能会减少。但是还是取决于你的同事的工作方式是不是让你信赖的过。

通过思考你会想到一些改进的方式来优化你的时间,最终会得到一个结果,你的改进可能是让你的时间变得更好了,或者你发现这么改不行,然后你会去从新的调整,经过这样的一个反复迭代,就能最终的找到一个让自己舒服的工作节奏和工作方式。

这个就是我 2015 年底某一天写的时间花费,那段时间我经常觉得自己时间很乱,然后我就专门花时间记下来,然后去分析自己的时间花费,做着做着我就发现,确实要好很多了。最终我会把我的时间分成两部分。

一部分是被动时间,一部分是主动时间。被动时间就是别人主动来找我的时间,比如说有些会议需要我去参加,有些产品稿或者设计稿需要我去评审,我会把我的时间专门在软件上记下来。剩下以外就是我的主动时间,主动时间我就回去想,未来三个月对于我来说最重要的事情是什么,然后我就会把我的主动时间全部花在这个上面。其他的事情我觉得不重要的我就把它忽略掉,或者交给别人来做。

接下来就会有人问了。我现在每天就是写代码,没有机会做时间管理啊。我的工作都已经被别人安排好了,怎么办呢? 这里我有一个办法,就是可以尝试从规划你的个人时间开始,什么是你的个人时间呢?就是你工作之外的时间,比如说下班之后、周末这些时间你可以尝试规划一下。

有人说想写博客平时没有时间,或者是不知道怎么写。你可以周末的时间来总结下来写篇博客。或者你规划学习一些技术或者总结一些技术。你自己主动的尝试去做一些时间规划或者时间安排,看看自己执行的好不好。这就是一种自我的时间管理的尝试。这种事情做多了,能管理好自己的时间安排了,等你工作上从技术转管理了再工作中也可以做好这一点。

所以我觉得大家可以从管理好个人时间开始。

02

学会表达

说完个人时间我觉得第二个就是学会表达。这个为什么要提呢。其实我会觉得如果是一个非程序员转管理的话可能都不用说。比如说产品经理转管理就不会需要这一点,因为他的工作每天都是需要和别人去讲的。他需要说服别人去认同他的产品稿。还有和用户交流,他天天都在沟通。

但是有时候我就觉得程序员做的就是一个翻译的工作。就是把产品经理的产品稿翻译成电脑能懂的东西。翻译成一行行代码,电脑能听懂,能够正确的执行。大多数情况下面对电脑做就行了他不涉及到人与人的交流技巧,所以说大部分的程序员都会比较闷,然后不善于表达、不善于沟通。这其实是和他的工作环境有关,因为他的工作就是对着电脑,所以说这方面锻炼的少了自然就弱了。

我刚工作的时候我就特别的恐惧,我这么工作天天从早到晚都对着电脑,会不会就是以后见人都不会说话了,我就有这样的恐惧。然后我就会刻意的去想办法提高自己。所以说我觉得大家如果感觉到自己在表达沟通上能力还有欠缺的话,也可以试着去弥补这方面的能力。

怎么做呢我觉得可以尝试着去写作,写点博客,做个演讲,如果觉得演讲这个事情是比较恐惧的你可以先试着做你们公司内部的技术分享,甚至是不用很大的,就做你们组内的技术分享,大家很熟三五个人还是可以锻炼自己的表达能力的。

指导新人是一个很好的机会,有些人总觉得带新人是一个很累的事情,我觉得是不对的,指导新人是一个非常好的去锻炼自己的表达能力的。每个新人的特点都不一样,你需要针对每个人的个人特点,来定制针对他的个人学习和成长计划,并且和他刻意的去沟通。这个过程就是锻炼自己的表达能力和沟通能力。

比如我之前带一个 iOS 新人,他就很内向,那我怎么办呢,因为他很内向他就不会主动找我过来问问题,我就对他说,每天下午的 5 点到 6 点就过来找我,就是我们讨论问题的时间,我不做别的事情你就向我提问题。就变成我主动和他构建了一个时间来交流。他就会觉得 5 点的时间本来就是向我提问的。他就会把当天遇到的问题主动向我沟通。这就是我自己想出来的,怎么去带比较内向的遇到问题不好意思去提问的新人。你在认真的带新人的过程中也会成长,会学到一些新的东西。

还有一点心得就是把你自己最熟悉的东西给他做,为什么这么说,因为你在写一遍其实非常没有成就感了,一样的代码再写一遍就像是一样的日子再过一遍一样的感觉,你没有任何的挑战,你交给他做,他肯定会出各种问题对吧,你心里会想哎呀还没有我自己做的快。你不要这么想,你指导他成长,这个指导过程对于你来说是很有意义的。

所以说你自己很擅长的事情就不做了交给他做。然后你去想他在这个过程中会遇到什么问题,你提前帮他想好了,他遇到的你跟他讲,讲清楚。对于他来说,在做的新的东西,还有人知道,不会出太大的叉子,他很放心,他很开心。然后对于你来说呢,你会做的事情已经不用自己做了,去给别人做,你也很开心对吧。你学会了新的东西,怎么去指导别人。这是很好的技巧。

还有的话,交朋友也是一个很好的办法,如果单身的话,试着去追一个女朋友也是很好的方式。你能把自己的心爱的女朋友追到手,顺便你的交友技能也得到了提高,表达和沟通的技能也得到了提高。

03

刻意练习

特别要说一点就是以上这些都需要可以练习。不能说巧哥说写博客好,那周末就花两个小时写博客吧。然后每次写都敷衍了事,把博客写出来,如果你每次都是不求精,不求越做越好的话,你在这件事情上就很难有成长。

比如你写博客刚开始你写的很烂没关系,大家可以看我五年前写的非常烂,我还专门看过 bang,就是那个写 JSPatch 热更新的作者。你去看他 10 年前开始写博客的,我去翻了一下写的非常烂,就是说没关系的。

只要你坚持的写,努力的去提高自己的技能,坚持几年下来肯定就很厉害了。bang 现在的博客写的非常厉害,排版整个表达,写了 10 年了肯定厉害了,什么事情做 10 年做不好呢。所以说你只要是刻意练习那肯定是没有问题的。

所以说在表达上不管是写作还是做演讲还是带新人或者是交友,你只要是刻意的在想怎么做是做的更好的。老在想这个事,老在尝试去改进做一些不同的尝试,这件事情肯定是能做好的。我去看我5年前的博客也是写的非常糟糕,我现在觉得我的博客还是不错的。这就是刻意练习带来的成效。

下一个需要做的其实就是偏执行的事了。管理上面的事情其实很多人都已经遇到了。有人也有总结,市面上有很多很多的书,就是需要你去花时间翻一翻那些书,看看这些人他是怎么讲他遇到的问题的。其实和做技术一样,遇到问题了就去网上搜一下。GitChat 上有没有别人解决的,去看看书上是这么说的。很多的时候别人也遇到了一样的问题,并且解决的很好,你去看书上讲的然后自己再实践一遍,然后自己有所体会和收获。

这里面有些需要注意的。第一点就是看书,但是不能照搬。因为管理这个东西不像是技术,技术一就是一,二就是二,但是管理很多的时候都是偏实践的。每个团队都有不用的文化,沟通方式,书上讲的不一定是适合你的团队和你个人的。

我个人推荐两本书,第一本是《格鲁夫给经理人的一课》,第二本书是《成为技术领导者》。第一本书的格鲁夫是因特尔的总裁,他代理因特尔从半导体时代转型做CPU。

大家知道嘛?因特尔最早不是做 CPU 的,他是做内存芯片的。大家知道日本在做内存芯片基本上是处于垄断地位的,他们被日本厂商搞的快要倒闭了。然后格鲁夫带领因特尔转型从内存芯片转型做 CPU,后来的故事大家都知道了,因特尔成为芯片行业的霸主。

格鲁夫带领因特尔做了一次成功的转型。格鲁夫也是一个技术人员,他最早的时候就是一个程序员。所以看他的书会非常的亲切,他会用程序员的语言给大家讲,给你列各种管理学的公式,还有各种例子,文字都非常的有条理。一眼就能看明白他在讲什么,不会绕来绕去的,非常适合大家去看。

第二本书的作者也是一个技术人员,都是从程序员的角度来写的如何管理。我觉得是非常好的两本书。即便是你不做管理你也可以看一看。你可以看看你部门的领导是不是按着这样的方式来管理的。

下一步就是我刚刚说的实践了。我觉得管理就有点像是学游泳,你在岸上是怎么都学不会的。那些理论都是你实践之后才能够体会的。对于你来说就是一个个的知识点,你没办法深有感触。所以说最好的学习方式就是实践。当你真正的开始带一个新人,指导一个技术团队,慢慢的这个团队你管的越来越大,慢慢的你就会有各种的体会了。那才是被你吸收的一些管理能力。书上讲的都是别人的。

我推荐这些书。我自己看过这六本书都很好。《管理的实践》、《卓有成效的管理者》、《格鲁夫给经理人的第一课》、《管理3.0:培养和提升敏捷领导力》、《领导梯队》、《成为技术领导者》前两本是德鲁克的,第三本是刚刚说的格鲁夫的,每本书的讲法都不太一样,总会学到一些不一样的见解,其中有些东西就会成为你自己的。

心得

最后讲一讲我的心得。说是心得其实就是遇到的坑,所以我弄了一个很大的坑在这里,掉了不少坑,这里给大家做一些分享。

01

不写代码

第一个坑就是你会发现没有时间写代码了。我开始的时候讲了我是2014年底开始转管理的,开始我还有一点时间写代码,但是到后面很快就没有时间写代码了。那个时候我还是幻想应该要写点代码,不能把技术丢了,我就给他们说,还是给我分点活吧,我少做点。后来我发现完全做不了,因为做管理的很多时候是做协调,做协调工作就会发现别人老是过来找你,需要和你沟通,但是程序员又是需要很长时间安静的思考的。

有个理论就是说程序员被打的一次需要 15 分钟才能接上上次的思路,我觉得是有道理的。比如你刚刚想好一个逻辑,刚刚开始写了,啪被别人打断了,那个时候就想杀人,所以大家都说程序员大家不要轻易打扰他。程序员的工作方式是需要尽量安静的思考。管理的工作特点是频繁的和人沟通。所以我那段时间就频繁的被人打断,我就只能用晚上或者周末的时间来写代码,那样又会影响整个项目的进度,后来我就完全不写代码了。

但是我还是很喜欢的写代码的, 我就用周末的时间写点 demo,看一些新技术做一些研究或者做一些分享,通过这种方式来学习。但是公司的项目代码我是完全写不了的。这是我遇到的第一个坑,尝试编写代码边做管理工作。我发现这样是不行的。

02

怀疑自己的价值

第二个坑就是迷茫,我是谁,我要做什么。管理很多时候给大家带来的价值,或者给团队带来的价值会有点虚。好像自己什么都没做,事情都是别人做的,有一段时间我有这样的担心,但是后来我发现不是这样的。因为一个团队每个人要过的开心,会遇到各种各样的问题,可能是人际关系的问题,可能是沟通方式的问题,可能是和别的组协作的问题,各种各样的问题,你能帮助他把这样的问题全部解决,让每个人都工作的很好,很开心这是很难的。

刚才我提到的《成为技术领导者》的那本书,给管理的定义就是所谓的领导者就是要创造一个环境,让每个人都开心的舒服的工作,发挥它最大的价值。所谓的管理其实就是这个样子,你看起来什么都不做。但是你一旦构建出一个团队,每个人都很舒服,很开心很高兴工作没有遇到各种问题,这其实就是你的成功,和价值。我花了很长的时间来扭转自己的观点。可能大家在刚刚开始管理的时候也会有这样的问题或者困惑。看上去你每天只是动动嘴皮子,但是里面是要花很多心思的。

03

懂向上管理

最后一个坑就是不懂的向上管理。这也是程序员本身这个职业带来的。很多时候作为一个程序员你只需要写代码,把代码写好,你不需要去和你的老大去提什么要求。涨工资有时候会提的,或者也不用提,你干的好他就给你涨了。但是当你管一个团队的时候,除非你是 CEO,就算是 CEO 也会和董事会汇报,你总是会有一个向上的管理过程,你需要像你的老大去沟通,他希望整个团队在未来主要去解决什么问题这就是一个向上管理的过程。

通过和老大的沟通,获得他对整个团队的期望和目标。也通过沟通提出你遇到的困难的和挑战,让他给你相应的资源和帮助,这个过程其实是很重要的。刚开始带一个团队很可能会忽视这样的一个过程,你可能会觉得不好意思,或者不重要,其实这是非常重要的。

在德鲁克的那本书里举过这样一个例子。他人主管写下一个目标,然后让上司写下他对主管的工作目标和期望。会发现大部人写的都是不一样的有90%不一样,这就是缺乏沟通的一个问题。如果没有一个这样向上管理的话,你可能把整个团队都给带偏了,最后老大会说我要的其实不是这个。我要的是另外一个东西。所以说一定要做好向上管理。

每隔三个月我就会找老大聊一聊未来三个月的工作目标是什么,让他看看有没有问题。最近一次沟通下来我确实发现他想的和我的不一样。然后和他聊,最终我接受了他的观点,这是一个很重要的过程。

最后我大概总结一下今天分享。开始的时候讲了成为管理者的一些好处和误区。我分享了成为管理者的三个非常基础的方法。一个是时间管理,一个是强化表达,最后一个是看一些方法论的书。如果你去看书的话还会发现各种各样的技巧和方法,我觉得那些不重要,你只要记住这几个基本的那些东西都能学会。最后我介绍了一些我遇到的一些坑期望能够指导大家,我觉得这件事情值得每一个程序员去尝试去积累自己的管理能力。

我觉得不管你最终是一个架构师还是说整个团队的管理者你都会需要这样的能力。我真心的希望在座的每个人都能在这个方面有所成长。以上就是我的分享,谢谢大家!

Q&A时间

Q您好,首先我先谢谢巧哥的分享,感觉这三百块钱花的值了。我有两个问题,一个就是现在我处的状态可能是和您5年前是一样的。在一个技术转型期。自己的技术达到了一定的程度。公司放心我去带一个小的团队,我现在手下面大概7个人。三个前端四个后端。我的问题是您是怎么放心的把工作交给其他人的呢。有些时候公司会有一些很重要的工作交给你。比如说你要跑一些运维的脚本或者是公司要一些什么的数据,但是呢,这些我熟,但是我没时间。我做的话可能2个小时能做出来。但是别人的话,可能一天都做不出来。你想把自己的工作交给别人,但是你不放心,因为涉及的东西太多了。

A怎么样把工作交给别人这个问题是很好的问题。我自己也深有感触就像我刚刚说的。别人花一天时间其实还不如你写两个小时写得好,你还需要指导别人 2 天 3 天的时间最后这个事情才能完成。

这两者有一个很大的差别,你在指导别人他是在成长的。如果你确定这个人还靠谱的话。他最终达到你的水平只是一个时间的问题。在这个过程中你需要注意怎么指导他,并且确定他不会把问题搞糟。最终大家还是要为结果负责。如果把事情搞砸肯定是不行的。指导上面我觉得还是需要尽心尽力的。尽量的让他感觉到你是期望他成长起来的。能够做的像你一样好的,他会觉得你这么放心他会有压力。

你心里还是应该有一个判断,你把事情交给他,他能不能搞定,你心里一定要由这个判读,不能说我很相信你,但是最后事情搞砸了,其实是你自己没有做好判断。就是要判读这个人到底只是需要时间指导还是说他可能就不是一个认真的人,不够负责的人的。如果他靠谱的话就只是一下技巧的问题。如果你不放心,在他最终做完的时候你去帮他做 review,还有在一些关键的问题上和他讨论。

我怎么指导一个人去做一个很难的事情。一个很难的事情我之前做过。我说这个事情交给你,你先想一想,等你有思路了过来找我,他想了有思路过来找我。有些地方想的不对的我给他指出来这些地方可能会有问题你在想想,和他都通完,我说没问题你去写吧。写完我再看一眼,看看有没有问题,有问题再改。其中的关键步骤你都加入了自己的检查,所以说他搞高不乱的,最坏的情况就是你最后看的还是发现有问题。 最后不上就行了,延期不上不会对线上有太多影响。

你指导一个新人心里一定要有把握,并且在一些关键的地方加上自己的检查。这件事情就能够放心的交给别人的了,只是说你需要再花点时间。这样的事情做几次之后就会发现,这人能行呢。后来再有困难的问题你就让他去想,然后告诉你,你就会发现该想的都想到了呢。然后说写完给我看一看,你一看写的很好没什么问题。再后来你说有思路给我讲讲就行了不用给我看代码了。再后来你就可以说遇到问题再来找我。没问题就不用找我了。慢慢的这是一个渐进的过程不是一个突然的,扔给别人,什么事情都不用管了。

Q所以说有一个问题的时候不会把解决方案告诉他。而是让他去想?

A是的不会告诉,解决问题的能力是很重要的,你要让他自己的去想,不然你交不出去的。

Q如何应对突然的打断?

A首先我回去做时间记录。我会去看看那些时间是被别人打断的。你会发现有些打断是避免不了的,比如确实是突发的必须去处理的。有些你会发现打断是可以避免的,比如说产品写完产品稿说你来看一看,你可以定一个时间就是每天的下午 5 点钟是产品的过稿时间,或者 2 周过一次。如果发现一些打断不是那么重要的话。你可以制定一些规则约束,大家知道你的规则就会按照你的规则来,毕竟你还是负责人。

Q巧哥你好我是做 iOS 开发的,我想问一下你们公司的 APP 是如何避免在开发过程中越来越大的呢。

A首先分析 APP 大的地方在哪里,我们就会把我们的程序拆解开,比如资源文件多大,程序逻辑多大,还有一些别的多大。比如说程序逻辑过大,就去看看是哪里的问题,比如打进去的无用的库,或者无用代码,再去看资源文件,图片压缩,用矢量图。比如说猿题库我们有一个公式的渲染引擎需要资源。我们就安装之后再下载。就是要根据具体看消耗在哪里,然后去对应的解决问题。完了之后再看体积缩下来多少。

Q我也是技术转管理的,就是管理上我年纪比较小我是 96 年的。有些人他感觉自己的经验很丰富,怎么和他沟通会比较好一点。我是做前端的,我说一个方案,那个同事就会按照自己的方案来。我是知道这里有坑的。

A这样我的建议是让他去尝试,遇到问了几次出现问题,发现你说的对,会对你的技术产生尊重。虽然中间可能会浪费一些实际,管理就是大家建立默契相互信任他其实就是花时间的,他当前没有对你建立信任,这就是一个管理成本。我的建议就是让他错几次。我们老大是怎么管理我们的呢,他说犯错没关系,一定要总结。我并不担心浪费一点时间。我更多的是期望团队搭建好了,之后的团队管理就会舒服很多了,所以说我会愿意花这个成本。

Q我们公司现在 10 个人。我经常发现我只能给 2,3 个人派事情。我自己也有事情做。就是这么多人我管不过来。

A核心就是我刚才讲的。你自己在写代码一样。就是你已经是 10 个人的团队了,自己的工作应该压缩一些尽量少一些。尽量交给别人来做。你团队 10 个人中间协调和沟通的工作应该会很多。你在这个上面不花时间就没人花时间了。你不沟通有些人就真的闲杂哪里了。他们就真的不知道干什么。他们也不敢过来找你,看到你很忙。对于组织来说就浪费这个资源了。管理的层级应该尽量的少。层级多了会带来沟通的效率损失 10 个人的团队应该是最舒服的,这 10 个人应该每个人都非常清楚别人做的事。都知道大家的努力方向如果你引入中间的架构效率会损失。所以就需要多沟通,给每个人派活。把你的事情分出来。

Q我怎么能确保我想要的和下面人做出来的最后的是一样的。

A程序员有些时候会误会一些产品稿,实现错了还有一些比较麻烦或者漏掉了。我们会有每天打包,程序员写完了就让产品马上下下来用用,看看有没有什么问题,如果有问题马上去找他,通过更早的发现问题来解决问题。在最终上线前设计产品和技术都会在看一遍。看看哪里有问题。并不是测试,而是简单的测试。

Q如何让团队的人知道我想要做的事情

A我主要是用 WIKI,给大家做协培训,然后录像。来了一个新人我就会让他看WIKI 和录像,在他看完之后我再和他沟通看看再这个过程中有什么问题。

Q巧哥你好。我就是前一两年看博客各种技术文章认识到您的。我目前是个 iOS 也是干了 2,3 年了,现在遇到的问题就是对技术特别的喜欢,但是产品也比较喜欢,但公司的产品和我的想法就比较大的冲突。因为我是从技术出发的。现在的情况就是有想法,但是他们不采纳。

A你要明白技术人转管理和技术人转产品这是两个事情。主要的产品还有由他们决策。产品对产品负责,技术对技术负责。这样才是正确的工作方式。大家相互尊重,信任对方。 查看全部
QQ图片20170818120049.png

阅读笔记思维导图
 
https://v.qq.com/iframe/player.html?vid=u05351xkwe6&width=500&height=375&auto=0 

 我大概自我介绍一下,我叫唐巧,是小猿搜题的产品技术负责人。我之前在网易做过 2 年服务器的开发。后来和网易的同事一起参与一个之前叫做『猿题库』,现在叫做『猿辅导』的公司的创业。做 iOS 开发,现在做了有 5 年了。

大概 3 年前,2014 年 7 月份的时候我们打算做小猿搜题这个产品,当时没有人负责这款产品,我的老大就说让我来负责,所以从那个时候开始,我就慢慢的从一个纯 iOS 开发者,慢慢开始一边写 iOS 代码,一边管理团队,慢慢到后面这个团队越来越大,现在产品和技术加起来大概有三十多人,也没有时间写代码了。

所以说经历了一个纯的技术人员转变到一个技术管理者的历程,大概 2 年的多的时间,所以说给大家分享一下,技术人如何成长成为一个管理者这样一个话题。这个话题之前我自己也深有感触,写过不少笔记,所以正好借这个机会把自己的心得分享给大家。

我们是讲技术人如何成为管理者,主要是讲如何,How 这个话题的。但是我自己觉得在讨论如何成长为管理者之前我们应该先想明白技术人为什么要成为管理者。就是 Why 这个问题。只有我们搞清楚为什么成为管理者,我们才能去成为管理者,成为管理者更偏向于执行,偏具体的工作,而想清楚 Why 是更难的。

技术人成长为管理者的理由

就我自己来看,我觉得技术人成长为管理者有这样一些理由。

01

突破个人贡献的天花板

第一个是突破个人贡献的天花板,释放更大的贡献。为什么这么说,大家都知道。每个公司都有自己的职位划分,比如说百度的技术T级别,管理可能是 M,产品是 P。阿里的技术是 P 级别,管理是 M 级别,产品经理是什么字母开头的记不清了。但是一次有机会和苹果的人聊,在苹果他们只有两种类型的级别。一种是叫做 IC,另一种是 M。IC 是 Individual Contributor 就是个人贡献者,另外 M 就是 Manager。

在苹果他把一个人的类型分为个人贡献者和非个人贡献者,我认为他就代表着一个职位很大的特征。一个个人贡献者他的所有的贡献产出都来自他自己的,很少依赖别人,比如写代码我的产出就是我的一行行代码所构成的最终的产品,我做设计我的产出就是我的设计稿,我做产品我的产出就是原型图和需求文档。这些都是依赖个人能力贡献出来的。

但是如果你是一个管理者的话,你的产出很多时候是很难说清楚的,你会发现,产品稿不是你做的,设计稿不是你做的,代码也不是你写的,但是你在做什么呢?你做的可能是协助他们把这些给做出来,还有组织这些的沟通和相互协调。是另外一种工作方式,我觉得当你尝试管理工作,他会突破你个人能力的天花板,一个个人能力贡献者,可能他的上限就是每天 24 小时不停的工作也就那样了。他就算是不休息,一周也就是工作 7 天那个样子。

但是一个好的管理者的话,他可以发动身边的团队的人,大家朝着一个目标努力,他的贡献可能是释放了十倍百倍的。我觉得这里一个成为管理让人激动人心的地方。他能驱动更多人朝着一个方向努力。做出一个有更大贡献的一个产品。

02

你终究需要面对管理

有些人说我就不喜欢做管理者,我就喜欢做技术,在国内其实也是这样,有些技术人他往上的职业阶梯很美好,比如说我们老讲的阿里的多隆,他成为了阿里的 11 个合伙人之一,他的级别是 P11。成为每个人的偶像。

就算大家从一个基础的技术者,往后做,做的架构师,做到多隆这样的职位,你终究要面对一个事情,就是你需要管理几个人,或者几十个人,在技术上达到一个目标。那个时候你多多少少是需要和别人协调,你除了自己攻坚那些最难的问题之外,你还需要指导你下面的几个可能几十个技术人,大家一起朝一个方向努力。从那个角度讲其实技术人,即便是做技术也需要一些领导技能的。

即使你是一个架构师,你也需要 Lead 一个技术团队。其实对大家来说,你的未来成长不管是走纯技术路线还是走非技术路线,你都需要增长自己的管理技能。因为到最后你总归是需要管理沟通的,很难出现你级别非常非常的高,但是你还不跟任何人打交道,完全靠自己的个人能力来贡献,我几乎没有见到这样的情况。所以这是我觉得一个技术人为什么要成为管理者的原因。

为什么要成为管理者的误区

讲完原因我觉得还有一个误区大家需要特别关注的。我会见到一些技术人他们想做管理者,但是问这些技术人他们为什么要成为管理者,我觉得他们的理由是不对的。这里我列给大家。

01

期望拿更高的薪水

总有人觉得管理就应该高人一等,拿的比别人多,其实不是的。很多公司技术岗和管理岗都有相应的薪资。做纯技术做到架构师你的工资是很高的。

在很多公司,高级的技术,他的 Manager 的工资是比他低的。就是他技术很牛逼,在业界就那几个人能做到。所以说你要是想拿很高的工资的话,这不是一个很好的理由,因为做纯技术也能够找到很高的回报,之后的一步步的技术提升也很高。所以说不是一个很好的理由。

02

期望指使别人

很多人觉得做管理就是指使别人做事情,你做这个,你做那个,其实不是的。很多时候领导都是,负责背锅,负责给大家抗压力,负责擦屁股,负责端茶倒水的伺候大家的人。我印象最深的时候就是我们刚刚创业的时候,我们做一个网站叫做粉笔网,但是这个网站挂了,当时这个网站有一个功能就是PDF预览功能。我们调研了一下市场上的技术,PDF 只能用 FLASH 来完成,大家知道 Flash 已经是一个日落西山的技术了。

当时我们创业大家都觉得这个技术学了过几年会完全没人用的。所以我们当时所有人都不想做这个东西,都不想学,那怎么办呢,我们 CTO 去学,我们 CTO 当时就是完成我们网站上的 PDF 预览功能。这就是一个很好的例子,他就是负责去擦屁股,去做最脏的活,最累的活,大家都不愿意去做的活。

03

指望更轻松的工作

很多人觉得程序员很累对吧,刚刚听说比 996 还辛苦,我知道整个业界,整个中国互联网大家的压力都很大,有些公司 996 是常态,我们公司还好,但是有时候比如上线的时候,改 BUG 会改到很晚,熬夜加班,大家就会觉得程序员太苦了,是不是我做管理就不用加班了呢?我也不用写代码了。我之前有时候也是这么想的。后来我自己现在转管理了。我发现完全这个想法是错的。

就拿我自己来说,我在之前做 iOS 开发,我下班之后就完全可以去做别的事情,我周末只有工作的事情做完了我就可以自己看看博客,自己写点东西,或者玩些别的事情,但是我发现我做管理之后我发现我的事情做不完。总会有一堆事情堆着。每件事情也没有一个完成的定义。所以我上班也要想着这些事,下班也得想着这些事,周末也得想着这些事。

大家发现我现在写博客的实际比以前更短了,这就是一个很好的例子,做管理其实并不是一个轻松的事情。有人说技术是累体力,管理是累心的工作。我觉得真的是这样。技术你就单单和电脑打交道对吧,代码写好,没有 BUG 你就算是做的很好。但是做管理你需要和人沟通,你需要反复的和别人去交流去解决他的问题。很多时候做法没有标准的,目标也没有最明确的,这个过程你需要非常的劳心劳力去把事情做好,非常的累。

04

指望更容易换工作

刚刚我们说到技术人是一个 Individual Contributor 个人贡献者,个人贡献者就有好处就是这家公司垮了,第二天你就能找到一份好工作,只要你的能力是足够强的,比如你代码写的特别好,没关系啊,这家公司不好,你第二天就能找到一个更满意的公司上班,很容易,前提还是你技术是厉害的。但是一个管理者换工作的难度是相对高的,因为很多时候你的管理能力是取决于你对这个团队和业务的了解。

对于我来说我能管理小猿搜题团队,其实是因为我持续在这个团队工作,我熟悉团队中每一个人的性格特点,他们的擅长的,不擅长的,那些人做得好,那些人是温和的,那些人是激进的,和每个人打交道要用他喜欢的方式,我也非常的了解我们产品的用户特点。我们的用户场景是什么,用户行为是什么样子的,我们为什么要做哪些功能,我们未来的产品发展方向。

大家明白嘛?这些全都是和小猿搜题这团队和产品相关的,如果我要换一个工作,在新工作里面我如果面对不一样的人,不一样的产品,我的整个管理方式可能完全都不一样了。所以说我很难去管理一个新的团队。我想说大家都知道空降一个高官其实是非常难的,管理者大多数时候都是从这个团队里培养出来的,而不是空降到那里的。

对我来说除非我把整个团队带走,这样其实是非常奇怪的。正常情况下你离职,那你很难去融入一个新的团队。价值也很难发挥出来。其实会面临一问题。一个管理者是更不容易换工作的,相对于个人贡献者来说。

所以说基于期望拿高薪,期望指使别人,期望更轻松的工作,或者更容易换工作,基于这些理由找工作的话是非常不合适的。管理者根本就不是这样子的。讲完误区我们来看一下技术人如何成为管理者。

如何管理

01

时间管理

我觉得技术人转管理的第一课就是时间管理。为什么这么说,当我们做程序员的时候,我们每天的工作其实都是有人给你安排好的。可能是产品经理也可能是项目经理,他可能会告诉你这周你要完成一个什么样的产品开发目标。他会把产品稿和设计稿都给你。你会给他估计一个时间,这段时间你要做一个什么事情就已经定了,你每天做这个安排好的工作就完了。这个工作做完之后又会有新的工作过来。

对于一个纯程序员来说他的时间管理是非常简单的。他甚至不需要时间管理,他只需要每天完成别人给他的工作就好了。但是它可能会遇到一些技术挑战,可能会遇到一些延期,他顶多是通过加班,或者项目延期的方式来解决,他不涉及很强的自我时间管理。

但是一个管理者完全不一样,等你管理一个团队的时候你会发现,没人过来说今天你要做什么,明天你要做什么,这个星期你要做什么。所有的事情是你自己来安排,如果你去列下来你会发现你有一堆的 TO DO LIST,还有一堆人在找你,那你就需要做时间管理了。

因为你管理不好的话。你会发现你一天工作下来感觉自己累的要死。但是好像什么事情都没做一样。或者做的东西并不是你想做的。所以时间管理是技术人转管理所遇到的第一个挑战。因为他在之前的工作中并没有得到锻炼。

我在这上面也遇到了很大的困难。我怎么办呢,我就去看各种技术转管理的书,看了这几本书《管理的实践》,《卓有成效的管理者》,《成为技术领导者-掌握全面解决问题的方法》,《格鲁夫给经理人的第一课》,我感觉这是管理者第一个需要学习的。

每本书讲的角度都不一样,但是我发现他们讲的套路都是一样的,就是换着方式在说一件事情,套路就是这四点。怎么做时间管理呢?

你先记录,然后分析,然后改进,然后回顾。

具体怎么做,就是你先拿笔记录下来,你每天的时间花费到底在哪里。比如说,你早上几点到几点做了那些事情全部记录下来。记完之后比如说周末下来你看这一周到底时间花在哪里了。到底是花在和别人沟通上还是花在项目的推进上,还是花在招人上面,还是花在别的事情上面,你把它列出了之后你就知道你每块的占比是多少,然后你就可以做分析了。

我天天盯他们进度或许是不必要的,大家可能很自觉,是不是这块时间我可以减,你和他说你遇到问题了再来找我,如果说进度是正常的话就不用来找我了。那你的这块时间可能会减少。但是还是取决于你的同事的工作方式是不是让你信赖的过。

通过思考你会想到一些改进的方式来优化你的时间,最终会得到一个结果,你的改进可能是让你的时间变得更好了,或者你发现这么改不行,然后你会去从新的调整,经过这样的一个反复迭代,就能最终的找到一个让自己舒服的工作节奏和工作方式。

这个就是我 2015 年底某一天写的时间花费,那段时间我经常觉得自己时间很乱,然后我就专门花时间记下来,然后去分析自己的时间花费,做着做着我就发现,确实要好很多了。最终我会把我的时间分成两部分。

一部分是被动时间,一部分是主动时间。被动时间就是别人主动来找我的时间,比如说有些会议需要我去参加,有些产品稿或者设计稿需要我去评审,我会把我的时间专门在软件上记下来。剩下以外就是我的主动时间,主动时间我就回去想,未来三个月对于我来说最重要的事情是什么,然后我就会把我的主动时间全部花在这个上面。其他的事情我觉得不重要的我就把它忽略掉,或者交给别人来做。

接下来就会有人问了。我现在每天就是写代码,没有机会做时间管理啊。我的工作都已经被别人安排好了,怎么办呢? 这里我有一个办法,就是可以尝试从规划你的个人时间开始,什么是你的个人时间呢?就是你工作之外的时间,比如说下班之后、周末这些时间你可以尝试规划一下。

有人说想写博客平时没有时间,或者是不知道怎么写。你可以周末的时间来总结下来写篇博客。或者你规划学习一些技术或者总结一些技术。你自己主动的尝试去做一些时间规划或者时间安排,看看自己执行的好不好。这就是一种自我的时间管理的尝试。这种事情做多了,能管理好自己的时间安排了,等你工作上从技术转管理了再工作中也可以做好这一点。

所以我觉得大家可以从管理好个人时间开始。

02

学会表达

说完个人时间我觉得第二个就是学会表达。这个为什么要提呢。其实我会觉得如果是一个非程序员转管理的话可能都不用说。比如说产品经理转管理就不会需要这一点,因为他的工作每天都是需要和别人去讲的。他需要说服别人去认同他的产品稿。还有和用户交流,他天天都在沟通。

但是有时候我就觉得程序员做的就是一个翻译的工作。就是把产品经理的产品稿翻译成电脑能懂的东西。翻译成一行行代码,电脑能听懂,能够正确的执行。大多数情况下面对电脑做就行了他不涉及到人与人的交流技巧,所以说大部分的程序员都会比较闷,然后不善于表达、不善于沟通。这其实是和他的工作环境有关,因为他的工作就是对着电脑,所以说这方面锻炼的少了自然就弱了。

我刚工作的时候我就特别的恐惧,我这么工作天天从早到晚都对着电脑,会不会就是以后见人都不会说话了,我就有这样的恐惧。然后我就会刻意的去想办法提高自己。所以说我觉得大家如果感觉到自己在表达沟通上能力还有欠缺的话,也可以试着去弥补这方面的能力。

怎么做呢我觉得可以尝试着去写作,写点博客,做个演讲,如果觉得演讲这个事情是比较恐惧的你可以先试着做你们公司内部的技术分享,甚至是不用很大的,就做你们组内的技术分享,大家很熟三五个人还是可以锻炼自己的表达能力的。

指导新人是一个很好的机会,有些人总觉得带新人是一个很累的事情,我觉得是不对的,指导新人是一个非常好的去锻炼自己的表达能力的。每个新人的特点都不一样,你需要针对每个人的个人特点,来定制针对他的个人学习和成长计划,并且和他刻意的去沟通。这个过程就是锻炼自己的表达能力和沟通能力。

比如我之前带一个 iOS 新人,他就很内向,那我怎么办呢,因为他很内向他就不会主动找我过来问问题,我就对他说,每天下午的 5 点到 6 点就过来找我,就是我们讨论问题的时间,我不做别的事情你就向我提问题。就变成我主动和他构建了一个时间来交流。他就会觉得 5 点的时间本来就是向我提问的。他就会把当天遇到的问题主动向我沟通。这就是我自己想出来的,怎么去带比较内向的遇到问题不好意思去提问的新人。你在认真的带新人的过程中也会成长,会学到一些新的东西。

还有一点心得就是把你自己最熟悉的东西给他做,为什么这么说,因为你在写一遍其实非常没有成就感了,一样的代码再写一遍就像是一样的日子再过一遍一样的感觉,你没有任何的挑战,你交给他做,他肯定会出各种问题对吧,你心里会想哎呀还没有我自己做的快。你不要这么想,你指导他成长,这个指导过程对于你来说是很有意义的。

所以说你自己很擅长的事情就不做了交给他做。然后你去想他在这个过程中会遇到什么问题,你提前帮他想好了,他遇到的你跟他讲,讲清楚。对于他来说,在做的新的东西,还有人知道,不会出太大的叉子,他很放心,他很开心。然后对于你来说呢,你会做的事情已经不用自己做了,去给别人做,你也很开心对吧。你学会了新的东西,怎么去指导别人。这是很好的技巧。

还有的话,交朋友也是一个很好的办法,如果单身的话,试着去追一个女朋友也是很好的方式。你能把自己的心爱的女朋友追到手,顺便你的交友技能也得到了提高,表达和沟通的技能也得到了提高。

03

刻意练习

特别要说一点就是以上这些都需要可以练习。不能说巧哥说写博客好,那周末就花两个小时写博客吧。然后每次写都敷衍了事,把博客写出来,如果你每次都是不求精,不求越做越好的话,你在这件事情上就很难有成长。

比如你写博客刚开始你写的很烂没关系,大家可以看我五年前写的非常烂,我还专门看过 bang,就是那个写 JSPatch 热更新的作者。你去看他 10 年前开始写博客的,我去翻了一下写的非常烂,就是说没关系的。

只要你坚持的写,努力的去提高自己的技能,坚持几年下来肯定就很厉害了。bang 现在的博客写的非常厉害,排版整个表达,写了 10 年了肯定厉害了,什么事情做 10 年做不好呢。所以说你只要是刻意练习那肯定是没有问题的。

所以说在表达上不管是写作还是做演讲还是带新人或者是交友,你只要是刻意的在想怎么做是做的更好的。老在想这个事,老在尝试去改进做一些不同的尝试,这件事情肯定是能做好的。我去看我5年前的博客也是写的非常糟糕,我现在觉得我的博客还是不错的。这就是刻意练习带来的成效。

下一个需要做的其实就是偏执行的事了。管理上面的事情其实很多人都已经遇到了。有人也有总结,市面上有很多很多的书,就是需要你去花时间翻一翻那些书,看看这些人他是怎么讲他遇到的问题的。其实和做技术一样,遇到问题了就去网上搜一下。GitChat 上有没有别人解决的,去看看书上是这么说的。很多的时候别人也遇到了一样的问题,并且解决的很好,你去看书上讲的然后自己再实践一遍,然后自己有所体会和收获。

这里面有些需要注意的。第一点就是看书,但是不能照搬。因为管理这个东西不像是技术,技术一就是一,二就是二,但是管理很多的时候都是偏实践的。每个团队都有不用的文化,沟通方式,书上讲的不一定是适合你的团队和你个人的。

我个人推荐两本书,第一本是《格鲁夫给经理人的一课》,第二本书是《成为技术领导者》。第一本书的格鲁夫是因特尔的总裁,他代理因特尔从半导体时代转型做CPU。

大家知道嘛?因特尔最早不是做 CPU 的,他是做内存芯片的。大家知道日本在做内存芯片基本上是处于垄断地位的,他们被日本厂商搞的快要倒闭了。然后格鲁夫带领因特尔转型从内存芯片转型做 CPU,后来的故事大家都知道了,因特尔成为芯片行业的霸主。

格鲁夫带领因特尔做了一次成功的转型。格鲁夫也是一个技术人员,他最早的时候就是一个程序员。所以看他的书会非常的亲切,他会用程序员的语言给大家讲,给你列各种管理学的公式,还有各种例子,文字都非常的有条理。一眼就能看明白他在讲什么,不会绕来绕去的,非常适合大家去看。

第二本书的作者也是一个技术人员,都是从程序员的角度来写的如何管理。我觉得是非常好的两本书。即便是你不做管理你也可以看一看。你可以看看你部门的领导是不是按着这样的方式来管理的。

下一步就是我刚刚说的实践了。我觉得管理就有点像是学游泳,你在岸上是怎么都学不会的。那些理论都是你实践之后才能够体会的。对于你来说就是一个个的知识点,你没办法深有感触。所以说最好的学习方式就是实践。当你真正的开始带一个新人,指导一个技术团队,慢慢的这个团队你管的越来越大,慢慢的你就会有各种的体会了。那才是被你吸收的一些管理能力。书上讲的都是别人的。

我推荐这些书。我自己看过这六本书都很好。《管理的实践》、《卓有成效的管理者》、《格鲁夫给经理人的第一课》、《管理3.0:培养和提升敏捷领导力》、《领导梯队》、《成为技术领导者》前两本是德鲁克的,第三本是刚刚说的格鲁夫的,每本书的讲法都不太一样,总会学到一些不一样的见解,其中有些东西就会成为你自己的。

心得

最后讲一讲我的心得。说是心得其实就是遇到的坑,所以我弄了一个很大的坑在这里,掉了不少坑,这里给大家做一些分享。

01

不写代码

第一个坑就是你会发现没有时间写代码了。我开始的时候讲了我是2014年底开始转管理的,开始我还有一点时间写代码,但是到后面很快就没有时间写代码了。那个时候我还是幻想应该要写点代码,不能把技术丢了,我就给他们说,还是给我分点活吧,我少做点。后来我发现完全做不了,因为做管理的很多时候是做协调,做协调工作就会发现别人老是过来找你,需要和你沟通,但是程序员又是需要很长时间安静的思考的。

有个理论就是说程序员被打的一次需要 15 分钟才能接上上次的思路,我觉得是有道理的。比如你刚刚想好一个逻辑,刚刚开始写了,啪被别人打断了,那个时候就想杀人,所以大家都说程序员大家不要轻易打扰他。程序员的工作方式是需要尽量安静的思考。管理的工作特点是频繁的和人沟通。所以我那段时间就频繁的被人打断,我就只能用晚上或者周末的时间来写代码,那样又会影响整个项目的进度,后来我就完全不写代码了。

但是我还是很喜欢的写代码的, 我就用周末的时间写点 demo,看一些新技术做一些研究或者做一些分享,通过这种方式来学习。但是公司的项目代码我是完全写不了的。这是我遇到的第一个坑,尝试编写代码边做管理工作。我发现这样是不行的。

02

怀疑自己的价值

第二个坑就是迷茫,我是谁,我要做什么。管理很多时候给大家带来的价值,或者给团队带来的价值会有点虚。好像自己什么都没做,事情都是别人做的,有一段时间我有这样的担心,但是后来我发现不是这样的。因为一个团队每个人要过的开心,会遇到各种各样的问题,可能是人际关系的问题,可能是沟通方式的问题,可能是和别的组协作的问题,各种各样的问题,你能帮助他把这样的问题全部解决,让每个人都工作的很好,很开心这是很难的。

刚才我提到的《成为技术领导者》的那本书,给管理的定义就是所谓的领导者就是要创造一个环境,让每个人都开心的舒服的工作,发挥它最大的价值。所谓的管理其实就是这个样子,你看起来什么都不做。但是你一旦构建出一个团队,每个人都很舒服,很开心很高兴工作没有遇到各种问题,这其实就是你的成功,和价值。我花了很长的时间来扭转自己的观点。可能大家在刚刚开始管理的时候也会有这样的问题或者困惑。看上去你每天只是动动嘴皮子,但是里面是要花很多心思的。

03

懂向上管理

最后一个坑就是不懂的向上管理。这也是程序员本身这个职业带来的。很多时候作为一个程序员你只需要写代码,把代码写好,你不需要去和你的老大去提什么要求。涨工资有时候会提的,或者也不用提,你干的好他就给你涨了。但是当你管一个团队的时候,除非你是 CEO,就算是 CEO 也会和董事会汇报,你总是会有一个向上的管理过程,你需要像你的老大去沟通,他希望整个团队在未来主要去解决什么问题这就是一个向上管理的过程。

通过和老大的沟通,获得他对整个团队的期望和目标。也通过沟通提出你遇到的困难的和挑战,让他给你相应的资源和帮助,这个过程其实是很重要的。刚开始带一个团队很可能会忽视这样的一个过程,你可能会觉得不好意思,或者不重要,其实这是非常重要的。

在德鲁克的那本书里举过这样一个例子。他人主管写下一个目标,然后让上司写下他对主管的工作目标和期望。会发现大部人写的都是不一样的有90%不一样,这就是缺乏沟通的一个问题。如果没有一个这样向上管理的话,你可能把整个团队都给带偏了,最后老大会说我要的其实不是这个。我要的是另外一个东西。所以说一定要做好向上管理。

每隔三个月我就会找老大聊一聊未来三个月的工作目标是什么,让他看看有没有问题。最近一次沟通下来我确实发现他想的和我的不一样。然后和他聊,最终我接受了他的观点,这是一个很重要的过程。

最后我大概总结一下今天分享。开始的时候讲了成为管理者的一些好处和误区。我分享了成为管理者的三个非常基础的方法。一个是时间管理,一个是强化表达,最后一个是看一些方法论的书。如果你去看书的话还会发现各种各样的技巧和方法,我觉得那些不重要,你只要记住这几个基本的那些东西都能学会。最后我介绍了一些我遇到的一些坑期望能够指导大家,我觉得这件事情值得每一个程序员去尝试去积累自己的管理能力。

我觉得不管你最终是一个架构师还是说整个团队的管理者你都会需要这样的能力。我真心的希望在座的每个人都能在这个方面有所成长。以上就是我的分享,谢谢大家!

Q&A时间

Q您好,首先我先谢谢巧哥的分享,感觉这三百块钱花的值了。我有两个问题,一个就是现在我处的状态可能是和您5年前是一样的。在一个技术转型期。自己的技术达到了一定的程度。公司放心我去带一个小的团队,我现在手下面大概7个人。三个前端四个后端。我的问题是您是怎么放心的把工作交给其他人的呢。有些时候公司会有一些很重要的工作交给你。比如说你要跑一些运维的脚本或者是公司要一些什么的数据,但是呢,这些我熟,但是我没时间。我做的话可能2个小时能做出来。但是别人的话,可能一天都做不出来。你想把自己的工作交给别人,但是你不放心,因为涉及的东西太多了。

A怎么样把工作交给别人这个问题是很好的问题。我自己也深有感触就像我刚刚说的。别人花一天时间其实还不如你写两个小时写得好,你还需要指导别人 2 天 3 天的时间最后这个事情才能完成。

这两者有一个很大的差别,你在指导别人他是在成长的。如果你确定这个人还靠谱的话。他最终达到你的水平只是一个时间的问题。在这个过程中你需要注意怎么指导他,并且确定他不会把问题搞糟。最终大家还是要为结果负责。如果把事情搞砸肯定是不行的。指导上面我觉得还是需要尽心尽力的。尽量的让他感觉到你是期望他成长起来的。能够做的像你一样好的,他会觉得你这么放心他会有压力。

你心里还是应该有一个判断,你把事情交给他,他能不能搞定,你心里一定要由这个判读,不能说我很相信你,但是最后事情搞砸了,其实是你自己没有做好判断。就是要判读这个人到底只是需要时间指导还是说他可能就不是一个认真的人,不够负责的人的。如果他靠谱的话就只是一下技巧的问题。如果你不放心,在他最终做完的时候你去帮他做 review,还有在一些关键的问题上和他讨论。

我怎么指导一个人去做一个很难的事情。一个很难的事情我之前做过。我说这个事情交给你,你先想一想,等你有思路了过来找我,他想了有思路过来找我。有些地方想的不对的我给他指出来这些地方可能会有问题你在想想,和他都通完,我说没问题你去写吧。写完我再看一眼,看看有没有问题,有问题再改。其中的关键步骤你都加入了自己的检查,所以说他搞高不乱的,最坏的情况就是你最后看的还是发现有问题。 最后不上就行了,延期不上不会对线上有太多影响。

你指导一个新人心里一定要有把握,并且在一些关键的地方加上自己的检查。这件事情就能够放心的交给别人的了,只是说你需要再花点时间。这样的事情做几次之后就会发现,这人能行呢。后来再有困难的问题你就让他去想,然后告诉你,你就会发现该想的都想到了呢。然后说写完给我看一看,你一看写的很好没什么问题。再后来你说有思路给我讲讲就行了不用给我看代码了。再后来你就可以说遇到问题再来找我。没问题就不用找我了。慢慢的这是一个渐进的过程不是一个突然的,扔给别人,什么事情都不用管了。

Q所以说有一个问题的时候不会把解决方案告诉他。而是让他去想?

A是的不会告诉,解决问题的能力是很重要的,你要让他自己的去想,不然你交不出去的。

Q如何应对突然的打断?

A首先我回去做时间记录。我会去看看那些时间是被别人打断的。你会发现有些打断是避免不了的,比如确实是突发的必须去处理的。有些你会发现打断是可以避免的,比如说产品写完产品稿说你来看一看,你可以定一个时间就是每天的下午 5 点钟是产品的过稿时间,或者 2 周过一次。如果发现一些打断不是那么重要的话。你可以制定一些规则约束,大家知道你的规则就会按照你的规则来,毕竟你还是负责人。

Q巧哥你好我是做 iOS 开发的,我想问一下你们公司的 APP 是如何避免在开发过程中越来越大的呢。

A首先分析 APP 大的地方在哪里,我们就会把我们的程序拆解开,比如资源文件多大,程序逻辑多大,还有一些别的多大。比如说程序逻辑过大,就去看看是哪里的问题,比如打进去的无用的库,或者无用代码,再去看资源文件,图片压缩,用矢量图。比如说猿题库我们有一个公式的渲染引擎需要资源。我们就安装之后再下载。就是要根据具体看消耗在哪里,然后去对应的解决问题。完了之后再看体积缩下来多少。

Q我也是技术转管理的,就是管理上我年纪比较小我是 96 年的。有些人他感觉自己的经验很丰富,怎么和他沟通会比较好一点。我是做前端的,我说一个方案,那个同事就会按照自己的方案来。我是知道这里有坑的。

A这样我的建议是让他去尝试,遇到问了几次出现问题,发现你说的对,会对你的技术产生尊重。虽然中间可能会浪费一些实际,管理就是大家建立默契相互信任他其实就是花时间的,他当前没有对你建立信任,这就是一个管理成本。我的建议就是让他错几次。我们老大是怎么管理我们的呢,他说犯错没关系,一定要总结。我并不担心浪费一点时间。我更多的是期望团队搭建好了,之后的团队管理就会舒服很多了,所以说我会愿意花这个成本。

Q我们公司现在 10 个人。我经常发现我只能给 2,3 个人派事情。我自己也有事情做。就是这么多人我管不过来。

A核心就是我刚才讲的。你自己在写代码一样。就是你已经是 10 个人的团队了,自己的工作应该压缩一些尽量少一些。尽量交给别人来做。你团队 10 个人中间协调和沟通的工作应该会很多。你在这个上面不花时间就没人花时间了。你不沟通有些人就真的闲杂哪里了。他们就真的不知道干什么。他们也不敢过来找你,看到你很忙。对于组织来说就浪费这个资源了。管理的层级应该尽量的少。层级多了会带来沟通的效率损失 10 个人的团队应该是最舒服的,这 10 个人应该每个人都非常清楚别人做的事。都知道大家的努力方向如果你引入中间的架构效率会损失。所以就需要多沟通,给每个人派活。把你的事情分出来。

Q我怎么能确保我想要的和下面人做出来的最后的是一样的。

A程序员有些时候会误会一些产品稿,实现错了还有一些比较麻烦或者漏掉了。我们会有每天打包,程序员写完了就让产品马上下下来用用,看看有没有什么问题,如果有问题马上去找他,通过更早的发现问题来解决问题。在最终上线前设计产品和技术都会在看一遍。看看哪里有问题。并不是测试,而是简单的测试。

Q如何让团队的人知道我想要做的事情

A我主要是用 WIKI,给大家做协培训,然后录像。来了一个新人我就会让他看WIKI 和录像,在他看完之后我再和他沟通看看再这个过程中有什么问题。

Q巧哥你好。我就是前一两年看博客各种技术文章认识到您的。我目前是个 iOS 也是干了 2,3 年了,现在遇到的问题就是对技术特别的喜欢,但是产品也比较喜欢,但公司的产品和我的想法就比较大的冲突。因为我是从技术出发的。现在的情况就是有想法,但是他们不采纳。

A你要明白技术人转管理和技术人转产品这是两个事情。主要的产品还有由他们决策。产品对产品负责,技术对技术负责。这样才是正确的工作方式。大家相互尊重,信任对方。