Kinh nghiệm và kỹ năng

Chợt giật mình tỉnh giấc và biết mình sắp phải động chân động tay với DevOps giống như sắp phải bước vào con đường đầy đá và sương rồng vậy. Bởi vì mình biết DevOps là một lĩnh vực vô cùng phức tạp, đòi hỏi không chỉ kinh nghiệm, kỹ năng mà còn yêu cầu một thể lực dồi dào và khả năng thức thâu đêm suốt sáng. Có lẽ vì thế mà nhiều DevOps đã nghiện bò húc và monster kể từ khi bước chân vào nghề.

DevOps là gì?

Trong lĩnh vực IT của chúng ta thì tất cả các phần mềm đều trả qua quy trình 3 bước:

  1. Phát triển: ở bước này chúng ta sẽ phân tích thiết kế hệ thống, code, kiểm thử
  2. Triển khai: ở bước này chúng ta sẽ chuẩn bị các môi trường là các máy tính hay các thiết bị di động. Đối với các ứng dụng server thì chúng ta thường triển khai trên các máy tính hoặc hệ thống cloud server, đối với các ứng dụng di động chúng ta sẽ triển khai lên các chợ ứng dụng như AppStore hay Google Play
  3. Vận hành: ở bước này chúng ta sẽ đi vào vận hành dự án, giám sát phần mềm đang hoạt động thông qua các công cụ để kịp thời phát hiện các sự cố có thể xảy ra

Nói chung những thứ này thì ai cũng đều biết. Và có một điều mọi người đều biết nữa là với nhiều công ty lâu đời, đang quản lý theo mô hình thác nước hoặc kiểu freestyle thì chúng ta thường có đội ngũ vận hành riêng và đội phát triển riêng.

Phát triển linh hoạt

Tuy nhiên trong thời đại ngày nay, với sự ra đời của văn hoá Agile (phát triển phầm mềm linh hoạt), nó đòi hỏi việc phát triển và triển khai liên tục và không ngừng trong suốt vòng đời của dự án thì việc chuyên môn hoá cần phải hạn chế ở mức tối đa, một người cần có khả năng làm được nhiều việc để backup lẫn nhau khi có vấn đề xảy ra. Điều này buộc những người làm vận hành phải biết thêm cả Dev nữa và chúng ta có DevOps (Development + Operations) Bản thân mình cũng đang làm trong một team Agile + Scrum với số lượng thành viên rất rất đông đảo, thêm vào nữa lại chạy theo mô hình microservice nên việc deploy diễn ra hàng giờ hàng ngày, cứ mỗi một lần merge Pull Request lại là một lần deploy nên mình ý thức rất rõ vai trò của DevOps trong quy trình phát triển phần mềm

DevOps làm gì?

Đọc nhiều tài liệu cũng mỏi mắt, cũng có cái đúng có cái chưa đúng, nên mình cứ theo kinh nghiệm thực tế của mình với Agile và Develops thôi nhé. DevOps về cơ bản vẫn là đội vận hành, nhưng giờ đây đội vận hành sẽ linh hoạt hơn và tham gia sâu hơn vào việc phát triển dự án với các công việc:

  1. Tham gia vào tư vấn thiết kế hệ thống: đầy là điều cực kỳ quan trọng. Với kinh nghiệm vận hành của mình các DevOps có thể đưa rất nhiều lời khuyên hữu ích để giúp các Dev tránh sa đà vào những thiết kế to lớn mà lại không hiệu quả
  2. Xây dựng CI/CD: xây dựng hệ thống tích hợp liên tục là điều tối quan trọng, mọi thứ phải được tự động hoá để giảm các thao tác không cần thiết, từ đó tiết kiệm được rất nhiều thời gian phát triển
  3. Hỗ trợ Dev tạo các file cấu hình: đương nhiên rồi, những file cấu hình của nginx hay kafka ... Dev không thể nào thạo bằng Ops được
  4. Vẽ sơ đồ triển khai: sơ đồ triển khai sẽ cho chúng ta biết hệ thống mạng của dự án sẽ như thế nào
  5. Vận hành và giám sát hệ thống: DevOps cần sử dụng các công cụ để vận hành và giám sát hệ thống, sử dụng kinh nghiệm của mình để phát hiện kịp thời các sự cố, rủi ro cũng như lỗ hổng của hệ thống
  6. Hỗ trợ Dev debug: Khi có lỗi xảy ra, sẽ cần phải hỗ trợ Dev xem log, kiểm tra các thông số kỹ thuật của hệ thống

Các kiến thức cần có

