Home Blog Page 94

Android Studio: Phần mềm hỗ trợ lập trình ứng dụng Android

Android Studio: Phần mềm hỗ trợ lập trình ứng dụng Android

Bài viết được sự cho phép của blogchiasekienthuc.com

Chào các bạn, trong khoảng 5 năm trở lại đây với sự phát triển nhanh chóng của các thiết bị tử, điện thoại thông minh thì ngày càng phổ biến hơn, vậy nên có rất nhiều phần mềm/ ứng dụng được ra đời để phục vụ cho các mục đích khác nhau.

Và ở thời điểm hiện tại, Android vẫn là một hệ điều hành phổ biến nhất cho các thiết bị điện thoại thông mình nói riêng và các thiết bị di dộng nói chung.

Chính vì vậy mà lập trình các ứng dụng trên hệ điều hành Android là một trong những hướng đi rất hay, rất tiềm năng cho các bạn lập trình viên.

Và ở trong bài viết này, mình sẽ cùng các bạn cài đặt phần mềm Android Studio – một công cụ gần như bắt buộc cho những bạn nào muốn học lập trình Android. Ok, chúng ta bắt đầu nhé !

Việc làm android hấp dẫn cho bạn online

  Ứng dụng mới cực hot từ Google: Android Sunflower
  10 tài liệu lập trình Android miễn phí từ cơ bản đến nâng cao

#1. Download và cài đặt Android Studio

+ Bước 1: Các bạn có thể download file cài đặt tại link sau (đây là trang web chính chủ của Goolge nha các bạn): https://developer.android.com/studio

cach-cai-dat-android-studio (1)

+ Bước 2: Sau khi download về, các bạn nháy đúp chuột vào file vừa tải để bắt đầu cài đặt => rồi bấm Next để tiếp tục.

cach-cai-dat-android-studio (2)

+ Bước 3: Tiếp theo chúng ta sẽ chọn các thành phần để cài đặt. Ở đây có mục Android Studio là bắt buộc rồi.

Ngoài ra thì các bạn có thể tích chọn Android Virtual Device để cài thêm các máy ảo phục vụ sau này => Bấm Next để tiếp tục.

cach-cai-dat-android-studio (3)

+ Bước 4: Tiếp theo là vị trí cài đặt mặc định sẽ là: C:\Program Files\Android\Android Studio như trong hình bên dưới. Các bạn có thể thay đổi bằng cách bấm vào Browse… để thay đổi thư mục cài đặt nếu thích.

cach-cai-dat-android-studio (4)

Ở bước tiếp theo này các bạn bấm Install để bắt đầu cài đặt.

cach-cai-dat-android-studio (5)

+ Bước 5: Quá trình cài đặt khá nhanh chóng (khoảng 1 phút), tùy thuộc vào tốc độ Internet của các bạn.

Android Studio có thể sẽ download một số thành phần bổ sung từ trên mạng về nên các bạn phải giữ cho Internet ổn định nhé.

=> Sau đó tiếp tục bấm Next để sang bước tiếp theo.

cach-cai-dat-android-studio (6)

Ok, đến đây về cơ bản các bạn đã cài đặt thành công Android Studio. Nhưng để có thể lập trình được thì các bạn phải cài thêm SDK nữa.

cach-cai-dat-android-studio (7)

#2. Cài đặt SDK

Sau khi bạn khởi động Android Studio lên thì chương trình sẽ hỏi bạn có muốn chia sẻ dữ liệu với Google không, các bạn có thể đồng ý (Send usage statistics to Google) hoặc không đồng ý (Don’t send).

Cái này tùy bạn nha, mình thì chọn Don's send.

cach-cai-dat-android-studio (8)

Tiếp theo các bạn bấm Next để bắt đầu sử dụng Android Studio.

cach-cai-dat-android-studio (9)

Android Studio sẽ yêu cầu một vài setup cơ bản (các bạn cứ chọn Standard) như hình bên dưới => rồi bấm Next là được.

cach-cai-dat-android-studio (10)

Đầu tiên sẽ là UI Theme, các bạn có thể chọn màu sáng hoặc tối (cái này các bạn có thể thay đổi sau khi cài đặt) => Bấm Next để sang bước tiếp theo.

cach-cai-dat-android-studio (11)

Ok, đến đây chúng ta sẽ lựa chọn các thành phần cài đặt của SDK. Vị trí cài đặt mặc định sẽ như hình bên dưới.

Mình để mặc định thì tổng dung lượng cài đặt là 1.66 GB => Bấm Next để chuyển sang bước tiếp theo.

cach-cai-dat-android-studio (12)

Android Studio sẽ xác nhận lại các thành phần bạn muốn cài đặt. Bạn chỉ cần bấm Finish để bắt đầu cài đặt.

cach-cai-dat-android-studio (13)

#3. Tạo mới một project trên Android Studio

Sau khi cài đặt xong thì đây chính là màn hình khởi đầu khi các bạn chạy Android Studio. Các bạn chọn Create New Project để tạo mới một project với Android Studio.

Ngoài ra, còn một số thao tác bên dưới nhưng mình sẽ cùng các bạn tìm hiểu trong các bài viết tiếp theo.

cach-cai-dat-android-studio (14)

Lần đầu tạo dự án có thể Android Studio sẽ hỏi các bạn vị trí cài đặt SDK. Các bạn cứ bấm vào Open SDK Manager như hình bên dưới.

cach-cai-dat-android-studio (15)

Bấm Next để tiếp tục.

cach-cai-dat-android-studio (16)

Android Studio sẽ xác nhận lại các thành phần bạn sử dụng theo bộ SDK mà bạn chọn để download về => Các bạn chỉ cần bấm Next để tiếp tục.

cach-cai-dat-android-studio (17)

Android Studio sẽ download từ Internet nên các bạn nhớ giữ kết nối mạng ổn định nhé.

cach-cai-dat-android-studio (18)

Xong thì các bạn bấm OK.

cach-cai-dat-android-studio (19)

Chọn giao diện Empty Activity (là giao diện đơn giản) cho người mới bắt đầu. Sau đó bấm Next để tạo mới project.

cach-cai-dat-android-studio (20)

Có một vài thông tin các bạn phải điền đó là:

  • (1) – Tên Project
  • (2) – Tên Package
  • (3) – Vị trí lưu Project (mã nguồn)
  • (4) – Ngôn ngữ lập trình (Java hoặc Kotlin)
  • (5) – Phiên bản SDK tối thiểu (có mức độ tương thích với các thiết bị)

=> Bấm Finish để hoàn tất và tạo mới Project.

cach-cai-dat-android-studio (21)

Ok, và đây chính là giao diện mở đầu. Mình sẽ cùng các bạn tìm hiểu kỹ hơn về các thành phần này trong các bài viết tiếp theo nha.

cach-cai-dat-android-studio (22)

#4. Lời kết

Vậy là trong bài viết này mình đã cùng các bạn cài đặt thành công phần mềm hỗ trợ lập trình ứng dụng Android (Android Studio) rồi nhé, và ngoài ra thì mình cũng đã hướng dẫn với bạn cách tạo mới một Project để các bạn bắt đầu vọc vạch rồi.

Trong các bài viết tiếp theo thì mình sẽ cùng các bạn tìm hiểu kỹ hơn về các thành phần, cũng như cấu trúc dự án xây dựng một ứng dụng Android. Hẹn gặp lại các bạn trong các bài viết tiếp theo nha !

Nguyễn Đức Cảnh – Bài viết gốc tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm Việc làm it lương cao hấp dẫn trên TopDev

File I/O trong Python

File I/O trong Python

Bài viết được sự cho phép của ucode.vn

Chắc bạn cũng đã quen thuộc với khái niệm File I/O khi đã học qua C hoặc C++. Và Python cũng hỗ trợ việc đọc và ghi dữ liệu tới các file.

In kết quả ra màn hình trong Python

Đến đây, chắc bạn đã quá quen thuộc về cách sử dụng của lệnh print. Lệnh này được sử dụng để in kết quả trên màn hình. Hàm này chuyển đổi biểu thức mà bạn đã truyền cho nó thành dạng chuỗi và ghi kết quả trên đầu ra chuẩn Standard Output. Cú pháp của lệnh print là:

print "Hoc Python la kha don gian,", "ban co thay vay khong?"

Kết quả là:

Hoc Python la kha don gian, ban co thay vay khong?

Xem thêm việc làm python tuyển dụng từ công ty lớn

Đọc input từ bàn phím trong Python

Python cung cấp hai hàm đã được xây dựng sẵn để nhận input từ người dùng. Hai hàm đó là:

Hàm input()

Hàm raw_input()

Hàm input() trong Python

Hàm này được sử dụng để nhận input từ người dùng. Hàm này giống hàm raw_input(), nhưng với hàm input() này thì bất cứ biểu thức nào được nhập từ người dùng thì nó ước lượng và sau đó trả về kết quả. Ví dụ:

str = input("Nhap dau vao cua ban: ");
print "Dau vao da nhan la : ", str

Code trên sẽ cho kết quả sau tùy thuộc vào input bạn đã nhập:

Nhap dau vao cua ban: [x*5 for x in range(2,10,2)]
Dau vao da nhan la :  [10, 20, 30, 40]

Hàm raw_input() trong Python

Hàm raw_input() được sử dụng để nhận đầu vào từ người dùng. Nó nhận đầu vào từ Standard Input dưới dạng một chuỗi và đọc dữ liệu từ từng dòng một. Ví dụ:

str = raw_input("Nhap dau vao cua ban: ");
print "Dau vao da nhan la : ", str

Kết quả khi mình nhập “Hello Python!” là:

Nhap dau vao cua ban: Hello Python
Dau vao da nhan la :  Hello Python

Ghi chú: Hàm raw_input() trả về một chuỗi. Vì thế trong trường hợp một biểu thức cần được ước lượng, thì nó phải ép kiểu sang kiểu dữ liệu sau của nó. Bạn theo dõi một số ví dụ dưới đây.
Ví dụ 1:

prn=int(raw_input("Trang uCode"))
r=int(raw_input("Thu Tu"))
t=int(raw_input("Vi Tri"))
si=(prn*r*t)/100
print "uCode Chao Ban ",si  

Kết quả là:

>>> 
Trang uCode1000
Thu Tu10
Vi Tri2
uCode Chao Ban  200
>>>  

Ví dụ 2:

name=raw_input("Nhap ten ban ")
math=float(raw_input("Nhap diem mon Toan"))
physics=float(raw_input("Nhap diem mon Vat Ly"))
chemistry=float(raw_input("Nhap diem mon Hoa Hoc"))
rollno=int(raw_input("Nhap mssv"))
print "Welcome ",name
print "MSSV cua ban la ",rollno
print "Diem mon Toan la ",math
print "Diem mon Vat Ly la ",physics
print "Diem mon Hoa Hoc la ",chemistry
print "Diem trung binh la ",(math+physics+chemistry)/3 

Kết quả là:

>>> 
Nhap ten ban Hoang
Nhap diem mon Toan7.68
Nhap diem mon Vat Ly7.14
Nhap diem mon Hoa Hoc8.84
Nhap mssv0987645672
Welcome  Hoang
MSSV cua ban la  987645672
Diem mon Toan la  7.68
Diem mon Vat Ly la  7.14
Diem mon Hoa Hoc la  8.84
Diem trung binh la  7.8866666667
>>>

Làm việc với File trong Python

Python cung cấp nhiều cách tiện lợi để bạn làm việc với file. Ở trên, bạn đã đọc dữ liệu từ Standard Input và ghi dữ liệu tới Standard Output. Bây giờ chúng ta tìm hiểu cách sử dụng các file dữ liệu thực sự. Một file là một nơi lưu trữ ngoại vi trên hard disk, tại đó dữ liệu có thể được lưu trữ và thu nhận. Dưới đây là các hoạt động trên File:

Mở file trong Python

Trước khi làm việc với bất cứ File nào, bạn phải mở File đó. Để mở một File, Python cung cấp hàm open(). Nó trả về một đối tượng File mà được sử dụng với các hàm khác. Với File đã mở, bạn có thể thực hiện các hoạt động đọc, ghi, … trên File đó. Cú pháp của hàm open() là:

doi_tuong_file = open(ten_file [, access_mode][, buffer])

Ở đây,

ten_file là tên File bạn muốn truy cập.

access_mode xác định chế độ của File đã được mở. Có nhiều mode sẽ được trình bày trong phần dưới. Bạn nên xác định mode này phụ thuộc vào các hoạt động mà bạn muốn thực hiện trên File đó. Chế độ truy cập mặc định là read.

buffer Nếu buffer được thiết lập là 0, nghĩa là sẽ không có trình đệm nào diễn ra. Nếu xác định là 1, thì trình đệm dòng được thực hiện trong khi truy cập một File. Nếu là số nguyên lớn hơn 1, thì hoạt động đệm được thực hiện với kích cỡ bộ đệm đã cho. Nếu là số âm, thì kích cỡ bộ đệm sẽ là mặc định (hành vi mặc định).

  Tuyển tập chuẩn “sách giáo khoa” Python

Đóng một File trong Python

Khi bạn đã thực hiện xong các hoạt động trên File thì cuối cùng bạn cần đóng File đó. Python tự động đóng một File khi đối tượng tham chiếu của một File đã được tái gán cho một file khác. Tuy nhiên, sử dụng phương thức close() để đóng một file là một sự thực hành tốt cho bạn. Phương thức close() có cú pháp như sau:

fileObject.close();

Đọc một File trong Python

Để đọc một File, bạn sử dụng phương thức read() trong Python. Cú pháp là:

doi_tuong_file.read(giatri);  

Ở đây, value là số byte để được đọc từ file đã mở. Phương thức này bắt đầu đọc từ phần đầu file và nếu bạn không cung cấp tham số value thì phương thức này cố gắng đọc nhiều dữ liệu nhất có thể, có thể tới cuối File.

Ghi tới một File trong Python

Phương thức write() được sử dụng để ghi bất kỳ chuỗi nào tới một File đã mở. Bạn chú ý là phương thức write này không thêm một ký tự newline (dòng mới) (‘\n’) vào cuối chuỗi. Cú pháp của write() là:

doi_tuong_file.write(string);

Dưới đây là chương trình ví dụ để đọc và ghi dữ liệu từ một File trong Python:

obj=open("abcd.txt","w")
obj.write("Python xin chao cac ban")
obj.close()
obj1=open("abcd.txt","r")
s=obj1.read()
print s
obj1.close()
obj2=open("abcd.txt","r")
s1=obj2.read(20)
print s1
obj2.close()

Kết quả là:

>>> 
Python xin chao cac ban
Chao mung ban den voi the gioi Python
>>>

Các thuộc tính của File trong Python

Đối tượng File có các thuộc tính sau:

Thuộc tính Miêu tả
file.closed Trả về true nếu file đã được đóng, nếu không là false
file.mode Trả về chế độ truy cập nào mà file đã mở với
file.name Trả về tên file
file.softspace Trả về false nếu space được yêu cầu tường minh với print, nếu không là true

Ví dụ
Chúng ta tạo foo.txt có nội dung sau:

# Mo mot file
fo = open("foo.txt", "wb")
fo.write( "Python la mot ngon ngu lap trinh tuyet voi.\nMinh cung nghi nhu the!!\n");

# Dong file da mo
fo.close()

Giờ chúng ta kiểm tra các thuộc tính của nó:

# Mo mot file
fo = open("foo.txt", "wb")
print "Ten cua file la: ", fo.name
print "File da duoc dong hay chua : ", fo.closed
print "Che do mode la : ", fo.mode
print "Softspace la : ", fo.softspace

Kết quả là:

Ten cua file la:  foo.txt
File da duoc dong hay chua :  False
Che do mode la :  wb
Softspace la :  0
  IronPython

Các chế độ truy cập (mode) của File trong Python

File có thể được mở với các chế độ truy cập khác nhau. File có thể được mở trong Text Mode hoặc Binary Mode. Bảng dưới liệt kê và giới thiệu các chế độ này:

Mode Miêu tả
r Mở file trong chế độ đọc, đây là chế độ mặc định. Con trỏ tại phần bắt đầu của File
rb Mở file trong chế độ đọc cho định dạng nhị phân, đây là chế độ mặc định. Con trỏ tại phần bắt đầu của File
r+ Mở file để đọc và ghi. Con trỏ tại phần bắt đầu của File
rb+ Mở file để đọc và ghi trong định dạng nhị phân. Con trỏ tại phần bắt đầu của File
w Mở File trong chế độ ghi. Nếu file đã tồn tại, thì ghi đè nội dung của file đó, nếu không thì tạo một file mới
wb Mở File trong chế độ ghi trong định dạng nhị phân. Nếu file đã tồn tại, thì ghi đè nội dung của file đó, nếu không thì tạo một file mới
w+ Mở file để đọc và ghi. Nếu file tồn tại thì ghi đè nội dung của nó, nếu file không tồn tại thì tạo một file mới để đọc và ghi
wb+ Mở file để đọc và ghi trong định dạng nhị phân. Nếu file tồn tại thì ghi đè nội dung của nó, nếu file không tồn tại thì tạo một file mới để đọc và ghi
a Mở file trong chế độ append. Con trỏ là ở cuối file nếu file này đã tồn tại. Nếu file không tồn tại, thì tạo một file mới để ghi
ab Mở file trong chế độ append trong chế độ nhị phân. Con trỏ là ở cuối file nếu file này đã tồn tại. Nếu file không tồn tại, thì tạo một file mới để ghi
a+ Mở file trong để đọc và append. Con trỏ file tại cuối nếu file đã tồn tại. Nếu không tồn tại thì tạo một file mới để đọc và ghi
ab+ Mở file trong để đọc và append trong định dạng nhị phân. Con trỏ file tại cuối nếu file đã tồn tại. Nếu không tồn tại thì tạo một file mới để đọc và ghi

Thay tên file trong Python

Phương thức rename() trong os Module được sử dụng để thay tên file. Phương thức này nhận hai tham số là tên file cũ và tên file mới.

Cú pháp

os.rename(ten_file_hien_tai, ten_file_moi)

Ví dụ sau thay tên test1.txt thành test2.txt:

import os

# Thay ten tu test1.txt thanh test2.txt
os.rename( "test1.txt", "test2.txt" )

Xóa file trong Python

Bạn có thể sử dụng phương thức remove() của os Module để xóa các file với tham số là tên file bạn cần xóa.

Cú pháp

os.remove(ten_file)

Ví dụ sau sẽ xóa test2.txt:

import os

# Xoa test2.txt
os.remove("text2.txt")

Vị trí File trong Python

Phương thức tell() nói cho bạn biết vị trí hiện tại bên trong file. Nói cách khác, việc đọc và ghi tiếp theo sẽ diễn ra trên các byte đó.
Phương thức seek(offset[, from]) thay đổi vị trí hiện tại bên trong file. Tham số offset chỉ số byte để được di chuyển. Tham số from xác định vị trí tham chiếu mà từ đó byte được di chuyển.
Nếu from được thiết lập là 0 nghĩa là sử dụng phần đầu file như là vị trí tham chiếu và 1 nghĩa là sử dụng vị trí hiện tại như là vị trí tham chiếu và nếu là 2 thì sử dụng phần cuối file như là vị trí tham chiếu.

Ví dụ
Sử dụng foo.txt đã tạo ở trên để minh họa các hàm tell và seek:

# Mo mot file
fo = open("foo.txt", "r+")
str = fo.read(10);
print "Chuoi da doc la : ", str

# Kiem tra con tro hien tai
position = fo.tell();
print "Con tro file hien tai : ", position

# Dat lai vi tri con tro tai vi tri ban dau mot lan nua
position = fo.seek(0, 0);
str = fo.read(10);
print "Chuoi da doc la : ", str
# Dong file da mo
fo.close()

Kết quả là:

Chuoi da doc la :  Python is
Con tro file hien tai :  10
Chuoi da doc la :  Python la

Thư mục trong Python

Tất cả file được chứa trong các thư mục đa dạng và Python cũng cung cấp rất nhiều phương thức để xử lý các hoạt động đa dạng liên quan tới thư mục. os Module có một số phương thức giúp bạn tạo, xóa, và thay đổi các thư mục.

Phương thức mkdir() trong Python

Bạn có thể sử dụng phương thức mkdir() của os Module để tạo các thư mục trong thư mục hiện tại. Bạn cần cung cấp một tham số là tên thư mục cho phương thức này.
Cú pháp

os.mkdir("thu_muc_moi")

Ví dụ sau tới thư mục /home/newdir.

import os

# Thay doi mot thu muc toi "/home/newdir"
os.chdir("/home/newdir")

Phương thức getcwd() trong Python

Phương thức getcwd() hiển thị thư mục đang làm việc hiện tại.

Cú pháp

os.getcwd()

Ví dụ sau hiển thị thư mục đang làm việc hiện tại.

import os

# Lenh nay se cung cap vi tri thu muc hien tai
os.getcwd()

Phương thức rmdir() trong Python

Phương thức rmdir() xóa thư mục mà có tên được truyền như là một tham cố cho phương thức này.

Trước khi xóa thư mục, tất cả nội dung trong nó nên được xóa.
Cú pháp

os.rmdir('ten_thu_muc')

Ví dụ sau sẽ xóa thư mục /tmp/test. Bạn phải cung cấp tên đầy đủ của thư mục, nếu không phương thức này sẽ không tìm thấy thư mục đó và sẽ không có hoạt động xóa diễn ra.

import os

# Xoa thu muc "/tmp/test" .
os.rmdir( "/tmp/test"  )

Các phương thức xử lý File và thư mục trong Python

Đối tượng File và OS cung cấp rất nhiều phương thức tiện ích để xử lý và thao tác với File và thư mục trên hệ điều hành Windows và Unix. Bạn truy cập đường link sau để tìm hiểu các phương thức này.
Đối tượng File: cung cấp các phương thức để thao tác File.

os Module: cung cấp rất nhiều phương thức để thao tác File và thư mục.

