Home Blog Page 26

Nhảy việc sao cho khéo? Thời điểm thích hợp nhất để nhảy việc

Nhảy việc sao cho khéo? Thời điểm thích hợp nhất để nhảy việc

Nhảy việc là một điều tất yếu sẽ xảy ra trên hành trình sự nghiệp của bất kỳ ai. Trong thời buổi thị trường đầy biến động như hiện nay thì nhu cầu nhảy việc thường xuyên, nhất là ở giới trẻ ngày càng cao. Tuy nhiên, nếu nhảy việc “không khéo” rất dễ ảnh hưởng đến sự nghiệp sau này của bạn, do đó cần có sự cân nhắc và chuẩn bị kỹ lưỡng trước khi quyết định rời đi.

Hãy cùng TopDev tìm hiểu các cách nhảy việc sao cho khéo và thời điểm nào là hợp lý nhất để nhảy việc trong bài viết dưới đây!

Mặt Tốt – Xấu khi nhảy việc

Tùy vào trường hợp mà nhảy việc có thể giúp ích cho sự nghiệp của bạn hay làm bạn mất đi cơ hội hiện có. Dưới đây là một số lợi ích cũng như rủi ro bạn cần biết để cân nhắc thật kỹ trước khi quyết định nhảy việc.

Nhảy việc sao cho khéo

Lợi ích của nhảy việc

  • Cơ hội phát triển: Nhảy việc giúp bạn tiếp cận với nhiều công ty, lĩnh vực mới, mở rộng kiến thức và kỹ năng. Trải nghiệm nhiều môi trường làm việc khác nhau giúp bạn rèn luyện khả năng thích nghi và linh hoạt.
  • Mức lương cao hơn: Khi chuyển sang công ty mới, bạn có thể thương lượng mức lương cao hơn dựa trên kinh nghiệm và năng lực của bản thân. Cạnh tranh trong môi trường mới thúc đẩy bạn nỗ lực để phát triển và tăng thu nhập.
  • Cơ hội thăng tiến: Một số công ty đánh giá cao những nhân viên có kinh nghiệm làm việc ở nhiều môi trường khác nhau. Nhảy việc giúp bạn có nhiều cơ hội tiếp xúc với các vị trí cao hơn, mở ra con đường thăng tiến rộng mở.
  • Môi trường làm việc tốt hơn: Tìm kiếm môi trường phù hợp với bản thân, nơi bạn được thỏa mãn đam mê và phát huy tối đa năng lực. Tránh khỏi môi trường làm việc độc hại, ảnh hưởng tiêu cực đến tinh thần và hiệu quả công việc.

  Nhảy việc sau Tết: Tìm CƠ HỘI mới hay lại tiếp tục CƠ CỰC?

  List 10 việc cần chuẩn bị trước khi "nhảy việc"

Rủi ro khi nhảy việc

  • Khó khăn trong việc hòa nhập: Cần thời gian để thích nghi với văn hóa công ty mới, đồng nghiệp mới và cách thức làm việc mới. Gặp khó khăn trong việc xây dựng mối quan hệ và tạo dựng uy tín tại công ty mới.
  • Rủi ro thất bại: Không phải lúc nào việc nhảy việc cũng thành công. Có thể bạn sẽ gặp khó khăn trong việc tìm kiếm công việc mới hoặc không hài lòng với công việc mới.
  • Gây ấn tượng không tốt: Nhảy việc quá thường xuyên có thể khiến nhà tuyển dụng nghi ngờ về tính ổn định và cam kết của bạn. Gây khó khăn trong việc xin việc sau này nếu bạn không có lý do chính đáng để giải thích cho việc nhảy việc liên tục.

Đâu là thời điểm thích hợp để nhảy việc?

Chọn một thời điểm nhảy việc thông minh không chỉ giúp bạn dễ dàng tìm được công việc mới mà còn không làm “mất lòng” đồng nghiệp và sếp. Tùy vào trường hợp của mỗi người mà bạn hãy cân nhắc thời gian nhảy việc hợp lý.

Thời điểm nhảy việc phù hợp

Thời điểm nhảy việc phù hợp

Thông thường, thị trường nhân lực sẽ trở nên khan hiếm vào đầu năm mới, đặc biệt là sau kỳ nghỉ Tết nguyên đán. Bạn có thể tận dùng thời điểm này để xin nghỉ việc, thị trường thiếu nhân lực nên việc tìm kiếm công việc mới cũng sẽ dễ dàng hơn. Hãy tránh nhảy việc khi thị trường lao động ẩm đạm, khó khăn trong việc tìm công việc mới.

Bạn không còn hài lòng với công việc hiện tại

Nếu bạn không hài lòng với công việc hiện tại, bạn có thể cân nhắc nhảy việc để tìm kiếm môi trường phù hợp hơn. Hãy đặt ra các câu hỏi cho bản thân mình như: Mình còn có thể học được gì ở công việc này? Mình có đang “dậm chân tại chỗ” khi công việc cứ lập đi lập lại? Công ty liệu còn có thể giúp mình phát triển những kỹ năng mình đang thiếu hay không? Nếu các câu trả lời đều không theo hướng tích cực thì đấy là lúc bạn nên nhảy việc.

Bạn đang có những kế hoạch, định hướng mới cho tương lai

Bạn đang có những kế hoạch, định hướng mới cho tương lai

Trải qua thời gian làm việc tại công ty, bạn nhận thấy mình đã có những định hướng, mục tiêu khác cho tương lai mà công việc hiện tại không đủ đáp ứng thì hãy cứ mạnh dạn nhảy việc. Tuy nhiên, bạn cũng có thể chia sẻ những mong muốn trong tương lai của mình cho cấp trên nghe, biết đâu họ hoàn toàn có thể tạo điều kiện cho bạn phát triển thì sao?

Khi có offer từ công ty khác tốt hơn

Nếu bạn đang bất mãn với công ty hiện tại, bất mãn về môi trường làm việc hoặc đồng nghiệp thì khi có offer phù hợp ngại gì không nhảy việc. Tuy nhiên, bạn cũng phải thận trọng đánh giá về các yếu tố như mức lương, phúc lợi, môi trường làm việc, cơ hội thăng tiến,… trước khi quyết định nhảy việc để không “mất cả chì lẫn chài”.

Tạo CV online miễn phí

Nhảy việc như thế nào cho KHÉO?

Nhảy việc một cách văn minh và tinh tế là điều không phải ai cũng biết. Việc nhảy việc khéo léo sẽ giúp bạn để lại ấn tượng tốt với công ty và đồng nghiệp cũ.

Thông báo với người quản lý

Lên kế hoạch cho cuộc trò chuyện với người quản lý của bạn về quyết định nghỉ việc và ý định rời đi. Thể hiện sự biết ơn với công ty và cơ hội đã được cung cấp, và giải thích lý do bạn muốn tiến xa hơn trong sự nghiệp. Hãy lựa lời khi nói về các lý do nghỉ việc chẳng hạn như “không cùng định hướng” hoặc bạn mong muốn được “trải nghiệm nhiều thứ mới mẻ hơn”.

Gửi email nghỉ việc và cảm ơn

Gửi email nghỉ việc và cảm ơn

Sau khi đã thông báo với quản lý của mình bước tiếp theo là gửi email thông báo nghỉ việc đến công ty. Nội dung email hãy ghi gõ thời gian bạn mong muốn nghỉ kèm theo lời cảm ơn đến công ty. Bạn cũng hãy thông báo đến đồng nghiệp, gửi lời cảm ơn và giữ liên lạc với họ nếu cần thiết.

Bàn giao công việc và chuyên nghiệp đến ngày cuối cùng

Đừng vì nghỉ việc mà xử lý công việc hời hợt, thiếu trách nhiệm. Bạn hãy bàn giao công việc một cách chi tiết nhất có thể để người vào sau có thể nắm bắt công việc một cách nhanh chóng.

Tóm lại

Trên đây là những chia sẻ cơ bản về cách nhảy việc chuyên nghiệp cũng như thời điểm phù hợp nhất để bạn nhảy việc. Mong rằng những chia sẻ trên sẽ giúp bạn đưa ra được quyết định tốt nhất cho sự nghiệp của mình. Đừng quên truy cập TopDev để cập nhật những thông tin mới nhất về việc làm IT để hỗ trợ quá trình nhảy việc được thuận lợi và nhanh chóng bạn nhé!

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

Xem thêm Top tìm việc IT lương cao HOT nhất trên TopDev

Top 5 kỹ năng quan trọng cần trang bị trong năm 2024

Top 5 kỹ năng quan trọng cần trang bị trong năm 2024

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

Năm 2023 là một năm được mọi người nhận định là nhiều khó khăn, có thể dễ dàng thấy ở các bài báo về làn sóng sa thải, cắt giảm chi tiêu dịp Tết. 2024 được dự báo là khó khăn có thể kéo dài. Tình hình kinh tế chung là thứ chúng ta không kiểm soát hoặc thay đổi được, nhưng sự phát triển của chính bản thân mỗi người chúng ta trong năm tới là thứ chúng ta có thể làm được. Dù năm tới kinh tế có thế nào thì mình tin rằng mỗi người vẫn có thể dành một phần thời gian để đầu tư cho bản thân, trang bị những kĩ năng mới để trở thành một người lao động tốt và giỏi hơn.

Từ kinh nghiệm làm công tác hướng nghiệp và nghiên cứu về chủ đề này trong nhiều năm qua, dưới đây là một số kĩ năng mình khuyến khích các bạn đọc nên dành thời gian phát triển trong năm tới.

1/ Hiểu biết và ứng dụng AI

Bạn có biết đến ChatGPT hoặc một phần mềm tương tự không? Nếu có thì tốt, nếu không thì bạn nên tìm hiểu dần.

Nếu đã biết đến ChatGPT rồi, bạn đã sử dụng ChatGPT nhiều chưa? Nếu chưa thì năm 2024 hãy bắt đầu học cách sử dụng nhiều hơn nữa.

Công nghệ AI đang len lỏi rất nhanh vào các phần mềm chúng ta sử dụng hằng ngày. Bây giờ mỗi lần viết email tiếng Anh, mình dùng ChatGPT. Cần lên ý tưởng bài blog mới, mình hỏi ChatGPT. Cần một ý tưởng hình ảnh thiết kế, mình dùng Canva AI. Họp Zoom xong mình không cần viết báo cáo vì đã có Zoom AI viết báo cáo hộ.

Việc bạn cần làm bây giờ là thử rà soát xem trong cuộc sống và công việc hàng ngày từ khi mở mắt ra đến khi đi ngủ, mình có đang ứng dụng công nghệ AI vào việc gì không? Nếu không, mình có thể thử ứng dụng làm gì không? Ví dụ, bạn có thể cho ChatGPT biết về thực trạng sức khỏe và mục tiêu sức khỏe, từ đó ChatGPT có thể lên cho bạn lịch tập và ăn uống (xem hình bên dưới).

Hiểu biết và ứng dụng AI

2/ Xây dựng nội dung trên mạng xã hội

Khi mà nhà nhà người người đang làm nội dung trên mạng xã hội thì mình nghĩ rằng bạn không nên ngồi không vì như vậy bạn đang bỏ qua rất nhiều cơ hội tốt có thể đến.

Khi nghe đến xây dựng nội dung trên mạng xã hội, bạn đừng vội và chỉ nghĩ đến việc trở thành người nổi tiếng hàng triệu người theo dõi và bị chửi mỗi ngày trên mạng. Nếu bạn không thích, bạn không cần trở thành một người như thế.

Những nội dung bạn chia sẻ có thể chỉ tiếp cận đến một nhóm vài người thực sự quan tâm. Mà nếu không ai quan tâm thì cũng không sao cả, cứ chia sẻ để tự mình đọc, vài năm sau mình đọc lại để thấy mình đã phát triển thế nào, tư duy của mình đã lớn hơn ra sao.

Học cách chia sẻ những gì mình biết cũng là một kĩ năng. Bạn có thể viết lách blog giống mình, hoặc thu Podcast (dùng ứng dụng Spotify Podcaster), hoặc làm video trên các kênh Tiktok – Youtube. Cách nào bạn cảm thấy thoải mái nhất thì làm, không cần phải bắt chước người khác.

Nội dung ban đầu mình làm có thể dở, nhưng từ từ câu từ mình sẽ gẫy gọn hơn, giọng nói Podcast sẽ hay hơn hoặc video sẽ thú vị hơn. Hãy cứ nhớ là mình chia sẻ cho mình xem trước, đừng quan tâm đến lượt like lượt view vội.

  Cách Viết Summary Trên LinkedIn Để Thu Hút Các Nhà Tuyển Dụng

  Tối ưu hóa CV bằng ChatGPT: Gây ấn tượng nhà tuyển dụng ngay từ lần đầu

3/ Hiểu và quản trị cảm xúc, sẵn sàng thích nghi

Khi mọi thứ xung quanh từ tình hình kinh tế, chính trị đến con người thay đổi mỗi ngày, thứ chúng ta kiểm soát được là cảm xúc của chúng ta.

Thực ra dùng từ “kiểm soát cảm xúc” cũng không đúng đâu, vì nhiều khi cảm xúc đến bất chợt ngoài tầm kiểm soát của mình. Tuy nhiên mình có thể học cách hiểu về cảm xúc. Đầu tiên mình nhận diện được cảm xúc, biết khi nào mình đang vui-buồn-giận-hờn và nhiều loại cảm xúc được. Các cảm xúc đó được biểu hiện ra bên ngoài cơ thể và bên trong như thế nào. Khi hiểu được cảm xúc mình có thể suy nghĩ tiếp đến cách xử lý cảm xúc đó.

Để hiểu về cảm xúc bạn có thể cân nhắc tìm học một khóa học trực tuyến về Emotion Intelligence, hoặc một khóa học của một trung tâm đào tạo tâm lý hoặc đọc một số đầu sách như theo gợi ý bên dưới:

Việc làm AI lương thưởng hấp dẫn, mới nhất dành cho bạn!

4/ Ngoại ngữ thứ hai, ngoại ngữ thứ ba

học ngoại ngữ

Nói về tầm quan trọng của Ngoại ngữ có lẽ hơi thừa vì chúng ta đã đọc quá nhiều bài viết về sự quan trọng này rồi.

Nếu tiếng Anh bạn chưa đạt khoảng IELTS 5.5 hãy cố gắng đạt con số này. Đây là mức ngoại ngữ cơ bản để bạn sử dụng khi đi làm việc. Cao hơn thì càng tốt.

Nếu đã biết tiếng Anh ở mức độ cơ bản, bạn có thể cân nhắc học thêm một ngôn ngữ mới dựa trên lĩnh vực bạn đang làm, hoặc đơn giản dựa trên sở thích. Ví dụ những bạn làm kinh doanh buôn bán có thể thích tiếng Trung, các bạn làm du lịch có thể học tiếng Nhật, Hàn, hoặc như mình học tiếng Tây Ban Nha đơn giản là vì mình thích.

5/ Xây dựng mối quan hệ mới dưới nhiều hình thức khác nhau

Mình là người hướng nội, mình hiểu cảm giác của nhiều bạn đọc khi nghe đến chữ xây dựng mối quan hệ là ngại. Ngại phải đi sự kiện, nói chuyện xã giao với nhiều người.

Tuy nhiên trừ khi bạn là chuyên gia cực đỉnh trong ngành, còn nếu muốn có nhiều cơ hội và thành công trong ngành thì cần có mạng lưới quan hệ. 9/10 công việc gần nhất của mình đến từ quan hệ và người giới thiệu.

Một số cách bạn vẫn có thể mở rộng mối quan hệ qua màn hình máy tính là:

  • Kết nối với mọi người trên LinkedIn
  • Tìm một chương trình mentor và tham gia
  • Tham gia các lớp học, hội thảo trực tuyến

Chúc các bạn có một năm 2024 rực rỡ.

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

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

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

Các thuật toán tìm ước chung lớn nhất trong Java

Các thuật toán tìm ước chung lớn nhất trong Java

Bài viết được sự cho phép bởi tác giả Sơn Dương

Nằm trong series học thuật toán – cấu trúc dữ liệu và giải thuật, chúng ta cùng nhau tìm hiểu các phương pháp để tìm ước chung lớn nhất, code được minh họa bằng Java.

Trước hết, chúng ta cùng nhau tìm hiểu lý thuyết trước đã nhé.

Định nghĩa ước chung lớn nhất

Trước khi hiểu ước chung lớn nhất, bạn cần phải biết ước số là gì? Đơn giản lắm, ước số của một số nguyên a là số nguyên b khi và chỉ khi số a chia hết cho số b.

Ước chung lớn nhất (GCD – Greatest Common Divisor) của hai hay nhiều số nguyên là số lớn nhất trong tập hợp ước chung.

Ngược với ước chung lớn nhất là bội số chung nhỏ nhất. Mình sẽ dành riêng bài viết sau để hướng dẫn sử dụng thuật toán để tìm bội số chung nhỏ nhất. Các bạn đón đọc nhé.

Ứng dụng thực tế của ước chung lớn nhất (UCLN)

Với nhiều ứng dụng thực tế, ước chung lớn nhất không chỉ dùng trong lĩnh vực toán học, mà cả các lĩnh vực khác nữa, liên quan đến nhiều sự vật, hiện tượng trong đời sống.

Mình lấy ví dụ minh họa nhé:

Tôi chán làm dev, bỏ về quê chăn thỏ làm giàu. Đố bạn biết tôi đang nuôi bao nhiêu con thỏ? Dữ liệu cho bạn đây: Hàng này tôi luôn bỏ ra 6 cây súp lơ, 8 củ cà rốt làm thức ăn cho chúng. Mỗi con thỏ đều được thưởng thức cả súp lơ và cà rốt. Trong đó, số lượng súp lơ và cà rốt ăn được phải bằng nhau. Tất nhiên, không được bỏ thừa bất kỳ đồ ăn nào cả. Thế mới khó chứ.

Với bài toán thực tế này, bạn chỉ cần sử dụng UCLN là giải được (Gợi ý đáp án: 2 con thỏ).

  Giải thích thuật toán Dijkstra – Tìm đường đi ngắn nhất

  Thuật toán Brute Force và bài toán Trapping Rain Water

Các thuật toán tìm ước chung lớn nhất

Để minh họa cho thuật toán tìm UCLN, chúng ta sẽ sử dụng ngôn ngữ Java cho quen thuộc.

Dưới đây là một số thuật toán tìm UCLN.

#1 – Sử dụng thuật toán vét cạn

Trong các thuật toán, có lẽ thuật toán vét cạn là thuật toán “nông dân” nhất, thủ công nhất. Mọi người hay đùa nhau, thuật toán vét cạn là thuật toán cứ tay to là thắng, khỏi cần suy nghĩ gì cả, kiểu “cần cù bù siêng năng”.

