1. 程式人生 > >程式設計師職業思考與規劃 —— Java程式設計師年度總結:淺談四點心得,也許路走得更遠

程式設計師職業思考與規劃 —— Java程式設計師年度總結:淺談四點心得,也許路走得更遠

一、技術積累

(1)程式碼規範

1.1.1、通常的模組分佈:

一般如果你要實現一個web應用,你從後臺將資料展示到前端頁面,在一個比較大的公司,你少不了跟其他專案有交集(你呼叫他的介面,他依賴你的介面),這樣下來,整個公司有很多個模組,怎麼做到很好的聯絡。回到剛剛的模組分佈,你的一個web應用,應當需要分成三個模組:core模組、service模組、web模組。web模組就是展示到頁面,後臺程式碼而言主要就controller層了,其他邏輯基本都放在core了,service模組就是一些介面類和引數dto等等,介面的實現類在core模組。這樣下來,web模組只需要依賴service模組,同樣的其他系統依賴你的介面也僅僅是依賴service模組,然後利用遠端呼叫方式消費你的介面服務。

1.1.2、程式碼層級結構:針對後臺服務專案,一般分為對外介面層、service層、Dao層。Dao層就是與資料庫交接的介面層,service層主要呼叫Dao或者外部系統的介面,複雜的邏輯基本都放在service層;一些方法需要提供給其他模組呼叫的時候,就封裝在對外介面層,只有對外介面層是暴露。這裡說的只是層級結構,還有與層級結構無關的,也是需要歸類的,比如對外部系統介面方法封裝的我們放在一個目錄下面,一些常量和工具類等我們放在common目錄下面。當然還有其他考慮,儘量讓整個模組有層次感,程式碼才不會太亂,更好的維護。

1.1.3、總結上面兩點:可能不少猿友覺得上面囉嗦又不像程式碼規範,其實這兩點也是程式碼規範的一部分,主要引導大家往結構清晰好維護的思維方向走,多思考吧。

1.1.4、對於一些需要非同步處理的,不要直接new一個thread,應當使用執行緒池。使用執行緒池的時候應當對執行緒數量大小合理設定,一般最大不超過50個,當然還需要考慮你的IO和CPU,怎麼分析網上搜搜吧。

1.1.5、容器類變數,如果變化比較大且頻繁,儘量定義的時候設定初始容量大小,減少擴容帶來的消耗。

1.1.6、分支判斷if…else的時候,最常符合的條件處理放在前面。

1.1.7、物件比較的時候常量放前面,養成好習慣,減少空指標的出現。

1.1.8、減少synchronized中等待處理的程式碼,能放在外面就儘量放在外面。

1.1.9、下面到資料庫了,我覺得還是在這裡說了好點,一般查詢比較慢,很有可能是沒有建索引或者索引沒用到,多去檢查一下。

1.1.10、兩個大表的關聯查詢,可以使用二次訪問資料庫替代,先查出A表的資料,利用關聯欄位再查B表的。不要一味想著一條sql搞定最好。

1.1.11、堅決避免,查全表資料或者數量大的資料,返回list載入到記憶體中,一不小心查了100w資料,又查得比較頻繁,記憶體的爆了。有這種風險的改成分頁查詢。

1.1.12、不要select *,按需取列。

1.1.13、多考慮避免事務裡面有長連線或者長事務,如果大量這種情況出現佔用資料連線,會影響效能。一些無必要的邏輯可以放到事務外執行。

1.1.14、對欄位的加減乘除處理放到sql,嚴格避免先get處理,然後運算在set到資料庫裡面,併發情況非常容易導致失真。

1.1.15、方法裡面程式碼不要太長,注意封裝,命名語義化,程式碼整潔。常掛嘴邊的,沒放心上,一如既往的給自己埋坑,舉個博主的例子,那會剛畢業也是沒放心上,最近把我們組長不寫程式碼,一到程式碼評審我就害怕,檢視到有問題的程式碼,畢業生吧就說這程式碼以前就是這樣寫的,問題最終肯定都落我身上,現在感覺程式碼是自己的孩子,只能有空自己偷偷的優化一下,怕出問題還得非常仔細。

