自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

什么才算是真正的編程能力?

開發(fā) 前端
還 在讀書,也在實驗室?guī)兔ψ隽诵〇|西,自己也搭過幾個網(wǎng)站。在周圍人看來似乎好像我很厲害,做了那么多東西,但是我發(fā)現(xiàn)這些東西雖然是我做的,但是實際上我 手把手自己寫的代碼卻并沒有多少,很多都是用開源的東西,我寫的代碼無非是把別人的東西整合下,類似于膠水一樣的工作。

問題:什么才算是真正的編程能力?

還 在讀書,也在實驗室?guī)兔ψ隽诵〇|西,自己也搭過幾個網(wǎng)站。在周圍人看來似乎好像我很厲害,做了那么多東西,但是我發(fā)現(xiàn)這些東西雖然是我做的,但是實際上我 手把手自己寫的代碼卻并沒有多少,很多都是用開源的東西,我寫的代碼無非是把別人的東西整合下,類似于膠水一樣的工作。

[[136185]]

我之前所認為的編程是全手動一行一行敲代碼,但是現(xiàn)在我發(fā)現(xiàn)哪怕是工程上也有很多人是復(fù)制黏貼來解決問題的,并且提倡不要重復(fù)造輪子。

但是靠谷歌和復(fù)制別人的輪子,雖然我做出了很多東西,可是我并不覺得自己能力上有提升,倒是利用搜索引擎的能力的確提升了不少。而學校里另外一波搞ACM的人,他們每天刷題練算法,或許倒是的確提升了點編程能力,但是對工程幾乎一竅不通。

所以我現(xiàn)在就很困惑,所謂的編程能力到底是什么,我該如何提升自己的編程能力?

回答者:劉賀,...

非常好的一個問題。這可能是我在知乎見到過的問編程有關(guān)的問題中問得***的一個了。我非常喜歡這個問題。

計算機科學有兩類根本問題。一類是理論:算法,數(shù)據(jù)結(jié)構(gòu),復(fù)雜度,機器學習,模式識別,等等等。一類是系統(tǒng):操作系統(tǒng),網(wǎng)絡(luò)系統(tǒng),分布式系統(tǒng),存儲系統(tǒng),游戲引擎,等等等等。

理論走的是深度,是在追問在給定的計算能力約束下如何把一個問題解決得更快更好。而系統(tǒng)走的是廣度,是在追問對于一個現(xiàn)實的需求如何在眾多的技術(shù)中設(shè)計出最多快好省的技術(shù)組合。

搞ACM的人,只練***類。像你這樣的更偏向于第二類。其實挺難得的,但很可惜的是第二類能力沒有簡單高效的測量考察方法,不像算法和數(shù)據(jù)結(jié)構(gòu)有ACM競賽,所以很多系統(tǒng)的苗子都因為缺少激勵和正確引導(dǎo)慢慢就消隱了。

所以比爾蓋茨才會說,看到現(xiàn)在學編程的人經(jīng)常都把編程看作解各種腦筋急轉(zhuǎn)彎的問題,他覺得很遺憾。

做系統(tǒng),確實不提倡“重復(fù)發(fā)明輪子”。但注意,是不提倡“重復(fù)發(fā)明”,不是不提倡“重新制造”。恰恰相反的,我以為,系統(tǒng)的編程能力正體現(xiàn)在“重新制造”的能力。

能 把已有的部件接起來,這很好。但當你恰好缺一種關(guān)鍵的膠水的時候,你能寫出來嗎?當一個已有的部件不完全符合你的需求的時候,你能改進它嗎?如果你用的部 件中有bug,你能把它修好嗎?在網(wǎng)上繁多的類似功能的部件中,誰好誰壞?為什么?差別本質(zhì)嗎?一個開源代碼庫,你能把它從一個語言翻譯到另一個語言嗎? 從一個平臺移植到另一個平臺嗎?能準確估計自己翻譯和移植的過程需要多少時間嗎?能準確估計翻譯和移植之后性能是會有提升還是會有所下降嗎?

系統(tǒng)編程能力體現(xiàn)在把已有的代碼拿來并變成更好的代碼,體現(xiàn)在把沒用的代碼拿來并變成有用的代碼,體現(xiàn)在把一個做好的輪子拿來能畫出來輪子的設(shè)計藍圖,并用道理解釋出設(shè)計藍圖中哪些地方是關(guān)鍵的,哪些地方是次要的,哪些地方是不容觸碰的,哪些地方是還可以改進的。

如果你一點不懂理論,還是應(yīng)該學點的。對于系統(tǒng)性能的設(shè)計上,算法和數(shù)據(jù)結(jié)構(gòu)就像在自己手頭的錢一樣,它們不是***的,但不懂是萬萬不行的。

