职业经验 测试行业的编程语言之争

思寒_seveniruby · 2017年05月18日 · 最后由 kuroky 回复于 2017年08月29日 · 2639 次阅读

这篇文章写于 Gogole IO 2017 的前夜, 话题敏感没敢发布, 结果一觉醒来 Kotlin 就成 Android 官方支持的语言了. 所以觉得还是把文章放出来吧. 如下是原文


语言之争是整个 IT 行业永恒的话题, 那什么样的语言才是测试工程师最适合的语言哪? 这篇文章先抛砖引玉介绍下.

我的编程语言历史

大学时代 C++ ASP

大学的时候老师们教的是 java 和 c++, 我的 java 课程学完, 我都不知道 java 是什么东西. 被 java 啰嗦的语法, 繁杂的配置和丑陋的 UI 体系恶心到不行.
再加上当时流行微软的 MFC 编程, 所以就使用了 Visual C++ 和 MFC 框架编程. 开发过一些查杀病毒的小工具.
那个时候大学的同学也有用 asp 帮别人开发网站, 所以我也学了一点 asp. 只是当时对开发网站的确不感兴趣.

外包公司时代 C# Python

在中软资源工作过一年, 因为做微软外包过来的一部分业务, 所以就早早的使用了 C#, 结合强大的 VS 环境, 编程能力飞升.
当时自己也开发了一堆小工具, 比如测试用例生成工具, 附带局域网聊天. 那个时候真不知道这些编程语言能干嘛. 也没想过开发什么网站之类的.

在这个时期, 自己也对安全有所涉猎, 混了不少圈子, 写过木马, 研究过病毒免杀.
后来看到大牛们出了精通 C 和汇编外, 还鼓励学习一些脚本语言. 我记得当时云舒用的是 PHP.
我当时查了下发现 python 很火, 简单的代码就能做很多工作, 所以就买了一本书好好的学起来了.

后来项目组有个德国人进来带我们, 他看到我在学习 python, 也觉得挺意外, 他告诉我德国的不少大学都是教 python 的, (我们的学校还在教 VB..)
还时不时的经常给我题目测试我, 比如如何遍历一个深度的目录, 找出所有符合条件的文件.
从那之后就用了 python 写了不少的脚本, 也偶尔研究 python 开发的各类黑客工具. 比如 sqlmap 之类的.

这段时间的语言体系主要是 C# VC Python

阿里时代 Ruby Bash

进了阿里之后, 我对自动化并不感兴趣. 领导知道我技术水平还可以, 想让我负责阿里的搜索引擎的自动化测试. 而我拒绝了.
我说自己只是想做好测试工作, 成为一个好的项目测试经理. 当然还有另外一个原因, 那个框架是 ruby 写的, 我自己比较喜欢 Python. 挺反感 ruby 的.
毕竟自己学了 2 年, 也算略有小成. 当时还无知的列出了 Python 比 Ruby 好的十大原因.

进阿里后的工作环境发生了很大的变化, 从原来的 windows 体系的测试转型成了服务端的测试.
因为各类的测试工作全都是在 linux 上, 所以在同事的指导下, 就开始学习 bash, 然后发现了 bash 很多很好玩的特性. 比如 awk sed grep 三剑客, 比如 ps curl 等.
从那之后就迷上了编程, 慢慢的目标从测试经理转到了测试开发工程师的方向上了.

后来还是接手了一部分的搜索引擎的自动化测试, 一部分的 UI 测试等. 因为他们都是同事们用 ruby 开发的. 所以我也开始学习 ruby 了, 然后就了解了 Rails. 才发现别有洞天.
也在部门逐渐的承担一些技术研究工作, 分析和改造各类的测试工具.

这期间的语言功底是 Ruby Bash 为主. 因为学习的很快, bash 小有成就, 还做过一阵子的公司内部的 Bash 授课讲师.
我自己开发的 BashGems 也先后从阿里带到百度再带到其他的公司, 接触过的同事都对这个框架赞誉有加.

百度时代 Ruby C PHP

百度的语言体系主要是 C 和 PHP, 所以自己又深入的学习了下 C 相关的知识, 在公司跟着推进单元测试. 做一些算法测试项目.
深挖过单元测试和覆盖率统计, 以及 Valgrind SystemTap 等 profile 工具.

参与维护接口测试. 百度后台的接口测试是 ruby 开发的. 所以 ruby 的功底没有丢, 一直在深化学习. 那个时候 Rails 特别火. 自己也写过一些小网站和测试管理平台.
后来也研究过一些 PHP 的字节码和扩展编写.(php 的扩展是 c 写的). 对 PHP 的生态了解了一部分

