聰明的程式設計師應該知道什麼是最值得解決的問題 - Fagner Brack

banq發表於2019-04-05

解決任何問題和解決正確的問題是有區別的。

彼得是一個可以做任何事情的程式設計師。他可以建立與其他同行一樣好的軟體,然而,程式設計師之間的差異主要是有無經驗,即使兩者都具有相同的技術技能。

怎麼可能?你不贊同這句話嗎?

彼得為一家商店建立了一個很棒的分散式線上預訂系統。使用者可以選擇可預訂的時間,即提供一種“可用時間”的查詢。

瑪麗是系統的運營商,使用彼得寫的程式碼。她負責接收線上預定的人並在店內提供服務。

但是,預訂系統有問題,雖然系統狀態會立即在伺服器中更新,但使用者必須重新整理頁面或重新輸入網站才能檢視可用時間的更新,這樣會發生重複預訂,如果有兩個人同時檢視“可用時間”螢幕,他們會同時建立相同時間的預訂。如果在忙碌的一天發生這種情況,Mary會在嘗試解決商店中這種問題時遇到麻煩。這將使客戶對服務不滿意,並會讓瑪麗感到沮喪。

彼得很聰明,想要解決它。他計劃開發一個記憶體系統,立即更新“可用時間螢幕”並向瀏覽器傳送推送訊息,以便它可以實時更新UI。即使這還不夠快,程式碼也會在完成預訂之前檢查以確認重複。如果使用者在更新速度不夠快時嘗試建立重複預訂,則系統會顯示錯誤。

瑪麗開始感到沮喪。彼得花了太多時間來實現這個目標。

2個月後,彼得實現了改進。幾天後,瑪麗注意到沒有重複預訂了。

彼得認為工作已經完成並繼續下一步。

彼得很聰明,他可以與其他人一樣很好地解決任何事情!

兩個月後,瑪麗再次打電話給彼得。預訂系統運作良好。然而,幾千名中的三個使用者抱怨說,由於重複預訂,他們在嘗試預訂時遇到了錯誤。彼得認為預訂系統在記憶體中的實時更新就足夠了,顯然不是。

由於圍繞重複預訂檢查的複雜程式碼和驗證,經過幾個小時的除錯和多天的分析,彼得無法弄清楚發生了什麼。他不知道如何重現這個問題,因為有太多可能的條件。該軟體太複雜了!因此,他決定新增額外的日誌記錄,以便在再次發生錯誤時提供更多除錯資訊。

六週後,另一位使用者設法建立了重複的預訂並繞過了驗證。

日誌沒有顯示任何有用的東西,只有每個人都知道的東西:有限數量的人能夠繞過驗證並建立重複預訂,並且無法重現問題。

彼得相信他可以解決所有問題,但他沒有。不同的是他只注意到太晚了。

十年後,我向彼得詢問了他在預訂系統中對這一集的瞭解。

這是彼得所說的:

我和我的同事Jasmin一起學習,分散式系統存在一些技術限制。諸如防止重複預訂的限制是不可能在沒有顯著成本的情況下有效地解決的。涉及多臺計算機,網路延遲等。當您大規模使用分散式預訂系統時,您需要接受兩個人嘗試兩次做同樣的事情。如果沒有發生這樣的業務需求,例如沒有重複預訂,您需要將該限制納入業務利益相關者並理解他們想要如何解決它。

例如,在操作員確認之前,伺服器可能不會向使用者傳送通知。如果運營商具有用於通知重複預訂的UI,則他們可以與兩個使用者通話並重新安排其中一個使用者。這種情況發生在他們來到商店前幾小時甚至幾天。

一旦重新安排的成本變得太大,您就可以自動化該過程。

例如,您可以建立一個檢視資料庫的系統,並列出所有重複的預訂。然後,您編寫程式碼以向能夠手動解決該複製的相關方傳送通知,甚至可能是另一個部門。

如果手動解決複製的成本太大,那麼您可以建立一個系統,自動向使用者傳送簡訊或電子郵件,說“抱歉,我們無法在上午10點為您服務,請再次預訂”。您將相當大的成本從操作員切換到使用者的一小部分不便。

如果使用者的成本是不可接受的,那麼您可以探索更復雜的驗證方法。

這樣,在每一步,您都會花時間編寫能夠解決正確問題的軟體。你不要浪費時間試圖解決不存在的問題。

彼得了解到,將一些技術限制提升到業務場景並逐步發展而不是一次性解決所有問題更有價值。

多臺計算機之間的連線就像宇宙中的通訊一樣。它是凌亂,複雜和非同步的,事件以您最不期望的方式發生。它不像完美和同步操作那樣工作,每個事件都是一個接一個地發生。

在嘗試解決每個問題之前,請關注重要的問題。如果需求需要付出太多努力,請將其作為有效的業務場景處理。一旦你有足夠的證據證明值得投入時間和精力來解決它們,那麼你將有一個很好的問題需要解決。

彼得認為他當時很聰明,但他花了很多年的經驗才明白......

一個聰明的程式設計師不是解決所有問題的人,而是瞭解值得解決的問題的人。

很自然地認為這是“產品經理”的工作,但這是你的工作。下次遇到業務問題時,請檢視邊緣情況,看看是否可以將這些問題轉化為有效的業務場景。

這是一個演算法訪談和角色分離是規範的行業。我們需要的是程式設計師,他們能夠理解他們帶來的價值,看看權衡,而不是天真地假裝他們可以解決所有問題。

您可能會在幾個月或幾年內意識到您今天編寫的程式碼是錯誤的。那時,你將學到彼得所做的一切。但是,學習你自己的錯誤意味著你需要首先提交它們。

如果你不需要,那就更好了。

如果你能和彼得一起學習,那就更好了。

相關參考:

什麼是冪等

相關文章