Home Blog Page 147

Micro frontend tại sao và như thế nào?

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

Tại sao bạn cần biết đến Micro frontend

Vấn đề cần giải quyết:

  • Ứng dụng càng lúc càng phình ra về quy mô, cũng như độ phức tạp
  • Một codebase FE duy nhất mà muốn maintain thì chỉ có gặp ác mộng hằng đêm
  • Bạn có nhiều team FE khác nhau, mỗi team chỉ làm việc chính trên một phần tính năng nào đó rất cụ thể, chỉ 1 codebase mà hơn 5 team vào làm việc trên đó thì thôi xong
  • Bạn muốn có 1 codebase viết bằng typescript, một codebase viết js, một feature được build bằng React, feature khác được build Vue

Micro frontend là cái gì

Đây là cách tiếp cận cũng na ná như microservice, thay vì 1, chúng ta có nhiều codebase, và trên từng codebase chỉ quản lý một tính năng cụ thể mà thôi.

Có thể xem một ứng dụng web là một bộ kết hợp của nhiều tính năng, mỗi một tính năng như vậy được quản lý bởi một team

Micro frontend tại sao và như thế nào?

Thuật ngữ này được giới thiệu lần đầu vào 2016 bởi Thourghtworks Tech Radar

An architectural style where independently deliverable frontend applications are composed into a greater whole

Micro frontend tại sao và như thế nào?

Một cách trực quan hơn bạn có thể tham khảo hình sau

Micro frontend tại sao và như thế nào?

Còn đây là demo của trang microfrontends.com https://demo.microfrontends.com/

Nhiều công ty tuyển dụng Frontend Developer đãi ngộ tốt, ứng tuyển ngay!

Hiện thực hóa như thế nào?

Để có thể hiện thực hóa hoàn chỉnh micro frontend sẽ bao gồm rất nhiều thứ, ở đây chỉ tóm tắt một số vấn đề cơ bản cần giải quyết

Tương tác giữa các ứng dụng

Một câu hỏi được đặt ra đầu tiên là nếu tách ra thành nhiều bộ source như vậy, làm sao chúng có thể nói chuyện được với nhau? Một cách tổng quát, nên hạn chế việc trao đổi thông tin qua lại ít chừng nào tốt chừng đó, bởi vì nếu bạn làm ngược lại, nghĩa là bạn đang lặp lại vấn đề chúng ta muốn giải quyết ngay từ đâu: decoupling các tính năng với nhau.

Nhưng việc trao đổi giữa các ứng dụng với nhau là không tránh khỏi và cần thiết, chúng ta chỉ tiết chế chứ không loại bỏ hết, Custom event là một cách, cách khác, lấy mô hình truyền callback và data từ trên xuống trong React để làm kênh trao đổi thông tin, làm như thế nó sẽ rất tường minh, cách thứ 3 là thông qua thanh đường dẫn trên trình duyệt, chút nữa nói kỹ hơn.

Tựa chung, chúng ta không share state, mà chỉ share dữ liệu trong database như microservice.

Thư viện component dùng chung

Nó chung, ý tưởng re-use lại những component UI không có gì mới, nghe cũng rất hợp lý, mặc dù ai cũng biết việc đó khó làm.

Sai lầm thường thấy là việc tạo các component như vậy quá sớm, việc hào hứng quá mức vào xây dựng một Framework UI chuẩn không cần chỉnh, viết một lần xài mãi mãi, thống nhất giao diện trên mọi mặt trận là điều thường thấy ở mọi team. Tuy nhiên, trong thực tế, kinh nghiệm cho biết rằng việc đó rất khó, nếu không muốn nói là không thể, không thể ngồi nghĩ ra một bộ Framework với tất cả các API cần thiết rồi đưa cho tất cả các team xài, chắc gì API đó đã đáp ứng đúng nhu cầu cho tất cả các team? Lời khuyên là các team cứ tạo ra những component riêng trong codebase nếu họ thấy cần, dù cho nó có bị duplicate đây nữa cũng chẳng sao. Và khi đã chín mùi, những API nào cần thiết sẽ hiện nguyên hình, chúng ta đưa những cho đang bị duplicate vào trong thư viện dùng chung.

Tất nhiên cũng có những ngoại lệ, những component mà nhìn vào chúng ta biết ngay là cần đưa vào share component, như icon, label, button, autocomplete, drop-down, search, table. Và nhớ là chỉ đưa đúng UI logic, đừng đưa bất kỳ business logic và domain logic vào đây. Ví dụ như một component ProductTable cho riêng cái domain Product là không nên, chỉ nên làm một cái component Table.

Thoạt nghe làm một share component có vẻ đơn giản, nhưng nó lại là công việc đòi hỏi kỹ thuật phải rất cứng tay, và người có nhúng tay vào tất cả các team.

  Fluent Design – Ngôn Ngữ Thiết Kế Mới Của Microsoft
  9 dự án mới nhất giúp bạn thành trùm Frontend trong năm 2024

Styling

Styling 2020 là một câu chuyện dài, như mình đã kể trong một bài viết, tựa chung mà nói bạn có thể dùng BEM, dùng SASS, dùng CSS module, dùng CSS-in-JS, dùng Styled Component, dùng Tailwind, kiểu gì cũng được, miễn đảm bảo được style không chồng chéo lên nhau, thằng nào độc lập thằng đó, và tự tin đoạn code nó sẽ chạy như đúng như lường trước.

Các cách để integrate

Để hiện thực hóa ý tưởng của micro frontend, cũng có nhiều cách làm, cách nào cũng có đánh đổi. Tựu chung, nếu xét theo hướng giao diện, chúng ta có thể tổ chức nó theo dạng một ứng dụng dạng container, bao gồm những thành phần chung như headermenu, và các micro frontend sẽ nhúng vào phần ruột của trang

Micro frontend tại sao và như thế nào?

Cách 1: composition dùng server side template

Với một cách không chính thống lắm cho việc phát triển code FE, chúng ta render HTML ở phía server, với nhiều bộ template khác nhau. Chúng ta có một file index.html với các phần tử chung, server sẽ quyết định phần ruột trả về cho từng trang

<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Feed me</title>
  </head>
  <body>
    <h1> Feed me</h1>
    <!--# include file="$PAGE.html" -->
  </body>
</html>

Ở ví dụ này đang dùng với Nginx, biến $PAGE sẽ ứng với URL đang được request

server {
    listen 8080;
    server_name localhost;

    root /usr/share/nginx/html;
    index index.html;
    ssi on;

    # Redirect / đến /browse
    rewrite ^/$ http://localhost:8080/browse redirect;

    # Dùng HTML nào để insert dựa vào URL
    location /browse {
      set $PAGE 'browse';
    }
    location /order {
      set $PAGE 'order';
    }
    location /profile {
      set $PAGE 'profile'
    }

    # Cho phép render ở index.html
    error_page 404 /index.html;
}

Kỹ thuật này mình không nắm lắm, nên cũng chỉ để đây cho các bạn tham khảo, trong thực tế mình gặp và làm việc với những cách làm bên dưới nhiều hơn.

Integrate lúc build

Cách này sẽ publish cái micro frontend ở dạng package, container sẽ khai báo những micro frontend này ở dạng dependency. File package.json nó sẽ trông như thế này:

{
  "name": "@feed-me/container",
  "version": "1.0.0",
  "description": "A food delivery web app",
  "dependencies": {
    "@feed-me/browse-restaurants": "^1.2.3",
    "@feed-me/order-food": "^4.5.6",
    "@feed-me/user-profile": "^7.8.9"
  }
}

Thoạt nhìn, cũng khá hợp lý, tuy nhiên nếu để ý, bạn sẽ thấy chúng ta phải re-compile và release trên từng cục dependency, rồi sao đó lại phải release tiếp container. Đây vẫn không phải là cách làm được khuyến khích.

Integrate lúc run-time bằng iframe

Đây cũng là cách mà dự án mình đang dùng, một cách tiếp cận đơn giản nhất để compose nhiều ứng dụng với nhau trong trình duyệt đã có từ rất rất lâu. Lợi ích có thể kể thêm của cách làm này là phần styling và biến global đều độc lập và không bị đụng độ lẫn nhau

<html>
  <head>
    <title>Feed me!</title>
  </head>
  <body>
    <h1>Welcome to Feed me!</h1>

    <iframe id="micro-frontend-container"></iframe>

    <script type="text/javascript">
      const microFrontendsByRoute = {
        '/': 'https://browse.example.com/index.html',
        '/order-food': 'https://order.example.com/index.html',
        '/user-profile': 'https://profile.example.com/index.html',
      };

      const iframe = document.getElementById('micro-frontend-container');
      iframe.src = microFrontendsByRoute[window.location.pathname];
    </script>
  </body>
</html>

Nhược điểm của cách này là việc tích hợp giữa các phần của ứng dụng, như route, history, deep-link sẽ rất phức tạp, responsive cũng sẽ gặp nhiều vấn đề cần xử lý hơn.

Integrate lúc run-time bằng JavaScript

Đây là cách linh hoạt nhất, và được nhiều team chọn làm. Mỗi một micro frontend sẽ được nhét vào trong trang bằng thẻ <script />. Container sẽ làm nhiệm vụ cho mount micro frontend nào và thực thi các hàm liên quan để báo cho các micro frontend sẽ render ở đâu và khi nào.

<html>
  <head>
    <title>Feed me!</title>
  </head>
  <body>
    <h1>Welcome to Feed me!</h1>

    <!-- Nó không render bất cứ gì cả -->
    <!-- Nó sẽ đưa vào hàm entry-point vào `window` -->
    <script src="https://browse.example.com/bundle.js"></script>
    <script src="https://order.example.com/bundle.js"></script>
    <script src="https://profile.example.com/bundle.js"></script>

    <div id="micro-frontend-root"></div>

    <script type="text/javascript">
      // Những global function này được nhét vào window bằng các đoạn script include ở trên
      const microFrontendsByRoute = {
        '/': window.renderBrowseRestaurants,
        '/order-food': window.renderOrderFood,
        '/user-profile': window.renderUserProfile,
      };
      const renderFunction = microFrontendsByRoute[window.location.pathname];

      // Sau khi đã có các hàm cần thiết,
      // đưa id của element sẽ dùng để render
      renderFunction('micro-frontend-root');
    </script>
  </body>
</html>

Trên đây chỉ là ví dụ cơ bản nhất để mô tả kỹ thuật sẽ làm, thật tế có thể phải thêm thắt một số thứ khác. Không giống với cách integrate lúc build, bundle.js có thể được deploy một cách độc lập. Và khác iframe, chúng ta có thể linh động chọn lựa việc render micro frontend nào chúng ta thích.

Nếu có hứng thú với cách làm này, có thể tham khảo thêm ví dụ chi tiết hơn

Integrate lúc run-time bằng Web Component

Một lựa chọn khác cũng tương tự như cách làm trên, mỗi một micro frontend sẽ được link với element

<html>
  <head>
    <title>Feed me!</title>
  </head>
  <body>
    <h1>Welcome to Feed me!</h1>

    <!-- Chưa render gì cả -->
    <script src="https://browse.example.com/bundle.js"></script>
    <script src="https://order.example.com/bundle.js"></script>
    <script src="https://profile.example.com/bundle.js"></script>

    <div id="micro-frontend-root"></div>

    <script type="text/javascript">
      // Những element type này được định nghĩa ở các script trên
      const webComponentsByRoute = {
        '/': 'micro-frontend-browse-restaurants',
        '/order-food': 'micro-frontend-order-food',
        '/user-profile': 'micro-frontend-user-profile',
      };
      const webComponentType = webComponentsByRoute[window.location.pathname];

      // Tạo instance và đưa vào document ứng với từng loại phù hợp
      const root = document.getElementById('micro-frontend-root');
      const webComponent = document.createElement(webComponentType);
      root.appendChild(webComponent);
    </script>
  </body>
</html>

Khác nhau duy nhất so với cách trên có lẽ chỉ là việc dùng web component thay vì một interface chúng ta tự định nghĩa.

Trao đổi giữa Backend

Cái này chưa biết, không dám chém.

Kết

Micro frontend có thể không lạ với một số người và khá mới với số còn lại, thực tế mà nói đã có rất nhiều dự án đang áp dụng kiến trúc này (dự án mình đang làm).

Cùng hy vọng với bài viết này bạn đã thấy công việc của những lập trình viên frontend không còn đơn thuần là việc làm sao cho trang web bay, lượn, responsive mượt mà, nếu bạn muốn tiến xa hơn, giới hạn là chân trời.

Các bài viết đã tham khảo

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

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

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

Junior là gì? Yếu tố để cạnh tranh trong “cuộc chơi tuyển dụng”?

Cuộc chơi tuyển dụng đã không còn là còn là sự cạnh tranh ngầm giữa những nhà tuyển dụng. Trong thời đại 4.0, các ứng viên cần nắm bắt được đâu là đâu là điều mà các nhà tuyển dụng tìm kiếm. Junior – một thuật ngữ chuyên ngành mô tả những ứng viên tiềm năng trong từng lĩnh vực tương ứng đã ra đời.

Vậy Junior là gì? Những tố chất nào một Junior cần sở hữu để tạo ra lợi thế trong hành trình tìm việc? Cùng TopDev theo dõi bài viết sau để thấy rõ những vấn đề được đề cập.

Junior là gì?

Tương tư như Senior, Internship hay Fresher, Junior là thuật ngữ được sử dụng để phân chia trình độ trên cơ sở thời gian, kinh nghiệm làm việc. Chúng đều là những thuật ngữ đã được quy ước trong giới hạn phạm vi doanh nghiệp; một ngành nghề hoặc một lĩnh vực nào đó.

  Junior developer là gì? Những quy tắc bất biến giành cho Junior developer
Junior là gì
Junior là gì?

Cụ thể, Junior là những người mới vào nghề, có ít kinh nghiệm hơn. Họ thường được phân công giải quyết những vấn đề khá đơn giản, không đòi hỏi quá nhiều về chuyên môn. Đối với một số nhiệm vụ (task) phức tạp, họ cần sự hỗ trợ từ những người có kinh nghiêm hơn.

Hãy bắt đầu từ một Junior! Đó là cách tốt nhất để bạn hoàn thiện bản thân từng ngày. Vì điều quan trọng nhất đối với một Junior chính là sự trải nghiệm và học hỏi.

Trong lĩnh vực IT, một Junior Developer là những newbie về công nghệ. Hoặc họ chỉ biết những khía cạnh đơn giản dựa trên nền tảng lý thuyết. Và khi nhìn nhận về góc độ ứng dụng thực tế, họ chưa có nhiều trải nghiệm. Việc của họ trong giai đoạn đầu là học thêm về công nghệ, tìm hiểu về các cấu trúc dự án; rèn luyện và hoàn thiện kỹ năng code từ các senior.

Những yếu tố giúp Junior cạnh tranh trong “cuộc chơi tuyển dụng”

Rất nhiều yếu tố có thể chi phối đến bản thân mỗi Junior. Trong giời hạn bài viết TopDev chỉ ra 2 yếu tố nổi bật sau đây:

Khả năng học hỏi và sự thích ứng

Đối với nhà tuyển dụng, điều họ cần tìm kiếm ở ứng viên Junior là khả năng học hỏi các kiến thức. Đồng thời, sự thích ứng ở một môi trường mới cũng là một yếu tố rất được quan tâm. Nó là cơ sở thúc đẩy Junior tự phấn đấu, trở thành phiên bản tốt hơn mỗi ngày. 

Khả năng học hỏi có thể hiểu là cách ứng viên sẵn sàng tiếp nhận các kiến thức; tự trang bị những kỹ năng cần thiết liên quan đến vị trí Junior tương ứng ngành nghề thuộc nhóm lĩnh vực mình theo đuổi. Cùng với đó, khả năng thích ứng không đơn thuần là linh động làm việc với môi trường, bạn cần phải rèn luyện các kỹ năng khác như: giao tiếp, thiết lập mối quan hệ (networking), làm việc nhóm (teamwork),…

Junior là gì

Chẳng hạn, bạn là một ứng viên ứng tuyển cho vị trí Junior Developer. Kiến thức chuyên môn là điều đầu tiên bạn cần có. Đừng phô bày thành thích qua điểm số! Nhà tuyển dụng chỉ xem xét bạn giải quyết những vấn đề đơn giản hay không. Tiếp theo là phải biết viết code và tối thiểu, code chạy thành công. Kỹ năng quản lý và xử lý – fix bug nhỏ cũng là một kỹ năng cần thiết.

Tất nhiên, nhà tuyển dụng sẽ có những đánh giá chính xác hơn về kiến thức chuyên môn, kỹ năng mềm lẫn tiềm năng phát triển của bạn thông qua buổi phỏng vấn. Nếu may mắn được chọn, hãy chắc chắn rằng bạn có trách nhiệm với công việc.

  Senior là gì? Phân biệt Senior và Junior thật chi tiết

Xây dựng hình ảnh thương hiệu tốt thông qua CV

Trước khi có cơ hội trải nghiệm phỏng vấn, liệu bạn đã biết cách tạo thu hút thông qua CV chưa? 

CV là tấm vé giúp bạn đến gần hơn với nhà tuyển dụng. Do vậy, hãy dành thời gian để đầu tư cho nó. Một chiếc CV chỉn chu, đảm bảo đúng nội dung lẫn hình thức visual sẽ tạo ra thiện cảm đặc biệt.

Đồng thời, viết CV giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.

Tạo CV chuẩn dành cho IT ngay tại TopDevJunior là gì

Qua CV, nhà tuyển dụng cũng đánh giá được một phần ứng viên:

1. Kỹ năng trình bàyviết CV của bạn có tốt hay không? Bạn đã thật sự quan tâm đến việc tạo dấu ấn cá nhân? Từ cơ sở này, họ sẽ đánh giá sơ bộ về khả năng làm việc, tính trách nhiệm của bạn với công việc.

2. Mục tiêu nghề nghiệp, kỹ năng – kinh nghiệm, cá tính riêng. Bạn đã thể hiện mình vừa đủ hay quá mức? Khó có thể nhìn nhận khả năng thật sự của một ứng viên thông qua CV. Nhưng cách bạn trình bày, sắp xếp nội dung và tổ chức bố cục sẽ thể hiện tất cả. 

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

