CS巴别塔(1)

资深架构设计师的30条忠告

Posted in Uncategorized by Kenny Yuan on 2010/10/18

UI really matters!
界面真TMD不能忽视!

The design should base on the problem domain, not on what you have done before.
设计是应该按照问题域来进行的,而不该根据你过去做的事情为蓝本。

It’s hard to say “I was wrong”, but if you don’t say it, you’ll have to pay for it.
说出“我是错的”是很困难的,但是如果你(在该说的时候却)不说,你会为此付出代价。

It’s not your full time job demonstrating how to write code. You can do it, but not all the time.
你的工作不是做编程示范。你可以做,但是不要全身心投入进去。

Bug fixing is also your responsibility, don’t leave it to the maintenance team.
处理BUG也是你的责任,别把它扔给维护团队就不管了,要不然你的设计会被维护团队搞得面目全非的。如果写烂代码更方便的话,维护团队一定会写出大堆的烂代码的。作为架构师,你要去控制修改代码的成本,让成本最低的那一个成为你所期望的那一个(借鉴一下经济学)。

You are not Winston Wolf. Try to eliminate problems before they surface. (good design has less problems; you’re not a firefighter)
你不是一个专门来解决麻烦的(见《低俗小说》)。试着在麻烦出现前将它们干掉。(好的设计能消除问题和麻烦;你不是消防队员)

Design is technical, try to avoid politics. Or negotiate with politics to make things still work.
设计是技术问题。不要让政治参与其中。或者适当妥协以便让事情还能运转。

If your decision is based on some limitations, always remember those limitations along with your decision.
如果你的决策是基于某些限制的,那么在记住你的决策的同时,要记住这些限制(不要直接记住结论)

If you can summarize principles from your work, write it down. Then sometimes you’re able to know you were wrong.
如果你能在工作中总结出原则,就写下来。这样以后你就能知道你曾经如此这般地犯过错(我打赌你写过的多数都是错的,除了OCP,但那不是你发明的,嘿嘿)

If there are many programmers awaiting for your design, you’re definitely dead meat. (Human Resource driven is the sin)
如果有太多的程序员在等你的设计(来开工),你就死定了。(人力资源驱动是一种原罪)

Prevent lame metaphors; software is neither art nor brick building.
别用蹩脚的比喻;软件不是艺术,也不是砖墙。

Tell the user what you can provide; don’t ask them what they REALLY WANT.
告诉用户你能提供什么;别问他们“你到底要什么”。

Quality is your responsibility too, don’t hand it over to QA. (Design in the robust way)
质量也是你的责任;别把它们交给QA。

Don’t get smart. Write it down when you feel like a genius, and attack your idea as the most dangerous enemy.
别耍小聪明。当你感觉自己像天才似地做出一个设计的时候,要把它当成最危险的敌人来对待。

Reuse is not your purpose, it’s neither necessary nor sufficient to success.
“重用”不是你的目的。它不是“成功”的充分条件,也不是必要条件。别单纯为了重用去设计,别忘了重用是为了达到什么样的目的。

A language addict will always be a slave. Try to become a sensai.
语言上瘾者永远是一个奴隶;尝试变成斯普林特老师吧!

Solutions/Tools with high price guarantee nothing on productivity.
售价很高的解决方案/工具从不保证任何生产力。

Don’t say “Microsoft did the same thing”. It proves nothing. (Google/Facebook/Twitter/etc.)
别用“微软也这么干过”来支持你自己。它什么也证明不了(google/facebook/twitter同理)

Don’t try to collect information/requirements first and decide later; welcome to the moving planet.
别尝试先收集所有的信息和需求,然后再决定;欢迎来到地球——这颗移动的行星!

There’s no universal solution; The programming language sometimes can be the one, unfortunately we have lots of languages.
没有万能的解决方案;有时候编程语言可以是一个(万能解决方案),不幸的是我们有很多种语言

Age and experience are not the right way to defend yourself in an argument.
在争论中,年龄和经历不是你证明自己的正确方式(以德服人,以理服人)

