日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我的2015技术学习流水账

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我的2015技术学习流水账 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我的2015技術學習流水賬

2015年馬上就要過去了,匆匆忙忙地又是一年。回頭總結整理,發現這一年還挺充實的。在正常上班工作之余,學習到了不少新東西,不禁感到很欣慰!一個多月前就開始寫,終于趕在2016年來臨之前寫完了這篇文章…… 關于本文,盡管叫做流水賬,但是出于程序員條理性的“強迫癥”,還是進行系統分類,分類方法參照Thoughtworks技術雷達的Tecniques、Languages & Frameworks、Tools、Platforms,將其中的Tecniques改為理論。


1.理論

從今年開始逐漸的深入學習計算機科學的理論,繼續按照自己確立的學習路線一步一步走下去。

1.1 重拾CSAPP

算上今年這次應該已經“沖擊”了兩三次CSAPP了,這次的效果還算比較滿意,幾乎讀完了厚厚的整本書,收獲頗豐!從匯編語言、計算機組成原理、編譯鏈接、系統編程,都算是系統的學習了一遍。具體學習筆記如下,其中(2)和(3)個人感覺還是整理的不錯滴:

  • 《六星經典CSAPP筆記(1)計算機系統巡游》
  • 《六星經典CSAPP筆記(2)信息的操作和表示》
  • 《六星經典CSAPP筆記(3)程序的機器級表示》
  • 《六星經典CSAPP-筆記(7)加載與鏈接(上)》
  • 《六星經典CSAPP-筆記(10)系統I/O》
  • 《六星經典CSAPP-筆記(11)網絡編程》
  • 《六星經典CSAPP-筆記(12)并發編程(上)》

1.2 算法 & Leetcode

今年讀了幾本算法書,但都是按照內容編排一起并行看的,都沒有看完…… 同時還動手用C++刷了一些Leetcode的題目。C++雖然非常復雜,但做算法題實際上可以只用其中最核心的部分,當做增強版C,就能很快上手了。

這段學習中感覺最大的收獲就是:如何證明程序和算法的正確性,以及實現算法時,如何應對各種CornerCase和思維漏洞。雖然理解和研究的都還不夠深,但是的確開闊了思路,讓我開始系統地思考如何用科學的方法寫出正確的代碼。具體請看《程序員修煉之路》專題以及幾篇Leetcode解題筆記:

  • 《程序員修煉之路-(1)基礎(中):性能分析》
  • 《程序員修煉之路-(1)基礎(下):正確性證明》
  • 《程序員修煉之路-(2)線性表(上):數組與鏈表》
  • 《程序員修煉之路-(2)線性表(下):棧、隊列》
  • 《程序員修煉之路-(3)排序(上):基本排序》
  • 《程序員修煉之路-(4)搜索(中):二叉查找樹》
  • 《Leetcode解題-鏈表(2.2.0)基礎類》
  • 《Leetcode解題-鏈表(2.2.1)AddTwoNumbers》
  • 《Leetcode解題-鏈表(2.2.2)ReverseLinkedList》
  • 《Leetcode解題-鏈表(2.2.3)PartitionList》
  • 《Leetcode解題-鏈表(2.2.6)RotateList》
  • 《Leetcode解題-樹(5.0.0)基礎類》

1.3 Netty網絡編程

項目原因接觸到了Netty,的確非常強大。通過對Netty的使用,也整理了開發一個網絡通信中間件所需的方方面面的知識。但限于一直沒有對TCP/IP等網絡知識做系統學習,所以對Netty底層理解的還不夠深,希望未來能補充上這一部分。

  • 《用Netty解析Redis網絡協議》
  • 《Netty 4源碼解析:服務端啟動》
  • 《Netty 4源碼解析:請求處理》
  • 《用Netty開發中間件:網絡編程基礎》
  • 《用Netty開發中間件:高并發性能優化》

1.4 程序員的自我修養

編譯鏈接一直是讓我望而卻步的領域。今年借著學習CSAAP之勢,順帶給編譯鏈接的學習開了個頭。現在也能解決一些匯編及C語言的鏈接錯誤了,也算是有點成就。同時還試用了ANTLR,確實不錯,以后要是寫一些小東西就用它了。對這部分最深的感悟就是:原來從高級語言的多態到匯編的jmp是這么一回事啊!

  • 《 程序員的自我修養:(1)目標文件》
  • 《Antlr v4入門教程和實例》
  • 《 ANTLR和StringTemplate實例:自動生成單元測試類》

