編程:思考還是打字

Jim Bird是一位經驗豐富的軟件開發經理、項目經理與CTO,專注於軟件開發與維護、軟件質量與安全等領域中疑難問題的解決。在過去的15年間,Jim曾管理過團隊建設並主導過高性能的財務系統的建設。他的主要興趣在於如何提升小團隊的效率以構建真正的軟件:高質量、安全、可靠、高性能及適應性強。近日,Jim撰寫了一篇博文,談到了編程與思考及打字之間的關係。編程與思考關聯性更強抑或僅僅只是一些打字動作而已呢?在這篇博文中,Jim給出了自己的答案。

Ward Cunningham曾在“The Pragmatic Programmer”一書的序言中說過“如果沒有經過深入的思考,那麼你會認爲編程只不過是使用一種編程語言輸入一些語句而已”。

軟件開發涉及到很多工作,如設計、解決問題、學習最優的新算法、學習新語言、將亂糟糟的代碼重構爲緊湊且優雅的代碼,這些工作都需要深入的思考才行。

在嘗試做一些之前沒有做過的事情時,甚至其他人也沒有做過,或者是之前曾經做過,不過要確保這次做的時候不會再犯與之前相同的錯誤,那麼你需要花時間想出更好的方式。有時你需要理解別人編寫的代碼,這樣才能對代碼做出修改,還有些時候你會尋找代碼中隱藏很深的Bug。所有這些工作都需要花費大量的時間,不過最後的結果卻是你可能並沒有編寫太多的代碼來表現這一段時間的工作。

開發中還涉及到其他一些類型的工作,這些工作需要輸入很多代碼,卻不需要過多的思考。在清楚了做什麼以及如何做之後,你需要編寫大量的代碼來完成工作。也許之前曾經編寫過這樣的代碼,不過還要再編寫一次,這可能是一段腳本、一個界面、一個報表。也許大多數思考工作已經由別人幫你做了:準備好了線框圖、明確告訴你應用的感官與流程、詳細列出了API的細節信息,這時你要做的只是敲代碼,並盡力保證別犯太多錯誤。

調試過程就是思考過程。修復Bug、測試Bug修復並將結果發佈出去幾乎就是個打字的工作。早期的設計與開發、技術調研與架構設計需要深入的思考。製作第3個、第4個、甚至是第100個界面或是報表就是個打字的工作。UX設計與原型製作需要深入的思考,而編寫CRUD和配置信息則是個打字的活。追逐移動應用最新、最酷的想法需要深入的思考,而完成應用則只是個打字的工作。解決常見的業務問題需要編寫很多代碼,而通過軟件優化業務流程則需要非常深入的思考。

有些人的工作需要大量的思考,還有些人則只是敲敲代碼而已。其實這兩種人從事的是非常不同的工作,需要採取截然不同的方式進行管理。

有時編程就是打字

Jeff Atwood在“Programming Horror”這篇文章中曾說過“我們首先是個打字員,其次纔是程序員”。

很多業務應用本質上都是很膚淺的,充斥着大量的數據庫表和文件、大量的數據元素、大量的CRUD界面、大量的報表、大量的集成、大量的映射,這導致運維工作變得比較困難。長長的功能需求列表,大量的問題需要回答才能保證每個人都能理解需求,需要記住大量的細節信息並追蹤這些信息。銀行、保險、政務、會計、財務報表與賬單、庫存管理與ERP系統、CRM系統、辦公應用,諸如此類;還有很多Web門戶和在線商店都是如此。

你是要建造一個房子、一座橋還是一個商場呢?這類大問題的解決代價也很高昂,需要編寫大量的代碼才行。不過這些代碼很有可能之前已經編寫過多次了,這些工作更多的是使用熟悉的模式解決熟悉的問題,然後證明所採用的工具與方式是正確可行的。

思考、思考、思考

其他工作,諸如設計遊戲引擎或是交易算法、物流與在線風險管理、優化實時控制系統都需要大量的思考,相比之下,打字的工作量倒沒有那麼大了。這些系統都具有嚴苛的非技術需求(可伸縮性、實時的性能、可靠性、數據完整性及精確性等)與複雜的邏輯,不過他們都關注於解決一類問題。有一些聰明人能夠勝任這些問題,並找到問題的解決方案。雖然如此,還是有一些編碼工作需要做,不過核心工作的代碼量通常都不是很大,

這正是軟件的魔力之所在,成功系統的核心都是一些專利算法和經過深思熟慮的設計。這類工作需要做很多研究並開發大量的原型,具備問題解決能力和豐富的領域知識。

打字與思考是不同類型的工作

需要編寫大量的代碼還是深入的思考決定了團隊需要多少成員,這也改變了人們的工作方式以及你的管理方式。編碼工作可以外包出去,思考工作卻絕不行。你得認識到編碼可以解決哪些問題,不能解決哪些問題,當思考轉變爲編碼時需要多少工作量。

思考工作應該由緊密配合的專家小團隊來完成,或是由一個非常聰明的成員獨立完成。在設計架構或是解決難題時,你不需要很多人蔘與。解決問題的人會沉浸在問題域中,這是很有效的方式。

思考與打字

思考與打字是軟件開發中的兩個重要組成部分。

“Programming is Not Just Typing”這篇文章中,Brendan Enrick談到了結對編程的好處,因爲這會促使人們在打字的同時又在思考:

  • 兩個人都在思考,但思考的卻是不同的事情。一個開發者拿着鍵盤,腦子裏想着他正在編寫的代碼,在短時間內,他的打字速度比較重要。
  • 結對的另一個開發者全力思考着。他並不關心編程語言的語法,因爲這是另一個人的事情。他要確保自己的搭檔使用正確且高效的方式完成工作。

成爲一名優秀的開發者要比一名打字員困難得多,他需要學習很多知識:掌握所用的編程語言、瞭解相關工具的使用方式、知道如何在代碼間導航、知道如何編寫更好的代碼,同時打字速度還要快,這些都是成爲一名成功的開發者所要掌握的東西。不要忽略打字的重要性,同時也不要讓打字干擾到自己的正常思考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章