Lời kết

Hãy tìm hiểu và trang bị cách thức viết CV đúng chuẩn. CV cần thể hiện chân thật những gì bạn có. Có rất nhiều tip về việc viết CV, điều quan trọng là bạn nên thông mình trong việc lựa chọn thông tin phù hợp. Điều này sẽ phản ánh các kỹ năng chọn lọc, phân tích và trình bày vấn đề của bạn.

Hãy nhớ, mọi thứ bạn thực hiện đều có những ý nghĩa riêng tác động đến kết quả ứng tuyển.

Junior là vị trí có phạm vi tuyển dụng rộng lớn. Nếu là một sinh viên ra trường, bạn không sợ không tìm kiếm được việc. Nếu là những người có trải nghiệm lâu năm và muốn nhảy việc, ít ra bạn vẫn tự tin vì các lợi thế sẵn có. Điều quan trọng là bạn có nhận ra được những gì mình còn thiếu sót hay không? Từ đó, thiết lập kế hoạch rèn luyện mình.

TopDev hy vọng bài viết đã có những phân tích cụ thể, giúp bạn đọc hiểu được khái niệm Junior là gì và nắm bắt được đâu là những yếu tố nổi bật giúp một Junior đủ sức cạnh tranh trên một sân chơi nghề nghiệp. Dù bạn ứng tuyển trong lĩnh vực nào, hãy chuẩn bị thật kỹ lưỡng các kỹ năng tương ứng. Chúc các bạn thành công!

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

Xem thêm Tìm việc làm IT trên TopDev

Cân bằng công việc chính với dự án ngoài liệu có khó không?

Tác giả: Catalin Pit

Khi đang có một công việc toàn thời gian bạn khó có thể dành quá nhiều thời gian cho các dự án ngoài. Mình cố gắng duy trì các tài khoản mạng xã hội luôn active, dành thời gian  viết blog và thỉnh thoảng đăng tải các video lên YouTube nữa. Vậy nên đã có nhiều người hỏi rằng làm thế nào mình cân bằng được mọi thứ như thế?

  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

  20 trường hợp sử dụng lệnh Docker cho developer

Trước và sau giờ làm việc hành chính

Để bắt kịp mọi thứ, mình tranh thủ dậy sớm, chẳng hạn nếu bắt đầu làm việc lúc 9 giờ sáng, mình sẽ thức dậy lúc 6 giờ 45. Khoảng thời gian 2 tiếng dư ra trước giờ đi làm mình có thể làm thêm các việc khác. Đương nhiên là lịch trình này không cố định mà phụ thuộc vào nhiều yếu tố khác. Nhưng mình luôn cố gắng làm việc ít nhất 1 đến 2 tiếng trước khi đi làm, vì buổi sáng là lúc mình tràn đầy năng lượng nhất.

Làm sao để cân bằng giữa công việc chính với các dự án ngoài?

Vậy mình làm gì trong khoảng thời gian đó? Mình bắt đầu bằng việc kiểm tra thông báo trên các tài khoản mạng xã hội và lên lịch sẵn cho các nội dung trong ngày. Sau đó, dành toàn bộ thời gian còn lại để học thi chứng chỉ AWS – Amazon Web Services. Mất khoảng 1 tiếng rưỡi để mình tìm hiểu về các service mới cũng như thực hành một số bài tập của AWS. Sau khoảng thời gian này mình sẽ dành 8 tiếng cho công việc chính ở công ty.

Xem thêm Chuỗi chuyên đề độc quyền về Serverless từ Amazon Web Services

Khi có nhiều năng lượng hơn bình thường hoặc có thời gian rảnh rỗi, mình sẽ làm thêm các dự án phụ – side project bên ngoài sau giờ làm việc, nhưng thường giới hạn thời gian tối đa để làm là 1 tiếng. Sau khi đã làm việc 8 tiếng, mình cũng không cố quá để học thêm kiến thức gì mới, vì lúc này đã khá đuối sức và năng lực tập trung không còn nhiều nữa. Khi dành thời gian cho các dự án phụ sau giờ làm, chủ yếu là mình xây dựng nội dung cho cả mạng xã hội, blog và video YouTube vì nó giúp mình cảm thấy thư giãn hơn.

Lên lịch cho nội dung

Khi làm việc ở công ty bạn không thể lên nội dung hay online thường xuyên trên mạng xã hội, vậy nên mình phải lên lịch cho nội dung trước trong ngày. Với các bài đăng trên mạng xã hội thì mình hay tranh thủ những lúc nghỉ ngơi để post bài.

Riêng với blog và video YouTube mình phải dành nhiều thời gian hơn để nghiên cứu và sáng tạo nội dung sao cho hấp dẫn nhất, nên riêng nội dung cho 2 phần này mình phải làm trước hoặc sau khi đi làm ở công ty. Thông thường thì sẽ làm vào buổi sáng hoặc trước một ngày phát hành.

  Cách thức giúp AI hoạt động hiệu quả cho tổ chức của bạn

Tóm lại để có thể cân bằng 2, 3 công việc cùng lúc mà không bị quá tải mình cần lên kế hoạch làm việc rõ ràng để tránh ảnh hưởng đến việc chính. Với mình thì có thể tóm gọn lại như sau:

  • Thức dậy 2 tiếng trước khi làm việc và dành thời gian đó để lên lịch nội dung và học những thứ mới.
  • Hiếm khi làm thêm sau giờ làm việc hoặc khi đã làm thì thường sẽ là để tạo nội dung trên nhiều nền tảng khác nhau.
  • Lên lịch cho các nội dung của mình để tránh ảnh hưởng đến việc chính.
  • Sử dụng thời gian rảnh rỗi tại nơi làm việc để đăng nội dung trên các tài khoản mạng xã hội.

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

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

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

Constructor trong Java là gì?

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Trong bài viết này, chúng ta sẽ tìm hiểu về constructor của một đối tượng, làm thế nào để tạo ra chúng, sự khác nhau giữa constructor mặc định và constructor do chúng ta định nghĩa và cuối cùng overloaded constructor là gì các bạn nhé!

  10 Java Web Framework tốt nhất
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Định nghĩa constructor

Trong Java, constructor là một phương thức đặc biệt, nó được dùng để khởi tạo và trả về đối tượng của lớp mà nó được định nghĩa. Constructor sẽ có tên trùng với tên của lớp mà nó được định nghĩa và chúng không được định nghĩa một kiểu giá trị trả về.

Ví dụ:

Trong ví dụ trên, chúng ta đã định nghĩa một constructor cho đối tượng Student, như các bạn thấy nó không có kiểu giá trị trả về và tên của nó trùng tên với lớp mà nó được định nghĩa.

Khi một đối tượng được khởi tạo bằng cách gọi constructor của nó với toán tử new thì nó sẽ gọi constructor của lớp cha và tất cả các instance variable sẽ được khởi tạo với giá trị mặc định của nó. Trở lại ví dụ trên thì khi khởi tạo đối tượng Student bằng cách gọi:

thì giá trị của biến age trong đối tượng Student sẽ có giá trị mặc định của kiểu int là 0.

Constructor mặc định

Nếu trong một đối tượng, chúng ta không định nghĩa một constructor nào cả thì mặc định Java sẽ thêm một constructor mặc định vào đối tượng của chúng ta.

Ví dụ, mình định nghĩa đối tượng Student như sau:

Lúc này, mình có thể khởi tạo đối tượng Student bằng cách:

Rõ ràng các bạn thấy, mặc dù mình không định nghĩa bất kỳ constructor nào trong đối tượng Student nhưng mình vẫn có thể khởi tạo đối tượng này.

Constructor mặc định sẽ không chứa bất kỳ tham số nào và khi được gọi để khởi tạo đối tượng, nó cũng gọi constructor của lớp cha và khởi tạo giá trị mặc định cho các instance variable.

Trong trường hợp chúng ta đã định nghĩa một constructor cho đối tượng:

thì Java sẽ không tự động thêm constructor mặc định nữa và khi đó nếu chúng ta cố gắng khởi tạo đối tượng bằng constructor mặc định thì sẽ bị lỗi compile ngay:

Constructor trong Java là gì?

Định nghĩa một constructor

Chúng ta có thể định nghĩa constructor cho một đối tượng bất kỳ, khi đó tất cả các thuộc tính của đối tượng bao gồm các phương thức, các instance variable có thể được gọi tùy theo định nghĩa của chúng ta.

Ví dụ:

Chúng ta có thể sử dụng bốn access modifier để định nghĩa cho một constructor, và do vậy chúng ta có thể giới hạn phạm vi truy cập của đối tượng từ những đối tượng khác.

Điều gì sẽ xảy ra nếu chúng ta định nghĩa một constructor với một kiểu giá trị trả về? Khi đó, Java sẽ coi nó như là một phương thức bình thường chứ không phải là một constructor.

Ví dụ:

Đối tượng Student lúc này chỉ có một constructor mặc định do Java thêm vào mà thôi. Nếu chúng ta khởi tạo đối tượng Student với một tham số name thì sẽ bị lỗi ngay.

Constructor trong Java là gì?

Overloaded constructor

Overloaded constructor là gì? Đó là khi chúng ta định nghĩa nhiều constructor cho một đối tượng và mỗi constructor sẽ có các tham số khác nhau cả về số lượng tham số lẫn kiểu dữ liệu của tham số.

Ví dụ:

Nguyên tắc để định nghĩa overloaded constructor là:

  • Các constructors, như mình đã nói, phải được định nghĩa sử dụng các tham số khác nhau cả về số lượng tham số lẫn kiểu dữ liệu của tham số.
  • Các constructor không được định nghĩa chỉ khác nhau ở access modifier.

Trong trường hợp đối tượng có nhiều constructor và chúng ta muốn gọi constructor này từ constructor khác thì bắt buộc chúng ta phải sử dụng từ khóa this như sau:

Câu lệnh this để gọi constructor khác này bắt buộc phải nằm ở dòng đầu tiên của constructor, nếu nó nằm sau một câu lệnh bất kỳ thì code chúng ta sẽ bị lỗi compile ngay:

Constructor trong Java là gì?

Bài viết gốc được đăng tải tại huongdanjava.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

Database là gì? Các kiểu Database phổ biến và ứng dụng

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Ngày nay, công nghệ thông tin được xem là lĩnh vực đầu thể hiện mức độ phát triển của một quốc gia. Hiện nay, các ứng dụng liên quan thuộc phạm trù công nghệ IT đang rất được quan tâm. Database cũng là một trong những cụm từ phổ biến. Vậy Database là gì? Các mô hình Database phổ biến và ứng dụng cụ thể của mô hình này là gì? Hãy cùng khám phá các câu hỏi trên ngay sau đây.

Việc làm database hấp dẫn không cần kinh nghiệm cho bạn

Database là gì?

Database là từ được sử dụng phổ biến trong các lĩnh vực thuộc công nghệ thông tin, dữ liệu, lập trình và phần mềm… .Database là cơ sở dữ liệu, là một bộ sưu tập dữ liệu được tổ chức bày bản và thường được truy cập từ hệ thống máy tính hoặc tồn tại dưới dạng tập tin trong hệ quản trị cơ sở dữ liệu. Database còn có thể được lưu trữ trên thiết bị có chức năng ghi nhớ như: thẻ nhớ, đĩa cứng, CD…

Database là gì? Các kiểu Database phổ biến và ứng dụng

Database giữ vai trò chủ chốt trong các ứng dụng công nghệ

Vai trò của Database

Database có vai trò vô cùng quan trọng khi làm việc với hệ thống dữ liệu. Chúng giúp người dùng thành công trong việc kết nối các dữ liệu. Người dùng có thể truy cập hệ cơ sở dữ liệu nhanh chóng và dễ dàng hơn. Database chính là cơ sở nguồn để người dùng có thể truy xuất ra những thông tin cần thiết.

 Đặc điểm chính của Database chính là truy xuất ra những thông tin, dữ liệu bằng nhiều phương thức khác nhau. Các nội dung truy xuất được đảm bảo toàn vẹn dữ liệu ở mức độ cao. Đồng thời, nguồn thông tin khi xuất ra hoàn toàn không bị trùng lặp, nếu có thì xác suất cũng rất thấp. Một cơ sở dữ liệu Database cho phép nhiều người dùng đồng thời truy cập trong cùng một thời gian.

Các mô hình Database phổ biến hiện nay

  • Cơ sở dữ liệu Database dạng File: Database dạng File là dạng thường gặp nhất và cũng là mô hình phổ biến nhất hiện nay. Có thể dễ dàng thấy những tập tin, những thông tin được lưu trữ, chia sẻ và truy cập dưới dạng File. Cơ sở dữ liệu dạng File thường gặp nhất chính là *.mdb Foxpro. Bên cạnh đó, cơ sở dữ liệu này còn bao gồm những định dạng khác như text, dạng file ascii, dạng file *.dbf…
  • Cơ sở dữ liệu Database quan hệ: Đây cũng là một trong những mô hình dữ liệu được sử dụng rộng rãi nhất hiện nay. Ở mô hình này, các thực thể khác nhau, tức các nguồn dữ liệu khác nhau sẽ cùng được quy hợp, lưu trữ cùng một bảng dữ liệu và các dữ liệu này phải có quan hệ với nhau. Một vài cơ sở dữ liệu nổi tiếng có hỗ trợ Database quan hệ có thể kể đến như: Oracle, MS SQL Server, MySQL…
  • Cơ sở dữ liệu hướng đối tượng: Hệ cơ sở dữ liệu này cũng là một bảng dữ liệu thuần. Tuy nhiên, Database bổ sung thêm các trường hợp hướng đối tượng khác như: hành vi đối tượng nhằm thể hiện hành vi của đối tượng. Các đối tượng này cũng được phân cấp rất rõ ràng, mỗi cấp được gọi là một lớp dữ liệu. Hiểu một cách đơn giản hơn, chúng là tập hợp các nhóm đối tượng trong cùng một bảng và được thể hiện bằng dòng dữ liệu. Những hệ quản trị cơ sở dữ liệu hỗ trợ Database này bao gồm: MS SQL Server, Postgres, Oracle
  • Database bán cấu trúc: Cơ sở dữ liệu Database bán cấu trúc có thể lưu trữ nhiều dạng dữ liệu khác nhau. Và các thông tin, dữ liệu này thường được lưu trữ dưới định dạng XML. Ở mô hình này, các thông tin mô tả dữ liệu và đối tượng đều được trình bày trong các thẻ tag. Nhờ vào ưu điểm nổi bật này, hệ cơ sở dữ liệu vừa được mở rộng, vừa tiện lợi giúp người dùng có thể dễ dàng truy xuất những thông tin cần thiết. Theo các chuyên gia nghiên cứu, Database bán cấu trúc có thể sẽ là hướng đi mới đầy tiềm năng trong các lĩnh vực ứng dụng công nghệ dữ liệu.
  Database conventions
  26 công cụ và kỹ thuật trong Big Data có thể bạn chưa biết

Ứng dụng của Database

Hệ thống cơ sở dữ liệu đóng vai trò vô cùng quan trong trong thời đại thông tin – kỹ thuật như hiện nay. Chức năng chính của Database có thể kể đến là: lưu trữ, truy xuất và cập nhật dữ liệu cùng nhiều ứng dụng khác.

Database giúp quản lý các dịch vụ bảo mật và phục hồi hệ thống quản trị dữ liệu, giúp thực thi các ràng buộc bên trong hệ cơ sở này. Đồng thời, quản lý và kiểm soát tất cả các máy khách kết nối, truy cập vào hệ thống dữ liệu ở hệ thống nguồn. Hỗ trợ xử lý tất cả các truy cập dữ liệu và các chức năng điều khiển khác.

Ngoài ra, Database còn cung cấp tính năng kiểm soát đồng thời, giúp bảo mật chặt chẽ hơn. Tạo môi trường đa người dùng với điều kiện kết nối an toàn. Nhiều người có thể truy cập đồng thời và truy xuất được những dữ liệu cần thiết

Trên đây là những kiến thức bổ sung về Database cũng như các mô hình hệ thống cơ sở dữ liệu. Đây hứa hẹn là những thông tin vô cùng cần thiết cho những người học tập và ứng dụng công nghệ thông tin. Trong tương lai, hứa hẹn lĩnh vực này sẽ tạo nên một xu hướng phát triển bùng nổ.

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

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

Xem thêm các việc làm IT lương cao hấp dẫn tại TopDev

Viết code dễ đổi, dễ test như thế nào?

Bài viết được sự cho phép của tác giả Nguyễn Việt Hưng

Các lập trình viên chuyển sang code Python từ các ngôn ngữ lập trình khác như Java, C, Golang… thường bắt đầu code bằng việc bật một cái IDE to đùng (PyCharm) lên, rồi viết chục dòng code, sau đó bấm nút “tam giác” để chạy từ trên xuống dưới. Đó là cách làm phổ biến, tiêu chuẩn khi viết code C, Java, Golang… nhưng là một cách làm rất không … Python.

  "Code dễ đọc" là như thế nào?
  "Mẹo bỏ túi" cho dân coder mới vào nghề

Khi học Python, việc đầu tiên ta làm là bật python từ terminal, rồi gõ trực tiếp các dòng code vào đó, enter để thấy kết quả:

$ python3
Python 3.6.9 (default, Apr 18 2020, 01:56:04)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> str(21 * 2) + " is the answer of life."
'42 is the answer of life.'

Còn khi đi làm, viết code Python? Cũng vậy!

Khả năng gõ code trực tiếp, enter thấy ngay kết quả như trên, là một tính năng cực kỳ hấp dẫn/quan trọng của Python cũng như các ngôn ngữ lập trình có REPL như Ruby, Clojure, JavaScript, LISP, Ocaml, Elixir, F#… nó cho phép người dùng khám phá, vui chơi thoải mái với dữ liệu một cách tương tác, thấy kết quả nhanh nhất, thay vì phải ngồi tưởng tượng, đoán, chờ compile, và dựa vào IDE trợ giúp như các ngôn ngữ không có REPL.

Viết code dễ đổi, dễ test như thế nào?

Đây là chế độ “interactive mode” của Python interpreter, khái niệm này có cái tên khác chung hơn là: REPL.

