2020 年的今天,如果你是一名開發(fā)人員,那么你可能看到一些包含大量技能要求的職位招聘描述。以下面一份 Indeed 網(wǎng)站上的真實招聘要求為例,它列出的技能不少,甚至閱讀期間都要中途休息一下。
職位描述:
- 有使用 Jenkins 和 Terraform 管理 AWS 基礎(chǔ)架構(gòu)的經(jīng)驗;
- 有 AWS 服務(wù)的相關(guān)經(jīng)驗(ECR、Lambda、SQS、CloudWatch、Route53);
- 用 Elixir、Python 和 JAVA 進(jìn)行過實際編程;
- 熟悉支持工具(Docker、Git、Bash、AWS CLI);
- 具有通過 ETL 和 asynchronous pipelines 進(jìn)行生產(chǎn)環(huán)境開發(fā)的經(jīng)驗;
- 熟悉關(guān)系型數(shù)據(jù)庫(Postgres/RDS)和 nosql 數(shù)據(jù)庫(DynamoDB);
- 具備積極參與設(shè)計復(fù)雜系統(tǒng)的能力;
- 熟悉生產(chǎn)環(huán)境網(wǎng)絡(luò)運(yùn)維者優(yōu)先;
- 了解機(jī)器學(xué)習(xí)原理,擁有 NLP 經(jīng)驗,有 Kaggle 競賽經(jīng)驗者優(yōu)先;
- 有數(shù)據(jù)科學(xué)開發(fā)庫(Scikit、NLTK、Gensim、TensorFlow、Keras)的經(jīng)驗。
你具備所有這些技能嗎?
顯而易見,這份工作是在尋找一個“多面手”,既是軟件工程師、數(shù)據(jù)工程師,又是機(jī)器學(xué)習(xí)工程師和 DevOps 工程師。從某方面說,這個要求有點(diǎn)“荒謬”。
現(xiàn)在的軟件工程師真需要掌握所有這些技能嗎?說句實話,差不多。這其中的很多技術(shù)都只是第三方工具。如果你是一名軟件工程師,那么你很可能在某些情況下用過這些技術(shù)或與之類似的技術(shù)。
在我看來,招聘經(jīng)理認(rèn)為你不能勝任工作,僅僅因為你用過 MySQL 但從未在 RDS 上使用過 MySQL,這非常荒謬。總而言之,幸好有 AWS、Docker、NagIOS 等技術(shù)和服務(wù),現(xiàn)在設(shè)計、開發(fā)、部署和監(jiān)控軟件的工作變得更簡單。
所以,現(xiàn)在的軟件工程師需要與時俱進(jìn),保證自己的技能不會落伍。以下是開發(fā)者應(yīng)該在今年開始學(xué)習(xí)的五項技能。
1. 云服務(wù)

不僅大企業(yè)在使用云服務(wù),現(xiàn)在連小型企業(yè)都在用云。云服務(wù)不僅有助于減低企業(yè)整體運(yùn)營成本,而且能幫助客戶更高效地處理運(yùn)維工作。
然而,隨著這項新技術(shù)的出現(xiàn),開發(fā)人員也需要學(xué)習(xí)相應(yīng)的新技能。但是,要跟上這個領(lǐng)域的所有技術(shù)趨勢,還要學(xué)會用各種方式來運(yùn)行代碼、存儲數(shù)據(jù)和托管基礎(chǔ)架構(gòu)。這看起來是一件不可能的事。
很多時候,我們感覺自己終于摸清一個云服務(wù),卻發(fā)現(xiàn)有另一個云可以替代它,或者服務(wù)又添加了新功能。既然如此,我們至少應(yīng)該了解哪些技術(shù)?
AWS、Azure 和 GCP:提到云服務(wù),AWS 在美國擁有最大的市場份額,它可以說提供了最廣泛的服務(wù)種類,從 IaaS、PaaS 和 SaaS 無所不包。它提供了 S3、RDS、 Redshift 和 DynamoDB 等數(shù)據(jù)存儲服務(wù),以及 EC2 和 Lamda 等計算服務(wù)。雖然 Auzre 和 GCP 仍然落后于 AWS,但是它們的使用量都在快速增長。這就意味著開發(fā)人員需要掌握更多技能。
2. 容器化

