C#、C++、Java、Python 选择哪个好?

2019年03月06日 16:54:34 编程小火车 阅读数:214
 

首先排除Python,光动态语言一个理由,就已经万劫不复了。无论有多少所谓优势,在这一个缺点面前,都显得微不足道。

动态语言是为了七八十年代的古董计算机而设计的,那个年代的电脑操作系统还不到1MB,比如MS-Dos,Unix,Amiga等,所以绝大多数动态语言都是古董语言。Python在其中算是相对“年轻”的,但也是30年前的技术了。

除了Lua,Julia等极少数90后之外,绝大多数动态语言都是无法操纵线程的。因为那个年代的CPU是单核的,操作系统不仅是单线程的,有些系统甚至是单进程的。

虽然后来很多动态语言加入了协程,但其实还是只能操纵一个线程的,连“治标”的问题都没能完全解决,更别说“治本”了。很多初学者以为这是“快”与“慢”的问题,会随着硬件性能提升而逐渐改善,然而恰恰相反,硬件性能越提升,与动态语言越脱节。因为这些动态语言能有效发挥的CPU性能,始终停留在单线程的时代。

当时的主要储存介质是软盘,就是那种正方形的塑料小卡片,最大容量只有1.44MB,为了能够装在软盘里面,所有动态语言的语句都特别简短。用今天Python圈儿里的话说,当时几乎所有的编程语言,全都非常“优雅”。

后来硬盘容量变大,windows诞生,计算机完全进入图形化时代,程序变得越来越庞大,一个程序从原本的几KB,瞬间增大到几十几百MB,乃至GB。

从此,为了编写kb级项目而设计出来的动态语言,越来越难以胜任软件的编写任务,被视为落后技术,除了JS之外,几乎所有主要工作都被静态语言取代,一大半动态语言从此灭绝了,活下来的动态语言则只用来编写脚本,才有了“工程语言”和”脚本语言”一说。

动态语言只适合写非常小的东西,项目越小,写起来就越爽,越大就越抓狂,且非常难以维护。网上各种不到一百行代码的“小项目”来证明Python如何如何优雅,而你去工作之后会发现,这样的“小项目”今天只存在于三个地方。

1,培训机构的教学计划中

2,各种教程的案例中

3,粉丝们相互洗脑的言论中

实际生产中,你见到的“小项目”代码行数都是以万为单位的,如果对Python代码进行封装的话,维护难度几乎是在挑战人类耐性的极限,无时无刻不抓狂,当然,也确实有个别使用Python写成的“大项目”,但无一例外,都是靠大量注释硬磨出来的。注释的行数比代码的行数要多得多。这时候就已经不是“写代码加注释”,而是“写注释加代码”了,编写体验就像是在写一部”超长篇中文说明书,其中掺杂着少量代码”,但你不把“长篇说明书”看完,这些曾经由自己亲手写出的“少量代码”,就死活看不懂。

而且写完代码,确定不需要修改之后,还有一步工作要做,就是把那些浩如烟海的注释,删掉绝大部分。否则注释实在太多,会垫高运行成本,一个耗费大量精力编写的项目,刚写完时超过1GB,注释删光之后,还剩100多MB,内心里数不清的草泥马。

另外三个都是不错的选择,它们都是静态语言。若想开发一个中型以上的项目,而且希望可以有效维护的话。使用静态语言来开发,才能让你避免抓狂。

就像铁锹与挖掘机,如果给宠物挖个厕所,挖掘机显得既难学又难用,一学就是两年起步,考一堆资格证,还各种不熟练。铁锹简直太棒了,分分钟秒懂,抡起来就开挖。挖掘机还没热好车,用铁锹三五下就挖好了。铁锹显得各方面都很完美,挖掘机简直一无是处。但如果你想挖一座水坝,并指望长期靠这门手艺混饭吃,还是先去中国山东找蓝翔,把“既难学又难用的挖掘机”学好再说吧。

当然,“不适合”与“不能”是两回事。毕竟仅凭双手都能磊出万里长城,用铁锹又怎会挖不出水坝?只要有愚公移山的精神,动态语言当然也能写出大型程序,只要玩命加注释就可以了。可问题就在于,仅为了“简单易学”这么个优点,而在漫长的职业生涯中反复不停的“移山”,值吗?

