高效工程师的七个习惯

原文

我曾与一些杰出的工程师共事过 – 在诸如 FAANG 的大公司,也在初创规模的小公司。他们让我看到,传说中的「10 倍」工程师,真实存在!

如今,这些工程师中,有些人后来创办了自己的公司,他们领导的变革改变了我们对网络的认识(比如 Vercel!);有些人成长为了大型科技公司数十亿美元项目的领导者。

与他们合作时,我发现他们编写代码有一些共同的习惯。

(一)为人编程,而非为电脑编程

“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.”
(笨蛋也能写让计算机理解的程序;而优秀的程序员写的是人能理解的程序。)
Martin Fowler

编程不只是为电脑,更是为了人。

编程是为了团队的工程师,阅读、维护你的代码,并在此基础上创造的那群人。

编程是为了用户,不论是一个玩手机的小孩、一个调用你 API 的开发者,还是你自己。

在这里插入图片描述

我认识的最优秀的工程师都具有产品思维:优先考虑为人解决问题。

他们总是会评估代码对所有用户的价值。哪怕漏掉了一个受众,代码也不会投入生产。

(二)从代码本身解放出来

好的的工程师不拘泥于代码本身。

如果最终结果整体上会更好,他们会毫不犹豫地删除代码并重新开始,即使已经完成了 90%。

代码不是个人的,因此反馈意见也会被认真对待。

代码并不完美。没人在乎完美的代码,而应该在乎能带来改变的代码。

让自己学会不依赖于代码的最好方法就是认识到,20 年后,你的大部分代码很有可能会成为技术债务、被废弃或重写

在这里插入图片描述

(三)采用统一的标准

在编写代码时,要坚持统一的标准和风格。一致性能让你和团队更容易阅读和理解代码、让代码库更容易扩展。这也是 Meta 和谷歌等公司发布大量代码时,代码库不会随着时间推移变得无法阅读和维护的原因。

我认识的每一位优秀的工程师都将团队的代码标准内化于心,并尽可能严格遵守,因为他们深知这样做的好处

  • 谷歌有一个易读的流程,来保持代码的简洁。
  • 谷歌已经开源了一些代码风格。
  • Meta 为其部分开源代码作了 C++ 风格规定。

花时间为团队规定一个代码风格,绝对值得

在这里插入图片描述

(四)写简洁的代码

我认识的每一位优秀的工程师所编写的代码,编写过程可能很复杂,最终却很容易阅读和理解。

他们的代码非常美观,简洁、有条理、合乎逻辑;其中的每个决定都是合理的,有不合理之处也会很好地记录下来。

编写简洁代码的好方法是遵循一些原则,比如 SOLID 原则。这些原则最初是为 OOP(面向对象编程)设计的,但它们可以扩展到一般的编程中:

  • S - 单一职责 Single-responsibility principle (SRP):
    一个类只负责一个功能。
  • O - 开放封闭 Open–closed principle (OCP):
    软件对象(类、模块等)应对扩展开放,但对修改封闭,从而实现代码可预测、可维护。
  • L - 里氏替换 Liskov substitution principle (LSP):
    子类必须可替换为其基类,而不影响程序的正确性。
  • I - 接口隔离 Interface segregation principle (ISP):
    接口不应该强制接入冗余功能。因此,使用很多个客户端特定的接口,优于使用一个多用途接口。
  • D - 依赖倒置 Dependency inversion principle (DIP):
    类都应该依赖接口和抽象类,而不是具体的类和函数。

命名就是一个例子。好的命名有助于清晰地区分:有描述性的函数名和易于理解的变量,且不含有奇怪的数值。

(五)不允许意外发生

代码不应产生意外。这可以通过遵循代码原则和编写适当的测试实现。

好的代码是可预测的

测试能提高代码的清晰度和可预测性,提供信心。良好的自动测试允许团队修改代码,而不必担心潜在的破坏。

在这里插入图片描述

一些测试的例子:

  • 针对单个组件和独立功能的单元测试
  • 针对多个组件之间交互的集成测试
  • 从用户角度评估整个系统功能的端到端测试

测试应该简洁,且在报错时易于追溯错因

知道什么不能测试,也很重要

例如,如果端到端测试的工作量超过了程序的实际效益,那么测试就应该被周到的文档记录、监控和向合适的人(如代码所有者)发出警报所取代。

