当前位置: 首页 > news >正文

《代码整洁之道 - 程序员的职业素养》读书笔记

一 前言

  《代码整洁之道 - 程序员的职业素养》的作者是Robert C. Martin,大家喜欢喊他Bob大叔。这本书主要是Bob大叔40年编程生涯的心得体会,主要讲述了一个专业的程序员需要具备什么样的态度,遵循什么样的原则,采取什么样的行动。Bob大叔以自己亲身踩过的坑为例,为我们这些后来者传授经验。

二 结构

​ 本书共包含14章内容,接下来我会以每一章为基础单位去总结Bob大叔写下来的精华。

  1. 专业主义

      专业主义不但象征着荣誉与骄傲,而且明确意味着责任与义务。专业主义的精髓就在于将公司利益视同个人利益,就意味着担当责任。

      作者讲述了1979年自己在Teradyne公司担任负责工程师期间,为了修复现存系统的几个小故障和一项新功能推出了一版新发布。为了按时交付软件,且修复的故障部分都不涉及原本系统的”夜间例行程序“的编码,作者便没有对这部分功能进行测试。新版本发布之后,”夜间例行程序“没能正常执行,遭到大部分的客户抱怨投诉。此时,作者才意识到问题的严重性,开始对”夜间例行程序“进行测试。虽然重现了问题,但是对于故障排查,作者并没有把握。由此,作者告诉现场服务经理Tom应建议客户使用旧版软件,但是Tom却发火说,这样做对于客户来说是个双重打击,因为新版本的发布已经导致了数据的丢失,若是再回退版本则会导致客户无法使用事先承诺的新功能。最终,作者找到了缺陷所在,重新交付了修复问题的新程序。但是这已经是几天之后了,这期间,每天作者都会收到客户的抱怨投诉。经历此事,作者在老板心中的印象大大下降。后续作者反思:没有对例行程序进行测试就交付软件是不负责任的。作者本应该在首次交付前就担起责任,告诉Tom测试还未完成,自己无法按时交付。虽然这样会使得Tom不开心,但不会发生丢失数据,客户投诉的事情。

    如何承担责任?

      要不行损害之事。从纯软件的角度来说就是:不要破坏软件的功能与架构。

      (1)不要破坏软件功能。但是开发过程中难免会出现bug,哪怕有些bug实际上在所难免,我们也应该对这些bug负责。出现问题之后,首要的事情就是道歉,后续应当避免出现类似的错误。虽然失误率永远不可能等于零,但是我们有义务让它无限接近于零。如何做到呢?①确信代码正常运行,加强自测,自己写过的代码测试的覆盖率应该达到100%。②让QA找不出任何问题,应该把QA当成客户来对待,什么意思呢?我们应该把确保没有问题的代码交给QA测试,而不是让QA去测试我们没有把握的代码,或是我们明知有缺陷的代码。③自动化QA,作为开发人员,我们需要有一个迅捷可靠的机制,以此帮助我们判断所写的代码是否能够正常工作。

      (2)不要破坏结构。软件要易于修改,结构良好的代码更为灵活。代码是一个不断优化的过程,每次读代码,都可以做一些简单的修改。大多数人认为对上线运行的软件不断地做修改是危险的。错!让软件保持固定不变才是危险的!

    要有职业道德:要持续学习,每天应当抽出一些时间来给自己充电,这样才能有助于让自己在职场中立于不败之地。了解自己行业的领域、坚持学习、要练习、学会合作、辅导新人、了解业务领域、与雇主/客户保持一致、要学会谦逊。

  2. 说“不”

      能就是能,不能就是不能。不要说“试试看”。

      作者讲述了在20世纪70年代初,在ASC公司工作时发生的一件事。作者所在团队研发的系统在预期上线的前一周才把系统完整的搭起来,但还存在很多待解决的bug。作者及其团队需要一定的时间去解决这些bug,但是ASC的经理Frank强制要求按期完工,到期交货,不容置喙。作者及其团队只能加班加点,昼夜颠倒的去排查解决现存bug,没有单独思考的时间。如期上线之后,悲剧了,系统无法正常使用,需要以一小时一次的频率一直重启系统。客户拒绝使用系统知道系统能够正常使用。Frank大发雷霆,要求本周五之前必须让系统正常运行,但是作者预估系统稳定下来的时间是4周。在Frank的强烈要求下,作者所在团队妥协,说试试看。上线之后,原本的bug偶尔还会出现,除此外还有其他问题也暴露出来了。只能不断地去解决客户那边不断涌来的问题。

      要懂得说“不”,对于明知在deadline前完不成的工作,不要做出承诺。“试试看”这样的字眼也不要说,这样的词只会让经理认为你其实是有一定几率可以做到的。要和经理达成一致,找到我们和经理共同的目标,挖掘经理在deadline前最想要看到的效果,以及我们能帮助其实现什么样的效果。因为经理可能不理解为什么一个简单的功能会需要那么多时间去做。就比如登录功能,经理只要能登录就行了,至于其它的忘记密码、登录互斥、输错密码3次账号锁死等衍生功能会认为是没有必要的。提供更多细节,只会招致更多的微观管理。所以我们没有必要去解释为什么需要那么多时间,我们只需要找到我们和经理的共同目标,提供给经理一个暂时演示的版本,用于经理给客户演示。

      要有团队精神,与大家多交流,关心队友,当队友遭遇困境时要及时援助,尽职尽责。不要说“试试看”,许诺“尝试”,就意味着你承认自己之前未尽全力,承认自己还有余力可施。许诺“尝试”,其实就是承诺确保会成功,若是尝试没有达成预期的成果,那么就表示你失败了,这期间的压力和后果就需要你自己来抗了。

  3. 说“是”

      口头上说,心里认真,付诸行动。

      不要说一些模棱两可,缺乏承诺的话,例如:我需要减肥。要表现出对某一件事情的掌握性,承诺可以做到,例如:我将在下周二之前减掉1斤体重。承诺的关键在于对自己将要做某件事有了清晰的事实陈述,而且明确说明了完成期限。不是可能会做,可能做到,而是一定做到,必须做到。

      若是你无法兑现承诺,那么最重要的就是尽早向你的承诺对象发出预警,越快越好,越早越好。因为越早向各利益相关方发出预警信号,整个团队就越有机会做出响应,减少不必要的损失。

      专业人员不需要对所有的请求都回答“是”,但是应尽力寻找创新方法,尽可能做到有求必应。要做到既不破坏开发人员的原则,又能够承诺确保能完成的任务,准确表达出自己能够在期限内做到的任务。

  4. 编码

      编码是一项颇具挑战也十分累人的智力活动,当你无法全神贯注地编码时,所写代码就有可能出错。如果感到疲劳或者心烦意乱时,千万不要编码,因为大概率这些代码需要返工。要学会将睡眠、健康和生活方式调整到最佳状态。

      作者以自己切身经历讲述了自己在凌晨3点写出的代码,在当时感觉无比完美的代码,后续却一遍一遍的肆虐作者及其团队。关于高效率状态,有时候程序员编写代码时会进入一种意识高度专注但思维视野却会收拢到狭窄的状态,又称“流态区”。在这种状态下,他们会感觉效率极高,绝无错误。但一些进入这种状态又从中摆脱出来的人给出忠告:避免进入流态区。因为这其实是一种浅层冥想状态,在这种状态中理性思考能力会下降,会敲出更多的代码,收获一种愉悦感或征服感。但这种状态下写出的代码并没有顾及全局,导致后续需要重构。所以,当察觉到自己快要进入这种状态时,离开座位,转换一下思维。

      软件开发是一场马拉松,而不是短跑冲刺,只有保持节奏才能取胜。专业的程序员应仔细保存好自己的精力和创造力。当你碰到问题受阻时,感到疲倦时,就离开一会儿,让富有创造力的潜意识接管问题。有很多问题是在回家路上、洗澡的时候想通的。

      创造性输出依赖于创造性输入。平时可以广泛的去阅读一些资料,例如:科幻小说等,去激发自己的创造力。

  5. 显示

