軟件開(kāi)發(fā)中,我們應(yīng)該保持的工匠心態(tài)

2021-05-14    分類(lèi): 軟件開(kāi)發(fā)

本文的目的是從一個(gè)不僅僅坐在椅子上并且完全按照他們所說(shuō)的方式做某事的人的角度來(lái)介紹軟件開(kāi)發(fā)。
它強(qiáng)調(diào)軟件開(kāi)發(fā)是一個(gè)非常復(fù)雜的過(guò)程,需要遵循許多較小的步驟才能構(gòu)建高質(zhì)量的東西。需求收集,體系結(jié)構(gòu),測(cè)試,編寫(xiě)可維護(hù)代碼,所有這些都匯集在一起,創(chuàng)建了一個(gè)可在整個(gè)生命周期內(nèi)得到支持的產(chǎn)品。
本文討論了這些要點(diǎn),并從最終結(jié)果的角度詳細(xì)說(shuō)明了它們的重要性。
文章還強(qiáng)調(diào)了我們自己的經(jīng)驗(yàn)和態(tài)度如何對(duì)最終結(jié)果產(chǎn)生重大影響。

首先,我們需要了解我們正在構(gòu)建的內(nèi)容。
在編寫(xiě)任何代碼之前,我們需要回答一些問(wèn)題。
我們正在構(gòu)建一個(gè)全新的應(yīng)用程序嗎?
這是重寫(xiě)嗎?
它是復(fù)雜系統(tǒng)的一部分嗎?
它可以獨(dú)立工作嗎?
有任何依賴(lài)嗎?
我們了解我們需要構(gòu)建什么嗎?
我們是否了解如何使用該軟件?
我們知道誰(shuí)會(huì)使用它嗎?
我們了解這個(gè)軟件的作用嗎?
那段代碼的維護(hù)怎么樣?
正如你所看到的,有很多問(wèn)題需要直接回答。我們甚至沒(méi)有編碼任何東西。所有這些問(wèn)題都為我們提供了我們正在建設(shè)的背景,條件和限制。它們基本上決定了我們經(jīng)營(yíng)的區(qū)域。
為什么這些問(wèn)題很重要?為什么我們關(guān)心這是一個(gè)新的應(yīng)用程序還是重寫(xiě)?
好吧,如果這個(gè)應(yīng)用程序是重寫(xiě),那么我們需要理解為什么我們重寫(xiě)它。
重寫(xiě)一些東西很可能是一項(xiàng)昂貴的練習(xí),因此通常有充分的理由。也許它的使用一些舊的技術(shù)無(wú)法適應(yīng)更大的系統(tǒng)項(xiàng)目,也許我們需要增加新的功能,也許我們需要使它更容易被它的用戶(hù)使用。也許我們需要讓它更容易維護(hù)。
是的,維護(hù)非常重要。
我們可能已經(jīng)編寫(xiě)了世界上見(jiàn)過(guò)的最令人驚奇的軟件,但是如果沒(méi)有人理解它是如何編寫(xiě)的,如果其他開(kāi)發(fā)人員看到它并且嚇跑了,那么很可能每一個(gè)小修復(fù)或改變都不會(huì)只是很長(zhǎng)一段時(shí)間但很可能會(huì)引發(fā)問(wèn)題。
我們可以做很多事情來(lái)涵蓋其中的一些問(wèn)題,并確保每個(gè)問(wèn)題都有一個(gè)好的答案通常是一個(gè)很好的起點(diǎn)。作為開(kāi)發(fā)人員,我們需要做的我們并不總是在維護(hù)代碼。因此,我們可以處理基礎(chǔ):清潔代碼,良好的命名策略,SOLID原則,測(cè)試以證明它的工作原理。
如果這些事情得到妥善處理,那么我們已經(jīng)處于一個(gè)好的位置。
軟件架構(gòu)
從一開(kāi)始就設(shè)計(jì)應(yīng)用程序的體系結(jié)構(gòu)是我們所關(guān)注的。它涵蓋了系統(tǒng)的工作方式,一旦到位,即使不是完全不可能,也很難改變。
這就是我們開(kāi)始的地方,我們了解一切可能如何工作,事物如何相互作用,子系統(tǒng)如何相互通信。做一些概念驗(yàn)證(POC)的小應(yīng)用程序通常是一個(gè)好主意,看看一切是否真正按照我們認(rèn)為應(yīng)該工作的方式運(yùn)行。
這也是我們可能決定實(shí)際上我們對(duì)某些方面知之甚少的地方,我們要么尋求幫助,要么學(xué)習(xí)如何去做。
知道何時(shí)做這些事情很重要。沒(méi)有人知道一切,我們應(yīng)該很高興承認(rèn)我們不知道的事情。
當(dāng)我們知道我們不知道的時(shí)候,那就是我們學(xué)習(xí)的時(shí)候。那時(shí)我們才知道我們需要學(xué)習(xí)什么。作為一名開(kāi)發(fā)人員,我們必須不斷學(xué)習(xí),有很多東西可以讓人感到畏懼。當(dāng)發(fā)生這種情況時(shí),退一步回到基礎(chǔ)通常是一個(gè)好主意。
有些人決定專(zhuān)注于某些方面,這很好,因?yàn)樗麄儗?duì)某些事物有很好的了解。其他人喜歡更多的通才,所以他們知道很多事情。
這些方法都沒(méi)有錯(cuò)。
你知道的越多越好。在做出任何決定時(shí)您將擁有更多選擇,并且更容易解釋您為什么首先做出這些決定。
還記得我們?nèi)绾握f(shuō)軟件開(kāi)發(fā)是一項(xiàng)非常社交活動(dòng)嗎?它是,因?yàn)槟阈枰c他人互動(dòng),你需要解釋你的選擇,闡明為什么某些事情應(yīng)該以某種方式完成。這完全取決于溝通,所有這一切都是為了接受建議并能夠發(fā)現(xiàn)一個(gè)好主意,即使它不是你的。
我想這會(huì)把我們推向一個(gè)非常明顯的方向。了解軟件開(kāi)發(fā)中的社交方面,并將其用于您正在構(gòu)建的任何內(nèi)容的優(yōu)勢(shì)。如果你從等式中移開(kāi)并看到更大的圖景,那么很明顯,目標(biāo)是提供一些好的東西。你如何達(dá)成某些決定將不再那么重要。重要的是這些決定的結(jié)果和結(jié)果。
您當(dāng)然可以說(shuō)架構(gòu)并不是那么重要,它將由您正在使用的框架來(lái)處理。例如,它可能類(lèi)似于MVC。
這不是我所說(shuō)的。
框架將為您提供一個(gè)起點(diǎn),它將通過(guò)提供一些方法為您提供幫助。它通常非常注重特定類(lèi)型的活動(dòng)。這只是你正在建設(shè)的一小部分,所以從一開(kāi)始就理解這一點(diǎn)很好。
但是,框架不會(huì)包含與其他應(yīng)用程序的依賴(lài)關(guān)系和交互。您甚至可以使用多個(gè)框架來(lái)構(gòu)建某些東西。也許您將實(shí)體框架添加到組合中,也許您也可以添加其他框架。現(xiàn)在你已經(jīng)有了很多框架,你需要讓它們很好地一起玩。
系統(tǒng)的體系結(jié)構(gòu)與這些事物分離。如果你以某種方式想象事物,它會(huì)有所幫助。即使在白板上畫(huà)畫(huà)也會(huì)創(chuàng)造奇跡,因?yàn)樗梢詭椭憧吹讲罹唷?br/>態(tài)度
是指解決方案,而不是指問(wèn)題。
軟件開(kāi)發(fā)是一項(xiàng)社交活動(dòng),您將與他人進(jìn)行大量互動(dòng)。讓你的自己掌控并處理大量的問(wèn)題是很容易。因?yàn)槟悴槐叵騽e人解釋?zhuān)銥槭裁催@么做,但這通常會(huì)導(dǎo)致混亂。這種態(tài)度對(duì)項(xiàng)目不利。
開(kāi)發(fā)人員之間會(huì)缺乏信任,然后他們就會(huì)只做自己的事情,如果你不讓他們了解情況(他們?yōu)槭裁匆@樣做?)。在你知道它之前,整個(gè)事情慢慢走向失敗,因?yàn)槊總€(gè)人都以自己的方式做事而不考慮項(xiàng)目的好處。
這就是工匠心態(tài)最關(guān)鍵的地方。項(xiàng)目是第一位的。這意味著您需要相應(yīng)地考慮更多的事情,代碼的優(yōu)化,圖片的加載優(yōu)化等
快速修復(fù)與正確的修復(fù)
有時(shí)人們能力比較強(qiáng),能快速的修復(fù)bug,完成工作。通常這樣做是為了挑選出具有負(fù)面影響的小東西,通常是在系統(tǒng)投入生產(chǎn)時(shí)。
在更大的項(xiàng)目中發(fā)生的事情是,快速修復(fù)了bug,但是我們沒(méi)有深究問(wèn)題造成的根本原因。我們只是用了臨時(shí)解決的方式,這樣造成了項(xiàng)目后期的維護(hù)困難
作為工匠,我們需要了解這些事情。我們不僅僅是一臺(tái)機(jī)器,可以整天拿著比薩餅和可樂(lè)來(lái)制作代碼。
這是一項(xiàng)高度邏輯性和創(chuàng)造性的活動(dòng),其中經(jīng)驗(yàn)很重要,您可以在其中發(fā)現(xiàn)某些事情的發(fā)展方向。
是的,有時(shí)您可能需要應(yīng)用快速修復(fù)來(lái)阻止虧損,如果系統(tǒng)由于某個(gè)問(wèn)題每小時(shí)損失數(shù)百萬(wàn),那么一定要盡快修復(fù)它。一旦你完成了這個(gè),確保有適當(dāng)?shù)男迯?fù),不要讓這些快速修復(fù)最終導(dǎo)致項(xiàng)目的崩潰。
這歸結(jié)為是花時(shí)間了解問(wèn)題并提出一個(gè)確保問(wèn)題不會(huì)再發(fā)生的修復(fù)。這當(dāng)然是一個(gè)更大的討論的一部分,因?yàn)槲覀兺ǔS薪刂谷掌?,因?yàn)槲覀冎挥羞@點(diǎn)時(shí)間可用。然而,能夠闡明和解釋問(wèn)題,忽視問(wèn)題的解決方案和危險(xiǎn)是至關(guān)重要的。我們不只是為了編碼,我們?cè)谀抢锓窒砦覀兊慕?jīng)驗(yàn)并防止這些事情發(fā)生。
在某種程度上,態(tài)度是一個(gè)有趣的。
這是因?yàn)槿绻惚灰蝗河蓄?lèi)似方式看待和理解事物的人所包圍,這會(huì)更好。但即使你不在這樣的地方,也許你應(yīng)該說(shuō)明為什么這種態(tài)度有效并且有助于構(gòu)建更好的軟件,也許你可以引領(lǐng)改變的方式。
你想要的最后一件事就是妥協(xié)并接受平庸,因?yàn)楫a(chǎn)品最終會(huì)成為平庸!
了解要求并填補(bǔ)空白
通常,我們想要的實(shí)際要求,是很難輕易大成的
我們舉一個(gè)簡(jiǎn)單的例子。您的一個(gè)要求是使用用戶(hù)名和密碼構(gòu)建登錄頁(yè)面。這有多難?包含兩個(gè)字段和一個(gè)按鈕的頁(yè)面。
好吧,走著瞧。
用戶(hù)名是電子郵件地址,電話號(hào)碼還是別的?
當(dāng)您按下“登錄”按鈕但未填寫(xiě)用戶(hù)名時(shí)會(huì)發(fā)生什么?
如果密碼丟失怎么辦?
你在哪里顯示錯(cuò)誤消息?
用什么顏色顯示錯(cuò)誤消息?
是否應(yīng)該有注冊(cè)頁(yè)面的鏈接?
忘記密碼鏈接怎么樣?
忘記用戶(hù)名怎么辦?
你如何與任何人聯(lián)系以恢復(fù)它?
你如何確保不會(huì)成為SQL注入攻擊的受害者?
如果用戶(hù)非??焖俚攸c(diǎn)擊“登錄”按鈕50次會(huì)發(fā)生什么?
問(wèn)題清單越來(lái)越大。這只是一個(gè)登錄頁(yè)面,想象一下構(gòu)建比這更復(fù)雜的問(wèn)題時(shí)的問(wèn)題數(shù)量。
這就是我們通常所做的事情,我們會(huì)查看一項(xiàng)工作并開(kāi)始提出問(wèn)題以確保我們構(gòu)建正確的事物。我們想到任何可能出錯(cuò)的事情,我們借鑒過(guò)去的經(jīng)驗(yàn)。一旦我們將系統(tǒng)置于實(shí)際狀態(tài),一旦我們進(jìn)行安全審核,這有助于澄清在構(gòu)建任何內(nèi)容時(shí)我們應(yīng)該問(wèn)什么樣的問(wèn)題。經(jīng)驗(yàn)真的很重要!
不要附加代碼
這是一個(gè)有趣的。很容易接受我們的代碼,甚至對(duì)我們做出的選擇采取保護(hù)。其他人不可能理解我們正在做的事情的美麗,對(duì)嗎?
嗯,這就是事情。在現(xiàn)實(shí)世界中,沒(méi)有人會(huì)關(guān)心。有一個(gè)簡(jiǎn)單的事實(shí),代碼需要執(zhí)行一個(gè)函數(shù),就是這樣。要么它做了,要么沒(méi)做。
由于沒(méi)有過(guò)于依戀,我們?cè)试S自己看到缺陷和缺點(diǎn)。
它允許我們進(jìn)行更改而不會(huì)感到遺憾。它讓自我離開(kāi)了門(mén),然后我們可以專(zhuān)注于重要的事情,這是商業(yè)價(jià)值。這在我看來(lái)非常重要,代碼并不存在于并行世界中,它只需要執(zhí)行一個(gè)功能并提供價(jià)值,也許可以節(jié)省一些人的時(shí)間,也許它比以往任何時(shí)候都更快,比以往更快??偸怯幸粋€(gè)原因,為什么代碼存在,如果原因消失,我們可以簡(jiǎn)單地刪除它,沒(méi)有任何第二個(gè)想法。
首先關(guān)注商業(yè)價(jià)值!
清潔代碼
我們已經(jīng)將編程視為社交活動(dòng)。有許多重要的事情,能夠支持和維護(hù)代碼庫(kù),就在最頂層。無(wú)論我們是大團(tuán)隊(duì)還是單人團(tuán)隊(duì)的一員,我們?nèi)匀恍枰伎籍?dāng)我們編寫(xiě)的代碼投入生產(chǎn)時(shí)會(huì)發(fā)生什么。
我們能在幾個(gè)月或幾年內(nèi)看一下它還能理解它嗎?
其他人是否能夠接受并維護(hù)它,修復(fù)錯(cuò)誤,甚至可能添加新功能?
我們都害怕遺留代碼,但如果我們停下來(lái)思考一下,我們很快就會(huì)發(fā)現(xiàn),我們編寫(xiě)的每一段代碼都會(huì)在投入生產(chǎn)的那一刻成為遺留代碼。我們認(rèn)為這個(gè)閃亮的新框架將解決我們所有的問(wèn)題,給它六個(gè)月的時(shí)間,這將是舊的新聞,而其他一些東西將成為本月的風(fēng)格。
考慮到所有這些因素,更多地關(guān)注我們編寫(xiě)代碼的方式是有意義的。
那么干凈的代碼到底是什么?好吧,為了理解一些代碼,我們需要能夠像讀一篇文章一樣并理解它。這意味著我們的變量需要具有適當(dāng)?shù)拿Q(chēng)。
例如,而不是
_uRep =whatever
我們可以使用類(lèi)似的東西:
_userRepository =whatever
如果我們查看一行代碼并且無(wú)法快速掌握它的作用,那么就該改變它了。讓我們不僅想到這個(gè)時(shí)刻,當(dāng)我們頭腦中的一切都清晰時(shí),讓我們想想在幾個(gè)月內(nèi)當(dāng)所有背景消失并且我們從頭開(kāi)始時(shí)會(huì)發(fā)生什么。
因此,良好的變量名稱(chēng)和良好的方法名稱(chēng)可以幫助理解代碼,并在時(shí)間到來(lái)時(shí)更容易維護(hù)它。
另一個(gè)好方法是避免使用智能和復(fù)雜的一個(gè)襯墊。我們都知道它們是什么 - 那些美麗的結(jié)構(gòu)在很多方面做了很多。分解,讓它看起來(lái)簡(jiǎn)單,易于閱讀和理解。
希望到現(xiàn)在為止,出現(xiàn)了一個(gè)明確的模式; 保持簡(jiǎn)單從未如此重要。
開(kāi)始應(yīng)用一些SOLID原則。我們不需要盲目地應(yīng)用所有東西,只需要有意義的東西。例如,單一責(zé)任原則是一個(gè)很好的開(kāi)始。這意味著我們編寫(xiě)有一個(gè)目的的類(lèi)和一個(gè)做一件事的方法。
這允許我們編寫(xiě)可測(cè)試的代碼,這對(duì)于將來(lái)的維護(hù)非常重要。
我認(rèn)為現(xiàn)在是時(shí)候停止證明為什么測(cè)試代碼很重要了。這是常態(tài),而不是例外。大部分時(shí)間我們都沒(méi)有這樣做,因?yàn)槲覀冇薪刂谷掌?,沒(méi)有足夠的時(shí)間來(lái)實(shí)際編寫(xiě)測(cè)試。這將我們推向下一部分。
嘗試成為一名工匠心態(tài)的程序猿
我們軟件開(kāi)發(fā)人員需要開(kāi)發(fā)性的讓別人測(cè)試我們的代碼。我們不應(yīng)該證明為什么我們會(huì)花時(shí)間為我們的功能添加自動(dòng)化測(cè)試,我們就這么做。當(dāng)然,我們可以解釋這實(shí)現(xiàn)了什么,但不能作為理由,我們測(cè)試的是因?yàn)檫@有助于產(chǎn)品,因?yàn)槲覀兪枪そ?,因?yàn)槲覀冎牢覀冊(cè)谧鍪裁础.?dāng)有人要求我們估算一件作品時(shí),我們會(huì)考慮測(cè)試。
測(cè)試是我們工作的一部分。
沒(méi)有人告訴水管工如何做他的工作,他們使用它的經(jīng)驗(yàn)來(lái)處理事情,我們也是如此。所以,讓我們停止證明我們知道需要做什么,讓我們?nèi)プ觥R虼?,產(chǎn)品會(huì)更好。
這讓我們回到了行業(yè)的切入點(diǎn)。正如我所說(shuō),讓我們成為解決方案的一部分而不是問(wèn)題。我們知道偷工減料并沒(méi)有幫助,我們知道不斷引入技術(shù)債務(wù)最終會(huì)帶來(lái)巨大的成本,因此盡可能做到最好盡量減少它。
這是您正在進(jìn)行的當(dāng)前項(xiàng)目的快速測(cè)試??纯从卸嗌偌夹g(shù)使用,有多少框架,有多少庫(kù)。
可能會(huì)出現(xiàn)一些令人討厭的驚喜。
有多少人在那里,因?yàn)橛腥讼胍褂锰囟ǖ臇|西?
有多少個(gè)庫(kù)是因?yàn)橛腥诵枰鲆患?,在一個(gè)地方而不是寫(xiě)一個(gè)小方法,他們引入了一個(gè)全新的庫(kù)來(lái)完成這項(xiàng)工作?
如果我們將焦點(diǎn)從我們自己轉(zhuǎn)移到項(xiàng)目本身,這一切都可以解決。只有在有明確,持久的利益的情況下才能添加新的東西。
測(cè)試
我們已經(jīng)知道編寫(xiě)可測(cè)試代碼然后添加測(cè)試以實(shí)際證明它按預(yù)期工作的好處。
想象一下,這些單元測(cè)試運(yùn)行得非常快,因此可以確定系統(tǒng)以可預(yù)測(cè)的方式運(yùn)行。想象一下能夠重構(gòu)而不必?fù)?dān)心你可能會(huì)破壞某些東西。想象一下,獲取錯(cuò)誤報(bào)告,編寫(xiě)一個(gè)突出顯示錯(cuò)誤的失敗測(cè)試,然后修復(fù)代碼以使測(cè)試通過(guò)。想象一下,還有一個(gè)測(cè)試可以保證你剛才修復(fù)的特定bug不再顯示它的丑陋頭腦。
這些都是好處,但等等,還有更多!
想象一下,每次發(fā)生變化時(shí)都不必繼續(xù)測(cè)試整個(gè)系統(tǒng),想象維護(hù)階段會(huì)更短,更便宜,因?yàn)槟辉傩枰@么多的手動(dòng)測(cè)試。我們需要準(zhǔn)備好闡明為什么這種工作方式更好,即使是在我們之間,甚至對(duì)于可能不會(huì)以相同方式編碼的其他開(kāi)發(fā)人員。這有助于將每個(gè)人提升到更高的水平,以現(xiàn)代的方式工作,享受改變的工作流程,而不是在發(fā)布即將到來(lái)時(shí)無(wú)數(shù)的額外時(shí)間跑來(lái)跑去。
代碼安全性
我們現(xiàn)在正在進(jìn)入那個(gè)沒(méi)有人喜歡談?wù)摰念I(lǐng)域,這就是安全問(wèn)題。由于某些原因,這似乎是我們最終總是在考慮的事情。
我們?nèi)绾螛?gòu)建安全代碼?這不是那么微不足道,但它需要開(kāi)發(fā)人員自己思考,因?yàn)榇蠖鄶?shù)時(shí)候這個(gè)領(lǐng)域不會(huì)被需求所覆蓋。因此,我們需要確保我們剛剛編寫(xiě)的漂亮登錄頁(yè)面確實(shí)是安全的。
我們是那些看到這樣的網(wǎng)址的人:www.baidu.com / user-details / 1。并且自己想一想,“嗯,我想知道如果我在URL中用1替換1并且輸入”,會(huì)發(fā)生什么?“ 我們確保不暴露敏感數(shù)據(jù)。我們確保構(gòu)建一個(gè)只能由目標(biāo)受眾訪問(wèn)的API,而不是其他任何人。
這是一個(gè)巨大的主題,值得一篇文章?,F(xiàn)在,因?yàn)槲覀冇幸粋€(gè)工匠的態(tài)度,我們可以查看我們的登錄頁(yè)面并開(kāi)始思考,我們將如何破解它?也許我們?nèi)ラ喿x一些關(guān)于道德黑客攻擊,獲得一些想法,看看世界的另一面如何運(yùn)作并試圖破解我們自己的代碼。它不會(huì)是好的,它不會(huì)是100%,但它是一個(gè)開(kāi)始。
專(zhuān)注于改變的事物
我們都希望研究最新和最偉大的事物,但這并不總是可行的。
無(wú)論是最新的框架,最新版本的東西,也許是一個(gè)新的數(shù)據(jù)庫(kù)系統(tǒng),也許是一種新的API類(lèi)型,無(wú)論它是什么,我們都想要它!這不一定是壞事,最好跟上最新的發(fā)展。然而,也意識(shí)到需要保持相對(duì)的平衡。
通過(guò)快速地從一件事跳到另一件事,我們可能無(wú)法深入學(xué)習(xí)任何東西,我們最終只能獲得表面知識(shí)。這絕對(duì)不是一件好事!
有很多產(chǎn)品用語(yǔ)言和版本編寫(xiě),這些產(chǎn)品已經(jīng)有好幾年了。有人仍然需要維護(hù)甚至升級(jí)它們。企業(yè)很少會(huì)接受完全重寫(xiě)的應(yīng)用程序,它可以很好地完成工作。這是預(yù)期的,我們需要了解這一點(diǎn)。是的,即使在較舊的產(chǎn)品中也總會(huì)有一些我們可以改進(jìn)的東西,如果我們能夠提供足夠的理由,那么某些變化就會(huì)發(fā)生。
這完全取決于我們向客戶(hù)解釋變更的價(jià)值。它不是用技術(shù)語(yǔ)言完成的,非技術(shù)人員必須理解它。這完全取決于溝通技巧和商業(yè)價(jià)值。
結(jié)論
我們需要不斷學(xué)習(xí),不斷充實(shí)自己。如果我們?cè)谝粋€(gè)由十個(gè)開(kāi)發(fā)人員組成的團(tuán)隊(duì)中,我們幫助他們每人提高10%,那么對(duì)每個(gè)人來(lái)說(shuō),總計(jì)100%。
我們自己的價(jià)值并不是我們帶到桌面上的唯一價(jià)值,我們可以為別人做些什么甚至更多。
我們需要更加相信我們的技能并負(fù)責(zé),確保正確的事情完成,確保仍然存在平衡,我們可以構(gòu)建能夠經(jīng)得起時(shí)間考驗(yàn)的項(xiàng)目

當(dāng)前名稱(chēng):軟件開(kāi)發(fā)中,我們應(yīng)該保持的工匠心態(tài)
URL分享:http://www.bm7419.com/news/113584.html

網(wǎng)站建設(shè)、網(wǎng)絡(luò)推廣公司-創(chuàng)新互聯(lián),是專(zhuān)注品牌與效果的網(wǎng)站制作,網(wǎng)絡(luò)營(yíng)銷(xiāo)seo公司;服務(wù)項(xiàng)目有軟件開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司