當前位置:
首頁 > 知識 > 編程到底難在哪裡?

編程到底難在哪裡?

來自:知乎


各種語言就好比文字,編程的過程就是用文筆書寫詩篇,假設對於語言的應用已經十分透徹了,那麼編程的難點在哪裡?


在使用的思路,還是各種演算法,還是以人腦卻用電腦的方式思考問題?


DJ Hitori,玩音樂的程序員


作者:DJ Hitori

鏈接:https://www.zhihu.com/question/22508677/answer/141334678


來源:知乎


普通人:


我今天要買一斤蘋果。


程序員:


我今天要買一斤蘋果。


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


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


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


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

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

編程到底難在哪裡?



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


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


為了解決這個問題,我應該先詢問所有水果店的價格,然後去價格最低的那一家買蘋果。


經過修改,我重新設計出以下的買蘋果的流程:

編程到底難在哪裡?



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

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


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


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


啊問題太多了我懶得再改流程了。我還是去X寶買吧。


那麼接下來我要設計一個在X寶買紅富士蘋果的流程……


==========================================================


這篇沉寂了5天只得到1個贊的回答竟然一夜之間收穫2000+贊,一舉成為個人最多贊的回答。感謝大家的支持,以及精彩的評論。


這篇回答並不是講述在生活中程序員如何買蘋果,而是以買蘋果為例說明程序員如何解決問題。程序員需要對問題進行透徹的分析,理清其涉及的所有細節,預測可能發生的所有意外與非意外的情況,列出解決方案的所有步驟,以及對解決方案進行盡量全面的測試。


而這些正是我認為編程難的地方。任何一點遺漏都會成為bug,輕則導致挨罵,重則導致經濟損失甚至危害安全。


注意這些難點全部和語言無關。和編程所需要的絕對嚴密的邏輯相比,語言實在是太簡單了。(某些自帶代碼混淆效果的語言除外)

龔黎明 晶元(集成電路)、中央處理器 (CPU) 話題的優秀回答者


作者:龔黎明


鏈接:https://www.zhihu.com/question/22508677/answer/171948755


來源:知乎


最近項目逼緊,老同事有一個bug始終解決不了,拖了半個月了,老大就把我給派過去協助。


我們做的是用C語言生成硬體代碼(更低層的verilog,verilog是一門硬體編程語言),懂這個的知道這個叫做HLS開發(高層次綜合)。


HLS算得上是比較新的東西,因為傳統上設計硬體,都是直接coding 硬體設計代碼。幾十年都是如此,直到最近幾年HLS開始慢慢有了應用。


他那段代碼並不是很複雜,總共30多行,我反覆閱讀了代碼,邏輯功能沒有問題,模擬也沒有問題。純C語言模擬可以實現想要的功能。


綜合成底層的verilog代碼的過程中也沒有報錯。


但是綜合得到的verilog代碼,跟C代碼的功能卻不一致。

也就是說工具並沒有成功的從C語言轉換到我們需要的verilog語言。


我們初步斷定是coding style的問題,因為HLS對C語言的寫法有要求,如果寫的不好,要不綜合得到的硬體性能不好面積太大,還有可能綜合的不對。


因為肉眼看不出來,所以暴力的方法,就是重新寫一個。換一種寫法,說不定運氣好能過。


所以我試了另外一種寫法,用了一種高級的數據類型,代碼只有10行。


綜合結果也不對。


我把其中的部分代碼一行一行刪掉,最後只剩下4行,終於對了。


所以我判定另外6行有問題。


我對另外6行再次改寫,把一些常變數換成固定數值,發現固定數值就沒有問題。


看到了一點曙光。


於是我開始懷疑是一個常量的數據類型錯了。

原代碼裡面常量採用了constant int的類型,當我將其改成ac_int的時候,終於對了。


所以你看,我們搞了一個星期,到最後發現就是一個變數類型定義不對。


總代碼數非常少,也就是十幾行,修改的地方也就幾個字元。


但是為了得到這個結果,我們試了十幾種方法,換了各種各樣的coding style。


編程難的地方的就是這裡。寫的時候很爽,覺得自己思路清晰,寫完了,全是bug。


bug多了,就覺得沒意思了。


現在的編程,說是高級語言,其實還是人在理解機器。


為什麼Class複製之後只是指針複製了?別的變數複製之後整體都被複制了?


這些都是為了機器的方便,為了少點開銷,對人只會造成混淆。


機器不具有容錯能力,機器一遇到bug只會撒手,說白了還是我們的機器不行。

我們仍然處於編程歷史的初級階段。