相关文章:

《代码整洁之道 - 程序员的职业素养》读书笔记

一 前言 《代码整洁之道 - 程序员的职业素养》的作者是Robert C. Martin,大家喜欢喊他Bob大叔。这本书主要是Bob大叔40年编程生涯的心得体会,主要讲述了一个专业的程序员需要具备什么样的态度,遵循什么样的原则,采取什么样的行动。…...

八、CSS新特性二

文章目录一、CSS3多背景和圆角二、怪异盒子模型三、多列属性四、H5多列布局瀑布流五、CSS3线性渐变5.1 线性渐变5.2 径向渐变六、CSS3过渡动画七、CSS3 2D八、CSS3动画一、CSS3多背景和圆角 css3多背景,表示CSS3中可以添加多个背景。 CSS3圆角 border-radius: 0px;…...

Ubuntu国内镜像源

查看系统版本命令: $ lsb_release -aDistributor ID: UbuntuDescription: Ubuntu 22.04 LTSRelease: 22.04Codename: jammy国内的更新源有多个,几个大互联网公司的源都比较稳定,没什么差别。 下面是比较主流的、常用的几个…...

3.Linux安装es单机版

1.下载 版本 JDK 11ES elasticsearch-7.10.0 jdk安装 下载: wget https://download.java.net/openjdk/jdk11/ri/openjdk-1128_linux-x64_bin.tar.gz配置环境变量:# 编辑配置文件 vim /etc/profile# Java11环境变量配置 export JAVA_HOME/devtools/ja…...