(2)SQL規範與效能優化

1.2.1、先提前宣告,博主工作用到是MySQL,可能有些場景只針對MySQL。說到SQL優化,一些概念必須要理解,不然死記硬背一兩天就忘記了。特別是執行計劃的概念。

1.2.2、什麼是執行計劃:a.決定如何訪問表資料,是否通過索引,是否排序等。b.多表關聯是先訪問哪個表。c.多表關聯時,使用哪種連線方式,不過現在MySQL只有巢狀連線(巢狀迴圈,顧名思義就是將一個表為出發點,將該表全部記錄逐條去遍歷另外一張表的記錄)。

1.2.3、SQL執行順序:a.檢查語法是否正確。b.檢查表是否存在、許可權是否滿足等。c.根據統計資訊(如data length,rows,index length、索引唯一度),生成較優的執行計劃。d.根據執行計劃,進行資料檢索、過濾、合併、排序等操作。訪問資料時,記憶體中如存在表資料,則直接進行操作;否則,從磁帶讀取表資料,放入記憶體,再進行操作;如記憶體不足,則記憶體中較冷資料涮出記憶體,再從記憶體中讀取資料。

1.2.4、索引:查詢的時候如果使用上了索引,可以提高效率,因為建立了索引後,可以理解為資料字典的結構儲存,因此根據條件查詢的時候更加高效。下面看一下MySQL常用的索引型別的概念。 
a.普通索引:在建立普通索引時,不附加任何限制條件。這類索引可以建立在任何資料型別中,其值是否唯一和非空由欄位本身的完整性約束條件決定。建立索引以後,查詢時可以通過索引進行查詢。例如,在student表的stu_id欄位上建立一個普通索引。查詢記錄時,就可以根據該索引進行查詢。

b.唯一性索引:使用UNIQUE引數可以設定索引為唯一性索引。在建立唯一性索引時,限制該索引的值必須是唯一的。例如,在student表的stu_name欄位中建立唯一性索引,那麼stu_name欄位的值就必需是唯一的。通過唯一性索引,可以更快速地確定某條記錄。主鍵就是一種特殊唯一性索引。

c.單列索引:在表中的單個欄位上建立索引。單列索引只根據該欄位進行索引。單列索引可以是普通索引,也可以是唯一性索引,還可以是全文索引。只要保證該索引只對應一個欄位 即可。

d.多列索引:多列索引是在表的多個欄位上建立一個索引。該索引指向建立時對應的多個欄位,可以通過這幾個欄位進行查詢。但是,只有查詢條件中使用了這些欄位中第一個欄位時,索引才會被使用。例如,在表中的id、name和sex欄位上建立一個多列索引,那麼,只有查詢條件使用了id欄位時該索引才會被使用。

e . 全文索引:使用FULLTEXT引數可以設定索引為全文索引。全文索引只能建立在CHAR、VARCHAR或TEXT型別的欄位上。查詢資料量較大的字串型別的欄位時,使用全文索引可以提高查詢速度。例如,student表的information欄位是TEXT型別,該欄位包含了很多的文字資訊。在information欄位上建立全文索引後,可以提高查詢information欄位的速度。MySQL資料庫從3.23.23版開始支援全文索引,但只有MyISAM儲存引擎支援全文檢索。在預設情況下,全文索引的搜尋執行方式不區分大小寫。但索引的列使用二進位制排序後,可以執行區分大小寫的全文索引。

還有空間索引,平時也比較少用。目前只有MyISAM儲存引擎支援空間檢索。目前博主也只接觸過InnoDB儲存引擎。

1.2.5、一般一張表索引不要超過5個,而且避免重複索引,而且也不是建了索引,根據索引欄位條件查詢,索引就會起作用。