2.工具

今年上手了不少新工具,感謝這些工具和作者,讓我能更高效地專注于要做的事情。你會發現有時只是簡簡單單地用上了某一種工具,你的生活卻發生了根本的改變。就像只是換成Sublime+Markdown寫文章了,才發現原來自己每個月可以寫這么多文章,而且排版還比以前漂亮十倍!只是開始在豆瓣讀書上看看別人推薦的書和記錄自己讀的書,一不留神,發現原來自己已經讀了這么多好書。

2.1 Linux Mint

多虧了Mint的多系統支持,讓我終于在自己的電腦上安裝了Linux,之前一直在Windows下用Cygwin和虛擬機將就著呢。用上了Linux后感覺思維都開放了,想用什么軟件看什么源碼都行,深深感受到了軟件世界里的自由!具體請看《Linux Mint 17一周使用體驗》。

2.2 Sublime Text

在輾轉試用了各種文本編輯器后,終于不用再“漂泊”。Sublime Text幾乎滿足了我的各種需要,各種語言的開發、代碼庫管理以及下面要提到的文章編寫。具體請看《Sublime Text 3下C/C++開發環境搭建》。

2.3 Markdown

可以說是今年最重要的一項改進了!專心寫作內容,減少樣式和其他瑣碎事情的干擾,配合上Sublime Text的編輯和Preview插件簡直就是絕配!回頭看看以前用Word寫完粘貼到CSDN編輯器里的博文,版式簡直“慘不忍睹”…… 現在有了Markdown, 寫作效率和排版質量都有很大提升,md純文本文件比doc小多了。再加上CSDN官方的大力支持,雖然渲染出來的效率不是特別漂亮,但完全可以放心使用了(在CSDN推廣Markdown的征文活動中還贏了一件文化衫:)。


3.語言和框架

3.1 Golang

GitHub上涌現了不少Golang編寫的開源項目,讓人不得不重視這門語言。趁著研究豌豆莢Codis的機會,也順帶學習了Golang的基礎語法。有些地方的確很新穎,比直接用C要方便很多,可能會是一些后臺程序員的福音。但有的地方真的還是不習慣…

  • 《Java程序員的Golang入門指南(上)》
  • 《Java程序員的Golang入門指南(下)》

3.2 YCSB

今年在對一些新技術做預研時,大量使用了Yahoo的YCSB測試框架。一開始還不太了解,后來熟悉了內部源碼后用起來感覺得心應手。負載的操作類型和比例、產生數據的分布等等都可以配置或擴展,功能非常齊全!具體請看《YCSB性能測試工具使用》。

3.3 jgroups-raft

基于jgroups網絡棧對RAFT一致性協議的實現,試用了一下還是不錯的!可以看做是ZooKeeper或Etcd中一致性算法層的對應,算法背后可以連接各種內容,從簡單的數據增刪改查到復雜的遠程操作。這也是今年一個不小的收獲,可以在jgroups-raft背后做出各種分布式的小東西,而不用依賴重型的ZooKeeper服務集群。具體請看《分布式一致性協議Raft原理與實例》以及本文最后對分布式開發的一點思考。

3.4 Thrift

Facebook的Thrift還是挺好用的,很方便就能立刻開始多組件以及跨語言的分布式開發,而且對枚舉、集合類等數據類型支持的也不錯。相比Google的Protobuf,免費提供了從序列化到RPC基礎設施的一整套方案。但好像Thrift不提高更加高級的如Watcher等調用方式,同時注意最簡單的TSimpleServer是單線程阻塞服務器,一個請求處理完才會接受下一個連接請求,只能用于測試。具體請看《Java程序員的現代RPC指南》。

3.5 Cucumber

體驗了一把BDD,也許用得不是那么的標準和地道,但的確在使用過程中能有所啟發。同時在Mock框架方面,還被PowerMock的強大震撼到了!private,static,final方法都能Mock,專治各種疑難雜癥。而且還可直接配合Mockito或EasyMock,JUnit或TestNG等框架使用,不必完全重新學習一套新的API。


4.平臺

4.1 In-Memory Computing