怎 么提高系統(tǒng)編程能力呢?土辦法:多造輪子。就像學畫畫要畫雞蛋一樣,不是這世界上沒有人會畫雞蛋,但畫雞蛋能馴服手指,感受陰影線條和筆觸。所以,自己多 寫點東西吧。寫個編譯器?渲染器?操作系統(tǒng)?web服務(wù)器?web瀏覽器?部件都一個個換成自己手寫的,然后和已有的現(xiàn)成部件比一比,看看誰的性能好,誰 的易用性好?好在哪兒?差在哪兒?為什么?

更 聰明一點的辦法:多拆輪子。多研究別人的代碼是怎么寫的。然而這個實踐起來經(jīng)常很難。原因:大部分工業(yè)上用的輪子可能設(shè)計上的思想和技術(shù)是好的,都設(shè)計和 制造過程都很爛,里面亂成一團,讓人乍一看毫無頭緒,導(dǎo)致其對新手來說非常難拆。這種狀況其實非常糟糕。所以,此辦法一般只對比較簡單的輪子好使,對于復(fù) 雜的輪子,請量力而行。

輪 子不好拆,其實是一個非常嚴重的問題。重復(fù)發(fā)明輪子固然是時間的浪費,但當輪子復(fù)雜而又不好拆的時候,尤其是原來造輪子的人已經(jīng)不在場的時候,重新發(fā)明和 建造輪子往往會成為無奈之下***的選擇。這是為什么工業(yè)界在明知道重復(fù)發(fā)明/制造輪子非常不好的情況下還在不斷重復(fù)發(fā)明/制造輪子的根本原因。

程序本質(zhì)是邏輯演繹的形式化表達,記載的是人類對這個世界的數(shù)字化理解。不能拆的輪子就像那一篇篇丟了曲譜的宋詞一樣,能讀,卻不能唱。

鄙人不才,正在自己研究怎么設(shè)計建造一種既好用又好拆的輪子。您沒那么幸運,恐怕是等不到鄙人的技術(shù)做出來并發(fā)揚光大了。在那之前,多造輪子,多拆好拆的小輪子,應(yīng)該是提高編程能力***的辦法了。

以上。嗯。

(文章屬個人觀點,與本人工作雇主無關(guān)。)

回答者:mu peng,less is more

懂得取舍。

在有限的時間內(nèi),幾乎沒有系統(tǒng)可以做到***。要快,要安全,高并發(fā),易擴展,效率高,容易讀,高內(nèi)聚,低耦合...

大到一個網(wǎng)站,小到幾個class,工程師都要清楚,要取什么,舍什么,這并不是那么容易的事。我們都有自己的性格,有的求新,有的求穩(wěn),有的求快,但具體到一個項目時,知道如何取舍對這個項目***,很重要。

學校里的作業(yè),沒人在意你是不是寫在一個大的main()里面,能跑就行。但做項目的時候,太多的東西要考慮,有時候,寧可簡單易讀,也不用快那么一點點;有時候,要做太多看不到的工作,卻絲毫馬虎不得;有時候,寫了不如不寫,留白也是一個學問。

曾經(jīng)接手個項目,里面幾乎所有的class,每個都有interface,各種繼承,各種實現(xiàn),理由是靈活性高,易擴展。真的易擴展嗎?

我不知道。沒多久,客戶的需求就改了,各種拎不清的繼承實現(xiàn)都化為烏有,一大半要重寫。

問題在哪里?

不是編程不好,而是取舍的不好。在那個階段,為30%的需求,花200%的努力,追求設(shè)計的滴水不漏,卻舍棄快速實現(xiàn),取得反饋的時機,這就是失誤。需求總會變,客戶看到越早,修改越早,影響越小。

很聰明的人,也可能做出很難用的系統(tǒng),不一定是編程不好,可能是不愿,或不屑于取舍。不同的階段,不同的項目,要取舍的東西也不同。編程只是手段,目的是解決問題,能力高不高,要看問題解決的好不好。不在于使用了什么高端算法,或是復(fù)雜的框架。

懂得如何取舍并不容易,需要對問題的深刻理解,對技術(shù)的胸有成竹,和身后無數(shù)個踩過的坑。但重要的是有取舍的意識,主動思考取舍什么,這樣學的才會快。

回答者:李遙,A Programmer

既然說的是編程能力,那首先就先把學術(shù)相關(guān)的能力排除才能說的清楚

