編程思維
原文 http://blog.sina.com.cn/s/blog_493a84550102vd0s.html
在前面的文章里面有不少談到通用性思維,分析和解決問題思維,SOA思想,面向對象思維等方面的文章。今天在知乎看到一個問題,既編程思維的本質究竟是什么?當看到這個問題的時候才發現其實我們確實很少去談論真正的編程思維。
談編程不可避免的要談到編程語言,而編程語言之所以出現,其最終的目的仍然是提供一種抽象方法來解決現實中的問題,問題本身的復雜程度往往取決 于抽象的種類和質量。從匯編語言的出現解決了最初的抽象,而類似c或fortran語言出現則可以看做是對匯編語言的進一步抽象。這一步抽象的完成其實是 很重要的一個進步,既我們在解決問題的時候不再需要關系復雜的機器模型或機器碼,而是可以更多的關注問題和解決方案本身。
在這個階段,從編程本身來說最核心的還是算法和數據結構。這也是任何程序最重要的兩個基本要素。既把問題域本身涉及到的數據映射到合適的數據結 構,把通過程序解決問題的過程映射為具體的算法邏輯。那么編程實際的難點在哪?不是算法本身或數據結構本身,而是當你拿到問題域的時候知道如何理解和分解 問題,并將其映射到最適合的算法或數據結構上。這個映射其實本身不是程序解決的問題,還是人腦在思維,程序本身僅僅是在實現自動化的過程。
那么程序在算法實現過程中最基本的是什么?我們看不同的程序片段可以看到的還是if/else,或者for/while,然后才是數據或數據類 型定義。而前者即寫任何一個程序中最重要的控制邏輯。那么編程里難的實際上不是控制語句本身,而是在把問題域分解后知道如何理解判斷邏輯,如何將問題域中 重復的東西抽象為循環,如何從問題域中抽象出數據結構。一個人編程能力本身的好壞,或者說編程思維能力,重點其實是體現在這種映射能力,也可以稱這種映射 能力為數學建模能力。舉個例子來說,如果一個問題你已經知道了可以映射到構建二叉樹,然后通過遍歷的方式來解決了,那么可以說然后一個掌握了語言語法的人 都可以寫出程序來。那么實際編程思維或能力的強弱則在于前面談到的映射和建模。
面向對象思想和面向對象編程語言的出現,可以說也是編程思維本身的第二次重大提升。既原有的編程語言可以看到我們關注更多的已經是抽象后的解決 方案,而面向對象的編程語言則首先關注的是通過對象和類,通過繼承,通過接口定義等首先對現實世界進行很好的抽象描述,其次才是如何去解決問題。現實世界 中所有的一切都是對象,而面向對象語言中的類本身就是對現實世界中對象的很好的抽象。
對于面向對象的核心特征談的比較多的是封裝,繼承和多態。這些可能比較偏技術詞匯,那么再簡單點來說面向對象編程思維其核心則是找到問題域中的 對象,將其抽象為類,識別類應該有的屬性和方法特征,同時去理清類和類之間的關聯和交互關系,將問題本身的解決過程映射到類和類之間的方法交互上。如果從 這個意義上來說,好像也不是很復雜,那么實際面向對象編程的難點實際在為了保持代碼足夠的健壯性,可維護性,可擴展性而做出的各種抽象,包括接口的提取和 組合,控制或邏輯類的增加等,這些本質已經轉換到技術域類本身。
除了上面談到的,再談下其它的一些內容。編程里面有一個重要的思想即是復用,從最簡單的函數,到模版庫,類庫,再到更上層的公共組件等,都在體 現復用的思想,而復用本身的目的則主要是提升開發效率,提升可維護性和代碼的可讀性等。復用可以理解為編程過程中的編程思想更加恰當。
編程的思想是自動化,不要簡單的理解為編程語言能夠幫助你解決建模和映射的難題,編程的自動化更多的還是體現在機器可以自動化的進行大量計算和 運算,而這個運算是通過我們的程序進行的。程序中體現的一個重點我更喜歡把它理解為循環,從抽象中去發現和發覺一種可自動化的循環,這種循環的處理正是程 序的強項。任何人都應該有這種自動化的編程思維,即懶人思維,重復的事情一定不要自己手工重復完成。