大家好,我是小羽。
好久不見,給大家帶來個好訊息,小羽的全新專題「程式設計羽錄」系列正式上新,主要是介紹一些關於面試題和經驗總結的文章。
會為大家提供一些技術棧之外,程式設計師還需要的其他方面硬核知識,做到全面發展,才能在這個日趨激烈的社會,在未來有更好的發展空間。
話不多說,本期為大家介紹的是關於一些程式設計師必備技能介紹,相信掌握這些編碼內外的技能,我們會朝優秀軟體開發人員更近一步。
下面就來看看我總結的這些技能,準備好進收藏夾(吃灰)了嘛?
編碼之內
程式碼規範
程式碼規範化帶給我們的第一個好處就是看著很整齊、很舒服。
雖然說我們現在可以用不規範的方式寫程式碼,現在能看得懂,但等過了幾個月後,你再回頭看時估計就兩眼懵圈了。更不要說萬一專案迭代開發,交接給其他人了,所以程式碼一定要寫規範。
下面的是我總結的一些程式碼規範注意事項:
編碼方式:統一用 UTF-8
,一般情況下不要去改動它。
縮排:統一為 4 個空格,將 Tab size 設定為 4 則可以保證 tab 鍵按 4 個空格縮排。
括號:花括號不要單獨一行,和它前面的程式碼同一行。而且,花括號與前面的程式碼之間用一個空格隔開。
空格:if、else、for、switch、while 等邏輯關鍵字與後面的語句留一個空格隔開;運算子兩邊各用一個空格隔開;方法的每個引數之間用一個空格隔開。
空行:將邏輯相關的程式碼段用空行隔開,以提高可讀性。空行也只空一行,不要空多行。
變數:一行宣告一個變數,不要一行宣告多個變數,這樣有利於寫註釋。
推薦書籍:
程式碼整潔之道
命名規範
想必程式設計師一想到命名都很頭疼,當遇到混亂或錯誤的命名不僅讓我們對程式碼難以理解,更會誤導我們的思維。
良好的命名,則可以大大提高我們的程式碼易讀性,也能大大增強程式碼的可維護性。
下面的是關於命名規範的一些基礎:
包命名:域名反寫 + 專案名稱 + 模組名稱,全部單詞用小寫字母。
類和介面命名:使用大駝峰規則,用名詞或名詞片語命名,每個單詞的首字母大寫。
方法命名:使用小駝峰規則,用動詞或者動名詞命名,第一個單詞的首字母小寫,其他單詞的首字母大寫。
常量命名:全部為大寫單詞,單詞之間用下劃線分開。
變數命名:範圍描述 + 意義描述 + 型別描述的組合,用駝峰式,首字母小寫。
註釋規範
我們也一定要養成寫註釋的好習慣,當我們在寫某個程式的時候,可能當下記得很清楚,這一段是什麼機制、如何實現,但是當你寫的程式越來越多,你會忘記當初為什麼這樣寫,改動和交接也十分麻煩,對程式碼進行註釋就可以有效避免這種情況。
註釋不僅可以讓人讀懂程式碼,甚至能讓讀程式碼的人獲取更多資訊。
下面是關於註釋規範的一些建議:
檔案頭註釋:檔案頂部統一新增版權宣告。
類和介面註釋:類和介面統一新增 javadoc
註釋。
方法註釋:方法的用途和引數說明,以及返回值的說明。
變數和常量註釋:優先採用右側 //
來註釋,若註釋說明太長則在上方新增註釋。
框架
Java 是目前最熱門的程式語言之一,隨著 Java 面嚮物件語言的流行以及多層架構應用的出現,使得應用程式的可複用性得到了大大的提高,框架這個東西也在應用程式中開始出現,並得到了廣泛的使用。
在面試中,面試官一般來說會問你一下你們專案中使用的框架,然後給你一些場景問你用框架怎麼做。
整理的目前較受歡迎的 Java 框架:
SpringMVC:使用了 MVC 架構模式的思想,將 web 層進行職責解耦,基於請求-響應模型。
Struts2:用於構建當代 JavaEEWeb 應用程式,可以幫你快速搭建出一個MVC模型出來。
Hibernate:是一個開放原始碼的物件關係對映框架,是一個全自動的 orm 框架,可參考:
「連Hibernate技術都不清楚,你敢說你自己會ORM框架?」
Spring:是一個開源開發框架,是一個輕量級控制反轉(IOC)和麵向切面(AOP)的容器框架,可參考:
SSH:是 JAVA EE 中三種框架所整合,分別是 Struts,Spring,Hibernate 框架所組成,是當前比較流行的 java web 開源框架。
SSM:是三層結合所成的框架,分別是 Spring、SpringMVC、MyBatis 所組成。
Mybatis:是一個簡化和實現了 java 資料持久層的開源框架,它抽象了大量的JDBC冗餘程式碼,並提供了一個簡單易用的API和資料庫互動。
Springboot:是一個全新的框架,簡化 Spring 的初始搭建和開發過程,使用了特定的方式來進行配置,讓開發人員不再需要定義樣板化的配置。
Dubbo:是一個分散式服務框架,致力於提供高效能和透明化的 RPC 遠端服務呼叫方案,以及SOA服務治理方案,可參考:
「微服務面試必問的Dubbo,這麼詳細還怕自己找不到工作?」
Apache Shiro:是 Java 的一個安全框架,旨在簡化身份驗證和授權。
SpringCloud:是微服務的一種解決方案,依賴 SpringBoot 實現。包含註冊中心(eureka)、客戶端負載均衡(Ribbon)、閘道器(zull)、分散式鎖、分散式會話等,可參考:
資料庫
資料庫是很重要的一部分,無論對於面試還是工作中,都是一個老生常談的話題。
比較重要的是資料庫優化部分,小羽之前總結過一篇關於 MySQL 優化的文章,想要了解的可以到下面文章檢視:
最常見的資料庫模型主要是兩種,即關係型資料庫(SQL)和非關係型資料庫(NoSQL)。
關係型資料庫:
•大型:Oracle、DB2•中型:SQL Server、MySQL
•小型:Access
非關係型資料庫:
•臨時性鍵值儲存(memcached、Redis
)•永久性鍵值儲存(ROMA、Redis)•面向文件的資料庫(MongoDB、CouchDB)•面向列的資料庫(Cassandra、HBase)
經常使用的是 Redis,可以參考這篇文章理解:
「玩轉Redis|學會這10點讓你分分鐘拿下Redis,滿足你的一切疑問」
常見資料庫:
常見資料庫
資料結構
身為程式設計師的我們,每天都在和不同的資料打交道。那麼我們真的對資料結構一清二楚了麼?
小羽的文章中也詳細的圖文介紹了各種資料結構的使用:
對各類資料結構進行了分類,並且從定義、特點、原理解析使用方法以及實現的相關案例相結合:
•棧 stack•佇列 queue•連結串列 Link•雜湊表 Hash Table•排序二叉樹•紅黑樹•B-TREE•點陣圖
資料結構推薦書籍:
大話資料結構
演算法
演算法無論是對於學習還是工作,都是必不可少的。我們掌握了這些演算法背後的邏輯思想,那麼是會對我們的學習和工作有很好的促進作用的。
我在之前的文章中詳細介紹過一些關於 Java 經典演算法:
主要有以下經典演算法,詳細介紹了各個演算法的簡介、應用場景、步驟、程式碼示例:
•二分查詢•氣泡排序演算法•插入排序演算法•快速排序演算法•希爾排序演算法•歸併排序演算法•桶排序演算法•基數排序演算法•剪枝演算法•回溯演算法•最短路徑演算法•最大子陣列演算法•最長公共子序演算法•最小生成樹演算法
演算法推薦書籍:
演算法圖解
版本管理
在現在市面上的大部分公司的程式碼都是通過版本管理工具來進行託管的,從之前的 SVN 到現在基本人人必用的 Git。
我們需要了解 Git 的每一個具體命令和引數使用,知道執行每個命令會做什麼,避免各類分支或者 fork 操作引起的衝突問題。
可以幫助我們:
1.儲存開發過程中的程式碼,方便後續修改。2.能清楚的看到每一位團隊成員提交、修改的程式碼,責任到人。3.方便我們完成協同開發的任務,高效工作。4.為後續客戶提供關於專案不同版本的記錄。
關於程式碼版本管理的工具有很多,下面是我常用的:
•SVN:替換了當年開源社群最為流行的版本控制軟體 CVS,在 CVS 的功能的基礎上有很多的提升同時也能較好的解決 CVS 系統的一些不足。•Git:用於 Linux 核心開發的版本控制工具,採用了分散式版本庫的作法,不需要伺服器端軟體,就可以運作版本控制,使得原始碼的釋出和交流極其方便。•GitHub:GitHub 是目前為止,使用者最多的工具了,而且也有很多的開源專案提供,一直都是程式設計師最鍾愛的平臺,想要學習的話,都可以去下載專案來學習。
主流工具:
主流工具
構建工具
構建工具和版本管理一樣重要,公司實際開發中我們需要對 Jar 包進行依賴管理,目前主流的構建工具是
maven
(大部分城市) 和gradle
(西安使用比較多)這兩款。要想成為一個標準的軟體開發人員,我們不僅要學會使用這些工具構建,也要掌握髮生依賴衝突該如何解決。
當然,除了 maven 和 gradle,這裡也有其他一些構建工具,感興趣的都可以瞭解下:
Hudson:用Java編寫的持續整合(CI)工具。
Jenkins:用 Java 編寫的一個開源持續整合工具。專案是在和 Oracle 發生爭執後的來自於 Hudson 的分支。
Apache Ant:用於自動化軟體構建過程的軟體工具,源於 2000 年初的的 Apache Tomcat 專案。
SBT:用於 Scala 和 Java 專案的開源構建工具,類似於 Java 的 Maven 和 Ant。
Atlassian Bamboo:持續整合和交付工具,它將自動化構建、測試和釋出捆綁到單個流程中。
TeamCity:來自於 JetBrains 的一個基於 Java 構建的管理和持續整合伺服器。
Grape:嵌入到 Groovy 的 JAR
依賴項管理器。
Ivy:Apache Ant 專案的一個子專案,一個可傳遞的依賴項管理器。
Leiningen:一個自動化構建和依賴性管理工具,用於使用 Clojure 程式語言寫的軟體專案。
常用:
Jenkins
單元測試
我們在平時開發過程中,當完成自己的功能模組後,都需要自測一遍,這樣可以保證程式碼的準確性,減少不必要的 bug 出現。
小羽用的最多的也就是 junit 進行單元測試了,使用的是 junit4 這種基於註解的方式來進行單元測試。
常用註解:
1、為了和 spring 整合獲取配置的 bean, 通常使用 @RunWith
來載入 springjunit 這個核心類;
2、使用 @ContextConfiguration
來載入相關的配置的檔案;
3、通過 @Resource
按名字來注入具體的 bean, 最後在需要測試的方法上面加上 @Test 來進行單元測試。
測試原則:
•原始碼和測試程式碼需要分開;•測試類和目標原始碼的類應該位於同一個包下面,即它們的包名應該一樣;•測試的類名之前或之後加上 @Test
,測試的方法名通常也以 test 開頭。
程式碼示例:
@RunWith(SpringJUnit4ClassRunner.class)//執行spring相關環境 相當於spring監聽功能
@ContextConfiguration(locations={"classpath:spring-common.xml","classpath:spring-datasource.xml"})//讀取spring配置檔案 不識別* 只能識別具體檔案 多個配置檔案使用string資料傳遞
public class TestSpring {
//注入Service層
private @Resource UserService userService;
@Test
public void testFind(){
List<User> userList = userService.findAllUserInfo();
for (User user : userList) {
System.err.println(user.toString());
}
}
}
想要學習更多關於單元測試的知識,可以到這篇文章檢視:
程式碼除錯
程式碼除錯在我們開發中,用的最多的是屬於 debug 了,就是我們常說的打個斷點,跟著程式一步一步執行,看哪一步有問題,從而排查 bug,是我們解決問題最有效的手段。
當然我們一定要有問題排查的能力,定位到問題來解決。此外,也要學會檢視日誌,日誌能清楚記錄我們每一步都做了什麼。
這裡也給大家提供一些線上除錯的網站:
codepad:一款簡單的線上 IDE 編輯器服務,只需要把程式碼貼上進去就可以編譯執行了,支援C、C++、PHP、Python等 9
種程式語言。
Ideone:一款線上的編譯器和除錯工具,它可以讓你來編譯,執行,測試和程式碼,支援 Java、 JavaScript、PHP、Python 等 40
多種程式語言。
PractiCode:是一款線上 Web
程式碼除錯工具,支援HTML、CSS、JavaScript、VBScript 和 PHP 等語言。
cssdesk:是一個線上除錯 CSS
程式碼的工具。
Google Code Playground:是一款線上除錯各種 Google JavaScript API
的工具。
推薦:
IDdone
重構程式碼
每個程式設計師都需要有最基本的能力去重構目前已有的程式碼,使程式碼達到最優但卻不能影響任何的已有的功能。
小羽整理了一些關於程式碼重構的常用方法:
•提取子函式•公共方法放到父類中•下移函式到子類•封裝固定的呼叫邏輯•使用泛型去除重複邏輯•函式避免過多的入參•轉移函式,函式職責分明•狀態模式•避免物件為 null•拆分功能
推薦書籍:
重構
閱讀原始碼
這個對於我們日後想要更好的晉升空間或者拿到更高的薪資是很重要的。所以我們平時要多閱讀原始碼,掌握底層實現。
雖然會花費我們大量的時間精力去深刻專研,但是當你面試時候,能對某一個技術點的原始碼給面試官一陣輸出的話,那麼面試的主動權就會掌握在你的手裡。同時多閱讀原始碼,對於我們解決 bug 也有幫助。
總結一下在 IDEA 中如何閱讀原始碼:
1.定位到構造器/方法實現類2.檢視類層級關係3.檢視類結構4.原始碼統計5.具體原始碼
問題排查與解決能力
我們選擇開發這條路,會遇到形形色色的問題,發生問題的時候,就是檢驗程式設計師能力的時候。很多時候,解決問題並不難,難的是定位問題。
這裡面會涉及到很多知識,對於我們的知識儲備很重要,所以平時一定要做好積累。
也可以從以下幾個方面來提升自己的能力:
•日誌的檢視•分析Java的堆疊資訊•叢集監控指標的檢視
日誌可以在這塊瞭解:
面向Google程式設計
國內已經有百度了,為什麼大部分程式都會去選擇使用谷歌呢,因為百度搜尋出來的東西太雜,例如你搜尋一個技術類的東西,但是百度可能會搜尋很多不相干的東西,而谷歌搜尋的結果會更加的專業化,這樣尋找你需要的資訊的時候會更有效率。
普通程式設計師是物件導向程式設計的,而真正的高階程式設計師則是面試 Google 程式設計的,學好正確的使用 Google 程式設計是很重要的,同時也是因為 Google 的 Chrome 瀏覽器自帶了豐富的外掛,對於我們程式設計師也十分友好。
我之前介紹的一些關於 Chrome 瀏覽器外掛的介紹:
有問題,多 Google:
編碼之外
筆記
網際網路這個行業更新換代很快,需要保持不斷的學習,學習的知識點很多,光靠大腦不可能全部記得住。
我們可以把平時記錄的技術點、知識、好文章儲存或者記錄在筆記上。
小羽在這裡推薦幾款我使用的不錯的筆記:
•有道雲•印象筆記•OneNote•語雀
推薦語雀:
語雀
MarkDown
Markdown 是一種可以使用普通文字編輯器編寫的標記語言,通過簡單的標記語法,它可以使普通文字內容具有一定的格式。
我一般都是使用 typora
,這款介面簡潔,支援實時預覽,支援多種公式型別,支援TOC等標籤這款先編寫好,然後複製到自己喜歡的編輯器裡進行渲染格式,最後釋出文章到各個平臺。
推薦 Typora:
Typora
學會寫作
寫作是一個非常好的「進階」 方式。但是平時我們的程式設計師同學都會很忙有很多事,導致了我們沒有太多的時間,同時也很難持續的進行寫作,那麼我們應該要如何堅持寫作呢?
其實是無論堅持什麼事情都不是一件容易的事情,寫作可以先從技術部落格開始,後面也可以寫一寫生活中的事情。反正就是先讓自己寫起來,先寫起來之後養成習慣,你會受益一輩子的。
一般都會選用上面所說的 Markdown 語法寫作,編輯工具也很多,線上的、PC端的都有。
比如我書籤裡的這些:
編輯器
團隊協作
我們開發過程中,無論哪一個專案都是很多人一起完成的。任何程式設計工作不可能會讓你自己一個人完成,我們自己寫的的程式碼必須與別人的互動或者混合。就算很優秀的程式設計師,如果無法與別人協作,都會給專案造成負面影響,對公司的正常運營造成影響。
作為一個合格的程式設計師,我們更應該學會與人合作。有一句話我記得非常清楚,沒有一個人的成功,每個人的成功都是建立在和別人合作的基礎之上的, 我們是一個整體,需要共同面對困難,一起分享成功。
下面的方法可以參考:
•分工合理,責任明確,模組化•高效的溝通機制(聊天軟體,任務皮膚,郵件等)•定期檢查,及時調整(codeReview
、日報、週報、大小會議)
不斷學習
在日常開發中,一定要學會去 github 等網站上,學習一些別人的優秀開源專案,學習別人的思想和構架,學習別人的邏輯。
總結自己編碼過程中的侷限性,只有在不斷的學習過程中,才能使的自己的技術不斷上升。
之前整理過一些關於學習平臺網站的總結:
我書籤中的學習網站:
學習網站
建立自己的產品
作為軟體開發人員,我們不僅能夠開發軟體產品,還可以開發書籍和視訊這樣的資訊產品。
我認識的很多大佬,都與出版社有合作關係,出版了自己的書籍,或者入駐 b 站等視訊領域有不錯的成績,這對於個人的 ip
塑造以及後續發展會提供很好的影響力。
我認為應該具備以下能力:
•要選擇好方向,多調研,瞭解使用者的需要。•在開始之前,儘量先去市場做看看有沒有同類產品,瞭解現狀。•注重好細節,以免後續產品缺陷太多。
在以下平臺都可以嘗試:
創作平臺
身體是革命的本錢
程式設計師的工作,大多是坐在電腦螢幕前,一坐就是幾小時,缺乏鍛鍊,我們當中很多人都會得頸椎病,還有得了脂肪肝,一些人得了腰間盤突出,以至於年紀輕輕,身體就不行了。
所以,一定要愛護自己的身體,學會養生,不僅是對自己負責,也是對社會負責。
小羽在這裡給出的一點建議:
•保持充足的睡眠•養成規律的飲食•堅持健身•多跑步走動•合理的加班•培養其他興趣
學會技術輸出和分享
將學到的程式設計知識寫下來,並且將它分享給其他的程式設計師,將讓你變得更優秀。寫文章的好處是多方面的。你能夠分享想法,並幫助全世界的程式設計師
我們應該把每天學習的知識、技術,或者是看書的心得體會,用自己的方式表達出來。可以通過發部落格、公眾號等等平臺,也可以通過視訊的方式。
在我書籤裡的這些平臺,我都會堅持在每個平臺分享:
部落格網站
嘗試自媒體
什麼是自媒體呢?從名稱屬性來看,很簡單,就是自己做自己的媒體,自己將自己的東西分享出來,就是自媒體。
對於我來說呢,我覺得自媒體還是很有前景的,有很多人說哪個型別自媒體已經很晚了。我覺得只要你自己用心做這件事,什麼時候都不算晚。成功都是屬於那些堅持到最後的人的。
我之前也分享過一些關於自媒體的心得和總結:
「人人自媒體的時代,程式設計師該如何利用好自己的優勢?我記住了這些神器...」
「寫給普通人看的自媒體分享|萬事開頭難,勇於分享自己,我們都很棒!」
需要我們平時多收集整理一些需要會用到的方方面面的工具,才會如魚得水,應用自如:
自媒體創作工具
多看官方文件
官方文件遠比網上的各種部落格和論壇等更適合入門學習。當我們遇到很多問題和技術細節的時候,認真將官方文件過一遍,你會發現很多問題和認識模糊的地方都會清晰起來。
程式設計師都應該掌握通過官方文件去學習一個技術的能力,掌握了這項能力,你就具備了學會其他一切技術框架的基礎;而且最原始的官方文件,還能鍛鍊你的自我學習總結能力。
Spring 官方文件示例:
Spring官方文件
培養自學能力
程式設計師無論合適都要有一顆保持學習的心,因為技術更新快、需求變化快,我們不學習就會被淘汰。
機會和挑戰只會分配給有準備的人,當我們有機遇能進更好的公司的時候,還是需要依靠自身的硬實力的,這個時候如果我們長期自學積累知識的話,相信都可以把握住任何機會的。
我認為自學應該從這幾方面入手:
•先確定好當前的方向•做好長期吃苦的準備•有規律有目的型的學習•在一個安靜的地方學習•利用好現有的網路資源與書籍**
我雖然是做 Java 的,但是有時間也會去了解其他語言的書籍:
技術書籍
英語水平
對於我們來說,因為技術文件都是英文的,雖然閱讀別人的文件可以通過翻譯成中文文件來檢視,但是一味相信翻譯並不可取,畢竟有錯誤和疏漏有時候都不知道。
而且我們程式設計每天都在和英語打交道,有更好的英語水平,對我們程式碼的命名等等都會有很大的幫助。
推薦幾款不錯的練習英語的軟體:
•百詞斬•羊駝英語•扇貝單詞•有道詞典•英語流利說
推薦百詞斬:
百詞斬
擴充套件人際關係
程式設計師是一個長時間在電腦旁邊的人類,我們的業餘時間不多,週六日可能還加班,所以封閉性很強。
但是我們一定要抽出時間來維護自己的人脈管理。本身壓力也比較大,有了更多的朋友的話,我們閒時也可以一起約出來,聊聊天,談談未來的發展。每個人的格局都不一樣,多多交流,才能不斷進步。
下面我給大家說一下我是怎麼維護自己的人脈:
•要學會主動聯絡•多參加一些社交活動•像優秀的人多取經•線上線下都可以認識
良好的邏輯思維
邏輯思維能力是我們學習、工作、以及生活中必不可少的一種能力。
擁有良好的邏輯思維,有助於我們高效地學習,工作,以及生活。總之,練好邏輯思維,可以讓我們變聰明、變自信,脫穎而出。
•結構化思維:把事物組成框架,分類、有序的整合起來•系統化思維:整體考慮,注重每一個聯絡。•打破定勢思維:要學會創新,增加求知慾。•情緒控制:合理控制自己的情緒。•換位思考:發生事情衝突,也要在別人角度考慮。
時間管理能力
時間就是金錢,效率就是生命,一點也不過。我們現在這個社會大部分人都有拖延症,該如何解決呢?
其實現在影響我們最大的就是手機了,相比大部分都會一有閒暇時間就會大有手機上的娛樂軟體(短視訊之類)來打發時間,避免這樣,我們就需要一些時間管理工具來改善。
給大家介紹一些我覺得不錯的時間管理工具:
•番茄 ToDo•Forest 專注森林•滴答清單•小日常•Pendo•塊時間•極簡代辦•Todolist
推薦滴答清單:
滴答清單
最後
哈哈,不好意思,因為很久沒更文,所以這一篇就寫的有點多了,也算是補上欠下的文章。但是以上列出來的這些清單我相信你用心讀完後,肯定還是會有所收穫的。
的確,軟體開發最重要的技能是提升技術,只要完成任務即可,但是一味的為了完成公司程式碼而程式設計我覺得並不可取。
我們也要為自己的未來考慮,畢竟擺在我們面前的 35 歲抉擇是遲早會到的,所以不斷提升自己的各方面技能才能起到未雨綢繆的作用。
最後一句話,送給大家:硬實力決定下限,軟實力決定上下限。編碼之外的軟實力也是我們不斷前進的源源動力,一起加油吧!