对各种语言的偏见
来源:互联网 发布:pdf提取软件 编辑:程序博客网 时间:2024/04/29 10:51
对各种语言的偏见
这大致是我编程语言的学习经历:
- 2003年学html/js
- 2004年开始学C
- 2004年学C++
- 2005年学汇编和C#
- 2007年学PHP
- 2009年学Python
- 2013年学GO,深入学了JS(JQuery,AngularJS)
- 2014年学Java(Android)
- 2015年学Scala(Spark)
我虽然没有发明一门语言,但这些语言都用在实际不小的项目中,作为使用者对他们我想说说我的偏见。
C++
我觉得C++比较恶心的东西是:
- 模板:这个东西真的考验智商,也可以作为装逼神器,几乎水平不怎么样的和超级大牛(万里挑一的那种)会喜欢用模板。现在我从来不用,SRS中只有SrsAutoFree和SrsProtocol用到了模板,没有办法必须得用。
- 运算符重载:这个东西好多人喜欢用,真的很傻逼的功能,好好的函数不用,要用奇怪的符号,严重影响可读性。
- 多重继承:这个也是装逼神器,SRS中还有不少多重继承,但是都是限于继承接口;类的多重继承,恶心的东西,接口的多重继承挺好用的。
- C++11新特性:这些新特性都是作死的东西,还嫌语法上不够么?现在这个样子已经足够可以写出难懂的代码了,还要造更多奇怪的语法。SRS坚决只用ASCII C++,也就是C++98标准。
- boost和poco:两个巨无霸,我勒个去,从来不敢用。一个超级功能的库,就会背离软件的核心——软件这种人造产品只能解决一部分问题而不能解决所有问题。
- 崩溃:各种崩溃,各种越界,如果是assert导致的还好查一点,如果是越界就真的只能靠神仙保佑能查到是哪个地方导致的。
我选择C++的原因,它了不起的地方:
- 类:析构和构造,以及类对于问题的简化,也就是所谓的OO,这个还是广泛应用的,就算是C中也是有各种伪造的类的方式,譬如内核的File Object。
- 虚函数:有些函数是虚的,也就是在某个地方不知道,但是没有关系不影响整体的逻辑,这个可以让DIP、接口、抽象基于这个技术实现,是非常有用的神器。
- STL:虽然STL本身是模板写的,但是这个库提供了常用的数据接口,而且性能很好,这个很赞。
- 高性能:SRS是服务器,用C++的唯一理由就是因为性能,C和C++编译出来的程序,性能没有什么差异,在于怎么写的了;而其他语言,譬如GO,就是好好写也达不到C++的性能。原因在于很多时候,特别是对于内存操作不可避免的业务领域,C++提供对于内存的管理,是非常强大的。
Python
我觉得Python恶心的地方包括:
- 性能:Python的性能真的好差,凡是有性能要求的地方,就不能用Python。居然还有个rtmplite(Python写的RTMP、RTMFP服务器),是挺轻量级的,然而有什么卵用?只能当做学习和原型。
- 兼容性:Python最奇葩的是,竟然Python3造出来几乎没有用,都在使用Python2,而且两个版本不兼容,我勒个去,搞什么鸡毛。
- 字符集:Python对中文支持不好,额,确实支持得很麻烦。GO在这一点上花了大量精力。
- 打包:Python打包会出各种奇葩的问题,什么cxfreeze,什么pyinstaller,挺多的就是不靠谱。
我觉得Python牛逼的地方包括:
- 完善:Python实现复杂的业务逻辑很方便,各种框架,数据库支持得好,稳定性好,协程库也挺好用。对于没有啥并发的复杂业务系统,Python最合适。
- 依赖少:Python解释器几乎在所有环境都有,所以不需要其他依赖就可以跑起来,如果打包出来,和C++一样可以不依赖系统。
GO
GO的想法真的是很好,搞一个C++和Python的结合体。我觉得GO恶心的地方是:
- interface{},这个是GO最傻逼的地方,一个object,非得用这么长一个表达,额外加个关键字有那么难么,搞这么长一个东西,读起来非常难以理解。
- 性能:其实GO的性能相当高了,但是和C++相比,还是差不少。GO难以做高性能服务器,特别是频繁操作内存的那种,譬如流媒体。
GO牛逼的地方:
- 几乎目标都实现了,除了上面两个不那么致命的点,所以我觉得GO确实了不起。
- 并发:GO的goroutine,以及多核优化,确实做得相当不错。go-sharp是一个高级反向代理,可以作为多进程SRS的反向代理。
- 错误:GO的panic其实有点难以理解,不过它本质上是采用了C的错误码的方式(error),不过在goroutine里面捕获致命错误(panic),这种兼顾考虑其实也不错,挺好的。
- 完善度:GO的库还是越来越完善,特别http都加到语言库里面了。但是GO并非解决所有问题,我觉得从这点来看,GO做得很好。
- 打包:GO对于编译优化,打包和部署有自己的一套,这个做得确实不错。
GO是除了C++之外,唯一有新的想法的语言,也就是GO要理解起来没有那么容易。
Scala
我见过最散漫的语法就是Scala,恶心的地方是:
- 混乱:语法过于灵活,水平高的人能掌握,实际上一般人都会写出火星代码,特别对于中国人来讲,没有同理心情商极低,基本上写出来的Scala代码不可读。中国人写的C都像火星文,那么严格的语法都可以糟蹋成那个样子,何况目标就是可以随便写的Scala?!
Scala比较不错的地方:
- 函数式:其实Scala和Python超级像,比Java确实强多了。
- Spark:这个大数据框架用的Spark,不学Scala也没有办法。
JS
JS是前端语言,JS垃圾的地方是:
- NodeJS:这种把JS作为服务器的方式,基本上是开发很快,差错很难,维护不可能。别作了,这种异步回调,而且调试不方便的东西,做服务器是什么企图啊!这是一个万能语言的典型失败例子。
- Nginx脚本:据说Nginx准备用JS作为服务器脚本语言,一个牛逼的服务器就要这么作死去了。FMS的脚本语言也是AS,也就是JS。服务器支持脚本语言,不过就是插上翅膀的人类,做梦能飞翔吧~
JS还是不错的,AS都是它的翻版,牛逼的地方是:
- JS作为Web前端,没有更好,确实做得不错了。
- 专业的库:JS的库从来都没有超级大的,都是很专业的库,譬如JQuery和Angular,都是鲜明的要解决一类问题。这种库确实很不错。
Use Something Good
人类固然能做到卓越,譬如李白写的诗,悟空经常说的四大名著之一金瓶梅,但是软件,特别是有用的软件,很难是一个人能做出来的。
因此软件本身最大的局限性,在于几个平常人,发挥自己的能力,做成单个人做不成的事情。关键点是:
- 解决部分问题,而不是全部问题。几个人或者几万个人,不可能做出一个解决所有问题的东西,那是神,而不是人要做的事情。
- 沟通是最大的风险。一个人写10万行代码,经历3年,在第2年时就会忘记第一年的代码是什么意思。自己和自己沟通都有巨大风险,更何况一群居心叵测的家伙写的心怀鬼胎的代码,愿神保佑我们。
- 用语言、团队的长处。语言也是人的作品,团队也是人构成,不同的人有不同的长处,语言也是。因此在一个项目中,应用多个语言,是一个软件系统必须要做的事情。
SRS中用到的语言是:
- 高性能服务器:用C++写,目前没有其他语言能搞定。(用C不如用部分C++)
- 高性能API:用GO写,某些并发访问很高的API。譬如实时计算系统的客户端数据。
- 后端服务系统:用Python写,没有并发要求,业务逻辑复杂。
- Spark:用Scala,大数据,目前还在计划中。
- JS:前端的Bootstrap和Angular,还有JQuery。
这几种语言组合起来,挺好用的。
0 0
- 对各种语言的偏见
- 反击对言情的偏见
- 消除对Java的偏见
- 对易语言汉语编程环境误解与偏见的十个低级问题
- 纠正一下对 perl 的偏见
- 聊聊人们对程序员的偏见
- 对各种语言的看法
- 我对袁萌老先生的一些偏见
- 对各种编程语言的比喻
- 各种语言中对指针的叫法
- 偏见的本质
- sizeof的偏见
- 偏见
- 抛弃编程语言的偏见——对话百度架构师
- 这个社会对程序员存在哪些偏见?
- 这个社会对程序员存在哪些偏见?
- 对栈的各种操作的实现(C语言)
- 数据库的偏见—总论
- Java中类的继承与接口
- Vector3.Dot 与Vector3.Cross
- Search Insert Position
- Swift入坑--单例
- 创建Imgbutton 按钮
- 对各种语言的偏见
- Android开发—Navigation Drawer(侧边栏菜单实现)
- MYSQL区分大小写
- 全局异常捕获
- 解决多个XCode导致n个模拟器问题
- Android中OnScrollListener的详解
- hiho一下 连通性二·边的双连通分量
- Exynos4412 Android4.4 HDMI Porting Guid 第一篇
- cookies的赋值与取值