Coding thập bát chưởng
Bài đăng này đã không được cập nhật trong 6 năm
GIAOSUCAN'S BLOG - CHIA SẺ KIẾN THỨC KĨ THUẬT THEO CÁCH BÁ ĐẠO
http://www.giaosucan.com/
Năm Donal Trump lần thứ nhất, cách mạng công nghiệp đệ tứ bùng nổ, dẫn tới thiên hạ đại loạn. Các tập đoàn công nghệ trong thiên hạ tranh giành quyết liệt ngôi vị minh chủ. Google bang ở Sillicon Valley, nghiên cứu Google DeepMind đã tạo ra Alpha Go đánh bại đệ nhất cao thủ cờ vây trong thiên hạ. Facebook phái phát triển hệ thống nhận dạng DeepFace dùng Deep learning, làm nên cuộc cách mạng trong computer vision. Rồi Amazon với chat bot Alexa, Microsoft với trợ lí ảo Cortana, quả thật anh hùng trong thiên hạ như nước ngoài biển khơi, cát ngoài sa mạc, không thể đếm xuể. Fsoft môn, một bang phái nhỏ ở phương nam xa xôi, nhân cơ hội này tranh thủ củng cố lực lượng, rèn luyện quân sĩ để mong ngày tranh đoạt thiên hạ. Các đệ tử bổn môn không quản ngại OT, ON để thực hiện mục tiêu 1B2020 của môn chủ… Fsoft môn, phân đà Complex, đêm đã điểm canh hai… Tổng đà chủ Complex Phương lão nhân ngồi đăm chiêu bên bug report, lại một dự án nữa cháy dead line, các đệ tử trong phân đà đã thức trắng đêm cả tháng, sức cùng lực kiệt. Ngày mai đã là deliver mà tester vẫn report hàng vạn bug. Lòng đau như cắt, ông một mình rảo bước lên đỉnh tòa Complex, phóng tầm mắt nhìn về dãy núi Ngũ Hành Sơn xa xa, đôi dòng lệ rơi than thầm Nói rồi, gieo mình xuống, thoát kiếp OT… Phương lão nhân giật mình tỉnh dậy, Fcomplex tòa nhà cao vạn trượng, nhưng ông gặp đại nạn không chết, chỉ thấy mình nằm trong một sơn cốc không một bóng người, Trên vách núi sừng sững bỗng hiện lên dòng chữ “Sillicon Valley”, phía dưới là một bộ xương trắng, tay ôm cuốn sách có tên “Coding thập bát chưởng”. Thì ra đây là đệ nhất cao thủ coding trong giang hồ “Độc Cô Đạo Code”. Đó là một đại hiệp kĩ thuật vô song, đã từng đả bại các cao thủ ở Hackathon, Codefight, cả đời tìm kiếm đối thủ nhưng không thành. Vì không muốn kĩ thuật của mình bị thất truyền, nên ông dành những năm tháng cuối đời của mình ở Sillicon Valley để viết lên bộ Code pháp “Coding thập bát chưởng” ghi lại toàn bộ những nguyên tắc trong lập trình như Solid, over engineering, DRY, KISS, YAGNI,.. Phương lão nhân cả mừng liền mở vài trang đầu để đọc, thấy nội dung ghi Over engineering Over-engineering có thể hiểu là lạm dụng công pháp như Design Pattern, Solid trong xử lý những business đơn giản một cách quá mức dẫn tới tẩu hỏa nhập ma. Chẳng hạn, xem đoạn code pháp sau
public class HelloWorld {
public static void main (String arg[]) {
System.out.print (“Hello World”);
}
}
Chỉ trên dưới 5 chiêu thức, một dòng Hello World đã có thể hiển thị trên màn hình Tuy nhiên, khi Over engineering thì thành như sau Chi tiết xem ở https://gist.github.com/lolzballs/2152bc0f31ee0286b722
Có thể nói từng dòng code trên đều ẩn chứa những tuyệt học nổi tiếng trong giang hồ như Design Pattern, Dependency injection, Solid.. Phải tầm nhất đại tông sư code học như Bill Gate, Mark Zuckerberg mới hiểu nổi. Thi triển tới hàng trăm chiêu thức nhưng chỉ làm một việc duy nhất là in dòng “Hello World”. Điều này không khác gì cho tuyển Brazil thi đấu ở AFF cup, gọi Messi đá bóng với Công Phượng. Lạm dụng over-engineering sẽ làm cho thiết kế trở nên phức tạp không cần thiết, khó hiểu và khó maintance sau này KISS (Keep It Simple, Stupid) KISS là một design principle được Hải quân Mỹ đưa ra vào năm 1960, đại loại hiểu là thiết kế hệ thống sao cho đơn giản, tránh sự phức tạp Hãy xem một ví dụ sau Kiều Phong vì muốn Cái Bang thành bang phái vô địch thiên hạ nên đã quyết một mình luyện toàn bộ võ công tuyệt học của các môn phái
public class KieuPhong {
public void HangLongThapBatChuong () { };
public void DaCauBongPhap () { }
public void NgocNuTamKinh () { }
public void QuyHoaBaoDien () { }
public void TinhTaKiemPho () { }
public void AmNhienTieuHonChuong () { }
//…
}
Tuy nhiên mỗi một tuyệt học võ công ẩn chứa cương nhu khác nhau, HangLongThapBatChuong() đòi hỏi cương lực sung mãn phù hợp cho nam giới, nhưng TinhTaKiemPho() là yêu cầu phải Dẫn đao tự cung, chỉ hợp với nữ giới. Nếu một mình class KieuPhong chứa hết các loại võ công trên sẽ dẫn tới đảo lộn kinh mạch mà vong mạng Nguyên tắc KISS hoạt động theo nguyên tắc Chia để trị, chia vấn đề thành những vấn đề nhỏ, biến thành lớp và hàm riêng biệt và tránh trùng lặp, hay còn gọi là Seperation of Concerns (SoC) KieuPhong cần phải chia các tuyệt học võ công cho các trưởng lão dưới quyền (module) nhỏ hơn riêng biệt để xử lý, khi nào cần dùng tới võ công nào thì gọi Ví dụ
class DuongQua {
public void AmNhienTieuHonChuong () { }
//..
}
class TieuLongNu {
public void NgocNuTamKinh () { };
//..
}
class NhacBatQuan {
public void TinhTaKiemPho () { };
//..
}
class KieuPhong {
DuongQua quaNhi;
TieuLongNu coco;
//..
}
DRY (Don’t Repeat Yourself) Đây là lỗi rất hay gặp, do thói quen copy paste của coder. Dẫn tới nhiều đoạn code tương tự nhau trong hệ thống. Hãy xem scenario sau Kiều Phong có tuyệt học Đả Cẩu bổng pháp gồm 36 chiêu thức biến ảo
class KieuPhong {
void DaCauBongPhap () {
// Ác cẩu Lan Lộ
// Bổng đả Ác Cẩu
// Thiên Hạ vô cẩu
//..
}
}
Kiều Phong truyền lại bổng pháp cho Hồng Thất Công với chiêu thức ko thay đổi
class HongThatCong {
void DaCauBongPhap () {
// Ác cẩu Lan Lộ
// Bổng đả Ác Cẩu
// Thiên Hạ vô cẩu
//..
}
}
Hồng Thất Công lại truyền lại cho Hoàng Dung, Hoàng Dung tiếp tục truyền cho Dương Quá. Coder trong trường hợp này đã thực hiện chiêu thức Copy-paste dẫn tới method DaCauBongPhap bị duplicate code quá nhiều rất tới dư thừa. Nếu DaCauBongPhap được thêm chiêu thức mới dẫn tới phải sửa chữa toàn bộ. Trong trường hợp này method DaCauBongPhap() nên được đưa vào class cha và các lớp kia sẽ kế thừa
class BangChuCaiBang {
void DaCauBongPhap () {…};
}
class HongThatCong extends BangChuCaiBang { };
class KieuPhong extends BangChuCaiBang { };
Như vậy chỉ cần update method trên duy nhất ở BangChuCaiBang → loại bỏ việc trùng lặp code. Ngoài cách trên hãy viết những đoạn code hay dùng thành các hàm common, hay Helper để tiện cho việc tái sử dụng
public static class StringHelper {
public static String concatString (..);
}
Mặt khác, khi nguyên tắc DRY bị vi phạm thì nó sẽ trở thành nguyên tắc WET – Write Everything Twice hoặc We Enjoy Typing. YAGNI – You Aren’t Gonna Need It Hãy suy nghĩ trường hợp sau KieuPhong sau khi luyện thành HangLongThapBatChuong() và DaCauBongPhap(), võ công đã đạt tới tầng thái thanh, thiên hạ vô địch. Ông quyết định học thêm môn CamKiThiHoa() với mục đích dự phòng sau này nếu có thất nghiệp thì tranh thủ có thêm nghề để kiếm ngân lượng
class KieuPhong {
public void HangLongThapBatChuong () {
// xử lý
};
public void DaCauBongPhap () {
// xử lý
}
public void CamKiThiHoa () {
// reserved chưa code
}
}
Cách trên đã vi phạm nguyên tắc KISS. Đôi khi coder suy nghĩ quá nhiều về tương lai của sản phẩm nên đã code thêm thật nhiều tính năng “phòng khi cần đến nó” hay “Cuối cùng sẽ dùng đến nó”. Cuối cùng sẽ dẫn đến sự thừa thãi trong source code không cần thiết. Phương lão nhân sau khi đọc mấy chương đầu của cuốn “Coding thập bát chưởng”, như vén mây mù nhìn thấy trời xanh. Ông lập tức đem cuốn sách về up lên FB@work để chia sẻ cho đệ tử bản môn. Quả thật sau 5 năm, năng suất coding của chúng đệ tử tăng tiến vượt bậc, chất lượng sản phẩm deliver cũng nâng cấp rõ rệt. Từ đó Fsoft môn không còn thấy cảnh OT nữa.
All rights reserved