- 原文地址:Warning: Your programming career
- 原文做者:Vardan Grigoryan (vardanator)
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:kezhenxu94
- 校對者:swants luochen1992
在個人編程生涯剛剛開始的時候,主要困擾個人一件事情就是編程語言/編程技術的選擇。我應該學什麼,從哪裏入門?要獲得個人第一份編程工做我須要學會什麼?回望過去(距今大概已經 10 年),那時尚未像 Coursera、Udemy 和 SoloLearn 這樣的在線教育學習平臺。那時的我也還沒法全靠本身就能尋找到通往成功事業的正確方向和完整道路。對於程序員這個崗位,高回報、待遇好,簡直堪稱 21 世紀的宇航員。前端
一樣的問題至今依然存在:初學者苦於選擇。沒有成爲好程序員的直達途徑,社區一般對於像「Python 是一門膠水語言嗎???」這樣的新手問題不太熱情。通往成功的編程事業的道路彷佛比之前還更加迷茫。你(假設你是個初學者)必須面臨如下選擇:C++/C++11/C++14/C++17, Java, C#, Kotlin, PHP(神馬?),Python, Node.js, JavaScript(慢着,還包括 Angular, React 或 Vue 嗎?),等等。android
爲了回答這個關鍵的問題,我必須得先問你,你想要的是什麼?你是對構建手機應用感興趣、仍是對構建像 Facebook 和 Medium 這樣的網站感興趣、或者說你更想構建像 Photoshop 這樣類型的桌面應用?仍是說你全身心喜好遊戲開發?移動端遊戲仍是桌面遊戲?ios
「爲了獲得一個科技公司的軟件工程師職位,我應該學會什麼?」,我以爲回答這個問題最明智的方式就是先找出爲了經過此次技術面試你必須掌握的關鍵技能。但咱們應該首先把事情整理穩當,如今讓咱們深刻了解編程的世界、它的國家、城市,它的文化、戰爭,它的成功、失敗。對於那些沒有耐心看這麼多的讀者,你能夠直接滾動到「爲技術面試作準備」那一節。git
探索編程的世界首先讓咱們面臨着 3 大主要平臺:程序員
其實以上所說的大部分服務幾乎在三個平臺上都有產品,好比 Skype 就有桌面應用、手機端應用以及 Web 應用(儘管作得很爛),Twitter 就有 Web 應用和手機端應用,諸如此類。github
Web 在此語境下自己就是個巨大的概念,爲了解釋這個概念,咱們應該把它分爲所謂的「前端」和「後端」,後者正是我我的所偏心的。前端就是你在網頁上所能看見的東西,後端則爲你所能看見的東西提供必不可少的支持。總的來講就是,前端就是網站的外觀和體驗,後端了就是運行着用來處理用戶請求的服務,包括像處理數據庫查詢諸如此類的事。面試
前端。若是你想精通如何處理網站的外觀和體驗,例如:構建精美絕倫的網站,讓用戶愛不釋手,那你就應該學習 HTML(外觀)、CSS(外觀和體驗)、JavaScrip(體驗)。固然這還不夠。從如今看來,使用純 JavaScript 是不足夠的,因此你得選擇一個合適的框架,目前比較流行的有 Angular,React 和 Vue。選擇哪一個主要取決於你最想去哪一個公司,Google 仍是 Facebook?若是是 Google 那就選 Angular,若是是 Facebook 那就選 React。若是兩個都不喜歡(有點奇怪),那就選 Vue。簡單明瞭!除了這些你還須要掌握一些基礎概念,像 HTTP 協議的內部工做原理;你還須要熟悉一些 Web 服務器(至少不該該被像 Apache 和 Nginx 這樣的名詞嚇壞)。成爲一名前端工程師意味着你必需要渲染你從後臺服務器獲得的數據(爲用戶作美化),因此對像「什麼是 API「、「什麼是 JSON(以及爲什麼它比 XML 要好)」之類的問題有個最基本的瞭解是必須的。(若是以上所說的你有任何以爲很陌生的,能夠查看本文末尾「參考文獻」那一節的內容)。算法
一張網絡上描述前端和後端區別的趣圖。數據庫
後端。就是看不見的真理,道不清的故事了。在上古時代,瞭解 PHP 的話你就能夠宣稱本身是個後端工程師了,後來微軟引入了 ASP.NET,二者相互角逐,直到 Node.js 駕着七彩祥雲來到,整治混沌,讓一切各得其所。在 Node.js 中,事件驅動開發的概念被應用得淋漓盡致,所以若是你選擇了它,你就已經爲你的項目幫了一個大忙。編程
後端領域中很使人困惑的一個部分就是它的語言多樣性,就是說,你可使用任何你但願使用的語言來實現後端,但關鍵是:「後端」自己是個簡稱,它包含了「查詢數據庫、處理數據、響應客戶端,以及盡最大努力使得響應最高效」,這並不是你選擇了「對的」語言/技術/數據庫就搞定了的。有一些開發者選擇相似 MySQL 或 PostgrSQL 這樣的關係型數據庫,也有一些新入圈的開發者選擇了另外一種,就像 Cassandra 或 MongoDB。作出什麼樣的選擇固然取決於你了,但我有個簡單的法則。你的數據有嚴格的模式、而且在短期內不會發生改變?那就選擇關係型數據庫吧。你的服務每分鐘有超過數百萬的訪問量了?那就得切換到 NoSQL 了(切換過程很蛋疼)。你的產品變化得很是迅速?那就選擇 NoSQL。假如說你已經選擇好了數據庫類型了,那具體的數據庫你應該怎麼選呢?你喜歡微軟而且有 Windows 服務器?那就選擇 MsSQL。你喜歡 Oracle?那就選 Oracle 數據庫。你對 Oracle 以爲還行、可是同時又討厭微軟?那就選擇 MySQL。或者說你誰也不肯得罪?那就選擇 PostgreSQL 吧。
對 NoSQL 數據庫的選擇而言就略顯糾結了。這真的取決於你的後端服務和數據架構。你只有一些文檔而後它們之間的聯繫還很微弱?那就選 MongoDB 吧。你須要存儲一大堆的鍵-值對?那就選 Redis。你正在處理像圖這種結構的數據(Facebook 的好友關係圖,Google 的知識網絡圖,等等)?那就選 Neo4j。還不肯定你究竟須要什麼,但你以爲以上所說的你都須要?那就選 ArangoDB 吧。
數據庫存儲了全部必要的數據,同時你也應該定義一種 API,使得你的客戶端能夠經過它來請求對數據庫進行讀/寫。這裏更有用的選擇就是 Node.js。Facebook 選擇了 PHP 來做爲它的後端實現,而後他們又用 C++ 重寫了其中的很大一部分 PHP 代碼。有人使用 Python 但也有人更喜歡 Ruby。確實是這樣的,你能選擇任何語言來實現後端服務。好比說:Google 使用 C++、Java 和 Python(跟 Go 結合使用)。對於底層的數據處理,C++ 最合適不過了;對於後臺任務,像更新用戶的朋友推薦,Java 是個好的選擇;對於數據分析、天然語言處理或當今最流行的與人工智能相關的任務,你極可能會選擇 Python。
重申一遍,後端除了各類各樣的編程語言、框架、數據庫,還有一些你必須掌握的核心概念。
咱們將會討論桌面應用之因此爲桌面應用最相關的那一部分。桌面端有成千上萬須要特殊技能譜的桌面應用,例如 Photoshop 是處理圖片的,那麼若是你想開發相似於 Photoshop 這樣的桌面應用,掌握處理圖片的算法和技術對你來講就是必須的;若是你想開發相似於 Dropbox 這樣的應用,那麼瞭解套接字編程就是必須的;若是你想開發編譯器或像 Visual Studio 這樣的 IDE,那麼瞭解如何設計編譯器就是必須的。咱們不會討論這些特定的領域,咱們就探究一下你在桌面端開發中最可能使用到的語言吧。
當涉及到開發桌面端使用什麼語言的時候,開發者一般會很艱難地在 C++,Java 和 C# 之間進行選擇。我有一個簡單地法則來作出正確地選擇:若是你喜歡微軟,那就選 C#;若是你喜歡 Oracle,那就選 Java;若是你以爲一門編程語言不該該被某一個公司所擁有,那就選 C++。若是這個法則對你來講不那麼有效的話,咱們能夠再探討一下一些實際的子平臺。若是你的應用目標羣體只針對 Windows 用戶,C# 是最佳選擇,很明顯,由於它們都是微軟的產品,所以相互適配得很好。可能有些 C# 開發者堅持認爲自從 .Net Core 發佈以後,C# 也能夠在 Linux 環境下開發,但我我的建議若是你想你的產品覆蓋 Linux 平臺的用戶,最好仍是選擇 C++。決策點就是,開發 C++ 的初衷就是讓它做爲一門跨平臺的編程語言,也就是說它在任何操做系統下都可以運行良好(對的,包括 MacOS)。好吧,這裏所說的跨平臺假定了你必須在全部的操做系統上分別編譯、而且遷移應用程序的「各類」可執行文件到各類具體的操做系統。坦白來講,C++ 確實缺少圖形化用戶界面,最好的藉口莫過於「C++ 原本就是爲大神級開發者準備的,大神級的開發者一般都只用終端(命令行界面)」。不過,仍是有好心的開發者聚到一塊兒開發了 Qt,這但是完美兼容 C++ 的跨平臺圖形化用戶界面庫。
最後一點,若是你很煩 C++ 的複雜性,很煩爲了構建完整的圖像化用戶界面還不得不連接一個另外的像 Qt 這樣的庫,也很討厭爲了適配不一樣的操做系統的用戶而不得不在每一種操做系統上編譯、移植你的應用,那就選擇 Java 吧。Java 擁有本身的虛擬機,使得移植可執行文件很容易。你的應用將在全部安裝了 JVM(Java 虛擬機)的操做系統上完美運行。
當談到 Java 時,首先映入腦海的就是 Android 了。早在 Kotlin 問世以前,Java 就是開發 Android 應用的事實標準了。現現在,Kotlin 佔據了開發者的心裏,使得開發 Android 應用的體驗更好。所以,若是你想開發 Android 應用的話,你應該在 Java 和 Kotlin 之間進行選擇。爲了作出正確的選擇,咱們得看看幕後的真相。真相就是 Google 和 Oracle 不是很和諧,但 Oracle 擁有 Java,同時 Java 又主導了 Google 的 Android,所以爲了靈活不受限於人,Google 不得不向邪惡勢力(或者說正義,隨你怎麼說)低頭,引入了 Kotlin,而且僞裝說「哇,咱們支持這麼好用的編程語言,大家就別再用 Java 啦」。若是你剛開始 Android 編程的話,我我的建議你從 Kotlin 入門,儘管爲了在人才市場中提升競爭力你不得不爲用 Java 實現的舊應用提供一些支持,因此這時候學會 Java 就會爲你的簡歷增添一些亮點。
最後就是 iOS 了。所謂的 「iLand」(譯註:因爲蘋果大部分產品都以 i 打頭,原做者使用 iLand 表示蘋果的產品線),就是全然不一樣的故事了。很長一段時間內 Objective-C 都是 iOS 的主要開發語言,老實講,不是隨隨便便就可以掌握 Objective-C 編程的,它須要堅決不移的毅力,這就是爲數很少的 Objective-C 開發者的主要問題。蘋果公司最終總算邁出正確的一步,引入了 Swift。Swift 相比 Objective-C 來說要容易得多,這使得 iOS 開發者數量有所上漲。因此說要成爲 iOS 開發者,你得學習 Swift,但要成爲合格的開發者,我還建議你要掌握 Objective-C,由於你須要給之前使用 Objective-C 編寫的應用(有成千上萬這樣的應用)提供支持。
這裏不得不提一下 React Native,由於它使得開發者可以僅僅使用 JavaScript 就同時爲 Android 和 iOS 編寫應用,可是 React Native 做爲市場上一個新興且善變的角色,咱們就讓它刷一下存在感好了,若是你還會一些 JavaScript 的話,就權當你已經能編寫一些簡單的應用了。
編程領域中有不少基礎的概念。大部分技術面試目的都是發現你解決問題的能力以及是否瞭解這些概念,因此除了掌握一門編程語言以外,你還要熟悉這些概念,某種程度上講,這些概念在程序員的技能譜中是必須的。如下是我最近在 SoloLearn 上發佈的課程的概要,下面是 SoloLearn 的 Android 和 iOS 應用下載地址。
爲了成功爲技術面試作準備,你必須對如下的領域感到很是自信:
算法與數據結構 這是程序員最須要的技能譜。如下是每個程序員都必須熟知的:
算法複雜度:大 O 記法和如何計算算法複雜度;掌握如何根據算法的複雜度來比較算法的優劣,如 O(N) 和 O(logN) 孰優孰劣。
基本數據結構和適配器:數組、鏈表、棧、隊列。
排序與查找:掌握各類排序算法可以幫你定下項目的最佳可能實現。做爲練習,嘗試一下本身實現插入排序、選擇排序和歸併排序,而後找出線性查找和二分查找的不一樣點。
樹、圖:處處都有樹和圖的蹤跡,從 Facebook 的「朋友關係圖」,到 Google 的「知識聯繫圖」。
散列表/哈希表:史上最高效的數據結構,散列表老是一個好的選擇。你應該要可以本身實現一個散列表,並熟知解決哈希衝突的技術。
計算機組成結構與操做系統 強烈建議你要熟悉如下主題:
編程 你應該精通至少一門編程語言。知道你最喜好的那門編程語言的優點、劣勢以及最佳實踐總會幫你寫出更高效、更優雅和可讀性更強的代碼。 強烈建議你經過解決有挑戰的難題來練習編程,比方說(如下問題均可以在 SoloLearn 找到):
系統設計 瞭解面向對象編程是現代程序員的必備技能。 系統設計意味着要考慮整個系統、可以設計其架構、將其分解成一個個的類、定義對象之間的交互。 嘗試回答如下問題來對此作準備:
強烈建議你學習和使用正確的設計模式。好比你應該瞭解組合模式和裝飾器模式的區別。
儘管一般都只要求初級開發者擁有良好的解決問題的能力,你的第一份工做可能也不會要求你瞭解以上所列的全部點,但這個列表仍是能幫助你規劃之後的職業生涯。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。