阿里P10:Code Review 是一场苦涩但有意思的修行

微软Copilot不自动安装:企业端点安全与Intune策略管控详解 Copilot for Microsoft 365并非传统插件,而是一个具备系统级访问能力的Windows原生应用,其部署直接关联企业端点安全合规基线与IT治理能力。从技术原理看,‘自动安装’涉及Intune策略分发、Windows App Installer行为、注册表写入及启动项注入等多环节;微软此次声明实质是切断后台静默路径,强制引入管理员显式授权与用户交互确认机制。这一转变提升了Windows平台下MSIX应用的行为边界可控性,强化了WDAC白名单、组策略和Intune应用部署策略的技术协同价值。典 阅读详情

作者:阿里研究员孤尽,《阿里巴巴Java开发手册》和《码出高效》作者。

1.前言


最近 CodeReview(以下简称CR )心态相当的平和,代码是一个讲道理的东西,是就是,否就否。在 CR 时,沟通特别轻松,问题讨论也特别聚焦,因为它是量化和定向的。CR 的过程不是恃强凌弱,也不是一言堂,大家看着代码,当作是一种灵魂的交流,那么每一次的 CR 也是同事间提升和谐度的一种方式。优良的 CR 传统可以体现团队温度,体现高年级同学传帮带的技术文化。平时,大家抬头看 PRD ,低头写代码,很少有时间静心气闲地交流一下业务流程、业务逻辑、业务未来扩展,在 CR 时,往往可以反复被讨论到。一个人的能力不是体现在解决了问题上,也不是发现了问题,而是利用某种手段预知问题并解决问题。曾经有段代码,我觉得取反逻辑生涩难懂,反复修改之后,发现写代码的小伙伴是错误领会了业务意图。

提升技术质量、促进人才成长、培养技术情怀这些口号我们今天先放一边,聊聊最近CR的切身体会。CR 不是互相看天书,而是产生天天看书的感觉,每一段写得好,写得不好的代码都是一本书,好的代码希望见贤思齐,差的代码希望见不贤而内自省也。总之, CR 是一种修行,也是一种自我积累,苦涩的是看到惨不忍堵的代码,心里说:我去!有意思的是看到优雅的代码,心里也说:我去!

2.业务跑的那么快,没时间 Code Review


这是一个很大的谎言,不要为自己的丑代码找华丽的借口,没有时间好好 CR ,总有时间焦头烂额地处理故障和投诉。

Photo @ Djim Loic 

时间老人是公平的,我一直认为某个同学在工位上噼里啪啦打字,就是说明他干活快,通过团队打字比赛,发现其中 20% 在按 BACKSPACE 键。业务跑得快,代码写得快,可能写的是一堆没有营养甚至是有毒的代码。我们需要追求的是 CR 的效能,而不是逃避 CR 。CR 是一种修行,对于双方都是一样的收获,因为如果想象成一个摊派任务,抵触情绪总会油然而生。业务跑得快,也得两腿是健康的, CR 就是保证业务持续跑的快的一个小医生,不正常的业务节奏对公司的中长远发展肯定是弊大于利。

3.代码是讲道理的


我认为靠烧香来保佑代码不出问题时,保平安往往也是暂时的。优秀的代码,就是在小流量、单线程没有问题,在高流量、高并发时还是没有问题,你的限流,你的容灾,你的降级各种导弹防御系统一样自动打开并正确地发挥价值。很多人的思维觉得,代码只要在场景和逻辑上没有问题就行,那是因为夜路走得不够多,还没有碰到鬼。代码是讲道理的,就像有一个同学说>=比>更加慢,那只是我们的潜意识猜测,经过深达编译层的分析,发现两个指令几乎是完全一样。其实凭我们的想象,那也是一个位运算级别的操作,从左向右比,如果一处有 1 ,另一个没有 1 ,那么前者一定是更大。没有无缘无故的爱,没有无缘无故的恨,一切的故障总是代码的字里行间。我们需要做的,就是读懂她,用好她,写好她。如果代码任性闯祸,只能是我们不懂代码的心思。

