即將來臨的軟件啟示錄

在2014年4月10日,在華盛頓州的全部人口沒有911服務的晚上這里是六個小時。呼救的人得到了一個忙碌的信號。一名西雅圖女子至少37次撥打911,而一名陌生人試圖闖入她的房子。當他終于從窗戶爬進她的起居室時,她拿起一把菜刀。那個男人逃走了。

在有史以來最大的報道中,911中斷被追溯到科羅拉多州恩格爾伍德的服務器上運行的軟件。由一個名為Intrado的系統提供商運營,該服務器保持了一個運行計數器,它已經向全國各地的911調度員發送了多少呼叫。Intrado程序員已經設定了計數器可以達到的高度的閾值。他們選擇了數百萬的數字。

在4月10日午夜前不久,柜臺超過了這個數字,導致混亂。由于計數器用于為每個呼叫生成唯一標識符,因此拒絕新呼叫。而且由于程序員沒有預料到這個問題,他們沒有創建警報來引起注意。沒有人知道發生了什么。華盛頓州,加利福尼亞州,佛羅里達州,卡羅來納州和明尼蘇達州的調度中心為1100萬美國人提供服務,他們很難理解有關呼叫者忙碌信號的報道。直到早上才意識到恩格爾伍德的Intrado軟件是負責任的,并且修復是為了改變一個數字。

不久前,緊急呼叫在當地處理。停電很小,很容易診斷和修復。手機的興起和新功能的承諾 - 如果你能發短信911怎么辦?或發送視頻給調度員? - 推動了依賴互聯網的更復雜系統的發展。這是第一次出現國家911停電這樣的事情。現在已經有四年了。

據說軟件“正在吞噬世界。”越來越多的機械或人員控制的關鍵系統將依賴于代碼。這可能永遠不會比2015年夏天更加清晰,因為在一天之內,由于其離港管理系統存在問題,聯合航空公司將其機隊停飛; 升級后,交易在紐約證券交易所暫停; 華爾街日報網站的頭版崩潰了; 西雅圖的911系統再次出現故障,這次是因為另一臺路由器出現故障。這么多軟件系統的同時失敗首先是在協調的網絡攻擊中聞到的。幾乎更可怕的是,當天晚些時候認識到,這只是一個巧合。

“當我們有機電系統時,我們過去常常能夠對它們進行詳盡的測試“麻省理工學院航空航天學教授Nancy Leveson說,他一直在研究軟件安全35年。她因有關Therac-25的報告而聞名,該放射治療機由于軟件錯誤導致六名病人死亡。“我們曾經能夠思考它可以做的所有事情,它可以進入的所有狀態。”例如,控制鐵路交叉口列車運動的機電聯鎖只有很多配置; 幾張紙可以描述整個系統,你可以針對每個配置運行物理列車,看看它的行為方式。一旦你構建并測試它,你就知道你正在處理什么。

軟件不同。只需在某處編輯文件中的文本,相同的硅片就可以成為自動駕駛儀或庫存控制系統。這種靈活性是軟件的奇跡,也是它的詛咒。因為它可以廉價地改變,軟件會不斷變化; 因為它不受任何物理攻擊 - 一個比另一個更復雜的程序占用相同的實際空間 - 它往往會無限制地增長。<mark class="nk nl ex" style="box-sizing: inherit; cursor: pointer; background-color: rgb(255, 213, 194); color: currentcolor;">“這個問題,”Leveson在一本書中寫道,“我們正試圖構建超出我們智力管理能力的系統。”</mark>

我們用于思考工程故障的標準框架(例如,在醫療設備法規中得到反映)是在第二次世界大戰后不久,軟件出現之前為機電系統開發的。我們的想法是,通過使其部件可靠(例如,您構建發動機以承受40,000次起飛和著陸循環)并通過計劃這些部件的故障(您有兩個發動機)來制造可靠的東西。但軟件并沒有破解。Intrado的故障閾值不像導致客機墜毀的故障鉚釘。該軟件完全按照它所做的去做。事實上它完美地做到了。失敗的原因是它被告知要做錯事。軟件失敗是理解和想象的失敗。Intrado實際上有一個備份路由器,如果它已經自動切換,幾乎可以立即恢復911服務。但是,正如聯邦通信委員會的一份報告中所描述的那樣,“情況發生在應用程序邏輯中的一個點上,該點并非旨在執行任何自動糾正措施。”

這是用代碼制作東西的麻煩,而不是物理的東西。正如Leveson所說,“復雜性”是“看不見的”。

[圖片上傳失敗...(image-9c7141-1565709376163)]

[圖片上傳失敗...(image-551527-1565709376163)]

?他試圖現在正在進行改變我們如何使軟件似乎都與同一個前提:代碼是太難思考的問題。在嘗試理解這些嘗試本身之前,值得理解為什么這可能是:代碼使它對思想如此陌生,以及與之前的任何東西不同。

技術進步曾經改變了世界的樣子 - 你可以看到鋪好的道路; 你可以看到天際線上升。今天你幾乎無法分辨什么東西被重制,因為它經常被代碼重新制作。例如,當你用腳踩下汽車的加速器時,你就不再直接控制任何東西; 從踏板到油門沒有機械連接。相反,您正在向一個軟件發出命令,該軟件決定給發動機提供多少空氣。這輛車是你可以坐在里面的電腦。方向盤和踏板也可能是鍵盤鍵。

與其他所有產品一樣,該車已經過計算機化以實現新功能。當一個程序負責油門和制動時,當你離另一輛車太近時它可以減慢你的速度,或者精確地控制燃油噴射以幫助你節省燃氣。當它控制轉向時,它可以讓您在開始漂移時保持在您的車道上,或引導您進入停車位。沒有代碼,您無法構建這些功能。如果你試過,一輛汽車可能重達40,000磅,這是一支不可移動的發條。

軟件使我們能夠制造出迄今為止最復雜的機器。然而,我們幾乎沒有注意到,因為所有這些復雜性都被包含在微小的硅芯片中,成千上萬行代碼。但僅僅因為我們看不到復雜性并不意味著它已經消失了。