在軟件世界,熟悉容器變得非常重要。簡而言之,容器將代碼及其依賴項打包,以便可以在不同的環(huán)境中可靠、高效地運(yùn)行。
容器化是指將一個應(yīng)用程序與它需要的庫、依賴關(guān)系和配置文件打包在一起,以便在多個計算環(huán)境中有效運(yùn)行。
無論是本地環(huán)境還是云環(huán)境,都可以輕松地部署基于容器的應(yīng)用程序。市面上有很多容器技術(shù)的代表,最突出的要數(shù) Docker。如果你想了解更多關(guān)于 Docker 的信息和 Kubernetes ,你可以看看這個 YouTube 視頻。
3. 應(yīng)用程序和服務(wù)器監(jiān)控(Nagios)

對每套系統(tǒng)、每個網(wǎng)絡(luò)和每一片基礎(chǔ)設(shè)施進(jìn)行監(jiān)控,這是非常困難的,尤其考慮到現(xiàn)在的應(yīng)用程序被用在許多不同類型的硬件上。
Nagios 監(jiān)控是一種開源技術(shù),它可以幫助監(jiān)視 DevOps 中的應(yīng)用程序和業(yè)務(wù)流程。Nagios 幾乎可以監(jiān)控一切,從 HTTP、SSH、SMTP、內(nèi)存使用、微處理器負(fù)載到服務(wù)器等。只要你能說出來個類型,Nagios 就能進(jìn)行監(jiān)控。
在 2020 年,開發(fā)人員將需要使用 Naigios 這樣的框架,以打造一個全天候的監(jiān)控系統(tǒng)。這意味著我們需要熟悉像 Naigios 這樣的工具,才能成為一名高效的開發(fā)人員。
4.Jenkins,Bamboo CI/CD

許多工程師新人可能不知道,一個沒有 CI/CD 的世界是什么模樣。但是,這并不是說很多傳統(tǒng)的 deployment shops 不存在了。然而,使用 CI/CD 等輔助工具的趨勢將持續(xù)增長。
很多公司都在研究或使用關(guān)于 CI 的第三方工具,其中有兩個很好的例子就是 Jenkins 和 Bamboo。Jenkins 是一個開源工具,而 Bamboo 則是一個商業(yè)工具。
Bamboo 提供了很多功能,這些功能通常取決于你的預(yù)算,并且很容易與 Jira 和 Bitbucket 集成。但是,這三者的結(jié)合創(chuàng)建了一個可以幫你輕松部署代碼,并提供檢測代碼中的錯誤等功能的 CI/CD 系統(tǒng)。
Jenkins 是一個持續(xù)集成(Continuous Integration)開源服務(wù)器,它具有編排和執(zhí)行一系列操作的能力。Jenkins 可以在 JAVA 的幫助下執(zhí)行,并具有監(jiān)視項目和檢測可能出現(xiàn)錯誤的能力。Jenkins 的檢測率相當(dāng)高,這也是其迅速普及的原因之一。關(guān)于這些工具的更多知識請參考此處。
5. 數(shù)據(jù)庫

