【天才並非天生】從小白到人人敬仰的編程大神,只需要一年時間

編程是什麼?每個人都有自己的見解。

很多人認為編程是一份工作,只是為了餬口飯吃,也有很多人認為編程是一種愛好,因為喜歡,所以樂此不彼,甚至也有很多人認為編程是此生追求,痴迷到忘我。

其實,編程的意思很簡單,就是編寫程序。

首先,從“編”字分析,它既可以表示編寫,也可以表示按一定的原則、規則或次序來組織或排列。

但“編”,不是胡謅八扯,它的每一步都離不開認真思考。

“程”字,它既可以表示工程,也可以表示行進的距離,還可以是進度。

但“程”,不是亂無章法,它的一舉一動都離不開按步驟執行。

簡單來說,編程就是不停的思考,有條不紊的執行。

【天才並非天生】從小白到人人敬仰的編程大神,只需要一年時間

編程就和做其他事情一樣,沒有捷徑,任何想靠偷懶成功的人,是行不通的;

編程想要成功,就要不斷地思考,只有思考,才可以不斷進步。

想要成為編程天才,不是你只有努力就夠了。你還需要:

  1. 借鑑別人的成功案例,汲取經驗
  2. 常常給自己定個小目標
  3. 提升你的“硬實力”
  4. 分析你的每一次執行
  5. 不斷的反覆地思考
  6. 你已經是“天才”了

1. 借鑑別人的成功案例,汲取經驗

要說編程界的“天才”有哪些,那簡直是太多了,但我們首先想到的應該就是Linux內核的創始人Linus Torvalds了。

【天才並非天生】從小白到人人敬仰的編程大神,只需要一年時間

Linux是Linus 的成名之作,在它的基礎上誕生出許多著名的操作系統,比如:Slackware、Debian、RedHat、Fedora、Ubuntu、LinuxMint等,形成了一個龐大的家族。

Linux現在應用範圍如此廣泛,從初期被人們瞭解,到中期被人們熟知,甚至到後期佔據絕大部分內核江山,都離不開Linus 制定的目標並逐步將其實現。

1987年,荷蘭有一位大學教授,為了方便教學使用,他編寫了一個類Unix的應用系統並命名為Minix。Linus最開始接觸Minix也是為了學術研究,但是接觸一段時間發現Minix一些設計觀念與自己的理解存在一些差異,影響了他的學習研究工作,他本想在Minix基礎上做改動以便能夠支撐他的研究工作,但是他卻由於Minix的許可證不允許,因而他不能輕易修改和發佈該系統的源碼。

於是他就開始著手自己編寫一個簡單的內核OS,基於Intel 80386架構,初代版的這個OS只能簡單的跑一些程序。他就在裡面植入了gcc的編譯器和Shell終端,可以更方便的執行一些交互式命令,運行簡單的程序。這也是在當時除了DOS系統外,挺符合當時時代潮流的一個操作系統,並取名叫 Linux。他將它開源,希望能夠幫助更多的人改變世界。由於Linux完全遵循GPL協議主題, 發佈到互聯網後得到強烈的反響,從此一大批知名的、不知名的電腦黑客、編程人員加入到開發過程中來,一場聲勢浩大的運動應運而生,Linux逐漸成長起來,直到今天應用這麼廣泛,商業、非商業、開發者等等眾多人都加入了Linux大軍中。

Linus一開始只是為了研究學術,而迫不得已編寫自己的內核,他將內核發佈後,才發現許多人也面臨和他一樣的問題,這讓他萌發了一個新的想法——與大家一起完善這個內核。於是就這樣,Linux內核從最初只能編譯、執行簡單程序,到後來一步一步走上正規化。

從Linus的經歷來看,你說他是天才,從今天來看確實是的,但你要說他不是天才,從當時來說也對,因為他只不過是做了一件大家現在在大學裡、研究所裡都會做的事情——為了學習、研究學術而不得不做一些工具來輔助。他一開始的思想是很狹窄的,就是為了研究學術,能夠編譯幾個小程序去執行,跑跑數據,但就是這麼一個看似不起眼的東西,因為符合很多人的需要,所以他迅速被人接受。但Linus在看到自己做的Linux內核這麼受歡迎後,他沒有選擇限制別人,而是選擇將它開源。

從上述故事裡,我們能夠看出的是,Linus和Linux的成功,離不開思想的“成長”。

其實,並不是只有偉人、成功人士的想法可以稱為思想,我們每一個人,每一個想法,都可以稱為是思想。