1.2.6、一般哪些場景會導致索引失效:a.使用like關鍵字匹配字串第一個為”%”的場景。b.條件中包含or、in、not in、<>關鍵字,預設不走索引的。c.訪問表上的資料行超出表總記錄數30%,變成全表掃描。d.查詢條件使用函式在索引列上,或者對索引列進行運算。e.多列索引中,第一個索引列使用範圍查詢,只能用到部份或無法使用索引。f.多列索引中,第一個查詢條件不是最左索引列,上面多列索引概念中也有提到。肯定還有更多的場景,但是博主現在能想到的場景就這些了。

1.2.7、不能同時使用兩個索引,一個過濾資料,一個用於排序(主鍵除外)。

1.2.8、DML語句如果使用索引,會導致lock全表;如果使用了非唯一索引,可能只是鎖住一定範圍。對此,建議更新/刪除資料儘量用上索引,如果可以最好用上主鍵或唯一索引,另外事務要及時提交。

(3)關於事務的一些建議

如果沒有聽過事務這麼個概念,網上了解學習一下,先理解一下各個事務型別的含義吧:a.日誌記錄儘量放在獨立事務裡面,避免後面的異常發生導致日誌丟失。b.上面已經幾次提到,儘早提交事務,避免事務過長,因此寫程式碼的時候,一些可以不放到事務的邏輯可以移到外面,長事務看能否拆成兩個事務。

(4)關於資料庫連線池

可能一些猿友都少去注意吧。先來看看一些引數,這裡只羅列了博主比較關注的,更多的可以自行檢視一下配置。 
initialSize : 預設值是 0, 連線池建立連線的初始連線數目。 
minIdle : 預設是 0, 連線數中最小空閒連線數。 
maxIdle : 預設是 8 ,連線池中最大空閒連線數。 
maxActive : 預設值是 8, 連線池中同時可以分派的最大活躍連線數。 
maxWait : 預設值是無限大,當連線池中連線已經用完了,等待建立一個新連線的最大毫秒數 ( 在拋異常之前 )。 
validationQuery : 一條 sql 語句,用來驗證資料庫連線是否正常。這條語句必須是一個查詢模式,並至少返回一條資料。一般用“ select 1 ”。 
minEvictableIdleTimeMilis : 預設值是 1000 * 60 * 30(30 分鐘 ) 單位也是毫秒,連線池中連線可空閒的時間。 
timeBetweenEvictionRunsMilis : 預設值是 -1 ,每隔一段多少毫秒跑一次回收空閒執行緒的執行緒。

對於minEvictableIdleTimeMilis、timeBetweenEvictionRunsMilis這兩個引數,timeBetweenEvictionRunsMilis必須大於1且小於minEvictableIdleTimeMilis,建議是minEvictableIdleTimeMilis的五分之一或十分之一。

(5)對於前端的幾點建議。

1.7.1、一些圖片壓縮後再使用,效能方面提高不小吧(可以使用熊貓圖片壓縮)。雖然自己前端比較菜,但是估計也有不少猿友跟我一樣偶爾需要兼顧前端吧。畢竟剛畢業不久。

1.7.2、關於移動端頁面重構相容不同螢幕大小的問題,建議doc的fontSize,實時獲取螢幕的寬度,然後除以320再乘以16,當然16可以根據自己情況去調。然後其他一些單位儘量用rem,這樣無論什麼大小的螢幕都等比例縮放。感覺比@media效果好很多。

關於技術積累這一塊,之前羅列的提綱還挺多的,寫到後面感覺沒什麼精力了,有些三言兩語似乎說不清楚啊。

二、工作心得

(1)溝通協作第一:

工作中必然少不了團隊協作,積極主動去溝通的人做事總是更加靠譜。道理大家都懂。但是我們需要把想法問題,簡潔明確的表達給對方。另外總是以溝通的心態面對問題,而不是抱怨。如果覺得上級分配的任務難度太大了,你可以嘗試跟他溝通,獲取他有很好的建議或解決方案。

(2)謹慎記錄與排漏:

感覺現在挺經常是開一兩個會,測試同時偶爾找你排查一下環境問題,一天下來其實寫程式碼的時間並不多。一些關鍵點,非常建議提前記錄下來,方便接回被打斷的思路,同時避免一些邏輯或功能點的遺漏。