李力,騰訊雲的老程序員,招聘各類技術職位


作者:李力


鏈接:https://www.zhihu.com/question/22508677/answer/21631558


來源:知乎


難在複雜性的持續增加。


如果編寫一段寫完就扔的代碼(如運維修復),那其實是可以很快做好的,想不通的地方繞一繞總也能搞得定。


但當你編寫的是一段大規模使用,需要持續改進,並且不斷有新功能需要添加的代碼。那麼難度就急劇增加了(這也是我認為的編程的主要難處)。


一方面,最開始編寫代碼的時候就要考慮到以後的擴展性,而這個考慮又永遠不可能是完備的,也不應該是完備的(不要過早優化)。只有一些基本的原則,比如保持單模塊的獨立性,避免模塊間的耦合,這些原則的運用需要豐富的經驗,並且不一定總是用好了。


另一方面,在代碼的持續演進過程中,需要對抗代碼的腐化。當原來拍著胸脯保證的確定因素突然變成不確定因素;當代碼引入了不合理的功能(如需要理解上層邏輯);當有新的人來維護代碼。代碼腐化的結果是大大增加了工作量和減少了代碼的穩定性。(代碼腐化只有一個好處,天天加班,顯得事情很多,搞不好能把領導唬住)

醬油瓶12138我是個好人,就是長的不像


一個測試工程師走進一家酒吧,要了一杯啤酒;


一個測試工程師走進一家酒吧,要了一杯咖啡;


一個測試工程師走進一家酒吧,要了0.7杯啤酒;


一個測試工程師走進一家酒吧,要了-1杯啤酒;


一個測試工程師走進一家酒吧,要了2^32杯啤酒;


一個測試工程師走進一家酒吧,要了一杯洗腳水;


一個測試工程師走進一家酒吧,要了一杯蜥蜴;


一個測試工程師走進一家酒吧,要了一份asdfQwer@24dg!&*(@;


一個測試工程師走進一家酒吧,什麼也沒要;

一個測試工程師走進一家酒吧,又走出去又從窗戶進來又從後門出去從下水道鑽進來;


一個測試工程師走進一家酒吧,又走出去又進來又出去又進來又出去,最後在外面把老闆打了一頓;


一個測試工程師走進一家酒吧,要了一杯燙燙燙的錕斤拷;


一個測試工程師走進一家酒吧,要了NaN杯Null;


一個測試工程師衝進一家酒吧,要了500T啤酒咖啡洗腳水野貓狼牙棒奶茶;


一個測試工程師把酒吧拆了;


一個測試工程師化裝成老闆走進一家酒吧,要了500杯啤酒並且不付錢;


一萬個測試工程師在酒吧門外呼嘯而過;


一個測試工程師走進一家酒吧,要了一杯啤酒 ;DROP TABLE 酒吧;


測試工程師們滿意地離開了酒吧。


然後一名顧客點了一份炒飯,酒吧炸了。


——轉載自朋友圈


匿名


永遠不知道真正的需求是什麼樣子

編程到底難在哪裡? 點擊播放 GIF/1841K



本文編號2376,以後想閱讀這篇文章直接輸入2376即可。


輸入m獲取文章目錄


推薦


Java編程


更多推薦15個技術類公眾微信


涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序猿 的精彩文章:

猿哥文章總結,這裡才是精華
MySQL性能優化總結
學Java的顫抖吧!一文讓你全面深入了解Kotlin
一生只為尋找歡笑——讀Linux之父林納斯自傳

TAG:程序猿 |

您可能感興趣

神回答:編程到底難在哪裡?
編程難在哪裡
知乎神回復:編程到底難在哪裡?看懂才是個合格的程序員
編程有多難?難在哪裡?看完這篇文章或許你就明白了
編程真的有那麼難嗎……
【好物】這一篇徹底說清楚了!樂高,編程,機器人到底要不要學?幾歲學?
求你了,編程面試問題太難真的招不到好程序員!
我們常常聽到的編程語言到底是什麼?
從「少兒編程」到編程
有了這十五款編程遊戲,誰都可以學編程!
編程是什麼?我們為什麼要學習編程?
這麼多編程語言到底都是幹啥的 看完這個你就懂
想自學編程,但是從哪下手呢?
假如編程是一款對話遊戲,測測你能打到哪一關!
玩桌游也能學編程?有這套「編程三劍客」就夠了
現在學習編程有哪些好處?看完我也想去!
作為程序員,你在編程時吃了哪些數學的虧?
編程地震!這個事情影響到所有程序員!
編程地震!這個事情影響到@所有程序員!
編程從古代就有,只是現在編程換了一個……