1 Data Engineer làm gì

Xem bài viết tổng quan về Data Engineer cũng như các data roles khác tại đây: https://datatute.vn/courses/data-industry-overview/

2 Các kiến thức nền tảng cần có

  • Ngôn ngữ: SQL và Python.

    SQL được phát triển từ những năm 1970s và đã tồn tại qua nhiều thập kỷ, đến nay vẫn chứng minh được tầm quan trọng của nó, nên các bạn không phải lăn tăn gì về việc học SQL cả. Biết sử dụng SQL là bắt buộc với bất kỳ ai học và làm data chứ không chỉ riêng DE. SQL giúp DE truy vấn và biến đổi dữ liệu, và là ngôn ngữ đóng vai trò trung tâm trong data modelling và data analytics.

    Python là ngôn ngữ lập trình phổ biến nhất trong ngành data với rất nhiều thư viện mạnh mẽ và một cộng đồng người sử dụng cực lớn. Đối với DE, Python được dùng rất phổ biến, từ việc gọi các API endpoints để trích xuất dữ liệu (VD: thư viện “requests”) hoặc cào dữ liệu từ website (VD: thư viện “Beautiful Soup”), biến đổi, xử lý và kiểm tra dữ liệu (VD: thư viện “pandas”), visualise dữ liệu (VD: thư viện “matplotlib”, “seaborn”), cho đến thiết lập và điều phối các luồng ETL chạy tự động (VD: viết các DAGs trong Apache Airflow).

  • Cơ sở dữ liệu quan hệ: Các cơ sở dữ liệu quan hệ như MySQL, Microsoft SQL Server, Oracle, … được sử dụng rộng rãi để lưu trữ dữ liệu của doanh nghiệp. Vì vậy, có kiến thức về các cơ sở dữ liệu này gần như là điều bắt buộc để giúp DE biết cách tìm kiếm và trích xuất dữ liệu, xử lý dữ liệu, thiết kế các mô hình dữ liệu phù hợp, tối ưu hiệu suất của các data pipeline, kiểm soát chất lượng dữ liệu, …

  • Nắm được data engineering lifecycle: Để tạo được các data pipeline tốt thì ta cần có cái nhìn tổng quan về các bước trong vòng đời của dữ liệu, nhìn từ góc độ của một data engineer, gọi là data engineering lifecycle. Về cơ bản thì data engineering lifecycle là những giai đoạn mà dữ liệu trải qua mà người data engineer có tác động đến, từ khi được khởi tạo, thường là từ một hệ thống nguồn nào đó, rồi được luân chuyển qua các nơi khác nhau và được biến đổi trong quá trình luân chuyển đó, rồi kết thúc, được tiêu thụ tại các báo cáo, các phân tích, hoặc các ứng dụng nào đó. Cũng có khi dữ liệu từ điểm cuối lại được đưa quay trở lại nguồn (Reverse ETL).

  • Biết cách tạo các data pipeline đáng tin cậy: Công việc chính hàng ngày của DE là xây dựng, theo dõi và quản lý các data pipeline, nên việc biết xây dựng một các data pipeline đáng tin cậy là rất quan trọng.

  • Công cụ: Hiện nay có rất nhiều công nghệ và công cụ khác nhau trên thị trường, vì vậy việc biết được hết tất cả các công cụ đó là không thể. Một DE nên tập trung học các công cụ mà được sử dụng rộng rãi, qua đó nắm bắt được các kiến thức nền tảng mà có thể áp dụng được cho nhiều công cụ khác cùng loại, đặc biệt là các nguyên tắc trong data engineering. Ví dụ:

    • Cơ sở dữ liệu quan hệ: chọn, làm quen và sử dụng 1 hệ quản trị cơ sở dữ liệu quan hệ phổ biến (ví dụ Microsoft SQL Server hoặc MySQL) và nắm vững các khái niệm cơ bản như: schema, table, view, stored procedure, function, table constrains, index, … Các khái niệm này tuy có thể khác nhau đôi chút giữa các hệ quản trị cơ sở dữ liệu, nhưng nhìn chung đều dựa trên những nguyên lý cơ bản và có cách hoạt động rất giống nhau.

    • ETL workflow orchestration tools: Đây là các công cụ giúp DE thiết lập các data pipeline, bao gồm sắp xếp và điều phối code (code nào chạy trước, code nào chạy sau, code nào phụ thuộc vào code nào, …), lên lịch chạy tự động cho pipeline, khai báo và quản lý các biến được truyền vào pipeline, quản lý việc chạy pipeline, … Bạn có thể chọn học Apache Airflow, một orchestration tool mã nguồn mở và được sử dụng phổ biến.

    • API related tools: Nếu bạn làm việc nhiều với API thì việc học cách sử dụng một công cụ hỗ trợ khi làm việc với API là cần thiết. Bạn có thể lựa chọn học Postman, qua đó nắm vững các khái niệm về API như API là gì, các loại công nghệ API, các thành phần của REST API, các HTTP methods, status codes, API authentication và authorisation, …

    • Git: Git là một một hệ thống quản lý phiên bản mã nguồn mở theo hướng phân tán (Distributed Version Control Systems) dùng để theo dõi và quản lý các thay đổi trong source code. Git giúp nhiều người có thể cùng làm việc đồng thời trên codebase (codebase nghĩa là bộ code của một project hay ứng dụng nào đó), theo dõi lịch sử thay đổi code, và phối hợp viết code cùng nhau thông qua các cơ chế như “branch”, “pull request”, … DE cần lưu ý các khái niệm căn bản và quan trọng của Git như Repositories (local repo, remote repo), branching, merging, staging area, commits, conflict resolution, … cũng như các lệnh git thông dụng.

  • Các nguyên tắc quan trọng trong lập trình (software engineering principles) và các khái niệm quan trọng trong Object Oriented Programming (OOP) và Functional Programming (FP): Vì ngày nay DE sử dụng Python rất nhiều, mà Python là một ngôn ngữ lập trình nên DE cần nắm vững các nguyên tắc quan trọng trong lập trình để viết code sao cho chính xác, dễ maintain (dễ hiểu, dễ kiểm thử, dễ sửa), và có khả năng mở rộng được (scalable). Ví dụ: nguyên tắc seperations of concerns, nguyên tắc DRY (don’t repeat yourself), nguyên tắc SOLID trong object oriented programming, … Python có thể được sử dụng theo cả OOP lẫn FP nên ta cũng cần nắm được các khái niệm cơ bản của từng phương thức lập trình này (ví dụ các khái niệm như Class, Object, Encapsulation, Inheritance, Polymorphism, … trong OOP, hay các khái niệm như First-Class Functions, Higher-Order Functions, … trong FP). Cũng trong mảng kiến thức này, nếu hiểu và biết cách vận dụng một số Design Patterns phổ biến và các practice về testing thì cũng sẽ rất tốt.

  • Data Modelling: là việc thiết kế cách lưu trữ, tổ chức dữ liệu và cách mà dữ liệu liên kết với nhau. Để tạo ra được data model (mô hình dữ liệu) tốt thì DE phải hiểu các yêu cầu kinh doanh, vận hành của doanh nghiệp. Tuy rằng việc tạo mô hình dữ liệu không phải lúc nào cũng do DE hoàn toàn đảm nhiệm mà tuỳ vào cơ cấu tổ chức trong data team của mỗi doanh nghiệm (có thể sẽ có Data Modeller hoặc Data Architect đảm nhiệm việc này, có thể sẽ có Business Analyst hỗ trợ thêm trong quá trình thu thập yêu cầu, tìm hiểu quy trình kinh doanh và tạo data model, …), nhưng có hiểu biết cơ bản về data modelling chắc chắn sẽ giúp DE rất nhiều trong công việc của mình. Có nhiều cách tiếp cận và kĩ thuật về data modelling, tuy nhiên trong phạm vi hiểu biết của mình, có những khái niệm quan tọng sau mà một DE cần nắm được:

    • Hiểu về entities, attributes, và relationships giữa các entitities và attributes

    • Normalisation (1NF -> 3NF)

    • Hiểu tác động của modelling lên việc viết SQL query và tạo/sử dụng index

    • Cách design của một OLTP system điển hình sử dụng 3NF, qua đó hiểu về hạn chế dữ liệu trùng lặp (minimise redundency), đảm bảo tính toàn vẹn của dữ liệu (data integrity), … và các đặc tính của một database tốt phục vụ cho transactional system như ACID Compliance, High throughput & low latency, concurrency control, … Các transactional system là nguồn dữ liệu đầu vào phổ biến cho các data pipeline, vì vậy DE cần có hiểu biết nhất định về chúng.

    • Dimensional Modelling (by Ralph Kimball), trong đó cần nắm vững các khái niệm như star schema (phân biệt với snowflake schema), fact table, dimension table, slowly changing dimension (SCD), … Dimensional modelling là cách thức phổ biến thường được dùng cho tầng phân tích dữ liệu (một usecase thông thường là DE sẽ load data từ một hệ thống nguồn dạng transactional system rồi sau đó biến đổi, tổ chức lại thành các bảng fact và dim được lưu trữ trong Data warehouse theo dimensional modelling).

    • Một số công cụ hỗ trợ cho data modelling có thể kể đến như dbdiagram.io, Lucidchart, …

  • Kiến thức về các sản phẩm và hoạt động kinh doanh của doanh nghiệp: để vượt lên trên level junior và tạo được ảnh hưởng lớn hơn từ công việc của mình thì DE cần hiểu rõ về các sản phẩm, dịch vụ và hoạt động kinh doanh của doanh nghiệp mình đang làm việc, và hiểu các dữ liệu mà mình đang quản lý giúp ích được gì cho các sản phẩm, dịch vụ và hoạt động kinh doanh đó. Hiểu được điều này sẽ giúp DE đưa ra các quyết định về kiến trúc, công nghệ, về mô hình dữ liệu và cách ETL dữ liệu sao cho phù hợp nhất.

