程序員從接近底層的語言(如 C)學起,比起「不繞彎子」,直接從高級語言(如 PHP)開始,這兩種觀念之間的優劣對比是怎樣的?
都要學。
學低級語言是為了了解系統底層,了解內存,文件系統,編譯,進程等等。學高級語言可以不去想上面那些,學會編程邏輯和技巧。建議入門學個高級語言(問題為什麼是php這種主要用來寫web的語言?特性太強,不合適。建議Pascal/Basic/C#/Java),進階學C/C++,高級者草木皆可為兵,什麼鳥語言3天學會就能用了。
我小學4年級看學習機的說明書自學的G-Basic,當時就能直接寫遊戲了,終生受用啊。大學拿到C++課本的時候,直接看懂就能寫代碼了。而在用C++的過程中,逐漸又了解了進程的內存結構、編譯、面向對象等高級話題,逐漸進步。回想如果當年拿到的是C語言入門,可能早被嚇跑了,現在就不一定幹什麼呢。
的確是繞彎子,主要看這彎繞得值不值。
首先先看從將從c中學到了什麼,一是知識可被繼承復用的,數據結構,演算法,對系統深入的理解及標準庫的使用。二是c中特有的內存分配釋放,指針等。編程萬變不離其宗,在c中學到的知識一就是「宗」,在未來的語言學習中會有莫大的幫助。
以文件操作為例。若對c標準標使用熟練,無論php的fopen,ruby的File.open都會理解成這只是對c的open/fopen的一個封裝。又由於對c中的open熟悉,那由此會產生更多有幫助的信息以避開一些可能的問題,如本操作會佔用文件描述符,及時關閉是好習慣。只要與系統的交互都繞不開c的標準庫。這也是為什麼學會c就很容易學會其它語言。但由於學c的時間相對漫長,特別是知識二的過於底層的特性花費了大量精力去理解卻在腳本面前毫無用武之地,顯得有些無用功。對比直接入手php在只知其一不知其二也可以無礙使用下,就不得不讓人考慮值不值。以fopen為例,不知道c的php使用者的思想可能為fopen返回一個resource,而resource將佔用系統資源,用fclose可以關閉它,聽別人說及時關閉是個好習慣。
再加之,在php中有許多c中沒有的知識,如gc,面向對象思想,著如md5_file,urlencode等大量標準庫以外的函數,資料庫操作,xml,json等等一系列web知識。網頁編程和c中還是有著巨大的知識差別。
綜上所述一句話:時間充裕就從c學,沒時間就算了。學c不吃虧,有空最好還是學學。越高級的語言越容易學習,越低級的語言越靠近真理 想要有高度,必須要知道真理 要吃飯,還是先挑容易的學吧
C語言比較貼近計算機體系的實質,學習一下有助於對編程的深入理解,彙編同樣如此比C更底層一些。
入門並不必須從C開始,可先學點簡單的動態語言之類,或者C#、Java等等,主要看需求是什麼將來想朝什麼方向發展。 但要成為高手,C是必修課,以後還是要補上。 不過不太同意學好了C轉其他語言很容易的說法,實際上一旦某種思維(比如C的面向過程的編程思想)固定下來接受新的思想就變得更加困難,所以有人說過最好從C++開始學起而不是先學C再學C++,因為兩者之間最大的差異是思想不同,而不是語法層面的。學其他語言也一樣,語法學起來容易,轉變思想難。 最後還是覺得要先了解自己的需求、發展方向,然後再選擇工具。真正重要的、有用的、能拿來換工資的東西是抽象出來的「解決問題的能力」,精通某某語言某某工具都只是這種能力的表現形式而已。學習編程是一輩子的投資,因此如何保持長期的興趣最終要。首先從你馬上可以看到成就(一個小作品、別人的認可...)的語言開始,取得一點成就之後再往下學習,用成就來支撐興趣,用興趣來支撐學習。另外,學習是為了解決問題,先確定問題域再選擇合適的工具。我寫了28年的程序,到今天都不能簡單地說哪個語言好或不好,問題領域一變化,就會有人嘗試尋找最恰當的Tool chain,這也是開放社區的魅力所在。
長遠發展的話,個人覺得不管是高級語言還是低級語言,都很有學習的必要。私以為高級語言有PHP,Python, JavaScript, Java 等,低級語言有C,C++等。
高級語言篇:
學習高級語言,如PHP、Python等。獲得的是一種快速解決問題的思路和方法,開發人員只需要關心問題本身,而將一些對於解決問題相對不重要的(如內存管理)暫時拋開。
同時,正因為高級語言把一些底層細節屏蔽了,可以更方便各種高階概念的學習,而很多概念在C中也會涉及到的,如網路、資料庫等。舉個例子,高級語言很容易寫一個demo獲得對這些概念的理解,而C可能得折騰半天才能寫出一個可運行的demo,很容易導致信心崩潰。
另外,不同的高級語言提供了不同的編程模型,對擴大知識面很有幫助。如Java中的面向對象、設計模式,Python中Twisted和Nodejs的非同步編程模型。當然這些模型在不同語言都有不同層面的體現。
低級語言篇:
像C這樣的底層語言,從它的產生就註定與計算機體系結構密切相關。就現在和可預見的將來,它都將是計算機體系的基石。
如果要深入發展,我覺得C的這一關是必須要過的,當然何時過取決於開發者自己的考慮和權衡。
基本所有高級語言底層都由C、C++開發,掌握他們,能更加理解和學習高級語言的運作方式,對高級語言的技能提升也是很有幫助的。你會覺得高級語言也就僅此而已,沒有什麼特別。我大學一同學,他一直覺得各種語言都很神秘的,其實我想說,有了C背景,各種語言其實一點都不神秘。
學習策略:
個人比較喜歡從高級到低級的學習策略,而且一路也是這樣過來的。先從高級語言入手,找到問題,解決問題,並了解相關概念,如此反覆。一定程度後,在以C的視角來看待這些問題的底層機制。簡單來說,就是一個「知其然」到「知其所以然」的過程。
與此同時,學習一門低級語言(如C),先是語法,然後是一些常用的數據結構和演算法,再然後就是等待一個時機,走向高級和低級的融合。
關於自己:
目前個人走的是PHP+C的路線,最開始用PHP覺得很方便的實現想要的功能,如連接資料庫,xml解析等。一直到之後,慢慢覺得這樣是不夠的,我還想知道這樣簡單的背後是怎樣的,於是開始學習PHP內核,了解其內部運作機制。這樣就對語言本身有更全方位的認識,而不再局限於一個黑匣子,頓時覺得世界明亮了許多。
--- 以上觀點僅是進入編程領域三年新人的一點淺薄之見,歡迎批評。我靠~!學一門語言又不是什麼上刀山下火海的事情。了解下語法、開發流程、常用函數也是可以的,一周時間足夠。。等實際做項目需要哪個語言,再深入研究。最煩這種問題了。。。情緒激動啊。。
你能了解到的大部分高級語言都是用C去實現的,所以某種程度上,用高級語言才是「繞彎子」。建議學什麼語言,都要把C語言弄清楚,否則很容易「浮沙築高台」。
初學的話,學java,c++,c#其中之一吧,資料多學起來少踩雷,而且找工作方便,因為感覺工作了才是真正的開始學習。而且學哪個就一直學哪個,不要想著誰是誰的基礎,學好了誰是為了學誰。事實上,這三個語言都可以從零基礎學到高手,不用在乎網上一些「
學c才是基礎 」,「學好c++再學java和c#」的言論
作為程序員,我想即使不從Lisp學起也是要從smalltalk學起,學了之後就知道軟硬體到底是怎麼配合的了。
愛學什麼學什麼, 如果希望能快速的寫實際應用(看得見,摸得著), 那自然是PHP了,
我們不是討論要不要學C,而是討論要不要 首先 學C吧? 我認為應該先從一門不涉及底層的語言來熟悉編程方法。喜歡Python。
我覺得C很重要,如果你只會些高級語言,在做軟體開發時,會遇到些和底層打交道的bug,那時候如果不會C,不懂編譯原理,或者不懂操作系統的話,做起來較費勁!
一個真正的程序員,是一定一定一定要學C的。而且,我的看法是不光要學C,還得學操作系統。當然,我這裡說的是「真正的」程序員,而不是代碼的堆砌者。不管使用什麼語言的程序員,《C programming language》都是被列為必讀書籍的。操作系統的話推薦大名鼎鼎的APUE和Bach的《The design of UNIX system》。這也是我曾經的入門書籍。據說Linus就是參考《The design of UNIX system》這本書的設計思想寫出Linux的。
入門 C# (IDE 是 VS)好學 容易 能出東西,順便略微了解面向對象思想進階 C C++ 主要是這兩個語言能解釋的地方太多,了解語言實現機制和計算機系統進階 演算法-玩耍 Python (編輯器 Vim),看看什麼叫做用簡潔(的語法)和敏捷(實現複雜的功能)【必須要學過類似 C# 這種笨重的語言之後,才能有所體會;不宜直接學 —— 因為雖然有人說可以用 Python 入門,但通常優秀的 Python 程序員都是使用過很多種語言的】
選學 Java 主要是 IDE 非常難用
-學好以上,基本上具備了能夠快速學習一門語言的能力,而不再依附於某一個編程語言工作時看情況選用 C# 或 JAVA 或 C++ 或 Python Ruby NodeJS-0615補充:如果對一門語言的學習不涉及內存分配、堆和棧等內容,則不適合做當作入門學習 —— 也就是a. 如果不涉及以上內容,相當於沒有入門;b. 對於以上內容講解透徹的教材,具備了成為好教材的條件;c. 如果一門語言的幾本入門教材都不約而同地迴避了以上問題,則這門語言不適合當作入門語言(如 Python)。不明白這位童鞋所說的「高級」指的是什麼?一名優秀的程序員,要具備很好的學習能力,任何一門語言,都要做到快速上手,快速深入。
面對一輛山地車: 如果你喜歡騎車,學好駕馭的技術就行了,你的樂趣在於馳騁在山間田埂上; 如果你喜歡修車,把它大卸八塊再組裝起來,這樣才能更好的理解車子的組成原理。 修車的人不是不會去騎車,騎車的人或許也應該會修修車,這個度取決於興趣和時間。 ……因為喜歡騎行,拿自行車打了個比方,感覺大家能看懂,回答完畢。
目前我強烈建議初學者不要從底層學起。
初學者一定要從主流語言和架構開始學習。在學習期間,適當涉獵一下和當前所學關係密切的「底層」知識。並且不要試圖立刻理解那些「底層」借用樓主的一個觀點:
當你把你的底層知識征服了,你就有資本(基礎,能力)去征服更底層的知識了。那麼憑什麼不是:
當你把你的C#知識征服了,你就有資本(基礎,能力)去征服CLR的知識了?當你把你的Java知識征服了,你就有資本(基礎,能力)去征服JVM的知識了?如果學Java必須先弄明白JVM。
那麼弄明白JVM需要先學通編譯原理么?那麼學通編譯原理又要先學什麼呢?可能20年後世界上就沒有程序員了。
因為一個大學生要從上世紀50年代的彙編開始一直學到2030年的主流語言?要多久啊?所以,強烈昭示天下!
學計算機編程,請直接從當前主流語言和框架開始。輔助學習歷史上的那些「底層」。
優雅的程序員學 python, 深入了解 學學C 看看 linux 內核代碼!
個人覺得,學C語言,是每一個程序員,或者說每一個想在編程的道路上走到一定程度的必修課。學習高級語言是讓語言更懂人,而C語言則可以讓機器更懂你的語言。所以,要寫出高質量的代碼,C語言還是需要的。這樣你在考慮程序實現的同事,能夠站在機器的角度去考慮問題。總體來說,學C語言相當於修鍊內功,其他的一些高級語言相當於招式。當你的內功紮實了,學其他的也會比較快。所以,如果你只是想學個語言找份工作混口飯吃,那算了,C還是比較耗腦子費精力的;如果你想有更好的發展,更高的追求,那還是硬著頭皮學學,絕對很收益的。
推薦閱讀:
※2GB的mat文件,裡面是一個大型矩陣,matlab載入到內存需要23秒。現在用C++,有哪些辦法可以提高載入速度?
※Windows 的路徑中表示文件層級為什麼會用反斜杠 『』,而 UNIX 系統都用斜杠 『/』?
※在遊戲開發領域,不考慮現有開發人員熟悉程度,函數式編程在設計上或者理論上有它的先天缺陷嗎?
※單片機多位元組除法怎麼實現?
※為什麼大家都能接受2D橫版遊戲鏡像翻轉後人物左手持武器這種設定?