接下來是我對編程的定義:所謂編程,就是預(yù)先設(shè)計好方案來指揮行為可預(yù)測的系統(tǒng)來自動(與臨時手動相對)達到的想要的結(jié)果。從廣義上說,企業(yè)家對一個公司的運作方式進行設(shè)計,然后這個公司自動運行產(chǎn)生利潤也是一種編程

那么編程能力體現(xiàn)在兩點

1.對可預(yù)測系統(tǒng)的理解:理解越深,預(yù)測能力越強,自己的智慧才越好發(fā)揮。這就是為什么學習軟件編程最快的方式之一是“造輪子”

2. 如何把自己的目標轉(zhuǎn)化成指揮方案,這其實就是“做應(yīng)用題”的能力,我們從小學就在練習這個能力?,F(xiàn)實世界的應(yīng)用題可不會告訴你用什么知識點去建模,也不會 透露全部必要條件,因此增強這個能力需要深刻理解現(xiàn)實世界的運作方式。在軟件行業(yè),這被稱作“理解垂直行業(yè)的業(yè)務(wù)邏輯”

順帶說一下,所謂“Hacking”,其實就是在深刻理解一個系統(tǒng)的基礎(chǔ)上,用最小的代價改變這個系統(tǒng)來達到自己的目的。“Hacking”之所以看起來出人意料,就是因為理解越深刻,需要的做的改動越少。如果理解不深刻,那就要從頭造一個系統(tǒng)了,那就不聰明了

回答者:丁盛豪,網(wǎng)絡(luò)媒體HeckPsi.com創(chuàng)始人

謝 @花滿樓 邀請。

對于編程能力這個問題其實我也想過很久,這個東西確實非常難界定。單純靠算法水平、編程速度、工程經(jīng)驗都很難說是編程能力。

雖然這個東西的影響因素非常龐大,但從我日常的工作來看,其實我覺得衡量編程水平最靠譜的方法是觀察這個程序員 Debug 的能力。

程 序從本質(zhì)上來說就是 輸入 -> 處理 -> 輸出 的過程,而中間的處理就像是一個巨大的黑盒子。而這個黑盒子的本身就是程序,在大多數(shù)情況下你并不能看到這個黑盒子的全貌。從常識上寫一個不存在 bug 的程序是一件 幾乎 不可能完成的任務(wù)。即使是敲個最簡單的 Hello World 程序,你也很難保證編譯器不給你抽幾下風。尤其是當這個程序變得非常龐大時,寫程序這件事的本身就是 盲人摸象 的過程。程序員必須要有相當好的 全局觀 ,才能保證自己的程序良好運行而不出問題,并能在出了問題之后能夠做出迅速的定位和修復(fù)。

所以觀察一個程序員能否 迅速Debug 的過程就是一個很好的判斷依據(jù)。我舉個例子來說,我?guī)字芮敖o手機刷了機,第二天早上準備去晨跑,發(fā)現(xiàn)手機 GPS 不工作。于是我立刻分析了出現(xiàn)問題可能的地方:

GPS 模塊硬件 -> GPS 驅(qū)動 -> 系統(tǒng)配置 -> GPS 權(quán)限 -> 軟件兼容性

由 于想起剛刷了機,基本可以排除硬件問題。而軟件之前同樣在其它 Android 5.1 機器上跑過,同時跑了下 Google Maps 也不能定位,排除兼容性問題。原生系統(tǒng)的權(quán)限系統(tǒng)非常簡單,基本排除是權(quán)限。出問題的可能是第三方 ROM 的驅(qū)動有問題或者配置文件。觀察到 A-GPS 基站輔助定位也不工作,基本排除 GPS 驅(qū)動問題。確認是配置文件有問題,檢查 /etc/gps.conf 竟是空文件。于是就在手機上用文本編輯器順手碼了一段配置,重啟后問題修復(fù)。

這就是一次非常流暢準確的對一個未知的 Bug 定位和修復(fù)的過程。

由 于 Bug 的未知性,可以很好避免一些你在判斷時可能遇到的 作弊 情況,我們知道現(xiàn)在很多人為了面試無所不用其極。就算是以前非常經(jīng)典的面試問題,現(xiàn)在也很不靠譜?,F(xiàn)在你問 “如何理解面向?qū)ο缶幊蹋?rdquo; 和你對答如流的人可能并不真正理解 OOP,不過背的很熟而已。以前覺得算法是個很好驗證水平的切入點,自從 LeetCode 背題流的出現(xiàn),這招現(xiàn)在也不怎么靠譜。而 Debug 是個無法 提前準備的東西,所以對于編程能力的校驗通常很準確。

