請問大佬們能2000行代碼0 error 0 warn 0 bug一遍過嗎?假如能過,是什麼水平?
0 error 0 warning 那是小意思。知乎程式設計師大約人均都能做到。
至於 0 bug 嘛。。。我跟你說個事兒:圖靈獎得主高德納為自己聲稱沒有bug的TeX軟體開出了賞格,每找到一個賞格加倍,迄今為止,他的支票現已達到了20.48面額,這意味著他至少現已開出去了十一張支票。(實際上更多,不過中心有一次他作廢了幾張支票,然後又從2.56開端,所以就算11張吧)
這個軟體自身僅僅一個中心,而且功用很多年都沒有改動,權且無法做到 0 bug。可想而知零bug有多難。
連大神都做不到的事,咱們仍是別搞不切實際的夢想。

什麼你說是2000行?2000行那不叫一個程序,那叫一個模塊,或許,一個單元。2000行的程序沒必要糾結這些問題。
從前高中時分天天寫代碼的時分有或許一遍過testcase,不過其時warning根本上不論的,也很少有2000行這麼多。現在根本上寫2000行必定會由於留意力渙散寫出幾個過錯的。
比起一遍寫對來說,界面一遍規劃對、有滿足多調試日誌或許更重要一些,假如能做到只需筆誤等級的過錯的話,一般有編碼的1/10不到的時刻就能夠調對了。更長一些的代碼應該從一開端就規劃好分模塊調通的進程。假如是計劃長時刻保護的代碼,那一開端就應該把單元測驗也寫好,這樣調試的時刻就更可控了。
不知道,簡略點的代碼在腦子十分清醒的進程下或許能夠吧。現在上了年歲了,就不太行了。
假如算上代碼生成器生成後的代碼的話,那應該很簡略了,比如flex和bison生成出來的代碼。
純手擼,個人最高紀錄是1000左右行的C內核模塊,3天左右寫完,1個編譯過錯,QA測出來了5個bug。
其他,還寫過1000-2000行左右的的O1的slab memory和hash table,編譯過錯多少不記得了,可是至今0bug,到現在還作為產品的根底模塊運轉著。
好多人沒概念,但2000行其完成已算很長的代碼了。大部分體系軟體前期的中心代碼也就在1-2萬行:
linux最早那個版別只需「10,243 lines of C and 386 assembly」
Hadoop最早的版別中,HDFS大約5000行,MapReduce大約6000行
Spark論文裡邊說了他們寫了大約1.4萬行代碼
寫2000行0 error 0 warn仍是或許的。但0 bug?那是由於你還沒發現。。。
這有什麼難的,各種代碼生成器隨意就能生成幾萬行代碼 0 error、0 warning還有0 bug……
當你調試完,經過一切測驗,達到了0error0warn0bug的時分,比及上線後,你永久不知道哪天會不會有一名顧客點了一份炒飯把酒吧炸了。
假如是自己重頭寫的2000行左右的小工具(不觸及外部體系,或許對所觸及的外部體系了解十分深入,徹底掌握什麼樣的輸入會有什麼樣的回來,也便是說外部體系沒有副作用),徹底能夠呀。
我是說,假如你用槍指著我的頭,只需我的這個小工具第一次運轉有bug就一槍爆頭,但又不限時刻不限精力(期間能夠吃飯睡覺),我大約率能活下來。
理論上,我只需求能不計成本確保二十行的代碼初次運轉無bug。然後我只需自我約束每個函數不超越二十行,甭說2000行,4000行都能夠確保無bug。儘管我不知道假如不是被人用槍指著頭的話為啥要這樣搞。
普通人不大或許,大神不知道。
讓我寫個2000行代碼,出個十幾個錯在所難免,乃至有時分還會漏打分號。
可是我還算是不行替換的事務主幹。由於對事務有透徹的了解,寫出來的邏輯正確,結構明晰,大方向掌握比較準,算法方面也不會掉鏈子。語法上不確定能夠上網查,所以你讓我換一個言語,上手的速度也十分快。
別聽一些練習組織或許教師忽悠你,編程序不要有語法錯,沒有語法錯,便是大師便是高手。
錯。
現在越來越智能化的集成環境,智能補全的功用現已空前絕後,查看越來越嚴厲的編譯軟體,都能幫你把簡略的根本過錯悉數揪出來,指出方位和過錯稱號,你照著改就行了。
作為高檔程式設計師的價值,在於透徹的了解而且完成事務邏輯,在於使用物理和數學辦法建模型並精準的處理問題,關於寫出適宜的算法處理適宜的問題。
還有,其實編譯器查不出來的bug才是真實可怕的,不是嗎?
首要,我從前寫過4K行代碼(便是閒,自己閒的蛋疼跟搭檔比,QT + VS2015 + C++ + CAMKE + MSVC),編譯沒有問題,沒有任何正告,也”自測”過了
**程式設計師自測** 你懂得
然後我看著我的代碼慌了1天…..真實含義上的一天.
效果?天道好輪迴,天崩地裂(CPP使用)..
我前年卻是真有過1500行代碼0 bug的閱歷,至於有沒有error和warn卻是記不清了,權且假定沒有吧。
這個0 bug呢,說出來咱們當然不信,其實我自己也不信,可是場面上呢,它的確是0 bug。
前年換崗到了新公司,參加一個剛成立不久的新團隊,本來團隊裡邊的技術主幹呢,對我這個空降的技術領導自然是不見得滿足的。
先劃著水摸了兩個月的魚,算是大約摸清了狀況,來了個緊急使命,司理大約也是想要檢測我一下吧,讓我想辦法搞定,從想計劃從到規劃到編碼到上線一共兩周時刻。
是的,這個使命乃至連個計劃都還沒有,咱們僅有知道的是咱們或許需求寫一個通用library,然後在事務體系裡邊再調用。事務上要做的工作很簡略,它之所以變成一個正式的使命,便是由於上頭的大佬不能容忍咱們在事務體系直接打個補丁完事,要求有必要出一個通用計劃能夠同享到其他體系中去。
我花了三天時刻,燒了不少腦細胞,想出來一個不錯的點子,跟幾個相關的團隊開會確認了可行性,寫了個簡略的規劃文檔再評定經過,嗯,現已曩昔4天了,還剩餘6天。
開端寫代碼吧,花了兩天時刻,堆出了1000多行代碼,早會跟咱們商量了一下,為了節省時刻,儘管代碼還有點髒,仍是先把PR宣布去給咱們review,看看有沒有結構上的問題或許顯著的遺漏,我再平行的收拾代碼彌補單元測驗什麼的。
記住,這時分還有4天時刻了。我把PR宣布去,特意說了,代碼還有點髒,請首要重視結構問題以及有沒有嚴重遺漏的bug,單體的edge case我還在補。
宣布PR後,我埋著腦袋又工作了一上午,感覺也收拾得差不多了,翻開郵箱一看,媽呀,60多個comment,細心一看,滿是一個哥們兒寫的,首要內容是什麼呢?
這兒缺javadoc,那裡缺javadoc,寫了十幾個之後,總結一個,整體上,沒有javadoc,這個PR太糟糕了,再附上一個javadoc的官方連結(這兒應該手動doge)
考慮到這個library的想定用處是十分接近底層的通用功用,處於功用考慮,整體上我的代碼對錯functional風格的(這個決議卻是的確值得商討),所以,在一切他認為應該functional的當地都會留下談論,嗯,再加上java 8 stream api的blog連結(5年scala程式設計師一臉懵逼)
各種變數命名不合他的心意
各種缺少單元測驗(啊,大哥,我知道啊,咱們都知道啊)
有個當地的邏輯需求做字元串匹配,完好謹慎的邏輯需求一個上下文無關的parser,我明顯沒有滿足的時刻來做這個工作,所以就寫了兩個正則表達式來匹配,然後注釋說,這次上線咱們只需求驗證這兩種狀況,等上線後這兒會重寫一個上下文無關的parser。已然我只需兩個case,當然是簡略的ifelse判別一下就好了,他的談論說,要是這兒有100種case你這個ifelse會變得十分醜惡。。。(嗯,所以大哥你是眼瞎嗎?)
一個辦法遍歷一個List&
做點工作,傳入參數的姓名是values,循環變數我寫的v,留意,這個辦法一共就三行代碼,他談論說,變數名不能這麼簡略,司理偶爾看到了這個,問他為啥不能這麼用,他說,將來這個method會變得十分大,就沒人知道這個v是什麼意思了。。。司理作為前程式設計師,其時也石化了。。。
(別急,0 bug的事兒在終究)
我看他這談論的姿勢來者不善啊,(省掉各種撕逼)找到司理了:
這哥們兒寫這麼多是歹意仍是好心?
傳聞我來之前咱們team沒有代碼規範文檔是吧?我作為技術領導進來,這事兒好像是我的事務是吧?這哥們兒的意思是咱們這team的規範他說了算?仍是我說了算?
還剩3天了,你這意思是上線仍是不上線?
司理回頭強按著他approve了代碼,上線發布了。我就等著,比及灰度完畢,整體上線第二天,找到司理了:
哎,問你個事兒,你覺得我的代碼質量怎麼樣?1500行代碼,0 bug,還算能夠吧?對得起公司給我定的級哈?
司理一臉懵逼,大哥,啥意思?
嘿,也沒啥意思,我那個PR,1500行代碼,收了60多個comment,沒有一個跟bug有關,這不,都上線了,你信不信我1500行代碼沒bug?你甭說,我自個兒都不信我這麼牛逼。
司理潰散了。。。
我0 bug效果達到。。。
之前手擼過AVL樹。
用Python來的,命運很好,0EWB。
然鵝第一次運轉的時分有邏輯過錯。。。不過這個玩意,其實也算Bug。
說了這麼多,便是想說一句,代碼量和代碼是不是能被編譯運營都是非必須的,更重要的是邏輯。能不能處理這個問題,在有了思路的根底上,必要的輪子能不能造?調包你會不會調?我覺得這才是更重要的。
你的這個問題就像是在問
一個籃球運動員,能不能把球頂在手指頭上旋轉1個小時。
或許有的運動員的確能做到,但能是能,這樣做又有什麼用呢?扔掉其他練習天天去練轉球?
這個問題對程式設計師也是相同,假如我把一行代碼仿製一千遍,是不是也是一千行無bug呢?
你或許說我這是在做弊,那我就聚精會神一天,每寫完一行都完好的查看一遍,終究做到了0bug。
但我為什麼不花一個小時寫完代碼,另一個小時改bug呢?
所以說題主這個問題徹底沒有含義,他根本便是一個外行,聽了幾個關於程式設計師寫bug的段子就認為判別一個程式設計師水平凹凸的辦法便是看他寫不寫bug。
或許是題主才學了個c言語,對這方面僅僅僅僅入了個門。這時分寫的c言語練習題也就幾十行最多一百多行的水平,必定很仰慕一些所謂的「大項目」,也很獵奇是不是大佬徹底不寫bug。
這只能闡明題主對這方面了解到仍是太少了算了,就像你不能用點錢的快慢來判別一個管帳是否優異相同。相同,計算機這邊常識也是無邊無盡的,代碼打的快的不一定兇猛,不犯錯的也不一定便是大佬。
要做(在某種含義上)也能做到,可是樸實是為了做而做。比如寫2000行必定safe可是沒有任何有用功用的代碼。
實際工程傍邊,根本不太或許。
(以C++開發為例)
由於:
已然是大佬親子操刀,必定不是在徹底重複現已做過的東西,那麼總有不太清楚的當地
必定要用到渠道供給的代碼。這些代碼自身就不是0 warning 0 bug的。比如,你開msvc -Wall的話,就會發現體系頭文件一堆warning
有些warning並不是問題,有些乃至僅僅提示。比如某個API快要過期了,比如最新的C++規範這兒有些改變,等等
不同的編譯器之間就有不同,有些仍是對立的,特別是在C++新規範方面。這邊不報了那兒報,這是沒辦法的工作。
0 bug這件工作儘管不是徹底無法證明可是根本上是無法證明的
假如找一個狀況好的時刻聚精會神,能夠做到。可是這樣做毫無含義。假如是一邊聽音樂一邊刷知乎,必定就做不到了。
可是,為什麼要一遍經過呢?含義安在呢?
編程的技術本來就包含編碼、調試、測驗,三種技術都很重要啊。三管齊下,將程序「寫」正確即可。
疏忽其他兩種,單純尋求一種成為高手,路子本來就偏了。
能夠一次過的。
可是你要留意,在他動手寫代碼之前,一切的邏輯,代碼的結構,都現已在腦子中想的明明白白,清清楚楚了。
打個比如,
或許考慮:5天;
然後編碼:1天;
測驗:0bug。
大部分人是,
直接上手編碼:1天。
測驗迭代:無數次;
修正:無數次。
測驗人員時刻:5天。
自己修正時刻:7天。
終究效果:潛在若干bug的縫縫補補新代碼一份。
這也是高手與低手很重要的差異之一。。。。。。
一遍過卻是常常的事,尤其是在有 IDE 協助的狀況下,有主張、有警示,很少在編譯時呈現 error 和 warn。
不過,0 Bug,這個就難說了。當下測驗看起來沒 Bug 的,或許 Unit test 覆蓋率 100% 的,也有或許在日後某個特別狀況下,或被其他人調用時呈現 Bug,或不行完善的狀況。
其他,個人來說,一次性寫上千行代碼然後一次性會集編譯,他人有沒有這麼幹不知道,我應該沒有這樣的閱歷,最多也就敲上幾十上百行,就得構建一次試試。
歸納來說,0 error 0 warn,及格水平。0 bug,這不好說,橫豎我的代碼是常常改的,或許其時沒問題但日後看寫得不太好,邏輯太紊亂、冗長,然後改了改,效果改出 bug 來了。
軟體工程,形式化驗證,了解一下
我寫過不可勝數的bug
也修正過不可勝數的bug
#################################
當第一眼看到這個問題,我想起的我的小外甥。有一天他興致勃勃的遊玩,然後不小心被小刀割破了手指。他呆呆的坐在沙發上,看著纏著創傷貼的手指,目光中充滿了哀怨,似乎在說:「怎麼辦,我的人生不完好了」
2000行0 error 0 warn 0 bug。就好比我的小外甥在興致勃勃的遊玩。
但那一個命中注定的error會到來的,你的人生終究會遇到「不完好」的那一刻。
然後上了年歲後,你會身經百戰,bug等身,渾身遍及刀創斧鑿的痕跡。那會兒回頭看看,這兩千行算不了什麼,兩千萬行兩萬個BUG,這才是正常水平。水平高的少一點,水平差的多一點算了。
最多也便是碼農民工的水平,由於你一定是在寫2000行幼兒園等級的1+1=2,不然不或許一遍過,或許有人講一大堆理由告知你代碼就應該一次寫對,當然這僅僅胡吹瞎扯。好代碼不該該是調出來的,但也是不斷修正推翻再修正重構出來的。error warn 和 bug便是這個周期的表現。代碼表現的是思維,思維便是探究和試錯。
一個測驗工程師走進一家酒吧,要了一杯啤酒;
一個測驗工程師走進一家酒吧,要了一杯咖啡;
一個測驗工程師走進一家酒吧,要了0.7杯啤酒;
一個測驗工程師走進一家酒吧,要了-1杯啤酒;
一個測驗工程師走進一家酒吧,要了232杯啤酒;
一個測驗工程師走進一家酒吧,要了一杯洗腳水;
一個測驗工程師走進一家酒吧,要了一杯蜥蜴;
一個測驗工程師走進一家酒吧,要了一份[email protected]!*(@;
一個測驗工程師走進一家酒吧,什麼也沒要;
一個測驗工程師走進一家酒吧,又走出去又從窗戶進來又從後門出去從下水道鑽進來;
一個測驗工程師走進一家酒吧,又走出去又進來又出去又進來又出去,終究在外面把老闆打了一頓;
一個測驗工程師走進一家酒吧,要了一杯燙燙燙的錕斤拷;
一個測驗工程師走進一家酒吧,要了NaN杯Null;
一個測驗工程師衝進一家酒吧,要了500T啤酒咖啡洗腳水野貓狼牙棒奶茶;
一個測驗工程師把酒吧拆了;
一個測驗工程師化裝成老闆走進一家酒吧,要了500杯啤酒而且不付錢;
一萬個測驗工程師在酒吧門外呼嘯而過;
一個測驗工程師走進一家酒吧,要了一杯啤酒;DROP TABLE 酒吧;
測驗工程師們滿足地離開了酒吧。
然後一名顧客點了一份炒飯,酒吧炸了。
***
侵刪

Pin It