Với những đầu việc siêu to khổng lồ như trên thì DevOps cần có các kiến thức sau:

  1. Kiến trúc hệ thống (System Architecture): đây là điều quan trọng nhất, bạn không thể vận hành nổi một thứ mà bạn không hiểu đâu, tin tôi đi
  2. Mạng máy tính: Phải hiểu mạng máy tính thì mới cài đặt được hệ thống, càng hiểu sâu về mạng thì bạn sẽ càng có khả năng làm chủ được hệ thống hơn
  3. Kiến thức về các câu lệnh linux, windows: Vì thường các dự án sẽ được triển khai trên 2 môi trường này, nên bạn cần phải biết các câu lệnh thì mới có thể triển khai cũng như vận hành và giám sát hệ thống
  4. Kiến thức về hạ tầng mà công ty bạn đang sử dụng: ví dụ công ty bạn đang sử dụng AWS thì bạn cũng cần có kiến thức về nó thì mới có thể kiểm soát được hệ thống, nếu bạn chỉ hiểu mơ hồ, sẽ có lúc bạn sẽ gặp khó khăn.
  5. Kiến thức về các cộng cụ để làm CI/CD: Bạn cần có kiến thức ít nhất là Jenkin, Docker, gần đây có CircleCI, DroneCI hay các công cụ mặc định của Github và Gitlab
  6. Kiến thức về các nền tảng quản lý và đóng gói service như Kubernetes
  7. Kiến thức về các loại cơ sở dữ liệu: Cái này cũng rất quan trọng, vì cơ sở dữ liệu cũng là một trong những nguyên nhân chính gây ra các vấn đề tải hệ thống.
  8. Kiến thức về các công cụ để giám sát hệ thống như zabbix, ELK
  9. Một ít kiến thức về ngôn ngữ lập trình hay được sử dụng để làm công cụ (tool) như python, go hay bash script
  10. Kiến thức về các giao thức phổ biến như HTTP, Websocket để thuận tiện cho việc cấu hình LB

Các kỹ năng cần có

Về mặt kỹ thuật, một DevOps cần phải có:

  1. Kỹ năng cấu hình và sử dụng các công cụ trong dự án
  2. Kỹ năng sử dụng Git, SVN
  3. Kỹ năng sử dụng các câu lệnh bash, đặc biệt là câu lệnh grep
  4. Kỹ năng phát triển công cụ, phần mềm và hệ thống để phục vụ chính cho nhu cầu của mình
  5. Kỹ năng tìm kiếm: đương nhiên rồi, vì chúng ta không phải là người tạo ra tất cả các công cụ hay hệ điều hành, nên kỹ năng tìm kiếm theo các keyword để tìm câu trả lời là cực kỳ quan trọng
  6. Kỹ năng ghi nhớ các lỗi đã từng gặp hoặc từng xảy ra để tiết kiệm thời gian cho lần kế tiếp

Về kỹ năng mềm, một DevOps cần phải có:

  1. Kỹ năng làm việc nhóm
  2. Kỹ năng tổ chức và ghi nhớ công việc: nếu bạn không có khả năng ghi nhớ danh sách các server hãy cân nhắc khi chọn nghề này, :)
  3. Kỹ năng lắng nghe và bình tĩnh giải quyết vấn đề
  4. Làm nghề này bạn phải thật sự mát tính vì bạn sẽ phải giao tiếp và hỗ trợ Dev rất nhiều. Nếu bạn là người nóng tính và dễ cáu gắt, mình khuyên chân thành bạn hãy chọn nghề khác phù hợp hơn.

DevOps quá vất vả

Cá nhân mình thấy các DevOps quá vất vả, chịu rất nhiều áp lực. Dev thì cũng có nhiều level của Dev, hệ thống thì cũng có ti tỉ loại hệ thống từ mono cho đến micro services, các Dev cứ vẽ ra nhưng rồi người phải đi vận hành lại chính là các DevOps, trong khi từ đầu các DevOps có tư vấn thì chắc gì anh em Dev đã nghe. Dự án anh em code tốt, tổ chức log tốt thì không sao, dự án nào mà tổ chức kém, log tùm lum, cứ WARN với ERROR là các DevOps tha hồ mà nhận báo thức. Chính vì những lý do này mà mình không thích DevOps, mình rất rất tôn trọng những anh em nào làm DevOps và luôn trong tâm thế sẵn sàng san sẻ công việc. Mình hy vọng tất cả anh em Dev chúng ta cũng sẽ đều như vậy, :)

Bạn đã nghĩ kỹ chưa?

Dù DevOps có vất vả cỡ nào nhưng nó vẫn là một trong những lĩnh vực vô cùng hấp dẫn với khối lượng kiến thức siêu to khổng lồ. Vì đứng giữa một dàn máy tính với đủ các thể loại màn hình cho chúng ta cảm giác chúng ta đang là một nhạc trưởng trong dàn nhạc giao hưởng vậy, thực sự thú vị và có cảm giác vĩ đại ở đây, :). Nhưng bạn sẽ phải nai lưng ra cày ải kiến thức, sẽ có nhiều đêm thức trắng và phải làm bạn với bò húc, monster, bạn đã nghĩ kỹ chưa?

Tham khảo

  1. Wiki
  2. Agile
  3. CI/CD
  4. Zabbix
  5. ELK