Photo @ Hitesh Choudhary

4.每一行代码的存在都是有意义的


更加严格地说,每一个字符的存在都应该是有意义的。如果某行代码的存在完全是可有可无的,这个时候,我们考虑过 JVM 的感受吗?凭白无故地要编译这些字节码,然后栈进栈出的忙活一阵子,然后告诉它,你的劳动是没有任何价值的。比如,Boolean assetFlag = Boolean.true ; 这里都已经明确地给给出来显示的初始值,可是在调用端,居然还有这样的判断:if ( assetFlag != null && assetFlag == true) {...},什么情况下为 null 值啊?另外参数在框架里已经做了值的判断,那么下边又是 n 行,对所有参数重新判断一遍,是对我们的代码有多少不自信,还是对框架不自信?每一行的代码,相当于生命,它的存在一定是有意义的,一定是能够被执行到并且能够为实际的业务负责的。

5.我们比拼的不是代码行数


在 Code Review 过程中,发现有些方法,重复用到一段逻辑,这段逻辑如果不抽取出来成为一个方法,未来的修改就成了一个必须多点全部修改的大坑,稍有不慎,容易遗漏。重复代码在提交行数上,似乎挺壮观的。如果在同样的效果上, 3 行代码能够实现功能的价值,就不应该用 4 行来实现。我们经常说晒出代码行数,并非是单纯地鼓励代码行数多,而是提倡大家去写代码,写优质的代码,优质的代码一定是少即是多的原则。代码的实现,不要像鲁迅先生说的一样:懒婆娘的裹脚布又臭又长。

6.用户视角的成功与失败


在交付时,调用服务失败,然后返回前台一个空列表,那么前端业务的展示是后台数据正常,这个人不拥有数据列表,这明明是对数据的一种曲解。所以,后台调用服务失败,就应该明确告诉前台,服务出错了,这个用户有没有数据。系统出错的信息给用户看,合适吗?不合适。前后端的用户交界面上,往往飞着两类信息:错误码、错误信息。这样够了吗?用户提示需要额外地再给出来,往往根据不同的错误码,有不同的用户提示,可能是一个多对多的关系。多个错误码,提示给用户的信息:请输入必填项。多个用户信息,可能也对应一个错误码。一般来说后台承包这三者的联动关系, json 串推送给前端时,前端拿来主义即可。

7.有重复使用的地方一定要找个地方集中隔离


不管是变量,还是常量,工具类,如果是多个地方同时用到,那么如果硬编码在代码或者沉淀在包里,未来一定是一个灾难。比如,一个组装 SQL 语句的代码,到处都是 "from" "where" "limit" ,都是这类语句直接写死在代码中,注意问题来了,这些单词前后都需要加空格。有时候在复制粘粘时,发现少了一个空格,出现的问题,往往是致命的。再比如,一个互相约定的分隔符 “###” ,定义在本类中 private String ,这明显是两个共同遵守的常量,单独定义的结果就是容易造成不匹配。隔离的目的是复用它,保护程序地正常运行,易于维护。

8.单测没有必要代码 Code Review


单测有时候感觉像是阑尾,有或没有感觉都是无关紧急,这是错误的观点。单测感觉就是一个任务。你写单测了吗?写了。单测是否需要 MOCK ,是否进行边界值测试,是否用例覆盖到业务场景,这都也是 CR 的一部分。单测写得好, BUG 肯定少。

9.需要调试来找错误事,往往是一种对异常的侮辱


良好的日志和异常机制,是不应该出现调试的。打日志和抛异常,一定要把上下文给出来,否则,等于在毁灭命案现场,把后边处理问题的人,往歪路上带。别人传一个参数进来,发现是 null ,立马抛出来一个参数异常提示,然后也不返回哪一个参数是 null ,这在调用参数很多的情况下,简直就是字谜游戏一样。到底是抛异常,还是抛错误码?我不管抛什么,反正错了什么东西,都应该透明出来。到底是抛受检异常,还是非受检异常,我只想说,没有充足的理由,不要乱抛受检异常。异常抛出时,一定要自己消化干净,告诉别人说我的方法签名抛的是 AbcException ,实际运行中,代码某个地方直接抛出 EfgException ,这也是不负责任的。