這位程序員,著名的荷蘭計算機科學家埃德斯·迪克斯特拉(Edsger Dijkstra)在1988年寫道,“必須能夠思考比以前需要面對的單一思想更深刻的概念層次。”Dijkstra將此視為警告。隨著程序員急切地將軟件傾注到關鍵系統中,他們越來越成為建筑世界的關鍵 - 而Dijkstra認為他們可能已經高估了自己。

使編程如此困難的原因是它需要你像計算機一樣思考。在計算的早期階段,當代碼采用文字和零的形式時,它的陌生感在某種意義上更加生動。任何看過程序員肩膀的人都會看到程序員與他們試圖解決的實際問題有多么疏遠,因為他們會像“100001010011”和“000010011110”一樣仔細思考。我們無法判斷他們是在試圖計算炮兵軌跡還是模擬一個井字游戲。引入類似于英語的Fortran和C等編程語言,以及稱為“集成開發環境”的工具,或稱為幫助糾正簡單錯誤的工具(如Microsoft Word的語法檢查程序,但代碼),模糊不清,

“問題是,軟件工程師不懂的問題,他們正在試圖解決,并不在乎,” Leveson,麻省理工學院軟件安全專家說。原因是它們太過于無法讓代碼工作。“軟件工程師喜歡提供各種工具和編碼錯誤的東西,”她說,指的是IDE。“軟件發生的嚴重問題與需求有關,而不是編碼錯誤。”例如,當您編寫控制汽車油門的代碼時,重要的是關于何時,如何以及打開多少的規則它。但是這些系統變得如此復雜,以至于幾乎沒有人能夠將它們直接放在腦中。“現在汽車中有1億行代碼,”Leveson說。“你無法預料到所有這些事情。”

2007年9月,當加速器似乎被卡住時,Jean Bookout和她最好的朋友在豐田凱美瑞一起駕駛高速公路。當她從踏板上踩下腳時,車子沒有減速。她試過剎車但似乎失去了力量。當她轉向一個每小時50英里的匝道時,她拉緊急剎車。這輛車在跑到路邊的路堤之前留下了150英尺長的防滑標記。這名乘客遇難。一個月后,預約在醫院醒來。

這項事件是近十年來對豐田汽車所謂的意外加速聲稱的調查中的眾多事件之一。豐田將事故歸咎于設計不良的地板墊,“粘性”踏板和駕駛員錯誤,但外界懷疑有缺陷的軟件可能是負責任的。美國國家公路交通安全管理局邀請美國宇航局的軟件專家對豐田的代碼進行深入審查。在將近10個月后,NASA團隊沒有找到證據證明軟件是原因 - 但他們說不能證明它不是。

正是在Bookout事故的訴訟中,有人終于找到了令人信服的聯系。原告的專家證人邁克爾·巴爾(Michael Barr)有一個軟件專家團隊用豐田代碼花了18個月的時間,在美國宇航局停止工作的地方。Barr描述了他們發現的“意大利面條代碼”,程序員語言的軟件已成為一個混亂的混亂。代碼變成了意大利面條,當它累積多年時,功能堆疊在上面,并編織在周圍,已經存在的東西; 最終代碼變得無法遵循,更不用說徹底檢查缺陷了。

Barr的團隊使用與事故中涉及的凱美瑞相同的模型,證明車載計算機實際上有超過1000萬種方式會導致意外加速。他們表明,只需一個位翻轉 - 計算機內存中的一個變為零或反之亦然 - 可能會使汽車失控。豐田實施的故障安全代碼還不足以阻止它。“你有軟件看軟件,”巴爾作證說。“如果軟件發生故障并且同一個程序或同一個崩潰的應用程序應該可以節省一天的時間,那么它就無法保存,因為它無法正常工作。”

Barr的證詞為原告提起訴訟,導致Bookout和她朋友的家人損失300萬美元。據“紐約時報”報道,這是針對豐田的許多類似案件中第一起引發電子節氣門控制系統試驗問題的案例,也是豐田首次因涉及意外加速的事故而被陪審團負責。雙方決定解決案件,然后才能判給懲罰性賠償金。總而言之,豐田召回了超過900萬輛汽車,并支付了近30億美元的定居費和與意外加速相關的罰款。

[圖片上傳失敗...(image-d1b6a1-1565709376163)]

[圖片上傳失敗...(image-b5d33b-1565709376163)]

?這里會更壞天軟件。重要的是我們要做得更好,因為如果我們不這樣做,并且隨著軟件變得更加復雜和連接 - 因為它控制了更多關鍵功能 - 那些日子可能會變得更糟。

問題是程序員很難跟上他們自己的創作。自20世紀80年代以來,程序員的工作方式和他們使用的工具變化非常小。有一個小但不斷增長的合唱,擔心現狀是不可持續的。“即使是非常優秀的程序員也在努力理解他們正在使用的系統,”作為微軟Visual Studio工作的軟件開發人員Chris Granger說道,這個IDE每年花費1199美元,幾乎被使用三分之一的專業程序員。他告訴我,當他在微軟時,他安排了Visual Studio的端到端研究,這是迄今為止唯一的研究。在一個半月的時間里,當人們編寫代碼時,他在單向鏡子后面觀看。“他們如何使用工具?他們怎么想?“他說。“他們怎么樣?坐在電腦前,他們觸摸鼠標,不觸摸鼠標嗎?所有這些我們都有教條的事情,我們實際上并沒有憑經驗進行測試。“

調查結果令他驚訝。“Visual Studio是世界上最大的軟件之一,”他說。“這是超過5500萬行代碼。我在這項研究中發現的其中一件事超過98%完全無關緊要。所有這些工作都已付諸實踐,但它錯過了人們面臨的根本問題。我從中拿走的最大的一個就是人們正在腦子里玩電腦。“程序員就像是試圖用眼罩玩耍的國際象棋選手 - 他們的大部分心理能量都花在試圖描繪出來的地方是否幾乎沒有任何遺留下來考慮游戲本身。