测试不应过于拘泥细节。例如前端代码中的 CSS 选择器,或数据属性乃至截图等,显然就不必测试了。

(六)经常交流

任何伟大的系统都不是独自建成的。优秀的工程师都要经历设计评审、征求反馈意见,并不断迭代他们的初始设计代码。

每个人都有自己的知识空白,可以由其他人来填补。新的视角往往可以让代码更加清晰,或提供新的方法思路。

最优秀的工程师既善于沟通,又善于合作。他们不惜花时间合作,只为最终获得更好的结果。

合作可以简单到,呼叫同伴快速审核文档,或为重要的 PR 额外增加代码审核人员。

在这里插入图片描述

(七)写得快…也要写得慢

我认识的优秀工程师迅速完成的项目是…慢慢写出来的。

听起来很奇怪?

上述习惯都会增加第一遍编码的耗时,但它们能帮助工程师推进项目。花时间遵循标准和原则、正确测试、经常沟通,长远来看,反倒节省更多时间

我个人做实习生和初级工程师时就有过这样的经历,相信很多人也有:匆忙前进三步,遇到阻碍,然后不得不后退五步。

在这里插入图片描述

最后 – 不要盲目遵循这些规则

以上的「规则」只是抛砖引玉。

并非所有事情都能整齐地纳入某套规则。有时,你在写的代码是个方形,无法融入那个圆形;这没关系。

在这里插入图片描述

这种时候,一定要记录以另一种方式编写代码的原因。否则,将来有人(比如未来的你)看到这些代码就会想:「真笨,这为什么不符合标准?」

然后,他们花上 20 小时重新编码,使之符合标准,却得出和以前一样的结论。耳熟吧?

软件开发的现实情况是,并非所有代码都能做到干净整洁或完全遵循规则。但代码可以是一致的、干净的、可理解的、可测试的和有价值的


💡 更多资讯,请关注 Bytebase 公号:Bytebase

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1543537.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

kmp快速匹配

用处:对于一个较长的字符串A,判断A中是否存在字符串B。 思路: 暴力的做法是从A的每个元素开始,依次比较看是否有和B相同的子串,时间复杂度是o(N*N) 优化思路是对于每次查找完成以后&#xff…

springboot+vue宠物医院挂号看病诊断系统 f9h46

目录 宠物主人宠物医生系统管理人员系统实现截图技术介绍核心代码部分展示详细视频演示源码获取 宠物主人 登录注册:注册账户并登录系统。 首页:显示系统基本信息和用户导向功能。 个人中心:更新个人信息,包括联系方式、密码等。…

【AI创作组】工程方向的硕士研究生学习Matlab的路径

1. MATLAB软件概述 1.1 MATLAB发展历程 MATLAB自20世纪70年代诞生以来,已经经历了多次重要的版本更新和功能扩展。 初始版本:MATLAB的前身只是一个简单的交互式矩阵计算器,由Cleve B. Moler博士在1970年代初期开发,目的是为了方便学生和研究人员使用线性代数软件包LINPAC…

农业与植物基因组分析专家—优青博导提供从实验设计、数据分析到SCI论文咨询的一站式服务。多年经验,精准高效,为农业科研保驾护航!

🌟 教授团队领衔,全方位服务! 🚀 从实验设计到论文发表,一站式解决方案! 📈 选择我们,加速您的科研进程,让成果不再等待! 📝 专业分析 定制服…

ubuntu安装gitlab-runner

目录 1.添加gitlab 仓库地址 ​编辑2. 安装gitlab-runner命令 1.添加gitlab 仓库地址 curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash2. 安装gitlab-runner命令 sudo apt-get install -y gitlab-ru…

Python3爬虫教程-HTTP基本原理

