為了給這十年來一個(gè)總結(jié),我想分享一下我在過去的十年當(dāng)中作為一名開發(fā)者的心路歷程。 對(duì)于現(xiàn)今的初級(jí)開發(fā)者來說,或許他們會(huì)在這篇文章里找到一些能夠引起他們共鳴的東西,或者讓他們深受鼓舞的東西。對(duì)于現(xiàn)今的高級(jí)開發(fā)者來說,或許他們也有一些有趣的故事可以分享,因?yàn)樗麄兌际沁^來人。 我在 19 歲的時(shí)候開始應(yīng)聘我的第一份開發(fā)工作,當(dāng)時(shí)的那個(gè)職位叫作“Student Webmaster”。這個(gè)職位很有意思,因?yàn)槿绻隳玫竭@個(gè)職位,就變成了“學(xué)生”和“大師”的結(jié)合體。不過現(xiàn)在的人更希望成為“工程師”,因?yàn)檫@個(gè)頭銜聽起來似乎更有發(fā)燒友的味道。我當(dāng)時(shí)的工作是負(fù)責(zé) PHP 和 MySQL 方面的開發(fā),維護(hù) Drupal 網(wǎng)站,以及開發(fā)一些內(nèi)部工具。 因?yàn)樵诤⑼瘯r(shí)代就開始寫代碼,并且我很肯定它們可以作為正式的經(jīng)驗(yàn),所以當(dāng)被問及我有幾年 PHP 經(jīng)驗(yàn)時(shí),我非常自信地回答道:”三到四年“! 我當(dāng)時(shí)覺得我對(duì) SQL 應(yīng)該懂得挺多了,因?yàn)槲叶紩?huì)用外連接了。 在當(dāng)時(shí),三到四年的經(jīng)驗(yàn)意味著我可以拿到比較可觀的薪水了。 五年之后,我開始了最近的這份工作。即使是到了這個(gè)時(shí)候,我的代碼都沒有給別人評(píng)審過。在部署代碼的時(shí)候,我直接從 Git 上拉取代碼,然后通過 SSH 部署到服務(wù)器上。我敢肯定我?guī)缀鯖]有提交過 PR。不過不要誤會(huì),其實(shí)我在頭兩份工作中學(xué)到了很多有用的東西,只是我從來沒有真正地和其他開發(fā)者一起開發(fā)過同一個(gè)代碼庫。我就是這樣去申請了”高級(jí)前端開發(fā)“的職位,并拿到了 offer。 就這樣,我成了一名 24 歲的高級(jí)開發(fā)者。 我的意思是,如果我撐不起這個(gè)頭銜,他們也不會(huì)給我這個(gè)職位的,對(duì)吧?我很確信的是,我之所以能夠拿到這個(gè)職位,是因?yàn)槲疫^去的那些令人印象深刻的經(jīng)歷。我感覺自己達(dá)到了職業(yè)生涯的巔峰,我是公司里最年輕的開發(fā)者。
我的職業(yè)生涯的前半部分主要從事學(xué)術(shù)方面的工作。具體地說,有三年半時(shí)間花在了一個(gè)由公共基金支持的項(xiàng)目上,然后一年半是在大學(xué)里。我可以告訴你:學(xué)術(shù)界的編程與業(yè)界的編程其實(shí)完全不一樣。 你的大部分時(shí)間并不是在開發(fā)應(yīng)用程序,而是在寫算法或者解析數(shù)據(jù)集。如果湊巧你是在開發(fā)應(yīng)用程序,那么它很可能也只是個(gè)公共項(xiàng)目——要么是免費(fèi)的,要么是開源的。免費(fèi)的項(xiàng)目意味著你不一定會(huì)全力以赴把它做到完美。 畢竟,天下沒有免費(fèi)的午餐。 后來,我?guī)е芏嗥谕x開了學(xué)術(shù)界。 我期望能夠在業(yè)界看到我想看到的東西,比如自動(dòng)化部署、PR 和代碼評(píng)審,以及高質(zhì)量的代碼!我堅(jiān)信業(yè)界的每個(gè)開發(fā)者都會(huì)寫測試代碼。 但是,在我加入第一家初創(chuàng)公司的那一天,居然沒有看到任何測試代碼。前端沒有,后端也沒有,什么測試代碼都沒有。 更糟糕的是,沒有測試代碼也就算了,居然沒有人認(rèn)為缺少測試代碼是個(gè)問題!帶著一點(diǎn)點(diǎn)的天真,我就當(dāng)是他們不知道如何為 AngularJS 編寫測試代碼吧。如果我教他們怎么寫測試代碼,或許這個(gè)問題就解決了吧。但我錯(cuò)了!幾年之后,我們在添加自動(dòng)化測試代碼方面有了長足的進(jìn)步,但與我最初想象的并不一樣! 他們之前不寫測試代碼并不是因?yàn)椴恢涝撛趺磳?,而是他們體會(huì)不到?jīng)]有測試代碼的痛苦,或者不堪忍受維護(hù)遺留測試代碼給他們帶來的痛苦。
這個(gè)與上一個(gè)話題有點(diǎn)關(guān)系。我們公司沒有人寫單元測試代碼,但是其他公司的人會(huì)寫的,對(duì)嗎? 我讀過很多博文,在 YouTube 上看過很多大會(huì)演講的視頻。好像他們每個(gè)人都能做出非常復(fù)雜且質(zhì)量很高的應(yīng)用程序,不僅性能好,還非常有趣。而我呢,能夠趕在截止日期之前把能用的東西拼湊在一起,并讓它們運(yùn)行起來就算不錯(cuò)了。 基本上,我對(duì)這些公司充滿了崇拜之情,但同時(shí)又對(duì)自己的公司和項(xiàng)目落于人后而感到失望。
在以前,我對(duì)代碼評(píng)審的要求是很嚴(yán)格的。 至少,我對(duì)代碼風(fēng)格是十分挑剔的。縮進(jìn)、格式化、命名——你最好要做得和我一模一樣。代碼評(píng)審不留下任何評(píng)論的幾率跟中彩票的幾率一樣低。 想象一下,一個(gè) PR 里有我的 50 多個(gè)評(píng)論,都是因?yàn)槿鄙俜痔?hào)! 因?yàn)槲矣幸浑p老鷹似的眼睛,不會(huì)漏掉任何一個(gè)分號(hào)!
在加入第一家公司時(shí),我需要處理大量別人留給我的代碼。我在干第一份工作時(shí)有做過一些類似的事情,但后來都沒有真正深入到已有的代碼庫,弄跟無頭蒼蠅一樣到處亂撞。我寧愿重寫所有代碼,也不想一點(diǎn)一點(diǎn)去理清楚老代碼是怎么寫的。 但即使是這樣又能怎樣?一個(gè) Ruby 程序員寫出來的 AngularJS 代碼,或者一個(gè)自認(rèn)為自己很厲害的初級(jí)程序員寫出來的代碼,別人照樣看不懂。 所以,我開始在所有可能的地方添加注釋,給所有函數(shù)加了注解。 我學(xué)會(huì)了所有與 Angular 相關(guān)的 JSDoc 語法。我的代碼行數(shù)因此增加了一倍,因?yàn)橛刑嗟淖⑨尅?/p>
在很長一段時(shí)間里,我認(rèn)為任何“混亂”的代碼都是技術(shù)債務(wù)。技術(shù)債務(wù)這個(gè)東西很有意思,如果你讓不同的人例舉技術(shù)債務(wù)的例子,他們會(huì)給出不同的答案。 因此,作為一個(gè)將“混亂”代碼視為技術(shù)債務(wù)的人,我會(huì)立即使用最嚴(yán)格的方式消除這類代碼! 我曾經(jīng)花了一整個(gè)周末修復(fù)了 800 個(gè) linting 錯(cuò)誤(當(dāng)然是在出現(xiàn)自動(dòng)修復(fù)工具之前)。 可見我是一個(gè)多么神經(jīng)質(zhì)的人。
因?yàn)閺男【蛯懘a,編程對(duì)我來說就像呼吸一樣。寫代碼就像在寫博客或者郵件,通常比別人更快給出解決方案。 在很長一段時(shí)間里,我一直在思考這個(gè)問題:這就是成為高級(jí)開發(fā)者要做的事情的嗎? 難道不是這樣嗎?因?yàn)轭^銜是叫“高級(jí)開發(fā)者”,又不是叫“高級(jí)溝通者”或者“高級(jí)項(xiàng)目經(jīng)理”,不是嗎?我不知道要成為高級(jí)開發(fā)者,除了編程還需要其他什么技能。
原文鏈接: https:///blog/2019/06/03/absolute-truths-unlearned-as-junior-developer/ 你也「在看」嗎??? |
|