https://martin-thoma.com/joke-electrical-engineering-vs-computer-science/
从前,在离这里不远的一个王国里,一位国王召集了他的两位顾问进行测试。
他向他们展示了一个闪亮的金属盒子,顶部有两个插槽、一个控制旋钮和一个控制杆。 “你觉得这是什么?”
一位顾问,一位工程师,第一个回答。 “这是一个烤面包机,”他说。 国王问:“你会如何设计一个嵌入式计算机呢?” 工程师回答道:“使用四位微控制器,我会编写一个简单的程序,读取暗度旋钮并将其位置量化为 16 种暗度之一,从雪白到煤黑。该程序将使用该暗度级别作为 初始计时器值的 16 元素表的索引,然后它会打开加热元件并使用从表中选择的初始值启动计时器,在时间延迟结束时,它将关闭加热并弹出。 下周回来,我会向你展示一个工作原型。”
第二位顾问是一位计算机科学家,他立即意识到这种短视思维的危险。 他说:“烤面包机不只是把面包变成吐司,它还可以用来加热冷冻华夫饼。你所看到的实际上是一个早餐炊具。随着你王国的臣民变得更加复杂,他们将需要更多的功能 他们需要一个可以煮香肠、煎培根和炒鸡蛋的早餐炊具,如果我们不放眼未来,我们将不得不在几年后彻底重新设计烤面包机。”
“考虑到这一点,我们可以针对问题制定更智能的解决方案。首先,创建一类早餐食品。将此类专门化为子类:谷物、猪肉和家禽。应该重复专门化过程,将谷物划分为吐司 、松饼、煎饼和华夫饼;猪肉分为香肠、链接和培根;家禽分为炒鸡蛋、煮鸡蛋、荷包蛋、煎蛋和各种煎蛋卷。” “火腿奶酪煎蛋卷类值得特别关注,因为它必须继承猪肉、乳制品和家禽类的特征。因此,我们看到如果没有多重继承,问题就无法得到正确解决。
在运行时,程序必须创建 正确的对象并向该对象发送一条消息:“把自己做了。” 当然,该消息的语义取决于对象的类型,因此它们对于一片吐司和对于炒鸡蛋具有不同的含义。” “回顾到目前为止的过程,我们发现分析阶段已经揭示了主要需求是烹饪任何种类的早餐食品。在设计阶段,我们发现了一些派生需求。具体来说,我们需要一种面向对象的语言 当然,用户不希望煎培根时鸡蛋变冷,因此也需要并发处理。”
“我们不能忘记用户界面。降低食物的控制杆缺乏多功能性,而且黑暗旋钮令人困惑。除非产品具有用户友好的图形界面,否则用户不会购买该产品。当早餐炉插入电源时 ,用户应该会在屏幕上看到牛仔引导,然后单击它,并且屏幕上会出现消息“正在引导 UNIX v.8.3”(UNIX 8.3 应该在产品上市时发布。)。 拉下菜单并点击他们想要烹饪的食物。”
“在设计阶段做出了首先指定软件的明智决定后,剩下的就是为实施阶段选择一个足够的硬件平台。配备 8MB 内存、30MB 硬盘和 VGA 显示器的 Intel 80386 应该是 如果您选择支持多重继承并具有内置 GUI 的多任务、面向对象的语言,那么编写程序将是轻而易举的事(想象一下,如果我们愚蠢地允许硬件优先的设计策略,我们将会遇到什么困难。 将我们锁定在四位微控制器中!)。”
国王明智地斩首了计算机科学家,从此他们都过上了幸福的生活。