主頁 > 軟體設計 > 沒有這個傳奇工程師,就沒有今天的Windows

沒有這個傳奇工程師,就沒有今天的Windows

2021-11-11 07:58:15 軟體設計

?根據計算機領域的摩爾定律,如果在18個月內都還沒有發布產品,幾乎意味著專案要流產了,Windows NT作業系統的最初計劃也是18個月,但現在,他們已經整整研發三年了,

好在,這個大制作已經進入測驗和Bug修復階段,只差臨門一腳,還有不到兩個月,他們將最終交付這個計算機系統領域具有劃時代意義的作業系統內核,“記住這美好的舊日時光吧”,大衛·卡特勒(David Cutler)希望工程師們再鼓一把勁,

如果這是美好時光,Windows NT的締造者們會覺得有點不幸,


經歷一次次延期發布,所有人身心俱疲,單調和乏味充斥著日常作業,而卡特勒這個暴躁工頭還在催趕工期,如果有工程師在家扎小人詛咒卡特勒,也不會讓人感到意外,畢竟,在這個1993年的6月,為了解壓和泄憤,他們就隨手完成了一次集體性反動惡作劇,

一天,辦公室上方掉下了一條百葉窗的繩子,落在了走廊上形成了一個圓環,不久這個環出現了一些硬幣,隨后又有人放入了一支玫瑰花,一些賭博用的籌碼,奇怪的是,沒有人清理掉這些東西,

很快,圓環里多了一個裝糖果的盒子,還加入了一張卡特勒的滑稽大頭照,兩根蠟燭也隨后出現在圓環外面,盡管沒有點燃,但氣氛似乎恰到好處,給卡特勒照片營造了一種詭異的肅穆感,

沒錯,那是獻給卡特勒的祭壇,根據《觀止:微軟創建NT和未來的奪命狂奔》一書的描述,這些東西好幾周都沒有人移動,直到一天,卡特勒停下來問身邊的同事那些鬼東西像什么,知道真相的他憤怒地走開了,也許是假裝憤怒,

大多數工程師跟著他過著一維的生活,作業就是他們的全部,對下屬,他更多展現的是粗魯、嚴厲、蠻橫、好斗、無情的暴君形象,甚至在招聘女秘書時會問怎么看F打頭的那個詞,然而,很少有人會質疑他對待作業的態度,專注、嚴謹、激情十足、不拘一格,具有天生領導力,而且有女性工程師看出他有時暴怒的背后只是虛張聲勢,

這些混雜的印象讓很多人對他產生了一種微妙的情感,怨恨中帶有絲絲仰慕,用當代比較時髦的詞來形容,有些人說不準就會討伐這個中年男是在“PUA”了,

有些牛人就是這樣,厲害到能讓別人忍受他身上的種種缺陷,更不用說卡特勒這種被譽為engineer's engineer(“公雞中的戰斗雞”)式的人物,

戈登·貝爾和比爾·蓋茨是他職業生涯中最重要的兩個伯樂,大學畢業后的卡特勒先在杜邦公司自學編程,而后入職DEC,1970年代后期在時任DEC副總裁的貝爾支持下,開創性地開發了VMS作業系統,貝爾稱他是世界上最好的作業系統撰寫者,

1988年,在蓋茨的招募下,他來到微軟,歷時5年花費1.5億美元,領導200多位工程師開發出有430萬行代碼的Windows NT,其技術革命性嚴重沖擊了Novell的Netware和UNIX作業系統的地位,為微軟帶來不可估量的商業價值,影響著超過20億人的計算體驗,也因此,他成為迄今為止唯一一位享有微軟Senior Technical Fellow頭銜的工程師,待遇比肩集團VP,微軟前CEO鮑爾默更是直言,沒有他,就沒有今天的微軟

不過,相比對這個世界產生的影響,他在外界的知名度卻不如同級別的Linus Torvalds,Jeff Dean那樣響亮,但他對此毫不在意,只專注于高質量地完成作業,奉行行勝于言,他會強勢向你展示一種讓可能性變成現實的決心:我就是喜歡做這件事,我就要做成這件事,

Windows NT就是卡特勒決心要實作的那件事,

1

“雙非”工程師的逆襲

