程式設計師神器 StackOverflow 10 歲了,它長大後想成為什麼?
【伯樂線上導讀】:今年 9 月,程式設計師必備神器之一的 Stack Overflow 正式成立 10 週年了。截至目前為止,SO 使用者量高達 930 萬,也許你經常在 SO 上找解決方案。但你可能還不真正瞭解 SO。來看看 SO 創始人 Jeff Atwood 是怎麼說的。
現實生活中常常有人問我,我的工作是什麼,對此我有一個 15 秒的回答:
我們建立了一個類似維基百科的網站,程式設計師們可以在上面發表或者解答問題。網站的名字叫 Stack Overflow。
截至 2018 年 9 月,Joel Spolsky 與我共同建立的 Stack Overflow 已經走過了 10 個年頭。從 2012 年開始我就在做其他的工作了,但是能讓人們在我過世之後還能想起我的東西,那肯定還是我的老夥伴 Stack Overflow。
這裡我好像應該滔滔不絕地說 Stack Overflow 有多麼優秀,而我作為創始人是有多麼偉大。
但I這些我都不在乎。
我真正在乎的是,Stack Overflow 對程式設計師們是不是有幫助。對此,讓我們看看如今最牛叉的開發者之一,我的偶像 John Carmack 是怎麼評價的。
在為提升開發者的效率方面,Stack Overflow 可能貢獻了好幾十億美元
說實話,2013 年 9 月 17 日是很美好的一天。我讀到這條推的時候嚇了一跳,不光是因為我經常用 Carl Sagan 的方式讀 Billions 這個詞。我在 Twitter 每隔幾天就會讀到一些殘酷無盡的人間疾苦,以及人們在網路上的互相叫罵。與此相反,那一天是我感覺到的只有喜悅。這也提醒了我,我該查查 Twitter,看看如今誰還對網路抱有不同的理解。
Stack Overflow 有著如此多使用者,也幫助了一個時代的開發者,對此我感到既榮幸又謙卑。但是,實現這一成就的並不是我。
- 是你們,對 Stack Overflow 貢獻了經過深入研究後想到的提問;
- 是你們,對 Stack Overflow 貢獻出了簡潔而清晰的答案;
- 是你們,編輯了 Stack Overflow 的提問或答案,並使其變得更好;
世界各地開發者們所貢獻的那些大大小小的提問與回答,把 Stack Overflow 變成了一個在開發領域能與維基百科抗衡的創意共享知識庫。這實在是…非常的不可思議。
不過成功的故事都很無聊。這個世界上有很多人,本身運氣好,但還時不時的告訴別人是自己的努力以及喝活力汽水換來了成功。我覺得失敗的故事更有教育意義,在建立業務與規劃未來時,我把自己想象成深淵專家,並開始一場比賽。這是我自己做事的習慣。
當你在凝視深淵的時候,深淵也正在凝視著你 – Friedrich Nietzsche
由此,我現在要與耀眼的深淵對視,預測一下Stack Overflow未來十年會遇到的挑戰。這之前,我要先澄清以下事實。
1、從 2012 年 2 月開始,我就沒有再為 Stack Overflow 做事了,也沒有對其運營有過任何建議。你問我對如何運作Stack Overflow 竟然能沒有建議?額,那你可能不認識我。你問我難道我不會時不時給員工發郵件告訴他們我的想法?我也許會吧,但是我為數不多的歸檔郵件可以證明,這個事情很少發生。
2、Stack 有著優秀的員工,他們中的大多數(包括我離開之前的 Stack Overflow 社群成員)都能對我們的使命給出更好的,不像我那樣胡思亂想的闡述。我會用生命信任他們嗎?不會。但是我會用 Joel 的生命信任他們!
3、Stack Overflow並不屬於我或者 Joel,或者其他一些優秀的開發者。Stack Overflow 的運作靠的是世界各地日復一日做開發的人們,就像你或我一樣。我覺得 Stack Overflow 就像個家長,它的目標是讓孩子們最終能離開家長身邊,成為可以獨當一面的大人。
4、作為 Stack Overflow 的創始人,我在社群成立的最初四年裡,花了非常多的時間參與制定規則與規範。你現在閱讀的是我所強觀點,弱堅持。這只是我的一些想法,我也希望自己的預測是準確的,但是這並不意味著我可以預測未來,或者我有資格去預測未來。不過我並不會以自己是否具有資格而不去做一些事情。
Stack Overflow首先是一個 wiki
Stack Overflow不僅是個論壇,它跟維基百科有很多相似之處。我們衡量問題和答案是否有意義的方式,不是看那些問題和答案對特定幾個人的幫助,而是看隨著時間的推移,這些問題和答案能不能幫助到越來越多的人。我從 2008 年 Stack Overflow 上線後就在強調這個關係。來看看下面誰的地位最高。
為了強調這一核心價值,Stack Overflow添加了一個簡潔的功能。那就是在使用者資料裡會顯示,你所貢獻的問題與回答幫助到了多少人。
這些問答內容到底服務於誰?回答問題為何有如此嚴格的稽核過程?對於 Stack Overflow 最常見的抱怨通常來自於對前面這兩個問題的誤解。
我希望更多的人能明白,Stack Overflow並不是一個“回答我的問題”的地方,它是“讓我們合作建立一個對未來的開發者們有益的地方”。也許 Stack Overflow 應該更加努力去幫助使用者理解這件事。
如今很多使用者,甚至泡在 Hacker News 上的技術圈網友,都不知道 Stack Overflow 上有個功能,那就是每一個問題都是可以修改的,即使是沒有登入的匿名使用者也可以修改。對此我深表驚訝。這個功能不奇怪,對吧,因為 Stack Overflow 就是一種維基百科,這也是維基百科的執行模式,任何人都可以修改任何內容。不信的話,現在就去試試吧,找一個你認為可以提高的問題或者回答,點選“改善這個回答(improve this answer)”或者“改善這個問題(improve this question)”,然後寫下你的改良版。
Stack Overflow 有很多功能(甚至也包括我自己在 2012 年之前的一些所作所為)都容易導致使用者誤解其核心價值。理論上,“如今每一個開發者都聽過,用過以及瞭解 Stack Overflow”,但我覺得這個假設不準確。畢竟每時每刻都有新的開發者誕生。說得更復雜一點,Stack Overflow 的使用模式有三種,從大到小,以倒金字塔的形式排列如下:
1、我在需要的時候去搜索答案
使用者直接上網搜尋,搜尋引擎會直接顯示出 Stack Overflow 中的高票答案。出現在搜尋引擎第一頁,這也是Stack Overflow的主要目標。如Stack Overflow正常執行,98%的開發者在他們的整個職業生涯中,不需要主動提出或者回答問題。只要通過網路搜尋就可以找Stack Overflow上到他們需要的結果。這是個好事,非常好的事。
2、我遇到很困難的問題時會參與Stack Overflow的討論,因為單純的搜尋找不到我想要的答案
只在遇到難以解決的困難時,參與Stack Overflow的討論,這很合理。然而,我覺得這個階層的使用者最容易感覺到Stack Overflow不是那麼容易使用,因為這類使用者可能對Stack Overflow很熟悉,但是並不清楚釋出問題的流程。並且在他們急切想尋找答案的時候,他們沒有時間或心思去應對Stack Overflow對於問題背景、格式、描述以及引用要求。
3、為了自己的職業發展,我主動參與Stack Overflow的問題討論
這個階層的使用者很有經驗,他們貢獻了很多答案,也瞭解什麼樣的問題是好問題,是他們感興趣、願意回答的問題。他們不經常提問,因為他們知道如何去全面搜尋他們想要的答案。但是他們一旦提問,那一定是個示範性的好問題。
(理論上這裡還有個第四階層使用者,他們無私的貢獻了很多提問與回答,目的只是為了推動軟體開發行業的發展,造福於新一代的開發者們。但是我們沒空提這些大神,你們只會讓我們顯得更加平凡,所以我們就此打住吧)
第一階層的使用者在社群裡開心地逛了好幾年,卻在變為第二階層使用者時,一下子有了不開心的使用者體驗。對此我一點兒也不驚訝。我認為解決這個問題最主要的方式,就是改變並提高提問頁面的使用者體驗。另外值得注意的一點是,使用者在提出了某個問題後,可能收到關於問題資訊不足的負面反饋,但是他們也許並不知道,你的問題應該是“有益於其他使用者而並不只是你自己”。
Stack Overflow採用了維基百科的模式,也使其自身受到了很多限制。即使使用者在提問前就知道這些,很多時候到底什麼是“有用的資訊”也很難判斷。同理,很多時候我們也不確定到底什麼樣的話題,人群或者地點需要一份維基百科。Henrietta Lacks 有自己的維基百科頁面,這毫無爭議,但是他住在奧哈馬市的表兄 Dave,那個提出了一個關於 PHP 5.6 的奇怪問題的人,是不是該被寫入維基百科呢?
隨著時間的推移,重複內容像地雷一樣遍地都是
這事我很早就預料到了。老實說,我有點慶幸自己在 2012 年離開了 Stack Overflow,這樣我就不用去處理這個難以置信的技術性難題:重複性內容。在我聽到的關於 Stack Overflow 的所有抱怨裡,重複內容是我覺得最有共鳴的。
如果你接受Stack Overflow是個類似於維基百科系統這一前提,那同理你顯然不能接受,在維基百科中,對於義大利有五個不同的詞條。Stack Overflow不允許對於同一個技術問題有重複的提問。我們確實有很多避免重複問題的功能,比如輸入問題時的同步搜尋,以及提交問題前,你會看到一個很明顯的,鼓勵使用者先去搜索相關問題的搜尋框。
… 如何查詢並判斷重複內容是個非常有難度的問題,即使是Google這樣的公司,有著名副其實世界最聰明的工程師團隊,專攻了20年也沒有解決這個問題。
當你在一個不允許重複問題的網站中提問時,系統去重的難度取決於總問題數量,處理一百萬的問題總量的去重與一千萬甚至一億相比,是非常不同的。系統處理問題去重的難度,會從不太難處理變為最終的完全無法處理。比如你提出了一個與藝術類相關的問題,那麼系統需要根據你的提問內容,在不勝列舉的已有問題中進行篩選,以確保沒有看起來相似的提問。
等會兒,還有個更難的問題!
- 相似問題中有一點內容變化也是可以的,因為十個不同的人在提出同一個問題時,完全可能使用毫不相關的詞語來形容這個問題。我知道這聽起來很瘋狂,但是相信我:人類極其擅長做這樣的事。我們希望保留這些重複的問題,並且讓他們都指向同一個主問題,以便於使用者更好的搜尋他們需要的內容,即使這些使用者使用了那些平常不太會被用到的詞語去描述問題。
- 如何判斷你提出的問題是不是重複,這是個不小的挑戰。多少詞語的重疊才能決定一個問題是不是與另一個重複?誰來決定?不同人有不同理論。這是個以人類語言為標準的解析,然後人類吧……不可預知。這個系統無法做到讓所有人滿意,去重的缺陷會一直存在於系統之中。
我對於越來越嚴重的重複問題並沒有一個好的解決方案。但是我想指出,早期在 Stack Exchange 有很多先例,它們把網站分為“初級”和“高階”區域,不同區域的規則不同。我們在別的地方也能找到類似的例子,比如 Math 和 MathOverflow,English 和 English Learners, Unix 和 Ubuntu,也許是時候搞一個以初級使用者為主的 Stack Overflow了,在那裡我們可以允許多一些重複,少一些規則。
Stack Overflow是個可以同行評審的競爭性系統
Stack Overflow確實是個相當明確的競爭性系統,它的一大標誌就是“總會有更好的解決辦法”。根據我的多年觀察,激勵開發者最有效的方式就是…巧妙地暗示出別人的解決方案也許比你的更好。
– 你好Randall。醫生說你能聽到我說話,雖然你看起來像植物人。我是來告訴你,彆著急慢慢康復。因為Ross接替了你的工作,並且做的非常好。他甚至找到了你程式碼裡的瓶頸,還說他改過的程式碼變快了兩倍。
– 這不可能!!!!!我現在就回辦公室!
Stack Overflow的競爭性質體現在了它的公開聲望系統上,就是使用者名稱旁邊那個擁有神奇力量的數字。所有的聲望值都來源於其他使用者,而不是所謂的系統。
每當你提出問題或者提交回答時,你的問題或回答都可以被其他使用者指指點點,他們可以編輯、標記、關閉、開啟、頂、踩或者收起。這樣做的目的是讓 Stack Overflow 成為一個同行評審和友好競爭的系統,就像在公司裡,你的程式碼被你從沒見過的另一個部門的人來評審。有人以友好的方式去質疑你所提問題的提論,也是完全合理的,比如,你真的想用這個正則表示式去匹配 HTML 嗎?
我完全清楚這種競爭性質的同行評審系統,並不適合每一個人。Stack Overflow 採用維基百科的模式,導致它存在不能接受重複內容這樣的限制。那麼根據你的情況與背景,同行評審時,你收到的評價可能會讓你覺得不舒服。
我聽部分使用者反應,在 Stack Overflow 提問的過程中會感覺到焦慮。對我來說,在 Stack Overflow上提問,應該感受到一種 ”我要展示出我最好的一面“ 的正常焦慮:
- 在你的同事面前演講的焦慮
- 考試要取得好成績的焦慮
- 開始新工作,與你尊敬的優秀同事們一起工作的焦慮
- 第一天去學校報到,即將見到新同學的焦慮
至於那種完全不會感到焦慮的地方,我唯一能想到的就是,從事了很久的工作,已經不再關注與工作本身,因此也沒有那種擔心有一天就會丟了工作的焦慮。這樣怎麼會好呢?所以說我不喜歡零焦慮的系統。
也許你不喜歡競爭。那麼能不能有個少量競爭模式的問答系統呢?一個沒有投支援或者反對票功能的系統,這樣無論發表什麼內容都不會感覺焦慮。這就像是一個全是你的支持者的網路,大家都相信你,希望你成功。這當然也是可以的。我認為應該有類似這樣的網站,使用者可以根據自己的需求與目標來選擇適合自己的體驗。那麼 Stack 應該建立一個這樣模式的社群嗎?這樣的社群已經有了嗎?這是個開放題。也請隨意在留言區發表你的看法。
Stack Overflow是為了日常開發者而設計的
Stack Overflow的目標使用者到底是誰,這也是經常容易被混淆的一點。這個回答很直觀,而且從從未改變過:
一個為專業和熱情的程式設計師而存在的問答平臺。這是指:
當前正在從事程式開發職業的人,或者如果願意就能立即勝任程式開發工作的人。
如果你覺得好奇,這個定義的一部分是公開的商業決策。為了盈利,你的使用者群體必須要有一部分拿著開發者薪水的人,或者在找開發者的工作的人。整個 Stack Overflow 社群也許有著知識共享的標籤,但是它並不是個非營利組織。我們的出發點是可持續經營,這也是為什麼我們在 Stack Overflow 上線一年之後,就成立 Stack Overflow Careers 招聘平臺的原因,回顧一下,成立的確實有點過早了。為了實現比 2009 好很多的整合化使用者體驗,招聘平臺被歸入了 Stack Overflow,放在了 stackoverflow.com/jobs下面。
使用者的選擇定位並不是說要排斥非開發者,但是 Stack Overflow 確實是一個有著嚴格同行評審,對已經在從事相關行業的人來說非常優秀的功能,但同時也是對於學生或者初學者來說很不友好的功能。這也是為什麼,我每次在推特上,看到有人推薦學生去 Stack Overflow 找答案時,我會小心翼翼的建議不要這樣。對於開發領域的新手或者學生來說,他們需要的,與 Stack Overflow 所提供的是完全相反的。他們需要的是:
- 一對一的指導
- 實時螢幕共享協作
- 實時語音
- 理論背景知識課程
- 初學者練習
- 一個練習與實驗的場所
這些都是對初學者來說,很好很合理的事情,但是 Stack Overflow 一個也不做。你可以通過 Stack Overflow 來從頭學習如何程式設計嗎?理論上你可以通過任何軟體做任何事情,你甚至可以通過 Reddit 與人進行日常交流,如果你是受虐狂的話。但是答案還是肯定的,理論上你可以通過 Stack Overflow 學習如何程式設計,如果你是喜歡競爭模式(聲望、被關閉、被踩)的神童,也完全能接受要去幫助別人而不只是自己學習知識這一觀點。但是我強烈不推薦這樣做。對初學者來說,除了 Stack Overflow 外還有很多更好更合適的平臺。那麼 Stack Overflow 能不能成為一個適合新手和學生的平臺呢?我不清楚,我也不能決定。
這些就是我要說的。我們可以不再與深淵對視。
我希望我的觀點對 Stack Overflow 不會有什麼負面影響。總的來說,我認為目前的 Stack Overflow 很強大。但是,無論是 2008 年還是2018 年,我怎麼想有關係嗎?
Stack Overflow 是你們的。 Stack Overflow 將信念賭在了這一點:信任你的同行。Stack Overflow 的成長離不開那些積極參與社群討論的開發者們。是你們讓我相信開發者社群是最好的學習與成長的地方。是你們讓我收穫瞭如此多的對於 Stack Overflow 的讚譽。這不是我的功勞,而是你們的。 很久之前我在 Code Horror 上就知道了合作的力量是多麼強大。目前我們的社群已經達到我今生難以企及的高度。我唯一能要求的,或者是我們能要求的,就是大家互相幫助互相成長。 如果有人認可了你的付出,那麼你值得為此感到驕傲。
開發者社群的力量能夠創造以及終結 Stack Overflow。Stack Overflow 長大了會成為什麼?它的未來將由我們共同創造。
PS:Stack Overflow 十週年快樂!