松花皮蛋的黑板報
  • 分享在京東工作的技術感悟,還有JAVA技術和業內最佳實踐,大部分都是務實的、能看懂的、可復現的

掃一掃
關注公眾號

ARTS-20-敏捷開發之LinkedIn的高效代碼評審技巧

博客首頁文章列表 松花皮蛋me 2019-07-28 19:38

ARTS的初衷

Algorithm: 主要是為了編程訓練和學習。

Review:主要是為了學習英文

Tip:主要是為了總結和歸納在日常工作中所遇到的知識點。學習至少一個技術技巧。在工作中遇到的問題,踩過的坑,學習的點滴知識。

Share:主要是為了建立影響力,能夠輸出價值觀。分享一篇有觀點和思考的技術文章

https://www.zhihu.com/question/301150832

一、Algorithm

LRU Cache

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and put.

get(key) – Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
put(key, value) – Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.

The cache is initialized with a positive capacity.

Follow up:
Could you do both operations in O(1) time complexity?

Example:

LRUCache cache = new LRUCache( 2 /* capacity */ );

cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // returns 1
cache.put(3, 3); // evicts key 2
cache.get(2); // returns -1 (not found)
cache.put(4, 4); // evicts key 1
cache.get(1); // returns -1 (not found)
cache.get(3); // returns 3
cache.get(4); // returns 4

class LRUCache {

    private int capacity;

    private Map<Integer,Integer> cache ;

    private LinkedList<Integer> list;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.cache = new HashMap<>(capacity);
        this.list = new LinkedList<>();
    }

    public int get(int key) {
        if(cache.containsKey(key)) {
             list.removeFirstOccurrence(key);
            list.addFirst(key);
            return cache.get(key);
        }
        return -1;
    }

    public void put(int key, int value) {
        if(cache.containsKey(key)) {
            list.removeFirstOccurrence(key);
        } else {
            if(list.size()==capacity) {
                int last = list.removeLast();
                cache.remove(last);
            }
        }
        list.addFirst(key);
        cache.put(key,value);
    }
}

二、Review

閱讀和代碼評審是每個工程師在日常工作中都要做的事情,然而一個標準的code review流程,實際上很難落地,它要求每次代碼變更在部署到生產環境前,甚至是在提交合并前,都需要被另外一個小組成員進行正式的評審。在LinkedIn公司,自從2011年起code review成為了開發流程中法定、強制的一部分,也意味著它成為代碼質量保證和知識分享中必不可少的一部分,目標是讓團隊成員能夠迅速提升自己的技能水平

實施公司級的code review最大的一個收益是提升了研發流程的標準化,在LinkedIn公司每個團隊使用相同的工具或者流程進行代碼評審,意味著任何一個人對其他團隊的項目可以提供評審幫助或者貢獻代碼,這消除了諸如“我可以修復代碼中的錯誤,但如何構建代碼并提交修復程序?”這樣的問題,這反過來有助于增加工程組織中不同團隊之間的協作

我們在將代碼評審變成一項法定流程的過程中,為公司建立了良好健康的反饋文化,工程師在他們領域中樂于提出或者接收反饋,而不只是埋頭苦干寫代碼。實際上,高質量的代碼審查經驗是在公司晉升參考中是舉足輕重的,因為那是工程技能最直接的客觀證據

通過過去很長一段時間實踐,我們總結出了在代碼評審中的一些最佳實踐和技巧,如下面所示,通過問題的形式呈現,盡量讓審查雙方都能從中獲得最大的價值

我真的明白代碼變更的目的是什么嗎?

為了加快高質量的code review流程和有效提高團隊技能,每次變更提交的代碼文件中應該包括變更概要,簡要說明背后的需求或者動機是什么,而不是需要從代碼更改本身反向推斷。實際上,為提交代碼寫說明文檔是重新梳理的過程,從中你可能會發現自己把需求實現搞復雜了,應該再簡化下,于是就回頭改代碼,從而改善已有代碼的設計,甚至培養出做事之前先進行推演等等好習慣

我提出的建議是積極反饋嗎?

整潔的代碼和高度測試覆蓋率被視為理所當然的,然而有些code review過于關注代碼問題,側重點變成代碼怎么修改才能變得更好,這非常不好,大部分人需要積極的反饋才能得到鼓舞和提高積極性,工程師也不例外,我們不能忽視正面贊賞的價值。當審查員發現代碼中好的設計時,應該提出來并給予肯定,這種積極的反饋往往具有傳染性,它能讓整個團隊變得更加有活力

我的代碼評審評論表達清楚了嗎?

和所有的代碼提交一樣,任何積極或者消極的反饋都不應該空談,應該有針對性的解釋,如果覺得代碼提交者收到反饋后可能一頭霧水,可以進行過度解釋而不是簡潔,不然會產生更多的問題,并需要更多來回溝通。當然,注釋也可以非常簡潔,比如”消除了重復代碼”、“增加了測試覆蓋率”,這種類型的解釋有助于讓團隊的價值觀得以明確

我是否需要感謝提交者的努力?

某些代碼質量不高,需要返工重新編寫,在這種情況下,重要的是仍然承認他為之付出的努力,他之前可能只是對業務熟悉程度不夠,最佳方式是提供高質量的code review反饋和正確的解釋,比如提出“謝謝你,每次代碼提交中始終有好的設計”之類的話語,而不是幫他寫代碼,從長遠來看,這其實是在一定程度上復制你的生產力

我們可以從代碼評審中獲益嗎?

這個問題可以讓我們非常強有力并且粗暴地評估code review是否有必要。在下班前,工程師應該像對待一個有幫助性的開發工具一樣正視代碼評審結果,優先級應該比其他工作還要高,如果認為沒有作用,就將其刪除。沒有意義的code review評論的典型示例是與代碼格式相關的,那些應該由自動化工具并且是在編寫過程中驗證,而不是最后由工程師來完成

“測試完成”部分是否足夠徹底?

code review中,不但要審查提交者的代碼,還要關注做過的測試,除了一些單元測試,還有一些可能是手動的測試。提交者最好列出所有測試過的案例,這樣可以讓審查者做出更多的測試建議,從而提高質量

在review反饋中,我是否太迂腐了?

一些code review在重要的問題上提出了相當多的修復意見,而不是強有力的建議,也就是說過于關注細節,過于炫技,從而拖慢了整個進度,甚至會造成雙方的隔陔。建立一個清晰的、有明確目標、積極的、有吸引力的code review流程是避免上述問題的好方法

總結一下,一個標準的code review流程能夠提升代碼質量、團隊技能和知識互通。當團隊中每個工程師都意識到,其他人會閱讀我的代碼,同時我需要認真對待評審結果,下次代碼編寫要參考評論然后制作得更好,從而提高工作質量,這是增長和改善的關鍵

翻譯修改自:https://thenewstack.io/linkedin-code-review/

三、Tip

五星級軟件工程師的高效秘決,關鍵在于在日常工作中堅持實踐精英的工作策略:積極主動、構建知識網絡、自我管理、團隊合作、領導力、跟隨力、大局觀、呈觀與表達、組織智慧

四、Share

程序員都應該了解的運維知識經驗

黑龙江6+1开奖结果查询