作者丨SteelPh0enix
編譯丨諾亞
出品 | 51CTO技術(shù)棧(微信號:blog51cto)
“作為初學(xué)者,我應(yīng)該選擇什么語言?”
網(wǎng)上沖浪時,我經(jīng)常看到上面這樣的疑問。作為一個同樣在這個選擇上掙扎許久的人,我最終選擇了C++。我想,我可以就這個特定的選擇以及它如何影響我之后的學(xué)習(xí)談一下個人看法。
本文將圍繞以下四點展開:
- 這是個陷阱!
- 你為什么要這么做?
- 那么,還有什么其他選擇呢?
- 當(dāng)真正有意義的時候,再將C++作為首選
一、這是個陷阱!
通常來說,選擇C++作為你的初始語言并不是一個好主意。在用C++工作了很長一段時間,并嘗試了許多不同的編程語言之后,我覺得C++就像是用劣質(zhì)膠帶粘在一起的一團亂麻,不知怎么地仍然堅持著,甚至可能在最近的變化中朝著相對較好的方向發(fā)展,但對于初學(xué)者來說,真的算不上一個好選擇。
二、你為什么要這么做?
在大多數(shù)情況下,我總是會聽到一些具體的論點,試圖努力地證明選擇C++作為入門也不錯。比如:
1.它非???!
這是很常見的誤解。語言本身并沒有快慢之分。當(dāng)然,有些語言可以比其他語言更快地解析或解釋,但這并不意味著用語言A編寫的程序總是比用語言B編寫的程序快,反之亦然。一個好的做法是問自己“為什么?”和“什么時候?”為什么用A語言編寫的程序可能比用B語言編寫的同等程序更快/更慢?它在多大程度上對性能有意義?但這不是新手應(yīng)該關(guān)心的事情。一般來說,作為初學(xué)者,你不應(yīng)該關(guān)心“語言性能”,因為這是你在學(xué)習(xí)編程時最不需要擔(dān)心的事情之一。一開始,真正的性能主要取決于代碼中使用的數(shù)據(jù)結(jié)構(gòu)和算法,而不是語言的選擇。
2.學(xué)習(xí)C++會教你一些底層的概念,比如指針和手動內(nèi)存管理!
它的確可以,但是問題在于:你大多數(shù)時候不需要知道這些低級的概念來編寫軟件和學(xué)習(xí)編程。每天都有成千上萬的程序員在不知道指針是什么,或者如何手動管理內(nèi)存的情況下編寫出完美而有效的代碼。這并不是為了編寫工作代碼而必須知道的東西。這對你來說可能永遠(yuǎn)都沒有用。固然,知道指針和手動內(nèi)存管理在很多情況下是有用的,但對于初學(xué)者來說,這不是剛需,因為即使在C++中,你通常也不想手動管理原始指針和內(nèi)存分配。
3.游戲編程是在C++中完成的——通常伴隨著“性能”參數(shù)。
這個論點有時也站不住腳,因為有許多非常流行的游戲引擎提供了一種更適合新手的游戲開發(fā)方法。Godot是最好的例子之一,因為它有自己的工具集,可以使用自己的GDScript語言,也可以與其他語言和工具一起使用。我知道有很多人在使用C++進行游戲開發(fā),他們也有自己的觀點——相對接近硬件。但我仍然堅信,如果你想學(xué)習(xí)“編程”和“游戲開發(fā)”,這可能適得其反,因為在學(xué)習(xí)你真正想學(xué)的東西之前,它帶有“必須學(xué)習(xí)C++”的沉重包袱。
4.我懂一些C語言,所以C++只是一個擴展,所以我會學(xué)習(xí)它。
事實并非如此,這樣的想法會迫使你走上一條很難回頭的道路。注意,不要把C++看作是C的補充,因為這就像把龍看作是他珍貴的金山的補充一樣愚蠢。如果執(zhí)意如此,你將目睹你無法理解的恐怖。
四、那么,還有什么其他選擇呢?
除了C++之外,還有什么選擇?關(guān)于這個問題,我將根據(jù)個人觀點來回答,我也會努力解釋為什么我是這樣想的。
1.Python
有些人會告訴你Python很爛。然而,我要告訴你,我喜歡Python,因為它很少讓我失望。當(dāng)我需要寫一個簡單的工具來自動做一些事情,我希望它在任何地方都能工作時,Python 就是我的夢中情“語”。
它的長期支持、龐大的社區(qū)、包管理器和現(xiàn)有的工具使我很難不向初學(xué)者推薦這門語言。它的語法確實非常具體,有些人甚至?xí)f它很奇特,但是在使用它一段時間后,只有當(dāng)我不得不將代碼塊移動到不同的位置并手動修復(fù)每個縮進時,它才會讓我感到惱火。它甚至有類型提示和易于使用的工具,以確保你遵守鍵入規(guī)則,有些人可能會覺得非常有用。
不過,對于初學(xué)者來說,你很可能希望將重點放在龐大的PyPI存儲庫上,以便為自己編寫一些有用的東西。它的文檔也相對不錯,甚至有一個教程讓你入門,但如果你完全是IT新手,我建議你尋找一個更適合你的知識水平的入門教程,因為“官方”的教程不是很面向新手。
2.JavaScript
它是通往廣闊 Web 應(yīng)用程序世界的非常簡單的門戶,但不僅如此,因為現(xiàn)在你幾乎可以在任何地方插入 JavaScript......我個人不是這種語言的粉絲,但從我所看到的,我發(fā)現(xiàn)從 JavaScript 開始的人有一定的“自由”,可以在他們想要的任何地方使用這種語言。我更支持JavaScript作為初學(xué)者,而不是C++,但是要注意這種語言自帶的許多陷阱。這基本上適用于任何語言,但大開發(fā)不會告訴你這一點!
3.Kotlin
如果你想學(xué)習(xí)Java,不管你有什么緊迫的理由,盡量放棄Java,學(xué)習(xí)Kotlin吧!如果你想制作Android應(yīng)用程序,并且你更愿意使用官方工具而不是一些web開發(fā)工具,Kotlin就是你的理想之選。它的Java遺產(chǎn)使它成為一種相當(dāng)不錯的入門語言,因為你既有一門漂亮的現(xiàn)代語言,也有很好的現(xiàn)代語法和有用的功能,使用起來非常愉快,還有一個龐大的庫存儲庫,其中一些庫在Kotlin出現(xiàn)之前很久就編寫了。我很少使用這門語言,但我?guī)缀跸硎苁褂盟拿恳豢獭?/p>
4.C
你想和你的硬件保持密切的關(guān)系嗎?如果是,這就是一門合心意的語言。平心而論,C確實缺乏真正的泛型,但這并不妨礙人們現(xiàn)在使用它。
這份清單絕不是全面的。有很多被認(rèn)為“適合初學(xué)者”的語言沒有出現(xiàn)在這個列表中,只是因為我從來沒有使用過它們,或者工作了太久,以至于我的知識儲備已經(jīng)不適應(yīng)其當(dāng)前的發(fā)展?fàn)顟B(tài)(比如C#,我想說點什么,但我真的不能)。
請注意,我在這里的重點是推薦一種相對容易學(xué)習(xí)和使用的語言,基本標(biāo)準(zhǔn)是它有一個大的社區(qū)和大量的學(xué)習(xí)資源。C++在這些方面都缺乏,這使得以“正確”的方式學(xué)習(xí)現(xiàn)代C++變得異常困難。而且,公平地說,這使得在C++中做任何事情都變得不合理地復(fù)雜和痛苦。
曾經(jīng)嘗試過從頭開始設(shè)置具有自動單元和集成測試的C++項目嗎?我做了,但都以失敗告終。不是因為這是不可能的,而是因為我寧愿選擇一種支持開箱即用的語言(至少是單元測試)。
四、當(dāng)真正有意義的時候,再將C++作為首選
任何規(guī)則都有例外,當(dāng)然也包括我的“不允許初學(xué)者使用C++”規(guī)則。
對我來說,最明顯的例外是把嵌入式編程作為你想做的事情。這也是為什么C在我的列表上的原因——因為C比C++簡單得多,所以它開始可能是一個更好的主意。但是,如果你想使用Arduino,就像現(xiàn)在大多數(shù)初學(xué)者一樣,只堅持使用C沒有什么意義,因為你已經(jīng)可以訪問C++中功能強大且相對易于使用的功能(并且可能必須使用,這取決于你使用的庫)。當(dāng)然,你可能沒有標(biāo)準(zhǔn)庫及其花哨的功能(我認(rèn)為這是一件好事),但你仍然擁有模板、lambda表達式、constexpr和許多更酷的功能。如果你想擺弄硬件,那么學(xué)習(xí)C++對你來說可能是不可避免的。
另一個明顯的情況是“你必須學(xué)習(xí)它,因為學(xué)校/大學(xué)/工作/我和一些C++開發(fā)人員一起做的業(yè)余項目”?;蛘吣憧赡苤皇欠浅?、非常、非常強烈地、奇怪地專注于學(xué)習(xí)C++。對此,我沒有解藥。我只有一個建議:盡量堅持使用現(xiàn)代的資源,不要被過時的、早于C++11的教程和那些名聲可疑的書籍所吸引。
而且我真的想不出還有什么其他的情況能讓C++真正有意義。
不久前,我曾說OS-dev是一個很好的利基,但你也可以用C來做OS-dev,還有別忘了Rust,如果你問我的話,我認(rèn)為這比C++更明智。借用檢查器可能很難,但它就在那里,永遠(yuǎn)不會離開你。你想從C或C++中得到同樣的承諾嗎?還是自行配置吧。而且它還不如Rust為你的代碼所做的一半好。圖形編程和游戲開發(fā)?是的,也許吧。如果你仍然年輕天真,這聽起來是個不錯的選擇——你甚至可能毫發(fā)無損地走完這條路。但話又說回來,你可能不會。我還是會先看看其他的選擇,因為很多人用C++做,并不意味著你也必須用C++做。
我可能聽起來像一個非常討厭C++的人,說實話,也不盡然。我花了好幾年的時間學(xué)習(xí)這種語言,其中一半的時間我都在與它抗?fàn)?。我會后悔?我很后悔沒有早點改變方向,但我想說的是,我從C++中學(xué)到的很多東西在某些時候都很有用。我能在學(xué)習(xí)不同語言的同時學(xué)習(xí)這些東西嗎?是的,其中一些,但不是全部。
如果我可以重新開始我的旅程,我會選擇不同的道路嗎?當(dāng)然,我會直接跳到Python或web開發(fā),但考慮到我的興趣和專業(yè)領(lǐng)域,我最終還是會選擇C++。
我也不是說永遠(yuǎn)不應(yīng)該學(xué)習(xí)或使用C++。它有自己的東西,有一定的通用編程經(jīng)驗和建立軟件項目的經(jīng)驗,就有可能使用它。但是你首先需要這些經(jīng)驗和知識,與其他可用的方法相比,在C++上一條道走到黑可能無助于你獲得這些知識。
參考鏈接:https://steelph0enix.github.io/posts/choosing-first-language/?ref=dailydev