对各种语言的偏见

来源:互联网 发布:pdf提取软件 编辑:程序博客网 时间:2024/04/29 10:51

对各种语言的偏见

这大致是我编程语言的学习经历:

  1. 2003年学html/js
  2. 2004年开始学C
  3. 2004年学C++
  4. 2005年学汇编和C#
  5. 2007年学PHP
  6. 2009年学Python
  7. 2013年学GO,深入学了JS(JQuery,AngularJS)
  8. 2014年学Java(Android)
  9. 2015年学Scala(Spark)

我虽然没有发明一门语言,但这些语言都用在实际不小的项目中,作为使用者对他们我想说说我的偏见。

C++

我觉得C++比较恶心的东西是:

  1. 模板:这个东西真的考验智商,也可以作为装逼神器,几乎水平不怎么样的和超级大牛(万里挑一的那种)会喜欢用模板。现在我从来不用,SRS中只有SrsAutoFree和SrsProtocol用到了模板,没有办法必须得用。
  2. 运算符重载:这个东西好多人喜欢用,真的很傻逼的功能,好好的函数不用,要用奇怪的符号,严重影响可读性。
  3. 多重继承:这个也是装逼神器,SRS中还有不少多重继承,但是都是限于继承接口;类的多重继承,恶心的东西,接口的多重继承挺好用的。
  4. C++11新特性:这些新特性都是作死的东西,还嫌语法上不够么?现在这个样子已经足够可以写出难懂的代码了,还要造更多奇怪的语法。SRS坚决只用ASCII C++,也就是C++98标准。
  5. boost和poco:两个巨无霸,我勒个去,从来不敢用。一个超级功能的库,就会背离软件的核心——软件这种人造产品只能解决一部分问题而不能解决所有问题。
  6. 崩溃:各种崩溃,各种越界,如果是assert导致的还好查一点,如果是越界就真的只能靠神仙保佑能查到是哪个地方导致的。

我选择C++的原因,它了不起的地方:

  1. 类:析构和构造,以及类对于问题的简化,也就是所谓的OO,这个还是广泛应用的,就算是C中也是有各种伪造的类的方式,譬如内核的File Object。
  2. 虚函数:有些函数是虚的,也就是在某个地方不知道,但是没有关系不影响整体的逻辑,这个可以让DIP、接口、抽象基于这个技术实现,是非常有用的神器。
  3. STL:虽然STL本身是模板写的,但是这个库提供了常用的数据接口,而且性能很好,这个很赞。
  4. 高性能:SRS是服务器,用C++的唯一理由就是因为性能,C和C++编译出来的程序,性能没有什么差异,在于怎么写的了;而其他语言,譬如GO,就是好好写也达不到C++的性能。原因在于很多时候,特别是对于内存操作不可避免的业务领域,C++提供对于内存的管理,是非常强大的。

Python

我觉得Python恶心的地方包括:

  1. 性能:Python的性能真的好差,凡是有性能要求的地方,就不能用Python。居然还有个rtmplite(Python写的RTMP、RTMFP服务器),是挺轻量级的,然而有什么卵用?只能当做学习和原型。
  2. 兼容性:Python最奇葩的是,竟然Python3造出来几乎没有用,都在使用Python2,而且两个版本不兼容,我勒个去,搞什么鸡毛。
  3. 字符集:Python对中文支持不好,额,确实支持得很麻烦。GO在这一点上花了大量精力。
  4. 打包:Python打包会出各种奇葩的问题,什么cxfreeze,什么pyinstaller,挺多的就是不靠谱。

我觉得Python牛逼的地方包括:

  1. 完善:Python实现复杂的业务逻辑很方便,各种框架,数据库支持得好,稳定性好,协程库也挺好用。对于没有啥并发的复杂业务系统,Python最合适。
  2. 依赖少:Python解释器几乎在所有环境都有,所以不需要其他依赖就可以跑起来,如果打包出来,和C++一样可以不依赖系统。

GO

