Coding thập bát chưởng
coding
6
UX Design
2
White

Giaosucan viết ngày 08/03/2017

Bản quyền thuộc Fsoft Potato Tech Mag

Đón đọc những bài viết đặc sắc ở blog
https://giaosucan.blogspot.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

alt text

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 ở

import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
public class HelloWorld{
private static HelloWorld instance;
public static void main(String[] args){
instantiateHelloWorldMainClassAndRun();
}
public static void instantiateHelloWorldMainClassAndRun(){
instance = new HelloWorld();
}
public HelloWorld(){
HelloWorldFactory factory = HelloWorldFactory.getInstance();
IHelloWorld helloWorld = factory.createHelloWorld();
IHelloWorldString helloWorldString = helloWorld.getHelloWorld();
IPrintStrategy printStrategy = helloWorld.getPrintStrategy();
IStatusCode code = helloWorld.print(printStrategy, helloWorldString);
if(code.getStatusCode() != 0){
throw new RuntimeException("Failed to print: " + code.getStatusCode());
}
}
}
class StringFactory{
private static StringFactory instance = new StringFactory();
public static StringFactory getInstance(){
return instance;
}
public HelloWorldString createHelloWorldString(String str){
HelloWorldString s = new HelloWorldString();
s.s = str;
return s;
}
}
class PrintStrategyFactory{
private static PrintStrategyFactory instance = new PrintStrategyFactory();
public static PrintStrategyFactory getInstance(){
return instance;
}
public IPrintStrategy createIPrintStrategy(){
IPrintStrategy printStrategy = new PrintStrategyImplementation();
IStatusCode code = printStrategy.setupPrinting();
if(code.getStatusCode() != 0){
throw new RuntimeException("Failed to create IPrintStrategy: " + code.getStatusCode());
}
return printStrategy;
}
}
class PrintStrategyImplementation implements IPrintStrategy{
private OutputStream print;
public IStatusCode setupPrinting() {
try{
FileDescriptor descriptor = FileDescriptor.out;
print = new FileOutputStream(descriptor);
return new StatusCodeImplementation(0);
}
catch(Exception e){
return new StatusCodeImplementation(-1);
}
}
public IStatusCode print(IHelloWorldString string) {
try{
print.write(string.getHelloWorldString().getHelloWorldString().concat("\n").getBytes("UTF-8"));
return new StatusCodeImplementation(0);
}
catch(Exception e){
return new StatusCodeImplementation(-1);
}
}
}
class StatusCodeImplementation implements IStatusCode{
private int code;
public StatusCodeImplementation(int code){
this.code = code;
}
public int getStatusCode() {
return code;
}
}
class HelloWorldString{
String s;
public String getHelloWorldString(){
return s;
}
}
class HelloWorldStringImplementation implements IHelloWorldString{
public HelloWorldString getHelloWorldString(){
StringFactory factory = StringFactory.getInstance();
HelloWorldString s = factory.createHelloWorldString("Hello, World!");
return s;
}
}
class HelloWorldFactory{
private static HelloWorldFactory instance = new HelloWorldFactory();
public static HelloWorldFactory getInstance(){
return instance;
}
public IHelloWorld createHelloWorld(){
IHelloWorld helloWorld = new HelloWorldImplementation();
return helloWorld;
}
}
class HelloWorldImplementation implements IHelloWorld{
public IHelloWorldString getHelloWorld() {
IHelloWorldString string = new HelloWorldStringImplementation();
return string;
}
public IPrintStrategy getPrintStrategy() {
PrintStrategyFactory factory = PrintStrategyFactory.getInstance();
return factory.createIPrintStrategy();
}
public IStatusCode print(IPrintStrategy strategy, IHelloWorldString toPrint) {
IStatusCode code = strategy.print(toPrint);
return code;
}
}
interface IHelloWorldString{
public HelloWorldString getHelloWorldString();
}
interface IHelloWorld{
public IHelloWorldString getHelloWorld();
public IPrintStrategy getPrintStrategy();
public IStatusCode print(IPrintStrategy strategy, IHelloWorldString toPrint);
}
interface IStatusCode{
public int getStatusCode();
}
interface IPrintStrategy{
public IStatusCode setupPrinting();
public IStatusCode print(IHelloWorldString string);
}
view raw HelloWorld.java hosted with ❤ by GitHub

alt text
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.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Giaosucan

23 bài viết.
179 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
30 4
Bản quyền thuộc Fsoft Potato Tech Mag Giới thiệu series chuyện về kiến trúc Microservice từ thiết kế đển implementation Giaosucan's blog: Chia sẻ...
Giaosucan viết 1 tháng trước
30 4
White
29 3
Đón đọc những bài viết đặc sắc ở blog https://giaosucan.blogspot.com Lịch sử ra đời Những người làm trong ngành tài chính ngân hàng sẽ không xa lạ...
Giaosucan viết 6 tháng trước
29 3
White
12 2
Bản quyền thuộc Fsoft Potato Tech Mag Những bài viết được giới thiệu ở blog https://giaosucan.blogspot.com Hồi 1 Code thiếu design, tương lai đ...
Giaosucan viết hơn 1 năm trước
12 2
Bài viết liên quan
White
0 3
Đón đọc những bài viết đặc sắc ở blog http://giaosucan.com (Ảnh) Thương thay thân phận coder Sáng thời fix bug, đêm thời quay tay Cuộc đời người...
Giaosucan viết 4 tháng trước
0 3
White
2 0
Ai cũng biết, hiện nay tình trạng thiếu hụt nhân lực ở các công ty công nghệ cao luôn nằm ở mức báo động. Một dự báo từ Hội đồng cố vấn về Khoa học...
Hia Tran viết 9 tháng trước
2 0
White
11 8
Bản quyền Fsoft Potato Tech Mag Tiếp theo series Microservice Những câu chuyện kì bí Giaosucan's blog Chia sẻ kiến thức kĩ thuât theo cách bá đạo...
Giaosucan viết 29 ngày trước
11 8
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
23 bài viết.
179 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!