如何從菜鳥程序員成長爲高手

如下的文章的內容從 「蘇坤」複製下,感受很是有用想分享下:前端

原文地址:http://mp.weixin.qq.com/s?__biz=MjM5MjI2NjY0NA==&mid=2659323930&idx=3&sn=f767e06b8049a9bb796ce3177d1c570e&chksm=bdde50e18aa9d9f7db03fc532be4ca5b252db7fb2743e56c862fed4a4c5141339238ecf26a6e#rdlinux


1.摘要程序員

 

最近有一些畢業不久的同事問我:「你工做的時候有沒有什麼竅門?怎麼才能快速成爲高手?」sql

想起當初剛入職,新人培訓的時候,也跟其餘同事討論過這個問題:如何才能成爲業界大牛?當時本身只是以爲興趣是最好的老師,思路方法什麼的沒有多想。編程

加入微博平臺架構部的時間也不短了,趁着快過春節總結了一下本身入職微博以來的工做狀況,從互聯網開發的半個門外漢,到現在能設計一些架構、排查一 些問題、分享一些經驗,收穫頗多,感想頗多,也逐漸意識到思路和方法的重要性,在此跟你們分享一下。主要分爲學、作、想三方面。設計模式

 

2.學會學習服務器

學習無疑是程序員最爲重要的素質之一,尤爲是互聯網這種突飛猛進的行業,把學習當作工做的一大半也不爲過。網絡

 

2.1.自主學習1架構

 

最近發現身邊的人並非不想學習,只是天天都在糾結本身到底學什麼好:簡單的沒挑戰,複雜的看不懂;舊技術怕過期,新技術沒方向……框架

講講本身畢業後的經歷,畢業以後去了個不大不小的公司,工做主要是作一些XX管理系統之類的東西,沒什麼挑戰,也用不上什麼技術,基本上前端用個extjs後面套個sql server就解決了。工做穩定了幾年,業餘時間除了wow沒別的事情作,以爲這麼閒下去不是辦法,因而以後一年的時間裏,用上班摸魚和下班休息的時間學了這些東西:

  • 閒着無聊想作個小遊戲,發現遊戲相關的書大可能是英文的,看不懂,一咬牙翻譯了《Real-time rending 3rd》的前幾章,剛開始前言都看不懂,只能一個詞一個詞的翻字典,一句話要琢磨幾個鐘頭到底做者說的究竟是什麼意思。翻譯了幾百頁英文書以後,發現本身 看英文書沒什麼障礙了,因而開始天天用休息和摸魚的時間看書。

  • 看完遊戲引擎的書以後,把irrlicht引擎的代碼看了一遍,而後本身山寨了一個3d渲染的場景管理器,還有個樸素的渲染引擎。

  • 給本身的遊戲引擎寫了個基於腳本語言的解釋器,爲此看了很多編譯原理和虛擬機的書,瞭解了程序到底是什麼東西,這是我以爲收益很大的一件事情。

  • 看編譯原理的書的時候發現操做系統的知識有些欠缺,又去看了linux內核相關的書。以後買了個開發板每天修改內核玩,畢業之後又一次瞭解了內核的cpu調度、內存管理和文件系統,瞭解了應用是怎麼跑在操做系統上,操做系統又是怎麼運行在硬件上的,這也是收益很大的一件事情。

  • 看完操做系統又順着看網絡相關的書,以後把lighthttpd的代碼看了一遍,用c寫了個linux下的http服務器,把幾種網絡編程模型挨個實現了一遍。

  • 實現http服務器的過程當中以爲本身編碼能力仍是有欠缺,把代碼大全翻了一遍,順着又去看了設計模式的書,而且用本身的理解把每一個模式用文字從新描述了一遍。

  • 中間還看了不少語言和框架相關的書,就不一一列舉了。

 

我把學習的方向分爲三類:

  1. 爲了工做,知足當前工做所必備的知識

  2. 爲了提高,與當前工做相關的知識(深度)

  3. 拓展視野,與當前工做無關的知識(廣度)

學習(1)以後只是個熟練工,2和3纔是提高本身的途徑,伴隨着知識儲備的提高,接觸新事物時更容易找到類似的知識加以類比,加快理解,也更容易掌握本質。若是天天都在糾結「到底學什麼」,那麼只能說明仍是學的太少了。(真正沒什麼可學的大牛們應該不會讀到這裏吧……)