而 且,Debug 的過程中會接觸到自己很多不熟悉的知識。由于編程本身就是一個 Engineering,正常的過程就是在 碼字 -> 出問題 -> 學習 -> 修改 的過程中循環(huán)。如果你對算法不熟悉,那么遇到程序性能問題的時候你硬著頭皮也要用學習算法知識來解決掉。所以這是一項非常綜合的能力,是程序員 知識、智力、經(jīng)驗 的綜合體現(xiàn)。

至于如何提升編程能力?

多寫、多錯、多學。沒有捷徑,捷徑只不過是作弊。作弊能幫你找到工作,但并不能真正解決問題。

回答者:陳浩駿,call me Reid / 會寫Java的猴子

MIT算法導(dǎo)論***堂課:

每天都編程 x年后一定會變成專家 (忘了x多少 不是重點

輪子多造多模仿 能力自然提升

什么發(fā)展都是從量到質(zhì)的 要相信

現(xiàn)在我也是搞系統(tǒng)編程 除了看source code和造輪

也是可以有空刷刷acm的

而且只有幫助沒有壞處喔

系統(tǒng)編程一旦考慮到效能問題 離不開經(jīng)典的一些算法的

顯然大部分的我們都不會成為高手如溫趙輪

但是成為編程好手 進個好公司 錢多賺些 生活舒服些 應(yīng)該是普遍程序員的共同目標

不要想太多 拼命code就是了

共勉

如此。

回答者:vczh,專業(yè)造輪子 https://github.com/vczh-libraries

都不知道宣傳不要重復(fù)造輪子的人是懷著什么險惡的用心,原話明明是不要重新發(fā)明輪子。

這是什么意思呢?就是說你要多看論文多看書,少抄代碼。

回答者:達達,服務(wù)端程序員

程序員就是把人類的需求語言翻譯成計算機語言的人,所以可以通用譯事三難:“信、達、雅”。

回答者:Kim Leo

其實,搭網(wǎng)站,寫MIS/CMS/ERP這些,就算是一行行的寫代碼,結(jié)果也只能是你的領(lǐng)域知識不斷提升,對于“編程能力”的提升沒有多少的。就像是你根本無法解釋在你寫的系統(tǒng)中哪個地方應(yīng)用了動態(tài)規(guī)劃一樣。

所以相對來說你所需要的是一些計算機科學內(nèi)的領(lǐng)域知識。

還有,假如你寫了代碼要給別人看和給其他程序員用,應(yīng)該就開始慢慢考慮接口和設(shè)計了。

或者你需要的是一本分析模式?

回答者:JX Consp

看看別人的輪子的形貌(主要是接口,其次是效率)之后自己造一個輪子

其實 STL 源碼剖析 和 modern c++ design 不錯,唯一問題是選擇了 c++ 做教學語言

有興趣可以學點認知和設(shè)計來了解好的接口長得是怎樣的

回答者:海濤,軟件開發(fā)需要低成本、快速響應(yīng)

第1層:能做成東西(能運行)

第2層:做的東西能長時間或高負荷地運行

第3層:做的東西能長時間在高負荷下運行

第4層:能預(yù)先知道什么才是客戶/行業(yè)需要的功能,并以***的代價(金錢、硬件、期限、人力)實現(xiàn)

回答者:DreamPiggy

多看書

多思考

改別人代碼

學別人的架構(gòu)

做自己的軟件

寫自己的架構(gòu)

或許如此循環(huán)就入坑了吧。

責任編輯:王雪燕 來源: 程序猿
相關(guān)推薦

2015-05-19 14:41:22

2010-11-04 10:55:24

編程語言

2022-01-05 18:21:11

網(wǎng)絡(luò)編程web

2022-08-17 17:57:37

GoGo語言

2013-07-17 10:02:54

工程師創(chuàng)新

2021-11-11 17:24:18

云計算5G云應(yīng)用

2020-12-04 08:24:34

監(jiān)控多維度立體化監(jiān)控系統(tǒng)

2023-08-30 08:30:09

2017-05-10 08:39:34

裝機線纜機箱

2019-05-08 09:43:00

Elasticsear LuceneJava

2015-03-20 16:16:56

APM應(yīng)用性能管理云智慧

2018-08-15 14:18:34

算法AI機器學習

2013-12-13 10:47:02

移動游戲Ingress電子新我

2017-11-12 21:12:34

HPC

2022-08-22 12:03:25

代碼技術(shù)

2021-01-27 05:17:27

數(shù)據(jù)分析指標

2021-04-07 06:58:32

邊緣計算計算云計算

2018-08-28 10:26:54

AI代碼科技

2009-02-02 09:04:52

MVC框架Java

2022-04-15 06:47:54

敏捷開發(fā)代碼開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號