为什么我喜欢Java
我现在的老板使用一个在线测试系统来筛选在线申请职位的求职者。测试的第一个问题很浅显,仅仅是为了让求职者熟悉一下这个系统的提交和测试代码的流程。问题是这样的,写一个将标准输入拷贝到标准输出的流程。求职者可以使用任何他们喜欢的编程语言来实现这个程序。
有时候我们也会遇到在这个测试中得零分的求职者。当我看到他们连最简单的问题都答不出的成绩时,我的第一感觉是,这并不反映出求职者有多差劲。很显然,这个测试系统本身太难使用,才导致求职者不能提交最简单的问题,所以失败归结于测试系统而不是求职者。
但是当我看求职者未能成功提交代码的时候,不止一次的(至少这一次)发现——不是测试系统的错。而是另一个甚至不会发生在我身上的问题:求职者提交失败是因为他们试图使用Java语言来实现这个程序。
我记起了Dijkstra的说法——“教授BASIC语言简直是在犯罪。”当看到求职者被Java搞的焦头烂额的时候,我在想是不是这个言论换成Java的话同样适用。
我不太确定,有可能还是这个测试系统的错;有可能Java程序员具备我们用的上的有价值的技能(抛开他们不能在很短的时间内解决一个简单问题)。我可能改变主意,就在这时,我感到担忧。
当你学习Perl, Python, Ruby, 或者 Javascript的时候,你学到的只是用哈希表解决问题的一些技术,这些仅仅称得上是语言的一部分。当你学Haskell时,就像是在学习一种用懒惰的清单和单元来解决问题的技术。这些强大的多功能的工具是编程语言最重要的地方。
但是当你学习Java的时候,对于很多问题解决起来都没有强大的语言特点来供你使用。相反,你将会把时间花在用编程语言解决问题的技术上。Java也有哈希表,但是从总体上来看,它们只不过是巨大的Collections库中的一种,和其他的种类淹没在Collections 的库中。而且也没有什么理由去了解并学习那些东西。优秀的Java课程可能倾向于分析Collections中有用的部分,但是,由于哈希表只是库的一部分,所以很难看出跟AbstractAction或者zipOutputStream这种类比起来有什么重要的。
我是一个在不同的组织工作了3年的职业Java程序员。我有时候便想写写关于Java的文章。是的我很尖酸刻薄,而且我也不得不承认,我的脾气很暴躁,残酷,消极,所以对我来说,狂热的喜欢一件东西是很困难的。我曾经试图写一篇关于Blosxom的好文章,在2006年发布在我的博客上,最后失败了;人们以为我是在进行批评,我不得不又写了个续篇来澄清,但是人们仍然认为我在批评Blosxom。因为这篇文章对Java刻薄的批评让人困惑。我必须声明:这篇文章中关于Java的一切内容都是持肯定态度的,并且也应该被接受。包括:
我真的喜欢Java。
我很高兴能有有用Java编程的经历。我喜欢用Java来编程主要是因为我发现这个过程很轻松。如果使用一门不好的语言,像是Fortran或者csh这种编程语言的话,你会在每一件事上面苦苦挣扎,开发过程中还要不断同这门语言做斗争。使用好的编程语言却是完全不同的体验:利用语言的强大之处,使函数的功能最大化,用最简洁的表达方式来实现代码。
Java既不是一门好的语言,也不算是很差的语言。它算得上一门中规中矩的语言,使用Java不需要有太多挣扎。使用Haskell或Perl时你时常担心是不是应该用最简洁、最高效的方式。在Java中就不必考虑这些,因为最简洁、最高效是不可能的。无论你做什么,怎样去努力,代码都会变得普通、繁琐、冗长、臃肿,你要做的就是把握住方向,将这些重要的大篇代码从键盘中打出来。如果最后的代码比用Haskell写的长十倍,也没有关系,因为IDE将会帮你生成其中的一半代码,而你仍要为另一半付出努力。
所以你改变了心态,不管薪水如何了,也不再担心写出的代码是预先设计好的两倍之长有多么糟糕。你也许不能解决大型的问题,但是你可以参考一本书来解决中等问题,这一行为又导致了更长的java代码,但是你仍能领到薪水。你是一个码农,你的工作就是写代码。你写了很多代码,所以你做好了自己的工作,每个人都皆大欢喜。
你将不会做出任何绝妙的东西,但是同样,你也不会做出很糟糕的东西来。项目可能失败了,但你可以将失败归结于别的地方。毕竟,你用10000行代码写了576个类,表面看来这些都是必不可少的,所以你做好了自己的本职工作。谁都不会责备你为什么要用576个类而不是50个,因为在Java里面仅仅用50个类是不可能的。
(不同的语言有不同的失败模式。比如Perl,项目失败可能是因为你设计并实现了一堆废话,但是有一个万能的变通方案:你可以将项目继续下去,等它变得足够大时交给别人,然后出错的话责任就会归咎于别人而不是你。在Haskell这么做的话,有可能在第一个月就被炒鱿鱼。)
所以是的,我喜欢用Java编程。这样可以从写高质量代码的责任中解脱出来。我很高兴不必担心我所做的是否优秀,或者我写的代码是否易读、易维护。代码变得臃肿,当然,这不是我的错。虽然一切都出于我手。
所以我喜欢Java。但是我不会选择这门语言来应对在线测试,除非分数靠代码的行数来评定。在测试中,你需要完成的快速,所以你需要优化代码来使它们简洁并且表达清楚。Java意味着很多东西,但从来和简洁、表达清楚无关。
当我看到可怜的求职者苦苦挣扎了15分钟14秒,试图用Java程序将标准输入拷贝到标准输出,最终放弃的时候,我为他们昂贵的教育感到悲哀,他们没有学会更好用的工具,或者只是挣扎的写出Java代码而别无他法。
原文链接: plover 翻译: ImportNew.com - 赖 信涛
译文链接: http://www.importnew.com/10576.html
为什么我喜欢Java的更多相关文章
- atitit. java跟php的比较..为什么大企业喜欢java 而不是php
atitit. java跟php的比较..为什么大企业喜欢java 而不是php 1. 主要原因::php是"低技术.低价格.低素质人员使用"的三低武器 1 2. 三低武器的特点( ...
- 没想到有一天我喜欢上java是因为微软,感谢啊
一直不喜欢java就是没有好的 ide, eclipse myeclipse idea 对于习惯visual studio的人 真的太好了 感谢微软 感谢visual studio code
- java太low,又舍不得jvm平台的丰富资源?试试kotlin吧(一)
尝试kotlin的起因 因为各种原因(版权,人员招聘),公司的技术体系从c#转到了java,我花了大概两周的时间来上手java,发现java的语法还是非常简单的,基本看着代码就知道什么意思.学习jav ...
- 一位资深程序员大牛给予Java初学者的学习路线建议
java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈 ...
- Java线程的5个使用技巧
萝卜白菜各有所爱.像小编我就喜欢Java.学无止境,这也是我喜欢它的一个原因.日常工作中你所用到的工具,通常都有些你从来没有了解过的东西,比方说某个方法或者是一些有趣的用法.比如说线程.没错,就是线程 ...
- Java语言的个人理解
Java语言的个人理解(比价深层次吧) 大四的生活确实十分的奢靡,不锻炼,不读书,几乎就是当一天和尚撞一天钟的生活,太颓废了,还好自己不是这个样子,不过身体确实差了很多,昨天跑了一圈内环(4KM),今 ...
- Java笔记--泛型总结与详解
泛型简介: 在泛型没有出来之前,编写存储对象的数据结构是很不方便的.如果要针对每类型的对象写一个数据结构, 则当需要将其应用到其他对象上时,还需要重写这个数据结构.如果使用了Object类型, ...
- Java虚拟机支持的最大内存限制
最近在开发Java的程序.本来我是一直很喜欢Java的内存管理的,不需要担心分配内存,只管分配,垃圾收集器自己会给你回收内存的.现在开发的程序数据量很大,为了速度快,我准备把所有的信息加载进内存,这样 ...
- JAVA变量的类型,定义变量
JAVA中常用的数据类型 数据类型 数据类型解释 说明 char 字符型 用于存储单个字符,如:性别“男”.“女”,电灯“开”.“关” int 整形 用于存储整数,如一天的时间是24小时,一月份是31 ...
随机推荐
- Javascript动态绑定
<div onclick="test()"></div> <script> function test(){ //code } </scr ...
- css3全屏背景显示
background:url(zhongyi2.png) no-repeat center center fixed;/* -webkit-background-size:cover; -moz-ba ...
- 天梯赛 L2-20 功夫传人 (深搜)
一门武功能否传承久远并被发扬光大,是要看缘分的.一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟子们的功夫就越弱-- 直到某一支的某一代突然出现一个天分特别高的弟子(或者是吃到了灵丹.挖到 ...
- curl: (6) Couldn’t resolve host ‘www.ttlsa.com’【转】
上周, 部分站点出现Couldn't resolve host.....问题, 导致公司所有走api的程序都无法正常使用(系统redhat 6.3的都出现问题, redhat 5一切OK). 最后解 ...
- 深入解析Mysql 主从同步延迟原理及解决方案
MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以 ...
- KVC, KVO 实现原理
Key-Value Coding: 键值编码 (KVC) 方法调用: // 对象属性 // 类似: Person -> name setValue: forKey: // 对象的属性或者 属性的 ...
- Hashtable之Properties
properties的使用:1.Hashtable的实现类,线程安全.与HashMap不同,Hashtable不允许使用null作为key和value2.和HashMap一样,Hashtable也不能 ...
- Lynx以纯文本的形式下载网页
Lynx是一款基于命令行的web浏览器 [root@test88 ~]# yum install lynx -y [root@test88 ~]# lynx www.baidu.com 以纯文本的形式 ...
- linux nginx php-fpm被攻击
1.nginx错误日志:报错 2018/05/30 16:30:55 [error] 8765#0: *1485 connect() to unix:/tmp/php-70-cgi.sock fail ...
- 4、GitLab 创建、删除、修改项目
一.gitLab创建项目 1.创建用户组 2.填写组信息后单击“Create group” 其中:“Group path”将显示在git路径中 3.选择需要加入该组的“用户”和“角色”后点击“Add ...