如何學習編程?


沒想到收到這麼多贊同,有點受寵若驚,我覺得自己的經驗或許對那些不是科班出身,但是又對計算機感興趣的同學更有幫助一些。當舍友懷著滿腹不解問我為什麼能夠在電腦前對著黑框玩一天,我會反問他為什麼你可以在電腦前玩一天遊戲?Just for Fun !
更多可以參考我的另一個回答http://zhi.hu/XNm6
----------------------------------------------------------------------------------------------------------------------------------


很多人都說最好通過C入門,但是我自身經驗告訴我,最好先從一門腳本語言入門,如我的入門是通過PHP。

一開始接觸C語言,老是對著一個黑洞洞的框,容易使人喪失興趣。這些黑框和我們常見的QQ、Office等桌面程序相差實在太遠了。而且往往在初學的時候沒有人告訴我們控制台應用和圖形界面的應用之間的關係。如果對Web感興趣可以先學點基礎的HTML和CSS雖然這在嚴格意義上不算是編程語言,但是卻可以在一開始讓你做出一個可以看的到的界面,而且掌握基礎還是很簡單的,然後在學點後台開發語言,我推薦PHP或者python。

記住,新手最重要的是保持熱情!

學習一段時間之後可以自己嘗試做一個簡單的留言板,別小看這個老土的小東西,這個可是能讓你立刻充滿成就感。而如果你一開始就上手C這樣的成就感就需要更久才能獲得,而往往很多新手都躺在了前進的路上。然後,可以在留言板的基礎上做出一個簡單的博客系統。

記住一定要在每一階段都做出一個看上去"正常"的東西,而不是一堆代碼一執行出來一行行字元那種。這也是我推薦學習HTML和CSS的原因,因為這可以讓你簡單地搭建一個擁有用戶界面的程序。

當你把這些都做完了,如果感到對編程還是有很大興趣,而且感到自己在漸漸地從心底里喜歡上了編程,那麼你再面對那些黑框的時候,就會感覺好很多,而且感到自己真的很酷,你會喜歡把自己想成電影里的黑客。

至於說演算法數據結構,等有了興趣,需要這些知識了,再去慢慢學習,都不會是障礙,而且會變得有趣許多。但是一開始沒有任何程序基礎,就給你學這些,只能使你迷糊,根本不了解這又什麼用。這也是我討厭現在的大學教育的一個方面,完全違背認知規律。先給你講一大堆理論,不告訴你為什麼,有什麼用,讓人感到厭惡,但當後來我們真正需要了,卻也記不得了,只能從頭再學。

最後,我還是要補充一下,對於新接觸編程的童鞋,或許保持興趣是最重要的,但是在你對編程有一定了解之後,你會發現自己還有很多困惑,這時候就需要惡補基礎知識了,對底層了解的越清楚越有助於你消除困惑和對編程更深層的理解。


昨晚在另一個地方發了個類似的回答:哪種學習編程方式更好,系統學習還是邊做邊學?
昨天才進入知乎社區,不知道社區的轉載主要以什麼方式,所以就用最傳統的方式——複製黏貼,這麼轉過來了。

剛註冊知乎就見到了這條問題,所以就留到晚上來回答了。
雖然才畢業一年,但是因為競賽的原因從小學低年級的時候就開始學習程序設計,直到大學讀了計算機,被各種老師教導過、自學過、教過學生。

什麼是編程?
我剛開始學習那時,面向對象和互聯網,至少在國內,還沒推廣開來,甚至不多人知道。直到現在,也就現在大家見到的這個時代了。
扯這歷史要說的是,「編程」對我而言從一開始的競賽,到現在的「創作」,已經是兩個範疇的概念了;同樣對於時代的需求,從從前的科學計算,到現在的各個行業各個角落的各種應用實現,已經不是一個同樣的行為範疇了。
但是,編程的本質上跟當年課本上寫的沒多大區別,就是編寫(廣義上的)計算機可執行的指令(集合)。

這個領域的知識是什麼樣的?
然後要延伸一下時代問題。
從面向對象開始,互聯網時代興起,到現在的移動互聯網時代,編程絕大部分的目的是在於創造「軟體」,而創造軟體也由於世界上最聰明的人群高速集中湧入,以及時代的需求壓力,已經形成了一整套工程學,也就是「軟體工程」了。
現在「編程」被集中在「軟體工程」的需求中,產生的一個結果就是「工程化」,而「工程化」就是整個生產體系開始逐步分化以及逐步專業化,從而出現了這個領域中的各種針對性專業,比如「前端工程師」、「測試工程師」、「演算法分析師」、「.NET軟體工程師」。
在整個軟體的開發周期中,我們都需要跟不同的人在不同程度的合作。即使是個人開發者,都會用到開源的代碼、各種下載的人家做好的工具。

這就是工程化後的結果,也就是「編程」被和其他不同的專業,比如數學、醫學、建築、人文等科學結合在一起然後具體地分化成了各個關聯的模塊。這些模塊有一個特點,就是整體上「臨近相連」。
這什麼意思呢?
舉例說明就是,但從(某個)網站開發而言,就有客戶、老闆、美工、前端工程師、服務端工程師、資料庫管理員、網路推廣等等。這些角色兩兩間可能有工作上的直接關聯,單指這個軟體項目的開發工作的話。
無論哪個是因,哪個是果,現在的情況都是沒兩個角色間的知識必定關聯和有交集。在往廣度上看,整個軟體工程領域以及世界都如此,只是軟體工程領域如建築領域一般,有比較大的定量的專業化,一切都是有根據有標準的。
而至此,形成的一個結果就是,沒有人能掌握所有知識;所有知識都是有關聯的,追尋著關聯的路徑學習產生的效果普遍情況下是最大的。
後面那條可以簡單地證明,假設兩樣知識八竿子打不著,那麼你就要等很久它們才能連起來,發揮加成效用。雖然喬幫主說過,總有一天這些dots總會連起來的,但是嘛......靠譜點也不是不好。

所以,學習這個領域的知識是這樣子進行的
那麼,回到學習上,就變得很明確了。開發的需求需要各種技能,各種技能都是相關的,而一個項目所需要的技術在一定期限內是大致有限的。如果你要開發某樣東西,或者做某種用途(比如科學計算),都需要某個知識點進行切入,從哪裡都好,切入某個知識點,然後用關聯的方式擴充。如果在過程中見到新的不懂的名次,要麼馬上去「擴充」,要麼就記下來,留待以後「點亮」這個天賦,總有一天這些dots......

以上是學習編程要要知道的第一點,這個領域的知識是怎麼組織的。以下第二點,關於學習方法。

一個學習的誤區與結果
有句名言,是布魯克斯(Frederick P. Brooks)說的吧,說過,最好的程序員和最差的產出差n倍。
為何?計算機科學基本上是由數學和機械類學科衍生而來,最大的特徵就是兩道門檻:能不能做出來、這個方法(演算法或者設計)效率有多高。
前者不說,後者最明顯的舉例就是,用加法來計算和用乘法來計算效率差別極大。
這個領域的只是最大的特點就是它們的關係如果你想打通,是需要「理解」的,至少知道怎麼用。你不懂得一個公式、一個技術怎麼使用,你知道有,到需要的時候也用不了。所以鑽研是一種必要的學習習慣。

看到以上內容的時候,你可能會覺得,一開始都設定好要做的目標,然後弄清楚這個範圍需要的知識點,然後都從某點開始,全部學透,就能完成了。

這犯了個軟體工程的一個極端化錯誤,在學習上也同樣適用,因為每次開發都是基本上是一次學習過程,你又不是*訊,你所做的東西就算別人做過,你也一定沒做過。如果別人做好了給你,也不用你做了,騰*也不用去抄了是吧?

這個錯誤就是將整個項目理想化,如果把這次學習視為一個項目的話。整個項目都是原本不存在這個世界上的東西,沒人知道開發(學習)過程中會發生什麼,怎有任何可以相信的精細的計劃?

如果這麼學,你會很容易陷入一個,拿了一本專業書(一個切入點),然後看,然後看著看著就看不下去了。然後?然後就沒有然後了......

我們是怎麼解決這個問題的
軟體工程里是怎麼解決這個問題的呢?敏捷開發(Agile Development),每個項目或多或少都能用到。
詳細解釋可能太多,畢竟我知道的也不多。不過其中最通俗的幾點:將大計劃切分為短周期,並且每個周期結束後調整計劃,使得最近的一個計劃可執行並且有效;計劃中,將每次的產出進行具體化量化,每個周期都發布(生產出)有效的可用的產品,這個產品是在上一個產品的基礎上的改進或者增加;在原有的產出已經難以再升級時,將原來的產品重構(重新設計、重新生產)。

細節的道理就不多說了,都出了多少本書了。
實際上現在你能買到的好的編程教學的書籍都是遵循這個教學模式,也是暫時被認為最有效的書本教學模式。這些書一般會教你從「Hello World!」(到時你就知道是什麼了)開始,讓你手把手做一次,然後逐步深入;有時候做了一次後,在後面介紹了新的技術,又會讓你用新技術跟著做一次;看完整本書,你至少就達到了某個水平了。

要注意的是,你必須有心理準備就是,書上講的,跟你做的根本有不同的產出,或者你根本做不到。比如書上說計算a+b會輸出2,而你的輸出3;書上說要點擊某個按鈕,但是你就是在自己機子上找不到那個按鈕......這些都是不可避免的,而且一般都會浪費很長時間。莫名其妙的問題本身就是以上說的,不知道會遇到的問題的一部分,也是現代程序員加班的其中一主要原因。畢竟,你的機子跟作者的機子肯定不一樣。

所以學習該是這樣的
總的來說,說到了知識是關聯的,學習是以不同的學習成本連接不同知識的過程。還有呢,值得鼓勵的是,隨著知識的增加,智力和經驗會隨之提高,學習成本也會降低,越來越容易學習。
雖然具體到某個知識點只有懂和不懂,但是具體到一個面,還有懂多少的問題。這就回到了剛才的引述,生產效率為什麼會差n倍。因為這是一個廣度和深度的綜合比拼,而隨著時間增長,會形成兩個人知識的「馬太效應」,差距會成倍增長。
不過放心吧,這個增長是有天花板的,無論是知識總量的有限還是需求有限導致的,至少從程序員的工資就可以看出來(哭)。


具體的學習建議
到這裡,至上而下地給出學習建議:

  1. 先有一個想法,像學鋼琴也有一開始想彈奏的曲子,提出一個想用生產出來的產品,或者買一本評價好的入門書,做出書中提出的「產品」為目標
  2. 將這個目標細化,可以找專業人士幫忙,梳理出知識的「切入點」以及周圍的「關聯點」,然後開始計劃第一次迭代(做出第一樣東西),可以是一段很短的程序或者一個作品,但必須有具體的產出
  3. 每次產出後都重新調整計劃,重要的是自己或者專業人士要能具體地評估這次產出的價值。如果是跟著書就自然容易了,就是跟書上對一下就是了

如果要具體給到一個切入點,那麼我的建議是兩個選擇:

  1. 從C語言開始,然後學習演算法,走科班路線
  2. 從網頁製作開始,然後學習網站工程,走產品路線,這是產品中最好入門的了

不必太擔心學錯,因為到達工程級別,你學過的八成知識都不會被作為工具使用,而它們的只是實現了它們的歷史使命——成為你現有某個實用知識的中間點/橋樑、為你現在的學習效率做了一次鋪墊。

實際一點地說,對於一個「畢業了」的程序員,學習一門新的編程語言,可能只需一周,而熟悉需要三周,熟練地用於開發是三個月,精通只需一年。這也是大概而已,嚴謹地說,不同的語言所關聯的知識點的數量是不一樣的。這也不影響舉例,因為在這之前,一個大學生在學習他們的第一門語言,通常是C/C++,用了一個學期,還可能掛科呢(那是態度問題或者是Dota的問題)。