C语言实现通讯录

咱们手机上面还有教务系统上都可以存储信息,这些都是使用编程语言来实现的,那么今天,咱们今天就用C语言来实现通讯录。 一. 实验名称 通讯录 二. 实验目标 1.数据的储存 2.数据的增加 3.数据的删除 4.数据的修改 5.数据的展示 6.数据…...

Python-生成列表

1.生成列表使用列表前必须先生成列表。1.1使用运算符[ ]生成列表在运算符[ ]中以逗号隔开各个元素会生成包含这些元素的新列表。另外,如果[ ]中没有元素就会生成空列表示例>>> list01 [] >>> list01 [] >>> list02 [1, 2, 3] >>…...

如何写好controller层

前言本篇主要要介绍的就是controller层的处理,一个完整的后端请求由4部分组成:1. 接口地址(也就是URL地址)、2. 请求方式(一般就是get、set,当然还有put、delete)、3. 请求数据(request,有head跟body)、4. 响应数据(response)本篇…...

MySQL---视图的概念与操作

MySQL—视图的概念与操作 常见的数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录数据字典就是系统表,存放数据库相关信息的表。系统表的数据通常由数据库系统维护, 程…...

ChatGPT,会是现实世界的MOSS吗?

最近,两个人工智能系统彻底火出了圈,成为许多网友热议的焦点。 一个是冷酷无情的“幕后主角”MOSS,一个是多才多艺的“全能网友”ChatGPT。 先来说说MOSS。今年春节档,科幻电影《流浪地球2》热映,电影中一个面试环节令…...

安卓大厂面试题_安卓开发面经_Android大厂面经(22/30)之JNI全解析

系列专栏: 《150道安卓常见面试题全解析》 安卓专栏目录见帖子 : 安卓面经_anroid面经_150道安卓常见基础面试题全解析 安卓系统Framework面经专栏:《Android系统Framework面试题解析大全》 安卓系统Framework面经目录详情:Android系统面经_Framework开发面经_150道面试题答…...

记一次docker虚拟机横向移动渗透测试

本次渗透在几个docker虚拟机间多次横向移动,最终找到了一个可以进行docker逃逸的出口,拿下服务器。渗透过程曲折但充满了乐趣,入口是172.17.0.6的docker虚拟机,然后一路横向移动,最终在172.17.0.2出实现了docker逃逸&a…...

计算机网络-物理层

