语言之争
每当一种语言诞生,世界上的争吵就多了一种声音。经常可见这样的讨论:1
2
3
4"xxx就不错,yyy是垃圾,这都不支持!"
"xxx太复杂了,不适合如今的应用模式。"
"xxx是最好的语言。"
....
我大学期间也自学很多语言,主要是想做个东西出来,看别人推荐什么语言,有什么现成的库,
就开始了入坑之旅。
- 从那以后,我就开始用python写爬虫抓音乐链接,书籍,还写了一些获取ss节点的程序,运行更新节点信息,
就可以很方便上外网了。感兴趣的可以移步我的github:ss-config-graber,
xcode文档的真实下载地址:XcodeDocDownload - Java写过界面游戏,当时的数值算法这门课我都是用它完成作业,还有被写烂了的xxx管理系统,也正是Java,让我
开始使用数据库而不是用写文件读文件的方式。 - c/c++写算法,数据结构,做OJ。往往一遍又一遍的去优化,看着用时又减少了就很开心。
- 后来Javascript居然可以写服务器端的应用,特别是express路由、模板、控制器简洁明了,路由注册拦截请求,调用中间件
处理数据,控制器控制由模型组成的数据去渲染模板。一个web系统就这样做完了,效率很高,所以当时写写回调也无所谓,还顺便
学习了前段的Ajax操作,那种处理和表现数据的感觉现在都印象深刻。所以正在上的工程数学的矩阵分解和一些统计方法我都想
办法写成js程序,放在手机里直接用。真的是到处运行。 - 学了golang后
学习完这些主流语言的感受
Java写得冗长,框架笨重又得配置xml,但是一旦项目规模上来了,
它却是协作下表现最不差的解决方案。因此现在使用Java最广泛。
毕竟水平一般不知道控制代码质量和内存使用的人太多。C没有类型系统,我看过一些为C添加的对象系统,使用宏如同魔法
一样,但是这种法案离C写基础构件的初衷还是很远,不是经历过正规
训练的人很难习惯和掌握什么都需要自己创造的环境。另外C的字符串
处理太弱,由于历史原因不支持UTF-8,这就在今天大部分的字符串处理
逻辑里带来不便。C++在C的基础上添加了很多语法,字符串处理同样比较差,多种范式,
怎么写都有办法达到目的,写起来最不容易控制复杂性,或者是在中途为
了追求优雅高效而忘记了自己究竟要干什么。项目不是写到一半被抛弃,
或者重构的时候干脆从头开始造轮子了。还有重要的一点是,C++的Bug最难找,由内存处置不当导致的错误层出
不穷,如果使用了高级特性如模板、迭代器、算子之后一旦出错错误信息
如果天书一样在屏幕上滚过,而你的一天就这样过去了。我见过很多C++的拥趸说C++是最强的语言,什么都能做还能做得很好,
这点确实如此,但是这么一件强大的武器需要非常熟练它的人才能发挥出它
的功效,而不是写过只有几百行代码就莫名喜欢的人所认为的那样,也不是
指针不释放,内存到处申请的人就能自称熟练使用C++。python写出的程序直观,最适合初期快速实现自己的想法。但是多线程GIL
的原因,重构社么的也麻烦,因为写的时候太自由了,同样不能充当主力,
而是作为干杂活的最佳选择,写出1.0版最快。javascript异军突起,google的V8引擎功不可没,现在进本上基本上所有智
能设备都可以支持javascript,这就有了广泛的市场。但是它的异步特性使得
我们长期受到一步一步操作的思路影响的大脑有点难以接受,常常困惑于为什
么没有取到数据,那一层层的函数包裹搞得人连函数边界在哪都不知道。这就
限制了一般程序员的使用,对象和继承出现的问题也比较奇怪。总的来说在web
前后端还是不错的,一致的语言带来的是连贯的思路,思路清晰又往往可以保
证项目完工,半路失败的项目太多了。PHP也略微了解一些,在web领域也是非Java就PHP了,简单易于掌握的才是最
好的,不管是个人开发者还是团队来说。最近准备了解Laravel框架,思路和
express一样,也是路由、控制器、模型,避免了之前写php的随心所欲,就像写
网页的php里面有连接数据库。其他领域基本就没有phph用武之地了。golang语言2007才出现,其特点是足够简单,还有很好的一点是静态编译,没有
依赖问题。我之前认为动态编译的程序,内存中只有一份,节省内存,程度加载的也快,
静态编译不好,慢不说程序占用空间还大。但是今天IT行业已经变了,到处都是云环境,
CPU、内存、硬盘太多了,反而生产环境变得复杂了,一不小心某个依赖变了,应用就有
可能出问题,静态编译却没有这个主要困扰开发者的问题。用下来感觉挺不错的。缺点是
没有泛型,写通用操作不方便,传个interface{}感觉怪怪的,它的特色goroutine我用的
还不是很多,国内使用的案例也比较少,可能没有公开或者别人还在观望。也只有以后再
补充自己使用的感受了。强制统一的规范比如大写方法可以导出,用习惯了自觉地在其他
语言里也是用这种规范,而规范减少了出bug的可能。自带的测试命令也使得我写单元测试
保证正确性,以前写代码就是弄一两个数据测一下就算完事,而这种单元测试经常能发现边
界情况的错误,还有性能测试、代码覆盖度测试都可以保证代码是工程级而不是玩票性质。
最近就在写golang的常用的数据结构和算法库,也算是轮子吧,可以关注utils
获取最新进展。
总结
由于我接触的东西还不是很复杂,所以自己的这些看法难免会有一些错误的地方,之后随着阅
历的增加,感受自然会多起来。随着代码量的增长,我越来越觉得每种语言都有适合运用的场
景和劣势的地方,并不存在统一的万能解决方案,也不是以个人情绪来判断好坏。
我倾向的一种工作方式是,先用动态语言快速实现自己最重要的目标,之后可以将关键部分慢
慢升级换成Java这样的工业成熟方案,性能要求高的地方c/c++改写,让它们成为为应用提供服务的
组件。上层用户使用的地方javascript做初步操作,或者充当业务初步处理层。分布式的场景,
golang的通讯交换消息方式也有erlang先行者,性能非常出色。