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