计算机网络-物理层 计算机网络学习笔记 学习视频:https://www.bilibili.com/video/BV1c4411d7jb/?p14&spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source75dce036dc8244310435eaf03de4e330 物理层的基本概念 物理层考虑的是怎样…...

Kubernetes Nginx 发布

kubernetes发布nginx 目录 Nginx Pod启动Service访问Nginx 2.1. NodePort访问Nginx 2.2. ClusterIP访问Nginx 2.3. LoadBalancer访问Nginx 2.4. ExternalName访问NginxDeployment方式部署Nginx 3.1 Nginx Replicas Nginx Pod 启动 nginx-v1.yaml apiVersion: v1 kind: Pod…...

华为OD机试真题Python实现【非严格递增连续数字序列】真题+解题思路+代码(20222023)

非严格递增连续数字序列 题目 输入一个字符串仅包含大小写字母和数字 求字符串中包含的最长的非严格递增连续数字序列长度 比如: 12234 属于非严格递增数字序列 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 ## 输入 输入一个字符串仅…...

12-render函数

render函数 一、render的作用 非单文件组件时&#xff0c;创建vm的写法&#xff1a; new Vue({el: #root,template: <App></App>,components: {App} })但是该写法在脚手架中会报错。因为脚手架默认引入的是个残缺版的vue。 如果要避免报错&#xff0c;有2种解决…...

磨金石教育摄影技能干货分享|杨元惺佳作欣赏——诗意人文

一般来说&#xff0c;人文摄影总会体现现实性多些。但杨老师是个摄影诗人&#xff0c;他的内心总能将刻板的现实融入美好的光芒。你在他的照片里&#xff0c;看着现实的摄影素材&#xff0c;所感受到的是诗意的绵绵未尽。春网&#xff08;中国&#xff09;正所谓春水碧于天&…...

在Pandas中通过时间频率来汇总数据的三种常用方法

当我们的数据涉及日期和时间时&#xff0c;分析随时间变化变得非常重要。Pandas提供了一种方便的方法&#xff0c;可以按不同的基于时间的间隔(如分钟、小时、天、周、月、季度或年)对时间序列数据进行分组。 在Pandas中&#xff0c;有几种基于日期对数据进行分组的方法。我们将…...

基于SPI的增强式插件框架设计

很久之前&#xff0c;为了诊断线上的问题&#xff0c;就想要是能有工具可以在线上出问题的时候&#xff0c;放个诊断包进去马上生效&#xff0c;就能看到线上问题的所在&#xff0c;那该是多么舒服的事情。后来慢慢的切换到 java 领域后&#xff0c;这种理想也变成了现实&#…...

176、【动态规划】leetcode ——1143. 最长公共子序列(C++版本)

题目描述 原题链接&#xff1a;1143. 最长公共子序列 题目描述 本题和 718. 最长重复子数组&#xff08;动态规划&#xff09; 的区别在于此时不要求令一个数组中元素连续。 动态规划五步曲&#xff1a; &#xff08;1&#xff09;dp[i][j]含义&#xff1a; 截止到text1[i …...

16行代码采集原神官网角色全图+全语音

嗨害大家好鸭&#xff01;我是小熊猫~ 本来是不玩原神的&#xff0c; 但是实在是经不住诱惑鸭~ 毕竟谁能拒绝可以爬树、炸鱼、壶里造房子、抓小动物、躲猫猫的对战游戏捏~ 准备工具 源码资料电子书:点击此处跳转文末名片获取 准备模块 import requests import re import ex…...

如何利用内部链接来提高网站排名_网站 UX 设计对 SEO 的重要性是什么

如何利用内部链接来提高网站排名 在现代的网络环境中&#xff0c;如何提高网站在搜索引擎中的排名成为了每一个网站运萈者的首要任务。其中&#xff0c;内部链接和网站用户体验&#xff08;UX&#xff09;设计在搜索引擎优化&#xff08;SEO&#xff09;中扮演了至关重要的角色…...

CC324条提示词意外泄露——第31条让我出了一身冷汗

