前路漫漫,吾將上下而求索!
最近有時在知乎上逛逛,發現很多人對自學程式設計及轉行程式設計師有困惑。我是在25歲讀研時轉程式設計師,正趕上好時候(中國雲端計算剛剛起步及移動網際網路正紅的階段),同時又走了不少彎路,因此,基於自己的開發經歷及思考認識(目前有八年 Java 開發經驗),希望能夠給後來者一些建議和參考。
本文主要面向程式設計初學者、大學生、初中級工程師(三年以下)。
為什麼要學程式設計
-
程式設計能夠有力地鍛鍊人的邏輯思維能力,而邏輯思考是理性思考和決策的必要件,也是思考任何問題所不可或缺的基本思維能力;
-
程式設計是一項集設計、發明、創造、表達於一體的很有樂趣很有挑戰的職業,如果你樂於鑽研事物原理、創造新事物,那就是你沒錯了!無論別人怎麼看,我個人還是很喜歡程式設計的!
-
做軟體開發的薪水相對較高,因為有一定門檻,需要耐心、時間、理解字元、理解邏輯,很多人可能都沒法忍受天天跟字元打交道,很難忍受除錯程式的枯燥(程式報錯可能僅僅是一個字元沒寫或寫錯了,看到眼瞎),很難忍受軟體的複雜性(現代軟體通常基於大量框架、庫、中介軟體的聚合體,出了底層問題排查會很困難異常耗時);
-
在知識經濟時代,在資訊化智慧化越來越深入的時代,不懂程式設計,就像在現代文明社會裡不識字一樣。
何時學習程式設計
作為興趣
只是對程式設計感興趣,希望學會一門新技能。任何時候都不晚,哪怕 60 歲開始都沒問題。
程式設計作為輔助技能
工作中用到,但非軟體開發職業,程式設計只是作為輔助技能。比如科學家、資料分析師、產業程式設計等。年輕的時候加入為宜。
轉行程式設計師
需要慎重考慮:
- 網際網路是一個適合彎道超車的行業, 也是對年輕人友好的行業;
- 國內網際網路企業還是比較看重年齡的,如果年齡較高,又沒有特別的建樹(管理團隊經驗、技術牛等),就會比較被動;
- 做程式設計師有年齡紅利。年齡越早,享受越多的紅利;越晚加入,紅利越少;
- 做程式設計師是一個可積累性不佳的職業。即使你有很豐富的經驗,那些優秀應屆生只要有紮實的專業基礎,又善於學習和借用 Github 上的程式碼,善於學習新技術,是可以快速成長為後起之秀的;
- 程式設計師職業,是以個人的犧牲換來了行業的快速發展,以個人的可積累性差換來了行業的強積累性;
- 做程式設計師需要善於學習,這是最重要的能力之一;
- 做程式設計師需要思維縝密周全,能夠考慮各種錯誤和異常情況,考慮可擴充套件性及很多質量指標,不然,寫出的程式可能會漏洞百出,或者難以修改和擴充套件;
- 所謂的經驗豐富,是指實操大型專案的經驗,實操具有特殊性專案的經驗,這種機遇非常難得;中小型專案開發不叫經驗,因為誰都能經歷。
如何自學程式設計
如果雷神都擋不住你要學習程式設計的決心和信念,那就開始吧!
學習程式語言
- 學習程式語言,幾乎不需要任何必要件,3-5 歲小孩都能學會,汝何以懼之?
- 選擇一門語言,比如 Java 或 Python ;
- 找一本好的程式設計書籍,在豆瓣上搜下 Java 或 Python ,選評分最高或次高的即可;
- 在尋找程式設計書籍時最好找兩本,一本國內人寫的,一個國外人寫的;國內淺顯,國外深入;
- 我傾向於學習國外人寫的技術書籍,能教會有益的思考方式;在看不懂的時候,再找本國內的看看;
- 《C程式設計語言》 :即使你不打算學 C ,這本書也是講述程式語言的經典之作;
- 找一個相關的程式語言視訊,邊做邊看;
- 程式設計重在實踐,不寫程式碼是學不會的;
- 如果你正好有位朋友做程式設計師,可不定期請教,有個師傅引領程式設計是很好的;
- 學好英語,否則你能學到的程式設計知識永遠是二手的甚至是 N 手的!
- 學會使用 word, excel, ppt 等辦公處理軟體;
- 這一階段重點在學會程式設計的基本思想,能獨立寫出一個單詞解析程式,就是通關成功!
程式設計初步進階
-
在學會一門程式語言之後,需要學習資料結構、演算法、資料庫、網路、作業系統 ;
-
尤其要打好資料結構和演算法基礎,好比程式設計的武器裝備加成(子彈和炮彈)。如果缺乏資料結構和演算法基礎,就好比拿著刀劍上戰場,還沒走兩步,就被一發炮彈轟上了天 ;
-
作業系統是基礎課。要能運用作業系統提供的能力,寫出更實用的程式,就不能不懂作業系統 ;
-
資料庫是儲存和操作大量資料的技術,實際專案開發中必備的基本功 ;
-
網路是網際網路技術的基礎,不可不知,至少要理解基本原理及協議 ;
-
學習順序:資料結構及演算法 => 作業系統 => 資料庫 => 網路 ;
-
資料結構書籍: 《資料結構與演算法分析》 ;
-
演算法書籍: 《演算法設計與分析基礎》 , 《演算法(第4版)》, 《演算法導論》(可挑戰);
-
網路書籍:《計算機網路》 ,《TCP/IP詳解 卷1:協議》 (進階);
-
演算法刷題:當你具備一定的資料結構和演算法基礎,能夠編寫程式時,推薦到 “力扣網” 刷刷題,進行更深入的演算法實踐(有充足時間或擠出時間)。我到 2020 年才知道力扣的存在;
-
當你能夠比較靈活使用資料結構和演算法,能夠理解作業系統的原理並呼叫系統函式,設計比較規範的資料庫表,代表程式設計初步進階通關成功!
Web專案
-
當你具備資料結構、演算法基礎和資料庫設計的基礎時,就可以開始嘗試做 Web 專案了,正式踏入開發征程;
-
基本技術棧:後端(SpringMVC, MyBatis) + 前端 ( Javascript , jQuery ) ,可以暫時先不管底層原理,先做起來;
-
工程模板:這裡有一個 Springboot 模板工程,含有一個真實專案商品交易快照專案的程式碼例項,你可以學習真實專案中軟體是怎樣子的,也可以在裡面做更多的嘗試和探索。要執行這個專案,執行 Application.java 即可,然後在瀏覽器敲入 "http://localhost:8080/" ;專案地址: “springboot-template” ;
-
如何從 Github 拉取工程程式碼,見: “使用git和github託管個人專案”;
-
學習基本的 git 命令: git clone, git add , git commit , git push , git merge ;
-
程式語言進階,比如 “Effective java 中文版(第2版)” ;
-
原始碼閱讀: 此時,你應當開始學習閱讀原始碼。可以先閱讀一些簡單的類,比如 JDK 容器。為什麼要閱讀原始碼及基本技巧,可參閱 “解鎖優秀原始碼的基本方法與技巧” ;
-
程式除錯:在開發專案時,程式除錯必不可少,最簡單的打斷點、單步除錯得學會。程式除錯技能可參閱 “軟體除錯的基本技巧” ;
-
單測編寫:學習編寫單測,讓程式碼更加可靠,《單元測試之道Java版:使用JUnit 》
-
程式風格:學習編寫好的程式必不可少。面試找工作非常看重這一點。可參閱 《Java程式設計風格》 , 《編寫可讀程式碼的藝術》, 《程式碼整潔之道》 ;
-
當你能夠運用資料結構、演算法、資料庫做出一個簡單的 CRUD 管理系統時,能夠編寫比較規範的程式碼時,Web 專案階段通關成功!
踏上征程
- 你已經能夠做出一個基本的軟體管理系統了,此時,你意氣風發,將要向更廣闊的軟體開發征程出發!
- 必備網站: “Github” (學習和尋找元件實現時), “StackOverflow” (提問題找答案);
- 學習 《深入理解計算機系統》 ;
- 學習 Java 併發:《Java併發程式設計實戰》 ;
- 學習 Java 記憶體模型及JVM原理: 《深入理解Java虛擬機器(第2版)》 ;
- 學習軟體設計原則和思想,理解大型軟體如何構建: “【轉載】一些軟體設計原則”
- 學習設計模式,理解框架原始碼必備:《深入淺出設計模式(影印版)》 , 《設計模式》 ;
- 學習架構初步:《架構整潔之道》 ;
- 深入瞭解軟體開發職業: “軟體開發全景圖”, “軟體開發思考” ;
- ALLIN:是我在學習和開發生涯中所積累的各種東西,包括資料結構、演算法、設計模式、單測、具體技術等。要執行這個專案,執行 Application.java 即可,然後在瀏覽器敲入 "http://localhost:8080/" ;專案地址:“ALLIN” ;
- 時常膜拜一下大神: 《Coders at Work》。
真實戰場
- 你已經找到一份程式設計師工作,進入了真實戰場;
- 做好分配給你的事情,做好接手的系統,同時,閱讀各類技術書籍,讓自己技術能力更加豐實;
- 廣泛閱讀各種程式設計相關書籍,這裡有我讀過的書,可以參考: “計算機專業及軟體開發推薦書籍” ;
- 閱讀原始碼,對你所用到的技術,探究其實現原理;
- 原理和設計思想是最最最精髓的東西。實用技術雖必不可少,卻不可沉迷其中。切勿買櫝還珠!
- 閱讀 JDK 原始碼,閱讀小型框架原始碼;
- 及早考一個教師資格證,給自己留條後路(我沒有考慮到)。
一兩年後
- 深入理解業務、從產品角度思考,能夠讓你有更寬闊的視野和更快的成長速度(我當時沒意識到);
- 不要懟產品,不要懟測試,不要懟運維,不要懟來懟去懟到沒朋友(血的教訓);
- 做事要嚴謹,對人要寬容;兩者不可偏廢(我只做到了前者,後者做的不夠好);
- 開始寫技術部落格;你會發現,三五年後,只有部落格上記錄的東西還能記得(有益經驗);
- 制訂技術研習計劃,比如工作中用到的技術的原理,或者新技術,每週或每月寫一篇技術部落格(有計劃但我沒能堅持);
- 瞭解軟體開發攻略:“軟體開發的升級打怪攻略:從新手到高階工程師”
- 深入學習軟體設計與開發:這是我關於軟體設計與開發的思考:“軟體設計要素初探”
- 當你要跳槽時,不要衝動;先多徵求意見,明確意願,找到下家後再辭職(我辭職時不知道這個套路)。
三年後
- 構建自己的技術體系結構,持續豐富這個體系結構(如今我才開始做這個事情,有些晚);
- 這是我最近構建的一個技術體系結構: “網際網路應用服務端的常用技術思想與機制綱要” ;
- 努力尋找中大型專案和中大型系統實操的機遇,並提升自己的綜合能力(我沒有這個主動意識,才有此勸誡);
- 敲重點: 踏實做事,但不要埋頭寫程式碼!不要埋頭寫程式碼!不要埋頭寫程式碼!(我埋頭做事,才有此勸誡);
- 試著去錄製一些程式設計開發視訊,擴充自己的技能樹(我不知道還能這麼玩)。
此去經年
- 你已經是初中級工程師了,悟空也從菩提祖師那裡畢業了;
- 身邊的每一個人都可能是你的導師,欣賞和學習每個人的長處;
- 擴充你的技能樹,學會從一切可能的地方學習;
- 多交往,擴充自己的活動區域(我偶然參加了TMC演講,還是有益的)。