10.多个 return 的语句,概率高的一定先进行判定


if(condition1) return; if(condition2) return; if(condition3) return ; 那么需要评估一下 condition1/2/3 出现概率的大小,概念大的在最前边,尽可能快地进行 return ,不需要进行后续无谓的匹配。不要总觉得计算机跑得快,不差这点蝇头小利的,这种思维,和《南辕北辙》里的寓义一样的吗?

11.吝啬空行


感觉空行是廉价的,到处乱扔是一种;另一种是感觉空行是昂贵的,舍不得用,这种情况更多见。50 行代码没有一个空行,就像英语 50 句话,没有任何标点符号一样。既然标点符号起到隔断和语义区分作用,我们的空行不是同一个道理吗?在以下情形:

1、在方法的 return、break、continue、这样断开性语句后必须是空行。

2、在不同语义块之间。

3、循环之前和之后一般有空行。另外,方法和类定义下方就不需要空行了吧。

12.命名太随意


代码有两件事情比较头疼:命名和循环。人如其名,如果不是它干的活,名字却是一副道貌岸然,太容易把人带偏了,一个中国人如果取名叫赵C,一个女孩子如果取名叫石敢当,第一印象生生地给扭曲了。英语不好的同学,要么用错英文单词,要么翻词典,整出一个专八的词汇,任何人都不认得这个单词,在 CR 时,还需要打开在线翻译时的命名,绝对不是好命名。当然如果在线翻译都翻不出来的时候,那更头疼。如果表意错误,那更要命。

Photo @ Jon Tyson 

13.注释是电影的旁白


电影的旁白:1)信息量大。2)适时出现。就像 star war 里,开始的一段一样,如果不交代那些背景,可能进入正片是一脸懵逼的。在代码上不需要写正确的废话,名字取得好,自然是自解释的。在嵌套循环中,或者在复杂条件分支中,往往是需要讲明白的。

另外,添加业务背景信息,以及执行频率,执行条件,甚至维护者注意点,都是注释的重要理由。识别到哪里要写注释,也是一个对业务的阅读能力,而不是代码阅读能力。

14.满天飞的函数式编程好吗?


答案是:不好。如果一个 stream 后边的调用超过 5 个,我觉得你是为了炫耀,因为别人不敢改这段代码,体现出来你的不可替代性。这种 10 行都是函数式编程的方式,就像让人在水里憋气超过 10 分钟不能换气一样难受,有点缺氧的感觉。如下图,反对这种直接 return 一个长链路的处理结果:


写在最后

以上,是今天讨论主题的全部。

CR,我认为是在团队协作开发过程中重要活动,军哥带团队对 CR 要求是极其苛刻的,我们甚至把它列入到个人考核体系之中,因为只有这样才能通过实践倒逼大家成长!

关于今天的话题,你有什么问题,请留言区提问哈。

另外,军哥乐于结交朋友,也欢迎加我微信与我做朋友(公号输入框回复“w”即可),朋友圈互吹!


以往热文推荐:

职场正在淘汰那些 1 年经验用了 N 年的人

视频号首次直播:关于职业规划那些事!


更多精彩,关注我公众号,一起学习、成长

▲ 长按关注军哥手记,一起学习、成长

Windows Phone 7开发范式:被遗忘的移动UI工程教科书 声明式UI框架的核心在于状态驱动与契约约束,其原理可追溯至XAML早期实践——Windows Phone 7正是这一思想的首个完整落地。它通过强制INotifyPropertyChanged绑定、严格生命周期管理(如Tombstoning)和Metro设计语言,构建了高可控、低认知负荷的移动开发教学模型。这种以用户体验为中心、用系统约束换取长期可维护性的工程哲学,深刻影响了Jetpack Compose、SwiftUI及MAUI等现代框架。尤其在资源受限场景下保障60FPS动画与内存稳定性,WP7的性能预算 阅读详情