IMC是今年的主要研究方向,工作之余寫了不少相關的文章,其中很多Redis的文章反響不錯,看來Redis依舊是非?;鸬?。我的Redis系列文章的訪問鏈接如下,按內容由淺入深排序:

  • 《Redis中的關系查詢》
  • 《Redis監控工具,命令和調優》
  • 《Redis源碼學習:字符串》
  • 《Redis源碼學習:Lua腳本》
  • 《豌豆夾Redis解決方案Codis源碼剖析:Proxy代理》
  • 《豌豆夾Redis解決方案Codis源碼剖析:Dashboard》
  • 《全面剖析Redis Cluster原理和應用》
  • 《Redis Cluster架構優化》

借著在IMC領域的學習機會,也深入思考了一下分布式系統,具體請看本文后面對分布式開發的思考。在工作多年之后能夠有機會進入一個不錯的研究領域是幸運的,希望未來能對IMC以及分布式系統理論有更深的研究。

4.2 虛擬化

今年抽了一些時間學習了火的不得了的Docker。結果Docker沒有讓我失望,的確是很好的東西!現在自己寫一些東西也會用一下Docker,代碼連同環境一起打包提交,在不同地方開發的話簡直方便極了!未來還想深入學習一下Docker底層用了哪些技術。具體請看《Docker新手入門:基本用法》。


5.Hacking

除了“一本正經”的學習路線外,當然少不了學習一些有趣的新東西來做調劑。

5.1 緩沖區炸彈

作為CS頂級名校CMU的教材,CSAPP里一些經典的實驗都能在網上找到CMU的課件,感覺最為有趣的實驗當屬緩沖區溢出攻擊實驗。它讓你當一把黑客,嘗試攻擊一個有安全漏洞的小程序,當你攻擊成功后看到CMU的祝賀語時,也許會激動得淚流滿面,哈哈!

  • CSAPP緩沖區溢出攻擊實驗(上)
  • CSAPP緩沖區溢出攻擊實驗(下)

5.2 Linux 0.11內核

Linux內核也是我最為感興趣的一個領域,盡管平時并不做嵌入式開發。今年重新撿起《Orange’s:一個操作系統的實現》,但并沒有完全仿造,而是參考了Orange’s和Linux 0.11兩個版本的內核,自己動手實現了一個簡化版的內核,最后做到了進程調度器沒有做完…… 以此為主題,學習了GitHub、GDB、Make、Docker等工具的使用,了解了一個現代化的匯編或C語言項目所需的各種技術。

  • 《操作系統內核Hack:(一)實驗環境搭建》
  • 《操作系統內核Hack:(二)底層編程基礎》
  • 《操作系統內核Hack:(三)引導程序制作》
  • 《操作系統內核Hack:(四)內核雛形》

6.思考和領悟

6.1 關于分布式開發

第一個關于分布式開發的思考就是:代碼和數據。在傳統軟件開發中,代碼和數據的含義再普通不過,代碼對應應用程序,而數據呢就對應數據庫。進入到分布式的世界后,看到眼花繚亂的各種后臺中間件不免有些困惑,以下就簡述一下我的主流中間件學習過程:

  • 負載均衡:總聽人說虛IP或者VIP,等到真正自己安裝配置過LVS才有了直觀的印象,原來簡單的負載均衡的有不少學問,還要看是在三層、四層還是七層做分發。
  • Web服務器:這一部分是之前最欠缺的,對Apache和Nginx完全不了解,后來一點點熟悉甚至還看了些Nginx源碼,動手寫了插件,才發現Nginx真是好啊!
  • 應用服務器:這一部分應該是傳統Java開發人員最熟悉的了,從重量級的WebLogic到最流行的Tomcat甚至最輕量級的Jetty,每個Java程序員都能說出幾個自己用過的應用服務器。后來又接觸到了PHP的FastCGI,進一步開闊了眼界。
  • 消息隊列:ActiveMQ肯定不少人都用過,很早就知道JMS。但消息隊列的世界也不小,還有RabbitMQ等等高性能的消息中間件。
  • 緩存中間件:最熟悉的是Ehcache,后來很自然地就過渡到了Memcached和Redis,在幾乎任何大型網站后臺都有它們的身影。
  • 任務調度:異步執行的后臺任務在大型網站中也是必不可少的。最早用的是最流行的Quartz。后來用過商業的Autosys,支持各種復雜的執行條件和Job嵌套依賴,非常強大但不知道內部是怎么個機制。再后來用上了TBSchedule還有Quartz的分布式版本,對分布式調度內部也有了一定了解。

