Tự sự: Khi Dev già trải nghiệm GPT

Trong một năm của AI this, AI that và IT có vẻ sắp mất ngôi vua của mọi nghề, cùng chia sẻ câu chuyện của một kĩ sư hơn 20 năm tuổi nghề vẫn lặng lẽ với những dòng code.

Tốc độ là một trong những yếu tố quan trọng nhất trong phát triển phần mềm, và hầu hết các nhà quản lý đều đồng ý điều này. Trong lịch sử của ngành, các nhà phát triển luôn tìm cách để tăng tốc độ viết mã của họ, từ việc sử dụng các công cụ và kỹ thuật tối ưu hóa đến việc cải thiện kiến thức và kỹ năng của họ. Trong những năm gần đây, trí tuệ nhân tạo (AI) đã trở thành một công cụ mạnh mẽ có thể giúp các nhà phát triển tăng tốc độ code. AI có thể được sử dụng để tự động hóa các tác vụ lặp đi lặp lại, cung cấp phản hồi trong thời gian thực và với mô hình ngôn ngữ lớn (LLM), việc tạo ra mã mới một cách tự động không còn là điều tưởng tượng.

Các công nghệ AI có thể giúp các developer tự động hóa các tác vụ thủ công, phát hiện lỗi code, tối ưu hóa hiệu suất code,... từ đó giúp tăng tốc độ code đáng kể. Mong trải nghiệm của mình trong một năm vừa qua sẽ đem lại cho các bạn một cái nhìn toàn cảnh.

Upload image

Không phải AI vs Dev mà là AI 4 Dev

Những ngày đầu tiên của AI 4 Dev

Một trong những công nghệ AI đầu tiên mình sử dụng để giúp tăng tốc độ code là Tabnine. Tabnine là một công cụ tự động hoàn thành mã dựa trên AI, được phát triển bởi Tabnine Inc. Bản beta được ra mắt vào năm 2018 và nhanh chóng trở thành một công cụ được nhiều developer yêu thích và sử dụng.

Tabnine có khả năng phân tích và hiểu code của người dùng, từ đó đề xuất các gợi ý code phù hợp. Tabnine có thể giúp lập trình viên:

  • Hoàn thành các đoạn code nhanh hơn
  • Tìm kiếm các hàm, thư viện và API phù hợp

Tabnine đã có ảnh hưởng đáng kể đến cách thức phát triển phần mềm. Công cụ này giúp các developer tiết kiệm thời gian và công sức, từ đó nâng cao hiệu quả làm việc.

Những ngày đầu, Tabnine hỗ trợ lập trình viên bằng cách đề xuất đoạn code theo cách inline, tức là đề xuất trực tiếp, dev chỉ cần nhấn Tab để hoàn tất các đoạn code. Tabnine có thể phân tích code đang có sẵn trong dự án và đề xuất code tương tự, giúp lập trình viên không phải loay hoay đi tìm định nghĩa hàm trong dự án và thủ công copy paste.

Năm 2019, Tabnine công bố Deep Tabnine, một phiên bản nâng cấp thông minh hơn, tại thời điểm đó, mặc dù chỉ sử dụng GPT-2, với lập trình viên, đây đã là một cấp độ hoàn toàn khác với cách đề xuất code của các IDE.

Năm 2021, Microsoft công bố bản thử nghiệm kỹ thuật của Github Copilot, GitHub Copilot sử dụng mô hình ngôn ngữ lớn Codex của OpenAI để đề xuất các đoạn mã dựa trên ngữ cảnh và mô tả của người dùng. GitHub Copilot có thể gợi ý các hàm và thư viện liên quan, giúp các lập trình viên viết code rõ ràng, ngắn gọn và dễ bảo trì.

So với Tabnine, Copilot cung cấp đoạn code dài hơn nhiều và rất chi tiết dựa trên comment của hàm.

Upload image

Tự động gợi ý hoàn thành toàn bộ phương thức

