Giải ngố về môi trường (environment) – Một khái niệm/kĩ thuật cực hữu ích trong ngành lập trình

Chém gió nhiều rồi nên hôm nay Code Dạo quay lại viết bài về kĩ thuật nhe.

Môi trường (environment) là một khái niệm/kĩ thuật khá hay mà 69.69% các công ty phần mềm đều sử dụng (và 96.69% sinh viên không hề biết gì về nó).

Khái niệm này giúp chúng ta có thể test/tìm bug/thêm tính năng mà sợ gây ảnh hưởng đến hệ thống đang hoạt động .

Đa phần đi làm cỡ 6 tháng/1 năm thì các bạn sẽ biết sơ về biết khái niệm này rồi! Do vậy, trong bài, mình chỉ giới thiệu lại, giải thích rõ hơn, và hướng dẫn cách phân chia environment cho đúng thôi nha.

Môi trường là cái chi chi?

Nói 1 cách đơn giản, môi trường là một tập hợp phần cứng + phần mềm + dữ liệu + configuration để một ứng dụng có thể hoạt động.

Giả sử mình muốn làm một trang web bán hàng bằng PHP, sử dụng LAMP Stack. Lúc này, môi trường của web bán hàng đó sẽ bao gồm:

  • Phần cứng: Web server Linux chứa source code của ứng dụng. Database Server để chứa dữ liệu
  • Phần mềm: Linux, Apache, PHP được cài trên web server. MySQL cài trên Database Server. Phần mềm còn bao gồm PHP Plugin, Database Plugin
  • Code của ứng dụng (Đã compile hoặc chưa compile): Không có thì làm sao mà chạy
  • Dữ liệu: Database phải có dữ liệu về danh mục sản phầm, account admin v…v thì mới hoạt động được.
  • Configuration: Một số thiết lập như IP, username và password của database server, thời gian sống của Cookie v…v
nodeJS enviroment
Môi trường của 1 ứng dụng là tổng hợp của rất nhiều thứ

Với các bạn sinh viên đang học, hầu như các bạn không cần dùng môi trường. Các bạn dùng máy bàn/laptop mình làm phần cứng, cài hết đủ thứ phần mềm và DB lên máy, lưu dữ liệu trong local Database, lưu configuration thẳng trong source code luôn.

Cách này dùng để làm bài tập, làm demo đồ án thì không sao. Tuy nhiên, khi muốn đưa ứng dụng lên host, tự cài đặt máy chủ, đưa source lên cho người khác xài, các bạn sẽ mất rất nhiều thời gian để cài đặt đủ thứ/thiết lập môi trường để chạy được app của bạn.

Các công ty thường thiết lập môi trường như thế nào?

Vào ngày đầu đi làm, công ty sẽ dành cho bạn tầm 1-2 buổi để cài đặt IDE/môi trường cần thiết để code. Đa phần các công ty thường sử dụng 3-4 môi trường như sau:

  • Local Environment: Đây là môi trường local, chỉ nằm trên máy của 1 developer (giống như thời bạn đi học ấy). Vì toàn bộ database/code đều nằm trong máy nên bạn tha hồ nghịch mà không ảnh hưởng tới ai.
    • Chỉ mình bạn access được môi trường này.
  • Staging/QA Environment: Đây là môi trường chung của team developer. Khi code của bạn được merge vào branch chính, code sẽ được deploy lên môi trường này.
    • Thường thường ta dùng môi trường này để test xem code của mình tích hợp với code của người khác có chạy đúng không.
    • Developer và Product Manager/BA/Tester có thể access môi trường này để test, confirm chức năng đã code đúng chưa.
    • Nếu code trên Staging/QA chạy ok, ta sẽ deploy nó lên môi trường Production
  • Production Environment: Đây là môi trường “thần thánh”, chứa ứng dụng thật đang chạy, với người dùng thật, dữ liệu thật. Do đó, người ta thường test kĩ trên Staging/QA trước khi deploy lên môi trường này.
    • Access tới môi trường này được bảo vệ rất kĩ. Hầu như chỉ các anh DBA, DevOps, Sysadmin, Dev thân tín mới có thể truy cập vào. Đơn giản vì nó là sản phẩm đang chạy, đụng phát nó hỏng hoặc bị chôm mất dữ liệu là thiệt hại sẽ rất nhiều.

Code của bạn chỉ thật sự được người dùng sử dụng khi nó lên môi trường Production. Thuật ngữ code release hay lên Production là bắt nguồn từ đó.

Khi đi làm, hầu như các bạn sẽ sử dụng Local và Staging là chính:

  • Code và test đã đời trên local, đảm bảo không có bug
  • Sau khi code đã được merge và deploy trên staging, tiếp tục test và confirm với Product Manager/BA, đợi tester test

