0%

​ 我的朋友曾对一位著名的操作系统专家说他想要设计一种真正优秀的编程语言。那位专家回答,这是浪费时间,优秀的语言不一定会被市场接受,很可能无人使用,因为语言的流行不取决于它本身。至少,那位专家设计的语言就遭遇到了这种情况。

  那么,语言的流行到底取决于什么因素呢?流行的语言是否真的值得流行呢?还有必要尝试设计一种更好的语言吗?如果有必要的话,怎样才能做到这一点呢?

  为了找到这些问题的答案,我想我们可以观察黑客,了解他们使用什么语言。编程语言本来就是为了满足黑客的需要而产生的,当且仅当黑客喜欢一种语言时,这种语言才能成为合格的编程语言,而不是被当做“指称语义”(denotational semantics)或者编译器设计。

  流行的秘诀

  没错,大多数人选择某一种编程语言,不是因为这种语言有什么独特的特点,而是因为听说其他人使用这种语言。但是我认为,外界因素对于编程语言的流行其实并没有想象中那么大的影响力。我倒是觉得,问题出在对于什么是优秀编程语言,黑客的看法与大多数的语言设计者不一样。

  黑客的看法其实比语言设计者的更重要。编程语言不是数学定理,而是一种工具,为了便于使用,它们才被设计出来。所以,设计编程语言的时候必须考虑到人类的长处和短处,就像设计鞋子的时候必须符合人类的脚型。如果鞋子穿上去不舒服,无论它的外形多么优美,多么像一件艺术品,你也只能把它当做一双坏鞋。

  大多数程序员也许无法分辨语言的好坏。但是,这不代表优秀的编程语言会被埋没,专家级黑客一眼就能认出它们,并且会拿来使用。虽然他们人数很少,但就是这样一小群人写出了人类所有的优秀软件。他们有着巨大的影响力,他们使用什么语言,其他程序员往往就会跟着使用。老实说,很多时候这种影响力更像是一种命令,对于其他程序员来说,专家级黑客就像自己的老板或导师,他们说哪种语言好用,自己就会乖乖地跟进。

  专家级黑客的看法不是决定一种语言流行程度的唯一因素,某些古老的软件(Fortran 和 Cobol 的情况)和铺天盖地的广告宣传(Ada 和 Java 的情况)也会起到作用。但是,我认为从长期来看,专家级黑客的看法是最重要的因素。只要有了达到“临界数量”(critical mass)的最初用户和足够长的时间,一种语言就可能会达到应有的流行程度。而流行本身又会使得这种优秀的语言更加优秀,进一步拉大它与平庸语言之间的好坏差异,因为使用者的反馈总是会导致语言的改进。你可以想一下,所有流行的编程语言从诞生至今的变化有多大。Perl 和 Fortran 是极端的例子,但是甚至就连Lisp都发生了很大的变化。

  所以,即使不考虑语言本身的优秀是否能带动流行,我想单单流行本身就肯定会使得这种语言变得更好,只有流行才会让它保持优秀。编程语言的最高境界一直在发展之中。虽然语言的核心功能就像大海的深处,很少有变化,但是函数库和开发环境之类的东西就像大海的表面,一直在汹涌澎湃。

  当然,黑客必须先知道这种语言,才可能去用它。他们怎么才能知道呢?就是从其他黑客那里。所以不管怎样,一开始必须有一群黑客使用这种语言,然后其他人才会知道它。我不知道“一群”的最小数量是多少,多少个黑客才算达到“临界数量”呢?如果让我猜,我会说20人。如果一种语言有20个独立用户,就意味着有20个人是自主决定使用这种语言的,我觉得这就说明这种语言真的有优点。

  达到这一步并非易事。如果说用户数从0到20比从20到1000更困难,我也不会感到惊讶。发展最早的20个用户的最好方法可能就是使用特洛伊木马:你让人们使用一种他们需要的应用程序,这个程序碰巧就是用某种新语言开发的。

  外部因素

  我们得先承认,确实有一个外部因素会影响到语言的流行。一种语言必须是某一个流行的计算机系统的脚本语言(scripting language),才会变得流行。Fortran 和 Cobol 是早期 IBM 大型机的脚本语言。C 是 Unix 的脚本语言,后来的 Perl 和 Python 也是如此。Tcl 是 Tk 的脚本语言,Visual Basic 是 Windows 的脚本语言,(某种形式的)Lisp 是 Emacs 的脚本语言,PHP 是网络服务器的脚本语言,Java 和 JavaScript 是浏览器的脚本语言。

  编程语言不是存在于真空之中。“编程”其实是及物动词,黑客一般都是为某个系统编程,在现实中,编程语言总是与它们依附的系统联系在一起的。所以,如果你想设计一种流行的编程语言,就不能只是单纯地设计语言本身,还必须为它找到一个依附的系统,而这个系统也必须流行。除非你只想用自己设计的语言取代那个系统现有的脚本语言。

  这种情况导致的一个结果就是,无法以一种语言本身的优缺点评判这种语言。另一个结果则是,只有当一种语言是某个系统的脚本语言时,它才能真正成为编程语言。如果你对此很吃惊,觉得不公平,那么我会跟你说不必大惊小怪。这就好比大家都认为,如果一种编程语言只有语法规则,没有一个好的实现(implementation),那么它就不能算完整的编程语言。这些都是很正常很合理的事情,编程语言本来就该如此。

  当然,编程语言本来就需要一个好的实现,而且这个实现必须是免费的。商业公司愿意出钱购买软件,但是黑客作为个人不会愿意这样做,而你想让一种语言成功,恰恰就是需要吸引黑客。

  编程语言还需要有一本介绍它的书。这本书应该不厚,文笔流畅,而且包含大量优秀的范例。布赖恩·柯尼汉和丹尼斯·里奇合写的《C 程序设计语言》(C Programming Language)就是这方面的典范。眼下,我大概还能再加一句,这一类书籍之中必须有一本由 O’Reilly 公司出版发行。这正在变成是否能吸引黑客的前提条件了。

  编程语言还应该有在线文档。事实上,在线文档可以当做一本书来写,但是目前它还无法取代实体书。实体书并没有过时,它们读起来很方便,而且出版社对书籍内容的审核是一种很有用的质量保证机制(虽然做得很不完美)。书店则是程序员发现和学习新语言的最重要的场所之一。

  简洁

  假定你的语言已经能够满足上面三项条件——一种免费的实现,一本相关书籍,以及语言所依附的计算机系统——那么还需要做什么才能使得黑客喜欢上你的语言?

  黑客欣赏的一个特点就是简洁。黑客都是懒人,他们同数学家和现代主义建筑师一样,痛恨任何冗余的东西或事情。有一个笑话说,黑客动手写程序之前,至少会在心里盘算一下哪种语言的打字工作量最小,然后就选择使用该语言。这个笑话其实与真实情况相差无几。就算这真的是个笑话,语言的设计者也必须把它当真,按照它的要求设计语言。

  简洁性最重要的方面就是要使得语言更抽象。为了达到这一点,首先你设计的必须是高级语言,然后把它设计得越抽象越好。语言设计者应该总是看着代码,问自己能不能使用更少的语法单位把它表达出来。如果你有办法让许多不同的程序都能更简短地表达出来,那么这很可能意味着你发现了一种很有用的新抽象方法。

  不要觉得为用户着想就是让他们使用像英语一样又长又啰唆的语法。这是不正确的做法,Cobol 就是因为这个毛病而声名狼藉。

  如果你让黑客像下面这样求和:
