那些年薪百萬的程序員“鹹魚翻身”沒有透露的祕密


首先,世界上沒有最好的程序語言,只有最適合個人程序語言。程序語言本來就只是工具、只是手段,從來都不是重點,

重點是:你的目的是什麼?你要解決的問題是什麼?

假設你今天想要寫一個網頁留言板(這邊只討論後端,不包含前端),那你就不應該用C來寫,因爲比起C,php會更適合,很多phper要說了“php是世界上最好的語言”

你可能會問:那nodejs,rails,asp.net…就不適合嗎?

如果你只是單純想寫個網頁留言板,其實上面這些都很適合,挑一個你最喜歡的語言就好

但如果你要解決的問題不一樣,就應該重新思考。例如說,我想要很短的時間的寫個網頁留言板,你就應該用rails,因爲rails開發真的超級快,隨便打幾個command,你的網頁就神奇的出現了!

“我想要很潮的網頁留言板!”那你可以考慮Go,Swift,Nodejs等等

再舉個例子,加入你今天想要研究電腦較底層的運作,那麼你應該要學C,或是學彙編語言因爲比起其他高階語言,這兩種絕對會讓你更瞭解底層到底在做什麼,其實以上這些只是想提醒你:不要爲了學語言而學語言。

程序語言只是一個好的解決方案,重點在於最終的目的!重點在於你想要通過程序,達成什麼樣的目標,當然如果你真的只是純粹喜歡寫程序,就當我沒說。

爲什麼要當程序員?

我的理由很簡單:爲中華之崛起而寫代碼!我覺得做程序開發讓我很有成就感,只要幾天就可以寫出一個網頁程序員,可以隨時幫自己寫博客系統、幫朋友開發投票網站系統之類或者去程序員客棧www.proginn.com接私活賺些外快等等。儘管早期寫出來的東西可能不怎麼樣,但那種從無到有真的是一件非常有成就感的事情。

 

我永遠忘不了我用VB拉幾個按鈕出來,點下去就可以跑出文字的那瞬間,我有多感動,那是我第一次寫代碼,雖然當時還比較菜,但是“興趣的培養”是每個程序員一生必備的職業興奮劑,下面給單純有興趣或者想轉行程序員的同學一些建議,希望能夠幫到大家。

1.學英文

這個其實上學的時候大家都有在學,只不過個人差異,每個人的水平也都參差不齊。

Q:我該學什麼程序語言

A:英文

爲什麼?因爲英文真的很重要!聽說讀寫,至少讀要讀的懂,你纔看的懂那些外國的API文件,發生問題的時候,才能去stackoverflow上面發問,說到這裏就必須要和大家說一些基本的提問技巧,很多問題爲什麼很少人願意回答?例如:我寫了一個網絡通信的程序,想要讓A手機跟B手機可以傳信息,可是按了卻沒反應,怎麼辦?我的代碼不夠優雅怎麼辦?



 

一個好的問題,應該言簡意賅,直擊重點,個人覺得應該要包含四點:

1.目的(你的程序要達成什麼目的?)

2.手段(你怎麼達成你的目的?)

3.錯誤(在什麼場景下發生的什麼錯誤?)

4.代碼(有排版過的代碼,拜託)

所以將問題改成:

我想要讓A手機跟B手機傳遞信息,我用的是java的socket,可是按下發送時,出現:java.net.SocketException: Connection refused: connect,想請問一下有可能是錯在哪裏?

部分代碼:https://gist.github.com/xxxxxx

上面的問題還可以再修正、補充更多細節,但至少比剛開始那個好回答的多,會讓人比較想回答,代碼一定要找適合的地方保存。再回到英文的這個話題上來,英文不好的話,其實國內的資源也很多,但很多新的技術或者人氣旺的地方還是用英文,所以英文好的話不會吃虧,可以運用到更多的資源。

2,google很重要

相信我,google真的要比其他搜索都好用,我經常認爲會google就先贏了一半,現在網上資源那麼多,有時候出現你不懂的ERROR,完全沒有頭緒怎麼辦?最簡單粗暴的方法就是直接google,一堆解決方法就出現了,這個時候不是簡單的複製粘貼,而要去試着理解爲什麼這麼做,一個不會理解代碼的人,只會是一個複製粘貼的機器人,這樣對自己的成長沒有好處,至少要弄清楚兩點:爲什麼會有這樣的問題、這個解法是如何解決的?關鍵詞的使用非常的重要,比如一些常用的指令一定要學會,例如:inurl:、intitle、filetype等等。

3.學scratch

我聽過這個很多次,但實際接觸才知道真的很好用,這個就是讓你用很簡單、很可視化的方式來寫程序,你只要拖拉幾個拼圖、組合在一起,就可以寫出一只可以動的程序,甚至是一個小遊戲!

如何開始學scratch?

如果是我的話,就會google搜尋:scratch教學,或是scratch入門

爲什麼要學scratch呢?

前面有說到,每種程序語言都有不同的適合的場景,還有一點是,每種程序語言,都有很大部分是相同的,例如說:變數、函式、循環、條件判斷、數組…

