Last month, MGM Technology Partners organized the internal Goodminton Tournament with more than 20 players joining in single and double categories. After the ranking round and intense final matches, their company finally found the champions: Tuan Tran & Anh Phan were the champions of the doubles category, and Bao took the gold medal after convincing victories over all the players he met.
This tournament not only enhanced the sportsmanship but also connected all members of the club
Okie bắt đầu thôi anh em, nào là sóc, nào là kẹt. Quất hết
1. Socket IO là gì?
Đầu tiên, dành cho anh em hay nhầm lẫn Socket IO là cái gì đó mới lắm thì câu trả lời là ông thần này đã được ra mắt vào năm 2010. Socket IO ra đời với mục đích giúp kết nối trong thời gian thực giữa client và server (máy chủ và máy khách)
Bản thân giao tiếp là hai chiều, qua lại giữa client và server. Việc giao tiếp hai chiều chỉ xảy ra khi client enable cho phép sử dụng Socket IO, và phía server cũng làm y chang thế.
Về lý thuyết mà nói thì socket io có thể giữ liên lạc và gửi nhiều loại dữ liệu khác nhau, nhưng thông thường hay sử dụng chỉ để gửi JSON. JSON everywhere luôn anh em. Ớn
Rồi, đi sâu hơn tí về cách hoạt động, bản thân ông socket không đứng một mình, mà cũng không phải mỗi ổng làm nên mùa thu. Phía dưới của socket là engine.io, engine là cấp thấp hơn, sử dụng phía client bằng Engine.IO-client.
Mốt cái nữa anh em cũng hay nhầm giữa WebSockets và Socket IO, 2 thằng này khác nhau, mặc dù đều là giao tiếp giữa client và server (bi-directional communication) nhưng socket io không sử dụng quy chuẩn của web socket. Chi tiết sẽ nói rõ hơn ở phần sau
Anh em cũng có thể xem video này để biết thêm về Socket IO
2. Socket IO hoạt động như thế nào?
2.1 Với websocket
Như ở trên đã có đề cập với anh em socket IO khác với websocket, mặc dù cả hai đều phụ trách giao tiếp giữa client và server. Để giữ kết nối này ta cần biết khái niệm về long-polling. Bản thân Socket IO tạo ra long-polling bằng cách sử dụng xhr-polling để tạo ra connection giữa client và server.
Vấn đề là một khi kết nối đã được mở, Socket IO lại cập nhật lên phương thức kết nối tốt nhất (best connection method). Lúc này lại quay lại Websocket.
Anh em có thể tham khảo bài viết này, để biết tại sao WebSocket lại là lựa chọn tốt hơn.
Quay trở lại với Socket IO hoạt động như thế nào?. Cách đơn giản nhất để giải thích cách hoạt động của SocketIO là chatapp. Thông thường một app chat luôn phải giữ kết nối giữa client và server. Giả sử 2 người A và B chat với nhau thì connection giữa Client A, Client B tới server chat sẽ luôn được mở.
Với socket, một khi server nhận được tin nhắn của Client A, nó sẽ gửi thông báo tới Client B. Bản thân request chỉ cần mở một lần, không cần phải gọi tới gọi lui nhiều request.
3. Ví dụ socket chat
Anh em cài Nodejs và Express. Cùng bắt tay xây dựng thử ứng dụng chat với Socket IO
Đầu tiên khởi tạo folder với một số câu lệnh chạy ở powershell hoặc terminal
$ mkdir socket.io-example
cd socket.io-example
npm install socket.io express
<script>
// select relevant elements
const form = document.querySelector("form");
const input = document.querySelector("input");
messageList = document.querySelector("ul");
// establish socket.io connection
const socket = io();
// handle sending message to server & input reset
function sendMessage(e) {
// prevent form submission refreshing page
e.preventDefault();
// send input value to server as type 'message'
socket.emit("message", input.value);
// reset input value
input.value = "";
}
// add listener to form submission
form.addEventListener("submit", sendMessage);
// add message to our page
function addMessageToHTML(message) {
// create a new li element
const li = document.createElement("li");
// add message to the elements text
li.innerText = message;
// add to list of messages
messageList.append(li);
}
// watch for socket to emit a 'message'
socket.on("message", addMessageToHTML);
// display message when a user connects
function alertUserConnected() {
addMessageToHTML("User connected");
}
// watch for socket to emit a 'user connected' event
socket.on("user connected", alertUserConnected);
</script>
Điểm quan trọng trong phần này là function socket.on(event, callback). Mỗi khi có sự kiện gọi tới, hàm trong call back sẽ gọi để xử lý và hiển thị lên màn hình.
4. Tham khảo
Để hiểu rõ hơn về Socket IO, khuyến cáo anh em nên truy cập trang chủ và đọc kĩ các phần tài liệu được ghi ở SocketIO nhé.
Có nên quay lại công ty cũ làm việc? Câu hỏi này đã trở thành chủ đề bàn tán sôi nổi trong giới nhân viên văn phòng trong những năm gần đây. Khi thị trường tuyển dụng cạnh tranh gay gắt, nhiều người đã quyết định rời bỏ công ty cũ để tìm kiếm cơ hội mới. Tuy nhiên, sau một thời gian, họ lại cảm thấy không hài lòng với môi trường làm việc mới và muốn quay lại công ty cũ.
Vậy, có nên quay lại công ty cũ làm việc hay không? Câu trả lời sẽ có trong bài viết này!
Tại sao bạn nghỉ việc ở công ty cũ?
Tại sao bạn nghỉ việc ở công ty cũ? Có nhiều lý do khiến người ta quyết định rời bỏ công ty cũ và chọn con đường mới trong sự nghiệp. Có thể do những nguyên nhân khách quan như gia đình có việc cần, sức khỏe không đảm bảo hoặc bắt buộc phải tham gia nghĩa vụ quân sự,…
Ngoài ra, còn có một số nguyên nhân chủ quan khiến bạn nghỉ việc ở công ty cũ như cảm thấy không hài lòng với môi trường làm việc, lương thưởng không xứng đáng, mâu thuẫn với đồng nghiệp với sếp hoặc muốn tìm kiếm cơ hội phát triển bản thân ở một môi trường mới.
Nếu bạn nghỉ việc vì những lý do khách quan, thì bạn có thể cân nhắc việc quay lại công ty cũ sau khi các lý do đó được giải quyết. Tuy nhiên, nếu bạn nghỉ việc vì những lý do chủ quan, thì bạn nên suy nghĩ kỹ trước khi đưa ra quyết định quay lại.
Tìm hiểu lý do khiến bạn muốn quay lại công ty cũ làm việc
Trả lời câu hỏi “Lý do gì khiến bạn muốn quay lại công ty cũ làm việc?” sẽ giúp bạn dễ dàng hơn khi đưa ra quyết định có nên quay lại hay không. Dưới đây là một số lý do mà một người có thể muốn quay lại công ty cũ làm việc:
Mối quan hệ làm việc tích cực: Nếu bạn có mối quan hệ làm việc tích cực và đồng đội thân thiện tại công ty cũ, đó có thể là một lý do mạnh mẽ khiến bạn muốn quay lại. Môi trường làm việc thoải mái và hỗ trợ có thể tạo điều kiện cho sự phát triển và hạnh phúc nghề nghiệp.
Cơ hội phát triển nghề nghiệp: Nếu công ty cũ đưa ra cơ hội phát triển nghề nghiệp hấp dẫn và có sự đầu tư vào sự phát triển cá nhân của bạn, việc quay lại có thể được xem xét. Có thể có những dự án mới, vị trí quản lý hoặc cơ hội đàm phán mức lương và lợi ích mới.
Sự thấu hiểu về văn hóa công ty: Một lợi thế của việc quay lại công ty cũ là bạn đã có sự thấu hiểu sâu rộng về văn hóa công ty. Nếu bạn thích và phù hợp với giá trị và phong cách làm việc của công ty, đó có thể là lý do quan trọng để trở lại.
Sự thay đổi trong tình hình cá nhân: Có những thời kỳ trong cuộc đời khi sự ổn định và chắc chắn trở nên quan trọng hơn. Nếu có sự thay đổi trong tình hình cá nhân của bạn, chẳng hạn như muốn ổn định cuộc sống gia đình hoặc giảm áp lực công việc, việc quay lại công ty cũ có thể là một lựa chọn hợp lý.
Quay lại công ty cũ làm việc có thể là một lựa chọn tốt nếu bạn muốn tiếp tục phát triển sự nghiệp của mình và gắn bó với một môi trường làm việc quen thuộc. Tuy nhiên, để quay lại công ty cũ thành công, bạn cần chuẩn bị kỹ lưỡng và thực hiện đúng cách.
Dưới đây là một số mẹo giúp bạn quay lại công ty cũ thành công:
1. Liên hệ với người quản lý cũ của bạn
Bước đầu tiên để quay lại công ty cũ là liên hệ với người quản lý cũ của bạn. Hãy cho họ biết rằng bạn đang quan tâm đến việc quay trở lại công ty. Bạn có thể gọi điện, gửi email hoặc gặp trực tiếp để trò chuyện.
Khi liên hệ với người quản lý cũ, hãy thể hiện sự nhiệt tình và mong muốn quay lại công ty. Bạn cũng nên cho họ biết lý do tại sao bạn muốn quay lại. Nếu bạn có thể thuyết phục người quản lý cũ rằng bạn là một nhân viên tốt và có giá trị, họ sẽ sẵn sàng giúp đỡ bạn.
2. Cho họ thấy những gì bạn đã học được kể từ khi rời đi
Khi bạn trò chuyện với người quản lý cũ, hãy cho họ thấy những gì bạn đã học được kể từ khi rời đi. Bạn có thể nói về các kỹ năng và kiến thức mới mà bạn đã tích lũy được, hoặc về những thành tích mà bạn đã đạt được trong thời gian làm việc ở công ty mới.
Việc thể hiện những gì bạn đã học được sẽ giúp người quản lý cũ thấy rằng bạn là một nhân viên có giá trị và có thể đóng góp nhiều hơn cho công ty.
Hãy chia sẻ rõ ràng về mục tiêu nghề nghiệp của bạn với người quản lý cũ. Điều này sẽ giúp họ hiểu được những gì bạn muốn đạt được trong sự nghiệp của mình và liệu công ty có thể đáp ứng được những kỳ vọng của bạn hay không.
Nếu bạn có thể chia sẻ những mục tiêu nghề nghiệp cụ thể, người quản lý cũ sẽ đánh giá cao sự nghiêm túc và quyết tâm của bạn.
4. Thể hiện sự tích cực, chuyên nghiệp trong mọi hoàn cảnh
Trong suốt quá trình trò chuyện với người quản lý cũ, hãy luôn thể hiện sự tích cực và chuyên nghiệp. Điều này sẽ giúp bạn tạo ấn tượng tốt và tăng cơ hội được quay lại công ty cũ. Hãy tránh nói xấu công ty mới hoặc đồng nghiệp cũ. Thay vào đó, hãy tập trung vào những điểm mạnh và thành tích của bạn.
5. Chuẩn bị tâm lý cho cảm giác tiêu cực từ sếp hoặc đồng nghiệp cũ
Nếu bạn đã rời đi vì những lý do tiêu cực, có thể sếp hoặc đồng nghiệp cũ của bạn sẽ có cảm giác tiêu cực khi biết bạn muốn quay lại. Hãy chấp nhận những cảm xúc này và cố gắng giải quyết chúng một cách tích cực.
Bạn có thể nói chuyện riêng với sếp hoặc đồng nghiệp cũ để tìm hiểu nguyên nhân của những cảm xúc tiêu cực đó. Sau đó, hãy cố gắng giải thích lý do tại sao bạn muốn quay lại và làm rõ những điều khiến bạn không hài lòng trước đây.
6. Chứng minh bằng cam kết
Hãy thể hiện cam kết của bạn với công ty cũ. Điều này sẽ giúp người quản lý cũ thấy rằng bạn nghiêm túc với quyết định quay lại công ty.
Bạn có thể thể hiện cam kết của mình bằng cách:
Chấp nhận mức lương và vị trí phù hợp với năng lực kinh nghiệm của bạn.
Nói rõ rằng bạn muốn gắn bó lâu dài với công ty.
Thể hiện sự sẵn sàng học hỏi và phát triển.
Tuân theo những mẹo trên sẽ giúp bạn tăng cơ hội quay lại công ty cũ thành công. Hãy chuẩn bị kỹ lưỡng và thực hiện đúng cách để đạt được mục tiêu của mình.
Kết luận
Có nên quay lại công ty cũ làm việc hay không là một quyết định cá nhân. Không có câu trả lời đúng hay sai cho câu hỏi này. Điều quan trọng là bạn phải cân nhắc kỹ lưỡng tất cả các yếu tố liên quan trước khi đưa ra quyết định.
Hãy nhớ rằng quyết định quay lại công ty cũ không chỉ là về việc quyết định nơi làm việc mà còn về việc hiểu rõ hơn về chính bản thân mình. Cân nhắc mỗi khía cạnh của quyết định này, đảm bảo rằng nó phản ánh đúng với những gì bạn mong đợi từ sự nghiệp và cuộc sống của mình. Một quyết định quyết đoán và đầy tính chiến lược sẽ giúp bạn thăng tiến trên con đường sự nghiệp một cách mạnh mẽ.
Clean code Android là gì? Có lẽ bạn đã nghe quá nhiều các đàn anh đi trước nói: Em phải viết clean code thì mã nguồn mới dễ đọc, dễ mở rộng, dễ bảo trì… Nhưng bạn có biết clean code Android là thế nào không? Có phải cứ viết ngắn gọn là clean code?
Với những người đang đọc bài viết này: Một là, bạn là một lập trình viên. Hai là, bạn muốn trở thành một lập trình viên giỏi. — Robert C. Martin
Thử tưởng tượng bạn đang ở trong một thư viện sách. Bạn muốn tìm một cuốn sách nào đó. Nếu như thư viện được sắp xếp gọn gàng, phân loại sách tốt thì bạn sẽ dễ dàng tìm được cuốn mình cần. Ngoài ra, nếu như thư viện mà được thiết kế nội thất tối, bạn sẽ có hứng thú hơn khi đọc sách.
Cũng giống như ví dụ trên, khi bạn xây dựng một ứng dụng, bạn phải biết cách viết code và tổ chức sao cho gọn gàng, dễ đọc.
Đặc biệt với các dự án có nhiều thành viên, và thời gian maintaince dài. Khi đọc code, các member chỉ cần nhìn tên class, tên hàm, tên package… là hiểu ngay.
Đừng để những tiếng “F***K” vang lên mỗi khi ai đó đọc code của bạn
Thực hành cách viết Clean Code Android
“Clean Code” là gì?
Source code của bạn được gọi là “Clean” khi nó có thể dễ dàng đọc hiểu bởi các member trong dự án. Không chỉ tác giả của mã nguồn mới có trách nhiệm tạo code được clean hơn. Mà tất cả các member trong dự án cũng phải ý thức được cần phải viết code clean.
Với tính dễ hiểu, clean code Android sẽ giúp dự án dễ dàng mở rộng, thay đổi theo yêu cầu mới, cũng như tăng cường khả năng bảo trì của ứng dụng.
Tên biến, hàm, Class… phải có nghĩa.
Có thể việc bạn suy nghĩ về tên biến sao cho có ý nghĩa hơi mất thời gian, nhưng lợi ích của nó mang lại thì vô cùng lớn.
Tên của biến, tên hàm, hay tên class… phải nói lên được tại sao nó tồn tại, nó là gì và sử dụng như thế nào.
Nếu một tên cần phải comment để giải thích thì tên đó vẫn chưa đạt được yêu cầu của “Clean code”.
Mình lấy một số ví dụ:
// Không nênvar a = 0 // user agesvar w = 0 // user weightvar h = 0 // user height// Không nên funage()funweight()funheight()// Tên class như này vẫn chưa phải là chuẩn clean code.classUserInfo()// Nênvar userAge = 0var userWeight = 0var userHeight = 0// NênfunsetUserAge()funsetUserWeight()funsetUserHeight()// NênclassUsers()
Tên Class hay Object nên là danh từ hay cụm danh từ. Ví dụ: Customer, WikiPage, Account, hay AddressParser. ( Xem cách khởi tạo class bằng Kotlin)
Tránh thêm những hậu tố vào trong tên class: Manager, Processor, Data, or Info.
Tuyệt đối không sử dụng động từ để làm tên Class.
#Tên hàm
Ngược với tên hàm, tên hàm nên sử dụng động từ để đặt tên. Ví dụ: postPayment(), deletePage(), hay save()…
OK, giờ chúng ta sẽ bắt đầu học cách viết clean code Android theo quy tắc S.O.L.I.D
Sử dụng quy tắc S.O.L.I.D để viết clean code Android
S.O.L.I.D là bộ quy tắc viết code được phát minh bởi Robert C. Martin (Uncle Bob). Khi bạn ứng dụng bộ quy tắc này vào dự án, đảm bảo mã nguồn của bạn sẽ cực kỳ “clean” luôn.
Vậy bộ quy tắc này có những nguyên lý gì?
Bạn cứ đi pha một cốc cafe rồi quay lại tiếp tục đọc nhé
Nguyên lý đầu tiên, tương ứng với chữ S trong S.O.L.I.D. Nội dung nguyên lý:
Một class chỉ nên giữ 1 trách nhiệm duy nhất
(Chỉ có thể sửa đổi class với 1 lý do duy nhất)
Để hiểu nguyên lý này, chúng ta lấy ví dụ về 1 class Adapter với các logic được implement trong onBindViewHolder.
classMyAdapter(val friendList: List<FriendListData.Friend>) : RecyclerView.Adapter<CountryAdapter.MyViewHolder>(){ inner classMyViewHolder(view: View) : RecyclerView.ViewHolder(view){ var name: TextView = view.findViewById(R.id.text1) var popText: TextView = view.findViewById(R.id.text2) } overridefunonBindViewHolder(holder: MyViewHolder, position: Int){ val friend = friendList[position] val status = if(friend.maritalStatus == "Married"){ "Sold out" }else{ "Available" } holder.name.text = friend.name holder.popText.text = friend.email holder.status.text = status } overridefungetItemCount(): Int { return friendList.size } overridefunonCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_friendlist, parent, false) returnMyViewHolder(view) }}
Với các viết code này đã vi phạm nguyên lý của S.L.O.I.D. Bởi vì class RecyclerView.Adapter không chỉ chịu một trách nhiệm duy nhất. Vì nó phải implement phần logic cho biến status trong onBindViewHolder.
Hàm onBindViewHolder() chỉ nên làm một nhiệm vụ duy nhất là thiết lập dữ liệu để hiển thị ra view thôi, không xử lý bất kì logic nào cả.
Sau này chỉ cần ta thay đổi DB hay thay đổi cách hiển thị kết quả dữ liệu,… ta sẽ phải sửa đổi class này. Càng về sau class sẽ càng phình to ra.
Theo đúng nguyên lý, ta phải tách class này ra làm 3 class riêng. Tuy số lượng class nhiều hơn những việc update code sẽ đơn giản hơn. Class ngắn hơn nên cũng ít issue hơn.
#Open-Closed Principle — OCP
Nguyên lý thứ hai, tương ứng với chữ O trong SOLID. Nội dung nguyên lý:
Có thể thoải mái mở rộng 1 class, nhưng không được sửa đổi bên trong class đó
(open for extension but closed for modification).
Điều này có nghĩa là: Nếu bạn viết một class A, và các members khác muốn chỉnh sửa một function bên trong Class A. Họ có thể dễ dàng extend Class A và sửa đổi tùy thích. Nhưng không nên sửa trực tiếp trong Class A.
Mình tiếp tục với ví dụ với RecyclerView.Adapter class. Bạn có thể dễ dàng extend class này tạo một Adapter cho riêng mình.
Nguyên lý thứ ba, tương ứng với chữ L trong SOLID. Nội dung nguyên lý:
Trong một chương trình, các object của class con có thể thay thế class cha
mà không làm thay đổi tính đúng đắn của chương trình
Điều này có nghĩa là class con khi override hàm mà không làm hỏng chức năng của class.
Mình ví dụ: Bạn tạo một interface có một listener: onClick(). Sau đó bạn apply listener đó trong MyActivity. Khi người click và onClick() được gọi, bạn cho hiển thị một Toast thông báo.
interface ClickListener { funonClick()}class MyActivity: AppCompatActivity(), ClickListener { //........ overridefunonClick(){ // Do the magic here toast("OK button clicked") }}
#Interface Segregation Principle — ISP
Nguyên lý thứ tư, tương ứng với chữ I trong SOLID. Nội dung nguyên lý:
Thay vì dùng 1 interface lớn, ta nên tách thành nhiều interface nhỏ,
với nhiều mục đích cụ thể
Nghĩa là: nếu bạn muốn tạo một Interface A và implement nó trong một class B nào đó. Và sẽ class B sẽ phải implement toàn bộ methods trong Interface A. Sẽ ra sao nếu Interface có khoảng 100 methods, trong khi Class B không nhất thiết phải override toàn bộ số methods đó.
Nguyên lý này khuyên bạn nên tách Interface A ra thành nhiều Interface nhỏ khác với các methods liên quan với nhau nhiều nhất. Như vậy sẽ sẽ implement hơn nhiều.
Chúng ta cùng thử một ví dụ nhé. Trong activity của bạn, bạn cần phải implement SearchView.OnQueryTextListener() và bạn chỉ cần đến mỗi hàm onQuerySubmit().
mSearchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{ overridefunonQueryTextSubmit(query: String?): Boolean { // Chỉ muốn override hàm này returntrue } overridefunonQueryTextChange(query: String?): Boolean { // Chúng ta không muốn override cả hàm này. returnfalse }})
Làm thế nào có thể làm được điều này? Đơn giản là bạn chỉ cần tạo một callback và một class extend từ nó.
val listener = SearchViewQueryTextListener( object : SearchViewQueryTextCallback { overridefunonQueryTextSubmit(query: String?){ // Do the magic here } })mSearchView.setOnQueryTextListener(listener)
#Dependency Inversion Principle — DIP
Nguyên lý cuối cùng, tương ứng với chữ D trong SOLID. Nội dung nguyên lý:
1. Các module cấp cao không nên phụ thuộc vào các modules cấp thấp.
Cả 2 nên phụ thuộc vào abstraction.
2. Interface(abstraction) không nên phụ thuộc vào chi tiết,
mà ngược lại.
(Các class giao tiếp với nhau thông qua interface,
không phải thông qua implementation.)
Một ví dụ đơn giản đó là mô hình MVP. Bạn có một Interface giúp chúng ta kết nối các class. Tức là, các UI class không cần quan tâm đến logic được implement trong Presenter như thế nào.
Vì vậy, nếu bạn có phải thay đổi logic bên trong Presenter thì UI cũng không biết, không cần phải thay đổi code vì điều đó.
class UserActivity : AppCompatActivity(){ //..... val presenter = UserPresenter() overridefunonCreate(savedInstanceState: Bundle?){ super.onCreate(savedInstanceState) // Activity doesn't need to know how presenter works // for fetching data, it just know how to call the functions // So, if you add method inside presenter, it won't break the UI. // even the UI doesn't call the method. presenter.getUserData() }
//....}
Tạm kết
Như vậy, qua bài viết này mình chỉ muốn truyền tải đến bạn một thông điệp duy nhất:
“Hãy viết code như thể người maintain là một đứa sát nhân điên cuồng và biết địa chỉ nhà bạn”
Bài viết này mình chủ yếu tập trung vào cách viết clean code Android. Tuy nhiên, nguyên lý S.L.O.I.D hoàn toàn có thể ứng dụng cho những mã nguồn khác.
Mã nguồn của bạn có thực sự “Clean” không? Hãy để lại bình luận bên dưới nhé.
Bài viết được sự cho phép của BBT Tạp chí lập trình
Tôi đã từng nghe một cuộc thảo luận thú vị giữa hai người bạn lập trình viên của tôi, tranh luận liệu một người có thể trở thành lập trình viên mà không cần tiếng Anh hay không.
Bạn tôi, A, có hơn 5 năm kinh nghiệm trong lĩnh vực phát triển web và phần mềm, khẳng định rằng tiếng Anh không bao giờ là bắt buộc đối với một lập trình viên.
Mặc dù tôi đã không ghi lại những gì anh ấy nói ngày hôm đó, nhưng tôi vẫn nhớ hầu hết các lập luận của anh ấy, điều mà rất có ý nghĩa đối với tôi:
“Bạn có thể trở thành một lập trình viên mà không cần tiếng Anh”
Không biết tiếng Anh có thể khiến việc lập trình trở nên khó khăn ở một mức độ nhất định; tuy nhiên, một người không nói tiếng Anh có thể học lập trình. Có hàng ngàn tài liệu không phải tiếng Anh trên Internet sẽ hướng dẫn người mới bắt đầu biết mọi thứ về lập trình.
Một số ngôn ngữ lập trình có sẵn bằng các ngôn ngữ khác ngoài tiếng Anh:
Qalb: tiếng Ả Rập
Python: Trung Quốc
Farsinet: tiếng Ba Tư
Ngoài ra còn có một số nền tảng phát triển phần mềm không phải tiếng Anh như:
Aheui: Hàn Quốc
ZhPy: Tiếng Trung
Một điểm nữa mà tôi phải dừng lại, code không phải là thơ, và để viết code, bạn không cần đến 5 cuốn từ điển trên bàn làm việc. Những gì bạn cần là có kỹ năng logic và kỹ năng toán học tốt.
Tất nhiên, hãy thử tra cứu ‘các quốc gia tốt nhất với các nhà phát triển web tốt nhất’ trên Google, nhưng không phải bây giờ, đây là những gì bạn sẽ tìm thấy:
Theo HackerRank, 5 quốc gia hàng đầu có các lập trình viên web giỏi nhất là:
Nói như vậy, tôi gần như bị thuyết phục cho đến khi A, một nhà phát triển ứng dụng di động, người đã tự học lập trình, trả lời anh ấy, giải quyết vấn đề nan giải từ một góc độ khác:
“Bạn không thể trở thành lập trình viên xuất sắc nếu không có tiếng anh”
Trước khi tôi bắt đầu, điều này không liên quan gì đến việc ‘Tiếng Anh là mẹ của khoa học’ bởi vì nó không phải vậy. Và nó không liên quan gì đến việc ngôn ngữ này tốt hơn ngôn ngữ kia.
Hãy để tôi hỏi bạn một câu hỏi:
Giả sử bạn là một người nói tiếng Anh không phải là tiếng mẹ đẻ (có lẽ bạn cũng vậy) và bạn đi du lịch nước ngoài, nơi mọi người đều nói tiếng Anh. Nếu bạn có khả năng học ngôn ngữ, bạn sẽ? Điều đó sẽ không làm cho cuộc sống của bạn ở đó dễ dàng hơn?
Tất nhiên, có nhiều quốc gia khác nói ngôn ngữ của bạn, nhưng điều đó không có nghĩa là bạn có thể bỏ qua những quốc gia còn lại.
Bạn có thể học các ngôn ngữ lập trình có sẵn bằng tiếng Ả Rập, tiếng Trung và tiếng Hindi. Nhưng những gì về những gì không phải là? Mặc dù Qalb và Farsinet tồn tại, các ngôn ngữ như Ruby và Lua đến từ các quốc gia không nói tiếng Anh (Nhật Bản và Brazil) nhưng vẫn sử dụng cú pháp tiếng Anh.
A đưa ra một điểm thú vị khác, đề cập đến kinh nghiệm của anh ấy, học cách tự viết code:
Có, có sách và hướng dẫn bằng một số ngôn ngữ. Tuy nhiên, khi bạn đạt đến trình độ nâng cao nhất định, tài liệu có giá trị duy nhất bạn tìm thấy sẽ bằng tiếng Anh.
Hơn nữa, trong một thế giới nơi internet quy định, nơi việc gặp gỡ các lập trình viên khác từ các quốc gia khác là điều chắc chắn, thì tiếng Anh là tiêu chuẩn. Đó là ngôn ngữ bạn sẽ sử dụng trong các hội nghị và cuộc họp trực tuyến với một số khách hàng của mình.
Kết luận
Sau khi lắng nghe cẩn thận cuộc tranh luận của họ, tôi đã đưa ra một nhận xét khiến cả hai phải suy nghĩ lại về lập trường của mình ‘Ý kiến của các bạn hoàn toàn bổ sung cho nhau.’
Vâng, tiếng Anh là không cần thiết để học lập trình; tuy nhiên, nếu bạn là một lập trình viên chuyên nghiệp, đến một lúc nào đó bạn sẽ phải tương tác với một người không cùng văn hóa với bạn.
Bạn có thể đọc và học từ các tài liệu bằng ngôn ngữ của mình, nhưng đôi khi bạn sẽ cần những tài liệu nâng cao hơn.
Tôi hy vọng bài viết này sẽ hữu ích cho bạn. Cảm ơn các bạn đã theo dõi bài viết.
API (Application Programming Interface) là một công cụ quan trọng, giúp các lập trình viên tiết kiệm thời gian và công sức, nâng cao hiệu quả công việc và sáng tạo ra các ứng dụng mới. Trong bài viết này, chúng ta sẽ cùng khám phá top 8 nguồn API hữu ích hỗ trợ anh em developer xây dựng một số tính năng trên web/app dễ dàng hơn.
API là gì? Vì sao developer cần sử dụng API?
API, hay Application Programming Interface, là một tập hợp các quy tắc và giao thức cho phép các phần mềm khác nhau tương tác và giao tiếp với nhau. Nó giúp xây dựng một cầu nối giữa các ứng dụng khác nhau, cho phép chúng trao đổi dữ liệu và chức năng mà không cần biết chi tiết bên trong của nhau.
Vậy tại sao developer cần sử dụng API?
Tiết kiệm thời gian và công sức: API giúp developer tiết kiệm thời gian và công sức trong việc phát triển ứng dụng. Thay vì phải tự xây dựng các chức năng và dữ liệu từ đầu, developer có thể sử dụng API để truy cập vào các chức năng và dữ liệu đã được phát triển sẵn.
Nâng cao hiệu quả công việc: API giúp developer nâng cao hiệu quả công việc bằng cách cho phép họ tập trung vào các tính năng sáng tạo của ứng dụng.
Tăng tính sáng tạo: API giúp developer tăng tính sáng tạo bằng cách cho phép họ tích hợp các ứng dụng khác nhau với nhau.
Dưới đây là một số API hữu ích anh em dev có thể tham khảo:
API REST Countries
API REST Countries là một nguồn dữ liệu phong phú về các quốc gia trên thế giới. Được cung cấp thông qua các endpoint RESTful, API này cho phép bạn truy xuất thông tin đa dạng về các quốc gia, từ thông tin địa lý đến thông tin về dân số, ngôn ngữ, và nền kinh tế.
API Google Maps
API Google Maps là một công cụ mạnh mẽ của Google cho phép bạn tích hợp các tính năng địa lý vào ứng dụng hoặc trang web của mình. Các nhà phát triển có thể nhúng Google Maps vào ứng dụng của mình, cho phép người dùng tìm kiếm địa điểm, nhận chỉ đường, xem hình ảnh đường phố hoặc tính toán tuyến đường giữa các vị trí.
API JSON Placeholder
JSON Placeholder là một API dùng để mô phỏng các dịch vụ RESTful để phục vụ cho mục đích testing và prototyping ứng dụng. API bao gồm các dữ liệu về bài đăng trên blog, nhận xét, người dùng và nhiều hơn nữa.
API Petfinder là một API RESTful cho phép các nhà phát triển truy cập vào dữ liệu về vật nuôi tìm gia đình mới từ hơn 13.000 nơi trú ẩn và nhóm cứu hộ trên toàn thế giới. API bao gồm thông tin về vật nuôi, chẳng hạn như tên, giống, tuổi, giới tính, kích thước, màu sắc, trạng thái sức khỏe và các chi tiết khác.
API Petfinder có thể được sử dụng để tạo ra nhiều loại ứng dụng khác nhau, chẳng hạn như: Ứng dụng tìm kiếm thú cưng, ứng dụng theo dõi thú cưng hay ứng dụng giáo dục về nhận nuôi thú cưng.
API Open Weather
Open Weather API là một API miễn phí cung cấp dữ liệu thời tiết từ hơn 2 triệu địa điểm trên toàn thế giới. API bao gồm các thông tin như nhiệt độ, độ ẩm, áp suất, lượng mưa, tốc độ gió và nhiều hơn nữa. Open Weather API là một công cụ hữu ích cho các nhà phát triển muốn tạo ra các ứng dụng dựa trên dữ liệu thời tiết.
API CoinGecko
CoinGecko API là một tập hợp các API cung cấp dữ liệu về thị trường tiền điện tử, bao gồm giá, khối lượng giao dịch, vốn hóa thị trường, lịch sử giao dịch và nhiều hơn nữa. API này được sử dụng bởi các nhà phát triển để tạo ra các ứng dụng và dịch vụ liên quan đến tiền điện tử, chẳng hạn như: Ứng dụng theo dõi giá tiền điện tử, ứng dụng giao dịch tiền điện tử, ứng dụng phân tích thị trường tiền điện tử.
CoinGecko API có hai gói: gói miễn phí và gói trả phí. Gói miễn phí cung cấp một số lượng hạn chế các API, trong khi gói trả phí cung cấp quyền truy cập vào tất cả các API.
API Mail Chimp
Mail chimp API là một phần quan trọng của dịch vụ Email Marketing nổi tiếng, Mail Chimp. Mail chimp API cho phép thêm, sửa đổi, và xóa danh sách email, giúp quản lý và tương tác với người đăng ký của bạn. Cung cấp các API để thêm, cập nhật, và xóa người đăng ký từ danh sách, cũng như lấy thông tin chi tiết về họ.
Mailchimp API là một công cụ quan trọng giúp các doanh nghiệp và tiếp thị viên tận dụng dữ liệu khách hàng để tạo ra chiến lược tiếp thị email hiệu quả và tương tác.
API Commerce.js
API Commerce.js là một API full-stack cho thương mại điện tử được xây dựng cho nhà thiết kế và nhà phát triển. API này cung cấp tất cả các tính năng bạn cần để xây dựng trải nghiệm thương mại điện tử tùy chỉnh hoạt động trên bất kỳ hệ thống frontend nào như web, di động hoặc bất kỳ thiết bị IoT nào.
Tổng kết
Với sự đa dạng của các API hiện có, các nhà phát triển có thể dễ dàng tìm thấy API phù hợp với nhu cầu của mình. Bằng cách sử dụng API, các nhà phát triển có thể tạo ra các ứng dụng và dịch vụ mới một cách nhanh chóng và hiệu quả. Hy vọng với 8 API bài viết đã giới thiệu, anh em developer có thể tận dụng một cách hiệu quả để tạo ra các ứng dụng gày càng thông minh và hữu ích.
Bài viết được sự cho phép của tác giả Nguyễn Hồng Quân
Trong giới lập trình, “oxy hóa” là một cách nói vui ám chỉ việc viết lại (một phần hoặc toàn bộ) một phần mềm bằng ngôn ngữ Rust, đây là một lối chơi chữ, vì “Rust” còn có nghĩa là “rỉ sét”, một hiện tượng do sự oxy hóa gây nên. Gần đây mình cũng mạnh dạn oxy hóa một phần nền tảng IoT nông nghiệp của AgriConnect.
Động lực khiến mình viết lại nền tảng IoT của AgriConnect bằng Rust là để giảm tải hệ thống, tăng cường khả năng chịu áp lực trong tương lai. Phần mềm mình đang nói đến ở đây có tên mã là “Hạt Thóc”. Nghe tên khiêm tốn, nhỏ bé thôi nhưng nó vận hành theo kiểu SaaS (Software as a Service), tức một phần mềm sẽ vận hành cùng lúc nhiều trang trại khách hàng. Mỗi khách hàng sẽ có một không gian riêng khi thao tác, quản lý trang trại của mình, thậm chí có tên miền riêng, nhưng thực ra tất cả đều đang được phục vụ bởi một chương trình trên server. Phần mềm này vốn được viết bằng ngôn ngữ Python, framework Django, được chia ra nhiều thành phần, mỗi thành phần chạy dưới dạng một process, một service riêng. Trong hoàn cảnh đặc thù của “Hạt Thóc” thì thì mình không “oxy hoá” theo kiểu, viết lại một vài hàm nào đó bằng Rust, biên dịch dưới dạng thư viện, rồi dùng Python import thư viện đó, mà viết lại toàn bộ thành phần con luôn. “Hạt Thóc” có ba thành phần chính:
Collector: Giao tiếp để thu thập dữ liệu cảm biến, trạng thái bật tắt của các tải, và lưu vào database.
ControlView: Cung cấp giao diện web để người dùng vào xem dữ liệu, cấu hình trang trại, đặt lịch, hay bật tắt tải bằng tay.
ControlCenter: Chạy ngầm để phân tích lịch, dữ liệu cảm biến để ra lệnh bật, tắt tải, kiểm tra tình trạng bất thường và phát đi cảnh báo.
Thành phần chạy nặng nhất là ControlCenter vì phải tính toán nhiều và khẩn trương, do có những trang trại, cụ thể là thủy canh, có những luật điều khiển phức tạp. Khẩn trương là vì, cũng lại trang trại thủy canh, có những máy móc mà chỉ được bật trong 1 – 2 giây rồi tắt liền. Đây cũng là thành phần đáng được viết lại bằng Rust.
Để khỏi hiểu lầm về khả năng của Python, xin được giải thích thêm là việc viết lại bằng Rust này không cấp thiết lắm, vì bên mình vẫn chưa dùng đến server mạnh. Để tăng cường khả năng đáp ứng thì phương án đơn giản hơn là nâng cấp cấu hình server thôi, vì dư địa mở rộng vẫn còn nhiều. Việc mình chọn phương án viết lại chỉ để rèn luyện bản thân và để tiết kiệm năng lượng tiêu thụ, giảm phát thải carbon .
Những bài toán nảy sinh khi một bộ code Rust cần cộng tác với một bộ code Django
Vì hoạt động chung với bộ code Django đang có nên controlcenter-rs phải đáp ứng những yêu cầu về interoperate như sau:
Hiểu được hệ thống cấu hình (settings).
Truy xuất được database đã được định hình bởi Django.
Các dự án Django của mình thường được quản lý settings bằng các file TOML, theo quy ước của thư viện Dynaconf, nghĩa là:
Settings được phân nhóm cho bốn môi trường: development (giai đoạn viết code trên máy cá nhân), staging (lúc chạy trên server staging phục vụ cho test), production (chạy thật để phục vụ cho người dùng thật), testing (khi chạy unittest /integration test). Để tránh việc lặp đi lặp lại thì có một môi trường default định nghĩa tất cả các settings gốc cùng giá trị gốc. Trong mỗi môi trường sau đó, cần thay đổi gì so với gốc thì chỉ cần định nghĩa lại mỗi tùy chọn đó thôi. Có một file dùng chung cho mọi lập trình viên, thông thường được đặt tên settings.toml, được lưu trong Git và có vừa đủ settings để chạy.
Mỗi lập trình viên trong quá trình viết và chạy thử trên máy cá nhân, có thể cũng cần những thay đổi nhỏ về settings cho phù hợp với máy mình, thì sẽ định nghĩa lại trong một file settings local, cũng theo cấu trúc giống như trên, nhưng không được lưu trong Git.
Tất cả các thông tin nhạy cảm như mật khẩu, API key thì không lưu vào các file trên kia, mà lưu trong file ẩn .secrets.toml, để giảm nguy cơ bị lộ, và không lưu trong Git để tránh việc rò rỉ trên các kho lưu mã nguồn.
Ví dụ của việc phân settings ra theo môi trường là:
Trong môi trường staging, production, mình ưu tiên kết nối database trong chế độ “không password”, và qua Unix domain socket, do database nằm trong cùng server với ứng dụng web, và không mở cổng để nhận kết nối từ bên ngoài vào. Trong môi trường này thì URL của database rất ngắn gọn như postgres:///my_db.
Trong môi trường testing thì vì chạy trong Docker container, như là một phần của hoạt động CI/CD, với database nằm trong một container riêng, thì lại cần settings khác, để kết nối database qua TCP và hostname cụ thể.
Trên máy cá nhân, nếu lập trình viên sử dụng Linux thì có thể họ sẽ muốn kết nối database qua Unix domain socket, nếu lập trình viên dùng hệ điều hành khác thì sẽ kết nối qua TCP v.v…
Khi viết lại ControlCenter bằng Rust thì mình cần một thư viện hỗ trợ nạp settings từ các file cấu hình này. Nhưng không may là thư viện bên Rust chưa phong phú bằng bên Python. Mình chỉ tìm thấy hydroconf với tính năng gần bằng, nên mình phải fork nó ra và viết thêm code để có tính năng như mong muốn, bản sửa đổi nằm ở đây.
Về truy cập chung database với Django thì mình vẫn để Django đóng vai trò chính trong việc thiết kế model, quản lý migrations. Bên Rust thì chỉ cần định nghĩa model nương theo cấu trúc đã định ra bởi code bên Django. Về ORM (Object-Relational Mapping) thì bên Rust có hai thư viện nổi bật: Diesel và SeaORM. Sau khi thử nghiệm thì chỉ Diesel dùng được, do “Hạt Thóc” có dùng vài kiểu dữ liệu đặc biệt của PostgreSQL, như kiểu Point của lĩnh vực GIS (hệ thống thông tin địa lý), kiểu Interval, mà chỉ Diesel mới hỗ trợ.
Số lượng bảng database nhiều, viết code lại thì rất ngại, may thay Diesel có những công cụ giúp sinh ra code cho models từ dữ liệu có sẵn, bao gồm:
diesel_cli: Để sinh ra code cho schema.rs. Đây là code phục vụ cho “query builder”.
dsync: Để sinh ra code cho các struct, dùng cho ORM.
Ngoài ra, mình cũng viết thêm công cụ Python để sinh ra code cho Rust, để chia sẻ một số dữ liệu từ bên code Python qua.
Lấy ví dụ, xét field cond_type của model ConditionSchedule phía trên, nó được lưu giá trị kiểu string, nhưng không phải chuỗi bất kì mà chỉ được nhận một trong những giá trị như 'ate', 'ahu', 'smo', v.v… theo định nghĩa sau:
Bên Django thì mình dùng class TextChoices để định nghĩa giới hạn lựa chọn như vậy. Bên Rust thì mình muốn dùng enum, thậm chí còn tiến thêm một bước nữa, là dựa vào type system của Rust để ràng buộc dữ liệu trao đổi giữa các hàm luôn. Lấy ví dụ mình có một hàm như sau, để tính toán xem tại thời điểm hiện tại, có cần giảm một điều kiện môi trường (nhiệt độ, độ ẩm) hay không:
Vì field ConditionSchedule.cond_type lưu giá trị string nên một cách tự nhiên, ta sẽ định nghĩa tham số cond_type trong hàm should_decrease_condition để nhận kiểu string. Nhưng như thế, ta phải giải quyết tình huống bên ngoài truyền vào nó một chuỗi bất kì không thuộc những lựa chọn trên kia, như thế sẽ làm code dài dòng và lặp đi lặp lại. Bằng cách định nghĩa một enum, giả sử đặt tên là BasicControlledConditionType, ta sẽ đảm bảo được bên ngoài chỉ truyền vào một trong những chuỗi mà ta mong muốn:
quá sơ sài khiến Diesel không biết phải chuyển hóa nó thành chuỗi gì khi lưu vào cột có kiểu Varchar, cũng như khi đọc một chuỗi từ database lên thì gò ép thành BasicControlledConditionType như thế nào.
Để hướng dẫn Diesel xử lý như thế nào, ta sẽ implement các trait để chuyển đổi dữ liệu cho enum.
Đầu tiên là chuyển đổi qua lại giữa enum và string. Không như Python, Rust chưa cho phép dùng string để làm giá trị tương đương cho từng variant, nghĩa là chưa cho phép viết:
Sau khi đã có trait để chuyển đổi qua lại giữa enum và string rồi, ta cần implement thêm các trait FromSql, ToSql để giúp Diesel biết cách chuyển đổi với kiểu dữ liệu của hệ CSDL (ở đây là PostgreSQL). Vì lười viết code nên mình lại dùng thư viện diesel_sqltype_enum_pg. Thế là, để có đầy đủ các trait thì enum của mình thành ra như vầy:
Nhưng như thế vẫn còn lười, vì có khá nhiều enum cần định nghĩa, và vì những thông tin như giá trị chuỗi, tên của variant đều có thể suy ra từ các class bên Python rồi, nên mình viết luôn một công cụ để sinh ra code định nghĩa các enum cho Rust, từ các class bên Python, Django.
Một số mẹo gia tăng DX (developer experience)
Có một điều đáng chia sẻ thêm, là một mẹo khiến các field thời gian tự động chuyển đổi múi giờ khi lấy từ database lên. Điều này giúp khi đọc log, ta đỡ phải xoắn não chuyển đổi. Chẳng hạn đoạn log sau mình đang debug giá trị của ActuatorSchedule, mình muốn thấy field starting_at thể hiện theo múi giờ Việt Nam.
Để làm như trên thì ta dựa vào tính năng deserialize_as của Diesel. Trước hết cần định nghĩa hai kiểu dữ liệu trung gian:
usechrono::{DateTime, FixedOffset, Utc};usechrono_tz::Asia::Ho_Chi_Minh;usediesel::deserialize::Result as DieselDeResult;usediesel::pg::Pg;usediesel::prelude::*;usediesel::sql_types::{Nullable, Timestamptz};useserde::Deserialize;// Intermediate types to help convert datetime loaded from DB to Viet Nam timezone
#[derive(Debug, Clone, Deserialize)]pubstructVnDateTime(pub DateTime<Utc>);#[derive(Debug, Clone, Deserialize)]pubstructOptionalVnDateTime(Option<DateTime<Utc>>);implVnDateTime{pubfnnow()->Self{Self(Utc::now())}}implQueryable<Timestamptz, Pg>forVnDateTime{typeRow=DateTime<Utc>;fnbuild(row:Self::Row)->DieselDeResult<Self>{Ok(VnDateTime(row))}}implQueryable<Nullable<Timestamptz>, Pg>forOptionalVnDateTime{typeRow=Option<DateTime<Utc>>;fnbuild(row:Self::Row)->DieselDeResult<Self>{Ok(OptionalVnDateTime(row))}}implFrom<VnDateTime>forDateTime<FixedOffset>{fnfrom(v: VnDateTime)->Self{
v.0.with_timezone(&Ho_Chi_Minh).fixed_offset()}}implFrom<OptionalVnDateTime>forOption<DateTime<FixedOffset>>{fnfrom(v: OptionalVnDateTime)->Self{
v.0.map(|dt|dt.with_timezone(&Ho_Chi_Minh).fixed_offset())}}
Mặc dù VnDateTime là kiểu riêng của ta, nhưng Rust lại không coi Option<VnDateTime>> cũng là của ta, buồn nhỉ.
Như vậy mình đã chia sẻ một số kinh nghiệm để chuyển đổi một phần dự án Django / Python sang Rust. Kết quả của việc chuyển đổi là thế nào? Như với “Hạt Thóc” thì phiên bản ControlCenter Rust chạy nhanh, nhẹ hơn một cách rất ấn tượng: chỉ tiêu tốn bộ nhớ RAM có 13,6MiB, và dùng rất ít CPU (thời gian mà CPU phải thực thi lệnh xử lý chỉ là 12 phút trong tổng thời gian 5 giờ dịch vụ này chạy):
Với kết quả này, có cần phải “oxy hóa” toàn bộ phần mềm không? Mình nghĩ là không, vì các thành phần kia (Collector, ControlView) không có nhiều áp lực và Python chạy vẫn rất ổn.
Trong thời đại công nghệ số, mobile app đóng vai trò ngày càng quan trọng khi giải quyết được nhiều vấn đề của người dùng. Để đáp ứng nhu cầu ngày càng cao của người dùng, các nhà phát triển ứng dụng di động phải tìm ra giải pháp tối ưu để phát triển ứng dụng trên cả hai nền tảng iOS và Android. React Native là một giải pháp được nhiều người lựa chọn hiện nay. Vậy React Native là gì? Hãy cùng tìm hiểu trong bài viết này.
React Native là gì?
React Native là một framework phát triển ứng dụng di động đa nền tảng (cross-platform) được phát triển bởi Facebook. Nó cho phép bạn xây dựng ứng dụng di động cho cả nền tảng iOS và Android bằng việc sử dụng JavaScript.
React Native sử dụng một ngôn ngữ và mô hình phát triển chung để xây dựng ứng dụng cho cả hai hệ điều hành, điều này giúp giảm bớt công sức và thời gian cần thiết để phát triển và duyệt ứng dụng trên nhiều nền tảng. Điều này có nghĩa rằng bạn có thể chia sẻ nhiều mã nguồn giữa ứng dụng iOS và Android, đồng thời vẫn có khả năng tùy chỉnh và điều chỉnh từng phiên bản ứng dụng cho từng nền tảng một.
Ưu và nhược điểm của React là gì?
Dưới đây là một số ưu điểm và nhược điểm của React:
Ưu điểm của React
Tiết kiệm thời gian và công sức: React Native cho phép các nhà phát triển viết mã một lần và chạy ứng dụng trên cả hai hệ điều hành, giúp tiết kiệm thời gian và công sức đáng kể.
Hiệu suất cao: React sử dụng cơ chế virtual DOM để cải thiện hiệu suất ứng dụng. Thay vì cập nhật toàn bộ DOM mỗi khi có sự thay đổi, React chỉ cập nhật các phần tử cần thiết, giúp giảm tải cho trình duyệt và làm cho ứng dụng chạy nhanh hơn.
Học dễ dàng: React sử dụng JSX (JavaScript XML) để định nghĩa giao diện người dùng, và nó có cú pháp rất giống với HTML. Điều này làm cho việc học React tương đối dễ dàng cho những người đã có kinh nghiệm về HTML và JavaScript.
Cộng đồng phát triển lớn: React Native có một cộng đồng phát triển lớn và tích cực, giúp các nhà phát triển dễ dàng tìm kiếm sự hỗ trợ và chia sẻ kiến thức.
Nhược điểm của React Native
Hỗ trợ nền tảng hạn chế: React chỉ hỗ trợ hai nền tảng phổ biến nhất là iOS và Android thông qua React Native. Điều này có nghĩa rằng nếu bạn muốn phát triển ứng dụng cho các nền tảng khác bạn sẽ phải tìm kiếm các giải pháp khác.
Hiệu suất không bằng ứng dụng native thuần: Mặc dù React Native đã cải thiện hiệu suất so với việc sử dụng các framework cross-platform truyền thống, nhưng ứng dụng viết bằng ngôn ngữ và công nghệ native thường có hiệu suất tốt hơn.
Phí sử dụng một số thư viện: Một số thư viện và công cụ bổ sung có thể yêu cầu trả phí để sử dụng hoặc để trải nghiệm các tính năng nâng cao. Điều này có thể tạo thêm chi phí cho việc phát triển ứng dụng React Native.
Tùy biến module hạn chế: Một số module hoặc thành phần có khả năng tùy biến thấp hoặc không thực sự tốt. Điều này có thể đặt ra thách thức đối với việc tạo ra các tính năng đặc biệt hoặc giao diện người dùng phức tạp mà cần sự tùy chỉnh chi tiết.
Việc học React Native mang lại nhiều lợi ích quan trọng, đặc biệt đối với những người quan tâm đến lĩnh vực lập trình và phát triển ứng dụng di động. Dưới đây, chúng ta sẽ xem xét các lý do tại sao nên đầu tư thời gian và nỗ lực vào việc học React Native.
Khả năng tái sử dụng mã: React Native cho phép bạn tận dụng mã nguồn giữa các nền tảng iOS và Android. Điều này có nghĩa là bạn có thể viết mã một lần và sử dụng lại nó cho cả hai hệ điều hành chính. Không cần phải viết mã độc lập cho từng nền tảng, giúp tiết kiệm thời gian và nguồn lực đáng kể.
Tập trung vào giao diện người dùng: React Native đặc biệt mạnh về giao diện người dùng (UI). Với việc sử dụng các thành phần giao diện nguyên bản (native), ứng dụng được tạo ra với trải nghiệm người dùng tốt và hiệu suất cao hơn. Điều này làm cho React Native trở thành một lựa chọn lý tưởng cho những ứng dụng đòi hỏi giao diện thân thiện và tương tác tốt với người dùng.
Học React Native cực nhanh nếu bạn đã biết JavaScript: React Native sử dụng JavaScript làm ngôn ngữ chính, nên bạn có thể sử dụng kiến thức hiện có để bắt đầu phát triển ứng dụng di động một cách nhanh chóng. Điều này đặc biệt hữu ích cho các lập trình viên đã quen thuộc với JavaScript.
Cộng đồng người dùng lớn mạnh: Nếu bạn gặp khó khăn hoặc cần giải pháp cho vấn đề cụ thể, bạn có thể dễ dàng tìm kiếm sự giúp đỡ từ cộng đồng React Native. Các diễn đàn trực tuyến, nhóm hỗ trợ, và tài liệu hướng dẫn là nguồn thông tin quý báu cho sự phát triển của bạn.
React Native là một framework phát triển ứng dụng di động đa nền tảng được sử dụng bởi một số công ty và doanh nghiệp lớn nhất thế giới, bao gồm Facebook, Instagram, Airbnb và Uber. Điều này dẫn đến một nhu cầu lớn về các nhà phát triển React Native có tay nghề cao.
Theo báo cáo thị trường IT Việt Nam 2023 do TopDev phát hành, lập trình viên React Native 3 – 4 năm kinh nghiệm có mức lương lên đến $1.512. Mức lương này có thể cao hơn tùy thuộc vào trình độ kinh nghiệm và kỹ năng của nhà phát triển.
React Native cũng là một công nghệ có nhu cầu cao trên toàn thế giới. Theo một nghiên cứu gần đây của Stack Overflow, React Native là một trong những framework phát triển ứng dụng di động phổ biến nhất. Điều này có nghĩa là các nhà phát triển React Native có nhiều cơ hội việc làm ở cả trong và ngoài nước.
Tóm lại
React Native là một framework phát triển ứng dụng di động đa nền tảng hiệu quả và linh hoạt. Với những ưu điểm vượt trội, React Native đang trở thành một lựa chọn hàng đầu cho các nhà phát triển ứng dụng di động.
Trên đây là bài viết về React Native, hy vọng bài viết đã cung cấp cho bạn những thông tin hữu ích. Nếu bạn quan tâm đến React Native, hãy bắt đầu học ngay hôm nay để nắm bắt cơ hội nghề nghiệp hấp dẫn trong lĩnh vực công nghệ thông tin.
The first and most simple command is to list out all the current connections. Simply run the netstat command with the a option.
$ netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 00 enlightened:domain *:* LISTEN
tcp 00 localhost:ipp *:* LISTEN
tcp 00 enlightened.local:54750 li240-5.members.li:http ESTABLISHED
tcp 00 enlightened.local:49980 del01s07-in-f14.1:https ESTABLISHED
tcp6 00 ip6-localhost:ipp [::]:* LISTEN
udp 00 enlightened:domain *:*
udp 00*:bootpc *:*
udp 00 enlightened.local:ntp *:*
udp 00 localhost:ntp *:*
udp 00*:ntp *:*
udp 00*:58570*:*
udp 00*:mdns *:*
udp 00*:49459*:*
udp6 00 fe80::216:36ff:fef8:ntp [::]:*
udp6 00 ip6-localhost:ntp [::]:*
udp6 00[::]:ntp [::]:*
udp6 00[::]:mdns [::]:*
udp6 00[::]:63811[::]:*
udp6 00[::]:54952[::]:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2[ ACC ] STREAM LISTENING 12403 @/tmp/dbus-IDgfj3UGXX
unix 2[ ACC ] STREAM LISTENING 40202 @/dbus-vfs-daemon/socket-6nUC6CCx
The above command shows all connections from different protocols like tcp, udp and unix sockets. However this is not quite useful. Administrators often want to pick out specific connections based on protocols or port numbers for example.
2. List only TCP or UDP connections
To list out only tcp connections use the t options.
$ netstat -at
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 00 enlightened:domain *:* LISTEN
tcp 00 localhost:ipp *:* LISTEN
tcp 00 enlightened.local:36310 del01s07-in-f24.1:https ESTABLISHED
tcp 00 enlightened.local:45038 a96-17-181-10.depl:http ESTABLISHED
tcp 00 enlightened.local:37892 ABTS-North-Static-:http ESTABLISHED
.....
Similarly to list out only udp connections use the u option.
$ netstat -au
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 00*:34660*:*
udp 00 enlightened:domain *:*
udp 00*:bootpc *:*
udp 00 enlightened.local:ntp *:*
udp 00 localhost:ntp *:*
udp 00*:ntp *:*
udp6 00 fe80::216:36ff:fef8:ntp [::]:*
udp6 00 ip6-localhost:ntp [::]:*
udp6 00[::]:ntp [::]:*
The above output shows both ipv4 and ipv6 connections.
By default, the netstat command tries to find out the hostname of each ip address in the connection by doing a reverse dns lookup. This slows down the output. If you do not need to know the host name and just the ip address is sufficient then suppress the hostname lookup with the n option.
$ netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 00127.0.1.1:530.0.0.0:* LISTEN
tcp 00127.0.0.1:6310.0.0.0:* LISTEN
tcp 00192.168.1.2:49058173.255.230.5:80 ESTABLISHED
tcp 00192.168.1.2:33324173.194.36.117:443 ESTABLISHED
tcp6 00 ::1:631 :::* LISTEN
The above command shows ALL TCP connections with NO dns resolution. Got it ? Good.
4. List out only listening connections
Any network daemon/service keeps an open port to listen for incoming connections. These too are like socket connections and are listed out by netstat. To view only listening ports use the l options.
$ netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 00127.0.1.1:530.0.0.0:* LISTEN
tcp 00127.0.0.1:6310.0.0.0:* LISTEN
tcp6 00 ::1:631 :::* LISTEN
Now we can see only listening tcp ports/connections. If you want to see all listening ports, remove the t option. If you want to see only listening udp ports use the u option instead of t.
Make sure to remove the ‘a’ option, otherwise all connections would get listed and not just the listening connections.
5. Get process name/pid and user id
When viewing the open/listening ports and connections, its often useful to know the process name/pid which has opened that port or connection. For example the Apache httpd server opens port 80. So if you want to check whether any http server is running or not, or which http server is running, apache or nginx, then track down the process name.
The process details are made available by the ‘p’ option.
~$ sudo netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 00127.0.1.1:530.0.0.0:* LISTEN 1144/dnsmasq
tcp 00127.0.0.1:6310.0.0.0:* LISTEN 661/cupsd
tcp6 00 ::1:631 :::* LISTEN 661/cupsd
When using the p option, netstat must be run with root privileges, otherwise it cannot detect the pids of processes running with root privileges and most services like http and ftp often run with root privileges.
Along with process name/pid its even more useful to get the username/uid owning that particular process. Use the e option along with the p option to get the username too.
$ sudo netstat -ltpe
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 00 enlightened:domain *:* LISTEN root 110901144/dnsmasq
tcp 00 localhost:ipp *:* LISTEN root 9755661/cupsd
tcp6 00 ip6-localhost:ipp [::]:* LISTEN root 9754661/cupsd
The above example lists out Listening connections of Tcp type with Process information and Extended information.
The extended information contains the username and inode of the process. This is a useful command for network administrators.
Note – If you use the n option with the e option, the uid would be listed and not the username.
6. Print statistics
The netstat command can also print out network statistics like total number of packets received and transmitted by protocol type and so on.
To list out statistics of all packet types
$ netstat -s
Ip:32797 total packets received
0 forwarded
0 incoming packets discarded
32795 incoming packets delivered
29115 requests sent out
60 outgoing packets dropped
Icmp:125 ICMP messages received
0 input ICMP message failed.
ICMP input histogram:
destination unreachable: 125125 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
destination unreachable: 125
... OUTPUT TRUNCATED ...
To print out statistics of only select protocols like TCP or UDP use the corresponding options like t and u along with the s option. Simple!
7. Display kernel routing information
The kernel routing information can be printed with the r option. It is the same output as given by the route command. We also use the n option to disable the hostname lookup.
$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0192.168.1.10.0.0.0 UG 000 eth0
192.168.1.00.0.0.0255.255.255.0 U 000 eth0
8. Print network interfaces
The netstat command can also print out the information about the network interfaces. The i option does the task.
$ netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 150003161100027503000 BMRU
lo 65536029130002913000 LRU
The above output contains information in a very raw format. To get a more human friendly version of the output use the e option along with i.
The above output is similar to the output shown by the ifconfig command.
9. Get netstat output continuously
Netstat can output connection information continuously with the c option.
$ netstat -ct
The above command will output tcp connections continuously.
10. Display multicast group information
The g option will display the multicast group information for IPv4 and IPv6 protocols.
$ netstat -g
More examples of netstat command
Okay, we covered the basic examples of netstat command above. Now its time to do some geek stuff with style.
Print active connections
Active socket connections are in “ESTABLISHED” state. So to get all current active connections use netstat with grep as follows
$ netstat -atnp | grep ESTA
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 00192.168.1.2:49156173.255.230.5:80 ESTABLISHED 1691/chrome
tcp 00192.168.1.2:33[gistpen id="1371"]324173.194.36.117:443 ESTABLISHED 1691/chrome
To watch a continous list of active connections, use the watch command along with netstat and grep
$ watch -d -n0 "netstat -atnp | grep ESTA"
Check if a service is running
If you want to check if a server like http,smtp or ntp is running or not, use grep again.
So we found that ntp server is running. Grep for http or smtp or whatever you are looking for.
Well, that was most of what netstat is used for. If you are looking for more advanced information or want to dig deeper, read up the netstat manual (man netstat).
And do leave your feedback and suggestions in the comments box below.
So sánh command line system
Các lệnh sử dụng Vim trên system
Rsync
rsync -a ~/dir1 username@remote_host:destination_directory
Bài viết được sự cho phép của tác giả Lê Nhật Thanh
Trải qua hơn 12 năm học hành, sau đó là 4 năm năm học đại học với bao nhiêu hoài bão, ước mơ và những dự định sẽ làm trong tương lai. Và rồi bạn cũng kết thúc thời gian ngồi trên giảng đường đại học và bắt đầu tìm kiếm cho mình một công việc ổn định. Bạn có bao giờ lo lắng mình sẽ thất nghiệp hay không?
Trên thực tế, có rất nhiều sinh viên IT ra trường vẫn thất nghiệp (hoặc làm trái ngành). Mặc dù nhu cầu việc làm ngành IT là cực kì cao trong những năm tới (bạn có thể xem báo cáo thị trường IT Việt Nam 2023 trên TopDev – hoặc hình bên dưới). Bạn có biết lý do tại sao không?
Trong bài viết này, mình sẽ phân tính và đưa ra những lời khuyên. Để cho cánh cửa “thất nghiệp” không bao giờ tìm đến với bạn.
#1 CƠ HỘI NGHỀ NGHIỆP TĂNG MẠNH
Phần đầu tiên, chúng ta sẽ đi tìm hiểu về nhu cầu nguồn nhân lực ngành IT trong hiện tại và tương lai gần. Let’s start!
Chúng ta thực sự đang ở trong nền công nghiệp 4.0. Nơi mà ngành IT sẽ lên ngôi với hàng ngàn cơ hội nghề nghiệp cực kì hấp dẫn. Cho nên, đối với các bạn sinh viên mới ra trường, bạn sẽ không bao giờ lo lắng về vấn đề “thất nghiệp” như các ngành khác. Các công ty phần mềm luôn luôn thiếu hụt nhân sự. Luôn muốn tìm được những ứng viên phù hợp với nhiều vị trí khác nhau.
Bạn hãy nhìn vào biểu đồ sau để hiểu rõ hơn về tình hình nghề nghiệp IT hiện nay.
Hiện tại khi mình thực hiện bài viết này, là vào thời điểm năm 2023. Và trong năm nay, nguồn nhân lực cần thiết cho ngành IT lên đến 550,000 nhân sự. Và đang thiếu hụt tới 150,000 nhân sự. Đây là một con số rất lớn, nó phản ánh thực tại của thị trường IT ở Việt Nam.
Bạn hãy nhìn vào năm 2025, số lượng nhân sự cần thiết là 700,000 người. Và số lượng thiếu hụt tăng lên tới 200,000 người.
Bạn có thể đoán ra rằng trong tương lai, nhân sự IT sẽ càng bị thiếu hụt nặng nề.
Vậy chúng ta có thể kết luận, cơ hội nghề nghiệp IT là cực kì lớn trong tương lại. Vì vậy, bạn không cần phải lo lắng quá nhiều. Không phải sợ thất nghiệp khi ra trường. Nhưng…
Bạn có thể tham khảo nhiều bài viết, số liệu trên internet. Hoặc đơn giản, bạn hãy nhìn xung quan bạn, hay thậm chí là chính bản thân bạn. Rất dễ dàng nhìn thấy một sự thật rằng. Sinh viên ra trường thất nghiệp rất nhiều, sinh viên IT cũng không ngoại lệ.
Tại sao lại có chuyện như vậy? Có phải vì lý do sinh viên mới ra trường chưa có kinh nghiệm như nhiều người hay nói?
Thực tế, có rất nhiều công ty tuyển vị trí fresher (sinh viên mới ra trường chưa có kinh nghiệm), nên việc đòi hỏi kinh nghiệm ở đây là chưa toàn toàn đúng. Nguyên nhân chính ở đây, sinh viên mới ra trường, không đáp ứng được nhu cầu tối thiểu mà nhà tuyển dụng cần.
Vậy nhu cầu tối thiểu ở đây là gì? Background IT ổn, khả năng học hỏi, tự học tốt và đặc biệt là chịu khó (thái độ). Bạn hãy tự hỏi bản thân mình một câu hỏi quan trong. Khi mình ra trường, mình có đáp ứng những điều này cho nhà tuyển dụng hay không? Hay bạn có thể cho nhà tuyển dụng thấy, bạn là một người có khả năng đào tạo được không?
Phải nói rằng, thái độ và khả năng học hỏi tốt là hai yếu tố quan trọng nhất đối với sinh viên mới ra trường (background IT cũng cực kì quan trọng). Thông thường, khi bắt đầu đi làm, bạn sẽ đi thực tập tại một công ty nào đó hoặc làm fresher. Lúc này thì công ty sẽ đào tạo cho bạn trong vòng 1, 2 hay 6 tháng (tùy thuộc vào mỗi công ty). Và với khoảng thời gian ít ỏi này, bạn được học hỏi rất nhiều thứ. Từ kiến thức kĩ thuật cho tới phong cách làm việc,… Và đặc biệt, bạn phải chứng minh được năng lực thực sự của mình để biết chắc chắn một điều rằng. Sau một khoảng thời gian vài tháng, bạn có thể làm được việc (hoàn thành task được giao).
Nhà tuyển dụng họ chỉ tuyển những ứng viên có khả năng làm việc, tạo doanh thu. Hoặc ít nhất là có khả năng làm việc được sau vài tháng đào tạo (đối với sinh viên mới ra trường).
Bởi vì nhiều sinh viên IT khi ra trường, họ không thể đáp ứng được các nhu cầu này nên “thất nghiệp” vẫn luôn đeo bám họ. Vì IT là một ngành thiên về kĩ thuật, nên kiến thức kĩ thuật nền tảng là điều vô cùng quan trọng.
#3 TẠI SAO CÁC BẠN LẠI KHÔNG ĐÁP ỨNG ĐƯỢC YÊU CẦU CỦA NHÀ TUYỂN DỤNG
Ở 2 phần trên, bạn đã biết về nhu cầu nguồn nhân lực IT ở Việt Nam là rất lớn. Cũng như biết được những yêu cầu tối thiểu của nhà tuyển dụng đối với một fresher. Chúng ta sẽ bắt đầu một phần quan trọng – tìm hiểu nguyên nhân vì sao bạn không thể đáp ứng các nhu cầu tối thiểu này.
Trước tiên hay trả lời mình một câu hỏi. Suy cho cùng, bạn có biết lý do theo IT là gì không?
Hãy dừng đọc bài viết này một chút và trả lời câu hỏi trên.
Bạn hãy liệt kê ra những lý do chính khiến bạn bước chân vào con đường IT. Bạn vì tiền, vì bạn bè rủ rê, vì IT là ngành hot, vì cha mẹ bắt bạn. Hay vì một lý do nào khác?
Riêng đối với mình, mình đến với IT vì 2 chữ “đam mê”. Mình đam mê mãnh liệt với những dòng code. Hay nói một cách khác, mình rất yêu thích việc viết code, tạo ra sản phẩm, và chia sẻ nó với mọi người. Hãy suy nghĩ về điều đó!
Bạn cũng biết rằng, khi mình thích, mình đam mê một việc gì đó. Thì mình làm việc đó tốt hơn và dần dần bạn sẽ cũng cố được đam mê của mình và lại làm nó tốt hơn nữa.
Khi bạn đọc đến đây, nếu bạn đang trong thời khắc thất nghiệp, bạn đã biết lý do là gì chưa? Còn nếu bạn đã đã ổn định trong ngành IT, thì hãy chia sẻ và giải thích điều này đến những bạn sắp, đang, đã theo học ngành IT. Vì cho đi là nhận lại mà.
Vì IT là một ngành khắc nghiệt và đào thải rất cao. Các công nghệ thì mọc lên như nấm trong thời gian rất ngắn. Nếu một ngày bạn không học hỏi nữa, thì là lúc bạn đang đi lùi với những người khác. Ngay bây giờ, bạn hãy tự hỏi bản thân mình xem bạn có hợp với ngành IT không? Và bạn có thực sự muốn theo ngành này tới cùng, kiếm miếng cơm manh áo với nó không?
Dù có hay không, bạn cũng phải hành động ngay từ bây giờ. Tìm kiếm đam mê thật sự cho cuộc đời mình.
Đam mê thật sự rất rất khó để tìm kiếm, nhưng các bạn là những người còn trẻ, cứ tự tin, hành động. Tự tin bước vào nghề nếu bạn cảm thấy thích thích cái gì đó trong ngành này. Rồi biết đâu một ngày nào đó bạn tìm kiếm được đam mê của mình.
Và một điều đặc biệt nữa, làm việc với đam mê không phải lúc nào cũng vui vẻ dễ chịu. Đôi khi bạn phải trả giá bằng xương máu và nước mắt. Stress, áp lực, khó khăn sẽ luôn đến với bạn. Nhưng hãy kiên trì và theo cho tới cùng. Hãy nghĩ tới những thành quả sau này mà mình sẽ đạt được.
Và một lời khuyên chân thành của mình, nếu bạn đang có ý định bước vào nghề. Hãy chuyên tâm học hành ngay trên giảng đường đại học. Những kiến thức nền tảng ở đại học sẽ là bước đệm rất tốt cho bạn trong con đường ở tương lai.
# KẾT
Bài viết này mình đã trình bày cho bạn 3 phần. Là nhu cầu nguồn nhân lực IT Việt Nam hiện tại và tương lai gần. Nhà tuyển dụng cần gì ở bạn và đặc biết, tại sao bạn không đáp ứng được các yêu cầu tối thiểu của nhà tuyển dụng.
Bài viết tuy không dài nhưng cũng đủ để gửi gắm đến các bạn những thông điêp của mình – một người từng chịu đấm ăn xôi trong ngành này. Hi vọng với những thông điệp trên, sẽ giúp các bạn một phần nào đó trong sự nghiệp IT của mình. Giúp cho bạn hiểu được chính bản thân mình có thích hợp với ngành này không.
Nếu bạn muốn trở thành một lập trình viên chuyên nghiệp, bạn cần có kiến thức và kỹ năng vững vàng về lập trình. Tuy nhiên, học lập trình không phải là điều dễ dàng, đặc biệt là đối với những người mới bắt đầu.
Hiện nay, có rất nhiều ứng dụng học lập trình trên thị trường, cung cấp các khóa học về các ngôn ngữ lập trình phổ biến. Những ứng dụng này giúp bạn học lập trình một cách dễ dàng, hiệu quả và tiết kiệm thời gian. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về 9 app học lập trình tốt nhất cho các developer nhé!
Tiêu chí lựa chọn app học lập trình chất lượng
Khi lựa chọn app học lập trình, bạn cần lưu ý các tiêu chí sau:
Giao diện: Ứng dụng có giao diện thân thiện, dễ sử dụng, sẽ giúp bạn học tập hiệu quả hơn. Giao diện ứng dụng cần được thiết kế khoa học, dễ nhìn, dễ điều hướng. Các bài học cần được trình bày rõ ràng, dễ hiểu.
Nội dung: Ứng dụng cung cấp các bài học chất lượng, phù hợp với nhu cầu và trình độ của bạn. Nội dung bài học cần đầy đủ, chính xác, cập nhật. Các bài học cần được thiết kế phù hợp với trình độ của người học, từ cơ bản đến nâng cao.
Các tính năng: Ứng dụng có các tính năng hỗ trợ học tập hiệu quả, như theo dõi tiến trình học tập, các bài tập thực hành,… Các tính năng này sẽ giúp bạn theo dõi được quá trình học tập của mình, cũng như rèn luyện kỹ năng lập trình một cách hiệu quả.
Giá cả: Ứng dụng có giá cả hợp lý, phù hợp với túi tiền của bạn. Một số ứng dụng học lập trình cung cấp miễn phí một số khóa học cơ bản, nhưng nếu bạn muốn học các khóa học nâng cao, bạn sẽ phải trả phí.
Dựa trên các tiêu chí trên, bạn có thể lựa chọn được ứng dụng học lập trình phù hợp với nhu cầu và trình độ của mình.
Tham khảo 9 app học lập trình tốt nhất hiện nay
Hiện nay, có rất nhiều ứng dụng học lập trình trên thị trường, cung cấp các khóa học về các ngôn ngữ lập trình phổ biến. Dưới đây là một số app học lập trình tốt nhất hiện nay:
1. SoloLearn
SoloLearn là một ứng dụng học lập trình miễn phí, cung cấp các khóa học về các ngôn ngữ lập trình phổ biến như Java, Python, JavaScript, C++, HTML, CSS,… Ứng dụng có giao diện thân thiện, dễ sử dụng, với các bài học ngắn gọn, dễ hiểu. Ngoài ra, SoloLearn còn có một cộng đồng người dùng lớn, nơi bạn có thể trao đổi, chia sẻ kiến thức với nhau.
SoloLearn phù hợp với mọi đối tượng, từ người mới bắt đầu đến những người có kinh nghiệm lập trình. Tuy nhiên, ứng dụng này đặc biệt phù hợp với những người mới bắt đầu, bởi các bài học được thiết kế ngắn gọn, dễ hiểu, giúp người học dễ dàng tiếp thu kiến thức.
Encode là một app học lập trình miễn phí, tập trung vào việc giúp người học học lập trình bằng cách giải các câu đố. Ứng dụng có các câu đố về các khái niệm lập trình cơ bản, phù hợp với người mới bắt đầu. Encode còn có các tính năng như theo dõi tiến trình học tập, các bài tập thực hành,…
Ngoài ra, Encode còn có thể sử dụng ngoại tuyến giúp bạn có thể học bất kỳ đâu mà không cần phải phụ thuộc vào internet. Một nhược điểm của Encode là ứng dụng chủ yếu cung cấp các câu đố, không có các khóa học bài bản về các ngôn ngữ lập trình cụ thể hoặc các kỹ năng lập trình nâng cao.
3. Mino
Mimo là một ứng dụng học lập trình miễn phí, cung cấp các khóa học về các ngôn ngữ lập trình phổ biến như JavaScript, Ruby, Swift, C, C++,… Ứng dụng có giao diện thân thiện, dễ sử dụng, với các trò chơi và thử thách để giúp người học ghi nhớ kiến thức. Người dùng có thể rèn luyện kỹ năng code hoặc tạo ra các trò chơi đơn giản, thậm chí trở thành hacker nếu muốn.
Programming Hub là một app học lập trình miễn phí và trả phí, hỗ trợ hơn 20 ngôn ngữ lập trình khác nhau. Ứng dụng này được phát triển bởi các chuyên gia của Google nên nội dung rất chất lượng và có nhiều giải pháp sáng tạo thú vị. Bạn có thể học các khóa học về tiếp thị kỹ thuật số, phát triển ứng dụng, AI, giám đốc điều hành,… trên app này.
5. Enki
Điểm nổi bật nhất của Enki là giao diện hiện đại, mang đến trải nghiệm học tập tuyệt vời. Bạn có thể học các ngôn ngữ phổ biến như Java, CSS, HTML, Python,… trên ứng dụng này. Ngoài ra, Enki còn cho phép người dùng tự tạo lộ trình học tập và đặt mục tiêu cho bản thân trong quá trình học.
6. Programming Hero
Programming Hero là một ứng dụng học lập trình miễn phí dành riêng cho hệ điều hành Android. Bạn có thể luyện tập code CSS, JavaScript, HTML hay Dom trên ứng dụng này. Với những đoạn code thú vị bạn có thể tạo ra những trò chơi đơn giản từ Programming Hero. Ngoài ra, bạn cũng có thể trò chuyện, trao đổi kiến thức với những người yêu code thông qua ứng dụng này.
7. Tynker
Tynker là một app học lập trình miễn phí, dành cho trẻ em từ 6 tuổi trở lên. Ứng dụng sử dụng ngôn ngữ lập trình trực quan, giúp trẻ em dễ dàng học lập trình bằng cách xây dựng các trò chơi và ứng dụng. Mỗi bài học của Tynker sẽ cung cấp cho bạn các hướng dẫn để xây dựng một trò chơi hoặc ứng dụng. Bạn có thể sử dụng các khối lệnh để xây dựng trò chơi hoặc ứng dụng của mình.
8. Codecademy Go
Ứng dụng Codecademy Go là một ứng dụng di động được phát triển bởi Codecademy, một nền tảng học trực tuyến chuyên về lập trình và khoa học máy tính. Codecademy Go cung cấp các khóa học di động giúp người dùng học lập trình và các kỹ năng liên quan một cách linh hoạt, thuận tiện.
Ứng dụng này cung cấp nhiều khóa học trực tuyến với các bài học ngắn gọn, bài tập thực hành và kiểm tra kiến thức ngay trên điện thoại di động. Người dùng có thể học các ngôn ngữ lập trình như Python, JavaScript, HTML/CSS, Java và nhiều chủ đề khác.
9. Grasshopper
Grasshopper là một ứng dụng miễn phí trên iOS và Android giúp bạn luyện tập code thông qua những câu đố JavaScript. Nó được thiết kế để làm quen với cú pháp lập trình cơ bản và giúp người dùng hiểu rõ hơn về cách xây dựng các đoạn mã.
Tóm lại
Trong bài viết này, chúng ta đã tìm hiểu về 9 app học lập trình tốt nhất cho các developer. Mỗi ứng dụng đều có những ưu điểm và nhược điểm riêng, phù hợp với nhu cầu và trình độ của từng người học.
Để lựa chọn được ứng dụng học lập trình phù hợp, bạn cần xác định rõ mục tiêu học tập của mình là gì. Nếu bạn là người mới bắt đầu, bạn nên chọn những ứng dụng cung cấp các khóa học cơ bản, dễ hiểu. Nếu bạn đã có kiến thức cơ bản, bạn có thể chọn những ứng dụng cung cấp các khóa học nâng cao, chuyên sâu.
Dù lựa chọn app học lập trình nào, bạn cũng cần có sự kiên trì và quyết tâm để học tập. Hãy bắt đầu từ những kiến thức cơ bản và dần dần nâng cao trình độ của mình. Chúc bạn thành công!
Với sự tăng trưởng của các công ty công nghệ hiện nay, nhu cầu tuyển dụng lập trình viên đang là rất cao. Trong đó lập trình viên Frontend luôn là vị trí có số lượng yêu cầu cao hơn do đặc thù của dự án cùng với sự phát triển của ứng dụng Web. Để có thể chuẩn bị thật tốt và thể hiện đúng kỳ vọng của nhà tuyển dụng, hôm nay mình cùng chia sẻ với các bạn một vài kinh nghiệm cho buổi phỏng vấn lập trình viên Frontend nhé.
Chuẩn bị trước buổi phỏng vấn
Trước hết để có được sự tự tin khi tham gia phỏng vấn, bạn cần chuẩn bị đầy đủ từ trang phục, tác phong, chú ý giờ giấc,… để có thể tạo ấn tượng tốt với nhà tuyển dụng. Nắm chắc được quy trình phỏng vấn thông qua nội dung mà phía HR đã thông báo.
Nhiều công ty, doanh nghiệp có những quy trình phỏng vấn nhiều vòng, có thể có thêm những bài test chuyên môn,… vì thế bạn cần biết sẽ phải trải qua những vòng nào một cách cụ thể để chuẩn bị. Hãy đọc kỹ mô tả công việc vị trí ứng tuyển, đây là việc vô cùng quan trọng giúp bạn hiểu rõ yêu cầu và trách nhiệm của công việc đó; từ đó bạn sẽ có thể lên kế hoạch cho buổi phỏng vấn của mình.
Bạn cũng cần phải tìm hiểu về công ty ứng tuyển, điều này không chỉ giúp các bạn tạo được ấn tượng tốt với nhà tuyển dụng mà đồng thời cũng có thể biết được về lĩnh vực, chuyên môn hay các dự án mà doanh nghiệp, tổ chức đang phát triển để từ đó phản hồi lại trong buổi phỏng vấn. Bạn sẽ thường gặp những câu hỏi về công ty như bạn biết công ty qua kênh nào, bạn biết gì về công ty và sản phẩm mà công ty đang phát triển, tại sao bạn lựa chọn công ty để ứng tuyển,…
Ngoài ra, hãy suy nghĩ và chuẩn bị trước về những câu hỏi mà nhà tuyển dụng sẽ hỏi bạn, nhất là về mức lương mong muốn. Xem xét những yếu tố về mức lương trung bình của thị trường, từ đó đối chiếu với bản thân theo kỹ năng chuyên môn, kinh nghiệm làm việc; bạn sẽ đưa ra được mức mà bạn hy vọng nhà tuyển dụng sẽ chấp nhận bạn.
Một buổi phỏng vấn vị trí lập trình viên Frontend, nhà tuyển dụng sẽ hỏi những kiến thức chuyên môn về vị trí mà bạn đang ứng tuyển. Tùy vào level (Fresher, Junior, Senior) mà sẽ có những phần câu hỏi tương ứng, thông thường sẽ bao gồm 3 phần:
1. Kiến thức cơ bản về Frontend: sẽ bao gồm HTML, CSS và JavaScript
HTML là một ngôn ngữ đánh dấu siêu văn bản được thiết kế ra để tạo và cấu trúc các thành phần trong trang Web hoặc ứng dụng. CSS là ngôn ngữ sử dụng cho việc tìm và định dạng lại các phần tử được tạo ra bởi HTML. CSS giúp chúng ta đổi bố cục, màu sắc trang, đổi màu chữ, font chữ hay các hiệu ứng trên trang Web.
JavaScript là ngôn ngữ lập trình được phát triển để tạo ra các tương tác trên trang Web bằng việc xử lý nạp, hiển thị dữ liệu thông qua việc gọi yêu cầu đến server; nhận và xử lý các hành động đến từ người dùng và trả ra các kết quả tương ứng.
HTML, CSS và JavaScript là 3 nền tảng cơ bản mà mọi lập trình viên Frontend đều nắm vững, cũng vì thế mà nhà tuyển dụng sẽ có thể hỏi bạn bất cứ câu hỏi nào liên quan đến 3 ngôn ngữ này. Kinh nghiệm ở đây dành cho bạn là hãy lướt qua một lượt các kiến thức cơ bản về 3 ngôn ngữ này vì có nhiều thứ tưởng chừng dễ nhưng nếu bạn không thường xuyên làm, thực hành sẽ khiến bạn có thể quên mất.
2. Kiến thức về nền tảng thư viện, Framework theo vị trí tuyển dụng như React, VueJS, Angular,…
Trong mô tả công việc tất nhiên sẽ ghi rõ yêu cầu bạn cần có kiến thức hay kinh nghiệm trong một nền tảng thư viện, framework mà nhà tuyển dụng yêu cầu. Đây là những bộ công cụ chứa cả phần HTML, CSS và source code viết bằng JavaScript được phát triển và sử dụng rộng rãi.
Bạn cần chuẩn bị trước kiến thức về phần này vì nó sẽ là trọng tâm của buổi phỏng vấn chuyên môn, các vấn đề sẽ được bên người hỏi đưa ra và bạn cần trả lời một cách ngắn gọn và vẫn đủ sức thuyết phục nhà tuyển dụng rằng mình nắm bắt được vấn đề. Mỗi một thư viện, framework sẽ có những đặc trưng riêng của mình; các câu hỏi chủ yếu sẽ xoay quanh những vấn đề như sau:
Fundamentals hay core concepts: những nguyên tắc cơ bản, khái niệm cốt lõi của nền tảng
Life Cycle: vòng đời của một phần tử, một function hay một màn hình mà nền tảng đó mô tả và xử lý. Yếu tố này cũng thường đi cùng với việc quản lý các trạng thái dữ liệu trong ứng dụng (state management)
Advanced hay Patterns: những phần kiến thức nâng cao, hay những mẫu thường được khuyến khích sử dụng khi viết code và lập trình liên quan đến nền tảng đó.
3. Kinh nghiệm làm việc trong các dự án đã tham gia
Đây là một yếu tố rất quan trọng có thể quyết định việc nhà tuyển dụng có lựa chọn bạn hay không. Kinh nghiệm làm việc thường sẽ được mô tả trong CV của bạn, bao gồm những dự án mà bạn đã tham gia, công nghệ được sử dụng trong dự án đó cũng như vai trò của bạn trong team phát triển.
Nếu bạn có kinh nghiệm làm việc trong một team dự án có liên quan đến những dự án mà nhà tuyển dụng đang cần, đấy sẽ là điểm cộng rất lớn dành cho bạn. Vì vậy hãy đừng ngần ngại thể hiện nó ra, trình bày một cách rõ ràng về những kiến thức mà bạn học được từ dự án cũ và hiểu biết của bạn về ngành, lĩnh vực đó.
Đối với riêng lập trình viên Frontend, bạn có thể được hỏi về những kinh nghiệm xử lý UI/UX mà bạn tâm đắc; nó giúp nhà tuyển dụng đánh giá được khả năng sáng tạo và mức độ trải nghiệm trên nhiều sản phẩm khác nhau của bạn. Vì vậy hãy chuẩn bị trước một số kiến thức liên quan đến thiết kế; các kỹ thuật xử lý đa màn hình (responsive), hay có thể là những kiến thức liên quan đến SEO, Optimize,…
Sau buổi phỏng vấn
Thông thường các bạn sau khi phỏng vấn xong thì thường nghĩ là đã xong việc và chờ kết quả. Trường hợp bạn đã pass phỏng vấn thì tất nhiên là sẽ nhận được một email offer từ nhà tuyển dụng. Tuy vậy một số công ty hay tổ chức có thể không thông báo kết quả trong trường hợp bạn không đáp ứng được yêu cầu tuyển dụng của họ. Trong những trường hợp nhận được kết quả không pass (fail) phỏng vấn hay không nhận được kết quả sau buổi phỏng vấn thì bạn cũng vẫn nên có một email cảm ơn hồi đáp lại cho công ty.
Một email cảm ơn dành cho việc đội ngũ tuyển dụng, người phỏng vấn đã dành thời gian cho bạn, quan tâm đến bạn sẽ giúp tăng thiện cảm trong mắt công ty đó và biết đâu sau này bạn có cơ hội để apply lại đúng vị trí trên. Hãy lưu ý rằng bạn không qua phỏng vấn có thể đơn thuần là việc bạn chưa phù hợp với đòi hỏi của vị trí công việc hiện tại mà nhà tuyển dụng cần; và bạn hoàn toàn có những cơ hội cho lần phỏng vấn sắp tới.
Kết bài
Trên đây là những kinh nghiệm khi chuẩn bị tham gia phỏng vấn vị trí lập trình viên Frontend mà mình muốn chia sẻ dành cho các bạn. Hy vọng bài viết sẽ giúp ích cho bạn trong buổi phỏng vấn sắp tới, hẹn gặp lại trong các bài viết tiếp theo của mình.
Làm thế nào để trở thành full stack developer? Có lẽ đây là câu hỏi mà mình hay gặp nhất trong năm vừa rồi. Đi qua một lượt các trang tuyển dụng như TopDev, TopCV… Hay mạng xã hội việc làm LinkedIn, bạn sẽ bắt gặp rất nhiều công việc có title là full stack developer.
Nếu nhìn vào title: full stack developer, tức là bạn sẽ biết và làm được tất cả mọi thứ, client tới server, từ front-end tới back-end… Nghe thì có vẻ như họ yêu cầu bạn biết quá nhiều thứ nhỉ?
Tuy nhiên, cũng không hẳn là không thể làm được, nếu được định hướng đúng và quyết tâm thì bạn hoàn toàn có thể trở thành một full stack developer.
Bài viết mình sẽ đề xuất 5 kiến thức mà bạn cần phải biết và làm được để trở thành full stack developer thực thụ.
Nhưng trước hết, chúng ta cùng xem lại full stack developer là gì đã nhé.
#Full stack developer là gì?
Hiểu nôm na, một full stack developer là người có đầy đủ những kỹ năng để tự mình có thể phát triển và hoàn thiện một ứng dụng độc lập.
Với một full stack developer job description, Bạn sẽ cần phải biết và xử lý tất cả các công việc về cơ sở dữ liệu, server, kỹ thuật hệ thống và cả front-end nữa. Tùy thuộc vào dự án mà khách hàng yêu cầu mà stack có thể là mobile stack, web stack hay một native application stack.
#Tại sao người ta lại cần tới full stack developer?
Có rất nhiều lý do để người ta cần tới một full stack developer? Có thể họ cần một người biết tất cả để hiểu tổng quan hệ thống hơn là cần nhiều người mà mỗi người chỉ biết một phần.
Hoặc đơn giản là nhiều công ty họ muốn tinh giảm nhân lực, tiết kiệm chi phí…
Có rất nhiều cuộc tranh luận giữa các nhà tuyển dụng, giữa cả những bạn đang học lập trình nữa. Có ý kiến cho rằng: “một nghề thì sống, đống nghề thì chết”. Ám chỉ rằng cần phải chuyên sâu một kỹ năng, một công nghệ thay vì biết nhiều thứ mà chỉ biết hời hợt.
Tuy nhiên, thực tế người ta đang rất cần một full stack developer. Không những biết nhiều mà cái gì cũng phải giỏi.
Để có cái nhìn khách quan thì mình mạnh dạn liệt kê điểm mạnh và điểm yếu của một full stack developer như sau:
1. Điểm mạnh
Một full stack developer dễ dàng tạo ra một thiết kế nguyên mẫu cho một sản phẩm dựa trên những hiểu biết rộng lớn. Do họ có kiến thức tổng quan của cả hệ thống, nên họ có tư duy và góc nhìn về hệ thống rộng hơn so với những người chỉ biết làm front-end hoặc chỉ back-end.
Ngoài ra, do full stack developer có kiến thức tổng quan về cả hệ thống nên họ có thể dễ dàng ghép nối các bộ phận khác nhau trong dự án. Họ sẽ trở thành cầu nối giữa bộ phận làm back-end, với bộ phận làm front-end và cả bộ phận phần cứng server…
Do đó, các full stack developer sau này có xu hướng trở thành giám đốc kỹ thuật hoặc CEO.
2. Điểm yếu
Chính vì bạn định hướng sẽ phát triển các kỹ năng theo chiều ngang, với tiêu chí biết càng nhiều càng tốt. Nên bạn sẽ rất khó để trở thành một chuyên gia ở một kỹ năng nào đó.
Hầu hết những người tự nhận là full stack developer chỉ một chút, hời hợt các kỹ năng. Với những người như vậy thì phù hợp với vị trí thiết kế hệ thống hơn là vị trí phát triển hệ thống.
#Skill nào giúp bạn trở thành full stack developer web
Chúng ta quay trở lại trả lời câu hỏi quan trọng nhất này: Một full stack developer thực thụ thì ngoài biết nhiều thì còn phải biết sâu nữa. Vậy full stack developer cần học những gì?
Dưới đây là những kỹ năng mà bạn cần phải biết trên con đường trở thành full stack.
1. Ngôn ngữ lập trình
Về phần back-end, bạn sẽ cần phải thành thạo nhiều ngôn ngữ lập trình. Chẳng hạn như Java, PHP, Ruby, C#, Python… Vì hầu hết các nghiệp vụ kinh doanh thường thực hiện ở phía back-end và đều cần phải viết bằng các ngôn ngữ này.
Ngoài việc phải nắm vững cú pháp của ngôn ngữ, bạn còn phải hiểu rõ triết lý, cấu trúc, nguyên tắc thiết kế, thực hiện và kiểm tra dự án trên ngôn ngữ đó.
2. Biết cách sử dụng framework và thư viện bên thứ 3
Do đặc thù hệ thống lớn, người ta sẽ không thể viết ứng dụng từ con số 0. Với bài toán chi phí và thời gian, họ sẽ sử dụng framework và thư viện để tăng tốc độ phát triển phần mềm.
Do vậy, việc một full stack developer phải biết nhiều framework là điều cần thiết. Thường mỗi ngôn ngữ đều có một vài framework phổ biến đi kèm.
Có thể kể tên như: Java thì Spring, PHP có Hibernate, Python có Django, Nodejs có Express…
3. Rành về Front-end
Như đã nói ở trên, front-end là một kỹ năng không thể thiếu của một kỹ sư full stack.
Một sản phẩm, ngoài những tính năng đáp ứng yêu cầu của người dùng, thì trải nghiệm là một phần rất quan trọng nâng tầm sản phẩm.
Front-end chính là phần tương tác trực tiếp với người, là phần tạo ra trải nghiệm người dùng. Do đó, bạn cần phải nắm vững một số công nghệ front-end như HTML, CSS, Javascript… Các front-end framework như Jquery, SASS, ReactJS, Vuejs…
4. Database và kỹ thuật cache
Hầu như phần mềm nào cũng cần tới Database để lưu trữ dữ liệu. Do vậy, bạn cần phải biết sử dụng ít nhất một loại cơ sở dữ liệu. Biết sử dụng ở đây gồm 2 kỹ năng: Kỹ năng sử dụng phần mềm quản trị cơ sở dữ liệu và kỹ năng viết câu lệnh tương tác với cơ sở dữ liệu.
Về quản trị cơ sở dữ liệu, bạn nên biết về MySQL, MS SQLServer, MongoDB…
Còn về câu lệnh tương tác với DB, bạn cần biết về SQL, và NoSQL.
Tất nhiên, khi hệ thống lớn dần thì việc phải cache dữ liệu là điều phải làm nếu không muốn hệ thống bị sập, hoặc tăng chi phí phần cứng theo cấp số nhân.
Có nhiều kỹ thuật cache DB, bạn có thể tìm hiểu về Redis, hoặc memcache.
5. Có khả năng thiết kế
Hầu hết các bài viết về full stack developer đều bỏ qua kỹ năng thiết kế. Nhưng mình nghĩ, đây là một kỹ năng rất quan trọng.
Những kỹ năng về prototype design, UI design, UX design… Chúng sẽ giúp bạn góp phần vào cải thiện trải nghiệm, mở rộng hệ thống sau này.
#Tổng kết
Gladwell đã khẳng định, để trở thành một chuyên gia ở một lĩnh vực, bạn cần tới 10.000 giờ. Do vậy, bạn không thể nào trở thành kỹ sư full stack chỉ trong một đêm được. Mỗi một nhà tuyển dụng full stack developer đều có yêu cầu riêng.
Việc của bạn cần làm lúc nào này liên tục củng cố kiến thức nền tảng, tiếp tục học hỏi và chấp nhận thử thách ở những lĩnh vực khác nhau.
Bạn thấy quan điểm của mình về full stack có đúng không? Hãy để lại ý kiến của bạn bên dưới phần bình luận nhé.
Thế hệ Gen Z (sinh từ năm 1995 đến 2012) đang dần chiếm lĩnh thị trường lao động, đặc biệt là trong lĩnh vực công nghệ. Với tư duy sáng tạo, khả năng thích ứng nhanh chóng và tinh thần trách nhiệm cao, Gen Z được kỳ vọng sẽ là nguồn nhân lực quan trọng cho sự phát triển của các doanh nghiệp.
Tuy nhiên, để quản lý nhân viên IT là Gen Z hiệu quả, các nhà quản lý cần có những hiểu biết và kỹ năng phù hợp. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về những đặc điểm tính cách, thói quen tìm việc để đưa ra các bí quyết quản lý nhân viên IT là Gen Z hiệu quả nhất.
Vì sao nhân sự Gen Z lại quan trọng đến vậy?
Theo số liệu của Tổng cục Thống kê, tại Việt Nam, số lượng Gen Z trong độ tuổi lao động (từ 15 tới 24 tuổi) vào năm 2019 là khoảng 13 triệu người. Tới năm 2025, Gen Z dự kiến sẽ chiếm 1/3 dân số trong độ tuổi lao động tại Việt Nam, và sẽ có ảnh hưởng lớn tới thị trường lao động trong nước.
Dưới đây là một số số liệu cụ thể về nhân sự Gen Z trên thị trường lao động hiện nay:
Tỷ lệ Gen Z tham gia thị trường lao động:Theo một nghiên cứu của Anphabe, tỷ lệ Gen Z tham gia thị trường lao động tại Việt Nam năm 2023 là khoảng 25%.
Ngành nghề mà Gen Z quan tâm:Gen Z có xu hướng quan tâm đến các ngành nghề liên quan đến công nghệ, truyền thông, sáng tạo và giáo dục.
Yêu cầu về môi trường làm việc: Gen Z có xu hướng tìm kiếm môi trường làm việc linh hoạt, có cơ hội phát triển bản thân và được tôn trọng.
Với những số liệu trên, có thể thấy Gen Z đang dần trở thành lực lượng lao động chủ chốt tại Việt Nam. Các doanh nghiệp cần có những hiểu biết và kỹ năng phù hợp để thu hút và phát triển nhân sự Gen Z.
Những thách thức khi quản lý nhân viên IT là Gen Z
Gen Z là thế hệ được biết đến với tư duy sáng tạo, khả năng thích ứng nhanh chóng và tinh thần trách nhiệm cao. Tuy nhiên, Gen Z cũng có những thách thức nhất định trong việc quản lý.
Một số thách thức phổ biến bao gồm:
Tính độc lập cao: Gen Z có tính độc lập cao. Họ không muốn bị kiểm soát chặt chẽ và muốn được tự do thể hiện bản thân. Điều này có thể khiến các nhà quản lý khó khăn trong việc giám sát và hướng dẫn công việc của họ.
Có nhu cầu được giao tiếp cao: Gen Z có nhu cầu được giao tiếp cao. Họ muốn được tham gia vào các cuộc thảo luận và được lắng nghe ý kiến của người khác. Điều này có thể khiến các nhà quản lý cần dành nhiều thời gian để trò chuyện và lắng nghe nhân viên của mình.
Mong muốn được thăng tiến nhanh chóng: Gen Z mong muốn được thăng tiến nhanh chóng. Họ muốn có cơ hội phát triển bản thân và khẳng định giá trị của mình. Điều này có thể khiến các nhà quản lý cần có kế hoạch phát triển nghề nghiệp rõ ràng cho nhân viên của mình.
Bí quyết nào để quản lý nhân viên IT là Gen Z thành công?
Để quản lý nhân viên IT là Gen Z hiệu quả, các nhà quản lý cần có những hiểu biết và kỹ năng phù hợp. Dưới đây là một số bí quyết cụ thể:
1. Tạo môi trường làm việc linh hoạt
Tạo môi trường làm việc linh hoạt là một trong những bí quyết quan trọng để quản lý nhân viên IT là Gen Z hiệu quả. Có nhiều cách để tạo môi trường làm việc linh hoạt cho nhân viên IT là Gen Z. Dưới đây là một số gợi ý:
Cho phép nhân viên làm việc từ xa: Đây là cách đơn giản nhất để tạo môi trường làm việc linh hoạt cho nhân viên. Các nhà quản lý có thể cho phép nhân viên làm việc từ xa một phần hoặc toàn thời gian, tùy theo nhu cầu của họ.
Cho phép nhân viên làm việc theo giờ giấc linh hoạt: Các nhà quản lý có thể cho phép nhân viên linh hoạt về giờ giấc làm việc, miễn là họ hoàn thành công việc đúng deadline và hiệu quả.
Gen Z là thế hệ sinh ra trong thời kỳ bùng nổ của công nghệ và internet, họ thường xuyên phải đối mặt với căng thẳng và áp lực từ công việc. Có nhiều cách để các nhà quản lý ưu tiên sức khỏe tinh thần cho nhân viên IT là Gen Z. Dưới đây là một số gợi ý:
Tạo môi trường làm việc tích cực: Các nhà quản lý cần tạo môi trường làm việc tích cực, nơi nhân viên cảm thấy được tôn trọng và được hỗ trợ.
Cung cấp các chương trình chăm sóc sức khỏe tinh thần:Các nhà quản lý có thể cung cấp các chương trình chăm sóc sức khỏe tinh thần cho nhân viên, chẳng hạn như tư vấn, trị liệu, hoặc các lớp học về quản lý căng thẳng.
3. Tạo cơ hội cho nhân viên phát triển bản thân
Gen Z là thế hệ có nhu cầu được phát triển bản thân cao. Họ muốn học hỏi những điều mới và nâng cao kỹ năng của mình. Dưới đây là một số gợi ý:
Tổ chức các khóa đào tạo và hội thảo:Các nhà quản lý có thể tổ chức các khóa đào tạo và hội thảo để nhân viên có cơ hội học hỏi các kỹ năng mới.
Trao quyền cho nhân viên:Các nhà quản lý cần trao quyền cho nhân viên để họ có thể tự chủ trong công việc của mình. Điều này sẽ giúp nhân viên có cơ hội phát triển các kỹ năng lãnh đạo và quản lý.
4. Ưu tiên các đãi ngộ khác bên cạnh lương
Bên cạnh mức lương thì điều Gen Z quan tâm là các yếu tố như môi trường làm việc, sự cân bằng giữa công việc và cuộc sống, và cơ hội phát triển bản thân. Dưới đây là một số đãi ngộ khác bên cạnh lương mà các nhà quản lý có thể ưu tiên cho nhân viên IT là Gen Z:
Môi trường làm việc linh hoạt và cơ hội phát triển bản thân
Các lợi ích sức khỏe và phúc lợi: Gen Z quan tâm đến sức khỏe và phúc lợi của bản thân. Họ muốn được hưởng các lợi ích như bảo hiểm sức khỏe, bảo hiểm nhân thọ, và các chương trình chăm sóc sức khỏe khác.
Các hoạt động ngoại khóa: Gen Z quan tâm đến các hoạt động ngoại khóa. Họ muốn có cơ hội kết nối với nhau và giải tỏa căng thẳng.
5. Kế hoạch thăng tiến nghề nghiệp rõ ràng
Có kế hoạch thăng tiến nghề nghiệp là một trong những cách quan trọng để giữ chân nhân viên Gen Z. Gen Z là thế hệ có nhu cầu được thăng tiến nhanh chóng. Họ muốn có cơ hội phát triển bản thân và khẳng định giá trị của mình.
Các nhà quản lý cần có kế hoạch thăng tiến nghề nghiệp rõ ràng cho nhân viên IT là Gen Z. Kế hoạch này cần bao gồm các mục tiêu và thời hạn cụ thể. Các nhà quản lý cần thường xuyên đánh giá hiệu suất của nhân viên để đảm bảo họ đang đi đúng hướng để đạt được các mục tiêu của mình.
Tóm lại
Gen Z là thế hệ nhân viên có nhiều tiềm năng và đóng góp quan trọng cho sự phát triển của doanh nghiệp. Để thành công trong việc quản lý nhóm nhân viên IT Gen Z, việc tạo ra một môi trường thúc đẩy sự phát triển cá nhân và chuyên môn, cùng việc đưa ra mục tiêu rõ ràng và cơ hội thăng tiến là chìa khóa quan trọng. Sự linh hoạt trong cách tiếp cận, sự tận tâm trong việc hỗ trợ và định hình định hướng cho sự nghiệp của họ có thể thúc đẩy tinh thần làm việc và sự cam kết đối với công việc. Chúc bạn thành công!
Tiếp nối ở bài trước, chúng ta đã học được cũng nhiều kiến thức về Typescript rồi. Ở bài viết này chúng ta sẽ cùng tìm hiểu thêm về nhiều Types hay ho khác của Typescript như union, intersection, utilitiy,…
Lưu ý khi đặt tên Type hoặc Interface thì nên đặt tên dễ hiểu và chữ cái đầu IN HOA nhé. Ví dụ như Permissions, UserName, Role…
Mình muốn tạo ra một Type có tên là Role để chứa các quyền của người dùng như là Admin, Guest, và User. Người dùng sẽ có 1 trong 3 quyền này cho nên chúng ta sẽ viết nó như sau
type Role = "Admin" | "User" | "Guest";
Ngoài ra Union Type còn dùng khi khai báo kiểu dữ liệu cho biến mà mình có đề cập đến cho các bạn ở những bài trước như là
let age: number | string = '5';
Đi sâu hơn vào nó thì sẽ có một vài trường hợp như sau để các bạn nhớ. Vì là Union nghĩa là hoặc Type này hoặc Type kia.
type NetworkLoadingState = { state: "loading";};type NetworkFailedState = { state: "failed"; code: number;};type NetworkState = | NetworkLoadingState | NetworkFailedState;const state: NetworkState = { state: "loading" };state.code = {};// Property 'code' does not exist on type 'NetworkLoadingState'.
Mình khai báo 2 Types là NetworkLoadingState và NetworkFailedState, sau đó mình khai báo tiếp 1 Type là NetworkState là Union Type. Khi mình dùng const state: NetworkState thì mình sử dụng được là state bởi vì 2 Types đều có chung key là state.
Tuy nhiên khi mình dùng state.code thì lại báo lỗi, mình có ghi là bởi vì Union là hoặc cho nên có thể là nó chạy vào NetworkLoadingState, mà thằng này thì không có key là code.
functionprintId(id: number | string){ console.log(id.toUpperCase());// Property 'toUpperCase' does not exist on type 'string | number'.// Property 'toUpperCase' does not exist on type 'number'.}
Một ví dụ khác khi khai báo params cho function và sử dụng các phương thức dựa vào params. Nếu là string thì có thể sử dụng .toUpperCase() tuy nhiên nếu là number thì sẽ không có các phương thức đó. Cho nên chương trình sẽ bắn ra lỗi ngay lập tức.
Để giải quyết vấn đề đó thì có thể kiểm tra Type của params dựa vào typeof như thế này
functionprintId(id: number | string){ if(typeof id === "string"){ // In this branch, id is of type 'string' console.log(id.toUpperCase()); }else{ // Here, id is of type 'number' console.log(id); }}
Intersection Type
Ngược lại với Union Type đó chính là Intersection Type(& và). Và Type này và Type kia. Nghĩa là sử dụng được hết toàn bộ các keys từ nhiều Types luôn.
type Student = { name: string; age: number;}type Person = { name: string;}type People = Person & Student;const people: People = { name: 'xiaoming',}// Property 'age' is missing in type '{ name: string; }' but required in type 'Student'.
Như ví dụ trên thì các bạn sẽ thấy mình không truyền vào key là age nên chương trình sẽ báo lỗi ngay vì nó bắt buộc khi sử dụng Intersection Type. Một điều nữa là phải nhất quán khi khai báo nhé, chú ý age là number nhưng lại sử dụng là string cũng sẽ lỗi.
const people: People = { name: 'xiaoming', age: '24'}// Type 'string' is not assignable to type 'number'.
Một điều cuối, cẩn thận khi khai báo như thế này, khi các bạn không xác định Type cho key mà là một giá trị nào đó thì 2 Type đó không được trùng key, nếu không thì nó sẽ trả ra never, mà never chúng ta đã học ở bài phần 1 rồi.
Type never không gán được bất kỳ giá trị nào!
type Student = { name: 'evondev';}type Person = { name: 'tuanpzo';}type People = Person & Student; // never// Errorconst people: People = { name: 'xiaoming',}
Utility types thì có rất nhiều tuy nhiên ở đây mình sẽ liệt kê kèm ví dụ minh họa cho các bạn những cái thông dụng thôi nhé.
Partial<Type>
Nó sẽ tạo ra một Type mới dựa vào Type gốc nhưng sẽ thay đổi toàn bộ keys thành optional(không bắt buộc dấu ?)
type Todo = { title: string; description: string;};functionupdateTodo(todo: Todo, fieldsToUpdate: Partial<Todo>){ return{ ...todo, ...fieldsToUpdate };}updateTodo({ title: "test", description: ""}, { description: "test"});
Mình có type là Todo với 2 keys là bắt buộc, các bạn để ở chỗ fieldsToUpdate mình có dùng Partial<Todo> cho nên param fieldsToUpdate lúc này nó sẽ trông như code ở dưới.
Cho nên khi mình gọi hàm updateTodo thì param đầu tiên buộc phải đầy đủ title và description, tuy nhiên param thứ 2 thì mình chỉ cần truyền description là được rồi, không báo lỗi gì cả.
type Todo = { title?: string; description?: string;};
Required<Type>
Ngược lại với Partial<Type> ở trên thì thằng này sẽ biến các keys thành bắt buộc, cho dù ban đầu nó là optional(?) đi chăng nữa
type Todo = { title?: string; description?: string;};functionupdateTodo(todo: Todo, fieldsToUpdate: Required<Todo>){ return{ ...todo, ...fieldsToUpdate };}updateTodo({ title: "test", description: ""}, { description: "test"} Error);// Property 'title' is missing in type '{ description: string; }' but required in type 'Required<Todo>'
Record<Keys, Type>
Nó sẽ tạo ra Type có các Keys và Value. Mình sẽ nói trường hợp đơn giản trước cho các bạn như này, nhìn vào rất dễ hiểu đúng không ? Keys là string và Value là Number.
Tiếp tục mình khai báo 2 Type tương ứng là CatInfo và CatName sau đó mình lại sử dụng Record để tạo ra các thông tin cho các chú mèo như sau. Lúc này từng chú mèo(CatName) sẽ có các thông tin như nhau(CatInfo) là age và breed. Quá xịn phải không nào.
Như tên gọi của nó, sẽ làm cho các keys trở nên Readonly(chỉ đọc chứ không được sửa). Nhìn ví dụ cho dễ thông não nè.
Interface cũng tương tự như Type thôi. Mình sẽ nói chi tiết về sự khác nhau giữa chúng ở bài sau nhé.
interface Todo { title: string;}const todo: Readonly<Todo> = { title: "Delete inactive users",};todo.title = "Hello";// Cannot assign to 'title' because it is a read-only property.
Pick<Type, Keys>
Pick nghĩa là chọn ra những keys mà các bạn muốn từ một Type nào đó. Đôi khi trong quá trình code có rất nhiều keys từ Type, nhưng chúng ta chỉ sử dụng vài cái trong đó, lúc này Pick<Type> là một lựa chọn tuyệt vời.
Mình lấy ra 2 keys là title và completed từ interface Todo
Ngược lại với Pick<Type, Keys> thì Omit<Type, Keys> sẽ lấy toàn bộ các keys từ Type nào đó sau đó loại bỏ ra một số keys(string hoặc union) không cần thiết.
Ngược lại với Extract ở trên thì nó sẽ loại bỏ những ExcludedMembers từ UnionType
// remove atype T0 = Exclude<"a" | "b" | "c", "a">;// type T0 = "b" | "c"// remove a and btype T1 = Exclude<"a" | "b" | "c", "a" | "b">; // type T1 = "c"// remove Functiontype T2 = Exclude<string | number | (()=>void), Function>;// type T2 = string | number;
NonNullable<Type>
Dùng để loại bỏ undefined và null ra khỏi Type
type T0 = NonNullable<string | number | undefined>;
// type T0 = string | number;
Tạm kết
Phần 3 tạm dừng ở đây nhé các bạn. Ở bài này chúng ta đã học thêm được khá nhiều Types mới rồi, kiến thức cũng có thêm 1 chút. Ở bài số 4 chúng ta sẽ tìm hiểu sự biệt giữa interface và type, cũng như tìm hiểu thêm về Mapped và Index Type cùng một số kiến thức liên quan tới chúng.
System Design là một kỹ năng cần thiết đối với các kỹ sư phần mềm đang tham gia hay muốn xây dựng các ứng dụng phức tạp; nó đòi hỏi khả năng tư duy sáng tạo và có hệ thống về cách giải quyết vấn đề cũng như việc áp dụng kiến thức kỹ thuật để thực hiện các giải pháp một cách hiệu quả. Bài viết hôm nay chúng ta cùng nhau điểm qua top 10 khái niệm System Design mà mọi lập trình viên nên biết để có thể tự tin hơn khi tham gia vào các dự án lớn trong tương lai nhé.
System Design là gì?
System Design (thiết kế hệ thống) là quá trình xác định kiến trúc (architecture), thành phần (component), module và giao diện (interfaces) của một hệ thống để đáp ứng các yêu cầu cụ thể, cũng như xác định các công nghệ và công cụ sẽ được sử dụng để triển khai hệ thống.
Các bước trong quá trình System Design
Xác định yêu cầu
Thu thập yêu cầu: Liên hệ với khách hàng, người dùng, và các bên liên quan để hiểu rõ mong muốn và nhu cầu cụ thể của họ.
Phân tích yêu cầu: Xem xét và phân loại các yêu cầu thành yêu cầu chức năng (những gì hệ thống phải làm) và phi chức năng (hiệu suất, bảo mật, tính khả dụng).
Thiết kế cấp cao (High-Level Design)
High-Level Design (HLD) là bước quan trọng trong quá trình thiết kế hệ thống, nơi chúng ta xác định kiến trúc tổng thể và cấu trúc chính của hệ thống. Các bước chi tiết bao gồm:
Xác định kiến trúc hệ thống: Trong bước này, kiến trúc tổng thể của hệ thống được xác định. Hệ thống được chia thành các thành phần lớn, mỗi thành phần có chức năng riêng. Sử dụng các sơ đồ như sơ đồ kiến trúc, sơ đồ luồng dữ liệu (DFD), và sơ đồ quan hệ thực thể (ERD) để biểu diễn cấu trúc và mối quan hệ giữa các thành phần.
Xác định thành phần chính: Sau khi xác định kiến trúc, các thành phần chính của hệ thống được liệt kê và mô tả. Mỗi thành phần chính được xác định với vai trò và chức năng cụ thể trong hệ thống. Các mối quan hệ và cách tương tác giữa các thành phần này cũng được làm rõ.
Phân tích và mô hình hóa yêu cầu: Yêu cầu chức năng và phi chức năng của hệ thống được phân tích chi tiết. Các yêu cầu này được mô hình hóa bằng cách sử dụng các mô hình biểu diễn như Use Case để mô tả tương tác giữa người dùng và hệ thống.
Thiết kế cấp thấp (Low-Level Design)
Low-Level Design là bước tiếp theo sau HLD, nơi các thành phần và mô-đun của hệ thống được chi tiết hóa. Các bước chi tiết bao gồm:
Xác định chi tiết các thành phần: Các thành phần lớn từ HLD được chia nhỏ thành các mô-đun nhỏ hơn. Mỗi mô-đun được mô tả chi tiết về cách hoạt động và tương tác với nhau. Điều này đảm bảo rằng tất cả các phần của hệ thống đều được định rõ và có thể phát triển một cách độc lập.
Tạo biểu đồ lớp và biểu đồ tuần tự: Biểu đồ lớp được sử dụng để mô tả cấu trúc nội bộ của từng mô-đun. Biểu đồ tuần tự mô tả cách các đối tượng trong hệ thống tương tác qua từng bước. Những biểu đồ này giúp đảm bảo rằng tất cả các tương tác trong hệ thống đều được xác định rõ ràng và có thể thực hiện được.
Xác định giao diện và phương thức: Các giao diện giữa các mô-đun và các phương thức được sử dụng trong hệ thống được xác định rõ ràng. Điều này giúp đảm bảo rằng tất cả các mô-đun có thể tương tác với nhau một cách hiệu quả và không có sự xung đột.
Kiểm tra và xem xét thiết kế chi tiết: Thực hiện các bài kiểm tra mô phỏng để đảm bảo thiết kế hoạt động đúng như mong đợi. Đánh giá lại thiết kế để tìm và khắc phục bất kỳ lỗi hoặc điểm yếu nào. Điều này đảm bảo rằng thiết kế cuối cùng là chính xác và hiệu quả.
Kiểm tra và xác thực thiết kế
Thực hiện các bài kiểm tra mô phỏng để đảm bảo thiết kế hoạt động đúng như mong đợi. Đánh giá lại toàn bộ thiết kế để tìm ra và khắc phục các lỗi hoặc điểm yếu.
Triển khai và bảo trì
Đưa hệ thống vào sử dụng thực tế. Quá trình này có thể bao gồm việc cài đặt phần mềm, cấu hình hệ thống, và đào tạo người dùng. Liên tục giám sát, khắc phục lỗi, và cập nhật hệ thống để đảm bảo nó hoạt động ổn định và đáp ứng các yêu cầu mới.
10 khái niệm liên quan đến System Design
Scalability – Khả năng mở rộng
Khả năng mở rộng là khả năng của một hệ thống có thể xử lý tải tăng lên mà không làm giảm hiệu suất. Để làm được điều này thì khi thiết kế, các kỹ sư cần xem xét đến yếu tố liên quan đến việc phân chia dữ liệu, cân bằng tải và bộ nhớ đệm.
Availability – Tính khả dụng
Tính khả dụng hay tính sẵn sàng là khả năng mà một hệ thống có thể duy trì hoạt động ngay cả khi một số thành phần bị lỗi. Để thiết kế được một hệ thống đảm bảo tính khả dụng thì bạn cần đến các yếu tố dự phòng, chuyển đổi dự phòng, kết hợp với việc hệ thống có khả năng chịu lỗi.
Consistency – Tính nhất quán
Tính nhất quán là một thuộc tính của hệ thống trong đó tất cả các nodes đều nhìn thấy cùng một dữ liệu tại cùng một thời điểm. Để đảm bảo được thuộc tính này, bạn cần xem xét đến yếu tố như sao chép dữ liệu, giao dịch phân tán và giải quyết xung đột.
3 tính chất trên được xem là những yếu tố cơ bản cần có khi thiết kế một hệ thống. Nó cũng được thường xuyên đề cập đến trong các định lý, lý thuyết khi xây dựng một hệ thống tiêu chuẩn. Chẳng hạn như định lý CAP; trong đó Partition Tolerance là khả năng chịu lỗi của hệ thống đề cập đến việc hệ thống đảm bảo phải hoạt động bình thường dù các kết nối của các node trong hệ thống bị đứt gãy.
Phân vùng là quá trình chia dữ liệu thành các phần nhỏ hơn và giúp dễ quản lý hơn. Các yếu tố như kiểu truy cập dữ liệu, phân phối dữ liệu và sao chép dữ liệu sẽ được xem xét đến khi bạn muốn thực hiện phân vùng dữ liệu trên hệ thống một cách hiệu quả.
Trong hệ thống cơ sở dữ liệu, Data Partitioning hay phân vùng dữ liệu thông thường được chia thành 2 loại:
Theo chiều ngang – còn được gọi là sharding là cách chia các hàng của bảng thành các bảng nhỏ hơn và lưu trữ trên các server
Theo chiều dọc – thực hiện chia các cột của bảng thành các bảng riêng biệt giúp giảm số lượng cột để nhằm cải thiện hiệu suất truy vấn
Load Balancing – Cân bằng tải
Cân bằng tải là quá trình phân phối lưu lượng mạng trên nhiều server để tránh tình trạng quá tải. Cân bằng tải đóng vai trò quan trọng đặc biệt trong các tình huống mà lưu lượng truy cập tăng đột biến hoặc khi lượng request đến các server không đồng đều.
Để thực hiện cân bằng tải thì kỹ sư hệ thống thường áp dụng một số thuật toán để xác định phân phối lưu lượng truy cập đến như:
Round Robin: phân phối tuần tự, đồng đều các request
Least Connections: chỉ định request đến server có ít hoạt động nhất
IP Hash: Sử dụng hash-function để xác định máy chủ cho request dựa trên IP của khách
Caching – Bộ nhớ đệm
Caching là một quá trình lưu trữ dữ liệu thường xuyên truy cập vào bộ nhớ để giúp truy cập nhanh hơn trong những lần sau. Bộ nhớ đệm là một lớp lưu trữ tốc độ cao, thông thường nằm giữa ứng dụng và nguồn dữ liệu. Khi dữ liệu được ứng dụng yêu cầu, hệ thống sẽ thực hiện tìm kiếm trong bộ đệm trước; nhờ có tốc độ truy xuất cao sẽ giúp tiết kiệm thời gian, tăng hiệu suất của xử lý. Nếu dữ liệu yêu cầu không được tìm thấy thì hệ thống mới xử lý đến bước tìm kiếm trong nguồn dữ liệu.
Nhắc đến System Design thì không thể không nhắc đến các thiết kế kiến trúc phổ biến hiện nay bao gồm Monolith, SOA và Microservices. Trong đó Monolith là một mô hình truyền thống phù hợp với các dự án quy mô nhỏ. Các hệ thống hiện nay để đáp ứng được với nhu cầu tăng cao và sự tích hợp của nhiều dịch vụ khác nhau thì SOA và Microservices được ưu tiên lựa chọn.
Microservices là một cách tổ chức các ứng dụng như một tập hợp các dịch vụ được liên kết một cách lỏng lẻo và có thể triển khai một cách độc lập. Mỗi service trong hệ thống sẽ đảm nhận một phần chức năng hoặc domain cụ thể trong ứng dụng và có thể giao tiếp với các service khác thông qua các APIs được quy định trước. Để xây dựng được kiến trúc Microservices, chúng ta cần quan tâm xem xét đến các yếu tố như ranh giới giữa các dịch vụ con cùng khả năng giao tiếp giữa chúng.
SOA – Service-Oriented Architecture
Kiến trúc hướng dịch vụ là một cách tiếp cận thiết kế phần mềm mà trong đó các ứng dụng được xây dựng như một tập hợp các dịch vụ. Khác biệt chính giữa SOA và Microservices là phạm vi áp dụng: trong khi SOA thường được áp dụng đối với phạm vi các doanh nghiệp nơi các ứng dụng giao tiếp với nhau thì Microservices hướng đến việc phát triển các ứng dụng nơi mà giao tiếp giữa các thành phần trong một ứng dụng.
DNS – Domain Name System
Hệ thống phân giải tên miền DNS là thành phần cơ bản của cơ sở hạ tầng Internet giúp dịch các tên miền thành địa chỉ IP tương ứng. Mỗi doanh nghiệp, tổ chức có thể có những địa chỉ tên miền nội bộ mà chỉ được sử dụng trong phạm vi doanh nghiệp, vì vậy khi thiết kế hệ thống, chúng ta cùng cần xây dựng DNS riêng cho doanh nghiệp đó tương ứng.
CDN – Content Delivery Network
Mạng phân phối nội dung CDN là một mạng lưới gồm các máy chủ được kết nối với nhau giúp tăng tốc độ tải trang Web cho các ứng dụng tiêu tốn nhiều dữ liệu. Khi người dùng truy cập vào một trang Web, dữ liệu từ máy chủ của trang Web đó phải di chuyển trên mạng Internet để đến được máy tính của người dùng; nếu như người dùng ở xa so với máy chủ đó thì sẽ mất nhiều thời gian tải những nội dung lớn như tệp, hình ảnh, văn bản, … Để giải quyết vấn đề này, các nội dung trên sẽ được lưu trữ trên các máy chủ CDN gần hơn với người dùng theo địa lý để giảm thời gian tải và tăng tốc độ truy cập trang Web.
Trên đây là khái niệm thiết kế hệ thống – Design System là gì, các bước cơ bản để xây dựng một hệ thống và top 10 khái niệm về System Design cơ bản nhất mà mọi kỹ sư hệ thống đều phải nắm được. Hy vọng bài viết hữu ích dành cho bạn và hẹn gặp lại trong các bài viết tiếp theo của mình.
Trong khoa học máy tính, dãy con tăng dài nhất là một trong những bài toán quy hoạch động kinh điển và được ứng dụng rộng rãi trong việc giải quyết các bài toán về sắp xếp lịch trong thực tế. Bài viết hôm nay chúng ta cùng nhau tìm hiểu về bài toán này, về thuật toán quy hoạch động và cách triển khai nó trong ngôn ngữ lập trình JavaScript nhé.
Bài toán dãy con tăng dài nhất
Dãy con tăng dài nhất – Longest Increasing Subsequence (LIS) là một bài toán với mục đích tìm ra dãy con dài nhất có thể của một dãy cho trước, trong đó các phần tử của dãy con đó được sắp xếp theo thứ tự tăng dần. Các phần tử trong dãy con này không nhất thiết phải liền kề hoặc duy nhất.
Ví dụ ở hình trên, với đầu vào (input) là một mảng số gồm 8 phần tử thì đầu ra (output) mong muốn của bài toán sẽ là 2 mảng con thỏa mãn yêu cầu cùng độ dài bằng 4.
Bài toán dãy con đơn điệu tăng dài nhất có biến thể đơn giản nhất là bài toán dãy con đơn điệu giảm dài nhất và thực tế là 2 bài toán này được xem là một. Ứng dụng của bài toán này trong thực tế có rất nhiều, nhất là trong các vấn đề về sắp xếp và lập lịch. Một ví dụ nổi bật là bài toán bố trí phòng khách sạn như sau:
Yêu cầu: Có n khách cùng đặt 1 phòng khách sạn, khách i nhận phòng vào thời điểm A(i) và trả phòng ở thời điểm B(i). Hãy bố trí khách vào phòng đó sao cho phục vụ được nhiều khách nhất có thể. Lưu ý bài toán giả định chỉ có 1 phòng và có thể dễ dàng mở rộng cho nhiều phòng bằng cách sắp xếp lần lượt từng phòng.
Chúng ta có thể chuyển yêu cầu trên về bài toán dãy con tăng dài nhất bằng cách sắp xếp các khách đặt phòng theo thời điểm kết thúc B(i) tăng dần. Khách i sẽ được sắp xếp vào phòng sau khách j khi và chỉ khi j < i và B(j) < A(i). Kết quả đầu ra từ thuật toán sẽ cho chúng ta mảng con số lượng khách tối đa có thể đặt được phòng.
Bài toán dãy con tăng dài nhất được xếp vào một trong những bài toán quy động động kinh điển, vì thế để giải bài toán này trước tiên chúng ta cùng tìm hiểu về thuật toán này nhé.
Quy hoạch động là một kĩ thuật thiết kế thuật toán theo kiểu chia bài toán lớn thành các bài toán con, sử dụng lời giải của các bài toán con để tìm lời giải cho bài toán ban đầu giúp chúng ta tối ưu thời gian thực hiện thuật toán. Khác với đệ quy thì quy hoạch động sẽ tính toán lời giải của các bài toán con trước và lưu vào mảng bộ nhớ; tiếp đó dùng lời giải của bài toán con trong mảng đã tính trước đó để giải bài toán theo công thức truy hồi.
Giá trị trả về longestIncreasingLength là độ dài của dãy con lớn nhất thỏa mãn yêu cầu đề bài. Để lấy ra được giá trị mảng con, chúng ta cần triển khai thêm bước truy vết lấy từng phần tử từ dãy đầu vào theo thứ tự ngược lại của vòng lặp, các bạn có thể tự triển khai thêm nhé.
Chi phí thời gian thực hiện giải thuật này là O(n log n) với n là độ dài mảng đầu vào.
Kết bài
Như vậy qua bài viết này chúng ta đã cùng nhau tìm hiểu về bài toán về dãy con tăng dài nhất và cách giải quyết nó bằng thuật toán quy hoạch động cùng cách triển khai bằng ngôn ngữ lập trình JavaScript. Hy vọng bài viết hữu ích dành cho các bạn và hẹn gặp lại trong các bài viết tiếp theo của mình.
Trong bối cảnh thị trường tuyển dụng cạnh tranh như hiện nay, việc tìm được một công việc ưng ý là mong ước của nhiều người. Tuy nhiên, tìm việc chưa bao giờ dễ dàng, nếu không “khó tính” ngay từ đầu thì bạn rất dễ gặp phải những công ty “độc hại”, làm ảnh hưởng đến cả sự nghiệp sau này.
Do đó, để không phải “rước họa vào thân”, bạn cần biết cách nhận diện những red flags khi tìm việc. Nằm lòng những cảnh báo dưới đây sẽ giúp bạn tránh các rắc rối sau này đấy.
Các ‘red flags’ khi tìm việc và nộp CV
Nếu bạn là một người tinh ý thì ngay từ JD tuyển dụng bạn đã có thể phát hiện ra các red flags. Dưới đây là một số manh mối bạn có thể quan tâm khi đọc thông tin tuyển dụng.
Thông tin tuyển dụng mập mờ
Thông tin tuyển dụng mập mờ là một dấu hiệu cảnh báo phổ biến khi tìm việc. Thông tin tuyển dụng mập mờ thường không cung cấp đầy đủ thông tin về vị trí, yêu cầu, và quyền lợi. Điều này có thể khiến bạn gặp khó khăn trong việc xác định liệu vị trí đó có phù hợp với bạn hay không.
Dưới đây là một số ví dụ về thông tin tuyển dụng mập mờ:
Mô tả công việc không rõ ràng: Mô tả công việc chỉ ghi chung chung là “nhân viên kinh doanh”, “kỹ sư phần mềm”, “nhân viên marketing”, mà không nêu rõ công việc cụ thể là gì, yêu cầu kỹ năng và kinh nghiệm gì, và quyền lợi được hưởng ra sao.
Yêu cầu không rõ ràng: Yêu cầu tuyển dụng không cụ thể, chẳng hạn như “có kinh nghiệm”, “trình độ cao”, “có kỹ năng mềm tốt”, mà không nêu rõ kinh nghiệm, trình độ, và kỹ năng cụ thể là gì.
Quyền lợi không rõ ràng: Quyền lợi được hưởng không cụ thể, chẳng hạn như “lương cao”, “thưởng hấp dẫn”, “được đào tạo”, mà không nêu rõ mức lương, mức thưởng, và chương trình đào tạo cụ thể là gì.
Hoặc nhiều nơi sẽ liệt kê một vài yêu cầu và kỹ năng đơn giản sau đó để mức lương thật cao để gây sự chú ý.
Nếu bạn đọc mô tả công việc thấy cụm từ “… và làm những công việc khác theo yêu cầu” thì hãy đặt dấu chấm hỏi. Điều này có thể là bất lợi cho bạn khi nhận việc vì cụm từ khá ẩn ý và không rõ ràng, bạn có thể sẽ phải làm những công việc nằm ngoài chuyên môn và tệ hơn là làm ngoài giờ.
Bên cạnh đó, điều này cũng cho thấy công ty thiếu chuyên nghiệp, chưa xác định rõ những công việc mà vị trí đang tuyển dụng sẽ đảm nhận là gì. Hoặc công ty đang che giấu một điều gì đó mà chỉ khi bắt đầu nhận việc bạn mới được biết.
Các red flags khi đi phỏng vấn
Khi đã tìm được một tin tuyển dụng phù hợp, bạn ứng tuyển và được gọi đến vòng phỏng vấn. Tại đây, ngoài việc thể hiện năng lực bản thân bạn cũng cần đặt các câu hỏi để kiểm tra công ty có dấu hiệu gì bất thường hay không.
Nhà tuyển dụng hời hợt, thiếu tôn trọng ứng viên
Quá trình tuyển dụng không chỉ quan trọng với ứng viên mà còn rất quan trọng với doanh nghiệp vì nó sẽ mang lại giá trị cho công ty. Do đó, nếu nhà tuyển dụng hời hợt, phỏng vấn “cho có” thì đây là một dấu hiệu red flags khi tìm việc bạn cần chú ý.
Dưới đây là một số ví dụ về nhà tuyển dụng hời hợt, thiếu tôn trọng ứng viên:
Đến muộn, không chuẩn bị: Nhà tuyển dụng đến muộn cho cuộc phỏng vấn, không có hồ sơ ứng viên, hoặc chỉ hỏi những câu hỏi chung chung, không liên quan đến vị trí ứng tuyển.
Thái độ thờ ơ, thiếu tôn trọng: Nhà tuyển dụng có thái độ thờ ơ, không quan tâm đến ứng viên, hoặc có những lời nói hoặc hành động thiếu tôn trọng.
Không trả lời phản hồi của ứng viên: Nhà tuyển dụng không phản hồi email hoặc cuộc gọi của ứng viên sau khi phỏng vấn.
Một red flags khi tìm việc khác là luôn bị người phỏng vấn bày tỏ thái độ tiêu cực mỗi khi trình bày quan điểm. Chẳng hạn như khi bạn nói về những điểm mạnh của mình thì người phỏng vấn sẽ cho đó là những điều cơ bản, ai cũng có và mong chờ nhiều hơn vào nó.
Với một môi trường làm việc toxic, không công nhận năng lực ứng viên bạn sẽ luôn cảm thấy thấp kém và năng lực phát triển bị kìm hãm. Do đó, bạn hãy thật thận trọng khi lựa chọn làm ở những công ty red flags như thế này.
Đưa ra offer lương và hối thúc quyết định ngay
Thông thường các công ty sẽ đưa ra mức offer và cho ứng viên thời gian suy nghĩ, nếu ứng viên cảm thấy phù hợp họ sẽ thông báo kết quả phỏng vấn qua mail sau. Còn nếu nhân sự tuyển dụng đưa ra mức offer và hối thúc bạn nhận việc ngay trong buổi phỏng vấn rất có thể công ty này đang che giấu điều gì đó.
Một lý do có thể hợp lý là họ đang cố gắng ép bạn nhận mức lương thấp hơn mức bạn xứng đáng, do tâm lý sợ việc rơi việc vào tay người khác nên bạn sẽ đồng ý. Hoặc có thể công ty có văn hóa làm việc không tốt, họ không muốn bạn có thời gian suy nghĩ nên hối thúc bạn nhanh chóng nhận việc.
Nhà tuyển dụng “mập mờ” về câu trả lời cho câu hỏi của bạn
Một red flags khi tìm việc nữa mà các ứng viên cần lưu ý là nhà tuyển dụng phớt lờ hoặc trả lời không rõ ràng câu hỏi của bạn. Bạn hãy hỏi khéo léo các câu hỏi có tính chất cởi mở như mức lương, cam kết thời gian làm việc, định hướng của công ty,… nếu người phỏng vấn gạt các thắc mắc của bạn sang một bên thì rất có thể họ đang che giấu điều gì đó.
Tóm lại
Thông tin tuyển dụng mập mờ, công việc được phân công không rõ ràng, nhà tuyển dụng hời hợt, thiếu tôn trọng ứng viên,… là những red flags khi tìm việc phổ biến bạn nên chú ý. Những dấu hiệu này có thể cho thấy công ty đó có văn hóa làm việc độc hại, thiếu tôn trọng nhân viên, hoặc không có kế hoạch rõ ràng.
Nếu bạn gặp phải những red flags này, bạn nên cân nhắc kỹ trước khi ứng tuyển. Bạn có thể hỏi thêm thông tin từ các nguồn khác, chẳng hạn như nhân viên cũ của công ty, hoặc từ các trang web đánh giá công ty. Bạn cũng có thể từ chối nhận việc nếu bạn cảm thấy rằng công ty không phù hợp.
Nắm chắc trong tay những dấu hiệu red flags trong bài viết này để “thuận buồm xuôi gió” trên đường sự nghiệp bạn nhé. Chúc bạn tìm việc thành công!
Tiếp nối với Typescript cơ bản phần 1 ở bài trước, chúng ta đã cài đặt và tìm hiểu một số Types cơ bản rồi. Ở bài này chúng ta sẽ tiếp tục tìm hiểu tiếp những Types mới nhé.
Any Type
Type any là Type mà các bạn có thể điền vào giá trị gì cũng được, và có thể thay đổi sang bất kỳ giá trị nào khác cũng được. Thông thường một dự án người ta sẽ có một vài thiết lập không cho phép dùng thằng any này luôn. Vì khi dùng any là chúng ta sẽ không biết nó sẽ có kiểu như thế nào cả.
Tuy nhiên nó vẫn được dùng một số chỗ khi chúng ta chưa biết dữ liệu trả về sẽ là kiểu gì. Hoặc là những bạn mới học không biết cách dùng những Types khác cho nên cứ lạm dụng thằng any này, cứ chỗ nào báo lỗi Types là thay thành any hết là toang thật sự
let myName: any = "evondev";myName = 30;myName = false;
Như ví dụ trên đây là mình dùng biến myName với Type là any gán giá trị là string, sau đó mình đổi nó thành number và boolean nhưng vẫn không lỗi. Vậy nếu muốn nó vừa là string, boolean và number thì thay vì dùng any thì chúng ta có thể dùng Union Type như đã học ở bài trước như sau sẽ hay hơn
let myName: string | number | boolean = "evondev";myName = 30;myName = false;
Tips: Muốn code Typescript giỏi thì hãy cố gắng hạn chế dùng any nhất có thể các bạn nhé.
Unknown Type
Về cơ bản thì thằng unknown này khá giống với any những cũng không giống lắm. Như mình đề cập ở trên thì any là bất kỳ cái gì cũng được. Còn unknown là chưa xác định được(chỗ này giống any) tuy nhiên khi chúng ta cho nó một giá trị ví dụ là string thì việc tiếp theo chúng ta cần làm là kiểm tra Type của biến đó thông qua thằng typeof. Mình sẽ ví dụ cho các bạn như sau cho dễ hiểu
let myName: unknown;myName = "frontend developer";// hover -> myName: unknow;
Nếu các bạn viết như dòng dưới đây là sẽ báo lỗi ngay dù các bạn đã gán cho nó một giá trị có kiểu string.
let myName: unknown;myName = "frontend developer";console.log(myName.includes("developer")); // Error// 'myName' is of type 'unknown'.
Để khắc phục thì chúng ta sẽ viết lại đoạn code như thế này.
Lưu ý: Đối với any thì không cần kiểm tra bằng typeof nó cũng không báo lỗi. Và cũng sẽ không gợi ý các phương thức cho giá trị tương ứng. Như ở đây là chuỗi thì sẽ không gợi ý các phương thức như includes chẳng hạn.
let myName: unknown;myName = "frontend developer";if(typeof myName === "string"){ console.log(myName.includes("developer"));}
Trong quá trình các bạn làm việc, chắc chắn các bạn sẽ gặp Type unknown này. Cho nên cần kiểm tra Type của giá trị thông qua typeof cho chắc nhé.
Như tên gọi của nó nghĩa là không bao giờ xảy ra, đọc vào khá là khó hiểu nhưng thực ra nó cũng dễ hiểu như thế này. Mình sẽ liệt kê các trường hợp của nó bao gồm
Hàm bắn ra lỗi nào đó và không có return
Hàm có sử dụng vòng lặp vô tận và cũng không có return
Never Type không có bất kỳ một giá trị nào cả
functionthrowError(errorMsg: string): never{ thrownewError(errorMsg);}functionkeepProcessing(): never{ while(true){ console.log("I always does something and never ends."); }}let nothing: never = null; // Error: Type 'null' is not assignable to type 'never'
Void Type
Type void thường được dùng cho hàm mà không có return về cái gì cả. Khi các bạn viết hàm mà không có từ khóa return ấy. Còn nếu khi các bạn gán giá trị cho biến sử dụng void thì chỉ có thể sử dụng undefined thôi. Còn nếu các bạn thay những Types khác như number, boolean, string… vào thì sẽ ra lỗi ngay
Về cơ bản thì thằng Tuple này khá là giống mảng nhưng mà nó sẽ cố định số lượng và đi kèm Types tương ứng. Và khi chúng ta sử dụng thì phải sử dụng đúng cấu trúc khai báo nếu không nó sẽ báo lỗi. Ở dưới là các bạn thấy students1 là dùng đúng cách, còn students2 và students3 là dùng sai.
const students1: [string, number] = ["evondev", 30];const students2: [string, number] = [30, "evondev"]; // Error: Type 'number' is not assignable to type 'string'. Type 'string' is not assignable to type 'number'.const students3: [string, number] = [30, false]; // Error Type 'boolean' is not assignable to type 'number'.
Vì nó giống mảng cho nên là chúng ta có thể truy xuất các giá trị thông qua index và sử dụng các phương thức của mảng như push, pop, shift… Tuy nhiên các giá trị đưa vào phải đúng Types mà chúng ta đã khai báo từ đầu
const students1: [string, number] = ["evondev", 30];students1[0];students1[1];students1.push(2);students1.push('evondev');students1.push(false); // Error: Argument of type 'boolean' is not assignable to parameter of type 'string | number'.
Chúng ta có thể khai báo Tuples phức tạp hơn một chút với mảng như sau, tùy thuộc vào yêu cầu của bài toán thôi nhé.
Enum Type là một cách để định nghĩa một nhóm các giá trị có thể được sử dụng như một kiểu dữ liệu. Enum Type giúp rõ ràng hơn khi làm việc với các giá trị cố định và giúp tránh việc sử dụng các giá trị “magic number” (số ma thuật) trong code.
Số ma thuật là các con số mà các bạn sử dụng trong code nhưng khi đọc vào chúng ta không hiểu nó nghĩa là gì.
Ví dụ khi sử dụng setTimeout và chúng ta truyền vào thời gian như thế này, nhìn vào chúng ta không hề biết 1000*60*60 nghĩa là gì cả. Thì giá trị 1000*60*60 ở đây người ta gọi là Magic Number.
setTimeout(()=>{ // code}, 1000 * 60 * 60);
Để khắc phục thì chúng ta sẽ thường đưa nó vào một biến sử dụng từ khóa const như là thế này. Những thứ về thời gian như giờ phút giây lại có thể gom chung vào một nhóm các giá trị tạm gọi là thời gian(Time) cũng khá là hợp lý. Thì gom chung vào như thế nào thì có thể sử dụng enum Type.
const SECOND = 1000;const MINUTE = SECOND * 60;const HOUR = MINUTE * 60;setTimeout(()=>{ // code}, HOUR);
Để định nghĩa một enum Type trong TypeScript, các bạn sử dụng từ khóa enum và liệt kê danh sách các giá trị của enum đó. Ví dụ dưới đây mô tả một enum type có tên là Time:
enum Time { SECOND, MINUTE, HOUR}
Trong ví dụ trên, enum Time có ba giá trị là SECOND, MINUTE, và HOUR. Mặc định, TypeScript gán các giá trị cho enum bằng cách sử dụng các số nguyên tăng dần bắt đầu từ 0. Do đó, SECOND sẽ có giá trị 0, MINUTE có giá trị 1 và HOUR có giá trị 2.
Khi sử dụng enum Type, các bạn có thể khai báo một biến với kiểu dữ liệu là enum và gán cho nó một trong các giá trị của enum đó. Ví dụ:
enum Time { SECOND, MINUTE, HOUR}
const oneHour: Time = Time.HOUR;
Nếu các bạn muốn enum bắt đầu từ một giá trị khác, các bạn có thể gán như sau:
enum Time { SECOND = 1000, MINUTE = 1000 * 60, HOUR = 1000 * 60 * 60}const oneHour: Time = Time.HOUR;
Ở trên là ví dụ đơn giản thôi. Bây giờ mình sẽ thêm một vài ví dụ khác về trường hợp không dùng enum nó sẽ trông như thế nào nhé
Các bạn chưa cần hiểu đoạn code React( nếu các bạn chưa học React ), nhưng các bạn hãy nhìn vào chỗ recent, popular, latest là những chữ có tính lặp đi lặp lại nhiều lần, tụi nó đều có thể gom chung vào một nhóm các giá trị đại diện cho các Tabs trong trường hợp này. Ta có thể đưa nó vào enum Type và sử dụng lại như sau.
Và các bạn thấy rằng các giá trị trong enum không nhất thiết phải là số, mà cũng có thể là chuỗi. Thông thường thì họ sẽ đặt key là IN HOA và giá trị tùy thuộc vào logic của bài toán có thể là số, chuỗi in thường, chuỗi IN HOA…
Khi các bạn viết như trên thì cái tab các bạn dùng chỉ có thể là 1 trong 3 giá trị đã khai báo mà thôi. Nếu các bạn truyền vào cho tab 1 giá trị khác thì nó sẽ báo lỗi. Còn nếu các bạn không dùng enum mà để như cách ban đầu thì các bạn có thể thay giá trị thoải mái mà không báo lỗi gì.
Thì tất nhiên code của các bạn sẽ không rõ ràng, không biết các Tabs sẽ có những tên gì, vì điền gì vào cũng được. Còn muốn bổ sung thêm tab mới chỉ cần đơn giản là thêm vào chỗ enum TabKey nữa mà thôi là ngon lành cành đào.
Tạm kết
Phù Chúng ta tạm dừng phần 2 ở đây nhé. Ở phần này chúng ta cũng đã học thêm được nhiều kiến thức mới rồi bao gồm: any, unknown, enum, tuple, never và void.
Phần enum có vẻ sẽ là khá khó hiểu đối với các bạn, nên có gì cứ bình luận nhé. Mình biết mình sẽ giúp đỡ cho các bạn. Cám ơn các bạn và chúc các bạn một ngày tốt lành.
Trong thời điểm hiện nay khi có rất nhiều ngôn ngữ lập trình được sinh ra với nhiều tính năng phục vụ cho lập trình viên hơn bao giờ hết thì vẫn còn đó một cái tên dù đã ra đời gần 40 năm mà vẫn luôn lọt top những ngôn ngữ lập trình phổ biến nhất, đó là ngôn ngữ C.
Lập trình viên C hay C Developer luôn có một chỗ đứng vô cùng vững chắc trong giới lập trình nhờ sự hiểu biết chuyên sâu về kiến thức lập trình cũng như nắm vững được về hệ thống và cả thiết bị phần cứng. Bài viết hôm nay chúng ta cùng tìm hiểu về C Developer và trả lời cho câu hỏi có nên trở thành lập trình viên C trong giai đoạn hiện nay hay không nhé.
Ngôn ngữ lập trình C
C là một ngôn ngữ lập trình phổ biến nhất thế giới nhờ sự đơn giản và linh hoạt khi sử dụng nên nó được ứng dụng trong rất nhiều hệ thống và mục đích khác nhau. C có lịch sử lâu đời, ra mắt từ những năm 1970 và có nhiều nhánh phát triển cũng như các ngôn ngữ kế thừa khác nhau. Với những đặc điểm đó thì C được xem là ngôn ngữ mẹ của nhiều ngôn ngữ lập trình khác, và thường được lựa chọn giảng dạy làm nền tảng cho các khóa học lập trình.
Hiện nay có rất nhiều ngôn ngữ cùng các thư viện, framework hỗ trợ dành cho lập trình viên; tuy nhiên C vẫn đã và đang đóng góp vai trò lớn trong nhiều lĩnh vực. Ứng dụng của C bao gồm:
C Developer hay lập trình viên C là những kỹ sư chuyên sử dụng ngôn ngữ lập trình C/C++ nhằm phát triển và cải thiện các tính năng trên phần mềm. Cũng như những lập trình viên nói chung, C Developer là người phải nắm rõ được nền tảng ngôn ngữ lập trình C cùng với các thư viện, framework tùy thuộc vào nền tảng và yêu cầu của dự án.
Công việc hàng ngày của một lập trình viên C bao gồm:
Tham gia phân tích, đề xuất nghiệp vụ dựa trên nền tảng hiểu biết về ngôn ngữ C
Viết code xây dựng ứng dụng, review code
Tham gia kiểm thử, viết các unit test nếu cần thiết
Nâng cấp, sửa chữa, sửa lỗi các ứng dụng có sẵn
Nghiên cứu, tìm hiểu phát triển các công nghệ, tính năng mới để áp dụng vào dự án
Để đáp ứng được những công việc trên, một lập trình viên C cần có những kỹ năng tương ứng bao gồm:
Kỹ năng lập trình: nắm vững nền tảng lập trình C là một yêu cầu bắt buộc. C là một ngôn ngữ dễ học nhưng sẽ khó để nắm được hết các kiến thức chuyên sâu. Vì vậy bạn cần phải có thời gian tích lũy và thường xuyên trau dồi kỹ năng lập trình C.
Cấu trúc dữ liệu và giải thuật: đối với C thì việc hiểu biết và áp dụng những cấu trúc dữ liệu cùng việc triển khai các giải thuật là việc vô cùng quan trọng. Ngoài ra là kiến thức liên quan đến con trỏ (pointer) cơ bản và nâng cao là một trong những đặc trưng của họ nhà C (từ C/C++ đến C#).
Kiến thức về hệ thống: C thường được lựa chọn để làm ngôn ngữ xây dựng các ứng dụng giao tiếp với hệ thống, vì vậy lập trình viên cũng cần trang bị kỹ năng liên quan đến xử lý đầu ra, đầu vào (I/O process), thao tác với file, quản lý bộ nhớ, hiểu về Process, Thread hay multi Thread trong C.
Kỹ năng teamwork: bao gồm những kỹ năng giao tiếp, trao đổi, khả năng thuyết trình, khả năng kết hợp với các thành viên khác để cùng giải quyết vấn đề. Lập trình viên ở bất cứ ngôn ngữ nào cũng cần làm việc trong một team phát triển, vì thế nếu bạn không có khả năng hợp tác cùng người khác thì sẽ không thể làm việc được.
Sử dụng các tool quản lý source code và issues: việc thành thạo sử dụng các tool quản lý version source code như Git, SVN,… hay các phần mềm quản lý tasks, issues sẽ giúp bạn nhanh chóng làm việc trong dự án. Đây cũng là yêu cầu cơ bản để giúp lập trình viên có thể làm việc được.
Có nên trở thành lập trình viên C trong giai đoạn hiện nay
Hiện nay có rất nhiều ngôn ngữ lập trình cùng những thư viện, framework hỗ trợ xây dựng, phát triển ứng dụng rất nhanh và được nhiều công ty, tổ chức lựa chọn. Với những ứng dụng xây dựng bằng ngôn ngữ C đòi hỏi khá nhiều công sức xây dựng, cùng với đó là sự cần thiết phải hiểu biết chuyên sâu về hệ thống khiến con đường trở thành một C Developer sẽ dài hơn và gian nan hơn so với các ngôn ngữ khác.
Tuy nhiên, trong tất cả các bảng xếp hạng ngôn ngữ lập trình phổ biến hay được sử dụng nhiều nhất thì C luôn có mặt trong top 10 nhờ hiệu suất, sự linh hoạt và khả năng làm được nhiều thứ của nó. Dưới đây là những lý do mà bạn nên lựa chọn C là một hướng đi cho sự nghiệp lập trình của mình:
C là ngôn ngữ cơ sở của nhiều ngôn ngữ khác, vì thế nếu học tốt C thì bạn sẽ dễ dàng học thêm tiếp các ngôn ngữ lập trình khác. Ngoài ra với lịch sử gần 40 năm phát triển thì cộng đồng C cũng vô cùng lớn mạnh, sở hữu rất nhiều mã nguồn là các chương trình, hệ thống nổi tiếng mà bạn có cơ hội tiếp cận khi làm C Developer.
C là ngôn ngữ có hiệu suất cao, nó có thể chạy mượt mà trên các hệ thống giới hạn về phần cứng như bộ nhớ hay dung lượng RAM, ROM. Vì thế C là ngôn ngữ chính trong các hệ thống nhúng, các thiết bị thông minh trong hệ sinh thái IoT hay các trình quản lý thiết bị driver.
Với sự phát triển của các thiết bị thông minh cùng kết nối Internet vạn vật (IoT) thì việc làm dành cho C Developer là rất phong phú và có tiềm năng phát triển cao.
Mức đãi ngộ dành cho lập trình viên C cao hơn do đây là một ngôn ngữ ít được lựa chọn hơn. Các công việc lập trình C đòi hỏi sự tìm hiểu chuyên sâu, vì thế đi kèm với đó cũng là việc các công ty, tổ chức tuyển dụng sẽ có những mức lương cao hơn dành cho vị trí này.
Kết bài
Mỗi ngôn ngữ lập trình đều được sinh ra với mục đích riêng dành cho việc phát triển phần mềm, ứng dụng; với sự phát triển gần 40 năm qua thì C vẫn là một ngôn ngữ lập trình được ưu chuộng cho đến hiện nay, điều đó chứng tỏ việc trở thành một C Developer là một lựa chọn tốt dành cho những bạn có ý định và yêu thích ngôn ngữ này. Hy vọng bài viết hữu ích dành cho bạn, hẹn gặp lại trong các bài viết tiếp theo của mình.