add x to y giving z

  而不是写成:
z = x + y

  那么你就是在侮辱黑客的智商,或者自己作孽了。

  简洁性是静态类型语言的力所不及之处。不考虑其他因素时,没人愿意在程序的头部写上一大堆的声明语句。只要计算机可以自己推断出来的事情,都应该让计算机自己去推断。举例来说,“hello world”本应该是一个很简单的程序,但是在 Java 语言中却要写上一大堆东西,这本身就差不多可以说明 Java 语言设计得有问题了。

  单个的语法单位也应该很简短。Perl 和 Common Lisp 在这方面是两个不同的极端。Perl 的语法单位很短,导致它的代码可以拥挤得让人无法理解,而 Common Lisp 内置运算符的名称则长得可笑。Common Lisp 的设计者们可能觉得文本编辑器会帮助用户自动填写运算符的长名称。但是这样做的代价不仅是增加了打字的工作量,还包括提高了阅读代码的难度,以及占用了更多的显示器空间。

  可编程性(Hackability)

  对黑客来说,选择编程语言的时候,还有一个因素比简洁更重要,那就是这种语言必须能够帮助自己做到想做的事。在编程语言的历史上,防止程序员做出“错误”举动的措施多得惊人。这是语言设计者很自以为是的危险举动,他们怎么知道程序员该做什么不该做什么?我认为,语言设计者应该假定他们的目标用户是一个天才,会做出各种他们无法预知的举动,而不是假定目标用户是一个笨手笨脚的傻瓜,需要别人的保护才不会伤到自己。如果用户真的是傻瓜,不管你怎么保护他,他还是会搬起石头砸自己的脚。你也许能够阻止他引用另一个模块中的变量,但是你没法防止他日日夜夜不知疲倦地写出结构混乱的程序去解决完全错误的问题。

  优秀程序员经常想做一些既危险又令人恼火的事情。所谓“令人恼火”,我指的是他们会突破设计者提供给用户的外部语义层,试着控制某些高级抽象的语言内部接口。比如,黑客喜欢破解,而破解就意味着深入内部,揣测原始设计者的意图。

  你应该敞开胸怀,欢迎这种揣测。对于制造工具的人来说,总是会有用户以违背你本意的方式使用你的工具。如果你制造的是编程语言这样高度组合的系统,那就更是如此了。许多黑客会用你做梦也想不到的方式改动你的语法模型。我的建议就是,让他们这样干吧,而且应该为他们创造便利,尽可能多地把语言的内部暴露在他们面前。

  其实,黑客并不会彻底颠覆你的工具,在一个大型程序中,他可能只是对语言改造一两个地方。但是,改动多少地方并不重要,重要的是他能够对语言进行改动。这可能不仅有助于解决一些特殊的问题,还会让黑客觉得很好玩。黑客改造语言的乐趣就好比外科医生摆弄病人内脏的乐趣,或者青少年喜欢用手挤破青春痘的那种感觉。至少对男生来说,某些类型的破坏非常刺激。针对青年男性读者的 Maxim 杂志每年出版一本特辑,里面一半是美女照片,另一半是各种严重事故的现场照片。这本杂志非常清楚它的读者想看什么。

  一种真正优秀的编程语言应该既整洁又混乱。“整洁”的意思是设计得很清楚, 内核由数量不多的运算符构成,这些运算符易于理解,每一个都有很完整的独立用途。“混乱”的意思是它允许黑客以自己的方式使用。C 语言就是这样的例子,早期的 Lisp 语言也是如此。真正的黑客语言总是稍微带一点放纵不羁、不服管教的个性。

  优秀的编程语言所具备的功能,应该会使得言必称“软件工程”的人感到非常不满、频频摇头。与黑客语言形成鲜明对照的就是像 Pascal 那样的语言,它是井然有序的模范,非常适合教学,但是除此之外就没有很大用处了。

  一次性程序

  为了吸引黑客,一种编程语言必须善于完成黑客想要完成的各种任务。这意味着它必须很适合开发一次性程序。这一点可能出乎很多人的意料。

  所谓一次性程序,就是指为了完成某些很简单的临时性任务而在很短时间内写出来的程序。比如,自动完成某些系统管理任务的程序,或者(为了某项模拟任务)自动生成测试数据的程序,以及在不同格式之间转化数据的程序等。令人吃惊的是,一次性程序往往不是真的只用一次,就像二战期间很多美国大学造的一大批临时建筑后来都成了永久建筑。许多一次性程序后来也都变成了正式的程序,具备了正式的功能和外部用户。

  我有一种预感,最优秀的那些大型程序就是这样发展起来的,而不是像胡佛水坝那样从一开始就作为大型工程来设计。一下子从无到有做出一个大项目是一件很恐怖的事。当人们接手一个巨型项目时,很容易被它搞得一蹶不振。最后,要么是项目陷入僵局,要么是做出来一个规模小、性能差的东西。你想造一片闹市,却只做出一家商场;你想建一个罗马,却只造出一个巴西利亚;你想发明 C 语言,却只开发出 Ada。

  开发大型程序的另一个方法就是从一次性程序开始,然后不断地改进。这种方法比较不会让人望而生畏,程序在不断的开发之中逐渐进步。一般来说,使用这种方法开发程序,一开始用什么编程语言,就会一直用到最后,因为除非有外部政治因素的干预,程序员很少会中途更换编程语言。所以,我们就有了一个看似矛盾的结论:如果你想设计一种适合开发大型项目的编程语言,就必须使得这种语言也适合开发一次性程序,因为大型项目就是从一次性程序演变而来的。

  Perl 就是一个鲜明的例子。它不仅仅设计成适合开发一次性程序,而且它本身就很像一次性程序。最初的 Perl 只是好几个生成表格的工具收集在一起而已。后来程序员用它写一次性程序,当那些程序逐渐发展壮大后,Perl 才随之发展成了一种正式的编程语言。到了 Perl 5,这种语言才适合开发重要的程序,但是在此之前它已经广为流行了。

  什么样的语言适合写一次性程序?首先,它必须很容易装备。一次性程序是你只想在一小时内写出来的程序,所以它不应该耗费很多时间安装和配置,最好已经安装在你的电脑上了。它必须是想用就用的。C 语言可以想用就用,因为它是操作系统的一部分;Perl 可以想用就用,因为它本来就是一种系统管理工具,操作系统已经默认安装它了。

  很容易装备不仅仅指很容易安装或者已经安装,还指很容易与使用者互动。一种有命令行界面、可以实时反馈的语言就具有互动性,那些必须先编译后使用的语言就不具备互动性。受欢迎的编程语言应该是前者,具有良好的互动性,可以快速得到运行结果。

  一次性程序的另一个特点就是简洁。对黑客来说,这一点永远有吸引力。如果考虑到你最多只打算在这个程序上耗费一个小时,这一点就更重要了。

