編程漫談(二十):如何自學編程及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 項目階段通關成功!

踏上征程

真實戰場

  • 你已經找到一份程序員工作,進入了真實戰場;
  • 做好分配給你的事情,做好接手的系統,同時,閱讀各類技術書籍,讓自己技術能力更加豐實;
  • 廣泛閱讀各種編程相關書籍,這裡有我讀過的書,可以參考: 「計算機專業及軟件開發推薦書籍」
  • 閱讀源碼,對你所用到的技術,探究其實現原理;
  • 原理和設計思想是最最最精髓的東西。實用技術雖必不可少,卻不可沉迷其中。切勿買櫝還珠!
  • 閱讀 JDK 源碼,閱讀小型框架源碼;
  • 及早考一個教師資格證,給自己留條後路(我沒有考慮到)。

一兩年後

  • 深入理解業務、從產品角度思考,能夠讓你有更寬闊的視野和更快的成長速度(我當時沒意識到);
  • 不要懟產品,不要懟測試,不要懟運維,不要懟來懟去懟到沒朋友(血的教訓);
  • 做事要嚴謹,對人要寬容;兩者不可偏廢(我只做到了前者,後者做的不夠好);
  • 開始寫技術博客;你會發現,三五年後,只有博客上記錄的東西還能記得(有益經驗);
  • 制訂技術研習計劃,比如工作中用到的技術的原理,或者新技術,每周或每月寫一篇技術博客(有計劃但我沒能堅持);
  • 了解軟件開發攻略:「軟件開發的升級打怪攻略:從新手到高級工程師」
  • 深入學習軟件設計與開發:這是我關於軟件設計與開發的思考:「軟件設計要素初探」
  • 當你要跳槽時,不要衝動;先多徵求意見,明確意願,找到下家後再辭職(我辭職時不知道這個套路)。

三年後

  • 構建自己的技術體系結構,持續豐富這個體系結構(如今我才開始做這個事情,有些晚);
  • 這是我最近構建的一個技術體系結構: 「互聯網應用服務端的常用技術思想與機制綱要」
  • 努力尋找中大型項目和中大型系統實操的機遇,並提升自己的綜合能力(我沒有這個主動意識,才有此勸誡);
  • 敲重點: 踏實做事,但不要埋頭寫代碼!不要埋頭寫代碼!不要埋頭寫代碼!(我埋頭做事,才有此勸誡);
  • 試着去錄製一些編程開發視頻,拓展自己的技能樹(我不知道還能這麼玩)。

此去經年

  • 你已經是初中級工程師了,悟空也從菩提祖師那裡畢業了;
  • 身邊的每一個人都可能是你的導師,欣賞和學習每個人的長處;
  • 拓展你的技能樹,學會從一切可能的地方學習;
  • 多交往,拓展自己的活動區域(我偶然參加了TMC演講,還是有益的)。