1. 程式人生 > >程式設計到底難在哪裡?

程式設計到底難在哪裡?

0?wx_fmt=gif&wxfrom=5&wx_lazy=1

程式設計到底難在哪?看了下面這個買蘋果的例子你就會明白……

普通人:我今天要買一斤蘋果。

程式設計師:我今天要買一斤蘋果——

因為我只喜歡紅富士蘋果,所以我只買紅富士蘋果。

我能接受的最高價格是10元/斤。

正常情況下一斤蘋果用一個袋子能裝下,但是為防萬一,我會帶兩個袋子。

我知道附近的3家水果店,所以我會依次訪問這3家水果店。

根據上述條件,我設計出以下的買蘋果的流程:

買蘋果流程開始
   對水果店0、水果店1、水果店2依次執行:
   拜訪一家水果店流程開始
       走到此水果店
       如果此水果店沒有開門,則結束當前的“拜訪一家水果店流程”
       如果此水果店沒有蘋果,則結束當前的“拜訪一家水果店流程”
       如果此水果店的蘋果當中沒有紅富士蘋果,則結束當前的“拜訪一家水果店流程”
       如果此水果店的紅富士蘋果剩餘不到一斤,則結束當前的“拜訪一家水果店流程”
       如果此水果店的紅富士蘋果的價格高於10元/斤,則執行3次:
       講價流程開始
           詢問店主是否願意將價格降到10元/斤或更低
           如果店主願意,則跳過剩餘的“講價流程”
       講價流程結束
       如果此水果店的紅富士蘋果的價格仍然高於10元/斤,則結束當前的“拜訪一家水果店流程”
       開啟一個袋子,將其作為當前的袋子
       重複執行以下流程,直到總重量大於一斤:
       裝袋一個蘋果流程開始
           從所有的不在袋子中的紅富士蘋果中選出最好的一個
           如果此蘋果能裝入當前的袋子,則將此蘋果裝入當前的袋子,否則執行:
           換袋子流程開始
               如果我有剩餘的袋子,則從中任意選出一個並作為當前的袋子,否則執行:
               向店主要袋子流程開始
                   向店主索要一個袋子
                   如果店主拒絕給我袋子,則將我的所有袋子裡的所有蘋果取出,然後結束當前的“拜訪一家水果店流程”
                   將店主給我的袋子作為當前的袋子
               向店主要袋子流程結束
           換袋子流程結束
           測量我的所有袋子裡的所有蘋果的總重量
       裝袋一個蘋果流程結束
       根據我的所有袋子裡的所有蘋果的總重量和店主給出的價格,計算我應付的價格
       向店主詢問我應付的價格
       如果我不接受店主索要的價格,則執行3次:
       校對流程開始
           向店主解釋我計算出的價格,並詢問其是否同意
           如果店主同意,則跳過剩餘的“校對流程”
       校對流程結束
       如果我仍然不接受店主索要的價格,則將我的所有袋子裡的所有蘋果取出,然後結束當前的“拜訪一家水果店流程”
       如果我沒帶錢,則將我的所有袋子裡的所有蘋果取出,然後結束當前的“拜訪一家水果店流程”
       付錢拿走蘋果
       跳過剩餘的“拜訪一家水果店流程”
   拜訪一家水果店流程結束
買蘋果流程結束

這個流程怎麼樣?我來設計一些測試樣例,測試一下這個流程。

測試發現一個問題:如果水果店0和水果店1都有紅富士蘋果並且價格都低於10元/斤,而且水果店1的價格比水果店0更低,那麼我希望買水果店1的蘋果,但我設計的流程會讓我買水果店0的蘋果。

為了解決這個問題,我應該先詢問所有水果店的價格,然後去價格最低的那一家買蘋果。經過修改,我重新設計出以下的買蘋果的流程:

