Phát triển ngăn xếp đầy đủ
Thuật ngữ full-stack developer gần đây ngày càng được sử dụng thường xuyên hơn. Đặc biệt là trong các cuộc thảo luận xung quanh cấu trúc nhóm, yêu cầu tuyển dụng hoặc để suy ra sự tuyệt vời thuần túy của một cá nhân.

Khi tôi nhìn thấy loại tuyên bố này trên CV hoặc nghe ai đó tự mô tả họ là full-stack, một số câu hỏi nảy ra trong đầu tôi:
- Bạn có ý nghĩa gì khi phát triển toàn bộ ngăn xếp?
- Bạn đang tuyên bố làm chủ ngăn xếp nào?
- Kiến thức của bạn sâu rộng đến mức nào đối với từng yếu tố? Làm thế nào nó cần phải được đầy đủ?
- Full-stack developer có thật không? Họ có thực sự tồn tại?
- Nếu chúng tồn tại tại sao chúng hữu ích?
- Full-stack có phải là cách nói khác của Jack of all trades, master of nothing?
Lý lịch
Trước khi chúng tôi đi vào chi tiết, đáng để xác định những gì chúng tôi đang hướng tới để phát triển và cung cấp.
Tự nhận mình là nhà phát triển toàn diện cho PoC chạy trên máy tính xách tay của bạn được cho là một mô tả hợp lý vì bạn là người duy nhất phát triển mọi phần của giải pháp đó. Quy mô rất nhỏ và tác động của thiết kế hoặc phát triển kém là rất hạn chế. Về cơ bản, bạn đang chứng minh một khái niệm không cung cấp dịch vụ, miễn là nó có thể hoạt động trong bản demo hàng giờ cho CIO thì không sao.
Nếu chúng ta xác định giải pháp là một hệ thống sản xuất xử lý dữ liệu khách hàng trực tiếp và tạo ra thông tin chi tiết/dữ liệu thúc đẩy việc tạo ra giá trị kinh doanh, thì tình hình sẽ khác và tác động của lỗi mã hóa hoặc thực hành kém sẽ cao hơn nhiều.
Đối với mục đích của bài đăng này, chúng tôi sẽ xem xét một hệ thống xử lý số lượng lớn (10 GB mỗi ngày) dữ liệu khách hàng thực (bao gồm cả PII) và cung cấp các dịch vụ kinh doanh chính với ít nhất 2 số 9 khả dụng.
Tại sao các lập trình viên full-stack lại có giá trị?
Đặt sang một bên sự tồn tại của những người như vậy, những lợi ích mà họ mang lại là điều hiển nhiên. Họ có thể thiết kế, xây dựng và chạy một giải pháp mà không cần bất kỳ sự hỗ trợ nào từ bên ngoài; điều này có nghĩa là tất cả các hội thảo thiết kế, tích hợp thành phần, chu kỳ kiểm tra và chuyển giao hoạt động tốn thời gian và dễ xảy ra lỗi đều bị loại bỏ phần lớn. Không cần phải lên lịch họp, hoặc tệ hơn là một loạt cuộc họp, giữa các doanh nghiệp vừa và nhỏ về bảo mật, nền tảng, DB, op, … vì bạn có thể thiết kế, xây dựng và chạy giải pháp. Một số ít các nhà phát triển giống như thần thánh (g nhỏ) này có thể phân phối công việc của một nhóm chức năng chéo lớn và do loại bỏ được chi phí chung của việc bàn giao nên việc phân phối cũng nhanh hơn và ít xảy ra lỗi hơn.
Vì vậy, dựa trên những lợi ích rõ ràng này, tại sao không có nhiều nhóm gồm những người này trong tất cả các tổ chức CNTT? Tại sao các công ty không tích cực tuyển dụng và đào tạo để xây dựng các đội ninja này? Có phải vì sự phát triển tương đương với Batman hay Tony Stark không thực sự tồn tại?
Để trả lời những câu hỏi này, chúng ta cần xem xét một ngăn xếp (rất) đơn giản trông như thế nào.
Ngăn xếp đơn giản hóa

