你是否 diss 过别人的代码?—— 怎样的代码才算优秀?

优秀代码的标准
本文探讨了评价代码质量的不同维度,包括程序的可行性、按时性、适应性及效率等,并结合《The Psychology of Computer Programming》一书的观点,分析了这些标准在实际开发中的重要性和相互关系。

写在前面:一名有三年Android开发经验的女程序员(欢迎大家关注我 ~期待和大家一起交流和学习Android的相关知识)

你一定在内心吐槽过别人的代码太烂:没注释、逻辑混乱、到处都是 magic number、实现方案过时、耦合严重、一改就出 bug。

此时心中的怒火油然而生,仿佛自己是正义的化身,要代表月亮消灭这样的代码,甚至拼写错误也可以成为你 diss 的点。稍等片刻,先抑制一下燃烧的小宇宙,你有没有认真想过“到底什么样的代码才算的上优秀?”

在看了 Gerald M. Weinberg 的《The Psychology of Computer Programming》后让我有了不一样的认识。不过我觉得这是一个开放问题,不同情况下会有不同答案,欢迎讨论。

可行性

作者给出的第一个标准是“程序的可行性”,它是指对于任何一种约定的输入,程序都能给出期望的输出。毕竟可行的程序总比不可行的要好。在不满足可行性前提下的优越性能,高可扩展性都不值一提。
但不可否认的是,我们脑子里成天考虑的是这些次要问题。甚至会形成“不优雅就是垃圾”的价值观,好像只有这样才可以在内心自恃高人一等。获得这种莫须有的优越感的代价可能是写出了不可行的代码,捡了芝麻丢了西瓜。

引用一段原文:

如果程序根本无法正常运转,对其效率、适应性及生产成本的评估就毫无意义。无论如何,我们需要务实一些,需要承认:也许根本没有哪个完美的程序曾经被写出来过。每一个真正大型和重要的程序都必然包含很多个纰漏。所以对程序进行评估时,必须考虑到其不完美的一面。

按时性

作者给出的第二个标准是“按时性”。

即使不考虑可行性的问题,效率的问题仍然不是最重要的。程序开发中经常遇到一个问题是要符合开发的日程计划,推迟完成的程序常常没有意义。

我们不得不比较一下,到底是一个可能在未来完成的高效程序带来的潜在节省更大,还是没有一个程序损失更大。现实中,往往是后者的损失更大。

真正困扰人们的并非是预先估计的平均开发时间,而是实际消耗时间的标准偏差。就好比大多数人宁可每天早上花固定的10分钟等公交车,也不愿意每周有4天只等1分钟,而最后一天等26分钟,尽管就平均等待时间而言,后一种方案只需要6分钟,但由于某次无法预测的长时间等待就会打乱计划,这点好处无法弥补其损失。所以宁可承诺一个更留有余地的排期,然后按时完成。而不是承诺一个满打满算的排期,然后delay。

开发过程中遭遇的各种意外导致实际消耗时间和预估时间形成方差,这一问题是值得我们深入思考的。如何提前感知不确定性,如何快速解决意外,是一项需要不断提升的能力以减小方差。

适应性 & 效率

作者给出的第三个标准是“适应性”,即程序的可扩展性。紧跟其后的标准是“效率”,即程序运行的性能。
总算轮到了本以为重要的标准,作者的一席话描述地入木三分:

在软件生命周期内,多数程序都会被修改,无论其经验的多少,绝少有哪位程序员能反驳这一论断。既然如此,为什么在必须修改以前的程序时,我们总是觉得这项任务如此艰巨,以至于往往决定弃之不用,干脆自己从头写起呢?只要阅读过程序,我们就会透过这些程序发现:实际上,很少有哪位原作者会考虑可能的后续修改。

作者还提了两个问题来表达程序员的矛盾之处:

在编写程序时,你曾经有多少次想到过它在未来可能被别人修改?反过来,在修改别人程序时,你又曾经咒骂够几回?

之所以把适应性和效率放在一起讨论,是因为它们俩会此消彼长,作者用 Fisher 定理来证明这个观点:

Fisher定理:一个系统对某一特定环境适应性越强,它适应新环境的能力也就越弱。

如果强调的是程序的效率,那么我们往往会追求紧密式的代码,而如果在未来要对这些代码进行修改,那将会非常棘手。如果使用的是更高层的语言,那么为了使程序更高效,我们往往需要深入到机器语言层。这种做法至少抵消了原本用更高层语言编程的一个好处 —— 在不同机器之间的可移植性。其实际效果是,我们将被局限于特定的某台计算机或特定的某个实现。

回想设计模式,无一例外是通过增加一层抽象以达到可扩展的目的,这样的设计增加了类的数量,类的构建和类方法调用的都会消耗空间和时间的性能,降低了效率。而且它让功能的实现变得更加间接,也增加了理解成本,降低了沟通效率。

但作者认为性能问题不是问题:

运行效率正在成为计算中一个日益不明朗的问题,随着单位计算能力成本的逐年下降,以及单位程序开发成本的不断提高,在程序开发方面比在产品方面投资更多的典型做法,早已不合时宜。因此我们期望,随着岁月的推移,我们听到的关于效率的言论将会越来越少。

紧接着依然是两个耐人寻味的问题:

你是否曾经因为追求效率而延误了工作进度?反过来,是否曾经因为要赶时间完成而没有做到尽善尽美?

但有趣的是,面试时,极少有公司是按照上述的优先级来考察候选人的,通常的考察优先级正好相反,即使有算法笔试也是把重点放在实现方案的内存性能或时间性能上,并不会对程序的正确性进一步追究。