Với bài toán này, giả sử tìm UCLN của hai số nguyên (a, b). chúng ta sẽ tiến hành lặp từ 1 tới số nhỏ hơn trong hai số (a,b) và kiểm tra xem các số nguyên (a, b) có chia hết cho chỉ số index không? Chỉ số lớn nhất mà (a,b) chia hết chính là UCLN.

Cài đặt thuật toán bằng Java.

public static int gcdByBruteForce(int a, int b) {
        int gcd = 1;
        for (int i = 1; i <= a && i <= b; i++) {
            if (a % i == 0 && b % i == 0) {
                gcd = i;
            }
        }
}

Độ phức tạp của thuật toán là: O(min(a, b))

Tham khảo việc làm Java hấp dẫn trên TopDev

#2 – Tìm UCLN sử dụng thuật toán Euclid

Tìm UCLN của hai số nguyên (X,Y), giả sử x > y. Để tìm UCLN, chúng ta tiến hành chia x cho y, được phần nguyên a và số dư b (b>= 0). Ta có sơ đồ cho thuật toán Euclid như sau:

Sơ đồ thuật toán Euclid
Sơ đồ thuật toán Euclid

Cài đặt giải thuật bằng Java theo cách đệ quy.

/*
 * Java method to find GCD of two number using Euclid's method
 * @return GDC of two numbers in Java
 */
private static int findGCD(int x, int y) {
    //base case
    if(y== 0){
        return x;
    }
    return findGCD(y, x%y);
}

Nếu bạn không thích đệ quy, có thể dùng vòng lặp while như sau:

// Code from https://vntalking.com
public static int findGCD(int x, int y) {
    int temp;
    while(y!= 0) {
        temp = x % y;
        x= y;
        y= temp;
    }
    return x;
}

Độ phức tạp thuật toán: O(Log min(x, y))

#3 – Thuật toán Stein (Binary GCD)

Cuối cùng, mình muốn giới thiệu thêm thuật toán stein hay còn gọi là thuật toán Binary GCD để tìm ước chung lớn nhất của hai số nguyên dương.

Thuật toán này sử dụng phép toán số học đơn giản như dịch số, so sánh và phép trừ.

Các bước của thuật toán:

  • gcd(0, 0) = 0, gcd(n1, 0) = n1, gcd(0, n2) = n2
  • Khi cả n1 và n2 đều là số nguyên chẵn thì gcd(n1, n2) = 2 * gcd(n1/2, n2/2) vì số chẵn luôn chia hết cho 2.
  • Nếu n1 là số nguyên chẵn, còn n2 là số lẻ thì gcd(n1, n2) = gcd(n1/2, n2)
  • Nếu cả n1 và n2 là số lẻ, và n1 >= n2 thì gcd(n1, n2) = gcd((n1-n2)/2, n2).

Sau đây là cài đặt thuật toán bằng Java.

public static int gcdBySteinsAlgorithm(int n1, int n2) {
        if (n1 == 0) {
            return n2;
        }

        if (n2 == 0) {
            return n1;
        }

        int n;
        for (n = 0; ((n1 | n2) & 1) == 0; n++) {
             n1 >>= 1;
             n2 >>= 1;
        }

        while ((n1 & 1) == 0) {
             n1 >>= 1;
        }

        do {
           while ((n2 & 1) == 0) {
               n2 >>= 1;
           }

           if (n1 > n2) {
               int temp = n1;
               n1 = n2;
               n2 = temp;
           }
           n2 = (n2 - n1);
        } while (n2 != 0);

        return n1 << n;
}

Độ phức tạp thuật toán: O((log2n1)2) hoặc O((log2n2)2) tùy vào n1> n2 hay ngược lại.

Lời kết

Trên đây, mình đã giới thiệu 3 thuật toán phổ biến nhất để tìm UCLN của hai số nguyên. Trong đó, mình có minh họa bằng Java, nếu bạn thích C++ thì để lại comment bên dưới để mình chuyển sang C++ nhé.

Những thuật toán trên cũng rất hay được sử dụng trong các bài toán tìm kiếm. Rất mong bài viết này hữu ích với bạn!

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

Xem thêm:

Tham khảo ngay việc làm IT mọi cấp độ trên TopDev!

Bí quyết xây dựng “networking” để tìm việc hiệu quả?

Bí quyết xây dựng

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

Trong một số bài viết trước đây trên blog về chiến lược tìm việc, mình đã chia sẻ rằng bên cạnh kiến thức và kĩ năng chuyên môn cũng như một bản CV tốt, một bạn đang đi tìm việc nên dành thời gian để mở rộng mạng lưới quan hệ (networking) của bản thân. Tìm việc qua mạng lưới quan hệ hiệu quả hơn nhiều lần và cho công việc tốt hơn rất nhiều so với việc nộp đơn.

Vấn đề là khi nghe lời khuyên rằng phải mở rộng mạng lưới quan hệ đi, nhiều bạn biết rằng việc này quan trọng nhưng NGẠI, đặc biệt là những bạn hướng nội (giống như mình). Ngại tiếp cận người lạ, ngại nhờ vả người khác cùng nhiều cái ngại khác mà mỗi người mỗi kiểu.

Mình cũng ngại xây dựng mạng lưới quan hệ, nhưng thực tế từ trải nghiệm của bản thân và quan sát từ mọi người xung quanh mình thấy rằng việc có mạng lưới quan hệ tốt rất quan trọng. Mình trải nghiệm hơn chục công việc khác nhau từ khi ra trường đến nay, hơn nửa trong số đó là được giới thiệu hoặc ai đó biết đến mình. Mình cũng hướng nội giống nhiều bạn, bảo mình đi tham gia một sự kiện rồi bắt chuyện với người lạ xem ra có vẻ quá sức. Vì vậy bài viết này mình chia sẻ lại một số tips nhanh để mở rộng mối quan hệ, giúp các bạn bớt ngại hơn trong việc xây dựng networking.

1/ Tiếp cận qua LinkedIn

Nếu bạn ngại gặp trực tiếp và là kiểu ‘anh hùng bàn phím’ giống mình, tự tin hơn qua tin nhắn thì có một cách đó là tiếp cận và mở rộng mạng lưới quan hệ qua mạng xã hội LinkedIn. Trước khi bắt đầu mở rộng mạng lưới quan hệ trên này, bạn phải có một profile đẹp và xịn trước đã. Cũng như đời thực thôi, trông profile bạn ngon nghẻ thì người khác cũng dễ dàng chấp nhận lời mời kết bạn của bạn hơn.

Sau khi bạn đã có cho mình một profile ổn áp trên LinkedIn rồi, bạn có thể bắt đầu tìm kiếm và kết nối với những người phù hợp. Một số chiến lược kết nối bạn có thể làm đấy là:

  • Tìm trên thanh tìm kiếm [tên vị trí] hoặc [tên lĩnh vực] mà bạn đang hướng tới. Ví dụ bạn đang muốn làm nhân sự, bạn tìm [human resource] để cho ra những người đang làm công việc đó có profile LinkedIn và kết nối.
LinkedIn
  • Một cách khác là bạn tìm [tên công ty] bạn đang quan tâm, sau đó ấn vào page công ty đó, vào phần People. Tại đây bạn có thể gõ [tên vị trí] để tìm ra những người làm ở vị trí đó trông công ty đó, hoặc gõ [tên trường bạn học] để tìm ra những cựu sinh viên trường mình đang làm ở công ty đó và kết nối. Ví dụ mình tìm những người học RMIT đang làm ở Unilever quốc tế thì ra 30 người
LinkedIn

  5 bí quyết tìm việc IT cho đợt tuyển dụng đầu năm mới

  Cách Viết Summary Trên LinkedIn Để Thu Hút Các Nhà Tuyển Dụng

2/ Tiếp cận qua Mentors

Nếu bạn muốn có cơ hội xây dựng mạng lưới quan hệ với những người kiểu CEO, Managers thì có một cách là tiếp cận qua các chương trình Mentor. Ở các chương trình Mentor, những người đăng ký làm mentor thường là những người khá thành công, họ muốn chia sẻ lại cộng đồng, vì vậy tiếp cận họ cũng dễ dàng hơn. Cách làm là bạn tìm một chương trình mentor, tìm cho mình 1-2 mentors phù hợp, kết nối và kết bạn với họ, sau đó có thể nhờ họ kết nối thêm với những người khác phù hợp trong mạng lưới của họ cho bạn. Như vậy sẽ giống kiểu ‘bán hàng đa cấp’, từ một mối quan hệ nhân lên nhiều mối quan hệ khác.

Một số chương trình mentor mà bạn có thể tham khảo là:

– RMIT Career Mentoring Asia – chỉ dành riêng sinh viên RMIT, mình đang là coordinator

– Menteelogy của Ybox – có rất nhiều mentor ở nhiều lĩnh vực

– SME Mentoring – phù hợp cho các bạn nào thích khởi nghiệp

– Mentori – cũng có kha khá mentors trên này

Tham khảo việc làm Java hấp dẫn trên TopDev!

3/ Tiếp cận lại những mối quan hệ cũ qua email / tin nhắn

Nếu bạn ngại chưa dám bắt đầu xây dựng mối quan hệ với người mới thì một cách là bạn tiếp cận lại những người cũ. Người cũ có thể là thầy cô, bạn bè, sếp, đồng nghiệp cũ – bất kì ai đang đi làm cũng có khả năng giới thiệu việc làm cho bạn.

Trước khi tiếp cận thì bạn nên chuẩn bị một bản CV tốtNgoài ra bạn cũng nên biết rõ mình đang muốn tìm kiếm công việc gì, ngành nghề gì, càng cụ thể rõ ràng bao nhiêu càng tốt bấy nhiêu.

Khi bạn đã có những thông tin cụ thể, bạn có thể nhắn tin hoặc email lại những contact cũ. Cứ thẳng thắn nói về việc bạn đang tìm việc với nhu cầu như thế, nếu họ có cơ hội, hoặc biết ai có cơ hội xin hãy giới thiệu cho bạn. Chắc chắn những người quý mến bạn sẽ chẳng cảm thấy phiền nếu nhận lời ‘nhờ vả’ như vậy đâu.

Trên đây là một số tips để tạo dựng mối quan hệ phục vụ cho mục đích tìm việc, hi vọng những chia sẻ của mình sẽ có ích cho các bạn.

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

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

Xem thêm Top tìm việc IT lương cao HOT nhất trên TopDev

Một số thứ để nhanh vượt qua giai đoạn Junior/Fresher

Một số thứ để nhanh vượt qua giai đoạn Junior/Fresher hơn

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

Tại sao nên đọc bài này?

  • Nếu bạn đang là Junior/Fresher, mới đi làm bla bla để mau chóng giỏi hơn.

Tôi đang ở đâu và tôi cần gì?

Đầu tiên khi đi làm bạn cần phải biết rõ là mình đang ở đâu và mình đang cần gì? VD như … “Em đã học xong HTML/CSS bây giờ em muốn học xong JS luôn”

Khi đi làm cũng vậy, mình nên biết bản thân mình đang ở đâu, bao gồm kiến thức, kĩ năng và thái độ khi làm việc, với những kiến thức và kĩ năng như vậy thì mình có thể làm được công việc gì. Đồng thời ở cột mốc như vậy mình sẽ muốn làm gì tiếp theo? Có thể là code tốt hơn, ít bug hơn, clean hơn… hay xa hơn xíu là muốn trở thành leader, senior, manager,…

Tại sao phải biết rõ hai thứ đó? Vì nó sẽ giúp bạn biết bạn bắt đầu với vạch xuất phát ở đâu và đích đến của bạn là gì, tránh tình trạng kiểu như:

  • Em làm hoài mà không được tăng lương
  • Em làm hoài mà thấy mình không giỏi lên được, bữa giờ chỉ làm đi làm lại một vài thứ
Junior/Fresher
Một câu chuyện hơi buồn mà mình tình cờ thấy được
BTW, mình thấy khá vui vì bạn nhận ra level không phụ thuộc vào số năm kinh nghiệm

Để nhanh hết Junior/Fresher hơn

Đầu tiên là bạn phải trau dồi đủ kiến thức và kĩ năng để nhanh vượt qua mốc này hơn rồi, cái này cũng sẽ có cách để cho các bạn đi nhanh hơn nhưng mình xin nói ở một bài khác nhé. Bài này mình sẽ tập trung vào một số soft skill, thái độ khi làm việc mà mình thấy có ích và giúp các bạn nhanh thoát khỏi Junior/Fresher hơn thôi
  Fresher là gì? Các kỹ năng và công việc của Fresher

Tập trung vào kết quả

Cái này là đi làm và bạn không thể có được 0.5đ cho sự cố gắng như làm đại một cái mở bài trong kì thì Văn. Mọi thứ bạn làm bây giờ liên hệ trực tiếp tới kết quả bạn làm ra, nó không quan tâm bạn phải tốn bao nhiêu đêm ngủ muộn để debug, không quan tâm tới việc bạn đang ốm vẫn phải oằn mình ra làm cho xong deadline, thứ duy nhất tồn tại là kết quả thôi.

Junior/Fresher

Do đó một mindset các bạn cần phải thay đổi là tập trung nhiều hơn vào kết quả mà mình làm ra như là:

  • Xem task mình làm có giúp ích được cho feature, goal của prj/product không? Suy nghĩ xem nó giúp ích cho user như thế nào
  • Nếu gặp khó khăn không thể giải quyết thì phải hỏi ngay người support vì kết quả công việc cần đúng tiến độ chứ không phải tự mò rồi trượt deadline
  • Tôi đóng góp gì được trong team? Có ảnh hưởng gì
  • v…v

Việc mình nói “tập trung” nghĩa là bạn hãy toàn tâm với kết quả của công việc đó, đừng vì cái tôi mà cố gắng cãi một anh chị senior vì một vấn đề gì đó, hãy hỏi tại sao nên làm như vậy và nó ảnh hưởng tới kết quả ra sao

Thường mình thấy các bạn mới (ngay cả mình hồi xưa) có trải nghiệm khá fun là dành cả 2-3 ngày làm một task gì đó, khoe với team xong rồi bị một anh senior vào feedback và đưa ra hướng giải quyết gọn gàng, đơn giản hơn, nhiều khi là không cần làm task đó nữa. Nhưng vì đã tốn khá nhiều thời gian cho nó nên cực kì tiếc khi nhận negative feedback như vậy hay là bị xóa đi những dòng code thân thương.

Hãy cố gắng tách bạch ra hai thứ khi làm việc: Quá trình và kết quả. Quá trình thì hãy toàn tâm cho nó, khi có kết quả thì hãy suy nghĩ lại xem mình có thể làm gì tốt hơn?

  Các cấp bậc: Fresher, Junior, Senior là gì?

  Học như thế nào là đủ để có thể đi thực tập/fresher anh/bạn/em ơi ?

Quy trình khi nhận việc

Don’t: Nhận task → Đọc sơ → Làm → Nhận feedback sai, hoặc code thiếu case, hoặc bug → Buồn → trầm cảm

✅ Do: Nhận task → Đọc kĩ càng → Suy nghĩ giải pháp → Clarify một số case có thể chưa được mô tả rõ ràng → Confirm giải pháp với một senior (trong case bạn thấy task này khá lớn và fuk tạp) → Code → Nhận feedback → Sửa → Release

Do các bạn đang là Junior/Fresher nên việc nhận feedback tệ là chuyện diễn ra khá là phổ biến (em làm cái này sai rồi, em làm cái này thiếu rồi, còn case này em handle chưa?,…) do đó việc mình suy nghĩ về task trước, confirm lại với PM và Senior sẽ giúp các bạn bớt nhận lại những feedback tiêu cực, đồng thời cũng giúp các bạn suy nghĩ kĩ càng về task cần làm hơn. Ngoài ra các anh chị đó còn giúp bạn phát hiện ra những chỗ còn thiếu, nhưng unseen issue nếu implement giải pháp đó.

Quy trình khi nhận việc

Thật ra cái process ở trên sẽ được apply mọi ở mọi level nhưng mình thấy các bạn Junior/fresher thì chưa biết tới hoặc chưa thấy nó hiệu quả. Thực tế khi đi làm bạn sẽ gặp phải những vấn đề khá chung chung và không có đáp số riêng như hồi còn đi học, do đó bạn sẽ phải là người làm rõ đề bài, đưa ra giải pháp, đáp số và do đó, quá trình làm rõ đề bài gần như là quá trình quan trọng nhất.

Xem việc làm IT fresher đãi ngộ tốt trên TopDev

Làm bài tập về nhà

Khi bắt đầu làm một thứ gì đó là lần đầu, hoặc nó khá lớn hay quan trọng hay đảm bảo mình đã làm bài tập về nhà cho nó.

Ví dụ khi lần đầu được giao một công việc mới, hay tự search google xem công việc đó là như thế nào, đối với context trong công ty, dự án thì apply ra sao rồi đi confirm với một người hướng dẫn mình.

Làm bài tập về nhà
Đi làm không cấm bạn mang phao

Khi gặp một vấn đề gì nan giải, hay đảm bảo bạn dành đủ thời gian để tự tìm hiểu về vấn đề đó như thế nào, có các cách giải quyết gì, kết quả công việc đó ảnh hưởng tới ai

Bằng việc do homework, các bạn sẽ có cái nhìn toàn diện hơn về vấn đề mà mình cần giải quyết, và thường là kiểu gì bạn sẽ tìm ra được một vài đáp án nhưng bạn không biết đáp án nào phù hợp. Do đó bạn sẽ có thể biết được pros/cons của từng giải pháp và dựa vào kinh nghiệm của các anh chị đi trước để có một giải pháp ok nhất.

Hãy biến bản thân thành một version độc lập nhất có thể, vì sẽ tới lúc bạn chả thể hỏi ai cả và bạn là người duy nhất chịu trách nhiệm cho quyết định của bạn

Giao tiếp hiệu quả

Cái này thì mình cũng đã có một bài riêng cho nó rồi, và vì nó quan trọng nên mình nhắc lại trong đây.

Biết luật chơi

Hãy tập quan sát khi bạn bắt đầu tham gia vào một công ty, một team.

  • Hãy em coi anh leader thường làm gì? Vấn đề mà anh ấy quan tâm là gì?
  • Xem coi anh backend thường nhận task như thế nào? Clarify task làm sao
  • Coi xem bạn bên Design hay thường vẽ theo parttern gì?
  • Có ông nào đi làm thì gáy to nhưng lúc làm không ra gì?
  • v…v

Bằng việc tập quan sát mọi thứ, bạn biết được mối quan tâm, hay lọ ngại của từng phòng ban là gì, từ đó sau này sẽ giúp ích cho bạn hơn khi phải làm việc với những bên liên quan như vậy

Junior/Fresher

Bạn tham gia vào một team, một công ty nghĩa là bạn đang là một bánh răng chạy trong bộ máy đó, việc bạn biết các bánh răng khác hoạt động và lắp ghép như thế nào sẽ giúp bạn tự mài dũa bánh răng của bản thân cho phù hợp hơn với bộ máy đang vận hàng

Tổng kết

Junior/Fresher

Khó không? Khó! Cái gì cũng thiếu, cái gì cũng không biết, cái gì làm cũng bị chê nhưng cuộc sống là vậy. Hồi mình mới đi làm mình cũng bị vậy, cũng buồn, cũng chầm kẻm, nhưng kiểu gì thì cũng vượt qua thôi. Đó là lý do mình viết bài này để các bạn bớt khổ hơn xíu.

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

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

Xem thêm việc làm IT hàng đầu hot nhất trên TopDev

Đón Tết Giáp Thìn, Nhận quà Xịn Mịn

Nhân dịp Tết Giáp Thìn, TopDev mang đến chương trình ‘Đón Tết Giáp Thìn, Nhận Quà Xịn Mịn‘ với những phần quà hấp dẫn. Hãy cùng TopDev tận hưởng không khí rộn ràng của mùa Xuân, và nhận ngay những món quà đặc biệt để khởi đầu năm mới với nhiều niềm vui, thành công và sự nghiệp tấn tới.

Danh sách người dùng may mắn trúng giải:

Giải Phần quà Email
Tuần 1 Nhất 1
Nhất 2
May mắn 1
May mắn 2
May mắn 3
May mắn 4
May mắn 5
May mắn 6
May mắn 7
May mắn 8
May mắn 9
May mắn 10
01 cặp vé xem phim tại rạp CGV
01 cặp vé xem phim tại rạp CGV
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
– 21***67@student.hcmute.edu.vn
– ha***02@gmail.com
– tr***63@gmail.com
– da***on@gmail.com
– nt***01@gmail.com
– la***97@gmail.com
– vm***ov@gmail.com
– bu***70@gmail.com
– ng***01@gmail.com
– ca***99@gmail.com
– ng***ti@gmail.com
– 21***95@student.hcmute.edu.vn
Tuần 2 Nhất 1
Nhất 2
May mắn 1
May mắn 2
May mắn 3
May mắn 4
May mắn 5
May mắn 6
May mắn 7
May mắn 8
May mắn 9
May mắn 10
01 cặp vé xem phim tại rạp CGV
01 cặp vé xem phim tại rạp CGV
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
– cvvq610@gmail.com
– nthieu9208@gmail.com
– nguyenduy4994@gmail.com
– tranhoaitam.123@gmail.com
– phuongnamvu17@gmail.com
– tomnguyen023@gmail.com
– danhquocksoft@gmail.com
– hoanggia29101996@gmail.com
– thanh140402@gmail.com
– luongdong059@gmail.com
– 29.hoang.10@gmail.com
– hmaiknight@gmail.com
Tuần 3 Nhất 1
Nhất 2
May mắn 1
May mắn 2
May mắn 3
May mắn 4
May mắn 5
May mắn 6
May mắn 7
May mắn 8
May mắn 9
May mắn 10
01 cặp vé xem phim tại rạp CGV
01 cặp vé xem phim tại rạp CGV
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
01 voucher Starbucks
– trananhtien124@gmail.com
– anhbang3061992@gmail.com
– loc7102010@gmail.com
– nqkhanh0109@gmail.com
– camvanmimi09@gmail.com
– phongmhp@gmail.com
– thanhlong.here@gmail.com
– ngoisaobaccuc200@gmail.com
– vietdova219@gmail.com
– phanduylinh43@gmail.com
– quocanhvuong111@gmail.com
– quynhhoa3011lk@gmail.com
Tuần 4

Kỹ thuật phân trang với PHP và MySQL

Kỹ thuật phân trang với PHP và MySQL

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

Áp dụng kỹ thuật phân trang là một phần quan trọng với bất kỳ ngôn ngữ lập trình web nào. Phân trang với PHP và Mysql có nhiều cách làm. Thế nhưng, với các bạn mới tiếp xúc thì chắc chắn đôi lúc gặp khó khăn về cách xử lý. Trong bài này mình sẽ hướng dẫn các bạn một cách đơn giản nhất của kỹ thuật phân trang trong php kết hợp với mysql.

Phân trang giúp giảm thời gian tải cho website, nâng cao hiệu suất. Từ đó, giúp website đạt thứ hạng cao hơn về tính thân thiện người dùng.

Trong bài này, mình sẽ thao tác với table `students` có 40 dòng dữ liệu. Mỗi trang ta sẽ lấy ra và hiển thị 10 dòng dữ liệu.

Để thực hiện phân trang trong PHP chúng ta cần xác định 2 giá trị quan trọng sau:

– Số lượng bản ghi bạn mong muốn hiển thị trên 1 trang là bao nhiêu ($limit). Bài này, mình sử dụng `$limit = 10`

– Chúng ta đang có tổng cộng bao nhiêu bản ghi trong bảng dữ liệu. Từ đó ta có thể tính toán xem bao nhiêu trang sẽ hiển thị.

  Cách sử dụng hàm isset trong PHP

  Lộ trình học MySQL từ A đến Z

Câu lệnh SQL để lấy ra tổng số bản ghi trong bảng như sau:

SELECT count(*) FROM `students`

Ta sẽ lấy ra được 40 dòng.

Tính số trang sẽ hiểu thị:

$total = 40;
$limit = 10;

$pages = ceil($total / $limit);

Ở đây, mình dùng hàm `ceil` để làm tròn lên. Vì có những trường hợp `40 < $total < 50` thì ta hiển thị là 5 page. Đúng không nào?

Ứng tuyển ngay các vị trí tuyển dụng MySQL mới nhất trên TopDev

Tiếp tục với câu SQL Query phân trang

SELECT * FROM `students` LIMIT $limit OFFSET $offset

Ở đây, ta thấy có 2 biến cần được truyền vào.

  1. Biến $limit : đây là giới hạn số bản ghi sẽ lấy ra trong câu lệnh sql. Nó đồng nghĩa với số lượng bản ghi mà ta muốn hiển thị trên 1 trang.
  1. Biến $offset : xác định vị trí lấy bản ghi bắt đầu từ vị trí nào trong bảng dữ liệu.

Xem thêm tuyển dụng PHP lương cao trên TopDev

Ở đây, ta sẽ để ý có 1 quy luật nhỏ thế này để có thể tính toán.

– Nếu page đầu tiên, offset page này sẽ là 0 (chúng ta lấy dữ liệu từ vị trí đầu tiên trong bảng dữ liệu)

– Page 2, offset lần này sẽ bắt đầu từ vị trí thứ 10

– Page 3, offset lần này sẽ bắt đầu từ vị trí thứ 20

– Tương tự như vậy cho đến page cuối cùng.

Chúng ta có thể thấy:

$offset = ($page - 1) * $limit;

Thông thường, biến page sẽ được truyền lên qua url. Nên bạn có thể lấy thông qua việc sử dụng hàm `$_GET[‘page’]` của PHP để lấy.

Tóm lại

Mình đã giới thiệu kỹ thuật phân trang với PHP và Mysql cơ bản, đơn giản nhất. Mình không đi vào cách code cụ thể trong php như thế nào. Như vậy, sẽ làm các bạn lười suy nghĩ để code cho chức năng hoạt động.

Hi vọng sẽ giúp bạn hiểu hơn và tự code cho mình để nhớ lâu và quan trọng là bạn có thể tự code.

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

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

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev

Ngăn xếp – Stack trong C++ là gì? Cài đặt và sử dụng Ngăn xếp

Cài đặt và sử dụng Ngăn xếp – Stack trong C++

Bài viết được tổng hợp bởi tác giả Sơn Dương và Khiêm Lê

Khi lập trình, chúng ta thường phải xử lý một lượng lớn dữ liệu thô và chưa được tổ chức. Điều này đỏi hỏi cần một cấu trúc dữ liệu để lưu dữ liệu và cho phép người dùng thao tác trên dữ liệu một cách hiệu quả. Bài viết hôm nay, chúng ta sẽ cùng nhau tìm hiểu một loại cấu trúc dữ liệu rất phổ biến, đó là ngăn xếp stack trong C++.

Ngăn xếp – Stack là gì?

Ngăn xếp Stack là một cấu trúc dữ liệu tuyến tính hoạt động theo nguyên tắc LIFO (Last IFirst Out), nghĩa là các phần tử được đưa vào ngăn xếp cuối cùng sẽ là phần tử đầu tiên được lấy ra khỏi ngăn xếp.

Bạn có thể hình dung ngăn xếp stack như một chồng sách đặt trong một cái hộp. Khi thêm một sách mới thì nó sẽ được đặt lên trên, cuốn sách cuối cùng được đặt ở trên đỉnh cũng sẽ là cuốn được lấy ra đầu tiên.

ngăn xếp Stack trong C++

Như bạn thấy ở hình trên, phần tử cuối cùng sẽ là phần tử đầu tiên được lấy ra khỏi ngăn xếp stack.

Stack là một loại container trong thư viện STL ( hiểu đơn giản là dạng thùng chứa dữ liệu).

>> Bài viết liên quan: Queue C++ là gì? Cách cài đặt và sử dụng hàng đợi trong C++

Cách thao tác với Stack C++

Với ngăn xếp stack, chúng ta chỉ có các thao tác xử lý dữ liệu sau:

  • push(): Thêm một phần tử mới vào ngăn xếp, số phần tử ngăn xếp tăng lên 1.
  • pop(): Xóa một phần tử khỏi stack.
  • top(): Trả về giá trị của phần tử trên đỉnh của stack. Số phần tử ngăn xếp không thay đổi.
  • size(): Trả về kích thước của ngăn xếp
  • isEmpty(): Kiểm tra ngăn xếp stack có rỗng hay không (trả về một giá trị bool true (rỗng) hoặc false (không rỗng).
  • isFull(): Kiểm tra trạng thái stack đã đầy hay chưa (trả về một giá trị bool true (đầy) hoặc false (chưa đầy).

Các phương thức trên sẽ đều có độ phức tạp O(1).

>> Xem thêm: Phân biệt ngăn xếp và hàng đợi (Stack vs Queue) trong C++

Cài đặt ngăn xếp Stack trong C/C++

Chúng ta sẽ cùng nhau tìm hiểu cơ chế hoạt động của hai thao tác phổ biến nhất trên stack là Push() và Pop().

Lưu ý: Chúng ta thiết lập một con trỏ gọi là “top” để lưu trữ vị trí của phần tử trên cùng của stack. Điều này sẽ giúp thao tác thêm mới, xóa được thực hiện hiệu quả hơn.

Cấu trúc một phần tử

Tương tự với danh sách liên kết, phần tử trong ngăn xếp cũng có thành phần dữ liệu và thành phần liên kết. Để đơn giản, mình sẽ sử dụng kiểu int cho phần dữ liệu. Phần tử thêm vào đầu sẽ liên kết với phần tử phía dưới của stack qua thành phần liên kết là một con trỏ.

struct Node
{
    int data;
    Node *next;
};

Vậy để tạo một phần tử, chúng ta cấp phát động một phần tử, gán thành phần dữ liệu của phần tử đó bằng đối số truyền vào, phần tử mới chưa trỏ vào node nào nên phần liên kết gán bằng NULL và trả về địa chỉ của phần tử đó.

Node *CreateNode(int init)
{
    Node *node = new Node;
    node->data = init;
    node->next = NULL;
    return node;
}

Cấu trúc một ngăn xếp

Các phần tử trong ngăn xếp được xếp vào trên cùng, lúc lấy ra phần tử trên cùng cũng sẽ được lấy ra trước. Do đó, chúng ta chỉ cần nắm được phần tử trên cùng của stack là được. Mình sẽ tạo một struct có thành phần head là một con trỏ lưu địa chỉ của phần tử trên cùng của stack (head).

struct Stack
{
    Node *head;
};

Một stack mới khởi tạo đương nhiên sẽ không có phần tử nào, chúng ta sẽ khởi gán giá trị NULL cho head của stack đó.

void CreateStack(Stack &s)
{
    s.head = NULL;
}

Kiểm tra ngăn xếp rỗng

Để kiểm tra ngăn xếp rỗng (IsEmpty), đơn giản ta chỉ cần kiểm tra xem có phần tử trên cùng của stack hay không, nếu không có thì stack đó chắc chắn rỗng.

int IsEmpty(Stack s)
{
    if (s.head == NULL)
        return 1;
    return 0;
}

PUSH (thêm một phần tử vào ngăn xếp)

  • Đầu tiên, kiểm tra stack đã đầy hay chưa. Tức kiểm tra điều kiện tràn
  • Trong trường hợp ngăn xếp stack đã đầy, thoát thao tác với thông báo: “Stack đã đầy”.
  • Ngược lại, ngăn xếp chưa đầy, con trỏ “top” tăng lên 1, sau đó dữ liệu được thêm vào stack.

Dưới đây là code minh họa cho stack push c++:

void stack_data::push (int a)
{
    if(top >= 5)
    {
        cout << "Overflow\n";
    }
    else
    {
        data[++top] = a; 
    }
}

Tham khảo việc làm C++ Developer hấp dẫn tại TopDev

POP (lấy phần tử trên cùng ra khỏi ngăn xếp)

  • Trước tiên, kiểm tra xem ngăn xếp có rỗng hay không.
  • Nếu ngăn xếp bị rỗng, thoát thao tác với thông báo: “Ngăn xếp rỗng”.
  • Ngược lại, hiển thị giá trị phần tử đang được trỏ bởi con trỏ “top”. Sau đó giảm con trỏ “top” đi 1.

Code minh họa cho thao tác pop

int stack_data::pop ()
{
    if(top < 0)
    {
        cout << "Underflow\n";
        return 0;
    }
    else
    {
        int pop = data[top--];
        return pop;
    }
}

TOP (lấy giá trị phần tử trên cùng ngăn xếp)

Để lấy giá trị phần tử nằm trên cùng ngăn xếp (Top), chúng ta chỉ cần làm tương tự như lấy phần tử trên cùng ra khỏi ngăn xếp, nhưng chúng ta không hủy node đó đi.

int Top(Stack s)
{
    if (IsEmpty(s))
        return 0;
    return s.head->data;
}

Lưu ý: cần phân biệt giữa Pop và Top. Pop là lấy phần tử trên cùng ra khỏi ngăn xếp tức là trả về giá trị phần tử đó và hủy đi. Top chỉ trả về giá trị phần tử trên cùng mà không hủy phần tử đó.

Cuối cùng là chương trình cài đặt stack hoàn thiện như sau:

# include<iostream>
using namespace std;

class stack_data
{
    public:
    int top;
    int data[5]; 
    stack_data()
    {
        top = -1;
    }

    void push (int a);
    int pop ();
    void isEmpty();
    void isFull();
    void display();
};

void stack_data::push (int a)
{
    if(top >= 5)
    {
        cout << "Overflow\n";
    }
    else
    {
        data[++top] = a; 
    }
}

int stack_data::pop ()
{
    if(top < 0)
    {
        cout << "Underflow\n";
        return 0;
    }
    else
    {
        int pop = data[top--];
        return pop;
    }
}

void stack_data::isEmpty()
{
    if(top < 0)
    {
        cout << "Stack Underflow\n";
    }
    else
    {
        cout << "Stack can occupy elements.\n";
    }
}


void stack_data::isFull()
{
    if(top >= 5)
    {
        cout << "Overflow\n";
    }
    else
    {
        cout << "Stack is not full.\n";
    }
}


void stack_data::display()
{
    for(int i=0;i<5;i++)
    {
        cout<<data[i]<<endl;
    }
}

int main() {

    stack_data obj;
    obj.isFull();
    obj.push (40);
    obj.push (99);
    obj.push (66);
    obj.push (40);
    obj.push (11);

    cout<<"Stack after insertion of elements:\n";
    obj.display();

    cout<<"Element popped from the stack:\n";
    cout<<obj.pop ()<<endl;

}

Kết quả khi chạy chương trình trên sẽ như dưới đây:

Stack is not full.
Stack after insertion of elements:
40
99
66
40
11
Element popped from the stack:
11

Ứng dụng của Stack

Tùy vào mỗi yêu cầu cụ thể mà bạn sẽ sử dụng stack để giải quyết. Dưới đây là một số ứng dụng phổ biến của ngăn xếp stack.

  • Stack hay được dùng để hoán đổi vị trí của các phần tử trong Array hoặc String.
  • Một Stack có thể cần thiết trong tình huống cần Backtracking trong một số thuật toán.
  • Trong các ứng dụng kiểu như Text editor, các tính năng undo, redo có thể sẽ cần tới stack.
  • Chuyển đổi Infix/Prefix/Postfix trong Binary Trees.

Ứng dụng Stack để xử lý xâu trong C++

Để giải quyết bài toán tính giá trị biểu thức từ một xâu (string) trong C++ sử dụng cấu trúc dữ liệu Stack.

Bài toán: Cho xâu S chỉ gồm các số nguyên dương và các dấu “+”, “-“, “*”, “/” trong S không có dấu khoảng trống. Tính giá trị của biểu thức được biểu diễn bởi S đó.

  1. Sử dụng hai stack:
  • Một stack để lưu các số (values).
  • Một stack để lưu các toán tử (operators).

2. Duyệt qua từng ký tự của xâu S:

  • Nếu gặp một số, ta đọc toàn bộ số đó (vì số có thể có nhiều chữ số) và đẩy vào stack values.
  • Nếu gặp một toán tử, ta thực hiện các bước sau:
    • Kiểm tra độ ưu tiên của toán tử hiện tại với toán tử ở đỉnh stack operators.
    • Nếu toán tử ở đỉnh stack operators có độ ưu tiên cao hơn hoặc bằng toán tử hiện tại, thì thực hiện phép tính với hai số từ stack values và toán tử từ stack operators.
    • Đẩy toán tử hiện tại vào stack operators.

3. Xử lý phép toán còn lại: Khi duyệt hết xâu S, ta sẽ thực hiện các phép toán còn lại trong stack operators với các số trong stack values.

Code mẫu

#include <iostream>
#include <stack>
#include <string>
#include <cctype>  // For isdigit()

using namespace std;

// Hàm để thực hiện một phép tính cơ bản
int applyOperator(char op, int b, int a) {
    switch (op) {
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': return a / b;
    }
    return 0;
}

// Hàm để xác định độ ưu tiên của toán tử
int precedence(char op) {
    if (op == '+' || op == '-')
        return 1;
    if (op == '*' || op == '/')
        return 2;
    return 0;
}

int evaluateExpression(const string &S) {
    stack<int> values;     // stack để lưu các số
    stack<char> operators; // stack để lưu các toán tử

    for (int i = 0; i < S.length(); i++) {
        if (isdigit(S[i])) {
            int val = 0;
            // Đọc toàn bộ số nguyên (có thể có nhiều chữ số)
            while (i < S.length() && isdigit(S[i])) {
                val = (val * 10) + (S[i] - '0');
                i++;
            }
            values.push(val);
            i--; // Lùi lại một bước vì vòng lặp for sẽ tăng i thêm 1
        } else {
            // Nếu gặp một toán tử, xử lý các phép toán trước đó
            while (!operators.empty() && precedence(operators.top()) >= precedence(S[i])) {
                int val2 = values.top();
                values.pop();

                int val1 = values.top();
                values.pop();

                char op = operators.top();
                operators.pop();

                values.push(applyOperator(op, val2, val1));
            }
            operators.push(S[i]);
        }
    }

    // Thực hiện các phép toán còn lại trong stack
    while (!operators.empty()) {
        int val2 = values.top();
        values.pop();

        int val1 = values.top();
        values.pop();

        char op = operators.top();
        operators.pop();

        values.push(applyOperator(op, val2, val1));
    }

    // Kết quả cuối cùng sẽ nằm trên đỉnh stack values
    return values.top();
}

int main() {
    string S = "3+5*2-8/4";  // Ví dụ: Kết quả là 10
    cout << "Kết quả của biểu thức " << S << " là: " << evaluateExpression(S) << endl;
    return 0;
}

Giải thích

  • applyOperator: Hàm này thực hiện phép tính dựa trên toán tử và hai toán hạng.
  • precedence: Xác định độ ưu tiên của các toán tử, giúp xử lý đúng thứ tự các phép toán (* / trước, + – sau).
  • evaluateExpression: Duyệt qua xâu S, xử lý các số và toán tử theo thứ tự ưu tiên, kết quả cuối cùng sẽ được trả về từ stack values.

Ví dụ: Với xâu S = "3+5*2-8/4", quá trình xử lý sẽ:

  • Đầu tiên, 5*2 được thực hiện (do * có độ ưu tiên cao hơn +), sau đó là 8/4, cuối cùng là 3+10-2.
  • Kết quả cuối cùng sẽ là 11.

Độ phức tạp của các thao tác trong Stack

Độ phức tạp của push() và pop() là như nhau, đều là: O(1)

Lý do là việc thêm mới và xóa phần tử trong stack đều thực hiện ở một đầu – đỉnh của stack.

Lời kết

Như vậy, trong bài viết này, chúng ta đã hiểu được ngăn xếp stack C++ là gì, cách thức hoạt động cũng như ứng dụng của nó trong lập trình. Mình hi vọng, những kiến thức này sẽ giúp ích cho bạn trong các dự án sắp tới.

Hẹn gặp lại ở bài viết sau nhé.

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

Đừng bỏ lỡ công việc IT được cập nhật mỗi ngày trên TopDev

Giải thích thuật toán Dijkstra – Tìm đường đi ngắn nhất

Giải thích thuật toán Dijkstra – Tìm đường đi ngắn nhất

Bài viết được sự cho phép bởi tác giả Sơn Dương

Dijkstra là một trong những thuật toán rất nổi tiếng trong giới lập trình. Nghe tới những bài toán liên quan tới tìm đường đi ngắn nhất là nghĩ ngay tới thuật toán Dijkstra.

Thuật toán Dijkstra

Dijkstra là thuật toán được đặt tên theo nhà khoa học máy tính người Phần Lan, người đã phát minh ra nó. Thuật toán này nhằm mục đích tìm đường đi ngắn nhất trong đồ thị có cạnh với trọng số dương.

Tổng quan thuật toán Dijkstra

Trước khi đi vào chi tiết nội dung thuật toán, chúng ta cần phải hiểu những thuật ngữ sau:

  • Graph (đồ thị): Đồ thị là một cấu trúc dữ liệu phi tuyến tính được định nghĩa là G = (V, E), trong V là tập hợp hữu hạn các đỉnh (node), E là tập hợp hữu hạn các cạnh, cạnh là một đường nối giữa hai node với nhau.
  • Weighted graph (đồ thị có trọng số): Tương tự như đồ thị ở trên, chỉ khác là mỗi cạnh sẽ được gán thêm một trọng số. Kiểu như cùng một khoảng cách đi từ A đến B, nhưng đi đường đẹp thì nhanh hơn, đường làng nhiều ổ gà thì chậm hơn.
  • Connected graph (đồ thị liên thông): Một đồ thị được gọi là liên thông (connected) nếu có đường đi giữa mọi cặp đỉnh phân biệt của đồ thị. Ngược lại, đồ thị này được gọi là không liên thông.
  • Spanning tree (cây khung): một spanning tree của đồ thị G là cây con của đồ thị G, chứa tất cả các đỉnh của G. Nói cách khác, cây bao trùm của một đồ thị G là một đồ thị con của G, chứa tất cả các đỉnh của G, liên thông và không có chu trình. Cây bao trùm của đồ thị liên thông G cũng có thể định nghĩa như một đồ thị con không chu trình lớn nhất, hay một đồ thị con liên thông nhỏ nhất của G.

Thuật toán Dijkstra giải quyết bài toán gì?

Cho một đồ thị có trọng số (đặt tên là đồ thị G). Mục tiêu là tìm đường đi ngắn nhất từ một đỉnh cho trước đến các đỉnh còn lại của đồ thị G.

Thuật toán Dijkstra

Đồ thị G có các đặc điểm sau:

  • Gồm tập hợp các đỉnh (V)
  • Tập hợp các cạnh (E). Trong đó ký hiệu (q,r) là biểu diễn một cạnh nối giữa hai đỉnh q và r, cost(q,r) thì biểu thị trọng số của cạnh đó.

  Tìm hiểu về thuật toán đảo ngược chuỗi liên kết (Linked List)

  Thuật toán Brute Force và bài toán Trapping Rain Water

Ý tưởng thực hiện thuật toán Dijkstra

Thuật toán Dijkstra dựa trên nguyên tắc giảm bớt. Trong đó các giá trị chính xác hơn sẽ dần thay thế một giá trị gần đúng với khoảng cách chính xác cho đến khi đạt được khoảng cách ngắn nhất. Khoảng cách gần đúng tới mỗi định được ước tính lớn hơn nhiều khoảng cách thực và sẽ dần thay thế bằng giá trị nhỏ nhất của giá trị cũ bằng độ dài của một đường mới tìm được.

Thuật toán sử dụng hàng đợi ưu tiên kết hợp với thuật toán tham lam chọn đỉnh gần nhất chưa được xử lý và thực hiện quá trị giảm bớt này trên tất cả các cạnh mà nó duyệt qua.

Giả thuật các bước thực hiện:

Bước 1:  Đánh dấu tất các node dự kiến: Đặt khoảng cách từ nút nguồn tới nút 0 là nguồn, và đặt là vô hạn với các nút khác.

Bước 2: Tiến hành chạy lặp (loop):

  • Trích xuất nút N là nút có khoảng cách nhỏ nhất
  • Thêm liên kết tới nút N vào cây đường đi ngắn nhất
  • Sau đó tiến hành tối ưu các đường đi cạnh N bằng cách thử kéo dài cạnh

Tham khảo việc làm C++ hấp dẫn trên TopDev

Mã nguồn c++ minh họa thuật toán tìm đường đi ngắn nhất

Thuật toán có thể được implement bởi bất kỳ ngôn ngữ nào: C++, Java, hay Python…

Dưới đây là code minh họa bằng C++

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;


// Data structure to store a graph edge
struct Edge {
int source, dest, weight;
};


// Data structure to store a heap node
struct Node {
    int vertex, weight;
};


// A class to represent a graph object
class Graph
{
public:
    // a vector of vectors of `Edge` to represent an adjacency list
    vector<vector<Edge>> adjList;


    // Graph Constructor
    Graph(vector<Edge> const &edges, int n)
    {
         // resize the vector to hold `n` elements of type vector<Edge>
         adjList.resize(n);


         // add edges to the directed graph
         for (Edge const &edge: edges)
         {
              // insert at the end
              adjList[edge.source].push_back(edge);
         }
     }
};


void printPath(vector<int> const &prev, int i, int source)
{
   if (i < 0) {
       return;
   }
   printPath(prev, prev[i], source);
   if (i != source) {
       cout << ", ";
   }
   cout << i;
}


// Comparison object to be used to order the heap
struct comp
{
   bool operator()(const Node &lhs, const Node &rhs) const {
       return lhs.weight > rhs.weight;
   }
};


// Run Dijkstra’s algorithm on the given graph
void findShortestPaths(Graph const &graph, int source, int n)
{
    // create a min-heap and push source node having distance 0
    priority_queue<Node, vector<Node>, comp> min_heap;
    min_heap.push({source, 0});


    // set initial distance from the source to `v` as infinity
    vector<int> dist(n, INT_MAX);


    // distance from the source to itself is zero
    dist[source] = 0;


    // boolean array to track vertices for which minimum
    // cost is already found
    vector<bool> done(n, false);
    done[source] = true;


    // stores predecessor of a vertex (to a print path)
    vector<int> prev(n, -1);


    // run till min-heap is empty
    while (!min_heap.empty())
    {
        // Remove and return the best vertex
        Node node = min_heap.top();
        min_heap.pop();


        // get the vertex number
        int u = node.vertex;


        // do for each neighbor `v` of `u`
        for (auto i: graph.adjList[u])
        {
            int v = i.dest;
            int weight = i.weight;


            // Relaxation step
            if (!done[v] && (dist[u] + weight) < dist[v])
            {
               dist[v] = dist[u] + weight;
               prev[v] = u;
               min_heap.push({v, dist[v]});
            }
         }


         // mark vertex `u` as done so it will not get picked up again
         done[u] = true;
    }


    for (int i = 0; i < n; i++)
    {
        if (i != source && dist[i] != INT_MAX)
        {
           cout << "Path (" << source << " —> " << i << "): Minimum cost = "
                << dist[i] << ", Route = [";
           printPath(prev, i, source);
           cout << "]" << endl;
        }
    }
}


int main()
{
    // initialize edges as per the above diagram
    // (u, v, w) represent edge from vertex `u` to vertex `v` having weight `w`
    vector<Edge> edges =
    {
        {0, 1, 10}, {0, 4, 3}, {1, 2, 2}, {1, 4, 4}, {2, 3, 9},
        {3, 2, 7}, {4, 1, 1}, {4, 2, 8}, {4, 3, 2}
    };


    // total number of nodes in the graph (labelled from 0 to 4)
    int n = 5;


    // construct graph
    Graph graph(edges, n);


    // run the Dijkstra’s algorithm from every node
    for (int source = 0; source < n; source++) {
        findShortestPaths(graph, source, n);
    }


    return 0;
}

Kết quả khi chạy chương trình:

Path (0 —> 1): Minimum cost = 4, Route = [0, 4, 1]
Path (0 —> 2): Minimum cost = 6, Route = [0, 4, 1, 2]
Path (0 —> 3): Minimum cost = 5, Route = [0, 4, 3]
Path (0 —> 4): Minimum cost = 3, Route = [0, 4]
Path (1 —> 2): Minimum cost = 2, Route = [1, 2]
Path (1 —> 3): Minimum cost = 6, Route = [1, 4, 3]
Path (1 —> 4): Minimum cost = 4, Route = [1, 4]
Path (2 —> 3): Minimum cost = 9, Route = [2, 3]
Path (3 —> 2): Minimum cost = 7, Route = [3, 2]
Path (4 —> 1): Minimum cost = 1, Route = [4, 1]
Path (4 —> 2): Minimum cost = 3, Route = [4, 1, 2]
Path (4 —> 3): Minimum cost = 2, Route = [4, 3]

Độ phức tạp của thuật toán: O(E.log(V))

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

Xem thêm:

Tham khảo ngay việc làm IT mọi cấp độ trên TopDev!

Functor là gì? Tôi có cần biết đến functor?

Functor là gì và nó mang lại lợi ích gì trong lập trình?

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Khái niệm Functor là một bước đệm để từ đó giúp cho bạn khám phá ra những điều mới mẻ trong thế giới lập trình hàm. Vậy thì functor là gì và nó mang lại lợi ích gì trong lập trình?

Functor là gì?

Về bản chất, functor là một cấu trúc dữ liệu mà bạn có thể map qua chúng để áp dụng một hàm vào từng phần tử với mục đích sửa đổi dữ liệu. Nhưng một điều quan trọng là dữ liệu đó được chứa trong một “vùng chứa”, để có thể sửa được giá trị thì các hàm phải lấy ra, sửa đổi rồi đặt giá trị vào “vùng chứa”.

Functor hay còn được kí hiệu là fmap. Đây là định nghĩa chung của fmap:

fmap :: (A -> B) -> Wrapper(A) -> Wrapper(B)

Hàm fmap nhận một hàm (A -> B) biến đổi hàm Wrapper(A) thành Wrapper(B) sau khi đã thực hiện việc biến đổi các giá trị A thành B. Để hiểu rõ hơn bạn có thể xem hình dưới:

Wrapper

Chúng ta thấy giá trị 1 được lấy ra khỏi “vùng chứa” -> áp dụng hàm -> đặt lại vào “vùng chứa”.

Về cơ bản fmap sẽ trả về một bản sao mới của “vùng chứa” tại mỗi lần gọi nên nó có thể coi là bất biến.

Đó là lý thuyết, hãy để tôi lấy một ví dụ cụ thể: Biểu diễn phép tính 2 + 3 = 5 bằng functor.

  10 tip tối ưu code trên JavaScript mà web developer nào cũng nên biết

  Ứng dụng thuật toán và cấu trúc dữ liệu lúc đi làm

Đầu tiên tôi sẽ xây dựng một class Wrapper nhận vào một giá trị, class này có hai methods: fmap để biến đổi và indentity để lấy ra giá trị:

class Wrapper {
  constructor(value) {
    this.value = value;
  }

  fmap(fn) {
    return new Wrapper(fn(this.value));
  }

  identity() {
    return this.value;
  }

  map(fn) {
    return fn(this.value);
  }
}

fmap nhận vào một hàm, dùng hàm đó để biến đổi value và lại đặt vào Wrapperidentity chỉ đơn giản là trả về value.

Tôi sẽ sử dụng curry function để thực hiện phép cộng. Nếu chưa biết về curry bạn có thể đọc bài viết Curry function là gì? Một món “cà ri” ngon và làm sao để thưởng thức nó?.

const plus = a => b => a + b;
const plus3 = plus(3);

const two = new Wrapper(2);
const sum = two.fmap(plus3); // Wrapper(5)
sum.identity(); // 5

Đến đây thì các bạn có phát hiện ra điều gì thú vị không? Đúng rồi đó, sum vẫn có thể tiếp tục sử dụng được hàm fmap hay nói cách khác là khi kết quả xử lý trả về một đối tượng là Wrapper thì chúng ta sẽ không phải lo lắng về tính liên tục của dữ liệu sau xử lý. Tôi có thể tiếp tục cộng trừ nhân chi một cách liên tiếp:

const multi = a => b => a * b;
const multi5 = multi(5);
sum.fmap(multi5).identity(); // 25

Khi kết quả của hàm fmap trả về là một Wrapper thì nó đảm bảo được rằng kết quả vẫn mang những tính chất của Wrapper.

Xem thêm các việc làm tuyển dụng Javascript hấp dẫn tại TopDev

Thật thú vị phải không? Ý tưởng về chuỗi các hàm có làm bạn liên tưởng đến hàm map hay filter trong Javascript? Thật vậy đó chính xác là những triển khai của functor.

map :: (A -> B) -> Array(A) -> Array(B)
filter :: (A -> Boolean) -> Array(A) -> Array(A)

map và filter được coi là functor bởi chúng có những đặc điểm của functor:

  • Giống nhau
  • Duy trì cấu trúc
  • Loại giá trị

Functor cần phải đảm bảo được một số thuộc tính quan trọng:

Không gây ra side effect: có thể fmap qua một hàm identity để có được cùng một giá trị trong một ngữ cảnh. Điều này chứng minh được rằng chúng không gây ra side effect và vẫn bảo toàn cấu trúc của giá trị được bao bọc. Bạn có thể hiểu identity là một hàm chỉ đơn giản là trả về giá trị mà nó nhận được.

Wrapper('Get Functional').fmap(x => x); // Wrapper('Get Functional')

Thứ hai, chúng phải có thể kết hợp được. Tức là có thể fmap được liên tục. Để đảm bảo được điều này, các cấu trúc điều khiển ví dụ như fmap phải không được ném ra exception, thay đổi các phần tử trong danh sách hoặc thay đổi hành vi của một hàm. Mục đích là tạo ra một ngữ cảnh cho phép bạn thao tác vào các giá trị mà không làm thay đổi giá trị ban đầu. Điều này thể hiện rõ ràng trong việc hàm map biến đổi mảng này thành mảng khác mà không làm thay đổi mảng ban đầu.

Tuy nhiên trong lập trình không phải lúc nào ta cũng có dữ liệu hoàn hảo, mà chúng ta vẫn phải xử lý những exception, những giá trị như null, undefined… Lúc này việc áp dụng các functor sẽ không còn hoàn hảo nữa.

const div = a => b => b/a;
const subtr = a => b => a - b;
const plus = a => b => a + b;

const divided5 = div(5);
const subtr2 = subtr(2);
const plus3 = plus(3);

const two = Wrapper(2);
two.fmap(subtr2).fmap(divided5).fmap(plus3); // Wrapper(NaN)

Tổng kết

Functor là một cấu trúc dữ liệu lưu trữ dữ liệu ở trong một “vùng chứa”, nó cung cấp các phương thức để thao tác với dữ liệu ở trong “vùng chứa” đó. Sử dụng functor chúng ta sẽ đảm bảo được đầu ra của dữ liệu sẽ không bị thay đổi kiểu, nó giống với việc hàm map nhận vào một array và luôn luôn trả ra một array.

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

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

Hàng loạt việc làm IT lương cao trên TopDev đang chờ bạn, ứng tuyển ngay!

Bàn về Dev Việt Nam và Dev level thế giới

Bàn về Dev Việt Nam và Dev level thế giới

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

Tại sao nên đọc bài này

  • Để vươn tầm ao làng, trở thành dev quốc tế

Dev Việt Nam

Mình cũng không rõ lý do tại sao mọi người có mong muốn nghe chủ đề này, theo mình thì chắc là mọi người đang làm trong môi trường VN và muốn vươn mình ra thế giới, bán mình cho tư bản.

Okey dù gì thì mình cũng có gần 2 năm bán mình cho tư bản lớn, cũng khoảng 2 năm bán mình cho khách tứ phương (chủ yếu là Mỹ và Châu Âu) nên cũng có ít nhiều góc nhìn về vấn đề này.

Có khá nhiều thứ mà mình học được và thấy sự khác biết trong cách làm việc của ae Việt Nam so với thế giới.

Kỹ năng “cứng”

Phần này thì phải nói là ae VN “Cứng” không kém gì so với cộng đồng quốc tế cả, mọi người có thể dễ dàng thấy Lead là người VN, CTO là người VN, nhân viên Google, Facebook là người Việt Nam. Trải nghiệm đi làm của mình cũng chứng mình điều đó, so với đồng nghiệp người nước ngoài thì về kĩ năng “Cứng” thì mình cũng chả thua gì cả, họ cũng không có gì “cứng” hơn mình về khoản này.

Đặc biệt là mọi người có xuất thân từ những trường dạy kĩ cơ bản như Back Khoa, Tự nhiên hay Công nghệ thông tin.

Vậy vì lý do gì mà anh em vẫn phải làm ở Ao làng VN?

Kỹ năng mềm

Phần này là phần cực kì khác nhau mà mình thấy được, và nói thực, nếu mình làm sếp và gặp những case như này thực sự mình cũng rất khó chịu.

Wait, mà tại sao phải quan tâm tới vấn đề này dưới góc nhìn của người làm sếp? Đọc bài sau nhé :)))

Thôi back về vấn đề chính, mình sẽ list ra những khoảng cách to lớn giữa “ao làng” và “biển lớn”.

Tiếng Anh

Cái này chắc mình không phải viết dài viết dai làm gì rồi. Công nghệ, Biz thay đổi hàng ngày, bạn không biết tiếng Anh nghĩa là mọi thông tin, kiến thức của mọi người bị delay 1-2 năm so với người ta rồi (mình không nói drama nhé, drama có khi ping mình còn tốt hơn ngta).
  1. Đầu tiên là đọc để có thể nắm được kiến thức, công nghệ mới nhất.
  1. Tiếp theo là viết, để code cho ngta hiểu được, để giao tiếp với “biển lớn”.
  1. Nữa là nói chuyện, cơ bản thì viết tốn thời gian lắm, team bạn phải siêu siêu giỏi và hiểu nhau thì mới không cần nói, còn lại thì đây là level giúp bạn ngang tầm với người ta. Có thể không cần nói lưu loát, phát âm chuẩn chỉ, nhưng cần tự tin, deliver được ý muốn truyền đạt, hỏi thì phản hồi được

  Cách để nâng cấp từ Dev Frontend Web2 sang Web3 hiệu quả

  Tản mạn về nghề đi code thuê

Tác phong chuyên nghiệp

Bạn đi đúng giờ bao nhiêu ngày một tuần, bạn tham gia buổi họp trước 5 phút, hay đúng giờ, hay là trễ 15 phút. Không chỉ là công việc, ngay cả cuộc hẹn trong cuộc sống.

Cái này mọi người có thể nói là do văn hóa, do xã hội châu á,… nhưng cái này là một điểm trừ cực kì lớn khi ae đi làm. Bạn trễ giờ nghĩa là bạn thiếu tôn trọng thời gian của người khác, bạn trễ giờ nghĩa là bạn thể hiện thái độ không hợp tác, bạn trễ giờ nghĩa là bạn không xem trọng công việc này.

Mình thấy mọi người có nhiều lý do nghe là “bất khả kháng” quá như là bị kẹt xe, gia đình có công việc xyz,… thường thì những lý do như vậy thì mình hầu hết mình thấy là do plan kém thôi. Một lần do đi trễ thì ok nhưng 3-4 lần trong một tháng đối với mình là do cá nhân.

Đọc thêm về phần Lý do mình viết trong bài này nhé https://thanhle.blog/blog/hanh-trinh-di-tim-ly-do

Thực tế là sẽ luôn có lý do bất khả kháng thật và cách xử lý là ae ping với đồng nghiệp về việc đi trễ này, hẹn lại trong khoảng thời gian khác, và đảm bảo là thời gian hẹn khác đừng có trễ nữa nhé!

Tham khảo các vị trí tuyển dụng Web developer cho bạn

Thợ lặn

Cái này chắc là thứ nguy hiểm nhất của ae. Thấy có cái gì khó quá hay là deadline tới mông rồi và không làm được thì “lặn” mất tăm. Không tin nhắn, không cuộc gọi nhỡ, sáng ra thì bốc hơi

Mình đã từng như thế rất nhiều lần, cơ bản thì hứa hẹn cố vô, OT các kiểu vẫn không xong, cũng quê khi phải đối diện với thực tại, đâm ra là mình thợ lặn. Nhưng thực tế, việc “lặn” như vậy mang lại hậu quả khủng khiếp lắm. Sếp chả biết tiến độ tới đâu, khách hàng thì dí tới diss rồi nhưng giờ chả có cách nào để trả lời khách cả, muốn gửi một bạn khác vô cứu mà cũng chả biết phải bắt đầu từ đâu.

Công việc của bạn, tệ thì bị trừ lương, chỉ trích, tệ hơn thì bị đuổi việc. Còn công việc của sếp, tệ thì bị đền hợp đồng, mà tệ hơn thì phá sản cả công ty.

Mình thấy “Biển lớn” handle những việc như này rất là chuyên nghiệp, họ thấy trước là năng lực không làm được, điều đầu tiên họ làm là thông báo cho sếp, tiếp theo mọi người sẽ cùng bàn phương án để vượt qua được khó khăn này. Và người “trễ” deadline cũng rất aggressive trong việc cầu cừ đồng nghiệp khác (hosting meeting, transfer,…).

Họ vẫn nói nhiều nhưng làm không nhiều, cũng ảo tưởng sức mạnh của bản thân, cũng thể hiện, nhưng tới cuối output của công việc luôn quan trọng hơn cái tôi của bản thân. Hèn chi tụi nó nó phương Tây thực dụng.

Feedback

Chà cái này cũng là khác biệt lớn nè. Thường mọi người sẽ thấy văn hóa feedback ở VN nó khá lạ, người cần nghe feedback thì không bao giờ được nghe :))) Yup, nó là kiểu nói sau lưng á!

Ở môi trường “biển lớn” thì nó khác, mọi người rất sẵn sàng trong việc give feedback, thường là ngay sau khi mình có một hoạt động gì đó. Và mọi feedback đều ra là đóng góp kiểu “Tao thấy m lên làm như này thì tốt hơn… tao thấy buổi present hôm nay của m tốt đó”,… Đôi khi nó cũng nặng lời hơn, nhưng chả ai để bụng cả.

Nên là khi đi làm mình cũng tránh vào những hội thoại feedback kiểu VN, và cố gắng tập feedback như người nước ngoài. Ngắn gọn, rõ ràng, mang tính xây dựng. Vì feedback để giúp cho ai nếu người nghe không hiểu được?

Data driven

Em thấy là… Em Nghĩ là … rồi back bằng một đống lý lẽ nhưng lại thiếu data.

Thực tế thì cách thuyết phục nhanh nhất, éo có nhưng là phải có data. Em optimize performance website này từ X lên Y (tăng Z%), đây là benchmark trước và sau khi em optimize. Đây là số bug trước và sau khi có em tham gia code,…

“Biển lớn” rất là crititcal thinking trong mọi việc và data driven là một thứ dễ nhất để phản biện và counter-phản biện. Thực tế vẫn có kiểu làm số để confirm cho một luận điểm gì đó, cái này sẽ khá nguy hiểm vì biến bạn thành kẻ mạnh trong việc bảo vệ một thứ sai.

Nên nếu muốn chứng minh hay propose làm việc gì, hãy chuẩn bị đầy đủ data, số liệu cho việc đó nhé!

Vì Goal chung

Mình đồng ý là ai đi làm cũng vì một mục tiêu cá nhân nào đó, dễ thấy nhất là có tiền lương về nuôi vợ con, báo hiếu cha mẹ, ăn chơi bay lack,…

Nhưng cái mục tiêu cá nhân mình hay thấy khá cao từ những ae ở VN, thường thì những tranh cãi cái này là lỗi của FE hay BE, đùn đẩy công việc cho nhau, delay decision đều xuất phát từ lý do sâu xa là tao không cần phải làm thêm việc nữa, tao không bị quê,… Hoặc là kiểu thôi cứ làm tròn vai, có tiền rồi sau này làm mình làm việc khác, mình làm ở chỗ khác,…

Với “biển lớn” thì tâm thế sẽ khác, okey, lỗi đó vậy làm cách nào để resolve nó, chỗ nào resolve là hiệu quả nhất. Sẽ vẫn có những người đi làm vì tiền, nhưng họ cũng tôn trong thành quá công việc lắm.

Một vài suy nghĩ

Những thứ ở trên mình không nghĩ là khó làm được, nhưng khó nhất là có một môi trường ở VN công nhận điều đó, khuyến khích điều đó. Với level ở sếp, hẳn là ai cũng muốn nhân viên của mình có được những điều trên, nhưng phần khó, là hầu hết động nghiệp của bạn là không vậy. Nên là đối với mình, việc làm khác đi so với số đông đã là một thứ gì đó rất dũng cảm rồi, và mình tin dũng cảm để bản thân tốt hơn, thì sẽ có một ngày bạn ngang hàng với những người tốt hơn và tạo được nhiều value hơn.

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

Vì sao lập trình viên BE cần phải biết Figma?

Vì sao lập trình viên BE cần phải biết Figma?

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Nếu là một Developer trong ngành phát triển sản phẩm thì chắc hẳn mọi người không còn xa lạ gì với những bản thiết kế tính năng sản phẩm trên công cụ Figma. Thông qua hình ảnh trực quan đó mà chúng ta có thể dễ dàng trao đổi và làm việc với nhau một cách hiệu quả hơn.

Để tạo ra được những bản thiết kế như vậy đòi hỏi người thiết kế phải biết nhiều kiến thức về đồ họa và kĩ năng về UI/UX. Xuất thân là một dân Dev phải nói thật Figma ban đầu khá khó để sử dụng đối với tôi. Nhưng vì phát hiện ra tiềm năng mà Figma mang lại buộc tôi phải tự thân vận động để học cách sử dụng nó.

Vậy thì một dân Dev như tôi thì cần gì đến Figma nhỉ? Bài viết hôm nay tôi xin chia sẻ góc nhìn của tôi về việc tại sao Dev nên biết dùng Figma nhé.

Tại sao cần dùng Figma?

Figma và những lợi ích đối với lập trình viên BE

Trước tiên, nếu bạn chưa biết Figma dùng để làm gì thì nó là một phần mềm biên tập đồ họa vector và dựng prototype. Figma tập trung hỗ trợ công việc thiết kế giao diện người dùng (User Interface) và trải nghiệm người dùng (User Experience), chú trọng khả năng cộng tác theo thời gian thực.

Chính khả năng thiết kế UI/UX là điều tôi cần để tạo ra giao diện tính năng mới cho trang blog của mình. Trước đây tôi từng thử nhiều cách như vẽ ra giấy, sử dụng các trang web tạo wireframe online… nhưng các phương pháp đó chỉ giải quyết được một phần nhu cầu của tôi, hơn nữa chúng cũng bộc lộ ra những khuyết điểm. Ví dụ như vẽ ra giấy thì nhanh nhưng khi chỉnh sửa lại khó, không đầy đủ và chi tiết như đồ họa máy tính được. Còn wireframe chỉ giúp tôi tạo ra bố cục còn về mặt đồ họa chi tiết thì không làm được.

Figma là công cụ giúp tôi khắc phục được những hạn chế trên. Tôi có thể dựng wireframe và thoải mái chỉnh sửa một cách nhanh chóng. Thậm chí tôi còn có thể tạo ra một bản thiết kế một màn hình hoàn chỉnh cho trang blog của mình. Sau khi đã ưng ý tôi gửi chúng cho một vài người nhờ họ nhận xét. Mọi thứ ổn thỏa thì tôi triển khai thiết kế thành mã HTML.

Figma và những lợi ích đối với lập trình viên BE

Hiện tại kĩ năng sử dụng figma của tôi chỉ ở mức cơ bản. Kiến thức tôi học được chủ yếu là đọc tài liệu trên trang của Figma và xem video hướng dẫn của họ trên Youtube.

Figma và những lợi ích đối với lập trình viên BE

  Bí kíp tự học thiết kế web hiệu quả dành cho người mới

  Top câu hỏi phỏng vấn Graphic Designer chinh phục nhà tuyển dụng

Tại sao nên biết cách dùng?

Có một số lợi ích mà tôi nhận được khi biết sử dụng công cụ Figma.

Tiếp xúc với Figma bạn cũng gián tiếp tiếp xúc với hàng ngàn mẫu thiết kế có sẵn trên nền tảng này. Đó là những mẫu thiết kế được mọi người dùng nền tảng này chia sẻ. Có những mẫu thiết kế chi tiết đến mức hoàn chỉnh, cũng có những mẫu thiết kế ở mức component để chúng ta tái sử dụng. Điều này giúp tiết kiệm thời gian & công sức khi tìm nguồn cảm hứng thiết kế mới, hơn nữa nếu không thành tạo thiết kế thì có thể sử dụng luôn các mẫu component sẵn có.

Hiện thực hóa suy nghĩ thành hình ảnh để nhanh chóng thấy được kết quả thông qua các bản thiết kế, đánh giá & sửa chữa chúng cho đến khi cảm thấy mọi thứ ổn thỏa. Thay vì ngồi tưởng tượng ra trong đầu thì giờ đây biến nó lên Figma. Bạn cũng có thể nhanh chóng nhìn thấy được kết quả của mình để từ đó tạo động lực phát triển hơn nữa.

Tham khảo việc làm Web Developer hấp dẫn trên TopDev

Thông qua Figma, chúng ta dễ dàng chia sẻ thiết kế của mình với người khác cho họ xem hoặc nhờ họ đánh giá hay góp ý. Những bản thiết kế trông có vẻ “hoàn mỹ” trong mắt người sáng tạo nhưng đôi khi những người ngoài cuộc sẽ nhanh chóng phát hiện ra “tiểu tiết” mà chúng ta không ngờ tới. Hay đơn giản là đang bị quá tập trung vào một chi tiết khác mà không để ý đến. Nhờ đó giúp bạn nhanh chóng nhận ra và sửa đổi cho thiết kế hoàn thiện hơn.

Ngoài việc tạo ra những bản thiết kết web/mobile… Figma còn làm được những công việc khác như thiết kế logo, icon… Nếu học được cách thiết kế bạn có thể tự do sáng tạo ra những sản phẩm mang đậm phong cách bạn thích mà không phụ thuộc vào bất kì ai.

Dĩ nhiên sử dụng Figma đòi hỏi phải có kiến thức về UI/UX, còn nếu không biết thì Figma buộc bạn phải rèn luyện kĩ năng UI/UX, thẩm mỹ bằng cách liên tục thực hành và khám phá. Liên tục cập nhật những xu hướng thiết kế mới theo kịp với thời đại, kéo theo đó là nâng cao trải nghiệm người dùng trên các sản phẩm mà bạn tham gia phát triển.

Tổng kết

Bài viết trên đây tôi đã trình bày ra lý do vì sao một Developer như tôi lại chọn cách học cách dùng Figma. Đối với bạn hoặc người khác thì Figma có thể mang lại nhiều lợi ích hơn nữa. Hy vọng sau bài viết này những Developer đang trên đường chinh phục Figma hay những người thiết kế chuyên nghiệp có thể chia sẻ cho tôi cùng mọi người về kinh nghiệm học & sử dụng Figma của mình hơn nữa!

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

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

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

Ubuntu là gì? Lập trình viên nên sử dụng Ubuntu hay Windows?

Ubuntu là gì? Lập trình viên nên sử dụng Ubuntu hay Windows?

Khi nhắc đến hệ điều hành nhiều người thường nghĩ ngay đến Windows hay macOS. Tuy nhiên, có một hệ điều hành khác sở hữu lượng người dùng trung thành bởi những đặc trưng thú vị của nó, đó chính là hệ điều hành Ubuntu. Vậy Ubuntu là gì? Ubuntu khác gì với Windows? Cùng TopDev tìm hiểu qua bài viết dưới đây nhé!

Ubuntu là gì?

Ubuntu là một hệ điều hành máy tính mã nguồn mở dựa trên nền tảng Linux. Được phát triển và duy trì bởi Canonical Ltd. và cộng đồng người dùng toàn cầu, Ubuntu được thiết kế để cung cấp một trải nghiệm máy tính dễ sử dụng, ổn định và an toàn cho mọi người, từ người dùng cá nhân đến doanh nghiệp và tổ chức.

Ubuntu là gì?

Ubuntu đi kèm với các tính năng như giao diện người dùng đồ họa (GUI) thân thiện, hỗ trợ cho nhiều loại phần cứng và phần mềm, cũng như khả năng tùy chỉnh linh hoạt để phù hợp với nhu cầu cụ thể của người dùng. Đặc biệt, Ubuntu được cung cấp hoàn toàn miễn phí và đồng thời được hỗ trợ bởi một cộng đồng lớn các nhà phát triển và người dùng trên toàn thế giới.

Các phiên bản khác của Ubuntu:

  • Ubuntu LTS (Long Term Support) là phiên bản Ubuntu được hỗ trợ dài hạn. Cụ thể, các phiên bản LTS của Ubuntu nhận được bảo trì và cập nhật bảo mật trong khoảng thời gian kéo dài hàng năm (ví dụ: 5 năm cho phiên bản LTS phổ biến nhất). Điều này làm cho Ubuntu LTS trở thành lựa chọn ổn định và lâu dài cho các doanh nghiệp và người dùng muốn tránh việc nâng cấp thường xuyên.
  • Ubuntu Server là một phiên bản Ubuntu được tối ưu hóa để sử dụng làm hệ điều hành cho các máy chủ. Nó cung cấp các tính năng và công cụ cần thiết để triển khai, quản lý và vận hành các dịch vụ và ứng dụng máy chủ, bao gồm các dịch vụ như web server, email server, database server và nhiều hơn nữa.
  • Ubuntu MATE là một biến thể của Ubuntu được thiết kế với một giao diện người dùng truyền thống và dễ sử dụng. Giao diện của Ubuntu MATE nhắm đến sự đơn giản và sự dễ dàng sử dụng cho người dùng, đồng thời vẫn cung cấp đầy đủ các tính năng và công cụ của hệ điều hành Ubuntu.
  • Ubuntu Kylin là một phiên bản Ubuntu được tối ưu hóa cho người dùng ở Trung Quốc. Nó được phát triển bởi một tổ chức Trung Quốc với mục tiêu làm cho Ubuntu trở nên thân thiện và dễ sử dụng hơn đối với người dùng Trung Quốc thông qua việc cung cấp các tính năng và ứng dụng phù hợp với nhu cầu và thói quen của địa phương.

  Hướng dẫn cài đặt, lập trình Python trên Ubuntu (Linux)

  Sự khác biệt giữa Windows và Linux – Cuộc chiến khốc liệt

Những điểm nổi bật của hệ điều hành Ubuntu là gì?

điểm nổi bật của hệ điều hành Ubuntu