(Chú ý: Golang có các project như gore hay yaegi nhưng đều rất hạn chế so với REPL của các ngôn ngữ kể trên).

REPL

REPL – Read Eval Print Loop, là môi trường nhận đầu vào từ người dùng (Read), chạy input đó (Eval), in kết quả ra màn hình (Print), và cứ tiếp tục vậy (Loop).

Khái niệm này bắt nguồn từ ngôn ngữ lập trình cổ thứ 2 thế giới: LISP.

Việc viết code khi dùng các ngôn ngữ có REPL thường theo các bước:

  • bật REPL lên
  • gõ code thử cho tới khi thu được kết quả mong muốn
  • copy code đó vào editor/IDE

Ví dụ

Đoạn code Python 3 sau sẽ truy cập API của GitHub, lấy các repo của Pymivn về, lọc ra các repo có > 0 star, sắp xếp giảm dần theo số star, rồi in ra output ở dạng dễ đọc.

# githubstars.py
from urllib.request import urlopen
import json


def main():
    with urlopen("https://api.github.com/users/pymivn/repos") as f:
        repos = json.load(f)

    has_stars = []
    for repo in repos:
        if repo["stargazers_count"] > 0:
            has_stars.append((
                repo["stargazers_count"], repo["html_url"]
                ))

    has_stars.sort(reverse=True)
    for stars, url in has_stars:
        output = "{} - {}".format(stars, url)
        print(output)


if __name__ == "__main__":
    main()

Nếu viết theo kiểu này, rồi cho vào IDE, bấm nút tam giác để chạy, những nhược điểm sau sẽ xuất hiện:

  • Mỗi lần chạy, code sẽ truy cập vào API GitHub 1 lần, việc này ngoài chậm, phụ thuộc vào mạng internet mỗi lần chạy, còn thêm nhược điểm nữa là sẽ dùng tốn “quota” hàng ngày của bạn (VD GitHub chỉ cho phép gọi API n lần 1 ngày).
  • Trừ khi bạn code 1 lần chuẩn luôn, còn không thì mất khoảng 5 7 lần mới ra đoạn code trên.
  • Không test từng phần (bước) của đoạn code được.

Thay vì vậy, viết lại một phần code như sau

from urllib.request import urlopen
import json

def getrepos():
    with urlopen("https://api.github.com/users/pymivn/repos") as f:
        repos = json.load(f)
    return repos

def main():
    pass

Lưu vào file github.py, rồi vào terminal, bật python3 lên, gõ:

>>> import github
>>> repos = github.getrepos()
>>> type(repos), len(repos)
(<class 'list'>, 23)
>>> one = repos[0]
>>> one.keys()
dict_keys(['id', 'node_id', 'name', 'full_name', 'private', 'owner', 'html_url', 'description', 'fork', 'url', 'forks_url', 'keys_url', 'collaborators_url', 'teams_url', 'hooks_url', 'issue_events_url', 'events_url', 'assignees_url', 'branches_url', 'tags_url', 'blobs_url', 'git_tags_url', 'git_refs_url', 'trees_url', 'statuses_url', 'languages_url', 'stargazers_url', 'contributors_url', 'subscribers_url', 'subscription_url', 'commits_url', 'git_commits_url', 'comments_url', 'issue_comment_url', 'contents_url', 'compare_url', 'merges_url', 'archive_url', 'downloads_url', 'issues_url', 'pulls_url', 'milestones_url', 'notifications_url', 'labels_url', 'releases_url', 'deployments_url', 'created_at', 'updated_at', 'pushed_at', 'git_url', 'ssh_url', 'clone_url', 'svn_url', 'homepage', 'size', 'stargazers_count', 'watchers_count', 'language', 'has_issues', 'has_projects', 'has_downloads', 'has_wiki', 'has_pages', 'forks_count', 'mirror_url', 'archived', 'disabled', 'open_issues_count', 'license', 'forks', 'open_issues', 'watchers', 'default_branch'])
>>> one['stargazers_count']
0
>>> has_stars = [p for p in repos if p['stargazers_count'] > 0]
>>> len(has_stars)
8
>>> stars_urls = [(p['stargazers_count'], p['html_url']) for p in has_stars]
>>> stars_urls
[(7, 'https://github.com/pymivn/awesome'), (2, 'https://github.com/pymivn/cpuisfast'), (1, 'https://github.com/pymivn/hoidap-python'), (1, 'https://github.com/pymivn/lekhome'), (4, 'https://github.com/pymivn/math-stats-ml'), (3, 'https://github.com/pymivn/people'), (1, 'https://github.com/pymivn/pyjobs_crawlers'), (4, 'https://github.com/pymivn/Python_Hanoi_Meetup')]
>>> stars_urls.sort(reverse=True)
>>> fmt = "{} - {}"
>>> for i in stars_urls:
...     print(fmt.format(*i))
...
7 - https://github.com/pymivn/awesome
4 - https://github.com/pymivn/math-stats-ml
4 - https://github.com/pymivn/Python_Hanoi_Meetup
3 - https://github.com/pymivn/people
2 - https://github.com/pymivn/cpuisfast
1 - https://github.com/pymivn/pyjobs_crawlers
1 - https://github.com/pymivn/lekhome
1 - https://github.com/pymivn/hoidap-python

Với cách làm này, chỉ cần gọi GitHub API duy nhất 1 lần, còn sau đó thử thoải mái cho đến khi thu được kết quả mong muốn thì copy vào file cuối cùng:

import json
from urllib.request import urlopen


def getrepos():
    with urlopen("https://api.github.com/users/pymivn/repos") as f:
        repos = json.load(f)
    return repos


def has_stars(repo):
    return repo["stargazers_count"] > 0


def filter_repos_have_stars(repos):
    return [p for p in repos if has_stars(p)]


def get_star_url(p):
    return (p["stargazers_count"], p["html_url"])


def main():
    repos = getrepos()
    repos_have_stars = filter_repos_have_stars(repos)
    stars_urls = [get_star_url(p) for p in repos_have_stars]
    stars_urls.sort(reverse=True)
    fmt = "{} - {}"
    for i in stars_urls:
        print(fmt.format(*i))


if __name__ == "__main__":
    main()

Sau này nếu code có bug, lại bật REPL lên, gọi các function để debug trực tiếp dễ dàng, từng bước một.

$ ipython
Python 3.6.9 (default, Jul 17 2020, 12:50:27)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import github
In [2]: repos = github.getrepos()

In [3]: have_stars = github.filter_repos_have_stars(repos)

In [4]: len(have_stars)
Out[4]: 8

In [5]: [github.get_star_url(p) for p in have_stars]
Out[5]:
[(7, 'https://github.com/pymivn/awesome'),
 (2, 'https://github.com/pymivn/cpuisfast'),
 (1, 'https://github.com/pymivn/hoidap-python'),
 (1, 'https://github.com/pymivn/lekhome'),
 (4, 'https://github.com/pymivn/math-stats-ml'),
 (3, 'https://github.com/pymivn/people'),
 (1, 'https://github.com/pymivn/pyjobs_crawlers'),
 (4, 'https://github.com/pymivn/Python_Hanoi_Meetup')]

In [8]: sorted([github.get_star_url(p) for p in have_stars], reverse=True)

Out[8]:
[(7, 'https://github.com/pymivn/awesome'),
 (4, 'https://github.com/pymivn/math-stats-ml'),
 (4, 'https://github.com/pymivn/Python_Hanoi_Meetup'),
 (3, 'https://github.com/pymivn/people'),
 (2, 'https://github.com/pymivn/cpuisfast'),
 (1, 'https://github.com/pymivn/pyjobs_crawlers'),
 (1, 'https://github.com/pymivn/lekhome'),
 (1, 'https://github.com/pymivn/hoidap-python')]

Dev với IPython

IPython (pip install ipython) cung cấp thêm các tính năng giúp cách code này hiệu quả hơn.

IPython có màu mè, auto-indent tự thụt sau for/if giúp gõ nhanh hơn.

Magic command %hist sẽ hiện full history những gì user đã gõ, giúp copy code để paste ra IDE/Editor dễ hơn, không bao gồm output.

Magic command %edit sẽ mở hẳn editor ra để sửa code, sau khi đóng lại, code sẽ được chạy, các biến sẽ tồn tại trong môi trường đang code.

Ví dụ này gõ %edit lần đầu định nghĩa list ns, rồi gõ %edit lần 2 để print ra list ns định nghĩa trước đó:

$ ipython
Python 3.6.9 (default, Apr 18 2020, 01:56:04)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: %edit
IPython will make a temporary file named: /tmp/ipython_edit_2v90rimj/ipython_edit_wf_rn_nc.py
Editing... done. Executing edited code...
Out[1]: '\nns = [1,2,3,4]\n'

In [2]: ns
Out[2]: [1, 2, 3, 4]

In [3]: %edit
IPython will make a temporary file named: /tmp/ipython_edit_qb43pml6/ipython_edit_tph7_5x6.py
Editing... done. Executing edited code...
[1, 2, 3, 4]
Out[3]: 'print(ns)\n'

Đổi editor

ra shell, gõ echo $EDITOR xem đang đặt là gì, thay bằng câu lệnh mở editor mình muốn, ví dụ

$ export EDITOR=nano
$ ipython

Chạy file rồi bật REPL

Python hay IPython đều hỗ trợ option -i, sau khi chạy với 1 file code sẽ tự động vào chế độ interactive mode

Jupyter

Code trên Jupyter (pip install jupyter) cũng cho khả năng linh hoạt tương tự. Code xong File > Save As Python file.

Unittest

Trong các ngôn ngữ không có REPL, cách thử 1 đoạn code nhanh nhất là viết 1 function cần thử, rồi viết unittest, rồi chạy test thay vì chạy cả 1 chương trình ngàn dòng. Với Python, ta chỉ cần bật REPL lên, import module vào và khám phá.

Code viết theo cách mới trên vừa dễ gõ trực tiếp trong REPL, vừa dễ viết unittest, ví dụ viết nhanh unittest chạy bằng pytest (pip install pytest) như sau:

# test_github.py
import github


def test():
    bad = {"stargazers_count": 0, "html_url": "bad_repo"}
    good = {
        "stargazers_count": 69,
        "html_url": "https://github.com/pymivn/awesome",
        "blah": "blo",
    }
    sample_repos = [bad, good]
    assert github.filter_repos_have_stars(sample_repos) == [good]
    assert github.get_star_url(good) == (
        good["stargazers_count"],
        good["html_url"],
    )
    assert github.has_stars(bad) is False
    assert github.has_stars(good) is True

Viết code bằng REPL hay bằng unittest TDD đều mang tới một kết quả chung: code dễ sửa, dễ test.

Tất nhiên REPL không thay thế hoàn toàn cho unittest, nhưng nó mang lại môi trường thử nghiệm nhanh chóng tương đương như hơn nhiều unittest ở các ngôn ngữ khác.

Hành động của chúng ta

Cài ngay IPython, Jupyter rồi bật lên mỗi khi muốn code Python.

Kết luận

Đừng đọc tiếng Anh theo kiểu Tiếng Việt, đừng code Python theo kiểu Java. REPL là một phát minh có sức mạnh khủng khiếp mà các Pythonista nên vận dụng, sử dụng, và lạm dụng hết mình.

Bài viết gốc được đăng tải tại pp.pymi.vn
Có thể bạn quan tâm:

Randomart và thuật toán The Drunken Bishop

Bài viết được sự cho phép của tác giả Huỳnh Quán Cẩm

Khi tạo OpenSSH key ta hay bắt gặp một cái hình tên là randomart.

  Thuật toán là gì? 11 thuật toán hàng đầu dành cho lập trình viên
  20 thuật ngữ chuyên sâu trong Quản lý Nhân sự nội bộ
The key's randomart image is:
+---[RSA 2048]----+
|   .  o.+.       |
|  o .. +..       |
| o o. ... .      |
|. =  . =..       |
|.o.o  o.S .      |
| +. o  +.o o     |
|. oo..+o= o .    |
| +...o=*o= .     |
|o......EB        |
+----[SHA256]-----+

Có bao giờ bạn thắc mắc hình này dùng để làm gì không?

1. randomart là gì?

Khi tạo kết nối SSH tới một host nào đó, OpenSSH sẽ yêu cầu host đó cung cấp RSS key fingerprint.

$ ssh host.xyz
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.

Fingerprint này được dùng để xác thực host. Điều bạn cần làm với fingerprint này là kiểm tra xem nó có trùng với key của host đích mà bạn đang kết nối tới hay không. Trùng thì không có gì để bàn rồi. Còn không trùng thì … rất có khả năng bạn đang bị tấn công MiTM.

Randomart và thuật toán The Drunken Bishop

Nhưng những fingerprint này thường là những chuỗi vô nghĩa. Cách để so trùng những chuỗi này là … so trùng từng chữ bằng mắt. Chúa tạo ra con người hoàn hảo tuyệt đối. Trừ cặp mắt thôi. Điểm mù, saccades, đủ thứ cả. Chưa kể còn sai sót nữa. Bắt tui ngồi so những chuỗi dạng nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 cả ngày, thà bỏ nghề đi làm cách mạng còn hơn.

Vì vậy, randomart được sinh ra nhắm giải quyết bài toán này. Nó trực quan hóa những chuỗi vô nghĩa thành hình ảnh. Từ những hình ảnh này, người dùng có thể nhanh chóng phán đoán được độ đúng đắn của host key.

Đồng thời những hình ảnh này có thể sẽ rất khác nhau cho dù fingerprint của chúng chỉ lệch nhau một chút. Từ đó giúp giảm thiểu sai sót của user người truồng mắt trần.

Randomart của fingerprint ở trên có hình dạng như dưới. Để thấy hình randomart, bạn cần bật VisualHostKey=yes trong SSH config.

$ ssh host.xyz
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
+---[RSA 2048]----+
| =+o...+=o..     |
|o++... *o .      |
|*.o.  *o.        |
|oo.  ..o.= .     |
|.+o. .. S =      |
|*=+ .  o = .     |
|OE .  . o        |
| o     .         |
|                 |
+----[SHA256]-----+
Are you sure you want to continue connecting (yes/no)?

Nếu bạn chưa nhận ra, đây là host key của Github . Nếu một ngày pull code từ Github về mà không thấy hình ảnh quen thuộc này, tui sẽ lập tức đánh hơi được sự bất thường. Cách mạng đã tràn về như một cơn sóng rồi sao?

Randomart được tạo ra từ một thuật toán sặc mùi bia rượu: The Drunken Bitshop (tạm dịch: Say quắc ông giám mục).

2. Thuật toán

Thuật toán được tóm gọn trong một đoạn văn như sau:

Bishop Peter finds himself in the middle of an ambient atrium. There are walls on all four sides and apparently there is no exit. The floor is paved with square tiles, strictly alternating between black and white. His head heavily aching—probably from too much wine he had before—he starts wandering around randomly. Well, to be exact, he only makes diagonal steps—just like a bishop on a chess board. When he hits a wall, he moves to the side, which takes him from the black tiles to the white tiles (or vice versa). And after each move, he places a coin on the floor, to remember that he has been there before. After 64 steps, just when no coins are left, Peter suddenly wakes up. What a strange dream!

tạm dịch: Giám mục Peter đang ở giữa một cái sảnh với bốn mặt tường. Vang vọng là tiếng hát Khánh Phương với bài “Không lối thoát”. Sàn nhà lót bằng gạch trắng đen hình vuông. Đầu ổng rất nhức. Hẳn rồi, tối qua quắc quá mà. Ổng bắt đầu đi loạng choạng. Chính xác thì ông chỉ đi những bước xéo như con tượng trên bàn cờ vua. Khi đụng tường, ông đi một bước ngang hoặc dọc. Điều đó giúp ông chuyển từ ô đen sang ô trắng và ngược lại. Sau mỗi bước, ông đều đánh dấu lãnh thổ bằng cách đái một bãi đặt một đồng xu lên sàn, để ghi nhớ là ông đã đi qua đó rồi. Sau 64 bước, không còn đồng xu dính túi, Peter đột nhiên tỉnh dậy. Quả là một giấc mơ vế lù.

2.1. Bắt đầu

Thuật toán khá đơn giản, Peter cũng bắt đầu từ chính giữa phòng, kí tự hiệu là ‘S’.

1111111
01234567890123456
+-----------------+x (column)
0|                 |
1|                 |
2|                 |
3|                 |
4|        S        |
5|                 |
6|                 |
7|                 |
8|                 |
+-----------------+
y
(row)

2.2. Di chuyển

Giám mục Peter có thể di chuyển theo 4 hướng: , ứng với từng cặp bit của fingerprint.

bits hướng
00
01
10
11

Bắt đầu với một fingerprint dạng MD5 với các octet a1:b2:c3:d4:e5:f6:...:e1. Ta tiến hành dịch nó từ HEX sang binary như sau:

10100001:10110010:11000011:...:11100001

Đọc theo Little Endian, nó sẽ thành:

01 00 10 10 : 10 00 11 10 : ... : 01 00 10 11

Áp dụng với bảng ở trên, các bước đầu tiên của giám mục Peter lần lượt là:      . Dấu chấm tượng trưng cho những điểm mà ổng đã đi qua.

1111111
01234567890123456
+-----------------+x (column)
0|                 |
1|                 |
2|        .        |
3|       . .       |
4|    . . S        |
5|     .           |
6|                 |
7|                 |
8|                 |
+-----------------+
y
(row)

Đụng tường

Như đã mô tả, khi đụng tường Peter sẽ đi ngang hay dọc tùy theo hướng.

Giả sử ông ta đang ở vị trí 0-4 (x-y), và hướng tiếp theo của chúng ta là , giám mục sẽ đi .

1111111
  01234567890123456
+-----------------+x (column)
0|                 |
1|                 |
2|        .        |
3|.      . .       |
4|.   . . S        |
5| . . .           |
6|  .              |
7|                 |
8|                 |
+-----------------+
y
(row)

2.3. Đánh dấu

Để đánh dấu, ứng với số lần mà ô đó được đi qua, ta sẽ dùng các kí hiệu sau.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  . o + = * B O X @  %  &  #  /  ^  S  E

