Dev Lead – Checklist review code cho lập trình viên web full stack

Là một Dev Lead/Team Lead bạn nhiệm vụ của bạn không những chỉ hoàn thành công việc của mình mà một nhiệm vụ vô cùng quan trọng là review code của các thành viên trong nhóm để có chất lượng tốt nhất, đồng thời qua đó cũng huấn luyện họ có kỹ năng code tốt hơn. Trong bài này mình xin đưa ra Checklist dùng cho các Lead khi review code của 1 lập trình viên Web Full Stack.

  1. Giao diện

    • Đã tuân thủ đầy đủ UI Convention hay chưa?
    • Đã vẽ theo Thiết kế UI hay chưa?
  2. Tính năng

    • Tính năng đã được thực hiện đúng chưa? đã pass hết các functional test case chưa?
  3. Tuân thủ Coding convention

    • Đã tuân thủ Naming convention chưa?
    • Có Comment code đầy đủ chưa?
    • Đã tuân thủ Quy định về bẫy lỗi chưa?
    • Biến khai báo đúng scope, đúng kiểu dữ liệu chưa?
    • Tái sử dụng các hàm dùng chung, thư viện chưa?
    • Code có dễ bảo trì không?
    • Tuân thủ các nguyên lý clean code SOLID chưa?
    • Có FixCode (số, chuỗi…) không?
    • Có duplicate code không?
    • Code đã được tổ chức gom nhóm hoặc chia hàm nhỏ cho dễ đọc chưa?
    • Các biểu thức điều kiện phức tạp đã được đưa thành biến hoặc hàm riêng hay chưa?
  4. Đảm bảo hiệu năng tầng Application

    • JS/HTML/CSS
      • Số lượng request đã tối ưu chưa?
      • Sử dụng Bundle javascript, css chưa?
      • Sử dụng sprite images để giảm số lượng request lấy ảnh chưa? VD: ảnh icon…
      • Sử dụng CDN để tăng số lượng file download đồng thời chưa?
      • Đặt expired time cho các static resource hợp lý chưa? Các file js, css, image, icon cần có expired time khác nhau tùy theo mức độ thay đổi của file
      • Sử dụng các file css, javascript bên ngoài trang HTML để cache chưa
      • Dung lượng request tối ưu chưa? Minification javascript/css chưa? Sử dụng nén gzip các file static, dynamic resource chưa?
    • Code .NET
      • Hạn chế việc throw exception: Kiểm tra các điều kiện trước để tránh exception? Try cacth ở sự kiện hoặc method gốc?  Hạn chế rethrow, nếu có sử dụng chỉ sử dụng từ khóa throw thay cho throw ex
      • Không dùng exception điều khiển luồng logic
      • Sử dụng kiểu dữ liệu tối thiểu đáp ứng được bài toán
      • Ưu tiên sử dụng mảng thay list, chỉ định size trước nếu có thể, chỉ kiểu cụ thể của phần tử trong mảng
      • Dùng addRange thay cho add nhiều lần đối với dữ liệu dạng list
      • Với array lớn dùng for thay foreach
      • Khi cộng chuỗi với nhiều tham số, dùng StringBuilder thay cho + hoặc & (Từ 3 tham số trở lên)
      • Các phép so sánh chuỗi dùng IgnoreCase thay cho toLower
      • Hạn chế dùng dynamicInvoke
      • Hạn chế vòng lặp lồng nhau
      • Tránh dùng đệ quy
      • Dung Private thay cho Public
      • Boxing, Unboxing cast type
    • Data/ADO.Net:
      • Chỉ lấy đủ cột cần dùng?
      • Ưu tiên dùng DataReader thay Dataset?
      • Tránh dùng Auto-Generated command, command builder khi runtime.
      • Giữ Transaction ngắn nhất có thể
      • Khi muốn truy xuất nhanh thì sử dụng dataview thay cho Datatable
    • GC
      • Không tự gọi GC.Collect
      • Set Null các object không dùng đến
      • Dùng Using hoặc Try Catch Finally để giải phóng đối tượng IDisposable
      • Gọi dispose các biến có kiểu IDisposable khi dispose object chính
    • Kiểm tra MemoryLeak
    • Thread:
      • Tránh gọi Abort, để thread tự exit
      • Tránh gọi Suspend, Resume, nên dùng Monitor để quản lý thread
      • Dùng threadpool để tạo Tránh sử dụng chính object đang chứa code để làm object lock
      • Cần có một try catch cho tất cả đoạn code trong thread
    • Khi cần lấy giá trị của một hàm hoặc property thì cần gán ra một biến để tránh gọi lại hàm hoặc property nhiều lần
    • WebForm:
      • Tắt SessionState khi không dùng
      • Hạn chế số lượng request tới Server
      • Chỉ dùng ViewState khi cần thiết
      • Loại bỏ HttpModule không cần thiết
      • Dùng AJax khi có thể Validate dưới client-side thay cho server-side nếu có thể
      • Đã sử dụng thuộc tính IsPostback để tránh gọi nhiều lần các đoạn code xử lý trong hàm pageLoad() khi load lại page
      • Chỉ trả về thông tin tối thiểu vừa đủ để giảm dung lượng
      • Những task long-running chuyển sang worker xử lý
      • Sử dụng Server.Transfer thay có Response.Redirect khi có thể
    • Server caching:
      • Cân nhắc sử dụng local memory để cache dữ liệu trong phiên làm việc thay vì couchbase
      • Cache phải có timeout hợp lý
      • Chia nhỏ, phân loại cache theo nhu cầu sử dụng (tránh lưu một object lớn mà mỗi lần lấy chỉ sử dụng 1 phần nhỏ)
      • Không nên dùng key quá dài
    • Session state:
      • Không  lưu trữ dữ liệu lớn vào session
      • Sử dụng Cache và Session đã hợp lý hay chưa?
  5. Đảm bảo hiệu năng tầng Database

    • Chú ý kiểu dữ liệu, độ rộng của các biến, cột kiểu text (nvarchar, nvarchar…). Tránh lỗi khi gán dữ liệu lớn hơn giá trị max của kiểu dữ liệu
    • Nếu dùng bảng tạm thì phải khai báo collation để tránh lỗi khi collation của DB khác với collation mặc định của instance sql.
    • Chú ý giá trị NULL Trong phép so sánh =, <>, IN
    • Chú ý khi sử dụng lệnh SELECT… INTO. Kiểu dữ liệu, độ lớn của cột dữ liệu sẽ phụ thuộc vào dữ liệu —> cần cast về kiểu mong muốn
    • Chỉ dùng cursor khi không còn cách nào khác
    • Hạn chế sử dụng sub query
    • Hạn chế dùng Trigger
    • Hạn chế join với bảng dữ liệu lớn
    • Hạn chế dùng hàm trong mệnh đề WHERE –> không dùng được index
    • Tránh việc sử dụng mệnh để sau khi không cần thiết ORDER BY, DISTINCT, GROUP BY, UNION, NOT LIKE
    • Nếu có dùng biến kiểu bảng @Table có join với bảng khác thì cần có OPTION (RECOMPILE) sau câu lệnh đó
    • Tránh lấy dư thưa các cột không cần thiết trong kết quả trả về của cầu SELECT hoặc trong bảng tạm
    • Nên sử dụng GROUP BY thay cho DISTINCT
    • Cân nhắc khi sử dụng UNION hay UNION ALL: UNION tương tự DISTINCT, UNION ALL lấy tất
    • Xem xét giảm thiểu số lần select vào bảng dữ liệu lớn->nên truy xuất 1 lần để lấy kết quả ra bảng tạm và xử lý trên tập kết quả ít hơn
    • Tham số truyền vào mà được ghép bởi nhiều phần tử cần được chuyển đổi thành bảng rồi mới đưa vào tính toán
    • Dùng store khi có thể, thiết lập NO COUNT ON, READ UNCOMMIT trong store khi có thể
    • Không được dùng Transaction trên SQL trừ trường hợp đặc biệt
    • Mở connection muộn nhất, đóng connection sớm nhất khi có thể, chủ động đóng connection thay vì timeout
    • Thiết lập timeout riêng với từng loại connection (connection report để timeout lâu, còn lại để thấp, tránh để tất cả timeout lâu)
    • Hạn chế roundtrip đến database
    • Các query đã viết ra thì xem xét xem có sử dụng được Index hay không
  6. Tuân thủ các tiêu chuẩn bảo mật

    • Việc Download file phải dùng thư viện dùng chung
    • Hàm download không được phép có tham số là đường dẫn đến File trên Server.
    • Chỉ được phép Upload các loại file nhất định, không được phép upload các file có khả năng thực thi
    • Upload theo các định dạng file và dung lượng cho phép
    • Lưu trữ file do người dùng upload phải được lưu dạng mã (Guid, ID)
    • Việc Upload phải dùng thư viện dùng chung
    • Đã tuân theo các quy tắc lưu trữ file upload, file xuất khẩu hay file temp của hệ thống chưa?
    • Chỉ cho phép xuất khẩu theo một số định dạng file theo quy tắc đã chỉ ra
    • Định dạng file hỗ trợ nhập khẩu: excel, xml, csv
    • Đảm bảo không bị các lỗi bảo mật SQL injection
    • Các control cho phép người dùng nhập liệu đã kiểm tra lỗi XSS hay chưa?

———————— END ————–

Advertisements