工程傳奇 會飛的豬

2021-08-23 12:44:55 字數 3767 閱讀 5765

給豬裝上翅膀。標題黨的厲害,實際上內容是很嚴肅的,講的是**飛機的裡裡外外。第一代的**飛機是

f-117 nighthawk,的確是很雷人。很難想象,這副樣子的東西,居然還能飛起來,還能打仗。從某種程度講,它長得真有幾分像一頭豬,還長著翅膀。

f-117的身世還極具傳奇色彩。研製的時候它的保密工作做到了家,造謠、掩蓋、煙幕彈,都幹過,甚至還出了款玩具欺騙大眾,把地球人忽悠了十多年。廢話少說,回到主題。f-117專案差不多開始於2023年,也是

skunk works的 傑作。美國人在越戰後想造一種能夠躲過雷達偵測的戰鬥機。但是限於當時的計算能力,無法計算曲面的雷達反射特性,更不說複雜曲面和曲面的組合了。如果做模 型挨個試,純粹大海撈針,況且雷達波反射測試費用不菲,不能像f-104那樣用點戰爭剩餘物資就能擺平的。結果洛馬的工程師們做了很geeky的設計—— 用平面造飛機。既然平面的電磁反射特徵是可以計算的,那麼把各種不同形狀的平面拼接起來,就有可能造出一架雷達難以探測的飛機。skunk works很快做出了乙個

模型, 並且驗證了其隱身特性。那麼這樣的飛機能飛嗎?很顯然,它飛起來了。非但飛起來了,還正式服役到今年(今年8月份最後一架夜鷹退役)。在入侵巴拿馬的作戰 行動中扔下了第一枚,參與了海灣戰爭,空襲伊拉克,並在科索沃被擊落一架。為了不被偵測到,f-117事實上付出了巨大的代價。不能超音速,不能做劇 烈機動,沒有雷達,只能帶兩枚2000lb的。一旦被發現,打不了,也跑不了。

但是,作為第一種全面隱身的戰鬥機(實際上是攻擊機,拿戰鬥機的名頭糊弄人呢),f-117是相當成功的。最關鍵的,它達到了根本的目標——**戰鬥機。 首先,它能飛,而且飛的還不錯。其次,能夠戰鬥,它可以扔,儘管只有兩枚。最後,它**了,雷達難以偵測。f-117的設計基於這樣乙個核心邏輯:無 論你多麼強悍,如果看不見對手,乙個小毛孩子拿著吉利刀片也能要你的命。只要達到**這個目標,即便有不佳的飛行效能和很少的載彈量,也足以發揮關鍵性的 作用。因而,f-117被用於針對關鍵目標的關鍵任務,就好比用剃刀割對手的頸動脈那樣,一擊致命。

從工程角度來講,skunk works的工程師們主動地簡化設計,降低目標要求。他們在當時技術條件的制約下,不追求完美的解決方案,把目標集中在關鍵性的特性(**)上。在其他方 面,主動放棄次要目標。這是典型的:make it run first。我們在設計軟體時,有時會陷入最求完美的困境。要求更多的靈活性、適應性、擴充套件性、效能等等。最終,迷失在特性的海洋裡。我們時常被告誡,先 實現80%的功能。而這80%的功能,通常都集中在20%的特性上。

假設我們需要開發乙個基於web的查詢平台,具體查詢的內容和演算法會隨著客戶的變化和需求的變化而變動,有時還會有現場快速實現的需求。同時所查詢的資料 的結構具有動態的特徵,有些資料的結構在執行時方能確定。基於這些要求,我們不能把查詢寫死在**裡,需要指令碼化。又因為是web的應用,那麼如果能夠從 資料庫中獲得資料,直接轉換成html片段插入頁面,那麼系統就會很容易實現和變化。實現這個任務最理想的做法是使用xml db之類的資料庫,利用xslt或者xquery直接在資料上查詢。但是,目前xml db並不成熟,效能也不如rdms。現在,我們有兩種選擇:開發成熟的,效能優良的xmldb;或者仍舊使用rdms,但利用一些輔助工具。很顯然,前者 是愚蠢的行為。

最初,我們可以手工地寫sql語句,然後把結果集組織成層次化的結構,提取出xml,再用xslt或者xquery處理,獲得html。更好一些的方法, 利用現成的資料轉換模組,諸如.net的dataset,進行結果集組織和xml提取。這種設計所需的東西就在手邊,可以很快實現。它的不足之處在於,必 須提取出所有的結果集資料,然後才能轉換成完整的xml,在處理大資料量時,會有效能問題。

做到這一步,我們可以分析一下,是否還需要更進一步地深入開發,增加功能。

首 先,這個方案是否容易變化。在這個方案中,實現查詢的是乙個sql命令和乙個xslt stylesheet。前者用於從rdms中提取資料,並組織成xml結構。而後者則負責構造html,並處理一些在sql中實現困難的查詢。兩者都是用 於資料處理的dsl,相比通用語言,執行查詢任務更加簡潔方便。兩者都可以組織在乙個指令碼檔案中,都是文字,可以方便修改。

其次,是否能夠現場快速實現需求變化。sql和stylesheet都可以指令碼化,可以直接修改執行,無需編譯,和ide的支援。