3 Một số mảng kiến thức về kĩ thuật khác

Data Engineering là một lĩnh vực rất rộng và tuỳ vào tính chất công việc và cách tổ chức đội nhóm tại mỗi doanh nghiệm mà một DE sẽ có thể cần bổ sung thêm các mảng kiến thức sau đây:

  • Quản lý và tối ưu cơ sở dữ liệu (database management and optimisation): DE làm việc với database, nên việc có kiến thức về database là cần thiết. Ngoài những điểm đã nêu ở phần data modelling bên trên, DE sẽ cần biết được thêm các kiến thức liên quan đến indexing, query optimisation, backup và recover database, các kiến thức về security và access control, theo dõi performance của database, … Ta cũng cần lưu ý rằng DE có thể sẽ không phải biết nhiều và thực hiện các công việc nêu trên nếu data team có một nhóm chuyên quản lý, vận hành database hoặc việc này được thực hiện bởi DevOps team hoặc một IT team nào đó chẳng hạn.

  • Cấu trúc dữ liệu và giải thuật (Data structure and algorithms): Đây là mảng kiến thức mà một DE không nhất thiết phải được đào tạo bài bản hoặc có kiến thức sâu về nó, nhưng nếu biết và nắm vững mảng kiến thức này thì sẽ giúp ích nhất định cho DE. Mình không phải là người được đào tạo bài bản về Computer Science, nên chỉ nêu ra một số nội dung kiến thức mà từ kinh nghiệm bản thân thấy rằng có liên quan và hữu ích đối với một DE, ví dụ như việc hiểu về các loại data structure và time complexity của chúng, cùng các nguyên tắc căn bản trong Computer Science như đánh đổi memory (storage) lấy tốc độ (speed), … giúp DE có cái nhìn mang tính hệ thống hơn khi thiết kế kiến trúc dữ liệu (data architecture) cho một dự án, hoặc khi cần tối ưu hiệu suất của data pipeline. Với những dự án khó hơn đòi hỏi DE sử dụng các ngôn ngữ lập trình như C++, Go, … (có thể để xây dựng các custom ETL engines chẳng hạn) thì việc hiểu sâu về cấu trúc dữ liệu và giải thuật là bắt buộc. Mình xin phép không bàn sâu về vấn đề này do bản thân không có đủ kinh nghiệm.

  • Cloud systems: Ngày nay việc sử dụng cloud computing đã trở nên rất phổ biến và nhiều công ty có sử dụng dịch vụ của các cloud provider như AWS, Azure, GCP ở những mức độ khác nhau. Vì vậy DE cũng cần biết được các khái niệm cơ bản về các dịch vụ trên cloud như các cloud service model (IaaS, PaaS, SaaS), cloud storage, cloud database, Identity and Access Management (IAM), … Theo mình những kiến thức này không phức tạp và on-job training là đủ, tuy nhiên các bạn cần học hiểu bản chất để có thể thích nghi được và làm việc được với bất kỳ một cloud provider nào.

  • Distributed systems: Khi mà dữ liệu ngày càng nhiều và phát sinh với tốc độ ngày càng nhanh, ở nhiều định dạng khác nhau thì không một cỗ máy nào có thể xử lý nổi. Chính vì vậy mà các hệ thống xử lý dữ liệu phân tán đã ra đời. DE cần hiểu được căn bản một số khái niệm quan trọng của distributed system như CAP theorem, các loại data model (relational, document, graph, …) và query language của chúng, data storage và retrieval của transactional system và analytic system, partitioning và replication, concurrency control, fault tolerance, consistency và consensus, batch processing và stream processing, … Nếu để chọn một công nghệ cụ thể để tập trung vào, mình gợi ý các bạn nên học về Spark và Hadoop, và trong quá trình học hai công nghệ này cần lưu ý nắm được những kiến thức cơ bản của distributed system nêu trên. Thay vì học sử dụng Spark và Hadoop on premise thì bạn cũng có thể học thông qua Databricks (có trên cả Azure, AWS và GCP), miễn là bạn vẫn nắm vứng được các kiến thức nền tảng.