思想裡面承載的,有我們未實現的想法,有我們未來的目標,有我們的設計靈感,有我們的美好創意。

有想法是一件好事情,想法裡寄託著我們對成功的嚮往。

我們首先就是不要限制自己的思維,敢於去想象,勤於去思考,樂於去探索。

有了想法,就要給自己制定一個小目標,然後著手去實現,每一次實現都代表著我們在前進、在成長、在進步,每實現一次,我們離成功就更進一步。然後我們通過多個這樣的小目標,一步一步的,完成我們的遠大理想。

2.為自己制定一個小目標

制定一個小目標很簡單,可以是學會幾個單詞,記住幾句優美的辭藻,能夠做一頓美食,甚至是看一篇文章。

作為程序員的目標,那麼就可以是學會幾個語法,弄懂一個設計模式,搞明白一個模型,學會規範的命名規則等等。

小目標,之所以稱之為小,就是希望目標不要過大,因為目標過大,我們就很容易產生退縮,甚至放棄。小目標越細越好,也更容易去實現,更能激發我們求知的慾望。但小目標不能太小,不能是你舉手就能做到的事情,如果你能夠輕而易舉的實現,那就不叫“目標”了,你都會的東西,算不上目標,你也無法從中得到那種“成就感”,成功之後的興奮感。


【天才並非天生】從小白到人人敬仰的編程大神,只需要一年時間

制定目標可以根據實際情況來做決定,你可以參考下面的這些不成文的原則來定製目標:

  1. 進行時間預算:可以是一週,可以是一個月就能完成的。
  2. 拆解目標任務:可以是按天來算任務量,也可以是按照功能邏輯來劃分。
  3. 細化子目標:要保證每一個部分、任務都要足夠細緻,要仔細思考可能出現的問題,確保在制定過程中每一步都能在腦海裡走通。就像程序一樣,定好目標,接下來就是有條不紊的執行。
  4. 多步執行:按照子部分去執行,執行中如果發現某一部分走不通或太難實現,應該修改這部分的計劃,甚至要重新制定目標。

在平常的學習和生活中,我自己也常常會給自己制定一些新目標,執行過程中也遇到不少彎路,甚至有的走向了死衚衕,白白消耗了精力和時間,但好在都有及時糾正,沒有造成過多的影響,保證了目標路線不偏航。

其實每一次執行中遇到的那些坑、那些坎,有一些是別人已經踩過的,那別人已經踩過的坑,就要儘量去避免再去踩坑,可以多去網上借鑑一下別人的案例、經驗、成果等等,從中學到一些技巧,但借鑑不是要抄襲,而是學習別人的解決這些坑的思路、方法,甚至對其進行改進;而有一些坑是別人沒有踩過的,那麼我們就會作為先行者,成為探險家,就要義無反顧、毫無疑問的去踩這些坑,只有踩過坑,你才能真正從中得到歷練和成長,你才能成為“先驅”。

我學習計算機編程已經好多年了,從高中時就學C語言、Pascal,拿過國家信息學奧林匹克競賽二等獎,在高中時期就搞過手機上的“wap”網站,後來3G火的時候,又弄過“net”導航網站,大學裡學習計算機,畢業後做了兩年多程序猿,又考了研究生,依然是搞計算機編程。

我想我應該會在這條路上一直走下去,但不一定是我這一生唯一的路,但這肯定是我這一生走過最長的路。

曾經的我是一個編程小白,在3G牌照還沒發放的那會兒,我還在上初中,但我接觸到了互聯網,那會兒的手機網絡還是GSM,WAP,上網一秒10Kb都不到的時代,但我卻學會了在BBS上建論壇,搞手機社區,09年3G拍照發布以後,我才上初三,之後憑藉著啥都不會的興趣和熱情,弄懂了什麼叫“空間”,什麼叫“域名”,什麼叫“DNS”,然後我買了空間,買了域名,建立了自己人生第一個手機網站:wapuz,一個手機社交論壇,後來又反反覆覆的,做了手機上的導航網站,弄懂了什麼叫“虛擬主機”,什麼叫“友鏈”,學會了掛廣告,知道了“阿里媽媽”,百度廣告聯盟,又明白了什麼是CPA、CPS、CPC、CPM,也通過這些賺到一點小錢。

正是當時的一些經歷,讓我產生了對編程的狂熱愛好,讓我高中畢業後選擇計算機這一專業。