首先吧,別想速成。這要能速成,那麼我們專業人士不就該喝西北風去了?

所以要真解決了學習範圍的問題後,你下一個問題應該是「要實現**應該具備那些知識」一類的了。等你在某個點紮根後,想的就是利用這個學習能力,去另一個自己更喜歡的領域,還是就此為據點擴充範圍,亦或者深入這個領域(也是擴充的一種吧,方向不同)。

最後重申的一點,就是軟體開發本身就是一個學習的過程,只是產出的代碼具備不同的價值而已。軟體的特殊性已經導致了難以重複地寫出兩段相同的代碼,一般只會改寫重寫,或者重用原來的代碼(就是複製黏貼或者引用調用)。


你是如何開始學習的呢?

是看書?還是看看視頻?還是報班?還是拿著C語言書猛看?

以上全錯

我講下我是如何失敗的

我有幸考入了某985高校的計算機系,但很不幸的是導師基本是放羊狀態,基本全靠自己擼,俺當時還是非常愛學習的,熱血青年,興趣滿滿,於是就去圖書館裡找了很多書,什麼高大上看什麼,比如xx底層實踐、xx天學會Java、xx機器學習,像一個無頭蒼蠅一樣。這是犯的一個重大的錯誤,沒有方向和目標,沒人引導。

看書是非常枯燥的,我記得當時非常鬱悶,不想荒廢大好時光,但書看過來看過去實在是看不懂(我基礎還不錯,研究生入學考試計算機接近滿分),這是犯了第二個錯誤。

當時學習環境也是非常不好,實驗室舍友成天打LOL,因為實在是無事可做,從早到晚。我一個人學習又那麼幸苦,又沒有成效,於是一段時間後就放棄掉了。

主要有三個錯誤,方向不對,方法不對,環境不對。

一 確定方向

方向最重要,一步空,萬劫不復。不說編程了,就說目前聽父母話做公務員的,進國企的,又有幾個活的開心的?回到編程,當年做C#的、做底層嵌入式的,又有幾個發展的比較好的呢?我見到當年做C# framework的40歲轉行學其它語言的........一步踏錯,滿盤皆輸。不是說它不好,主要是風險大,容錯性低,當然,如果你是特別愛好,或者說是有明確的業務方向,當然也是極好的,比如說你們導師就是嵌入式的專家,而且確實對黑科技,機器人啥的非常感興趣,那嵌入式對你來說就是一個巨大的優勢。但如果你不了解行業,而只是聽別人說學Oracle好、學Cisco好,學Java好,但其實你根本不知道之後做什麼,不了解真實情況,那豈不是把自己的腦袋懸在別人的褲腰上?

沒有什麼語言最好,但有幾個需要慎重考慮的:

1 不建議用C或C++語言入門

該語言極難,用的少,用它入門除了挑戰人生極限實在不知道有其它好處,建議從簡單的入手:Python和Java比較好,簡單,面向對象,使用面廣。JavaScript語言特性過於靈活,Php使用面比較狹窄,IOS的使用面也比較狹窄,而且和主流語言有所差別。

2 不建議學習Oracle、Cisco和C#系列

使用的公司少,就業面狹窄。Oracle主要金融、銀行在用,屬於比較「古老」的技術;Cisco是路由器技術,你如果希望做苦逼的運維,三班倒的話不妨嘗試下:)但運維實際上已經不是程序員了; C#運行的Window伺服器環境貌似只佔了5%,這些語言並不是說不行,而是使用面狹窄

3 不建議貪圖編程收入高而轉行

一般人高估了收益,而低估了困難程度。計算機是有一定門檻的,你如果不是懷著極大的興趣參與,實際上你很可能並不適合這個行業,那麼5-8年後呢?10年後呢?華為大規模開除35歲碼農,年紀大了,轉行無望,空餘憤恨。如果你不了解操作系統,不知道數據結構,我想很難在這個行業做的很深吧。

這也是培訓機構被人詬病的原因,不培養能力,誇大未來期望。如果沒有all in的考慮就不要考慮轉行了,每個行業頂尖的也只有10%,無論哪個行業,能做到10%你就nb了,與其轉行還不如首先搞清楚什麼才是最適合自己的。

如果你想選一個方向,可以簡要參考下入下介紹:

我們可以把整個互聯網開發大體分為Web前端、移動端、後端開發,此外還有嵌入式、機器學習等等....

目前最熱的是Web前端開發,前端的火爆來源於移動端的爆發性增長、Nodjs後端框架的流行、微信小程序的出現(後面可能還又一波),具體歷史可參考我的這一篇:零基礎開始學 Web 前端開發,有什麼建議嗎? 這裡不再重複。但培訓機構複製了大量「前端仔」,所以對前端的要求也在逐步提高,但一般來說前端工程師和後端工程師的比例是3:1,所以市場上需求量還是比較大的,是個不錯的切入口。如果剛興趣的可以加前端純互助學習群:370423482,我也不定時回答下問題。

伺服器後端開發的語言比較多,用的比較多的有Java、PHP、Python、Ruby、C#。Java是使用的最廣的語言,雖然比較古老,而且語法一點也不簡潔,但由於組件眾多,在大規模複雜系統中得到廣泛使用,比如電商等領域,Taobao,JD等公司。而且在ERP系統,管理系統中也用的比較多。此外Android也是基於Java,所以,Java可以說是使用面最廣的語言。

Python這門語言相對Java就簡潔的多,由於出現的時間比較晚,國內在伺服器開發領域還是比較少,但它大規模應用於數據科學領域,比如機器學習、數據統計等等。由於其簡單、設計良好、面向對象,所以用於入門是再好不過的。

「PHP是世界上最好的語言」,網站開發中得到大規模使用。

C++能做什麼呢?貌似什麼都能做,又什麼都不能做... 但學習C++對了解計算機體系結構還是非常有作用的,其應用範圍包括操作系統、驅動開發、黑客技術、反編譯軟體破解、外掛開發等等,包括Nodjs、Java虛擬機、資料庫的底層代碼都是用C++來完成,所以如果你立志做一名極客,可能C++還是必須掌握的。但是其比較難,不像其它語言擼幾天就能擼個網站跑起來,C++從入門到應用實在是一件挺困難的事。

2016 Github 流行語言排行榜:

選好了方向後就可以開始擼項目了

二 編程除了做項目,沒有第二種學習方法

套用《烏合之眾》里的一句話,其作者是法國人,特別鄙視法國教育制度,認為和中國越來越像了,於是在這本著名社會學的書籍中吐槽

"向人灌輸大量膚淺的知識,不出差錯的背誦大量的教科書,是絕對不可能提高人的智力水平的。

在我們的生活中,能夠幫助我們走向成功的條件是判斷力、是經驗、開拓精神!而這些書本當中是無法習得的。

觀念只有在自然而正常的環境中才能形成,而書本的知識本質上是反人類的 -與人類的思維習慣不同。

因此,我們需要年輕人每天從工廠、礦山、法庭、書房、建築工地和醫院中獲得大量的感官印象;他得親眼看到各種工具、材料和操作;他得與顧客、工作者和勞動者在一起,不管他們是不是乾的好,不管他們是賺還是賠。

只有這樣,才能了解那些從眼睛、耳朵、雙手甚至味覺中得到的各種細節,才能在心中逐漸形成觀念,並且會組合、簡化形成新的概念。

而我們年輕人,卻恰恰在最能出成果的年紀,被剝奪了所有這些寶貴的接觸,七八年時間一直被關在學校里,切斷了一切親身體驗的機會,對世間的事物缺乏準確的認識。

而後成家立業,落入生活的俗套,把自己封閉在狹隘的職業中,這就是狹隘而平庸的生活。"

一句話

「填鴨教育培養SB」

因此,學校里的教育基本都是脫節的,已經沒法培養出真正可用的人才了,基本只有靠自己。你如果想學習編程,除了項目外,沒有其它方法,你可以找到一個學習路線圖,然後開始照著路線圖走,但這個路線圖一定要是由一個個項目節點組成的。我寫的一篇《web前端學習路線》

https://www.zhihu.com/question/30180100/answer/156399333

裡面給出了階段性的項目,大家可以參考一二

學必須通過一行行代碼,親自痛苦的解決一個個bug,這樣才能形成有效的反饋。單單的看書、看視頻是沒有任何鳥用的。

其它語言的學習也需要做項目,就像游泳一樣,你從不下水怎麼學的會呢?


三 我什麼都不會,怎麼讓著手做項目呢?

學習里的教育向來都不是項目驅動制的,而是填鴨式的,東西都是老師講了你才會,向來缺乏主動探索能力。但很不幸的是,好奇心和探索精神才是成功的主要因素。那如何培養這種能力呢?

舉個例子,我們拿前端學習為例:

上策:找人帶

師徒制是最好的制度,為什麼在學校是一條蟲,進公司了就立馬nb,因為在公司有真正懂行的人給你指明方向,而學校老師基本沒這個能力,如果你周圍有懂得人,或是肯帶你的人,別糾結有沒有錢拿,先幹起來再說吧。

中策:找環境

北大、清華為啥nb,facebook為啥是在哈佛起步?因為裡面人牛,牛人相互比較,相互促進,扎克伯格說「我們整天在宿舍討論網路會給社會、政治帶來哪些變化....」 我們大學討論什麼呢?王者榮耀有幾殺?還是哪個妹子漂不漂亮?有可能的話,盡量找個能奮發向上的環境,但是這個環境真難找,學校里充斥著各種玩咖,如果物理環境找不到就找虛擬環境吧,比如我們建了有編程純自助學習群:370423482,歡迎大家來交友、玩耍。

下策:自學

自學難度太大,普通人很難堅持下來,當然,比爾蓋茲之流請略過

項目在哪兒?

網上那麼多免費視頻,最簡單的法子,跟著視頻敲。如果自學能力強的,跟著文檔敲

以具體項目為階段目標

很多課程都是以知識點為目標,比如js按照知識點分為函數、對象啥的,那麼把這些割裂開來進行講解,這樣即使聽懂了每個知識點,但也不會使用,所以,應該以項目為目標,比如web前端開發進行難度遞增的劃分:靜態網站製作、動態網站製作、複雜表單製作、前後台交互製作...等等

目前的免費視頻不是有很多麼,可以照著視頻上的項目敲就好了,抄完之後再去做新的項目。

尋找驅動力

很多人學習堅持不下來,因為學習對大腦是一個「痛苦」的過程,遠不如遊戲,把妹,來的有趣,而編程本身是比較有難度的,比如環境不會配,代碼總是有問題,等等,稍有挫折就可能放棄,「學的這麼幸苦,室友都在lol,還學個P呀」。單憑意志力的學習都是刷流氓,學會給自己激勵,比如學完了就能掙好多錢,就能迎娶白富美,成為人生贏家。不斷在大腦中勾起這個夢想,或是去讀一些雞湯書,或是說「再不學習就成渣拉」,找到自己的G點,促使自己向夢想奮鬥。


四 遇到困難了怎麼辦?環境不會配置怎麼辦?代碼總是調不通怎麼辦?

說實話,編程的學習曲線蠻高的,而且可能並不適合所有的人,所以其實最好的辦法是找到一個肯帶你的,可以在你的同學,熟人中找,否則一個最簡單的環境問題可能都讓你頭疼。如果周圍沒有這個環境,我想可以藉助MOOC,MOOC中的國外課程可能比大多數課程都要好,但是缺點是純英文教學,國內網易雲課堂算是做的不錯的,而且其價格相對比較低,比培訓機構要低很多,大家有興趣的可以看下:前端開發工程師微專業

如果周圍實在找不到肯幫你的人呢,你可以先找人一起學,一個人學習是孤獨的,那麼一堆人就能互幫互助,共同進步了,很不幸的是,國內可能並不存在這樣的環境,周圍同學、同事可能打遊戲的偏多。這可能就需要你自己去找個群體了。

待續.......

學習的終極目標是什麼? - 知乎專欄


