一些調侃程式設計之難
流程的嚴密性
普通人:
我今天要買一斤蘋果。
程式設計師:
我今天要買一斤蘋果。
因為我只喜歡紅富士蘋果,所以我只買紅富士蘋果。
我能接受的最高價格是10元/斤。
正常情況下一斤蘋果用一個袋子能裝下,但是為防萬一,我會帶兩個袋子。
我知道附近的3家水果店,所以我會依次訪問這3家水果店。
根據上述條件,我設計出以下的買蘋果的流程:
這個流程怎麼樣?我來設計一些測試樣例,測試一下這個流程。
測試發現一個問題:如果水果店0和水果店1都有紅富士蘋果並且價格都低於10元/斤,而且水果店1的價格比水果店0更低,那麼我希望買水果店1的蘋果,但我設計的流程會讓我買水果店0的蘋果。
為了解決這個問題,我應該先詢問所有水果店的價格,然後去價格最低的那一家買蘋果。
經過修改,我重新設計出以下的買蘋果的流程:
現在這個流程是不是完美了呢?不是,我還能發現很多問題。
如果3家水果店都有紅富士蘋果但都不到一斤,但是三家店加起來能達到一斤,那麼我不應該結束流程回家,而是應該把三家店的紅富士蘋果都買下來。
如果我向水果店詢問價格的時候這家店還有紅富士蘋果,但我詢問完所有水果店的價格後這家店的紅富士蘋果賣完了,那麼我的流程會讓我試圖處理不存在的紅富士蘋果。
我走路的過程中可能會遇到突發事件,比如發現了新的水果店,比如袋子破掉了蘋果掉一地,對於這些情況我的流程都無法進行處理。
啊問題太多了我懶得再改流程了。我還是去X寶買吧。
那麼接下來我要設計一個在X寶買紅富士蘋果的流程……
==========================================================
測試
一個測試工程師走進一家酒吧,要了一杯啤酒;
一個測試工程師走進一家酒吧,要了一杯咖啡;
一個測試工程師走進一家酒吧,要了0.7杯啤酒;
一個測試工程師走進一家酒吧,要了-1杯啤酒;
一個測試工程師走進一家酒吧,要了2^32杯啤酒;
一個測試工程師走進一家酒吧,要了一杯洗腳水;
一個測試工程師走進一家酒吧,要了一杯蜥蜴;
一個測試工程師走進一家酒吧,要了一份[email protected]!&*(@;
一個測試工程師走進一家酒吧,什麼也沒要;
一個測試工程師走進一家酒吧,又走出去又從窗戶進來又從後門出去從下水道鑽進來;
一個測試工程師走進一家酒吧,又走出去又進來又出去又進來又出去,最後在外面把老闆打了一頓;
一個測試工程師走進一家酒吧,要了一杯燙燙燙的錕斤拷;
一個測試工程師走進一家酒吧,要了NaN杯Null;
一個測試工程師衝進一家酒吧,要了500T啤酒咖啡洗腳水野貓狼牙棒奶茶;
一個測試工程師把酒吧拆了;
一個測試工程師化裝成老闆走進一家酒吧,要了500杯啤酒並且不付錢;
一萬個測試工程師在酒吧門外呼嘯而過;
一個測試工程師走進一家酒吧,要了一杯啤酒';DROP TABLE 酒吧;
測試工程師們滿意地離開了酒吧。
然後一名顧客點了一份炒飯,酒吧炸了
複雜性的持續增加
如果編寫一段寫完就扔的程式碼(如運維修復),那其實是可以很快做好的,想不通的地方繞一繞總也能搞得定。
但當你編寫的是一段大規模使用,需要持續改進,並且不斷有新功能需要新增的程式碼。那麼難度就急劇增加了(這也是我認為的程式設計的主要難處)。
一方面,最開始編寫程式碼的時候就要考慮到以後的擴充套件性,而這個考慮又永遠不可能是完備的,也不應該是完備的(不要過早優化)。只有一些基本的原則,比如保持單模組的獨立性,避免模組間的耦合,這些原則的運用需要豐富的經驗,並且不一定總是用好了。
另一方面,在程式碼的持續演進過程中,需要對抗程式碼的腐化。當原來拍著胸脯保證的確定因素突然變成不確定因素;當代碼引入了不合理的功能(如需要理解上層邏輯);當有新的人來維護程式碼。程式碼腐化的結果是大大增加了工作量和減少了程式碼的穩定性。(程式碼腐化只有一個好處,天天加班,顯得事情很多,搞不好能把領導唬住)
需求
相關推薦
一些調侃程式設計之難
流程的嚴密性 普通人: 我今天要買一斤蘋果。 程式設計師: 我今天要買一斤蘋果。 因為我只喜歡紅富士蘋果,所以我只買紅富士蘋果。 我能接受的最高價格是10元/斤。 正常情況下一斤
java併發程式設計的一些小記錄之interrupt
當外部執行緒對某執行緒呼叫了thred.interrupt()方法後,java語言的處理機制是這樣的:如果該執行緒處在可中斷狀態下(呼叫了Thread.wait()或者Thread.sleep()等特定會發生阻塞的api),那麼該執行緒會立即被喚醒,同時會收到一個Inter
階乘的一些規律(程式設計之美)
問題一: N!末尾有多少個0? 問題二: N!二進位制表示中最低位1的位置? 首先來介紹幾個要點和規律: n! = n(n - 1)! (n > 0) n! = 1 (n = 0) 這裡注意不要忘了 問題一等價轉化 <=> N! 的質因數
初識windows程式設計之ListBox的一些簡單用法
主要給大家介紹一下ListBox控制元件的一些簡單用法。 關鍵程式碼: case IDC_BUTTONFILL://按鈕{ //向ListBox中新增內容 SendDlgItemMessage(hwnd,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)("
軟件工程課程之難
學員 結果 場景 ima 根據 特定 提升 最終 包括 有感於今天軟件工程課程教學研討所涉及的話題。 其實在多個場合和來自不同學校的老師討論過本科或者研究生的軟件工程課程,大致回想一下,有如下幾個有趣之處: (1)幾乎所有人都承認軟件工程課程難上; (2)很多人都說在校學生
(4.18)SQL server 2008一些常見配置之二(鏈接服務器配置,訪問其他數據庫)
修改 beta pro ntp 查看版本 collation chang 手工 lin SQL server 2008一些常見配置之二(鏈接服務器配置,訪問其他數據庫) 一、訪問Oracle數據庫 Oracle是目前排名第一的數據庫,一般對數據安全和
Scala 非同步程式設計之 Future (二)
上篇部落格講了scala中的Future,實際上java 在jdk1.5後增加了callable,也實現了Future,以《Netty In Action》中的程式碼為例,看一下java中Future的實現: import java.util.concurrent.Callable; im
Scala 非同步程式設計之 Future
同步非同步,阻塞非阻塞,在IO模型中幾個概念組合在一起不是很容易理解,但是隻從程式碼執行的角度看同步非同步是很清晰的: 同步代表這段程式碼中的邏輯必須執行完畢,而非同步代表呼叫馬上返回,但通常情況下是獲取不到需要的值。 同步:val value={ Thread.sleep(
java併發程式設計之利用CAS保證操作的原子性
import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class Counter { private AtomicInteger at
軟體工程結對程式設計之黃金點遊戲
作業要求: https://edu.cnblogs.com/campus/ustc/InnovatingLeadersClass/homework/2231 專案原始碼: https://github.com/jackroos/golden_number 本次作業我們是設計一個玩黃金點遊戲的Bot,遊戲的要
Java併發程式設計之CyclicBarrier
CyclicBarrier可以控制這樣的場景: 對多個執行緒,他們執行自己程式碼(執行run方法)的時間不一樣; 比如有3個執行緒,其run方法執行時間分別為1s, 2s, 3s。如果我們想在三個執行緒都完成自己的任務時執行相應的操作,CyclicBarrier就派上用場了。 寫了一
淺談網路程式設計之Socket
前言 此文只是簡單概述Socket,Java程式設計的使用方法,還請移步Java 網路IO程式設計 Socket Socket是用來連線網路,進行傳輸資料的工具,Scoket大致分為兩種,TCP和UDP TCP: 服務端:建立Socket->繫結ip和埠號->接聽連線-&
Dart非同步程式設計之Stream
Dart非同步程式設計包含兩部分:Future和Stream 上篇文章已介紹了Future,此篇文章為大家介紹下另一塊–Stream Dart 非同步事件流 Stream 基本概念 顧名思義,Stream 就是流的意思,表示發出的一系列的非同步資料。可以簡單地認為 Strea
Dart非同步程式設計之Future
Dart非同步程式設計包含兩部分:Future和Stream 本文將詳細介紹Future Dart非同步程式設計-future 非同步程式設計:Futures Dart是一個單執行緒程式語言。如果任何程式碼阻塞執行緒執行都會導致程式卡死。非同步程式設計防止出現阻塞操作。Dar
Socket程式設計之TCP的簡單實現
Client import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.Socket; public class Client { pub
javascript高階程式設計之---繼承
物件的繼承 1.繼承的思想:關鍵是將一個建構函式A的原型指向給另一個建構函式B的例項本身,那麼A例項將擁有(繼承)B例項的所有的屬性和方法(繼承在原型); 2.原理:將一個建構函式A的原型指向給另一個建構函式B的例項本身,也就意味著A原型將繼承B例項本身擁有的所
javascript高階程式設計之--自執行函式
什麼是自執行函式? 顧名思義.就是不用呼叫,自己自動就會執行的函式; 為什麼要用自執行函式? 自執行函式內部是一個獨立的作用域,這樣就保持了一個相對獨立的名稱空間,避免汙染全域性作用域 怎麼建立自執行函式? 寫法一:(function(param){…})(re—param)
JAVA面向物件程式設計之購物車介面的設計與功能的實現
1、小組成員及分工 小組成員 負責工作 蘭澤祥 負責總體介面、Git程式碼庫 吳修恩 負責MVC模式、類名包名的規範化 2、Git 倉庫地址 倉庫地址:https://gitee
併發程式設計之多執行緒執行緒安全
什麼是執行緒安全? 為什麼有執行緒安全問題? 當多個執行緒同時共享,同一個全域性變數或靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。 案例: 需求現在有100張火車票,有兩個視窗同時搶火車票,請使用多執行緒模擬搶票效果。 p
併發程式設計之多執行緒基礎
執行緒與程序區別 每個正在系統上執行的程式都是一個程序。每個程序包含一到多個執行緒。執行緒是一組指令的集合,或者是程式的特殊段,它可以在程式裡獨立執行。也可以把它理解為程式碼執行的上下文。所以執行緒基本上是輕量級的程序,它負責在單個程式裡執行多工。通常由作業系統負責多個執行緒的排程和執行。