Cho đến nay tôi đã làm cái nghề Coder cũng phải được 14, 15 năm. Năm nay cũng 39 tuổi rồi, nếu so sánh với một cầu thủ bóng đá chuyên nghiệp thì có lẽ nghỉ hưu cũng đã từ lâu. Vậy mà mình vẫn còn miên man code và code, bug và bug…

Hồi đó Skill chủ yếu của tôi vẫn là C#, Jquery, Asp.Net, Sql Server v.v… Và sau nhiều năm coder như vậy tôi có rất nhiều kinh nghiệm. So với những ngày đầu code một cách vô ý thức, bạ đâu code đó thì giờ đây cách code cũng đã thay đổi rất nhiều và với mỗi yêu cầu tôi thường phân tích kỹ, code sử dụng design pattern và code trừu tượng trước khi làm cụ thể một trường hợp nào đó.

Nếu như trong các dự án tôi làm mà các Module, Form nào na ná nhau. Tư duy thông thường của mọi người là đều copy lại và chỉnh sửa sao cho phù hợp. Không chỉ những Form quản lý mà còn nhiều các Form khác ví dụ như báo cáo. Code của dự án nào vì thế cũng khá là nặng. Và có một nhược điểm là nếu Form nào mà có lỗi thì hầu như phải chỉnh sửa lại ở tất cả các Form. Và cần thêm tính năng nào thì cũng phải mở từng đấy Form ra mà thêm. 😀 😀 nói chung là căng nhỉ?

Chính vì vậy đa số nhiều lập trình viên sau một thời gian đi làm cũng thường kêu là không có gì mới mẻ, làm đi làm lại một việc. Công việc hầu như không có sáng tạo. Đấy là cái tôi thấy, hầu như code không có thiết kế, không sử dụng design pattern và không tận dụng được tính chất OOP để kế thừa, đóng gói. Các hàm, biến static được sử dụng tràn lan vô tội vạ, code thì copy và không được viết thành thư viện.

Phải nói thật thế hệ lập trình viên bây giờ, do hệ quả của giáo dục mình và cũng do luôn cả thị trường IT mình phát triển quá nóng trong vài năm trở lại đây, các trung tâm lập trình mở mới cứ gọi là như lợn con…thậm chí có trung tâm dạy lập trình mà người dạy cũng chỉ đạt level junior or hơn chút…và cách dạy thì có thể đoán được là dạy cho biết code thôi chứ chả hiểu mẹ gì dẫn đến các thế hệ lập trình hiện tại yếu về mặt tuy duy, basic cơ bản cực kỳ kém….( mình ko nói tất cả nhé kẻo các bạn ném đá, vì cũng có 1 số bạn mình tiếp xúc ở thế hệ trẻ họ cũng rất giỏi trong việc tư duy code sao cho chuẩn. nhưng con số này thì rất nhỏ so với phần đa là các bạn được học, được người ko kinh nghiệm dạy…nên tư duy ăn xổi và học kiểu tip, trick…)

Hồi đi làm mình cũng rất thích đi giải quyết hậu quả code của đồng nghiệp và đã từng cứu rất nhiều dự án bị fail chứ mình ko ngại gì vì lúc đó mình nghĩ, dự án fail đó mới có nhiều cái hay ho để mình học và thể hiện được hết những ideas của mình để biến dự án fail đó thành dự án code sạch và đẹp hơn. Tuổi trẻ mà đúng ko? Trẻ thì thường nhiệt tình và máu lửa 😀

Okay, quay lại chủ đề, mình sẽ lấy 1 ví dụ và tư duy từ đầu đến cuối để các bạn hiểu được phần nào qua đó tự bản thân rút ra bài học để áp dụng cho mình nhằm cải thiện chất lượng code của mình qua đó kiếm được tiền nhiều hơn. Hãy mạnh rạn suy nghĩ “Mình junior tại sao không thể code được như các anh senior?”, câu trả lời là: hoàn toàn có thể làm được nhé, nếu chúng ta biết dùng cái đầu vào việc coding, nào cùng xem ví dụ bên dưới

Hãy thiết kế code, sử dụng Design pattern, code trừu tượng trươc khi đi vào cụ thể

Quay trở lại các dự án thường chúng ta hay phải làm các danh mục trong đó có các tính năng như tìm kiếm, thêm, sửa, xóa, xuất excel. Form nào các bạn cũng phải làm một lưới hiển thị, làm sự kiện thêm mới, sửa, validate dữ liệu khi lưu, sự kiện xóa. Form nào cũng từng đấy bước không thể khác được.

Tôi ví dụ như làm một Form quản lý danh mục tin. Đây chỉ là ví dụ mô phỏng thôi nhé. Ta có thể có đoạn code như sau

public class ManageCategory
{
    public void ShowFormEdit(Category category)
    {
        // Hiển thị form cập nhật hoặc thêm mới
    }
     
    public void Save(Category category)
    {
        // Validate trước khi lưu
        // Thực hiện lưu
    }
     
    public void Delete(Category category)
    {
        // Validate xóa
        // Thực hiện xóa
    }
     
    // Lấy dữ liệu hiển thị lên lưới
    public string Keyword { set; get; }
    public List<Category> GetData(int pageIndex, int pageSize, string fieldOrder, string dir)
    {
        // ....
    }
     
    public void ExportExcel(List<Category> categories)
    {
        // Điền vào excel cho client tải xuống
    }
}

Rồi một form quản lý loại sản phẩm

public class ManageProductType
{
    public void ShowFormEdit(ProductType productType)
    {
        // Hiển thị form cập nhật hoặc thêm mới
    }
     
    public void Save(ProductType productType)
    {
        // Validate trước khi lưu
        // Thực hiện lưu
    }
     