當你學C有這些、Javascript有這些、Swift有這些,不管學哪種程序,都會碰到這些最基本的東西,無論是再複雜的程序,都是這些基本的東西組裝而成。

從scratch來學這些基礎有兩個好處

1.不被語法限制

2.可視化

scratch裏面你幾乎不用打字,甚至可以看做是拼圖遊戲,你就把你想要的東西拼一拼,程序就寫完了,所以你學的是真正的概念,而不是語法。

舉例來說,如果你學C,你就要學:



 

如果你學python,就會是:



 

其實我不會python,如果寫錯的話,各位Python大神原諒,但這兩者本質上是一樣的東西,都是循環,只是語法不同而已!

從scratch開始,可以讓你跳脫這些語法,只學那些精髓,你學完之後,看到C的這段就會知道:哦,原來這就是循環呀

第二點,可視化也是很重要的一項,儘管我代碼寫了很多年,我永遠忘不掉,我在循環這個坑卡了多久,尤其時雙重循環,根本就是惡夢!

我知道這邊是1到10的意思,但是第二層爲什麼會這樣?

爲什麼這樣就可以印出九九表?

那時候我面對的是冷冰冰的代碼,大概就是:



 

儘管我可以很輕鬆從排版跟大括號一眼看出「block」的概念,但十年前的我完全不行,至少覺得這就是天書,可是scratch就不一樣了!它直接用可視化的拼圖的概念,讓你在循環裏面可以塞另外一塊拼圖,就可以明白爲什麼雙重循環會是這樣了!

4.有些指令一定要會(command line操作)

這是什麼?對,你沒有看錯,這就是電影裏面看起來很帥的,底是全黑的畫面,屏幕上面滿滿的文字,一張圖都沒有,在windows就是cmd,命令提示字元。

在mac就是terminal,終端機,假如你已經對上面介紹的scratch滿熟悉了,那你應該瞭解程序幾個基本概念,其中一個重要的概念是:寫程序其實就是在對電腦下指令,其實呢,你平常在做的事情,也是在對電腦下指令,但操作系統幫你包裝好了,所以你只要動動手指就可以,例如說你在網頁上按了重新整理。

「我要重新整理」換成程序大概就是:page.refresh();或是:「點了前往google.com的連接」window.open('google.com');(這邊代碼都隨便寫的,但意思有到就好),我們所謂的command line,就如同字面上這樣是個「用文字對電腦下指令」的地方,像是ls,就是list的意思,會把你「現在在的地方」的檔案都顯示出來。

「現在在的地方是哪裏?」打pwd,Print Working Directory就會顯示出你現在在「電腦的哪個文件夾底下」

幫大家準備好幾個連接了:

(關鍵字:終端機教學)

OS X Lion 10.7系統基礎教學系列-終端機基礎操作教學

介紹命令行(command-line)界面

Mac OS X Terminal 101:終端使用初級教程

Mac OS X Terminal終端機常用語法教學

爲什麼要學這個呢?因爲工作上很大機會用的到,而且日常生活也很好用,有些功能你用java寫的要死要活,最後才發現原來電腦就有內置指令,我也是最近一年纔開始熟悉這些指令的操作,才發現原來內置指令這麼好用,給程序開發初學者一些建議,你需要知道這些,並且瞭解:cd,ls,pwd,touch,mkdir,rm,cat,grep這些指令,還有> >> < |這些符號在幹嘛,這樣就很足夠了,想更精進的可以去學怎麼寫shell script。

5.學怎麼用browser dev tool

chrome,firefox,safari,edge都有一樣的東西,叫做開發者工具,爲什麼要學會這個呢?因爲你可以瞭解很多東西!日常生活中,你其實一直在接觸網絡的概念,只是你沒發覺而已你平常看到的網頁,其實也只是一堆文字而已,那爲什麼文字會變成畫面?因爲瀏覽器幫你解析,按照一定的規則畫出來,你可以右鍵->檢查,就可以看到你鼠標指的地方本來的文字是什麼

dev tool可以講到一堆跟web有關的概念get/post,ajax,status,css,js,html等等,現成的好工具,不用嗎?

6.選你想走的領域精進

假設你上面都有確實做到,你現在應該對程序、對網絡都不會太陌生了,這時候再來學專門的東西,我認爲是事半功倍。

爲什麼?因爲原本那些程序基礎你都可以跳過,你要學的只是語法,學程序最重要的應該是「心法、內功」,而不是表面的限制,這樣就算換了一個你從沒看過的程序語言,你也會猜的到它在幹嘛。如果你看了這篇文章也想成爲一名程序員,這裏要提醒大家的是心態一定要正確,所謂鹹魚翻身,學會程序開發年薪幾百萬之類的新聞,千萬不要相信,很多這種個例是因爲之前已經有某項技能專場,再把專場和程序開發結合起來最終沉澱出來的結果,而大部分沒有任何能力基礎和背景的人比起這些特殊案例,這些新聞你可以選擇忽略,做人最重要的還是腳踏實地。

7.開通個人博客寫經驗

可以開個blog寫寫自己的學習歷程、碰到的困難以及解法等等爲什麼要寫這個?

