《黑客與畫家》讀書筆記

《黑客與畫家》讀書筆記
作者:【美】格雷厄姆

保羅·格雷厄姆其人其事

Y Combinator (Y運算子,簡稱YC)

YC在每年的一月和六月舉辦兩次訓練營,每次為期三個月。通常每次大概有500個申請者,他們從中挑出20個項目 。每個項目將得到1.1萬美元的啟動資金,外加每個項目成員3000美元的生活津貼,交換條件是YC將拿走該項目5%的股份 。如果項目成功,5%的股份將非常值錢。

保羅·格雷厄姆有一套完整的創業哲學,他的創業公式是:
(1)搭建原型
(2)上線運營(別管bug)
(3)收集反饋
(4)調整產品
(5)成長壯大

首先,他鼓勵創業公司快速發布產品,因為這樣可以盡早知道一個創意是否可行。其次,他認為一定要特別關注用戶需要什么,這樣才有辦法將一個壞項目轉變成好項目。

比起那些令人叫好的創意,格雷厄姆更看重創始人的素質。他說:“我們從一開始就認識到,創始人本身比他的創意更重要。”他還認為,小團隊更容易成功,創始成員總數最好不要超過三個人。其中一個原因是,創始人越多,股權越不容易平等分配,容易造成內耗。

譯者序

20世紀60年代初,麻省理工學院有一個學生團體叫做“鐵路模型技術俱樂部”(Tech Model Railroad Club,簡稱TMRC),他們把難題的解決方法稱為hack。
在這里,hack作為名詞有兩個意思,既可以指很巧妙或很便捷的解決方法,也可以指比較笨拙、不那么優雅的解決方法。兩者都能稱為hack,不同的是,前者是漂亮的解決方法(cool hack或neat hack),后者是丑陋的解決方法(ugly hack或quick hack)。

完成這種hack的過程就被稱為hacking,而從事hacking的人就是hacker,也就是黑客。

hack還有一個引申義,指對某個程序或設備進行修改,使其完成原來不可用的功能(或者禁止外部使用者接觸到的功能)。在這種意義上,hacking可以與盜竊信息、信用卡欺詐或其他計算機犯罪聯系在一起,這也是后來“黑客”被當作計算機入侵者的稱呼的原因。

自由軟件基金會創始人理查德·斯托爾曼說:“出于興趣而解決某個難題,不管它有沒有用,這就是黑客。”

惡意入侵計算機系統的人應該被稱為cracker(入侵者)

本書的一些章節中作者談論的都是計算機行業的專業問題,但是他又希望讓普通讀者看懂,試圖用口語化、生活化的語言解釋專業概念,我個人感覺效果不太理想,反而使得行文稍顯冗余和模糊,這一點提醒讀者注意。

前言

我們生活中的一切,都正在成為計算機。

旅游網站Orbitz成功打入了競爭激烈的網絡訂房訂票市場。該市場原先被兩大巨頭主宰,一個是微軟公司,另一個是擁有數十年電子預定服務經驗的Sabre。Orbitz是怎么從它們手中搶到市場的?最主要的原因就是它使用了一種更好的編程語言。

Slashdot 它是黑客世界的《紐約時報》

雖然黑客從外表看上去一般都是呆呆的,但是他們的大腦內部卻是一個有趣得讓你吃驚的地方。

1 為什么書呆子不受歡迎

文藝復興時期的代表人物阿爾伯蒂有一句名言:“任何一種藝術,不管是否重要,如果你想要在該領域出類拔萃,就必須全身心投入。”

在任何社會等級制度中,那些對自己沒自信的人就會通過虐待他們眼中的下等人來突顯自己的身份。

但是我認為,孩子們欺負書呆子的主要原因也與追求“受歡迎”的心理有關。怎樣才能讓自己更受歡迎?個人魅力只是很小的一方面,你應該更多地考慮如何結盟。秘訣就是不停地設法使自己與其他受歡迎的人變得關系更密切。沒有什么比一個共同的敵人更能使得人們團結起來了。

當你所做的事情能產生真實的效果,那就不僅僅是好玩而已了,發現正確的答案就開始變得重要了,這正是書呆子的優勢所在。

青少年都不喜歡孤獨一人,即使具有叛逆心理的青少年也是如此。

2 黑客與畫家

我現在認為,大學里教給我的編程方法都是錯的。

你把整個程序想清楚的時間點,應該是在編寫代碼的同時,而不是在編寫代碼之前

編程語言首要的特性應該是允許動態擴展(malleable)。編程語言是用來幫助思考程序的,而不是用來表達你已經想好的程序。

靜態類型(static typing)

等我來到雅虎以后,發現在他們看來,“黑客”的工作就是用軟件實現某個功能,而不是設計軟件。在那里,程序員被當作技工,職責就是將產品經理的“構想”(如果這個詞是這么用的話)翻譯成代碼。

真正競爭軟件設計的戰場是新興領域的市場

我們面試程序員的時候,主要關注的事情就是業余時間他們寫了什么軟件。因為如果你不愛一件事,你不可能把它做得真正優秀,要是你很熱愛編程,你就不可避免地會開發你自己的項目。

也許對于黑客來說,采取像畫家這樣的做法很有好處:應該定期地從頭開始,而不要長年累月地在一個項目上不斷工作,并且試圖把所有的最新想法都以修訂版的形式包括進去。

你不能盼望先有一個完美的規格設計,然后再動手編程,這樣想是不現實的。如果你預先承認規格設計是不完美的,在編程的時候,就可以根據需要當場修改規格,最終會有一個更好的結果。
(大公司的內部結構,使得它們很難這樣做。這是又一個創業公司占優之處。)

如果你查看優秀軟件的內部,就會發現那些預料中沒有人會看見的部分也是優美的。

正確的合作方法是將項目分割成嚴格定義的模塊,每一個模塊由一個人明確負責。模塊與模塊之間的接口經過精心設計,如果可能的話,最好把文檔說明寫得像編程語言規范那樣清晰。

就像繪畫作品一樣,大多數軟件是為人類用戶準備的。所以,黑客必須像畫家一樣,時刻考慮到用戶的人性需要,這樣才能做出偉大的產品。你必須能夠站在用戶的角度思考問題,也就是說你必須學會“換位思考”。

判斷一個人是否具備“換位思考”的能力有一個好方法,那就是看他怎樣向沒有技術背景的人解釋技術問題。

軟件的部分功能就是解釋自身。為了寫出優秀軟件,你必須假定用戶對你的軟件基本上一無所知。你要明白,用戶第一次使用你的軟件的時候,不會預先做好功課,他們沒有任何準備就開始用了,所以軟件的使用方式最好能符合用戶的直覺,別指望用戶去讀使用手冊。

源代碼也應該可以自己解釋自己。如果我只能讓別人記住一句關于編程的名言,那么這句名言就是《計算機程序的結構與解釋》一書的卷首語:
程序寫出來是給人看的,附帶能在機器上運行。

3 不能說的話

到底什么話是我們不能說的?為了找到答案,首先,我們可以看看,周圍的人因為說了什么而陷入麻煩。

第一個條件是,這些話不能說出口;第二個條件是,它們是正確的,或者看起來很可能正確,值得進一步討論。如果達不到第二個條件,大部分情況下你都不會有麻煩。

觸怒他人的言論是那些可能會有人相信的言論。我猜想,最令人暴跳如雷的言論,就是被認為說出了真相的言論。

這就是找出“不能說的話”的第一種方法:判斷言論的真偽。

除了真話以外,“不能說的話”還有一種可能。有些想法,純粹因為非常特別,而不能說出口。比如,某個話題極其富有爭議,不管是對是錯,沒有人敢在公開場合談論它。我們怎樣才能發現這種情況呢?
我們把這種不一定正確、但是極富爭議的言論稱為“異端邪說”。關注“異端邪說”,是找出“不能說的話”的第二種方法。

歷史上的每一個年代,都會給“異端邪說”貼一些標簽,目的是在人們開始思考它們是否為真之前就把它們封殺。“褻瀆神明”、“冒犯圣靈”、“異端”都是西方歷史上常見的標簽,當代的標簽則是“有傷風化”、“不得體”、“破壞國家利益”等。以前時代的標簽在今天已經不可避免地失去了殺傷力,最多只能用于諷刺。

所以,如何找出那些我們自以為正確卻會被未來人們恥笑的話?方法就是關注這些標簽!

給放射科醫生看胸部X光片,請他們判斷病人有沒有肺癌跡象。研究人員記錄了醫生檢查X光片時的眼球運動。研究發現,即使那些醫生漏掉了一個癌癥病灶,他們的目光通常也會在那個地方停留一會。這說明他們的頭腦深處已經意識到那里有問題,但是這種深層的反應沒有上升為自覺的意識。我認為,類似的思維機制存在于每個人的頭腦中,很多看似叛逆的“異端邪說”,早就“潛伏”在我們的思維深處。如果我們暫時關閉自我審查意識,它們就會第一個浮現出來。

我們可以去找那些過去被認為理所當然,如今卻被認為不可思議的事情,這是用來找出我們自己正在犯下的錯誤的第三種方法。

大多數的斗爭,不管它們實際上爭的是什么,都會以思想斗爭的形式表現出來。

思想斗爭更容易爭取支持者。不管哪一方獲勝,他們所代表的思想也就被認為獲得了勝利

我并不是說斗爭從來就與思想無關,而是要強調,不管實際上是否有思想斗爭,斗爭總是會以思想斗爭的形式表現出來。

想要做出優秀作品,你需要一個什么問題都能思考的大腦。尤其是那些似乎不應該思考的問題,你的大腦也要養成思考它們的習慣。

優秀作品往往來自于其他人忽視的想法,而最被忽視的想法就是那些被禁止的思想觀點。

智力越高的人,越愿意去思考那些驚世駭俗的思想觀點。

不僅是在科學領域,在任何有競爭的地方,只要你能看到別人看不到或不敢看的東西,你就有很大的優勢。

訓練自己去想那些不能想的事情,你獲得的好處會超過所得到的想法本身。

如果你能“遠遠地”跳出傳統思維,提出讓別人一聽就腦袋轟一聲炸開的驚人觀點,那么你就在“小小地”跳出傳統思維方面不會有任何困難。要知道,人們把后面的這種情況稱為“創新”。

一旦發現了“不能說的話”,下一步怎么辦?我的建議就是別說,至少也要挑選合適的場合再說,只打那些值得打的仗。

這時你要明白,自由思考比暢所欲言更重要。如果你感到一定要跟那些人辯個明白,絕不咽下這口氣,一定要把話說清楚,結果很可能是從此你再也無法自由理性地思考了。我認為這樣做不可取,更好的方法是在思想和言論之間劃一條明確的界線。在心里無所不想,但是不一定要說出來。我就鼓勵自己在心里默默思考那些最無法無天的想法。你的思想是一個地下組織,絕不要把那里發生的事情一股腦說給外人聽。

每個時代都有自己的忌諱,如果你觸犯它們,就算沒有坐牢,至少也會為自己惹來麻煩,干擾了正常生活。

“不能說的話”太多了,如果口無遮攔,你就沒時間做正事了。

“守口如瓶”的真正缺點在于,你從此無法享受討論帶來的好處了。討論一個觀點會產生更多的觀點,不討論就什么觀點也沒有。所以,如果可能的話,你最好找一些信得過的知己,只與他們暢所欲言、無所不談。這樣不僅可以獲得新觀點,還可以用來選擇朋友。能夠一起談論“異端邪說”并且不會因此氣急敗壞的人,就是你最應該認識的朋友。

人們喜歡討論的許多問題實際上都是很復雜的,馬上說出你的想法對你并沒有什么好處。

歷史上,荷蘭人確實長期具有相對開放的思想。幾個世紀以來,這個地勢低洼的歐洲國家一直是言論相對自由的地方。在那里,你可以放心說出其他地方不能說的話。這幫助它成為學術和工業的中心。(言論自由與這兩者緊密結合的歷史,比大多數人意識到的還要長。)

4 良好的壞習慣

黑客都用同一個詞形容
注: terrific

在我看來,一個人們擁有言論自由和行動自由的社會,往往最有可能采納最優方案,而不是采納最有權勢的人提出的方案。

應用服務供應商(Application Service Provider),簡稱ASP。

由于軟件轉移到服務器的趨勢才剛剛開始,所以我下面所寫的是對未來的憧憬。

有一種編程方法叫做“函數式編程”(functional programming),

函數式編程在學術文獻中研究得比較多,在商業軟件中用得比較少。

實現某個構思,會帶來更多的構思。

要讓軟件變得可靠,關鍵是你要全神貫注,而不是開發得很慢。

如果你親眼見到某人第一次使用你的軟件,你就會知道軟件的哪個地方最打動他。

如果某樣東西易于購買,你就會多買一點。

最好的安排就是把個人和小企業客戶放在第一位。其他的客戶該來的時候就會來。

現在,善于寫軟件的那類人更喜歡使用Linux或者FreeBSD操作系統。

互聯網做起來很辛苦,還有許多特別大的壓力,但是它們的唯一作用,就是使得創業公司成功的機會變大。

管理企業其實很簡單,只要記住兩點就可以了:做出用戶喜歡的產品,保證開支小于收入。只要做到這兩點,你就會超過大多數創業公司。

至于如何做出用戶喜歡的產品,下面是一些通用規則。從制造簡潔的產品開始著手,首先要保證你自己愿意使用。然后,迅速地做出1.0版,并且不斷加以改進,整個過程中密切傾聽用戶的反饋。用戶總是對的,但是不同的用戶要求不一樣。低端的用戶要求簡化操作和清晰易懂,高端的用戶要求你增加新功能。軟件最大的好處就是讓一切變得簡單。但是,做到這一點的方法是正確設置默認值,而不是限制用戶的選擇。如果競爭對手的產品很糟糕,你也不要自鳴得意。比較軟件的標準應該是看對手的軟件將來會有什么功能,而不是現在有什么功能。無論何時,你都要使用自己的軟件。

如果你不打算自己動手設計和開發,那就不要創業。

6 如何創造財富

真正重要的是做出人們需要的東西,而不是加入某個公司。

要致富,你需要兩樣東西:可測量性和可放大性。

可放大性,也就是說你做出的決定能夠產生巨大的效應。

有一個辦法可以發現是否存在可放大性,那就是看失敗的可能性。因為收入和風險是對稱的,所以如果有巨大的獲利可能,就必然存在巨大的失敗可能。

如果你有一個令你感到安全的工作,你是不會致富的,因為沒有危險,就幾乎等于沒有可放大性。

高科技 = 可放大性

創業公司通過發明新技術盈利,所以具備可放大性。

選擇公司要解決什么問題應該以問題的難度作為指引,而且此后的各種決策都應該以此為原則。

設置“進入壁壘”的方法之一就是申請專利。

如果你開發出來的技術是競爭對手難于復制的,那就夠了,你不需要依靠其他防御手段了。

一種很普遍的情況是,某個創業公司確實在開發一個很好的產品,但是開發時間太長了一點,結果資金都用完了,只好關門散伙。

潛在的買家會盡可能地拖延收購。收購這件事最難的地方就是讓買方真正拿出錢。大多數時候,促成買方掏錢的最好辦法不是讓買家看到有獲利的可能,而是讓他們感到失去機會的恐懼。對于買家來說,最強的收購動機就是看到競爭對手可能收購你。

次強的動機則是讓他們擔心如果現在不買你,你的高速成長將使得未來的收購耗資巨大,甚至你本身可能變成一個他們的競爭對手。

不應該收購的危險信號。排在榜首的信號中有一個就是公司由技術頑童掌控,只想解決有趣的技術問題,不考慮用戶的需要。你開辦創業公司不是單純地為了解決問題,而是為了解決那些用戶關心的問題。

做過軟件優化的人都知道,優化難點就是如何測出系統的表現。

將公司管理視同軟件優化還能幫助你避免VC擔心的另一個陷阱——開發某種產品的時間過長。現在,黑客都已經熟知這一點,并總結出一個術語“過早優化”(premature optimization)。盡快拿出1.0版,然后根據用戶的反映而不是自己的猜測進行軟件優化。

政府禁止個人積累財富實際上就是命令人民減慢工作的速度。

只要懂得藏富于民,國家就會變得強大。

7 關注貧富分化

簡單的解釋就是最好的解釋。

一個人的工作具有多少價值不是由政府決定的,而是由市場決定的。

8 防止垃圾郵件的一種方法

只要對單個詞語進行貝葉斯判斷,就能很好地過濾大部分垃圾郵件。

9 設計者的品味

好設計是簡單的設計。

保持簡單

好設計是永不過時的設計。

如果解決方法是丑陋的,那就肯定還有更好的解決方法,只是還沒有發現而已。

如果你不愿別人的答案取代你的答案,你就只好自己做出最佳答案。

好設計是解決主要問題的設計。

好設計是啟發性的設計。

好設計通常是有點趣味性的設計。

幽默感是強壯的一種表現,始終擁有幽默感就代表你對厄運一笑了之,而喪失幽默感則表示你被厄運深深傷到。

好的設計并非一定要有趣,但是很難想象完全無趣的設計會是好的設計。

好設計是艱苦的設計。

如果你工作得不艱苦,你可能正在浪費時間。

好設計是看似容易的設計。

練習的作用也許是訓練你把刻意為之的事情變成一種自覺的行為。有時,我們的訓練只是為了讓身體養成下意識的反應。

對稱有兩種:重復性對稱和遞歸性對稱。遞歸性對稱就是指子元素的重復,比如樹葉上葉脈的紋路。

在軟件中,能用遞歸解決的問題通常代表已經找到了最佳解法。

好設計是一種再設計。

先完成一個早期原型,然后提出修改計劃,最后把早期原型扔掉。

你應該培養對自己的不滿。

推動人才成批涌現的最大因素就是,讓有天賦的人聚在一起,共同解決某個難題。互相激勵比天賦更重要

好設計常常是大膽的設計。

單單是無法容忍丑陋的東西還不夠,只有對這個領域非常熟悉,你才可能發現哪些地方可以動手改進。

10 編程語言解析

Fortran、Lisp、Cobol、Basic、C、Pascal、Smalltalk、C++、Java、Perl和Python,全都是高級語言。

11 一百年后的編程語言

任何一種編程語言都可以分成兩大組成部分:基本運算符的集合(扮演公理的角色)以及除運算符以外的其他部分(原則上,這個部分可以用基本運算符表達出來)。

我認為,基本運算符是一種語言能否長期存在的最重要因素。其他因素都不是決定性的。

你仔細審視一種語言的內核,考慮哪些部分可以被摒棄,這至少也是一種很有用的訓練。在長期的職業生涯中,我發現冗余的代碼會導致更多冗余的代碼,不僅軟件如此,而且像我這樣性格懶散的人,我發現在床底下和房間的角落里這個命題也成立,一件垃圾會產生更多的垃圾。
我的判斷是,那些內核最小、最干凈的編程語言才會存在于進化的主干上。一種語言的內核設計得越小、越干凈,它的生命力就越頑強。

隨著技術的發展,每一代人都在做上一代人覺得很浪費的事情。

效率低下的軟件并不等于很爛的軟件。一種讓程序員做無用功的語言才真正稱得上很爛。浪費程序員的時間而不是浪費機器的時間才是真正的無效率。隨著計算機速度越來越快,這會變得越來越明顯。

并行計算(parallel computation)

性能分析器(profiler)

(1)一百年后的編程語言在理論上今天就能設計出來;
(2)如果今天真能設計出這樣一種語言,很可能現在就適合編程,并且能夠產生更好的結果。

12 拒絕平庸

埃里克·雷蒙德寫過一篇文章《如何成為一名黑客》(How to Become a Hacker)。文中有一部分專門談到,在他看來,如果你想當一個黑客,應該學習哪些語言。他建議從Python和Java入手,因為它們比較容易學。想當高級一點的黑客,還應該學習C和Perl。前者用來對付Unix系統,后者用來系統管理和開發CGI腳本。最后,真正非常嚴肅地把黑客作為人生目標的人,應該考慮學習Lisp:
Lisp很值得學習。你掌握它以后,會感到它給你帶來的極大啟發。這會大大提高你的編程水平,使你成為一個更好的程序員。盡管在實際工作中極少會用到Lisp。

軟件業是競爭非常激烈的行業,而且容易出現壟斷。在不考慮其他情況的條件下,某家公司的軟件更快更好用,就會把競爭者趕出這個市場。一旦你開始創業,你就會更深切地感受到這一點。一般情況是,創業公司要么贏得一切,要么徹底失敗。你要么成為富翁,要么一無所獲。創業的時候,如果你選擇了錯誤的技術,競爭對手就會一舉打敗你。

選擇使用哪一種技術的時候,你不能考慮別人的做法,只能考慮什么樣的技術能最好地完成工作。

大公司可以互相模仿,但是創業公司就不行。

如果開發只在自己服務器上運行的軟件,這意味著你想用什么語言就能用什么語言。

在Viaweb創業期間我從來沒有公開談論過Lisp語言。我們對新聞媒體閉口不談Lisp,如果你在我們的網站上搜索Lisp,只會發現我在個人介紹中提到過兩次,那是我寫的兩本關于Lisp的書。這是故意的,創業公司對競爭對手應該越保密越好。

閉包

Lisp代碼由Lisp數據對象構成。其他語言的源代碼一般由字符組成,字符串是主要數據類型之一,但是Lisp語言不完全是這樣。經過解析器處理之后,Lisp代碼就變成了你可以遍歷的數據結構。
如果你理解編譯器的工作原理,那么事實是,與其說Lisp有一種很奇特的語法,還不如說它根本沒有語法。一般的源代碼程序經過編譯器解析會生成解析樹。Lisp的奇特之處就在于,你可以完全寫出程序,控制這種解析樹,進行任意的存取操作。Lisp的這種程序就叫做宏,它們可以用來生成其他程序。

Ansi Common Lisp
注: 作者的另一本書

編程語言不一樣,與其說它是技術,還不如說是程序員的思考模式。

如果你為創業公司工作,那么這里有一個評估競爭對手的妙招——關注他們的招聘職位。他們網站上的其他內容無非是一些陳腐的照片和夸夸其談的文字,但是招聘職位卻不得不寫得很明確,反映出他們到底想干什么,否則就會引來一大批不合適的求職者。

最不用擔心的競爭對手就是那些要求應聘者具有Oracle數據庫經驗的公司,你永遠不必擔心他們。如果是招聘C++或Java程序員的公司,對你也不會構成威脅。如果他們招聘Perl或Python程序員,就稍微有點威脅了。至少這聽起來像一家技術公司,并且由黑客控制。如果我有幸見到一家招聘Lisp黑客的公司,就會真的感到如臨大敵。

13 書呆子的復仇

快速排序(Quicksort)算法

這種算法是1960年提出的,至今仍然是最快的通用排序方法。

如果你創業的話,千萬不要為了取悅風險投資商或潛在并購方而設計你的產品。讓用戶感到滿意才是你的設計方向。只要贏得用戶,其他事情就會接踵而來。如果沒有用戶,誰會關心你選擇的“正統”技術是多么令人放心。

總的來說,你的經理其實不關心公司是否真的能獲得成功,他真正關心的是不承擔決策失敗的責任。所以對他個人來說,最安全的做法就是跟隨大多數人的選擇。

第一,不同語言的編程能力不一樣。
第二,大多數經理故意忽視第一點。

14 夢寐以求的編程語言

腳本語言(scripting language)

布賴恩·柯尼漢和丹尼斯·里奇合寫的《C程序設計語言》(C Programming Language)

開發大型程序的另一個方法就是從一次性程序開始,然后不斷地改進。

函數庫的使用應該符合程序員的直覺,讓他可以猜得出哪個函數能滿足自己的需要。

大多數人接觸新事物時都學會了使用類似的過濾機制。甚至有時要聽到別人提起十遍以上他們才會留意。這樣做完全是合理的,因為大多數的熱門新商品事后被證明都是浪費時間的噱頭,沒多久就消失得無影無蹤。

所以,發明新事物的人必須有耐心,要常年累月不斷地做市場推廣,直到人們開始接受這種發明。

簡單重復同一個信息就能解決這個問題。你只需要不停地重復同一句話,最終人們將會開始傾聽。人們真正注意到你的時候,不是第一眼看到你站在那里,而是發現過了這么久你居然還在那里。

“最好的文字來自不停的修改”。所有優秀作家都知道這一點,它對軟件開發也適用。設計一樣東西,最重要的一點就是要經常“再設計”

15 設計與研究

假定你正在設計一種工具,你可以把目標用戶定為初學者,也可以定為專家級用戶。一種人眼里的優秀設計可能在另一種人眼里卻是糟糕無比。這里的重點是你必須選出某些人作為你的目標用戶。

我覺得,除非設定目標用戶,否則一種設計的好壞根本無從談起。

如果目標用戶群體涵蓋了設計師本人,那么最有可能誕生優秀設計。

如果目標用戶與你本人差別很大,你往往會假定目標用戶的需求比你本人的需求更簡單,而不是更復雜。低估用戶(即使出于善意)一般來說總是會讓設計師出錯。

如果你覺得自己在為傻瓜設計產品,那么很可能不僅無法設計出優秀產品,而且就連傻瓜也不喜歡你的設計。

在軟件領域,貼近用戶的設計思想被歸納為“弱即是強”(Worse is Better)模式

那就是如果你正在設計某種新東西,就應該盡快拿出原型,聽取用戶的意見。

開發軟件的時候,我有一條規則:任何時候,代碼都必須能夠運行。如果你正在寫的代碼一個小時之后就可以看到運行結果,這好比讓你看到不遠處就是唾手可得的獎勵,你因此會受到激勵和鼓舞。

術語解釋

抽象(abstract) 隱藏細節。編程語言越抽象,你寫出程序所需的運算步驟就越少,每一步的功能就越強。

算法(algorithm) 完成任務的方法。菜譜也算是算法。

字母數字式字符(alphanumeric character) 26個英文字母和10個阿拉伯數字的總稱。

數組(array) 一種存儲數據的方式,教材中又稱矩陣(matrix),即一個個用數字編號的存儲空間,排列成一個n維的集合。

應用服務提供商(ASP,Application Service Provider) 這種軟件公司允許用戶通過網絡使用存放在服務器上的軟件,而不是采用傳統的方式讓用戶在自己的電腦上安裝軟件后使用。

貝葉斯定理(Bayesian) 一種統計推斷的方法,又稱貝葉斯算法。

二進制(binary) 如果這個詞前面有冠詞(比如a binary),指的是軟件的目標碼。如果沒有冠詞,指的是采用二進制(而不是日常使用的十進制)作為表示數字的方法

位操作(bit manipulation) 對某個內存區域的一些簡單轉換操作,比如在屏幕上移動窗口就可以通過位操作實現。

代碼膨脹(bloatcode) 程序過于冗長,大大超過合理的長度。

塊結構(block-structured)

Blub困境(Blub Paradox) 程序員的思想往往會受到自己正在使用的語言的束縛,不相信還存在更強大的語言。

自下而上編程法(bottom-up programming) 一種編程的風格,與早期的“自上而下編程法”(top-down)正好相反,“自上而下編程法”要求你把編程任務分解成一個個更小的單元,“自下而上編程法”要求你先開發最底下的層,然后用底層所定義的“語言”開發上一層,這樣直到最高層。這兩種編程法可以結合使用。

限制(bound) 受到某種資源的約束,比如I/O限制、內存限制、CPU限制等。

跳轉(branch) 機器語言的goto命令。

布魯克斯假說(Brooks’s Hypothesis) 程序員一天寫出的代碼行數是一個常量,與他使用什么語言無關。

緩沖區(buffer) 一個內存區域,用來保存程序需要的輸入數據,或者將程序的輸出數據累積起來,到一定數量后再輸出。

緩沖區溢出攻擊(buffer overflow attack)

字節碼(byte code) 類似于機器語言的計算機語言,但是不局限于特定的計算機。由于字節碼與機器語言很類似,所以很容易開發出字節碼解釋器,讓它把字節碼轉換成相應的機器語言命令。

CGI腳本(Common Gateway Interface script,通用網關接口腳本) 當網絡服務器需要進行某種運算(比如數據庫搜索)而不是直接傳輸現有文件時所運行的一種程序。CGI腳本的主要缺點是,每次運行只能生成一個頁面,無法像桌面軟件那樣將數據保存在內存中從而實現與用戶的不間斷對話。

校驗和(checksum) 一種用特征值驗證文件的方法。特征值通過對文件的所有信息進行某種計算而產生。

循環定義(circular definition) 參見“無限循環”(infinite loop)。

類(class) 面向對象編程語言的一種數據類型。

點擊軌跡(click trail) 同一個用戶向網絡服務器發出的一系列HTTP請求,基本等同于他瀏覽的網頁順序。

托管(collocated) 通常指放在ISP處。

注釋(comment)

Common Lisp Lisp語言的一種流行的方言

編譯器(compiler)

“解釋器”(interpreter)

復雜度(complexity) 算法的“時間復雜性”(time complexity)指的是,當輸入的數據量不斷增加時,計算機完成這種算法所消耗的時間。比如,假定你要在一間屋子中尋找某一個人,方法是看每個人的臉,那么找到這個人所需要的時間與屋中的人數成正比。這樣一種算法就叫做O(n),意為所需的時間與n成比例(n代表數據量)。現在進一步假設你要在屋子中尋找看上去長得很像的兩兄弟(或兩姐妹),那么你所需要的時間可能與人數的平方成正比,因為你也許不得不每兩個人就比較一次,而所有可能的兩人組合是人數的平方,算法就是O(n︿2)。

條件結構(conditional)

基于內容的過濾(content-based filtering) 根據電子郵件的內容而不是它的外部特征(比如發信地址)進行過濾。

CPU(中央處理器,Central Processing Unit)
處理器現在廣泛用于各種各樣的設備,比如顯卡和硬盤。

崩潰(crash) bug引起的操作系統或應用程序停止正常工作。用在硬盤上面也指硬件失靈。

冗余(cruft)

周期(cycle) 執行一個機器指令的最少時間。一臺內部時鐘頻率1 GHz的計算機可以在1秒內完成10億個周期,即每秒執行10億條機器指令。

DARPA(美國國防部高級研究計劃局,Defense Advanced Research Projects Agency) 一個贊助美國國內很多計算機研究項目的機構。

數據結構(data structure) 一種由多個部分組成的數據格式。比如,一對數據可以組成一個數據結構,表示圖形上的一個點。

數據類型(data type) 編程語言處理的數據種類。

動態類型(dynamic typing)
靜態類型(static typing)

排錯(debugging)

聲明(declaration) 程序的要素之一,描述的成分多于命令的成分。最常見的聲明是變量類型聲明,用于說明一個變量包含哪一類數據。

廢棄(deprecated) 原來屬于標準的某種做法,現在它的設計者后悔做出了這樣的設計。

設計戰爭(design war) 一種競爭規則,只要是最好的設計就能獲勝,而不是其他因素(比如廣告宣傳、銷售渠道的控制)主導競爭。

硬件驅動程序(device driver) 操作系統的一部分,使操作系統可以與硬件設備(比如打印機)對話。

diff 對某件東西的兩個版本進行客觀的、精細的比較。這個詞源自Unix操作系統的一個用來比較文件的應用程序。

嵌入式語言(embedded language) 在一種語言內部定義的另一種語言,常用于解決某些特殊的問題。比如,如果你定義了一系列操作圖像的命令,你就可以把它們視為一種操作圖像的語言,參見“自下而上編程法”(bottom-up programming)。

最終用戶(end user) 需求很簡單的用戶的婉轉說法。

編程環境(environment) 幫助編程的軟件,比如編輯器和性能分析器。

表達式(expression)

字段(field) 一種數據結構的組成部分。

FreeBSD 一種Unix的開源版本。

自由軟件(freeware)

在一些語言中函數也是一種數據類型。

垃圾回收機制(garbage collection) 程序自動判斷哪些內存不再需要,并予以回收,而不是要求程序員在使用完畢后明確聲明

goto 將程序的運行順序從一部分改向另一部分的命令。goto與子程序調用最大的不同在于它使用后沒有辦法再回到原處。所以如果用了goto,程序往往會亂成一團。現在已經很少使用這個命令了。

格林斯潘第十定律(Greenspun’s Tenth Rule) “任何C或Fortran程序復雜到一定程度之后,都會包含一個臨時開發的、只有一半功能的、不完全符合規格的、到處都是bug的、運行速度很慢的Common Lisp實現。”

破解(hack) 一種破壞規則的解決方法,可能有益也可能有害。

黑客(hacker)

散列表(hash table) 一種類似數據庫的數據結構,存儲在里面的每一段數據都有一個對應的鍵,使用時只要按照鍵就可以取出對應的數據。

郵件頭(header) 電子郵件最前面的那部分,包含了郵件本身的相關信息。普通用戶只會看到發信人(From)、收信人(To)、日期(Date)、主題(Subject)、抄送(Cc)等信息,但是還包含其他信息(比如郵件的傳送路徑)。

啟發(heuristic) 從經驗法則中得到靈感。

縮進(indented)

解釋器(interpreter)

內循環(inner loop) 一個程序中執行次數最頻繁的部分。

記錄儀(instrument) 修改程序使得它的每一步結果都得到記錄,這樣的話,如果程序運行速度緩慢或者占用太多內存,你就能找到原因。

蹩腳(kludge) 水平很差的破解。(這個詞與stooge“丑角”是押韻的!)

雛形創業公司(larval startup) 創業公司最早期、還未成形的階段。此時,潛在的創業者還不確定是否應該成立一家公司創業。

歷史遺留軟件(legacy software) 這些軟件雖然還有人使用,但是并不符合使用者的要求。他們繼續使用它們只是因為無錢購買新軟件,或者不敢改變現狀。

閉包(lexical closure) 一個函數,通過它可以引用由包含這個函數的代碼所定義的變量。

LFSP(聰明人的語言,Language For Smart People) 設計目標主要是追求功能強大而不是保證安全性的編程語言。

函數庫(library)

Linux Unix操作系統的一個開源版本。講究一點的話,它應該被稱為GNU Linux,因為它的內核部分是由Linus Torvalds編寫的,但是其他更大量的代碼來自Richard Stallman的GNU項目。

列表(list) 一連串的數據塊,各個數據塊的類型通常是不一樣的。不同的列表可以像火車車廂一樣連接在一起,組成更大的列表。

字面量(literal representation) 一種直接在高級語言中表示數據的方法。

機器指令(machine instruction)
機器語言(machine language)

宏(macro) 一個能夠生成其他程序的程序。

大型機(mainframe) 根據20世紀六七十年代的設計而建造的大型計算機。

對數學家的妒忌(math envy) 擔心自己不如數學家聰明。這種焦慮的一個重要體現就是讓自己的工作成果帶有一種完全不必要的數學味。

元循環(metacircular) 當一種語言的解釋器用這種語言本身開發時,就會出現這種情況。與其說這是為了做出這種語言的一種實現,還不如說這是描述語言的一種技巧。

方法(method) 面向對象編程中充當某個類的屬性的一個子程序。

模塊(module) 一組子程序和變量,它們可以被視為是一個整體。通常情況下,模塊外部的代碼只能訪問模塊內部一部分專門對外公開的子程序和變量。

摩爾定律(Moore’s Law) 摩爾定律的正式版本是指,一塊芯片上的晶體管數量每兩年就會翻一番。但是,大多數人提到這個術語時,指的卻是處理器的運算速度每18個月就會翻一番。很多人認為摩爾定律更像是商業計劃,而不是產業發展的規律,畢竟它的提出者Gordon Moore是英特爾公司的創始人之一。

數字密集運算(number crunching) 對巨量的數值資料進行直接處理。

目標碼(object code) 編譯器產生的機器語言。

OO(面向對象,object-oriented) 一種組織程序的方式。假定不同的類代表不同類型的數據,那么針對這些數據執行某種特定任務的代碼,可以根據數據的不同被分別寫進不同的類,成為這些類的方法。

“奧卡姆剃刀”原則(Occam’ Razor) 簡單的解釋就是較好的解釋。

開放源代碼(open source)

正交的(orthogonal) 彼此獨立、能夠以多種方式組合在一起的一組東西。經典的樂高積木就比普通的塑料模型玩具更有正交性。

優化(optimization) 調整程序,使得它的效率更高。

帕金森定律(Parkinson’s Law) 完成一項任務所需要的資源會不斷擴展,直至把這種資源消耗光為止。

解析器(parser) 讀取輸入的數據然后生成解析樹的程序。

解析樹(parser tree) 解析器讀取源碼后生成的數據結構。它是將源碼翻譯成機器語言的第一步。

補丁(patch)

PDA(個人數字助理,Personal Digital Assistant) 一種可以隨身攜帶的小型計算機。它的操作界面通常比正規計算機更簡單,限制也更多。

管道(pipe) 將操作系統的各種命令連接起來的一種方式,使得一個命令的輸出變成另一個命令的輸入。

指針(pointer) 一塊數據,它的值是另一塊數據的內存地址。

指針運算(pointer arithmetic) 通過對已知地址進行加法運算在內存中找到目標對象。這是低層次語言的一種技巧。

可移植性(portable)

門戶(portal) 網站。

過早設計(premature design) 過早決定一個程序的行為。

過早優化(premature optimization) 還沒有寫完程序,你就開始考慮它的性能問題。

進程(process)

性能分析器(profiler) 一種觀察運行中的目標程序的程序,它會告訴你目標程序的哪一個部分最消耗資源。

偽碼(pseudocode)

QA(質量保證,Quality Assurance) 軟件行業中負責找出和登記bug的人。

遞歸(recursive) 一種調用自身的算法。警察審訊犯人時就會用到遞歸。警察先問犯人是否知道案件的情況,或者是否知道誰干的,如果犯人回答知道,那么繼續這樣問下去。

RAID(冗余獨立磁盤陣列,Redundant Array of Independent Disks) 一種硬件,將多個硬盤模擬成單硬盤,(理論上)避免了硬盤崩潰。

“讀取—求值—打印”循環(read-eval-print loop) 一種頂層解釋器(toplevel)。

RISC(精簡指令集計算機,Reduced Instruction Set Computer) 這種計算機的機器語言功能有限,但是運行速度較快。它的目標是更好地適應編譯器的需要

掃描(scan) 讀取一串字符,將其分解成一個個的語義單位(token)。

腳本語言(scripting language) 一種編程語言,用來對某個程序進行定制。有時,開源編程語言(比如Perl和Python)也被稱為腳本語言,但是這種叫法意義不大。

SETI@home(搜尋地外文明,Search for Extra-Terrestrial Intelligence) 一個科研項目,使用互聯網上桌面電腦的空閑計算能力搜索宇宙中其他生命發出的電磁波。

s-表達式(s-expression) 一種語義單位(token),用括號表示,內部可以再包含0到多個s-表達式。

套接字(socket) Unix操作系統的一種內部渠道,不同計算機的進程通過它可以在網絡上交換信息。

面條式代碼(spaghetti) 扭曲纏繞在一起的代碼,沒有人能夠讀懂,包括作者本人。

spam 無緣無故收到的、數量龐大的垃圾郵件,通常是廣告。這個詞來自Monty Python劇團的喜劇小品,每當餐廳服務員打開一聽Spam牌罐裝肉,一群維京海盜打扮的演員就齊聲高唱“Spam,Spam,Spam”,將主人公的對話聲都淹沒了,因此spam就有了外界強加的大量打擾的含義。

規格(spec) 軟件的規格說明書。對程序功能的一種非正式描述。

SSH(安全shell,Secure Shell) 可以安全連接遠程計算機的一種程序。

SSL(安全套接字層,Secure Sockets Layer) 一種在網絡上安全傳輸數據的協議。

狀態機(state machine) 一種理論上的機器,它的所有可能狀態是一個集合。當滿足某些條件時,狀態之間就會發生轉換。

語句(statement) 一串不產生值的代碼。為了使得自己有用,它必須能夠產生一些實際效果,比如顯示內容。有人認為這個概念本身就是錯的,在一些語言中根本沒有語句,只有表達式。

靜態類型語言(static typing) 這一類編程語言的所有變量的類型在開始編寫程序的時候就必須知道。

子程序(subroutine)

子集(subset)

西裝革履的人士(suits)

符號(symbol) 一種數據類型,語義單位(token)就是符號的實例。符號與字符串很類似,除了兩點區別:(a)一個符號就是一個獨立的單位,而不僅僅是一串字符;(b)一個符號通常只有一個對應的名稱,而包含同樣字符的字符串卻可能有好幾種。

句法(syntax)

系統管理員綜合癥(system administrator disease) 系統管理員心底里總是認為,他們管理的那些設備只是獨立的設備,而不是用戶的工具。更概括地說,他們的態度就是將客戶視為一種麻煩,而不是自己能夠有這個飯碗的原因。這種心理是感受不到競爭壓力的工作職位所特有的。

一次性程序(throwaway program) 為了滿足暫時性需求而編寫的程序。

語義單位(token) 一串同屬于一個單位的字符。更通用的叫法是“詞”(word)。

頂層解釋器(toplevel) 編程語言的一種界面,你可以在其中用這種語言與計算機進行不間斷的對話,正如你在Unix的shell界面中所做的那樣,而不是簡單地編譯程序,然后運行,對話就結束了。

樹(tree) 一種數據結構,它包含的每一個實例都可以指向兩個或更多的實例,比如家譜樹。

圖靈完備(Turing-complete) 如果一種編程語言寫出的所有程序都能被轉換成圖靈機程序,并且反之也成立,那么這種編程語言就是圖靈完備的。所有當代編程語言都是圖靈完備的,這意味著(在理論上)它們的功能都是一樣強大的。圖靈完備又稱圖靈等價(Turing- equivalent)。

圖靈機(Turing machine) 一種完全虛構的計算機,作用是證明計算理論。由于所有計算機的程序都可以被轉換成圖靈機程序,所以在這個意義上,你不可能做出比圖靈機更強大的計算機。但是沒有人能保證這一點,因為“計算機”這個詞并沒有被正式定義過。

UDP 一種網絡傳播信息的協議。

UI 用戶界面(User Interface)。

向量(vector)

正常運行時間(uptime) 一臺計算機(特別指一臺服務器)正常工作的時間百分比。它的另一個意思是指某臺計算機從上次宕機到現在的時間長度。

朦朧件(vaporware) 談論已久但是遲遲不亮相的軟件。

VC(風險投資商,Venture Capitalist) 為他人創業或再融資提供金錢的人,他們要求創業者用股份來交換投資。

1.0版(version 1.0) 某樣東西的第一個版本,暗示不完整、不好用。

楔住(wedged) 表示無回應狀態,尤其是指服務器。

所見即所得(wysiwyg) What you see is what you get(你看到的就是你得到的)的縮寫(發音為whizzy wig)。比如文字處理器中,你在屏幕上看到的頁面與打印機的輸出是一樣的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容

  • 黑客與畫家 0. 譯者序 《黑客:計算機革命的英雄》中提出的6條黑客價值觀 使用計算機以及所有有助于了解這個世界本...
    雁宇閱讀 519評論 0 2
  • 第十三章 書呆子的復仇:在高科技行業,只有失敗者采用“業界最佳實踐”。 由此也就得出了20世紀50年代的編程語言(...
    陳浩要安靜閱讀 533評論 0 1
  • 作者簡介:Paul Graham,美國硅谷創業之父。Viaweb(Yahoo Store原型)創始人,硅谷著名創業...
    假殼魚閱讀 256評論 0 1
  • 在安裝之前先檢查一下自己的系統,rpm -qa|grep jdk 鍵入終端,查看安裝了多少jdk 如果沒有直接跳到...
    Albert新榮閱讀 234評論 0 1
  • 人的一天啊 有二十四個小時 有多少個小時 我們在為自己的理想去拼搏啊! 又有多長時間 我們在為自己的愚蠢付出慘重的...
    團寶兒閱讀 366評論 0 4