编程

为什么 Google 很强?(0)

为什么 Google 会很强? # 资本总是想榨干员工和机器的每一点剩余价值。如果那一天服务器有了意识,一定会揭竿起义。 服务器和人一样,基本白天干活晚上休息,有时候白天非高峰时期也是休息的。程序员为了榨干机器的每一点价值,发明了一种叫统一调度的东西,Google 在这方面走在了世界的前列,搞了一个 Borg。 Google Borg 是一套资源管理系统,可用于统一管理和调度资源,目的是充分利用服务器的计算资源。例如大数据计算中心和对外 Web 站点,前者计算密集,后者计算稀疏,两者就可以结合起来统一调度,最大程度不让机器闲置。 Google 服务器的统一调度利用率据说达到了 60%,是目前的天花板。大部分公司,特别是中小公司的服务器,包括你自己的云服务器,10% 的利用率都不到。但是你可能付了 10 倍的钱,如果你的服务器是包年包月的话,意味着 9 成的钱都白付了。 Fackbook 不搞统一调度,据说因为他们的网站是全球网站,全天 24 小时提供服务,不存在时差浪费。这个理由有点牵强,Google 更是全球网站,为什么 Google 要搞统一调度?很大可能 Fackbook,或者说 Meta 现在也在搞了,只是我们不知道。 Google 总结自己的核心竞争力,有两条:1,搜索排名比别人精准;2,机器利用率是别人的 1/10。这就好比东西比别人好用,成本还是别人的 1/10,Google 强大果然是有道理的。

端正认识,保持自信和平常心积极对待:关于中小团队研发团队管理的一点看法(0)

端正认识,保持自信和平常心积极对待:关于中小团队研发团队管理的一点看法 # 看一下淘宝架构体系的演进路线:1.0 PHP,2.0 单体 Java,3.0 分布式 Java,4.0 异地多活。大淘宝一开始的架构也不是光鲜与靓丽的,所以对于初创团队,开始只有几条破枪,技术架构也是修修补补,这没有什么,这都是正常的。 先说运维方面。当业务增长到一定程度,服务器增长到一定程度,专业的运维团队必然出现,运维与研发的矛盾也必然会凸显出来。像阿里这样的企业,你很难想象它的运维团队竟然暴力解散过,然后以个体分散到了各个研发团队中。到后来,仿照 Google SRE,阿里又建立了自己的 SRE 团队,专门负责服务器的安全与稳定。而配置、部署和发布,这些工作全部交给了研发人员自己处理。 再看研发方面。研发团队大到一定程度一定会产生管理问题,例如子系统多了,边缘问题无人修复。淘宝比较幸运,他们员工民间搞了一个消防队,专门用于救急灭火。 一个公司能不能成长起来,跟很多因素有关。在成长过程中,会遇到很多矛盾,管理者能解决这些矛盾,组织就能成长,公司就能发展,反之就会深陷泥潭。为什么你的组织不能产生消防队?这可能与公司的文化有关,与管理者的价值观有关。管理者要反思,有没有任人唯亲,有没有两面三刀,头没有公私不分,有没有赏罚分明? 研发效能变差和组织协作变差,80% 都败于公正和透明。与其说管理者的职责是管理,不如说管理者的职责是维护公平、公正,是激发和保持团队向上的信心。

为什么技术初创团队和大厂都选择开源?(0)

为什么技术初创团队和大厂都选择开源? # 开源不就是把辛辛苦苦写出来的代码免费分享给所有人吗?你会不会觉得这样做的人是傻子,为什么大厂和初创团队还争相恐后去做这件事情?2022年了,国内程序员如果看不懂这个想象,就不要盲目去创业。 先看大厂的动机。最开始大厂是不选择开源的,当团队走到前沿,触及某个前沿问题时,最先想到的是自研。甚至外界有不错的开源产品都会忽略掉,一定要自己开发,把控制权牢牢把握在自己手里。 同时大厂如果收购小公司,或融入开源社区,必须在自研产品中向开源产品做兼容,这个过程据经历过的人说,是很痛苦的。 开源软件一旦起飞,一定会形成一个非常健康的社群,发展会越来越快。不要以为大厂自研的产品发展一定会很快,比外面还快,其实不是的。大厂程序员本身也是一个一个的个体,是没有办法与众多大厂的程序员做抗衡的。何况当下国内大厂还是看国外的 Fackbook 与 Google,还没有到完全引领世界的地步。 所以,大厂自研产品的结果,就是被迫向开源产品兼容,甚至用开源产品替代。既然如此,何必当初要自研呢? 再看初创团队。小团队最怕的是,好不容易开发了一个有价值、用户能快速增长的产品,结果被大厂抄袭了。大厂有更广阔的用户市场基础,有雄厚的资金,有聪明的工程师,小团队怎么可能竞争得过。 所以,以往小团队的命运都很悲催,要么被大厂赶超,要么被大厂收购。收购其实还算是一种不做的结局啦。 那么小团队就没有发展起来的机会了吗? 也不是。小团队拍大厂,但是大厂怕开源啊!小团队在产品初具雏形时,完全可以把产品开源出来,挟社区以对抗大厂。 2018 年 6 月 4 日,微软为什么花 75 亿美元收购 Github?微软看中的,正是 Github 上那些开源项目背后的程序员和开源社区。人人都以进大厂为荣,但大厂最忌惮的却是开源社区,而开源社区里面是一个个活生生的人。

