黃勇,從事近十年的 JavaEE 應(yīng)用開(kāi)發(fā)工作,現(xiàn)任阿里巴巴公司系統(tǒng)架構(gòu)師。對(duì)分布式服務(wù)架構(gòu)與大數(shù)據(jù)技術(shù)有深入研究,具有豐富的 B/S 架構(gòu)開(kāi)發(fā)經(jīng)驗(yàn)與項(xiàng)目實(shí)戰(zhàn)經(jīng)驗(yàn),擅長(zhǎng)敏捷開(kāi)發(fā)模式。國(guó)內(nèi)開(kāi)源軟件推動(dòng)者之一,Smart Framework 開(kāi)源框架創(chuàng)始人。熱愛(ài)技術(shù)交流,樂(lè)于分享自己的工作經(jīng)驗(yàn)。著有《架構(gòu)探險(xiǎn)——從零開(kāi)始寫Java Web框架》一書。
我的十年技術(shù)之路
和大家介紹下我目前所從事的工作。
我目前從事分布式服務(wù)架構(gòu)的設(shè)計(jì)與開(kāi)發(fā)工作,在阿里的大數(shù)據(jù)平臺(tái)上進(jìn)行應(yīng)用程序開(kāi)發(fā)。我們整個(gè)系統(tǒng)架構(gòu)采用了“前后端分離”的思想,前端關(guān)注數(shù)據(jù)展現(xiàn),后端關(guān)注數(shù)據(jù)生產(chǎn),通過(guò) REST服務(wù)將前后端整合起來(lái),所有的應(yīng)用都是無(wú)狀態(tài)的,可以做到水平擴(kuò)展。我們將整個(gè)系統(tǒng)拆分成許多“微服務(wù)”,服務(wù)之間通過(guò)統(tǒng)一的接口來(lái)調(diào)用,每個(gè)服務(wù)是通過(guò)容器技術(shù)進(jìn)行隔離,此外服務(wù)可發(fā)布到統(tǒng)一的服務(wù)管理平臺(tái)上,可通過(guò)該平臺(tái)監(jiān)控每個(gè)服務(wù)的運(yùn)行狀態(tài)與生命周期事件,并為服務(wù)調(diào)用者提供了服務(wù)發(fā)現(xiàn)的能力,可對(duì)服務(wù)進(jìn)行平滑升級(jí)。
阿里有許多優(yōu)秀的中間件與基礎(chǔ)服務(wù),可以快速幫助我們搭建應(yīng)用系統(tǒng),而且這些技術(shù)在阿里內(nèi)部全是開(kāi)源的,大家可以通過(guò)源碼和文檔學(xué)習(xí)到很多有價(jià)值的經(jīng)驗(yàn)。阿里也提供了濃厚的技術(shù)氛圍,每位同學(xué)都非常專注于自己的工作領(lǐng)域,大家對(duì)工作一絲不茍,相互配合,方向一致。
我是如何走上技術(shù)這條路的?
2006 年大學(xué)畢業(yè),我離開(kāi)了母校武漢理工大學(xué),在院長(zhǎng)薛勝軍老師的推薦下,我來(lái)到了上海,這個(gè)對(duì)于我來(lái)說(shuō)非常陌生的地方。我有幸加入了一家名為“動(dòng)量軟件”的創(chuàng)業(yè)公司,這家公司的老板曾經(jīng)是亞信科技的 CTO,他也是普元軟件的創(chuàng)始人兼 CTO,他的名字叫黃柳青,他也是薛老師的大學(xué)同學(xué)。于是就這樣,我的老板成為了我的老師,我習(xí)慣叫他黃老師,包括公司其他資深的同事也成為了我的老師,因?yàn)槲液芟胨麄兩砩蠈W(xué)到更多有價(jià)值的東西。
剛開(kāi)始工作的時(shí)候我學(xué)習(xí)了什么是云計(jì)算?什么是 SaaS、PaaS、IaaS?我們花了三年時(shí)間開(kāi)發(fā)了一款名為 ODE 的 PaaS 平臺(tái),讓用戶可以在該平臺(tái)上量身定制自己的軟件,最終為客戶提供基于 SaaS 的產(chǎn)品。確實(shí)很驕傲,那時(shí)我們已經(jīng)在做云了,只是沒(méi)想到后來(lái)云會(huì)在中國(guó)得到這么好的市場(chǎng),可能當(dāng)時(shí)只有黃老師一個(gè)人想到了吧。
在 2008 年,我為公司拿回了“第一桶金”,這也是我從程序員轉(zhuǎn)向項(xiàng)目經(jīng)理的里程碑。當(dāng)時(shí)我?guī)ьI(lǐng)團(tuán)隊(duì)遠(yuǎn)赴深圳,為國(guó)信證券公司開(kāi)發(fā)經(jīng)紀(jì)人管理系統(tǒng),這個(gè)項(xiàng)目對(duì)于我個(gè)人而言卻是一筆至高無(wú)上的財(cái)富,我開(kāi)始學(xué)習(xí)如何與人打交道,如何做需求分析,如何將需求轉(zhuǎn)變?yōu)榧夹g(shù),如何帶領(lǐng)團(tuán)隊(duì)小伙伴一起工作。學(xué)到了太多太多,但我依然選擇在我工作第四個(gè)年頭里離開(kāi)了動(dòng)量軟件,我剛加入動(dòng)量軟件的時(shí)候,公司只有 5 個(gè)人(包括老板和前臺(tái)),當(dāng)我離開(kāi)動(dòng)量軟件的時(shí)候,公司已經(jīng)有 200 人左右了。感謝黃老師!我在他身上學(xué)到了很多,他的思想和態(tài)度直到今天都還在影響著我。
我的第二份工作還是選擇了我最熟悉的證券金融行業(yè),同樣也是一家創(chuàng)業(yè)型公司,在這家公司里我擔(dān)任了技術(shù)經(jīng)理,管理了整個(gè)技術(shù)團(tuán)隊(duì),從項(xiàng)目的售前到售后,我都親自帶領(lǐng)團(tuán)隊(duì)來(lái)完成。雖然在這家公司我只做了兩年,但在這短短的時(shí)間里,我學(xué)會(huì)了如何提高開(kāi)發(fā)效率、如何培養(yǎng)技術(shù)團(tuán)隊(duì)、如何選拔技術(shù)人才、如何建立企業(yè)文化。但最后我發(fā)現(xiàn)了一個(gè)問(wèn)題,越是想做好,越是很難做好,為了做成一件事情需要做很多的嘗試,做事情缺乏正確并有效的方法。
回想我工作的前六年時(shí)間里,我一直都是在創(chuàng)業(yè)公司里成長(zhǎng),雖然可以快速學(xué)到東西,但似乎很難學(xué)到更加規(guī)范的做事方法。于是我選擇了新的工作機(jī)會(huì),來(lái)到了 TCL 通訊,這是一家相當(dāng)大的公司,公司的研發(fā)管理流程來(lái)源于法國(guó)阿里卡特公司。我在公司擔(dān)任 Java 架構(gòu)師職位,也算是整個(gè) Java 團(tuán)隊(duì)的技術(shù)負(fù)責(zé)人,雖然團(tuán)隊(duì)并不是特別地大。我在這家公司做了三年,學(xué)到了如何整合現(xiàn)有資源、如何按標(biāo)準(zhǔn)流程去做事、如何設(shè)計(jì)系統(tǒng)架構(gòu)、如何進(jìn)行異地工作、如何跨團(tuán)隊(duì)工作、如何用英文來(lái)溝通。說(shuō)實(shí)話,當(dāng)時(shí)我沒(méi)有任何的工作壓力,可以按時(shí)上下班,從來(lái)都不會(huì)加班。雖然自己空閑的時(shí)間很多,但我并沒(méi)有選擇去浪費(fèi)時(shí)間,而是開(kāi)始寫點(diǎn)技術(shù)博客,也正是因?yàn)檫@些技術(shù)文章,才改變了我后續(xù)的職業(yè)發(fā)展道路。
我清楚的記得,那是在 2013 年 9 月 1 日,我在開(kāi)源中國(guó)(oschina.net)網(wǎng)站發(fā)表了我人生的第一篇博文 《Smart Framework:輕量級(jí) Java Web 框架》,這篇文章影響了我后續(xù)兩年。其實(shí)說(shuō)句心里話,當(dāng)我第一次寫這篇文章時(shí),我心里是沒(méi)底的,這個(gè)框架只是根據(jù)自己的理解做出來(lái)的一個(gè)設(shè)想,當(dāng)時(shí)甚至連一行代碼都沒(méi)寫過(guò)。我的想法是先將這個(gè)思想發(fā)表出來(lái),讓大家討論起來(lái),我會(huì)做一個(gè)決策,然后再親自做具體實(shí)現(xiàn),最后我會(huì)將實(shí)現(xiàn)過(guò)程通過(guò)博文的方式展現(xiàn)給大家,后續(xù)大家會(huì)對(duì)我的實(shí)現(xiàn)進(jìn)行點(diǎn)評(píng),我會(huì)基于大家的建議進(jìn)行改善。整個(gè)開(kāi)源過(guò)程正好與敏捷的思想是一致的,有效溝通、小步快跑、擁抱變化、不斷改進(jìn)。
也許就是我的技術(shù)文章吸引了很多廣大讀者,這里面不排除想邀請(qǐng)我加入的其它公司。我在 2014 年離開(kāi)了 TCL 通訊,加入了易傳媒。為什么我要放棄如此舒適的工作環(huán)境,去加入一家還在不斷拼搏的企業(yè)呢?其實(shí)我看到的是未來(lái)互聯(lián)網(wǎng)的發(fā)展趨勢(shì),廣告程序化交易以及廣告與大數(shù)據(jù)的結(jié)合,未來(lái)最值錢的一定是數(shù)據(jù)。抱著這樣的信心,我加入了易傳媒,擔(dān)任系統(tǒng)架構(gòu)師職位。當(dāng)時(shí)易傳媒正處于技術(shù)轉(zhuǎn)型的初期,需要將 .Net 全部遷移到 Java,這件事情對(duì)于我而言是非常有挑戰(zhàn)的。我的做法是:第一步定義開(kāi)發(fā)規(guī)范與流程,第二步培養(yǎng)核心技術(shù)人員,第三步分階段進(jìn)行改造。僅半年時(shí)間,我們所有的產(chǎn)品成功地遷移到了 Java 平臺(tái),結(jié)果出乎大家的想象。公司市場(chǎng)也非常不錯(cuò),產(chǎn)品得到了業(yè)界的認(rèn)可,訂單數(shù)源源不斷,大家每天都很忙碌,但卻很開(kāi)心。而易傳媒的“易家人”企業(yè)文化,讓我所感動(dòng),不管是核心技術(shù)部門還是其它支持性部門,大家就像一家人一樣,你的事情就是我的事情。
直到 2015 年初,阿里巴巴與易傳媒建立了合作關(guān)系,兩家公司進(jìn)行了深度合作,易傳媒公司與阿里媽媽事業(yè)部進(jìn)行了整合,新阿里媽媽從此誕生了,于是我也成為了阿里巴巴的一員,目前負(fù)責(zé)阿里媽媽大數(shù)據(jù)品牌營(yíng)銷產(chǎn)品的系統(tǒng)架構(gòu)工作。就在兩家公司整合的過(guò)程中,我完成了人生中的處女作《架構(gòu)探險(xiǎn) —— 從零開(kāi)始寫 Java Web 框架》這本書,目前該書正在各大網(wǎng)上書店售賣,我真心希望這本書能對(duì)一些想成為架構(gòu)師的程序員們有所幫助,由于我個(gè)人水平有限,又是第一次寫書,寫得不好的地方還請(qǐng)大家多多包涵。
上面提到,寫博客給我?guī)?lái)的收獲頗多,那么我來(lái)分享下技術(shù)人如何寫博客,又應(yīng)該以怎樣的態(tài)度對(duì)待。
我認(rèn)為技術(shù)人員寫博客需要注意以下幾點(diǎn):
思路要清晰,文章要有明確的大綱與標(biāo)題。
對(duì)于實(shí)戰(zhàn)類型的文章,需要分步驟來(lái)描述。
多用短句,少用長(zhǎng)句,能一句話說(shuō)明白,就不用兩句話。
對(duì)于不太好理解的內(nèi)容,最好能打比方來(lái)說(shuō)明。
文章末尾需要有總結(jié),用最精辟的語(yǔ)言歸納出這篇文章的主要內(nèi)容。
寫博客首先是對(duì)自己所學(xué)知識(shí)的一個(gè)總結(jié),此外,也為其他讀者提供了很好的教程,知識(shí)得到了廣播與傳遞。
技術(shù)一條不歸路,選擇了這條路從未有過(guò)放棄的想法。
做了十年的技術(shù),我從來(lái)都沒(méi)有放棄過(guò)它,相反,我非常熱愛(ài)它,因?yàn)槲乙恢币詠?lái)都很喜歡學(xué)習(xí),希望能學(xué)到更多的東西,這樣遇到了具體的技術(shù)問(wèn)題,可以隨時(shí)從自己積累的知識(shí)庫(kù)中找到最佳的解決方案。此外,目前我在公司雖然不怎么寫代碼了,但我還是會(huì)利用自己工作閑暇之余寫一點(diǎn)開(kāi)源項(xiàng)目或者代碼框架等。
工作過(guò)很多大大小小的公司,那么公司最值錢的東西是什么呢?
我認(rèn)為是實(shí)實(shí)在在做事情的程序員們。
他們雖然工資不高,每天坐在位置上敲著代碼,在很多人眼中被稱為“屌絲”或“宅男”,但我認(rèn)為恰恰就是這些人,他們才是公司最有價(jià)值的人。
他們有自己的理想,希望能夠通過(guò)自己的努力,從中得到那一點(diǎn)點(diǎn)所謂的成就感;
他們需要理解產(chǎn)品經(jīng)理真正的意圖,把想法變成現(xiàn)實(shí),讓產(chǎn)品真正落地;
他們更容易把握細(xì)節(jié),而這些細(xì)節(jié)往往決定著產(chǎn)品的命運(yùn)與成??;
他們突如其來(lái)的跳槽,對(duì)我們的項(xiàng)目的交付有直接的影響;
他們?cè)谝黄鸸ぷ鞯臍夥眨荏w現(xiàn)技術(shù)公司的文化與底蘊(yùn)。
由此看來(lái),對(duì)程序員的重視是相當(dāng)有必要的,我們需要關(guān)心每一位程序員的職業(yè)發(fā)展,讓他們?cè)趫F(tuán)隊(duì)里能夠充分地發(fā)揮出自己的能力。
我們也需要對(duì)他們倍加關(guān)注,挖掘出有能力、肯吃苦、敢擔(dān)當(dāng)?shù)娜耍o他們更多的機(jī)會(huì),讓他們成為技術(shù)領(lǐng)袖。
互聯(lián)網(wǎng)技術(shù)公司需要大量這樣的程序員:
他們是一群有著技術(shù)信仰的人,他們是一群熱愛(ài)編程的人,他們是一群不解決問(wèn)題睡不好覺(jué)的人;
他們不是打雜的,不是外包,更不是工具;
他們不喜歡被忽悠,不喜歡被冷落,更不喜歡被驅(qū)動(dòng);
他們需要尊重,需要培養(yǎng),更需要激情!
具體說(shuō)說(shuō)程序員需要具備哪些素質(zhì)。
我個(gè)人是這樣理解真正的程序員的:
深愛(ài)技術(shù),一天不寫代碼手就會(huì)癢,就喜歡那種成就感;
為了一個(gè)問(wèn)題可以廢寢忘食,有時(shí)會(huì)在夢(mèng)中都能寫代碼;
代碼潔癖癥患者,喜歡優(yōu)雅代碼,寫代碼就像寫詩(shī)一樣;
善于分析問(wèn)題,能快速看清問(wèn)題的本質(zhì),并動(dòng)手解決它;
喜歡研究?jī)?yōu)秀源碼,學(xué)習(xí)大師的杰作,善于歸納與總結(jié);
有自己的開(kāi)源項(xiàng)目或技術(shù)博客,喜歡學(xué)習(xí),更喜歡分享;
會(huì)關(guān)注技術(shù)圈子的新聞動(dòng)態(tài),時(shí)常會(huì)參加線下技術(shù)沙龍;
知道軟件開(kāi)發(fā)不是一個(gè)人在戰(zhàn)斗,更需要的是團(tuán)隊(duì)協(xié)作;
保持良好健康的心態(tài),用一顆積極向上的心去擁抱變化。
十年的職場(chǎng)之路堅(jiān)持不易,分享下我的「IT 職場(chǎng)」經(jīng)驗(yàn)。
時(shí)光飛逝,我事業(yè)中第一個(gè)十年已然結(jié)束了。在這十年里,讓我收獲了很多,跟大家分享一下我在 IT 職場(chǎng)方面的一些個(gè)人經(jīng)驗(yàn),不一定對(duì)每個(gè)人都實(shí)用,請(qǐng)大家僅作參考吧。
大家既然都是做技術(shù)的,那我們不妨先從技術(shù)這個(gè)話題開(kāi)始說(shuō)起吧。我要與大家分享的第一點(diǎn)經(jīng)驗(yàn)就是:
1.把技術(shù)當(dāng)成工具
技術(shù)這東西,其實(shí)一點(diǎn)都不神秘,它只不過(guò)是一個(gè)工具,用這個(gè)工具可以幫助我們解決實(shí)際問(wèn)題,就這么簡(jiǎn)單。
我們每天在面對(duì)技術(shù),市面上也有很多技術(shù),真的沒(méi)有必要把這些技術(shù)都拿過(guò)來(lái)學(xué)習(xí)一遍,然后想辦法找個(gè)場(chǎng)景去應(yīng)用它。如果真的這樣做了,那么只能說(shuō)明技術(shù)不是工具,而是玩具,技術(shù)不是這樣玩的。
我們應(yīng)該從另一個(gè)角度來(lái)看待技術(shù),不妨從自己的實(shí)際工作環(huán)境出發(fā),現(xiàn)在需要什么,我們就學(xué)什么,而不要漫無(wú)目的的追求一些新技術(shù)。當(dāng)然,對(duì)于新技術(shù)還是需要有所關(guān)注的,至少需要知道這個(gè)新技術(shù)是干什么用的,而且還要善于總結(jié),將有價(jià)值的技術(shù)收集起來(lái),以備將來(lái)使用,當(dāng)需要使用的時(shí)候再來(lái)深入研究。
人的精力是有限的,人的生命也是短暫的,要善于利用自己的時(shí)間,合理地學(xué)習(xí)技術(shù)。
不要把技術(shù)看得那么重要,別把它當(dāng)回事兒,把它當(dāng)工具就行了,它就像我們寫字的筆一樣,用鉛筆能寫字,用鋼筆一樣能寫字。
作為一名技術(shù)人員,除了學(xué)習(xí)與應(yīng)用技術(shù)以外,還需要為自己做一個(gè)正確的職業(yè)規(guī)劃,清晰認(rèn)識(shí)自己究竟屬于哪種技術(shù)人才,是技術(shù)專家類型的,還是技術(shù)管理類型的。路到底該怎么走?需要自己做出決定。
在我們職業(yè)路線上,最重要的人莫過(guò)于老板(我指的老板可以是公司大老板,也可以是自己的頂頭上司),對(duì)待自己的老板,我也有一些經(jīng)驗(yàn):
2.把老板當(dāng)成情人
大家應(yīng)該非常清楚,情人是需要浪漫的,浪漫是需要驚喜的。老板其實(shí)跟情人一樣,也是需要驚喜的。我們做下屬的,要懂得找到合適的機(jī)會(huì)給老板帶來(lái)驚喜。我們跟情人談情說(shuō)愛(ài),這是一種很好的溝通方式,可別忽略了跟老板“談情說(shuō)愛(ài)”,我們需要與老板保持良好的溝通,這種溝通并不僅僅是溜須拍馬。
講一個(gè)真實(shí)的故事吧。記得曾經(jīng)我的一位同事,技術(shù)非常好,做東西非常快,質(zhì)量也很高,同事們都覺(jué)得他是牛人,但他從來(lái)都不懂得在老板面前表現(xiàn)自己,老板也只是覺(jué)得他是可以做事的,但升職加薪的事情往往總是不會(huì)優(yōu)先考慮他。
大家很定會(huì)問(wèn):怎樣在老板面前表現(xiàn)自己呢?其實(shí)方法有很多,由于篇幅有限,我先提供三招吧:
第一招:在給老板做程序演示的時(shí)候,不要只是單純的演示,不妨先用一個(gè) PPT,簡(jiǎn)單表達(dá)一下自己的解決方案,然后再做演示,這樣效果會(huì)好很多。老板會(huì)認(rèn)為自己是花了心思的,是想把事情做得更好的。
第二招:把自己每天的工作簡(jiǎn)單記錄一下,每周匯總一次,以郵件的形式發(fā)送給老板,讓老板知道自己每天在做什么。每月寫一篇本月工作總結(jié)與下月工作計(jì)劃,同樣發(fā)郵件給老板。年底可以寫一個(gè)年終工作總結(jié),打印出來(lái),悄悄地放在老板的桌子上。
第三招:借匯報(bào)工作為理由,定期請(qǐng)老板出去吃飯,制造面對(duì)面單獨(dú)溝通的機(jī)會(huì)。在談話過(guò)程中,強(qiáng)調(diào)自己愿意幫助老板分擔(dān)工作壓力。
對(duì)待老板其實(shí)很簡(jiǎn)單,只要能幫他做事,又能讓他開(kāi)心,他基本上就搞定了。老板搞定了,自己的職業(yè)發(fā)展才會(huì)平步青云。但千萬(wàn)別忽略了還有一群人,他們或許是自己的團(tuán)隊(duì)?wèi)?zhàn)友,或許是自己的競(jìng)爭(zhēng)對(duì)手,沒(méi)錯(cuò)!他們就是同事。如何處理同事關(guān)系呢?以下便是我的經(jīng)驗(yàn):
3. 把同事當(dāng)成小孩
處理與同事關(guān)系,其實(shí)比處理與老板關(guān)系要稍微復(fù)雜一點(diǎn),因?yàn)橥掠卸喾N身份,他們可以是隊(duì)友,也可以是對(duì)手。如果大家在一起做同一個(gè)項(xiàng)目,那么這樣的同事就是隊(duì)友;如果為了競(jìng)爭(zhēng)某個(gè)項(xiàng)目、崗位、資源,導(dǎo)致同級(jí)別的同事之間發(fā)生利益上的競(jìng)爭(zhēng),那么這樣的同事就是對(duì)手。
對(duì)于隊(duì)友而言,要學(xué)會(huì)主動(dòng)給他們提供幫助,讓大家能夠體會(huì)到團(tuán)隊(duì)協(xié)作的氣氛,在一起學(xué)習(xí),在一起成長(zhǎng),在一起分享。可以時(shí)常跟大家一起聚餐,買點(diǎn)零食讓大家品嘗。
隊(duì)友關(guān)系往往比較好處理,關(guān)鍵在于自己能否真正懂得去分享。很多技術(shù)人員,最不愿意的就是分享,因?yàn)閾?dān)心自己花了很多精力學(xué)到的知識(shí),分分鐘就被別人學(xué)會(huì)了,自己失去了優(yōu)勢(shì)。這種心態(tài)最好不要在團(tuán)隊(duì)里產(chǎn)生,這樣只會(huì)讓自己變得越來(lái)越封閉,越來(lái)越渺小,隊(duì)友們也會(huì)逐漸排擠自己。
對(duì)于對(duì)手而言,要想辦法讓自己成為他的兄弟,告訴他,咱們是兄弟,應(yīng)該相互幫助。如果有機(jī)會(huì),可以在老板面前,當(dāng)著對(duì)手的面,夸獎(jiǎng)自己的對(duì)手。做出這樣的行為,其實(shí)并不會(huì)讓老板覺(jué)得自己不如對(duì)手,而會(huì)讓老板認(rèn)為自己在用心去容納對(duì)手。大家在一起工作,就是一種緣分,都是跟老板打工的,真的沒(méi)有必要搞得不愉快。
其實(shí)同事就是自己的小伙伴,不妨把他們當(dāng)成是單純可愛(ài)的小孩吧,用自己的心去“收買”他們。
老板與同事,他們都是公司內(nèi)部的人,不管怎么說(shuō),大家都在同一條船上,大家可以關(guān)上門吵一架,只要事情能夠解決就行。但對(duì)于我們的客戶而言,就需要用另外一種方法來(lái)處理好關(guān)系了。我是這樣認(rèn)為的:
4. 把客戶當(dāng)成病人
客戶有需求,但沒(méi)有技術(shù),而我們有技術(shù)、有經(jīng)驗(yàn)、有產(chǎn)品,正好可以幫助他們實(shí)現(xiàn)需求,從而提高他們的工作效率,這樣客戶才會(huì)心甘情愿地把錢放入我們的口袋。所以,在客戶面前,我們要表現(xiàn)出高超的專業(yè)精神,不要被客戶牽著我們的鼻子走,我們?cè)诳蛻裘媲熬褪羌夹g(shù)權(quán)威,就需要這樣的自信。從服裝、言行、郵件、文檔等各個(gè)方面,都要做到專業(yè)。
我們打算把自己的產(chǎn)品賣給客戶的時(shí)候,千萬(wàn)不要一上來(lái)就對(duì)自己的產(chǎn)品夸夸其談,這往往會(huì)讓客戶感到厭煩。我們不妨先告訴客戶,他們已經(jīng)“生病”了,而且病得不輕,如果不及時(shí)用藥的話,后果將不堪設(shè)想。也就是說(shuō),要讓客戶意識(shí)到自己現(xiàn)在所面臨的困境,讓客戶緊張,當(dāng)他們正在思考如何應(yīng)對(duì)的時(shí)候,我們?cè)俑嬖V他們,“藥”已經(jīng)準(zhǔn)備好了,可以隨時(shí)服用。
要讓客戶有種雪中送炭的感覺(jué),這樣就對(duì)了,他們一定會(huì)主動(dòng)了解我們的產(chǎn)品。我們要做到這一切,必須花精力來(lái)分析行業(yè)現(xiàn)狀,揣測(cè)客戶老板們每天在想什么。如果有機(jī)會(huì)進(jìn)入客戶所在的公司工作一段時(shí)間,相信自己的感受會(huì)更加深入。
Java 會(huì)在很長(zhǎng)的一段時(shí)間內(nèi)是主流
為什么開(kāi)發(fā)Java Web都要用框架?
我個(gè)人覺(jué)得框架有以下幾點(diǎn)作用:
讓開(kāi)發(fā)更加高效,屏蔽底層技術(shù)細(xì)節(jié),讓開(kāi)發(fā)人員關(guān)注在具體業(yè)務(wù)上。
框架實(shí)際上也是一種規(guī)范,可以讓每位開(kāi)發(fā)人員保持同樣的編碼風(fēng)格。
會(huì)使用主流框架的開(kāi)發(fā)人員,在人才市場(chǎng)上比較好獲取。
現(xiàn)在做Java Web開(kāi)發(fā)都用哪些框架呢?
常用的比如Spring MVC、Struts2 等,國(guó)內(nèi)的 JFinal、Nutz 等也不錯(cuò),當(dāng)然Smart 也是一個(gè)很好的選擇。
有一定Web前端開(kāi)發(fā)經(jīng)驗(yàn)的人,很多都會(huì)有這么個(gè)想法:那些寫框架的人好厲害,什么時(shí)候我才能寫一個(gè)自己的框架呢?有時(shí)候看看別人的框架代碼,又覺(jué)得很復(fù)雜,對(duì)此我有一些建議以及新人學(xué)習(xí)需要什么基礎(chǔ)?分享一些好的方法。
對(duì)于接觸 Java 不太久的朋友,建議按照以下幾個(gè)步驟來(lái)學(xué)習(xí):
學(xué)習(xí) Java 基礎(chǔ)語(yǔ)法與核心技術(shù),包括 Servlet、JSP、JDBC 等。
熟練使用流行開(kāi)源框架,包括Spring、MyBatis 等。
研究開(kāi)源框架源碼,并吸取其中優(yōu)秀的架構(gòu)。
此外,在學(xué)習(xí)的過(guò)程當(dāng)中,建議做學(xué)習(xí)筆記,最好能通過(guò)博客的方式來(lái)記錄自己的收獲。
使用 Python、Perl、PHP、Ruby 等腳本語(yǔ)言開(kāi)發(fā) Web 程序,跟使用 Java 開(kāi)發(fā) Web 程序相比有什么不同或者優(yōu)劣?
前者屬于動(dòng)態(tài)語(yǔ)言,無(wú)需編譯,可通過(guò)解釋的方式來(lái)運(yùn)行,而且 Java 需要首先通過(guò)編譯,將源文件轉(zhuǎn)為字節(jié)碼,且載入 Java 虛擬機(jī)才能運(yùn)行,相對(duì)來(lái)說(shuō),Java 對(duì)環(huán)境的要求較高,但 Java 具備更強(qiáng)的面向?qū)ο竽芰?。此外,Java 還擁有較廣的開(kāi)源社區(qū)以及流行的開(kāi)源中間件。因此,如果是做大型系統(tǒng),建議使用 Java 來(lái)開(kāi)發(fā),而并非那些腳本語(yǔ)言。
針對(duì) Web,Java、PHP、Python、.NET 之中未來(lái)發(fā)展前景最好的會(huì)是什么?
我認(rèn)為 Java 在未來(lái)還會(huì)有一段很長(zhǎng)的路,需要在語(yǔ)言本身上做到更加輕量級(jí),用最少的代碼來(lái)實(shí)現(xiàn)目標(biāo)功能;PHP 相對(duì)來(lái)說(shuō)會(huì)比較平穩(wěn),它的特點(diǎn)非常突出,上手快且易于開(kāi)發(fā) Web 項(xiàng)目;Python仍然不會(huì)有太大的用戶群體;.NET 加入開(kāi)源社區(qū)太晚,且較 Java 而言并沒(méi)有太強(qiáng)的優(yōu)勢(shì),可能會(huì)走下坡路。
在軟件開(kāi)發(fā)中有很多的設(shè)計(jì)模式,也有一些很高冷,談?wù)勎覍?duì)軟件設(shè)計(jì)的理解,以及讓一些設(shè)計(jì)原則接地氣。
了解設(shè)計(jì)模式的朋友們,想必都聽(tīng)說(shuō)過(guò)“六大設(shè)計(jì)原則”吧。其實(shí)最經(jīng)典的 23 種設(shè)計(jì)模式中或多或少地都在使用這些設(shè)計(jì)原則,也就是說(shuō),設(shè)計(jì)模式是站在設(shè)計(jì)原則的基礎(chǔ)之上的。所以在學(xué)習(xí)設(shè)計(jì)模式之前,很有必要對(duì)這些設(shè)計(jì)原則先做一下了解。
GoF(四人幫),傳說(shuō)中的四位大神們,他們聯(lián)手搞出了一套設(shè)計(jì)模式,堪稱 OOD(面向?qū)ο笤O(shè)計(jì))的經(jīng)典之作!震驚了整個(gè)軟件開(kāi)發(fā)領(lǐng)域。但這四個(gè)老家伙非常怪異,總是喜歡顯擺一些高深的理論,甚至有時(shí)候不說(shuō)人話,十分讓人費(fèi)解。
除了最經(jīng)典的六大設(shè)計(jì)原則以外,還有一些其他的設(shè)計(jì)原則也非常重要。我將盡可能地解釋這些晦澀的理論,希望看完之后,會(huì)讓您對(duì)這些設(shè)計(jì)原則稍微加深一些理解。若有不正確的地方,懇請(qǐng)大家指正!
六大設(shè)計(jì)原則
先看一幅圖吧:

這幅圖清晰地表達(dá)了六大設(shè)計(jì)原則,但僅限于它們叫什么名字而已,它們具體是什么意思呢?下面我將從原文、譯文、理解、應(yīng)用,這四個(gè)方面分別進(jìn)行闡述。
1.單一職責(zé)原則(Single Responsibility Principle - SRP)
原文:There should never be more than one reason for a class to change.?
譯文:永遠(yuǎn)不應(yīng)該有多于一個(gè)原因來(lái)改變某個(gè)類。?
理解:對(duì)于一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因。說(shuō)白了就是,不同的類具備不同的職責(zé),各施其責(zé)。這就好比一個(gè)團(tuán)隊(duì),大家分工協(xié)作,互不影響,各做各的事情。?
應(yīng)用:當(dāng)我們做系統(tǒng)設(shè)計(jì)時(shí),如果發(fā)現(xiàn)有一個(gè)類擁有了兩種的職責(zé),那就問(wèn)自己一個(gè)問(wèn)題:可以將這個(gè)類分成兩個(gè)類嗎?如果真的有必要,那就分吧。千萬(wàn)不要讓一個(gè)類干的事情太多!
2.開(kāi)放封閉原則(Open Closed Principle - OCP)
原文:Software entities like classes, modules and functions should be open for extension but closed for modifications.?
譯文:軟件實(shí)體,如:類、模塊與函數(shù),對(duì)于擴(kuò)展應(yīng)該是開(kāi)放的,但對(duì)于修改應(yīng)該是封閉的。?
理解:簡(jiǎn)言之,對(duì)擴(kuò)展開(kāi)放,對(duì)修改封閉。換句話說(shuō),可以去擴(kuò)展類,但不要去修改類。?
應(yīng)用:當(dāng)需求有改動(dòng),要修改代碼了,此時(shí)您要做的是,盡量用繼承或組合的方式來(lái)擴(kuò)展類的功能,而不是直接修改類的代碼。當(dāng)然,如果能夠確保對(duì)整體架構(gòu)不會(huì)產(chǎn)生任何影響,那么也沒(méi)必要搞得那么復(fù)雜了,直接改這個(gè)類吧。
3.里氏替換原則(Liskov Substitution Principle - LSP)
原文:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.?
譯文:使用基類的指針或引用的函數(shù),必須是在不知情的情況下,能夠使用派生類的對(duì)象。?
理解:父類能夠替換子類,但子類不一定能替換父類。也就是說(shuō),在代碼中可以將父類全部替換為子類,程序不會(huì)報(bào)錯(cuò),也不會(huì)在運(yùn)行時(shí)出現(xiàn)任何異常,但反過(guò)來(lái)卻不一定成立。?
應(yīng)用:在繼承類時(shí),務(wù)必重寫(Override)父類中所有的方法,尤其需要注意父類的 protected 方法(它們往往是讓您重寫的),子類盡量不要暴露自己的 public 方法供外界調(diào)用。
該原則由麻省理工學(xué)院的 Barbara Liskov 女士提出,她是美國(guó)第一位獲取計(jì)算機(jī)博士學(xué)位的女性,曾經(jīng)也獲得過(guò)計(jì)算機(jī)圖靈獎(jiǎng)。
4.最少知識(shí)原則(Least Knowledge Principle - LKP)
原文:Only talk to you immediate friends.?
譯文:只與你最直接的朋友交流。?
理解:盡量減少對(duì)象之間的交互,從而減小類之間的耦合。簡(jiǎn)言之,一定要做到:低耦合,高內(nèi)聚。?
應(yīng)用:在做系統(tǒng)設(shè)計(jì)時(shí),不要讓一個(gè)類依賴于太多的其他類,需盡量減小依賴關(guān)系,否則,您死都不知道自己怎么死的。
該原則也稱為“迪米特法則(Law of Demeter)”,由 Ian Holland 提出。這個(gè)人不太愿意和陌生人說(shuō)話,只和他走得最近的朋友們交流。
5.接口隔離原則(Interface Segregation Principle - ISP)
原文:The dependency of one class to another one should depend on the smallest possible interface.?
譯文:一個(gè)類與另一個(gè)類之間的依賴性,應(yīng)該依賴于盡可能小的接口。?
理解:不要對(duì)外暴露沒(méi)有實(shí)際意義的接口。也就是說(shuō),接口是給別人調(diào)用的,那就不要去為難別人了,盡可能保證接口的實(shí)用性吧。她好,我也好。?
應(yīng)用:當(dāng)需要對(duì)外暴露接口時(shí),需要再三斟酌,如果真的沒(méi)有必要對(duì)外提供的,就刪了吧。一旦您提供了,就意味著,您將來(lái)要多做一件事情,何苦要給自己找事做呢。
6.依賴倒置原則(Dependence Inversion Principle - DIP)
原文:High level modules should not depends upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.?
譯文:高層模塊不應(yīng)該依賴于低層模塊,它們應(yīng)該依賴于抽象。抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。?
理解:應(yīng)該面向接口編程,不應(yīng)該面向?qū)崿F(xiàn)類編程。面向?qū)崿F(xiàn)類編程,相當(dāng)于就是論事,那是正向依賴(正常人思維);面向接口編程,相當(dāng)于通過(guò)事物表象來(lái)看本質(zhì),那是反向依賴,即依賴倒置(程序員思維)。?
應(yīng)用:并不是說(shuō),所有的類都要有一個(gè)對(duì)應(yīng)的接口,而是說(shuō),如果有接口,那就盡量使用接口來(lái)編程吧。
將以上六大原則的英文首字母拼在一起就是 SOLID(穩(wěn)定的),所以也稱之為 SOLID 原則。
只有滿足了這六大原則,才能設(shè)計(jì)出穩(wěn)定的軟件架構(gòu)!但它們畢竟只是原則,只是四人幫給我們的建議,有些時(shí)候我們還是要學(xué)會(huì)靈活應(yīng)變,千萬(wàn)不要生搬硬套,否則只會(huì)把簡(jiǎn)單問(wèn)題復(fù)雜化,切記!
補(bǔ)充設(shè)計(jì)原則
1.組合/聚合復(fù)用原則(Composition/Aggregation Reuse Principle - CARP)
當(dāng)要擴(kuò)展類的功能時(shí),優(yōu)先考慮使用組合,而不是繼承。這條原則在 23 種經(jīng)典設(shè)計(jì)模式中頻繁使用,如:代理模式、裝飾模式、適配器模式等??梢?jiàn)江湖地位非常之高!
2.無(wú)環(huán)依賴原則(Acyclic Dependencies Principle - ADP)
當(dāng) A 模塊依賴于 B 模塊,B 模塊依賴于 C 模塊,C 依賴于 A 模塊,此時(shí)將出現(xiàn)循環(huán)依賴。在設(shè)計(jì)中應(yīng)該避免這個(gè)問(wèn)題,可通過(guò)引入“中介者模式”解決該問(wèn)題。
3.共同封裝原則(Common Closure Principle - CCP)
應(yīng)該將易變的類放在同一個(gè)包里,將變化隔離出來(lái)。該原則是“開(kāi)放-封閉原則”的延生。
4.共同重用原則(Common Reuse Principle - CRP)
如果重用了包中的一個(gè)類,那么也就相當(dāng)于重用了包中的所有類,我們要盡可能減小包的大小。
5.好萊塢原則(Hollywood Principle - HP)
好萊塢明星的經(jīng)紀(jì)人一般都很忙,他們不想被打擾,往往會(huì)說(shuō):Don’t call me, I’ll call you. 翻譯為:不要聯(lián)系我,我會(huì)聯(lián)系你。對(duì)應(yīng)于軟件設(shè)計(jì)而言,最著名的就是“控制反轉(zhuǎn)”(或稱為“依賴注入”),我們不需要在代碼中主動(dòng)的創(chuàng)建對(duì)象,而是由容器幫我們來(lái)創(chuàng)建并管理這些對(duì)象。
其他設(shè)計(jì)原則
1.不要重復(fù)你自己(Don’t repeat yourself - DRY)
不要讓重復(fù)的代碼到處都是,要讓它們足夠的重用,所以要盡可能地封裝。
2.保持它簡(jiǎn)單與傻瓜(Keep it simple and stupid - KISS)
不要讓系統(tǒng)變得復(fù)雜,界面簡(jiǎn)潔,功能實(shí)用,操作方便,要讓它足夠的簡(jiǎn)單,足夠的傻瓜。
3.高內(nèi)聚與低耦合(High Cohesion and Low Coupling - HCLC)
模塊內(nèi)部需要做到內(nèi)聚度高,模塊之間需要做到耦合度低。
4.慣例優(yōu)于配置(Convention over Configuration - COC)
盡量讓慣例來(lái)減少配置,這樣才能提高開(kāi)發(fā)效率,盡量做到“零配置”。很多開(kāi)發(fā)框架都是這樣做的。
5.命令查詢分離(Command Query Separation - CQS)
在定義接口時(shí),要做到哪些是命令,哪些是查詢,要將它們分離,而不要揉到一起。
6.關(guān)注點(diǎn)分離(Separation of Concerns - SOC)
將一個(gè)復(fù)雜的問(wèn)題分離為多個(gè)簡(jiǎn)單的問(wèn)題,然后逐個(gè)解決這些簡(jiǎn)單的問(wèn)題,那么這個(gè)復(fù)雜的問(wèn)題就解決了。難就難在如何進(jìn)行分離。
7.契約式設(shè)計(jì)(Design by Contract - DBC)
模塊或系統(tǒng)之間的交互,都是基于契約(接口或抽象)的,而不要依賴于具體實(shí)現(xiàn)。該原則建議我們要面向契約編程。
8.你不需要它(You aren’t gonna need it - YAGNI)
不要一開(kāi)始就把系統(tǒng)設(shè)計(jì)得非常復(fù)雜,不要陷入“過(guò)度設(shè)計(jì)”的深淵。應(yīng)該讓系統(tǒng)足夠的簡(jiǎn)單,而卻又不失擴(kuò)展性,這是其中的難點(diǎn)。。
一個(gè)成功的項(xiàng)目,離不開(kāi)每個(gè)人的努力,分享下我曾經(jīng)的項(xiàng)目管理經(jīng)驗(yàn)。
給大家提出以下 10 點(diǎn)建議及其目標(biāo):
Sprint 第一天,需要將目標(biāo)定義清楚,并讓團(tuán)隊(duì)所有人都知道「確保建立一致的目標(biāo)并使之明確」;
若出現(xiàn)需求變更,則優(yōu)先排到下次迭代,特殊情況需特殊處理「確保本次迭代可以按時(shí)完工」;
Scrum Master 將迭代中的需求分解為任務(wù),每個(gè)任務(wù)只能有一個(gè)任務(wù)負(fù)責(zé)人,且不超過(guò)一個(gè)人天「確保每日任務(wù)可評(píng)估」;
讓 Product Owner 直接與相關(guān)開(kāi)發(fā)人員確定需求,Scrum Master 需一同參與「確保需求與實(shí)現(xiàn)不會(huì)發(fā)生偏差」;
每日定時(shí)站會(huì),時(shí)長(zhǎng)不超過(guò) 15 分鐘,規(guī)模不要太大「確保任務(wù)完成情況與計(jì)劃保持一致」;
每日進(jìn)行一次代碼評(píng)審,由 Scrum Master 負(fù)責(zé),并在次日將評(píng)審結(jié)果通知給相關(guān)開(kāi)發(fā)人員「確保代碼質(zhì)量不要下降」;
各個(gè)團(tuán)隊(duì)的 Scrum Master 保持每日溝通一次,時(shí)間不要超過(guò) 15 分鐘「確保項(xiàng)目管理不會(huì)出現(xiàn)風(fēng)險(xiǎn)」;
每次迭代結(jié)束,讓大家稍微放松一下,可提供一些團(tuán)隊(duì)活動(dòng),比如聚餐「確保團(tuán)隊(duì)能夠更加凝聚」;
Scrum Master 需要給團(tuán)隊(duì)一些承諾,比如項(xiàng)目獎(jiǎng)金或特殊福利等「確保團(tuán)隊(duì)更加有激情」;
對(duì)于情緒異常的員工,Scrum Master 需及時(shí)與其溝通「確保不要讓一個(gè)人的情緒影響整個(gè)團(tuán)隊(duì)」;
此外,作為項(xiàng)目管理者,需要不斷在團(tuán)隊(duì)中加強(qiáng)以下5點(diǎn)文化:
方向一致
當(dāng)面溝通
全情投入
充分信任
說(shuō)到做到
真正的開(kāi)源并非只是代碼的開(kāi)源,而是思想的開(kāi)源
談?wù)勎覍?duì)「開(kāi)源」的看法,國(guó)內(nèi)的開(kāi)源的現(xiàn)在如何,對(duì)比國(guó)外呢?
我個(gè)人認(rèn)為,真正的開(kāi)源并非只是代碼的開(kāi)源,而是思想的開(kāi)源。在做開(kāi)源項(xiàng)目之前,建議能將自己的想法共享出來(lái),而不是 埋頭閉門造車。我不反對(duì)“重造輪子”,因?yàn)槲覀冃枰玫妮喿?,輪子好了車子才能跑得快。凡是有利也有弊,我們也不能盲目地選擇開(kāi)源技術(shù),因?yàn)椴⒉皇沁m合 別人的技術(shù)就適合自己,而是需要根據(jù)自身的需求,選擇最適合的開(kāi)源技術(shù),搭建恰如其分的架構(gòu)。
有大量的新技術(shù),我首先會(huì)去關(guān)注它,了解它是做什么的,可以解決什么問(wèn)題,但我一開(kāi)始絕不會(huì)去深入研究它,更不會(huì)去看它的源碼,因?yàn)橐坏┯龅竭@方面的需求場(chǎng)景,我就會(huì)從這個(gè)“知識(shí)庫(kù)”中去尋找最好的解決方案,如果仍然尋找不到最合適的開(kāi)源技術(shù),我才會(huì)嘗試自己去實(shí)現(xiàn)。
技術(shù)人的歸途
走技術(shù)這條路,歸途是什么?是否轉(zhuǎn)型又該如何抉擇呢?
至少有好幾條路線是可以走的,比如:深入技術(shù)、轉(zhuǎn)型做產(chǎn)品、轉(zhuǎn)型做管理等,需要根據(jù)自己的特長(zhǎng)和性格來(lái)選擇,做自己喜歡的事情。
從技術(shù)轉(zhuǎn)管理,對(duì)自身的要求比較高,說(shuō)具體點(diǎn),需要看自己的情商,為人處世的經(jīng)驗(yàn),與人溝通的技巧,自己也需要有足夠的胸懷,去包容一些事情,還需要自己有足夠的人格魅力去吸引別人,讓別人愿意跟著你一起做事。管理有些東西是很難從書本上學(xué)到的,但一些經(jīng)典的管理理論是必須要去學(xué)的。
相比較而言,繼續(xù)深入技術(shù)或者從技術(shù)轉(zhuǎn)產(chǎn)品會(huì)容易一些了,因?yàn)楹芏鄷r(shí)候都不太需要與人打交道。
更多的干貨也會(huì)在我們的大神交流群:561614305? 里面會(huì)有定期的資料分享和大神之間交流的火花。