Tôi đọc một bài viết chi tiết về lộ trình cho Backend Engineer Modern Backend Developer in 2018. Tuy nhiên tôi cảm thấy có một số khúc mắc đối với lộ trình đã được trình bày trong bài viết.

  • Cần có bao nhiêu kỹ năng trong bài viết trong lĩnh vực backend hiện nay
  • Các kỹ năng quan trọng nào chưa được đề cập trong bài viết trong trang web trên

Trong bài viết này tôi viết ra một chút về ý kiến riêng của mình về 2 khúc mắc trên.
Tôi không nghĩ mình là một kỹ sư am hiểu về các kỹ thuật tiên tiến nhưng là người làm nhiều dự án web nhất cũng là người có nhiều năm kinh nghiệm làm web, game server nhất tại Vietnamlab, gần đây ít nhiều tôi vẫn theo dõi những xu hướng của Backend. Tôi rất hạnh phúc nếu ai đó có thể tham khảo được từ bài viết của tôi.

Ngôn ngữ lập trình

Có nhiều ngôn ngữ được kể ra trong bài viết của của họ, tôi chỉ có một chút điều chỉnh nhỏ về danh sách các ngôn ngữ lập trình:

  • Elixir
  • Scala
  • Java
  • .NET (C# and VB.NET)
  • Python
  • Ruby
  • PHP
  • TypeScript
  • Golang
  • Rust

Đối với mỗi ngôn ngữ trên tôi có khoảng một vài tháng kinh nghiệm trở lên sử dụng trong công việc. (Ngoài ra tôi cũng có môt chút kinh nghiệm về Kotlin).

Một số ngôn ngữ có trường hợp sử dụng tương đối giống nhau, những ngôn ngữ khác thì không, nhưng theo ý kiến cá nhân của tôi sẽ gồm 3 nhóm sau (nhiều trang web khác nhau họ sẽ chia làm 2 nhóm):

  • Ngôn ngữ kịch bản (script không cần compile) có kiểu động (Python/Ruby/PHP/...)
  • Ngôn ngữ compile có kiểu tĩnh (Golang/Rust/Java/..)
  • Ngôn ngữ function programing có kiểu tĩnh (Python/Golang/Scala)

Tôi tin rằng nó sẽ là đủ để trải nghiệm một hoặc nhiều (ví dụ, vv) cho mỗi loại trong ba loại trên.

Ngược lại, Nếu "Không có kinh nghiệm về ngôn ngữ kịch bản" hoặc "Không có kinh nghiệm về ngôn ngữ biên dịch", hay là "Không muốn làm ngôn ngữ đó". Tức là sự cân bằng về hiểu biết ngôn ngữ khá là không tốt. Cũng với việc cần phải lĩnh hội đa dạng các kỹ thuật mới khác nhau sẽ là gánh nặng về ngôn ngữ. Vì vậy nếu bạn đang có thái độ "không học đúng cách" hoặc "không quá chú tâm" về ngôn ngữ sẽ bị thiệt thòi trong việc tham gia các dự án hấp dẫn đòi hỏi ngôn ngữ đặc thù riêng.

Nhân tiện .NET(C#/VB.NET), bởi vì nó là một ngôn ngữ không được sử dụng nhiều cho bởi các kỹ sư backend trong lập trình web, nên bỏ qua cũng không sao cả. (Tôi cũng quan tâm đến việc phát triển ứng dụng và tôi nghĩ rằng nó dành cho những người muốn sử dụng Xamarin hoặc Unity)

Package manager

Tại thời điểm này, có khá nhiều ngôn ngữ ứng dụng hình thức quản lý package theo kiểu kết hợp ◯◯File◯◯File.lock.

Đặc biệt đối với npm, do tầm quan trọng trong của Javascript(TypeScript) (dù là server site hay fontend hay phát triển ứng dụng đểu có thể sử được). Nếu mà nắm bắt được npm sẽ rất bổ ích. Nhưng ai còn chưa có cơ hội sử dùng nó, tôi nghĩ rằng nên bắt đầu tự tìm hiểu nó.

Có một vài trình quản lý gói của một số ngôn ngữ như sbt của Scala hay grade của Java(Kolin) tôi thấy khá là đơn giản không cần học cũng được. Tuy nhiên có môt số lai khá khó như Pipenv của Python càng ngày càng được mở rộng và khó hơn.

Security

Về vấn đề này tôi nghĩ rằng nó không thể hiểu tất cả mọi thứ vì chúng quá sâu, nhưng, ở mức tối thiểu SQL Injection, XSS, CSRF cũng như các biện pháp kỹ thuật chống lại các cuộc tấn công lỗ hổng phải nắm bắt được.

  • Không giữ thông tin quan trọng trong văn bản thuần tuý trong cơ sở dữ liệu vv (luôn mã hóa)
  • Không tải lên thông tin bí mật cho dịch vụ quản lý nguồn như Github (.env, sử dụng các biến môi trường)
  • Trên đám mây (AWS hoặc GCP), hãy kiểm soát truy cập bằng cách sử dụng IAM, v.v.
  • Luôn luôn SSL hóa

Các phương pháp kỹ thuật trên đây cần phải hiểu và thực hiện đầy đủ.

Tuy nhiên, nếu yêu cầu bảo mật được thực hiện quá nghiêm ngặt, hiệu quả phát triển sẽ kém dần đi (dẫn đến sự ra đi của các kỹ sư). Nên tùy vào mức độ quan trọng để thực hiện thiết lập bảo mật.

Testing

  • Rspec(Ruby)
  • unittest(Python)
  • testing(Golang)
  • ExUnit(Elixir)
  • ScalaTest(Scala)

Cần phải nắm bắt chi tiết, cụ thể về cách sử dụng chuẩn của mỗi Test framework của các ngôn ngữ khác nhau như được mô tả ở trên đang được sử dụng trong dự án càng nhiều càng tốt (ví dụ: setup, teardown phạm vi áp dụng vv). Tuy nhiên, vì bất kỳ Test framework nào về cơ bản đều có các phần tương tự nhau, nếu đã làm quen với một Test framework, có thể dễ dàng hiểu được Test framework của các ngôn ngữ khác.

Ngoài ra phải hiểu rõ được sự khác nhau giữa Unit testIntegration test . Khái niện DI(Dependency Injection) trong test cũng rất quan trọng. Ngoài ra cũng nên hiểu về Test Double, Mock, Stub.

Tham khảo: https://en.wikipedia.org/wiki/Test_double

Hiện tại tôi vần thực hiện Unit test với các hàm phụ thuộc vào DB hay bộ nhớ ngoài theo 2 cách là phương pháp Mocking và phương pháp sử dụng service bên ngoài đã được dump trên local, và rồi tôi nhận thấy rằng với Docker việc làm giả các Service bên ngoài trên local trở lên đơn giản với chi phí thấp hơn rất nhiều, cùng với nhiều lợi ích đáng kể. (Trường hợp của AWS có 1 Docker Image gọi là localstack cho phép làm giả các loại service khác nhau, các Service CI của CircleCI chẳng hạn đang được làm nên chúng ta có thể thực hiện các unit test trên local giống như trên môi trường CI).

Nhân tiện, về TDD (Test Driven Development), tôi muốn dùng nó trong dự án thực tế nhưng kinh nghiệm của tôi chỉ mới làm ở 1 buổi thực hành nho nhỏ nên chưa thể nói gì nhiều về nó vì chưa có đủ kinh nghiệm. Nó đòi hỏi các kỹ sư phải có hiểu biết rõ về ngôn ngữ cũng đòi hỏi chi phí khá cao nên hiện tại chưa nhiều công ty thực hiện.

RDBMS (Hệ quản trị cơ sở dữ liệu quan hệ)

Ngay cả bây giờ rất nhiều dịch vụ NoSQL đang xuất hiện, cơ sở dữ liệu quan hệ vẫn còn rất quan trọng và tồn tại đến tận bây giờ, đặc biệt là đối với MySQL. Nó là một RDB quan trọng, vì vậy tôi nghĩ rằng bạn cần phải biết về các phương pháp quản lý cơ bản và các lệnh của MySQL.

Với SQL, Kiến thức tối thiểu cần nắm được

  • Cơ bản về DDL (CREATE TABLE)
  • Cơ bản về DML (SELECT/INSERT/UPDATE/DELETE)
  • Cơ bản về DCL (GRANT)

Ngoài ra nhưng kiển thức về Character code, index, transaction, deadlock, master / slave cũng cần phải biết.

Gần đây RDB được quản lý đầy đủ bởi RDS được sử dụng khá nhiều, nhờ vậy mà không cần hiểu cặn kẽ về RDB. Nhưng vẫn nên cần biết về các kỹ thuật RDB để có khả năng xử lý các sự cố khi cần thiết.

Web Framework

  • Rails(Ruby)
  • Django, Flask(Python)
  • Revel(Golang)
  • Phoenix(Elixir)
  • Finch(Scala)
  • Iron(Rust)
  • Vert.x(Kotlin)

Trên đây là Web Framework mà tôi đã sử dụng trong thực tế trong vài năm qua, nhưng không giới hạn ở đây, nếu bạn đã quen thuộc với một vài các Web framework của các ngôn ngữ khác nhau thì dù nào là Web framework nào cũng đẽ dàng sử dụng nhanh chóng.

Tham khảo để đưa ra lựa chọn framework: https://www.techempower.com/benchmarks/

Phần sau sẽ giới thiệu thêm về các phần khác nữa. NodSQL/Cache, REST API, Auth, Mesenge, SearchEngine, Docker, ... Thôi còn nhiều lắm, cứ chờ phần sau sẽ rõ.