自從上次看了業界大神阮一峰發的那篇文章之後,給我的印象非常的深刻,一直想寫文章跟大家交流和**一下,那就是:軟體開發到底算不算知識呢?
在**這個話題之前,我們先看看大神阮一峰是怎麼說的,大致內容如下:
在軟體開發中,技術變化如此之快,你花費了大量時間學習技術和工具,一旦這些技術被取代,你的知識將變得毫無價值,因為它們大部分都是實施的細節。看到這段話的時候,其實自己對於軟體開發技術的更新迭代速度快,並不感到震驚,也不感到吃驚。畢竟,我們作為程式設計師對於技術發展的速度,更新換代的時間已經司空見慣,習以為常了。我最近總是在想這段話,軟體開發算不算是真正的知識?
如果它是一種真正的知識,那麼理論上,我們學到的東西大部分應該不會過時,就好像微積分不會過時一樣。可是實際上,我們都知道,軟體開發技能有時效性,十年前學習的程式設計知識,十年後幾乎肯定不能用於生產。那樣的話,軟體開發就不能算真正的知識,只是一種實施的細節。
公司旁邊有一家稅務所,每天都有很多人排隊交稅。如果你是第一次來交稅,肯定搞不清楚怎麼交,交稅是一門學問,必須有人教你,要帶哪些證件,要填哪些表,去哪些視窗排隊等等。
我現在認為,學習程式設計跟學習交稅是一樣的,都是學習實施的細節。一旦外部環境變了,原來的實施細節就沒用了。 當代程式設計由於層層的抽象和封裝,我們已經不必接觸底層真正具有通用性的知識了。大部分時候,所謂程式設計就是在寫某個抽象層的配置。比如,網頁樣式就是在寫 css 配置,你很難說這到底是真正的知識,還是像《辦稅指南》那樣的實施細節。
實施細節並不是知識,而是操作步驟。如果技術棧發生變更,實施細節就會毫無用處。但是,你又不能不學習它,不知道實施細節,就沒法做出專案。我覺得,程式設計師應該要警惕,不要落入實施細節的陷阱,不要把全部精力花在實施細節上面,然後以為自己學到了真正的知識。對待各種語言和工具,正確的態度應該是「進得去,出得來」,既要了解足夠的細節,也要能夠站在巨集觀的角度看待它,探尋底層到底是怎麼實現的。
但是,正式因為我們的司空見慣和習以為常導致我們對這樣的問題就缺少了思考。
我比較震驚的是知識的概念。
如果說我們的軟體開發和程式設計經驗不屬於知識,那它們屬於什麼呢?對,它們屬於技術。但是,我們再思考一下,技術和知識又有什麼關係呢?
知識應該是技術的基礎,知識是根,技術是術。舉個例子的話就是:知識就是交通規則,技術就是駕駛技術,有了技術你就能開車上路,但是要想安全行車,就必須還得懂交通規則。
知識是懂的原理,技術是知道怎麼做。如果不懂知識,死記硬背,熟練練習技術,你能幹活嗎?能幹,但是要想幹好,那就必須得懂。就像開車一樣,光學會了駕駛技術,但是要想安全行車,必須懂得交通規則。
那在深一層次的問,既然知識是技術的基礎,我們程式設計,軟體開發的根是什麼呢?對,就是那些原理性的東西。比如,計算機系統原理,編譯原理,演算法等。
其實,知識這個概念到現在也沒有乙個明確的概念。知識是符合文明方向的,人類對物質世界以及精神世界探索的結果總和。知識,至今也沒有乙個統一而明確的界定。
就比如阮老師在上面說的微積分,微積分在現階段我們的認知下,是正確的,但是在未來就不一定對了,也不一定能夠滿足和使用了。所以,它終究也可能會被淘汰。只不過這個科學基礎性的知識的生命週期可能比較長,不容易更新換代一樣。
就像我們現在的技術更新迭代快一樣。軟體開發的技術一直在更新迭代,但是計算機系統原理,編譯原理更新的週期快嗎?生命週期長嗎?對,這些科學基礎性的東西就如同微積分一樣,不是它不會被淘汰,只不過是在現階段的文明和人類的認知前提下,很難有進一步的突破,一旦有突破,也會淘汰。
不知道說了這麼多,大家看懂了沒有?其實討論完這個話題之後,我們應該認識到,現階段大部分的程式設計師都是忽視原理和基礎的,都是在死記硬背軟體的開發技術和流程,而很少去懂原理性的東西,這就是為什麼很多人說我們程式設計師是吃青春飯的原因。因為熟練使用一種技能很容易被淘汰,而甚至原理性的東西,確實很難過時。
非著名程式設計師
」。
網路程式設計 軟體開發架構
一 楔子 現在我們已經學會了寫python 假如你寫了兩個python檔案a.py和b.py,分別去執行,你就會發現,這兩個python的檔案分別執行的很好,但是如果這兩個程式之間想要傳遞乙個資料,應該怎麼做呢?二 軟體開發架構 1 客戶端服務端概念 2 c s架構 c s即 client與serv...
敏捷軟體開發 極限程式設計
極限程式設計 1.客戶作為團隊成員 2.使用者素材 為了進行專案計畫,必須要知道和專案需求有關的內容,但是無需知道得太多。看到新系統的問世是關注需求的最好時刻。3.短交付週期 每兩周交付一次可以工作的軟體。每次迭代結束時,會給涉眾演示迭代生成的系統,以得到他們的反饋。4.驗收測試 5.結對程式設計 ...
什麼是程式設計?什麼是軟體開發?
在學校裡,為了實現課堂練習,為了完成作業,為了實現而實現的 過程,我將其定義為程式設計,這個時候,你只要正確的讓編譯器把你的 順利的編譯通過,輸出你希望的或者說你的導師希望的結果即可,你不需要考慮彈性 擴充套件性和維護性,也不需要考慮你的 是否強壯,也不需要考慮是否具有價值,因為你只是在程式設計。而...