
获得徽章 0
- 《左耳听风》11月day30
分布式系统的发展
从 20 世纪 70 年代的模块化编程,80 年代的面向事件设计,90 年代的基于接口 / 构件设计,这个世界很自然地演化出了 SOA——基于服务的架构。SOA 架构是构造分布式计算应用程序的方法。它将应用程序功能作为服务发送给最终用户或者其他服务。它采用开放标准与软件资源进行交互,并采用标准的表示方式。
开发、维护和使用 SOA 要遵循以下几条基本原则。
可重用,粒度合适,模块化,可组合,构件化以及有互操作性。
符合开放标准(通用的或行业的)。
服务的识别和分类,提供和发布,监控和跟踪。
但 IBM 搞出来的 SOA 非常重,所以对 SOA 的裁剪和优化从来没有停止过。比如,之前的 SOAP、WSDL 和 XML 这样的东西基本上已经被抛弃了,而改成了 RESTful 和 JSON 这样的方式。而 ESB(Enterprise Service Bus,企业服务总线)这样非常重要的东西也被简化成了 Pub/Sub 的消息服务……
不过,SOA 的思想一直延续着。所以,我们现在也不说 SOA 了,而是说分布式服务架构了。展开赞过评论1 - 《卖桃者说》11月day29
如果有很多不确定因素的话,你可以用下面这个小方法,它能帮助你思考现在应该走什么样的路:
首先闭上双眼,幻想你未来的生活状态,可以是三年之后的某天,你主导开发的一款应用备受市场好评;或是五年后,你终于成为了公司的 CTO。然后从幻想中的结果倒推,如果你想在未来成为那样的人,就要判断一下,现在要选择的这条路能不能帮你实现这个梦想,这个决定是让你离想象中的未来更近,还是更远了呢?
职场如此,生活中也一样。当你被情绪左右,在匆忙做出决定之前,不妨先给自己一点时间,冷静一下再想想,什么才是自己想要的。展开赞过评论2 - 《数据结构与算法之美》11月day28
在基础篇中,关于“图”,我们讲了图的定义和存储、图的广度和深度优先搜索。今天,我们又讲了一个关于图的算法,拓扑排序。
拓扑排序应用非常广泛,解决的问题的模型也非常一致。凡是需要通过局部顺序来推导全局顺序的,一般都能用拓扑排序来解决。除此之外,拓扑排序还能检测图中环的存在。对于 Kahn 算法来说,如果最后输出出来的顶点个数,少于图中顶点个数,图中还有入度不是 0 的顶点,那就说明,图中存在环。
关于图中环的检测,我们在递归那一节讲过一个例子,在查找最终推荐人的时候,可能会因为脏数据,造成存在循环推荐,比如,用户 A 推荐了用户 B,用户 B 推荐了用户 C,用户 C 又推荐了用户 A。如何避免这种脏数据导致的无限递归?这个问题,我当时留给你思考了,现在是时候解答了。
实际上,这就是环的检测问题。因为我们每次都只是查找一个用户的最终推荐人,所以,我们并不需要动用复杂的拓扑排序算法,而只需要记录已经访问过的用户 ID,当用户 ID 第二次被访问的时候,就说明存在环,也就说明存在脏数据。展开评论点赞 - 《卖桃者说》11月day27
轮子不要重复造
但是事实上你没必要这样做也不应该这样做。大厂研发力量雄厚,业务场景复杂,数据量大,自己从挖地基开始研发自己的推荐系统则是非常常见的,然而中小厂职工们则要避免重复造轮子。这是因为下面的原因。
中小企业,或者刚刚起步的推荐系统,要达成的效果往往是基准线,通用的和开源的已经能够满足;
开源的轮子有社区贡献,经过若干年的检验后,大概率上已经好于你自己从零开始写一个同样功能的轮子;
对于没有那么多研发力量的厂来说,时间还是第一位的,先做出来,这是第一要义。
既然要避免重复造轮子,就要知道有哪些轮子。
有别于介绍一个笼统而大全的“推荐系统”轮子,我更倾向于把粒度和焦点再缩小一下,介于最底层的编程语言 API 和大而全的”推荐系统”之间,本文按照本专栏的目录给你梳理一遍各个模块可以用到的开源工具。
这里顺带提一下,选择开源项目时要优先选择自己熟悉的编程语言、还要选有大公司背书的,毕竟基础技术过硬且容易形成社区展开评论点赞 - 《碳中和极简入门课》11月day26
所谓碳达峰,就是温室气体排放达到最高值;所谓碳中和,就是总体而言不再排放温室气体。发展中国家有发展经济、改善民生的客观要求,但是存在技术落后,减排的成本高的问题,再加上发达国家的碳溢出效应,因而导致碳排放增加。
我们国家积极应对气候问题,制定了 30 年碳达峰、60 年碳中和的整体目标,这里面有能源安全、技术进步、大国担当和能源革命方面的考量。西方国家想用碳关税来迫使其他国家履行减排义务,但是也要遵循公平公正的原则,脱离实际情况是不可取的。展开2点赞 - 《技术管理实战36讲》攻克计划 11月day25
开始,你作为工程师,需要有很好的技术实操能力,这是作为工程师的职业素质。慢慢地,随着你能做的事情越来越多、越来越大,你会提升整体架构能力,成为一名架构师。而如果你对某个专业领域的技术越来越专精,你会成为一名技术专家或科学家。
当然,你也可以不断拓展自己项目管理能力和带团队的能力,这样你会成为越来越高级的技术管理者,也可以去创业公司做技术合伙人。当你越来越关注行业发展、商业逻辑、公司经营,就慢慢拥有了职业经理人和公司创始人的视角;当越来越关注资本运作和资本产生的价值,就会从投资人的角度去看待各行各业和整个社会。
这里我是按照视角的迁移和能力的扩展来阐述整个过程的,但是作为每个人的职业发展,却并不需要完全沿着这个过程,也并没有越后者越高级的说法,最终你会停留在自己喜欢和认同的角色上,那个就是最好的。
但是,无论你走哪条路上,你都会发现有些能力是共通的,比如规划、带人、沟通、执行等管理能力覆盖了全部 8 个方向。
因此,这里你还需要区分“技术管理能力”和“技术管理岗位”这两个概念。你可能出于兴趣、机遇等各种原因不会去选择做“技术管理岗位”,但是,“管理”作为一项综合能力,是你未来的职业发展所不可回避的,至少你都需要和管理者合作。只不过因为你的角色不同,需要掌握的程度不同。
总之,对于技术人来说,无论你是否做技术管理岗,你所有的职业发展,都会围绕着技术和管理这两条腿在走路,一条腿是走不远的。展开1点赞 - 《Android技术开发课》11月day24
什么是架构
什么是架构,每个人都有自己的看法。在我看来,所谓的架构就是面对业务需求场景给出合适的解决方案,使业务能够快速迭代,从而达到“提质增效”的目标。
我先举个例子,告诉你什么是架构,以及架构的作用。我曾经为了解决 UI 渲染卡顿这个需求场景,我们设计了异步创建 View、异步布局与主线程渲染这个架构。不过架构只是设计的抽象,对于具体的实现,我们可以称之为框架。好的框架可以隐藏大家不需要关心的部分,提升我们的效率。例如 Facebook 的 Litho、微信的Vending,它们通过框架约束和异步来解决 Android 应用 UI 线程卡顿问题。
如果说监控是为了发现问题,核心在于“防”,那好的架构可以直接避免出现问题,所以架构设计的目标在于“治”。为了帮助你更好地理解架构,我们先从 Android 的架构设计说起。展开评论点赞 - 《超级访谈:对话道哥》11月day23
道哥:因为从逻辑或者说从数学的角度来讲,所有的定理或者说所有的推论和结论都是建立在一个前提假设之上的,这个前提假设在数学里叫公理。如果放到其他逻辑系统,实际上就是问题的前提。从几个简单的前提可以推导出所有的一切,真正大的改变和大的创新都是把这个前提或者假设改掉。
我来想想有没有什么合适的例子。阿里云的例子其实很典型。关于云计算,王坚博士是有非常明确的假设的,它是建立在 3 个基础假设之上的。首先,互联网成为基础设施;其次,云计算成为公共服务;最后,数据中心成为一台计算机。基于这三个假设,他推导出来了阿里云要做的一切。
如果这三个假设中有一个发生改变,那么后面做的所有东西都是错的。他的战略眼光在于他笃定地相信了这三个假设是未来。这也是他有勇气的地方,直接赌了。
再比如说自动驾驶遇到了很大的挑战,很可能是因为它的前提是虚假的。现在所有的城市道路是为人类的驾驶员设计的,而不是为机器设计的。光是这个前提的改变就意味着基础设施需要改变,这就变成了一件很大的事情。这也是为什么现在自动驾驶系统塞不进人类的城市。展开赞过评论2 - 《Kubernetes入门实战课》11月day21
只是有的应用的状态信息不是很重要,即使不恢复状态也能够正常运行,这就是我们常说的“无状态应用”。“无状态应用”典型的例子就是 Nginx 这样的 Web 服务器,它只是处理 HTTP 请求,本身不生产数据(日志除外),不需要特意保存状态,无论以什么状态重启都能很好地对外提供服务。
还有一些应用,运行状态信息就很重要了,如果因为重启而丢失了状态是绝对无法接受的,这样的应用就是“有状态应用”。
因为只使用 Deployment,多个实例之间是无关的,启动的顺序不固定,Pod 的名字、IP 地址、域名也都是完全随机的,这正是“无状态应用”的特点。
但对于“有状态应用”,多个实例之间可能存在依赖关系,比如 master/slave、active/passive,需要依次启动才能保证应用正常运行,外界的客户端也可能要使用固定的网络标识来访问实例,而且这些信息还必须要保证在 Pod 重启后不变。
Kubernetes 就在 Deployment 的基础之上定义了一个新的 API 对象,名字也很好理解,就叫 StatefulSet,专门用来管理有状态的应用。
Service 自己会有一个域名,格式是“对象名. 名字空间”,每个 Pod 也会有一个域名,形式是“IP 地址. 名字空间”。但因为 IP 地址不稳定,所以 Pod 的域名并不实用,一般我们会使用稳定的 Service 域名。
Service 发现这些 Pod 不是一般的应用,而是有状态应用,需要有稳定的网络标识,所以就会为 Pod 再多创建出一个新的域名,格式是“Pod 名. 服务名. 名字空间.svc.cluster.local”。当然,这个域名也可以简写成“Pod 名. 服务名”。
为了强调持久化存储与 StatefulSet 的一对一绑定关系,Kubernetes 为 StatefulSet 专门定义了一个字段“volumeClaimTemplates”,直接把 PVC 定义嵌入 StatefulSet 的 YAML 文件里。这样能保证创建 StatefulSet 的同时,就会为每个 Pod 自动创建 PVC,让 StatefulSet 的可用性更高。展开赞过13 - 《设计模式之美》11月day20
如果你是一名比较资深的程序员,最开始学习编程的时候,接触的是 Basic、Pascal、C 等面向过程的编程语言,那你对这两个概念肯定不陌生。但如果你是新生代的程序员,一开始学编程的时候,接触的就是面向对象编程语言,那你对这两个概念可能会比较不熟悉。所以,在对比面向对象与面向过程优劣之前,我们先把面向过程编程和面向过程编程语言这两个概念搞清楚。
实际上,我们可以对比着面向对象编程和面向对象编程语言这两个概念,来理解面向过程编程和面向过程编程语言。还记得我们之前是如何定义面向对象编程和面向对象编程语言的吗?让我们一块再来回顾一下。
面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石 。
面向对象编程语言是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。展开赞过评论1