申 明:这是一篇容易引起撕逼的文章,为了祖国和谐,人民安康,请各位看官尽量理性讨论。同时,这篇文章是面向一些初入行的朋友进行一些相对中肯一点的分析和建议,虽然有浓厚的个人色彩,但我还是尽量以事实说话。另外,由于文中以自己所在的机构蜗牛学院所做的一些事情来举例,如果你认为这是软文广告,请止步于此。强哥打广告,都是硬的,软的不来。好吧,咱们进入正题。(ps:本文由蜗牛学院ceo邓强老师原创)
我先问大家一个问题:为什么中国人用刀叉是很容易上手的一件事情,而外国人用筷子,应该是他们在中国吃饭时最痛苦的一件事情呢?
为什么会这样呢?
其实原因非常简单,当我们学会了一门技术难度要求更高的技能以后,再去降级学习难度更低的技能是非常容易的一件事情,反之则不然。
这个道理同样适用于我们的学习,强哥对java和python都有较为丰富的使用经验,当然,java的应用经验更丰富,代码量比python更多一些。
正是由于我们丰富的java经验,当蜗牛学院的软件测试方向需要为学生讲授python课程时,我们所有的讲师都会被分配任务去研究python,并完成教案编写、教材编写、案例编写。
我们会发现,使用python是一件非常容易的事情。基本上来说,解决问题的方式,方法,算法,思路,所有的编程语言都一样。
我们去学习一门新的编程语言的时候就会容易很多,只需要关注与我们所熟悉的编程语言在语法和使用上存在哪些方面的不同即可。
那么问题来了?
蜗牛学院也要讲授python?
那到底是python值得学习还是java呢?
这里面有三点我必须说破,却很少有人从这个角度来给大家做分析:
01
如果一个不懂2、3门编程语言的人,或者很少使用到java或者python,来告诉你java好还是python好,这是赤裸裸的不负责任。
如果这个人用python并且混得还稍微可以,他一定会告诉你python好,如果这个人用java,他一定会告诉你用java好。
如果两个语言都没有用过的键盘侠,他会告诉你语言都是相通的,不要纠结。
每一个人都说得好有道理的样子,于是让你无从选择。
强哥熟练使用8种以上的编程语言,所以才稍微感觉有点资格,来说一说这两门编程语言。虽然,从我个人的角度在我心目中,编程语言只有两种,第一种是java/c,第二种是其它。
但是我不能通过这种偏激的方式来误导大家。
02
我们必须要明白java和python的各自定位。
java源自c和c++的技术体系,于1995年推出,定位于给专门的程序员设计大型的复杂分布式应用而设计。
而python是1991年推出(比java还早)主要面向于系统管理,科研,教育和非程序员群体等。
大家一定要理解清楚一个现实,这个世界上并不是只有程序员才需要写程序,还有很多群体需要写程序。
比如蜗牛学院在这方面的定位就很清楚:java开发全栈方向的学生学习java编程和javascript编程,软件测试方向的就业班学员学习python(因为他们并非专业的程序员群体),而软件测试方向下属的自动化测试开发高级研修班,是java/python两个方向同时存在。
那你说你觉得哪个更好呢?
03
python比java早4年出身,但是在国内为什么几乎到2010年之后,python才逐渐火起来呢?
原因很简单,因为我们都太现实了。
由于大数据的盛行,由于自动化测试方面的人才需求,以及对于互联网的一些基础应用系统的的开发,企业加大了对python人才的招聘力度(当然,与java比还有较大的差距),由于有一门感觉很简单又能赚大钱的编程语言出现了,简直是人类的福音啊,所以火起来了。
这一点与近几年虚火很旺的web前端开发很像,其实绝大部分人没什么技术能力,但是工资却拿得不错。
这不是个人的原因,企业也很浮躁,仅此而已,一旦虚火泄了,谁能撑到最后?
请各位自行脑补。
也不知道大家从哪里得来的一些“误导”,觉得python简单,java很难,所谓人生苦短,我用python之类的。
一方面,python上手的确相对要快一点而已,仅此而已。
解决复杂问题时,没有人会觉得难点在使用哪门编程语言上,而是解决这个具体问题的算法思路上。这一点各位务必要拎清这个思路。
另外一方面,由于python近几年的火爆,不排除一些人故意散播一些言论,来误导大家使用python。
这件事情就像这么多年,一直有人觉得学习软件测试要容易一些一样,很多人也是报着通过软件测试进入这个行业,选择了一个自己认为没有难度的领域进入。
但是,强哥发现,当3、5年过去了,很多测试人员目前最焦虑的就是,自己技术不够深,在企业当中越来越没有竞争力了。
所以最终,还是得硬着头皮研究深层次的测试技术,无论是编程,网络,数据库,协议,还是自动化测试,性能测试等。但是这个过程非常痛苦,就像我说的那样,这个世界上99%的人都会选择一条容易走的大路,因为懒惰,因为恐惧。而成功是属于那1%的人一样。
这句话同样适用于编程语言或者技术功底的训练上。
其实大家如果有过实际的编程经验,我们不妨认真想想,当我们研发一个系统的时候,究竟会用到哪些技术?
那些什么需求分析,跟测试撕逼,跟客户撕逼,跟老板撕逼的那些烂事我们就不提了。
我们就来看看纯技术层面的一些基本要求:数据库,linux命令,网络协议,接口设计,算法思路,框架,改bug,编程,前端交互。
你应该懂我,利用不同的编程语言编写程序只是研发过程中众多你需要掌握的技术当中的一块而已。其它,与你用哪们编程语言无关,这一点如果你都理解不了,觉得强哥在忽悠你的话,那请自便吧。
或者换一个角度,会一门编程语言,而不是完整技术体系,就能当技术大牛的情况,我觉得可能只有在你们家村里可以行得通,因为就你一个人懂。
当然,以上我们讨论是的纯粹的基于技术定位,你也许可以反驳我说,难道做测试的都得懂编程,难道做python的都不行?
这当然不是这样的,任何一个领域都有大神,随着经验的丰富都能够解决很多难题。
但是,那是很久以后的事了,我们现在讨论的是,你还在纠结java还是python的这件事,毫无疑问,这个时候,你仍然还是一个菜鸟,甚至连门都没入。
强哥建议大家,不要因为什么事情简单,所以我要去做,无论是学习编程语言,还是其它,这是最要命的一个出发点,会毁了你的未来。
下面我给大家列出一段我分别使用java和python写的发送一个http协议的一段代码。
这段代码收录在强哥今年年底即将出版的一本自动化测试开发的高级教程里面,全书均采用java进行代码演示,明年,我会有一本几乎一模一样的但是是使用python进行代码实现的书。
之所以能够这样,原因很简单,java能解决的基本问题,python也能解决,当然,python能解决的,java一样可以。
但是在干重活儿方面呢,java更成熟一些。
java的代码,实现agileone系统的需求提案新增功能:
// 实现需求提案的新增public void doadd() {// 先发送post请求实现登录 string posturl1 = http://localhost/agileone/index.php/common/login; string postdata1 = username=admin&password=admin&savelogin=true; string resp1 = hr.sendpost(posturl1, postdata1); system.out.println(resp1); // 对sendpost()方法进行了额外的封装,一次封装,处处使用 // 再发送post请求完成新增 string posturl2 = http://localhost/agileone/index.php/proposal/add; string postdata2 = type=enhancement&importance=medium& + headline=& + content=这是用于java代码测试的内容-10009&processresult=; string resp2 = hr.sendpost(posturl2, postdata2); system.out.println(resp2);}
我们再来看看python实现同样功能的代码:
# 导入urllib和http库import urllib import http.cookiejar# 利用cookiejar自动管理整个过程中的cookie cj = http.cookiejar.cookiejar() opener = urllib.request.build_opener(urllib.request.httpcookieprocessor(cj)) # 利用urllib构造post请求并处理登录 logindata = { username : 'admin', password: 'admin', savelogin : true } data_encoded = urllib.parse.urlencode(logindata).encode('utf-8') login = opener.open(http://localhost/agileone/index.php/common/login/, data_encoded) print(login.read()) # 发送post请求提交新增需求提案 proposaldata = {type:requirement, importance:medium, headline:headline from python - 10010, content:content from python - 10010, scope:1, processresult:} data_encoded = urllib.parse.urlencode(proposaldata).encode('utf-8') proposal = opener.open(http://localhost/agileone/index.php/proposal/add, data_encoded) print(proposal.read())相信大家很难区分所谓的简单与难。
因为代码几乎都很类似,这种情况发生在很多场景,解决很多问题时都是一样的。其实很多人之所以宣传python简单易学,我们抛开某些可能的商业目的或者社会心理的原因之外(商业目的还用说吗,比如最简单的例子,蜗牛学院专门做python培训的,当然我会不顾一切地说服你,python是最好的编程语言,没有之一,java都是垃圾,都是落伍了的,这种睁眼说瞎话的还少吗?因为你很懒,懒得去求证真相而已。社会心理就是我自己是搞python的,我怎么能说自己做的技术很low逼呢,我自己是搞java的,java必然是最牛的啊)。
让我们单纯从事实出发,python简单的原因只是因为,我们使用python时,我们可能跟个傻子一样,在直接调用别人给我们写好的代码接口而已,而java的很多处理相对要原生一点,我们写的代码要稍微多一点。
但是只要完成封装,代码就很难说谁更简单了。
而这个封装的过程,其实才是编程最重要的部分,如果这一部分我们都不愿意亲自参与,也不想知道个中实现原理,你想想,你怎么可能成长为一个优秀的程序员,还有天理吗?让那些勤奋的人,情何以堪。
这一点就像c语言,由于c语言更原生,更底层,几乎没有提供太多封装好的代码接口,很多问题的解决都需要我们自己写代码,所以这也是为什么很多人觉得c语言很难,道理是一样的。
但是,牛逼的人,都更喜欢自己创造。相比起c语言来说,java和c#之类的,为我们提供的代码接口要丰富得多,我们使用起来其实也要容易得多,结论就是,在c语言面前,其它高级语言都太简单了,因为封装了太多可以直接用的类库和接口。
所以,要成长为一个高级程序员,一定不是写写简单的应用而已,比如java的源代码是必须要去学习的,我们一定要知道这些封装好的代码接口的实现细节。
否则,跟使用python封装好的东西,又有何本质区别呢?
所以,请不要再纠结了。
强哥的经验,如果你把java作为你的人生的第一门用心学习的语言,那么你只需要花极短的时间,就可以基本学会c++,javascript,php, python,r,c#,objective-c,swift,go(是的,每一门语言都可以在极短的时间学会,只是具体的问题解决和一些坑需要多积累一些实战经验而已)。
但是反过来,如果你把python作为你的第一门语言,问题就回到外国人使用筷子这件事情上了,答案不言而喻。
所以,你未来如果要立志成为一个专业的程序员,建议先学习java(或者c#也行,两者有很多原理上很像,实在不行,c/c++也可以哦),那是给程序员的专属语言,是有门槛的,所以你才能够建立自己的竞争力。
如果你只是想玩玩,感受一下,或者是把编程语言作为一个工作中的工具而已,python是个不错的选择。
这是面向学习的建议,如果是在企业中真实做项目,那就不要纠结了,项目需要什么,咱们就学什么,不需要那么多理由,干,才是真理。
锤子好用还是榔头好用?java好还是python好?
为什么非得二选一?浮躁,一个吃饭的工具而已,搞技术的,通吃它们不就完了吗,你再也不会纠结了,这,才是一个技术人员该有的状态。
难道不是吗?