Nếu ô đó được đi qua 7 lần, ta sẽ đánh O, 11 lần sẽ đánh &, S là ô bắt đầu và E là ô kết thúc.

Và cứ như thế, một hình ảnh randomart đã được tạo ra.

3. Tham khảo

Các bạn có thể tham khảo về thuật toán tại paper The drunken bishop: An analysis of the OpenSSH fingerprint visualization algorithm.

4. Bài viết này sẽ giúp tui tăng lương như thế nào?

Như thường lệ bài viết không có giúp bạn tăng lương. Cơ mà có một số điều rút ra là:

  1. Luôn kiểm tra host key khi kết nối SSH, để lỡ có ăn hành thì cũng biết đường mà … đánh răng.
  2. Bật VisualHostKey=yes trong SSH config để kiểm tra bằng hình ảnh thay vì bằng chuỗi.

Bài viết gốc được đăng tải tại quan-cam.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ách thức giúp AI hoạt động hiệu quả cho tổ chức của bạn

AI – Trí thông minh nhân tạo đã tạo ra sự thay đổi mạnh mẽ đối với không gian nhân sự. Sức mạnh tiềm lực của AI là rất lớn. Chúng được biểu hiện rõ qua quá việc hợp thức hóa công tác tuyển dụng. Đồng thời, chúng hiện đang được áp dụng vào chu trình vận hành của các tổ chức/doanh nghiệp, đặc biệt là các công ty về công nghệ. Vậy phải làm thể nào để chuẩn hóa quy trình phát triển? Nắm bắt về cơ chế hoạt động của AI là điểm mấu chốt của vấn đề.

Cùng TopDev điểm qua 4 cách trong bài viết sau đây để tìm ra các giải pháp. Bạn có thể áp dụng chúng để tiếp cận nhằm đo lường về hiệu suất; đảm bảo về khả năng hoạt động của AI trong tổ chức của mình.

1. Đầu tư vào nghiên cứu và đổi mới những vấn đề liên quan đến AI

Trí tuệ nhân tạo – AI đã có những bước phát triển nhảy vọt trong những năm gần đây. Tuy vậy nếu đặt nó trong bối cảnh cạnh tranh thực tế với nhiều sản phẩm sáng kiến khoa học, giá trị của nó vẫn chưa rõ ràng. Dù vậy, không thể phủ nhận những tiềm năng và lợi thế mà AI đang sở hữu. Đó cũng là lý do tại sao có nhiều sự đầu tư nghiên cứu và đổi mới có liên quan đến AI nhiều đến vậy. 

  AI và những điều bạn cần phải có trước khi đụng tới AI

AI

Thực tế cho thấy, AI khi được đầu tư với mức chi phí ổn định; định hướng áp dụng phù hợp với quy mô tổ chức, nó đã tạo ra một sự khác biệt đáng kể. Chẳng hạn, tổ chức sản xuất xe máy nổi tiếng Harley Davidson đã cải thiện dòng xe thế hệ đầu với 2.930% trong ba tháng sau khi hãng triển khai hệ thống tiếp thị dựa trên AI có tên Albert. 

2. Nhận ra tiềm năng và giáo dục về AI

Nhiều công ty đang bắt đầu nhận ra tiềm năng về việc xây dựng nền tảng và phát triển nhân sự dựa trên AI. Do vậy mà nhu cầu này ngày càng được quan tâm và chia sẻ. 

a

Khi mới bắt đầu, việc tập trung vào đào tạo kiến ​​thức kỹ thuật cấp cao về AI không hoàn toàn cần thiết. Các giám đốc điều hành về nhân sự nên nhận thức được các yếu tố cần thiết của AI. Cụ thể như: các chương trình học từ dữ liệu; cách các hệ thống AI có thể được tích hợp vào hoạt động hàng ngày; cách đầu tư chúng vào việc đổi mới cách thức tổ chức của doanh nghiệp. Điều này giúp tạo ra lợi thế cạnh tranh lành mạnh và lâu dài cho chủ doanh nghiệp. 

Ngoài ra, các nhà lãnh đạo nên liên tục xem xét một cách kỹ lưỡng lực lượng lao động của họ. Đó là cách giúp tìm ra các lĩnh vực phù hợp nhất. Đồng thời tạo ra cơ sở để áp dụng và triển khai thực hiện AI. Các khóa đào tạo và giáo dục về AI trực tuyến có thể là sự lựa chọn hoàn hảo. Trải nghiệm việc đào tạo (training) sẽ tạo ra nền tảng tốt. Đây là bước đầu giúp họ trang bị hành trang sẵn sàng cho diễn tiến bất ngờ từ sự phát triển của AI trong thời gian tới.

3. Tạo công việc mới để quản lý các lĩnh vực AI

Chính sự bùng nổ AI đã tạo ra những thay đổi lớn về cục diện phát triển. Tuy vậy, mặc dù cuộc cách mạng công nghệ có thể dẫn đến những hệ quả khó kiểm soát như tình trạng mất việc. Thế nhưng, ở một góc độ khác thì những tiến bộ này lại mang lại sự cân bằng lâu dài cho nền công nghiệp: tạo ra công việc mới và các lĩnh vực tương ứng để xử lý công việc.  

Xem thêm: HR & IT – “Cuộc chơi” hoàn hảo cho việc thu hút và giữ chân nhân tài

AI

Để duy trì và phát huy một cách thức hoạt động AI hiệu quả, các công ty cần có những nhận thức sâu sắc nhất về AI. Cụ thể, hãy quan tâm đến việc bắt đầu chuyển đổi công việc; tạo ra các cơ hội hướng tới một mô hình bổ sung phát triển công nghệ mới.  AI đang được vận dụng nhiều trong việc phân tích dữ liệu và tiếp thị dữ liệu số. Đó là một tín hiệu tốt.

Một điều quan trọng cần ghi nhớ: Tạo ra những công việc mới thông qua AI trong khắp cả một hệ thống chứ không đơn thuần tập trung vào các bộ phận liên quan đến công nghệ. Bộ phận nhân sự cần xác định đúng phạm vi lĩnh vực, từng nhiệm vụ; các công việc cần thực hiện. Như thế, việc ứng dụng AI vào quá trình vận hành sẽ đạt những hiệu quả cao hơn.

4. Phát triển “con người Nhân sự”

AI có ý nghĩa quan lớn trong việc định hướng phát triển các chiến lược nhân sự. Do vậy nhà lãnh đạo luôn phải cố gắng làm thế nào để tạo sự cân bằng. Khả năng tự động hóa của AI tạo ra lợi thế lớn trong việc xây dựng một hệ thống nhân sự vững mạnh.

Xem thêm: Phân tích con người – Chiến lược quan trọng trong ngành Nhân sự 

Song, một số lĩnh vực đòi hỏi khả năng phân tích sâu sắc hơn của con người. Vì thế, chúng ta thấy việc phát triển “con người nhân sự” là điều nên phải lưu tâm. Nếu AI có khả năng phân tích khoa học, logic không giới hạn thì con người có khả năng suy luận, năng lực phán đoán từ trí tuệ cảm xúc. Sự hòa hợp ấy sẽ tạo ra sự cân bằng, tính ổn định; đảm bảo được mức độ hiệu quả của các cách thức áp dụng thực tiễn.

AI vận hành hiệu quả các quy trình: thiết kế bảng lương, tuyển dụng, đánh giá hiệu quả của nhân viên, phân bổ lao động theo năng lực,… Nhưng một sự thật là, AI sẽ khó thay thế hoàn toàn bộ phận nhân sự vì sự thiếu sót về cảm tính.

Đây là yều tố cần có trong ngành nhân sự hoặc bất kỳ một lĩnh vực nào khác. Hiểu được vấn đề này, các nhà lãnh đạo nhân sự cần biết cách phát triển con người nhân sự. Không nên quá tập trung vào những điểm mạnh của AI mà quên đi con người vẫn là nhân tố trung tâm.

Lời kết

Lĩnh vực nhân sự gắn liền AI sẽ tiếp tục được áp dụng một cách chuyên sâu hơn. Việc lựa chọn AI – Trí tuệ nhân tạo là công cụ hỗ trợ quan trọng. Nó thúc đẩy hiệu suất và sự phát triển lâu dài của tổ chức. Đồng thời, nó phát huy hết những tiềm năng; tạo ra tính bền vững về công nghệ nhân sự. Các tổ chức/doanh nghiệp nên tiếp tục sáng tạo, khám phá và thích ứng để trở thành người đi đầu trong việc triển khai hiệu quả AI.

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

Xem thêm Top Việc làm Developer trên TopDev

Một thủ thuật nhỏ để tối ưu code nodejs

Bài viết được sự cho phép của tác giả Phạm Công Sơn

Tôi code web asp.net c# đã lâu năm rồi, giờ có nhiều framework mới, công nghệ mới nên đôi khi cũng chưa có cơ hội để trải qua. Dù sao cũng là tầng lớp già rồi, khó có thời gian học được cái mới. Chính vì vậy, lựa chọn chơi với các bạn trẻ cũng là một cách học hỏi. Bạn trẻ thì có kiến thức mới nhưng lại thiếu kinh nghiệm. Mình già rồi có kinh nghiệm nhưng lại thiếu kiến thức mới. Già, trẻ chơi với nhau chắc chắn sẽ có bù đắp qua lại. Qua đó mà học hỏi đôi bên với nhau.

Tuyển dụng NodeJS lương cao hấp dẫn cho bạn

  Mẫu bảng mô tả công việc lập trình NodeJS

Hôm nay thằng cu em cho xem project code bằng nodejs. Có đọc qua vài file controller thì thấy một điều thế này. Đúng là hầu hết các bạn trẻ code static quá nhiều và hơn nữa là copy code đã thành tư tưởng cố hữu. Code cứ dài lê thê mà không đóng gói lại thành hàm, thành đối tượng để tái sử dụng lại. Điều mà tôi có nói tới trong bài viết Tại sao code của tôi thường ngắn gọn như vậy.

Đây là file controller history.js mà tôi đã đọc của thằng cu em.

const History = require("../services/history");
const { handleResponse, handleError } = require("../helpers/responseHandler");

const getHistoriesByBet = async (request, response, next) => {
  // console.log('request.body',request.body);
  return History.getHistoriesByBet(request.body)
    .then((result) => handleResponse({ result, response }))
    .catch((error) => next(handleError({ error, response })));
};

const getHistories = async (request, response, next) => {
  // console.log('request.body',request.body);
  return History.getHistories(request.body)
    .then((result) => handleResponse({ result, response }))
    .catch((error) => next(handleError({ error, response })));
};

const getBalance = async (request, response, next) => {
  // console.log('request.body',request.body);
  return History.getBalance(request.body)
    .then((result) => handleResponse({ result, response }))
    .catch((error) => next(handleError({ error, response })));
};

const createHistory = async (request, response, next) => {
  // console.log('request.body',request.body);
  return History.createHistory(request.body)
    .then((result) => handleResponse({ result, response }))
    .catch((error) => next(handleError({ error, response })));
};

const createWithdrawHistory = async (request, response, next) => {
  // console.log('request.body',request.body);
  return History.createWithdrawHistory(request.body)
    .then((result) => handleResponse({ result, response }))
    .catch((error) => next(handleError({ error, response })));
};

const getWithdraws = async (request, response, next) => {
  // console.log('request.body',request.body);
  return History.getWithdraws(request.body)
    .then((result) => handleResponse({ result, response }))
    .catch((error) => next(handleError({ error, response })));
};

module.exports = {
  getHistories,
  getBalance,
  createHistory,
  getHistoriesByBet,
  createWithdrawHistory,
  getWithdraws
};

Ở đây có thể hiểu là các hàm api ở controller sẽ gọi đến tầng lấy data để gửi xuống client. Nhưng mà có thể thấy. các hàm getHistoriesgetBalancecreateHistorygetHistoriesByBet,   createWithdrawHistorygetWithdraws cũng cùng một dạng mà copy đi copy lại.

Chính vì vậy mà tôi dù chưa code NodeJs nhưng cũng đã từng code javascript nên thêm một hàm getResponse như sau

class Controllers {
  //   constructor() {}

  constructor(service) {
    this.Service = service;
  }

  ////
  //// code code
  ////

  getResponse(method, request, response, next) {
    // console.log('request.body',request.body);
    const service = new this.Service();
    return service[method](request.body) // ddc ko ta?
      .then((result) => this.handleResponse({ result, response }))
      .catch((error) => next(this.handleError({ error, response })));
  }
}

Hàm getResponse trong đó có tham số method, còn Controller có thuộc tính this.Service. Và qua đó sẽ truy vấn this.Service thông qua key là method để lấy được hàm cần gọi. Và cuối cùng file History.js sẽ còn về được như sau

const History = require("../services/history");
const Controller = require("./Controllers");

class HistoryCtrl extends Controller
{
    constructor() { super(History) }

    getHistoriesByBet = async (request, response, next) => this.getResponse("getHistoriesByBet", request, response, next);
    getBalance = async (request, response, next) => this.getResponse("getBalance", request, response, next);
    createHistory = async (request, response, next) => this.getResponse("createHistory", request, response, next);
    getHistoriesByBet = async (request, response, next) => this.getResponse("getHistoriesByBet", request, response, next);
    createWithdrawHistory = async (request, response, next) => this.getResponse("createWithdrawHistory", request, response, next);
    getWithdraws = async (request, response, next) => this.getResponse("getWithdraws", request, response, next);
}

module.exports = HistoryCtrl;

Đơn giản vậy thui. Mà đã giảm đi phải tới 80% code ấy chứ. Chưa kể các file controller khác cũng tối ưu tương tự thì cũng một lượng code thừa tương đối được loại bỏ. Đây chỉ một trong rất nhỏ các thủ thuật để tối ưu code cho đơn giản và gọn gàng hơn. Còn nhiều thủ thuật khác mà gặp tùy từng tình huống thì tôi sẽ post để chia sẻ thêm.

Chúc các bạn code ngày càng tốt hơn

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

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

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

Trải nghiệm giáo dục Phần Lan cùng Hội thảo Khoa học Việc làm: Future Is Made In Finland

Bạn đang tìm kiếm một môi trường học tập chuyên nghiệp? Bạn mong muốn trải nghiệm tại một môi trường giáo dục quốc tế nhưng e ngại nhiều vấn đề? Đừng lo lắng vì Phần Lan là sự lựa chọn hoàn hảo dành cho bạn

Tại sao nên chọn Phần Lan?

Phần Lan là điểm đến trải nghiệm giáo dục lý tưởng của sinh viên quốc tế. Chính môi trường tiếp cận khoa học chuyên nghiệp với những đội ngũ là các chuyên gia đầu ngành, giáo dục nơi đây luôn lấy tiêu chuẩn về chất lượng làm sứ mệnh để định hướng phát triển.

Bạn có thể dễ dàng tìm thấy một hệ thống giáo dục đại học hàng đầu thế giới tại Phần Lan với hơn 400 chương trình cử nhân, các khóa học định hướng đảo tạo và phát triển tư duy,… Các chương trình, khóa học nơi đây luôn cập nhật những xu hướng giảng dạy mới nhất, tiếp thu và phát triển các kiến thức chuyên sâu nhất nhằm đáp ứng nhu cầu học tập, rèn luyện. Với những lý do đó, Phần Lan đã chứng tỏ rõ ràng vị thế của một quốc gia với nền giáo dục chất lượng, đảm bảo tính hội nhập với thế giới.

1. Phần Lan là một quốc gia hạnh phúc

Theo Báo cáo hạnh phúc toàn cầu mới nhất 2019 của Liên Hợp Quốc, do Gallup thực hiện, dựa trên 6 yếu tố ảnh hưởng đến hạnh phúc như tuổi thọ trung bình, phúc lợi xã hội, thu nhập, sự tự do, lòng rộng lượng và sự tin tưởng cao. Họ đánh giá đây là một quốc gia hạnh phúc nhất thế giới vì có tỷ lệ tham nhũng thấp, xã hội tiến bộ và hệ thống ngân hàng đáng tin cậy nhất trên thế giới.

2. Học phí hợp lý và học bổng hấp dẫn

Tùy vào các trường Đại học, ngành nghề mà các bạn du học sinh chọn sẽ có mức học phí khác nhau. Tuy nhiên, vẫn có những chính sách khuyến khích học tập bằng các suất học bổng có giá trị lên tới 100% học phí.

3. Hệ thống giáo dục đứng đầu thế giới

Đất nước Phần Lan là nước có hệ thống giáo dục Phổ thông thành công nhất thế giới dựa theo đánh giá của tổ chức của Organization Economic Cooperation and Development viết tắt là OECD vì các yêu tố như: giáo viên được đào tạo bài bản, cơ sở vật chất luôn đáp ứng và phục vụ tốt cho nhu cầu học tập, nghiên cứu của học sinh, sinh viên.

Bên cạnh đó, ngành giáo dục tại Phần Lan cũng được xem là “Trái tim của xã hội”, góp phần không nhỏ vào sự phát triển của đất nước. Đây là lý do rất nhiều sinh viên quốc tế ưu tiên lựa chọn Phần Lan làm nơi học tập.

4. Khoa học Ứng dụng: Trang bị thành công sau khi tốt nghiệp

Khi theo học tại các trường Đại học Khoa học Ứng dụng, thời lượng chương trình học của sinh viên sẽ bao gồm khoảng 50% lý thuyết và 50% là các dự án hoặc hoạt động học tập thực tiễn, cơ cấu chương trình học này giúp sinh viên làm quen và có kinh nghiệm với môi trường làm việc thực tế từ sớm.

5. Cơ hội làm thêm ngoài giờ kiếm thêm thu nhập

Ngoài những lý do trên, khi du học ở Phần Lan các bạn sinh viên có thể đăng ký làm thêm với thời gian 25 giờ/ tuần cộng với những ngày nghỉ lễ, Tết. Tận dụng khoảng thời gian này để giúp cho các bạn có thể kiếm thêm thu nhập, trang trải các chi phí học tập, sinh hoạt với mức thu nhập 8 – 15 euro mỗi giờ.