John Resig在他的學生中注意到了同樣的事情。Resig是一位著名的JavaScript程序員 - 他在所有網站中占據了一半以上的軟件 - 以及在線教育網站Khan Academy的技術主管。2012年初,他一直在努力學習該網站的計算機科學課程。為什么學習編程這么難?基本問題似乎是代碼是如此抽象。編寫軟件并不像用冰棍棒制作橋梁,在那里你可以看到木棍并觸摸膠水。要“制作”一個程序,你輸入單詞。當你想改變程序的行為時,無論是游戲,網站,還是物理模擬,你實際改變的是文本。因此,表現良好的學生 - 實際上是唯一幸存下來的學生 - 是那些能夠一步一步地通過該文本的人,思考計算機的方式,試圖跟蹤每個中間計算。像格蘭杰一樣,雷吉格開始懷疑它是否必須如此。在過去的40年中,計算機每18個月的功率增加一倍。為什么沒有改變編程?

事實上,他們兩個同時以同樣的方式思考同一個問題并不是巧合。他們剛剛在蒙特利爾一家名為Bret Victor的計算機研究人員那里,向一群軟件工程學生發表了同樣精彩的演講。談話在2012年2月在網上發布時傳播開來,似乎有兩個大膽的主張。首先,我們制作軟件的方式從根本上被打破了。第二個是Victor知道如何解決它。

[圖片上傳失敗...(image-ac7b10-1565709376163)]

[圖片上傳失敗...(image-f11e73-1565709376163)]

Bret victor不喜歡編寫代碼。“聽起來很奇怪,”他說。“當我想做一件事,特別是當我想用軟件創造一些東西時,我必須要完成這個最初的厭惡層,在那里我不會操縱我想做的東西,我正在寫一堆文字進入文本編輯器。“

“有一種非常強烈的信念,認為這是錯誤的做事方式。”

維克多擁有大衛·福斯特·華萊士(David Foster Wallace)的風采,閃電般的智慧縈繞在一片羞澀的羞澀之下。他今年40歲,身上留著灰色的痕跡,還有一絲瘦弱的胡須。他的聲音很溫柔,幾乎是悲傷的,但是他想要分享他腦袋里的東西,當他開始滾動時,他似乎會跳過音節,仿佛超越了他自己的聲樂機器。

雖然他經營著一個研究計算未來的實驗室,但他似乎對技術本身的興趣不如對使用它的人的頭腦感興趣。像任何優秀的工具制造商一樣,他有辦法看待技術和人性相等的世界。他畢業于加州理工學院電氣工程專業,并在加州大學伯克利分校畢業后繼續在一家開發音樂合成器的公司工作。這是一個與他的雙重人格完美匹配的問題:他可以花多少時間思考表演者用鍵盤制作音樂的方式 - 它成為他們手的延伸的方式 - 因為他可以考慮數字信號處理的數學。

當他給出了他的名字的演講時,就像Resig和Granger在2012年初看到的那樣,Victor終于找到了似乎貫穿他所有工作的原則。(他實際上稱之為“發明原則”。)原則是:“創作者需要立即與他們正在創造的東西聯系起來。”編程的問題在于它違反了原則。這就是為什么軟件系統如此難以思考,以及如此充滿錯誤的原因:程序員,盯著一頁文本,從他們實際制作的任何內容中抽象出來。

“我們目前關于計算機程序的概念,”他說,“直接來自Fortran和ALGOL,在50年代后期。這些語言是專為打卡而設計的。“該代碼現在采用C或Java(Fortran和ALGOL的衍生物)等語言在屏幕上的字母形式,而不是一堆帶孔的卡片,而不是它不會死,也不會間接的。

有一個類似于文字處理。過去,您在編寫文檔的程序中看到的只是文本本身,要更改布局或字體或邊距,您必須編寫特殊的“控制代碼”或命令,告訴計算機,例如,“文本的這一部分應該用斜體字表示。”問題是,在打印文檔之前,您無法看到這些代碼的效果。很難預測你會得到什么。您必須想象計算機將如何解釋代碼 - 也就是說,您必須在腦中玩電腦。

然后WYSIWYG(發音為“wizzywig”)出現了。它代表“所見即所得”。當你用一條斜體標記一段時,字母就會在屏幕上傾斜。如果要更改邊距,可以在屏幕頂部拖動標尺 - 并查看該更改的效果。因此,該文件變得像真實的東西,你可以戳戳和刺激的東西。只是通過觀察你可以判斷你是否做錯了什么。任何可以在頁面上點擊的人都可以訪問復雜系統的控制 - 文檔的布局和格式化引擎。

Victor的觀點是編程本身應該是這樣的。對他來說,通過盯著文本編輯器,人們正在做重要工作的想法,比如設計自適應巡航控制系統或試圖了解癌癥,這是令人震驚的。程序員的正確工作是確保有一天他們不必這樣做。

有先例足以表明這不是一個瘋狂的想法。例如,Photoshop將強大的圖像處理算法交給那些可能甚至不知道算法是什么的人。這是一個復雜的軟件,但復雜的合成器很復雜,用戶可以像儀器一樣學習旋鈕,按鈕和滑塊。Squarespace是一家以播客廣告而聞名的公司,它提供了一種工具,可以讓用戶通過指向和點擊來構建網站,而不是通過在HTML和CSS中編寫代碼。它足夠強大,可以完成曾經由專業網頁設計師完成的工作。

但這些只是少數幾個例子。壓倒性的現實是,當有人想用計算機做一些有趣的事情時,他們不得不編寫代碼。維克多是一個理想主義者,他認為這不僅僅是一個機會,而是一個程序員的道德失敗。他的講話是對武器的呼喚。