題主問如何學習編程,應該是入門,那我告訴你就這麼學——全宇宙最快的學習編程方法,一般人我不告訴他:

最後奉勸不要去看網上所謂的培訓視頻,浪費時間。優秀的文字版教材對著練就是最好的方法,方便快捷。

------------------------------
補充解釋:
為了集中精力我把兩個軟體的ui設成了黑色,頂部是任務欄,個人習慣而已不必模仿。
圖片中演示的是:
左邊是foxit閱讀器,PDF格式編程書籍(當然也可以換成網頁版文字資料),
右側是IDE工具。
按圖中的方式調整兩個窗口大小,就可以一邊看一邊練習書上的代碼,有效利用了寬屏顯示屏。
實測學習效率很高,比拿著紙質書練習高的多,非常適合新手入門。

至於學習資料,根據高手的推薦書目,自己去搜吧 也可以購買電子版圖書。


談不上特別專家級別

回答這個問題綽綽有餘,因為有切身的經歷,所以無意看到這個問題的時候心情是很激動的。

當靜下心來規整思路的時候突然又不知該怎麼規整思路了

那就說說自學和機構學。

自學:當然要有書,比如入門的書有Head First Java 還有,Java入門123,都是一些基礎的書籍適合入門,講的也真是特別簡單,看一看劃一下重點,該記的知識點背一下,自己做做小實驗,驗證下裡面的關鍵知識點你會印象非常深刻,再結合點視頻。就可以在Java的世界啟程了!
。。。。。。。。。。。。。。。。。。。。。。

重要的是忍住一切誘惑,忍住一切痛苦,沉住氣。自學,就是這樣煩躁,有問題要自己研究,沒有私人導師,時間就像容嬤嬤在折磨紫薇,失敗,無頭緒,找不到問題根源等各種操蛋事總是一次又一次摧殘著自己的自信和信心。

有的人沒有忍住折磨,放棄了這個行業!本來是可以學會的,有點可惜!


再說下培訓
因為自己就是培訓出來的,感受到各種優越感和好處。
去了班級第一天大家就做自我介紹,認識了身邊的小夥伴

自古皇上都要有個陪讀的小夥伴,小夥伴好處多多啊1,自己學會了可以鄙視一下他給他講講。
2,自己不會可以請教下他,免的把自己憋出內傷。

上課老師把每個知識點都講的非常細緻,還有時間練習,不會了隨時把老師叫過來,真是私人服務啊。

突然想到自己的高中,家境貧寒,老師不是最優秀的,輔導書不是最好的,家教請不起,走了多少彎路,浪費了多少時間,如果家裡有錢,請個家教,估計我也上清華北大了

如果家裡不差這點錢找個機構還是值得的,現在的努力都是彌補以前浪費的時間和犯下的錯誤。真是一寸光陰一寸金,寸金難買寸光陰啊!如果能有優秀的老師,志同道合的小夥伴能夠節約多少時間啊,能用一點錢買到了的東西,就不要用時間做交換了。

即便有了老師,有了小夥伴,有了學習氛圍,也要看自己的努力。當初我真的沒有12點之前睡過覺,老師講過的知識點我都會自己敲代碼驗證一遍。這樣記憶會比較深刻。
就這樣堅持了半年我學完了,而且我是班級工資最高的一個,11年當時6000工資!

所以我想說看自身的條件和情況,選擇一個適合自己的學習方式。

我個人認為付費的總有他的價值所在!畢竟都是那些行業精英花費了心血和智慧總結出來的,如果你沒有自己體會過就先不要貶低和辱罵了。體會過的也要問一下自己,你找的機構靠譜嗎?

對任何事都要心有敬畏!對知識也是一樣,鑽角尖,把每個知識點都自己用代碼驗證一遍,並有自己的理解!面試的時候就是你綻放光彩的時刻!
目前我在做教育行業的運營,諮詢。如果大家有什麼事也可以私信我。比如不知道該怎麼選擇,不知發展前景,不了解教育機構的坑,不知道哪靠譜等等。我會盡最大努力幫助大家!


首先把代碼擼起來!

首先把代碼擼起來!

首先把代碼擼起來!

重要的事說三遍。

昨天一個網友和我QQ,要學編程,但家裡的PC機已經是老古董了,問我「能不能先不買電腦?」還讓我先給他「推薦幾本書」。

你學編程連電腦都木有,還「推薦幾本書」——知乎中毒太深了吧?

這就像你學射擊沒有槍,學鋼琴沒有琴,學游泳沒有澡堂子……搞個毛線啊!

借用知乎某位大V的話說,「編程是門手藝活」。什麼意思?得練。

我做編程一口氣做了十年,再也不想回頭做什麼律師。因為代碼的世界很純粹:你行就行,不行就不行。不像其他一些職業,說你行你就行不行也行,說不行就不行行也不行。要想爬的高,整日里就得琢磨怎麼「混」,有意思么?

這一行,就不怎麼需要看簡歷,「行家一出手,就知有沒有」,三言兩語,就把你底子給摸清楚了。

所以我才會說,這個問題完全就是個偽命題:最近看脈脈上說「前端」就業困難,大量的培訓機構出來的學員造就了前端市場供大於求?

同學,這是市場經濟,是一個競爭市場。如果一個企業能被什麼「在簡歷上做點手腳的求職者」——還是剛畢業的,剛從你都看不起的培訓機構畢業的,還是已經有了「這麼多負面消息報道」的培訓機構畢業的——求職者給騙了,你說這家企業是不是該死?該怎麼死?是不是只能笨死?!

退一萬步說,這些企業都笨都蠢都有眼無珠,這種企業聰明如你應該退避三舍啊?諾大的市場上,難道就沒有一個稍稍聰明一點點的企業了么?

開始學編程,我不止一次的說過:首先敲代碼,先敲代碼,敲代碼啊!

選一個能夠迅速給予你「正反饋」的語言,先把環境搭起來,「Hello World」打出來,這就是第一步。這極其簡單的第一步,對於很多完全自學的同學都非常難——好吧,我承認,當然我就是連Hello World都整不出來才進的培訓班,逃.jpg……

然後,一步一步的做出一個小網頁小遊戲(哪怕你還看不懂代碼,都是一個字一個字照著書上敲的都可以),美美的享受一下,再開啟波瀾壯闊的新篇章吧!

後面的事我就不多說了,以免沖淡主題。

對於所有學編程的新人,請牢記:

首先把代碼擼起來!

首先把代碼擼起來!

首先把代碼擼起來!

+++++++++++++++++++++++

本回答收錄於收藏夾:野生程序員,歡迎關注。


如何學習編程?瓶子君沒有學過編程,但是想起了一個很酷的教編程的學校「42」。

這所學校里沒有老師,也沒有課本,甚至畢業了也沒有學位文憑。

但它卻可以讓對編程完全零基礎的學生在一個月以後達到普通大學計算機工程專業大一學生的水平。畢業後的學生被 Twitter、Snapchat 等科技大公司盯著,準備隨時「搶人」。

它是怎麼做到的?話筒塞給這位學生戴維·李(David Lee)


第一次聽到朋友說起「42」大學的時候,戴維·李(David Lee)簡直覺得朋友燒壞腦袋了,他更沒想到自己真的會去那兒學習。

「他說,那學校在矽谷,一分錢都不收,還有免費宿舍給學生住……我說,等等等等,這年頭怎麼可能有這樣的好事啊……」

這大學的確有點古怪:「42」名字來自《銀河系搭便車指南》的「宇宙終極答案」,聽起來就很書獃子了,重點是學校里沒有老師,也沒有課本,只有排滿教室的 iMac 電腦和高速網路,看著像個高級版的大型網吧,就算畢業了也沒有學位文憑。

就這樣的學校,也敢叫囂「培養這時代最頂尖的人才」?

「42」的矽谷分校成立至今才一年多,從這所沒有老師沒有文憑學校出來的學生,被 Twitter、Snapchat 等科技大公司盯著,準備隨時「搶人」。

「我都震驚了,我覺得21世紀的教育就應該是這樣的。」參觀完「42」的矽谷分校以後,Airbnb 的 CEO Brian Chesky 評價很高。

▲「42」大學(看起來很多人在打遊戲??)

/像遊戲打通關一樣學習/

剛進「42」的時候,戴維有點懵。新生在「42」的第一個月被稱為「游泳池」,不想溺水的話,得使勁撲騰。

每天早上 8:42,他都會收到一個新項目的挑戰,得在第二天晚上 11:42 之前完成和提交。項目五花八門,例如做網頁或遊戲,都是在計算機上從無到有的創造,這要求戴維迅速掌握與計算機對話的語言能力——編程語言。而在那之前,戴維剛從美軍醫療隊退役,一丁點兒編程知識都不懂。

老師?課本?不存在的。想把事情搞明白、完成項目?問 Google、跟同學討論,直到你搞懂為止。學校一周7天、一天24小時開放,由你自己來掌握學習節奏。

▲教室里貼的「告示」:如果你有問題,谷歌一下吧!如果你還有問題,問你的鄰桌吧。

聽著挺酷的,但戴維心裡有些沒底:沒有老師,怎麼才能知道自己學得怎麼樣?

「42」的方式是,讓學生之間相互批改作業,將「同輩學習」的效果最大化。他們還為此發明了一套「打怪積分」的系統:你想要別人幫你查漏補缺?你得用積分去換,而攢積分的唯一途徑是你去幫別人查漏補缺。如果你被發現馬虎了事,那你得接受「去跑腿買咖啡」、「用牙刷去擦窗戶」等懲罰;如果表現好的話,會獲得「金幣」獎勵,可以在校內把它當成錢來花。

順利通過「游泳池」的學生們都說,這簡直像「飢餓遊戲」:要麼想盡辦法存活,要麼自己認輸退出。戴維發現,這樣一個月下來,曾經對編程完全零基礎的自己已經達到了普通大學計算機工程專業大一學生的水平。

「我們這兒什麼都不教,」 矽谷分校負責人 Brittany Bir 說,「42」把「教(teach)」定義成老師向學生灌輸知識點的傳統教學模式。在她看來,「42」最適合那些不能忍受傳統模式的學生,他們不喜歡總是被告知該做什麼、該怎麼做,「在『42』,學生們把時間都花在主動探索、主動創造上」。她自己就是「42」的畢業生。

在「游泳池」存活下來後,戴維正式入學。他要面對的,是由6位教學研究員設計出來的21道「遊戲關卡」,每道關卡都是全新的個人或團隊項目挑戰,他得不斷主動學習新技能才足以應對。

根據「42」的介紹,學生們可以在3-5年內完成學習,掌握的不僅是編程能力,還有「創造力、批判思維能力、團隊協作能力、開放性的心態和思維、追求卓越的能力等」。

這所學校的背後,是一個學習路徑也不怎麼常規的法國人澤維爾·尼爾(Xavier Niel)

▲不按常理出牌的澤維爾·尼爾

/為什麼精英的小孩繼續是精英?/

1983年,16歲的澤維爾·尼爾就不吃學校教育的那一套。

出生在巴黎普通工薪家庭的他,受到痴迷計算機的父親影響,16歲就從高中輟學回家自學編程。三年後,他賣掉了自己的第一家互聯網公司 Minitel,一個情色網頁聊天網站。

此後,他一直在做互聯網服務提供商。最受矚目的戰績要數 2012 年,他殺入被國企壟斷的法國電信市場做移動運營商 Free Mobile,推出 25 美元一個月的無限流量套餐,比法國其他運營商便宜一半多。

2013 年,身家99億美元的尼爾動起了做教育的腦筋。最初是因為自家公司招進來的員工都不怎麼令他滿意,他認為學校教育出了問題。他對著媒體,公然炮轟法國教育系統,說它不再能夠促進社會流動性,「已經破產了」:

「(在法國)如果你是來自藍領工人家庭的孩子,你很可能會繼續當個工人。而精英家庭的孩子繼續是精英。每年有二十萬個孩子(因為家境等原因)輟學、對自己失去希望……我們希望能幫助這些孩子掌握自己的命運。」

那一年,尼爾自費在法國成立了第一所「42」大學,以編程作為重點,「符合互聯網的發展」。2016年,第二所「42」在矽谷成立。尼爾為兩所學校提供了10年的發展經費。

▲「42」建校團隊

教育公平性是尼爾反覆強調的,除了免學費,他還立下對申請者的「三不看」原則:不看學歷、不看過往成績、也不看以前做過什麼,只要年齡在18-30歲,哪怕有過犯罪記錄,都一視同仁,歡迎申請。「『42』就是一個大熔爐。」尼爾說。

申請者唯一要做的,是在網上參加一個看著像遊戲的邏輯測試。理論上,只要通過了,就有機會進入「42」。

▲「42」入學測試的第一部分

然而,申請者們的熱情超出想像。在矽谷分校8月剛結束的招生中,64000位申請者完成了測試,其中超過20000位通過了,而因為場地有限,分數排名前3000的被邀請參加為期一個月的「游泳池」考驗,最終只有1000位學生能被正式錄取——也就是說,錄取率為1.52%,比哈佛還低。

「『42』確實很棒,但也真的很殘酷。」經受住「游泳池」考驗的 Wendell Misiedjan 在博客里寫道,「我去之前就聽說,一天大概要花10-14個小時學習,一周7天沒法休息。可實際上,我自己一天得花12-16個小時,而且很可能還是沒法搞定當天的挑戰。」

▲ Wendell Misiedjan 說這就是「游泳池」階段的他

25歲的塞巴斯蒂安·福徹(Sébastien Faucher)是最新進入法國「42」的學生之一。在此之前,高中讀不下去的他只能在工廠打工,過得很不開心。他想以「42」為跳板,努力成為一個遊戲設計師。但第一周過去,完全零基礎的他每天得花15個小時以上,想方設法應對當天的挑戰,他覺得自己撐不住了。

「兩天前,我打算認輸了。我哭了很久很久……」福徹甚至買好了回家的火車票,可在那一瞬間,這位高中輟學者忽然意識到,「(如果這次放棄了,)我哪兒還能找到這樣的機會?」於是,他又回到教室,坐在電腦前。

▲ 「游泳池」階段,每天15個小時的學習不少見

校長 Nicolas Sadirac 承認,「42」的做法「確實挺激進的」,但在快速變動的互聯網世界,學生死記硬背的東西一兩年就失效了,「42」要提供的,是面向真實世界的教育:

「我們就是不想教大家一步步怎麼做,因為我們永遠不知道人們未來要面對的是什麼問題,我們要做的,就是創造條件,讓大家學會怎樣找到解決問題的方法。」他們認為,在管理時間和精力上也是如此。

「42」也把它的做法帶到了羅馬尼亞、烏克蘭、保加利亞、南非等國家,和當地機構合作開辦免費的編程學校。尼爾還打算把「42」開到中國來。但他暫時不考慮把「42」做成網路課程,因為學生之間的氛圍還是網課無法替代的。

▲在「42」,會玩也很重要

/教育怎麼跟上快速變化的世界?/

儘管從目前來看,「42」更適合有志於進入互聯網行業的學生。

不少教育研究者認可「42」引導學生以解決問題為導向的學習模式,但也擔心直接「去老師化」的做法太過冒險。教育與社會政策教授 Dan Butin 認為,老師能夠帶領學生去分析解決那些複雜的、困難的、抽象的問題,而那些問題往往是在學生認知範圍以外的。

1995年,喬布斯在一個訪談中說,每個人都應該學一門編程語言:「學習編程教你如何思考,就像學法律一樣。學法律並不一定要為了做律師,但法律教你一種思考方式。」

但無論是否有老師、是否是編程學習都不是最重要的 ,「42」的教育理念和模式在全球範圍內引發震動的原因,還是因為它讓人們重新思考怎麼自主學習。今年,它入圍了世界教育創新峰會(WISE)的評選,被認為是有利於解決全球範圍內教育挑戰的創新性探索。

根據《經濟學人》今年初發布的報告,許多學科的知識更新周期已經縮短到2-3年。大學本科的學歷水平已經不足以滿足持續獲得新技能的要求;擁有自主學習的能力,在離開學校後保持「終身學習」,成為一種競爭力。

「基因決定了大腦的『硬體水平』,」研究人工智慧的 MIT 教授 Ethem Alpaydin 說,「而學習就是那些跑在硬體上的軟體迭代。」

無論「42」會在多大程度上改變教育,學會自主學習這件事是勢在必行了。


以上回答選自BottleDream編輯麒麟的文章《沒老師、沒作業、沒文憑,這學校的畢業生還被一流大公司搶光》,首發於BottleDream公眾號。

如果對我們感興趣,也可以微信關注BottleDream(id:bottledream),微博 @BottleDream


當你提出這個問題的時候,總有人會告訴你,你應該學習這個,學習那個,亦或者是刷題根本沒用,你應該去做項目,亦或者你看這個視頻沒什麼卵用,你應該自己去實現一遍,亦或者是你應該使用xxx框架,xxx語言,做一個xxx系統,這樣你才能學到很多。我想說這些建議大多沒有太多的實踐操作性。對於一個編程菜鳥,很多事情都是陌生的,即使拿到一個文檔,也不知道如何去使用它們。因為根本找不到切入點,找出我該如何入手,萬事開頭難。

編程本質就是一門技術,一門手藝活,最好有老師傅帶著你,告訴你這部分你可以先完成,那部分你也可以先入手,一點一點的積累,從小部分做到整體,孰能生巧遊刃有餘。
但是很不幸,你的生活中不會有這樣的老師傅,你需要靠自己尋找機會,我把這樣的尋找機會的步驟分為三步

  • 瘋狂的積累代碼量,瘋狂的刷題,瘋狂的積攢你的自信心。
  • 尋找實習,找到自己感興趣的地方,跟著別人做,了解工業屆到底在使用什麼技術。
  • 當你實習結束的時候,你將不會再對那些名詞感到陌生,你有了一定的經驗,你可以嘗試獨立的嘗試用一些開源框架做一些簡單的project。

具體該如何做呢?

  • 當你還是一個新手的時候,你需要瘋狂的積累你的代碼量,你可以從基本的問題出發,做一些簡單的問題,怎麼輸入數據,怎麼輸出數據,然後熟悉各種數據結構,各種常見演算法,瘋狂的刷題,比如LintCode - Home 就是一個很不錯的刷題網站,不會怎麼辦!看答案,這裡推薦一個找答案的網站:LeetCode / LintCode 答案查詢 , 了解怎麼寫,然後自己實現一遍。你可以先從easy難度的問題做起,每一個程序也就20-40行左右,甚至你可以一旦AC,反覆提交,以增強自信心,雖然這只是一個玩笑,但是它可以讓你提高你對編程的自信,對編程的喜愛,當你有自信的時候,你才能真正的把一件事情做好。當你反覆解決一個又一個的問題的時候,你要告訴自己我是個天生的編程者!然後你就可以挑戰更高難度的問題,當你積累到10W以上的代碼量的時候,你會發現你會有一個質變。一切將變的順手。當以前要想半天的語句,現在信手拈來。恭喜你跨出了很重要的一步。
  • 你該去找實習了。當你有了第一步作為鋪墊以後,你應該去業界提高你的編程能力,這個很重要。什麼是編程能力,用程序去解決真正的問題,你的程序寫的更讓人能讀懂,這是編程能力,你的程序高效可維護,這是編程能力,你的程序被review的次數很少,質量很高,這是編程能力,你能快速理解一個小項目,小模塊在做什麼,怎麼做的,這也是編程能力。所以你應該去公司,有mentor指導你的情況下,去做一些事情,參與到團隊中去。同時實習生的面試門檻比Full time會低很多,只要你把第一步做好了,好好的準備面試,拿到一個不錯的實習也問題不大(實習生也更容易拿到return off)。
  • 當你實習結束以後,做一下總結,業界到底在幹什麼,業界使用的技術到底有哪些,他們平時的編程工具等等這些都是值得你學習的地方,你可以用你學到東西嘗試著去做一些簡單的project。你會發現原來毫無頭緒的事情,慢慢變得清晰起來。瘋狂的訓練,超強的自信心,去工業界實習一下,你就會明白我要什麼,我要為了我所想要的我該怎麼做。

推薦閱讀:

  • CS 常考基礎知識點
  • 九章演算法原創乾貨,找碼工、面試必看!

歡迎關注我的微信公眾號ninechapter,回復關鍵詞」簡歷」、」career」、」評分」、」項目」...你就可以獲得所有你想要的東西~


熟悉以下關鍵東西,可以邊學邊做,定期訓練,經常思考,長期積累:

語法。


基礎理論(數學、數據結構、演算法等)。

設計方法(編程原則、設計模式、框架設計等)。

庫(核心、基礎、UI、擴展、遊戲引擎等)。

計算機相關(操作系統、網路、圖形學等)。

領域知識(遊戲設計、網站設計等)。

開發工具(編輯器、IDE、自動部署等)。

項目管理(進度管理、分工協作、Bug管理、版本控制等)。

最普遍也是最重要的能力:創造力。努力分析並理解好做什麼以及怎麼做。要知道上面那些東西一開始都是不存在的。

具體方法包括:

快速閱讀入門教程和書籍,適合學習語言和基礎庫。比如我學Java讀的《Java編程思想》,練習題做過一點,然後學ActionScript就沒讀過書,只讀過Adobe官方文檔《ActionScript 3.0編程》。

閱讀庫的文檔、實例、源碼。比如Flash、Flex開發,熟悉官方API很重要,很多細節要具體使用時才注意到,這時候最好做個筆記,雖然我從沒看過我的筆記。

做一個自己感興趣或熟悉的小項目,比如我就以黑白棋遊戲作為多個語言的試水項目,一樣的邏輯,便於把關注點放在語言特點上。

自己動手豐衣足食。廚師有菜譜,程序員可沒菜譜。比如我做遊戲,最關鍵的遊戲編程知識全部是動手學出來的,很少有專門針對某個業務領域(如遊戲)的編程書籍,要麼是入門書,要麼是模式書(如演算法)、理論書(圖形學),很少有書籍教你如何開發一個45度角地圖系統加編輯器的,全靠自己思考,以及看前人的代碼,需要時找些網路資料。關鍵是,可以培養最重要的創造力。

對於演算法和設計模式,可以研讀下,但是關鍵還是靠平時如何使用了。新手勉強不來的。

項目管理方面的,就得靠工作經驗了,多思考多提意見不要只走流程。


學編程之前,我們要知道編程的這些特點。

1.首先編程是什麼?為了使計算機能夠理解人的意圖,人類就必須將需解決的問題的思路、方法和手段通過計算機能夠理解的形式告訴計算機,使得計算機能夠根據人的指令一步一步去工作,完成某種特定的任務。這種人和計算體系之間交流的過程就是編程。【百度百科】

1. 編程是一門實踐性很強的學科。

2. 編程它是一項技能。

知道了它的特點,我們才知道怎麼去學習。

1. 編程既然是處理人與計算機之間交流的過程,那麼我們就需要理解計算機處理問題的流程,然後我們才能把問題的思路/方法和手段通過計算機能認識的方式告訴計算機,這就需要我們有一定的邏輯能力,理解能力。

2. 實踐很強,就說明需要我們多練習,就是需要我們多敲代碼。

3. 既然編程是一項技能活,那麼只要我們不是很笨,都能學會,只是每個人所花的時間不一樣。

明白了以上幾點,我們再來看該學什麼,該怎麼學。

基礎學科:

1. 編程入門(如C、C++ 等)

2. 數學基礎(一階邏輯系統、集合論、圖論、線性代數、微積分、概率論)

3. 數據結構與演算法