GO的想法真的是很好,搞一个C++和Python的结合体。我觉得GO恶心的地方是:

  1. interface{},这个是GO最傻逼的地方,一个object,非得用这么长一个表达,额外加个关键字有那么难么,搞这么长一个东西,读起来非常难以理解。
  2. 性能:其实GO的性能相当高了,但是和C++相比,还是差不少。GO难以做高性能服务器,特别是频繁操作内存的那种,譬如流媒体。

GO牛逼的地方:

  1. 几乎目标都实现了,除了上面两个不那么致命的点,所以我觉得GO确实了不起。
  2. 并发:GO的goroutine,以及多核优化,确实做得相当不错。go-sharp是一个高级反向代理,可以作为多进程SRS的反向代理。
  3. 错误:GO的panic其实有点难以理解,不过它本质上是采用了C的错误码的方式(error),不过在goroutine里面捕获致命错误(panic),这种兼顾考虑其实也不错,挺好的。
  4. 完善度:GO的库还是越来越完善,特别http都加到语言库里面了。但是GO并非解决所有问题,我觉得从这点来看,GO做得很好。
  5. 打包:GO对于编译优化,打包和部署有自己的一套,这个做得确实不错。

GO是除了C++之外,唯一有新的想法的语言,也就是GO要理解起来没有那么容易。

Scala

我见过最散漫的语法就是Scala,恶心的地方是:

  1. 混乱:语法过于灵活,水平高的人能掌握,实际上一般人都会写出火星代码,特别对于中国人来讲,没有同理心情商极低,基本上写出来的Scala代码不可读。中国人写的C都像火星文,那么严格的语法都可以糟蹋成那个样子,何况目标就是可以随便写的Scala?!

Scala比较不错的地方:

  1. 函数式:其实Scala和Python超级像,比Java确实强多了。
  2. Spark:这个大数据框架用的Spark,不学Scala也没有办法。

JS

JS是前端语言,JS垃圾的地方是:

  1. NodeJS:这种把JS作为服务器的方式,基本上是开发很快,差错很难,维护不可能。别作了,这种异步回调,而且调试不方便的东西,做服务器是什么企图啊!这是一个万能语言的典型失败例子。
  2. Nginx脚本:据说Nginx准备用JS作为服务器脚本语言,一个牛逼的服务器就要这么作死去了。FMS的脚本语言也是AS,也就是JS。服务器支持脚本语言,不过就是插上翅膀的人类,做梦能飞翔吧~

JS还是不错的,AS都是它的翻版,牛逼的地方是:

  1. JS作为Web前端,没有更好,确实做得不错了。
  2. 专业的库:JS的库从来都没有超级大的,都是很专业的库,譬如JQuery和Angular,都是鲜明的要解决一类问题。这种库确实很不错。

Use Something Good

人类固然能做到卓越,譬如李白写的诗,悟空经常说的四大名著之一金瓶梅,但是软件,特别是有用的软件,很难是一个人能做出来的。
因此软件本身最大的局限性,在于几个平常人,发挥自己的能力,做成单个人做不成的事情。关键点是:

  1. 解决部分问题,而不是全部问题。几个人或者几万个人,不可能做出一个解决所有问题的东西,那是神,而不是人要做的事情。
  2. 沟通是最大的风险。一个人写10万行代码,经历3年,在第2年时就会忘记第一年的代码是什么意思。自己和自己沟通都有巨大风险,更何况一群居心叵测的家伙写的心怀鬼胎的代码,愿神保佑我们。
  3. 用语言、团队的长处。语言也是人的作品,团队也是人构成,不同的人有不同的长处,语言也是。因此在一个项目中,应用多个语言,是一个软件系统必须要做的事情。

SRS中用到的语言是:

  1. 高性能服务器:用C++写,目前没有其他语言能搞定。(用C不如用部分C++)
  2. 高性能API:用GO写,某些并发访问很高的API。譬如实时计算系统的客户端数据。
  3. 后端服务系统:用Python写,没有并发要求,业务逻辑复杂。
  4. Spark:用Scala,大数据,目前还在计划中。
  5. JS:前端的Bootstrap和Angular,还有JQuery。

这几种语言组合起来,挺好用的。

0 0