这期间的主要技术体系是 Ruby C PHP
这期间语言进度不大, 但是对测试的理解深入了很多, 那段时间得以研究了很多深层次的测试问题, 比如

  • 算法如何测试
  • 覆盖率统计的原理是什么
  • 应用的运行模型是什么样子的
  • 大规模的接口测试是如何管理的
  • 测试框架应该如何设计

对这些问题的思考和沉淀为自己带来了很多收获.

创业公司时代

先后进入了几家创业公司. 才发现了语言是其次的, Runtimes 才是最核心的. 比如性能监控, 覆盖率统计,业务建模, 代码静态分析,还得都是基于 Runtimes 的技术体系.
需要对引擎进入深入的了解, 大部分企业又是 JVM 为主的体系. 真正需要被拯救的也是 JVM 体系上各种落后的技术. 所以我又调整了自己的重心, 弱化语法重视引擎.
开始认真的学习 JVM 字节码 插桩 Hook 和一些机器学习, 数据分析的工具和平台.

我也一度迷恋过 NodeJS, 觉得他是一统世界的语法,后来经过使用和深度的分析才发现它成不了真正的后端开发引擎. 只是前端的粘合剂. 所以就放弃了.
开始物色更好的全栈语言. 也就是 Scala. Scala 用起来还是很顺的, 就是太难. 概念复杂. 这决定了他不能一统世界.
Scala 最大的问题是他与 Java 并不是完全互通的, 所以我也在物色更好的语法. 从而更好的分析 java 应用.

这期间主要的语法体系是 Ruby Scala, 后面更是全面转向了 JVM 的生态.

编程语言之争的本质

在开启争议话题之前, 我得先科普几个重要的概念.

  • platform 是指特定平台上的运行能力和企业开发体系 windows linux unix solaris ios mac android
  • runtime 特定语言的运行时 jvm cpython node
  • language 语言自身的语法结构 java python ruby nodejs
  • Library 生态系统

所以选择什么样的语言, 几乎也决定了你以后所从事行业的深度了. 我从三个层面分别介绍不同语言的优缺点

Platform Runtime Language Library
Java All 支持 Android 开发 JVM 语法较弱, IDE 很强 独立生态, 生态强大
Python All 不支持 Android 和 iOS 企业开发 CPython Jython 人生苦短我用 Python IDE 一般 独立生态, 生态强大
Ruby All 不支持 Android 和 iOS 企业开发 CRuby JRuby 语法优美 Web 开发生态强大 代表 Rails 移动开发 大数据计算一样不沾
Scala All 一定程度支持 Android 和 iOS 的企业级开发 JVM Java 界的 C++ 仅适合高智商人群 可复用 Java 的生态, 大数据计算是优势 代表 Spark
Kotlin All 对 Android 企业级别的开发支持很积极 JVM The Good Part Of Scala 官方宣言:如果你喜欢 scala 就一直用 scala 吧. 可复用 Java 的生态. 官方目前在重点支持 Android
PHP All 不支持 Android 和 iOS 的企业开发 Zend Web 开发中的 Python, "全世界最好用的语言" 除了 Web 开发几乎一无是处, 移动开发, 大数据计算一样不沾
NodeJS All 不支持 Android 和 iOS 企业级别开发 Node+V8+JVM 首个"全栈"语言, 前端工程师的救星, 后端工程师眼中的垃圾 除了 Web 开发几乎一无是处
Swift 几乎 All 支持 iOS 开发 Swift 和 Scala Go 类似的现代语法, 比 OC 是很大的进度 独立生态. 生态一般, Web 开发和 iOS 开发可以胜任
ObjectC 主力 iOS 开发 ObjectC C++ 的方言版 Swift 可复用 OC 的生态
Go All Go 现代化的语法结构 生态强大
C# All 最近几年也开始支持 Linux 一定程度支持移动开发 .Net 现代化的语法结构 生态强大. 不过一般不会用于服务器开发

补上几个看起来"不正常"的事情辅助理解

  • python ruby 可以运行在 jvm 上. 对应的项目叫 jython jruby
  • nodejs 和 jvm 都支持 javascript 语言标准, 也就是 javascipt 也可以用于 java 开发.
  • js 可以借助 nodejs 和 web 实现前后端语言统一, 成为"全栈"语言. 但是实际上 scala kotlin 等很多语言也可以生成 js. 从后端生成前端与语言. 也是"全栈"语言.

