剛實(shí)習(xí)那會,二哥差點(diǎn)被辭退!
大家好,我是二哥呀!
奇怪啊,最近好多同學(xué)來問我,“二哥,偽大一,新手小白,我該怎么提高編程能力呢?”
我只想說,假期不好好玩,凈想著學(xué)習(xí)??!
其實(shí)很多初學(xué)者在學(xué)習(xí)編程的時(shí)候都會遇到困難,我也不例外,我想原因可能是一開始根本沒搞明白學(xué)編程到底是學(xué)什么吧。
說實(shí)話,真的是,我上大一的時(shí)候是調(diào)劑到計(jì)算機(jī)網(wǎng)絡(luò)專業(yè)的,懵逼得很。
話說,這年頭還有人被調(diào)劑到計(jì)算機(jī)專業(yè)?
只能說,我們學(xué)校當(dāng)年(13 年前)太沒有遠(yuǎn)見卓識了,竟然把計(jì)算機(jī)專業(yè)當(dāng)做是備選項(xiàng),這等好事竟然被我碰上了。
其實(shí),我上大學(xué)那會,不管錄取的是哪個(gè)專業(yè),都是懵逼的,如果錄取的是機(jī)械自動化,也是懵逼的,那會知道個(gè)啥呀。
視野完全沒打開,覺悟更是沒有。
從小到大的學(xué)習(xí),都是在學(xué)習(xí)課本上知識(沒講過計(jì)算機(jī))。上課前稍微預(yù)習(xí)下,上課的時(shí)候就聽老師講,下課就做做作業(yè),然后是復(fù)習(xí)考試。
如果上課的時(shí)候不專業(yè)聽講,其他全部抓瞎,作業(yè)不會做,考試也一樣。
然而,十多年的編程經(jīng)驗(yàn)告訴我,編程不是知識,只看只聽根本就學(xué)不會。只靠上課的時(shí)候聽老師念 PPT,或者上網(wǎng)課看視頻教程,就只能是上完課就忘,真正自己動手敲代碼的時(shí)候,完全沒有思路。
為什么會這樣?
我們得搞清楚,計(jì)算機(jī)科學(xué)是知識。
比如說 CPU,全名叫中央處理器(Central Processing Unit),是計(jì)算機(jī)最重要的核心組件,計(jì)算機(jī)的所有“計(jì)算”都由 CPU 來完成。
CPU 的內(nèi)部由成萬上億個(gè)晶體管構(gòu)成,從功能上劃分的話,CPU 可以分為寄存器、控制器、運(yùn)算器和時(shí)鐘,各個(gè)部分通過電流進(jìn)行連接。
寄存器用來暫存指令和數(shù)據(jù); 控制器負(fù)責(zé)把內(nèi)存上的指令和數(shù)據(jù)讀入寄存器,并根據(jù)指令的執(zhí)行結(jié)果來控制計(jì)算機(jī); 運(yùn)算器負(fù)責(zé)對寄存器中的數(shù)據(jù)進(jìn)行計(jì)算; 時(shí)鐘用來發(fā)出時(shí)鐘信號,時(shí)鐘信號的頻率越高,CPU 的運(yùn)算速度就越快,因?yàn)樵谝粋€(gè)時(shí)鐘周期內(nèi),CPU 只能完成一個(gè)基本的動作,所以很長一段時(shí)間內(nèi),我們評斷一臺計(jì)算機(jī)性能好壞看的就是 CPU 的主頻高低。
你看,這是知識。
編程是知識嗎?我認(rèn)為是手藝活,唯手熟爾。
看是看不會的,必須得練。
這里講點(diǎn)怪不好意思講的話,我上大學(xué)那會,確實(shí)沒怎么學(xué),整天就抱著筆記本電腦打游戲,極品飛車、忍者神龜、NBA 2006、三國群英傳等等單機(jī)游戲,是我的最愛,因?yàn)椴恍枰词炙?,我這個(gè)游戲黑洞還可以應(yīng)付。
以至于參加工作那會,慌的一筆,一開始總怕因?yàn)槟芰Σ环粍裢肆恕?/p>
剛進(jìn)公司實(shí)習(xí)那會,就經(jīng)歷了三次筆試摸底,第三次考完后,領(lǐng)導(dǎo)直接找我談話了,說我題沒作對幾道,當(dāng)時(shí)嚇得我,晚上一個(gè)人躲在被窩里偷偷抹眼淚。
心想這次真完蛋了,萬一被辭退,回到學(xué)校,簡直丟人!
第二天,領(lǐng)導(dǎo)和領(lǐng)導(dǎo)的領(lǐng)導(dǎo),當(dāng)著我(戰(zhàn)戰(zhàn)兢兢)的面,拿著試卷,談?wù)撐业娜チ魡栴}。說實(shí)話,經(jīng)過一夜的折磨,我已經(jīng)不抱任何希望了。
看到最后一題,領(lǐng)導(dǎo)的領(lǐng)導(dǎo)說,“老潘(我領(lǐng)導(dǎo)),你看,小王這道題的答案在背面啊,你怎么沒注意看?”
“哦,我看看,我以為他沒答呢?!鳖I(lǐng)導(dǎo)說。
“嗯,這道題答對了,你回座位上吧,可以留下?!贝蟾?20 秒后,領(lǐng)導(dǎo)說了這句話,并看了我一眼,示意我離開。
臥槽,20 秒的時(shí)間,我感覺特別煎熬,仿佛命運(yùn)的咽喉被摁住了一般。
就這樣,我灰溜溜地回到了座位上,心里一萬只草泥馬在崩騰。那個(gè)畫面至今印象深刻,終生難為。
后來,我就下了狠心,各種抄代碼,先讓自己成為一個(gè)能完成任務(wù)的人再說其他的。這事我之前也給大家提到過,真的是抄了大量的代碼,短時(shí)間內(nèi)成長特別快。
我這算是走的極端,就是完全拋開讀書學(xué)習(xí),當(dāng)時(shí)互聯(lián)網(wǎng)上的資源還比較匱乏,不像現(xiàn)在有 B 站、有慕課、網(wǎng)易云課堂等等,所以視頻教程也沒有。
動手練習(xí)的好處就是,攢了一大堆的小車輪,工作的時(shí)候,直接從自己的代碼庫里把輪子搬出來改改就可以了,基本上沒有遇到過解決不了的問題。即便是有,鉆到源碼里一看,問題就找到了。
練習(xí)一定要循序漸進(jìn),一開始不要啃太難的項(xiàng)目。
就從 Hello World 開始,然后是條件分支,循環(huán)語句,然后是字符串操作啊,集合框架的使用(涉及到排序、查找等基礎(chǔ)算法)啊;可以嘗試做個(gè)科學(xué)計(jì)算器,會用到堆這個(gè)數(shù)據(jù)結(jié)構(gòu)。
之后再練習(xí)網(wǎng)絡(luò)編程啊、Socket 通信啊,做個(gè)但客戶端和服務(wù)端的聊天室。
然后是 NIO、BIO、AIO,寫個(gè)文件操作的工具類?。话蚜奶焓业膬?nèi)容存到文件里呀;
再找個(gè) Netty 框架方面的項(xiàng)目練手下,如果你沒有研究過 Netty,那就算不上是一名合格的 Java 工程師。會了 Netty,就可以實(shí)現(xiàn)自己的 HTTP 服務(wù)器、FTP 服務(wù)器、RPC 服務(wù)器等等;很爽的;
接著是并發(fā)編程,并發(fā)編程是 Java 中的難點(diǎn),因?yàn)樗婕暗讲僮飨到y(tǒng)、內(nèi)存、CPU 等計(jì)算機(jī)專業(yè)比較核心的內(nèi)容,比較考驗(yàn)一個(gè)程序員的內(nèi)功。

