前言
- 進入IT領域,就像進入大海—浩瀚而廣闊。然而,它又很容易讓人迷茫,不知所措。所以,在IT的海洋中,找好一艘船特別重要,這艘船帶你前進、減少迷失。這艘船或許是一個人,或一本書,又或許是一篇文章。
- 然而在現實的大學生活中,在我們普通院校中,其實更多的可能是忙忙碌碌,或者碌碌無為。或者就是按照課本循規蹈矩,學着一些陳舊,或者自己不喜歡的東西。到最后就是那種啥都會、啥又都不會的人。
- 筆者為一個即將進入大四的學生,在這個領域的學生生涯也算是感觸良多吧,自己算不上優秀但是也不是無所事事的那種人。在大一和大二荒廢和浪費了太多時間,每每想到都會后悔上一番。希望后人能夠引以為戒!
- 在學習一門語言,或者一門技術,你首先要先了解這門技術,這門語言在世界,在中國的市場份額。以及火熱程度。有些語言漸漸暗淡。而有些語言逐漸興起。
- 當前比較火熱的語言大致有
java
、python
、c
、c(嵌入式)、javascript
、typescript、c#、R、go、kotlin(安卓)、scala(大數據)、ruby、php、matlab、dart(flutter跨平台移動端)、swift(蘋果)、objective -c(蘋果)、shell腳本、lua腳本等等。 - 選擇一門語言要根據你的方向來。比如你要學習后端。那就java、python、php、c#、或node.js。如果搞安卓那肯定java、kotlin、js(混式開發)。如果大數據那肯定是java、scala最好,其次python也行。如果搞人工智能算法那肯定是python、matlab。數據分析可以考慮R、python、matlab。如果你想搞爬蟲,那python肯定最好選擇,當然java等其他語言都可以。如果你是競賽ACMer。那c 肯定是你的拿手菜、也不排除部分鬼才用java哈。
- 筆者從大眾角度還是建議要熟悉掌握一門編程語言。對於作為學習的基礎語言。建議從
java
或者c 開始。后續可以學習python。go等語言。
- 對於方向,雖然籠統的說有web開發、大數據、人工智能、物聯網、雲計算、運維、測試、網絡安全等等。但是對於普同學軟件的大學生來說主要的還是·
前端
、后端
、運維
、大數據
、測試這些。 - 對於很多人說的或者當前炒的火熱的
人工智能、爬蟲
那些。我只能說很大程度那就是一個坑吧。因為大公司除了一些做搜索引擎的百度、谷歌、360他們利用爬蟲 算法 存儲做搜索引擎。而其他大公司他們都有自己產生的數據、他們更多致力於這些數據的處理,分析。而不是想着怎么爬。還有就是理性看待培訓機構的python吹
,python是很方便簡單,是能干很多事情。對於鼓吹的爬蟲學到后面的拓展方向。要么是擴大量分布式方向拓展。要么就是分析JavaScript各種加密。如果是安卓等app還要反編譯看源碼查看java代碼的邏輯,以前記錄的淺談網絡爬蟲。而AI方向
眾所周知一般非985/211碩士很難找到
。並且AI重要的是數學和算法,跟編程語言關系也不大。python僅僅是一個工具
而已。 - 根據方向市場大部分需求還是
前端、后台、算法(要求很高)
。前端和后台的需求遠遠超過其他的方向人員。因為所有網站的其他開發功能都要依賴於前端和后台。並且隨着html5流行。web能干的事情也越來越多。這也極大的搶占了桌面應用和原生安卓、蘋果應用。所以個人建議后端、前端、運維三個方向選擇一個。當然。具體選擇方向還是要根據興趣來,你喜歡大數據(工程類要求不是很高,數據挖掘算法要求高),人工智能,爬蟲,游戲開發,桌面開發等你都可以做。只不過再選擇方向時候要盡早
。不要好高騖遠
。根據自己所在院校、自己實際水平。以及計划研究自己想要研究的。
你是想要進大廠
,還是想進小公司
呢?
對於一個普通本科生,很可能真正步入學習的時間不多。並且能夠掌握的知識的廣度和深度也是有限度的,還要考慮學習環境的影響。要慎重選擇學習的側重點。
- 相進大廠,那么如果裸的只會java后端技術是不夠的。在校招階段進大廠更多知識的要求不是廣度,而是深度。比如
操作系統
,網絡
,數據結構和算法
,以及jvm
,和java的基礎知識需要熟練掌握。而框架和一些高級中間件需要你了解或簡單應用。但是大廠就那幾個,競爭壓力還是比較大的。 - 想進小公司,其實很多小公司的要求特別高,並且很多小公司干的活也多一定程度能夠使得技術快速成長,也有不少人先到小公司積累技術然后跳大廠。小公司更多看中你會的技術有哪些,會那些框架,中間件而相對不太注重那些底層。
- 如果你要就業一定要提前幾個月准備面試,准備基礎,進行復習,github上的javaguide力薦。
同時,也不要有心理包袱,不要認為自己是雙非的大學就進不了大廠,如果學習的早,自身積累夠多,夠扎實,用心准備那么進大廠也是沒問題的。
個人感覺在學校的學習過程中主要有兩大障礙。一個是個人障礙,另一個是學校障礙。
- 不了解就業的壓力。總把事情交給’明天’,以后。或者把領域看的很簡單,又或者好高騖遠,看不上當前所學,又不拓展新知識。
- 還有 混日子等臨近畢業補習找工作。這種就是低薪碼農,和容易被淘汰的。IT的每一個技術棧都很深,都需要長期的沉淀才能變強。
- 考研黨會認為:我要考研。我要考研,我不要學這個,我要做研究。你做研究,研究生基本是算法或者底層深入的研究。有些甚至連基本知識、語法都不會,准備用寶貴的兩年半去從0開始么。這里就不再吐槽了。如果想要考研的也要為自己的將來打算做鋪墊。比如你想將來研究機器學習算法。你可以刷刷題提高編程思維能力,學個爬蟲能夠抓取一些數據。
為自己以后做個鋪墊
。
這個可能有些學校好一些。但是對於我們學校的教學方案和課程。真的很想吐槽一下。雖然學習是個人的事情,但是在當前教育制度下很多學校也有無法推脫的責任。
- 課程陳舊、冷門課程:IT發展迅速、技術更迭較快,然而很多學校課程甚至5、6年都不改。就比如我自己我們瘋狂學C#,sqlserver,windowsapp(windows應用商店app),.net微軟這些玩意。如果認真學習出來真的是沒啥用——
不迎合市場
。對於這些,如果你是忠於技術的感覺還是要有所取舍。如果你要是鑽研你自己的技術一直鑽研下去那么你肯定會慢慢沉淀,收獲很多。但是學科成績就會降低甚至是掛科。對於其他更深的影響這里就不分析了。 - 還有些學校瘋狂開設相關性不大的課程 比如日語,瘋狂開硬件課程。確實占用大量學習時間。如果在遇到一些要求很嚴格的老師,真的是欲哭無淚。
- 對於這些障礙,你要認清自己大學期間想要收獲的是什么。然后自行決定取舍。如果你是想從事技術就業,個人感覺學業成績沒那么重要、可以多關注技術,多做項目對成長、就業的好處會更大。但是對於
操作系統
,數據結構和算法
,網絡
這些課程也是程序員內功區分的很大准則。還是要認真學習的。
這里通過個人過程淺談一些java方向學習的建議
萬歲入門難。當你敲起hello world跑起來,那其實算不上入門。論上入門應該是把Java的基礎都掌握吧。javaSE是java的核心和基礎。只有這塊學好在后面閱讀其他代碼、框架才能更加輕松容易。
- 對於入門的書籍,其實還是推薦
,內容豐富而通俗易懂。跟着書上案例敲demo就很容易入門。如果認為這本很簡單,可以買一本
,其他的書暫時就不建議買。 - 對於入門的視頻,其實比較多了,像
網易課堂,騰訊課堂,慕課
,這些在線教育平台有很多免費課程,適合入門。並且淘寶上也有很多培訓機構的課程,也是相當不錯。比如黑馬,尚學堂,傳智播客
,各種可以從淘寶買的到。 - 對於入門的資料,其實比較多了。基於微文章,博客等的流行,越來越多好文章涌現在stack overflower,
csdn
,博客園
,掘金
,今日頭條,簡書,微信公眾號以及個人博客上,所以要充分利用搜索引擎
獲取資源。 - 對於編譯器,入門建議eclipse。idea(入手需要時間)也可以。如果用idea最好先找一下idea搭建項目流程和介紹。兩者編譯器有些不一樣。java基礎學習建議eclipse。javaweb建議使用idea。不建議使用myeclipse,感覺太臃腫。
- java基礎:
包過安裝環境,第一個helloworld,命名規范,數據類型,運算符,控制語句和方法,數組,字符串,面向對象,異常,泛型,以及一些api 例如正則、math、大數等模塊。這部分比較簡單,跟着書上、視頻、博客的demo跟着敲就能夠理解。對於一些模塊不一定需要立即完全掌握。比如Math類有很多數學計算方法,你掌握一些常用的求平方、根號可以以后用到再慢慢積累。還有正則和大數模塊在入門階段要求也不是很高。 - java 進階:
對於進階部分的內容。都是java處理問題的利器
!,並且都很重要。 - io(熟練掌握):在后面javaEE開發中,或者實際項目中。很多涉及到文件傳送,需要對IO的api熟練掌握,並且io的拓展也比較多有NIO,BIO等等。
- 集合(熟練掌握):Map和List在開發過程中使用是非常多的。並且在面試中也會常問Hashmap,currentHashMap,ArrayList、LinkList相關內容。並且在寫算法題,寫項目時候集合也是必不可少的部分。
- 網絡編程(了解):了解socket編程,tcp/udp編程。如果喜歡網絡編程或者想研究通信方面或者一些網絡傳輸中間件要深入了解網絡編程。
- 多線程(先了解熟悉):這部分內容比較深。在入門學習可先了解熟悉,因為等java有一定基礎還需要對多線程進行深入學習。因為在大型項目中會涉及到線程安全問題、同步問題。都需要多線程方面的知識。
- 反射(先了解):反射的功能比較強大,對於很多人來說還是太難了。這部分在入門學習建議了解。如果后面有能力可以深入學習。因為當前流行的spring,mybatis很大程度是依賴反射去完成的。
- jdbc(掌握),jdbc在jsp/servlet中關於數據庫的操作幾乎必不可少,這部分在javaEE會二次學習。
- javaswing(直接跳過):java在桌面編程並沒有太大優勢,雖然eclipse,idea,webstrom,pycharm等眾多編輯器是java開發的。但java開發桌面效率還是偏低。難度偏大。但是很多老師的課程設計會基於javaswing的管理系統。如果你想學也可以研究吧。但是個人覺得還不如多花點時間用web做一個管理系統呢。
前言
- 在從javaSE剛過度到javaEE的時候,筆者初期感到深入不適,甚至也停止了好久。因為對一些概念沒搞清楚並且有一點畏難的思想。因此也耽誤了很長時間。因為之前的javase只有java代碼。而javaEE有java代碼,又有啥javabean,serverlet,jsp,js/css,xml,tomcat,還有session,cookie系列名詞。后面還有啥maven,框架啥的。這些沒有接觸的概念曾經一度阻擋自己學習。
- 其實當你有這些問題時候,建議你兩點:一就是先百度把各個名詞先百度一下,先弄清楚這些玩意是干什么的。二就是建議你找個系統的視頻課程或者教程跟着學習,他們會帶着你一步步更新認知和了解。能夠少走很多彎路。
- 這部分還有一個很重要的就是省略得當,有些技術過時的、陳舊的不需要學或者不需要深學。比如jsp頁面語法,strus2,hibernate,jsp整合javabean等等。了解就好。
- 上一代的傳統框架為ssh(spring,strus2,hibernate)。但是那套體系很陳舊,很少有公司使用了。所以沒必要學。現在更多的是springboot mybatis。springboot是整合spring相關內容,使得開發減少配置,更加方便。所以還是要先學ssm,然后再springboot。
- 對於學習順序,筆者建議先從mybatis,然后spring,然后springmvc。然后整合spring、springmvc、mybatis。然后再學習springboot。
mybatis
學習:除了看視頻之余。推薦一位博客園的博主孤傲蒼狼
寫的mybatis教程,感覺寫的特別棒。當然,你也可以在其他教程上學習mybatis的教程。對於mybatis半自動化ORM框架(基於jdbc封裝)。寫sql,封裝成一個接口調用。比起jdbc方便很多,極大提高效率。Spring
學習:spring 主要ioc和aop。對於入門階段要熟練掌握ioc。aop可以先放一放。個人覺得到后面有項目業務需求時候可以再學。Springmvc
: 這部分學習可以精簡得當,因為很多教程可能還是用大量model(modelAndview)。以及el表達式渲染數據。這部分如果專注個人開發可以多學一點。對於spring和springmvc。ssm整合
:筆者記得當初在整合ssm項目的時候是廢了很大一把勁。剛開始用的myeclipse用它下載部分spring的jar包。然后整合的時候又是各種報錯。然后又找各種缺失的jar包。然后又是各種版本錯誤。找bug。最終好容易整合到跑以來。但是這樣項目不易於管理。又項目轉移到IDEA.用maven管理jar包。百度很多能跑的整合方案卻不多。然后到最后好不容易找到完整的跑起來。所以在學框架的時候最好就是從開學就用maven管理依賴jar包。對於如果有整合難題可以到github找ssm項目copy修改。當然你也可以關注筆者公眾號:bigsai 筆者也很樂於幫助😀。springboot
: 當你學完ssm轉移到springboot就很容易。只需要注意一些規范和語法。一個ssm項目充斥着大量的xml配置文件。讓項目看起來非常的臃腫。而springboot配置簡單。用maven管理項目。並且傳統ssm配置其他中間件又要多不少xml。對於這些springboot都做了優化。對於springboot學習教程,推薦程序猿DD和battcn兩位博主的個人blog。當然筆者也寫過寫springboot的demo放到github也歡迎參考。
- 上述學完也只能說是后端世界的冰山一角吧。然而在后端世界還有很多知識需要掌握。比如一些中間件Nosql,MQ消息隊列,Elasticsearch/solr搜索,nginx反向代理,zookeeper等。還需要掌握一些shiro/spring-security安全框架。jwt token生成框架,quarz定時,swagger2 restful接口生成等流行框架。很多中間件初用比較簡單,但是深究是很復雜的,如果想要強,最好能
熟練掌握一個中間件的各種應用方式和場景
。比如精通redis,或es,或某個mq。 - 在微服務方面有dubbo一套和springcloud一套。主要注重服務的拆分和治理,當前dubbo用的挺多,性能也比較好。但是遇到更新瓶頸。而springcloud興起不久,也比較火。推薦springcloud官方教程以及方志明博主的系列教程。當然,這部分學習需要成本比較大,如果電腦內存不夠幾個程序下來內存就滿了。沒兩個服務器也體驗不到cloud程序的快感。
- 當然,在java領域還有
很深的水
和內容。需要深入考慮的。比如mq消息丟失,elk日志處理,使用部分大數據組件,docker容器化,還有各種集群帶來的問題,各種性能問題、安全問題、運維部署集成問題和各種優化。這就很大程度需要你在工作中實踐真正僅一家互聯網企業,開發和維護業務。以及處理高並發和各種其他原因帶來的問題。你會發現原來自己是真的啥都不會(至少筆者是啥都不會)。
除了對於后端學習,了解或掌握一些其他技能還是很有必要的。
- 前端:html/js/css 以及jquery,一套以上ui框框(easyui或者layui)能夠熟悉使用(小全棧)。有能力可以接觸vue,react等流行js。
算法
:各個大廠對工程師的數據結構和算法要求都挺高,建議可以刷letcode,劍指offer(牛客),pat(牛客),這些算法在面試會經常問道或者出現在筆試。喜歡的也可以刷hdu,poj增強算法思維和能力。對於刷題入門。推薦從杭電oj第11頁
或者pat乙級
開始入門。可能剛開始刷題會遇到困難。但是刷題一方面能夠鍛煉思維,另一方面可以鞏固java的一些語法和集合使用。當你對程序復雜度有了概念,在開發時候對你有很大幫助的,你的思考點就不僅僅是實現功能,還有效率。- 爬蟲:當前爬蟲算是一個比較火但是不太拿的上台面的一門技術。可以通過爬蟲(python/java都可以)增強對接口的認識。為自己工作的反爬做做准備。並且在課余之際也可以做些有趣的東西。
- git 當多人協同開發,git等svn是必不可少的,提前掌握git,備份代碼。為開源社區做一份貢獻。
- linux 服務器基本是linux(centos和ubuntu居多),linux也是程序員必備技能。建議裝個雙系統(ubuntu)為日常學習使用,當然,這途中會遇到很多坑,需要自己踩。
- 一定要注重網絡,操作系統,數據結構和算法積累。
推薦幾個java學習的網站:
推薦刷題網站:
- letcode,
牛客
,PTA,杭電oj,poj,(cf,atcoder,vjudge有能力者考慮)
推薦IT交流社區
- 博客園(自由度更高),csdn,掘金,StackOverflow(境外),v2ex,開源中國,簡書,頭條
筆者一些建議:
- 最好能找個
學長代
,鑒於學校課程很多還是偏水。找幾個學長或者加一些交流群很重要。最主要是有人能夠引導你一下,幫你開拓一下視野。 - 多
動手
,做一些項目實踐而不是空理論,但項目不要做太多,或者沒一些成長性的。太多的項目也是個負擔。 - 多
逛IT社區
,多逛交流群,多關注
一些博主公眾號。增加學習途徑。 - 找一些
伙伴
一起學習、交流、互助,畢竟一個人還是很孤單的。不要被搞其他技術的人影響,根據自己興趣,找到一些志趣相同的人一起成長學習。
筆者不知道自己說錯了多少,也不知道這篇文章會不會隨着時間推移而變成一堆廢話。當然筆者水平也有限,只是表達一些個人在學習途中的迷茫和建議,不知道是否會誤導一些青年。建議要選擇性閱讀。當然,至於筆者寫過的一些blog,如果各位遇到筆者能夠解決的一些問題,我也很樂意和大家一起討論!
- 如果對
后端、爬蟲、數據結構算法
等感性趣歡迎關注我的個人公眾號交流:bigsai