日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
熱愛(ài)著并痛恨著:談?wù)劸幊谈母?/div>

[[60516]]

創(chuàng)新互聯(lián)專(zhuān)注于泉山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供泉山營(yíng)銷(xiāo)型網(wǎng)站建設(shè),泉山網(wǎng)站制作、泉山網(wǎng)頁(yè)設(shè)計(jì)、泉山網(wǎng)站官網(wǎng)定制、小程序定制開(kāi)發(fā)服務(wù),打造泉山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供泉山網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。

本文的作者Jon Beltran是一個(gè)西班牙程序員,作家,企業(yè)家,大學(xué)時(shí)輟學(xué)專(zhuān)職做游戲開(kāi)發(fā),他目前主要經(jīng)營(yíng)Symnum Systems公司,開(kāi)發(fā) ViEmu
和 Codekana 這兩個(gè)開(kāi)發(fā)工具。

軟件編程出問(wèn)題了。出大問(wèn)題了。如今的這種編程方式讓人如此不堪忍受,以至于讓人想吐。數(shù)年來(lái)我一直在說(shuō)我痛恨編程。過(guò)去的20年,我一直是個(gè)全職的軟件開(kāi)發(fā)者,目前也是,我沒(méi)后悔過(guò),我仍然熱愛(ài)著我可以用編程來(lái)做的事情??扇匀唬彝春蘧幊?。

現(xiàn)在的編碼方式是一種讓大腦自殘的方式。編寫(xiě)過(guò)程中的每一步,你都可能使程序崩潰——耗盡了內(nèi)存,訪(fǎng)問(wèn)了錯(cuò)誤的指針或引用,或進(jìn)入了死循環(huán)。毫無(wú)疑問(wèn),編程給人的感覺(jué)就像赤腳走在到處是碎玻璃的地板上。一小寸誤差的落腳距離,喀嚓,你就損失了半個(gè)腳趾頭。

這種編程方式的每一步,在每一個(gè)語(yǔ)句里,每一行代碼里,函數(shù)調(diào)用或過(guò)程里,如果你想寫(xiě)出能用的代碼,你必須要考慮整個(gè)程序中所有的不同的、可能的狀態(tài)。這些狀態(tài)是不可見(jiàn)的,你不可能給它們明確的定義。事實(shí)就是這樣。一直是這樣。包括現(xiàn)存的所有的語(yǔ)言。這就是為什么100%的代碼測(cè)試覆蓋率也不能保證代碼里沒(méi)有bug,永遠(yuǎn)也不可能。這也是為什么差程序員不能變好的原因:根本沒(méi)有一個(gè)結(jié)構(gòu)化的方式讓他們考慮到所有這些可能的情況。

(順便提一下,當(dāng)遇到了多線(xiàn)程程序時(shí),這種情況會(huì)惡化1000倍——不是變得更好,而是更壞。)

問(wèn)題的原因就在于,代碼被寫(xiě)出來(lái)的基本方式就是錯(cuò)誤的。完全是錯(cuò)誤的。你寫(xiě)出了一行行的指令,一步一步,看起來(lái)你把程序驅(qū)動(dòng)到了一個(gè)想要的狀態(tài)。但每一步都是相互獨(dú)立的,只有編譯器/解釋器能獨(dú)自的理解它們,你基本上是很容易把事情做錯(cuò),而不是做對(duì)。

函數(shù)式編程也許是一種解決方案,我思考了很長(zhǎng)時(shí)間,做了認(rèn)真的研究。Lisp,Haskell。Lambda計(jì)算。函數(shù)式的編程方式確實(shí)給常規(guī)的命令式或面向?qū)ο蟮木幊谭椒◣?lái)了不少改進(jìn)。但這仍不能根本解決問(wèn)題。它仍然是由很多無(wú)聯(lián)系的簡(jiǎn)單步驟組成,痛苦的計(jì)算出輸出結(jié)果。