既然说Python,当然要提一下人工智能,这确实是Python最大的存在价值。在熟练掌握一门静态语言的前提下,确实可以抽时间学一下。但如果你连一门静态语言都还没掌握,只学了学Python便指望可以去搞人工智能开发,那真是想太多了,因为现实情况是一环扣一环的。人工智能水坝很高端,但你得先把水坝挖出来才行,否则用卷积神经网络能存水嘛?人工智能就像一件太空服,确实是高级货,但要发展航天,需要优先考虑的问题,却是如何造出一枚运载火箭?如何造出飞船?如何培养宇航员?当一切条件完备之后,才适合考虑太空服的问题,否则就是本末倒置。若连宇航员都还没有,太空服给谁穿?没有飞船,又何来宇航员?没有运载火箭,飞船又怎么上天?

既然说完了“为何要用挖掘机,而排除铁锹”的问题,下面就该说说“挖掘机技术哪家强”了。

三门静态语言的语法是高度相似的,尤其是Java和C#,简直是太像了,学会其中一门,另一门你就会了八九成(只论语法部分)。完全可以在几天之内,从一门语言过渡到另外一门语言。所以若想同时学会三门语言,其实一点都不难,但我不建议这样做,因为这基本是在浪费时间。

因为“学会语言”和“胜任工作”之间,有着一道巨大的鸿沟。几乎没有多少回头路可以走。比如我一开始是用Java做web开发的,由于工作需要,我需要学会“用C#做游戏”。凭借Java的底子,我只用了两三天的时间,就学会了C#语言。之后我用了一个星期左右的时间,学会了用C#做web开发。可是,当我决定使用C#转向游戏开发的时候,我花费了两年的时间学习,才勉强做出一个很小的项目。

用Java做Web开发,转换到用C#做web开发,就像从右手写字,转换为左手写字。并没有新的知识要学,仅仅是改变了握笔的习惯。虽然很容易,但却是在浪费时间。因为若要写字,只用一只手就够了。

之后,我试着学习用C#做游戏,就像从写字,转换到画画。握笔的习惯没有变,但所学的知识却完全不同了。所以即便我用了两年,但时间并没有丝毫浪费,因为我每天都在学习“之前不懂的知识”。

所以选择语言的关键,并不在于语言本身,而在于你要先想清楚,自己准备从事哪个行业。换一门语言非常容易。而换一个行业,就不是那么容易了。

在这三门静态语言当中,Java的用户数量一定是最多的,岗位数量也是最多的,但竞争压力也是最大的。因为Java的就业岗位,几乎全都集中在互联网行业,主要就是用ssh做web开发,安卓项目也有一些,但非常少,基本可以忽略。好的方面是,在互联网行业是最大主流,只要不挑肥拣瘦,找工作不是问题,而且在很长一段时间内,这种情况都应该不会有太大变化。坏的方面是,严重依赖互联网行业,只要选了Java,就必须一门心思做网站,因为Java在其他行业的岗位数接近于零。互联网高速增长,Java的雪球也就越滚越大。但如果哪天互联网行业不行了,Java就要做好陪葬的准备了,转型到其他行业的可能性微乎其微。这也是我转而去学C#的原因,根本目的就是为了在“编程”和“做网站”之间实现解耦。让“编程”可以做到更多的事情,否则你如何证明自己是个程序员,而不是个“网站制作员”?Java的亲爹“日公司”还活着的时候,个人是个铁杆Java粉,毕业后就找了份ssh增删查改的工作,一干就是七八年,但后来Java被甲骨文这个拿数据库当幌子,冒充IT公司的律师事务所收购之后,就开始变得不思进取了。除了整天上法院,在法律战方面大显神威之外,就只能蹭互联网的热度保持增长。这么多年来,始终无法在互联网之外的领域,拓展出哪怕一丁点儿用途。Java是我使用时间最长的语言,我从高中时代就开始学习它了,还专门因为它,才决定报考计算机专业。我原以为自己会写一辈子Java。可离开它之后,我却开始反问自己”当初为何没有早点离开?”。