Yesterday’s workaround is tomorrow’s limitation.
昨天的Workaround就是明天的限制

Good design evolves; bad design patches.
好的设计在进化,坏的设计不停地打补丁

Design what you’re able to write code for it. If it’s too hard to you, don’t count on the others.
用你能实现的方式来设计;如果困难到你也写不出来了,那么就别指望其它人

Don’t be the captain in the engine room.
不要成为引擎室里的船长(把船开好是你的职责,而添煤则不是)。

Inspect your design in each level.
在不同的级别下仔细检视你的设计。

Understand the hardware; your system doesn’t run in air. (Hardware goes wrong too)
要懂得硬件。你的系统不是在空气中运行的(但是可以Adobe Air)(硬件不是完美的,可能会出各种错误;)

Make your design natural and comfortable. Don’t fight against programmers, and don’t let them fight against your design.
让你的设计是自然而舒服的;别跟程序员斗争,也别让他们和你的设计斗争。(参考QT的舒适与灵活,外加良好的命名和强大的功能;另参见最小惊奇原则)

It’s too late when you realize it’s slow; design for performance;
当你意识到速率太慢的时候,已经太晚了。为性能而设计。

……嗯……如果你仔细数过了这些原则的数目,会发现其实只有29条。第30条我没有写,其实原打算是这样的:

(30)这篇文章是由Kenny Yuan在1.5小时内直接敲出来的,其中英文敲了一小时左右,中文翻译了半小时左右;他写这篇文章是为了说明:滔滔不绝地谈论具有迷惑性的原则是多么的容易!而且居然还能骗到一部分人哩……

