程式設計師的本質

伯樂線上讀者發表於2011-05-18

Computers are useless. They can only give you answers. – Picasso

計算機沒有什麼作用。他們只能告訴你答案。——畢加索

很多人(包括我岳母)認為計算機變得如此智慧,所以在不久的未來將不再需要程式設計師。另外一些人認為程式設計師是天才,他們在電腦前能不斷地解決複雜的數學難題。甚至不少程式設計師對他們是做什麼的都沒有清晰的概念。

在這篇文章中,我想給不知情的人解釋一下程式設計師到底是做什麼的:

程式設計師是將人類想法翻譯成計算機語言的譯者。

他們是兩種世界之間的紐帶。你認為維護這個紐帶很容易嗎?

 

人類世界的背景

The problem with people is that they’re only human. – Bill Watterson

人類的問題是,他們只是人而已。——比爾·沃特森

人類是生物進化的產物,並且擁有獨特而寶貴的器官——大腦,它能為程式設計師提供想法。大腦有組合複雜的新大腦皮層(對人類而言是獨特的),還有從哺乳動物和爬行動物繼承的舊結構。舊的大腦結構主要負責生殖(性)和生存(尋找食物或者躲避危險)。新大腦皮層進化成能夠更好地支援這些功能,但是,它開始產生奇怪的副作用——意識、思考和好奇心。幸虧這些副作用的影響,人類產生了文明並在數千年後發明了計算機。

一些人相信經過數千年的發展,人類應該變成完全沉悶的、理性的、可預測的生物,但是這並沒有發生。人類舊的大腦結構、複雜的心理和社會行為往往使人們不理性,不可預測並帶有欺騙性。並且,人類有糟糕的記憶力、強烈的情感和個人興趣。但是,程式設計師沒法選擇與更理性的物種工作,他們不得不與人類共事並且把人類的想法翻譯成計算機語言。

計算機世界背景

Part of the inhumanity of the computer is that, once it is competently programmed and working smoothly, it is completely honest. – Isaac Asimov
計算機非人性的一部分表現是,一旦完成編譯並且順利執行,它將忠實地完成工作。——艾薩克·阿西莫夫

計算機是人類文明的最佳發明。它由CPU、主機板、記憶體、硬碟驅動器、顯示器和其他部分構成。計算機將我們的文明推入一個新的水平,使我們的生活更有意義並充滿樂趣,還彌補了我們大腦的缺陷。很可能計算機比人類更聰明。(不過,我有點關心如果這成為現實後,計算機還需要人類程式設計師嗎?)

現代計算機具有完全邏輯性、直接性和順從性。如果你知道它應該做什麼並且知道如何命令它,那麼和計算機一起工作是快樂的。唯一的問題是,計算機只會做你告訴它去做的。因此,你應該有清晰的思路並且在見你的上司或客戶時保證計算機不出岔子。

在人類和計算機之間的翻譯

翻譯中會遇到三個主要的挑戰:

1. 語言歧義。人類語言是模糊、複雜並且雙關的,例如:“這個程式不能提供良好的使用者體驗”。文化、背景和上下文語境都會對溝通和含義造成影響。與之相反,所有計算機語言都是準確、直接的,與上下文無關。

2. 細節層次。人類的溝通是籠統而不帶有過多細節的,例如:“我想讓這該死的程式執行起來”。這樣可以節省時間與精力,但由於缺少詳細資訊,會產生兩個比較大的問題——誤解和不確定性。而計算機需要所有細節——每件事都要說清楚。

3. 思維模式。人類習慣於思考需求、結果與解決方案之間的關係,例如:“這份報告應該在2秒內執行,而不是2個小時”。然而,計算機需要演算法——按照步驟去達到想要得到的結果。

為了寫出優秀的軟體,程式設計師們必須克服這些困難,理解人們的想法並將之轉換成計算機語言。

一名優秀程式設計師所具備的能力

我們可以看到,一名優秀程式設計師應該具備應付兩個不同世界的兩套技能。

理解人類的需求並提出解決方案:

1. 溝通——與人建立聯絡的能力,能夠同他人親密的交談,並有勇氣去嘗試分享自己的觀點。

2. 意圖——從談話中提取有用的資訊,理解並使之有意義。

3. 邏輯——為不懂讓步的計算機整理、剔除那些人類思想中含糊而有爭議的內容。

4. 創造力——挖掘、轉變人類的想法,從而建立優秀的解決方案。

5. 構思——利用人類友好的介面和便捷的互動性來包裝程式設計思想。

6. 大局觀——清楚解決方案是如何適應全世界的使用者、企業以及其他,從而使你的程式更有用。

 

告訴計算機該做什麼,並建立解決方案:

1. 邏輯(再次強調)——把程式設計師的想法組織整理成有凝聚力的軟體思想和計算機指令

2. 技術——發現並理解科技黑箱(對於99%的人來說是黑箱)。

3. 程式語言——學習美觀的、富有邏輯的、清晰明瞭的語言,從而把程式設計師的想法提供給電腦。

4. 演算法——精通讓計算機完成任務最高效的方法。

5. 建模——在軟體程式碼中建立抽象和模型,從而掌握並操控想法。

6. 實踐(比如程式碼重構、單元測試、持續整合)——週期性活動,以保持系統可靠、健康與可改變。(關於程式碼重構,可參見伯樂線上部落格《明星軟體工程師的10種特質》這篇文章中的第3點。)

 

面向人類和麵向硬體物件/系統的程式設計師有很大不同。

不與人溝通的程式設計師不是好程式設計師。一個優秀的解決方案需要計算機世界與人類世界的雙重技能。只有連線起兩個世界,才能成為一個真正的優秀程式設計師。

相關文章