買蘋果流程開始
   對水果店0、水果店1、水果店2依次執行:
   詢問一家水果店的紅富士價格流程開始
       走到此水果店
       如果此水果店沒有開門,則視此水果店的紅富士價格為無窮大元/斤,並結束當前的“詢問一家水果店的紅富士價格流程”
       如果此水果店沒有蘋果,則視此水果店的紅富士價格為無窮大元/斤,並結束當前的“詢問一家水果店的紅富士價格流程”
       如果此水果店的蘋果當中沒有紅富士蘋果,則視此水果店的紅富士價格為無窮大元/斤,並結束當前的“詢問一家水果店的紅富士價格流程”
       如果此水果店的紅富士蘋果剩餘不到一斤,則視此水果店的紅富士價格為無窮大元/斤,並結束當前的“詢問一家水果店的紅富士價格流程”
       向店主詢問此水果店的紅富士蘋果價格並記錄
   詢問一家水果店的紅富士價格流程結束
   從3家水果店中選出紅富士價格最低的一家(如果有並列則隨機選擇),將其作為目標水果店
   如果目標水果店的紅富士蘋果價格為無窮大元/斤,則結束當前的“買蘋果流程”
   走到目標水果店
   如果此水果店的紅富士蘋果的價格高於10元/斤,則執行3次:
   講價流程開始
       詢問店主是否願意將價格降到10元/斤或更低
       如果店主願意,則跳過剩餘的“講價流程”
   講價流程結束
   如果此水果店的紅富士蘋果的價格仍然高於10元/斤,則結束當前的“買蘋果流程”
   開啟一個袋子,將其作為當前的袋子
   重複執行以下流程,直到總重量大於一斤:
   裝袋一個蘋果流程開始
       從所有的不在袋子中的紅富士蘋果中選出最好的一個
       如果此蘋果能裝入當前的袋子,則將此蘋果裝入當前的袋子,否則執行:
       換袋子流程開始
           如果我有剩餘的袋子,則從中任意選出一個並作為當前的袋子,否則執行:
           向店主要袋子流程開始
               向店主索要一個袋子
               如果店主拒絕給我袋子,則將我的所有袋子裡的所有蘋果取出,然後結束當前的“買蘋果流程”
               將店主給我的袋子作為當前的袋子
           向店主要袋子流程結束
       換袋子流程結束
       測量我的所有袋子裡的所有蘋果的總重量
   裝袋一個蘋果流程結束
   根據我的所有袋子裡的所有蘋果的總重量和店主給出的價格,計算我應付的價格
   向店主詢問我應付的價格
   如果我不接受店主索要的價格,則執行3次:
   校對流程開始
       向店主解釋我計算出的價格,並詢問其是否同意
       如果店主同意,則跳過剩餘的“校對流程”
   校對流程結束
   如果我仍然不接受店主索要的價格,則將我的所有袋子裡的所有蘋果取出,然後結束當前的“買蘋果流程”
   如果我沒帶錢,則將我的所有袋子裡的所有蘋果取出,然後結束當前的“買蘋果流程”
   付錢拿走蘋果
買蘋果流程結束

現在這個流程是不是完美了呢?不是,我還能發現很多問題。

如果3家水果店都有紅富士蘋果但都不到一斤,但是三家店加起來能達到一斤,那麼我不應該結束流程回家,而是應該把三家店的紅富士蘋果都買下來。

如果我向水果店詢問價格的時候這家店還有紅富士蘋果,但我詢問完所有水果店的價格後這家店的紅富士蘋果賣完了,那麼我的流程會讓我試圖處理不存在的紅富士蘋果。

我走路的過程中可能會遇到突發事件,比如發現了新的水果店,比如袋子破掉了蘋果掉一地,對於這些情況我的流程都無法進行處理。

啊問題太多了我懶得再改流程了。我還是去X寶買吧。
那麼接下來我要設計一個在X寶買紅富士蘋果的流程……

這篇回答並不是講述在生活中程式設計師如何買蘋果,而是以買蘋果為例說明程式設計師如何解決問題。程式設計師需要對問題進行透徹的分析,理清其涉及的所有細節,預測可能發生的所有意外與非意外的情況,列出解決方案的所有步驟,以及對解決方案進行儘量全面的測試。而這些正是我認為程式設計難的地方。任何一點遺漏都會成為bug,輕則導致捱罵,重則導致經濟損失甚至危害安全。注意這些難點全部和語言無關。和程式設計所需要的絕對嚴密的邏輯相比,語言實在是太簡單了。(某些自帶程式碼混淆效果的語言除外)

作者:DJ Hitori

出處:知乎

