遊戲化學習程式教育程式語言

寫程式印出十次Hello

2014-10-06

瀏覽次數:4573

這篇文章的核心問題:「印出 Hello 10 次」——你會用 for 迴圈,還是直接寫 10 行 print?答案沒有對錯,但這個問題暗藏著一個程式設計師最重要的思維:不要死板地套公式,要判斷什麼是這個情境下真正最好的解法。有時候「笨方法」反而最快、最清楚、最正確。

故事起點:面試新手的一道考題

今天上網看到一篇老文章《Coder or Clown?》,文章作者主要想表達的意思是他作為面試官,面試了很多程式設計師,他發現很多程式設計師就是小丑,並把他們分類列舉。這篇去年發表的文章被很多人轉載翻譯,作為茶餘飯後調侃程式設計師的佳作。我看了也是一笑而過,但是其中作者說的第一個事例卻引起了我的興趣,雖然很搞笑,但是這其中似乎隱藏著一些 coder 的情懷。

這個故事是這樣的:作者面試了一個叫做 Ada 的畢業生,她是一位程式新手。作者給她出了一道題目,讓她在紙上寫下一段程式,目的是印出 "hello" 10 次,無論用什麼語言寫都可以。於是這位可愛的學生在紙上寫下了 10 句「print "hello"」。

作者給出的評語是:「無論如何,拼寫都是正確的。」這本身是一件很搞笑的事情,我當時也很歡樂,雖然不知道是不是真有其人。我也就開開心心地把整篇文章看完,作者的語言很幽默。評論很多,我稍稍看了一下發現許多人對 Ada 這件事耿耿於懷,甚至還有人說那是最佳答案。

更好的做法?也許比你想像的更接近「笨方法」

Ada 的做法很好,但更好的做法應該是如下:

print "hello hello hello hello hello hello hello hello hello hello"

優點:

  • 程式碼清晰易讀
  • 避免了循環,不會破壞 CPU 管線,提升了效率
  • 改多次 I/O 函數呼叫為一次呼叫,提升了效率

看到這個評論的時候我笑了半天,不過這位朋友說的挺有道理。我仔細想了一下,覺得印出這個單詞 10 次,也許這真是一個比循環更好的辦法。我記得還在上學的時候,老師曾說到在什麼情況下使用循環,好像是說某一個操作要重複執行大於 3 次,那麼就應該用循環結構。當然,現在看來這個說法也很搞笑,為什麼要 3 次以上,為什麼不是 4 次?我們再回來看這個問題,首先要寫 10 次 hello 並不費力,而且他人也一眼就能看出語句的目的是輸出 10 個 hello 這串文字,而用循環的話就沒有這麼直觀了。

其實作為程式設計師最忌諱的就是死板,一成不變循規蹈矩地編程首先就會讓自己厭倦。多思考,多實踐才是最好的提高手段。那麼大家能說說寫 10 次 print "hello" 與使用 for 循環相比有什麼不妥嗎?難道影響程式可讀性?影響執行效率?不會是說佔用了更多的硬碟空間吧(笑)。

程式設計師最重要的思維:什麼時候用「笨方法」才是最聰明的?

很有趣吧?

大部分的人都會覺得「笨方法」一定最慢、最累,但是在很多情況下,這些「笨方法」反而會花最少時間。所以判斷什麼時候只要用笨方法就可以最快解決問題,就考驗到你的智慧與經驗了!

這個 Hello 10 次的問題,表面上在問「你會用迴圈嗎?」,但更深層的考題是:「你知道什麼時候不需要用迴圈嗎?」

優秀的程式設計師不是那個把所有問題都套進「迴圈、遞迴、物件導向」的人,而是那個能在第一秒判斷:「這個問題用什麼方法解決最快、最清楚、最不容易出錯?」——有時候那個答案,真的就是直接寫 10 行。

常見問題 FAQ

印出 Hello 10 次,究竟用 for 迴圈還是直接寫 10 行比較好?

答案取決於情境,不是原則。若只需要重複 10 次、數字固定且不會變,直接寫 10 行反而更直觀、更快讀懂。若重複次數由變數決定(例如使用者輸入幾次)、或數量可能改變,迴圈才是正確選擇。程式設計裡沒有「一律要用迴圈」的鐵律——對的工具用在對的地方,才是真正的技術判斷。這也是為什麼真正的程式教育要培養「判斷力」,而不只是背語法規則。

什麼是「程式設計師最忌諱死板」?給孩子的教育意義是什麼?

死板的程式設計師看到問題就套公式,靈活的程式設計師先問「為什麼這樣解?還有沒有更好的方法?」這個差別在孩子學程式的時候就能開始培養。橘子蘋果的課堂設計故意讓孩子遇到「一個問題有多種解法」的情境——讓孩子自己比較哪個更好、為什麼,這個「比較解法」的習慣,正是未來優秀工程師和普通工程師的分野。

孩子在學 Scratch 時會遇到「迴圈」的概念嗎?什麼時候開始教?

是的,迴圈是 Scratch 的核心積木之一,從第一個階段就會出現。Scratch 的「重複 N 次」積木讓孩子直觀感受到「寫一次 = 執行 N 次」的威力。但更重要的是,橘子蘋果的老師會引導孩子思考:「你的角色為什麼要走 10 步?如果我想讓它走更多步怎麼辦?」從 Scratch 到 Python 到演算法,「什麼時候用迴圈、什麼時候不用」的判斷力會隨學習深度持續精進。

「笨方法有時最快」——這個觀念和演算法課有什麼關係?

非常有關係。演算法課的核心之一就是「時間複雜度」——分析不同解法各自要花多少時間、用多少記憶體。有時候「O(1) 的笨方法」(直接硬寫)比「O(n log n) 的聰明演算法」更快,因為聰明演算法有啟動成本。這個判斷力在橘子蘋果菁英課程第 8 階段「演算法研究與應用班」會深入訓練,也是最終走向 AI 人工智慧班(第 9 階段)的重要基礎。

面試考「印出 Hello 10 次」,真正在考什麼能力?

表面考語法,實際考思維模式。面試官想知道的是:這個人是「背了語法就套上去」,還是「理解問題本質後再選擇工具」?能回答「直接寫 10 行或許比迴圈更合理,因為……」的人,展示了批判性思考和對可讀性的重視——這些才是資深工程師的標誌,不是死背語法。台灣大型科技公司(如台積電、聯發科、Google 台灣)的程式面試,考的也是這種「為什麼這樣解」的能力。

孩子學程式,應該從學「規則」還是學「思考」開始?

兩者都需要,但優先順序很重要:先讓孩子對程式產生好奇心和成就感(做出一個作品!),再逐步建立語法規則的理解,最後才是評估不同解法的思辨能力。一開始就用規則轟炸孩子,是讓他們討厭程式的最快方法。橘子蘋果的每個課程階段都以「做出一個完整作品」為目標,讓孩子先愛上程式——這才是讓他們願意深入思考「還有沒有更好做法」的基礎。

讓孩子學會「判斷哪個方法最好」——而不只是背規則

  • 橘子蘋果引導孩子遇到真實問題、思考多種解法、選出最好的那個
  • 從 Scratch 到 Python 到演算法,每個階段都在強化這個核心能力
  • 免費試聽一堂,讓孩子感受「我做到了」的瞬間