相关推荐

AI内容分发操作系统:极简Newsletter的MVP设计与工程落地

Newsletter在AI时代已超越信息载体,演变为可部署、可验证、可迭代的轻量级AI工作流操作系统。其核心原理是将‘工具使用’压缩为‘动作即交付’,通过结构化三明治框架(入口动词+可剪贴代码+可视化验证)降低用户决策成本,以版本化运营机制将读者反馈实时编译为产品迭代指令。技术价值在于实现零配置启动、跨平台一致运行与安全合规前置嵌入,广泛应用于产品经理需求闭环、运营自动化日报、技术文档智能生成等高确定性场景。本文详解一套经27家企业验证的AI内容分发操作系统设计逻辑。

weixin_34364071的博客 470

Code Review 是一场苦涩但有意思的修行

Photo@Wyron A文 |孤尽前言最近 CodeReview(以下简称CR )心态相当的平和,代码是一个讲道理的东西,是就是,否就否。在...

阿里巴巴中间件 663

2026年独立开发者如何用免费AI API跑通MVP

免费AI API已成为现代软件开发中支撑原型验证与早期用户增长的关键基础设施。其本质是基于开源模型、学术算力共享和社区协作形成的低成本推理服务,核心原理在于去中心化部署、动态CU配额替代传统Token计费,以及结构化响应降低后处理成本。这类服务的技术价值在于显著压缩MVP验证周期与现金门槛,尤其适配内容生成、多模态理解、结构化数据提取及实时交互等轻量级AI场景。对indie devs和creators而言,能否高效筛选并集成真正可持续的Free AI APIs,直接决定产品能否跨越从想法到真实用户的生死线。

345

7 个建议让 Code Review 高效又高质

关于代码评审(Code Review)的文章也算是汗牛充栋了,代码评审也已经是许多组织的标准化实践。不过,许多团队在尝试代码评审实践时,却有如下疑问: “政治正确” 的代码评审活动究竟有没有达到期望的实际效果? 给了我一大堆代码,到底该从哪里看起?哪些方面是我该评审的?哪些不是? 别人有没有认真评审我的代码?如何让别人更容易的评审代码? 这些都不是什么新问题,但是它们是如此的普遍,而且经年累月地在不同的上下文中被提起,不外乎两个方面: 理解代码评审的核心目标,建立关于代码评审的正确预期。 了解代码评审为什么

weixin_48726650的博客 313

Windows 11 + AMD 780M 运行 ComfyUI 完整指南:DirectML 实战方案

ComfyUI 是基于 PyTorch 的 Stable Diffusion 可视化工作流工具,其性能高度依赖 GPU 后端支持。在 Windows 平台,传统 CUDA 方案仅适配 NVIDIA 显卡,而 AMD 核显用户长期面临 ROCm 兼容性差、驱动链路断裂等系统级障碍。DirectML 作为微软原生机器学习 API,绕过 ROCm 生态断层,直接对接 DirectX 12 硬件抽象层,成为 RDNA 3 架构(如 Radeon 780M)在 Windows 11 上运行 AI 绘画的最优解。它提供

weixin_30099989的博客 727

利用Windows XP Service Pack 2 Checked Build打造Partial Checked Build System

一、什么是Checked build    Windows Checked Build通俗地说就是Debug版的Windows,与之相对的是Retail build,一般我们在市面上买到的Windows都是Retail build。两者的code base相同,只不过Checked build是在DBG编译开关打开的情况下编译出来的。和Retail build相比,Checked build关闭了

人是会思考的一棵苇草 4599

简单的.bat恶搞代码

哈喽,大家好,本期我会向大家分享几个恶搞代码,你可以用它来整蛊身边的同事或朋友,但是如果你被暴揍———后果自负。好啦,废话不多说,上教程。

姜的blog 3万+

UAF漏洞原理与实战:从内存管理到利用链构建

