Đặt tên biến thường là vấn đề nhức nhối không chỉ của anh em Junior mới vào nghề mà còn cả những ông Senior lão làng. Chỉ là đặt tên thôi nhưng chưa bao giờ là chuyện đơn giản, bởi tất cả đều có quy tắc riêng.
Quy tắc ở đây không phải là quy tắc cứng nhắc, chỉ đơn giản là những cách thức đặt tên phổ biến. Với những cách đặt tên này, nếu anh em tuân theo sẽ tốt hơn khi viết hoặc maintain code.
Chỉ là cái tên cũng đủ để anh em nhức đầu
Bài viết này cung cấp một số quy chuẩn thường được dùng để đặt tên biến. Mời anh em đón đọc
1. Đặt tên trong python
Đối với ngôn ngữ lập trình Python nói riêng và các ngôn ngữ lập trình khác nói chung. Tất cả đều quy định rất rõ các yêu cầu phải có khi đặt tên biến. Cụ thể đối với ngôn ngữ Python, ta có:
A variable name must start with a letter or the underscore character – Biến không thể bắt đầu với ký tự hoặc gạch chân.
A variable name cannot start with a number – Biến không thể bắt đầu với số.
A variable name can only contain alpha-numeric characters and underscores (A-z, 0-9, and _ ) – Biến chỉ có các ký tự từ A-z và 0-9 hoặc gạch dưới.
Variable names are case-sensitive (age, Age and AGE are three different variables) – Trường hợp viết thường, viết hoa hoặc viết hoa một phần, các biến được hiểu là khác nhau.
# Đặt tên biến hợp lệ
myvar = "John"
my_var = "John"
_my_var = "John"
myVar = "John"
MYVAR = "John"
myvar2 = "John"
#Tên biến không hợp lệ:
2myvar = "John"
my-var = "John"
my var = "John"
Quy định là vậy nhưng thông thường anh em developer sẽ đặt như thế nào?
Việc đặt tên biến giúp cho chương trình hoặc code anh em viết ra dễ hiểu và dễ bảo trì. Đối với class, methods, interface hay packages. Tất cả đều có quy chuẩn riêng cho việc đặt tên. Variables cũng không phải là điều ngoại lệ.
Có 3 tiêu chí anh em cần hết sức lưu ý khi đặt tên biến (Python nói chung và các ngôn ngữ khác nói riêng):
Variable names should be short yet meaningful – Tên biến nên ngắn gọn và ý nghĩa
Common names for temporary variables are i, j, k, m, and n for integers; c, d, and e for characters. – Với các biến lặp thường nên sử dụng các biến được quy chuẩn với nhau như i,j,k,m và n
Variable names should not start with underscore _ or dollar sign $ characters, even though both are allowed – Biến không nên bắt đầu với gạch dưới hoặc dấu $ (ngoại trừ ngôn ngữ php)
Đối với ngôn ngữ lập trình Python, tên biến nên áp dụng convention tương tự như function. Cụ thể ở đây là việc ký tự đầu tiên luôn viết thường.
Dưới đây là một số loại convention khác thường sử dụng khi đặt tên biến.
Đầu tiên, nhắc luôn với anh em rules đây không được hiểu theo nghĩa cứng nhắc. Tức là bắt buộc phải đặt tên theo như vậy.
Để mà code chạy được, compiler được thì anh em chỉ cần apply rule đặt tên ở phần 1 đã nêu là được rồi. Tuy nhiên rules này được define theo nhiều người khác đã và đang code Python. Nếu anh em theo rules này, code của anh em sẽ dễ dàng để maintain, dễ đọc, dễ hiểu không chỉ với bản thân mình mà còn cho người khác nữa.Cụ thể như sau:
Variables should always start with a lower-case character – Biến nên thường bắt đầu với ký tự viết thường
Use underscores instead of spaces to separate words – Chia tách các từ bằng gạch dưới thay vì khoảng trắng
Don’t use upper-case characters – Đừng sử dụng ký tự viết hoa
Starting with underscores is ok, but is used for a special purpose – Bắt đầu với viết hoa cũng ok, nhưng phải có mục đích đặc biệt
Mục đích đặc biệt ở đây anh em hiểu là biến đó sử dụng cho mục đích cá biệt, khác với các biến khác.
4. Pascal Case
Loại này xuất phát từ ngôn ngữ lập trình pascal. Với loại này, chữ cái đầu tiên trong biến luôn được viết hoa. Ví dụ dưới đây cho anh em hiểu về 2 biến tạo với Pascal Case
ThisIsPascalCase
AnotherPascalCaseExample
Với tiên biến được đặt kiểu này, ưu điểm là dễ đọc, dễ hiểu mục đích của biến sử dụng. Thông thường như anh em làm Java thì classes bắt buộc phải theo kiểu Pascal Case.
Cammel case tương tự với Pascal case nhưng chữ cái đầu tiên không được viết hoa. Ưu điểm là cách viết nhanh nhẹn. Anh em cũng dễ dàng phân biệt giữa class và variable trong quá trình sử dụng.
Thông thường, mặc định khi thấy chữ cái đầu tiên không viết hoa sẽ là Cammel Case và nó là biến (variable). Ví dụ
thisIsPascalCase
anotherPascalCaseExample
Như hình ảnh phía tren, do chữ C viết hoa to hơn như bướu lạc đà, nên họ gọi là camelCase
Snake case là cách viết cho việc đặt tên biến nhưng luôn có gạch dưới (underscore) để tách bạch từng từ. Ví dụ:
this_is_snake_case
THIS_IS_SCREAMING_SNAKE_CASE
Nguồn ảnh / Source: juniortoexpert.com
Cách đặt tên biến kiểu này thường ít khi sử dụng, nhưng tuỳ vào mục đích và ngôn ngữ anh em vẫn có thể bắt gặp các biến được đặt tên kiểu này.
Khi xây dựng một hệ thống lớn dành cho các tổ chức, công ty thì việc thiết kế, phát triển và quản lý được một giải pháp kiến trúc để vận hành là một công việc đòi hỏi những kỹ năng chuyên môn cao. Vì thế mà vị trí Solution Architect – Kiến trúc sư giải pháp thường được đảm nhiệm bởi các kỹ sư có nhiều năm kinh nghiệm cùng với những hiểu biết sâu sắc về các công nghệ liên quan. Bài viết hôm nay chúng ta cùng nhau tìm hiểu về Solution Architect là gì và những kỹ năng cần có của một Solution Architect nhé.
Solution Architect là gì?
Khi một tổ chức, công ty hay doanh nghiệp đối mặt với nhu cầu chuyển đổi các quy trình và hệ thống để có thể đáp ứng được các yêu cầu kinh doanh mới; họ sẽ cần tìm ra được một danh sách các hoạt động cần phải làm theo trình tự từ thiết kế, mô tả, triển khai đến vận hành và quản lý; nó được gọi là một kiến trúc giải pháp – Solution Architecture. Và để đưa ra được giải pháp phù hợp với tình hình của doanh nghiệp và đáp ứng được yêu cầu của thị trường; chúng ta cần một người được gọi với vai trò là Solution Architect.
Kiến trúc sư giải pháp – Solution Architect là người chịu trách nhiệm dẫn dắt thực hành và đưa ra tầm nhìn kỹ thuật tổng thể cho một giải pháp cụ thể.
Gần đây chúng ta rất thường nghe từ khóa “chuyển đổi số”, và để một tổ chức, doanh nghiệp thực hiện được việc chuyển đổi số thì luôn cần những giải pháp kiến trúc đồng bộ bao gồm cả các quy trình về vận hành, kinh doanh kết hợp với công nghệ. Ngoài ra có thể kể đến một số ví dụ khác khi nhắc đến kiến trúc sư giải pháp như việc phát triển cơ sở hạ tầng cloud cho doanh nghiệp, triển khai các microservices cho thương mại điện tử hay áp dụng các biện pháp bảo mật cho dữ liệu, hệ thống, an ninh mạng.
Công việc của một kiến trúc sư giải pháp tập trung vào các quyết định về giải pháp và phân tích tác động của chúng đối với các mục tiêu và kết quả kinh doanh tổng thể; hay nói cách khác Solution Architect sẽ phải tập hợp các giải pháp công nghệ và đưa ra chiến lược để thực hiện chúng.
Cụ thể chi tiết công việc bao gồm:
Tham gia vào quá trình phân tích nghiệp vụ để định hướng, đề xuất về giải pháp áp dụng hoặc gợi ý điều chỉnh nghiệp vụ giúp tăng tính khả thi của phần mềm
Đưa ra các giải pháp kiến trúc đáp ứng nhu cầu của khách hàng, yêu cầu của dự án về mặt chức năng (functional) và phi chức năng (non-functional)
Phân tích, đánh giá các giải pháp, ghi nhận các ý kiến đánh giá giải pháp từ các bên liên quan; sau đó lựa chọn giải pháp phù hợp, tối ưu nhất
Truyền đạt, giải thích và tài liệu hóa chi tiết về giải pháp, kiến trúc đã lựa chọn và chuẩn bị xây dựng cho các bên liên quan, nhất là team phát triển
Tạo prototype cho giải pháp; tham gia trực tiếp vào quá trình phát triển, coding phần core, xử lý khó và phức tạp nếu cần. Sau đó chuyển giao lại cho team phát triển để thực hiện giai đoạn tiếp theo của dự án
Hỗ trợ quản lý dự án về mặt công nghệ, kiểm soát quá trình triển khai giải pháp và xử lý phát sinh nếu có.
Kiến trúc sư giải pháp là một vị trí đòi hỏi nhiều kỹ năng liên quan đến kỹ thuật, sự hiểu biết về mặt công nghệ cũng như phải thường xuyên cập nhật các xu hướng công nghệ mới. Ngoài ra, kinh nghiệm và sự thấu hiểu về doanh nghiệp, mô hình kinh doanh liên quan đến giải pháp kiến trúc sắp tới cũng là một yếu tố quan trọng. Cùng liệt kê các kỹ năng quan trọng nhất của một Solution Architect (SA) nhé:
Kỹ năng giao tiếp: SA là vị trí có vai trò trung tâm, thường xuyên phải giao tiếp và giúp các bên liên quan hiểu được, hiểu đúng giải pháp cần triển khai; vì thế giao tiếp là một kỹ năng không thể thiếu của SA.
Kỹ năng quản lý dự án và nguồn lực: mặc dù không tham gia trực tiếp vào quá trình phát triển dự án, SA vẫn cần đảm bảo rằng các nguồn lực của dự án được sử dụng một cách có hiệu quả theo từng giai đoạn triển khai.
Kỹ năng phân tích chuyên sâu: một giải pháp kiến trúc có ảnh hưởng đến cả phần mềm, phần cứng với nhiều chi tiết nhỏ hoạt động cùng nhau. SA phải là người ghi nhớ tất cả các chi tiết của dự án và phân tích chuyên sâu để thực hiện một cách chính xác nhất.
Kỹ năng nhận dạng và phân tích rủi ro: các rủi ro luôn luôn tồn tại trong quá trình phát triển hay triển khai của dự án; công việc của SA đòi hỏi nhận dạng, phân tích được chúng ta đưa ra được các biện pháp phòng ngừa.
Kỹ năng công nghệ: Đây là kỹ năng cơ bản, thiết yếu nhất của SA; thông thường một kỹ sư công nghệ có hiểu biết về cả phần mềm và phần cứng với kinh nghiệm làm việc từ 8-10 năm trong ngành thì bắt đầu đảm nhiệm được vị trí của một SA.
Cùng với việc trang bị các kỹ năng trên, để trở thành một Solution Architect được công nhận bởi khách hàng và các tổ chức; kiến trúc sư giải pháp cũng nên trang bị một số các chứng chỉ quan trọng của nghề như:
AWS Certified Solutions Architect
The Open Group Certified Architect (Open CA)
Google Professional Cloud Architect
Kết bài
Như vậy chúng ta vừa cùng nhau tìm hiểu về vị trí Solution Architect, một người có vai trò quan trọng quyết định lớn đến sự phát triển của dự án nói riêng và các hoạt động trong tổ chức, doanh nghiệp nói chung. Đây là một vị trí có trách nhiệm lớn cùng việc đòi hỏi nhiều kỹ năng liên quan đến công nghệ, cũng vì thế là vị trí mà nhiều anh em IT hướng tới trong sự nghiệp. Hy vọng bài viết hữu ích dành cho bạn, hẹn gặp lại trong các bài viết tiếp theo của mình.
Bạn có nhận thấy là công việc lập trình cũng chỉ quanh quẩn các thao tác xử lý Mảng, Object… đúng không? Bản thân các ngôn ngữ lập trình hiện đại như Javascript cũng đã có sẵn nhiều hàm, công cụ mạnh mẽ để giúp bạn làm việc với Mảng, Object hiệu quả.
Lodash là một trong những thư viện tuyệt vời, cung cấp nhiều công cụ giúp bạn thao tác với mảng, object… đơn giản hơn rất nhiều.
Có thể bạn cũng đã biết tới thư viện Lodash này rồi. Tuy nhiên, qua bài viết này mình sẽ tổng hợp một số hàm nổi bật lodash mà các bạn rất hay sử dụng trong mọi dự án.
Lodash là gì?
Lodash là một thư viện Javascript cung cấp sẵn các hàm để thao tác với Array, Object, String, Function… được đơn giản hơn. Lodash là một nhánh được tách ra từ thư viện nổi tiếng một thời underscore.js.
Một khi đã thử dùng qua một vài hàm của Lodash, đảm bảo bạn sẽ bị nghiện và không thể thiếu nó trong các dự án sau này.
Thư viện Lodash javascript có rất nhiều tính năng, được chia thành các nhóm như: Array, Object, Function, Date, Number…
Một số hàm lodash hay sử dụng nhất
Phần này, mình sẽ tổng hợp một số hàm của lodash mà mình thường xuyên sử dụng trong các dự án.
Để cài đặt lodash, bạn có nhiều cách như cài qua theo kiểu module bằng NPM, hoặc import qua CDN. Ví dụ, với dự án html đơn giản là mình import thư viện qua CDN trong thẻ head như sau:
Hàm này mới chỉ làm phẳng được một level, nếu bạn muốn kết quả là một mảng phẳng hoàn toàn, không còn mảng con lồng trong nữa thì sử dụng flattenDeep()
Bạn thấy khoái chưa! Nếu mà làm phẳng kiểu thủ công chắc cũng hết hơi.
take
Tạo một mảng mới được trích xuất từ một mảng với kích thước tùy ý.
const array =[1,2,3];const result =_.take(array,2);console.log(result)// result => [1, 2]
difference
Tạo một mảng gồm các phần tử không xuất hiện trong các mảng đã cho (được truyền thông qua tham số).
const result =_.difference([1,2,3],[2,3,4]);console.log(result)// result => [1]
isEmpty
Hàm này nghe có vẻ đơn giản, nhưng lại rất hay sử dụng để kiểm tra và tránh những lỗi crash không đáng có. Hàm này có tác dụng kiểm tra một object, collection, map, hay set có bị rỗng hay không.
Hàm này có tác dụng tương tự như hàm setInterval mặc định của JS vậy. Có tác dụng tạo một hàm để chỉ gọi một hàm truyền vào nhiều nhất một lần trong khoảng thời gian được chỉ định.
const throttled =_.throttle(()=>{ console.log('Throttled after 50ms!');},50);window.addEventListener('resize', throttled);
debounce
Tương tự như hàm setTimeout mặc định của JS.
const debounced =_.debounce(()=>{ console.log('Debounced after 400ms!');},400);window.addEventListener('resize', debounced);
merge
Hàm này mới thực sự đáng giá. Có tác dụng mà gộp nhiều object vào làm một.
Như bạn cũng biết, JS cũng tương tự như Java, cũng có kiểu dữ liệu tham chiếu và tham trị. Do đó, khi bạn gán một biến cho một biến khác thông qua dấu =, thực chất là chỉ truyền địa chỉ vùng nhớ của biến đó thôi.
Do đó, khi một biến thực hiện thay đổi giá trị là biến còn lại cũng bị thay đổi theo.
Trên đây là những hàm mình hay sử dụng nhất của lodash javascript. Ngoài ra, còn nhiều hàm khác nữa, vì phạm khuôn khổ bài viết có hạn, bạn có thể vào trang tài liệu chính thức của lodash để khai phá thêm nhé. https://lodash.com/docs
Phần tiếp theo của khóa học Lập trình Node.js cơ bản, mình sẽ hướng dẫn các bạn học cách kết hợp Nodejs với cơ sở dữ liệu, nổi bật nhất là MongoDB. Để các bạn dễ hình dung, chúng ta sẽ cùng nhau tạo RESTful API đơn giản bằng Nodejs + MongoDB.
Khi chúng ta xây dựng ứng dụng Web hay các ứng dụng phía server, việc tạo RESTful API để tương tác với client trở lên vô cùng phổ biến.
Ở bài viết này, mình sẽ tạo RESTful API hỗ trợ đủ 4 actions: CRUD ( Create – Read – Update – Delete).
OK, sau khi môi trường lập trình đã sẵn sàng, chúng ta bắt tay vào tạo RESTful API thôi!
#Tạo RESTful API
Tạo RESTful API là một kiểu thiết kế ứng dụng trong đó quy định định dạng của địa chỉ URL và phương thức HTTP sử dụng để quản lý tài nguyên trên server.
Tài nguyên trên Server trong bài viết này mình giả sử là danh sách person trong Database.
Việc thiết kế REST cũng khá đơn giản, chúng ta sẽ định nghĩa 4 hàm xử lý 4 actions:
Tạo mới tài nguyên (ví dụ thêm một person).
Chỉnh sửa tài nguyên có sẵn (ví dụ cập nhập thông tin của một person).
Lấy về dữ liệu của tài nguyên (xem thông tin của một person/hoặc nhiều person)
Xóa tài nguyên (Xóa thông tin của một person)
Cụ thể trong bài viết này thì mình sẽ thiết kế như sau:
Kết thúc những lệnh trên, chúng ta sẽ tạo một package.json, và cài đặt ExpressJS, Mongoose và một package hỗ trợ chuyển dữ liệu trong cách request từ client thành JSON data.
Để đơn giản, mình sẽ cho tất cả mã nguồn vào một file app.js. Tuy nhiên, điều này không được khuyến khích ở dự án thực tế nhé. Với dự án thực tế, các bạn nên ứng dụng những quy tắc như nguyên lý SOLID để đảm bảo dự án clean, dễ maintain.
Trong đó vntalking là tên cơ sở dữ liệu (tương đương với tên database trong SQL vậy).
Lưu ý: Bài viết này mình tập trung vào những logic tương tác với MongoDB từ Nodejs. Do đó, mặc định mình sẽ coi các bạn đã biết cách tạo collection trong MongoDB. Nếu bạn muốn quản lý MongoDB dễ dàng thì có thể sử dụng công cụ Robo3T.
Sau khi đã cấu hình kết nối xong, mình sẽ tiến hành tạo model. Trong khuôn khổ ví dụ của bài viết này, chúng ta chỉ cần tạo một model như sau:
Đầu tiên, chúng ta sẽ viết code xử lý phần tạo mới một person:
app.post("/person", async (request, response)=>{ try{ var person =new PersonModel(request.body); var result = await person.save(); response.send(result); }catch(error){ response.status(500).send(error); }});
Khi client thực hiện một POST request tới ứng dụng của chúng ta. Chúng ta sẽ sử dụng PersonModel và JSON payload để lưu thông tin vào cơ sở dữ liệu.
Có một điểm lưu ý, tất cả những công việc tương tác với cơ sở dữ liệu đều có thể tốn thời gian và bạn cần phải sử dụng cơ chế xử lý bất đồng bộ. Trước kia bạn có thể dùng Promise, và giờ thì hiện đại hơn, dùng kỹ thuật mới async và await ( hỗ trợ từ javascript ES7).
Sau khi lưu dữ liệu thành công, chúng ta trả lại kết quả cho client biết.
Tiếp theo, khi đã có dữ liệu, chúng ta có thể lấy dữ liệu từ database:
app.get("/people", async (request, response)=>{ try{ var result = await PersonModel.find().exec(); response.send(result); }catch(error){ response.status(500).send(error); }});
Có hai kiểu lấy dữ liệu: Một là lấy toàn bộ danh sách person có trong database, hai là lấy cụ thể thông tin của một người nào đó.
Trong kịch bản API này, khi client không gửi bất kì điều kiện nào thì sẽ trả về một danh sách các person.
Nếu client gửi cụ thể ID một person nào đó, chúng ta sẽ chỉ trả về 1 một person mà thôi. Implement như sau:
app.get("/person/:id", async (request, response)=>{ try{ var person = await PersonModel.findById(request.params.id).exec(); response.send(person); }catch(error){ response.status(500).send(error); }});
Khi client gửi ID của person lên, chúng ta sẽ sử dụng hàm findById()để tìm trong database xem có person nào tương ứng với ID đó không. Nếu tồn tại person đó thì trả lại cho client.
Hoàn toàn tương tự với việc cập nhật và xóa thông tin của một person khi biết ID
app.put("/person/:id", async (request, response)=>{ try{ var person = await PersonModel.findById(request.params.id).exec(); person.set(request.body); var result = await person.save(); response.send(result); }catch(error){ response.status(500).send(error); }});app.delete("/person/:id", async (request, response)=>{ try{ var result = await PersonModel.deleteOne({ _id: request.params.id}).exec(); response.send(result); }catch(error){ response.status(500).send(error); }});
Như vậy là chúng ta hoàn thành đủ 4 action như thiết kế ban đầu. Các bạn có thể test ứng dụng bằng cách sử dụng Postman. Tất nhiên, đừng quên chạy ứng dụng trước khi test trên server bằng lệnh sau.
node app.js
#Tổng kết
Qua bài viết, chúng ta đã biết tạo RESTful API đơn giản rồi phải không? Từ những kiến thức cơ bản này, các bạn có thể tự phát triển và mở rộng cho những ứng dụng thực tế.
Automation Test là một phần trong lĩnh vực kiểm thử phần mềm và được xem như cánh tay phải hỗ trợ đắc lực trong việc kiểm tra chương trình, source code. Nó đóng vai trò quan trọng trong việc nâng cao hiệu suất, giảm thiểu thời gian, lỗi, cũng như sự nhàm chán so với kiểm thử thủ công (Manual Test). Vậy Automation Test là gì và Tester cần những kỹ năng gì để làm được Automation Test trong dự án; bài viết hôm nay chúng ta cùng nhau trả lời cho câu hỏi trên nhé.
Automation Test là gì?
Kiểm thử tự động, Automation Test được hiểu đơn giản là việc thay vì test chương trình bằng tay, thao tác từng bước như người dùng, thì sẽ sử dụng máy để thực hiện toàn bộ hoặc 1 phần quá trình trên. Automation Testing có thể thay thế Manual Testing trong một hoặc toàn bộ các bước từ khởi động hệ thống, nhập dữ liệu đầu vào, kiểm tra so sánh với dữ liệu đầu ra và ghi kết quả.
Để thực hiện được công việc kiểm thử một cách tự động thì chúng ta cần sử dụng đến các công cụ kiểm thử gọi là Automation Testing Tool; sau đó viết các đoạn mã (script) tùy theo từng công cụ để cung cấp đầu vào theo từng testcase; phần mềm kiểm thử tự động sẽ hỗ trợ chạy chương trình và thực hiện việc kiểm thử, sau đó cho đầu ra với kết quả tương ứng PASS/FAIL theo từng testcase.
Một số phần mềm kiểm thử tự động nổi tiếng hiện nay gồm:
Selenium: phần mềm mã nguồn mở hoàn toàn miễn phí, hỗ trợ hoạt động trên trình duyệt với nhiều nền tảng khác nhau như MacOS, Windows, Linux, … cho các ứng dụng Web. Selenium hỗ trợ bạn viết script bằng nhiều ngôn ngữ lập trình khác nhau từ Java, JavaScript, Python,…
Appium: là phần mềm kiểm thử tự động mã nguồn mở dành cho các ứng dụng di động, hỗ trợ các ngôn ngữ lập trình phổ biến như Java, Python, C#, …. Appium có thể sử dụng cho việc kiểm thử các ứng dụng chạy trên nền tảng Android, iOS cho cả các thiết bị giả lập và thiết bị thực.
Cypress: là một công cụ kiểm tra giao diện người dùng cho các ứng dụng Web, chạy được trên Windows, Linux và macOS giúp thực thi được nhiều loại test như End-to-End, test tích hợp hay Unit Test.
Postman: Postman được biết đến là một công cụ cho phép chúng ta thao tác với API, phổ biến là REST API. Ngoài ra thì Postman cũng là một công cụ kiểm tra tự động hóa được sử dụng khi kiểm thử API đồng thời tích hợp các công cụ CI/CD phổ biến.
Apache Jmeter: một công cụ mã nguồn mở nổi tiếng dành cho việc kiểm thử hiệu suất 1 cách tự động, chủ yếu dành cho các ứng dụng Web.
Việc quyết định có lựa chọn Automation Test để thực hiện việc kiểm thử trong quá trình thực hiện dự án hay không phụ thuộc chủ yếu vào tính chất, đặc thù của dự án và khả năng đáp ứng của các thành viên trong team dự án. Kiểm thử tự động đòi hỏi tester cần có kỹ năng viết code hay script cho các công cụ Auto Test.
Sau khi xác định lựa chọn Automation Test cho dự án, các bước tiếp theo sẽ được thực hiện để đảm bảo quy trình kiểm thử tự động được thực hiện:
1. Lựa chọn phần mềm kiểm thử
Kiểm thử tự động sẽ được thực hiện bởi một phần mềm (công cụ) kiểm thử nhất định, mỗi phần mềm sẽ có những đặc thù và phục vụ cho những ứng dụng khác nhau; vì vậy bạn nên cân nhắc những điểm sau khi lựa chọn phần mềm:
Ngôn ngữ mà phần mềm hỗ trợ: Java, JavaScript, Python,….
Phần mềm hỗ trợ những loại kiểm thử nào: kiểm thử tích hợp, kiểm thử đơn vị, kiểm thử hệ thống,…
Phần mềm hoạt động trên nền tảng nào: Web, Desktop app, Mobile app, …
Chức năng báo cáo của phần mềm hay xuất dữ liệu đầu ra có đảm bảo để phù hợp với yêu cầu của dự án
Xem thêm các vị trí tuyển Tester lương cao trên TopDev
2. Xác định phạm vi test tự động
Kiểm thử tự động sẽ phù hợp với những bài toán có những đặc điểm như dưới đây:
Lượng dữ liệu cần kiểm thử lớn
Khả năng sử dụng lại các testcase cao ở nhiều màn hình hay chức năng
Sự phức tạp của yêu cầu kiểm thử mà Manual Test khó thực hiện được; chẳng hạn như yêu cầu về số lượng truy cập lớn cùng 1 thời điểm
Tính khả thi về mặt logic kiểm tra kết quả: chẳng hạn như rất khó để sử dụng Auto test cho việc xác định về mặt UX của ứng dụng
Từ những đặc điểm trên chúng ta sẽ xác định ra được phạm vi mà Automation Test nên được áp dụng vào dự án của mình.
3. Lên kế hoạch thiết kế testcase, viết script (code) thực thi
Giai đoạn này, kiểm thử tự động sẽ dựa trên các testcase cụ thể và chuyển nó thành source code hay script cho phần mềm kiểm thử tương ứng. Nó khá giống với việc chúng ta lập trình viết ra ứng dụng. Việc phát triển source code kiểm thử tự động cũng có thể phát triển thành các bộ kiểm thử tự động có khả năng tái sử dụng trong các dự án, chức năng, màn hình sau này.
4. Thực thi kiểm thử tự động
Việc thực thi kiểm thử được các phần mềm chạy hoàn toàn tự động; để đảm bảo nó hoạt động đúng thì chúng ta cần thiết lập các thông số đầu vào đúng như yêu cầu. Ngoài ra việc xuất kết quả đầu ra theo đúng định dạng mong muốn cũng nên được quan tâm để giúp có thể nhanh chóng xác định được testcase fail, liên hệ với đội phát triển và nhanh chóng khắc phục.
5. Cập nhật và bảo trì
Như đã đề cập ở trên, mỗi tập hợp Automation Test case đều có thể xem là một dự án nhỏ. Để tối ưu hóa và tái sử dụng một cách hiệu quả, đội kiểm thử cần có sự cập nhật chỉnh sửa và bảo trì thường xuyên đáp ứng được nhu cầu và sự thay đổi của phần mềm, ứng dụng.
Tester cần kỹ năng gì để làm Automation Testing
Nếu bạn đang là một Tester và muốn trở thành một Automation Tester; hãy cứ cố gắng trước hết để nắm được các kiến thức liên quan đến kiểm thử; các loại kiểm thử; các kỹ thuật kiểm thử. Bất cứ kỹ thuật nào trong Automation Test đều dựa trên những kiến thức cơ bản về kiểm thử, vì vậy hãy xem AutoTest như một công cụ để phát triển, mở rộng khả năng nghề nghiệp hơn là một hướng đi riêng biệt.
Với một Automation Tester, bạn cần được trang bị thêm các kiến thức như sau:
Nguyên lý nhận dạng objects: cách để tìm kiếm và lấy ra đúng phần tử cần thao tác trên ứng dụng thông qua HTML hay Xpath
Lựa chọn sử dụng phần mềm kiểm thử tự động: Mặc dù mỗi phần mềm kiểm thử tự động sẽ có cách viết khác nhau, tuy nhiên nguyên lý hoạt động đều khá tương đồng. Bạn nên bắt đầu bằng những phần mềm phổ biến như Selenium cùng sự hỗ trợ lớn từ cộng đồng
Sử dụng tốt một ngôn ngữ lập trình cho việc viết source code autotest
Các kỹ năng về coding, debugging và cách sử dụng các IDE
Thường xuyên học hỏi, update các kiến thức mới, công nghệ, phần mềm liên quan đến Automation Testing.
Kiểm thử tự động là một mảng con trong lĩnh vực kiểm thử phần mềm và đang có xu hướng phát triển và ngày càng có vai trò quan trọng hơn trong phát triển dự án. Trở thành một Automation Tester có thể là hướng đi tốt dành cho sự nghiệp của bạn. Hy vọng bài viết này đã giúp bạn hiểu được Automation Test là gì và bạn sẽ cần trang bị kỹ năng gì để làm được kiểm thử tự động. Cảm ơn các bạn đã đọc và hẹn gặp lại trong các bài viết tiếp theo của mình.
Thường meme liên quan tới backend luôn là thứ gì đó ẩn mình phía sau đầy ghê rợn. Không được đẹp đẽ hào nhoáng như phía Frontend.
Sự thật thì Backend hay Backend developer không hề đáng sợ như vậy. Backend cũng bao gồm nhiều kiến thức. Những kiến trúc lộng lẫy tuyệt vời nằm ở phía dưới đó. Vậy để trở thành backend developer hoặc học để trở thành backend anh em cần gì?
Tất cả sẽ được trình bày qua bài viết dưới đây
1. Programming Languages
Đầu tiên không thể thiếu với anh em developer backend rõ ràng là ngôn ngữ lập trình backend. Không chỉ hiểu phần core, hiểu cách thức hoạt động của ngôn ngữ. Anh em còn cần có lộ trình cụ thể để trở thành master trong từng loại ngôn ngữ mà mình lựa chọn.
Dưới đây là 3 ngôn ngữ thường được sử dụng cho backend:
Java: Đây là ngôn ngữ mà nhiều anh em thường nhầm với JavaScript. Tuy nhiên, Java và Javascript là khác nahu. Java thường sử dụng để tạo ra hệ thống mạnh mẽ. Mức độ phổ biến cao, chính vì vậy đây là ngôn ngữ cần thiết cho anh em developer.
PHP: Về phía web, ngôn ngữ thường hay sử dụng là PHP. Một số trang web đang được phát triển bằng php, vừa là mã nguồn mở mà còn free. Vì vậy, kỹ năng PHP cũng là kỹ năng mà anh em backend cần có.
Python: Với sự phát triển vượt bậc của AI, ML thì Python cũng trở thành ngôn ngữ backend cần phải biết. Đây là một trong những ngôn ngữ hàng đầu, muốn dùng cho cái đơn giản cũng ok mà dùng cho cái phức tạp cũng ok. Mấy ứng dụng phổ biến như Spotify và Dropbox cũng được viết bằng Python.
Viết tới đây chắc sẽ có một số anh em thắc mắc về Nodejs, tất nhiên Nodejs cũng là ngôn ngữ backend đáng để học. Ngôn ngữ nào cũng có cái hay và phía trên chỉ là ví dụ 3 ngôn ngữ. Còn lại anh em muốn tiếp cận ngôn ngữ nào trước cũng được.
Chỉ cần chọn cho mình 1 ngôn ngữ, vẽ ra roadmap cụ thể là anh em có thể bắt đầu trên con đường trở thành master 1 ngôn ngữ phía Backend rồi.
Sau khi đã có kiến thức về ngôn ngữ lập trình, anh em sẽ hiểu khi cần xây dựng một cái gì đó to lớn, chỉ với ngôn ngữ sẽ khó khăn như thế nào. Ví như anh em xây cả lâu đài, mà từng cái bai, cục gạch anh em cũng phải tự làm, mày mò từng chút một. Vậy lúc nào mới xong?
Chính lúc này ta cần với frameworks.
Frameworks xây dựng trên 1 ngôn ngữ backend nào đó. Nó hỗ trợ đầy đủ những thứ từ cơ bản đến nâng cao giúp cho anh em xây dựng hệ thống dễ dàng hơn.
Một số framework phổ biến anh em có thể tham khảo bao gồm:
Ruby on Rails: Một số thứ ở Ruby on Rails giúp nó nổi bật hơn mấy frameworks phái dưới. Ông này base trên nền Ruby, có automated testing, có libraries, nếu làm đa ngôn ngữ có localization. Nó cũng là open-source web app development framework. Tất. nhiên, luôn sử dụng ngôn ngữ Ruby.
Django: Là open-source và một trong những web frameworks tốt nhất viết trên nền ngôn ngữ Python. Rất tốt cho việc mở rộng (scalability) và bảo mật (security). Ngoài ra Django cũng hỗ trợ lập trình bất đồng bộ.
Flask: Cũng base trên nền Python và có thể sử dụng để xây dựng web app framework rất nhanh. Nhiều tính năng chính của Flask bao gồm hỗ trợ WSGI cho phép xây dựng rất nhanh web application.
Express: Là framework nhẹ và nổi tiếng nhất sử dụng ngôn ngữ Node.js. Sử dụng để xây dựng web app framework. Express cho phép phát triển rất nhanh và development side-server cũng khá dễ dàng.
Trên đây chỉ là một vài so sánh nhỏ, anh em có thể tìm hiểu sâu hơn về các frameworks để có so sánh rõ ràng hơn các ngôn ngữ mình sẽ lập trình phía BE.Tham khảo việc làm Back-end Developer Hồ Chí Minh hấp dẫn trên TopDev
3. Database
Nếu không có hiểu biết về hệ cơ sở dữ liệu, anh em không thể tự nhận mình là backend developer được. Đơn giản là backend sẽ thường làm việc với hệ cơ sở dữ liệu.
Ở một số hệ thống, database được xem như trái tim, nơi chứa những dự liệu quý giá nhất cần thiết cho hệ thống. Chính vì vậy, để trở thành backend developer, anh em cần có kiến thức tốt ở lĩnh vực database. Kiến thức tốt ở đây có thể được hiểu qua vài ví dụ dưới đây:
Hiểu về data types, hiểu về structure, hiểu về cách thức DB vận hành
Tối ưu tốc độ, phân tích query, tìm hiểu lý do query bị chậm
So sánh ưu nhược điểm các loại database, sự khác nhau giữa SQL và NoSQL
Thiết kế và vận hành database, hiểu sâu về quản lý database
Một số cuốn sách hoặc khoá học có thể sẽ hữu ích với anh em về database:
Cấu trúc dữ liệu và thuật toán cũng là thiết yếu với backend developer. Thực thế thì data structure là cần thiết với tất cả các kĩ sư phần mềm. Nhưng đối với backend, anh em cần thật sự hiểu sâu về Data structures và Algorithms (thuật toán).
Một số loại cấu trúc dữ liệu phổ biến có thể liệt kê dưới đây:
Hiểu về cấu trúc dữ liệu là hiểu về cách nó hoạt động. Về performance, về độ phức tạp (complexity) là bao nhiêu. Lúc nào thì dùng loại data structure này, lúc nào thì dùng data structure kia. Chứ không chỉ đơn thuần là nhớ tên rồi muốn dùng sao thì dùng nha anh em.
Sau khi đã nắm chắc Data Structure thì về thuật toán, anh em cần hiểu cơ bản về các thuật toán kinh điển. Hiểu ở đây là hiểu rõ cách thức hoạt động, ưu, nhược điểm. Còn lại implement thì thường đã có rất nhiều người làm rồi. Anh em chỉ nhớ sử dụng cho đúng lúc, đúng địa điểm là được.
Anh em luôn thấy là backend với frontend đi liền một cặp, nếu chỉ có backend thì application không thể hoạt động. Tương tự vậy, nếu chỉ frontend thì ứng dụng cũng không thể hoàn thành.
Vậy backend và frontend giao tiếp với nhau như thế nào? Tất nhiên là thông qua API, vậy API có phải là yếu tố bắt buộc và backend developer cần biết không?
Câu trả lời là có, 100% các lập trình viên backend đều biết rõ về API và REST. REST có bao nhiêu method, các method đó sử dụng làm gì? Thiết kế API như thế nào là tốt. Song song với đó, anh em cũng cần có kiến thức và tìm hiểu thêm về JSON, XML. Các phương thức giao tiếp với client.
Một số khoá học hoặc bài viết có thể giúp anh em hiểu thêm về các công nghệ được nhắc tới ở trên gồm:
Để backend có thể hoạt động, tất nhiên không thể thiếu server. Vậy anh em cần tìm hiểu thêm về các loại server, Windows thì khác gì Linux? Services mình viết lên sẽ chạy ở đâu, chạy như thế nào? Cấu hình 1 máy như thế nào là đủ.
Sau khi đã hiểu về server. Vậy giờ cần hiểu thêm về CI,CD. Hai cái này khác nhau như thế nào? Để triển khai auto deployment ta cần những gì. Tất tần tật những kiến thức đó là kiến thức bắt buộc với backend developer. Các môi trường development, staging và production khác gì nhau? Tại sao ta lại cần những môi trường này?
Ngoài ra khi tìm hiểu sâu hơn, anh em sẽ cần biết thêm về quản lý version. Kỹ năng điều tra, giải quyết vấn đề. Xử lý sự cố trong trường hợp production down.
Lộ trình trở thành Backend Developer
Bạn có thể xem full roadmap lộ trình Backend Developer trong ảnh dưới, sẽ có phần giải thích từng bước chi tiết ở bên dưới.
Trước khi bắt đầu với lộ trình backend, mặc dù chúng tôi chưa list ra các kiến thức về HTML/CSS trên roadmap trên, bạn cũng nên tự tìm hiểu và ít nhất đã nắm được cách viết HTML/CSS căn bản.
Các bước cần thiết cho lộ trình backend:
Bước 1 – Học một ngôn ngữ mới
Có cả tá lựa chọn về ngôn ngữ dành cho bạn. Tôi có chia nhỏ nó ra các categories để bạn dễ lựa chọn hơn. Đối với những người mới thì tôi khuyên bạn nên chọn các ngôn ngữ scripting vì chúng có nhiều demand và cho phép bạn bắt kịp nhanh chóng. Nếu bạn có một ít kiến thức frontend, bạn sẽ thấy Node.js dễ hơn nhiều và có rất nhiều job về nó đang mở.
Nếu bạn đang làm backend và biết một số scripting language, tôi đề xuất không chọn một ngôn ngữ scripting language khác nữa mà chọn trong section “Functional” hoặc “Multiparadigm”. Ví dụ, nếu bạn đang làm PHP hoặc Mode.js, đừng nên chọn Python hoặc Ruby, mà hãy thử Erlang hoặc Golang. Nó sẽ giúp bạn tư duy xa hơn và open với những mảng khác hơn.
Bước 2 — Thực hành ngay những cái đã học
Học phải đi đôi với hành. Một khi bạn đã chọn được ngôn ngữ phù hợp và có được nền tảng căn bản về nó, hãy dùng nó ngay. Hãy tạo nên càng nhiều app nhỏ càng tốt. Dưới đây là một số gợi ý cho bạn:
Ứng dụng các command mà bạn dùng trên bash, ví dụ ứng dụng function ls
Viết một command để fetch và lưu các post reddit trên /r/programming dưới dạng file JSON
Viết một command cung cấp directory structure dưới dạng format JSON ví dụ jsonify dir-name cho ra file JSON có structure bên trong dir-name
Viết một command đọc JSON của bước trên và tạo ra directory structure
Nghĩ một vài task hằng ngày của mình và automate chúng
Bước 3 — Học Package Manager
Một khi đã học được những cái cơ bản của một ngôn ngữ và tại nên một vài app mẫu, hãy học cách dùng package manager ngôn ngữ đó. Các package manager sẽ giúp bạn dùng các thư viện ngoài và phân phối các thư viện cho người khác dùng.
Nếu bạn chọn PHP thì bạn có thể học về Composer, Node.js sẽ có NPM hoặc Yarn, Python có Pip và Ruby có RubyGems. Dù cho bạn chọn cái nào đi nữa, hãy cứ tiếp tục và học về package manager.
Bước 4 — Các tiêu chuẩn và Best Practices
Mỗi ngôn ngữ có những tiêu chuẩn riêng và best practices (cách làm tốt nhất). Hãy tìm ra và học hỏi từ nó. Ví dụ, PHP có PHP-FIG và PSRs. Với Node.js sẽ có rất nhiều hướng dẫn phục vụ cộng đồng cũng như nhiều ngôn ngữ khác.
Hãy nhớ đọc về các best practices trong mảng bảo mật. Đọc OWASPguidelines để hiểu về nhiều vấn đề bảo mật khác nhau và cách phòng tránh nó đối với từng ngôn ngữ mà bạn chọn.
Bước 6 — Thực hành thêm nữa
Sau những nền tảng cơ bản, tiêu chuẩn và best practice, bảo mật cũng như cách dùng package manager, bây giờ là lúc tự tạo nên một package và phân phối nó đi cho người khác dùng, nhớ follow các tiêu chuẩn và best practices đã học. Ví dụ như, nếu bạn chọn PHP, bạn có thể release nó trên Packagist, còn nếu chọn Node.js thì release trên Npm registry,…
Sau khi đã xong, bạn có thể search thêm một số project trên Github và mở một số pull request trong các projects. Dưới đây là một vài gợi ý cho bạn:
Refactor và ứng dụng những best practice mà bạn học được
Xem các vấn đề mở và thử giải quyết nó
Add thêm một số functionality
Bước 7 — Học thêm về Testing
Hiện có rất nhiều kiểu test, mục tiêu đó là phải hiểu rõ các loại này là gì. Nhưng trước mắt hãy cách viết Unit Test và Integration test cho app trước đã. Đồng thời hãy tìm hiểu thêm về các phương pháp testing như mocks, stubs,…
Bước 8 — Thực tế
Hãy viết thử unit test cho một số task thực tế mà bạn đã làm, đặc biệt là những cái bạn đã làm ở Bước 6.
Đồng thời nhớ tính toán thử mức độ cover của các test đã viết.
Bước 9 — Học về Relational Database
Làm thế nào để bảo toàn data trên relational database (dữ liệu quan hệ). Trước khi bạn lựa chọn tool để học, hãy tìm hiểu trước về các phương pháp database terminologies khác nhau như các key, index, normalization, tuple, v.v
Có rất nhiều sự lựa chọn, tuy nhiên nếu bạn học một cái rồi, thì những cái còn lại sẽ trở nên dễ hơn. Một trong những cái lý tưởng để bắt đầu đó là MySQL, MariaDB (khá giống nhau và là một mảnh của MySQL) và PostgreSQL. Pick MySQL.
Bây giờ bạn sẽ đem tất cả những thứ bạn đã học ra để sử dụng. Tạo nên một ứng dụng đơn giản, bất cứ idea nào, ví dụ một ứng dụng viết blog, rồi áp dụng các feature dưới đây:
User Account — Đăng ký và Đăng nhập
Những user đã đăng ký có thể tạo các bài blog
User có thể xem tất cả các bài blog mà mình đã viết
User có thể xoá bài blog
User chỉ xem được blog của mình chứ không xem của người khác được
Viết các unit/integration test cho app
Bạn có thể áp dụng index cho các query. Phân tích queries để biết chắc là các index đang hoạt động
Bước 11 — Học một Framework
Tuỳ vào project và ngôn ngữ mà bạn chọn thì bạn có thể cần hoặc không cần đến framework. Mỗi ngôn ngữ có rất nhiều lựa chọn, hãy tìm hiểu và xem xem ngôn ngữ của bạn có gì và chọn một cái liên quan.
Nếu bạn chọn PHP, tôi đề xuất bạn nên dùng Laravel hoặc Symfony hoặc đối với các framework nhỏ thì bạn có thể dùng Lumen hoặc Slim. Nếu bạn chọn Node.js thì cũng có rất nhiều lựa chọn nhưng cái mạnh nhất đến nay đó là Express.js.
Bước 12 — Thời gian thực hành
Để thực hành bước này, hãy convert app và bạn đã làm ở Bước 10 để áp dụng framework mình đã chọn. Nhớ port mọi thứ kể cả các test nhé.
HTML and CSS code developing screenshot. Abstract web site source listing on black background with colored syntax
Bước 13 — Học NoSQL Database
Đầu tiên hãy tìm hiểu nó là cái gì, chúng khác dữ liệu quan hệ chỗ nào và tại sao cần dùng đến nó. Có rất nhiều sự lựa chọn, chỉ cần tìm kiếm một chút và so sánh các feature sẽ thấy được sự khác nhau. Một số option phổ biến gồm có MongoDB, Cassandra, RethinkDB và Couchbase. Nếu phải chọn một thì bạn nên chọn MongoDB.
Bước 14 — Caching
Hãy tìm hiểu cách ứng dụng app level caching cho ứng dụng của mình. Hiểu được cách sử dụng mà bạn đã build ở Bước 12.
Bước 15 — Tạo các RESTful API
Tìm hiểu về REST và học cách tạo ra các RESTful API và nhớ đọc về REST trong bài viết gốc của Roy Fielding, để cứ hễ ai bảo REST chỉ dành cho HTTP API là bạn sẽ có thể sửa lưng họ ngay.
Bước 16 — Học các Auth Method khác nhau
Bạn cần phải biết chúng là gì, sử dụng thế nào và cái này khác cái kia ở chỗ nào
OAuth — Open Authentication
Basic Authentication
Token Authentication
JWT — JSON Web Tokens
OpenID
Bước 17 — Các Message Broker
Cũng có nhiều lựa chọn cho bạn nhưng có 2 cái nổi bật hơn đó là RabbitMQ và Kafka. Nếu phải chọn một thì nên hãy học RabbitMQ trước.
Bước 18 — Công cụ Search
Khi app đã bắt đầu phát triển, các query đơn giản dù cho trên dữ liệu quan hệ hay dữ liệu NoSQL sẽ không từ cắt ra và bạn sẽ phải resort riêng công cụ search. Bạn nên cân nhắc tuỳ nhu cầu, vì có rất nhiều option và mỗi option đều có những điểm đặc biệt riêng.
Bước 19 — Học cách dùng Docker
Docker có thể giúp bạn rất nhiều trong quá trình lập trình ứng dụng, không chỉ tạo lặp một môi trường tương tự khi produce, giữ cho hệ điều hành luôn sạch sẽ hoặc thúc đẩy code, test và deploy. Tôi sẽ cho bạn một câu hỏi để tìm hiểu và tự trả lời cho mình “Nó sẽ giúp tôi bằng cách nào?”. Cứ thế hãy tìm hiểu và học cách dùng Docker.
Bước 20 — Trau dồi kiến thức về các Web Server
Nếu đã đến bước này, bạn chắc chắn đã phải tiếp xúc với nhiều server. Lúc này chủ yếu bạn sẽ tìm điểm khác nhau giữa các web server, hiểu được những giới hạn và các configuration option có sẵn cũng như cách viết app để tối ưu hoá các giới hạn này.
Bước 21 — Học cách dùng Web Socket
Mặc dù không bắt buộc, có thêm kiến thức này có thể giúp ích cho bạn rất nhiều. Tìm hiểu xem cách viết web app real-time và một số app mẫu bằng web-socket, bạn có thể dùng nó trên blog application để ứng dụng các update real-time trên blog posts listing.
Bước 22 — Học GraphQL
Hiểu rõ nó khác chỗ nào REST và tại sao lại gọi nó là REST 2.0.
Bước 23 — Xem các biểu đồ dữ liệu
Các Biểu đồ đồ thị sẽ giúp bạn linh hoạt hơn khi xử lý data, cũng như cung cấp cho bạn nguồn lưu trữ nhanh chóng và hiệu quả để dễ thu hồi hoặc query nó. Học thêm về Neo4j or OrientDB.
Bước 24 — Không ngừng khám phá thêm
Một khi bạn đã bắt tay vào học và làm, chắc chắn bạn sẽ vấp phải thêm nhiều thứ mà chúng tôi chưa liệt kê hết trên đây. Hãy luôn ở trong tâm lý mở không ngại học cái mới, vì kết quả thế nào là do bạn chọn.
Hi vọng thông tin trên đây đã có thể làm rõ thắc mắc của bạn về Backend Developer là gì cũng như lộ trình trở thành Backend Developer. Mọi thông tin đều mang tính tham khảo, bạn hãy tìm hiểu thật kỹ và đưa ra lộ trình phù hợp với bản thân nhé. Điều quan trọng là hãy đam mê và thật kiên trì.
Anh em có thể tham khảo thêm về Devops và các kỹ năng khác:
Năm 2023 là một năm đầy khó khăn của kinh tế thế giới khi phải đối mặt với những tác động của đại dịch Covid-19, suy thoái kinh tế và chiến tranh Nga – Ukraine. Tuy nhiên, đứng trước bối cảnh rối ren của nền kinh tế thế giới, ngành CNTT vẫn có những chuyển biến tích cực với sự đẩy nhanh của quá trình chuyển đổi số và các công nghệ liên quan đến AI.
Việt Nam cũng không ngoại lệ, sự đầu tư mạnh mẽ vào công nghệ của các doanh nghiệp cũng như nhu cầu nhân lực CNTT ngày càng tăng đã cho thấy tín hiệu tích cực của toàn ngành trong tương lai. Và để đón đầu được xu hướng phát triển tiếp theo của ngành CNTT, Báo cáo thị trường IT Việt Nam 2023 do TopDev phát hành đã chỉ ra Top 6 công việc IT phát triển nhanh nhất, giúp bạn đánh giá được thị trường một cách tổng quan và chính xác.
Top công việc IT phát triển nhanh tại Việt Nam
Dưới đây là top các công việc IT phát triển nhanh tại Việt Nam năm 2023 dựa theo Báo cáo thị trường IT Việt Nam của TopDev.
Data Scientist
Data Scientist sử dụng các kỹ năng kỹ thuật và phân tích để xác định các mẫu, xử lý dữ liệu và rút ra kết luận có giá trị. Họ nhận ra các giải pháp đúng đắn bằng cách kết hợp kiến thức lý thuyết và ngành, những hiểu biết theo ngữ cảnh và sự hoài nghi về các giả định đã được thiết lập.
Nhu cầu về Data Scientist đang tăng cao do sự phát triển của công nghệ dữ liệu và trí tuệ nhân tạo. Các doanh nghiệp đang ngày càng tích lũy một lượng lớn dữ liệu, và họ cần Data Scientist để giúp họ phân tích dữ liệu này để đưa ra các quyết định kinh doanh hiệu quả hơn.
Một số kỹ năng Data Scientist bao gồm: thuật toán Machine Learning, tạo mô hình dữ liệu, ngôn ngữ lập trình như Python và R, xác định các vấn đề kinh doanh để cung cấp các giải pháp phù hợp.
Mức lương của Data Scientist theo cấp bậc:
Level 1 – Basic $1.560
Level 2 – Intermediate $2.090
Level 3 – Advanced $2.381
Devops Engineer
DevOps Engineer là một trong những vị trí được tuyển nhiều nhất trong những năm gần đây. DevOps Engineer là người giám sát các quy trình coding, scripting và phát triển. Họ cũng phụ trách nhóm phát triển phần mềm tham gia vào các hoạt động triển khai và mạng.
Nhu cầu về DevOps Engineer cũng đang tăng cao do sự phát triển của công nghệ đám mây và tự động hóa. Các doanh nghiệp đang chuyển đổi sang các mô hình phát triển và vận hành dựa trên đám mây, và họ cần DevOps Engineer để giúp họ thực hiện quá trình chuyển đổi này.
Một số kỹ năng DevOps Engineer bao gồm: Ngôn ngữ lập trình, chẳng hạn như Python và R, coding & scripting, nắm bắt tốt các công cụ như Git và Jenkins, làm chủ trong Linux hoặc UNIX System, kỹ năng giao tiếp và giao tiếp tốt, hiểu biết sâu sắc về các best practice của DevOps
Cloud Architect tạo ra cấu trúc & chiến lược trên Cloud. Họ cũng phối hợp, thực hiện và triển khai các dịch vụ đám mây. Cloud Architect đảm bảo kiến trúc ứng dụng chính xác và thực hiện trên các nền tảng Cloud.
Nhu cầu về Cloud Architect cũng đang tăng cao do sự phát triển của công nghệ đám mây. Các doanh nghiệp đang ngày càng chuyển sang các giải pháp đám mây để tiết kiệm chi phí và cải thiện hiệu quả.
Một số kỹ năng của Cloud Architect bao gồm: các ngôn ngữ lập trình như Python, Ruby, Nguyên tắc cơ bản lưu trữ dữ liệu, Route 53 (DNS), CloudFront (CDN) và Virtual Private Cloud (VPC), các khuôn mẫu và công nghệ cụ thể của Cloud.
Một kỹ sư AI chịu trách nhiệm phát triển và triển khai các hệ thống và giải pháp dựa trên trí tuệ nhân tạo. Điều này liên quan đến việc thiết kế, xây dựng, đào tạo và triển khai các mô hình và thuật toán AI có thể thực hiện các tác vụ như xử lý ngôn ngữ tự nhiên, nhận dạng hình ảnh và phân tích dự đoán.
Họ phải thành thạo các ngôn ngữ lập trình như Python, Java, C++ và R, đồng thời quen thuộc với các khung phát triển phần mềm như TensorFlow, PyTorch và Keras. Ngoài ra, họ phải có kiến thức tốt về thuật toán và cấu trúc dữ liệu, cũng như kinh nghiệm phân tích dữ liệu, sắp xếp dữ liệu và trực quan hóa dữ liệu.
Mức lương của AI Engineer theo cấp bậc:
Level 1 – Basic $520 – $1.080
Level 2 – Intermediate $1.080 – $2.160
Level 3 – Advanced $2.160 – $4.320
Cybersecurity Specialist
Làm việc từ xa, internet of things (IoT) và sự di chuyển ngày càng nhiều khía cạnh trong cuộc sống của chúng ta sang miền kỹ thuật số (cũng như siêu dữ liệu) đều có tác động lớn đến những cách mà tội phạm mạng có thể khiến cuộc sống trở nên khó chịu.
Các chuyên gia an ninh mạng khai thác AI để dự đoán và chống lại các cuộc tấn công hack và DDOS, đồng thời áp dụng phương pháp tiếp cận tâm lý cần thiết để chống lại các phương pháp tiếp cận công nghệ thấp hơn dựa trên kỹ thuật xã hội. Đó là một bộ kỹ năng đa dạng và sẽ khiến bất kỳ ai cũng trở thành người hấp dẫn phù hợp với lực lượng lao động trong tương lai.
Mức lương của Cybersecurity Specialist theo cấp bậc:
Level 1 – Basic $2.072
Level 2 – Intermediate $3.180
Level 3 – Advanced $3.566
Full-Stack Developer
Full-stack Developer chịu trách nhiệm phát triển và xây dựng API bằng cách sử dụng các combo khác nhau của các tech stack và thành thạo cả back-end & front-end.
Một số kỹ năng full-stack developer bao gồm: Hiểu rõ về ngôn ngữ lập trình (MongoDB, Express.js, AngularJs và Node.js …), kiến thức về cách thiết kế và phát triển API, hiểu về các nguyên tắc phát triển web, good command trên cơ sở dữ liệu công nghệ.
Tóm lại
Trong bài viết này, chúng ta đã điểm qua những công việc IT phát triển nhanh nhất tại Việt Nam năm 2023. Đây là những công việc không chỉ đáp ứng nhu cầu ngày càng cao của thị trường công nghệ thông tin, mà còn đem lại cơ hội nghề nghiệp hấp dẫn cho các tài năng trẻ tại đất nước chúng ta.
Tuy nhiên, công nghệ càng phát triển đòi hỏi trình độ người lao động càng cao để đáp ứng những yêu cầu thay đổi liên tục của công việc. Theo báo cáo, trình độ lập trình viên Việt Nam vẫn chưa đáp ứng đủ nhu cầu và tốc độ phát triển của ngành. Vì vậy, để theo kịp mỗi người cần cải thiện kỹ năng, học tập nâng cao trình độ và khám phá những cơ hội mới trong lĩnh vực IT. Thị trường CNTT Việt Nam đang chờ đón những tài năng mới đam mê và sáng tạo.
Bài viết được sự cho phép của BBT Tạp chí lập trình
Là một lập trình viên mới bắt đầu, bạn có thể tự hỏi liệu bạn học lập trình có cần giỏi toán để viết code hay không? Trong bài viết này, tôi hy vọng sẽ xóa bỏ nghi ngờ đó.
Lập trình là một thế giới của riêng nó
Đầu tiên, tôi muốn bạn biết rằng code là một thuật ngữ rộng và nó không chỉ đề cập đến một khái niệm duy nhất. Ý tôi là, bạn có thể làm nhiều thứ với code và khả năng thực tế là vô tận. Điều đó nói rằng, đây là một số điều mà bạn có thể thực hiện với code:
Điều về toán học là chỉ có một giải pháp cho một vấn đề và dựa trên câu trả lời của bạn, bạn đúng hoặc sai.
Điều thú vị về code là có nhiều hơn một cách để giải quyết vấn đề và theo nhiều cách, bạn có thể sử dụng sự sáng tạo của mình để tìm ra giải pháp. Theo nhiều cách, học viết code cũng giống như học một ngôn ngữ mới. Ngôn ngữ lập trình có vốn từ vựng và dấu câu riêng, và tôi sử dụng chúng để yêu cầu máy tính làm những gì chúng tôi muốn.
Nó giống như yêu cầu một sự giúp đỡ từ một người bạn, trong đó có nhiều cách để làm như vậy. Sự khác biệt duy nhất là lần này, bạn của bạn là một chiếc máy tính, người rất trung thành và bạn sẽ sử dụng một ngôn ngữ khác.
Trước khi tôi tiến xa hơn, bạn đừng bỏ qua thực tế là toán học rất hữu ích và có lẽ được sử dụng rất thường xuyên hàng ngày, cho dù bạn có phải là một lập trình viên hay không.
Điều đó nói rằng, hãy suy nghĩ về thời điểm chúng ta sẽ sử dụng toán học khi chúng ta viết code. Có lẽ bạn đang suy nghĩ điều gì đó dọc theo dòng khoa học dữ liệu, học máy hoặc trí tuệ nhân tạo. Trong trường hợp bạn đã từng, bạn hoàn toàn đúng.
Phân tích dữ liệu đòi hỏi nhiều kiến thức về toán học vì khi phân tích dữ liệu, các nhà khoa học dữ liệu chạy các thuật toán toán học phức tạp trên dữ liệu để xác định các mẫu và mối tương quan trong dữ liệu.
Lập trình game là một lĩnh vực code khác sử dụng nhiều toán học. Tính thực tế của các trò chơi đến từ toán học đằng sau chúng. Tôi nghĩ tất cả chúng ta đều có thể đồng ý, rằng các trò chơi ngày nay đang bắt đầu cảm thấy thực tế hơn bao giờ hết. Dưới đây là một số nhánh toán học được sử dụng trong lập trình game.
Đại số học
Lượng giác học
Tính toán
Đại số tuyến tính
Toán học rời rạc
Toán ứng dụng
Tất nhiên, có rất nhiều lúc khác mà bạn có thể cần sử dụng toán học, nhưng tôi chỉ muốn cho bạn biết khi nào bạn cần sử dụng các khái niệm toán học nặng.
Tôi đã thấy nhiều người nói rằng bạn không cần phải biết toán học để trở thành một lập trình viên web. Mặc dù điều này đúng với hầu hết các phần, nhưng điều đó không có nghĩa là bạn có thể hoàn toàn bỏ qua toán học và mong đợi trở thành một lập trình viên web giỏi.
Ví dụ: toán học có thể được sử dụng để căn chỉnh các phần tử theo thứ tự đẹp, sử dụng CSS và nó cũng có thể được sử dụng để tạo hoạt ảnh động bằng JavaScript, chẳng hạn như mờ dần khi cuộn.
Nói cách khác, mặc dù toán học có thể không được sử dụng nhiều trong lập trình web, nhưng tôi thực sự khuyên bạn không nên bỏ qua nó.
Kết luận
Vậy tôi có cần phải giỏi toán không?
Câu trả lời cho câu hỏi này thực sự phụ thuộc vào những gì bạn dự định theo đuổi trong sự nghiệp lập trình của mình.
Tuy nhiên, nói chung, bạn không cần phải giỏi toán để trở thành một lập trình viên giỏi hoặc học cách viết code.
Chỉ cần biết những điều cơ bản của toán học sẽ thực hiện thủ thuật. Điều đó nói rằng, tôi hy vọng tôi đã xóa tan nghi ngờ của bạn về việc bạn có cần phải giỏi toán để viết code hay không.
React Hook là một “luồng gió” mà nhà phát hành React đã giới thiệu trong thời gian gần đây. Trên VNTALKING cũng có một bài viết giới thiệu về React Hook mà bạn nên đọc: React Hook là gì?
So với thời điểm mới ra mắt, hiện tại có rất nhiều thư viện hỗ trợ React Hook, giúp cho bạn phát triển dự án với React được dễ dàng hơn rất nhiều. Khi tìm kiếm trên internet về React, bạn sẽ gặp nhan nhản các từ khóa, các kỹ thuật liên quan tới “Hooks”, đây cũng là xu hướng mà chính nhà hành React cũng mong muốn như vậy. Nếu dự án của bạn chưa sử dụng Hook, có lẽ bạn nên suy nghĩ lại.
Hook giúp cho mã nguồn dự án trở nên rõ ràng, đảm bảo khả năng đọc code, khả năng bảo trì, khả năng tái sử dụng và có ít dòng mã hơn. Đây đều là những yếu tố rất quan trọng trong quá trình phát triển React.
Vì vậy trong blog này, mình sẽ giới thiệu cho bạn 10 thư viện React Hook hàng đầu mà bạn nên bắt đầu sử dụng ngay lập tức. Không để chậm trễ hơn nữa, chúng ta hãy bắt đầu tìm hiểu 10 thư viện đó nào.
1. Use-http
Use-http là một thư viện cực kì hữu ích được sử dụng để thay thế cho Fetch API. Được xây dựng và bảo trì với chất lượng cao, nó làm cho việc viết mã của bạn trở nên đơn giản và dễ hiểu hơn nhiều với sự chú trọng đặc biệt vào phần xử lý dữ liệu. Bản thân hook sử dụng TypeScript và thậm chí còn hỗ trợ SSR và GraphQL. Nó trả về một response, loading, error data và các phương thức yêu cầu khác nhau như Get, Post, Put, Patch và Delete.
Bạn đã bao giờ cần phải theo dõi các câu truy vấn CSS media query?
useMedia Hook cung cấp một cách tiếp cận đơn giản để giải quyết cho vấn đề này. Media queries thực sự quan trọng trong các ứng dụng cần khả năng hiển thị responsive, tức là ứng dụng web hiển thị đẹp trên nhiều kích thước màn hình khác nhau
Được viết bằng TypeScript, nên Hook này đương nhiên sẽ hỗ trợ Typescript. Đặc biệt, thư viện này có nguồn tài liệu hướng dẫn rất đầy đủ và rõ ràng, nên bạn hoàn toàn yên tâm tích hợp hook nào vào ứng dụng.
Ví dụ cách sử dụng:
import useMedia from 'use-media';const Example =()=>{ const isWide = useMedia({minWidth:'1000px'}); return( <span> Screen is wide:{isWide ?"WideScreen":"NarrowScreen"} </span> );};
Constate là một hook package cung cấp khả năng nâng local stage dựa lên React Context.
Điều này có nghĩa là bất kỳ state nào từ bất kỳ component nào cũng có thể dễ dàng được nâng lên Context chỉ với một dòng code đơn giản. Điều này rất hữu ích trong trường hợp bạn muốn sử dụng cùng một state ở nhiều vị trí hoặc cung cấp cùng một state cho nhiều component. Cái tên này xuất phát từ một cách chơi chữ kết hợp giữa Context và State.
Thư viện này được viết bằng TypeSript và có kích thước rất nhỏ. Tài liệu không quá chi tiết nhưng nó đủ giúp bạn hoàn thành công việc.
import React,{ useState } from "react";import constate from "constate";// custom hookfunction useCounter(){ const[count, setCount]= useState(0); const increment =()=> setCount(prevCount => prevCount +1); return{ count, increment };}// hook passed in constateconst[CounterProvider, useCounterContext]= constate(useCounter);function Button(){ // use the context const{ increment }= useCounterContext(); return<button onClick={increment}>+</button>;}function Count(){ // use the context const{ count }= useCounterContext(); return<span>{count}</span>;}function App(){ // wrap the component with provider return( <CounterProvider> <Count /> <Button /> </CounterProvider> );
Redux là một công cụ nổi tiếng đối với nhiều nhà phát triển React, nếu không muốn nói là tất cả. Nó được sử dụng như một trình quản lý global state trong toàn bộ ứng dụng.
Redux đã đi vào hoạt động với những ưu điểm hấp dẫn chỉ trong một vài tháng sau khi phát hành lần đầu tiên của React. Redux cung cấp một giải pháp thay thế cho mẫu HOC (Higher Order Component) với phương thức connect() được xây dựng sẵn
Các hook đáng chú ý nhất được cung cấp là:
useSelector
useDispatch
useStore
Tài liệu này có một chút phức tạp nhưng nó khá tốt, nó sẽ cung cấp cho bạn mọi thông tin cần thiết để bắt đầu sử dụng chúng.
import{useSelector, useDispatch} from "react-redux";import React from "react";import*as actions from "./actions";const Example =()=>{const dispatch = useDispatch()const counter = useSelector(state => state.counter)return(<div> <span> {counter.value} </span> <button onClick={()=> dispatch(actions.incrementCounter)}> Counter +1 </button></div>);}
5. React hook form
React hook form là một thư viện form hook tương tự như biểu mẫu Formik và Redux, nhưng tốt hơn. Với cú pháp đơn giản, tốc độ nhanh, render ít hơn và khả năng bảo trì tốt hơn, nó bắt đầu leo lên các bảng xếp hạng trên GitHub.
React hook form có kích thước nhỏ và được xây dựng với đặc biệt chú trọng về hiệu suất. Thư viện còn cung cấp một công cụ form builder tuyệt vời. Và nó có một trong những repo về React có lượng star lớn trên GitHub – 14,8k.
import React from "react";import{ useForm } from "react-hook-form";function App(){ const{ register, handleSubmit, errors }= useForm(); const onSubmit =(data)=>{ // logs {firstName:"exampleFirstName", lastName:"exampleLastName"} console.log(data); }; return( <form onSubmit={handleSubmit(onSubmit)}> <input name="firstName" ref={register}/> <input name="lastName" ref={register({ required:true})}/> {errors.lastName&&<span>"Last name is a required field."</span>} <input name="age" ref={register({ required:true})}/> {errors.age&&<span>"Please enter number for age."</span>} <input type="submit"/> </form> );}
6. useDebounce
useDebounce là một hook nhỏ được sử dụng cho mục đích hỗ trợ debug. Hook này được sử dụng để trì hoãn việc thực thi chức năng, và nó cũng thường được sử dụng trong các input trong form nơi dùng để nhập dữ liệu.
useLocalStorage là một hook nhỏ giống như cái ở trên. Nó thực sự hữu ích để giải nén và thiết lập dữ liệu bên trong localStorage. Với hook này, manipulation được thực hiện dễ dàng.
Hook cung cấp JSON serialization và đồng bộ hóa JSON tự động trên nhiều tab và được viêt bằng TypeScript nên nó cung cấp nhiều type.
Tài liệu được viết một cách chất lượng và khá dễ hiểu với nhiều ví dụ.
import React,{ useState } from "react";import{ writeStorage } from '@rehooks/local-storage';exportdefaultfunction Example(){ let counter =0; const[counterValue]= useLocalStorage('counterValue'); return( <div> <span>{counterValue}</span> <button onClick={()=> writeStorage('i',++counter)}> Click Me </button> </div> );}
8. usePortal
usePortal giúp việc tạo dropdowns, modals, notification popups, tooltips… cực kì dễ dàng! Nó cũng cho phép tạo các phần tử bên ngoài hệ thống phân cấp DOM của ứng dụng (để tìm hiểu cách Portals hoạt động, bấm vào đây ).
Hook này làm việc với cả SSR (Server Side Rendering). Nó được viết bằng TypeScript và có một built-in state. Đối với các chức năng, nó cung cấp tùy chỉnh đầy đủ về styling portal và rất nhiều tùy chọn khác.
Tài liệu được viết khá tốt – đặc biệt là có sẵn nhiều ví dụ minh họa sẽ là quá đủ để bắt đầu tự sử dụng thư viện/hook này đúng không!?
import React,{ useState } from "react";import usePortal from "react-useportal";const Example =()=>{const{ ref, openPortal, closePortal, isOpen, Portal }= usePortal() return( <> <button ref={ref} onClick={()=> openPortal()}> Open Portal </button> {isOpen &&( <Portal> <p> This Portal handles its own state.{' '} <button onClick={closePortal}>Close me!</button>, hit ESC or click outside of me. </p> </Portal> )} </> )}
9. useHover
useHover là React state để xác định xem một phần tử React có đang được di chuột hay không. Hook này khá trực quan và dễ sử dụng. Thư viện có kích thước nhỏ nhưng rất mạnh nếu bạn đủ sáng tạo.
Nó cung cấp độ trễ của hiệu ứng di chuột và hỗ trợ TypeScript. Tài liệu không quá chi tiết, nhưng nó sẽ chỉ cho bạn cách sử dụng nó tốt nhất.
import useHover from "react-use-hover";const Example =()=>{ const[isHovering, hoverProps]= useHover(); return( <> <span {...hoverProps} aria-describedby="overlay">Hover me</span> {isHovering ?<div> I’m a little tooltip!</div>:null} </> );}
10. React router hooks
React router là một trong những thư viện phổ biến nhất cho React. Nó được sử dụng để định tuyến và lấy lịch sử URL của ứng dụng, …
Các hook được cung cấp là:
useHistory
useLocation
useParams
useRouteMatch
Chỉ cần đọc tên hook là bạn đủ để bạn hiểu chức năng chính của nó là gì rồi đúng không?
UseHistory sẽ lấy dữ liệu về lịch sử của ứng dụng và các method, chẳng hạn như push, cái mà sẽ đẩy đến một route mới. UseLocation sẽ trả về đối tượng đại diện cho URL hiện tại. UseParams sẽ trả về một đối tượng gồm các cặp key-value của các tham số URL của route hiện tại. Và cuối cùng, useRouteMatch sẽ cố gắng khớp URL hiện tại với URL đã cho cái mà có thể là một chuỗi hoặc một đối tượng của các option khác nhau.
Tài liệu mô tả của thư viện này rất tốt và tất nhiên là có rất nhiều ví dụ minh họa trong tài liệu để bạn tham khảo.
import{ useHistory, useLocation, useRouteMatch } from "react-router-dom";const Example =()=>{let history = useHistory();let location = useLoction();let isMatchingURL = useRouteMatch("/post/11");function handleClick(){history.push("/home");}return(<div><span>Current URL:{location.pathname}</span>{isMatchingURL ?<span>Matching provided URL! Yay!</span>:null}<button type="button" onClick={handleClick}>Go home</button></div>);}
Nhiều cái hơn nữa để lựa chọn
Có rất nhiều thư viện react hook khác trên mạng, nhưng đây là những thứ mà mình cảm thấy có ích nhất cho dự án của bạn. Nếu thực sự thích chúng, hãy thử dùng ngay cho dự án.
Hy vọng bạn đã thấy bài viết này thú vị và bạn sẽ học được điều gì đó mới mẻ. Chúc bạn tìm thấy niềm vui khi khám phá thêm về các hooks.
Theo “Báo Cáo Thị Trường IT Việt Nam 2023 – Vietnam Tech Talents Report” của TopDev, hầu hết các lập trình viên đều thuộc thế hệ GenZ & Millennials. Vì vậy, việc tìm hiểu sâu về sở thích, hành vi, tương tác xã hội, và đặc điểm nhân khẩu học của họ trở nên vô cùng quan trọng đối với các nhà tuyển dụng. Điều này giúp họ điều chỉnh chiến lược tuyển dụng của mình để phù hợp với xu hướng tuyển dụng đa thế hệ hiện nay.
Cùng TopDev khám phá chân dung của lập trình viên Việt Nam năm 2023 dưới bài viết này bạn nhé!
Độ tuổi và giới tính
Độ tuổi chiếm ưu thế trên thị trường hiện nay là từ 20 đến 34 tuổi. Nhóm tuổi có tỷ lệ cao nhất là 20 – 24 tuổi (29,8%), tiếp theo là nhóm tuổi 25 – 29 (26,2%). Hiện tại, số lượng lập trình viên ở Việt Nam ở độ tuổi trẻ chiếm đa số với 56% ở độ tuổi 20 – 29 tuổi.
Điều này đã phản ánh về lực lượng lao động chủ đạo trong ngành IT những năm gần đây đa phần đến từ thế hệ GenZ & Millennials. Thế hệ này thường tìm kiếm sự cân bằng lý tưởng giữa công việc và cuộc sống, quan tâm nhiều hơn đến thông tin về công ty, và mong muốn tham gia tích cực vào quá trình phát triển sản phẩm. Vậy nên, việc xây dựng chiến lược tuyển dụng những tài năng thế hệ GenZ & Millennials là một yếu tố quan trọng các nhà tuyển dụng trong lĩnh vực IT cần tập trung.
Về sự phân hóa độ tuổi trong ngành lập trình, nam giới vẫn chiếm ưu thế trong giới tính lập trình viên hoặc người làm việc trong lĩnh vực công nghệ với 90,5%. Nữ giới chỉ chiếm tỷ lệ nhỏ 9,1% nhưng tiếp tục tăng dần kể từ khi chúng tôi ghi nhận lần đầu chỉ 5% vào năm 2017.
Gần đây, ngày càng có nhiều cơ hội mở ra cho phụ nữ bắt đầu sự nghiệp với tư cách là lập trình viên từ các chương trình giáo dục STEM cũng như khuyến khích xã hội & công nghệ với thuật ngữ phổ biến “Phụ nữ trong công nghệ”.
Công nghệ phổ biến
Theo báo cáo của TopDev, JavaScript là ngôn ngữ lập trình phổ biến nhất cùng với các kỹ năng IT khác. Trong đó Nodejs, Angular & ReactJS là 3 lựa chọn hàng đầu về Javascript framework. Lựa chọn hàng đầu để làm việc với Java lần lượt là Spring Boot/Spring rồi đến Hibernate & Struts. Không có nhiều thay đổi trong danh sách .NET/C# trong đó .NET Framework, .NET Core & ASP.NET Core đứng đầu danh sách. Laravel vẫn là framework phổ biến nhất trong nhóm công nghệ PHP với hơn 75%, tiếp theo là CodeIgniter & Symfony.
MySQL tiếp tục dẫn đầu nhóm công nghệ SQL với hơn 58%. Django, Falcon & Pyramid là 3 lựa chọn hàng đầu liên quan đến ngôn ngữ lập trình Python. Về lập trình di động. Java, Swift & Flutter là những lựa chọn phổ biến. Trong số các lựa chọn công nghệ đám mây, AWS vẫn chiếm ưu thế với hơn 35%, tiếp theo là Azure, VMWare, Firebase & GCP.
Công nghệ & sở thích
Theo Báo Cáo Thị Trường IT Việt Nam 2023, các công nghệ lập trình viên muốn làm việc/học nhất lần lượt là:
#1. Artificial Intelligence & Machine Learning
Công nghệ AI/ML đang có nhu cầu cao và các lập trình viên tận dụng chúng cho các nhiệm vụ như xử lý ngôn ngữ tự nhiên, thị giác máy tính và phân tích dự đoán. Các framework phổ biến bao gồm TensorFlow, PyTorch, Caffe & Keras.
#2: Cloud Computing/ AWS
Các nền tảng đám mây như AWS, Microsoft Azure và Google Cloud được sử dụng rộng rãi để xây dựng các ứng dụng linh hoạt và có thể mở rộng. Các lập trình viên tìm hiểu kiến trúc, triển khai và quản lý đám mây.
#3: Full-Stack Development
Phát triển toàn diện bao gồm làm việc với cả công nghệ frontend và backend để xây dựng các ứng dụng web hoàn chỉnh. Các tech stack phổ biến bao gồm các frameworks/ libraries dựa trên JavaScript như React.js, Angular và Node.js.
#4: DevOps
DevOps kết hợp các hoạt động phát triển và vận hành để cải thiện việc phân phối phần mềm và quản lý cơ sở hạ tầng. Các công cụ phổ biến như Docker, Kubernetes, Jenkins và Ansible được sử dụng để tự động hóa các quy trình và đạt được sự tích hợp/triển khai liên tục.
Đối với IDE & code editor, các lập trình viên đa số lựa chọn sử dụng Visual Studio Code và Visual Studio với tỉ lệ lần lượt là 55,2% và 53,4%. Tiếp theo đó là Android Studio với 38,1% và Eclipse 30,1%. Bên cạnh đó, số đông lập trình viên đang dần chuyển sang các nền tảng AI để tìm kiếm thông tin, một số công cụ tìm kiếm AI được ưu chuộng như: Chat GPT, Poe Quora AI, Bing AI, Google Bard,…
Hành vi của lập trình viên
Dựa trên số liệu báo cáo cung cấp, hơn 60% lập trình viên sử dụng tài liệu chính thức cũng như các nguồn Youtube làm cách học và tiếp cận công nghệ mới chính. Tiếp theo là các khóa học trực tuyến dựa trên video (42,1%) & dự án cá nhân (27,5%) là những cách tiếp cận công nghệ mới phổ biến. Sách công nghệ, dự án nguồn mở, khóa học tương tác trực tuyến, khóa học ngoại tuyến và cuộc thi viết mã là những phương pháp khác để học công nghệ mới nhưng mức độ phổ biến và khả năng ứng dụng được coi là không tốt bằng các phương pháp khác.
Lập trình viên học ngôn ngữ / công nghệ lập trình mới như thế nào?
Ngoài ra, để cập nhật các xu hướng và tin tức công nghệ mới nhất, 73,5% lập trình viên đọc blog công nghệ và 45,1% theo dõi các Tech Fanpages công nghệ. Cách thức cập nhật tin tức qua nền tảng video đang được ưa chuộng, các kênh video trên Youtube & Tiktok mang đến nhiều cách thức tiếp cận tin tức công nghệ mới cho các lập trình viên thông qua định dạng video và tương tác.
Lập trình viên cập nhật tin tức công nghệ như thế nào?
Việc nắm bắt được hành vi của các lập trình viên giúp nhà tuyển dụng dự đoán được đối tượng mục tiêu của họ đang ở đâu. Lên kế hoạch để khai thác các nền tảng, tìm kiếm ứng viên ở những nơi họ thường lui tới sẽ giúp việc tuyển dụng hiệu quả, tiết kiệm ngân sách và thời gian đáng kể.
Lời kết
Hiện nay, Việt Nam đang chứng kiến một làn sóng đầu tư mạnh mẽ vào lĩnh vực Công nghệ thông tin, không chỉ từ các doanh nghiệp trong nước mà còn có sự tham gia đáng kể của các công ty nước ngoài. Kết quả của điều này là nhu cầu về nhân lực trong lĩnh vực Công nghệ thông tin tại Việt Nam đã liên tục tăng cao trong suốt 5 năm gần đây. Do đó, việc hiểu rõ hơn về hình ảnh và khả năng của nguồn nhân lực IT tại Việt Nam là điều rất quan trọng đối với các nhà tuyển dụng, để họ có thể xây dựng những chiến lược tuyển dụng phù hợp với nhu cầu và mục tiêu của công ty mình.
Trong thời đại công nghệ ngày càng phát triển, vai trò của lập trình viên trở nên ngày càng quan trọng và thu hút sự quan tâm của nhiều người trẻ tại Việt Nam. CNTT đã trở thành một nghề hot, không chỉ vì nhu cầu thị trường và thách thức mà nó mang lại, mà còn bởi tiềm năng tài chính to lớn trong tương lai.
Năm 2023, với sự bùng nổ của ngành công nghệ thông tin và phần mềm tại Việt Nam, mức lương của lập trình viên đang là một chủ đề được quan tâm hàng đầu. Với Báo Cáo Thị Trường IT Việt Nam 2023 – Vietnam Tech Talents Report của TopDev, sẽ cho chúng ta thấy bức tranh tổng thể về mức lương của toàn ngành, cũng như biết được những công nghệ, ngôn ngữ lập trình nào đang được săn đón với đãi ngộ hấp dẫn.
Tổng quan về mức lương lập trình viên 2023
Theo Báo Cáo Thị Trường IT Việt Nam 2023 của TopDev, mức lương bình quân năm nay không thay đổi nhiều so với năm ngoái (lương trung bình $1.311) và tốc độ tăng trưởng so với cùng kỳ năm trước chỉ ở mức 0,7%.
Do tình hình kinh tế toàn cầu, hầu hết các doanh nghiệp đều rơi vào tình trạng khó khăn với nhiều vấn đề liên quan đến dòng tiền, mở rộng và tăng trưởng kinh doanh. Vì vậy, chi phí nhân công – một trong những chi phí vận hành chiếm tỷ trọng lớn nhất trong doanh nghiệp – sẽ được xem xét tối ưu hóa trước hết để đảm bảo ổn định tài chính. Tuy nhiên, mức lương bình quân của các vị trí liên quan đến CNTT vẫn cao hơn so với các ngành khác.
Bên cạnh đó, tùy vào địa điểm khác nhau sẽ có nhu cầu và mức lương khác nhau. Cụ thể, tại TP.HCM, tỉ lệ tuyển dụng lập trình viên có mức lương $1.100 – $1.500 ở mức cao nhất 39,6%. Còn tại Hà Nội, tỉ lệ tuyển dụng lập trình viên có mức lương $600 – $1.000 và $1.100 – $1.500 lại khá tương đồng với nhau (37,7% và 36,7%). Điều này đã phản ánh về điều kiện kinh tế, thị trường việc làm cũng như nhu cầu khác nhau giữa từng khu vực.
Mức lương lập trình viên theo công nghệ
Theo số liệu từ báo cáo, hầu hết các vị trí CNTT đều bắt đầu sự nghiệp với mức lương không có sự chênh lệch quá lớn. Nhưng sau 2 năm đầu tiên trong sự nghiệp, mô hình lương sẽ đi theo hướng khác liên quan đến công nghệ và có thể bị ảnh hưởng rất nhiều từ thị trường việc làm, tình hình kinh tế và các yêu cầu kinh doanh mới nổi.
Nhìn chung, hầu hết các nhóm công nghệ cơ bản như Java, Python, .NET, C++ & PHP vẫn được coi là được trả lương cao liên tục qua nhiều năm. Các kỹ năng công nghệ cao mới như liên quan đến Đám mây/ AI/ ML/ DevOps đang được đầu tư nhiều hơn với mức lương cao hơn với tác động to lớn của các ứng dụng trong thế giới thực hiện nay về Điện toán đám mây, AI sáng tạo và quy trình phát triển hiện đại.
Mức lương lập trình viên theo trình độ
Mức lương thường tăng lên khi người lao động thăng tiến trong các cấp bậc công việc, kinh nghiệm cùng với thâm niên. Có sự khác biệt đáng kể về mức lương giữa các cấp bậc công việc. Các cấp độ Leader/ Manager và Director/ Architect có mức lương cao nhất, phản ánh trách nhiệm và chuyên môn ngày càng tăng cần thiết cho các vị trí này.
Theo báo cáo thị trường IT của TopDev, ở vị trí Fresher (dưới 1 năm kinh nghiệm), trung bình nhận mức lương từ $435 đến $514. Sau 2 năm làm việc trong ngành IT, tốc độ tăng lương có vẻ nhanh hơn 2 năm đầu khi các lập trình viên đã tích lũy được một số kiến thức nền tảng & kinh nghiệm làm việc. Khi đạt đến cấp Director/ Architect, mức lương trung bình một người có thể nhận được vượt qua $2.000 và có thể lên đến $2.700.
Mức lương lập trình viên theo vị trí
Theo dự đoán của các báo cáo trước, các vị trí được trả lương cao nhất đòi hỏi các kỹ năng đặc biệt như Data Analyst, Cloud, DevOps, Machine Learning hoặc AI. Do tác động của Covid-19 dẫn đến nhu cầu chuyển đổi số của doanh nghiệp, từ đó Cloud Service & DevOps đã đóng vai trò quan trọng hơn trong việc duy trì và phát triển doanh nghiệp. Do đó, nhu cầu về kỹ sư Cloud/DevOps đã tăng lên đáng kể, kéo theo đó là những vị trí liên quan sẽ tăng mức lương.
Các vị trí liên quan đến khả năng quản lý như Tech Management (CTO/CIO), Technical Director/ Engineering Manager vẫn sẽ giữ mức lương cao nhất (Tech Management $5,950 và Technical Director /Engineering Manager $4.290). Cùng với đó, một số vị trí khác liên quan đến việc hỗ trợ như IT Helpdesk, Technician, Tester, QA/QC giữ mức lương dưới $1000.
Như vậy, mức lương của lập trình viên tại Việt Nam trong năm 2023 không chỉ phụ thuộc vào kỹ năng và kinh nghiệm cá nhân, mà còn phụ thuộc vào công nghệ, trình độ, vị trí công việc và nhiều yếu tố khác nữa. Với những nội dung & số liệu mà Báo Cáo Thị Trường IT Việt Nam 2023 mang lại đã cho thấy rằng ngành công nghệ thông tin ở Việt Nam vẫn đang trong giai đoạn phát triển mạnh mẽ, tạo cơ hội lớn cho các lập trình viên.
Điều quan trọng là lập trình viên cần luôn nâng cao kỹ năng, không ngừng học hỏi và cập nhật kiến thức để duy trì sự cạnh tranh trên thị trường lao động ngày càng cạnh tranh. Ngoài ra, tìm hiểu kỹ về công ty mình muốn làm việc để có thể thương lượng lương tốt nhất.
Suy thoái kinh tế và những dư chấn sau đại dịch là một trong các thách thức lớn nhất của ngành Công nghệ thông tin trong năm 2023. Ngành công nghệ đang phải đối mặt với các vấn đề xung quanh chuỗi cung ứng, lực lượng lao động, an ninh mạng bên cạnh cuộc đua công nghệ số đang ngày càng gay gắt.
Đứng trước vô vàn thách thức, các công ty công nghệ đã có những chuyển biến mạnh mẽ để đứng vững giữa thị trường đầy biến động. Song song với đó, các lập trình viên cũng tích cực thay đổi, nắm bắt thời cơ và trau dồi tri thức để đáp ứng những nhu cầu ngày càng khắt khe của doanh nghiệp.
Vậy suy thoái kinh tế đã ảnh hưởng như thế nào đến ngành CNTT? Các doanh nghiệp công nghệ và người lao động đã làm gì để “sống khỏe” trong giai đoạn này?
Suy thoái kinh tế khiến nhiều doanh nghiệp “điêu đứng”
Theo Vietnam IT Market Report 2023 – Vietnam Tech Talents Report do TopDev phát hành, lĩnh vực thông tin và truyền thông đạt doanh thu hơn 1,6 triệu tỷ đồng (69 tỷ USD) từ đầu năm đến nay, giảm 8,66% so với cùng kỳ năm ngoái. Sự sụt giảm này là do kinh tế toàn cầu gặp khó khăn khi suy thoái kinh tế ở nhiều nước vẫn chưa giảm bớt, dẫn đến thị trường tiêu thụ sản phẩm CNTT yếu. Xung đột Ukraine và đại dịch Covid-19 cũng ảnh hưởng đến lĩnh vực này, khiến xuất khẩu CNTT của Việt Nam sụt giảm.
Doanh thu ITC 2016 – 2023
Sự giảm tốc này đã ảnh hưởng ít nhiều đến kế hoạch ngân sách đầu tư và chi tiêu của các doanh nghiệp công nghệ trong năm nay. Các doanh nghiệp phải suy nghĩ nhiều hơn về việc phải làm thế nào để giảm chi phí, tăng hiệu quả và tăng doanh thu. Điều này đã ảnh hưởng trực tiếp đến lực lượng lao động khi nhiều doanh nghiệp đã tiến hành cắt giảm nhân sự làm hàng trăm ngàn nhân viên mất việc.
Biến thách thức thành cơ hội
Đối với doanh nghiệp
Trong 6 tháng đầu năm 2023, mặc dù doanh thu của ngành CNTT đang trên đà giảm, xuất khẩu phần mềm vẫn là một điểm sáng, vì một số doanh nghiệp duy trì tăng trưởng tốt ở một số thị trường nước ngoài. Chi tiêu trong lĩnh vực phần mềm toàn cầu vào năm 2023 – 2024 sẽ phát triển mạnh mẽ. Đây chính là điểm sáng cho các doanh nghiệp phần mềm và dịch vụ công nghệ thông tin tập trung khai thác.
Cùng với đó, để giải quyết tình trạng quỹ lương eo hẹp và yêu cầu hoạt động kinh doanh ngày càng cao, các doanh nghiệp đã thu hẹp kế hoạch tuyển dụng trong năm 2023 với số lượng tuyển dụng mới giảm đáng kể. Gần 90% công ty có kế hoạch tuyển ít hơn 50 lập trình viên trong năm nay trong khi con số này của năm ngoái chỉ là 75%. Các doanh nghiệp đã đẩy mạnh tuyển dụng nhân sự chất lượng cao và giàu kinh nghiệm như là một cách để quản lý chi phí và duy trì hiệu suất trong thời điểm khó khăn.
Ngoài ra, đây là thời điểm để các doanh nghiệp xem xét lại về các kế hoạch đầu tư cho công nghệ mới. Bởi việc đầu tư tràn lan vào công nghệ trong khi không hiểu rõ mục đích, dẫn đến việc tích lũy những thứ không cần thiết, lãng phí ngân sách.
Đối với lập trình viên
Mặc dù đối mặt với tình hình suy thoái kinh tế nhưng nhu cầu nhân lực IT tại Việt Nam vẫn còn rất cao. Theo số liệu từ TopDev, giai đoạn năm 2023 – 2025, Việt Nam vẫn sẽ thiếu hụt từ 150.000 đến 200.000 lập trình viên/kỹ sư hàng năm. Cùng với đó là những chính sách, thúc đẩy đầu tư/phát triển cho ngành CNTT của Đảng và nhà nước giúp cánh cửa tìm kiếm việc làm ngành CNTT ngày càng rộng mở.
Tuy nhiên, vấn đề trình độ có tay nghề cao là một trong những điểm hạn chế của nhân sự IT Việt Nam. Lao động tay nghề cao chỉ chiếm khoảng 11,67% gần như không thay đổi so với 3 năm trước. Đây là một thách thức đòi hỏi các lập trình viên phải nâng cao năng lực chuyên môn, cải thiện khả năng ngoại ngữ và nhiều kỹ năng quan trọng khác để đáp ứng cho yêu cầu ngày càng cao của doanh nghiệp.
Bên cạnh đó, các lập trình viên cần nắm bắt nhu cầu, thị hiếu của khách hàng để lựa chọn hướng đi cho phù hợp. Cụ thể, với sự phát triển mạnh mẽ của các ngành như trí tuệ nhân tạo, big data, thực tế ảo, thương mại điện tử,… đã kéo theo nhu cầu lớn về nguồn nhân lực có chuyên môn. Nếu nhạy bén “nắm thóp” được thị trường, các nhân sự công nghệ có thể có được công việc tốt với mức lương khủng lên đến hơn $2.000.
Tóm lại
Suy thoái kinh tế là vấn đề chung mà chúng ta cần phải vượt qua. Song hành cùng với những thách thức đó chính là những cơ hội, bước đệm để chúng ta vươn xa hơn trong tương lai. Ngành công nghệ thông tin vẫn sẽ nắm vai trò chủ đạo của nền kinh tế quốc gia, với trí lực và sự bản lĩnh, Việt Nam sẽ tìm được hướng đi đúng đắn để chuyển mình mạnh mẽ vượt qua “tâm bão” lần này.
Báo cáo năm 2023 về thị trường và nhu cầu nhân sự IT do TopDev phát hành đã được đăng tải, độc giả tìm hiểu thêm về xu hướng các ngành Công nghệ trong nước qua bản Vietnam IT Market Report tại đây.
Việt Nam đã và đang nổi lên như một nhân tố chủ chốt trong bối cảnh công nghệ toàn cầu, thu hút đầu tư đáng kể và thúc đẩy tăng trưởng nhanh chóng trong những năm gần đây. Trong bối cảnh nền kinh tế quốc gia đang phục hồi và phát triển, quan hệ hữu nghị, hợp tác song phương và đa phương với các nước phát triển đang là đường lối và chủ trương chiến lược của Đảng và Nhà nước. Cùng với đó, việc đầu tư áp dụng Công nghệ & Chuyển đổi số vào doanh nghiệp được phát triển mạnh dẫn đến việc Tuyển dụng nhân tài công nghệ trở thành một trong những mối quan tâm chính của các Nhà quản lý nhân sự và chủ doanh nghiệp hiện nay. Điều đó càng đặc biệt được chú trọng trong bối cảnh cán cân cung – cầu trong tuyển dụng nhân sự Công nghệ ngày càng thay đổi và trở nên cạnh tranh mạnh mẽ hơn.
Hình 1: Báo Cáo Thị Trường IT Việt Nam của TopDev năm 2023
Những thay đổi nhanh chóng sau đại dịch Covid-19 và suy thoái kinh tế toàn cầu đặt ra nhiều thách thức cho thị trường nhân sự và doanh nghiệp trong bối cảnh duy trì sự ổn định tài chính. Bên cạnh suy thoái kinh tế, cuộc Cách mạng kỹ thuật số dựa trên trí tuệ nhân tạo đặt ra nhiều thách thức nhưng mở ra nhiều cơ hội phát triển mới cho doanh nghiệp trong nước. Để có sự thích nghi với thời đại số hóa, thị trường bắt đầu yêu cầu nguồn nhân lực công nghệ có nền tảng kỹ thuật vững, tư duy kinh doanh và những chuyên môn cần thiết trong công cuộc đổi và phát triển doanh nghiệp.
Với báo cáo vừa phát hành, ông Park JongHo – CEO TopDev chia sẻ:
“Tôi tin chắc rằng những thay đổi và chuyển động lớn đang ở phía trước chúng ta. Bên cạnh suy thoái kinh tế, cuộc cách mạng kỹ thuật số và công nghệ dựa trên trí tuệ nhân tạo thay đổi nhanh chóng sau đại dịch Covid-19 đặt ra nhiều thách thức cho thị trường nhân sự. Trong làn sóng thay đổi lớn này, chúng ta sẽ phải nỗ lực để hiểu rõ hơn về doanh nghiệp và con người. Cùng với việc thay đổi công nghệ, sự hiểu biết lẫn nhau này sẽ góp phần to lớn vào sự phát triển của xã hội, ngành công nghiệp và quốc gia của chúng ta.”
1. Tổng quan tình hình ngành Công nghệ thông tin 2023
Mối quan hệ hợp tác chiến lược Việt Nam – Mỹ sau chuyến viếng thăm của Tổng thống Joe Biden trong bối cảnh nền kinh tế quốc gia đang phục hồi và phát triển đặt ra nhiều cơ hội và thách thức cho các doanh nghiệp trong nước thực hiện đầu tư và sáng tạo trong chính sách tăng cường chuyển đổi số quốc gia. Trong số các lĩnh vực kinh doanh, công nghệ thông tin và truyền thông (CNTT-TT) là một trong những ngành mở rộng nhanh nhất ở Việt Nam. Ngành công nghiệp CNTT của Việt Nam nói chung và ngành công nghiệp dịch vụ CNTT đã chứng kiến sự tăng trưởng tích cực trong 5 năm qua và đạt được những thành tựu đáng kể.
Theo số liệu của Tổng cục Thống kê, tình hình đăng ký doanh nghiệp tháng 8/2023 đã khởi sắc hơn tháng trước, có hơn 14 nghìn doanh nghiệp thành lập mới với số vốn đăng ký là 135,3 nghìn tỷ đồng và số lao động đăng ký 79,9 nghìn lao động, tăng 2,3% về số doanh nghiệp, tăng 6,6% về vốn đăng ký và tăng 1,2% về số lao động so với tháng 7/2023.
Nhằm đẩy mạnh triển khai thực hiện Chương trình chuyển đổi số quốc gia đến năm 2025 và Chiến lược quốc gia về phát triển doanh nghiệp công nghệ số Việt Nam đến năm 2030, chính phủ đang rất tập trung xây dựng kế hoạch và bố trí nguồn lực hỗ trợ doanh nghiệp, đặc biệt là các doanh nghiệp nhỏ và vừa trên địa bàn thực hiện chuyển đổi số, đổi mới sáng tạo, chuyển giao công nghệ phù hợp. Ngoài ra, Việt Nam cũng đang thúc đẩy hệ sinh thái các đơn vị hỗ trợ cho các nhà sản xuất chip góp phần giúp Việt Nam trở thành một trong những quốc gia có nhiều hoạt động sản xuất chip trong khu vực. Ngày càng có nhiều doanh nghiệp Việt Nam có khả năng tham gia vào ngành công nghiệp hỗ trợ sản xuất chip với lực lượng hiện tại khoảng 50 doanh nghiệp trong nước và hơn 5.000 kỹ sư Việt Nam tham gia thiết kế chip. Qua đó, việc xây dựng hệ sinh thái doanh nghiệp hỗ trợ và đội ngũ kỹ sư thiết kế chip, kỹ sư điện tử sẽ giúp Việt Nam từng bước nâng cấp và tham gia sâu hơn vào chuỗi giá trị vi mạch toàn cầu.
Hình 2: Tốc độ tăng trưởng GDP & Ngành ICT theo Báo cáo thị trường IT Việt Nam TopDev Quý 3 2023
Trong số các lĩnh vực kinh doanh, công nghệ thông tin và truyền thông (ICT) là một trong những lĩnh vực phát triển nhanh nhất ở Việt Nam. Ngành CNTT Việt Nam nói chung và ngành dịch vụ CNTT có sự tăng trưởng tích cực trong 5 năm qua. Doanh thu lĩnh vực công nghiệp công nghệ thông tin (ICT) của Việt Nam trong 5 năm qua liên tục tăng trưởng cao, từ gần 103 tỷ USD năm 2018 lên hơn 124,67 tỷ USD năm 2020 và 136,15 tỷ USD vào năm 2021. Trong đó, kim ngạch xuất khẩu phần cứng, điện tử năm 2022 ước đạt 136 tỷ USD, tăng 11,6% so với năm 2021; xuất siêu hơn 26 tỷ USD. Trong bảng xếp hạng Chỉ số Đổi mới sáng tạo toàn cầu GII 2021, Việt Nam xếp thứ 44 trên 132 quốc gia/nền kinh tế.
2. Nhu cầu nhân lực thị trường IT Việt Nam 2023
Sự thiếu hụt nhân sự CNTT luôn là vấn đề khó khăn nhất đối với thị trường CNTT. Mặc dù mức lương và phúc lợi của ngành này vẫn giữ xu hướng tăng và có phần cao hơn so với mặt bằng chung. Dự đoán từ năm 2023 – 2025, Việt Nam vẫn sẽ thiếu hụt từ 150.000 đến 200.000 lập trình viên/ kỹ sư hàng năm. Đa số các nhà tuyển dụng cho biết họ hầu như luôn cần các lập trình viên Back-end, lập trình viên Full-stack và Front-end. Top 5 kỹ năng CNTT hàng đầu mà các công ty đang tìm kiếm vẫn giữ nguyên như những năm trước: Javascript, Java, PHP, C#/.Net & Python.
Hình 3: Báo Cáo Thị Trường IT Việt Nam 2023 của TopDev về nhu cầu nhân lực ngành CNTT 2023
Theo các số liệu thống kê từ năm 2018 – 2023 được đưa ra, nhu cầu nhân lực cho ngành công nghệ thông tin tại Việt Nam vẫn đang tăng cao liên tục dù trong bối cảnh kinh tế nhiều biến động. Dựa trên Báo cáo về thị trường IT Việt Nam 2023 của TopDev, đến năm 2025 Việt Nam sẽ còn cần đến 700.000 nhân lực trong ngành công nghệ thông tin. Trong khi đó, số lượng lập trình viên hiện tại của Việt Nam mới chỉ đạt khoảng 530.000 người.
Thực tế, số lượng ngành học về công nghệ thông tin ở các trường đại học đang mở rộng ngày càng nhiều cũng như số lượng cử nhân tốt nghiệp chuyên ngành này vẫn tăng cao qua mỗi năm, tại sao vẫn có sự chênh lệch này? Sự thiếu hụt này chủ yếu là do trình độ của lập trình viên và yêu cầu doanh nghiệp đặt ra vẫn chưa thực sự cân bằng với nhau. Theo báo cáo, trong số hơn 57.000 sinh viên công nghệ thông tin tốt nghiệp mỗi năm chỉ có khoảng 30% lực lượng nhân sự đáp ứng được những kỹ năng và chuyên môn yêu cầu thực tế mà doanh nghiệp đặt ra, 70% còn lại cần được bố trí đào tạo thêm tại doanh nghiệp trong 3 – 6 tháng để đạt hiệu quả công việc tương ứng.
3. Cuộc cạnh tranh khó khăn hơn với nhiều sự thay đổi trong nhu cầu tuyển dụng & thị trường lao động
Nhu cầu tuyển dụng trong lĩnh vực IT vẫn luôn trên đà tăng trưởng nhanh và mạnh. Do sự thay đổi và ảnh hưởng của tình hình kinh tế – xã hội chung cũng như dựa trên các kỹ năng cứng và kỹ năng mềm mà lập trình viên sở hữu, mức lương cũng như trình độ sẽ được phân loại một cách rõ ràng hơn trong thời gian tới.
Hình 4: Báo Cáo Thị Trường IT Việt Nam 2023 của TopDev về nhu cầu nhân lực và mức lương Lập trình viên ngành CNTT 2023
Bên cạnh kỹ năng chuyên môn vững vàng, những kỹ năng mềm như khả năng tư duy phát triển, giao tiếp, quản lý thời gian, trình độ ngoại ngữ,… cũng là yếu tố quan trọng trong quá trình tuyển chọn và đánh giá ứng viên của nhà tuyển dụng.
Sự biến động và thay đổi nhanh của Công nghệ thông tin và khoa học kỹ thuật cũng như sự đổi mới liên tục của công nghệ đòi hỏi ở các lập trình viên khả năng thích ứng nhanh và nhạy bén với mọi sự biến đổi. Các lập trình viên cần nâng cao kỹ năng công nghệ của bản thân với sự hiểu biết về các công nghệ mới và đột phá như Cybersecurity, DevOps, AI và Machine Learning, Cloud Computing,…
Với tinh thần tỉnh táo và bản lĩnh trí tuệ, Việt Nam vẫn cho thấy được những tín hiệu khả quan trong sự tăng trưởng về kinh tế cũng như thu hút các nhà đầu tư chiến lược từ nước ngoài, trong đó có cả lĩnh vực công nghệ thông tin. Để tìm hiểu chi tiết hơn về thị trường IT Việt Nam trong nửa đầu năm 2023 và xu hướng trong thời gian tới, bạn có thể đón đọc Vietnam IT Market Report 2023 – Vietnam Tech Talents Report do TopDev thực hiện tại đây.
Với hơn 380.000 profile lập trình viên, TopDev hiện là nền tảng tuyển dụng chuyên về IT hàng đầu tại Việt Nam, hơn 1 triệu truy cập website hàng tháng và hơn 100.000 người dùng ứng dụng Tìm việc IT trên di động. TopDev là đơn vị tiên phong và duy nhất trong lĩnh vực IT tại Việt Nam giúp xây dựng và phát triển Thương Hiệu Tuyển Dụng – Employer Brand cho hàng trăm công ty trong và ngoài nước thông qua 2 sự kiện công nghệ lớn nhất hàng năm: Vietnam Mobile Day & Vietnam Web Summit. Ngoài ra, TopDev còn là đơn vị uy tín chuyên khảo sát, phân tích và phát hành các báo cáo hàng năm về thị trường IT – nhân lực IT tại Việt Nam và sở hữu cộng đồng Developer lớn nhất Việt Nam.
Trong công ty chúng ta thường nghe nhắc đến vai trò của một Project Manager là người quản lý các dự án. Ở những tổ chức có quy mô lớn hay dự án lớn hơn, vị trí Program Manager được xem là người quản lý một tổ hợp nhiều dự án có liên quan đến nhau, hay nói cách khác thì Program Manager được xem là quản lý cấp trên của các Project Manager. Đây là một vị trí đòi hỏi kiến thức, kinh nghiệm và các kỹ năng về quản lý cấp cao, cũng là vai trò mà nhiều anh chị em hướng đến trong sự nghiệp. Bài viết hôm nay chúng ta cùng nhau tìm hiểu xem Project Manager là gì và cần học gì để trở thành một Program Manager nhé.
Program Manager là gì?
Program Manager hay Quản lý chương trình (có tổ chức sẽ gọi là Giám đốc chương trình) là người chịu trách nhiệm quản lý một nhóm các dự án liên quan; các dự án này được kết hợp với nhau thành các chương trình (program) để đáp ứng được nhu cầu của khách hàng hay tổ chức.
Từ “Program” ở đây mang ý nghĩa là một chuỗi các hoạt động liên quan với nhau trong một thời gian dài; nghĩa là một Program Manager sẽ là quản lý chung các dự án một cách đồng bộ để thu được những lợi ích không có sẵn từ việc quản lý chúng một cách đơn lẻ. Đây cũng là điểm khác biệt nhất khi so sánh giữa Program Manager và Project Manager, 2 vị trí thường dễ bị nhầm lẫn vai trò trong cùng một tổ chức.
Trong quá trình quản lý các dự án (Project Management) có liên quan với nhau, thực tế chỉ ra rằng các kết quả đầu ra được tạo bởi từng dự án có thể không thể đoán trước và không kiểm soát được; do đó; nhóm các dự án tạo thành chương trình nên được quản lý theo cách nhận ra nhu cầu tiềm năng để điều chỉnh các chiến lược và kế hoạch trong quá trình thực hiện chương trình để tối ưu hóa việc cung cấp lợi ích. Từ đó mà vị trí Program Manager ra đời với công việc quan trọng đảm bảo các thành phần chương trình được điều chỉnh theo yêu cầu để đáp ứng được các mục tiêu chiến lược của tổ chức.
Nhiệm vụ của một Program Manager là quản lý, điều phối để đảm bảo đạt được mục tiêu của chương trình, đồng thời phải tối ưu lợi ích của chương trình bằng cách phân phối và liên kết các thành phần của chương trình một cách hợp lý.
Vai trò của một Program Manager bao gồm:
Căn chỉnh chiến lược chương trình, quản lý lợi ích chương trình, quản lý sự tham gia của các bên liên quan trong chương trình, quản trị chương trình và quản lý vòng đời chương trình
Tương tác với các Project Manager hay Program Manager khác để cung cấp hỗ trợ và hướng dẫn về các sáng kiến cá nhân được thực hiện để hỗ trợ một chương trình
Đảm bảo các chương trình được cung cấp các nguồn lực với độ ưu tiên phù hợp
Đảm bảo cấu trúc chương trình tổng thể và các quy trình quản lý chương trình được áp dụng cho phép đội nhóm chương trình và đội nhóm các thành phần hoàn thành thành công công việc và mang lại lợi ích dự đoán.
Công việc chính của một Program Manager vẫn là quản lý, không hoàn toàn tập trung vào một kỹ thuật chuyên môn nào đó. Vì thế nếu muốn trở thành một Program Manager, bạn hoàn toàn có thể không xuất phát từ lĩnh vực kỹ thuật cụ thể, hay nói cách khác thì Non-tech cũng có thể trở thành Program Manager được.
Program Management là một công việc khó, yêu cầu có nhiều năm kinh nghiệm làm việc ở vai trò quản lý dự án (Project Manager). Thông thường khi có kinh nghiệm làm quản lý dự án trong một thời gian, bạn sẽ có thể học và thi lấy một số chứng chỉ quản lý cấp cao hơn và hướng đến việc trở thành một quản lý chương trình trong tương lai. Có thể xem để trở thành Program Manager, trước tiên hãy học để trở thành một Project Manager.
Bạn cần học và trang bị các kỹ năng, bằng cấp, chứng chỉ cần thiết như dưới đây để trở thành một Project Manager:
Kỹ năng quản lý dự án bao gồm lập kế hoạch, tổ chức và điều phối các hoạt động trong dự án, quản lý thời gian, nguồn lực, rủi ro và tiến độ công việc
Kỹ năng giao tiếp với các bên liên quan (stakeholders) bao gồm thành viên dự án, đối tác, khách hàng, lãnh đạo
Kiến thức chuyên môn về dự án, các nguyên tắc, phương pháp quản lý dự án và sự hiểu biết về công nghệ, quy trình và tiêu chuẩn liên quan đến dự án
Kỹ năng nhận biết và giải quyết các vấn đề phát sinh cùng khả năng thích ứng linh hoạt khi có sự thay đổi.
Các chứng chỉ mà bạn có thể tham khảo để tăng giá trị kinh nghiệm cũng như mức độ tin cậy trong vị trí quản lý dự án hay quản lý chương trình:
Google Project Management Certificate: chứng chỉ quản lý dự án chuyên nghiệp Google
Project Management Professional: chứng chỉ quản lý dự án chuyên nghiệp PMP
Agile Project Management Certificate: chứng chỉ quản trị dự án Agile
Certified Project Director – CPD: Chứng nhận giám đốc dự án
Certified Associate in Project Management – CAPM: chứng nhận liên kết trong quản lý dự án
Kết bài
Quản lý chương trình là một vị trí đòi hỏi ưu tiên tư duy chiến lược hơn là phản ứng chiến thuật thuần túy; vì thế Program Manager cần mang lại cho tổ chức những giá trị lâu dài cho tầm nhìn và hướng đi. Qua bài viết này, hy vọng các bạn đã hiểu hơn về nghề quản lý chương trình cũng như cần học, trang bị kiến thức gì để trở thành một Program Manager trong tương lai. Cảm ơn các bạn đã đọc bài và hẹn gặp lại trong các bài viết tiếp theo của mình.
Bài viết được sự cho phép của tác giả Tống Xuân Hoài
Vấn đề
Debug là một trong những kỹ năng không thể thiếu của một developer. Trong bất kỳ vị trí nào, ngôn ngữ gì… mà có liên quan đến viết mã thì không thể không biết debug. Bởi mỗi dòng code được thêm vào, nguy cơ tạo ra lỗi càng tăng. Debug giúp cho chúng ta tiến hành tìm ra nguyên nhân của lỗi, hay chí ít là kiểm tra xem liệu chương trình có đang hoạt động đúng như ta mong muốn.
Với mỗi nền tảng hay ngôn ngữ có các cách debug khác nhau, tùy thuộc vào khả năng chăm chút của nhà phát triển mà nó đi từ dễ dàng đến khó. Trong Node, có nhiều cách để developer tiến hành gỡ lỗi. Một trong những cách đó là “console.log every where”. Vậy ngoài console.log ra thì còn cách nào debug ứng dụng viết bằng Javascript/Node.js nữa hay không?
Console.log tốt nhưng chưa đủ
Bạn được học cách in mọi thứ ra màn hình bằng console.log. Muốn xem nội dung của biến thì console.log, muốn xem chương trình có chạy vào hàm này không cũng console.log, thậm chí console.log ra nhiều dòng thông tin khác để nhìn cho dễ… Điều này vô hình gây ra những phiền hà, thậm chí là rắc rối như mã trở nên cồng kềnh, rối loạn thông tin trong console… khiến cho nhiều người có cái nhìn không thiện cảm với nó.
Lợi ích console.log mang lại chúng ta thấy rõ, vì tính chất hiển thị ra được thông tin nhanh gọn mà nó thường được sử dụng trong debug. Bằng cách đặt console.log ở những vị trí mà ta muốn theo dõi giúp người gỡ lỗi nhanh chóng nắm bắt được luồng cũng như vị trí gây ra lỗi. Tuy nhiên việc sử dụng console.log vô tội vạ hoặc lạm dụng gây ra một sự “nhiễu loạn” thông tin khủng khiếp trong console, thậm chí nó còn có khả năng gây ra vấn đề về hiệu năng.
Nếu bạn vẫn hay sử dụng console.log để debug mà cảm hài lòng thì tôi vẫn muốn giới thiệu cho bạn một phương pháp mới hơn. Bởi vì lợi ích nó mang lại hơn hẳn console.log về mọi mặt. Còn bạn đang cảm thấy không hài lòng thì quả là khởi đầu tuyệt vời.
Inspector là một trình gỡ lỗi được tích hợp trong Node.js, khi khởi chạy ứng dụng với cờ inspect hoặc --inspect, Node.js sẽ khởi chạy và lắng nghe trình gỡ lỗi. Theo mặc định nó lắng nghe ở địa chỉ và cổng 127.0.0.1:9229. Để kết nối đến, hoặc sử dụng các trình debug chuyên nghiệp bạn sẽ phải kết nối đến một địa chỉ trông giống như là ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e với 0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e là UUID của ứng dụng.
Ví dụ bạn có một file index.js:
const a = 1;
const b = 2;
const sum = a + b;
Khi debug bằng console.log, muốn biết giá trị của sum thì đặt console.log(sum) ngay bên dưới. Còn khi debug với cờ inspect như sau:
$ node inspect index.js
< Debugger listening on ws://127.0.0.1:9229/2855e131-b944-4ae4-bb4d-a6d374b83088
< For help, see: https://nodejs.org/en/docs/inspector
< Debugger attached.
Break on start in index.js:1
> 1 const a = 1;
2 const b = 2;
3 const sum = a + b;
Bạn sẽ thấy kết quả trông giống như trên, với dòng Break on start in index.js:1 đang bắt đầu từ dòng thứ nhất. Bây giờ nhập n rồi enter bạn sẽ thấy chuyển sang dòng 2:
debug> n
breakin index.js:2
1 const a = 1;
> 2 const b = 2;
3 const sum = a + b;
4
Muốn xem giá trị của a, chúng ta dùng lệnh watch.
debug> watch('a')
Lúc này giá trị của a chưa hiển thị ra, thao tác trên chỉ mới khởi tạo nhiệm vụ theo dõi giá trị của a thôi, hãy nhập n để đến dòng tiếp theo bạn sẽ thấy giá trị của a xuất hiện.
debug> n
breakin index.js:3
Watchers:
0: a = 1
1 const a = 1;
2 const b = 2;
> 3 const sum = a + b;
4
Ngoài các chỉ thị n và các hàm watch ra còn nhiều chỉ thị và lệnh khác, bạn đọc xem thêm tại Debuger Command reference.
Chà, đến đây nhiều bạn sẽ thấy debug sao mà khó khăn đến thế, cứ gõ gõ như thế thì đến bao giờ. Đúng thật gõ như thế thì biết đến bao giờ mới xong, đã thế lại còn khó thao tác, khó theo dõi nữa.
Nhưng điều tôi trình bày trên chỉ là cách debug bằng công cụ dòng lệnh (CLI), đó cũng là nền móng của những công cụ debug hiện đại. Tôi chỉ muốn trình bày ra cho mọi người hiểu cách hoạt động của Inspector, còn trong thực tế chúng ta sẽ debug thông qua công cụ trợ giúp của Text editor hoặc IDE.
Break point là vị trí bạn muốn trình debug nhảy đến ngay lập tức mà không phải next qua từng dòng. Break point hiệu quả trong trường hợp bạn xác định được ngay vị trí nghi ngờ hoặc muốn kiểm tra trạng thái của tất cả các biến từ đầu đến khi chạy đến vị trí đó.
Hầu hết các trình viết code Node.js đều có công cụ debug, và nó dựa trên Inspector. Ví dụ nếu bạn đang dùng VSCode, hãy bấm vào Run and Debug.
Bấm vào Show all automatic debug configurations > Node.js > Run Current file để chạy debug trên tệp hiện tại.
Để đặt Break point rất đơn giản, chỉ cầm bấm vào bên trái số dòng một chấm đỏ sẽ hiện ra tức là bạn đã đặt thành công tại vị trí đó.
Bây giờ hãy chạy debug, bạn sẽ thấy trình gỡ lỗi dừng lại ở dòng số 3.
Thử di chuột vào các biến a, b, sum bạn sẽ thấy giá trị hiện tại của chúng khi chương trình chạy đến dòng thứ 3.
Hoặc là nhìn vào ô phía bên tay trái, đó là nơi chứa tất cả dữ liệu của trình gỡ lỗi thu thập được khi chạy chương trình.
Để next hoặc thực hiện các thao tác khác trong quá trình gỡ lỗi, hãy để ý vào trình điều khiển giống như thế này tại cửa sổ VSCode.
Có thể bạn cần phải học các sử dụng từng nút tại bài viết này. Bật mí nút đầu tiên giúp bạn nhanh chóng nhảy đến điểm Break point tiếp theo hoặc kết thúc lượt debug nếu không còn Break point nào sau đó.
Cuối cùng, bạn đọc có thể tìm hiểu chi tiết hơn về cách debug ứng dụng viết bằng Javascript/Node.js tại Node.js debugging in VS Code.
Tổng kết
Debug là một trong những kỹ năng không thể thiếu của một developer. Còn code là còn bug mà muốn fix bug thì phải trang bị cho mình kỹ năng gỡ lỗi chuyên nghiệp. Inspector là một trình gỡ lỗi được tích hợp trong Node.js, các Text editor hoặc IDE dựa vào Inspector để tạo cho chúng ta một trình gỡ lỗi chuyên nghiệp mà tiện ích hơn rất nhiều so với console.log.
Dù bạn là ai, khi đi xin việc đều phải trải qua các vòng phỏng vấn với nhà tuyển dụng. Cho dù bạn ứng tuyển vào vị trí bảo vệ tới chuyên gia, thậm chí lãnh đạo cấp cao… Vị trí càng cao thì buổi phỏng vấn càng căng thẳng.
Với ngành công nghệ thông tin hay cụ thể là lập trình viên, việc chuẩn bị trước những câu hỏi sẽ giúp bạn tự tin hơn trong buổi phỏng vấn.
Không biết các bạn có giống mình không, chứ bình thường mình có kiến thức cũng khá chắc về các kiến thức lập trình. Nhưng khi bước vào buổi phỏng vấn, mọi kiến thức quen thuộc lại “đội nón” bay đi đâu hết.
Do vậy, trước mỗi buổi phỏng vấn quan trọng, mình đều phải lướt qua những kiến thức, đặc biệt là các câu hỏi phỏng vấn lập trình viên hay gặp. Điều này giúp mình tự tin hơn.
Bài viết này mình sẽ điểm lại những câu hỏi phỏng vấn phổ biến nhất được đúc kết từ hàng nghìn ứng viên.
Nhưng trước đó, cùng xem qua những điều cần chuẩn bị trước buổi phỏng vấn đã nhé.
#Cần chuẩn bị gì trước buổi phỏng vấn
Để buổi phỏng vấn được diễn ra suôn sẻ, công tác chuẩn bị là vô cùng quan trọng. Chuẩn bị ở đây là chuẩn bị về kiến thức, tác phong của bạn.
Những việc cần chuẩn bị trước buổi phỏng vấn
Dưới đây là những danh mục, đầu việc mà mình nghĩ bạn nên chuẩn bị:
1. Chuẩn bị kiến thức chuyên môn
Tất nhiên, không thể nào bảo bạn học tất cả những kiến thức liên quan đến yêu cầu công việc của nhà tuyển dụng được. Chỉ cần bạn điểm lại những kiến thức cơ bản mà bạn đã biết để tránh trường hợp bị quên khi hỏi mặc dù bình thường bạn nắm rất rõ.
Ví dụ: bạn ứng tuyển vị trí lập trình Android – Java. Vậy thì ít nhất bạn cũng nên xem lại những kiến thức cơ bản như vòng đời Activity, Fragment, AsyncTask… cách thiết kế layout … Hay lập trình hướng đối tượng là gì?
Nói chung, bạn nên xem lại một lượt kiến thức cơ bản. Có kiến thức chúng ta không sợ trời, không sợ đất.
Trước buổi phỏng vấn, bạn cần lên danh sách những thứ nên mang theo để ghi điểm với nhà tuyển dụng, cũng như hỗ trợ đắc lực cho bạn.
Hai việc quan trọng nhất, đó là:
Bạn cần in bản mô tả công việc cùng với thông tin về công tin. Điều này chứng tỏ bạn rất quan tâm và tìm hiểu kỹ về công việc cũng như công ty mà định ứng tuyển.
In bản CV và mang tới buổi phỏng vấn. Nên in nhiều bản nếu bạn không biết có bao nhiêu người trong buổi phỏng vấn. Mục đích là đủ phát mỗi người một bản CV.
Về cơ bản, bạn chỉ cần chuẩn bị như vậy là đủ. Điểm quan trọng nhất đó chính là sự tự tin. Bạn phải luôn tự tin vào bản thân là được.
Ok, đã chuẩn bị xong thì tiếp theo là tới buổi phỏng vấn thôi!
Không đến trễ: Đi muộn là điều tối kỵ với buổi phỏng vấn. Nhưng cũng đừng đến sớm quá. Tốt nhất là đến trước 5-15 phút là chuẩn nhất. Nếu bạn không thể làm chủ được thời gian do ngoại cảnh như tắc đường, xịt lốp xe… thì lời khuyên của mình là đến sớm nhưng không vào, ngồi đợi trà đá vỉa hè ở phía.
Ngừng “ôn bài”: Đây không phải là thời điểm để bạn luyện tập cách trả lời. Giờ là lúc bạn nên để tinh thần thật thoải mái và luôn tự tin vào bản thân. Nhà tuyển dụng cũng rất thích những người tự tin vào bản thân.
Ngừng kiểm tra email, mạng xã hội: Trong lúc chờ đợi bạn thường kiểm tra email, facebook để giết thời gian. Nhưng điều này chỉ tổ làm bạn thêm bồn chồn, lo lắng mà thôi. Hãy ưu tiên cho buổi phỏng vấn cho tới khi nó kết thúc.
Chỉnh đốn trang phục: Điều này chắc mình không cần phải nói chi tiết nữa nhỉ. Đừng để rau dính răng là được
Ngoài ra, còn nhiều điều chi tiết nhỏ nhặt khác nữa. Nhưng với mình thì những điều trên là quan trọng nhất rồi, còn trong buổi phỏng vấn tùy cơ ứng ứng biến. Luôn luôn tự tin vào bản thân và tôn trọng người đối diện là được.
#Top 10 câu hỏi phỏng vấn lập trình viên phổ biến nhất
Dưới đây là 10 câu hỏi mà mình thấy rất nhiều bạn khi đi xin việc về lập trình hay gặp phải.
1. Anh/Chị hãy giới thiệu về bản thân.
Có lẽ đây là câu hỏi mở đầu buổi phỏng vấn kinh điển nhất rồi. Với kinh nghiệm 5 lần đi phỏng vấn của mình thì câu này không trượt phát nào.
Bạn cứ tự tin giới thiệu về bản thân mình thôi. Như tên, tuối, trình độ đại học, điểm mạnh chuyên môn (ví dụ: có nhiều kinh nghiệm về Nodejs, Android Framework…)
Tuy nhiên, mình lưu ý là chỉ nên nói về những điểm của bản thân mà phục vụ cho công việc, cho công ty. Đừng giới thiệu những điều, sở thích ngoài lề như thích nghe nhạc, thích nghe Sơn Tùng-MTP, thích phim Hàn…
2. Tại sao lại nghỉ ở công ty cũ?
Câu hỏi này cũng hơi nhạy cảm chút. Chẳng nhẽ bạn lại nói thẳng tuột ra là: Lương thấp thì nghỉ thôi. Hay tôi ghét ông sếp nên tôi nghỉ…. Cùng lắm là tôi thích thì tôi nghỉ, anh có ý kiến gì à?!
Để trả lời câu hỏi này một cách khéo léo mà không bị nhà tuyển dụng đánh giá là không thật thà, lươn lẹo không đáng tin, thì mình gợi ý một vài cách.
Bạn có thể lựa chọn một số lý do như: Do có định hướng phát triển sự nghiệp sang lĩnh vực khác, muốn thử thách bản thân với những cái mới, môi trường mới… Những lý do này sẽ tránh được những ấn tượng xấu của nhà tuyển dụng. Vì nhà tuyển dụng rất kỵ nhân viên nói xấu sếp, đồng nghiệp và công ty cũ.
3. Bạn sử dụng thành thạo ngôn ngữ lập trình nào?
Đây là câu hỏi thuộc phạm trù chuyên môn, nên bạn cứ thành thật mà trả lời thôi. Tùy vào vị trí tuyển dụng mà bạn nói ngôn ngữ tương ứng.
Ví dụ, bạn ứng tuyển vào vị trí Android Developer, bạn có thể nói thế mạnh của mình là Java hay Kotlin. Nếu vị trí front-end thì bạn có thể trình bày về Javascript, html, CSS…
4. Bạn đã từng sử dụng công cụ quản lý source code nào không?
Do đặc thù của vị trí developer, bạn sẽ phải thao tác thường xuyên với các công cụ quản lý mã nguồn như SVN hay GIT. Do vậy, nếu bạn không biết hai hình thức quản lý source này thì bạn đã mất khá nhiều điểm trong mắt nhà tuyển dụng.
Ít nhất bạn có thể nói được khái niệm cơ bản GIT là gì? tại sao lại nên sử dụng GIT thay vì SVN…
5. Kể tên dự án đã làm mà bạn tâm đắc nhất? Vị trí của bạn trong dự án đó là gì?
Đây là câu hỏi mà nhà tuyển dụng muốn kiểm tra kinh nghiệm làm việc thực tế của bạn. Bạn nên chọn dự án mà bạn tham gia vào nhiều công đoạn nhất, làm nhiều nhất. Không nhất thiết phải chọn dự án phức tạp nhất hay sử dụng công nghệ hiện đại mà trong đó bạn chỉ là chân “bóc hành đuổi mèo” mà thôi.
Cái mà nhà tuyển dụng cần là bạn đã làm được gì và làm như thế nào mà thôi.
6. Bạn có thể làm việc với mô hình phát triển phần mềm Agile/Crum không?
Có rất nhiều mô hình phát triển, nổi bật nhất là waterfall, Agile… Trong Agile thì thường được các công ty nhỏ, startup hay outsourcing ưu chuộng vì tính tối giản của nó.
Nên nếu bạn đã từng tham gia dự án sử dụng mô hình phát triển này thì quá tốt rồi. Hoặc ít nhất bạn cũng biết những khái niệm cơ bản như Agile là gì? vai trò của các member trong mô hình như thế nào?
7. Làm thế nào để đảm bảo chất lượng mã nguồn?
Bạn là một thành viên trực tiếp tạo ra mã nguồn của dự án, nên nếu bạn không biết cách để tăng chất lượng mã nguồn thì quá mất điểm rồi.
Đối với câu hỏi này, bạn có thể đưa ra một số tiêu chí để đảm bảo chất lượng mã nguồn như:
Mã nguồn có chạy đúng với requirement không? Cái này là quan trọng nhất, nếu mã nguồn sạch đẹp mà chạy sai so với requirement thì cũng vứt.
Không biết các ngành nghề khác thế nào, chứ với nghề lập trình thì việc phải làm OT (over time) để kịp deadline dự án là điều xảy ra như cơm bữa.
Mặc dù, nhà tuyển dụng hỏi câu hỏi này chỉ để thăm dò bạn thôi, vì họ biết thừa bạn sẽ trả lời luôn và ngay: CÓ.
Nhưng như mình nói, họ thăm dò bạn thôi. Cái họ muốn là bạn đối diện với việc phải OT như thế nào? Việc phải chịu áp lực thời gian và trong quá khứ bạn đã từng phải OT rồi hay chưa? Điều kiện gia đình có cho phép OT triền miên hay không?…
9. Bạn có chịu được áp lực không?
Lại một câu hỏi vô nghĩa và thăm dò khác. Bởi vì nhà tuyển dụng, đặc biệt là ngành lập trình, kỹ năng chịu áp lực là một kỹ năng rất quan trọng.
Khi dự án chạy, bạn sẽ phải chịu áp lực từ rất nhiều phía: từ khách hàng, từ sếp, từ PL… rồi cả tụi tester nữa.
Nếu bạn là người không thể chịu được áp lực thì thật là khó để theo đuổi được nghề này, chứ chưa nói đến việc nhà tuyển dụng sử dụng bạn.
Với câu hỏi này, mình khuyên bạn nên trả lời thẳng vào những kinh nghiệm trải qua áp lực trong quá khứ với các dự án mà bạn đã trải qua. Chính những kinh nghiệm thực tế của bạn sẽ ghi điểm với nhà tuyển dụng.
10. Bạn có câu hỏi gì với chúng tôi không?
Đây thường là câu hỏi chốt trước khi kết thúc buổi phỏng vấn. Mặc dù họ để cho bạn hỏi lại họ nhưng cũng là một hình thức đánh giá bạn.
Bạn đừng hỏi những câu hỏi kiểu: Công ty có phục vụ ăn uống không? Có câu lạc bộ bóng đá không? Có được đi du lịch hàng năm không?… mất điểm lắm.
Thay vì đó, bạn nên hỏi về công việc mà vị trí ứng tuyển của bạn sẽ làm, về định hướng chiến lược của công ty hay như môi trường và style (văn hóa) làm việc của công ty như nào…
#Tạm kết
Như vậy là mình đã chia sẻ những kinh nghiệm đi phỏng vấn, cũng như những câu hỏi phỏng vấn lập trình viên phổ biến nhất.
Tất nhiên, đây là chỉ những câu hỏi chung chung để đánh giá thái độ và phong cách làm việc của bạn thôi. Tùy vị trí ứng tuyển mà họ sẽ còn hỏi những câu hỏi sâu về chuyên môn để đánh giá năng lực của bạn.
Nếu mọi người ủng hộ, mình sẽ tiếp tục series với các câu hỏi chuyên về từng lĩnh vực chuyên môn như: các câu hỏi phỏng Android, Front-end, Nodejs…
Nhà mình đã ai đi phỏng vấn chưa? Chia sẻ kinh nghiệm bên dưới nhé!
Bài viết được sự cho phép của tác giả Tống Xuân Hoài
Vấn đề
Điều mà tôi tin rằng rất nhiều lập trình viên mong muốn tiến tới là việc viết mã sao cho dễ đọc dễ hiểu. Bằng chứng là có rất nhiều Design Pattern được đưa ra để hướng dẫn mọi người giải quyết vấn đề theo cách mà nhiều người vẫn làm. Nhưng đó chưa phải là tất cả, việc viết mã hoàn chỉnh thì lại phụ thuộc vào từng lập trình viên.
Chúng ta có nhiều công cụ hỗ trợ soạn thảo mã nguồn theo nhiều cách. Như định dạng, màu sắc, giao diện hiển thị, công cụ hỗ trợ gỡ lỗi… thoải mái lựa chọn theo sở thích hoặc cùng làm việc nhóm. Bên cạnh đó, vẫn có những quy tắc được đặt ra để các thành viên tham gia phát triển phải tuân theo. Tạm bỏ qua vấn đề định dạng (format), ngày hôm nay chúng ta hãy cùng nhau tìm hiểu xem có cách nào để viết mã dễ đọc hơn không nhé!
Một số cách làm mã dễ đọc hơn
Thông thường, những người viết mã khó bảo trì thường mang trong mình phong cách Ninja mà tôi có một bài viết chi tiết tại Nhắc đến Ninja Code – họ là ai mà khiến cho nhiều người phải “khiếp sợ”?. Để viết mã dễ đọc, ngoài cách “rửa tay gác kiếm” khỏi giới nhẫn giả, thì dưới đây là một số cách bạn đọc có thể tham khảo từ chính tôi.
Tên biến và tên hàm
Biến và hàm là hai thành phần cơ bản và quan trọng nhất của bất kì chương trình nào. Việc đặt cho chúng những cái tên dễ hiểu là điều hết sức quan trọng trong việc đọc hiểu mã.
Có nhiều nguyên tắc đặt tên biến và hàm mà bạn có thể tìm thấy trên mạng. Ví dụ tôi thường đặt tên biến theo kiểu camelCase, là danh từ, gắn liền với nội dung mà nó nắm giữ, các biến thuộc dạng hằng số hoặc chỉ thay đổi theo biến môi trường thì sẽ viết hoa và theo định dạng UPPER_CASE… Tên hàm gắn liền với một hành động, nghĩa là động từ, theo kiểu camelCase. Chức năng của hàm gắn liền với cái tên của nó, chỉ làm một công việc còn nếu nhiều hơn, tách chúng thành các hàm nhỏ hơn.
Thi thoảng trong chương trình, chúng ta hay bắt gặp việc so sánh biến với một con số nào đó ví dụ như:
if (user.lastSeen < 4321)
...
4321 lúc này được gọi là Magic Number hay Hardcoded Value, chúng ta không biết chính xác con số đó biểu thị điều gì đơn giản vì nó không có tên. Điều này khiến người đọc mã phải bối rối về sự xuất hiện của chúng. Thay vào đó, hãy sử dụng một biến để biểu thị cho ý nghĩ của những con số này.
const timeActive = 4321;
if (timeExpired < timeActive)
...
Có một sự thật là đoạn mã nào thụt lề càng nhiều thì logic sẽ càng nhiều và càng phức tạp. Hãy xem xét một ví dụ dưới đây.
asyncfunctionmain() {
const user = awaitgetUser(id);
if (user) {
if (user.lastSeen) {
const userSeen = dayjs(user.lastSeen);
} else {
const userSeen = dayjs();
if (userSeen.isAfter(dayjs().subtract(1, "day"))) {
showUserOnline();
} else {
showUserOffline();
}
}
}
}
Thật ra không có một quy tắc cụ thể nào cho việc sử dụng if...else, nhưng hãy nhìn vào ví dụ trên có phải if...else càng nhiều logic sẽ càng phức tạp, sau này có bảo trì, sửa lại mã cũng trở nên khó khăn hơn vì có nhiều logic cần được làm sáng tỏ trước khi bắt tay vào sửa mã.
Nếu có thể, hãy hạn chế các lệnh điều kiện if...else lồng nhau. Sử dụng switch...case thay thế trong những trường hợp phức tạp hơn, và tốt nhất hãy làm “phẳng” cây logic nhất có thể.
Nhìn chung, việc hạn chế Side-Effect giúp chúng ta có một cấu trúc chương trình rành mạch hơn, tránh việc gọi một hàm thôi mà làm thay đổi hết trạng thái của chương trình.
Áp dụng functional
Bất cứ chỗ nào xử lý logic, hãy tách thành những hàm nhỏ hơn và đặt tên cho chúng. Hãy xem xét một ví dụ dưới đây:
Đoạn mã trên lấy danh sách users từ một endpoint về, lọc ra danh sách users đang kích hoạt và sau đó thêm thuộc tính roleName dựa vào role của mỗi users.
Có thể mất một thời gian để hiểu được ý nghĩa của đoạn mã trên, vì chúng ta đang phải tập trung vào logic để hiểu. Thay vào đó, đoạn mã trên có thể được viết lại bằng cách tách các đoạn mã xử lý logic ra thành các hàm nhỏ hơn.
Hãy nhìn vào phần thân chương trình, toàn bộ logic đã hoàn toàn lộ rõ là filterActiveUsers và mapUsersRole. Điều này giúp chúng ta nhanh chóng nắm bắt được luồng xử lý dữ liệu, sau này nếu muốn xem chi tiết chỉ cần nhảy đến các hàm liên quan.
Sử dụng comment hợp lý
Comment là một vấn đề gây nhiều tranh cãi, có người nói ai càng comment chứng tỏ càng thiếu kinh nghiệm vì họ không biết cách viết mã sao cho dễ đọc!? Quan điểm của tôi là hãy sử dụng comment đúng lúc và không quá phụ thuộc vào nó để giải thích chi tiết cách mã của bạn hoạt động.
Kết hợp nhiều yếu tố như đặt tên và các hàm functional để gián tiếp giải thích cách mã của bạn hoạt động, trừ khi gặp phải logic quá phức tạp hoặc cần mô tả ngắn gọn luồng dữ liệu thì hãy để lại comment. Các thay đổi quan trọng có liên kết đến tài liệu bên ngoài…
Ví dụ:
# 02/09/2023: Thay đổi logic theo tài liệu DOC-2945functiongetRandomUser() {
...
Ngoài ra, còn nhiều trường hợp khác để bạn khéo léo vận dụng cách comment ví dụ như sử dụng một tính năng nào đó của thư viện ngoài.
Như trong ví dụ trên, tôi đang sử dụng một tính năng biến môi trường của Cloudflare và cần tuân thủ một số quy tắc liên quan đến giới hạn, việc đính kèm tài liệu sẽ giúp cho đồng nghiệp dễ dàng truy cứu lại tài liệu và hiểu được cách tôi viết mã hơn.
Tài liệu hóa mã mà bạn viết
Dĩ nhiên một chương trình phức tạp không thể nào chỉ dựa vào mỗi việc đọc mã thôi mà có thể hiểu hết được. Bên cạnh đó, chúng ta cần có một hệ thống tài liệu mô tả hầu hết luồng hoạt động của chương trình. Nó vừa giúp cho người mới có tài liệu để nghiên cứu và giúp cho bản thân phát huy khả năng hệ thống hoá.
Hãy rèn luyện cho mình kỹ năng viết và truyền đạt lại những thứ mình làm. Đây cũng là một trong những kỹ năng cần thiết để giúp bạn tiến xa hơn trên con đường sự nghiệp.
Cuối cùng, vẫn là không ngừng học hỏi
Học, học nữa, học mãi… Học không bao giờ là đủ và cũng không bao giờ thừa. Điều tôi nói trên đây chỉ là quan điểm cá nhân, ngoài ra tôi biết còn nhiều điều cần phải học hỏi thêm từ người khác. Bạn có thể học hỏi thêm từ đồng nghiệp hoặc thông qua các dự án mã nguồn mở.
Tổng kết
Trên đây là một số các quy tắc mà tôi vẫn đang áp dụng trong công việc hàng ngày, tuy không đánh giá được mức độ tốt đến đâu nhưng ít nhất sau vài ba tuần đọc lại mã của mình viết ra, tôi vẫn có thể hiểu được chúng :D. Còn bạn, bạn có đang áp dụng thêm phương pháp nào để giúp cho mã dễ đọc hơn không? Hãy để lại bình luận nhé!
“Cha đẻ” của các ngôn ngữ lập trình nổi tiếng trên khắp thế giới là những cá nhân tài năng đã để lại dấu ấn lớn trong ngành công nghệ thông tin. Họ đã sáng tạo ra các ngôn ngữ lập trình mạnh mẽ, giúp xây dựng các ứng dụng và hệ thống phức tạp, thúc đẩy sự phát triển của khoa học máy tính và công nghệ ngày nay.
Trong bài viết này, chúng ta sẽ khám phá những tên tuổi lừng danh và đóng góp quan trọng của họ vào các ngôn ngữ lập trình phổ biến như Python, Java, C++, JavaScript và nhiều ngôn ngữ khác. Cùng TopDev khám phá nhé!
Ngôn ngữ lập trình Java – James Gosling
James Gosling là cha đẻ của ngôn ngữ lập trình Java, một ngôn ngữ lập trình hướng đối tượng được thiết kế để có thể chạy trên nhiều nền tảng khác nhau.
Gosling sinh ra ở Canada vào năm 1955. Ông theo học khoa học máy tính tại Đại học Calgary, nơi ông bắt đầu phát triển ngôn ngữ lập trình Java vào năm 1991. Java được thiết kế để giải quyết một số vấn đề mà Gosling và các đồng nghiệp của ông gặp phải khi phát triển phần mềm cho các thiết bị di động và Internet.
Java được ra mắt lần đầu tiên vào năm 1995 và nhanh chóng trở nên phổ biến. Ngày nay, Java là một trong những ngôn ngữ lập trình được sử dụng rộng rãi nhất trên thế giới. Nó được sử dụng để phát triển các ứng dụng và phần mềm cho một loạt các nền tảng, bao gồm máy tính để bàn, máy tính xách tay, máy tính bảng, điện thoại thông minh, trình duyệt web và máy chủ.
Ngôn ngữ lập trình Python – Guido Van Rossum
Van Rossum sinh ra ở Hà Lan vào năm 1956. Ông theo học khoa khoa học máy tính tại Đại học Amsterdam, nơi ông bắt đầu phát triển Python vào năm 1989. Python được ra mắt lần đầu tiên vào năm 1991 và nhanh chóng trở nên phổ biến.
Ngày nay, Python là một trong những ngôn ngữ lập trình được sử dụng rộng rãi nhất trên thế giới. Nó được sử dụng để phát triển các ứng dụng và phần mềm cho một loạt các lĩnh vực, bao gồm khoa học dữ liệu, máy học, trí tuệ nhân tạo, web development, và DevOps.
Ngoài Python, Van Rossum còn có những đóng góp quan trọng khác cho ngành khoa học máy tính. Ông cũng là tác giả của nhiều bài báo khoa học về khoa học máy tính.
Ngôn ngữ lập trình C là một trong những ngôn ngữ lập trình quan trọng và ảnh hưởng nhất trong lịch sử công nghệ thông tin, và nó được tạo ra bởi Dennis Ritchie, một nhà khoa học máy tính và lập trình viên xuất sắc. Dennis MacAlistair Ritchie sinh vào ngày 9 tháng 9 năm 1941 tại Bronxville, New York, Hoa Kỳ. Ông đã nhận bằng cử nhân và tiến sĩ về khoa học máy tính tại Đại học Harvard.
C được ra mắt lần đầu tiên vào năm 1973 và nhanh chóng trở nên phổ biến. Ngôn ngữ lập trình C là một trong những ngôn ngữ đầu tiên sử dụng mô hình lập trình có cấu trúc, với khả năng tạo ra các hàm và thư viện tái sử dụng. Điều này đã làm cho việc phát triển phần mềm trở nên dễ dàng hơn và hiệu quả hơn. C đã trở thành nền tảng cho việc phát triển nhiều hệ điều hành và phần mềm quan trọng, bao gồm hệ điều hành UNIX, Linux, và Windows.
Ngôn ngữ lập trình C++ – Bjarne Stroustrup
Bjarne Stroustrup là cha đẻ của ngôn ngữ lập trình C++, một ngôn ngữ lập trình hướng đối tượng dựa trên C. Bjarne Stroustrup sinh vào ngày 30 tháng 12 năm 1950 tại Aarhus, Đan Mạch. Ông đã nhận bằng cử nhân và tiến sĩ về khoa học máy tính tại Đại học Aarhus, Đan Mạch, và sau đó tiếp tục làm việc nghiên cứu tại Bell Labs ở Hoa Kỳ.
Stroustrup bắt đầu phát triển C++ vào những năm 1979 như một phiên bản mở rộng của ngôn ngữ lập trình C. C++ kế thừa các đặc điểm mạnh của C và bổ sung nhiều tính năng mới, như hướng đối tượng, lập trình tổ chức, và kiểu dữ liệu trừu tượng.
Yukihiro Matsumoto, còn được gọi là Matz, là cha đẻ của ngôn ngữ lập trình Ruby. Ông sinh ra ở Ōsaka, Nhật Bản vào ngày 14 tháng 4 năm 1965. Ông bắt đầu lập trình từ khi còn trẻ và sau đó theo đuổi nghiên cứu và phát triển trong lĩnh vực công nghệ thông tin.
Matz bắt đầu phát triển Ruby vào những năm 1990 với mục tiêu tạo ra một ngôn ngữ lập trình dễ đọc, dễ viết và mạnh mẽ. Ruby được phát hành lần đầu vào năm 1995, và nhanh chóng thu hút sự quan tâm của cộng đồng lập trình viên.
Ngôn ngữ lập trình PHP – Rasmus Lerdorf
Rasmus Lerdorf là cha đẻ của ngôn ngữ lập trình PHP, một ngôn ngữ lập trình kịch bản được sử dụng để phát triển các ứng dụng web. Ông sinh ra ở Đan Mạch vào năm 1968. Ông đã theo học tại Đại học Waterloo ở Canada và sau đó làm việc trong lĩnh vực công nghệ thông tin và phát triển web.
Rasmus Lerdorf bắt đầu phát triển PHP vào những năm 1994 như một tập hợp các script để theo dõi thông tin truy cập trên trang web cá nhân của mình. PHP ban đầu là viết tắt của “Personal Home Page” (Trang web cá nhân), sau đó trở thành viết tắt của “PHP: Hypertext Preprocessor,” một loại lập trình mã nguồn mở dùng để phát triển các ứng dụng web động.
PHP đã trở thành một trong những ngôn ngữ lập trình phổ biến nhất cho việc phát triển các trang web động và ứng dụng web. Nó được tích hợp vào nhiều hệ thống quản lý nội dung (CMS) như WordPress và Joomla, cũng như các framework web như Laravel và Symfony.
Ngôn ngữ lập trình JavaScript – Brendan Eich
Brendan Eich sinh vào ngày 4 tháng 7 năm 1961 tại Pittsburgh, Pennsylvania, Hoa Kỳ. Ông đã theo học tại Đại học Santa Clara và nhận bằng cử nhân về khoa học máy tính.
Brendan Eich trở thành người sáng tạo của JavaScript khi làm việc tại Netscape Communications Corporation vào năm 1995. Ông phát triển ngôn ngữ này với tên gọi Mocha sau đó đổi thành LiveScript, và cuối cùng là JavaScript. JavaScript ban đầu được phát triển để tạo ra các tính năng tương tác trên trình duyệt Netscape Navigator.
JavaScript đã trở thành một trong những ngôn ngữ lập trình phổ biến nhất và quan trọng nhất trong phát triển web. Nó được sử dụng rộng rãi để tạo ra các ứng dụng web động, hiệu ứng, và tương tác người dùng.
Ngôn ngữ lập trình Pascal – Niklaus Wirth
Niklaus Emil Wirth sinh vào ngày 15 tháng 2 năm 1934 tại Winterthur, Thụy Sĩ. Ông đã nhận bằng cử nhân và tiến sĩ về khoa học máy tính tại Đại học ETH Zurich ở Thụy Sĩ.
Niklaus Wirth bắt đầu phát triển ngôn ngữ lập trình Pascal vào những năm 1968 và hoàn thành phiên bản đầu tiên vào năm 1970. Pascal ban đầu được thiết kế như một ngôn ngữ lập trình để dạy và nghiên cứu trong lĩnh vực khoa học máy tính.
Pascal đã đóng vai trò quan trọng trong giáo dục và nghiên cứu trong lĩnh vực khoa học máy tính. Nó đã giúp sinh viên và nghiên cứu viên học cơ bản về lập trình và cấu trúc dữ liệu.
Kết luận
Như vậy, trong bài viết này, chúng ta đã tìm hiểu về các tác giả đằng sau những ngôn ngữ lập trình nổi tiếng nhất thế giới và đóng góp của họ đối với sự phát triển của ngành công nghệ thông tin. Chúng ta hãy dành lời cảm ơn đến tất cả những tài năng xuất chúng này và mong rằng sẽ còn nhiều sự phát triển và tiến bộ hơn nữa trong tương lai.
Thời gian gần đây, VS Code nổi lên như một trình Text Editor tốt nhất được hầu hết lập trình viên công nhận. Trước đây, mình chỉ sử dụng VS Code để làm các dự án có liên quan đến Javascript, nhưng giờ đây, hầu hết các dự án từ PHP, Java, Python… mình đều sử dụng VS Code. Lý do đơn giản là VS Code nhanh, gọn nhẹ, nhiều ”đồ chơi”.
Dưới đây, mình xin liệt kê 13 phím tắt trong VS Code (hotkeys) sẽ giúp bạn cải thiện đáng kể tốc độ viết code, nhờ đó mà hoàn thành dự án nhanh hơn. Hãy thử một lần và đánh giá nhé.
1. Tìm kiếm files
Chắc chắn rồi, phím tắt đầu tiên mà mình muốn nhắc tới sẽ liên quan tới tìm kiếm.
Tổ hợp phím cmd + P (MacOS) hay crtl + P (Window) sẽ nhanh chóng mở tab tìm kiếm để bạn nhanh chóng tìm kiếm thứ gì đó trong mã nguồn dự án.
Với cá nhân mình thì tổ hợp phím này mình dùng không dưới 100 lần trong ngày
2. Tìm kiếm Cài đặt
Tương tự như tìm kiếm, sau khi mở hộp tìm kiếm bằng tổ hợp crtl + P (Window), bạn tiếp tục gõ >, bạn có thể tìm kiếm bất kỳ thiết lập nào trong VS Code.
3. Multiple cursors
Tính năng này khá là hay ho, mình ước là đã biết tới nó sớm hơn.
Đơn giản chỉ cần ấn phím alt và click vào bất kỳ đâu trong VS Code, multiple cursor sẽ xuất hiện.
Đôi khi bạn cần phải đổi tên biến và muốn nó cũng thay đổi ở tất cả nhưng nơi gọi tới biến đó. Nếu như Java thì chuyện này khá đơn giản, nhưng với Javascript thì bạn thường phải tìm kiếm và replace thủ công hàng loạt.
Với thủ thuật sau, bạn sẽ không còn phải lo lắng sửa sót nữa.
Đầu tiên, bạn chọn một đoạn text, sau đó ấn tổ hợp: cmd shift + L (Mac) / crtl shift + L (Windows) để chọn toàn bộ những đoạn text có nội dung tương tự như đoạn vừa chọn. Công việc tiếp theo là đổi tên đoạn text vừa chọn thôi.
Nhấn cmd + C, sau đó cmd + V (Mac) / crtl + C, sau đó crtl + V (Windows). Xong!
7. Tìm kiếm trong một file
Cái này khá quen thuộc trên tất cả các ứng dụng phổ biến (như trình duyệt): cmd + F (Mac) / crtl + F (Windows). cmd + G (Mac) / crtl + G (Windows) tìm kiếm lần xuất hiện tiếp theo, trong khi cmd shift + G (Mac) / crtl + shift + G (Windows) tìm kiếm lần xuất hiện trước đó.
8. Replace
Nếu bạn muốn replace cụm từ sau khi bạn tìm kiếm, hãy kích hoạt cmd option + G (Mac) / crtl shift + G (Windows).
Sau đó, bấm enter để thay thế cụm từ hiện tại.
Nếu bạn muốn thay thế tất cả, hãy click vào cmd + enter (Mac) / crtl + enter (Windows).
13. Đóng tab
Cái này giống như trong Chrome - cmd + W (Mac) / crtl + W (Windows).
Tạm kết
Trên đây là một số tổ hợp phím tắt trong VS Code mà mình rất hay sử dụng trong quá trình viết code. Mình không có ý định khuyên bạn học thuộc lòng chúng ngay lập tức, chỉ đơn giản là bạn hãy thử, nếu cảm thấy có ích thì tự nhiên bạn sẽ nhớ nó.
Hãy lưu lại bài viết này nhé, có lẽ trong tương lai bạn sẽ cần tới. Thói quen sử dụng phím tắt sẽ tăng đáng kể hiệu suất công việc của bạn.
Bài viết được sự cho phép của tác giả Nguyễn Hồng Quân
Gần đây, tôi chuyển đổi website này sang viết bằng Rust và rất tâm đắc với phong cách xử trí lỗi (error handling) của Rust, khi ứng dụng vào việc viết web. tôi sẽ trình bày tại sao.
Trước Rust, hầu hết các ngôn ngữ lập trình tôi kinh qua đều dùng phong cách xử trí lỗi là exception handling. Một hàm đang chạy nửa chừng, nếu gặp lỗi sẽ bắn ra một exception và dừng ngay tại đó. Hàm nào gọi nó bên ngoài sẽ dùng cấu trúc try ... except, try ... catch để phòng bị, bắt những exception này và có hướng xử trí tương ứng khi exception xảy ra. Cách làm này có ưu điểm là không cần nghĩ nhiều, giúp lập trình viên làm nhanh, cho ra sản phẩm lẹ. Tuy nhiên nó có nhược điểm là nhìn vào signature (mô tả kiểu dữ liệu đầu vào và đầu ra) của một hàm, không có cách nào biết được hàm đó có thể bắn ra những exception nào. Rust thì khác, những lỗi nào có thể xảy ra sẽ buộc phải khai báo trong signature của hàm. Ví dụ nhìn signature của hàm dùng để parse một chuỗi thành số nguyên:
fnfrom_str(src:&str)->Result<i8, ParseIntError>
ta biết ngay nếu thất bại (ví dụ parse chuỗi “z” thành số) thì hàm sẽ trả về một giá trị thuộc kiểu ParseIntError, từ đó giúp ta viết code cho phần xử trí lỗi nhanh hơn, tiện hơn, tự tin hơn (không sợ bỏ sót).
Ghi chú nhỏ: Nói một cách chính xác thì những hàm có kiểu trả về Result như trên không trả về giá trị mong muốn một cách trực tiếp, mà bọc trong một enum kiểu Result để chỉ thị trạng thái thành công hay thất bại. Ví dụ với hàm parse phía trên, nếu ta gọi i8::from_str("1") thì nhận được Ok(1), nếu gọi i8::from_str("z") thì nhận được Err(e) với e thuộc kiểu ParseIntError.
Đọc tới đây, người chưa viết Rust chắc sẽ thắc mắc: “Ủa, vậy là không làm nhanh được nhỉ. Ví dụ với phong cách exception, khi tôi đang định nghĩa một hàm cho người khác sử dụng, và gọi nhiều lớp hàm con, nếu một trong những hàm con bắn ra exception, và tôi muốn chuyển tiếp exception đó ra ngoài, thì tôi chẳng cần phải viết thêm code gì cả, cứ để mặc. Còn với Rust thì cứ phải kiểm tra giá trị trả về của hàm con, rồi dùng return Err(e) để trả ra bên ngoài”. Vâng, đúng là như vậy, nhưng Rust có một cú pháp để làm việc ấy một cách rất ngắn gọn, đó là dùng toán tử ?. Ví dụ xem đoạn code sau trong một sản phẩm khác của tôi (Duri):
fnmain()->eyre::Result<()>{let opts =Opts::parse();let l = opts.verbose.log_level_filter();Logger::try_with_str(l.as_str())?.start()?;color_eyre::install()?;// More code
}
Các bước Logger::try_with_str(), logger.start() đều có thể xảy ra lỗi (ví dụ tên log level không đúng, thiết bị console chưa sẵn sàng v.v…). Khi ấy toán tử ? sẽ truyền những lỗi ấy lên hàm main() và ngừng hàm main ngay tại bước xảy ra lỗi. Chưa dừng tại đó, toán tử & còn có một tính năng thú vị nữa là tự động chuyển đổi kiểu lỗi, nếu lỗi trả về bởi hàm con khác kiểu với kiểu mà hàm cha mong muốn. Cũng ở ví dụ trên, hàm Logger::start() trả về lỗi FlexiLoggerError trong khi hàm main mong đợi lỗi thuộc kiểu eyre::Report và toán tử & sẽ làm thêm bước chuyển đổi. Tất nhiên, chuyển đổi như thế nào thì & không tự “chế” được mà phải nhờ vào việc một trong hai kiểu (nguồn và đích) kia phải implement traitFrom hoặc Into.
Thế thì những điều kia liên quan gì tới web? Tôi nóng ruột quá!
Vâng, quay lại với chuyện lập trình web. Để sinh ra response trả về cho người dùng, server có thể phải làm các bước sau, và bước nào cũng có thể gặp lỗi:
Kiểm tra xem người dùng đã login chưa. Có thể gặp lỗi khi đang đọc session, từ Redis hay từ file (ví dụ Redis sập hay ổ đĩa bị lỗi).
Lôi dữ liệu từ database lên. Có thể gặp lỗi khi hệ thống database cấu hình không đúng, schema không khớp, hay bị treo.
Tính toán, xử lý dữ liệu trước khi trả về cho người dùng. Có thể gặp lỗi vì dữ liệu có định dạng không như mong muốn.
Dùng template để render dữ liệu. Có thể gặp lỗi vì đường dẫn file bị sai, hay code của template không phù hợp với dữ liệu.
Tất cả những lỗi trên, nếu không được bắt và xử trí thì nhẹ sẽ sinh ra nội dung mù mờ khó hiểu (người dùng chỉ thấy trang trắng với dòng chữ “500 Internal Server Error” hoặc “Connection Reset”) hoặc nặng thì sẽ sập luôn cả ứng dụng server. Nếu có bắt lỗi thì ta sẽ có hành xử tốt hơn:
Hiện thông báo để cáo lỗi người dùng, và giữ được giao diện chuẩn của trang web.
Ghi log để giúp lập trình viên điều tra nguyên nhân gây ra lỗi, để sửa code cho đúng.
Giữ cho server không bị sập, tiếp tục phục vụ các request khác.
Để đạt được điều trên thì ta nên thiết kế hàm handler (trả về response tương ứng với request) dưới dạng một hàm trả về Result, trong đó Ok tương ứng với response thành công, và Err tương ứng với response báo lỗi, kết hợp với toán tử ? để viết code ngắn hơn.
Thật may là đa số các framework web của Rust đều hỗ trợ các handler kiểu này. Dưới đây tôi sẽ minh họa với framework Axum.
Ví dụ source code của hàm dùng để trả về bài viết mà bạn đang xem:
pub async fnshow_post(// Params...
)->AxumResult<Html<String>>{// Code...
let post =get_detailed_post_by_slug(slug,&db).await
.map_err(PageError::EdgeDBQueryError)?.ok_or((StatusCode::NOT_FOUND,"No post at this URL"))?;// Code...
}
Tôi khai báo kiểu trả về của hàm là AxumResult<Html<String>>, đây là cách viết tắt, dùng type alias, thực ra nó sẽ là Result<Html<String>, ErrorResponse>. Tức là nếu xảy ra lỗi, hàm cần trả về giá trị thuộc kiểu axum::response::ErrorResponse, để Axum tạo ra response cho người dùng.
Lưu ý rằng hàm handler trong Axum không nhất thiết phải có kiểu trả về Result<T, ErrorResponse>, nó được phép có kiểu trả về Response hay impl IntoResponse nữa. Trong bài này tôi tập trung vào <Result<T, ErrorResponse> để vừa tận dụng được toán tử ? cho code ngắn hơn và để luồng code trông tường minh, rạch ròi được trạng thái bình thường / lỗi.
Xem lại ví dụ show_post phía trên, tại dòng code:
let post =get_detailed_post_by_slug(slug,&db).await
.map_err(PageError::EdgeDBQueryError)?.ok_or((StatusCode::NOT_FOUND,"No post at this URL"))?;
tôi đã hai lần dùng ? để kiểm tra và trả về lỗi.
Đầu tiên, hàm get_detailed_post_by_slug có signature là:
Đây là hàm lấy dữ liệu từ EdgeDB nên khi gặp lỗi, nó sẽ trả về lỗi thuộc kiểu edgedb_tokio::Error. Tuy nhiên edgedb_tokio::Error không được implement traitIntoResponse nên ta không dùng trực tiếp nó làm giá trị trả về cho handler show_post được. Ta sẽ dùng method map_err() để chuyển đổi nó qua kiểu lỗi trung gian PageError, là kiểu mà ta tự định nghĩa và thêm implement traitIntoResponse. Việc ứng dụng kiểu lỗi trung gian này sẽ được trình bày sau.
Tiếp đến, nếu việc giao tiếp với EdgeDB thành công, hàm get_detailed_post_by_slug sẽ trả về dữ liệu kiểu Option<DetailedBlogPost>, tức là sẽ lấy được DetailedBlogPost hoặc không. Option là kiểu dữ liệu đặc biệt của Rust, bên cạnh Result, mà những người đến từ các ngôn ngữ lập trình hướng đối tượng truyền thống sẽ ngạc nhiên. Trong Rust không có kiểu dữ liệu null / None / nil như các ngôn ngữ phổ biến khác. Thay vào đó, để diễn tả được sự thiếu vắng dữ liệu, Rust dùng Option, là một enum với hai mặt Some và None. Cụ thể, nếu hàm get_detailed_post_by_slug lấy được dữ liệu, nó trả về Some(DetailedBlogPost) và nếu không có dữ liệu, nó trả về None. Giống như Result, Option bao trùm dữ liệu thực nên bạn buộc phải ứng xử với trạng thái “thành công / lỗi”, “có dữ liệu / không có dữ liệu” rồi mới lấy được giá trị thực. Đây là cách Rust khiến bạn lập trình cẩn thận, kỹ càng hơn và tránh được bug.
Quay lại hàm show_post, nếu người dùng truy cập vào một URL không có thật, không tương ứng với bài post nào, thì ta nên trả về lỗi 404 Not Found. Tình huống “URL không có thật” đó tương ứng với lúc get_detailed_post_by_slug trả về None, bởi vậy ta có đoạn .ok_or((StatusCode::NOT_FOUND, "No post at this URL"))? là để trả về response với status 404 (Not Found) nếu get_detailed_post_by_slug trả về None.
Nếu dùng một trình soạn thảo có hỗ trợ inlay hint, bạn có thể thấy được giá trị trả về của từng đoạn trong một dòng code, và thấy được tác dụng của ? tại từng đoạn, vừa khiến hàm trở về sớm trong điều kiện không mong muốn, vừa “bóc vỏ” Result, Option để lấy giá trị thực trong điều kiện thành công:
Trong một lần giao tiếp với người dùng, ứng dụng web phải kết tập dữ liệu từ nhiều nguồn, qua nhiều bước xử lý. Mỗi bước đều có thể phát sinh lỗi, nhưng thường thì những lỗi đó đều không thể dùng trực tiếp làm giá trị trả về cho handler được, vì chúng là của các thư viện khác và không implement traitIntoResponse. Khi đó ta sẽ định nghĩa một kiểu lỗi riêng làm trung gian, sẽ được chuyển đổi từ các kiểu lỗi của các thư viện khác, và có implement traitIntoResponse để có thể tạo ra response. Ví dụ khi xây dựng website này thì tôi tạo hai kiểu lỗi: PageError dùng cho các trang bên ngoài, trả về HTML, và ApiError dành cho các đầu API, trả về JSON:
#[derive(Debug, thiserror::Error)]pubenumPageError{#[error(transparent)]
EdgeDBQueryError(#[from]edgedb_errors::Error),#[error(transparent)]
JinjaError(#[from]minijinja::Error),#[error("Permission denied")]
PermissionDenied(String),}implIntoResponse forPageError{fninto_response(self)-> Response{// Code to create response for each case of error
}}#[derive(Debug, thiserror::Error)]pubenumApiError{#[error(transparent)]
PathRejection(#[from] PathRejection),#[error(transparent)]
JsonRejection(#[from] JsonRejection),#[error(transparent)]
JsonExtractionError(#[from]serde_json::Error),#[error(transparent)]
EdgeDBQueryError(#[from]edgedb_errors::Error),#[error("{0} not found")]
ObjectNotFound(String),#[error("Please login")]
Unauthorized,#[error("Error logging in")]
LoginError(String),#[error("Not enough data")]
NotEnoughData,#[error(transparent)]
ValidationErrors(#[from]validify::ValidationErrors),#[error("Other error: {0}")]
Other(String),}implIntoResponse forApiError{fninto_response(self)->axum::response::Response{// Code to create response for each case of error
}}
Ở đây, tôi dùng thư viện thiserror để giúp viết code chuyển đổi ngắn gọn hơn. Ngoài ra, kiểu lỗi trung gian này nên ở dạng enum để có thể có cách lưu trữ thông tin riêng cho từng trường hợp lỗi, và tạo ra response khác nhau cho từng trường hợp (ví dụ cùng là lỗi nhưng có lúc ta trả về 500, có lúc ta trả về 422).
Thông tin thêm, có thể bạn để ý rằng, mặc dù trên signature của hàm tôi kí hiệu kiểu dữ liệu trả về là ErrorResponse nhưng nhiều lúc trong thân hàm tôi lại viết giá trị trả về là:
(StatusCode::NOT_FOUND,"No post at this URL")// or
StatusCode::SERVICE_UNAVAILABLE
Đó là nhờ cơ chế trait và toán tử ? của Rust. Bạn có thể xem tài liệu của Axum để biết những kiểu dữ liệu nào có thể được tự động biến đổi thành ErrorResponse. Ví dụ biểu thức tuple sau
(StatusCode::NOT_FOUND,"No post at this URL")
là tương ứng với dòng sau trong tài liệu:
và đến lượt IntoResponse được implement traitFrom:
nên tuple đó có thể được chuyển đổi tự động.
Như vậy, tôi đã trình bày xong một trường hợp ứng dụng phong cách error handling của Rust. Khi lập trình website này, nhờ luật chặt chẽ của Rust mà tôi tránh được khá nhiều bug, điều dễ xảy ra với các ngôn ngữ khác, từ đó tiết kiệm được thời gian test đi test lại. Đây cũng là một trong những lý do tôi chọn Rust làm ngôn ngữ tiếp theo để đầu tư (sau Python), thay vì chọn Go như khá nhiều đồng nghiệp khác.