<think>嗯,用户现在问的是关于模拟电路需要用到什么,根据我之前给出的代码。首先,我需要回顾一下之前的对话。用户之前要求我提供一些原理图的例子,我给出了四个不同领域的示例,其中第一个是电子电路的Buck降压电路原理图。现在用户可能是在看了那个例子之后,想要更详细地了解模拟电路设计需要哪些组件或知识。 首先,我需要确定用户的具体需求。用户提到“根据你给出的代码”,可能是指我之前提供的原理图示例中的符号或结构。用户可能想知道在设计类似Buck电路这样的模拟电路时,需要哪些元件、工具和理论支持。 接下来,我需要分解模拟电路设计的基本要素。通常,模拟电路设计涉及到元器件(如电阻、电容、电感、晶体管等)、电路理论(如欧姆定律、基尔霍夫定律)、设计工具(如SPICE仿真软件)、测试仪器(如示波器、万用表)以及设计流程(从需求分析到测试验证)。 然后,我需要结合之前给出的Buck电路例子,具体说明每个部分所需的元件和设计考虑。例如,在Buck电路中,开关管、二极管、电感和电容是关键元件,需要计算它们的参数,如电感值、电容值以满足电压纹波和效率要求。同时,控制环路的设计也需要运算放大器或比较器,这可能涉及到反馈理论和稳定性分析。 用户可能需要了解这些元件的选型方法,例如如何根据输入输出电压、电流来计算电感值,或者如何选择适当的开关频率。此外,用户可能对实际设计中的挑战感兴趣,比如寄生参数的影响、散热问题、PCB布局注意事项等。 我还需要确保回答结构清晰,分点说明,这样用户更容易理解。可能需要将内容分为基础元器件、设计理论、工具与仪器、设计流程、以及设计实例分析。在实例分析部分,详细拆解Buck电路的每个部分,说明每个元件的作用和设计公式,如电感计算公式L = (V_in - V_out) * D / (ΔI * f),并解释各个符号的含义。 另外,用户可能对实际应用中的问题感兴趣,比如如何避免开关噪声干扰其他电路部分,或者如何选择合适的二极管以减少损耗。这些实际问题的解决需要结合理论知识和经验,因此在回答中可以简要提及这些考虑因素。 最后,我应该邀请用户提出更具体的问题,以便提供更有针对性的帮助。比如,询问是否有特定的电路类型或设计步骤需要进一步解释,或者是否需要某个计算公式的推导过程。</think>根据您之前选择的**电子电路示例(Buck降压电路)**,以下是模拟电路设计与分析所需的**核心要素分解**: --- ### **一、基础元器件需求** | 元件类型 | 功能说明 | 关键参数 | |----------------|---------------------------|------------------------------| | **开关管** | 控制能量传输(MOSFET/IGBT) | 导通电阻 $R_{ds(on)}$、耐压 $V_{DSS}$ | | **电感** | 储能与滤波 | 电感值 $L$、饱和电流 $I_{sat}$ | | **电容** | 稳压与滤高频纹波 | 容值 $C$、等效串联电阻 $ESR$ | | **二极管** | 续流作用(常用肖特基) | 正向压降 $V_F$、反向恢复时间 $t_{rr}$ | --- ### **二、理论工具** 1. **电路定律** - 基尔霍夫电压定律(KVL):$$\sum V = 0$$ - 电感伏安关系:$$V_L = L \frac{di_L}{dt}$$ 2. **PWM控制方程** - 占空比与输出电压关系:$$D = \frac{V_{out}}{V_{in}} \quad (\text{连续导通模式})$$ 3. **纹波计算** - 电感电流纹波:$$\Delta I_L = \frac{(V_{in}-V_{out})D}{L \cdot f_{sw}}$$ - 输出电压纹波:$$\Delta V_{out} \approx \frac{\Delta I_L}{8C f_{sw}}$$ --- ### **三、设计工具链** 1. **仿真软件** - SPICE(如LTspice):验证瞬态响应与效率 ```spice .tran 0 10ms 0 1us // 瞬态分析示例 ``` 2. **计算工具** - 电感/电容选型公式推导(见上方方程) - 损耗估算:$$P_{loss} = I_{RMS}^2 R_{ds(on)} + V_F I_D$$ --- ### **四、Buck电路设计实例拆解** 以输入12V→输出5V/2A为例: 1. **占空比计算** $$D = \frac{5}{12} \approx 0.416$$ 2. **电感选型** 设开关频率 $f_{sw}=200kHz$,允许纹波率30%: $$L_{min} = \frac{(12-5) \times 0.416}{0.3 \times 2 \times 200k} \approx 22\mu H$$ 3. **电容选型** 要求纹波<50mV: $$C \geq \frac{0.3 \times 2}{8 \times 50m \times 200k} \approx 7.5\mu F$$ --- ### **五、关键挑战与对策** | 问题类型 | 解决方法 | 设计约束 | |----------------|---------------------------|------------------------------| | **开关损耗** | 提高频率但需平衡效率 | $$f_{sw} \propto \frac{1}{\sqrt{P_{loss}}}$$ | | **EMI干扰** | 优化PCB布局与添加磁珠滤波 | 环路面积最小化 | | **热管理** | 计算结温并选散热器 | $$T_j = R_{\theta ja} \cdot P_{diss} + T_a$$ | --- 如需深入某个环节(如**电感饱和机理分析**或**PCB布局规则**),请告知具体方向!
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值