了解如何用最好的方式表達你的想法和建議
你好 👋 是因為你提出了讓 Exercism 變得更好的想法,有人因此把你導到這篇文章嗎? 在我們的團隊花時間研究你的想法之前,他們希望你先讀讀這篇,想想這個想法以前是不是就有人想過,又可能藏著哪些陷阱。 在建議裡補上這些考量和可能的陷阱,並想一想這個想法為什麼還沒被實現,通常就能得到更快、更正面的回應。
切斯特頓的籬笆這個概念,來自作家 G.K. 切斯特頓在 1929 年出版的《The Thing》裡的一句話。 因為約翰·F·甘迺迪引用過,它才變得廣為人知。 以下是原文:
在這種情況下,總存在著某種制度或法律;為了簡單起見,我們就說那是一道橫跨道路的籬笆或柵門吧。 比較新派的改革者興沖沖地走上前說:「我看不出這東西有什麼用處,我們把它拆了吧。」 比較聰明的改革者最好這麼回答:「既然你看不出它的用處,我當然不會讓你把它拆掉。回去想一想。等你哪天回來告訴我,你看見它的用處了,我也許就准你把它毀掉。」
切斯特頓的籬笆想說的是:如果你不明白某樣東西為什麼存在,那你大概也不明白它為什麼該被移除。 同樣地,如果你不明白某樣東西為什麼不存在,那你大概也不明白它為什麼被略去。
有個簡單的原則可以記住:「在你搞清楚一道籬笆當初為什麼被立起來之前,先別拆了它。」
在 Exercism,我們很幸運,一直有許多人加入社群,分享他們的想法和點子。 這些想法裡有很多是新的、有創意的、令人興奮的,也幫我們突破了思考的盲點。 所以如果你有想法或建議,我們都很歡迎喔!
不過,更常見的情況是,大家提出的想法早就被討論過很多次了。 要回應這些想法,重新處理或重新解釋我們的決定,對團隊來說非常耗神。 這篇文章的目的,就是希望能守住大家的時間和精力。
Exercism 是由數千位非常有才華的人共同設計、開發和打造出來的。 它是一個處處經過刻意設計的產品:有些東西存在,是因為它們被設計成該存在;有些東西經常被略去,也是因為它們被設計成該被略去。 Exercism 裡幾乎每一件事,都被反覆辯論、討論和重新設計過很多次。
所以在提出想法之前,請先問問自己:我們是不是早就想過了?以及我們為什麼可能跟你建議的做法不一樣? 還有請記住,你的想法看起來越理所當然,它就越可能已經被討論、辯論過很多次。所以提出來的時候,也請一併說明可能的注意事項和陷阱。 如果你直覺想說「為什麼不直接⋯⋯」,那它幾乎肯定屬於這一類。
永遠不要害怕發文,但請先仔細想清楚!
一個常見的困擾是,學生把沒通過測試的程式碼提交給導師。 同樣常見的建議是:「為什麼不直接在學生提交程式碼之前,用 CLI 自動跑一遍測試?」 這聽起來是個很棒的想法:CLI 只要呼叫一個指令來跑測試,如果測試沒過,就不讓學生提交就好了。
那麼首先,「只要呼叫一個指令來跑測試」到底是什麼意思? 意思是要為 Exercism 上的 52 種語言各寫一支指令碼,能夠執行測試並檢查結果。 這要花點功夫,但還做得到。
但這也意味著,這支指令碼得能在 Windows、MacOSX 和 Linux 上執行,而且是任何可能的版本和設定組合。這工作量很大,甚至可以說沒有上限。
「為什麼非得涵蓋_每一種_設定?」你可能會問。
因為除非對方能執行這支指令碼,否則你就等於是在擋住他使用 Exercism。
這也表示它絕對不能出錯。
如果指令碼因為某些原因跑不起來,學生就完全被擋住了。
這些52*3*n支指令碼裡只要有其中一支有 bug,學生在那個作業系統上就再也沒辦法使用這個軌道。
這要怎麼測試?
根本測不了。
但你可能會說,只要加一個 --skip-tests 旗標就好了。
這是個好建議,但這又回到一開始的問題:只要願意,大家隨時可以選擇略過測試。
只是現在情況變成:沒通過的測試被提交的機率稍微低了一點,導師對這種事的預期也跟著降低,所以當測試真的沒通過時,反而更突兀、更令人困惑。
「但一般來說,大家不會這樣做吧。」你可能會反駁。沒錯,對某些跑一次測試只要 0.5 秒的語言來說是這樣。 但對於跑一次測試要花 20 秒的語言,提交前還得多等 20 秒,對學生來說非常折磨,於是跳過最後的測試就會變成常態。
不管這場討論最後結論如何,很明顯,這裡牽涉的複雜度遠比一開始看起來的多。有技術上的挑戰要考慮,有工作流的問題要想清楚,還得意識到各個軌道差異之大,以至於對某個軌道來說又快又簡單的事,換到另一個軌道卻很痛苦。
所以,與其提出「為什麼不在提交前先跑一遍測試」這種建議,不如先問一個問題:「為什麼大家會貼出沒通過測試的解法?」 然後事情就變得有趣了。 一般來說,答案是他們卡住了,或是搞混了。 而他們需要幫助。 這表示,提交沒通過的測試這件事,對導師來說是很重要的判斷依據,代表這位學生_需要幫助_。 沒錯,這很煩人,因為導師沒辦法立刻知道程式碼到底「正確」不正確。不過,導師可以下載程式碼並執行來驗證(多數導師在處理不簡單的解法時都會這麼做),然後百分之百確定它到底正不正確。 而卡住、需要幫助的學生,最後不會越卡越深、越需要越多幫助,反而能更快遇到看得出來問題、能給出修正建議的導師。
備註:我們其實正透過在伺服器端執行測試來解決這個問題,這是個龐大又昂貴的工程,但為了讓學生有更好的體驗,而且關鍵是能省下導師的時間和精力,這份投入很值得。
三件事: