怎樣度過(guò)第一份編碼工作的艱難時(shí)期?
本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)
軟件工程或是數(shù)據(jù)科學(xué)對(duì)于很多人來(lái)說(shuō),實(shí)在不是一件容易的事。特別在沒(méi)有編碼經(jīng)驗(yàn)的情況下,如果第一份工作是在這兩個(gè)領(lǐng)域,會(huì)讓人士氣低落。
我常常收到“尋求改進(jìn)方法”的留言或者私信。但事實(shí)上,你真正需要的是有人對(duì)你說(shuō)“你能做到!”
本文總結(jié)了我在第一份軟件工程工作中犯的錯(cuò)誤。假如你和那時(shí)的我一樣,正在經(jīng)歷艱難的日子,這篇文章應(yīng)該能夠給你幫助。
1. 巧妙即可,無(wú)需可讀
寫好代碼很難,理解錯(cuò)誤的代碼更難。剛開(kāi)始時(shí)我們很可能難以直觀理解,有一個(gè)高級(jí)開(kāi)發(fā)人員就以下問(wèn)題提出了建議:
- 過(guò)度抽象
- 同一行上有多個(gè)嵌套的if/else語(yǔ)句
- 過(guò)度使用鏈?zhǔn)椒椒?/li>
- 從堆棧溢出復(fù)制或粘貼正則表達(dá)式,不帶注釋
將邏輯壓縮到盡可能小的空間里,使筆者自覺(jué)很聰明。但代碼的可讀性就消失了。根據(jù)克尼根定律:調(diào)試的難度是編寫代碼的兩倍。因此,如果讀者盡可能巧妙地編寫代碼,那么根據(jù)定義,就因?yàn)椴粔蚵斆鞫鵁o(wú)法對(duì)其進(jìn)行調(diào)試。
2. 提交審閱的代碼合并了多個(gè)功能
筆者最先學(xué)到的事項(xiàng)之一,就是不要在同一個(gè)請(qǐng)求中組合多個(gè)特性。這對(duì)于審查代碼的人并不友好。超過(guò)幾百行的代碼,會(huì)讓其他人很難在腦海中走一遍執(zhí)行過(guò)程。
有時(shí)這是tickets范圍不佳的結(jié)果。所以筆者總是告訴新開(kāi)發(fā)人員,如果他們認(rèn)為可以將ticket進(jìn)一步細(xì)分為子ticket,則應(yīng)回推,越小越好。
3. 使用無(wú)上下文的變量名
想出好的變量名非常困難,但那時(shí)我很想要盡快完成它。所以筆者選擇了腦海中浮現(xiàn)的第一個(gè)名字。
- 用戶的姓氏是uln。
- 一組電子郵箱是array。
兩者都不算好主意,并且使得任何人都很難理解所寫內(nèi)容,甚至包括筆者自己。
4. 讀取特性Ticket后立即編寫代碼
圖源:pexels
花一周的時(shí)間在一個(gè)特性上,然后才意識(shí)到這一特性是錯(cuò)誤的,這實(shí)在是太尷尬了,然而筆者不止一次犯過(guò)這個(gè)錯(cuò)誤。
放松心態(tài),理解業(yè)務(wù)問(wèn)題,并且圍繞其規(guī)劃代碼,這對(duì)于工程師而言工作量很大。從中吸取教訓(xùn),在筆者自己的創(chuàng)業(yè)計(jì)劃開(kāi)始之前,讓新的開(kāi)發(fā)人員詳細(xì)規(guī)劃一些tickets。這種微觀規(guī)劃水平有助于理清思路,制定更有效的解決方案。
5. 注釋過(guò)多或過(guò)少
最初,筆者沒(méi)有任何注釋。
第二階段時(shí),筆者每一行都有注釋。add_two_numbers的函數(shù)將會(huì)有著 # adds 2 numbers的注釋。這就有點(diǎn)矯枉過(guò)正了。
回想一下,直到筆者閱讀了其他開(kāi)發(fā)人員編寫的足夠多的代碼,并且注意到希望他們添加注釋的地方,才明白了注釋的真正用處和正確數(shù)量。
6. 推送重復(fù)和未使用的代碼
筆者做了如下所有工作:
- 已存在于應(yīng)用程序中的書面功能
- 保留自動(dòng)生成但未使用的文件(即:測(cè)試文件)
- 添加了未使用的軟件包
有些框架會(huì)自動(dòng)生成許多不必要的文件。當(dāng)開(kāi)始使用一個(gè)應(yīng)用程序時(shí),也不知道所有的現(xiàn)有代碼。筆者發(fā)現(xiàn),避免這些問(wèn)題的最佳方法是,在提交代碼供審閱之前,一定要仔細(xì)閱讀自己編寫的代碼。
圖源:unsplash
7. 允許安全漏洞
筆者很感謝一位出色的高級(jí)開(kāi)發(fā)人員,使筆者的代碼免受黑客攻擊。我做了下述所有操作:
- 允許SQL注入
- 允許通過(guò)URL跳轉(zhuǎn)訪問(wèn)受限頁(yè)面
- 僅用于前端驗(yàn)證
- 具有增量ID的命名空間URL
建立一份有著最佳安全實(shí)踐的心理檢查清單花了很長(zhǎng)時(shí)間,現(xiàn)在筆者查看其他開(kāi)發(fā)人員代碼時(shí)會(huì)使用該清單。
8. 編寫低效的數(shù)據(jù)庫(kù)查詢
筆者在開(kāi)始第一份工作時(shí),對(duì)數(shù)據(jù)庫(kù)一無(wú)所知。大概花了一年的時(shí)間才弄明白數(shù)據(jù)庫(kù)索引。
那時(shí)我寫了很多N+1 queries,并且創(chuàng)建了db表來(lái)存儲(chǔ)大量沒(méi)有索引的數(shù)據(jù)。這兩者都是應(yīng)用程序緩慢而讓人煩悶的原因。
9. 使用基于錯(cuò)誤的條件邏輯
條件語(yǔ)句if/else是軟件的核心部分。在偽代碼中,它們通常是這樣的:
- if x is true
- do this
- else
- do that
但是筆者在編寫自己的第一個(gè)投門磚軟件時(shí),就充滿了如下的邏輯:
- do this
- if this fails
- do that
有時(shí)需要挽救一個(gè)錯(cuò)誤,比如當(dāng)碰到一個(gè)不可靠的API時(shí)。偶爾出現(xiàn)這樣的問(wèn)題是可以的,但這不能是常態(tài)。
編寫軟件是一件困難但充滿成就感的事,實(shí)踐能讓我們很快成長(zhǎng)起來(lái)。正處于困難的時(shí)期的小伙伴們,但行好事,莫問(wèn)前程,結(jié)果會(huì)在你努力的過(guò)程中悄悄地來(lái)。