UAF(释放后使用)是堆内存管理中因时间错位导致的典型内存安全问题,其本质在于free后指针未置空且被再次解引用,而堆管理器的懒回收机制使内存数据残留成为可能。该漏洞依托堆布局控制实现类型混淆,进而支撑浏览器沙箱逃逸、内核提权等高危攻击。作为C/C++程序中最稳定可利用的原语之一,UAF广泛影响Chrome、Firefox、Windows内核及金融终端等关键系统。理解其触发三要素(分配-释放-再使用)与检测缓解技术(ASan、智能指针、堆分区),是构建纵深防御体系的基础。

weixin_34372728的博客 381

几个好玩的bat和几个命令

滑动关机:slidetoshutdown。批处理(可以强制删除一些不让删除的文件)也就先写这几个吧,知识储备不高,见谅。echo 艾瑞巴蒂嗨起来!树形查看文件:color a。查看以前连过的WiFi。

weixin_64714058的博客 4883

Qwen3-TTS本地部署实战:Windows下零基础跑通中文TTS

文本转语音(TTS)是人机交互的基础技术,其核心原理在于将输入文本经编码、声学建模与声码合成三阶段转化为可听音频。随着大模型轻量化与扩散模型兴起,本地化、低延迟、高可控的TTS系统正成为AI工程落地的关键能力。Qwen3-TTS作为支持Transformer文本编码、扩散声学建模与HiFi-GAN声码器的开源方案,显著降低了消费级GPU(如RTX 3050)上的部署门槛。它不依赖云端API,允许开发者调试中间特征(如梅尔频谱、音素对齐),并适配中文分词、CUDA显存优化、Windows环境兼容等真实场景需求

weixin_33778544的博客 372

VirtualBox嵌套虚拟化灰色不可点原因与全栈解决方案

嵌套虚拟化是现代开发与测试的关键技术,指在虚拟机中再次运行虚拟化环境(如KVM、Docker Desktop或Kubernetes),其底层依赖CPU硬件辅助虚拟化(VT-x/AMD-V)与多层系统协同。原理上需固件层(BIOS/UEFI)、操作系统内核层(Hyper-V/WSL2/HVCI)、驱动层(VBoxDrv.sys签名与加载)及应用层(VirtualBox配置)四重条件同时满足。技术价值在于提升云原生开发效率、降低硬件依赖、支持ARM64内核验证等场景。典型应用包括在Windows宿主机中运行Li

weixin_34279579的博客 295

有趣的Bat代码。

1.屏幕翻转脚本: 这个脚本会将控制台窗口的文本反转显示,看起来像是屏幕被翻转了。请记住此代码仅供学习或娱乐,请勿用于任何非法用途。如有其他建议请回复。4.模拟打字机效果: 这个脚本会逐字打印出文本,模拟打字机的效果。3.快速闪烁的光标: 这个脚本会让光标在控制台窗口中快速闪烁。2.彩虹文字脚本: 这个脚本会在控制台中显示彩色的文字。此代码仅用于恶搞,请勿用于其他非法用途。

2401_86802274的博客 1706

AI工程实践指南:从Newsletter到可复现的AI基建决策系统