1、什么是 Spring Cloud ?

Spring cloud 流应用程序启动器是 于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。

2、使用 Spring Cloud 有什么优势?

使用 Spring Boot 开发分布式微服务时,我们面临以下问题

(1)与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。

(2)服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。

(3)冗余-分布式系统中的冗余问题。

(4)负载平衡 –负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布。

(5)性能-问题 于各种运营开销导致的性能问题。

(6)部署复杂性 evops 技能的要求。

3、服务注册和发现是什么意思?Spring Cloud 如何实现?

当我们开始一个项目时,我们通常在属性文件中进行所有的配置。随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化。手动更改属性可能会产生问题。 Eureka 服务注册和发现可以在这种情况下提供帮助。由于所有服务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找,因此无需处理服务地点的任何更改和处理。

4、负载平衡的意义什么?

在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。

5、什么是 Hystrix?它如何实现容错?

库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。通常对于使用微服 构开发的系统,涉及到许多微服务。这些微服务彼此协作。

6、什么是 Hystrix 断路器?我们需要它吗?

由于某些原因,employee-consumer 公开服务会引发异常。在这种情况下使用Hystrix 我们定义了一个回退方法。如果在公开服务中发生异常,则回退方法返回一些默认值。

如果 firstPage method() 中的异常继续发生,则 Hystrix 电 ,并且员工使用者将一起跳过firtsPage 方法,并直接调用回退方法。 断路器的目的是给第一 方法或第一页方法可能调用的其他方法留出时间,并导致异常恢复。可能发生的情况是,在负载较小的情况下,导致异常的问题有更好的恢复机会 。

7、什么是 Netflix Feign?它的优点是什么?

Feign 是受到 Retrofit,JAXRS-2.0 和 WebSocket 启发的 java 客户端联编程序。Feign 的第一个目标是将约束分母的复杂性统一到 http apis,而不考虑其稳定性。在 employee-consumer 的例子中,我们使用了 emplo e-producer 使用 REST模板公开的 REST 服务。

但是我们必须编写大量代码才能执行以下步骤

1、使用功能区进行负载平衡。

2、获取服务实例,然后获取基本 URL。

3、利用 REST 模板来使用服务。 前面的代码如下

