本篇博客是《軟件開發(fā)者成長(zhǎng)完全攻略》系列翻譯文章第 2 章。
原文地址:The Technical Skills You Need to Have as a Software Developer
我更傾向于幫助程序員學(xué)習(xí)“軟技能”而非開發(fā)技術(shù) —— 事實(shí)上,我寫過(guò)一整本關(guān)于軟技能的書 —— 但是毫無(wú)疑問(wèn)的,對(duì)于開發(fā)者來(lái)說(shuō),技術(shù)很重要!
我的意思是,如果你沒(méi)有掌握代碼和開發(fā)技術(shù),所有的軟技能對(duì)你來(lái)說(shuō)都不會(huì)有實(shí)質(zhì)上的幫助?;蛟S你可以成為一個(gè)好的管理者或者教練,但不會(huì)是一個(gè)好的軟件開發(fā)者。
既然你正在閱讀這本書的這一小節(jié),我可以假定你就是想成為軟件開發(fā)者 —— 或者是優(yōu)秀的軟件開發(fā)者 —— 那就讓我們討論下你所需要掌握的技術(shù)。
值得學(xué)習(xí)的技術(shù)
讓我事先聲明,這一章的內(nèi)容可能會(huì)嚇退很多初學(xué)者,因?yàn)樗麄儠?huì)覺(jué)得到要學(xué)習(xí)的內(nèi)容太多了,甚至他們會(huì)感覺(jué)無(wú)從下手。
我會(huì)在這里試著把那些能讓你在追求軟件開發(fā)的路上受益最多,最值得學(xué)習(xí)的技術(shù)進(jìn)行分解。本章不是為了列舉你成為開發(fā)都可能會(huì)需要用到的所有技術(shù),而是要列出那些最核心、最有價(jià)值的技術(shù),并對(duì)他們進(jìn)行一個(gè)概述。
不要慌。在這本書的另一個(gè)小節(jié)“軟件開發(fā)所要掌握的技能”中,我會(huì)為下面列舉的幾乎所有技術(shù)各開一章進(jìn)行詳細(xì)的講解。
我同時(shí)還將這本書濃縮到一個(gè)有用的工具 —— 軟件開發(fā)技術(shù)評(píng)估 —— 中,你可以在這里進(jìn)行下載。
所以,話不多說(shuō),以下就是針對(duì)我覺(jué)得最重要的技術(shù)的概述。
一門編程語(yǔ)言
我覺(jué)得每個(gè)人都是從這一點(diǎn)開始的。
如果不掌握一門編程語(yǔ)言,是不可能真正成為一個(gè)程序員的 —— 你明白我的意思吧,嗯?我會(huì)在“我該學(xué)習(xí)哪門編程語(yǔ)言”一章中詳細(xì)講述如何選擇編程語(yǔ)言,所以在這里先不要有壓力。
在這里我先快速提一下,選擇哪一門編程語(yǔ)言可能沒(méi)有如你想像中的那么重要。相反地,我會(huì)推薦你先選一門進(jìn)行學(xué)習(xí),而非試著去學(xué)所有世界上出現(xiàn)過(guò)的所有語(yǔ)言。
很多初學(xué)者甚至還沒(méi)找到一份軟件開發(fā)者的工作,就讓自己嘗試著去學(xué)習(xí)多門不同的語(yǔ)言。我覺(jué)得掌握多于一門的編程語(yǔ)言是必要的,但是我反對(duì)一開始就學(xué)習(xí)不同的語(yǔ)言,因?yàn)檫@樣會(huì)很容易導(dǎo)致困惑,同時(shí)這會(huì)讓你從其他真正需要學(xué)習(xí)的技術(shù)中分散精力。
我的建議是深入掌握一門編程語(yǔ)言,直到你有信心使用這門語(yǔ)言來(lái)編寫任何的代碼。
還記得我們?cè)谏弦徽掠懻撨^(guò)的,在決定你想成為哪種類型的開發(fā)者時(shí),目標(biāo)要越明確越好嗎?在選擇編程語(yǔ)言時(shí),也是一樣的道理。
如何組織代碼
在學(xué)習(xí)完第一門編程語(yǔ)言后 —— 或者在學(xué)習(xí)過(guò)程中 —— 下一件需要學(xué)習(xí)的事,就是如何合理地組織你的代碼。
對(duì)于這項(xiàng)極有價(jià)值的技能,我在第一章的時(shí)候已經(jīng)推薦過(guò)一個(gè)非常好的資料:Steven McConnell 的 《代碼大全》。
我所說(shuō)的組織代碼是什么意思呢?
我指的是如何寫出清晰易懂的代碼,這些代碼不需要大量的注釋,因?yàn)樗鼈兌际亲越忉尩摹:芏嚅_發(fā)者終其職業(yè)生涯而沒(méi)有掌握這一技能,這實(shí)在是相當(dāng)不幸,因?yàn)槲揖褪峭ㄟ^(guò)這一技能 —— 和其它的很多技術(shù) —— 來(lái)評(píng)判一個(gè)開發(fā)者的技術(shù)能力的。
寫出好的代碼表明了一個(gè)人在僅僅把需求完成之外,還有他自己的追求。對(duì)代碼進(jìn)行組織確實(shí)是軟件開發(fā)中屬于藝術(shù)的一部分,但是這也是相當(dāng)有難度的,因?yàn)槟愫湍愕耐露夹枰谀愕拇a上進(jìn)行工作,并且會(huì)花很多時(shí)間在維護(hù)這份代碼上,而非寫新的代碼。
我不會(huì)在本書中討論關(guān)于如何寫清晰的代碼 —— 就像我說(shuō)的 —— 我已經(jīng)給你推薦過(guò)一份極好的資料了,但是你應(yīng)該從一開始就學(xué)習(xí)如何寫好的、清晰的代碼,而不是等到后面才來(lái)學(xué)習(xí)它。
我可以保證,就算你是個(gè)初學(xué)者,但是只要你能寫出優(yōu)雅、整潔、干凈、易懂并且能自解釋的代碼,在面試的時(shí)候,人家也會(huì)把你當(dāng)成一個(gè)有經(jīng)驗(yàn)的開發(fā)者。
這個(gè)技巧是必須掌握的,因?yàn)槟銓⒉粌H僅把開發(fā)當(dāng)成一份工作,而是將它將成自己的事業(yè):這是工匠精神的體現(xiàn)。
面向?qū)ο笤O(shè)計(jì)
這一條是有爭(zhēng)議的,特別是當(dāng)你學(xué)習(xí)的不是一門面向?qū)ο螅∣O)的編程語(yǔ)言時(shí),但是軟件開發(fā)中主要還是以面向?qū)ο笤O(shè)計(jì)為主,所以你需要確保自己掌握它。
面向?qū)ο笤O(shè)計(jì)可以將復(fù)雜的程序設(shè)計(jì)分解為獨(dú)立的類和對(duì)象(類的實(shí)例),這種方法可以對(duì)功能進(jìn)行封裝,并且每個(gè)類和對(duì)象都有特定的角色和功能。
在軟件開發(fā)中,我們一直在做的就是管理復(fù)雜性。使用對(duì)象的方式進(jìn)行思考可以幫助我們達(dá)到這一目的,因?yàn)樗梢宰屛覀冇靡欢严嗷リP(guān)聯(lián)的組件來(lái)定義和設(shè)計(jì)一個(gè)復(fù)雜的系統(tǒng),而不用直接操作整個(gè)復(fù)雜的系統(tǒng)。
現(xiàn)在有很多的函數(shù)式編程語(yǔ)言了,但是你在軟件開發(fā)過(guò)程中碰到的大多數(shù)語(yǔ)言和模式都還是嚴(yán)重地(如果不是全部的話)受到了面向?qū)ο笤O(shè)計(jì)與分析的影響。
你應(yīng)該很好地掌握類、不同類型的繼承 —— 包括何時(shí)使用它們 —— 以及類似多態(tài)和封裝這些術(shù)語(yǔ)的含義。
算法和數(shù)據(jù)結(jié)構(gòu)
如果你是在傳統(tǒng)的大學(xué)或者學(xué)院學(xué)習(xí)計(jì)算機(jī)科學(xué)專業(yè)的話,算法和數(shù)據(jù)結(jié)構(gòu)會(huì)在你將要(或者學(xué)過(guò))的專業(yè)中占有很大的一部分。
算法是解決不同計(jì)算機(jī)科學(xué)/編程問(wèn)題的通用解決方法。
舉例來(lái)說(shuō),有很多算法可以用來(lái)對(duì)一系列連續(xù)的數(shù)據(jù)進(jìn)行排序。這些算法中的每一種都有不同的特點(diǎn),比如排序速度、內(nèi)存大小要求、以及適合哪種類型的數(shù)據(jù)集。
在計(jì)算機(jī)科學(xué)中已經(jīng)有很多這種現(xiàn)成的算法了,掌握如何寫出這些現(xiàn)成算法的變體以解決在實(shí)際編程過(guò)程中碰到的困難問(wèn)題也是相當(dāng)重要的。
通常,一個(gè)算法厲害的開發(fā)者,可以在一個(gè)小時(shí)內(nèi)解決其它程序員幾天才能解決問(wèn)題。除非你熟悉各種算法,并很好地掌握他們,否則你可能對(duì)一些現(xiàn)成的、優(yōu)雅的解決方法全然不知。單從這個(gè)原因來(lái)講,我就認(rèn)為這是一門有價(jià)值的、值得學(xué)習(xí)的技術(shù)。
數(shù)據(jù)結(jié)構(gòu)也是類似的,它算法相輔相成。
有一些數(shù)據(jù)結(jié)構(gòu)是所有軟件開發(fā)者都必須掌握的:
- 數(shù)據(jù)和向量(vector)
- 鏈表
- 棧
- 隊(duì)列
- 樹
- 散列表
- 集合
對(duì)數(shù)據(jù)結(jié)構(gòu)和算法的掌握,可以幫助我們輕松并且優(yōu)雅地解決很多困難的編程問(wèn)題。
在我剛開始編程的時(shí)候,我的數(shù)據(jù)結(jié)構(gòu)和算法都非常爛,因?yàn)槲一旧鲜亲詫W(xué)出身的。
直到我在一個(gè)叫 TopCoder 的網(wǎng)站上進(jìn)行競(jìng)賽的時(shí)候我才真正認(rèn)識(shí)到它們的價(jià)值,掌握數(shù)據(jù)結(jié)構(gòu)和算法并熟練地操作它們,可以給你帶來(lái)很大的競(jìng)爭(zhēng)優(yōu)勢(shì)。
很快我就明顯地感覺(jué)到這些技術(shù)在真實(shí)的編程世界中有很大的用處,因?yàn)橐恍┪抑盁o(wú)法解決的問(wèn)題,現(xiàn)在可以很輕松 —— 并且很有趣 —— 地解決了。
事實(shí)上,我覺(jué)得這是所有軟件開發(fā)所有領(lǐng)域中最有趣的部分之一。當(dāng)你使用數(shù)據(jù)結(jié)構(gòu)和算法對(duì)一個(gè)困難的編程問(wèn)題提出簡(jiǎn)潔、優(yōu)雅的解決方案時(shí),你的成就感會(huì)爆棚的。
最好的資料(至少在本書寫作時(shí))是 Gayle Laakmann McDowell 的一本極好的書 《Cracking the Coding Interview》(中文版:《程序員面試金典》)。
在這本書中,她講解了所有你需要掌握的算法和數(shù)據(jù)結(jié)構(gòu)。
學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法很費(fèi)勁,但是完全值得,這是一項(xiàng)可以讓你在同事中脫穎而出的技能。大多數(shù)軟件開發(fā)者在這方面知識(shí)都少得可憐。
同時(shí),如果你想通過(guò)類似微軟或者 Google 這種大公司的面試,這項(xiàng)技能也必不可少。
開發(fā)平臺(tái)及其相關(guān)技術(shù)
你應(yīng)該熟練掌握至少一種開發(fā)平臺(tái)及其相關(guān)的技術(shù),或者與這個(gè)平臺(tái)有關(guān)的框架。
我所指的平臺(tái)是什么意思?
唔,通常來(lái)說(shuō),它代表的是操作系統(tǒng),不過(guò)它也可以應(yīng)用于某種類似操作系統(tǒng)的抽象上。
舉個(gè)例子,你可能是使用 Mac 或 Windows 進(jìn)行開發(fā)的 Mac 或 Windows 開發(fā)者,同時(shí)你也可能是個(gè)專注于某個(gè) web 開發(fā)平臺(tái)的 web 開發(fā)者。
我不想針對(duì)開發(fā)平臺(tái)的確切意思展開討論 —— 不同的人會(huì)有不同的意見 —— 但是針對(duì)這里要討論的,我將開發(fā)平臺(tái)定義為一個(gè)你用來(lái)進(jìn)行開發(fā)工作的具體環(huán)境,它有自己的生態(tài)系統(tǒng)和特殊性。
再次地,我想說(shuō)選擇哪種開發(fā)平臺(tái)并不重要,重新的是你要選擇一個(gè)。
公司通常會(huì)聘用使用特定平臺(tái)或技術(shù)進(jìn)行開發(fā)的開發(fā)者。
假如你是一個(gè) iOS 開發(fā)者,你要是可以熟練地在這個(gè)特定的平臺(tái)上進(jìn)行開發(fā),你就會(huì)更容易地獲得一份工作。
掌握開發(fā)平臺(tái)不僅需要對(duì)平臺(tái)本身的熟悉,同時(shí)也要熟練使用該平臺(tái)相關(guān)的開發(fā)工具,通用模式及常用的框架。
你可能會(huì)覺(jué)得編程語(yǔ)言的選擇限定了你對(duì)平臺(tái)的選擇,但是通常情況下并不是這樣的。
以 C# 來(lái)舉例。你可以使用 C# 來(lái)為 Windows,Mac,iOS,Android,Linux 甚至是嵌入式系統(tǒng)進(jìn)行開發(fā)。
所以,在你選擇編程語(yǔ)言的同時(shí),也要選擇一個(gè)開發(fā)平臺(tái)。
框架和技術(shù)棧
除了學(xué)習(xí)一門具體的編程語(yǔ)言和開發(fā)平臺(tái)工具,我也強(qiáng)烈推薦你學(xué)習(xí)某種框架,當(dāng)然更好的是掌握與這種框架相關(guān)的技術(shù)棧。
什么是框架?
什么是技術(shù)棧?
簡(jiǎn)單來(lái)說(shuō),框架就是幫助我們?cè)谀硞€(gè)平臺(tái),或者跨平臺(tái)進(jìn)行開發(fā)的類庫(kù)集合。通常情況下,它可以使我們更加簡(jiǎn)單地完成該平臺(tái)上的常見編程任務(wù)。
回到 C# 的例子中來(lái),大多數(shù)的 C# 開發(fā)者使用 .NET 框架進(jìn)行 C# 應(yīng)用的開發(fā)。.NET 框架由很多類庫(kù)和類組成,它們可以讓開發(fā)者在更高級(jí)的抽象上進(jìn)行開發(fā),避免每次完成某些任務(wù)的時(shí)候都需要重新發(fā)明輪子。
舉例來(lái)說(shuō),.NET 框架中包含了操作圖片功能的代碼。想要從零開始去寫這些代碼是很困難的,所以對(duì)于想進(jìn)行某種圖片操作的 C# 開發(fā)者來(lái)說(shuō),使用框架就有了巨大的好處。
技術(shù)棧稍有不同。技術(shù)棧是指我們開發(fā)某個(gè)完整應(yīng)用時(shí),經(jīng)常會(huì)一起使用的一系列技術(shù),通常包括框架。
舉例來(lái)說(shuō),有一種常用的技術(shù)棧稱為 MEAN 棧。這代表了 MongoDB,Express.js,AngularJS 和 Node.js.
MongoDB 是數(shù)據(jù)庫(kù)技術(shù)。
Express.js 是用于開發(fā) web 應(yīng)用程序的 Node.js 框架。
AngularJS 是一個(gè)前端 JavaScript 框架,用于開發(fā) web 應(yīng)用程序的用戶界面。
最好,Node.js 是一個(gè)使用 JavaScript 來(lái)開發(fā) web 應(yīng)用程序的運(yùn)行時(shí)環(huán)境。
你并不需要完全理解這些詞的意思 —— 除非你就是想成為一個(gè) MEAN 開發(fā)者 —— 更重要的是你要明白,如果你掌握了所有的這些技術(shù)和框架,你就可以開發(fā)出一個(gè)完整的 web 應(yīng)用。
技術(shù)棧讓開發(fā)應(yīng)用變得更簡(jiǎn)單,因?yàn)樗鼈優(yōu)槟闾峁┝舜蠖鄶?shù)開發(fā)者用于開發(fā)應(yīng)用的通用范式,所以這些知識(shí)可以很容易地進(jìn)行分享,你確定這一系列的技術(shù)可以很好地一起工作,因?yàn)檫@已經(jīng)被其它開發(fā)者證明過(guò)了。
學(xué)習(xí)某種技術(shù)棧相當(dāng)有價(jià)值,因?yàn)檫@代表你擁有了開發(fā)一個(gè)完整應(yīng)用所需的全部技術(shù)。很多公司都有使用某種技術(shù)棧開發(fā)的應(yīng)用,這種公司更愿意尋找熟悉使用這種技術(shù)棧的開發(fā)者,因?yàn)檫@樣他們就能更快地上手進(jìn)行開發(fā)了。
基礎(chǔ)的數(shù)據(jù)庫(kù)知識(shí)
數(shù)據(jù)庫(kù)的整體景觀在過(guò)去幾年中發(fā)生了很大的變化,但是我沒(méi)有看到它們會(huì)很快消失的跡象,因此我覺(jué)得你至少應(yīng)該掌握一點(diǎn)數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí),你覺(jué)得呢?
在寫作本書的時(shí)候,有兩種主流的數(shù)據(jù)庫(kù)技術(shù):關(guān)聯(lián)型數(shù)據(jù)庫(kù)及文檔型數(shù)據(jù)庫(kù)。我認(rèn)為一個(gè)開發(fā)者至少應(yīng)該熟悉關(guān)系型數(shù)據(jù)庫(kù),然后對(duì)文檔型數(shù)據(jù)庫(kù)有一些了解。
在軟件開發(fā)中,數(shù)據(jù)庫(kù)經(jīng)常被用于為應(yīng)用存儲(chǔ)數(shù)據(jù)。
有一些團(tuán)隊(duì)會(huì)有專門的數(shù)據(jù)庫(kù)開發(fā)人員或者數(shù)據(jù)庫(kù)管理人員(DBA),但這并不能成為你不去學(xué)習(xí)一些數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)的理由。
最低的限度,你應(yīng)該掌握如下內(nèi)容:
- 數(shù)據(jù)庫(kù)是如何工作的
- 如何進(jìn)行基礎(chǔ)的數(shù)據(jù)查詢
- 如何插入,更新以及刪除數(shù)據(jù)
- 如何對(duì)數(shù)據(jù)表進(jìn)行連接
除此之外,你可能還需要知道如何在你的開發(fā)平臺(tái)及框架中使用代碼對(duì)數(shù)據(jù)進(jìn)行查詢和存儲(chǔ)。大多數(shù)的開發(fā)者都應(yīng)該可以使用代碼與數(shù)據(jù)庫(kù)進(jìn)行交互。
源碼控制
源碼控制也是軟件開發(fā)項(xiàng)目中必不可缺的一部分。
在沒(méi)有源碼控制的年代,我們只能通過(guò)網(wǎng)絡(luò)共享所有的項(xiàng)目文件,或者通過(guò) U 盤來(lái)分享不同版本的項(xiàng)目。
我必須很羞愧地承認(rèn),在我的開發(fā)生涯中,我不止一次使用這種方法管理項(xiàng)目。但是,那時(shí)我還太年輕,太傻。你大可不必也走這樣的彎路。
今天的所有專業(yè)程序員都至少應(yīng)該掌握如何使用源碼控制對(duì)代碼進(jìn)行簽入,簽出以及對(duì)代碼的變動(dòng)進(jìn)行合并。
在最基礎(chǔ)的層次上,源碼控制就是用來(lái)幫助你保存一個(gè)軟件項(xiàng)目中不同文件的改動(dòng)歷史的。它同時(shí)也允許多個(gè)開發(fā)者同時(shí)對(duì)一個(gè)項(xiàng)目進(jìn)行開發(fā),并將他們做的改動(dòng)進(jìn)行合并。
我不會(huì)在這里深入講解細(xì)節(jié),但是你至少應(yīng)該很好地掌握一個(gè)源碼管理系統(tǒng)的使用,同時(shí)你應(yīng)該對(duì)大多數(shù)源碼控制的基礎(chǔ)概念了然于胸。
在今天的軟件開發(fā)世界上,幾乎所有的專業(yè)開發(fā)團(tuán)隊(duì)都會(huì)使用某種的源碼控制。
構(gòu)建與部署
大多數(shù)的的軟件項(xiàng)目都有某種的自動(dòng)化構(gòu)建及部署系統(tǒng)。
現(xiàn)在已經(jīng)有很多不同的軟件可以幫助團(tuán)隊(duì)對(duì)這些在過(guò)去需要手動(dòng)完成的工作進(jìn)行自動(dòng)化,但是有一些團(tuán)隊(duì)還是依然使用手動(dòng)方法。
你問(wèn)我什么是構(gòu)建和部署?
好問(wèn)題。你現(xiàn)在應(yīng)該知道如何將你所寫的代碼簽入到源碼控制系統(tǒng)中吧?
通常情況下,在代碼簽入到源碼控制系統(tǒng)中時(shí)通過(guò)某種方式確保它們能正確運(yùn)行,通常是一個(gè)好主意。
而這就是構(gòu)建系統(tǒng)存在的意義。在最低的限度上,構(gòu)建系統(tǒng)可以對(duì)所有代碼進(jìn)行編譯,確保當(dāng)中沒(méi)有存在編譯錯(cuò)誤。而一個(gè)完善的構(gòu)建系統(tǒng)同時(shí)會(huì)運(yùn)行單元測(cè)試及用戶測(cè)試,運(yùn)行代碼質(zhì)量檢查,還會(huì)為代碼庫(kù)提供某些當(dāng)前狀態(tài)的報(bào)告。
部署系統(tǒng)則是負(fù)責(zé)將代碼部署到生產(chǎn)機(jī)器上,或者可能是某些類型的測(cè)試環(huán)境上。
你不需要是這些技術(shù)的專家,但是掌握一些基礎(chǔ)知識(shí)也是相當(dāng)重要的,包括這些系統(tǒng)如何工作,構(gòu)建及部署代碼的流程。
通常,真正負(fù)責(zé)創(chuàng)建和維護(hù)構(gòu)建部署系統(tǒng)的是一個(gè)最近正在快速崛起的領(lǐng)域,被稱為 DevOps (developer operations 的簡(jiǎn)稱)。
同樣地,這并不能成為你不去了解這些流程是如何工作的理由。
測(cè)試
在過(guò)去,做為一個(gè)程序員是不需要懂得測(cè)試的。
在過(guò)去,我們只需要寫完一堆代碼,將它們丟給一堆測(cè)試,測(cè)試就會(huì)將代碼中的一堆 bug 找出來(lái),我們對(duì)這些 bug 進(jìn)行修復(fù)就行了。
現(xiàn)在已經(jīng)不是這樣的時(shí)代了。
現(xiàn)在很多的軟件項(xiàng)目采用的是敏捷開發(fā)(我們會(huì)在開發(fā)模式中詳細(xì)進(jìn)行討論),這要求程序員和測(cè)試之間有更緊密的合作。
保證軟件質(zhì)量現(xiàn)在已經(jīng)成為整個(gè)小組的責(zé)任了 —— 其實(shí)我認(rèn)為一直都是這樣。
因?yàn)?,你也需要懂得一點(diǎn)測(cè)試的知識(shí)。你至少應(yīng)該熟悉如下的這些術(shù)語(yǔ):
- 白盒測(cè)試
- 黑盒測(cè)試
- 單元測(cè)試(不是真正的測(cè)試)
- 邊界條件
- 測(cè)試自動(dòng)化
- 測(cè)試驗(yàn)收
一個(gè)好的開發(fā)者 —— 同時(shí)我假設(shè)你至少想成為一個(gè)好的開發(fā)者 —— 在將代碼交付給別人之前,都會(huì)先對(duì)自己的代碼進(jìn)行測(cè)試。
如果你想成為一個(gè)專業(yè)的程序員,而不僅僅是一個(gè)黑客,這一點(diǎn)是不容商榷的。
調(diào)試
很多軟件開發(fā)新手的夢(mèng)想都被調(diào)試器毀了。
每個(gè)人都想寫代碼,不是嗎?有人希望自己一直在調(diào)試代碼嗎?
歡迎來(lái)到真實(shí)的世界。
你作為一個(gè)軟件開發(fā)者的 90% 時(shí)間都會(huì)花在搞明白為什么你的代碼不能正常工作。
我知道這個(gè)事實(shí)并不令人向往。我知道你很想把整天的時(shí)間都拿來(lái)寫新的代碼,但是這個(gè)世界并不是按照你的心意運(yùn)轉(zhuǎn)的。
如果你使用了測(cè)試驅(qū)動(dòng)開發(fā),你可能會(huì)少花很多時(shí)間在調(diào)試器上,盡管如此,無(wú)論你做什么,不管你如何努力去避免它,你還是得學(xué)習(xí)如何調(diào)試自己或者他人的代碼。
所以,以其讓你對(duì)自己不得不做的事情一知半解,還不如痛下決心去真正掌握如何高效率地完成它。
在關(guān)于調(diào)試的章節(jié),我會(huì)更詳細(xì)地討論這部分內(nèi)容,而現(xiàn)在,你需要知道如何去做。
軟件開發(fā)方法
被這一長(zhǎng)串你所需要掌握的技能清單嚇到了嗎?
如果還沒(méi)有的話,這里還有一條 —— 但是我保證這是最后一條了。
一些開發(fā)團(tuán)隊(duì)只是簡(jiǎn)單的從寫代碼開發(fā),直到把所有的事實(shí)都做完,而大多數(shù)團(tuán)隊(duì)都會(huì)使用某種類型的開發(fā)方法,或者至少假裝他們?cè)谑褂谩?/p>
(順道說(shuō)一句,不要期望任何團(tuán)隊(duì)會(huì)真正做到他們聲稱在使用的軟件開發(fā)方法。我并不是想批評(píng)誰(shuí),或者要對(duì)誰(shuí)指手畫腳。我只是一個(gè)實(shí)用主義者,同時(shí)我碰巧知道很多人聲稱他們?cè)谑褂媚撤N軟件開發(fā)方法,比如說(shuō)敏捷開發(fā),只是因?yàn)樗麄兠刻於紩?huì)開一個(gè)立會(huì)。)
因此,你至少應(yīng)該對(duì)大多數(shù)常用軟件開發(fā)方法的基礎(chǔ)知識(shí)有一個(gè)了解。在目前,常用的方法就是瀑布式開發(fā)和敏捷開發(fā)。
很多團(tuán)隊(duì)都聲明他們自己使用敏捷開發(fā)。敏捷本身的定義很寬泛,但是它包含了很多實(shí)踐,或者說(shuō)儀式在里面,你必須要明白這些才能在一個(gè)敏捷團(tuán)隊(duì)里面生存。
我們會(huì)在軟件開發(fā)方法一章中深入討論這個(gè)技術(shù)。
信息量太大了嗎?不要慌
我知道這些知識(shí)很多,而我們都還沒(méi)真正觸及到大部分的主題的表面。
現(xiàn)在你可能會(huì)覺(jué)得信息量有點(diǎn)過(guò)大,覺(jué)得自己對(duì)這些技術(shù)的大部分都不懂。在目前這個(gè)階段,什么都不懂是正常的 —— 除非你已經(jīng)是個(gè)有經(jīng)驗(yàn)的軟件開發(fā)者了。
不管怎樣,我會(huì)在“軟件開發(fā)所要掌握的技能”一節(jié)中對(duì)大部分的技術(shù)進(jìn)行更深入的講解。所以,你現(xiàn)在只管放輕松,不要怕。
接下來(lái),我會(huì)教你學(xué)習(xí)技術(shù)的通用方法,這樣在后面的章節(jié)中碰到這些具體的技術(shù)時(shí),你就會(huì)知道如何正確地學(xué)習(xí)它們了。
Hey John
我注意到在書中有很多的鏈接,看起來(lái)你好像在推廣一大堆你的其它產(chǎn)品跟作品...這到底是怎么回事呢?
唔,我很高興你問(wèn)到了這個(gè)問(wèn)題。
首先,讓我們來(lái)談?wù)勥@些鏈接。
是的,這本書里有大量的鏈接。但是,不用擔(dān)心,你不需要打開全部的這些鏈接。你完全可以隨意點(diǎn)開,或者只看那些你感興趣的。
大多情況下,我都盡可能將我之前寫過(guò)的與該主題相關(guān)的信息附到鏈接上,因?yàn)橛腥丝赡軙?huì)對(duì)某個(gè)主題感興趣,并想深入進(jìn)行了解。
這些鏈接大多數(shù)會(huì)指向我的博客或者 YouTube 視頻,通常我會(huì)在那里講更多關(guān)于這個(gè)主題的事情 —— 或者僅僅是因?yàn)楹猛妗?/p>
(同時(shí),如果你點(diǎn)了這本書上的任意一個(gè)鏈接 —— 或者將它們手動(dòng)敲入你的瀏覽器中 —— 你會(huì)被帶到一個(gè)頁(yè)面,這個(gè)頁(yè)面分章節(jié)地列出了這本書中的所有鏈接)
至于插入我其它產(chǎn)品這件事,是的,你是對(duì)的,我確實(shí)正在做這件事。
我覺(jué)得這是很明智的。
書本身是很便宜的,寫一本書并不能賺很多的錢。
事實(shí)上,如果你寫一本書,你應(yīng)該擁有寫這本書的其它理由,而不僅僅是因?yàn)閷憰苜嶅X。而我寫這本書的一個(gè)原因就是為了幫助推廣其它我覺(jué)得對(duì)你也有價(jià)值的產(chǎn)品及“作品”。
這并不意味著我在給你發(fā)垃圾信息,你完全可以不買任何東西 —— 這本將近 800 頁(yè)的書本身就已經(jīng)具有它很大的價(jià)值了 —— 但是,如果你有興趣的話,這些產(chǎn)品就在那里,同時(shí)我也會(huì)繼續(xù)推廣它們。