Bài viết được sự cho phép của BBT Tạp chí Lập trình
Trong bài trước chúng ta đã tìm hiểu về Component API. Trong bài này, chúng ta sẽ tìm hiểu về vòng đời của một React Component (Component Life Cycle) và các methods để quản lý vòng đời.
componentWillMount đây là method sẽ được thực thi trước khi một component được render trên cả server side và client side
componentDidMount method này được thực thi khi 1 component được render trên client side. Đây là nơi các hàm AJAX, DOM hoặc update state được thực thi. Method này cũng được sử dụng để kết nối tới các JS Framework khác và các function với delayed execution như setTimeout hoặc setInterval.
componentWillReceiveProps sẽ được thực thi ngay khi thuộc tính props được update và trước khi component được render lại.
shouldComponentUpdate sẽ trả về kết quả true or false. Phương thức này sẽ xác định một component có được update hay không. Mặc định là true, nếu bạn không muốn một component render lại khi update state hay propst thì return giá trị thành false.
componentWillUpdate được gọi khi chúng ta update state của component trước khi nó render lại.
componentDidUpdate sau khi componentWillUpdate ở trên được gọi xong thì đến lượt method này được gọi.
componentUnmount được gọi khi một component được xóa khỏi React.
Bây giờ chúng ta comment lại code component Form ở các bài trước để tránh rối.
Xong rồi thì chúng ta tạo một component như đoạn code sau:
Và cuối cùng chúng ta vào console log để kiểm tra mỗi lần chúng ta click vào button increment
Khi load trang thì chỉ có 2 method này được thực thi:
Khi chúng ta click vào button INCREMENT quá trình update state xảy ra và các life cycle methods khác sẽ được thực hiện.
Còn quá trình unmounting xảy ra khi component bị remove khỏi DOM, hay nói một cách khác là hàm componentWillUnmount sẽ được gọi khi render ra không có component nào hoặc người dùng chuyển hướng trang web.
Thế là chúng ta đã xong. Hãy cùng chờ đợi bài tiếp theo nhé.
Sau khi mở Panel Network trên DevTools, ấn Ctrl+R để refresh lại trang, lúc này các sự kiện của network sẽ được ghi lại và hiển thị trên tab
Bên dưới cùng, là thông tin về tổng số request đã gửi, tổng dung lượng đã down về
Cái chart phía trên sẽ cho thấy cái nhìn khái quát về các sự kiện của network theo biểu đồ thời gian
Trong table network log
Status: mã response của HTTP
Type: resource type
Initiator: cho biết đứa nào đã gây ra request
Size: size của resource
Time: tổng số thời gian dùng để download/upload resource
Waterfall: chart mô tả thời điểm request, thời gian request của một resource
Click vào để hiển thị thêm thông tin trên từng resource, cột size sẽ cho biết là resource này đã được compress chưa.
Giá trị ở trên là size chưa compress, ở dưới là đã compress, nếu cả 2 giá trị này bằng nhau thì compress không chạy
Network log sẽ liên tục record thông tin khi có network request mới, nếu đã có đủ thông tin muốn lấy, click Stop Record để dừng việc record này lại
Các column hiển thị trên Network log có thể tùy biến dễ dàng bằng cách click chuột phải lên tên cột
Để giả lập môi trường mạng của mobile, sử dụng Network Throttling
Để kiểm tra lần load đầu tiên, trước hết chúng ta xóa cache của trình duyệt bằng cách click và giữ vào nút refresh , chọn “Empty Cache and Hard Reload”, nó sẽ xóa hết cache trên trang hiện tại trước khi load
Chúng ta có thể dùng tab Network để tìm một string trong header và message body.
Thí dụ, chúng ta muốn kiểm tra các resource có sử dụng cơ chế cache phù hợp chưa, nếu resource không thay đổi thường xuyên, trình duyệt nên được thông báo để cache các resource này. Cơ chế cache này được thiết đặt trong header, click nút search để hiển thị ô search, nhập Cache-Control rồi enter, chúng ta sẽ có toàn bộ thông tin Cache-control: max-age của từng resource
Với ô filter, chúng ta cũng có vài tip trên ô filter này
Có thể dung regex, ví dụ /.*\.[cj]s+$/ sẽ bỏ qua resource ko có chữa chữ c hoặc j
Thêm dấu - phía trước để loại bỏ, như -main.css sẽ bỏ qua các resource có chứa main.css
domain:*anluu.com để lọc các resource load từ anluu.com
Trường hợp muốn block một resource nào đó để kiểm tra xem chuyện gì sẽ xảy ra khi chúng ta ko load nó.
Thí dụ chúng ta sẽ bỏ qua file stylesheet khi load trang, ấn tổ hợp phím Ctrl+Shift+P để mở menu, gõ Blocking -> chọn Show Request Blocking
Bài viết được sự cho phép của tác giả Trần Anh Tuấn
Chắc hẳn các bạn khi nghe về cách sử dụng biến trong CSS sẽ nghĩ ngay đến các CSS Preprocessors như SASS hay LESS. Hoặc nếu không thì cũng suy nghĩ sử dụng biến trong CSS làm sao mà được nhỉ ?
Sau một thời gian dùng biến với SASS mình có tìm tòi và nghiên cứu liệu trong CSS thuần có thể sử dụng biến không nhỉ mà không cần phải dùng SASS hay LESS.
Nếu được như thế thì tiện lắm, các bạn mới học chưa biết cách dùng SASS hay LESS thì có thể học cách sử dụng biến trong CSS để làm quen trước sau này vào làm với SASS hay LESS đỡ bỡ ngỡ khi sử dụng biến.
Vì thế hôm nay mình xin chia sẻ những kiến thức về biến trong CSS để các bạn có thể hiểu rõ nó như thế nào, cách dùng ra sao nhé.
# Tại sao nên sử dụng biến
Có rất nhiều lý do để sử dụng biến trong CSS. Nhưng theo bản thân mình thấy thì khi sử dụng biến thì số lượng code bị lặp lại được hạn chế và dễ dàng tùy chỉnh. Chỉ cần dùng biến và thay đổi giá trị biến thì tất cả các elements dùng biến đó đều thay đổi theo.
Khi làm chắc chắn các bạn sẽ gặp các trường hợp như thế này. Cả 3 elements này đều dùng chung 1 mã màu, khiến code bị lặp đi lặp lại.
Cách khai báo cũng đơn giản thôi các bạn sử dụng theo cú pháp này: --tênbiến: giá trị. Tên biến bắt buộc phải bắt đầu bằng 2 dấu - nhá. Ví dụ --color-red: red.
Thường thường khi dùng biến trong CSS mình hay khai báo biến trong pseudo :root(thẻ <html>) tức là ở vị trí cao nhất, để các thành phần trong trang có thể kế thừa từ nó. Tại sao để trong thẻ <html> vì thẻ <html> là phần tử cao nhất, các thành phần trong trang đều là phần tử con của thẻ <html>.
:root{
--ten-bien: gia tri;
--background-main-color: #ffa400;
}
Cách sử dụng cũng đơn giản nốt theo cú pháp sau: var(tên biến).
Có nghĩa là khi code các bạn có thể kế thừa từ thẻ <html> để sử dụng các biến từ nó. Tuy nhiên các bạn cũng có thể set riêng cho chính phần tử mà các bạn đang làm hoặc phần tử cha bọc nó. Để mình ví dụ cho các bạn dễ hiểu.
Giờ ở thẻ <html> mình tạo 1 biến là --red có giá trị là red và thẻ div có class other-box sử dụng thuộc tính background-color và dùng biến --red từ thẻ <html> thì lúc này box này sẽ có background màu đỏ đúng không?
Tuy nhiên nếu mình muốn set biến cho chính cái box đó riêng mà không cần phải sử dụng từ thẻ <html> có được không ? Xin thưa các bạn là được nha. Các bạn có thể sử dụng như này
:root {
--red: red;
}
.other-box {
/* dùng biến --red ở bên trong để ghi đè ở :root*/
--red: pink;
background-color: var(--red);
}
Lúc này biến mà div có class other-box sử dụng là --red của chính nó chứ không phải của thẻ <html> nữa. Nó ưu tiên từ trong ra ngoài, giống kiểu đơn vị em mà mình nói ở bài sự khác nhau giữa đơn vị em và rem.
Nếu nó hoặc phần tử cha chứa nó không có thuộc tính font-size thì nó cứ lấy ra ngoài cho đến khi tới thẻ <html>.
Ở đây biến cũng thế. Nó cũng ưu tiên từ trong ra ngoài. Vì thế nên giờ cái other-box sẽ có màu hồng.
Nếu các bạn làm mà không dùng em hay rem hay % mà chỉ sử dụng px thì các bạn có thể dễ dàng làm responsive với biến như thế này. Các bạn có thể áp dụng tương tự với đơn vị em và rem hay % nha.
Đó là điểm hay đó các bạn. Khi xuống màn hình các bạn mong muốn chỉ cần thay đổi giá trị của biến lại là mọi thứ sẽ thay đổi theo ý muốn của các bạn. Quá tuyệt vời phải không nào.
Ảnh lấy từ CSS Tricks để demo
Vậy thì so với các CSS Preprocessors thì như thế nào ? Nó có khác biệt gì hay ưu điểm nhược điểm gì so với SASS hay LESS không ? Các bạn có thể đọc bài này của CSS Tricks viết rõ ràng chi tiết lắm nha.
# Trình duyệt hỗ trợ
Hiện tại thì số lượng sử dụng CSS Variables toàn cầu là 87.52%. Hỗ trợ hầu hết trong các trình duyệt hiện đại nhưng không hỗ trợ đối với IE và Opera Mini. Các bạn cẩn thận khi làm việc với khách hàng hay công ty yêu cầu phải đáp ứng IE hay Opera Mini nhé.
# Sử dụng biến với @supports
Nếu các bạn thích dùng biến trong CSS quá mà lại sợ trúng IE hay Opera Mini thì toi mạng. Vì thế cách tốt nhất đó là sử dụng thuộc tính @supports trong CSS để xử lý trường hợp trình duyệt không hỗ trợ biến trong CSS. Các bạn có thể tìm hiểu về thuộc tính @supportstại đây.
Sau khi các bạn tìm hiểu rồi thì chắc hẳn các bạn cũng biết sơ sơ cách dùng. Mình sẽ áp dụng chúng vào trong bài này. Nếu máy bạn nào không có Opera Mini hay IE thì dùng giả lập test thử coi sao hoặc làm cho khách hàng dùng mấy trình duyệt đó là biết kaka.
Ở trên mình làm 1 ví dụ nhỏ là nếu trình duyệt hỗ trợ biến trong CSS bằng cách sử dụng @supports (--css: variables) {} thì thẻ <h1> mới có thể sử dụng biến và lúc này thẻ <h1> sẽ có chữ màu đỏ. Còn nếu trình duyệt không hỗ trợ thì thẻ <h1> sẽ có chữ màu xanh.
Các bạn có thể xem demo Codepen dưới đây. Nếu các bạn có các trình duyệt IE hay Opera thì Test thử xem nó hiển thị đúng không nha. À Codepen chỉ chạy được từ IE 11 trở đi, nếu các bạn muốn Test ở IE 10 hay thấp hơn thì copy code về máy rồi chạy thử nha.
# Lời kết
Phù!!! Bài này dài phết cũng may là mình có tìm được 2 bài nói về thuộc tính @supports và sự khác nhau giữa biến trong CSS so với SASS hay LESS chớ viết vào nữa chắc dài lắm.
Ah trang web của mình có sử dụng biến đó các bạn. Các bạn có thể Inspect Code(F12) để coi nha. Do mình tập trung chủ yếu ở Việt Nam nên chắc hầu hết dùng Chrome và Firefox nên mình không dùng thuộc tính @supports hihi.
Hi vọng bài viết sẽ cung cấp thêm cho các bạn nhiều kiến thức mới để ngày càng giỏi hơn và làm việc tốt hơn nhé. Nếu các bạn có ý kiến gì hay, hoặc góp ý thì bình luận bên dưới giúp mình để mình có động lực viết bài tiếp nè. Chúc các bạn ngày làm việc năng động và tốt lành nà.
Hằng số là một giá trị cố định và không thay đổi. Cũng như các ngôn ngữ lập trình khác để khai báo hằng số trong Go chúng ta sử dụng từ khóa const. Go hỗ trợ hằng số cho ký tự (character), chuỗi (string), kiểu bool (boolean), và các giá trị số (numeric values).
Từ khóa const có thể khai báo ở bất cứ đâu mà từ khóa var có thể.
Go cũng có vòng lặp For nhưng không có vòng lặp While, chúng ta có thể sử dụng cú pháp của vòng lặp For để thay thế cho While.
package main
import "fmt"
func main(){
fmt.Println("Go does not have While loop we should use For instead:")
i:=5
for i > 0{
fmt.Printf("%d\t",i)
i--
}
fmt.Println("\nBreak out of the loop:")
for {
fmt.Printf("loop \t")
break
}
fmt.Println("\nContinue to the next iteration of the loop:")
for n := 0; n <= 5; n++ {
if n%2 == 0 {
continue
}
fmt.Printf("%d\t",n)
}
fmt.Scanf("Pause")
}
Go does not have While loop we should use for instead:
5 4 3 2 1
Break out of the loop:
loop
Continue to the next iteration of the loop:
1 3 5
Câu lệnh điều khiển If/Else trong Golang
If/Else trong Golang có 1 điểm đặc biệt là có thêm sự ngắn gọn, chúng ta có thể gán giá trị hoặc lấy giá trị từ một hàm nào đó trên cú pháp của lệnh If.
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
)
var (
PASSWORD = "123456"
)
func getRandNumber(n int) int {
return rand.Intn(n)
}
func main() {
var password string
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("Enter your password:")
for scanner.Scan() {
password = scanner.Text()
break
}
if password == PASSWORD {
fmt.Printf("Your password is correct\n")
} else {
fmt.Printf("Your password is incorrect\n")
}
//Call a function get assign value to num variable.
if num := getRandNumber(20); num < 19 { fmt.Printf("number %d is smaller than 19\n", num) } if num := getRandNumber(20); num > 10 {
fmt.Printf("number %d is greater than 10", num)
} else if num < 10 {
fmt.Printf("number %d is smaller than 10", num)
} else {
fmt.Printf("number %d is equal to 10", num)
}
fmt.Scanf("Pause")
}
Enter your password:123456
Your password is correct
number 1 is smaller than 19
number 7 is smaller than 10
Switch Case trong Golang
Chúng ta có thể sử dụng nhiều điều kiện trong một case bằng dấu phẩy như ví dụ 1 bên dưới. Và chúng ta cũng có thể sử dụng switch như câu lệnh If/Else như ví dụ 2, và cũng giống như câu lệnh điều khiển If/Else Go cho phép ta gán hoặc gọi hàm để gán giá trị cho biến tại switch, như ví dụ 3.
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
var say string
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("Say something:")
for scanner.Scan() {
say = scanner.Text()
break
}
// 1. We can use commas for multiple expressions in the same case
switch say {
case "hello", "hi":
fmt.Println("Greetings")
case "good bye":
fmt.Println("Bye")
default:
fmt.Println("Unknow")
}
// 2. Switch without an expression
x := 10
switch {
case x < 10: fmt.Println("x is smaller than 10") case x > 10:
fmt.Println("x is greater than 10")
default:
fmt.Println("x is equal to 10")
}
// 3. Assign a value in the expression of switch
whatIsMyType := func(i interface{}) {
switch t := i.(type) {
case string:
fmt.Println("You are a string")
case int:
fmt.Println("You are an integer value")
default:
fmt.Printf("Your are %T", t)
}
}
whatIsMyType("Hello World")
whatIsMyType(1000)
whatIsMyType(true)
fmt.Scanf("Pause")
}
package main
import "fmt"
//Chu vi hình chữ nhật
//Rectangle Perimeter
//Cách khai báo 1
func rectPerimeter(a int, b int) int {
return (a + b) * 2
}
//Diện tích hình chữ nhật
//Rectangle Area
//Cách khai báo 2
func rectArea(a, b int) int {
return a * b
}
func main() {
a := 2
b := 3
rectPeri := rectPerimeter(a, b)
fmt.Printf("Perimeter of rectangle is %d\n", rectPeri)
rectAr := rectArea(a, b)
fmt.Printf("Area of rectangle is %d\n", rectAr)
fmt.Scanf("Pause")
}
Perimeter of rectangle is 10
Area of rectangle is 6
Hàm trả về nhiều giá trị (Multiple Return Values) trong Golang.
Hàm trả về nhiều giá trị trong Golang có các cách viết sau
Cách 1: Hàm với giá trị trả về
func [tên Hàm]([tên biến 1] , [tên biến 2] [kiểu biến]) ([kiểu trả về 1], [kiểu trả về 2]){
//thân hàm…
//logic tính toán…
return [giá trị trả về 1], [giá trị trả về 2]
}
Cách 2: Hàm khai bào trước tên của giá trị trả về, nếu đã khai báo trước giá trị trả về thì chỉ cần có return mà không cần phải bỏ các giá trị bên cạnh từ khóa return
func [tên Hàm]([tên biến truyền vào 1] , [tên biến truyền vào 2] [kiểu biến truyền vào]) ([tên biến trả về 1] [kiểu trả về 1], [tên biến trả về 2][kiểu trả về 2]){
//thân hàm…
//logic tính toán…
return
}
Cách 3: Hàm khai báo trước tên giá trị trả về với cách viết rút gọn kiểu trả về nếu tất cả các giá trị trả về cùng kiểu.
func [tên Hàm]([tên biến truyền vào 1] , [tên biến truyền vào 2] [kiểu biến truyền vào]) ([tên biến trả về 1], [tên biến trả về 2][kiểu trả về]){
//thân hàm…
//logic tính toán…
return
}
package main
import "fmt"
//Chu vi hình chữ nhật
//Rectangle Perimeter
func rectPerimeter(a int, b int) int {
return (a + b) * 2
}
//Diện tích hình chữ nhật
//Rectangle Area
func rectArea(a, b int) int {
return a * b
}
//Chu vi và diện tích hình chữ nhật cách 1
func rectPeriAndArea1(a, b int) (int, int) {
rectPeri := rectPerimeter(a, b)
rectArea := rectArea(a, b)
return rectPeri, rectArea
}
//Chu vi và diện tích hình chữ nhật cách 2
func rectPeriAndArea2(a, b int) (rectPeri int, rectAr int) {
rectPeri = rectPerimeter(a, b)
rectAr = rectArea(a, b)
return
}
//Chu vi và diện tích hình chữ nhật cách 3
func rectPeriAndArea3(a, b int) (rectPeri, rectAr int) {
rectPeri = rectPerimeter(a, b)
rectAr = rectArea(a, b)
return
}
func main() {
a := 2
b := 3
rectPeri1, rectAr1 := rectPeriAndArea1(a, b)
fmt.Printf("rectPeri1=%d, rectAr1=%d\n", rectPeri1, rectAr1)
rectPeri2, rectAr2 := rectPeriAndArea2(a, b)
fmt.Printf("rectPeri2=%d, rectAr2=%d\n", rectPeri2, rectAr2)
rectPeri3, rectAr3 := rectPeriAndArea3(a, b)
fmt.Printf("rectPeri3=%d, rectAr3=%d\n", rectPeri3, rectAr3)
fmt.Scanf("Pause")
}
Hàm bất định (Variadict Function) là một hàm chấp nhận số lượng đối số khác nhau và không biết trước.
Chúng ta có thể thấy có dấu … ngộ ha. Nhưng nó có ý nghĩa để khai báo số phần tử không biết trước của đối số truyền vào hàm.
Hàm này cũng nhận giá trị là một array nhưng sau array này lại có dấu … vậy nó có ý nghĩa là gì nhỉ? Dấu … này sẽ tự động phân tách các phần tử tròng mảng thành các đối số vào hàm.
Ví dụ:
myArray = [1,2,3,4]
myArray… = 1,2,3,4
package main
import "fmt"
func min(numbers ...int) int {
result := numbers[0]
for _, num := range numbers {
if result > num {
result = num
}
}
return result
}
func main() {
fmt.Printf("min of 5,3,2 is %d\n", min(5, 3, 2))
fmt.Printf("min of 5,3,2,1 is %d\n", min(5, 3, 2, 1))
numbers := []int{5, 3, 2, 1, 0}
fmt.Printf("min of array [5,3,2,1,0] is %d", min(numbers...))
fmt.Scanf("Pause")
}
Từ khóa static trong Java chủ yếu được sử dụng để quản lý bộ nhớ. Chúng ta có thể áp dụng từ khóa static với các biến, phương thức, khối và các lớp lồng nhau. static có vai trò quan trọng trong lập trình Java, đặc biệt trong việc quản lý tài nguyên và hiệu suất của ứng dụng. Cùng tìm hiểu Static trong Java là gì?
Trong Java, từ khóa static được sử dụng để xác định rằng một thành viên của lớp (biến hoặc phương thức) thuộc về chính lớp đó, thay vì đối tượng (instance) của lớp. Điều này có nghĩa là thành viên static có thể được truy cập mà không cần khởi tạo đối tượng.
Chúng ta có thể áp dụng từ khóa static với các biến, các phương thức, các khối, các lớp lồng nhau(nested class).
Biến static (static variables): khi bạn khai báo một biến là static, thì biến đó được gọi là biến tĩnh, hay biến static.
Phương thức static (static methods): khi bạn khai báo một phương thức là static, thì phương thức đó gọi là phương thức static.
Khối static (static blocks): được sử dụng để khởi tạo thành viên dữ liệu static.
Lớp static (static class): một class được có thể được đặt là static chỉ khi nó là một nested class. Một nested static class có thể được truy cập mà không cần một object của outer class (lớp bên ngoài).
Import static: từ phiên bản Java 5, cho phép import các thành viên tĩnh (static member) của một class hoặc package vào một class khác bằng cách sử dụng từ khóa import và sau đó sử dụng chúng như là thành viên của lớp đó.
Biến static (static variables) trong Java
Trong Java, biến có thể được khai báo cùng với từ khóa static, và lúc đó nó có thể được gọi là class variable.
Việc cấp phát bộ nhớ cho biến static chỉ xảy ra một lần khi class được nạp vào bộ nhớ
Giá trị mặc định khi khai báo và khởi tạo biến static và non-static là giống nhau, cụ thể:
primitive integers (long, int, short, byte): 0
primitive floating points (double, float): 0.0
boolean: false
object references: null
Biến static có thể được sử dụng làm thuộc tính chung, để dùng chung dữ liệu cho tất cả objects (hoặc instances ) của lớp đó và điều đó giúp cho chương trình tiết kiệm bộ nhớ hơn
Nếu một biến vừa khai báo từ khóa final vừa khai báo từ khóa static thì nó được xem như là một hằng số. Một hằng số nên được viết hoa và nếu có nhiều từ thì phân cách bằng dấu gạch dưới (_)
public static final PI = 3.14;
Trong Interface, mặc định một biến sẽ được khai báo là public static final.
Nếu một biến được khai báo với từ khóa static thì bạn có thể truy cập trực tiếp thông qua lớp.
Ví dụ: Website gpcoder.com có rất nhiều bài viết, mỗi bài viết cần hiển thị địa chỉ của website dưới mỗi bài viết, địa chỉ này giống nhau và có nhiều lớp cần sử dụng. Để tiết kiệm bộ nhớ, dễ dàng chia sẻ và sử dụng ở các lớp khác. Chúng ta có thể sử dụng từ khóa static như sau:
MyWebsite.java
public class MyWebsite {
public static String WEBSITE = "gpcoder.com";
}
UsingStaticExample.java
public class UsingStaticExample {
private String subject;
UsingStaticExample (String subject) {
this.subject = subject;
}
public void print() {
System.out.println("Subject = " + subject);
System.out.println("Website = " + MyWebsite.WEBSITE);
}
public static void main(String[] args) {
UsingStaticExample ex1 = new UsingStaticExample("Core Java");
ex1.print();
System.out.println("----");
UsingStaticExample ex2 = new UsingStaticExample("Object Oriented Programing");
ex2.print();
}
}
Một ví dụ khác thường hay được sử dụng để minh họa cho việc sử dụng từ khóa static là bộ đếm Counter. Bạn có một website và bạn cần đếm số lượt truy cập vào trang. Bạn viết chương trình như sau:
public class Counter {
int count = 0;
public Counter() {
}
public void visit() {
count++;
this.print();
}
public void print() {
System.out.println("count = " + count);
}
public static void main(String[] args) {
Counter c1 = new Counter();
c1.visit();
Counter c2 = new Counter();
c2.visit();
Counter c3 = new Counter();
c3.visit();
}
}
Kết quả thực thi chương trình trên
count = 1
count = 1
count = 1
Bạn thắc mắc tại sao kết quả ra kỳ vậy, rõ ràng là tôi đã tăng số lượng truy cập lên rồi mà.
Đó là bởi vì, biến count lấy bộ nhớ tại thời điểm tạo đối tượng, mỗi đối tượng sẽ có bản sao của biến instance, nếu biến count được tăng lên, nó sẽ không ảnh hướng đến các đối tượng khác. Vì thế mỗi đối tượng sẽ có giá trị 1 trong biến count.
Như bạn đã thấy ở trên, biến static sẽ lấy bộ nhớ chỉ một lần, nếu bất cứ đối tượng nào thay đổi giá trị của biến static, nó sẽ vẫn ghi nhớ giá trị của nó.
public class Counter {
static int count = 0;
public Counter() {
}
public void visit() {
count++;
this.print();
}
public void print() {
System.out.println("count = " + count);
}
public static void main(String[] args) {
Counter c1 = new Counter();
c1.visit();
Counter c2 = new Counter();
c2.visit();
Counter c3 = new Counter();
c3.visit();
}
}
Nếu một phương thức được khai báo với từ khóa static thì phương thức đó được gọi là phương thức static.
Một số đặc điểm:
Một phương thức static thuộc lớp chứ không phải đối tượng của lớp.
Một phương thức static có thể được gọi mà không cần tạo khởi tạo (instance) của một lớp.
Phương thức static có thể truy cập biến static và có thể thay đổi giá trị của nó.
Một phương thức static chỉ có thể gọi một phương thức static khác, không thể gọi được một phương thức non-static.
Một phương thức static không thể được sử dụng từ khóa this và super.
Người dùng không thể override (đè) phương thức static trong Java, bởi vì kỹ thuật đè (overriding) phương thức được dựa trên quá trình gán (binding) động khi khi chương trình đang chạy (runtime) và những phương thức static được gán tĩnh trong thời gian biên dịch. Phương thức tĩnh không ràng buộc với thực thể của lớp nên phương thức tĩnh sẽ không thể override (đè).
Khi nào sử dụng từ khóa static cho một phương thức?
Khi phương thức không phụ thuộc vào trạng thái của đối tượng, nghĩa là không cần sử dụng bất kỳ dữ liệu thành viên nào của đối tượng, mọi thứ được truyền như các tham số (parameter).
Các phương thức tiện ích là một trường hợp thường được sử dụng nhất trong Java vì chúng có thể được truy cập trực tiếp bằng tên lớp mà không cần tạo bất thể hiện nào. Lớp java.lang.Math là một ví dụ trường hợp sử dụng static method.
Khối static được dùng để khởi tạo hoặc thay đổi giá trị của các biến static.
Nó được thực thi trước phương thức main tại thời gian tải lớp.
Một class có thể có nhiều static blocks.
Ví dụ:
public class UsingStaticExample {
private static String subject;
static {
System.out.println("Khối static được gọi");
}
static {
subject = "Khối static (static blocks)";
}
UsingStaticExample () {
System.out.println("hàm main() được gọi");
System.out.println("Subject = " + subject);
}
public static void main(String[] args) {
UsingStaticExample ex1 = new UsingStaticExample();
}
}
Kết quả:
Khối static được gọi
hàm main() được gọi
Subject = Khối static (static blocks)
Lớp static (static class)
Một class được có thể được đặt là static chỉ khi nó là một nested class (tức nằm trong một lớp khác). Một nested static class có thể được truy cập mà không cần một object của outer class (lớp bên ngoài).
Ví dụ:
public class UsingStaticExample {
private String subject;
UsingStaticExample (String subject) {
this.subject = subject;
}
// nested static class
static class MyWebsite {
public static String WEBSITE = "gpcoder.com";
}
public void print() {
System.out.println("Subject = " + subject);
System.out.println("Website = " + MyWebsite.WEBSITE);
}
public static void main(String[] args) {
UsingStaticExample ex1 = new UsingStaticExample("Core Java");
ex1.print();
}
}
Kết quả:
Subject = Core Java
Website = gpcoder.com
Import static trong Java
Java cho phép import các thành viên tĩnh (static member) của một class hoặc package vào một class khác bằng cách sử dụng từ khóa import và sau đó sử dụng chúng như là thành viên của lớp đó.
Ví dụ:
SystemConfig.java
package com.gpcoder;
public final class SystemConfig {
public static final String USER_NAME = "gpcoder";
public static final String PASSWORD = "123";
public static final String EMAIL = "gpcodervn@gmail.com";
private SystemConfig() {
}
}
StaticImportDemo.java
package com.gpcoder;
import static com.gpcoder.SystemConfig.*;
public class StaticImportDemo {
public static void main(String[] args) {
System.out.println("Username: " + USER_NAME);
System.out.println("Password: " + PASSWORD);
System.out.println("Email: " + EMAIL);
}
}
Như bạn thấy, khi sử dụng import static chúng ta có thể gọi trực tiếp các thành viên mà không cần phải thông qua tên class, chẳng hạn SystemConfig.USER_NAME
Ứng dụng của static
Tiết kiệm bộ nhớ: Các biến và phương thức static chỉ có một bản sao duy nhất được lưu trong bộ nhớ, do đó giúp tiết kiệm bộ nhớ khi bạn có nhiều đối tượng của lớp sử dụng chung dữ liệu.
Tính toán hoặc tiện ích: Phương thức static thường được sử dụng cho các phương thức tiện ích, chẳng hạn như các phương thức toán học trong lớp Math của Java (Math.sqrt(), Math.abs(), v.v.).
Đồng nhất dữ liệu: Khi có các biến cần được chia sẻ giữa các đối tượng và không thay đổi giữa các lần sử dụng, static là lựa chọn hợp lý để đảm bảo sự đồng nhất của dữ liệu.
Hạn chế của static
Thiếu tính linh hoạt: Các phương thức static không thể truy cập trực tiếp vào các biến và phương thức non-static, do đó bạn không thể sử dụng chúng khi cần thao tác với dữ liệu cụ thể của từng đối tượng.
Quá tải bộ nhớ: Mặc dù static giúp tiết kiệm bộ nhớ, nhưng nếu không sử dụng đúng cách (ví dụ: quá nhiều biến static), chúng có thể chiếm một lượng bộ nhớ lớn vì luôn tồn tại trong suốt thời gian chạy chương trình.
Sự khác biệt giữa static và non-static
Tiêu chí
static
non-static
Thuộc về
Thuộc về lớp (class-level).
Thuộc về đối tượng (instance-level).
Truy cập
Có thể truy cập mà không cần tạo đối tượng của lớp.
Phải tạo đối tượng của lớp để truy cập.
Số lượng bản sao
Chỉ có một bản sao cho tất cả các đối tượng của lớp.
Mỗi đối tượng có bản sao riêng của các biến và phương thức.
Truy cập biến và phương thức khác
Chỉ có thể truy cập các thành viên static khác trong lớp.
Có thể truy cập cả biến và phương thức static lẫn non-static.
Một số câu hỏi thường gặp khi đi phỏng vấn liên quan đến từ khóa static
Ý nghĩa của từ khoá static trong Java là gì? Chúng ta có thể override (đè) một hàm private hoặc static trong Java không?
Từ khoá static biểu thị cho biến hoặc phương thức có thể được truy cập (sử dụng) mà không cần tạo ra thực thể của lớp chứa nó. Người dùng không thể override phương thức static trong Java, bởi vì kỹ thuật đè (overriding) phương thức được dựa trên quá trình gán (binding) động khi runtime (khi chương trình đang chạy) và những phương thức static được gán tĩnh trong thời gian biên dịch. Phương thức tĩnh không ràng buộc với thực thể của lớp nên phương thức tĩnh sẽ không thể override.
Chúng ta có thể truy cập một biến không tĩnh (non-static) trong một ngữ cảnh static được không?
Một biến static phụ thuộc vào lớp của nó và giá trị của nó sẽ tồn tại (giữ) cho tất cả các thực thể của lớp đó. Biến static được tạo ra khi lớp chứa đó được tải (load) bởi JVM. Nếu cố gắng truy cập vào một biến non-static (trong hàm static) mà không có trong thực thể (instance) nào thì trình biên dịch sẽ báo lỗi, bởi vì những biến đó (non-static) chưa được khởi tạo và chúng không có ràng buộc với bất kỳ thực thể nào.
Tại sao phương thức main trong Java là static?
Trả lời: Bởi vì không cần thiết phải tạo đối tượng để gọi phương thức static. Nếu nó là phương thức non-static, JVM đầu tiên tạo đối tượng và sau đó gọi phương thức main() mà có thể gây ra vấn đề về cấp phát bộ nhớ bộ nhớ phụ.
Chúng ta có thể thực thi một chương trình mà không có phương thức main()?
Trả lời: Có thể, một trong các cách đó là khối static trong phiên bản trước của JDK 1.7.
Ví dụ:
public class ProgramWithoutMain {
static {
System.out.println("static block is invoked");
System.exit(0);
}
}
Kết quả:
Trường hợp chạy ở JDK < 1.7
static block is invoked
Trường hợp chạy ở JDK >= 1.7
Error: Main method not found in class com.gpcoder.ProgramWithoutMain, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
Từ khóa static trong Java là một công cụ mạnh mẽ để giúp quản lý tài nguyên và hiệu suất của ứng dụng. Nó cho phép chia sẻ dữ liệu và phương thức giữa các đối tượng của một lớp mà không cần khởi tạo chúng mỗi lần. Qua bài viết này, hi vọng đã giúp bạn hiểu về Static và cách sử dụng static để đảm bảo chương trình của bạn hoạt động hiệu quả.
Bài viết được sự cho phép của tác giả Nguyễn Việt Hưng
Series bài viết giúp lập trình viên đã biết Python bắt đầu code Go mượt mà hơn – tài liệu bổ trợ cho Go tour chứ không để thay thế – phần 1.
Golang là gì
Go (hay còn gọi là Golang theo tên trang chủ golang.org) là một ngôn ngữ lập trình mới xuất hiện trong công chúng vào năm 2009 (vs: Python 1991, Java 1995), tại Google.
Go được thiết kế ra với mục tiêu thay thế cho C++, nhưng khi tung ra cộng đồng, nó lại trở thành ngôn ngữ hấp dẫn đối với các lập trình viên dùng ngôn ngữ bậc cao hơn như Python, Ruby, PHP, NodeJS… nhờ khả năng chạy code nhanh, dùng ít tài nguyên hơn, deploy dễ hơn so với các ngôn ngữ này.
Go trở thành một trào lưu (trend) công nghệ trên internet, với các bài viết “Write X in Go” luôn trở thành bài hot (và giờ thì tới Rust). Go được sử dụng như một ngôn ngữ “backend”, rất thịnh hành tại các startup công nghệ để viết “service” trong các hệ thống “microservice”, web API. Go còn được dùng phổ biến để viết các câu lệnh command line.
Go đã ở giai đoạn “production ready”, đủ ổn định và đã được chạy trên các hệ thống lớn trên toàn cầu. Các sản phẩm opensource viết bằng Go được dùng rộng rãi như: Kubernetes, Docker, Terraform, InfluxDB, Prometheus, Grafana, …
Những lĩnh vực khác cũng đã có mặt Go nhưng chưa thực sự thành công: mobile, frontend (JavaScript), làm website (như Django/RubyOnRails), Machine Learning.
Những ưu điểm nổi bật của Go
Ngôn ngữ đơn giản: Go có ít khái niệm hơn các ngôn ngữ lập trình khác C++/Java/Python/Ruby… Go tại năm 2020 có 25 keywords, Python 3.8 có 35 keywords. Hầu hết các công ty tuyển lập trình viên Go đều không yêu cầu kinh nghiệm code Go, chỉ cần tuyển 1 lập trình viên đã dùng ngôn ngữ khác, qua training 1-2 tuần là đã có thể viết code production, trông không khác gì lập trình viên lâu năm.
Compile nhanh: so với các ngôn ngữ C/C++/Java/C#… thì Go compile nhanh gấp nhiều lần
Sản phẩm compile tạo ra là 1 file binary. Sau đó chỉ cần mang file này đi chạy là xong – điểm này khác biệt lớn so với Python, NodeJS, Ruby – phải cài các “dependency” (pip/npm/gem) rồi mới chạy được code (Go cũng cần tải các dependency, nhưng chỉ cần thực hiện trước khi compile ra file binary).
Code chạy nhanh: Go tuy không nhanh bằng C/C++/C#/Java trong hầu hết các trường hợp, chậm hơn cỡ 2-5 lần, nhưng nhanh hơn Python/Ruby cỡ 20-100 lần,
Vậy nên cách nhanh nhất để thử 1 đoạn code trong Go có lẽ là viết unittest. test rất phổ biến với một Go project, là một phần có sẵn trong bộ công cụ dev.
Với 1 file code đơn giản, có thể dùng lệnh go run main.go để làm gộp 2 bước, compile rồi chạy file kết quả luôn.
Auto format – go fmt
Go là ngôn ngữ lập trình đầu tiên đưa 1 công cụ format code tự động vào tiêu chuẩn, chấm dứt mọi tranh cãi về code-style/format code. Ý tưởng tuyệt vời này sau được copy sang nhiều ngôn ngữ khác (như Python black)
go fmt
Static typing
Python là ngôn ngữ dynamic typing, Go là static typing. Nếu chưa từng code ngôn ngữ static typing hay chưa dùng type annotation của Python, khác biệt này sẽ gây chút khó khăn lúc bắt đầu code Go.
In a statically typed language, the type of variables must be known (and usually declared) at the point at which it is used. Attempting to use it will be an error. In a dynamically typed language, objects still have a type, but it is determined at runtime. You are free to bind names (variables) to different objects with a different type. So long as you only perform operations valid for the type the interpreter doesn’t care what type they actually are.
Static/dynamic typing nói tới kiểu (type) của 1 biến (variable/name). Trong dynamic typing, kiểu của 1 biến có thể thay đổi:
x=10x="PyMi"
Trong static typing, kiểu của 1 biến là cố định, và được khai báo ngay từ trước khi dùng, code sau sẽ gặp lỗi khi compile, và không tạo ra binary nào để chạy.
varxint=10x="PyMi"
cannot use "PyMi" (type untyped string) as type int in assignment
$ mypy typetest.py
typetest.py:2: error: Incompatible types in assignment (expression has type"str", variable has type"int")
Found 1 error in 1 file (checked 1source file)
Kiểu của các biến trong Go nói chung phải khai báo (declare), Go có thể tự suy luận (type inference) được trong một vài trường hợp đơn giản.
x:=10s:="PyMi"
Low level
Được thiết kế nhằm thay C/C++ pha lẫn sự đơn giản dễ đọc của Python, code Go thường đơn giản hơn code C/C++ nhưng khá “thủ công”/”low level” so với code Python. Lập trình viên Python code Go nên quen với việc bỏ bớt đi nhiều tính năng tiện lợi, phải viết nhiều code hơn.
Sort trong Go chắc chắn dài hơn L.sort(reverse=True)
Reverse string sẽ không phải làs[::-1] mà dài cả mét
Không đơn giản chỉ json.loads để biến str thành dict mà phải định nghĩa struct theo cấu trúc của JSON.
Code Go nhìn chung sẽ dài hơn code Python, vậy nên lập trình viên nên sắm cho mình một IDE xịn (như GoLand/IntelliJ IDEA , VSCode hay vim + vim-go), với khả năng dùng snippet để sinh code.
Sự bất tiện này sẽ đỡ khó chịu đi nhiều khi đã quen dùng snippet.
Học lập trình Go (khi đã biết Python)
Bao nhiêu là đủ? Em vui là được có phải không!
Không ai đọc hết quyển từ điển tiếng Việt rồi mới ra nói câu đầu tiên, không ai học lên tiến sỹ âm nhạc rồi mới chạm tay vào đánh đàn. Khi học Python tại PyMi.vn, ta học từng chút, dùng từng chút, chứ không học hết lý thuyết cả Python rồi mới thực hành. Cũng không phải học async, threading, metaclass rồi mới chịu đi làm.
Học Go cũng vậy, dùng gì học đấy, cần gì học đấy. Cần gì thì phụ thuộc vào bạn định làm gì, một Python web developer sẽ học Django, ORM, làm việc với database trong khi một SysAdmin/DevOps engineer lại làm việc với file, process…
Go dùng camelCase, với ý nghĩa đặc biệt khi chữ cái đầu viết hoa hay viết thường. Nếu viết hoa, var/function/type đó sẽ trở thành “public”, code bên ngoài package hiện tại truy cập được, còn không viết hoa sẽ là “private”.
Data types
Built-in
nil: nil là một giá trị, không có kiểu, đại diện cho sự “không tồn tại”.
bool: kiểu boolean gồm 2 giá trị truefalse, các boolean operator && (and), || (or) tuân theo short-circuit.
int: các kiểu số trong Go đều có kích thước, int có kích thước 32 hoặc 64 bits tùy theo bản (chủ yếu 64 bits). Các kiểu cụ thể int8 int16 int32 int64, có kích thước là 2 mũ n, int8 int16 thường chỉ dùng khi tối ưu về memory. int64 biểu diễn được giá trị trong khoảng (-2**64/2, 2**64/2), muốn tính giá trị lớn có thể sử dụng package có sẵn math/big.
float32 hoặc float64: chú ý không có kiểu float. Tuân theo chuẩn IEE754 nên x, y, z := 0.1, 0.1, 0.1 thì x + y + z == 0.3 sẽ trả về false. Chú ý ở trên tạo các biến để các giá trị 0.1 có kiểu float64, nếu viết trực tiếp 0.1 + 0.1 + 0.1 == 0.3 sẽ là so sánh constants và trả về true https://play.golang.org/p/TWRRr_lM7jk. Đọc thêm về constants tại blog Go.
string: giống như string của Python, immutable, có thể truy cập các chữ cái bằng cách chuyển thành runes (s := []rune(sting)) rồi dùng index: s[3]. String bên dưới là 1 chuỗi các byte, hay một byte array/byte slice []byte{'h', 'e', 'l', 'l', 'o'}, có thể convert thành string: string(bytes). Python cũng có kiểu bytes, cũng chuyển thành str bằng cách decode b'abc'.decode('utf-8').
array/slice: Go array giống như C, các phần tử phải cùng kiểu, và kích thước cố định không đổi. Array ít được dùng trực tiếp nó được dùng bên dưới slice và slice linh hoạt như list trong Python. Ví dụ về slice
ns:=[]int{0,1}fmt.Printf("%v\n",ns)ns=append(ns,2)fmt.Printf("%v\n",ns)ns=append(ns,ns...)// như extend trong python listfmt.Printf("%v\n",ns)
map: giống dict của Python, key phải so sánh == được, map và slice không làm key được, key không theo thứ tự (unordered). Map trong Go dùng khi cần nối key-value, tìm kiếm nhanh, nhưng không dùng như 1 object như dict Python. Do map phải có kiểu cố định cho key, value. Xem code
Các kiểu khác struct, pointer, function, interface, channel sẽ được nhắc tới sau, xem đầy đủ tại spec.
Struct & method
Python có class, cung cấp đủ các tính năng tiêu chuẩn của OOP (object-oriented programming – lập trình hướng đối tượng). Định nghĩa 1 class tạo ra 1 kiểu dữ liệu mới và cho phép đóng gói dữ liệu (data) với tính năng (method) lại với nhau.
Go struct: A struct is a collection of fields.
struct không cung cấp các tính năng của OOP (như inheritance), nhưng cũng tạo ra 1 kiểu dữ liệu mới và cho phép đóng gói dữ liệu (data) với tính năng (method) lại với nhau. https://play.golang.org/p/tQMPLn9OXcj
Trong Go, function gắn với các struct gọi là method, (r Rectangle) gọi là receiver, đứng trước tên Area() trông lạ so với các ngôn ngữ khác, nhưng nó đóng vai trò như self trong Python method.
Remember: a method is just a function with a receiver argument.
interface, type assertion, type switch
Một interface type định nghĩa 1 tập hợp các method.
An interface type is defined as a set of method signatures.
Một value của type interface có thể chứa bất kỳ giá trị nào implement các method qui định trong interface đó.
Empty interface interface{} là trường hợp đặc biệt, nó có thể chứa mọi giá trị do không cần có method nào.
Một value kiểu interface{} đánh sập mọi đảm bảo về type trong Golang, biến Go thành dynamic typing như Python. Nó như lối thoát linh hoạt giữa mọi sự cứng nhắc/static.
Sử dụng type assertion để truy cập giá trị ẩn dưới interface{}:
Cách duy nhất để gọi function là đưa vào các argument theo thứ tự, không có keyword argument như Python (python_function(x=5, y=7)).
Có thể dùng function làm argument của function khác, việc này rất phổ biến trong Go, khái niệm này có tên first class function. Function nhận function khác làm argument được gọi là higher order function.
Error handling
Go không có exception, lỗi không được xử lý khiến chương trình kết thúc qua việc gọi function “panic” (runtime error). Ví dụ khi dùng type assertion để truy cập kiểu string dưới 1 empty interface chứa giá trị int.
Các function thay vì tạo ra exception, thường trả về giá trị Error kèm kết quả. Ví dụ function trong package strconv dùng để convert string thành int:
funcAtoi(sstring)(int,error)
Nếu thành công, error sẽ là nil còn biến kiểu int chứa giá trị, nếu s không phải dạng string của 1 số int, error sẽ có giá trị khác nil và thường chứa chi tiết về lỗi xảy ra. error là kiểu dữ liệu interface.
typeerrorinterface{Error()string}
mọi kiểu dữ liệu có method Error() return string đều có thể là 1 error.
Do các function đều viết theo cách này, nên code gọi 1 function trong Go thường đi kèm với 1 đoạn kiểm tra error ngay sau đó rồi mới xử lý giá trị nhận được:
Cách làm này gây nhiều tranh cãi, nhưng vẫn là cách làm chính thống của Go. Go dễ dãi hơn so với Java (khi 1 function xảy ra exception gì thì phải khai báo có thể xảy ra exception, và code gọi bắt buộc phải xử lý). Bỏ qua giá trị của err là chuyện hoàn toàn làm được, như viết code Python không xử lý exception, khi có error xảy ra, chương trình thường sẽ… chết.
Cách return error này không ÉP được lập trình viên phải xử lý mọi lỗi, nhưng tạo ra 1 nền văn hóa trong cộng đồng code Golang: luôn xử lý (hay ít nhất là nghĩ tới) error mọi lúc, mọi nơi.
Import
Cú pháp tương tự Python
import"packagename"import"fmt"
rồi gọi function qua package.Function, vd: fmt.Println
Package & Install 3rd packages
Đầu mỗi file code Go phải bắt đầu bằng
packagepackagename
Tất cả các file go trong cùng 1 thư mục (không tính thư mục con) phải khai báo cùng package, chúng sẽ được gộp lại làm một (trừ phần import, mỗi file phải tự import thư viện mình dùng). Có thể coi việc các file khác nhau chỉ để thuận tiện tổ chức code, chứ vẫn là trong 1 file. Các function trong cùng 1 package (khác file) có thể gọi nhau thoải mái, không cần import lẫn nhau.
Việc này khác với Python, mỗi file.py tự động là 1 module riêng biệt.
Go cài package bằng lệnh go get, sau đó import tên package – là một đường dẫn theo cấu trúc URL online.
Package “testing” của Go không có “assert”, cài package từ github rồi dùng assert.Equal để kiểm tra 2 giá trị có bằng nhau không, và message hiển thị khi chúng không bằng nhau.
// main_test.gopackagemainimport("github.com/stretchr/testify/assert""testing")funcTestSomething(t*testing.T){// assert equalityassert.Equal(t,123,123,"they should be equal")}
$ go test -v
=== RUN TestSomething
--- PASS: TestSomething (0.00s)
PASS
ok _/home/hvn/MyData 0.002s
What is the sum of the digits of the number 2 to the power of 1000?
packagemainimport("fmt""math/big""strconv")funcmain(){vartwoToThePowerOf1000big.InttwoToThePowerOf1000.Exp(big.NewInt(2),big.NewInt(1000),nil)// Có thể tính sum luôn nhưng bài này minh họa slicedigits:=[]int{}for_,c:=rangetwoToThePowerOf1000.String(){digit,_:=strconv.Atoi(string(c))digits=append(digits,digit)}sum:=0for_,v:=rangedigits{sum=sum+v}fmt.Printf("%d\n",sum)}
People & Community
Go có cộng đồng trên toàn cầu, có forum/slack/IRC để thảo luận, xem tại help – có cả bằng Tiếng Việt.
Những nhân vật đáng chú ý/follow trong cộng đồng Go gồm các tác giả, core dev, …
Go là một ngôn ngữ lập trình đơn giản và thú vị, với những kiến thức trong bài này, ta đã có thể bắt đầu dùng Go để viết các chương trình không hề đơn giản. Phần tiếp sẽ trình bày chi tiết về các khái niệm chỉ có trong Go mà không có trong Python như Pointer, sự khác biệt về cách tổ chức package trong Go, declaration & initialization (khai báo và khởi tạo variable), cùng các standard library quan trọng nhất cho một SysAdmin/DevOps.
Bài viết được sự cho phép của tác giả Kien Dang Chung
Lập trình là một công việc có khá nhiều các hành động được lặp lại, chính vì vậy lựa chọn được tập hợp các công cụ sử dụng trong viết mã nguồn, thực hiện debug, thực hiện build… phù hợp giúp bạn tiết kiệm nhiều thời gian. Các công cụ kể đến được chia thành một số nhóm như sau:
Trình soạn thảo mã nguồn
Code editor hay trình soạn thảo mã nguồn là nơi chúng ta dành nhiều thời gian nhất để viết mã nguồn, có hai dạng trình soạn thảo là IDE và lightweight editor. IDE (Integrated Development Environment) môi trường phát triển tích hợp là ứng dụng lớn có thể kiểm soát mọi thứ trong dự án web từ việc viết code đến hỗ trợ debug, kiểm thử, triển khai sản phẩm… tuy nhiên IDE thường sẽ rất nặng nề và cần cấu hình máy tương đối. Lightweight editor là những phần mềm soạn thảo text thông thường được nâng cấp thêm các chức năng cho việc viết code được dễ dàng hơn. Cả hai dạng trình soạn thảo này đều đáp ứng được một số các tính năng tiêu chuẩn cho viết mã nguồn như sau:
Phân tích cú pháp và bôi màu văn bản (syntax highlighting): mã ứng dụng không có tính năng này thật là thảm họa, chúng ta có thể đọc một cuốn sách in chữ đen trắng cả ngày nhưng không thể đọc một đoạn code không highlight trong 10 phút.
Tìm kiếm và khớp nối các ký tự đóng mở (bracket matching): rất cần thiết cho các đoạn, khối code và các biểu thức logic, không có tính năng này rất khó tìm ra lỗi soạn thảo.
Gợi ý các câu lệnh, cú pháp (autocompletion).
Ẩn hiện mã nguồn theo nhóm (code folding): tính năng này có thể có hoặc không nhưng nếu có nó cũng giúp bạn khá nhiều trong các dự án lớn.
Một số các trình soạn thảo thông dụng nhất hiện nay mà bạn nên sử dụng nếu dự án của bạn có liên quan đến PHP và Javascript:
IDE: NetBean, PHPStorm, Zend Studio…
Lightweight editor: SublimeText, Notepad++…
Trong suốt khóa học Vue.js này chúng ta sẽ sử dụng Sublime Text, nó rất nhẹ nhàng và theo cảm nhận thì tôi thấy đầy đủ tính năng cho các dự án web tầm trung. Mặc định Sublime Text không highlight mã nguồn cho các template Vue với phần mở rộng .vue, chúng ta có thể cài đặt gói Vue Syntax Highlight, các bước cài đặt như sau: Trong Sublime Text chọn Preferences -> Package Control
Tiếp theo chọn Package Control: Install Package, trong phần tìm kiếm gõ vào từ khóa Vue Syntax Highlight.
Như vậy chúng ta đã cài đặt xong, tắt ứng dụng đi mở lại, các template của Vue đã được highlight.
Công cụ debug Vue.js
Framework Vue.js có một công cụ sử dụng để debug riêng là DevTools, nó là một extension trên Chrome. Sau khi cài đặt sẽ xuất hiện biểu tượng Vue ở góc trên bên phải trình duyệt. Tuy nhiên, lúc này khi click vào biểu tượng đó thì sẽ có thông báo Vue.js not detected do extension này chưa có quyền truy xuất file URL. Thêm quyền này bằng cách ấn vào biểu tượng 3 dấu chấm phía trên bên phải chọn More tools, sau đó chọn Extensions và tìm đến Vue.js devtools, chọn vào Allow access to file URLs.
Chúng ta cùng khám phá DevTools với ví dụ đầu tiên Hello world trong phần giới thiệu Vue.js xem thế nào? Ví dụ này sử dụng phiên bản triển khai sản phẩm (product version) do đó DevTools không thể làm việc được, cần chuyển sang phiên bản phát triển (development version). Rất đơn giản bạn chỉ cần thay “vue.min.js” thành “vue.js”. Chúng ta cũng đã thống nhất với nhau sẽ chủ yếu dùng CDN để demo các đoạn mã cho tiện.
<!DOCTYPE html><html><head><title>Ví dụ đầu tiên Vue.js - allaravel.com</title></head><body><div id="app"><h1>{{ message }}</h1><input v-model="message"></div><script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script><script type="text/javascript">newVue({
el:'#app',
data:{
message:'Xin chào, tôi là Vue.js'}})</script></body></html>
Mở trang này trên trình duyệt và mở cửa sổ Console của trình duyệt lên (với Chrome phím tắt là Ctrl + Shift + I) và tìm đến tab Vue.
Công cụ này cho phép sửa trực tiếp dữ liệu trong Model, ở đây là đối tượng message, khi thực hiện sửa dữ liệu chúng ta thấy ngay lập tức trên View dữ liệu cũng thay đổi theo. Trong ví dụ đơn giản này không có gì cần debug nhưng khi vào các dự án lớn, số lượng đối tượng nhiều với dữ liệu phức tạp DevTools hỗ trợ rất tốt phần debug.
Các công cụ CLI
CLI (Command Line Interface) Giao diện dòng lệnh là các công cụ hữu ích giúp cho một số công việc đơn giản hơn, trong Laravel chúng ta biết đến các khái niệm Composer, Laravel Artisan thì trong Vue.js chúng ta có Npm, Vue CLI. Ở đây chúng ta chỉ liệt kê ra, còn chi tiết các bạn xem trong Cài đặt môi trường Vue.js.
Cmder
Các bài viết được soạn thảo trên Windows do có một số phần mềm không có trên Linux, công cụ dòng lệnh cmd của Windows quả là lởm do đó bạn có thể sử dụng Cmder một công cụ dòng lệnh tuyệt vời, giao diện rất đẹp với text được highlight như trong trình soạn thảo, việc cóp dán cũng dễ dàng, thiết lập các tham số cho công việc rất tiện lợi. Nếu bạn kết hợp Vue.js với Laravel thì có thể tham khảo Cài đăt Laragon cho môi trường Laravel. Cmder đã được tích hợp làm công cụ dòng lệnh mặc định trong Laragon.
Kết luận
Như vậy chúng ta đã bước qua phần đầu tiên của Khóa học Vue.js, tôi tin chắc bạn đã biết được Vue.js là gì, biết cách cài đặt môi trường Vue.js và sử dụng các công cụ cho công việc phát triển Vue.js. Phần giới thiệu bao giờ cũng tẻ nhạt nhất, chúng ta muốn nhanh chóng vào phần cấu trúc ngôn ngữ, các khái niệm cơ bản và có thể viết ngay các ví dụ. OK, không mất thời gian các bạn nữa, chúng ta tiếp tục với “Khái niệm cơ bản trong Vue.js”.
Theo thống kê của SlashData, năm 2019, thế giới có tới 26,4 triệu Software Developer. Bên cạnh những kỹ năng kỹ thuật thì điều đầu tiên giúp bạn có được công việc trong ngành này là một chiếc IT programmer CV sao cho thật ấn tượng trong mắt nhà tuyển dụng. Sau khi đạt được mong muốn, nhiều dev mải miết làm những công việc quen thuộc mỗi ngày, nhưng trong suốt quá trình làm việc của mình, bạn đã bao giờ tự hỏi bản thân: Mình đã thật sự hiểu hết về lập trình chưa?
Với cá nhân mình, tôi đã gặp 2 kiểu lập trình viên trong đời mình: những kẻ mạo danh và những dev đầy tự tin.
Có 2 kiểu lập trình viên dễ bắt gặp
2 kiểu lập trình viên
Những “kẻ mạo danh” – thể hiện trong IT Programmer CV
Đây là những lập trình viên khi mới bắt đầu công việc luôn cảm thấy nghi ngờ về kỹ năng cũng như kiến thức của mình. Họ luôn có cảm giác mình chưa đủ giỏi, chưa đủ hiểu biết để bắt kịp với sự phát triển thần kỳ của công nghệ. Cũng vì thế mà họ thường dành rất nhiều thời gian để nghiên cứu thêm về công việc của mình, do đó “tay nghề” của họ sẽ ngày càng nâng cao hơn.
Việc bạn bị ảnh hưởng bởi hội chứng những kẻ mạo danh cũng không phải là việc gì đáng xấu hổ. Có đến 70% các dev đều đã trải qua cảm giác này ít nhất một lần trong đời. Nó khá phổ biến ở giai đoạn đầu sự nghiệp của các lập trình viên, khi mà chúng ta vẫn đang ý thức rằng kỹ năng và kinh nghiệm của mình chỉ là “giọt nước giữa đại dương”. Bạn nên cố gắng đầu tư hơn cho CV xin việc CNTT của mình để có được một công việc tốt, những đồng nghiệp giỏi, họ sẽ giúp bạn nhiều hơn trong quá trình làm việc.
Những lập trình viên tự tin
Ngược lại với nhóm người trên, đây là những lập trình viên thường tự tin thái quá về kỹ năng làm việc của mình. Với nhóm người này họ tin rằng từ IT programmer CV của họ đến cách họ làm việc, kiến thức họ có đều là xuất sắc hơn với đồng nghiệp. Cảm giác đạt được thành tựu sau khi viết thành công một chương trình có thể khiến bạn thấy bản thân mình tài giỏi, tuy nhiên nếu không biết kiềm chế cảm xúc và sống trong quá khứ quá lâu dễ khiến lập trình viên trở nên kiêu ngạo và lười biếng.
Kiêu ngạo: khi bạn cảm thấy những gì mình làm luôn đúng và chỉ phương án của mình mới là tốt nhất, bạn nghi ngờ và cho rằng kỹ thuật của người khác là sai, là chưa thật sự ấn tượng. Đây là tư duy khiến bạn không phát triển được trong ngành IT vì đây là lĩnh vực đòi hỏi sự sáng tạo và tiếp thu nhiều kiến thức, nhiều giải pháp khác nhau cho cùng một vấn đề.
Lười biếng: Bạn có CV cho dân IT được nhận xét là ấn tượng nhất, bạn có vị trí cao trong công ty hay vừa hoàn thành xuất sắc một dự án không có nghĩa là bạn đã ở trên đỉnh cao của sự nghiệp và được phép dừng học hỏi, làm mới kiến thức mỗi ngày. Không ai đủ thông minh để biết được tất cả mọi thứ và thời điểm bạn cảm thấy không còn tò mò với công việc nữa cũng là lúc quá trình phát triển thật sự của một lập trình viên trong bạn đã dừng lại.
Tôi cũng đã từng như vậy nhưng may mắn là tôi gặp được những lãnh đạo tốt, họ giúp tôi hiểu ra chính mình và nhắc nhở tôi nên học cách lắng nghe nhiều hơn, để có thể trau dồi thêm cho IT programmer CV của mình. Khi bạn dành thời gian lắng nghe người khác và không vội vàng đưa ra ý kiến của mình, bạn sẽ bất ngờ, vì những gì bạn nhận được sẽ nhiều hơn với những gì bạn nghĩ đó.
Làm thế nào để viết được code tốt?
Không có lập trình viên tồi chỉ có những lập trình viên ít kinh nghiệm hơn. Và ứng viên nào có IT programmer CV nhiều kinh nghiệm làm việc, nhiều dự án hoàn thành tốt chắc chắn sẽ được chú ý hơn. Vậy làm thế nào để biết mình đã thật sự viết được code tốt?
Đầu tiên bạn cần đảm bảo được chất lượng code của mình. Các thủ thuật, cú pháp ngắn và lạ mắt, làm sao để viết được những dòng code dễ hiểu, dễ đọc là điều các dev cần tìm hiểu để nâng cao kỹ năng của mình. Bên cạnh đó, việc đảm bảo tính nhất quán của code cũng quan trọng như cách viết được những code sạch vậy. Bạn có thể viết code theo cách mình muốn nhưng cần giữ cho code được viết có sự thống nhất và dễ đọc là tuân theo phong cách mã hóa đó để những người khác đọc codebase của bạn có thể dễ dàng điều hướng nó.
Code được viết dễ đọc, dễ test và có hiệu suất cao sẽ giúp nâng trình kinh nghiệm cho dev
Lập trình viên cũng cần đảm bảo tính chính xác của code, code viết ra cần phải chạy được, không gặp lỗi. Khi viết xong một đoạn code, các dev cần xử lý được những câu hỏi như có bug trong code hay không, nếu có thì xử lý nó như thế nào, các đoạn code đã thực hiện đúng chức năng của nó chưa,… để đảm bảo tối ưu code. Tất nhiên không ai có thể hoàn hảo để làm mọi thứ chính xác tuyệt đối, nhưng điều quan trọng là dev có ý thức cố gắng tìm ra những lỗi sai, những điểm hạn chế của mình để trở thành một lập trình viên thực thụ.
Sau khi đã đáp ứng được các yêu cầu trên, bạn cần xem xét đến khả năng làm việc hiệu quả của code. Nhiều dev thường cố gắng viết code nhanh và đúng, suy nghĩ quá mức về việc làm sao thực hiện chuyện ấy lại khiến code của bạn không đạt được hiệu suất làm việc thật sự của nó. Do đó, bạn nên bắt đầu bằng việc viết code có thể chạy được, sau đó refactor và cuối cùng mới optimize chúng. Xem xét kỹ về các cấu trúc dữ liệu và kiểm tra cách code hoạt động trước khi tối ưu hóa để code đạt được năng suất làm việc cao nhất.
Nhân tố chính – Kỹ năng Giao tiếp thể hiện trong IT Programmer CV
Mọi thứ sẽ trở nên khó khăn hơn nếu dev không thể giải thích được với đồng nghiệp hay khách hàng của mình cách những đoạn code được viết ra sao và hoạt động như thế nào, nhất là với khách hàng, những người chỉ quan tâm đến kết quả và hiệu năng làm việc. Những dev xuất sắc nhất trên thế giới là những người có khả năng giao tiếp và giải thích dễ dàng code của họ hoạt động như thế nào, biến những thứ phức tạp trở nên đơn giản hơn.
Như Albert Einstein đã nói: “Nếu bạn không thể giải thích nó một cách đơn giản nghĩa là bạn chưa thật sự hiểu hết về nó”. Cũng như cách bạn thể hiện trong IT programmer CV sao cho thật rõ ràng để nhà tuyển dụng có thể dễ dàng hiểu được những kinh nghiệm bạn có, những dự án bạn đã trải qua.
Hi vọng rằng với những chia sẻ trên đây của tôi có thể giúp bạn có thêm một số kiến thức và trả lời được câu hỏi “Mình đã thật sự hiểu về lập trình hay chưa?” Ngoài ra, nếu bạn muốn có một công việc lập trình viên tốt, được làm những việc với những dev tài năng ở môi trường chuyên nghiệp, bạn nên đầu tư hơn cho IT programmer CV của mình. Đây sẽ là chìa khóa để bạn nắm bắt cơ hội tốt hơn với mình đấy.
Bài viết này là bài viết chia sẻ nhanh về các Visual Studio Code (VSCode) extensions mà mình đang sử dụng và có thể các bạn cũng sẽ thích nó. Hãy cùng vào nội dung bài luôn nhá!
Theme
Chắc chắn theme là một yếu tố cũng quan trọng khi các bạn quyết định sử dụng một Code Editor nào đó. Nếu như nhìn vào một cái theme đẹp, trực quan, dễ đọc code, thân thiện với mắt hơn khi có Dark Mode thì chắc chắn bạn sẽ thích hơn là code bằng cái Notepad ?, dĩ nhiên rồi.
Theme mà mình đang sử dụng là Material Theme, đây không chỉ là một theme duy nhất mà là một pack có nhiều Color Palatte cho các bạn thoải mái theo sở thích. Cá nhân mình thì thích dùng Ocean High Contrast và Palenight High Contrast, khi dùng High Contrast thì các thành phần khác Edit Area như Terminal, Debug Console, Sidebar… sẽ có màu sắc đậm hơn, các bạn sẽ dễ phân biệt hơn.
Ngoài Material Theme thì mình cũng có đổi một số theme khác cho đỡ nhàm chán như Dracula Official, Github Theme, Night Owl. Hầu hết các theme mình dùng đều là Dark Theme để code buổi tối cho đỡ mỏi mắt.
Cài rồi thì nhớ active nó lên nha ?!
settings.json
{"workbench.colorTheme":"Theme Name"}
Icon Pack
Đã nói đến Theme thì không thể nào bỏ qua Icon Pack được. Nếu như các bạn cài Material Theme thì nó cũng đã có kèm theo sẵn một vài Icon Pack cho các bạn lựa chọn phù hợp với theme đó luôn. Tuy nhiên thường thì mình sử dụng Pack khác chứ không dùng nó.
Có 2 gói Icon Pack phổ biến nhất mà mình cũng thường switch qua lại cho đỡ nhàm là Material Icon Theme và vscode-icons. Khi sử dụng thì bạn cũng nên lưu ý có thể màu của Icon bị trùng tông với nền Sidebar nên cần chọn theo theme sao cho nó dễ nhìn nữa.
Let’s active it!
settings.json
{"workbench.iconTheme":"Icon Pack Name"}
Font
Đã custom theme và icon pack thì không thể nào bỏ qua phần font chữ được. Font chữ mình sử dụng cho hầu hết IDE và Editor trong máy mình đó chính là Fira Code, hoặc các bạn cũng có thể tải về từ Google Fonts.
Cái hay của font này đó chính là nó hỗ trợ ligratures, như một lập trình viên, bạn có thể hiểu được các ký tự như >=, <=, !=… nhưng nó lại không đúng theo cách mà mình học toán học. Do đó, khi cài Fira Code Font, các ký tự ấy sẽ được chuyển thành những dấu đúng như trong toán học chúng ta đã học.
Ligratures Demo
Mặc định VSCode không bật tính năng Font Ligatures nên bạn sẽ cần bật nó lên.
Prettier – Code formatter có thể nói là một extension cực kỳ hữu ích, nó giúp code của bạn có một style chuẩn, không bị thiếu, thừa dấu tab, cách, đặt dấu ngoặc lung tung… Hoặc khi các bạn paste code vào, có thể nội dung đoạn code rất dài, format lại rất mất thời gian thì Prettier sẽ giúp bạn.
Nói chung là cực kỳ hữu ích, đặc biệt là với mấy bạn lười format lúc code. Theo cá nhân mình thì bạn vẫn nên tập thói quen code theo style chuẩn, đừng quá ỷ lại vào plugins, extensions, khi mà không có nó thì bạn sẽ code như một newbie đấy ?.
Thường thì mình sẽ bật Format On Save và Format On Paste để nó luôn format mỗi lần mình save file hay paste code vào.
Code Spell Checker chắc chắn không thể nào thiếu với một người dốt Anh Văn mà học đòi sài tiếng Anh như mình được ?. Code mà bị sai chính tả thì nó không thể nào chấp nhận được, vậy nên Code Spell Checker sẽ giúp bạn phát hiện ra những từ bị sai và underline nó. Nếu như đó là một từ mới hoặc từ viết tắc… mà Code Spell Checker không hiểu, bạn cũng có thể thêm nó vào Dictionary để nó không warning nữa.
Code Spell Checker Example
Code Spell Checker Suggestion
Better Comments
Better Comments là một extension cực kỳ hữu ích, nó giúp bạn highlight comment để dễ đọc hơn, mỗi loại comment sẽ có một màu sắc khác nhau, bạn sẽ không bao giờ bị nhầm giữa đống comment như rừng trong khi code nữa. Ngoài ra, bạn có thể custom màu theo sở thích của bạn, cá nhân mình thấy màu sắc mặc định khá là đẹp và hợp lý rồi nên mình không custom cái gì cả.
Better Comments
Bracket Pair Colorizer
Bracket Pair Colorizer là một extension highlight khác nữa, extension này sẽ giúp bạn highlight các dấu ngoặc, những cặp dấu ngoặc thì đương nhiên chúng sẽ cùng màu, tuy nhiên, chắc chắn bạn đã từng gặp trường hợp như vậy:
print(max(a,max(b,max(c, d))))
Một loạt các dấu ngoặc rất khó nhìn và nhận biết nó kết thúc của dấu nào trước đó, Bracket Pair Colorizer sẽ giúp bạn highlight chúng với các màu khác nhau và từ đó, bạn có thể dễ dàng phân biệt được chúng. Extension này thì có 2 phiên bản, Bracket Pair Colorizer và Bracket Pair Colorizer 2, cái nào cũng có thể sử dụng được tốt, nhưng mà có cái mới dại gì mà không dùng ?.
Ngoài ra thì nó còn có các line chạy từ dấu mở đến đóng ngoặc, tức là bao quát block mà các bạn đang code, vậy nên mọi thứ sẽ cực kỳ clear. Các bạn cũng có thể custom lại các màu của dấu nếu muốn.
Bracket Pair Colorizer
Code Runner
Code Runner là một extension giúp bạn run code dễ dàng hơn, không cần dùng comment. Ví dụ như bạn làm việc với python, tất cả những gì bạn cần làm là nhấn ctrl + alt + N, và code của bạn được thực thi ngay lập tức mà không cần phải “python path_to_file” phiền phức.
Ngoài ra thì Code Runner hỗ trợ rất nhiều ngôn ngữ khác nhau, các bạn có thể tham khảo trên VSCode Marketplace. Mặc định thì khi run bằng Code Runner, nó sẽ run và in kết quả ra tab Output nên bạn không thể tương tác với console app được. Thêm nữa là khi chạy code mình hay quên save lại nên nó chạy code cũ. Để giải quyết thì mình bật Save All File Before Run và chạy app trong Terminal để mình có thể tương tác được.
Mình không phải là một web developer, mình chỉ biết sơ về web thôi, mình dùng những CSS, HTML, JS đơn thuần để custom một chút trên blog khiemle.dev của mình, vậy nên Live Server là một extension cực kỳ hữu ích.
Với Live Server, khi bạn code file .html, bạn có thể nhấn Go Live, ngay lập tức một localhost sẽ được tạo và một brower tab sẽ mở file html của bạn. Bạn có thể chỉnh sửa thoải mái file html và khi bạn nhấn Save, trình duyệt sẽ tự động refresh, rất là hữu ích đúng không nào!
Tổng kết
Trên đây là những extensions mà mình sử dụng, mình còn sử dụng thêm một số extension khác, tuy nhiên không phải ai cũng cần và mình chỉ liệt kê những extension mình nghĩ ai cũng nên dùng. Không biết mình còn thiếu extension nào không, các bạn đang sử dụng extension nào, hãy comment phía bên dưới để mình biết nha! Cảm ơn các bạn đã theo dõi bài viết!
Bài viết được sự cho phép của tác giả Nguyễn Chí Thức
Từ năm 2016, Python đã thay thế Java trở thành ngôn ngữ phổ biến nhất trong các trường cao đẳng và đại học trên thế giới và kể từ đó Python chưa bao giờ dừng lại.
Python đang phát triển và lớn mạnh hơn theo thời gian. Nếu bạn đọc tin tức về lập trình và công nghệ hoặc bài đăng trên blog thì bạn có thể nhận thấy sự tần suất Python xuất hiện ngày càng tăng.
Bởi vì nhiều cộng đồng lập trình viên phổ biến bao gồm StackOverflow và CodeAcademy đang đề cập đến sự trỗi dậy của Python như một ngôn ngữ lập trình chính.
Nhưng, câu hỏi lớn nhất là TẠI SAO một lập trình viên nên học Python?
Python đang phát triển mạnh. OK, điều này tốt không? TỐT.
Nhưng điều này không có nghĩa là Java đang đi xuống hoặc C ++ đang suy giảm.
Đối với người mới bắt đầu học lập trình, hãy bắt đầu với Python vì nó rất dễ học và đủ mạnh để xây dựng một ứng dụng web và xây dựng các quy trình tự động hóa.
Trên thực tế, một vài năm trước, Script là lý do chính để học Python và đó cũng là lý do đầu tiên và quan trọng nhất mà Python thu hút mình hơn Perl.
Đối với các lập trình viên có kinh nghiệm hoặc ai đó đã biết về Ruby, Java hoặc JavaScript, học Python có nghĩa là có được một công cụ mới và mạnh mẽ trong kho vũ khí của mình.
Và trong số những người mình biết, mình vẫn chưa thấy ai nói “KHÔNG” với một công cụ tốt cả.
Theo như cuốn sách “Tự động hóa những thứ nhàm chán với Python” đã nói, Python cung cấp khả năng tự động hóa những việc tầm thường và cho phép bạn tập trung vào những thứ thú vị hơn.
Nếu bạn là một lập trình viên có kinh nghiệm, bạn hoàn toàn có thể tự động hóa quy trình với rất nhiều ngôn ngữ lập trình.
Nhưng không nhiều ngôn ngữ cung cấp đủ nhiều công cụ để làm việc với APIs, Thư viện, Framework, Data Sicense, Machine Learning, Web …
Nếu bạn đang suy nghĩ để học Python nhưng không chắc tại sao bạn mình lại nên học thì đây là 10 lý do làm nổi bật lợi ích của việc học Python vào năm 2024.
Mặc dù, các câu hỏi phụ thuộc nhiều hơn vào việc người đang hỏi là ai, muốn gì…
Ví dụ: Đối với người mới bắt đầu học lập trình, nên học Python vì đơn giản là Python rất dễ học.
Tương tự, đối với một lập trình viên có kinh nghiệm đang muốn học về Khoa học dữ liệu và Học máy, nên chọn Python vì Python đã trở thành ngôn ngữ lập trình được sử dụng nhiều nhất, nó có các API và thư viện mạnh mẽ có sẵn cho AI, Khoa học dữ liệu và Học máy.
1. Data sai ần (Data Sicense) là cần có “Pai thần” (Python)
Đây là lý do duy nhất, lớn nhất khiến nhiều lập trình viên muốn học Python vào năm 2024. Mình biết nhiều bạn bè của mình đã chán công việc lập trình Java, lập trình PHP.
Bởi vì đã hàng chục năm học làm việc với nó rồi. Họ muốn tìm kiếm thứ gì đó thú vị, thử thách và cơ hội cao hơn nữa.
Nhưng, Tại sao Python lại là ngôn ngữ yêu thích cho Khoa học dữ liệu và Học máy?
Không phải là ngôn ngữ lập trình R đã được coi là tốt nhất cho mảng này cách đây không lâu à?
Mình nghĩ là các thư viện và framework phong phú mà Python cung cấp, ví dụ: PyBrain, NumPy và PyMySQL trên AI, DataScience và Machine learning chính là một trong những lý do đó.
Một lý do khác là sự đa dạng, Python cho phép bạn làm được nhiều hơn R.
Ví dụ: Bạn có thể tạo tập lệnh tự động hóa, lập trình web, lập trình ứng dụng…
Đây là một lý do khác khiến các lập trình viên đua nhau học Python vào năm 2024.
Sự phát triển của Học máy (Machine Learning) là một hiện tượng trong vài năm qua và nó nhanh chóng thay đổi mọi thứ xung quanh chúng ta.
Các thuật toán trở nên tinh vi từng ngày, ví dụ tốt nhất là Thuật toán tìm kiếm của Google, giờ đây Google có thể trả lời chính xác những gì bạn đang muốn tìm kiếm.
Xu hướng chatbot, trợ lý ảo và Facebook hoàn toàn được điều khiển bởi Thuật toán tương tự.
Nếu bạn quan tâm đến học máy, muốn thực hiện một dự án hoặc chỉ muốn thử nghiệm, Python chính là ngôn ngữ lập trình chính duy nhất giúp việc này trở nên dễ dàng hơn.
Mặc dù có các thư viện Học máy cũng có sẵn trong Java, nhưng bạn sẽ tìm thấy nhiều nội dung hơn khi tìm hiểu về Python vì cộng đồng lập trình viên Python nghiên cứu về Khoa học dữ liệu và Máy học nhiều hơn bất cứ cộng đồng nào khác.
3. Python có thể Lập trình Web
Bạn muốn lập trình web một lý do khác để nên học Python. Nó cung cấp rất nhiều thư viện và framework tốt, ví dụ: Bạn có thể dễ dàng lập trình web với Framework Django và Flask.
Các nhiệm vụ mất hàng giờ PHP mới xử lý được thì có thể được hoàn thành trong vài phút đối với Python.
Python cũng được sử dụng rất nhiều để xây dựng các trang web dạng như mạng xã hội. Reddit chính là một trong số đó
Note: Theo báo cáo khảo sát của Stack Overflow thì Reddit là mạng xã hội phổ biến nhất đối với các Lập trình viên.
4. Nói Python dễ học Thứ Hai thì không ngôn ngữ nào dám chọn Thứ Nhất
“Dễ học” chính là lý do để người mới bắt đầu học lập trình chọn học Python.
Khi bạn lần đầu tiên bắt đầu với lập trình, bạn chắc chắn không muốn bắt đầu với một ngôn ngữ lập trình có cú pháp khó, trừu tượng đâu.
Python vừa dễ đọc vừa đơn giản. Việc cài đặt cũng rất dễ dàng, bạn không cần phải xử lý bất kỳ vấn đề về đường dẫn nào như trong lập trình Java hoặc các vấn đề về trình biên dịch như trong C ++.
Chỉ cần bấm Cài đặt Python và bạn đã hoàn tất.
Trong khi cài đặt, nó chỉ yêu cầu thêm một bước cài đặt PATH nhỏ, nếu bạn muốn chạy Python ở bất cứ đâu trên máy tính của mình mà thôi.
Học lập trình là một quá trình tự học rất nhiều. Nhưng không phải tự học là bạn chỉ mua sách về đọc.
Những lúc bí code hay muốn tìm tài liệu, muốn xem video hướng dẫn thì bạn chẳng phải chạy lên Google, Youtube, Stack Overflow mà hỏi hay sao?
Tất cả những tài nguyên, tài liệu, video trên Internet đó là do cộng đồng lập trình viên họ thảo luận, họ đăng tải, họ up lên.
Tài nguyên nhiều tương đương với Cộng đồng Python lớn.
Lý do là vì:
Thời gian phát triển đã lâu, từ năm 1991
Số lượng người đóng góp lớn thứ 3 trên Github
Công nghệ phổ biến thứ 4 theo Khảo sát của Stack Overflow năm 2019
6. Python có một bộ thư viện và Framework siêu to khổng lồ
Một trong những điểm tương đồng giữa Python và Java là có lượng lớn các thư viện, Framework và modules nguồn mở có sẵn để làm bất cứ điều gì bạn muốn làm.
Nó làm cho việc phát triển ứng dụng thực sự dễ dàng. (Chỉ cần Copy – Paste là xong )
Bạn thử tưởng tượng, bạn muốn lập trình một trang web mà không có Spring trong Java hoặc Django và Flask trong Python xem.
Nó quá Khổ.
Có Framework làm cho công việc của bạn đơn giản, vì việc của bạn lúc này là chỉ cần tập trung vào Business logic thôi.
Python có nhiều thư viện cho các nhu cầu khác nhau. Django và Flask là hai trong số phổ biến nhất để lập trình web. NumPy và SciPy là phổ biến nhất dành cho Khoa học dữ liệu.
Trên thực tế, Python có một trong những bộ sưu tập tốt nhất về thư viện Khoa học dữ liệu và Học máy như TensorFlow, Scikit-Learn, Keras, Pandas và nhiều hơn thế nữa.
Nếu bạn thấy thú vị và muốn tìm hiểu thêm ngay về các thư viện Học máy của Python, mình khuyên bạn trước tiên, hãy học Python cơ bản ngay nhé.
Sau đó chỉ cần học “Sử dụng Framework” là xong.
7. Khả năng tự động hóa trong Python rất Pro
Khi lần đầu tiên mình biết về Python là do mình có nhu cầu viết một đoạn Script. Mình đã làm việc với một ứng dụng nhận tin nhắn qua UDP và nó có một vấn đề, đó là không thấy tin nhắn trong nhật ký.
Mình muốn kiểm tra xem liệu mình có nhận được bất kỳ traffic UDP nào trên box đó và port đó hay không nhưng mình không thể tìm thấy một lệnh UNIX tiện dụng để làm điều đó.
Một người bạn của mình, người ngồi cạnh mình đang học Python và anh ấy đã viết một extension chỉ trong 5 phút để chặn tin nhắn UDP bằng một trong các Module của Python.
Lúc đó, mình đã rất ấn tượng với thời gian anh ấy viết một công cụ như vậy. Tốc độ này đã làm nổi bật lên sức mạnh của Python khi viết Script, công cụ và tool tự động hóa.
8. Python là Đa-zi-năng
Một trong những điều mình thích về Python là tính Đa-zi-năng của nó.
Nó không bị ràng buộc với chỉ một nhiệm vụ, ví dụ: R rất tốt về Khoa học dữ liệu và Học máy nhưng lặn mất tăm khi nói đến lập trình web.
Học được Python có nghĩa là bạn có thể làm rất nhiều thứ.
Bạn có thể lập trình các trang web của mình bằng Django và Flask, có thể thực hiện nhiệm vụ Phân tích dữ liệu bằng NumPy, Scipy, Scikit-Learn và NLTK.
Ở mức tối thiểu, bạn có thể sử dụng Python để viết các tập lệnh để tự động hóa nhiều công việc hàng ngày của bạn.
9. Python có nhiều công việc và khả năng phát triển lớn
Python đang phát triển rất nhanh và đang định nghĩa xu hướng mới.
Có ai mà không muốn học một ngôn ngữ lập trình lớn vẫn đang tiếp phát triển mạnh ở thời điểm mới bắt đầu sự nghiệp lập trình viên cơ chứ?
Nó không chỉ giúp bạn có được một công việc nhanh chóng mà còn giúp tăng tốc sự nghiệp của bạn.
Và…
Đối với người mới bắt đầu, đây mới là lý do quan trọng nhất để chọn học lập trình Python.
Các lập trình viên Python là một trong những lập trình viên được trả lương cao nhất, đặc biệt là về Khoa học dữ liệu, Học máy và Lập trình web.
Trung bình, họ được trả lương rất tốt, từ 70.000 USD đến 150.000 USD tùy thuộc vào kinh nghiệm, địa điểm và lĩnh vực chủ chốt của họ.
Tại việt Nam, theo Khảo sát của Top Dev, Kỹ sư Khoa học dữ liệu được trả lương lên tới 2.500 $ mà vẫn khó kiếm người.
Nếu bạn quan tâm đến việc tìm hiểu thêm về các công việc công nghệ có mức lương cao, mình khuyên bạn nên học Python ngay hôm nay!
Lời kết
Đó là tất cả về 10 lý do quan trọng nên học lập trình Python vào năm 2024.
Như mình đã nói, điều quan trọng là phải biết lập trình trong thế giới mà công nghệ thông tin làm chủ. Nếu bạn muốn làm nghề lập trình nhưng chưa từng học lập trình thì…
Khóa Học Python miễn phí của ucode.vn là một cách tốt nhất để bắt đầu nghề lập trình và chinh phục các lĩnh vực bạn mong muốn.
Đối với các lập trình viên đã biết lập trình Java hoặc C ++, học Python không chỉ giúp bạn trở thành lập trình viên tốt hơn mà còn cung cấp cho bạn một công cụ mạnh mẽ để viết các tập lệnh, tạo một ứng dụng web và mở ra một lĩnh vực thú vị về Khoa học dữ liệu và Học máy.
Nói tóm lại, nếu bạn chỉ có thể học một ngôn ngữ lập trình vào năm 2024 thì hãy học Python ngay.
Bài viết được sự cho phép của tác giả Phạm Văn Nguyên
Vì vậy, bạn muốn tạo blog lập trình đầu tiên của bạn?
Đây là một ý tưởng tuyệt vời. Tôi tin rằng mọi nhà phát triển nên có một blog và tôi sẽ liệt kê các lý do tại sao không lâu nữa.
Trong bài viết này, tôi sẽ giả định rằng bạn là người mới bắt đầu tuyệt đối chưa bao giờ xây dựng một trang web trước đây.
Tôi sẽ hướng dẫn bạn chính xác cách xây dựng blog lập trình từng bước, bắt đầu từ việc chọn máy chủ web, đăng ký tên miền, chọn nền tảng blog tốt cho nhà phát triển, cho đến cách bạn bắt đầu viết và quảng bá bài viết của mình .
Nếu không có thêm rắc rối, hãy nhảy ngay vào nó.
Tại sao mỗi lập trình viên nên có một Blog?
Trước tiên, tại sao bạn nên tạo blog mã hóa của mình ngay từ đầu?
Tôi hiểu rồi.
Kỹ sư phần mềm ghét viết.
Thậm chí rất khó để khiến chúng tôi nhận xét mã của riêng mình.
Vậy tại sao trên Trái đất bạn sẽ bắt đầu một blog lập trình ?
Thực sự, bắt đầu một blog lập trình sẽ có lợi cho bạn theo nhiều cách.
Hãy thảo luận về một số lợi ích.
1. Cải thiện kỹ năng kỹ thuật của bạn
Có một nguyên tắc tiếng Latin cổ xưa nổi tiếng Cách tốt nhất để học một cái gì đó là dạy nó .
Tôi thấy nguyên tắc này trực tiếp là rất đúng.
Trong nhiều năm, tôi đã từng dạy môn Khoa học Máy tính cho sinh viên chưa tốt nghiệp.
Tôi không đùa bạn, mỗi lần tôi dạy một khóa học, tôi cũng trở nên tốt hơn với những gì tôi đang dạy.
Dạy học thúc đẩy bạn tìm hiểu thêm về chủ đề của bạn, điều này không chỉ tốt cho sinh viên của bạn mà còn cho chính bản thân bạn.
Bắt đầu một blog lập trình rất giống với giảng dạy bởi vì trong blog của bạn, bạn sẽ dạy thế giới về lập trình và khoa học máy tính.
Tôi chỉ thích dạy học.
Nếu bạn muốn trở thành một lập trình viên tốt hơn, hãy dạy lập trình thông qua blog của bạn
2. Kiếm một số thu nhập phụ
Có một blog cho phép bạn có một nguồn thu nhập phụ tốt mà bạn không có.
3. Tự tiếp thị
Thay vì tôi bập bẹ về cách bạn có thể sử dụng blog của mình để tiếp thị bản thân, hãy xem THỰC SỰ một nghiên cứu trường hợp thực tế.
Bạn có biết Jeff Atwood là ai không?
Nếu bạn làm trong ngành công nghiệp phần mềm và bạn không biết Jeff Atwood là ai, thì bạn đã sống dưới một tảng đá.
Chỉ trong trường hợp để tôi nói với bạn rằng Atwood, cùng với Joel Spolsky, là người sáng lập Stack Overflow .
Bây giờ tôi chắc chắn bạn biết Stack Overflow là gì.
Nếu không, thì bạn chắc chắn chưa sẵn sàng để bắt đầu một blog lập trình
Nhưng bạn có biết Jeff Atwood thực sự được biết đến vì điều gì không?
Blog của anh, Coding Horror , mà anh tạo ra năm 2004 là một trong những blog lập trình phổ biến nhất trên internet.
Không chỉ vậy, mà blog của anh ấy là lý do tại sao anh ấy gặp Spolsky ngay từ đầu!
Blog của bạn sẽ mở ra những cơ hội kinh doanh và kết nối khác nhau mà bạn có thể không tìm thấy.
4. Học cách viết và trình bày ý tưởng của bạn
Dù bạn có tin hay không nhưng sự nghiệp phần mềm của bạn phụ thuộc rất nhiều vào việc bạn giỏi giao tiếp và trình bày ý tưởng của mình như thế nào.
Đừng hiểu sai ý tôi, nếu bạn là một lập trình viên nhạc rock, bạn vẫn sẽ làm tốt nhưng tiềm năng nghề nghiệp của bạn chắc chắn sẽ bị hạn chế bởi khả năng trình bày và truyền đạt ý tưởng của bạn.
Một trong nhiều cách bạn có thể cải thiện kỹ năng giao tiếp của mình là thông qua viết .
Nếu bạn cảm thấy rằng bạn không biết viết ngay từ đầu, thì điều này phổ biến hơn bạn nghĩ.
Chỉ cần giữ nó và theo thời gian bạn sẽ cải thiện và trở nên tốt hơn.
5. Trở thành người có thẩm quyền trong lĩnh vực của bạn
Có một blog Lập trình giúp bạn xây dựng uy quyền trong lĩnh vực của mình.
Và trở thành người có thẩm quyền giúp bạn nổi bật giữa các kỹ sư phần mềm khác và mở ra cánh cửa cho vai trò lãnh đạo.
6. Tìm hiểu về tiếp thị trực tuyến
Để có một blog thành công, bạn sẽ cần phải tiếp thị nó.
Tiếp thị blog của bạn thực sự không phải là một nhiệm vụ dễ dàng và đòi hỏi bạn phải học hỏi nhiều về tiếp thị trực tuyến.
Tôi thấy tiếp thị trực tuyến là một kỹ năng cực kỳ quý giá mà các kỹ sư phần mềm cần phải có trong tiết mục của họ.
Điều này tự nó làm cho việc bắt đầu một blog là một mục tiêu xứng đáng theo ý kiến của tôi.
OK, bây giờ làm thế nào bạn có thể tạo một blog lập trình?
Bây giờ hãy nói cụ thể về những gì bạn cần làm để đưa blog của bạn lên và chạy nhanh .
Khóa học đầu tiên của hành động là chọn một máy chủ web .
Bước một: Chọn máy chủ web
Bạn là một lập trình viên nên tôi sẽ giả sử bạn biết web hosting là gì và mục đích của nó là gì.
Nhưng chỉ trong trường hợp bạn không, lưu trữ web về cơ bản là máy tính (hoặc máy tính) sẽ lưu trữ các tệp tạo blog của bạn.
Một blog (hoặc bất kỳ trang web nào cho vấn đề đó) không có gì ngoài một số tệp (ví dụ: HTML, javascript, CSS) sống trong một máy có thể truy cập từ internet.
Và máy này phải hoạt động 24/7 hoặc nếu không người dùng của bạn sẽ không thể truy cập trang web của bạn mọi lúc.
Có rất nhiều tùy chọn ngoài kia cho các dịch vụ có thể lưu trữ trang web của bạn nhưng tôi sẽ thu hẹp chúng cho bạn hai tùy chọn mà cá nhân tôi sử dụng và vô cùng hài lòng.
Tùy chọn 1 (Chọn web server, hosting, domain với Z.com )
Z.com – Thương hiệu toàn cầu của tập đoàn GMO Internet. Nhà cung cấp tên miền, hosting hàng đầu châu Á với thành tích hơn 12 triệu tên miền và 750,000 Hosting được đăng ký. Chúng tôi luôn đảm bảo chất lượng dịch vụ hàng đầu, đáng tin cậy với giá cả cạnh tranh.
Đặc điểm:
• Sử dụng bảng điều khiển đa chức năng cPanel được cả thế giới tin dùng: không cần các câu lệnh phức tạp, chỉ cần vài thao tác đơn giản để khởi động. Ngoài ra rất nhiều chức năng khác cũng được tích hợp như Mail, File Manager, Back-up, Access Log Analyzer.
• Trung tâm dữ liệu được đặt tại nhiều quốc gia. Trước đây, Z.com có Data Center (DC) được đặt tại Singapore, Mỹ, Nhật. Ngày 1/12/2016, đã chính thức ra mắt thêm DC tại Việt Nam, nhằm mang đến đường truyền ổn định hơn, tốc độ nhanh hơn hơn cho khách hàng.
• Bộ lọc Spam mail: Z.com sử dụng Cloudmark Authority được đánh giá tiêu chuẩn cao nhất trên thế giới, có thể đối ứng nhanh chóng với những mối đe dọa tối tân, block được trên 98% các cuộc tấn công.
Nếu bạn muốn bắt đầu viết blog của mình ngay lập tức và bạn không muốn dành thời gian của mình để làm một số công cụ kỹ thuật tuyệt vời thì tôi khuyên bạn nên dùng Bluehost .
Bluehost sẽ làm cho quá trình tạo trang web và blog của bạn trở nên dễ dàng đến không ngờ vì mục tiêu chính của họ là những người không có kỹ thuật; những người có lẽ không bao giờ mã hóa một chương trình Hello world trong cuộc sống của họ.
Bạn chỉ có thể tưởng tượng nó sẽ đơn giản như thế nào đối với bạn.
Bây giờ hãy xem những gì Bluehost thực sự cung cấp cho bạn.
Bluehost cung cấp các loại lưu trữ khác nhau.
Một trong những tôi đặc biệt nói về được gọi là lưu trữ chia sẻ.
Nhưng trước khi tôi cho bạn biết lý do tại sao tôi khuyên bạn nên chia sẻ lưu trữ từ Bluehost, trước tiên hãy để tôi giải thích ý nghĩa của từng tùy chọn này:
Lưu trữ được chia sẻ có nghĩa là trang web của bạn sẽ sống cạnh các trang web khác trên cùng một máy ảo . Nói cách khác, Một máy ảo sẽ phục vụ trang web của bạn cùng với các trang web khác cùng một lúc.
VPS hoặc Virtual Private Server chỉ là một từ ưa thích cho một máy ảo. Trong ưu đãi này, về cơ bản bạn sở hữu toàn bộ máy ảo và bạn có quyền truy cập root vào nó. Bạn có thể kết nối từ xa với máy ảo này, cài đặt ứng dụng và làm bất cứ điều gì bạn muốn như thể bạn đang làm việc trên máy tính xách tay của riêng mình. Không cần phải nói, máy ảo này sẽ chỉ phục vụ trang web của bạn và trang web của bạn.
Chuyên dụng có nghĩa là bạn sẽ thuê toàn bộ máy vật lý (không phải ảo).
Bây giờ hãy quay lại lưu trữ được chia sẻ .
Chia sẻ lưu trữ chắc chắn có lợi thế và bất lợi của nó.
Ưu điểm lớn nhất là nó rẻ một cách lố bịch nên nó là một lựa chọn tuyệt vời đặc biệt nếu bạn đang bắt đầu hoặc nếu bạn chỉ muốn chơi xung quanh và thoải mái với việc tạo trang web.
Nhưng có một số nhược điểm lớn.
Đầu tiên, bạn mất quyền kiểm soát vì bạn không sở hữu máy ảo mà blog của bạn đang chạy.
Thứ hai, lưu trữ chia sẻ sẽ không phải là một lựa chọn khả thi khi blog của bạn bắt đầu phát triển và một số lượng lớn người bắt đầu đến trang web của bạn.
Vì vậy, quá trình hành động tốt nhất là gì?
Đây là chiến lược của tôi: đối với mọi ý tưởng trang web mà bạn có, bạn nên luôn bắt đầu với giải pháp lưu trữ chia sẻ Bluehost giá rẻ và ngay khi bạn nhận thấy rằng trang web của bạn bắt đầu có lưu lượng truy cập đáng kể , hãy nghĩ đến việc nâng cấp lên giải pháp cấp cao hơn.
Vì tôi cảm thấy thoải mái với công nghệ, tôi thường chuyển các trang web hiệu suất cao của mình sang Z.com .
Tiếp theo hãy chọn tên cho trang web của bạn!
Bước hai: Đăng ký tên miền của bạn
Trong bước này, bạn sẽ đăng ký tên miền của bạn .
Nói một cách đơn giản, tên miền của bạn là tên trang web của bạn
Nhưng chúng ta hãy tìm hiểu một chút và giải thích cách tên miền thực sự hoạt động.
Mỗi máy tính trên internet có một địa chỉ gọi là địa chỉ IP .
Ví dụ: để tìm địa chỉ IP của google.com , bạn có thể làm như sau:
ping google.com
Lưu ý rằng google.com thực sự có nhiều địa chỉ IP và đây chỉ là một trong số đó.
Để có thể giao tiếp với bất kỳ máy nào qua internet, bạn cần biết địa chỉ IP của máy đó.
Vì vậy, khi bạn nhập ‘google.com’ trên trình duyệt của mình, HĐH của bạn sẽ tự động cố gắng dịch tên ‘google.com’ sang địa chỉ IP của nó.
Điều này xảy ra bằng cách truy vấn một cái gì đó gọi là máy chủ DNS .
Bạn có thể nghĩ về một máy chủ DNS như một cơ sở dữ liệu phân tán chịu trách nhiệm ánh xạ tên miền thành địa chỉ IP .
Được rồi, bây giờ với thông tin này trong tâm trí, đây là những gì bạn sẽ làm trong bước này.
1- bảo lưu tên miền cho chính bạn để không ai khác có thể sử dụng nó.
2- cấu hình tên miền để ánh xạ tới địa chỉ IP của máy bạn có từ máy chủ web.
Bạn có thể mua tên miền ở đâu?
Đầu tiên, trước khi bạn đi mua sắm xung quanh, hãy đảm bảo kiểm tra xem máy chủ của bạn có cung cấp một tên miền miễn phí hay không.
Đôi khi các công ty lưu trữ sẽ cung cấp cho bạn một tên miền miễn phí trong một năm để khuyến khích bạn lưu trữ với họ.
Ví dụ: Bluehost cung cấp cho bạn một tên miền miễn phí khi bạn lưu trữ với họ.
Một điều khác bạn phải biết là việc đăng ký một tên miền cho phép bạn sở hữu tên miền đó chỉ trong một năm.
Vì vậy, bạn sẽ cần gia hạn đăng ký hàng năm để giữ cho tên miền của bạn tồn tại.
Nếu không, tên miền của bạn đã biến mất!
Đừng quên làm điều đó hoặc những điều xấu có thể xảy ra .
Nó chỉ giống như 10 đô la một năm dù sao đi nữa.
Một lần nữa bạn sẽ tìm thấy rất nhiều dịch vụ mà bạn có thể sử dụng để đăng ký tên miền của mình.
Một dịch vụ tuyệt vời khác mà tôi thường xuyên sử dụng những ngày này là tên miền Google .
Nó cũng có một giao diện rất đẹp và siêu dễ sử dụng.
Cho dù bạn đi với tên miền Namecheap hoặc Google (hoặc bất kỳ dịch vụ nào khác cho vấn đề đó), bạn sẽ cần định cấu hình tên miền của mình để ánh xạ tới địa chỉ IP của bạn.
Bước ba: Cài đặt WordPress
Hãy xem lại những gì bạn có cho đến nay.
Bạn có một máy từ máy chủ web được kết nối với Internet 24/7 và sẵn sàng phục vụ trang web của bạn.
Bạn cũng có một tên miền để mọi người có thể truy cập trang web của bạn bằng cách nhập tên miền này vào trình duyệt của họ.
Bây giờ đã đến lúc ngồi xuống, thư giãn và bắt đầu viết bài đăng trên blog tuyệt vời của bạn.
Là một lập trình viên tuyệt vời mà bạn đang có, bạn xắn tay áo và tự suy nghĩ: Cuối cùng! đã đến lúc thể hiện các kỹ năng HTML, CSS và javascript của tôi ????
Hmm tốt, không thực sự.
Mặc dù tôi khuyên bạn nên học HTML, CSS và javascript cho dù bạn có muốn bắt đầu blog lập trình của mình hay không, hãy để tôi dừng bạn ngay tại đó trong một giây.
Nếu bạn muốn xây dựng blog của mình từ đầu bằng cách sử dụng HTML, CSS và javascript, nó sẽ rất gian khổ.
Vì vậy hãy sử dụng 1 CMS hoặc 1 framework nào đó.
Nếu bạn dùng PHP có rất nhiều CMS nổi tiếng, WordPress là một ví dụ điển hình. Nếu bạn muốn xấy dựng blog riêng bằng frameword thì có thể sử dụng 1 php framework bất kỳ, như: Yii, Laravel, Codeigniter, CakePHP, Phalcon, …
Nếu bạn dùng Python có thể sử dụng: Flask, Django,..
Nếu bạn dùng Ruby có thể dùng Ruby On Rails.
Nếu bạn dùng NodeJS có thể dùng framework: Express,..
Nếu bạn dùng Go (Golang) thì có thể sử dụng các framework như: gin-gonic, Begoo, Iris, echo, revel,…
Hoặc dùng ASP.NET/ASP.NET MVC, JSP.
Xây dựng bằng bất kỳ ngôn ngữ/framerork gì cũng được miễn là thứ mà bạn thông thạo nhất.
Ví dụ sau sử dụng WordPress thay thế.
Đây là cách nền tảng trông như thế nào.
Như bạn có thể thấy, nó có giao diện người dùng rất sạch sẽ.
Nó cũng đáng tin cậy, miễn phí, mã nguồn mở và rất thuận tiện để sử dụng.
Với WordPress, bạn hoàn toàn có thể xuất bản bài viết đầu tiên của mình vào cùng ngày bạn đăng ký máy chủ web.
Bây giờ hãy xem cách bạn có thể cài đặt WordPress trên Bluehost và trên Digital Ocean.
WordPress trên Bluehost
Chúng tôi đã nói chuyện trước đó với Bluehost, bạn sẽ có được sự thuận tiện .
Trong trường hợp, Bluehost không yêu cầu bạn phải cài đặt WordPress. Nó được cài đặt sẵn với tài khoản của bạn.
Bạn có thể xắn tay áo và bắt đầu viết blog ngay lập tức!
WordPress trên Đại dương số
Digital Ocean là một con thú hoàn toàn khác.
Hãy nhớ rằng với Digital Ocean, bạn sẽ có được sự kiểm soát với chi phí thuận tiện.
Điều này có nghĩa là cài đặt WordPress thực sự là ít lo lắng nhất của bạn.
Trước khi lo lắng về WordPress, trước tiên bạn cần cài đặt và định cấu hình máy chủ web ( apache hoặc nginx ).
Sau đó, bạn cần cài đặt cơ sở dữ liệu MySQL và định cấu hình chính xác cho WordPress.
Và cuối cùng, bạn cần phải tự cài đặt và định cấu hình WordPress .
Ngoài ra, Digital Ocean có một hình ảnh WordPress được tạo sẵn mà bạn có thể sử dụng ngay.
Bước bốn: Thiết lập các chủ đề và plugin WordPress
Bây giờ bạn đã có tất cả các công cụ bạn cần trong vành đai của mình, đã đến lúc bắt đầu làm quen với nền tảng WordPress.
Nhưng đừng lo lắng, nó thực sự khá cơ bản và bạn có thể tự học nó khá nhanh chỉ trong vài giờ.
Tôi khuyên bạn nên bắt đầu bằng cách viết một vài bài đăng trên blog cho đến khi bạn hiểu rõ về nó.
WordPress thực sự có rất nhiều plugin
Điều này có nghĩa là bạn có thể cài đặt các công cụ của bên thứ ba có thể tích hợp với trang web WordPress của bạn và giúp bạn mọi thứ.
Ví dụ: các themes WordPress có nghĩa là để tăng cường hình ảnh của blog của bạn.
Các plugin , mặt khác, có nghĩa là để mở rộng chức năng của trang web WordPress của bạn.
Trong phần tiếp theo, tôi sẽ nói về các chủ đề và các plugin mà bạn cần cho blog lập trình của bạn.
Chọn themes đề WordPress
Câu chuyện dài, đừng sử dụng các themes WordPress miễn phí.
Themes miễn phí rất tốt khi bạn bắt đầu và bạn không biết mình đang làm gì nhưng ngay khi bạn quyết định nghiêm túc thì bạn sẽ cần phải chuyển sang các chủ đề tốt hơn (thường không miễn phí).
Hãy nhớ rằng themes của bạn chỉ ra mức độ hấp dẫn trực quan của trang web của bạn và đây là điều bạn không muốn tiết kiệm trên ngay cả đối với một blog kỹ thuật.
Vì vậy, những themes WordPress nào tôi khuyên bạn nên?
Tôi đánh giá cao Divi
Divi có lẽ là chủ đề WordPress phổ biến nhất trên internet.
Để có thể tải xuống Divi, bạn cần tham gia Eleganttheme .
Bạn có thể đăng ký thuê bao hàng năm hoặc đăng ký trọn đời của họ.
Với đăng ký trọn đời, bạn chỉ phải trả tiền một lần và bạn có quyền truy cập trọn đời vào tất cả các themes và plugin cao cấp của họ , bao gồm cả Divi .
Làm cho mình một ưu tiên và làm nghiên cứu của riêng bạn trước khi chọn một chủ đề, bởi vì di chuyển sau này có thể thực sự đau đớn.
Bây giờ, hãy chuyển đổi bánh răng và nói về một plugin cơ bản mà bạn thực sự cần cho bất kỳ blog lập trình nào .
Một trong đó sẽ cho phép bạn viết đoạn mã trong bài viết blog của bạn
Sau đó, tất cả những gì bạn cần làm là đặt mã của bạn giữa các thẻ <pre> và <code>và nó sẽ định dạng chính xác mã của bạn một cách chính xác.
Về sau, tôi cũng có một số CSS tùy chỉnh mà tôi áp dụng cho đoạn mã của mình để làm cho chúng trông đẹp hơn.
Vì vậy, đây là điều mà bạn nên thử nghiệm.
Bây giờ mọi thứ đã ổn định, hãy nói về logo của bạn!
Bước năm: Thuê ngoài thiết kế logo và thiết kế đồ họa
Đến bây giờ, bạn nên có tất cả các khối xây dựng cơ bản của blog của mình.
Nhưng có một cái gì đó thiếu.
Bạn cần một logo.
Trang web của bạn phải hấp dẫn trực quan.
Có một logo chuyên nghiệp, được thiết kế tốt sẽ không chỉ tăng tính thẩm mỹ cho trang web của bạn mà còn tạo dựng niềm tin với độc giả của bạn.
Hãy nghĩ về nó, bạn đã tắt trang web bao nhiêu lần chỉ vì logo và thiết kế đồ họa của họ hơi sơ sài? Có lẽ nhiều lần.
Một logo tốt là một phần không thể thiếu trong thương hiệu cá nhân hoặc doanh nghiệp tổng thể của bạn, nó giúp bạn được chú ý trên thế giới và giữa các đồng nghiệp.
Bây giờ tôi không biết về bạn nhưng kỹ năng nghệ thuật của tôi gần như không tồn tại
Và vì lý do đó, đây là những gì tôi làm cho tất cả các thiết kế logo và tác phẩm nghệ thuật truyền thông xã hội của mình: tôi thuê ngoài chúng .
Có hai nơi mà cá nhân tôi sử dụng để thuê ngoài bất kỳ thiết kế đồ họa nào.
1. Fiverr
Fiverr là một trong những thị trường trực tuyến lớn nhất dành cho các dịch giả tự do với các dịch vụ bắt đầu từ năm đô la.
Nó chắc chắn là về phía rẻ hơn, và các dịch vụ được cung cấp trên Fiverr bao gồm rất nhiều loại.
Một điều cần xem xét nếu bạn quyết định sử dụng Fiverr là kiểm tra cẩn thận các đánh giá và lịch sử làm việc của các dịch giả tự do mà bạn sẵn sàng làm việc.
Fiverr tương đối rẻ, nhưng bạn có trách nhiệm kiểm tra những người làm việc tự do tốt từ những người xấu.
2. 99 thiết kế
99Designs là một lựa chọn tuyệt vời khác để thuê ngoài thiết kế đồ họa của bạn.
Tùy chọn này sẽ đắt hơn Fiverr nhưng cách thức hoạt động thì hoàn toàn khác.
Thay vì thuê một freelancer cụ thể để thiết kế logo của bạn, bạn tạo ra một cuộc thi thiết kế.
Sau khi bạn tạo ra cuộc thi thiết kế của mình và chỉ định rõ loại thiết kế bạn đang tìm kiếm, hàng chục nhà thiết kế sẽ cạnh tranh với nhau để giành chiến thắng trong cuộc thi bằng cách gửi các thiết kế phù hợp với tiêu chí mà bạn đã chỉ định.
Bạn nhận được hàng tấn thiết kế, bạn quyết định người chiến thắng và sau đó bạn có quyền đối với thiết kế.
Nó thật đơn giản!
Cá nhân tôi đã sử dụng 99 mẫu thiết kế nhiều lần bao gồm cả thiết kế logo cho trang web này.
Bước sáu: Tiếp thị Blog lập trình của bạn
Bạn thấy đấy, đó là một điều phải trải qua tất cả các bước tạo blog của bạn, đó là một điều khác để thực sự đưa người đọc đến blog của bạn.
Tiếp thị blog của bạn đòi hỏi một bộ kỹ năng không liên quan gì đến lập trình.
Bạn cần tìm hiểu về Marketing trực tuyến.
Trên thực tế, tiếp thị trực tuyến là một chủ đề lớn và không có cách nào tôi có thể thực hiện công lý chủ đề bằng cách trình bày nó trong một bài viết.
Tuy nhiên, tôi sẽ dạy cho bạn một số mẹo sẽ giúp bạn quảng bá blog của mình và đưa nó lên khỏi mặt đất.
Truyền thông xã hội
Cách dễ nhất bạn có thể làm là chia sẻ các bài viết trên blog của mình với bạn bè trên Facebook , Twitter hoặc Linkedin .
Bạn cũng có thể chia sẻ các bài viết của mình trên Reddit nhưng lưu ý rằng người dùng Reddit ghét tự quảng cáo và quảng cáo nói chung. Vì vậy, chỉ chia sẻ bài viết của bạn trên Reddit nếu chúng có liên quan (ví dụ: ai đó hỏi một câu hỏi lập trình mà bạn đã viết một bài viết về).
Ngoài ra, bạn có thể trả lời câu hỏi trên Quora . Bằng cách này, bạn không chỉ quảng bá blog của mình mà còn thiết lập chính mình như một người có thẩm quyền trong khi giúp đỡ người khác.
SEO
SEO có nghĩa là Tối ưu hóa Công cụ Tìm kiếm.
Bằng tiếng Anh, điều này có nghĩa là có lưu lượng truy cập vào trang web của bạn từ Google
Đây là nguồn lưu lượng tốt nhất cho blog của bạn vì hầu hết lưu lượng truy cập nhất quáncủa bạn sẽ thực sự đến từ Google.
Thay vì bạn chủ động quảng bá blog của mình, Google có thể quảng bá blog của bạn thay mặt bạn nếu Google nghĩ rằng bài viết của bạn trả lời các câu hỏi mà người dùng đang tìm kiếm.
Thật đáng kinh ngạc! Nhưng đừng hiểu sai ý tôi, điều đó không dễ và cần có thời gian.
Bạn thấy đấy, khi người dùng tìm kiếm trên Google, họ thường nhấp vào một trong 4 kết quả đầu tiên!
Bạn càng thấp trong bảng xếp hạng, người dùng sẽ càng ít truy cập trang của bạn.
Nếu bạn đang ở trang thứ hai của Google, có lẽ bạn sẽ không nhận được lưu lượng truy cập nào. Tin tôi đi, tôi biết
Bây giờ đây là ba mẹo để giúp bạn SEO:
1. Viết bài về các chủ đề mà mọi người đang tìm kiếm
Hãy đối mặt với nó, không phải mọi chủ đề bạn sẽ muốn viết là điều mà người khác sẽ tìm kiếm.
Để thành công, bạn cần đảm bảo rằng bạn đang viết bài về các chủ đề mà mọi người đang tìm kiếm.
Bạn có thể sử dụng các công cụ như công cụ lập kế hoạch từ khóa của Google để giúp bạn xác định các chủ đề mà mọi người đang tìm kiếm.
Nhưng hãy đợi một phút, điều đó có nghĩa là bạn không nên viết về các chủ đề mà bạn đam mê nếu những chủ đề này không có đủ lượng tìm kiếm?
Tuyệt đối không.
Điều tôi đang nói là rất có thể bạn sẽ cần phải dựa vào các phương pháp quảng bá loại bài viết này bên ngoài Google.
Ví dụ: bạn có thể sử dụng phương tiện truyền thông xã hội, Reddit, hacker news hoặc thậm chí liên kết đến các bài viết này từ các bài viết thân thiện với SEO khác trên blog của bạn;).
Thành thật mà nói, Google đang làm một công việc tuyệt vời để đưa những bài viết hay nhất lên đầu kết quả tìm kiếm của họ (hầu hết thời gian).
Điều này có nghĩa là bạn nên tập trung vào việc viết các bài viết tốt hơn so với các bài viết của đối thủ cạnh tranh của bạn.
Nếu bạn làm điều đó, bạn sẽ ổn thôi. Nó thực sự là đơn giản mà. Chất lượng hơn số lượng.
Một điều cuối cùng, hãy kiên nhẫn.
Đôi khi có thể mất tới 6 tháng trước khi một bài viết mới trên blog của bạn có thể mang lại bất kỳ lưu lượng truy cập nào từ Google.
SEO là một cuộc đua marathon, không phải là chạy nước rút, nhưng nếu bạn thực sự thích viết và dạy mọi người về lập trình và khoa học máy tính, thì việc kiên nhẫn sẽ không khó đến thế.
Phần kết luận
Bắt đầu một blog lập trình có thể rất hữu ích cho bạn ở rất nhiều cấp độ.
Để có thể bắt đầu viết blog ngay lập tức, bạn cần chọn một máy chủ web tốt, tên miền có thương hiệu, themes WordPress trực quan hấp dẫn và cài đặt một số plugin sẽ giúp bạn viết đoạn mã trong blog của mình.
Bạn cũng cần tìm hiểu về nghệ thuật và khoa học để quảng bá blog của mình, cho dù thông qua SEO hay phương tiện truyền thông xã hội.
Liệu HTTP là gì? Có lẽ điều quen thuộc nhất khi chúng ta bắt gặp khi sử dụng trình duyệt để truy cập Internet chính là HTTP. Chắc các bạn cũng đã biết khi thấy 1 địa chỉ web đều bắt đầu với http:// hay https://.
Hôm nay qua bài viết này, TopDev sẽ giới thiệu cho các bạn về những điều cơ bản nhất của HTTP nha.
HTTP là gì?
HTTP là từ viết tắt của Hyper Text Transfer Protocol nghĩa là Giao thức Truyền tải Siêu Văn Bản được sử dụng trong www. HTTP là 1 giao thức cho phép tìm nạp tài nguyên, chẳng hạn như HTML doc.
Nó là nền tảng của bất kỳ sự trao đổi dữ liệu nào trên Web và cũng là giao thức giữa client (thường là các trình duyệt hay bất kỳ loại thiết bị, chương trình nào) và server (thường là các máy tính trên đám mây). 1 doc hoàn chỉnh được tái tạo từ các doc con khác nhau được fetch – tìm nạp, chẳng hạn như văn bản, mô tả layout, hình ảnh, video, script v..v..
Ảnh mô tả việc fetching 1 trang web. Nguồn: Mozilla
Được thiết kế lần đầu từ những năm 90, HTTP là 1 giao thức có thể mở rộng vốn đã phát triển dần theo thời gian. 1 giao thức lớp ứng dụng được gửi thông qua nền tảng TCP/IP , hay qua 1 kết nối TCP được mã hóa TLS. Mặc dù về mặt lý thuyết, bất kỳ giao thức truyền tải đáng tin cậy nào cũng có thể được sử dụng.
Nhờ vào khả năng mở rộng của nó, HTTP được sử dụng để không chỉ tìm nạp các tài liệu siêu văn bản mà còn cả hình ảnh và video hoặc để đăng tải nội dung lên server, giống như với các kết quả form HTML. HTTP cũng có thể được sử dụng để tìm nạp các phần của các doc nhằm cập nhật các trang web theo yêu cầu.
Khía cạnh cơ bản của HTTP
HTTP là gì? HTTP là 1 giao thức tuy đơn giản nhưng khá mạnh mẽ nhờ vào các đặc trưng cơ bản sau đây.
HTTP đơn giản:
HTTP thường được thiết kế để trở nên đơn giản và thân thiện để con người có thể đọc được, ngay cả khi có thêm sự phức tạp được giới thiệu trong HTTP/2 bằng cách đóng gói các HTTP message thành các frame. Với các HTTP message, chúng ta có thể được đọc và hiểu được, cung cấp khả năng testing hơn cho các dev và giảm thiểu độ phức tạp cho bất cứ người mới nào.
HTTP có thể mở rộng:
Được giới thiệu trong HTTP/1.0, các header HTTP làm cho giao thức này dễ dàng mở rộng và thử nghiệm hơn nữa. Chức năng mới thậm chí có thể được giới thiệu bằng 1 thỏa thuận đơn giản giữa 1 client và 1 máy chủ về ngữ nghĩa của 1 header mới.
HTTP là stateless, nhưng không sessionless:
Không có liên kết giữa 2 yêu cầu được thực hiện liên tiếp trên cùng 1 kết nối. Điều này ngay lập tức có khả năng trở thành vấn để với người dùng cố gắng tương tác với các trang nhất định 1 cách mạch lạc, chẳng hạn như sử dụng shopping cart trên các trang e-commerce, tức thương mại điện tử.
Nhưng trong khi cốt lõi bản thân HTTP là stateless, các cookie HTTP cho phép sử dụng các session trạng thái. Sử dụng khả năng mở rộng header, các cookie HTTP được thêm vào quy trình vận hành, cho phép tạo các session trên mỗi yêu cầu HTTP để chia sẻ cùng 1 ngữ cảnh hay cùng 1 trạng thái.
Cấu trúc cơ bản của HTTP
Qua sơ đồ bên dưới, các bạn sẽ thấy được cấu trúc khá đơn giản của 1 ứng dụng web và miêu tả cụ thể vị trí của HTTP là gì:
Cấu trúc cơ bản của 1 ứng dụng web. Nguồn: Tutorialspoint.
Giao thức HTTP là gì? HTTP còn là 1 giao thức Yêu cầu – Phản hồi dựa trên cấu trúc Client – Server. Client và Server giao tiếp với nhau bằng cách trao đổi các message độc lập (trái ngược với 1 luồng dữ liệu). Các message được gửi bởi client, thông thường là 1 trình duyệt web, được gọi là các yêu cầu và message được gửi bởi server như 1 sự trả lời, được gọi là phản hồi.
1 kết nối được kiểm soát tại layer truyền tải, do đó về cơ bản nằm ngoài phạm vi của HTTP. Dù HTTP không yêu cầu giao thức truyền tải cơ bản phải dựa trên sự kết nối, vì chỉ yêu cầu nó đáng tin cậy hoặc không bị mất message (ít nhất là trình báo 1 lỗi). Trong số hai giao thức truyền tải phổ biến nhất trên Internet, TCP thì đáng tin cậy còn UDP thì không. HTTP do đó dựa vào tiêu chuẩn TCP vốn là connection-based (dựa trên sự kết nối).
Kết nối HTTP. Nguồn: Geeks for Geeks.
Trước khi 1 client và server có thể trao đổi 1 cặp yêu cầu – phản hồi HTTP, chúng phải thiết lập 1 kết nối TCP, 1 quá trình vốn yêu cầu 1 số vòng lặp. Hoạt động mặc định của HTTP/1.0 là mở 1 kết nối TCP riêng biệt cho từng cặp yêu cầu – phản hồi HTTP. Điều này làm nó kém hiệu quả hơn việc chia sẻ 1 kết nối TCP đơn lẻ khi nhiều yêu cầu được gửi liên tiếp.
Để giảm thiểu lỗ hỏng này, HTTP/1.1 đã giới thiệu pipelining (nhưng được chứng minh là khá khó để thực hiện) và kết nối liên tục: kết nối TCP bên dưới có thể được kiểm soát 1 phần bằng cách sử dụng tiêu đề Connection. HTTP/2 đã tiến 1 bước xa hơn bằng cách ghép các thông báo qua 1 kết nối duy nhất, giúp giữ cho kết nối ổn định và hiệu quả hơn.
Các thử nghiệm đang được tiến hành để thiết kế một giao thức truyền tải tốt hơn phù hợp hơn với HTTP. Ví dụ: Google đang thử nghiệm QUIC được xây dựng trên UDP để cung cấp giao thức truyền tải cũng đáng tin cậy và hiệu quả hơn.
MCG và cơ hội cho các lập trình viên trổ tài tại sàn đấu giá trực tuyến - Chozoi.vn
Với mong muốn mang đến cho thị trường Việt Nam các sản phẩm công nghệ tiên tiến và trải nghiệm hoàn toàn mới về phong cách sống hiện đại, MCG không ngừng sáng tạo và phát triển các nền tảng công nghệ, mang đến các sản phẩm hỗ trợ đắc lực cho cuộc sống con người, tạo nên một xã hội hiện đại, phồn thịnh.
MCG và cơ hội cho các lập trình viên trổ tài tại sàn đấu giá trực tuyến – Chozoi
MCG và sự ra đời của “sàn đấu giá trực tuyến” tiên phong tại Việt Nam
Được thành lập vào năm 2014, công ty cổ phần MCG là công ty công nghệ chuyên về lập trình máy tính với đội ngũ bao gồm những Software Engineer bước ra từ các dự án lớn tại Việt Nam. Từ khi thành lập đến nay, MCG không ngừng sáng tạo để đem đến các sản phẩm hỗ trợ đắc lực cho cuộc sống con người.
Hiểu được rằng sự phát triển của Internet chính là động lực để thúc đẩy sự tăng trưởng kinh tế toàn cầu, cùng với kinh nghiệm nhiều năm xây dựng nền tảng ECommerce, MCG ấp ủ tham vọng tạo ra những trung tâm mua sắm trực tuyến uy tín hàng đầu trong khu vực và tạo đột phá trong lĩnh vực thương mại điện tử tại Việt Nam.
Đến đầu năm 2018, với tinh thần mạnh mẽ, lòng nhiệt huyết và quyết tâm dám bứt phá, MCG chính thức “lấn sân” và phát triển sang mảng thương mại điện tử. Từ đó xây dựng một hệ sinh thái thông minh, coi người dùng là trung tâm và cho ra đời sản phẩm mang tên “Chợ zời”.
Chozoi là dự án Thương mại điện tử được ra đời dựa trên sự kế thừa và phát huy những điểm mạnh của các sàn TMĐT lớn đã có. Kết hợp với các đặc điểm của “Chợ giời” truyền thống tại miền Bắc (Việt Nam), Chozoi là nơi mỗi cá nhân có thể thỏa sức mua bán với vô vàn sản phẩm đa dạng thuộc nhiều lĩnh vực khác nhau, thoải mái “deal giá hời” và trải nghiệm mua sắm online một cách mới mẻ.
Đặc biệt, ngoài tính năng mua, bán như các trang thương mại điện tử khác trên thị trường, tại Chozoi người dùng còn đươc “chủ động” trong việc quyết định mức giá cho mỗi món đồ và tạo điều kiện săn lùng các sản phẩm Độc – Lạ – Hiếm trên thị trường.
Với tính năng “đấu giá chỉ từ 1k” hoàn toàn mới, sàn Thương mại điện tử đến MCG đem đến cho người dùng những trải nghiệm mua sắm “hạnh phúc” khi nắm trong tay những món đồ ưng ý với mức giá “cực hời”. Tại sàn đấu, mọi món hàng đều có mức giá khởi điểm là 1000 VND, với đa dạng hàng hóa chủ yếu thuộc ngành hàng điện tử như tai nghe, loa kéo, điện thoại, laptop …
Quan tâm đến chất lượng sản phẩm và sự an toàn cho người dùng, MCG đưa ra những chính sách kiểm duyệt và rà soát chặt chẽ, đảm bảo Chozoi là cầu nối công bằng, đáp ứng lợi ích cho cả người mua và bán. Trong đó, một số yêu cầu của MCG bao gồm các loại giấy chứng nhận hợp pháp, giấy tờ chứng minh nguồn gốc sản phẩm, hình ảnh mô tả rõ ràng sản phẩm, giúp người mua yên tâm mua sắm và có những trải nghiệm thú vị nhất.
Không chỉ mang đến không gian mua sắm tuyệt vời, MCG còn xứng đáng là “điểm đến” lý tưởng cho các nhân tài công nghệ phát huy tiềm năng
MCG tự hào là điểm đến lý tưởng cho các tài năng công nghệ
MCG tham vọng mang đến một bước đột phá lớn trong lĩnh vực thương mại điện tử ở Việt Nam. Với phương châm: ”Think big – Make great”, MCG không ngừng tự hoàn thiện và đương đầu với thử thách phía trước, góp phần thể hiện khát vọng tạo ra một trung tâm mua sắm uy tín số 1 trong khu vực, xây dựng một hệ sinh thái thông minh, hỗ trợ người dùng trong kỉ nguyên mới.
Và để chinh phục được mục tiêu đó, MCG luôn tìm kiếm nhân tài công nghệ, những người cùng đồng hành trên con đường phát triển sản phẩm chozoi, đem đến cho người dùng không gian để thỏa sức mua sắm những mặt hàng vừa đa dạng, vừa chất lại rẻ đến không ngờ.
MCG có ngay những vị trí hấp dẫn cho bạn bùng nổ đam mê:
Đến với MCG, bạn chỉ cần thỏa sức thể hiện tài năng, công ty sẵn sàng trao bạn những đãi ngộ hấp dẫn nhất, xứng đáng nhất với những nỗ lực của bạn.
>>> Cùng khám phá những điều thú vị đang chờ bạn tại MCG:
Mức lương hấp dẫn dựa trên năng lực cùng nhiều khoản thưởng hấp dẫn và nhiều đợt đánh giá tăng lương định kỳ dựa trên thành tích và đóng góp của bạn;
Cơ hội trở thành một phần của đội ngũ trẻ trung, năng động, đem đến cho bạn nhiều cơ hội phát triển bản thân, khai phá tiềm năng;
Cơ hội làm việc trong ngành công nghiệp đang thịnh hành và là xu hướng trong ở hiện tại, trong một dự án có thể mở rộng để phục vụ lượng người dùng lớn, tiếp cận nhiều công nghệ như Big Data, AI, blockchain…
Và nhiều cơ hội thăng tiến không giới hạn, thúc đẩy sự nghiệp bạn vươn xa.
Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev
Top 5 câu hỏi phỏng vấn JavaScript Developer nào cũng nên biết
Bài viết của tác giả Eric Elliott
Giới thiệu
Lựa chọn trở thành một JavaScript Developer sau khi đã từng là dev ở các ngôn ngữ lập trình khác như Java hay C++, vô hình chung có thể khiến các lập trình viên dễ gặp tình huống thiếu kiến thức toàn diện về JavaScript và không update được những thông tin mới liên quan đến công việc của mình. Từ đó khiến các dev khó pass qua các vòng phỏng vấn và tìm được công việc mong muốn.
Trả lời đúng trọng tâm vấn đề giúp bạn thể hiện được nhiều hơn với nhà tuyển dụng
Trong những cuộc phỏng vấn gần đây với các ứng viên, tôi đã đưa ra một số câu hỏi liên quan đến ngôn ngữ lập trình JavaScript cơ bản có thể đánh giá đúng được tiềm năng của các dev trong lĩnh vực này. Đây là một số cách trả lời mà các bạn nên tham khảo để được đánh giá cao hơn bởi nhà tuyển dụng.
Những câu hỏi phỏng vấn JavaScript và cách trả lời gây ấn tượng với nhà tuyển dụng
1. Bạn có thể kể tên hai mô hình lập trình quan trọng đối với các JavaScript app developers không?
JavaScript là một ngôn ngữ lập trình được sử dụng để tạo ra những trang web tương tác mà chúng ta vẫn sử dụng hàng ngày như Facebook, Tweeter,… Nó được tích hợp và nhúng trong HTML, hỗ trợ lập trình hướng đối tượng (OOP) và lập trình chức năng.
Với câu hỏi này, ứng viên nên trình bày các vấn đề liên quan đến lập trình dựa trên nguyên mẫu cũng như thuộc tính prototype và các nguyên tắc lập trình chức năng. Những câu hỏi mang đậm tính kỹ thuật như thế này nếu ứng viên không đề cập đến prototypal hay các kiến thức chuyên môn của mình sẽ khó gây ấn tượng với nhà tuyển dụng.
2. Sự khác biệt giữa classical inheritance và prototypal inheritance?
Class Inheritance (tính kế thừa lớp): Nó cho phép xây dựng một lớp mới dựa trên các định nghĩa của lớp đã có. Có nghĩa là lớp cha có thể chia sẻ dữ liệu và phương thức cho các lớp con. Các phiên bản thường được khởi tạo thông qua các hàm khởi tạo với từ khóa “new” . Kế thừa lớp có thể có hoặc không sử dụng từ khóa “class” từ ES6.
Prototypal inheritance (kế thừa nguyên mẫu): Prototype là cơ chế mà các object trong javascript kế thừa các tính năng từ một object khác. Nó thường được thực hiện bằng lệnh “Object.create ()”. Các phiên bản có thể được tạo từ nhiều đối tượng khác nhau, cho phép dễ dàng kế thừa có chọn lọc.
Trong JavaScript, prototypal inheritance – kế thừa nguyên mẫu đơn giản và linh hoạt hơn so với class inheritance – kế thừa lớp.
Ở câu hỏi này, ứng viên nên trình bày về tác dụng của class như một khớp nối tạo liên kết chặt chẽ cho chương trình và đề cập đến tính kế thừa, phân cấp chức năng, thành phần đối tượng của prototypes. Sự cần thiết của 2 yếu tố này là như nhau và không có sự ưu tiên đối với inheritance nào cả.
3. Lập trình không đồng bộ là gì và tại sao nó lại quan trọng trong JavaScript?
Lập trình không đồng bộ là loại bỏ các điều kiện và lệnh gọi hàm, mã được thực hiện tuần tự từ trên xuống dưới, chặn các tác vụ chạy dài như yêu cầu mạng và I / O đĩa. Về bản chất, giao diện người dùng là không đồng bộ và dành phần lớn thời gian của họ để chờ thông tin nhập của người dùng làm gián đoạn vòng lặp sự kiện và kích hoạt trình xử lý sự kiện.
Node.js là không đồng bộ theo mặc định, Node.js được xây dựng dựa trên JavaScript runtime. Node.js ra đời khi các developer đời đầu của JavaScript cơ bản mở rộng nó từ một thứ chỉ chạy được trên trình duyệt thành một thứ bạn có thể chạy trên máy của mình dưới dạng ứng dụng độc lập. Điều này rất quan trọng trong JavaScript vì nó phù hợp với mã giao diện người dùng và có lợi cho hiệu suất trên máy chủ.
Với câu hỏi này ứng viên nên trình bày các hiểu biết của mình về lập trình không đồng bộ và những lợi ích mà nó mang lại, tại sao nó lại quan trọng với mã giao diện người dùng.
4. Functional programming là gì?
Functional programming là một dạng mô hình lập trình, dựa trên các hàm toán học (function), tránh việc thay đổi giá trị của dữ liệu. Functional Programming hướng đến tính kết hợp (composability) các hàm (function) để tối đa hóa khả năng tái sử dụng (reusability) trong chương trình.
Ứng viên cho vị trí JavaScript Developer cần trình bày các chức năng chính của nó là gì, cách tránh những sai sót do quá trình lập trình tạo nên, thành phần chức năng ngắn gọn. Cũng như chia sẻ thêm về các ngôn ngữ chức năng như: Lisp, ML, Haskell, Erlang, Clojure, Elm, F Sharp, OCaml và các thành phần chính hỗ trợ mô hình lập trình. Nếu ứng viên nào không thể xác định được các đặc trưng của JavaScript trong mô hình lập trình ở câu hỏi này sẽ khó được đánh giá cao về năng lực chuyên môn.
Lập trình chức năng có những lợi hại riêng trong ngôn ngữ lập trình JavaScript
5. Ưu, nhược điểm của lập trình chức năng và lập trình hướng đối tượng là gì?
Ưu điểm của OOP: OOP khá dễ hiểu với các khái niệm cơ bản về đối tượng, là một kỹ thuật lập trình cho phép lập trình viên tạo ra các đối tượng trong code trừu tượng hóa các đối tượng. OOP có xu hướng sử dụng kiểu mệnh lệnh hơn là kiểu khai báo, kiểu này giống như một tập hợp các hướng dẫn chuyển tiếp để máy tính làm theo.
Nhược điểm của OOP: OOP có thể khiến dữ liệu được xử lý tách rời, khi cấu trúc dữ liệu thay đổi sẽ dẫn đến việc thuật toán bị thay đổi theo. Bên cạnh đó, OOP không tự động khởi tạo và giải phóng dữ liệu động, không mô tả được đầy đủ và trung thực hệ thống trong thực tế.
Ưu điểm của FP: Với FP các dev có thể tránh được bất kỳ trạng thái chia sẻ nào để giúp loại bỏ các lỗi gây ra bởi nhiều chức năng cạnh tranh cho cùng một source. Các chức năng có xu hướng được đơn giản hóa hoàn toàn và dễ dàng đặt lại bố cục để mã có thể tái sử dụng thường xuyên hơn so với OOP.
Nhược điểm của FP: Việc khai thác quá mức các tính năng của FP như kiểu không điểm và bố cục lớn có thể làm giảm khả năng đọc vì mã kết quả thường được chỉ định trừu tượng hơn, ngắn gọn hơn và ít cụ thể hơn.
Kết luận
Bám sát vào câu hỏi và trả lời đúng trọng tâm kiến thức, thể hiện được những kinh nghiệm bạn đã có trong quá trình làm việc sẽ giúp các bạn dễ chinh phục các nhà tuyển dụng hơn. Ngoài ra, để nâng cao hiểu biết với một ngôn ngữ lập trình mới, các dev nên tham gia thêm các lớp học JavaScript online để tìm hiểu thêm cũng là giải pháp hiệu quả.
Cybersecurity không mới tuy nhiên đây lại là một sự chọn hấp dẫn trong lĩnh vực IT. Nguyên nhân vì sao và cơ hội nghề nghiệp của Cybersecurity như thế nào?
Về chuyên gia chia sẻ:
Anh là Trần Minh Quảng, hiện đang là Trưởng phòng Báo độc và Khai thác lỗi của Công ty An ninh mạng Viettel (Viettel Cyber Security – VCS).
Công việc của anh chuyên về nghiên cứu chuyên sâu các loại mã độc, lỗi phần mềm và các cuộc tấn công mạng; từ đó tìm cách phát hiện và phòng chống tấn công tới hệ thống mạng của Viettel và khách hàng.
Cybersecurity và những hướng đi?
Anh có thể cho biết vì sao anh lại theo đuổi mảng Cybersecurity này không?
Có ba lý do chính:
Cơ hội nghiên cứu chuyên sâu
Mình chọn mảng bảo mật vì đây là một lĩnh vực mới, một công nghệ mới. Khi theo đuổi mảng này, mình sẽ có cơ hội được nghiên cứu chuyên sâu và phát triển bản thân về mặt kỹ năng chuyên môn rất tốt.
Cơ hội nghề nghiệp rộng mở
Ngoài ra, cơ hội nghề nghiệp cũng rất rộng mở do nó là lĩnh vực mới, rất cần thiết cho hầu hết các tổ chức ở Việt Nam.
Do Cybersecurity là một lĩnh vực mạnh của Việt Nam
Đặc biệt, mảng bảo mật này có thể được coi là một lĩnh vực mạnh của người Việt Nam. Mình được biết là có rất nhiều các chuyên gia Việt Nam đạt được tầm cỡ thế giới nên khi làm trong lĩnh vực này mình sẽ có cơ hội được tiếp cận và học hỏi, nâng tầm bản thân.
Vậy theo anh, trên thế giới và tại Việt Nam, mảng Cybersecurity này đang có những hướng đi nào?
Theo mình đánh giá về CyberSecurity thì có thể chia thành 3 hướng đi khác nhau như thế này:
Nghiên cứu chuyên sâu Thứ nhất là hướng đi nghiên cứu chuyên sâu, công việc chủ yếu sẽ là nghiên cứu sâu về các lĩnh vực bảo mật; từ đó tạo ra tri thức xây dựng các giải pháp, các phương án phòng chống tấn công mạng. Yêu cầu của mảng này là cần những kiến thức rất chắc, rất sâu về các lĩnh vực an toàn thông tin, phải có kỹ năng tự nghiên cứu tìm tòi rất tốt.
Mảng này sẽ nằm trong số ít các công ty làm sâu về bảo mật và an toàn thông tin.
Phát triển giải pháp Thứ hai là hướng về phát triển giải pháp. Công việc chủ yếu là xây dựng các giải pháp bảo mật dựa trên kiến thức chuyên ngành về an toàn thông tin kết hợp với kỹ năng phát triển giải pháp. Yêu cầu phải có kiến thức tốt về mảng bảo mật đồng thời cần có kiến thức kỹ năng lập trình và phát triển giải pháp. Công việc này chủ yếu ở các công ty chuyên cung cấp giải pháp bảo mật.
Vận hành khai thác Thứ ba là hướng nghiêng về vận hành khai thác, công việc chủ yếu là triển khai, áp dụng và vận hành hiệu quả các giải pháp bảo mật trong tổ chức. Mảng này yêu cầu kiến thức cơ bản về bảo mật, đồng thời phải có ứng dụng phần mềm trong các cơ quan tổ chức. Mảng thứ 3 này có trong hầu hết các cơ quan tổ chức, doanh nghiệp công nghệ cần có nhu cầu bảo mật an toàn thông tin cho hệ thống mạng của mình.
Tấn công mạng được thực hiện và diễn ra như thế nào?
Trong quá trình làm việc, anh nhận thấy có những hình thức tấn công mạng nào phổ biến hiện nay?
Có tổng cộng 5 hình thức tấn công mạng phổ biến hiện nay:
Tấn công sử dụng các mã độc
Hiện nay trên thế giới cũng như ở Việt Nam có một số hình thức tấn công mạng rất phổ biến. Chẳng hạn như tấn công sử dụng các mã độc hại cài đặt lên máy tính người dùng, từ đấy thực hiện các hành vi đánh cắp thông tin cũng như đánh cắp dữ liệu.
Tấn công lừa đảo
Thứ hai là hình thức tấn công lừa đảo có thể qua các email gửi đánh lừa nạn nhân hoặc qua các công cụ chat OTT, tin nhắn mạng xã hội; từ đấy lừa nạn nhân cung cấp thông tin cá nhân hoặc cung cấp thông tin về thẻ tín dụng,…
Tấn công dựa trên việc khai thác lỗ hổng bảo mật
Hình thức thứ 3 nữa là tấn công dựa trên việc khai thác các lỗ hổng bảo mật trên các sản phẩm dịch vụ, trên các nền tảng để xâm nhập trái phép vào hệ thống mạng của 1 công ty hay tổ chức nào đó.
Tấn công từ chối dịch vụ
Một hình thức nữa là tấn công từ chối dịch vụ; tức là cố tình tạo ra một lưu lượng truy cập giả mạo, không chính thức đến trang web đấy, dẫn đến là trang web đó bị treo và không đáp ứng được truy cập thật của người dùng nữa.
Tấn công từ chối dịch vụ
Cuối cùng, hình thức rất phổ biến ở Việt Nam hiện nay đó là hình thức tấn công có chủ đích. Tấn công này nhắm vào các cơ quan tổ chức nhà nước, doanh nghiệp lớn, các cơ quan chính phủ,…
Quá trình tấn công mạng được thực hiện theo những phương thức nào và cách VCS team ngăn chặn?
Một cuộc tấn công mạng thông thường hầu hết đều trải qua 6 bước cơ bản:
Đầu tiên kẻ tấn công sẽ tiến hành điều tra về nạn nhân, chẳng hạn điều tra xem thói quen sử dụng máy tính của nạn nhân là gì, thường truy cập các website nào, sử dụng phần mềm chat nào.
Thứ hai là kẻ tấn công sẽ tiến hành chuẩn bị các công cụ dùng để tấn công xâm nhập vào hệ thống mạng của nạn nhân.
Thứ ba, khi đã chuẩn bị xong vũ khí rồi, họ sẽ tiến hành tấn công xâm nhập vào hệ thống máy tính của nạn nhân.
Sau khi bước chân vào rồi thì bước thứ 4, kẻ tấn công sẽ tiến hành cài cắm các chương trình độc hại, các công cụ để khai thác dữ liệu trên mạng.
Bước thứ năm, khi đã chiếm được máy tính nạn nhân thì sẽ duy trì các kênh điều khiển từ xa cho các kẻ tấn công, để hacker có thể thường xuyên kiểm soát được hệ thống mạng của nạn nhân.
Bước cuối cùng khi đã có sự kiểm soát rồi thì kẻ tấn công sẽ tiến hành khai thác mục tiêu của mình, chẳng hạn như thu thập thông tin, đánh cắp dữ liệu hoặc thực hiện các bước tấn công leo thang khác.
Để ngăn chặn điều này, Viettel Cyber Security có giải pháp ngăn chặn nhiều lớp:
Đầu tiên là về mặt giải pháp, VCS có hệ sinh thái giải pháp rất đa dạng, nhiều mức, như mức endpoint, mức network, mức gateway, trên nhiều nền tảng khác nhau, đầy đủ hệ sinh thái về giải pháp.
Thứ hai là về mặt quy trình, VCS có hệ thống giám sát an toàn thông tin 24/7 cho khách hàng. Hệ thống này đảm bảo luôn luôn có thể xử lý bất cứ sự cố nào trong ngày đồng thời luôn có những quy trình liên quan đến việc cập nhật tri thức mới cho giải pháp; update với tri thức của thế giới hay là các quy trình liên quan đến cải tiến nội tại sản phẩm để tối ưu và đáp ứng được yêu cầu của tổ chức.
Yếu tố thứ 3 là về con người, VCS luôn chú trọng đào tạo chuyên sâu, bài bản chất lượng nhân sự và hướng đến tinh thần trách nhiệm khi làm việc luôn luôn rất cao và hết mình với khách hàng. Đó là những giải pháp VCS có thể làm giúp khách hàng, tổ chức, doanh nghiệp tránh các cuộc tấn công mạng.
Vậy làm thế nào để hạn chế việc bị tấn công mạng?
Đối với cá nhân, khi sử dụng internet cũng nên có những kiến thức cơ bản về bảo mật, về cách thức hoạt động, các hình thức tấn công được thực hiện để tự phòng tránh cho chính mình. Cũng như không nên sử dụng các phần mềm lậu, các phần mềm không có bản quyền, các bản crack sẽ rất dễ lây nhiễm mã độc; đồng thời nên trang bị cho máy tính của mình những phần mềm diệt virus thông thường cũng như có thói quen cập nhật hệ điều hành máy tính thường xuyên.
Khi sử dụng các dịch vụ như dịch vụ ngân hàng hay các trang web online, nên có thói quen quản lý mật khẩu cá nhân tốt, mật khẩu mang tính chất khó đoán một chút và hết sức cảnh giác khi cung cấp các thông tin cá nhân lên mạng như thông tin về tài khoản ngân hàng, về mật khẩu, số thẻ ngân hàng,…
Ngoài ra, chúng ta cũng nên có các tình huống backup dữ liệu thường xuyên, như lên các kho lưu trữ dữ liệu trực tuyến cũng là cách tốt để phòng chống tấn công mã hóa dữ liệu.
Đối với các tổ chức, cơ quan, doanh nghiệp thì nên có sự đầu tư bài bản cả về con người, giải pháp, quy trình chính sách để có sự đầu tư cho bảo mật an toàn thông tin tương xứng với độ trưởng thành của các hệ thống công nghệ thông tin trong tổ chức của mình.
Tình hình an ninh mạng tại Việt Nam?
Theo anh, nhận thức về bảo mật an ninh mạng ở Việt Nam hiện tại đang ở mức nào?
Có thể nói là mức độ bảo mật của người dùng máy tính ở Việt Nam về cơ bản là vẫn còn yếu, chưa có ý thức tự bảo vệ mình trước các cuộc tấn công mạng.
Tuy nhiên nhận thức này đang có sự cải thiện khá nhanh nhờ sự vào cuộc của các phương tiện truyền thông đại chúng trong việc tuyên truyền nâng cao nhận thức cho người dùng máy tính về các cuộc tấn công mạng. Gần đây Chính phủ cũng đã có các chính sách, hành lang pháp lý về bảo mật dẫn đến sự đầu tư về nhận thức con người trong truyền thông xã hội đã được đẩy lên rất tốt. Nên có thể khẳng định nhận thức này dù vẫn còn yếu nhưng vẫn đang cải thiện rất nhanh.
Anh có thể cho biết thực trạng tấn công mạng tại Việt Nam đang diễn ra như thế nào được chứ?
Việt Nam nằm trong top những quốc gia chịu sự tấn công mạng rất mạnh, kể cả các cuộc tấn công thông thường, các mã độc thông thường lẫn các cuộc tấn công có chủ đích.
Cũng là do một phần Việt Nam có những yếu tố “thuận lợi” cho các cuộc tấn công diễn ra; chẳng hạn như ý thức bảo mật thông tin của người dùng máy tính cũng chưa được cao, đồng thời tình trạng sử dụng phần mềm lậu cũng nhiều.
Ngoài ra Việt Nam cũng nằm trong khu vực nhạy cảm về chính trị, về tranh chấp chủ quyền lãnh thổ nên các hoạt động tấn công mạng diễn ra rất mạnh.
Vì sao các tổ chức ở Việt Nam mất gấp 3 lần thời gian so với thế giới mới phát hiện rằng hệ thống của mình đã bị xâm nhập?
Theo thống kê trên thế giới, thời gian trung bình để các tổ chức phát hiện hệ thống của mình đã bị xâm nhập là mất khoảng 7 tháng. Còn số liệu công bố tại Việt Nam lên đến 2.2 năm. Theo anh, vì sao lại có sự chênh lệch lớn như vậy?
Đúng là như vậy. Theo số liệu đã nêu thì thời gian trung bình để phát hiện tấn công mạng ở Việt Nam lâu gấp 3 lần so với thế giới. Lý do là vì an ninh mạng cũng là một lĩnh vực khá mới tại Việt Nam nên những trang bị về công cụ quản lý, công cụ giám sát, công cụ xử lý và phát hiện vấn đề về an toàn thông tin vẫn còn rất hạn chế trong các cơ quan, tổ chức, doanh nghiệp ở Việt Nam; trong khi lĩnh vực CNTT đã được phát triển từ khá lâu. Chính do sự thiếu hụt trang bị này mà việc phát hiện xâm nhập ở Việt Nam cũng rất muộn.
Yếu tố thứ hai là bản thân nhận thức và năng lực về an toàn thông tin của đội ngũ cán bộ vận hành khai thác các hệ thống cũng chưa tương xứng với trình độ trên thế giới, cũng như chưa tương xứng với độ trưởng thành của các dịch vụ, giải pháp công nghệ thông tin của mình. Do đó về mặt dịch vụ chúng ta có thể đảm bảo được tuy nhiên cũng khá khó khi năng lực về an toàn thông tin chưa đủ tốt để đáp ứng được việc quan sát và phát hiện vấn đề từ sớm.
Làm sao theo đuổi ngành Cybersecurity?
Sau một thời gian dài gắn bó với nghề, theo anh CyberSecurity có phải là một nghề “cool ngầu”?
Đối với mình, công việc về an ninh mạng này là một nghề hết sức thú vị, tính mới rất cao nên có nhiều cơ hội để mình thường xuyên sáng tạo, làm mới công việc.
Thứ hai là tri thức trong nghề này thay đổi rất nhanh, gần như ngày nào cũng có kiến thức mới, liên tục cập nhật, mình phải luôn luôn tìm hiểu theo nên dẫn đến việc mình cần làm mới bản thân để theo kịp tri thức đó.
Thứ ba là nghề này mang đến cho mình cảm giác khi chinh phục được các nghiên cứu chuyên sâu, có những mục tiêu đặt ra đòi hỏi mình phải tìm tòi từ ngày này qua ngày khác nên khi đạt được mục đích, cảm giác rất thỏa mãn và thú vị. Nên đối với mình việc này rất cool.
Vậy theo anh, những bạn muốn theo đuổi mảng này thì nên trang bị những kiến thức nào?
Đối với những bạn muốn theo đuổi mảng này theo mình nên tập trung tìm hiểu một số kiến thức chẳng hạn như nền tảng về máy tính, CNTT, lập trình, do ngành Cybersecurity vẫn dựa trên nền tảng về CNTT rất nhiều nên cơ bản các bạn phải có những kiến thức này.
Thứ hai là cần kiến thức chuyên ngành về Cybersecurity, như dịch ngược, các lỗ hổng phần mềm, lỗ hổng của ứng dụng web, mật mã, mã hóa, là những kiến thức chuyên ngành chúng ta cần tìm hiểu.
Ngoài ra, các bạn cũng nên có những kiến thức tổng quan về hệ thống mạng máy tính, máy chủ, các hệ thống dịch vụ trong môi trường doanh nghiệp, tổ chức vận hành như thế nào, sẽ là những kiến thức bổ trợ rất tốt nếu bạn muốn theo ngành Cybersecurity này.
Đối với nghề an ninh mạng này về cơ bản các bạn cũng nên tìm hiểu về các công nghệ mới, vì ngoài việc sử dụng công nghệ này áp dụng trong bảo mật ra thì bạn cũng nên tìm hiểu để đánh giá mức độ an toàn và sử dụng đúng trong các lĩnh vực khác về CNTT nói chung, như Blockchain, Big data, AI,… nó sẽ hỗ trợ rất tốt cho công việc của mình.
Anh có kinh nghiệm (tips & tricks) nào cho các bạn sinh viên đang theo đuổi ngành Cybersecurity không?
Về một số tips and trick khi theo đuổi ngành Cybersecurity mình có một vài chia sẻ như thế này:
Thứ nhất các bạn nên tham gia vào các hội nhóm thực hành nghiên cứu về bảo mật trong trường lớp hoặc các cộng đồng mạng, nó sẽ hỗ trợ rất tốt khi chia sẻ kinh nghiệm cho nhau, cùng nhau giải quyết các vấn đề thực tế.
Thứ 2 là các bạn cũng nên tham gia các cuộc thi về bảo mật chủ yếu dành riêng cho các bạn trẻ theo đuổi ngành Cybersecurity, giải các thử thách trên đó sẽ gia tăng thêm kinh nghiệm trong lĩnh vực này.
Ngoài ra khi còn là sinh viên các bạn cũng có thể tham gia thực tập, làm việc part-time tại các doanh nghiệp về bảo mật cũng sẽ cho các bạn thêm nhiều kinh nghiệm và tiếp xúc với các vấn đề bảo mật từ sớm, sẽ rất tốt cho lộ trình nghề nghiệp của bạn sau này.
Còn đối với những bạn muốn theo đuổi con đường hacking, anh có thể giới thiệu trang web nào để giúp “luyện tập” kỹ năng hacking được chứ?
Để luyện tập khả năng hacking của mình hiện nay có rất nhiều trang web chứa các thử thách bảo mật mô phỏng lại các nhiệm vụ trên thực tế để các bạn có thể rèn luyện khả năng tấn công của mình, chẳng hạn như:
Với các trang web này bạn có thể search thông tin một cách dễ dàng trên mạng và tham gia luyện tập được. Ngoài ra hàng năm, hàng tháng cũng có rất nhiều các cuộc thi được tổ chức rộng rãi trên thế giới, dành cho những người nghiên cứu về bảo mật tham gia và giải các thử thách trong các cuộc thi đó. Nó cũng khá là sát thực với các bài toán mà chúng ta phải đối mặt trên thực tế.
Để theo đuổi con đường hacking thì không biết đã có luật nào để phân biệt hacker mũ trắng và hacker mũ đen tại Việt Nam chưa?
Hacker mũ trắng và hacker mũ đen thật ra nó chỉ khác nhau về động cơ và những hành động phá hoại khi mình thực hiện hành vi hack thôi.
Gần đây Việt Nam vừa ban hành Luật an ninh mạng Việt Nam năm 2018, nó đã phân biệt và định nghĩa khá rõ những hành vi được phép và không được phép khi thực hiện tấn công trong môi trường mạng ở VN rồi. Chẳng hạn như bạn chỉ được phép tấn công vào đơn vị mạng của một tổ chức khác khi đã được sự cho phép của cơ quan chủ quản hệ thống CNTT đó và bạn đã có sự thông báo cũng như thống nhất phạm vi thực hiện, còn mọi hành vi xâm nhập trái phép vào các hệ thống mạng khác đều là không hợp lệ. Tương tự như vậy ở hầu hết các quốc gia trên các nước đều có luật an ninh mạng quy định cụ thể về những hành vi được phép và không được phép khi thực hiện tấn công trên môi trường mạng của các tổ chức quốc gia đó.
Theo anh nhu cầu tuyển dụng cho ngành Cybersecurity này sẽ thay đổi như thế nào ở Việt Nam trong tương lai?
Theo mình được biết thì hiện nay nhu cầu nhân lực chất lượng cao về Cybersecurity đang thiếu hụt khá là nhiều. Trong khoảng 5 – 10 năm mình nghĩ là nhu cầu nhân sự Cybersecurity chất lượng cao sẽ ngày càng tăng theo thực tế.
Do hiện nay nhận thức về bảo mật của các lãnh đạo đơn vị cơ quan, tổ chức đang được nâng lên một cách đáng kể nên sự đầu tư cho mảng bảo mật này cũng sẽ được tăng lên.
Thứ hai là do cơ chế chính sách của Việt Nam hiện nay đang rất khuyến khích nâng cao năng lực về bảo mật an toàn thông tin cho các hệ thống an toàn thông tin trong nước. Hiện nay có rất nhiều các vị trí về bảo mật trong hầu hết các doanh nghiệp làm về công nghệ thông tin, công nghệ tại Việt Nam cũng như khối nhà nước. Bạn có thể làm về bảo mật trong các bộ ban ngành, các cơ quan nhà nước của chính phủ hay làm bảo mật cho các ngân hàng, các công ty cung cấp các dịch vụ bảo mật thông tin cho khách hàng, làm về bảo mật chuyên sâu ở các công ty nghiên cứu phát triển sản phẩm, cung cấp giải pháp cho thị trường.
Câu hỏi cuối cùng, anh có thể chia sẻ career path điển hình cho một bạn muốn theo đuổi ngành Cybersecurity không?
Mình chia sẻ từ những kinh nghiệm của bản thân và quá trình làm việc đã tiếp xúc với các bạn trẻ; những nhà nghiên cứu; những người làm việc về bảo mật. Thật chất, career path của những người theo mảng bảo mật khác một chút so với các ngành CNTT khác; đó là nó bắt đầu từ khi còn là sinh viên chứ không phải khi các bạn đã ra trường rồi.
Khi còn là sinh viên các bạn nên chú trọng và định hướng hướng đi cho bản thân; tập trung phát triển và nghiên cứu để mình có thể tích lũy được những kỹ năng và kiến thức tối đa có thể trong các mảng Cybersecurity mình muốn theo đuổi.
Khi đã ra trường các bạn có thể ở level fresher, các bạn có thể tham gia những công việc đơn giản liên quan đến bảo mật ở các công ty; chẳng hạn như hỗ trợ nghiên cứu, vận hành giám sát hoặc tham gia xử lý một số sự cố,…
Tiếp theo, các bạn có thể phát triển lên level junior, senior, như làm việc độc lập được, phụ trách được một đầu việc lớn. Hoặc dần dần các bạn có thể lead được một team làm về bảo mật, một team đánh giá về ATTT hay một team về triển khai các giải pháp bảo mật cho doanh nghiệp.
Sau khi các bạn đã có đủ cả về kỹ năng và kinh nghiệm lẫn kiến thức am hiểu về hệ thống; các bạn có thể đến với một level cao hơn là một chuyên gia – Expert Cybersecurity. Ở mức là có thể phụ trách về bảo mật cho cả một doanh nghiệp, một tổ chức lớn được.
Theo mình đó là một career path khá là rõ ràng cho những bạn muốn tham gia vào mảng này.
Bài viết được sự cho phép của BBT Tạp chí Lập trình
Một công việc khá phổ biến đối với front-end developer là phải giả lập một backend REST service để nhận JSON data cung cấp cho ứng dụng front-end, và đảm bảo nó hoạt động như mong đợi trong khi đang chờ phía backend hoàn thiện service.
Bạn vẫn có thể cài đặt backend server đầy đủ, bằng cách sử dụng Node.js, Express và MongoDB, tuy nhiên việc này tốn khá nhiều thời gian và phức tạp. Trong khi đó JSON Server lại là một giải pháp khá hoàn thiện cho yêu cầu nhanh và đơn giản với đầy đủ các thao tác CRUD (Create Read Update Delete).
Vì vậy bài viết này sẽ hướng dẫn bạn cách cài đặt JSON server và publish một sample REST API.
Chuẩn bị
Cài node cho máy tính của bạn bằng cách tải gói phù hợp với hệ điều hành của bạn ở link sau https://nodejs.org/en/download/
Sau khi cài đặt xong chúng ta tiến hành kiểm tra version của node và npm bằng cách như sau:
$ node -v $ npm –v
Nếu màn hình xuất hiện version của node và npm (Node Package Managerment) thì có nghĩa bạn đã cài đặt thành công
Cài đặt JSON Server
JSON Server được đóng gói như một NPM package. Vì vậy việc cài đặt có thể được thực hiện thông qua việc sử dụng gói node.js manager:
$ npm install -g json-server
Tuỳ chọn -g sẽ giúp cho package được cài đặt ở level hệ thống.
Tạo JSON File
Tiếp theo, hãy tạo file JSON và đặt tên file theo cú pháp <tên file>.json ví dụ: data.json. Trong file này sẽ chứa những dữ liệu được trả về bởi REST API. Dưới đây là một ví dụ về file json này:
Cấu trúc trên mô tả employee object với các trường id, firstName, lastName, address và profile.
Khởi động Server
Hãy khởi động JSON server bằng việc chạy câu lệnh sau:
$ json-server --watch data.json
Lưu ý: Nếu file json không nằm ở thư mục gốc thì chúng ta sử dụng lện cd để đặt con trỏ hệ thống tới thư mục chứa file data.json rồi mới thực hiện lệnh trên.
File data.json được truyền vào như một tham số trong câu lệnh trên, và option –watch được thêm vào nhằm đảm bảo server được chạy ở chế độ xem, ở chế độ này, server sẽ xem xét những thay đổi và cập nhật kết quả vào API một cách phù hợp.
Bây giờ hãy mở địa chỉ http://localhost:3000/employees trên browser và ta sẽ nhận được kết quả của file json mà ta đã tạo.
Những HTTP endpoints sau đây được tạo tự động bởi JSON server, ta có thể tuỳ chọn để sử dụng sao cho phù hợp với mục đích của mình:
GET /employees
GET /employees/{id}
POST /employees
PUT /employees/{id}
PATCH /employees/{id}
DELETE /employees/{id}
Lưu ý:
Giá trị của id không được thay đổi, và nó sẽ được tăng dần sau mỗi POST request.
Nếu ta có cung cấp giá trị cho id cho PUT hoặc PATCH request thì giá trị đó sẽ được bỏ qua.
Các loại POST, PUT và PATCH request thì phải bổ sung thêm Content-Type: application/json trong body. Nếu không có thiết lập này thì dữ liệu sẽ không được cập nhật vào file data.json.
Một số thao tác truy vấn
Filter
Sử dụng dấu . để truy cập vào các thuộc tính
GET /employees?firstName=”Hoàng”&lastName =”Phan”
GET /employees?id=1
GET /employees?profile.email=khanh.le@codegym.vn
Paginate
Sử dụng _page và tùy chọn _limit để trả về dữ liệu sau khi được phân trang. Mặc định _limit là 10
GET /employees?_page=7 GET /employees?_page=7&_limit=20
Sort
Sử dụng _sort và _order. Mặc định là sắp xếp tăng dần:
GET /employees?_sort=firstName&_order=asc
GET /employees/1/?_sort=firstName&_order=desc
Sắp xếp nhiều trường:
GET /employees?_sort=firstName,lastName&_order=desc,asc
Ngoài ra, để tìm hiểu sâu hơn về những hỗ trợ mà json server cung cấp, các bạn có thể tìm hiểu thêm ở đây https://github.com/typicode/json-server
Giá trị thị trường của ngành công nghiệp game là 108 tỷ đô la vào năm 2017 và đạt 128 tỷ vào năm 2020. Năm 2018 đã chứng kiến những tên tuổi lớn trong trò chơi điện tử như PUBG và Fortnite. Nếu bạn là một lập trình viên và mong muốn kiếm tiền trên thị trường game hàng tỷ đô la bạn cần đúng ngôn ngữ lập trình game. Nếu bạn muốn trở thành nhà phát triển trò chơi, đây là một số ngôn ngữ lập trình cần tham khảo.
Các ngôn ngữ lập trình game
C++
Nói thật thì đây là Ngôn Ngữ Lập Trình Game rất tốt cho những bạn mới lập trình lẫn lập trình game. Mình cũng học ngôn ngữ này đầu tiên để lấy nền tảng, lấy kiến thức cơ bản cho việc lập trình. Bạn có thể học nó ngay lúc mới bắt đầu C++ có thể vừa giúp bạn có kiến thức cơ bản, vừa lại lập trình game được mỗi mũi tên trúng 2 đích quả là ngon rồi còn gì. Engine Support thì có Unreal Engine, Godot Engine, Cocos2dx, Cry Engine, Panda 3D. Những Engine mà mình nói trên thì đều sử dụng ổn cho những bạn mới bắt đầu. Nó không khó lắm.
C# là ngôn ngữ hướng đối tượng. Ngôn ngữ này nếu chưa có căn bản mà nhảy vô thì rất khó với các bạn. Nếu có học c++ rồi thì nhảy vô con này thì cũng cũng dễ chứ không phải khó lắm. Nhưng nếu học nó thì bạn sẽ được là một mũi tên trúng 3 đích hơn cả c++. 1 là làm web, 2 là làm app nè, 3 làm game nữa lại ngon lành. Nếu dùng C# làm Ngôn Ngữ Lập Trình Game thì có những Engine sau đây hỗ trợ nó:
Unity: Con này thì hỗ trợ thôi rồi mình cũng chả còn gì để bàn về sự “support” của nó
Godot: Support vẫn khá còn yếu chưa được mạnh lắm
CryEngine: Đây là Engine được built từ c++ và nó hỗ trợ C#, Lua
WaveEngine: Đây là Engine mà được tạo ra dựa trên C# cho phép bạn tạo game đa nên tảng
Đây thật sự là 1 Ngôn Ngữ Lập Trình Game dễ các bạn ạ. Dễ đến nỗi mà mình chưa học nó mà chỉ học ngôn ngữ dựa trên nó mà đã có thể làm quen được nhiều thứ, giải toán đồ,…. Dễ ẹt. Python không được ứng dụng trong game nhiều lắm đa số toàn mấy Engine game làm chán lắm.Python cũng được đánh giá khá cao trên bảng xếp hạng đấy chứ. Với Engine mà nó hỗ trợ thì có:
Godot Engine: Godot thì khỏi bàn luôn hỗ trợ như C# – Unity. Ngôn ngữ riêng của Engine này sử dụng GDScript dựa trên Python và Lua. Hầu hết là Python, Lua chiếm khá là ít luôn ý. Support 2D & 2.5D & 3D
Cocos2D Engine: Con này thì Support giống Godot.
Panda3D: nhắc tới anh này trên chỗ C++ rồi nhỉ. Con này thì 3D thôi
Pygame: anh này thì chắc chắn không thể không nhắc tới rồi làm game hơi kém tý nhưng vẫn ổn
Chắc chắc không không thể nhắc tới anh chàng này rồi. Một ngôn ngữ lập trình web, một ngôn ngữ cực kỳ là linh hoạt nhưng được sử dụng khá là nhiều trong lập trình game. Vậy thì nhưng Engine nào mà nó hỗ trợ:
Game Maker Studio: Chắc chắn không thể bỏ qua chàng trai này được. Engine mà mình làm game đầu tiên và cái game like sh*t :(.Còn này ngoài JavaScript còn sử dụng thêm là Game Maker Language. Làm game 2D – 3D. Nhưng 3D hỗ trợ rất rất rất kém. Nếu làm 3D game bằng con này thì khuyên bạn đổi Engine. Full plaform luôn nhé
Gamvas : Con này thì làm game nền tảng HTML5
GDevelop : Còn này 2D luôn, hỗ trợ hầu hết các nền tảng hiện nay.
PlayCanvas: Có anh này thì 3D đây, hỗ trợ như anh trên.
RPG Maker: Xém thì quên thằng này, làm game RPG bao ổn nhé các bạn.
Ngôn ngữ lập trình game tuyệt vời. Mình có ấn tượng thật sự sâu sắc đến với ngôn ngữ này:vv.Lua là ngôn ngữ được sử dụng nhiều VD như: Phần mềm PC Adobe’s Photoshop Lightroom, hệ thống nhúng hay chính tựa game mưa gió 1 thời World of Warcarft addons và Angry Birds. Lua là ngôn ngữ hàng đầu sử dụng trong game.Engine mà nó hỗ trợ thì có khá là nhiều và NGON:
CryEngine; con này vừa C++vừa lua nên khá ngon , chỉ hỗ trợ 3D
Codea: Con này 2D chỉ dành cho iOS
Defold : 2D-3D, đa nền tảng chỉ chạy bằng lua
Leadwerks: 3D, Hỗ trợ nền tảng linux và windows
Lumberyard: 3D con này hỗ trợ PS 4, PC,Xbox
ShiVa: Con này 3D. Hỗ trợ nền tảng Windows,PS3,PS4 Xbox 360,Xbox One
Bài viết được sự cho phép của tác giả Phạm Công Sơn
Nhắc đến design pattern thì có lẽ đã quá quen thuộc với dân lập trình rồi. Ngay từ ngày nhập học ở FPT APTECH vào năm 2005 tôi vẫn nhớ rất rõ lời thầy Thành giám đốc trung tâm rằng “Các bạn sẽ được đào tạo để làm việc với ngôn ngữ lập trình hướng đối tượng”. Tuy chưa hiểu mấy cho đến khi trải qua môn Java, C# tôi cũng đã bắt đầu dần hiểu về OOP và tiếp xúc với design pattern. Tại thời điểm đó trang web mà tôi học về design pattern là https://www.dofactory.com/. Hồi còn đi học nói chung là có rất nhiều tài liệu trên internet để tham khảo, nhưng có lẽ dofactory là một huyền thoại đối với tôi, vì nó là trang web duy nhất giúp tôi học lập trình mà còn nhớ từ hồi đó cho tới tận bây giờ.
Tiếp cận từ sớm, ngay từ lúc còn mới học code tuy vậy cũng phải mất tới vài năm đi làm tôi mới có thể sử dụng được một vàidesign pattern trong một số trường hợp, bài toán. Còn lại cũng nhiều design partern có biết, có học cho tới nay vẫn chưa được sử dụng. Vì không phải design pattern nào cũng có thể đưa vào thực tế. Tôi cũng đã có một khoảng thời gian chỉ làm Frontend và chả động tí gì tới design pattern luôn.
Khi chưa được vào các dự án lớn thì nhu cầu dùng cũng sẽ là rất ít. Cho đến khi vào khoảng năm 2014 tôi vào làm việc tại một công ty định vị. Lúc này tôi phải làm việc nhiều tới xử lý số liệu, xử lý giao tiếp giữa các khối v.v… thì hầu như chỗ nào tôi cũng phải thiết kế code và sử dụng design pattern.
Liên tục sử dụng design pattern trong các dự án, thiết kế code trước khi thực hiện đã trở thành một thói quen của tôi. Lâu dần đã thành kỹ năng, và điển hình là tôi đã thiết kế được mô hình “Trứng có trước hay gà có trước” được sử dụng khá là nhiều nhưng ít nhất có 2 dự án lớn đó là: Dự án Phân tích dữ liệu hộp đen cho Taxi, Bus và Dự án Staxi xây dựng Server giao tiếp giữa các khối: Mobile, Tổng đài, Server.
Hôm nay tôi xin chia sẻ với các bạn về mô hình này.
Trong lần nhận dự án xử lý dữ liệu logfile hộp đen cho Oto, Taxi, Bus tôi cần phải xây dựng 3 hệ thống phân tích data. Ở đây có thể hình dung có 3 hệ thống nhưng cách thức hoạt động sẽ là hoàn toàn giống nhau. Sự khác biệt ở đây chương trình phân tích chỉ là cấu hình, đầu vào và các xử lý khác nhau. Dẫn tới yêu cầu đặt ra khi viết các xử lý phân tích ở hệ thống nào thì sử dụng cấu hình, data đầu vào phải là của hệ thống đó. Chính vì điều này việc sử dụng interface, abstract ở đây cho cấu trúc data và các xử lý là chưa đủ do tính ràng buộc chặt chẽ giữa các đối tượng trong cấu trúc hệ thống.
Nói thì có thể khó hiểu, chúng ta có thể xem qua ví dụ sau cho dễ hiểu
public class Family
{
public IFather Father { set; get; }
public IChild Child { set; get; }
public void Happy()
{
Father.LoveChild(Child);
Child.LoveFather(Father);
}
}
public interface IFather
{
void LoveChild(IChild child);
}
public interface IChild
{
void LoveFather(IFather father);
}
Ví dụ này miêu tả quan hệ gia đình =)). Bố yêu con và con yêu bố. Tuy nhiên sẽ bị trường hợp bố yêu nhầm con ông hàng xóm. Các bạn hãy xem code kế thừa tiếp theo.
public class FatherVN : IFather
{
public bool Nice { set; get; }
public void LoveChild(IChild child)
{
// Không thể truy vấn thuộc tính child.Cry
// Vì child ở đây chỉ là interface IChild
}
}
public class ChildVN : IChild
{
public bool Cry { set; get; }
public void LoveFather(IFather father)
{
// Không thể truy vấn thuộc tính Nice
// vì father ở đây chỉ là interface IFather
}
}
public class FatherUSA : IFather
{
public bool Strong { set; get; }
public void LoveChild(IChild child)
{
// Không thể truy vấn thuộc tính child.Tall
// Vì child ở đây chỉ là interface IChild
}
}
public class ChildUSA : IChild
{
public bool Tall { set; get; }
public void LoveFather(IFather father)
{
// Không thể truy vấn thuộc tính Strong
// vì father ở đây chỉ là interface IFather
}
}
Giả sử chúng ta có 2 gia đình đại diện cho Việt Nam và Mỹ thì ta có những claas như sau FatherVN, ChildVN, FatherUSA, ChildUSA ở đây có thể thấy tại các phương thức LoveChild chúng ta không thể truy vấn tới thuộc tính của biến father và tương tự phương thức LoveChild cũng không thể truy vấn tới thuộc tính của biến child.
Chúng ta xem tiếp phần sử dụng sau khi đã cụ thể hóa các class
var familyVN = new Family
{
Father = new FatherVN { },
Child = new ChildVN { }
};
familyVN.Happy();
var familyUSA = new Family
{
Father = new FatherUSA { },
Child = new ChildUSA { }
};
familyUSA.Happy();
Đây là khi sử dụng đúng hệ thống, có nghĩa là con ông nào thì thương bố ông ấy, bố ông nào thì thương con ông ấy. Nhưng nếu là như thế này thì sẽ có sự nhầm lẫn.
var familyUnknown = new Family
{
Father = new FatherVN { },
Child = new ChildUSA { }
};
familyUnknown.Happy();
Và giờ đây rất dễ thấy là bị nuôi con ông hàng xóm =)). Từ đó có thể thấy nếu sử dụng interface hay abstract một cách thông thường thì sẽ không đáp ứng được yêu cầu của hệ thống là các đối tượng phải liên kết chặt chẽ với nhau. Hệ thống nào có đối tượng nào thì chỉ sử dụng trong hệ thống đó thôi. Con tôi tôi nuôi, con ông hàng xóm ông hàng xóm nuôi. Không có chuyện lẫn lộn gia đình này với gia đình kia. Đó chính là nguyên nhân và cũng là mục đích tôi thiết kế ra mô hình “Trứng có trước hay Gà có trước”.
2. Cụ thể cách thức xây dựng mô hình
Vẫn là bài toán bố yêu con như trên nhưng để đảm bảo con ông nào ông ấy yêu thương, nuôi nấng thì tôi tổ chức các thành phần như sau
public interface IChild { }
public interface IFather { }
public interface IChild : IChild where TFather : IFather
{
void LoveFather(TFather father);
}
public interface IFather : IFather where TChild : IChild
{
void LoveChild(TChild child);
}
Như các bạn đã thấy, lúc này đối tượng đã có 1 sự liên kết nhẹ là con đã cụ thể yêu một ông bố nào đó, và ông bố cũng yêu cụ thể một ông con nào đó. Không còn mập mờ nữa. Tuy nhiên điều đó là chưa đủ. Còn cần phải khai báo một đối tượng Family để gói chặt 2 bố con lại với nhau như sau
public class Family<TFather, TChild>
where TFather : IFather, IFather, new()
where TChild : IChild, IChild, new()
{
public TFather Father { set; get; } = new TFather { };
public TChild Child { set; get; } = new TChild { };
public void Happy()
{
Father.LoveChild(Child);
Child.LoveFather(Father);
}
}
Đến lúc này thì đúng là bố con đã trở về một gia đình. Không còn lẫn lộn bố con ông hàng xóm nữa. TFather phải là bố của TChild và TChild phải là con của TFather sự ràng buộc này luôn tạo một khối duy nhất. Và từ đó ta tạo ra các khối có chức năng tương tự nhau giống nhau, nhưng cụ thể xử lý là khác nhau.
public class FatherVN : IFather
{
public bool Nice { set; get; }
public void LoveChild(ChildVN child)
{
// Truy vấn được thuộc tính child.Cry
}
}
public class ChildVN : IChild
{
public bool Cry { set; get; }
public void LoveFather(FatherVN father)
{
// Truy vấn được thuộc tính father.Nice
}
}
public class FatherUSA : IFather
{
public bool Strong { set; get; }
public void LoveChild(ChildUSA child)
{
// Truy vấn được thuộc tính child.Tall
}
}
public class ChildUSA : IChild
{
public bool Tall { set; get; }
public void LoveFather(FatherUSA father)
{
// Truy vấn được thuộc tính father.Tall
}
}
var familyUSA = new Family<FatherUSA, ChildUSA> { };
familyUSA.Happy();
var familyVN = new Family<FatherVN, ChildVN> { };
familyVN.Happy();
Nếu như chúng ta cố tình như sau
var familyUnknown1 = new Family<FatherUSA, ChildVN> { }; // Bố Mỹ nhưng con Việt Nam
var familyUnknown2 = new Family<FatherVN, ChildUSD> { }; // Bố Việt Nam nhưng con Mỹ
Lúc này sẽ lỗi và không thể thực hiện biên dịch được. Và tên gọi “Trứng có trước hay Gà có trước” cũng từ đó mà tôi đặt tên cho mô hình này. Vì đơn giản là các class khai báo không biết là cái nào có trước cái nào có sau. FatherVN khai trước hay ChildVN khai trước? Khai báo FatherVN nhưng lại cần có ChildVN trước, nhưng khai báo ChildVN lại cần có FatherVN trước cơ. Ơ hại não nhỉ
3. Ứng dụng thực tế trong các dự án tôi đã thực hiện
Để xây dựng các hệ thống có chức năng tương tự nhau mà trong đó các thành phần được tổ chức liên kết chặt chẽ, nhằm mục đích các đối tượng truy vấn đến đích xác kiểu dữ liệu của các đối tượng mà không thông qua interface.
3.1 Cụ thể trong dự án phân tích dữ liệu logfile
public abstract partial class Adapter<TSystem, TClient, TClientInfo, TRawData> : IAdapter, IAdapter
where TSystem : SystemBase<TClient, TRawData>, new()
where TClient : ClientControlBase, new()
where TRawData : RawData, new()
where TClientInfo : IClientInfo
{
// Code code
}
public abstract class ClientControl<TSystem, TRawData, TStatus> : ClientControlBase where TRawData : RawData, new()
where TStatus : ClientState, new()
where TSystem : ISystem
{
// Code code
}
public abstract partial class SystemBase<TClientControl, TRawData> : ISystem where TClientControl : ClientControlBase, new()
where TRawData : RawData, new()
{
// Code Code
}
public abstract partial class ClientControlBase : ClientControlBase where TRawData : RawData, new()
{
// Code code
}
Sau đây là cụ thể các hệ thống phân tích
// Hệ thống Taxi
public class TaxiAdapter : Adapter<TaxiSystem, TaxiClientControl, TaxiClient, TaxiRawData>
{
}
public class TaxiClientControl : ClientControl<TaxiSystem, TaxiRawData, TaxiState>
{
}
public class TaxiSystem : SystemBase<TaxiClientControl, TaxiRawData>
{
}
// Khai báo class nào trước bi giờ nhỉ :D
// Khai báo TaxiAdapter lại cần có TaxiSystem, TaxiClientControl trước
// Khai báo TaxiClientControl lại cần có TaxiSystem Trước
// Mà khai báo TaxiSystem lại cần có TaxiClientControl trước cơ
// Hệ thống Bus
public class BusAdapter : Adapter<BusSystem, BusClientControl, BusClient, BusRawData>
{
}
public class BusClientControl : ClientControl<BusSystem, BusRawData, BusState>
{
}
public class BusSystem : SystemBase<BusClientControl, BusRawData>
{
}
// Khai báo class nào trước bi giờ nhỉ :D
// Khai báo BusAdapter lại cần có BusSystem, BusClientControl trước
// Khai báo BusClientControl lại cần có BusSystem Trước
// Mà khai báo BusSystem lại cần có BusClientControl trước cơ
3.2 Cụ thể trong dự án Staxi, có các khối Mobile, Điều Hành, Server có chung chức năng truyền và nhận bản tin
public abstract class Connection<TCommand, TConnection, TCenter, TState> : Connection<TCommand, TConnection, TCenter>
where TCommand : Command
where TConnection : Connection
where TCenter : ICenter
where TState : ConnectionState, new()
{
// Code Code
}
public abstract class Command<TConnection, TCommandInfo> : Command
where TConnection : Connection
where TCommandInfo : ICommandInfo, new()
{
// Code Code
}
public abstract class Center<TThread, TCenter> : Messagable, ICenter, ICenterMessage
where TThread : CenterThread
where TCenter : class, ICenter
{
// Code Code
}
Sau đây là cụ thể khối nhận bản tin từ Mobile lái xe gửi về Server
public class DriverServerCenter : Center<DriverServerWorker, DriverServerCenter>
{
}
public abstract class DriverServerWorker : CenterThread
{
}
public class DriverClient : Connection<Command, DriverClient, DriverServerCenter, DriverState>, IConnectionWithManager, TConnectionKey
{
}
public abstract class DriverCommand : Command<DriverClient, TCommandInfo> where TCommandInfo : ICommandInfo, new()
{
}
// Vậy khai báo class nào trước class nào sau các bạn nhỉ
// Khai báo DriverServerCenter thì lại cần DriverServerWorker trước, thậm chí là chính nó trước DriverServerWorker
// Khai báo DriverServerWorker thì lại cần DriverServerCenter trước
// Khai báo DriverClient lại cần DriverServerCenter trước, thậm chí lại cần chính nó trước luôn.
Cụ thể khối nhận bản tin từ Mobile khách hàng gửi về Server
public partial class CustomerServerCenter : Center<CustomerServerWorker, CustomerServerCenter>
{}
public abstract class CustomerServerWorker : CenterThread
{}
public partial class CustomerClient : Connection<Command, CustomerClient, CustomerServerCenter, CustomerState>, IConnectionWithManager, TConnectionKey
{}
public abstract class CustomerCommand : Command<CustomerClient, TCommandInfo> where TCommandInfo : ICommandInfo, new()
{}
// Vậy khai báo class nào trước class nào sau các bạn nhỉ
// Khai báo CustomerServerCenter thì lại cần CustomerServerWorker trước, thậm chí là chính nó trước CustomerServerCenter
// Khai báo CustomerServerWorker thì lại cần CustomerServerCenter trước
// Khai báo CustomerClient lại cần CustomerServerCenter trước, thậm chí lại cần chính nó trước luôn.
Cụ thể code thì bên trong xử lý rất nhiều. Tuy nhiên khi tôi dựng xong hệ thống, tôi chỉ việc viết thao tác xử lý các bản tin một cách rất nhẹ nhàng, còn lại là tầng base đã xử lý hết.
4. Nhược điểm của mô hình
Về ưu điểm thì tôi có thể tạo rất nhanh các khối có chức năng giống nhau và ở mỗi hệ thống chỉ việc viết các xử lý cụ thể. Tuy nhiên một nhược điểm là với mô hình này, ở lớp cụ thể cuối cùng chúng ta hoàn toàn không thể kế thừa thêm được nữa.
Chưa kể mô hình này chỉ áp dụng cho các ngôn ngữ native, tường minh và hỗ trợ Generic. Những ngôn ngữ không tường minh như Javascript thì nó trở lên vô nghĩa.
Nếu các bạn thấy bài viết hay bổ ích hãy like và chia sẻ nhé. Nếu chỗ nào không hài lòng vui lòng comment nhẹ nhàng để tôi có động lực viết thêm chia sẻ cho các bài tiếp theo.
Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh
MongoDB là một NoSQL database, cho phép chúng ta có thể lưu trữ những kiểu dữ liệu phức tạp, không có cấu trúc nhất định. Trong bài viết này, mình sẽ hướng dẫn các bạn các bước cơ bản để làm việc với MongoDB trong các ứng dụng Java các bạn nhé!
Trong đó đối tượng MongoClientURI là một trong những đối tượng sẽ quản lý thông tin về MongoDB bao gồm IP address và port mà MongoDB đang chạy. Còn đối tượng MongoClient sẽ là đối tượng đảm nhiệm vai trò kết nối tới MongoDB đó.
Trong trường hợp, các bạn đang sử dụng MongoDB server với authentication mode, thì các bạn cần khai báo username và password đang được gán cho database mà các bạn đang định sẽ sử dụng, các bạn nhé.
Mình sẽ sử dụng MongoDB server không chạy với authentication mode trong bài viết này, các bạn nhé!
Mặc định, MongoDB sẽ chạy trên port 27017 và nếu các bạn đang cài đặt MongoDB trên máy local thì chúng ta không cần phải khai báo đối tượng MongoClientURI các bạn nhé! Các bạn chỉ cần khai báo đơn giản như sau:
MongoClient client=newMongoClient();
Mình đang sử dụng MongoDB trên máy mình nên mình chỉ cần khai báo như trên mà thôi!
Giống như khi thao tác sử dụng command line với MongoDB, nếu database mà chúng ta chọn để thao tác không tồn tại thì database này sẽ tự động tạo nha các bạn.
Đối tượng MongoDatabase sẽ là đối tượng nắm giữ mọi thông tin về các Collection có trong database mà chúng ta đang sử dụng. Do đó, từ đối tượng MongoDatabase này, các bạn có thể lấy được tên của tất cả các Collection sử dụng phương thức listCollectionNames().
Database “mongodb” của mình đang có những Collection sau:
Có những Collection sau
thì kết quả sẽ là:
Kết quả
Để thao tác với một Collection nào đó, các bạn có thể sử dụng phương thức getCollection() của đối tượng MongoDatabase để lấy đối tượng MongoCollection cho Collection đó.
Nếu muốn insert một Document vào Collection thì các bạn có thể sử dụng các phương thức insertOne() để insert 1 Document hoặc insertMany() để insert nhiều Document cùng một lúc.
Một Document là một chuỗi JSON và chúng ta sẽ sử dụng đối tượng Document của MongoDB Driver API để build nó. Ví dụ, giờ mình muốn build một Document về thông tin sinh viên gồm tên và tuổi thì mình sẽ tạo đối tượng Document như sau:
Tất nhiên, các bạn cũng có thể kiểm tra kết quả từ code bằng cách sử dụng phương thức find() của đối tượng MongoCollection.
Phương thức find() này có tham số là một đối tượng Document, đây chính là tiêu chí để tìm kiếm tất cả các Document trong Collection hiện tại có nội dung tương tự đó các bạn.
Trong ví dụ trên, mình tìm kiếm các Student Document theo 2 tiêu chí là name và age. Các bạn có thể mở rộng kết quả tìm kiếm bằng một trong 2 tiêu chí này cũng được.
Kết quả:
Kết quả
Các bạn cũng có thể update một hoặc nhiều Document cùng một lúc cũng được.
Chúng ta sẽ sử dụng các phương thức updateOne() hoặc updateMany() của đối tượng MongoCollection để làm điều này.
Có nhiều phương thức overload của 2 phương thức trên với các tham số khác nhau. Nhưng cơ bản thì có 2 tham số chính, đó là đối tượng Document để tìm kiếm các Document cần update, đối tượng Document thứ 2 chứa nội dung cần update.
Trong ví dụ của mình, giả sử mình cần update tuổi của các sinh viên tên Khanh lên 32 thì mình sẽ viết code như sau:
Nhiều quy chuẩn được đặt ra nhằm thiết lập một format hoàn thiện cho một CV IT. Đặc biệt, đối với CV IT Manager lại đòi hỏi những nội dung tương ứng. Bạn sẽ dễ dàng tạo được ấn tượng với nhà tuyển dung với một CV đạt chuẩn. Cùng TopDev xem qua đâu là format hoàn hảo nhất cho phiên bản CV IT Manager của bạn.
Cách định đạng (Format) chuẩn dành cho CV IT Manager
Cách định dạng cũng chính là những lưu ý giúp bạn gia tăng thêm độ chuyên nghiệp, tính xác thực của CV IT của bạn. Thực tế cho thấy, có rất nhiều mẫu CV ngành IT để bạn lựa chọn.
Tuy nhiên, hầu hết các format đều chung chung và chưa nói lên rõ các yếu tố giúp cốt lỗi (core factors) để bạn nâng cao chất lượng CV của mình.
Đâu sẽ là phiên bản format chuẩn cho CV IT Manager của bạn?
Checklist những lưu ý viết CV IT project manager:
1. Các chi tiết để nhà tuyển dụng liên hệ
Thông tin, địa chỉ lý lịch cần đảm bảo độ chính xác.
2. Bản tóm tắt lý lịch (nếu doanh nghiệp yêu cầu)
Viết ngắn gọn và nên “chào đầu” bằng một tiêu đề hấp dẫn.
3. Kinh nghiệm làm việc (Lịch sử công việc)
Liệt kê các nhiệm vụ bản thân chịu trách nhiệm; các thành tích có liên quan. Đặc biệt nếu đã có kinh nghiệm làm freelancer IT, bạn có thể tự tin bổ sung vào CV của mình.
4. Trình độ học vấn
Không chỉ dừng lại ở việc nói về trường/cơ sở bạn học tập, nghiên cứu. Hãy nói thêm về các môn học quan trọng, khóa học chuyên sâu, các dự án thực tế và các giải thưởng danh dự (nếu có).
Dù bạn viết CV IT tiếng anh hay CV IT tiếng việt, các yếu tố được triển khai thêm đều có ý nghĩa giúp nhà tuyển dụng đánh giá sâu hơn về tiềm năng phát triển của bạn.
Ngoài ra, bạn nên đề cập đến các kỹ năng chuyên sâu trong CV xin việc CNTT:
+ An ninh mạng (Cyber Security)
+ Phát triển ứng dụng (Application Development)
+ Điện toán đám mây (Cloud Computing)
+ Điện toán lượng tử (Quantum Computing)
+ Quản lý Trung tâm Dữ liệu (Data Center Management)
+ Lập kế hoạch nguồn lực doanh nghiệp (ERP)
+ Phân tích dữ liệu kinh doanh (Business Analytics)
+ Quản trị Mạng (Network Administration)
+ Quản trị Cơ sở dữ liệu (Database Administration)
+ Vận hành phát triển hoạt động (DevOps)
6. Các chứng chỉ và giấy giới thiệu
Đây là các yếu tố không bắt buộc và cũng ít nhà tuyển dụng quan tâm. Tuy vậy, nếu bạn sở hữu các chứng chỉ khoa học chuyên ngành IT do nỗ lực bản thân, đừng ngần ngại việc đưa chúng vào CV của bạn.