(3)思路清晰與效率:

建議動手寫程式碼之前,建議先理清思路,關鍵邏輯,需求細節,這樣後面寫程式碼的時候效率比較高,而且質量也比較好。

(4)主動與多管閒事:

清楚自己的工作範圍,自己心裡有個界限,有些屬於別人工作範圍的事情,可以你提出的建議是好的,但是最好還是在合適的場景和時機提出。

(5)心態與工作狀態:

程式設計師,總會有被坑的時候,或者不順心的時候,儘量嘗試控制一下自己的心態。

(6)可持續發展觀看待技術與業務:

這點是我自己希望做到的。對於責任心而言,或者是說一個優秀的程式設計師。很多時候並不是完成產品提的需求就好了。多為它著想,程式碼可維護性和擴充套件性高不高。一些功能點也可以提出自己的想法,不要總是被動的接受產品的需求,業務功能拓展性好的話,可以減少產品改動需求。

三、學習方向與職業發展

(1)先廣後深還是先深後廣:

對於博主而言,其實接觸的技術點還算比較多的,但是瞭解的都不深入,個人性格而言,比較偏向於實用驅動,如果在實際使用場景有用到再去深入學習,這樣邊學邊用才能比較集中注意力。像一些同事,他們喜歡把一樣東西研究得很深。

(2)業務經驗也應當注重:

技術人員必然是技術優先,但是等你到了一定工作年限,其實業務經驗也是非常重要了。之前領導找我年度工作談話就有說過他們招高階工程師的時候對業務經驗也非常看重,是否有自己獨特的見解。相通道理大家都懂,但是平時有沒有這樣的意識,有沒有去做又是另外一方面了。平時也可以多學習業務方面的知識。

(3)相同的工作年限為什麼當過專案經理的人更吃香:

因為他們對業務理解更加深入,程式碼質量問題落在他頭上,專案的人員協調與時間安排規劃,責任越大,思考的問題就越多,遇到的問題處理經驗就越豐富。把控能力也比較強。

(4)怎樣能進入學習狀態,並且堅持:

要想集中注意力學習技術,需要安靜的環境,需要耐得住寂寞,因此你需要沒有人打擾的環境,比如在一個集體居住環境,幾個朋友一起住,一般多數回想著去哪玩,朋友在玩遊戲,估計也是對你的一種誘惑吧。可以早點到辦公室學習或下班學習一段時間再回去。或者選擇自己一個人住。

(5)如何把握住學習的時機:

學習最能集中注意力的情況是有著比較強的好奇心和求知慾。所以一般一些技術分享或者老員工討論的問題,可能很多概念知識你都不懂,這時候你就可以去學習瞭解這些知識。或者你工作中遇到的問題,儘量刨根問底的去弄清楚是什麼原因導致的,不要一些老司機幫忙解決了就一了了之。或者是其他同事遇到的問題,你都可以去了解一下。

(6)你更適合走一條怎樣的職業道路:

剛畢業不久的猿友,一般都是會比較心浮氣躁的,對技術求知慾很強,特別是一些高大上的技術,什麼大資料雲端計算架構等等,有些偏向於技術研究,有些偏向於業務。大部分程式設計師可能都會選擇偏向於技術研究的,於是乎對偏向業務的不怎麼感冒,因此覺得天天做這些東西沒什麼意思。這時候,靜下來分析一下,你到底適合哪種方向。你能否靜下心來對技術研究很深入,能否耐得住寂寞。

四、關於生活

(1)良好與糟糕的生活狀態的區別:

需要警惕一下自己是否進入了一種糟糕的生活狀態,工作上不溫不火,似乎現在的技術已經足夠用了,完全沒有目標沒有計劃,無法集中注意力學習,日子就這樣一天天過去。

(2)17年自己的一些期望吧:

希望活得更堅定些,保持著一定的求知慾和規劃,向成為自己希望成為的人努力吧,包括一些習慣、處事方式等等。

原文出處 http://blog.csdn.net/u013142781