中間件就是應用程序之間的軟件膠水,它專注于某一功能,從而使開發者能夠集中精力開發業務系統。盡管每款產品的設計初衷和適用場景有很大不同,但我們依然可以按照代碼和數據的方式劃分。分布式的代碼其實就是Web服務、調度任務、MR任務等等,分布式的數據呢就是分布式存儲、消息隊列、分布式緩存等等。這樣追本溯源的去想,也許能清晰不少。

第二個思考是關于分布式開發困難的根本原因,狀態管理絕對應該算一個。提到分布式系統的設計目標,我們的大腦中會立刻蹦出性能、伸縮性、可用性、擴展性、安全性等一些耳熟能詳的詞匯。但仔細思考會發現,其中多個目標都與狀態有著千絲萬縷的聯系。高性能要考慮狀態的并發控制,伸縮要考慮狀態的一致性保證,高可用要考慮狀態的備份和恢復。以開發去中心化(P2P)的分布式系統為例,關于狀態管理有如下一些感悟:

  • 一致性保證:使用ZooKeeper作為完整的一致性方案,或者使用jgroups-raft半成品作為協議層的實現。
  • 狀態轉換:手動實現工作量較大,而且功能不全,可以使用Squirrel等開源實現,支持外部狀態轉換、內部狀態轉換、事件定時觸發、嵌套子狀態等功能。
  • 中間狀態:像jgroups-raft等一致性協議對通信時間都要要求,超時會被認為是宕機了。所以如果協議層背后要做遠程調用等操作,就要將狀態拆分為中間狀態和最終狀態。從一致性協議層接收到請求后,啟動異步任務后就直接返回,此時整個系統進入中間狀態,Leader等待所有結點的異步響應。每個結點的異步任務執行完成后,響應給Leader。當Leader收集全所有響應后,通過一致性協議層通知所有結點進入最終狀態
  • 接口防重:分布式系統的組件經常會出現各種問題,所以對接口進行重試調用在所難免。因此接口要具有冪等性,即能夠自動防重,對重復的輸入數據進行檢測。
  • 狀態持久化:jgroups-raft提供了兩種方式:WAL日志(Write-Ahead Logging)和快照。WAL保證執行真正的操作前先將操作日志成功寫到持久化存儲,而定期做快照可以壓縮日志大小。
  • 狀態恢復:重啟時每個結點上的jgroups-raft都會根據日志在本結點“重放”一遍日志操作,這對于異步中間狀態是有問題的。所以可以預讀日志和快照,提前將狀態機恢復到正確的狀態,這樣做完的日志操作就會被狀態機拒絕掉。
  • 局部狀態:通過一致性協議層發送和接收的消息對各個結點必須是一樣的。所以如果每個結點都需要自己的消息做入參,就通過一致性協議層發送全局的數據,每個結點根據數據中的標志位提取出自己想要的數據。

6.2 關于軟件工程

今年只做了一個項目,在最近開發了一個無中心化結構的分布式中間件。由于中間了隔了一段時間沒有開發具體的業務系統,所以重新上手做項目又對軟件開發過程有了一些新的感悟,尤其是如何根據需求做出合理的設計,根據設計產生正確的代碼。今年學習到的就是BDD(行為驅動開發),于是重新梳理一下個人對軟件工程的各個步驟的理解:

  • 需求分析:需求的規格可謂多種多樣,遇見過的有簡略的BRD文檔、有詳細些的PRD文檔,甚至還有直接在郵件里一段話描述的。我覺得BDD中的Specification跟BRD文檔對應的最準確,都是說明了功能特性、典型場景、以及最重要的對用戶的價值。而不是PRD里詳細的輸入輸出參數以及界面設計等內容。涉及角色有BA業務分析師、產品經理等。
  • 架構設計:針對系統及系統內的組件層次,涉及角色有架構師、開發骨干,還要配合項目經理對人員、任務和工時進行分配,做出合理的排期。
    • 技術選型:選用哪些中間件、是否有新技術要預研、技術風險點
    • 外部系統交互:涉及哪些外部系統,系統級別調用的時序圖、開發人員的協調
    • 組件劃分和交互:內部可劃分哪些組件、如何通信交互、整體的流程圖
  • 詳細設計:針對各個組件內的模塊層次,涉及角色有架構師、開發骨干或者普通開發人員。這一層之前理解的比較模糊,在某些業務系統中可能被淡化,但在技術性較強的開發框架或中間件開發中卻至關重要。
    • 模塊劃分和協作:模塊之間的訪問控制、每個模塊哪個核心類做Facade或Mediator
    • 內部數據模型:獨立的模型,與系統間通信用的DTO解耦
    • 核心算法設計
    • 業務和技術術語表:影響到各種元素的命名,所有開發人員要統一
    • 編碼規范和注釋風格
  • 編碼階段:針對類和方法層次。主要是類的設計(類圖、時序圖、設計模式),在編碼階段可能會在完善TestCase的同時不斷重構。所以這一部分不穩定,要避免過度設計。涉及角色有架構師、所有開發人員。