連結:https://www.zhihu.com/question/22508677

0?wx_fmt=png

相關推薦

程式設計到底哪裡

程式設計到底難在哪?看了下面這個買蘋果的例子你就會明白…… 普通人:我今天要買一斤蘋果。 程式設計師:我今天要買一斤蘋果—— 因為我只喜歡紅富士蘋果,所以我只買紅富士蘋果。 我能接受的最高價格是10元/斤。 正常情況下一斤蘋果用一個袋子能裝下,但是為防萬一,我會帶兩個袋子。 我知道附近

程式設計到底哪裡?這回答絕了!

普通人:我今天要買一斤蘋果。程式設計師:我今天要買一斤蘋果。因為我只喜歡紅富士蘋果,所以我只買紅富士蘋果。我能接受的最高價格是10元/斤。正常情況下一斤蘋果用一個袋子能裝下,但是為防萬一,我會帶兩個袋子。我知道附近的3家水果店,所以我會依次訪問這3家水果店。根據上述條件,我設計出以下的買蘋果的流程:買蘋果流程

幸運飛艇原始碼出售程式設計到底哪裡

(貌似有很多非程式猿看到此文,為了照顧這些讀者,我用自己非常不純熟的英翻中把原文中程式設計師交流時經常使用的英文都換成了中文,翻譯的不好請諒解 -_-)記得之前組裡來了一個美國實習生小夥子,很極客的那種,幹活快,一天能給你寫2000行程式碼(我複查的速度跟不上他寫的速度),讓做什麼東西,上午告訴做個這個功能,

函數語言程式設計,這正是你要學習它的原因

  很奇怪不是,很少有人每天都使用函數語言程式設計語言。如果你用Scala, Haskell, Erlang,F#或某個Lisp方言來程式設計,很可能沒有公司會花錢聘你。這個行業裡的絕大部分人都是使用像Python, Ruby, Java或C#等面向物件的程式語言,它們

為什麼程式設計這麼?!

大資料文摘作品作者: Erik Trautman編譯:Shan LIU 、Niki、新知之路、笪

一些調侃程式設計

流程的嚴密性 普通人: 我今天要買一斤蘋果。 程式設計師: 我今天要買一斤蘋果。 因為我只喜歡紅富士蘋果,所以我只買紅富士蘋果。 我能接受的最高價格是10元/斤。 正常情況下一斤

為什麼在中國學習程式設計那麼?500萬程式設計師稱得上高階有幾個?

目前沒有確切的統計中國就業與真正學習的程式設計師數量有多少,我們可以從國內著名IT社群和服務平臺CSDN得知,中國大有500萬程式設計師。 中國作為世界人口大國,有500萬程式設計師算是很正常的數量。世界著名IT網站GitHub目前超過2800萬個人使用者,一位著世界程

自學程式設計哪裡?教你如何解決

近年來,許多人對學習編碼感興趣。 他們要麼看書學習,通過各大論壇網站找資源學習,要麼通過線上課堂學習,更或者線上下接受培訓。 也有些人只是試圖嘗試一下。 但編碼並不容易。以下是我們在學習編碼時遇到的一些挑戰。 1.找到每天編碼的“正確”時間。 如果你正在自學編

為什麼大學生認為JAVA程式設計

我發現,進入計算機專業就讀的學生,最初至少有一大半對真實的軟體開發根本不瞭解,是“一張白紙”。 不幸的是,學了四年之後,許多張“白紙”又變成了許多罐“漿糊”,帶著對軟體開發可能是畏懼,也可能是無所謂,但絕對不是喜歡的感觸離開校園。 程式設計真的那麼沒勁?那麼難和枯燥? 我寫了將近二十年的程式碼

Python程式設計從入門到實踐PDF下載,網紅少年程式設計書,AI自學不再

網紅少年程式設計書,AI自學不再難 原創: Cottbuser 灣區人工智慧 4天前 作者:Cottbuser 會多國語言的海歸  公眾號:灣區人工智慧 微博:灣區人工智慧 知乎:灣區人工智慧 AI QQ群:604562980 一線人工智慧工程

linux中斷介紹(概念、頂半部和半部、linux中斷程式設計)

