發布時間: 2017-06-22 09:23:04
小編和很多人一樣一開始學習的是工具系列:語法和數據結構,調試器和編輯器。但實際上如何使用這些工具來編寫好的軟件——那種可以工作的,能夠解決問題的,很長一段時間不用維護的軟件——卻從來沒有正式教給我們。學習這門手藝需要歷經長時間的挫折和痛苦。下面小編要講述一些在嘗試這門手藝之前你需要學習的東西。
軟件100%和魔法無關。你看到的每一個行為,你運行的每一個效果,它之所以發生只是因為一些代碼使之發生的緣故,而且總是能夠跟蹤那些代碼。當然,這并不意味著跟蹤總是有用的。有時候你需要知道,有事情發生和它為什么發生并不真的相關。這導致我們陷入了下面的困境:
在你深入研究的時候,你會發現軟件充滿了無窮的干擾和如同鼠穴一般錯綜復雜的走向。如果你放縱內心想像松鼠一樣囤貨的欲望,你固然可以學到很多東西,但如果你能退一步,每隔一段時間問問自己是否真的需要探索這條特殊的鼠洞,那么你能收獲更多。嘗試停留在一個小的范圍內可以幫助你達到:
軟件是極其復雜的,復雜到足以讓我們定期創建出沒有人能一次性明白的代碼。我們通過更小和更獨立的部分,通過定義各部分之間的接口來構建軟件,實現其復雜。這樣一來,如果你能在你的腦中適應更小的一部分,那工作于那個塊和相信其他部分正常的時候多少更安全一點。完全獲取哪怕更小的塊中的一個到你的頭腦中也可以是很難的,但與此同時,你可以做到一些諸如只知道你正在看的代碼行是錯誤的以及如何修復這樣的事情。那就是軟件的領域了。這非常重要,并非因為你全力以赴,而是因為如果你沒有身處那個領域,那么想要做對一切事情幾乎是不可能的。而這給我們帶來的是:
中斷使得你腦中丟棄了一些來之不易的內容,從而阻礙你完成任何事情。十分鐘的中斷當然殺不光所有:但是它需要45分鐘才能讓你的腦子回到你中斷的地方。
這可能是有關軟件工作最難向人們解釋的事情——盡管大多數領域都有這樣的事情,但沒有我們這么悲劇。發生差異的部分原因是
許多我們認為的“直覺”的確有效利用了我們大腦中的結構,已經變得高度優化來幫助我們管理我們周圍物理世界的復雜性。但是,從事電腦工作并不是我們周圍物理世界的一部分。軟件工程的力量在于那個世界的擴展是非常非常具有可塑性的-這力量是驚人的。不過,詛咒之一就是由于我們不再工作于物理世界,我們的直覺就不再有用,這讓一切都變得很難理解,除非我們做一些額外的工作來確保我們的直覺可以幫助我們。打破我們直覺的主要事情之一是:
現在的時代計算機的運行是極其快速的。即使你手機運行的時間尺度比我們的大腦快十億倍:一秒時間傳遞給我們就像過了31年,不論是給予還是獲取,僅僅一個傳遞過程。這意味著我們不能實時觀看計算機正在做什么。相反,我們不得不發明方法強制機器來匹配我們極其緩慢的步伐,通常為要求計算機等我們,或記住它正在做的一切事情且留下日志可供我們稍后讀取。當然,這些技術是如此地拖累事情的發展,以致于任何與時間相關的問題通常都會消失,或者至少看起來不同。極端的話,我們最終還是盲人摸象,一點也不知道為什么代碼之所以脫離軌道。為了避免出現這種情況,我們不得不做一些真正的事情來安排代碼向我們解釋其決定。這工作往往很難且沒有吸引力——但它至關重要,因為受到了以下定律的重大影響
在計算機運算中,墨菲定律可以重新表述為“如果你不能證明它是不可能的,那么它一定會發生,而且往往很快?!边€記得十億分之一的加速嗎?如果你一秒內做十億次操作,且每次99.99999%%可靠,那么你會發現每秒出現了100個故障。我們對于概率和機會的認知已經根深蒂固?!安惶赡堋闭嬲暮x是“在我思考的時間里可能不一定“。徹底地改變時間尺度,那么所有都將改變。即使沒有改變,然而,故障仍然是一個問題,因為
每次你寫代碼,你就會寫bug。這是一個真理。不管你多么高級,不管你多么優秀,不管什么,不管怎么樣,你無法寫出完美的代碼。這是人性的一個特點。所以你不能避免寫出bug。但是你可以明智地減少bug。
在代碼中注釋的目的不是為了解釋代碼做什么!注釋目的是為了解釋當你寫代碼的時候是如何思考的。為什么你認為代碼做到這一點很重要?其它地方發生了什么事使之變得有必要?在這種情況發生后其他人要小心什么后效?代碼有沒有按照你喜歡的方式做事情,亦或是用一種讓你擔心的方式?你為什么選擇這種方式?還有什么其他的方法可供你選擇?也許其他方法中有更好的?當時你在想什么?在寫完代碼的半年后,你可能已經不記得上述任何問題的答案,哪怕是你自己的代碼。所以,要寫下來。這是無價的,當你試圖弄清楚有些事情為什么壞了的時候。
你可以編寫測試的代碼以確保其他代碼可正常工作。這樣做出人意料的重要,但我們大多數人往往在這方面做得很糟糕,因為我們總會去做其他的事情。所以先要寫測試。這是知道確保寫測試的唯一途徑。
計算機速度很快,沒錯吧?并且正在變得越來越快。你的大腦卻沒有越來越快。所以不要挑選那些使計算機更輕松的優化工具。C語言就是一個很好的例子。它被設計得不易用來工作,它被設計成更適合實現在40年前的機器上。因此,用C語言寫代碼意味著你要將所有的時間用于思考執行機制,而不是針對于你需要解決的問題:how,而不是what或why。停止使用C語言的日子好像已經過去了十年?,F在,小編大多用的是Python,這更能幫助你去好好思考what和why,而不是how。有些純粹主義者會跳出來說“但是Python比C語言慢!”但在2016年,95%的世界已經對此不在意了。電腦是如此之快以致于可以彌補Python的低效率,并且在大部分時間中做到足夠快。像Python這樣的面向優化開發性能,而不是處理器性能的語言,才是正確的權衡。
寫代碼比解決問題更容易。代碼往往具有良好定義的輸入和輸出,一種可預測如何使用的方式,以及一個你可以說你已經完成了寫代碼這一任務的時間。問題就混亂得多,會涉及到個人和組織,并且有真實世界的約束,例如讓人們實際使用你已經建立的東西。解決問題比編寫代碼更重要。人們很容易忘記這一點,所以要謹記這一點。最后,還有一件可能比其他剩下沒有談論的東西更重要的事情:
軟件正在日新月異地變化和發展。你永遠不可能掌握所有。事實上,直到你準備放棄的那一刻,你依然沒有資格說你已經懂得夠多。不斷學習,不斷拓寬你的視野,保持睜大你的眼睛。這個世界上總有一個地方,會讓人們低下頭來專注于一個小小的領域,但在我的經驗中,有更多的地方值得人們去貪婪地學習并致力于解決碰到的任何問題。
總而言之,移動你的手指來改變世界意味著嚴肅的大腦延伸和新信息的不停涌入。但是盡管如此,它是如此致命的酷。
上一篇: 五大AI技術趨勢正徹底改變我們的工作環境