4. 體系結構(數字電路、CPU設計、操作系統、編譯器、網路協議)

熟悉了上面的知識之後,對計算機基礎理論就有了大概的了解,也為深入學習編程技術打下一定的基礎。

然後,就可以真正開始學習編程了,這時候你有兩個選擇,一是學前端;二是學習後端。什麼是前端,後端,我一句話簡述。想要知道更詳細的,自行找資料學習。

前端:就是軟體的前台部分,我們肉眼能看見的部分,比如淘寶的各種頁面,app的各種頁面等等。

後端:就是軟體的後台部分,我們肉眼看不見,處理數據交互的。

前端所用的技術主要有三大技術:HTML/css/JavaScript

後端用到的技術:資料庫,常見也就是MS SQL、MySQL、oracle等資料庫,還需要精通至少一種語言,比如Java/.c#/PHP/Python等等。

知道了學什麼之後,接下來找一份詳細的學習大綱開始學習。去那裡找大綱?培訓機構的最好,他們研究得深入,資源也有。

有了大綱就開始學習吧。

有兩種學習方式:

一是自學。適合自控能力強,自學能力比較好,時間充裕的同學。三者缺一不可。

1. 查找資料。找到你要學習的所有資料,書籍+大綱+視頻。

2. 制定嚴格的學習計劃。細化到每一個知識點,這部分可以參考培訓機構的大綱。

3. 找一個老師。老師可以是你的朋友,同事等,遇到難題,自己不知所措,又問的地方。

4. 執行。上面的步驟都完成後,就開始學習吧。

二是培訓。適合剛畢業的大學生,想轉行學技術的在職人士,自學能力差的學生。

對自學要求高,很多人自學了一段時間就會考慮培訓。這也是為啥培訓機構火爆的原因之一。

我對培訓沒有偏見,在我看來培訓只是獲取知識的一種手段,只要你能力到位,我不管你是不是培訓來的,我招人就是這樣的。

我更傾向於應聘者的對技術是否有熱情,是否有可塑性,是否有良好的學習和工作態度。

當然,去了培訓,不要以為萬事大吉了,要想成才,還得靠自己。師傅領進門,修行靠個人。去了,要好好利用機構的師資資源,和學習氛圍,把該學的學到,不要再浪費時間了,你已經浪費不起了。

如果有時間,可以寫博客,把自己學到的整理成博文,一方面是鞏固自己的知識點,另一方面是增加自己的影響力。我有一個朋友,每次找工作,簡歷幾乎都不用,博客地址往那裡一扔,工作就有了,最近去了阿里,博客幫了他很大的忙。懂行的看你博客就知道你這人的水平。我也建議你們寫寫。

每天學了還得有總結,不能渾渾噩噩的過去了,總結自己學到了什麼,還有哪些疑惑,該如何解決。我聽我團隊一個做JAVA開發的同事說,他剛把他表弟送到了今年微軟專家陸敏技開的Java培訓機構最課程培訓了,他說,他們哪裡這點就做的特別好,每天都要讓學生寫日報,向陸敏技親寫郵件彙報當天學到的知識,不懂的及時提出來,陸敏技會一個個回復。如果真是這樣,我說這就去對地方了。

還有一些好的論壇平台你可以常看看,有好的文章,多研究。帖國內的,國外的網站,估計很多人看到就望而卻步。

1. csdn。有好多博主寫的文章還是不錯的。

2. 博客園。和上面差不多。

3. 開源中國。國內的開源社區,還不錯。

4. segmentfault。技術問答平台,stackoverflow的國內版,資源也不少。

先分享到這裡。覺得不錯,點個贊吧~


Peter Norvig 的 Teach Yourself Programming in Ten Years [1] 是很好的指引性文章。

[1] http://norvig.com/21-days.html


程序人生的寂靜歡喜

標題起得太大咯,是在故作老成么?

「程序人生的寂靜歡喜」——怎麼看都感覺像是某位已故計算機大師的墓志銘,可卻偏偏被一個菜得摳腳的毛頭小子拿來當做人生寄語——也是日了狗了!

人都沒生過,談什麼人生!?

莫怪我,我偏要「奢談」一下!

一.記敘

一開始我是拒絕的!因為我根本就不喜歡寫程序。

打高中數理化就不好,什麼排列組合、圓錐曲線、電磁場中一帶電粒子、水溶液中的水解電離,困擾我有如夢魘。

高考時,祖墳上冒出一縷青煙,數學創歷史新高考了88,理綜破有史記錄考了200,數據不僅太美太感人,而且大吉大利、元亨利貞!終於,我以總分522分考上了一所夢寐以求的2本就讀於計算機科學與技術1202班——命中犯2!

可是對於編程其實我是拒絕的——大一花了一年的時間來研究心理學,大二花了一年的時間來研究哲學,大三花了一年的時間來研究中醫——結果,《離散數學》掛了,《數字邏輯》掛了,《數據結構》掛了,《編譯原理》掛了——恨不得自掛東南枝!

人在做天在看,出來混總是要還的!曾堅信「天生我才必有用」,「我輩豈是蓬蒿人」;曾篤定「心所願力畢至」,「有志者事竟成」;曾夙願「天授其賦必賜其福」,「好風憑藉力,送我上青雲」。可是,一個冷峻若紫電青霜的問題劈面而來:不寫程序又能幹嘛呢?

然而我根本就不會寫程序!試想,一個打字只能用到右手食指、左手食指和左手無名指的人,敲代碼時是多麼捉急!試想,一個高數補考考了19分,滿腦子宏大敘事的理科弱智,寫程序時是多麼腦洞大開!

後來去公司實習,遇到的第一個項目就是要使用ESFramework通信框架,當我第一眼看到了開發手冊上的如下句子時,我就知道,春天不會再來了!

客戶端通過調用ESPlus.Application.Basic.Passive.IBasicOutter介面對應的方法以及預定其相關的事件,就可以完成基礎功能或得到相關狀態改變通知。我們可以從 ESPlus.Rapid.IRapidPassiveEngine暴露的BasicOutter屬性來獲取IBasicOutter引用。

介面、預定、事件、暴露、屬性、引用,你們一個一個來,我還大概能明白,你們群起而攻之,我便委地如泥了!

重載的Query方法(帶有CallbackHandler參數的)在發送請求信息後,不會阻塞而繼續向下執行,而框架在收到對應的回複信息時,會回調CallbackHandler委託指向的方法。由於調用線程與回復回調的線程不是同一個線程,所以稱這種機製為回復非同步調用。

再當我看到「重載」、看到「阻塞」時,我徹底憤怒了!而緊接著映入眼帘的「委託」、「回調」更使我出離憤怒!最後「線程」、「非同步」更令我萬念俱滅,心如死灰!

從此,我便以一種菜得摳腳的姿態狼狽不堪地行走在險象環生的程序世界裡。莫非是寒更雨歇,葬花天氣,獵獵北風襲單衣;荒原寂寂,遠聽猿啼,近看寒鴉起;鬼影幢幢,步步驚心,不知今夕何夕。

好多次我都想,別瞎費勁了,你不是寫程序的料!真正適合寫程序的人根本就不可能是這個樣子!

於是乎放棄。可是不寫程序又能幹嘛呢?好歹讀了四年大學,何況拉弓沒有回頭箭。還是要頂風逆水雄心在,不負人民養育情!

終於,苦水的浸泡痛徹了肌膚,磨練了身心,同時也澆灌出了涅槃之花!

某天我突然發現,那些原本看來佶屈聱牙的技術文檔如今看來卻直白如話,那些原本晦澀難懂的語法如今卻能夠熟練運用,那些原本看都看不懂的源碼如今也能夠在自己指下流淌,實習之前我連循環語句都寫不對,如今卻也能用ESFrameworkOMCS等框架開發出像樣的網路通信應用。

二.議論

更重要的是,從當初的不喜歡、不擅長、不自信,到而今能夠懷揣著一顆歡喜之心來寫程序,能夠以樂在其中的心緒來開啟自己的程序人生,這不僅是我收穫到的莫大財富,更是我把握住的莫大幸福!

胡適先生的名言:「怕什麼真理無窮,進一寸有一寸的歡喜。」真理無窮並不可怕,因為我們在每一寸的前進中始終獲得歡喜。編程之路並非坦途,我們也並非天賦異稟,然而那個最幸福的人,並非是玩轉代碼的編程高手,也並非是億萬家資的IT精英,而是那個在流年中始終以歡喜之心書寫代碼,又通過書寫代碼恆久再獲歡喜之人!

常言道:「男怕入錯行,女怕嫁錯郎」。嫁郎要嫁有情郎——有情飲水飽,無情龍肉都無味!入行也是一樣。入了所愛之行,舉手投足皆得歡喜;入了所憎之行,坐卧立行儘是苦悲!嫁郎的幸福不在於嫁郎所獲得的富貴榮華,其根本在於郎本身。那些通過嫁郎以獲取外在利益的女子,她們充其量只是獲得了生意上的成功,而根本沒有獲得婚姻本身的幸福,而這何嘗不是一種買櫝還珠?同樣,那些以工作作為純粹手段的人,他們也從來沒有獲得過工作本身的幸福快樂。

由此看來,我想恐怕對於絕大多數的程序員而言——你不是真正的快樂!

所有程序員恐怕可以粗略的劃分為這五種狀態:

1.不愛,但是迫於生計

2.無感,反正亦步亦趨

3.熱愛,但卻身心俱疲

4.狂熱,打了雞血一般

5.歡喜,畢竟樂在其中

你是屬於哪一種呢?

如果要我來選,我一定會選5,因為唯其如此才能獲得程序人生的個中真昧,才能擁有彼此交融的內在完滿。而其他的幾種狀態在不同程度上都是殘缺的。

也許我們寫程序總是不可避免的為了各種外在的目的,但是寫程序時的那份小確幸的歡喜,卻始終是我們精神飛鳥的棲息地。 正如孔子贊顏回——子曰∶「賢哉回也,一簞食,一瓢飲,在陋巷,人不堪其憂,回也不改其樂 。賢哉回也!」

罷筆時風煙俱凈,但願自己剛剛開啟的程序人生能夠無關風月,寂靜歡喜。


聊聊我的學習編程的經歷吧,也許會對你有所啟發。

我大學是在數學系,大家都懂的,曠了很多課,也掛了很多科,幸好在大三的時候接觸到了「數學建模」,我在裡面負責編程部分,那時候也啥都不懂,只是皮毛,但是讓我了解了程序還可以干這麼牛逼的事情,興趣就在那個時候悄悄的來了,後來折騰了一番決定去學習編程,在培訓機構的時候,打字還是二指禪,那個慢呀,隔壁高中小伙畢業來培訓的都比我強。學完第一份工作上了一個月,竟然被辭退了,再去了華為做外包,差點又搞上了C++。又是一番折騰,我的第二家公司才讓我的編程打下了基礎,再後來來了北京才發現原來軟體還有這麼多玩法。

下面先回顧一下本人編程前六年的經歷,結合我的經歷來聊聊我對學習編程的理解,會比較長,閱讀可能需要N分鐘,如果閑麻煩,可以直接跳到後面看如何學習編程。

如何入坑

在XX的培訓班上有一次我對大家這樣介紹:我來自一個二流的本科院校中的一個三流專業,學校本來就是師範類的院校,自然不是特別受歡迎,我們是師範學校裡面的非師範專業,而且是學校剛開的專業掛在數學系更加非主流,專業就是:信息與計算科學。我聽說有的學校這個專業是計算機系的,不知準確信息。但基本上都是學數學的,帶著學習一點計算機,當初報考這個專業也是因為這個名字,看起來很有科技含量,多少農村孩子都是這樣報考專業的!!!

大學生活

一般大家回顧都要說說大學生活,我的大學一年一句話來總結,大一基本上都是在網吧度過的,大二基本上都是在籃球場度過的,大三基本上都和女朋友一起過的,大四基本上都在找工作中度過,導致我走向編程這條道路的經歷基本上都在大四了。

