个或10个全局变量 这都是 OK 的 但一次性使用10000个那就很可怕了 这是不安全的 因为一次性查看10000个全局变量以后 才能知道哪里出了问题 那么到底啥是全局变量 该怎么使用 让我们接下来学习一下...由于软件的分层不合理,到了后期维护,哪怕仅是增加修改删除小功能,往往要从上到下掘地三尺地修改,涉及大多数模块,而原有的代码注释却忘了更新修改,这个时候,交给后来维护者的系统会越来越像一个“泥潭”,注释的唯一作用只是使泥潭上方再加一些迷烟瘴气...全局变量大量使用,少不了有些变量流连忘返于中断与主回圈程序之间。这个时候如果处理不当,系统的bug就是随机出现的,无规律的,这时候初步显示出病入膏肓的特征来了,没有大牛来力挽狂澜,注定慢性死亡。...无需多言,您已经成功得到一个畸形的系统,它处于一个神秘的稳定状态!你看着这台机器,机器也看着你,相对无言,心中发毛。你不确定它什么时候会崩溃,也不晓得下一次投诉什么时候道理。...; 4)如果非要遭人蹂躏赋值,好吧,我开放函数接口让你传参赋值; 5)实在非要extern我,我还可以严格控制包含我.h档的对象,而不是放到公共的includes.h中被人围观,丢人现眼。
我们注意到,首先有限集合内一定有一个常返分布。那么我们可以先找非常返的状态,也就是说找到 也就是说找到状态 的集合,使得存在状态 ,它可以到,但是从这个 没办法回到 。...这个式子就相当于说,如果我从 这个分布出发,无论如何转移,最终的分布依然是 。这当然就是“平稳”的含义。这里还有一个细节,就是因为 是一个概率分布,所以我们额外要求 。...首先,对于某一个状态 ,我们自然会有 它的极限如果存在,那么就回到了我们上面所提到的平稳分布。但是实际情况下,很多时候它的极限是不存在的,下面就是一个例子。 ?...但是事实上我可以根据上面的推断,让这个递推序列不断地进行下去,一定会有一个时刻生成 个连续的数,这就与我上面的论断矛盾了。 好的,我们现在回头来看,怎么构造出这样的 和 。...具体来说,我们结束了对常返与瞬时状态的讨论,并且在更深的层次上讨论了不同情况下,马尔科夫链的极限状态的存在性与相关的分析。 在这一部分,我们将一部分较为重要,但证明繁杂的结论放到了之后说。
它会导致软件分层的不合理,全局变量相当于一条快捷通道,它容易使程序员模糊了“设备层”和“应用层”之间的边界。写出来的底层程序容易自作多情地关注起上层的应用。...全局变量大量使用,少不了有些变量流连忘返于中断与主回圈程序之间。这个时候如果处理不当,系统的bug就是随机出现的,无规律的,这时候初步显示出病入膏肓的特征来了,没有大牛来力挽狂澜,注定慢性死亡。...此外,如果中断开始变得过于复杂或耗时,则仅应在必要时利用中断做最少量的工作,例如,将数据装入缓冲区并设置一个标志,然后让主分支处理输入的数据。...在设计初期阶段认清潜在的障碍,比在产品交付前最后几小时才发现它们要好。 这是预先测试代码片段的一个很好的方法,但需提醒的是,制造商代码往往不是模块化的,未经大的修改不方便用于实际应用。...在写一个函数时,其复杂度在当时看似适中,然而要考虑到,一名工程师如何在六个月的维护时间内查看代码。测量函数复杂度(如循环的复杂度)的方法很多。现在有工具可以自动计算某个函数的循环复杂度。
如果领导给你一个项目的源码让你阅读,并理解重构代码,但里面一句注释都没有,我想这肯定是之前同事“删库跑路”了 ? 看一份源码什么很重要?除了各种代码规范之外,还有一个比较重要的就是注释。...说明 // 或 /* */ 都可以,但团队要在如何注释及注释风格上确保统一。 文件注释 1. 总述 在每一个文件开头加入版权、作者、时间等描述。...文件注释描述了该文件的内容,如果一个文件只声明,或实现,或测试了一个对象,并且这个对象已经在它的声明处进行了详细的注释,那么就没必要再加上文件注释,除此之外的其他文件都需要文件注释。 2....简要重述函数功能是可以的, 但注释重点要放在如何实现上。 变量注释 1. 总述 通常变量名本身足以很好说明变量用途, 某些情况下, 也需要额外的注释说明。 2....主要目的是让添加注释的人 (也是可以请求提供更多细节的人) 可根据规范的 TODO 格式进行查找。
如果领导给你一个项目的源码让你阅读,并理解重构代码,但里面一句注释都没有,我想这肯定是之前同事“删库跑路”了。 看一份源码什么很重要?除了各种代码规范之外,还有一个比较重要的就是注释。...说明 // 或 /* */ 都可以,但团队要在如何注释及注释风格上确保统一。 2、文件注释 1. 总述 在每一个文件开头加入版权、作者、时间等描述。...文件注释描述了该文件的内容,如果一个文件只声明,或实现,或测试了一个对象,并且这个对象已经在它的声明处进行了详细的注释,那么就没必要再加上文件注释,除此之外的其他文件都需要文件注释。 2....简要重述函数功能是可以的, 但注释重点要放在如何实现上。 4、变量注释 1. 总述 通常变量名本身足以很好说明变量用途, 某些情况下, 也需要额外的注释说明。 2....主要目的是让添加注释的人 (也是可以请求提供更多细节的人) 可根据规范的 TODO 格式进行查找。
来源 | strongerHuang 如果领导给你一个项目的源码让你阅读,并理解重构代码,但里面一句注释都没有,我想这肯定是之前同事“删库跑路”了。 看一份源码什么很重要?...除了各种代码规范之外,还有一个比较重要的就是注释。 注释虽然写起来很痛苦, 但对保证代码可读性至关重要,下面我们就以C/C++代码规范注释****为例,将描述如何注释以及有哪些讲究。...说明 // 或 /* */ 都可以,但团队要在如何注释及注释风格上确保统一。 2、文件注释 1. 总述 在每一个文件开头加入版权、作者、时间等描述。...文件注释描述了该文件的内容,如果一个文件只声明,或实现,或测试了一个对象,并且这个对象已经在它的声明处进行了详细的注释,那么就没必要再加上文件注释,除此之外的其他文件都需要文件注释。 2....简要重述函数功能是可以的, 但注释重点要放在如何实现上。 4、变量注释 1. 总述 通常变量名本身足以很好说明变量用途, 某些情况下, 也需要额外的注释说明。 2.
有了这几个式子,我们回头看如何说明 的不可约性和常返性。...但事实上可以进一步把它写成 这只是一个等比数列求和。 如果 ,也就是说 是常返的,我们就认为 。这与我们目前的逻辑,认知都是自洽的。...但这样的话存在一个问题就是没有办法说明 一定是最小的那一个,所以与全文的证明逻辑是不自洽的。如果你跟上了,你一定明白我在说什么。 接下来,我们来说明这个定理证明的step 2。...读者可以利用这个来看看如何从第三行推导到第四行的结果。 这个结果还算是一个比较容易理解的结果,固定 ,它表示的就是从 出发,前 步都没有到达 ,但最后一步到达了 的概率。...既然我们希望关心 ,自然会有个构造的想法,就是构造出一条随机过程,但是让它一直停留在 ,并记录它停留的时间。下图可以描述我们的想法。 ?
很 可能它会提示你调整周围代码的空白来使这一堆代码重新水平对齐(比如程序员想保持 这种水平对齐的风格), 这就会让你做许多的无用功,增加了reviewer的工作并且可 能导致更多的合并冲突。 ...每个switch语句都包含一个default语句组,即使它什么代码也不包含。 ...例如,如果任何一个该实例的观测状态是可变的,则它几乎肯定不 会是一个常量。只是永远不打算改变对象一般是不够的,它要真的一直不变才能将它示为常量。 ...每一个 C++程序员也都知道,C++具有徆多强大的诧言特性,但返 种强大丌可避免的导致它的复杂,而复杂性会使得代码更容易出现 bug、难亍阅诺和维护。 ...struct 被用在仅包吨数据的消枀对象(passive objects)上,可能包括有关联的常量,但没有存叏数据成 员乊外的函数功能,而存叏功能通过直接访问实现而无需方法调用,返儿提到的方法是挃叧用亍处理数据
前言 标题没有看错,真的是让我写个 bug! 刚接到这个需求时我内心没有丝毫波澜,甚至还有点激动。这可是我特长啊;终于可以光明正大的写 bug 了。...先来看看具体是要干啥吧,其实主要就是要让一些负载很低的服务器额外消耗一些内存、CPU 等资源(至于背景就不多说了),让它的负载可以提高一些。...我想肯定会有一部分人认为就是在方法执行完之后回收。 我也正儿八经的去调研了下,问了一些朋友;果不其然确实有一部分认为是在方法执行完毕之后回收。 那事实情况如何呢?我做了一个试验。...通过刚才的实验也发现了,当 Eden 区空间不足产生 YGC 时才会回收掉我们创建的 mem 对象。 但这里其实还有一个隐藏条件:那就是这个对象是局部变量。如果该对象是全局变量那依然不能被回收。...Linux 内存查看 回到这次我需要完成的需求:增加服务器内存和 CPU 的消耗。 CPU 还好,本身就有一定的使用,同时每创建一个对象也会消耗一些 CPU。
前言 标题没有看错,真的是让我写个 bug! 刚接到这个需求时我内心没有丝毫波澜,甚至还有点激动。这可是我特长啊;终于可以光明正大的写 bug 了?。...先来看看具体是要干啥吧,其实主要就是要让一些负载很低的服务器额外消耗一些内存、CPU 等资源(至于背景就不多说了),让它的负载可以提高一些。...我想肯定会有一部分人认为就是在方法执行完之后回收。 我也正儿八经的去调研了下,问了一些朋友;果不其然确实有一部分认为是在方法执行完毕之后回收。 那事实情况如何呢?我做了一个试验。...通过刚才的实验也发现了,当 Eden 区空间不足产生 YGC 时才会回收掉我们创建的 mem 对象。 但这里其实还有一个隐藏条件:那就是这个对象是局部变量。如果该对象是全局变量那依然不能被回收。...Linux 内存查看 回到这次我需要完成的需求:增加服务器内存和 CPU 的消耗。 CPU 还好,本身就有一定的使用,同时每创建一个对象也会消耗一些 CPU。
笔者曾经去京东面试一个高级开发职位,面试官写了一个从1累加到100的C程序,让笔者写出对应的汇编代码,如果你熟悉栈的原理,其实这个题目就并不难,相反,函数通过栈如何实现的,这确实是我们广大开发者必须掌握的基础知识之一...PUSH:为栈增加一个元素的操作叫做PUSH,相当于在这摞扑克牌的最上面再放上—张。 POP:从栈中取出一个元素的操作叫做POP,相当于从这摞扑克牌取出最上面的一张。...当CPU在执行调用func_A函数的时候,会从代码区中main函数对应的机器指令的区域跳转到func_A函数对应的机器指令区域,在那里取指并执行;当函数执行完闭,需要返会的时候,又会跳回到main函数对应的指令区域...例如,每一个c++类成员函数都有一个this指针,在Wndows平台中,这个指针一般是用ECX寄存器来传递的,但如果用GCC编译器编译,这个指针会作为最后一个参数压入栈中。...之所以选在早上七点钟推送是可以让大家在上班的路上,可以利用这些时间碎片来学些有意义的东西。有兴趣的同学,可以关注一下我的公众号。从2018年2月28日早上开始,持续一个月。这是这个系列的第三篇。
(或如何快速找到可复制的渠道,来挖掘和激活?) 这里面的很多问题,在我负责渠道业务时候也是没有认真思考过的,或是只管低头拉车,但抬头看路不够;总之也是经常问题多多,犯错频频。...如果无论如何设计,都不足以调动准代理商的代理意愿,或找不到合适的代理商,要回到自己直销团队卖,能否跑通的问题上去。如果跑不通直销模型,就需要重新思考定价和产品价值的问题。...主要是从利于区域的发展来思考,避免独家不动或不力,但独家后,其他伙伴进入的机会就很弱了。好处是,通过多家经营,一方面增加早期市场的覆盖速度,另一方面,通过竞赛筛选出意愿和能力都匹配的伙伴来经营。...我比较认同直营和渠道并存,直营的销售团队更加直接且专注于客户,会比较利于销售方式的革新和效率的提升,从而更利于渠道的复制扩大。 但全渠道和全直营也都同时存在于不同的厂商里,这怎么理解?或怎么判断?...返款制,坏处是代理商不知道多久厂商才能返款,会不会影响公司经营?代理商通过增加团队成员的方式来扩大销售,但增员的能力受限很多因素。
简单来说,它的平稳分布就是一个均匀分布,因此有 当然也可以看出,这里的所有状态其实都是常返状态,涉及到平稳分布的计算的问题,一定要检查各个状态的常返性。...对于第二题,不妨假设 是从 开始移动的,那么因为一步一步的移动,所以如果要在回到 的时候,让 访问过从 到 的所有状态,实质上就可以得到答案是 其中 。 这个答案是怎么推出来的?...Problem 6: 考虑一个无限状态马尔可夫链,转移概率为 , ,证明它常返,但只有 的时候才是正常返。...假设修好它的过程不需要时间,问 (1) 长期来看,雪地车作业时间的占比是多少? (2) 假如说雪地车每一小时采集的数据的价值为 ,但每一次检查都会消耗 的价值(这个价值你可以理解为人民币或美金)。...Problem 12: 已知一个机器的寿命服从 ,问 (1) 它的生存时间的分布是什么? (2) 如果使用泊松过程,理解为两个指数分布的和,如何求解这个问题?
现在又要加需求,我要满300减100,我还要满200送50… OK,现在就得回到面向对象上来了。向上次简单工厂一样,把所有计算价格可能的方法封装成一个个类。...面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类 所以可以开始编码,先抽象一个计算收款的类,抽象一个收钱的方法,然后根据不同打折类型实现不同的收钱方法...尽管这个概念很简单,但是它几乎是所有设计模式的基础,所有模式都提供了使系统里变化的部分独立于其它部分的方法。 可以看出,每个折扣日都要实现基类返回折扣结果的方法,但实现的方法不一样。...---- 策略模式 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。...缺点 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。 参考 鸭子-策略模式(Strategy) 这篇文章更深入形象,推荐阅读
一些初学者要问了,你又是如何知道这些内核外设的寄存器要在特权级下才可以访问?...答案就在这里,我们可以任意打开一个寄存器: 关于MPU,NVIC,SCB和STK四个单元的其它寄存器是否需要在特权级下才可以访问,大家可以按照我上面说的方法进行查看。...用户级下的代码不能再试图修改CONTROL[0]来回到特权级。它必须通过一个异常handler,由那个异常handler来修改CONTROL[0],才能在返回到线程模式后拿到特权级。...例如,当某个用户程序代码出问题时,不会让它成为害群之马,因为用户级的代码是禁止写特殊功能寄存器和NVIC中断寄存器的。...另外,如果还配有MPU,保护力度就更大,甚至可以阻止用户代码访问不属于它的内存区域。 为了避免系统堆栈因应用程序的错误使用而毁坏,我们可以给应用程序专门配一个堆栈,不让它共享操作系统内核的堆栈。
电脑陷于无限重启中,小伙伴们可以看下我写的《千万不要轻易尝试“熊猫烧香”,这不,我后悔了!》。今天,写这篇文章是因为很多小伙伴都很关心我的电脑后续情况如何了。...结果,重启电脑,电脑却陷入无限重启的循环中。 很多小伙伴说重装系统就好了,但这是硬盘坏了,不是重装系统能解决的事情,况且,对于重装系统这种事情,我也尝试了,结果是不起作用。...最后,它从工具箱里拿出了一个不知道装了什么鬼玩意儿的U盘,查到我电脑上,启动了电脑,这厮开始双击“计算机”,打开后,一看,我靠,磁盘盘符都不见了(装系统时分区出来的C、D、E、F盘符都不见了)!!...我想起家里还有一台“老古董”,以后一段时间就用它来码文、码代码了。 ? 不过这台“老古董”的磁盘容量不够大,于是,我在电脑维修店买了一块硬盘。 ? ? 回到家,赶紧给“老古董”把硬盘装上。...最后,有时间我再研究下“熊猫烧香”的源码,研究它不是为了别的,而是从源码级别充分了解它的感染机制和传播机制,这样才能更好的防御网络病毒,对网络和信息安全贡献一份力量!
你谈到了你的朋友爱丽丝,这让你想起了一个关于你同事鲍勃的故事,但首先你必须解释一下你的表妹卡罗尔。你写完关于卡罗尔的故事后,继续谈论鲍勃,当你写完关于鲍勃的故事后,继续谈论爱丽丝。...在返回到调用它的b()中的行之前,它只显示d() starts和d() returns。由于b()不包含其他代码,执行返回到a()中调用b()➋ 的行。...这个程序中实际上有三个不同的变量,但令人困惑的是它们都被命名为eggs。这些变量如下: 一个名为eggs的变量,当spam()被调用时,它存在于一个局部作用域内。...如果您好奇的话,可以看一眼源代码,但是您不需要知道这些函数是如何工作的才能使用它们。因为鼓励编写没有全局变量的函数,所以通常不必担心函数的代码与程序的其他部分相互影响。...一旦缩进量达到0,我们希望缩进量再次增加。无论哪种方式,程序执行都将跳回到主程序循环的开始,再次打印星号。
所谓的“开放”就是指开放接口,也就是通过增加子类的方法来增加功能; “封闭”指的是封闭修改,也就是代码一旦提交,就不要再去修改它。...如果确实需要给一个类增加功能,我们增加一个含有新功能的类,原来的代码不要动它。 但是,在实际开发中,“封闭”是相对的,一个类写完后并不能确保它未来永远都不会被修改。...我们只需要创建一个折扣类,该类里面有一个打折函数,这个函数需要输入原价,然后它会按照“满100返50”的规则计算出折后价。...过了一阵子后,超市的需求改了: 由于超市隔三差五就要办促销活动,但每次促销活动的方式不一样,所以需要开发一个软件,营业员只要输入原价再选择活动类型后,就能计算出折扣以后的价钱。...正确的做法是,当我们发现需要增加打折功能的时候,我们将抽象出一个打折类,这个类中有一个抽象函数:discount(),然后让各种不同的打折方式类继承这个类,并重写各自的打折方式。
本文只讲一题,也是几乎所有算法书讲递归的第一题,但力争讲出花来,在这里分享四点不一样的角度,让你有不同的收获。...斐波那契数列 这题虽是老生常谈了,但相信我这里分享的一定会让你有其他收获。...没看懂的小伙伴可以看视频讲解哦~ 时间复杂度分析 如何评价一个算法的好坏? 很多问题都有多种解法,毕竟条条大路通罗马。但如何评价每种方法的优劣,我们一般是用大 O 表达式来衡量时间和空间复杂度。...我在上面?的视频里也提到了,不懂的同学往上翻看视频哦~ 优化算法 那我们就想了,为什么这么一个简简单单的运算竟然要指数级的时间复杂度?到底是为什么让时间如此之大。...回到优化算法上来,那计算机如何记笔记呢? 我们要想求 F(n),无非也就是要 记录 F(0) ~ F(n-1) 的值, 那选取一个合适的数据结构来存储就好了。
,会如何演变。...(也即当前状态仅仅与上一个状态有关),所以可以把它化简一下,得到 这就好办多了,我们把求和号代入,可以得到 最后一步看起来很玄乎,但其实就是矩阵乘法的定义。...是它的行列式为0,并且对角线和为1,所以特征值是0或1,也就是说它是一个投影矩阵,投影矩阵满足 ,因此无论怎么乘,结果都是一样的。 当然了,如果随机过程都是这种计算题,那简直是太让人开心了。...因为不可能有 的时间的状态改变结果。比方说我知道 的时候,从 开始的随机过程第一次回到 ,那么 的情况其实和我无关,不可能影响到 的情况。 当然,也可以举出“非停时”的例子。...但为了让大家熟悉这些符号,我们这里好好的写一遍公式。 如果要说明 是一个常返状态,就是要说明 。又因为 所以根据概率不能超过1的性质,不难得到结论。类似可以得到 。 现在看一下其它三个状态。
领取专属 10元无门槛券
手把手带您无忧上云