`
vipshichg
  • 浏览: 261575 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

做Java开发这一年

    博客分类:
  • java
阅读更多
从去年到现在,从.NET转向Java开发(只是因为项目原因,绝对与平台好坏没有关系)差不多有一年的时间了。通过这一年时间也有些感触,想从几个面比较一下这两个平台。希望能做到客观公正。
  语言
  我原来是使用C#语言的,和现在的Java语言相比,现在的Java语言语法就停留在C# 2.0这个年代。语法结构都非常传统,中规中矩。很突出的一点是,因为缺少对闭包的支持,有些用C#很容易做到的,用Java需要写很多废话代码。
  前几天InfoQ上发表了一篇英国卫报逐步采用Scala替换Java的文章里一句话用的很好:看Java的代码很容易让你只见树木,不见森林。因为为了实现某个功能,你需要太多的支撑代码,而实现功能的关键代码却迷失了。
  举个例子:我需要一个排好序的用户列表,排序的依据是用户名字。很简单的需求对不。自然的代码肯定是这样的:
  IList<User> users = …
  users.OrderBy(user => user.Name);
  而如果用Java实现同样的功能你可能要这样写:
  List<User> users = …
  Collections.sort(users,new Comparator<User>() {
  public int compare(User left, User right) {
  return left.getName().compareTo(right.getName());
  }
  });
  第一:没有扩展方法的支持,只有借助静态的辅助类
  第二:没有闭包的支持,非要写个难看的匿名类
  其实我们只需要一个OrderBy,一看就明白,但现在多了这么多“无用”的代码,反而核心的价值(order by)却显得不那么重要了。这还是一个很简单的例子,在实际的项目中你会为此付出更多的代价,你要写出一堆味同嚼蜡的代码才能实现你想要的那个功能,而那个功能其实是很显而易见。
  所以在语言层面,Java没有任何亮点,只觉得罗里罗嗦。
  关于语言层面的比较,老赵写过很多,而且非常精彩,建议去欣赏一下。
  不过Java也有那么很少几个有点意思的小东西:比如静态导入(脑袋提醒,这东西很早就在VB里出现了)、以及Java对Annotation的特殊支持让我们可以做一个更有意思的事情。
  概念满天飞
  做Java以来,让我感触最深的是在Java世界里概念满天飞。ORM,IOC,AOP,这几个在.NET的世界里也有,但没见过这么浓的,但是如果你做Java应用,你不熟悉这几个你都不好意思出去跟人打招呼,所以除了学习Java本身外还有一大堆开源框架等着你研究。
  还有什么View Model,Presentation Model,Validator,BRO(Business Rule Object),BPO(Business Process Object),BDD。关键是不仅是概念上存在这样的名词,它还大量的出现在代码里。代码里将概念描述得淋漓尽致,还规规矩矩。或许我土老帽了,我开发.NET三年有余,从来没整这些玩意儿。但是我一点也不怀疑我的代码难以阅读,难以维护。
  配置文件,你能再多一点么
  我超级厌恶Spring的配置文件(虽然你说这只是个框架,但貌似Java社区有这个趋向)。虽然Spring现在也增加了注解(Annotation)的支持,但是还有那么一些知道的和不知道的原因,项目中存在大量的配置文件。而且为了“模块性”,一个小小的配置文件又包含有几个配置文件。有配置controller的,有配置DAO的,有配置service的。额,还有那该死的Hibernate的hbm文件。我想,系统的复杂性就是这么一点一点的堆积而来的。
  ASP.NET的配置文件一度也有变得更臃肿的趋势,但最后还是大大瘦身(.NET 4.0里默认的web.config很小了)。而且Attribute在.NET的第一个版本就出现了,很多可配置的东西都提供了Attribute的API和XML的API,所以没有历史遗留包袱。
  开源,这个我喜欢
  Java里的开源软件远远超过.NET的(这可能跟微软有一定的关系吧)。如果你想完成一项工作,总会有一个开源软件适合你。比如我们要做一个定时调度的任务,马上就有Quartz跑到了你的视野,你只需实现几个接口,然后在配置文件里配置一下(又是该死的配置文件),又比如你苦于在Java里没法像C#里那样用Lambda,马上有个跟你一样想法的人开发了一个lambda4j(Java人有个说法是:语言不足类库来补,不过Java这个语言太不足了,所以有的时候类库补也补不好)。你可以在琳琅满目的开源框架和开源类库里寻找一个最合适的,然后打开这个潘多拉魔盒。最主要的是她还是开放的,你不仅可以学习其代码思想,如果你发现有问题你甚至可以提交代码,那种成就感我倒是在开发.NET时没有感觉到。比如你要开发高性能服务器,在.NET里还没见过这类的开源项目,可Java里你可以学习Netty,可以学习Mina,你甚至可以根据自己具体的业务场景,对这些开源软件进行适当的修改。当然,你可以说思想是一样的,这倒是不错。但因为IO模型在Java里和.NET里并不一样,所以还是有很多不同的(当然我觉得.NET的异步IO更容易使用,Java的NIO那是什么狗屎一样的API啊)。
 IDE
  搞开发的肯定离不开IDE。.NET里的IDE当之无愧的是Visual Studio了。不过我却觉得Visual Studio这几年已经离开发人员越来越远了,好像他要搞什么全生命周期的软件开发工具。所以不但臃肿,而且对开发人员并不是很友好(当然,她的可视化设计器是无与伦比的,但我不觉得可视化设计器是什么开发人员的“利器”)。举两个例子:VS里大量使用组合快捷键。这样不仅使得快捷键过长,难以记忆,而且还好难使用啊,你必须按两次,而且时间不能间隔太长。还有VS的重构功能,太弱了。
  在Java里有各种各样的IDE,有免费的,有收费的。我很喜欢的一个就是Intellij Idea。Idea给我的印象就是,她真的是在关注开发人员(写代码的)这个角色。所有的快捷键都很简单,好用好记。比如,大部分东西在Idea里可以使用Alt+Enter这个万能快捷键解决(这个快捷键是上下文感知的,在不同上下文中它知道要干什么)。
  再就是Idea对重构的支持,如果你熟练之后,做一项大的重构你都无需手动的去修改什么代码,直接依靠IDE的支持就可以完成,这在安全的重构里是很重要的一点,手动的去修改代码重构如果在测试不完备的情况下风险是非常高的。
  当然VS也有很多非常好用的插件,可以提高开发效率。比如大名鼎鼎的Resharper就来自于Intellij Idea同一个公司,由这个插件你可以看到Idea是如何关注写代码的人的效率。
  JVM vs CLR
  一般的,Java跑在JVM上,C#跑在CLR上。从技术实现上他们两平分秋色,各有各的优点,我们不能评价他们的好坏。只能说可能JVM在XXX上胜过CLR,CLR在XXX上胜过JVM。而且JVM和CLR有居多相似之处,大多数东西都可以在对方找到相应的东西。
  那么她们就无法比较了么?不是,经过一年的学习我表示我更喜欢JVM一点。
  JVM(在这里只假设是Oracle/Sun Hotspot JVM)暴露了众多的配置参数给开发人员。你可以通过这些参数间接地控制JVM的运行。就比如GC吧,JVM里有各种参数来控制各个代的大小,还可以通过参数让JVM采用什么样的垃圾收集策略。因为不同类型的应用:比如桌面的、服务器端得、内存小的等等不同类型的应用适合不同的垃圾收集策略。而CLR在垃圾收集上只给开发人员提供了Workstation(是否是concurrent GC,.net 4.0是background GC)/Server等很少的控制(不过也几乎很少用到)。当然,如果你想最大化控制CLR你就只有自己Host CLR,然后调用Host API进行控制,但是那样难度高很多。
  我很愿意承认CLR是自适应的,她能自动的智能的识别出你的需求,然后自动的进行调整。不过我在这里主要想到的是,微软在这里扮演着保姆的角色。在你很小的时候,保姆能够在一定程度上保护你,免你受到伤害。但是你不能永远生活在保姆的怀抱里,如果你想变得更强大你需要自己独自一人出去看看。
  注:这一节不是比较JVM和CLR,因为我没有那个能力。只是想从JVM和CLR所表现出来的差异来看看一些“看不见的东西”。
  开发人员
  上面主要谈了技术层面的东西。现在说说软件开发中的人。
  我现在所在的公司面试有个特点:会让面试者做一份家庭作业,然后让公司同事Code Review。在这一年里我看了很多Java的代码,也看了很多C#代码。但是我伤心的发现:
  1、虽然Java的也有烂代码,但是Java代码大多更注意代码的美感。大家都非常注意选择方法名,变量名,类名等。也非常愿意写一些小的,容易理解的方法,小的目的明确的类。可我亲爱的.NET同行们,大多在这方面很随意。一个方法200行不算长,甚至一个功能就放到一个方法里实现了。我看呀看呀,都看不到尽头。更别说类职责单一了。
  2、测试 Java同学的代码大多有测试,虽然有的测试不怎么好,但最起码有那么几个测测核心功能。但是.NET代码呢?很难见到几个有测试的(难道这是因为VS很晚才加入对Unit Test的支持有关?)。我不是说一定要有测试,我只是描述一下这么个现象。
  3、你也太随意了。我见到有那么几份.NET代码,我知道你创建了一个WinForm的项目,然后你却不把VS自动生成的那几个Form1.cs,Form1.resx给删掉。
  4、构建 从构建这个层面就更显出问题了,Java同学提交的代码大多有构建的脚本,无论是Ant还是Maven,所以你只需要敲一个命令行,马上可以看见人家的结果。而.NET同学的基本上都是sln文件。这一点不是说谁好谁坏的,因为我之前做.NET也从来没有自动构建脚本,我只想说两个社区有些不同。
  后记
  我在这里并不是贬低某个社区的开发人员,也不想扯进任何平台的纷争。因为这只是我看到的现象,还有很多是我没看到的,而且这也严重的受到我周围同事的影响,所以难免以偏概全。
  如果有不足地方请不吝指教。
14
4
分享到:
评论
18 楼 dieslrae 2014-10-13  
让你写java真是难为你了
17 楼 fair_jm 2014-10-13  
恋空御月 写道
jasduke 写道
也不标个出处:
http://www.cnblogs.com/yuyijq/archive/2011/06/28/2091803.html

那2011年的文章来做热点,这个编辑需要提高业务水平啦。


这种拿来的文章最好标注个出处,搞得像原创一样

... ...不是吧 居然不是原创.. .. ..我记得推到博客频道要打上这是原创文章的勾才行的吧...天..
16 楼 恋空御月 2014-10-13  
jasduke 写道
也不标个出处:
http://www.cnblogs.com/yuyijq/archive/2011/06/28/2091803.html

那2011年的文章来做热点,这个编辑需要提高业务水平啦。


这种拿来的文章最好标注个出处,搞得像原创一样
15 楼 fair_jm 2014-10-13  
sniperzxl 写道
sniperzxl 写道
sniperzxl 写道
LZ如果哪天转行做C,你不是要自杀?

c#或者说.net,就像是一个已经装修好的房子,你直接住就好了,其他事情交给物业来处理吧

java就像毛坯房,形状是有了,但是你究竟如何来装修它还是要靠自己动手

C?好吧,它就是一块一块的砖,从地基开始盖吧

语言还是看环境需要,如果你的服务器是unix、linux呢


中国的程序员有几个能用ue、editplus、vi来写代码的?依靠IDE来的都是使用者而编写者,在享受便利的同时,放弃了好多东西。


做了3年java的程序员,大多数不会用cmd来运行一个稍微复杂点的项目,没有了eclipse,好多人就茫然了,有木有


不会吧..大多数用maven的
clean compile package install什么的 配置下用插件 稍微学学就会了 要说离不开eclipse是看调用栈 源码 重构 调试什么的方便点...
14 楼 sniperzxl 2014-10-13  
sniperzxl 写道
sniperzxl 写道
LZ如果哪天转行做C,你不是要自杀?

c#或者说.net,就像是一个已经装修好的房子,你直接住就好了,其他事情交给物业来处理吧

java就像毛坯房,形状是有了,但是你究竟如何来装修它还是要靠自己动手

C?好吧,它就是一块一块的砖,从地基开始盖吧

语言还是看环境需要,如果你的服务器是unix、linux呢


中国的程序员有几个能用ue、editplus、vi来写代码的?依靠IDE来的都是使用者而编写者,在享受便利的同时,放弃了好多东西。


做了3年java的程序员,大多数不会用cmd来运行一个稍微复杂点的项目,没有了eclipse,好多人就茫然了,有木有
13 楼 sniperzxl 2014-10-13  
sniperzxl 写道
LZ如果哪天转行做C,你不是要自杀?

c#或者说.net,就像是一个已经装修好的房子,你直接住就好了,其他事情交给物业来处理吧

java就像毛坯房,形状是有了,但是你究竟如何来装修它还是要靠自己动手

C?好吧,它就是一块一块的砖,从地基开始盖吧

语言还是看环境需要,如果你的服务器是unix、linux呢


中国的程序员有几个能用ue、editplus、vi来写代码的?依靠IDE来的都是使用者而编写者,在享受便利的同时,放弃了好多东西。
12 楼 sniperzxl 2014-10-13  
LZ如果哪天转行做C,你不是要自杀?

c#或者说.net,就像是一个已经装修好的房子,你直接住就好了,其他事情交给物业来处理吧

java就像毛坯房,形状是有了,但是你究竟如何来装修它还是要靠自己动手

C?好吧,它就是一块一块的砖,从地基开始盖吧

语言还是看环境需要,如果你的服务器是unix、linux呢
11 楼 jasduke 2014-10-13  
也不标个出处:
http://www.cnblogs.com/yuyijq/archive/2011/06/28/2091803.html

那2011年的文章来做热点,这个编辑需要提高业务水平啦。
10 楼 haohao-xuexi02 2014-10-12  
yjbssqzw 写道
看完就好像,有人强迫你娶了一个你不喜欢的妻子!

同意你的说法……
9 楼 pentiumchen 2014-10-12  
lambda等特性在java8中已经陆续支持了。CLR目前还没有非Windows版本吧,这是阻碍C#进一步发展的关键呀。
8 楼 fair_jm 2014-10-12  
概念的那些东西 其实都用 可能以前不注意吧
就像现在C# DDD推广比java好(在实现领域设计 这本书里作者提到的)
而DDD里面的概念是非常非常多的


可以尝试下Java8 或者scala scala很棒但很多地方也很难懂..(例如前几天洪江大大指出来的一个 List(1,2,3).toSet 和 List(1,2,3).toSet()的差别..)


关于配置文件
这个是和框架相关的 spring4之后也在慢慢减少配置文件 可以看官方上的那些demo 我记得是不再用application.xml了 看看JFinal这个国人写的web开发全栈框架


我稍微看过点C#语法 支持引用传递(java只有值传递) 支持call-by-name 等等实在是甩java几条街


很多问题不是语言平台的问题 而是开发人员的问题..
7 楼 white_crucifix 2014-10-11  
我觉得说的挺好的。
6 楼 luozg_16953767 2014-10-11  
你不是一个好程序员,仅此而已。
5 楼 ICE___ 2014-10-11  
dalor 写道
分析的都很有道理.一年就有这种体验,佩服.

不要乱佩服,他的“这一年”背后要“好几年”
4 楼 wangyjx 2014-10-11  
比较客观 
3 楼 yjbssqzw 2014-10-11  
看完就好像,有人强迫你娶了一个你不喜欢的妻子!
2 楼 dalor 2014-10-11  
分析的都很有道理.一年就有这种体验,佩服.
1 楼 liyan0217 2014-10-11  
我觉得这只是突然换个工具换个活感觉有点磨手的现象

相关推荐

    我一年Java之路的回顾,反思以及展望

    我一年Java之路的回顾,反思以及展望我一年Java之路的回顾,反思以及展望我一年Java之路的回顾,反思以及展望

    java获取日期 本周本年 本月 上一年

    java获取日期 本周本年 本月 上一年java获取日期 本周本年 本月 上一年java获取日期 本周本年 本月 上一年java获取日期 本周本年 本月 上一年java获取日期 本周本年 本月 上一年java获取日期 本周本年 本月 上一年...

    Java开发手册:修炼一年终出关(华山版).pdf

    Java开发手册:修炼一年终出关,适合java在用程序员,日常参考和练习

    Java.web整合开发王者归来整本书内容及光盘源码

    资深Java程序员耗时一年时间写作,十年开发经验毫无保留。全面、系统、深入介绍Java Web开发的核心技术与主流框架。 内容全面:涵盖了Java Web开发所涉及的所有核心技术与主流框架 jsp、servlet、struts、spring、...

    Java开发手册-华山版-1.5.0.pdf

    2019.06.19 《阿里巴巴Java开发手册》时隔一年,发布更新1.5.0华山版。同时,将更名为《Java开发手册》,涵盖史无前例的三大升级 1)鉴于本手册是社区开发者集体智慧的结晶,本版本移除阿里巴巴 Java 开发手册的...

    阿里巴巴最新2019Java开发手册1.5.0 完整版PDF.zip

    阿里巴巴最新2019Java开发手册1.5.0

    java后端1年经验和技术总结

    经过一年意识到以前也有很多认识误区,比如:  偏爱收集,经常收集各种资料视频塞满一个个硬盘,然后心满意足的看着容量不行动。  不重基础,总觉得很多基础东西不需要再看了,其实不懂的地方很多,计算机程序方面...

    一年经验软件开发简历模版x 5

    一年工作经验的简历模版,一共有5份.希望对大家有帮助,

    Java开发经常遇到的经典265道题.docx

    整理了常见的面试题,包含一年Java开发经验,能涵盖的所有知识点,十足的干货。

    Java开发经验1-11

    一些在工作中经常用到的开发例子 比较实用 很有帮助

    阿里java开发手册-泰山版

    最近,阿里的《Java开发手册》又更新了,这个版本历经一年的修炼,取名:《Java开发手册(泰山版)》正式出道。 正所谓无规矩不成方圆,在程序员的世界里,也存在很多规范,阿里出版的Java开发手册就是其中之一,从...

    java web 整合开发 王者归来 随书代码

    资深Java程序员耗时一年时间写作,十年开发经验毫无保留。全面、系统、深入介绍Java Web开发的核心技术与主流框架。 内容全面:涵盖了Java Web开发所涉及的所有核心技术与主流框架 针对性强:以SSH框架整合开发为...

    JAVA开发高级工程师面试全集资料

    所以2019想找份18K的java开发工作。但是原理职场好久,这次正好整理下JAVA基础,JAVA中级和JAVA高级的面试资料。这里分享下,我的目标是互联网公司,所以呢,你们看看自己的定位。努力一下。 牛客网剑指offer编程题...

    Java Web整合开发王者归来(JSP+Servlet+Struts+Hibernate+Spring)

     资深Java程序员耗时一年时间写作,十年开发经验毫无保留。全面、系统、深入介绍Java Web开发的核心技术与主流框架。  一线开发人员全力打造,分享技术盛宴!  内容全面:涵盖了Java Web开发所涉及的所有核心技术...

    干货!资深java工程师面试要点大全+一年整理.pdf

    本人面试五年的经验,涵盖几乎所有java面试要点!成为java资深开发工程师必须掌握的知识点总结

    Java开发工程师工作0-3年简历模板.zip

    该文档主要针对Java开发工程师不知道如何写简历,主要有毕业生,一年工作经验,两年工作经验,三年工作经验简历模板,需要的话可供大家参考。

    java源码包---java 源码 大量 实例

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...

Global site tag (gtag.js) - Google Analytics