Programmer

Nếu bạn đang đọc bài viết này, thì có lẽ bạn cũng là một coder. Có phải bạn đang muốn trở thành một Software Engineer thực thụ, một senior có thể xây dựng các ứng dụng tầm cỡ.
Nhưng để trở thành một Software Engineer thực thụ thì mình cần những gì? Có phải đây là câu hỏi mà nhiều bạn đang hỏi hay không. Trước khi đưa ra câu trả lời, mình cần xem xét kỹ câu hỏi. Thế thì "Software Engineer" là gì? và thực thụ thì khác gì với không thực thụ :))
"programming" thì khác gì "Software Engineering"?

Có thể xem "programming" là viết một chương trình (a new software), và nó là một trong những việc làm hằng ngày của Software Engineering. Engineering sẽ xử lý nhiều phần hơn bao gồm development (programming), chỉnh sửa (modification) và bảo trì (maintenance). Engineer phải đưa ra nhiều quyết định về thiết kế, time và scale.

Viết một chương trình chạy một lần khác với viết chương trình có thể sử dụng, nâng cấp trong một khoảng thời gian dài (tồn tại lâu).

Công nghệ luôn đổi mới, cải tiến liên tục, nhu cầu mới xuất hiện, nhu cầu cũ mất đi, để chương trình đáp ứng được những thay đổi đó, engineer cần đưa ra quyết định làm thế nào để giảm thiểu chi phí (gồm chi phí tài nguyên, con người).

Để trở thành Software Engineer có khả năng đưa ra những quyết định đúng đắn ta cần phải luôn luôn học hỏi, luôn cập nhật những cái hay cái mới.

Tự tin được xây dựng từ kiến thức

Senior Software Engineer khác gì với Junior Software Engineer?
Đối với các bạn mới vào, lúc này mình chưa có nhiều kinh nghiệm hoặc chưa nắm được dự án đó nó như thế nào (codebase), khi đó gặp một vấn đề mình chưa biết thì nên giải quyết bằng cách nào? Cách A này có được không? Có theo mục tiêu của team, của dự án hay không? từ đó mình thường bị động và nhận giải pháp từ team hoặc những người có kinh nghiệm. Lúc này mình chỉ lãnh trách nhiệm develop phần đó theo giải pháp đã được xác định.
Khi đã có kinh nghiệm và kiến thức, mình có thể tự quyết định chọn ra cách tiếp cận tối ưu cho vấn đề gặp phải mà vẫn theo mục tiêu của team, của dự án.

  • Làm sao để trờ thành Senior Software Engineer?

Bản chất của Software là luôn thay đổi
Như đã để cập ở trên, nhu cầu người dùng thay đổi, yêu cầu từ khách hàng thay đổi. Công nghệ cũ lỗi thời không còn đáp ứng được nhu cầu hiện tại, công nghệ mới tối ưu hơn. Việc làm của engineer là đảm bảo software đáp ứng được nhu cầu của khách hàng, có nghĩa là có thể thay đổi và việc cần làm là làm sao giảm chi phí khi thay đổi xảy ra (chi phí tài nguyên, chi phí con người).

Một principle về cái này: Easier to Change (ETC)
Khi đảm bảo source code, hệ thống có thể dễ dàng thay đổi, sẽ giảm được chi phí khi cần thay đổi.
Lưu ý, giá trị thực sự khi mình code thỏa ETC là để làm giảm chi phí khi thay đổi. Do đó, khi thực hiện ETC, mình cần cân nhắc, để đáp ứng ETC chi phí cho nó có lợi hơn hay không. Đây là quyết định mà một software engineer cần cân nhắc.

Vậy thì làm sao để code dễ dàng thay đổi?

Hãy nghĩ về giá trị thay vì rule.

mình sử dụng phương pháp này, cách này có làm hệ thống dễ hay khó thay đổi hơn?

  • Decoupling: thế nào là decoupling?
    • coupling là chỉ sự phụ thuộc lẫn nhau giữa các module (class, function, data, etc). Khi các module bị phụ thuộc lẫn nhau, dẫn tới việc một module thay đổi, yêu cầu phải cập nhật, chỉnh sửa các module liên quan.
    • Vậy làm sao để decoupling hay giữ code không bị coupling?