作爲軟件開發人員需要具備的技術技能

我是幫助軟件開發人員開發除技術技能之外的“軟技能”的堅定支持者。但是不可否認:技術技能很重要。
我的意思是,如果您實際上不能編寫代碼和開發軟件,那麼您學到的所有軟技能都不會真正幫到您。也許您會成爲一名優秀的項目經理,而不是一名優秀的軟件開發人員。
但是,如果您正在閱讀本書的這一部分,那麼我假設您有興趣成爲一名軟件開發人員,或者成爲一名更好的軟件開發人員,因此,讓我們談談您需要了解的技術技能。
一種編程語言
我認爲最好從這個開始,不是嗎?
真的不懂編程語言就不能成爲程序員-你知道我的意思嗎,
我們將在巧妙地命名爲“要學習的編程語言”一章中討論選擇要學習的編程語言,因此,請不要再強調這一點。
不過,我很快會說, 選擇學習哪種編程語言 並不像您認爲的那麼重要。
相反,讓我們談談爲什麼我建議只從一種編程語言開始,而不是嘗試學習陽光下的一切。
許多剛開始的程序員試圖通過一次或多次學習幾種編程語言來對衝自己的賭注,然後才嘗試擔任軟件開發人員的第一份工作。
雖然我認爲您最終應該學習一種以上的編程語言,但 我建議不要提前使用 它,因爲這隻會導致混亂,並且會將您的精力從您需要學習的許多其他技術技能中轉移出來。
相反,我建議您 深入學習,並專注於學習單一編程語言的來龍去脈,以便對使用該語言編寫代碼的能力充滿信心。
還記得我們在決定要成爲什麼樣的軟件開發人員時如何談論儘可能具體的事情?
這就是這裏的想法。
如何構造代碼
在學習了一種編程語言之後,或者最好是在學習它的同時,我堅信,接下來您需要知道的是如何正確地構造代碼。
結構化代碼是什麼意思?
我的意思是編寫 優秀,清晰,可理解的代碼,因爲代碼本身是可交流的,因此不需要大量註釋。
許多軟件開發人員在整個職業生涯中都沒有學習此技能,這是不幸的,因爲這是我以及其他許多人判斷軟件開發人員的技能和能力的主要方式。
良好的代碼結構顯示出對工藝的奉獻精神,而不僅僅是完成工作。
結構化代碼確實是軟件開發中的藝術部分,但也很關鍵,因爲您和您的必須與您的代碼一起工作的同事將花費大量時間維護現有代碼,而不是編寫新代碼。
就像我說過的那樣,我不會在本書中討論如何正確地構建代碼,因爲我已經爲您提供了很好的資源,但是 您應該從一開始就努力學習如何編寫優質,簡潔的代碼。 而不是事後學習這項技能。
我可以保證,即使您是初學者,也可以編寫出清晰,簡潔,易懂的代碼來表達其在結構本身中的含義,幾乎所有看到您的代碼的面試官都將 假設您是有經驗的專業人士。
在某種程度上,您將成爲,或者至少在將來會成爲,因爲您將把這個職業視爲一種職業,而不僅僅是一份工作: 一個真正的工匠的標誌。
面向對象設計
這是值得商bat的,尤其是在您學習的不是面向對象(OO)的程序語言時,但是在軟件開發界,有 足夠的人從OO設計的角度來思考,因此您需要確保自己理解它。
面向對象設計 是一種設計複雜程序的方法,該程序將它們分解爲單獨的類或對象(類的實例),這些類或對象封裝了功能並具有特定的角色和職責。
在軟件開發中, 我們始終試圖管理複雜性。
以對象的方式思考有助於我們做到這一點,因爲它使我們能夠從一堆相互作用的組件中定義和設計一個複雜的系統,而不是試圖從整體上解決整個複雜性。
當今有許多功能性編程語言,但是 在軟件開發中可以找到的最流行的語言和模式,即使不是全部,也仍然會受到面向對象設計和分析的嚴重影響(即使不是完全)。
您應該對類是什麼,繼承的不同類型是什麼以及何時使用它們有一個很好的瞭解,並且應該理解諸如多態性 和封裝之類的術語 。
算法和數據結構
如果您修讀傳統的學院或大學課程來獲得計算機科學學位,那麼這將是您所學或將學到的大部分內容。
算法是解決各種計算機科學/編程問題的常用方法。
例如,有幾種算法通常用於以編程方式對事物列表進行排序。這些排序算法中的每一個都具有關於速度,內存大小要求以及所處理的理想數據類型的不同屬性集。
計算機科學領域中有許多這樣的算法,瞭解如何編寫自己 的這些算法的變體 以解決在解決實際編程問題時可能遇到的棘手問題也 很重要。
通常,擅長算法可以使一個開發人員在一個小時內解決問題,這可能需要另一位開發人員花費幾天的時間才能弄清楚。
除非您熟悉算法並精通算法,否則您 甚至都不知道那裏已經存在一個優雅的解決方案。因此,僅出於這個原因,我認爲這是一項寶貴的技能。
數據結構屬於相似的類別, 並與算法結合使用。
所有軟件開發人員都應該熟悉幾種數據結構,包括:
數組或向量
鏈表
堆棧
Queue列
樹木
散列
套裝
通過很好地掌握數據結構和算法,您可以輕鬆而優雅地解決許多困難的編程問題。
剛開始編程時,我真的很擅長數據結構和算法,因爲我大多是自學成才。
直到我開始在一個名爲TopCoder的站點上競爭時,我才意識到它們的真正價值。 在該站點上 ,瞭解數據結構和對其進行運算的算法爲您帶來了明顯的競爭優勢。
很快,當我遇到以前不知道如何解決的問題時,這些技能在實際的編程世界中變得多麼有用,而這些問題現在變得非常容易且有趣。
實際上, 我認爲這是軟件開發中最有趣的領域之一。解決一個棘手的問題並利用數據結構和算法來開發出性能良好的乾淨,優雅的解決方案,這確實是一種收穫。
至少在撰寫本文時,最好的資源是GayleLaakmannMcDowell的絕妙著作《 CrackingtheCodingInterview》。
在本書中,她介紹了您需要了解的有關算法和數據結構的所有內容。
學習這些東西是一個挑戰,但值得。這是可以使您遠遠超越同行的技能之一。 在這一領域,許多軟件開發人員裝備不足。
而且,如果您想在像Microsoft或Google這樣的公司進行面試, 您肯定需要掌握這種技能。
開發平臺及相關技術
您應該對至少一個開發平臺以及與之配套的相關技術或框架有一定的經驗和精通。
平臺是什麼意思?
好吧, 通常它指的是操作系統(OS),但是它也可以應用於其他類似於操作系統的抽象。
例如,您可以是專注於Mac或Windows操作系統的Mac開發人員或Windows開發人員,但也可以是專注於特定Web平臺的Web開發人員。
我不想將其歸納爲一個平臺究竟是什麼的討論(不同的人會有不同的看法),但是出於討論的目的, 我將定義一個平臺作爲您要爲其開發的特定環境。擁有自己的生態系統和特殊性。
再說一遍,這是另一件事,我認爲您選擇的內容並不那麼重要,而是您 選擇的東西是如此重要。
公司通常會聘請開發人員針對特定平臺或技術進行開發。
如果您具有特定平臺的專業知識,則可以輕鬆獲得iOS開發人員的工作。
這意味着要熟悉平臺本身,以及程序員在針對該平臺進行開發時通常使用的開發工具,慣用模式和常用框架。
您可能會認爲編程語言的選擇決定了平臺,但實際上情況並非如此。
今天就使用C#。您可以成爲C#開發人員,併爲Windows,Mac,iOS,Android,Linux甚至嵌入式系統編寫代碼。
因此,不要只選擇一種語言。選擇一個平臺。
框架或堆棧
除了學習特定的編程語言和平臺之外,我還強烈建議您學習一個框架,或者更好的是,它附帶一個完整的開發堆棧。
什麼是框架?
什麼是堆棧?
框架只是一組庫,用於在特定平臺或多個平臺上開發代碼。通常,它使該平臺上的常見編程任務更加容易。
回到C#示例。大多數C#開發人員都使用.NETFramework編寫C#應用程序。.NETFramework由許多庫和類組成,它們使C#開發人員可以在更高的抽象水平上工作,因爲他不必每次想做的事情都完全重新發明輪子。
例如,.NETFramework的一部分包含用於處理圖像的代碼。從頭開始編寫該代碼將非常困難,因此對於C#開發人員編寫需要以某種方式處理圖像的代碼而言,該框架是一個巨大的好處。
堆棧有點不同。 堆棧是通常結合在一起使用以創建完整應用程序的一組技術,通常包括一個框架。
例如,有一個通用的堆棧稱爲MEAN堆棧。它代表MongoDB,Express.js,AngularJS和Node.js。
MongoDB是一種數據庫技術。
Express.js是用於創建Web應用程序的Node.js框架。
AngularJS是用於創建Web應用程序用戶界面的前端JavaScript框架。
最後,Node.js是用於在JavaScript中開發基於Web的應用程序的運行時環境。
除非您將成爲MEAN開發人員,否則瞭解所有內容並不重要,但要理解的重要一點是,如果您瞭解所有這些技術和框架,就可以開發整個Web應用程序。
堆棧使創建應用程序更加容易, 因爲它們提供了許多開發人員用來開發應用程序的通用範例,因此可以輕鬆共享知識,並且可以確保特定的技術集可以協同工作。
學習堆棧非常有價值,因爲這意味着您具有開發完整應用程序所需的所有技能。許多擁有使用特定堆棧開發的應用程序的公司都將尋找熟悉該堆棧並可以開始運作的軟件開發人員。
基本數據庫知識
即使最近幾年數據庫的狀況發生了很大變化,我也看不到數據庫很快就會消失,所以我認爲您可能應該瞭解一兩件事,不是嗎?
在撰寫本書時, 主要有兩種數據庫技術:關係數據庫和文檔數據庫。
我想說,今天的開發人員至少應該熟悉關係數據庫,並且可能還應該對文檔數據庫有所瞭解。
在軟件開發中,數據庫通常用於存儲應用程序的數據。
當然,有些團隊將有專門的數據庫開發人員或數據庫管理員(DBA),但這並不能爲您起碼至少不了解數據庫的基礎。
至少,您應該知道:
數據庫如何工作
如何執行基本查詢以獲取數據
如何插入,更新和刪除數據
如何將數據集連接在一起
另外,您可能會想知道如何 使用所選平臺和/或框架以編程方式從代碼中檢索和存儲數據。
期望大多數開發人員能夠編寫可以與數據庫交互的代碼。
源代碼控制
源代碼控制是任何軟件開發項目的組成部分。
回顧過去,在使用源代碼管理之前,我們將與項目中的所有文件共享網絡,或者在其上使用不同版本的軟件來回傳遞拇指驅動器。
我很ham愧地承認我不止一次參與了這些惡作劇。
但是, 我還年輕。我真蠢啊。您不必如此。
如今,幾乎所有專業開發人員都應該知道如何使用源代碼控制來檢入代碼,檢出代碼,並希望合併來自多個源的更改。
源代碼管理最基本的級別允許您保留對軟件項目中不同文件所做更改的歷史記錄。
它還允許多個開發人員同時處理相同的代碼, 並將這些更改重新合併在一起。
我們不會在這裏詳細介紹,但是 您應該知道如何很好地使用至少一個源代碼控制系統,並且您應該熟悉大多數基本的源代碼控制概念。
在當今的軟件開發世界中,幾乎所有專業軟件開發團隊都將使用某種源代碼控制。
構建和部署
如今,大多數軟件開發項目都具有某種自動化的構建和部署系統。
有幾種不同的軟件應用程序可以幫助團隊自動化完成這兩項任務,這些任務過去是手動的,對於某些團隊來說仍然如此。
您問什麼是構建和部署?
好問題。
好吧,您知道如何編寫該代碼並將其檢入到源代碼控制系統中嗎?
擁有某種方法來確保在簽入代碼後代碼確實有效,這將是一個好主意。
這就是構建系統的用武之地。
至少,構建系統將編譯所有代碼,並確保沒有編譯錯誤。
複雜的構建系統 還可以 運行單元測試或用戶測試,運行代碼質量檢查,並提供 有關代碼庫當前狀態的一些報告。
部署系統 將負責將代碼部署到生產機器或某種測試環境。
您不必一定是這些技術的絕對專家,但是 至少了解這些系統的工作原理以及構建和部署代碼的過程非常重要。
通常,創建和維護構建與部署系統的實際職責將屬於一個快速增長的領域,稱爲DevOps(開發人員操作的縮寫)。
但是,這並不能免除您至少了解此過程如何工作的基礎知識。
測試
過去,開發人員不必對測試瞭解太多。
過去,我們要編寫一堆代碼,然後“扔到牆上” 給一羣測試人員,這些測試人員會在我們的代碼中找到各種錯誤,然後修復這些錯誤,僅此而已。
不再。
如此衆多的軟件項目採用了所謂的敏捷流程(在使用方法論時,我們將對此進行更多討論),軟件開發人員和測試人員必須 緊密合作。
質量確實已成爲整個團隊的責任-我認爲這一直都是如此。
話雖如此,您需要了解一些有關測試的知識。
您至少應該熟悉一些基本術語,例如:
白盒測試
黑盒測試
單元測試(不是真正的測試)
邊界條件
測試自動化
驗收測試
一個好的開發人員(我假設您至少希望成爲一個好的開發人員)在將其代碼提供給他人之前先進行測試。
如果您真的想被視爲專業人士而不僅僅是黑客,那是不容 商量的。
調試
嗯,許多新手軟件開發人員的夢想都砸在了調試器的堅石上。
每個人都想編寫代碼,對嗎?
但是不是沒有人想要調試他們的代碼嗎?雅聽到我嗎?
雅感覺到我嗎?
真相時間。
您可能需要花費90%的時間作爲軟件開發人員來弄清楚 爲什麼您的代碼無法正常工作。
我知道這並不迷人。我知道您只想整天編寫新代碼,但是整個世界都無法正常工作。
如果您採用諸如測試驅動開發之類的方法,則可能會在調試器上花費更少的時間,但是無論您做什麼,無論您如何嘗試並解決它, 都必須學習如何調試您的代碼 或其他人的代碼。
因此,您應該只是硬着頭皮,切實學習如何有效地做到這一點,而不是隨便採取一些您知道 必須要做的事情。
在調試一章中,我將詳細介紹這一點,但是到目前爲止,您只知道如何做到這一點。
方法論
洗衣清單讓您感到恐懼嗎?
如果不是,這是另外一個-但我保證這是最後一個。
儘管一些軟件開發團隊只是開始編寫代碼並在完成工作後就完成工作,但大多數團隊都有某種至少可以假裝遵循的方法論。
因此,至關重要的是,您至少必須熟悉最常見的軟件開發方法背後的一些基本思想。
今天,我要說的是 瀑布式開發 和 敏捷開發。
大多數團隊會聲稱他們在做敏捷。敏捷本身是一個非常寬鬆的概念,但是有一些實踐,並且,我敢說,如果您希望能夠講話,可以這麼說並適合加入敏捷團隊,則應該注意一些習慣。
我們將在軟件開發方法論這一章中更深入地討論這一點。
最後,開發這麼多年我也總結了一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信發送領取資料或者在評論區留下自己的聯繫方式,有時間記得幫我點下轉發讓跟多的人看到哦。在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章