練習(xí)并發(fā)編程最好的方式,就是聊天室升級到多對多的模式。
之后,就可以到 GitHub 上把 vhr、mall 這樣的練手項(xiàng)目拉下來練習(xí)了,學(xué)會如何使用 Spring、SpringMVC、MyBatis、Spring Boot 等開發(fā)框架,這期間,會涉及到 Swagger、Logback、MongoDB、ElasticSearch、Websocket 等等,學(xué)會了這些,你已經(jīng)是一個(gè)成熟的 CURD Boy 了!
堅(jiān)持做大量的練習(xí),可以用代碼行數(shù)來評估,少說的話,一年也得寫個(gè) 50000 行吧,有毅力的話可以挑戰(zhàn) 6 萬行、7 萬行等。
我說的這個(gè)代碼行數(shù),千萬不要以為是寫一萬行 Hello World 啊,這樣理解的話,那可真的是沒救了。
要寫有效的代碼,這是增強(qiáng)自己本領(lǐng)的,可不是拿來充績效的。
實(shí)踐出真知,練習(xí)出大牛。
當(dāng)然了,只練不讀經(jīng)典書的話,也會有一些問題的,比如說基礎(chǔ)不扎實(shí),一些計(jì)算機(jī)科學(xué)的理論知識容易被忽略,那么后期一定要補(bǔ)上。
我現(xiàn)在就是在補(bǔ),讀很多經(jīng)典的書,比如說 CSAPP,這里面也有很多例子要敲。
說到這,順帶再給你推薦一些練手項(xiàng)目吧,可以 fork 下改一改,即便是看一看源碼,也能提高代碼能力的。
Blade:基于 Java8 + Netty4 創(chuàng)造的輕量級、高性能、簡潔優(yōu)雅的 Web 框架:
https://github.com/lets-blade/blade
datastructure:用 Java 實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)以及算法練習(xí)。
https://github.com/buptdavid/datastructure
NettyRPC:基于Netty構(gòu)建的RPC系統(tǒng),消息網(wǎng)絡(luò)傳輸支持目前主流的編碼解碼器。
https://github.com/tang-jie/NettyRPC
靜下心來,別浮躁,不管你起點(diǎn)再低,只要自己肯下勁,學(xué)編程是最容易改變命運(yùn)的一個(gè)手藝活了。
嗯,比搬磚強(qiáng)??
