Neo's Blog

不抽象就无法深入思考
不还原就看不到本来面目!

0%

成为一个出色的工程师,做到这几点就够了

本文我们探讨如何成为一个出色的工程师?

按照SKA模型,我的答案会分为三大块:

  • 第一,正确的态度(Attitude)或者思维方式。
    当遇到问题时,你会用什么样的态度去应对处理它?当你尝试去解决一个问题时,你又是如何思考的?
  • 第二,尽可能娴熟的必要技能(Skill)。
    当你知晓了如何去思考问题之后,我们需要借助很多技能去把问题解决。例如,沟通协作技能、编程能力、问题排查能力等。
  • 第三,尽可能完备的知识(Knowledge)体系。
    很多时候有些人知道问题的答案或者解决方案,仅仅是由于他知道一块我们不知道的知识。

态度 & 思维方式

清晰的价值观

首先,你应该明晰你的价值观,确保与领导或者公司的价值观保持一致。尝试着回答以下这些问题:
你的价值观如何? 你如何看待你现在这份工作?或者说你如何看待这份工作打给你的价值? 相对你付出的诸多成本(时间成本、各种机会成本),价值是不是足够大?

我个人对工作的看法:

  • 于私,工作给我提供了足够多的机会,去打磨我的心智(例如工作中会遇到一些挫折,我们需要应对!),去强化我的技能(例如大型合作项目,需要去跟别人协作沟通),去完善自己的知识体系(通过对工作内容的反思、总结、分享,将经验内化为知识)
  • 与公,工作是一个媒介,我通过工作给公司创造价值。我给公司带来的业务价值的多少,直接决定了公司对我的价值定位,进而决定了自己的职位与薪酬。

综上,你是否会呆在一个公司,直接取决于:公司带给我的收益 与 我付出的成本 的平衡

  • 公司能够带给我的收益:我的薪资收入(我给公司带来的价值;公司本身、行业甚至国家对公司的影响;公司管理者的员工价值观等)、无形收益(影响力、荣誉感)、工作带给我的能力提升

  • 我付出的成本:我付出的时间成本、我放弃的机会成本(新工作带给你的收益 - 跳槽的机会成本)

综上,我们可以把价值观比喻为:

  • 定海神针(你明确了自己为什么在这,明确了公司可以带给你什么,才能够不轻易为外部所动)
  • 决策价值的标尺(做决策一定会涉及到价值的考量,价值观不同的人做出的决策一定是不同的)
  • 做事目标的指北针(以终为始,做事情一定得先有目标。价值观作为目标制定的指北针,确保目标与真正有价值的目标不背道而驰)

强大的责任心

在职场很多年,你肯定遇到下面这些场景,当时的你是怎么处理这些事情的呢?

  • 当你负责的服务有告警时
  • 当你们团队的服务有告警时
  • 当别人咨询了你一个并不是你负责的模块的问题时
  • 当客服群有人反馈你所负责的业务有bug时

责任从哪里来,责任源于角色。你身处团队之中,你是团队的角色之一,所以你在你的团队中有责任。而你的责任心则直接决定了你如何看待你的责任,看待你的“份外之事”,看待超越你职责范围内的工作。

自己可能负责哪些东西:

  • 老板分配给你,让你跟进的问题、让你owner的业务项

    有始有终,借助PDCA循环把老板交代给你的问题做好。

  • 你负责的业务模块

    需要非常熟悉模块的内部细节、外部协作细节、后续迭代优化方向等;如果对自己负责的模块不是最熟悉的话,是严重不负责任的表现。

  • 你负责的业务

    除了完成PM交代给自己的业务需求外,我们还需要积极思考业务的本质、业务在公司的定位、公司在行业的定位等,主动为消费者负责、为社会负责、为业务负责,为公司负责。

能力(技术能力)与责任心谁更重要呢?

都重要。如果一个新人有培养的潜力,那么责任心就更重要。两个人,第一个技术能力很强,但责任心很差,对项目的事情也不上心;第二个能力差些,但责任心强,是自己的问题一定负责到底,即使自己不能解决也能主动询求帮助。我觉得前者对项目的危害更大,特别是项目紧要时期,因为能力强的人一般负责的是比较复杂、困难的功能,别人上手也需要时间,这个时候如果摞担子,bug也不修,那么就很为难了。

不负责任的典型表现就是扯皮、甩锅:这不是我的bug、不关我的事。有协作的地方更容易出现问题,比如前端与后端、各个部门之间。
一个有强大责任感的人,会主动承担灰色地带。如果不清楚到底是谁的问题,也会很主动的帮助排查、跟进。

强烈的好奇心

有知发现无知,无知求索真知。好奇心是“有知者”探索未知世界的原动力,是创造性人才的特质,是成为出色工程师的必要条件。

当你调试代码跟踪到框架底层的时候,你是否有动力继续深入下去,看看框架是怎么实现的?

当你听到协程有多牛B、多好用时,你是否想知道它到底应该如何实现?

当你学习操作系统学习到虚拟内存、物理内存时,你是否想去深入了解Linux可能会如何管理内存,缺页中断是怎么回事?

