編程漫談(二十):如何自學編程及Java、上手真實開發及轉行程序員的建議
前路漫漫,吾將上下而求索!
最近有時在知乎上逛逛,發現很多人對自學編程及轉行程序員有困惑。我是在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 即可,然後在瀏覽器敲入 “//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 即可,然後在瀏覽器敲入 “//localhost:8080/” ;項目地址:「ALLIN」 ;
- 時常膜拜一下大神: 《Coders at Work》。
真實戰場
- 你已經找到一份程序員工作,進入了真實戰場;
- 做好分配給你的事情,做好接手的系統,同時,閱讀各類技術書籍,讓自己技術能力更加豐實;
- 廣泛閱讀各種編程相關書籍,這裡有我讀過的書,可以參考: 「計算機專業及軟件開發推薦書籍」 ;
- 閱讀源碼,對你所用到的技術,探究其實現原理;
- 原理和設計思想是最最最精髓的東西。實用技術雖必不可少,卻不可沉迷其中。切勿買櫝還珠!
- 閱讀 JDK 源碼,閱讀小型框架源碼;
- 及早考一個教師資格證,給自己留條後路(我沒有考慮到)。
一兩年後
- 深入理解業務、從產品角度思考,能夠讓你有更寬闊的視野和更快的成長速度(我當時沒意識到);
- 不要懟產品,不要懟測試,不要懟運維,不要懟來懟去懟到沒朋友(血的教訓);
- 做事要嚴謹,對人要寬容;兩者不可偏廢(我只做到了前者,後者做的不夠好);
- 開始寫技術博客;你會發現,三五年後,只有博客上記錄的東西還能記得(有益經驗);
- 制訂技術研習計劃,比如工作中用到的技術的原理,或者新技術,每周或每月寫一篇技術博客(有計劃但我沒能堅持);
- 了解軟件開發攻略:「軟件開發的升級打怪攻略:從新手到高級工程師」
- 深入學習軟件設計與開發:這是我關於軟件設計與開發的思考:「軟件設計要素初探」
- 當你要跳槽時,不要衝動;先多徵求意見,明確意願,找到下家後再辭職(我辭職時不知道這個套路)。
三年後
- 構建自己的技術體系結構,持續豐富這個體系結構(如今我才開始做這個事情,有些晚);
- 這是我最近構建的一個技術體系結構: 「互聯網應用服務端的常用技術思想與機制綱要」 ;
- 努力尋找中大型項目和中大型系統實操的機遇,並提升自己的綜合能力(我沒有這個主動意識,才有此勸誡);
- 敲重點: 踏實做事,但不要埋頭寫代碼!不要埋頭寫代碼!不要埋頭寫代碼!(我埋頭做事,才有此勸誡);
- 試着去錄製一些編程開發視頻,拓展自己的技能樹(我不知道還能這麼玩)。
此去經年
- 你已經是初中級工程師了,悟空也從菩提祖師那裡畢業了;
- 身邊的每一個人都可能是你的導師,欣賞和學習每個人的長處;
- 拓展你的技能樹,學會從一切可能的地方學習;
- 多交往,拓展自己的活動區域(我偶然參加了TMC演講,還是有益的)。