Cẩm nang sống sót cho dev thời GenAI: Read - Search - Ask AI - Ask an Expert
Lời đầu
Mình khá là đắn đo khi viết bài này, nhưng qua những vấn đề mình gặp phải trong quá trình đào tạo nhân sự mới trong công việc, sự phát triển mạnh mẽ của AI cũng như dự báo AI thay thế công việc của con người được đưa lên các kênh truyền thông nhan nhản(mà 80% các báo ấy là báo lá cả... à nhầm, báo về kinh tế-chính trị chứ không phải tạp chí chuyên về công nghệ phần mềm, cũng như những người được hỏi phần lớn là các CEO có background chuyên ngành kinh tế - quản lý của nước ngoài được dịch lại sót mất ngữ nghĩa). Thế nên mình đành phải hoàn thành nốt bài này từ 1 bản draft dở dang không định dùng đến.
Tóm tắt qua về sự phát triển của AI gần đây
Ở góc độ của người dùng như mình, AI, nhất là GenAI gần đây có những tiến bộ rất mạnh. Kể từ bước đột phá được công khai bởi OpenAI với ChatGPT, các tập đoàn lớn đã thi nhau ra mắt các dịch vụ riêng như Google Gemini(trước là Bard), Amazon Q,... Các ứng dụng AI khác nhau cũng thi nhau ra đời, điển hình với công cụ dev của chúng ta có Github Copilot, Amazon CodeWhisperer, Codeium,... với hiệu suất quảng cáo là 79% lượng code do AI làm ra thì có thể dùng được. Và dự kiến thì tỉ lệ hiệu suất kia sẽ càng ngày càng tăng trong tương lai.
Với những gì quảng cáo về GenAI thì mình cũng đã có làm thử các sample code về GenAI luôn. Mình đã làm 3 repo OCR sử dụng lần lượt Google DocumentAI, OpenAI API và Google Gemini API như ở link dưới:
- https://github.com/BlazingRockStorm/documentai-ocr
- https://github.com/BlazingRockStorm/openai-ocr
- https://github.com/BlazingRockStorm/geminiai-ocr
Về kết quả thì chỉ cần đóng tiền cho các service trên thì độ chính xác sẽ cao, chạy được lâu dài, còn về công sức bỏ ra để code thì rõ ràng code của các repo sử dụng GenAI ngắn hơn, cùng nguyên lý chạy command promt là ra luôn kểt quả rất thuận tiện cho người gần như không biết gì AI như mình
Hạn chế
Nếu đánh giá thì chắc chắn hạn chế lớn nhất của AI là mặt dữ liệu rồi. Ở đây mình nêu ra ở 3 điểm:
- AI đều phải học từ con người và do con người đưa dữ liệu vào để huấn luyện. Thế nên vô tình hay cố ý, ta có thể huấn luyện AI với các thông tin thiếu chính xác, sai lệch.
- Mình từng dùng 1 plugin để search bằng âm thanh của Google để tìm bài hát. Well, nếu trúng phải 1 bài hát không có trên Youtube Music thì sẽ không tìm được bài hát -> AI của cty nào thì sẽ bị giới hạn bởi dữ liệu của công ty ấy.
- Gần đây OpenAI mới đưa lên SearchGPT đã bị các công ty mảng truyền thông - internet chặn không cho đánh index(cho đến khi thoả thuận được hợp đồng mới). Mà như vậy thì sẽ có hạn chế cho việc đánh chỉ mục trang web cũng như thiếu dữ liệu huấn luyện AI.
Lập trình viên trong thời AI
Vấn đề mình gặp phải khi đào tạo nhân sự trong thời AI
Chính vì sự quá thuận lợi của AI nên mình cũng đã gặp phải vấn đề trong việc đào tạo nhân sự ở cty.
Vấn đề này rất may mắn là mình không gặp ở các case của du học sinh trường tiếng ở Nhật, vì các bạn như thế mà mình từng dạy có hạn chế về cả ngoại ngữ lẫn công nghệ dẫn đến vấn đề về làm sao để giúp các bạn ấy biết tra google đúng cách. Và đây là vấn đề của sự kiên nhẫn. Nhưng với 1 số bạn trường nghề ở Nhật, đặc biệt là học IT và có biết 1 tí lập trình(số này lại khá ít) thì đã bắt đầu xuất hiện tình trạng lạm dụng AI dưới 2 hình thức:
- Copy paste code lên ChatGPT để xử lý công việc
- Lạm dụng quá đà các plugin như Codeium để viết code. Và phần lớn code viết ra đem sử dụng luôn
Thời gian đầu mình tập trung vào việc DevOps cho dự án nên chưa để ý đến các vấn đề này. Phải đến khi bước đầu dựng xong server cho dự án thì bắt đầu chú ý đến việc upgrade version và tối ưu hoá code. Tới lúc này có thời gian để ý đến màn hình của đám cấp dưới và phát hiện tình trạng 1 màn hình code, 1 màn hình ChatGPT. Và đến lúc mình yêu cầu giải thích code thì bắt đầu xảy ra vấn đề. Có 1 số lib có ít document được code do AI gen ra theo hướng... bịa đặt, dẫn đến không chạy được. Và ở số case, việc động vào code ở file config thì extension VS Code không gen ra được 1 config đúng yêu cầu.
Để tránh việc lạm dụng, mình đã thử đưa hạn chế việc dùng AI lại, nhưng vấn đề mới xuất hiện là khi lạm dụng quá rồi thì sẽ có phản ứng như nghiện vậy: không dùng là lên cơn thèm, ngáp ngủ và ủe oải.
Liệu AI có thay thế được lập trình viên trong tương lai?
Rồi, thứ nhất, qua trải nghiệm cá nhân mình như trên, thì như các nhận định khác: AI sẽ thay thế các lập trình viên làng nhàng. Nhưng nếu dính đến việc config code kết nối với 1 service/công cụ nào đó liên quan tới network, động phải 1 ngôn ngữ lập trình hoặc 1 thư viện ít người dùng hay cần level cao thì AI chưa thể làm được. Với những case ấy thì cần các IT engineer level cao, nhưng khổ nỗi nếu cứ ỷ lại vào AI như 1 số hiện tượng hiện nay thì sẽ tạo ra việc những nhân sự viết code nhưng không biết suy nghĩ, dẫn đến khó khăn trong việc level up và tiếp đó là khó khăn tìm nhân sự level cao trong tương lại.
Một ý khác, với các tuyên bố trên báo chí
79% đoạn code do AI tạo có thể dùng ngay mà không cần sửa
Đây cũng là 1 nhận định cần được kiểm chứng. Vì thứ nhất, phát biểu tuy là của CEO hiện tại của Amazon Andy Jassy thật, nhưng với background là cựu sinh viên Kinh tế của trường Harvard thì việc có những phát ngôn gây shock với giới truyền thông là cũng là 1 kĩ năng kinh doanh. Đây là vấn đề chúng ta cần nghe từ chuyên gia hơn là các nhà quản lý. Thứ 2, phát biểu này là phát biểu ở trên LinkedIn chứ không phải 1 trang báo chính thống. Và thứ 3, ngay cả tỉ lệ 79% kia đúng thì 21% code còn lại phải sửa cũng là 1 vấn đề. Câu chuyện anh em hay nói về việc phải mất 2-3 tuần sửa code AI gen ra sao cho nó chạy được cũng xuất hiện khá nhiều trên các diễn đàn khác nhau(mình dùng chính CodeWhisperer để debug 1 đoạn code deploy lên AWS Lambda đang bị lỗi và nó cũng đang không trả ra được nguyên nhân chính xác). Và cuối cùng thì 79% kia nói là "không cần sửa", nhưng mức độ ở đây là như nào? Code ấy là chạy được rồi hay đã được tối ưu đến độ "không cần sửa"?
1 tuyên bố khác của người nổi tiếng đến từ 1 tập đoàn lớn
Các SuperAI sẽ thay thế các chuyên gia tốn kém...
Câu này mình xin phép trích ý vì nói chính xác quá lại gặp vấn đề. Ở đây thì SuperAI định nghĩa là gì? Và ý đồ của người nói là "thay thế các chuyên gia tốn kém"? Liệu cái này có liên quan đến định hướng phát triển doanh nghiệp của tập đoàn ấy không?
Làm sao để phát triển được trong thời đại AI
Xác định sẵn mục tiêu nghề nghiệp
Khi mà option developer ngày càng được thu hẹp lại thì việc định hướng lại nghề nghiệp cũng như tìm hiểu rõ các role trong ngành IT lại càng quan trọng hơn. Bởi từ đó, xác định thế mạnh bản thân và chọn career path lâu dài là cách để phát triển được trong ngành.
Ở đây sẽ có 1 nỗi sợ là các công việc liên quan đến tech thì AI có thể handle được. Nhưng như mình nói bên trên thì những việc đi sâu vào DevOps, infra, các thư viện khó hay đi commit framework với ngôn ngữ lập trình thì AI chưa làm được. Vì vậy mình vẫn còn cơ hội.
Read - Search - Ask AI - Ask an Expert
Well, nó là biến tấu từ flow Read - Search - Ask của FreeCodeCamp mà mình từng được học. Giải thích 4 bước là như sau:
- Read là việc đọc tài liệu, đọc sách để có thể tìm ra kiến thức, giải pháp mà mình có thể dùng được để giải quyết
- Search là nếu Read không được thì Search ở Stackoverflow hoặc ở Google, sau đó quay về bước Read để tìm ra giải pháp
- Ask AI: Giờ mới là bước dùng tới AI. Có thể ở bước search, chúng ta bị miss mát kết quả hay giải pháp. Lúc này AI sẽ search hộ chúng ta và đưa ra giải pháp tham khảo. Cứ thử dần từng giải pháp cho đến khi tìm được giải pháp cho vấn đề
- Ask an Expert: Khi AI không đủ dùng thì ta sẽ phải nhờ 1 chuyên gia. Chúng ta sẽ học được ở khả năng đọc code, đọc flow của họ và từ đó cũng phát hiện được vấn đề. Hoặc nếu tìm ra cách giải quyết bằng AI thì ta vẫn cần hỏi lại để review và tối ưu hoá.
Sử dụng AI có mức độ
Cái này nhằm:
- Sử dụng AI hiệu quả, tìm ra các gợi ý cho các vấn đề gặp phải
- Tránh sự ý lại AI, dẫn đến không suy nghĩ và mất khả năng tư duy
- Tránh chứng nghiện AI
Mình đã sử dụng AI trong việc lập trình ra sao?
- Ok, thứ nhất với case sử dụng Gemini theo kiểu copy code và paste: Mình đã gõ vào prompt như sau:
generate rspec test for this
class UpdateArtistPopPointsJob < ApplicationJob
queue_as :default
def perform(*_args)
# Do something later
Artist.find_each do |artist|
artist.songs_points = 0
artist.albums_points = 0
artist.albums.each do |album|
artist.albums_points += album.views_count
end
artist.songs.each do |song|
artist.songs_points += song.views_count
end
artist.save!
end
end
end
Và kết quả Gemini trả cho mình là:
RSpec Tests for UpdateArtistPopPointsJob Here's an improved RSpec test suite for UpdateArtistPopPointsJob:
require 'rails_helper'
RSpec.describe UpdateArtistPopPointsJob do
let!(:artist1) { create(:artist) }
let!(:artist2) { create(:artist) }
let!(:album1) { create(:album, artist: artist1, views_count: 100) }
let!(:album2) { create(:album, artist: artist2, views_count: 200) }
let!(:song1) { create(:song, album: album1, artists: [artist1], views_count: 50) }
let!(:song2) { create(:song, album: album2, artists: [artist2], views_count: 75) }
describe 'perform_later' do
it 'enqueues job' do
ActiveJob::Base.queue_adapter = :test
UpdateArtistPopPointsJob.perform_later()
expect(UpdateArtistPopPointsJob).to have_been_enqueued
end
it 'updates artist songs_points and albums_points' do
# Perform the job
UpdateArtistPopPointsJob.perform_now
# Reload artists
artist1.reload
artist2.reload
# Expected points based on song and album views
expected_songs_points_artist1 = artist1.songs.sum(&:views_count)
expected_albums_points_artist1 = artist1.albums.sum(&:views_count)
expected_songs_points_artist2 = artist2.songs.sum(&:views_count)
expected_albums_points_artist2 = artist2.albums.sum(&:views_count)
# Assertions
expect(artist1.songs_points).to eq(expected_songs_points_artist1)
expect(artist1.albums_points).to eq(expected_albums_points_artist1)
expect(artist2.songs_points).to eq(expected_songs_points_artist2)
expect(artist2.albums_points).to eq(expected_albums_points_artist2)
end
end
end
Việc dễ dàng sẽ là copy đoạn code trên vào trong RSpec. Còn việc khó hơn: Chúng ta cần phải tối ưu hoá đoạn code trên. Và mình sẽ viết lại 42 dòng trên còn 25 dòng như sau:
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe UpdateArtistPopPointsJob do
let!(:artist) { create(:artist) }
let!(:album) { create(:album, artist:, views_count: 1) }
let!(:song) { create(:song, album:, artists: [artist], views_count: 2) } # rubocop:disable RSpec/LetSetup
describe 'perform_later' do
it 'enqueue job' do
ActiveJob::Base.queue_adapter = :test
described_class.perform_later
expect(described_class).to have_been_enqueued
end
it "update artist's points" do
described_class.perform_now
artist.reload
expect(artist.songs_points).to eq(2)
expect(artist.albums_points).to eq(1)
end
end
end
- Với việc dùng plugin. Mình sử dụng Codium.
Ở bài https://viblo.asia/p/cai-dat-va-su-dung-ngrok-de-demo-rails-7-oK9VyA75VQR , mình đã có 1 thử nghiệm là tại
config/environments/development.rb
, mình gõ:
# Add host for ngrok
Kết quả lại như ảnh này
Rõ ràng nó không đúng output mình mong muốn, nên mình sửa lại comment thành
# Add host to accept connection from ngrok
Kết quả vẫn không đổi.
Như vậy thì dùng plugin để config có vẻ không ổn. Đổi gió tí vậy. Mình chuyển sang dùng Codium để tạo 1 đoạn code trong Cloud Formation để tạo DynamoDB. Mình gõ tên resource mình muốn tạo và autocomplete Gen ra như này
Kết bài
Trên đây là những gì mình muốn nói về việc làm sao để đi theo được công việc lập trình được lâu dài trong thời kì AI phát triển mạnh như này.
Bài viết có 1 số hạn chế do mình chỉ là người dùng và trên quan điểm cá nhân, rất mong được các bạn chuyên môn về AI vào comment góp ý ở đây.
All rights reserved