其中的核心是一系列演示,試圖展示可用工具對各種問題的原始性 - 電路設計,計算機動畫,調試算法 - 以及更好的工具。他的演示是精湛的。諷刺的是,那個俘獲每個人想象力的那個人,其表面上最瑣碎的是那個。它顯示了一個分屏,其中一側的游戲看起來像馬里奧,而另一側則是控制它的代碼。隨著維克多改變了代碼,游戲世界中的事物發生了變化:他減少了一個數字,引力的強度,以及馬里奧角色的浮動; 他增加了另一個,球員的速度,馬里奧在屏幕上比賽。

假設你想設計一個水平,馬里奧,跳躍反彈烏龜的,將只是使之成為一個小通道。游戲程序員習慣于分兩個階段來解決這類問題:首先,你盯著你的代碼 - 控制馬里奧跳得多高的代碼,他跑得多快,烏龜的背部有多么彈性 - 并在你的代碼中做了一些修改文本編輯器,用你的想象力來預測它們會產生什么樣的影響。然后,你重播游戲,看看究竟發生了什么。

CUSEC / Vimeo

維克多想要更直接的東西。“如果你有一個及時的過程,”他說,指的是馬里奧穿過關卡的路徑,“你想立即看到變化,你必須把時間映射到太空。”他按了一個按鈕,顯示的不僅僅是馬里奧的位置現在,但他將來會在未來的每個時刻:一個影子Marios的曲線延伸到遠處。更重要的是,這個投射路徑是被動的:當Victor改變游戲的參數時,現在通過快速拖動鼠標來控制,路徑的形狀發生了變化。這就像是對游戲有一個神奇的看法。整個問題已經減少到使用不同的參數,就好像調整立體聲接收器上的水平,直到你讓馬里奧穿針。使用正確的界面,幾乎就像你根本不使用代碼一樣;

當觀眾第一次看到這一點時,他們真的喘不過氣來。他們知道他們不是在看孩子的游戲,而是他們的行業未來。大多數軟件涉及的行為隨著時間的推移以復雜的方式展開,而且Victor已經表明,如果你有足夠的想象力,你可以開發出看待這種行為并改變它的方法,就像在你手中玩它一樣。一位看過這個演講的程序員后來寫道:“突然之間,我的所有工具都過時了。”

[圖片上傳失敗...(image-80f0c6-1565709376163)]

[圖片上傳失敗...(image-eb21ce-1565709376163)]

當John Resig看到“發明原則”的談話時,他取消了他對可汗學院編程課程的計劃。他希望網站的編程練習能像Victor的演示一樣工作。在左側,你有代碼,右邊是正在運行的程序:圖片或游戲或模擬。如果您更改了代碼,它會立即更改圖片。“在一個真正響應的環境中,”Resig寫道,“你可以徹底改變學生如何學習的模型...... [他們]現在可以立即看到結果并直觀地了解底層系統如何在沒有明確遵循的情況下工作“可汗學院已成為世界上最大的計算機編程課程,平均每個月有100萬學生積極使用該計劃。

曾在微軟Visual Studio工作過的Chris Granger同樣受到啟發。在看到Victor的演講視頻后的幾天內,他在2012年1月建立了一個新編程環境的原型。它的關鍵功能是它可以為您提供有關您的程序行為的即時反饋。您可以在控制它的代碼旁邊看到您的系統正在做什么。這就像脫掉眼罩一樣。格蘭杰稱這個項目為“光桌”。

2012年4月,他在Kickstarter上尋求Light Table的資金。在編程界,這是一種感覺。在一個月內,該項目籌集了超過20萬美元。思想傳播開來。活躍的概念,即能夠立即看到流經您程序的數據,已經成為Google和Apple提供的旗艦編程工具。制作新的iPhone和Mac應用程序的默認語言,稱為Swift,由Apple開發,以支持一個名為Playgrounds的環境,該環境直接受Light Table的啟發。

但看到他的談話最終產生的影響,布雷特維克多失望了。“很多事情似乎都是對我所說的錯誤解釋,”他后來說道。當人們開始邀請他參加會議討論編程工具時,他知道出了什么問題。“每個人都認為我對編程環境很感興趣,”他說。他真的對人們如何看待和理解系統感興趣 - 正如他所說的那樣,在“動態行為的可視化表示”中。雖然代碼越來越成為創建動態行為的首選工具,但它仍然是理解最糟糕的工具之一。它。“基于原理的發明”的觀點是,通過在系統的行為與其代碼之間立即建立連接,可以緩解這個問題。

在一對后來的談話中,“停止繪制死魚”和“繪制動態可視化”,維克多進一步說。他演示了他構建的兩個程序 - 第一個用于動畫師的程序,第二個用于科學家試圖可視化他們的數據 - 每個程序都采用了一個過程,過去曾經涉及編寫大量自定義代碼并將其縮小為在WYSIWYG界面中玩游戲。Victor建議,對于今天編寫代碼的幾乎所有問題,都可以采用相同的技巧。“我不確定編程必須存在,”他告訴我。“或者至少是軟件開發人員。”在他看來,軟件開發人員的正確角色是創建工具,消除對軟件開發人員的需求。只有這樣,具有最緊急計算問題的人才能夠直接掌握這些問題,而不需要中間代碼。

當然,要做到這一點,你必須讓程序員自己參與進來。在最近的一篇文章中,維克托懇求專業軟件開發人員停止將他們的才能投入到構建Snapchat和Uber等應用程序的工具中。“日常生活的不便不是重大問題,”他寫道。相反,他們應該把重點放在科學家和工程師身上 - 正如他向我所說的那樣,“這些人正在做的工作實際上很重要,而且非常重要,并且使用真正非常糟糕的工具。”這類令人興奮的工作,特別是他寫道,“基于模型的設計”的工具類已經在進行中,并且已經存在多年,但大多數程序員對此一無所知。

[圖片上傳失敗...(image-23dfb1-1565709376163)]

[圖片上傳失敗...(image-8e5d95-1565709376163)]