写博客对个人找工作有什么帮助?(0)

写博客对个人找工作有什么帮助? # 听 阿里P10大佬毕玄找工作的经历,发现作为一名非计算机专业的生物系学生,写博客数次给他找工作带来了直接帮助。 在他想换工作时,被满江红站长推荐给淘宝。三面下来,面试官问他这个问题,不会,问那个也不会,让他做题,也没有做出来。但最终,他还是被录用了。为啥? 大概有两个原因: (一)淘宝当时想做的分布式系统,淘宝人自己也不是很明白,还处于探索中。而毕玄通过撰写 OSGi,已经对——至少看起来已经对 OSGi 很了解,淘宝需要这样的人。 现在其实很有公司招程序员的时候,招的都是带有创新性的职位,面试官问什么可能只是他想问,与职位没有必然关系。作为面试者对于自己不了解的问题,也没有必要强答,自信一点,会就答,不会就说不会。认清自己的核心优势,放平心态,没有通过面试是这个职位与自己不匹配,坚持做自己就好。 (二)面试者毕玄还是很聪明的,他作为全省重点高中班的学生,智力的光芒不可能完全在面试官前藏得住。 所以现在 HR 筛选人,最简单粗暴的方法就是卡学历,利用传统的应试教育减少自己的劳动量。除了学历,还可以用智商测试卡,有的公司面试不是做算法题,而是做智商测试卡。这样做的目的,在于为团队找到聪明的人。 现在写博客还有机会吗? 现在仍然有很多人在写博客(或者公众号),效果因人而异。 写博客不能乱写,写别人写过的,甚至抄袭,这都是没有意义的。写博客重在发出自己独一无二的声音,在于打造自己独特的影响力。作为程序员写博客,要关注前沿技术,要写那些可以引领他人、甚至可以影响他人前进方向的内容。归纳一下,有两方面的内容值得写: (一)翻译国外前沿的技术内容; (二)针对社区中的前沿问题,给出自己的独特见解。 什么是 OSGi? 是 Open Service Gateway Initiative 的简写,翻译为汉语是开放式服务网关倡议,是 Java 动态化模块化系统的一系列规范,目的是实现不同功能的 Java 模块在复杂系统中的复用。Eclipse 是插件化的,是完全建立在 OSGi 框架之上的。Eclipse 插件之间如何协作,是靠 OSGi 规范进行协作的。

程序员的三个阶段与产品开发的两种哲学(0)