从上面的对比图可以得出的结论如下

  • Python 的地位无人可撼动. 因为它拥有自己的完整生态.
  • Go 会取代 C 系列的语言迅猛发展
  • Java 会走下坡路. 因为 Scala Kotlin 的语言优势很明显, 又可复用 Java 的生态. 会对 Java 造成很大的冲击.
  • Ruby PHP ObjectC 会走下坡路, 如果只是 Web 开发, 他们都很胜任. PHP 生态强大, 短时间内不会大幅度滑坡.
  • NodeJS 目前会保持增长, 未来会走下坡路, 后端语言取代前端语言的时代即将到来. Kotlin Scala TypeScript Elm Dart 都在尝试编译为 js 并提供了更强的语法和生态支持

说说你的看法

零零散散的写了一堆, 有些细节上我模糊掉了. 比如 scala.native kotlin.native 是可以开发原生程序的, 所以理论上也能将来支持 iOS 之类的.
没法做到全都正确和细致. 所以整篇文章可能会略有不太考究的地方. 仅供参考.

接下来问题就来了

  • 哪种编程语言你最喜欢?
  • 哪种语法比较适合测试行业?

转载请注明来自于 https://testerhome.com/topics/8727

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 45 条回复 时间 点赞

很抱歉来回复这种口水贴(当然楼主很有水平,分析的比较到位,我只是说这个话题会引来口水)

原则:语言是工具,无优劣好坏之分。

