在我眼里,也經(jīng)常會(huì)把程序員分成兩類(lèi):一種是我等這種寫(xiě)業(yè)務(wù)代碼的程序員,另外一種是研究高深算法、造“輪子”的“科學(xué)家”...
襄城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),襄城網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為襄城千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的襄城做網(wǎng)站的公司定做!
將他們稱(chēng)之為科學(xué)家是有些夸張,第一次冒出這樣的想法是參加一個(gè)技術(shù)大會(huì),當(dāng)別的嘉賓都在分享開(kāi)發(fā)、設(shè)計(jì)、架構(gòu)、管理方面的經(jīng)驗(yàn)時(shí),一名在騰訊工作的算法工程師(應(yīng)該已經(jīng)是一個(gè)小領(lǐng)導(dǎo)了),他上臺(tái)分享了一些諸如:滑動(dòng)平均自回歸模型、神經(jīng)網(wǎng)絡(luò)基因表達(dá)式編程、SVM回歸機(jī)集成學(xué)習(xí)...坐在臺(tái)下的我第一次冒出這樣的念頭:“這**是科學(xué)家研究的東西吧?!?/p>
當(dāng)然,倒也不能說(shuō)寫(xiě)業(yè)務(wù)代碼就很 low,寫(xiě)業(yè)務(wù)代碼也不是想象中那么簡(jiǎn)單的。
寫(xiě)業(yè)務(wù)相關(guān)的代碼,必須了解業(yè)務(wù)流程,還需要了解業(yè)務(wù)人員心里是怎么想的,也就是業(yè)務(wù)出發(fā)點(diǎn)是什么樣子的。
比如我最近遇到一個(gè)需求,過(guò)程大概是這樣的:銷(xiāo)售人員在賣(mài)一款產(chǎn)品,這款產(chǎn)品非常火,有些優(yōu)秀的銷(xiāo)售人員一周可能能賣(mài)出去幾百上千單;結(jié)果我們接到一個(gè)需求,要限制每個(gè)代理人的銷(xiāo)售數(shù)量,比如每人只能賣(mài) 10 個(gè)(之前已經(jīng)賣(mài)掉的不算);這就讓我們非常奇怪,本來(lái)賣(mài)的好好的,為什么要做這個(gè)限制呢?這個(gè)需求看起來(lái)就非常的不合理。
后來(lái)業(yè)務(wù)人員和我們解釋了一下原因:因?yàn)檫@款產(chǎn)品公司不掙錢(qián),銷(xiāo)售人員為了推這個(gè)產(chǎn)品,花在別的產(chǎn)品上的時(shí)間就少了,所以出這個(gè)功能,就是讓銷(xiāo)售人員“收收心”,把精力放在其他產(chǎn)品上。
這么一解釋?zhuān)覀兙土⒖堂靼琢?;所以如果你不明白業(yè)務(wù)的時(shí)候,看著需求敲代碼也是非常容易出錯(cuò)的。
有些人會(huì)認(rèn)為業(yè)務(wù)邏輯就是一堆 if-else,但是我認(rèn)為在實(shí)際工作中,這些 if-else 也是非常難做到的。
業(yè)務(wù)邏輯是人設(shè)計(jì)的,業(yè)務(wù)邏輯難不可怕,可怕的是它不嚴(yán)謹(jǐn)和變化快;業(yè)務(wù)邏輯和那些確定性的東西不一樣,比如我們寫(xiě)好的代碼 if-else 兩個(gè)分支,那么再怎么也不會(huì)跳出這個(gè)范圍,業(yè)務(wù)邏輯就不一樣了,它是非常靈活的、不確定的,業(yè)務(wù)機(jī)會(huì)來(lái)的快消失的也快,我們很難開(kāi)發(fā)出來(lái)一套全面的、完善的、靈活的的系統(tǒng),去應(yīng)對(duì)將來(lái)可能會(huì)發(fā)生的需求。
所以在開(kāi)發(fā)過(guò)程中,如果可以將業(yè)務(wù)流程拆分成多個(gè)組件模型,組件和組件配合完成一個(gè)完成的業(yè)務(wù)流程;當(dāng)業(yè)務(wù)發(fā)生變化或有新業(yè)務(wù)的時(shí)候,只需要重新編排這些組件,或?qū)δ骋粋€(gè)組件做少量更改,就可以滿(mǎn)足業(yè)務(wù)變化;如果能做到這個(gè)程度,也是非常不容易的。
在這個(gè)過(guò)程中,你需要做到高內(nèi)聚低耦合,避免過(guò)度抽象,從業(yè)務(wù)流程和動(dòng)機(jī)出發(fā),已滿(mǎn)足業(yè)務(wù)需要為主;既然做不了“科學(xué)家”,我們就努力把業(yè)務(wù)代碼寫(xiě)好把。
我將持續(xù)分享Java開(kāi)發(fā)、架構(gòu)設(shè)計(jì)、程序員職業(yè)發(fā)展等方面的見(jiàn)解,希望能得到你的關(guān)注。
首先,我認(rèn)為寫(xiě)業(yè)務(wù)代碼不“l(fā)ow”,但是大部分不假思索拷貝粘貼的業(yè)務(wù)代碼比較“l(fā)ow”,換句話說(shuō)就是所謂的五年工作經(jīng)驗(yàn)就是把第一年的工作重復(fù)了五遍。
技術(shù)人員成長(zhǎng)一般有兩條線,一條是成為技術(shù)專(zhuān)家,一條是成為領(lǐng)域?qū)<?。所謂的轉(zhuǎn)管理我理解也就是領(lǐng)域?qū)<?,畢竟不懂得領(lǐng)域知識(shí)是無(wú)法做好管理的,比如說(shuō)你是互聯(lián)網(wǎng)金融某個(gè)業(yè)務(wù)部門(mén)的leader,那么你肯定要懂金融。領(lǐng)域知識(shí)就是在不斷的寫(xiě)業(yè)務(wù)代碼和思考中積累起來(lái)。
還有一個(gè)問(wèn)題就是如何定義業(yè)務(wù),比如說(shuō)“實(shí)現(xiàn)一個(gè)修改訂單功能”,這是一個(gè)業(yè)務(wù)需求,看起來(lái)很low,但是如果業(yè)務(wù)需求改成“實(shí)現(xiàn)一個(gè)修改訂單功能,要求在有限資源的情況下并發(fā)10k,響應(yīng)時(shí)間不高于10ms”,那這個(gè)需求就有挑戰(zhàn)。說(shuō)這個(gè)問(wèn)題想說(shuō)明白一件事情,如果做業(yè)務(wù)不要停留的在業(yè)務(wù)表面,僅僅滿(mǎn)足于實(shí)現(xiàn)功能,要主動(dòng)思考。
最后總結(jié)一下,沒(méi)有最好的技術(shù),只有最適合業(yè)務(wù)的技術(shù)。技術(shù)是內(nèi)功,業(yè)務(wù)是招式,內(nèi)功不足,后續(xù)成長(zhǎng)乏力,沒(méi)有招式,內(nèi)功也不能發(fā)揮威力。這是也很多互聯(lián)網(wǎng)創(chuàng)業(yè)公司做大了之后要技術(shù)轉(zhuǎn)型的原因。
作為一個(gè)程序員,我也是寫(xiě)代碼的,我不覺(jué)得寫(xiě)業(yè)務(wù)代碼很low。
1.首先大家所認(rèn)為的業(yè)務(wù)代碼就是一些和業(yè)務(wù)相關(guān)的增刪改查,涉及到的技術(shù)點(diǎn)相對(duì)來(lái)說(shuō)是固定的,寫(xiě)熟了之后,就是復(fù)制,粘貼,不存在什么技術(shù)阻礙,很多人就覺(jué)得非常的簡(jiǎn)單,沒(méi)有技術(shù)含量,做這些工作的人也顯得非常的low,如果你也是這樣認(rèn)為的,那你就錯(cuò)了,因?yàn)閷?xiě)業(yè)務(wù)代碼的基本都是初級(jí),中級(jí)的程序員,工作經(jīng)驗(yàn)有限,不具備寫(xiě)一些公共方法和接口的能力,但是并不代表以后能力不會(huì)提升,如果持續(xù)努力,也會(huì)成長(zhǎng)為高級(jí)程序員或是架構(gòu)師,誰(shuí)天生就是高級(jí)程序員呢,不都是一點(diǎn)點(diǎn)積累起來(lái)的嗎?而且就算是寫(xiě)業(yè)務(wù)代碼也不能就是low呀,有些業(yè)務(wù)場(chǎng)景是非常復(fù)雜的,邏輯必須十分嚴(yán)謹(jǐn),稍有差錯(cuò)可能就會(huì)出現(xiàn)bug,對(duì)公司造成巨大的損失,不是寫(xiě)業(yè)務(wù)代碼就是很容易的。
2.除了業(yè)務(wù)代碼就是非業(yè)務(wù)代碼了,比如開(kāi)發(fā)數(shù)據(jù)庫(kù),開(kāi)發(fā)框架,或是寫(xiě)一些公共的方法或是接口,供初級(jí)開(kāi)發(fā)者調(diào)用。寫(xiě)非業(yè)務(wù)代碼的人技術(shù)也不一定就非常的厲害,因?yàn)榫退闶情_(kāi)發(fā)框架或是數(shù)據(jù)庫(kù)之類(lèi)的項(xiàng)目,也不一定都是高級(jí)開(kāi)發(fā),也會(huì)有一些水平較低的開(kāi)發(fā),因?yàn)閷?xiě)業(yè)務(wù)代碼還是非業(yè)務(wù)代碼和項(xiàng)目也有關(guān)系,如果你們團(tuán)隊(duì)開(kāi)發(fā)的是開(kāi)發(fā)框架或是數(shù)據(jù)庫(kù)這種的項(xiàng)目,那么你們團(tuán)隊(duì)沒(méi)有人寫(xiě)業(yè)務(wù)代碼,也不能說(shuō)明你們團(tuán)隊(duì)每個(gè)人技術(shù)都很厲害,只是項(xiàng)目性質(zhì)不一樣罷了。
3.業(yè)務(wù)代碼這個(gè)詞看你的理解吧,我認(rèn)為其實(shí)所有的代碼都可以成為是業(yè)務(wù)代碼,無(wú)論開(kāi)發(fā)什么產(chǎn)品,都是有業(yè)務(wù)需求的,有了需求才有開(kāi)發(fā)的動(dòng)力,對(duì)于開(kāi)發(fā)數(shù)據(jù)庫(kù)來(lái)說(shuō),數(shù)據(jù)庫(kù)的需求就是業(yè)務(wù),對(duì)于開(kāi)發(fā)框架來(lái)說(shuō),框架的功能就是業(yè)務(wù),所以我認(rèn)為廣義上來(lái)講都是業(yè)務(wù)代碼,沒(méi)有非業(yè)務(wù)代碼這一說(shuō),所以具體看你認(rèn)為業(yè)務(wù)的定義是什么了。不過(guò)無(wú)論如何也不應(yīng)該去嘲笑或是去貶低別人吧,嘲笑或是貶低一類(lèi)人就更不應(yīng)該了。
業(yè)務(wù)程序開(kāi)發(fā)相對(duì)于底層基礎(chǔ)架構(gòu)層的程序開(kāi)發(fā)有所不同:
業(yè)務(wù)開(kāi)發(fā)的時(shí)間比較緊,變化快。
這個(gè)特點(diǎn)導(dǎo)致程序員沒(méi)有時(shí)間重構(gòu)代碼,或者不愿意重構(gòu)代碼,而是用最簡(jiǎn)單粗暴的復(fù)制黏貼的方式快速實(shí)現(xiàn)業(yè)務(wù)邏輯。其實(shí)所有的復(fù)制黏貼都意味著需要重構(gòu)。
底層系統(tǒng)的開(kāi)發(fā),一般是架構(gòu)師和高級(jí)程序員來(lái)設(shè)計(jì)和控制項(xiàng)目時(shí)間。相對(duì)來(lái)說(shuō),開(kāi)發(fā)周期長(zhǎng),變化緩慢。會(huì)更加注重架構(gòu)的合理性和穩(wěn)定性,而且會(huì)不斷重構(gòu)和改進(jìn)。
業(yè)務(wù)開(kāi)發(fā)一旦完成,只要平穩(wěn)運(yùn)行就不會(huì)有人再回來(lái)補(bǔ)技術(shù)債務(wù),不會(huì)把它寫(xiě)得更好。除非這個(gè)業(yè)務(wù)爆發(fā)了,不得不從新架構(gòu)以支持更高的并發(fā)。如果上線之后表現(xiàn)不佳,很可能下線不再維護(hù)。所以公司也不太愿意花太多精力在一個(gè)還沒(méi)有被市場(chǎng)認(rèn)可的產(chǎn)品項(xiàng)目上。
而底層架構(gòu)框架的項(xiàng)目會(huì)在不同的產(chǎn)品項(xiàng)目中不斷應(yīng)用。不斷地進(jìn)化。就像Spring之類(lèi)的開(kāi)源框架一樣,不斷的升級(jí)和完善。
相對(duì)來(lái)說(shuō),業(yè)務(wù)開(kāi)發(fā)程序員會(huì)花大量的時(shí)間學(xué)習(xí)和理解業(yè)務(wù)知識(shí);而底層框架程序員更多的時(shí)間在學(xué)習(xí)技術(shù)架構(gòu)。如果業(yè)務(wù)知識(shí)在行業(yè)內(nèi)通用,比如財(cái)務(wù),金融行業(yè)知識(shí)。那么長(zhǎng)期的積累對(duì)業(yè)務(wù)開(kāi)發(fā)也是很有幫助的。如果業(yè)務(wù)是很小眾的,甚至,這幾個(gè)月做這個(gè)業(yè)務(wù),下半年又做另一個(gè)業(yè)務(wù),做的時(shí)候也一知半解,就像很多外包一樣,那就沒(méi)有什么業(yè)務(wù)沉淀了。
我就是寫(xiě)業(yè)務(wù)代碼的,不過(guò)我覺(jué)得這很正常啊,不知道你是怎么就覺(jué)得low啦?
所以,做為一個(gè)企業(yè),支撐發(fā)展的肯定是他的業(yè)務(wù),不管是賣(mài)什么服務(wù),都要通過(guò)業(yè)務(wù)來(lái)賺錢(qián),可能針對(duì)業(yè)務(wù),企業(yè)內(nèi)部還會(huì)做一些細(xì)化。比如說(shuō),有人會(huì)是做一些前端,一些人做后端,還有運(yùn)維,運(yùn)營(yíng),產(chǎn)品的配合。前端再細(xì)化,一部分人會(huì)做一些頁(yè)面的展示,呈現(xiàn),還有一部分人會(huì)做一些適合業(yè)務(wù)的工具,來(lái)提升開(kāi)發(fā)效率。
那如果你自己的定位是只是單單寫(xiě)頁(yè)面的,那只能說(shuō)你對(duì)自己的要求有點(diǎn)低,你沒(méi)有去考慮如何做一些提升工作效率的事情。舉個(gè)例子,比如說(shuō)常見(jiàn)的后臺(tái)管理系統(tǒng),因?yàn)楣δ芏己茴?lèi)似的,那你有去考慮如何做一個(gè)通用的模版嗎,還是就是不斷地去重復(fù)。
這個(gè)別人的產(chǎn)出,做了一個(gè)vue的后臺(tái)管理系統(tǒng)的模版,現(xiàn)在的GitHub star在6萬(wàn)多,通過(guò)這個(gè)項(xiàng)目,他就可以得到更多人的認(rèn)可,也能得到更多的好的工作機(jī)會(huì)。
所以,不要覺(jué)得業(yè)務(wù)代碼就是low的,要善于去總結(jié),然后再分享自己的經(jīng)驗(yàn),沒(méi)準(zhǔn)你也能成為一個(gè)領(lǐng)域內(nèi)的Top。
不要太在意所謂low與不low,需要在意的是做了這個(gè)項(xiàng)目或業(yè)務(wù)后,對(duì)自己的能力有沒(méi)有長(zhǎng)進(jìn),如果有,那說(shuō)明不low。如果沒(méi)有,那說(shuō)明你只是在機(jī)械的勞動(dòng)而已。
每個(gè)大佬都是從業(yè)務(wù)代碼做起的,大佬們注重的是能否成長(zhǎng),學(xué)習(xí)實(shí)踐的機(jī)會(huì),以及平臺(tái)的大小和未來(lái)是否和自己的目標(biāo)相匹配。
總結(jié)來(lái)說(shuō),只要能提升自己能力的任何工作,都是值得的。
我覺(jué)得首先大家要理解什么是“業(yè)務(wù)代碼”,業(yè)務(wù)代碼是一個(gè)相對(duì)的概念。
1.對(duì)于一個(gè)一般的物聯(lián)網(wǎng)應(yīng)用型公司來(lái)說(shuō),業(yè)務(wù)代碼就是根據(jù)客戶(hù)需求基于一個(gè)MCU或者M(jìn)PU的應(yīng)用控制邏輯的實(shí)現(xiàn)。
2.對(duì)于一個(gè)做純上層應(yīng)用的公司來(lái)說(shuō),業(yè)務(wù)代碼就是基于一個(gè)操作系統(tǒng)為客戶(hù)量身定制對(duì)應(yīng)的app,并實(shí)現(xiàn)對(duì)應(yīng)的應(yīng)用邏輯。
3.對(duì)于一個(gè)微型控制器設(shè)計(jì)廠商,業(yè)務(wù)代碼就是底層架構(gòu)裸機(jī)的具體實(shí)現(xiàn)和各個(gè)外設(shè)驅(qū)動(dòng)的框架設(shè)計(jì)。
4.對(duì)于一個(gè)設(shè)計(jì)操作系統(tǒng)的開(kāi)發(fā)人員來(lái)說(shuō),業(yè)務(wù)代碼就是架構(gòu)設(shè)計(jì)、內(nèi)存管理、調(diào)度機(jī)制優(yōu)化、優(yōu)先級(jí)管理、進(jìn)程間通信機(jī)制優(yōu)化、線程管理和內(nèi)核完善等等。
所謂”業(yè)務(wù)代碼”都是相對(duì)的,沒(méi)有參考系怎么談。像操作系統(tǒng),站在操作系統(tǒng)內(nèi)核提供方的角度看,上層所有的應(yīng)用框架,進(jìn)程服務(wù),都是業(yè)務(wù)代碼,我是為他們服務(wù)的。技術(shù)只是工具,業(yè)務(wù)實(shí)現(xiàn)才是目的,站在不同供應(yīng)商的角度,只要涉及代碼的地方都可以稱(chēng)之為業(yè)務(wù)代碼。所以站在這個(gè)維度,如果要說(shuō)業(yè)務(wù)代碼“LOW”,那就沒(méi)有代碼是不"LOW"的了。
不過(guò),真正接觸底層或者實(shí)現(xiàn)RTOS底層業(yè)務(wù)框架的工程師其實(shí)是很少的。大部分工程師基本上都是對(duì)于客戶(hù)需求做一些非驅(qū)動(dòng)底層非操作系統(tǒng)框架的應(yīng)用型的開(kāi)發(fā),所以大多時(shí)候“業(yè)務(wù)代碼“又單一的被指向了那些只是對(duì)客戶(hù)的上層應(yīng)用的需求做開(kāi)發(fā)、調(diào)整或者迭代的代碼。
而這部分代碼究竟"LOW"還是不"LOW"呢,我的答案是:不"LOW"。但是現(xiàn)實(shí)卻是很“LOW”,之所以會(huì)被想成LOW,是因?yàn)椋?/p>
1.判斷一個(gè)程序員的優(yōu)秀程度已經(jīng)不單單看你寫(xiě)了多少應(yīng)用型的代碼,設(shè)計(jì)了多少應(yīng)用框架,而是你懂不懂底層驅(qū)動(dòng)邏輯,懂不懂操作系統(tǒng)內(nèi)核,懂不懂內(nèi)核裁減等等。所以這種情況會(huì)經(jīng)常出現(xiàn)在面試過(guò)程中,面試官會(huì)因?yàn)槟悴欢讓域?qū)動(dòng)、不懂內(nèi)核而給你比較低的薪水。
2.懂得寫(xiě)業(yè)務(wù)代碼的人,他的程序員基礎(chǔ)并不一定就牢固。因?yàn)樯蠈討?yīng)用可能對(duì)業(yè)務(wù)比較看重,但是對(duì)于一些特定的語(yǔ)言的編程并沒(méi)有那么嚴(yán)謹(jǐn)。能用就可以,所以會(huì)自然而然的認(rèn)為這樣的程序員“LOW”。而一個(gè)會(huì)寫(xiě)底層驅(qū)動(dòng)的人,他考慮更多的是基礎(chǔ)代碼的安全、嚴(yán)謹(jǐn)性和容量問(wèn)題等等,他們的語(yǔ)言基礎(chǔ)相對(duì)來(lái)說(shuō)要牢固很多。
3.技術(shù)負(fù)責(zé)人一般都是全能型的人。會(huì)寫(xiě)底層驅(qū)動(dòng)或者更懂操作系統(tǒng)內(nèi)核的人更容易成為技術(shù)的領(lǐng)頭人。而那些只會(huì)“業(yè)務(wù)代碼”的人,放在大部分公司,一般都不會(huì)有太多的上升空間。
根據(jù)以上分析過(guò)后呢,做“業(yè)務(wù)代碼”的程序員基本上會(huì)被想的很“LOW”,但是結(jié)合我的親身經(jīng)歷,不同的人對(duì)于這個(gè)事情卻會(huì)有不同的看法。
比如對(duì)于領(lǐng)導(dǎo)來(lái)說(shuō),那就不一樣了。你將“業(yè)務(wù)代碼”的需求迭代了,完善了,提前任務(wù)完成了,客戶(hù)很滿(mǎn)意。那領(lǐng)導(dǎo)不會(huì)認(rèn)為你是一個(gè)很“LOW”的程序員。你很高級(jí),領(lǐng)導(dǎo)很欣賞,“后果”很舒服。但是對(duì)于一個(gè)面試官來(lái)說(shuō),你就會(huì)點(diǎn)上層應(yīng)用的調(diào)用和設(shè)計(jì)。我為什么要給你這么多薪水?雖然會(huì)被想成很"LOW",但是也是現(xiàn)實(shí)。
業(yè)務(wù)代碼不一定low,能完成用戶(hù)需求的代碼就是好代碼。
另外,對(duì)于我們搞嵌入式軟件、EDA工具軟件的來(lái)說(shuō),業(yè)務(wù)軟件反而是更有技術(shù)含量的,更具科學(xué)意義的代碼,而軟件可能只是載體,你啥時(shí)候透過(guò)代碼理解了它們背后的物理概念、數(shù)學(xué)公式,你就超越了程序員,能向科學(xué)家又邁進(jìn)一步。
互聯(lián)網(wǎng)軟件其實(shí)也一樣,軟件實(shí)現(xiàn)的是一個(gè)業(yè)務(wù)流程的自動(dòng)化,你完全可以透過(guò)你寫(xiě)的程序還原甲方用戶(hù)的業(yè)務(wù)流程,而這種流程是老板制訂的,認(rèn)識(shí)會(huì)上一個(gè)層次,將來(lái)可以向老板邁進(jìn)
我發(fā)現(xiàn)很多程序員對(duì)于處理業(yè)務(wù)邏輯都是「嗤之以鼻」。感覺(jué)自己天天寫(xiě)業(yè)務(wù)邏輯代碼,改 Bug 都沒(méi)有時(shí)間學(xué)習(xí),沒(méi)有時(shí)間實(shí)現(xiàn)個(gè)人成長(zhǎng)?
但是,作為程序員來(lái)講,如果不是做底層基礎(chǔ)技術(shù)研發(fā)的話,大部分的工作不就是做這些擰螺絲的工作嗎?其實(shí)擰螺絲有那么容易嗎?可能擰螺絲很容易,但是擰好螺絲就不那么簡(jiǎn)單了。
別小瞧業(yè)務(wù)邏輯代碼,如果真正寫(xiě)好,要把邏輯寫(xiě)得清晰簡(jiǎn)單易用,功能健壯穩(wěn)定,性能同時(shí)達(dá)到要求的話,其實(shí)是挺難的。
其實(shí)很多程序員都跟他一樣,都在痛苦的編程,一方面對(duì)自己有更高的要求,一方面又嫌棄現(xiàn)在寫(xiě)的代碼沒(méi)有技術(shù)含量。又有更高的要去和希望,又嫌棄現(xiàn)在的工作,就是不思考出現(xiàn)的原因,不去付諸行動(dòng)。還不停的抱怨: 感覺(jué)自己天天寫(xiě)業(yè)務(wù)邏輯代碼,改 Bug 都沒(méi)有時(shí)間學(xué)習(xí),沒(méi)有時(shí)間實(shí)現(xiàn)個(gè)人成長(zhǎng)?
到這里,我們不禁一問(wèn):那我們?cè)撊绾螖[脫這種現(xiàn)狀呢?其實(shí)很簡(jiǎn)單,我們應(yīng)該擺正自己的態(tài)度和觀點(diǎn),正確看待寫(xiě)業(yè)務(wù)邏輯這些代碼就行了。
堅(jiān)持不懈的寫(xiě)好業(yè)務(wù)邏輯代碼
就像我在上面說(shuō)的: 別小瞧業(yè)務(wù)邏輯代碼,如果真正寫(xiě)好,要把邏輯寫(xiě)得清晰簡(jiǎn)單易用,功能健壯穩(wěn)定,性能同時(shí)達(dá)到要求的話,其實(shí)是挺難的。
所以,我們要正確看待寫(xiě)業(yè)務(wù)邏輯的代碼,應(yīng)該擺正心態(tài),堅(jiān)持不懈的去寫(xiě),所謂量變引起質(zhì)變,就是這個(gè)道理。寫(xiě)業(yè)務(wù)代碼,積累代碼量,一力降十會(huì),在積累了巨量的代碼量之后,幾乎任何所謂的有技術(shù)含量的東西都構(gòu)不成挑戰(zhàn)性。當(dāng)然,要想真正的通過(guò)自己寫(xiě)業(yè)務(wù)代碼,寫(xiě)好業(yè)務(wù)代碼還應(yīng)該有接下來(lái)的這個(gè)思考。
業(yè)務(wù)邏輯代碼同樣可以玩出很多花樣
其實(shí)業(yè)務(wù)邏輯代碼一樣可以玩出很多花樣,而這才是能夠提升你能力的本質(zhì)。比如:你寫(xiě)了一個(gè)處理單任務(wù)的業(yè)務(wù)邏輯,雖然滿(mǎn)足了用戶(hù)的需求,但是你這時(shí)能不能對(duì)自己有一個(gè)更高的要求呢?單任務(wù)雖然是功能實(shí)現(xiàn)了,但是效率可能不行,處理慢,那搞個(gè)多任務(wù)處理的邏輯怎么樣?任務(wù)池、線程池、內(nèi)存池、并發(fā)、同步等等這些技術(shù)點(diǎn)都來(lái)了。如果你對(duì)自己有這樣的要求,而你自己有追求的話,就會(huì)進(jìn)一步思考如何去做到這些,你做到了,你能力就提升了。
同樣,很多人感覺(jué)處理業(yè)務(wù)邏輯,就是一些各種循環(huán),條件判斷,只要邏輯稍微嚴(yán)謹(jǐn)點(diǎn),功能就都沒(méi)問(wèn)題,就都實(shí)現(xiàn)了,確實(shí)是這樣的。這就是你對(duì)于業(yè)務(wù)邏輯沒(méi)有興趣的根點(diǎn)所在。
那你為什么不想想: 如何使用循環(huán)和條件判斷可以提升效率呢?滿(mǎn)足了功能的那些需求,是不是有些地方可以?xún)?yōu)化一下呢?是不是可以提升一下性能呢?
其實(shí),這個(gè)技術(shù)的進(jìn)步和積累,就在于自己內(nèi)心對(duì)自己有沒(méi)有更高的要求和追求。這是大實(shí)話,也是大白話。很多人就感覺(jué)只要實(shí)現(xiàn)了功能需求就夠了,滿(mǎn)足了用戶(hù)就行了。然后,這個(gè)項(xiàng)目完事了,下個(gè)項(xiàng)目遇到差不多的邏輯,還是這么處理,又完事了,每個(gè)項(xiàng)目,每個(gè)功能都是這樣重復(fù)的處理,從來(lái)不思考最優(yōu)的實(shí)現(xiàn)方式,你感覺(jué)能夠進(jìn)步嗎?你能不煩氣嗎?十年如一日的工作,10 年也就積累了一年的工作經(jīng)驗(yàn),在重復(fù)使用。
業(yè)務(wù)邏輯的最優(yōu)方式,就是思考如何大道至簡(jiǎn)
通過(guò)一個(gè)業(yè)務(wù)邏輯實(shí)現(xiàn)一個(gè)功能,基本上只要是程序員,腦子不笨,都能做出來(lái),做出來(lái)是一回事,但是做好是另外一回事。大道至簡(jiǎn),我們要做就得想辦法做到最好。這里的好有很多層意思。
比如: 你寫(xiě)的業(yè)務(wù)邏輯代碼 是否能夠做到準(zhǔn)確,穩(wěn)定,高效,易讀,易擴(kuò)展,易維護(hù),兼容性強(qiáng)呢? 問(wèn)自己一句,如果你能做到這些,那確實(shí)是好。如果做不到,你還是處理初級(jí)水平,當(dāng)然不行,這就是你在工作中提升能力的機(jī)會(huì)。別說(shuō)沒(méi)時(shí)間,都是借口。
精益求精是對(duì)代碼大道至簡(jiǎn)的永恒的追求,也是我們?cè)谔幚順I(yè)務(wù)邏輯代碼中不斷提高自己能力的過(guò)程。
明明自己水平初級(jí),就容易驕傲自滿(mǎn),感覺(jué)可以了,我想學(xué)更高的技術(shù),那么更高的技術(shù)是自己在處理業(yè)務(wù)邏輯中一步一步積累出來(lái)的,不是干了初級(jí)的活,不用積累,直接學(xué)高級(jí)的技術(shù),就能高級(jí)了。
我特別喜歡網(wǎng)上有個(gè)網(wǎng)友寫(xiě)的一段話:
其實(shí)很多技術(shù)大牛和技術(shù)專(zhuān)家,都是從業(yè)務(wù)邏輯做起,慢慢積累思考起來(lái)的。比如:在處理業(yè)務(wù)邏輯之前,會(huì)思考如何設(shè)計(jì)這個(gè)架構(gòu),可以讓代碼更好的擴(kuò)展和維護(hù)。在處理業(yè)務(wù)邏輯的時(shí)候,思考如何的處理才能提高性能和效率?一步一步的實(shí)驗(yàn)和總結(jié),積累,才成就了今天的成績(jī)。
所以,不要對(duì)處理業(yè)務(wù)邏輯嗤之以鼻,不要以為能夠滿(mǎn)足需求就夠了。你重復(fù)不思考的粘貼和復(fù)制肯定是不行的,必然會(huì)對(duì)編程失去興趣,自然無(wú)法更好的成長(zhǎng)和進(jìn)步。應(yīng)該在編程的過(guò)程中追求更高的要求,尋找更高的興趣,這樣才能讓你持續(xù)進(jìn)步,從而進(jìn)階。
林子大了什么鳥(niǎo)都有,不知道你說(shuō)的有人是指多少比例的人。我的理解代碼可以分為兩類(lèi):1:工具欄或者框架類(lèi)2:業(yè)務(wù)類(lèi)。寫(xiě)工具類(lèi)偏重于健壯可拓展可復(fù)用;寫(xiě)業(yè)務(wù)類(lèi)偏重于邏輯嚴(yán)謹(jǐn)沒(méi)有漏洞,化繁為簡(jiǎn)。畢竟有些時(shí)候需求或者業(yè)務(wù)都不甚清楚他們想要的邏輯。有時(shí)候復(fù)雜的業(yè)務(wù)流程你捋都不順,更別說(shuō)代碼寫(xiě)的好了。當(dāng)然,工具類(lèi)到高深,工具好用,框架優(yōu)秀確實(shí)需要的技術(shù)功底深厚,比業(yè)務(wù)類(lèi)要考慮的東西也多,但不代表寫(xiě)業(yè)務(wù)類(lèi)代碼很low。當(dāng)然,不管寫(xiě)什么代碼,完全復(fù)制黏貼而不去考慮與實(shí)際場(chǎng)景結(jié)合,不去想為什么?有沒(méi)有更好的處理方案是比較low的
java低代碼開(kāi)發(fā)平臺(tái),能快速開(kāi)發(fā),節(jié)省人工成本,提高開(kāi)發(fā)效率。
國(guó)內(nèi)快速開(kāi)發(fā)平臺(tái)如目前流行的低代碼快速開(kāi)發(fā)平臺(tái)(如有天翎 ?,普元,天縱,等廠家)myApps微服務(wù)架構(gòu),多租戶(hù)模式,門(mén)戶(hù)集成,單點(diǎn)登錄,移動(dòng)端(企業(yè)微信,釘釘,APP),功能模板都是可視化配置(如表單引擎,視圖引擎,流程引擎,報(bào)表引擎,像操作word或Excel,擴(kuò)展性強(qiáng),提供源代碼,支持國(guó)產(chǎn)數(shù)據(jù)庫(kù),操作系統(tǒng)((瀚高,達(dá)夢(mèng),統(tǒng)信,中標(biāo)麒麟等)如天翎java平臺(tái)后端核心框架:Spring MVC+SpringBoot2.X,視圖框架:Spring MVC,緩存框架:Ehcache+Redis,持久層框架:Hibernate+JDBC+File System Serilizable,安全框架:Spring security+antisamyt等
Java應(yīng)用程序的運(yùn)行經(jīng)過(guò)編寫(xiě)、編譯、運(yùn)行三個(gè)步驟。
第1步,編寫(xiě)程序。使用記事本或其他軟件編寫(xiě)程序的源代碼,將源代碼保存為文件filename.java文件。
第2步,編譯程序。在MS-DOS命令窗口,將當(dāng)前目錄轉(zhuǎn)換到Java源程序所在的保存目錄;輸入“javac filename.java”形式的命令進(jìn)行程序編譯。
第3步,執(zhí)行程序。在同樣的命令窗口中輸入“java filename”形式的命令執(zhí)行程序。
完成了程序的開(kāi)發(fā),查看相應(yīng)t目錄,其中應(yīng)該具有兩個(gè)文件,分別是XXXX.java和XXXX.class。
如果是開(kāi)發(fā)網(wǎng)頁(yè)應(yīng)用,開(kāi)發(fā)流程大概是這樣的:
搭建開(kāi)發(fā)平臺(tái),一般使用的是j2ee
編寫(xiě)DAO層,建立數(shù)據(jù)庫(kù)
編寫(xiě)業(yè)務(wù)層action
編寫(xiě)顯示文件jsp、html
煙囪式開(kāi)發(fā)模式:
上述開(kāi)發(fā)模式有幾個(gè)弊端:
這樣開(kāi)發(fā)模式的優(yōu)勢(shì):
業(yè)務(wù)代碼集中在業(yè)務(wù)層 service,專(zhuān)注于業(yè)務(wù)對(duì)象 bo 的封裝以及業(yè)務(wù)對(duì)象給展示層 vo的轉(zhuǎn)換,封裝復(fù)用邏輯,可以減少大量重復(fù)的代碼,后期維護(hù)便捷的多。
數(shù)據(jù)庫(kù)改動(dòng)只設(shè)計(jì)dao層,快速響應(yīng)各個(gè)業(yè)務(wù)。
業(yè)務(wù)代碼如何拒絕 all in one
以上的controller代碼最突出的缺點(diǎn)就是代碼完全無(wú)法復(fù)用,完全沒(méi)有使用到面向?qū)ο蠓庋b,集成,多態(tài)的特性。業(yè)務(wù)開(kāi)發(fā)中,一般都是權(quán)限校驗(yàn),參數(shù)校驗(yàn),業(yè)務(wù)判斷,業(yè)務(wù)對(duì)象轉(zhuǎn)換數(shù)據(jù)庫(kù)操作。
我的做法是業(yè)務(wù)抽象,把公共代碼進(jìn)行抽取,通過(guò)配置的形式的方式調(diào)用,使業(yè)務(wù)代碼可以以可插拔的方式選擇指定的權(quán)限校驗(yàn),參數(shù)校驗(yàn)。簡(jiǎn)單來(lái)說(shuō),就是善用AOP面向切面編程的思想,示例如下:
使用aop對(duì)權(quán)限校驗(yàn)邏輯進(jìn)行抽取,能夠通過(guò)注解的方式指定哪些controller需要進(jìn)行權(quán)限校驗(yàn)。對(duì)用戶(hù)進(jìn)行數(shù)據(jù)過(guò)濾時(shí),使用controller的攔截器獲取該用戶(hù)擁有的各類(lèi)權(quán)限,并把用戶(hù)數(shù)據(jù)保存在上下文threadloal中,并且通過(guò)配置對(duì)指定url進(jìn)行攔截。在業(yè)務(wù)層,從上下文拿到用戶(hù)權(quán)限數(shù)據(jù)做各類(lèi)數(shù)據(jù)業(yè)務(wù)過(guò)濾,通過(guò)aop實(shí)現(xiàn)各類(lèi)攔截業(yè)務(wù)的指定調(diào)用。
使用java validtion對(duì)通用的字段,例如電話號(hào)碼,身份證,進(jìn)行擴(kuò)展,詳細(xì)可以參考,如何使用validation校驗(yàn)參數(shù)?,在項(xiàng)目中其他類(lèi)似校驗(yàn)進(jìn)行復(fù)用。
業(yè)務(wù)判斷:使用設(shè)計(jì)模式對(duì)不同類(lèi)型的業(yè)務(wù)開(kāi)發(fā)進(jìn)行封裝,集成,多態(tài)擴(kuò)展;這樣在后期的擴(kuò)展中可以基于開(kāi)發(fā)封閉原則,針對(duì)新的業(yè)務(wù)擴(kuò)展子類(lèi)即可。
業(yè)務(wù)開(kāi)發(fā)過(guò)程中,依照阿里巴巴研發(fā)規(guī)范的要求,存在DO(數(shù)據(jù)庫(kù)表結(jié)構(gòu)一致的對(duì)象),BO(業(yè)務(wù)對(duì)象),DTO(數(shù)據(jù)傳輸對(duì)象),VO(顯示層對(duì)象),Query(查詢(xún)對(duì)象)。
使用MapStruct,可以靈活的控制的不同屬性值之間的轉(zhuǎn)換規(guī)格,比org.springframework.beans.BeanUtils.copyProperties()方法更加靈活。
例如,公共字段,生成日期,創(chuàng)建人,修改時(shí)間,修改人使用插件的形式進(jìn)行封裝,在mybatis-plus中使用MetaObjectHandler,在執(zhí)行sql之前完成統(tǒng)一字段值的填充。
項(xiàng)目如何做好代碼注釋?zhuān)?/p>
在業(yè)務(wù)中特別是狀態(tài)的值,在對(duì)外發(fā)布api的vo對(duì)象中,加上狀態(tài)枚舉值的注釋?zhuān)⑶沂褂聾link 注解,可以直接連接到枚舉類(lèi),讓開(kāi)發(fā)者一目了然。