Tôi đang loại bỏ cơ sở hạ tầng nền tảng với mục đích đơn giản hóa.
Nhìn vào các yếu tố trên, rõ ràng việc trở thành chuyên gia trong từng lớp sẽ là một thách thức. Tuy nhiên, giả sử tôi không cần biết MỌI THỨ trong mỗi lớp, liệu tôi có thể giảm lượng kiến thức cần thiết mà vẫn được coi là full-stack không? Lấy Ứng dụng Front-End làm miền ví dụ, chúng tôi có thể dễ dàng loại bỏ Android và iOS và chỉ tập trung vào một kênh web và có thể tinh chỉnh hơn nữa và nói rằng nó bị giới hạn đối với React, điều đó giúp ích như thế nào?
Dựa trên phạm vi cắt giảm của chúng tôi, tôi cần biết gì về ứng dụng web React?
Chà, trước tiên, bạn sẽ cần hiểu cách thức hoạt động của các ứng dụng trang đơn, đặc biệt là các nguyên tắc cốt lõi cần thiết để xây dựng, gỡ lỗi và chạy ứng dụng web cũng như công cụ liên quan, ví dụ: npm, webpack, quản lý nội dung, devtools phản ứng, nguyên tắc UX, …
Bạn cũng cần phải rất quen thuộc với chức năng do bên thứ ba cung cấp, chẳng hạn như material UI, redux, bootstrap, … và giải pháp quản lý gói chẳng hạn như npm (bao gồm quản lý lỗ hổng bảo mật — điển hình là cân nhắc DevOps, xem ghi chú sau).
Còn về hiệu suất, ví dụ: thời gian để vẽ nội dung đầu tiên, thời gian để tương tác, thời gian chặn, … Tôi có nên áp dụng kiến trúc ứng dụng web tiến bộ và/hoặc nhân viên dịch vụ để trợ giúp không? Bạn sẽ cần hiểu các yếu tố hiệu suất và cách các mẫu cốt lõi khác nhau có thể giúp sử dụng công cụ để hỗ trợ phân tích, ví dụ như React DevTools hoặc Lighthouse.
Khả năng truy cập là điều bắt buộc đối với tất cả các ứng dụng bất kể ứng dụng được phân phối nội bộ hay bên ngoài. Làm cách nào để đảm bảo tuân thủ các nguyên tắc của WCAG?
Tóm lại, chỉ trong lớp Front-End, có rất nhiều điều cần biết và có thể nói rằng điều này giúp nó nhẹ nhàng. Các lớp còn lại không có gì khác biệt và trong nhiều trường hợp độ phức tạp tăng lên. Và để làm cho vấn đề trở nên tồi tệ hơn, các mẫu và nguyên tắc kiến trúc, các phương pháp hay nhất và khuôn khổ KHÔNG CHỐNG LẠI .
Vì vậy, giả sử tôi đã cố gắng nhồi nhét các mẫu, tiêu chuẩn, phương pháp hay nhất và kỹ năng thực hành cho từng lớp vào đầu mà không làm nó bùng nổ thì tôi cần biết thêm điều gì nữa? Có bất kỳ khả năng hỗ trợ cần thiết?
khả năng hỗ trợ
Cùng với ngăn xếp công nghệ, có một số khả năng hỗ trợ cần thiết để thiết kế, xây dựng, phân phối và chạy tất cả các thành phần của giải pháp.