基于这个原则得出结论:
1、项目用什么语言,你就要用什么。同事用什么,你用什么。否则没法沟通。
2、既然是工具,所以轮子多的好。。现在看来 java 、python 轮子最多。最省事,
3、深受设计模式毒害,所以不喜欢 python 这种脚本语言。并且。我喜欢研究语言底层和编译器的东西。比如 jvm 底层机制。这样才能写出精准高效的程序。。所以我喜欢用 java 通杀一切需求。(以前在微软是 c#)

已打赏
不过我实际上对:
大规模的接口测试是如何管理的
测试框架应该如何设计

这两点比较感兴趣,希望有时间楼主可以开个专栏讲解一下

装逼装的漂亮 谁的个人网站? 你这账号上个月才注册的,社区的帖子你也百分之一都没看吧

个人喜欢 java,不喜欢 Python

淼淼淼 回复

自己根据自己的情况选择好就行. 没有 100% 正确的答案.

如果做了明确的推荐. 那么就是对所有人的不尊重. 会让别人对自己的选择有严重的挫折感.
这种得罪全天下的事情不要做. 不然就会挨喷.
刚入门学习的人还可以接受新思想, 一旦深入某种语言就会陷入保守无法掉头的. 去叫醒这类人没意义.

你可以从如下的几种情况综合考虑

  • 研发的技术体系
  • 最全栈全能的语言体系
  • 能支持前端开发

这样既能深入研究底层的编译器和字节码, 做到覆盖率分析, 性能分析和业务建模, 又能做到可以做成一个完整的平台.
一种语言能搞定最好, 搞不定就得再多学一两种.

装逼装的漂亮 谁的个人网站? 你这账号上个月才注册的,社区的帖子你也百分之一都没看吧

今天闲得无聊来完成下前几天想做的事情,本来是验证下账号是否已注销,却无意发现这么有深度的文章,看了真是深受启发。
总结下,这就是个私人网站,某一个人的格局决定了社区的形态,所以无论掌握 99 八十一种语言也好,思维的高度决定了也只是一个码农的聚集地。

语言代表了创造者的思想,无所谓争不争,何况本身就不是为了测试而生的,能够一统天下的只会是思想,而不是某一种技术,即使存在这种技术,那它也是无门无派的,发挥各种语言的特点反而有可能去更方便解决某一个问题,只有格局不够的人才喜欢分你我,较高下,非要争个你死活我,总以为自己天下第一,自己是世界标准。自己的经历多么地辉煌,可以成为所有人的模板和典范,而且一遍又一遍不厌其烦地在不同的帖子里炒冷饭,太恶心,一个加班狗的经历有什么值得炫耀呢?

致大多数人,不要盲目跟随或者崇拜,要有辨识力,你可以不会任何一门语言,但你有解决问题的能力就行,只要你高兴,爱用什么就用什么,解决了别人无法解决的问题就行,不需要关注这种无聊的话题,让其他人去主流,去流行,而其实只是愚蠢地被你甩在身后,当你有天进入什么度什么巴的公司,你发现这群人也不过如此,你也可以对他们嗤鼻一笑,那样才是你自己。

很庆幸最近才发现这个论坛,不过写完这篇也不会再登录了,祝大家继续吹捧,继续膜拜,共同进步吧。

nil 回复

我想你肯定会回来看看,大家的反应,否则也满足不了你的某种心理。不过我还是希望你不要回来了。88,走好不送。

我这现在的做法是根据开发来,开发用 java 测试也用 java,开发用 dart 测试也用 dart,大家统一,好沟通

让我选我会首选 node,容易开发平台化的测试工具,方便统计测试数据和维护。
其次 python,数据处理分析上有优势,但是 python23 版本相互不兼容,这点让人很不爽
最后不行就 JAVA,因为开发选型都是 java,不得不用 java 测接口

羡慕楼主可以有机会使用这么多的语言。
其中对 nodejs 的评价和定位我觉得我觉得有失偏颇。
对于实时性要求比较强的终端应用,nodejs 是很好的选择。 比如 appium 和 STF。

华全 回复

nodejs 的实时性很好. 这个被过度吹嘘了. 很多语法都支持异步和高并发. 速度一样很高. 比如 akka em 模型, 或者 erlang

10000 个赞同 还是聊点实际的

nodejs 已经不仅仅只是 nodejs 了,什么 es6,coffeejs,vuejs 等,泛滥着


直接粘贴不知道能看到不,感谢思寒大哥分享

知识面真广,之前在游戏公司只用 lua……后来被陆陆续续来的老司机安利 python 。 现在换了工作,感慨还好有点 python 准备 否则工作真不好换

yonghang.zhang 回复

嗯 这个的确是非常重要的 类似 sql 领域特定语言

说到点上了,像楼主求解

反正我喜欢 c#,不过现阶段主攻 js

之前喜欢用 python,用久了后现在喜欢用 java 和 js

适合自己,自己用的最熟练,能用它完成自己的工作,能给自己带来好处和提升效率的就是最好的。

python 效率高,但我个人还是比较喜欢 java

node 生态圈还是挺强大的,web 测试我还是选 node,哈哈。

为啥没有加上 shell 呢。。。shell 也是要学习的啊,平时也会用

谷歌大牛对 Kotlin 见解:http://gad.qq.com/article/detail/7211879

辗转这么多公司,工作年限多久了 (看了题主另一篇讨论测试职业发展的帖子,10 年了)
我现在工作满 5 年,现在第三个公司,都觉得这会影响以后找工作了

Baozhida 回复

哈哈哈,其实还好,我是 5 年 4 家

026 回复

3 年的时候五家了,第一家工资拖欠,第四家也是工资拖欠,没办法只能离职~

回复

阿里是你的最好归属,看好你

恒温 回复

不是说好不理这类人了吗, 你咋又会了...

老夫写代码就是一把梭,操起鼠标键盘就是干。。

然后就了解了 Rails. 才发现别有洞天

接触 Rails 后发现对设计良好的系统做测试和运维是多么愉快😂

那么到底哪种语法比较适合测试行业?

无悔 回复

我修改下. 谢谢 还有 @yuweixx

只会 java。。

46楼 已删除

个人觉得 python 挺适合测试行业的,不过自己选择的 java(以前学过一段时间 c# 写测试工具),因为公司开发用的 java,想保持技术一致性。

其实,各种语言都要会。

ting 回复

熟练使用一门万能的胶水语言, 精通多门语言的 runtime 比如 jvm art 的机制. 是最好的状态.

新人建议先学 java,语言规范,ide 强大,生态好,学习成本低。基本能解决大部分问题。
有一定基础的,建议 python 或者 java,只要是生态圈太好了,遇到问题容易解决。
其他的看自己兴趣了,做测试平台类似的可以 python 或者 ruby。

026 回复

😅 一面就挂,还是算了

思寒_seveniruby 测试行业的编程语言之争 中提及了此贴 11月20日 11:11

我坚信我的 C# .Net Core 终将干倒 Java,壮哉我大微软,蛤蛤

C# All 最近几年也开始支持 Linux 一定成都支持移动开发 .Net 现代化的语法结构 生态强大. 不过一般不会用于服务器开发

这里的 “成都” 应该为 “程度”

python、kotlin

ruby 支持 ios 和 android 开发

恒温 回复

这就是我帖子里故意提到模糊了一些细节. rubymotin 不是太流行, 所以我没提. 没有规模化使用的我就不列举了.

上头条

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册