中斷的概念: 指CPU在執行過程中,出現某些突發事件急待處理,CPU暫停執行當前程式,轉去處理突發事件,處理完後CPU又返回原程式被中斷的位置繼續執行.   中斷的分類: 內部中斷:來自cpu內部(軟體中斷、cpu溢位、觸發錯誤等) 外部中斷:來自cpu外部,由外設觸發

程式設計:在螢幕中間分別顯示綠色、綠紅色、白藍色的字串'welcome to masm!'

assume cs:codesg , ds:datasg , ss:stacksg datasg segment db 'welcome to masm!' db 2h , 24h , 71h datasg ends stacksg segment stack

這是一個非常簡單的題目,意在考察你程式設計的基礎能力。千萬別想了哦。輸入為一行,包括了用空格分隔的三個整數 AA、BB、CC(資料範圍均在-40−40 ~ 4040 之間)。輸出為一行,為“A+B+CA

這是一個非常簡單的題目,意在考察你程式設計的基礎能力。千萬別想難了哦。 輸入為一行,包括了用空格分隔的三個整數 A、B、C(資料範圍均在−40 ~ 40 之間)。 輸出為一行,為“A+B+C”的計算結果。 樣例輸入 22 1 3 樣例輸出 26 import java.util.

為什麼大家都覺得學C/C++程式設計

C語言是面向過程的,而C++是面向物件的 C和C++的區別: C是一個結構化語言,它的重點在於演算法和資料結構。C程式的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制)。 C++,首要考慮的是如何構造一個物件模型,讓這個模型能夠

工作15年碼農總結:學程式設計嗎?那只是你覺得

個混跡微博的IT愛好者的話,可能對下面這個頭像有印象。 沒錯,這就是Easy! 從2003年寫下第一行PHP程式碼開始,程式設計就成為了他生活的日常。而他的人生履歷,也與程式設計緊密切合。 2004年,他入職新浪,負責WAP釋出平臺,日訪問量2億; 後來

2019年學IT程式設計前景如何?入門嗎?

IT行業是目前國家大力發展的一大熱門行業,IT行業的興起讓越來越多的企業開始逐漸轉型升級。2018年是網際網路爆發的一年,隨著現代經濟體制的建設和科技的發展,隨著人們對網際網路的依賴性越來越強,網際網路IT行業在2019依舊有望成為各大行業中緊俏的技術行業,對於人才的需求也會隨著市場變化只增

分詞,哪裡?科普+解決方案!

題圖:by Lucas Davies 一、前言 分詞,我想是大多數大前端開發人員,都不會接觸到的一個概念。這個不影響我們瞭解它,畢竟我們要多方向發展。今天就來簡單介紹一些分詞,我儘量用簡介的語言來描述這個概念,並且最後再提供一個解決方案,希望對你有幫助。 分詞簡單來講就是把一句話,按照詞義,切分成一個個單獨

halcon教程-視訊哪裡找?halcon學習嗎?想要學好機器視覺的話,哪些是必須要掌握的知識?機器視覺發展怎麼樣,工作量大不大?

緊接著同一個研究生的問題追問回答,在這裡對有同樣疑問的同學和轉行學習halcon的工作人員做一個分享。大家可以關注一下我的部落格,會持續更新,定期會給大家分享一些學習心得,以及實際專案實戰,還有很多halcon學習資料。幫助大家更好更快學習halcon,少走一些

零基礎學程式設計嗎?哪種程式語言最好?

作為使用最廣泛的程式語言、以及市場上java人才的需求越來越大,很多人都準備報java培訓班轉行IT,可是對於很多新手來說,剛開始接觸Java會很迷惘,只知道跟風報班學習,卻不知道Java可以做什麼。 其實Java 可以做的東西太多了,手機遊戲、中介軟體、軟體、

都說程式設計,程式碼換成中文就會更簡單嗎?程式設計師表示腦殼疼!

OK,那麼我們首先來看一下中文編碼: 你以為會寫中文就會程式設計嗎?這就像你以為會寫漢字就會寫出好文章一樣。程式設計是和機器溝通,因此要用機器的語言而不是人類的語言。最早的程式就是0和1的數字,不是中文也不是英文。以前的程式設計師,每天寫程式就是在一條長長的紙帶上打孔表示0和1。後來發現0