有幾個原因導致了我最後選擇去培訓機構培訓Java編碼,第一、對計算機比較感興趣,大學數學課程基本沒聽過,都是考試應付,但對相關計算機課程很感興趣,但學的太淺了,我不討厭數學,但是讓我想到學這麼多微積分、線性代數…畢業後有個鳥用,就泄氣了,沒有一點動力。第二、真的不好找工作,專業幾乎沒有對口,同學幹啥都有,有的走向了培訓、當了教師,有的做了文員、公務員、銀行職員,有的做了交警、還有公安,但最讓我驚奇的是有一個當了律師,太驚訝了,我感覺比編程可困難多了,基本上都是各自找自己的出路。第三、大三暑假那會參加了數學建模競賽,在小組中我負責編程的部分,那時候用的MATLAB和C語言,隨著不斷的練習和使用更加驗證了對軟體的熱情和理解,也只是覺得軟體應該是一個朝陽行業,慢慢的去了解了入行的標準,找工作的過程中慢慢試著去接觸了一些培訓機構,但是看到1w左右的培訓費用,我猶豫了,那時候的1w對我來講太重了。

大四那年冬天,印象很深刻,跑遍了省會城市大小招聘會場,不是簡歷都過不了,就是么消息;最後到應聘上幾家公司,但是和自己想像中差距太遠,一個是培訓機構當老師,沒去;一個是做管培生,去了,我靠基本上跟傳銷一樣,什麼管培生就是賣軟體,記得應該叫「紅利軟體」,就是跑到各個交易所裡面去找大爺大媽,聊天要電話,讓聽講座最後引導買軟體,一套軟體大概是3000左右,可以提成10%;早上7點上班,各種活動遊戲,8:30出發,9點左右到交易所各種找人,看著眼睛發光的大媽大爺就是目標客戶。下午5點左右回來,各種培訓,然後開始根據話術打電話晚上10點回家,我們學校一共去了8個人吧,最後留下了一個我們都想到不到一個人,我們班一個文文弱弱的小女生,學習很好的那種,一干就是兩年,真是人不可貌相呀,堅持了兩周我就撤了。

南下深圳

為什麼了去了深圳?幾個原因,我老大(初中很好的朋友,初中畢業後當兵,然後南下深圳)在這裡,萬一不行還有一個投奔的地方。深圳應該是當時印象中南方比較發達的城市,希望可以見見世面,找找工作,對了那年還是流感(2009年H1N1流感),疫苗剛出來,只給大四的學生先用,那天還發著低燒,也沒管直接就打了。小馬是我們班的一個同學,關係比較好,聽我說要去深圳,特別激動說,強哥咱倆一起去闖天下去 :),因為小馬家境還不錯,沒有吃過太多的苦,從小都沒出過省,還是有點擔心,但是看著小馬這麼激動,恰好我也有一個伴,就欣然接受了。後來我先去的,看了情況還行,就打了電話叫了小馬一起過來。那時候從西安到深圳為了省錢買了硬座,應該是做了將近30個小時左右吧,吃了N多筒的泡麵終於到了深圳,南方人的普通話真是聽不懂呀。對了,小馬最終做了一名人民警察,這就是另外的故事了。

因為我先去的深圳,就先去了深圳人才大市場,當然了各種受挫。等小馬來了以後我們就先進了龍崗的比亞迪工廠,我們分在了不同的車間,小馬比較幸運去了電池車間,就是流水線,我分到了紙箱車間,大家可能平時覺得紙箱子沒有啥,但是在沒有成品之前,邊緣幾乎都跟刀子一樣,沒幾天從手到胳膊全部是傷,但最重要的是我和我們車間的老大搞不到一起,整天吵架,有一次差點幹了起來,那個車間老大後面瞬間站了兩個人,那次之後起我就出來了。

聽了老大的建議,我又去了龍華的富士康,有一個朋友接我,對我說那邊大學生應聘一人還發一個電腦而且是做辦公室的(車間裡面的人都羨慕做辦公室的,畢竟不用賣苦力;在廠裡面一般工服有三種顏色:藍領,就是普工或者技工身份進廠的;紅領,就是質檢,專門檢查質量的,大部分從藍領升上去;白領,一般就是大學生了做文職或者管理),我沒去,我還是以普工的身份進的富士康,我不信我干不下去,最後又分到了觀瀾的一個小分廠裡面做物流,對了就是富士康當時有名的第一跳,就在那個廠區。廠裡面不像大家現在洋氣的說996什麼的,幾乎沒有假期,什麼周末更別提了,早8點晚8點,半月白班,半月夜班。富士康在深圳還是福利比較好的一個工廠,包吃住用藥等。

在工廠的這段經歷讓我明白了,我必須要依靠一個技能來養活自己。這個技能就是搞軟體!

培訓班

根據之前的了解我大概選了兩家培訓機構,一家就是野馬XXX,另外一家就是XX培訓機構,價格都差不多,但野馬有教師,XX是視頻教學,當時感覺不能接受,不太靠譜。本來都拿著錢去野馬那邊交錢了,在付款的時候,財務說可以減免了一百元,跟我一直溝通的那位說政策搞錯了,肯定不是這個。就因為這個原因,我感覺他們不夠嚴謹,我說那我就先不報名了,然後就去了隔壁的XX看看,結果他們正在上課就讓我試聽了一下,裡面全是大四的學生,我坐在後排聽了一上午,雖然感覺還是跟不上,但是有那種建模學習的那種氛圍,我就定了XX。後來我在XX都上課兩周了,野馬打電話說給我特殊減免3千元讓我過去,最後沒去,但是感覺水分真大。

其實XX當在西安的培訓還挺紮實的,還考了sun的證書,其實也么啥用。開始從跟不上,到處請教別人,到慢慢的理解,寫各種小遊戲,到最後也有學員來問我問題。那時候周六、周天可以免費在培訓機構學習,我幾乎周末都在哪裡,畢業答辯的前兩天才回去,然後又過來,畢業典禮沒有去,畢業體檢舍友這個幫我測血壓,那個幫忙測體重,畢業證書、學位證書舍友幫忙領。我的大四幾乎和學校都沒有關係。在XX認識了好幾個朋友,工作到現在都聯繫著,有的去了華為,有的在外包,還有的搞了小公司。

培訓機構承諾免費介紹工作,那時候的培訓好像也沒有讓大家偽造什麼工作經驗,學校什麼的,一般情況下只要你不是很爛,基本上都能找到工作。XX推薦了幾家公司,自己也投了簡歷記得最後收到了2個或者3個offer,也記不得都有什麼公司了,最後選擇了去李嘉誠兒子的一家公司就是電訊盈科,這個公司那時候剛來西安,還算不錯的公司,主要是電信方面的研發,可惜我再這公司也才呆了不到一個月。

工作西安

剛入這行還是比較周折,也差點進去了另一個方向,所幸最後走向了正軌。程序員都是第一年的工作不是特別好找,過了第一年後,後面就比較輕鬆了。剛進電訊盈科的時候我的心裡狀態還是沒有調整過來,感覺還是在大學的那種狀態,進去之後是淘汰制,一個月內培訓oracle,兩周淘汰一次人。其實我感覺自己太不會表現了或者其它吧,最終一個月底的時候我也被淘汰了,打電話給我姐說的時候,我姐說,關鍵人家一共20多個人就淘汰了2個人!其中就有你!對了培訓的錢,借我姐夫的。我感覺很憋屈,但我還是不認可,我是最差的。但最終我還是需要面對再找工作的問題。

網上海投了N份簡歷,電話不多,面試了幾家公司後,也收到了幾份Offer一個小公司不交社保,1800;有一家外包華為2100正規繳納社保,我去了華為外包。關於薪資我給大家說兩個笑話:1、我當初培訓的時候一個學員給我說,有一個朋友從這裡出來後,第一份工作2000,跳槽後4000,再跳槽後6000,我們一群人心裡都默默的崇拜著,想著這肯定都是大牛級別的人物;2、我畢業第一份工作預期是2000左右,然後我就幻想著以後每年能漲1000元我就滿足了,到了30歲我就能拿快8000了,現在真到30了才發現現在的畢業生起步價也是這個數。

第一份工作

那時候我也在網上看了很多外包公司的種種不是,但我的選擇不是很多,不管怎麼樣畢業了就不能再往家裡要錢了,總得先掙錢吧。華為外包有一個變態的特點為了保密,不允許帶U盤、手機等各種存儲、通訊設備,上班後基本就和外界失聯了。那時候是做無線上網卡的客戶端,就是那時候往電腦一插就可以上網那種。每個人進來會分配一個師傅來帶,比較幸運我來的時候分給了一個比較好的師傅,性格、態度,以及他工作的方式其實最後也都影響了我。

我們應該在研發二部,大概分了三個部門,大巴組,小巴組和定製組。定製組:就是不用寫代碼的那種,華為開發了一些工具通過工具可以改變客戶端軟體的logo,模塊功能等,華為的軟體真是遍布全球到處的客戶都有,阿拉伯、非洲各種語言大部分的需求都是基本可以工具搞定;小巴組,就是需要改一些代碼,但是工作量又不是特別多的那種;大巴組就是需要改動需要1月以上的需求。我當時分在了小巴組,大概有十幾個人,其中也有很多碩士畢業的也被忽悠進來。最原始的代碼都是印度阿三寫的,我們都是在上面做二次開發,剛進去看了一個類代碼有上萬多行驚呆了,但是代碼確實寫的非常正規。沒有什麼架構文檔給我們,但改動基本都是外層的皮膚了或者小按鈕之類的。

加班非常多,但比較開心的是加班有工資,而且是按照國家標準來的,平時加班1.5倍,周六天2倍,假期三倍。這是我工作到現在最正規的加班制度了,工資只有2100,但通過加班可以拿到3000左右,加到2點都是很正常的事情,特別喜歡假期加班可以拿三倍工資,華為在西安包了N多大樓,當時在軟體園三期,班車上百輛開出去還是挺壯觀的。華為的中午休息文化,確實好,中午吃完飯熄燈大家都睡覺,中午趟在哪裡睡一個小時,下午工作質量明顯提高N倍。

我剛進去的時候客戶端有兩種一種是Java寫的,一種是QT(C++的封裝),慢慢的Java版本的都淘汰了,全部上線了QT。我從小巴慢慢開發了大巴需求,但到最後沒有Java版本的需求了,全部用QT。Java組的大家都各種轉型,有的去了另外一個js控制的項目組,我選擇了留下來搞QT,開始學習C++,因為有C語言的底子,倒也不難慢慢的可以開始搞QT版本的小巴需求,但是最後我就糾結了,我以後到底是往Java方向發展呢,還是C++呢。後來終於想通了,我花了那麼多錢培訓java這樣太虧了 ,於是選擇了離職。那時候華為方的領導其實對我也特別好,還專門給了我兩周時間不用上班去參加華為Java的培訓,大家都帶著華為的白牌子,我帶著外包的黃色牌子,培訓老師問了我好幾次我是那個部門的,但最後我還是撤了。

第一份工作促成我從學生到職場的轉變。

第二份工作

當時面試有意向的公司大概是兩家,一家是做GIS系統關於地理信息的公司,另外一家是XX系統,主要是做思科代理,給思科做各種軟體或者給思科的硬體去做集成方案的各種軟體。我選擇了後者,沒有別的原因,後面這家工資給的高,我就這麼實在。

剛進公司其實比較緊張,因為半年沒有做Java了,每天各種學習,各種加班最後發現其實還可以,雖然半年沒有搞了但問題也不大,公司用的是hibernate和Struts基本上都是以前用過的框架。第一個項目是,smart meeting智能會議,就是大公司預定會議的一套系統,大部分的工作都在前端,那段時間讓我對js有很了很大的了解,因為預定會議的系統界面都是各種拖拽。第二個項目大概就是vozimate,就是給思科的IP話機上面做應用,就是通過電話可以查詢股票了、天氣預報了等等,我們的這些信息都是通過爬蟲抓取第三方的,過一段時間就需要調整一下爬蟲策略。第一次讓我對硬體和軟體交互有了理解,思科的IP話機當時還是蠻先進的視頻通話,各種會議都是沒有問題。