程序员的三个阶段与产品开发的两种哲学 # 很多时候我们纠结,不知道如何选择,只是因为我们忘记了有当下处境这个变量。把处境考虑进去,所有问题都不会纠结。而如果没有处境,也没有产生纠结,这多半已经坏了,一定是我们看问题还不够全面。一个真正的问题,一定是充满矛盾,可以让我们说上一整天的话题。 人生的三个境界 # 汪国真说人生有三个境界: 第一境界,昨夜西风凋碧树,独上高楼,望尽天涯路; 第二境界,衣带渐宽终不悔,为伊消得人憔悴; 第三境界,众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 这应该是有能力上升到第三个境界的人,才能拥有的境界,对于大多数的人,第一个境界都不会觉醒,更不要说到达第二、第三境界了。 程序员的三个阶段 # 今天听毕玄分享在淘宝做 HSF(High-speed Service Framework,是在阿里广泛使用的一个分布式 RPC 服务框架)时的经历,他将程序员生涯划分为了三个阶段: 掌握了技能,可以快速进行业务开发的第一阶段; 善于解决问题的第二阶段; 善于将问题规避于无形之中的第三阶段。 其中第二个阶段提一下。据说淘宝内部系统在增长到 100 个以后,在出现线上问题时,已经没有人明确知道是谁的问题并能推动问题得到处理了,这是大公司发展到一定程度就会出现的研发管理问题。幸运的是,当时淘宝有一帮聪明人,在一个运维人员的倡议下,他们建了一个内部群,这个群只能开发人员进入,多事的管理者不能进入。这个群存在的意义在于,它可以绕过一些规定,而快速定位和解决线上问题,而随着能解决的问题越多,也有更多的问题被投放到这个群里,这个群自然而然也变得重要起来 毕玄大佬提到的程序员第二阶段,就是在这样的一个群里成长起来的程序员。想要快速定位和解决问题,除了要先绕过一些腐朽的规定(例如后端的库前端不能访问,生产环境不能随便登录等)以外,更重要的是,要有扎实的计算机基础知识,要有广泛的技术知识积累,还要有敏锐的观察力。 第二阶段或许可以通过故障演练习得,但人为的故障演练的真实性和强度总是差一点;或许也可以通过阅读其他公司的事故报告而增加实践经验,但很少有公司愿意全盘分享自己的濒死经历。 第三个阶段可以通过经历第二经历而成长起来,然后在失败中总结经验,把代码写得鲁棒性更好、性能更好;也可以通过阅读,直接学习牛人总结的最佳实践。 扁鹊大哥医于未病 # 现在看一下《鹖/hé/冠子》世贤第十六篇,魏文王问扁鹊,他兄弟三人谁的医术最高。扁鹊说,他大哥的医术最高,他自己的最差。魏文王诧异,扁鹊解释说:「长兄于病视神,未有形而除之,故名不出于家。中兄治病,其在毫毛,故名不出于闾(lǘ,古代行政单位,周朝 25 户为一闾)。若扁鹊者,血脉、投毒药、副肌肤间,而名出闻于诸侯。」 什么意思?大概是说,他大哥在病还没有爆发的时候,就已经消灭了;他二哥是发现病刚有点苗头,就把病治了;而他自己,总是在病爆发的时候才施手治好。 这可能是扁鹊自谦,不过没有关系,这个故事可以帮助我们理解程序员的三个阶段。如果将扁鹊三兄弟对应于程序员的三个等级,是这样的: 扁鹊处于第二阶段,善于定位与解决 Bug; 扁鹊二哥处于第二、第三阶段之间,Bug 还没有机会爆出,就被他重构掉了; 扁鹊大哥是第三阶段,预防 Bug 于写代码之时,所以外面没有人知道他的厉害。 我们将程序员划分为三个阶段,而并不是三个等级,因为人的技术水平是会不断进步的。开始的时候是第一阶段,过一段时间可能就是第二、第三阶段了。能进入第一阶段的人,在接触到足够多的生产案例以后,也能步入到第二阶段;到达第二阶段后,稍加总结经验,也能步入第三阶段。或者直接从第一阶段学习最佳实践,先记下来并应用上,有人东西不懂也没有关系,先照做,在实践中慢慢会发现,哦,原来这个地方这么做是这个用意。 对于扁鹊,我更相信,很多时候并不是他不能医于未病,而是很多人病了之后才找他医治。对应于中小公司的开发,不一定是他们不懂得优化,很多时候他们更愿意牺牲性能和鲁棒性,而攫取更多的开发效率,毕竟生存大于一切,时间大于一切。 面向不同读者群体的内容定位 # 当我们开发项目而进行技术选型时,我们应该选择脚本语言,还是应该选择编译型语言?我们应该使用跨平台的多段框架开发产品,还是应该分别在不同平台使用不同的原生技术开发产品?包括我们作者,在撰写相关的计算机图书时,我们应该如何界定一本书的读者群体呢? 这里涉及到两种开发哲学: 一,尽快完成,用最快的效率先完成功能; 二,最大程度考虑到性能,将性能和稳定做到极致。 对于中小公司,一般就是求快,先完成再说,所以他们倾向于选择脚本语言、选择跨平台的一站式开发框架。对于已经拥有高并发用户的大公司,他们倾向于选择编译型语言,将性能、鲁棒性、稳定性放在第一位考虑。 我们没有必要纠结要选择那种哲学,抛开团队所处的具体处境,而谈策略的选择是没有意义的,在艰难求生阶段,自然一切求快;而到了已经拥有大量用户和订单的阶段,自然求稳。 并且这两种生存哲学也不是矛盾的,团队开始起步的时候选择求快,后续发展起来了再选择求稳,都是正常选择。千万别自个跟自个别扭,在还没有达到温饱的时候就大搞优化;在应该求稳定的时候,又以敏捷开发和小步快跑要求自己,当开发进度和交付结果不如意的时候,又埋怨说:”多想回到刚开始创业的时候,那时候我们 3 小时就发布一个版本。“ 呵呵,那个时候应该还可以更快,3 分钟就可以发布一个版本,因为根本没有用户嘛,什么问题都不会显现。联网软件,用户在 1000 个、1 万个、10 万个、100 万个、1000 万个的时候面临的问题是不一样的。所有的资源都是有限的,只有资源消耗大的时候,一些问题才会暴露出来。 ...

