难得的是,他本身是一线的iOS开发者,同时又对iOS开发在国内的布道做了不少的工作,身影活跃于博客、微博、微信公众账号等地。...多写就没什么好说了,没有写过几十万行代码是不能算熟悉一门语言的。...我个人对于 Swift 的预期是:在 1、2 年内能够全面替代 Objective-C。但在近期,我个人还是会使用 Objective-C 来完成公司的项目。 ...你只有先做好自己分内的事,才有机会去顾暇别人的事。 1.保持一个良好的代码规范以及文件架构。 ...多写就没什么好说了,没有写过几十万行代码是不能算熟悉一门语言的。
你是否曾经用 TypeScript 写代码,然后意识到这个包没有导出我需要的类型,例如下面这段代码提示 Content 在 @example 中不存在: import {getContent, Content...例如,下面我有一个编辑日历事件的简单组件,我们在其中维护一个处于状态的事件对象,并在发生变化时修改事件标题。 你能发现下面这段代码中的错误吗?...这将导致我们的输入不能像预期的那样工作,因为 React 不会意识到状态的变化,因此不会呈现变化。 我们需要做的是用一个新对象调用 setEvent。...那你可能突然会问:为什么 TypeScript 没有捕捉到这个错误呢? 从技术上讲,你可以用 useState 改变对象。...,我们可以把它和它的兄弟类型 ArrayReadonly 结合起来,再加上一点魔法,创建我们自己的 DeepReadonly 类型,像这样: export type DeepReadonly =
但是为什么只打印了1个出来呢,不是应该打印5个吗?...image.png 所以,我们知道,我们把代码贴到console控制台上去执行的时候,实际上基本上等价于。...,eval返回值的规则,如果你不知道,可以在这里了解eval() - JavaScript | MDN image.png 因为,回到我们的最初代码 for(var i=1;i<=5;i++){...但是,我想说的是,这个说了这么多,只是一个插曲而已,本文的重点不是这个,就上述这段代码,我们的本意是想让它打印1.2.3.4.5的,结果你给我5个6。那么,改为下面这个方式呢?...下不要看下面的答案,同样,你自己感受一下。 没错,同样的道理,并不符合我们的预期。
如果在小红书有个同事非要执意这样写代码,理由是“你多读个两三遍不就好了嘛?”我想我只能把他开除了。 其实,如果一段代码需要你多读个两三遍才能很好的理解,这本身不就说明,这段代码的可读性不高吗?...在比较两种不同的风格的可读性的时候,你不能用具体的某一个一次性的片段来说明。 另外,这篇文章还暗含了这样一个观点,那就是,代码的可读性,仅仅是指,看到一段代码,能不能理解这段代码的含义。...要理解这段代码并不难(其实后面你会看到,要确保正确理解这么代码也没那么简单),但是速度并不快,你必须从头到尾看完这8行代码,就算你说最后两行可以一扫而过,那也必须看完前面6行,你才能知道“哦,原来这段代码做的事情是...因为它带来的心理上的relief,是巨大的。我们看以下里面的代码。 如果你写了个自定义Layout继承自,结果它表现出来的样子不符合你的预期,你可能会去看源码。...看到上面这段,最后你发现,原来是这个成员变量的值不对。那么,你怎么知道是哪里改变了这个变量的值,导致它被赋给了一个错误的值呢?
并且作者举了一个在我看来,不知道该怎么来描述的例子: 这个作者的大意是,上面这段文章,你多读个两三遍,你也会很快的理解它的意思,所以“对于熟练的读者而言,外观很少会成为可读性的障碍。”...如果在小红书有个同事非要执意这样写代码,理由是“你多读个两三遍不就好了嘛?”我想我只能把他开除了。 其实,如果一段代码需要你多读个两三遍才能很好的理解,这本身不就说明,这段代码的可读性不高吗?...在比较两种不同的风格的可读性的时候,你不能用具体的某一个一次性的片段来说明。 另外,这篇文章还暗含了这样一个观点,那就是,代码的可读性,仅仅是指,看到一段代码,能不能理解这段代码的含义。...要理解这段代码并不难(其实后面你会看到,要确保正确理解这么代码也没那么简单),但是速度并不快,你必须从头到尾看完这 8 行代码,就算你说最后两行可以一扫而过,那也必须看完前面 6 行,你才能知道“哦,原来这段代码做的事情是...如果你写了个自定义 Layout 继承自 LinearLayout,结果它表现出来的样子不符合你的预期,你可能会去看源码。
大家都知道我们行业女生是不多得,这段时间我帮助了一位女生,毕业4年,数据仓库,在上海,她的机会多的让我产生了好奇,多到什么程度那?一周平均每天一个机会,有的时候一天能面试三家公司?...就比如离职理由来讲,“我不喜欢出差” 你说我们说的是实话吗?这个合理吗?对于30,40岁的人来说,肯定是合理的。但是对于面试官,特别是做管理的面试官,他是不能接受的。因为这是态度问题。...所以面试就要说面试的话,而不是像私底下聊天那样,要分场合。 4.面试都要说实话 很多人以为面试都要说实话,我们提倡说实话,鼓励说实话,而且说实话的人,人品肯定是没问题的。...但是有些说实话,在面试中是不能接受的,说出来就是你态度问题,就比如我们上面提到的离职理由。再比如大数据来说,很多公司都有大数据,可是有的公司就几台机器,你说你得大数据经验上得了台面吗?...我们很多人知道面试,其实很多人造假,你以为造假,面试官瞎吗?他看不到吗?面试官知道造假为啥有的毕业生还是会给offer?
什么情况下,访问数据是不安全的?如何知道你的代码是否线程安全?要如何访问数据才能保证数据的安全? 本篇文章会一一回答你的问题。 1. 线程不安全是怎样的? ...当我们还是无法确定我们的代码是否具有原子性的时候,可以尝试通过 dis 模块里的 dis 函数来查看 当我们执行这段代码时,可以看到 number += 1 这一行代码,由两条字节码实现。 ...实现人工原子操作 在多线程下,我们并不能保证我们的代码都具有原子性,因此如何让我们的代码变得具有 “原子性” ,就是一件很重要的事。 ...为什么 Queue 是线程安全的? Python 的 模块里的消息通信机制主要有如下三种: 使用最多的是 Queue,而我们都知道它是线程安全的。...其根本原因就是 Queue 实现了锁原语,因此他能像第三节那样实现人工原子操作。
2014年洛杉矶会议上的演讲。在这段21分33秒的演讲中,Matt 回顾了自己在伦敦大投行的工作经历(雷曼兄弟以及所罗门兄弟)、自己与 R 的偶遇以及开发 data.table 的动机。...Matt 说着输入了以下代码: DF[2:3, sum(B)] # 3+5=8 Pat:啊亲爱的朋友,你不能这样做。 Matt:Why?...Matt 后来经过了多次尝试,返回的永远都是错误: object "B" not found Pat:我早和你说了,那样做不行,放弃挣扎吧年轻人。 Matt:我们能让 S-PLUS 改吗?...那你们能把代码发给我吗?我来修复它——我不要报酬,我只想让完成我的工作。 客服:很抱歉,我们不能这样做。律师说 No。 Matt:那你有什么别的建议吗? 客服:你说过 R 吗?...我后来才知道,原来早在12年前(这是2014年的演讲), R 已经大大提高了 for 循环的速度,并且把所有的数据都保存在内存中,而不是放在硬盘上。 更重要的是,R 在运行这段程序的时候不再闪退了。
大家简单过一下前一天的进度,以及今天的安排,然后就是各忙各的。 创业公司因为人比较少,不像大公司分工那么细,所以对个人综合能力要求比较高一些,因为碰到一些问题,不能像大公司那样互相推诿。...除了帮助写代码,还可以像 Cursor 问一些技术上的问题,比如: Q: 可以传一个模拟设备给QAudioInput吗?...你不能直接将一个模拟设备(如一个文件或一个缓冲区)传递给QAudioInput。 然而,你可以创建一个自定义的类来模拟QAudioInput的行为,如我之前所示的那样。...这样,你的上层调用者可以像使用QAudioInput一样使用你的类,而不需要知道它实际上是一个模拟的音频设备。...更神奇的是,写出的代码还有注释,代码后面还有对这段代码的说明,真的是贴心到家了。 在工作中,借助一些 AI 工具,无疑能大大提供我们工作的效率。但要说 AI 能取代程序员,还为时尚早。
但是现在的prefetch 效果有多糟糕我想你也知道。例如,为了让应用程序拆解成多个包,在你的代码的某些地方,你会进行动态导入,比如 import('./some-dependency.js')。...下面这段代码中,假设你将代码放在惰性加载块后面的 Buy 按钮后面,看起来像这样:export default () => { return ( 但是这段代码真的会如你所愿吗?...你也不太确定,因此接着,你在 Chrome 中测试它,发现一切都能正常工作。但是很快,你就会得到反馈,在许多情况下,用户必须等待 Buy 按钮执行其操作。这种额外的等待正是损害用户体验的底线。...那 prefetch 为什么不能如你所愿呢? 原因主要由几点:Modulepreload 不能在大多数浏览器中使用。
但是现在的prefetch 效果有多糟糕我想你也知道。 例如,为了让应用程序拆解成多个包,在你的代码的某些地方,你会进行动态导入,比如 import('./some-dependency.js')。...下面这段代码中,假设你将代码放在惰性加载块后面的 Buy 按钮后面,看起来像这样: export default () => { return ( 但是这段代码真的会如你所愿吗?...你也不太确定,因此接着,你在 Chrome 中测试它,发现一切都能正常工作。 但是很快,你就会得到反馈,在许多情况下,用户必须等待 Buy 按钮执行其操作。这种额外的等待正是损害用户体验的底线。...那 prefetch 为什么不能如你所愿呢? 原因主要由几点: Modulepreload 不能在大多数浏览器中使用。
尤其是当你来自于一个无聊的工作或像钉马掌这样永远不变的事情时 =-)。...3) 面对压力、紧张和限定期限 ---- 没错,每个人都喜欢使用软件,但你喜欢面对任务的最后期限和最终目标吗?需要什么时候完成?做完这些要花多少时间?我们能在这段时间里完成更多的任务吗?...你是否喜欢想出办法来替你完成那些重复的工作?你能很好的安排各种不同的任务吗?如果不能,那你就不适合去当一名程序员。...这个应用的工作原理是什么?那个横跨街道的建筑是怎么建起来的?程序员之间的对话听起来总是像这样开始的:“很奇怪他们为什么要这样做…?”...以前我以为问这么多为什么是很奇怪的表现,但现在我明白,至少是在软件开发中,这是一个好的品质。 ««« 不明白的事情会引起你的好奇心吗?新事物会让你兴奋的想搞清楚它的原理吗?
尤其是当你来自于一个无聊的工作或像钉马掌这样永远不变的事情时=-)。...3) 面对压力、紧张和限定期限 没错,每个人都喜欢使用软件,但你喜欢面对任务的最后期限和最终目标吗?需要什么时候完成?做完这些要花多少时间?我们能在这段时间里完成更多的任 务吗?...你是否喜欢想出办法来替你完成那些重复的工作?你能很好的安排各种不同的任务吗?如果不能,那你就不适合去当一名程序员。...这个应用的工作原理是什么?那个横跨街道的建筑是怎么建起来的?程序员之间的对话听起来总是像这样开始的:“很奇怪 他们为什么要这样做…?”...以前我以为问这么多为什么是很奇怪的表现,但现在我明白,至少是在软件开发中,这是一个好的品质。 ««« 不明白的事情会引起你的好奇心吗?新事物会让你兴奋的想搞清楚它的原理吗?
众所周知,程序员们不能无电脑操作徒手写代码,但有很多公司却忽视了心境的重要性——两者缺任何一个都不现实。 接下来我们剖析一下,对开发者而言,哪12件事情会阻碍TA们的工作状态和延缓生产力。...开发者往往会启动TA们觉得合适的功能,但一旦管理人员更详细地说明了预期的功能,TA们可能会逼不得已从头再看。 不清晰的工作优先级也属于这一类行为。...可惜的是,许多程序员错误地把这句话理解为,TA们必须对每一行代码都进行注释,这就是为什么我们经常看到下面这样的代码(取自于美国著名程序员Jeff Atwood发表的“无注释编码”的博客文章)。...than t while (abs( r — (n/r) ) > t ){ r = 0.5 * ( r + (n/r) ); // Set r to half of r + (n/r) } 你知道这段代码是干什么的吗...我也不知道。问题是虽然有大量的注释描述代码,但没有任何注释描述它为什么要这么做。如果程序中存在一个bug,而你偶然发现了这段代码,你将茫然不知从何下手。
从小脚本到庞大的Web应用程序,它都会显现出来。 提高水平:解读 this 意味着你正在走向像经验丰富的专家那样的编码。这是更接近健壮且无错误的脚本的一步。...在浏览器中: 如果你在浏览器中运行你的 JavaScript 代码(像我们大多数人经常做的那样),全局上下文中的this指的是window对象。这是因为,在浏览器中,window 对象就是全局对象。...这都是关于你来自哪里的 你知道在生活中,我们中的一些人根据我们所在的地方和我们与谁在一起会戴不同的帽子吗?常规函数也做类似的事情与 this。...你在一个网页上,你最喜欢的歌正在播放,有一个按钮在那里诱惑你点击它。在你知道之前,JavaScript的魔法就活了起来,事情开始发生。但你有没有想过内部工作,使这些DOM元素跳舞的隐藏的木偶线?...这不会按预期工作。 } }; person.greet(); // 输出:Hello, undefined 动态方法:当你动态地添加方法到一个对象时,确保你知道this引用的是什么。
安排的明明白白! 所以无论异常是从常规函数还是从类构造函数(或从方法)抛出的,一切都会按照预期工作。 但是如果我想从异步函数中抛出错误怎么办? 我可以在测试中使用assert.throws吗?...测试异常 所以你应该知道什么是 Javascript 的异步函数,对吗?先看一段代码: ? 假设你要添加异步方法来获取有关该人的数据。这种方法需要一个网址。...如果url不是字符串,就要像上一个例子中那样抛出错误。 先来修改一下这个类: ? 如果我运行代码会怎么样?试试吧: ? 结果是这样 ?...被拒绝的Promise将会在堆栈中传播,除非你抓住(catch)它。 至于测试代码,应该这样写: ? 我们测试的不能是普通的异常,而是带有TypeError的rejects。 现在测试通过了: ?...记住:被拒绝的Promise会在堆栈中传播,除非你抓住(catch)它。 要在 try/catch 中正确捕获错误,可以像这样重构: ? 这就是它的工作原理。
这段代码有什么问题?函数名称隐藏了很多关于它所做的事情的细节。它根本没有提到我们必须获取机器或设置工作人员,也没有提到该函数将导致创建一个在后台继续执行的作业。...一个好的名字会告诉你所有需要知道的,或者会告诉你足够的信息让你知道下一步应该去哪里查找。它不会让你猜测,或者困惑。它不会误导你。一个好的名字是明显的,是可以预期的。它是一致的。不会过于创新。...如果你不喜欢你找到的名字,那意味着你不喜欢你所命名的事物,你应该通过改进你的代码设计来改变这个事物(就像我们在第二个例子中所做的那样)。...有时候你不能,因为有些东西不能在代码中捕捉到(例如,某些假设,解释,例子,...),这也是可以的。但是不要在注释中重复你可以在代码中说的内容。...以命名为重点的代码审查一旦你开始深思熟虑地命名,你会看到它是如何改变你的代码审查过程的:焦点从查看实现细节转移到首先查看名称。当我在进行代码审查时,我会有一个主要的思考:“这个名字清晰吗?”。
尤其是当你来自于一个无聊的工作或像钉马掌这样永远不变的事情时 =-)。...3) 面对压力、紧张和限定期限 没错,每个人都喜欢使用软件,但你喜欢面对任务的最后期限和最终目标吗?需要什么时候完成?做完这些要花多少时间?我们能在这段时间里完成更多的任务吗?是否还记得要注意细节?...你是否喜欢想出办法来替你完成那些重复的工作?你能很好的安排各种不同的任务吗?如果不能,那你就不适合去当一名程序员。...这个应用的工作原理是什么?那个横跨街道的建筑是怎么建起来的?程序员之间的对话听起来总是像这样开始的:“很奇怪他们为什么要这样做…?”...以前我以为问这么多为什么是很奇怪的表现,但现在我明白,至少是在软件开发中,这是一个好的品质。 ««« 不明白的事情会引起你的好奇心吗?新事物会让你兴奋的想搞清楚它的原理吗?
给出我的解决方法,不一定对你的症,也不一定对我下一次的症。但至少,我把病根抓出来晾晒。 前面的所有工作都不说了,最终我发现是由于内存被占满导致无法正常进入图形界面的。...发现是由于猜想,但是毕竟是猜想,我发现只有几百M的内存了,但是我不知道是不是那个原因。于是我把内存扩容,并压缩,给它2G的内存,但它还是打不开,我不确定是否是由于内存不足。...回想起今天有内存不足的警告,我确定了,就是内存不足。 ---- 现在看上面这段话是不是像讲故事一样,排查过程的辛酸只有自己知道。...我去看了,原创作者是那样解决了,底下一堆评论问为什么他们那样做不能解决。那不是废话吗,环境都不一样。至于网上其他抄袭的底下根本没评论。跟着做大概率是不行的。...还有一些测试代码,由于是debug版本的,所以也有点大,清理之后腾出来两三G的空间。 这时候就够用了,别再删了,估计能勉强开机就好。
所以我准备写篇文章来剖析一下这个关键字,顺便回答一下这些朋友的疑问。 由于这篇文章是我用周日一天时间赶出来的,所以可能不会像平时的文章那样充实,但是对于上述问题我相信还是可以解释清楚的。...理论上来说,这两个线程同时运行,那么就应该一直交替打印,你改我的值,我再给你改回去。 实际上真的会是这样吗?我们来运行一下就知道了。 ?...一切如我们所预期的那样运行了。 指令重排问题 volatile关键字还有另外一个重要的作用,就是禁止指令重排,这又是一个非常有趣的问题。...那么这段代码可以正常工作吗?未必,因为根据刚才的指令重排理论,Thread1中value和init这两个变量之间是没有先后顺序的。...根据我的实际测试,确实基本上都是可以正常工作的。 但是这种写法真的安全吗?
领取专属 10元无门槛券
手把手带您无忧上云