我是大學(xué)的時(shí)候才開始接觸編程的,不過我上的是一所三流的大學(xué),高三的時(shí)候,因?yàn)槲覀儼嗍侵攸c(diǎn)班,所以有一些復(fù)讀生也來我們班學(xué)習(xí),高三開始不久我就和一個(gè)高四的學(xué)姐談戀愛了,還是我的初戀,所以我高考就GG了...
偏題了,回來說說編程的事情吧,雖然說大學(xué)是個(gè)三流的學(xué)校,不過老師都是博士碩士級(jí)別的工程師,對(duì)于當(dāng)時(shí)的我會(huì)覺得他們好像很厲害的樣子,不過現(xiàn)在覺得有時(shí)候標(biāo)簽這種東西并不能說明什么吧。
那時(shí)候老師說「移動(dòng)應(yīng)用開發(fā)」會(huì)火,到時(shí)畢業(yè)一定可以找到工作,所以我就想著主攻「移動(dòng)應(yīng)用開發(fā)」,也就是 Android ,因?yàn)?Android 的應(yīng)用層是用 Java 寫的,所以一開始學(xué)的是「Java基礎(chǔ)」。
雖然說去上課,但是真正聽老師講課的人寥寥無(wú)幾,我也不例外,電腦前演示著老師講課的PPT,但是視線一直停留在自己手機(jī)里的美女上。
不過有一次老師講到一個(gè)「使用for循環(huán)打印星星的例子」,我覺得好好玩,這時(shí)候我才發(fā)現(xiàn)Java并非那么無(wú)聊,我可以通過代碼寫出打印多少顆星星,打印成正三角形的形狀,倒三角形的形狀,正方形形狀等等。第一次有了一種「有想法可以被Java實(shí)現(xiàn)的感覺」,從那天起開始對(duì)編程產(chǎn)生了興趣。
那一天雖然知道了「for循環(huán)」怎么寫(跟著老師的例子照貓畫虎),但是對(duì)于Java環(huán)境變量怎么配置,二進(jìn)制是什么,什么是Byte,Long都不懂,那時(shí)候可以說對(duì)于 Java 只知道怎么拼寫而已。
因?yàn)橛行┲R(shí)點(diǎn)之前沒認(rèn)真聽,也發(fā)覺老師講的很無(wú)聊,后來我決定自學(xué),自我驅(qū)動(dòng)的學(xué)習(xí)和被動(dòng)的學(xué)習(xí)是兩個(gè)完全不同的概念,我到現(xiàn)在依然認(rèn)為:真正牛逼的人,都是自學(xué)能力極強(qiáng)的人!
我開始上網(wǎng)查詢學(xué)習(xí)「Java基礎(chǔ)知識(shí)」的資料,無(wú)意間發(fā)現(xiàn)了某培訓(xùn)機(jī)構(gòu)(是哪個(gè)機(jī)構(gòu)就不說了,免得說我打廣告)有免費(fèi)的講課視頻資料,看了一下目錄發(fā)現(xiàn)很全面,于是我下載下來試著看一下,沒想到被講師的幽默講課方式深深吸引,感覺他不做相聲演員都可惜了,于是邊笑著看他的視頻,邊跟著他敲代碼,自己也做一些筆記。那段時(shí)間有時(shí)候逃課其實(shí)是在宿舍里看他的視頻哈哈!
那個(gè)視頻課時(shí)分為三十來天,不過我是除了跟著他敲代碼外,我還會(huì)自己做一些筆記,所以我大概花了兩個(gè)多月才把視頻學(xué)完的,也就這幾個(gè)月的時(shí)間我從如何打印Hello World,到常量,變量,注釋,運(yùn)算,邏輯語(yǔ)句,再到面向?qū)ο螅赡鼙容^笨,當(dāng)時(shí)想了好幾天才明白這一概念),數(shù)組,函數(shù),繼承,內(nèi)部類,多態(tài),GUI等,再到集合,多線程,IO流,反射等等有一個(gè)全面的了解了。
感覺自己把 Java 比較基礎(chǔ)的知識(shí)學(xué)的差不多了,就想著能不能做點(diǎn)好玩的東西出來,記得有一個(gè)情人節(jié),那時(shí)候我還是有女朋友的人,想給女朋友做一個(gè)程序,作為禮物送給她,有那么一個(gè)夜晚,我突然想到能不能用 Java 做一款小游戲,游戲的主角就是她呢?
想想還是有點(diǎn)激動(dòng)的,后來我模仿了「坦克游戲」,不過玩家的坦克是我女票的頭像,而很多敵方坦克就是我的頭像,然后子彈被我改成??(愛心子彈,害羞)。
用了幾天的時(shí)間把它做出來覺得好有成就感,最后我把這個(gè)游戲打成jar包送給我女票當(dāng)作禮物,然后看她玩的時(shí)候一直在互相發(fā)射愛心,不過敵方的“我”又多,射出的愛心子彈又快,每次玩不久她就“掛”了,老是叫我去修改一下游戲速度,讓她贏哈哈。不過現(xiàn)在的她已經(jīng)不屬于我了,哎,想想還是有點(diǎn)小傷感呢,我是不是又跑題了 - -
因?yàn)槲乙婚_始就知道我學(xué) Java基礎(chǔ) 是為了去開發(fā) Android 應(yīng)用,那時(shí)候覺得能在手機(jī)上把玩自己開發(fā)的 APP 是一種牛逼的存在。所以我又去找了一些「Android入門教程」的視頻來學(xué)習(xí),因?yàn)樽约河辛艘欢ǖ?Java基礎(chǔ)知識(shí) ,所以對(duì)「Android入門教程」視頻學(xué)起來倒不覺得很難,反而是想著快點(diǎn)學(xué)完然后做個(gè)有意思的APP出來,所以那時(shí)候?qū)ctivity,Service的生命周期、一些諸如TextView,EditView基礎(chǔ)的組件、諸如LinearLayout的容器組件、廣播、Intent、內(nèi)容提供者消費(fèi)者、Sqlite等基礎(chǔ)內(nèi)容都學(xué)的比較認(rèn)真。
慢慢的我開始寫了一些demo,但是發(fā)現(xiàn)很不滿意,原因是我感覺自己寫的東西很簡(jiǎn)單,幾個(gè)界面跳來跳去,幾個(gè)增刪改查,好像就沒什么了,感覺自己沒有什么項(xiàng)目經(jīng)驗(yàn),而且停留在很基礎(chǔ)的層面。
于是我上網(wǎng)去搜索一些Android相關(guān)的資料,發(fā)現(xiàn)了CSDN上的「郭霖」大佬,發(fā)現(xiàn)他寫的博客通俗易懂,那時(shí)候他每篇博客我都看,慢慢的我又認(rèn)識(shí)到了「老羅」,他寫的東西很深,有時(shí)候我看不懂 - -,發(fā)現(xiàn)了「阮一峰」的博客,再到后來我又發(fā)現(xiàn)在知乎上的 「stormzhang」, 我這才發(fā)現(xiàn)當(dāng)時(shí)自己有多l(xiāng)ow,這些大佬們經(jīng)驗(yàn)滿滿,我從他們身上學(xué)到了自定義View,性能優(yōu)化,網(wǎng)絡(luò)編程,第三方框架等等比較進(jìn)階的東西,不過更加讓我學(xué)習(xí)到的是他們的執(zhí)行力,他們的認(rèn)知,他們對(duì)信息的敏感。
舉個(gè)例子:記得 Android Studio 剛出來那會(huì),我只是覺得 Android Studio 應(yīng)該和 Eclipse 差不多吧,不就是個(gè)編輯器,而且Android Studio 剛出來的時(shí)候我下載體驗(yàn)了一下卡的要死,我二話不說就把它給卸載了,什么垃圾玩意。不過后來我發(fā)現(xiàn)大佬們都在用 Android Studio ,而且一直在建議更換為Android Studio,我記得之前大佬們還專門寫了Android Studio的教程。受他們的影響,我把Android Studio下載回來,隨著Android Studio的迭代,我才發(fā)現(xiàn)這編輯器簡(jiǎn)直了,這快捷鍵,這體驗(yàn),簡(jiǎn)直完爆 Eclipse。現(xiàn)在還看到有些人還用Eclipse開發(fā),沒用過Android Studio或者InteliJ IDEA,說實(shí)話,我面試到這樣的人一般會(huì)直接pass掉,并不是說Eclipse不好,而是認(rèn)為,如果不擁抱新的事物,總是固步自封,那么很快會(huì)被淘汰!
也是那個(gè)時(shí)候,我發(fā)現(xiàn)了原來還有一個(gè)叫做「GitHub」的東西,簡(jiǎn)直打開了新天地,上面有許多大牛分享代碼,聚集了全世界的程序員,嚇得我趕緊去學(xué)習(xí)了Git的操作命令,clone了幾個(gè)覺得適合我當(dāng)時(shí)學(xué)習(xí)的Android項(xiàng)目源碼!
后來和朋友參加軟件杯比賽,能寫出比較像樣的APP了,看著APP從想法到實(shí)現(xiàn),確實(shí)能帶來很多成就感,也許對(duì)別人來說并不完美,但是自己親手寫出來的,自己debug出來的APP,就是有不一樣的感覺,覺得像自己的孩子一樣哈哈!
在大學(xué)期間,自己用PS畫UI,使用第三方的接口,琢磨著做了幾個(gè)小眾的APP,后來將這些APP都裝在自己的手機(jī)上,面試的時(shí)候一邊演示一邊跟面試官吹吹牛逼,倒也拿了幾個(gè)實(shí)習(xí)offer。
后來自己選了初創(chuàng)公司,剛開始就讓我接手一個(gè)比較大的項(xiàng)目,功能挺多的,商品上下架,第三方支付,商家入駐,到后來甚至還做了附近的人,聊天約炮交友,抽獎(jiǎng)等功能,我和另一個(gè)小伙伴負(fù)責(zé)這個(gè)項(xiàng)目的Android端,雖然期間遇到了許多問題,如代碼混淆打包閃退,不同手機(jī)兼容適配,支付配置不正確等等,也曾懷疑自己是不是能行過,但還是一一解決了,前前后后花了快一年時(shí)間也在應(yīng)用市場(chǎng)上架了好幾版,不過用戶寥寥,可能你應(yīng)該想到了,產(chǎn)品還沒運(yùn)營(yíng),就夭折了。現(xiàn)在回頭想想,產(chǎn)品思維確實(shí)重要。
接著也做了幾款別的APP,表現(xiàn)也是平平 - -
可能因?yàn)楸憩F(xiàn)的還行,后來老大說有個(gè)公眾號(hào)的小項(xiàng)目,后端讓我來搞怎么樣,當(dāng)時(shí)自己也發(fā)現(xiàn)原生APP的開發(fā)趨勢(shì)下降了,H5 越來越火,然后跟老大說給我三天熟悉一下 Java 后端的,他說沒問題,沒想到這一決定讓我開始轉(zhuǎn)向后端開發(fā)了...
其實(shí)這三天主要研究了下 JSP , Servlet ,還看了點(diǎn) struts2 框架,然后也算按計(jì)劃時(shí)間倒騰出來了那個(gè)小項(xiàng)目,也是因?yàn)檫@個(gè)小項(xiàng)目我對(duì)后端開發(fā)產(chǎn)生了些許興趣,我覺得寫邏輯接口提供給前端調(diào)用好像比較牛逼。
那段時(shí)間開始研究 SSH2 框架,使用它做了一個(gè)電商項(xiàng)目,接著發(fā)現(xiàn)很少人用 SSH2 了,然后研究了 SpringMVC 框架,JDBCTemplate,進(jìn)一步學(xué)習(xí) Mysql的索引、視圖,使用 PowerDesigner 設(shè)計(jì)數(shù)據(jù)庫(kù),Nginx,Linux操作系統(tǒng)環(huán)境搭建,操作命令,網(wǎng)絡(luò)協(xié)議等等。
不過之前做的很少涉及到高并發(fā),后來比較流行SSM框架了,也使用過它來做一些分布式的項(xiàng)目,慢慢的了解到了連接池、消息隊(duì)列、定時(shí)、緩存、搜索引擎、渲染模板引擎等等。
由于SSM配置繁瑣,現(xiàn)在Spring Boot/Spring Cloud這樣的高效框架也越來越多人開始使用了。
越往后越發(fā)現(xiàn)基礎(chǔ)的東西很重要,比如多線程的同步異步,各種集合的實(shí)現(xiàn)原理,面向?qū)ο螅瓷浼夹g(shù)等!
當(dāng)然我非常不推崇那些對(duì)剛?cè)腴T想學(xué)的同學(xué)推薦一堆諸如:各種設(shè)計(jì)模式,JVM調(diào)優(yōu),負(fù)載均衡,各種數(shù)據(jù)結(jié)構(gòu)和算法,鏈表、排序樹,分布式存儲(chǔ),對(duì)象池,連接池,網(wǎng)絡(luò)三次握手過程等等。
人家還沒開始學(xué),就給嚇跑了 - -
所以我建議「Java自學(xué)入門」先從基礎(chǔ)開始,再進(jìn)階到會(huì)使用各種框架,再慢慢了解其原理,加以項(xiàng)目輔助練習(xí),最后再回來補(bǔ)充自己的弱項(xiàng)例如操作系統(tǒng),數(shù)據(jù)結(jié)構(gòu),算法,網(wǎng)絡(luò)!