再次,能否處理執行時的資料結構變化。sql只能依賴固定的資料結構,這是在design time已經確定的東西。但是當sql查詢獲得的結果集轉換為xml後,就成為半結構化資料,可以擁有動態的資料構造。而xslt則具備在這種構造上查詢資料的能力。

最 後,再來看看效能問題。對於一般應用,查詢獲得的資料量不會,也不應當太多。對於人而言,成千上萬條資料放在面前,也是無法處理的。所以,一般情況下,一 次查詢返回的資料不超過3、5百條,大約30kb以內。這些資料量,轉換成xml,然後再執行xslt轉換,在普通的piv 3.0/1g記憶體的系統上,0.1秒以內肯定可以完成。這點時間對於使用者而言完全可以接受。更何況系統執行在web伺服器上,執行時間會有數量級的提公升。

但是,終究會有不少查詢需要處理大量的資料。

這 些查詢中可以進一步分類。其中比較多出現的,是簡單結果集,也就是乙個sql查詢獲得的結果集就是使用者需要的結果。這些結果集沒有層次結構,完全就是乙個 table。這樣的查詢,可以先分段,比如100條資料一段,把一段資料轉換成xml,然後執行xslt,結果傳送到客戶端顯示,然後再處理下一段。這 樣,使用者就不必等待資料全部提取並處理完成,幾乎立刻就能看到資料,而後續資料,則利用使用者閱讀第一批資料的時間進行處理。這種分段處理機制可以很容易地 加入查詢平台,無需很大的工作量。

至此,大部分的查詢需求(差不多就有80%了吧)都得到覆蓋。至於那些大資料量的有層次結構的資料,或者無法分段處理的資料,或者無法固定分段處理的資料,可以不做考慮。一旦使用者需要,定製專門的模組處理。

f-117並不是「飛豬」故事的終結,而是開始。隨著技術的發展,工程師們擁有了處理簡單曲面的計算能力。於是,立刻將其運用到飛機上,

b-2 spirit誕 生了。無論如何,b-2看起來更像一架正常的飛機了,儘管它也不是一種常規的飛機。僅從資料上看,b-2強大的令人髮指,最大起飛重量170噸,航程 11000km,載彈量22.7噸,可以攜帶幾乎所有的美軍現役,最新的改進,使得它能夠同時扔下80枚,打擊80個不同的目標。相對於f- 117,這已經是質的飛躍了。而儘管其身軀龐大,但隱身能力則比f-117更進一步。這也就是關鍵技術突破帶來的必然結果。

不過,b-2還不夠,80年代後期開始,it技術的發展使得人們擁有了處理複雜曲面的計算能力。於是,美國人不惜血本地研發了終極戰機——

f-22 raptor。f-22的能力只需乙個數字便可說明:在美軍組織的f-22vsf-15/16演習中,f-22取得了114:1的戰績。

這 三代**戰機的成功故事再一次強調了工程中的乙個經典實踐:make it run first。在最初階段,著力實現最關鍵,最核心的功能,而這些功能足以滿足多數的應用需求。而其他方面的需求則暫時加以迴避,或通過傳統手段實現。隨著 技術的發展和進步,那些外圍功能的技術條件逐步成熟,相應的功能也會自然而然地得到實現。

隨著xml及其相關技術的大規模應用,各大傳統rdms廠商也逐步地在各自的資料庫中引入xml相關的技術。比如

xml/sql,for xml子句等等。這些技術可以使得我們直接在sql語句中將結果集構造成有層次結構的xml文件。利用這些技術,大資料量卻擁有層次結構的結果集,以及無 法固定分段的結果集,都可以進行分段處理。在這些技術的作用下,真正無法在這個查詢系統中實現的查詢,變得很稀少了。此時,我們也可以近似地認為這個查詢 系統可以滿足所有面臨的應用,而不必耗費更多的精力來實現剩下的這些千年一遇的需求了。

不過,在運用這種工程方法的時候,有乙個先決條件:必須正確地識別關鍵目標特性。如果我們在查詢系統的案例中,一開始把大資料量處理能力作為關鍵目標特 性,那麼很顯然,不會採用這樣的設計,從而偏離真正的目標。對於關鍵目標特性的識別,可以通過考察需求,尋找那些滿足最多需求的特性,加以排序分析。

站在風口的豬也會飛,背後推手是誰?

當小公尺開發產品時,數十萬消費者熱情地出謀劃策 當小公尺新品上線時,幾分鐘內,數百萬消費者湧入 參與搶購,數億銷售額瞬間完成 當小公尺要推廣產品時,上千萬消費者興奮地奔走相告 當小公尺產品售出後,幾千萬消費者又積極地參與到產品的口碑傳播和每週更新完善之中 究竟是什麼引發了中國商業史上前所未有的奇觀?...

厲害了!會飛的盆栽

環保千萬條,植樹第一條 讓地球不再流浪 環保 春天 植樹節綠色小樹草地分割線 今天是植樹節,然而也是工作日 出去植棵樹是不大可能了 但是!室內小盆栽可以有呀!glowing plant 會發光的植物 會發光的植物.png 發光植物.jpg genome compiler是美國的一家合成生物科技公司,...

紫色飛豬的研發之旅 05go封裝http請求

request.header.set 與request.header.add 區別 checkrespstatus 狀態檢查 getrequest 建立get請求 func getrequest url string,headerset map string string respstatuscod...