不同于大多數有著顯赫經歷的牛人,卡特勒既非計算機科班出身,也非名校畢業生,在奧利韋特學院(Olivet College)上大學時,他拿的是數學學士,對電腦一竅不通,畢業也并不想從事編程這種“似乎非常缺乏創造力且枯燥的作業”,

后來,他進入杜邦公司從事材料測驗,但作業任務無可避免地需要編程來建模,卡特勒只好去IBM開辦的學校去學習編程,并將他寫的代碼運行在DEC的小型機上,假以時日,竟然不小心成了DEC計算機專家,

這段經歷讓他在1971年順利進入DEC公司撰寫軟體,在那里,他為DEC的PDP-11計算機構建實時作業系統RSX-11M時發揮了關鍵作用,通過結合總體概念和設計原則,利用匯編語言在非常有限的記憶體空間內實作了多項系統功能,比如樹型檔案系統、交換應用程式、實時調度和一整套開發工具等,過硬的技術和積極作業贏得了贊譽,盡管他的暴脾氣沒給任何人留下好印象,

還好有貴人識才,有DEC技術靈魂之稱的貝爾發現卡特勒是個一流工程師,還讓他主導為新的產品線Vax撰寫VMS作業系統,這個系統需要滿足向后兼容已有應用,同時要能在不同配置的Vax計算機上運行,巨大壓力之下,他花兩年時間完成了這一任務,35歲的卡特勒一戰成名,

(左為戈登·貝爾,右為大衛·卡特勒)

當打之年的卡特勒有著遠大抱負,但DEC日益增長的官僚氣息讓他無法忍受,并威脅要離開公司,貝爾挽留了他,1985年,DEC給他約200人的軟硬體工程師來設計一個全新的計算機系列Prism,其作業系統叫Mica,

起初,這個團隊幾乎像一個獨立的公司那樣運作,可好景不長,期間貝爾離開后沒人罩著,DEC其他部門對卡特勒團隊的業務下手了,

1988年6月,DEC總部告訴他專案完全取消,心灰意冷的卡特勒準備離開,幾年過后,當一個類Mica的作業系統問世之際,DEC管理層會為當初放掉這員猛將而付出“代價”,

彼時,計算機產業正處在激情澎湃的技術革新期,新的軟硬體創業公司層出不窮,如OneFlow此前寫過的思維機器和Multiflow公司,

正如日中天的卻是微軟,DOS系統的成功讓蓋茨邁向美國首富,但他卻嗅到了面臨的危機,微軟的現金牛DOS可能面臨潛在威脅:一是RISC芯片的出現可能取代英特爾芯片,DOS卻與英特爾的芯片高度系結;二是許多公司開始銷售裝有UNIX的電腦,要應對這一難題,他想要微軟開發一個可移植的作業系統運行在任一RISC芯片上,成為個人計算的通行標準,這個新系統叫Windows New Technology,也就是Windows NT,

卡特勒要離開DEC的訊息傳到了蓋茨那里,相約見面后,這個看起來很自負的工程師從上到下噴了一頓微軟的產品,但后者認定,他將是領導新作業系統團隊的最佳領匯入選,大把股票、自主選擇研發團隊和開發新作業系統的機會,以及蓋茨表現出的誠懇態度最終將卡特勒這個狂人收入麾下,入職后還順便招募了不少他在DEC時的死忠,

2

躊躇滿志卻狀況百出

初來乍到,卡特勒團隊與“微軟人”一度互相看不上,他把團隊搞成了前DEC工程師的小圈子,


為了讓新人融入微軟體系,蓋茨將足智多謀的骨干工程師Steve Wood派到了這個團隊,Wood曾接手被微軟最大的客戶IBM大力支持的OS/2系統,這是個16位作業系統,只能在英特爾硬體上運行且不可移植,他對卡特勒沒有盲目崇拜,但發現與其他團隊成員倒是“臭味相投”,

經過幾個月的持續招募,在1989年4月,一個較為完整的NT團隊就緒,帶著失意、憤懣的復仇情緒,卡特勒準備大干一場,