要想順利開發出軟件還離不開基礎設施的搭建。所以在上述軟件工程進行時,可以盡早地利用公司技術資產或個人經驗,提前準備好基礎設施:

  • 環境
    • 依賴管理:Maven/Gradle
    • 構建:Ant/Maven/Make
    • 版本控制:SVN/Git
    • CI持續集成:Jenkins
    • 統一IDE及插件,配合CI
  • 項目結構
    • 工程:腳手架生成或手寫
    • 主要的包和文件夾:根據術語表命名,包括Java的、JS的、配置文件的等
    • 主要的類和文件
  • 代碼
    • 語法增強:JDK 8、Apache Common、Google Guava
    • 依賴注入:Spring或更輕量的Guice
    • 配置參數和文件解析
    • 異常處理:斷言、統一異常類、異常錯誤碼、異常提示語(用于國際化)
    • 并發控制:JDK concurrent提供的Lock和CountdownLatch等都很好用
    • 線程池:同樣JDK concurrent即可,Guava提供了增強
    • 事件總線:Guava
    • 日志:Slf4j配合具體實現,為項目定制統一的日志輸出格式
    • 數學函數:加密解密算法等

個人理解,不管是用BDD還是TDD,實踐時腦海中都應該至少對關鍵技術選型、頂層架構設計和中層模塊設計有了清晰的認識,而不是直接對著BRD就開始敲代碼。此外,不用嚴格的遵守規則,有一套最適合自己的方法論也很好,你不習慣的實踐規則可能確實不那么適用,也可能你的水平還不能理解和駕馭,沒有關系慢慢來,不用硬著頭皮全盤接受,最后搞得一點寫代碼的心情都沒有了。

現在感覺到軟件開發過程就像是下棋,最重要的就是掌控力。如果說前期設計靠的是對業務和技術的理解和經驗,那么真正開始著手去做時靠的就是對代碼的掌控。在高速開發中,在很多地方都可以“點到即止”,按照整體的設計掌控住細節,讓代碼去到該去的地方,后期再逐漸重構做到徹底。

6.3 技術債務

總結過后,發現了自己技術路線外的一些盲區,也可以說是欠下的“債務”:

  • Web和移動開發:一直很羨慕能直觀展示自己成果的程序員,但就是對Web和移動開發提不起興致,準備抽一段時間集中學習Bootstrap、AngularJS、React.js等流行的前端框架,像Codis那樣用后臺程序的Dashboard來練手
  • Java 8:曾經是那么喜歡Java,Java 5、6有一點兒新特性,都會認真學習半天??蒍ava 6之后好像就不那么熱衷了,甚至Java 8中這么大的變化都無動于衷。什么原因呢?我想一來是近兩年業余時間都在深挖底層,體系結構、Linux、C等等;二是公司項目使用JDK版本升級緩慢,幾乎一直停留在了JDK 6。
  • 方法論和應用框架:由于業務系統開發工作減少,所以沒有特別關注研發的方法論和應用層的新框架。雖然做技術預研時一直在寫原型和實驗代碼,編碼量沒有下降,但要警惕研究內容脫離實際以及代碼質量下降的情況。
    • 方法論:不管是業務系統還是原型開發,都是實踐的機會,TDD、重構等都要不斷練習領會
    • 應用框架:Spring Boot等Spring周邊產品,還有最新版的SpringSide都是不錯的重新學習機會
  • 業余練習項目:盡管大部分書籍閱讀時都動手做了練習和讀書筆記,但并沒有寫一些對自己或別人很實用的小工具。以后還是要多動手,寫一些像《用Qt開發簡單的瀏覽器(一)》里這樣好玩又能對別人有幫助的小開源軟件。

2015的總結就到這里了,2016還有更大的挑戰!繼續加油,珍惜每一分每一秒!

總結

以上是生活随笔為你收集整理的我的2015技术学习流水账的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。