测试行业的编程语言之争

这篇文章写于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