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 的多任務、麵向對象的語言,那麽編寫程序將是輕而易舉的事(想象一下,如果我們愚蠢地允許硬件優先的設計策略,我們將會遇到什麽困難。 將我們鎖定在四位微控製器中!)。”
國王明智地斬首了計算機科學家,從此他們都過上了幸福的生活。