1
@Controller public class ConsumerControllerClient { @Autowired private LoadBalancerClient loadBalancer; public void getEmployee() throws RestClientException, IOException { ServiceInstance serviceInstance=loadBalancer.choose("employee- producer"); System.out.println(serviceInstance.getUri());

之前的代码,有像 NullPointer 这样的例外的机会,并不是最优 。我们将看到如何使用 Netflix Fe n使呼叫变得更加轻松和清洁。如果 Netflix Ribbon 依赖关系 径中,那么 Feign 默认也会负载平衡。

8、什么是 Spring Cloud Bus?我们需要它吗?

Spring Cloud Bus 提供了跨多个实例刷新配置的功能。

9、什么是微服务

微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分为一组小的服务,每个服务运行在其独立的自己的进程中,服务之间相互协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API),每个服务都围绕着具体的业务进行构建,并且能够被独立的构建在生产环境、类生产环境等。另外,应避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。

10、什么是服务熔断?什么是服务降级

熔断机制是应对雪崩效应的一种微服务链路保护机制。当某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内调用20次,如果失败,就会启动熔断机制。

服务降级,一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。这样做,虽然水平下降,但好歹可用,比直接挂掉强。

11、Eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别?

Zookeeper保证了CP(C:一致性,P:分区容错性),Eureka保证了AP(A:高可用)

(1)当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的信息,但不能容忍直接down掉不可用。也就是说,服务注册功能对高可用性要求比较高,但zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新选leader。问题在于,选取leader时间过长,30 ~120s,且选取期间zk集群都不可用,这样就会导致选取期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够恢复,但是漫长的选取时间导致的注册长期不可用是不能容忍的。

(2)Eureka保证 用性,Eureka各个节点是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点仍然可以提供注册和查询服务。而Eureka的客户端向某个Eureka注册或发现时发生连接失败,则会自动切换到其他节点,只要有一台Eureka还在,就能保证注册服务可用,只是查到的信息可能不是最新的。除此之外,Eureka还有自我保护机制,如果在15分钟内超过85%的节点没有正常的心跳,那么Eureka就认为客户端与注册中心发生了网络故障,此时会出现以下几种情况:

①、Eureka不在从注册列表中移除因为长时间没有收到心跳而应该过期的服务。

②、Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上(即保证当前节点仍然可用)

③、当网络稳定时,当前实例新的注册信息会被同步到其他节点。因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像Zookeeper那样使整个微服务瘫痪

12、SpringBoot和SpringCloud的区别?

SpringBoot专注于快速方便的开发单个个体微服务。

SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务SpringBoot可以离开SpringCloud独立使用开发项目, 但是SpringCloud离不开SpringBoot ,属于依赖的关系.SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的 治理框架

13、什么是Hystrix断路器?我们需要它吗

使用Hystrix我们定义了回退方法。如果在公开服务中发生异常,则回退方法返回一些默认值 。

14、说说 RPC 的实现原理

首先需要有处理网络连接通讯的模块,负责连接建立、管理和消息的传输。其次需要有编解码的模块,因为网络通讯都是传输的字节码,需要将我们使用的对象序列化和反序列化。剩下的就是客户端和服务器端的部分,服务器端暴露要开放的服务接口,客户调用服务接口的一个代理实现,这个代理实现负责收集数据、编码并传输给服务器然后等待结果返回。

15、微服务的优点缺点?说下开发项目中遇到的坑?

优点:优点:

(1)每个服务直接足够内聚,代码容易理解

(2)开发效率高,一个服务只做一件事,适合小团队开发

(3)松耦合,有功能意义的服务。

(4)可以用不同语言开发,面向接口编程。

(5)易于第三方集成

(6)微服务只是业务逻辑的代码,不会和HTML,CSS或其他界

(7)可以灵活搭配,连接公共库/连接独立库

缺点:

(1)分布式系统的责任性

(2)多服务运维难度加大。

(3)系统部署依赖,服务间通信成本,数据一致 ,系统集成测试,性能监控。

16、spring cloud 和d bbo区别?

(1)服务调用方式 dubbo是RPC spri cloud Rest Api

(2)注册中心,dubbo 是zookeep r springcloud是eureka,也可以是zookeeper

(3)服务网关,dubbo本身没有实现,只能通过其他第三方技术整合,springcloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,springcloud支持断路器,与git完美集成配置文件支持版本控制,事物总线实现配置文 的更新与服务自动装配等等一系列的微服务架构要素。

17、REST 和RPC对比

(1)RPC主要的缺陷是服务提供方和调用方式之间的依赖太强,需要对每一个微服务进行接口的定义,并通过持续继承发布,严格版本控制才不会出现冲突。

(2)REST是轻量级的接口,服务的提供和调用不存在代码之间的耦合,只需要一个约定进行规范。

18、你所知道的微服务技术栈?

维度(springcloud)

服务开发:springboot spring springmvc

服务配置与管理:Netfix公司的Archaiusm ,阿里的Diamond

服务注册与发现:Eureka,Zookeeper

服务调用:Rest RPC gRpc

服务熔断器:Hystrix

服务负载均衡:Ribbon Nginx

服务接口调用:Fegin

消息队列:Kafka Rabbitmq activemq

服务配置中心管理:SpringCloudConfig

服务路由(API网关)Zuul

事件消息总线:SpringCloud Bus

19、微服务之间是如何独立通讯的?

(1)远程调用,比如feign调用,直接通过远程过程调用来访问别的service。

(2)消息中间件

20、springcloud如何实现服务的注册?

(1)服务发布时,指定对应的服务名,将服务注册到 注册中心(eureka zookeeper)

(2)注册中心加@EnableEurekaServer,服务用@EnableDiscoveryClient,然后用ribbon或feign进行服务直接的调用发现。

21、Eureka和Zookeeper区别

(1)Eureka取CAP的AP,注重可用性,Zookeeper取CAP的CP注重一致性。

(2)Zookeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但选举期间不可用。

(3)eureka的自我保护机制,会导致一个结果就是不会再从注册列表移除因长时间没收到心跳而过期的服务。依然能接受新服务的注册和查询请求,但不会被同步到其他节点。不会服务瘫痪。

(4)Zookeeper有Leader和Follower角色,Eureka各个节点平等。

(5)Zookeeper采用过半数存活原则, reka采用自我保护机制解决分区 。

(6)eureka本质是一个工程,Zookeeper只是一个进程。

22、eureka自我保护机制是什么?

当Eureka Server 点在短时间内丢失了过多实例的连接时(比如网络故障或频繁启动关闭客户端)节点会进入自我保护模式,保护注册信息,不再删除注册数据,故障恢复时,自动退出自我保护模式。

23、什么是Ribbon?

ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。feign默认集成了ribbon。

24、什么是feigin?它的优点是什么?

(1)feign采用的是基于接口的注解

(2)feign整合了ribbon,具有负载均衡的能力

(3)整合了Hystrix,具有熔断的能力

使用:

(1)添加pom依赖。

(2)启动类添加@EnableFeignClients

(3)定义一个接口@FeignClient(name=“xxx”)指定调用哪个服务

25、Ribbon和Feign的区别?

(1)Ribbon都是调用其他服务的,但方式不同。

(2)启动类注解不同,Ribbon是@RibbonClient feign的是@EnableFeignClients

(3)服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。

(4)调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。Feign需要将调用的方法定义成抽象方法即可。

26、什么是Spring Cloud Bus?

spring cloud bus 将分布式的节点用轻量的消息代理连接起来,它可以用于广播配置文件的更改或者服务直接的通讯,也可用于监控。spring cloud bus 将分布式的节点用轻量的消息代理连接起来,它可以用于广播配置文件的更改或者服务直接的通讯,也可用于监控。

如果修改了配置文件,发送一次请求,所有的客户端便会重新读取配置文件。

使用:

(1)添加依赖

(2)配置rabbimq

27、springcloud断路器作用?

当一个服务调用另一个服务由于网络原因或自 原因出现问题,调用者就会等 调用者的响应 当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)