Bài viết gốc được đăng tải tại ucode.vn

Có thể bạn quan tâm:

Xem thêm việc làm IT lương cao hấp dẫn trên TopDev

Đa hình trong C++

Đa hình trong C++

Bài viết được sự cho phép của tác giả Khiêm Lê

Đa hình là gì?

Đa hình là một trong bốn tính chất đặc trưng của lập trình hướng đối tượng bên cạnh tính đóng gói, tính trừu tượng và tính kế thừa. Vậy thì đa hình là gì?

Đa hình (polymorphism) là hiện tượng mà các đối tượng thuộc các class khác nhau có thể biểu diễn cùng một thông thiệp theo các cách khác nhau. Hơi nặng về lý thuyết một chút nhưng xem ví dụ sau bạn sẽ rõ ngay!

Ví dụ hai con vật là con chó và con mèo, hai con vật này đều có thể phát ra tiếng nhưng con mèo sẽ kêu “meo meo” còn con chó lại sủa “gâu gâu”. Hành động phát ra tiếng này tuy là một hành động nhưng khi được 2 đối tượng khác nhau là chó và mèo thực hiện thì lại khác nhau.

Trước khi đi vào chi tiết, hãy chắc chắn rằng bạn đã nắm được các kiến thức sau:

  • Con trỏ và cấp phát động trong C++
  • Cơ bản về Class trong C++
  • Kế thừa trong C++
  • Vector trong C++

Các loại đa hình

Có hai loại đa hình, một là Compile time Polymorphism và Runtime Polymorphism. Compile time Polymorphism nghĩa là cách mà đối tượng thực hiện thông điệp được xác định ngay lúc biên dịch chương trình. Ví dụ cơ bản của Compile time Polymorphism là Overriding và Overloading.

Khi bạn overloading, các hàm đó sẽ có cùng tên nhưng khác tham số, đó chính là đa hình, cùng là một hàm nhưng với các đối tượng là các tham số khác nhau thì hành động thực hiện cũng sẽ khác nhau. Tương tự với overriding, phương thức ở class cơ sở bị override ở class dẫn xuất, điều đó làm cho tuy cùng một phương thức nhưng đối tượng thuộc class cơ sở sẽ thực hiện khác đối tượng thuộc class dẫn xuất.

Đối với Runtime Polymorphism, cách mà đối tượng thực hiện thông điệp không được xác định lúc biên dịch mà nó chỉ được xác định khi chương trình được thực thi. Sử dụng lại ví dụ ban đầu, vẫn là hành động phát ra tiếng của chó và mèo, tuy nhiên, bạn sẽ không thể biết thực hiện như thế nào cho đến khi biết đối tượng là con chó hay mèo để thực hiện kêu “meo meo” hay là sủa “gâu gâu”.

Compile time Polymorphism thì chắc các bạn cũng đã quá quen thuộc rồi, trong bài viết này, mình sẽ chỉ giới thiệu Runtime Polymorphism thôi.

  1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++
  Bảng băm trong C++

Lợi ích của đa hình

Như định nghĩa của đa hình, đa hình thực hiện cùng một thông điệp theo các cách khác nhau, do đó, code của chúng ta sẽ không bị lặp.

Ví dụ mình có bài toán công ty quản lý hai loại nhân viên là nhân viên văn phòng (NVVP) và nhân viên sản xuất (NVSX), mình sẽ cho người dùng nhập nhân nhiên và tính lương sau đó xuất ra. Mình sẽ có sơ đồ class như sau:

Sơ đồ class

Dựa trên sơ đồ đã xây dựng, mình sẽ code các class như sau:

class NhanVien
{
protected:
    string hoTen;
    float luong;

public:
    NhanVien()
    {
        this->hoTen = "";
        this->luong = 0.0;
    }

    void nhap()
    {
        cout << "Ho ten: ";
        cin.ignore();
        getline(cin, this->hoTen);
    }

    void xuat()
    {
        cout << "Ho ten: ";
        cout << this->hoTen << endl;
    }

    void tinhLuong() {}
};
class NhanVienSanXuat : public NhanVien
{
private:
    int soSanPham;
    float tienCong1SP;

public:
    NhanVienSanXuat() : NhanVien()
    {
        this->soSanPham = 0;
        this->tienCong1SP = 0;
    }

    void nhap()
    {
        NhanVien::nhap();
        cout << "So san pham: ";
        cin >> this->soSanPham;
        cout << "Tien cong 1 san pham: ";
        cin >> this->tienCong1SP;
    }

    void xuat()
    {
        cout << "So san pham: ";
        cout << this->soSanPham << endl;
        cout << "Tien cong 1 san pham: ";
        cout << this->tienCong1SP << endl;
        cout << "Luong: ";
        cout << this->luong << endl;
    }

    void tinhLuong()
    {
        this->luong = this->soSanPham * this->tienCong1SP;
    }
};
class NhanVienVanPhong : public NhanVien
{
private:
    float luongCoBan;
    int soNgayLamViec;

public:
    NhanVienVanPhong() : NhanVien()
    {
        this->luongCoBan = 0.0;
    }

    void nhap()
    {
        NhanVien::nhap();
        cout << "Luong co ban: ";
        cin >> this->luongCoBan;
        cout << "So ngay lam viec: ";
        cin >> this->soNgayLamViec;
    }

    void xuat()
    {
        NhanVien::xuat();
        cout << "Luong co ban: ";
        cout << this->luongCoBan << endl;
        cout << "So ngay lam viec: ";
        cout << this->soNgayLamViec << endl;
        cout << "Luong: ";
        cout << this->luong << endl;
    }

    void tinhLuong()
    {
        this->luong = this->soNgayLamViec * this->luongCoBan;
    }
};
class CongTy
{
private:
    vector<NhanVienVanPhong> NVVP;
    vector<NhanVienSanXuat> NVSX;

public:
    void nhap()
    {
        cout << "Nhap so nhan vien van phong: ";
        int n;
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            NhanVienVanPhong nv;
            nv.nhap();
            this->NVVP.push_back(nv);
        }

        cout << "Nhap so nhan vien san xuat: ";
        int m;
        cin >> m;
        for (int i = 0; i < m; i++)
        {
            NhanVienSanXuat nv;
            nv.nhap();
            this->NVSX.push_back(nv);
        }
    }

    void xuat()
    {
        cout << "Nhan vien van phong:" << endl;
        for (int i = 0; i < this->NVVP.size(); i++)
        {
            cout << "STT:" << i + 1 << endl;
            this->NVVP.at(i).xuat();
        }

        cout << "Nhan vien san xuat:" << endl;
        for (int i = 0; i < this->NVSX.size(); i++)
        {
            cout << "STT:" << i + 1 << endl;
            this->NVSX.at(i).xuat();
        }
    }

    void tinhLuong()
    {
        for (int i = 0; i < this->NVVP.size(); i++)
            this->NVVP.at(i).tinhLuong();
        for (int i = 0; i < this->NVSX.size(); i++)
            this->NVSX.at(i).tinhLuong();
    }
};

Nhìn vào những đoạn code trên, bạn có thể dễ dàng nhận ra rằng, tuy đều là hành động nhập, xuất và tính lương, tuy nhiên chúng ta lại phải gọi phương thức này cho 2 đối tượng thuộc kiểu khác nhau là NVVP và NVSX. Còn một điều nữa là tuy đều là nhân viên nhưng lại phải dùng 2 vector khác nhau để lưu trữ 2 đối tượng này.

Câu hỏi đặt ra là liệu có cách nào để có thể lưu trữ 2 loại nhân viên này trong cùng một vector? Và phương thức nhập, xuất, tính lương có thể tự động biết nó thực hiện hành động cho đối tượng nào để thực hiện cho đúng không? Câu trả lời là có và nó được thực hiện thông qua phương thức ảo. Vậy thì hãy cùng tìm hiểu phương thức ảo là gì?

Phương thức ảo

Phương thức ảo (virtual method) trong C++ là cách thể hiện tính đa hình trong lập trình hướng đối tượng của C++, các phương thức ở class cơ sở có tính đa hình phải được định nghĩa là một phương thức ảo.

Và để khai báo một phương thức ảo, ta khai báo như bình thường nhưng thêm từ khóa “virtual” phía trước.

class <ClassName>
{
protected:
    virtual <returnType> <methodName>([<params>]) {}
};

Ví dụ như trong bài toán ở trên, các phương thức tính lương, nhập và xuất đều có tính đa hình do đối với hai đối tượng NVSX và NVVP thì sẽ có cách thực hiện phương thức khác nhau. Do đó, mình sẽ chỉnh sửa 3 phương thức này ở class dẫn xuất thành phương thức ảo như sau:

class NhanVien
{
public:
    virtual void nhap()
    {
        // code goes here...
    }

    virtual void xuat()
    {
        // code goes here...
    }

    virtual void tinhLuong()
    {
        // code goes here...
    }
};

Chúng ta đã có các phương thức ảo, vậy vấn đề hiện tại là làm sao để chương trình biết phương thức của đối tượng nào để thực hiện cho đúng? Thì trong C++, tính đa hình được thể hiện thông qua tham chiếu và con trỏ. Cụ thể như sau:

Đối với tham chiếu, đối tượng tham chiếu của class cơ sở có thể tham chiếu đến đối tượng thuộc class dẫn xuất. Lúc này, khi gọi phương thức ảo, chương trình sẽ gọi đúng phương thức của đối tượng mà biến tham chiếu tham chiếu tới. Ví dụ:

NhanVienVanPhong nvvp;
NhanVien &nv = nv; // biến nv tham chiếu đến biến nvvp

nv.nhap(); // Phương thức được gọi là sẽ phương thức nhập của class NhanVienVanPhong

Do để tham chiếu đến một biến, bắt buộc biến kia phải tồn tại trước, do đó cách tham chiếu rất ít khi được sử dụng mà thay vào đó, người ta sẽ dùng con trỏ.

Trong bài Kế thừa trong C++, mình đã có nói con trỏ của class cơ sở có thể trỏ đến đối tượng của class dẫn xuất, tính đa hình trong C++ chủ yếu đều thể hiện qua cách này. Cũng tương tự như việc tham chiếu, thực hiện qua con trỏ như sau:

NhanVien *nv = new NhanVienVanPhong; // con trỏ nv trỏ tới biến động kiểu NhanVienVanPhong

nv->nhap(); // Phương thức được gọi là sẽ phương thức nhập của class NhanVienVanPhong

Quay trở lại với bài toán ban đầu, giờ đây chúng ta đã có thể trả lời hai câu hỏi. Để lưu trữ 2 đối tượng mà chỉ dùng một vector chúng ta sẽ sử dụng con trỏ trỏ đến đối tượng thuộc class dẫn xuất. Các phương thức có thể được gọi theo đúng đối tượng thông qua con trỏ mà vector lưu trữ. Bây giờ chúng ta sẽ sửa lại như sau:

// Thay
vector<NhanVienVanPhong> NVVP;
vector<NhanVienSanXuat> NVSX;
// ở class CongTy Bằng
vector<NhanVien *> NV;

Do thuộc tính thay đối, các phương thức có liên quan cũng thay đổi theo, ta sẽ sửa lại các phương thức của class CongTy không cần thực hiện trên hai vector khác nhau, hai đối tượng khác nhau nữa, chúng ta sẽ sử dụng tính đa hình, code như sau:

void nhap()
{
    cout << "Nhap so nhan vien: ";
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cout << "Nhan vien van phong (1), nhan vien san xuat (2): ";
        int k;
        cin >> k;
        NhanVien *nv;
        // Tùy vào người dùng chọn đối tượng nào để nhập
        if (k == 1)
            nv = new NhanVienVanPhong;
        else
            nv = new NhanVienSanXuat;
        nv->nhap(); // ta sẽ sử dụng hàm nhập của đối tượng mà người dùng chọn
        this->NV.push_back(nv);
    }
}

void xuat()
{
    cout << "Nhan vien van phong:" << endl;
    for (int i = 0; i < this->NV.size(); i++)
    {
        cout << "STT:" << i + 1 << endl;
        this->NV.at(i)->xuat(); // tùy vào đối tượng là gì mà phương thức xuất sẽ được gọi theo đúng đối tượng đó
    }
}

void tinhLuong()
{
    for (int i = 0; i < this->NV.size(); i++)
        this->NV.at(i)->tinhLuong(); // tùy vào đối tượng là gì mà phương thức tính lương sẽ được gọi theo đúng đối tượng đó
}

Cơ chế hoạt động của phương thức ảo là dựa trên liên kết động, có thể hiểu liên kết động là đối tượng không được xác định cụ thể khi biên dịch mà chỉ được xác định trong lúc chương trình thực thi.

Nói qua một chút về cách sử dụng tính đa hình với hàm. Giả sử mình muốn tính lương độc lập cho một nhân viên, không cụ thể nhân viên nào mà sẽ tùy thuộc vào nhân viên bạn muốn tính, mình sẽ viết hàm như sau:

// Cách 1: tham chiếu
void tinhLuong(NhanVien &nv)
{
    nv.tinhLuong();
}

// Cách 2: con trỏ (nên dùng)
void tinhLuong(NhanVien *nv)
{
   nv->tinhLuong();
}

Rất tiện lợi phải không, thay vì việc phải viết hai hàm để gọi cho đúng phương thức theo từng đối tượng khác nhau.

Lưu ý: tính đa hình chỉ sử dụng được thông qua tham số là tham chiếu hoặc con trỏ, nếu bạn sử dụng một tham số bình thường, phương thức của class cơ sở sẽ được gọi vì về bản chất nó là một đối tượng thuộc kiểu class cơ sở.

void tinhLuong(NhanVien nv)
{
    nv.tinhLuong(); // tham số nv thuộc class NhanVien nên phương thức tính lương của class NhanVien sẽ được gọi
}

Phương thức thuần ảo

Nếu như phân tích kỹ thêm một chút, bạn sẽ thấy là class nhân viên thì phương thức tính lương không có bởi vì ta không thể tính lương cho một nhân viên mà không biết là nhân viên gì. Các class dẫn xuất của nó là một cụ thể hóa của class cơ sở nhân viên, nên ta có thể tính lương được, ta biết cách tính cho từng loại nhân viên như thế nào.

Từ những điều trên, ta có khái niệm phương thức thuần ảo. Phương thức thuần ảo (pure virtual method) là phương thức ảo không có phần định nghĩa và bắt buộc phải được override ở class dẫn xuất. Để khai báo phương thức thuần ảo, ta cũng khai báo tương tự như phương thức ảo nhưng thay vì định nghĩa phần thân hàm, ta sẽ cho nó bằng 0.

class <ClassName>
{
public:
    virtual <returnType> <methodName>([<params>]) = 0;
};

Quay lại với bài toán của chúng ta, class nhân viên sẽ không cần có hàm tính lương cụ thể do ta không biết tính như thế nào khi không xác định được loại nhân viên. Và ở class dẫn xuất, chúng ta cần có cách tính lương khác nhau cho mỗi loại nhân viên, từ đó suy ra phương thức tính lương sẽ là phương thức thuần ảo. Chúng ta sẽ sửa lại như sau:

class NhanVien
{
public:
    // code goes here...
    virtual void tinhLuong() = 0;
};

Khi mà phương thức tính lương trở thành thuần ảo, ở class dẫn xuất bắt buộc cần phải override lại phương thức này. Chúng ta vẫn thực hiện override bình thường. Do ở class dẫn xuất mình đã override rồi nên không cần sửa gì cả.

Lớp trừu tượng

Lớp trừu tượng (abstract class) là một class chứa phương thức thuần ảo, không thể tạo một đối tượng thuộc lớp trừu tượng. Điều này hiển nhiên, bởi vì nếu class chứa một hoặc nhiều phương thức ảo, khi đối tượng được tạo thì phương thức đó sẽ không có định nghĩa và sẽ gây lỗi.

Một lớp trừu tượng phải có ít nhất một phương thức thuần ảo và nó có thể cùng có các phương thức và phương thức ảo khác. Các phương thức và phương thức ảo thuộc lớp trừu tượng vẫn có thể được gọi từ class dẫn xuất qua toán tử phạm vi (::) như bình thường.

Lớp trừu tượng làm cho logic thực tế trở nên hợp lý hơn trong lập trình. Như đã nói ở trên, bạn không thể tính lương khi không biết nhân viên đó là nhân viên gì, do đó, theo logic, ta không thể tạo đối tượng nhân viên được. Hay nói đúng hơn, ta không nên cho phép người lập trình có thể tạo ra đối tượng nhân viên bằng cách làm cho lớp đó trở thành lớp thuần ảo.

Vì phương thức nhập, xuất vẫn không cần override lại hoàn toàn, do đó mình sẽ giữ nguyên, chỉ đổi phương thức tính tiền thành phương thức thuần ảo thôi.

class NhanVien
{
public:
    // Code goes here...
    virtual void tinhLuong() = 0;
};

Lúc này, bất kỳ class nào kế thừa từ class nhân viên đều phải override lại phương thức tính lương. Và bạn cũng không thể tạo được đối tượng nhân viên nữa. Ví dụ:

class NhanVienKiemToan : public NhanVien
{
public:
    void tinhLuong() // override method tinhLuong
    {
        // Nếu không override sẽ nhận thông báo lỗi
    }
};
NhanVien nx; // lỗi vì không thể tạo đối tượng thuộc abstract class

Lưu ý là con trỏ class nhân viên vẫn có thể tạo được bình thường (nếu không thì sao sử dụng được đa hình :D).

Interface

Phần này giới thiệu thêm cho các bạn thôi bởi vì trong C++ không hỗ trợ sẵn concept interface, các bạn nên tìm hiểu concept của các ngôn ngữ hiện đại khác như C#, Java… Tuy nhiên ta vẫn có thể sử dụng concept của các ngôn ngữ khác cho C++.

Interface có thể được hiểu là một class trừu tượng hoàn toàn, nghĩa là mọi phương thức của interface đều là phương thức thuần ảo và bạn sẽ cần phải override lại tất cả các phương thức của interface ở class dẫn xuất. Ví dụ:

class Animal // Animal là một Interface
{
protected:
    string sound;
public:
    virtual void move() = 0;
    virtual void makeNoise() = 0;
    virtual void eat() = 0;
};

// Class kế thừa từ Animal đều phải override toàn bộ
class Dog
{
public:
    Dog()
    {
        sound = "Woo - Woo!";
    }
    virtual void move()
    {
        // code goes here...
    }

    virtual void makeNoise()
    {
        // code goes here...
    }

    virtual void eat()
    {
        // code goes here...
    }
};

Tổng kết

Vậy là trong bài viết này, mình đã giới thiệu cho các bạn về tính đa hình trong C++ và các vấn đề liên quan như phương thức ảo, thuần ảo, lớp trừu tượng và interface. Hy vọng là bài viết có ích với mọi người, đừng quên chia sẻ bài viết để mọi người cùng biết nha. Nếu có bất kỳ thắc mắc nào các bạn hãy để lại comment phía bên dưới mình sẽ phản hồi. Cảm ơn các bạn đã theo dõi bài viết!

Source Code

#include <iostream>
using namespace std;

#include <vector>
#include <string>

class NhanVien
{
protected:
    string hoTen;
    float luong;

public:
    NhanVien()
    {
        this->hoTen = "";
        this->luong = 0.0;
    }

    virtual void nhap()
    {
        cout << "Ho ten: ";
        cin.ignore();
        getline(cin, this->hoTen);
    }

    virtual void xuat()
    {
        cout << "Ho ten: ";
        cout << this->hoTen << endl;
    }

    virtual void tinhLuong() = 0;
};

class NhanVienSanXuat : public NhanVien
{
private:
    int soSanPham;
    float tienCong1SP;

public:
    NhanVienSanXuat() : NhanVien()
    {
        this->soSanPham = 0;
        this->tienCong1SP = 0;
    }

    void nhap()
    {
        NhanVien::nhap();
        cout << "So san pham: ";
        cin >> this->soSanPham;
        cout << "Tien cong 1 san pham: ";
        cin >> this->tienCong1SP;
    }

    void xuat()
    {
        cout << "So san pham: ";
        cout << this->soSanPham << endl;
        cout << "Tien cong 1 san pham: ";
        cout << this->tienCong1SP << endl;
        cout << "Luong: ";
        cout << this->luong << endl;
    }

    void tinhLuong()
    {
        this->luong = this->soSanPham * this->tienCong1SP;
    }
};

class NhanVienVanPhong : public NhanVien
{
private:
    float luongCoBan;
    int soNgayLamViec;

public:
    NhanVienVanPhong() : NhanVien()
    {
        this->luongCoBan = 0.0;
    }

    void nhap()
    {
        NhanVien::nhap();
        cout << "Luong co ban: ";
        cin >> this->luongCoBan;
        cout << "So ngay lam viec: ";
        cin >> this->soNgayLamViec;
    }

    void xuat()
    {
        NhanVien::xuat();
        cout << "Luong co ban: ";
        cout << this->luongCoBan << endl;
        cout << "So ngay lam viec: ";
        cout << this->soNgayLamViec << endl;
        cout << "Luong: ";
        cout << this->luong << endl;
    }

    void tinhLuong()
    {
        this->luong = this->soNgayLamViec * this->luongCoBan;
    }
};

class CongTy
{
private:
    vector<NhanVien *> NV;

public:
    void nhap()
    {
        cout << "Nhap so nhan vien: ";
        int n;
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            cout << "Nhan vien van phong (1), nhan vien san xuat (2): ";
            int k;
            cin >> k;
            NhanVien *nv;
            // Tùy vào người dùng chọn đối tượng nào để nhập
            if (k == 1)
                nv = new NhanVienVanPhong;
            else
                nv = new NhanVienSanXuat;
            nv->nhap(); // ta sẽ sử dụng hàm nhập của đối tượng mà người dùng chọn
            this->NV.push_back(nv);
        }
    }

    void xuat()
    {
        cout << "Nhan vien van phong:" << endl;
        for (int i = 0; i < this->NV.size(); i++)
        {
            cout << "STT:" << i + 1 << endl;
            this->NV.at(i)->xuat(); // tùy vào đối tượng là gì mà phương thức xuất sẽ được gọi theo đúng đối tượng đó
        }
    }

    void tinhLuong()
    {
        for (int i = 0; i < this->NV.size(); i++)
            this->NV.at(i)->tinhLuong(); // tùy vào đối tượng là gì mà phương thức tính lương sẽ được gọi theo đúng đối tượng đó
    }
};

int main()
{
    CongTy cty;
    cty.nhap();
    cty.tinhLuong();
    cty.xuat();
    return 0;
}
Có thể bạn quan tâm:
Xem thêm Việc làm Developer hấp dẫn trên TopDev

Khám Phá Chân Dung Lập Trình Viên Việt Trong Năm 2022

Theo số liệu trong “Báo Cáo Thị Trường IT Việt Nam 2021 | Developers Recruitment State” do TopDev phát hành, hiện nay nhân sự ngành IT tại Việt Nam phần lớn là các lập trình viên trẻ thuộc thế hệ Millennials và Gen Z vì vậy các nhà tuyển dụng cần chú ý đến độ tuổi, sở thích, kỹ năng,… để điều chỉnh kế hoạch tuyển dụng phù hợp với xu hướng tuyển dụng đa thế hệ hiện nay. 

Hãy cùng khám phá chân dung của lập trình viên Việt Nam trong năm 2021 ngay bên dưới đây nhé!

DOWNLOAD

1. Độ tuổi

Tính đến thời điểm hiện tại, hơn 50% số lượng lập trình viên tại Việt Nam là những người trẻ có độ tuổi từ 20 – 29. Điều này cho thấy thế hệ Millennials (Gen Y) là lực lượng lao động chủ đạo trong ngành IT trong 2021. Nói về Millennials, đây là thế hệ mong muốn sự cân bằng giữa công việc và cuộc sống tốt hơn, biết thêm thông tin về công ty, sản phẩm của mình và muốn tham gia vào hầu hết quá trình phát triển sản phẩm. Họ cũng mong đợi sản phẩm góp phần hữu ích cho cộng đồng. Với nhịp sống nhanh đòi hỏi một lối sống năng động và linh hoạt, việc xây dựng các chiến lược săn đón cũng như giữ chân các nhân tài IT thế hệ Millennial là điều cần thiết đối với các nhà tuyển dụng.

Tuy nhiên, các nhà tuyển dụng cũng cần chuẩn bị cho Centennials (GenZ), theo sau Millennials. Tư duy của GenZ và cách tương tác với họ đang trở nên khác biệt hơn rất nhiều. Chúng được dự báo như một làn sóng mới có thể thay đổi bối cảnh ngành dịch vụ và giải trí, chắc chắn tuyển dụng IT không phải là trường hợp miễn trừ.

2. Giới tính

Công nghệ thông tin được xem là ngành do nam giới “thống trị” bởi số lượng lập trình viên nam nhiều hơn hẳn nữ. Theo số liệu thống kê trong “Báo cáo thị trường IT Việt Nam 2021 – Developers Recruitment State”, giới tính nam chiếm ưu thế trong giới lập trình viên hoặc những người làm việc trong lĩnh vực công nghệ với hơn 92,05%. Bên cạnh đó nữ chiếm tỷ lệ nhỏ hơn với 7,85%, tuy nhiên, tỷ lệ lập trình viên nữ đã tăng lên đáng kể so với những năm trước, đặc biệt là những người có từ 2 năm kinh nghiệm trở lên. 

3. Công nghệ và kỹ năng chuyên môn

Phần lớn các Lập trình viên cho rằng ngành kỹ thuật AI & Cloud sẽ dẫn đầu xu hướng hiện tại, tiếp theo là Fintech/ Payment và xếp thứ 3 là Thương mại điện tử/ Bán lẻ. Không có gì ngạc nhiên khi Cloud Engineering, Fintech, e-Commerce, Cybersecurity và Business Service là lựa chọn hàng đầu để học hỏi và phát triển của các lập trình viên. Vào 2020, xu hướng chuyển đổi kỹ thuật số diễn ra trong tất cả các khía cạnh của cuộc sống hàng ngày cũng như nơi làm việc. Sự phát triển của mua sắm trực tuyến, quản lý trực tuyến và tầm quan trọng của an ninh mạng đã khiến những ngành này trở nên hấp dẫn hơn bao giờ hết.

So với 2 năm trước, mối quan tâm hàng đầu của các công nghệ đã có một số thay đổi đáng kể. Đáng chú ý nhất là sự quan tâm ngày càng tăng về các công nghệ DevOps và Cloud, được thúc đẩy bởi chuyển đổi kỹ thuật số và các vấn đề mới nảy sinh trong thời đại dịch. 

Theo sau danh sách là những cái tên luôn nổi trong “đường đua” công nghệ: Big Data/ Data Science, Machine Learning/ Artificial Intelligence. Khi công nghệ dữ liệu tiên tiến dần cung cấp các giải pháp tối ưu cho cuộc sống hiện tại cũng như dự đoán tốt và chính xác hơn các xu hướng trong tương lai (cả rủi ro và mối đe dọa), các tài năng IT càng có mong muốn áp dụng các công nghệ này vào các sản phẩm và công việc lập trình của họ. 

Công nghệ không thể thiếu tiếp theo là An ninh mạng, đại dịch đã hình thành rất nhiều hành vi, nhu cầu và sự thay đổi mới, từ offline sang online, từ onsite đến remote, đã đặt ra nhiều vấn đề về quản lý, bảo mật, ổn định và mức độ riêng tư của dữ liệu/ hệ thống. Từ đó, đã khiến cho các lập trình viên có nhu cầu muốn học hỏi và có thêm cơ hội thực hành về lĩnh vực An ninh mạng. 

Danh sách còn lại như Mobile Development, Thiết kế UX/ UI, Business Intelligence, IoT/ Robotics và Game Development vẫn là những chủ đề hấp dẫn mà các lập trình viên muốn thử sức trong năm 2022.

4. Ngôn ngữ lập trình phổ biến

Theo báo cáo của TopDev, JavaScript là ngôn ngữ phổ biến nhất cùng với các kỹ năng IT khác. Trong đó, React, Nodejs & Vue là 3 lựa chọn hàng đầu của các framework Javascript, và mức độ phổ biến của React & Node.js khá tương đồng. Lựa chọn hàng đầu để làm việc với Java là Spring (hơn 55%) sau đó tương ứng là Struts & Hibernate. 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 danh sách các công nghệ PHP với hơn 61%, tiếp theo là Symfony (34,17%) & CodeIgniter (28,38%). 

MySQL tiếp tục dẫn đầu bảng xếp hạng SQL với hơn 53%. Tuy nhiên, mức độ phổ biến giữa các hệ thống SQL không khác nhau nhiều với Top 5 (MySQL, SQL Server, PostgreSQL, MongoDB & Redis) đóng góp tương ứng tầm quan trọng của các chức năng cơ sở dữ liệu trong hầu hết sản phẩm. 5 vị trí hàng đầu của bộ xử lý tiền xử lý CSS thuộc về Sass, Less, Stylus, PostCSS & SCSS. 

Python – một trong ngôn ngữ nổi lên gần đây trong thế giới công nghệ – cho thấy khoảng cách đáng kể về mức độ phổ biến giữa các lựa chọn, trong đó lựa chọn khung Django chiếm 35,22% trong khi hạng 5 (Buttle) chỉ chiếm 2,1%. Trong số các Lập trình viên di động, Java, Swift & Objective-C chiếm vị trí trong 3 danh sách lựa chọn ngôn ngữ lập trình hàng đầu. Trong khi đó, những công nghệ mới – React Native và Flutter đã có sự gia tăng đáng kể về mức độ phổ biến trong những năm gần đây.

Tham khảo các vị trí tuyển nhân viên QA, MySQL, React Native,……

5. Sở thích

Các lập trình viên thực sự yêu thích và đánh giá cao những gì họ làm — và niềm đam mê này tiếp tục được phát triển. Phần lớn động lực chính của các lập trình viên để học một công nghệ mới chỉ đơn giản là vì họ thích nó. Khi được hỏi về điều gì đã thu hút họ bắt đầu sự nghiệp với tư cách là Lập trình viên, 75% cho biết đó là “đam mê công nghệ, lập trình và máy tính”, tiếp theo 63% cho rằng “Mức lương hấp dẫn & sự phát triển nghề nghiệp tương lai” và 55% cho rằng “Nền tảng máy tính và logic tốt” .

Các lập trình viên cũng thích đóng góp vào các dự án mã nguồn mở. 39,3% đã đóng góp cho mã nguồn mở một vài lần, trong khi 5,3% làm như vậy thường xuyên. Các dự án mã nguồn mở là một hoạt động mà các lập trình viên phần mềm thích làm trong thời gian cá nhân của họ. Cũng theo báo cáo cho thấy, 28,4% các lập trình viên đóng góp cho nguồn mở đơn giản vì nó thú vị. Các rủi ro/ cơ hội kinh tế, thất nghiệp và các vấn đề xã hội là 3 vấn đề hàng đầu mà các lập trình viên muốn giải quyết thông qua lập trình. Đặc biệt là tình hình đại dịch này, đã có rất nhiều dự án xã hội do các lập trình viên đóng góp để theo dõi các ca Covid-19, lịch trình di chuyển hoặc các trường hợp cảnh báo/ theo dõi thời gian thực xung quanh, điều này đã thu hút rất nhiều tài năng & tổ chức CNTT tham gia hỗ trợ.

Đối với phần lớn các lập trình viên, code không chỉ là việc họ làm ở nơi làm việc hoặc trong giờ làm việc. 76,2% người được hỏi cho biết họ có code ngoài công việc. Khoảng 51,4% lập trình viên dành khoảng 1 giờ cho các dự án cá nhân. Gần 43,2% lập trình viên dành 2-5 giờ cho các dự án cá nhân.

Bên cạnh đó, hầu hết các lập trình viên vẫn sử dụng Windows, 29,7% sử dụng MacOS, phần còn lại dành cho hệ điều hành Linux & các nền tảng khác.

6. Động lực phát triển

Không thể phủ nhận rằng ngành CNTT là một ngành năng động và có tốc độ thay đổi nhanh chóng. Điều này đòi hỏi lập trình viên phải cập nhật thêm các công nghệ mới để duy trì tính cạnh tranh và tiếp tục phát triển trong ngành. Hơn 50% lập trình viên dưới 30 tuổi thường cố gắng học điều gì đó mới trong vòng vài tháng. Con số này ở những người từ 15 đến 24 tuổi lên đến 80%. Đối với lập trình viên trên 35 đến 45 tuổi, tần suất dành thời gian học thêm kiến ​​thức mới là mỗi năm một lần. Việc này đối với lập trình viên trên 45 tuổi càng giảm nhiều hơn, thường họ sẽ học công nghệ mới trong vòng vài năm. 

Các lập trình viên ở level Fresher/ Junior với lợi thế về sức học cũng như quỹ thời gian tương đối thoải mái, có thể cập nhật xu hướng công nghệ mới vài tháng một lần. Đối với các lập trình viên trên 35 tuổi, hầu hết họ đã xác định được chuyên môn của mình và tập trung để trở thành chuyên gia trong lĩnh vực đó, vì vậy ưu tiên của họ sẽ không còn là mở rộng kiến ​​thức theo chiều ngang mà thay vào đó là chiều sâu.

7. Lời kết

Hiện Việt Nam đang nhận được làn sóng đầu tư mạnh mẽ vào ngành Công nghệ thông tin, bao gồm cả doanh nghiệp có vốn đầu tư nước ngoài. Từ đó nhu cầu về nhân lực IT tại Việt Nam trong 5 năm gần đây không ngừng tăng cao. Vì vậy, các nhà tuyển dụng cần hiểu rõ chân dung của nguồn nhân lực IT tại Việt Nam để có những chiến lược tuyển dụng phù hợp với công ty.

Ngoài ra, bạn có thể tham khảo thêm về rất nhiều thông tin và chỉ số khác của toàn ngành IT thông qua bản báo cáo đầy đủ nhất tại: “Báo Cáo Thị Trường IT Việt Nam 2021 | Developers Recruitment State” bằng cách tải xuống bên dưới

Tải ngay báo cáo

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev ngay!

Xu Hướng Tuyển Dụng IT Tại Việt Nam Năm 2022

Thời gian qua không chỉ mang đến những thách thức mà còn cả trải nghiệm mới, bài học kinh nghiệm đắt giá cho mọi ngành nghề, lĩnh vực. Trong bối cảnh thị trường thay đổi liên lục như hiện nay, khả năng thích ứng được cho là kỹ năng quan trọng mà bất kỳ nhà tuyển dụng nào cũng cần trau dồi và phát triển. Xu hướng tuyển dụng nhân sự IT cũng có sự thay đổi để thích ứng với nhu cầu tìm việc và nâng cao hiệu quả. 

DOWNLOAD

1. Áp dụng các phương pháp/ công cụ đánh giá năng lực kỹ thuật & tính cách

Vietnam IT Market Report 2021Developers Recruitment State do TopDev phát hành đã tổng hợp một số hình thức đánh giá kỹ thuật được Lập trình viên chấp nhận trong quy trình tuyển dụng. Bao gồm các hình thức: Bài kiểm tra với các vấn đề trong cuộc sống thực, Phỏng vấn code trực tiếp/ tại chỗ, Pair-coding, Cuộc thi với các thử thách/ trò chơi kỹ thuật, Whiteboard coding test và Bài kiểm tra tại nhà. Ngoài ra còn có các công cụ đánh giá kỹ năng kỹ thuật của ứng viên và một số bài kiểm tra tính cách phổ biến: MBTI, 16 Personalities, Enneagram.

2. Tối ưu hóa việc tìm kiếm việc làm trên thiết bị di động

Thiết bị di động đang ngày càng phổ biến rộng rãi bởi tính tiện lợi, hữu ích của chúng. Các công ty/ Nền tảng đang ngày càng tối ưu hóa hiệu suất trên thiết bị di động thông qua các trang web nghề nghiệp, tin tuyển dụng, quy trình ứng tuyển.

Theo Vietnam IT Market Report 2021 – Developers Recruitment State do TopDev phát hành, phần lớn ứng viên cho rằng thiết bị di động đóng vai trò quan trọng trong thói quen tìm kiếm việc làm và họ tìm kiếm công việc hàng ngày trên thiết bị của họ. Không chỉ vậy, với thiết bị di động, ứng viên có thể lưu một công việc từ trang nghề nghiệp của công ty/ các trang web việc làm từ di động của họ và sau đó nộp đơn.

3. Trải nghiệm của ứng viên về quy trình tuyển dụng

Tìm hiểu về những trải nghiệm không tốt của ứng viên trong quá trình tuyển dụng, Vietnam IT Market Report 2021 – Developers Recruitment State đã nêu ra một số trường hợp gây ảnh hưởng tiêu cực đến một thương hiệu tuyển dụng: Không nhận được phản hồi từ công ty sau khi gửi đơn đăng ký hoặc phỏng vấn, … Vấn đề này có thể tạo nên sự bất mãn cho ứng viên, và họ có thể không còn hứng thú để ứng tuyển vào bất kì vị trí khác trong công ty hay truyền miệng cho người khác không nộp đơn và thậm chí là tẩy chay sản phẩm, dịch vụ.

Đứng trước những nguy cơ đó, Nhân sự/ Nhà tuyển dụng cần có những biện pháp hợp lý, và một số cách để đạt hiệu quả chính là: Đảm bảo rằng vị trí tuyển đáp ứng nhu cầu thực sự, viết mô tả công việc rõ ràng, giúp ứng viên dễ dàng ứng tuyển vào công việc của mong muốn, cung cấp cho ứng viên thông tin về những gì cần chuẩn bị khi tham gia phỏng vấn trực tiếp,…

4. Tối ưu hóa việc sử dụng mạng xã hội trong lĩnh vực tuyển dụng

Tính đến năm 2021, có tới 70% dân số Việt Nam sử dụng mạng xã hội và con số này vẫn đang tiếp tục tăng lên trong thời gian tới. Nắm bắt xu hướng này, các nhà tuyển dụng đã nhanh chóng triển khai kế hoạch tiếp cận ứng viên thông qua các kênh: Facebook, Youtube, các diễn đàn lớn và mới đây là Tiktok. Với chi phí tương đối thấp và không hạn chế đối tượng tuyển dụng, việc lựa chọn mạng xã hội làm kênh tìm kiếm, thu hút, tuyển dụng ứng viên tiềm năng ngày càng phổ biến và mang tính cạnh tranh cao.  

5. Đưa Employer Branding trở thành “KOL” thể hiện giá trị  của công ty

Để quảng bá Thương hiệu nhà tuyển dụng, các công ty đã chú ý đến việc thu hút các ứng viên thụ động và sử dụng các kênh kỹ thuật số: Blog, Website công ty, Email Marketing và các kênh Truyền thông xã hội. Khi lựa chọn các kênh này, nhà tuyển dụng cần chú ý đến việc thu thập & nhắm đúng đối tượng ứng viên và tạo ra nội dung hấp dẫn. Cân bằng hai yếu tố trên giúp cho doanh nghiệp dễ dàng có được chiến dịch xây dựng thương hiệu nhà tuyển dụng thành công. Ngoài ra, doanh nghiệp cũng có thể quảng bá Thương hiệu của mình thông qua các sự kiện công nghệ – nơi hội tụ lượng lớn ứng viên tiềm năng.

Đây là thời điểm để các doanh nghiệp tận dụng cơ hội và nỗ lực đưa hình ảnh thương hiệu của mình ra bên ngoài, tạo cho các lập trình viên có cảm giác gần gũi, thân thiện và giúp họ biết rõ hơn về công ty cũng như những cơ hội phát triển mà công ty mang lại.

Cần có sự xem xét cẩn thận về Thương hiệu Nhà tuyển dụng để thay đổi, sàng lọc và phát triển những chiến lược tuyển dụng liên quan đến thay đổi của ngành và các thông điệp từ doanh nghiệp. Đồng thời cũng cần quan sát kỹ hành vi của ứng viên và các xu hướng mới, xem xét đến sự thay đổi và cân nhắc xem đó có phải là xu hướng lâu dài hay không, vì điều này sẽ ảnh hưởng rất nhiều về cách thức hoạt động của chiến lược trong các kế hoạch tuyển dụng sắp tới.

6. Millennials và Gen Z sẽ là lực lượng lao động chính

Không có gì ngạc nhiên khi nói rằng Gen Z am hiểu công nghệ hơn bất kỳ thế hệ nào khác. Họ được sinh ra trong thời đại bùng nổ Internet với sự ra đời của World Wide Web và sự phát triển không ngừng của nó. Vì vậy Gen Z sử dụng Internet như một công cụ để làm việc, nghiên cứu và kết nối với những người khác. 

Về tư duy và thói quen tại nơi làm việc

Millennials và Gen Z “biến hình” mỗi ngày trong một thế giới được định nghĩa bởi hai từ “thay đổi”. Những thay đổi về công nghệ, yêu cầu của nhà tuyển dụng,… thúc đẩy họ không ngừng cải thiện bản thân để duy trì khả năng cạnh tranh và khẳng định năng lực. Ngoài ra, tính “ham học hỏi” cùng những kỹ năng đã được mài giũa tốt của các thế hệ này đã chứng tỏ khả năng vượt trội của họ trước các nhà quản lý.

Khả năng Teamwork

Tinh thần đồng đội là một trong những minh chứng rõ ràng cho thấy sự khác biệt giữa Millennials và Gen Z. Nếu khả năng hợp tác và làm việc nhóm luôn được Millennials chú trọng với phương châm “Hai luôn tốt hơn Một”, thì Gen Z cho rằng nếu muốn hoàn thành công việc một cách hiệu quả, tốt nhất bạn nên “tự thân vận động”.

Mức độ cam kết với các doanh nghiệp

Đa số những nhân viên trẻ thuộc Millennials và Gen Z có mức độ cam kết với công ty thấp hơn các thế hệ trước, họ trung thành với các cá nhân như cấp trên hoặc đồng nghiệp hơn so với công ty mà họ làm việc. Ngoài ra, họ cũng coi trọng sự cân bằng trong cuộc sống cá nhân và công việc, thời gian giải trí, cũng như mức độ thoải mái của môi trường làm việc.

Xu hướng tuyển dụng IT năm 2022 chuyển biến không ngừng, đòi hỏi nhà tuyển dụng cần thay đổi về tư duy cũng như xu hướng tuyển dụng nguồn nhân tài IT cho doanh nghiệp. Ngoài ra, để có thể tìm hiểu thêm về toàn cảnh thị trường IT cũng như những chỉ số chi tiết, mời bạn tải Báo Cáo Thị Trường IT Việt Nam 2021 – Developers Recruitment State do TopDev phát hành:

Tải ngay báo cáo


Tháng 10 &11 – thời điểm tốt cuối cùng trong năm để hoàn thành kế hoạch tuyển dụng năm 2021 vì vài tháng tới cận Tết ứng viên sẽ quan tâm lương tháng 13 /thưởng Tết ngại chuyển việc. TopDev xin gửi đến Quý công ty những ưu đãi nhằm tối ưu chi phí thích hợp cho các bên đang bị hạn chế về ngân sách đợt cuối năm lên đến 30% tại đây https://topdev.vn/recruit. Cần thêm thông tin về báo giá số lượng tin đăng nhiều hơn, công ty liên hệ hotline 028.6273.3496 để nhận ưu đãi đặc biệt.

04 điểm Nhà tuyển dụng quan tâm nhất về TopDev:

1. Cơ hội tiếp cận kho dữ liệu 335.000 ứng viên IT
2. 60 ngày đăng tin (30 ngày chính thức và 30 ngày bảo hành)
3. Tin đăng hiển thị cả trang chủ và trang tìm việc
4. Nhận 02 nguồn CV: ứng viên tự apply và ứng viên TopDev giới thiệu sang

