不要拒絕面試詢(xún)問(wèn)休假時(shí)間的人:20年老程序員總結(jié)的經(jīng)驗(yàn)
近日,新聞網(wǎng)站 Hacker News 一個(gè)帖子可謂火爆,該貼內(nèi)容講的是一位有 20 年軟件經(jīng)驗(yàn)的工程師,學(xué)到的 20 件事。
如果你在科技領(lǐng)域工作多年,有什么對(duì)后來(lái)人要說(shuō)的話?這篇文章中包含 20 條建議,許多建議都是來(lái)自他人的一些經(jīng)驗(yàn)總結(jié)。文章作者 Justin Etheredge 工作經(jīng)歷可謂豐富,他的職業(yè)生涯中前半部分是軟件工程師,為各種小型企業(yè)和初創(chuàng)公司工作,然后進(jìn)入咨詢(xún)行業(yè)并在許多真正的大型企業(yè)中任職。之后 Justin Etheredge 職業(yè)發(fā)展良好,團(tuán)隊(duì)從 2 人發(fā)展到 25 人。10 年前,Justin Etheredge 主要與中小型企業(yè)合作,現(xiàn)在他們與大型和小型企業(yè)合作。
這 20 條建議主要來(lái)自以下這些人的經(jīng)驗(yàn)總結(jié):
- 那些幾乎總是在小的、精益的團(tuán)隊(duì)中工作的人,因?yàn)樗麄兡苡煤苌俚馁Y源做更多的事情;
- 那些重視工作軟件開(kāi)發(fā)而不是特定工具的人;
- 那些一直都在開(kāi)展新的項(xiàng)目,而且還要兼顧維護(hù)一些其他系統(tǒng)的人;
- 那些將工程師的生產(chǎn)力當(dāng)作第一要?jiǎng)?wù),置于其他工作之上的人。
Justin Etheredge 表示,自己在過(guò)去 20 年的經(jīng)歷塑造了他對(duì)軟件的看法,并產(chǎn)生了一些信念,他試圖將這些信念縮減為一個(gè)可管理的列表,希望這些建議能給別人帶來(lái)價(jià)值。
Justin Etheredge 的 20 條經(jīng)驗(yàn)分享
1. 我還是什么都不懂
我們中的大多數(shù)人可能都會(huì)頻繁聽(tīng)到類(lèi)似這樣的話,「你怎么會(huì)不知道什么是 BGP?你從沒(méi)聽(tīng)說(shuō)過(guò) Rust?」我們中的許多人喜歡軟件的原因是因?yàn)槲覀兪墙K身學(xué)習(xí)者,在軟件領(lǐng)域,無(wú)論你朝哪個(gè)方向發(fā)展,都有廣闊的知識(shí)視野向各個(gè)方向傳播,并且發(fā)展方向每天都在擴(kuò)展。這意味著你可以在職業(yè)生涯中度過(guò)幾十年,但與在看似相似的角色上也花了幾十年的人相比,軟件領(lǐng)域的人仍然存在巨大的知識(shí)差距。你越早意識(shí)到這一點(diǎn),你就可以越早擺脫冒名頂替綜合癥,而是樂(lè)于向他人學(xué)習(xí)和教導(dǎo)他人。
2. 軟件最困難的部分是構(gòu)建正確的內(nèi)容
大多數(shù)軟件工程師不相信這一點(diǎn)的原因是因?yàn)樗麄冋J(rèn)為這貶低了自己的工作。然而相反的是,恰恰是這一點(diǎn)突出了軟件工程師工作環(huán)境的復(fù)雜性和非理性,這進(jìn)一步加劇了軟件工程師的挑戰(zhàn)。你可以設(shè)計(jì)出在技術(shù)上最令人驚嘆的東西,然而糟糕的是,最后沒(méi)人愿意使用它。這種事情無(wú)時(shí)無(wú)刻不在發(fā)生。設(shè)計(jì)軟件主要是一種傾聽(tīng)需求的活動(dòng),通常我們必須兼任軟件工程師、聆聽(tīng)者和人類(lèi)學(xué)家的身份。專(zhuān)注于這個(gè)設(shè)計(jì)過(guò)程,無(wú)論是通過(guò)專(zhuān)門(mén)的 UX 團(tuán)隊(duì)成員還是通過(guò)簡(jiǎn)單的自我教育,都將帶來(lái)巨大的回報(bào)。
3. 最好的軟件工程師需要像設(shè)計(jì)師一樣思考
偉大的軟件工程師會(huì)深入思考他們所寫(xiě)代碼的用戶體驗(yàn)。例如外部 API、編程 API、用戶界面、協(xié)議還是其他接口, 優(yōu)秀的軟件工程師會(huì)考慮誰(shuí)將使用他們的研究、為什么使用它、如何使用以及對(duì)這些用戶來(lái)說(shuō)什么是重要的。牢記用戶需求才是良好用戶體驗(yàn)的核心。
4. 最好的代碼是沒(méi)有代碼,或者是不需要維護(hù)的代碼
編程人員需要會(huì)編程。大多數(shù)人都會(huì)在自己擅長(zhǎng)的方面犯錯(cuò),這是人的本性。很多軟件工程師經(jīng)常在編寫(xiě)代碼方面犯錯(cuò),尤其是當(dāng)非技術(shù)解決方案不明顯時(shí)。無(wú)需人員維護(hù)的代碼也是如此。當(dāng)很多算法已經(jīng)存在時(shí),工程團(tuán)隊(duì)很容易想要開(kāi)辟新的方法,這是一個(gè)平衡的行為。
有很多理由讓你重新發(fā)明輪子,但需要注意的是「非原創(chuàng)」并不在其中。
5. 軟件是達(dá)到目的的一種手段
軟件工程師的主要工作是交付價(jià)值, 但很少有軟件開(kāi)發(fā)人員了解這一點(diǎn),甚至有更少的軟件開(kāi)發(fā)人員將其內(nèi)在化。真正內(nèi)在化會(huì)導(dǎo)致解決問(wèn)題的不同方式,以及查看工具的不同方式。如果你真的相信軟件是服從于結(jié)果的,你就會(huì)準(zhǔn)備好真正找到適合工作的工具,而這可能根本不是軟件。
6. 為自己設(shè)定截止日期
有些人傾向于深入問(wèn)題并開(kāi)始編寫(xiě)代碼,而有些人只想研究理論,沒(méi)有著手代碼,進(jìn)而讓自己陷入困難的漩渦。在這些情況下,為自己設(shè)定一個(gè)截止日期,然后開(kāi)始探索解決方案。當(dāng)你開(kāi)始解決問(wèn)題時(shí),你會(huì)很快學(xué)到更多,這將引導(dǎo)你迭代到更好的解決方案。
7. 如果你不能很好地把握可能發(fā)生的一切,你就不能設(shè)計(jì)一個(gè)好的系統(tǒng)
與開(kāi)發(fā)者生態(tài)系統(tǒng)進(jìn)展保持一致是一項(xiàng)巨大的工作,了解生態(tài)系統(tǒng)中哪些是至關(guān)重要的,如果你不了解給定生態(tài)系統(tǒng)中哪些是可能的,哪些是可用的,那么除了能發(fā)現(xiàn)最簡(jiǎn)單的問(wèn)題之外,你不可能為所有問(wèn)題設(shè)計(jì)一個(gè)合理的解決方案??偠灾阋枘切┖荛L(zhǎng)時(shí)間沒(méi)有編寫(xiě)任何代碼設(shè)計(jì)系統(tǒng)的人。
8. 每個(gè)系統(tǒng)都會(huì)很糟糕,你需要克服
Bjarne Stroustrup 有一句名言:只有兩種語(yǔ)言,即人們抱怨的語(yǔ)言和沒(méi)人使用的語(yǔ)言。這一名言可以擴(kuò)展到大型系統(tǒng)。如果沒(méi)有正確的軟件架構(gòu),你永遠(yuǎn)無(wú)法償還所有的技術(shù)債務(wù),你永遠(yuǎn)無(wú)法設(shè)計(jì)出完美的界面。盡量少擔(dān)心系統(tǒng)的優(yōu)雅和完美, 相反,要努力持續(xù)改進(jìn)你的系統(tǒng),并創(chuàng)建一個(gè)團(tuán)隊(duì)喜歡在其中工作的適宜系統(tǒng),并可持續(xù)地提供價(jià)值。
9. 多問(wèn)為什么
抓住任何機(jī)會(huì)進(jìn)行詢(xún)問(wèn)。例如「有新的團(tuán)隊(duì)成員加入嗎?注意他們?cè)谀睦锍霈F(xiàn)混淆以及他們問(wèn)的什么問(wèn)題。有一個(gè)沒(méi)有意義的新功能請(qǐng)求?」等等這些看似不起眼的問(wèn)題。確保自己了解目標(biāo)以及推動(dòng)此功能需求的因素。如果你沒(méi)有得到明確的答案,請(qǐng)繼續(xù)問(wèn)為什么,直到明白為止。
10. 程序員大神都是傳說(shuō)
尋找工作效率能達(dá)到 10 倍的程序員是不可取的。那些所謂的一個(gè)人可以在 1 天內(nèi)完成另一個(gè)程序員(有能力、努力工作、同樣有經(jīng)驗(yàn)的)在 2 周內(nèi)完成的想法是愚蠢的。假如程序員拋出 10 倍數(shù)量的代碼,那么你需要 10 倍數(shù)量的精力修復(fù)它。一個(gè)人成為 10 倍程序員的唯一方法是將他們與 0.1 倍程序員進(jìn)行比較。一個(gè)浪費(fèi)時(shí)間、不尋求反饋、不測(cè)試代碼、不考慮邊緣情況等的人…… 我們應(yīng)該更關(guān)注的是讓 0.1 倍的程序員遠(yuǎn)離我們的團(tuán)隊(duì),而不是尋找神話般的 10 倍程序員。
11. 工程師需要更多的建議
最讓人擔(dān)心的是沒(méi)有人對(duì)高級(jí)工程師構(gòu)建的軟件提出意見(jiàn),相反的,他們寧愿希望有人提出強(qiáng)烈的反對(duì)意見(jiàn),也不愿別人根本沒(méi)有意見(jiàn)。如果你正在使用某個(gè)工具,你需要更多的體驗(yàn)才能知道這個(gè)工具的優(yōu)勢(shì)和劣勢(shì),對(duì)于劣勢(shì),你可能需要探索其他語(yǔ)言、庫(kù)和范式才能解決。除了積極尋找別人是如何使用不同的工具和技術(shù)完成任務(wù)之外,沒(méi)有什么方法能更快地提升你的技能。
12. 你根本不懂什么是創(chuàng)新
人們經(jīng)常談?wù)搫?chuàng)新,但他們通常尋找的是廉價(jià)的勝利。如果你真的在創(chuàng)新,并改變了人們做事的方式,那么你應(yīng)該期待負(fù)面的反饋。如果你相信你正在做的事情,并知道它真的會(huì)改善一些事物,那么你需要準(zhǔn)備好迎接一場(chǎng)長(zhǎng)期的戰(zhàn)斗。
13. 數(shù)據(jù)是系統(tǒng)中最重要的部分
對(duì)于許多程序員來(lái)說(shuō),數(shù)據(jù)是系統(tǒng)中最重要的部分。在這樣的系統(tǒng)中,發(fā)生在黃金路徑之外的任何操作都會(huì)產(chǎn)生臟數(shù)據(jù)。將來(lái)處理這些臟數(shù)據(jù)可能會(huì)變成一場(chǎng)噩夢(mèng)。請(qǐng)記住,數(shù)據(jù)可能會(huì)比代碼庫(kù)存在時(shí)間更長(zhǎng)?;ňΡ3?jǐn)?shù)據(jù)的有序和清潔,從長(zhǎng)遠(yuǎn)來(lái)看,你會(huì)得到很好的回報(bào)。
14. 尋找技術(shù)「鯊魚(yú)」
一直存在的舊技術(shù)可看作「鯊魚(yú)」,而不是「恐龍」。這些舊技術(shù)很好地解決了問(wèn)題,以至于在不斷快速變化的技術(shù)世界中幸存下來(lái)。但是請(qǐng)不要隨意替換這些技術(shù),只有在有充分理由的情況下才替換它們。這些技術(shù)不會(huì)花哨,也不會(huì)令人興奮,但它們會(huì)在很多情況下完成工作。
15. 不要誤以為謙卑就是無(wú)知
很多軟件工程師不會(huì)發(fā)表意見(jiàn),除非被要求才會(huì)提出意見(jiàn)。不要以為別人不發(fā)表自己的觀點(diǎn)就沒(méi)有什么可補(bǔ)充的。有時(shí)候,最聒噪的人恰恰是我們最不想聽(tīng)的人。和你周?chē)娜私徽劊瑢で笏麄兊姆答伜徒ㄗh。你會(huì)慶幸你這么做了。
16. 軟件工程師應(yīng)該定期記錄研究
軟件工程師應(yīng)該定期寫(xiě)博客、寫(xiě)日記、寫(xiě)文檔,多做那些保持書(shū)面溝通技巧的事情。寫(xiě)作可以幫助軟件工程師思考問(wèn)題,并幫助自己與團(tuán)隊(duì)更有效地溝通。良好的書(shū)面溝通是任何軟件工程師都需要掌握的最重要的技能之一。
17. 讓過(guò)程盡可能的精簡(jiǎn)
如今,每個(gè)人都想變得敏捷,但敏捷是通過(guò)構(gòu)建小塊的東西,然后學(xué)習(xí)、迭代完成的。如果有人想把更多的東西塞進(jìn)去,這是不可取的。在工作中,你很少聽(tīng)到科技公司或大型開(kāi)源項(xiàng)目吹噓他們的 Scrum 流程有多棒?在工作中保持精益求精。
18. 軟件工程師需要有主人翁的感覺(jué)
如果你讓某人遠(yuǎn)離他們的工作成果,他們就不會(huì)那么關(guān)心自己的工作。這就是為什么跨職能團(tuán)隊(duì)工作得如此出色,以及為什么 DevOps 變得如此流行的主要原因。這不僅僅是關(guān)于交接和低效率,而是關(guān)于從頭到尾擁有整個(gè)過(guò)程,并直接負(fù)責(zé)交付價(jià)值。讓一群充滿激情的人完全擁有設(shè)計(jì)、構(gòu)建和交付軟件(或任何真正的東西)的所有權(quán),令人驚奇的事情就會(huì)發(fā)生。
19. 面試對(duì)于說(shuō)明一個(gè)團(tuán)隊(duì)成員的優(yōu)秀程度幾乎沒(méi)有價(jià)值
面試的意義在于了解他 / 她是誰(shuí),以及他們對(duì)于特定專(zhuān)業(yè)領(lǐng)域的興趣程度。而面試「原本該有」的意義,試圖了解他們是否能夠成為一個(gè)優(yōu)秀團(tuán)隊(duì)成員的努力都是徒勞的。相信我,一個(gè)人的聰明或博學(xué)程度和他是否能夠在團(tuán)隊(duì)中做到貢獻(xiàn)沒(méi)有太大關(guān)系。沒(méi)有人會(huì)在面試中告訴你,他們會(huì)不可靠、隨便罵人、自負(fù)或從不準(zhǔn)時(shí)出席會(huì)議。
有人可能會(huì)聲稱(chēng)他們可以在面試中看出端倪「如果他們?cè)诘谝淮蚊嬖囍性?xún)問(wèn)休息時(shí)間,那就要小心了。」但這些都是胡說(shuō)八道。如果你使用這樣的信號(hào)作為評(píng)判標(biāo)準(zhǔn),你只是在猜測(cè)并拒絕優(yōu)秀的候選人。
20. 小即是美
有很多力量會(huì)促使你預(yù)先構(gòu)建更大的系統(tǒng)。要求更多的預(yù)算,無(wú)法決定削減哪項(xiàng)功能,希望提供系統(tǒng)的「最佳版本」,所有這一切都在推動(dòng)我們構(gòu)建過(guò)多,但你應(yīng)該為反對(duì)這種趨勢(shì)而戰(zhàn)。構(gòu)建一個(gè)系統(tǒng)地時(shí)候,你會(huì)學(xué)習(xí)到很多東西, 這會(huì)和你當(dāng)初的設(shè)想大為不同。但對(duì)于很多人來(lái)說(shuō),以最好為目標(biāo)是很難的。
老程序員的這些建議或許可以為你帶來(lái)一些幫助。在成為一名開(kāi)發(fā)者之后,你是否也有踩過(guò)的坑,或者總結(jié)出來(lái)的經(jīng)驗(yàn)?
原文鏈接:https://www.simplethread.com/20-things-ive-learned-in-my-20-years-as-a-software-engineer/
【本文是51CTO專(zhuān)欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】