NT作業系統的目標既具挑戰性又雄心勃勃:

  • 可移植且可用于多個目標(MIPS、Alpha、PowerPc、x64)

  • 可以在多個作業系統(POSIX (UNIX)、OS/2 和 Windows 32)上運行

  • 安全性和 C2 認證(受信任的計算機認證)

  • 在具有多個處理器的系統上運行,并且能同時運行多個程式,這在當時PC市場上獨有

高可靠性的要求使得卡特勒將NT分成了兩個部分:一個是內核,不與程式發生關聯,不會被它運行失敗時所影響,另一個是作業系統的圖形化部分,這個模式的最大問題是會犧牲系統運行的效率,蓋茨也表達了質疑,但卡特勒堅稱,他們會以高超的編程技巧彌補性能不足,

根據日程表,他們打算在1990年7月寫完NT的所有代碼,并在1991年3月30日交出最終版本,很快,那些預料之中和始料未及的挑戰會讓他一次次食言,

首先是技術上的難題,一方面,支持和測驗NT系統的機器還沒制造出來,在英特爾的i860芯片上運行NT的代碼,效果太差,而切換到卡特勒看好的MIPS芯片要走很多回頭路,后來他們切換到英特爾的386系列芯片,但還是必須忍受硬體的毛病,另一方面,缺乏編程工具拖慢了系統研發的進展,打造工具也分散了團隊的部分力量,

其次是團隊磨合不暢,卡特勒只想專注小團隊去開發NT內核,不想負責管理與之相關的圖形、網路、測驗小組,他們各自作業風格不一,卡特勒甚至把測驗小組當做累贅,他從不依靠測驗小組,認為測驗工程師只會讓程式看起來更糟糕,這種偏見源自他的個人編程風格,在寫代碼前,他會先在頭腦里形成代碼圖,然后高精確度地寫下極少有Bug的代碼,每一行代碼都有注釋,

同時,他還要很不情愿地根據專案經理帶來的客戶意見來修改代碼和功能,

1990年春天,圖形可視化部分也遭遇嚴重困境,尤其采用C++語言使得程式容量超過計算機記憶體,而MIPS芯片的發布也延遲了,蓋茨還把NT向386芯片移植的作業視為專案最高優先級,但是沒有完成,

更糟糕的是,不少人懷疑模型NT的客戶-服務模型會降低運行應用的性能,包括蓋茨也因為害怕犧牲太多速度,始終沒有認可這種模型,但卡特勒依然堅信他們會解決這個問題,在系統的可靠性和速度之間做出選擇時,他最不能容忍的是不穩定,

至此,要在7月寫完所有代碼的計劃不可能實作,卡特勒討厭不能如期兌現承諾,種種問題讓他很崩潰,但現在沒法撂挑子了,除了測驗部門,網路、圖形、兼容性等團隊都交由其管理,他第一次感覺到,自己的事業與NT的命運已經聯系在一起,

3

截止日期節節敗退

1990年6月,Windows 3.0的發布讓整個軟體行業大變樣,他們開始思考如何將NT運行到Windows上,但最大的矛盾在于,OS/2和Windows控制系統PC的方法互不兼容,這讓客戶和工程師都變得難以適從,對微軟來說,他們不可能主要去支持OS/2,但也不想與最大客戶IBM產生決裂,

蓋茨給IBM灌了兩斤迷魂湯,他讓后者相信,NT分別支持Windows和DOS系統將帶來諸多好處,盡管這與他建立統一軟體標準的說法有矛盾,背地里,微軟只讓來自以色列的一小隊人馬去設計NT的OS/2變種,而卡特勒團隊卻向Windows發展成計算機標準這一真正的目標前進,

對卡特勒個人來說,此舉不僅讓他擺脫了IBM,也將實作替代UNIX的期望,他早前就以蔑視UNIX而聞名,認為這是一幫博士設計出來的垃圾,那時的UNIX缺乏對系統資源配額的支持(例如,任何行程都可能通過分配過多記憶體或 fork() 回圈導致系統崩潰),還缺乏VMS風格的行程權限、微內核架構,以及缺乏對多個子系統的支持,

半年后,IBM才發現到被微軟擺了一道,還是后者主動披露的,1991年1月,在微軟舉辦的應用軟體開發者大會上,IBM工程師幻想著微軟NT團隊會介紹支持OS/2的內容,但直到演講快結束都有提到,IBM工程師當場質疑,NT工程師挑明要放棄支持OS/2,這導致IBM解除了與微軟的合作關系,