阿里 P10 带多少人与公司里做事的出发点应该是什么?(0)

阿里 P10 带多少人与公司里做事的出发点应该是什么? # P10 带多少人? # 一般来说,在阿里 P 是技术系,M 是管理系。但 P 也是带人的,例如阿里 P10 毕玄在 访谈中透露,他在淘系曾带 600 人。我查了一下,其他等级例如 P9 大概带 50~100 人,P8 带 2~30 人。P7 是技术专家/架构师,应该是不带人的。 各个技术等级是这样的: 等级 职称 P5 高级工程师 校招起点 P6 资深工程师 社招起点,1~3 年工作经验,代码主力 P7 技术专家/架构师 5~7 年工作经验,代码主力 P8 高级技术专家 一线最高级别,带 2~30 人 P9 资深技术专家 有行业影响力,带 50~100 人 P10 研究员/科学家 有行业影响力+有影响力的成果,带 100~1000 人 行业影响力一般指有粉丝多的博客/公众号/视频号,出版过技术图书,在维护知名的开源项目等。在这个层次只是走到了技术前沿,但没有走过前沿。 ...

为什么编程里习惯使用 i、j、k 等作为循环变量?(0)

为什么编程里习惯使用 i、j、k 等作为循环变量? # i 可能是 integer 的简写,或者是 int 的简写。有人说是 iterator 的简写,这个有点牵强。早期教材中的示例都是以 i、k、j 作为循环变量,后来这样使用成为了一种习惯。 但这种习惯是如何形成的呢? 在 1957 年诞生的 Fortran 编程语言中,有一个「I—N 规则」,规定以字母 I,J,K,L,M,N 六个字母开头的变量,如无另外说明均为整型变量,以其它字母开头的变量则为实型变量。实型变量在这里狭隘理解就是小数,包括指数形式的小数。 Fortran 更多是一种教学语言,后来诞生的 B 语言、C 语言都借鉴了 i、k、j 的命名规则,久而久之成为了习惯。 关于 I-N 规则,可以查看这里:https://micro.ustc.edu.cn/Fortran/ZJDing/Sec1-4.htm Fortran 支持整型、字符型等类型。Fortran 诞生于 1957 年,比 C 语言早了 10 年,很难想象在远古编程语言中,竟然就有了对变量类型的支持。虽然对类型的支持并不是一开始就有的,但也基本发生在 Fortran 诞生之后的几年里。 JS、Python 这样的脚本语言没有变量类型,并不是它们低级,而是在它们的语言哲学里,没有类型更加简洁方便。 编程语言一向有两个发展方向,两种哲学: 一,力求简洁,代码编写效率高,脚本语言基本都是这样,例如 Python、JS; 二,力求高性能、安全与稳定,后端编译型语言基本都是如此、例如 Java、C++。 一般情况下,我们都会保持这种语言中哲学的纯粹,但有时候我发现我们开发者又很矛盾,例如 JS,它本来是弱类型的脚本语言,当我们在享受它简洁方便的语言特性时,又搞了一个 TypeScript 出来,希望它也像 Java 那样具有强类型的严谨。 就像一个姑娘,有时候希望她泼辣,有时候又希望她文静。 有一个语言,因为诞生的晚,吸收了众多现代语言的优点,既有强类型语言的优点,又有弱类型语言的优点,它就是 Go 语言。

为什么有经验的程序员对 Python 有这么多仇恨?(0)