断路器有完全打开状态:一段时间内 到一定的次数无法调用 并且多次监 没有恢复的迹象 断路器完全打开 那么下次请求就不会请求到该服务

半开:短时间内 有恢复迹象 断路器会将部分请求发给该服务,正常调用时 断路器关闭

关闭:当服务一直处于正常状 能正常调用

28、Spring Cloud Gateway?

Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。

使用了一个RouteLocatorBuilder的bean去创建路由,除了创建路由RouteLocatorBuilder可以让你添加各种predicates和filters,predicates断言的意思,顾名思义就是根据具体的请求的规则,由具体的route去处理,filters是各种过滤器,用来对请求做各种判断和修改。

29、作为 务注册中心,Eureka比Zookeeper好在哪里?

(1)Eureka保证的是可用性和分区容错性,Zookeeper 保证的是一致性和分区容错性 。

(2)Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障。而不会像zookeeper那样使整个注册服务瘫痪。

30、什么是 Ribbon负载均衡?

(1)Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。

(2)Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

31、Ribbon负载均衡能干什么?

(1)将用户的请求平摊的分配到多个服务上

(2)集中式LB即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;

(3)进程内LB将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。

注意: Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方 它来获取到服务提供方的地址。

32、什么是 zuul路由网关

(1)Zuul 包含了对请求的路由和过滤两个最主要的功能:其中 责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负 请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础、

(2)Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。

注意: Zuul服务最终还是会注册进Eureka 提供=代理+路由+过滤 三大功能

33、分布式配置中心能干嘛?

(1)集中管理配置文件不同环境不同配置,动态化的配置更新,分环境部署比如

dev/test/prod/beta/release

(2)运行期间动态调整 置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息

(3)当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置将配置信息以REST接口的形式暴露

34、Hystrix相关注解

@EnableHystrix:开启熔断

@HystrixCommand(fallbackMethod=”XXX”):声明一个失败回滚处理函数XXX,当被注解的方法执行超时(默认是 0毫秒),就会执行fallback函数,返回错误提示。

35、Eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别?

Zookeeper保证了CP(C:一致性,P:分区容错性),Eureka保证了AP(A:高可用)

(1)当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的信息,但不能容忍直接down掉不可用。 就是说,服务注册功能对高可用性要求比较高,但zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新选leader。问题在于,选取leader时间过长,30 ~ 120s,且选取期间zk集群都不可用,这样就会导致选取期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够恢复,但是漫长的选取时间导致的注册长期不可用是不能容忍的。

(2)Eureka保证了可用性,Eureka各个节点是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点仍然可以提供注册和查询服务。而Eureka的客户端向某个Eureka注册或发现时发生连接失败,则会自动切换到其他节点,只要有一台Eureka还在,就能保证注册服务可用,只是查到的信息可能不是最新的。除此之外,Eureka还有自我保护机制,如果在15分钟内超过85%的节点没有正常的心跳,那么Eureka就认为 户端与注册中心发生了网络故障,此时会出现以下几种情况:

①、Eureka不 从注册列表中移除因为长时间没有收到心跳而应该过期的服务。

②、Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上(即保证当前节点仍然可用)

③、当网络稳定时,当前实例新的注册信息会被同步到其他节点。

因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像Zookeeper那样使整个微服务瘫痪。

一、公钥算法与私钥算法

1、私钥算法

私钥加密算法,又称 对称加密算法,因为这种算法解密密钥和加密密钥是相同的。也正因为同一密钥既用于加密又用于解密,所以这个密钥是不能公开的。

2、公钥算法

公钥加密算法,也就是 非对称加密算法,这种算法加密和解密的密码不一样,一个是公钥,另一个是私钥:

  • 公钥和私钥成对出现
  • 公开的密钥叫公钥,只有自己知道的叫私钥
  • 用公钥加密的数据只有对应的私钥可以解密
  • 用私钥加密的数据只有对应的公钥可以解密
  • 如果可以用公钥解密,则必然是对应的私钥加的密
  • 如果可以用私钥解密,则必然是对应的公钥加的密

公钥和私钥是相对的,两者本身并没有规定哪一个必须是公钥或私钥。

二、实现数据的安全传输

要实现数据的安全传输,当然就要对数据进行加密了。

如果使用对称加密算法,加解密使用同一个密钥,除了自己保存外,对方也要知道这个密钥,才能对数据进行解密。如果你把密钥也一起传过去,就存在密码泄漏的可能。所以我们使用非对称算法,过程如下:

  1. 首先 接收方 生成一对密钥,即私钥和公钥;
  2. 然后,接收方 将公钥发送给 发送方;
  3. 发送方用收到的公钥对数据加密,再发送给接收方;
  4. 接收方收到数据后,使用自己的私钥解密。

由于在非对称算法中,公钥加密的数据必须用对应的私钥才能解密,而私钥又只有接收方自己知道,这样就保证了数据传输的安全性。

三、对信息进行数字签名

除了保证数据的安全传输之外,公钥体系的另一个用途就是对数据进行签名。通常“数字签名”是用来验证发送方的身份并帮助保护数据的完整性。

例如:一个发送者 A 想要传些资料给大家,用自己的私钥对资料加密,即签名。这样一来,所有收到资料的人都可以用发送者的公钥进行验证,便可确认资料是由 A 发出来的了。(因为只有A使用私钥签名得到的信息,才能用这个公钥来解) 采用数字签名,可以确认两点:

  1. 保证信息是由签名者自己签名发送的,签名者不能否认或难以否认。
  2. 保证信息自签发后到收到为止未曾作过任何修改。

之所以可以确认这两点,是因为用公钥可以解密的必然是用对应的私钥加的密,而私钥只有签名者持有。

四、公钥算法的缺点