但大學裡的我,卻沒有了當初那麼多的新奇想法,對於手機網站的興趣不在濃厚,雖然專業課學的很好,但我確實沒有像以前那樣,有些想法就去實施,大多時候,自己就把自己否認了。

而又當時迷戀上了一款叫做“擼啊擼”的網遊,沉迷其中不能自拔。想法?早就拋到九霄雲外了。

畢業後,找了深圳的一家公司做程序員,憑藉著專業課的實力,以及我自認為當時還不錯的編程能力,入職後的我在公司裡成長很快,學到了公司裡的項目管理方式,版本規劃方式,也學到了Java語言裡,Web世界裡,前輩們的優秀代碼邏輯,從代碼裡,學到了他們的思想。

在入職半年後,領導讓我獨立負責一個項目,解決當時部門內部原有的任務調度框架不夠靈活、頻繁宕機、單機執行等問題。於是我用了大概半年的時間,做了一個公司內部使用分佈式的實時任務調度框架。

雖然在公司裡的快速成長,被領導看好,未來能夠成為部門得力能手時,但我的思想,卻開始不斷的躁動起來。

想法越來越多,奈何自己不夠優秀,沒有實現能力。於是我決定了考研,從最初的決定,到最後考上研,我用了不到半年的時間。(如果想知道考研的原因,可以看我的 )

我的個人經歷,談不上什麼光輝事蹟,在眾人眼裡也可能是最不起眼的一個,但我想說出來,讓大家看到一個真實的自己,能夠讓大家有更多參考的對象。

從我的編程經歷,來給大家分析一下:

  1. 剛入職時,我本身就有了還不錯的編程能力,在公司裡,交給我的任務,也能夠迅速上手,著手完成。但也讓我學到了公司項目是如何發佈的,測試是如何來測試我們程序員寫的代碼的,BUG是怎麼提的。收穫也蠻多。
  2. 入職幾個月後,我已經和其他老員工一樣,接手任務,寫代碼,改bug,卻發現系統中原有代碼有很多的缺陷,同事的代碼有很多漏洞,到處都充斥著不規範的代碼。從那時起,只要我有時間,我就會著手優化一些代碼,包括一些很明顯的錯誤,命名不規範等等,也給代碼加了不少註釋,讓其他同事也能夠讀懂。
  3. 入職半年後,由於公司網站的數據處理絕大多數都依賴於後臺任務,然而正在使用的spring-batch,Quartz框架卻不太能夠滿足大數據量、大任務量需要。領導決定開始引入Hadoop,處理一些數據,而這一部分,也是由我等幾個人最先開始學習,帶領同事培訓等等。還讓我負責新的分佈式任務調度框架項目的開發工作。
  4. 在新項目的編寫過程裡,我學會了ZooKeeper,學會了分佈式的很多思想,包括也學到了很多Spring源碼裡的設計思路,設計模式,嘗試著把很多設計模式(諸如門面模式、策略模式、工廠模式、責任鏈、適配器、代理、中介者、觀察者、消費者-生產者等等)引入進去,還把Hadoop Yarn的架構思路做了參考,設計了選舉模式,一主多從(主宕從替)的架構,在這個過程裡,我不斷的思考,哪一種方式適合,哪種方案更好,每一處細節,都有面面俱到。以致於原本最初領導 給我的設計較為簡單的架構方案,被我推翻重新設計了一套結構,並說服了領導,採用我設計的架構思路。但是原本3個月實現的目標,最後用了半年的時間才實現。雖然目標延期了,但是卻更值得了。
  5. 之後也接觸到了大數據相關的框架,開始學習了Hadoop(HDFS、MapReduce、Yarn)、HBase、Spark、ZooKeeper等框架,學習到了不少新知識。正是我不斷地思考、學習、進步,在不到一年的時間裡,領導對我非常看重,對我的能力認可,對我未來的價值肯定。
  6. 但我自己有了自己的目標,我覺得在公司已經遇到了瓶頸,因為總是有一些繁瑣而無聊的任務需要去做,我無法抽身研究、學習新的技術、知識,我想去更好的平臺,想要實現自己更好的發展。但是我是二本畢業,大公司不好進,想去大公司,我還得多幹兩年,多積累工作經驗,然後再付出加倍的努力去面試大公司。
  7. 最後反覆思考後的決定是,考研是我實現目標的最快、最好、最省力的方式,讀研既能提升了學歷,提高了我未來職場上的硬實力,還能讓我邁進大公司的門檻,怎麼想都是一個絕佳的目標實現路線。

