該不該放棄學了四個月的Haskell,轉去學C++?
我是帝都某211的大一生,機械工程專業,從開學時開始接觸編程(自學),我選了Haskell作為入門語言,到現在有四個月,現在我面臨著兩條路。
1.放棄學了四個月的Haskell,現在轉去學C++;2.繼續學習Haskell,下學期跟著學校的安排來學C++。之所以有放棄Haskell的打算,原因有兩個1. 我想免修掉學校下學期安排的C++課程。時間還有兩個月,我覺得自己可以去試試,就算失敗了也無所謂,但是如果成功了,下學期可以省下不少時間(每周四節課)
2.可以用C++刷演算法題目。我有參加ACM的打算(主要是認為比較能鍛煉人),目前都是在用Haskell寫一些基礎的演算法題目,但是比賽並不支持Haskell。我感覺自己學了四個月的Haskell,沒有入門。。我教材是Haskell趣學指南,沒有學到applicative函子和Monad,構造類型和類型類也不太熟。雖然如此,但是感覺自己還是收穫不少的,可以實現一些基本的演算法,比如快排,歸併,最大子段和,快速冪,矩陣乘法。在大學階段的夢想是去微軟或者谷歌等公司實習,見識那些令人驚嘆的產品是怎麼製造出來的,以及參與到其中的建造。目前的感覺是,好迷茫,不知道自己要怎麼辦,望前輩和大神們指點,十分感謝!!
Haskell 是一門開拓視野的好語言。有一些思考問題的方式單靠經驗的積累是無法突破的,而一旦打開視野,才會反過來覺得不這麼思考問題才奇怪。比如處理一個列表,怎能不用 map/filter 這類列表工具函數?然而在過去這對有經驗的 C++ 工程師而言,是不可能想像的。假如我工作多年之後,經驗已經固化成了束縛我思考的、按部就班的牢籠,這時學習一下 Haskell,可以跳出一些思維困境,打開一片新視野,到最後不一定在工作中應用 Haskell,但是可以吸取一些養分,比如盡量避免副作用使自己的函數更容易測試、藉助 Monad 來更好的理解 Promise 這類非同步工具的設計考量。
不過適合開拓視野,並不一定意味著適合初學。初學編程階段最好先能有一個較快的反饋迴路,能夠通過小作品培養起興趣,做做網站也好,做做iOS應用也好,做做演算法題也好,然後可以針對性的發現一些需要打的基礎,比如數據結構、操作系統、資料庫原理、計算機網路,把大學裡打基礎的寶貴時間放在這些上面,絕對是超值的,到工作之後經常會感嘆某些基礎打的不牢,然而回頭補起竟是何等的奢侈,業餘的精力總會更多的分配在能幫助解決手頭問題的實用技術上。
在打基礎的階段接觸小眾技術,有大家一起學習一起探索的樂趣,也有得不到正確反饋的危險,既然是小眾技術,就很少有人能通過實際應用來告訴我們學習效果的好壞,很多時候大家都是一知半解,更糟糕的是,大家都一知半解的小圈子裡相互捧一下,可能就容易走偏了。
利益相關,haskell 趣學指南譯者。@閱千人而惜知己說得很在理了,說點其他的吧。。我覺得除了些「不要放棄」的鼓勵以外,咱們Haskell社區可以開坑造一些輪子幫助初學者。。
比如,一個像樣的Online Judge。我用過的支持Haskell的OJ里,最接近理想的是HackerRank,除了普通演算法題以外還有很多有趣的FP相關題目,循序漸進能堅持做下來對學習Haskell(或者任何一門函數式語言)頗有助益,然而運行環境不理想(ghc版本停留在7.8.3,不少常用庫也沒有),另外Haskell初學者寫一些trivial的演算法程序時,會花很大力氣在跟IO打交道上,耗費無謂的精力。一個理想的Haskell OJ應該做到:- 使用最新版的編譯器和系列庫
- 提交程序無需main :: IO (),而是main :: Input -&> Output,Input和Output的定義依題目而異
- 對於需要IO的場合(比如文件讀寫、網路訪問等相關題目),提供一個假的IO monad,虛擬出一個sandbox給程序運行。這樣可以出一些實現資料庫、網路爬蟲之類的題目,而不僅是簡單的演算法題
- 題目方面,除了像HackerRank那種多種類、多檔次的題以外,我覺得Clojure Cookbook是個不錯可以參考的例子,既有熟悉語言特性的部分,也有解決real world problem的部分
-我Haskell整整學了6年才敢說自己入門了,你剛剛學4個月就想放棄了,你目前所在程度可想而知。但是自學到這樣已經比較厲害了。 畢竟不是人人都是唐鳳一級的大神。
你不應該放棄學Haskell,原因有如下兩條:
未來工作了,我保證你大部分時間都是在跟非純函數式語言打交道,你未來工作再花時間在學Haskell上的可能性幾乎沒有。而其他語言你有大把的機會精進。
我一位老師告訴我,大學裡一定至少精通一門函數式,一門順序式,現在我知道了為什麼了,因為如果你同時學了兩種思想,我向你保證今後老闆,或者你自己要使用任何語言你都應付的來。而Haskell有著獨一無二的美感,做為引你進入函數式的語言十分適合。
演算法:勸多讀演算法導論,構造方法一類的書,學習其中演算法思想,分攤,分治,動態規劃,什麼NP問題,複雜度分析。少去花大量時間刷題,不是正路。應多思考,其他人在考場上做出來做過的題沒啥可顯擺的。當年我們一周會用一下午一般跟老師只搞透一個問題,這就是為什麼有人考我演算法我可以想得出來,而他們要去琢磨答案的原因,演算法導論700頁,組合數學都不是白看的。刷題能幫你提高成績,但若不側重思想統統白費,也許這就是為什麼國內CS教學水平比國外差的原因吧。另外真心不覺得ACM能說明啥問題,當然當個智力遊戲玩玩挺好,面試也有幫助。
最後,題主可能剛入大學不久心高氣盛,想壓榨自己,努力學出成績的心情我特別理解,我自己當年何嘗不是呢,大學假期把下學期的課提前學好,當年在高中為了一天能多做一套數學卷子午餐只吃牛奶麵包速度解決,最後夏天中暑,老師由於我學習過於努力而不准我上課,強制我休息。我要告訴你的是,在大學安排好生活,吃好睡好,鍛煉好身體,能帶著好心情學習遠遠比學習本身重要。入了大學,要先會生活,生活不再是沖百米了,而是馬拉松,要循序漸進,放平心態,量力而為。
引用句話:夫惟不爭故天下莫能與之爭。
有Haskell問題可以找我。不需要放棄,你只需再花一點時間學會Haskell(我大概也就用了半年入了門,所以你也不用慌張),然後從C++的模板元編程開始(你就會覺得簡直就像在寫Haskell),然後再學C++的其他部分。事半功倍!
不過題主也不一定非要學C++維持生計,因為用Haskell的都是歐洲的高薪職位啊。反對最高票的答案。知乎上活躍著各種大牛程序員,作為一名計算機初學者,我感覺非常開心。但你對某種語言有自己的熱愛,甚至是信仰,這是你自己的事,你這麼強行安利別人感覺誤人子弟。
「未來工作了,我保證你大部分時間都是在跟非純函數式語言打交道,你未來工作再花時間在學Haskell上的可能性幾乎沒有。而其他語言你有大把的機會精進。」
既然Haskell在目前的應用並不廣泛,我為什麼不把時間騰出來話在其他的更使用的語言上呢?題主本身也不是CS科班出身,目前來說寫程序只是個興趣,學下去將來也許只是個謀生的手段,為什麼不把時間優選放在想C++這樣子比較主流的語言上,比起Haskell,將來也更容易找工作呀。要是題主真的有興趣了,在花時間在Haskell上也不遲啊。
「我一位老師告訴我,大學裡一定至少精通一門函數式,一門順序式,現在我知道了為什麼了,因為如果你同時學了兩種思想,我向你保證今後老闆,或者你自己要使用任何語言你都應付的來。」
我把時間更多的花在C++上,以後C++超厲害,老闆也一定會喜歡。。。
「刷題能幫你提高成績,但若不側重思想統統白費,也許這就是為什麼國內CS教學水平比國外差的原因吧。另外真心不覺得ACM能說明啥問題,當然當個智力遊戲玩玩挺好,面試也有幫助。」
國外學校確實不重視你做沒做演算法題,可國外公司重視啊。。。 GPA大部分時間都是拿來安慰自己的,真正找工作的時候還不是突擊一下Leetcode…
Haskell本身和Java,C++這些語言相比就屬於小眾,網路上的資料不多,本身就不太適合自學。而且函數語言的邏輯方式本來就和非函數式差距甚遠,就算精通,將來想學第二門語言的時候也不可能做到觸類旁通。
我喜歡寫程序,但我的生活不止只有代碼。很多事情,我們花兩成的時間,就能掌握八成,而想要掌握最後的那兩成,卻需要花費我們八成的時間。我敬佩你能把十成的精力獻給寫程序,但我更想嘗試更多的事情。
兩個都學不會有什麼問題的。要是你想以編程為生,要學的語言還多著呢,比如java,python之類估計是跑不掉的!
作為工科生,C/C++不學畢不了業吧。我也來分享一下自己的 Haskell 臨時文件夾,希望能夠給樓主一些啟發。所謂臨時文件夾就是用來存放平時看到或者想到的一些有趣的小玩意,所以比較的雜亂,但是從難度上來看是循序漸進的。可以看到學 Haskell 就像玩兒 EVE,學習曲線陡峭,初期進展緩慢,極易棄坑。但是學到了東西就一定會有好處,等過一段時間回來之後,還是能接著繼續學。甚至會出現多次棄坑和多次回歸的情況。很多情況下,學 Haskell 並不需要完全了解一些抽象的概念——直接拿來用具體的一些庫的功能,然後慢慢再潛移默化地了解這些抽象的概念,我覺得是一個更直觀的方法。
在我使用過的 C C++ Java JavaScript Python Lua C# F# Scala Rust Haskell 語言當中,的確 Haskell 還是最為吸引人的。Coq, Prolog 以及 Erlang 當然也接觸過,但是用的時間只有幾天,經驗並不足,不好評價。既然你用Haskell入門了,那就持續的學下去,並且在熟練使用之前不建議你更換語言。你才大一,要從長遠考慮。
Haskell入門。。。。。。
對於初學者來說,Haskell入門難度略高。而且看題主描述來說,好像並沒有入門。
某種語言入門了和編程入門了是兩個概念。
題主要是編程入門了就不會來問這種問題了。
因為程序語言僅僅是一種邏輯描述的符號約定而已。。。。。
同時掌握十幾種語言也不是什麼難事。不存在放棄什麼學什麼的。你要真想當一個程序猿,那你都得會。
不過類C編程語言對程序猿來說可是基礎,大量的常用編程語言都是這種類型(C/C++/C#/Java/JS/OC etc.),學C++可以多花些工夫。===update====
剛才沒有仔細讀題目。答案發了以後我又仔細看了遍題,題主說:「我想免修掉學校下學期安排的C語言課程」。強調一點,C和C++是兩種語言。C++只是兼容C。我來講一個故事。
我大一的時候C語言實訓課程考試,是機考,用PC^2實時打分,限制只能用C語言。我邊上坐了一位「編程大神」,就是學校里那種人人覺得他編程特好,啥編程問題都去找他的那種人。大神精通C++,高中時候就用MFC來做遊戲了,所以他其實根本沒來上過C語言實訓課程,直接來考試的那種(估計C語言教學課程他也沒上,我校必修課的免修規定是學生向老師申請免修後可不來聽課,但需和普通學生同時參加考試,以考試成績的100%作為課程結業成績,非免修學生大概是60%考試+40%平時成績)。
這門必修課是面向全體學生的而非計算機系,所以難度可想而知。前幾道題都很簡單,大神憑藉著自己高超的C++技巧快速通過了,然而卻在第四題開始踩坑。第四題是讓你計算一個東西,結果需要保留3位小數輸出。。。大神抓瞎了。。。不斷的問坐在邊上的我printf怎麼用。第五題,大神不斷的問我malloc和free怎麼用。第六題,大神在一個for循環里糾結,WA了十多次。。。。。。。一個星期後,成績發表,大神C語言掛了。從此在班裡淪為笑柄。(不要問我為啥沒幫他,我做完第十二題離開機房的時候,他還在第六題那WA著呢。)6本科同為機械專業,編程全靠自學,現在是職業程序員了.不建議繼續學Haskell.主要理由有如下這些:
Haskell是Hard模式的語言(我沒有學過,純屬看一些文章等做的判斷),初學,尤其還是非科班的學生,不應該把大部分精力用於學一門語言上,應該在大學這個黃金時間把其他編程相關的知識一起完善,如數據結構/演算法/編譯等等,語言的學習,最好選擇實用的,而不是把大部分精力放在一門語言的學習上.如果選擇的語言很難,給你帶來的挫敗感很大,初學應該以激發興趣為主.
另外,即使在工業界,Haskell也不是實用廣泛的語言.
鼓吹學習Haskell語言的幾位,據我了解,也不是以這門語言為第一門學習的編程語言。
兩個一起學啊。
找個oj,每道題先用Haskell寫一下,再用C++寫一下。注意先後順序不要顛倒,因為Haskell有更具體的風格和idioms,有助於養成良好的組織代碼的習慣和減少bug。然後C++補充的是吃飯的傢伙,主要是語法和標準庫啦,不玩模板的話並不難。而競賽也用不到那些。其實模板也不難啊,C++ concepts正好和Haskell type class一起學什麼的。。
想當年我刷題就是只寫Pascal(後來寫C++),代碼和很多ACMer一樣,ad-hoc,bug也多,調起來也費勁。要是當時懂點類型系統(而不是到處甩int和數組)和函數式風格介面,bug要少不少。
當然競賽是鍛煉不到你的抽象能力的 - C++有class,virtual function和template;Haskell不是很了解,有algebraic data type和type class吧,gadt什麼的大概也比較潮。。但是這些等工作之後再練無妨。
ACM對於研究人員來說幫助大不大我不知道,但是對於工程來說幫助極大。我見過太多大公司程序員不懂用基本演算法和數據結構建模了,典型如用拓撲排序實現make,最長公共子序列實現diff,clang-format也有reduce到最短路徑的問題。更不要說各種工程在重新發明各式各樣的dfs和bfs了(因為那些程序員腦子裡一下子裝不下一個演算法)。能熟練對實際問題建模絕對是秒殺工業界芸芸眾生的好辦法。
工程(C++),理論(Haskell)和演算法建模(ACM)這三件事做成兩件應該就能出來見人了,做成三件就算優秀了。繼續學習 Haskell 的理由 @閱千人而惜知己 已經說得很清楚了。不過我不太同意他的「自學到這樣已經比較厲害了」:個人認為四個月還沒開始碰 functor、applicative、monad 這些東西,有些慢。題主你也提到,你用 Haskell 刷了很多基礎演算法題,你列出來自己會寫的東西也挺多的,但是這些與 Haskell 建立在類型系統上的一組抽象其實是完全垂直的兩個分支。我不清楚題主是不是有對類型系統的一些好玩的東西有抵觸,但我建議題主從現在開始什麼題都不刷,直接干 monad——當然,先從 functor、applicative 開始——再去了解一些好玩的類型系統上的東西,比如說 higher rank types,lens,recursion scheme……再回去慢慢刷題。
@vczh看你乾的好事
同意一些回答里說的 4個月還只能算開始 我感覺繼續學好點 下學期C++也可以跟著學 趁在學校多學點 不是什麼壞事 不過一學期c++課也同樣只能徘徊在門口
又不是搞對象一次只能搞一個。。。
四個月。。
haskell是我們functional programming的必修課 我水了整個學期的課 考試前三天過完了Graham寫的programming in haskell 能寫一些簡單的parser 差不多就是應付考試的水平至於快排歸併之類的簡單演算法在haskell里就是一兩行的問題。。
我只能說題主確實沒有入門
但
我說這麼多廢話不是來吐槽你能力不行
大一新生非計算機專業自學到這個水平已經很不錯了問題在於程序語言只是工具 真正有價值的是思想 計算機的組成及工作原理 數據結構和演算法這些基礎 不論你用什麼語言什麼語法 最終都是用這些思想去解決問題 學haskell最大的價值在於函數式編程的思想 就像java之於面對對象編程的思想
你問的這個問題
我感覺比較像「高數入門計算器用卡西歐還是德州儀器」鑒於你不是計算機專業 如果只是選擇工看應用範圍就好 機械工程領域毫無疑問選擇c++
還有不知道你們免修標準是什麼會c++不代表會c學Haskell 如同學習抽象世界的語言
用Haskell編程如同與抽象世界的精靈對話
簡潔優雅,純粹,至雅,是不錯的愉悅多門語言可以同時學。千萬不要停留在書本。每天堅持寫半個小時程序。紙上得來終覺淺,絕知此事要躬行。
每個人情況都不同,要學會根據自己目前的狀況來調整。假如 Haskell 覺得困難,可能是有一些背景知識你還沒有掌握,不妨先去學學其他語言,以及基本的數學知識。
我過去的體驗是,開始學一個東西的時候,如果它所依賴的知識恰好都掌握了,那學起來就非常順暢。如果學著學著發現有困難了,那就是有依賴的知識還不會。所謂有高人指點,其實就是按照一個最小依賴的順序來學習。而自學一般都是一個螺旋上升的感覺。奇怪的問題.應該學習C++;不應該放棄Haskell.我沒有見過誰放棄微積分去學習複變函數.這個回答不能幫你去MS或者Google, 你可以不採納.
c++我寫了10年,今年10月開始學haskell,趣學指南我看完了。我覺得haskell是一門起點很高的語言,看完一本趣學指南真是遠遠不夠。起碼你還得了解下lamda演算,cps,甚至接觸一點點範疇論。以前我接觸的任何一門語言都不需要這些東西。就算大坑巨多的c++,你都完全不需要這些東西,就可以開始做產品了。haskell的好處就在於,它強行拓寬了你對編程語言的知識面,有些知識,以前想到過,甚至用到過,但那時只是個想法,不知道它叫什麼名字,不知道還能怎麼用,也不系統,這些知識絕對是有用的,只是用起來的起點有點高,4個月似乎是不夠的,還是需要,再多做一些努力,把這些知識變成能用的東西。4個月多寶貴,半途而廢可惜了。
推薦閱讀:
※c++成員函數聲明()後加&或&&表示什麼?
※用傳統毛筆顏料宣紙畫水墨畫和用PS數位板畫水墨畫,哪個更有價值?
※腦電波的研究目前是什麼現狀?
※為什麼在手機指紋識別日益普遍的今天,絕大多數筆記本電腦沒有指紋識別?