文章同步於Blog
自己身為菜鳥時,寫Code常常被前輩噴爛,說你的一些習慣不太好。直到我接觸了Clean Code這本書還有去了其他團隊,我才知道軟體的維護是非常重要的,這些後續會繼續說明。
再來講另一個故事
約莫6月底時,公司希望我評估某個超大型專案的時程,因為那個專案爛尾了,想要接回來做。
當我一打開Code的時候,我整個眼睛真的快瞎了,我實在無法想像這個東西是資深工程師寫出來的。舉個他寫的髒扣:
path
,看起來沒什麼問題,但我看不出是哪家的pathNeko
,我沒找到mewo()
這個方法我就把你變成Neko
a
~ z
都有身為一個不喜歡看到髒扣的人,就決定來寫這篇。
這次的教學主要會以後端的角度來看軟體開發這件事
這個月會講講一些軟體設計的原則還有一些後端在設計API以及架構會需要注意的地方
會用到Python、PHP、Golang,不過都只會用來做一些說明,只有PHP會拿來寫Laravel框架的重構
講解的是概念,其實也不用擔心看不懂
隨著時間時間增長,可能會有新增加的功能,或是配合市場要調整的部分,此時架構或是Code如果不夠乾淨,那維護的時間將是隨著指數增長
我們引用Clean Architecture這本書中的資料
「當對程式碼的整潔程度或設計的結構沒有多少想法時,那你就會跟這條曲線一樣走到最終悲慘的結局」
-Clean Architecture(p.6)
再舉一個極端的例子
「我知道有一間公司在 80 年代後期開發了一個殺手級應用,但後來發行的週期開始拖長,程式裡的錯誤也無法在下次發行之前修復,程式載入的時間與崩潰機率也愈來愈長和高。不久,這家公司就倒閉了。我問他當時發生了什麼...」
「急於將產品上市,導致他們的程式碼變得一團糟,當他們加入愈來愈多的產品特點時,程式碼就變得愈來愈糟糕,一直到他們再也無法管理這團混亂。劣質的程式碼導致了這家公司的倒閉」
-Clean Code(p.3)
如果你問我說,「我的主管要求我一定要在三天內產出這個專案,那我該怎麼辦?」
我建議你先去看一下Clean Coder,上面有很多身為一個專業人士該做的事情和應對方式。
如果主管還是不合理的要求你,那我只好搬出那句話,程式跟人只要有一個能跑就好。
隨時準備好可以跳槽的準備。
我們可以先參考每個程式語言的規範文件,例如Python的PEP8為例子
# Wrong
import sys, os
# Correct
from subprocess import Popen, PIPE
import os
import sys
is not
而不是 not … is
# Wrong
if not foo is None:
# Correct
if foo is not None:
還有很多就不一一舉例了,在新手時期可以先照著語言的規範來做,這樣對於往後撰寫的習慣會比較好
這個應該是很多人講到爛掉了,之後會用Clean Code再做更詳細的說明
假設我今天有一個function是從資料庫取得所有的User email
我們可以將取出來的資料直接清楚的命名為userEmailGroup
或是allUserEmailFromDB
之類的
不要用什麼data(不夠清楚)、dbData(什麼的Data)甚至是abc這種根本沒意義的
如果是示範用那也就算了,在專案上拜託不要這樣寫,這麼做只會讓別人需要花心思去猜你在想什麼
from typing import List
def get_user_email_group_from_DB()-> List[str]:
"""示範用,取得資料庫所有user的email"""
return some_DB_drive.get_some_data("users", "email").all()
# 好的命名方式
user_email_group = get_user_email_group_from_DB()
# 不好的命名方式
data = get_user_email_group_from_DB() # 不夠清楚,我知道是資料,但我還要額外花時間看是誰的資料
其他還有非常多的方法,像是在Python裡面你可以寫Type Hint
讓其他人更了解這個function的參數以及回傳值的型別,舉個例子
def add_two_number(summand: int, addend: int) -> int:
return summand + addend
在Python裡面,不少型別都可以使用+
這個運算子,例如:string, list
你說function有命名阿
確實有命名可是,多寫這些沒有壞處;忘了我不用再往旁邊看(貼貼❤),而且假設我以後真的要驗證參數的型別,我就可以直接拿function裡面的type hint來用,不需要再額外定義。
今天簡單介紹一下,這星期會先寫Coding Style、Clean Code以及 SOLID原則
明天見。