“你真的很看重你所擁有的所有工業產品,你正在使用的,公司正在使用的產品,你所擁有的唯一非工業產品是代碼。”EricBantégnie是Esterel Technologies(現為AN??SYS所有)的創始人,這是一家法國公司,生產用于構建安全關鍵軟件的工具。像Victor一樣,Bantégnie并不認為工程師應該通過在IDE中鍵入數百萬行代碼來開發大型系統。“沒有人會手工制造汽車,”他說。“在許多地方,守則仍然是手工藝品。當您手動編寫10,000行代碼時,這沒關系。但是你的系統擁有3000萬行代碼,比如空中客車,或者有1億行代碼,比如你的特斯拉或高端汽車 - 這些都變得非常非常復雜。

Bantégnie的公司是基于模型設計的工業應用的先驅之一,您不再直接編寫代碼。相反,您創建了一種描述程序應遵循的規則(“模型”)的流程圖,并且計算機根據這些規則為您生成代碼。例如,如果您正在為電梯制作控制系統,一條規則可能是當門打開時,有人按下大廳按鈕時,您應關閉門并開始移動汽車。在基于模型的設計工具中,您可以用一個小圖表示這個規則,就像在白板上繪制邏輯一樣,由表示不同狀態的框組成 - 如“門打開”,“移動”和“門”關閉“ - 以及定義如何從一個州到另一個州的行。圖表使系統的規則變得明顯:

這不是Photoshop。當然,Photoshop的美妙之處在于,您在屏幕上操作的圖片最終產品。相比之下,在基于模型的設計中,屏幕上的圖片更像是藍圖。盡管如此,以這種方式制作軟件在質量上與傳統節目不同。在傳統編程中,您的任務是采用復雜的規則并將其轉換為代碼; 你的大部分精力花在翻譯上,而不是考慮規則本身。在基于模型的方法中,您擁有的就是規則。這就是你花時間思考的問題。這是一種不太關注機器的方式,更多的是關注你試圖解決它的問題。

“通常軟件編碼的主要問題 - 我自己也是編碼器,”Bantégnie說,“這不是編碼員的技能。人們知道如何編碼。問題是如何編碼。因為大多數要求都是一種自然語言,含糊不清,而且要求從來都不是非常精確,所以應該對那些應該編碼的人有不同的理解。“

根據這種觀點,因為用于描述軟件什么媒體軟件變得不守規矩應該對話,文字描述,圖紙上的一張紙- -從描述什么軟件媒體太不一樣了做不會做的,即代碼本身。從一個到另一個失去了太多。基于模型的設計背后的想法是縮小差距。系統設計人員使用相同的模型來表達他們想要的內容,并通過計算機自動生成代碼。

當然,要使這種方法取得成功,大部分工作必須在項目開始之前完成。首先,有人必須構建一個工具來開發對人們來說很自然的模型 - 感覺就像他們自己制作的筆記和繪圖一樣 - 同時仍然足以讓計算機理解。他們必須制作一個程序,將這些模型轉化為真實的代碼。最后,他們必須證明生成的代碼將始終按照預期執行。“幸運的是,我們已經從20年的初期背景工作中受益,”Bantégnie說道。

Esterel Technologies于2012年被ANSYS收購,源于法國核能和航空航天業在20世紀80年代開始的研究,他們擔心隨著安全關鍵代碼的復雜性不斷增加,越來越難以保持其自由。錯誤。“我從1988年開始,”法國戰斗機和商用飛機制造商達索航空公司科學研究負責人Emmanuel Ledinot說。“那時,我正在研究軍事航空電子系統。負責集成系統和調試它們的人已經注意到錯誤的數量正在增加。“80年代,飛機上的機載計算機數量激增。現在有幾十個,而不是單個飛行計算機,每個都負責與控制,導航和通信相關的高度專業化的任務。當傳感器輸入數據并且飛行員輸入命令時,協調這些系統飛行飛機需要一個完美定時反應的交響樂。“在正確的時間以正確的順序處理這些數百甚至數千個可能發生的事件,”Ledinot說,“被診斷為導致臭蟲膨脹的主要原因。”

Ledinot決定手工編寫這樣復雜的代碼不再具有可持續性。很難理解它在做什么,幾乎不可能驗證它能否正常工作。他去尋找新的東西。“你必須明白,在這樣的過程中改變工具是非常昂貴的,”他在一次談話中說。“除非你的背靠墻,否則你不會采取這種決定。”

他開始與法國計算機研究中心INRIA的計算機科學家Gerard Berry合作開發一個名為Esterel的工具 - 一個法語的“實時”.Eteterel背后的想法是,傳統的編程語言可能是適合描述以預定順序發生的簡單程序 - 比如食譜 - 如果你試圖在幾乎任何時候都可能發生很多事件的系統中使用它們,幾乎任何順序 - 比如飛機的駕駛艙 - 你不可避免地弄得一團糟 而控制軟件的混亂是危險的。在一篇論文中,Berry甚至預測“低級編程技術不會被大型安全關鍵程序所接受,因為它們使行為理解和分析幾乎不可行。”

Esterel旨在讓計算機為您處理這種復雜性。這就是基于模型的方法的承諾:您不是編寫正常的編程代碼,而是創建了系統行為的模型 - 在這種情況下,模型側重于如何處理單個事件,如何確定事件的優先級,依賴于哪些事件其他人,等等。該模型成為計算機用于進行實際編程的詳細藍圖。

Ledinot和Berry工作了將近10年,以使Esterel達到可以用于生產的程度。“在2002年,我們擁有了第一個具有自動代碼生成功能的操作軟件建模環境,”Ledinot告訴我,“并且是陣風飛機中的第一個嵌入式模塊。”今天,ANSYS SCADE產品系列(用于“安全”) - 關鍵應用程序開發環境“)用于生成航空航天和國防工業,核電站,運輸系統,重工業和醫療設備中的公司的代碼。“我最初的夢想是在世界各個平面上都有SCADE生成的代碼,”Esterel Technologies的創始人Bantégnie表示,“我們離這個目標并不太遠。”幾乎所有的安全關鍵代碼都在空中客車A380,包括控制飛機飛行表面的系統,