隨后新的研發進度表出爐,卡特勒承諾會在1991年10月31日,在萬圣節前NT代碼將會完成,而測驗和修Bug的作業則會推遲到1992年的第二季度,這也是把NT交付給客戶的時間,

NT逐漸成型,卡特勒希望團隊都能嘗試使用NT系統,這樣就可以檢查NT各個部分存在的缺陷和瑕疵,并對某些型別的程式缺陷進行改進,他們將轉換到NT系統的計算機上分為三個階段:純內核NT、圖形以及網路階段,

真正評判代碼優劣的方法就是運行代碼,隨著更多工程師使用NT,他們發現,要在NT上完成一件作業非常困難,不得不花費數小時甚至數天時間進行修復Bug,大大影響了專案的進度,直到1991年5月底,沒有Windows圖形的NT版本運行得很快,可依然是個很差的替代品,

1991年8月,他們需要在三個月內基本完成NT的程式以趕上截止日期,但現實是,NT的代碼最多只能完成80%,這時NT團隊要考慮的是系統的安全性問題,主要是防止資訊篡改,他們大大低估了這個作業的難度,再一次,卡特勒放棄了在10月完成NT的計劃,那時即使是最好的版本都有很多缺陷,而且性能上也有局限,盡管此前的測驗表明Windows應用在NT上運行只比在DOS上慢比較小的百分點,

他給的最新截止日期是1992年4月,沒有人比他更想看到NT早日發布,

除了統一NT的兩個版本進展緩慢,讓他更頭疼的是不斷新增的新功能,比如容錯性,直到1991年圣誕節前夕都沒有完成,檔案系統也遲遲沒有定型,甚至到1991年底,測驗都沒有開始,兼容DOS和Windows應用的進展也落后了,而圖形小組由于使用C++而不是更容易的C語言降低了效率,

也不全是要延期的壞訊息,卡特勒用強硬手段幫助團隊度過了難關,使得NT的MIPS-英特爾版本在圣誕節前發布,在開發早期階段,NT就達到了一個在其他系統上很難達到的水平,在他眼里這是一個重大成就,

專案進度安排很嚴謹,但研發程序中的專案作業量依然充滿未知,1992年2月,這是研發NT的第三年了,卡特勒的計劃一次次被NT的復雜性作弄,

節節敗退的日程表讓他很不安,卡特勒一直認為,作業系統的開發最好是盡早發布第一個版本,更多功能將來可以再添加,但Windows NT開發到現在已不只是按照他的個人想法可轉移,

這次,他把公開測驗版推遲到了7月1日,

焦頭爛額之際,卡特勒得到了一個意外喜訊,他的老東家DEC同意成為購買NT的第一個計算機制造商,在他看來,被DEC取消的Mica專案和NT大體是等價的,實際上,NT的許多元素都有他在DEC做系統時的技術映射,比如記憶體管理、行程和調度與VMS非常相似,而DEC現在卻花大價錢買下原本可以免費擁有的東西,這讓他體會到一絲復仇打臉的快感,

4

混亂終將變得有序

隨后卡特勒要求團隊快馬加鞭,讓工程師注意細節,為了激勵他們的斗志,有時還親自上陣負責寫模塊,

終于,1992年6月29日,他們發布了一個WindowsNT Beta版本,主要改善了系統的質量和可靠性,接下來,他們需要花幾個月時間完成未完的功能、修復Bug、提高性能并盡可能減小NT,最終版本將在年底發布,

太大、太慢是一直困擾他們的關鍵問題,有人調侃,NT是一頭吃記憶體的飛豬,在性能方面是一只蝸牛,這兩個指標離蓋茨在三年前設定的目標還很遠,

卡特勒承認NT太慢,但現在差不多達到他的期望了,因為對性能的改進沒有止境,軟體歷史充分證明,從IBM的360到不同風格的UNIX,再到微軟的Windows,幾乎所有劃時代的系統都是在不成熟的狀態就發布出來,然后逐步演進并贏得更廣泛的認可,

