為什麼知乎上大多數人不推薦C語言入門?
逛了很多帖子都不推薦C語言入門,這是為啥?本人准大一新生正在看c primer plus....
很大原因在於C入門不容易有成就感。
比如Python,學一陣子就可以搞出一些酷炫的東西了,這往往讓初學C的人艷羨。
不過這裡面也有兩方面問題要指出來:
- Python之所以讓開發者欲罷不能,很大程度上就來自於它豐富的第三方庫,而學習這些Library的使用似乎從來都是玩Python的人一上手就會接觸的;反觀C入門,也不是說它就不能搞酷炫的東西,只不過現在大多C的入門教程從頭至尾頭文件都只引入&
,你能指望一個DOS下的黑框炫上天?所以說如果學習方法得當,初學C也可以做出一些有意思的小玩意,給自己增加一些自信心和成就感。推薦一個教程:香蕉地--C語言入門了離學會編程還遠嗎? - 雖然初學者對自己的程序是否跑的足夠快並不是那麼在乎(Python比C慢得多)。但試想,如果像題主一樣現在還在上學階段,原本有大把的時間可以去弄清楚指針、內存管理等一些較為底層的知識,就因為一味地追求所謂的炫酷而沒有抓住機會,工作之後真還能靜下心去學習這些理論嗎?事實是C玩的溜的人轉戰Python,第一次聽說GC這個概念會爽歪歪,而一開始學習Python的人再去學C,第一次聽說Stack和Heap的概念會一臉懵逼。
所以,如果你還是不愁吃穿的上學階段,學C也沒什麼不好的,像c primer plus這種經典到「啰嗦」的書工作之後還真不一定有時間去潛心研讀;
如果你面臨就業或已經工作,選擇Python吧,畢竟都在喊人生苦短還是有道理的。
如果以後準備做碼農的話,還是從c入門好。這個坎總要過的。如果是業餘愛好的話,喜歡什麼用什麼就好。
興趣是最好的老師,入門編程重要的是持續得到正反饋,學了c/c++離作出任何一個方向的成品都太遠了,以前還可以,現在太麻煩,先學個能迅速看到效果的語言,有興趣了,參考對照學習c/c++也不錯。
Eric Steven Raymond 在《How To Become A Hacker》 中講到了一些基礎黑客技能,其中就講到了學習編程和編程語言的選擇,原文如下(如果不想全部看完的話只看黑體部分也是可以的,黑體部分也不想看的話直接下拉看結論好了)
Learn how to program.
This, of course, is the fundamental hacking skill. If you don"t
know any computer languages, I recommend starting with Python. It is
cleanly designed, well documented, and relatively kind to beginners.
Despite being a good first language, it is not just a toy; it is very
powerful and flexible and well suited for large projects. I have
written a more detailed evaluation of
Python. Good tutorials are
available at the Python
web site; there"s an excellent third-party one at Computer Science
Circles.I used to recommend Java as a good language to learn early, but
this
critique has changed my mind (search for 「The Pitfalls of
Java as a First Programming Language」 within it). A hacker
cannot, as they devastatingly put it 「approach problem-solving
like a plumber in a hardware store」; you have to know what the
components actually do. Now I think it is
probably best to learn C and Lisp first, then Java.There is perhaps a more general point here. If a language does too
much for you, it may be simultaneously a good tool for production and
a bad one for learning. It"s not only languages that have this
problem; web application frameworks like RubyOnRails, CakePHP, Django
may make it too easy to reach a superficial sort of understanding that
will leave you without resources when you have to tackle a hard
problem, or even just debug the solution to an easy one.If you get into serious programming, you will have to learn C,
the core language of Unix. C++ is very closely related to C; if you
know one, learning the other will not be difficult. Neither language
is a good one to try learning as your first, however. And, actually,
the more you can avoid programming in C the more productive you will
be.C is very efficient, and very sparing of your machine"s
resources. Unfortunately, C gets that efficiency by requiring you to
do a lot of low-level management of resources (like memory) by hand.
All that low-level code is complex and bug-prone, and will soak up
huge amounts of your time on debugging. With today"s machines as
powerful as they are, this is usually a bad tradeoff — it"s smarter
to use a language that uses the machine"s time less efficiently, but
your time much more efficiently. Thus, Python.Other languages of particular importance to hackers include
Perl and LISP. Perl is worth
learning for practical reasons; it"s very widely used for active web
pages and system administration, so that even if you never write Perl
you should learn to read it. Many people use Perl in the way I
suggest you should use Python, to avoid C programming on jobs that
don"t require C"s machine efficiency. You will need to be able
to understand their code.LISP is worth learning for a different reason — the
profound enlightenment experience you will have when you finally get
it. That experience will make you a better programmer for the rest of
your days, even if you never actually use LISP itself a lot. (You can
get some beginning experience with LISP fairly easily by writing and
modifying editing modes for the Emacs text editor, or Script-Fu
plugins for the GIMP.)It"s best, actually, to learn all five of Python, C/C++, Java,
Perl, and LISP. Besides being the most important hacking languages,
they represent very different approaches to programming, and each will
educate you in valuable ways.But be aware that you won"t reach the skill level of a hacker or
even merely a programmer simply by accumulating languages — you
need to learn how to think about programming problems in a general
way, independent of any one language. To be a real hacker, you need
to get to the point where you can learn a new language in days by
relating what"s in the manual to what you already know. This means
you should learn several very different languages.I can"t give complete instructions on how to learn to program
here — it"s a complex skill. But I can tell you that books and
courses won"t do it — many, maybe most of the best
hackers are self-taught. You can learn language features — bits of
knowledge — from books, but the mind-set that makes that knowledge
into living skill can be learned only by practice and apprenticeship.
What will do it is (a) reading code and (b)
writing code.Peter Norvig, who is one of Google"s top hackers and the
co-author of the most widely used textbook on AI, has written an
excellent essay called Teach Yourself Programming in
Ten Years. His "recipe for programming success" is worth
careful attention.Learning to program is like learning to write good natural language.
The best way to do it is to read some stuff written by masters of the
form, write some things yourself, read a lot more, write a little
more, read a lot more, write some more ... and repeat until your
writing begins to develop the kind of strength and economy you see in
your models.I have had more to say about this learning process in
How To Learn Hacking. It"s a
simple set of instructions, but not an easy one.Finding good code to read used to be hard, because there were few
large programs available in source for fledgeling hackers to read and
tinker with. This has changed dramatically; open-source software,
programming tools, and operating systems (all built by hackers) are
now widely available. Which brings me neatly to our next topic...
綜上,python對於沒有編程基礎的人來說的確是個不錯的選擇,但是並不代表學過了python就能不學c語言,因為c語言需要大量地手動地來管理底層資源(比如內存)造成了c語言程序非常複雜而且需要花時間去調試,然而就是因為這樣,我們可以用c語言來理解一些「本質」的東西。所以說c語言對大多數人的意義而言不是用來工作(畢竟工作中需要用c語言的人是少數, 除了部分需要大量和硬體打交道的職業 嵌入式驅動開發什麼的)而是用來學習其他東西的, 比如:
- apue, unp之類的用c語言描述的「聖經」級別的書
- 以linux內核為代表的大多數操作系統內核
- python, php等等「高級」語言為代表的解釋器或者編譯器
- redis為代表的資料庫
- apache, nginx為代表的伺服器程序
- 大多數unix-like系統的協議棧
- 如果要自己動手寫操作系統的話一定會知道的硬體模擬器 qumu, bochs
- 各種單片機的編程c語言幾乎是唯一的選擇(當然彙編也可以,只是...)
- 自2014年考研大綱把java刪掉後演算法題只能用c或c++來完成(沒錯,這一條就是為了湊夠九條)
因為c語言是上世紀七十年代的產物(1972年), 造成了c語言的局限性, 但是又正因為c語言「悠久」的歷史,讓c語言有關的資料異常豐富。所以,為了這些豐富的資料,學一學c語言也是值得的。因為c語言的某些缺點你以後可能不會直接用c語言工作, 但是你會經常間接地和c語言的各種產物打交道的。
誰說C不適合入門?只不過你我對入門的定義未必相同。
想知道什麼語言適合不適合「入門」,你起碼得拿出地圖看看人家所謂的「門」在哪裡、並且有能力對比多條路線,這才有資格說哪條路線更好入門,對吧?
比如說,如果兩個人的目標分別是:
1、其實我什麼都不想知道。媽蛋隨便來個什麼把任務湊出來啊啊啊啊啊啊啊
對他來說,可能搜索引擎才是最好的「編程語言」。
只是……寫程序的那些懶蛋太不努力,不肯把任何東西都實現好白送給人家,人家既不想寫又不想掏錢實在很難辦……
所以,沒辦法,找個啥都不用知道,能「很容易的找到很多半成品」然後很容易就能把半成品們湊合到一起得到差不多滿足需要的編程語言就算了——哎呀沒有?那就給個盡量簡單的,能少學點就少學點。
PS:其實這種最好是學linux。因為哪種語言都很難和linux比工具強大豐富……什麼awk sed等等,玩轉了絕對是另一個天地,哪需要學什麼編程。
就是很多編程語言,也從linux的這些東西上收益匪淺,尤其是php/perl之類,離開linux簡直是瘸了兩條半腿有木有……
應該知道的Linux技巧 AWK 簡明教程 ——尤其推薦這個。看看什麼叫awk黑科技……
當然,大家都知道,他們是絕不會離開溫暖的windows的——別說硬著頭皮嘗試linux了;就是學python之類簡單的腳本語言,都要挑肥揀瘦「有所學有所不學」的。
2、我想要徹底學會編程,解決一切可以用計算機解決的問題
嗯,你居然給推薦個一拖一放就能自動生成極為酷炫軟體的……類似遊戲地圖編輯器的玩具?
是,真快。啥都不用看,兩天就搞出個「酷炫」的垃圾了;可學了兩年拖放,還是只能寫「酷炫」的垃圾?
為什麼別人學了半年就能寫「外部命令」給這個「酷炫」的東西擴展功能,而我卻只能張嘴等人喂?人家一張嘴一串術語我連子程序是什麼都不知道你確定真不是坑我?
傻瓜式封裝啊你聽聽,你這是想讓我當一輩子傻瓜是吧?
所以你看,想走這個方向,反而極為排斥那些「酷炫」、「便利」的東西,因為太容易被引偏方向了——所以正規計算機專業的教材,自始至終不會拿「如何使用某種GUI庫」之類當重點講,甚至可能壓根就不講。
因為被票友們視若珍寶的、關於如何寫GUI程序之類玩意兒,實在太不值一提了,壓根不值得在它上面耗費精力。
在下當年為公司考察選擇各種圖形庫。其中GTK是從零開始學的,學了兩天覺得差不多了打算練手,花兩個小時弄了個「鑽石迷城」遊戲——有計分,無音樂。
後來把這個簡單工程丟給一個打算學編程的哥們玩,結果這位玩了一個月的那個「鑽石迷城」,愣是沒看過我的實現代碼……原因據說是看不懂,一行一行講給他聽都搞不懂。
至於如何實現一套好用的、可以和市面上已有產品競爭的GUI庫……在你可以一頭扎進命令行黑框框、輕易搗鼓出任何自己想要的東西之前,想都別想——更準確點說,恐怕是你到現在都想不通,為何實現一個GUI庫,居然需要先鑽進黑框框裡面去……
——沒錯,目標是這個的那些人,年復一年專心在黑框框里玩你們看起來low到爆簡單到爆但湊到一塊就沒法看懂的一行行與或非順序分枝循環……但你們都是他們的傻瓜用戶。
甚至,他們哪怕稍微高看你們一點點、稍微多給你們一丁點做決定的自由,你們就充滿恐懼的大叫「don"t make me think!」
你看,你要給這樣兩個人推薦同一條入門路線,樂子恐怕就太大了點吧。
知乎並非程序員社區,很多這方面話題的參與者僅僅是工作涉及編程,並沒有多少是程序員。所以主流輿論對C充滿了恐懼和……厭惡。對他們來說,C簡直是必須立刻馬上當即淘汰掉的、恐怖的老不死。以至於大言不慚的「C只能做底層」之類胡言亂語都出來了。
但是……這些才是程序員的地盤:
chinaunix首頁,看看什麼話題最吸引程序員:
Unix技術網 = 全球最大的Linux/Unix應用與開發者社區 = IT人的網上家園
chinaunix論壇程序設計板塊,看看哪個論壇帖子最多、最火爆:
程序設計-ChinaUnix.net
csdn論壇,點開左邊的目錄樹,看看編程語言/框架都在討論什麼:
CSDN論壇首頁
stackoverflow,哪些tags最常用到:
Tags - Stack Overflow
——————————————————————————————
對目標是第二條線的人來說,C的特點是:不作任何封裝,把整個硬體、整個操作系統赤裸裸的擺在你的面前;同時它又是一種高級語言,使得它的用戶不必關注太多底層細節,於是在其上無論是討論演算法、還是談論操作系統、網路協議棧、編譯原理等等,都極為簡單直觀。
這些特點使得C極具生命力。甚至哪怕到了現在,C仍然是最為流行的編程語言(一直和java、c++聯手壟斷流行編程語言排行榜前三位——而且C經常在榜首;注意C和C++是分開統計的)。
TIOBE 2016年8月編程語言排行榜:C語言排名創歷史新低
尤其是偏底層的系統級編程,更是C一家獨大,除了C++別無對手。
別以為C只能做底層。真正複雜、高難度、對性能有苛刻要求的、支柱性的大項目,C仍然當仁不讓、不可替代——我不知道那些說C不適合做項目的,究竟有沒聽說過linux,看過幾個開源項目。
C只不過是太貴、所以不值得拿來做那些不值得花大精力深挖機器潛能、也不值得僱傭高級程序員精雕細刻的、堆積木性質的項目罷了——比如所謂的企業開發、比如開發部署一個網站……
不過,說到網站……或許你應該了解下apache/ngnix以及mysql等等都是什麼寫的 ^_^
沒錯。除了那些不上檔次的、最為末端的企業及網站類應用外,其它任何領域,業界最好、最頂級的實現,大部分是C的。
這就使得,無論你學什麼,很容易就能拿到一大堆的C版本的開源常式;尤其是,若要學習真正能決定你將來能走多遠的操作系統、資料庫、編譯器等基礎原理方面的東西,更是幾乎只有C一個選擇。
不僅如此。C實現的任何東西,無論是操作系統還是編譯器,全都會以赤裸裸的演算法+數據結構的面目展示在你的面前。想知道什麼,只要從一個API開始跟,很容易就能搞明白——跟一跟某個硬體相關API,甚至可以幫助你準確理解硬體。
徹底學通之後,任何技術、任何架構,都能一目了然。
簡潔直白、案例眾多、學習資源豐富,這是C最為獨特的優勢。
所以,雖然想玩好指針之類危險特性並不算特別容易;但,學基礎演算法本就不需要你玩這些危險特性;稍微學深一點,和其他知識相比,指針又怎麼都談不到難上。反而是C一旦入了門,根本不假他求,很容易就能把整個計算機系統弄的通通透透——除了C,再沒有第二種語言能有這麼高的投入產出比。
指針就是對內存最初步的掌控;連內存都玩不明白還奢談什麼「懂計算機」。
事實上,除了對面向對象的直接支持以及內置的內存回收機制等東西外,C並不比近年的各種高級語言少多少特性;而且,c寫的unix的一切皆文件思想正是最為成功和最為著名的面向對象案例;需要關注其分配/回收的資源種類多如牛毛,並不僅僅內存一種,任何一種資源的泄露甚至只是不合理的佔用都可能毀了一個項目:只靠一個內存自動回收哪救得了你。
所以,恰恰和外行想像的相反,真正龐大複雜的項目反而更需要天天和「資源管理」打交道的、有豐富開發經驗的程序員(這正是c/c++程序員的強項:做不好資源管理的c/c++程序員還是早死早超生好了);那些溫室里的、從未嘗試過自己掌控資源生存周期的嫩苗絕幹不了這事——懶得管內存所以丟給垃圾回收、和不會管內存所以依賴垃圾回收,兩者可絕不是一回事。
那些一說C就酸溜溜的扯彙編的,其實正暴露了他對計算原理的無知。
並不局限於資源的管理:專業的軟體設計,學的是演算法、是如何把一個極難的任務建模、分解、實現的學問:編譯原理、操作系統等等,都不過是用於演示「如何庖丁解牛一個超級項目」的實例而已。
除了C之外,你到哪裡找別的、有豐富的相關開源源碼及其分析資料的語言?若學到這等程度了,連計算機原理都不會,還學個什麼鬼?
連個C指針都覺得難、然而卻還掙扎著想入這個門的……簡直不可想像。
可見,如果你的目標是專業的軟體工程師,C就是最佳入門語言,沒有之一。
相比之下,同樣的項目,其它語言因為封裝的雲山霧罩,哪怕是老鳥,想把人家的核心演算法/架構從層巒疊嶂的各種委託、代理等等模式中剝離出來,都不是很容易的事,何況初學者。這反而不利於學習偏底層或者偏核心的知識——甚至很容易給初學者造成「不去看系統實現,因為不可能看懂」的「習得性無助」心理。
甚至,有調查顯示,java程序員對自己每天都要打交道的JVM的理解,平均來說遠不如C程序員——無論是入門級的知識點還是進階知識點。
——————————————————————————————————————
但是,在知乎上,我也只會推薦python等腳本語言。
為什麼?因為需求不同。
第一,提問者本身就顯示出某種急功近利、耐心缺乏的傾向。絕大多數還表現的特別明顯。
比如說,極大一部分提問者是這樣問的「想要轉職/去xxIT企業,學XX可以嗎/多長時間可滿足要求」——這壓根就是玩票的票友嘛。你給票友推薦C?
顯然,給他們推薦必須長時間學習深挖、必須有較為深厚的、各方面基礎知識的C,不是裝X就是找打。
第二,知乎的提問者,大多不是初學者。他們是未學者。
所謂初學者,顯然應該是有一定的基礎(起碼得自己看過書、上機敲過常式吧)、但對計算機軟硬體理解較淺、需要找一個突破口以學習提高的人。
對這類人,C顯然是一把極佳的、便於開啟操作系統和硬體大門的鑰匙;對他們,不推薦C才有問題呢。
但知乎的提問者,幾乎無一例外,都是「若干種語言我選哪種學習」、「我想學編程我想將來寫XXX學什麼語言好」一類。
這種人壓根連半步都沒邁出去(因為隨便他真把隨便哪種最簡單的語言學入門了、想要繼續提高,都不會是這個問法),那麼肯定得給他們推薦那些上手快、見效快的,不然這種磨磨唧唧的傢伙恐怕連看完「序言」的耐心都不會有。
只有等他們上手之後,仍然有興趣、有動力,自覺學有餘力,這才能算初學者——到這時候,如果你打算深造,看會不會給你推薦C。
第三,如前所述,知乎提問者,哪怕不急功近利,他們的目標大多數時候也不是專業軟體開發。
亦因此,你敢提C,他們就酸溜溜的對以彙編。
對他們來說,挖底層、挖演算法,壓根就不是目標;他們只關心怎麼把自己的任務拼湊出來。
顯然,只能給他們推薦那些簡易、入門快、見效快、有大量輔助庫可以馬上拼湊出成品的語言——對這類人,你敢提指針,他們就止不住酸溜溜的心裡難受。
但,事實上,哪怕只是國內的chinaunix這樣水平一般的程序員社區,指針相關的很多問題都沒幾個人樂意回答你:因為它太過淺顯而且早就被那些初學的懶蛋們問成了「日經」,誰樂意日復一日的為他們浪費口舌。
可見,對票友而言的入門,和對專業程序員而言的入門,壓根就不是一回事。兩者的差距,甚至可能和學開車和造汽車一樣大——對後者來說,前者不過是一直拿積木拼來拼去罷了,什麼時候入過門?
這是一個類似於,學武功是先練《少林基本功》還是直接練《辟邪劍法》的問題。
首先,會提出這個問題的人大部分是還未接觸到編程的,可能出於對這行的「錢景」 或是 對行業的「酷炫性」產生的興趣,想要通過自學來入行。
這裡就出現了分支,如果你只是有興趣,想要做出一些東西來驗證你的想法的話,可能《 Python 》《PHP》這樣的編程語言比較適合你。目的性不是很強的學習,很容易因為畏難,無法解決問題就選擇放棄,所以建議還是選擇簡單一些,並且能馬上看到結果的語言來學習比較好。
這類編程語言就類似於編程界的《辟邪劍法》,你可以不懂底層,沒有基本功也能很快讓你上手,做出你印象中程序的樣子,這樣可以更好地提升你的興趣並且解決你的問題。
如果你是出於對這行的「錢景」,想要未來在這行紮根,並且有不錯的發展的話,應該不至於因為難而放棄吧?所以以C語言入門還是不錯的。
之所以說C語言不那麼適合入門,無非是因為:
C語言接近底層, 會讓你厭倦無意義的基本概念,而且做不出酷炫的東西,並且對於大多數人來說,C語言在以後工作中基本用不上。
C語言是面向過程的(這裡不用爭論C語言也能實現面向對象,先收好40米大刀,我是友軍),所以抽象程度相對較低,更像是需要一拳一腿練習的《少林基本功》,所以搞清楚,學C語言的目的,是為了紮實的基本功,為了更方便以後的學習。
當然,這裡並不是指C語言簡單,而是說C語言更像是武功的基礎。《 Python 》這樣的語言也許一上來就能直接舞一套《辟邪劍法》,但是如果對於體內真氣走向不清晰的話,一旦出問題就容易走火入魔,更甚至是只有厲害的劍招,沒有雄厚的內力支撐,這樣的後果就是,一旦江湖再出現什麼厲害的武功,你就只能感嘆一句「***」,然後加入爭奪秘籍的隊伍中,否則只能淪為後輩的墊腳石。
而C語言就是要你清楚體內每一根經脈的走向,真氣匯聚的走向,這確實很不爽。尤其是同樣初學的人已經能夠用《 Python 》指點江山,動不動就在你身邊放個劍氣啥的。
但是相信我,只要熬過這個坎,別特么說是《辟邪劍法》了,你就是心情大好想要打一套降龍十八掌,發一套六脈神劍,也只會感嘆一句,他娘的,天下武功果然是殊途同歸啊,這就是高手和宗師的區別,也是個人價值的體現。
《 Python 》這種語言,你有個兩三年其他語言經驗之後,想學的話,一兩周就能搞定,而C語言這樣的語言,你搞五年《 Python 》,難度對你來說都低不了多少,還是一個學習的過程。
天下武功出少林(此少林取自金庸大師的少林,和這個少林沒毛關係),對於編程語言更是如此,C語言作為始祖級的語言,肯定有缺點,但是這種講究一拳一腳的練武方式,是普通人成長為宗師最佳的方式之一。
你看江湖,一會來個辟邪劍法,一會來一個九陰白骨爪,偶爾降龍十八掌還來跑個龍套,但是我少林(同上)武功依然屹立不倒,這也就是為什麼我說要先學C語言,然後才考慮C++或Java還是Python還是PHP的原因,哈哈。
最後有一句話,我們共勉。
學習有提高效率的方法, 但是絕對沒有捷徑可言。
想好好練功,不如你先點個贊,然後關注我,我們細細探討如何?
因為C太接近機器了,初學者要記住的格式和細節不少,要理解的概念也不少(沒有計算機硬體基礎知識的話很難腦補這些概念),所以初學者不容易理解,故而不推薦作為入門語言。
那些抽象程度高些的(不需要特別在意細節的),比如Python、VB這類「玩具語言」,就適合入門(我們高中計算機課學的就是VB)。
先適應編程思維,也就是基於順序、分支、循環、布爾、數組、函數、文件、輸入輸出等結構改造大腦解決數學問題。這個階段的畢業標準,就是做出一個貪吃蛇之類的小遊戲。(對應大一上進度)
然後再學計算機原理、操作系統、C語言、數據結構、對象語言(C++,JAVA)、計算機網路……這個階段的學習,就是解各種數學題,做各種增刪查改,畢業標準是做個有聊天功能或學生系統功能的東西(只要能通信兩三句話、變動四五人數據就可以了)。(對應大一下大二上進度)
然後就開始接觸單片機(計算機原理知識升級,還需要數電知識)、虛擬機(操作系統知識升級)、資料庫(數據結構知識升級)、網站(計算機網路知識升級)、開發實例等,喜歡單片機就試試走硬體,否則就試試走軟體。(對應大二下大三上進度)
一般都是這個順序。用python編程的大神,在習慣了各種專註於邏輯實現以後,找工作順風順水,也得老闆賞識。
一日在家soho,大神正鍵盤飛舞,突然遇到顯示器黑屏的問題。由於大神從未接觸過硬體工作的原理,開關按盡也始終無法把熟悉的桌面弄回來。想了想,是打119還是打110呢?
後來,諮詢了一位資深前輩,經過了一番徹底的排查,發現是電費沒交。。。。。計算機專業的當然不能不學C啊,你要說非本專業的,有一些易於使用,不對計算機背景知識做要求的語言更容易上手,比如python,java也馬馬虎虎吧。
最近擼完CMU 15513的cord lab(相當於C語言的編程水平測試),覺得可以答一發。
一幫很久沒碰過C語言的人通過這個lab在兩三天內就熟悉了C語言的一些基本用法。當然大部分人在之前是有一兩門比較熟練的高級編程語言的。
首先說結論:很多C語言的問題要對計算機系統有一定理解之後才能解決,所以不推薦C語言入門。
用的教材是Brian Kernighan和Dennis Ritchie的神書《C programming language》。這本書是《CS:APP》(Computer Systems: A Programmer"s Perspective)的指定參考書。而且甚至比神書CSAPP還寫得好得多。。這本《C programming language》把本來就「簡單」的C語言講得更精鍊,薄薄兩百多頁,快的話一天就看完了。只用兩百多頁就深入淺出地講好了一門編程語言真是非常恐怖的一件事。。
我就不過多地介紹了。你想了解的頭文件,指針和數組關係,指向函數的指針等等重要概念都在裡面解釋得很清楚了。很多人覺得困難可能是因為他們選擇的教材太差。
然而就算有好的教材也不能簡單寫出bug free的代碼。。即使通過看書把C語言入了門,但是坑還是要親身去踩才能學到東西。。
1. 比如C語言不像Java一樣給你很多內置的類,類的方法都定義好了直接用就行了。在C語言里這些都得自己寫。。。
2. C語言也沒有Java的垃圾回收機制,還得學著自己管理內存,知道存在棧上的局部變數和分配了內存的變數在存儲上的區別。
3. 還有malloc的坑,分少了會buffer overflow,忘記free了又會造成memory leak。
4. unsigned int的坑。
不懂對應的系統知識,只能看著非常confusing的bug找不出原因。
文科生強答。
我對編程語言一竅不通,但是我有個感覺,同樣是做圖,C語言很像美術的基本功,你要進行長時間的素描速寫水粉水彩等基本技能訓練,才能入一點點門,很耗時間和精力所以不推薦。但有些編程語言就像是一些繪圖工具,你認真學個幾天就可以做一些外行人看起來很不錯的圖,但是讓你做一些有創意的可應用的就不行了,擁有美術基本技能的就不存在這個問題了,無論是手繪還是運用工具都能做出來很好的作品。
也像武功中的基本功,苦練十年少林長拳,每天都是簡單重複枯燥乏味的動作,但一天居然一拳打死一頭牛,但絕大多數人堅持不下來所以入不了門,所以不推薦。有些編程語言像奪命十三劍,技巧性強好看的要命牛逼到爆炸,但是缺乏基本功好像威力大打折扣。因為這樣很容易喪失對編程的信心
不要問我為什麼知道想起一個故事,某個在微軟混得風生水起的女前輩的故事。
當年她還是一個學生的時候,就去微軟應聘實習,但是被拒了,可是她不氣餒,第二年又去應聘,還是被拒了,她就惱了,面試她的也是一個微軟元老(那還是在上世紀九十年代),元老說:「你還差的遠,別再來了。」
女前輩就哭鬧:「不行,為啥不收我,你們不收我,我明年還來,煩死你們。」
元老沒辦法,說:「算了,我指點你一二,明年再來。首先,你要學一點C語言,因為這會讓你知道計算機軟體如何工作的。」
第二年,女前輩再來應聘,就中了,之後她成為微軟正式員工,一路青雲直上。
你看,學C語言還是有用的,也許下一個在微軟飛黃騰達的就是你。
這話說的太絕對。應該說不推薦不準備從事計算機專業方向的人用C入門,理由大家說了很多了,總的來說就是對於非專業方向來說,投入產出比太低,會變成積灰技能。專業方向用C入門沒啥毛病,反正十有八九早晚要用。
因為時代變了,「界限分明的純C」用得已經非常少了——哪怕是ACM競賽 ,在2013年的世界總決賽中用純C提交的代碼也一份都沒有……正經的CS專業學生不如直接C++起步,反正「C with Class」也是C++不可分割的一部分,就算你寫完全是C風格的代碼也可以正常被C++編譯器編譯……
編程中一個重要的概念是抽象
簡單來說 就是把不需要的細節隱藏起來舉個例子
你在用筆寫字的時候 不會考慮筆頭的構造是怎麼樣讓墨水從筆芯裡面流出來 然後留在紙上而只需要考慮這支筆能不能用C作為一門入門語言的話
一是難度比較大 二是抽象的程度不夠舉個例子 指針的概念雖然很必要 但是理解起來不是很直接 作為第一門語言的話 個人認為略困難 而學習其他語言作為基礎 之後學習C語言 個人認為比較容易
再舉個例子 C的字元串使用字元數組 最後必須加 作為結尾 這在使用上去增加了需要考慮的東西 在一些別的語言里 會省去考慮此類問題的必要
還有就是C的內存管理 比起其他語言的garbage collection 自行管理內存有利有弊 作為一個初學者 使用其他語言可以省去自行管理的一些不便
不可否認 正是因為C語言的接近底層 讓C這門語言在那麼多年以後 任何被大規模的使用 但是作為入門語言 個人還是不太推薦C 但是C這門語言對於程序員來說 是需要掌握的
最後補一句 我們學校計算機系大一授課的語言 按順序是
Haskell(函數式編程) Java(面向對象編程) C (過程化編程)以上。很簡單,在os的進程調度中,計算密集型的程序優先順序應該降低,交互型程序優先順序應升高。放在這件事上,就是佔用精力比較大的活動應放在後面,有及時反饋的東西應放在前面。所以就應該把 學 python 或 java 放在前頭。
許多人說學c,實際上是讓你學system。而且system屬於進階技能,不是剛入門就要學的東西(當然你出於某種特定目的會了也沒關係)。再者說,system可以單獨抽時間來學。在傳統的科班培養計劃中,這部分要到大二才會涉及,你如果急著去互聯網,可以一兩年之後慢慢學,沒關係的。
你如果當前有時間,可以立即去學。但是,還有一部分東西叫做數據結構和演算法,同等重要,而且語言無關。如果你現在在搞那部分,就不要急著學c了。拿c來刷演算法簡直不能更彆扭,不要自找麻煩。
另外c和c++真的不是一個東西,你如果學c++的話,基本就跟手動內存管理和raw ptr絕緣了。對吧? @Frank HB
你要想做一輩子,當然c入門。你要是只想做一陣子賺錢,當然啥火學啥,撈一票走人。
所以你看下推薦你不要c入門的人都是準備幹啥的。。。這取決於你的學習方向。
如果你單純想做一個程序員,那麼你只需要學習一到兩門高級語言,熟悉一下語言的入門方式,加上其他計算機基礎課程,然後就可以投身到該語言的實踐訓練中了。
如果你想做一個計算機科學偏應用方向的專家,那從C和C++入手,方便你在OS kernel,network相關的課程上一邊編程一邊學習。
如果你想做一個計算機科學偏研究方向的,那麼C++/Python入手可能會用的更多,computer graphics/vision大多用C++,而AI方向Python足夠。
偏商科的可能R入門,搞科研的可能用MATLAB居多,玩系統做內核或者嵌入式的只有C可用,喜歡前端的學會js就可以玩大多數東西,做app開發的可能職業生涯只會一門語言也能混得不錯。
總之語言入門的選擇,只取決於你近期想要接觸的計算機方向課程,以及這門課程所要應用的語言。因為計算機科學到後面,接觸過編譯原理和編程語言原理之後,成為一個多語言者非常容易,剩下的只有用大量實踐來打磨細節和提高對語言規範的熟練度。所以選擇語言,只與應用有關。做純軟體,以及軟體工程,這不是c的長相。使用Python,c#,Java可以讓你更關心業務邏輯實現,而不是又飛了幾個指針,c要求極精確的實現,這會轉移人的注意力
推薦閱讀:
※怎樣深入學習操作系統?
※Coursera (或其它慕課平台)上有哪些編譯原理相關的課程值得推薦?
※根據語義生成圖像的相關研究工作有哪些?
※博士做研究如何選擇方向?
※能不能通俗講一講數據鏈路層到底有什麼用?