0%

【Day-1】前言

文章同步於it邦

為什麼會要寫這個主題

自己身為菜鳥時,寫Code常常被前輩噴爛,說你的一些習慣不太好。直到我接觸了Clean Code這本書還有去了其他團隊,我才知道軟體的維護是非常重要的,這些後續會繼續說明。

再來講另一個故事

約莫6月底時,公司希望我評估某個超大型專案的時程,因為那個專案爛尾了,想要接回來做。

當我一打開Code的時候,我整個眼睛真的快瞎了,我實在無法想像這個東西是資深工程師寫出來的。舉個他寫的髒扣:

  • 路徑命名為path,看起來沒什麼問題,但我看不出是哪家的path
  • 全部黏在一起不空格
  • 物件直接命名為Neko ,我沒找到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為例子

  • import 時不該把不相關的擠在一行
1
2
3
4
5
6
7
# Wrong
import sys, os

# Correct
from subprocess import Popen, PIPE
import os
import sys
  • 使用 is not 而不是 not … is
1
2
3
4
5
# Wrong
if not foo is None:

# Correct
if foo is not None:

還有很多就不一一舉例了,在新手時期可以先照著語言的規範來做,這樣對於往後撰寫的習慣會比較好

賦予有意義的名稱

這個應該是很多人講到爛掉了,之後會用Clean Code再做更詳細的說明

假設我今天有一個function是從資料庫取得所有的User email

我們可以將取出來的資料直接清楚的命名為userEmailGroup或是allUserEmailFromDB 之類的

不要用什麼data(不夠清楚)、dbData(什麼的Data)甚至是abc這種根本沒意義的

如果是示範用那也就算了,在專案上拜託不要這樣寫,這麼做只會讓別人需要花心思去猜你在想什麼

1
2
3
4
5
6
7
8
9
10
11
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的參數以及回傳值的型別,舉個例子

1
2
def add_two_number(summand: int, addend: int) -> int:
return summand + addend

在Python裡面,不少型別都可以使用+這個運算子,例如:string, list

你說function有命名阿

確實有命名可是,多寫這些沒有壞處;忘了我不用再往旁邊看(貼貼❤),而且假設我以後真的要驗證參數的型別,我就可以直接拿function裡面的type hint來用,不需要再額外定義。

總結

今天簡單介紹一下,這星期會先寫Coding Style、Clean Code以及 SOLID原則

明天見。

參考資料