記憶體方面,蓋茨的公開目標是將NT的最低記憶體要求設定為8MB,但現在至少需要16MB才能滿足典型用戶的應用需求,而當時大多數個人電腦裝備的是4MB記憶體,而增加記憶體容量的話要花更多成本,

至此,蓋茨只能放棄了在8MB記憶體的PC運行NT的打算,但在性能的問題上他不會讓步,當時作業系統業務大約占微軟所有銷售額的一半,如果這一點不能滿足客戶的要求,它們就可能轉向IBM的OS/2,

一次次的延期發布挫傷了團隊的士氣,但催促連續不斷,而且沒有明確的結束期限,當大多數人認為這個作業系統快結束了,其實還有幾個月的乏味測驗,以及尚未完成的功能和性能改進等著他們,每天大約有2000個Bug需要解決,卡特勒關注Bug數量,就像關注著戰場上的傷亡數字,

他制定的殘酷進度讓很多人難以忍受,尤其最后的死亡行軍期間,很多團隊成員掙扎在作業和個人生活這條線上,讓他們跟情人、朋友、孩子的關系變得很緊張,卡特勒二次婚姻破滅,基本沒有家庭生活上的牽絆,也一直待在戰壕里,NT團隊此刻的拼勁后來也激勵了一位來自遙遠東方的深度學習框架創業者,在《觀止》的第187頁空白處,他寫下了一段批注,“看看創造奇跡的人”

距離創造奇跡還有一步之遙,只是卡特勒再沒敢承諾系統發布的準確時間,為了提升團隊士氣,他在全員郵件中重復著他的口號,“記住這美好的舊日時光”,

1993年6月21日,NT的發布終于進入倒計時,為了慶祝專案即將生產,工程師們為他獻上一個祭壇,一個月后的7月26日,Windows NT終于發到工廠生產了,

獨自坐在辦公室的卡特勒難掩激動心情,他發布了一封全員郵件,開頭寫著:NT發布了,再說一遍,NT發布了——一連摁了5個感嘆號,

5

那美好的舊日時光

卡特勒似乎是那個注定為Windows NT而生的人,它的成功占據天時地利人和,

微軟迫切需要一個可移植的作業系統來幫助其贏得未來,它擁有打造這個系統所具備的足夠資金和人才資源,但只差卡特勒這樣的技術領導者,同樣不容忽視的是,蓋茨和鮑爾默給了他本人最大程度的信任和支持,在微軟王國里封給了卡特勒一片擁有高度決策權的自由領地,

遠大目標的呼召和自由的管理空間對卡特勒推進NT至關重要,在這里他完全施展了他獨特的領導和技術才能,NT團隊沒有固定的匯報層級,他本人拒絕過度管理,討厭復雜的規章制度,盡可能不插手下屬的作業,相信最突出的才干會在人數較少的小團隊中顯現,他在分配作業時留有一定靈活性,喜歡讓每個人扮演不同角色,可以主動解決沒有明確職責歸屬的事,而不是畫地為牢,

卡特勒像是同時兼電影導演、演員和場務于一身,他證明自己可以把混亂的系統變得有序,不管它有多么難控制,

作為導演,他依賴于召集到的所有人的才能,同時將自己的思想和偏好施加到下屬身上,如果在方向問題出現各種創意和分歧,最后由他拍板如何去做,他的挑戰在于如何讓這些有才華的人遵循同一份進度安排,服從同一份通知,同時,作為演員和場務,他又能時刻親自上陣,為系統的每一條程式把脈,值得一提的是,NT的177個.c檔案出自卡特勒,比NT首席架構師Mark Lucovsky還要多一倍,在長期無序的技術架構和組織結構演變中,他是運籌帷幄的那個人,

可以想象,在研發Windows NT的5年里,如果不是由卡特勒這樣執著、強悍的猛人把持,要帶領250名精英工程師在心力交瘁的上千個日夜里不斷推進絕非易事,換個人領導NT團隊可能會是另一番光景,

當然,NT的成功離不開每一位工程師付出的艱苦努力,而該專案后來的巨大成功也證明,他們的付出是值得的,一直到2001年Windows XP發布,NT已成為所有Windows產品的內核系統,包括2021年最新發布的Windows 11,而它卻是一個30年前設計的系統,老年的卡特藍訓自豪地告訴你,那全部都基于NT,

