-
1 # 李豐國創業筆記
-
2 # kid7157887
1.多看書,尤其是各種中介軟體,資料庫,協議的實現,語言的基礎
2.不斷重構現有的專案,個人認為,無論工作經驗多少年,每次對一個系統進行重構,都會有新的認識
3.嘗試自己編寫或參與開源專案
4.進入一家大型公司核心部門,參與大規模,大資料量,高併發專案設計和開發
5.參加大會,與行業內高手交流
6.考取企業認證,rhca ocm等
7.重複造輪子,實現常用的中介軟體,快取系統等
8.在大型公司吸取經驗後進入中小型公司,成為leader,架構師,架構設計一個業務系統或大型專案
-
3 # Java技術架構
不管是開發、測試、運維,每個技術人員心裡多多少少都有一個成為技術大牛的夢,畢竟“夢想總是要有的,萬一見鬼了呢”。正是對技術夢的追求,促使我們不斷地努力和提升自己。
Do more我在HW的時候,負責一個版本的開發,這個版本的工作量大約是2000行左右,但是我除了做完這個功能,還將關聯的功能全部掌握清楚了,程式碼(大約10000行)也全部看了一遍,做完這個版本後,我對這個版本相關的整套業務全部很熟悉了。經過一兩次會議後,大家發現我對這塊掌握最熟了,接下來就有趣了:產品討論需求找我、測試有問題也找我、老大對外支撐也找我;後來,不是我負責的功能他們也找我,即使我當時不知道,我也會看程式碼或者找文件幫他們回答。最後我就成了我這個系統的“專家”了。雖然這個時候我還是做業務的,還是寫業務程式碼,但是我已經對整個業務都很熟悉了。
以上只是一個簡單的例子,其實就是想說:要想有機會,首先你得從人群中冒出來,要想冒出來,你就必須做到與眾不同,要做到與眾不同,你就要做得更多
怎麼做得更多呢?可以從以下幾個方面著手:
1)熟悉更多業務,不管是不是你負責的;熟悉更多程式碼,不管是不是你寫的。這樣做有很多好處,舉幾個簡單的例子:需求分析的時候更加準確,能夠在需求階段就識別風險、影響、難點。
問題處理的時候更加快速,因為相關的業務和程式碼都熟悉,能夠快速的判斷問題可能的原因並進行排查處理
方案設計的時候考慮更加周全,由於有對全域性業務的理解,能夠設計出更好的方案
2)熟悉端到端
比如說你負責web後臺開發,但實際上使用者發起一個http請求,要經過很多中間步驟才到你的伺服器(例如瀏覽器快取、DNS、nginx等),伺服器一般又會經過很多處理才到你寫的那部分程式碼(路由、許可權等)這整個流程中的很多系統或者步驟,絕大部分人是不可能去參與寫程式碼的,但掌握了這些知識對你的綜合水平有很大作用,例如方案設計、線上故障處理這些更加有含金量的技術工作都需要綜合技術水平。
“系統性”、“全域性性”、“綜合性”這些字眼看起來比較虛,但其實都是技術大牛的必備的素質,要達到這樣的境界,必須去熟悉更多系統、業務、程式碼。
3)自學
一般在比較成熟的團隊,由於框架或者元件已經進行了大量的封裝,寫業務程式碼所用到的技術確實也比較少,但我們要明白“唯一不變的只有變化”,框架有可能要改進,元件可能要替換,或者你換了一家公司,新公司既沒有元件也沒有框架,要你從頭開始來做。這些都是機會,也是挑戰,而機會和挑戰只會分配給有準備的人,所以這種情況下我們更加需要自學更多東西,因為真正等到要用的時候再來學已經沒有時間了。
以java為例,大部分業務程式碼就是if-else加個資料庫操作,但我們完全可以自己學些更多java的知識,例如垃圾回收,調優,網路程式設計等,這些可能暫時沒用,但真要用的時候,不是google一下就可以了,這個時候誰已經掌握了相關知識和技能,機會就是誰的。
以垃圾回收為例,我自己平時就抽時間學習了這些知識,學了1年都沒用上,但後來用上了幾次,每次都解決了卡死的大問題,而有的同學,寫了幾年的java程式碼,對於stop-the-world是什麼概念都不知道,更不用說去優化了。
Do better要知道這個世界上沒有完美的東西,你負責的系統和業務,總有不合理和可以改進的地方,這些“不合理”和“可改進”的地方,都是更高級別的怪物,打完後能夠增加更多的經驗值。識別出這些地方,並且給出解決方案,然後向主管提出,一次不行兩次,多提幾次,只要有一次落地了,這就是你的機會。
例如:
重複程式碼太多,是否可以引入設計模式?
系統性能一般,可否進行最佳化?
目前是單機,如果做成雙機是否更好?
版本開發質量不高,是否引入高效的單元測試和整合測試方案?</p><p>目前的系統太龐大,是否可以透過重構和解耦改為3個系統?
阿里中介軟體有一些系統感覺我們也可以用,是否可以引入 ?
只要你去想,其實總能發現可以改進的地方的;如果你覺得系統哪裡都沒有改進的地方,那就說明你的水平還不夠,可以多學習相關技術,多看看業界其它公司怎麼做,BAT都怎麼做。
我2013年調配到九遊,剛開始接手了一個簡單的後臺系統,每天就是配合前臺做資料增刪改查,看起來完全沒意思,是吧?如果只做這些確實沒意思,但我們接手後做了很多事情:
解耦,將一個後臺拆分為2個後臺,提升可擴充套件性和穩定性;
雙機,將單機改為雙機系統,提高可靠性;
最佳化,將原來一個耗時5小時的介面最佳化為耗時5分鐘
還有其它很多最佳化,後來我們這個組承擔了更多的系統,後來這個小組5個人,負責了6個系統。
Do exercise在做職業等級溝通的時候,發現有很多同學確實也在嘗試Do more、Do better,但在執行的過程中,幾乎每個人都遇到同一個問題:光看不用效果很差,怎麼辦?
例如:
學習了jvm的垃圾回收,但是線上比較少出現FGC導致的卡頓問題,就算出現了,恢復業務也是第一位的,不太可能線上出現問題然後讓每個同學都去練一下手,那怎麼去實踐這些jvm的知識和技能呢?
Netty我也看了,也瞭解了Reactor的原理,但是我不可能參與Netty開發,怎麼去讓自己真正掌握Reactor非同步模式呢?
看了《高效能MySQL》,但是線上的資料庫都是DBA管理的,測試環境的資料庫感覺又是隨便配置的,我怎麼去驗證這些技術呢?
框架封裝了DAL層,資料庫的訪問我們都不需要操心,我們怎麼去了解分庫分表實現?
諸如此類問題還有很多,我這裡分享一下個人的經驗,其實就是3個詞:learning、trying、teaching!
1)Learning
這個是第一階段,看書、google、看影片、看別人的部落格都可以,但要注意一點是“系統化”,特別是一些基礎性的東西,例如JVM原理、Java程式設計、網路程式設計,HTTP協議。。。。。。等等,這些基礎技術不能只通過google或者部落格學習,我的做法一般是先完整的看完一本書全面的瞭解,然後再透過google、影片、部落格去有針對性的查詢一些有疑問的地方,或者一些技巧。
2)Trying
這個步驟就是解答前面提到的很多同學的疑惑的關鍵點,形象來說就是“自己動手豐衣足食”,也就是自己去嘗試搭建一些模擬環境,自己寫一些測試程式。例如:
Jvm垃圾回收:可以自己寫一個簡單的測試程式,分配記憶體不釋放,然後調整各種jvm啟動引數,再執行的過程中使用jstack、jstat等命令檢視jvm的堆記憶體分佈和垃圾回收情況。這樣的程式寫起來很簡單,簡單一點的就幾行,複雜一點的也就幾十行。
Reactor原理:自己真正去嘗試寫一個Reactor模式的Demo,不要以為這個很難,最簡單的Reactor模式程式碼量(包括註釋)不超過200行(可以參考Doug Lee的PPT)。自己寫完後,再去看看netty怎麼做,一對比理解就更加深刻了。
MySQL:既然有線上的配置可以參考,那可以直接讓DBA將線上配置發給我們(注意去掉敏感資訊),直接學習;然後自己搭建一個MySQL環境,用線上的配置啟動;要知道很多同學用了很多年MySQL,但是連個簡單的MySQL環境都搭不起來。
框架封裝了DAL層:可以自己用JDBC嘗試去寫一個分庫分表的簡單實現,然後與框架的實現進行對比,看看差異在哪裡。
用瀏覽器的工具檢視HTTP快取實現,看看不同種類的網站,不同型別的資源,具體是如何控制快取的;也可以自己用Python寫一個簡單的HTTP伺服器,模擬返回各種HTTP Headers來觀察瀏覽器的反應。
還有很多方法,這裡就不一一列舉,簡單來說,就是要將學到的東西真正試試,才能理解更加深刻,印第安人有一句諺語:I hear and I forget. I see and I remember. I do and I understand,而且“試試”其實可以比較簡單,很多時候我們都可以自己動手做。
當然,如果能夠在實際工作中使用,效果會更好,畢竟實際的線上環境和業務複雜度不是我們寫個模擬程式就能夠模擬的,但這樣的機會可遇不可求,大部分情況我們還真的只能靠自己模擬,然後等到真正業務要用的時候,能夠信手拈來。
3)Teaching
一般來說,經過Learning和Trying,能掌握70%左右,但要真正掌握,我覺得一定要做到能夠跟別人講清楚。因為在講的時候,我們既需要將一個知識點系統化,也需要考慮各種細節,這會促使我們進一步思考和學習。同時,講出來後看或者聽的人可以有不同的理解,或者有新的補充,這相當於繼續完善了整個知識技能體系。
這樣的例子很多,包括我自己寫部落格的時候經常遇到,本來我覺得自己已經掌握很全面了,但一寫就發現很多點沒考慮到;組內培訓的時候也經常看到,有的同學寫了PPT,但是講的時候,大家一問,或者一討論,就會發現很多點還沒有講清楚,或者有的點其實是理解錯了。寫PPT、講PPT、討論PPT,這個流程全部走一遍,基本上對一個知識點掌握就比較全面了。
後記成為技術大牛夢想雖然很美好,但是要付出很多,不管是Do more還是Do better還是Do exercise,都需要花費時間和精力,這個過程中可能很苦逼,也可能很枯燥,這裡我想特別強調一下:前面我講的都是一些方法論的東西,但真正起決定作用的,其實還是我們對技術的熱情和興趣!
-
4 # 夢白遊
既然已經碼了幾年程式碼了那麼基礎方面應該是不會太差了,提升的話就要看你發展的方向了。前端的話可以學習新的框架,後端也可以嘗試一下前段做全棧開發。當然如果你對大資料和人工智慧領域有興趣的話也可以嘗試學習一下,提升自己最好選擇一個自身感興趣的方向不然就是浪費時間。有空的時候去git上多看幾套原始碼,多看看書特別是基礎知識方面只有紮實的基本功才能有為後續的提升提供不斷的動力。
-
5 # 傳智播客
接觸過很多的程式設計師大家都有同樣的困惑,就是專案不論大小都是做過的。也感受到過專案做成的喜悅,當然也有受挫。可是把自己拿出來覺得還不算是高手,和真正很厲害的程式設計師相比差距還是有的。其實程式設計師想要提升自己,就是要不滿足現狀。
1.基本功是要紮實的
這裡我指的是離散資料、資料結構還有演算法、作業系統、編譯原理等等,這些都是計算機專業的基本課程。不要因為工作幾年了就覺得這些東西不重要了。雖然這些基礎更偏理論一些,但是實際專案當中還是需要它們來做支撐的。其實我們回頭看來,在很多的專案當中的瓶頸都是因為基本功不紮實造成的。所以我們現在就回顧基礎知識。當了有了很多經驗再回頭去看的時候,一定發現已經有了不同角度的理解。
2.從現在開始養成良好的程式設計風格
也許大家都有自己的編碼風格,在這裡給大家的建議是不管之前是什麼風格的。我們從現在開始都養成好的習慣,也就是變數命儘量開始,規則都統一。程式碼行縮排編排。大家都知道該怎樣排除程式碼中的錯誤,但是往往忽視了對註釋的排錯。但是註釋也是程式的一個重要組成部分,它可以是你的程式碼變得更加容易理解,如果程式碼已經清晰的表達出來了我們的思想,那麼就不需要再去加註釋了。如果註釋和程式碼不一樣,真的是很糟糕的習慣;
3.多讀原始碼
題主說的是有幾年程式碼經驗的程式設計師,那麼也就是大家都是可以寫的程式設計師。那麼如何能讓自己的程式寫的更好,除了上面一條養成風格以外。我們還可以多去看別人的原始碼,這裡不是說誰的什麼專案的都要去看。選擇一些經典的原始碼。
比如我們要研究作業系統的程式設計師就可以深入的讀一下linux最早起版本的原始碼
如果想要研究資料結構和演算法的話就可以仔細的讀一下STL庫或者是boost庫
讀原始碼的話一定是要細讀的,深入理解其中的含義。主要在這裡就是鍛鍊自己能跟的上編寫者的思維。時間久了,我們讀這些東西都會成為自己的,並且咋實踐中得到應用。
4.多思考和交流
程式設計師需要的不僅僅是coding,還要大量的時間去思考問題,也許這就是我們“禿”的原因。有的時候思考的時間是遠遠的大於coding的時間的。不要著急手動程式碼,一個新的專案需求,如果沒有進行足夠的分析和設計就直接動手去寫的話,大家都知道bug一定很多。要留出來思考的時間,一直到把需求分析透了,並且在編碼的過程中會遇到很多的問題,並且都解決了在開始編碼。另外就是多交流,三人行必有我師,三個臭皮匠頂一個諸葛亮,多問問身邊人的問題看法會對我們有很大的幫助和啟發。
-
6 # Java螞蟻
Java中程式設計最常見的套路程式設計:先寫Action層,再寫Service層,再寫Dao層這種方式基本都已經有10幾年的歷史了,這種工業程式碼就是這樣,你要想提高程式設計能力,主要還是程式設計思想,多看看原始碼,多上GitHub上找點優秀的開源專案看看,多自己練練手,多多少少還是有點裨益的。
-
7 # mikechen的網際網路架構
一位優秀的Java程式設計師應該具備哪些技能?寫了幾年程式碼了,我該如何提升自己?這是大多數工作1-3年Java程式設計師們都關心的問題。
1、高階程式設計師/架構師技能圖譜
由於篇幅關係,還有很多技能樹內容就不一 一列舉了,想要領取完整學習技能圖譜,文末有領取方法。
2、深度基礎上延展廣度
我在這裡先說明一下,技能樹所列舉的內容並不是讓大家全部都要會,這既不科學也不現實,建議大家先專注1-2門深入鑽研做到精通,在此基礎上,再廣泛學習延伸技術廣度,精通意味著你在這個領域是專家,你擁有這個領域的核心競爭力,而廣泛學習,即你會得越多,市場競爭力越高,收入也會更高!
3、系統高效學習事半功倍
如何才能系統高效地學習提高,送你最新整理的高階java/架構師學習資料包,助力進階。
1、程式設計師高讚的經典學習圖書9本;
2、技術進階系列專題資料合集88期(配合圖譜,學習更科學);
3、完整學習技能圖譜(知識點一目瞭然,上圖只是其中一部分技能樹)。
2019學習就要先人一步!堅持學習,每天進步一點,至少能讓我們成為一個比大部分人優秀點的人。
-
8 # 夕陽雨晴
關於題主所關注的,我目前也面臨這個問題,工作了三年多後,技術到了一個瓶頸,管理上不上、下不下的那種,工作繁忙之餘,可選擇的發展方向受限,而沒有明確的目標,又困於目前資本寒冬的大形勢,面對如此嚴峻的環境,使人不能不居安思危。未來將走向何方,又怎麼熬過這個寒冷的冬天,有時憂慮到徹夜難眠。或許遇到了什麼情況都能接受吧,但是要面對總還需要勇氣,但技術總要有努力的方向,無論從什麼角度出發,任何時候,有所準備總是不會錯的。
我也將我接下來的計劃做一個分享,希望對於同處於迷途中的小夥伴一些幫助,同時也是對自己計劃的進一步梳理和清晰。初步的計劃是在JAVA虛擬機器和原始碼方面下功夫,同時在理解中介軟體技術的基礎上,增加對系統架構的理解,加強應對複雜業務場景的架構能力,同時結合經歷過的電商場景,針對一些特殊場景的設計能力。
具體的,深入閱讀並消化JAVA虛擬機器,增加對JAVA記憶體模型和JVM調優的認識,結合同事的分享,讓自己在這一領域有自己的認識。花一定的時間去研讀Dubbo中文文件,並結合Apache Dubbo原始碼,在原有Dubbo理解的基礎上,深入理解其內部實踐機制,達到對Dubbo原始碼有一定了解的同時,學習其編碼風格,增強自己的編碼能力。在這兩塊之外,一直在做的JDK原始碼和Spring原始碼的研讀需要進一步加快,同時取得一定收穫。在有餘力的基礎上,Netty、RocketMQ等相關的原始碼或許也有一定研讀的必要。除此之外,在實用性方面,增強對Spring Cloud的生態的理解和實踐,在強化原有Eureka、Consul、Feign、Ribbon、Config、Zuul等認識的基礎上,瞭解Stream、Task、Sleuth、Data Flow等對應的業務場景和設計原理。除此之外,刷leetcode試題也是一個不錯的途徑。
我要分享的大致就這些,個人的想法比較零碎,但是隻要堅持下去,相信自己會有所收穫,對所謂的中年危機,也將更有信心去面對。
-
9 # 說言風語
反問:
1、碼了幾年是指3年、5年、10年、15年還是20年?
2、有一定的開發經驗?這個“一定”怎麼區分?
3、提升自己的程式設計能力?溝通能力?還是什麼?
首先,時間是一個被動因素。時間經歷 ≠ 經驗經歷。只有有意識的提升自己的能力,時間才能最大化被利用。
一定不要誤認為,時間越久的程式設計師越吃香,關鍵要看這個時間久,是重複的時間還是刻意提升的時間。
其次,一定不要想當然的認為經驗豐富。經常看見面試者的簡歷裡有一定的經驗,有深入的經驗,結果才問了三個相關問題,就開始說得模糊不清。這樣的經驗一聽,就知道只是知道大概的概念,會簡單的使用,根本談不上深入,練“一定”都達不到。
一定的經驗,至少說,要清楚安裝使用,常用的用法,優缺點適用不適用場景,深入則要對進本原理有過初步的研究,知道如何參考模式設計新模式,落地實踐避免踩坑等。
經驗不是說出來的,而是不斷實踐總結提煉出來的。
最後,要搞清楚現在到底想要提升什麼?先搞清楚what,再去想how,這樣效果才是最好的,不要說,別人都說提升自己,那自己也跟著提升自己。
你自己到底缺失在哪裡?哪些是掌握的?哪些只是知道表面?只有你最清楚。
關於提升自己,我有三點建議:
1、不斷學習
2、持續實踐
3、反思修正
類比到程式設計上,可以是不斷學習經典的設計模式,也可以是不斷學習新的流行技術,關鍵在於去學習。
然後,在實踐中應用,發現問題,記錄問題。
第三步,總結反思,多問why,多問換個場景能不能用,然後再去實踐。
總結一下,方法很簡單,簡單到大多數人都忽略,但是隻要真正做完過的人都知道,每一步都不簡單,能發散出很多很多點出來。
回覆列表
這個階段要累積經驗和開拓知識面,開始構建自己的知識體系,構建自己的技術棧,選定開發的軟體型別,比如電商系統,還是企業管理系統,還是影片軟體,還是音樂軟體等等。這個階段要選定自己要深入研究的領域,並扎進去。
如果是決定基礎知識體系不足,是可以先把基礎學科全部過一遍。
深入解剖和研究一些頂級開源專案的原始碼也有助於你的提升。
物色一個專業而靠譜的團隊併成為一員也是大有作用的。
以上是我的分享,祝你程式設計愉快。