给Java说句公道话---转自王垠http://www.yinwang.org/blog-cn/2016/01/18/java

王垠博客转载的一些说明 转载原因 无意中在朋友圈中提到王垠这个人,提到了"无法理解的40行代码",于是怀着好奇的心网上搜索了下他的相关信息,于是“川大计算机系本科生”、"保送清华大学硕博连读",“博士读到还剩最后一年退学”、“cornell大学博士退学”.....一个个跳了出来,于是花了近一个下午的时间搜索了一下他发表的部分文章,对其传奇经历和天才般技能深深折服,特别深有体会的是他对于探索未知世界、遇到问题解决问题,特 阅读详情

原文地址:http://www.yinwang.org/blog-cn/2016/01/18/java

给Java说句公道话

有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java。” 他们很惊讶:“什么?Java!” 所以我现在来解释一下。

Java超越了所有咒骂它的“动态语言”

也许是因为年轻人的逆反心理,人们都不把自己的入门语言当回事。很早的时候,计算机系的学生用Scheme或者Pascal入门,现在大部分学校用Java。这也许就是为什么很多人恨Java,瞧不起用Java的人。提到Java,感觉就像是爷爷那辈人用的东西。大家都会用Java,怎么能显得我优秀出众呢?于是他们说:“Java老气,庞大,复杂,臃肿。我更愿意探索新的语言……”

某些Python程序员,在论坛里跟初学者讲解Python有什么好,其中一个原因竟然是:“因为Python不是Java!” 他们喜欢这样宣传:“看Python多简单清晰啊,都不需要写类型……” 对于Java的无缘无故的恨,盲目的否认,导致了他们看不到它很重要的优点,以至于迷失自己的方向。虽然气势上占上风,然而其实Python作为一个编程语言,是完全无法和Java抗衡的。

在性能上,Python比Java慢几十倍。由于缺乏静态类型等重要设施,Python代码有bug很不容易发现,发现了也不容易debug,所以Python无法用于构造大规模的,复杂的系统。你也许发现某些startup公司的主要代码是Python写的,然而这些公司的软件,质量其实相当的低。在成熟的公司里,Python最多只用来写工具性质的东西,或者小型的,不会影响系统可靠性的脚本。

静态类型的缺乏,也导致了Python不可能有很好的IDE支持,你不能完全可靠地“跳转到定义”,不可能完全可靠地重构(refactor)Python代码。PyCharm对于早期的Python编程环境,是一个很大的改进,然而理论决定了,它不可能完全可靠地进行“变量换名”等基本的重构操作。就算是比PyCharm强大很多的PySonar,对此也无能为力。由于Python的设计过度的“动态”,没有类型标记,使得完全准确的定义查找,成为了不可判定(undecidable)的问题。

在设计上,Python,Ruby比起Java,其实复杂很多。缺少了很多重要的特性,有毛病的“强大特性”倒是多了一堆。由于盲目的推崇所谓“正宗的面向对象”方式,所谓“late binding”,这些语言里面有太多可以“重载”语义的地方,不管什么都可以被重定义,这导致代码具有很大的不确定性和复杂性,很多bug就是被隐藏在这些被重载的语言结构里面了。因此,Python和Ruby代码很容易被滥用,不容易理解,容易写得很乱,容易出问题。

很多JavaScript程序员也盲目地鄙视Java,而其实JavaScript比Python和Ruby还要差。不但具有它们的几乎所有缺点,而且缺乏一些必要的设施。JavaScript的各种“WEB框架”,层出不穷,似乎一直在推陈出新,而其实呢,全都是在黑暗里瞎蒙乱撞。JavaScript的社区以幼稚和愚昧著称。你经常发现一些非常基本的常识,被JavaScript“专家”们当成了不起的发现似的,在大会上宣讲。我看不出来JavaScript社区开那些会议,到底有什么意义,仿佛只是为了拉关系找工作。