這種編碼方式關(guān)鍵是什么地方出了問(wèn)題?關(guān)鍵地方就在于,你不是在表達(dá)你想要什么。你表達(dá)的是需要采用什么步驟。試想一下,你讓朋友從冰箱里拿出一瓶啤酒,一步一步來(lái),每一步都如機(jī)器人般的刻板,每一步都不關(guān)系到下一步做什么。這是在折磨一個(gè)人。極有可能造成災(zāi)難性的失敗。這跟現(xiàn)在的編程方式是完全一樣的。

程序庫(kù)(lib)能帶來(lái)有用的幫助,但它們只是為應(yīng)付上層特定需求的快捷方式。它們解決不了真正的問(wèn)題。

最近出現(xiàn)了一篇非常有趣的John Carmack所寫(xiě)的文章,講的是靜態(tài)代碼檢查,他引用了一條說(shuō)的非常正確的微博,是Dave Revell寫(xiě)的關(guān)于代碼檢查的:

“我越用靜態(tài)代碼分析來(lái)檢查代碼,我越發(fā)現(xiàn)計(jì)算機(jī)的強(qiáng)大之處?!?/p>

一種觀點(diǎn)

那么,應(yīng)該如何編程?讓我們來(lái)舉個(gè)簡(jiǎn)單的例子:排序。假設(shè)你有一個(gè)輸入序列,讓我們稱(chēng)它,呃哼,輸入值。假設(shè)它有幾個(gè)元素?,F(xiàn)在我們要計(jì)算出一個(gè)新的序列,稱(chēng)它為輸出值,里面要包含有相同的元素,但元素是經(jīng)過(guò)升序排序過(guò)的。我們?nèi)绾稳プ觯?/p>

傳統(tǒng)的方法有冒泡排序,快速排序,shell排序,插入排序,等。這些都是能夠讓我們對(duì)一個(gè)序列進(jìn)行排序的方法。例如,冒泡排序:

 
 
 
  1. def bubble_sort( input, output ):
  2. output = input # start with the unsorted list
  3. swapped = True
  4. while swapped:
  5. swapped = False
  6. for i = 1 to length(output) - 1:
  7. if output[i+1] > output[i]:
  8. swap( output[i+1], output[i] )
  9. swapped = True

非常的直接。但如果打算去寫(xiě)出這種排序的代碼,你仍然會(huì)犯錯(cuò)誤!你可能會(huì)在交換兩個(gè)元素時(shí)忘記了把“swapped”參數(shù)設(shè)置成true,或者更典型的,你可能在循環(huán)計(jì)數(shù)時(shí)犯下忘記減一的錯(cuò)誤。

這就是我為什么要說(shuō)這種編程方式有問(wèn)題的原因:排序是一種很簡(jiǎn)單的可以掌握和描述清楚的概念,可是,用代碼去實(shí)現(xiàn)它卻是復(fù)雜的,充滿(mǎn)了陷阱,隨時(shí)造成程序的崩潰,或輸出錯(cuò)誤的結(jié)果。一件難事!

有人可能會(huì)寫(xiě)出一種函數(shù)式的上面的算法,但相似之處會(huì)是非常明顯的:沒(méi)有副作用,可仍然包含完成這個(gè)任務(wù)所需的很多步驟。遞歸也許會(huì)比迭代更優(yōu)雅(呃哼),但它并不是本質(zhì)上更好。

那么,對(duì)于一個(gè)排序操作,它真正的代碼應(yīng)該是什么樣的呢?這多年來(lái),我慢慢總結(jié)出,它應(yīng)該是一種類(lèi)似這樣的東西(請(qǐng)?jiān)?,這些是只是一些偽代碼,一種不存在的編程方式):

 
 
 
  1. def sort(input[]) = output[]:  
  2.   one_to_one_equal(input, output)  
  3.   foreach i, j in 1..len(output):  
  4.     where i < j:  
  5.       output[i] <= output[j] 