對于客戶,尤其是航空客戶而言,部分吸引力在于盡管可以手工構建高度可靠的軟件,但這可能是一項艱巨的任務。Meggitt PLC集團軟件工程副總裁Ravi Shivappa是ANSYS客戶,負責制造飛機部件,如發動機氣動火災探測器,他解釋說,傳統項目以英文版的大量需求文件開頭,該文件規定了軟件應該做的所有事情。(要求可能類似于,“當本節中的壓力超過閾值時,打開安全閥,除非手動超控開關打開。”)以這種方式描述要求的問題在于,當您實施時他們在代碼中,你必須煞費苦心地檢查每個人是否滿意。當客戶改變要求時,

嚴格的監管標準加劇了成本。美國聯邦航空局對軟件安全感到狂熱。該機構要求對安全關鍵軟件的每個要求都可追溯到實現它的代碼行,反之亦然。因此,每當一行代碼發生變化時,必須將其回溯到設計文檔中的相應要求,并且您必須能夠證明代碼實際滿足要求。這個想法是,如果出現問題,你就能弄明白為什么; 這種做法為大型代碼庫帶來了秩序和責任。但是,Shivappa說,“這是一個非常勞動密集型的過程。”他估計,在使用基于模型的設計之前,在一個為期兩年的項目中,只花了兩到三個月的時間來編寫代碼 - 剩下的就花在了文件。

正如Bantégnie所解釋的那樣,讓計算機將你的需求轉化為代碼而不是人類的美妙之處在于你可以確定 - 實際上你可以在數學上證明 - 生成的代碼實際上滿足了這些要求。基于模型的方法的許多好處來自于能夠動態添加需求,同時仍然確保滿足現有需求; 每次更改,計算機都可以驗證您的程序是否仍然有效。您可以自由地調整您的藍圖,而不必擔心會引入新的錯誤。按照美國聯邦航空局的說法,您的代碼“通過施工來糾正”。

盡管如此,大多數軟件,即使是在安全癡迷的航空世界中,都是以老式的方式制作,工程師在散文中編寫他們的要求,程序員用像C這樣的編程語言對它們進行編碼。正如Bret Victor在他的論文中明確指出的那樣。 ,基于模型的設計相對不常見。“美國聯邦航空局的許多人認為代碼生成是神奇的,因此需要更嚴格的審查,”Shivappa告訴我。

大多數程序員都有同感。他們喜歡代碼。至少他們理解它。使用“有限狀態機”和“循環系統”的數學方法為您編寫代碼并驗證其正確性的工具聽起來很深奧且難以使用,如果不是太好而不是真的。

這是一種以前發揮過的模式。只要編程與文字和零的寫入相差甚遠,最大的反對意見就來自程序員。瑪格麗特·漢密爾頓是阿波羅任務中著名的軟件工程師 - 實際上是“軟件工程”這個詞的內容 - 告訴我,在1964年她在麻省理工學院德雷珀實驗室的第一年,她記得有一個派系在一起戰斗另一個是關于從“一些非常低的機器語言”過渡到盡可能接近的零和“匯編語言”。“最低級別的人們正在努力保持它。這些論點非常相似:“我們怎么知道匯編語言會做得對嗎?”

“一邊說,他們的臉變紅了,他們開始尖叫,”她說。她說她“驚訝于他們有多情緒化”。

達索航空公司的埃馬紐埃爾·萊迪諾特指出,當匯編語言本身被逐步淘汰以支持今天仍然流行的編程語言時,就像C一樣,這次匯編程序員對此持懷疑態度。他說,難怪“人們不是那么容易過渡到基于模型的軟件開發:他們認為這是失去控制的另一個機會,甚至比他們已經更多。”

基于模型的設計(有時稱為模型驅動的工程或MDE)的偏見實際上是根深蒂固的,根據最近的一篇論文,“有人甚至認為,調查人們對MDE的看法比研究更有必要新的MDE技術。“

這聽起來幾乎像個笑話,但對于基于模型的方法的支持者來說,重要的一點是:我們已經知道如何使復雜的軟件可靠,但在很多地方,我們選擇不這樣做。為什么?

[圖片上傳失敗...(image-89219e-1565709376163)]

[圖片上傳失敗...(image-286f33-1565709376163)]

在2011年,克里斯·紐科姆曾在亞馬遜工作了近七年,并已躍升為首席工程師。他曾參與過該公司一些最關鍵的系統,包括零售產品目錄和管理世界上每個Kindle設備的基礎設施。他是高度珍視的亞馬遜網絡服務團隊的領導者,該團隊為網絡上一些最大的資產維護云服務器,如Netflix,Pinterest和Reddit。在亞馬遜之前,他幫助建立了世界上最大的在線游戲服務公司Steam的骨干網。他是那些悄悄地保持互聯網運行的工程師之一。他所研究的產品被認為是巨大的成功。但他所能想到的是,那些深藏在這些系統設計中的災難是等待發生的災難。

他在一篇論文中寫道:“人類的直覺很難估計在每秒數百萬次請求操作的系統中,所謂的”非常罕見“事件組合的真實概率。“人類的易犯錯誤意味著一些更微妙,更危險的錯誤變成了設計上的錯誤; 代碼忠實地實現了預期的設計,但設計無法正確處理特定的“罕見”場景。“

Newcombe確信真正關鍵系統背后的算法 - 例如,存儲大量網絡數據的系統 - 應該不僅僅是好的,而是完美的。一個微妙的錯誤可能是災難性的。但他知道如何找到更難的bug,特別是當算法變得越來越復雜時。你可以做你想要的所有測試,但你永遠都找不到它們。

這就是為什么他如此感興趣,因為在他正在閱讀的一篇論文的附錄中,他遇到了一種奇怪的數學和代碼混合 - 或者看起來像代碼的東西 - 它描述了一種叫做“TLA +”的算法。令人驚訝的是,這種描述被認為在數學上是精確的:用TLA +編寫的算法原則上可以證明是正確的。在實踐中,它允許您創建一個真實的問題模型,并不僅徹底,而且詳盡地測試它。這正是他一直在尋找的東西:一種用于編寫完美算法的語言。