最重要的一個項目也是我幾乎入職一直在搞的項目就是UC manager,就是通過思科的電話打完短途、長途、漫遊、國際漫遊、轉接、會議等等,凡是和打電話相關都會有,其實就是相當於聯通或者移動公司話費的計費系統,當然還有路線最優路由,統計等各種功能非常多,剛開始做一些小功能,到負責一個模塊,到最後整個系統都是我來負責,直到我離職的最後一天,我都在做這個項目的最後一版計費優化。正因為這個項目到北京面試的時候得到了一個高薪的機會,這個下面再講。

其實在這個公司裡面,項目中規中矩,代碼也是主流的框架和技術,一年多的時間穩紮穩打讓我對大項項目框架和設計有了很多的認識,特別是爬蟲什麼的讓我非常興奮。那時候中午我經常看博客園的新聞,整天都是互聯網公司怎麼怎麼了,但是西安基本沒有一家正正經經的互聯網公司,於是就有了去北京想法,剛好jerry也有這樣的想法13年過年後,大家紛紛提離職,準備去帝都呼吸新鮮的霧霾。

北上帝都

來到北京的時候,我身上只剩了3000快錢,1000多在分鐘寺(現在已經拆遷)租了個公寓,買了些日常用品後就剩1千多了,我專門挑互聯網公司來投簡歷,大概頭了100份左右,找了10家去面試,一周內面試完拿到了5份offer,其中有一家給的特別高就是因為我以前做了UCmanager這個項目,他們公司剛好給愛立信做項目,缺少這樣項目經驗的人,我猶豫了很久,畢竟工資給的很高,但最後還是放棄了,進了一家第三方支付公司。

第三方支付公司

選擇第三方支付公司的時候,其實我還不是特別了解這個行業,只是覺得支付應該是比較不錯的。這家公司也是我現在公司的母公司,剛入職的時候感覺周圍一大片全都是大牛!公司還管飯,感覺特別好,沒過了幾天,就被同事拉進了一個XX山炮群,又開啟了胡吃海喝的時代,經常私下我們幾個組織著去AA聚餐,各種吹牛,各種燒烤啤酒也別有一番風味,混熟了之後,才發現和我一樣大家都是屌絲,有一次部門聚餐的時候,部門經理說,大家都舉下手看看大家都是那個省的,結果幾乎每個省都是一兩個這種,看著來自五湖四海的同事在一起工作,也是一番景象。

剛來公司做的是,第三方支付的前置接入系統,當時公司每天交易額剛剛上億,服務壓力非常大,每天各種報警,我們就輔助從前置開始跟蹤,慢慢的對業務有了了解,後來也寫了專門的壓測程序來跑。再後來開始負責公司官網的改版,收銀台改版,到後來開始了解J8583,銀行接入平台 慢慢的才對第三方支付有了一個整體的了解,13年底的時候慢慢的興起了很多p2p,很多公司在做對接平台,那時候大家都不懂什麼是p2p,我們也不懂,也是一邊學習一邊搞,項目持續做了很久,我帶了兩三個人來做後端。最後這個項目也沒有做起來,因為我們還是不了解p2p公司到底需要什麼,自己琢磨的東西還是不太靠譜。

14初的時候總監,偷偷告訴我要封閉去做一個關於金融的項目,想讓我參加,沒想到正是這個項目對我的職場有如此大的影響,所以說關鍵時候的選擇非常的重要。緊接著沒過幾天,就開了幾個車拉著我們去了四星級酒店開始封閉開發,後來方案定了使用PHP開發之後,我又撤了回來做平台介面層的開發。大約過了一個月項目基本完成了,大家回來後項目組因為一個老總出走,帶走了一個團隊,剩下的開發幾乎都走光了,那時候其實我也找好了工作,新的公司待遇和環境都不錯,領導找我談話,想讓我負責這個項目。我對領導說我先考慮一下,等我休假回來後給回復。那段時間太累了加了很多班,請了好幾天假去了青海湖大玩了幾天,朋友都建議我去新的公司,後來我考慮一下還是選擇了留下。

互聯網金融

那個封閉的項目就是互聯網金融,那時候互聯網金融已經慢慢熱了起來,14年我們上線的時候應該是最後的一波熱潮了。直到今天我們公司在行業的排名都在20-60之間來回。

14年初的時候大家搞的p2p都是網頁版,app端有幾個公司有,但都很基礎,當時公司人力有限,就面臨一個選擇先做APP還是網站的問題,其實APP的問題主要是通道的問題,當時快捷支付應用到P2P公司還是非常難的。最後領導還是拍板先上APP,大家就集中人力先做APP,最後證明這是個正確的選擇,現在監控我們公司的交易,幾乎百分之80來自APP,第一次感覺移動互聯網的浪潮就是這樣來的。

系統剛投產的那段時間,交易量火爆,最誇張的時候1000萬的標的幾秒鐘就滿了,雖然現在平台也是這樣。但當時對我們來講還是蠻震驚的。在交易量火爆的情況下,系統出現了各種問題,首先是秒殺的時候控制不住並發,有時候會出現超賣的現象,最後各種優化,通過memcahed鎖解決了這個問題,緊接著伺服器又因為流量太大扛不住了,於是又上線lvs做負載。期間各種問題不斷,那段時間我幾乎晚上11點之前沒有回過家,每次我走的時候老婆還在睡覺,回來的時候她又睡著了,周末也是各種加班,總感覺自己見不到太陽,持續了很久,但是成長也是非常的大。

因為我們的前端是PHP寫的我又逼著自己學習了PHP,從開始能看懂,到最後可以寫一點。公司慢慢上線了官網,又增加了小網頁(H5),各種分散式系統改造。做各種活動,和滴滴打車做活動、和河狸家做活動、和攜程做活動等等,有一次一天註冊了X千個用戶,驚呆了,發現羊毛黨來了,又是各種限制。在後來慢慢的有黑客盯上了我們,各種騷擾,DDOS攻擊,SQL注入等等。反正是能遇到的問題我們基本都遇到了,每一次問題之後,我們系統就又健壯了一些。

再後來要做大數據分析,我們又開始啟動golang+monggodb這套方案來做大數據,剛開始也很困難,但是大家對新技術的這種渴望戰勝了一切;再後來上線了dubbo做SOA服務治理,到現在啟動spring boot+cloud。我們的系統也從第一代平台開始到現在第四代平台更換中,對這四代平台做一個簡單的介紹: 第一代平台,主要是集中式,以快速上線為目的;第二代平台主要是分散式改造,緩解各服務壓力;第三代平台主要做服務端SOA治理,後台統一賬戶中心;第四代微服務化改造,已達到灰度上線、動態部署集中管理的目的。

我也從負責Java端,到負責整個技術團隊,慢慢的在領導的信任下測試交給了我,再後來分公司獨立後將運維也交給了我,於是成了整個分公司的技術負責人。


如何學習編程

前面寫了那麼多,其實主要給大家講一個我學習的背景,回到主題:

1、如果你不是科班出身,如何去學習編程,去培訓機構真的是一種快捷的選擇,不論培訓機構教的怎麼樣,你在那裡能學到多少,我感覺這些都不重要,最重要的時候它把你帶入了這個門。我沒有參加培訓之前對IT可以說一無所知,不知道軟體公司一天都幹嘛呢?打字都是二指禪,所以培訓只是你進入IT的一個機會而已。當然現在網上資源和環境已經不能和我們那個時候相提並論了,免費的資料、視頻、教程有很多,只要你有很強的自學能力,其實也可以。其實去過培訓機構不可怕,可怕是現在很多培訓機構出來造假,毀了很多培訓出身程序員的名聲。

2、如果你剛開始培訓或者已經啟動在網上自學後,如何去學習?也就是如何快速的去入門,一定要先打好基礎,了解語言最基礎的用法,然後找一些小例子不斷的練習,沒有什麼訣竅,就是不斷的敲代碼,寫一些最基礎的helloworld,了解如何使用。在這個階段如果你和我當初一樣,什麼計算機基礎都沒有,不用管什麼演算法什麼的,只要會用就行,更不要想著深入閱讀源碼什麼的,不是這個階段來掌握的,以Java為例吧:掌握各種基礎語法,集合的使用,試著寫一些什麼圖片查看器、計算器、小遊戲什麼的鞏固語法,以練帶學,遇到不會的去查,去問。

3、如果你已經工作了,因為每個公司的技術棧都不一樣,不要嫌棄公司用的技術不夠新潮,不夠酷,認認真真完成你手上的一切工作,在工作中學習是最快的,因為領導分配給你的任務都是有工期的,自然有壓力,一邊借鑒老員工的代碼,一邊模仿他們的寫法去工作。如果過了半年後,已經很輕鬆的可以完成領導安排的工作了,這個時候就是要補齊你基礎缺失的時候了,比如說遇到一些http爬蟲的需求,那麼在完成工作後,在研究一下http通訊的原理,如果遇到網路編程了,在了解一下什麼是tcp/ip協議。遇到哪個問題就盡量的把它延伸一些去學習。

4、如果工作兩三年了,在這個階段程序員最容易遇到瓶頸,可能在公司裡面的活都能幹的差不多了。這個階段就需要考慮自己以後的職業發展方向了,如果喜歡遊戲,那麼就有目標的像這個方向去考慮,學習遊戲相關的技術棧,如果喜歡大數據,那麼就應該往這個方向去靠攏,盡量能選擇自己的愛好和職業領域一致,因為軟體最本質都是服務於業務,在積累技術的同時也是積累行業業務知識,為以後的打拚做好基礎。如果在自己的公司感覺學不到東西了,要果斷的去跳槽,如果自己驅動不了自己,那麼就需要外界的力量來幫助自己改變。

5、工作五六年,一般都進入中高級程序員的行列了,各種設計模式至少都要能夠掌握了解,對軟體架構要有自己的一些理解,對IT的整個技術生態要有所理解,並且在某一項有深入的研究。如何保持自己的IT視野呢,多去看看技術博客比如:博客園等,最近大家都在研究什麼技術,有什麼特點,自己心中有數,當項目有需要的時候至少要知道有這個東西可以讓你去選擇,可以適當的參加一些開源項目,學習編程中最核心底層的原理。

6、建議越早開通自己的技術博客越好,可以先在博客園、csdn之類的技術類網站去總結、分享,進一步的可以搭建自己的博客系統,在寫博客的過程中就是不斷的去總結、理解。要看書、看好書,看一本好書要低過看100本爛書,經典書籍永遠不會過時,好書傳輸的不僅是技巧更多是方法論,思維方式的轉變。

在我工作的這六年中,在我最痛苦的時候,也是我進步最快的時候,在工作給你壓力的時候,要想辦法去抗住,挺過來之後會是另一番景象。

以上僅是個人想法,僅做參考。

我特別喜歡一句話在這裡分享給大家:

我的代碼曾運行在幾千萬用戶的機器上,作為一個程序員,還有什麼比這更讓人滿足的呢?如果有,那就是讓這個用戶數量再擴大 10 倍。


別問,先上路。
然後不懂的問下面
↓↓↓↓↓↓↓↓
快搜 — 搜索快人一步
google搜索
GITHUB搜索 : https://github.com/AutumnsWindsGoodBye/Front-end-tutorial
(附:10個小竅門,讓你輕鬆準確搜索如何高效地使用搜索引擎? - 搜索引擎)

