小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

我們是如何將一個項(xiàng)目做爛的

 知識存儲館 2016-08-11

在你讀到這篇牢騷的時候,無數(shù)個項(xiàng)目正在慢慢變爛。

全篇文字都是以Java語言為背景,如有與非Java語言項(xiàng)目雷同的地方,絕對是巧合。

既然標(biāo)題都用到了"爛"這個詞,那什么才是爛呢?

在你的項(xiàng)目里,"爛"和"好"一樣無法準(zhǔn)確的衡量和定義,在大多數(shù)人的職業(yè)生涯里,你聽到"爛"項(xiàng)目肯定比聽到"好"項(xiàng)目的情況要多很多。

當(dāng)你在一個維護(hù)型項(xiàng)目面前,一邊嘴里跑出一萬只草尼馬,一邊還在上面Coding,最后居然還如期交付了維護(hù)任務(wù),你能說那是"爛"項(xiàng)目嗎?

我自己也沒有遇到過真正無法維護(hù)的項(xiàng)目,因?yàn)槲揖褪悄莻€讓項(xiàng)目慢慢變爛的人。

也許,"爛"項(xiàng)目的罪證無法像《如何編寫無法維護(hù)的代碼》那樣容易羅列,所以你根本就不認(rèn)為那是爛。

不過本文說的"爛",只是從程序員的角度去看項(xiàng)目,與項(xiàng)目本身的創(chuàng)意,項(xiàng)目在公司層面的戰(zhàn)略意義沒有關(guān)系。

工具

在我剛出道時(06年左右),那時候的Java生態(tài)圈其實(shí)已經(jīng)很強(qiáng)大了,但是我剛畢業(yè)工作過的幾家公司,幾乎在項(xiàng)目部署上都沒有使用太多的自動化工具。

有的是直接用開發(fā)工具Eclipse打包war文件,其中一家公司,甚至是在本地編譯Java文件,然后上傳class文件到線上服務(wù)器,就算那時已經(jīng)有ANT這樣的先進(jìn)工具,可惜我們還是類人猿,沒有進(jìn)化過來。

如今Maven成了Java構(gòu)建的標(biāo)準(zhǔn),Gradle成了Java構(gòu)建的新秀。

如果你的項(xiàng)目中使用到了工具,但是它卻很脆弱:過多依賴環(huán)境,依賴復(fù)雜的配置,有時候還會有BUG。

如果你的項(xiàng)目還不能做到一鍵命令構(gòu)建,打包。

如果你的測試環(huán)境,和線上環(huán)境,不能在5分鐘(5秒種更好)之內(nèi)部署好一個程序。

那么你的項(xiàng)目,肯定會慢慢變爛。

框架

是的,從你找工作開始,就肯定聽說了這個詞,如果你在學(xué)校的時候就是一個勤奮好學(xué)的同志,那么你早就聽說過了,在Java的世界里,你不會幾種框架,還好意思出去混嗎,于是很多招聘里面都提到,精通Spring,Hibernate,Struts,Mybatis ... 我入職的一家公司,甚至還有公司框架Demo代碼學(xué)習(xí)這個環(huán)節(jié)。

So,當(dāng)你到公司第一次接觸到項(xiàng)目的時候,我想上面提到的這幾個框架,至少有一個出現(xiàn)在你的項(xiàng)目中,先來看看我遇到的項(xiàng)目中使用框架的情況:

  1. 使用了框架,但是版本已經(jīng)是上個世紀(jì)的了,卻依然在線上跑著
  2. 依賴同一個第三方開源工具包,卻有多個版本
  3. 有的地方用了框架的注解配置方式,有的地方卻用的XML配置文件
  4. 一個本來只需要幾十K代碼搞定的項(xiàng)目,最后把框架依賴一起打包,至少幾十M
  5. 沒看出來為什么這個項(xiàng)目需要用到這個框架
  6. ......

框架一詞原本來自建筑學(xué),在軟件行業(yè)里面,本人理解框架,就是解決特殊場景問題的 抽象 實(shí)現(xiàn)。本著娛樂的精神,這里就不引入太書面的文字,容易引起反感。

如果你的項(xiàng)目和我遇到的情況一樣,滿足了上面兩點(diǎn)以上,我相信,只要這個項(xiàng)目還要繼續(xù),就會繼續(xù)變爛,原因大概有以下幾點(diǎn):

  • 你是一個有理想的男青年,你想把機(jī)械鍵盤砸在那個已經(jīng)不知離職多久的前前前同事的臉上,然后大聲喊出來“老子要重構(gòu)”,然而老板說:可以,你先把這一堆需求實(shí)現(xiàn)了再說。
  • 最后老板還是同意了,沒事兒你就重構(gòu)吧,但是,你敢把一個正在好好running的線上項(xiàng)目框架換成最新版本嗎?(你的項(xiàng)目用到還不只一個框架,有些框架之間在版本上還有依賴的,你不可能只升級其中一個)
  • 想到這里,再抬頭看看周圍Coding的同事,有的是已經(jīng)工作了數(shù)年的老臘肉,還有一波剛?cè)肼毜男□r肉,他們是否和你一樣有理想,有追求呢
  • ......

如果你學(xué)過PMP,那么上面這些問題可以概括為風(fēng)險(xiǎn)和成本。