Python凑合可以用在不重要的地方,Ruby是垃圾,JavaScript是垃圾中的垃圾。原因很简单,因为Ruby和JavaScript的设计者,其实都是一知半解的民科。然而世界就是这么奇怪,一个彻底的垃圾语言,仍然可以宣称是“程序员最好的朋友”,从而得到某些人的爱戴……

Java的“继承人”没能超越它

最近一段时间,很多人热衷于Scala,Clojure,Go等新兴的语言,他们以为这些是比Java更现代,更先进的语言,以为它们最终会取代Java。然而这些狂热分子们逐渐发现,Scala,Clojure和Go其实并没有解决它们声称能解决的问题,反而带来了它们自己的毛病,而这些毛病很多是Java没有的。然后他们才意识到,Java离寿终正寝的时候,还远得很……

Go语言

关于Go,我已经评论过很多了,有兴趣的人可以看这里。总之,Go是民科加自大狂的产物,奇葩得不得了。这里我就不多说它了,只谈谈Scala和Clojure。

Scala

我认识一些人,开头很推崇Scala,仿佛什么救星似的。我建议他们别去折腾了,老老实实用Java。没听我的,结果到后来,成天都在骂Scala的各种毛病。但是没办法啊,项目上了贼船,不得不继续用下去。我不喜欢进行人身攻击,然而我发现一个语言的好坏,往往取决于它的设计者的背景,觉悟,人品和动机。很多时候我看人的直觉是异常的准,以至于依据对语言设计者的第一印象,我就能预测到这个语言将来会怎么发展。在这里,我想谈一下对Scala和Clojure的设计者的看法。

Scala的设计者Martin Odersky,在PL领域有所建树,发表了不少学术论文( 包括著名的《The Call-by-Need Lambda Calculus》),而且还是大名鼎鼎的Niklaus Wirth的门徒,我因此以为他还比较靠谱。可是开始接触Scala没多久,我就很惊讶的发现,有些非常基本的东西,Scala都设计错了。这就是为什么我几度试图采用Scala,最后都不了了之。因为我一边看,一边发现让人跌眼镜的设计失误,而这些问题都是Java没有的。这样几次之后,我就对Odersky失去了信心,对Scala失去了兴趣。

回头看看Odersky那些论文的本质,我发现虽然理论性貌似很强,其实很多是在故弄玄虚(包括那所谓的“call-by-need lambda calculus”)。他虽然对某些特定的问题有一定深度,然而知识面其实不是很广,眼光比较片面。对于语言的整体设计,把握不够好。感觉他是把各种语言里的特性,强行拼凑在一起,并没有考虑过它们是否能够“和谐”的共存,也很少考虑“可用性”。

由于Odersky是大学教授,名声在外,很多人想找他拿个PhD,所以东拉西扯,喜欢往Scala里面加入一些不明不白,有潜在问题的“特性”,其目的就是发paper,混毕业。这导致Scala不加选择的加入过多的特性,过度繁复。加入的特性很多后来被证明没有多大用处,反而带来了问题。学生把代码实现加入到Scala的编译器,毕业就走人不管了,所以Scala编译器里,就留下一堆堆的历史遗留垃圾和bug。这也许不是Odersky一个人的错,然而至少说明他把关不严,或者品位确实有问题。

最有名的采用Scala的公司,无非是Twitter。其实像Twitter那样的系统,用Java照样写得出来。Twitter后来怎么样了呢?CEO都跑了 :P 新CEO上台就裁员300多人,包括工程师在内。我估计Twitter裁员的一个原因是,有太多的Scala程序员,扯着各种高大上不实用的口号,比如“函数式编程”,进行过度工程,浪费公司的资源。花着公司的钱,开着各种会议,组织各种meetup和hackathon,提高自己在open source领域的威望,其实没有为公司创造很多价值……

Clojure

再来说一下Clojure。当Clojure最初“横空面世”的时候,有些人热血沸腾地向我推荐。于是我看了一下它的设计者Rich Hickey做的宣传讲座视频。当时我就对他一知半解拍胸脯的本事,印象非常的深刻。Rich Hickey真的是半路出家,连个CS学位都没有。可他那种气势,仿佛其他的语言设计者什么都不懂,只有他看到了真理似的。不过也只有这样的人,才能创造出“宗教”吧?

