首先,世界上沒有最好的程序語(yǔ)言,只有最適合個(gè)人程序語(yǔ)言。程序語(yǔ)言本來就只是工具、只是手段,從來都不是重點(diǎn),重點(diǎn)是:你的目的是什么?你要解決的問題是什么?
假設(shè)你今天想要寫一個(gè)網(wǎng)頁(yè)留言板(這邊只討論后端,不包含前端),那你就不應(yīng)該用C來寫,因?yàn)楸绕餋,php會(huì)更適合,很多phper要說了“php是世界上最好的語(yǔ)言”
你可能會(huì)問:那nodejs,rails,asp.net…就不適合嗎?
如果你只是單純想寫個(gè)網(wǎng)頁(yè)留言板,其實(shí)上面這些都很適合,挑一個(gè)你最喜歡的語(yǔ)言就好
但如果你要解決的問題不一樣,就應(yīng)該重新思考。例如說,我想要很短的時(shí)間的寫個(gè)網(wǎng)頁(yè)留言板,你就應(yīng)該用rails,因?yàn)閞ails開發(fā)真的超級(jí)快,隨便打幾個(gè)command,你的網(wǎng)頁(yè)就神奇的出現(xiàn)了!
“我想要很潮的網(wǎng)頁(yè)留言板!”那你可以考慮Go,Swift,Nodejs等等
再舉個(gè)例子,加入你今天想要研究電腦較底層的運(yùn)作,那么你應(yīng)該要學(xué)C,或是學(xué)匯編語(yǔ)言因?yàn)楸绕鹌渌唠A語(yǔ)言,這兩種絕對(duì)會(huì)讓你更了解底層到底在做什么,其實(shí)以上這些只是想提醒你:不要為了學(xué)語(yǔ)言而學(xué)語(yǔ)言。
程序語(yǔ)言只是一個(gè)好的解決方案,重點(diǎn)在于最終的目的!重點(diǎn)在于你想要通過程序,達(dá)成什么樣的目標(biāo),當(dāng)然如果你真的只是純粹喜歡寫程序,就當(dāng)我沒說。
為什么要當(dāng)程序員?
我的理由很簡(jiǎn)單:為中華之崛起而寫代碼!我覺得做程序開發(fā)讓我很有成就感,只要幾天就可以寫出一個(gè)網(wǎng)頁(yè)程序員,可以隨時(shí)幫自己寫博客系統(tǒng)、幫朋友開發(fā)投票網(wǎng)站系統(tǒng)之類或者去程序員客棧www.proginn.com接私活賺些外快等等。盡管早期寫出來的東西可能不怎么樣,但那種從無到有真的是一件非常有成就感的事情。
我永遠(yuǎn)忘不了我用VB拉幾個(gè)按鈕出來,點(diǎn)下去就可以跑出文字的那瞬間,我有多感動(dòng),那是我第一次寫代碼,雖然當(dāng)時(shí)還比較菜,但是“興趣的培養(yǎng)”是每個(gè)程序員一生必備的職業(yè)興奮劑,下面給單純有興趣或者想轉(zhuǎn)行程序員的同學(xué)一些建議,希望能夠幫到大家。
1.學(xué)英文
這個(gè)其實(shí)上學(xué)的時(shí)候大家都有在學(xué),只不過個(gè)人差異,每個(gè)人的水平也都參差不齊。
Q:我該學(xué)什么程序語(yǔ)言
A:英文
為什么?因?yàn)橛⑽恼娴暮苤匾?!聽說讀寫,至少讀要讀的懂,你才看的懂那些外國(guó)的API文件,發(fā)生問題的時(shí)候,才能去stackoverflow上面發(fā)問,說到這里就必須要和大家說一些基本的提問技巧,很多問題為什么很少人愿意回答?例如:我寫了一個(gè)網(wǎng)絡(luò)通信的程序,想要讓A手機(jī)跟B手機(jī)可以傳信息,可是按了卻沒反應(yīng),怎么辦?我的代碼不夠優(yōu)雅怎么辦?
一個(gè)好的問題,應(yīng)該言簡(jiǎn)意賅,直擊重點(diǎn),個(gè)人覺得應(yīng)該要包含四點(diǎn):
1.目的(你的程序要達(dá)成什么目的?)
2.手段(你怎么達(dá)成你的目的?)
3.錯(cuò)誤(在什么場(chǎng)景下發(fā)生的什么錯(cuò)誤?)
4.代碼(有排版過的代碼,拜托)
所以將問題改成:
我想要讓A手機(jī)跟B手機(jī)傳遞信息,我用的是java的socket,可是按下發(fā)送時(shí),出現(xiàn):java.net.SocketException: Connection refused: connect,想請(qǐng)問一下有可能是錯(cuò)在哪里?
部分代碼:https://gist.github.com/xxxxxx
上面的問題還可以再修正、補(bǔ)充更多細(xì)節(jié),但至少比剛開始那個(gè)好回答的多,會(huì)讓人比較想回答,代碼一定要找適合的地方保存。再回到英文的這個(gè)話題上來,英文不好的話,其實(shí)國(guó)內(nèi)的資源也很多,但很多新的技術(shù)或者人氣旺的地方還是用英文,所以英文好的話不會(huì)吃虧,可以運(yùn)用到更多的資源。
2,google很重要
相信我,google真的要比其他搜索都好用,我經(jīng)常認(rèn)為會(huì)google就先贏了一半,現(xiàn)在網(wǎng)上資源那么多,有時(shí)候出現(xiàn)你不懂的ERROR,完全沒有頭緒怎么辦?最簡(jiǎn)單粗暴的方法就是直接google,一堆解決方法就出現(xiàn)了,這個(gè)時(shí)候不是簡(jiǎn)單的復(fù)制粘貼,而要去試著理解為什么這么做,一個(gè)不會(huì)理解代碼的人,只會(huì)是一個(gè)復(fù)制粘貼的機(jī)器人,這樣對(duì)自己的成長(zhǎng)沒有好處,至少要弄清楚兩點(diǎn):為什么會(huì)有這樣的問題、這個(gè)解法是如何解決的?關(guān)鍵詞的使用非常的重要,比如一些常用的指令一定要學(xué)會(huì),例如:inurl:、intitle、filetype等等。
3.學(xué)scratch
我聽過這個(gè)很多次,但實(shí)際接觸才知道真的很好用,這個(gè)就是讓你用很簡(jiǎn)單、很可視化的方式來寫程序,你只要拖拉幾個(gè)拼圖、組合在一起,就可以寫出一只可以動(dòng)的程序,甚至是一個(gè)小游戲!
如何開始學(xué)scratch?
如果是我的話,就會(huì)google搜尋:scratch教學(xué),或是scratch入門
為什么要學(xué)scratch呢?
前面有說到,每種程序語(yǔ)言都有不同的適合的場(chǎng)景,還有一點(diǎn)是,每種程序語(yǔ)言,都有很大部分是相同的,例如說:變數(shù)、函式、循環(huán)、條件判斷、數(shù)組…
當(dāng)你學(xué)C有這些、Javascript有這些、Swift有這些,不管學(xué)哪種程序,都會(huì)碰到這些最基本的東西,無論是再?gòu)?fù)雜的程序,都是這些基本的東西組裝而成。
從scratch來學(xué)這些基礎(chǔ)有兩個(gè)好處
1.不被語(yǔ)法限制
2.可視化
scratch里面你幾乎不用打字,甚至可以看做是拼圖游戲,你就把你想要的東西拼一拼,程序就寫完了,所以你學(xué)的是真正的概念,而不是語(yǔ)法。
舉例來說,如果你學(xué)C,你就要學(xué):
如果你學(xué)python,就會(huì)是:
其實(shí)我不會(huì)python,如果寫錯(cuò)的話,各位Python大神原諒,但這兩者本質(zhì)上是一樣的東西,都是循環(huán),只是語(yǔ)法不同而已!
從scratch開始,可以讓你跳脫這些語(yǔ)法,只學(xué)那些精髓,你學(xué)完之后,看到C的這段就會(huì)知道:哦,原來這就是循環(huán)呀
第二點(diǎn),可視化也是很重要的一項(xiàng),盡管我代碼寫了很多年,我永遠(yuǎn)忘不掉,我在循環(huán)這個(gè)坑卡了多久,尤其時(shí)雙重循環(huán),根本就是惡夢(mèng)!
我知道這邊是1到10的意思,但是第二層為什么會(huì)這樣?
為什么這樣就可以印出九九表?
那時(shí)候我面對(duì)的是冷冰冰的代碼,大概就是:
盡管我可以很輕松從排版跟大括號(hào)一眼看出「block」的概念,但十年前的我完全不行,至少覺得這就是天書,可是scratch就不一樣了!它直接用可視化的拼圖的概念,讓你在循環(huán)里面可以塞另外一塊拼圖,就可以明白為什么雙重循環(huán)會(huì)是這樣了!
4.有些指令一定要會(huì)(command line操作)
這是什么?對(duì),你沒有看錯(cuò),這就是電影里面看起來很帥的,底是全黑的畫面,屏幕上面滿滿的文字,一張圖都沒有,在windows就是cmd,命令提示字元。
在mac就是terminal,終端機(jī),假如你已經(jīng)對(duì)上面介紹的scratch滿熟悉了,那你應(yīng)該了解程序幾個(gè)基本概念,其中一個(gè)重要的概念是:寫程序其實(shí)就是在對(duì)電腦下指令,其實(shí)呢,你平常在做的事情,也是在對(duì)電腦下指令,但操作系統(tǒng)幫你包裝好了,所以你只要?jiǎng)觿?dòng)手指就可以,例如說你在網(wǎng)頁(yè)上按了重新整理。
「我要重新整理」換成程序大概就是:page.refresh();或是:「點(diǎn)了前往google.com的連接」window.open('google.com');(這邊代碼都隨便寫的,但意思有到就好),我們所謂的command line,就如同字面上這樣是個(gè)「用文字對(duì)電腦下指令」的地方,像是ls,就是list的意思,會(huì)把你「現(xiàn)在在的地方」的檔案都顯示出來。
「現(xiàn)在在的地方是哪里?」打pwd,Print Working Directory就會(huì)顯示出你現(xiàn)在在「電腦的哪個(gè)文件夾底下」
幫大家準(zhǔn)備好幾個(gè)連接了:
(關(guān)鍵字:終端機(jī)教學(xué))
OS X Lion 10.7系統(tǒng)基礎(chǔ)教學(xué)系列-終端機(jī)基礎(chǔ)操作教學(xué)
介紹命令行(command-line)界面
Mac OS X Terminal 101:終端使用初級(jí)教程
Mac OS X Terminal終端機(jī)常用語(yǔ)法教學(xué)
為什么要學(xué)這個(gè)呢?因?yàn)楣ぷ魃虾艽髾C(jī)會(huì)用的到,而且日常生活也很好用,有些功能你用java寫的要死要活,最后才發(fā)現(xiàn)原來電腦就有內(nèi)置指令,我也是最近一年才開始熟悉這些指令的操作,才發(fā)現(xiàn)原來內(nèi)置指令這么好用,給程序開發(fā)初學(xué)者一些建議,你需要知道這些,并且了解:cd,ls,pwd,touch,mkdir,rm,cat,grep這些指令,還有> >> < |這些符號(hào)在干嘛,這樣就很足夠了,想更精進(jìn)的可以去學(xué)怎么寫shell script。
5.學(xué)怎么用browser dev tool
chrome,firefox,safari,edge都有一樣的東西,叫做開發(fā)者工具,為什么要學(xué)會(huì)這個(gè)呢?因?yàn)槟憧梢粤私夂芏鄸|西!日常生活中,你其實(shí)一直在接觸網(wǎng)絡(luò)的概念,只是你沒發(fā)覺而已你平??吹降木W(wǎng)頁(yè),其實(shí)也只是一堆文字而已,那為什么文字會(huì)變成畫面?因?yàn)闉g覽器幫你解析,按照一定的規(guī)則畫出來,你可以右鍵->檢查,就可以看到你鼠標(biāo)指的地方本來的文字是什么
dev tool可以講到一堆跟web有關(guān)的概念get/post,ajax,status,css,js,html等等,現(xiàn)成的好工具,不用嗎?
6.選你想走的領(lǐng)域精進(jìn)
假設(shè)你上面都有確實(shí)做到,你現(xiàn)在應(yīng)該對(duì)程序、對(duì)網(wǎng)絡(luò)都不會(huì)太陌生了,這時(shí)候再來學(xué)專門的東西,我認(rèn)為是事半功倍。
為什么?因?yàn)樵灸切┏绦蚧A(chǔ)你都可以跳過,你要學(xué)的只是語(yǔ)法,學(xué)程序最重要的應(yīng)該是「心法、內(nèi)功」,而不是表面的限制,這樣就算換了一個(gè)你從沒看過的程序語(yǔ)言,你也會(huì)猜的到它在干嘛。如果你看了這篇文章也想成為一名程序員,這里要提醒大家的是心態(tài)一定要正確,所謂咸魚翻身,學(xué)會(huì)程序開發(fā)年薪幾百萬之類的新聞,千萬不要相信,很多這種個(gè)例是因?yàn)橹耙呀?jīng)有某項(xiàng)技能專場(chǎng),再把專場(chǎng)和程序開發(fā)結(jié)合起來最終沉淀出來的結(jié)果,而大部分沒有任何能力基礎(chǔ)和背景的人比起這些特殊案例,這些新聞你可以選擇忽略,做人最重要的還是腳踏實(shí)地。
7.開通個(gè)人博客寫經(jīng)驗(yàn)
可以開個(gè)blog寫寫自己的學(xué)習(xí)歷程、碰到的困難以及解法等等為什么要寫這個(gè)?
第一是加深印象,你解決一個(gè)問題下次再碰到時(shí),你還記得怎么解嗎?很多時(shí)候踩過的坑會(huì)反復(fù)踩,代碼有時(shí)候過兩三個(gè)月會(huì)忘掉,但這時(shí)候就因?yàn)槲矣袑慴log記錄起來,可以查的到以前自己怎么解的。
第二是增加功力,我要怎么知道我真的了解一個(gè)東西?
我覺得寫下來,會(huì)清楚的認(rèn)識(shí)到自己的能力水平,例如說我今天要寫:git入門教學(xué),寫一寫發(fā)現(xiàn)自己不知道rebase在干嘛,我就必須去查,查完之后寫在文章里面,你寫的出來,你就一定懂這項(xiàng)技術(shù)而且博客是公開的,若有路人看到你寫錯(cuò),說不定還會(huì)來糾正你,你就又學(xué)到一課了!
第三是累積個(gè)人聲望,好的程序員個(gè)人博客對(duì)于求職絕對(duì)有加分效果,假設(shè)你今天是面試官
A的履歷寫:精通Javascript
B的履歷寫:精通Javascript,可參照我寫過的:深入Javascript原理系列文章
結(jié)果你跑去B的博客看,真的寫了一系列深入的文章在研究,不用面試,你就知道B是個(gè)有真材實(shí)料的人(前提是面試官會(huì)去看你blog里面的文章)
8.學(xué)數(shù)據(jù)結(jié)構(gòu)跟算法
就是俗稱的Data Structures and Algorithm,DSA,假如你真的對(duì)這行很有興趣,想要一直待在這邊而且薪水越來越高的話,你就勢(shì)必要開始補(bǔ)足一些額外的技能「自學(xué)的人通常不會(huì)有的本科系知識(shí)」,因?yàn)樽詫W(xué)者通常都直接從html,css,javascript,php,rails等等的開始,甚至連數(shù)據(jù)結(jié)構(gòu)跟算法都沒聽過!有接觸而且實(shí)作過的更是少數(shù)。
那為什么要學(xué)這兩樣?xùn)|西呢?
第一,增加自信
其實(shí)能力強(qiáng),自信就會(huì)強(qiáng),增加自信是因?yàn)?,自學(xué)者通常也是非本科系的學(xué)生,可能會(huì)覺得自己跟本科系的實(shí)例有一段落差,這時(shí)候若是學(xué)了本科系在學(xué)的DSA,就可以彌補(bǔ)這一段落差。以我個(gè)人來舉例,因?yàn)槲液茉缇徒佑|到DSA,到現(xiàn)在出社會(huì)找工作,就是因?yàn)槲矣羞@段經(jīng)歷,所以我有自信我絕對(duì)不會(huì)差本科系太多,甚至?xí)纫恍┖芑斓漠厴I(yè)生強(qiáng),事實(shí)上也是如此,去面試的時(shí)候有間公司考我排序的問題,就是一些很基本的,說你知道哪些排序法,跟時(shí)間復(fù)雜度之類的。
“自信在某些時(shí)候很重要,能夠?yàn)槟銕泶虿坏沟挠職狻?/p>
面試沒通過,沒自信的人會(huì)覺得:一定是我太爛
有自信的人會(huì)覺得:是公司沒眼光(前提是你的自信不是來自于自我感覺良好)
第二,增進(jìn)對(duì)電腦底層的理解度
剛開始你可能只是個(gè)拿5k的薪水,但工作久了,可能變成10k,20k,甚至50k,當(dāng)你薪水變得越高,要解決的問題也相對(duì)的更重要,DSA是大公司的必備技能之一,為什么那些大公司面試要考這些?如果不會(huì)二叉樹反轉(zhuǎn),就算是知名工程師也沒用?
(之前Google的面試爭(zhēng)議:雖然我們公司90%的工程師都用你開發(fā)的工具,但我們還是不聘用你)
就如同我開頭所說的,重點(diǎn)在目的、在于要解決的問題
你在一家普通的臺(tái)灣電商網(wǎng)站工作,需要會(huì)什么?
你可能要會(huì)寫php,因?yàn)橐倪M(jìn)購(gòu)物車,要改進(jìn)物品上架系統(tǒng),所以你根本不必懂DSA,因?yàn)闆]什么太大的幫助。
Google要解決的問題是什么?
可能是「排序10億個(gè)數(shù)字」、「阿發(fā)狗的下棋算法」等等,從要解決的問題看來,你就知道為什么Google面試時(shí)要考那些了。
如果你要在技術(shù)上日漸精進(jìn),你遲早要碰到那些較底層的東西,這跟問題規(guī)模有很大的關(guān)系,假設(shè)你公司今天是做旅游訂票,同時(shí)100個(gè)人搶,一般工程師都可以自己應(yīng)付,如果同時(shí)10000個(gè)人搶,這就不一樣了,在服務(wù)器上你可以能要多開幾臺(tái)機(jī)器,要調(diào)整一些構(gòu)架,而程序當(dāng)然也要跟著調(diào)整。
或是你會(huì)發(fā)現(xiàn)許多大公司,常常都會(huì)自己有一些項(xiàng)目,為什么?因?yàn)槭忻嫔蠜]有符合他們需求的東西,所以要自己寫一個(gè)。
如果你沒修過DSA,你怎么可能實(shí)作出virtual DOM diff的算法?
當(dāng)然我也比較菜,沒去面試過諸多大公司,如果有程序前輩看到這里麻煩留言:“你的推測(cè)錯(cuò)了!”
最后,引用一段很有哲理的話:如果以蓋大樓來形容這個(gè)概念,把砌磚作為一種技能,把蓋大樓作為一種知識(shí),我想可以這么講:如果你早就知道你喜歡砌磚,很會(huì)砌磚,就直接去砌磚吧。如果你的夢(mèng)想是蓋大樓,你要學(xué)的東西還很多,那讀大學(xué)是你最好的途徑。不是每個(gè)人都要蓋大樓,靠砌磚就可以賺錢了,砌的好還可以賺很多錢,大家搶著要。如果你很會(huì)寫購(gòu)物車,那其實(shí)你也可以接到很多電商客戶,錢包也是賺滿滿,但如果你是想進(jìn)Google,F(xiàn)acebook那種大公司,或是想要思考規(guī)模更大的問題該如何解決,那就學(xué)DSA吧!
9.樂于分享
這一點(diǎn)我一直非常認(rèn)同,分享從來不是單向的,當(dāng)你分享知識(shí)給別人的時(shí)候,也會(huì)得到許多回饋,尤其在教別人的時(shí)候,你會(huì)更清楚自己哪里不太懂,個(gè)人認(rèn)為分享是一件非常重要的事情,取之于社會(huì),用之于社會(huì),如果大家都樂意分享,這樣此時(shí)一個(gè)正向循環(huán),希望大家共勉。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。