TLA +,代表“行動的時間邏輯”,在精神上類似于基于模型的設計:它是一種用于寫下要求的語言 - TLA +稱它們為“規范” - 計算機程序。然后,計算機可以完全驗證這些規范。也就是說,在你編寫任何代碼之前,你要編寫一個簡潔的程序邏輯大綱,以及你需要滿足的約束(比如說,如果你是在編程ATM,一個限制可能是你永遠不能撤回同樣的錢兩次從您的支票帳戶)。然后,TLA +會詳盡地檢查您的邏輯是否確實滿足了這些約束。如果沒有,它會告訴你如何違反它們。

該語言由圖靈獎獲獎計算機科學家Leslie Lamport發明。憑借大大的白胡子和邋white的白發,以及大眼鏡后面的善良眼睛,Lamport看起來可能是美國霍格沃茨的友好教授之一。現在在微軟研究院,他被稱為“分布式系統”理論的先驅之一,它描述了由多個部分組成的任何計算機系統,它們相互通信。Lamport的工作為許多支持現代網絡的系統奠定了基礎。

對于Lamport來說,今天軟件充滿漏洞的一個主要原因是程序員直接編寫代碼。他在一篇文章中寫道:“建筑師在鋪設磚塊或錘釘之前會制定詳細的計劃。” “但是很少有程序員甚至在開始編碼之前寫下他們的程序將會做什么的粗略草圖。”程序員被編程的細節所吸引,因為代碼是使程序運行的原因; 花時間在其他任何事情上似乎都會分散注意力。并且通過迷惑代碼的微觀機制,可以獲得耐心的快樂,一種冥想的滿足感。但Lamport認為,代碼從來就不是一種思想媒介。“當你用編程語言思考時,它確實限制了你思考的能力,”他說。代碼讓你錯過樹林:它將您的注意力集中在各個部分的工作上,而不是更深入地了解您的程序如何組合在一起,或者它應該做什么 - 以及它是否真正按照您的想法行事。這就是Lamport創造TLA +的原因。與基于模型的設計一樣,TLA +將您的注意力集中在系統的高級結構,即其基本邏輯,而不是實現它的代碼。

Newcombe和他在亞馬遜的同事將繼續使用TLA +在主要系統中發現微妙的關鍵錯誤,包括S3背后的核心算法中的錯誤,被認為可能是世界上最可靠的存儲引擎。它現在在公司廣泛使用。在曾經使用過TLA +的微小人群中,他們的成功并不那么罕見。微軟的一名實習生使用TLA +來捕捉一個可能導致世界上每個Xbox在使用四個小時后崩潰的錯誤。歐洲航天局的工程師使用它來重寫碼,操作系統是第一個在彗星上輕輕降落的探測器,其編碼少了10倍。英特爾定期使用它來驗證其芯片。

但是TLA +只占據主流的一個小角落,如果它可以說占據了那里的任何空間。即使對于像Newcombe這樣經驗豐富的工程師來說,這種語言最初也是一種奇異而神秘的東西 - 一個象征動物園。對于Lamport來說,這是教育的失敗。雖然編程誕生于數學,但它已經基本上脫離了它。大多數程序員都不太熟悉數學 - 邏輯和集合理論 - 大多數 - 你需要使用TLA +。“很少有程序員 - 包括很少的編程老師 - 了解最基本的概念以及它們在實踐中的應用方式。他們似乎認為他們所需要的只是代碼,“Lamport說。“這個想法比你需要能夠準確思考的代碼有更高的級別,并且數學實際上允許你精確地思考它,只是完全是外來的。因為他們從未學過它。“

Lamport認為,未能在數學上思考他們正在做什么作為現代軟件開發的問題,簡而言之:風險不斷增加,但程序員并沒有加強 - 他們還沒有開發出處理日益復雜的問題所需的印章。“在15世紀,”他說,“人們習慣于在不知道微積分的情況下建造大教堂,而現在我認為你不允許任何人在不知道微積分的情況下建造大教堂。我希望經過一段相當長的一段時間后,如果他們不理解這些簡單的事情,就不會允許人們編寫程序。“

Newcombe并不確定這是程序員的責任。“我從Leslie那里聽說他認為程序員害怕數學。我發現程序員不知道 - 或者不相信 - 數學可以幫助他們處理復雜性。復雜性是程序員面臨的最大挑戰。“他說,讓人們使用TLA +的真正問題是讓他們相信這不會浪費他們的時間。程序員作為一個物種,是無情務實的。像TLA +象牙塔一樣的工具。當程序員遇到“正式方法”(所謂的因為它們涉及數學,“正式”精確的程序描述)時,他們根深蒂固的本能就是反沖。

大多數在大學學習計算機科學的程序員都曾短暫地遇到過正式方法。通常它們會在一些微不足道的東西上展示出來,就像一個從零開始計算的程序; 學生的工作是在數學上證明該程序確實從零開始計算。

“我需要改變人們對正式方法的看法,”Newcombe告訴我。甚至Lamport本人似乎也沒有完全掌握這一點:正式方法存在圖像問題。修復它的方法不是要求程序員改變 - 改變自己。Newcombe意識到要將TLA +等工具帶入編程主流,你必須開始講他們的語言。

一方面,他說,當他向亞馬遜的同事介紹TLA +時,他會避免告訴他們它代表什么,因為他害怕這個名字讓它看起來不必要地禁止:“行動的時間邏輯”恰恰就是那種高調的在學術界發揮得很好,但推遲了大多數練習程序員。他還試圖不使用“正式”,“驗證”或“證明”這兩個術語,這些術語提醒程序員進行繁瑣的課堂練習。相反,他將TLA +作為一種新的“偽代碼”,一種真實代碼的踏腳石,讓你能夠詳盡地測試你的算法 - 這讓你在設計過程中盡早思考。“工程師在調試方面考慮而不是'驗證',”他寫道,所以他將這個主題的內部談話稱為亞馬遜工程師“調試設計”。“而不是哀嘆程序員用代碼看世界的事實,Newcombe接受了它。他知道他會失去他們。“我有一群人說,'現在我明白了,'”Newcombe說。

