2016-2022 All Rights Reserved.平安財(cái)經(jīng)網(wǎng).復(fù)制必究 聯(lián)系QQ280 715 8082 備案號(hào):閩ICP備19027007號(hào)-6
本站除標(biāo)明“本站原創(chuàng)”外所有信息均轉(zhuǎn)載自互聯(lián)網(wǎng) 版權(quán)歸原作者所有。
作為開(kāi)發(fā)人員,我們?cè)诼殬I(yè)生涯的不同階段會(huì)犯不同類型的錯(cuò)誤。特別是在WordPress開(kāi)發(fā)中,隨著我們對(duì)WordPress代碼庫(kù)熟悉程度的增加,我們會(huì)犯不同類型的錯(cuò)誤。
幾年前,我聽(tīng)馬特·穆倫維格說(shuō)過(guò)一句話:大多數(shù)人都會(huì)重復(fù)他們的錯(cuò)誤,更聰明的人會(huì)從他們的錯(cuò)誤中學(xué)習(xí),而最聰明的人則會(huì)從別人的錯(cuò)誤中學(xué)習(xí)。我很喜歡這個(gè),我再加上一個(gè)推論:每個(gè)人都會(huì)犯錯(cuò)誤,謙虛的人會(huì)私下分享這些錯(cuò)誤,最大膽的人會(huì)把它們寫(xiě)下來(lái)并在博客上發(fā)表!
但是以后還有時(shí)間思考。你讀這篇文章是因?yàn)槟阆胫阑疖囅嘧驳氖?,而我是工程師。沒(méi)有更多的序言,和我一起回顧一下我作為一個(gè)WordPress開(kāi)發(fā)者所犯的五個(gè)最尷尬的錯(cuò)誤。
那時(shí)我剛從CraigsList網(wǎng)站上一個(gè)非常不起眼的編碼工作中畢業(yè),在一個(gè)真正的廣告公司工作。我已經(jīng)到了!在沙發(fā)以外的地方工作,穿著睡衣以外的衣服,這讓我很緊張。但即便如此,我還是知道WordPress做錯(cuò)了還是對(duì)的,而且我發(fā)現(xiàn)吹噓WordPress的最佳實(shí)踐是一件很愉快的事,就像從來(lái)沒(méi)有“侵入核心”一樣。
我在這個(gè)機(jī)構(gòu)的第一項(xiàng)wordpress開(kāi)發(fā)任務(wù)是恢復(fù)一個(gè)停滯的項(xiàng)目——對(duì)我當(dāng)時(shí)的技能來(lái)說(shuō),這是一個(gè)相當(dāng)復(fù)雜的項(xiàng)目。它涉及到WordPress注冊(cè)和登錄流程的大量定制。前一位開(kāi)發(fā)人員通過(guò)簡(jiǎn)單地編輯corewp-loginfile就取得了顯著的進(jìn)展。
我知道這是不可持續(xù)的,所以我的第一件事就是安裝一個(gè)備份/恢復(fù)插件,用一個(gè)新下載的版本替換WordPress核心。我很有信心,到目前為止,在這個(gè)項(xiàng)目中沒(méi)有任何令人印象深刻的東西被執(zhí)行,而且我可以通過(guò)過(guò)濾器來(lái)模仿現(xiàn)有的特性集。
在那個(gè)時(shí)候,無(wú)論我是否具備編程能力,很快就變得無(wú)關(guān)緊要了,因?yàn)槲业男鹿椭鞣浅I鷼?。她不理解“hacking core”的意義,而我也不夠成熟,無(wú)法用一種容易理解的方式來(lái)解釋。我向她保證,我可以通過(guò)我安裝的備份/恢復(fù)插件來(lái)恢復(fù),這讓她的額頭暫時(shí)涼了下來(lái)。
你能猜到這是怎么回事嗎?
那個(gè)插件,就像命運(yùn)所希望的那樣,只備份了wp-contentfolder。不管核心文件中的WordPress hack是什么,都永遠(yuǎn)消失了。我還記得我給她的電子郵件(那時(shí)她早已把我趕回了家里的辦公室):
我真的準(zhǔn)備好了通過(guò)過(guò)濾器和動(dòng)作來(lái)完成她想要的功能設(shè)置,但是她不聽(tīng)。她當(dāng)場(chǎng)就把我解雇了,還威脅說(shuō)要告我,而且她連我兩周辛苦工作的工錢都沒(méi)有付。我感到很丟臉。
[閱讀:這是每個(gè)開(kāi)發(fā)人員應(yīng)該知道的關(guān)于設(shè)計(jì)的東西]
從這次經(jīng)歷中,我可以學(xué)到很多東西(現(xiàn)在很明顯了)。一個(gè)普遍的教訓(xùn)是,只有經(jīng)過(guò)演練和確認(rèn),備份才算備份,這是一個(gè)很好的教訓(xùn)。但更讓我印象深刻的是關(guān)于如何在WordPress中進(jìn)行備份的具體教訓(xùn)——尤其是在WordPress核心中。
我已經(jīng)學(xué)會(huì)了真正珍惜像WP-Engine這樣具有健壯備份/恢復(fù)系統(tǒng)的托管環(huán)境。許多精品主機(jī)都有各種命令行工具和其他針對(duì)開(kāi)發(fā)人員的用于執(zhí)行備份的特性,但WP-Engine是我的最愛(ài)。它非常快,除非你有一個(gè)非常大的網(wǎng)絡(luò)。UI很簡(jiǎn)單。所有知道如何使用WordPress的人都可以使用它。即。與一些可能更快的CLI方法或隱藏在Plesk中的一些晦澀的東西相比,我的客戶可以使用它、理解它、監(jiān)視它并驗(yàn)證我正在使用它。我是你的超級(jí)粉絲。
當(dāng)時(shí)我還不太熟悉專業(yè)的工作環(huán)境,而且一直都是Windows操作系統(tǒng)的忠實(shí)用戶。然而,我的新工作是在一家Mac商店,我很快就愛(ài)上了它的一切。嗯,幾乎一切。我似乎在使用“魔法鼠標(biāo)”時(shí)遇到了很多麻煩?!拔矣锌赡軙?huì)失去藍(lán)牙連接,導(dǎo)致在重新連接后出現(xiàn)意外的拖放操作。不僅如此,我只是對(duì)一項(xiàng)新的精細(xì)的運(yùn)動(dòng)技能笨手笨腳。
現(xiàn)在,我們的WordPress開(kāi)發(fā)流程仍然包括通過(guò)FTP部署到產(chǎn)品中。對(duì)我來(lái)說(shuō),花上整個(gè)工作日來(lái)寫(xiě)代碼、聊天、回復(fù)電子郵件、通過(guò)我的新魔法鼠標(biāo)來(lái)來(lái)回回的情況并不少見(jiàn),而Cyberduck則在我的桌面上開(kāi)放生產(chǎn)。天哪,這聽(tīng)起來(lái)糟透了!但事情就是這樣。
有一天我們的整個(gè)平臺(tái)都不見(jiàn)了。我們的系統(tǒng)管理員很快就假設(shè)它是某種DDoS,或者通常在他的級(jí)別上的東西。至于我們開(kāi)發(fā)人員,我們相信他的直覺(jué),并認(rèn)為他很快就會(huì)明白的。
幾個(gè)小時(shí)過(guò)去了。這一天來(lái)了又去。仍然下降。
第二天早上,一切都恢復(fù)了,我們的首席技術(shù)官溫柔地邀請(qǐng)我去會(huì)議室和她一起開(kāi)會(huì)。我們的系統(tǒng)管理員已經(jīng)發(fā)現(xiàn)了問(wèn)題。他拉出FTP日志,發(fā)現(xiàn)我的用戶將我們的整個(gè)平臺(tái)移動(dòng)到一個(gè)兄弟目錄中。也就是說(shuō),wp-contenthad嵌套在wp-include之下。
我很沮喪,但我們的CTO很棒。她可以看出,我基本上是一個(gè)樂(lè)于助人、負(fù)責(zé)任的員工,但她要求我不僅僅是悔悟,還要想辦法防止這種情況再次發(fā)生。我發(fā)現(xiàn)了兩件非常有用的事情。
第一個(gè)是定位一個(gè)CLI命令來(lái)阻止Cyberduck允許遠(yuǎn)程到遠(yuǎn)程的文件移動(dòng)。這是一個(gè)很好的安全措施,我們立即將其作為公司的政策。
其次,我對(duì)通過(guò)Git進(jìn)行部署非常感興趣。最后,我編寫(xiě)了一個(gè)WordPress插件,將Bitbucket版本編入正常的wp-adminupdate流程中。從那時(shí)起,我們幾乎沒(méi)有任何理由不去接觸生產(chǎn)。這個(gè)插件是我最喜歡的專業(yè)成就之一。當(dāng)然,對(duì)Git的親和力是當(dāng)今開(kāi)發(fā)人員的先決條件。
到目前為止,我真的認(rèn)為我已經(jīng)很聰明地使用了WordPress。該請(qǐng)求是在某一類別的文章上附加一個(gè)“徽章”。出于某種原因,我想到只有新手才會(huì)在模板文件中添加這樣的條件,所以我很自豪地實(shí)現(xiàn)了以下過(guò)濾器:
這有什么不對(duì)嗎?我在階段測(cè)試中快速測(cè)試了它,以確認(rèn)必要的帖子獲得了他們的徽章。然后我部署了它,把工作留給了今天。你可能猜到了,宇宙爆炸了。
具體來(lái)說(shuō),結(jié)果就是沒(méi)有徽章的帖子會(huì)被渲染到?jīng)]有任何內(nèi)容的前端!你知道為什么嗎?問(wèn)題是,我沒(méi)有返回$contentin我的保護(hù)條件,而是返回false。但這里確實(shí)有很多層次的錯(cuò)誤。
為什么我只測(cè)試帖子是否收到了徽章?為什么我沒(méi)有測(cè)試其他帖子是否完好無(wú)損?為什么我這么晚才部署到生產(chǎn)部門(mén)?為什么我們的質(zhì)量控制完全是由我點(diǎn)擊和刷新頁(yè)面組成的呢?
所有這些問(wèn)題的答案可以總結(jié)為成熟。在我們開(kāi)始投資于諸如視覺(jué)回歸測(cè)試和單元測(cè)試之類的東西之前,只是需要一段時(shí)間來(lái)厭倦犯這種類型的錯(cuò)誤。這個(gè)特殊的錯(cuò)誤是數(shù)百個(gè)錯(cuò)誤中的一根稻草,最終壓斷了駱駝的脊背,使我對(duì)inphpUnit和xDebug投入了很多。反過(guò)來(lái),這些工具教會(huì)了我如何編寫(xiě)可測(cè)試代碼,這可能比測(cè)試本身防止了更多的bug。
客戶請(qǐng)求重新格式化WordPress博客的文章,這樣日期就會(huì)變成“XYZ前”,而不是“2011年11月10日”。我不太確定如何做到這一點(diǎn),但我意識(shí)到這是一種越來(lái)越流行的日期格式,谷歌博士很快就給了我一個(gè)片段。它在我的本地成功了!里面有很多數(shù)學(xué),特別是除法。我不太清楚它為什么能工作——有很多嵌套的循環(huán)、余數(shù)、四舍五入等等。但它是在谷歌上,它似乎工作,我很高興部署到生產(chǎn)。
大約30分鐘后,我收到了系統(tǒng)管理員發(fā)來(lái)的不友好的Skype。生產(chǎn)下降。死在水里。他問(wèn)我最近是不是除以了0,我不知道他指的是什么。這是發(fā)生了什么事。
信不信由你,我發(fā)現(xiàn)的不可讀的“在我的本地工作”片段,給定足夠大的樣本大小,可能會(huì)產(chǎn)生一些異常行為。由于提供了一些天、小時(shí)和分鐘的不幸組合,Rube Goldberg循環(huán)偶爾會(huì)嘗試將一個(gè)數(shù)字除以0?;叵敫咧袛?shù)學(xué):
在普通算術(shù)中,該表達(dá)式?jīng)]有意義,因?yàn)闆](méi)有數(shù)乘以0得到a(假設(shè)a≠0),因此除0沒(méi)有定義。維基百科
那么這對(duì)計(jì)算機(jī)意味著什么呢?通常日志中只有一條錯(cuò)誤消息,但在我的例子中,情況更糟:數(shù)學(xué)錯(cuò)誤干擾了循環(huán)邏輯,導(dǎo)致嵌套循環(huán)未完成就運(yùn)行——一個(gè)無(wú)限循環(huán)導(dǎo)致白屏死機(jī)。更糟的是!由于循環(huán)的每次迭代都編寫(xiě)一個(gè)除以0的錯(cuò)誤,因此錯(cuò)誤日志增長(zhǎng)到不可思議的比例,并開(kāi)始妨礙我們的文件系統(tǒng)。這產(chǎn)生了DDoS攻擊的效果,盡管這是一種荒唐的自找的攻擊。
這個(gè)錯(cuò)誤的壞處是,它導(dǎo)致一個(gè)高流量的網(wǎng)站癱瘓。這個(gè)錯(cuò)誤的好處是,它極大地改變了我的工作方式。最令我羞愧的是,我愿意在沒(méi)有理解的情況下實(shí)施。我發(fā)誓再也不會(huì)在沒(méi)有盡一切努力理解每一行的情況下粘貼代碼片段,甚至在必要時(shí)還會(huì)跟蹤代碼片段的作者。
更重要的是,我發(fā)誓再也不會(huì)發(fā)布對(duì)新手開(kāi)發(fā)人員可讀性不高的代碼。我開(kāi)始著迷于WordPress的編碼標(biāo)準(zhǔn)、文本編輯器擴(kuò)展、內(nèi)聯(lián)評(píng)論和文檔塊,甚至制表符對(duì)空格,那經(jīng)典的通過(guò)程序的方式!總之,我決定更關(guān)心讀代碼有多容易,而不是寫(xiě)代碼有多容易。這種對(duì)沒(méi)有理解的粘貼的反叛使我對(duì)管理第三方依賴產(chǎn)生了濃厚的專業(yè)興趣,這個(gè)主題在接下來(lái)的十年里為我提供了各種寫(xiě)作和演講機(jī)會(huì)。
我完成了一個(gè)非常吸引人的項(xiàng)目。我將是技術(shù)主管和WordPress開(kāi)發(fā)工程師,我將有一個(gè)亞馬遜AWS Lambda開(kāi)發(fā)人員和一個(gè)在JavaScript方面的專家向我報(bào)告。這是我第一次有多人向我匯報(bào)工作,也是迄今為止我參與過(guò)的最復(fù)雜的項(xiàng)目。即使把它稱為一個(gè)WordPress項(xiàng)目也大大低估了它的重要性,但是WordPress是將整個(gè)項(xiàng)目結(jié)合在一起的粘合劑,所以我作為技術(shù)領(lǐng)導(dǎo)者是很有意義的。
因?yàn)槲业闹饕巧菄?yán)格意義上的技術(shù)人員,也因?yàn)槲蚁矚g極簡(jiǎn)主義,我從來(lái)沒(méi)有想過(guò)實(shí)現(xiàn)像Jira或Basecamp或任何真正的任務(wù)管理平臺(tái)。項(xiàng)目的第一次迭代進(jìn)展得相當(dāng)順利。我們能夠開(kāi)發(fā)自己的獨(dú)立組件,將客戶規(guī)范文檔作為產(chǎn)品路線圖,并且在需要將東西組合在一起時(shí)通過(guò)Slack相互聯(lián)系。
當(dāng)我們開(kāi)始向客戶展示進(jìn)展并執(zhí)行他的反饋時(shí),問(wèn)題就出現(xiàn)了。剛開(kāi)始的這個(gè)三人團(tuán)隊(duì)立刻感覺(jué)自己被帶到了一個(gè)新的數(shù)量級(jí):不清楚誰(shuí)負(fù)責(zé)哪一點(diǎn)反饋,不清楚執(zhí)行反饋的狀態(tài),甚至不清楚誰(shuí)在和誰(shuí)交談。我們多次超過(guò)了Gmail的限制,每個(gè)線程回復(fù)100個(gè)!
事情開(kāi)始變得不舒服了。我認(rèn)為客戶感覺(jué)他失去了對(duì)項(xiàng)目方向的控制,同樣重要的是,他感覺(jué)他失去了對(duì)項(xiàng)目狀態(tài)的可見(jiàn)性。我的亞馬遜開(kāi)發(fā)人員有一天提到,“我想知道我們是否應(yīng)該使用Trello?!?/p>
嗯,我想。一個(gè)三人團(tuán)隊(duì)需要這樣的平臺(tái)嗎?同樣,我通常傾向于使用更少的工具,更少的開(kāi)銷,更少的復(fù)雜性。但是這個(gè)項(xiàng)目已經(jīng)把我們都拖下水了,那么嘗試一下有什么害處呢?
我梳理了我們所有的電子郵件,所有的規(guī)范文檔,所有不同的評(píng)論線程,并把它們都映射到Trello板上。很快,這個(gè)項(xiàng)目就從它的數(shù)字墳?zāi)怪袕?fù)活了,因?yàn)槲覀兛梢杂酶俚哪X力開(kāi)銷進(jìn)行交流。我們沒(méi)有在我的電子郵件收件箱或過(guò)時(shí)的規(guī)范文檔中搜索文本,而是使用了可愛(ài)的板、列表和卡片??梢院苋菀椎乜吹饺魏翁匦缘臓顟B(tài)、包含反饋和分配新任務(wù)。感覺(jué)就像我們漸漸失明了,速度如此之慢以至于我們都沒(méi)有注意到,然后突然又能看見(jiàn)了。
當(dāng)然,代碼不是自己編寫(xiě)的,它仍然是一個(gè)非常具有挑戰(zhàn)性的項(xiàng)目,我們?nèi)匀槐仨毷褂梦覀兊拿恳环旨夹g(shù)技能。但這就是重點(diǎn):因?yàn)槲覀兘K于有了一個(gè)理解項(xiàng)目的基礎(chǔ)設(shè)施,我們現(xiàn)在可以自由地應(yīng)用我們的技術(shù)技能了。
我很高興地說(shuō),那個(gè)項(xiàng)目的完成讓客戶非常滿意?,F(xiàn)在,我認(rèn)為T(mén)rello或Jira是兩個(gè)或更多團(tuán)隊(duì)的實(shí)際需求。
這是我在軍隊(duì)里聽(tīng)到的最聰明的事情之一:“中尉犯中尉的錯(cuò)誤沒(méi)關(guān)系,上尉犯上尉的錯(cuò)誤也沒(méi)關(guān)系?!鄙衔痉钢形镜腻e(cuò)誤,或者中尉犯私人的錯(cuò)誤,都是不對(duì)的?!?/p>
換句話說(shuō),就你目前的責(zé)任水平而言,犯一些常見(jiàn)的錯(cuò)誤是理所當(dāng)然的。更重要的是你如何從中成長(zhǎng)。
我希望我們作為開(kāi)發(fā)人員,能夠在別人犯錯(cuò)時(shí)學(xué)會(huì)同情他們,希望別人也能這樣對(duì)待我們。我希望在我犯錯(cuò)誤的時(shí)候保持好奇心和責(zé)任感,這樣我就可以繼續(xù)創(chuàng)新。我希望身邊總是有一群鼓舞人心的wordpress專家,我可以從他們的錯(cuò)誤中吸取教訓(xùn),避免犯同樣的錯(cuò)誤。最重要的是,我希望其他人能從我的經(jīng)驗(yàn)中學(xué)習(xí),比如我在這里分享的WordPress錯(cuò)誤。
2016-2022 All Rights Reserved.平安財(cái)經(jīng)網(wǎng).復(fù)制必究 聯(lián)系QQ280 715 8082 備案號(hào):閩ICP備19027007號(hào)-6
本站除標(biāo)明“本站原創(chuàng)”外所有信息均轉(zhuǎn)載自互聯(lián)網(wǎng) 版權(quán)歸原作者所有。