1. 程式人生 > >幸運飛艇原始碼出售程式設計到底難在哪裡?

幸運飛艇原始碼出售程式設計到底難在哪裡?

(貌似有很多非程式猿看到此文,為了照顧這些讀者,我用自己非常不純熟的英翻中把原文中程式設計師交流時經常使用的英文都換成了中文,翻譯的不好請諒解 -_-)

記得之前組裡來了一個美國實習生小夥子,很極客的那種,幹活快,一天能給你寫2000行程式碼(我複查的速度跟不上他寫的速度),讓做什麼東西,上午告訴做個這個功能,下午就能在測試環境跑起來演示了。跟他單獨開會的時候,他說覺的普通的程式設計沒什麼意思,太簡單了,寫程式這方面已經沒什麼追求了,他比較想跟我研究大資料的框架,資料庫,或者機器學習之類的工作,做設計,早日脫離程式碼這種無腦工作。

我足足花了1周時間,每天讀他的程式碼到凌晨。給他寫的評語反饋快趕上我在知乎寫的答案文章之和了。。。期間幾小時幾小時的開會論戰,孩子狂,語速快,腦力靈,辯論角度刁鑽。他天天要與我論戰,看我的評語,速度還算慢下來了。

沒來得及討論完,隔週我要休假了,2周。交代了些他要做的工作。

2週迴來,讓他改的那個java包爆炸了,本來我們一個支援了7個功能的框架包,總程式碼量也就5k把,等我回來這包程式碼量1w5+。也就是說他為了一個小功能加了1w行程式碼。

這沒法複審,只能跟他坐一塊,先讓他給我講講這程式碼都幹什麼的,然後他說:

en。。。這塊我現在也看不太懂當時為什麼這麼寫了。。。

en。。。這邊寫的比較複雜是因為當初那邊是那樣寫的,所以這邊沒辦法才只能這麼寫。

en。。。把當初那邊改好很麻煩,影響也很大,不如就這樣吧。

en。。。這裡這麼寫是因為你看著裡是這樣的, 然後這裡有這個邏輯,然後這裡。。。(來回來去翻n個類之後)。。。 所以你看我這裡雖然寫的比較詭異,但是完全沒問題的!(得意ing)

en。。。這邊做的這麼奇怪是因為有個bug,通過這麼寫,這個就bug沒了,我也不知道怎麼回事。。。所以你看我在這邊註釋,這行不能刪了。。。

en。。。我覺得這個功能很酷,你們雖然現在不需要,不過有總比沒有好吧,將來如果……%¥……&%&……%*7&%……*%…(我沒聽懂)的話,這個就很有用!!

...

一次一次被我打回去重寫,後來總算簡化成大概5k行了;臨走時候跟我說:你這樣程式設計也太難了。。。

再後來由於一些額外複雜的程式碼造成我們實現新東西會很複雜,我又重寫了一遍,總共大概不到1k行程式碼。

這裡邊有幾件事情我想說:

  1. 做出來容易, 做正確難,這裡做出來指沒bug且完成需要的功能,這是最基本要求,不多加討論。這裡正確,
    不是指功能正確,而是指程式可以很容易推理理解,理解意圖, 理解如何做到的,理解為什麼系統不會出錯。理解為什麼要這麼做。正確是現在怎麼寫不會挖坑害將來的人,現在怎麼寫能讓別人1年後看你程式碼時候不可能理解錯你現在的意圖,現在怎麼寫能在別人將來犯錯的時候提示他你錯了。
  2. 程式設計是給未來的未知人講故事,你無法知道將來這個人是誰,他都懂什麼,他經歷過什麼,這個系統將來已經是什麼樣子了。我們需要在這種無知,缺乏資訊的情況下做決定,從千萬種把這件事做出來的方法裡,選出你覺得最能把這個故事給講好的那種方式,把故事寫下來。程式設計是一種溝通,溝通是一種藝術,用程式跨越時空之溝通則是一門屬於程式設計師的特有的藝術(就好比數學家用數學公式來溝通) coding is all about the art of communication(引用)。
  3. 壞的決定會導致壞的決定,甚至導致人們去扭曲一個好的決定去迎合壞的決定。垃圾會製造垃圾,一個放在系統裡不經清理的額外複雜度,會導致更多的額外複雜度的生成。
  4. 每個人甚至同一個人的不同時刻都有自己的不同的製造額外複雜度的缺陷,比如我每年去看去年自己寫的程式碼,覺得都是垃圾。

然後我又想問幾個問題:

我們所在的部門,所在的組,公司,它們的文化,到底是關心作出了一個東西,還是關心做好了一個東西。一個總是給系統新增垃圾,留坑給後人,但是能很快做出能跑起來的系統的程式猿,我們到底認為他是做了好事還是做了壞事?我們到底認為他很強,還是他很弱?用超過必要而為了突顯技術實力的複雜工具,技術框架搭建系統,做完跑路,在一個組,一個部門,一個公司,那裡的文化,到底應該是鼓勵還是抑制這種行為?我們又應該如何在一個環境中,去倡導推崇什麼樣的文化,相遇什麼樣的人?