Bài viết được sự cho phép của tác giả Nguyễn Chí Thức
Trong bài Python này bạn sẽ học về biến toàn cục (global), biến cục bộ (local), biến nonlocal trong Python và trường hợp sử dụng các biến này.
Biến toàn cục trong Python
Trong ngôn ngữ lập trình Python, một biến được khai báo bên ngoài hàm hoặc trong phạm vi toàn cục được gọi là biến toàn cục hay biến global. Biến toàn cục có thể được truy cập từ bên trong hoặc bên ngoài hàm.
Hãy xem ví dụ về cách tạo biến toàn cục trong Python.
x = "Biến toàn cục"#khai báo biến x#Gọi x từ trong hàm vidu()defvidu():
print("x trong hàm vidu() :", x)
vidu()
#Gọi x ngoài hàm vidu()
print("x ngoài hàm vidu():", x)
Trong ví dụ trên, ta khai báo biến x là biến toàn cục, và định nghĩa hàm vidu() để in biến x. Cuối cùng ta gọi hàm vidu() để in giá trị của biến x. Chạy code trên ta sẽ được kết quả là:
x trong hàm vidu(): Biến toàn cục
x ngoài hàm vidu(): Biến toàn cục
Chuyện gì sẽ xảy ra nếu bạn thay đổi giá trị của x trong hàm?
x = 2defvidu():
x=x*2
print(x)
vidu()
Nếu chạy code này bạn sẽ nhận được thông báo lỗi:
UnboundLocalError: local variable 'x' referenced before assignment
Lỗi này xuất hiện là do Python xử lý x như một biến cục bộ và x không được định nghĩa trong vidu().
Để thay đổi biến toàn cục trong một hàm bạn sẽ phải sử dụng từ khóa global. Chúng tôi sẽ nói kỹ hơn trong bài về từ khóa global.
Ở đây, chúng ta sẽ học cách dùng biến cục bộ và toàn cục trong cùng một code.
x = 2defvidu():global x
y = "Biến cục bộ"
x = x * 2
print(x)
print(y)
#Viết bởi uCode.vn
vidu()
Chạy code trên ta sẽ có đầu ra:
4
Biến cục bộ
Trong code trên, chúng ta khai báo x là biến toàn cục và y là biến cục bộ trong vidu() và dùng toán tử * để thay đổi biến toàn cục và in cả giá trị của x và y. Sau khi gọi hàm vidu() giá trị của x sẽ thành 4 vì được nhân đôi.
Ví dụ sử dụng biến toàn cục và cục bộ trùng tên:
x = 5defvidu():
x = 10
print("Biến x cục bộ:", x)
vidu()
print("Biến x toàn cục:", x)
Sau khi chạy code trên ta có đầu ra:
Biến x cục bộ: 10
Biến x toàn cục: 5
Trong code trên, chúng ta sử dụng cùng tên x cho cả biến cục bộ và biến toàn cục. Khi in cùng biến x chúng ta nhận được hai kết quả khác nhau vì biến được khai báo ở cả hai phạm vi, cục bộ (bên trong hàm vidu()) và toàn cục (bên ngoài hàm vidu()).
Khi chúng ta in biến trong hàm vidu() nó sẽ xuất ra Biến x cục bộ: 10, đây được gọi là phạm vi cục bộ của biến. Tương tự khi ta in biến bên ngoài hàm vidu() sẽ cho ra Biến x toàn cục: 5, đây là phạm vi toàn cục của biến.
Từ nonlocal này mình không biết dịch sang tiếng Việt sao cho chuẩn. Trong Python, biến nonlocal được sử dụng trong hàm lồng nhau nơi mà phạm vi cục bộ không được định nghĩa. Nói dễ hiểu thì biến nonlocal không phải biến local, không phải biến global, bạn khai báo một biến là nonlocal khi muốn sử dụng nó ở phạm vi rộng hơn local, nhưng chưa đến mức global.
Để khai báo biến nonlocal ta cần dùng đến từ khóa nonlocal.
Ví dụ:
defham_ngoai():
x = "Biến cục bộ"defham_trong():nonlocal x
x = "Biến nonlocal"
print("Bên trong:", x)
ham_trong()
print("Bên ngoài:", x)
hamngoai()
Chạy code trên bạn sẽ có đầu ra:
Bên trong: Biến nonlocal
Bên ngoài: Biến nonlocal
Trong code trên có một hàm lồng là ham_trong(), ta dùng từ khóa nonlocal để tạo biến nonlocal. Hàm ham_trong() được định nghĩa trong phạm vi của ham_ngoai().
Lưu ý: Nếu chúng ta thay đổi giá trị của biến nonlocal, sự thay đổi sẽ xuất hiện trong biến cục bộ.
Bài viết được sự cho phép của tác giả Nguyễn Hữu Đồng
Trước khi nói tới heap, hãy nhớ lại kiến thức cây nhị phân
Cây nhị phân là một cây, mỗi nút trên cây có tối đa hai nhánh con, nút thứ i sẽ có 2 con là 2i và 2i+1.
Cây nhị phân
Heap là một câu trúc cây nhị phân đầy đủ, mỗi nút trên cây đều chứa một nhãn có độ ưu tiên cao hơn các con của nó, nút gốc (root) là nút có độ ưu tiên cao nhất. Ví dụ heap min là cây là mọi con của nút i đều có giá trị >= heap[i], heap max thì mọi nút con đều nhỏ hơn nút cha.
Heap nhị phân được ứng dụng rộng rãi dùng để cài đặt một hàng đợi ưu tiên, hay là trong thuật toán Distra tìm đường đi ngắn nhất, và trong bài này ta sẽ sử dụng Binary Heap để sắp xếp mảng.
Các thao tác thường dùng trên Heap là
Tìm nút có độ ưu tiên cao nhất
Thêm một nút vào heap
Xóa bỏ nút gốc, nút có độ ưu tiên cao nhất.
Xây dựng heap từ tập có n phần tử
Để tìm nút có độ ưu tiên cao nhất, ta chỉ cần lấy nút gốc.
Để thêm một nút vào heap
Nếu heap rỗng thì ta chỉ cần thay gốc bằng nút đó
Nếu heap không rỗng
Chọn vị trí để thêm nút.
Giả sử heap có độ cao là h, và mọi nút ở độ cao h-1 có một nút nào đó chưa đủ 2 con (tổng số nút ở độ cao đó < 2^h) — thì gắn nút vào phía bên phải của nút ngoài cùng
Nếu ở độ cao h đã đầy đủ nút thì thêm nút vào độ cao h+1
Tiến hành vun đống nút dưới lên, nếu nút cha có độ ưu tiên thấp hơn nút con thì tiến hành đổi chỗ nút con và nút cha, sau đó lại xét tiếp nút cha đó cho tới khi nào thỏa mãn nút cha có độ ưu tiên hơn nút chon hoặc nút đang xét là nút cha thì thôi.
Để xóa nút gốc
Nếu cây đó chỉ có 1 nút thì chỉ xóa nút đó
Nếu cây có nhiều hơn 1 nút là tiến hành lấy nút dưới dùng bên phải thế vào nút gốc sau đó tiến hành quá trình down heap.
Quá trình down heap, so sánh độ ưu tiên với cả hai nút con(nếu có) , nếu độ ưu tiên thấp hơn 1 trong 2 nút con hoặc thấp hơn cả hai nút con thì tiến hành chọn nút có độ ưu tiên cao nhất trong 2 nút con và đổi vị trị với nó, cho tới khi nào nút đang xét là nút lá ( không có nút con)
Độ phức tạp.
Thao tác lấy nút gốc O(1)
Thao tác thêm nút mới vào cây O(log N)
Thao tác xóa nút gốc : Tổng O(log N)
Thao tác xóa nút gốc O(1)
Thao tác down heap O(log N)
Áp dụng tính chất của Heap để sắp xếp
Trong phần này mình sẽ triển khai thuật toán sắp xếp nhanh bằng cách sử dụng tính chất, nút gốc là nút có độ ưu tiên cao nhất, mình sẽ xây dựng một heap từ mảng a có n phần tử sau đó, lấy lần lượt các phần tử trong heap ra thì mình có có các giá trị lấy ra có độ ưu tiên giảm dần.
Ngôn ngữ thực hiện. : Go
Cấu trúc Heap : struct Heap có field Leng, là độ dài của Heap và field Value là giá trị của các phần tử trong heap.
type Heap struct {
Leng int
Value []int
}
Thao tác khởi tạo Heap : Mình sẽ xây dựng heap Min thiết lập Leng = 0, heap rỗng
Thao tác thêm một phần tử vào Heap : Thêm vào và sau đó vun đống từ dưới lên qua function UpHeap.
func (h *Heap) Insert(x int) *Heap {
h.Leng++
h.Value[h.Leng] = x
h.UpHeap(h.Leng)
return h
}
Thao tác UpHeap
func (h *Heap) UpHeap(i int) *Heap {
if (i == 1) || (h.Value[int(math.Floor(float64(i)/2))] <= h.Value[i]) {
return h
}
t := h.Value[i]
h.Value[i] = h.Value[int(math.Floor(float64(i)/2))]
h.Value[int(math.Floor(float64(i)/2))] = t
h.UpHeap(int(math.Floor(float64(i) / 2)))
return h
}
Thao tác xóa nút gốc : Sau khi loại bỏ nút gốc, ta lấy phần tử ngoài cùng ở độ cao cao nhất thế vào nút gốc sau đó thực hiện quá trình DownHeap từ nút gốc
func (h *Heap) RemoveRoot() *Heap {
h.Value[1] = h.Value[h.Leng]
h.Leng--
if h.Leng > 1 {
h.DownHeap(1)
}
return h
}
Thao tác DownHeap
func (h *Heap) DownHeap(i int) *Heap {
m := i * 2
if m > h.Leng {
return h
}
if h.Value[m] > h.Value[m+1] {
m++
}
if h.Value[m] < h.Value[i] {
t := h.Value[m]
h.Value[m] = h.Value[i]
h.Value[i] = t
h.DownHeap(m)
return h
}
return h
}
Hàm Main : Tạo mảng a sau đó đẩy mỗi phần tử của a vào Heap, sau đó lấy trong heap ra dần dần ta có kết quả theo độ ưu tiên giảm giần
func main() {
a := []int{8, 6, 4, 5, 7, 9, 2, 3, 2, 2, 6, 3, 6, 3, 6, 123, 6541, 3, 6, 3, 461, 35, 2}
for _, v := range a {
h.Insert(v)
}
for i := 1; i <= len(a); i++ {
fmt.Print(h.Value[1],)
h.RemoveRoot()
}
}
package main
import (
"fmt"
"math"
)
type Heap struct {
Leng int
Value []int
}
var h Heap
const nMax = 10000
const maxValue = 100000000
func init() {
h.Leng = 0
h.Value = make([]int, nMax+1, nMax+1)
}
func (h *Heap) Insert(x int) *Heap {
h.Leng++
h.Value[h.Leng] = x
h.UpHeap(h.Leng)
return h
}
func (h *Heap) UpHeap(i int) *Heap {
if (i == 1) || (h.Value[int(math.Floor(float64(i)/2))] <= h.Value[i]) {
return h
}
t := h.Value[i]
h.Value[i] = h.Value[int(math.Floor(float64(i)/2))]
h.Value[int(math.Floor(float64(i)/2))] = t
h.UpHeap(int(math.Floor(float64(i) / 2)))
return h
}
func (h *Heap) DownHeap(i int) *Heap {
m := i * 2
if m > h.Leng {
return h
}
if h.Value[m] > h.Value[m+1] {
m++
}
if h.Value[m] < h.Value[i] {
t := h.Value[m]
h.Value[m] = h.Value[i]
h.Value[i] = t
h.DownHeap(m)
return h
}
return h
}
func (h *Heap) RemoveRoot() *Heap {
h.Value[1] = h.Value[h.Leng]
h.Leng--
if h.Leng > 1 {
h.DownHeap(1)
}
return h
}
func main() {
a := []int{8, 6, 4, 5, 7, 9, 2, 3, 2, 2, 6, 3, 6, 3, 6, 123, 6541, 3, 6, 3, 461, 35, 2}
for _, v := range a {
h.Insert(v)
}
for i := 1; i <= len(a); i++ {
fmt.Print(h.Value[1], " ")
h.RemoveRoot()
}
}
Thuật toán Heap Sort ứng dụng tính chất khá đơn giản của Heap nhưng nếu là mình khi sort thì mình khi sort mình sẽ sử dụng QuickSort để hạn chế việc mất đi một mớ mem cho cái heap.
Mình sẽ thực hiện tiếp Quick Sort trong phần sau của bài, cảm ơn các bạn đã đọc 😀
Bài viết được sự cho phép của BBT Kinh nghiệm lập trình
Chào các bạn, hôm nay mình xin chia sẻ 1 mẹo nhỏ trong PHP: Destroy session_id của user khác từ server.
Tại sao cần làm việc này?
Bài toán đặt ra: Tại một thời điểm, chỉ cho phép người dùng có duy nhất 1 phiên đăng nhập trên hệ thống.
Mô tả chi tiết: Thực tế hiện tay rất nhiều hệ thống web ứng dụng bán license theo số lượng tài khoản sử dụng. Do vậy, nếu không có biện pháp ngăn chặn việc người dùng sử dụng chung tài khoản để làm việc trên hệ thống thì việc thất thoát doanh thu là khó tránh khỏi. Chính vì thế, hệ thống cần có phương án để ngăn chặn việc này, tại một thời điểm, chỉ cho phép người dùng có 1 phiên đăng nhập trên 1 thiết bị và thao tác trên hệ thống.
Cách thực hiện trên với PHP?
Mình sẽ nói tóm tắt các bước thực hiện, logic này có thể áp dụng tương tự với ngôn ngữ khác. Mục đích là sử dụng tài khoản hiện tại, để destroy session id khác trên server.
Bước 1:Commit session ID nếu nó đã tồn tại
Bước 2: Store current session id
Bước 3: Destroy session specified
Bước 4: Restore current session id
Ứng tuyển ngay các vị trí PHP tuyển dụng mới nhất trên TopDev
Code demo!
<?php
$session_id_to_destroy = ‘nill2if998vhplq9f3pj08vjb1’; // 1. commit session if it’s started. if (session_id()) { session_commit();
}
// 2. store current session id session_start(); $current_session_id = session_id(); session_commit();
// 4. restore current session id. If don’t restore it, your current session will refer to the session you just destroyed! session_id($current_session_id); session_start(); session_commit();
?>
Xong, một mẹo khá nhỏ nhưng đôi khi lại rất cần thiết cho hệ thống của bạn. Chúc các bạn áp dụng thành công!
Bài viết được sự cho phép của tác giả Phạm Văn Nguyên
Trong Python hoặc bất kỳ ngôn ngữ lập trình nào khác, đôi khi bạn muốn thêm thời gian trễ trong chương trình của mình trước khi bạn tiếp tục đến phần tiếp theo của mã.
Nếu đây là những gì bạn muốn làm, thì bạn nên sử dụng chức năng sleep từ module time .
Đầu tiên, tôi sẽ bắt đầu bằng cách thảo luận về cách sử dụng chức năng sleep của Python . Sau đó tôi sẽ nói nhiều hơn về một số câu hỏi thường gặp và cách thức thực hiện của function(hàm) sleep.
Hàm sleep
Giống như tôi đã đề cập, Sleep là một hàm tích hợp Python trong mô-đun time .
Vì vậy, để sử hàm sleep , bạn sẽ cần import module time trước.
Hàm sleep có một đối số là khoảng thời gian tính bằng giây mà bạn dừng.
Sử dụng hàn sleep trong Python 2 và Python 3 hoàn toàn giống nhau, vì vậy bạn sẽ không cần phải lo lắng về phiên bản Python nào mà mã của bạn đang chạy.
Nó thực sự rất đơn giản và dễ hiểu. Chúng ta hãy đi qua một số ví dụ.
Nhưng dù bằng cách nào, bạn có thể nghĩ về Cuộc gọi hệ thống như một API hoặc giao diện mà HĐH cung cấp cho các chương trình không gian người dùng để tương tác với HĐH.
Vậy HĐH sẽ làm gì khi nhận được System call sleep?
Về cơ bản, hệ điều hành sẽ làm là nó sẽ tạm dừng quá trình (chương trình của bạn) được lên lịch trên CPU trong khoảng thời gian mà bạn đã chỉ định.
Lưu ý rằng điều này hoàn toàn khác với việc thêm độ trễ bằng cách sử dụng vòng lặp giả không làm gì cả (đó là điều bạn KHÔNG BAO GIỜ nên làm).
Trong trường hợp giả cho vòng lặp, quy trình của bạn thực sự vẫn đang chạy trên CPU.
Nhưng trong trường hợp Sleep () , quy trình của bạn sẽ không hoạt động trong một thời gian cho đến khi HĐH bắt đầu lập lịch lại trên CPU.
Bài viết được sự cho phép của tác giả Trần Hữu Cương
Constructor Declarations
Trong Java, các đối tượng được khởi tạo thông qua hàm khởi tạo (constructor). Mỗi lần bạn tạo mới một đối tượng sẽ có ít nhất một hàm khởi tạo được thực thi.
Mỗi class đều có một hàm khởi tạo, nếu bạn không khai báo thì complier sẽ tự động khai báo một hàm khởi tạo không tham số cho bạn.
Có rất nhiều nguyên tắc khác nhau liên quan đến hàm khởi tạo (sẽ tìm hiểu ở bài sau). Ở bài này chúng ta sẽ chỉ tập trung vào các nguyên tắc khai báo cơ bản.
Hàm khởi tạo cũng được coi như một hàm với kiểu dữ liệu trả về của hàm khởi tạo chính là một thể hiện của class chứa nó. Hàm khởi tạo có thể đi kèm với các access modifier
voidPerson(){} // đây là một method, không khải constructorstaticPerson(){} // không thể đi kèm với từ khóa staticfinalPerson(){} // không thể đi kèm với từ khóa finalabstractPerson(){} // không thể đi kèm với từ khóa abstract
Một class có thể có nhiều hàm khởi tạo (tương tự như một class có thể có nhiều hàm cùng tên – tính đa hình) nhưng tham số đầu vào của các hàm khởi tạo phải khác nhau.
Khi bạn gọi lệnh new thì đầu tiên nó sẽ chạy vào hàm khởi tạo của đối tượng rồi sau đấy mới chạy các khối static, method…
Bài viết được sự cho phép của tác giả Kien Dang Chung
Trong những website lớn, các phần tìm kiếm hay nhập liệu rất cần những tính năng thông minh như gợi ý dựa trên các từ nhập vào, nó giúp cho nâng cao trải nghiệm người dùng, giúp tìm kiếm và nhập liệu trở lên đơn giản hơn. Google là một minh chứng không cần phải bàn cãi cho vấn đề này. Những năm đầu của thế kỉ 21, Google xuất hiện với chỉ duy nhất một ô tìm kiếm và tính năng gợi ý ngay lập tức khi từ khóa được đánh vào, nó đã giúp người dùng định hướng được ngay khi chỉ gõ vào 1-2 từ trong từ khóa.
Ở thời điểm đó, gợi ý khi tìm kiếm là một tính năng phức tạp và xa xỉ, nhưng khi công nghệ phần mềm phát triển, đặc biệt với phần mềm mã nguồn mở, những tính năng như vậy thật đơn giản để thực hiện. Bài viết này sẽ hướng dẫn bạn thực hiện các tìm kiếm thông minh hay gợi ý nhập liệu sử dụng thư viện Typeahead là một gói phần mềm mã nguồn mở của Twitter trong các ứng dụng Laravel.
Trong bài viết này chúng ta sẽ thực hiện một ví dụ tìm kiếm thông minh thông tin khách hàng bằng cách tạo ra dữ liệu mẫu khoảng 10,000 khách hàng. Như bạn thấy khi tìm kiếm hệ thống sẽ gợi ý các bản ghi trong database rất nhanh giúp người dùng có thể lựa chọn luôn chính xác người dùng. Typeahead sử dụng kết hợp Bloodhound cho tốc độ rất nhanh mặc dù dữ liệu là 10k bản ghi.
1. Giới thiệu về Typeahead
Typeahead.js là một thư viện Javascript rất linh hoạt, nó có thể làm nền tảng tốt để xây dựng các tính năng tìm kiếm gợi ý thông minh. Typeahead bao gồm hai thành phần: Typeahead: Phần chuyên xử lý giao diện người dùng
Hiển thị gợi ý đến người dùng ngay khi họ nhập liệu
Hiển thị các gợi ý ngay trên ô nhập liệu
Hỗ trợ các tùy chỉnh giao diện linh hoạt
Highlight các từ khóa trùng khớp trong phần gợi ý
Kích hoạt các sự kiện tùy chỉnh cho phép mở rộng các xử lý
Bloodhound: Bộ máy gợi ý nâng cao
Cho phép các dữ liệu được hardcode
Lấy dữ liệu từ trước để giảm độ trễ khi gợi ý
Sử dụng Local Storage giảm số lượng các request đến máy chủ.
Sử dụng rate limit và bộ đệm cho các request đến máy chủ làm giảm nhẹ tải dữ liệu
Bộ máy gợi ý Bloodhound sẽ được sử dụng để tính toán kết quả với các truy vấn cho trước và Typeahead sẽ sử dụng để render ra mã HTML. Cả hai thành phần này là độc lập, trong bài viết này chúng ta sẽ sử dụng cả hai để xây dựng công cụ tìm kiếm gợi ý thông minh.
1.1 Cài đặt Typeahead
Trước khi đi vào sử dụng Typeahead chúng ta cần cài đặt gói thư viện này, có ba cách thức để cài đặt.
Sử dụng npm
npm i typeahead
Tải gói thư viện dạng file zip
Vào đường dẫn Github của Typeahead chọn Clone or download và click vào Download zip. Giải nén ra chúng ta sẽ thấy trong thư mục dist có những file như sau:
bloodhound.js (chỉ có thành phần Bloodhound).
typeahead.bundle.js (Bao gồm cả Typeahead và Bloodhound).
typeahead.jquery.js (chỉ có thành phần Typeahead).
Các file có thêm min.js là các file được tối ưu hóa dung lượng.
Chú ý: Typeahead yêu cầu jquery phiên bản từ 1.9 trở lên. Trong bài viết này chúng ta sẽ sử dụng cách thứ ba cho nhanh, với dự án lớn nên sử dụng cách 1 để tối ưu hóa các tài nguyên với Laravel Mix.
1.2 Khởi tạo Typeahead
Typeahead có nhiều cách khởi tạo và sau đây là cách khởi tạo hay dùng nhất jQuery#typeahead(options, [*datasets]). Tính năng typeahead được áp dụng cho các input dạng text input[type=”text”] có hai tham số cho khởi tạo: options là các tùy chọn cấu hình, một số giá trị cần quan tâm như sau:
highlight: thêm thẻ <strong> vào các từ trùng khớp trong phần gợi ý. Mặc định là false.
hint: hiển thị cả từ gợi ý trong ô nhập liệu, mặc định true.
minLength: Số ký tự tối thiểu cần nhập khi tính năng gợi ý được bắt đầu, mặc định là 1.
classNames: Cho phép sử dụng tên class khác với mặc định.
dataset: một typeahead có thể có nhiều dataset, ví dụ khi bạn tìm kiếm trong một trang bán hàng có thể trả về gợi ý cho cả sản phẩm và các tin tức liên quan đến sản phẩm. Các dataset có một số các tùy chọn cấu hình như sau:
name: tên của dataset.
source: nguồn dữ liệu dùng cho gợi ý, có thể là một instance của Bloodhound, như ở phần đầu chúng ta có nói Typeahead chỉ xử lý giao diện người dùng và Bloodhound với là bộ máy thực hiện các gợi ý.
limit: Số gợi ý tối đa sẽ được hiển thị, mặc định là 5.
Bloodhound là bộ máy gợi ý cho Typeahead.js, sử dụng thành phần này mang lại nhiều tính năng nâng cao hơn vì nó có thể lấy dữ liệu từ một nguồn remote và sử dụng bộ đệm để tăng tốc.
Chúng ta sẽ thiết lập đường dẫn /find?q= trong phần Laravel, datumTokenizer cần một mảng JSON. Như vậy, chúng ta đã có dữ liệu và có thể sử dụng nó cho thiết lập source của typeahead như sau:
source: engine.ttAdapter()
1.4 Tạo mẫu cho các gợi ý
Typeahead cho phép sử dụng các template để thay đổi kiểu mẫu cho các gợi ý, bạn cũng có thể sử dụng bootstrap để style:
templates:{
empty:['<div class="list-group search-results-dropdown"><div class="list-group-item">Không có kết quả phù hợp.</div></div>'],
header:['<div class="list-group search-results-dropdown">'],
suggestion:function(data){return'<a href="'+ data.id +'" class="list-group-item">'+ data.name +'</a>'}}
Tham khảo công cụ Laragon cài đặt nhanh môi trường Laravel, chúng ta tạo ra một môi trường test có tên là typeahead và Laragon tự động tạo ra tên miền ảo typeahead.dev. Laragon cũng tự động tạo ra database tên typeahead cho chúng ta. Việc đầu tiên là thiết lập file .env:
Có nhiều các bảng khác được tạo ra do các bảng này được sử dụng cho xác thực người dùng (xem Laravel Authentication xác thực người dùng thật đơn giản). Tiếp theo chúng ta sẽ sử dụng Laravel Seeding để tạo ra 10000 dữ liệu customer mẫu trong database.
D:\Laragon\www\typeahead
λ php artisan make:seeder CustomersTableSeeder
Seeder created successfully.
Tạo file CustomerFactory.php trong thư mục database\factories:
Chúng ta đã tạo ra bảng customer với 10 nghìn dữ liệu khách hàng mẫu được đưa vào, tiếp theo chúng ta cần tạo ra một đường dẫn để thực hiện tìm kiếm khách hàng và trả về dữ liệu dạng JSON cho truy vấn Bloodhound, thêm route sau đây vào file routes\api.php:
Route::get('find','SearchController@find');
Tạo thêm một route trong routes\web.php để hiển thị thông tin chi tiết của khách hàng, ở đây chỉ thực hiện in ra màn hình thông tin mà không có tạo view, coi như bài tập thêm cho các bạn :).
Vào đường dẫn http://typeahead.dev/customer?q=jo chúng ta sẽ có kết quả là dữ liệu dạng JSON:
2.5 View
Tiếp đến chúng ta thay đổi welcome view nằm trong thư mục resources\views:
<!DOCTYPE html><html lang="vi"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible"content="IE=edge"><meta name="viewport"content="width=device-width, initial-scale=1"><meta name="description"content="Tìm kiếm thông minh sử dụng Typeahead trong ứng dụng Laravel"><meta name="author"content="FirebirD ['www.allaravel.com']"><title>Tìm kiếm thông minh trong Laravel sử dụng Typeahead - Allaravel.com</title><link rel="stylesheet"href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"><!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --><!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]--><style type="text/css">html{position:relative;min-height:100%;}body{margin-bottom:60px;}.footer{position:absolute;bottom:0;width:100%;height:60px;background-color:#f5f5f5;}body>.container{padding:60px 15px 0;}.container.text-muted{margin: 20px 0;}.footer>.container{padding-right:15px;padding-left:15px;}code{font-size:80%;}</style></head><body><!-- Fixed navbar --><nav class="navbar navbar-default navbar-fixed-top"><div class="container"><div class="navbar-header"><button type="button"class="navbar-toggle collapsed"data-toggle="collapse"data-target="#navbar"aria-expanded="false"aria-controls="navbar"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand"href="https://allaravel.com">Typeahead</a></div><div id="navbar"class="collapse navbar-collapse"><ul class="nav navbar-nav"><li class="active"><a href="#">Home</a></li><li><a href="#about">About</a></li><li><a href="#contact">Contact</a></li></ul></div><!--/.nav-collapse --></div></nav><!-- Begin page content --><div class="container"><div class="page-header"><h3>Ví dụ tìm kiếm thông minh sử dụng typeahead.js trong ứng dụng Laravel - Allaravel.com</h3></div><div class="row"><div class="col-md-12"><form class="form-inline typeahead"><div class="form-group"><input type="name"class="form-control search-input"id="name"autocomplete="off"placeholder="Nhập tên khách hàng"></div><button type="submit"class="btn btn-default">Tìm kiếm</button></form></div></div></div><footer class="footer"><div class="container"><p class="text-muted">Example in <a href="https://allaravel.com">allaravel.com</a></p></div></footer><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script><script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/typeahead.js/0.11.1/typeahead.bundle.min.js"></script><script>jQuery(document).ready(function($){var engine =newBloodhound({
remote:{
url:'api/customer?q=%QUERY%',
wildcard:'%QUERY%'},
datumTokenizer: Bloodhound.tokenizers.whitespace('q'),
queryTokenizer: Bloodhound.tokenizers.whitespace
});$(".search-input").typeahead({
hint:true,
highlight:true,
minLength:1},{
source: engine.ttAdapter(),
name:'usersList',
templates:{
empty:['<div class="list-group search-results-dropdown"><div class="list-group-item">Không có kết quả phù hợp.</div></div>'],
header:['<div class="list-group search-results-dropdown">'],
suggestion:function(data){return'<a href="customer/'+ data.id +'" class="list-group-item">'+ data.name +'</a>'}}});});</script></body></html>
Kết quả khi vào http://typeahead.dev và thực hiện tìm kiếm khách hàng chúng ta được như sau:
3. Lời kết
Với việc sử dụng Typeahead trong ứng dụng Laravel, trải nghiệm người dùng được nâng cao hơn. Typeahead không chỉ sử dụng trong các phần tìm kiếm mà chúng ta có thể sử dụng trong các form nhập liệu giúp gợi ý thông tin nhập liệu. Hi vọng bài viết sẽ giúp ích cho các bạn trong các dự án riêng sử dụng Laravel, có bất kỳ thắc mắc hoặc góp ý các bạn comment cuối bài nhé.
Hãy bắt đầu bằng cách so sánh cả hai. Đây là một ví dụ về “switch” cổ điển:
switch($statusCode){case200:case300:$message=null;break;case400:$message='not found';break;case500:$message='server error';break;default:$message='unknown status code';break;}
Đoạn code ở dưới đây sẽ tương đương với ở trên khi dùng biểu thức “match“:
$message= match ($statusCode){200,300=>null,400=>'not found',500=>'server error',default=>'unknown status code',};
Trước hết, biểu thức khớp ngắn hơn đáng kể:
nó không yêu cầu break statement
nó có thể kết hợp các trường hợp giống nhau thành một bằng dấu phẩy
nó trả về một giá trị, vì vậy bạn chỉ phải gán giá trị một lần
Nhưng thậm chí còn nhiều hơn thế!
Không ép kiểu
match sẽ kiểm tra loại nghiêm ngặt thay vì kiểm tra lỏng lẻo. Giống như sử dụng === thay vì ==. Mọi người có thể sẽ không đồng ý liệu đó có phải là điều tốt hay không, nhưng đó là một chủ đề riêng chúng ta sẽ bàn sau.
$statusCode='200';$message= match ($statusCode){200=>null,default=>'unknown status code',};// Kết quả trả về// $message = 'unknown status code'
Giá trị không xác định gây ra lỗi
Nếu bạn quên kiểm tra giá trị và khi không có nhánh default được chỉ định, PHP sẽ đưa ra ngoại lệ UnhandledMatchError. Tuy kiểm tra chặt chẽ, nhưng nó sẽ ngăn chặn các lỗi nhỏ nhặt không được chú ý.
$statusCode=400;$message= match ($statusCode){200=>'perfect',};// UnhandledMatchError sẽ throw
Hiện tại chỉ có các biểu thức một dòng
Bạn chỉ có thể viết một biểu thức trên một dùng. Các khối biểu thức có thể sẽ được thêm vào tại một thời điểm nào đó, nhưng vẫn chưa rõ chính xác khi nào .
Ứng tuyển ngay các vị trí PHP tuyển dụng mới nhất trên TopDev
Kết hợp điều kiện
match có thể kết hợp nhiều điều kiện lại với nhau và viết trên 1 dòng ngăn cách bởi dấu phẩy
$message= match ($statusCode){200,300,301,302=>'combined expressions',};
Throwing exceptions
Trong PHP 8 có thay đổi về cách dùng throw trước đây throw chỉ bắt đầu từ câu lệnh thì giờ có thể bắt đầu từ biểu thức, nghĩa là bạn có thể throw exception ở giá trị 500 mà k phải cần đưa vào trong hàm
$message= match ($statusCode){200=>null,500=>thrownewServerError(),default=>'unknown status code',};
Pattern matching
Ok, có một điều nữa: Pattern matching. Đây là một kỹ thuật được sử dụng trong các ngôn ngữ lập trình khác, để cho phép kết hợp phức tạp hơn các giá trị đơn giản. Hãy nghĩ về nó như regex, nhưng đối với các biến thay vì văn bản.
Pattern matching không được hỗ trợ ngay bây giờ, vì đây là một tính năng khá phức tạp, nhưng Ilija Tovilo (tác giả RFC) đã đề cập đến nó như là một tính năng có thể có trong tương lai.
Vậy thì, switch hay là match?
match với phiên bản chặt chẽ và hiện đại hơn so với người anh switch
Trong một số trường hợp switch sẽ cung cấp linh hoạt hơn so với match, đặc biệt là với các khối code có nhiều dòng. Tuy nhiên, sự nghiêm ngặt của toán tử match là hấp dẫn và pattern matching sẽ là một yếu tố thay đổi cuộc chơi cho PHP.
Tôi thừa nhận tôi chưa bao giờ viết một switch statement trong những năm qua vì nhiều điều kỳ quặc của nó. Vì vậy, trong khi nó chưa hoàn hảo, nhưng có những trường hợp sử dụng được thì match sẽ là một sự lựa chọn tốt đối với tôi.
Cover Letter chuẩn Dev sẽ như thế nào? Nhiều ứng viên ngành IT cảm thấy khó khăn trong việc tìm kiếm một Cover Letter cho Dev với một format chuyên nghiệp. Vậy Cover Letter cho Developer là gì và đâu là những điểm cần lưu ý? Cùng TopDev điểm qua bài viết sau để giải đáp các thắc mắc đấy
Thế nào là Cover Letter cho Dev?
Cover Letter (hay còn gọi là Thư xin việc), là một loại văn bản được xây dựng dưới hình thức một trang. Cover Letter cho Dev truyền tải các thông tin về cá nhân, năng lực, trình độ, mục tiêu phát triển ngành lập trình đến với nhà tuyển dụng.
thư xin việc – Cover Letter được hiểu như thế nào?
Chất lượng của một Cover Letter cho Developer sẽ quyết định 30-50% kết quả ứng tuyển. Điều đó cho thấy, cần đầu tư cho chiếc Cover Letter của mình sao cho chỉn chủ nhất. Đừng xem thường vai trò của Cover Letter cho Dev. Vì biết đâu bạn sẽ bị “out” vì sự hời hợt đối với nó đấy!
Cover Letter không chỉ phản ánh bạn là ứng viên Developer phù hợp mà còn cho trong nhiều trường hợp, nó còn thể hiện bạn là người không phù hợp với vị trí đó.
Tips nâng cấp Cover Letter cho Developer
Hãy lưu tâm các tips sau để Cover Letter của bạn không trở nên quá tệ hại trong mắt nhà tuyển dụng.
Tips viết CV giúp ứng viên có thêm bí quyết hoàn thiện Cover Letter Developer
Cover Letter bám sát tính trọng tâm về nội dung
Ứng viên IT nên chú trọng đến việc chia sẻ về các thông tin quan trọng. Tránh liệt kê những nội dung thừa thải, không liên quan. Điều đó chứng tỏ bạn là người thiếu sự nhìn nhận, sàng lọc và phân tích thông tin.
Đồng thời, viết CV chuẩn đẹp giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.
Nội dung cần được triển khai theo format chuẩn và đúng định hướng. Không dài dòng, dàn trải với nhiều thông tin lan man, thiếu tính kết nối. Sự rời rạc về nội dung khiến giá trị của Cover Letter cho Developer bị giảm đi.
Trọng tâm còn nằm ở chỗ vấn đề ứng viên chia sẻ các kỹ năng cần thiết cho vị trí ứng tuyển. Đừng nói quá và phô trương quá nhiều kỹ năng. Bạn cần nhớ là nhà tuyển dụng cần chất lượng hơn số lượng.
Số liệu thực minh chứng cho các trải nghiệm trong Cover Letter
Những minh chứng rất quan trọng. Nhà tuyển dụng sẽ có ấn tượng hơn với nhiều ứng viên trình bày rõ ràng các minh chứng về các trải nghiệm của mình.
Đó có thể là:
+ Số liệu cho thấy tốc độ tăng trưởng dưới sự phồi hợp giải quyết các công việc giữa bạn và team trong một dự án.
+Lời đánh giá chuyên môn.
+ Các thành tích, giải thưởng từ quá trình phân tích, nghiên cứu chuyên sâu.
Kiểm tra lại nội dung Cover Letter cho Dev
Khó có thể nói có một công thức chung nào để được gọi là sự ấn tượng. Thế nhưng, việc rà soát lại các lỗi trong Cover Letter sẽ giúp cho thư xin việc IT được nâng cấp một cách toàn diện hơn.
Không nên dùng những từ ngữ quá phức tạp, có sắc thái biểu đạt quá cao. Điều này làm giảm đi tính hiệu quả của Cover Letter cho Developer . Thay vào đó hãy ưu tiên dùng các từ ngữ đơn giản, dễ hiểu. Ứng viên cần lượt bỏ đi những thông tin không quan trọng. Vì đôi khi, quá nhiều nội dung sẽ khiến nhà tuyển dụng khó nắm bắt được những điều bạn muốn truyền tải trong Cover Letter cho Dev.
Gợi ý các mẫu template Cover letter/mẫu thư xin việc cho Dev
Vietnam Web Summit 2020 (VWS2020) với hàng loạt chủ đề hấp dẫn về tính “quyền năng” của dữ liệu đặc biệt trong thời đại Digital Transformation! Sự phát triển mạnh mẽ và ứng dụng công nghệ đa dạng vào trong đời sống tạo ra một lượng lớn dữ liệu khách hàng, tạo nên những câu chuyện và rồi lại tác động trở lại đến quyết định của nhiều tổ chức, doanh nghiệp. Tuy nhiên trong thực tế, liệu những câu chuyện được kể bởi dữ liệu có phản ánh toàn bộ thực tế? Dữ liệu có phải là một ‘đấng toàn năng’ và chi phối mọi quyết định của doanh nghiệp?
Hãy để các diễn giả của Vietnam Web Summit 2020 giúp bạn ‘tỏ tường’ hơn về quyền năng của dữ liệu và lý do dữ liệu không phải là toàn năng. Ai sẽ thực hiện điều này?
◸Mr. Nguyễn Tấn Triều
CEO @USPA Technology Company◿
Câu trả lời mà bạn đang tìm kiếm có thể sẽ được tìm thấy dưới góc nhìn của “dataism”. Thông qua topic “Thinking with Dataism and LEO Customer Data Platform”, anh Nguyễn Tấn Triều sẽ cho bạn một góc nhìn tổng quan về ‘tôn giáo’ này cùng phương pháp LEO CDP.
◸Ms. Đặng Huỳnh Mai Anh
Data Science Manager @Amanotes◿
Tự thân dữ liệu không thể tạo ra câu chuyện nếu không có bàn tay của con người. Trong topic “Data Quality Control System – what it is and how it is employed in a music-tech company”, chị Đặng Huỳnh Mai Anh sẽ “bật mí” cách tận dụng triệt để loại ‘quyền năng’ này với một Data Quality Control System – một ‘cỗ máy’ quản trị chất lượng dữ liệu của một công ty đã chạm đến con số 1 tỷ lượt tải ứng dụng và với 95 triệu MAU.
◸Mr. Nghiêm Xuân Bách
Vietnam Country Manager @Cinnamon AI◿
“Data never sleep” – dữ liệu luôn được sản sinh liên tục, vì lẽ đó một Data Harvest Loop sẽ là giải pháp cho các doanh nghiệp. Để hiểu rõ hơn Data Harvest Loop là gì, doanh nghiệp sẽ ứng dụng như thế nào trong quá trình chuyển đổi, hãy để anh Nghiêm Xuân Bách tiết lộ cho bạn.
◸Ms. Kelly Tran
Client Partner – Monetization @Unity Technologies◿
Ở giai đoạn cuối cùng của quá trình chuyển hóa dữ liệu, chị Kelly Tran sẽ giải đáp lý do vì sao đôi lúc dữ liệu lại ‘nói dối’ với bạn, đặc biệt trong lĩnh vực gaming, thông qua topic “Why A/B testing by data go wrong in gaming”.
Với lượng topic lên đến con số hàng trăm, xoay quanh 6 nhóm chủ đề liên quan đến công nghệ web, VWS2020 hứa hẹn là điểm hẹn công nghệ hoành tráng nhất cuối năm 2020, nơi các tech-guys gặp gỡ và chia sẻ về những ứng dụng công nghệ mới và đón đầu xu hướng trong giai đoạn 5 năm tiếp theo!
==
Vietnam Web Summit 2020: LEAD THE AGE OF REVOLUTION TECHNOLOGIES
Vào tháng 12/2020, Vietnam Web Summit trở lại tại 2 thành phố TP.HCM và HN – nơi những ý tưởng sẽ gặp nhau và cùng đón đầu những xu hướng, công nghệ mới trong chặng đường 5 năm tiếp theo – một kỷ nguyên mới của công nghệ!
Bài viết gốc được sự cho phép của tác giả Nguyễn Chí Thức
IDE là gì?
IDE là viết tắt của Integrated Development Environment (môi trường phát triển tích hợp) được định nghĩa là một công cụ mã hóa giúp tự động hóa quá trình chỉnh sửa, biên dịch, kiểm thử mã nguồn và nó giúp nhà phát triển dễ dàng chạy, viết và debug code.
Nó được thiết kế đặc biệt để phát triển phần mềm bao gồm một số công cụ được sử dụng để phát triển và kiểm thử phần mềm.
Giới thiệu IDE phổ biến trong lập trình Python như sau:
PyCharm được phát triển bởi Jet Brains và đây là môi trường phát triển tích hợp đa nền tảng (IDE) được thiết kế đặc biệt cho Python. Đây là IDE được sử dụng rộng rãi nhất và có sẵn ở cả phiên bản trả phí và nguồn mở miễn phí.
PyCharm là một IDE Python hoàn hảo với một các tính năng phong phú như tự đồng hoàn thiện code, điều hướng project nhanh, test và debug nhanh, hỗ trợ phát triển từ xa, khả năng truy cập cơ sở dữ liệu, v.v.
Tính năng, đặc điểm:
Điều hướng mã thông minh
Đánh dấu lỗi
Trình gỡ lỗi (debug) mạnh mẽ
Hỗ trợ các framework phát triển web Python, ví dụ, Angular JS, Javascript
Spyder là một công cụ mã nguồn mở có sự công nhận cao trong thị trường IDE và phù hợp nhất với khoa học dữ liệu. Tên đầy đủ của Spyder là môi trường phát triển Python khoa học. Nó hỗ trợ tất cả các nền tảng quan trọng Linux, Windows và MacOS X.
Nó cung cấp một tập hợp các tính năng như trình soạn thảo mã cục bộ, trình xem tài liệu, trình thám hiểm biến, bảng điều khiển tích hợp, v.v. và hỗ trợ các mô-đun khoa học như NumPy, SciPy, v.v.
Tính năng, đặc điểm:
Làm nổi bật cú pháp đúng và hoàn thành mã tự động
Tích hợp mạnh mẽ với Python console
Hoạt động tốt trong chế độ chỉnh sửa đa ngôn ngữ và chế độ hoàn thành mã tự động
PyDev
PyDev được định nghĩa là một trong những IDE Python thường được sử dụng, là một plugin bên ngoài cho Eclipse. Đó là một lựa chọn tự nhiên của các nhà phát triển Python đến từ nền tảng Java và rất phổ biến trên thị trường với tư cách là trình thông dịch Python.
Pydev có một tính năng bao gồm tích hợp Django, hoàn thành mã tự động, thụt lề thông minh, v.v.
Tính năng, đặc điểm:
Các tham số mạnh như tái refactor, debug, phân tích mã và chức năng bao phủ mã.
Nó hỗ trợ các môi trường ảo, Mypy và định dạng màu đen.
Cũng hỗ trợ tích hợp PyLint, trình debug từ xa, tích hợp unit test, v.v.
Atom
Atom được phát triển bởi GitHub, ban đầu được bắt đầu như một nguồn mở, đa nền tảng. Nó dựa trên một framework, nghĩa là nó cho phép ứng dụng máy tính để bàn cross-platform sử dụng Chromium và Node.js và thường được gọi là “Text Editor Hack cho thế kỷ 21 st
Tính năng, đặc điểm:
Trực quan hóa kết quả trên Atom mà không cần mở bất kỳ cửa sổ nào khác.
Một plugin có tên “Markdown Preview Plus” cung cấp hỗ trợ tích hợp để chỉnh sửa và hiển thị các tệp Markdown.
Nó được định nghĩa là một IDE đa nền tảng được tích hợp các tính năng cần thiết và hỗ trợ phát triển tốt. Phiên bản cá nhân của nó là miễn phí. Phiên bản pro đi kèm bản dùng thử 30 ngày.
Nó có một số tính năng bao gồm tự động hoàn thành code, highlight cú pháp, thụt lề và debug.
Tính năng, đặc điểm:
Có phần tùy chình và cũng có thể mở rộng.
Hỗ trợ phát triển từ xa, test-driven development cùng với kiểm thử đơn vị.
Jupyter Notebook
Jupyter là một trong những trình soạn thảo sổ ghi chép IPython được sử dụng nhiều nhất được sử dụng trong ngành Khoa học dữ liệu. Nó là một ứng dụng web dựa trên cấu trúc máy chủ-máy khách và cho phép bạn tạo và thao tác với các tài liệu sổ ghi chép.
Tính năng, đặc điểm:
Hỗ trợ đánh dấu
Dễ dàng tạo và chỉnh sửa mã
Lý tưởng cho người mới bắt đầu trong khoa học dữ liệu
Thonny
Thonny là một IDE khác phù hợp nhất cho việc học và dạy lập trình. Nó là một phần mềm được phát triển tại Đại học Tartu và hỗ trợ hoàn thành mã và đánh dấu các lỗi cú pháp.
Tính năng, đặc điểm:
Trình debug đơn giản
Hỗ trợ đánh dấu lỗi và hoàn thành mã tự động
Rodeo
Rodeo được định nghĩa là một trong những IDE tốt nhất cho python được sử dụng rộng rãi nhất cho các dự án khoa học dữ liệu như lấy dữ liệu và thông tin từ các tài nguyên khác nhau.
Nó hỗ trợ chức năng đa nền tảng và cung cấp tự động hoàn thành mã.
Tính năng, đặc điểm:
Cho phép các chức năng so sánh dữ liệu, tương tác, vẽ đồ thị và kiểm tra dữ liệu.
Hoàn thành mã tự động, highlight cú pháp, trình điều hướng tệp trực quan, v.v.
Microsoft Visual Studio
Microsoft Visual Studio là một trình soạn thảo mã nguồn mở phù hợp nhất để phát triển và gỡ lỗi các dự án web và đám mây mới nhất. Nó có thị trường riêng cho các phần mở rộng.
Tính năng, đặc điểm:
Hỗ trợ mã hóa Python trong Visual studio
Có sẵn ở cả phiên bản trả phí và miễn phí
Eric Python
Eric Python là một trình soạn thảo được phát triển bằng chính Python và có thể được sử dụng cho cả công việc chuyên nghiệp và không chuyên nghiệp.
Tính năng, đặc điểm:
Cung cấp bố trí cửa sổ cấu hình, editor
Khả năng quản lý dự án nâng cao, kiểm soát phiên bản
Bài viết được sự cho phép của tác giả Nguyễn Văn Minh
Bạn đã bao giờ tự hỏi: Trong MySQL, câu lệnh CASE, câu lệnh IF và hàm IF khác nhau thế nào? Bạn có thấy phân vân khi chọn một trong ba thứ trên để viết query? Đây không phải câu hỏi mới nhưng nhiều bạn sẽ bỡ ngỡ khi tiếp xúc với nó. Nhất là khi bạn vừa bắt đầu tìm hiểu về MySQL và cơ sở dữ liệu quan hệ.
Nếu bạn muốn tìm hiểu cơ sở dữ liệu là gì và có những loại nào, hãy tham khảo bài viết này.
Cú pháp
Câu lệnh CASE
CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
Câu lệnh IF
IF condition1 THEN
{...statements to execute when condition1 is TRUE...}
[ ELSEIF condition2 THEN
{...statements to execute when condition1 is FALSE and condition2 is TRUE...} ]
[ ELSE
{...statements to execute when both condition1 and condition2 are FALSE...} ]
END IF;
Hàm IF
IF(expr1,expr2,expr3)
Đào sâu hơn
Nhìn vào cú pháp trên đây, ta có thể thấy, dường như hàm IF ít linh hoạt hơn câu lệnh CASE. Nếu bạn viết thế này:
SELECT IF(movie = 'The Matrix', 'high', 'low') AS suggestion
Thì bạn hoàn toàn có thể dùng CASE như thế này:
SELECT CASE WHEN movie = 'The Matrix' THEN 'high' ELSE 'low' END AS suggestion
Khá là giống nhau đúng không? Trừ việc hàm IF trông gọn gàng hơn chút ít. Nhưng nếu có nhiều hơn hai nhánh thì sao? Có lẽ bạn sẽ không muốn viết thế này:
SELECT IF(movie = 'The Matrix', 'high', IF(movie = 'Endgame', 'medium', 'low')) AS suggestion
Mà nên là thế này:
SELECT CASE movie
WHEN = 'The Matrix' THEN 'high'
WHEN = 'Endgame' THEN 'medium'
ELSE 'low'
END AS suggestion
Nó cũng tương tự như khi ta dùng switch để rẽ nhánh vậy, tự nhiên vào thoải mái hơn rất nhiều.
Có một điều bạn phải chú ý. Trong khi câu lệnh CASE là câu lệnh chuẩn của SQL thì hàm IF lại hoàn toàn không phải. Điều đó có nghĩa gì? Nếu bạn có ý định chuyển sang dùng SQL Server hay PostgreSQL chẳng hạn, hàm IF sẽ không còn hoạt động nữa.
Ở một diễn biến khác, câu lệnh IF là cái gì đó rất lạ lẫm với hai thứ trên. Nó được dùng khi viết thủ tục (procedure). Ví dụ:
CREATE FUNCTION get_suggestion (movie varchar(50))
RETURNS varchar(20)
BEGIN
IF movie = 'The Matrix' THEN
return 'high';
ELSEIF movie = 'Endgame' THEN
return 'medium';
ELSE
return 'low';
END IF;
END;
Do đó, chớ nên nhầm lẫn mục đích sử dụng của câu lệnh IF với hàm IF, hay thậm chí câu lệnh CASE. Chúng sinh ra vì những “sứ mệnh” khác nhau.
Bài viết được sự cho phép của tác giả Nguyễn Hữu Đồng
UUID là viết tắt của Universally Unique IDentifier. Mình chỉ hiểu đơn giản đây là một mã định danh duy nhất là một số gồm 128bit. Tổng cộng có 32 kí tự chia thành 5 phần cách nhau bởi 4 dấu gạch nối đơn cử
123e4567-e89b-12d3-a456-426655440000
Để generate ra một UUID thì bạn hoàn toàn có thể dùng 1package nào đó mà khỏi cần nghĩ nhiều, nhưng mình sẽ tự generate ra 1 fake uuid bằng cách random ra một slice byte gồm 16 phần tử (8 bit) và sau đó để cho đẹp mắt thì mình sẽ convert hệ thập phân về base16.
Vì sao là 16 phần tử và base 16. Thứ nhất mình muốn các kí tự trong uuid là chữ hoặc số A-Z 0–9, cộng thêm cty mình đang làm 1 dự án mang tên là HexSafe, mà hex là hexadecimal thập lục phân là 16 luôn. Và nếu số 8bit phân sang base16 thì chỉ tốn hai char nên mình sẽ random 16 số 8 bit.
b := make([]byte, 16)
_, err := rand.Read(b)
if err != nil {
return "", err
}
Sau đó mình sẽ lấy 4 số cho phần đầu, tiếp theo là 2,2,2 và cuối cùng là 6 số,
để chuyển qua hex thì quá easy luôn. Có sẵn fmt.Sprintf(“%X”,n) để convert n về base16 dạng in hoa.
Mặc dù là fake uuid, trên lý thuyết là có thể trùng lẫn nhau xác xuất 1/(256¹⁶)
và nếu nó xảy ra thì thôi ý trời :)) đến UUID còn có thể trùng nhau cơ mà.
CV đóng một vai trò rất quan trọng đối với việc thu hút nhà tuyển dụng. Một CV Template IT đúng chuẩn lại giúp gia tăng nhiều hơn các lợi thế ở ứng viên. Vậy liệu dân lập trình IT đã có những hình dung chính xác về CV online IT hay chưa? Cùng TopDev điểm qua top các mẫu CV Template IT (IT CV Template) đẹp chuẩn.
Những lưu ý ban đầu về CV Template IT
Dù đó là CV cho sinh viên IT mới ra trường hay CV ứng tuyển các vị trí Junior Developer, Senior Developer,… bạn vẫn phải đầu tư cho CV IT Developer của mình. Nó là tài liệu quan trọng ghi dấu ấn trong sự nghiệp phát triển của bạn. Đồng thời, dựa trên các thông tin bạn truyển tải, nhà tuyển dụng có thể đánh giá được các tiêu chí về trình độ, năng lực, tiềm năng phát triển,…
Hãy lưu tâm vấn đề này để CV Template IT của bạn chuẩn format, Phải nhớ nó không giống sơ yếu lý lịch đơn thuần.CV ngành IT nhấn mạnh các giá trị nổi bật về kỹ năng, trình độ chuyên môn, quan điểm – mục tiêu,…
Đồng thời, viết CV giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.
Lợi thế điểm nhấn có thể đến từ các lưu ý về kỹ năng và các khoa học chuyên sâu dưới đây:
Kỹ năng (Skills)
Kỹ năng duy trì các ứng dụng phần mềm khoa học hiện. Phát triển các ứng dụng mới hơn.
Kết nối và chia sẻ kinh nghiệm áp dụng các nguyên tắc, chiến thuật phát triển dựa trên các nền tảng lý thuyết.
Kỹ năng phân tích, xử lý – giải quyết vấn đề.
Kỹ năng giao tiếp
Đây là các kỹ năng khá quan trọng mà bạn cần bổ sung vào IT CV Template.
Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh
Toán tử instanceof trong Java là một toán tử được sử dụng để kiểm tra xem đối tượng này có phải là instance của một class hay interface nào đó hay không? Kết quả trả về của toán tử này sẽ là true nếu đối tượng đó là thể hiện của class mà các bạn đang check, ngược lại thì false.
Trong hàm main() của class này, mình initialize một đối tượng của class Application và sử dụng toán tử instanceof để kiểm tra xem đối tượng này có phải là instance của class Application này hay không? Các bạn sẽ thấy kết quả sẽ như sau:
Nếu các bạn viết code như sau:
package com.huongdanjava.java;
public class Application {
public static void main(String[] args) {
Application application = new Application();
System.out.println(application instanceof String);
}
}
thì IDE sẽ báo lỗi ngay:
Đây là trong trường hợp quá tường minh, quá rõ ràng, IDE có thể báo lỗi cho các bạn biết ngay.
Nhưng nếu bạn có một interface với hai implementation như sau:
package com.huongdanjava.java;
public interface Shape {
}
package com.huongdanjava.java;
public class Triangle implements Shape {
}
package com.huongdanjava.java;
public class Rectangle {
}
thì lúc này nếu các bạn initialize đối tượng của class Triangle nhưng lại đi kiểm tra đối tượng này có phải là thể hiện của class Rectangle,
package com.huongdanjava.java;
public class Application {
public static void main(String[] args) {
Shape shape = new Triangle();
System.out.println(shape instanceof Rectangle);
}
}
IDE sẽ không thể detect lỗi lúc compile time nhưng khi chạy các bạn sẽ thấy kết quả như sau:
Chúng ta sẽ thường sử dụng toán tử instanceof trong trường hợp kiểm tra xem tham số truyền vào của một phương thức có phải là instance của một class nào đó hay không? Ví dụ như:
Trong phương thức trên, tham số interface Shape có nhiều implementation khác nhau, trong phần body của phương thức, chúng ta sẽ check xem là instance được truyền vào phương thức này có phải là Triangle hay không? Nếu đúng thì xử lý code tiếp.
Kết quả:
package com.huongdanjava.java;
public class Application {
private void check(Shape shape) {
if (shape instanceof Triangle) {
Triangle triangle = (Triangle) shape;
System.out.println("This is triangle: " + triangle.toString());
}
}
public static void main(String[] args) {
Application application = new Application();
application.check(new Triangle());
}
}
Từ Java 14, các bạn có thể viết lại phương thức check() sử dụng pattern matching instanceof, đơn giản như sau:
private void check(Shape shape) {
if (shape instanceof Triangle triangle) {
System.out.println("This is triangle: " + triangle.toString());
}
}
Với cách viết mới, chúng ta không cần viết thêm một dòng code để cast instance về đối tượng mà chúng ta muốn nữa. Tất cả sẽ được thực hiện trong dòng lệnh if.
Factory Method Pattern giải quyết vấn đề này bằng cách định nghĩa một factory method cho việc tạo đối tượng, và các lớp con thừa kế có thể override phương thức này để chỉ rõ đối tượng nào sẽ được khởi tạo.
Bây giờ, mình sẽ có một ví dụ, cho các bạn dễ hiểu về factory design pattern này.
Mình có yêu cầu viết một ứng dụng, nạp tiền điện thoại cho các mạng điện thoại Việt Nam: Mobifone, VinaPhone, Viettel, Vietnamobile, Gmobile.
Request yêu cầu gởi đến ứng dụng của chúng ta gồm 2 tham số: số thoại cần nạp tiền và số tiền.
Thường trong bài viết này, chúng ta sẽ sử dụng một thiết bị modern GMS và sử dụng tập lệnh AT-Command xài lệnh USSD để nạp tiền vào tài khoản cho người dùng.
Nhưng có rắc rối ở đây là mỗi nhà mạng, đều có cấu trúc kiểm tra số dư tài khoản, hay cú pháp nạp tiền đều khác nhau.
Vậy làm sao khi gởi đến chúng ta sẽ điều hướng cho từng class nhà mạng.
Sơ đồ Design Pattern:
Đầu tiên, mình sẽ tạo một InterFace INetwork.cs C#:
Bài viết được sự cho phép của tác giả Nguyễn Trần Chung
Mảng JavaScript cho phép bạn nhóm các giá trị và lặp lại chúng. Bạn có thể thêm và loại bỏ các phần tử mảng theo những cách khác nhau. Thật không may, không có một phương thức Array.remove đơn giản để loại bỏ phần tử nào đó ra khỏi mảng.
Vậy, làm thế nào để bạn xóa một phần tử khỏi mảng JavaScript?
Thay vì phương thức xóa, mảng JavaScript có nhiều cách bạn có thể xóa các giá trị mảng.
1. Xóa các phần tử ở cuối mảng Javascript
1.1 Dùng cách set lại độ dài của mảng
Các phần tử mảng JavaScript có thể được loại bỏ khỏi phần cuối của mảng bằng cách đặt thuộc tính độ dài thành giá trị nhỏ hơn giá trị hiện tại. Bất kỳ phần tử nào có chỉ số lớn hơn hoặc bằng độ dài mới sẽ bị xóa.
var ar =[1,2,3,4,5,6];
ar.length =4;// đặt độ dài để xóa bớt phần tử ở cuối
console.log( ar );// [1, 2, 3, 4]
1.2 Dùng pop()
Phương thức pop loại bỏ phần tử cuối cùng của mảng, trả về phần tử đó và cập nhật thuộc tính độ dài. Phương thức pop sửa đổi mảng mà nó được gọi, Điều này có nghĩa là nó không giống như cách trên mà phần tử cuối cùng được loại bỏ hoàn toàn và chiều dài mảng giảm đi.
var ar =[1,2,3,4,5,6];
ar.pop();// returns 6
console.log( ar );// [1, 2, 3, 4, 5]
2. Xóa các phần tử ở đầu mảng Javascript
Làm thế nào để bạn loại bỏ phần tử đầu tiên của một mảng JavaScript?
Phương thức shift hoạt động giống như phương thức pop ngoại trừ việc loại bỏ phần tử đầu tiên của mảng JavaScript thay vì phần tử cuối cùng.
Không có tham số vì phương thức shift chỉ loại bỏ phần tử mảng đầu tiên. Khi phần tử được loại bỏ, các phần tử còn lại được chuyển xuống.
var ar =['zero','one','two','three'];
ar.shift();// returns "zero"
console.log( ar );// ["one", "two", "three"]
Phương thức shift trả về phần tử đã bị xóa, cập nhật các chỉ mục của các phần tử còn lại và cập nhật thuộc tính độ dài. Nó sửa đổi mảng mà nó được gọi.
Nếu không có phần tử hoặc độ dài mảng bằng 0, phương thức trả về undefined.
Không giống như phương thức splice(), filter() tạo ra một mảng mới. filter() không làm thay đổi mảng mà nó được gọi, nhưng trả về một mảng mới.
filter() có một tham số duy nhất, một phương thức gọi lại (callback function). Cuộc gọi lại được kích hoạt khi phương thức lọc lặp qua các phần tử mảng. Nó sẽ chuyển ba giá trị cho hàm gọi lại:
giá trị hiện tại hoặc phần tử
chỉ mục mảng hiện tại
và mảng đầy đủ.
Phương thức gọi lại sẽ trả về đúng hoặc sai. Bạn có trách nhiệm kiểm tra giá trị (phần tử) để xem nó có đáp ứng tiêu chí của bạn không. Nếu nó bạn có thể trả lại true. Các phần tử trả về true được thêm vào mảng mới được lọc.
var array =[1,2,3,4,5,6,7,8,9,0];var filtered = array.filter(function(value, index, arr){return value >5;});//kết quả filtered => [6, 7, 8, 9]//mảng array vẫn giữ nguyên => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
Bạn nên lưu ý một mảng mới chứa các giá trị khớp với filter được trả về. Mảng ban đầu thì không bị ảnh hưởng. Mình thấy điều này hữu ích vì mình thường muốn giữ lại dữ liệu gốc, nhưng truy xuất các tập hợp con để xử lý các nhu cầu logic khác nhau.
Đôi khi các thư viện tiện ích là cách tốt nhất để giải quyết các vấn đề phức tạp hơn. Lodash cung cấp một tập hợp phong phú các phương thức thao tác mảng, trong đó có phương thức remove().
Phương thức remove() hoạt động giống như phương thức filter(), nhưng sắp xếp ngược lại. Nó không lưu các giá trị mảng ban đầu, nhưng loại bỏ các phần tử khớp với điều kiện. Và cuối cùng, nó trả về các phần tử phù hợp như là một mảng mới.
var array =[1,2,3,4];var evens = _.remove(array,function(n){return n %2===0;});
console.log(array);// => [1, 3]
console.log(evens);// => [2, 4]
6. Tự tạo phương thức xóa
Như đã nói ở đầu bài viết, không có phương thức chuyển để xóa phần tử khỏi mảng kiểu như Array.remove(). Phương pháp Lodash giải quyết được vấn đề này, nhưng không phải lúc nào bạn cũng muốn sử dụng Lodash. Điều này không có nghĩa là bạn không thể tạo ra một phương thức tiện ích cho riêng mình.
functionarrayRemove(arr, value){return arr.filter(function(ele){return ele != value;});}var result =arrayRemove(array,6);// result = [1, 2, 3, 4, 5, 7, 8, 9, 0]
Ví dụ trên chỉ đơn giản, bạn có thể sửa đổi cho phù hợp với nhu cầu của bạn, nhưng có lẽ filter() vẫn là ổn nhất
Bạn có thể xóa các thành phần mảng cụ thể bằng cách sử dụng toán tử delete:
var ar =[1,2,3,4,5,6];delete ar[4];// xóa phần tử có chỉ số index là 4
console.log( ar );// [1, 2, 3, 4, undefined, 6]alert( ar );// 1,2,3,4,,6
Sử dụng toán tử delete không ảnh hưởng đến thuộc tính độ dài. Nó cũng không ảnh hưởng đến các chỉ số của các element tiếp theo. Mảng trở nên thưa thớt, đó là một cách thú vị để nói rằng mục bị xóa không bị xóa mà trở nên không xác định. So sánh cách sử dụng delete với phương thức splice() được mô tả dưới đây.
Toán tử delete được thiết kế để xóa các thuộc tính khỏi các đối tượng JavaScript, mà các mảng là các đối tượng.
Lý do phần tử không thực sự bị xóa khỏi mảng là toán tử delete liên quan đến giải phóng bộ nhớ hơn là xóa một phần tử. Bộ nhớ được giải phóng khi không còn tham chiếu đến giá trị.
Thị trường IT Việt Nam ngày càng phát triển và trở nên năng động hơn. Đó là một phần lý do để thu hút một lượng lớn doanh nghiệp công nghệ nước ngoài đầu tư vào Việt Nam, tiêu biểu trong số đó là các công ty của Hàn Quốc.
Bên cạnh đó, qua “cái bắt tay” chiến lược giữa Korea IT Cooperation Center tại TP. HCM (KICC HCMC) và Nền tảng tuyển dụng chuyên về IT hàng đầu Việt Nam – TopDev, các lập trình viên Việt càng có nhiều lựa chọn hơn khi tìm kiếm nơi làm việc phù hợp, đặc biệt nhất chính là cơ hội trải nghiệm môi trường làm việc “chuẩn” quốc tế cùng nhiều công nghệ tiên tiến đến từ Hàn Quốc.
Ra đời vào năm 1998, Total Soft Bank Ltd (TSB) là công ty chuyên cung cấp các giải pháp maritime logistics thông qua việc áp dụng công nghệ tiên tiến hàng đầu cùng đội ngũ phát triển giàu kinh nghiệm chuyên môn. Một số giải pháp tiêu biểu của công ty như: tự động hóa tàu biển, các giải pháp cảng,…
⇒ Bạn vừa ra trường và muốn trải nghiệm làm việc tại công ty thuộc lĩnh vực logistics thì Total Soft Bank Vietnam chính là “đáp án” dành cho bạn!
⇒ Hãy sẵn sàng “bùng nổ” năng lực, cùng chinh phục những thử thách giúp nâng cao tay nghề từ Total Soft Bank Vietnam với vị trí Fresher Software Developer
Được thành lập từ năm 2009, LOTTE Data Communication Việt Nam đóng vai trò cung cấp hầu hết các giải pháp và Dịch vụ IT cho các công ty con thuộc Tập đoàn LOTTE đang kinh doanh tại Việt Nam. Kế thừa tất cả tinh hoa từ Công ty mẹ, LOTTE Data Communication Việt Nam kết nối và phát triển mạng lưới khách hàng thuộc mọi lĩnh vực từ Bán lẻ, Sản xuất đến Tài chính, Dịch vụ Công… bằng những giải pháp bắt kịp xu hướng Công nghệ của thế giới như Triển khai hệ thống ra vào cho cao ốc, An Ninh nhận diện khuôn mặt, Smart Parking, Thu phí tự động,…
LOTTE Data Communication Việt Nam đem đến nhiều cơ hội phát triển sự nghiệp cho các Lập trình viên tài năng. Cùng khám phá những vị trí hấp dẫn mà bạn không nên bỏ lỡ:
Hanbisoft là công ty chuyên cung cấp các dịch vụ máy tính tùy chỉnh cho doanh nghiệp, giúp các hoạt động quản lý: nhân sự, kế toán, thuế, vận chuyển hàng hóa, mua bán,…trở nên dễ dàng hơn.
Tự hào với môi trường làm việc chuyên nghiệp, Hanbisoft sẽ là nơi các lập trình viên có thể bùng nổ năng lực qua các dự án phát triển ứng dụng di động và phần mềm chất lượng.
⇒ Bạn muốn tìm kiếm môi trường làm việc ổn định, lâu dài cùng cơ hội học hỏi các công nghệ mới nhất? Hãy thử khám phá vị trí React Native Developer tại Hanbisoft, biết đâu đây chính là “bến đỗ” phù hợp với tài năng của bạn!
Được thành lập từ năm 2016, VNIB Tech là công ty chuyên cung cấp các phần mềm trên nền tảng di động (iOS, Android) và web. Hoạt động với sứ mệnh mang thế giới đến gần nhau hơn bằng công nghệ, VNIB Tech không ngừng cải tiến chất lượng, đem đến cho khách hàng những sản phẩm và giải pháp tối ưu nhất. Đây cũng chính là cơ hội cho các tài năng công nghệ trải nghiệm môi trường làm việc chuyên nghiệp tại công ty đến từ Hàn Quốc và gặt hái thành công.
Bạn đã sẵn sàng chinh chiến cùng VNIB Tech trong những dự án đầy thách thức? Khám phá ngay loạt vị trí hứa hẹn cho bạn cơ hội bứt phá sự nghiệp:
Mintpot Việt Nam là thành viên của Minpot, có trụ sở chính tại Hàn Quốc, và là một trong những công ty sáng tạo thông minh, chuyên cung cấp các dịch vụ video VR có phụ đề Mint VR với ước mơ tạo ra một cuộc sống tốt hơn với VR.
Đến với Mintpot, ngoài mức lương cực hấp dẫn, bạn còn có nhiều cơ hội thăng tiến và phát triển không giới hạn. Nếu bạn đang tìm kiếm “bến đỗ” cho sự nghiệp và đã sẵn sàng tạo cú hích mới cho bản thân? Vậy Mintpot chính là câu trả lời tốt nhất cho bạn..
Đừng bỏ lỡ cơ hội! Gia nhập Mintpot ngay với 1 trong 3 vị trí hấp dẫn đang chờ bạn trực tiếp trải nghiệm:
Genuwin là công ty thuộc top đầu trong ngành lập trình phần mềm quản lý nhân sự, kế toán, quản lý sản xuất, nhà hàng khách sạn, sân golf, trường học quốc tế, liên kết thanh toán với hệ thống ngân hàng Hàn Quốc Shinhan Bank với mạng lưới khách hàng trải dài khắp Việt Nam và các nước như Campuchia, Indonesia, Hàn Quốc…
Với đội ngũ nhân viên chuyên nghiệp, tận tâm và có năng lực, trách nhiệm cao, Genuwin ngày càng phát triển và từng bước trở thành một trong những nhà cung cấp và phát triển hệ thống quản lý (ERP) hàng đầu.
Và nếu bạn là ERP Developer đang tìm kiếm cơ hội phát triển sự nghiệp qua các dự án phát triển hệ thống ERP, đừng ngần ngại click apply để gia nhập Genuwin Solution ngay hôm nay.
Đường đua công nghệ tại Việt Nam đang nóng hơn bao giờ hết! Với sự xuất hiện của Top 6 công ty công nghệ Hàn Quốc, hy vọng bạn sẽ lựa chọn được “bến đỗ” phù hợp và sẵn sàng cháy hết mình với đam mê lập trình!
⇒ Và đừng quên, KICC HCMC X TopDev sẽ còn mang đến cho cộng đồng IT Việt Nam nhiều cơ hội mới. Hãy chờ đón những bài viết tiếp theo cùng những cơ hội mới hấp dẫn bạn nhé!
________________________________
Dự án được hỗ trợ bởi Korea IT Cooperation Center tại TP. HCM (KICC HCMC) – thuộc Cơ quan Xúc tiến CNTT Hàn Quốc (NIPA), phối hợp cùng TopDev – Nền tảng tuyển dụng CNTT hàng đầu tại Việt Nam với mục đích thúc đẩy tuyển dụng việc làm CNTT cũng như quảng bá cho các công ty IT Hàn Quốc trong cộng đồng lập trình viên lớn nhất tại Việt Nam.
Liên hệ: Korea IT Cooperation Center tại TP. HCM (KICC HCMC)
Senior Developer là gì? Có gì khác so với Junior Senior hay Fresher? Tuyển dụng IT đã có những tên gọi riêng nhằm phân loại các vị trí khác nhau. Senior Developer là một trong số đó. Tuy nhiên, bạn đã có cách hiểu chính xác về thuật ngữ này chưa? Cùng TopDev tìm hiểu tất tần tật về Senior Developer qua bài viết sau!
Senior Developer là gì?
Nhiều định nghĩa đã được đưa ra về cách hiểu Senior Developer? Vậy Senior Developer thật sự là gì? Trước hết hãy cùng tìm hiểu sơ lược về thế nào là Senior?
Bạn biết gì về thuật ngữ Senior?
Senior là gì? Senior được biết đến là một thuật ngữ mô tả các cá nhân sở hữu nhiều kinh nghiệm (cả về kỹ năng chuyên môn và trải nghiệm thực tế). Theo quá trình, năng lực của họ được nâng cao hơn từ nền tảng cơ sở thông qua các giai đoạn tiền phát triển trước đó như Intern, Fresher, Junior,…
Senior Developer là gì?
Senior chỉ những người có thâm niên trong nghề lâu hơn. Do vậy, không quá để gọi họ là những tiền bối hoặc cấp cao. Thời gian “thăng tiến” của một Junior lên Senior đòi hỏi sự tập trung vào sự nghiệp phát triển của mỗi cá nhân.
Không có một thước đo cụ thể về thời gian. Vì nó chỉ mang tính tương đối. Đặc biệt, tùy thuộc vào từng quy mô – loại hình doanh nghiệp, việc phân loại và đánh giá một Senior sẽ dựa trên nhiều yếu tố khác nhau.
Senior Developer là gì?
Senior Developer là thuật ngữ được quy chiều đến đối tượng là các lập trình viên cấp cao. Một thực tế là họ dễ dàng nắm bắt và làm tốt mọi thứ trong bất kỳ một giai đoạn nào của công việc ngành IT. Nắm rõ quy trình thực hiện, các khâu có liên quan; tất tần tật đều được họ điều phối và vận hành một cách trơn tru, chuyên nghiệp nhất. Đặc biệt hơn, họ lại có khả năng kết nối, trao đổi để tìm ra các mong muốn của khách hàng.
Điểm nổi trội của Senior nằm ở nền tảng tư duy, năng lực nhận biết về quá trình thực hiện, giải quyết các nhiệm vụ. Đồng thời, họ vẫn song song tự hoàn thiện và phát triển mình lên một mức cao hơn (có thể là Senior Manager). Chính điều này kích thích họ luôn thử sức, rèn luyện bản thân để có những trải nghiệm phong phú hơn.
Một Senior “cừ khôi” sẽ phát huy tốt óc sáng tạo, năng lực thích ứng, các kỹ năng của mình một cách thuần thục. Các lập trình viên cấp cao phải có khả năng quản lý các project, lập kế hoạch, đặt ra định hướng; dẫn dắt, hướng dẫn, hỗ trợ team để đạt được các mục tiêu đề ra.
Tố chất để trở thành một Senior Developer
Không ngại thất bại!
Một Senior Developer chắc chắn sẽ phải trải qua nhiểu áp lực. Biết đâu những thời gian đầu, bạn đã gặp lại các thất bại. CV cho sinh viên IT mới ra trường (CV IT student) hoặc CV IT Developer của bạn không tạo được ấn tượng với nhà tuyển dụng. Hoặc khi đi làm, bạn chịu sự áp lực từ sếp, từ đồng nghiệp,…Đôi khi nó nhiều đến mức khiến bạn bị stress.
Senior Developer có những tố chất đặc biệt.
Áp lực từ nhiều phía và rất nhiều sự mâu thuẫn sẽ nảy sinh. Đó cũng chính là lúc bạn rơi vào trạng thái phức tạp. Ai cũng thích sự đơn giản. Nếu đã là một Senior Developer, bạn phải sống trong áp lực tổn tại của ngành lập trình.
Đừng đánh giá thấp bất cứ ai!
Đây có lẽ nghiêng về phần giá trị của nhân cách nhiều hơn. Thế nhưng, bạn phải hiểu Senior Developer chỉ là một thuật ngữ mô tả các cá nhân với bề dày kinh nghiệm. Tuy vậy, ứng với từng vị trí được phân chia cụ thể, thì mỗi Senior Developer là một mảnh ghép trong doanh nghiệp.
Đừng bao giờ đánh giá thấp bất kỳ ai vì mỗi người đều có điểm mạnh – điểm yếu riêng. Dù bạn có là một người hoàn hảo những chắc chắn, bạn vẫn có những nỗi sợ của riêng mình. Thay vào đó, hãy học hỏi lẫn nhau để nâng cao trình độ, kỹ năng; kết nối các khía cạnh chuyên sâu để phát triển một cách toàn diện hơn.
Điểm nhấn từ sự kết nối
Xây dựng phần mềm cần có sự kết nối giữa trình độ (tức vận dụng lý thuyết khoa học chuyên ngành, trải nghiệm thực tiễn) và nhu cầu, mong muốn của khách hàng. Bên cạnh đó, sự kết nối này sẽ trở nên chặt chẽ hơn nhờ vào sự ảm hiểu các công cụ; tinh thần đồng đội, sự quản lý vận hành của tổ chức. Do đó, mỗi Senior Developer cần tìm ra sự kết nối trong mọi quy trình làm việc. Có thể mỗi sản phẩm, mỗi dự án, mội thành quả sẽ mang lại những giá trị tương xứng.
Tố chất của người lãnh đạo
Đây được xem là tố chất quan trọng. Vì nó không những giúp hình thành nên một Senior Developer giỏi mà còn quyết định đến sự phát triển nghề nghiệp.
Một Senior Developer phát triển độc lập, họ có thể làm bất cứ điều gì. Thế nhưng, để phát triển họ cần cộng tác với team. Bản thân họ tự hiểu rằng để thực hiện các nhiệm vụ lớn, họ cần một team luôn hổ trợ nhau. Một Senior Developer cần có trách nhiệm dẫn dắt đồng đội; luôn phấn đấu để cải thiện trình độ – kỹ năng của chính bản thân mình. Họ sẽ biết cách tạo điều kiện để bản thân và team của mình có thể phát triển tốt nhất.
Đặc biệt hơn, Senior Developer sẽ hiểu rằng bản thân họ không tạo ra quyền lực để buộc người khác làm việc. Họ cần sở hữu tố chất lãnh đạo để trao quyền cho mọi người. Họ phải là một đàn anh, một người dẫn dắt, một người truyền đạt kinh nghiệm để giúp mỗi cá nhân trong team đều có thể phát triển.
Nếu một team có một Senior Developer với vai trò lãnh đạo tốt, team sẽ thành công. Điều này giúp team dễ dàng đạt được những kế hoạch; cùng nhau nâng cao chuyên môn nghề nghiệp. Và biết đâu, mỗi cá nhân Developer đều có những định hướng cụ thể hơn trong sự nghiệp lập trình IT của mình.
Một Senior Developer sẽ làm những gì?
Những công việc chính
+ Connect với khách hàng; lắng nghe cá feedback, các phát sinh từ vấn đề từ khách hàng
+ Phân tích, đánh giá và thảo luận với team để cùng tìm ra các giải pháp/cách thức phù hợp. Đồng thời, quy định mức thời gian dự kiến hoàn thành. Chủ động liên hệ khách hàng, đảm bảo sự kết nối và thông tin về sự cam kết giải quyết nhiệm vụ.
+ Phân chia nhỏ các công việc; hướng dẫn các thành viên còn “non” trong tay nghề. Hỗ trợ họ, giúp họ bắt nhịp chung với các cá nhân khác để đạt hiệu suất cao nhất.
+ Duyệt code và thực hiện chạy thử các phương án test. Theo dõi và đánh giá tiềm nang mỗi giải pháp.
+ Fix lại các chỗ bị lỗi và chưa hoàn thiện. Senior Developer cần đảm bảo chu trình chạy thử chương trình ổn định, không phát sinh lỗi và đạt những yêu cầu như mong muốn.
Có thể nói, Senior Developer là một người dẫn đầu với năng lực toàn diện được thể hiện ở tất cả các khía cạnh. Mọi quy trình đều được họ nắm bắt, điều tiết và quản lý một cách tốt nhất. Họ có sự cầu tiến, do vậy họ thật sự tỉ mỉ và chỉn chu trong việc tổ chức thực hiện các giai đoạn công việc.
Đối với Senior Developer, họ không quá khó để khai thác và kết nối chính xác với nhu cầu của khách hàng. Dựa trên những trải nghiệm, họ biết đâu là những cách thức phù hợp để tìm ra sự phụ ứng với mong muốn từ các khách hàng khó tính nhất.
Lộ trình thăng tiến của một Senior Developer có gì thú vị?
Một điều đáng lưu tâm
Mỗi người sẽ có một thời điểm phù hợp để phát triển sự nghiệp của mình. Đỉnh cao sự nghiệp là do mỗi cá nhân tự thỏa mãn. Và việc so sánh hoặc áp đặt lộ trình thăng tiến là điều hạn chế. Vì đơn giản mọi thứ đều có tính chất tương đối.
Do vậy, sự hướng dẫn dưới đây không thể phù hợp với tất cả dân lập trình. Với một số người, vai trò quản lý có thể tốt hơn. Hoặc đơn giản bạn chỉ dừng lại ở việc thích viết code.
Đồng thời, các yếu tố khác có thể chi phối nhiều hơn. Điều này quyết định sự thành công của bạn. Hãy hiểu bản thân trước tiên, bạn thật sự mong muốn điều gì? Từ đó lập kế hoạch phát triển lộ trình thăng tiến cho riêng mình.
Fresher
Fresher chỉ những sinh viên mới ra trường. Sự va chạm chưa nhiều và có thể nói, họ đều là những “lính mới” của giới lập trình viên. Lợi thế của họ là sự chuẩn bị gần như là kỹ lưỡng về hành trang do quá trình dài rèn luyện tại giảng đường.
Nếu bạn đang apply vị trí Mobile App Developer tại một doanh nghiệp thì chiếc CV IT Developer chuẩn có thể giúp các newbie nâng cao khả năng ghi điểm của mình. Tuy nhiên, để thành công và nhanh chóng hòa nhập môi trường lập trình chuyên nghiệp, họ cần phải nỗ lực rất nhiều.
Junior Developer
Với số năm kinh nghiệm ít ỏi, cái họ nó là nền tảng trải nghiệm; những bước đi đầu trong việc tiếp cận thế giới lập trình. Họ sẽ bắt đầu đi sâu hơn vào việc phân tích lập trình ứng dụng dựa vào thực tế nhiều hơn. Hiểu biết về cơ sở dữ liệu, lưu trữ và xuất dữ liệu, nắm bắt các chức năng là những họ cần phải phát huy.
Senior Developer
Bạn có thể tự hào đôi chút khi bản thân được công nhận là một Senior Developer chính hiệu. Bạn hoàn toàn có thể xử lý các vấn đề; chịu trách nhiệm đảm nhận các dự án lớn; quản lý, áp dụng, thực hiện và giải quyết nhiệm vụ phức tạp nhất. Một điểm nhấn quan trọng của Senior Developer chính là mức độ am hiểu sâu sắc về cơ sở dữ liệu và các dịch vụ ứng dụng,…
Để đạt được level này, tất nhiên sẽ phụ thuộc vào sự cố gắng của bạn. Bạn dường như đào sâu hơn trong chính chuyên môn của mình. Bạn là người đưa ra các quyết định quan trọng về cách thức thực hiện của một hoặc nhiều dự án. Vì đơn giản, bạn hiểu rõ về cơ chế hoạt động, sự liên kết giữa các công cụ công nghệ,… Bạn dần trở thành một chuyên gia quản trị con người, quản lý một quy trình phát triển phần mềm hơn là một người đội trưởng hướng dẫn đồng đội.
Quản lý cấp trung
Hai chức danh quan trọng thường sẽ là Product Manager hoặc Project Manager. Ở giai đoạn này, bạn sẽ có vai trò lớn trong việc quy định về chuẩn chất lượng/đầu ra mà một sản phẩm nào đó thông qua nghiên cứu, phân tích.
Quản lý cấp cao
Bạn từng nghe về CTO hoặc CEO chưa? Vâng, chính xác là nó. Bạn không chỉ đơn thuần là một chuyên gia về lập trình, một người hiểu sâu rộng về công nghệ, mà bạn còn là người truyền cảm hứng; tạo động lực, vạch ra các chiến lược phát triển và dẫn dắt các leader theo một sứ mệnh, tầm nhìn nào đó. Điều này có nghĩa, bạn đang là nhân tố quyết định đến số phẫn thành hay bại của một tổ chức.
Đâu là những kỹ năng quan trọng của một Senior Developer?
Nhiều kỹ năng quan trọng có thể chi phối đến quá trình phát triển của một Senior Developer. TopDev sẽ chỉ ra một số kỹ năng ảnh hưởng trực tiếp đến sự thăng tiến của một Senior Developer.
Những kỹ năng nào quan trọng đối với một Senior Developer?
Chuyên sâu về công nghệ
Khác với Junior, Senior Developer phải là người có nhiều kinh nghiệm. Những kinh nghiệm đó được phát triển hơn thông qua quá trình dài làm việc với công nghệ/ngôn ngữ lập trình. Càng nhiều dự án với các đặc thù tính chất, môi trường làm việc khác nhau, bạn sẽ có cơ hội nâng cao năng lực của mình. Nhận ra thế mạnh về chuyên môn, đặc biệt là về khía cạnh công nghệ – kỹ thuật. Đồng thời lại biết được đâu là những hạn chế cần khắc phục.
Không chỉ có kỹ năng đánh giá năng lực bản thân, là một Senior, bạn còn phải biết cách đánh giá mức độ hiệu quả của các công cụ công nghệ. Dự án nào dùng công cụ nào để xử lý. Mọi thứ cần được diễn tiến một cách khoa học.
Kỹ năng “múa” code
Chuyên nghiệp trong việc viết code đôi khi khó thể hiện toàn diện năng lực của một Dev. Thế nhưng, nếu xét trên khía cạnh kỹ năng, Junior chỉ cần viết code cho chạy là được. Còn nếu là Senior, bạn không chỉ đơn thuần viết đúng hạn deadline, mà việc viết code phải tinh gọn, nhanh chóng. Yếu tố quyết định chính là khả năng bảo trì code. Đó cũng là điều mọi Senior Developer cần nhớ.
Tính đa nhiệm
Khi là một Senior Developer, bạn cần phải tiếp cận với các task lớn hơn. Điều đó đồng nghĩa, bạn phải am hiểu nhiều công cụ hơn. Senior Developer sẽ chia nhỏ thành từng task khác nhau. Đồng thời, phải quan tâm đến vấn đề đánh giá, phân tích mức độ khả thi, tính hiệu quả của các giải pháp. Điều này cho thấy họ phải là người hiểu rõ về cơ chế hoạt động của doanh nghiệp. Đó là cơ sở quan trọng để Senior tìm ra các mấu chốt, cách thức giải quyết phù hợp – khả thi nhất cho mọi vấn đề.
Thái độ cầu tiến
Nếu bạn đã giỏi, hãy làm cách nào đó để mình trở nên giỏi hơn. Senior Developer có thể tự học thêm vì mọi kiến thức đều có thể được cập nhật mới hơn mỗi ngày. Là một Senior, bạn cần phải hỗ trở nhiều đàn em khi họ có những vấn đề chưa giải quyết được; trực tiếp góp ý kiến, đưa ra các phán đoán trước những quyết định. Thái độ cầu thị và giúp đỡ; tính trách nhiệm với mỗi thứ mình làm đều góp phần tạo ra chân dung của một Senior Developer chuyên nghiệp.
Thu nhập của một Senior Developer như thế nào?
Mức lương phụ thuộc rất nhiều vào trình độ và số năm kinh nghiệm mà mỗi cá nhân sở hữu. Và tùy vào từng công ty, mức độ chênh lêch về lương có thể rơi vào các mức sau đây:
+ Dưới 1 năm kinh nghiệm: 5 – 10M
+ Từ 1-3 năm kinh nghiệm: 12 – 24M
+ Từ 3- 5 kinh nghiệm: 20 – 35M (Senior Developer)
+ Trên 5 kinh nghiệm: 30M – 100M (tuỳ thuộc trình độ chuyên môn)
Trên thực tế mức lương có thể sẽ thay đổi dựa trên những nỗ lực cá nhân của bạn. Vì vậy, bạn hãy chứng tỏ bản thân là một Senior Developer thực thụ để có những phúc lợi xứng đáng.
Lời kết
Senior Developer là những cá nhân thuộc nhóm ngành đang phát triển bật nhất. Họ được quan tâm và có cơ hội được tào đạo bài bản hơn. Tuy vậy, bản thân chính họ cũng tự rèn luyện để bản thân được hoàn thiện hơn. Thông qua bài viết này, TopDev hi vọng bạn sẽ biết được thế nào là Senior Developer. Đồng thời, đây là những thông tin cơ sở để bạn tự nhìn nhận, đánh giá lại bản thân. Từ đó, điểm lại những thiếu sót trong kinh nghiệm, kỹ năng để lập kế hoạch bồi dưỡng cho bản thân. Chúc cho con đường phát triển ngành lập trình của các bạn sẽ thật sự may mắn!