
代码精进之路
文章平均质量分 91
代码精进之路
_Rye_
左手代码右手诗
一行代码一行诗
展开
-
结束语|如何成为一个编程好手?
这个专栏设立的愿景,是想要传达编写优秀代码的理念,帮助软件工程师快速成长并且保持长久的竞争力。但是,四十多篇文章,显然不是通天的秘籍。一个软件工程师的修炼,主要还是靠日积月累的积累和精进。而且,这个修炼还包括编码之外的功夫。原创 2024-01-31 14:38:11 · 388 阅读 · 0 评论 -
丨关于代码质量,你关心的那些事儿
透明化带来的好处就是,有更多的眼睛盯着 Java 的变更,代码的质量会更好,潜在的问题也会更少。没有人愿意记住那么多生硬的规范,这个时候,代码评审就是一个很好的方法,有很多眼睛看着代码,有反馈,有讨论,有争议,有建议,团队能够更快地形成共识,找出问题,形成习惯,共同进步。比如说,如果一个定义清晰,承载功能单一的接口,我们就容易理解,编码思路也清晰,写代码就又快又好。需求满足不了就会返工,程序出了问题也会返工,测试通不过还会返工······每一次的返工,都要你重新阅读代码,梳理逻辑,修改代码。原创 2024-01-31 14:23:44 · 943 阅读 · 0 评论 -
44 | “代码安全篇”答疑汇总
比如,只要你记住,“跨界的数据不可信任”这条简单的原理,并且去校验每一个跨界数据的有效性,就消除了代码的很大一部分风险。到最后,引领你的思路的,就是基本的原理,而不再是纷繁复杂的技巧。然后,看看我们的代码,有没有需要调整的地方。我们要做的就是,根据安全问题,使用搜索引擎,搜索相关的研究,然后分析、检查、使用到我们自己的代码里。如果你留意一下 NIST 的安全漏洞数据库在一段时间内最新的安全漏洞,你可能会发现,出现问题的代码和应用千奇百怪,涉及的领域和技术非常广泛,不仅仅局限于框架、语言、开源代码。原创 2024-01-31 14:22:36 · 905 阅读 · 0 评论 -
43 | 编写安全代码的最佳实践清单
像以前一样,当大家看到“最佳实践清单”这个标题的时候,就意味着这一个模块又到了总结的时候了。这一模块我们从代码安全的角度出发,探讨了如何编写安全的代码。首先我们再来重温一下,为什么需要安全的代码呢?原创 2024-01-31 11:51:35 · 1113 阅读 · 0 评论 -
42 | 纵深,代码安全的深度防御
前面我们聊了保持代码长治久安的两个策略,代码规范和风险预案。这一次,我们接着聊代码安全管理的另外一个策略:纵深防御。说起纵深防御(Defence-in-Depth),我们最常想到的是军事战略。在军事上,这个概念指的是通过层层设防,以全面深入的防御来延迟敌人的进攻,通过以空间换时间的方式来挫败敌方的攻击。这有别于一战定胜负的决斗思维。决斗思维需要集中所有的优势资源在最前线,一旦前线失守,整个战争基本就宣告结束了。信息安全的攻防,有一个很重要的特点,就是不存在没有漏洞的防线。原创 2024-01-31 11:18:16 · 891 阅读 · 0 评论 -
41 | 预案,代码的主动风险管理
上一次,我们聊了保持代码长治久安的基础——代码规范。这一次,我们接着聊第二个方面,代码的风险预案。有些问题,并没有适用于各种场景的解决办法;有些设计,并不能适用于所有的用户;有些实现,并不能经受过去、现在和未来的检验。在你的日常工作中,有没有这样的情况出现?做好预案,是我们管理风险的一个很重要的手段。代码的安全管理,也需要预案。原创 2024-01-31 10:28:30 · 952 阅读 · 0 评论 -
40 | 规范,代码长治久安的基础
这是一个特殊的案例,我们好像聊了一个故事。对这个案例,你还有什么看法吗?原创 2024-01-31 09:45:06 · 931 阅读 · 0 评论 -
39 | 怎么控制好代码的权力?
在前面,我们讨论了“敏感信息经过授权才可以使用”的这样一条有关编码安全的实践。我们还可以把这个实践扩展到更大的范围:信息和资源,需经授权,方可使用。这个信息和资源,不仅仅包括用户数据这样的敏感信息,还包括计算机代码、产品和服务。授权使用这些资源,需要遵循“最小授权”的原则。所授予的权力,能够让应用程序完成对应的任务就行,不要授予多余的权力。为了方便,我们可以把“最小授权”这个概念拆分成如下的两个部分来理解:最小权力的设计最小限度的授予。原创 2024-01-31 09:11:00 · 909 阅读 · 0 评论 -
38 | 对象序列化的危害有多大?
如果一个函数或者对象,不管它位于多么遥远的地方,都可以在本地直接被调用,那该有多好呀!这是一个非常朴素、美好的想法。基于这个设想,诞生了很多伟大的技术和协议,比如远程过程调用(RPC)、远程方法调用(RMI)、分布式对象(Distributed Object)、组件对象模型(COM)、公共对象请求代理(CORBA)和简单对象访问协议(SOAP)等……这个列表还可以很长很长。躲在这些协议背后的核心技术之一,就是。原创 2024-01-30 18:12:33 · 846 阅读 · 0 评论 -
37 | 边界,信任的分水岭
边界是信息安全里一个重要的概念。如果不能清晰地界定信任的边界,并且有效地守护好这个边界,那么编写安全的代码几乎就是一项不可能完成的任务。原创 2024-01-30 17:30:37 · 853 阅读 · 0 评论 -
36 | 继承有什么安全缺陷?
有时候,为了解决一个问题,我们需要一个解决办法。可是,这个办法本身还会带来更多的问题。新问题的解决带来更新的问题,就这样周而复始,绵延不绝。比如上一篇文章中,我们说到的敏感信息通过异常信息泄露的问题,就是面向对象设计和实现给我们带来的小困扰。再比如前面还有一个案例,说到了共享内存或者缓存技术带来的潜在危害和挑战,这些都是成熟技术发展背后需要做出的小妥协。只是有时候,这些小小的妥协如果没有被安排好和处理好,可能就会带来不成比例的代价。原创 2024-01-30 16:57:46 · 957 阅读 · 0 评论 -
35 | 怎么处理敏感信息?
要想保护敏感信息,首先要识别敏感信息。什么是敏感信息呢?其实,这个问题本身就是一个特别有意思的话题。你要是查阅关于敏感信息定义的不同文献,就可以体会到不同的立场和不同的利益纠葛。敏感信息的界定范围,也透露了游戏规则制定者对于敏感信息保护的力度和态度。还记得我们在《如何评估代码的安全缺陷?》这篇文章里提到的,信息安全最基本的三个元素吗?私密性、完整性以及可用性是信息安全的三要素。其中,私密性指的是数据未经授权,不得访问,解决的是“谁能看”的问题。原创 2024-01-30 16:19:27 · 532 阅读 · 0 评论 -
34 | 数组和集合,可变量的安全陷阱
在前面的章节里,我们讨论了不少不可变量的好处。在代码安全中,不可变量也减少了很多纠葛的发生,可变量则是一个非常难缠的麻烦。原创 2024-01-30 15:43:46 · 883 阅读 · 0 评论 -
33 | 整数的运算有哪些安全威胁?
在我的日常工作中,有一类错误,无论是原理还是后果,我都十分清楚。但是写代码的时候,这类错误曾经还是会反复出现。如果不是代码评审和代码分析环节的校正,我都很难意识到自己的代码中存在这样的缺陷。今天,我想和你聊聊,那些“”的老顽固问题。你不妨先停下来想一想,你有没有类似的经历?又是怎么解决的呢?原创 2024-01-30 15:08:39 · 819 阅读 · 0 评论 -
32 | 如何评估代码的安全缺陷?
是其中一个比较好的、常用的软件缺陷评估体系。我个人比较倾向一种观点,原创 2024-01-30 14:31:41 · 1093 阅读 · 0 评论 -
31 | 为什么安全的代码这么重要?
从今天开始,我们进入本专栏的“安全模块”。首先,我们通过一个具体的安全漏洞的案例,来感受下计算机代码是多么的脆弱,以及编写安全的代码为什么如此重要。原创 2024-01-30 11:46:00 · 1355 阅读 · 0 评论 -
30丨“代码经济篇”答疑汇总
简单地说,线程的堆栈、CPU 的缓存、计算机的内存,可以是独立的物理区域。也就是说,不管从线程堆栈读写(线程内),还是从 CPU 缓存读写(线程间),还是从计算机的内存读写(线程间),对于每个线程,这些数据都要一样。对于银行 App 我最想看到钱,可以转账,可以管理我的银行卡信息,最近两年在用平安银行的手机 App,看余额得输入密码,这个应该是安全考虑,但其中的很多功能从来不会去点,特别是任意门,一不小心就点上去了。其实有很多这样的技术,比如手机的指纹识别、面部识别,都可以降低密码的输入频率。原创 2024-01-30 11:31:01 · 432 阅读 · 0 评论 -
29 | 编写经济代码的检查清单
通过前面十几讲的学习,我们已经把代码“经济”篇的内容学习完了。今天,我们一起把前面讨论到的观点总结一下,并探索一下编写经济代码时的最佳实践检查清单。原创 2024-01-30 10:55:11 · 890 阅读 · 0 评论 -
28 | 怎么尽量“不写”代码?
最有效率的编码就是少编写代码,甚至不编写代码。前面,我们讨论过避免需求膨胀和设计过度,就是减少编码的办法之一。这一次,我们讨论代码复用的问题。商业的规模依赖于可复制性,代码的质量依赖于可复用性。比如,Java 提供了很多的类库和工具,就是为了让 Java 程序员不再编写类似的代码,直接拿来使用就可以了。原创 2024-01-30 10:15:19 · 790 阅读 · 0 评论 -
27 | 怎么编写可持续发展的代码?
成功的大公司,也是从小公司起步的。刚开始的时候,软件可能比较简单,用户也比较少,一台廉价的服务器,或者一个简单的虚拟机,甚至几个静态的页面就绰绰有余。很快,辛苦的努力得到回报,产品传播速度远超预期,用户很喜欢公司的产品或者服务,数量大幅增加,需求越来越强劲。这时候也是公司最忙碌的时候,每个人眼里只有两个字:“增长”。用户规模增长随之带来的是软件规模增长,运维复杂度增长。原创 2024-01-30 09:42:59 · 848 阅读 · 0 评论 -
26 | 有哪些招惹麻烦的性能陷阱?
前面,我们讨论了改善代码性能的最基本的办法。接下来,我们讨论一些最佳实践,让我们先从一些容易被忽略的性能陷阱开始。原创 2024-01-30 09:08:49 · 911 阅读 · 0 评论 -
25 | 使用有序的代码,调动异步的事件
同步和异步,是两个差距很大的编程模型。同步,就是很多事情一步一步地做,做完上一件,才能做下一件。异步,就是做事情不需要一步一步的,多件事情,可以独立地做。比如一个有小鸟的笼子,如果打开笼门,一个一个地放飞小鸟,就是同步。如果拆了整个鸟笼,让小鸟随便飞,爱怎么飞就怎么飞,这就是异步。原创 2024-01-30 00:34:27 · 790 阅读 · 0 评论 -
24 | 黑白灰,理解延迟分配的两面性
上一次,我们讨论了减少内存使用的两个大方向,减少实例数量和减少实例的尺寸。如果我们把时间的因素考虑在内,还有一些重要的技术,可以用来减少运行时的实例数量。其中,延迟分配是一个重要的思路。原创 2024-01-29 18:53:18 · 747 阅读 · 0 评论 -
23 | 怎么减少内存使用,减轻内存管理负担?
管理内存,不管是什么编程语言,向来都是一个难题。Java 语言能够长期领先的一个重要原因,就是它拥有强大的内存管理能力,并且这种能力还在不断地进化。然而,只依靠 Java 内在的内存管理能力,是远远不够的。2018 年 9 月,亚马逊向 OpenJDK 社区提交了一个改进请求。这个改进涉及到一个问题,如果一个服务的缓存数量巨大,比如说有 10 万个连接会话,Java 的垃圾处理器要停滞几分钟,才能清理完这么巨大的缓存。而这几分钟的停滞,是不可忍受的事故。这是一个值得我们关注的细节。原创 2024-01-29 18:41:58 · 1159 阅读 · 0 评论 -
22丨高效率,从超越线程同步开始!
线程的同步是学习一门编程语言的难点。刚开始线程同步的困难,主要在于了解技术;跨过了基本技术的门槛后,更难的是掌握最基本的概念。学习技术时,我们对基本概念熟视无睹,只想将宝剑尽快握在手,哪管宝剑何时该挥出的教导。学会技术后,基本概念就会回来找我们算旧账,出错一次剑,就记一笔账。账本慢慢变厚的过程,也是我们向基本概念靠拢的过程。当我们掌握了最基本的概念后,开始慢慢还账,账本再越变越薄。不单单是线程和同步,掌握好基本概念,几乎是我们学习所有技术背后的困境。原创 2024-01-29 18:06:22 · 867 阅读 · 0 评论 -
21 | 怎么设计一个简单又直观的接口?
我们前面聊过接口规范,开放的接口规范是使用者和实现者之间的合约。既然是合约,就要成文、清楚、稳定。合约是好东西,它可以让代码之间的组合有规可依。但同时它也是坏东西,让接口的变更变得困难重重。接口设计的困境,大多数来自于接口的稳定性要求。摆脱困境的有效办法不是太多,其中最有效的一个方法就是要。那么该怎么设计一个简单直观的接口呢?原创 2024-01-29 17:29:52 · 1585 阅读 · 0 评论 -
20 | 简单和直观,是永恒的解决方案
上一次,我们聊了影响代码效率的两个最重要的因素,需求膨胀和过度设计。简单地说,就是找到要做的事情,做的事情要少。接下来,我们来聊聊怎么做这些事情。其中,我认为最重要的原则就是选择最简单、最直观的做法。反过来说,就是不要把事情做复杂了。要想简单直观,我们要解决两个问题。第一个问题是,为什么要简单直观?第二个问题是,该怎么做到简单直观?原创 2024-01-29 16:52:25 · 906 阅读 · 0 评论 -
19 | 怎么避免过度设计?
俗话说,“过犹不及”。“过度”这个词仿佛会给我们一些不好的暗示。不要紧张,我们先聊一个轻松的话题。假设有一个小地方,要建一个火车站。这个地方有数十万人口,每列火车预计上下乘客数十人,高峰时段大概近百人。你会怎么设计这个火车站?这个火车站可能是个富丽堂皇的建筑,有宽敞的售票厅和候车室。这种设计到处可见,你可以想一想你熟悉的火车站, 也可以观察一下旅途中的火车站。也有些火车站可能只是一个一百平米左右的小房子,只有简单的售票窗口、进站口和出站口。比如说北京的清华园火车站,就是这样的。原创 2024-01-29 16:20:47 · 1011 阅读 · 0 评论 -
18丨思考框架:什么样的代码才是高效的代码?
如果让你设计一个有十亿用户使用的售票网站,你会考虑哪些问题?如果让你设计一个有一万亿用户使用的服务,你又会考虑哪些问题?不要以为有一万亿个用户的服务离我们很远,它正在快速地逼近我们。我们前面讨论了,代码的性能是关于如何管理内存、磁盘、网络和内核等计算机资源的。该怎么衡量这些资源管理的好坏呢?这就需要一些评价指标。这些指标不仅指导着代码的交付标准,也指导着我们编码时的技术选择。原创 2024-01-29 15:37:43 · 957 阅读 · 0 评论 -
17 | 为什么需要经济的代码?
如果你在线购买过春运的火车票,经历过购票网站的瘫痪,你应该深有体会,网站瘫痪是一件让人多么绝望的事情。根据有关报道,2014 年 1 月 9 日,火车票售票网站点击量高达 144 亿次,相当于每个中国人点击了 10 次,平均每秒点击了 16,000 次,峰值的点击量可能远远超出 16,000 次。这么强悍的访问量,导致了火车售票网站多次瘫痪。这是一个典型的性能错配导致的重大网络事故,处理这么大的点击量需要特殊的程序设计和架构安排。有句俗话说:“又要马儿跑,又要马儿不吃草。”马该怎么活呀?活不了呀!原创 2024-01-29 15:01:40 · 873 阅读 · 0 评论 -
16丨代码“规范”篇用户答疑
可是这只是表象,代码评审可以减少错误,提高代码质量,减少代码返工,帮助积累经验,这些都是节省时间的。刚开始,一个程序员写的代码,可能有很多警告,然后他试图弄清楚这些警告,消除掉这些警告。我们要做的就是,让自己成为这样的程序员,找到这样的程序员做同事,帮助同事成为这样的程序员。我觉得数量上的区别可能不是很大,两三人的团队,八九人的团队,中小企业的团队规模大抵也是这样的,甚至更大。10. 鼓励内部推广软件开发经验,比如说什么样的插件可以编写规范的代码,什么样的代码容易出现安全问题,什么样的代码效率比较高。原创 2024-01-29 14:51:27 · 930 阅读 · 0 评论 -
15 | 编写规范代码的检查清单
通过前面十几讲的学习,我们已经把代码“规范”篇的内容学习完了。今天,我们一起把前面讨论到的观点总结一下,并探索一下编写规范代码时的最佳实践检查清单。一份有效的检查清单,可以帮助我们记忆、遵循和执行代码的一系列规范。原创 2024-01-29 11:17:33 · 1408 阅读 · 0 评论 -
14 | 怎么写好用户指南?
前一段时间,我要买一部家用的跑步机。有一款跑步机看起来配置齐备,商品的标题中指明“需要组装”。商品的评论只有两条。其中一条给了三分:“还没有来得及试一试这个新到的跑步机。因为,我一直试着把它组装起来。我做梦都没有想到,‘需要组装’意味着我花了三天时间,都没有组装起来。它也许是一个好的跑步机,可是令人失望的是,这些零件到底该怎么凑在一起!而另一条则给了最低的一分。评论写道:“商品描述不准确。这台机器非常重,长度甚至超过两人沙发。一般的家庭根本放不下这台跑步机。已经退货了”。原创 2024-01-29 10:42:19 · 1140 阅读 · 0 评论 -
13 | 接口规范,是协作的合约
一个软件项目,一般需要交付两类文档。一类文档是面向开发者的,另一类文档是面向最终用户的。这两类文档,由于面向用户的不同,无论是内容还是形式,都有巨大的差异。今天我们先来聊聊面向开发者的文档。下一讲中,我们再接着聊面向最终用户的文档。原创 2024-01-29 10:03:47 · 982 阅读 · 0 评论 -
12丨组织好代码文件,要有“用户思维”
上一讲中,我们讲了如何组织代码段,今天我来讲下,如何组织代码文件。最开始接触一个项目代码时,我们最渴望的,就是快速揭开项目的面纱。这个项目是干什么的?是怎么做的?该怎么使用?有很多这样的问题,排着队等我们处理。我们需要从一个点开始,先撕破一点点皮,然后,像剥洋葱一样,一层一层地阅读,一层一层地了解。刚拿到一个项目的代码时,你最想找哪一个文件?面对大量的文件,该从哪里入手?创建一个项目时,各式各样的文件该怎么规整?如果一个项目很小,只有三五个文件,我们不用担心上述的问题。原创 2024-01-29 09:24:40 · 939 阅读 · 0 评论 -
11 | 组织好代码段,让人对它“一见钟情”
当我们看到一个事物的时候,它的轮廓首先进入视野,给了我们第一印象。如果第一印象没有吸引到我们,那我们就不会集中注意力去关注它,也不会想去认识它。我觉得有个俗语非常好地概括了这个认知习惯。这个俗语就是“不起眼”,更通俗一点的说法是“放在人群里认不出来”。不管我们愿不愿意,第一印象特别影响我们的判断和心情。我们看到美好的东西,自己也跟着高兴;看到乱糟糟的东西,自己也感觉乱糟糟的。代码也是这样的。如果我们看到整齐、清爽的代码,我们就对它有好感,愿意阅读,也愿意改进。原创 2024-01-29 08:55:30 · 968 阅读 · 0 评论 -
10 | 异常处理都有哪些陷阱?
上一讲中我们聊了聊怎么用好 Java 注解,今天我们谈谈怎么处理异常。处理好异常状况是掌握一门编程语言的基础,也是我们编程离不开的基本功。相信你对异常处理的机制已经很熟悉了。异常处理便捷、灵活、好用。但是,越好用的东西,我们越容易忽视它的缺陷。异常处理就有很多我们容易忽视的陷阱。今天,我们来聊聊这些问题,以及该怎么处理这些问题。原创 2024-01-29 00:54:26 · 959 阅读 · 0 评论 -
09 | 怎么用好Java注解?
Java 注解是 Java 1.5 引入的一个工具,类似于给代码贴个标签,通过注解可以为代码添加标签信息。这些标签信息可以添加在字段、方法和类上。开发工具、部署工具或者运行类库,可以对这些标签信息进行特殊的处理,从而获得更丰富的功能。经过十多年的发展,注解已经成了 Java 生态系统一个非常重要的技术。使用注解可以大幅度降低我们的开发强度,提高工作效率,减少潜在的错误。像 Java 类库一样,注解也有了越来越丰富的定义和规范,成了我们需要掌握的重要技术之一。原创 2024-01-28 21:46:58 · 844 阅读 · 0 评论 -
08 | 写好声明的“八项纪律”
我们在前面讨论了该怎么取一个好名字。在编程语言里,我们使用标识符来表示不同的逻辑和对象。声明就是用来定义这些标识符的。标识符声明的地方,就是取名字和第一次使用名字的地方。这一次,我们聊一聊该怎么声明一个标识符。“声明”是我们和标识符初次见面的地方,第一印象就显得特别重要。如果我们忘记了,回头能够清晰地找到它,也很重要。如果我们印象模糊了,回头能够重新认识它,对于我们阅读程序也有很大的帮助。一个标识符,不仅仅只是一个名字。像人分男女、高矮胖瘦一样,标识符也可以有附加信息,用来增强人们对它的认识。原创 2024-01-28 21:11:07 · 881 阅读 · 0 评论 -
07 | 写好注释,真的是小菜一碟吗?
上一讲中我们讲了如何整理代码,但有些时候,即便我们取好了名字,编排好格式,但代码还是让我们抓狂,不明出处,不好理解。这时候,就需要注释登场了。顾名思义,注释就是对代码的解释。注释不需要运行,它是用来提高代码的可读性和可维护性的。不好的注释会使代码变得更糟糕,使人更抓狂。理想虽丰满,现实很骨感。注释虽小,写好不易。那写注释有哪些注意事项?有没有什么技巧呢?今天我们就来聊聊写注释这个话题。当然了,不同的语言,注释的语法差别很大。原创 2024-01-28 19:29:32 · 955 阅读 · 0 评论