现实中,公钥机制也有它的缺点,那就是效率非常低,比常用的私钥算法(如 DES 和 AES)慢上一两个数量级都有可能。所以它不适合为大量的原始信息进行加密。为了同时兼顾安全和效率,我们通常结合使用公钥算法和私钥算法:

  1. 首先,发送方使用对称算法对原始信息进行加密。
  2. 接收方通过公钥机制生成一对密钥,一个公钥,一个私钥。
  3. 接收方 将公钥发送给 发送方。
  4. 发送方用公钥对对称算法的密钥进行加密,并发送给接收方。
  5. 接收方用私钥进行解密得到对称算法的密钥。
  6. 发送方再把已加密的原始信息发送给接收方。
  7. 接收方使用对称算法的密钥进行解密。

总结:

  1. 每个用户都有一对私钥和公钥。
    • 私钥用来进行解密和签名,是给自己用的。
    • 公钥由本人公开,用于加密和验证签名,是给别人用的。
  2. 当该用户发送文件时,用私钥签名,别人用他给的公钥解密,可以保证该信息是由他发送的。即数字签名。
  3. 当该用户接受文件时,别人用他的公钥加密,他用私钥解密,可以保证该信息只能由他看到。即安全传输。

360不仅不想哭,甚至还很激动

苍天啊,大地啊

等了多少年终于给了我这个机会啊

终于可以把自己标榜成华为那样的国家脊梁了啊

腾讯啊,百度啊,金山啊,你们看看吧,这就是你们不如我的地方啊

感谢川建国支持啊,你的电脑检测到2333个漏洞,我帮你免费修复了,不用谢啊。另外你放在F盘的小姐姐不错,我带走了,帮你免费杀杀毒,反手送你一套全家桶作为回报啊。


角落里的腾讯:360出了多少钱上清单?我出三倍。


百度新闻稿:360被列入实体清单是怎么回事呢?360相信大家都很熟悉,但是360被列入实体清单是怎么回事呢?下面就让小编带大家一起了解吧。

360被列入实体清单,其实就是被列入实体清单的360,大家可能会感到很惊讶,360怎么会被列入实体清单?但事实就是这样,小编也感到非常惊讶

那么这就是关于360被列入实体清单的事情了,大家有什么想法呢?欢迎在评论区告诉小编一起讨论哦


金山辟谣:都是假的,360造的假新闻,我有视频为证,总所周知视频是不能作假的,所以我说的才是真的。

GitHub is the leading Git repository hosting service, which contains source code of many code repositories, libraries, etc. I recently wrote an article on GitHub Repos for web developers, which you can refer to here.

In this article, I’ll speak about GitHub repos for every developer — regardless of their language. From podcasts to free books to roadmap illustrations, they’ve got it all.


1. Awesome Resources RoadMap

This repo is number one on the list because this is pretty much a one-stop destination for your learning needs as a developer. This repo contains freely available programming books, podcasts, and even online video tutorials for a variety of software engineering topics and programming languages.

If you are looking to learn a new language or concept in programming, this is a must-visit repo.

2. free-programming-books

As the name suggests, this repo contains a list of free programming books for almost any language or concept in programming. The list is quite huge and has 143,000 stars and 34,900 forks. It’s available in many languages and is comprised of mainly programming books.

3. Best-websites-a-programmer-should-visit

When learning programming, you must be in touch with certain websites in order to learn the technologies better and to learn new things. This repo contains a list of nonexhaustive websites that you should pretty much be in touch with. This contains podcasts, news websites, resources on competitive programming, things to do when you are bored, and much, much more.

4. Project Guidelines

This repo contains a set of best practices for JS projects. These guidelines help you write and maintain projects with ease and reduce the level of issues that occur in the whole process. This includes some best practices on Git, documentation, environment, dependencies, testing, and more.

If you want to share a best practice or think one of these guidelines should be removed, you can make a PR.

5. App Ideas Collection

Have you ever wanted to build something but you had no idea what to do? Just as authors sometimes have writer’s block, it’s also true for developers. This repo contains a list of app ideas categorized according to three tiers of programming experience.

These applications help you improve your coding skills as well as allow you to try out new technologies.

6. JavaScript Algorithms and Data Structures

Right now, it’s a tech-world trend to talk a lot about algorithms, so we have to know them. So here’s this fantastic repo where you can find most of them.

The really cool thing is every algorithm is written in JavaScript and has been tested, so it’s even easier for you to understand.

7. Web Developer Road Map

This repo contains a set visual illustration on career pathways you could take as a web developer. The purpose of these roadmaps is to give you an idea about the landscape and to guide you if you’re confused about what to learn next.

A simpler, more beginner-friendly version of the illustration is under development. This chart gets updated yearly to reflect any new changes, so you never have to be worried about being outdated.

1. Data matters.

We humans are drawn to anecdotes and illustrations, but looks can be deceiving. Always base your forecasts on data, not qualitative arguments. Euclid’s Elements was one of the earliest texts on geometry, yet none of its oldest extant fragments include a single drawing.

  1. Torture the data until it confesses, but don’t frame the data to the story. The data-mining trap is easy to fall into.
  2. Start with base rates. The assumption that nothing changes and that an event is as likely in the future as it was in the past is a good starting point, but not the end point. Adjust this base rate with the information you have at the moment.

2. Don’t make extreme forecasts.

Predicting the next financial crisis will make you famous if you do it at the right time. It will cost you money and reputation at all others. Remember that there are only two kinds of forecasts: Lucky and wrong.

3. Reversion to the mean is a powerful force.

In economics as well as politics, extremes cannot survive for long. People trend toward average, and competitive forces in business lead to mean reversion.

4. We are creatures of habit.

If something has worked in the past, people will keep doing it almost forever. This introduces long-lasting trends. Don’t expect them to change quickly even with mean reversion. It is incredible how long a broken system can survive. Just think of Japan.

5. We rarely fall off a cliff.

People often change their habits in the face of a looming catastrophe. But for that behavioral change to occur, the catastrophe must be salient, the outcome certain, and the solution simple.

6. A full stomach does not riot.

Revolutions and uprisings rarely occur among people who are well fed and feel relatively safe. A lack of personal freedom is not enough to spark insurrections, but a lack of food or water or widespread injustice all are. The Tiananmen Square protests in China were triggered by higher food prices. So too was the Arab Spring.