(P.S. 之所以选择从“架构”这个角度来忽悠,是受到以下这个的启发:http://97-things.near-time.net/wiki/97-things-every-software-architect-should-know-the-book)

最后祝大家动脑快乐!

(P.P.S. 此为旧文,一直在草稿里忘了发。现在编辑一下发出来,其目的,当然是想要给大家的Google Reader再添一个未读数,嘻嘻——嗯,要keep it on the down low…)

愚蠢的“为什么”

Posted in Uncategorized by Kenny Yuan on 2010/05/17

先讲个小故事(含记叙文6要素):某年某月某天,在某地有一个小讲座。在Q&A阶段,某人问了某个问题:“为什么要选择xxx方式?”。结果他立即就收获了人群中数道鄙视的目光,还有一些轻微的哄笑和嗡嗡的议论。还好,主讲人没有觉得这个问题可笑,认真地回答了这个问题,还给出了数据。

聪明人往往会记住前提和数据,再自己推出结论——这样,在前提和数据变化的时候,他会意识到结论不再成立,而不会再受其困扰;而笨蛋则会直接记住结论。时间长了,有些结论对他来说就是“不言自明”、“理所当然”的——当这种笨蛋占群体中多数的时候,问一个“为什么”也可以让他们开怀大笑……

我相信,以下问题都曾经“可笑”过:

为什么不能让屏显和打印的结果一致?
为什么在PC架构中不可以有虚拟机?(x86 17指令?)
为什么不能搞一个遍地都能运行的ISA?(Java)
为什么点了链接后一定要整个网页刷新?
为什么不能丢开RDBMS自己开发一个更合适的模型?
为什么字母C一定要连按三次才能输入?(T9)
为什么一定要用命令行操作电脑?
(来一个前瞻性的)为什么一定要用鼠标?
……

嗯,最后给笨蛋们提供一个很好使的后悔句式:Why didn’t I think of that?

Tagged with: , ,

读弱智故事,享忽悠人生——如何防忽悠?

Posted in Uncategorized by Kenny Yuan on 2009/05/07

卷首语:21世纪什么最重要?防忽悠!

1 关于电脑的故事,忽悠程度不高

先看看这个故事,体会一下被忽悠的感觉(在这里我假定你对电脑故障比较熟悉)。

《电脑对黄碟过敏么?》

某电脑公司收到投诉信,用户抱怨说他每晚都要看碟。如果看的是黄碟,则他新买的奔腾二代电脑会自动重启;如果看其它的碟,则电脑可以正常观看。天天如此。该用户怀疑这电脑是否对裸体过敏。
电脑公司的头头觉得这太过诡异,不过还是派了一个工程师去该用户家调查原因。第一天,工程师和用户一起去看碟。在家里,工程师要求看黄碟,结果放出来后, 电脑果然重启了。此后几天,工程师每次都和用户一起看碟,每次都由工程师临时决定看什么碟。果不其然,凡是看了黄碟,电脑就会重启;反之则正常。(由于是工程师临时决定看的类型,可以排除用户搞恶作剧的可能)
这个工程师是一个理性的人,也不信神,当然不会相信电脑对黄碟过敏这一说。但是他觉得有更深层的原因在起作用。此后,他每天晚上和该用户一起去看碟,每次 他都详细记录开机的时间、途中点鼠标左键和右键的次数、使用的软件版本等各种信息。许多天后,他终于发现了规律:黄碟一般都比较破旧,而且碟片上充满了划 痕。
于是问题就转化为:读破烂的光碟导致电脑重启。然后,工程师就轻易找到了原因(当读破烂的影碟的时候,光驱功率过大,导致电脑电源功率超载,造成供电中断,电脑重启)。

这个故事是在说,透过现象看本质,要胆大心细,才能做好工程师……blah blah

(被忽悠了的请去面壁一分钟)

为什么说这个故事是忽悠?因为在奔腾二的时代(如1999年),光驱功率过大造成电脑重启是一件很常见的事情,对于工程师来说,不需要那么多时间去反复看 不同的碟,以及记录鼠标/键盘动作等。对于无蓝屏的重启,第一怀疑就是供电,接上示波器看看波形便知。在实际维修中都不用这么麻烦,因为稍微有点经验的 人,听到光驱狂转的巨大声音,都能联想到光驱的功率太大了(知道这事儿的人挺多的:在我上大学时,前后三栋宿舍楼的人基本上都知道这回事儿。其实,只要常 看碟的人,基本都知道这回事儿。《电脑报》等报刊上也登过)。对于专修电脑的维修师傅们,一听说“看碟时电脑重启”,第一反应也差不多应该是“光驱功率过 大,电源吃不住了”。经历过PII电脑时代的人对这个现象简直是太熟悉了(与现在不同,那时候电源是不被重视的,多数的质量很差)。在那个时代,多数人都 特别关心影碟的质量,租碟的时候都要先看划痕多不多,以便评估一下是不是好读(因为看碟时读不出,导致电脑死机是常有的事)。如果有人抱怨碟片读不出、看 不了,别人说的第一句话基本都是“碟太烂了吧”……所以,对这种现象,一个正常的工程师根本用不到花费“许多天后”才得到正确答案。

2 关于汽车的故事,忽悠程度就高多了

二次忽悠来到,这次是关于汽车的(在这里我假定你对汽车技术和修理程序不熟悉)。

《Pontiac汽车对冰淇淋过敏?》

某汽车公司收到投诉信,用户抱怨说他每晚都从家里开车去商店买冰淇淋。如果买的是香草冰淇淋,则回家时汽车就无法发动;如果买其它口味的冰淇淋,则汽车可以正常发动。天天如此。该用户怀疑这汽车是否对香草冰淇淋过敏。
汽 车公司的头头觉得这太过诡异,不过还是派了一个工程师去该用户家调查原因。第一天,工程师和用户一起去买冰淇淋。在店里,工程师要求买香草口味,结果出来 后,汽车果然不能发动。此后几天,工程师每次都和用户一起去买,每次都由工程师临时决定买什么口味。果不其然,凡是买了香草口味,汽车就无法发动;反之则 可以。(由于是工程师临时决定购买的类型,可以排除用户搞恶作剧的可能)
这个工程师是一个理性的人,也不信神,当然不会相信汽车过敏这一说。但是他觉得有更深层的原因在起作用。此后,他每天晚上和该用户一起去买冰淇淋,每次他都详细记录往返的时间、途中踩油门和刹车次数、使用的汽油型号等各种信息。许多天后,他终于发现规律:凡是买香草口味的,在商店里面花的时间少(因为这个口味受欢迎,摆放的货架靠门口)。
于是问题就转化为:停车的时间短导致汽车不能正常发动。然后,工程师就轻易找到了原因(当停车时间太短,发动机依然很热而无法驱散气阻)。

这个故事的启发是……布拉布拉……

(译文抄自http://blog.csdn.net/program_think/archive/2009/02/02/3858867.aspx,对BLOG作者无恶意,切莫误解)

你被忽悠到了没有?

2.1 一大段关于发动机的技术解释

为 什么说这个故事是忽悠?先得说说什么是气阻(气锁):对于发动机来说,气阻这个词是说进气道内的空气阻力(说得不严谨,但这样说比较好理解)。气阻过大时 会影响混合气进入燃烧室,这时就形成了气锁(也不严谨,其实不只是在进气道内会有气锁,曲轴箱也会有)。也有把气锁称为气阻的,但Vapor Lock这个词这样翻译有点不合适,没体现出“Lock”一词的意思来。

不同温度下空气的体积是不同的,特别对于进气道这个温度变化范围很大的地方。正常的发动机温度是90度,但那是指发动机水套内的平均温度。气缸内的燃烧温度有1000多度,排气温度也有几百度。相比起来,经过滤清器的新鲜空气温度都很低,顶多也就是40度的样子。所以很多车都将排气歧管和进气歧管设计在一起,形成一个热交换器(也有用水套的水进行加热的,在小循环温度足够时就可以加热了),用排气歧内的废气来加热混合气,混合器的温度上升,有利于气油的雾化,但同时也会造成空气的膨胀,导致氧气减少,造成不完全燃烧,甚至无法燃烧。说到进气歧管,附带说一下可变进气歧管。进气歧管越长,低速扭矩越大(因为气体分子有粘滞性),但是在高速时,长长的进气歧管却很难及时供给混合气(还是因为气体分子的粘滞性),这时要求有较短的进气歧管。所以,现代发动机中才会有可变进气歧管的设计。为什么要说到进气歧管的问题呢?因为进气歧管的问题也是气阻造成的。(注意这里没有说可变正时/升程的进气门/排气门,俺比较讨厌本田作秀的VTEC)

以上一段说的不适用于直喷机,因为直喷机没有可燃混合气。另外,所有的Diesel都是直喷机(MM们请注意,这个不是时装品牌那个Diesel……)

气阻(气锁)不一定是在进气道里形成的,油箱也会造成气阻。油箱基本是密闭的。油箱设计有通气道,在两种情况下会打开,一是大量汽油已被送向发动机,油箱内的压力减小,导致一个负压,进而影响低压油路内的气油流动,如果负压过大,就会造成气锁,使低压油路内的气油无法流动。所以,在油箱内压力小于一定数值时通气孔打开放入空气,补充气压。第二种情况是汽车受热,汽油在油箱内挥发,产生大量油蒸气,造成油箱内压力过大,此时要打开通气孔将汽油蒸气排入空气中。(所以,不要将你的车放在太阳下暴晒,气油会蒸发,最终跑光光的~~)

为什么高温启动会碰到气阻/气锁问题呢?理由简单得出奇,因为发动机本来是为了低温启动设计的。在极低的温度下,发动机想要启动,是非常困难的,因为汽油蒸气在低温下很难形成,影响燃烧;而且低温下润滑油粘性很高,各部件间的阻力增大。所以在现代发动机的进气道内都设有陶瓷电阻用来预热混合气。这种电阻很有意思,在低温下它有一定阻值,会发热,但温度升高到几百度的时候其电阻值会变成无穷大,此时电路断路,不再加热进气道内的混合气。

既然发动机原本设计成”偏向于低温启动”,那在高温的时候出现气阻影响启动也就是有可能发生的事情了(参数不匹配的问题或其它意外情况,另:正在工作中的发动机遇到气锁也会熄火)。所以,现代发动机的设计和测试都是对“低温启动”和“高温启动”这二者兼顾,一个也不能少。实际上,气阻是发动机设计的关键中的关键。发动机设计的至高境界是:让空气顺畅地进入燃烧室,与汽油一起进行最大限度地快乐燃烧,然后再通畅无阻力地排走燃烧过的废气(各种工况下均应如此)。这样,就能最大限度地压榨功率(e.g. 升功率100ps+)。常用的手段有:

  • 加大进气量
  • 加大喷油量(前两项加起来也就是提高压缩比了)
  • 喷射燃油由电子系统控制
  • 缸内直喷(活塞吸进来的只是空气,燃油直接喷射到汽缸内)
  • 不均匀地喷油(它有一个名头响亮无比的缩写:FSI)
  • 减小进气阻力和增大进气量(如:正时/升程可变,可变进气歧管)
  • 减小排气阻力(如:正时/升程可变以减少排气门漏气,拆掉催化器的直排)
  • 提高进气的压力(SUPERCHARGE或TURBO)……

(请数一数在上面列举的条目中有多少次涉及了气阻问题,呵呵)

2.2 为什么我认为这个故事也是忽悠

说了这么多,你想到什么了没有?——气阻是这么基本、这么重要的东西,连我一介票友都能大喷特喷出这么多来,难道发动机的设计者竟然犯下了如何严重的错误?虽然Pontiac从来没出过让人称赞的好车,但它也是很普及的车型(在美国的租车行里很常见),会有这么严重的设计失误么?这个问题我没有答案,TX们可以自行判断。

在我看来,如果是因为气阻致使发动机无法在热机工况下启动,应该属于个例,是需要维修的故障,而不是车型的通病。这样的故障在维修工那里通过检查维修check list项目就能重现。对于无法启动的故障,维修工是很熟悉的:一般要查油路,查缸压,查喷油嘴,查进气道,查节气门开度(如果是化油器的还要查阻风门等),查冷车启动,查热车启动……哪怕是在汽车维修水平极其低下的中国,4S店的小工也特别熟悉这一套东西。

如果我们假设去买香草冰淇淋的时间是1分钟,这时的气锁导致发动机无法启动。那么,在发动机熄火后10秒钟时尝试启动,也同样会遇到气锁问题(此时的发动机更热),同样无法启动。我相信任何修理工/工程师对于发动机无法启动的问题,不会仅仅跟着客户跑来跑去,在“许多天”里都从来不去尝试“冷车能否启动”和“热车能否启动”这两个必查项目的。(不管是在脑子里,还是维修检查用的check list,都会有这两项的)

我最早看到这个故事是在六年前的TOM汽车论坛。当时也有不少人怀疑这个故事的真实性。我在网络搜索了很久,也没有能够确定其真伪。但我一直认为,这个明显有漏洞的故事,应该出自《读者》那类“喜欢编故事、又无法自圆其说”的刊物。

当然,上面我说的这些不能证明这个故事肯定是假的。但是我可以肯定地说:可疑点太多了。面对众多可疑点却毫不怀疑,这就是被忽悠了。

3 如何防忽悠

一句话结尾:要了解故事的背景知识,同时具备批判性思维(Critical Thinking)

附:延伸阅读

1)Wiki Critical Thinking
http://en.wikipedia.org/wiki/Critical_thinking

2)本人的另一篇烂文:《关于不了解的领域,兼谈Cirtical Thinking》(勉强算是个通俗入门版)
http://blog.csdn.net/yuankaining/archive/2008/12/16/3529833.aspx

3)强人介绍速成经验的:《如何清晰地思考:近一年来业余阅读的关于思维方面的知识结构整理》
http://blog.csdn.net/pongba/archive/2008/12/18/3549560.aspx
(其实我说谎了,速成不了的,要花很多时间的……)

Tagged with: