Home Blog Page 149

Bí quyết giúp chinh phục mức lương mơ ước cho ngành IT

ngành IT

Ngành IT được xem là một ngành có mức lương khá ổn định. Nhưng theo bạn, đâu là mức lương đáng mơ ước? Mặt khác, sự thăng tiến về việc phát triển nghề nghiệp là điều mà bất kỳ nhân viên nào cũng mong muốn đạt được. Nhiều người thường suy nghĩ: Tại sao bản thân làm hoài nhưng vị trí vẫn thế? “Lúa” nhận vẫn lẹt đẹt là sao? Bao lâu nữa mình mới đạt được mức lương mơ ước?

Với những trải nghiệm từ thực tế, TopDev xin chia sẻ cho bạn về một số bí quyết để bạn có thể đạt được mức lương “xịn xò” nhé! 

Sự nắm bắt – Yếu tố quyết định sự thành công về lương

Dù ra trường với mức lương nào, bạn cũng phải nghiêm túc cần mẫn. Điều quan trọng lúc này là bạn luôn phải không ngừng học hỏi, chăm chỉ để hoàn thiện khả năng.

  Để thăng tiến, cần phải có chiến lược!

  Những lý do làm kìm hãm sự thăng tiến của bạn
 

ngành IT

Bước tiếp theo là xác định định hướng về vị trí của sự tăng tiến. Ví dụ, bạn muốn từ junior lên senior, từ nhân viên lên team leader. Hãy thử sức trải nghiệm nhiều dự án lớn nhỏ khác nhau. Đây là sự nắm bắt về một quỹ đạo phát triển chung của con đường/lộ trình thực tế về kinh nghiệm. Khi có kinh nghiệm, không ai từ chối trả lương cho bạn cả.

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

3 gợi ý giúp bạn tăng lương trong ngành IT 

TopDev sẽ gợi ý 3 cách giúp bạn dễ dàng tăng lương nhất trong ngành IT (có thể là một freelancer IT.) Đó là thăng chức, nhảy việclàm việc ở thị trường quốc tế.

Nếu cứ mãi làm ở một công ty, lương bạn sẽ tăng rất chậm. Có thể chỉ tăng từ 5-10% mỗi năm hoặc từ 20-40% nếu bạn được lên chức. Vì thế bạn có thể nên nhảy việc để đạt được mức lương mơ ước. Tuy nhiên, nhiều công ty vẫn có chế độ phúc lợi ổn định. Đồng thời, việc xây dựng lộ trình phát triển cho mỗi nhân viên ngày càng được quan tâm. Tất cả là do sự nhìn nhận của bạn về vị trí, mong muốn và chính năng lực hiện tại. Khi có sự nắm bắt tốt, bạn có một quyết định thông minh và phù hợp nhất.

Việc thăng chức và làm việc ở môi trường nước ngoài cũng tương tự. Nó thuộc về phần trăm bạn tự nắm bắt lấy cơ hội. Việc tận dụng và phát huy cũng rất quan trọng. Do vậy, hãy chuẩn bị cho mình những kiến thức, kỹ năng và sự trải nghiệm đủ “sức nặng” để có thể chớp lấy các cơ hội.

Điều quan trọng cần ghi nhớ: Hãy khiến bản thân trở nên “đắt giá” hơn

Không ai có thể từ chối trả cho bạn nhiều tiền khi bạn đã nỗ lực thay đổi. Điều đó khiến bạn biết cách khiến mình “có giá” hơn. Và là một nhân tố quan trọng cho bộ phận nhân sự của công ty.

Xem thêm: Băn khoăn ngành lập trình: Lựa chọn nào ở ngưỡng 30?

ngành IT

Đừng quá áp lực về công việc. Cũng đừng OT nhiều mà bỏ mặc sức khỏe. Việc biết cách cân bằng và hiểu giới hạn bản thân là điều đầu tiên trong hành trình thay đổi để làm bản thân có giá trị hơn. 

Vậy làm thế nào để bản thân “có giá” hơn? 

Đầu tiên, nếu bạn muốn nhận được một mức lương cao hơn thì tất nhiên là bản thân phải đảm nhận nhiều trách nhiệm hơn, làm những việc khó hơn, đòi hỏi kỹ năng và kinh nghiệm nhiều hơn. Đó có thể là những task/project to bự, siêu khủng đến từ đối tác, các hợp đồng lớn,… hay là những vấn đề trong việc trực tiếp thực hiện công tác đào tạo và phát triển năng lực các nhân viên với tư cách bạn là người quản lý, giám sát, Team Leader, Mentor,… Freelancer IT

Xem thêm: Mức lương lập trình viên 2022: Bạn xứng đáng mức lương bao nhiêu?

Tiếp theo đó là việc không ngừng nâng cao trình độ của bản thân thông qua việc tiếp thu, học hỏi. Cụ thể đó là những công nghệ, kỹ thuật mới, các kỹ năng mềm để có nền tảng tốt đồng thời update những cái mới phù hợp với xu hướng phát triển chung của thời đại công nghệ số. Nếu nói sâu một chút thì sẽ là rèn luyện kỹ năng code tốt hơn, học tiếng anh và tự trau dồi kiến thức tổng hợp. Đó là những thứ khiến bạn trở nên khác biệt so giữa nhiều nhân viên, hãy cố gắng vì mọi nỗ lực đều sẽ được ghi nhận.

Trạm dừng của cuộc sống không phải là tiền: Đừng theo đuổi ngành vì lương

Vấn đề lương bổng thật sự rất quan trọng. Nó là yếu tố quyết định việc bạn có lựa chọn đồng hành lâu dài cùng ngành nghề ấy hay không. Tuy vậy, sẽ đến một lúc nào đó bạn chợt nhận ta tiền sẽ không còn là tất cả. Nói như vậy không có nghĩa là bạn lại chìm đắm trong mộng tưởng về một thế giới tràn ngập sự hạnh phúc. Lương vẫn là thứ giúp bạn duy trì cuộc sống nhưng đừng quá bị nó ám ảnh.

 

Hãy thật sự đam mê, đủ những nhiệt huyết để theo đuổi một ngành nào đó. Đừng theo ngành chỉ vì nghĩ nó mang lại cho mình nhiều tiền. Cái gì cũng cần có sự đánh đổi cả. Nếu theo ngành IT (Freelancer IT) chỉ vì ham mức lương chục triệu như cách mà những định hướng, dẫn dắt của báo chí truyền thông đang thực hiện thì bạn sẽ sớm vỡ mộng thôi. Ai sẽ trả mức lương quá cao khi bạn còn nhiều thiếu sót về kinh nghiệm. Thậm chí là chưa kể đến việc hàng tá những áp lực bủa vây ngành IT hay Freelancer IT mà bạn cần phải đối mặt.

Ngược lại, nếu thật sự đam mê, bạn sẽ thấy cái sự code nó không hề mệt mỏi. Bạn sẽ có động lực tiếp thu những công nghệ mới; thích gặp gỡ những gương mặt, tên tuổi đầu ngành để học hỏi để gia tăng mối quan hệ. Tất cả đều giúp ích cho sự nghiệp phát triển của bạn về năng lực. Vì thế, đừng vội vàng mà hãy là một người luôn nỗ lực nhé! 

Lời kết

Nếu đã yêu thích và sẵn sàng lăn xả để đạt đến mục đích thành công trong bất kỳ ngành nghề nào thì bạn hãy trau dồi và rèn luyện những kiến thức, kỹ năng cần thiết ngay từ khi xác định nhé. Điều quan trọng là biết được mình mong muốn gì. TopDev chúc bạn sẽ thành công trên con đường phát triển nghề nghiệp của mình.

Đồng thời (Concurrency) và song song (Parallelism) khác nhau như thế nào?

Đồng thời (Concurrency) và song song (Parallelism) khác nhau như thế nào?

Bài viết được sự cho phép của tác giả Võ Xuân Phong

Rất nhiều người trong chúng ta đã nhầm lẫn hoặc mơ màng về 2 thuật ngữ đồng thời (Concurrency) và song song (Parallelism), thực ra 2 thuật ngữ này  rất khác biệt đồng thời không phải là song song (concurrency is not parallelism), vậy nó khác biệt nhau như thế nào?

  • Concurrency is about dealing with lots of things at once. 
  • Parallelism is about doing lots of things at once.

Chúng ta hãy dành ra ít phút để chiêm nghiệm về  2 từ dealing (sự thỏa hiệp) và doing (làm) trong 2 câu trên nhé, nó khá rối nhưng cũng không kém phần thú vị.

  10 xu hướng ứng dụng di động dự đoán sẽ thống trị năm 2024
  8 npm mẹo cực hay để gây ấn tượng với đồng nghiệp

Concurrency

Concurrency is about dealing with lots of things at once. 

Nó có ý nghĩa là trong một khoảng thời gian nào đó chúng ta có nhiệm vụ phải thực hiện và hoàn thành nhiều công việc, tuy nhiên chúng ta chỉ có thể thực hiện một công việc duy nhất tại một thời điểm ví dụ Trong khoảng thời gian 5 phút cuộc đời, chúng ta vừa code vừa lướt facebook để xem hình crush sự tập trung của chúng ta đã bị chi phối cực độ, chúng ta code được vài giây rồi lại xem hình crush mất vài phút sau đó lại quay lại code rồi lại xem hình crush, 5 phút cuộc đời trôi qua chúng ta đã làm được cho cuộc đời này là code và xem hình crush. Như vậy chúng ta đã làm 2 việc đồng thời (concurrency) trong một khoảng thời gian nào đó.

Đối với các chương trình máy tính cũng vậy các bạn có thể thấy hình bên dưới mô tả về đồng thời (concurrency) một CPU đang thực hiện 2 nhiệm vụ là Task 1 và Task 2  thì CPU sẽ xử lý Task 1 trong khoảng thời gian nào đó rồi lại quay sang xử lý Task 2 và cứ luân phiên đến khi hoàn thành cả 2 Task.

Paralellism

Parallelism is about doing lots of things at once

Nó có ý nghĩa là chúng ta có 2 hoặc nhiều nhiệm vụ phải làm trong một khoảng thời gian, cụ thể ở đây chúng ta có 2 nhiệm vụ và 2 nhiệm vụ đó sẽ được thực hiện một cách song song mà không có sự ngắt quảng.

Chúng ta là con người có một bộ não duy nhất để điều khiển các bộ phận khác trên cơ thể nên có ai vừa có thể vừa cột dây giày vừa đội mũ được không hay là vừa nghĩ đến crush và vừa nghĩ đến người yêu cũ cùng lúc trừ khi chúng ta có thêm đôi tay để vừa đội mũ vừa cột dây giày và có thêm 1 bộ não nữa để có 2 não 1 não nghĩ về crush và não còn lại sẽ nghĩ về người yêu cũ, kiểu đó giống như 3 đầu 6 tay thì mới làm được những điều song song (parallelism) như thế.

Cũng giống như với máy tính CPU giống như bộ não, để xử lý nhiều công việc một cách song song (parallelism) thì nó cần có thêm não là sẽ có thêm CPU, các bạn có thể xem ví dụ parallelism ở hình bên dưới có 2 CPU, CPU 1 xử lý cho Task 1 và CPU sẽ xử lý cho Task 2 một cách song song.

Dưới đây là hình ảnh về đồng thời (Concurrency) và song song (Parallelism).

Lý do tại sao tạo nhiều luồng chạy song song (Parallelism) mà vẫn không cải thiện được hiệu suất?

Tạo nhiều task vụ chạy song song thì phải xem phần cứng số core có đáp ứng được hay không, khi phần cứng chỉ chạy được 2 luồng mà chúng ta tạo ra 10 luồng thì tốc độ vẫn vậy là đúng rồi, khi mà phần cứng đáp ứng được 4 luồng mà chúng ta mới chạy mới có 2 luồng thôi, sau đó tạo thêm 2 luồng nữa thì sẽ thấy hiệu suất thay đổi, còn không thì vẫn vậy à.

Tóm lại:

Con người được tạo hóa ban tặng là chỉ có thể thực hiện công việc một cách đồng thời (concurrency) thôi.

Vậy đối với con người nếu muốn làm tốt một việc gì đó đạt hiệu suất cao nhất thì chúng ta hãy tập trung làm việc đó thôi chứ đừng code và xem hình crush sẽ không code tốt lắm đâu.

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

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

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

Hướng dẫn dùng biến trong CSS để làm dark/light mode

Hướng dẫn dùng biến trong CSS để làm dark/light mode

Bài viết được sự cho phép của tác giả Lưu Bình An

Cách đây mười năm, nếu bạn hỏi mình có thể đặt biến trong CSS thì câu trả lời sẽ là KHÔNG, bạn cần viết bằng các ngôn ngữ như SCSS, LESS để có thể xài biến.

Còn trong năm 2022, thì câu trả lời sẽ là CÓ.

Tại sao chúng ta lại muốn đặt biến màu sắc kích thước? Để khi chúng ta muốn thay đổi bộ mặt một website từ xanh lá chuối sang đỏ rực lửa, chỉ cần “búng tay” là có liền.

  5 điều phiền toái nhất của CSS
  Cách làm các slide và các hiệu ứng hover do JavaScript và CSS tạo ra

Ví dụ chúng ta theo trào lưu “light và dark theme” cho website, user có thể chọn kiểu sáng-sạch-sẽ hay đen-đuông-đuốc

Hướng dẫn dùng biến trong CSS để làm dark/light mode

Cú pháp đặt biến trong CSS, bắt đầu bằng dấu --, sau đó là tên biến

:root {
    --my-background-color: #fff;
    --heading-1-font-size: 15em;
    --another-variable: 20px;
}

Ví dụ sử dụng những biến đã khai báo

h1 {
    background-color: var(--my-background-color);
    font-size: var(--heading-1-font-size);    
}

Chúng ta đưa tất cả những giá trị cần thay đổi khi switch qua lại giữa 2 mode dark/light vào các biến số bên trong body

// Light theme
body {
    --bg-color: #F3F7F9;
    --bg-content-color: #fff;
    --bg-code: #fffbf3;
    --body-color: #444;
    --title-color: #111;
    --link-color: #6b17e6;
    --border-color:  rgba(0,0,0,.1);
    --space: 3.5rem;
    --content-width: 860px;
    --header-height: 80px;
    --radius: 5px;
}

Khi thay đổi giá trị sang dark mode

// Dark theme
body[data-theme="dark"] {
 	--bg-color: #0D2538;
 	--bg-content-color: #0f2d44;
 	--bg-code: rgba(0,0,0,.3);
 	--border-color:  rgba(255,255,255,.1);;
 	--body-color: #ced8de;
 	--title-color: #fff;
 	--link-color: #af9cef;
}

Chúng ta sẽ thêm một số hàm cần thiết vào trong window

// Mượn xài đỡ của overreacted.io
(function() {
    window.__onThemeChange = function() {};
    function setTheme(newTheme) {
        window.__theme = newTheme;
        preferredTheme = newTheme;
        document.body.setAttribute('data-theme', newTheme);
        window.__onThemeChange(newTheme);
    }

    var preferredTheme;
    try {
        preferredTheme = localStorage.getItem('theme');
    } catch (err) { }

    window.__setPreferredTheme = function(newTheme) {
        setTheme(newTheme);
        try {
            localStorage.setItem('theme', newTheme);
        } catch (err) {}
    }

    var darkQuery = window.matchMedia('(prefers-color-scheme: dark)');
    darkQuery.addListener(function(e) {
        window.__setPreferredTheme(e.matches ? 'dark' : 'light')
    });

    setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light'));
})();

Thao tác cuối cùng là một đoạn JS để trigger việc đổi mode

// Ví dụ hàm xử lý onClickChangeTheme sẽ được gắn vào một button

function onClickChangeTheme(mode = 'dark') {
  window.__setPreferredTheme(mode);
}

Chúng ta cũng có thể check được theme mà user đã chọn trước đó

 if (window.__theme == 'dark') // làm gì đó thật vi diệu

Kỹ thuật là như vậy, còn nếu bạn hỏi mình sẽ cập nhập trang blog này cho có 2 mode light/dark theme? Mình sẽ không làm, một số website như trang của mình thì việc switch màu như vậy không đem lại nhiều giá trị cho người đọc.

Bài viết gốc được đăng tải tại Vui Lập Trình

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

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

Project Manager là gì? Công việc của Project Manager

Project Manager là gì

Project Manager là gì? Có vai trò như thế nào trong một dự án? Bài viết dưới đây TopDev sẽ giới thiệu cho bạn rõ hơn về khái niệm PM là gì?

Project Manager là gì?

Project Manager (Quản lý dự án) là người chịu trách nhiệm lập kế hoạch, deadline, ngân sách và tài nguyên cho dự án. Họ đảm bảo rằng dự án hoàn thành đúng thời hạn, trong ngân sách và đạt được các mục tiêu đặt ra.

PM cũng là người chịu trách nhiệm toàn phần cho dự án, đảm bảo mọi người đang hoàn thành tốt nhiệm vụ được giao, theo dõi, báo cáo và update tiến trình và làm việc chủ yếu với các Leader Project.

tuyển dụng it
Project Manager là gì

Project Manager là người luôn là người có thể cân bằng mọi thứ nhưng họ không phải là người truyền động lực, theo dõi giúp đỡ sát sao từng thành viên như Leader Project hay Scrum Master nhưng lại có chung mục tiêu là hoàn thành tốt dự án được đề ra từ trước. Trong một số công ty, doanh nghiệp nhỏ 2 vị trí này hầu như được gộp lại làm 1 để tiết kiệm nhân lực.

  Khám phá sức hút Ekino – điểm dừng chân đáng mơ ước của các Technical Project Manager
  Mẫu bảng mô tả công việc Project Manager

Vai trò và nhiệm vụ của Project Manager

Vai trò của Project Manager

Project Manager đóng vai trò chủ trì trong việc lập kế hoạch, thực hiện, giám sát, kiểm soát tiến trình cho đến khi kết thúc các dự án. Vai trò chính của Project Manager là người có thể phân chia công việc hợp lý, cụ thể đến từng cá nhân, nhóm để có thể hoàn thành tốt được dự án đã đề ra theo đúng yêu cầu, tiến độ, đảm bảo các bước tiến hành luôn thuận lợi. Vai trò của người quản lý dự án có thể kết thúc khi đã hoàn thành dự án được giao.

Nhiệm vụ của PM

Nhiệm vụ của Project Manager bao gồm quản lý tổng thể nhưng họ hiếm khi trực tiếp tham gia vào các hoạt động thực sự tạo ra kết quả cuối cùng của sản phẩm. Project Manager cũng giám sát mọi dự án liên quan, các công cụ và kỹ thuật của dự án để đảm bảo dự án hoạt động tốt. 

Lập kế hoạch dự án

PM có trách nhiệm xác định mục tiêu dự án dựa trên yêu cầu từ các bên liên quan. Họ xây dựng kế hoạch chi tiết, bao gồm phân bổ nguồn lực, lịch trình, ngân sách, và các phương pháp để hoàn thành từng hạng mục. Việc đánh giá và quản lý rủi ro cũng là một phần quan trọng trong nhiệm vụ của PM, giúp chuẩn bị các biện pháp đối phó với những rủi ro tiềm ẩn.

Điều phối và quản lý nguồn lực

PM cần quản lý các nguồn lực của dự án như nhân sự, tài chính và trang thiết bị một cách hiệu quả. Việc phân công công việc cho các thành viên trong nhóm và theo dõi hiệu suất của từng cá nhân giúp đảm bảo rằng mọi nhiệm vụ đều được thực hiện đúng tiến độ và chất lượng. PM còn phải điều chỉnh nguồn lực linh hoạt khi có sự thay đổi hoặc khi phát sinh vấn đề mới.

Theo dõi và kiểm soát tiến độ

Trong suốt quá trình thực hiện dự án, PM phải giám sát tiến độ công việc hàng ngày, đảm bảo rằng mọi hoạt động đều được thực hiện theo đúng lịch trình. Khi có vấn đề phát sinh, PM cần nhanh chóng nhận diện và đưa ra các giải pháp kịp thời để tránh làm ảnh hưởng đến toàn bộ dự án. Bên cạnh đó, PM cũng phải đảm bảo rằng dự án luôn tuân thủ theo ngân sách đã được phê duyệt.

Quản lý giao tiếp

PM đóng vai trò cầu nối giữa nhóm dự án và các bên liên quan như khách hàng, nhà đầu tư, hoặc các đối tác. Nhiệm vụ của PM là đảm bảo thông tin được truyền đạt một cách minh bạch, rõ ràng, và liên tục giữa các bên. Điều này giúp duy trì sự hiểu biết chung về tiến độ dự án, các thay đổi, hoặc bất kỳ rủi ro nào có thể ảnh hưởng đến kết quả.

Quản lý rủi ro và thay đổi

PM cần có kỹ năng nhận diện, đánh giá và kiểm soát các rủi ro trong suốt quá trình thực hiện dự án. Điều này đòi hỏi sự linh hoạt trong việc điều chỉnh kế hoạch và các giải pháp sáng tạo để xử lý các tình huống không lường trước. Việc quản lý thay đổi, bao gồm các yêu cầu mới từ khách hàng hoặc sự điều chỉnh trong phạm vi dự án, cũng là một nhiệm vụ quan trọng mà PM cần xử lý.

Kiểm soát chất lượng

PM phải đảm bảo rằng mọi sản phẩm hoặc dịch vụ được tạo ra trong quá trình thực hiện dự án đều đáp ứng các tiêu chuẩn chất lượng đã đề ra. Điều này đòi hỏi sự theo dõi chặt chẽ trong suốt quá trình sản xuất và thực hiện, cũng như việc kiểm tra kết quả cuối cùng trước khi bàn giao.

Hoàn thiện và bàn giao dự án

Khi dự án hoàn thành, PM có trách nhiệm tổng kết và đánh giá hiệu quả công việc, đồng thời thực hiện các quy trình bàn giao sản phẩm cuối cùng cho khách hàng hoặc các bên liên quan. Điều này bao gồm việc đảm bảo tất cả các hạng mục được hoàn thành theo yêu cầu và không còn vướng mắc nào. PM cũng phải ghi nhận các bài học kinh nghiệm từ dự án để cải thiện cho các dự án tương lai.

Project Manager là gì
Project Manager là gì

Yếu tố để trở thành một Project Manager giỏi

Để trở thành một Project Manager giỏi thì cần có sự hiểu biết về việc:

  • Lập kế hoạch dự án từ khi hình thành đến khi thực hiện
  • Lên sơ đồ timeline
  • Thực hiện từng giai đoạn
  • Phân bổ và quản lý ngân sách
  • Giao tiếp
  • Khắc phục sự cố
  Bí kíp để trở thành một Product Manager giỏi

Khả năng lãnh đạo

Về bản chất Project Manager chính là trưởng nhóm của dự án đó, họ chịu trách nhiệm hoạch định hướng đi và tầm nhìn cho team và đảm bảo mọi người đều đang đi đúng hướng để đưa dự án vượt qua từng giai đoạn.

Tổ chức/hoạch định

Project Manager là gì
Project Manager là gì

Một Project Manager giỏi phải có kỹ năng lập kế hoạch, các bản kế hoạch được lập ra dựa trên những mục tiêu lớn đến những mục tiêu nhỏ để có thể dễ dàng đạt thành công trong dự án. Các Project Manager phải vạch ra các bước cần thiết để thực hiện và tạo một kế hoạch cụ thể hơn để hoàn thành dự án.

Project Manager sẽ phải xác định phạm vi, quy mô của dự án sau đó lên kế hoạch phân phối các nguồn lực cần thiết để hoàn thành dự án. Việc lập kế hoạch dự kiến về thời gian và ngân sách để hoàn thành dự án cũng rất quan trọng.

Giao tiếp

Đi đôi với khả năng lãnh đạo, kỹ năng giao tiếp xuất sắc là yếu tố quyết định thành công của bất kỳ nhà quản lý dự án nào. Bạn cần đảm bảo rằng tất cả các phòng ban, các bên liên quan đều được cập nhật về những diễn biến mới nhất của dự án, đảm bảo họ hiểu mọi thay đổi và nắm được tiến độ dự án. 

Bạn sẽ phải trình bày kế hoạch, thuyết phục cấp trên cung cấp đủ tài nguyên để bạn có thể hoàn thành công việc. Bên cạnh đó bạn còn phải giao tiếp, triển khai kế hoạch với các thành viên trong team, chính vì thế khả năng giao tiếp tốt sẽ là lợi thế mạnh của một Project Manager.

Quản lý rủi ro

Không phải lúc nào dự án của bạn cũng diễn ra suôn sẻ mà không gặp trở ngại nào, sẽ có lúc bạn sẽ gặp vấn đề với vô vàng các lý do khách quan làm trễ nãi dự án hoặc tệ hơn là hoàn thành dự án với kết quả tệ. 

Các dự án hiếm khi thành công ngay mà không có ít nhất một lần trục trặc hoặc thay đổi kế hoạch. Đó là lý do tại sao, bạn cũng cần phải là một nhà quản lý rủi ro bậc thầy khi ở vị trí Project Manager. 

Project Manager phải có tư duy, tầm nhìn, có khả năng dự đoán những gì có thể xảy ra và lên phương án B, C, D để cứu chữa kế hoạch, nên xây dựng tính linh hoạt trong kế hoạch dự án của bạn để tính đến những thay đổi bất ngờ. 

  Persol - Quy mô tầm cỡ và cơ hội rộng mở chào đón Technical Project Manager
Project Manager là gì
Project Manager là gì

Sự khác biệt giữa Project Manager và Scrum Master là gì?

Sự tương đồng

Điểm chung của cả Project Manager và Scrum Master là đều tập trung vào mục đích chính đó là hỗ trợ giải quyết các vấn đề xảy ra trong quá trình làm việc và cách tối ưu hóa các tiến trình sao cho đạt được kết quả tốt nhất, tạo điều kiện thuận lợi cho các thành viên có thể hoàn thành công việc hiệu quả.

Vì đảm nhận nhiệm vụ giống nhau, điều chịu trách nhiệm hỗ trợ team của họ hoàn thành tốt công việc nên thường các dự án chỉ cần có Project Manager hoặc Scrum Master chứ không cần sự hiện diện của cả hai.

Sự khác biệt

Dù có chung vai trò là chịu trách nhiệm hỗ trợ team của họ hoàn thành tốt công việc nhưng các Project Manager quản lý dưới góc nhìn của người quản lý còn Scrum Master thì quản lý dưới góc nhìn của một thành viên trong team.

Project Manager giúp quản lý tiến trình, nguồn lực, phạm vi dự án, tất tần tật về hoạt động của một dự án để đáp ứng các yêu cầu được đề ra. Trong khi, Scrum Master đảm nhận vai trò “khiêm tốn” hơn, các Scrum Master chỉ cần điều phối công việc, kết nối, đảm bảo cho các thành viên của nhóm scrum có thể hoàn thành tốt Sprint.

Học ngành nào để làm được PM?

Quản lý dự án (Project Management)

Đây là ngành học trực tiếp và liên quan nhất, giúp bạn nắm vững các công cụ, phương pháp và quy trình quản lý dự án như lập kế hoạch, phân bổ nguồn lực, quản lý rủi ro, và điều phối nhóm dự án. Bạn cũng sẽ học về các mô hình quản lý như Agile, Scrum, PMP, và PRINCE2.

Quản trị kinh doanh (Business Administration)

Ngành này cung cấp kiến thức toàn diện về cách quản lý và điều hành các dự án trong môi trường doanh nghiệp. Sinh viên học quản lý tài chính, lãnh đạo đội ngũ, chiến lược kinh doanh, và quản lý nguồn lực, những kỹ năng cần thiết cho PM khi điều phối dự án ở nhiều lĩnh vực khác nhau.

Công nghệ thông tin (Information Technology)

Các dự án về phát triển phần mềm, hệ thống thông tin hoặc công nghệ thường cần PM xuất phát từ lĩnh vực công nghệ thông tin. Ngành học này cung cấp kiến thức về lập trình, mạng, và hệ thống thông tin, giúp PM hiểu rõ quy trình kỹ thuật và quản lý các nhóm phát triển công nghệ.

Chứng chỉ của Project Manager

Trở thành nhà quản lý dự án được chứng nhận có thể mở ra nhiều cơ hội nghề nghiệp và công việc được trả lương cao hơn. Chứng chỉ PMP do Viện Quản Lý Dự Án Hoa Kỳ (Project Management Institute – PMI) cấp là một trong những chứng chỉ mà các Project Manager đều mong muốn đạt được.

Lợi ích của việc sở hữu chứng chỉ PMP rất nhiều vì đây là chứng chỉ được công nhận toàn cầu chính vì thế người có PMP sẽ có cơ hội thăng tiến cao, cơ hội ra nước ngoài làm việc, mức lương cao hơn khoảng 50% so với mức lương của các Project Manager không có chứng chỉ.

Có nhiều dự án quốc tế có yêu cầu bắt buộc các thành viên tham gia có chứng chỉ PMP, chính vì thế những người sở hữu chứng chỉ này sẽ có nhiều lợi thế hơn trong ngành.

Mức lương và cơ hội nghề nghiệp của PM

Mức lương của một Project Manager (PM) trên thế giới có thể khác nhau tùy thuộc vào nhiều yếu tố như kinh nghiệm, ngành nghề, và vị trí địa lý. Theo số liệu mới nhất từ Salary.com và Zippia, mức lương trung bình của một Project Manager trên thế giới dao động từ $69,000 đến $131,000 USD/năm:

  • Hoa Kỳ: Mức lương trung bình của một Project Manager là khoảng $96,320 USD/năm
  • Anh Quốc: Mức lương trung bình là khoảng £65,000 GBP/năm (tương đương khoảng $81,227 USD/năm)
  • Úc: Mức lương trung bình là khoảng 142,000 AUD/năm (tương đương khoảng $112,000 USD/năm)
  • Thụy Sĩ: Mức lương trung bình là khoảng 130,000 CHF/năm (tương đương khoảng $130,966 USD/năm)

Tại Việt Nam: Theo báo cáo thị trường IT năm 2024 từ TopDev, mức lương trung bình của một Project Manager tại Việt Nam dao động từ 1,640$ đến 2,450$/tháng, và có thể cao hơn tùy thuộc vào năng lực và kinh nghiệm cá nhân. Trong các ngành công nghệ thông tin hoặc xây dựng, mức lương này có thể lên đến 80 triệu VND/tháng hoặc thậm chí hơn.

Về cơ hội nghề nghiệp, PM là một vị trí rất được ưa chuộng và có nhiều cơ hội phát triển. Bạn có thể làm việc trong nhiều ngành như công nghệ thông tin, xây dựng, kinh doanh, và nhiều lĩnh vực khác.

Trên đây là một số thông tin về PM là gì, hy vọng qua bài viết bạn đọc sẽ hiểu rõ hơn về Product Manager, từ đó bạn sẽ có thêm thông tin để lựa chọn nghề nghiệp phù hợp hơn cho bản thân. Chúc bạn thành công!

Xem thêm nhiều việc làm Project Manager hấp dẫn, lương cao tại TopDev

Code game rắn săn mồi trên console bằng C++

Code game rắn săn mồi trên console bằng C++

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

Chắc hẳn tuổi thơ của mỗi chúng ta thì không còn xa lạ gì với tựa game Snake hay tiếng Việt là rắn săn mồi đúng không. Hôm nay chúng ta sẽ cùng code lại game đó trên console bằng C++.

Nếu bạn đang thắc mắc vì sao lại là console mà không phải một nền tảng nào khác, giao diện, đồ họa đẹp hơn thì đơn giản là vì nó dễ. Hơn nữa, mới bắt đầu học lập trình thì hầu hết mọi người đều học trên nền console app nên việc tiếp cận game bằng console app cũng trở nên vô cùng dễ dàng.

  Vừa học vừa chơi! Top 15+ game lập trình miễn phí
  7 game miễn phí giúp bạn nâng cao kỹ năng lập trình

Bạn nào thấy code game trên console chán quá thì có thể thoát ngay post này, xem code snake game bằng python trên kênh Youtube của mình nha. Link video tại đây, có code trên github dưới phần mô tả video.

Demo game

Trước khi bắt đầu để mấy bạn có hứng thú một chút thì cùng xem qua thành phẩm sau khi code xong nha!

Thì game này khá là đơn giản, chỉ bằng việc sử dụng các kiến thức cơ bản đã học trong C++, cũng như lên mạng tìm thêm 1 số hàm, thư viện hỗ trợ việc làm việc trên console nữa là được. Bây giờ hãy cùng xem cách tạo ra game này như thế nào nha!

Lưu ý là code của bài này khá dài nên mình sẽ không show hết ra được, các bạn có thể xem code trên Github nha.

Game hoạt động như thế nào?

Game rắn săn mồi đã quá phổ biến nên mình chỉ mô tả đơn giản. Trong game này, người chơi sẽ điều khiển con rắn đi ăn những quả táo, khi ăn thì con rắn sẽ ngày càng dài thêm. Người chơi sẽ bị thua khi đụng tường bao quanh hoặc con rắn tự cắn chính bản thân nó.

Đơn giản chỉ có vậy thôi, việc của chúng ta là làm sao để tạo ra được game đó. Thì chúng ta sẽ vẽ lại con rắn trên màn hình console sử dụng các ký tự. Khi con rắn di chuyển, chúng ta sẽ vẽ lại con rắn đó để thể hiện sự di chuyển của nó. Vì con rắn di chuyển liên tục nên chúng ta sẽ đặt nó trong một vòng lặp.

Đến đây thì chắc các bạn đã hình dung ra được cách code game này như thế nào rồi đúng không! Cùng bắt đầu thôi!

Tạo con rắn và vẽ lên màn hình

Vì game này là 1 game 2D nên đầu tiên, mình sẽ xây dựng struct Point biểu diễn 1 điểm trước. Con rắn của mình sẽ được thể hiện bằng một dãy các điểm này, thể hiện vị trí của nó trên mặt phẳng 2D. Do đó mình sẽ dùng vector để lưu con rắn, mình sẽ khởi tạo con rắn ban đầu luôn.

Bạn nào không biết vector là gì thì có thể xem lại bài viết của mình tại đây nha.

struct Point
{
	int x;
	int y;
};

vector<Point> snake = {
	Point{ WIDTH / 2 + 2, HEIGHT / 2 },
	Point{ WIDTH / 2 + 1, HEIGHT / 2 },
	Point{ WIDTH / 2, HEIGHT / 2 },
	Point{ WIDTH / 2 - 1, HEIGHT / 2 },
	Point{ WIDTH / 2 - 2, HEIGHT / 2 }
};

Để vẽ con rắn lên màn hình thì mình chỉ cần di chuyển con trỏ đến vị trí đó (dùng hàm gotoxy) và in ra là được. Hàm gotoxy thì các bạn xem trong code trên Github nha.

void drawSnakePart(Point p)
{
	gotoxy(p.x, p.y);
	// BODY là ký tự đại diện cho phần thân của con rắn
	cout << BODY;
}

void drawSnake()
{
	for (size_t i = 0; i < snake.size(); i++)
		drawSnakePart(snake[i]);
}

Di chuyển

Tất nhiên trong mặt phẳng thì chỉ có 4 hướng di chuyển thôi, mình sẽ quy định các hướng di chuyển đó bằng enum class. Đương nhiên là sẽ có 1 biến toàn cục để biết hướng hiện tại của con rắn.

enum class Direction
 {
	up,
	right,
	down,
	left
};

Direction direction = Direction::right;

Khi con rắn di chuyển, các bạn để ý phần đầu con rắn đi qua đâu thì phần đuôi chắc chắn phải đi theo đó. Ta sẽ quy định phần đầu con rắn là phần tử đầu tiên. Vậy để làm con rắn di chuyển, chúng ta sẽ cập nhật lại các giá trị tọa độ các phần của con rắn.

Cụ thể chúng ta sẽ dịch các phần tử về bên phải (con rắn đang bò theo phần đầu) và chừa chỗ trống cho phần đầu nhận giá trị mới. Giá trị tọa độ mới của phần đầu sẽ tùy theo hướng đang di chuyển.

void move()
{
	for (size_t i = snake.size() - 1; i > 0; i--)
		snake[i] = snake[i - 1];
	if (direction == Direction::up)
		snake[0].y -= 1;
	else if (direction == Direction::down)
		snake[0].y += 1;
	else if (direction == Direction::left)
		snake[0].x -= 1;
	else if (direction == Direction::right)
		snake[0].x += 1;
}

Tiếp theo, như mình đã nói ở đầu bài viết, khi con rắn di chuyển chúng ta sẽ vẽ lại chuyển động của nó. Do đó mình sẽ dùng một vòng lặp, giữa các lần lặp sẽ nhận điều khiển từ bàn phím, di chuyển con rắn và vẽ lại, sau đó chờ (để người dùng có thể nhìn thấy sự di chuyển đó).

Mình sẽ sử dụng các phím A, W, S, D để điều khiển con rắn.

while (true)
{
	// Nếu có nhấn phím
	if (_kbhit())
	{
		// Đọc phím vừa nhấn
		char ch = _getch();
		// lower để nhận được cả in hoa và in thường
		ch = tolower(ch);
		if (ch == 'a')
			direction = Direction::left;
		else if (ch == 'w')
			direction = Direction::up;
		else if (ch == 's')
			direction = Direction::down;
		else if (ch == 'd')
			direction = Direction::right;
		else if (ch == 'q') // Quit game
			break;
	}
	move();
	drawSnake();
	// Có thể xem REFRESH_RATE chính là tốc độ của con rắn
	// Nếu REFRESH_RATE càng nhỏ thì càng nhan và ngược lại
	Sleep(REFRESH_RATE);
	// Sau khi xong thì xóa để vẽ lần tiếp theo
	system("cls");
}

Giờ thì bạn có thể run thử app để xem kết quả. Cái cách cứ vẽ xong lại xóa, rồi lại vẽ lại toàn bộ con rắn này không được tối ưu lắm, chút nữa mình sẽ thực hiện 1 cách khác tối ưu hơn.

Giới hạn khu vực chơi

Tiếp theo chúng ta sẽ giới hạn khu vực chơi bằng cách vẽ ra các bức tường, mình gọi là box (thông cảm vì tiếng anh mình hơi kém ^^). Để vẽ ra các bức tường này thì cũng đơn giản, chỉ cần cho vòng lặp rồi in ra các ký tự thể hiện cho các bức tường thôi, sau đó chúng ta sẽ gọi hàm vẽ này trong vòng lặp lúc nảy để nó vẽ lại box mỗi lần con rắn di chuyển ở mỗi frame.

void drawBox()
{

	// WIDTH và HEIGHT là kích thước hộp được đặt trước
	for (size_t i = 0; i < WIDTH; i++)
		cout << '=';
	gotoxy(0, HEIGHT);
	for (size_t i = 0; i < WIDTH; i++)
		cout << '=';
	for (size_t i = 1; i < HEIGHT; i++)
	{
		gotoxy(0, i);
		cout << '|';
	}
	for (size_t i = 1; i < HEIGHT; i++)
	{
		gotoxy(WIDTH, i);
		cout << '|';
	}
}

// Và trong vòng lặp
move();
drawBox();
drawSnake();

Tiếp tục bạn có thể run app để check thử!

Tìm việc làm Game đãi ngộ tốt trên TopDev

Thêm logic cho game

Tiếp theo chúng ta cần xử lý các trường hợp con rắn tự cắn chính nó, đụng vào tường và nó không được quay đầu 180 độ.

Cái dễ làm trước, để tránh việc con rắn quay đầu 180 độ, mình chỉ cần kiểm tra lúc người dùng điều khiển con rắn xem là hướng vừa được chọn có đối với hướng hiện tại không thôi.

if (ch == 'a' && direction != Direction::right)
	direction = Direction::left;
else if (ch == 'w' && direction != Direction::down)
	direction = Direction::up;
else if (ch == 's' && direction != Direction::up)
	direction = Direction::down;
else if (ch == 'd' && direction != Direction::left)
	direction = Direction::right;
else if (ch == 'q') // Quit game
	break;

Tiếp theo xem con rắn có đụng tường hay không cũng đơn giản, bạn kiểm tra xem phần đầu của con rắn chính là phần tử đầu tiên, tọa độ của nó có trùng với box không.

bool isHitWall()
{
	return snake[0].x == 0 || snake[0].y == 0 || snake[0].x == WIDTH || snake[0].y == HEIGHT;
}

Phần cuối cùng là kiểm tra xem con rắn nó có tự cắn chính mình không, đơn giản chúng ta chỉ cần kiểm tra xem phần đầu nó có bị trùng với phần thân nào không, như vậy là nó đang cắn chính mình.

bool isBiteItself()
{
	Point head = snake[0];
	for (size_t i = 1; i < snake.size(); i++)
		if (head.x == snake[i].x && head.y == snake[i].y)
			return true;
	return false;
}

Và cuối cùng, nhớ thêm các logic này vào vòng lặp lúc đầu.

move();
if (isBiteItself())
	break;
if (isHitWall())
	break;
drawSnake();

Tương tự như lúc nảy, bạn có thể run app để check thử xem các logic trên đã hoạt động hay chưa.

Tối ưu hiệu năng

Như đã nói lúc nảy, cứ mỗi 1 khung hình lại phải vẽ lại 1 lần cả con rắn và cả box, mình sẽ xử lý chuyện này như sau: mình sẽ tránh việc sử dụng lệnh xóa màn hình để tránh phải vẽ lại toàn bộ, thay vào đó mình sẽ vẽ box chỉ 1 lần, vẽ toàn bộ con rắn 1 lần đầu tiên. Tiếp theo đó, mình sẽ vẽ thêm phần đầu mới cho con rắn và xóa bỏ phần đuôi cũ. Như vậy hiệu năng sẽ được cải thiện đáng kể.

Để làm được việc đó, mình cần 1 biến lưu phần đuôi cũ của con rắn, sau đó cập nhật phần đuôi cũ này trong hàm move. Sau đó mình sẽ viết hàm drawHeadnTail để thực hiện việc vẽ đàu và xóa đuôi cũ đi.

Point prevTail;

void move()
{
	// lưu phần đuôi cũ lại
	prevTail = snake.back();
	// code gores here
}

void drawHeadnTail()
{
	gotoxy(snake[0].x, snake[0].y);
	cout << BODY;
 // vẽ phần đầu mới
	Point tail = snake.back();
	gotoxy(prevTail.x, prevTail.y);
	cout << ' '; // xóa phần đuôi cũ đi
}

Chức năng cuối cùng – Ăn mồi

Như đã nói thì mồi ở đây mình sẽ cho là những quả táo. Mình sẽ tạo ngẫu nhiên những quả táo trong khu vực chơi, khi con rắn ăn được thì nó sẽ dài ra thêm và 1 quả táo khác được tạo ra và cứ thế tiếp tục.

Để tạo quả táo thì cũng đơn giản, mình chỉ cần gán tọa độ x, y của quả táo ngẫu nhiên trong khoảng x thuộc (0; WIDTH) và y thuộc (0; HEIGHT). Hàm sinh quả táo của mình như sau:

Point apple;

void genApple()
{
	srand(time(0));
	int x = rand() % (WIDTH - 1) + 1;
	int y = rand() % (HEIGHT - 1) + 1;
	apple = {
		x,
		y,
	};
	// Sau khi có tọa độ quả táo thì vẽ lên màn hình
	gotoxy(x, y);
	cout << APPLE;
}

Tiếp theo chúng ta sẽ kiểm tra xem trái táo đã được ăn chưa, chỉ cần kiểm tra xem đầu của con rắn của trùng với quả táo hay không là được.

bool isAteApple()
{
	return snake[0].x == apple.x && snake[0].y == apple.y;
}

Khi mà đã ăn được mồi thì phải tăng chiều dài của con rắn lên, mình sẽ thực hiện thêm 1 phần tử vào đuôi của con rắn. Phần đuôi này cũng đơn giản không kém, mình chỉ cần thêm lại phần đuôi trước đó vào thôi, mình sẽ code như sau:

void growing()
{
	snake.push_back(prevTail);
}

Như vậy là chúng ta đã viết xong các hàm cần thiết, giờ thì chúng ta chỉ cần thêm chúng vào vòng lặp của game là xong. Chúng ta sẽ kiểm tra nếu con rắn ăn được mồi thì cần phải tạo quả táo khác và tăng chiều dài con rắn lên. Mình sẽ thêm đoạn code sau:

if (isAteApple())
{
	growing();
	genApple();
}

Đến đây xem như game của mình đã hoàn thành. Việc còn lại chỉ là cho hiện điểm số, các menu start, hiện kết quả sau khi chơi xong… Phần này thì các bạn có thể xem code trong Github nha.

Lời kết

Như vậy là trong bài viết này mình đã hướng dẫn các bạn cách code game Snake đơn giản trên console. Thực tế thì chả ai lại đi làm game trên console cả, nhưng nó lại là lựa chọn hợp lý cho mọi sự bắt đầu của lập trình, trong đó có cả game.

Trong bài này mình viết mọi thứ hết trong một file và không code theo OOP (do mình lười quá “=))”). Các bạn có thể refactor code của mình lại theo OOP cho dễ quản lý, nâng cấp và nhìn professional hơn nha. Trên trang của mình có chuỗi bài viết về OOP, các bạn có thể search trên trang mình nha ^^.

Nếu các bạn có bất kỳ thắc mắc nào hoặc góp ý, đừng ngần ngại comment phía bên dưới bài viết để mình phát triển bài viết tốt hơn nha. Cảm ơn các bạn đã đọc bài viết!

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

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

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

Dưới 20 tuổi thì học lập trình như thế nào?

Dưới 20 tuổi thì học lập trình như thế nào?

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

Chào các bạn,

Dạo gần đây mình thấy có rất nhiều bạn trẻ quan tâm tới việc học lập trình, nhưng lại không biết bắt đầu từ đâu, nên mình viết bài này với mong muốn chia sẻ vài điều về “Cách học lập trình khi bạn dưới 20 tuổi”.

Lưu ý: Cách học dưới đây sẽ đem đến cho bạn nhiều trải nghiệm, nhưng lại tốn thời gian, nên sẽ phù hợp với các bạn:
– Có nhiều thời gian và sức khỏe
– Chưa đặt nặng vấn đề “cơm áo”
– Nhiệt huyết

Đó cũng là lý do tại sao bài viết này chỉ dành cho các bạn dưới 20 tuổi.

Dài dòng quá, bắt đầu thôi …

  10 câu nói cực hay về lập trình
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

BƯỚC 0: SUY NGHĨ TRƯỚC KHI BẮT ĐẦU

Mình gặp rất nhiều bạn vào nghề IT, hoặc học trường ĐH về IT rồi mới biết mình không hợp với nghề này. Đương nhiên không phải họ kém cỏi, mà đơn giản là các dòng code không làm cho họ cảm thấy thú vị, đáng nói hơn là không ít trong số họ từng có mong muốn được làm việc trong ngành này.

Kể ra như vậy không phải để dọa, mà để các bạn hãy suy nghĩ nghiêm túc trước khi bắt đầu học lập trình. Bởi nếu không thích, thì có nhét mấy, nhét nữa thì bạn cũng chẳng viết được vòng lặp for đâu. Bạn cũng không nên ép bản thân phải thích thì bạn không thích, vì bạn còn trẻ, bạn còn rất nhiều thời gian để khám xem bản thân mình thích gì.

– Tôi từng rất thần tượng những người đánh máy tính nhanh
– Tôi rất tò mò về thế giới công nghệ
– Tôi nhận thấy “phần mềm” sẽ làm thay đổi thế giới
– Tôi xem các video hướng dẫn học lập trình trên mạng, và tôi bị chúng cuốn hút

Vậy là tôi quyết định học lập trình

>> Đọc thêm: Để trở thành lập trình viên bạn cần gì

BƯỚC 1: XÁC ĐỊNH BÀI TOÁN

Bước này tập trung trả lời 2 câu hỏi sau

  • Câu hỏi 1: Bạn muốn tạo ra phần mềm gì?
  • Câu hỏi 2: Để tạo ra phần mềm đó, bạn cần học những công nghệ gì?

Câu hỏi 1: Bạn muốn tạo ra phần mềm gì?

Tại sao phải trả lời câu hỏi này

Thế giới lập trình nói chung rất rộng, bạn không thể nào học được hết. Thậm chí khi đã xác định được bạn sẽ theo học lập trình mảng nào (web, desktop, mobile), thì mảng đó cũng là cả một bầu trời kiến thức. Mặt khác việc học lập trình là để tạo ra phần mềm, cho nên để rõ ràng mục tiêu của việc học thì hãy trả lời câu hỏi “Bạn muốn tạo ra phần mềm gì“.

Làm sao để trả lời câu hỏi này?

Chẳng có công thức nào cả, chính bạn còn không biết thì ai biết.

Tôi muốn lập trình ra một website dạng blog cá nhân, để có thể viết bài, chia sẻ kiến thức cho mọi người.

Câu hỏi 2: Để tạo ra phần mềm đó, bạn cần học những công nghệ gì?

Tại sao phải trả lời câu hỏi này?

Một phần mềm có thể được tạo ra bằng những công nghệ khác nhau, bạn cần làm rõ đó là công nghệ gì để tiếp tục theo học.

Làm sao để trả lời câu hỏi này?

Hãy mô tả về phần mềm bạn muốn làm lên các nhóm, diễn đàn về lập trình, hỏi mọi người trên đó xem một phần mềm như vậy cần phải học những gì.

Tôi thấy mọi người bảo để tạo ra một website thì cần học html, css, javascript, php và mysql

BƯỚC 2: BẮT TAY VÀO HỌC

Sau khi lựa chọn được các công nghệ cần học, bạn hãy lên kế hoạch để học từng thứ một.

Lưu ý, đây là bước quan trọng nhất, quyết định kết quả của việc học lập trình, trong thực tế, rất nhiều bạn đã bỏ cuộc ở bước này.

– Tôi mất một tuần chỉ để hiểu HTML là gì trước khi thật sự code nó
– Tôi mất 4h đồng hồ chỉ để tìm ra lỗi “Tại sao ảnh không hiển thị – lý do là tôi viết sai thẻ <img src> thành <img scr>”
– Tôi mất cả ngày trời tìm lỗi, vì tôi không hiểu tại sao ‘1’ + ‘1’ lại bằng ’11’ trong js, kết quả tôi quên ép về string về dạng int
– Tôi mất vài ngày trời để khởi động xampp, vì skype chiếm cổng 80
– Tôi mất vài tuần trời để hiểu hiểu lập trình hướng đối tượng là gì, tại sao người ta ưa chuộng nó hơn hướng cấu trúc
– Tôi mất cả tháng trời để học mysql và cách thiết kế database: 1 – 1, 1 – n, n – n
– Sau nhiều lần gặp lỗi và search gooogle, tôi biết search bằng Tiếng Anh sẽ cho ra nhiều kết quả hơn Tiếng Việt
– Sau nhiều search google bằng Tiếng Anh, tôi biết rằng kết quả từ stackoverflow thường cho tôi câu trả lời
– Tôi tự nhận thấy rằng mình cần học thêm nhiều thứ nữa, và lại lên kế hoạch để học tiếp: giải thuật sắp xếp, giải thuật tìm kiếm, đệ quy, coding convention,…

>> Đọc thêm: Cách học một công nghệ mới hiệu quả

BƯỚC 3: BẮT TAY VÀO CODE

Hãy áp dụng tất cả các kiến thức mà bạn đã học được, tích lũy được trong thời gian qua để làm cái phần mềm mà bạn đã ao ước thực hiện bấy lâu.

– Tôi hăm hở tới nỗi, code liên tục 2 ngày trời mà không cần chạy thử, cho tới lúc chạy thử thì lỗi bung bét
– Tôi từng đập đi xây lại không dưới 20 lần cái blog cá nhân
– Tôi từng code từ 4h sáng tới 11h đêm liên tục (đương nhiên là vẫn ăn đủ 3 bữa)

LỜI KẾT

Bạn chỉ mất 3 phút để đọc hết bài viết này, nhưng có thể mất tới 3 năm để thực hiện hết các bước. Hãy kiên nhẫn và đừng từ bỏ, nếu định từ bỏ, hãy nghĩ tới lý do bạn bắt đầu.

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

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

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

Tech Lead là gì? Nhiệm vụ, vai trò của Tech Lead trong team

tech lead là gì

Tech Lead là gì? Nhiệm vụ, vai trò và tầm quan trọng của Tech Lead trong team là gì? Những câu hỏi này sẽ được TopDev giải đáp cho bạn ngay trong bài viết dưới đây!

Công nghệ thông tin là một ngành có khá nhiều thuật ngữ khó hiểu và từ chuyên ngành chỉ có những người trong ngành mới có thể hiểu hết nghĩa. Có thể bạn đã nghe qua các chức danh như Architect (Kiến trúc sư), Tech Lead (Trưởng nhóm kỹ thuật), Team Leader (Trưởng nhóm) và Engineering Manager (Giám đốc kỹ thuật) đôi khi gây ra nhiều sự nhầm lẫn về vai trò và trách nhiệm của các vị trí này trong team.

Trong bài viết này, TopDev sẽ gửi đến bạn đọc tất cả các thông tin liên quan đến chức danh Tech Lead trong ngành IT để người đọc có cái nhìn khách quan hơn và không còn bị nhầm lẫn về vị trí này.

Tech Lead là gì?

tech lead là gì

Tech Lead là một Software Engineer (kỹ sư phần mềm) chịu trách nhiệm dẫn dắt một nhóm và điều chỉnh hướng kỹ thuật. Họ là người theo dõi và đưa ra các hướng kỹ thuật tối ưu nhất, công việc chính của họ là xây dựng tầm nhìn, giải quyết các bất đồng và quản lý chất lượng kỹ thuật.

Một Tech Lead giỏi là người có khả năng đưa ra những phương án kỹ thuật hiệu quả, phù hợp, chấp nhận đầu tư vào các công cụ được cải tiến liên tục, hệ thống phát triển để đáp ứng nhu cầu công việc, hỗ trợ các thành viên trong team luôn đi đúng hướng, hiệu quả công việc cao.

Đôi khi vai trò của Team Leader sẽ được các thành viên luân phiên đảm nhiệm, nhưng đối với vị trí của Tech Lead thì không như vậy. Tech Lead có thể đồng lãnh đạo một team với các vai trò khác như Product Manager, Engineering Manager hay Team Leader. 

Khi đó Product Manager chịu trách nhiệm vào “Cái gì”, Engineering Manager hay Team Leader tập trung vào“ Phát triển con người và nhóm”, Tech Lead tập trung vào “Phát triển kỹ thuật” của các thành viên trong nhóm và hệ thống. Trọng tâm duy nhất của Tech Lead là dẫn đầu về chỉ đạo kỹ thuật và chất lượng cho nhóm, họ cũng có thể có thêm trách nhiệm tùy thuộc vào nhóm cụ thể.

  Mẫu bảng mô tả công việc vị trí Technical Leader

Vai trò và trách nhiệm của Tech Lead

Vai trò

Trong một team, tùy thuộc vào quy mô của từng dự án mà có 1 hoặc nhiều vị trí đảm nhận vai trò quản lý khác nhau. Đối với những dự án lớn, trong một team có thể có cả 3 vai trò như Product Manager, Engineering Manager và Tech Lead, mỗi vị trí sẽ đảm nhận những nhiệm vụ khác nhau. 

Trong trường hợp này, Tech Lead thường là người chịu trách nhiệm toàn bộ về mảng tech, họ sẽ tham gia nhiều hơn vào các cuộc thảo luận và quyết định về kiến ​​trúc code. Đồng thời Tech Lead cũng sẽ quan sát, quản lý chất lượng của codebase và sự phát triển kỹ thuật của team.

Có thể thấy dù cho trong nhóm có thêm bao nhiêu vị trí nữa thì Tech Lead vẫn luôn thực hiện đúng chức năng của mình đó là điều hướng và lãnh đạo về mặt kỹ thuật của team. Một Tech Lead giỏi sẽ đồng hành cùng team, code cùng team, hiện thực hóa các ý tưởng, giải quyết vấn đề, xác định rủi ro kỹ thuật và hơn hết là phải có niềm tin vào các thành viên của team.

Trách nhiệm

tech lead là gì

Tech Lead làm việc với tư cách là người quản lý dự án và sản phẩm thiên về khía cạnh kỹ thuật cho team Developer Software Systems hay Computer Systems. Họ làm việc với giám đốc điều hành công ty hoặc khách hàng từ đó xác định yêu cầu về các thông số kỹ thuật cho hệ thống, đảm bảo hệ thống đủ mạnh để đáp ứng nhu cầu về các quy trình kinh doanh của khách. 

Tech Lead cũng phát triển sản phẩm để phù hợp với kiến ​​trúc của công ty hoặc yêu cầu của khách hàng, làm cho việc tích hợp trở nên trực quan và đảm bảo tất cả các bộ phận hoạt động cùng nhau, Tech Lead tạo ra các sơ đồ của toàn bộ kiến ​​trúc mạng. Trách nhiệm của Tech Lead bao gồm:

  • Xây dựng mối quan hệ với các nhà cung cấp phần mềm và phần cứng
  • Chỉ ra những hạn chế với kiến ​​trúc kỹ thuật và sửa chữa chúng
  • Sử dụng Java và Apex để xây dựng phần mềm
  • Outsourcing một số task phát triển nhất định cho các công ty đối tác
  Con đường để bạn trở thành tech lead

Các kỹ năng cần có của một Tech Lead là gì?

Ngoài các kỹ năng mềm như kỹ năng giao tiếp, quản lý, tổng hợp thông tin… thì một Tech Lead cần có các thêm kỹ năng phụ hỗ trợ cho chuyên ngành của họ để có thể giúp hoàn thành tốt công việc của vị trí Tech Lead.

Development (Phát triển)

Develop là nền tảng của Tech Lead, Tech Lead cần biết cách viết mã và có thể nhận ra được một mã chất lượng tốt trông như thế nào. Tech Lead sẽ phải giúp đỡ team của mình khi gặp phải bất kỳ trục trặc về kỹ thuật nào mà họ gặp phải.

Architecture (Kiến trúc)

Develop chỉ là một phần công việc của việc xây dựng hệ thống, Tech Lead cần phải có hiểu biết rộng hơn về các phần mềm phù hợp với hệ thống tổng thể. Họ cần hiểu rõ về phương thức phần mềm được triển khai, quản lý và vận hành trong môi trường sản xuất.

Leadership (Khả năng lãnh đạo)

Một Tech Lead chuyên nghiệp cần có kỹ năng lãnh đạo mạnh mẽ, ngay cả khi họ không chịu trách nhiệm quản lý toàn phần của dự án. Các kỹ năng thuộc kỹ năng lãnh đạo như huấn luyện, tạo sức ảnh hưởng và ủy quyền là chìa khóa thành công của Tech Lead.

  Team Leader là gì? Những kỹ năng nào mà một Team Leader cần có?

Sự khác biệt giữa Tech Lead và Engineering Manager

Việc các công ty kết hợp vai trò Tech Lead và Engineering Manager là rất phổ biến. Mặc dù cả hai vai trò có một số điểm chung, nhưng mục tiêu công việc của 2 vai trò này lại khác nhau: Tech Lead chịu trách nhiệm về Hệ thống trong khi Engineering Manager chịu trách nhiệm về Con người.

Trong các công ty vừa và nhỏ hoặc nếu Tech Lead là một người có nhiều kinh nghiệm thì các Tech Lead có thể đảm nhận luôn vai trò của Engineering Manager trong những công ty đó. Trong trường hợp khi hệ thống và đội ngũ phát triển có quy mô và độ phức tạp cao, thì Tech Lead và Engineering Manager được đảm nhận bởi 2 người tách biệt.

Bảng so sánh

Tech Lead (Hệ thống) Engineering Manager (Con người)
Giỏi về kỹ thuật và đổi mới Lập kế hoạch nghề nghiệp, thăng chức và huấn luyện
Tích hợp kiến ​​trúc và hệ thống Lập kế hoạch và thuê nhân viên
Cố vấn công nghệ, áp dụng và liên kết Lập kế hoạch và phân phối team
Bản trình bày thiết kế hệ thống Tham gia vào các quyết định kỹ thuật
Hands-On Coding 30% – 70% thời gian Hands-On Coding 0% – 30% thời gian
Điều hướng Platform, Patterns và Practices Năng suất và chỉ số của team
SLA hệ thống, số liệu và giám sát Bảo vệ team

 

Có thể bạn muốn xem thêm:

Xem thêm việc làm Tech Lead hấp dẫn, lương cao tại TopDev!

Weekly UI – Hướng dẫn code giao diện trang sản phẩm đơn giản

Weekly UI – Hướng dẫn code giao diện trang sản phẩm đơn giản

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

Hôm nay ngồi rãnh rỗi tranh thủ viết tiếp serie Weekly UI cho các bạn newbie. Hôm trước hướng dẫn làm form đăng nhập UI đơn giản rồi, hôm nay chuyển hướng sang làm trang sản phẩm về giày có tên là Jogger. Và các bạn cũng nhìn thấy trên ảnh đại diện rồi. Không chần chừ nữa, sau đây mình sẽ vào bước phân tích nó nhé.

  "Mẹo bỏ túi" cho dân coder mới vào nghề
  18 designer hàng đầu dự đoán về xu hướng UI/ UX trong năm 2022

# Phân tích

Weekly UI – Hướng dẫn code giao diện trang sản phẩm đơn giản

Layout: Nhìn vào giao diện mình thấy có ba phần riêng biệt đó là header trên cùng gồm có menu, logo chữ Shoes và các icon bên phải, phần thứ hai là navigation bên trái có các liên kết và icon mạng xã hội nằm theo chiều dọc và cuối cùng là phần chính Slider chiếm phần lớn giao diện.

Đặt tên class: Đây là trang sản phẩm thì các bạn có thể đặt tên class là .single__product hoặc .product thôi cho gọn cũng được. Đây là class cha bọc lại khi chúng ta code HTML.

Icons: Mình dùng font-awesome, có hỗ trợ trong Codepen luôn, các bạn vào Codepen chọn phần Setting rồi hiện ra giao diện như hình dưới đây, các bạn gõ vào font-awesome hiện ra chọn sau đó nhấn Save & Close là xong.

Weekly UI – Hướng dẫn code giao diện trang sản phẩm đơn giản

Fonts: Mình dùng font chữ Montserrat và Lobster từ Google, các bạn vào Google Fonts chọn 2 fonts chữ này rồi sau đó chèn vào chỗ để code CSS trên Codepen như sau:

Hình chiếc giày: Mình đã tìm Google và tách ảnh ra sẵn cho các bạn luôn. Các bạn có thể nhấn vào đây để tải về nhé.

Trong giao diện này mình sử dụng đơn vị REM để code, các bạn có thể tìm hiểu đơn vị REM tại đây. Ngoài ra mình còn sử dụng pseudo class như :before, :after, về cấu trúc layout mình dùng flexbox, có một điểm chú ý ở đây là ở phần navigation có các chữ nằm theo chiều dọc. Các bạn dùng thuộc tính này writing-mode: vertical-lr; kết hợp với transform: rotate cho các icon . Các bạn có thể tham khảo thêm ở đây.

Như vậy mình đã phân tích kỹ càng cho các bạn xong. Và đây là kết quả code HTML và CSS các bạn có thể tham khảo nhé.

# HTML

# CSS

# Tạm kết

Vậy là xong. Các bạn có thể xem kết quả tại Codepen mình ở đây nhé. Một lưu ý cho các bạn khi đọc tại blog mình, các UIs mình làm cho các bạn xem với mục đích tham khảo là chính, không hoàn toàn chính xác. Các bạn có thể học cách mình phân tích, cách code, lấy tài nguyên, cách đặt tên… để cải thiện thêm về kiến thức, kinh nghiệm của bản thân nhé.

Ngoài ra ở giao diện trên có Slider nhưng mình không code cho nó chạy, chỉ làm HTML và CSS mà thôi, các bạn có thể thử sức bằng cách thêm một thư viện Slider nào đó vào rồi làm thử xem nhen. Chúc các bạn học tập tốt và một ngày tốt lành.

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

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

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

Công việc hằng ngày của một lập trình viên

Công việc hằng ngày của một lập trình viên

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

  10 Kỹ năng quan trọng cần có của Front-end để tìm công việc dễ dàng hơn
  10 hiểu lầm tai hại về lập trình

Chào các bạn,

Nhắc tới lập trình là nhắc tới các dòng code, nhắc tới các dòng code là nhắc tới lập trình viên, nhưng lập trình viên liệu có phải chỉ biết viết code? Trong bài viết này, mình sẽ chia sẻ với các bạn những công việc hằng ngày và điển hình nhất của lập trình viên.

Công việc hằng ngày của một lập trình viên

Lập trình viên có phải chỉ biết viết code

I. DAILY MEETING

Thực chất, daily meeting là một hoạt động của Scrum – một mô hình phát triển phần mềm được nhiều team áp dụng.

Daily meeting được mô tả là một cuộc họp ngắn diễn ra hằng ngày (thường vào buổi sáng), với mục đích báo cáo tổng quan tình hình công việc của team. Tùy vào văn hóa của team, mà cuộc họp này có thể có hình thức và nội dung khác nhau.

Như team mình, cuộc họp này được gọi là “Chào buổi sáng”, các thành viên trong team sẽ lần lượt báo cáo (tổng quát) về tình hình công việc của mình, như hôm qua đã làm gì, làm đến đâu rồi, có gặp khó khăn gì không, công việc hôm nay là gì… hoặc đơn giản đây là cơ hội tuyệt vời để … cà khịa nhau.

II. PHÂN TÍCH NGHIỆP VỤ

Với các công ty lớn, có mô hình làm việc rõ ràng thì phân tích nghiệp vụ sẽ có riêng một bộ phận đảm nhiệm. Nhưng với các công ty cỡ vừa, hoặc các team nhỏ thì lập trình viên đôi khi sẽ phải “đá” sang vai trò của BA (Business Analyst – Phân tích nghiệp vụ).

BA là người đứng giữa khách hàng và team phát triển sản phẩm (là team có các anh dev đẹp trai), có nhiệm vụ phân tích yêu cầu của khách hàng. BA thường phải trả lời các câu hỏi sau:

  • Yêu cầu của khách hàng có khả thi không? Ý là có làm được hay không, vì khách hàng đôi khi đòi những tính năng phi lý, nằm ngoài giới hạn của công nghệ.
  • Có nên làm tính năng đó hay không? Khách hàng đôi khi đưa ra các tính năng mà để triển khai thì rất tốn kém, nhưng giá trị đem lại thì không cao. BA cần phân tích và chỉ ra cho khách hàng.

Một số công việc điển hình khác của BA:

  • Chuyển đổi yêu cầu của khách hàng thành các đầu công việc cụ thể: Yêu cầu của khách hàng thường mơ hồ, chung chung, BA cần phân tích và làm rõ chúng, chuyển thành các đầu công việc cụ thể.
  • Phân tích rủi ro khi thay đổi (bổ sung) tính năng: Khi một tính năng mới được thêm vào hệ thống, BA cần phân tích xem nó ảnh hưởng tới hệ thống như thế nào.
  • Đưa ra các lời khuyên cho khách hàng: Khách hàng đôi khi rất “vô lý” đòi làm những thứ trên trời dưới bể mà chẳng đem lại lợi ích gì, BA cần phân tích, đưa ra các lời khuyên hợp lý cho khách hàng như “anh không nên làm thế, vì … thay vào đó anh nên làm thế này vì … “.
Công việc hằng ngày của một lập trình viên Hình ảnh cả team ngồi phân tích nghiệp vụ cho tính năng mới

III. VIẾT CODE

Lập trình viên biết code là điều đương nhiên, và “code của lập trình viên” là một chủ đề muôn thuở – dù đã tốn rất nhiều nước bọt nhưng vẫn chưa kể hết. Nên mình sẽ chỉ điểm qua một vài điều đáng chú ý phía sau công việc này:

  • Viết code = Ngôn ngữ lập trình + Tư duy lập trình: Ngôn ngữ lập trình học thì dễ, nhưng tư duy lập trình thì phải chịu khó rèn luyện. Nghĩa là để viết code, thì bạn nên tập trung vào tư duy lập trình nhiều hơn là việc học một ngôn ngữ lập trình.
  • Code chỉ là công cụ: Một phần mềm tốt thì bao gồm cả yếu tố “code tốt”, nhưng “code tốt” không có nghĩa là phần mềm tốt. Tức là để tạo ra một phần mềm tốt bạn cần tập trung nhiều kỹ năng hơn và việc “code sao cho tốt”.
  • Viết code là quá trình chuyển đổi ý tưởng con người thành công việc cho máy tính: Nghĩa là bạn phải có ý tưởng trước khi thực sự viết code.

IV. REVIEW CODE

Review code là công việc xem, đánh giá một đoạn code đó có tốt hay không? Tốt hay không tốt ở điểm nào? Cần chỉnh sửa ra sao? … Để đảm bảo việc review có hiệu quả, thì công việc này thường được thực hiển bởi leader hay những người có kinh nghiệm code, hoặc cũng có thể là các developer review chéo code của nhau, chứ ít khi “mình tự review code của mình”.

So với việc viết code, thì review khó và áp lực hơn, bởi:

  • Những dòng code đó không phải do bạn viết ra, bạn cần phải hiểu tại sao sao “nó lại được code như vậy”. Nói thật chứ code mình viết ra nay mai đọc lại còn chẳng hiểu, chứ nói gì đến đọc code của người khác.
  • Code sau khi được bạn review, mà vẫn có lỗi, thì lỗi đó là lỗi của bạn, bởi bạn đã không tìm ra lỗi đó trong lúc review.
  • Bạn phải suy nghĩ ở mức “high level” hơn so với người viết ra đoạn code đó thì mới có thể tìm ra các trường hợp mà đoạn code đó không xử lý được (hoặc xử lý kém).

V. TEST

Cũng giống như việc phân tích nghiệp vụ, các team nhỏ chưa chắc đã có vị trí tester (người kiểm thử và đảm bảo phần mềm chạy đúng), nên nhiều khi lập trình viên phải kiêm luôn vai trò của một tester.

Về cơ bản, vai trò của tester là nghĩ ra thật nhiều trường hợp và đảm bảo phần mềm phải chạy tốt trên tất cả các trường hợp đó.

Mặc dù các developer được khuyên là nên test chéo tính năng của nhau để kết quả test khách quan hơn, nhưng kết quả test từ một developer vẫn không thật sự “đáng tin cậy”. Vì họ thường tin tưởng đồng nghiệp, họ nghĩ rằng trường hợp này quá cơ bản nên chắc chắn đồng nghiệp của họ đã xử lý rồi, nhưng kết quả thì có thể không như vậy. Dẫu không hiệu quả, nhưng méo mó có hơn không, nhiều team vẫn không hề có vị trí tester rõ ràng.

VI. HỌP

Bạn có thể nghĩ “họp” là công việc của “cán bộ”, nhưng thực tế, các lập trình viên cũng phải tham gia rất nhiều các cuộc họp khác nhau:

  • Khi có dự án mới => họp.
  • Khi hoàn thiện một dự án => họp.
  • Khi có business không rõ ràng, cần thảo luận lại => họp.
  • Khi thảo luận với đối tác => họp.
  • Khi cần training công nghệ mới => họp.
  • Khi team có member mới là nữ => họp.

Tuần suất diễn ra các cuộc họp với mỗi team, mỗi công ty, mỗi thời điểm có thể khác nhau, nhưng chung quy lại họp là một trong những công việc diễn ra khá thường xuyên khi bạn là một lập trình viên. Không những vậy, vai trò của các anh dev trong mỗi cuộc họp cũng rất đa dạng, họ có thể là người làm chủ cuộc họp, hoặc là người nêu ý kiến, đôi khi là thư ký …

VII. TỔNG KẾT

Kể ra mới thấy công việc của lập trình viên đâu phải chỉ là code đúng không? Mà chưa kể khi có kinh nghiệm thì họ sẽ có xu hướng “code ít” hơn, và chuyển sang làm các công việc như thiết kế hệ thống, quản lý dự án, quan hệ khách hàng,… Nói chung code chỉ level cơ bản nhất của lập trình viên, và chẳng có lập trình viên nào code cả đời cả.

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

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

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

Tips viết CV trái ngành chinh phục nhà tuyển dụng

CV

“Nghề chọn bạn, bạn không chọn nghề” – Câu nói phản ánh những trải nghiệm thực tế về câu chuyện trái ngành. Ứng tuyển trái ngành dần trở nên phổ biến hơn trên thị tường tuyển dụng. Chính việc này mà nhiều ứng viên trở trở nên thiếu tự tin. Do họ chưa biết cách viết một CV chỉn chu nhất. Đừng vội lo lắng! Trong bài viết sau đây, TopDev sẽ bật mí với bạn những tip giúp CV của mình trở nên nổi bật khi ứng tuyển trái ngành.

Biến “kỹ năng” thành sức mạnh 

Có thể trong một “sân chơi nghề nghiệp” mới, bạn gặp những thiếu sót về kinh nghiệm. Thế nhưng, những kỹ năng mà bạn có lại chính là thứ vũ khí bí mật của bạn. Hãy biến các kỹ năng mà bạn sở hữu, hoàn thiện và phát triển nó để tạo nên sức mạnh.

Tăng hiệu quả ứng tuyển bằng cách tạo CV Online hiệu quả trên TopDev

Chẳng hạn, bạn là một sinh khối ngành Xã hội. Công việc bạn sắp apply lại là HR – nghề Nhân sự. Tất nhiên, bạn lo ngại vì lợi thế sẽ dành cho các bạn có chuyên môn tương ứng với lĩnh vực tuyển dụng. Tuy vậy, bạn hãy tự tin vì những điều sau đây:

– Sinh viên các khối ngành Xã hội là nguồn lực quan trọng và tiềm năng mà mọi tổ chức/doanh nghiệp đang muốn khai thác, đồng hành.

– Là một sinh viên khối ngành Xã hội hay Tự nhiên, năng lực tư duy của bạn về các vấn đề rất phát triển.

– Hãy kể ra các kỹ năng bạn rèn luyện thông qua các CLB như: kỹ năng teamwork, giao tiếp, networking, kỹ năng lãnh đạo (leadership), tư duy độc lập, phân tích – phản biện,… 

  Cách thiết lập và duy trì mối quan hệ (networking) hiệu quả
  Kỹ năng giao tiếp? Làm thế nào để cải thiện giao tiếp hiệu quả?

CV

Cơ hội đôi lúc sẽ đến với bạn. Nhưng để thành công, bạn phải tự tạo ra cơ hội cho chính mình. Hãy tập trung làm nổi bật các kỹ năng có liên quan đến vị trí bạn ứng tuyển. Thêm chúng vào CV để gây ấn tượng với nhà tuyển dụng. Một lưu ý nhỏ, không nên quá ôm đồm và cũng đừng bày những gì sai sự thật.

Đừng bỏ quên “Hoạt động ngoại khóa” khi viết CV

Có nhiều ứng viên chưa từng trải nghiệm các công việc cùng vị trí, dẫn đến việc họ buông xuôi. Hoặc thâm chí là tự ti về bản thân mình. Tuy nhiên, bạn cần nhớ rằng những hoạt động ngoại khóa cũng là một phần quan trọng trong việc đánh giá năng lực ứng viên.

CV

Hãy dành cho CV của mình một không gian để mô tã về các hoạt động ngoại khóa của bạn. Một điều bạn cần lưu tâm chính là mọi thứ cần phải có sự chọn lọc. Một ứng viên thông minh sẽ biết mình cần phải làm gì.

Ví dụ: Bạn muốn apply vào vị trí Program Associate nhưng lại chưa có nhiều kinh nghiệm. Tuy nhiên, những trải nghiệm cá nhân của bạn có thể là sự lựa chọn phù hợp cho tình huống này. Bạn là thành viên của ban nào: Ban Chương trình, Ban Tổ chức sự kiện, Ban Đối ngoại,… Dù bạn có thể không thuộc nhóm những ứng viên ưu tiên dựa trên cơ sở củng ngành nghề, nhưng bạn sẽ là nhân tố thú vị. Những mô tả và phân tích ngắn gọn trong CV phần nào đã thể hiện được bạn là ai. Đồng thời, đó là cách bạn bộc lộ dấu ấn về tiềm năng của bạn đối với nhà tuyển dụng

3 bước hoàn hảo cho cuộc cải tiến CV trái ngành

Nếu bạn được chia cho một quân cờ xấu, hãy là một người chơi giỏi!

  Top 5 website giúp thiết kế CV chuẩn format, đủ nội dung

Vậy làm thế nào để trở thành một người chơi giỏi? Bạn hoàn toàn có thể biến những kinh nghiệm không liên quan thành liên quan. Đây được xem là phương pháp hữu ích có thể giúp ghi dấu ấn với các nhà tuyển dụng.

Để thực hiện hiệu quả, bạn hãy theo dõi quá trình gồm 3 bước sau đây:

1. Đọc kỹ bản mô tả công việc (Job Description) 

Hãy quan tâm 2 phần sau: Công việc bạn cần làm và các kỹ năng mà nhà tuyển dụng yêu cầu. Bạn cần nắm kỹ 2 phần này vì trước khi quyết định ứng tuyển. Bắt đầu triển khai những gì mình có tương ứng với các tiêu chí mà nhà tuyển dụng đòi hỏi. Sự phân tích và khả năng chọn lọc rất quan trong ở bước này.

2. Đánh giá lại các công việc một cách có khoa học

Đây là bước cụ thể hóa thông tin và đưa ra sự phân tích của bạn. Thay vì chỉ liệt kê ra những gạch đầu dòng, bạn cần thể hiện sự chi tiết hơn.

Hãy tập trung vào các công việc hằng ngày. Bạn làm gì, làm yêu thích cái gì, bạn làm nó hiệu quả ra sao? Mỗi câu hỏi dù là cách bạn nhận ra những thứ có liên quan mật thiết đến công việc bạn đang ứng tuyển.

CV

Ví dụ, bạn đừng chỉ đơn giản kể ra việc bản thân quản lý các kênh social như Facebook, Instagram, Linkedin,… Cái bạn cần thể hiện là bạn đã lập kế hoạch như thế nào? Như việc bạn seeding vào các group trên nhiều nền tảng, dẫn link về Website công ty,…Đừng ngần ngại mà thể hiện ra những gì bạn từng thực hiện.

3.Viết CV dựa trên mối liên hệ giữa Job Descripstion và Experience.

Lấy một ví dụ cụ thể. Bạn ứng tuyển cho ban Social – Marketing cho vị trí Copywriter.

Tăng hiệu quả ứng tuyển bằng cách tạo CV Online hiệu quả trên TopDev

CV

Một trong những task của bạn là tạo và quản lý nội dung cho về một chuyên mục nào đó trên webiste công ty. Kinh nghiệm viết và quản lý có thể bạn còn thiếu sót. Tuy vậy, bạn là ứng viên biết cách phán đoán và đề ra các kế hoạch phát triển nội dung. Điều này lại là một tiêu chí rất quan trọng mà một Copywriter cần có nếu muốn tiến xa hơn trên con đường nghề nghiệp. Hãy mạnh dạn trình bày nó vào chiếc CV của mình để không bỏ lỡ bất cứ cơ hội nào.

Lời kết

Tuyển dụng trái ngành suy cho cùng vẫn là tuyển dụng. Điều quan trọng là bạn ứng biến nó như thế nào để hoàn thiện nội dung chiếc CV một cách tốt nhất. TopDev mong rằng qua bài viết này, bạn sẽ tự tin hơn về những gỉ mình đang sở hữu. Đồng thời, bạn nhận biết được đâu là những thứ phù hợp nhất cần thể hiện trên CV trên hành trình chinh phục các công việc trái chuyên môn của mình. Chúc các bạn thành công! 

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

Xem thêm Top tìm việc ngành it trên TopDev

Hướng dẫn sử dụng Intent trong Android

intent-trong-android

Intent trong Android là những object tin nhắn không đồng bộ mà bạn có thể sử dụng để yêu cầu hành động từ các thành phần Android khác. Bên cạnh đó nó cho phép bạn tương tác với các thành phần từ các ứng dụng tương tự cũng như với các thành phần do các ứng dụng khác đóng góp. Ví dụ: một Activity có thể bắt đầu một Activity bên ngoài để chụp ảnh

intent-trong-android

Intent trong Android là object của class android.content.Intent. Code của bạn có thể gửi Intent đến hệ thống Android với chỉ định thành phần mục tiêu gửi đến. Ví dụ, thông qua startActivity() bạn có thể xác định một Intent sử dụng để gọi chạy một Activity khác. Tại Activity mục tiêu, với  startActivity() bạn có thể xác định được Intent của người gửi đến để khởi động Activity này.

Một Intent trong Android có thể chứa dữ liệu thông qua Bundle. Dữ liệu này có thể được sử dụng bởi các receiving component (thành phần tiếp nhận).

Trong Android, việc tái sử dụng các application component khác được coi là một task. Một ứng dụng có thể truy cập các component Android khác để đạt được một task. Ví dụ: từ một component của ứng dụng, bạn có thể kích hoạt một component khác trong hệ thống Android, component đó sẽ quản lý ảnh, ngay cả khi nó không phải là một phần của ứng dụng đó. Trong component đó, bạn chọn một ảnh và quay lại ứng dụng của bạn để sử dụng ảnh đã chọn.

Một dòng sự kiện đó sẽ được mô tả như sau:

intent-trong-android
Intent được sử dụng để:
  1. Bắt đầu một Activity: startActivity(intent)
  2. Bắt đầu một Activity con
  3. Bắt đầu một dịch vụ (Service): startService(Intent)

Cách bắt đầu một Activity hoặc Service

Để bắt đầu một Activity chúng ta sẽ sử dụng method startActivity(intent). Method này được định nghĩa trên đối tượng ContextActivity mở rộng.

intent-trong-android

Đoạn mã sau minh họa cách bạn có thể bắt đầu một Activity khác thông qua một Intent:

# Start the activity connect to the
# specifiedclass

Intent i = new Intent(this, ActivityTwo.class); startActivity(i);

Các Activity được khởi động bằng các Activity Android khác gọi là sub-Activity.

Còn để khởi động một Service thông qua Intent trong Android ta dùng method startService(Intent)

Tham khảo thêm: Tuyển dụng lập trình Android lương cao tại Topdev

Các loại Intent

Intent trong Android hiện có 2 loại là Intent tường minh (explicit) và Intent không tường minh (implicit).

Một ứng dụng có thể xác định thành phần mục tiêu một cách trực tiếp vào Intent (explicit) mục tiêu được yêu cầu là rõ ràng hoặc yêu cầu hệ thống Android đánh giá các thành phần đã đăng ký trên dữ liệu đích để chọn ra một cái để gửi yêu cầu đến (Intent implicit).

  • Intent tường minh (explicit)

Intent tường minh (Explicit intents): Là những intent chỉ định rõ ràng tên của các thành phần mục tiêu để xử lý; trong đó, trường mục tiêu (tùy chọn) được sét một giá trị cụ thể thông qua các phương thức setComponent() hoặc setClass().

intent-trong-android

Ví dụ khởi tạo Intent:

Intent intent = new Intent(this,GreetingActivity.class);

intent.putExtra("firstName",firstName);
intent.putExtra("lastName", lastName);

this.startActivity(intent);

this.startActivityForResult(intent, MY_REQUEST_CODE);

Hoặc sử dụng Bundle:

// Cách 1.
Intent mIntent = new Intent(this, GreetingActivity.class);
Bundle extras = mIntent.getExtras();
extras.putString("firstName", "<firstName>");
extras.putString("látName", "<lastName>");

// Cách 2.
Intent mIntent2 = new Intent(this, GreetingActivity.class);
Bundle mBundle = new Bundle();
mBundle.putString("firstName", "<firstName>");
mBundle.putString("látName", "<lastName>");
mIntent2.putExtras(mBundle);

// Cách 3:
Intent mIntent3 = new Intent(this, GreetingActivity.class);
mIntent3.putExtra("firstName", "<firstName>");
mIntent3.putExtra("látName", "<lastName>");

Tại Activity:

Intent intent = this.getIntent();

String firstName= intent.getStringExtra("firstName");
String lastName = intent.getStringExtra("lastName");

// Hoặc
Bundle extras = this.getIntent().getExtras();

String firstName1 = extras.getString("firstName");
String lastName2  = extras.getString("lastName");
  • Intent không tường minh (Implicit)

Intent không tường minh (Implicit Intents): Là những intent không chỉ định rõ một mục tiêu thành phần, nhưng bao gồm đầy đủ thông tin cho hệ thống để xác định các thành phần có sẵn là tốt nhất để chạy cho mục đích đó. Hãy xem xét một ứng dụng liệt kê các nhà hàng có sẵn ở gần bạn. Khi bạn bấm vào một tùy chọn nhà hàng cụ thể, ứng dụng sẽ hỏi một ứng dụng khác để hiển thị các tuyến đường đến nhà hàng đó. Để đạt được điều này, nó có thể gửi một ý định rõ ràng trực tiếp đến các ứng dụng Google Maps, hoặc gửi intent implicit, ý định sẽ được chuyển giao cho bất kỳ ứng dụng nào cung cấp các tính năng bản đồ (map)  (chẳng hạn, Yahoo Maps).

intent-trong-android

Ví dụ:

Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.tutlane.com"));
startActivity(intent);

Truyền dữ liệu cho intent explicit và implicit intent

Android hỗ trợ cho intent explicit và intent implicit. Một ứng dụng có thể xác định thành phần đích (target component) trực tiếp trong intent (intent explicit) hoặc yêu cầu hệ thống Android đánh giá các component đã đăng ký dựa trên dữ liệu intent (intent implicit).

Intent explicit sẽ xác định chính xác thành phần sẽ được gọi bởi hệ thống Android, bằng cách sử dụng lớp Java để định danh. Intent explicit thường được sử dụng để kiểm soát ứng dụng. Sau đây là cách tạo một intent explicit và gửi nó đến hệ thống Android để bắt đầu một Activity.

Intent i = new Intent(this, ActivityTwo.class);
i.putExtra("Value1", "This value one for ActivityTwo ");
i.putExtra("Value2", "This value two ActivityTwo");

Intent implicit chỉ định hành động cần được thực hiện và dữ liệu tùy chọn, cung cấp nội dung cho hành động. Nếu một intent implicit được gửi đến hệ thống Android, nó sẽ tìm kiếm tất cả các component được đăng ký cho hành động cụ thể và kiểu dữ liệu phù hợp. Nếu chỉ tìm thấy một component, Android sẽ khởi động trực tiếp component này. Nếu một số component được hệ thống Android xác định, người dùng sẽ nhận được hộp thoại lựa chọn và có thể quyết định component nào sẽ được sử dụng cho mục đích.

Ví dụ:

Intent i = new Intent(Intent.ACTION_VIEW,
Uri.parse("https://www.vogella.com/"));
startActivity(i);

Xác định bộ nhận intent hợp lệ

Đôi khi bạn muốn xác định xem một component đã đăng ký một intent hay chưa. Ví dụ: bạn muốn kiểm tra xem có sẵn một bộ nhận intent nhất định hay không và trong trường hợp có sẵn một component, bạn bật một chức năng trong ứng dụng của mình.

Việc kiểm tra này có thể được thực hiện thông qua lớp PackageManager.

Đoạn code sau sẽ kiểm tra xem một component có đăng ký một intent nhất định hay không. Xây dựng intent của bạn như bạn mong muốn để kích hoạt nó và chuyển nó đến method sau.

public static boolean isIntentAvailable(Context ctx, Intent intent) {
    final PackageManager mgr = ctx.getPackageManager();
    List<ResolveInfo> list =
        mgr.queryIntentActivities(intent,
            PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

Dựa trên kết quả, bạn có thể điều chỉnh ứng dụng của mình. Ví dụ: bạn có thể tắt hoặc ẩn các mục menu nhất định.

Các kiểu dữ liệu trong Intent

Qua những kiến thức ở trên bạn đã biết rằng, Intent trong Android có khả năng chuyển dữ liệu qua các Activity. Vậy cách thức hoạt động của quá trình đó như thế nào?

Dữ liệu được truyền vào Intent và lấy ra theo các cặp dữ liệu dạng key/value. Key ở đây là một chuỗi, giúp định danh cho kiểu dữ liệu value. Nếu bạn truyền vào trong Intent cặp dữ liệu key/value nào, thì bạn phải lấy ra bởi đúng cặp key/value đó, chắc chắn khai báo đúng key và lấy ra đúng kiểu của value khi được truyền vào.

Tuy vậy, bạn có thể sử dụng một trong hai hình thức sau. Sử dụng Extra hoặc là Bundle. Thật sự thì khác nhau giữa hai hình thức cũng không quan trọng lắm, chỉ là bạn nên biết cả hai cách và mình sẽ đưa ra chút lời khuyên phân tích trường hợp nào nên sử dụng cách nào ở bên dưới.

Trường hợp dùng Extra

Theo mình truyền nhận dữ liệu bằng Extra là cách đơn giản nhất.

Gửi Dữ Liệu

Bước đầu tiên, để truyền dữ liệu bằng Extra. Sau khi khai báo Intent và trước khi bạn dùng nó để kích hoạt một activity nào đó, bạn có thể sử dụng các phương thức được nạp chồng của nó để gửi dữ liệu. Các phương thức đó có chung một tên là putExtra().

intent-trong-android

Có một điều bạn cần lưu ý là các phương thức putExtra() này không có chữ s ở đằng sau Extra nhé. Extra mà có s thì sẽ dành cho Bundle ở bên dưới.

Với mỗi putExtra() như vậy, tham số đầu tiên sẽ chính là key mà mình nói trên kia. Tham số thứ hai chính là value. Phương thức này được nạp chồng làm nhiều bản để bạn dễ dàng sử dụng từng loại value mà bạn muốn. Tuy nhiên có 2 kiểu value bạn đừng để ý đến là Parcelable và Serializable, hai kiểu này hơi phức tạp một chút, có lẽ lần sau mình sẽ có một bài viết riêng về hai kiểu này khi thích hợp.

Đoạn code sau ví dụ cách để truyền dữ liệu vào Intent bằng Extra.

Intent intent = new Intent(this, ContactActivity.class);
intent.putExtra("Key_1", "Truyền một String");
intent.putExtra("Key_2", 5);
intent.putExtra("Key_3", true);
startActivity(intent);

Nhận Dữ Liệu

Đến bước này, theo như ví dụ trên thì ContactActivity sẽ được kích hoạt với dữ liệu là ba cặp key/value được truyền vào. Ở phương thức onCreate() hoặc bất cứ chỗ nào của ContactActivity, bạn đều có thể lấy bất cứ cặp key/value nào ra dùng. Bằng cách gọi đến getxxxExtra().

intent-trong-android
Các phương thức giúp lấy dữ liệu khỏi Extra

xxx ở đây thì bạn thay thế bằng kiểu dữ liệu phù hợp với key bên “đóng gói”, ví dụ như getBooleanExtra()getStringExtra()getIntExtra(),… Dĩ nhiên tham số name được truyền vào phương thức này phải đúng là key bên “đóng gói” luôn.

Có một số phương thức cần phải có tham số thứ hai, tham số đó chính là dữ liệu mặc định nếu như hệ thống không tìm thấy dữ liệu với key mà bạn đã cung cấp. Việc cung cấp tham số thứ hai này để tránh một số lỗi có thể xảy ra đối với chương trình của chúng ta.

Đoạn code sau sẽ mô phỏng cách lấy dữ liệu ra khỏi Intent bằng Extra ở onCreate() của Activity. Bạn có thể thấy từng cặp key/value khớp với khi bạn đặt dữ liệu vào trên kia.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contact);

    Intent intent = getIntent();
    String value1 = intent.getStringExtra("Key_1");
    int value2 = intent.getIntExtra("Key_2", 0);
    boolean value3 = intent.getBooleanExtra("Key_3", false);
}

Trường hợp dùng Bundle

Như mình nói từ đầu, Bundle và Extra không khác gì nhau hết. Nếu như Extra trên kia sẽ “xé lẻ” dữ liệu ra và gửi theo từng dòng. Thì Bundle sẽ giúp bạn “đóng gói” dữ liệu lại và gửi nguyên kiện. Tất nhiên Bundle sẽ tiện hơn trong trường hợp bạn muốn gửi cùng một bộ dữ liệu đến nhiều Activity khác nhau.

Ngoài nhiệm vụ “đóng gói” dữ liệu để truyền qua lại giữa các Activity, thì Bundle còn được dùng trong một số trường hợp khác, ví dụ như truyền dữ liệu qua Fragment mà bạn sẽ được biết ở một bài nào đó trong tương lai 😂. Nên tốt hơn hết là bạn hãy học cách sử dụng Bundle ngay từ bài này nhé.

Gửi Dữ Liệu

Chỉ có phát sinh vài dòng code so với Extra trên kia thôi, đầu tiên là dòng tạo ra Bundle. Sau đó vẫn là các dòng đặt dữ liệu vào Bundle, các dòng này có hơi khác với các dòng đặt dữ liệu vào Extra một chút, nếu với Extra bạn dùng các phương thức nạp chồng với cùng một tên putExtra() thì với Bundle bạn phải dùng đúng phương thức putxxx() với xxx là kiểu dữ liệu bạn cần dùng.

intent-trong-android

Khi Bundle đã chứa đủ dữ liệu, bạn cần phải đặt Bundle này vào trong Intent bằng một dòng code putExtras() (và nhớ là có s nha).

Bạn xem code như sau:

Intent intent = new Intent(this, ContactActivity.class);
Bundle bundle = new Bundle();
bundle.putString("Key_1", "Truyền một String");
bundle.putInt("Key_2", 5);
bundle.putBoolean("Key_3", true);
intent.putExtras(bundle);
startActivity(intent);

Nhận Dữ Liệu

Cũng tương tự như bước gửi thôi, nếu đã gửi theo kiểu Bundle, thì bên nhận cũng sẽ nên nhận theo Bundle trước rồi mới lấy từng dữ liệu ra dùng. Để lấy Bundle ra khỏi Intent thì chúng ta có phương thức getExtras().

Sau khi lấy Bundle ra khỏi Intent, việc tiếp theo sẽ gọi đến các phương thức getxxx() của nó. Các phương thức này của Bundle cũng giống như các phương thức getxxxExtra() của Extra ở trên. Chỉ khác một chỗ getxxx() của Bundle thường có hai phương thức nạp chồng, giúp bạn linh hoạt hơn. Thường thì bạn nên dùng getxxx() với hai tham số, như vậy bạn có thể định nghĩa được giá trị mặc định cho từng phương thức khi mà nó không tìm được dữ liệu từ key mà bạn cung cấp, giúp tránh một số lỗi không cần thiết.

intent-trong-android
Các phương thức giúp lấy dữ liệu khỏi Bundle

Để chắc chắn thì khi nhận dữ liệu với Bundle, bạn nên kiểm tra xem Bundle đó có tồn tại hay không (kiểm tra khác null) trước nhé.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contact);  
  
    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    if (bundle != null) {
        String value1 = bundle.getString("Key_1", "");
        int value2 = bundle.getInt("Key_2", 0);
        boolean value3 = bundle.getBoolean("Key_3", false);
    }
}

Bạn vừa xem qua cách thức chuyển dữ liệu qua lại giữa các Activity. Giờ là lúc chúng ta thực hành xây dựng một chút cho TourNote rồi.

Thực Hành Gửi Dữ Liệu Từ MainActivity Qua ContactActivity

Thực ra ContactActivity mà mình muốn hướng đến sẽ chứa hai loại nội dung. Một là thông tin về ứng dụng, hai là thông tin giúp đỡ. Việc phân biệt nội dung nào được hiển thị sẽ dựa vào lựa chọn của người dùng trên menu item của MainActivity. Chính vì vậy chúng ta sẽ xây dựng ContactActivity sao cho có thể nhận được dữ liệu từ MainActivity chuyển qua, dữ liệu này chỉ đơn giản báo cho ContactActivity biết người dùng vừa nhấn chọn About App hay Help.

Bạn đã hiểu yêu cầu của bài thực hành hôm nay rồi đúng không nào. Nên nhớ là chúng ta chỉ nói đến cách thức gửi nhận dữ liệu để ContactActivity hiểu được chuyện gì đang xảy ra thôi nhé, do đó bài này chúng ta chỉ sử dụng Toast để kiểm chứng dữ liệu nhận. Còn việc hiển thị cái gì khi đã nhận dữ liệu thì ở bài sau chúng ta sẽ xây dựng tiếp.

Xây Dựng Các Giá Trị Hằng Số

Bạn đã biết việc sử dụng Extra hay Bundle là việc lưu trữ các dữ liệu dạng key/value rồi chuyển đi và nhận chúng ở nơi khác đúng không nào. Vậy để đảm bảo các key luôn luôn được dùng đúng, chúng ta nên định nghĩa nó là một giá trị tĩnh (static) và hằng (final). Giá trị này nên định nghĩa bên lớp nhận dữ liệu thì tốt hơn về mặt quản lý code (theo ý mình thôi nhé, bạn có thể định nghĩa một lớp chuyên chứa các giá trị key này). Do đó mình thêm các thuộc tính được tô sáng sau vào ContactActivity.

public class ContactActivity extends AppCompatActivity {
 
    public static final String KEY_SHOW_WHAT = "show_what";
    public static final String VALUE_SHOW_ABOUT = "show_about";
    public static final String VALUE_SHOW_HELP = "show_help";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact);
 
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
}

Gửi Dữ Liệu Từ MainActivity

Dĩ nhiên bên MainActivity, chúng ta chỉnh sửa một tí nơi kích hoạt ContactActivity, sao cho Intent có thể chứa Bundle mà chúng ta muốn như sau.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
 
    switch (item.getItemId()) {
        case R.id.search:
            Toast.makeText(this, "Search button selected", Toast.LENGTH_SHORT).show();
            return true;
        case R.id.about:
            Intent intent = new Intent(this, ContactActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString(ContactActivity.KEY_SHOW_WHAT, ContactActivity.VALUE_SHOW_ABOUT);
            intent.putExtras(bundle);
            startActivity(intent);
            return true;
        case R.id.help:
            intent = new Intent(this, ContactActivity.class);
            bundle = new Bundle();
            bundle.putString(ContactActivity.KEY_SHOW_WHAT, ContactActivity.VALUE_SHOW_HELP);
            intent.putExtras(bundle);
            startActivity(intent);
            return true;
    }
 
    return super.onOptionsItemSelected(item);
}

Nhận Dữ Liệu Ở ContactActivity

Như mình có nói, ContactActivity chỉ nhận dữ liệu rồi dùng Toast để show ra làm bằng chứng là nó đã nhận đúng dữ liệu. Còn việc hiển thị cái gì thì bài học sau chúng ta sẽ nói tiếp nhé. Như vậy code của ContactActivity như sau.

public class ContactActivity extends AppCompatActivity {
 
    public static final String KEY_SHOW_WHAT = "show_what";
    public static final String VALUE_SHOW_ABOUT = "show_about";
    public static final String VALUE_SHOW_HELP = "show_help";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact);
 
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
 
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            String valueShow = bundle.getString(KEY_SHOW_WHAT, "");
            Toast.makeText(this, "Show value: " + valueShow, Toast.LENGTH_SHORT).show();
        }
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
}

Kết quả là, tùy vào cách người dùng chọn vào menu item mà ContactActivity sẽ hiển thị Toast như sau.

intent-trong-android
Hình ảnh TourNote sau khi thực hành

Kết bài

Như vậy mình đã chia sẻ những kiến thức rất căn bản để có thể hiểu bản chất Intent trong Android cũng như cách chúng truyền dữ liệu cho nhau. Các bạn hãy nhớ rằng Intent là một phần cực kỳ quan trọng. Và nếu như chưa hiểu phần nào thì các bạn hãy comment bên dưới để mình và mọi người cùng hỗ trợ nhé. Chúc anh em sẽ thành công hơn

Có thể bạn muốn xem thêm:

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

Khi nào nút “Cancel” không nên đặt là “Cancel”

Khi nào nút

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

Trong design, nút cancel ngoài cái tên gọi là cancel ra, nó còn 1 vài cái tên gọi khác nữa.「Not Now – Không làm bây giờ」 hay「Maybe Later – Làm lúc khác」 là 1 trong những ví dụ đó.

Nhưng đôi khi có 1 số trường hợp mà nút Cancel không thể đặt là Cancel hay những tên gọi tương tự khác. Vì có thể làm người dùng khó hiểu, hay nói cách khác sẽ khó thể thực hiện được hành động CTA (Call to Action).

  Cách đặt nút "Cancel" trong thiết kế UX tối ưu nhất
  "Muốn đi nhanh phải dựa vào dev, muốn đi nhanh hơn nữa phải dựa vào khách hàng"

Call to Action (CTA): là thuật ngữ viết tắt của call to action trong quảng cáo Google. Chúng được thể hiện thông qua văn bản hoặc hình ảnh nhằm mục đích kêu gọi người xem phải hành động bằng những cú click chuột. Như vậy, hiểu một cách đơn giản, CTA có nhiệm vụ tạo ra tỉ lệ chuyển đổi từ người dùng thành khách hàng tiềm năng.

Vậy chúng ta hãy cùng đi xem những trường hợp nào không nên đặt tên nút là ”Cancel” nhé.

Phòng chống ấn cancel “nhầm”

Ví dụ như có 1 màn hình ”cancel subscription” như bên dưới.

Khi nào nút "Cancel" không nên đặt là "Cancel"

Sự nhầm lẫn của nút cancelNếu như chúng ta đặt 1 cái nút Cancel ở ngay bên trên nút Cancel Subscription thì theo các bạn điều gì sẽ xảy ra?

Như ở cái màn hình bên trái. Có thể dịch đơn giản như sau: Bạn có muốn huỷ subscription không?

  • Nút bên trên là “Huỷ”
  • Nút bên dưới là “Huỷ subscription”

Nếu để 2 nút như này đúng quả thật gây khó hiểu thật. Cả 2 nút đều là “Huỷ”. wtf @@

Vậy nếu đặt 2 nút như này thì có thể gây ra vấn đề gì?

Đó chính là người dùng có thể ấn nhầm vào nút Cancel Subscription ở bên dưới.

Với những ai đang muốn huỷ Subscription thì không sao, nhưng ai không muốn huỷ mà ấn nhầm vào nút **Cancel Subscription **thì quả thực gây thiệt hại cho công ty đúng không nào.

Nếu chúng ta thay nút Cancel bằng nút Not Now hay là Maybe Later thì cũng vẫn gây hiểu nhầm. Bởi vì những nút này có ngụ ý là sẽ không huỷ subscription lúc này mà sẽ huỷ vào lúc khác.

Để giải quyết vấn đề đó thì chúng ta nên thay cái nút Cancel bằng nút Keep Plan – Vẫn giữ nguyên subscription sẽ thân thiện và an toàn với người dùng hơn rất nhiều.

Tên nút không được gây xung đột nhau

Khi nghĩ về 1 tên mà đối lập với ”Cancel” có thể ai trong chúng ta cũng đều nghĩ là ”Do not Cancel”. Nhưng cái tên này không phải là lựa chọn tốt bởi vì nó đang cùng sử dụng từ giống nhau đó là ”Cancel“.

Đây cũng là lí do mà ”Keep Subscription” sẽ không phải sự lựa chọn tốt, mà chúng ta nên đặt là ”Keep Plan“.

Khi mà chúng ta cùng sử dụng 1 từ giống nhau cho 2 button thì có thể làm người dùng nhầm lẫn nút này với nút kia, hay nói cách khác để không bị nhầm lẫn người dùng sẽ bỏ ra khoảng thời gian nào đó để đọc thật kĩ 2 nút đó.

Với UX thì điều đó là không tốt 1 chút nào.

Khi nào nút "Cancel" không nên đặt là "Cancel"

Hơn nữa, ”Do Not Cancel” không phải là từ trái lập với ”Cancel” bởi vì cả 2 từ này đều mang ý nghĩa là phủ định.

Nếu cả 2 nút đều mang nghĩa là phủ định thì khi đó người dùng sẽ xem 2 từ này như là ”Huỷ”, và đây cũng chính là nguyên nhân gây nhầm lẫn.

Từ ”Cancel – Huỷ” nó mang nghĩa phủ định. Nếu mà 1 lúc nhìn vào 2 từ ”Do Not Cancel” và ”Cancel Subscription” thì người dùng có cảm giác khi ấn vào 1 trong 2 nút này thì có thể làm mất đi “1 thứ nào đó”.

Để đặt tên nút an toàn hơn trong trường hợp này, thì từ ”Keep Plan” có lẽ sẽ là giải pháp tốt nhất.

Cancel Subscription Vs. Unsubscribe

Đôi khi chúng ta nghĩ, sử dụng ”Unsubscribe” có thể thay thế cho từ ”Cancel Subscription”. Nhưng các bạn đã nhầm.

2 từ ”Subscription” với ”Subscribe” là 2 từ không thể thay thế cho nhau được. Bởi vì ngữ cảnh sử dụng nó là hoàn toàn khác nhau.

Khi nào nút "Cancel" không nên đặt là "Cancel"

Chắc xem nhiều Youtube chúng ta cũng đều nghe thấy từ ”Subscribe” đúng không nào?

Ý nghĩa của từ ”Subscribe” là muốn nói đến việc người dùng đăng kí theo dõi kênh đó, và sẽ nhận thông báo khi có bài viết mới.

Còn từ ”Subscription” thì sao? Nó lại có ý nghĩa hoàn toàn khác.

Với những ai đăng kí dùng Netflix hay là **Spotify **để nghe nhạc thì cũng biết. Cả 2 dịch vụ này đều tính tiền theo tháng, và chúng ta phải mua thì mới dùng được. Nó có những plan khác nhau.

Nếu chúng ta đăng kí plan và trả tiền theo tháng, cứ đến đầu tháng sẽ bị rút tiền từ thẻ VISA. Cái hành động đó được gọi là ”Subscription“.

Do đó tuỳ vào ngữ cảnh, nếu chúng ta không phân biệt cách sử dụng của 2 từ này 1 cách rõ ràng thì có thể gây nhầm lẫn cho người dùng.

Khi nào nút "Cancel" không nên đặt là "Cancel"

Như ảnh ở bên trên, nếu chúng ta muốn hỏi người dùng là “Có muốn huỷ subscribe kênh hay không?” thì có lẽ câu trả lời tốt nhất vẫn là ”Stay Subscribed” đúng không nào?

Qua đó ta thấy được, để làm rõ hành động của người dùng thì việc đặt tên nút phù hợp với từng ngữ cảnh là điều khá quan trọng.

Nếu sử dụng tên nút không thích hợp sẽ không chỉ làm người dùng nhầm lẫn, mà còn khiến người dùng ”phải bỏ chút thời gian” để hiểu rõ xem nút này có ý nghĩa là gì.

Và còn rất nhiều ví dụ khác nữa cũng khá thú vị. Đặc biệt là Nitendo họ đã làm rất tốt điều này.

Nếu bạn nào biết tiếng nhật có thể tham khảo bài này về Design Nitendo (mình tìm mãi không thấy có bài viết về tiếng anh): Nintendo SwitchのUIはなぜ使い勝手がいいのか!? 全員で体験し、“あたりまえ”を磨く任天堂のもの作り【CEDEC 2018】

Kết luận

Các bạn thấy UX nó quan trọng thế nào với người dùng chưa ak?

Việc đặt tên nút dường như là 1 việc rất nhỏ trong design, thế nhưng nó lại mang lại 1 hiệu quả vô cùng to lớn.

Nếu tên nút đặt thích hợp, người dùng phán đoán nhanh, sẽ là nhân tố kết nối đến CTA (Call to Action) được cao hơn.

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

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

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

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

Hiểu về hook useRef của React như thế nào cho đúng

Hiểu về hook useRef của React như thế nào cho đúng

Bài viết được sự cho phép của tác giả Lưu Bình An

Câu nói chào hàng của useState vẫn thường được nghe: thêm state vào trong function component.

  Làm animate siêu đơn giản với hook khi react component mount và unmount
  React hook là gì và lợi ích mà React hook đem lại
const [value, setValue] = React.useState("init value");

Giả dụ tình huống là thế này, bạn làm gì đó mà nó ko liên quan đến UI, không cần re-render, nhưng vẫn muốn giá trị này cố định giữa các lần render? useState có thể cố định giá trị, nhưng ngặt nỗi nó sẽ trigger re-render nếu bị thay đổi

function usePersistentValue(initValue) {
  return React.useState({
    current: initialValue,
  })[0];
}

Vì chúng ta không muốn trigger re-render, nên chỉ trả về giá trị của state (phần tử đầu tiên trong mảng), không trả về hàm để cập nhập nó.

Vẫn còn chưa rõ ràng lắm nhỉ, thí dụ trong trong ứng dụng chúng ta muốn có một giá trị counter tăng lên 1 từng giây, một button đế stop việc đó.

function Counter() {
  const [count, setCount] = React.useState(0);

  let id;

  const clear = () => {
    window.clearInterval(id);
  };

  React.useEffect(() => {
    id = window.setInterval(() => {
      setCount((c) => c + 1);
    }, 1000);

    return clear;
  }, []);

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={clear}>Stop</button>
    </div>
  );
}

Code này chạy không? Không, lý do? bạn có để ý biến id giữa các lần chạy (render) là khác nhau, nói cách khác bạn không clear được cái interval đã setup.

Việc làm lập trình React lương cao 2 năm KN

Bạn sẽ phải viết lại sử dụng cách usePersistentValue ở trên

function usePersistentValue(initialValue) {
  return React.useState({
    current: initialValue,
  })[0];
}

function Counter() {
  const [count, setCount] = React.useState(0);
  const id = usePersistentValue(null);

  const clearInterval = () => {
    window.clearInterval(id.current);
  };

  React.useEffect(() => {
    id.current = window.setInterval(() => {
      setCount((c) => c + 1);
    }, 1000);

    return clearInterval;
  }, []);

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={clearInterval}>Stop</button>
    </div>
  );
}

Nói có cảm giác hơi sai trái khi hack như vậy, nhưng nó chạy được.

Tuy nhiên không khuyến khích bạn tự viết như vậy, vì việc cố định giá trị giữa các lần render là nhu cầu khá bình thường nên bạn sẽ được team React làm sẵn cho một API mà xài: useRef

Vẫn là đoạn ứng dụng trên nhưng giờ chúng ta viết lại nó bằng useRef

function Counter() {
  const [count, setCount] = React.useState(0);
  const id = React.useRef(null);

  const clearInterval = () => {
    window.clearInterval(id.current);
  };

  React.useEffect(() => {
    id.current = window.setInterval(() => {
      setCount((c) => c + 1);
    }, 1000);

    return clearInterval;
  }, []);

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={clearInterval}>Stop</button>
    </div>
  );
}

Công dụng của useRef như đã đề cập, cố định dữ liệu giữa các lần re-render, truy xuất giá trị đó qua thuộc tính current

Một ứng dụng rất phổ biến của useRef là truy xuất đến DOM node. Thí dụ để set focus của input

function Form() {
  const nameRef = React.useRef();
  const emailRef = React.useRef();
  const passwordRef = React.useRef();

  const handleSubmit = (e) => {
    e.preventDefault();

    const name = nameRef.current.value;
    const email = emailRef.current.value;
    const password = passwordRef.current.value;

    console.log(name, email, password);
  };

  return (
    <React.Fragment>
      <label>
        Name:
        <input placeholder="name" type="text" ref={nameRef} />
      </label>
      <label>
        Email:
        <input placeholder="email" type="text" ref={emailRef} />
      </label>
      <label>
        Password:
        <input placeholder="password" type="text" ref={passwordRef} />
      </label>

      <hr />

      <button onClick={() => nameRef.current.focus()}>Focus Name Input</button>
      <button onClick={() => emailRef.current.focus()}>
        Focus Email Input
      </button>
      <button onClick={() => passwordRef.current.focus()}>
        Focus Password Input
      </button>

      <hr />

      <button onClick={handleSubmit}>Submit</button>
    </React.Fragment>
  );
}

Bài viết gốc được đăng tải tại Vui Lập Trì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

Vừa học vừa chơi! Top 15+ game lập trình miễn phí

15 game miễn phí giúp bạn luyện code mỗi ngày

Game không thể dạy bạn mọi thứ cần thiết trong lập trình nhưng lại có thể giúp bạn luyện tập một cách hứng khởi hơn.

Học trực tuyến đã có những bước phát triển đáng kinh ngạc trong vài năm qua, đặc biệt là trong mảng lập trình với những nền tảng có tính tương tác cao như Udacity hay Codecademy. Thế nhưng nếu bạn cần thêm chút động lực “cày” code, hãy thử sức với những trò game lập trình thú vị dưới đây.

Tất nhiên, game không thể dạy bạn mọi thứ cần thiết trong lập trình nhưng lại có thể giúp bạn luyện tập một cách hứng khởi hơn.

Dưới đây là danh sách các game miễn phí và hữu ích như vậy:

1. CodeMonkey

15 game miễn phí giúp bạn luyện code mỗi ngày

CodeMonkey dạy code qua CoffeeScript, một ngôn ngữ lập trình chính thức. Chương trình này sẽ dạy người chơi cách tạo ra một game hoàn chỉnh cho chính mình bằng HTML5. CodeMonkey hướng tới trẻ em nhưng cũng rất thú vị với những người lớn muốn thử sức với lập trình.

2. CodinGame

15 game miễn phí giúp bạn luyện code mỗi ngày

GenK từng có bài giới thiệu chi tiết về trò game giúp người chơi luyện tập tới 25 ngôn ngữ này. Cụ thể, CodinGame cho phép bạn “đấu” JavaScript, Ruby, PHP,… với bạn bè và các game thủ khác. Chính tính tương tác cao đã tạo nên sức hút không nhỏ cho trò game này.

3. CSS Diner

15 game miễn phí giúp bạn luyện code mỗi ngày

CSS Diner giúp bạn học CSS một cách đơn giản qua 32 level chơi. Không chỉ nâng dần độ khó, mỗi level còn giúp bạn đào luyện lại những gì đã học ở level trước.

4. Flexbox Froggy

15 game miễn phí giúp bạn luyện code mỗi ngày

Nếu muốn hiểu hơn về CSS flexbox, hãy thử sức ngay với Flexbox Froggy. Trong quá trình “giải cứu” Froggy và những người bạn trong game, bạn sẽ được hướng dẫn chi tiết về cấu trúc sắp xếp trong flexbox.

Ứng tuyển ngay các vị trí tuyển dụng lập trình Game lương cao trên TopDev

5. Flexbox Defense

15 game miễn phí giúp bạn luyện code mỗi ngày

Flexbox Defense là một phiên bản game khác để luyện tập kỹ năng flexbox. Lần này, bạn sẽ di chuyển các tháp súng vào những vị trí chiến lược có thể đánh bại kẻ thù bằng các kỹ thuật tương tự như trong Flexbox Froggy.

6. CodeCombat

15 game miễn phí giúp bạn luyện code mỗi ngày

CodeCombat hướng tới giáo viên và sinh viên nhưng thực tế bất cứ ai cũng có thể chơi. Tựa game này sẽ giúp bạn học Python, JavaScript, CoffeeScript,… Ở level đầu tiên, bạn sẽ di chuyển nhân vật của mình bằng các lệnh cơ bản theo hướng dẫn.

7. Ruby Warrior

15 game miễn phí giúp bạn luyện code mỗi ngày

Nếu muốn luyện tập Ruby, game Ruby Warrior chính là món ăn dành cho bạn. Các level từ dễ đến khó sẽ giúp bạn hoàn thiện và theo dõi tiến độ phát triển kỹ năng Ruby của mình.

8. Untrusted

15 game miễn phí giúp bạn luyện code mỗi ngày

Untrusted là một cuộc hành trình JavaScript đồ sộ giúp bạn kiểm tra kỹ năng sử dụng JavaScript vào giải quyết vấn đề. Trong game, bạn sẽ dùng các kỹ thuật JavaScript từ cơ bản đến nâng cao để hướng dẫn Dr. Eval đi qua ma trận máy.

9. Code Hunt

15 game miễn phí giúp bạn luyện code mỗi ngày

Code Hunt dạy code Java và C# một cách độc đáo qua việc phân tích các đoạn code và sửa đổi chúng sao cho khớp với nhau.

10. Robocode

15 game miễn phí giúp bạn luyện code mỗi ngày

Với Robocode, bạn sẽ luyện lập trình qua việc xây dựng một robot xe tăng chiến đấu ảo bằng Java và .NET.

11. CheckIO và Empire of Code

15 game miễn phí giúp bạn luyện code mỗi ngày

CheckIO và Empire of Code là hai game chiến lược dạy bạn lập trình Python và JavaScript. Bối cảnh trong Empire of Code sẽ là các màn giao chiến trong không gian, và bạn sẽ phải dùng code để bảo vệ căn cứ của mình, đồng thời chống lại các kẻ thù xung quanh.

  Amanotes - Kẻ viết tiếp giấc mơ game Việt

12. VIM Adventures

15 game miễn phí giúp bạn luyện code mỗi ngày

VIM là công cụ chỉnh sửa văn bản được nhiều lập trình viên sử dụng. Nếu muốn học cách sử dụng VIM thì VIM Adventures chính là bước khởi đầu thú vị. Bạn cũng có thể sử dụng các phím tắt của VIM để điều chuyển hướng đi trong trò chơi thám hiểm này.

13. Cyber Dojo

15 game miễn phí giúp bạn luyện code mỗi ngày

Cyber Dojo đưa ra các bài luyện tập cho hàng chục ngôn ngữ lập trình khác nhau, bao gồm cả Ruby, JavaScript, PHP và Python. Mỗi bài tập sẽ đưa ra một thách thức có kèm theo ví dụ để người chơi biết kết quả khi hoàn thành sẽ ra sao.

14. Evevator Saga

15 game miễn phí giúp bạn luyện code mỗi ngày

Elevator Saga sẽ kiểm tra kỹ năng JavaScript của bạn bằng các thách thức như di chuyển thang máy hay vận chuyển người sao cho hiệu quả nhất. Trò game khởi động bằng nhiệm vụ vận chuyển 15 người trong khoảng thời gian dưới 1 phút.

15. Code Wars

15 game miễn phí giúp bạn luyện code mỗi ngày

Code Wars giúp bạn nâng cao kỹ năng lập trình JavaScript, Swift, PHP, Python, Ruby và Haskell. Bạn sẽ bắt đầu với một bài kiểm tra cơ bản độ hiểu về ngôn ngữ đang muốn luyện tập.

Tham khảo Business Insider

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

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

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

3 điều lầm tưởng về nghề Nhân sự (HR) 

nhân sự

Người làm nhân sự chỉ để kỷ luật, chỉ để tuyển dụng? Làm nhân sự có thể tự ý lựa chọn, sa thải các nhân viên của mình? Đó là suy nghĩ chung của nhiều người về ngành nhân sự. Tuy nhiên, nó chưa xác đáng. Và thật sự, họ là những người chưa thật sự hiểu về ngành nhân sự. Cùng TopDev tìm hiểu những lầm tưởng mà phần đông người đều áp đặt cho nghề nhân sự nhé! 

Nghề nào cũng có đắng – có ngọt! Người làm Nhân sự cũng có những “nỗi lòng” riêng

Công tác nhân sự tất nhiên sẽ bao gồm nhiệm vụ tuyển dụng. Tuy nhiên, đó chưa phải là tất cả. Nhiều công tác khác cần được thực hiện. Đồng thời, họ phải đảm bảo các ứng viên được chọn đáp ứng đủ các nhu cầu chi tiết trong bản mô tả.

  Nhân sự là gì? Vai trò và các vị trí công việc của HR

nhân sự

Chưa kể, người làm nhân sự sẽ phải đối mặt với nhiều khó khăn:

– Ứng viên “bỏ bom”, viện nhiều lý do để không đến phỏng vấn hoặc đến nhưng rất muộn.

– Chưa có kinh nghiệm làm việc, kỹ năng chuyên mô còn thiếu sót.

– CV sơ sài, thiếu chuyên nghiệp.

– Email gửi thì dùng ngôn từ, văn không phù hợp,…    

  Văn hóa giao tiếp qua Email - Thế nào là chuyên nghiệp?
  Top 5 website giúp thiết kế CV chuẩn format, đủ nội dung

Tùy thuộc vào tính tương ứng về quyền quản lý hoặc được phân công, họ sẽ đảm nhận nhiều nhiệm vụ hơn. Các công việc khác có thể là: nhóm về chế độ lương và phúc lợi (C&B); nhóm công việc hành chính, nhóm đào tạo và phát triển. Rất nhiều nhiệm vụ quan trọng được gói trọn trong 3 từ “nghề tuyển dụng”.

Khi thế giới nhân sự phát triển gắn liền với công nghệ số, ngoài câu chuyện về quản trị con người; sự đồng hành và thăng tiến, việc kết hợp IT và HR được xem là một thách thức lớn. HR cần có những chiến lược phù hợp để đủ sức cạnh tranh trong cuộc tìm kiếm các ứng viên tiềm năng.

Kỷ luật, trừ lương hay sa thải đều do nhân sự (HR)?

Sự quy chụp rất đáng sợ dù trong bất kỳ hoàn cảnh nào.

Thực tế cho thấy rằng nhiều nhân viên sau khi bị “đánh bay” khỏi doanh nghiệp, họ đã lên tiếng rằng chính HR đã ra quyết định sa thải họ. Điều này hoàn toàn sai bởi việc đưa ra quyết định loại ai ra khỏi cuộc chơi nghề nghiệp phải dựa trên các tổng hợp về đánh giá, thảo luận từ nhiều phía.

Xem thêm: 5 “quả bom nổ chậm” có thể đánh bay sự nghiệp bất cứ lúc nào

nhân sự

HR luôn tự nhận thức được mình luôn được gán cho một vai phản diện trong “vở kịch” mang tên “tái cơ cấu hay cắt giảm biên chế”. 

Tùy thuộc vào quy mô, văn hóa từng doanh nghiệp mà sự sàng lọc định kỳ thông qua các giá sẽ có độ khắc nghiệt khác nhau. Chính điều đó tạo nên sự sàng lọc định kỳ. Và tất nhiên, những cá nhân không còn đủ sự phù hợp phải “được” rời đi. 

Chẳng một nhà lãnh đạo nào đuổi nhân viên của mình vì cảm tính, vì sự thúc giục cả. Và dù nếu có, doanh nghiệp đó chẳng thể nào tồn tại được lâu. Hơn hết, khi bị sa thải, bạn cần nhìn nhận về bản thân để rồi thay đổi, nỗ lực để hoàn thiện mình hơn thay vì cứ ngồi ngẫm và suy diễn những chuyện không đâu.

Kỷ luật, trừ lương hay sa thải đều là hình phạt cho những biểu hiện thiếu tích cực của bạn. HR chịu trách nhiệm quản lý và cũng chỉ đưa ra những nhận xét cơ bản. Nhà lãnh đạo sẽ là  người có cái nhìn sâu sắc hơn để đưa ra một quyết định đúng đắn nhất.

Nhân sự chỉ đứng về phía sếp?

Có thể thấy rằng, HR phải chịu những ánh mắt dè bỉu khi bi đánh giá là chỉ đứng về phía sếp. Tuy vậy, ít ai biết rằng HR đã phải tranh luận với sếp để bảo vệ quyền lợi cho các nhân viên nếu nhận thấy điều gì chưa thỏa đáng.

Xem thêm: 3 điều quan trọng cần nắm về tương lai của ngành Nhân sự

nhân sự

HR họ luôn cho rằng khi đồng hành trong công tác phát triển nguồn nhân lực, điều họ cần làm là cố gắng đảm bảo những quyền lợi cơ bản cho nhân viên một cách tốt nhất.

Người ta từng ví von rằng người làm nhân sự như là “làm dâu trăm họ”. Chính vì thế, họ cần phải khéo léo và tinh tế trong việc lắng nghe; tiếp thu những kiến thức. Có thể họ chưa nhận được sự thấu hiểu của các nhân viên. Thậm chí còn bị nhân viên đặt điều phê phán. Thế nhưng, họ không cần nhận nhân được sự ủng hộ từ nhân viên. Mong muốn họ đon giản chỉ là hoàn thành tốt nhiệm vụ của mình. 

Lời kết

Nghề nhân sự có nhiều góc khuất chưa được bật mí. Nơi đó có những câu chuyện thú vị và cũng lắm nỗi niềm riêng. Do vậy, HR đều là những người thật sự bản lĩnh trong cuộc sống. TopDev mong rằng đó sẽ là động lực lớn để họ tiếp tục theo đuổi, phát triển bản thân nhiều hơn trên con đường sự nghiệp.


Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

Có thể bạn quan tâm

Markdown là gì? Cách sử dụng Markdown

markdown

Trong bài viết này TopDev xin gửi đến các bạn một số cách sử dụng Markdown thông dụng, nhưng trước tiên chúng ta cần nắm rõ định nghĩa Markdown là gì để có thể có một cái nhìn khách quan hơn cho loại ngôn ngữ lâu đời này.

Markdown là gì?

markdown

Markdown là ngôn ngữ đánh dấu văn bản đã có mặt từ rất lâu, với cú pháp đơn giản, dễ hiểu nên đã được nhiều người biết đến và được sử dụng khá phổ biến. Đây là loại ngôn ngữ đánh dấu văn bản được tạo ra vào năm 2004 bởi John Gruber.

Ngôn ngữ đánh dấu là gì? Ngôn ngữ đánh dấu được hiểu đơn giản là phương pháp làm cho một câu, đoạn văn bản hoặc một ý nào đó trở nên nên khác biệt đối với các đoạn còn lại (có thể là in nghiêng, in đậm…) giúp cho người đọc có thể dễ dàng tìm kiếm và chú ý đến ngay phần được đánh dấu.

Trả lời câu hỏi ‘tại sao nên sử dụng Markdown?’

Lý do thuyết phục nhất để sử dụng Markdown có lẽ là vì nó rất phổ biến, cách sử dụng của nó cũng cực kỳ đơn giảntiện dụng. Nếu có thể sử dụng một phương pháp đỡ rắc rối hơn HTML và thuận tiện hơn các các trình soạn thảo WYSIWYG (What You See Is What You Get) như MS Word, CKEditor… thì tại sao lại không chọn Markdown?

Như các bạn đã biết, ngôn ngữ đánh dấu HTML cũng là một trong những ngôn ngữ phổ biến và được sử dụng rất nhiều, tuy nhiên, có nhiều ý kiến cho rằng cú pháp của HTML không mấy thân thiện với người dùng và kể cả khi bạn là người có kiến thức, hiểu biết về nó thì cú pháp của nó vẫn mang đến sự “rối mắt” cho bạn.

Ngoài ra, bạn vẫn có thể sử dụng Markdown thuần thục ngay cả khi bạn không có tí kiến thức nào về HTML

Cách sử dụng Markdown

markdown

Dùng cho Heading

Sử dụng # trước tiêu đề để đánh dấu Heading, số kí tự # sẽ tương ứng với các cấp Heading khác nhau từ 1 đến 6.

# Heading 1
# Heading1 #

Hiển thị: Heading 1

## Heading 2
## Heading ##

Hiển thị: Heading 2

### Heading 3
### Heading 3 ###

Hiển thị: Heading 3

#### Heading 4
#### Heading 4 ####

Hiển thị: Heading 4

##### Heading 5
##### Heading 5#####
Hiển thị: Heading 5
###### Heading 6
###### Heading 6 ######
Hiển thị: Heading 6

Dùng cho Bold và Italic

Sử dụng ** ở đầu (hoặc đầu và cuối câu) nếu muốn bôi đậm câu đó.

Tạo chữ Bold

**TopDev việc làm IT hàng đầu**

Hiển thị: TopDev việc làm IT hàng đầu

Tạo chữ Italic

Sử dụng _ ở đầu hoặc * (hoặc đầu và cuối câu) nếu muốn in nghiêng câu đó.

_TopDev việc làm IT hàng đầu_

Hiển thị: TopDev việc làm IT hàng đầu

Tạo chữ Blod & Italic:

Sử dụng **_ ở đầu (**_ đầu và _**cuối câu) hoặc *** nếu muốn bôi đậm và in nghiêng câu đó.

**_TopDev việc làm IT hàng đầu_**

Hiển thị: TopDev việc làm IT hàng đầu

Dùng cho Strikethrough

Sử dụng ~~ ở đầu (hoặc đầu và cuối câu) nếu muốn gạch ngang giữa chữ của câu đó.

~~TopDev việc làm IT hàng đầu~~

Hiển thị: TopDev việc làm IT hàng đầu

Dùng cho chèn Link

Sử dụng cú pháp []() để chèn link trong bài viết, ở đó nội dung trong [] sẽ là thẻ alt text, và nội dung trong () sẽ là đường link mà bạn muốn điều hướng đến.

[TopDev](https://topdev.vn)

Hiển thị: TopDev

  Kiến thức về "Lazy-loading images" mà bạn cần biết

Dùng cho chèn Image

Sử dụng cú pháp ![]() để chèn link trong bài viết, ở đó nội dung trong [] sẽ là thẻ alt text, và nội dung trong () sẽ là địa chỉ ảnh mà bạn muốn người đọc nhìn thấy.

![topdev](https://topdev.vn)

Dùng cho chèn Code

Code theo từ hoặc cụm từ

Sử dụng ` hoặc ``` ở đầu và cuối câu nếu muốn định dạng câu đó ở dạng code.

`TopDev việc làm IT hàng đầu`

Hiển thị: TopDev việc làm IT hàng đầu

Code theo đoạn/khối

Sử dụng 4 khoảng trắng ở đầu câu      nếu muốn định dạng cả đoạn đó ở dạng code.

    </style>
    <body>
        <div>TopDev tuyen dung IT hang dau.</div>
        <div class="relative">TopDev tuyen dung IT hang dau.</div>
        <div>TopDev tuyen dung IT hang dau.</div>
    </body>

Hiển thị:

</style>
<body>
    <div>TopDev tuyen dung IT hang dau.</div>
    <div class="relative">TopDev tuyen dung IT hang dau.</div>
    <div>TopDev tuyen dung IT hang dau.</div>
</body>

Dùng cho List

Sử dụng - hoặc * hoặc + nếu muốn định dạng câu đó ở dạng list.Trong trường hợp muốn tạo thêm lớp level thấp hơn thì thêm 2 khoảng trắng vào nữa.

- TopDev việc làm IT hàng đầu
  - Cộng sự đắc lực hỗ trợ doanh nghiệp tuyển dụng
  - Người bạn đồng hành giúp các Developer tìm được công việc mơ ước

Hiển thị:

  • TopDev tuyển dụng IT hàng đầu
  • Cộng sự đắc lực hỗ trợ doanh nghiệp tuyển dụng
  • Người bạn đồng hành giúp các Developer tìm được công việc mơ ước

Dùng cho Blockquote

Sử dụng > nếu muốn định dạng câu đó ở dạng quote.

> TopDev việc làm IT hàng đầu

Hiển thị:

markdown

Tạo bảng

Sử dụng theo mẫu dưới đây để tạo bảng

| Letter | Next Letter | Previous Letter | 
| :----- | :---------- | :-------------- | 
| B      | C           | A               | 
| E      | F           | D               | 
| H      | I           | G               | 
| T      | U           | S               |

Hiển thị:

Letter Next letter Previous letter
B C A
E F D
H I G
T U S

Lời kết

Có vô vàn lý do để người dùng sử dụng Markdown, nhưng chắc hẳn rằng lý do ‘vì nó tiện dụng’ sẽ là lý do được nhắc đến nhiều nhất. Việc ngôn ngữ Markdown được thiết kế với cú pháp tiện lợi, tiết kiệm thời gian như thế này không những làm hài lòng các Coder mà còn có cả những người dùng ngoài ngành khác, miễn là họ có để nhớ đến các cú pháp đơn giản được TopDev giới thiệu ở trên!

Có thể bạn muốn xem thêm:

Xem thêm nhiều việc làm web Developer hấp dẫn lương cao tại TopDev!

Lập trình hướng đối tượng (OOPs) trong Java

Lập trình hướng đối tượng (OOPs) trong java

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

Khái niệm về lập trình hướng đối tượng trong java

Lập trình hướng đối tượng (Object Oriented Programing – OOP) là một phương pháp để thiết kế một chương trình bởi sử dụng các lớp và các đối tượng.

Java là một ngôn ngữ lập trình hướng đối tượng vì vậy nó cũng hỗ trợ các đặc tính của lập trình hướng đối tượng:

  • Đa hình (Polymorphism)
  • Thừa kế (Inheritance)
  • Đóng gói (Encapsulation)
  • Trừu tượng (Abstraction)

Tuyển dụng lập trình viên Java

Đối tượng (object)

Đối tượng là một thực thể có trạng thái và hành vi. Nó có thể mang tính vật lý hoặc logic.

Nếu chúng ta xem xét thực tế chúng ta có thể tìm thấy nhiều đồ vật xung quanh chúng ta: cái bàn, con chó, con người, v.v… Tất cả các đối tượng này đều có thuộc tính và hành vi.

Nếu chúng ta xem xét một con chó, thuộc tính của nó sẽ là – tên, giống, màu sắc, và các hành vi là: sủa, chạy, ăn, … Nếu bạn so sánh các đối tượng trong phần mềm với một đối tượng trong thế giới thực, chúng sẽ có đặc điểm rất giống nhau: thuộc tính đối tượng trong phần mềm được lưu trữ trong trường (field) và hành vi được lưu trữ trong phương thức (method).

Lớp (Class)

Chúng ta có thể xem lớp như một khuôn mẫu (template) của đối tượng (Object). Trong đó bao gồm dữ liệu của đối tượng (fields hay properties) và các phương thức(methods) tác động lên thành phần dữ liệu đó gọi là các phương thức của lớp.

Khai báo lớp

Cú pháp:

<Phạm vi truy cập> class <Tên lớp> {      // Khai báo thuộc tính (field) hay biến     <Phạm vi truy cập> <kiểu dữ liệu> <field_1>;      <Phạm vi truy cập> <kiểu dữ liệu> <field_2>;      // Hàm khởi tạo không có tham số     <Phạm vi truy cập> <Tên lớp>(){         // Khởi tạo dữ liệu     }     // Hàm khởi tạo có tham số     <Phạm vi truy cập> <Tên lớp>(<Kiểu dữ liệu> <tên biến>[, <Kiểu dữ liệu> <tên biến>]){         // Khởi tạo dữ liệu     }     // Phương thức xử lý (method)     <Kiểu trả về> method_1() {         // Logic xử lý      }     <Phạm vi truy cập> <Kiểu trả về> method_2(<Kiểu dữ liệu> <tên biến>) {         // Logic xử lý      } }

Trong đó:

  • class: là từ khóa để khai báo lớp trong Java.
  • Tên lớp: là tên chúng ta đặt cho lớp (quy tắc đặt tên: viết hoa mỗi chữ cái đầu).
  • field_1, field_2: các thuộc tính, các biến, hay các thành phần dữ liệu của lớp (quy tắc đặt tên: chữ cái đầu tiên viết thường, các chữ cái đầu tiên tiếp theo viết hoa).
  • Hàm khởi tạo (constructor): hàm dùng để khởi tạo đối tượng lớp.
  • method_1, method_2: là các phương thức thể hiện các thao tác xử lý, tác động lên các thành phần dữ liệu của lớp.

Ví dụ:

  • Tạo lớp Student.
  • Có 2 thuộc tính id và name.
  • Tạo hàm khởi tạo có tham số là id.
  • Cung cấp 3 phương thức: lấy id, lấy name và gán giá trị name
public class Student {
   // Khai báo thuộc tính
   private int id; 
   private String name;

   // Hàm khởi tạo có 1 tham số là id
   public Student(int id) {
     // Sử dụng từ khóa this để truy cập thuộc tính trong lớp
     // nếu không sử dụng từ khóa this thì đang truy cập vào tham số của hàm khởi tạo
     this.id = id;
   }

   // Cung cấp phương thức lấy giá trị id
   public int getId() {
     return id;
   }

   // Cung cấp phương thức lấy giá trị name
   public String getName() {
     return name;
   }

   // Cung cấp phương thức gán giá trị name
   public void setName(String name) {
     this.name = name;
   }
}

Lưu ý:

  • Trong ví dụ trên từ khóa this nhằm chỉ đến chính lớp đang được tham chiếu đến. this.name sẽ tham chiếu đến thuộc tính name của class Student.
  • Các phương thức (method) dùng để gán giá trị của một thuộc tính (field) nên bắt đầu là set.
  • Các phương thức (method) dùng để lấy giá trị của một thuộc tính (field) nên bắt đầu là get.

Sử dụng lớp

Cú pháp:

<Tên lớp> <tên đối tượng> = new <Tên lớp>(<giá trị tham số nếu có>); <tên đối tượng>.<tên thuộc tính>; <tên đối tượng>.<tên phương thức>(<giá trị tham số nếu có>);

Sử dụng từ khóa new để khởi tạo một đối tượng của một lớp.

Ví dụ:

Student student = new Student(1);
student.setName("gpcoder");
System.out.println("Id=" + student.getId());
System.out.println("Name=" + student.getName());

Sự khác nhau giữa lớp và đối tượng trong java

Đối tượng Lớp
Đối tượng là thể hiện của 1 lớp. Lớp là một khuân mẫu hay thiết kế để tạo ra các đối tượng.
Đối tượng là 1 thực thể trong thế giới thực như Con mèo (Cat), con chó (Dog), … Lớp là một nhóm các đối tượng tương tự nhau. Ví dụ: Lớp động vật (Animal).
Đối tượng là 1 thực thể vật lý Lớp là 1 thực thể logic
Đối tượng được tạo ra chủ yếu từ từ khóa new.
Ví dụ: Student s1=new Student();
Lớp được khai báo bằng việc sử dụng từ khóa class.
Ví dụ: class Student{}
Đối tượng có thể được tạo nhiều lần. Lớp được khai báo 1 lần duy nhất.
Đối tượng được cấp bộ nhớ khi nó được tạo ra. Lớp không được cấp bộ nhớ khi nó được tạo ra.
Có rất nhiều cách để tạo ra đối tượng trong java như từ khóa new, phương thức newInstance(), phương thức clone(), phương thức factory và deserialization. Chỉ có một cách để định nghĩa lớp trong java sử dụng từ khoá class.
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java
  11 mẹo đơn giản để tăng hiệu suất Java cấp tốc

Package

Định nghĩa

Một package (gói) trong java là một nhóm các kiểu tương tự của các lớp, giao diện và các package con .

Package trong java có thể được phân loại theo hai hình thức, package được dựng sẵn và package do người dùng định nghĩa.

Có rất nhiều package được dựng sẵn như java, lang, net, io, util, sql, …

Package do người dùng tự định nghĩa

Cú pháp:

package <tên package cha>[.<tên package con>];

Ví dụ về java package:

package gpcoder; // Package cha
package com.gpcoder; // Package gpcode là con của package com

Lợi thế của việc sử dụng package trong java:

  • Package được sử dụng để phân loại lớp và interface giúp dễ dàng bảo trì.
  • Package cung cấp bảo vể truy cập
  • Package khắc phục được việc đặt trùng tên.

Truy cập package từ package khác

Có 3 cách để truy cập package từ package bên ngoài:

  • Khai báo import package.*; tránh sử dụng cách này, không xác định sẽ sử dụng class nào, có thể gặp vấn đề trùng tên lớp nếu cả 2 package import package.* giống nhau. Ví dụ: sử dụng class Date có thể gặp lỗi biên dịch do không thể xác định chính xác sử dụng class Date của package nào nếu import cả 2 package java.util và java.sql.
package com.gpcoder.oop;

import java.util.Calendar;
import java.util.*;
import java.sql.*;

import com.gpcoder.service.*;

public class PackageDemo {

   public static void main(String[] args) {
     java.util.Date d = Calendar.getInstance().getTime();
   }

}
  • Khai báo import package.ClassName; nên sử dụng cách này để giữ code đơn giản, rõ ràng, tái sử dụng lại nhiều chỗ, hạn chế xung đột về tên.
  • Sử dụng tên đầy đủ: tránh sử dụng cách này, do code trở nên dài dòng nếu package gồm nhiều cấp cha, con.

Ví dụ: một project có package như sau

Lập trình hướng đối tượng (OOPs) trong java

Class CommonService cung cấp 2 phương thức method1 và method2.

Chúng ta có thể sử dụng method1 từ một class khác ngoài package com.gpcoder.service như sau:

  • Khai báo import com.gpcoder.service.*;
package com.gpcoder.oop; import com.gpcoder.service.*; public class PackageDemo {     public static void main(String[] args) {         CommonService service = new CommonService();         service.method1();     }
}
  • Khai báo import com.gpcoder.service.CommonService;
package com.gpcoder.oop; import com.gpcoder.service.CommonService; public class PackageDemo {
     public static void main(String[] args) {         CommonService service = new CommonService();         service.method1();     }
 }
  • Sử dụng tên đầy đủ: import com.gpcoder.service.CommonService;
package com.gpcoder.oop;

public class PackageDemo {

   public static void main(String[] args) {
     com.gpcoder.service.CommonService service = new com.gpcoder.service.CommonService();
     service.method1();
   }

}

Lưu ý

  • Nếu bạn import một package thì package con của package đó không được import.
  • Thứ tự của chương trình phải là khai báo package -> import -> class.
  • Khi sử dụng một class của package này ở package khác nên sử dụng ở dạng import package.ClassName
  • Mỗi package tương ứng với một thư mục được. Như ví dụ trên thì cấu trúc thư mục ứng với package com.gpcoder.service được tạo ra như sau:

Lập trình hướng đối tượng (OOPs) trong java

Constructor

Định nghĩa

Constructor trong java là một dạng đặc biệt của phương thức được sử dụng để khởi tạo các đối tượng.

Java Constructor được gọi tại thời điểm tạo đối tượng. Nó khởi tạo các giá trị để cung cấp dữ liệu cho các đối tượng, đó là lý do tại sao nó được gọi là constructor.

Khai báo của Constructor giống với khải báo của method (phương thức). Nó phải có cùng tên với class (lớp) và không có giá trị trả về.

Có 2 kiểu của constructor:

  • Constructor mặc định (không có tham số truyền vào – default constructors).
  • Constructor tham số (parameterized constructors).

Constructor mặc định trong java

Một constructor mà không có tham số được gọi là constructor mặc định. Constructor mặc định được sử dụng để cung cấp các giá trị mặc định cho các thuộc tính như 0, null, false … , tùy thuộc vào kiểu dữ liệu được sử dụng.

Nếu một lớp không khai báo contructor thì trình biên dịch sẽ tự động tạo một constructor mặc định trong lớp đó.

Cú pháp:

<Phạm vi truy cập> <Tên lớp>(){
// Khởi tạo dữ liệu
}

Ví dụ:

package com.gpcoder.oop;
 public class JavaDefaultConstructor {
     public JavaDefaultConstructor() {
         System.out.println("This is default constructor.");
     }
     public static void main(String[] args) {
         JavaDefaultConstructor obj = new JavaDefaultConstructor();
     }
}

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

This is default constructor.

Constructor tham số trong java

Một constructor có tham số truyền vào được gọi là constructor tham số. Constructor tham số được sử dụng để cung cấp các giá trị khác nhau cho các đối tượng khác nhau.

<Phạm vi truy cập> <Tên lớp>(<Kiểu dữ liệu> <tên biến>[, <Kiểu dữ liệu> <tên biến>]){
        // Khởi tạo dữ liệu
}

Ví dụ:

package com.gpcoder.oop;
public class JavaParameterizedConstructor {
     private String website;
     public JavaParameterizedConstructor(String website) {
         this.website = website;
         System.out.println("This is parameterized constructor");         System.out.println("from website = " + website);     }
     public static void main(String[] args) {
         JavaParameterizedConstructor obj = new JavaParameterizedConstructor("gpcoder.com");
     }
}

Kết quả:

This is parameterized constructor from website = gpcoder.com

Overloading Constructor trong java

Constructor Overloading là một kỹ thuật trong Java. Bạn có thể tạo nhiều constructor trong cùng một lớp với danh sách tham số truyền vào khác nhau, điều này được gọi là phép đa năng hóa (Overloading). Trình biên dịch phân biệt các constructor này thông qua số lượng và kiểu của các tham số truyền vào.

Ví dụ:

package com.gpcoder.oop;
 public class JavaOverloadingConstructors {
     private String website;
     private String subject;
     public JavaOverloadingConstructors(){
         System.out.println("This is default constructor.");
     }   
      public JavaOverloadingConstructors(String website) {
         this.website = website;
         System.out.println("This is parameterized constructor");
         System.out.println("from website = " + website);
    } 
     public JavaOverloadingConstructors(String website, String subject) {
         this.website = website;
         this.subject = subject;
         System.out.println("This is parameterized constructor");
         System.out.println("from website = " + website);
         System.out.println("with subject = " + subject);
     }
     public static void main(String[] args){
         JavaOverloadingConstructors obj = new JavaOverloadingConstructors();
         System.out.println("---");    
      obj = new JavaOverloadingConstructors("gpcoder.com");           System.out.println("---");
        obj = new JavaOverloadingConstructors("gpcoder.com", "OOP"); 
     } }

Kết quả:

This is default constructor.
---
This is parameterized constructor
from website = gpcoder.com
---
This is parameterized constructor
from website = gpcoder.com
with subject = OOP

Lưu ý

  • Từ khóa this trong java là một biến tham chiếu được sử dụng để tham chiếu tới đối tượng của lớp hiện tại.
  • Từ khóa super trong java là một biến tham chiếu được sử dụng để tham chiếu trực tiếp đến đối tượng của lớp cha gần nhất.

Sự khác nhau giữa constructor và phương thức trong java

Constructor Phương thức
Constructor được sử dụng để khởi tạo trạng thái của một đối tượng. Phương thức được sử dụng để thể hiện hành động của một đối tượng.
Constructor không có kiểu trả về. Phương thức có kiểu trả về.
Trình biên dịch Java tạo ra constructor mặc định nếu bạn không có constructor nào. Phương thức không được tạo ra bởi trình biên dịch Java.
Tên của constructor phải giống tên lớp. Tên phương thức có thể giống hoặc khác tên lớp.

Phạm vi truy cập (Access modifier)

Có hai loại modifier trong java: access modifiers và non-access modifiers.

Các access modifiers trong java xác định độ truy cập (Phạm vi) vào dữ liệu của của các trường (field), phương thức (method), cấu tử (constructor) hoặc lớp (class).

Có 4 kiểu của java access modifiers:

  • private
  • (Mặc định)
  • protected
  • public

Và có một vài non-access modifiers chẳng hạn static, abstract, synchronized, native, volatile, transient, v.v.. Trong tài liệu này chúng ta sẽ học về access modifier.

Bảng mô tả tổng quan về cách sử dụng các access modifier:

Access Modifier Truy cập bên trong class? Truy cập bên trong package? Truy cập bên ngoài package bởi class con? Truy cập bên ngoài class và không thuộc class con?
private Y
Default Y Y
protected Y Y Y
public Y Y Y Y

Tài liệu tham khảo:

  • https://www.javatpoint.com/java-oops-concepts
  • https://www.tutorialspoint.com/java/java_packages.htm

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

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

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

Tại sao lập trình viên thường ế?

Tại sao lập trình viên thường ế?

Bài viết được sự cho phép của tác giả Võ Xuân Phong

Môi trường làm việc ngành IT thừa nam thiếu nữ

Đối với ngành IT thì các bạn cũng biết rõ là môi trường làm việc đồng nghiệp nam sẽ nhiều hơn nữ, đối với team mình hiện giờ thì số lượng thành viên trên 30 người nhưng chỉ có 2 3 bạn nữ thôi. Việc tìm được người tình trong mộng thật sự rất khó khăn phải không chưa tính tới việc phải cạnh tranh với các con đực còn lại để giành được bạn tình nữa nhé.

Tại sao lập trình viên thường ế?

Dev không khéo trong việc ăn nói

Dân kỹ thuật thì mọi người cũng đã quá hiểu là rất kiệm lời, không giỏi trong việc ăn nói và giải thích cảm xúc như các bạn ở những ngành đòi hỏi việc giao lưu và kỹ năng ăn nói tốt khác. Nên sẽ fail trong vòng gửi xe khi mở miệng ra cua gái dưới đây là 1 đoạn tin nhắn quen thuộc khi lập trình viên cua gái:

                 “Sáng ấm em nha,

                  Em ăn cơm chưa,

                  Em buồn ngủ chưa,

                  Anh làm việc tí đã,

                  Em ngủ ngon”

Mà đáng tiếc thay là “Con trai yêu bằng mắt, con gái yêu bằng tai” các anh chàng của chúng ta lại không khéo trong việc ăn nói nên chẳng có lời nào ngọt ngào nghe vừa tai phái đẹp thế là lại ế.

Dev Hướng nội, thiên về logic hơn thiên về cảm xúc

Nguyên nhân ế của các lập trình viên cũng từ tính cách quá hướng nội, thích thì nói thích, yêu thì nói yêu không đâu cứ giữ trong lòng đó để rồi bỏ mất cơ hội có được người đẹp.

Lập trình viên hay gọi 1 cách thân mật hơn là các dev (developer) chúng ta hay giấu những tâm sự cho riêng mình chứ ít khi bày tỏ ra được hết nỗi lòng mình.

Các bạn nữ thì đang tìm các anh chàng soái ca như trong phim Hàn còn các dev thì khô cứng thấy mà chán.

Với sức chịu đựng của các dev cực kỳ cao thế nên có buồn chàng dev cũng không nói ra đâu, có câu an ủi này “các dev chúng ta không cô đơn, chúng ta có máy tính bên cạnh rồi phải không”

Tại sao lập trình viên thường ế?

Các dev khá bận rộn

Chúng ta là những người đam mê và ham học hỏi những kiến thức mới, những công nghệ mới, ngoài giờ làm việc các dev thường phải nghiên cứu và mày mò thêm để có thể cập nhật đủ lượng kiến thức phòng thân vì công nghệ cứ thay đổi từng ngày từng ngày nếu chúng ta ngưng học hỏi, chúng ta sẽ dậm chân tại chỗ và bị vùi chôn bởi thứ gọi là công nghệ.

Áp lực từ công việc deadline tới liên tục có khi các dev phải làm việc OT để kịp thời hạn delivery cho khách hàng, khi đã delivery cho khách hàng rồi nếu có lỗi (bug) thì các dev phải fix nó bất chấp là ở công ty, trên xe bus, hay ở nhà, hoặc kể cả trong nhà vệ sinh.

Vì cái gọi là tương lại mà thời gian nắm chuột nhiều hơn là nắm tay em người yêu đi chơi, đi ăn, đi làm mấy trò yêu đương nên là rất thiệt thòi cho các em ấy.

Tại sao lập trình viên thường ế?

  10 nguyên tắc lập trình nền tảng mà lập trình viên nào cũng cần biết
  Thuật toán là gì? 11 thuật toán hàng đầu dành cho lập trình viên

Kiến thức xã hội thiếu thốn.

Tuy các dev rất thông minh, giải quyết vấn đề logic rất nhanh nhạy nhưng do chỉ ngồi ở nhà code và học ít khi ra ngoài xã hội trải sự đời nên thường các dev kinh nghiệm thực chiến bên ngoài xã hội sẽ yếu hơn các bạn khác.

Dev có phong cách giản dị và tinh gọn

Các chàng trai khác thì quần áo tóc tai đủ kiểu nhưng các chàng dev thì quá đơn giản không cầu kì trong phong cách ăn mặt, ít chải chuốt. Người đẹp vì lụa mà đúng không các trai dev tuy cũng có nét đẹp riêng của mình nhưng lại không lọt vào mắt của phải đẹp.

Tạm kết:

Khi chúng ta biết chúng ta thiếu gì thì hãy sửa đổi, thiếu muối thì tắm biển để mặn mòi từ da dẻ. Cô đơn thì tìm gấu và nhớ thay đổi và hoàn thiện bản thân mỗi ngày nhé các bạn.

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

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

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

Đào tạo (Training) – Đâu là thời điểm bạn cần trải nghiệm?

đào tạo
đào tạo

Để thành công, bạn cần quan tâm đến việc tự thúc đẩy, phát triển những kỹ năng. Trong  quá trình đó, Training, Coaching, Mentoring là ba điều các bạn cần quan tâm nhất. Cả 3 đều được phát sinh từ nhu cầu muốn trải nghiệm của mỗi cá nhân. Với bài viết hôm nay, TopDev phân tích về thời điểm lý tưởng nhất để bạn bắt đầu training cũng như những tip để quá trình training đạt hiệu quả nhất.

Training là gì? Đâu là thời điểm thích hợp dành cho bạn?

Training là gì?

training

Traning (sự đào tạo) là một hình thức cung cấp các kiến thức chuyên môn, liên ngành, kỹ năng mềm,… trong một thời hạn nhất định

Training chú trọng đến việc nâng cao mức độ am hiểu về một lĩnh vực hay nhiệm vụ của công việc đặc thù nào đó. Dựa trên các cơ sở về mức độ phức tạp của mỗi khóa học; khả năng tiếp thu của mỗi nhân viên; trình độ của người đào tạo, quá trình training có thể diễn ra trong khoảng thời gian khác nhau.

Hãy bắt đầu từ nhu cầu Training của bạn!

Tuỳ thuộc vào mục tiêu, định hướng và điều kiện của bạn, việc training sẽ hiệu quả hơn. Và nếu bạn đã sẵn sàng, bạn có thể bắt đầu bất cứ lúc nào.

  Bí mật giúp tạo động lực và tăng năng suất cho nhân viên!
  Khám phá phong cách hợp tác của bạn

training

Nhu cầu training sẽ được đáp ứng khi bản thân bạn mong muốn mình được học hỏi, phát triển thêm. Bạn cần được đào tạo hiểu chuyên sâu một vấn đề nào đó. Hoặc đơn giản, bạn cần update lại các kiến thức một cách bài bản hơn. Từ đó, bạn có những nền tảng vững chắc. Điều này giúp bạn đảm bảo các vấn đề được thu nhận và truyền tải một cách khoa học.

Lựa chọn Trainer phù hợp với bạn

Một Trainer phù hợp sẽ thúc đẩy bạn phát triển những định hướng tốt hơn. 

Thông thường, việc lựa chọn Trainer giỏi sẽ phụ thuộc vào 2 tiêu chí:

  • Khả năng sáng tạo các khóa học.
  • Khả năng đứng lớp.

Xem thêm: 4 cách thúc đẩy sự phát triển nhân viên tại công ty

training

Tuy nhiên, nếu cùng một khóa đào tạo, bạn có thể lựa chọn Trainer dựa vào khả năng  “thực chiến” của họ. Tức là các năng lực khác như giá trị đồng hành, tính hiệu quả từ bài giảng và các chia sẻ thực tế; sự hiểu biết, độ dày kinh nghiệm, tính cách, cảm xúc,.. Tất cả đều là những cơ sở giúp bạn tìm ra một Trainer giỏi. 

Trainer càng có thâm niên, những gì họ sở hữu sẽ rất cần thiết cho bạn. Họ dễ dàng nắm bắt giá trị thực tiễn và đưa chúng vận dụng vào các cơ sở lý thuyết chuyên ngành. Họ biết cách tạo cơ hội cho bạn dễ hình dung về các vấn đề.

Quan trọng hơn hết, họ còn dành sự quan tâm nhiều hơn đối với bạn khi luôn chia sẻ; đưa ra các giải pháp dựa trên kinh nghiệm sống của họ. 

Ngược lại cũng có một số Trainer chỉ cần xem bài giảng người khác thiết kế sẵn rồi dạy lại. Điều này sẽ làm giảm đi tính hiệu quả, sự tương tác các kiến thức. Do vậy mà Trainer mãi chậm dân với lối dẫn dắt cũ, lượng kiến thức cũng dần trở vào quên lãng.

Vận dụng kiến thức từ việc Training

Giá trị thật sự của việc đào tạo không đơn thuần chỉ dừng lại ở việc truyển tải – tiếp thu; dẫn dắt, định hướng – thực hành; mà điều quan trọng, bạn phải cảm nhận được sự thay đổi. Đó là những hiệu quả thực tế từ việc vận dụng các bài học vào công việc, lĩnh vực mà bạn theo đuổi. Điều đó không phải ai cũng có thể làm được. Và đó được xem là một thách thức lớn đấy!

Bạn hiểu gì về giá trị của mô hình Đào tạo -Training?

Đối với doanh nghiệp, việc training sẽ giúp công ty sàng lọc nhân sự, làm căn cứ để đánh giá chất lượng nhân viên thử việc. Từ đó đưa ra quyết định tuyển dụng chính thức. 

Ngoài ra, training còn là cơ sở để các chuyên gia nhân sự đánh giá được mức độ phát triển của từng nhân viên thông qua hiệu suất thực tế được chính nhân viên áp dụng vào công việc sau khóa đào tạo.

Xem thêm: 5 lưu ý để viết đánh giá hiệu suất của bạn

training

Đối với nhân viên, quá trình đào tạo được xem như một cơ hội để bạn thể hiện hết những tiềm năng của mình. Training mang lại cho nhân viên sự trải nghiệm thực tế. Do vậy, họ cần hiểu và chứng minh được thực lực của.

Các hệ giá trị được xem xét dựa trên: khả năng tiếp thu, tính sáng tạo chủ động, sự kết nối với đồng nghề nghiệp,… Chúng đều là những tiêu chí để nhà lãnh đạo cân nhắc việc đào tạo và phát triển bạn nhiều hơn. Hơn hết, training sẽ giúp bạn tự thúc đẩy bản thân phấn đấu để chạm đến gần hơn với sự thăng tiến trong sự nghiệp.

Tại sao khó áp dụng chúng vào thực tế?

Việc học các kỹ năng, kiến thức có thể không quá khó khăn. Tuy vậy, việc hoàn thành khóa học và làm thế nào để áp dụng chúng vào công việc thực tiễn mới là điều quan trọng.

training

Những chia sẻ từ các Trainer đa phần do trải nghiệm thực tế của chính họ. Bản thân họ cũng đã cố gắng xây dựng cách truyền tải sao cho đảm bảo tính cân bằng giữa yếu tố khách quan và cái tôi cá nhân. Tuy vậy, không phải chúng đều là những trải nghiệm tồn tại trong một bối cảnh cụ thể đồng thời được đảm bảo trong một điều kiện khá lý tưởng hay sao?

Thực tế lại hoàn toàn khác và mọi thứ chỉ mang tính tương đối. Không có một quy chuẩn chung để áp dụng chúng vào hoàn cảnh của mỗi người.

Thế nhưng, bạn đừng quá lo lắng. Mỗi cuộc training đều mang đến sự thay đổi lớn về nhận thứcmột ít hành vi nếu bản thân bạn cố gắng thực hành nó. Tất nhiên, bạn cần đảm hiểu rõ về những gì mình được tiếp thu. Vấn đề còn lại chỉ là sự trải nghiệm của bạn. Các giá trị bạn rút ra được sau khóa đào tạo mới chính là tài sản riêng của bạn. 

Lời kết

Việc học tập, trải nghiệm và việc thực hành hiệu quả là hai việc cần phải song hành cùng nhau. Tuy nhiên, bạn đừng quá đặt nặng vấn đề đạt hiệu quả để rồi “đốt cháy giai đoạn”. Mọi thứ cần có thời gian. Điều quan trọng là bạn phải thật cố gắng, sẵn sàng thích nghi. TopDev hi vọng, bạn sẽ có những sự lựa chọn tốt nhất cho quá trình training của mình.

Có thể bạn quan tâm

Xem thêm Top Việc làm ngành it trên TopDev

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Một môi trường phát triển tốt là điều cần thiết cho mọi lập trình viên. Cho dù bạn đang phát triển các ứng dụng web mới nhất hoặc học ngôn ngữ lập trình lần đầu tiên, thì môi trường bạn sử dụng phải thuận tiện và dễ sử dụng.

IDE (Integrated Development Environment) được thiết kế để giúp việc lập trình trở nên dễ dàng hơn cho các nhà phát triển. Hầu hết chúng là các chương trình ngoại tuyến được cài đặt trên ổ cứng của máy tính.

  Bài học cho các Developer sau lỗi bug video từ Facebook
  8 video game giúp bạn lập trình web tốt hơn

Nhiều IDE dựa trên trình duyệt phù hợp để lập trình trên đám mây. Hầu hết các công cụ trong số này có những hạn chế khi so sánh với những đối thủ ngoại tuyến, nhưng chúng đang dần cải thiện theo thời gian. Bất kể bạn định làm gì, đều có một IDE phù hợp cho hầu hết mọi mục đích sử dụng.

1. IDE trực tuyến chuyên nghiệp tốt nhất: AWS Cloud9

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Khi Amazon mua IDE Cloud9 vào năm 2016, nó đã được các nhà phát triển yêu thích. Việc tích hợp đầy đủ với Amazon Web Services khiến nó được cho là nền tảng phát triển trực tuyến mạnh mẽ và có thể mở rộng nhất hiện có. IDE trực tuyến kết hợp trình soạn thảo code với terminal và các công cụ gỡ lỗi mạnh mẽ.

Cloud9 cũng có chế độ lập trình theo cặp tương tự như VS Live Share cho phép lập trình cộng tác từ xa theo nhóm. Nếu cần tạo mẫu nhanh, Cloud9 cung cấp cho bạn quyền truy cập trực tiếp vào những AWS service thông qua hỗ trợ terminal tích hợp.

>>> Xem thêm: Codepen là gì ? Hướng dẫn sử dụng Codepen cơ bản

2. IDE trực tuyến miễn phí tốt nhất: CodeTasty

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

CodeTasty là một IDE đầy đủ tính năng trên đám mây, được thiết lập nhanh chóng và đơn giản.

Tất cả các ngôn ngữ chính đều được hỗ trợ, cùng với linting (kiểm tra lỗi mã nguồn) và transpiling (chuyển mã nguồn từ ngôn ngữ này sang một ngôn ngữ khác, với điều kiện 2 ngôn ngữ có cùng cấp độ trừu tượng hóa) cho Typescript, v.v… Bản thân trình soạn thảo này là một môi trường phát triển ảo hoàn chỉnh với các cửa sổ terminal và đầu ra. CodeTasty là công cụ miễn phí và đầy đủ chức năng. Bên cạnh đó, các tùy chọn trả phí cũng có sẵn cho nhiều tùy chọn dự án và hợp tác nhóm.

3. IDE trực tuyến tốt nhất cho người mới bắt đầu: Codeacademy

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Codecademy kết hợp một IDE trực tuyến với những bài học để dạy lập trình cho mọi đối tượng, từ người mới bắt đầu đến các chuyên gia. Danh mục đa dạng của công cụ này bao gồm các ngôn ngữ phổ biến như Python, JavaScript, CSS, HTML và Ruby.

Bên cạnh việc học ngôn ngữ, Codeacademy cung cấp những khóa học trả phí chuyên sâu Pro và Pro Intensive, được thiết kế để bao quát toàn bộ các môn học. Các khóa học cho chuyên gia về machine learning, phát triển theo hướng kiểm thử (Test Driven Development) và phát triển web front end chỉ là một số trong đó.

4. IDE trực tuyến tốt nhất dành cho nghệ sĩ: p5.js

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Thư viện p5.js dựa trên JavaScript và cung cấp các công cụ để tạo những tác phẩm nghệ thuật tương tác thông qua code. Thay vì cài đặt thư viện và chạy máy chủ cục bộ, trình soạn thảo web p5.js cho phép bạn viết code trực tuyến ngay lập tức.

Cùng với việc tạo ra hình ảnh đẹp mắt, thư viện p5.js mang đến cơ hội tương tác.

5. IDE trực tuyến tốt nhất cho Python: Codevny

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Một IDE Python trực tuyến cần phải nhanh chóng, dễ sử dụng và có một terminal để thử nghiệm. Codenvy cung cấp tất cả những điều này và nhiều thứ khác nữa. Mỗi phiên bản của IDE này là một môi trường phát triển độc lập.

Các gói và mô-đun bổ sung có thể được cài đặt bằng cách sử dụng terminal trực tuyến. Codenvy là một công cụ cộng tác và phát triển mạnh mẽ, mang trong mình tiềm năng của hầu hết các hình thức phát triển hiện đại.

6. IDE trực tuyến tốt nhất cho JavaScript: JSFiddle

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Nếu bạn đang loay hoay với JavaScript, hãy dùng thử JSFiddle, với các dự án mẫu để giúp nhanh chóng đưa ra ý tưởng về ứng dụng web của bạn.

JSFiddle hoàn toàn miễn phí (được hỗ trợ quảng cáo) và được sử dụng bởi những “gã khổng lồ” như Google và Facebook cùng với hàng ngàn nhà phát triển.

7. IDE trực tuyến tốt nhất cho người dùng GitHub: Gitpod

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Mặc dù khái niệm về IDE GitHub ban đầu có vẻ lạ, nhưng lại mang rất nhiều ý nghĩa. Gitpod tồn tại như một cách để chỉnh sửa các file trên GitHub trong trình duyệt. Tiện ích mở rộng trình duyệt thêm một nút vào trang GitHub, khi được nhấp sẽ mở ra một không gian làm việc cho dự án hiện tại.

Việc chỉnh sửa diễn ra trong một IDE dựa trên VS Code. Tính năng so sánh code song song cũng được tích hợp cùng với khả năng nhận xét, rất phù hợp cho việc cộng tác trong một nhóm. Gitpod là một ý tưởng độc đáo và hiện đang trong giai đoạn beta miễn phí.

8. IDE trực tuyến tốt nhất cho Ruby và Ruby on Rails: Repl.it

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Ruby giữ một vị trí đặc biệt trong trái tim của nhiều lập trình viên. Nó rất dễ đọc, súc tích và là xương sống cho nền tảng Ruby on Rails thời thượng. Một IDE trực tuyến cho Ruby nên đơn giản và có tính thẩm mỹ cao. Repl.it có môi trường cho cả Ruby và Ruby on Rails. Đây là nơi hoàn hảo để nâng cao kỹ năng của bạn.

9. IDE trực tuyến tốt nhất dành cho nhà thiết kế: Codepen.io

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Nếu muốn làm những thứ đẹp mắt cho web, Codepen.io là nơi dành cho bạn. IDE hoạt động như một sketchbook cho tất cả các loại phát triển web front end. Một cộng đồng lớn gồm tất cả các cấp độ kỹ năng liên tục đẩy cao giới hạn của những gì có thể đạt được trong trình duyệt.

Bản tin Spark hàng tuần là nơi tập hợp những cây bút tốt nhất trong tuần cùng với podcast Codepen Radio. Bên cạnh cộng đồng của mình, Codepen còn có nhiều tính năng tuyệt vời khác dành cho các lập trình viên và nhà phát triển web.

10. IDE lập trình trực tuyến tốt nhất cho trẻ em: Small Basic

Bắt đầu viết code là điều khó khăn với trẻ em. Small Basic bao gồm một trình soạn thảo trực tuyến thân thiện với trẻ em. Ngôn ngữ có thể đọc được nhưng vẫn gần giống với code thực tế để thực sự mang lại lợi ích.

Thư viện đi kèm bao gồm bản vẽ, đầu vào văn bản, âm thanh và thậm chí một số mạng cơ bản. Tham khảo thêm: Top 5 ngôn ngữ lập trình tốt nhất cho trẻ em hiện nay để biết thêm chi tiết.

11. IDE dựa trên block tốt nhất cho trẻ em: Tynker

Phụ huynh và những đứa trẻ có thể cùng học với nền tảng dựa trên block Tynker. Có nhiều khóa học miễn phí có sẵn để dùng thử dịch vụ, nhưng việc trả tiền thuê bao $7,5 (175.000VND) hàng tháng sẽ giúp bạn có được nhiều thứ hơn. Tynker có một thư viện rộng lớn các khóa học lập trình, game, phần cứng và Minecraft cho những bé từ 7 tuổi trở lên.

12. IDE trực tuyến tốt nhất cho Arduino/IoT: Arduino Web Editor

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

Có lẽ không có gì đáng ngạc nhiên, nơi tốt nhất để lập trình cho các bo mạch Arduino trực tuyến là Arduino Web Editor. Mặc dù vẫn còn rất mới, nhưng nó hoạt động giống như IDE ngoại tuyến. Bên cạnh trình chỉnh sửa code, trình quản lý thư viện và trình giám sát nối tiếp cũng có sẵn trong trình duyệt.

Hiện tại, chỉ có hỗ trợ cho các bo mạch Arduino chính thức và một số ít tùy chọn khác, tuy nhiên sẽ có nhiều hỗ trợ hơn trong tương lai. Một lưu ý về IDE này là cần phải tải xuống một chương trình bridge nhỏ để truy cập các cổng USB và upload code.

13. IDE trực tuyến tốt nhất để lập trình phần cứng trực quan: XOD.io

13 IDE trên trình duyệt tốt nhất mọi lập trình viên nên biết

XOD là một chương trình trực quan dựa trên node, mã nguồn mở cho các bo mạch Arduino. Mỗi block đại diện cho các thiết bị và cảm biến. Bạn có thể tạo liên kết giữa chúng bằng cách kéo các dòng từ mỗi node.

Thư viện đi kèm với nhiều node cho những mục đích sử dụng khác nhau và bộ sưu tập các node thu gọn thành những node mới để block gọn gàng và dễ đọc.

Thật không may, phiên bản trình duyệt của XOD không hỗ trợ upload lên bo mạch trực tiếp. Tuy nhiên, có một chế độ Simulate sẽ kiểm tra chương trình mà không cần bo mạch kết nối.

Nhiều IDE trong danh sách này có khả năng thực hiện gần như mọi thứ mà một lập trình viên yêu cầu. Tuy nhiên, hầu hết đi kèm với một số hạn chế. Nhiều tùy chọn có chi phí đăng ký và tất cả đều yêu cầu kết nối liên tục với Internet để hoạt động đúng cách.

Các IDE ngoại tuyến có sự tiện lợi khi không yêu cầu kết nối Internet, và nhiều tùy chọn, bao gồm Microsoft Visual Studio hay VS Code, rất mạnh mẽ và miễn phí.

Chúc bạn tìm được lựa chọn phù hợp!

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

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

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