C#是我的新欢,我实在特别喜欢它,至少目前是这样的。最重要的原因是,它能做的工作比Java多很多,PC设备集成,游戏开发,ios和安卓开发,串口设备通信,gis,工业控制,ao与erp系统,以及web开发全能做,而且学习效率和开发效率都很高。如果希望用最小的学习成本,获得最大的技术回报,它一定就是最佳选择。由于曾经不跨平台,错失了互联网崛起的时机,所以工作岗位并不像Java那样,全都集中在互联网行业,而是分布在各行各业。缺点是岗位太分散,岗位其实非常多,只比Java略少一些,但分布到各行各业之后,就显得没什么存在感了,在每个行业都不是老大,尤其在互联网行业非常弱势,也许连Java的零头都不到。C#的名字也不好,总让人联想到C++,以为它是门很古老的语言,其实C#是个00后,论辈分和Go语言差不多,尚处于“小屁孩”阶段,岗位数量能有如此规模,其实已经很了不起了。优点是,万金油,哪个行业都能干,又不依赖其中任何一个行业。如果哪天互联网行业不行了,很容易转型到各种行业。另外在游戏开发方面是主流,Unity,寒霜3,CE5等众多游戏引擎,均使用C#开发游戏。近几年在互联网方面的改进也还不错,有了.NetCore,终于可以跨平台了。优点是性能非常棒,是常见的后端框架中速度最快的,具体可参照TechEmpower的性能测试。缺点是.NetCore出来的太晚了,尽管有技术优势,但市场已经被Java占的稳稳的了,所以短期内Java必然还是唯一的主流。不过对我来说无所谓,能做网站的语言多如狗。“啥都能干”才是我选C#的理由。我想我可能会写一辈子C#。。。。。吧?

C++的牛逼之处,就是跑的特别快,而且理论上能做的事情比C#更多。尴尬之处就是无论做什么,都不能只会写C++,还需要一堆专业知识配合使用,语言层面和应用层面,得分开学。比如市面上C++的工作,大部分要和各种设备打交道。除了会写代码之外,还要懂电子电路,电气电磁,仪器仪表之类的知识。我大学的同学们,学生时代大部分都倾向于C++,学霸们专注ogre,次优生擅长opencv,学渣们也多少会点MFC和QT,结果一找工作,无论学霸还是学渣,全都跪了。要么是变压器厂的设备开发岗位,要么是蓄电池厂的技术研发部门,甚至还有造直升机的军工企业,全都要求懂设备。难得有个金蝶软件公司,招聘财务软件开发的工作,不要求懂设备,但却要求数学能力,需要会微积分。十几号同学排着队去了,结果人家当下招了两个,几天之后又辞退了一个,最后只留了一个。剩下的同学几乎全都改行了,有的干了销售,有的开了饭馆。。。本人没走这个路子,再多的也就不敢乱说了。

我个人建议,

想长期在互联网行业混下去,且没有中途跳船的可能,选Java,前期重点放在MVC模式的理解和数据库增删查改,中期重点放在服务器负载均衡与CND分流加速,后期侧重数据库优化。

想创造更多的可能性,选C#,重点放在.NetCore(跨平台后端开发)和Unity3D(VR,AR,游戏开发),并根据自身行业,选择关注Azure(云计算),WPF(桌面软件开发),Blazor(Web前端框架),ML.Net(人工智能框架),Focas(工业机器人编程),MasterCAM(数控机床控制),Xamarin(安卓与IOS跨平台开发)等技术的发展情况与细节。

如果你是学霸,有电气,机电等专业的知识背景,并有活到老,学到老的决心,学C++。

至于Python,最好的出路是搞培训,也可以去做一些运维,测试之类的打杂工作。当程序员的话,在一线城市是没什么希望了,下乡试试吧。运气好的话,遇到个煤老板,用Django忽悠忽悠,混个技术主管也是可能的。至于Flask,就相当于Java的HttpClient或者http://Asp.Net的一般处理程序,除了搞培训,实在是百无一用。

喜欢笔者文章并且想学习c/c++编程的小伙伴可以关注笔者微信公众号:C语言编程学习基地,也可以加Q群,648778840一起来交流哦,群内有很多学习资料可免费领取的!对于编程的初学者来说会特别有用的!另外笔者也会在Q群里面进行视频教学,大家有兴趣的可以来哦!

转载自:https://blog.csdn.net/C_Q_741818652/article/details/88241824

