軟件開發之技能梳理

摘要:根據個人開發實踐及理解,梳理了做爲軟件工程師解決現實問題應當具有的基礎技能。nginx

難度:中級。程序員

      編程開發本質是運用程序和計算機來解決現實中的各類問題。所以,編程開發人員的才智發揮載體是計算機或者說計算設備,直接武器是程序。程序員用來進行編程開發所須要的技能,歸結起來主要以下:正則表達式

  • 理解計算模型和框架: 順序計算、併發計算 (並行計算、分佈式計算); 理解應用所基於的計算模型和框架是很是重要的。傳統應用一般基於順序計算,而現代商業應用,好比雲計算,一般基於分佈式計算架構; 大規模的科學計算應用, 好比基因序列計算, 則基於並行計算。算法

  • 高效的數據處理:熟悉經常使用數據結構和算法設計,可以針對計算目標設計高效的數據結構和算法並實現之, 知足性能需求。數據庫

  • 大容量的數據管理與檢索:至少精通一種主流數據庫, 從數據處理中分離出的一種專門針對大量應用數據實時檢索要求的技術。apache

  • 系統底層機制: 進程、信號、 內存管理、API 等, 理解相關概念及實現,熟悉使用Linux&MacOS&Windows至少一種操做系統。編程

  • 進程的網絡通訊: TCP/IP socket , RPC ,Http , 序列化與反序列化, 熟悉網絡程序設計的底層原理。設計模式

  •  編程語言: 面向過程、面向對象、腳本語言、函數型、瀏覽器語言等,最好每種類型語言掌握一種。數組

  • 正則表達式:靈活地操做文本和字符串。瀏覽器

  • 代碼閱讀與維護:  可以讀懂代碼,維護代碼,重構或擴展代碼。

  • 錯誤處理技術: 異常機制、 返回值與全局變量、 直接退出或重續 等; 建造穩固可靠的應用的必要基礎。

  • 網絡搜索:  尋求有益資源、遠程協做夥伴及有效解答。

  • 程序質量: 保證程序的時間性能、空間性能、安全性、可靠性、可用性、 可擴展性、可讀性、可維護性、可移植性、用戶體驗。

  • 設計模式:  解決實際的設計開發問題, 在現有項目的基礎上擴展功能模塊時應該會常常用到。

  • 系統架構:  用於子系統的設計, 須要項目經驗積累。

  • 處理大數據量:  一般基於分佈式計算架構,好比雲計算基礎設施。

  • 選用可靠的工具及軟件庫、包:   首先必須肯定具體需求,深刻了解各類工具、技術與框架及其優劣,而後根據需求選擇最適合的那種。

  • 診斷和修復計算機或程序的故障:  上網搜索已有解決方案;根據原理進行推斷和驗證猜測; 排查縮小範圍; 對比分析; 打印信息。

  • 除了編程的其它使用計算機解決問題的技術和方法: 好比使用現有的軟件。

         

        針對每一個問題,將本身掌握的技術和方法整理出來,並使用示例來講明,基本上就能夠了解本身的技術水平了,同時亦可備往後用。積微知著。人們常說的那些「大技能」,其實能夠分解爲大量的微技能,而積累越多的微技能,在處理問題時便有了越多的選擇和思考餘地。具體而言:

  1. 語言: 至少熟悉六種編程語言,掌握兩種編程語言。 「熟悉」是指大量學習和使用過,「掌握」是指可以使用該語言 構建大型可靠的軟件系統。  對象式,函數式, 過程式,客戶端語言,腳本語言,數據語言。 例如, Java / Scala / Python / C / Shell / JavaScript / SQL ;

  2. 工具: 編輯器 + IDE + 工程構建 + 版本控制 + 控制檯 + 瀏覽器 + 筆記軟件。 例如 Vim (Sublime) / IntellJ / Maven / Git / Shell / Chrome;

  3. 方法: 自頂向下,意圖導引,自底向上; First Right, then Good ; 預先設計, 及早動手; 迭代式開發、發佈、反饋和成長 ; 預估時間; 

  4. 風格: K&R C ,  Java 編程規範, 排版整潔,代碼簡潔無冗餘, 一致, 使用地道表達範式;

  5. 模型: 串行, 併發,多進程, 多線程, MapReduce , B/S , 異步, 回調,阻塞, 非阻塞,並行,分佈式;

  6. 思想: 結構,控制,過程, 對象, 函數,聲明, 原語, 集合, 組合, 抽象, 封裝,複用,分層,模式,分治,緩存,中斷,數學性質;

  7. 算法: 分治, 遞歸,動態規劃, 時空權衡, 貪婪算法,優先級算法,迭代改進,深度遍歷,廣度遍歷,問題轉化;  

  8. 排序: 插入排序, 選擇排序,快速排序, 堆排序, 歸併排序,基數排序,外部排序;

  9. 搜索: 順序搜索, 二分搜索, 哈希搜索, 深度優先搜索,廣度優先搜索,分段並行搜索;

  10. 數據結構:  位圖,數組, 鏈表,棧,隊列, 二叉樹, 字符串, 哈希表,圖;Json, XML, 記錄,數據庫; Key-Value 值對集合;非結構化存儲。

  11. 文本處理: find , grep,  awk,  sed, sort, cut, uniq, tr, ls, cat, xargs, 正則表達式;

  12. 設計模式: 工廠, 單例,原型, 模板,策略, 狀態, 觀察者, 中介者, 責任鏈, 組合, 命令, 代理,外觀,適配器,裝飾器,迭代器;

  13. 應用模式: WrapperFacade, Component Configurator, Interceptor, Extension Interface, Reactor, Proactor, Asyn Completion Token, Acceptor-Connector, Strategized Locking, Thread-Safe Interface, Double-Checked Locking Optimization, Active Object, Monitor Object, Half-Sync/Half-Async, Leader/Followers, Thread-Specific Storage ;參見《面向模式的軟件架構:併發與聯網對象模式》

  14. 進程與網絡: ps(pstree),  top,  kill, crontab, ifconfig, ping, telnet, netstat, tcpdump, ssh, scp, wget, curl, Socket , HTTP ; 任務管理器 ;  

  15. 開發框架: Servlet, Spring, Struts, ibatis , Hibernate,  Aop,  jQuery , Extjs, Bootstrap, Flex ; 

  16. 經常使用組件: 日誌 ,  實用工具 (字符串, 日期, JSON/XML, HTTP, Email) , 簽名校驗,集合容器,模板引擎,併發庫,圖表(Highcharts)等 ;

  17. 運行容器: apacheHttp ,  tomcat,  jetty,  nginx ,  Docker,JVM, 瀏覽器,集羣;

  18. 中間件: Tair, Zookeeper, Dubbo,  數據庫鏈接池,日誌服務, 緩存, 定時任務,可靠消息服務,可靠心跳服務,工做流引擎, 負載均衡 ;

  19. 軟件架構: MVCDD (Model - View - Controller - Domain - DB) ;流水線,管道與過濾器; 事件驅動; 領域建模;以數據爲中心的架構;

  20. 測試技術: 質量風險分析,測試數據集, 測試用例,等價類劃分, 分支覆蓋, 域測試,正交表,決策表,狀態轉換圖,邊界測試, 空測試, 異常測試,漫遊測試, 依賴Mock;單測;接口測試;集成測試;全鏈路壓測;

  21. 代碼組織: 頭文件, 類文件,包機制,名字空間;

  22. 軟件工程: 模塊化, 封裝,面向對象,用戶故事,迭代開發,持續集成,單元測試,CodeReview,驗收測試,持續交付;  

  23. 測量監控: 性能測量,time ,系統/接口/業務指標,錯誤報警;

  24. 學習資源: 開源項目,公開課,論文,infoq,  stackoverflow , blogs, google ,  baidu;

  25. 經典書籍: 參見《計算機專業及軟件開發推薦書籍》

相關文章
相關標籤/搜索