平時,我也一直保持著寫寫文章和心得的習慣,以前更多的是發一些技術文章,發一些解決實際問題的思路,但現在我更喜歡發一些個人心得,記錄自己的成長經歷,包括自己的辛酸往事,還有自己懷揣的夢想,記錄我在實現夢想的路上所付出的努力。

以前的經歷從現在來看,都很輕鬆、隨意,但在當時都是做過很多努力才做到的,這些經歷也都是我刻骨銘心的經歷,在別人眼裡也許不值一提,肯定也有更多比我更努力更優秀的人,我也希望能夠看到更多有優秀的人的經歷分享出來,也能讓我們多多的學習和借鑑。

不否認自己,就是成功的第一步。

最近的一段時間,我也在重新整頓自己的計劃,制定目前讀研的學習計劃以及為職業生涯做好規劃。

任何一個大目標,都是從一個小目標開始,甚至是一件小事情開始,每走一步,都離不開自己的腳踏實地,一步一個腳印,不嫉妒別人成功,不懊悔自己無能,踏踏實實地實現,心中更完美的自己。

3.提升你的“硬實力”

硬實力在任何時候都是你絕對的資本,別人偷不去,拿不去,搶不去。

在程序員的眼裡,“硬實力”就是你的編程基礎。

【天才並非天生】從小白到人人敬仰的編程大神,只需要一年時間

編程基礎真的很重要,在我們平常寫的每一行代碼裡,基礎都在其中。剛開始的我,並不特別看重基礎知識,對大學所學的專業課裡的基礎知識嗤之以鼻,覺得那些是小兒科,學那些東西卻不能做出東西,沒有任何產出價值的東西學來幹嘛?

那時候我就一切以實用價值為導向,覺得有用的才去學,覺得沒用的,就減少學習。然而在編程過程中,卻經歷了一次又一次的打擊,才發現基礎知識真的很重要,只有基礎知識深厚,懂得越多,才能夠寫出優質的代碼,做出優質的作品,而我本身又是一個強迫症患者,在代碼裡,我也一樣有著潔癖,見不得垃圾代碼的出現,一邊痛斥垃圾代碼,一邊卻又寫不出優質代碼,自己曾寫過的程序回頭看,往往會覺得當時寫的不好,不夠優質。

現在我更願意按照基礎知識、標準規範編程,不是因為跟風隨大流,而是因為真實的感受到了這樣的代碼才更可靠,可維護性才更高,也更容易被被人理解。

為了學習基礎知識,我買了很多編程相關的書籍,總覺得網上的知識太過零散,還是書上比較系統,基礎知識更全,很多不經意的細節,書中其實都有講到,每一個我不曾知道的問題、知識點,我都會記錄下來,有時是用紙和筆記錄,有時是用雲筆記,時常會整理一些筆記出來。

當基礎知識掌握的更多的時候,再去查看其他書籍和代碼,即使跨平臺、跨語言也依然可以很快的掌握並上手。


基礎知識對我們程序員寫的代碼來說非常重要,不能總為了快速提升自己的能力,而忽略了基礎知識的夯實,只有基礎紮實,才能碰到問題有辦法、有能力去解決,才能讓自己少走彎路,最快的實現目標。


4.分析你的每一次執行

編寫程序的精髓在於每一次失敗的編譯,每一次失敗的執行,每一次錯誤的輸出,這些都會讓我們發現程序的不足之處,也許是設計思路不合理,也許是一時疏忽導致,也許是算法使用不當,也許是API理解不夠透徹,但每一次失敗,都會讓我們得到成長。

很多編程新手,小白,在寫完程序之後,一運行就出錯,就會頭疼腦大,會覺得莫名煩躁,受到打擊,會失去編寫完成後期待執行成功的快樂,但是卻被現實當頭一棒。

於是有一些人就覺得編程好難,編程不適合我,我不適合編程等等消極的想法,甚至自暴自棄,直接放棄做程序員這一職業。

其實這是新手小白的誤區,程序在寫完後,任何錯誤和意外都是有可能的,執行時出現錯誤是再正常不過的事情了,不能因為錯誤產生、結果不對就否認這份代碼,否認自己的努力,否認自己的能力。

遇到這種情況,首先是要冷靜下來,仔細分析容易出錯的代碼範圍,仔細思考設計中最有可能出現問題的部分。

