Everything you care about in one place

Follow feeds: blogs, news, RSS and more. An effortless way to read and digest content of your choice.

Get Feeder

coolshell.cn

酷 壳 – CoolShell

Get the latest updates from 酷 壳 – CoolShell directly as they happen.

Follow now 678 followers

Latest posts

Last updated 3 months ago

程序员如何把控自己的职业

3 months ago

这篇文章的主要内容主要是我今年3月份在腾讯做的直播,主要是想让一些技术人员对世界有一个大体的认识,并且在这个认识下能够有一个好的方法成就自己。而不是在一脸蒙圈的状态下随波逐流,而日益迷茫和焦虑。直播完后,腾讯方面把我的直播形成文字的形式发了出来,我觉得我可以再做一个精编版。所以,有了这篇文章,希望对大家有帮助。 对我来说,在我二十多年的工作经历来看,期间经历了很多技术的更新换代,整个技术模式、业务模式也是一直变来变去,我们这群老程序员成长中所经历的技术比今天的程序员玩的还更杂更多。我罗列一下我学过的,而且还被淘汰掉的技术,大家先感受一下。 - MIS应用开发:FoxPro,PowerBuilder,Delphi - OA:Lotus Notes,VBScripts - 微软:ODBC/ADO,COM/DCOM,MFC/ATL,J++ - 服务器:AIX,HP-UX,SCO Unix...

https://coolshell.cn/articles/21025.html

4 months ago

asdfasdf asdf asdfa sdfasdf asdf asdfasdf asdfasdf   <pre class=”EnlighterJSRAW” data-enlighter-language=”c” data-enlighter-highlight=” 关注CoolShell微信公众账号和微信小程序...

计时攻击 Timing Attacks

4 months ago

