程序員業餘時間繼續深入學習?如何繼續充電?

本人大學今年7月畢業,現在屬於實習期,做javaweb方面,進了一家企業,規模不算小,有點迷茫,正因為企業規模不小,所以前端用的前端框架(公司自己的框架,我只需要滑鼠點加少量的JQuery),後台代碼也都是模板(出參,入參,JSON,以及一些資料庫操作),總之就是CRUD,而且就是一個有一個的小模塊,所以不知道該如何深入學習,提高自己技術,滑鼠點來點去,擔心終究會忘掉所學,擔心技術不進反退,平常下班有點時間,時間也不多,周六周末倒是有大把時間,不想荒廢。。。。


絕大多數程序員都經歷過CRUD時期,寫這種代碼無聊是無可否認的,但實事求是地說,CRUD是程序員熟悉業務的必經之路,哪怕是寫SQL語句,也需要在重複中達到熟練的程度,沒有別的方法。但同樣是寫業務邏輯代碼,你可以選擇去設計一個好的抽象,也可以按部就班不考慮抽象、封裝這些問題,代碼執行的結果是一樣的,但是代碼的品位是很不同的,參考 程序員如何避免寫過多的業務邏輯代碼? - 職業發展

程序員的成長過程大概有兩個階段,第一個階段是往純技術的方向走深一點,不停留在coding,而去理解所使用的技術的優劣勢,接觸各種各樣的問題,逐漸明白技術域和問題域之間的聯繫。第二個階段是讓自己逐漸從純技術思維中走出來的過程,站在技術的原點上往外看,開始關注產品產品,市場,項目這些更宏觀的領域,把每天的工作放到這些具體的場景里去認識,你會有不同的感覺,慢慢地會明白這些宏觀的因素是如何影響程序的架構的。

經驗不深的程序員覺得只有親自去設計複雜數據結構,親自實現演算法,甚至去寫編譯器才是夠「技術」的工作,我以前也這樣認為。但當你做得時間更長了,會慢慢發現一個普普通通的商業業務程序,並不比自己去造一個演算法複雜度低,但是這種複雜度是細節複雜度,就是事無巨細,各種edge case下的正確性,魯棒性,安全和性能的各種要求,給開發和測試帶來的挑戰,並不一定比寫一個問題域基本清晰的演算法簡單。而一個程序員有挑戰的職業生涯,是在於處理項目中那些未知或者難知的問題,如果通過好的架構設計,編碼方法,測試策略讓一個項目始終向上發展好幾年甚至好幾十年,這是不小的挑戰。

所以如果你覺得CRUD寫得太多,原因可能不是你寫得太多,而是你還寫得太少,思考得太少,你得技術價值觀還有一點幼稚,你還沒有試過從繁榮當中發現本質。

-

vultr.com 有目前性價比最高的 $5 VPS,768的內存


update

既然提到了深入學習,我覺得還是有必要說一下,寫的比較粗糙,僅拋磚引玉。

學習與提升自己一定是抱著某個目的進行的,鑒於題主「比較迷茫」,我只說說自己的看法。

如果只是工作累了,玩一玩,提升一下自己的技術棧,無所謂,隨便搞,哪個新鮮搞哪個;如果你想要在技術上或者某個領域有一些積澱,建議構造自己的技術壁壘。

什麼是技術壁壘,比如我做服務端開發,那麼我有哪些思考哪些重點?

首先是從基本的web服務,CURD,進一步思考,如果網站越來越火,請求量較大如何處理,比如經典的c10k(也可能是c20k/c100k/c1000k,總之就是一個瓶頸),這個問題主要考驗的是機器的並發量和吞吐量,主要是優化策略,單機優化,加機器。

優化策略有一些是通用的,有一些是根據業務場景來看的,讀/寫/下載,暫時想到這三個常見的場景,讀的話還需要看數據類型,是否頻繁改動,冷熱數據,寫的話,是否要求即時更新,是否可以非同步更新,下載其實是指一系列文件傳輸的操作,對用戶可能是下載,機器之間可以是做一些備份業務,這些業務的特點是I/O wait會比較高。