Sau khi tốt nghiệp, nếu chưa tìm được việc làm các bạn có thể ở lại đây 1 năm theo diện visa tìm kiếm công việc hoặc khởi nghiệp. Đây chính là cơ hội tuyệt vời khi bạn đang băn khoăn trước khi đưa ra quyết định “có nên du học Phần Lan hay không?”.

Với 5 lý do thuyết phục trên chắc chắn các bạn cũng hiểu được lý do vì sao đất nước Phần Lan thu hút nhiều bạn trẻ lựa chọn du học tại đây. Và đây cũng chính là câu trả lời dành cho các bạn trước khi đưa ra quyết định có nên du học tại đây hay không.

Hội thảo Khoa học Việc làm – Webinar Series: Future Is Made In Finland

Đáp ứng những mong muốn cũng như tạo ra cơ hội để các bạn có trải nghiệm thực tế về môi trường học tập, chương trình giảng dạy, nghiên cứu tại Phần Lan, hội thảo Khoa học Việc – Webinar Series: Future Is Made In Finland đã ra đời.

Khóa học nhằm nhấn mạnh tầm quan trọng của một số lĩnh vực nghiên cứu và công nghệ. Bên cạnh đó, một số cách tiếp cận nổi bật ở thời điểm hiện tại được đội ngũ chúng tôi khai thác nhằm phát triển nâng cao quá trình chuyển đổi về một tương lai bền vững hơn. Khóa học mở ra cơ hội tiếp cận cho mọi cá nhân có sự quan tâm. Hãy 

Thông tin chi tiết chuỗi Hội Thảo 

Mở đầu cho chuỗi Hội thảo là tập đầu tiên bắt đầu từ thứ Tư tuần sau, ngày 14 tháng 10 lúc 16:00  theo giờ Việt Nam.

Chuỗi Hội Thảo trên web đầy đủ sẽ như sau:

  • 14/10/2020 – 16h, EP I: Future is Made in Finland – want to be part of it?
  • 26/10/2020 – 17h, EP II: Bioeconomy Defines the Future
  • 28/10/2020 – 17h, EP III: Join the Revolution of Light and Image
  • 3/11/2020 – 17h, EP IV: First in 6G
  • 11/11/2020 – 17h, EP V: Get REAL, AI!
  • 17/11/2020 – 17:00, EP VI: Future is Mad in Finland – Design it yourself!
  • [To be announced] EP VII: Future is Female – Discussion with Women in Sciences & Tech

Hãy tham gia cùng chúng tôi khám phá tương lai thông qua 7 giai đoạn tuyệt vời để hiểu về sự thay đổi, các thách thức đang tồn tại; cách mà khoa học đang giải quyết các vấn đề về các hệ sinh thái phát triển hàng đầu trên thế giới.

Tìm hiểu chi tiết thông tin về chuỗi Hội thảo và đăng ký ngay tại: https://www.studyinfinland.fi/future-is-made-in-finland

10 điều bạn có thể làm với Linux mà bạn không thể làm với Windows

Bài viết được sự cho phép của tác giả Phạm Văn Nguyên

Windows và linux có khá nhiều điểm khác nhau.

Trong bài này tôi sẽ chỉ ra 10 điều bạn có thể làm với Linux mà bạn không thể làm với Windows. Bắt đầu nào.

1. Bạn có thể tải mã toàn bộ mã nguồn (source) của Linux.

+ Link: https://github.com/torvalds/linux
+ Mã nguồn của tất cả các phần mềm cũng có sẵn.
+ Ở chiều ngược lại: windows là mã nguồn đóng (closed source), bạn không thể xem hay tải nó.

2. Bạn có thể cài đặt bản cập nhật (install updates) mà không cần phải khởi động lại (reboot) máy tính.

+ Điều này là đúng với hầu hết các phần mềm chạy trên Lunix
+ Thậm chí đối với cả các kernel > 4.0
+ Đối với Windows thì cần phải khởi khởi động lại.

3. Bạn có thể cắm (plug) thiết bị vào mà không cần lo lắng về việc tìm / tải xuống trình điều khiển (driver).

+ Trừ một số thiết bị chuyên dụng cao.
+ Ở windows thì sẽ cần phải download.

4. Bạn có thể chạy Linux từ USB, CD, DVD, …

+ Đối với windows không có lựa chọn như vậy tồn tại.

  10 điều bạn có thể làm với Linux mà bạn không thể làm với Windows
  6 câu lệnh linux hay dùng trong phân tích log

5. Bạn có thể chạy Linux cả năm mà không cần phải khởi động lại.

+ Nó cực kỳ ổn định
+ Ít phân mảnh bộ nhớ
+  Windows: hệ thống sẽ bị chậm sau một khoảng thời gian.
Hình sau sẽ mình hoạt 1 máy chạy Linux 1002 ngày mà chưa cần khởi động lại:

      10 điều bạn có thể làm với Linux mà bạn không thể làm với Windows

6. Bạn có thể chạy (run) Linux trên hầu như bất kỳ phần cứng nào.

+ Bao gồm cả những chiếc máy tính, laptop cũ cấu hình thấp, những máy tính cũ từ những năm 1990, thậm chí 1980 đều có thể chạy được Linux.
+ Windows: Yêu cầu phần cứng tối thiểu phải đạt 1 con số nhất định, càng bản windows mới thì càng yêu cầu phần cứng cấu hình cao hơn

7. Bạn có thể sửa lỗi linux bị hỏng với một đĩa cd.

+ Một vài lỗi của windows cũng có thể sửa được với 1 đĩa CD Linux
+ Windows: sửa chữa hệ thống (system repair) chỉ là lựa chọn

8. Bạn có thể cập nhật tất cả các phần mềm thường xuyên chỉ với một dòng lệnh đơn giản.

+ Ví dụ đối với Ubuntu bạn chỉ cần chạy lệnh “apt-get upgrade”.

     + Windows: cập nhật phần mềm chỉ có trong windows update.

9. Bạn có thể di chuyển ổ cứng từ máy linux này sang máy khác.

     + Phần lớn được thực hiện bằng cách không cần diver (trình điều khiển) cụ thể.

     + Windows: thường sẽ không hoạt động đúng, vì vậy bạn phải cài lại drive.

10. Bạn có thể tùy chỉnh mọi thứ theo nghĩa đen

      + font, icon, themes,…

      + Thậm chí có cả themes Windows, Mac cho Linux

      + Windows: một số tùy chỉnh có sẵn nhưng nó không có nhiều và không chỉnh sửa được nhiều như trên Linux.

Ngoài ra: bạn có thể cài phần mềm  mà không cần lo lắng về virus hay malware.

Nghĩa là bạn không cần phần mềm diệt virus.

Phần mềm từ kho chính thức sẽ không bao giờ chứa mã độc hại.

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

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

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

Viết code trong trình duyệt với Microsoft Visual Studio Online

Việc phát triển phần mềm và web đã thay đổi hoàn toàn trong những năm gần đây. Các nhóm không còn phải ngồi chung ở cùng một nơi. Ngoài ra, các công cụ có sẵn cho những người đang phát triển phần mềm, ứng dụng và trang web cũng đã được cải thiện.

Mặc dù vậy, vẫn có những tình huống mà bạn có thể cần một môi trường làm việc tập trung. Đây là nơi các công cụ phát triển từ xa như Visual Studio Online xuất hiện. Bài viết hôm nay sẽ xem xét công cụ này ảnh hưởng như thế nào đến mọi thành viên làm việc trong một nhóm phát triển từ xa.

Vào Visual Studio Online

Viết code trong trình duyệt với Microsoft Visual Studio Online

Trong một thông báo gần đây, Microsoft đã tiết lộ Visual Studio Online cho phép lập trình tương tác từ nhiều vị trí. Visual Studio Online có cả trình soạn thảo code trong trình duyệt hoàn chỉnh và đóng vai trò trung tâm để đồng bộ với trình soạn thảo cục bộ của người dùng.

Visual Studio Online là cái tên đã xuất hiện được một thời gian. Đó là tên ban đầu của dịch vụ Azure DevOps, một hệ thống quản lý dự án trực tuyến.

Cái tên này có ý nghĩa hơn nhiều trong bối cảnh hiện nay, vì những gì Microsoft dường như sẽ khởi chạy là một máy chủ hoàn toàn từ xa, được lưu trữ đồng hành với Visual Studio Code và Visual Studio.

Visual Studio Code là gì?

Viết code trong trình duyệt với Microsoft Visual Studio Online

Để hiểu được ý nghĩa của Visual Studio Online, bạn sẽ cần phải làm quen với Visual Studio Code (VS Code).

VS Code là trình soạn thảo code miễn phí của Microsoft dành cho các nhà phát triển. Trái ngược với Visual Studio (IDE flagship của Microsoft), VS Code có mã nguồn mở và gần với các trình soạn thảo văn bản như Sublime Text và Atom hơn là một Integrated Development Environment (IDE) đầy đủ.

Có sẵn cho Windows, Mac và Linux, nó cung cấp một môi trường gọn nhẹ và đầy đủ tính năng để lập trình. Tiện ích mở rộng giúp hoàn thành code và kiểm tra lỗi trong code nguồn (linting). Visual Studio Live Share cho phép lập trình cộng tác thông qua kết nối Internet. Visual Studio Online được thiết lập để thu hẹp khoảng cách hơn nữa, cho phép các môi trường lập trình được chia sẻ.

Visual Studio Online sẽ hoạt động như thế nào?

Viết code trong trình duyệt với Microsoft Visual Studio Online

Thay vì việc mọi người cấu hình môi trường phát triển trên máy cục bộ, Visual Studio Online mang đến trải nghiệm của một nhóm làm việc trên cùng một hệ thống. Để hiểu lý do tại sao điều này lại có sức mạnh lớn đến vậy, hãy xem xét các bước cần thiết để làm việc trong một nhóm phát triển.

Mọi người cần phải có sẵn các công cụ và thư viện giống nhau. Các máy phát triển khác nhau có thể chạy những hệ điều hành hoặc phiên bản phần mềm không giống nhau. Việc quản lý gói và kiểm soát phiên bản có thể giúp ích, nhưng từng thành viên trong nhóm sẽ tự kiểm soát môi trường của họ.

Ngay cả phần cứng cũng có thể là một vấn đề. Nếu máy của bạn không tương thích với các yếu tố của một dự án thì cho đến gần đây, bạn không còn lựa chọn nào khác ngoài việc mua một máy tính mới. Bây giờ, ngay cả khi không có gì được cài đặt cục bộ, bạn vẫn có thể làm việc với bất kỳ thiết lập phát triển nào.

  "Code dễ đọc" là như thế nào?
  "Mẹo bỏ túi" cho dân coder mới vào nghề

Có phải ý tưởng này đã tồn tại?

IDE trực tuyến hoàn toàn không có gì mới và Amazon AWS Cloud9 IDE là một môi trường mạnh mẽ giàu tính năng. Tương tự, có nhiều dịch vụ thuê bao trực tuyến được thiết kế để phát triển nhóm với quy mô nhỏ hơn.

Thậm chí có những IDE trực tuyến sử dụng cơ sở mã nguồn mở VS Code, và bất kỳ ai quen thuộc với phần mềm này cũng sẽ cảm thấy không có gì xa lạ.

Có một môi trường từ xa có thể truy cập thông qua cả trình duyệt và cục bộ là điều hoàn toàn có thể về mặt kỹ thuật với bất kỳ dịch vụ nào trong số này. Ngược lại, những gì Visual Studio Online có thể sẽ làm là biến mình thành một trải nghiệm hợp lý và dễ tiếp cận hơn.

Điều gì làm cho Visual Studio Online trở nên đặc biệt?

Viết code trong trình duyệt với Microsoft Visual Studio Online

Đưa toàn bộ dự án vào một máy sao cho hiệu quả có nghĩa là mọi người luôn làm việc với cùng một thiết lập. Bất kể bạn là một lập trình viên dày dạn kinh nghiệm hay mới đi làm ngày đầu tiên, mọi thứ đều đã được thiết lập trước.

Nếu nhu cầu của dự án thay đổi, ví dụ, đối với một hệ thống hoặc framework mới, chỉ có một môi trường phát triển cần thay đổi và những thay đổi đó sẽ tự động chuyển sang từng thành viên của nhóm.

Về lý thuyết, sẽ không có sự khác biệt giữa làm việc tại nhà trên máy phát triển thông thường của bạn, trên máy tính đi mượn hoặc thậm chí trên điện thoại thông minh, nếu bạn có thể viết code bằng ngón tay cái!

Visual Studio Online có thể làm gì?

Tại thời điểm viết bài, dù chưa chính thức, nhưng quy trình làm việc chung trên Visual Studio Online dường như đã được đặt ra. Nó sẽ có tất cả các tính năng tương tự VS Code như hoàn thành code, kiểm tra lỗi trong code nguồn (linting) và cộng tác trong trình duyệt.

Hơn nữa, tất cả các chi tiết dự án, cùng với những tùy chọn và theme của người dùng, sẽ đồng bộ giữa mọi phiên bản trình duyệt và trình soạn thảo code cục bộ.

Microsoft cũng đã công bố tích hợp IntelliCode, tận dụng machine learning để đưa ra gợi ý và hoàn thành code tốt hơn dựa trên thói quen. Mặc dù chưa được xác nhận, nhưng rất có khả năng IntelliCode sẽ có thể mở rộng cho toàn bộ các nhóm, cho phép những công cụ động dựa trên kiến ​​trúc của một dự án.

Vậy thiết lập tùy chỉnh cho việc lập trình của từng cá nhân thì sao?

Viết code trong trình duyệt với Microsoft Visual Studio Online

Một nhược điểm rõ ràng cho cách tiếp cận chỉ gồm một máy phát triển duy nhất nằm ở việc tùy chỉnh cá nhân. Nếu bạn đã quen với một quy trình làm việc, bố cục hoặc shortcut tùy chỉnh cụ thể, mọi thứ có thể khó điều chỉnh.

May mắn thay, đây không phải là cách mà Visual Studio Online sẽ hoạt động. Theme cho mỗi người dùng sẽ cho phép thiết lập cá nhân. Mặc dù chắc chắn sẽ có một số khác biệt giữa việc sử dụng trình chỉnh sửa ngoại tuyến, nhưng trải nghiệm người dùng sẽ tương tự như môi trường tại nhà của bạn.

Một điều cần lưu ý là Visual Studio Online không phải là sự thay thế cho VS Code hoặc Visual Studio. Nó là một ứng dụng đồng hành cho phép người dùng code trực tiếp trong trình duyệt. Quy trình công việc giả định liên quan đến việc liên kết thiết lập cục bộ với dịch vụ trực tuyến mới.

Tại sao lại cần một trình soạn thảo code từ xa?

Nếu đã sử dụng máy tính tại nhà để phát triển, bạn có thể tự hỏi tại sao lại phải bận tâm tới Visual Studio Online.

Nó có thể không dành cho tất cả mọi người. Các nhà phát triển riêng lẻ hoặc bất kỳ ai làm việc với vi điều khiển hoặc phần cứng khác có thể không được hưởng lợi từ môi trường phát triển dựa trên đám mây. Hơn nữa, nếu bạn đã quen thuộc với một trình soạn thảo code khác và thoải mái sử dụng những môi trường ảo để lập trình, thì việc chuyển đổi có vẻ vô nghĩa.

Lợi ích thực sự từ Visual Studio Online sẽ dành cho các nhà phát triển mới bắt đầu. Không cần phải đau đầu với một lĩnh vực có nhiều khó khăn như quản lý các gói.

Điều quan trọng hơn nữa là Visual Studio Online mở ra sự phát triển cho bất kỳ ai. Việc sử dụng Chromebook, điện thoại thông minh hay PC cũ sẽ không quan trọng nữa, vì bạn có quyền truy cập vào cùng các công cụ.

Có thể tìm thấy Visual Studio Online ở đâu?

Vào thời điểm viết bài, VS Online không có sẵn cho tất cả mọi người. Có một bản xem trước riêng tư và bạn có thể đăng ký với Microsoft (tại đây) để truy cập. Khả năng là bạn sẽ phải đợi cho đến khi nó ở phiên bản beta công khai để dùng thử.

Nếu bạn muốn trải nghiệm thứ gì đó có khả năng gần như giống hệt, thì đã có sẵn phiên bản trực tuyến của VS Code. Vì nó là phần mềm mã nguồn mở, nên không có gì ngăn bạn xây dựng một phiên bản cho máy chủ của riêng mình. Nếu điều này có vẻ như quá sức với bạn, các trang web như Coder.com và StackBlitz.com đều là phiên bản trình duyệt của VS Code.

Visual Studio Online sẽ đưa sự phát triển trực tuyến lên một tầm cao mới. Để có thể tận hưởng lợi ích của lập trình cộng tác, bạn nên làm quen với Visual Studio Live Share.

Trong khi bạn đang chờ đợi phiên bản Visual Studio Online, tại sao không thử một trong nhiều IDE dựa trên trình duyệt đã có sẵn này nhỉ?

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 Việc làm IT hấp dẫn tại TopDev

Sập server, làm gì đây?

Bài viết được sự cho phép của tác giả Huỳnh Quán Cẩm

Phỏng vấn

Có nhiều lần đi phỏng vấn tui bị hỏi câu này.

 

Giả sử service tự dưng lăn đùng ra chết không còn gửi được request nữa, bạn sẽ làm gì?

Lần nào được hỏi tui cũng nghĩ một câu chuyện khoa học viễn tưởng rồi phang bừa. Cá nhân tui nghĩ đây là một câu hỏi nhằm đánh giá khả năng tiếp cận & giải quyết vấn đề của bạn, chứ không hẳn là có câu trả lời cụ thể.

Tuy nhiên đi làm thì cũng có lúc … server lăn ra chết thật. Vậy thì bạn sẽ làm gì?

Thực tế

Sau đây là một câu chuyện có thật của các nhân vật hư cấu.

Có một hôm trúng ngay lượt Quần Cam on-call, app của công ty tự nhiên load dữ liệu mới rất chậm, tài khoản Twitter của app được tag liên tục để phàn nàn.

Đây là một sự cố nghiêm trọng vì nó ảnh hưởng đến hầu hết app users. Vì vậy công ty đã quyết định nhanh là cần phải cập nhật lên Twitter để trấn an tình hình. Sau một lúc, lượng retweet tăng lên, lượng phàn nàn giảm xuống.

Ví dụ như tweet cập nhật status của Github mỗi lần con unicorn xuất hiện…

Bài học #1: Đánh giá mức ảnh hưởng và thông báo đến users.

Cùng lúc đó Quần Cam bắt đầu tiến hành xem xét chuyện gì đang xảy ra. Lúc đầu, Quần phán đoán chắc do bên dữ liệu làm ăn sống nhăn không bắn dữ liệu về. Giả thuyết nghe có vẻ hợp lý bởi chuyện này đã từng xảy ra trước đó. Nhưng để nói có sách mách có chứng trước khi gửi mail chửi rủa, Quần kiểm chứng lại thông số trên Grafana. Số liệu hiển thị traffic bên đó vẫn đổ về bình thường.

Bài học #2: Luôn xem bảng thông số sau khi đoán bừa.

Chết server, làm gì đây?

Hình minh hoạ bảng thông số (nguồn: Wikimedia)

Tiếp theo Quần lại nghĩ: Có khi nào tắc nghẽn xảy ra ở load-balancer hay không?. Lần chết service gần nhất là do HAProxy không xử lý kịp các HTTPS handshake, lần này bảng thông số cũng cho thấy những triệu chứng tương tự: một số lượng concurrent session khá lớn. Nghĩ chắc là đúng, Quần đã giảm số lượng HTTPS request từ phía client đi một nửa.

Nhưng hướng tiếp cận đó không giải quyết được vấn đề. Truy hồi về cùng thời điểm ở các tuần trước, bảng thông số đều hiển thị lượng session tương tự. Tóm lại chỉ là do người truy cập vào đông thôi.

Bài học #3: (again) Số liệu có thể đánh lừa bạn.

Lúc này Quần Cam tự thấy là nên nhờ sự trợ giúp từ đồng đội. Năm cái quần vẫn hơn một cái quần.

Chết server, làm gì đây?

  Có gì mới với Server-Side Rendering trong React 16?
  Web server là gì? Hiểu rõ về web server

Bài học #4: Kêu gọi đồng đội nếu cảm thấy cần thiết.

Lúc này Quần và đồng đội đã loại bỏ được giả thuyết là tắc nghẽn xảy ra từ phía traffic, bây giờ họ bắt đầu xem xét phần import dữ liệu. Họ có một con worker để ghi các dữ liệu từ phía cung cấp thông qua một queue. Thông số cho thấy queue đang hoạt động tốt, họ tự hỏi điều gì đó đang diễn ra ở chính con worker.

Đọc logs thì họ thấy các tác vụ diễn ra chậm hơn so với bình thường, đặc biệt là các SQL thực hiện query cực chậm ở một cái bảng. Đọc tới khúc đó, một dev khác là Đầm Cam lập tức nhân ra chị đã phạm một sai lầm trong tuần. Chị có viết một con worker có sử dụng chức năng lock bảng để import dữ liệu cũ vào cái bảng đó. Chị đã rất cẩn thận chạy nó vào 11 giờ đêm hôm trước để tránh ùn tắc nhưng không ngờ nó chạy lâu tới như vậy.

Sau khi biết được lỗi, họ liền tắt con worker đó. Mọi thứ lập tức trở lại bình thường.

Bài học #5: Chọn giải pháp nhanh nhất để phục hồi hệ thống.

Ngay hôm sau, Đầm đã tiến hành đưa toàn bộ các tác vụ của mình vào một con worker có độ ưu tiên thấp hơn, đảm bảo việc vận hành không gây ảnh hưởng đến những critical worker khác.

Bài học #6: Luôn tính toán các giải pháp lâu dài để phòng ngừa sự cố tương tự xảy ra.

Bên cạnh đó Quần Cam ghi ghép lại sự việc để những người khác trong team có thể đọc lại. Nhờ đó mà hôm nay anh ấy có tư liệu để viết blog.

Bài học #7: Note lại các sự cố để làm cơ sở học tập sau này.

Bài viết này có thể giúp tui tăng lương như thế nào?

Như thường lệ bài viết không có giúp bạn tăng lương, nhưng tui có thể rút ra một số điểm để giúp bạn trả lời câu hỏi trên.

Luôn dùng thông số để làm cơ sở tìm lỗi. Luôn thu thập các metrics hệ thống trong quá trình chạy, không có số liệu thì lúc gặp sự cố ta như mò kim đáy bể.

Truy đúng critical failure trước khi đưa ra giải pháp. Dùng kĩ thuật 5-whys hay bất kì cái gì để giúp bạn tìm ra ngọn nguồn sự cố. Tuỳ tiện đưa ra giải pháp dựa trên phán đoán chỉ tốn thời gian của bạn mà không giúp được gì cả.

Chọn giải pháp nhanh nhất để phục hồi hệ thống. Nếu bạn làm việc với hệ thống ảnh hưởng đến hàng triệu user, mỗi giây service không hoạt động đều ảnh hưởng đến việc kinh doanh của công ty, mà như vậy thì ảnh hưởng đến việc nhận lương của bạn chứ chưa nói đến tăng lương. Hãy tìm cách hồi phục hệ thống nhanh nhất có thể, nhưng luôn tính toán một giải pháp lâu dài.

Cái kết

Bạn đồng ý với Quần Cam hay cho rằng tui đang nói tầm bậy? Hãy bình luận ở phía dưới nhé.

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

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

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

Front End Developer và những sai lầm hay gặp ở các “newbie”

Tác giả: John Au-Yeung

Các dev thường dễ mắc sai sót khi làm việc, tuy nhiên hoàn toàn có thể tránh được những sai lầm này nếu biết về nó từ trước. Bài viết này sẽ chỉ ra những lỗi sai mà các newbie front end developer hay gặp nhất và cách để khắc phục chúng như thế nào.

Phụ thuộc quá nhiều vào việc sử dụng Frameworks

Nhiều front end developer có thói quen phụ thuộc hoàn toàn vào frameworks dù rõ ràng  vẫn có thể tự làm được những việc đó mà không cần dùng đến framework. Vậy nên tốt nhất, hãy chỉ dùng framework khi đã thành thạo với các cấu trúc JavaScript đơn giản và thao tác DOM. Nếu không thì sẽ khó mà hiểu được nguyên lý hoạt động của vấn đề đó.

Xem thêm Top 7 JavaScript Frameworks

Front end Developer không nên đặt tất cả code ở một chỗ

JavaScript đã có các module tiêu chuẩn những năm gần đây nên không có lí do gì để sử dụng các scripts quá dài nữa. Hãy sử dụng module để chia code thành các phần khác nhau để dễ quản lý hơn. Bạn cũng không nên sử dụng biến toàn cục – global variables nữa mà hãy chuyển sang sử dụng nhiều biến xuất trên từng module.

Ngoài ra, nếu  muốn gom các code thành một custom component, front end developer có thể sử dụng web components API để thực hiện và sử dụng ở bất kỳ nơi nào. Các project được tạo bởi framework đều chia code thành các module, đây là phương pháp tốt nhất mà bạn nên thực hiện để tránh các sai lầm.

Nhiều công ty tuyển dụng Frontend Developer đãi ngộ tốt, ứng tuyển ngay!

Sử dụng Inline-styles

Inline-styles làm trang làm việc của lập trình viên lộn xộn hơn nên hãy chuyển chúng vào một file CSS để làm gọn lại và có thể tái sử dụng cùng một kiểu ở nhiều nơi.

Không loại bỏ các phần thừa thãi

Block elements có chiều rộng 100% sẽ trở nên dư thừa. Các front end developer không cần đặt chiều rộng của nó 100% vì nó được mặc định theo 100% chiều rộng của element phần tử chứa nó. Chrome sẽ cảnh báo khi phát hiện có quá nhiều phần tử không cần thiết trên trang.

Các front end developer không tối ưu hóa hình ảnh

Nhiều trường hợp vẫn chưa có kết nối ổn định, nên để có chất lượng ảnh tốt nhất bạn hãy nén các file ảnh lại. Cũng không nên sử dụng nhiều hình ảnh có kích thước megabytes vì sẽ mất rất nhiều thời gian để tải xuống và tốn nhiều băng thông hơn.

  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
  20 công cụ và tài liệu hay ho dành cho Front-end

Sử dụng Bootstrap cho Layout (bố cục)

Sử dụng Bootstrap sẽ phát huy hiệu quả tốt nhất khi flexbox và grid được phát hành hoặc khi nó không có sẵn nhiều trên các trình duyệt. Hiện tại đã có thể sử dụng cả hai để tạo layout cho page, kể cả Bootstrap cũng sử dụng flexbox và grid cho layout của mình.

Nên thay vì sử dụng Bootstrap các front end developer nên sử dụng flexbox và grid để tạo layout dễ dàng hơn. Chúng ta có thể quên các nguyên tắc cơ bản khi tạo layout nếu phụ thuộc quá nhiều vào Bootstrap.

Xem thêm Bootstrap là gì? Tặng 20 Templates Bootstrap miễn phí

Không sử dụng tag Heading cho mục đích tạo kiểu

Thẻ heading sẽ giúp người đọc phân biệt được các đề mục trong một bài viết và ảnh hưởng đến tiêu chuẩn SEO, do đó hãy điều chỉnh các thẻ heading sao cho hợp lý để tăng chất lượng bài viết.

Nhúng phông chữ sai cách

@font-face dùng để chỉ định tên phông chữ cho các chữ được nhập, nhưng vẫn có thể thay đổi độ đậm nhạt và giữ nguyên tên trong cả khối đối với phông chữ thông thường so với các phông chữ khác.

Ví dụ, thay vì viết như sau:

@font-face {
  font-family: 'Open Sans';
  src: url('opensans.woff2');
}

@font-face {
  font-family: 'Open Sans Bold';
  font-weight: bold;
  src: url('opensans-bold.woff2');
}

Chúng ta nên viết:

@font-face {
  font-family: 'Open Sans';
  src: url('opensans.woff2');
}

@font-face {
  font-family: 'Open Sans';
  src: url('opensans-bold.woff2');
}

Sau đó đặt cỡ chữ theo kiểu của mình và phông chữ sẽ được chọn tự động từ chữ có kích cỡ phù hợp hoặc các kiểu khác trong danh sách.

Ví dụ, chúng ta có thể sử dụng Open Sans như sau:

.foo {
  font-family: 'Open Sans';
  font-weight: bold;
}

Sau đó, trình duyệt sẽ chọn mặt phông chữ Open Sans đã font-weight được đặt thành đậm.

Kết luận

Inline-styles không thật sự hiệu quả nên chúng ta hãy chuyển sang tệp CSS để có thể sử dụng lại. Bên cạnh đó, hãy nhúng phông chữ đúng cách với lệnh @font-face. Và vì có nhiều người dùng kết nối chậm hơn nên hãy tối ưu hóa bài viết cho phù hợp nhất để mọi người đều có thể tiếp cận được. Trên đây là một số vấn đề mà các front end developer nên xem qua để tránh gặp sai sót khi lập trình.

Phỏng dịch theo bài viết gốc tại dev.to

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

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

6 công cụ tuyển dụng phổ biến trong ngành Nhân sự

Việc xây dựng một đội ngũ nhân sự tiềm năng rất quan trọng. Và để làm được điều này, các công cụ hỗ trợ tuyển dụng thật sự đóng vai trò hữu ích. Bài viết sau đây sẽ bật mí với bạn 6 công cụ giúp hợp thức hóa quy trình tuyển dụng nhân sự. Đây được xem là giải pháp thiết thực giải quyết bài toán tuyển dụng của các doanh nghiệp vừa và nhỏ.

1. BambooHR

BambooHR là một nền tảng nguồn nhân lực hoàn chỉnh. Nó bao gồm các công cụ tiện ích tuyển dụng nhân sự như: hệ thống theo dõi người nộp đơn, cơ sở dữ liệu các nhân của ứng viên,… Ngoài ra, công cụ này là một bộ phần mềm có thể giúp bạn quản lý và đánh giá nhân viên của mình. 

tuyển dụng nhân sự

BambooHR được đánh giá là dễ sử dụng, đáp ứng hoàn toàn các nhu cầu. Những vấn đề về theo dõi ứng viên tích hợp, chữ ký điện tử; hệ thống hóa cơ sở dữ liệu và quản lý hiệu suất công việc,.. đều được giải quyết tối ưu.

2. XOR

XOR là một mô hình chatbot được thiết lập trên nền tảng sử dụng trí thông minh nhân tạo.

  AI và những điều bạn cần phải có trước khi đụng tới AI

tuyển dụng nhân sự

Mục đích là để hướng dẫn ứng viên xuyên suốt quá trình tuyển dụng. Đồng thời, giúp ứng viên xác định sự phù hợp của họ đối với vị trí cần ứng tuyển. Một số hữu ích từ công cụ này phải kể đến việc giảm thiểu những khó khăn trong quá trình tuyển dụng. 

Với hình thức là một chatbot, XOR giúp tôi ưu hóa thời gian tuyển dụng. Cụ thể, nó giúp sàng lọc trước các ứng cử viên. Từ đó, đưa ra các định hướng về phương án trả lời phù hợp nhất.

3. JazzHR

JazzHR được biết đến là một hệ thống cho phép bạn theo dõi ứng viên suốt quá trình tuyển dụng; tạo và phân phối các bài đăng về công việc để thu hút ứng viên. 

Công cụ tuyển dụng này rất tiềm năng và đáp ứng đủ các tiêu chí của vị trí hiện tại. JazzHR cho phép người dùng cập nhật các mô tả công việc. Đồng thời, triển khai chúng lên các trang web tìm việc khác nhau như LinkedIn, Glassdoor,… Nó có một hệ thống theo dõi ứng viên rất tuyệt vời. Một điểm đặc biệt nữa chính là nó cho phép bạn quản lý toàn bộ quá trình phỏng vấn thông qua hệ thống.

Xem thêm: Kinh nghiệm sử dụng Linkedin hiệu quả cho tuyển dụng nhân sự 

tuyển dụng nhân sự

Cụ thể, nó bao gồm một công cụ báo cáo, đánh giá quy trình; cho phép số hóa tất cả những giấy tờ liên quan đến nhu cầu tuyển dụng. Hiện nay tại Việt Nam cũng đã có xuất hiện platform hỗ trợ tuyển dụng tích hợp. Không dừng lại ở việc theo dõi vị trí tuyển dụng, chúng còn là nền tảng chung cho ứng viên để tương tác đọc blog, tạo CV online. Từ đó tạo thêm nguồn ứng viên tiềm năng cho doanh nghiệp với mức chi phí tối ưu từ phía TopDev.

4. Merlin

Merlin là một công cụ tuyển dụng dành riêng cho các ứng viên thuộc nhóm người lao động phổ thông.

tuyển dụng nhân sự

Dịch vụ của Merlin tập trung vào các ngành nghề và lao động. Chúng tập hợp những người có nhu cầu tìm việc và định hướng nghề nghiệp chung; mang lại cho họ những cơ hội.

Merlin có một cổng thông tin cho cả người sử dụng lao động và người lao động. Nó được dùng để duy trì quan hệ đối tác với các thương hiệu lớn. Chính điều này tạo ra các lợi thế lớn hơn trong việc tìm kiếm các ứng viên phù hợp.

5. ClearCompany

ClearCompany không đơn thuần tìm kiếm nguồn ứng viên mới, mà nó còn giúp bạn xây dựng hệ thống quản lý khi họ bắt đầu làm việc cho bạn. Các chức năng chuyên dụng của công cụ này: thu nhận tài năng thông qua tuyển dụng, quản lý hiệu suất công việc trong toàn bộ quá trình. 

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

tuyển dụng nhân sự

ClearCompany còn cung cấp một quy trình với sự vận hành hoàn hảo. Các nhân viên được đảm bảo định hướng rõ về các quy trình làm việc và thăng tiến. 

6. Facebook Jobs

Facebook Jobs ra đời với mục đích kết nối những người lao động có nhu cầu tìm việc với các doanh nghiệp. Không có gì ngạc nhiên khi Facebook tiến hành phát triển không gian việc làm sau khi tung ra Facebook Marketplace.

Đối với các doanh nghiệp vừa và nhỏ, Facebook Jobs là một công cụ thật sự hữu ích. Vì nó giúp tìm kiếm nguồn lao động có sẵn ở phạm vi lân cận. Tuy nhiên, bạn vẫn phải đảm bảo các quy trình tuyển dụng nhân sự từ khi bắt đầu. Điều này giúp giảm thiểu những rủi ro có thể xảy đến. Đồng thời, bạn có thể nắm bắt và sử dụng công cụ một cách tốt nhất. 

Lời kết

Trong bất kỳ công việc nào thì việc sử dụng các công cụ phù hợp là điều rất quan trọng. Mỗi công cụ với đặc tính, chức năng khác nhau và tùy vào từng vị trí trong quy trình tuyển dụng mà bạn nên lựa chọn những công cụ hỗ trợ tương ứng. Bạn nên dành thời gian để tự mình xác định xem các công cụ này có thật sự phù hợp với quá trình tuyển dụng hay không. Đối với quá trình tuyển dụng của các doanh nghiệp vừa và nhỏ thì đây được xem là bí quyết giúp tiết kiệm thời gian, đơn giản hóa và mang lại hiệu quả cao.


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:

Xem thêm Việc làm IT lương cao trên TopDev

Top 7 công ty công nghệ Hàn Quốc tại Việt Nam mà các lập trình viên không nên bỏ qua

Việt Nam đang bước vào thời kỳ công nghệ 4.0, vai trò của công nghệ ngày càng trở nên thiết yếu đối với nhiều hoạt động trong đời sống. Bên cạnh đó, Việt Nam được xem là “mảnh đất màu mỡ” với các công ty công nghệ Hàn Quốc đến và mở rộng thị trường hoạt động. 

Một trong những sự kiện lớn trong ngành công nghệ tại Việt Nam năm 2020 chính là sự hợp tác giữa Korea IT Cooperation Center tại TP. HCM (KICC HCMC) và Nền tảng tuyển dụng chuyên về IT hàng đầu Việt Nam – TopDev. Sau cái bắt tay chiến lược này, các nhân tài công nghệ càng có nhiều lựa chọn hơn khi tìm kiếm nơi phát triển sự nghiệp lập trình phù hợp, đặc biệt nhất chính là cơ hội trải nghiệm môi trường làm việc chuyên nghiệp tại nhiều công ty công nghệ tiên tiến đến từ Hàn Quốc.