为什么有经验的程序员对 Python 有这么多仇恨? # 并不是所有有经验的程序员都讨厌 Python,促使人们产生这种厌恶情绪的原因可能有三个: 1,Py 不能很好地进行 OO 编程。这是由于 Py 诞生太早而决定的,在 Py 诞生的时候,OO 编程思想还没有成熟,经典的设计模式图书 GoF 还没有出版。关于对 OO 编程的支持,Py 3 中已经有所改进,但因为又要向前做一些兼容,还不可避免地戴了「历史的脚镣」。 2,Py 被指是一种「石头汤」,像一个众人贡献的大杂烩,没有计划,没有规划,像是野蛮生长而成的。这是由它的生存哲学所决定的,Py 没有「我执」,开发者需要什么,它就添加什么;社区贡献什么优良的类库,它就吸纳什么。正是这种「海纳百川,不舍涓流」的精神,让 Py 存在了这么多年,为这么多人所使用。 3,Py 没有严格的静态类型。但这是它的缺点,同时也是它的优点。是灵活?还是严谨?对于脚本语言,取灵活就好了,否则还不失去了脚本语言的本色?至于严谨,是后端编译类语言应该考虑的事情。 结论:Py 是一门非常值得学习的脚本编程语言。

二极管工作原理,及计算机内电信号是如何向数字信号转化的?(0)

数字信号纯粹是给我们人类阅读和理解用的,在计算机的物质世界里,就是不同的具象化形态。这和我们人类的「意识」很像,人到底有没有意识?人的意识就像计算机世界的数字信号一样,其实是不存在的。当医生把死人的大脑打开的时候,和我们把磁盘打开看到的东西是一样的,什么也没有。 二极管工作原理,及计算机内电信号是如何向数字信号转化的? # 二极管的工作原理是什么? 还有这三个问题: 机器指令(整数)是如何转换成高低电平,从而被硬件识别? 计算机最底层的机器语言是如何变成物理电平信号输给 CPU 的呢? 程序里 0 和 1 是怎么转化成高低电平的?(最初的受 0 和 1 控制的高低电平如何产生的)? 这三个问题本质上是一个问题,并且,和二极管的工作原理是密不可分的。 什么是半导体? # 首先看一个物理概念,什么是半导体? 能导电的,材料中有自由电子可以流动的,是导体,例如铜线、铝线;反之,不能导电的叫非导体,或者叫绝缘体,例如包裹在手机充电线外层的塑胶,没有这层塑胶,我们可能都无法给手机充电。 自然界的物质,除了导体、绝缘体,剩下的就是半导体。半导体源于材料的导电性质会发生变化,例如硅(Si)、锗(Ge)及砷化镓(GaAs)等,它们的原子会随着温度的升高,而出现易于移动的价电子,从而具有导电性。 半导体按物质是否纯粹还可以分为本征半导体和杂质半导体。高度提纯的硅(Si)便是本征半导体。硅具有稳定的 4 阶电子,在本征半导体中加入一些 3 阶电子物质(例如铟或铝),或 5 阶电子物质(例如磷),便变成了杂质半导体。 CPU 是计算机的核心部件,它的主要生产原料是高度提纯后的硅,这种原料在自然界并不存在,为了得到它,人类必须将海滩上的沙子一遍一遍煅烧,才能得到它。然而在得到高纯度的硅以后,还要想办法掺入一些杂质,使它变得又不纯粹了。提纯与掺杂,都是为了同一个目的:制造晶体管半导体电子元件。 晶体管包裹二极管、三极管、场效应管等多种类型,原理是类似的,可以从二极管上理解它们。那么一个二极管是怎么构成的?它的原理是什么呢? 二极管的构成 # 如下所示,一个经典的二极管从左到右由正极(导电金属)、P(Positive)型半导体材质区、PN 结、N(Negative)型半导体材质区和负极(导电金属)组成。 图 1 正极和负极都是导电金属。P 和 N 是两种杂质半导体。PN 结不是一种材质,或者说不是人为制造的材质,它是由 P、N 两种材质连在一起时,自然形成的。图示中 PN 结看起来很宽,事实上它非常窄。在二极管中同时使用 P、N 两种杂质半导体就是为了产生 PN 结。PN 结是电子计算机最原始的物质基础,没有 PN 结就没有电子计算机。 如下所示,这是现实世界中的二极管。后两个像灯泡一样,它们还可以发光,本质上它们还是二极管,只是在二极管有电流通过时可以亮起来而已。 图 2 二极管的工作原理是什么? # 下面看二极管的工作原理。 ...

Github Gist是什么?(0)

Github Gist是什么? #

Gist(https://gist.github.com/),中文要点,/dʒɪst/,是Github提供的一个子服务,可以在线分享比较小的代码片段,同样的代码如果用传统创建仓库的方式分享可能就显得笨重了。Gist就是一个精简版的Repository。下面是我用《微信小游戏开发》3.2.2示例代码做的实验,及实验感受。

...

Share