Điều này khiến Github Copilot cũng đã vấp phải một số tranh cãi. Do GitHub Copilot có thể tự động thực hiện một số tác vụ mà trước đây cần có sự can thiệp của con người. Điều này có thể dẫn đến việc mất việc làm của các lập trình viên cấp thấp. Bên cạnh đó, ở thời điểm ra mắt GitHub Copilot được đào tạo trên một tập dữ liệu khổng lồ có thể chứa các đoạn mã không an toàn hoặc có hại, mà người dùng mù quáng có thể mắc sai lầm.

Thời đại bùng nổ lập trình thông qua chat với AI

Lập trình qua chat là một phương pháp lập trình trong đó các lập trình viên tương tác với một chatbot để viết mã. Chatbot sử dụng trí tuệ nhân tạo (AI) để hiểu yêu cầu của lập trình viên và tạo ra mã nguồn. Có thể kể tên một số AI có thể sử dụng chatbot như Tabnine chat, Copilot, Duet AI…

Có một số lý do khiến lập trình qua chat trở nên phổ biến:

  • Tăng tốc độ viết code: AI có thể tự động hoàn thành các đoạn code, giúp các lập trình viên tiết kiệm thời gian và công sức.
  • Giảm thiểu lỗi code: AI có thể phát hiện các lỗi code tiềm ẩn, giúp các lập trình viên tránh được những lỗi tốn thời gian và công sức sửa chữa.
  • Cải thiện chất lượng code: AI có thể gợi ý các hàm và thư viện liên quan, giúp các lập trình viên viết code rõ ràng, ngắn gọn và dễ bảo trì.
  • Dễ tiếp cận: AI có giao diện đơn giản và dễ sử dụng, ngay cả đối với các lập trình viên mới bắt đầu.

Ngoài ra, senior có thể trò chuyện để điều chỉnh AI sinh code theo ý mình tương tự như đang hướng dẫn junior.

Dùng chat với AI để sinh ra mã nguồn ra có nhiều điểm thú vị. Hãy cùng mình trải nghiệm nhé.

Copilot

#1 Một câu chat đơn giản: Đọc file, kiểm tra nội dung bằng thư viện Great Expectation.

Upload image

#2 Đoạn code trên đơn giản quá nên mình yêu cầu sửa lại câu lệnh một chút: bổ sung thêm việc cần thêm lưu file xuống cơ sở dữ liệu PostgreSQL

Upload image

Tới đây thì bạn thấy code do AI sinh ra thế nào? Riêng cảm giác sướng của việc không phải gõ 80 dòng code trên nhất là các comment để làm việc khác nó tiện kinh dị.

Duet AI

Bây giờ chúng ta cùng thử một AI mới của Google vừa mới ra mắt và đang cung cấp miễn phí cho đến hết tháng 2/2024 với cùng một yêu cầu.

Upload image

Đây là toàn bộ code được trả về từ Duet AI, bản thử nghiệm của Google dường như đang bị lỗi và không trả về đầy đủ nội dung được sinh ra nên mã nguồn bị cắt một đoạn dù đã cố gắng thay đổi câu lệnh nhiều lần.

Thử sinh đoạn code ngắn hơn, dùng cùng câu lệnh đơn giản yêu cầu đọc và kiểm tra nội dung với Great Expectation.

Upload image

Có thể thấy, mã nguồn do AI sinh ra ở mức dùng được, tuy nhiên lập trình viên vẫn phải tự đọc và chỉnh sửa cho phù hợp với nhu cầu.

AI như junior ảo cho senior

Nếu chúng ta xem AI như một bạn Junior trong team thì càng mô tả chi tiết bao nhiêu, chất lượng mã nguồn sẽ càng tốt vì bạn AI được hướng dẫn cụ thể các yêu cầu từ đầu.

Upload image

AI là junior nghe lời và tỉ lệ thành công ngay từ lần đầu tiên khá tốt