Mời bạn khám phá Top 7 công ty công nghệ Hàn Quốc xuất hiện trong kỳ này để nắm bắt cho chính mình cơ hội tốt và phù hợp nhất nhé!

Top 7 công ty công nghệ Hàn Quốc tại Việt Nam mà các lập trình viên không nên bỏ qua

1. DaouKiwoom Innovation

DaouKiwoom Group là một trong những công ty hàng đầu về CNTT và dịch vụ tài chính của Hàn Quốc với tổng doanh thu 2,2 tỷ USD, lợi nhuận 1 tỷ USD và có hơn 5.000 nhân viên vào năm 2020. 

DaouKiwoom Group đã mở rộng sang Mỹ, Nhật Bản, Trung Quốc, Indonesia, Pháp và Việt Nam. Tạo ra những bước phát triển vượt bậc trong lĩnh vực CNTT, tài chính và dịch vụ.

⇒ Nếu bạn đang tìm kiếm một nơi để bạn có thể phát triển những kỹ năng của mình, một môi trường làm việc chuyên nghiệp, năng động, hãy đến với DaouKiwoom Innovation. Nhiều vị trí mới cùng mức lương hấp dẫn đang chờ đợi bạn.

2. Smilegate Việt Nam

Smilegate là công ty có trụ sở chính tại Hàn Quốc, thành lập từ năm 2002. Hoạt động kinh doanh trong các lĩnh vực phát triển trò chơi điện tử, dịch vụ và đầu tư. Với định hướng của mình, Smilegate mong muốn trở thành đối tác phát triển nền tảng và dịch vụ tốt nhất tại Việt Nam và Đông Nam Á. 

Smilegate luôn tìm cách thúc đẩy sự phát triển của nền tảng bằng cách chiêu mộ các nhân tài trong ngành, chuyên quản lý việc phát triển & vận hành các sản phẩm, dịch vụ và nền tảng.

Nếu bạn đang tìm kiếm một môi trường làm việc tuyệt vời cùng đãi ngộ xứng đáng, Smilegate Việt Nam hứa hẹn sẽ là điểm đến lý tưởng cho sự phát triển của sự nghiệp bạn.

3. HANBIRO Việt Nam

Hanbiro Việt Nam là công ty có vốn đầu tư từ Hàn Quốc, là nhà cung cấp CNTT-TT chuyên về vận hành quản lý máy chủ, phát triển và bán phần mềm (Mail, Groupware, CRM). Công ty Hanbiro có 5 chi nhánh trên khắp thế giới như Hàn Quốc, Việt Nam, Nhật Bản, Mỹ và Trung Quốc. 

Làm việc tại Hanbiro Việt Nam, bạn có thể tận hưởng môi trường sáng tạo và năng động để khuyến khích người lao động nghĩ khác và thử cách mới. Bên cạnh đó, khi làm việc với các chuyên gia cao cấp của Hàn Quốc, bạn có thể học hỏi được nhiều kinh nghiệm và có cơ hội được đi nước ngoài.

Hãy trở thành một thành viên của đại gia đình Hanbiro Việt Nam, để được “làm điều mình thích và yêu điều mình làm” bạn nhé. 

4. Công ty TNHH Megazone Việt Nam

Megazone Cloud là một trong những nhà cung cấp dịch vụ quản lý đám mây (MSP) lớn nhất ở khu vực Châu Á Thái Bình Dương. Kể từ khi thành lập vào năm 1998 công ty đã cung cấp các dịch vụ CNTT đến doanh nghiệp và hiện có hơn 1000 chuyên gia. Các khách hàng của Magezone là các “ông lớn” như Samsung Electronics Co. và LG Electronics Inc. đến các tổ chức tài chính và công ty khởi nghiệp.

Gần đây, Megazone đang tích cực mở rộng thị trường toàn cầu bằng cách thành lập các công ty con ở nước ngoài tại Hoa Kỳ, Nhật Bản, Trung Quốc, Việt Nam,… 

Nếu bạn đang tìm kiếm một nơi làm việc vừa có nhiều đãi ngộ tốt vừa được thể hiện năng lực với các đối tác lớn trong và ngoài nước thì Megazone chính là lựa chọn phù hợp nhất!

Vị trí Full-Stack Java Software Engineer tại Megazone Việt Nam vẫn đang chờ bạn đế khám phá và chinh phục.

5. BrickMate Group

BrickMate Group (BMG) là một công ty phát triển CNTT toàn cầu có trụ sở chính tại Seoul, Hàn Quốc. Công ty bao gồm các kỹ sư và hơn 300 nhà phát triển đến từ Hàn Quốc và Việt Nam giải quyết các vấn đề liên quan đến việc phát triển phần mềm, giải pháp thương mại điện tử, ứng dụng kinh doanh,…

BrickMate đã và đang làm việc với nhiều công ty khởi nghiệp và là đối tác phát triển web/ứng dụng với một số doanh nghiệp nổi tiếng như Samsung, Kyobo, LG, Megazone,…

Nắm bắt ngay cơ hội trở thành một nhân tố tài năng của BrickMate Group, những vị trí tuyển dụng mới đang chờ bạn apply!

6. TSB Vietnam

Total Soft Bank Ltd. là công ty đến từ Hàn Quốc cung cấp các giải pháp logistics hàng hải và TSB Việt Nam là công ty con của Total Soft Bank. Đây là một trong những công ty hàng đầu thế giới về các giải pháp hậu cần hàng hải. 

TSB Vietnam được xem như là trung tâm QA và R&D của Total Soft Bank tại Việt Nam với mục tiêu biến trung tâm này thành một tổ chức phát triển phần mềm cạnh tranh và đầy thách thức.

Cơ hội việc làm cho các lập trình viên tại TSB Vietnam luôn rộng mở. Tham gia ngay hôm nay với vị trí Software Developers (Java/PHP/C#) bạn nhé!

7. Công ty cổ phần GO2JOY VIỆT NAM

Go2Joy là công ty có vốn đầu tư nước ngoài, chuyên về phát triển ứng dụng di động. Sau 3 năm hoạt động, công ty tự hào là đơn vị hàng đầu cung cấp ứng dụng đặt phòng theo giờ với hơn 100,000++ lượt tải xuống và 20,000++ người thật check-in từ ứng dụng.

Với nhu cầu mở rộng không ngừng, Go2Joy đang tìm kiếm những nhân viên chuyên nghiệp, trẻ trung, năng động, có chí cầu tiến để gia nhập vào đội ngũ cùng mang đến những tính năng mới, ưu việt hơn cho ứng dụng.

⇒ Bạn hoàn toàn có thể sở hữu ngay 1 trong 2 slot tại Go2Joy để trực tiếp trải nghiệm những điều đáng mong chờ cho sự nghiệp:

Software Development Manager (PHP/Laravel 7,8/Native/Flutter)

Top 7 công ty công nghệ Hàn Quốc tại Việt Nam mà các lập trình viên không nên bỏ qua

Với sự xuất hiện của Top 7 công ty công nghệ Hàn Quốc trong kỳ này, hi vọng bạn sẽ có thêm những thông tin cực hữu ích và sớm tìm được môi trường làm việc phù hợp nhất để có thể thỏa sức đam mê và bung xõa hết mọi giới hạn của bản thân.

⇒ Và đừng quên, KICC HCMC X TopDev sẽ còn mang đến cho cộng đồng IT Việt Nam nhiều cơ hội mới. Hãy chờ đón những bài viết tiếp theo cùng những cơ hội mới hấp dẫn bạn nhé!

________________________________

Dự án được hỗ trợ bởi Korea IT Cooperation Center tại TP. HCM (KICC HCMC) – thuộc Cơ quan Xúc tiến CNTT Hàn Quốc (NIPA), phối hợp cùng TopDev – Nền tảng tuyển dụng CNTT hàng đầu tại Việt Nam với mục đích thúc đẩy tuyển dụng việc làm CNTT cũng như quảng bá cho Korean IT Companies trong cộng đồng lập trình viên lớn nhất tại Việt Nam.

Liên hệ: Korea IT Cooperation Center tại TP. HCM (KICC HCMC)

☎️ Hotline: 84 28 35208135 (Vietnamese) | 84 28 35208136 (Korean)

E-mail: HCMC@nipa.kr

Address:135 Hai Bà Trưng, Phường Bến Nghé, Quận 1, Thành phố Hồ Chí Minh

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

Code Đức

Bài viết được sự cho phép của tác giả Huỳnh Quán Cẩm

Bắt đầu một câu chuyện

Vài ngày trước một người bạn nhờ tui xem giùm trang web của nó bị người dùng phàn nàn là hack tiền ảo.

Tui mò vào thì thấy cái này.

Code Đức

Đây là một script sẽ chạy mỗi khi bạn truy cập vào trang web, “hâm nóng” CPU của bạn một chút, và “làm dày” túi tiền của chủ nhân script đó một chút bằng cách đào tiền ảo Monero.

Trang web này bạn tui nhờ một bên developer tên X phát triển website. Tui nghi ngờ X đã làm điều này, nhưng tui chưa đủ bằng chứng xác thực (chắc tui không bao giờ có). Đó là lý do vì sao tui không công bố tên.

Vì sao tui lại nghĩ thế?

Ban đầu tui nghĩ cái script này do X tắc trách cài theme WordPress lậu mà bị dính đòn, sau đó tui bác bỏ vì trang staging không có.

Giả thiết khác là website bị hack, cơ mà một hacker nghiệp dư nhất cũng biết phải alias CoinHive dưới một tên khác, và … đừng đặt tên biến là miner .

Khi phản ánh về vấn đề này, developer đổ thừa cho nhà cung cấp hosting Y (thuộc dạng lớn nhất Việt Nam hiện nay) với luận điệu vì Y có access của hosting nên Y đã làm việc này. Không biết bạn sao chứ tui thấy thật là .

Nếu nhất thiết phải chọn một bên giữa X và Y để tin, xin lỗi tui chọn Z #ahihi. Tại sao? #ahihi cái nữa, vì tui thích.

Sự chuyên nghiệp

Đôi khi, chỉ cần một phút yếu lòng buông thả bản thân, ai cũng có thể sa vào lối suy nghĩ ai biết đâucó chết ai đâuchắc không sao.

  • CPU nóng lên một chút có chết ai đâu.
  • Trễ deadline một chút chắc không sao.
  • Cái lỗi nhỏ xíu như vậy ai phát hiện đâu.

Từ đó ta luôn có thể lầy hơn.

  • Cài script đào chút coin chút có chết ai đâu.
  • Làm freelance trong giờ làm việc có ai biết đâu.
  • Ứng dụng có lỗi bảo mật cơ mà tạm thời chắc không sao. #yolo

Hầu như ai cũng đồng ý như vậy là không chuyên nghiệp. Bản thân tui cũng từng không chuyên nghiệp. Tui cũng từng gặp nhiều người không chuyên nghiệp. Khi làm những việc không chuyên nghiệp, vô hình trung ta đạp đổ chén cơm của chính mình và tạo ra tiếng thúi cho những người làm nghề chân chính.

Đứng trước ngưỡng chuyên nghiệp thì bạn có hai lựa chọn … một bạn là một trong số họ, hai bạn là số còn lại.

Tỏ ra chuyên nghiệp chính là bạn đang tôn trọng cái nghề của mình.

  "Code dễ đọc" là như thế nào?
  Vừa học vừa chơi! Top 15+ game lập trình miễn phí

Code đức

Vậy như thế nào mới được gọi là chuyên nghiệp? Hơn nữa chuẩn đạo đức của mỗi người khác nhau, làm sao để ta tránh được việc dùng tiêu chuẩn của bản thân để đánh giá người khác?

Mỗi ngành đều có đạo đức nghề nghiệp riêng, như chuẩn mực để những người làm nghề tuân theo. Ví dụ như ngành Y tế có Y đức, ngành vận tải có đạo đức của tài xế thì ngành Phần mềm cũng phải có “Code Đức”. IEEE-CS và ACM có một bản code đức như thế tên là Software Engineering Code of Ethics and Professional Practice.

Bản code đức này gồm 8 nguyên tắc về public interestclient & employersản phẩmsự phán xétquản lýnghề nghiệpđồng nghiệp và bản thân.

Tui sẽ tóm tắt lại một số điểm quan trọng.

1) Chỉ approve sản phẩm khi tin rằng nó an toàn

Bạn không cung cấp các sản phẩm không an toàn (như chèn CoinHive script chẳng hạn), làm giảm chất lượng cuộc sống, hay khi biết chắc rằng nó sẽ ảnh hưởng tiêu cực đến người khác.

2) Sẵn sàng đóng góp kĩ năng của mình cho các mục đích tốt

Theo cách hiểu của tui thì là giúp đỡ các bạn newbie, đóng góp cho các phần mềm mã nguồn mở, nâng cao cảnh giác của mọi người về bảo mật, vv.

3) Thành thật về kinh nghiệm và kĩ năng.

Không khai man CV, không chém gió về khả năng của mình, không nhận những gì mà mình không làm. Theo tui nghĩ thì nếu không tuân theo nguyên tắc này, ảnh hưởng tiêu cực cho bạn nhiều hơn là cho cộng đồng.

4) Giữ bí mật thông tin có được trong quá trình làm việc.

Đơn giản là đừng làm ông chú ở Viettel.

5) Không chấp nhận các job ngoài luồng mà ảnh hưởng đến công việc chính

Tui từng gặp nhiều bạn thiếu chuyên nghiệp đến mức mang tiếng OT để ở lại công ty làm freelance, đến nỗi trễ cả deadline.

6) Cố gắng tối đa để đưa ra sản phẩm chất lượng cao, với một acceptable cost và schedule.

Không phóng đại deadline, không vẽ thêm việc để làm, không charge tiền khách hàng quá mức.

7) Trả lương công bằng

Ngược lại là một nhà quản lý, phải đảm bảo việc trả lương công bằng cho developer.

8) Luôn không ngừng nâng cao bản thân

Dev phải cầu thị, luôn học hỏi để nâng cao trình độ kĩ thuật và kinh nghiệm của bản thân.

Bài viết này sẽ giúp tui tăng lương như thế nào?

Như thường lệ bài viết không có giúp bạn tăng lương. Nhưng mà:

Tui mong nó góp một phần nhỏ trong việc: tăng nhận thức về sự chuyên nghiệp, từ đó ta có một cộng đồng sạch hơn, thơm hơn, lành mạnh hơn.

Bạn có thể cài No Coin, một extension để chặn các script đào coin trên trình duyệt Chrome.

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

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

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

Hàm Python do người dùng tự định nghĩa

Bài viết được sự cho phép của ucode.vn

Bên cạnh các hàm Python tích hợp sẵn, bạn còn có thể tự định nghĩa hàm Python, những hàm này gọi là hàm Python do người dùng định nghĩa (user-defined functions). Việc sử dụng những hàm tự định nghĩa này có lợi ích gì, cách để định nghĩa hàm trong Python ra sao, chúng ta sẽ tìm hiểu trong bài này.

Tìm việc làm python các vị trí to 20M

Hàm Python do người dùng định nghĩa là gì?

Các hàm mà ta tự mình định nghĩa để thực hiện một số công việc cụ thể được gọi là hàm do người dùng định nghĩa. Việc định nghĩa hàm và gọi hàm đã được đề cập đến trong bài hàm Python.

Các hàm có sẵn trong Python được gọi là hàm tích hợp. Nếu ta sử dụng những hàm được người dùng khác viết dưới dạng thư viện, thì những hàm này gọi là hàm thư viện (library function). Như vậy, hàm ta tự định nghĩa có thể trở thành một hàm thư viện đối với người dùng nào đó.

Ưu điểm khi sử dụng hàm Python do người dùng định nghĩa

Hàm do người dùng định nghĩa giúp phân tích một chương trình lớn thành những phần nhỏ, khiến chương trình dễ hiểu, dễ duy trì và gỡ lỗi hơn.
Khi một đoạn code bị lặp lại trong chương trình, thì có thể sử dụng hàm để gom đoạn code này lại và chạy khi cần bằng cách gọi hàm.
Các lập trình viên cùng làm việc trong một dự án lớn, có thể phân chia công việc cho nhau bằng cách tạo các hàm khác nhau.

  11 tip học Python dành cho các “newbie”
  20 tài liệu học Python thiết thực để trở thành lập trình viên chuyên nghiệp

Ví dụ về hàm do người dùng tự định nghĩa

Để định nghĩa một hàm, bạn đã biết khi tìm hiểu về tổng quan về hàm Python. Ở đây, mình sẽ nhắc lại cú pháp cơ bản khi định nghĩa 1 hàm:

def ten_ham(DoiSo1,DoiSo2,...,DoiSon)

    khối lệnh của hàm

Ví dụ:

def them_so(a,b):
 tong = a + b
 return tong

so1 = 5
so2 = 6
so3 = int(input("Nhập một số: "))
so4 = int(input("Nhập một số nữa: "))

print("Tổng hai số đầu là: ", them_so(so1, so2))

print ("Tổng của hai số sau là: ", them_so(so3, so4))

Trong ví dụ trên, hàm int(), input(), print() là hàm tích hợp sẵn trong Python. Ở đây, chúng ta định nghĩa hàm them_so(), có chức năng là thêm hai số, tính tổng 2 số và trả về kết quả. Đầu ra của chương trình này như sau:

Nhập một số: 8
Nhập một số nữa: 10
Tổng hai số đầu là: 11
Tổng của hai số sau là: 18

Việc đặt tên hàm theo chức năng hoặc nhiệm vụ của hàm sẽ giúp người đọc code dễ hiểu hơn, bạn nên luyện tập điều nay khi code.

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

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

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

Lập trình viên có cần biết về UI/UX?

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Chúng ta là lập trình viên. Chúng ta bỏ ra bốn, năm năm để học và để hành về những thuật toán, những dữ liệu. Vậy hẳn công việc của chúng ta chỉ có thể là code rồi! Code chạy càng nhanh, càng khoẻ thì càng thành công. Tại sao lại phải quan tâm đến UI/UX cơ chứ? Chẳng phải công ty đã thuê designer rồi sao?

