何为技术领导力
技术领导力的体现
尊重技术,追求核心基础技术;
追逐自动化的高效率工具和技术,同时避免无效率的组织架构和管理;
解放生产力,追逐人效的提高;
开发抽象和高质量的可以重用的技术组件;
坚持高于社会主流的技术标准和要求。
拥有技术领导力的软件工程师
能够发现问题;
能够提供解决问题的思路和方案,并能比较这些方案的优缺点;
能够做出正确的技术决定;
能够用更优雅、更简单、更容易的方式来解决问题;
能够提高代码或软件的扩展性、重用性和可维护性;
能够用正确的方式管理团队;
创新能力。
总是在提供解决问题的思路和方案的人才是有技术领导力的人。
软件工程师如何拥有技术领导力?
扎实的基础技术;
非同一般的学习能力;
坚持做正确的事;
不断提高对自己的要求标准。
如何拥有技术领导力
吃透基础技术。
基础技术是各种上层技术共同的基础。吃透基础技术是为了更好地理解程序的运行原理,并基于这些基础技术进化出更优化的产品。
编程部分
- C 语言:相对于很多其他高级语言来说,C 语言更接近底层。在具备跨平台能力的前提下,它可以比较容易地被人工翻译成相应的汇编代码。它的内存管理很直接,让程序员直接和内存地址打交道。
- 编程范式:各种编程语言都有它们各自的编程范式,用于解决各种问题。比如面向对象编程(C++、Java)、泛型编程(C++、Go、C#)、函数式编程(JavaScript、 Python、Lisp、Haskell、Erlang)等。
算法和数据结构:算法(及其相应的数据结构)是程序设计的有力支撑。适当地应用算法,可以有效地抽象问题,提高程序的合理性和执行效率。算法是编程中最最重要的东西,也是计算机科学中最重要的东西。
系统部分
计算机系统原理:CPU 的体系结构(指令集 [CISC/RISC]、分支预测、缓存结构、总线、DMA、中断、陷阱、多任务、虚拟内存、虚拟化等),内存的原理与性能特点(SRAM、DRAM、DDR-SDRAM 等),磁盘的原理(机械硬盘 [盘面、磁头臂、磁头、启停区、寻道等]、固态硬盘 [页映射、块的合并与回收算法、TRIM 指令等]),GPU 的原理等。
- 操作系统原理和基础:进程、进程管理、线程、线程调度、多核的缓存一致性、信号量、物理内存管理、虚拟内存管理、内存分配、文件系统、磁盘管理等。
网络基础:计算机网络是现代计算机不可或缺的一部分。需要了解基本的网络层次结构(ISO/OSI 模型、TCP/IP 协议栈),包括物理层、数据链路层(包含错误重发机制)、网络层(包含路由机制)、传输层(包含连接保持机制)、会话层、表示层、应用层(在 TCP/IP 协议栈里,这三层可以并为一层)。
比如,底层的 ARP 协议、中间的 TCP/UDP 协议,以及高层的 HTTP 协议。这里推荐书籍《TCP/IP 详解》,学习这些基础的网络协议,可以为我们的高维分布式架构中的一些技术问题提供很多的技术方案。比如:TCP 的滑动窗口限流,完全可以用于分布式服务中的限流方案。
数据库原理:数据库管理系统是管理数据库的利器。通常操作系统提供文件系统来管理文件数据,而文件比较适合保存连续的信息,如一篇文章、一个图片等。但有时需要保存一个名字等较短的信息。如果单个文件只保存名字这样的几个字节的信息的话,会浪费大量的磁盘空间,而且无法方便地查询(除非使用索引服务)。
分布式技术架构:数据库和应用程序服务器在应对互联网上数以亿计的访问量的时候,需要能进行横向扩展,才能提供足够的性能。为了做到这一点,要学习分布式技术架构,包括负载均衡、DNS 解析、多子域名、无状态应用层、缓存层、数据库分片、容错和恢复机制、Paxos、Map/Reduce 操作、分布式 SQL 数据库一致性(以 Google Cloud Spanner 为代表)等知识点。
提高学习能力
所谓学习能力,就是能够很快地学习新技术,又能在关键技术上深入的能力。只有在掌握了上述的基础原理之上,你才能拥有好的学习能力。
学习的信息源。信息源很重要,有好的信息源就可以更快速地获取有价值的信息,极大提升学习效率。常见的信息源有:Google 等搜索引擎,Stack Overflow、Quora 等社区,图书,API 文档,论文和博客等。
- 与高手交流。程序员可以通过技术社区以及参加技术会议与高手交流,也可以通过参加开源项目来和高手切磋。常闻“听君一席话,胜读十年书”便是如此。与高手交流对程序员的学习和成长很有益处,不仅有助于了解热门的技术方向及关键的技术点,更可以通过观察和学习高手的技术思维及解决问题的方式,提高自己的技术前瞻性和技术决策力。
- 举一反三的思考。比如,了解了操作系统的缓存和网页缓存以后,思考其相同点和不同点。了解了 C++ 语言的面向对象特性以后,思考 Java 面向对象的相同点和不同点。遇到故障的时候,举一反三,把同类问题一次性地处理掉。
- 不怕困难的态度。遇到难点,有时不花一番力气,是不可能突破的。此时如果没有不怕困难的态度,就容易打退堂鼓。但如果能坚持住,多思考,多下功夫,往往就能找到出路。绝大多数人是害怕困难的,所以,如果你能够不怕困难,并可以找到解决困难的方法和路径,时间一长,你就能拥有别人所不能拥有的能力。
开放的心态。实现一个目的通常有多种办法。带有开放的心态,不拘泥于一个平台、一种语言,往往能带来更多思考,也能得到更好的结果。而且,能在不同的方法和方案间做比较,比较它们的优缺点,那么你会知道在什么样的场景下用什么样的方案,你就会比一般人能够有更全面和更完整的思路。
坚持做正确的事
做正确的事,比用正确的方式做事更重要,因为这样才始终会向目的地靠拢。
提高效率的事。学习和掌握良好的时间管理方式,管理好自己的时间,能显著提高自己的效率。
- 自动化的事。程序员要充分利用自己的职业特质,当看见有可以自动化的步骤时,编写程序来自动化操作,可以显著提高效率。
- 掌握前沿技术的事。掌握前沿的技术,有利于拓展自己的眼界,也有利于找到更好的工作。需要注意的是,有些技术虽然当下很火,但未必前沿,而是因为它比较易学易用,或者性价比高。由于学习一门技术需要花费不少时间,应该选择自己最感兴趣的,有的放矢地去学习。
- 知识密集型的事。知识密集型是相对于劳动密集型来说的。基本上,劳动密集型的事都能通过程序和机器来完成,而知识密集型的事却仍需要人来完成,所以人的价值就在此时体现了。虽然现在人工智能似乎能做一些知识密集型的事(包括下围棋的 AlphaGo),但是在开放领域中相对于人的智能来说还是相去甚远。掌握了领域知识的人的价值依然很高。
技术驱动的事。不仅是指用程序驱动的事,而且包括一切技术改变生活的事。比如自动驾驶、火星登陆等。就算自己一时用不着,也要了解这些,以便将来这些技术来临时能适应这些新技术。
高标准要求自己
只有不断地提高标准 ,你才可能越走越高,所以,要以高标准要求自己,不断地反思、总结和审视自己,才能够提升自己。
Google 的自我评分卡。我们可以参考 Google 的这个评分卡来给自己做评估,并通过它来不断地提高对自己的要求。
- 敏锐的技术嗅觉。这是一个相对综合的能力,你需要充分利用信息源,GET 到新的技术动态,并通过参与技术社区的讨论,丰富自己了解技术的角度。思考一下是否是自己感兴趣的,能解决哪些实际问题,以及其背后的原因,新技术也好,旧有技术的重大版本变化也罢。
- 强调实践,学以致用。学习知识,一定要实际用一用,可以是工作中的项目,也可以是自己的项目,不仅有利于吸收理解,更有利于深入到技术的本质。并可以与现有技术对比一下,同样的问题,用新技术解决有什么不同,带来了哪些优势,还有哪些有待改进的地方。
Lead by Example。永远在编程。不写代码,你就对技术细节不敏感,你无法做出可以实践的技术决定和方案。
如何成为一个大家愿意追随的Leader?
Boss 是驱动员工,Leader 是指导员工。在面对事情或是项目的时候,Boss 制定时间计划,并且推动(push)和鞭策员工完成工作,而 Leader 则是和员工一起讨论工作细节,指导员工关注工作的重点,和员工一起规划出(work out)工作的方向和计划,并且在工作中和员工一起解决细节难题,帮助员工完成工作。
- Boss 制造畏惧,Leader 制造热情。Boss 在工作中是用工作职位级别压人,用你的绩效考核来制造威慑,让员工畏惧他,从而推行工作。而 Leader 在工作中通过描绘远景,制造激动人心的目标来鼓舞和触发团队的热情和斗志。
- Boss 面对错误喜欢使用人事惩罚的手段,而 Leader 面对错误喜欢寻找解决问题的技术或管理方法。惩罚员工和解决问题完全是两码事,Boss 因为并不懂技术也并不懂问题的细节,所以他们只能使用惩罚这样的手段,而 Leader 通常是喜欢解决问题的技术型人才,所以,他们会深入技术细节,从技术上找到既治标又治本的解决问题的技术方案或管理方式。
- Boss 只是知道怎么做,而 Leader 则是展示怎么做。一个好 Leader 的最大特点就是 Lead by Example,以身作则,用身教而不是言教。而 Boss 只是在说教,总是在大道理上说的一套又一套的,而从来不管技术细节。
- Boss 是用人,而 Leader 是发展人。Boss 不关心人的发展,把人当成劳动力。而 Leader 则会看到人的潜力和特长,通过授权、指导和给员工制定成长计划让员工成长,从而发展员工。所以,我们通常可以看到 Boss 总是说自己的员工有这个问题有哪个问题,而 Leader 总是说,如何让员工成长以解决员工个人的各种问题。
- Boss 从团队收割成绩,而 Leader 则是给予团队成绩。Boss 通常都会把团队的成绩占为己有,虽然 Boss 会说这是团队的功劳,但基本上是一句带过。而 Leader 则是让团队成功,让团队的成员站在台前,自己甘当绿叶和铺路石。Leader 知道只有团队的每个人成功了,团队才会成功,所以,Leader 会帮助团队中的每个人更好更流畅地走向成功。
- Boss 喜欢命令和控制( Command + Control ),而 Leader 喜欢沟通和协作( Communication + Cooperation )。Boss 喜欢通过命令来控制员工的行为,从而达到团队的运转,而 Leader 喜欢通过沟通和协作来增加员工的参与感,从而让员工觉得这是自己的事,愿意为之付出。
Boss 喜欢说“给我上”,而 Leader 喜欢说“跟我上”。Boss 总是躲在团队后面,让团队冲锋陷阵,而 Leader 总是冲在前面用自己的行动领着团队浴血奋战。
如何成为众人愿意追随的 Leader
帮人解问题。团队或身边大多数人都在问:“这个问题怎么办?”,而总是你能站出来告诉大家该怎么办。
- 被人所依赖。团队或身边大多数人在做比较关键的决定时,都会来找你咨询意见和想法。
- 赢得他人的信任。信任是人类一切活动的基础,人与人之间的关系是否好,完全都是基于信任的。对于信任来说,并不完全是别人相信你能做到某个事,还有别人愿意向你打开心扉,和你说他心里面最柔软的东西。而后者才是真正的信任。这还需要你的人格魅力,你的真诚,你的可信,你的价值观和你的情怀等一些诸多因素,才会让别人愿意找你分享心中的想法和情绪。
- 开放的心态 + 倾向性的价值观。我可以听进各种不同观点,并在讨论中根据自己的价值观对不同的观点做出相应的判断,而并不是不加判断全部采用。因为如果你要做一个 Leader,你需要有明确的方向和观点,而不是说一些放之四海皆准的完全正确的废话。我的经验告诉我,对于各种各样的技术都要持一种比较开放的态度,可以讨论优缺点,但不会争个是非对错,尤其对于新技术来说,更要开放。然而,就价值观来说,还是需要有倾向性的,比如,我就倾向于不加班的文化,倾向于全栈,倾向于按职责分工而不是按技能分工,倾向于做一个 Leader 而不是 Boss,倾向于技术是第一生产力,倾向于 OKR 而不是 KPI……我的这些倾向性可以让别人更清楚地明确我是一个什么样的人,而不会对我琢磨不透,一会东一会西只会让人觉得你太油了,反而会产生距离感和厌恶感。我认为,倾向性的价值观是别人是否可以跟随你的一个基础。
- Lead by Example。用自己的示例来 Lead,用自己的行为来向大家展示你的 Leadership。这就是说,你需要给大家做示范。很多时候,道理人人都知道,但未必人人都会做,知易行难,以身示范,一个示例会比讲一万遍道理都管用。对于软件开发来说,不写代码的架构师是根本不靠谱的。所以,要做一个有人跟随的技术 Leader,你需要终身写代码,也就是所谓的 ABC – Always Be Coding。这样,你会得到更多的实际经验,能够非常明白一个技术方案的优缺点,实现复杂度,知道什么是 Best Practice,你的方案才会更具执行力和实践性。当有了执行力,你就会获得更多的成就,而这些成就会让更多的人来跟随你。
- 保持热情和冲劲。作为一个 Leader 无论在什么情况下,你都需要保持热情和冲劲,只有这样,你才会让别人有跟随的想法和冲动。 但是,所谓的保持热情和冲劲,并不是自欺欺人,也不是文过饰非,因为掩耳盗铃、掩盖问题,强颜欢笑的方式根本不是热情。真正的热情和冲劲是,正视问题,正视不足,正视错误,从中进行反思和总结得到更好的解决方案,不怕困难,迎刃而上。
- 能够抓住重点,看透事物的本质。作为一个 Leader,能够抓住主要矛盾,看清事物的本质,给出清楚无二义的观点或方向,简化复杂的事情,授道解惑、开启民智,让人豁然开朗、醍醐灌顶,才会让人追随之。
- 描绘令人激动的方向,提供令人向住的环境。我相信,我们每个人心中都有激动和理想,就算是被现实摧残得最凶残的人,他们已经忘却了心中那些曾经的激动和理想,但我相信也只是暂时的。一个好的 Leader 一定会把每个人心中最真善美的东西呼唤出来,并且还能让人相信这是有机会有可能做到的。
- 甘当铺路石,为他人创造机会。别人愿意跟随你,愿意和你共事,有一部分原因是你能够给别人带来更多的可能性和机会,别人觉得和你在一起能够成长,能够进步,你能够带着大家到达更高的地方。帮助别人其实就是帮助自己,成就他人其实也是在成就自己。作为一个好的 Leader,你一定要在团队中创造好这样的文化和风气。
时间管理:同扭曲时间的事儿抗争
主动管理
如果你发现你的时间老是被别人打断,那么你就要告诉大家,我什么时间段在做什么事,请大家不要打扰我。你要主动管理的不是你的时间,而是管理你的同事,管理你的信息。
学会说“不”
我不能说不,但是我要有条件地说是。而且,我要把你给我的压力再反过来还给你,看似我给了需求方选择,实际上,我掌握了主动。
- 当你面对做不到的需求时,你不要说这个需求做不到。尤其是,你不要马上说做不到,你要先想一下,这样让别人觉得你是想做的,但是,在认真思考过后,你觉得做不到,并且给出一个你觉得做得到的方案。这里的诀窍是——给出另一个你可以做到的方案,而不是把对方的方案直接回绝掉。
- 当你面对过于复杂的需求时,你不要说不。你要反问一下,为什么要这样做?这样做的目的是什么?当了解完目的以后,你可以给出一个自己的方案,或是和对方讨论一个性价比更好的方案。你可以回复说,这个需求好复杂,我们能不能先干这个,再做那个,这样会更经济一些。这里的诀窍是——我不说我不能完全满足你,但我说我可以部分满足你。
- 当你面对时间完全不够的需求时,你也不要说不。既然对方把压力给你,你要想办法把这个压力还回去,或是让对方来和你一同分担这个压力。
a. 我可以加班加点完成,但是我不保证好的质量,有 bug 你得认,而且事后你要给我 1 个月的时间还债。b. 我可以加班加点,还能保证质量,但我没办法完成这么多需求,能不能减少一些?c. 我可以保质保量地完成所有的需求,但是,能不能多给我 2 周时间?
加班和开会
开会,不是讨论问题,而是讨论方案,开会不是要有议题,而是要有议案。
时间管理:投资赚取时间
投资自己的时间
花时间在解放自己的事上是最有意义的了。
- 花时间学习基础知识,花时间读文档。其实只要把基础打扎实,认真读一下文档,你会省出很多很多的时间。系统地学习一门技术是非常关键的,所以这个时间是值得投资的。
- 花时间在解放自己生产力的事上。在自动化、可配置、可重用、可扩展上要多花时间。对于软件开发来说,能自动化的事,就算多花点时间也要自动化,因为下次就不用花时间了。让自己的软件模块可以更灵活地配置和扩展,这样如果有需求变更或是有新需求的时候,可以不用改代码,就算要改代码也很容易。
- 花时间在让自己成长的事上。注意,晋升并不代表成长,成长不应该只看在一个公司内,而是要看在行业内,在行业内的成长才是真正的成长。所以,把时间花在能让自己成长,能让自己有更强的竞争力,能让自己有更大的视野,能让自己有更多可能性的事情上。这样的时间投资才是有价值的。
- 花时间在建立高效的环境上。我相信你和我会有一样的一个习惯,那就“工欲善其事,必先利其器”。我们程序员在做事之前都喜欢把自己的工作环境整理到自己喜欢的状态下。比如使用趁手的开发工具,使用趁手的设备。
规划自己的时间
定义好优先级。有 to-do list 并不是什么高深的事。更重要的是,你要知道什么事是重要的,什么事是紧急的,什么事重要但不紧急,什么事又重要又紧急。这有利于你划分优先级。
最短作业优先。先把可以快速做完的事做完,看到 to-do list 上划掉一个任务,看到任何的数据在减少,对于自己也好,对于老板也好。
想清楚再做。先看看有没有已有的成熟解决方案,或是找更牛的人来给你把把关,帮你出出主意,看看有没有更好、更简单的方式。
关注长期利益规划。宁可在短期延期,也不要透支未来。
你要学会规划自己的行动计划,不是短期的,而是一个中长期的。我个人建议是按季度来规划,这个季度做什么,达到什么目标,一年往前走四步,而不是只考虑眼下。用好自己的时间
将军赶路不追小兔。要学会过滤掉与自己目标无关的事,不要让那些无关的事控制自己。不与不如自己的人争论,也不要尝试花时间去叫醒那些装睡的人,这些都是非常浪费时间的事。多花时间在有产出的事上,少花时间在说服别人的事上。
形成习惯。再好的方法,如果没有形成习惯,不能在实际的工作和生活中解决实际问题,都将成为空谈。
形成正反馈。要有正反馈,也就是成就感,有助于完成一些看似难以完成的事儿。
反思和举一反三。本周做了哪些事儿?时间安排是否合理?还有哪些可以优化提高的地方?下周的主要任务是什么?并根据优先级规划一下完成这些任务的顺序,也就是做一些下周的工作规划。