1. 程式人生 > >程式設計漫談(二十):如何自學程式設計及Java、上手真實開發及轉行程式設計師的建議

程式設計漫談(二十):如何自學程式設計及Java、上手真實開發及轉行程式設計師的建議

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