單機優化又要區分業務優化還是環境優化,比如業務代碼是否存在性能問題,這個和上面的優化策略還不太一樣,可能是代碼的問題,可否得到優化,比如用多線程、優化慢SQL等。

環境方面,可以採用一些高性能的伺服器。可以使用一些外部服務,比如cdn託管資源文件。一些寫一次就不會去改的數據,可以直接緩存整頁數據,存放到mongodb中,減輕對db的壓力,即時需要改動的數據,也可以看是否頻繁改動,定期更新緩存。之前看過一個東西的思路就是,寫nginx拓展直接解析請求讀取nosql的數據,當然這個說起來比較簡單,實際寫起來坑很多的。

如果單機搞不定,人們最喜歡說的話是,「加機器」,加機器是ok的,問題是怎麼加。服務端是否可以對分散請求,通過軟路由還是硬體路由?

請求分散到多機是規律的還是隨機的?會不會產生session失效的問題?

其實這就逐漸討論到了分散式的問題了,一方面加機器是為了提高業務承載量,另一方面也要關注多機器協作,是大家都做一樣的事,還是大家都做不同的事,以及RT(return time)等數據性能等。

或者業務量攀升,服務端業務支持壓力很大,是否可以拆分業務到不同的機器上,那麼不同機器如何通信、如何相互調用?使用mq、rpc服務。

隨著業務量的提升,數據量也開始增大,如何優化數據存儲?區分冷熱數據,引入nosql資料庫。

有些業務頻繁寫數據,有些數據頻繁讀取數據,系統做讀寫分離。

當資料庫到了讀寫分離的層次,是否需要關注數據同步的問題?

當資料庫存儲的量很大,單庫單表壓力非常大,是否需要考慮分庫分表?那麼隨之而來的唯一鍵約束有需要怎麼去做?如何在不同機器上生成唯一鍵?db本身的事務性在分庫分表是否會受到破壞?

當熱數據頻繁讀寫,在讀寫分離後資料庫壓力依然很大,是否需要通過緩存來減輕db壓力?

當數據量很大,又沒有很明顯的冷熱數據特性,可能還有一些數據檢索排序的需求,是否需要引入搜索引擎來做讀庫?

...

在這個不斷思考的過程中可以發現問題,不斷學習去補充自己的知識,知道如何面對這些問題,從哪裡著手,在不斷實踐的過程中將這些設計能力變成自己真正的能力,畢竟吹牛誰不會,真正沉澱成你自己的能力避不開實踐這一環,在這個過程中,基本完成了從簡單的web後台,到一整套後台服務架構的壁壘。

這是開闊的視野和學習前進的方向,這個時間可能是一年兩年,甚至是五年六年,當然啦,渾渾噩噩可能幹了幾年也沒有長進。

另一方面,既然是感到迷茫,這個一方面是心態的問題,一方面是環境的問題。

那麼我建議你加強基礎,大學裡的課程還是值得好好學一學,這方面資料太多了,基本的就是數據結構、操作系統、深入理解計算機系統、計算機網路,自己造造輪子,比如用socket寫個http的伺服器,不用太複雜等等,知乎的資料應該很豐富。

另外要關注軟體工程,關注程序員人文,關注思維。

天天搞編程太累了,來看點人文書籍吧。

有哪些適合程序員讀的人文書籍? - 書籍推薦