tìm hiểu ngay

Những Thông Tin Cơ Bản Giúp Tuyển Dụng Hiệu Quả Trên LinkedIn

tuyển dụng hiệu quả trên Linkedin
Những thông tin cơ bản giúp tuyển dụng hiệu quả trên LinkedIn

LinkedIn hiện được đánh giá là nền tảng tuyển dụng nhân sự số một thế giới khi sở hữu hơn 500 triệu profile người dùng ở khắp các châu lục. Bất cứ ai làm trong lĩnh vực nhân sự đều nên có sự hiểu biết sâu sắc về LinkedIn để thúc đẩy công tác tuyển dụng diễn ra chất lượng hơn. Vậy để công tác tuyển dụng hiệu quả trên LinkedIn, những chuyên viên nhân sự nên làm gì và nên khai thác những đặc điểm nào của công ty mình?

tuyển dụng hiệu quả trên LinkedIn
Làm thế nào để tuyển dụng trên LinkedIn đạt hiệu quả?

Nền tảng LinkedIn hiện đang phát triển như thế nào?

Theo thống kê tại Việt Nam, hiện nay LinkedIn đang cung cấp hơn 19 triệu hồ sơ cá nhân, bao gồm 145.000 hồ sơ của các chức vụ liên quan đến giám đốc điều hành, và cứ mỗi phút có 25 thành viên mới tham gia. Con số này vẫn chưa dừng lại và đang trên đà tăng trưởng mạnh.

Thêm vào đó, so với các nền tảng mạng xã hội khác mang tính giải trí là chủ yếu, thì tất cả các profile cá nhân cũng như doanh nghiệp trên LinkedIn đều hoạt động vì mục đích công việc. Do đó, nếu doanh nghiệp và các nhà tuyển dụng bỏ qua LinkedIn thì chắc chắn sẽ mất đi vô vàn lợi thế trên thị trường lao động đang cạnh tranh vô cùng khốc liệt hiện tại.

  10 Bí quyết tuyển dụng giúp bạn tăng tỉ lệ nhận offer tức thì!
  Cách Viết Summary Trên LinkedIn Để Thu Hút Các Nhà Tuyển Dụng

Tuyển dụng miễn phí hiệu quả trên LinkedIn

Đây là hình thức cơ bản và hoàn toàn miễn phí mà bất cứ công ty nào cũng đều có thể sử dụng. Vì không phải mất chi phí cho quá trình tuyển dụng nên đây cũng là hình thức tiên quyết được nhiều công ty lựa chọn.

Xây dựng trang tuyển dụng mang dấu ấn riêng của công ty

Đây sẽ là nơi để ứng viên tìm kiếm và nhìn thấy mọi thông tin liên quan đến công ty, do đó cần đảm bảo xây dựng hồ sơ một cách cẩn thận, chi tiết và đáng tin cậy để tạo ấn tượng trong mắt ứng viên.

Người xây dựng hồ sơ công ty thường sẽ ở bộ phận nhân sự của công ty. Vì vậy cần đảm bảo có thể cung cấp một các thông tin sao cho thật hấp dẫn nhưng vẫn đảm bảo sự ngắn gọn, xúc tích. Tốt hơn hết nên có đầy đủ các thông tin như mục tiêu ra đời, sứ mệnh phát triển, quy mô nhân sự và phúc lợi cho nhân viên của công ty. Vì đây cũng chính là những yếu tố nhận được sự quan tâm hàng đầu của ứng viên trong quá trình ứng tuyển.

Thường xuyên chia sẻ thông tin hữu ích trên fanpage công ty

Các nội dung chia sẻ sẽ phản ánh quá trình phát triển của công ty, giúp ứng viên có cái nhìn bao quát hơn. Các thông tin đó có thể liên quan đến:

  • Cập nhật thông tin về sản phẩm hay dịch vụ mới của công ty.
  • Những thành tựu công ty đạt được trong khoảng thời gian gần nhất.
  • Các sự kiện do công ty tổ chức.
  • Các hoạt động sinh hoạt và giải trí trong nội bộ công ty.

Đăng tin tuyển dụng trên tài khoản công ty

Để tuyển dụng trên LinkedIn, đây đương nhiên là bước mà các chuyên viên nhân sự không nên bỏ qua. Nhất là với các công ty đã đạt được lượng người theo dõi nhất định, việc đăng tin tuyển dụng sẽ thu hút rất đông lượng người quan tâm, chia sẻ cũng như ứng tuyển trực tiếp vào công ty.

xây dựng hồ sơ công ty

Đăng tin tuyển dụng trên các group của LinkedIn

Các nhóm trên LinkedIn được thành lập và hoạt động theo từng chuyên môn, ngành nghề khác nhau. Nhờ thế, nó sẽ tập trung rất đông đúc các ứng viên làm việc trong lĩnh vực đó cũng như mong muốn tìm được công việc mới đúng chuyên môn.

Vô hình chung khi đăng tin tuyển dụng trong các group bạn sẽ tìm được rất nhiều các ứng viên tiềm năng cho công ty, giúp tăng cao năng suất tuyển dụng. Tuy nhiên, một điểm cần lưu ý để được quản trị viên các group duyệt vào nhóm đó là thông tin profile của công ty cần đảm bảo độ uy tín. Do đó việc xây dựng và quản lý trang hồ sơ của công ty hiệu quả thật sự rất cần thiết trong công tác tuyển dụng.

Xem thêm NÊN & KHÔNG NÊN Để Đàm Phán Lương Thành Công Khi Phỏng Vấn

Tuyển dụng có trả phí trên LinkedIn

Đa phần các công ty lớn và có tiềm lực ngân sách mạnh sẽ lựa chọn hình thức tuyển dụng này. Việc “móc hầu bao” để tuyển dụng trên LinkedIn không chỉ giúp công ty dễ dàng hơn trong việc tuyển các nhân sự chất lượng mà còn đặc biệt hiệu quả trong việc tìm kiếm các nhân sự cấp cao cũng như tuyển dụng số lượng lớn.

Điểm khác biệt giá trị giữa tài khoản tuyển dụng trả phí và miễn phí trên LinkedIn là InMail – tức phạm vi kết nối và liên lạc với các ứng viên tiềm năng. Khi dùng LinkedIn miễn phí, bạn sẽ không thể kết nối đến những tài khoản nằm ngoài mạng lưới connection. Trong khi đó với LinkedIn trả phí, bạn có thể tương tác trực tiếp với họ thông qua InMail.

Xem thêm Kinh nghiệm tìm việc trên Linkedin hiệu quả cho công tác tuyển dụng nhân sự

Hiện nay có 2 hình thức tài khoản trả phí trên LinkedIn là PremiumRecruiter:

Tuyển dụng trên LinkedIn Premium

Theo đó, hiện nay LinkedIn Premium đang thu phí 47.99$ là gói phí thấp nhất với 15 InMails trong tài khoản. Mức phí 74.99$ là gói phí cao nhất với 30 InMails trong tài khoản. Các lợi ích nhận được theo đó như:

  • Chia sẻ bảng tin tuyển dụng của công ty và tiếp cận tới hơn 500 triệu ứng viên trong mạng lưới LinkedIn.
  • Gửi email và hiển thị quảng cáo cho những ứng viên có kỹ năng và vị trí địa lý phù hợp với thông tin tuyển dụng của công ty (thông qua tính năng “Jobs you may be interested in”).
  • Tạo lập và quản lý danh sách 50 ứng viên phù hợp nhất với công việc đang tuyển.
  • Cải thiện đáng kể khả năng kết nối và tìm kiếm ứng viên tiềm năng
  • Cơ hội tham gia các khóa học kỹ năng và quản trị trong lĩnh vực nhân sự trên LinkedIn Learning
  • Nhận những thông tin insight về ngành nghề, việc làm nhanh và chính xác nhất.

profile linkedin

Tuyển dụng trên LinkedIn Recruiter

Bên cạnh các tính năng tương tự như tài khoản LinkedIn Premium, tuyển dụng bằng tài khoản LinkedIn Recruiter còn có thêm khả năng lưu trữ kết quả tìm kiếm ứng viên, quảng cáo tin đăng tuyển dụng và tăng đáng kể số InMails có sẵn trong tài khoản.

Ngoài ra còn có hai gói tài khoản con trong LinkedIn Recruiter: Lite và Corporate.

Tài khoản LinkedIn Recruiter Lite cung cấp thêm khả năng hiển thị và kết nối với các ứng viên bị động vô cùng hiệu quả.

Trong khi đó, tài khoản LinkedIn Recruiter Corporate là tài khoản cao cấp nhất với nhiều tính năng vô cùng hấp dẫn như:

  • Xem được hồ sơ của tất cả các tài khoản trên LinkedIn
  • Trao đổi và kết nối được với nhiều người dùng trên cùng một tài khoản
  • Có khả năng gửi tối đa 150 InMails/tháng và kèm theo hình thức gửi InMails hàng loạt (tối đa 25 InMails cùng một lúc).
  6 công cụ tuyển dụng phổ biến trong ngành Nhân sự

Ngày nay, hầu hết các doanh nghiệp đều sử dụng LinkedIn trong công tác tuyển dụng nhân sự. Để tuyển dụng thành công cũng như tìm kiếm được những ứng viên chất lượng, doanh nghiệp cần biết cách tuyển dụng hiệu quả trên LinkedIn thông qua việc xây dựng tài khoản công ty một cách ấn tượng và tạo niềm tin nơi người ứng tuyển.

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

SourceTree: Công cụ trực quan hóa cho GIT trên Windows/ macOS

SourceTree: Công cụ trực quan hóa cho GIT trên Windows/ macOS

Bài viết được sự cho phép của blogchiasekienthuc.com

Chào anh em, Git có lẽ là một công cụ đã không còn xa lạ gì với anh em trong giới lập trình nữa rồi, bởi sự hiệu quả trong việc quản lý mã nguồn (source code) mà nó mang lại là không phải bàn cãi gì thêm.

Nhưng việc sử dụng Git thông qua các dòng lệnh (command line) không phải lúc nào cũng tiện và “ngầu” như anh em vẫn nghĩ. Đặc biệt là với các anh em mới tiếp cận với lập trình !

Chính vì vậy trong bài viết này, mình sẽ hướng dẫn cho anh em cài đặt SourceTree – một công cụ GUI giúp trực quan hóa các thao tác với Git, giờ đây các thao tác quản lý sẽ dễ như ăn kẹo Ok, bây giờ thì cùng mình cài đặt thôi nào !

#1. Download Sourcetree mới nhất

Hiện tại thì Sourcetree chỉ hỗ trợ cho Windows và Mac OS, đây cũng là hai hệ điều hành phổ biến nhất hiện nay.

sourcetree-cong-cu-truc-quan-hoa-cho-git (1)

#2. Cài đặt phần mềm Sourcetree

Nói chung là quá trình cài đặt cũng không có gì khó khăn cả, đa số là những thao tác rất quen thuộc với anh em lập trình mà thôi.

Sau khi download sourcetree xong => anh em bấm vào file vừa tải về để tiến hành cài đặt.

sourcetree-cong-cu-truc-quan-hoa-cho-git (2)

+ Bước 1: Đầu tiên là phần đăng ký tài khoản thông qua Bitbucket, nhưng nếu anh em có tài khoản Github hoặc Gitlab hay VS Team thì dùng luôn các tài khoản này cũng đươc nhé. Bạn bấm vào nút Skip để sang bước tiếp theo.

sourcetree-cong-cu-truc-quan-hoa-cho-git (3)

+ Bước 2: Bước này sẽ cài đặt một số tools cơ bản, anh em cứ check như trong hình bên dưới => Sau đó bấm Next để sang bước tiếp theo.

sourcetree-cong-cu-truc-quan-hoa-cho-git (4)

Nếu các tools được cài thành công thì sẽ có thông báo thành công như hình bên dưới. Tiếp tục bấm Next để sang bước tiếp theo.

sourcetree-cong-cu-truc-quan-hoa-cho-git (5)

+ Bước 3: Tiếp theo, anh em có thể cung cấp thông tin tài khoản Github để cấu hình những cài đặt.

  • (1) Username của tài khoản Github (hoặc Gitlab…)
  • (2) Email mà các bạn dùng để đăng ký tài khoản đó.

=> Sau đó bấm Next để tiếp tục.

sourcetree-cong-cu-truc-quan-hoa-cho-git (6)

+ Bước 4: Đến đây có thể có một bước yêu cầu tải SSH Key. Anh em nếu chưa có thì có thể bấm No để thực hiện cài đặt sau.

sourcetree-cong-cu-truc-quan-hoa-cho-git (7)

+ Bước 5: Okay, vậy là về cơ bản anh em đã cài đặt xong rồi đó. Giờ mình sẽ thử clone một repository trên Github về xem nhé.

  • (1) – Đầu tiên anh em vào tab Clone như hình bên dưới.
  • (2) – Nhập địa chỉ repository của bạn trên Github.
  • (3) – Nơi mã nguồn (source code) sẽ được clone về (trên máy của anh em)
  • (4) – Tên folder chứa source code

=> Sau đó anh em bấm Clone để tiến hành clone về máy (thao tác này tương đương như lệnh git clone của GIT.)

sourcetree-cong-cu-truc-quan-hoa-cho-git (8)

Quá trình clone souce code sẽ được hiển thị như hình bên dưới và nó phụ thuộc vào tốc độ Internet của anh em.

sourcetree-cong-cu-truc-quan-hoa-cho-git (9)

+ Bước 6: Okay, sau khi clone xong thì anh có thể thấy Sourcetree hiển thị các thông tin về repo rất chi tiết. Trong hình bên dưới anh em có thể thấy.

  • (1) – Là tập các thao tác mà anh em vẫn hay sử dụng với git đó là commit, pull, push, fetch, branch, merge
  • (2) – Mình đang ở tab History thì chỗ này sẽ hiển thị thông tin các commit của repository (ai commit, commit nhánh nào, commit vào thời gian nào…)
  • (3) – Chỗ này sẽ hiển chi tiết thông tin của từng commit mà các bạn chọn ở bên trên (gồm có nội dung commit, tác giả, thời điểm)
  • (4) – Hiển thị chi tiết các nội dung thay đổi của file được commit.

sourcetree-cong-cu-truc-quan-hoa-cho-git (10)

#3. Lời kết

Trên thực tế thì việc sử dụng các công cụ mang tính trực quan hóa bao giờ cũng đem lại những ưu điểm về tính trải nghiệm người dùng.

Với những dự án có nhiều người làm chung thì việc sử dụng các công vụ quản lý phiên bản như Git là một sự lựa chọn gần như bắt buộc.

Vâng, và rõ ràng là việc sử dụng SourceTree giúp cho việc quản lý phiên bản mã nguồn với Git dễ dàng hơn rất nhiều. Hẹn gặp lại anh em trong các bài viết tiếp theo nha.

Nguyễn Đức Cảnh – Bài viết gốc tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm việc làm Developer hấp dẫn trên TopDev

Tham số hàm Python

Tham số hàm Python

Bài viết được sự cho phép của ucode.vn

Trong bài trước chúng ta đã tìm hiểu về hàm Python tích hợp sẵn và hàm Python do người dùng định nghĩa với số lượng tham số tùy biến. Bạn sẽ biết cách để định nghĩa hàm bằng cách sử dụng tham số mặc định, keyword và tham số tùy biến trong bài này.

Tùy vào việc bạn định nghĩa hàm Python theo cách nào mà chúng ta có thể gọi hàm khác nhau, tất nhiên, dù gọi hàm theo cách nào thì kết quả cuối cùng vẫn hợp lý và giống nhau.

Tham số của hàm Python

Trong bài hàm Python do người dùng định nghĩa, chúng ta đã biết cách định nghĩa và gọi một hàm, giống như ví dụ dưới đây:

def Xin_chao(ten,loi_chao):
 """Hàm Xin_chao chào một người
    với thông điệp cho trước """
    print("Xin chào",ten + ', ' + loi_chao)

Xin_chao("Nam","đọc bài trên uCode.vn vui vẻ nha!")

Khi chạy code trên, ta sẽ nhận được dòng chữ trên màn hình như sau:

Xin chào Nam, đọc bài trên uCode.vn vui vẻ nha!

Như bạn thấy, hàm Xin_chao() này có 2 tham số. Do đó, nếu chúng ta gọi hàm với 2 tham số, nó sẽ chạy “ngon lành” và không gặp phải thông báo lỗi nào.

Nếu gọi hàm với số tham số khác 2, trình thông dịch sẽ hiển thị thông báo lỗi. Nếu muốn, bạn có thể thử gọi hàm Xin_chao() trên với 1 tham số và không có tham số.

#Thông báo lỗi khi gọi hàm Xin_chao() với 1 tham số
TypeError: Xin_chao() missing 1 required positional argument: 'loi_chao'

#Thông báo lỗi khi gọi hàm Xin_chao() mà không có tham số
TypeError: Xin_chao() missing 2 required positional arguments: 'ten' and 'loi_chao'

Bên cạnh việc định nghĩa hàm với số tham số cố định, bạn có thể dùng những cách mà chúng tôi giới thiệu dưới đây để tạo số tham số tùy biến cho hàm:

Tuyển python lương cao trên TopDev

Tham số mặc định trong hàm Python

Trong Python, tham số của hàm có thể có giá trị mặc định. Chúng ta có thể cung cấp giá trị mặc định này cho một tham số bằng cách sử dụng toán tử gán (=) như ví dụ dưới đây:

def Xin_chao(ten, loi_chao = "đọc bài uCode.vn vui nha!"):
    """
    Hàm này chào một người với thông điệp cho trước.

    Nếu thông điệp không được cung cấp,
    nó sẽ được mặc định là "đọc bài uCode.vn vui nha!"
    """
print("Xin chào",ten + ', ' + loi_chao)

Xin_chao("Hải")
Xin_chao("Dũng","bạn khỏe không?")

Khi chạy code trên, ta có kết quả đầu ra như sau:

Xin chào Hải, đọc bài uCode.vn vui nha!
Xin chào Dũng, bạn khỏe không?

Trong hàm này, tham số ten không có giá trị mặc định và bắt buộc phải có khi gọi hàm. Tham số loi_chao có giá trị mặc định là “đọc bài uCode.vn vui nha!”. Vì vậy, khi gọi hàm bạn có thể cung cấp tham số này hoặc không. Nếu cung cấp tham số loi_chao, nó sẽ ghi đè lên giá trị mặc định.

  Hàm Python tích hợp sẵn

Trong một hàm, số lượng tham số có giá trị mặc định không bị giới hạn, nhưng một khi có tham số mặc định, tất cả các tham số nằm bên phải của tham số mặc định cũng phải có giá trị mặc định. Nghĩa là, các tham số không mặc định không thể nằm sau các tham số mặc định. Ví dụ, nếu bạn định nghĩa hàm Xin_chao() như sau:

def Xin_chao(loi_chao = “đọc bài uCode.vn vui nha!”,ten):

Thì sẽ nhận được thông báo lỗi:

SyntaxError: non-default argument follows default argument

Ứng tuyển python Hồ Chí Minh lương cao

Tham số keyword trong Python

Khi gọi một hàm với vài giá trị, những giá trị này sẽ được gán cho các tham số theo vị trí của chúng. Ví dụ, trong hàm Xin_chao() ở trên, khi gọi Xin_chao(“Dũng”,”bạn khỏe không?”), giá trị “Dũng” được gán cho tham số ten và giá trị “bạn khỏe không?” được gán cho loi_chao.

Python cho phép gọi hàm bằng các tham số keyword. Khi gọi hàm theo cách nay, thứ tự (vị trí) của tham số có thể thay đổi, nhưng kết quả vẫn hợp lệ và tương tự các cách gọi hàm khác.

# 2 tham số keyword
Xin_chao(ten = "Dũng",loi_chao = "bạn khỏe không?")
# 2 tham số keyword, thứ tự tham số thay đổi
Xin_chao(loi_chao = "bạn khỏe không?",ten = "Dũng")
# 1 tham số keyword, 1 theo vị trí
Xin_chao("Dũng",loi_chao = "bạn khỏe không?")

Như bạn thấy bên trên, có thể kết hợp các tham số theo keyword hoặc vị trí khi gọi hàm. Nhưng phải nhớ rằng các tham số keyword phải đi sau tham số theo vị trí. Nếu tham số theo vị trí ở sau tham số keyword bạn sẽ nhận được thông báo lỗi:

Xin_chao(ten = “Dũng”,”bạn khỏe không?”)

Thông báo lỗi:

SyntaxError: non-keyword argument after keyword argument
  Các lệnh: break, continue, pass trong Python

Tham số tùy biến trong hàm Python

Đôi khi, ta không biết trước số lượng tham số sẽ được truyền vào hàm, đó là lúc cần phải sử dụng cách gọi hàm với số lượng tham số tùy biến.

Trong định nghĩa hàm, ta sử dụng dấu hoa thị * trước tên tham số để biểu thị loại tham số, như ví dụ dưới đây:

def Xin_chao(*ten_chao):
    """
    Hàm này sẽ chào một danh sách người cho trước
    """
    for ten in ten_chao:
       print("Xin chào",ten)

Xin_chao("Hải","Hoa","Công","Sơn")

Khi chạy code trên ta được kết quả như sau:

Xin chào Hải
Xin chào Hoa
Xin chào Công
Xin chào Sơn

Ở đây, ta gọi hàm với nhiều tham số. Tham số này được “gói” lại thành một tuple trước khi truyền vào hàm. Bên trong hàm, chúng ta sử dụng vòng lặp for để lấy tất cả các tham số trong tuple.

Bài viết gốc được đăng tải tại ucode.vn

Xem thêm việc làm developer hấp dẫn trên TopDev

Ngành IT: Việc nhẹ lương cao?

lương IT

Bài viết được sự cho phép của tác giả Khiêm Lê