4 Các kĩ năng “mềm” cần có (soft skills needed)

Để nêu hết tất cả các kĩ năng “mềm” cần có thì sẽ rất dài do trong thời buổi hiện nay, mỗi cá nhân cần có một bộ gồm rất nhiều kĩ năng để có thể làm việc hiệu quả. Dưới đây mình liệt kê ra một số kĩ năng “mềm” mà mình cho là quan trọng nhất với một DE

  • Kĩ năng giao tiếp (communication): một phần lớn thời gian làm việc thực tế của một DE là trao đổi, phối hợp làm việc cùng với các bộ phận khác trong doanh nghiệp như các bộ phận khác nhau trong team data (team BI và reporting, team data science, …) hoặc đôi khi là các bộ phận kinh doanh, marketing để trao đổi và thống nhất về yêu cầu về dữ liệu của họ, để giải thích các vấn đề, sự cố kĩ thuật xảy ra, hoặc trao đổi với các lập trình viên hoặc DevOps để tìm hiểu và lấy dữ liệu từ database, … Chính vì vậy mà kĩ năng giao tiếp là rất quan trọng đối với một DE.

  • Kĩ năng giải quyết vấn đề: Trước khi nói về kĩ năng giải quyết vấn đề thì mình muốn nói về kĩ năng debugging. Pipeline và job chắc chắn sẽ có một lúc nào đó bị lỗi, và khi lỗi xảy ra thì DE phải có kĩ năng debug tốt để nhanh chóng khoanh vùng và tìm ra lỗi. Thực tế thì việc tìm lỗi sẽ dễ hơn nếu ngay từ khi thiết kế và triển khai pipeline DE đã tuân thủ theo các thông lệ tốt. Kĩ năng debugging là một kĩ năng “cứng” cần thiết của một DE, còn kĩ năng giải quyết vấn đề là một khái niệm rộng hơn nhiều, nó giống như sự kết hợp giữa một bộ các kĩ năng (gồm những kĩ năng quan trọng như debugging, analytical thinking, creativity, decision making, …) với kiến thức, trải nghiệm của mỗi người và sự kiên định, quyết tâm để triển khai giải pháp đã được đề ra. Kĩ năng giải quyết vấn đề không phải chỉ là phát hiện lỗi ở một dòng code nào đó, mà là sự tổng hợp và phân tích thông tin ở nhiều khía cạnh, cả kĩ thuật lẫn các khía cạnh phi kĩ thuật, rồi đưa ra phương án tốt nhất và quyết liệt triển khai phương án đó. Có một điều thú vị là đôi khi phương án tốt nhất lại là phương án mang hàm lượng kiến thức kĩ thuật ít nhất.

  • Kĩ năng học tập liên tục và kĩ năng quản lý thời gian (continuous learning and time management): Với những công nghệ, công cụ mới ra đời liên tục cùng sự thay đổi nhanh chóng của các biến số trong nền kinh tế, kéo theo những thay đổi trong hoạt động kinh doanh, vận hành của các doanh nghiệp, một DE cần biết cách liên tục cập nhật, thử nghiệm và áp dụng nhanh các công nghệ mới để phục vụ công việc của mình và phục vụ doanh nghiệp. DE cũng thường xuyên nhận được rất nhiều yêu cầu từ các đơn vị khác nhau do đây là người có kiến thức và kĩ năng kĩ thuật cao. Vì vậy nên DE cũng cần biết cách quản lý thời gian của bản thân và sắp xếp công việc theo thứ tự ưu tiên phù hợp để có đủ thời gian dành cho những đầu việc quan trọng, tránh bị context switching quá nhiều (do đang làm dở việc này phải nhảy sang làm việc khác), và vẫn có thời gian nghiên cứu và thử nghiệm công nghệ mới.