這離不開NT內核的技術創新,從NT發布的第一天起,其諸多特性從根本上保證很多方面優于UNIX,以及后來的Linux:

  • 日志檔案系統NTFS,具有抗崩潰能力和性能,Linux在NT發布6年后開始才具備類似的日志功能集

  • 含有第三代擴展檔案系統ext3,

  • 服務,在UNIX里,“守護行程(daemons)”是常規行程,要啟動一個守護行程,你必須知道它的位置、語法和依賴關系,而NT允許用戶集中管理服務行程并自動管理它們的依賴項,GNOME和KDE在2000年有了類似NT的服務概念,幾年后被DBus標準化,MacOS和SystemD則分別于2005、2011年才有,

  • 注冊表,用于存盤和檢索應用程式配置資料的統一模型,UNIX在 /etc中有任意格式的文本檔案,但在實踐中效果不佳,導致產生版本控制/隔離問題,

  • 執行緒和行程有很大區別,UNIX將行程作為執行和地址空間的單位,它的一些實作支持執行緒(或LWP,輕量級行程),但在POSIX執行緒出現前,它們的創建成本更高且非標準,

  • NT的模塊化設備驅動架構允許在系統初始化后加載設備驅動,而當時的UNIX通常將驅動編譯到內核中,NT還支持PnP和“設備樹(device trees)”,所以可以正確計算驅動初始化的依賴項,2003年,Linux才具備“統一設備模型”能力,

  • 一個 O(1) 調度程式,直到2003年Linux才具備,

  • NT的內核是“可搶占的”,有更好的系統回應能力和并行處理性能,在OS X Leopard前,OS X的搶占性(粗粒度鎖定)非常有限,Linux在2011年才擺脫了粗加鎖方式,

1996年,卡特勒停止管理整個NT專案,但繼續領導內核開發直到2006年,自2000年以來,他參與開發了每一個Windows版本的核心技術,包括第一個完整32位的Windows 版本,同時對AMD64平臺的Windows XP、Server 2003系統做出重要貢獻,后來隨著計算機行業從服務器轉向云服務,他在2008年擔任微軟Azure云計算平臺的主要開發者,2012年,他參與開發了Xbox主機作業系統部分,

在幾十年職業生涯中,他在架構設計、編碼、注釋等方面表現出的嚴謹風范,深刻影響了微軟技術團隊的工程文化,這也是他影響工程師的永久性遺產,

如今,這位出生于1942年,現已是79歲的高齡工程師依然還會去辦公室寫代碼,他喜歡完成自己的代碼,然后看著它正常作業,休息間隙,這個倔老頭兒或許還會憶起開發NT的那美好的舊日時光,

題圖源自微軟官網、維基百科

參考資料

1.《觀止:微軟創建NT和未來的奪命狂奔》,G. Pascal Zachary著,張銀奎等譯

2.https://news.microsoft.com/features/the-engineers-engineer-computer-industry-luminaries-salute-dave-cutlers-five-decade-long-quest-for-quality/

3.https://retrocomputing.stackexchange.com/questions/14150/how-4.should-we-interpret-dave-cutlers-criticism-of-unix/14151

5.https://en.wikipedia.org/wiki/Dave_Cutler

6.https://en.wikipedia.org/wiki/Windows_NT

7.https://www.tech-insider.org/windows/research/1993/0526.html

其他人都在看

  • OneFlow v0.5.0正式上線

  • 計算機架構史上的一次偉大失敗

  • OneFlow中的錯誤處理:Maybe

  • 最理想的點到點通信庫究竟是怎樣的

  • 一文詳解OneFlow的DataLoader實作

  • 如何實作比PyTorch快6倍的Permute/Transpose算子

歡迎下載體驗OneFlow新一代開源深度學習框架:GitHub - Oneflow-Inc/oneflow: OneFlow is a performance-centered and open-source deep learning framework.


目錄

1

“雙非”工程師的逆襲

2

躊躇滿志卻狀況百出

3

截止日期節節敗退

4

混亂終將變得有序

5

那美好的舊日時光


轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/355296.html

標籤:其他

上一篇:2萬字全面總結計網 之 網路層,建議考前通讀復習

下一篇:劍指offer-之-字串

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more