当你从PM那边接收到一个产品需求的时候,你会不会去思考这个需求的底层原理是什么?它是为了解决那些用户的什么问题?

如果没有好奇心的驱使,你永远只是一个普通的程序员,永远只会是一个CRUD BOY。
强烈的好奇心,会驱使你去了解事物的本质;在了解本质的路上,你有机会发现更多;了解更多的案例,获取更多的经验,归纳演绎出更多接近事物本质的知识。

出色的工程师思维

什么是工程师思维呢?在我看来,工程师思维是通过计算机来解决现实问题的一系列思维方式和方法的汇总:

  • 不安于现状,讨厌单调的重复工作

    例如每天都要执行多次的诸多命令,考虑写一个批处理脚本?

  • 经典的计算机与数据结构、算法思维

    TradeOff思想、空间换时间思想、局部性原理、COW思想、二分思想、分治思想、回溯思想等

  • 永远乐于去寻求问题的最优解

    程序代码、服务架构的极至优化

  • 从信息的角度去解决现实问题

    首先尝试用常人的思维去剖析问题,尽量触及问题的本质;然后把问题的解决抽象为信息的传递与处理。
    你的问题的了解越深入,得到的信息处理模型便更加接近“真理”,写出来的代码也更具扩展性。

高效能人士的几种思维方式

高效能人士应该有的几种思维方式:

  • 积极主动:
  • 以终为始
  • 要事第一
  • 双赢思维
  • 知彼解己
  • 统合综效
  • 不断更新

用跨界思维重新审视问题

通过前面提到的工程师思维,自然可以相对优雅地解决某一个既定问题。

但是这个问题本身合理吗?这个问题的解决会给用户或者说给社会带来多少价值呢?

要回答上面这两个问题,你就算有再出色的工程师思维都没有用,我们只有跳出某个既定的圈子(我们的工程师思维会给我们的思维圈上一个圈),从更高的层次去重新审视问题,才有可能给出比较理想的答案。

跨界思维

下面是一些我个人觉得比较重要的跨界思维,供参考:

  • 物理学思维

    每一个封闭的知识系统的结论都是在一些基础假设的基础上通过逻辑推理演绎出来的。
    我们将这个基础假设叫做这个系统的基石假设。将这种不断地刨根问题去问为什么的思考方式,称之为第一性原理思维。

  • 系统动力学思维

    “普通的人改变结果,优秀的人改变原因,顶级优秀的人改变模型。”

    洞察力:透过现象看本质、然后改变模型的能力。通过学习系统动力学,可大幅提升自己对事物的洞察力。

    在系统论中,系统 = 关键要素(又叫变量) + 要素之间的连接(又叫关系)

    变量:增量改变存量,存量改变世界

    连接:关键因果链、正反馈回路、负反馈回路、滞后效应

  • 复杂性系统思维

    熵增定律:热力学第二定律,从有序到无序。

    耗散系统:开放系统,通过与外界交换来对抗熵增。

    自组织系统:涌现

    分型系统:自相似

  • 哲学思维
    亚里士多德四因说 - 质料因:为什么事物在运动中持存;形式因:为什么事物运动具有特定的方式;动力因:为什么事物开始运动;目的因:为什么事物要运动。

    整体论 VS 还原论(组合创新的思维起点)

    归纳与演绎

    批判性思维

  • 心理学思维

    马洛斯需求模型

    诸多偏见、不理性

  • 数学思维(数学带给我们的一些启发)

    公理化思维,欧氏几何,基于5大公理,演绎出整个几何大厦

    抽象思维,从具体的数字到抽象的函数

    从特例到普遍,从标量到向量再到更具有普适性的矩阵

    本质思维,函数的本质是什么? 矩阵的本质是什么?

    极限思维,从有限到无限,从无穷大到无穷小,从最初量的变化到最终质的变化

    变化延迟效应,从加速度(距离的二阶导数)到速度(距离的一阶导数)再到距离,变化的延迟发生,事情造成影响的滞后性

    博弈思维,从零和博弈到非零和博弈,从双赢到双输

    概率思维,某种程度上概率的反直觉性;常见的概率分布模型:二项分布、正态分布、泊松分布等

  • 互联网思维

    互联网的本质:从本质上看,其实互联网并不产生实质上的经济,而它做的只是让信息更快、更便捷地流通,从而帮助实体的资源更快、更便捷地流通和兑换,减少了成本和加速资金流动。

    互联网产品的本质:核心能力是资源整合,寻找事物存在的优化空间 VS 实体产品

  • 产品思维(想象自己是一个PM)

    思考做产品要解决的根本问题:从更人性化的角度去帮助用户识别和解决问题,从而给用户创造价值。

    整合现有市场的资源(或者寻找需求)根据产品定位做好相应配套和流程优化

  • 运营思维(想象自己是一个互联网运营)

    产品运营的核心目标:告诉所有人(或目标人群)产品的价值;

    优化宣传渠道,尽量减少对用户的骚扰,在用户最需要你产品的时候看到你,想到你;

    提升产品利润和用户流量及产品的转化率;

    优化运营管理,让用户能即时反馈问题;

    减少宣传销售成本;

    了解用户使用产品中的难题,帮助提成产品的体验和品质。

    思考做运营要解决的根本问题:如何花更少的钱去做更多的事情

  • 经济学思维(想象自己是一个理性经济人)

    成本与收益思维,ROI投产比

    成本思维,考虑成本时考虑要额外考虑时间成本、机会成本

    如何看待效率与公平

    优势与分工

  • 金融思维(想象自己是一个银行家或者投资人)

    借债产生利息,导致破产轻松 VS 技术债导致维护成本,导致重构

    储蓄产生资本积累,导致增长 VS 定期进行重要的技术重构

  • 商业思维(想象自己是一个企业家)

    企业的护城河 VS 个体或者团队的不可替代性

