DevOps là gì? DevOps là một văn hóa làm việc đề cao sự hợp tác, kéo hai giai đoạn phát triển (development) và vận hành (operations) xích lại gần nhau hơn. DevOps cần học nhiều một số ngôn ngữ lập trình cần thiết như: Python, Ruby, Lua Scripting và cả một số tool tùy theo yêu cầu công việc cụ thể.
Nhằm “giải mã” DevOps là gì, công việc của DevOps là gì và DevOps Engineer cần thành thạo những kỹ năng gì, ITviec đã có buổi phỏng vấn với hai DevOps nhiều năm kinh nghiệm:
Chu trình phát triển phần mềm (Software Development Life Cycle) bao gồm hai giai đoạn chính: phát triển và vận hành. Hai giai đoạn này tương đối tách rời nhau, đặc biệt là ở các công ty có quy mô trung bình trở lên.
Tuy nhiên, nhằm tối ưu hóa chu trình phát triển phần mềm, giúp sản phẩm IT được release nhanh và thường xuyên hơn, khái niệm DevOps ra đời.
DevOps là tên gọi mới, là sự kế thừa và phát triển của một quan niệm về phát triển phần mềm đã tồn tại từ khá lâu.
DevOps là sự kết hợp của từ Development (phát triển tính năng sản phẩm) + Operations (vận hành):
<
DevOps là Development (phát triển tính năng sản phẩm) + Operations (vận hành)
Để cho dễ hình dung, và cũng để trả lời rõ hơn cho câu hỏi “DevOps là gì”, ta cần ngược trở lại lịch sử ngành phần mềm một chút:
Quy trình phát triển phần mềm không hề có sự phân tách rạch ròi giữa hai giai đoạn phát triển (development) và vận hành (operations), nhất là đối với các sản phẩm vừa và nhỏ. Vì là người phát triển sản phẩm, Developer sẽ hiểu rõ về sản phẩm để chọn cách vận hành phù hợp nhất nên anh ta sẽ đảm nhiệm việc develop, đồng thời cũng kiêm luôn việc test, deploy sản phẩm.
Từ đó, kéo theo quy mô hệ thống phình ra theo cấp số nhân. Từ một vài server, hệ thống có thể phát triển lên đến hàng chục, hàng trăm, hàng nghìn, hoặc thậm chí hàng triệu server (ví dụ như trường hợp của Google, Facebook).
Yêu cầu chuyên môn hóa trở nên gắt gao, khiến quy trình phát triển phần mềm chia tách thành những giai đoạn riêng biệt. Đây là giai đoạn mà Dev và Ops tách bạch.
Khoảng một thập kỉ trở lại đây, trước nhu cầu phát triển và cải tiến sản phẩm liên tục để đáp ứng thị trường, sự chia tách này lại bộc lộ những nhược điểm rõ rệt.
Ngoài ra, ngành phát triển phần mềm cũng dịch chuyển theo một hướng khác – microservices.
Microservices: Một sản phẩm lớn được chia tách làm rất nhiều service nhỏ, các service này liên kết với nhau tạo thành một sản phẩm hoàn chỉnh.
Ví dụ, đối với người dùng, một trang web thương mại điện tử là một sản phẩm hoàn chỉnh. Nhưng trên thực tế, trang web này được gộp lại từ rất nhiều feature như đăng kí, đăng nhập, tìm kiếm.v.v… Mỗi feature này là một service riêng, có thể sử dụng ngôn ngữ lập trình và database riêng.
Khi được hỏi “Lợi ích của DevOps là gì?”, anh Minh Tấn chia sẻ, “Cùng với phương pháp Agile, DevOps giúp hoàn thiện việc chuyển đổi quy trình phát triển và vận hành phần mềm từ mô hình thác nước (waterfall) sang mô hình phát triển/phát hành liên tục (continuous development/releases)”.
Ngoài ra, những lợi ích chính của DevOps là:
Tất cả đều phục vụ cho mục đích cuối cùng là cải thiện khả năng cung cấp dịch vụ IT một cách nhanh chóng. Từ đó, tăng khả năng cạnh tranh của sản phẩm/doanh nghiệp.
Theo anh Đăng Phong, DevOps Engineer là sự kết hợp theo công thức:
DevOps Engineer = Tư tưởng mới + Công cụ mới + Kỹ năng mới
Anh diễn giải thêm, nếu ta hiểu được DevOps là gì – Là một văn hóa làm việc mới, một phương thức tiếp cận để thu hẹp khoảng cách giữa quá trình phát triển và vận hành phần mềm thì ta sẽ hiểu được DevOps Engineer là một vị trí nảy sinh do nhu cầu thực tiễn công việc, có thể tạm định nghĩa gồm tư tưởng, công cụ và kĩ năng mới.
Vậy công việc của một người làm DevOps là gì?
Anh Đăng Phong chia sẻ, dựa trên công thức trên, ta có:
1. Tư tưởng mới:
Tư tưởng mới ở đây chính là DevOps Engineer cần cần đặt lợi ích doanh nghiệp, lợi ích sản phẩm lên hàng đầu, đồng thời thấy rằng toàn bộ các team thực chất là cùng một “phe”, cùng chia sẻ lợi ích cũng như rủi ro.
Vậy thì, người làm DevOps Engineer là phải có tư tưởng – mindset đúng đầu tiên.
Trong hầu hết các công ty/dự án phần mềm, đội ngũ phát triển và vận hành bị chia tách thành nhiều team làm việc tương đối độc lập với nhau: Developer, Tester, Sysadmin.v.v… Cũng từ đó, kiểu tư duy “chúng ta” – “chúng nó” hình thành, tạo nên nhiều xung đột không đáng có, gây ảnh hưởng xấu đến doanh nghiệp/sản phẩm.
Thay vì đợi team Dev phát triển xong sản phẩm, rồi team Ops mới tham gia vận hành như trước kia. Thì nay, DevOps Engineer nên tham gia ngay từ đầu với đội ngũ phát triển. Nhằm:
Khi deploy code, nếu gặp vấn đề ở chỗ nào, DevOps Engineer sẽ có thể chủ động tìm lỗi và fix luôn mà không cần phải chờ developer.
2. Công cụ mới:
Nhiệm vụ quan trọng của DevOps Engineer là tự động hóa hệ thống. Cũng nghĩa là, DevOps Engineer cần liên tục tìm hiểu, chọn, và sử dụng các công cụ mới, hoặc thậm chí tự phát triển các automation tool cho công ty. Ví dụ:
3. Kỹ năng mới:
Nhìn chung, công việc chính của DevOps Engineer rất gần với công việc của Sysadmin, bao gồm: deploy, optimizing, monitoring, analysis… Điểm khác biệt là:
Cho nên, nếu coi DevOps Engineer là Sysadmin “kiểu mới” thì cũng không sai.
Tuy nhiên, Sysadmin “kiểu cũ” rất lười code. Nhưng trong bối cảnh hiện nay, để tiếp tục theo đuổi ngành System thì họ cần phải biết automation.
Cũng có nghĩa, họ cần rèn luyện kỹ năng coding, scripting, và thậm chí học cả những ngôn ngữ lập trình mới theo công nghệ/stack mà nhóm phát triển sản phẩm sử dụng.
Dựa trên những chia sẻ của anh Minh Tấn và Đăng Phong, một DevOps muốn thành công cần phải sở hữu những kỹ năng và tố chất sau:
Anh Minh Tấn chia sẻ rằng DevOps Engineer thường là vị trí kiêm nhiệm (Developer kiêm nhiệm thêm phần việc operations, hoặc là System Engineer kiêm nhiệm thêm một phần việc của dev, v.v…) chính vì thế một DevOps cần phải có kỹ năng lập trình cứng.
Ví dụ, Tấn là System Engineer kiêm DevOps Engineer. Tấn muốn deploy version mới của sản phẩm lên 100 server. Nếu thực hiện việc này thủ công thì sẽ mất rất nhiều thời gian, và không tránh khỏi sai sót.
Trong trường hợp deploy thành công 50 con server, còn 50 con thất bại, thì cũng có nghĩa là sản phẩm của mình thất bại. Bởi vì cùng lúc sản phẩm sẽ chạy 2 version khác nhau, mà mình lại không kiểm soát 2 version này được. Muốn khắc phục thì cũng phải có thời gian.
Như vậy, để deploy nhanh hơn, hỗ trợ việc back-up, restore, đồng thời giảm thiểu rủi ro, thì với vai trò DevOps Engineer, Tấn sẽ viết automated script để ship code tự động lên server.
Ngôn ngữ lập trình phổ biến cho DevOps Engineer là Python, shell script.
Ngoài ra, để Ops, DevOps Engineer cũng cần hiểu sâu, thông thạo về hệ điều hành đang sử dụng (Linux, Docker.v.v…)
Đặc biệt, người làm DevOps phải có khả năng research tốt để nhanh chóng tìm ra giải pháp, xử lý tình huống.
Anh Tấn đưa ra một ví dụ vô cùng trực quan, dễ hiểu:
Tấn triển khai services trên nền tảng on premise. Một ngày “đẹp trời” nào đó, hệ thống gặp vấn đề, Tấn muốn move toàn bộ sản phẩm của mình lên cloud. Tuy nhiên, có rất nhiều cloud, nên chọn dùng cloud nào cho phù hợp?
Rõ ràng, trong tình huống này, nếu khả năng research không tốt, không nhanh chóng tìm ra cách để move toàn bộ mọi thứ đang chứa trên on premise lên cloud, thì sản phẩm của mình bị đình trệ rồi.
Hoặc, trong DevOps có rất nhiều bài toán hóc búa liên quan đến phần network, I/O, infra system .v.v… Một anh cứng về develop nhưng không hiểu sâu về phía Infra thì khi làm DevOps sẽ gặp rất nhiều khó khăn. Anh ta buộc phải research về Infra để phục vụ cho công việc.
Theo anh Tấn, DevOps Engineer thường sẽ đảm nhiệm những công việc như migrate data cho công ty nên họ cần đề cao sự tỉ mỉ. Khi đó, chỉ cần xảy ra một sai sót nhỏ, ví dụ như sai 1 IP server, thì sẽ gây ảnh hưởng đến toàn hệ thống.
Đây là tiêu chí quan trọng nhất, theo anh Đăng Phong, vì DevOps sinh ra là để giải quyết mâu thuẫn.
Tiêu chí này thể hiện qua những việc rất nhỏ nhặt cụ thể. Ví dụ như cách DevOps Engineer suy nghĩ, tổ chức, cấu trúc code/thư mục như thế nào, chia sẻ những best practices,… để mọi người có thể cùng nhau đọc và hiểu code đó, cùng tham gia được với mình.
Mâu thuẫn giữa nhóm phát triển và vận hành thường nảy sinh từ sự khác biệt về góc nhìn. Cho nên, anh Phong khẳng định rằng DevOps Engineer là người cần nhìn nhận mọi thứ từ nhiều khía cạnh, để khách quan, sáng suốt hơn, biết “thông cảm” hơn.
Cụ thể, khi deploy mà code không chạy, thì DevOps Engineer cần xem xét kĩ: vấn đề nằm ở phía code hay phía môi trường.
Ví dụ, trường hợp làm với Laravel (PHP Framework), file config là .env. Sysadmin không có kinh nghiệm thì dễ mắc sai lầm là chỉ lấy phần code đó xuống và chạy và lỗi thì loay hoay và thường nghĩ do code.
Trong khi, lẽ ra cần phải hiểu những cấu hình liên quan đến môi trường và cách thức hoạt động của Laravel, và phải tác động vào file .env trước đã.
Trong công việc, mối quan hệ tốt thì cái gì cũng dễ dàng, và ngược lại.
Để xây dựng mối quan hệ tốt, anh Phong nghĩ nên gạt chức danh lead/manager gì gì đó qua một bên, để giao tiếp với họ như là bạn bè bình đẳng.
Bạn tôn trọng họ, thì họ cũng sẽ tôn trọng, dễ dàng chia sẻ với bạn hơn. Mà khi xảy ra chuyện, cần nhờ vả thì họ cũng dễ dàng đồng ý hơn.
Ngoài ra, một DevOps Engineer cũng cần có:
Anh Đăng Phong nhấn mạnh rằng DevOps trước hết là vấn đề mindset, nên bạn cần phải “đả thông tư tưởng” trước đã. Bạn có thể tìm hiểu “DevOps là gì” từ sách báo, qua các trao đổi trên diễn đàn, v.v…
Bạn cũng cần học một số ngôn ngữ lập trình cần thiết cho DevOps như: Python, Ruby, Lua Scripting.
Tiếp đến, bạn có thể lên các trang web tuyển dụng để đọc mô tả công việc của DevOps. Từ đó, bạn sẽ biết thị trường đang cần những kĩ năng gì, xu hướng dùng những tools gì.
Anh Đăng Phong và Minh Tấn đề xuất một số nguồn tài liệu DevOps sau:
Anh Minh Tấn vui vẻ chia sẻ về những sai lầm mà anh đã từng gặp phải khi làm DevOps và bài học anh rút ra được. Anh còn giỡn vui “Sai lầm thì nhiều lắm, Tấn húc đầu vào tường hoài chứ gì. Có lần còn “trót dại” húc suýt bể đầu luôn (cười)”.
Để rút ra được bài học này, anh Tấn đã phải “nếm” phải sai lầm và trả giá đắt. Chỉ là sai sót nhỏ trong một dòng code, đã ảnh hưởng nghiêm trọng đến toàn bộ workflow sản phẩm. Sau đó, cả team anh, gồm 7 người, đã phải cày cật lực 10 ngày để khắc phục hậu quả.
Đợt ấy, team Tấn (ở công ty cũ) phụ trách migrate data sản phẩm, cụ thể là shipping data bằng automated tool.
Do chủ quan “code nhà mình” thì chắc “ngon lành cành đào” rồi, nên Tấn review không thật sự kĩ lưỡng. Tấn cũng chỉ test một phần (chứ không phải toàn bộ) trên môi trường staging – server test mà thôi.
Đến lúc đẩy code lên môi trường production thì, bùm, sự cố xảy ra!
Đại khái là sản phẩm lúc đó có tình trạng 2-3 user sử dụng 2-3 số điện thoại riêng biệt để đăng kí dùng chung 1 ID account. Khi những user này đăng nhập thành công, họ đều được redirect đến cùng 1 account.
Sự cố đã ảnh hưởng nghiêm trọng đến chuyện thanh toán tiền bạc của những ID account dùng chung, cũng như toàn bộ workflow của sản phẩm.
Từ sự cố kể trên, Tấn rút ra “bài học nhớ đời” là phải cực kì cẩn trọng, tuân thủ nghiêm ngặt quy trình QA QC trước khi release.
Trong lúc làm việc, bạn cần phải giữ bình tĩnh trong mọi tình huống, vì cuống lên cũng không giải quyết được gì, mà chỉ thêm rối.
Có lần anh em team mình ở lại văn phòng làm việc khuya. Đến khoảng 3 giờ sáng thì xảy ra sự cố. Cả team vừa mệt vừa hoảng, nên cứ cuống lên rồi bị cuốn theo cái “hố đen” sự cố đến tận ngày hôm sau. Nếu bình tĩnh hơn, có lẽ bọn mình đã nhìn ra được giải pháp tốt nhất để xử lý tình huống ngay lúc đó.
Khi sản phẩm bị bug trên production, thì người chịu trách nhiệm về những tính năng đó đang rất áp lực. Lúc này, nếu leader chỉ biết la lối, làm căng lên thì bạn đó sẽ không còn tinh thần để tiếp tục làm việc/giải quyết vấn đề.
Một leader tốt cần giữ bình tĩnh để trấn tĩnh tinh thần anh em, đồng thời phải cùng lao vào giải quyết vấn đề, chứ không phải chỉ đứng đằng sau chỉ trỏ.
Nguồn: ITviet.com