第一是加深印象,你解決一個問題下次再碰到時,你還記得怎麼解嗎?很多時候踩過的坑會反覆踩,代碼有時候過兩三個月會忘掉,但這時候就因爲我有寫blog記錄起來,可以查的到以前自己怎麼解的。

第二是增加功力,我要怎麼知道我真的瞭解一個東西?

我覺得寫下來,會清楚的認識到自己的能力水平,例如說我今天要寫:git入門教學,寫一寫發現自己不知道rebase在幹嘛,我就必須去查,查完之後寫在文章裏面,你寫的出來,你就一定懂這項技術而且博客是公開的,若有路人看到你寫錯,說不定還會來糾正你,你就又學到一課了!

第三是累積個人聲望,好的程序員個人博客對於求職絕對有加分效果,假設你今天是面試官

A的履歷寫:精通Javascript

B的履歷寫:精通Javascript,可參照我寫過的:深入Javascript原理系列文章

結果你跑去B的博客看,真的寫了一系列深入的文章在研究,不用面試,你就知道B是個有真材實料的人(前提是面試官會去看你blog裏面的文章)

8.學數據結構跟算法

就是俗稱的Data Structures and Algorithm,DSA,假如你真的對這行很有興趣,想要一直待在這邊而且薪水越來越高的話,你就勢必要開始補足一些額外的技能「自學的人通常不會有的本科系知識」,因爲自學者通常都直接從html,css,javascript,php,rails等等的開始,甚至連數據結構跟算法都沒聽過!有接觸而且實作過的更是少數。

那爲什麼要學這兩樣東西呢?

第一,增加自信

其實能力強,自信就會強,增加自信是因爲,自學者通常也是非本科系的學生,可能會覺得自己跟本科系的實例有一段落差,這時候若是學了本科系在學的DSA,就可以彌補這一段落差。以我個人來舉例,因爲我很早就接觸到DSA,到現在出社會找工作,就是因爲我有這段經歷,所以我有自信我絕對不會差本科系太多,甚至會比一些很混的畢業生強,事實上也是如此,去面試的時候有間公司考我排序的問題,就是一些很基本的,說你知道哪些排序法,跟時間複雜度之類的。

“自信在某些時候很重要,能夠爲你帶來打不倒的勇氣”

面試沒通過,沒自信的人會覺得:一定是我太爛

有自信的人會覺得:是公司沒眼光(前提是你的自信不是來自於自我感覺良好)

第二,增進對電腦底層的理解度

剛開始你可能只是個拿5k的薪水,但工作久了,可能變成10k,20k,甚至50k,當你薪水變得越高,要解決的問題也相對的更重要,DSA是大公司的必備技能之一,爲什麼那些大公司面試要考這些?如果不會二叉樹反轉,就算是知名工程師也沒用?

(之前Google的面試爭議:雖然我們公司90%的工程師都用你開發的工具,但我們還是不聘用你)

就如同我開頭所說的,重點在目的、在於要解決的問題

你在一家普通的臺灣電商網站工作,需要會什麼?

你可能要會寫php,因爲要改進購物車,要改進物品上架系統,所以你根本不必懂DSA,因爲沒什麼太大的幫助。

Google要解決的問題是什麼?

可能是「排序10億個數字」、「阿發狗的下棋算法」等等,從要解決的問題看來,你就知道爲什麼Google面試時要考那些了。

如果你要在技術上日漸精進,你遲早要碰到那些較底層的東西,這跟問題規模有很大的關係,假設你公司今天是做旅遊訂票,同時100個人搶,一般工程師都可以自己應付,如果同時10000個人搶,這就不一樣了,在服務器上你可以能要多開幾臺機器,要調整一些構架,而程序當然也要跟着調整。

或是你會發現許多大公司,常常都會自己有一些項目,爲什麼?因爲市面上沒有符合他們需求的東西,所以要自己寫一個。

如果你沒修過DSA,你怎麼可能實作出virtual DOM diff的算法?

當然我也比較菜,沒去面試過諸多大公司,如果有程序前輩看到這裏麻煩留言:“你的推測錯了!”

最後,引用一段很有哲理的話:如果以蓋大樓來形容這個概念,把砌磚作爲一種技能,把蓋大樓作爲一種知識,我想可以這麼講:如果你早就知道你喜歡砌磚,很會砌磚,就直接去砌磚吧。如果你的夢想是蓋大樓,你要學的東西還很多,那讀大學是你最好的途徑。不是每個人都要蓋大樓,靠砌磚就可以賺錢了,砌的好還可以賺很多錢,大家搶着要。如果你很會寫購物車,那其實你也可以接到很多電商客戶,錢包也是賺滿滿,但如果你是想進Google,Facebook那種大公司,或是想要思考規模更大的問題該如何解決,那就學DSA吧!

9.樂於分享

這一點我一直非常認同,分享從來不是單向的,當你分享知識給別人的時候,也會得到許多回饋,尤其在教別人的時候,你會更清楚自己哪裏不太懂,個人認爲分享是一件非常重要的事情,取之於社會,用之於社會,如果大家都樂意分享,這樣此時一個正向循環,希望大家共勉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章