`
王者之剑
  • 浏览: 196435 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
社区版块
存档分类
最新评论

不要把简单的事情搞得N复杂(例1)

阅读更多

题目:用java写一个程序,打印如下图形

*

**

***

****

*****

请思考三钞钟,写下你的程序,然后看答案。

 

 

 

我刚毕业时的答案:

package com.albertsong;

/**
 * 
 * @author Albert
 *
 */
public class PrintStar {

	public static void main(String[] args) {
		for(int i=0;i<5;i++){
			for(int j=0;j<i+1;j++){
				System.out.print("*");
			}
			System.out.println();
		}
	}

}

现在的答案:

 

package com.albertsong;

/**
 *
 * @author Albert
 *
 */
public class PrintStar {

    public static void main(String[] args) {
        System.out.println("*\n**\n***\n****\n*****\n");
    }

}
 

 

看到这里,同学们肯定有话要说了。

 

我也有话要说,我想说的是:“与人方便,自己方便”。

 

仅就这个题目而言,显然第二个程序要好得多,它实现了和第一个程序一样的功能。无论从代码行数,还是容易理解的程度,第一个程序都无法与之相比。

 

讨论1:

M:第一个程序更容易修改,扩展,适应性更强。如果要打印下面的图形,

*

**

***

...

*****...***(注:第100行有100个)

改第二个程序还不累死?

A:如果第二天客户要打印的是下面这个图形呢?

*

**

***

* **

*** *

M:变态!%^&*

A:没有变态的客户,只有懒惰的程序员。

 

 

讨论2:

1)

A:到目前为止,这样的图形最多有几行?

G:十行吧

A:随着贵公司的发展,有可能到一百行吗?

G:当然是希望越多越好,但按公司目前的情况,十年之内不太可能。

G:但我们有可能调整业务,那时图形可能会变。

A:变了的话应该还是有一定规律的吧

G:那当然,也不能胡乱调阿,结果基本上不是正三角形就是倒三角形,最多会变成菱形。

2)

A:需不需要能够打印一百行,或者一千行的?

G:不需要,这个图还是昨天拍脑袋出来的,先给我打出来看看效果

A:会不会有中间哪儿少个*号的情况

G:你先别管这么多,先把目前这个问题解决了,中间会不会少*号这会儿还不知道。

 

讨论3:

T:本来想招个学过Java for循环的程序员阿

A:我们下回是不是把题目改成“用java写一个程序,打印如下图形(请使用for循环)。

 

现在到底哪个程序好,应该比较清楚了吧。

“不要把简单的事情搞得N复杂”,这句话是针对结果,而不是针对过程的准则。

前几天在闲聊中写道:不要解决不存在的问题,我想更为准确的说法是:不要解决了不存在的问题。

 

路人甲:哦,懂了,但是,这和前面说到的“与人方便,自己方便”有什么关系?

A:没有一毛钱的关系,如果“认真分析需求,为客户着想”这种理念高尚得让你有点儿难受的话,不妨想想,这样做,实际上可以为自己省下看毛片的时间呀,对不?

 

42
7
分享到:
评论
24 楼 pufan 2009-04-15  
王者之剑 写道

pufan 写道
够简单,但不见得健壮。大并发的情况,特别是当网络拥挤时,http请求很可能造成线程占用过多从而引起系统资源不足。用ruby,curl看上去简单,但实现是怎样的谁知道:是后台单线程还是多线程、是否和其他模块共用线程池等等,这些都可能会引发潜在问题。如果用java,做法就是将请求放入队列,后台单线程轮询执行(看起来挺复杂,其实就是线程池+URL十行代码搞定),虽然没ruby代码少,但用得放心不是。有不放心的可能,但1行和10行的区别是10倍。如果不知道有curl这个东西,使用语言本身的线程和socket支持还情有可原放不放心怎么能成为一个理由。


放不放心在于责任感,也许你看不能称之为“理由”。
23 楼 lvp 2009-04-15  
jef 写道

说白了就是该抽象的时候你就给抽象一下,就是怕无论事情大小一概抽象复杂化。实用性,可扩展性总是矛盾,最后就是一个度(结果)的问题,度的问题把握好了,也就没什么好说的了。突然想起了这个例子:
引用
话说联合利华新换了一批自动香皂包装机以后,经常出现香皂盒子是空的没有香皂的情况,而在装配线一头用人工检查因为效率问题不太可能而且不保险。这不,一个由自动化,机械,机电一体化等专业的博士组成的Solution队伍来解决这个问题,没多久他们在装配线的头上开发了全自动的X光透射检查线,透射检查所有的装配线尽头等待装箱的香皂盒,如果有空的就用机械臂取走。不巧,中国一乡镇企业生产香皂也遇到类似问题,老板吩咐线上小工务必想出对策决之,小工拿了一个电风扇放在装配线的头上,对着最后的成品吹之,空盒子被吹走,问题解决之。



点中要害!
22 楼 saiyaren 2009-04-15  
这个东西让我想到了初中的一篇课文了,老师在黑板上画个圆,大学生不理解其意思,高中生说是圆,初中生说是圆形,圆球,到了小学生有说是月亮的,有说是烧饼的,千其百态,所以当我们看到让写出上述代码的时候,第一反映就是书本上写的那个循环例子,谁还会想到直接print呢?因为我们的思维在这10几年的上学中被束缚了,能想到的也变成了固定模式,所以不奇怪,像我们现在做东西是不管用什么方法,只求可以实现就可以,实话啊,但是楼主的简单话也是通过不同方向去实现它,只是角度不同罢了!
21 楼 jef 2009-04-15  
说白了就是该抽象的时候你就给抽象一下,就是怕无论事情大小一概抽象复杂化。
实用性,可扩展性总是矛盾,最后就是一个度(结果)的问题,度的问题把握好了,也就没什么好说的了。

突然想起了这个例子:
引用

话说联合利华新换了一批自动香皂包装机以后,经常出现香皂盒子是空的没有香皂的情况,而在装配线一头用人工检查因为效率问题不太可能而且不保险。这不,一个由自动化,机械,机电一体化等专业的博士组成的Solution队伍来解决这个问题,没多久他们在装配线的头上开发了全自动的X光透射检查线,透射检查所有的装配线尽头等待装箱的香皂盒,如果有空的就用机械臂取走。

不巧,中国一乡镇企业生产香皂也遇到类似问题,老板吩咐线上小工务必想出对策决之,小工拿了一个电风扇放在装配线的头上,对着最后的成品吹之,空盒子被吹走,问题解决之。
20 楼 王者之剑 2009-04-15  
pufan 写道

够简单,但不见得健壮。

大并发的情况,特别是当网络拥挤时,http请求很可能造成线程占用过多从而引起系统资源不足。

用ruby,curl看上去简单,但实现是怎样的谁知道:是后台单线程还是多线程、是否和其他模块共用线程池等等,这些都可能会引发潜在问题。

如果用java,做法就是将请求放入队列,后台单线程轮询执行(看起来挺复杂,其实就是线程池+URL十行代码搞定),虽然没ruby代码少,但用得放心不是。

有不放心的可能,但
1行和10行的区别是10倍。
如果不知道有curl这个东西,使用语言本身的线程和socket支持还情有可原
放不放心怎么能成为一个理由。
19 楼 nzinfo 2009-04-15  
让我想起了在学校考Fortran ,就是类似的题目。
我的答案就是楼主的第二种,原因是 不记得 Fortran的循环语句怎么写了。
ps:大学学的土木专业
18 楼 王者之剑 2009-04-15  
sfish002 写道

不过学校喜欢教复杂化的

学习和工作是两回事,实际上学校不是教得太复杂,而是太简单,简单到无用。
学习时要广博精深,工作时才能审时度势,居高临下。
17 楼 王者之剑 2009-04-15  
redK 写道

我是想这么写的,就怕面试官看了疑惑:这厮莫非连for循环都不会?哈哈

求仁得仁
16 楼 redK 2009-04-15  
我是想这么写的,就怕面试官看了疑惑:这厮莫非连for循环都不会?哈哈
15 楼 sfish002 2009-04-15  
不过学校喜欢教复杂化的
14 楼 luolonghao 2009-04-14  
同意作者的看法,保持性能和可读性的前提下越简单越好。
13 楼 hgalois 2009-04-14  
最后一句话最实在!
12 楼 playfish 2009-04-14  

哈哈,很赞的想法.

最后一句话很亮点.
11 楼 王者之剑 2009-04-14  
QuakeWang 写道

说到底还是java的语法造成的,如果用ruby的话,这个需求就是:从1到N,每行打印N个*顺手就可以写出来:Ruby代码 1.upto(5)&nbsp;{|i|&nbsp;puts&nbsp;"*"&nbsp;*&nbsp;i}&nbsp;&nbsp;1.upto(5) {|i| puts "*" * i}完全是符合自然语言的写法&nbsp;

ruby果然简洁
10 楼 王者之剑 2009-04-14  
robbin 写道

在ruby程序直接调用curl命令发送一个http请求搞定:`curl http://blogsearch.google.com/ping?...... &gt; /dev/null &amp; 2&gt;$1`,土鳖吧,但是很简单,很健壮,哈哈。

curl很好很强大。
9 楼 robbin 2009-04-14  
我同意作者的实用主义态度,应该寻求用最简单的办法完成任务,而不是脑子里面就预设了很多额外的所谓追求扩展性,代码优雅和美感的伪需求。
8 楼 QuakeWang 2009-04-14  
说到底还是java的语法造成的,如果用ruby的话,这个需求就是:
从1到N,每行打印N个*
顺手就可以写出来:
1.upto(5) {|i| puts "*" * i}


完全是符合自然语言的写法 
7 楼 王者之剑 2009-04-14  
luoyahu 写道

第二种有做弊嫌疑.这个例子举的不是很好哦!
如果是面试题的话很二种写法估计会被卡.因为你没理解题目意图.

请看讨论3,请不要妄自猜测+妄自菲薄
6 楼 luoyahu 2009-04-14  
第二种有做弊嫌疑.这个例子举的不是很好哦!
如果是面试题的话很二种写法估计会被卡.因为你没理解题目意图.
5 楼 flyfan 2009-04-14  
不过还是赞成第一种方法

相关推荐

Global site tag (gtag.js) - Google Analytics