Hệ điều hành Ubuntu có nhiều điểm nổi bật mà người dùng thường đánh giá cao:

  • Miễn phí và mã nguồn mở: Ubuntu là hệ điều hành hoàn toàn miễn phí. Bạn có thể tải xuống, cài đặt và sử dụng mà không phải trả bất kỳ khoản phí nào.
  • Dễ sử dụng: Giao diện đồ họa trực quan, các ứng dụng được cài đặt sẵn và cộng đồng hỗ trợ nhiệt tình giúp cho việc sử dụng Ubuntu trở nên dễ dàng hơn bao giờ hết.
  • Ổn định và bảo mật: Ubuntu được coi là một trong những phiên bản Linux ổn định nhất, với việc cập nhật bảo mật thường xuyên để bảo vệ người dùng khỏi các lỗ hổng tiềm ẩn.
  • Tính tùy chỉnh: Ubuntu có thể tùy chỉnh cao. Người dùng có thể thay đổi giao diện, cài đặt thêm phần mềm và cấu hình hệ điều hành theo nhu cầu của mình.
  • Kho phần mềm phong phú: Bạn có thể tìm thấy hầu hết các ứng dụng phổ biến cho Ubuntu, bao gồm trình duyệt web, trình soạn thảo văn bản, bảng tính, trình phát đa phương tiện và nhiều loại ứng dụng khác.
  • Đa dạng phiên bản: Ubuntu cung cấp nhiều biến thể như Ubuntu Desktop, Ubuntu Server, Ubuntu MATE, Ubuntu Kylin, v.v., phù hợp với nhu cầu sử dụng khác nhau của người dùng.
  • Cộng đồng lớn mạnh: Ubuntu có một cộng đồng người dùng và nhà phát triển rộng lớn trên toàn thế giới, với sự hỗ trợ, chia sẻ kiến thức và giải đáp thắc mắc qua các diễn đàn, blog và trang web.

So sánh Ubuntu với Windows

So sánh Ubuntu với Windows

Dưới đây là một bảng so sánh giữa Ubuntu và Windows dựa trên một số tiêu chí phổ biến:

Tiêu chí Ubuntu Windows
Yêu cầu cấu hình Cấu hình máy không cần quá mạnh vẫn có thể chạy được. Yêu cấu hình máy khá cao.
Ổn định và bảo mật Ổn định và an toàn, với cập nhật bảo mật thường xuyên từ cộng đồng nguồn mở. Thích hợp cho máy chủ và môi trường phát triển. Ổn định và bảo mật, với cập nhật thường xuyên từ Microsoft. Thích hợp cho người dùng cá nhân và doanh nghiệp.
Tính linh hoạt và tùy chỉnh Có tính linh hoạt và tùy chỉnh cao, cho phép người dùng điều chỉnh hệ thống theo ý muốn. Tính linh hoạt và tùy chỉnh hạn chế hơn so với Ubuntu.
Phần mềm ứng dụng Kho ứng dụng phong phú từ nguồn mở, bao gồm các công cụ văn phòng, đồ họa và phát triển phần mềm. Có sẵn nhiều ứng dụng thương mại và miễn phí, nhưng không bằng phong phú như Ubuntu đối với các ứng dụng mã nguồn mở.
Hỗ trợ phần cứng Hỗ trợ tốt cho nhiều loại phần cứng, nhưng có thể gặp vấn đề với một số phần cứng cụ thể. Hỗ trợ tốt cho nhiều loại phần cứng, đặc biệt là trên các máy tính xách tay và máy tính cá nhân.
Giá cả Miễn phí, không cần mua bản quyền. Phải mua bản quyền hoặc sử dụng phiên bản miễn phí với các hạn chế.

Lập trình viên nên chọn Ubuntu hay Windows?

Quyết định giữa việc sử dụng Ubuntu hay Windows cho lập trình viên thường phụ thuộc vào nhiều yếu tố, bao gồm mục tiêu cụ thể, ưu tiên cá nhân và loại công việc mà lập trình viên đang làm hoặc định hướng sẽ làm trong tương lai. Dưới đây là một số yếu tố cần xem xét:

  • Ngôn ngữ lập trình và môi trường phát triển (IDE): Một số ngôn ngữ lập trình và IDE được phát triển chủ yếu cho một hệ điều hành cụ thể. Ví dụ, nếu bạn làm việc với công nghệ Microsoft như .NET, C#, hoặc muốn sử dụng Visual Studio, thì việc sử dụng Windows sẽ là lựa chọn phù hợp hơn. Trong khi đó, các lập trình viên web thường ưa chuộng Ubuntu với các công cụ như VS Code hoặc Sublime Text.
  • Tính linh hoạt và tùy chỉnh: Ubuntu thường cung cấp tính linh hoạt và tùy chỉnh cao hơn so với Windows. Nếu bạn muốn kiểm soát tối đa hệ thống của mình hoặc làm việc với mã nguồn mở, Ubuntu có thể là lựa chọn tốt.
  • Hiệu suất và bảo mật: Ubuntu thường được coi là ổn định và an toàn hơn so với Windows, đặc biệt là trong môi trường máy chủ. Nếu bạn làm việc với các dự án đòi hỏi tính ổn định cao hoặc đặc biệt quan trọng đối với bảo mật, Ubuntu có thể là lựa chọn tốt.
  • Tương thích phần cứng: Windows thường được hỗ trợ tốt hơn trên nhiều loại phần cứng, đặc biệt là trên các máy tính xách tay và máy tính cá nhân tiêu chuẩn. Tuy nhiên, Ubuntu cũng đã có sự tiến bộ đáng kể trong việc hỗ trợ phần cứng và hiện đã tương thích với nhiều thiết bị hơn.

Trên đây là tất cả những thông tin về hệ điều hành Ubuntu. Với những ưu điểm như mã nguồn mở, đa phiên bản, ổn định và tính bảo mật cao nên Ubuntu đã trở thành một hệ điều hành phổ biến trong cộng đồng người dùng Linux. Hy vọng bạn đã hiểu hơn về Ubuntu là gì cũng như những ưu điểm của nó khi so sánh với Windows. Theo dõi TopDev để cập nhật thêm các thông tin mới về công nghệ nhé!

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

Xem thêm các việc làm Developer hấp dẫn tại TopDev

Cách ứng dụng CLI để cải thiện hiệu suất công việc

Cách ứng dụng CLI để cải thiện hiệu suất công việc

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Là một lập trình viên, tôi tin chắc rằng ai cũng đã nghĩ đến việc tận dụng những dòng code để “sai khiến” nó làm một việc gì đó tự động. Lấy ví dụ như là một đoạn mã JavaScript được một lập trình viên nào đó viết ra, để tính tổng số tiền mà bạn đã “nướng” vào một sàn thương mại điện tử nào đó, thay vì phải ngồi cộng từng đơn hàng trong danh sách kéo mãi không biết bao giờ mới hết.

Việc tự động hóa mang lại nhiều lợi ích, dễ thấy nhất đó là tiết kiệm thời gian và giảm sai sót cho một tiến trình lặp đi lặp lại. Mặt khác, nếu thấy đoạn mã mà mình viết ra có thể chia sẻ được cho người khác thì đúng là một công đôi việc.

Tôi cũng hay tạo ra những dòng mã như vậy, nhưng thay vì đếm giá trị đơn hàng thì chúng lại tập trung giải quyết một vấn đề hay gặp phải trong công việc hơn. Lấy ví dụ như là một đoạn mã giúp đồng bộ hóa dữ liệu giữa hai máy chủ production với development của trang blog này. Bởi vì đôi khi cần thử nghiệm tính năng mới trên dữ liệu thật cho an toàn trước khi đưa nó vào môi trường “sản xuất”.

Tôi thường lưu trữ các mã này vào một nơi nào đó, ví dụ như trong ứng dụng ghi chú của hệ điều hành, để nó được đồng bộ đến tất cả nơi tôi làm việc, và sau này có gặp một vấn đề gì đó thì sẽ mở ra, “copy” lại và “paste” vào cho nó chạy. Thật sáng suốt!

Đấy chỉ là một ví dụ đơn giản cho cách tự động hóa công việc lặp đi lặp lại. Vài tuần trước, khi tôi đang tập trung tối ưu hóa hình ảnh cho blog thì vấn đề trở nên rắc rối hơn. Nếu cứ “copy” rồi “paste”, chỉnh sửa lại nội dung cho nó chạy, thì lại tốn nhiều thời gian hơn. Tôi chợt phát hiện những đoạn mã như thế lại chỉ phù hợp với những công việc có tần suất sử dụng thấp, dụ như 1 ngày chỉ sử dụng 1 lần thôi, hmm.. kiểu như thế.

Nói đến đây thì có lẽ bạn đọc cũng đang hình dung ra cách giải quyết vấn đề cho mình. Tôi biết là có nhiều cách để làm, riêng tôi thì chọn cách tạo ra một ứng dụng CLI làm tất cả công việc trên.

CLI là gì?

Giao diện dòng lệnh (CLI) là một cơ chế phần mềm bạn sử dụng để tương tác với hệ điều hành của mình thông qua bàn phím. Một cơ chế trái ngược với CLI là giao diện người dùng đồ họa (GUI).

Điểm mạnh của GUI là điều hướng một cách trực quan, như bấm vào các biểu tượng và hình ảnh để sử dụng phần mềm, ứng dụng đó. Tuy nhiên, GUI không hiệu quả đối với các tác vụ quản trị hệ thống, đặc biệt là với môi trường ảo hoặc từ xa.

Với CLI, bạn có thể nhập các lệnh văn bản để định cấu hình, điều hướng hoặc chạy các chương trình trên bất kỳ máy chủ hoặc hệ thống máy tính nào. Tóm lại là CLI tập trung vào tính năng và tốc độ sử dụng.

CLI khá là rộng lớn khi nhắc đến, nhưng trong phạm vi bài viết này, thì tôi chỉ muốn nói đến khả năng ứng dụng CLI trong các ứng dụng phần mềm. Hiểu đơn giản CLI là các ứng dụng bằng dòng lệnh mà chúng ta gõ gõ hàng ngày trong Terminal, khi đó cdlspwd… cũng có thể coi là các ứng dụng phần mềm để giúp chúng ta thực hiện một chức năng nào đó.

  Giới thiệu cấu trúc dự án tạo bằng Vuejs CLI

  Làm việc với Apache Kafka Topic sử dụng CLI

Khi nào cần tạo cho mình một CLI?

Quay trở lại với bài toán tối ưu hóa hình ảnh mà tôi có một bài viết Tối ưu hóa hiển thị hình ảnh bằng blur placeholder và lazyload. Có nhiều bước cần làm để tạo ra một hình ảnh sử dụng được trong bài viết của blog. Nhưng tựu chung lại thì có hai hành động chính:

Thứ nhất là định dạng lại hình ảnh về dạng webp, điều chỉnh chất lượng hình ảnh và cắt hình để cho ra kích thước mong muốn.

Thứ hai là tải tất cả hình ảnh vừa tạo ra lên R2, đồng thời lấy được tất cả liên kết đến chúng.

Nếu áp dụng phương pháp “copy paste” như ở đầu bài thì có phần rườm rà. Như vậy, để quản lý tập trung và tiết kiệm thời gian gõ phím, thì tạo ra một ứng dụng CLI trong trường hợp này là hết sức hợp lý.

Tưởng tượng, ứng dụng của tôi có tên là img, khi muốn tạo ra tất cả hình ảnh đã được tối ưu hóa, chỉ cần chạy:

$ img all path/to/file

Với path/to/file là đường dẫn đến ảnh gốc. Sau khi chạy xong, hình ảnh mới được tạo ra sẽ lưu vào path/to/new/file. Lúc này, tôi tạo thêm một lệnh upload nữa cho hành động tải ảnh lên R2:

$ img upload path/to/new/file

Hoàn hảo, mọi thứ hoạt động. Nhưng chưa hết, một điểm cộng của CLI đó là nó hỗ trợ tham số (args) và các cờ (flag), dựa vào flag, chúng ta còn có thể tạo ra nhiều trường hợp (options) xử lý phong phú hơn nữa.

Ví dụ, tôi muốn ngay sau khi tất cả hình ảnh được tạo ra thì tải lên R2 luôn thay vì tốn thêm một lệnh upload nữa thì viết thêm mã xử lý cho cờ --upload hoặc viết tắt là -u:

$ img all path/to/file --upload
# hoặc
$ img all path/to/file -u

Dĩ nhiên trên đây chỉ là giả thuyết, ứng dụng CLI có thể làm được nhiều hơn tùy vào cách của mỗi người. Vì thế bạn có thể thoải mái biến tấu các lệnh và các cờ theo sở thích của mình, nhưng với một lưu ý là nó phải rõ ràng và dễ nhớ, dễ sử dụng.

Xem thêm nhiều tuyển dụng VueJS hấp dẫn trên TopDev

Cách tạo một CLI đơn giản

Ứng dụng CLI không giới hạn ở bất kỳ ngôn ngữ nào, nếu bạn đang làm Golang, hãy tìm kiếm thư viện hỗ trợ tạo CLI cho Go. Tương tự, tôi làm Node.js thì oclif giúp tôi làm điều này. Ngoài oclif ra thì còn nhiều thư viện giúp bạn tạo ra được ứng dụng CLI, hãy dành thời gian tham khảo chúng, nếu thấy cú pháp thân thiện, dễ sử dụng thì hãy chọn. Tham khảo thêm nhiều thư viện khác tại Command-line utilities | awesome-nodejs Public | Github.

oclif tương đối đơn giản để bắt đầu. Chỉ cần làm theo hướng dẫn Introduction | oclif docs là ngay lập tức chúng ta đã có một “lệnh” của riêng mình.

$ npx oclif generate mynewcli
? npm package name (mynewcli): mynewcli
$ cd mynewcli
$ ./bin/dev.js hello world
hello world! (./src/commands/hello/world.ts)

oclif hỗ trợ tạo tự động một lệnh mới (CLI Generator), Flag/Argument parsing, Testing, Autocomplete và nhiều tính năng khác. Bạn đọc tham khảo thêm tại Features | oclif docs.

Tổng kết

CLI là một cơ chế phần mềm bạn sử dụng để tương tác với hệ điều hành, phạm vi của CLI tương đối rộng nhưng trong phạm vi bài viết này, chúng ta tìm hiểu việc ứng dụng CLI để tạo ra một phần mềm cho riêng mình.

Nếu như trước đây, cách tôi thường làm là lưu lại các đoạn mã thường dùng để khi cần chỉ việc “copy paste” để chạy chúng thì việc tạo ra CLI sẽ đơn giản hóa quá trình này, đồng thời giúp tiết kiệm thời gian sử dụng.

oclif là một thư viện giúp tạo CLI đơn giản bằng Node.js. Ngoài ra nếu bạn đang sử dụng một ngôn ngữ nào khác thì hãy tìm kiếm một thư viện phù hợp cho mình nhé!

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

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

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

Thuật toán Brute Force và bài toán Trapping Rain Water

Thuật toán Brute Force và bài toán Trapping Rain Water

Thuật toán Brute Force hay còn được gọi là thuật toán vét cạn là một trong những giải thuật cơ bản trong lập trình mà mọi người thường xuyên sử dụng. Bài viết hôm nay chúng ta cùng nhau tìm hiểu về thuật toán này và áp dụng nó để giải quyết bài toán Trapping Rain Water nhé.

Thuật toán Brute Force

Thuật toán vét cạn (Brute Force) đúng như cái tên của nó sẽ thực hiện việc xét qua tất cả các trường hợp có thể xảy ra để tìm kiếm kết quả. Thuật toán này cho chúng ta một cách tiếp cận đơn giản, dễ hiểu, dễ nhận thấy nhất mặc dù nó không phải là cách tốt nhất.

Thuật toán Brute Force

Linear Search (tìm kiếm tuyến tính) là một bài toán tiêu biểu của thuật toán vét cạn, với việc duyệt qua lần lượt các phần tử trong mảng cho đến khi tìm ra được giá trị cần tìm. Rõ ràng với việc duyệt qua tất cả các trường hợp có thể xảy ra thì Brute Force không được đánh giá cao về hiệu năng và không phù hợp để giải quyết các bài toán có quy mô lớn. Điều kiện tiên quyết để áp dụng Brute Force là cần xem xét đến case xấu nhất có thể là gì và thời gian cho đủ cho phép để thực hiện case đó không.

Mặc dù vậy đây vẫn là một thuật toán kinh điển cơ bản và rất hữu ích khi bạn chưa nghĩ ra được phương án nào tối ưu. Ngoài ra việc triển khai thuật toán cũng đơn giản giúp ít mắc lỗi hơn trong quá trình lập trình.

  Tìm hiểu về thuật toán đảo ngược chuỗi liên kết (Linked List)

  Thuật toán tham lam (Greedy Algorithm) – Thực hành với C++

Bài toán Trapping Rain Water

Bài toán: Cho một dãy số nguyên không âm height với giá trị phần tử trong mảng là chiều cao của các khối trụ tường giữ nước với độ rộng đều bằng 1. Hãy tính tổng diện tích các trũng nước sau khi mưa

Bài toán Trapping Rain Water

  • Input: height = [0, 1, 0, 2, 1, 0, 3, 1, 0, 1, 2]
  • Output: 8

Như thể hiện trên hình vẽ, với các khối trụ tường (phần màu đen) được tạo ra theo giá trị mảng đầu vào thì sẽ chỉ có 3 vùng nước được giữ lại tương ứng với tổng khối nước là 1 + 3 + 4 = 8 (phần màu xanh tương ứng). 

Phân tích bài toán

Tại mỗi vị trí phần tử trong mảng, lượng nước có thể giữ được sẽ phụ thuộc vào chiều cao khối trụ tường của 2 bên trái phải của điểm đó. Ví dụ với phần tử thứ 6 trong hình trên (giá trị phần tử = 0); bức tường cao nhất ở phía bên trái của điểm đó có độ cao = 2 (phần tử thứ 4); và bức tường cao nhất ở phía bên phải của điểm đó có độ cao = 3 (phần tử thứ 7). Lượng nước giữ lại được tại node này sẽ chính là giá trị nhỏ hơn trong 2 giá trị trên trừ đi chiều cao của chính phần tử đó.

Với phân tích trên thì lời giải cho bài toán chính là việc duyệt qua từng vị trí của phần tử trong mảng, tại mỗi vị trí sẽ tính ra lượng nước giữ lại được; cuối cùng là tính tổng của tất cả giá trị trên sẽ cho ra lời giải của bài toán. Đây cũng chính là cách giải theo phương pháp vét cạn, tính toán hết các khả năng có thể xảy ra.

Tham khảo việc làm Front-End hấp dẫn trên TopDev

Triển khai thuật toán

  1. Khởi tạo giá trị trả về ans = 0
  2. Chạy vòng lặp mảng đầu vào từ trái sang phải và thực hiện:
    1. Khởi tạo giá trị max_left = 0max_right = 0
    2. Chạy vòng lặp từ phần tử hiện tại đến phần tử bắt đầu mảng và xác định max_left = max(max_left, height[j])
    3. Chạy vòng lặp từ phần tử hiện tại đến phần tử cuối của mảng và xác định max_right = max(max_right, height[j])
    4. Cộng thêm giá trị min(max_left, max_right) – height[i] vào ans