因此,若是覺着沒什麼東西能夠學的時候,那麼能夠考慮一下學一下更有深度的知識(好比虛擬機或編譯器),或者徹底不一樣的知識(新的語言或當前比較火 的方向),甚至徹底不相干的知識(單純練習英文閱讀,學習ppt排版之類)吧。隨着知識儲備增長,本身的不足和將來的學習的方向也會更加明確起來。

 

 

2.2.向歷史學習2

 

以微博爲例,在微博發展的過程當中經歷了很多波折,並逐漸衍生出了目前的系統架構。不少新人最喜歡問的問題即是「如今線上是怎麼作的?」

這個問題不錯,可是還不夠好。在程序員的世界裏罕有能解決全部問題的「銀彈」,當前的作法用不了多久也會被替換掉,若是想了解一件事情,那麼就多關 注一下「它是怎麼變成今天這樣的」吧。學會用發展的眼光看問題,瞭解一些經歷過的經驗教訓,收穫會比單純學會一件什麼事情多的多。

那麼,如何向歷史學習?

  • 公司內部的資料庫、wiki等大都會有舊時的資料,剛入職時大多不會太忙,這些資料庫簡直是挖不完的寶藏

  • 部門內部分享,好比我當初入職時常常去聽「微博XXXX架構演化歷程」之類的內部分享

  • 多問一下本身」它爲何不那麼設計「

  • 老員工憶苦思甜吹牛逼的時候多奉承幾句_(:з」 ∠)_

 

2.3.向他人學習3

 

這裏有兩個極端,

  • 有的人喜歡本身悶頭搗鼓,什麼也不問,這必然是不利於本身提升的;

  • 也有人碰到問題就問,這也有問題,浪費他人時間不說,更關鍵的是說明這人向他人學習的思路錯了,要學習他人的並非具體某個知識(要學知識看書就能解決了),而是學習別人的思惟方式。

可是思惟方式這種東西很難經過交流的方式學到,後來我發現有個很簡單的學習方式:口頭禪。舉幾個例子,你們體會一下:

「這個實際上是兩個問題」
「有沒有更好的方案」
「能不能舉個例子」
「能不能給個一句話總結」

除了口頭禪,不少牛人都會有很是鮮明的思惟方式和處事原則,若是有幸與業界的大牛共事,那麼恭喜你,只要多交流、多觀察、多思考,那麼提高速度會提高好幾個數量級。

 

3.多作有意義的事情

有的人天天時間浪費在跟問題自己無關的事情上,好比我要設計架構的時候還要考慮架構圖怎麼畫,寫完代碼還要反覆部署測試好幾輪才pass,查bug的時候把時間浪費在掃日誌上。人的精力老是有限的,把時間浪費在這些事情上面,讓本身提升的時間就變得少了。

 

3.1.練習,更多的練習1

 

這裏有個誤區:「作有意義的事情」不等於「只作本身沒作過的事情」。

對於程序員來講,寫代碼是基本功中的基本功,編碼的規範、設計的權衡、甚至順手的IDE快捷鍵都要靠平日的試錯和積累,很難經過幾本書或者幾天培訓領悟到。

曾經目擊一些人寫代碼一年以後開始作一些小項目的設計,而後就火燒眉毛的把重心全都轉移到設計甚至架構上,這種沒有基礎能力支撐作出的設計和架構最 多隻能算是高級意淫,大多沒等落地就荒廢了,意義不大。究其緣由,大可能是設計出來的東西「很差作」或者「很差用」,就像是隻看過一遍課本就去參加高數考 試,現實嗎?(學霸們我錯了……)

舉個例子,幾年前在看設計模式的過程當中,用qt作了個看漫畫的應用,把能用的模式都試了一遍,固然有不少用的不合適的地方,正是這些不合適的地方讓 我對面向對象編程和設計模式的思考深刻了不少,如何權衡靈活性和複雜性也有了新的認識。以後在設計不少系統的時候少走了不少彎路,既保證了時間點又保證了 質量。若是當時期望着「用的時候再說」,大概已經被項目坑的不能自理了。

 

3.2.善用工具2

 

工具能解決的事情就用工具去解決,好的工具能節約大把的時間用在更有意義的事情上。

工具的範疇很廣,好比linux的各類命令、好比團隊內部的各類系統、好比順手的應用、甚至包括上下班騎的自行車。只要能節約時間、提升效率,那就值得一試。

在這裏我列舉幾個大幅度提高了個人效率的東西:

  • 雙屏顯示器

  • 順手的鍵盤

  • google(不是baidu!不是bing!)

  • mac

  • mac上的應用:idea、alfread、omnifocus、甚至synergy和istats menus之類跟開發自己關係不大的應用。

