前面的話:
這麼久以來,我一直思考乙個問題,就是怎麼從乙個其他的專業入門進入程式設計師行業,從業餘變成專業。從什麼也不會,到可以完成基本的**編寫,到可以完成簡單的程式任務,並且在後期完全進入這個行業,有自己往下專研的能力。
隔行如隔山:
隔行如隔山,其實不止是隔行如隔山。
想象這樣一幅場景,同樣是做軟體開發的人,如果我從未接觸過python,我是一名c程式猿,有一天另外乙個專門的python程式設計師跟我說一堆python的概念,說python如何簡潔高效優美,能夠完成多少不可思議的任務,他說的越詳細,越感覺深入,越感覺到表達的很清楚,我也只是感覺到他的情緒而已,而對於python我卻一無所知。在我真正進入python這門技術之前,我依然會覺得那很難讓人理解,因為對不確定性的恐懼將是第一扇難以開啟的門。
出於工作需要,時間很少,所在的領域學到的工具和技術是有限的,所以在工作中沒有涉及到的領域,往往以後也不太可能談得上說精通,即使是出於興趣研究過一段時間,也只能稍微熟悉,至於一門技術的精髓,那只能在大量的專案實際應用中才能體現。
我卻嘗試引領你快速入門:
入門乙個新行業那麼難,有時間不夠的壓力,有興趣不足的阻礙(其實沒進入無從談興趣)、有天生的專業缺陷、有那麼多沒法理解的概念,那麼多那麼多的困難,這就是實實在在的難點,沒有辦法嗎?不,如果我現在告訴你沒有辦法,那我這篇文章就是在扯淡,就是毫無意義。我會告訴你,這是有辦法的,我真正做的一件事情,就是在這麼多困難面前,引領你快速入門。
你無法要求你自己從一開始就理解什麼是程式的本質:
你無法要求你自己從一開始就理解什麼是程式的本質,就算是我,可以在這裡大言不慚寫文章的我,也談不上真正明白程式的本質。只不過,通過實踐和學習,我有了自己的一些理解而已,僅此而已,真理是什麼其實我們並不關心。如果你想入門就成為所謂的大牛的水平,那是做夢,技術從來都是從頭開始,一點一點積累的,就像你看過一分鐘打兩百字的打字員,你就應該明白他曾經敲壞過多少鍵盤,任何事情都無法一蹴而就。但是,打住。程式設計這件事情,其實是可以速成的。
程式的本質:
程式設計的本質是什麼,在我看來,程式設計是用**的方法告訴計算機,讓他去完成我不願意親自去做的或者我根本就做不到事情。比如,做乙個乘法,25534x32324,這是我能做到但我不願意去做的事情,因為在紙上做我覺得很累很麻煩。又比如計算92.3782的開根號結果,那是我能力做不到的事情。但是計算機可以,如下:
為什麼計算機可以,因為計算機計算能力強,我們知道它有cpu、gpu.....但,這不是重點。重點是,我們知道它能辦到,對於程式設計入門來說,這就夠了。
我們入門到底需要掌握什麼:
說了這麼多,可能都不是所謂的乾貨,但是相信我,看下去你整個思路就會很清晰,當然了,覺得自己了不起的大神,請繞道。那麼,我們入門需要掌握什麼,各類語言都要掌握嗎,其實語言真的不重要,為什麼不重要,其實對於入門者來說,這個不好解釋,解釋的結果跟八股文一樣難以理解,因為你還沒有入門,所以我索性不解釋了,你只要接受這句話(語言對於程式設計不重要)就行。這裡我選c/c++語言做例子,我總結我們初學者需要的技能有什麼,大概是變數、程式流程結構、函式、簡單的資料結構(簡單的程式甚至不考慮這個),基本就夠你寫程式了,事實上我最近的幾個專案的程式都是只有簡單的資料結構+程式結構+函式+變數定義組成。
具體來說,乙個乙個說,先說變數,什麼是變數,我假設你沒學過數學,沒關係,其實變數就是用來指代乙個數的東西,比如上面程式中的a、b、c,是給要儲存的數字起的乙個名字而已,和張三李四的區別是它是字母,有三個人分別叫做a、b、c,當計算機(這個boss)叫到a的時候a就把自己肚子裡的東西(那個數字25534)給他。計算機說a+b的時候,其實和說張三加李四沒什麼區別,這就是變數名字。至於為什麼說是"變數",是因為計算機可以把其他數字叫做a,那a的內容就變了,所以稱變數。
再說程式流程結構,計算機去完成一件事情,也是一步一步來的,那就有三種做事的結構:順序結構,選擇結構 , 迴圈結構。
順序結構就是一件一件來,我想要計算機去給我做飯,那它首先去洗公尺,蒸飯,切菜,然後炒菜,然後端上來....一步一步,按順序來,這就是順序結構。更加貼近程式的描述是,我要計算a+b的結果,那我首先要輸入a的值,輸入b的值,然後計算,然後輸出,這就是順序結構。
再說選擇結構,假設我要出去運動,首先我會關注今天的天氣,如果下雨,我就去學校室內打網球,如果出太陽,那我就去小區公園裡打籃球,這就是選擇結構。更加貼切程式的例子是,我要給小明的分數評等級,首先輸入他的分數,如果分數在60以下,則結果是不及格,如果在60以上就是及格。(當然可以設定各種等級:優秀、良好等)
最後說迴圈結構,可以理解為今天工人在流水線上做事,一直做的就是一件事(比如打包裝),直到今天下午6點下班,迴圈的工作就結束了。更加貼切程式的列子是,我要用程式做1+1+1+.......+1的100個1相加的計算(當然這只是個簡單的例子,只方便理解迴圈的意思),我就定義乙個變數為a=1,然後定義乙個sum初始=0用來存結果,我讓sum迴圈加a一百次,輸出的sum就是結果。
重點說函式:
函式是很重要的,但是函式的存在,也是為什麼能夠快速入門,因為你只要懂了變數的定義,然後知道函式的概念就可以開始程式設計了。
為什麼這麼說,因為函式,可以讓別人來寫,驚訝嗎?所以這就是為什麼程式設計如此簡單。用別人的函式來開發,那就可以很快做出自己的東西。可能有很多所謂的大神並不建議初學者這樣來學習程式設計,但是,我想了很久,覺得這可能是最快成為乙個程式設計師的方法了。這樣進入這個行業之後,才會慢慢開始自己寫函式。放心,有一天你把你的**開源給別人,也會有人用你的函式。
證明一下我的結論_(用c++借助opencv的函式(別人寫的)做影象處理_把彩色圖變成黑白):
你可以通過我的思路快速入門,現在我就證明。假設你想要把任何一張彩色的影象變成黑白的影象,你考慮一下你的程式該怎麼寫,你考慮你的怎麼輸程序式裡嗎?考慮怎麼把顏色去掉嗎?相信初學的你不會有思路怎麼做到。
如果我給你加乙個前提,這個前提是,opencv是乙個開源的庫,裡面提供了mat的變數型別,乙個mat可以代表一張,你又會怎麼考慮來實現彩色圖轉成黑白圖?
正常人會這樣考慮,我的輸入是一張彩色,那我定義乙個mat 變數來存我的彩色,我的輸出是我想顯示出黑白的圖,但是中間那步轉換過程我不知道怎麼辦。這時候,我提示一下你,你可以用函式,你會不會想到去查一下opencv裡面有沒有現成的彩色轉黑白的函式呢?現在事情就變得簡單了,重新整理一下:
定義乙個mat 來代表我的彩色圖,(當然你得在某個路徑下有一張彩色圖,然後用乙個opencv裡面的函式到那個路徑去讀出來,沒錯,這個也有函式:imread)
用opencv自帶的函式cvtcolor來實現彩色轉黑白
定義乙個mat 來存黑白影象
將得到的黑白影象顯示出來
下面是**和效果:(你根本不用關心怎麼去搭建環境、建立專案和開始寫**,因為這都很簡單,理解上面的,你就開始了)
希望這篇文章的結束,是你程式入門的開始。
Linux程式設計師入門
需要熟悉的工具 一種用vi,一種用emacs,其他的歸為第三類。推薦csdn easwy的vim系列文章,當然,vim最佳參考是其作者bram moolenaar的 vim使用者手冊 另,這本書的中譯本非常優秀。編譯器 gcc g 非常多的命令列引數,以此熟悉早已忘卻的編譯原理課程。其作者stall...
Linux程式設計師入門
需要熟悉的工具 編輯器 vim emacs 當然有許多其他編輯器,但這兩種是被最為廣泛使用的。其他桌面環境中的編輯器並不推薦。傳說只有世界只有三種程式設計師,一種用vi,一種用emacs,其他的歸為第三類。推薦csdn easwy的vim系列文章,當然,vim最佳參考是其作者bram moolena...
Linux程式設計師入門
需要熟悉的工具 當然有許多其他編輯器,但這兩種是被最為廣泛使用的。一種用vi,一種用emacs,其他的歸為第三類。另,這本書的中譯本非常優秀。編譯器 gcc g 非常多的命令列引數,以此熟悉早已忘卻的編譯原理課程。偵錯程式 gdb。通過gdb熟悉命令列除錯。有gui除錯介面ddd工具,但並不推薦。其...