`
yzd
  • 浏览: 1858545 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

从C++到Java,10年技术生涯的几点思考

 
阅读更多

本文转自 http://blog.csdn.net/chui88/article/details/6330408

不知不觉,做程序工作已经10年了,从最初学习C++到Java,从困惑到清晰,感觉真的有不少东西可写,不过总觉得不成体系,大概看了太多八股文章的缘故,被憋得实在难受。所以不管了,想到什么写什么吧。

1、从C++到Java

C++和Java谁快?从算法上讲我认为毫无疑问是汇编〉C++〉Java,不要迷信某些个别评测,单纯的回圈测试什么的,比如JNode的官方网站上有Java写的JVM的性能和SUN的JVM

进行性能比较的结果,JNode中用Java写的JVM竟然能比SUN公司用C++写的JVM还快!编译器完全可以作针对性优化影响测试结果,毫无意义的东西。而且,评测结果不会具备多少实际意义,真正的应用系统的效率是80%取决于整体的设计架构,而非你使用哪种语言。所以讨论汇编、C++、Java谁更快这个问题的人恐怕更多是为了自己的面子考虑,虽然Java当前如日中天,但其总是针对C++的批判性态度却再明显不过,所以Bruce才会有“C++不垃圾,只是Java很傲慢”之说。

C++和Java根本的区别是什么?我认为毫无疑问是内存分配。编程思想和设计模式是活的东西,和语言没有直接关系。Java没有指针,C++写程序也可以只用引用。JVM是Java在内存管理上真正有别于C++的地方。JVM的好处是显而易见的,跨平台、更智能的内存管理,但能解决所有问题吗,答案是否定的。

Java没有内存泄露吗?当然不是,我认为java的内存泄露往往比C++更加难以排查,因为JVM的缘故,程序员没法直接对内存进行操控,隐患往往藏的更深。我曾经花了大量时间研究JVM的内存机制,虽然也有了不少心得,但直到现在仍然处于迷惑期。循环引用,缓存机制不合理,Spring等常态Bean的属性重复加载都是可能吃内存的元凶。

对于一个单一的,低用户低并发的系统,使用Java是很舒服的,程序员不用去考虑太多事情,照着业务逻辑做设计编代码就行,不用管内存分配,不用管并发和互斥(其实还是要管的),就算万一有内存泄露的隐患,大不了每天重启JVM一下就能解决了。但对于一个可能在多个应用环境中部署的软件产品而言,内存泄露这种问题却绝不能放过。我曾经遇到过在一个环境中运行非常良好,但在另一个环境中却天天出问题的情况,即使每天重启JVM也无济于事。当时怀疑过很多方面,网络、数据库、容器等等。那时还不是很有概念,现在想起来还是后来好好看程序,优化了不少代码,解决了几个内存泄露,这样才最终解决了不稳定的问题。举例来讲,在应用环境A中,服务器性能较好,JVM有2G内存,某个应用存在内存泄露的隐患,每次大约造成2M的内存消耗,这样1000次左右就没有内存可用了,就会造成JVM性能大幅降低。但在应用环境B中,服务器就没那么好的性能了,JVM仅有256M,那么100多次操作就足以导致问题出现。而且,每个应用环境的应用使用率是不一样的,在A中如果每天仅出现10次隐患应用操作,2-3个月都不会暴露问题,而且即使使用内存分析工具,开始阶段也很难查出有无问题,但在B中,如果每天有100次隐患应用操作,只需一天问题就出现了。但实际应用过程中,应用的使用率往往很难精确统计的到,也无法预判,这也是造成问题排查困难的关键因素之一。应用环境的不确定性不单体现在地域上,也体现在时间上,不同时间的相同应用环境也不尽相同。挑选一个应用环境,常态性监测JVM的内存情况是避免这类问题发生的好办法。

结论就是,对于中高端的产品化,多用户,高并发应用,Java和C++一样,不考虑内存是不可能的,毕竟语言最终操纵的还是计算机。

那Java的优势在哪里?我认为其在中低端应用上的门槛更低。对大多数小型信息管理类系统而言,并不需要很严谨并且考虑周到的设计和编码,学习java可以让一个新手很快上路,而C++却没有这种优势,动不动就越界是新手常犯的错误。在一个通常的软件团队里面,水平一定会有高低,而且也不是每个人都能通过学习进入深层次,这是C++难以解决的问题,Java在由于规范性方面的优势更加适合新手使用。

C++就像手动档汽车,Java更像自动档,尽管越来越多人愿意开自动档,可是要想真正跑得快,赛车还得手动挡的。

问题出现总会让人头疼,追根溯源常常也会非常艰苦和漫长,但只要还有办法,就不能放弃,规避问题可以解决阵痛,但永远无法治根。

2、关于云计算想到的

毫无疑问云计算的概念被扩大化了,云服务、云存贮,SAAS、IAAS、PAAS,理论和概念早已满天飞。但当我仔细读来,却发现大多还是新瓶装旧酒。虽然说还是有不少实质性内容,但与真正的分布式计算概念还是想去甚远。在网络越来越发达的时代背景下,存贮、软件、外设甚至内存都网络化了,唯一缺少的就是CPU,依靠网络使大量CPU协同工作真的是个很诱人的想法,但也是困难而遥远的事情。也有人认为Cloud Computing是个过度炒作的东西,我觉得有一定道理,如果要我选择,我也会希望把自己的东西放到自己的电脑上,我会更希望在任何地方使用便携设备随时操纵我的电脑,却绝对不是放到一个看不见摸不到的“云端”上头,天天被“云端”盘剥和控制。因此,如果云端仅仅是服务或存贮的集中式管理,它是不值得如此进行炒作的。

其实我觉得我不是一个重组概念进行炒作的反对者,炒作对于技术和社会进步是有一定作用的,但水可载舟、亦可覆舟,将一些本无关系的东西牵强附会的联系在一起进行炒作,只会搅乱理论和学术体系,而理论体系的混乱一定会导致交流上的障碍-----虽然交流变得更多(必然变得更多)更方便了,可是交流的障碍却大幅度增加了,同样的一个名词可以被一百个人给出一百个解释,本来一句话可以说清楚的事情,现在变成了几十句才能说明白。

药厂可以把10几块钱的药重新包装卖200-300块,利润当然是惊人的,可是赚到了钱的老板们却天天打算着转移资产到国外,认为国内没有可持续的发展。这样的人到底是高素质还是低素质呢?

我上大学的时候曾经在医院实习,见过一个食物中毒的病人家属连夜赶了几十里山路,把一堆借来的硬币交给医院做透析;后来工作了,搞图书馆的项目也知道很多地方的人连100块钱的借书证押金都捉襟见肘。那些天天生活在优越环境下的概念重组专家们会为这些人群考虑多少呢?“云端”的概念炒作显现了他们的垄断思想,现在中国的贫富差距基本还是在财产方面,信息方面基本还是对等的,这也是一个农村的孩子经过十几年苦干可以成为大企业家的前提所在。可是“云端”一来,你的一举一动都在我掌控和监视之下,没错,你是方便了,也少花钱了,可是却失去了信息方面的平等地位,于是,屁民将永远是屁民,永远没有咸鱼翻身的机会。

3、关于信息爆炸

10年来我也做了很多技术方面的工作了,最初几年看到一项新技术、新概念,肾上腺激素浓度就会大幅度增加,要是不用一下晚上恐怕觉都睡不着。可是后来慢慢地就变得理性多了,技术的选择一定要根据需求来,绝不能为用技术而用技术。很多的新技术、新概念,看几眼就差不多知道来源,也知道优点和缺点了。以前总以为环境得适应程序,后来明白了程序得适应环境。

大型的应用系统,越简单越好,如果做不到简单,宁可拆分为多个系统单独设计。否则,当我面对一大堆连自己都难以看懂的概念和代码,真会有抓狂的感觉。

CSDN是不错的技术社区了,但是依然缺乏体系组织和管理。论坛、知识库,Q&A,这些东西的模式差不多,虽然方便了信息交流,但缺乏信息的组织和管理。比如我希望做一个信息系统,那应该选择什么样的技术?这个问题目前只能靠自己去摸索,慢慢体会,找到真正适合自己的技术方案。Wiki可能是更好的平台,但普及度不够。

其实每一个Questioner或者Answerer都在极力寻求相互之间的共同语言,共同语言和语义的理论体系形成之后,交流才能顺畅。翻翻CSDN的帖子,不乏问东答西的案例。一个交流平台如果能形成一套语言和思维方式,那就是非常成功的了。而这也使得技术选型的模型成为可能,当你想采用一套新技术时,Google一下,各说各话,对的有,错的也有,搜索引擎为何判断不出已定论的东西谁对谁错呢,就是源于语义的复杂性。信息的膨胀速度远没有我们想象中那样快,其中相当一部分是语言语义产生的泡沫,挤掉这些泡沫呢?信息真的有统计数据显示的那么“海量”吗?

统计数据经常是面子工程强有力的支撑者,可扔掉这些浮华,细细究一下统计数据是怎么做出来的?常常就会让人哭笑不得,而且大多是7分真,3分假,或偷换概念,总之目的就是把一棵小草说成一座森林。信息是有欺骗性的,商业运作会大量运用这种特性,换来的除了肾上腺素之外还有人和人之间不信任的感觉。

信息爆炸的时代,交流的作用变成空前重要,但在交流越来越方便的同时,效率也越来越低了。也许几十年后,人类会不堪信息的重负,那时信息规范化和有序化才会真正站上历史的舞台。

分享到:
评论

相关推荐

    给C++初学者的忠告

    - **解释**:C++标准每隔几年就会更新一次,了解最新的变化对于保持技术领先非常重要。 - **建议**:定期查看C++标准文档,关注一些权威的技术博客或论坛,以便及时获取相关信息。 #### 20. 学会利用现有资源 - **...

    java课程设计.zip

    在Java课程设计中,通常会涵盖以下几个关键知识点: 1. **基本语法**:包括数据类型、变量、运算符、控制流程(如if-else、switch、for、while循环)、函数(方法)的定义和调用。 2. **面向对象**:理解类、对象...

    java课件.rar

    Java是一种广泛使用的面向对象的编程语言...通过合工大的Java课件,学生不仅可以掌握Java编程的基础,还能了解到实际开发中的最佳实践,为未来的职业生涯打下坚实的基础。PPT的形式使得学习更为直观,便于理解和记忆。

    全国计算机等级考试二级JAVA 笔试试题及答案07年4月的

    10. **Java Applet**:虽然现在较少使用,但可能会涉及到Java小程序的基本概念和生命周期。 复习这些知识点时,考生应注重理论与实践相结合,不仅要理解概念,还要能够编写代码解决问题。通过解答2007年4月的这份...

    算法与数据结构forJava

    作者以轻松愉快的方式介绍了这些复杂的概念和技术,使得读者能够快速掌握并应用到实际编程问题中。 - **目标读者**:适合已经具备一定编程基础(如了解Java或C++语言)的学习者。 - **特点**: - 使用直观的图形和...

    JavaBasic:Java基础

    总的来说,Java基础是程序员职业生涯的重要起点,深入理解和熟练掌握这些知识点对于构建复杂应用程序至关重要。无论是Web开发、桌面应用还是移动应用,Java都是一个强大的工具,它的学习和实践永无止境。

    《程序员》杂志2009年第二期

    1. **编程语言趋势**:2009年的编程语言格局正在发生变化,可能会讨论Java、C++、Python、Ruby等语言的新特性、优缺点以及它们在不同应用场景中的应用。 2. **软件开发方法**:敏捷开发理念在当时逐渐流行,可能有...

    Oracle.v10g-实用培训教程6

    5. **开发人员支持**:对于应用程序开发者而言,Oracle 10g提供了丰富的开发工具和API接口,支持多种编程语言,如Java、C++、Perl等,使得开发基于Oracle的应用程序变得更加容易和高效。 ### Oracle v10g的学习路径...

    该项目是大厂候选人队参加2022年字节跳动青训营实现的课程大项目。.zip

    在字节跳动的青训营中,学员们可能会接触到以下几个关键的知识点: 1. **敏捷开发**:字节跳动作为一个重视创新和技术迭代的公司,可能会教授敏捷开发方法,如Scrum或Kanban,以快速响应变化并提高开发效率。 2. *...

    我的本科毕业设计.zip

    【标签】"本科毕业设计" 这个标签可能涉及到多个IT知识点,比如软件工程、数据结构、算法、数据库管理、网络技术、操作系统、人工智能等。这些领域是计算机科学的基础,也是现代信息技术的核心组成部分。 在【压缩...

    2011年文都考研计算机基础班讲义-.zip

    6. **程序设计基础**:可能会涵盖至少一种高级编程语言(如C++或Java),包括语法特性、数据结构、算法设计与分析、错误处理和调试技巧。 7. **计算机组成原理**:深入讲解CPU结构、指令系统、存储系统、I/O接口等...

    程序员考试试题(1998-2005word文档)

    10. **新技术趋势**:在2005年前后的时期,可能会涉及到XML、Web服务、.NET框架等新兴技术,这些都可能出现在试题中。 通过这些Word文档,考生可以有针对性地复习,通过历年真题了解考试难度和出题风格,同时也可以...

    实验03-2018级信安3-4班1

    实验涵盖了以下几个核心知识点: 1. **分组密码基本概念**:分组密码是一种对固定长度数据块进行加密和解密的算法。它的工作原理是将明文数据分成固定大小的块,然后对每个块应用相同的加密过程。这与流密码不同,...

    2015软件设计师考试真题

    在2015年的考试中,可能涵盖了以下几个核心知识点: 1. **软件工程基础**:这部分可能包括软件生命周期、需求分析、系统设计、编码、测试和维护等阶段。考生需要理解这些过程,并能应用到具体项目中。 2. **编程...

    c#学习笔记.txt

    /* 你能看得出来,这不是一篇正规的技术文章,所以若你不小心从里边读到了一个爱情故事,可不要奇怪。有很多人用程序来表述爱情,在其中我能看到有Money,有Girl,有一些还涉及到Sex,但是我没有找到Love,我始终相信...

    微型计算机原理及应用

    在自考的背景下,这些文件名显示了不同年份和地区的微型计算机原理及应用的考试试题和答案,例如全国2006年10月、2005年4月福建、2004年4月的自考试题等。这些资料对于准备此类考试的学生来说是非常宝贵的资源,可以...

    武汉IT公司笔试题集锦

    2. **编程语言**:常见的编程语言如Java、C++、Python、JavaScript等,会考察语法、面向对象编程、异常处理、常用库函数等。 3. **数据库管理**:SQL语言的使用,包括查询、增删改查操作、索引、事务处理等,以及...

    毕业设计20240320080216

    基于这些信息,我们可以推测这个毕业设计可能是一个软件开发项目,可能涉及到以下几个关键知识点: 1. **软件工程**:项目规划、需求分析、设计、编码、测试和维护的整个过程。 2. **编程语言**:根据main.zip,...

Global site tag (gtag.js) - Google Analytics