Ngoài việc sinh mã, AI còn có thể giúp làm nhiều việc khác như một cách tiện lợi cho chính bạn hoặc nếu bạn cần có mẫu ví dụ cho các bạn trong team thì tận dụng AI sẽ giúp chúng ta có thêm thời gian để làm việc khác.

Một trong những công việc thường nhật đó là đọc hiểu mã nguồn, trường hợp lập trình viên không thông thạo ngôn ngữ đó thì đây là một ưu điểm lớn, tưởng tượng các bạn junior trong team có một người giúp giải thích mã nguồn mà bạn thì lười nói xem ?

Upload image

Một trong những việc chúng ta lười dù chúng ta vẫn hay yêu cầu các bạn junior làm: viết mã kiểm thử. Giờ thì chúng ta vẫn có thể tiếp tục lười nhưng vẫn đảm bảo chất lượng.

Upload image

Tạm kết

So với những ngày đầu, các công cụ AI đã tiến một bước rất dài và ngày càng mạnh mẽ, tương lai lười gõ không còn xa xôi. Tuy nhiên, vẫn còn rất nhiều việc phải làm, nhìn vào mã nguồn AI sinh ra, có thể thấy một số vấn đề sau:

  • Dù câu lệnh khá chi tiết, AI vẫn sinh ra một số mã lỗi và vớ vẩn, như trường hợp mã do Duet AI sinh ra.
  • Đoạn mã AI sinh ra phải cấu trúc lại nếu muốn gọn gàng sạch sẽ.

Đó là chưa bàn đến các vấn đề đang tồn tại mà ai cũng biết như bản quyền, hoặc có thể có lỗi bảo mật. Rõ ràng việc sử dụng AI cần phải có người sử dụng đủ trình để có thể điều khiển cũng như đánh giá kết quả, điều chỉnh tay để có thể đạt được kết quả cuối cùng mong muốn.

Có thể thấy, việc áp dụng AI cũng khá giống như việc áp dụng máy móc trong sản xuất, tăng năng suất rõ rệt và nâng trình độ của kỹ sư đồng thời cũng đòi hỏi người sử dụng phải giỏi hơn và thông thạo ngôn ngữ, framework để có thể đánh giá code mà AI sinh ra. Với mình, việc giao cho AI những đoạn mã nhàm chán sẽ giúp chúng ta tập trung nhiều hơn vào các vấn đề hiệu năng, bảo mật và tư duy sâu hơn về hệ thống.

Một tip nhỏ là ta có thể sử dụng AI để sinh câu lệnh một cách chi tiết hơn, sau đó điều chỉnh theo ý mình. Mời bạn thử trải nghiệm chỉ dẫn sau đây với AI mà công ty các bạn đang dùng nhé. Senior sẽ copy paste khác Junior ^^!

Generate Python code that performs the following tasks:

Defines Great Expectations rules for a CustomerContract table:

The table schema includes the following columns:
ID (integer, unique)
customer_name (string)
customer_code (string)
contract_id (string)
contract_value (float)
date (datetime)
Specify expectations for data types, non-null values, and potential relationships between columns.
Creates a pandas DataFrame structure matching the table schema.

Loads data from a Parquet file into the DataFrame.

Validates the DataFrame using Great Expectations:

Check for data type conformity.
Enforce non-null constraints.
Validate any specified relationships between columns.
Return a validation result indicating success or failure.
Defines a main function that:

Calls the validation function.
If validation is successful:
Connects to a PostgreSQL database.
Checks for duplicates in the CustomerContract table based on a unique identifier (e.g., ID or a combination of relevant columns).
Inserts non-duplicate records from the DataFrame into the table.
Handles any errors or exceptions gracefully.
Additional considerations:

Error handling: Implement robust error handling for file operations, database interactions, and validation failures.
Logging: Use logging to track validation results, database operations, and any errors or warnings.
Testing: Write unit tests to ensure code correctness and reliability.
Modularity: Structure the code into well-defined functions for readability and maintainability.
Clarity: Use clear variable names and comments to enhance code understanding.
Atekco - Home for Authentic Technical Consultants