HTTP基本原理 1,URL组成部分详解2,HTTP和HTTPS3,HTTP请求过程4,请求(Request)请求方法(Request Method)请求的网址(Request URL)请求头(Request H…

招联金融内推(深圳武汉大量招后端、算法)---2025秋招内推

【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

HubSpot一站式增长平台,让获客变得超简单

在这片浩瀚的商业海洋中,每一位企业家都是一位勇敢的航海家,驾驶着自己的船只,追逐着心中的梦想与远方。然而,风浪无情,竞争激烈,如何才能确保你的航程既平稳又快速?HubSpot,正是那位…

宠物去浮毛救星?希喂、小米、霍尼韦尔宠物空气净化器哪款好用

怎么有人放假也不开心? 快到的国庆假期真是愁死我了...本来我妈国庆去旅游,我就打算不回家,和我家猫过二人世界。结果突然有事,我妈取消出行,改成让我假期回家陪她。我回家容易,我家猫回去可难啊&#xff…

【C++】拆分详解 - string类

文章目录 一、为什么学习string类?二、标准库中的string类  1. 定义  2. 常用接口说明     2.1 构造     2.2 容量操作     2.3 访问及遍历操作     2.4 修改操作     2.5 非成员函数 三、OJ练习自测  [1. 仅仅反转字母](https://leetcod…

基于DeepFace深度学习模型的离线版人脸识别API接口实现(类似百度在线API接口)

一 背景 人脸识别技术经过数年的发展,在技术算法、识别性能、应用场景以及隐私保护和数据安全等方面都取得了显著的进步和成熟。 应用场景 门禁系统: 在门禁系统中,离线人脸识别可用于身份验证,用户只需站在摄像头前&#xff0…

明明没违规,应用还是被判恶意软件?可能是这些原因

作为Google Play上架应用的开发者,大家的普遍感受:比起写代码,上架的过程简直更让人心力交瘁!特别是涉及用户数据和隐私保护的时候,稍有疏忽,就可能面临应用被下架、甚至账号被封的风险。 最近听到很多开发…

FPGA随记——VIVADO中ASYNC_REG指令

参考文章:Vivado综合属性系列一、ASYNC_REG_asyncregtrue-CSDN博客 -很棒棒的 跨时钟域设计(CDC)是个老生常谈的问题,其场景很多很杂,其中一个比较为人熟知的就是单bit信号从慢时钟到快时钟所采用的两级寄存器处理的…

一种求解城市场景下无人机三维路径规划的高维多目标优化算法,MATLAB代码

在城市环境下进行无人机三维路径规划时,需要考虑的因素包括高楼、障碍物、飞行安全和效率等。为了解决这些问题,研究者们提出了多种算法,包括基于智能优化算法的方法。 首先,无人机航迹规划问题的数学模型需要考虑无人机的基本约…

Spring Boot集成Redis Search快速入门Demo

1.什么是Redis Search? RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。通过 RedisSearch,可以为 Redis 中的数据创建索引,执行复杂的搜索查询,并实现高级功能,如自动完…

【第十二周】李宏毅机器学习笔记10:生成式对抗网络2

目录 摘要Abstract1.GAN is Still Challenging2.Evaluation of Generation2.1 Mode Collapse2.2.Mode Dropping2.3.Diversity 3.Conditional GAN4.Learning from Unpaired Data总结 摘要 本周主要学习了上周关于生成式对抗网络的剩余知识,了解了为什么 GAN 难以训练…

【数字】flexnoc Qos配置

对于Qos_generator 的regulator模式来说可以配置的寄存器如下表: 因为我们没有使用external的clk来做count,也没有使用外部的threshold,所以都是使用的internal的时钟。 根据文档讲解的概念Bandwidth设置为下: Urgency使用来源如…

Nat Med.作者提供全文的绘图代码,对于学习作图很有帮助(一)

本期教程 获得本期教程全文代码:在订阅号后台回复关键词:20240923 2022年教程总汇 2023年教程总汇 引言 今天分享的文章是2024发表在Nat Med.期刊中,来自上海交通大学医学院的文章,作者提供了全文的绘图代码,确实勇&a…

S32K3 工具篇8:如何移植RTD MCAL现有demo到其他K3芯片

S32K3 工具篇8:如何移植RTD MCAL现有demo到其他K3芯片 一,文档简介二 ,平台以及移植步骤2.1 平台说明2.2 移植步骤2.2.1 拷贝工程并配置2.2.1.1 拷贝工程2.2.1.2 配置工程 2.2.2 EB 工程配置 三, 命令行编译及其结果测试四&#x…

在idea里运行swing程序正常,但是在外部运行jar包却报错,可能是jdk版本问题

在idea里运行swing程序异常,报Caused by: java.awt.HeadlessException错误 System.setProperty("java.awt.headless","false");加上这句话