本文来自读者“程序猿石头”的投稿文章《这 10 行比较字符串相等的代码给我整懵了,不信你也来看看》,原文写的很好,但不够直接了当,信息密度不够高,所以我对原文进行大量的删减、裁剪、改写和添加,主要删除了一些没有信息的段落,主要加入了如何实施计时攻击相关的其它内容,让这篇文章中的知识更系统一些,并且还指出了其它的一些问题。所以,我把标题也改成了《计时攻击》。 另类的字符串比较 在 Java 的 Play Framework 里有一段代码用来验证cookie(session)中的数据是否合法(包含签名的验证)的代码,如下所示: boolean safeEqual(String...

Rust语言的编程范式

7 months ago

总是有很多很多人来问我对Rust语言怎么看的问题,在各种地方被at,其实,我不是很想表达我的想法。因为在不同的角度,你会看到不同的东西。编程语言这个东西,老实说很难评价,在学术上来说,Lisp就是很好的语言,然而在工程使用的时候,你会发现Lisp没什么人用,而Javascript或是PHP这样在学术很糟糕设计的语言反而成了主流,你觉得C++很反人类,在我看来,C++有很多不错的设计,而且对于了解编程语言和编译器的和原理非常有帮助。但是C++也很危险,所以,出现在像Java或Go 语言来改善它,Rust本质上也是在改善C++的。他们各自都有各自的长处和优势。 因为各个语言都有好有不好,因此,我不想用别的语言来说Rust的问题,或是把Rust吹成朵花以打压别的语言,写成这样的文章,是很没有营养的事。本文主要想通过Rust的语言设计来看看编程中的一些挑战,尤其是Rust重要的一些编程范式,这样反而更有意义一些,因为这样你才可能一通百通。 这篇文章的篇幅比较长,而且有很多代码,信息量可能会非常大,所以,在读本文前,你需要有如下的知识准备: 你对C++语言的一些特性和问题比较熟悉。尤其是:指针、引用、右值move、内存对象管理、泛型编程、智能指针…… 当然,你还要略懂Rust,不懂也没太大关系,但本文不会是Rust的教程文章,可以参看“Rust的官方教程”(中文版) 因为本文太长,所以,我有必要写上 TL;DR —— Java 与 Rust...

与程序员相关的CPU缓存知识

8 months ago

好久没有写一些微观方面的文章了,今天写一篇关于CPU Cache相关的文章,这篇文章会讲述一些多核 CPU 的系统架构以及其原理,包括对程序性能上的影响,以及在进行并发编程的时候需要注意到的一些问题。这篇文章我会尽量地写简单和通俗易懂一些,主要是讲清楚相关的原理和问题,而对于一些细节和延伸阅读我会在文章最好给出相关的资源。 本文比较长,主要分成这么几个部分:基础知识、缓存的命中、缓存的一致性、相关的代码示例和延伸阅读。 因为无论你写什么样的代码都会交给CPU来执行,所以,如果你想写出性能比较高的代码,这篇文章中的技术还是应该认真学习的。 基础知识 首先,我们都知道现在的CPU多核技术,都会有几级缓存,老的CPU会有两级内存(L1和L2),新的CPU会有三级内存(L1,L2,L3 ),如下图所示: 其中: L1缓分成两种,一种是指令缓存,一种是数???缓存。L2缓存和L3缓存不分指令和数据。 L1和L2缓存在第一个CPU核中,L3则是所有CPU核心共享的内存。...

MegaEase的远程工作文化

9 months ago

MegaEase 是我创业的公司,主要是想把云计算(PaaS/SaaS层)的那些高可用高并发的分布式技术普及到那需要对技术自主可控的公司,这样就不需要去使用不能自主可控的闭源系统或是大公司的云平台。我于2016年开始成立MegaEase,从早期8个人,直到今天有20来个人,我们从一开始到今天都是在远程工作的公司文化。因为我很喜欢《Rework》这本书,写这本书的公司叫37signal(现名basecamp),这家公司在发《Rework》这本书的时候,整个公司只有16个人,分布在全世界8个城市,这种Geek的公司的文化很吸引我,所以,在我决定创业的时候,我就止不住地想成立这样能够远程工作的公司,于是,远程工作的团队文化就这样成为了MegaEase的基因。下面我会分享一下,我们公司的远程工作文化和其中的一些问题,最后还有一个工作协议。 我们在早期的时候,8个员工来自5个城市,现在的20来个员工来自8个城市2个国家。虽然我们现在使用“共享办公室”,但是本质上,我们的整个文化是远程工作的文化。在2017-2018年度,我们公司产品商业化以来,公司早期的8个工程师在远程工作的状态下成功支持了得到的老罗的跨年演讲活动,以及其它几个客户,一方面验证了用户愿意付费购???我们的产品和服务之后,另一方面也有一些不错的收入,客单价都在百万左右。还记得当时,有几个投资人并不相信我们连个办公室都没有,而且8个人分布在5个城市,觉得我们是个骗子公司(哈哈)。在过去的一年,我们通过我们的产品和服务帮助银行电信互联网等公司进行了他们的系统架构的改造和升级,让复杂和高门槛的分布式技术和架构可以被更多的企业所掌握所应用。这说明,远程工作是没有什么问题的。实际上远程团队远程工作真的不新鲜,Github上有个Repo维护着一个支持远程工作的公司列表,还有一个跟远程工作相关的Awesome索引。 当然,自从我创业以来,我身边就一直有好些不同的声音质疑远程工作。听过他们的理由后,我能够理解他们的疑虑和困惑,因为管理的确是一个很复杂的事,因为要面对的是极为复杂的人,所以,有这些疑虑也是正常的。下面是我的一些经验和分享。先说宏观管理,再说微观实践。 宏观管理 我发现很多人比较质疑远程工作的原因,更多的是表现在对宏观的管理上有问题。所以,我还是想先说一下宏观管理,这其实并不分远程办公还是集中式办公,如果能够解决好些这管理上的根本问题,其实,远程不远程都无所谓了。只不过,这些问题在“远程办室”的场景更更突显罢了。 一、努力找到好的人 团队管理的头等大事是找人,没有之一。很多人都会跟我说,你的这种远程团队需要很好的人。是的,没错,人很关键。远程团队需要的人的一般需要有这些特质: 能独挡一面的人。这样交给他的事能独立完成,没有路能自己找路,这样可以省很多管理成本。 沟通能力很强的人。一方面,他们把模糊的事能变清楚,另一方面,他能有效地说服他人。不然就会非常扯皮和消耗时间。 能自管理和自驱动。不能自管理和自驱的人,会增加大量的管理和教育成本。能自驱动的人,都是对负责的事情有认同的人。 如果你仔细思考一下,你会发现,这样的人是任何一家公司所渴望的人,和远不远程无关。只不过,如果是远程团队的话,你会被逼着要招到这样的人。...

使用简单的逻辑方法进行独立思考

10 months ago

这是一个非常复杂的世界,这个世界上有很多各式各样的观点和思维方式,作为一个程序员的我,也会有程序员的思维方式,程序员的思维方式更接近数学的思维方式,数学的思维方式让可以很容易地理清楚这个混乱的世界,其实,并不需要太复杂的数学逻辑,只需要使用一些简单的数学方法,就可以大幅提升自己的认识能力,所以,在这里,记录一篇我自己的思维方式,一方面给大家做个参考,另一方面也供更高阶的人给我进行指正。算是“开源我的思维方式”,开放不仅仅是为了输出,更是为了看看有没有更好的方式。 我的思维方式中,使用数学逻辑的方式进行思考,通常来说,我会使用五步思考的方式: 第一步:信息数据可拷证。如果一个观点或是一个见解的数据是错误的,那么就会造成后面的观点全是错的,所以,首要的是要进行数据的查证或拷证。一般来说,如果一篇文章的作者足够严谨的话,他的需要给他的数据建立相关的引用或是可以考证的方法方式。如果一篇文章中出现的是,“相当专家”或是“美国科学家”,但是没有任出处,也没有点家这个专家或是科学家的名字,而且,没有让读者可以自己去验证的方法。那么,其引用的话或是数据是无法拷证的,如果是无法拷证???,那么,这篇文章的水份就非常大了。一般来说,当我读到一篇文章中的东西没有可拷证的来源或是方法时,通常来说,我就不会再读了,因为这篇文章的价值已经不大了,如果我关心这篇文章中的东西,我会改为自己去查找的方式,虽然变“重”了,但是很安全。(所以,像Wikipedia这样的网站是我经常去获得信息的地方,因为信息可以被拷证是其基本价值观) 第二步:处理集合和其包含关系。这是一个非常简单的人人都会的数学逻辑。比如:哲学家是人,柏拉图是哲学家,所以,柏拉图是人。就是一个在包含关系下的推理。你不要小看这个简单的逻辑,其实很多人并不会很好的应用,相反,当感情支配了他们以后,他们会以点代面,以特例代替普遍性。比如,地图炮就是一种,他们看到了多个案例,他们就开始把这个案例上升上更大的范围,比如:河南人新疆人都是小偷,上海人都是小市民。日本人都是变态和反人类……等等。除了这些地图炮外,还有否定整个人的,比如一个人犯了个错或是性格上有缺陷,就会把整个人全盘否定掉,员工抢个月饼就上升到其价值观有问题……。在数学的逻辑包含中,可以超集的定义同样适用于子集,通过子集的特征可以对超集进行探索,但是没法定义超集。另外,幸存者偏差会是一个很容易让人掉下去的陷阱,因为可能会有很大的样本集可能在你的视线盲区。 第三步:处理逻辑因果关系。所谓因果关系,其实就是分辨充分条件、必要条件和充分必要条件,然后处理其中的逻辑是否有关联性,而且有非常强的因果关系。没有能力分辨充分必要条件处理因果关系是很多人的硬伤。就像我在《努力就会成功》中说的一样,“努力” 和 “成功”是否有因果关系?各种逻辑混淆、概念偷换、模糊因果、似是而非全是在这里。比如:掩耳盗铃、刻舟求剑就是因果关系混乱的表现。人们会经常地混淆两个看来一起发生,但是并没有关联在一起的事。因果关系是最容易被模糊和偷换的,比如:很多人都容易混淆“加班”就会有“产出”,混淆了“行动”就会有“结果”,混淆了“抵制”就会赢得“尊重”,混淆了“批评”等于“反对”……等等。除了这些以外,微信公众号里的很多时评文章,他们的文章中的结论和其论据是没有因果关系的,好多文章就是混淆、模糊、偷换……因果关系出问题的文章读多了是对大脑有损伤的,要尽量远离。 第四步:找到靠谱的基准线。就像我们写代码一样,我们都是会去找一些最佳实践或是业内标准,原因是因为,这样的东西都是经过长时间被这个世界上很多人Review过的,是值得依赖和靠谱的,他们会考虑到很多你没有考虑过的问题。所以,你也会看到很多时评都会找欧美发达国家的作参考的做法,因为毕竟人家的文化是相对比较文明、科学、开放和先进的。找到世界或是国际的通行标准,会更容易让人进步。比如:以开放包容加强沟通的心态,就会比封闭抵制敌对的心态要好得多得多,?智者建桥,愚者建墙。当然,我们也开始发现,有一些事上,有利于自己的就对标,不利于自己的就不对标,而且,除了好的事,不好的事也在找欧美作对标,于是开始“多基准线”和“乱基准线”,这种方式需要我们小心分辨。 第五步:更为深入和高维的思考。如果一件事情只在表面上进行思考其实只是一种浅度思考,在Amazon,线上系统出现故障的时候,需要写一个Correction of Errors的报告,其中需要Ask 5...

别让自己“墙”了自己

11 months ago

这一两周与几个朋友聊天,有年轻的90后,也有大叔级的70后,这些人在我看来都是很有能力的人,但是一些喜好过于强烈,让我不经意地回顾了我工作20年来身边的人,有发展得好的,也有发展的不好的,有些人是很可惜的,因为限制他们的不是其它人,也不是环境,而是自己,所以,很想写下这篇文章。(注:这篇文章可能会是一篇说教的文章,所以,可能会让你看着犯困,所以,我会尽量地短一些,而且尽可能多讲故事,少道理,这里的故事,全是真实发生的) 几个故事 2019年年初,我面试了一个很年轻的小伙子(93/94年出生),这个小伙子特别有灵性,也很聪明,计算机专业出生,也很喜欢技术,基础和学习能力也很好。在我这20年来认识的人中,如果他能呆在北京、上海、深圳这样的城市,我保证不出三年,他会成为他们同龄人中非常出色的技术人员,如果有个好的舞台有一个好的团队带他,他的未来会非常成功。然而,这个小伙子有两大喜好:1)只愿呆在一个毫无IT的环境的三/四线城市,2)对技术有非常大的偏好,只喜欢Go语言,非常不喜欢其它的语言,比如:Java。 他的这两个喜好,足以让一个未来会很优秀的人毁掉,因为,这个时代没有限制他,他的能力也没有限制他,但是他的意识完完全全地限制了他。 他把自己最宝贵的青春放在了很烂的项目上,就算能用一些新的技术,他也只能算是自娱自乐,在实验室中玩玩具罢了。 他把自己的技术栈封闭起来,而直接放弃了这个时代最具工业化的技术Java,对于一个好的程序员来说,同时掌握几门语言和技术完全是没什么问题,但是自己封闭了自己的视野。 实在是非常可惜,我本来是可以为他介绍到一些很不错的公司的,但是他这样的习性,等于自己把自己未来的门给关上了,虽然我跟他长谈过,但是我也没有办法叫醒不想醒的人…… 视野、环境和舞台,对一个人的限制是非常大的。井蛙不知道大海,被空限维度所限制;夏虫不知道冬天,是被时间维度所限制;圈奍的动物没有斗志,是被自己意识所限制。 偏见和不开放,对一个人的限制是真正有毁灭性的。主动让自己成为一个瞎子和聋子,主动把自己的能力阉割掉,这是一件令人痛心的事。想想大清的闭关锁国是如何让世界第一的北洋水师给毁掉的…… 我还有个同学,他的技术并不差,就算呆在昆明这种很落后的地方,他也非常地好学,学习英文,学习各种新技术,对技术没有任何的偏好,喜欢C/C++/Java/Python/Shell,同样喜欢前端Javascript,对基础知识非常地踏实,他在技术上没有限制自己的潜力,有什么就学什么。后来,我带他玩Docker/Go/K8S……分布式架构,他也上手的很快……像他这样的人,技术能力完全没得说,比我还大一岁,44岁了,还是一样的天天追代码细节,看Youtube的各种大会,翻github里的各种issue和pull request…… 我同学这人,拥有了成为一个技术牛人几乎的条件:基础知识过硬,细节扎得深,面很广,学习能力强,有英文能力,逻辑思维能力不错,非常的自律,执行力也很强,抓得住重点……然而,只有一个小问题,就是没有到大公司历练过,我三番五次叫他从昆明出来,但是最终他都呆在昆明这个城市没有出来,因为有所谓的家庭约束。然而,我身边还有好些人,把自己家从北京搬到上海,从上海搬到深圳,从厦门搬到深圳……这样的人大有人在……像他这样的能力,在哪个公司都会是主力和骨干,对于一个公司的主力和骨干来说,家庭上的这些问题都是小问题都是有很多解的……...