    public void Delete(ProductType productType)
    {
        // Validate xóa
        // Thực hiện xóa
    }
     
    // Lấy dữ liệu hiển thị lên lưới
    public string Keyword { set; get; }
    public List<ProductType> GetData(int pageIndex, int pageSize, string fieldOrder, string dir)
    {
        // ....
    }
     
    public void ExportExcel(List<ProductType> productTypes)
    {
        // Điền vào excel cho client tải xuống
    }
}

Như các bạn thấy thì Form nào chúng ta cũng phải làm từng đấy bước. Mà đấy là code server, chưa kể code javascript cũng vậy. Các Form mà cứ code đi code lại như vậy hoài rất mất công và sinh ra chán. Lúc gặp lỗi hoặc thêm chức năng thì Form nào cũng phải vọc vào mà sửa.

Vậy bây giờ chúng ta hãy nghĩ khác đi. Trừu tượng nó thành như này

public abstract class Manage<T>
{
    public void ShowFormEdit(T t)
    {
        // Hiển thị form cập nhật hoặc thêm mới
    }
     
    public void Save(T t)
    {
        // Validate trước khi lưu
 
        BeforeSave();
        // Thực hiện lưu
    }
 
    protected virtual void BeforeSave(T t)
    {
         
    }
     
    public void Delete(T t)
    {
        // Validate xóa
        // Thực hiện xóa
    }
     
    // Lấy dữ liệu hiển thị lên lưới
    public vitural List<T> GetData(int pageIndex, int pageSize, string fieldOrder, string dir)
    {
        // ....
    }
     
    public void ExportExcel(List<T> list)
    {
        // Điền vào excel cho client tải xuống
    }
}

Và nếu là quản lý chuyên mục tin sẽ là như này

public class ManageCategory : Manage<Category>
{
    public string Keyword { set; get; }
}

Nếu là quản lý loại sản phẩm

public class ManageProductType : Manage<ProductType>
{
    public string Keyword {setl;get;}
 
    protected override void BeforeSave(ProductType productType)
    {
        // Mở rộng validate thêm
    }
}

Chúng ta sẽ không phải code một lần mà lại phải code thêm một lần nữa. Bug ít đi, thêm tính năng cũng sẽ nhanh hơn. Để phát triển, tại lớp Generic các bạn có thể đặt sự kiện, phương thức virtual, abstract để các lớp cụ thể override lại. Ví dụ như ManageProductType override lại BeforeSave để viết thêm validate

Tuy vậy để code được trừu tượng các bạn sẽ phải có nhiều kỹ năng và các kiến thức cơ bản là cực kỳ cần thiết. Và với tùy theo các Framework các bạn đang theo các bạn có thể viết các mô hinh cho phù hợp. Trên đây chỉ là code ví dụ mà thôi.

Ngoài ra không chỉ làm những Form quản lý danh mục mà chúng ta có thể mở rộng ra nhiều bài toán khác nhau. Với tôi sau nhiều năm kinh nghiệm, tôi đã làm nhiều yêu cầu với nhiều mô hình khác nhau. Tuy nhiên cũng có một vài lần làm trừu tượng với những yêu cầu lớn. Điển hình như tôi tham gia dự án Staxi (Một sản phẩm đặt xe tương tự như Grab, Uber), mô hình trừu tượng một khối kết nối. Từ đó kế thừa tạo ra các khối như tổng đài, server, App Client, mỗi khối có nhiệm vụ nhận, và truyền tín hiệu. Rồi dự án phân tích dữ liệu từ hộp đen. Cũng trừu tượng mô hình phân tích để kế thừa cho phân tích dữ liệu cho Taxi, Bus và Xe vận tải. Và rất nhiều dự án khác. Tôi sẽ chia sẻ trong những lần tới.

Tôi cũng show cho anh em xem code của tầng Presentation tôi đã thực hiện trong dự án hồi đó, rất clear và thể hiện tư duy của tui

<upload image later>

OK, fine! bạn thấy thế nào? Bản thân mỗi chúng ta đều tồn tại tư duy, chúng ta chỉ cần pause lại và thinking về thứ mình làm sau đó đưa ra giải pháp và cách tiếp cận như trên mình gợi ý, thì chắc chắn các bạn sẽ cảm thấy bất ngờ vì tại sao mình lại code ngon vãi…Qua đó các bạn sẽ thấy nghề lập trình này ko hề nhàm chán hay khô khan, nó có thể phát triển lên một tầm rất cao, chứa hàm lượng chất xám lớn…và đó chính là thành quả của các bạn. Làm được vậy chắc chắn bạn sẽ thành công, lương thưởng xứng đáng thôi.

Hy vọng, các bạn hãy thắp sáng ngọn lửa đam mê lập trình để có suy nghĩ và cách tiếp cận tích cực trong việc viết code hàng ngày. Thành công không từ trên trời rơi xuống, nó là thành quả của những bạn có đam mê và biết biến lỗ lực hàng ngày thành trái ngọt.

Bật mí các bạn 1 bí mật, lúc học và ra trường làm coder ban đầu tôi không thích nghề này cho lắm, nhưng theo thời gian làm và tìm hiểu và thấy rằng nó hay quá nên tự nhiên mình lại thành đam mê với nghề. Mà đã đam mê rồi thì đừng hỏi tại sao mình lại biết rất rộng và hiểu rất sâu một vấn đề trong lập trình.

Làm gì mà cũng đam mê thì chắc chắn cũng sẽ thành công!

-LXT

Acazia Software is a custom software development Outsourcing company with expertise in Java, Microsoft .NET, Mobile Apps Development, PHP, React Native, Angular Js and Node Js