Có thật như thế không?

Đã bao giờ bạn tự nói với mình thế này chưa: “Người dùng thật ngu ngốc, cái nút ở ngay đó mà họ không nhìn thấy”? Hay thế này: “Website load cực nhanh, thực hiện chức năng nào cũng nhanh mà họ kêu hơi lag lag”?

Đã bao giờ bạn nổi khùng lên với đám designer vì hình như “chúng nó” cứ cố ý chơi khăm? Chúng nó cứ làm ra những thiết kế khó code cực kỳ. Chúng nó cứ bắt sửa lại những chỗ mình mất bao công mới code được. Những chỗ ấy sửa rồi cũng chả khác gì ban đầu. Hỡi ôi! Khác gì chuyện cắt tóc của con gái cơ chứ!

Thế nhưng, bạn ạ…

Không phải cứ bạn sử dụng tốt thì người dùng cũng sử dụng tốt. Không phải cứ thiết kế cho dễ code thì sản phẩm cuối sẽ dễ dùng. Thuật toán ghê gớm làm gì nếu người ta phát ngán lên không thèm động vào phần mềm của bạn?

>>> Xem thêm: UI UX là gì? Công việc của một UX/UI designer

Lập trình viên biết UI/UX có lợi gì?

Tất nhiên rồi, bạn sẽ mở lòng hơn với người dùng và designer. Bạn sẽ không đem bực bội ấy ra đường. Bạn sẽ không phải tìm đến “trà đá kem cheese” để giải toả. Và như thế thì tỉ lệ tai nạn giao thông, tỉ lệ tệ nạn xã hội ở Việt Nam sẽ giảm mạnh. Việt Nam sẽ sớm trở thành cường quốc hàng đầu thế giới. Tiếng Việt sẽ sớm là ngôn ngữ duy nhất trên địa cầu.

Đùa thôi! Bạn phải hiểu làm thế nào thì người dùng thấy dễ dùng, thấy thích dùng. Có thế bạn mới làm chủ được sản phẩm, đúng không nào? Có thế thì cái mà bạn code ra mới có ích, có chất lượng được, phải không? Nhờ biết về UI/UX, bạn sẽ phát triển hơn qua từng ngày.

>>> Xem thêm: Bí kíp vượt qua 7 câu hỏi phỏng vấn UI/UX Designer thường gặp

Lập trình viên có cần biết về UI/UX?

Làm sao để nâng cao kỹ năng thiết kế UI/UX?

Là một lập trình viên, làm sao để ta hiểu UI/UX tốt hơn? Có cần phải có chút năng khiếu, chút hoa tay không? Có cần phải sắm một bộ não thật sáng tạo không?

Stephen McLean nói về điều ấy rất tốt. Bài của ông này trên freeCodeCamp. Nếu muốn đọc toàn bộ, hãy truy cập link này. Hoặc bạn có thể đọc những ý chính dưới đây.

Chăm chỉ học

Nếu bạn sinh ra đã là phù thuỷ của UX, điều ấy rất tốt. Nhưng con đường này không trải hoa hồng. Chỉ có luyện tập mới làm bạn tốt lên. Xuất phát điểm của bạn tốt hay kém, bạn đều có thể học. Bạn đã học được cách code, vậy bạn cũng sẽ học được UI/UX.

Nhìn. Nghĩ. Và ăn trộm.

Cũng như code vậy, bạn phải xem người khác làm gì, nghĩ xem tại sao họ làm thế. Và nếu họ làm tốt? Tất nhiên rồi, sao không tiện tay “cuỗm” luôn những kinh nghiệm ấy? Picasso đã bảo “Good artists copy, Great artists steal”.

Theo chân các lý thuyết

Ta đã biết về S.O.L.I.D. Ta đã được nghe là phải làm theo các design pattern. Với UI/UX cũng có những thứ như vậy. Học chúng, và ta sẽ không cần mò mẫm theo kinh nghiệm.

UI UX tuyển dụng nhiều vị trí, lương cao trên TopDev

Thực hành

Điều này thật dễ hiểu. Học đi đôi với hành mà. Làm sao ta có thể tốt một thứ gì nếu chưa từng động tay vào?

Đừng bỏ cuộc

Thiết kế với ta rõ ràng chẳng dễ dàng. Nhưng nếu ta sớm dừng cuộc chơi thì đám designer sẽ tiếp tục cười vào mặt ta. Người dùng cũng sẽ tiếp tục phàn nàn. Vậy nên, hãy tiếp tục dù chân bạn có mỏi rã rời.

Bài viết gốc được đăng tải tại kinhnghiemlaptrinh.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

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

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

Shifting left là một nguyên tắc phát triển, nêu rõ rằng bảo mật sẽ di chuyển từ bên phải (hoặc kết thúc) của vòng đời lập trình phần mềm (SDLC) sang bên trái (bắt đầu). Nói cách khác, bảo mật nên được thiết kế và tích hợp vào tất cả các giai đoạn trong quá trình phát triển. Sự thay đổi mới này đòi hỏi các nhà phát triển phải có quyền sở hữu an ninh và hiểu về các nguyên tắc bảo mật. Tin tốt là có rất nhiều công cụ có sẵn để giúp các nhà phát triển trong quá trình này.

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

Trong bài viết này, chúng ta sẽ chia Bảo mật Ứng dụng thành các lĩnh vực chính và tìm hiểu một số giải pháp mã nguồn mở miễn phí giúp các nhà phát triển và tổ chức đảm bảo mọi giai đoạn của SLDC, các thay đổi này giúp họ cải thiện chất lượng và bảo mật tổng thể phần mềm của họ.

Shifting left giống như thêm công việc bổ sung vào phần mềm của nhà phát triển, nhưng trên thực tế, nó cho phép các nhà phát triển tìm hiểu thêm về thực tiễn bảo mật, giúp giảm thời gian sữa lỗi và mất thêm một chút thời gian hơn để xây dựng các ứng dụng tuyệt vời.

Bảo mật ứng dụng trong quá trình lập trình phần mềm

Điều quan trọng nhất là bạn phải nhận ra rằng tất cả các lỗ hổng bảo mật ứng dụng không thể được sửa chữa bởi một phần mềm duy nhất. Bảo mật thành công đòi hỏi phải tiếp cận nhiều lớp với nhiều tuyến phòng thủ cho các giai đoạn khác nhau của SDLC.

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

Các công cụ chúng ta sẽ tìm hiểu bao gồm:

  • SAST – Static Application Security Testing (Kiểm tra bảo mật ứng dụng tĩnh)
  • DAST – Dynamic Application Security Testing (Kiểm tra bảo mật ứng dụng động)
  • IAST – Integrated Application Security Testing (Kiểm thử bảo mật ứng dụng tích hợp)
  • RASP – Run-time Application Self Protection (Tự bảo vệ ứng dụng trong thời gian chạy)
  • Dependency Scanning
  • Secrets Detection

Mặc dù sự thật là các lỗ hổng được chọn để kiểm tra sớm sẽ rẻ và dễ dàng khắc phục hơn, bạn không thể tìm kiếm tất cả các lỗ hổng trong giai đoạn đầu của quá trình phát triển. Bảo mật cần phải trải đều và được quan tâm trong toàn bộ quá trình SDLC.

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

  Bảo mật web - Một số kiểu tấn công
  Tìm hiểu về thuật ngữ bảo mật

SAST

Static Application System Testing – còn được gọi là “white box testing”, xuất hiện sớm nhất và là loại phổ biến nhất về bảo mật ứng dụng tự động. SAST quét mã nguồn của ứng dụng để tìm mọi lỗ hổng đã biết. Vì SAST không yêu cầu ứng dụng biên dịch hoặc chạy khi tìm lỗ hổng (không giống như DAST), nên nó được triển khai rất sớm trong SDLC.

Xem thêm:  Hướng dẫn nhận Code giảm giá Lazada 50K

Nó cũng thực hiện các hướng dẫn và tiêu chuẩn mã hoá mà không cần thực thi mã cơ bản. Danh mục thử nghiệm ứng dụng này có sẵn rất nhiều giải pháp, vì vậy khi quyết định sử dụng một giải pháp, hãy đảm bảo giải pháp đó được hỗ trợ và thường xuyên được cập nhật. Dưới đây là một số công cụ SAST miễn phí tốt nhất.

NodeJsScan

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

NodeJsScan có giao diện dòng lệnh để tích hợp dễ dàng với các DevSecOps CI/CD pipelines và tạo ra các kết quả trong JSON.

Một tệp cấu hình có sẵn cho mỗi ngôn ngữ có thể được sửa đổi cho việc tìm kiếm. Tổng quan về các tệp, cũng như toàn bộ cơ sở code, có thể được hiển thị thông qua các số liệu thống kê và biểu đồ tròn. Chương trình có thể phát hiện lỗi tràn bộ nhớ đệm và lỗi trong code Java có thể chứa rủi ro bảo mật OWASP.

SonarQube

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

Được coi là một trong những công cụ đánh giá code tự động tốt nhất hiện có trên thị trường. SonarQube có hàng ngàn quy tắc phân tích code tĩnh (Static Code Analysis) tự động. SonarQube cũng hỗ trợ 27 ngôn ngữ hiện đại và lỗi thời (nói lỗi thời vậy chứ vẫn còn có nhiều giá trị lắm à nha) để SonarQube có thể bao quát toàn bộ dự án của bạn và sự phát triển của nó.

Dynamic Application Security Testing – còn được gọi là “black box testing”. kỹ thuật này không tìm lỗ hổng trong mã nguồn như SAST, mà là tìm lỗ hổng trong lúc ứng dụng đang chạy. Nó thực hiện điều này bằng cách sử dụng các kỹ thuật injection trên ứng dụng. DAST có thể xác định các lỗ hổng bảo mật phổ biến, chẳng hạn như SQL injection và XSS. DAST cũng chú ý tới các vấn đề như thời gian chạy không thể xác định được bằng phân tích tĩnh, các vấn đề về xác thực và cấu hình máy chủ, cũng như các lỗ hổng chỉ hiển thị khi người dùng đã đăng nhập.

OWASP ZAP

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

OWASP ZAP là công cụ DAST mã nguồn mở, miễn phí được trang bị đầy đủ tính năng, bao gồm cả tự động quét lỗ hổng và các công cụ để hỗ trợ việc pentest web-app thủ công. ZAP có một danh sách lớn các lỗ hỗng mà nó có thể khai thác hoặc xác định.

Interactive Application Security Testing – hay còn được gọi là “grey box testing”, là công nghệ kết hợp đồng thời các yêu tố của cả SAST và DAST. Nó thường được triển khai như một đặc vụ trong thời gian chạy thử nghiệm (ví dụ: thiết bị cho máy ảo Java[JVM] hoặc .NET CLR) để quan sát hoạt động hoặc các cuộc tấn công và xác định các lỗ hổng.

Contrast Security – Community

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

Contrast là sản phẩm đầu tiên dành cho các nhà phát triển có khả năng tìm hiểu sâu hơn vào các lỗ hổng khi không biết về bối cảnh thời gian chạy của ứng dụng như bộ điều khiển, logic ứng dụng, lớp dữ liệu, chế độ xem, thư viện người dùng, các thành phần của mã nguồn và máy chủ của ứng dụng.

Xem thêm:  Lỗ hổng bảo mật trên Plugin Live Chat with Facebook Messenger

Runtime Application Self Protection – được cấu hình trên một máy chủ và sẽ khởi động khi ứng dụng chạy. Nó được thiết kế để phát hiện các cuộc tấn công vào một ứng dụng trong thời gian thực. Khi ứng dụng bắt đầu chạy, RASP có thể bảo vệ ứng dụng khỏi đầu vào hoặc các hành vi độc hại bằng cách phân tích cả hành vi của ứng dụng và bối cảnh của hành vi đó. Bằng cách sử dụng ứng dụng để liên tục theo dõi hành vi của chính nó, các cuộc tấn công có thể được xác định và giảm thiểu ngay lập tức mà không cần đến sự can thiệp của con người.

Sqreen

Sqreen Runtime Application Self-Protection xác định các cuộc tấn công khai thác lỗ hổng trong sản phẩm bằng cách tận dụng đầy đủ bối cảnh của các yêu cầu.

Sqreen bao gồm tất cả top 10 lỗ hổng bảo mật hàng đầu của OWASP như SQL injection, XSS và SSRF. Điều khiến Sqreen trở nên mạnh mẽ như vậy là khả năng tận dụng logic thực thi của các yêu cầu để chặn các cuộc tấn công với mức độ thất bại thấp hơn nhiều so với các giải pháp hiện có khác. Sqreen cũng có thể thích ứng với ngăn xếp riêng cụ thể của ứng dụng, do đó bạn không cần phải triển khai lại và cấu hình trong khi ứng dụng của bạn vẫn được setup đơn giản và nhanh chóng.

Denpendency Scanning giúp bạn tự động tìm các lỗ hổng bảo mật trong khi bạn đang phát triển và kiểm tra ứng dụng của mình, ví dụ như khi ứng dụng của bạn đang sử dụng thư viện (open source) dễ bị tổn thương.

Snyk

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

Synk là tổ chức đầu tiên của nhà phát triển với các giải pháp mã nguồn mở được duy trì tốt nhất cho các nhà phát triển. Synk cung cấp các giải pháp doanh nghiệp hiệu quả có sẵn cho các tổ chức lớn hơn.

Snyk có một loạt các tính năng tuyệt vời giúp biến bảo mật thành một phần của quá trình phát triển như khả năng phát hiện các lỗ hổng từ bên trong IDE của bạn và quét các navtive git để kiểm tra các dự án trong kho lưu trữ của bạn. Snyk cũng cung cấp một cổng bảo mật để ngăn các lỗ hổng mới đi qua quy trình xây dụng và môi trường sản phẩm để kiểm tra môi trường chạy của bạn nhằm đảm bảo không mắc phải các lỗ hổng hiện có.

WhiteSource Bolt for GitHub

8 công cụ miễn phí để bảo mật khi lập trình phần mềm

WhiteSource giống như Snyk, cũng có một số công cụ miễn phí tuyệt vời cho các nhà phát triển cũng như các giải pháp doanh nghiệp cho các tổ chức lớn. WhiteSource Bolt for Github là một ứng dụng miễn phí, nó liên tục quét các repos của bạn, phát hiện các lỗ hổng của các thành phần trong mã nguồn và cung cấp các bản sửa lỗi. Nó hỗ trợ của kho riêng và kho công cộng.

Hơn 200 ngôn ngữ lập trình được hỗ trợ  và theo dõi liên tục từ nhiều cơ sở dữ liệu lỗ hổng mã nguồn mở như NVD.

Các bí mật như key API, thông tin cơ sở dữ liệu và chứng chỉ bảo mật là những viên ngọc quý của các tổ chức vì nó có thể cung cấp quyền truy cập vào các hệ thống nhạy cảm.Secrets detection có thể quét mã nguồn, logs và các tệp khác để tiếp tục tìm các bí mật khác. Đây là một dich vụ đặc biệt vì hầu hết các bí mật thường luôn là các chuỗi entropy cao (các chuỗi được thiết kế để xuất hiện ngẫu nhiên), nhưng hầu hết các chuỗi entropy cao không phải là bí mật, nên chúng rất khó bị phát hiện. Nó đòi hỏi các thuật toán phân loại tiên tiến để phát hiện các bí mật với mức độ chính xác và recall cao.

Xem thêm:  Hướng dẫn DDOS memcached và cách phòng chống

Secrets detection thường bị nhầm lẫn với SAST vì cả hai đều quét mã nguồn. Nhưng không giống như SAST, chỉ liên quan đến phiên bản hiện tại của ứng dụng, Secrets detection liên quan đến toàn bộ các phiên bản của dự án. Các hệ thống kiểm soát phiên bản như git, sẽ theo dõi và lưu trữ tất cả các thay đổi đối với một dự án. Nếu các phiên bản trước của mã nguồn chứa các bí mật được mã hoá cứng bên trong, đã bị xoá trong giai đoạn cuối, nên việc đánh giá code và các công cụ như SAST sẽ bỏ lỡ các bí mật này, do đó nó có thể nằm trong kho git và bị xâm phạm. Đây là lý do tại sao Secrets detection lại khác SAST.

GitGuardian

Công nghệ của GitGuardian hoạt động bằng cách quét các kho lưu trữ của nhà phát triển để tìm bằng chứng về dữ liệu nhạy cảm.

GitGuardian bao gồm hơn 300 loại dữ liệu nhạy cảm khác nhau từ key kết nối database, chứng chỉ SSL, đến username và password. Những dữ liệu này được phát hiện thông qua sự kết hợp của các thuật toán, bao gồm các kỹ thuật pattern matching (so trùng mẫu) tinh vi. GitGuardian có thể được tích hợp với tài khoản Github của bạn và được cấu hình trong vòng vài phút nên các nhà phát triển có thể sử dụng API GitGuardian để phát hiện dữ liệu trong bất kỳ dịch vụ nào, kể cả trong thư mục, ứng dụng email hoặc kênh Slack.

Tổng kết

Với rất nhiều giải pháp có sẵn, bạn có thể cảm thấy khó khăn khi quyết định chọn công cụ nào trong bài viết. Nhưng phải nhớ, hãy luôn xem xét công dụng của mỗi công cụ có phù hợp với quy trình công việc hiện tại của bạn không vì ngay cả các công cụ tuyệt vời cũng có thể trở nên vô dụng nếu chúng quá khó sử dụng.

Mỗi ứng dụng đều khác nhau và các công cụ được nêu ở trên nên được coi là mức bảo vệ tối thiểu, nếu bạn và tổ chức của bạn có thể không cần các giải pháp chi tiết hơn. Bảo mật là một trong những kỹ năng được đánh giá cao nhất của các nhà phát triển, mặc dù việc bảo mật có vẻ được xem như là một nhiệm vụ khó khăn, nhưng đó là một khoản đầu tư đáng giá để hiểu và thực hiện các hệ thống này trong toàn bộ vòng đời phát triển của ứng dụng.

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

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

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