在AI技术快速迭代的背景下,工程师亟需一种兼顾时效性、可验证性与工程落地性的知识获取方式。AI newsletter作为一种轻量级知识操作系统,其核心价值在于将碎片化工具信息升维为结构化决策依据——通过最小可行测试(MVP Test)保障可用性,结合API调用成本与延迟实测实现量化选型,并依托可复现性等级(✅/⚠️/❌)控制技术引入风险。这类实践导向的内容形态,本质上是面向LLM应用开发、RAG系统优化、本地模型微调等真实场景的技术校准机制,尤其适用于需要在有限算力(如M2 Mac)、明确SLA(如P99<

weixin_34277853的博客 435

从零上手数字资产项目:环境搭建、运行测试与问题排查全指南

在数字内容创作领域,3D模型、游戏模组和AI绘画模型等数字资产已成为核心生产要素。其工作原理通常涉及特定文件格式的解析、宿主软件的集成或机器学习模型的推理。掌握这些技术的价值在于,能够将创意高效转化为可交互、可渲染或可生成的具体成果,广泛应用于游戏开发、影视制作、独立创作和IP衍生品开发等场景。本文以实战为导向,聚焦于如何为不同类型的数字资产项目(如3D模型、游戏Mod或LoRA模型)搭建合适的运行环境,并执行关键的最小可行性测试。文中将详细阐述环境准备的核心要点,包括软件依赖、硬件要求(特别是GPU显存管

weixin_30294295的博客 339

技术实践中的成本控制与效果验证:避免资源浪费的评估框架

在深度学习与AI模型部署领域,资源敏感型技术探索常面临算力消耗与效果不确定性的挑战。其核心原理在于通过建立系统化的评估与验证流程,将模糊的技术需求转化为可量化的指标,从而在投入宝贵资源(如GPU积分、云算力)前进行理性决策。这一方法的技术价值在于显著降低试错成本,提升个人开发者与小型团队在模型选型、方案验证时的效率。应用场景广泛覆盖图像生成、语音合成、模型微调等需要消耗计算资源的探索性实验。本文以“难觅”项目为例,深入探讨如何通过最小可行验证(MVP)部署、关键效果指标(KPI)制定及系统性排查方法,实现技

weixin_33853827的博客 403

Mono运行时的产品思维:可预测性、可裁剪性与可嵌入性

.NET跨平台运行时中,Mono并非.NET Framework或.NET Core的简单移植,而是一种面向资源受限场景的专用执行环境。其核心原理在于通过平台抽象层(PAL)屏蔽OS差异,依托SGen垃圾回收器、AOT编译与Interpreter三模执行引擎,在性能、内存与启动时间之间实现可控妥协。技术价值体现在对嵌入式、边缘计算及iOS等禁止JIT环境的原生支持;典型应用场景包括树莓派边缘代理、医疗工控设备、车载信息娱乐系统及PLC控制算法嵌入。本文深入解析Mono如何以‘可预测性、可裁剪性、可嵌入性’为

diedangxiang4092的博客 423

大模型智能体开发实战:从RAG到Agent的完整指南

大语言模型(LLM)作为人工智能的核心技术,通过深度学习实现自然语言理解与生成。其原理基于Transformer架构,通过预训练获得通用语言能力。在工程实践中,检索增强生成(RAG)技术通过向量数据库检索相关知识,有效提升LLM回答的准确性和专业性。而智能体(Agent)则能协调LLM和RAG等工具,实现复杂任务的自主规划与执行。这种技术组合在企业级AI应用中价值显著,特别适合构建智能问答系统、文档处理助手等场景。本教程以上海交大《动手学大模型》为例,深入解析LLM、RAG、Agent的协同工作机制,通过实

diankui6178的博客 348

HCL模拟器2026版安装与驱动配置全攻略:从零搭建网络实验环境

网络模拟器是网络工程师和学习者进行协议验证、拓扑设计与故障排查的核心工具,其原理是通过软件虚拟化技术模拟真实网络设备的硬件行为与操作系统。这项技术的价值在于能够以极低的成本构建可重复、可扩展的实验环境,对于备考认证(如软考网络工程师)、掌握主流网络技术(如VLAN、OSPF)以及进行方案验证至关重要。在实际应用中,网络模拟器常面临虚拟化环境配置与驱动兼容性等挑战。本文聚焦于解决HCL模拟器安装过程中的核心痛点,特别是针对VirtualBox虚拟化平台集成与网卡驱动配置等常见问题,提供了从环境检查到功能验证的

weixin_34306593的博客 481
上一篇: 视频号首次直播:关于职业规划那些事!
下一篇: 阿里云盘正式上架,速度15MB/s!(附下载链接+邀请码)
军哥手记
军哥手记 业界专家认证 业界专家认证
博客等级 码龄21年 661粉丝 608原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值