“
在分布式系統中,同時滿足“一致性”、“可用性”和“分區容錯性”三者是不可能的。分布式系統的事務一致性是一個技術難題,各種解決方案孰優孰劣?
老司機介紹
丁浪,現就職于某垂直電商平臺,擔任技術架構師。關注高并發、高可用的架構設計,對系統服務化、分庫分表、性能調優等方面有深入研究和豐富實踐經驗。熱衷于技術研究和分享。
在OLTP系統領域,我們在很多業務場景下都會面臨事務一致性方面的需求,例如最經典的Bob給Smith轉賬的案例。傳統的企業開發,系統往往是以單體應用形式存在的,也沒有橫跨多個數據庫。
我們通常只需借助開發平臺中特有數據訪問技術和框架(例如Spring、JDBC、ADO.NET),結合關系型數據庫自帶的事務管理機制來實現事務性的需求。關系型數據庫通常具有ACID特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。
而大型互聯網平臺往往是由一系列分布式系統構成的,開發語言平臺和技術棧也相對比較雜,尤其是在SOA和微服務架構盛行的今天,一個看起來簡單的功能,內部可能需要調用多個“服務”并操作多個數據庫或分片來實現,情況往往會復雜很多。單一的技術手段和解決方案,已經無法應對和滿足這些復雜的場景了。
分布式系統的特性
對分布式系統有過研究的讀者,可能聽說過“CAP定律”、“Base理論”等,非常巧的是,化學理論中ACID是酸、Base恰好是堿。這里筆者不對這些概念做過多的解釋,有興趣的讀者可以查看相關參考資料。CAP定律如下圖:
在分布式系統中,同時滿足“CAP定律”中的“一致性”、“可用性”和“分區容錯性”三者是不可能的,這比現實中找對象需同時滿足“高、富、帥”或“白、富、美”更加困難。在互聯網領域的絕大多數的場景,都需要犧牲強一致性來換取系統的高可用性,系統往往只需要保證“最終一致性”,只要這個最終時間是在用戶可以接受的范圍內即可。
分布式事務
提到分布式系統,必然要提到分布式事務。要想理解分布式事務,不得不先介紹一下兩階段提交協議。先舉個簡單但不精準的例子來說明:
第一階段,張老師作為“協調者”,給小強和小明(參與者、節點)發微信,組織他們倆明天8點在學校門口集合,一起去爬山,然后開始等待小強和小明答復。
第二階段,如果小強和小明都回答沒問題,那么大家如約而至。如果小強或者小明其中一人回答說“明天沒空,不行”,那么張老師會立即通知小強和小明“爬山活動取消”。
細心的讀者會發現,這個過程中可能有很多問題的。如果小強沒看手機,那么張老師會一直等著答復,小明可能在家里把爬山裝備都準備好了卻一直等著張老師確認信息。更嚴重的是,如果到明天8點小強還沒有答復,那么就算“超時”了,那小明到底去還是不去集合爬山呢?
這就是兩階段提交協議的弊病,所以后來業界又引入了三階段提交協議來解決該類問題。
兩階段提交協議在主流開發語言平臺,數據庫產品中都有廣泛應用和實現的,下面來介紹一下XOpen組織提供的DTP模型圖:
XA協議指的是TM(事務管理器)和RM(資源管理器)之間的接口。目前主流的關系型數據庫產品都是實現了XA接口的。JTA(Java Transaction API)是符合X/Open DTP模型的,事務管理器和資源管理器之間也使用了XA協議。 本質上也是借助兩階段提交協議來實現分布式事務的,下面分別來看看XA事務成功和失敗的模型圖:
在JavaEE平臺下,WebLogic、Webshare等主流商用的應用服務器提供了JTA的實現和支持。而在Tomcat下是沒有實現的(其實筆者并不認為Tomcat能算是JavaEE應用服務器),這就需要借助第三方的框架Jotm、Automikos等來實現,兩者均支持spring事務整合。
而在Windows .NET平臺中,則可以借助ado.net中的TransactionScop API來編程實現,還必須配置和借助Windows操作系統中的MSDTC服務。如果你的數據庫使用的mysql,并且mysql是部署在Linux平臺上的,那么是無法支持分布式事務的。 由于篇幅關系,這里不展開,感興趣的讀者可以自行查閱相關資料并實踐。
總結:這種方式實現難度不算太高,比較適合傳統的單體應用,在同一個方法中存在跨庫操作的情況。但分布式事務對性能的影響會比較大,不適合高并發和高性能要求的場景。
提供回滾接口
在服務化架構中,功能X,需要去協調后端的A、B甚至更多的原子服務。那么問題來了,假如A和B其中一個調用失敗了,那可怎么辦呢?
在筆者的工作中經常遇到這類問題,往往提供了一個BFF層來協調調用A、B服務。如果有些是需要同步返回結果的,我會盡量按照“串行”的方式去調用。如果調用A失敗,則不會盲目去調用B。如果調用A成功,而調用B失敗,會嘗試去回滾剛剛對A的調用操作。
當然,有些時候我們不必嚴格提供單獨對應的回滾接口,可以通過傳遞參數巧妙的實現。
這樣的情況,我們會盡量把可提供回滾接口的服務放在前面。舉個例子說明:
我們的某個論壇網站,每天登錄成功后會獎勵用戶5個積分,但是積分和用戶又是兩套獨立的子系統服務,對應不同的DB,這控制起來就比較麻煩了。解決思路:
把登錄和加積分的服務調用放在BFF層一個本地方法中。
當用戶請求登錄接口時,先執行加積分操作,加分成功后再執行登錄操作
如果登錄成功,那當然最好了,積分也加成功了。如果登錄失敗,則調用加積分對應的回滾接口(執行減積分的操作)。
總結:這種方式缺點比較多,通常在復雜場景下是不推薦使用的,除非是非常簡單的場景,非常容易提供回滾,而且依賴的服務也非常少的情況。
這種實現方式會造成代碼量龐大,耦合性高。而且非常有局限性,因為有很多的業務是無法很簡單的實現回滾的,如果串行的服務很多,回滾的成本實在太高。
本地消息表
這種實現方式的思路,其實是源于ebay,后來通過支付寶等公司的布道,在業內廣泛使用。其基本的設計思想是將遠程分布式事務拆分成一系列的本地事務。如果不考慮性能及設計優雅,借助關系型數據庫中的表即可實現。
舉個經典的跨行轉賬的例子來描述。
第一步偽代碼如下,扣款1W,通過本地事務保證了憑證消息插入到消息表中。
第二步,通知對方銀行賬戶上加1W了。那問題來了,如何通知到對方呢?
通常采用兩種方式:
采用時效性高的MQ,由對方訂閱消息并監聽,有消息時自動觸發事件
采用定時輪詢掃描的方式,去檢查消息表的數據。
兩種方式其實各有利弊,僅僅依靠MQ,可能會出現通知失敗的問題。而過于頻繁的定時輪詢,效率也不是最佳的(90%是無用功)。所以,我們一般會把兩種方式結合起來使用。
解決了通知的問題,又有新的問題了。萬一這消息有重復被消費,往用戶帳號上多加了錢,那豈不是后果很嚴重?
仔細思考,其實我們可以消息消費方,也通過一個“消費狀態表”來記錄消費狀態。在執行“加款”操作之前,檢測下該消息(提供標識)是否已經消費過,消費完成后,通過本地事務控制來更新這個“消費狀態表”。這樣子就避免重復消費的問題。
總結:上訴的方式是一種非常經典的實現,基本避免了分布式事務,實現了“最終一致性”。但是,關系型數據庫的吞吐量和性能方面存在瓶頸,頻繁的讀寫消息會給數據庫造成壓力。所以,在真正的高并發場景下,該方案也會有瓶頸和限制的。
MQ(非事務消息)
通常情況下,在使用非事務消息支持的MQ產品時,我們很難將業務操作與對MQ的操作放在一個本地事務域中管理。通俗點描述,還是以上述提到的“跨行轉賬”為例,我們很難保證在扣款完成之后對MQ投遞消息的操作就一定能成功。這樣一致性似乎很難保證。
先從消息生產者這端來分析,請看偽代碼:
根據上述代碼及注釋,我們來分析下可能的情況:
操作數據庫成功,向MQ中投遞消息也成功,皆大歡喜
操作數據庫失敗,不會向MQ中投遞消息了
操作數據庫成功,但是向MQ中投遞消息時失敗,向外拋出了異常,剛剛執行的更新數據庫的操作將被回滾
從上面分析的幾種情況來看,貌似問題都不大的。那么我們來分析下消費者端面臨的問題:
消息出列后,消費者對應的業務操作要執行成功。如果業務執行失敗,消息不能失效或者丟失。需要保證消息與業務操作一致
盡量避免消息重復消費。如果重復消費,也不能因此影響業務結果
如何保證消息與業務操作一致,不丟失?
主流的MQ產品都具有持久化消息的功能。如果消費者宕機或者消費失敗,都可以執行重試機制的(有些MQ可以自定義重試次數)。
如何避免消息被重復消費造成的問題?
保證消費者調用業務的服務接口的冪等性
通過消費日志或者類似狀態表來記錄消費狀態,便于判斷(建議在業務上自行實現,而不依賴MQ產品提供該特性)
總結:這種方式比較常見,性能和吞吐量是優于使用關系型數據庫消息表的方案。如果MQ自身和業務都具有高可用性,理論上是可以滿足大部分的業務場景的。不過在沒有充分測試的情況下,不建議在交易業務中直接使用。
MQ(事務消息)
舉個例子,Bob向Smith轉賬,那我們到底是先發送消息,還是先執行扣款操作?
好像都可能會出問題。如果先發消息,扣款操作失敗,那么Smith的賬戶里面會多出一筆錢。反過來,如果先執行扣款操作,后發送消息,那有可能扣款成功了但是消息沒發出去,Smith收不到錢。除了上面介紹的通過異常捕獲和回滾的方式外,還有沒有其他的思路呢?
下面以阿里巴巴的RocketMQ中間件為例,分析下其設計和實現思路。
RocketMQ第一階段發送Prepared消息時,會拿到消息的地址,第二階段執行本地事物,第三階段通過第一階段拿到的地址去訪問消息,并修改狀態。細心的讀者可能又發現問題了,如果確認消息發送失敗了怎么辦?
RocketMQ會定期掃描消息集群中的事物消息,這時候發現了Prepared消息,它會向消息發送者確認,Bob的錢到底是減了還是沒減呢?如果減了是回滾還是繼續發送確認消息呢?RocketMQ會根據發送端設置的策略來決定是回滾還是繼續發送確認消息。這樣就保證了消息發送與本地事務同時成功或同時失敗。如下圖:
總結:據筆者的了解,各大知名的電商平臺和互聯網公司,幾乎都是采用類似的設計思路來實現“最終一致性”的。這種方式適合的業務場景廣泛,而且比較可靠。不過這種方式技術實現的難度比較大。目前主流的開源MQ(ActiveMQ、RabbitMQ、Kafka)均未實現對事務消息的支持,所以需二次開發或者新造輪子。比較遺憾的是,RocketMQ事務消息部分的代碼也并未開源,需要自己去實現。
其他補償方式
做過支付寶交易接口的同學都知道,我們一般會在支付寶的回調頁面和接口里,解密參數,然后調用系統中更新交易狀態相關的服務,將訂單更新為付款成功。同時,只有當我們回調頁面中輸出了success字樣或者標識業務處理成功相應狀態碼時,支付寶才會停止回調請求。否則,支付寶會每間隔一段時間后,再向客戶方發起回調請求,直到輸出成功標識為止。
其實這就是一個很典型的補償例子,跟一些MQ重試補償機制很類似。
一般成熟的系統中,對于級別較高的服務和接口,整體的可用性通常都會很高。如果有些業務由于瞬時的網絡故障或調用超時等問題,那么這種重試機制其實是非常有效的。
當然,考慮個比較極端的場景,假如系統自身有bug或者程序邏輯有問題,那么重試1W次那也是無濟于事的。那豈不是就發生了“明明已經付款,卻顯示未付款不發貨”類似的悲劇?
其實為了交易系統更可靠,我們一般會在類似交易這種高級別的服務代碼中,加入詳細日志記錄的,一旦系統內部引發類似致命異常,會有郵件通知。同時,后臺會有定時任務掃描和分析此類日志,檢查出這種特殊的情況,會嘗試通過程序來補償并郵件通知相關人員。
在某些特殊的情況下,還會有“人工補償”的,這也是最后一道屏障。
小結
上訴的幾種方案中,筆者也大致總結了其設計思路,優勢,劣勢等,相信讀者已經有了一定的理解。其實分布式系統的事務一致性本身是一個技術難題,目前沒有一種很簡單很完美的方案能夠應對所有場景。具體還是要使用者根據不同的業務場景去抉擇。
▽
本文系InfoQ原創首發,未經授權謝絕轉載。
又到了找工作的季節,大多數程序員卻無比糾結,想跳槽卻不想面試。畢竟拼實力沒啥可怕,怕的是明明有實力,面試時卻有口難言。
不少小伙伴在后臺詢問程序員找工作或者跳槽要做什么準備?
面試就像作戰,只要做好充足的準備,一定能胸有成竹。異步君在這里給大家分享幾個小技巧:
面試考察的基本功,包括以下方面:
程序風格:能正確使用縮進,括號要對齊,變量名可以起的有意義;
編碼習慣:異常檢查,邊界處理;
溝通:讓面試官時刻明白你的意圖,不要閉著眼睛不停地寫。因為你的算法未必對。對了你也未必寫得出來。中間稍微有點問題,你就失敗了。對于面試官來說,他根本不知道你的解題進行到哪一步了;
測試:主動寫出合理的測試用例(Test case),一些常見的用例,如 null 檢查。一般你沒寫的話, 面試官會讓你寫,但如果你主動寫出來,說明你有好的習慣,容易加分。
對程序員來說,技術面試是整個面試中非常重要的環節。當你拿到一個具體問題時,流程通常如下,可供參考。
明確題意:通過與面試官交流明確需要解答的問題。這部分主要為了讓自己放松心態,并且給面試官 留下你具有良好團隊意識和交流能力的印象。
描述大體思路:描述你打算用什么算法,什么數據結構。主要是為了讓面試官了解你的思維過程,如果你給出的解答與他想要的答案偏差太多,可以及時糾正。同時,描述思路也給了你自己思考的機會。
實現算法:先處理邊界條件。對于重要的算法模塊,加一些注釋或者與面試官進行交流。目的是讓面 試官始終了解你在做什么,算法框架是什么。
跑一個測試:用一個測試用例走一遍你寫的程序。目的在于和面試官一起確保你的算法是有效的,可 以在過程中及時發現并糾正自己的錯誤。同時,給面試官留下你有寫單元測試(unit test)習慣的良好印象。
描述算法復雜度,回答面試官的問題。
當然,要找一份好工作,功夫還在平時。異步君還為大家整理出了一份關于程序員面試的書單,不僅能幫助做職業規劃,還能提高大家的職業技能!
《軟技能 代碼之外的生存指南》
約翰 Z.森梅茲 著
這是一本真正從“人”(而非技術也非管理)的角度關注軟件開發人員自身發展的書。書中論述的內容既涉及生活習慣,又包括思維方式,凸顯技術中“人”的因素,全面講解軟件行業從業人員所需知道的所有“軟技能”。
對大多數軟件開發人員而言,編碼才是有趣的,而如何與客戶、同事以及經理們打交道,如何保證工作效率,如何保障財務安全,如何保持自己的體形,如何找到真愛……這些則統統被視為畏途。本書恰恰可以在這些方面幫到你!
《代碼整潔之道》
馬丁 著
細節之中自有天地,整潔成就卓越代碼。盡管糟糕的代碼也能運行,但如果代碼不整潔,會使整個開發團隊泥足深陷,寫得不好的代碼每年都要耗費難以計數的時間和資源。然而這種情況并非無法避免。
這本書是軟件工程大師馬丁經典力作,由互聯網產品與運營專家韓磊獻譯,本書榮獲第13屆Jolt大獎。
從《代碼整潔之道》中可以學到:好代碼和糟糕的代碼之間的區別:如何編寫好代碼,如何將糟糕的代碼轉化為好代碼:如何創建好名稱、好函數、好對象和好類;如何格式化代碼以實現其可讀性的優化:如何在不妨礙代碼邏輯的前提下充分實現錯誤處理;如何進行單元測試和測試驅動開發。
《代碼整潔之道 程序員的職業素養》
羅伯特·C.馬丁 著
成功的程序員在以往的工作和生活中都曾經歷過大大小小的不確定性,承受過永無休止的壓力。他們之所以能夠成功,是因為擁有一個共同點,都深切關注創建軟件所需的各項實踐。他們將軟件開發視為一種需要精雕細琢加以修煉的技藝,他們以專業人士的標準要求自己,他們具有職業素養。
軟件開發大師Robert C. Martin在書中介紹了真實軟件技藝中的各項原則、技術、工具和實踐,展示了怎么以自豪、自尊和自信的心態進行軟件開發,怎么取得卓越表現和豐碩成果,怎么做到有效溝通和確切估算,怎么以坦誠的心態面對困難,并引導讀者認識到專業程序員肩負的責任重大,闡述了什么才是程序員的職業素養。
《編程珠璣(第2版 修訂版)》
喬恩·本特利(Jon Bentley) 著
本書作者Jon Bentley,世界計算機科學家,被譽為影響算法發展的十位大師之一。
多年以來,當程序員們推選出心愛的計算機圖書時,《編程珠璣》總是位于前列。正如自然界里珍珠出自細沙對牡蠣的磨礪,計算機科學大師JonBentley以其獨有的洞察力和創造力,從磨礪程序員的實際問題中凝結出一篇篇不朽的編程“珠璣”,成為世界計算機界名刊《ACM通訊》歷史上受歡迎的專欄,結集為兩部不朽的計算機科學經典名著,影響和激勵著一代又一代程序員和計算機科學工作者。本書為首卷,主要討論計算機科學中本質的問題:如何正確選擇和高效地實現算法。
在書中,作者選取許多具有典型意義的復雜編程和算法問題,生動描繪了歷史上眾大師們在探索解決方案中發生的軼事、走過的彎路和不斷精益求精的歷程,引導讀者像真正的程序員和軟件工程師那樣富于創新性地思考,并透徹闡述和總結了許多獨特而精妙的設計原則、思考和解決問題的方法以及實用程序設計技巧。
《編程珠璣(續 修訂版)》
喬恩·本特利 (Jon Bentley) 著
本書是計算機科學方面的經典名著《編程珠璣》的姊妹篇,講述了對于程序員有共性的知識。延續了《編程珠璣》的特色,通過一些精心設計的有趣而又頗具指導意義的程序,對實用程序設計技巧及基本設計原則進行透徹而睿智的描述,為復雜的編程問題提供清晰而完備的解決思路。涵蓋了程序員操縱程序的技術、程序員取舍的技巧、輸入和輸出設計以及算法示例,這些內容結合成一個有機的整體,如一串串珠璣展示給程序員。
《重構 改善既有代碼的設計(第2版》
馬丁·福勒(Martin Fowler) 著
軟件開發的不朽經典,生動闡述重構原理和具體做法,普通程序員進階到編程高手必須修煉的秘笈。
重構,一言以蔽之,就是在不改變外部行為的前提下,有條不紊地改善代碼。多年前,正是本書原版的出版,使重構終于從編程高手們的小圈子走出,成為眾多普通程序員日常開發工作中不可或缺的一部分。本書也因此成為與《設計模式》齊名的經典著作,被譯為中、德、俄、日等眾多語言,在世界范圍內暢銷不衰。
本書凝聚了軟件開發社區專家多年摸索而獲得的寶貴經驗,擁有不因時光流逝而磨滅的價值。今天,無論是重構本身,業界對重構的理解,還是開發工具對重構的支持力度,都與本書出版時不可同日而語,但書中所蘊涵的意味和精華,依然值得反復咀嚼,而且往往能夠常讀常新。
《程序員面試白皮書》
逸超, 董飛著
這是一本介紹程序員面試的參考書,通過一系列的實例介紹了數據結構、算法以及計算機專業的其他基礎知識。同時,本書還在各章中及時回顧教材中的重點內容,書中的題目也很據參考價值,通過實例與知識點相結合的方式幫助讀者掌握要領。除此之外,本書還將引導讀者分析題目,幫助讀者理清思路并最終解決問題。
《師兄教你找工作——100場面試 20個offer背后的求職秘密》
韓速(@美牙君)著
本書以應屆畢業生的視角,對求職的整個過程進行了分享和描述。涉及職業規劃、前期準備、簡歷、網申、郵件投遞、內推、在線測評、筆試、電面、結構化面試、群面、壓力面、談offer、選offer以及簽約注意事項等各個環節。既解答了同學們最關心的若干問題,也包括求職技巧分享。既幫助大家正確地審視自己,也幫助讀者客觀地面對企業。
《趣學算法》
陳小玉 著
本書從算法之美娓娓道來,沒有高深的原理,也沒有枯燥的公式,通過趣味故事引出算法問題,包含50多個實例及完美圖解,結合學生提問,分析算法本質,并給出代碼實現的詳細過程和運行結果。
本書可作為程序員的學習用書,也適合從未有過編程經驗但又對算法有強烈興趣的初學者使用,同時也可作為高等院校計算機、數學及相關專業的師生用書和培訓學校的教材。
《算法謎題》
【美】Anany Levitin 著
算法是計算機科學領域最重要的基石之一。算法謎題,就是能夠直接或間接地采用算法來加以解決的謎題。求解算法謎題是培養和鍛煉算法思維能力一種最有效和最有樂趣的途徑。
本書是一本經典算法謎題的合集。本書包括了一些古已有之的謎題,數學和計算機科學有一部分知識就發源于此。本書中還有一些較新的謎題,其中有一部分謎題被用作知名IT企業的面試題。全書可分為4個部分,分別是概覽、謎題、提示和答案。概覽介紹了算法設計的通用策略和算法分析的技術,還附帶有不少的實例。謎題部分將謎題按照簡單、中等難度和較難三個層級分別列出。提示部分依次給出謎題提示,幫助讀者找到正確的解題方向,同時仍然為讀者留下了獨立求解的空間。答案部分則給出了謎題的詳細解答。
《C和C++程序員面試秘笈》
董山海 著
眾多高級語言都從C/C++有所借鑒,所以說C/C++的語言基礎對從事軟件開發的人員來說非常重要。
本書是一本解析C/C++面試題的書,可以幫助求職者更好地準備面試。《C和C++程序員面試秘笈》共包含12章,囊括了目前企業中常見的面試題類型和考點,包括C/C++程序基礎,預處理、const、static與sizeof,引用和指針,字符串,位運算與嵌入式編程,C++面向對象,C++繼承和多態,數據結構,排序,泛型編程,STL,算法和邏輯思維等最常見的面試題。《C和C++程序員面試秘笈》通過技術點解析、代碼輔佐的方式讓讀者能深刻領會每個考點背后的技術。
本書緊扣面試精髓,對各種技術的剖析一針見血,是目前想找工作的C/C++程序員和剛畢業的大學生的面試寶典。
《Java程序員面試秘笈》
常建功著
· 緊扣面試精髓,一冊在手,工作不愁
· 提供最全的Java面試題分類,幫你有備而戰
· 涵蓋經典的筆試題+上機題,幫你整理知識庫
· 解析考題的要點和技術原理,幫你溫故而知新
Java程序員目前就業形勢較好,因為Java的應用太廣泛了,從網頁開發到手機安卓開發,都離不開Java。本書緊扣面試精髓,對各種技術剖析一針見血,是想找工作的Java程序員和剛畢業學生的面試寶典。
《編程之法:面試和算法心得》
July 著
· 蛻變于CSDN技術博客“結構之法算法之道”
· 內容涉及面試、算法、機器學習三大主題
· 作者數年的積累成果
· 進入IT行業求職筆試和面試寶典
本書涉及面試、算法、機器學習三個主題。書中的每道編程題目都給出了多種思路、多種解法,不斷優化、逐層遞進。第1章至第6章分別闡述字符串、數組、樹、查找、動態規劃、海量數據處理等相關的編程面試題和算法,第7章介紹機器學習的兩個算法—K近鄰和SVM。
此外,每一章都有“舉一反三”和“習題”,以便讀者及時運用所學的方法解決相似的問題,且在附錄中收錄了語言、鏈表、概率等其他題型。書中的每一道題都是面試的高頻題目,反復出現在近5年各大公司的筆試和面試中,對面試備考有著極強的參考價值。
《.NET程序員面試秘笈》
張云翯著
本書是一本解析.NET面試題的書,可以幫助求職者更好地準備面試。全書共11章,囊括了目前企業中常見的面試題類型和考點,包括.NET語言基礎、基類、接口和泛型、.NET高級特性、Windows窗體編程、ADO.NET編程、SQL查詢及LINQ、ASP.NET程序開發和算法趣味題等。通過技術點解析、代碼輔佐的方式使讀者能深刻理解每個考點背后的技術。
緊扣面試焦點,對各種技術剖析一針見血,是目前想找工作的.NET程序員和剛畢業學生的面試寶典。
《軟件測試工程師面試秘籍》
G.li, 51Testing軟件測試網 著
本書用輕松、愉快、親切的語言為廣大應聘測試崗位的讀者組織了一場求職戰役。書中語言精練,內容豐富,涵蓋應聘基本流程、開發類基礎知識、測試類專業知識、筆試面試技巧,并穿插了大量名企的筆試面試題。相信必能幫助對應聘完全知的菜鳥們迅速成長為百戰百勝的、羽翼豐滿的雄鷹。
本書適用范圍廣,包含了各類語言的筆試、面試題,以及Java、C++、C#等。《軟件測試工程師面試秘籍》專業實用性強,除了有一般程序員的基本知識和題目外,還另外針對測試這個崗位設計了一個章節,包含Web測試、移動App測試、游戲類測試等場景。
《Android高薪之路—Android程序員面試寶典》
李寧著
本書取材于各大IT公司面試真題,所給出的試題盡可能地覆蓋了Android應用開發的各個方面,而且大多數試題都有解析部分,讀者可以通過這部分更深入地理解試題中所包含的技術內容,希望真正做到由點成線,舉一反三。
書中還將Android中涉及的各個常用技術問題進行篩選、分類。這樣讀者可以有的放矢,對自己還沒有掌握的Android技術進行重點攻破,從而起到事半功倍的效果。除了對每道題目都有詳細的解析和回答外,對相關知識點還有擴展說明。對面試中Android常見的題型和常用解答技巧進行了介紹,它不僅能幫助求職者快速復習相關知識點,也對現代職業人如何有效求職做了詳細解說。
本書對于讀者從求職就業到提升計算機專業知識都有顯著的幫助,適合計算機相關專業應屆畢業生閱讀,也適合作為正在應聘軟件行業的相關就業人員和計算機愛好者的參考書。
-END-