C#、C++、Java、Python 选择哪个好?的更多相关文章

  1. Python和java的选择

    它是什么? Java是一种通用的面向对象的编程语言,主要用于开发从移动应用程序到Web到企业应用程序的各种应用程序. Python是一种高级的面向对象的编程语言,主要用于Web开发,人工智能,机器学习 ...

  2. 芒果TV招聘研发工程师(JAVA PYTHON),地点长沙

    长沙芒果TV招聘高级 JAVA Python 工程师,工作地点:湖南广电   有兴趣的邮件0xmalloc@gmail.com; zealotyin@qq.com 公司有一大批从北京上海一线互联网企业 ...

  3. 梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python)

    梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python) http://blog.csdn.net/liulingyuan6/article/details ...

  4. 编程开发(C/C++&Java&Python&JavaScript&Go&PHP&Ruby&Perl&R&Erlang)

    使用Docker快速部署主流编程语言的开发.编译环境及其常用框架,包括C.C++.Java.Python.JavaScript.Go.PHP.Ruby.Perl.R.Erlang等. 在今后采用编程语 ...

  5. (八)map,filter,flatMap算子-Java&Python版Spark

    map,filter,flatMap算子 视频教程: 1.优酷 2.YouTube 1.map map是将源JavaRDD的一个一个元素的传入call方法,并经过算法后一个一个的返回从而生成一个新的J ...

  6. paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较

    paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较 ##java ----------- 在JDK1.7中,摒弃了Java集合接口的实现类,如:Ar ...

  7. paip.复制文件 文件操作 api的设计uapi java python php 最佳实践

    paip.复制文件 文件操作 api的设计uapi java python php 最佳实践 =====uapi   copy() =====java的无,要自己写... ====php   copy ...

  8. paip.获取文件名从路径uapi java python php总结...

    paip.获取文件名从路径uapi java python php总结... =====uapi basename_noext($fname); =============java  自己写.. St ...

  9. paip.日期时间操作以及时间戳uapi php java python 总结

    paip.日期时间操作以及时间戳uapi php java python 总结 ///uapi Date 函数 | Day 函数 | Hour 函数 | Minute 函数 | Month 函数 | ...

随机推荐

  1. JSP的重定向有两种forward和sendRedirect

    jsp:forward重定向 当index.jsp存放在tomcat服务器应用目录下时:D:\Tomcat 7.0\webapps\Spring_shizhan4ban_Chapter05\index ...

  2. asp.net c# 断点续传 下载 Accept-Ranges

    转自:http://www.cnblogs.com/90nice/p/3489287.html 1.因为要下载大文件 需要断点续传,使用多线程 分段下载 效率比较高,节省资源. 发点牢骚:下载可以用多 ...

  3. 面试知识整理-Java基础

    三大特征:封装,继承,多态 多态:简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情. 抽象:抽象是将一类对象的共同特征总结出来构造类的过程 包装,可以讲基本类型当做对象来使用,抽象只关心对 ...

  4. miniui dataGrid detail grid

    <div >      <div id="vkhGrjx_grid" class="mini-datagrid" style="wi ...

  5. 【xampp】windows下XAMPP集成环境中,MySQL数据库的使用

    在已经安装了XAMPP之后,会在你安装的目录下面出现”XAMPP“文件夹,这个文件夹就是整个XAMPP集成环境的目录. 我们先进入这个目录,然后会看到带有XAMPP标志的xampp-control.e ...

  6. 视频(video)属性

    Figure 3视频相关的属性: 属性 值 描述  muted muted  定义音频的初始状态,目前仅支持muted.   crossorigin  空  定义当前视频是否是一个跨域的项目.  me ...

  7. UglifyJS 压缩选项

    UglifyJS 压缩选项 1.使用逗号运算符连接简单语句 2.使用点符号代替中括号属性     foo [“bar”]→foo.bar 3.删除逻辑上走不到的代码 4.删除调试代码    debug ...

  8. [转]GeoServer地图开发解决方案(一):环境搭建篇

    GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现的社区开源项目,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新.删除.插入操作,通过 GeoS ...

  9. 三十、详述使用 IntelliJ IDEA 解决 jar 包冲突的问题

    在实际的 Maven 项目开发中,由于项目引入的依赖过多,遇到 jar 冲突算是一个很常见的问题了.在本文中,我们就一起来看看,如何使用 IntelliJ IDEA 解决 jar 包冲突的问题!简单粗 ...

  10. HDU 1027 Ignatius and the Princess II(求第m个全排列)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1027 Ignatius and the Princess II Time Limit: 2000/10 ...