非計算機專業怎麼開始學編程?
我知道知乎有類似問題,但是都沒有強調「非計算機專業」。
非計算機專業的同學們壓根就不知道什麼是 「位」,」byte」等最基本的概念。也不了解為啥寫幾個文件,運行一下就有結果,這是什麼原理?這種基本概念對初學者絕對是壁壘,可惜我看了知乎有關問題都沒有提到。有沒有什麼基礎點的教材可以讓他們看看的?======================
補充,這裡說的編程就是要寫代碼的那種。
千萬不要看譚浩強的書。
非計算機專業學生怎麼走上計算機技術之路?
從需求的角度,我倒是想在給出解決方案的建議之前,先了解LZ為什麼要學編程?覺得酷還是有些事情想自己動手解決而不想依賴現成的產品?
感覺知乎上的這類問題挺多的,大家回答的也挺熱鬧,但是我不知道這麼多答案是否真正解決了提問者的疑問。。。還是說大家的熱情其實最後都變成了起鬨開始學編程的一個要點是,不要急著想把「為什麼」搞清楚,先弄明白「怎麼做」。
好比一台香腸機,豬從這邊進去,香腸從那頭出來。開始的時候先別急著拆機器看內部構造,否則你很快就會喪失耐心,信心,並在一次或多次崩潰後放棄。先想想怎麼把豬捉住、捅死、抬到入口處。所以:
其實第一步應該是練好盲打。眼睛不停的來回於鍵盤和屏幕之間,很快就會瞎掉的。就好比你連豬都抓不住,怎麼讓它乖乖的被你捅死然後抬到香腸機入口處?第二步是安裝好所需要的開發環境。比如說java需要jdk什麼的。對這個開發環境,你可以理解為那台香腸機。開始學的時候,只要它能正常工作就行;至於裡面是怎麼個結構,是齒輪傳動還是皮帶傳動,等你從初學變成知道以後再說。
第三步是一點一點學殺豬。
大多數師父會教你先跟豬打個招呼,說聲「hello world」。然後他告訴你手裡都有些什麼工具,一般是用來一切到底的一把刀,可以在把一個事情做N次的軲轆,和一個正面/反面的硬幣,可能還會有擴展的,比如有N面的骰子啦,把大塊肉攪成肉渣的絞肉機啦什麼的。當然會有使用說明和示範。接下來就得一邊學一邊發揮你的悟性了,因為你得學會怎麼把這些工具組合起來,用以解決你的問題。也就是「怎麼做」。說明書上最多告訴你」握住刀柄用刀刃去切肉「,但不會告訴你用這刀子如何雕刻玫瑰的。通常的建議是邊做邊學。當然一上來就殺野豬有點難,但你可以考慮用刀子給你mm刻一朵玫瑰啦,再配合上軲轆來一口氣刻100朵啦,再配合上硬幣來刻50朵紅玫瑰50朵白玫瑰啦,或者配合上六面骰子來刻點別的啦什麼的。哪怕是用絞肉機來幫猴子數桃子,你也可以試試,如果成功了請告訴我你是怎麼做的。第四步就是經常回顧回顧,總結總結,爭取每一次殺豬都比上一次幹得更漂亮些。
關於什麼是 「位」,」byte」,為啥寫幾個文件,運行一下就有結果,這個可以屬於」為什麼「。從我的經驗來說,如果在學殺豬的過程中,能夠多問幾個為什麼,能抓住一切機會向」原理「這個方向多走一兩步,那麼當你能熟練殺豬的時候,你也就知道什麼是脆骨什麼是肥腸,為啥白刀子進去出來的卻是紅刀子,甚至你能學會如何優雅的殺豬了。
基礎點的教材么,一抓一把,恕不贅述。
===2014-6-24===改了個錯別字=。=
學好英語然後去看原版Head First系列教程。
非計算機專業的學編程,需要先明確一下你的目的是什麼。是準備逐漸往專業的編程方向發展?了解比較深入的編程知識?還是僅僅需要學習一些簡單的開發工具以解決學習工作中的一些小問題?如果是前者,你可以參考以上所有人的回答,什麼C啊,B啊,P啊什麼的,慢慢看吧,不過我覺得你的意思應該不是這樣的,而是後者,想要一個相對簡單的解決身邊小問題的小工具。對吧。如果是這樣的話,我就以親身經歷告訴你,可以選擇學習一些簡單的小開發工具,例如windows自帶的批處理程序、易語言、中文VB等等。我親身經歷是,一個絕對的非計算機專業人員,干零售的,因為工作和遊戲需要,接觸了易語言,簡單的看了看說明,不必了解任何專業名詞,大致一天左右可以搗鼓出一個簡單的應用程序來,到現在幾年的時間了,斷斷續續的有需要了就拿起來看看,也寫了好幾個小有名氣的程序了。當然,解決實際工作中的應用問題的方法有很多種,在某些地方批處理和office自帶的VBA也算是很好用的編程工具了,而且都非常簡單。以上,供你參考。
自行百度「哈佛大學公開課:計算機科學cs50_全20集」,並把它認真地看完,就算你不入門,那也已經不是小白了。
我大三的時候才看到這課,真的是有種相見恨晚的感覺。為什麼可以把計算機這課講的如此清楚,為什麼可以把編程講的如此誘人!我大學學的是中藥,現在在做安卓開發,高中時因為參加NOIP競賽接觸編程學的是Pascal,那時候就愛上了編程。到大學計算機都是自學,決定學好哪門語言後,就先從入門的開始。一開始可以跟著書上的例子做,不理解也沒關係,後面慢慢會領悟到的。不要看太多的書,一本經典的入門的書就夠入門的了!
……LS兩個答案甚是喜感啊……如果僅僅是學點語言寫點小工具滿足一下個人特殊需求,那麼根本不需要知道這些概念,要學的概念應該是類型、變量、表達式之類的東西。byte bit 的區別暫且不說,像寫幾個文件就可以運行這類問題……還是別問了,初學者跟編譯不搭界我也不是計算機專業的,這種東西就靠多寫,摸熟了就好入門的話,對計算機的基本概念沒法教,太瑣碎只有靠多用、多收集。等能正常使用一台windows計算機了,就可以用國外的書自己看了。C++ primer和think in java之類的,每個階段可以說都是必備,我最初就很注意結果一樣會犯書上說的錯誤。
非計算機專業的同學們壓根就不知道什麼是 「位」,」byte」等最基本的概念。我從小學初中到高中,都有信息技術這個課,一定是會講這些的。就算是沒有講,大學裡的大計基也是講的。要真不知道,太詭異了。
看了lz的描述和大家的答案,覺得對於lz的情況,重點並非推薦書,最重要的其實應該是調整心態並且掌握學習方法。說幾點建議吧。
- 1.擺正心態:
a.不要老暗示自己,我不是科班出身,所以我這也不會,那也不會,好像這些是理所應當的。潛意識裡生出了許多自我絆腳石/借口/畏懼心理。別給自己打退堂鼓,別給自己這種毫無益處的心理負擔。 你又知道計算機本科畢業的就什麼都懂了?很多混出來的知識點照樣不能融會貫通,再正常不過。。記住,大概沒什麼比編程更適合自學的東西了,何況現在上網那麼方便!!
b.永遠不要等著別人來告訴你你該幹什麼
雖然很多大牛不吝分享,更有熱心者給初學/入門定了詳細的升級攻略。。但你精力有限,看完一篇指南又看另一篇,mooc也滿天飛,眼花繚亂反而無從下手。。你只需要有針對性地,根據自己的情況(興趣,基礎,目標),去選你該做哪一步。重點是「你要主動」。- 2.具體方法:
你接觸到byte感到陌生/不懂文件如何運行,別人不難給你推薦相關的書,但是你能保證自己看下去嗎?
你很可能看著看著,發現更多的問題,覺得「我不是計算機,所以我不懂」,然後「認命」地放棄。這裡的建議是,在看書之前,明確自己想知道什麼,帶著問題去讀。比如我就是想知道1)計算機怎麼工作的,程序怎麼轉換成機器語言怎麼控制電子器件控制輸出電平表示01?人類製造的最不可思議的機器有哪些? - 李晨暘的回答 恩,心懷敬畏。儘管還沒答完。。2)代碼怎麼編譯鏈接,怎麼分配內存,然後實現我想要的效果啊,編譯器做了什麼啊?各種關係怎麼理順?程序員的自我修養 (豆瓣) 的第一個書評(書的副標題是 鏈接、裝載與庫)如果你聽到這堆東西的時候,反應是,「啊,又暈了」然後開始懷疑自己適不適合學編程,陷入無謂的焦慮中,那麼兩條路:
1)按1.a調整心態,「我不懂,我好奇,我想把他弄懂」,2)或者如果你沒興趣,那你直接去寫代碼嘛。。你不知道汽車的原理,你照樣可以開車啊。(儘管這個經典的比喻是說知其所以然or拿來主義兩種態度。知其所以然當然更容易變通,然而我覺得剛學開車時不懂汽車原理也不是什麼可恥的事,何況每個人關注點不同而已。)我在構建自己的知識大廈時,對事物的本質和聯繫性有近乎偏執的追求,然而在入門階段,你可以放下對原理的執念,保持興趣也很重要啊。誰說了一定要弄明白「文件怎麼運行一下就有結果」這種神奇的事,才能編程啦!(除非你的興趣就在原理)現在中小學生都能編寫各種小玩意,但是她們很多數學都沒學過呢。- 3.硬要推薦書的話:
1)無非《編碼 (豆瓣)》;
2)隨便哪本數電的書講進位轉換、碼制轉換、浮點數的部分;3)隨便哪本微機原理講處理器內部結構,定址,時序,指令系統,存儲,中斷的部分。。。4)甚至可以看一些高質量的專欄文章。。雖然很快餐,但對於「掃除陌生感」很有幫助。不建議直接去看那些好多所謂經典的書,雖然評價很高,但推薦的人未必他自己仔細讀過,更多時候他不太會直接讀那本入門。入門啃磚頭容易困啊,細節推導多的飛起,讓人懷疑人生啊。。(雖然每個人情況不同,反正尼瑪《演算法導論》當入門我承認你夠叼)。。
經典的書不是不好,有些書非常系統也對這些問題比較有針對性。未必適合初學者。有很多別的書/博客/各種資源都會引用相關概念,計算機的學生教材也不盡相同(選什麼並沒多大差別),所以搞清楚自己的目的。重申下,在入門階段保持興趣很重要。自己大一大二時也不是把原理吃的透透的,為何要要求別人這樣呢。學習是螺旋式上升的過程。
你看的時候,如果遇到任何所謂專業詞,遇到任何不懂的概念,你就當做是和他們培養感情,就是即視感,反正耳濡目染得多了,也就漸漸熟悉了。誰都是從不懂到懂的呀。當然所謂門外漢也別老給自己貼標籤,好像自己智商就應該比別人低一樣。。我理論上算不算計算機專業的,介紹下我的做法吧。那是去年暑假,找數計院的同學借了一本計算機導論一本C語言的書。計算機導論很多廢話,大概瀏覽一遍有不明白的地方重點閱讀,這樣算一個勉強的基礎可以打好各種基本概念。然後下一步就可以開始學語言了。就我個人看法可以先學HTML,CSS(看w3school的教程),然後學C(C++我還沒學不清楚),反正我覺得C比java更清晰簡單(語法),然後。。。。先學好上面的吧ps,這些只是讓你了解編程的思想跟感覺,抱本好點的C語言的書一邊看一邊敲就可以了。
個人覺得
1.想好自己比較想用代碼寫出什麼來2.找個明白人聽聽推薦你學什麼編程語言3.找到這個語言最著名的入門級教材,一定要選歐美人寫的書,要看英文版的然後你就算還是不怎麼會寫,但你的疑雲都會散了。
p.s.你要是選了中文教材,神經又不太好,可能就瘋了所以才發明了Python、Java這些遠離底層的語言讓你不用太了解計算機的底層原理就可以寫出代碼出來。
我說一下我自己的學習經歷吧(本人比較笨,編程水平一般),我自己是先看譚浩強的C語言,然後C++看《Accelerate C++》,對學C語言來說指針和結構體當時不理解,不會的話先往下看,等到把書過完一遍後就再看看以前不會的就好一點。但是看完書後不會寫程序,這沒關係,再看清華出版社的那本《數據結構(C++)》,我當時把那本書看了4遍,有的演算法開始看不懂,多看幾遍就可以了,其實在你思考演算法的時候就是在提高你程序思維的時候,後來看得多了自己就會做一些課後題練練水平,其實在最開始調試程序真的是一個坎,只要你耐心認真仔細點是可以越過的,隨著你做的課後題越多水平就慢慢提高了,對於編程自己也會有一些想法了。然後就是學學其他的比如 java web 開發等,學學UI,資料庫等。要是覺得沒勁可以搞搞演算法,王曉東有本《演算法設計與分析》挺好的,都有演算法實現的代碼,講的題目也不錯。對於《演算法導論》我只看過部分章節,我覺得這本書覆蓋面挺好的,可以當個字典查查,如果通讀的話很費時間,這本書的偽代碼其實對於我們編程技巧不高的人來說其實不友善,因為好多想法要實現是很需要代碼技巧的。當然還有測試基礎演算法的網站了,我覺得9度OJ和leetcodeOJ都挺好的,可以檢驗一下我們的基礎水平。如果難度更大的有POJ裡面的題挺變態的,要是覺得自己很厲害想挑戰可以試試,反正我是不行。其實這些都是一些程序設計的基礎,掌握了這些學習其他的具體技術都不會感到太困難。寫得有點亂請諒解。
推薦兩本書
啊哈C!思考快你一步 啊哈C!思考快你一步 (豆瓣)寫給大家看的面向對象編程書 寫給大家看的面向對象編程書 (豆瓣)另外本人生活經驗發現,之所以他們認為編程難學,第一是很難直接去理解這種計算機抽象原理,所以把計算機名詞和原理用日常生活中的事物進行對比,能更有助於理解。第二是一定要面嚮應用,本身有強烈的學習動機(為了解決某些工作和學習問題),或者邊學邊自己寫一些好玩的小程序