7. The first goal of political and business leaders is to stay in power.

Viewed through that lens, many actions can easily be predicted.

8. The second goal of political and business leaders is to get rich.

Combined with the previous rule, this explains about 90% of all behavior.

9. Remember Occam’s razor.

The simplest explanation is the most likely to be correct. Ignore conspiracy theories.

10. Don’t follow rules blindly.

This applies to these rules as well as all others.

张麻子:“师爷,您给翻译翻译,什么叫后浪,翻译翻译,什么,叫后浪”

汤师爷:“这还用翻译,年轻人嘛,新一代,都说了……”

张麻子:“我让你翻译给我听,什么叫后浪!”

汤师爷::“不用翻译,就是后浪啊,热爱生活嘛……”

黄老爷:“难道你听不懂什么叫后浪?”

张麻子:“我就想让你翻译翻译,什么,叫后浪!!!”

汤师爷:“后浪嘛!”

张麻子:“翻译出来给我听,什么他妈的叫后浪!什么他妈的叫他妈的后浪!”

汤师爷:“什么他妈的叫后浪啊?”

黄老爷:“后浪就是新一代青年,可以选择玩单反,开跑车,玩跳伞,在欧洲旅游拍vlog,明白了吗?”

汤师爷:“这就是后浪呀!”

张麻子:“翻译翻译”

汤师爷,黄老爷:“…..???”

张麻子:“翻译翻译!”

汤师爷:“后浪,就是前浪的儿子和女儿!”

张麻子:“噢,大哥这他妈是后浪啊。”

面试官问我:“看你简历之前,先问你一个问题,全民学Python编程可行么?”

我冷笑。

我知道他想要我回答“可以”,实际上可以个屁,如果不是因为吃青菜面的时候没钱加鸡蛋,我可能立刻拍桌子告诉他:全民学office可行吗?全民健身可行吗?全民学英语可行吗?什么全民全民全民,说出来不就是想跨界割韭菜,前端时间还全民学空气币!学抖音!一群镰刀渣!

但我想吃煎蛋了。楼下餐馆的小姐姐虽然不够好看,也不够温柔,煎蛋的油可能太油,我还是想吃煎蛋。

但是如果我没有这份工作,我可能连青菜面都吃不上了。

所以我立刻转成了高冷笑,然后转成了高深莫测笑,呡了口白开水,我淡定的说:“当然可以”。

“Python太适合大家来学习了!小朋友可以学,什么scratch,拖拽图形,不专业,低级!满足不了有钱人的父母的需要,拉不开差距!要钱投资在孩子身上是为了干嘛,当然就是要拉开差距,家庭月收入10万和家庭月收入5000的人,在一个教室里同样的老师学同样难度的scratch?怎么拉开差距?必须要学高大上的Python!你要说Python怎么高大上了?现在最火的人工智能知道么,全是Python写的!会Python,你就已经打开了人工智能之路,年薪200万!值不值?你要跟他讲,先学语文再拿诺贝尔文学奖,没人信。你要说先学会打字,再哪诺贝尔文学奖,他就信了!什么数学,算法都让一边去,得Python者得天下!你看,小孩子的群体有了吧?高考都考Python呢!”

“大学生呢?大学生计算机系的要不要学?要不要学?要不要学?学c?学JAVA?学PHP?学js?学oc?low!学c的饿死了,学JAVA的竞争激烈,学PHP的没人要,学js的没技术含量!而且,Python简单,强大,人人学得会!你看,隔壁7岁小朋友都在学Python!而且入门月薪就过万,你说招聘岗位上没有Python的职位?你看这不有十几家公司找Python的么?说明你先人一步,难道等烂大街的时候再学?你看那家叫什么修真院的公司没?说学JAVA找到工作要900小时的编程时间,900小时,你有那么多时间没?Python不一样,每周两个小时听听课,2个月就能找工作了!你看,爬虫10分钟教程,简单吧?5分钟搭个web网站,简单吧?效率就是价值,这就是Python值钱的原因!”

“你说你不是科班生?你是土木机械电子的?那更要学Python了!计科专业都去做JAVA和c了,你当然学Python了,不然你也学不会别的啊。osi七层模型你不懂吧?数据结构你不懂吧?编译原理你不懂吧?不懂就对了,人家学四年,你现在学四个月,人生苦短,我学Python,你看,3分钟,就能解析一个文本了,快不快?连IDE都不用,直接Vim上!酷炫!”

“你说你不想做研发,你是一个产品运营?那必须学Python啊,运营是不是要数据分析?你看这个,拿Excel表格分析数据的十年运营,薪水1万5,你看这个,用Python分析数据的半年运营,薪水2万8!还是因为老板天天请他吃烧烤留下来的,你看螃蟹都想从9.9爬到19.9的篮子里,人难道不想有上进薪么?”

“你说你压根不是互联网行业的?哎呦喂你幸好问到我了。现在万物联网,连潘石屹都在学Python,一个盖房子的搬砖之余都不忘融入互联网的潮流,这就是大势!你可以不当程序员,但是你不可以不懂编程!你娶不了苍老师,难道就不像苍老师学习了么。python是什么,是赋能工具,链接旧世界和互联网新世界的桥梁!而且,领导知道你会Python,肯定加薪,为嘛?爱学习!妹子知道你会Python,肯定崇拜你,为什么?会编程的人都好厉害!你是个妹子,更得会Python,为什么?会跳舞会唱歌的妹子多了去,有几个妹子会编程?酷!”

“你说你都退休了?年纪大了?那不更得学Python了?老两口在家寂寞吧?手机都用不利索,跟子孙拿来的共同语言?学Python多好,学会了谁还想带孙子玩呀!你看能抓全世界的图!教你爬虫,大爷你看,这是美国的,这是日本的,这是澳大利亚的,都会自动更新!学不学?难道去跳广场舞重新投入江湖争斗啊?算了吧,人心险恶,你学Python。”

“您看,什么人不需要学Python?”