技能

这里我把技能分为两大类:通用技能、专业技能

先说工程师的专业技能

  • 需求的理解与编码实现能力

    1. 深入理解需求,梳理出需求涉及到的存储与外部交互方
    2. 输出数据流图,搞清楚数据流与信息流的流向
    3. 以存储为中心,对系统进行模块划分,如有必要引入缓存、分库分表、异步等性能优化手段
    4. 编码实现
  • 问题排查能力:当自己的负责的业务出现问题(用户反馈,或者有监控告警)时,有能力尽快对问题进行止损、排查定位、修复

    1. 掌握必要的知识:操作系统提供了哪些工具,这些工具分别可以用来定位哪一类问题?
    2. 掌握必要的知识:问题根本原因的分类:代码逻辑bug、IO异常(容量不足、硬件故障?)
    3. 优先考虑回滚止损(是否新发布了代码、上游流量是否有增加、下游依赖吞吐量是否发生变化等)
    4. 借助日志、抓包等工具,对问题的发生范围进行二分定位(上游、服务本身、下游)
    5. 重复步骤4),直到定位到问题的根因,然后问题修复(扩容、修复逻辑bug、更换硬件等)
    6. 事后问题复盘
  • 优秀的编码能力&编码习惯:高性能、可扩展好、可维护性强

    1. 带着工程师思维去编码(代码的本质在于:它对信息进行加工,这里的加工包括:反序列化、追加额外的信息、信息格式转换、删除额外的信息、把信息通过容器管理起来、序列化)
    2. 建立公司、团队统一的编码规范
    3. 掌握必要的知识:设计模式、面向对象编程、表格式编程等
    4. 结对编程,用更高的标准去互相review,相互提高
    5. 两点认知:一般情况下,代码越少,便越容易理解。当代码可理解性与代码性能有冲突时,一般情况下,选择可理解性;底层高频代码除外。
  • 架构设计能力

    1. 微观上,去学习一些底层系统的设计思路,例如操作系统、数据库、Redis、MC、Nginx等
    2. 宏观上,去了解更多的分布式海量系统设计思路,例如搜索、Feed、Hadoop、分布式存储、评论系统、ID生成器等
    3. 借助项目给予自己的机会去练习、实践上面学到的设计技巧

然后再说说普通工程师的通用技能

  • 沟通表达能力

    沟通的本质:建立你与待沟通对象的沟通通道,把需要沟通的内容传递给对方(并影响对方),从而达到自己的沟通的目的

  • 团队协作能力

    对于普通个体而言,团队协作的能力一般表现为与团队内其他个体的沟通表达能力

    区分事实与观点

  • 快速学习能力

    库博学习圈:从行动归纳出经验,从经验升华为规律,用规律来指导行动。

  • 时间管理能力

    紧急重要四象限、收益影响四象限

  • 事项管理能力

    Get Things Done: 事务的收集、处理、回顾

最后说说核心/骨干工程师需要的通用技能

  • 跨团队协作能力

    同理心、影响力、双赢思维

  • 谈判能力

    在公司内部,更多的需要的是团队协作能力

  • 目标管理能力

    OKR对组织目标进行拆解、SMART原则、KPI量化指标

  • 演讲能力,不是你在讲,而是他在听

    1. 按照人的思考线索,而不是知识的树状结构来演讲
    2. 无可否认的事实 + 无可辩驳的逻辑
    3. 用幽默感,让认知的路上满是风景

知识

这里提到的知识,我们也分为两类:前人总结的知识、自己沉淀总结的知识

  • 前人总结的知识

    前人总结的知识,可以参考个人博客

    为什么需要学习那么多的知识呢?知识变来变去,但万变不离其宗。系统设计时,确实是有很多套路可循的。这些套路就出自前人之手。

  • 自己沉淀总结的知识

    1. 首先你需要有一种意识:我对之前那种低效的重复工作厌倦了,我想要提升效率。我相信其他人肯定也会有这种诉求。
    2. 你需要准确的去描述你要去解决的问题(抽象问题本质的能力)
    3. 借助搜索引擎去检索自己的问题
    4. 总结,内化成自己的知识经验
    5. 分享给大家
你的支持是我坚持的最大动力!