不少人都把管理和技术当作两件对立的事。他们看上去是如此的不同,但是当我抽象出好的管理和好的技术的特点之后,竟然发现他们本质上其实是一回事。

编程,其实就是一个资源管理的问题。资源有计算(CPU),IO, 内存,网络,以及时间。程序员要精打细算,就跟大妈去市场买菜一样,每一个小地方都要纠结好久。假如一个算法跑起来好慢,是不是可以预算一些数据放在内存里,这就是时间和内存的取舍。一个多线程程序因为有锁跑起来不够想像中的快,是不是可以改成无锁算法,这就是时间和CPU的取舍(无锁程序一般会占用更多的CPU资源)。寄存器访问时间是1个cycle,L1 Cache的访问是3个,L2 访问是14个,主存是250个,所以必要时得跑一跑Intel VTune来看一下各级缓存使用情况如何,然后重新组织代码,使得尽可能多得访问更快的缓存。算法和数据结构是思考问题时的接口,而这些资源是编程时的接口。

管理,其实也是一样的。经理手头的资源有工程师,钱,人脉等等等等。不得不说经理的资源太多,需要良好的抽象能力。假如发现两个工程师之间很有默契,办事效率很高,那就把他们安排在一个办公室,做同一个项目,这样就降低了沟通成本,提高了Cache locality。假如发现一个工程师同时在做好几个项目,是不是可以把一些不相关的任务分给另一个工程师,这就是并行的思想。每次开会都做会议记录,项目结束时分析总结哪些地方可以改进,这就是程序优化的典型套路,先收集Profile,然后优化。所以管理的套路就是,抽象出资源接口,然后用各种策略,优化整体项目的资源,控制进度。对于一个理解了编程本质的工程师,其实很多思想都可以应用到项目管理中。

当然我说的都是他们相通的部分,管理和技术还是有很多细节上的不同。不过对于扯淡,那都不重要。