324条提示词意外泄露——第31条让我出了一身冷汗 原创 硅谷Alan Walker 硅谷Alan Walker 嘉妍Kea 2026年4月2日 02:47 美国 22人 在小说阅读器中沉浸阅读 当 AI 可以代替你发 Slack、fork 自己&#xff0c;人与 AI 的边界在哪里&#xff1f; src/constants/prompts.ts 57…...

Wan2.2-I2V-A14B高性能推理:C++后端服务开发与优化

Wan2.2-I2V-A14B高性能推理&#xff1a;C后端服务开发与优化 1. 为什么需要C高性能推理服务 在实时图像生成场景中&#xff0c;毫秒级的延迟差异可能直接影响用户体验和业务转化率。传统基于Python的Web框架&#xff08;如Flask/FastAPI&#xff09;虽然开发便捷&#xff0c;…...

SEO_电商网站SEO优化全攻略,驱动销售额增长

SEO:电商网站SEO优化全攻略&#xff0c;驱动销售额增长 在当今数字化时代&#xff0c;电子商务已成为企业赢得市场份额和提升销售额的重要途径。仅仅拥有一个电商网站并不足以吸引大量流量和转化成交。这时&#xff0c;电商网站SEO优化就显得尤为重要。本文将详细介绍电商网站…...

千问3.5-9B操作系统概念解析:虚拟化、进程调度与内存管理精讲

千问3.5-9B操作系统概念解析&#xff1a;虚拟化、进程调度与内存管理精讲 1. 操作系统教学新视角 在计算机科学教育中&#xff0c;操作系统一直是让许多学生头疼的"硬骨头"。传统教材往往堆砌大量抽象概念&#xff0c;让初学者望而生畏。今天我们将展示千问3.5-9B如…...

【NOIP】1999真题解析 luogu-P1014 Cantor 表 | GESP三、四级以上可练习

NOIP 1999 普及组真题&#xff0c;主要考察简单的二维矩阵模拟与通过寻找数学规律进行时间复杂度优化。可以用模拟法暴力求解&#xff0c;也能通过总结对角线的排列规律实现高效求解。GESP三、四级以上可练习。题目难度⭐⭐☆☆☆&#xff0c;洛谷难度等级普及−。 luogu-P101…...

Qt项目实战:借助Valgrind精准定位与修复内存泄漏

1. 为什么Qt开发者需要Valgrind 刚接触Qt开发时&#xff0c;我总以为用了智能指针和Qt自带的内存管理机制就能高枕无忧。直到某个深夜&#xff0c;项目上线前突然崩溃&#xff0c;日志里只有一句"segmentation fault"&#xff0c;我才意识到内存问题有多可怕。那次经…...

c++如何读取BMP位图文件并精确提取每个像素点的RGB值【实战】

直接用fread读BMP会错乱因像素数据BGR存储、行末补零对齐且从左下到右上排列&#xff1b;需跳过bfOffBits&#xff0c;按每行字节数对齐读取并反向索引&#xff0c;再手动转为RGB。为什么直接用 fread 读 BMP 文件会得到错乱的 RGB 顺序&#xff1f;BMP 文件头和信息头之后&…...

IDEA阅读插件终极指南:在IntelliJ中轻松阅读电子书的完整教程

IDEA阅读插件终极指南&#xff1a;在IntelliJ中轻松阅读电子书的完整教程 【免费下载链接】thief-book-idea IDEA插件版上班摸鱼看书神器 项目地址: https://gitcode.com/gh_mirrors/th/thief-book-idea 还在寻找能够在代码编辑间隙享受阅读乐趣的完美解决方案吗&#x…...

Java 25 虚拟线程新特性与实践:构建更高效的并发系统

Java 25 虚拟线程新特性与实践&#xff1a;构建更高效的并发系统 别叫我大神&#xff0c;叫我 Alex 就好。 一、引言 大家好&#xff0c;我是 Alex。Java 虚拟线程&#xff08;Virtual Threads&#xff09;自 Java 21 引入以来&#xff0c;已经成为 Java 并发编程的重要变革。…...