此后他離開亞馬遜去甲骨文,在那里他能夠說服他的新同事嘗試TLA +。對他來說,使用這些工具現在是一個責任問題。“我們需要在這方面做得更好,”他說。

“我是自學成才,從九歲開始編碼,所以我的直覺就是開始編碼。這是我的唯一 - 這是我的思維方式:你會畫一些東西,嘗試一些東西,你會有機地進化它。“在他看來,這就是今天許多程序員仍在做的事情。“他們谷歌,他們看看Stack Overflow”(一個流行的網站,程序員回答彼此的技術問題)“他們得到了代碼片段,以解決他們在這個小功能中的戰術問題,并將它們粘合在一起,并進行迭代。”

“在你遇到真正的問題之前,這一切都很好。”

[圖片上傳失敗...(image-115f54-1565709376163)]

[圖片上傳失敗...(image-5187e-1565709376163)]

在2015年夏天,一對美國安全研究人員Charlie Miller和Chris Valasek確信汽車制造商沒有嚴重控制軟件缺陷,證明2014年的Jeep Cherokee可以被黑客遠程控制。他們充分利用了汽車的娛樂系統,它具有蜂窩連接(例如,你可以用你的iPhone開車),它連接到更多的中央系統,比如控制擋風玻璃刮水器的系統,轉向,加速和制動(例如,您可以在后視屏幕上看到在轉動車輪時響應的指南)。作為他們在夜晚和周末發展的攻擊的證據,當記者在高速公路上駕駛它時,他們侵入了米勒的車,并使其變得混亂; 記者,

雖然他們實際上沒有創建一個,但他們表明可以編寫一個聰明的軟件,一個“車輛蠕蟲”,它將使用被黑客入侵的吉普切諾基的車載計算機來掃描和攻擊他人; 如果他們想要的話,他們本可以同時進入全國范圍內的弱勢汽車和SUV車隊。(至少有五輛菲亞特克萊斯勒車型受到影響,其中包括Jeep Cherokee。)有一天,他們可以告訴他們所有人,例如,突然向左轉或高速切斷發動機。

“我們需要以不同的方式思考軟件,”Valasek告訴我。汽車公司長期以來由數百家不同供應商生產的零件組裝成品。但是,這些部件曾經是純機械的,現在,它們通常會帶有數百萬行代碼。雖然這些代碼中的一些 - 用于自適應巡航控制,用于自動制動和車道輔助 - 確實使汽車更安全(“我的吉普車的安全功能已經無數次拯救了我,”米勒說),它也創造了一個級別復雜性是全新的。它使一種新的失敗成為可能。

“車內有很多漏洞,”Esterel背后的法國研究員Gerard Berry在一次談話中說道。“這不像航空電子設備 - 在航空電子設備中,它非常重視。而且它承認軟件與機制不同。“汽車行業可能是尚未意識到它們實際上屬于軟件業務的行業之一。

“我們不會在汽車制造業中擁有一個知道它正在做什么的軟件安全監管機構,”在豐田案中作證的軟件專家邁克爾巴爾說。他說,NHTSA“只有有限的軟件專業知識。他們是從機械歷史中得出的結論。“使基于模型的設計和代碼生成對航空業具有吸引力的相同監管壓力對汽車制造來說變得越來越慢。達索航空公司(Dassault Aviation)的埃馬紐埃爾·萊迪諾特(Emmanuel Ledinot)推測,這種差異可能還有經濟原因。汽車制造商根本不能將零部件的價格提高幾美分,因為它增加了數百萬倍; 因此,嵌入汽車中的計算機必須精簡到最低限度,幾乎沒有空間來運行未經過手動調整的代碼。

人們懷疑激勵機制正在發生變化。“我認為自動駕駛汽車可能會推動它們,”Ledinot告訴我 - “ISO 26262和自動駕駛汽車可能會慢慢推動他們對關鍵部件采用這種方法。”(ISO 26262是2011年發布的汽車安全標準。巴爾說了同樣的話:在自動駕駛汽車的世界里,軟件不能成為事后的想法。它不能像今天的航空公司預訂系統或911系統或股票交易系統那樣建造。代碼將負責數億人的生活,并且必須工作。這不是一項小任務。

“計算基本上是看不見的,”Gerard Berry在他的演講中說。“當你的輪胎是平的時,你會看到你的輪胎,它們是平的。當你的軟件壞了,你看你的軟件,什么也看不見。“

“所以這是個大問題。”

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,228評論 2 375

推薦閱讀更多精彩內容

  • 作者:羅勝金版權聲明:歡迎轉載,請注明原作者 1. 前言 下文將總結我的TLA+技術學習心得,分為道(理論)、法(...
    羅勝金閱讀 14,459評論 17 53
  • 我們希望自己能夠去追隨內心深處的指引,可現實讓我知道,大多數人往往不能改變環境,卻無時無刻不在被擠上讓現實改變自身...
    a92e8f69d564閱讀 307評論 0 0
  • 發布會,我們常常聽說。新聞發布會,產品發布會等等。不說別的,單單手機的發布會一年就會有很多場。 發布到底是什么?你...
    觀海_聽濤閱讀 285評論 1 1
  • 一:社交 ①行業數據精準化(行業細分) ②全語通 ③趣味化 ④智能找對象 這幾點是酷聊即時通訊的亮點,與現在其他社...
    糖襖閱讀 569評論 0 0
  • 這兩天雜事有點多,心里一直亂糟糟的。日更三十九天了,一直在堅持。看著簡友們寫的東西各抒已見,有的真是寫出了自...
    老楊家三小姐閱讀 173評論 0 1