满口热门的名词,什么lazy啊,pure啊,STM啊,号称能解决“大规模并发”的问题,…… 这就很容易让人上钩。其实他这些词儿,都是从别的语言道听途说来,却又没能深刻理解其精髓。有些“函数式语言”的特性,本来就是有问题的,却为了主义正确,为了显得高大上,抄过来。所以最后你发现这语言是挂着羊头卖狗肉,狗皮膏药一样说得头头是道,用起来怎么就那么蹩脚。

Clojure的社区,一直忙着从Scheme和Racket的项目里抄袭思想,却又想标榜是自己的发明。比如Typed Clojure,就是原封不动抄袭Typed Racket。有些一模一样的基本概念,在Scheme里面都几十年了,恁是要改个不一样的名字,免得你们发现那是Scheme先有的。甚至有人把SICP,The Little Schemer等名著里的代码,全都用Clojure改写一遍,结果完全失去了原作的简单和清晰。最后你发现,Clojure里面好的地方,全都是Scheme已经有的,Clojure里面新的特性,几乎全都有问题。我参加过一些Clojure的meetup,可是后来发现,里面竟是各种喊着大口号的小白,各种趾高气昂的民科,愚昧之至。

如果现在要做一个系统,真的宁可用Java,也不要浪费时间去折腾什么Scala或者Clojure。错误的人设计了错误的语言,拿出来浪费大家的时间。

Java没有特别讨厌的地方

我至今不明白,很多人对Java的仇恨和鄙视,从何而来。它也许缺少一些方便的特性,然而长久以来用Java进行教学,用Java工作,用Java开发PySonar,RubySonar,Yin语言,…… 我发现Java其实并不像很多人传说的那么可恶。我发现自己想要的95%以上的功能,在Java里面都能找到比较直接的用法。剩下的5%,用稍微笨一点的办法,一样可以解决问题。

盲目推崇Scala和Clojure的人们,很多最后都发现,这些语言里面的“新特性”,几乎都有毛病,里面最重要最有用的特性,其实早就已经在Java里了。有些人跟我说:“你看,Java做不了这件事情!” 后来经我分析,发现他们在潜意识里早已死板的认定,非得用某种最新最酷的语言特性,才能达到目的。Java没有这些特性,他们就以为非得用另外的语言。其实,如果你换一个角度来看问题,不要钻牛角尖,专注于解决问题,而不是去追求最新最酷的“写法”,你就能用Java解决它,而且解决得干净利落。

很多人说Java复杂臃肿,其实是因为早期的Design Patterns,试图提出千篇一律的模板,给程序带来了不必要的复杂性。然而Java语言本身跟Design Patterns并不是等价的。Java的设计者,跟Design Pattern的设计者,完全是不同的人。你完全可以使用Java写出非常简单的代码,而不使用Design Patterns。

Java只是一个语言。语言只提供给你基本的机制,至于代码写的复杂还是简单,取决于人。把对一些滥用Design Patterns的Java程序员的恨,转移到Java语言本身,从而完全抛弃它的一切,是不明智的。

结论

我平时用着Java偷着乐,本来懒得评论其它语言的。可是实在不忍心看着有些人被Scala和Clojure忽悠,所以在这里说几句。如果没有超级高的性能和资源需求(可能要用C这样的低级语言),目前我建议就老老实实用Java吧。虽然不如一些新的语言炫酷,然而实际的系统,还真没有什么是Java写不出来的。少数地方可能需要绕过一些限制,或者放宽一些要求,然而这样的情况不是很多。

编程使用什么工具是重要的,然而工具终究不如自己的技术重要。很多人花了太多时间,折腾各种新的语言,希望它们会奇迹一般的改善代码质量,结果最后什么都没做出来。选择语言最重要的条件,应该是“够好用”就可以,因为项目的成功最终是靠人,而不是靠语言。既然Java没有特别大的问题,不会让你没法做好项目,为什么要去试一些不靠谱的新语言呢?