讓我對(duì)它做一些解釋?zhuān)哼@第一行對(duì)sort的定義是說(shuō),在輸出序列和輸入序列之間已經(jīng)存在一種1對(duì)1的“關(guān)系”。我們下文中會(huì)介紹在one_to_one_equal的定義中如何實(shí)現(xiàn)這個(gè)。這樣一來(lái)輸入和輸出序列中確保了相同的元素。它在空間上定義出來(lái)可能的答案。

第二,關(guān)鍵點(diǎn),這下面的行指明,對(duì)于輸出序列中的每一對(duì)元素,當(dāng)?shù)谝粋€(gè)的索引低于第二個(gè)的索引時(shí),它的值也是較小或相等。這本質(zhì)上就指明了輸出序列上排序過(guò)了。它定義了解決方案中的一種可能的答案。

這是如此的簡(jiǎn)單。排序函數(shù)只是說(shuō)明排序的結(jié)果,而不是如何做。它描述了輸出數(shù)據(jù),以及相關(guān)的輸入數(shù)據(jù)的特征,它把如何能達(dá)到這個(gè)結(jié)果的任務(wù)交給了編譯器。

無(wú)庸置疑,這存在兩個(gè)關(guān)鍵問(wèn)題:

  • 首先,編譯器如何能完成這個(gè)任務(wù)?真的有這種可能嗎?在將來(lái)的文章里,我將會(huì)告訴你這是可能的,真的可能,編譯器甚至能知道采用什么樣的算法來(lái)獲得這樣的結(jié)果。
  • 第二個(gè)問(wèn)題是,如果把它應(yīng)用到更復(fù)雜的情況中?我還是能向你展示,這種方式完全可以應(yīng)用到任何的所有的編程和計(jì)算任務(wù)中,它只是一種更簡(jiǎn)單,更有效,更能避免錯(cuò)誤的編程方式!

我曾經(jīng)想不公開(kāi)這種技術(shù),將來(lái)成立一個(gè)公司來(lái)實(shí)現(xiàn)這種思想,但多種環(huán)境因素使我重新思考這個(gè)計(jì)劃?,F(xiàn)在我向大家分享了我的認(rèn)識(shí),想看看事情會(huì)如何發(fā)展。請(qǐng)關(guān)注本系列中的下幾篇文章。

尾  注

在本系列的后續(xù)文章中我會(huì)做深入講解,這里只稍微提一點(diǎn)。這個(gè)one_to_one_equal函數(shù)在這種理想化的語(yǔ)言中將會(huì)是一個(gè)“標(biāo)準(zhǔn)庫(kù)函數(shù)”,它多少看起來(lái)應(yīng)該像這個(gè)樣子,像下面這個(gè)基本邏輯:

 
 
 
  1. def one_to_one_equal(output[], input[]) = c:  
  2.   c = relations(input[i], output[j])  
  3.   foreach x = input[i]:  len(c(x,)) = 1 
  4.   foreach x = output[i]: len(c(,x)) = 1 
  5.   foreach x(a,b)=c[i]: a == b 

讓我來(lái)解釋一下:這第一行的定義是說(shuō),在輸入和輸出序列中的元素間有一個(gè)1對(duì)1的“關(guān)系”集合。

這第二和第三行指明,對(duì)于每一個(gè)輸入和輸出序列的元素,在集合“c”中都有一個(gè)單一的關(guān)系從屬于它們,確保了它們的關(guān)系是一對(duì)一的。這最后的一行指明每個(gè)關(guān)系上的兩個(gè)元素都是相等的,確保這兩個(gè)序列是相同的,只是排序過(guò)。

英文鏈接:I want to fix programming


文章題目:熱愛(ài)著并痛恨著:談?wù)劸幊谈母?
網(wǎng)站網(wǎng)址:http://m.5511xx.com/article/djihipg.html