作為一名開發(fā)人員,了解數(shù)據(jù)庫和數(shù)據(jù)存儲系統(tǒng)的各種選項是個人技能的一個重要組成部分。選擇如何在后端支持應(yīng)用程序的決策會顯著影響性能和功能。
長期以來,大多數(shù)應(yīng)用程序的數(shù)據(jù)庫選項都局限在應(yīng)用程序端的關(guān)系型數(shù)據(jù)庫上。然而,隨著服務(wù)器和計算機(jī)的存儲能力和性能提升,現(xiàn)在已經(jīng)出現(xiàn)很多新型的數(shù)據(jù)存儲系統(tǒng)。
DynamoDB
例如,DynamoDB 是一個與標(biāo)準(zhǔn) MySQL 實現(xiàn)非常不同的數(shù)據(jù)庫。DynamoDB 使用它所稱的屬性、條目和表作為用戶經(jīng)常使用的核心部分。它允許開發(fā)者自由使用非結(jié)構(gòu)化數(shù)據(jù)集,這種數(shù)據(jù)集并不總是需要相同的值。
此外,還有像 Hadoop/HDFS/Hbase 這樣的技術(shù)棧,它們也允許更少的結(jié)構(gòu)化和更分布式的數(shù)據(jù)存儲。所有這些只會讓開發(fā)人員的工具箱變得更加復(fù)雜。
傳統(tǒng) RDBMS
就算有這么多的新型數(shù)據(jù)系統(tǒng),也并不意味著你可以忽略傳統(tǒng)的 Mysql 和 SQL Server 等關(guān)系型數(shù)據(jù)庫。使用 RDBMS 為應(yīng)用程序設(shè)計數(shù)據(jù)層仍然是一種非常流行的方法。所以不要忘記提高 SQL 和數(shù)據(jù)建模技巧。
編程語言
作為一名程序員,你仍然需要知道如何編程!但是用哪些語言呢?
編程語言是開發(fā)人員賴以生存的基礎(chǔ)。大多數(shù)開發(fā)人員在這個行業(yè)工作幾年后就已經(jīng)掌握多種編程語言。
如果你是新手,那么你可能需要研究 Python 和 JavaScript。這兩套語言在大多數(shù)工作中都被廣泛使用。當(dāng)然,這并不是說,像 Java 和 C++ 這樣的語言已經(jīng)沒有自己的位置。
至于工作崗位的需求,你可以從下面圖表中看到,需要 Python 和 Javascript 的工作崗位都在增加。

來源
為什么選擇 Python?
之所以每個人都傾向于 Python,是因為它既簡單又很擅長處理大多數(shù)問題。現(xiàn)在,它已經(jīng)不允許通過 C 或 C++ 進(jìn)行調(diào)優(yōu),也不能作為原生 Web 語言。然而,它在各種事情上都處理的還不錯。幸好 google 在諸如 Tensorflow 庫等方面的工作,Python 經(jīng)常與人工智能、機(jī)器學(xué)習(xí)等最新技術(shù)相聯(lián)系。
如果想快速編寫一個網(wǎng)站,你可以很容易地使用 Django 和 Flask 來作為后端。這比試圖配置一個 Spring 框架要容易得多。Python 很容易支持并行計算,這減少了組織數(shù)據(jù)的麻煩。而 Pydoop 是一個 Python 的集成庫,可以讓我們在 HDFS 集群的幫助下處理數(shù)據(jù)并表示出來。
隨著更多支持 Jupyter 筆記本工具的開發(fā),Python 在數(shù)據(jù)分析領(lǐng)域也占有一席之地。在我看來,Python 如此流行主要?dú)w于其多功能性。
無論你是數(shù)據(jù)科學(xué)家還是開發(fā)人員,你都能使用 Python 作為開發(fā)網(wǎng)站或機(jī)器學(xué)習(xí)建模的工具。針對你想學(xué)的東西,網(wǎng)上有很多的免費(fèi)資料。例如,這里有一個很棒的 YouTube 播放列表。
React.js

React 怎么樣?無疑,它讓前端開發(fā)變得非常簡單。例如,使用 DOM API 可能是一件痛苦的事情。不過,React 為開發(fā)人員提供了在虛擬瀏覽器上開發(fā)的能力。本質(zhì)上,這個虛擬瀏覽器是開發(fā)者和真實瀏覽器間的聯(lián)絡(luò)器。
關(guān)于 React.js 的另一個著名概念是可重用組件。在 React 中,應(yīng)用程序由所謂的組件構(gòu)成。有許多不同種類的組件,目的都是創(chuàng)建可以很容易移植到應(yīng)用程序中的代碼片段。
最后,React 的單向數(shù)據(jù)流非常好用,因為組件不允許在 ReactJS 中更改,而且組件中的數(shù)據(jù)具有相同屬性。當(dāng) ReactJS 監(jiān)聽從上游流出的數(shù)據(jù)時,組件會平穩(wěn)運(yùn)行并保持同步。這個特性實際上讓 ReactJS 非常適合構(gòu)建用戶界面。
小結(jié)
說實話,軟件開發(fā)領(lǐng)域,新技術(shù)不斷出現(xiàn),開發(fā)者要學(xué)習(xí)的東西越來越多。有時候,軟件開發(fā)人員的職位描述看上去要一個人能干一個開發(fā)團(tuán)隊的活,從 DevOps、數(shù)據(jù)庫管理到后臺和前端開發(fā),甚至無所不包。