Java简化臃肿代码之Lombok NULL 博文链接:https://rensanning.iteye.com/blog/1930853 立即下载

相关推荐

谈谈SAP顾问的几个发展趋势

大家新年好,今天想聊一下对SAP顾问发展趋势的一些个人见解。过去10多年得益于我国的经济发展,外资不断加大在中国的投资和中国企业的发展,SAP顾问行业得到了很大的发展和壮大。那么未来几年SAP顾问的职业发展到底怎么样呢?

syounger的专栏 2515

为Java说句公道话

有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java。” 他们很惊讶:“什么?Java!” 所以我现在来解释一下。1Java超越了所有咒骂它的“动态语言”也许是...

ifeves的博客 284

半导体领域知识 - 初级入门

半导体领域知识 - 初级入门 知识问答 1. 一个晶圆上根据芯片的大小,可以生产几百、几千、几万个芯片。如下图: 2. 8寸晶圆指的是什么?5nm工艺指的是什么? 8寸晶圆指的是直径为175mm(17.5cm)的晶圆,下面是6/812/18寸晶圆的尺寸以及相关发展历程。目前拥有12寸线的厂商只有5家,一个12寸晶圆厂的成本需要上百亿美金。 5nm工艺指的是在一个具体的芯片上,有很多微型结构(千万、亿级别的晶体管),这些核心基本单元MOS管的栅极宽度尺寸来衡量工艺的精细程度,如果是5nm就被称为5nm工艺

Hello World! 2万+

王垠

4. 相关链接 王垠的Email:shredderyin@gmail.com 王垠的自建博客:http://www.yinwang.org/ 王垠的新浪博客:http://blog.sina.com.cn/yinwang0 知乎上的[王垠]话题:http://www.zhihu.com/topic/19587684 王垠在IUB的个人主页:https://www.cs.indiana.e

xu_ya_fei的专栏 4304

私有化大模型部署:企业AI应用的核心架构

私有化大模型部署不是“一次性项目”,而是企业AI的“长期主义”投资——它需要企业投入时间、金钱和精力,但回报是数据安全、定制化能力、核心竞争力的提升。就像“自家厨房”一样,私有化大模型可能初期麻烦,但一旦搭建起来,就能为企业“做”出符合自己口味的“特色菜”,而这些“特色菜”,正是企业在激烈竞争中的“护城河”。愿你能构建属于自己的“AI大脑”,让技术真正赋能业务,让复杂变简单,让深奥变通透。附录:私有化大模型部署架构图(注:可根据企业需求调整,此为通用架构)

AI天才研究院 1023

视网膜血管分割数据集(DRIVE数据集,STARE数据集,REFUGE数据集,CHASE_DB1数据集,DiaRetDB1数据集)

在医学图像处理领域,视网膜图像分析对于眼部疾病的早期诊断与治疗具有举足轻重的意义。随着人工智能技术的蓬勃发展,尤其是深度学习算法在图像分割任务中的广泛应用,高质量的视网膜图像数据集成为推动该领域研究进展的关键要素。这些数据集不仅是训练和优化算法模型的基石,更是衡量算法性能优劣的重要依据。本文聚焦于视网膜图像分割领域,详细介绍 DRIVE、STARE、REFUGE、CHASE_DB1 以及 DiaRetDB1 这几个具有代表性的数据集。

weixin_43518285的博客 2272

给Java说句公道话

王垠还是蛮有料的,部分文章值得深入看,本人博客也会引入一些牛人的好文章。给java说句公道话

Sam_Deep_Thinking 1049

狗都能看懂的MAML原理讲解和代码实现

meta-leaning指的是元学习,元学习是深度学习的一个分支,一个好的元模型(meta-learner)应该具备对新的、少量的数据做出快速而准确的学习。通俗的来讲, 对于人来说,给几张橘猫的图片让看一下,再给你几张没见过的英短猫图片,你一定能很快识别出来都是猫。但是对于神经网络来说,并非如此。如果让一个小汽车分类网络去识别不同的大货车,那效果肯定很差。而传统的CNN网络都是输入大量的数据,然后进行分类的学习。但是这样做的问题就是,神经网络的通用性太差了,根本达不到“智能”的标准。而人类的认知系统,可以通