Unix 50 年:Ken Thompson 的密码

12 months ago

50年前,除了Apollo上天之外,还有一个大事的发生,就是Unix操作系统的诞生,若干年前我写过《Unix的传奇,上篇,下篇》,Unix入行前十年伴我成长的操作系统,虽然现在Linux早已接过了Unix的时代交接棒,但是,Unix文化对我个人的技术观影响是非常大的(注:《Unix编程艺术》是一本对影响我很深的书),而对于 Ken Thompson 和 Dennis Ritchie 这两位 Unix 的缔造者,也是计算机圈中的神一般的人物。今天,Dennis已经去逝,Ken在Google里跟 Rob Pike和 Robert...

HTTP的前世今生

about 1 year ago

HTTP (Hypertext transfer protocol) 翻译成中文是超文本传输协议,是互联网上重要的一个协议,由欧洲核子研究委员会CERN的英国工程师 Tim Berners-Lee v发明的,同时,他也是WWW的发明人,最初的主要是用于传递通过HTML封装过的数据。在1991年发布了HTTP 0.9版,在1996年发布1.0版,1997年是1.1版,1.1版也是到今天为止传输最广泛的版本(初始RFC 2068 在1997年发布, 然后在1999年被...

手把手介绍函数式编程:从命令式重构到函数式

about 1 year ago

原文链接: A practical introduction to functional programming – Mary Rose,2015-08-10 译序 本文是一篇手把手的函数式编程入门介绍,借助代码示例讲解细腻。但又不乏洞见,第一节中列举和点评了函数式种种让眼花缭乱特质,给出了『理解函数式特质的指南针:函数式代码的核心特质就一条,无副作用』,相信这个指南针对于有积极学过挖过函数式的同学看来更是有相知恨晚的感觉。...

闲话登月程序和程序员

over 1 year ago

2019年7月20日,是有纪念意义的一天,这天不是因为广大网民帮周杰伦在新浪微博上的超话刷到第一,而是阿波罗登月的50周年的纪念日。早在几年前,在Github上放出了当成Apollo飞船使用的源代码(当然是汇编的),但完全不明白为什么这几天会有一些中国的小朋友到这个github的issue里用灌水……,人类历史上这么伟大的一件事,为什么不借这个机会学习一下呢?下面是一些阿波罗登月与程序员相关的小故事,顺着这些东西,你可以把你的周末和精力用得更有价值。 首先,要说的是Apollo 11导航的源代码,这些代码的设计负责人叫Margaret Heafield Hamilton ,是一个女程序员,专业是数学和哲学,1960年得到一个MIT麻省理工大学的临时的软件开发职位,负责在PDP-1和LGP-30上运行天气预报的软件(注:在计算机历史上,PDP系统机器被称为Hack文化的重要推手,PDP-11且推了Unix操作系统,而Unix操作系统则是黑客文化的重要产品。参看《Unix传奇》)。然后,又为美国空军编写探测知敌方飞行的软件,之后,于1965年的时候,她加入了MIT仪器实验室,并成为了这个实验室的主管,这个实验实就是Apollo计划的一部分,她负责编写全新的月球登录的导航软件,以及后来该软件在其他项目中的各个版本。 上图是Hamilton站在她和她的麻省理工团队为阿波罗项目制作的导航软件源代码旁边,在Github上的开源的代码 – Apollo-11 (2016年开源)。我们可以看到,有两个重要的目录,一个目录叫“Comanche055”,一个目录叫“Luminary099”,前是指挥舱用的(英文为 Command Module...