我更傾向於把「使用工具」做爲一種生活態度:是否但願讓本身的生活專一於有意義的事情。若是你認同這個觀點,那麼想想投入和回報比例,仍是很可觀的。

(固然,爲了避免花錢而本身破解應用的大神也是極叼的……)

 

3.3.提升時間的利用率3

 

時間是全部期待提高本身的人最寶貴的資源,效率再高,沒時間作也沒意義。

網上有個流傳挺廣的圖:打擾程序員的成本。事實上我天天的工做時間很是碎片化,來到公司以後可能不斷的接電話、被問問題、被拉去開會、回覆郵件等等;也常常會有時間不夠用或者沒事作的困惑,這裏分享一下心得:

  • GTD能夠整合不少碎片時間。除了把事作完以外,把上下文相關的事情集中在一塊兒完成也頗有幫助。好比把幾件想去其餘辦公室作的事情整合成一趟完成。

  • 減小無心義的時間浪費,好比家住在公司邊上能夠天天節省幾個小時的時間用來學習或者作別的事情。(但若是節省下來的時間用來刷微博,那就沒有必要了。)

    • 另一個頗有趣的現象:一個軟件的註冊費就10幾刀,貴些的幾百刀,把平常用到的全部工具的費用全加起來都頂不上一個腎6貴,可是不少人仍是堅持着沒有破解不用的觀念,爲了幾百塊錢浪費了大把時間。

  • 加班能夠創造不少時間,而且能有效減小被打擾的概率,可是也會給身體和精神帶來很大負擔。所以加班作的事情必須能對我的進步產生足夠多的收益。若是加班只是用來處理無心義的工做的話,那應該是平常工做出了什麼問題。

  • 事情能夠分紅緊急重要、緊急不重要、重要不緊急、不重要不緊急四類,在todo列表裏隨時要有重要不緊急的事情。

 

 

4.學會思考4.1.深究1

 

當有什麼問題解決不了的時候,不少人會有畏難或者拖延的情緒,典型口頭禪就是「就這麼湊合着用吧」或者「先這樣吧,之後有時間再研究」,說這些話的人大多並非真的那麼忙,甚至有人一邊刷着微博一邊跟我說沒時間研究……(你tm在逗我?)

要克服畏難情緒其實很簡單,找一個具體的似懂非懂的問題,想盡辦法把問題研究清楚,體會幾回解決問題時的愉悅感,創建自信。

大部分問題其實沒有什麼高深的科學原理,甚至只要翻幾頁書就解決了,可是遇到問題不深究,長此以往會造成自我暗示:這些問題是我懂的,那些是我不懂的,本身反而把本身進步的路給堵上了。

說到如何深究,也有幾條心得:

  • 遇事多想爲何,而且要反覆問爲何。不少貌似理解了的問題過一陣再從新想一想,每每會發現以前還有沒考慮到的地方

  • 問題要有明確答案,哲學之類的就別糾結了

  • 查找資料時選權威的書籍或者網站,避免被誤導

  • 找人討論,或者直接拉小夥伴入夥,既能夠互相交流,又能夠互相監督

  • 分享你的成果

  • 不要全部事情全都深究,會給本身太多壓力

 

4.2.多說,多寫,多交流2

 

日常工做中有一個感覺,有交流和寫做習慣的人思路會更清晰一些,能接觸到的觀點也會多一些。這方面其實屬於個人弱項,大概總結幾個觀點。

  • 隔一段時間最好能書面形式總結一下最近的工做,好比說寫個心得感悟,或者持續更新本身的簡歷

  • 寫做的時候有兩個難點:對要說明的事情作總結和抽象,造成觀點統1、調理清晰的主線;從對方的視角考慮,把事情說明白,避免自言自語。

  • 找人討論以前本身先要有個基本完整的思路,不然大部分的時間都要耗在解釋原理之類的上網查反而更快的事情上。

  • 討論以後要有一句話就能說明白的結論和描述清晰的時間點。

  • 有些人喜歡糾結於「這個不是個人問題,爲何要我處理」之類的事情。在我看來這是很好的機會。既能增加見識,又能展現水平,還能留個認真負責的好名聲,何樂而不爲呢。

 

最後

 

最後分享一下關於我理解的程序員的自我修養,在我看來,能夠總結爲:負責任,重名聲。

負責任,說的更具體些:寫的代碼本身有沒有測過、作的框架本身有沒有用過、設計的架構本身有沒有認真權衡過。

重名聲,說的直接些:沒有測過的代碼、沒有用過的框架、沒有權衡過的方案有沒有臉交付給別人。

與各位共勉。

相關文章
相關標籤/搜索