个人学习笔记 6万+

如何评价王垠的新文章,《给Java说句公道话》?

王垠是一位知名的程序员和程序员文化评论家,他的文章《给Java说句公道话》可能会引起不同观点的讨论。以下是对这篇文章的一些评价角度: 1. **观点独特性**: - 王垠的文章往往具有鲜明的个人观点和独特的视角,这篇文章可能会挑战一些对Java的常见负面看法,从而吸引读者的注意。 2. **技术深度**: - ...

353

CPU 访问外设的两种核心机制:MMIO(Memory-Mapped I/O) 和 DMA(Direct Memory Access)

BAR和DMA是计算机系统中两种关键的数据传输机制:BAR(基址寄存器)用于CPU与设备间的控制通信,映射设备寄存器便于配置操作;而DMA(直接内存访问)允许设备直接读写系统内存,无需CPU参与大量数据传输。典型场景如NVMe SSD读取数据时,CPU通过BAR下发指令,设备通过DMA高效传输数据到主机内存,最后中断通知CPU。虽然BAR能映射大内存空间,但仍无法替代DMA的高效数据传输功能,两者各司其职——BAR负责控制,DMA专注数据传输,共同实现高性能的硬件交互。

MHD0815的博客 238

PX4从放弃到精通(十一):混控及PWM输出

文章目录前言一、混控脚本二、使用步骤1.引入库2.读入数据总结 前言 一个人可以走的更快,一群人才能走的更远,交流学习加qq:2096723956 更多保姆级PX4+ROS学习视频:https://b23.tv/ZeUDKqy 分享知识,传递正能量,如有疏漏或不当之处,恳请指出. 一、混控脚本 混控脚本定义了不同 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pand

超维空间科技的博客 1万+

王垠关于编程语言的一些帖子,

王垠是编程语言方面的科学家,我很喜欢他对于程序设计语言的一些见解。 从很多角度都给与了我启发,当然它的博客里面的文章不只包括程序设计语言方面的。 本帖罗列一些我看到的他的关于程序语言的文章,摘抄一些我喜欢的话语,总结一些结论。 这里选取的文章并不是专门针对某一门语言的,而是介绍一类语言或者针对许多语言。 第5篇SQL,NoSQL以及数据库的实质,看似只是在说SQL实则不然。 谢谢王垠的分

山鸡哥的专栏 2501

从技术债红线到系统治理:透视 SAP Clean Core 中的 Level D

SAP推出的Clean Core分级体系将扩展风险划分为A到D四个等级,其中Level D代表最高风险类别,涉及直接修改标准代码、隐式增强、使用noAPI对象等不被推荐的做法。这些做法虽然短期见效快,但会带来升级冲突、数据完整性风险等长期问题。SAP强调治理重点不是完全消除经典ABAP,而是优先清理Level D对象,逐步向稳定接口迁移。典型案例显示,依赖内部细节的扩展往往在系统升级或云迁移时集中暴露出问题。企业应通过工具链持续监控Level D占比,将其纳入技术债管理范畴。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1064

王垠——想得太多,做得太少

我大四的时候,读到王垠从清华退学的文章,当时我虽然还没有正式开始攻读博士学位,但是也在实验室待了一年多了,老油条一根,对清华的博士生的学习生活了解得差不多了。当时读王垠的文章,我开始很不解:就剩一年,何不再坚持一下呢。后来我了解到一个人不能拿两个计算机科学的博士学位,就是如果王垠从清华博士毕业,他就不能去国外再读计算机博士,才算知道他的用意,心里还有些佩服他的果断决然。过去了这几年,王垠在国外没有

fsFengQingYangheihei的博客 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

读王垠博客有感..

                    读完王垠的<如何掌握所有的程序语言>.我突然发现这几天写的博客只是在浪费时间.                                                                                                                      _(:з」∠)_         ...

