5000 行的 SQL 源代碼,怎么讀?
本文轉載自微信公眾號「有關SQL」,作者有關SQL。轉載本文請聯系有關SQL公眾號。
今天的小 C 很不在狀態(tài)。昔日的她,一大早肯定不會愁容滿面,似乎像是星巴巴沒有喝夠的樣子,興奮不起來!11:30 了,很少聽到她 HHKB 落鍵的清脆聲,一定是遇到難題了!
“怎么,今天的熱焦瑪少了點勁兒嘛,感覺?”我走近了小 C。
“L, 面對著滿屏的 SQL,誰都會提不起精神啊。何況這近 5000 行的代碼,怎么看得過來嘛!看了中間忘了開頭,看到結尾,前面的全忘光了,好煩呀” 小姑娘抱怨起來也是毫不拖泥帶水。
“喲,恭喜你,遇到這么極品的 sp 啊。在我的印象里面,經歷了兩次重構之后,上千行的代碼,就那么幾個,今天被你遇到了。我看看是哪個”
“原本我以為很簡單的一個 AddUpdate, 誰想邏輯這么復雜,牽扯的表也太多了,其中幾個表還有上百個字段,這都沒法看了” 小 C 的鼠標滿屏的亂走,看得我 300 度的眼睛,有些吃力。
“你這一行一個字段,是你自己設置的吧,其實不需要那么格式化,反而更簡單。你看啊,一個 Insert 被幾十個字段隔成了兩屏,容易造成思維停頓。兩行搞定的事情,做復雜了。還顯得代碼量大,失去耐心。”
“那我還原成原先的格式,也有近 3000 多行,還是多啊”
“這閱讀源代碼啊,是有技巧的。我可以分享三點給你。分別是,通讀,聯想,批評。”
“第一點,通讀,非技術性的通讀。首先告訴自己,一遍讀完就能通曉5000行代碼細節(jié),是不可能的事情。讀代碼前,耐心先行。接著就是開始第一遍的閱讀。此時的代碼走讀,我們不停留在具體的技術末節(jié)上,比如 unpivot 的語法是怎么樣實現的,為什么有里三層外三層的嵌套,為什么這里用了動態(tài) SQL 去拼接。再比如,XML 的節(jié)點鋪設,為什么要這么定義,共有多少層。這些留在最后。”
“我們在走讀代碼的時候,尤其是第一遍,首先要理清的是業(yè)務的數據流,比如訂單是如何觸發(fā)的,分別涉及到哪些主體,人,物,財,時間。知道這些數據流分別存在哪些表里,存儲的先后順序是什么,會記錄哪些日志。我們的 sp 邏輯結構相對簡單,一個事務一個存儲過程。所以第一遍,通讀,越快了解所有涉及到的業(yè)務過程,最重要。你也可以在手邊,畫畫流程圖,幫助記憶。”
看著小 C 若有所思的眼神,分明能感覺到她腦子里抽象的擰巴,因此順手我畫了一張上面的流程圖。“第一遍走讀代碼,你能清晰的畫出類似上面的圖,知道這些數據存在哪里,就足夠了。”
“嗯,原來是這樣,難怪我老是連接不起來,看過了,腦子里留不下印象!那第二點呢?”
“第二點,需要聯想,也就是想象力??赐甑谝槐椋灰敝吹诙?,就在腦子里,回想第一遍的過程。把你認為創(chuàng)建一個訂單需要記錄的信息給標出來,盡可能詳細的在流程圖上標準細節(jié),就好比人,在什么時候需要記錄人的信息,需要檢驗人的信息;再比如貨,什么時間段,要檢查貨的庫存,要記錄貨的哪些屬性,單價還是 SKU,怎么更新貨的庫存,更新失敗了怎么辦?”
“如果你看到長篇的 SQL ,還只停留在腦子里,不靠譜。工作記憶永遠只有 15 分鐘。讀完一遍后,你被叫去開個會,回來你就可能記不清了。所以及時的傾倒出來你剛才讀到的 SQL,多問問自己數據是怎么流轉下來的,畫好流程圖,標準自己的想法,越清晰,問題越多,越有利下一遍的閱讀...”
"我知道了,我知道了,就是帶著問題,主動去尋找答案!"
“理解到位,就是這樣。給自己找問題,千萬別一遍看完代碼,什么都沒留下來。接著,你可以去閱讀第二遍,第三遍,甚至是第四遍了”
"那還有第三點呢?" 小 C 似乎來勁了。
“第三點最重要,批評。如果你對讀到的代碼,沒有任何要抱怨,沒有任何疑惑,那說明還沒理解到位。當你看到這些代碼,你認為嗯,這段寫的很好,這段寫的在理,都是這些溢美之詞,那完了,你沒深入。你可能對 unpivot , cross apply, openXML, OffSet 讀到真正實戰(zhàn)版代碼而感到興奮,覺得這段 sp 就寫的很好,那對 SQL 的認識就太膚淺了。”
“新聞界,會有很多評論家,對重大新聞做二次剖析,比如曹林,《時評寫作十講》的作者,擅長對每篇新聞做雙面解析。既講述原新聞作者的報道手法,也評價原作者的目的與動機,最后還補充自己的觀點,非常有意思。”
“在我們編程這個圈子,也有很多書,專講這方面的。我給你推薦幾本吧,《編程珠璣》,《CLR Via C#》, 尤其是 SQL 數據庫方面,《數據庫索引設計與優(yōu)化》,《Oracle 優(yōu)化日記》,《T-SQL Querying》,《T-SQL 性能調優(yōu)秘籍-基于SQL Server 2012 窗口函數》”
“這些書,非?;A,我自己看過不止一遍??梢钥焖賻湍闾岣邇裙ΑG?,書的優(yōu)點在于,作者就像是代碼評論家一樣,告訴你為什么 SQL或者代碼這么寫,不如那樣寫來的高效,其中的原理是什么。這些都是你在分析具體代碼時,可以學到的真正有用的東西。我們應該在任何一段 SQL 中都找到可以學習的地方,最好是找到這段代碼的設計弱點,比如子查詢嵌套太多,不簡潔;比如篩選條件不夠優(yōu)化,需要代碼重構,這就是第三點,批評的實質。”
“又推薦書啊,上次推薦的還沒看完。”
“書在用時,方恨少。”