在DevOps Master中讲持续交付一课,其中讲到发布频率的篇章,中文版里面的翻译是这样的(来源于精益企业): ? 英文版本是这样的(原版书): ?...同样的位置,请注意【灰度发布】和【Dark lauching】的表述。直到有个学员不断的问我灰度发布到底是什么?我在课堂讲过,灰度发布这个术语貌似是不存在的,但 一直没有去看英文原书。...I like "dark launching", so I'll mostly use that in this post :-) 其实dark lauching,就是不改变客户端程序(变更)的情况下,...启动了新的功能,类似特性开关,当打开之后,用户变可以使用新的功能。
近一年来,我在管理中犯下的2个重要错误。该错误导致团队结构不清晰,骨干核心人员不稳定,易流失。...1、资源错配 2、逮着一个人疯狂用 目录 1、背景描述; 2、我是如何犯错的,以及我为什么犯错; 3、这两个错误带来了哪些影响; 4、规避和改进方式; 一、背景描述 成立3年的初创公司,10人编制的测试团队...团队人员结构分布是 1个经理、2个高级、3中级、4初级;组内划分是分成了3个小组,2个业务测试小组,一个测试基础小组。...组内结构划分可见下图所示: 二、我是如何犯错的,以及我为什么犯错 错误一:资源错配 对于组长的选择,以及组内骨干的选择,如下图所示: 其中标记为组长的,是在团队内部小组内被任命为小组长,标记为骨干的...两个业务小组中,初中级员工干中高级员工的活,中高级人员为相对边缘角色。这样的资源错配,直接引发了核心、骨干员工的离职率高的后果。 我为什么会这样做: 本质上是一个“谁能谁上”还是“谁上谁能”的问题。
循环中引用迭代器变量 循环迭代器变量是一个在每次循环迭代中采用不同值的单个变量。如果我们一直使用一个变量,可能会导致不可预知的行为。...4行创建了一个子Goroutine来处理一个请求,这是Go服务器程序中的一个常见做法。...不使用 -race 选项 我经常见到的一个错误是在测试 go 应用的时候没有带 -race 选项。...显然,Go 的竞争检查 (race detector) 无法解决每一个并发问题,然而它依然是一个有价值的工具,我们应当确保在做测试的时候(go test) 始终使用它。...build -race // to build the package $ go install -race pkg // to install the package 启用竞争检测器后,编译器将记录在代码中访问内存的时间和方式
最近,Github热榜冲上来一个名叫--的项目,这应该是猿妹见过的取名最随意的项目,也是目前看过的最完整的停车场系统。...停车场系统的运行流程也是比较直观的,具体如下: 这个停车系统具有以下功能特性: 兼容市面上主流的多家相机,理论上兼容所有硬件,可灵活扩展,②相机识别后数据自动上传到云端并记录,校验相机唯一id和硬件序列号...,防止非法数据录入 用户手机查询停车记录详情可自主缴费(支持微信,支付宝,银行接口支付,支持每个停车场指定不同的商户进行收款),支付后出场在免费时间内会自动抬杆。...断电断网支持岗亭人员使用app可接管硬件进行停车记录的录入。...,技术过于陈旧,没有一个规范,故个人用来接近1年的时间在业余时间开发出这种系统,现代化标准的互联网应用,定位大型物联网大数据云平台系统 该项目代码完全开源,完全自主原创,创建者已经在Linux环境中测试过
当初信誓旦旦喊着一天一篇文章,后面降到 3 天一篇,一周一篇,到了最后,恐怕连打开编辑器胡乱敲几个字的欲望都没了。当然了,我不是那种人?。...因此,在创作者打开编辑器开始写作的时候,每一分一秒都可以说是黄金时间。 那么,现在我们来思考一个问题: "通过什么方法,可以让创作者在最短时间内,效率最大化输出文字内容呢?"。...是的,这位小哥所提供的建议就是:一旦你开始写作,那就不要停,必须时刻不停的打字。一旦停下,便立刻把先前写的所有内容删得一干二净。 如此丧心病狂,你就说怕不怕吧 ? !...看到这里,相信你也跟我想的一样:有没有这么夸张啊。 因此我抱着试一试的心态打开了这个项目,体验了一下。 在进行了简单的初步体验后,我内心的真实感受是: 这样的写作方式也太 TM 刺激了吧!...这里比较重要的一点是,你能否在短时间内快速进入到写作状态。 此外,这个项目还可以通过设置创作时间和词汇数,来指定一个创作目标。只要你在指定目标内完成任务,创作的内容便不会被删除: ?
当初信誓旦旦喊着一天一篇文章,后面降到 3 天一篇,一周一篇,到了最后,恐怕连打开编辑器胡乱敲几个字的欲望都没了。当然了,我不是那种人?。...因此,在创作者打开编辑器开始写作的时候,每一分一秒都可以说是黄金时间。 那么,现在我们来思考一个问题: "通过什么方法,可以让创作者在最短时间内,效率最大化输出文字内容呢?"。...是的,这位小哥所提供的建议就是:一旦你开始写作,那就不要停,必须时刻不停的打字。一旦停下,便立刻把先前写的所有内容删得一干二净。 如此丧心病狂,你就说怕不怕吧 !...看到这里,相信你也跟我想的一样:有没有这么夸张啊。 因此我抱着试一试的心态打开了这个项目,体验了一下。 在进行了简单的初步体验后,我内心的真实感受是: 这样的写作方式也太 TM 刺激了吧!...这里比较重要的一点是,你能否在短时间内快速进入到写作状态。 此外,这个项目还可以通过设置创作时间和词汇数,来指定一个创作目标。只要你在指定目标内完成任务,创作的内容便不会被删除: ?
所谓调度器即是充当同一时间内对于多个任务进行分配,从而将任务有序列的调用执行。 我画了一张草图来辅助大家理解它的概念,假设此时 AsyncQueue 调度器同时最多支持处理两个并发任务。...= undefined; // 保存当前任务处理后的错误 this.error = undefined; } } 在 new AsyncEntry(item,callback) 中我们实例化了一个...接下里做的事情就非常简单了,我们将处理后的结果以及对应的错误保存在 entry 中,同时让 this....'); }); 检查控制台的输出如愿以偿的得到了我们想要的结果。...我希望的是当存在重复的 key 值时,我会用上一个相同 key 的处理结果来调用重复的 callback 即可,完全没有必要重新在进入队列处理一次。
和其他人一样,我在这条职业道路上也犯过不少错误。一般来说,我不会在犯错的当时就意识到自己做错了什么事情;我往往是在接触了正确的做事方式之后才知道自己之前的路走岔了。...但是随着代码库的增长,那些自制的列表本身就变成了一个个怪物。因为我可以很容易地修改代码,所以我会经常介入并改变一个方法的行为以适应我的需求,这又导致了后来的诸多混乱和错误。...5没有自动构建 应用程序部署和打包工作相对来说比编写代码更容易一些,所以我把这两件事情放在了很低的优先级上。很快,我就收到了所有人的抱怨,他们都说构建无法正常工作。“缺少先决条件,如何解决这个问题?”...6过分依赖视觉检查和调试 做出一个表格并显示你的输出是非常容易的事情。而且 Visual Studio 是如此强大,以至于人们可以轻松地一步步检查代码并即时检查代码中的值。...这样做的结果是我的应用程序变成了一个怪物(没有关注点分离、难以重构和完全无法维护的代码库)。 曾经有一段时间,我害怕对我的代码进行哪怕是最轻微的修改,因为任何更改都可能会,也可能不会导致破坏性更改。
作者 | 青暮 编辑 | 陈彩娴 “我认为现在是一个很好的时期,中国的计算理论已经有了很好的基础,在许多方向上站在了世界前沿。”...“计算理论的受众是很小的,在某种意义上,很多重要的研究方向都是小众课题。”邓老师提到,他们在这次会议中了解到,中国在计算理论方面做了很多优秀的工作,因此受到了鼓舞。...邓老师表示,“我们从对方那里找到了不少可以学习和借鉴的地方,我认为,不同的会议之间要有一个相互支持的关系。”...尽管有人说,现在的计算理论领域处于一个瓶颈状态,但邓老师不那么认为,“我认为现在是一个很好的时期。我们已经有了基础,而且与实际应用的相互推动上出现了很大的空间。”...作为一个理论计算机科学研究者,他说道,“我们也从国内重要的科技企业得到了在他们发展关键时刻开展合作研究的很好机会。其他一些团队也得到了这样的宝贵合作机会,使得我们的理论研究有了独特思路。
在实际开发过程中我踩到了mybatis的一个坑,我觉得值得记录、分享一下。 先说说这个坑是什么吧。如果你踩过这个坑,并且知道具体的原因,那这篇文章可以加深你的印象。...常规的方法是加断点进行追踪,但是我想分享一个我当时排查的"骚"操作,定位问题非常快。那就是逆向排查。 逆向排查法 现在我们确定了是sql拼接的问题,我通过日志,也拿到了完整的sql。...在这个地方,我整个sql都拿到了,如果往回走,就能很快的找到sql是在哪里产生的。 那我在BaseJdbcLogger的143行,打上断点,并运行起来。...是的,我无脑的使用了CV大法。导致我在欢声笑语中写出了bug。我orderStatus传入的类型是一个Byte,和""做判断有任何意义吗?...最后说一句 在解决这个问题之后,我还是在网上查了一圈,发现也有人遇到了这样的问题,但是我点开搜索出来的第一篇就是一个错误的描述,他说在mybatis中会把0当做null来处理?哥们你看源码了吗?
这是why技术的第14篇原创文章 在实际开发过程中我踩到了mybatis的一个坑,我觉得值得记录、分享一下。 先说说这个坑是什么吧。...常规的方法是加断点进行追踪,但是我想分享一个我当时排查的"骚"操作,定位问题非常快。那就是逆向排查。 逆向排查法 现在我们确定了是sql拼接的问题,我通过日志,也拿到了完整的sql。...在这个地方,我整个sql都拿到了,如果往回走,就能很快的找到sql是在哪里产生的。 那我在BaseJdbcLogger的143行,打上断点,并运行起来。...是的,我无脑的使用了CV大法。导致我在欢声笑语中写出了bug。我orderStatus传入的类型是一个Byte,和""做判断有任何意义吗?...最后说几句 在解决这个问题之后,我还是在网上查了一圈,发现也有人遇到了这样的问题,但是我点开搜索出来的第一篇就是一个错误的描述,他说在mybatis中会把0当做null来处理?哥们你看源码了吗?
你好,我是雨乐~ 在上篇文章访问私有变量——从技术实现的角度破坏"封装"性一文中,在第二个实现示例中,用到了inline 变量,一开始,是懵逼的,因为在我的印象中inline 仅仅函数,而在此处却用于声明变量...不过,为了研究那段代码,还是仔细研究了下,不看不要紧,一看吓一跳,原来我对inline的理解停留在n年前。于是赶紧恶补这方面的知识,而这篇文章呢,就是我最近研究的一个知识点总结。...以上,就是我对inline的理解,也就是说在之前,我的错误理解是inline作用仅限于inline function,即编译时进行指令替换。...C++程序通常由多个C++源文件组成(.cc/.cpp等),编译器在进行编译的时候,通常是将这些文件单独编译成模块或者目标文件,然后通过链接器将所有模块/目标文件链接到一个可执行文件或共享/静态库中。...编译器在编译的时候,只针对当前Translation Unit,也就是说编译器无法访问本翻译单元之外的目标文件(也就是说在编译当前文件的时候,不能查找之前的已经编译完成的目标文件是否有该函数定义),因此这种错误往往暴露在链接阶段
他们在命令行窗口,看到了程序的输出 First line: hello, Rust 3 C++代码讲解 见贾克强讲完了Rust代码,席双嘉转向自己的C++代码,并开始讲解。...席双嘉创建了一个有两行文字的hello.txt文件,然后运行程序。他们在屏幕上看到了输出。...异常,在main()函数中,没有显式捕获,难道C++编译器不报错吗?」...在 Rust 中,错误处理的机制与 C++ 的异常处理机制是不同的。」 「Rust 使用 Result 和 Option 类型来处理可能出现的错误和空值,而不是抛出异常。」...或许,是时候拓宽我的技术视野了。我得承认,Rust 在帮助避免这类错误上真的做得更棒。我开始考虑,是不是该花点时间深入了解下 Rust 了。」
本文摘要:本文已解决 Python FileNotFoundError 的相关报错问题,并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。...一、Bug描述 C2440错误表示编译器无法隐式地将一个const char数组转换为一个char类型的指针。...在C++中,const char[]表示一个常量字符数组,而char是一个字符指针,指向可以修改的字符。编译器不允许这种转换,以防止对常量数据的潜在修改。...但是很多朋友说 vs2016中代码可以用,但是到了vs2017就不行了,这该怎么办呢。 二、定位报错原因 类型不匹配:尝试将一个常量字符数组赋值给一个非const的字符指针。...意图不明确:代码可能需要一个指向可修改字符的指针,但却错误地声明了一个常量字符数组。 编码习惯:在某些情况下,开发者可能习惯性地使用字符数组而没有意识到const的约束。
Abhinav Gupta 是我们的来自 Go 平台团队的同事,其实他描述得比我好:我理解我们只是在使用 Zig 的 C 工具链,而不是将其作为语言使用。...在 Bazel 中创建一个封闭式的 C++ 工具链是一项很大的工作(对于我们的 Go Monorepo 来说,需要花费数月时间),没有迫切的需求,也没有足够的痛苦,我们还无法接受做这样一件事。...我花了几个晚上基于 musl.cc 创建了一个 Bazel 工具链,但没走多远,因为当时我无法深入理解 Bazel 的工具链文档,而且也没有找到一个好的示例可以参照。...由于我们大部分的底层基础设施都在 Go Monorepo 中,我首先需要一个交叉编译器。 我终于有了一个实现交叉编译器的商业理由。现在,时间和金钱都可以投入了。...依赖开发者笔记本电脑上的系统编译器是不可取的,Go 平台团队亲身感受到了这一点,尤其是在 macOS 升级期间。
大家好,距离上一次更新已经过去一个多月了。前段时间是秋招时期,所以本人也是在忙着找工作、笔试、面试什么的,所幸有之前学习的内容做支撑,还算比较顺利找到了一份软件开发的工作。...在多次的面试和笔试当中也收获了许多的经验,日后如果有时间,我也将分享一些有意思的东西。 好了,废话少说,回归到今天的主题。今天想要分享的是内联函数和宏定义。在我的某次笔试中也出现过一次。...内联函数是在函数前加上inline关键字,这样的函数就被声明为内联函数,inline是C++的关键字,C语言本身是不支持内联函数的,但是后来在C99标准中支持了内联函数,当然,具体在C语言中能不能用和编译器也有关系...因为使用宏定义有时会产生意想不到的错误,这也是笔试题中经常考的地方。 什么错误呢?来看下面的例子,只是在上面的例子上多乘一个2....1、inline函数在第一次被调用前必须进行完整的定义,否则编译器无法知道应该插入什么代码。
在这种历史背景下,在C语言的基础上开发C++也是有道理的。 40年后,C和C++都在行业中得到了广泛使用。...在C看来,这些惯用写法可能问题不大,但在C++中可不行。C++具有更强大的类型系统,不幸的是,C的惯用写法在这个类型系统中凿了一个洞,因此实现C的兼容性需要在安全性方面付出代价。...在C++20中,指定的初始化器就受到了C的启发,但采取了略微不同的规则,因为如果完全一样的话就不符合C++的初始化规则。 对于这个问题,我也有责任。C有VLA。...如果当时我在,我一定会反对在标准C++中采用它,因为它导致了太多安全性问题。我也会坚决反对将_Generic添加到C++中的提议。...两种语言的设计支柱可能都不协调。我会努力建议提供一个模板。但是首先我得吐槽C语言没有模块、没有命名空间,以及整个宏是什么玩意儿。 也许可以将C++能接受的C子集约束在C99上?
后来学到web编程,我自己搭建的环境总是报错,而且还是jar包的错误。从这个时候起,我对java就没什么好感。...java强制使用面向对应,一切都定义在类中,但是程序必须要一个入口函数。根据java的逻辑,这个main函数也得定义到类中。但是如果定义成普通函数的话行不行呢。...基于这几点理由,开发出了Java,Java脱胎于C++,但是砍掉了C++中复杂的指针和多继承的内容,在现在看来应该是一个比较正确的决定。...int,在最后进行结果赋值的时候将int赋值为short会发生错误。...在C/C++中如果你写上面的一段代码,在release版本中,你看不到类似 mov eax, 5 add eax, 10 mov n, eax 这样的机器指令,只看得到 mov n, 15 这里编译器进行了优化
在大多数情况下,你都可以预见到编译的结果,即对象在内存中的表示方式,以及如何通过不同的方式理解编译后的结果(新版 C 标准中这一点变得更困难,这都要怪 C++,我稍后再详细介绍)。...一方面,C++建立在 C 之上,从而得到了极大的发展;另一方面,如果 C++中没有 C 遗留下来的大多数功能的话,情况可能会更好(当然,C++曾设法通过淘汰的方式逐步放弃某些 C 功能,但对于旧功能的支持仍然存在...虽然我也没有遵循标准的开发程序,但是我很确定 C99 及其后版本中令人讨厌的诸多功能皆来自那些编译器开发人员。他们只从 C++的角度出发考虑,而且还将这些功能强加给了 C,还美其名曰简化编译器。...例如,无法使用两个不同类型的指针同时操作同一块内存区域。我无法想象为什么这种行为被禁止,其原因只可能是编译器优化。这样就不可能利用联合体将整数转换成浮点数。...另一方面,我对C++强烈的不满来自其在设计上的选择,而且这些设计影响了C标准和编译器。
领取专属 10元无门槛券
手把手带您无忧上云