sinat_42576042的博客 946

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

王垠的相关信息

原文来自:http://docs.huihoo.com/homepage/shredderyin/index.html http://docs.huihoo.com/homepage/shredderyin/links.html

Welcome to Feng.Chang's Blog 848

王垠的过去和现状

 转载至:http://www.kurttlin.com/post/2011-10-03/5502426 我曾在2006年冬季接触到王垠的三篇文章:《完全用linux工作》、《写给支持和反对的人们》、《清华梦的粉碎--写给清华大学的退学申请》,今天巧合又再次读遍,于是决定把我知道关于王垠的信息总结一下。 1. 从清华退学 王垠是高考发挥失常进入四川大学计算机系9

SimonCoder的专栏 7万+

王垠的个人主页

http://docs.huihoo.com/homepage/shredderyin/ 王垠的个人主页 spell欢迎参观我的blog: http://spaces.msn.com/members/shredderyin。关于退学的文章和一些随便写的东西都在那里。这个主页还是保持原貌比较好 :)我爱滑板滑板是我最喜欢的运动。这里介绍一些滑板的基础知识。计算机工具介绍介绍一些...

weixin_33896069的博客 1102

java 太臃肿_Java简洁开发技巧,减少繁琐臃肿的代码

消除if...else的方法在项目实际开发中使用if...else判断的场景非常多,上面只是其中几种场景。下面再列举一下,其他常见的场景。1.根据不同的数字返回不同的字符串public String getMessage(int code) {if (code == 1) {return "成功!";} else if (code == -1) {return "失败!";} else if (c...

weixin_39881760的博客 326

王垠的这道Java高级面试题,看似容易,其实很难!

前言: 这篇博客转自微信的公众号上一篇文章,作为借鉴,也是给自己偶尔可以看下的素材。 不过正确性目前不确定,待商榷,所以我没有做一个自己学习的理解弄出原创出来,待以后觉得理解的差不多了,就会总结一下的。 不过目前总结的一句话是编译看左,运行看右。编译时类型是父类(Object),运行时类型选择是右边声明的子类(String),这个时候用Integer去赋值给父类,编译时不会报错,运行期间就会报错。

Coding的博客 985

王垠:一道 Java 面试题

描述 理解 题目中的这段程序在编译器正常,运行时异常。错误出现在 b[1] = Integer.valueOf(42); 这一行代码, a 赋值给 b,a 和 b 指向同一对象 new String[2],而 String[] 的实现是不支持 set integer 操作。 这行引发运行时异常。从实现角度来说,Java的数组是协变的:也就说Java的类型系统认为子类数组可以被赋值给父类数组。而...

豪伊大汉堡 954

王垠受邀面试阿里P9,被P10面跪后网上怒发文,惨打325的P10赵海平回应了

知乎上有一个话题:如何评价阿里 P10 赵海平对王垠的面试?最近成了热帖,这下赵海平跟王垠这次是真的火了。 由于本事件像电影的情节一环扣一环,文章比较长,直接一句话说下该事件始末:网红王垠受邀面试阿里P9岗位,被p10的面赵海平面试,王垠被挂后网上发文吐槽自己遭遇了不公面试,事件发酵该后面试官p10被上级打了低绩效!后续p10回应称自己是被其他部门邀请去做面试官的并无超出职责范围,疑自...

程序员生活志的博客 1万+

王垠 java_解读王垠博客“一道 Java 面试题”

偶然拜读IT界知名大佬王垠老师的博客,发现一个有意思的题目:1 //这段代码里面到底哪一行错了?为什么?2 //原文:http://www.yinwang.org/blog-cn/2020/02/13/java-type-system3 public static voidf() {4 String[] a = new String[2];5 Object[] b =a;6 ...

weixin_29359765的博客 463
上一篇: 开源深度学习库BigDL在阿里云E-MapReduce上的实践
下一篇: Hadoop跨集群数据拷贝工具DISTCP内部源码实现分析
github_zwl
博客等级 码龄11年 300粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值