配置驱动(Configure Driven)的应用程序
理解配置 今天我们来学习软件开发中的一个方法,这个方法用好了可以让程序更加灵活,并帮助我们避免后期大量的代码更改。在说这个方法之前,我们需要理解配置参数(Configuration)这个东西,我相信做过开发的人都应该清楚它是什么,这里举个简单的例子,比如下面这个命令 >$ git diff src/ 我们可以把上面这个命令分成两部分—— git diff 和 src/,前面的 ...
理解配置 今天我们来学习软件开发中的一个方法,这个方法用好了可以让程序更加灵活,并帮助我们避免后期大量的代码更改。在说这个方法之前,我们需要理解配置参数(Configuration)这个东西,我相信做过开发的人都应该清楚它是什么,这里举个简单的例子,比如下面这个命令 >$ git diff src/ 我们可以把上面这个命令分成两部分—— git diff 和 src/,前面的 ...
前言 这篇文章是对 CSAPP 第五章的总结回顾,所有的理论均出自该书第五章。我们前面学习了汇编指令,学习了处理器的体系结构,但是我们会发现这些东西好像离我们比较远,我们没法直接将这些知识运用到日常的编程中。那么这篇文章我们就来看看,如何运用这些底层的知识来帮助我们写出高效的程序。 编译器的瓶颈 总的说来,程序的运行效率是由下面这三个方面决定的: 算法和数据结构 编译器对源...
前言 这篇文章是对 CSAPP 第四章的总结回顾,所有的理论均出自该书第四章。之前我们总结过 第二章 和 第三章,有兴趣的话可以看看。 这一章,我们会去到硬件层面,看看处理器(CPU)是如何组合各种门电路和逻辑单元,来更好地执行我们在第三章介绍的那些机器级指令的。我们会介绍 指令集、硬件单元、流水线、处理器架构 等等内容。你会对计算机指令有更深的了解,也会更加清楚为什么简单的门电路能一步...
场景 不知道在工作中你有没有遇到要接手别人系统或者项目的情况,比如说你的同事离职了,他负责的业务转交给你,或者是你刚到一个公司,需要熟悉新的系统,亦或是你想要更好地与别人合作,想对别人负责的业务有所了解。了解新的东西,并承担相应的责任都能够让我们走出自己的舒适圈,拓宽自己的经验,提升自己的能力。可很多时候,面对一个大的系统,我们总感觉有点无从下手的,觉得这里面很多东西都是自己没接触过的,光...
DRY 软件设计中有一个非常简单的原则——Don’t Repeat Yourself(DRY),按维基百科的定义就是: Every piece of knowledge must have a single, unambiguous, authoritative representation within a system 系统中的每一部分,都必须有一个 单一的、明确的、权威的...
如何衡量代码的好坏 如果你是一个有着多年开发经验的工程师,你有没有想过一个问题,什么样的代码才能被称之为好代码?针对这个问题,有着五花八门的答案,有的人会说容易理解的代码就是好代码,有些人会说易于维护的代码就是好代码,还有人会说简洁的代码就是好代码。这些答案都对,而且你也会发现这些特征被人们总结成一个个短词,比如可维护性(Maintainability)、可读性(Readability)、...
数学中的正交 最早听到正交这个词还是高中数学课上,当时并没有特别的印象,无非是把它当成是一个数学公式,主要还是为了做题。 数学上的正交非常直观,表示的是两个相互垂直的向量,再进一步,它们的内积为 0。比如,在直角坐标系中,假设有向量 $\vec{A} = [x_A, y_A]$ 和向量 $\vec{B} = [x_B, y_B]$,这两个向量的 内积 就是对应位置相乘再求和: [\ve...
学习汇编的意义 在说这部分内容前,先讨论一个问题,就是在当今新技术成出不穷,编程变得越来越便捷的大前提下,我们还有没有必要抽出时间来学习汇编呢?显然,如果答案是否定的,我就没必要写这篇文章了。有人会说,现在 C++ 这种语言都被归为系统级语言了,不常用了,你还学汇编,搞笑呢吧? 确实,越底层的东西越来越不适合拿来进行快节奏的开发,这其实是好事,因为编程的门槛变低了,这会让更多的人参与到编...
问题回顾 在之前的 文章 中我们用 Dijkstra 算法来找出给定点与其余点的最短路径,也简单介绍了图的一些基本概念,有兴趣的话可以看看。 这里需要重点指出,不含有负权重是 Dijkstra 算法成立的必要条件,具体原因在之前的文章中讲过,就不过多赘述。比如下面这个例子,使用 Dijkstra 算法计算出来的答案就是错误的: 那么有没有什么办法能够让我们规避这样的错误呢?如果一直...
模式所解决的问题 在前面的文章中,我们讨论过很多的设计模式,比如说 迭代器模式,工厂模式,还有 观察者模式。这些模式都在试图解决代码中的一个核心问题——依赖。什么是依赖呢?就好比一个模块 A 强依赖于模块 B,那么我们在使用模块 A 的同时需要把模块 B 也给搞清楚,还需要弄清楚 A 与 B 之间的关系。当一个系统中的模块数量逐渐增多,并且这些模块都相互依赖,那么我们就需要花更多的时间来维...