關於軟體開發你真正需要知道的幾個事情
本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
我之所以寫這篇文章是因為有一個朋友最近決定躋身軟體工程行業。我的這位朋友聰明,精力充沛,品貌兼優,又善於學習:每個人都認為這樣的人才必將有一番作為。但是,在踏出第一步時,他依然有很多東西需要學習。
我和很多人一樣一開始學習的是工具系列:語法和資料結構,偵錯程式和編輯器。但實際上如何使用這些工具來編寫好的軟體——那種可以工作的,能夠解決問題的,很長一段時間不用維護的軟體——卻從來沒有正式教給我們。學習這門手藝需要歷經長時間的挫折和痛苦。
下面我要講述一些在嘗試這門手藝之前你需要學習的東西。
關於軟體你需要記住的最重要的事情是
沒有魔法
軟體100%和魔法無關(雖然我們說它有很多創造性的手段!)。你看到的每一個行為,你執行的每一個效果,它之所以發生只是因為一些程式碼使之發生的緣故,而且總是能夠跟蹤那些程式碼。
當然,這並不意味著跟蹤總是有用的。有時候你需要知道,有事情發生和它為什麼發生並不真的相關。這導致我們陷入了下面的困境:
松鼠綜合症
在你深入研究的時候,你會發現軟體充滿了無窮級數的干擾和如同鼠穴一般錯綜複雜的走向。如果你放縱內心想像松鼠一樣囤貨的慾望,你固然可以學到很多東西,但如果你能退一步,每隔一段時間問問自己是否真的需要探索這條特殊的鼠洞,那麼你能收穫更多。嘗試停留在一個小的範圍內可以幫助你達到
領域
軟體是極其複雜的,複雜到足以讓我們定期建立出沒有人能一次性明白的程式碼。我們通過更小和更獨立的部分,通過定義各部分之間的介面來構建軟體,實現其複雜。這樣一來,如果你能在你的腦中適應更小的一部分,那工作於那個塊和相信其他部分正常的時候多少更安全一點(至少當一切順利的時候)。
完全獲取哪怕更小的塊中的一個到你的頭腦中也可以是很難的,但與此同時,你可以做到一些諸如只知道你正在看的程式碼行是錯誤的,以及如何修復這樣的事情。那就是軟體的領域了。這非常重要,並非因為你全力以赴,而是因為如果你沒有身處那個領域,那麼想要做對一切事情幾乎是不可能的。而這給我們帶來的是
中斷
中斷使得你腦中丟棄了一些來之不易的內容,從而阻礙你完成任何事情。十分鐘的中斷當然殺不光所有:但是它需要45分鐘才能讓你的腦子回到你中斷的地方。
這可能是有關軟體工作最難向人們解釋的事情——儘管大多數領域都有這樣的事情,但沒有我們這麼悲劇。發生差異的部分原因是
直覺失敗
許多我們認為的“直覺”的確有效利用了我們大腦中的結構——歷經超過百萬年進化,已經變得高度優化——來幫助我們管理我們周圍物理世界的複雜性。但是,從事電腦工作並不是我們周圍物理世界的一部分:我的膝上型電腦建立了她自己的世界延伸,而我必須去這個延伸的世界工作。
軟體工程的力量在於那個世界的擴充套件是非常非常具有可塑性的——這力量是驚人的。不過,詛咒之一就是由於我們不再工作於物理世界,我們的直覺就不再有用,這讓一切都變得很難理解,除非我們做一些額外的工作來確保我們的直覺可以幫助我們。
打破我們直覺的主要事情之一是
時間是不可思議的
現在的時代計算機的執行是極其快速的。即使你手機執行的時間尺度比我們的大腦快十億倍:一秒時間傳遞給我們就像過了31年,不論是給予還是獲取,僅僅一個傳遞過程。這意味著我們不能實時觀看計算機正在做什麼。
相反,我們不得不發明方法強制機器來匹配我們極其緩慢的步伐,通常為要求計算機等我們,或記住它正在做的一切事情且留下日誌可供我們稍後讀取。當然,這些技術是如此地拖累事情的發展,以致於任何與時間相關的問題通常都會消失,或者至少看起來不同。
極端的話,我們最終還是盲人摸象,一點也不知道為什麼程式碼之所以脫離軌道。為了避免出現這種情況,我們不得不做一些真正的事情來安排程式碼向我們解釋其決定。這工作往往很難且沒有吸引力——但它至關重要,因為受到了以下定律的重大影響
墨菲定律
在計算機運算中,墨菲定律可以重新表述為“如果你不能證明它是不可能的,那麼它一定會發生——而且往往很快。”還記得十億分之一的加速嗎?如果你一秒內做十億次操作,且每次99.99999%%可靠,那麼你會發現每秒出現了100個故障。
我們對於概率和機會的認知已經根深蒂固:“不太可能”真正的含義是“在我思考的時間裡可能不一定“。徹底地改變時間尺度,那麼所有都將改變。
即使沒有改變,然而,故障仍然是一個問題,因為
原罪
每次你寫程式碼,你就會寫bug。這是一個真理。不管你多麼高階,不管你多麼優秀,不管什麼,不管怎麼樣,你無法寫出完美的程式碼。這是人性的一個特點。
所以你不能避免寫出bug。
但是你可以明智地減少bug:
1.註釋
在程式碼中註釋的目的不是為了解釋程式碼做什麼——可以讀取程式碼!註釋目的是為了解釋當你寫程式碼的時候是如何思考的。
為什麼你認為程式碼做到這一點很重要?其它地方發生了什麼事使之變得有必要?在這種情況發生後其他人要小心什麼後效?程式碼有沒有按照你喜歡的方式做事情,亦或是用一種讓你擔心的方式?你為什麼選擇這種方式?還有什麼其他的方法可供你選擇?也許其他方法中有更好的?當時你在想什麼?
在寫完程式碼的半年後,你可能已經不記得上述任何問題的答案,哪怕是你自己的程式碼。所以,要寫下來。這是無價的,當你試圖弄清楚有些事情為什麼壞了的時候。
2.測試優先
你可以編寫測試的程式碼以確保其他程式碼可正常工作。這樣做出人意料的重要,但我們大多數人往往在這方面做得很糟糕,因為我們總會去做其他的事情。所以先要寫測試。這是知道確保寫測試的唯一途徑。
3.生活更輕鬆
計算機速度很快,沒錯吧?並且正在變得越來越快。你的大腦卻沒有越來越快。所以不要挑選那些使計算機更輕鬆的優化工具——挑選為人類而製造的工具。
C語言就是一個很好的例子。它被設計得不易用來工作,它被設計成更適合實現在40年前的機器上。因此,用C語言寫程式碼意味著你要將所有的時間用於思考執行機制,而不是針對於你需要解決的問題:how,而不是what或why。停止使用C語言的日子好像已經過去了10年。這些天,我大多用的是Python,這更能幫助你去好好思考what和why,而不是how。
有些純粹主義者會跳出來說“但是Python比C語言慢!”——他們一點也沒錯——但在2016年,95%的世界已經對此不在意了。電腦是如此之快以致於可以彌補Python的低效率,並且在大部分時間中做到足夠快。像Python這樣的面向優化開發效能,而不是處理器效能的語言,才是正確的權衡。
4.解決方案而不是寫程式碼
寫程式碼比解決問題更容易。
程式碼往往具有良好定義的輸入和輸出,一種可預測如何使用的方式,以及一個你可以說你已經完成了寫程式碼這一任務的時間。問題就混亂得多,會涉及到個人和組織,並且有真實世界的約束,例如讓人們實際使用你已經建立的東西。
解決問題比編寫程式碼更重要。人們很容易忘記這一點,所以要謹記這一點。
最後,還有一件可能比其他剩下沒有談論的東西更重要的事情:
5.不要放棄
軟體正在日新月異地變化和發展。你永遠不可能掌握所有。事實上,直到你準備放棄的那一刻,你依然沒有資格說你已經懂得夠多。不斷學習,不斷拓寬你的視野,保持睜大你的眼睛。
這個世界上總有一個地方,會讓人們低下頭來專注於一個小小的領域,但在我的經驗中,有更多的地方值得人們去貪婪地學習並致力於解決碰到的任何問題。
總而言之,移動你的手指來改變世界意味著嚴肅的大腦延伸和新資訊的不停湧入。但是儘管如此,它是如此致命的酷。
歡迎加入!
譯文連結:http://www.codeceo.com/article/what-you-need-know-develop.html
英文原文:What You Actually Need to Know About Software Development
翻譯作者:碼農網 – 小峰
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- 關於 Git 你需要知道的一些事情Git
- 關於MongoDB你需要知道的幾件事MongoDB
- [譯] 關於 `ExpressionChangedAfterItHasBeenCheckedError` 錯誤你所需要知道的事情ExpressError
- 關於 jwt 你應該知道的事情JWT
- 7個關於"this"面試題,你知道幾個?面試題
- 關於軟體開發,你老闆不知道的7件事
- 軟體測試的五個目的,你知道幾個?
- 關於字元編碼你應該知道的事情字元
- 關於單例模式,你需要知道的幾種寫法單例模式
- 【譯】關於JavaScript 陣列你應該知道的事情JavaScript陣列
- 關於跨域你需要知道的跨域
- 49種軟體測試方法,你知道幾個?
- 你應該知道的10件關於Java 6的事情Java
- 關於CSS Transition,你需要知道的事CSS
- 【譯】關於 JavaScript 的原型你應該知道的所有事情JavaScript原型
- 你應該知道的10件關於Java 6的事情(轉)Java
- 關於面試你不知道的幾點面試
- 作為一個軟體測試新手,你知道軟體測試的幾個方向嗎?
- 關於網校系統原始碼,你不知道的事情原始碼
- 關於redis,你需要了解的幾點!Redis
- 關於人工智慧,必須知道這幾事情,歐能智慧人工智慧
- 破除幾個有關軟體開發的錯誤觀念
- 總結49種軟體測試方法,你知道幾個?
- 關於Android模組化你需要知道的Android
- 關於字元編碼,你所需要知道的字元
- 關於Mysql事務,你必須知道的幾個知識點!MySql
- 作為嵌入式/軟體開發工程師你需要知道的東西工程師
- React 效能最佳化,你需要知道的幾個點React
- 使用Mac便箋?你需要知道的幾個快捷鍵Mac
- 幾你需要熟練掌握的辦公軟體
- 能讓一個軟體公司倒閉的軟體開發方法,你幹過幾件?
- [譯] 關於 Angular 動態元件你需要知道的Angular元件
- 關於webpack優化,你需要知道的事(上篇)Web優化
- 關於C++14:你需要知道的新特性C++
- 你需要知道的小程式開發技巧
- 你需要知道的關於 Go 包的一切Go
- 關於背單詞軟體,你不知道的驚人真相
- 關於多個開發中心開發同一軟體的配置管理