很多朋友對“成為程式設計高手”都很有興趣,但對我的那篇文章提出很多批評,多是指出該文對這個話題說得不夠深入。事實上在一篇短文中把這麼大的問題說清楚是很難的事,是以從本篇開始,我們從幾個方面入手,詳細讨論一下這個問題,今天我們讨論一下程式設計的本質。
在探讨程式設計之前,我們先看看我們生活的這個世界,這個世界五彩缤紛,豐富多彩,但都是由元素周期表中的108個元素構成,而這108個元素又主要由電子、質子和中子組成,其中中子不帶電荷,可以忽略。一個電子帶一個負電荷,一個之子帶一個正電荷。如果把電子用0表示,質子用1表示,有沒有發現我們這個世界其實就是由0、1構成的,是不是跟我們coding一樣。質子、電子按照一定規律編碼,形成了我們這個世界存在的108個元素,這是第一層編碼。原子與原子之間需要通過“鍵”建立關聯,形成分子。“鍵”是由兩個電子組成的電子對構成,一個電子屬于A原子,一個電子屬于B原子,A、B原子通過這個“鍵”緊密的聯系在一起。如果一個原子有一個孤立的電子遊離在原子外層,這個電子就有機會與别的原子的電子形成“鍵”,我們可以形象把這個孤立的電子比喻為一隻手,有一個孤立的電子就有一隻手,有兩個孤立的電子就有兩隻手,以此類推。對于原子來說,最多隻有四隻手。比如氯原子有一隻手,氧原子有兩隻手、氮原子有三隻手,炭原子有四隻手。形成鍵的規則可以說是原子編碼的規則。
這裡提出一個問題:這個世界有108個元素,什麼元素是最重要的?
我們把這個世界上的物質分為無機物和有機物,無機物是有限的,而有機物是無限的,正因為有有機物,我們這個世界才會如此多彩。有機物是什麼?我們以前學過,有機物就是碳水化合物。我們知道無機物的分子都很小,而有機物的分子都很大,這個很大的分子的骨架是由炭原子構成的。這個世界有108個元素,為什麼是炭?氧不可以嗎?氮不可以嗎?矽不可以嗎?這裡分析一下炭的特點,炭(C)有四隻手,可以用兩隻手、三隻手或四隻手來建構分子的骨架,用一隻手或兩隻手去連結其他元素的原子,形成分子的枝葉,由于骨架不同、枝葉不同就會形成功能不同的有機分子。這種變化是無窮的。有一隻手的氯元素隻能兩兩配對,形成的是一個點。有兩隻手的氧元素可以連接配接成一條線,比如雙氧水H-O-O-H。有三隻手的氮元素則能形成面。隻有有四隻手的炭元素才能形成立體的結構,線和面都很脆弱,容易斷和折,而立體的結構就很穩定。這種穩定有多強,我們隻要看看由炭元素構成鑽石有多堅硬。有四隻手的不止有炭,還有矽,但矽的原子核已經太大了,“鍵”不再那麼強勁,是以也無法形成大分子。可以說炭是這個世界編碼的核心元素。我們現在可以理一理自然界的編碼過程,首先通過質子和電子編碼出108個元素,這108個元素通過價鍵編碼出各種化合物,而炭元素由其特殊性開始緩慢地編碼出各種簡單有機物,再到複雜有機物,再到細胞、再到各種動植物。這個過程經曆了45億年。
我們現在回到軟體程式設計,軟體是由表示0、1的二進制開始,0、1隻能表示兩個狀态,很簡單,但兩個二進制數就可以表示四種狀态,三個可以有8種狀态,依此類推。這些狀态還沒有意義,是以需要進行第一步編碼,賦予其含義。我們都知道,最初使用8位進行編碼,後來發展到16位、32位、64位編碼,現在是使用64位編碼,用這64位二進制數來定義最基本的東西,比如數字、字母、漢字等。有了基本的編碼定義就可以定義規則了,用這些規則來建構我們現在複雜的程式。我們熟悉的程式設計語言C#、Java都是是來定義這些規則的。
這些程式設計語言首先都會定義一些基本類型,比如整型、浮點數、雙精度、字元串、日期等。這些基本類型是程式設計的基礎。基于基本類型可以建構複雜的類型:比如對象、集合等。對象是由基本類型和對象、集合構成的。集合是由多個對象或集合或基本類型構成。
這些程式設計語言還會定義程式設計的規則,這些規則也不複雜,比如流程的定義,比如線性、循環、分支等流程。通過這些規則就可以編寫完成各種任務的程式了。
對象是一個很重要的概念。對象的變化是無限的。正因為有這無限的變化,才能友善的建構出如此多樣複雜的軟體。但對象不是必須的,因為早前很多程式設計語言是沒有對象這個概念的,也同樣完成很多任務。
程式設計的基礎要求很低,程式設計的規則也很簡單,很容易上手,但要想編出好的代碼卻不容易,這是因為變化太多,這些變化中有一些可以沉澱下來,形成所謂的程式設計模式,但更多的還隻是存留在每個程式員腦中的經驗。
程式設計的本質是用簡單編碼編寫成複雜的程式,編寫的過程中的變化是無窮盡的,這形成的複雜程式要能滿足使用者的需求。
簡單來說,就是用簡單編碼、規則來建構複雜程式。從簡單到複雜其中有巨大的鴻溝,這種鴻溝很難從書本上得到,往往需要經過多年的積累才能在其中行走自如。