Độ phức tạp của thuật toán

Đối với mỗi phần tử của mảng, chúng ta cần thực hiện vòng lặp phần bên trái và phần bên phải, tương đương với việc duyệt qua mảng thêm 1 lần. Vì vậy độ phức tạp của thuật toán về mặt thời gian sẽ là O(n^2). Về bộ nhớ sử dụng thì độ phức tạp của thuật toán này chỉ là O(1).

Triển khai thuật toán bằng ngôn ngữ JavaScript

export default function trappingRainWater(height) {
  let ans = 0;

  for (let index = 0; index < height.length; index += 1) {
    let max_left = 0;
    for (let leftIndex = index - 1; leftIndex >= 0; leftIndex -= 1) {
      max_left = Math.max(max_left, height[leftIndex]);
    }

    let max_right = 0;
    for (
      let rightIndex = index + 1;
      rightIndex < height.length;
      rightIndex += 1
    ) {
      max_right = Math.max(max_right, height[rightIndex]);
    }

    const max_height = Math.min(max_left, max_right);
    if (max_height > height[index]) {
      ans += max_height - height[index];
    }
  }

  return ans;
}

Kết bài

Giải thuật vét cạn thường không phải là giải thuật tối ưu nhất là trong các bài toán cần xử lý với giá trị đầu vào có kích thước lớn. Mặc dù vậy nó sẽ tỏ ra tối ưu khi giá trị đầu vào có kích thước nhỏ, không cần quá chú trọng vào thời gian xử lý; ngoài ra đây là một thuật toán dễ triển khai, giảm bớt lỗi có thể xảy ra. Ngoài bài toán Trapping Rain Water ở trên thì Brute Force có thể áp dụng và triển khai được trong rất nhiều bài toán khác nhau và được xem như một cách tiếp cận cơ bản nhất trong lập trình. 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.

Tác giả: Phạm Minh Khoa

Xem thêm:

Tham khảo ngay việc làm IT mọi cấp độ trên TopDev!

Cách để nâng cấp từ Dev Frontend Web2 sang Web3 hiệu quả

nâng cấp từ Dev Frontend Web2 lên Web3

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

Tại sao nên đọc bài này?

  • Nâng cấp level của bản thân một cách ngắn gọn, hiệu quả
  • Người ta làm Web3 được chả lẽ mình làm không được?

Trở thành Web3 Frontend developer

Giờ tôi đang là Web2 developer, làm react, redux, nextjs mỗi ngày kiếm cơm, làm sao tôi trở thành Web3 developer được?

Đây là check-list

  • Blockchain là gì?
  • Cách mà wallet và block chain tương tác với frontend?
  • Code thử, tương tác với blockchain (Đơn giản như call API)
  • Kiếm việc trong Web3

Blockchain là gì?

Đâu tiên thì nên hiểu khái niệm xem tụi Blockchain hay Web3 là gì nhỉ?

Tham khảo bài viết: “Công nghệ Blockchain là gì? Tiềm năng & ứng dụng thực tế” và “Tiềm năng ứng dụng thực tế của blockchain & Web3” để hiểu hơn về công nghệ này.

Tương tác với Block-chain và Wallet

Về cơ bản khi code frontend, mọi chuyện không có gì thay đổi nhiều so với web2 cả. Thay vì call API để hiển thị data thì bạn call một bên khác để trả về data (Cụ thể là JSON RPC), nên cơ bản nó cũng chả khác gì call API lắm.

Tương tác với Block-chain và Wallet

Về cơ bản, web3 sẽ chia ra 2 loại request riêng biệt:

  • Mutable API – Những API sẽ làm thay đổi trạng thái của hệ thống. Vd như chuyển tiền, swap token, lending,…
  • Read-only API – Những API thể hiện trạng thái của hệ thống. Ai cũng có thể call và lấy data được. VD như đang có bao nhiêu tiền trong ví, đang lending ở đâu, swap với rate bao nhiêu

Đã có 2 loại request rồi, bây giờ mình sẽ gọi vào đâu?

  • Thường chúng ta sẽ phải gọi qua một server trung gian – blockchain node, con server kết nối vào Block Chain để:
  • Nhận Read-only API, lấy data từ blockchain, trả về cho user
  • Nhận Mutable API, broadcast lên blockchain cho tụi validator
  • Các Node Provider thường thấy
  • Node provider mặc định của network đó (thường bị rate limit và khá chậm nên ít người dùng)
  • Infura
  • QuickNode
  • Alchemy, Moralis

  Thông não về các khái niệm Web1, Web2, Web3

  Web3 techstack - Hành trang cho anh em developer

Vậy tụi Wallet làm gì ở đây?

Có nhớ hồi nãy mình có nhắc tới về Mutable API không? Wallet giúp ta chứng minh được ai là đứa thực hiện Request đó, và cũng đồng thời nhắc nhở bạn là người chịu trách nhiệm cho cái request vừa rồi.

Đương nhiên là bạn không thể call Mutable API với nội dung: Thằng A gửi cho tui 10BTC được đúng không? Wallet giúp xác định chắc chắn, nếu thằng A gửi tiền thì chỉ có mình thằng A có thể gửi, mà không phải là một thằng hacker nào khác.

Đó vậy khác biệt giữa Web2 và Web3 cho Frontend dev chỉ có nhiêu đây:

  • Thay vì tương tác với API thì tương tác với JSON RPC node
  • Thay vì gắn login, gắn auth token vào API thì bạn tương tác với Wallet để làm việc trên

Một số thư viện cho Frontend

Nói chung mình Highly recommend dùng Wagmi và ethers.js vì tụi này tiện và ok hơn mấy thằng còn lại. Mấy thằng khác nên học tùy tình huống kiểu như trong prj đang dùng sẵn thằng này cmnr.

Xem ngay các tin đăng tuyển dụng Front-end lương cao trên TopDev

Học thêm về web3

Đó frontend thì chỉ có vậy, nhưng mình nghĩ các bạn vẫn nên tìm hiểu thêm về phía backend, và một số thứ liên quan khác như:

  • Dùng explorer để inspect data
  • Hiểu sơ về code backend (Solidity, rust) để có thể biết được đâu rà Read function, đâu là Mutate function
  • Bảo mật

Một số khóa học về web3 phù hợp với frontend

Learn to Code Blockchain DApps by Building Simple Games

Khóa near học xong còn có tiền nữa, mình cũng quen một vài người build prj trong khóa học đó, sau đó được NEAR tại trợ để làm tiếp (khoảng hơn 5000$)

Một số khóa học về web3 phù hợp với frontend

Học xong nhớ thực hành nha, nghĩ ra problem gì phù hợp mà blockchain cần giải quyết rồi làm thử, như mình làm Morphling nè!

Morphling – dApp Tham gia Binance Launchpad

Nhân tiện, mình cũng rất muốn connect với các bạn đang làm trong Web3, mình cũng đang build product về Web3
Tham khảo các vị trí tuyển dụng Web developer cho bạn

Tìm việc web3

Thì có 2 cách, hoặc bạn xin vào làm trong một công ty về Web3, hoặc là bạn làm công việc freelance đến Web3

Công việc fulltime thì chỗ kiếm chắc khá nhiều, search Google đầy. Còn công việc freelance thì đây là một vài chỗ để tham khảo

Issue Explorer

Dework – The task manager for DAOs and deventralized work

Lời kết

So với backend, thì frontend tương tác với Blockchain khá đơn giản và dễ học. Tuy nhiên mình thấy benefit cho các bạn làm ở Web3 đang cao hơn hẳn nên cũng đáng để các bạn thử.

Mà dù Web2, Web3 hay Web4 thì hãy luôn nhớ trau dồi những thứ cơ bản nhất, đảm bảo không bị lỗi thời đâu.

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

Xem thêm:

Tìm việc làm IT mọi cấp độ tại TopDev

Ưu và nhược điểm của các loại Database phổ biến hiện nay

Ưu và nhược điểm của các loại Database

Databasecơ sở dữ liệu là một tập hợp có tổ chức các thông tin có cấu trúc hoặc dữ liệu, thường được lưu trữ trong một hệ thống máy tính và được kiểm soát bởi hệ thống quản lý cơ sở dữ liệu (DBMS). Mỗi database sẽ được tạo ra theo những cách khác nhau, mỗi loại đều có những đặc điểm riêng và thích hợp với từng nhu cầu nghiệp vụ cụ thể. Vì thế việc lựa chọn loại cơ sở dữ liệu phù hợp với dự án ngay từ ban đầu là điều vô cùng quan trọng.

Để các bạn có thể đưa ra được lựa chọn đúng đắn cho quá trình phát triển sản phẩm sắp tới của mình, bài viết hôm nay chúng ta cùng nhau tìm hiểu ưu và nhược điểm của các loại Database phổ biến hiện nay nhé.

Khái niệm database

Trước tiên chúng ta cùng thống nhất với nhau về khái niệm database – cơ sở dữ liệu được nhắc đến trong bài viết này. 

Khái niệm database

Một database sẽ được kiểm soát bởi một hệ quản trị cơ sở dữ liệu (DBMS – Database Management System) và liên kết với các ứng dụng thông qua các lời gọi truy vấn. Một cấu trúc như trên được gọi là một hệ thống cơ sở dữ liệu. Việc phân loại Database cũng đồng nghĩa với việc phân loại một hệ thống cơ sở dữ liệu đi cùng, vì vậy trong khuôn khổ bài viết này chúng ta cùng hiểu với nhau về phạm vi rộng hơn khi nhắc đến database nhé.

1. Cơ sở dữ liệu quan hệ

Cơ sở dữ liệu quan hệ (RDBMS – Relational Database Management System) là một trong những mô hình dữ liệu được sử dụng rộng rãi nhất hiện nay. Dữ liệu được lưu dưới dạng bảng với dòng và cột tạo thành các ô lưu trữ từng giá trị cụ thể, dữ liệu giữa các bảng cũng có mỗi liên kết (quan hệ) với nhau theo các thiết lập có sẵn. Dữ liệu sẽ được quản lý thông qua ngôn ngữ truy vấn cấu trúc SQL được chuẩn hóa đảm bảo tính thống nhất và đáng tin cậy. Một số CSDL quan hệ nổi tiếng có thể kể đến như Oracle, MySQL, MS Server, PostgreSQL.

Cơ sở dữ liệu quan hệ

Ưu điểm của CSDL quan hệ

  • Có khả năng xử lý tốt với các dữ liệu được cấu trúc kỹ càng và hỗ trợ các thuộc tính ACID (tính nguyên tố, nhất quán, độc lập và bền vững).
  • Dữ liệu trong CSDL quan hệ được lưu trữ và truy xuất dễ dàng bằng SQL.
  • Khả năng mở rộng nhanh chóng, khả năng bổ sung dữ liệu mới không ảnh hưởng đến các dữ liệu có sẵn.
  • Các RDBMS có khả năng phân quyền truy xuất dễ dàng.

Nhược điểm:

  • Không xử lý tốt (hoặc không có khả năng xử lý) các dữ liệu phi cấu trúc.
  • Dữ liệu bị chia cắt dẫn đến việc đọc hiểu dữ liệu cần bước chuyển đổi sang dạng khác và sẽ tốn thời gian.
  • Việc thay đổi CSDL, nâng cấp, phân mảnh,… gặp thách thức lớn vì cần đảm bảo tính quy củ chặt chẽ của cấu trúc dữ liệu.
  • Các RDBMS tốn chi phí xây dựng và phát triển hơn so với các loại khác.

  Top 10 Hệ quản trị cơ sở dữ liệu (DBMS) phổ biến

  Lộ trình học MySQL từ A đến Z

2. Cơ sở dữ liệu hướng đối tượng

CSDL hướng đối tượng (OODB – Object Oriented Database) là CSDL dựa trên lập trình hướng đối tượng (OOP). Nó biểu diễn dữ liệu dưới dạng các đối tượng (object) và lớp (class), có thể quản trị nhiều kiểu dữ liệu phức hợp như âm thanh, hình ảnh,… Các đối tượng được phân cấp rất rõ ràng, mỗi cấp được gọi là một lớp dữ liệu. Những hệ quản trị CSDL loại này như ODBMS (Object Database Management System) hay ORDBMS (Object Relational Management System). 

Cơ sở dữ liệu hướng đối tượng

Ưu điểm của CSDL hướng đối tượng:

  • Có thể lưu trữ nhiều kiểu dữ liệu cùng với các thao tác và lớp trên chúng.
  • Cung cấp mô hình phát triển CSDL cho phân tích, xây dựng và phát triển ứng dụng.
  • Có thể dẫn về một CSDL quan hệ được chuẩn hóa.
  • Cấu trúc nhất quán giúp hỗ trợ lập trình nhanh chóng.

Nhược điểm:

  • Thiếu cơ sở lý thuyết và chuẩn hóa tạo ra các sản phẩm rất khác nhau.
  • Khó mở rộng logic, chưa có view CSDL như CSDL quan hệ.

Tham khảo việc làm MySQL Hồ Chí Minh hấp dẫn

3. Cơ sở dữ liệu hướng tài liệu

CSDL hướng tài liệu hay Document store thực hiện việc lưu trữ dữ liệu dưới dạng văn bản như JSON, BSON hay XML. CSDL này không đòi hỏi người dùng tạo bảng nhập liệu, tài liệu trong đó có thể chứa bất kỳ dữ liệu nào. Để quản trị dữ liệu, các hệ quản trị CSDL loại này sẽ tạo ra các cặp khóa – giá trị (key-value) cùng với việc đính kèm các metadata (thông tin đi kèm) để giúp cho việc truy vấn dữ liệu trở nên dễ dàng hơn. Những hệ quản trị CSDL hỗ trợ loại này như MongoDB hay Couchbase.

Cơ sở dữ liệu hướng tài liệu

Ưu điểm của CSDL hướng tài liệu:

  • Khả năng xử lý dữ liệu linh hoạt, hỗ trợ tốt dữ liệu bán cấu trúc và không cấu trúc.
  • Có thể thiết kế một cấu trúc cho một loại tài liệu cụ thể mà không ảnh hưởng đến các loại tài liệu khác.
  • Khả năng đọc hiểu dữ liệu, chia sẻ dữ liệu tốt hơn CSDL quan hệ.
  • Dễ dàng mở rộng theo chiều ngang.

Nhược điểm:

  • Để đổi lấy sự linh hoạt thì CSDL hướng tài liệu không đảm bảo các thuộc tính của dữ liệu.
  • Việc truy vấn thực hiện trên từng tài liệu, khó thao tác truy vấn trên nhiều tài liệu khác nhau.

4. CSDL dạng key-value

Key – value (khóa – giá trị) là kiểu lưu trữ đơn giản nhất trong các loại CSDL NoSQL, các hệ quản trị CSDL NoSQL sử dụng key (một chuỗi giá trị duy nhất) liên kết với giá trị (value) dưới dạng văn bản hoặc các tập dữ liệu phức tạp hơn. Các loại giá trị có thể được hỗ trợ như: JSON, XML, HTML, nhị phân, hình ảnh, video, … Một số hệ quản trị CSDL dạng này có thể nhắc đến là Redis hay Memcached.

CSDL dạng key-value

Ưu điểm của CSDL key-value:

  • Linh hoạt xử lý nhiều loại dữ liệu một cách nhanh chóng.
  • Khả năng truy xuất thẳng đến giá trị.
  • Dễ dàng mở rộng theo chiều ngang.
  • Chi phí vận hành thấp.

Nhược điểm:

  • Không phải objects nào cũng có thể cấu hình thành cặp key-value được.
  • Tính chính xác thấp vì dữ liệu được lưu trữ theo blob.
  • Khó khăn trong việc chỉnh sửa, cập nhật dữ liệu.

Kết bài

Như vậy chúng ta đã cùng nhau tìm hiểu qua một số loại cơ sở dữ liệu cũng như ưu và nhược điểm của chúng. Mỗi loại CSDL sẽ giải quyết cho từng trường hợp, bài toán hay dự án cụ thể; vì vậy hãy lựa chọn đúng để có thể tận dụng được ưu điểm của chúng cho dự án của bạn. 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.

Tác giả: Phạm Minh Khoa

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

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

Nên học Angular hay React? So sánh 2 framework

Nên học Angular hay React

AngularReact là hai công nghệ được nhiều anh em lập trình Frontend quan tâm, lựa chọn làm định hướng sự nghiệp. Mặc dù đều là những framework/thư viện JavaScript nhưng cách phát triển, xây dựng ứng dụng giữa 2 nền tảng này có sự khác nhau lớn; vì vậy việc lựa chọn theo một hướng ngay từ đầu là điều quan trọng đối với lập trình viên. Bài viết hôm nay chúng ta cùng nhau đi tìm hiểu về 2 công nghệ này để giúp bạn có thể trả lời câu hỏi rằng nên học Angular hay React nhé.

Tổng quan về 2 nền tảng

ReactJS là một thư viện JavaScript mã nguồn mở được Facebook giới thiệu từ 2013 dành cho việc xây dựng và phát triển giao diện người dùng. Angular là một framework JS được viết bằng TypeScript mà Google phát hành/ nâng cấp vào năm 2016 (phân biệt với bản AngularJS ra đời từ 2009). Angular là 1 phần của MEAN stack (ngăn xếp phần mềm viết bằng JS) với chức năng tạo ra các ứng dụng Web.

Angular-va-React-1

Angular là một Web framework đầy đủ, trong khi React chỉ là một thư viện vì nó luôn cần sử dụng cùng với một vài thư viện JS khác để cung cấp một kiến trúc hoàn chỉnh cho sản phẩm dựa trên React, ví dụ như Flux, MobX hay Redux. Cả Angular và React cùng sử dụng kiến trúc module để phát triển các function như routing hay các dependencies trong một ứng dụng đơn trang (Single Page Application).

Với việc được hậu thuẫn và phát triển bởi 2 ông lớn Facebook và Google thì các tính năng, cộng đồng hỗ trợ hay về cả hiệu năng, hiệu suất của cả Angular và React đều đủ tốt cho các ứng dụng Web hiện nay. Để hiểu sâu hơn về 2 nền tảng này chúng ta cùng đi so sánh xem điểm khác nhau giữa chúng cụ thể thế nào nhé.

So sánh giữa Angular và React

So sánh giữa Angular và React

1. Về ngôn ngữ lập trình