Kiến trúc & Kỹ thuật SW
Tập hợp các kỹ năng cốt lõi để hỗ trợ thiết kế kiến trúc xuyên suốt các lớp tạo ra một triển khai tốt trong bất kỳ ngôn ngữ / khuôn khổ nào
- RẮN (Trách nhiệm duy nhất, Mở/Đóng, Thay thế, Phân tách giao diện, Đảo ngược phụ thuộc)
- khả năng tái sử dụng, khả năng bảo trì, tính di động, khả năng mở rộng, …
- Chia tỷ lệ ngang và dọc
- cấu trúc mã hóa
- ghi nhật ký
- đánh giá mã
- …
Mỗi lớp và thành phần bên trong mỗi lớp (bỏ qua Front-End từ phối cảnh kênh web do trình duyệt triển khai hoặc thường nằm ngoài tầm kiểm soát của chúng tôi vì đó là phía máy khách) trong ngăn xếp đơn giản hóa ở trên yêu cầu xem xét cẩn thận từ góc độ bảo mật ví dụ
- API : TLS, DDoS, xác thực và ủy quyền, COR, chính sách bảo mật nội dung, …
- Dịch vụ vi mô: TLS (bao gồm MA), kiểm soát truy cập, quản lý bí mật, xác thực đầu vào của người dùng, …
- Dữ liệu : kiểm soát truy cập, mã hóa ở phần còn lại, quản lý khóa, nhóm bảo mật mạng và mạng con, …
- Nền tảng (bổ sung) : bảo mật mạng, cấu hình thành phần cố định, ví dụ: ChefInspec
Tất cả các nhà phát triển đều cần có kỹ năng kiểm tra cốt lõi, không có lý do gì để không thể kiểm tra các tính năng của riêng bạn. Và trong môi trường full-stack có nghĩa là mọi thành phần trên sơ đồ trên.
Hiểu và có thể áp dụng các loại và giai đoạn kiểm tra khác nhau (trong khi không chấm bài tập về nhà của chính bạn):
- Chức năng và phi chức năng
- Hộp đen so với hộp trắng
- Đơn vị, tích hợp, hệ thống, sự chấp nhận của người dùng, hồi quy, khói, …
Phát triển và duy trì các quy trình Tích hợp liên tục và Triển khai liên tục
Các công cụ hỗ trợ cốt lõi cho CICD thường được tạo bởi một nhóm tập trung/chuyên dụng, nhưng ít nhất mọi người đều có thể cập nhật và duy trì các đường ống. (Vâng, tôi biết; nếu bạn có nhóm DevOps thì bạn không làm DevOps nhưng nhiều tổ chức thì làm)
Sử dụng các công cụ như:
- Jenkins, TravisCI, Spinnaker
- GitHub, Bitbucket
- sonarqube
- Zaproxy
- Mã xác thực, Snyk
- Bến tàu, mỏ neo, bến cảng
- …
Nếu chúng ta bỏ qua cách tiếp cận “bạn xây dựng nó, bạn chạy nó” thì các yêu cầu đối với nhà phát triển full-stack xung quanh các hoạt động được đơn giản hóa đáng kể
Cần tập trung vào việc xây dựng ứng dụng của bạn để có thể hoạt động được. Bao gồm tất cả các móc chẩn đoán cần thiết, nhật ký sự kiện và sổ chạy để nhóm chạy có thể phân loại và có khả năng giải quyết các sự cố mà không cần nhờ đến sự trợ giúp từ nhóm phát triển
Tất nhiên, trách nhiệm đối với các khả năng trên có thể dựa trên cách tổ chức của bạn được quản lý — có thể quá trình phát triển chỉ là thử nghiệm đơn vị nghiêm ngặt hoặc tất cả thử nghiệm đều nằm trong nhóm scrum ngoại trừ thử nghiệm bảo mật. Nhưng nếu bạn có thể đảm nhận việc phát triển API và quản lý đường ống CICD mà không cần sự hỗ trợ từ người khác thì sẽ tiết kiệm được rất nhiều thời gian.
Đối với các lớp của ngăn xếp công nghệ, phạm vi của các khả năng hỗ trợ cần thiết để xác nhận trạng thái toàn ngăn xếp là rất lớn.
Phần kết luận
Tôi tin rằng nhà phát triển full-stack thực sự là một huyền thoại (phần lớn) và kể từ khi stack vượt ra ngoài việc chạy trình biên dịch chương trình trên 6502 vào những năm 1980. Đừng đánh lừa bản thân khi nghĩ rằng có được giao diện người dùng và chạy nói chuyện với một vài API được viết bằng Node chạy trên nút K8 có nghĩa là bạn là nhà phát triển toàn diện.
Những cá nhân này được coi là thần thoại không chỉ vì kiến thức và kinh nghiệm chuyên sâu mà họ bắt buộc phải có trong các lĩnh vực kỹ thuật khác nhau mà còn bởi vì phạm vi này ngày càng tăng — hàng năm có những bước phát triển vượt bậc về công nghệ và mô hình trên mỗi lĩnh vực, theo kịp cho đến nay là rất, rất khó khăn.
Ngoài ra, những cá nhân này thường sẽ yêu cầu nhiều tiền hơn mức mà hầu hết các tổ chức CNTT có thể trả cho họ, nhưng nếu họ thực sự là full-stack thì họ xứng đáng - như quảng cáo đưa ra.
Tôi đề xuất rằng điều tốt nhất bạn có thể hy vọng đạt được là làm chủ lĩnh vực bạn đã chọn (một lớp cụ thể có ngăn xếp công nghệ hạn chế trong lớp đó) và tốt nhất là năng lực và nhận thức về sự thiếu hiểu biết của bạn trong các lĩnh vực khác.
Cách tốt hơn để một nhóm thành công không phải là cố gắng tuyển dụng hoặc đào tạo các nhà phát triển toàn diện mà thay vào đó là tạo các lĩnh vực, ví dụ như front-end, back-end, cơ sở dữ liệu, v.v. và hướng tới kiến thức cấp ninja trong một lĩnh vực nhất định (một lần nữa ngăn xếp sẽ bị hạn chế) với kiến thức chồng chéo/chéo sang các miền khác với giao diện, tiêu chuẩn, phương pháp hay nhất và khuôn khổ rất rõ ràng để hỗ trợ phát triển chất lượng cao. Nếu các cá nhân có thể mở rộng nhiều miền ở cấp độ chuyên gia thì điều đó thật tuyệt nhưng theo kinh nghiệm của tôi, đây thực sự là một ngoại lệ.
Nhận xét thưởng:
Bạn cần biết những gì để thành công “hơn” với tư cách là nhà phát triển khoa học dữ liệu (lưu ý việc sử dụng từ nhà phát triển ở đó thay vì thuật ngữ nhà khoa học dữ liệu - tôi cho rằng bạn đã là một nhà khoa học dữ liệu giỏi rồi? Và nếu bạn chưa phải, tôi không thể giúp bạn ở đó!). Nếu chúng tôi định nghĩa nhà phát triển này là người có thể phát triển trên từng lĩnh vực này nhưng là chuyên gia trong phần Khoa học dữ liệu* tức là mục tiêu đã giảm của tôi ở trên, thì việc công nghiệp hóa ngăn xếp rộng hơn là điều mà Kỹ sư máy học sẽ làm… nhưng cuộc thảo luận đó là cho một thời gian khác.
*trong ngăn xếp được đơn giản hóa của chúng tôi, chúng tôi có thể nói rằng mô hình đi theo bit microservices … đại loại là