10年老程序員告訴你的10條編程原則
在我寫了10來年程序之后,或多或少有一些心得,希望在這里做一個總結(jié)分享給大家,為了不讓本文變成一篇和其他總結(jié)問類似的水文,我盡可能用自己的親身經(jīng)歷來告訴大家編程中遇到的問題和解決思路。
1:磨刀不誤砍柴工
磨刀不誤砍材工這個故事相信很多人都聽過,但是用到自己身上可能就是失效了。
我們很多時候都是在邊寫程序邊思考如何去寫,中途遇到問題又可能會推倒重來,不管軟件開發(fā)的規(guī)模大小,一開始都需要對需求做詳細(xì)的分析和設(shè)計才能開工。
多花時間在傾聽用戶的需求和問題上。
“思考-編碼-測試-改進(jìn)“,不斷的重復(fù)這條路去做。
2:自動化一切
作為程序員,我們干的事情本質(zhì)上是讓世界的所有事物變得高效、有序,但是很多時候我們自己的工作過程卻不是這樣的。
比如我寫完代碼后通常會重復(fù)以下一系列的操作:提交代碼庫--合并分支--檢查沖突--集成測試--登陸線上服務(wù)器--拉取最新的代碼--重啟服務(wù)實現(xiàn)版本更新。
這些操作都是重復(fù)而機械的,每一步操作可能都要噼里啪啦敲半天鍵盤,輸入大段大段的命令才能搞定,看起來很酷很炫,其實非常低效,畢竟我們是程序員,不是演員(黑客娛樂圈。。。。。。)
每次做完這些事情,起碼要花掉我1-5分鐘的時間,如果每天重復(fù)10次,可能最多需要花掉我接近1小時的時間在這上面,完全不值得。
而把它自動化之后,我可能只需要敲擊幾下鍵盤就可以迅速把最新的代碼變成產(chǎn)品上線了。
自動化的方案有很多:大到各類CI/CD工具,小到一些具體的自動化工具,例如(Fabric、Ansible等等)都可以幫我們自動化這些瑣碎重復(fù)的事情,不要嫌編寫自動化腳本很麻煩,你只需要編寫一次,但是永遠(yuǎn)受益。
3. 最小可行性產(chǎn)品
什么是最小可行性產(chǎn)品?以下這個圖所表現(xiàn)出來的現(xiàn)象經(jīng)常出現(xiàn)在軟件開發(fā)領(lǐng)域。
客戶以為的產(chǎn)品和我們做出來的產(chǎn)品完全不同,究竟是需求不明確、研發(fā)能力有限還是什么?
其實換個角度想想,如果我們一開始就把最小可行性的產(chǎn)品以最小代價、最快速度拿出來給客戶演示也許效果更好,他會更加了解自己想要究竟該是什么樣子的產(chǎn)品。
4:有效的調(diào)試
軟件開發(fā)離不開調(diào)試,很多人都習(xí)慣用print在程序里到處輸出變量值來調(diào)試(當(dāng)然我很多時間也這樣,因為簡單)。
通過輸出日志或者編輯器自帶的各種調(diào)試功能,可以更方便的我們收集錯誤信息。
習(xí)慣用調(diào)試工具來尋找問題吧,print真不是個好選擇。
5:代碼優(yōu)雅與有效的平衡
作為一個有追求的程序員,我們無時無刻都在追求代碼的優(yōu)雅簡潔。據(jù)我自己的經(jīng)驗,通常我們在做出復(fù)雜問題思考的時候?qū)懙拇a都是測試性的代碼,它可用,但是不好看,因為通常在思考復(fù)雜問題時寫簡潔優(yōu)雅的代碼,會加重我們的大腦負(fù)擔(dān)。
最終當(dāng)我們把問題解決完之后,之前測試性的代碼已經(jīng)作為正式代碼開始工作了,我們又舍不得或者說懶得刪掉它重新用簡潔優(yōu)雅的方式來寫。
這需要我們給自己設(shè)定一個下限,哪些代碼是必須要馬上重寫的,不能欺騙自己說一個月之后再來重寫,相信我兄弟,一個月之后你早忘了這件事了。
你能說出以下兩段相同功能的代碼哪段更優(yōu)雅,哪段更適合閱讀嗎?
- if obj.is_anonymous:
- return obj.user.nickname
- else:
- return '匿名用戶'
- return obj.user.nickname if not obj.is_anonymous else '匿名用戶'
6:良好的溝通與交流
作為程序員要記住一個準(zhǔn)則,同事和客戶不是敵人,他們只是想以自己擅長的方式完成工作。
我們也是一樣,可是不同背景、經(jīng)驗的人出發(fā)點可能是不同的、程序員經(jīng)常覺得產(chǎn)品、市場的同時都是智障,相反他們也是這么認(rèn)為程序員的,矛盾通常在工作中產(chǎn)生
學(xué)會以溫和的方式傾聽訴求,克服自己的不適感,當(dāng)我們真正理解對方的想法時,我們也就知道該如何做事情了。
7:完善的技能棧
程序員除了編程語言之外,感覺還要學(xué)很多東西才能滿足工作的需要。
實際上是這樣的,如果我們的經(jīng)驗和知識只是在程序如何編寫上,其實不配稱之為一個程序員。
網(wǎng)絡(luò)你要不要了解?操作系統(tǒng)一些基本原理呢?編譯性語言語言和動態(tài)語言是不是都得會一點?數(shù)據(jù)庫要不要了解一下?
有些工具型的知識我們不需要了解,但是有些基礎(chǔ)型的知識我們必須知道。
8:學(xué)習(xí)能力與技巧
遇到一門新的技術(shù),我們最快多久能學(xué)會它并開始做出產(chǎn)品來?
學(xué)習(xí)一門新的語言,學(xué)的不是語法,那玩意大同小異,我們學(xué)習(xí)的是它的特點是什么、在什么時候最適合用它、它和別的語言最大的區(qū)別是什么。
在技巧方面我其實沒太多可說的,只有一句話 帶著問題去學(xué),當(dāng)我們抱著解決問題去有針對性的學(xué)習(xí)新知識,效率會更高。細(xì)枝末節(jié)太多,需要優(yōu)先找到主干。
9:分享精神
我們在網(wǎng)上遇到了問題就去搜索,嚴(yán)格來說很多程序員都是面向百度編程,面向google、stackoverflow編程。想象一下,如果沒有人分享自己的心得,把解決問題的方法貼出來,我們?nèi)ツ睦锼阉鳎荒茏约罕е鴷戳税?
有人說我怕寫出來寫得不好或者懶得寫,其實分享自己知識的過程就是一次學(xué)習(xí)提煉的過程,你可以通過這個過程來回顧整理自己的知識點,看看是否有盲區(qū)。
10:好的產(chǎn)品定義
能解決問題的產(chǎn)品就是好產(chǎn)品,不在于它的界面多么精美、操作多么順暢、功能多么強大。
用戶希望做一個電商小程序,讓他的客戶通過小程序選擇商品、下單購買,如果用戶能建立幾個微信群,他所有的客戶都在里面,然后每天發(fā)幾個表格收集、用戶微信轉(zhuǎn)賬就能完成商品的選擇和購買行為,是不是一定要做一個程序才能解決問題?
個人好的產(chǎn)品在于解決問題,不在于程序員的自我滿足。