Angular sử dụng TypeScript làm ngôn ngữ lập trình, cùng với đó là việc bắt buộc lập trình viên phải tuân theo các quy ước ràng buộc cùng kiến trúc MVC. Cũng vì vậy mà việc bắt đầu học với Angular sẽ khó hơn, mất nhiều thời gian làm quen hơn và có thể cảm thấy không thoải mái khi sử dụng. Mặc dù vậy, nhờ việc có kiến trúc xây dựng ứng dụng cũng như sử dụng TypeScript (một siêu tập hợp các cú pháp nghiêm ngặt của JavaScript) khiến các ứng dụng viết bằng Angular được đánh giá cao về khả năng bảo trì, mở rộng, nâng cấp source code trong tương lai.

React có cách tiếp cận ngược lại khi sử dụng JSX – một cú pháp đặc biệt pha trộn giữa code HTML và JavaScript khiến việc tiếp cận, học và viết code trong React trở nên dễ dàng hơn. JS được biết đến là một ngôn ngữ khá thoải mái trong lập trình, vì vậy việc code React cũng dễ dàng tùy biến theo kiến trúc, mô hình mà dự án lựa chọn. Nhược điểm của điều này chính là việc nếu không có những kiến trúc rõ ràng ngay từ đầu thì dự án có thể rất khó để kiểm soát và mở rộng về lâu dài.

  Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?

  So sánh Golang và NodeJS: Nên chọn nền tảng nào cho dự án của bạn?

2. Về ràng buộc dữ liệu

Data binding là kỹ thuật liên kết giữa các UI components trong layout với các nguồn dữ liệu trong ứng dụng, là yếu tố ảnh hưởng đến việc xác định khung phát triển phù hợp. React sử dụng liên kết dữ liệu 1 chiều trong đó các thành phần UI chỉ có thể được thay đổi sau khi thay đổi state model. Trong khi đó với Angular thì phương pháp ràng buộc 2 chiều được hỗ trợ giúp đảm bảo rằng state model thay đổi tự động khi có bất kỳ thay đổi nào trong thành phần UI được thực hiện và ngược lại.

Mặc dù việc hỗ trợ ràng buộc dữ liệu 2 chiều của Angular mang lại cách tiếp cận linh hoạt hơn nhưng ngược lại cũng sẽ dẫn đến việc khó kiểm soát dữ liệu khi ứng dụng mở rộng. Cách tiếp cận của React vẫn được cộng đồng lập trình viên đánh giá là hợp lý và cho một cái nhìn tổng quan về dữ liệu tốt hơn.

Tham khảo việc làm React lương cao trên TopDev!

3. Về tốc độ phát triển

Angular cung cấp cho chúng ta đầy đủ một không gian làm việc, kiến trúc thiết kế ứng dụng một cách hoàn chỉnh nên giúp tốc độ phát triển của dự án nhanh và rõ ràng hơn. Việc phải tuân thủ theo những quy trình tích hợp sẵn có thể khiến mức độ linh hoạt và tự do trong Angular bị hạn chế, nhưng cũng chính là ưu điểm của nền tảng này so với React. React linh hoạt và tự do nhưng phụ thuộc khá nhiều vào sự tham gia của các thư viện bên thứ ba. Điều này khiến các lập trình viên React cần phải làm quen và xác định kiến trúc phù hợp với công cụ sử dụng.

4. Về DOM

Angular sử dụng real DOM trong đó toàn bộ cấu trúc dữ liệu cây được cập nhật ngay cả khi chỉ một phần của nó thay đổi. React tạo ra 1 khái niệm là Virtual DOM giúp theo dõi và cập nhật thay đổi trên các node mà không làm ảnh hưởng đến các thành phần khác của cây. Về mặt này React được cho là tốt hơn, nhanh và giúp cải thiện hiệu suất hơn so với Angular. Mặc dù vậy thì với các phiên bản cập nhật gần đây, Angular đã bổ sung các tính năng mới như Ivy, Shadow API để cạnh tranh với React. Vì vậy về mặt hiệu năng xử lý có thể xem có sự cạnh tranh tương đồng giữa 2 nền tảng này.

Nên lựa chọn học Angular hay React?

Nên lựa chọn học Angular hay React?

Về mức độ phổ biến thì React tỏ ra vượt trội hơn khá nhiều so với Angular. Angular được cộng đồng lập trình viên ưu chuộng nhờ cung cấp sẵn các giải pháp một cách hoàn chỉnh. Cả 2 nền tảng này đều đang phát triển, có cộng đồng hỗ trợ đông đảo và luôn đứng top trong sự lựa chọn Frontend framework những năm gần đây. Vì vậy đối với câu hỏi nên lựa chọn học Angular hay React thì câu trả lời là tùy thuộc vào định hướng phát triển sự nghiệp của bạn. Nhu cầu tuyển dụng của 2 nền tảng này đều lớn, mặc dù riêng ở thị trường Việt Nam hiện nay thì React tỏ ra có nhiều jobs hơn. 

Hãy lựa chọn React để học nếu như:

  • Bạn đã có những kỹ năng chuyên môn tốt về HTML, CSS và đặc biệt là JavaScript
  • Bạn thích một nền tảng với mức tùy biến cao
  • Bạn cần học nhanh, làm việc được ngay, dễ học dễ hiểu và dễ áp dụng

Và có thể lựa chọn Angular nếu như:

  • Bạn mong muốn học và làm việc với một nền tảng hoàn chỉnh, quy trình, kiến trúc rõ ràng, nghiêm ngặt
  • Có hiểu biết tương đối về kiến trúc MVC, sẽ là lợi thế nếu có hiểu biết về các ngôn ngữ như Java hay C# từ trước
  • Mong muốn nâng cao hiệu suất lập trình, hiểu rõ về mã nguồn và kiến trúc ứng dụng

Kết bài

Với các phân tích trong bài viết, hy vọng các bạn đã phần nào có câu trả lời cho câu hỏi nên học Angular hay React và có thể đưa ra định hướng sắp tới cho mình. Lựa chọn nào cũng sẽ là đúng đắn nếu bạn hiểu rõ về nền tảng đó và đào sâu trong quá trình học để nắm vững được công nghệ. 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.

Tác giả: Phạm Minh Khoa

Xem thêm:

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

Tương lai của khoa học dữ liệu – Ngành học đầy hấp dẫn

Tương lai của khoa học dữ liệu

Theo Harvard, khoa học dữ liệu được xem là ngành học của thế kỷ 21, khi dữ liệu được xem là tài nguyên quý báu nhất của thời đại số. Chính vì thế, khoa học dữ liệu nổi lên như một ngành học “thời thượng”, không chỉ giúp chúng ta hiểu rõ hơn về thế giới xung quanh mà còn tạo ra nhiều cơ hội mới mẻ để khám phá những tiềm năng to lớn.

Vậy thật sự tương lai của ngành khoa học dữ liệu sẽ ra sao? Học khoa học dữ liệu ra làm gì? Bài viết này sẽ cung cấp những thông tin hữu ích về ngành học đầy tiềm năng này!

Khoa học dữ liệu là ngành gì?

Khoa học dữ liệu

Khoa học dữ liệu (Data Science) là lĩnh vực nghiên cứu và ứng dụng dữ liệu để giải quyết các vấn đề thực tế. Dữ liệu có thể là bất kỳ thông tin nào được thu thập và lưu trữ, bao gồm văn bản, hình ảnh, video, âm thanh, và dữ liệu số. Khoa học dữ liệu sử dụng các kỹ thuật thống kê, máy học, và trí tuệ nhân tạo để phân tích dữ liệu và rút ra những thông tin hữu ích.

Các chuyên gia trong lĩnh vực này được đào tạo để thu thập, quản lý và phân tích dữ liệu một cách chuyên nghiệp, và họ sử dụng các công cụ và phần mềm đặc biệt để tối ưu hóa quá trình này.

  Data Scientist là gì? Và hành trình để trở thành Data Scientist

  Top 10 thư viện Python tốt nhất cho Data Scientist nửa đầu năm 2024

Tương lai của khoa học dữ liệu

Tương lai của khoa học dữ liệu đầy triển vọng và hứa hẹn với tiềm năng phát triển to lớn. Ngành này đang phát triển nhanh chóng và được dự đoán sẽ tiếp tục tăng trưởng trong tương lai. Có nhiều yếu tố góp phần vào sự phát triển của ngành này, bao gồm:

  • Sự gia tăng của dữ liệu: Ngày nay, chúng ta đang tạo ra một lượng dữ liệu khổng lồ từ nhiều nguồn khác nhau. Dữ liệu này có thể được sử dụng để hiểu rõ hơn về thế giới xung quanh chúng ta, đưa ra các quyết định sáng suốt và tạo ra các sản phẩm và dịch vụ mới.
  • Sự phát triển của trí tuệ nhân tạo (AI): AI là một công nghệ quan trọng trong khoa học dữ liệu. AI giúp chúng ta tự động hóa các quy trình phân tích dữ liệu và tạo ra các mô hình dự đoán chính xác hơn.
  • Sự thay đổi nhu cầu của doanh nghiệp: Các doanh nghiệp đang ngày càng chuyển sang sử dụng dữ liệu để nâng cao hiệu quả hoạt động và đưa ra các quyết định chiến lược.
  • IoT và Big Data: Sự phát triển của Internet of Things (IoT) sẽ tạo ra một lượng lớn dữ liệu từ các thiết bị kết nối mạng, mở ra cánh cửa cho việc áp dụng khoa học dữ liệu trong nhiều lĩnh vực mới, từ quản lý thành phố thông minh đến chăm sóc sức khỏe.
  • Phân tích dữ liệu thời gian thực: Khả năng phân tích dữ liệu thời gian thực sẽ trở nên ngày càng quan trọng, đặc biệt trong các lĩnh vực như tài chính, giao thông, và quảng cáo trực tuyến. Điều này đòi hỏi sự phát triển của các công nghệ và công cụ phân tích dữ liệu nhanh chóng và chính xác.
  • Bảo mật dữ liệu và quyền riêng tư: Với sự gia tăng của dữ liệu và các vấn đề liên quan đến bảo mật và quyền riêng tư, việc phát triển các phương pháp và công nghệ để bảo vệ dữ liệu ngày càng trở nên cần thiết. Khoa học dữ liệu sẽ đóng vai trò quan trọng trong việc phát hiện và ngăn chặn các mối đe dọa bảo mật.

Tương lai của khoa học dữ liệu là một điều hứa hẹn của sự phát triển không ngừng. Với sức mạnh của dữ liệu và trí tuệ nhân tạo sẽ định hình một thế giới thông minh và hiệu quả hơn trong mọi lĩnh vực của cuộc sống.

Việc làm Data Analytics HOT tại TP. Hồ Chí Minh

Học khoa học dữ liệu ra làm gì?

Học khoa học dữ liệu ra làm gì?

Trong cuộc đua công nghệ số, việc tận dụng và phân tích dữ liệu đóng vai trò quan trọng trong các chiến lược kinh doanh của hầu hết các doanh nghiệp. Điều này tạo ra nhu cầu ngày càng tăng về nhân sự có kiến thức sâu về khoa học dữ liệu trong các tổ chức và doanh nghiệp. Do đó, sau khi hoàn thành chương trình học trong ngành Khoa học Dữ liệu, bạn sẽ có nhiều lựa chọn về việc làm như:

  • Làm việc tại các công ty và tập đoàn trong ngành viễn thông, phần mềm, đảm nhận các vị trí trong bộ phận IT, quản lý dữ liệu doanh nghiệp, chuyên viên phân tích dữ liệu kinh doanh, hoặc tại các cơ quan nhà nước và ngân hàng.
  • Tham gia vào vai trò kiến trúc sư dữ liệu hoặc kỹ sư phát triển phần mềm tại các công ty cung cấp giải pháp công nghệ thông tin, đảm nhận trách nhiệm trong việc phân tích và thống kê dữ liệu.
  • Nghiên cứu và giảng dạy trong lĩnh vực khoa học dữ liệu và các lĩnh vực liên quan, như công nghệ thông tin và hệ thống công nghiệp, tại các trường đại học và viện nghiên cứu.
  • Những cơ hội nghề nghiệp này chỉ là một phần nhỏ của những lĩnh vực mà người học khoa học dữ liệu có thể tham gia. Với sự phát triển không ngừng của dữ liệu và công nghệ, ngành này đang trở thành một trong những lĩnh vực có nhiều cơ hội và tiềm năng phát triển trong tương lai.

Dưới đây là một số ngành nghề mà người học Khoa học dữ liệu có thể lựa chọn: Nhà Khoa học dữ liệu (Data Scientist), Nhà phân tích dữ liệu (Data Analyst), Kỹ sư học máy (Machine Learning Engineer), Kỹ sư dữ liệu (Data Engineer), Nhà phát triển Business Intelligence (BI),…

Cơ hội nghề nghiệp và mức lương của ngành Khoa học dữ liệu

Cơ hội nghề nghiệp và mức lương trong ngành Khoa học Dữ liệu đang trở nên hấp dẫn hơn bao giờ hết, nhờ vào sự phát triển nhanh chóng của lĩnh vực này và nhu cầu ngày càng tăng về phân tích dữ liệu trong các doanh nghiệp và tổ chức. Ở Hoa Kỳ, ngành khoa học dữ liệu đứng đầu trong số 25 nghề tốt nhấtđứng thứ 16 về mức lương. Nó cũng là một trong 10 ngành nghề được tuyển dụng nhiều nhất hiện nay, điều này cho thấy tiềm năng mạnh mẽ cho những người làm việc trong lĩnh vực này.

mức lương của nhóm ngành Khoa học dữ liệu

Theo báo cáo thị trường IT Việt Nam 2023 của TopDev, mức lương trung bình của các chuyên gia Khoa học Dữ liệu có thể lên đến $2.365. Tuy nhiên, mức lương này có thể biến đổi tùy thuộc vào nhiều yếu tố như kinh nghiệm, kỹ năng, và vị trí công việc. Các chuyên gia có kỹ năng và kinh nghiệm phù hợp thường có khả năng thu nhập cao hơn.

Tóm lại

Trong bài viết này, chúng ta đã điểm qua một số đặc điểm và tương lai của ngành khoa học dữ liệu. Có thể thấy, với sự phát triển mạnh mẽ của ngành thì đây là một lĩnh vực đầy tiềm năng và cơ hội cho các bạn trẻ. Vì vậy, hãy tận dụng cơ hội học hỏi và phát triển trong lĩnh vực Data Science để từng bước tiến xa hơn trong sự nghiệp của mình bạn nhé!

Xem thêm:

Tạo ứng dụng Reactjs lấy dữ liệu từ Rest API

tạo ứng dụng ReactJS lấy dữ liệu từ Rest API

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

Trong việc phát triển ứng dụng hiện đại thì tần suất làm việc với RestAPI rất thường xuyên. Hôm nay, mình xin chia sẻ với các bạn cách tạo 1 ứng dụng Reactjs demo làm việc với dữ liệu được lấy từ API.

Tạo 1 dự án Reactjs

Việc đầu tiên chúng ta tạo 1 dự án mới. Bạn nào đang thao tác với các dự án cũ thì có thể bỏ qua bước này.

Mình dùng lệnh tạo dự án npx create-react-app react-getapi. Bạn nào thấy lạ thì có thể xem qua bài viết giới thiệu về `npm` của mình tại đây để hiểu thêm nhé.

Di chuyển vào thư mục dự án vừa tạo cd react-getapi.

Cài đặt thư viện Bootstrap

Mình sẽ cài đặt gói thư viện này để trình bày giao diện cho đẹp và nhanh hơn. Bạn chạy lệnh sau yarn add bootstrap.

  Hướng dẫn sử dụng ReactJS Props và State

  Xây dựng REST API cơ bản trong Golang

Tới bước Code nào

Chúng ta chỉ code nhỏ gọn trong file `src/App.js` luôn nhé. Vì ứng dụng có 1 chức năng đơn giản nên mình không chia ra nhiều cho phức tạp.

Đầu tiên ta import các thư viện cần dùng

import React, { Component } from 'react';
import 'bootstrap/dist/css/bootstrap.min.css';

Tạo một `class App` cho code được đẹp hơn

class App extends Component {

}
export default App;

Khai báo 1 biến stage users cho App

constructor() {
  super();

  this.state = {
    users: []
  }
}

Tiếp đến là phần chính của bài hôm nay, chúng ta sẽ thực hiện việc get dữ liệu từ API ở function `componentDidMount`. Ở đây mình muốn sau khi App được load thì sẽ lấy dữ liệu để hiển thị ra danh sách.

Code như sau:

async componentDidMount() {
  await fetch('http://jsonplaceholder.typicode.com/users')
   .then(res => res.json())
   .then((data) => {
      this.setState({ users: data })
   })
   .catch(console.log)
}

`async` là gì? Vì chức năng sẽ được gọi đến server nên sẽ tốn 1 khoảng thời gian nhất định, chúng ta nên thực hiện chức năng này bất đồng độ để không ảnh hưởng đến toàn App. Đi đôi với `async` thì cần dùng `await` cho hàm `fetch`. Sau khi get dữ liệu thành công chúng ta sẽ set lại cho biến stage users.

Còn lại, phần dưới chỉ là hiển thị dữ liệu ra màn hình thôi nên mình nghĩ không cần giải thích gì hen. Nói nhiều quá lại loạn cả lên.hehe

Đây là toàn bộ nội dung file `src/App.js`

import React, { Component } from 'react';

import 'bootstrap/dist/css/bootstrap.min.css';

class App extends Component {

  constructor() {
      super();

      this.state = {
          users: []
      }
  }

  async componentDidMount() {
    await fetch('http://jsonplaceholder.typicode.com/users')
        .then(res => res.json())
        .then((data) => {
            this.setState({ users: data })
        })
        .catch(console.log)
  }

  renderUsers = () => {
      let users = this.state.users.map((data, index) =>
          <tr key={data.id}>
            <td>{data.id}</td>
            <td>{data.name}</td>
            <td>{data.email}</td>
            <td>{data.website}</td>
          </tr>
      );

      return users;
  }

  render() {
    return (
      <div className="App">
        <div className="container">
          <h1 className="text-center">Users List</h1>

          <table className="table">
            <thead>
              <tr>
                <th>#</th>
                <th>Name</th>
                <th>Email</th>
                <th>Website</th>
              </tr>
            </thead>
            <tbody>
              {this.renderUsers()}
            </tbody>
          </table>

        </div>
      </div>
    );
  }
}

export default App;

Test ứng dụng

Bây giờ chúng ta cùng chạy ứng dụng lên xem kết quả thế nào nhé.

Run yarn start

Kết quả của mình đây. Đừng quên chia sẻ kết quả của bạn và hỏi đáp mọi thắc mắc cho mình ở phần bình luận nhé.

Tóm lại

Trong bài chia sẻ này, mình đã hướng dẫn các bạn cách tạo 1 ứng dụng web bằng Reactjs với các chức năng lấy dữ liệu từ Rest API thông qua hàm `componentDidMount()`, cách đặt biến stage, parse data, hiển thị view. Hi vọng sẽ giúp ích các bạn trên con đường chinh phục Framework này dễ dàng hơn.

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

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

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