面试官脸上露出了满意的笑容,说:“你被录用了,很适合做一个电话销售,底薪1500,其他靠提成。现在,告诉我你之前是做什么的?”

我很激动,紧紧握着面试官的手,说:“我学了2个月的Python,找了3年的工作。”

面试官也很激动地握着你的手:我招了这么久的Python程序员,终于招到一个靠谱的电话销售

关键要看是真学,还是真娱乐。

拿经济学作例子。

B站林毅夫的视频差不多有五六十个小时的总量,温铁军已经过了两百个小时,甚至还有黄奇帆。这些人都是中国大量经济决策的参与者与主导者,听几十个小时,很多国内议题的大体逻辑就有了。

对本土流派不感兴趣的话,还有曼昆、萨缪尔森、弗里德曼、科斯等等,都是宗师级人物。就是不知道为什么我喜欢的斯蒂格利茨这么没牌面,B站没什么人上传。

如果说就是闲着听一耳朵,懒得去系统性学习,那也有很多顶级大学的入门课程。清华北大,耶鲁哈佛,这些大学在前几年的慕课浪潮中,生产了大量浅显又精准的入门课程,基本都有中文字幕,是爱好者的福音。

只要二十个小时,你就是哈佛云校友。

作为吹逼爱好者,我个人就很喜欢一边钢铁雄心太吾绘卷,一边开着CPA、CFA的课程做背景音。这几年下来,靠金融挣钱坚决不敢,靠金融吹逼样样都会,也算满足了一点虚荣心。

就算听不懂,一想到不少人要花好几万才能听这样的课,全神贯注发际线后退,而爷在打游戏,又多了一种白嫖的快感。

但这是真打算学的,至少学点。

不打算学的,骨子里奔着娱乐去的,那海了去了。这样的内容也挺多,为了避免私信被爆,咱还是不提名字了。

为什么说很多人骨子里是奔着娱乐呢?因为他们不是奔着知识,甚至不是奔着吹逼的知识。因为要吹逼你还是要形成基本的知识体系,基本概念不能跑太偏。

奔着娱乐,本质是无法接受自己的时间是无产出的,也恐惧无法参与到知识水平高的讨论中,但又无法形成基础的注意力和信息梳理能力。

学习是有一定门槛的,迈过去嫌累,待在门槛外又羡慕里面的热闹,所以就寄希望于找些方便的梯子。

要声明:没有看不起这些娱乐内容生产者的意思。

市场有需要,就一定会有人去生产这些内容。有人读经济学人也有人读太阳报,生态位摆在这里,买卖天经地义。

那些娱乐内容我也喜欢看,不过看的时候不是以学习者的身份,而是内容创作者的身份:

哇,这件事很普通,这哥们是怎么讲得云里雾里高深莫测的?哇,这件事很公开,这哥们是怎么讲得消息灵通无所不知的?

之前我吐槽某人洗稿,结果被他的粉丝摁在地上摩擦,说得最多的一句就是:

你行你上啊。

真不行,把一件长这样的事说成长那样,咱是真不行。

这二者没有高低之别,唯一要注意的,就是不要欺骗自己。明明花的时间是去娱乐,结果骗自己是去学习。

我天天和你们口嗨吹逼,但大家都知道彼此是键盘侠,不是国师。真扔个村给我管,我立马屁滚尿流另请高明吧我也不是谦虚。

自知之明嘛。只要学生不产生这种“啊我在学习啊”的幻觉,那都是好事。因为他们在娱乐之余,会开始认真去找找专业的内容,不说登堂入室,也能一窥门径。

怕就怕待在这幻觉里出不来的,那就真成韭菜了。放心我不会说你什么,韭菜也是个人选择。我顶多想法儿含泪把你转给我卖课的兄弟,至少咱们割韭菜割得轻点嘛。

很多人的核心观点是:这部剧本身就是把一群烂人聚在一起吐槽,既歧视东欧妓女,也歧视吸毒黑人,同时歧视滥交白妹,所以这部剧没有特别歧视Han,这就是一部以吐槽为主题的电视剧,你们这些玻璃心不懂。

以上关于其他种族角色的分析,毫无疑问是正确的,不论是卖淫、滥交、盗窃还是吸毒,在传统道德和价值观中都是污点,虽然剧中角色的污点设置大多来自与其所属种族的刻板印象,但这些角色本身确实都“做错了事”,都值得吐槽。

但问题在于,Han做错了什么?

这里请不要从剧中的个别情节来以点概面,试图证明Han本身也是有道德污点的,请抓住主要矛盾,也就是从角色的核心属性来看,Han做错了什么?他滥交?吸毒?偷窃?组织卖淫?不求上进?

答案是,他并没有做错什么,他就是一个辛勤工作、兢兢业业的小老板,他唯一做错的,就在于他长了个五短身材,所以他理应被嘲笑和歧视、被调侃其性器官,而他之所以是五短身材,只是因为这个角色的设定是亚裔男性。

明白了吗?其他人的错,在于他们的品德,而Han的错,在于他的身体。也就是说,假如其他角色洗心革面,那他们依然是好人、是有社会地位的人,而Han是不可能再长高了,所以他永远是个三寸丁,所以他理应永远被嘲笑和歧视、被调侃其性器官。

1963年,马丁路德金发表旷世演讲《我有一个梦想》,其中非常著名的一句话是:“我梦想有一天,我的四个孩子将在一个不是以他们的肤色,而是以他们的品格优劣来评判他们的国度里生活。”

编剧们会没有读过《我有一个梦想》?他们会不知道品德与肤色的关系?

这就是整部剧的腹黑之处,表面上看起来大家都很“平等”,都是用来被歧视的,但实际上歧视与歧视之间是不同的,一种是品德方面的歧视,另一种是基因方面的歧视,哪种歧视更严重就不用细说了吧,你能改变品德,但你能改变基因吗?

换句话说,这种歧视系统的潜台词就是:如果你不是亚裔男性,那你只要不自我堕落,你就是“正常的”;而如果你是亚裔男性,那不论你如何努力,你都是“不正常的”。

还不明白?翻译一下:其他各色人种,只要不自我堕落,就远比亚裔男性更强、更好、更高级。