還有一點,強大的程序員絕對不僅僅是技術優秀,一般都有非常強的思維邏輯,能夠有效的排查問題解決問題,無論是學習的問題還是編程過程中遇到的問題,於千軍萬馬之中取bug首級。有意識的鍛煉自己的思維能力,排查問題的方式,鏈路等等,多思考,在思考中不斷確認問題肯定問題否定問題等。(當然還有很多能力需要學習。

要懂設計,要有設計的意識,這個設計並非美工的設計,而是涵蓋系統的鏈路的設計、系統介面的設計、學習編程語言能夠縱觀語言的設計、包括對業務的設計。如果你只是一個別人讓你做什麼你就做什麼的程序員,那只是行屍走肉而已。

這個說起來比較縹緲,可以干一件事情試試,找台機器安裝redis,記錄一下機器配置,測一下redis的讀寫性能,這方面網上應該會有一些實踐資料,順便參考系可以找db/nosql/memcache對比測下,完事看看他們功能差異在哪裡。開始肯定一臉懵逼,多搞搞就輕車熟路了。

開闊視野可以保持程序員的熱情,紮實的基礎可以讓程序員感到踏實,嚴謹的思維可以更透徹的分析問題,優秀的設計能力可以讓你更快速的進步。


1. 多動手寫代碼,能用鍵盤,就不用滑鼠。

2. 建議深入學習Linux。一方面增加技能,另外一方面開拓眼界。

3. 研究下主流的協議,比如Http, websocket, ssh,把這些協議搞明白。

4. 建議學一門其他的語言,比如go, php等等。不要被一種語言束縛了。

5. 養成良好的編碼規範和習慣,對自己寫的代碼經常優化,重構。

6. 可嘗試做一下測試工作,增強測試意識,寫代碼的時候學會換個角度看問題。

7. 如有可能,學習下項目管理,敏捷開發方面的知識,提升自己的項目管理能力。

8. 如有可能,可嘗試實踐下常見的架構方案,比如負載均衡、緩存服務等等。

推薦下我覺得還不錯的書:

1. 《程序員修鍊之道 從小工到專家》這是很早的一本書,核心思想是注重實效。

2. 《Unix編程藝術》

3. 《編寫可讀代碼的藝術》非常好的編碼規範的書,絕對超值。


好好找個女朋友


其實這種情況很常見,大部分人在公司里負責的都是一個很小的部分,要說多有技術含量,其實都沒有。每天的增刪改查和介面的編寫,堆砌代碼。所以經常也會思考如何在業餘提高自己。

我個人的建議是:

1.周末可以重構自己以前寫的代碼,工程類代碼或者演算法類代碼;

2.看看代碼規範,比如代碼大全,編寫可讀代碼的藝術,代碼整潔之道等等,一邊嘗試,一邊看書;

3.深入到平時工作用到的工具的源碼,透徹理解原理,比如spring,可以試著畫他們的bean工廠的uml圖,或者自己實現一個簡單的IOC和AOP框架;

4.把工作用到的IDE工具用熟練,快捷鍵,debug等等;

5.看點代碼之外的東西,比如人文,社科類的書,生活除了眼前的代碼和bug,還有很多很多;

6.學好數學和經濟學金融類的學科,真的有用,相信我!!!

好了,暫時想到這些,後面補上!!!


趁有時間有心,你可以看看前端,或者試試下幾個別的框架,跑起來。。。看聖經,實現原理什麼的,我經常想做,可都是開始了一兩個鍾覺得好睏結束了。。。不過代碼寫多了,有些東西就大概知道怎麼做出來的,看書也是如果能認真看就懂了。。。不過這樣子很蠢就是了


目前業餘時間正在推進三個內容:

計算機網路原理(屬於補缺補漏)

深入計算機系統原理(英語)

經濟學原理(錢穎一講得挺好的)

沒什麼方向,但是一定是有用的。


不知道答主寫業務能力如何

很多人,一個項目開始,做到一半都還沒走通業務的關鍵地方。

有些程序員,在一開始就已經找到了業務關鍵的地方。

我想這也是種能力吧。


版權歸原作者所有

商業轉載請聯繫原作者獲得授權

非商業轉載請按規範格式著名出處

原作者:zhuweisky

原載於: 博客園

原文鏈接:程序員的出路之一

就現在經濟大環境而言,很不樂觀,程序員的日子也很不好過,無論是還在找工作的、還是已經入職多年、哪怕做到項目經理技術經理的,壓力都異常巨大,似乎處處充滿危機。但是,仔細分析一下,出路還是有的,甚至解決溫飽、過上有房有車沒貸款的生活也是很可能的。首先,在如今這個浮躁的社會,大多數人的心態也是浮躁的,只要你能潛下心來,深入研究某個技術,有了一技之長,溫飽問題肯定就可以先解決了。

1.一技之長

新技術層出不窮,而內核的精髓的東西卻變化不大,就像.NET,從VS2003到VS2012,已經有10個年頭,VS的版本不斷更新,而.NET內核的最新版本也才4.0,所以,作為程序員,我們要多掌握內核的東西,精髓的東西。

我們的學習積累毛病在於:貪多、貪全、而不夠深入。對於很多技術,我們都很有興趣,對於剛興起的技術,也緊緊跟隨。但是,幾乎都是蜻蜓點水、一知半解。回頭想想,我們似乎什麼都會一點,什麼類型的項目都可以做,B/S的、C/S的、資料庫的、分散式的,等等,但是,卻不敢說,在某某方面,我的水平已經超越了圈中同類型的80%的人。只是我能做的,大家都會做,而且,我也沒有把握比別人做得更好。

必須要讓自己有價值,而自己的價值在於不可替代性或是難以替代性。如果,隨便找個程序員就能把你replace掉,你的價值就很低廉了。如果在你負責的某個方面,只有20%的人超越你,那你的價值、你的重要性就凸顯出來了,你與僱主的關係就從被動轉向了主動,你就有了談判的籌碼。

在專業化高度分工的今天,一技之長並不是說需要你掌握某個很大的方面,而只需要你能掌握其中的某一個小的領域,並不斷地深入下去。就這個小的領域來說,你花個3、5年的時間擠進前20%是非常可能的。比如,有人專門研究SqlServer資料庫優化、有人專攻TCP通信、有人深入研究IIS、有人深入鑽研WCF,等等。

2.打造自己的精品

當你在某個小領域鑽研了3、5年後,你一定會有很多心得,積累了很多經驗,其中有些經驗是異常寶貴的,為什麼了?因為在鑽研這個領域一段時間後,會陸續碰到很多問題,而那些80%的人,在碰到某個問題時就停止向前了,在這個小領域的水平就到此為止了,而你卻不斷地解決這些問題,不斷地超越那80%的人。

而且,很可能的一個情況是,作為幾年鑽研的一個副產品,你積累了一套類庫或框架,而基於該類庫或框架來開發該領域的項目,不僅開發速度更快,效率更高,而且項目的質量更有保證。然後,你可以把積累的這套類庫/框架打造成一個精品,不斷的打磨,直到某一天,可以讓更多的人來用它。

當你在某一領域有了豐富的經驗,或者有了自己的精品類庫/框架之後,你便可以面向更廣闊的市場。

3.更廣闊的市場

在公司做個小白領,你的生死榮祿幾乎就完全掌握在你的上司手中,你不得不關注他,被他的情緒所左右,很可能因為他的一句批評,你就整夜難眠。你覺得自己做得很好,可是他不認可。但是現在,你不需要再過分的關注他,你可以將眼光轉向更廣闊的市場。

互聯網時代的一個好處就是,任何人都可以以非常低廉的成本來向大眾市場展示自己或自己的產品,評判你價值的不再(僅僅)是你上司,而是整個市場,相比於你的上司,市場的評判會更客觀、更公正。你可以把自己的經驗能力說明放到自己的博客上、寫專業的技術文章來分享知識、順便推廣自己,或者把積累的框架放到網上去賣,或者去項目交易平台接那些與你精通的領域對口的項目,由於在這個領域你超越了80%的人,所以,成功接到項目的可能性是非常之大的。有了這些基礎,以後就算是靠技術創業也是有可能的。

如果做到了這三點,我想,你的「有房有車沒貸款的生活」差不多就可以實現了。

就我個人經歷而言,我花了10年的時間積累了ESFramework通信框架OMCS語音視頻框架,單靠它們的收入,滿足家庭的生活開銷已經足夠了。我作為一個普通的程序員,既然我可以做到,我相信後來人也可以做到,甚至做得比我更好。祝福大家。


結合我的學習來說說,開始寫業務,這時候是代碼規範和邊界判斷與邏輯的鍛煉,然後慢慢開始思考我們的架構,發布流程,測試代碼,有沒有有哪裡可以做到更好的,比如jdk原生反射改為asm實現反射,或者是否可以引入rpc框架,然後再想自己實現rpc有哪幾步,可以用netty,序列化用什麼,fst還是原生,是否要跨語言,在下班時間完成並且寫好bechmark完成論證,如果能就此做個分享更好,此就是你形成自己的技術體系的開始。

再經過一個階段,可以考慮架構方面的,比如服務化方案,比如dubbo,然後開始理解服務治理,慢慢開始自己建一套基於dubbo的架構…

以上只是結合自己的學習過程舉例,我覺得這個過程最重要的就是始終抱有疑問的精神,不斷的深入,你會發現計算機技術太多了,框架太多了,你能做的只是堅持學習的熱情,手機碼字排版比較亂,不好意思。


除了熱愛,唉,人真的是很沒安全感啊~


工作累就玩點有意思的,我現在就弄弄scala,感覺挺有意思,你也可以搞搞其他的,es6的js,py,ruby,kotlin。工作不累就規劃好自己的目標,進入枯燥的學習之旅吧。比如研究常用的開源框架的源碼。


多讀書(非技術書籍也要看),多交友(同性…),多看代碼,學好英語…T T


現在的年輕人真有上進心啊!我實習那會,除了到處玩,就剩泡妞了~~


做了好多年技術,前期也做過行政,來談談關於CRUD的感受。個人經驗,不要聽從大多數人關於前景的評價和建議。所謂事事洞明皆學問,人情練達即文章,絕大多數事情不是本身不好,而是你沒有體會到中間的價值,覺得這件事沒價值,或者聽了別人的評價覺得不好。然而事情中間的價值是隨著時間和環境不斷變化的,大多數跟你處在同一層次的前輩,其實他在你這個時期不比你好到哪裡去,所以他的建議可想而知。

說回技術,根據我的經驗,絕大多數成熟的技術包括技巧都存在一些本質上的特徵,例如,目標明確,方法可複製,效率高等,這些特徵都是技術本身所要求的,不滿足這些特徵的技術要麼被淘汰要麼根本得不到應用,總之這些特徵是你看到的技術與身俱來的特徵。

然而,上述特徵從外部看很美好,當你置身其中時就不美好了。目標明確代表著你不能隨心所欲,甚至要放棄你特別喜歡的。方法可複製代表著絕大多數低端從業者要乾枯燥重複的工作。效率高就註定了這是一項燒腦的活。

所以向回看,技術工作基本全是這樣的,你覺得CRUD沒意義,可能是你自己沒發現它中間的意義所在,畢竟誰不是從那一步走過來的呢?


0.先看看現在有哪些比較潮流的技術,然後了解學習,可以拆解源碼,來看看。之前,用了好長一段時間來研究Android的插件化,期間看這些框架的源碼,了解原理,然後就自己仿著寫一下

1.對這個領域修修補補,可以深入了解原理

2.鞏固基礎,在重新看一遍大學課程ing~

3.可以學習相關領域的知識,我做Android,想知道服務端是怎麼和客戶端之間通訊,然後怎麼處理的,所以,也在看服務端的東西


可以看網易雲課堂,和網易公開課


空餘時間總會有的,畢竟程序猿的工作很多時候也是在學習嘛


可以在github上看看一些優秀的開源代碼,然後自己也多碼就是了。多學習,多思考。


公司差不多,雖然我是996


看書,筆記,寫代碼。


看書,思考,敲鍵盤


推薦閱讀:

如何系統學習JAVA web框架?
JAVA後台開發可以純粹用JAVA SE嗎?
網頁的720度全景圖和手機端的720度全景圖分別都是怎麼做到的?

TAG:學習 | 編程語言 | Java | 開源 | JavaWeb |