Trong những năm vừa qua, ngành Công nghệ thông tin (IT) vẫn luôn giữ được sức hút mạnh mẽ của mình. Điều đó được thể hiện qua số nguyện vọng đăng ký xét tuyển đại học ở các ngành Công nghệ thông tin luôn tăng qua các năm, đặc biệt là trong năm 2020 vừa qua.

Thông tin từ Cục quản lý chất lượng, Bộ GD&ĐT cho biết trong năm 2020 vừa qua có tất cả 2.490.171 nguyện vọng trên cả nước, trong đó có 640.638 nguyện vọng 1 và 519.449 nguyện vọng 2 xét tuyển vào các ngành Công nghệ thông tin. Có phải ngành IT được các bạn học sinh yêu thích là vì “việc nhẹ lương cao”?

Ngành IT: Việc nhẹ lương cao?

Có nhiều người không có kiến thức về IT, họ nghĩ rằng IT là chỉ cần ngồi trên máy tính, gõ phím 8 tiếng một ngày, không tốn nhiều sức mà vẫn có lương tháng 1000$. Điều này có đúng?

Không, rõ ràng là không! Việc gì cũng có cái giá của nó, bề ngoài của ngành IT mà người khác nhìn thấy chỉ đơn giản là gõ phím, nhưng chúng ta là dân IT, chúng ta biết nhiều hơn thế, chúng ta phải cho họ thấy chúng ta được đào tạo trường lớp, chúng ta làm công việc không phải ai cũng có thể học và làm được và mức lương tương xứng với công sức của chúng ta bỏ ra.

Đối với những bạn sinh viên năm 3 và năm 4, các bạn sẽ đi thực tập ở các công ty, startup, các bạn sẽ thấy, các bạn cũng học IT và mức lương thực tập rất là thấp kể cả khi bạn trở thành nhân viên chính thức.

Khi ra trường, bạn đi xin việc, mức lương mà bạn nhận được còn tùy thuộc vào công ty mà bạn ứng tuyển, số kinh nghiệm mà bạn có được (tính bằng năm), bằng cấp (bằng tiếng Anh điểm cao là một lợi thế), có kinh nghiệm quản lý (học qua các khóa học quản trị kinh doanh…) thì có thể dễ dàng leo lên các vị trí cao hơn,… Đủ để hiểu học IT ra trường rồi đi làm không phải ai cũng lương tháng 1000$.

Tính lương gross sang net chuẩn, trải nghiệm ngay!

Cần tố chất gì để học được IT

Ngành IT cũng không phải là một ngành dễ học. Điều kiện tiên quyết là các bạn phải có đam mê. Khi các bạn học mà không có đam mê, các bạn sẽ rất dễ chán nản và muốn từ bỏ sau khi bắt đầu chưa bao lâu và nó rất là phí thời gian của các bạn.

Học IT thì không cần quá thông minh hay là tài giỏi gì đâu. Các bạn chỉ cần chăm chỉ, siêng năng, học rồi thực hành, làm bài tập cho nhiều thì các bạn sẽ tự mình tích lũy được kiến thức và kinh nghiệm cho riêng mình.

Học IT cũng không cần giỏi toán, bạn chỉ cần biết toán phổ thông là được. Các bạn cần có tư duy logic, biết phán đoán tình huống và tỉ mỉ trong khi làm việc.

Ngành IT học những gì?

Ngành IT không phải là cứ cắm đầu vào máy tính và cào phím, trước khi gõ phím các bạn sẽ phải suy nghĩ rất nhiều chứ không phải tự dưng mà có code cho bạn gõ đâu. Có khi các bạn suy nghĩ mấy ngày trời rồi mới có ý tưởng để code.

Trường đại học sẽ đào tạo cho các bạn từ nền tảng đến chuyên môn mà các bạn theo học. Các môn toán cao cấp, chính trị, ngoại ngữ đương nhiên là bắt buộc. Các môn học nền tảng như Nhập môn lập trình, Lập trình hướng đối tượng (đa phần các trường đều dạy C/C++), Cấu trúc dữ liệu và giải thuật, Nhập môn mạng, Nhập môn cơ sở dữ liệu, Tổ chức và cấu trúc máy tính, Kiến trúc máy tính…

Sau khi học xong đại cương và nền tảng lập trình căn bản thì các bạn sẽ được học chuyên ngành. Trên đại học thầy cô sẽ không chỉ dạy hết những gì mà thầy cô biết được, mà chủ yếu, các bạn sẽ phải tự tìm và nghiên cứu thêm từ những gì mà thầy cô đã dạy.

Kỹ năng làm việc nhóm, giao tiếp cũng là thứ sau này quyết định đến mức lương của các bạn. Nếu như các bạn có khả năng giao tiếp tốt, làm việc nhóm tốt thì sau này các bạn có thể dễ dàng làm ở các chức cao hơn. Đương nhiên là trên đại học các bạn cũng sẽ được rèn dũa kỹ năng này.

Bên cạnh việc học tập, các bạn cũng có thể tham gia vào các cuộc thi, các nghiên cứu khoa học do trường tổ chức. Khi tham gia, các bạn có thể học hỏi thêm được rất nhiều thứ và còn được thầy cô hướng dẫn tận tình và cả kiếm được người yêu nữa ^^.

  3 workhack để duy trì năng lượng tích cực tại công sở cho kĩ sư phần mềm
  4 mẹo deal lương như ý với vị trí Product Manager

Học IT làm việc ở những vị trí nào?

Ngành IT rất đa dụng, các bạn chỉ cần có nền tảng cơ bản về lập trình là công ty có thể đem về đào tạo và sử dụng được rồi. Tuy nhiên, các bạn cần học cho đến nơi đến chốn, học tốt chuyên ngành thì sau này điều kiện làm việc của bạn sẽ tốt hơn.

Học xong ngành IT ra trường các bạn có thể trước tiên là làm giảng viên. Đúng vậy, đối với các bạn có kỹ năng giao tiếp, truyền đạt thông tin, tự tin trước đám đông thì có thể trở thành giảng viên. Tuy nhiên khá ít bạn chọn đi theo con đường này, chủ yếu là do không có đam mê giảng dạy và mức lương khá khiêm tốn so với bạn bè đi làm bên ngoài.

Các bạn có thể làm việc ở vị trí tư vấn, đánh giá, phân tích hệ thống. Việc này đòi hỏi sự hiểu biết và kinh nghiệm của các bạn trong lĩnh vực mà các bạn làm. Đương nhiên là các bạn phải hiểu nhiều hơn, biết nhiều hơn các bạn coder thì các bạn mới có thể làm được ở vị trí này.

Các bạn có thể làm coder, đây là công việc mà hầu như ai cũng làm trước khi leo lên các vị trí cao hơn. Coder là như kiểu phụ hồ, ai kêu gì làm đó ấy.

Cao hơn coder là developer. Bạn sẽ cũng code các tính năng được giao, nhưng bên cạnh đó bạn nghiên cứu và phát triển, bổ sung thêm các tính năng mới.

Các bạn có thể đi code dạo, code web, code app này kia, nói chung là học IT rất đa dụng. Và còn rất rất nhiều việc khác mà các bạn học IT xong có thể xin vào làm.

Khó khăn khi học IT

Áp lực khi học và làm trong ngành IT cũng chính là lý do khiến cho ngành IT có mức lương rất cao (nếu bạn đủ trình độ). Khi học ngành này, các bạn sẽ thường xuyên đụng mặt BUG nó là nguyên nhân chính thường xuyên làm cho các bạn cảm thấy cực kỳ khó chịu và áp lực. Có khi bạn mất cả ngày chỉ để fix 1 bug duy nhất.
Học IT là các bạn sẽ gắn nửa phần đời còn lại của mình với chiếc máy tính, là công cụ kiếm cơm chính của các bạn. Việc ngồi lâu trên máy sẽ dẫn đến tình trạng sức khỏe kém, cận thị và đặc biệt là bị trĩ. Hãy tìm cho mình một chế độ làm việc, nghĩ ngơi và tập luyện phù hợp.

Công việc đòi hỏi sự tập trung cao và đối với các bạn có hứng thú khi viết code, các bạn sẽ lãng quên mọi thức xung quanh. Do đó, các IT-er thường than là bị ế cũng vì chuyện đó. Không chỉ vậy, họ thậm chí là bỏ quên cả gia đình nữa nếu cứ mãi tập trung cho công việc.

Khi học IT thì việc bị deadline dí là chuyện như cơm bữa. Lúc học đại học các bạn sẽ bị deadline môn học dí, các đồ án, khóa luận… Sau khi đi làm các bạn sẽ bị deadline của sếp dí, thời gian bạn làm việc có thể hơn 8 tiếng 1 ngày.

Còn rất rất nhiều khó khăn khác khi học ngành IT. Tuy nhiên, điều quan trọng nhất khi học là các bạn phải có hiểu biết về ngành này trước và có đam mê, vì khi có đam mê, các bạn mới có thể học mà không bị nản, phát triển bản thân tốt hơn.

Tổng kết

Vậy là trong bài viết này, mình đã chia sẻ đến các bạn cái nhìn tổng quan về ngành Công nghệ thông tin, nhưng gì mà mình chia sẻ có thể nó không đúng vì mình chưa đi làm. Nếu các bạn có thấy nó sai thì hãy để lại bình luận để giúp mình phát triển bài viết tốt hơn nha.

Nếu các bạn thấy bài viết này hay, đừng quên chia sẻ nó cho mọi người cùng biết nha. Cảm ơn các bạn đã đọc bài viết!

Bài viết gốc được đăng tải tại khiemle.dev

Có thể bạn quan tâm:

Xem thêm Việc làm it job hấp dẫn trên TopDev

Polyfill là gì?

Polyfill là gì?

Bài viết được sự cho phép của tác giả Tino Phạm

Đây là thuật ngữ dùng để chỉ các đoạn code được dùng để cung cấp một chức năng (hoặc công nghệ) của các trình duyệt hiện đại cho các trình duyệt cũ. Thông qua đó, các trang web sử dụng các công nghệ mới (như HTML5) có thể chạy ổn định trên các trình duyệt cũ chưa hỗ trợ.

  Những Polyfill được sử dụng nhiều

  8 lợi thế khi sử dụng Polymer so với Angular và React

Một cách ngắn gọn: “polyfill (n): a JavaScript shim that replicates the standard API for older browsers”

Ví dụ các trình duyệt hiện nay đều hỗ trợ requestAnimationFrame, và để tạo một chức năng tương tự trên các trình duyệt cũ, ta có thể dùng đến hàm setTimeout() để thay thế.

