我特別支持軟件開發者在他們掌握技術技能的同時去學習「軟技能」——事實上,我寫了一本關於這方面的書——可是不能否認的是:技術技能很重要。前端
個人意思是,若是你不能編寫代碼和開發軟件,那麼你學習衆多軟技能有個卵用。也許你能夠成爲一名優秀的管理人員或指導人員,但不會是軟件開發人員。程序員
若是你正在閱讀這篇文章,那麼我假設你有興趣成爲一個軟件開發人員——或者是更優秀的軟件開發人員——下面就讓咱們來聊一聊你須要知道哪些技術技能。web
如今,有這樣一種主流觀念,壓垮了不少新手軟件開發者,那就是你須要學習不少東西才能成爲軟件開發人員,而且不少人不知道從哪裏開始起步。面試
這裏我會嘗試着具體說明那些在你追求成爲軟件開發人員的路上將讓你受益的必要技術技能。算法
一篇文章固然不能詳盡說明做爲軟件開發者,你可能須要掌握的全部技術技能,可是我會列出最關鍵的一些技術技能。數據庫
我認爲從這一條開始提及是最合適的。編程
不懂編程語言,怎麼能成爲一個真正的程序員?數組
不過,關於選擇哪一種編程語言去學習可能並無咱們想得那麼重要這一點,請容許我一筆帶過。網絡
相反,讓咱們談一談爲何咱們要從一種編程語言開始,而不是試圖去學習全部的東西。數據結構
許多新手程序員會試圖一次性或在第一份工做以前學習幾種編程語言,以便於有備無患。
雖然我認爲你最終應該學會一種以上編程語言,但我不建議提早這樣作,由於這隻會致使混亂,而且會分散你須要學習的其餘技能的精力。
相反,我建議你應該深刻研究,重點學習單一編程語言的前因後果,這樣你才能對用這種編碼語言來寫代碼信心十足。
那麼在你決定想要成爲何樣的開發人員的時候,怎麼樣才能儘量地獨樹一幟呢?
在學習了一門編程語言以後——或者最好是在學習的同時——我堅信,你須要知道的下一件事就是如何正確地構造你的代碼。
有一個很好的資源來幫助你學習這個很是寶貴的技能:Steven McConnell的《Code Complete 》。
我所說的構造代碼是什麼意思呢?
個人意思是,要寫出好的,清晰的,易於理解的代碼,不須要大量註釋,由於代碼自己就是一種表達方式。
不少軟件開發者在他們整個職業生涯都未曾去學習這個技能,這是不幸的,由於這是我——以及其餘許多人——判斷一個軟件開發人員技術和能力的主要方式。
良好的代碼結構展現了對這種技藝的熱衷,而不只僅是爲了完成工做。
構建代碼是軟件開發真正的藝術部分,但它也是相當重要的,由於你和你的同事得花費至關多的時間來維護現有的代碼,而不是編寫新的代碼。
具體應該如何正確地組織代碼我就不說了,由於我已經給出了一個很好的資源,可是要努力學習如何從一開始就寫出好的、乾淨的代碼,而不是過後學習這個技能。
我只能保證,即便你是個新手,若是你能夠寫出好的、乾淨又簡潔的、易懂的,自己就能夠表達意思的代碼,那麼任何面試官看到你的代碼都會以爲你是一個有經驗的專業人士。
而且在必定程度上,或者至少在這條道路上,由於你會將這個職業看成一種專業,而不是一份工做。
這一條是有爭議的,特別是若是你正在學習的編程語言並不面向對象,可是有大量的軟件開發世界會按照面向對象設計的思惟思考,因此你須要確保你瞭解它。
面向對象的設計是一種將複雜程序設計分解爲單獨的類或對象(類的實例)的方法,其中封裝功能且具備特定的角色和責任。
在軟件開發中,咱們老是試圖管理複雜性。
從對象的角度思考能夠幫助咱們作到這一點,由於它能讓咱們從一堆交互組件中定義並設計一個複雜的系統,而不是做爲一個總體的試圖解決整個複雜性。
如今的編程世界有着大量的函數式編程語言,但你在軟件開發中找到的最流行的語言和模式,仍然深受面向對象設計和分析的影響。
你應該好好理解什麼是類,繼承的不一樣類型——什麼時候使用它們——還有理解像多態性和封裝等術語。
若是你上傳統院校學習並想得到計算機科學學位的話,那麼這是一個很大的考點。
算法是解決各類計算機科學/編程問題的經常使用方法。
例如,有若干常見的在程序上用於排序的算法。每一種排序算法都有一系列關於速度,內存大小要求,以及數據理想類型的不一樣屬性。
計算機科學領域有不少這樣的算法,而且理解如何變化這些算法來解決你可能遇到的棘手問題也很重要,當你解決現實編程問題的時候。
一般狀況下,擅長這些算法可讓一個開發人員在1個小時以內就能解決可能須要另外一個開發人員幾天時間才能搞清楚的問題。
除非你熟悉和擅長算法,不然你甚至不知道已經有了優雅的解決方案在那裏。所以,僅僅只爲這個緣由,我認爲這也是一個值得掌握的寶貴技能。
數據結構也是如此,而且能夠與算法結合使用。
有幾個全部軟件開發者都應該熟悉數據結構中的,包括:
經過熟練掌握數據結構和算法,你能夠輕鬆又優雅地解決許多艱難的編程問題。
當我開始編程的時候,我在數據結構和算法方面很是糟糕,由於我主要是靠自學的。
我一直都沒有意識到它們的價值,直到我和一個名爲TopCoder的網站競爭,而他們對數據結構和操做算法的瞭解使之有了很大的競爭優點。
很快,隨着我遇到了一些我不知道如何解決的問題,我發現這些技能在真正的編程世界很是有用,並且解決起來至關簡單——和有趣。
事實上,我認爲這是軟件開發最有趣的領域之一。解決難題並利用數據結構和算法來開發一個又幹淨又優雅的解決方案,真的頗有意義。
至少到寫這本書爲止,目前最好的資源是Gayle Laakmann McDowell的《Cracking the Coding Interview》。
在這本書中,做者涉及了全部你須要瞭解的關於算法和數據結構的內容。
學習這些東西是一個挑戰,但很是值得。這是可讓你超越衆多同行的技能之一。大多數軟件開發人員都不擅長這個領域。
若是你想經過如微軟或谷歌這樣的大公司的面試,那麼你必定得掌握這個技能集。
你應該具有一些經驗,並至少掌握一個開發平臺以及與之相關的技術或框架。
我所說的平臺是什麼意思呢?
好的,一般它的意思是操做系統(OS),但也適用於其餘能夠充當相似於操做系統角色的抽象。
例如,你能夠是專一於Mac或Windows操做系統得Mac開發者或Windows開發者,你也能夠是一名專一於特定的web平臺的web開發人員。
具體確切的關於平臺是什麼就不討論了——不一樣的人會有不一樣的見解——但這裏我要定義平臺爲你開發的特定環境,它有本身的生態系統和特殊性。
再者,這是另外一個我認爲選擇並不是那麼重要的技術技能,只要你選擇了一個就好。
企業一般會聘請開發人員針對特定的平臺或技術開發軟件。
你做爲iOS開發者將更容易找到工做,若是你專業於那個特定平臺的話。
這意味着要熟悉平臺自己,以及開發工具,慣用模式,還有大多數程序員在爲那個平臺開發時會使用的通用框架。
你可能會認爲編程語言的選擇決定了平臺,但實際上事實狀況不多是這樣的。
就拿C#舉例。若是你是一個C#開發人員,那麼你能夠用這種編程語言爲Windows,Mac,iOS,Android,Linux,甚至是嵌入式系統寫代碼。
因此,不要僅僅只是選擇語言;還要選擇平臺。
除了學習特定的編程語言和平臺,我高度建議去學習框架,或者更好的是,與之相配套的完整的開發堆棧。
什麼是框架?
什麼是堆棧?
框架就是一系列被用於在特定平臺或多個平臺上開發代碼的庫。它一般可使得在該平臺上的編程任務變得更加容易。
看這個C#的例子。大多數C#開發人員使用.NET框架來編寫C#應用程序。 .NET框架包括許多庫和類,可以讓C#開發人員在更高的抽象級別上工做,由於每當他想作什麼事情的時候,沒有必要徹底從新發明輪子。
例如,.NET框架的部分還包含了處理圖像的代碼。這類代碼從頭編寫是極其困難的,因此框架極大地幫助了C#開發人員去編寫須要以某種方式處理圖像的代碼。
堆棧則有點不一樣。堆棧是一組技術,一般包括一個框架,而且常一塊兒用於創造一個完整的應用程序。
例如,有一個常見的稱爲MEAN的棧。它表明MongoDB,Express.js,AngularJS,和Node.js。
MongoDB是一個數據庫技術。
Express.js是一個用於建立web應用程序的Node.js框架。
AngularJS是一個用於爲web應用程序建立用戶界面的前端JavaScript框架。
最後,Node.js是一個用JavaScript開發基於web應用程序的運行時環境。
有沒有理解全部這些東西並不重要—— 除非你打算成爲一個MEAN開發者——重要的是要明白,若是你知道全部這些技術和框架,那麼你就可以開發一個完整的web應用程序。
棧使得建立應用程序變得更容易,由於它們提供了一種許多開發者用來開發應用程序的通用範式,所以知識能夠很容易地共享,而且你也能肯定哪些特定的技能集市能夠一塊兒工做的。
學習堆棧真的是很是有價值,由於這意味着你擁有開發一個完整的應用程序全部必要的技能。不少使用特定堆棧開發應用程序的企業,更願意僱用那些熟悉那類堆棧可以立馬開展工做的軟件開發人員。
即便數據庫的景色在過去幾年時間裏已經改變了很多,但我不認爲數據庫會很快消失,所以對此瞭解一二老是不會錯的,對吧?
當前主要有兩種數據庫技術:關係數據庫和文檔數據庫。
如今的開發人員至少應該熟悉關係數據庫,並稍微瞭解文檔數據庫。
在軟件開發中,數據庫常常被用來存儲應用程序的數據。
固然,有些團隊甚至有專門的數據庫開發人員或數據庫管理員(DBA),可是這並不能真正容許你不懂至少是基本的數據庫知識。
最起碼,你應該知道:
此外,你可能會想知道如何以編程方式從你的代碼與你所選擇的平臺和/或框架檢索和存儲數據。
大多數開發者被期待可以編寫與數據庫進行交互代碼。
源代碼控制是任何軟件開發項目的組成部分。
在咱們使用源代碼控制以前,咱們必須在網絡上共享項目的全部文件,或者經過U盤來回查看存儲在上面的不一樣軟件版本。
雖然我很不想認可,但個人確不止一次地玩過這個把戲。
可是,我還年輕。我蠢。你卻不必像我這樣。
當前,幾乎全部專業的開發者人員都被期待懂得如何使用源代碼控制來反覆檢查代碼,並但願懂得合併來自多個源的變化。
最基本層面的源代碼控制可讓你保持在一個軟件項目中對不一樣的文件所作更改的歷史記錄。
它還容許多個開發人員在同一時間工做於相同的代碼,而後合併這些更改。
具體就不細說了,但你應該知道如何熟練地使用至少一個源代碼控制系統,而且你應該熟悉大多數基本的源控制概念。
在當今軟件開發領域,幾乎全部專業的軟件開發團隊都會使用某種源代碼控制。
如今,大多數軟件開發項目都有着某種自動化的構建和部署系統。
有幾種不一樣的軟件應用程序,能夠幫助軟對自動化這兩個任務,曾經是手動,固然對於某些團隊而言,如今仍然如此。
你問什麼是構建和部署?
好問題。
你知道如何寫代碼,並檢入到源控制系統嗎?
擁有一些方法來確保代碼可在你檢入後真正能工做很不錯。
這就是構建系統的用武之地。
最起碼,構建系統將編譯全部代碼,並確保沒有編譯錯誤。
一個複雜的構建系統能夠運行單元測試或用戶測試,運行代碼質量檢查,並提供關於代碼庫當前狀態的一些報告。
部署系統將負責部署代碼要麼到生產機器要麼可能到某種測試環境。
你沒必要成爲這些技術的絕對專家,可是瞭解至少這些系統如何工做的基礎知識,以及構建和部署代碼的過程,是很是重要的。
一般狀況下,建立和維護構建和部署系統的實際職責屬於所謂的DevOps(developer operations的簡寫)——這個快速增加的領域。
可是,這並不妨礙你至少了解關於這個過程如何工做的基礎知識。
曾幾什麼時候開發者並無必要知道太多關於測試的內容。
咱們習慣於寫一串代碼,而後扔給測試人員,讓他們去找代碼中的各類bug,而後咱們再來修復bug。
切不可再如此。
隨着愈來愈多的軟件項目開始採用所謂的敏捷過程,(後面再方法這一點中咱們再細談),軟件開發人員和測試人員不得不更密切地一塊兒合做。
質量已真正成爲了整個團隊的責任——我卻是更想說,它一直都是。
隨之而來的是,你須要瞭解一些關於測試的東西。
你至少應該熟悉以下基本術語:
一個好的開發人員——我假設你至少想成爲一個優秀的開發人員——會在將代碼交給別人以前測試本身的代碼。
若是你真的想被認爲是專業的,並不是浪者虛名,那麼這一條沒有商量餘地。
嗯,不少新手軟件開發人員在調試時都感受本身像是在用雞蛋碰石頭。
每一個人都但願寫代碼,沒錯吧?
但好像沒有人願意調試本身的代碼?
這就是真相。
大約90%的時間軟件開發人員是用來搞清楚到底爲何代碼不能正常工做。
我知道你只是想可以成天寫新的代碼,可是此路不通。
若是你採用如測試驅動開發這樣的方法,那麼你可能會少花不少時間在調試上,但不管如何,無論你作什麼,無論你如何努力,你都不得不學習如何調試代碼或其餘人的代碼。
所以,與其採起一種隨意的方式來作一些你不得不作的事情,還不如咬緊牙關不遺餘力學會如何有效地作好這件事情。
有沒有被我列出來的須要知道的事情清單嚇倒?
好吧,還有一個——可是我保證這是最後一個。
雖然一些軟件開發團隊纔剛開始寫代碼,不擇手段只要完成任務便可,可是大多數團隊仍是至少遵循某種方法的。
出於這個緣由,熟悉一些最多見的軟件開發方法背後的基本理念相當重要。
今天,我要說的是瀑布式開發和敏捷開發。
大多數團隊會聲稱他們正在作敏捷。敏捷自己是一個很是鬆散的概念,但也有一些作法和——原諒個人措辭——固定程序是你應該知道的,若是你不想只是紙上談兵,想要打造一支敏捷團隊的話。
我知道這些內容統統要掌握的話,有點多,並且我僅僅觸及了大多數主題表面的東西。
如今,你可能會以爲有點不知所措,有點不堪重負,面對這些所謂的技術技能一片茫然。
不要緊。你不用不着這樣,除非你已是一個軟件開發從業人員,在這種狀況下,可恥的是你!(開個玩笑。但你真的最好須要提升本身了,真的。)
無論怎樣,我將在《What You Need to Know About Software Development》這本書中更深刻地談論這些主題中。
因此,淡定點。
好吧,接下來,學習這些技術技能的時候到了,你準備好了嗎?