技術博文2017/01/20

【軟體外包】優秀程式設計師必備技能大全

我特別支援軟件開發者在他們掌握技術技能的同時去學習「軟技能」——事實上,我寫了一本關於這方面的書——但是不可否認的是:技術技能很重要。

我的意思是,如果你不能編寫程式碼和開發軟體,那麼你學習眾多軟技能有個卵用。也許你可以成為一名優秀的管理人員或指導人員,但不會是軟件開發人員。

如果你正在閱讀這篇文章,那麼我假設你有興趣成為一個軟件開發人員——或者是更優秀的軟件開發人員——下面就讓我們來聊一聊你需要知道哪些技術技能。

  用技能賺錢

現在,有這樣一種主流觀念,壓垮了很多新手軟件開發者,那就是你需要學習很多東西才能成為軟件開發人員,並且很多人不知道從哪裏開始起步。

這裏我會嘗試著具體說明那些在你追求成為軟件開發人員的路上將讓你受益的必要技術技能。

一篇文章當然不能詳盡說明作為軟件開發者,你可能需要掌握的所有技術技能,但是我會列出最關鍵的一些技術技能。

  程式語言

我認為從這一條開始說起是最合適的。

不懂程式語言,怎麼能成為一個真正的程式設計師?

不過,關於選擇哪種程式語言去學習可能並沒有我們想得那麼重要這一點,請允許我一筆帶過。

相反,讓我們談一談為什麼我們要從一種程式語言開始,而不是試圖去學習所有的東西。

許多新手程式設計師會試圖一次性或在第一份工作之前學習幾種程式語言,以便於有備無患。

雖然我認為你最終應該學會一種以上程式語言,但我不建議提前這樣做,因為這隻會導致混亂,並且會分散你需要學習的其他技能的精力。

相反,我建議你應該深入研究,重點學習單一程式語言的來龍去脈,這樣你才能對用這種編碼語言來寫程式碼信心十足。

那麼在你決定想要成為什麼樣的開發人員的時候,怎麼樣才能儘可能地獨樹一幟呢?

  如何構造程式碼

在學習了一門程式語言之後——或者最好是在學習的同時——我堅信,你需要知道的下一件事就是如何正確地構造你的程式碼。

有一個很好的資源來幫助你學習這個非常寶貴的技能: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%的時間軟件開發人員是用來搞清楚到底為什麼程式碼不能正常工作。

我知道你只是想能夠整天寫新的程式碼,但是此路不通。

如果你採用如測試驅動開發這樣的方法,那麼你可能會少花很多時間在除錯上,但無論如何,不管你做什麼,不管你如何努力,你都不得不學習如何除錯程式碼或其他人的程式碼。

因此,與其採取一種隨意的方式來做一些你不得不做的事情,還不如咬緊牙關竭盡全力學會如何有效地做好這件事情。

  方法

有沒有被我列出來的需要知道的事情清單嚇倒?

好吧,還有一個——但是我保證這是最後一個。

雖然一些軟件開發團隊纔剛開始寫程式碼,不擇手段只要完成任務即可,但是大多數團隊還是至少遵循某種方法的。

出於這個原因,熟悉一些最常見的軟件開發方法背後的基本理念至關重要。

今天,我要說的是瀑布式開發和敏捷開發。

大多數團隊會聲稱他們正在做敏捷。敏捷本身是一個非常鬆散的概念,但也有一些做法和——原諒我的措辭——固定程式是你應該知道的,如果你不想只是紙上談兵,想要打造一支敏捷團隊的話。

  不堪重負?不需要

我知道這些內容通通要掌握的話,有點多,而且我僅僅觸及了大多數主題表面的東西。

現在,你可能會覺得有點不知所措,有點不堪重負,面對這些所謂的技術技能一片茫然。

沒關係。你不用不著這樣,除非你已經是一個軟件開發從業人員,在這種情況下,可恥的是你!(開個玩笑。但你真的最好需要提高自己了,真的。)

所以,淡定點。

好吧,接下來,學習這些技術技能的時候到了,你準備好了嗎?

來源:碼農網