varrequestAnimationFrame =
    window.requestAnimationFrame1       ||
          window.webkitRequestAnimationFrame1 ||
          window.mozRequestAnimationFrame1    ||
          window.oRequestAnimationFrame1      ||
          window.msRequestAnimationFrame1     ||
          function( callback ){ // polyfill
            window.setTimeout(callback, 1000 / 60);
Bạn có thể tìm hiều thêm về các polyfill phổ biến hiện nay ở đây: Những Polyfill được sử dụng nhiều
Bài viết gốc được đăng tải tại thangphampt.wordpress.com
Có thể bạn quan tâm:
Xem thêm Việc làm Developer hấp dẫn trên TopDev

Tình Hình Tuyển Dụng Lập Trình Viên Tại Việt Nam

tuyển dụng it

Tháng 6/2021, TopDev tiếp tục phát hành Vietnam IT Market Report 2021 – Developers Recruitment State. Theo đó, nhu cầu tuyển dụng ngành Công nghệ thông tin vẫn giữ nhịp tăng trưởng. Tuy vậy, thị trường tuyển dụng IT có xu hướng trở nên khó khăn hơn và có những thay đổi đáng kể về yêu cầu đối với nhân lực ngành IT. Thị trường có những chuyển động và phân loại rõ ràng về nhân lực CNTT ở nhiều cấp độ khác nhau, đòi hỏi sự thay đổi đến từ các ứng viên IT cũng như Nhà tuyển dụng.

Những thách thức cần phải vượt qua 

Nhu cầu tuyển dụng các vị trí IT cao cấp/linh hoạt đang có dấu hiệu tăng lên đáng kể (hơn 20% so với giai đoạn trước) đi kèm theo những yêu cầu khắt khe mới của doanh nghiệp, tương ứng với mức độ tăng nhanh về mức lương so với thị trường.

Trải qua nhiều sự ảnh hưởng từ đại dịch Covid-19, thị trường IT ngày càng đẩy mạnh việc áp dụng công nghệ đột phá, nâng cao cơ hội kinh doanh trong các lĩnh vực hiện đại: IT Automation/Robotics, Cybersecurity, DevOps, AI and Machine Learning, Blockchain,…

Ngoài những kỹ năng về kỹ thuật, kỹ năng mềm cũng đóng vai trò quan trọng trong việc đánh giá ứng viên IT. Kết quả từ TopDev trong Vietnam IT Market Report 2021 – Developers Recruitment State cho thấy 3 kỹ năng mềm hàng đầu cần có ở các Lập trình viên bao gồm: Khả năng thích ứng, tư duy phát triển và kỹ năng hợp tác/ làm việc nhóm.

Có thể nói, ngành CNTT với tốc độ thay đổi nhanh chóng cùng với đại dịch Covid-19 đã tạo áp lực lên khả năng thích ứng của mỗi lập trình viên, đòi hỏi họ phải có tư duy phát triển phù hợp để tự bảo vệ bản thân khỏi sự đào thải khốc liệt của các xu hướng và công nghệ mới.

Không chỉ vậy, với sự trỗi dậy của làn sóng công nghệ mới, Lập trình viên cần có sự hợp tác, liên kết với các thành viên trong cùng team và các bộ phận liên quan. Điều đó đóng vai trò then chốt trong quá trình vận hành kinh doanh và phát triển sản phẩm hiệu quả.

Mục tiêu sự nghiệp của các lập trình viên trong năm 2021

Vietnam IT Market Report 2021 – Developers Recruitment State thực hiện đã đưa ra kết quả khảo sát về những yếu tố quan trọng đối với Lập trình viên khi xem xét một offer công việc (không kể yếu tố mức lương) gồm có: Thách thức kỹ thuật/ vấn đề thú vị mà các lập trình viên sẽ giải quyết, Tech stack và cơ hội thăng tiến.

Theo đó, Lập trình viên đang quan tâm tìm đến những môi trường làm việc cho họ cơ hội được “đổi mới” và chinh phục những thử thách thú vị. Ngoài ra, các tài năng IT còn bị thu hút bởi Tech-stack của công ty – những ngôn ngữ lập trình và hệ sinh thái/ nền tảng mà công ty sử dụng trong những dự án của mình. Và yếu tố quan trọng thứ 3 chính là cơ hội thăng tiến, gặt hái những “trái ngọt’ xứng đáng với cống hiến của mình. 

Theo TopDev trong Vietnam IT Market Report 2021 – Developers Recruitment State, những lý do hàng đầu khiến Lập trình viên duy trì tại vị trí và nơi làm việc hiện tại của họ liên quan đến cơ hội tăng trưởng, đồng nghiệp và mức lương tiềm năng. Đây cũng chính là yếu tố hàng đầu giúp công ty giữ chân nhân tài CNTT cho doanh nghiệp của mình.

Mục tiêu sự nghiệp của các Lập trình viên ngày càng thể hiện rõ nhu cầu khẳng định giá trị của cá nhân, mong muốn cầu tiến và bứt phá giới hạn. Từ việc thấu hiểu mối quan tâm của lập trình viên, Nhân sự/Nhà tuyển dụng có thể tập trung phát triển chiến lược giao tiếp hiệu quả, thu hút và níu giữ các tài năng công nghệ tham gia phát triển công ty.

Hành vi tìm việc của Lập trình viên hiện nay

Thống kê kết quả khảo sát ứng viên IT năm 2021 cho thấy cứ 4 Lập trình viên thì chỉ có 1 người sẽ trở thành ứng viên chủ động trong 12 tháng tới. Đây là tín hiệu cho thấy các nhà tuyển dụng cần thay đổi hướng đi, tập trung đầu tư tiếp cận đối tượng tiềm năng để “thu hoạch” sau này, bởi số lượng Lập trình viên chủ động tìm kiếm việc làm đang chiếm tỉ lệ khá nhỏ trong tổng số lập trình viên tại Việt Nam. Đa số Lập trình viên tham gia khảo sát đang hướng tới việc dành từ 2-3 năm tiếp theo để tiếp tục gắn bó và phát triển tại công ty hiện tại của họ.

Thống kê về các kênh tìm kiếm việc làm IT của các Lập trình viên trong Vietnam IT Market Report 2021 – Developers Recruitment state cho thấy các website việc làm là địa chỉ ưa thích của các ứng viên IT, sau đó là các cộng đồng CNTT và kế tiếp là các kênh mạng xã hội (Facebook, LinkedIn). Các trang web tuyển dụng của công ty cũng nằm trong Top các kênh tìm kiếm việc làm được sử dụng bởi các Lập trình viên. Hackathon hay network cá nhân tuy không phổ biến bằng nhưng cũng là những kênh mà nhà tuyển dụng có thể cân nhắc khi muốn tiếp cận và tìm kiếm ứng viên CNTT.

Những kết quả trên cho thấy rằng đôi khi cuộc tuyển dụng thành công không cần trải qua các quy trình tuyển dụng chính thức mà đến từ mạng lưới nhà tuyển dụng (Người giới thiệu). Tuy nhiên, quy trình tuyển dụng nên sử dụng cách tiếp cận tiêu chuẩn để tìm và đánh giá ứng viên dựa trên những kỹ năng của họ. Tức là, những ứng viên được giới thiệu nên trải qua quá trình đánh giá và phỏng vấn giống như những ứng viên khác thay vì nhận sự giới thiệu. Điều này giúp hạn chế những đánh giá thiên vị – chủ quan” và thành kiến về sau cũng như giúp mở rộng đáng kể nguồn nhân lực chất lượng trong tương lai.

Quy trình tuyển dụng IT

Thị trường tuyển dụng CNTT ngày càng trở nên cạnh tranh, trải nghiệm của ứng viên trong quá trình tuyển dụng là một trong những yếu tố hàng đầu giúp doanh nghiệp thu hút và giữ chân nhân tài, đồng thời nâng cao Thương hiệu Nhà tuyển dụng. Phần lớn Lập trình viên gặp phải trường hợp bị giới thiệu vào những vị trí công việc không liên quan đến chuyên môn và phải thực hiện các câu hỏi phỏng vấn hoặc bài test không phù hợp. Điều này khiến Lập trình viên có trải nghiệm tồi tệ trong quy trình tuyển dụng, tạo nên rào cản cho nhà tuyển dụng khi muốn tìm kiếm ứng viên phù hợp.

Việc các chuyên viên Nhân sự/ Tuyển dụng không có kiến thức nền tảng về công nghệ hoặc sản phẩm/ dịch vụ của công ty cũng tạo ra cảm giác không tốt cho các lập trình viên. Trải qua quá trình đàm phán lương mà không được cung cấp đầy đủ thông tin về quy trình tuyển dụng hoặc có quá nhiều vòng phỏng vấn cũng tạo ra cảm xúc tiêu cực cho ứng viên.

Vietnam IT Market Report 2021 – Developers Recruitment State cũng đưa ra 3 lý do hàng đầu khiến các lập trình viên từ chối lời mời làm việc: Offer không phù hợp (trách nhiệm và mức lương), chính sách đãi ngộ & phúc lợi và thiếu cơ hội phát triển/ đóng góp tại công ty. Ngoài ra nhà tuyển dụng cũng cần lưu ý về các yếu tố: Tech stack không mong muốn, vai trò và trách nhiệm của vị trí không rõ ràng, làm việc thiếu linh hoạt, các vấn đề kinh doanh / kỹ thuật không mong muốn và cuối cùng là danh tiếng của công ty.

Mối quan tâm của Nhân sự/ Nhà tuyển dụng ở thời điểm hiện tại

Việc số lượng lập trình viên được đào tạo mỗi năm không đủ đáp ứng nhu cầu nhân lực CNTT ngày càng tăng đã tạo ra nhiều thách thức và cạnh tranh cho ngành tuyển dụng IT. Các chuyên gia nhân sự tham gia cuộc khảo sát đã đề cập đến hầu hết những khó khăn khi phụ trách tuyển dụng lập trình viên. Phần lớn Nhân sự/ Nhà tuyển dụng gặp phải khó khăn trong việc tìm kiếm ứng viên có năng lực hay phải nghiên cứu, tìm hiểu yêu cầu tuyển dụng các vị trí IT và hoàn thành các mục tiêu tuyển dụng IT trong khung thời gian quy định.

Sự thật là nguồn cung nhân lực trong lĩnh vực CNTT vẫn chưa đáp ứng được nhu cầu và tốc độ phát triển của ngành trong thời gian tới. Dự kiến năm 2021, các công ty công nghệ sẽ tiếp tục cạnh tranh gay gắt hơn nhiều để lấp đầy các vị trí IT còn thiếu.

Vietnam IT Market Report 2021 – Developers Recruitment State do TopDev thực hiện đã nói lên ưu tiên hàng đầu của các Nhà tuyển dụng/ Nhân sự IT trong năm 2021 là xây dựng thương hiệu nhà tuyển dụng trong cộng đồng công nghệ. Ngoài ra, việc mở rộng nguồn nhân tài IT và cải thiện kinh nghiệm của ứng viên cũng là yếu tố được quan tâm không kém.

Trên đây là một số khía cạnh và đặc điểm nổi bật của tình hình tuyển dụng IT tại Việt Nam trong năm 2021. Để tìm hiểu thêm nhiều thông tin và chỉ số khác của ngành Công nghệ thông tin, mời bạn tải Vietnam IT Market Report 2021 – Developers Recruitment State do TopDev phát hành bên dưới:

tải ngay báo cáo


Tháng 10 &11 – thời điểm tốt cuối cùng trong năm để hoàn thành kế hoạch tuyển dụng năm 2021 vì vài tháng tới cận Tết ứng viên sẽ quan tâm lương tháng 13 /thưởng Tết ngại chuyển việc. TopDev xin gửi đến Quý công ty những ưu đãi nhằm tối ưu chi phí thích hợp cho các bên đang bị hạn chế về ngân sách đợt cuối năm lên đến 30% tại đây https://topdev.vn/recruit. Cần thêm thông tin về báo giá số lượng tin đăng nhiều hơn, công ty liên hệ hotline 028.6273.3496 để nhận ưu đãi đặc biệt.

04 điểm Nhà tuyển dụng quan tâm nhất về TopDev:

1. Cơ hội tiếp cận kho dữ liệu 335.000 ứng viên IT
2. 60 ngày đăng tin (30 ngày chính thức và 30 ngày bảo hành)
3. Tin đăng hiển thị cả trang chủ và trang tìm việc
4. Nhận 02 nguồn CV: ứng viên tự apply và ứng viên TopDev giới thiệu sang

tìm hiểu ngay

 

Hướng dẫn kết nối cơ sở dữ liệu với Java JDBC

Hướng dẫn kết nối cơ sở dữ liệu với Java JDBC

Bài viết được sự cho phép của tác giả Giang Phan

Trong bài này tôi sẽ hướng dẫn các bạn sử dụng kết nối vào database sử dụng Java JDBC.

  Hibernate là gì? Sao phải dùng nó thay JDBC?
  10 Java Web Framework tốt nhất

JDBC là gì?

JDBC (Java Database Connectivity) là một API chuẩn dùng để tương tác với các loại cơ sở dữ liệu quan hệ (database relationship). JDBC bao gồm một tập hợp các class và các interface dùng cho ứng dụng Java có thể giao tiếp với các cơ sở dữ liệu (database) khác nhau.

JDBC có thể làm việc với bất kỳ cơ sở dữ liệu (MySQLPostgreSQLOracleSQL Server, …) dựa vào một Driver được cung cấp.

JDBC API bao gồm hai package chính:

  • java.sql : là một phần của Java standard.
  • javax.sql : là một phần của Java enterprise.

Các thành phần của JDBC

  • DriverManager : là một class quản lý danh sách các Driver (database drivers). Các yêu cầu kết nối từ ứng dụng Java sẽ được class này tìm kiếm Driver phù hợp đầu tiên để thiết lập kết nối với cơ sở dữ liệu.
  • Driver: là một interface dùng để xử lý các giao tiếp với cơ sở dữ liệu. Thông thường ứng dụng Java sẽ không giao tiếp trực tiếp với class này mà thông qua DriverManager.
  • Connection : là một interface cung cấp tất cả các method cần thiết cho việc giao tiếp với database. Interface này chứa nhiều phương thức đa dạng để tạo kết nối với một Database. Tất cả các thông tin giao tiếp với cơ sở dữ liệu chỉ có thể thông qua đối tượng Connection. Một Connection đại diện cho một phiên (session) làm việc với cơ sở dữ liệu.
  • Statement : là một interface cho phép gửi các câu lệnh SQL tới Database. Ngoài ra, một số Interface kết thừa từ nó cung thêm các tham số để thực thi các thủ tục đã được lưu trữ (stored procedure).
  • ResultSet : đại diện cho tập hợp các bản ghi (record) có được sau khi thực hiện truy vấn (query).
  • SQLException : class này xử lý bất cứ lỗi nào xuất hiện trong khi làm việc với Database.

Kết nối database với Java JDBC

Để làm việc với JDBC, bạn cần cài đặt Java và một cơ sở dữ liệu (database). Bạn có thể sử dụng bất kỳ database nào, chẳng hạn MySQL.

Như đã giới thiệu ở trên, để làm việc với cơ sở dữ liệu từ Java cần phải có Driver. Trong JDBC API, chúng ta có java.sql.Driver, đây là một interface có sẵn trong JDK. Mỗi hệ quản trị cần cài đặt một Driver riêng tương ứng với cơ sở dữ liệu đó. Như vậy công việc cần phải làm là download thư viện Driver ứng với loại Database mong muốn sử dụng.

Download Driver

Oracle Database JDBC Driver

Truy cập vào link: https://www.oracle.com/database/technologies/jdbcdriver-ucp-downloads.html

Chọn phiên bản ojdbc[xx].jar tương ứng với phiên bản sử dụng. Chẳng hạn ojdbc6.jar sử dụng cho JDK8, JDK7, và JDK6.

Nếu sử dụng maven project, các bạn có thể add dependency tương ứng ở link sau: https://mvnrepository.com/artifact/com.oracle.jdbc

<!-- https://mvnrepository.com/artifact/com.oracle.jdbc/ojdbc14 --> <dependency>     <groupId>com.oracle.jdbc</groupId>     <artifactId>ojdbc14</artifactId>     <version>12.2.0.1</version> </dependency>

MySQL Database JDBC Driver

Các bạn thêm maven dependency hoặc download gói jar tương ứng tại đây: https://mvnrepository.com/artifact/mysql/mysql-connector-java

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.17</version> </dependency>

SQL Server (JTDS) Database JDBC Driver

Các bạn thêm maven dependency hoặc download gói jar tương ứng tại đây: https://mvnrepository.com/artifact/net.sourceforge.jtds/jtds

<!-- https://mvnrepository.com/artifact/net.sourceforge.jtds/jtds --> <dependency>     <groupId>net.sourceforge.jtds</groupId>     <artifactId>jtds</artifactId>     <version>1.3.1</version> </dependency>

PostgreSQL Database JDBC Driver

Các bạn thêm maven dependency hoặc download gói jar tương ứng tại đây:  https://mvnrepository.com/artifact/org.postgresql/postgresql

<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql --> <dependency>     <groupId>org.postgresql</groupId>     <artifactId>postgresql</artifactId>     <version>42.2.7</version> </dependency>

MariaDB Database JDBC Driver

Các bạn thêm maven dependency hoặc download gói jar tương ứng tại đây:  https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client

<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client --> <dependency>     <groupId>org.mariadb.jdbc</groupId>     <artifactId>mariadb-java-client</artifactId>     <version>2.4.4</version> </dependency>

MongoDB Database JDBC Driver

Các bạn thêm maven dependency hoặc download gói jar tương ứng tại đây: https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver

<!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver --> <dependency>     <groupId>org.mongodb</groupId>     <artifactId>mongo-java-driver</artifactId>     <version>3.11.0</version> </dependency>

Kết nối database từ Java

Các bước giao tiếp giữa chương trình Java và Database:

  • Load Driver.
  • Tạo kết nối (Open Connection).
  • Tạo câu lệnh truy vấn SQL (Statement).
  • Thực thi câu lệnh truy vấn SQL (Execute Query).
  • Đóng kết nối (Close Connection).

Load Driver

Để kết nối với database, chúng ta cần load driver và register nó với ứng dụng. Có 2 cách để thực hiện:

  • Class.forName() : load class Driver trong memory tại thời điểm runtime. Để đăng ký gọi phương thức: Class.forName(“driverName”);
  • DriverManager.registerDriver() : DriverManager là class có sẵn trong Java. Để đăng ký gọi phương thức: DriverManager.registerDriver(new DriverName());

Chẳng hạn để kết nối với MySQL database, ta đăng ký như sau:

Class.forName("com.mysql.jdbc.Driver"); // Or DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());

Tạo kết nối (Open Connection)

Sau khi đã load Driver, chúng ta tạo connection:

DriverManager.getConnection(connectionURL); // Or DriverManager.getConnection(connectionURL, userName, password);

Ví dụ với MySQL:

// Pattern String connectionURL = "jdbc:mysql://hostname:port/dbname"; // Example String connectionURL = "jdbc:mysql://hostname:3306/jdbcdemo"; Connection con = DriverManager.getConnection(connectionURL, username, password);

Tạo câu lệnh truy vấn SQL (Statement)

Sau khi một kết nối được thiết lập, chúng ta có thể tương tác với cơ sở dữ liệu.

Các interface JDBCStatement, CallableStatement và PreparedStatement xác định các phương thức cho phép gửi các lệnh SQL và nhận dữ liệu từ cơ sở dữ liệu.

Statement st = con.createStatement();

Thực thi câu lệnh truy vấn SQL (Execute Query)

Bây giờ đến phần quan trọng nhất, đó là thực hiện câu lệnh truy vấn SQL (execute query). Như chúng ta biết, có thể có nhiều loại truy vấn. Một trong số đó là:

  • Truy vấn để cập nhật (update) / chèn (insert)/ xóa (delete) trong cơ sở dữ liệu.
  • Truy vấn để lấy dữ liệu (select).

Statement cung cấp một số phương thức để thực thi truy vấn SQL tương ứng với các loại trên:

  • Phương thức execQuery() : được sử dụng để thực hiện các truy vấn truy xuất giá trị từ cơ sở dữ liệu (select). Phương thức này trả về đối tượng ResultSet có thể được sử dụng để lấy tất cả các dữ liệu (record) của bảng.
  • Phương thức execUpdate() : được sử dụng để thực hiện các truy vấn insert/ update/ delete.
  • Phương thức execute() : có thể thực thi cả 2 trường hợp trên. Nếu phương thức statement.getUpdateCount() trả về số lượng record bị affect.
    • Nếu giá trị > 0, có nghĩa là thực thi các câu lệnh insert/ update/ delete.
    • Nếu giá trị = 0, có nghĩa là thực thi các câu lệnh insert/ update/ delete không có dòng nào bị ảnh hưởng hoặc thực thi câu lệnh cập nhật data structure.
    • Nếu giá trị = -1, có nghĩa là thực thi câu lệnh select. Khi đó, có thể gọi tiếp lệnh statement.getResultSet() để lấy ResultSet.

Ví dụ:

int numberRowsAffected = st.executeUpdate(sqlInsert); if (numberRowsAffected == 0) {     System.out.println("insertion failed"); } else {     System.out.println("inserted successfully : " + sqlInsert); }

Đóng kết nối (Close Connection)

Cuối cùng, sau khi đã sử dụng chúng ta cần phải gọi phương thức close() để đóng kết nối (Connection) và giải phóng tài nguyên.

Bằng cách đóng kết nối, các đối tượng của Statement và ResultSet sẽ được đóng tự động. Tuy nhiên, chúng ta nên tập thói quen close() Statement sau khi sử dụng hay vì chờ đợi điều đó xảy ra khi nó tự động bị đóng để giải phóng tài nguyên. Đặc biệt nếu chúng ta thực thi Statement trong vòng lặp, thì có thể sẽ gặp vấn đề về thiếu tài nguyên sử dụng nếu chờ đợi nó tự động đóng.

Khi Statement được close() thì ResultSet của Statement cũng được close.

Chương trình Java kết nối cơ sử dữ liệu sử dụng JDBC API

Chương trình bên dưới chỉ đơn giản thực hiện kết nối đến cơ sở dữ liệu MySQL và thêm một dòng dữ liệu vào bảng user.

package com.gpcoder; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class HelloJdbc {     private static final String hostName = "localhost";     private static final String dbName = "jdbcdemo";     private static final String userName = "root";     private static final String password = "";     // jdbc:mysql://hostname:port/dbname     private static final String connectionURL = "jdbc:mysql://" + hostName + ":3306/" + dbName;     public static void main(String[] args) throws ClassNotFoundException, SQLException {         // 1. Load Driver         // Class.forName("com.mysql.jdbc.Driver");         DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());         // 2. Open connection         Connection con = DriverManager.getConnection(connectionURL, userName, password);         // 3. Create Statement         Statement st = con.createStatement();         // 4. Execute query         String sqlInsert = "INSERT INTO user(username, password, createdDAte) VALUE('gpcoder', '123', now());";         int numberRowsAffected = st.executeUpdate(sqlInsert);         if (numberRowsAffected == 0) {             System.out.println("insertion failed");         } else {             System.out.println("inserted successfully : " + numberRowsAffected);         }         st.close();            // 5. Close connection         con.close();     } }

Thực thi chương trình trên ta có kết quả sau:

inserted successfully : 1

Lưu ý: các bạn nên đặt câu lệnh close() trong finally block trong câu lệnh try-catch-finally hoặc sử dụng tính năng mới try-with-resource để đảm bảo resource luôn được close sau khi sử dụng. Ví dụ:

package com.gpcoder; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class HelloJdbcWithJava8 {     private static final String hostName = "localhost";     private static final String dbName = "jdbcdemo";     private static final String userName = "root";     private static final String password = "";     // jdbc:mysql://hostname:port/dbname     private static final String connectionURL = "jdbc:mysql://" + hostName + ":3306/" + dbName;     public static void main(String[] args) throws ClassNotFoundException, SQLException {         // 1. Load Driver         // Class.forName("com.mysql.jdbc.Driver");         DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
         try (             // 2. Open connection             Connection con = DriverManager.getConnection(connectionURL, userName, password);             // 3. Create Statement             Statement st = con.createStatement();         ) {                          // 4. Execute query             String sqlInsert = "INSERT INTO user(username, password, createdDAte) VALUE('gpcoder', '123', now());";             int numberRowsAffected = st.executeUpdate(sqlInsert);             if (numberRowsAffected == 0) {                 System.out.println("insertion failed");             } else {                 System.out.println("inserted successfully : " + numberRowsAffected);             }         }         // 5. Close connection: will be auto closed by try-with-resource     } }

Trên đây là một số kiến thức cơ bản về kết nối cơ sở dữ liệu với Java JDBC. Trong bài viết tiếp theo, chúng ta sẽ cùng tìm hiểu sâu hơn về các API của JDBC.

Tài liệu tham khảo:

Bài viết gốc được đăng tải tại gpcoder.com

Có thể bạn quan tâm:

Xem thêm Việc làm Java hấp dẫn trên TopDev

Hướng dẫn viết theme WordPress toàn tập – phần 1

Hướng dẫn viết theme WordPress toàn tập phần 1

Bài viết được sự cho phép của tác giả Trần Anh Tuấn

Bạn muốn tự viết một theme WordPress cho riêng bạn hay là làm freelance viết theme cho khách hàng theo yêu cầu kiếm thêm thu nhập mà không muốn dùng theme miễn phí, hoặc có phí nhưng không có tiền mua hay khó tùy chỉnh.

Rồi bạn có tìm hiểu qua các cách viết theme WordPress nhưng vẫn còn mơ hồ. Chưa biết bắt đầu như thế nào, code ra sao, mặc dầu bạn có kiến thức về WP, PHP…

Đừng lo lắng vì serie hướng dẫn viết theme WordPress toàn tập này của mình sẽ giúp các bạn có thể tự viết theme WordPress từ đầu luôn. Mình và các bạn sẽ cùng nhau viết một theme WordPress hoàn chỉnh để các bạn có thể hình dung nó như thế nào luôn nhé.

Trước khi bắt tay vào làm thì các bạn có thể nhấn vào đây để coi sản phẩm mà chúng ta sẽ cố gắng hoàn thành nà. Cũng như một vài yêu cầu và hướng dẫn cài đặt trước khi đi vào chi tiết ở bài sau.

  10 theme Sublime Text tốt nhất
  Hướng dẫn lập trình theme woocommerce từ a đến z

# Yêu cầu

Để có thể hiểu và viết được theme wordpress thì các bạn phải có kiến thức cơ bản về HTML, CSS, JS, PHP và WordPress nhé. Các bạn chưa có kiến thức về PHP thì các bạn có thể học tại freetuts còn WordPress thì các bạn có thể tham khảo khoá học WordPress trong vòng 7 tiếng của anh Duy Võ trên kt.city nhé.

hướng dẫn viết theme wordpress

Nếu các bạn chưa nắm cơ bản các kiến thức trên thì các bạn sẽ không hiểu gì hết và rất khó để theo dõi serie này. Vì thế mình khuyến khích các bạn nên có kiến thức theo yêu cầu trước nhé. Không là không hiểu gì luôn ấy.

Ngoài ra để có thể chạy được WordPress trên máy tính thì chúng ta cần cài đặt Xampp. Các bạn nhấn vào đây để tải bản Xampp mới nhất cho Windows, sau khi tải về và cài đặt như một phần mềm bình thường.

Lưu ý: Mình không hướng dẫn cài Xampp vì nó cài đặt rất đơn giản, các bạn có thể Google để tìm hướng dẫn nhé. Hầu hết là tải về rồi sau đó chạy setup và cứ Next Next thôi.

# Tạo Database

Sau khi đã cài đặt Xampp thành công, thì bước tiếp theo chúng ta cần làm đó là mở phần mềm Xampp lên sau đó nhấn vào hai nút trên cùng để khởi động Apache và MySQL. Nếu cả hai đều chuyển sang màu xanh tức là đã thành công.

DÀNH CHO BẠN:

Mình có khoá học HTML CSS từ cơ bản tới nâng cao cho người mới, nếu bạn quan tâm thì bạn có thể học thử miễn phí bằng việc nhấn vào đây nha.

Sau khi khởi động xong, bạn hãy truy cập vào website với địa chỉ là http://localhost/dashboard/ sẽ thấy nó hiển thị ra trang giới thiệu XAMPP như hình dưới.

hướng dẫn tạo database wp

Để chạy được WordPress thì chúng ta phải có Database, chúng ta sẽ truy cập vào phpMyAdmin trên localhost, các bạn nhấn vào phpMyAdmin như hình

Sau đó các bạn nhấn vào mục cơ sở dữ liệu(Database) tạo một Database tên là gì tùy các bạn nhé, ở đây mình đặt là wp-tut, chọn kiểu là utf8_unicode_ci nhé sau đó các bạn nhấn Tạo

Ta được kết quả

# Cài đặt WordPress

Các bạn vào thư mục cài đặt của Xampp mà các bạn đã cài đặt, rồi vào thư mục htdocs, ở đây chúng ta sẽ tạo một thư mục có tên là wp-tut(các bạn có thể đặt sao tùy thích)

Sau đó các bạn vào trang wordpress.org tại đây để download source code WordPress về nhé. Mình sẽ tải bản 4.9.8 vì nó ổn định, hiện tại WordPress mới update lên version 5.0.2 rồi nhưng vì mới nên chắc còn lỗi nhiều.

Sau khi tải xong các bạn giải nén và copy toàn bộ như hình dưới đây vào thư mục wp-tut mà chúng ta đã tạo ở trên nhé.

Giờ là bước quan trọng, các bạn truy cập vào locahost/wp-tut (tên thư mục các bạn tạo khi nãy) nó sẽ ra như hình này. Các bạn chọn ngôn ngữ, ở đây mình sẽ chọn English và bấm Continue

Sau đó nó hiện ra một đống thông tin, các bạn chỉ cần nhấn nút “Let’s go” ở dưới là được.

Ở mục tiếp theo các bạn điền vào tên Cơ sở dữ liệu (Database) mà ta đã tạo khi nãy, ở đây mình tạo là wp-tut, Username các bạn nhập vào là root, Password các bạn để trống và hai trường còn lại các bạn để nguyên nhé, rồi ta nhấn Submit.

Sau đó chúng ta sẽ có kết quả như hình này, và các bạn nhấn Run installation để cài đặt nhé.

Sau khi nhấn nó lại hiện ra một đống thông tin như Site Title, Username, Password, Email cho website của chúng ta. Các bạn điền sao cũng được vì đang làm ở dưới máy mà. Mình điền đại như thế này và nhấn Install Worpress.

Chúng ta sẽ được kết quả thành công như thế này, và nhấn login để đăng nhập vào nhé. Thế là xong phần cài đặt WordPress trên máy tính.

# Cài đặt starter theme

Để viết theme WordPress từ đầu thì chúng ta sẽ dùng Starter Theme tức là Theme có sẵn cấu trúc chuẩn WordPress rồi nhưng chưa có code gì nhiều. Mình sẽ dùng Underscore Starter Theme. Các bạn có thể nhấn vào đây để tải về nhé.

Khi các bạn nhấn vào nó sẽ ra như trên, các bạn nhập vào tên Theme là được rồi, ở đây mình nhập là maker sau đó nhấn Generate là nó tự động tải về máy. Các bạn tải về rồi sau đó bỏ vào thư mục \htdocs\wp-tut\wp-content\themes rồi sau đó giải nén là được nhé.

Và chúng ta sẽ vào wp-admin của WordPress nãy chúng ta đã cài đặt chọn mục Appearance (Giao diện nếu lúc cài đặt bạn chọn Tiếng Việt) các bạn chọn mục Themes. Các Themes sẽ hiện ra và có cả cái maker mà chúng ta vừa thêm vào, các bạn chọn active là xong

Sau đó các bạn ra trang chủ tức là localhost/wp-tut sẽ có kết quả trông như thế này. Như vậy là ổn rồi. Ở bài sau chúng ta sẽ tiến hành viết theme WordPress step by step nhé. Chúc các bạn một ngày tốt lành nà. Ngoài ra nếu các bạn muốn học WordPress cơ bản chỉn chu từ đầu thì đừng quên tham khảo khoá học WordPress của anh Duy võ trên kt.city nhé

Bài viết gốc được đăng tải tại evondev.com

Có thể bạn quan tâm:

Xem thêm Tuyển dụng lập trình WordPress hấp dẫn trên TopDev

Giới thiệu về Gulp JS

Giới thiệu về Gulp JS

Bài viết được sự cho phép của tác giả Tino Phạm

1. Gulp là cái gì vậy?

Gulp được biết đến như là một Task Runner, nghĩa là nó sẽ thực hiện các nhiệm vụ mà developer đặt ra cho nó một cách tự động.
OK, ví dụ  thế này nhé: bạn đang tham gia một dự án web và trong quá trình phát triển dự án bạn muốn là: mỗi khi bạn chỉnh sửa các file html, css, hoặc là js gì bạn sẽ không cần phải nhấn F5 (refresh) browser cho mất công nữa, bạn cũng muốn minify các file css và js khi bạn release package, và bạn còn muốn làm nhiều thứ khi phát triển dự án của mình. Vậy Gulp sẽ giúp bạn định nghĩa các tasks và tự động thực hiện các tasks đó cho bạn.
Lợi ích của Gulp là: giúp bạn tự động minify, complile, reload browser,… và nhiều thứ khác rất hay nữa.

  10 Công ty hàng đầu thế giới sử dụng Node.js
  8 lợi thế khi sử dụng Polymer so với Angular và React

2. Hướng dẫn cài đặt

Gulp hoạt động  trên môi trường Nodejs nên việc đầu tiên là bạn phải cài đặt Node.js và npm
– Download và cài đặt Node.js tại đây. Cài Node.js bao gồm cả npm.
– Mở hộp thoại cmd trong window và gõ lệnh: npm install gulp -g
Vậy là xong việc cài đặt Gulp rồi.
Giải thích lệnh trong npm: npm có 3 loại install
– install -g: là global, như thế e có thể truy cập tới package vừa cài ở bất kì đâu trong hệ thống
– install –save: là khi install, đồng thời save lại tên package đó vào package.json ở trường dependencies, thường dùng nếu package đó cần dùng cho product lúc runtime (ví dụ như cài các gói: express, socket.io,..)
– install –save-dev: là khi install, cũng save vô package.json nhưng ở trường dev-dependencies, ý nói tới các package mà e chỉ cần lúc development thôi chứ lên môi trường production thì ko cần nữa, ví dụ như gulp hay webpack, nodemon,…

3. Hướng dẫn sử dụng Gulp

Bạn tạo một file tên là gulpfile.js trong thự mục gốc của dự án. Nội dung cơ bản như sau:

var gulp = require('gulp');
gulp.task('default', function(){
         //Default task code
});

– Để chạy file gulp này, bạn mở command line/terminal và gõ lệnh: gulp
– Bạn cũng có thể tạo nhiều tasks mới tương tự code tạo task ‘default’ và chỉ cần đổi tên ‘default’ thành tên task của bạn. ví dụ:

gulp.task(‘tên-task’function() {
            // xử lý task
});

4. Gulp làm việc thế nào?

Một file gulp được chia thành  từng task và được định nghĩa bằng khối lệnh
gulp.task(‘tên-task’function() // xử lý task });

Mặc định khi chạy lệnh gulp trong terminal/command line không kèm theo tham số nào (như ví dụ trên), gulp sẽ tự động chạy task mặc định là default.

Khi muốn chạy một task cụ thể nào đó, ta gõ lệnh:
gulp tên-task

5. Sử dụng Gulp để tạo server ảo và tự động refresh server

Việc này có nghĩa là gulp sẽ tự động refresh lại trình duyệt ngay sau khi bạn có  bất cứ thay đổi nào với các file javascript, html hay css trong dự án của bạn.

Để làm được việc này, chúng ta cần cài đặt BrowserSync. Đây là module dùng để thực hiện việc refresh browser đang mở, đồng bộ scroll, form,…

Mở command line/terminal và gõ lệnh: npm install browser-sync –save-dev

Tiếp theo, tạo file gulpfile.js như các ví dụ trên.

Sau đó, mở gulpfile.js và thêm code sau:

var browserSync = require(‘browser-sync’);

Tạo một task mới với tên là ‘detect-changed’ theo cú pháp:

gulp.task(‘serve’, [], function () {

});

Trong task này, chúng ta tiến hành khởi động server:

browserSync({
    notify: false
    server: {
            baseDir:  ‘.’
       }

});

Câu lệnh trên khởi động một web server đơn giản và chạy ở địa chỉ mặc định là http://localhost:port, với thư mục root là ngay tại thư mục hiện hành của file gulpfile.js

Sau khi khởi động server, việc tiếp theo sẽ là watch (theo dõi) các file javascript, css và html (hoặc bất kì file nào bạn muốn), khi có bất kì thay đổi nào trên các file này thì gọi lệnh browserSync.reload để refresh trình duyệt đang mở.

gulp.watch([‘.html’], browserSync.reload);
gulp.watch([‘js/.js’], browserSync.reload);

gulp.watch([‘css/*.css’], browserSync.reload);
Và đây là file gulpfile.js hoàn chỉnh:

var gulp = require(‘gulp’);
var browserSync = require(‘browser-sync’);
var reload = browserSync.reload;

gulp.task(‘default’, [], function () {
console.log(“reload server”);
});

gulp.task(‘detect-changed’, [], function () {
browserSync({
notify: false,
server: {
baseDir: ‘.’
}
});

gulp.watch([‘*.html’], reload);
gulp.watch([‘js/*.js’], reload);
gulp.watch([‘css/*.css’], reload);
});

Để chạy file gulp này, chúng ta gõ lệnh:

gulp serve
Trình duyệt sẽ tự bật lên với địa chỉ http://localhost:port

Bây giờ, bạn thử sửa một file html hoặc javscript, css bất kì, và lưu lại, các trình duyệt đang mở sẽ tự động refresh lại và cập nhật thay đổi đó ngay lập tức.

Trên đây chỉ là một ví dụ đơn giản cho việc ứng dụng lệnh watch của gulp. Ngoài ra bạn nên tham khảo thêm tài liệu của Gulp tại đây:

https://github.com/gulpjs/gulp/tree/master/docs
http://labs.septeni-technology.jp/none/gulp-la-gi/
https://techmaster.vn/posts/34204/gulp-cho-nguoi-moi-bat-dau

Bài viết gốc được đăng tải tại thangphampt.wordpress.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Gửi STOMP message tới một user cụ thể với Spring WebSocket

Gửi STOMP message tới một user cụ thể với Spring WebSocket

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Trong bài viết trước, mình đã hướng dẫn các bạn cách hiện thực WebSocket sử dụng Spring WebSocket. Trong ví dụ của bài viết đó, tất cả các user subscribe vào “/topic/messages” sẽ nhận được các message được publish vào topic này. Trong trường hợp các bạn muốn chỉ gửi đến một user cụ thế nào đó thì làm thế nào? Trong bài viết này, mình sẽ hướng dẫn các bạn cách gửi STOMP message tới một user cụ thể với Spring WebSocket các bạn nhé!

  Discord đã lưu trữ hàng tỉ messages mỗi ngày như thế nào
  Giới thiệu JMS – Java Message Services

Mình cũng tạo một Spring Boot project với Web và WebSocket dependency như bài viết trước.

Kết quả như sau:

Gửi STOMP message tới một user cụ thể với Spring WebSocket

Mình cũng khai báo để sử dụng WebJars với JQuerySocketJS client và Stomp WebSocket dependencies như sau:

<dependency>
<groupId>org.webjars</groupId>
<artifactId>webjars-locator-core</artifactId>
</dependency>
<dependency>
<groupId>org.webjars.npm</groupId>
<artifactId>jquery</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>sockjs-client</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>stomp-websocket</artifactId>
<version>2.3.4</version>
</dependency>

Tương tự như bài viết trước, mình cũng tạo mới một class để cấu hình WebSocket như sau:

package com.huongdanjava.springboot.websocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/hello").withSockJS();
}

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("queue");
registry.setApplicationDestinationPrefixes("/app");
registry.setUserDestinationPrefix("/users");
}
}

Điểm khác biệt ở đây:

  • Thứ nhất là mình để giá trị của tham số trong phương thức enableSimpleBroker() là “queue”, mục đích là để thể hiện mục đích của ví dụ thôi, point-to-point, chứ tên gì cũng được nha các bạn!
  • Cái chính mà các bạn cần biết là để send một message tới user cụ thể nào đó, chúng ta sẽ send message tới 1 endpoint mặc định bắt đầu với “/user”, ví dụ như “/user/queue/messages” chẳng hạn. Chúng ta có thể thay đổi prefix mặc định này bằng cách sử dụng phương thức setUserDestinationPrefix() của đối tượng MessageBrokerRegistry như mình làm ở trên. Trong ví dụ của mình thì bây giờ, chúng ta cần message tới endpoint “/users/queue/messages” chẳng hạn.

Để handle message từ client gửi tới STOMP endpoint của WebSocket server, mình cũng tạo mới một class MessageController với nội dung như sau:

package com.huongdanjava.springboot.websocket;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;

@Controller
public class MessageController {

@Autowired
private SimpMessagingTemplate simpMessagingTemplate;

@MessageMapping("/hello")
public void send(SimpMessageHeaderAccessor sha, @Payload String username) {
String message = "Hello from " + sha.getUser().getName();

simpMessagingTemplate.convertAndSendToUser(username, "/queue/messages", message);
}
}

Mình cũng sử dụng @MessageMapping để định nghĩa mapping method handle cho request “/hello” tới WebSocket server.

Điểm khác biệt ở đây là chúng ta không sử dụng annotation @SendTo như bài viết trước nữa mà sẽ sử dụng class SimpMessagingTemplate với phương thức convertAndSendToUser() để send message tới một user cụ thể.

Có nhiều phương thức overload cho phương thức convertAndSendToUser() này:

Gửi STOMP message tới một user cụ thể với Spring WebSocket

Mình chỉ đang sử dụng một phương thức đơn giản với 3 tham số: user, destination và payload.

Tham số thứ 2, destination, là endpoint mà client cần subscribe, tất nhiên là cần phải thêm prefix mà chúng ta đã cấu hình trong class WebSocketConfiguration nữa nha các bạn. Trong ví dụ của mình thì các client cần subscribe endpoint “/users/queue/messages”.

Tham số thứ 3, payload, là nôi dung message mà chúng ta cần gửi tới user.

Tham số thứ 1, user là tham số quan trọng nhất mà mình đã mất rất nhiều thời gian để xác định nó, vì hiện tại không có một official document của Spring nói về vấn đề này. Thật ra thì nó là username gắn liền với một session id khi một client connect tới WebSocket server. Mặc định thì chỉ có session id được generate và đi kèm với mỗi WebSocket connection còn user name thì nếu chúng ta không thêm code để xác định username thì username này sẽ là null. Thông tin username này nếu có, sẽ được chứa trong implementation của interface java.security.Principal và class SimpMessageHeaderAccessor chứa thông tin về WebSocket connection header và sẽ chứa thông tin của class implementation này. Đó là lý do mà trong phương thức send() của class MessageController mình có sử dụng class SimpMessageHeaderAccessor là một tham số của phương thức này.

Trong ví dụ của bài viết này, mình sẽ truyền thông tin username vào header của WebSocket connection khi client connect tới WebSocket server và phía WebSocket server, mình sẽ thêm code để Spring xem nó là thông tin username của WebSocket connection.

Code phần front-end của mình như sau:

index.html:

<!DOCTYPE html>
<html>
<head>
<title>Hello WebSocket</title>
<script src="/webjars/jquery/dist/jquery.min.js"></script>
<script src="/webjars/sockjs-client/sockjs.min.js"></script>
<script src="/webjars/stomp-websocket/stomp.min.js"></script>
<script src="/app.js"></script>
</head>
<body>
<div id="main-content">
<div>
<div>
<label>What is your username?</label> 
<input type="text" id="username" placeholder="Your username here...">
</div>
<button id="connect" type="submit">Connect</button>
<form>
<div>
<label>User will received message</label> 
<input type="text" id="name" placeholder="User will receive the message...">
</div>
<button id="send" type="submit">Send</button>
</form>
</div>
</div>
<div>
<label>Message from someone: </label><span id="message"></span>
</div>
</body>
</html>

app.js:

var stompClient = null;

function connect(username) {
var socket = new SockJS('/hello');
stompClient = Stomp.over(socket);
stompClient.connect({ username: username, }, function() {
console.log('Web Socket is connected');
stompClient.subscribe('/users/queue/messages', function(message) {
$("#message").text(message.body);
});
});
}

$(function() {
$("form").on('submit', function(e) {
e.preventDefault();
});
$("#connect").click(function() {
connect($("#username").val());
});
$("#send").click(function() {
stompClient.send("/app/hello", {}, $("#name").val());
});
});

Kết quả khi chạy ví dụ của mình như sau:

Gửi STOMP message tới một user cụ thể với Spring WebSocket

Chúng ta sẽ nhập tên username sẽ gắn liền với WebSocket connection sau đó thì nhấn nút Connect để tạo WebSocket connection. Để đơn giản thì mình chỉ cho phép người dùng nhập tên username mà họ muốn gửi message, nội dung message sẽ tự động generate từ phía WebSocket server. Khi một user nhận được message từ ai đó, nội dung của message này sẽ hiển thị phía sau dòng text “Message from someone”.

Trong tập tin app.js, như các bạn thấy, client đang subscribe vào endpoint “/users/queue/messages” để nhận các message từ các user khác.

Bây giờ, mình sẽ code phần quan trọng nhất là thêm thông tin username đi kèm với mỗi connection tới WebSocket server.

Đầu tiên, mình sẽ tạo mới một class User implement interface java.security.Principal:

package com.huongdanjava.springboot.websocket;

import java.security.Principal;

public class User implements Principal {

private String name;

public User(String name) {
this.name = name;
}

@Override
public String getName() {
return name;
}

}

Tiếp theo, mình sẽ update class WebSocketConfiguration để thêm một interceptor cho mỗi WebSocket connection tới WebSocket server, chúng ta sẽ thêm code để set thông tin user cho connection đó, như sau:

package com.huongdanjava.springboot.websocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/hello").withSockJS();
}

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("queue");
registry.setApplicationDestinationPrefixes("/app");
registry.setUserDestinationPrefix("/users");
}

@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new UserInterceptor());
}
}

Nội dung của class UserInterceptor như sau:

package com.huongdanjava.springboot.websocket;

import java.util.ArrayList;
import java.util.Map;

import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.messaging.support.ChannelInterceptor;
import org.springframework.messaging.support.MessageHeaderAccessor;

public class UserInterceptor implements ChannelInterceptor {

@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);

if (StompCommand.CONNECT.equals(accessor.getCommand())) {
Object raw = message.getHeaders().get(SimpMessageHeaderAccessor.NATIVE_HEADERS);

if (raw instanceof Map) {
Object name = ((Map) raw).get("username");

if (name instanceof ArrayList) {
accessor.setUser(new User(((ArrayList<String>) name).get(0).toString()));
}
}
}
return message;
}
}

Nói nôm na thì cho mỗi WebSocket connection, mình sẽ lấy thông tin username mà mình đã truyền ở phía client lên để gán thông tin user cho connection đó. Phương thức setUser() của class SimpMessageHeaderAccessor với tham số là interface java.security.Principal sẽ giúp chúng ta làm điều này.

Bây giờ thì chúng ta có thể chạy ứng dụng để xem kết quả như thế nào các bạn nhé!

Mình sẽ mở 2 cửa sổ trình duyệt, nhập thông tin user “khanh” và “test” cho mỗi cửa sổ trình duyệt và nhấn nút Connect. Sau đó, ở cửa sổ của user “test”, mình sẽ nhập tên user “khanh” và nhấn nút Send. Ở cửa sổ của user “khanh”, các bạn sẽ thấy kết quả như sau:

Gửi STOMP message tới một user cụ thể với Spring WebSocket

System testing là gì?

System testing là gì?

Bài viết được sự cho phép của tác giả Lê Chí Dũng

1. Khái niệm

  • System testing là quá trình kiểm tra của một sản phẩm đã hoàn chỉnh và tích hợp đầy đủ. Sau khi Integration test và Unit test
  • Thông thường 1 sản phẩm phần mềm chỉ được test trên 1 vì môi trường demo, nhưng system test đảm bảo cho hệ thống vận hành trên nhiều môi trường khác nhau, tích hợp với nhiều phần mềm và hệ thống khác nhau.
  • System test thuộc loại kiểm thử hộp đen. System liên quan đến các hoạt động bên ngoài của phần mềm từ quan điểm của người sử dụng.
  Bài toán đồng thuận trong Distributed Systems
  Giải mã bí ẩn "system load" trên Linux

2. Tại sao system test là cần thiết?

System test sẽ thực hiện các công việc sau:

  • Sau khi hoàn thành quá trình test tích hợp chúng ta cần phải kiểm tra thêm về độ tương thích và tương tác với các thiết bị ngoại vi bên ngoài của ứng dụng để kiểm tra tính khả dụng của nó.
  • System test là việc xác minh kiểm tra kỹ lưỡng của mỗi đầu vào trong các ứng dụng để kiểm tra các kết quả mong muốn.
  • Thử nghiệm các kinh nghiệm của người dùng với các ứng dụng.

3. Các loại chiến lượt system testing

System test có hơn 50 loại, ở đây tôi chỉ giới thiệu 1 số loại system test điển hình sau:

  • Usability Testing – Kiểm tra tính khả dụng của ứng dụng, chủ yếu tập trung kiểm tra sự dễ sử dụng, tính linh hoạt, tính thân thiện của sản phẩm.
  • Load Testing – Kiểm tra tốc độ vận hành của sản phẩm, một sản phẩm tốt là 1 sản phẩm phải vận hành với tốc độ cao và có thể chịu được sức tải lớn khi có nhiều user truy cập.
  • Regression Testing – Kiểm thử hồi quy tập trung vào việc tìm kiếm lỗi sau khi xảy ra một thay đổi mã chính. Cụ thể, nó tìm cách phát hiện ra các hồi quy của phần mềm hoặc các lỗi cũ quay trở lại. Những hồi quy như vậy xảy ra bất cứ khi nào chức năng phần mềm trước đây đang hoạt động giờ tạm ngưng như đã định. Thông thường, những hồi quy xảy ra như một hệ quả không lường trước được những thay đổi chương trình, khi một phần mới của phần mềm được phát triển xung đột với mã tồn tại trước đó. Phương pháp phổ biến của kiểm thử hồi quy bao gồm chạy lại những kiểm thử trước đó và kiểm thử xem lỗi cố định trước đây tại sao lại xuất hiện. Độ sâu của kiểm thử phụ thuộc vào các nguy cơ và giai đoạn trong quá trình phát hành các tính năng bổ sung. Chúng có thể được hoàn tất khi thay đổi thêm vào đầu hoặc cuối bản phát hành, cũng có thể được có mức độ nguy hiểm thấp khi thực hiện kiểm thử tích cực trên mỗi tính năng.
  • Recovery Testing – Kiểm thử phục hồi là kiểm thử được thực hiện sau khi có các sự cố hệ thống dẫn đến chương trình lỗi, không hoạt động được. Kiểm thử phục hồi được thực hiện để đảm bảo chương trình sau khi khắc phục lỗi trên không xảy ra bug
  • Migration Testing – Kiểm thử di động được thực hiện để đảm bảo tính linh động của phần mềm, phần mềm có thể di chuyển được chuyển từ cơ sở hạ tầng hệ thống cơ sở hạ tầng hệ thống cũ để hiện tại không có bất kỳ vấn đề
  • Functional Testing – Kiểm thử chức năng nhằm đảm bảo chức năng phần mềm được vận hành theo đúng mục đích đưa ra
  • Hardware/Software Testing – Đây là khi các thử nghiệm tập trung chú ý về sự tương tác giữa các phần cứng và phần mềm trong quá trình thử nghiệm hệ thống.

4. Kết Luận

Trong quá trình hoàn thiện sản phẩm system test là vô cùng quan trọng, system test sẽ đảm bảo cho ứng dụng của bạn có khả năng tương thích cao với môi trường thực trước khi sản phẩm được ra mắt.

Bài viết gốc được đăng tải tại lcdung.top

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Lệnh if, elif, if else trong Python là gì?

Lệnh if - elif - else trong Python

Lệnh if có thể bạn đã gặp qua rất nhiều như trong C#, C++ hay đơn giản là trong excel để thực hiện một câu lệnh có điều kiện. Trong bài viết hôm nay, chúng ta sẽ cùng tìm hiểu về các lệnh if trong Python như if, elif hay if…else…. Đừng bỏ lỡ bài viết thú vị hôm nay của đội ngũ TopDev.

Câu lệnh điều kiện cho phép chương trình thực hiện các hành động khác nhau dựa trên các điều kiện nhất định. Dưới đây là các loại câu lệnh điều kiện phổ biến trong các ngôn ngữ lập trình.

Lệnh if trong Python

Lệnh if trong Python giống như trong ngôn ngữ C. Lệnh if được dùng để kiểm tra điều kiện, nếu thỏa mãn điều kiện if if-block (khối code) sẽ chạy, nếu không thì sẽ được bỏ qua.

lệnh if python
Lệnh if trong Python

Cú pháp của lệnh if là:

if dieu_kien
   if-block

Ở đây, nếu input thỏa mãn dieu_kien thì các lệnh trong if-block sẽ được thực hiện. Nếu dieu_kien trả về kết quả false thì lệnh sẽ không được thực hiện.

Lưu ý: trong Python, khối lệnh của lệnh if (if-block) được viết thụt lề vào trong so với dòng điều kiện if nếu sai cú pháp, dòng lệnh không thụt đầu dòng tiếp theo sẽ được hiểu là nằm ngoài khối lệnh.

Ví dụ của lệnh if trong Python:

var1 = 100
if var1 > 0
   print "1 - Nhan mot gia tri true"

var2 = 0
if var2 > 0
   print "2 - Nhan mot gia tri true"

print "Good bye!"

Khi code trên được thực thi sẽ cho kết quả:

1 - Nhan mot gia tri true
Good bye!

Trong ví dụ trên, var1 = 100 thỏa mãn điều kiện var1 > 0, vì vậy lệnh print "1 - Nhan mot gia tri true" được thực hiện, ngược lại var2 = 0, không thỏa mãn điều kiện var2 > 0 nên chương trình sẽ tiếp tục thực hiện lệnh print "Good bye!" bên ngoài khối if.

  Str trong Python là gì? Kiểu dữ liệu chuỗi và định dạng chuỗi trong Python

Lệnh if…else… trong Python

Lệnh if else cũng dùng để kiểm tra điều kiện nhưng sẽ có hai vế, nếu khối code không thỏa mãn điều kiện if, thì lệnh else sẽ chạy.

Lệnh if...else... trong Python
Lệnh if…else… trong Python

Cú pháp của lệnh else if Python là:

if dieu_kien
   khoi_lenh_if
else
   khoi_lenh_else

Nếu điều kiện so với if == true, thì khối lệnh trong if sẽ được thực hiện, ngược lại nếu false thì chương trình sẽ chạy câu lệnh trong khối else.

Dưới đây là ví dụ minh họa lệnh if…else trong Python:

# trường hợp 1
var1 = 100
if var1 > 0
   print "1 - Nhan mot gia tri true"
   print var1
else
   print "1 - Nhan mot gia tri false"
   print var1

# trường hợp 2
var2 = 0
if var2 > 0
   print "2 - Nhan mot gia tri true"

else
   print "2 - Nhan mot gia tri false"

print "Good bye!"

Khi code trên được thực thi sẽ cho kết quả:

1 - Nhan mot gia tri true
2 - Nhan mot gia tri false
Good bye!

Trong ví dụ này ta thấy rằng var1 = 100 thỏa điều kiện if var1 > 0 => chạy tiếp khối lệnh trong if print "1 - Nhan mot gia tri true"

Xét tới trường hợp 2, đầu tiên xét điều kiện if var2 > 0= false (vì var2 = 0) => chương trình sẽ chạy tiếp dòng lệnh trong else print "2 - Nhan mot gia tri false"

Sau khi đã kết thúc các câu lệnh trong if else chạy dòng lệnh độc lập print "Good bye!"

Tham khảo việc làm Python Hà Nội

Lệnh elif trong Python là gì?

Lệnh elif trong Python là tên gọi vắn tắt của dòng lệnh if lồng nhau if…elif…else được dùng để kiểm tra nhiều điều kiện lồng nhau, nếu khối code so với điều kiện trong if trả về false thì, nó sẽ tiếp tục kiểm tra điều kiện thứ 2, 3, 4,… trong khối elif và cứ như vậy cho đến hết. Nếu tất cả các điều kiện trong elif đều sai nó sẽ thực thi khối lệnh của else.

else if python
Lệnh elif trong Python là gì?

Cú pháp của lệnh elif là:

if dieu_kien_if
   khoi_lenh_if
elif dieu_kien_1
   khoi_lenh_1
elif dieu_kien_2
   khoi_lenh_2
elif dieu_kien_3
   khoi_lenh_3
else
   khoi_lenh_else

Dưới đây là ví dụ của lệnh elif trong Python:

var = 100
if var == 200:
   print "1 - Nhan mot gia tri true"

elif var == 150:
   print "2 - Nhan mot gia tri true"
  
elif var == 100:
   print "3 - Nhan mot gia tri true"

else
   print "4 - Nhan mot gia tri false"

print "Good bye!"

Khi code trên được thực thi sẽ cho kết quả:

3 - Nhan mot gia tri true
Good bye!

Tương tự như các câu lệnh if ở phần trước, đầu tiên xét điều kiện var = 100 khác với điều kiện trong if var == 200=> chạy tiếp câu lệnh trong elif, trong ví dụ ta thấy có 2 dòng elif, chạy lần lượt đến khi thỏa mãn điều kiện của elif => chạy khối lệnh trong elif đó (trường hợp nếu có rất nhiều dòng lệnh elif thì khi chạy đến dòng lệnh đúng rồi thì chương trình sẽ thực hiện khối lệnh trong elif đó và dừng lại, không chạy tiếp các elif phía dưới).

Nếu chạy hết các elif rồi mà tất cả đều false thì sẽ chạy tới khối lệnh else
print "4 - Nhan mot gia tri false"
trong bài thì đã thỏa elif var == 100 nên kết quả chỉ có 3 - Nhan mot gia tri true

Lồng các lệnh if trong Python

Đôi khi có một tình huống là khi bạn muốn kiểm tra thêm một điều kiện khác sau khi một điều kiện đã được ước lượng là true. Trong tình huống như vậy, bạn có thể sử dụng các lệnh if lồng nhau trong Python.

Trong cấu trúc các lệnh if lồng nhau, bạn có thể có cấu trúc if…elif…else bên trong cấu trúc if…elif…else khác.

  Kiểu dữ liệu Boolean và toán tử logic AND, OR, NOT trong Python

Cú pháp của cấu trúc lồng các lệnh if như sau:

if bieu_thuc1:
   cac_lenh
   if bieu_thuc2:
      cac_lenh
   elif bieu_thuc3:
      cac_lenh
   else
      cac_lenh
elif bieu_thuc4:
   cac_lenh
else:
   cac_lenh

Dưới đây là ví dụ minh họa cho cấu trúc các lệnh if lồng nhau trong Python:

var = 100
if var < 200:
   print "Gia tri bieu thuc la nho hon 200"
   if var == 150:
      print "Do la 150"
   elif var == 100:
      print "Do la 100"
   elif var == 50:
      print "Do la 50"
elif var < 50:
   print "Gia tri bieu thuc la nho hon 50"
else:
   print "Khong tim thay bieu thuc true"

print "Good bye!"

Khi code trên được thực thi sẽ cho kết quả sau:

Gia tri bieu thuc la nho hon 200
Do la 100
Good bye!

Chúc các bạn thành công!

Nguồn bài viết tham khảo ucode.vn

Xem thêm việc làm công nghệ thông tin hấp dẫn trên TopDev

Những áp lực khi HỌC và LÀM IT [Lập Trình Viên]

Những áp lực khi HỌC và LÀM IT

Bài viết được sự cho phép của blogchiasekienthuc.com

Chào anh em, vẫn là những vấn đề xoay quanh tiền lương nhiều người thường nghĩ rằng làm IT lương cao, kỹ sư công nghệ thông tin lương có thể lên tới hàng ngàn đô mỗi tháng.

Đúng ! Là một người trong ngành mình công nhận điều đó, nếu xét về mức lương thì làm IT có thể nói là cao hơn rất nhiều so với mặt bằng chung.

Thế nhưng điều kiện là bạn phải có năng lực thực sự, hay nói cách khác là bạn phải thực sự nổi bật và kèm theo đó là một áp lực không hề nhỏ để có thể với tới mức lương ngàn đô.

Mọi người thường chỉ quan tâm đến kết quả mà không biết về những áp lực khi làm IT. Vì vậy mà trong bài viết này mình sẽ chia sẻ với anh em để anh em dễ hình dung hơn về những áp lực khi làm IT nhé.

  "Ngành IT này học rất dễ, tài liệu ko bao giờ thiếu. Quan trọng là phải có đam mê và chịu cày"
  10 Add-on Google Sheets phải có dành cho các Recruiters

#1. Áp lực về tiến độ

Vâng, tiến độ có lẽ là câu chuyện chung không chỉ cho mấy anh em học IT mà còn cho nhiều anh em làm trong các ngành nghề khác.

nhung-ap-luc-khi-hoc-va-lam-it-cong-nghe-thong-tin (1)

Trễ tiến độ sẽ bị đánh giá, trễ tiến độ sẽ bị sếp chửi, trễ tiến độ sẽ bị khách hàng mắng, trễ tiến độ sẽ ảnh hưởng tới bộ phận khác…

Có muôn vàn lý do để anh em làm IT nói riêng phải bằng mọi giá sao cho cho kịp tiến độ và từ đó khái niệm OT (Over Time) là hai từ quen thuộc, nó sẽ hằn sâu vào tiềm thức Nếu anh em đã và đang làm IT thì mình tin chắc là anh em sẽ biết điều này ^^

Nhiều lúc ở công ty, các bộ phận khác như (kế toán, sale…) về hết rồi nhưng mấy anh em IT vẫn phải ngồi lại, cặm cụi ôm cái máy tính để làm cho xong việc ⊙﹏⊙

Rồi có những dự án gấp gáp quá, có khi anh em phải kéo nhau đi làm cả thứ bảy, chủ nhật để cho kịp tiến độ, còn bàn giao cho khách hàng.

Đặc biệt là anh em nào làm outsource cho các tập đoàn lớn hoặc các đối tác khó tính như khách hàng Nhật Bản thì việc làm sao kịp tiến độ là vô cùng quan trọng, nếu không muốn bị sếp chửi SML.

#2. Áp lực về chất lượng mã nguồn

nhung-ap-luc-khi-hoc-va-lam-it-cong-nghe-thong-tin (1)

Có những lúc lập trình viên phải code làm sao cho kịp tiến độ, trong khi chỉ còn có ít ngày nữa là đến hạn bàn giao rồi.

Câu chuyện đáng nói là, nếu chỉ còn ít thời gian như vậy thì liệu lập trình viên có đảm bảo được chất lượng mã nguồn code hay không?

Bình thường sẽ có bước review và đánh giá chất lượng mã nguồn nếu như chúng ta làm theo đúng quy trình trước khi bàn giao cho khách hàng. Nhưng bước này thường bị bỏ đi nếu dự án đã quá gấp.

Trong khi đội ngũ kiểm thử (tester) thường chỉ test được trên giao diện và kiểm tra xem dữ liệu có được lưu đúng, hay thay đổi đúng không… chứ rất khó để kiểm tra được cả chất lượng mã nguồn.

Một số công ty có áp dụng các công nghệ quét tự động để kiểm tra chất lượng mã nguồn, nhưng về cơ bản thì nó chỉ đảm bảo ở mức tương đối mà thôi.

Tất cả vẫn phụ thuộc vào việc lập trình viên viết như thế nào để đảm bảo chất lượng mã nguồn là tốt nhất (dễ bảo trì, dễ mở rộng sau này).

#3. Áp lực về sự nhàm chán

“Chán” đối với lập trình viên có thể xuất phát từ rất nhiều nguyên nhân khác nhau trong quá trình làm việc.

nhung-ap-luc-khi-hoc-va-lam-it-cong-nghe-thong-tin (2)

Đơn cử nhất có hai trường hợp đó là gặp vấn đề khó quá mãi không nghĩ ra cách giải quyết, hai nữa là có quá nhiều vấn đề cần giải quyết, mãi không hết việc.

Thực ra thì việc giải quyết vấn đề chính là trách nhiệm và cũng là công việc của lập trình viên, thế nhưng nếu vấn đề đó quá khó hoặc quá nhiều và lặp đi lặp đi thì đôi khi sẽ gây nên sự nhàm chán.

Trường hợp gặp vấn đề khó thì đối với nhiều anh em, đôi khi đây lại là cơ hội tốt để có thể thể hiện khả năng của mình, nhưng đối với nhiều bạn thì nó lại gây nên sự ức chế, chán.

Tất nhiên, để trở nên nổi bật hơn thì anh em cần phải tìm cho ra cách giải quyết vấn đề đó, thay vì cảm giác chán nản, bỏ dở giữa chừng (không biết thì có thể đi hỏi mà, làm miết rồi cũng ra thôi).

Còn việc gặp nhiều vấn đề nhỏ mà nó cứ lặp đi lặp lại thì anh em phải chấp nhận thôi. Đôi khi đây lại là “đặc sản” của mấy anh em làm IT khi làm các dự có cấu trúc chưa tốt.

#4. Áp lực trong việc trau dồi kiến thức mới

nhung-ap-luc-khi-hoc-va-lam-it-cong-nghe-thong-tin (3)

Ngành khác thì mình không rõ lắm về các tiêu chí đánh giá như thế nào, nhưng khi đã làm IT thì bắt buộc anh em phải có năng lực thực sự.

Năng lực tới đâu, lương tương tới đó. Mà muốn năng lực tăng thì phải không ngừng trau dồi kiến thức và công nghệ mới.

Nhưng khi làm thì anh em sẽ hiểu được một điều, đó là quỹ thời gian của anh em nó sẽ bị co lại nhiều như thế nào. Mỗi ngày mặc định có 8 tiếng làm việc trên công ty rồi, nếu anh em nào chăm chỉ (do OT mà ra ) thì có khi làm cả đêm nữa.

Vậy thời gian đâu để anh em học hỏi thêm kiến thức mới và công nghệ mới nữa? Thực ra thì nếu biết cách thu xếp thời gian hợp lý thì anh em vẫn có thể bố trí được thôi, nhưng buộc anh em phải “cày” trâu hơn, không khác được.

Bạn thử nghĩ mà xem, đi làm về là “oải” rồi, lại còn ngồi học cái mớ kiến thức mới nữa thì đôi khi rất áp lực và mệt mỏi thực sự !

Nhưng có làm thì mới có ăn mà đúng không, nếu anh em muốn nâng cao trình độ thì buộc anh em phải cố gắng hơn người khác thôi. Làm gì có gì dễ dàng đâu, dễ dàng thì thu nhập làng nhàng vậy thôi

#5. Áp lực từ cấp trên

nhung-ap-luc-khi-hoc-va-lam-it-cong-nghe-thong-tin (4)

Mình từng làm ở một công ty outsource cho Nhật, sếp tuy là người Việt nhưng sống ở Nhật lâu năm nên anh em cứ coi như là người Nhật luôn cũng được

Sáng nào đến sếp cũng kiểm tra tiến độ, soi từng ông một xem làm tới đâu rồi. Nhất là mấy ông Leader ngày nào cũng bị gõ đầu ép tiến độ.

Mình hiểu là làm việc với người Nhật thì buộc phải chấp nhận như vậy, vì để trễ tiến độ một lần thôi sẽ bị mất uy tín, lần sau có thể họ sẽ không thuê mình nữa.

Nhưng ngược lại, nhân viên (lập trình viên) đôi khi lại cảm thấy bị áp lực. Rõ ràng có những lúc đã rất cố gắng rồi, nhưng vẫn bị trễ tiến độ. Trong khi đó, sếp lại cứ lôi mình ra nói này nói nọ… bạn hiểu cảm giác đó chứ !

Mỗi một môi trường đều có những áp lực khác nhau, chỉ khi có áp lực thì chúng ta mới tiến bộ được. Nhưng cá nhân mình thì nghĩ, sếp không nên quá tạo áp lực cho nhân viên (một cách cứng nhắc) như vậy.

Làm sao để họ tự nhận thức được trách nhiệm công việc, làm việc có kế hoạch và hoàn thành kịp tiến độ thay vì ép tiến độ quá mức như vậy .

#6. Lời kết

Minh xin chốt lại vấn đề: Áp lực là một phần của thành công các bạn à, có áp lực thì chúng ta mới trưởng thành và khôn ra được.

Với lập trình viên nói riêng thì áp lực đến từ nhiều phía, nhưng tựu chung lại thì đó như là một phần của công việc, mà anh em buộc phải đối diện và vượt qua nó.

Xin chào và hẹn gặp lại anh em trong các bài viết tiếp theo của mình nhé !

Nguyễn Đức Cảnh – Bài viết gốc tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev

Có nên tin các bài test tính cách? Định hướng nghề nghiệp?

test tính cách

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

MBTI, DISC, The Big Five Personalities Test (5 khía cạnh tính cách cơ bản); 7 loại trí thông minh, Holland code test; test phân loại thiên hướng…

MBTI có vẻ nổi nhất, 1 bài test dài, sau đó sẽ phân loại vào 1 trong 16 nhóm người…

Tôi cũng đã từng làm, thấy vừa đúng vừa sai.

Nó đúng vì nó được 1 nhà khoa học phát triển lên, kiểm chứng qua nhiều trường hợp rồi. Nhưng mà rồi cũng chỉ vậy thôi. Bạn sẽ thấy vào trường hợp nào thì cũng sẽ có phần đúng, mà lại không hoàn toàn đúng!

Tại sao cần test?

Nếu bạn đang có thời gian, đang mất phương hướng, cần sự lựa chọn, thì hãy làm 1 bài, 1 vài bài xem sao. Nhưng mà phải làm trung thực, và tốt nhất là có 1 chuyên gia hỗ trợ cho bạn.

Còn nếu bạn đang học đại học chuyên ngành rồi, bạn đang có công việc rồi, bạn cũng không còn trẻ nữa, nói tóm lại, bạn hơi khó để có thể hướng nghiệp lại từ đầu như mấy cháu học sinh.

Thì cái bạn cần, là bạn phải tin vào bản thân mình.

Từ nhỏ bạn thích văn thơ, báo chí, nhưng bố mẹ bạn bắt bạn làm kế toán thống kê. Bạn không thích kế toán, nhưng bạn làm lâu lâu rồi, quen quen rồi, giờ vẫn làm. Thậm chí bạn hơi có tuổi rồi, bạn còn phải nuôi con, bạn không thể bỏ nghề kế toán đi làm thơ, viết báo được. Bạn test tính cách thì ra INFP.

Vậy rồi bạn làm sao, bỏ kế toán đi theo ngành báo, hay dẹp việc yêu thích đó lại.

Đâu là lựa chọn?

Câu trả lời thì tôi không biết, nhưng mà nếu bạn bỏ được công việc, thì bỏ đi, chuyển ngành khác. nếu không bỏ được, thì bạn hãy master ngành đó đi, từ đó bạn có thể chọn công việc, chọn cách làm việc theo ý mình. Bạn hãy giỏi chuyên môn, tạo mối quan hệ trong ngành kế toán, rồi làm tư vấn, tài chính, cố vấn, đào tạo, viết bài luận về kế toán tài chính đăng lên báo, tạp chí…cũng liên quan đến ngành văn, ngành báo của bạn mà.

Đừng nói với tôi, nói thì dễ, làm thì khó.

Tất nhiên là thế rồi, bạn nói câu đó là bạn chưa làm được.

  04 Điều Cần Chú Ý Cho Người Mới Làm Automation Test
  A/B testing và những tiêu chí chính để đánh giá sự thành công của ASO

Cũng trường hợp khác, ngành kỹ thuật. Bạn không biết mình thích gì, rồi bạn vào Bách khoa, do sức học tốt, do trường top, do oai oai vì khu nhà bạn có 1,2 người vào được đó thôi.

Và vào đó, nát như tương, bạn oải mấy môn khoa học cơ bản, đến chuyên ngành còn chán nữa. Bạn không thích kỹ thuật, bạn thích kinh doanh hơn chẳng hạn. Thì hoặc bỏ học sang học kinh tế.

Nhưng tôi có 1 giải pháp hay hơn cho bạn, bạn cứ học tốt ngành kỹ thuật đó đi, ra trường làm sale kỹ thuật. Quá tuyệt vời luôn. Sale kỹ thuật, vừa có kỹ năng sale, vừa có chuyên môn, khoa học logic, không chém gió vớ vẩn @@

Lời kết

Có nhiều sự lựa chọn công việc trong các ngành mà bạn đang học, đang làm lắm, hãy dành thời gian cho nó, bạn sẽ tìm được công việc đúng với cả đam mê, sở thích, năng lực hiện tại của mình, cho dù ở trong 1 lĩnh vực bạn không yêu thích.

Nhiều công việc đến tôi nghe còn lạ lẫm, không định hình được nó là gì, làm gì luôn, nhưng nó thú vị, với người đặt tâm sức vào đó.

Tác giả: Vân D

Nguồn: Tư vấn hướng nghiệp & tạo động lực

Ngoài ra, bạn có thể tham khảo thêm Bài test tính cách trong công việc – Workplace Personality Test do Saramin x TopDev phát triển để đánh giá tổng quan về tính cách của bản thân và sự phù hợp với môi trường công việc ngành CNTT.

Bài viết được đăng tải tại kinhnghiemlaptrinh.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Điều khiển luồng trong Python

Điều khiển luồng trong Python

Bài viết được sự cho phép của tác giả Nguyễn Chí Thức

Các bạn cũng đã khá quen thuộc với các lệnh điều khiển luồng trong C, C++ như if, if else, … Chương này sẽ trình bày về các lệnh điều khiển luồng trong Python.

Ngôn ngữ lập trình Python coi các giá trị khác null và khác 0 là true, và coi các giá trị là null hoặc 0 là false.

Trong bài này chúng ta cùng tìm hiểu các lệnh điều khiển luồng trong Python:

Lệnh if trong Python

Lệnh if trong Python là giống như trong ngôn ngữ C. Lệnh này được sử dụng để kiểm tra một điều kiện, nếu điều kiện là true thì lệnh của khối if sẽ được thực thi, nếu không nó sẽ bị bỏ qua.

  Khởi Đầu Dự Án Python Như Thế Nào Để Thuận Tiện Phát Triển Lên

Lệnh if…else trong Python

Một lệnh else có thể được sử dụng kết hợp với lệnh if. Một lệnh else chứa khối code mà thực thi nếu biểu thức điều kiện trong lệnh if được ước lượng là 0 hoặc một giá trị false. Lệnh else là lệnh tùy ý và chỉ có duy nhất một lệnh else sau lệnh if.

Xem thêm tuyển dụng python lương cao cho bạn

Lồng các lệnh if trong Python

Đôi khi có một tình huống là khi bạn muốn kiểm tra thêm một điều kiện khác sau khi một điều kiện đã được ước lượng là true. Trong tình huống như vậy, bạn có thể sử dụng các lệnh if lồng nhau trong Python.

Trong cấu trúc các lệnh if lồng nhau, bạn có thể có cấu trúc if…elif…else bên trong cấu trúc if…elif…else khác.

  Python free variable

Trường hợp các Suite lệnh đơn

Bạn đã tìm hiểu về suite trong chương Cú pháp cơ bản. Nếu suite của một mệnh đề if chỉ bao gồm một dòng lệnh đơn, thì nó có thể ở trên cùng một dòng như là header của lệnh.

Dưới đây là ví dụ đơn giản về một mệnh đề if một dòng:

var = 6677028

if ( var  == 6677028 ) : print "Gia tri cua bieu thuc la 6677028"

print "Wellcome to uCode!"

Khi code trên được thực thi sẽ cho kết quả:

Gia tri cua bieu thuc la 6677028
Wellcome to uCode!

Các bài viết tiếp theo tôi sẽ giúp các bạn tìm hiểu kĩ hơn về từng lệnh trong python. Chúc các bạn học tốt!

Bài viết gốc được đăng tải tại ucode.vn

Có thể bạn quan tâm:

Xem thêm việc làm it HCM, đà nẵng, hà nội hấp dẫn trên TopDev