最後,只能幫你到這裡了。
↓↓↓↓↓↓↓↓↓↓↓↓
極客學院: http://www.jikexueyuan.com
麥子學院: 麥子學院 - 專業IT職業在線教育平台
計蒜客: 課程 - 計蒜客
伯樂在線: 伯樂在線
博學谷:博學谷視頻庫-免費提供java視頻,大數據視頻,web前端視頻,php視頻,C/C++視頻,iOS視頻,網頁設計視頻,平面設計視頻,UI設計視頻,遊戲開發視頻,網路營銷視頻
CSDN知識庫: 知識庫 - 你身邊的技術百科全書
GitBook: GitBook · Writing made easy
看雲文檔: 看雲 | 專註技術文檔在線創作、閱讀、分享和託管
博客園:博客園 - 開發者的網上家園
簡書程序員專題:程序員 - 專題
慕課網: 慕課網(IMOOC)-國內最大的IT技能學習平台
廖雪峰:Home - 廖雪峰的官方網站
Git:GitHub - nicejade/Front-end-tutorial: 最全的資源教程
菜鳥教程:菜鳥教程 - 學的不僅是技術,更是夢想!
在線工具:在線工具 - aTool
匯智網:匯智網 - 最前沿的在線互動編程學習平台
實驗樓:實驗樓 - 國內領先的IT技術實訓平台
SegmentFault:SegmentFault
V2EX:V2EX
易白:易百教程 - 專註於IT教程和實例


學習編程的最佳路徑其實很簡單,把編程看成一個愛好,而不是一份工作。


工作有期限,有壓力,有指標,有需求,有環境,這些都無法自己決定,只會把人限制在框子里。


而愛好不會,你可以選擇最酷的語言,做自己最想做的工具,解決自己的問題,最美好的是,這些出於你自願,而不是指揮,這個時候,人的主觀意志和客觀規律才高度統一。


你才理解什麼是真正的捷徑,捷徑tmd到底有多快。


這也是所有學科速成的方式,按需學習,針對問題,學習解決方案。


提這種面很大的問題基本就是在找虐,畢竟一千個人就有一千個哈姆雷特。

說入門應該學Python而不是C/C++?

說千萬不要讀譚浩強的書?

說看視頻報培訓班就是浪費時間和金錢?

說要用VIM而捨棄IDE?

……

為什麼入門要是Python,簡單易上手?那為什麼不學Scratch,它更簡單;

為什麼不讀老譚的書,有錯且啰嗦?然而多少大牛當年讀的第一本書就是老譚的;

為什麼就覺得書一定比視頻教程好,更原汁原味?但並不是每個人吃刺生都可以不蘸芥末醬;

為什麼不用IDE,鍵盤才應該是程序員的標配?初學者連筆和紙都還沒丟掉,你和我談滑鼠慢?

……

以上解釋有詭辯成分,較真者請自動忽略

之所以詭辯,不是我不贊同各位答主的回答,只是機智的人多了,題主就更懵了。就像當年向學霸們請教如何學好英語,學霸A說堅持用英語寫日記,學霸B說每天睡前讀國外小說原著,學霸C說每天堅持背30個單詞……有多少人和我一樣家裡現在還扔著幾乎全新的《Pride and Prejudice》。和學習大多知識一樣,學編程也並沒有太多的捷徑,每個人的學習習慣也不一樣,單純的去討論什麼語言入門更好、是自學還是報培訓班等問題原本意義就不大,有些坑,是初學者註定要經歷的。

即便如此,有些在編程學習中的公理(就是問100個人,100個人都會同意的理論)還是值得題主借鑒的:

  • 保持熱情(這詞兒是抄襲的頂樓答主)

如果你正在大學接受C語言學習的「高等教育」,然而你所能用C做的就是算題、排序、列印菱形……
甚至你認為C語言就只能在那個黑框下做諸如此類的事。那這是個危險的信號,你或許即將喪失學習它的熱情。推薦一個網站:香蕉地--C語言入門了離學會編程還遠嗎?

  • 請動手敲代碼

編程是在電腦上,不是在你的書本上,所以重要的話要說三遍

請動手敲代碼!

請動手敲代碼!

請動手敲代碼!

加上小標題,我居然說了四遍……

  • 學編程不僅僅是學一門語言

學習爬蟲,可能你還得了解下什麼叫Cookie;學習machine learning,可能你還會複習下如何求偏導;學習IOS遊戲開發,可能你還得熟悉下蘋果的IAP規則……

哪怕你給自己的定義只是個low到不行的碼農,開發環境如何搭建?資料庫如何配置?程序出了Bug如何調試?……

不要以為你沒在壘代碼的時間就被浪費了,這可都是修行。


一、 編程不難

我不覺得……編程是什麼神秘的、高難度的東西。

比如,咱們來輸出一句最簡單的:

&>&>&> Hello, world!

這就是編程。

程序程序,不過是有序的過程,讓一些事按照流程來做,不就是程序么?

每個人的日常生活都有編程思想、行為,只不過不察覺到罷了。

你要自己做豆漿,你就要分步:

1.準備豆子、糖等原材料,這就是聲明。

2.調用豆漿機的方法(榨汁),這就是調用某個方法,或者這系列的過程都自己做。

3.倒出豆漿,也就是……獲得返回值。

這三步,也可以再被你打包成一個方法「做豆漿」,然後你就成了豆漿工人。以後別人叫你做豆漿,就沒必要詳細說出做豆漿的步驟,只要跟你說「做豆漿」三個字就夠了。

還有一系列的行為,都是程序。升國旗不也是?

還有……哈?

學習編程重要的就是把這些提煉方法的能力進一步提升,並且找到更好的方法。比如一些重複做的事情,交給循環,一些可以打包的方法,交給函數,諸如此類。

不過重要的是——找到比較容易入門(但是難於成為大師的)的語言,比如別人推薦Python,我推薦……Javascript。

不過現在,為了簡(zhuang)單(bi),我決定實現一門簡單的編程語言,由於是用C#實現的,所以決定叫……嗯也不知道叫什麼好,就先叫CXSCript吧。目的是讓沒有編程經驗的人也能看懂表達的意思。


二、計算機的世界與你的世界

其實計算機就像一個外星人,跟我們語言不通。——畢竟人家吃的是電,講的是高低電平的簡單語言,而我們吃的是飯,講的是各種複雜的語言。可是我們需要它幫我們完成一些任務,此時就不得不對它下命令,用一些比較固定的指令,比如「打開一個叫『數學作業』的文件,寫入10個數字,然後保存這個文件」這樣一系列的命令。這些指令如果可以讓電腦運行起來,就可以統稱為程序。

當然了,上面的那些指令,依舊是只有我們看得懂的,所以計算機是需要一個翻譯官的,這個翻譯官負責把上面的指令翻譯為諸如「01010111」之類的電碼,此時計算機就明白了我們的意思。

世界上存在著各種各樣的編程語言,比如C、C++、Java、Python等語言,就如同各個國家會使用多種語言一般,所以需要的「翻譯官」也大不相同,但是相同的點有兩個:一個是他們只會聽懂一定格式的話,(比如他們聽得懂『開機』,卻聽不懂『幫我打開電腦』);另一個是他們翻譯的結果都是能讓電腦讀懂的機器碼。

要想讓你的外星人工作,首先你就要學好一門編程語言,然後找到一個翻譯官,讓他幫你完成中間的工作,你只需要負責想好你的命令,那就行了。我們現在用的是自製的CXScript,負責翻譯我們的語句,然後交由計算機執行。


三、試試編程

首先,你需要一個記事本,然後下載對應的翻譯器。我們現在暫命名翻譯器為SyntaxAnalyzer,就一個文件:

(運行環境要求:系統需要安裝了.NetFramework 4.0)

然後呢?新建一個文件,然後寫入代碼:

&>&>&> Hello world!

嗯,你猜得沒錯,三個">"連續寫,代表輸出,是不是很直觀?

然後,把你的文本文件拖動到軟體上,對,拖動到SyntaxAnalyzer上:

這樣即可將代碼交給翻譯官,然後就可以看到結果了:

是不是很簡單!

好了,第一節課結束了……後面也不會有第二節課,這個要靠你們了。

不過裝逼裝到底,咱們還是得把多幾句的代碼秀出來:

運行效果:

最後附上代碼運行軟體下載地址:

http://git.oschina.net/dragengt/syntaxanalyzer/attach_files

後面有可能再宣布教程吧,現在還在慢慢爬。


如果喜歡我的風格,可以先……看看公眾號等個幾天?那裡會是首發喲?


從非程序員的角度回答一下。

請問「如何學習英語?」。「英語」,"編程「,都是死的。思想才是活的。諾貝爾文學獎向來是頒給偉大的思想的,而不是沒有意義的修辭。編程是向各種抽象計算機器交談的抽象工具,學會」I am; he is; you are「只是小學生的事情,你的最終目的是要學會寫詩。Quake-III代碼里神奇的浮點開方函數

有朋友在一個12人初創遊戲公司當策劃,他表示公司中6個程序員主要是中專畢業,程序質量差,適應能力差。竊以為中專的編程教育應該是猛敲鍵盤為主,理論教育稀疏,如果以這樣的「編程水準」來做一名職業的程序員,職業前景並不樂觀。

我在美國的一個初創軟體公司實習過,100人的規模。公司的CTO曾經靠籃球專長上了個社區大學,非計算機專業,輟學後經商多年,失敗。在岳父幫助下,他做了電話接線員,軟體公司的電話接線員,任務就是把客戶的疑問記下交給程序員。他暗自學習編程,若干年後,他可以直接回答客戶的問題了,甚至比正牌程序員水平還高。公司很器重他,派他去某編程研討會。他在大會上侃侃而談,卻被別人暗地嘲笑。原來與會者大多是phd,而他呢,其實根本連問題本身都沒理解。從此他開始惡補理論知識,即便他現在已在多家公司擔任過CTO,他依然堅持每天4點起床,看兩個小時的書。當時他表示他在跟進斯坦福的機器學習課程。

好,既然思想最重要,工具只是輔助,那你首先要清楚你腦袋裡要裝哪種偉大閃爍的思想,然後選擇適合你的工具。這其實暗示了,學習的每一個小階段需要一個具體的目標帶給你激勵。比如,」今天我一定要寫一個UDP client發送一個hello world。

思想 -&> 例舉工具
--------------------------------------
嵌入式,架構,網路等 -&> C
計算機視覺,機器學習 -&> Matlab, Python
計算機圖形學 -&> C++
計算生物 -&> perl
網站後端 -&> perl, python, ruby, php, scala
編程語言 -&> haskell
軟體分析 -&> java,C++

當然,我估計樓主想當個偉大的碼農!那麼,路線圖應該是:
先大致學個java或python,能實現簡單演算法就行,別糾結什麼繼承啊,函數式編程之類的,沒有上手實際經驗很難吃透。一定要在linux下學習,通過命令行來編譯,這是肺腑之言。(推薦鳥哥的通俗入門教程)然後去http://leetcode.com刷演算法題,做到熟練。到了這一步,樓主自己應該有自己的想法如何繼續發展了。


1、先選一種自己喜歡的語言(C,C++,Java,Python等等)
2、買一本關於這種語言入門的書,一開始不要看太難的,循序漸進,先看一遍。
3、多練基礎代碼,將各種語句練得非常熟練,可以選一些計算機語言初等練習題做做。
4、再重頭到尾好好看一遍,哪裡不懂,可以與他人交流。
5、多看看別人用這種語言寫的程序,借鑒編程方法,對自己錯誤的思想進行校正。
6、多多練習,每天都打一些代碼,畢竟熟能生巧!


如果你想成為高手,請學習C語言,請重視數據結構,請研究Unix,請不要喪失激情,請一定要堅持!!!


推薦閱讀:

在遊戲公司的音頻部門(音樂/音效/配音)工作是一種怎樣的體驗?
崔瑾是誰?
如何成為像泳濕小狗劉念這樣的男人?
德州撲克打得好是一種什麼體驗?
被自己美到是一種什麼樣的體驗?

TAG:如何學習 X | 編程 | 計算機 | 入門指南 |