Một điều khá thú vị lẫn … bực mình là: nhiều khi dữ liệu/configuration trên Production khác trên Staging và Local. Vì thế, khi người dùng báo bug trên Production, ta tìm mọi cách mà vẫn không replicate được trên Staging (và ngược lại).

Thiết lập môi trường thế nào cho đúng?

Thông thường, việc thiết lập môi trường local/staging/production sẽ do CTO/Technical Leader/SysAdmin/DevOps thực hiện. Developer của tụi mình chỉ việc làm theo và xài thôi.

Thiết lập môi trường thế như thế nào cho chuẩn còn phụ thuộc vào nhiều yếu tố. Theo mình, một số điều nên lưu ý là:

  • Cài đặt nhanh và dễ: Việc thiết lập môi trường local nên càng nhanh càng dễ càng tốt. Tốt nhất là chỉ chạy 1 script hoặc 1 click thôi.
    • Có công ty mình phải cài nguyên nửa buổi từ MS SQL tới Memcache tới NGinx đủ thứ, có công ty mình chỉ cần chạy script 30p là xong
  • Đồng bộ: Đồng bộ về phần mềm tức là Staging dùng phần mềm A bản 1.2.1, B bản 2.1.2 thì Production cũng nên y chang vậy. Đồng bộ về phần cứng tức là các môi trường nên dùng server với cấu hình giống nhau
    • Điều này khá khó, vì môi trường Production thường dùng nhiều server hơn/server nhanh hơn do có nhiều người dùng hơn.
    • Việc đồng bộ giúp chúng ta dễ fix bug, đo đạc optimize code tiện hơn
    • Data cũng nên được đồng bộ. Tuy nhiên, nếu data chứa dữ liệu nhạy cảm (email, điện thoại, password khách hàng) thì nên xóa/mask/chỉnh sửa trước khi sync vào môi trường staging/local
  • Dùng chung code, khác configuration: Configuration như IP của database, API Key, AppID nên chứa thành file riêng (.env, .json, .config). Các môi trường nên dùng code giống nhau, chỉ khác config thôi.
  • Phân quyền rõ ràng: Nên giới hạn access tới môi trường Production, chỉ người có nghĩa vụ mới được access.
    • Hôm trước trên Reddit có vụ thanh niên intern mới vào, lỡ chạy code làm mất sạch data trên Productionbị đuổi việc.
    • Ai cũng đồng ý đây là lỗi của thằng CTO chứ không phải intern đó, vì để access vào database Production hớ hênh vậy!
Khuôn mặt của dev khi thấy dữ liệu người dùng … mất sạch

Tạm kết

Túm lại, việc setup môi trường thế nào còn phụ thuộc vào nhiều yếu tố: công nghệ sử dụng, trình độ của team, đặc thù của dự án.

Ở công ty của bạn các môi trường được setup thế nào, có staging và QA gì không, hay chỉ … bùm phát từ local rồi deploy lên Production luôn =)).

Phù, lâu rồi mới viết lại bài technical kiểu này. Nếu các thấy hứng thú về các kĩ thuật mà đi học không có những đi làm sử dụng nhiều thì cứ comment phía dưới nha. Nhiều bạn quan tâm mình sẽ viết thêm hihi.

13 thoughts on “Giải ngố về môi trường (environment) – Một khái niệm/kĩ thuật cực hữu ích trong ngành lập trình”

  1. Cảm ơn a đã chia sẻ. Em mới đi làm được vài tháng cũng chưa hiểu hết về mấy vấn đề như thế này. Mong a ra nhiều post về technical nữa ạ!

    Liked by 1 person

  2. Cảm ơn bài viết của bạn. Mình tuy không phải dân IT nhưng có cơ hội được làm việc trong một dự án chuyển đổi hệ thống SAP giữa hai công ty mua bán sát nhập nên cũng có biết chút chút về các khái niệm này.

    Like

  3. Anh giải thích những khái niệm như synchronized, synchronous và asynchronous đi anh. Em vẫn bị mông lung giữa các khái niệm này

    Like

  4. Bài viết rất bổ ích, mình đã theo dõi blog của bạn từ lúc chưa đi làm cho đến khi đi làm rồi vẫn giành thời gian ghé blog bạn đều đặn hàng tuần =)), hy vọng Hoàng tiếp tục ra những bài viết bổ ích như thế này

    Liked by 1 person

  5. Cảm ơn anh đã viết bài kĩ thuật về môi trường. Mong những bài viết thực như vậy cho sinh viên.

    Like

  6. Bài viết này giúp mình bổ sung thêm kiến thức, vì đi làm không phải công ty nào cũng có đầy đủ các environment như vậy.

    Like

Leave a comment