其次就是做調試,能做調試的情況下,儘量調試代碼。錯誤的出現可能是一個條件的優先級問題,也可能是數據溢出,也可能是一個非常低級的條件判斷錯誤,也可能是最常見的NPE。這些問題可能僅僅通過肉眼無法看出問題原因,需要通過不斷地調試,一次又一次的分析數據結果,嘗試數據邊界,來判斷問題所在,調試分析需要慢工出細活,它是找出錯誤原因最合適、最省時間的一種方式。

【天才並非天生】從小白到人人敬仰的編程大神,只需要一年時間

對於肉眼無法看出的問題,就比如我之前設計的一個程序出現了一個NullPointerException(NPE),分析每一個方法,每一個邏輯,甚至每一條語句都看了,都覺得沒有問題,可是線上的環境偏偏就出了這個問題,導致我頭大,憑看是看不出來了,就去調試本地代碼,結果本地代碼調試一點問題也沒有,最後無奈只能連到生產環境,在最短時間內迅速做了一個調試,結果才發現,是生產數據庫裡的一個數據常量字段因為異常缺失(正常情況是不允許缺失的、可能是誤刪),導致產生的,最後補上數據庫缺失的字段,再加上程序中多寫了一個判空語句,雙重保險,解決了這個問題。

要坦然的面對每一次失敗,並耐心地總結出失敗的原因,是我們成長路上不可缺少的因素。

5.不斷的反覆地思考

目標已經確定,也已經開始著手執行計劃努力實現目標的時候,千萬不要以為自己的計劃萬無一失,認為計劃定下來就一定要遵循計劃規定的內容,計劃不可能是完美製定的,而當初設立目標時所作的計劃,很可能因為考慮不周而導致計劃並不合理。


【天才並非天生】從小白到人人敬仰的編程大神,只需要一年時間

在計劃實施過程中,前面已經說過會踩很多坑,這些坑,有的趟過去,對計劃沒有什麼大的阻礙,但有些坑,可能暫時無法趟過去,這時候就會影響計劃的執行,最終導致目標不能如期完成。

因此,在執行過程中,不能放鬆思想的懈怠,覺得最初的想法就一定是完美合理的。

就拿我之前做分佈式任務調度系統來說,一開始領導給我介紹的方案我也覺得沒問題,我們都一致同意,可是在我真正寫代碼的時候,才發現裡面有很多類似任務執行失敗需要回收、回收後原先的狀態怎麼恢復等等這些細節問題沒有考慮清楚,而考慮到這些細節問題的解決,整體上就需要改進原先的設計方案,引入一些新思想、新框架,我當時就拋棄了Memcached做任務發放的媒介,換用了消息隊列,而消息隊列有兩種接口實現,一種是ZooKeeper,一種是RocketMQ。然後這一更換,就得需要改進原先設計的架構,任務執行機器就得從主動獲取任務的方式變成生產-消費模型,結構更加合理。

所以,目標設定大方向不變,計劃卻是要根據實際執行情況而變動的,儘量保證計劃的整體不做大變動,局部做調整。


你已經是“天才”了

在上面的1、2、3、4中,如果每一條你都能做到,把每一步都能處理的很好,那麼,你已經是“天才”了。你已經離成功不遠了。


【天才並非天生】從小白到人人敬仰的編程大神,只需要一年時間

很多編程“天才”都是通過日積月累的寫代碼,不斷地突破自己,最終脫穎而出。

生活中,你仔細觀察就會發現,哪些看起來笨笨的人經過一段時間的努力,往往會有驚人的進步。

其實每個人都不笨,不要否定自己,要相信自己的努力,通過實踐來證明事情的對與錯,用自己的實際經驗來證明,往往要比別人說的要更具有說服力。


以前總以為,高手就是比我聰明,比我更強,但在我不斷的努力後才發現,高手其實並不願意與別人比較,高手們從來不活在和別人的攀比狀態中,他們更願意與自己進行比較,發現和認識自己的不足,不斷地突破自我,不斷地讓自己比之前更優秀,所以,漸漸地,他們就成為了別人眼中的“高手”。


突破自我才是正確的方向和目標。



感謝你能夠看完這7千多字的心得分享,覺得還不錯的話,多多幫我點贊、評論、轉發吧!。


如果你喜歡我的文章,喜歡看一些在編程、計算機、科技領域的一些經驗分享、技術知識分享的話,可以關注我喲!


分享到:


相關文章: