國內人寫代碼的水平跟美國的差距在哪?


這個我正好思考過,也有點感悟。


論工作中的編碼能力,國人比老外可是一點不差。我身邊有幾個移民出去的碼農朋友,在國外也都能找到不錯的工作,完全能夠勝任。


但為什麼中國人就很難寫出世界頂級的代碼工程呢?我覺得原因出在生活壓力上。中國的碼農生活壓力大,699之類現象(一周6天早9晚9)非常常見。這種情況下寫代碼都是超額工作,而且沒有業餘時間,即使有業餘時間,也很難再把時間花到一件上班都已經干到噁心了的事情上去。而真正史詩級的代碼和項目,幾乎無不是程序員們玩票的時候搞出來的。

程序員和碼農,雖然看上去是同一群人,但是描述了這群人兩種不同的心態和生存狀況。作為興趣志向和作為求生技能,兩者的區別在於動機,而技巧不分上下的時候,能決定成果的,就是追求不同的心了。


12-26補充:
看了@謝仰錕 貼出來酷殼的連接,很有感觸。

或許國內人寫代碼的水平跟美國的差距很重要的一個方面,就是程序員平均年齡。或許從思維反應、精力上來講,年輕人會有優勢,但是年齡稍微大一點,並不會導致邏輯思維能力的下降,甚至豐富的編程經驗還會減少一些低級錯誤的發生,遇到bug也能更快的定位出問題的原因。

我一直覺得現在一個很不好的風氣就是鼓吹編程是吃青春飯,導致很多人剛碼了沒幾年就去考慮轉型。在這種思想的指導下,有多少人真能靜下心來潛心研究coding呢?我沒有到30歲,或許討論這個編程和年齡的問題不太夠資格。但是我目前的觀點就是「編程」並不是Code Rush,年輕時精力和集中力的優勢,沒有想像中那麼大。

12-23原答案:

@Kenneth 的回答絕大部分說的很有道理,稍微補充一點點。

論工作中的編碼能力,國人比老外可是一點不差。我身邊有幾個移民出去的碼農朋友,在國外也都能找到不錯的工作,完全能夠勝任。

這個例子有欠公正,移民出去的碼農朋友,基本都是國內的佼佼者了,不能代表平均水平。就平均水平而言,「論工作中的編碼能力」,我認為國人確實相對美國碼農會差一點。

我本科兩年在國內,兩年在美國,都是計算機專業。國內的學校大概排名50,在美國的學校只能排名100。但是論同學編程平均水平,我認為美國學校的同學還會更高一些,甚至差距還不小


大學時代編程水平就有這麼不小的差距,我認為主要原因還不是生活壓力,而是學習編程的動機
正如@迷島 所說:

很多人做程序員是因為工資高或者大學就是稀里糊塗的學的計算機,為了生計提升能力

這一點也是我在兩地念書體會非常深刻的一點。在國內大一剛開學的時候,第一次年級大會院長發言就講:我們專業大概只有40%多的第一志願率,其餘都是被調劑過來的。而在美國,因為相對同學少,所以我有在聊天時候問過他們為什麼學Computer Science,得到的答案基本上都是因為這是他們的愛好。

有了興趣才會有動力去真正的探索這個領域,所以美國同學大概有1/3都自己做過一些小項目,這正好是最鍛煉寫代碼水平方法(除開課本)。而在這方面,國內的同學做的相對就會差一些。

正是因為學生時代就有了這樣的差距,再加上迫於生活壓力、職場環境等等因素,才會導致碼農的平均水平會有差距


當然是差在英語水平上。

代碼好不好,80%體現在命名上。


長久以來看源碼發現一個特點,國外的程序員很善於利用開源項目,尤其 java 的項目 pom 依賴的其他開源項目很多,感覺各種開源項目都會用,而且願意使用不是自己造輪子,很快的像搭積木一樣一個大項目就起來了,只要關心自己項目的核心業務即可。所以在 github 常看到一個人能駕馭很大的一個項目,這點在國內程序員不多見。


---update

分工明確,各自信賴這點真的不錯,也許我們的程序員還缺乏點這種網路合作協作的經驗, 各位別上綱上線一下扯到國家扯到民族。


這個問題很難回答。每個人的經歷和工作環境不一樣,各自的觀察樣本偏差會很大。

就我個人而言,我覺得:

  • 爛水平的程序員,中美沒有差異,各有各的爛法。
  • 中等到中上的,其實差異不大。美國方面,因為到現在還是技術引領者,所以用的技術和工具會比較新,這點對你寫代碼的水平有一定影響。
  • 頂尖水平的,就我來看,差距不是在寫代碼的水平上,而是如《一代宗師》里那樣,「比的是想法」。突破性的創新、各種奇思妙想,老美的確更多。我感覺這個是和教育以及科研積累有關的。

一個掙錢去還房貸、一個掙錢來中國旅遊


由於之前在外企的工作關係,接觸過老美、印度和俄羅斯的三國軟體工程師以及他們寫的代碼。
說下他們的區別。
老美的代碼看起來是一件藝術品,他們會在代碼文件頭、函數頭裡寫上很漂亮工整的注釋,然後項目有一個龐大複雜的架構,各種設計模式、框架結合使用,好像這些東西用得越多越流逼一樣。喜歡將簡單問題複雜化,一個能用全局變數實現,且沒多線程不用上鎖的東西卻偏偏要用一個singleton模式來做。能用簡單的callback函數實現的活但偏要弄一套Observer模式。把代碼寫得異常深奧。什麼模板的偏特化、虛繼承那邊邊角疙瘩的技術都搬弄出來,怕你一下看懂代碼讓他感到很沒面子似的。
解一個bug需要7個工作日,君若問為什麼要7天?
待我細細道來:問題重現要1天,debug要1天,workout solution要1天,測試1天,review 1天,review後再submit要1天,submit後經理approve又要1天...感覺那邊的時間不是錢啊,不帶這麼玩的啊。

印度人寫的代碼就像一條工業流水線出來的產品一樣,每個都很規矩,但也很死板。一個環形消息緩存的東西用竟然數組來實現,然後在下標計算時倒來倒去。尼瑪用個鏈表來實現會死是不。

俄毛子的代碼那簡直就是天書,一股濃烈的geek氣味伴隨著灌滿伏特加後眩暈的混沌感撲面而來。變數名寫長一點清晰一點會死嗎?plmm不是漂亮美眉,看了半天代碼連猜帶懵才知道是Platform Link Maintainess Manager。然后里面各種各樣tricky的代碼與潛規則,get_user_policy(UserId)函數跟根據用戶id獲取他的安全策略是吧,慢著,如果你傳入的id是0,我返回的是系統所有用戶的策略;你傳入的是-1的話就是重新載入策略文件...別問為什麼,我是故意這樣做的。我勒個去...

中國人寫的代碼還是比較實用的,但如果不加控制就會犯低級錯誤。你見過為了查找一個用戶id,先用select *從資料庫把所有內容都撈出來,然後用個大大的for循環來查找的代碼嗎?我看了當時就淚奔無語了。
還有一次一幅圖片控制項在多次操作後就死活顯示不出來,鬱悶地查了一天一夜看到某處代碼pic.alpha=0.我問為什麼,他說因為我想隱藏圖片啊。我當時立馬有一腳踹死他的心都有,是不是大學圖像處理學傻了,不知道有visible=true/false這個方法啊,要給我搞什麼alpha通道,這東西真是誰用誰才知道啊。


我認為差距體現在兩方面:
1. 工程教育和工程訓練不足。
2. 行業大環境、從業心態有差異。


在英文注釋和變數名……其他沒啥差距……


這篇文章中的論文及對論文的理解,可以很好的回答這個問題:編程能力與編程年齡
作者:陳皓。 出處:酷 殼 – CoolShell.cn
-------------------------------------------------------------------------------------------------------------------------------
就我個人在上千人的團隊的工作和分析中感受:
1)大家對寫代碼的追求要高於架構和設計,因此架構和設計比較差
2)寫功能代碼和寫演算法的代碼是有差別。這部分國內比較弱。
3)和一些Unix極客比,我們缺少對代碼形式美得追求,導致不好理解,不好維護。


大概是用中文注釋和用英文注釋的區別?


其實我想吐槽下樓上眾對StackOverflow上簡單問題的吐槽……

在美帝學CS目前本科大二,從大一進教室的第一天起就與StackOverflow痴纏不休啊。簡單的東西教授就一筆帶過,直接給一個問題描述讓你自己把程序寫出來啊。在這種狀態下遇到個什麼你自己都知道是很小但是你不知道怎麼寫的問題,有時候甚至只是不知道語法啊(我想了想去Google上搜過最白痴的問題……用java寫第一個程序的時候想知道Java里把String cast成int的語法?),你是去書里找呢還是舉手等教授跑過來給你答案呢還是直接Google呢?當然是直接Google了。於是Google就會給你StackOverflow的鏈接啊。這種時候StackOverflow多親民啊,至少在寫作業過程中遇到的絕大多數問題都是SO上面被諸位稱為白痴問題的問題。這是最簡單最有效的解決方案,何必想那是不是白痴呢……


我在美帝面過上百人了,以目前的樣本來看,美帝水平爛的人也是一抓一把,沒什麼了不起的


每每半年才能完成的項目被要求用三個月乃至兩個月時間完成,還談什麼代碼質量。


產業鏈中不同地位的代碼對可復用和維護性的要求是不一樣的,對可復用和維護性的要求不同,導致合理的人月投入數不同,或者說對質量和產量的權衡不同。

人月神話的3x3結論(可復用可維護代碼的額外開發投入)還記得吧,如果你是老闆,在可以湊合的條件下願意燒9倍的錢么


一個老外程序員的工資能養活國內一個軟體外包的公司,大家說差距在哪?


我在工作中見過的美帝同事寫的代碼,一點都沒有比我們強在哪,大家都一樣。


在物質、生活、經濟條件都不對等的情況下,去比較兩個國家的某個群體的生活狀態,最終只能得到的答案:

因為物質、生活、經濟條件不對等。


差異體現在業餘時間寫代碼的時間總和上


生活壓力所迫下難有創新點...


推薦閱讀:

為什麼說讀代碼比寫代碼難?

TAG:程序員 | 編程 | 信息技術(IT) | 代碼 |