這樣,框架就成了項(xiàng)目的枷鎖,即使不會讓項(xiàng)目慢慢變爛,也不會讓項(xiàng)目慢慢變好。

領(lǐng)域模型

對啊,沒問題,我們項(xiàng)目里面的使用Spring,爽得不要不要的,Spring不是提倡面向接口編程嗎,我們有完善的Service接口層。

是的,就像上面提到的,我曾經(jīng)學(xué)習(xí)過公司的框架Demo代碼,里面把Module都分好了,Domain, Dao,Manager(用于管理DAO層的事務(wù)),Service,Web。 真實(shí)的情況卻是,Service里面,一個Service接口對應(yīng)了一個Dao(大部分情況是這樣的),你有幾個數(shù)據(jù)表,大概就有多少個Service接口,如果有個新業(yè)務(wù)來了,添加了一張表,就再搞一個Service接口。

是不是感覺你的Service,Dao基本都是在為數(shù)據(jù)庫CRUD服務(wù)。

在充滿疑惑的歲月里,我找到了真相,原來我把名詞理解錯了,“DDD”的含義有兩種,一個是Data-Driven Design,一個是Domain-Driven Design

一個沒有領(lǐng)域模型抽象的項(xiàng)目,遲早要慢慢變爛。

測試

我在大學(xué)里面學(xué)編程的時候,似乎老師都沒教過什么是測試,當(dāng)時寫TC的時候,老師只是說上機(jī)執(zhí)行,現(xiàn)在回想起來,好像當(dāng)時的教材也沒有專門講測試。(也許我就沒有好好學(xué)過)

從項(xiàng)目代碼來看,最基本的就是單元測試。

你的項(xiàng)目雖然有單元測試,但是他們要么過時(沒有和被測試代碼一起演化),要么根本就沒有達(dá)到覆蓋率要求。

當(dāng)你想給一個功能補(bǔ)寫單元測試的時候,發(fā)現(xiàn)編寫單元測試的難度比重新實(shí)現(xiàn)這個功能的難度還要大,結(jié)果你就真那樣做了。

測試的目的就是為了發(fā)現(xiàn)盡可能多的缺陷, 盡量 保證質(zhì)量。

然而很多項(xiàng)目根本就沒有清晰定義出 質(zhì)量 的邊界,甚至只完成了功能測試。

羅列你項(xiàng)目中的測試項(xiàng),將他們分類列舉,如果測試項(xiàng)用一張紙都能寫完, 那么這個項(xiàng)目本身就是爛的,根本不需要慢慢變爛。

再強(qiáng)調(diào)一下,如果沒有充分測試(怎樣才是充分測試?)的項(xiàng)目,其實(shí)已經(jīng)爛了。

需求

所有的業(yè)務(wù)需求你都應(yīng)該去滿足

業(yè)務(wù)是項(xiàng)目的基本驅(qū)動力,可以說沒有需求就沒有項(xiàng)目存在。

然而對于一個發(fā)展中的項(xiàng)目,需求正在讓它慢慢變爛,有時責(zé)任卻并不在需求本身。

大部分項(xiàng)目的需求,大致上都會對應(yīng)到一個系統(tǒng)功能,系統(tǒng)功能都會有生命周期,但是項(xiàng)目中的代碼卻往往隨需求一起增長,對于過時的功能代碼,沒人敢隨便刪除,然后就變得臃腫。

另外一種情況就是需求超越了領(lǐng)域模型,例如:ATM取款機(jī),讓你植入視頻播放功能(現(xiàn)實(shí)生活中卻真有的),你還高興地接受了這個需求。

你有時無法分辨出像我給出的這個明顯例子,然后卻漂亮地實(shí)現(xiàn)了它。

恭喜你,你的項(xiàng)目正在慢慢變爛。

負(fù)面情緒

(這一小節(jié)我還沒想好怎么寫)

成本

(這一小節(jié)我還沒想好怎么寫)

保持現(xiàn)狀

有一個老程序員自豪地告訴我,他寫的一個程序已經(jīng)在線上跑了快10年了,從來沒動過。

我只是笑了笑,說了一句:牛逼

如果我寫一個打印Hello world的程序,部署在一臺太陽能Linux機(jī)器上,然后把它放到外太空,誰知道能運(yùn)行多久呢。

我做的部分項(xiàng)目里面,用到的第三方工具距離最新版發(fā)布時間有的至少快5年了。

同事告訴我,用著這么穩(wěn)定,干嘛要升級。

你要知道,JDK現(xiàn)在多久發(fā)布一次?每次都有哪些BUG修復(fù)?有哪些性能提升?你用的這個第三方包,可是在5年前那個版本的JDK下開發(fā)完成的,而且那個開發(fā)第三方工具包的人有可能還死了。

保持現(xiàn)狀是一種惰性思維,它已經(jīng)麻痹了開發(fā)人員對項(xiàng)目變化帶來的風(fēng)險(xiǎn)評估。

如果將項(xiàng)目比做一輛汽車,它只是在不停地行駛,卻沒有定期保養(yǎng)。(重點(diǎn)是你不知道應(yīng)該保養(yǎng)哪些部件)

不要讓保持現(xiàn)狀的思維腐蝕了項(xiàng)目,讓項(xiàng)目慢慢變爛。

在一個迷念團(tuán)隊(duì)協(xié)作的時代,你不是一個人在挖坑。

未完待續(xù)......

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多