最快入门程序员
前面的話:
這么久以來,我一直思考一個(gè)問題,就是怎么從一個(gè)其他的專業(yè)入門進(jìn)入程序員行業(yè),從業(yè)余變成專業(yè)。從什么也不會(huì),到可以完成基本的代碼編寫,到可以完成簡(jiǎn)單的程序任務(wù),并且在后期完全進(jìn)入這個(gè)行業(yè),有自己往下專研的能力。
隔行如隔山:
隔行如隔山,其實(shí)不止是隔行如隔山。
想象這樣一幅場(chǎng)景,同樣是做軟件開發(fā)的人,如果我從未接觸過python,我是一名C程序猿,有一天另外一個(gè)專門的python程序員跟我說一堆python的概念,說python如何簡(jiǎn)潔高效優(yōu)美,能夠完成多少不可思議的任務(wù),他說的越詳細(xì),越感覺深入,越感覺到表達(dá)的很清楚,我也只是感覺到他的情緒而已,而對(duì)于python我卻一無所知。在我真正進(jìn)入python這門技術(shù)之前,我依然會(huì)覺得那很難讓人理解,因?yàn)閷?duì)不確定性的恐懼將是第一扇難以打開的門。
出于工作需要,時(shí)間很少,所在的領(lǐng)域?qū)W到的工具和技術(shù)是有限的,所以在工作中沒有涉及到的領(lǐng)域,往往以后也不太可能談得上說精通,即使是出于興趣研究過一段時(shí)間,也只能稍微熟悉,至于一門技術(shù)的精髓,那只能在大量的項(xiàng)目實(shí)際應(yīng)用中才能體現(xiàn)。
我卻嘗試引領(lǐng)你快速入門:
入門一個(gè)新行業(yè)那么難,有時(shí)間不夠的壓力,有興趣不足的阻礙(其實(shí)沒進(jìn)入無從談興趣)、有天生的專業(yè)缺陷、有那么多沒法理解的概念,那么多那么多的困難,這就是實(shí)實(shí)在在的難點(diǎn),沒有辦法嗎?不,如果我現(xiàn)在告訴你沒有辦法,那我這篇文章就是在扯淡,就是毫無意義。我會(huì)告訴你,這是有辦法的,我真正做的一件事情,就是在這么多困難面前,引領(lǐng)你快速入門。
你無法要求你自己從一開始就理解什么是程序的本質(zhì):
你無法要求你自己從一開始就理解什么是程序的本質(zhì),就算是我,可以在這里大言不慚寫文章的我,也談不上真正明白程序的本質(zhì)。只不過,通過實(shí)踐和學(xué)習(xí),我有了自己的一些理解而已,僅此而已,真理是什么其實(shí)我們并不關(guān)心。如果你想入門就成為所謂的大牛的水平,那是做夢(mèng),技術(shù)從來都是從頭開始,一點(diǎn)一點(diǎn)積累的,就像你看過一分鐘打兩百字的打字員,你就應(yīng)該明白他曾經(jīng)敲壞過多少鍵盤,任何事情都無法一蹴而就。但是,打住。編程這件事情,其實(shí)是可以速成的。
程序的本質(zhì):
編程的本質(zhì)是什么,在我看來,編程是用代碼的方法告訴計(jì)算機(jī),讓他去完成我不愿意親自去做的或者我根本就做不到事情。比如,做一個(gè)乘法,25534x32324,這是我能做到但我不愿意去做的事情,因?yàn)樵诩埳献鑫矣X得很累很麻煩。又比如計(jì)算92.3782的開根號(hào)結(jié)果,那是我能力做不到的事情。但是計(jì)算機(jī)可以,如下:
為什么計(jì)算機(jī)可以,因?yàn)橛?jì)算機(jī)計(jì)算能力強(qiáng),我們知道它有CPU、GPU.....但,這不是重點(diǎn)。重點(diǎn)是,我們知道它能辦到,對(duì)于編程入門來說,這就夠了。
我們?nèi)腴T到底需要掌握什么:
說了這么多,可能都不是所謂的干貨,但是相信我,看下去你整個(gè)思路就會(huì)很清晰,當(dāng)然了,覺得自己了不起的大神,請(qǐng)繞道。那么,我們?nèi)腴T需要掌握什么,各類語言都要掌握嗎,其實(shí)語言真的不重要,為什么不重要,其實(shí)對(duì)于入門者來說,這個(gè)不好解釋,解釋的結(jié)果跟八股文一樣難以理解,因?yàn)槟氵€沒有入門,所以我索性不解釋了,你只要接受這句話(語言對(duì)于編程不重要)就行。這里我選C/C++語言做例子,我總結(jié)我們初學(xué)者需要的技能有什么,大概是變量、程序流程結(jié)構(gòu)、函數(shù)、簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)(簡(jiǎn)單的程序甚至不考慮這個(gè)),基本就夠你寫程序了,事實(shí)上我最近的幾個(gè)項(xiàng)目的程序都是只有簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)+程序結(jié)構(gòu)+函數(shù)+變量定義組成。
具體來說,一個(gè)一個(gè)說,先說變量,什么是變量,我假設(shè)你沒學(xué)過數(shù)學(xué),沒關(guān)系,其實(shí)變量就是用來指代一個(gè)數(shù)的東西,比如上面程序中的a、b、c,是給要保存的數(shù)字起的一個(gè)名字而已,和張三李四的區(qū)別是它是字母,有三個(gè)人分別叫做a、b、c,當(dāng)計(jì)算機(jī)(這個(gè)boss)叫到a的時(shí)候a就把自己肚子里的東西(那個(gè)數(shù)字25534)給他。計(jì)算機(jī)說a+b的時(shí)候,其實(shí)和說張三加李四沒什么區(qū)別,這就是變量名字。至于為什么說是"變量",是因?yàn)橛?jì)算機(jī)可以把其他數(shù)字叫做a,那a的內(nèi)容就變了,所以稱變量。
再說程序流程結(jié)構(gòu),計(jì)算機(jī)去完成一件事情,也是一步一步來的,那就有三種做事的結(jié)構(gòu):順序結(jié)構(gòu),選擇結(jié)構(gòu) , 循環(huán)結(jié)構(gòu)。
順序結(jié)構(gòu)就是一件一件來,我想要計(jì)算機(jī)去給我做飯,那它首先去洗米,蒸飯,切菜,然后炒菜,然后端上來....一步一步,按順序來,這就是順序結(jié)構(gòu)。更加貼近程序的描述是,我要計(jì)算a+b的結(jié)果,那我首先要輸入a的值,輸入b的值,然后計(jì)算,然后輸出,這就是順序結(jié)構(gòu)。
再說選擇結(jié)構(gòu),假設(shè)我要出去運(yùn)動(dòng),首先我會(huì)關(guān)注今天的天氣,如果下雨,我就去學(xué)校室內(nèi)打網(wǎng)球,如果出太陽,那我就去小區(qū)公園里打籃球,這就是選擇結(jié)構(gòu)。更加貼切程序的例子是,我要給小明的分?jǐn)?shù)評(píng)等級(jí),首先輸入他的分?jǐn)?shù),如果分?jǐn)?shù)在60以下,則結(jié)果是不及格,如果在60以上就是及格。(當(dāng)然可以設(shè)定各種等級(jí):優(yōu)秀、良好等)
最后說循環(huán)結(jié)構(gòu),可以理解為今天工人在流水線上做事,一直做的就是一件事(比如打包裝),直到今天下午6點(diǎn)下班,循環(huán)的工作就結(jié)束了。更加貼切程序的列子是,我要用程序做1+1+1+.......+1的100個(gè)1相加的計(jì)算(當(dāng)然這只是個(gè)簡(jiǎn)單的例子,只方便理解循環(huán)的意思),我就定義一個(gè)變量為a=1,然后定義一個(gè)sum初始=0用來存結(jié)果,我讓sum循環(huán)加a一百次,輸出的sum就是結(jié)果。
重點(diǎn)說函數(shù):
函數(shù)是很重要的,但是函數(shù)的存在,也是為什么能夠快速入門,因?yàn)槟阒灰俗兞康亩x,然后知道函數(shù)的概念就可以開始編程了。
為什么這么說,因?yàn)楹瘮?shù),可以讓別人來寫,驚訝嗎?所以這就是為什么編程如此簡(jiǎn)單。用別人的函數(shù)來開發(fā),那就可以很快做出自己的東西。可能有很多所謂的大神并不建議初學(xué)者這樣來學(xué)習(xí)編程,但是,我想了很久,覺得這可能是最快成為一個(gè)程序員的方法了。這樣進(jìn)入這個(gè)行業(yè)之后,才會(huì)慢慢開始自己寫函數(shù)。放心,有一天你把你的代碼開源給別人,也會(huì)有人用你的函數(shù)。
函數(shù)有輸入和輸出,綜上可知,你只要知道你的輸入是什么,并且想得到的結(jié)果是什么,那就夠了,其他的工作,借助第三方吧,無論是百度別人分享的代碼,還是一個(gè)開源的API(不用懂這是什么,簡(jiǎn)單認(rèn)為這是別人寫好的函數(shù)),或者是系統(tǒng)以及集成的函數(shù)。
證明一下我的結(jié)論_(用C++借助opencv的函數(shù)(別人寫的)做圖像處理_把彩色圖變成黑白):
你可以通過我的思路快速入門,現(xiàn)在我就證明。假設(shè)你想要把任何一張彩色的圖像變成黑白的圖像,你考慮一下你的程序該怎么寫,你考慮你的圖片怎么輸進(jìn)程序里嗎?考慮怎么把顏色去掉嗎?相信初學(xué)的你不會(huì)有思路怎么做到。
如果我給你加一個(gè)前提,這個(gè)前提是,opencv是一個(gè)開源的庫,里面提供了Mat的變量類型,一個(gè)Mat可以代表一張圖片,你又會(huì)怎么考慮來實(shí)現(xiàn)彩色圖轉(zhuǎn)成黑白圖?
正常人會(huì)這樣考慮,我的輸入是一張彩色圖片,那我定義一個(gè)Mat 變量來存我的彩色圖片,我的輸出是我想顯示出黑白的圖,但是中間那步轉(zhuǎn)換過程我不知道怎么辦。這時(shí)候,我提示一下你,你可以用函數(shù),你會(huì)不會(huì)想到去查一下opencv里面有沒有現(xiàn)成的彩色轉(zhuǎn)黑白的函數(shù)呢?現(xiàn)在事情就變得簡(jiǎn)單了,重新整理一下:
定義一個(gè)Mat 來代表我的彩色圖,(當(dāng)然你得在某個(gè)路徑下有一張彩色圖,然后用一個(gè)opencv里面的函數(shù)到那個(gè)路徑去讀出來,沒錯(cuò),這個(gè)也有函數(shù):imread)
用opencv自帶的函數(shù)cvtcolor來實(shí)現(xiàn)彩色轉(zhuǎn)黑白
定義一個(gè)Mat 來存黑白圖像
將得到的黑白圖像顯示出來
下面是代碼和效果:(你根本不用關(guān)心怎么去搭建環(huán)境、創(chuàng)建項(xiàng)目和開始寫代碼,因?yàn)檫@都很簡(jiǎn)單,理解上面的,你就開始了)
希望這篇文章的結(jié)束,是你程序入門的開始。
總結(jié)
- 上一篇: [蓝桥杯][算法提高VIP]质数的后代-
- 下一篇: XSKY星辰天合发布星海架构和星飞产品