Home Blog Page 152

Hướng dẫn code chức năng đổi màu nền ngẫu nhiên với JavaScript

Hướng dẫn code chức năng đổi màu nền ngẫu nhiên với Javascript

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

Hello xin chào các bạn, lâu lắm rồi mình chưa viết bài mới cho blog, vì lâu nay mình đang suy nghĩ tìm chủ đề mới để viết cho blog để giúp các bạn học hỏi, cải thiện trình độ và hôm nay mình đã tìm ra một chuyên mục mới cho blog của mình đó chính là Javascript thực chiến nghĩa là thay vì viết những bài về kiến thức cơ bản thì mình sẽ làm các bài như là hướng dẫn code chức năng tab, autocomplete, scroll fixed, toggle menu, slider…

Là những vấn đề khi đi làm mà các bạn sẽ hay gặp phải, làm sao để phân tích vấn đề, đưa ra giải pháp và để code nó thì series này mình sẽ cố gắng chia sẻ nhiều cho các bạn luôn. Và bài đầu tiên của series này chính là hướng dẫn code chức năng đổi màu nền ngẫu nhiên trước nhé.

  12 tips hay cho JavaScript
  24 code ES6 tân tiến để khắc phục các lỗi thực hành JavaScript

Đề bài

Cho một danh sách màu sắc bất kỳ, khi nhấn vào một nút button ở ngoài giao diện thì màu nền của trang web sẽ đổi ngẫu nhiên(random) trong danh sách màu sắc đã cho từ trước.

Giao diện HTML CSS

Về giao diện thì chúng ta chỉ cần tạo HTML đơn giản mà thôi với một button có class button-random và CSS thêm một chút như sau:

Và ta sẽ có kết quả đơn giản như này:

Hướng dẫn code chức năng đổi màu nền ngẫu nhiên với JavaScript

Javascript Code

Việc đầu tiên chúng ta cần làm đó chính là khai báo các biến cần sử dụng, ở đây mình đặt một biến có tên là colors là một mảng sẽ chứa danh sách các màu bất kỳ như sau:

Tiếp đến mình khai báo thêm 1 biến để chứa cái button-random để chúng ta thêm sự kiện nhấn vào cho nó sau này với phương thức document.querySelector để lấy ra một phần tử trong DOM(Document Object Model).

Phần khai báo đã xong, bây giờ chúng ta sẽ thêm sự kiện nhấn vào nút button này bằng phương thức addEventListener và sự kiện truyền vào sẽ là click, khi nhấn vào nút thì lúc này chúng ta cần có giải pháp để lấy màu ngẫu nhiên ra.

Để lấy giá trị trong mảng thì chúng ta sẽ truy xuất đến vị trí index của phần tử trong mảng ví dụ colors[0] thì sẽ lấy ra giá trị đầu tiên là #00aefd trong trường hợp này, thì để lấy ngẫu nhiên thì chúng ta sẽ sử dụng hàm Math.random(), hàm này sẽ trả về kết quả từ 0 đến 1 như 0,2 0,7… nhưng cái chúng ta muốn chính là lấy từ 0 cho đến chiều dài của mảng cho nên lúc này để có kết quả chính xác thì code của chúng ta phải là Math.random() * colors.length

Tuy nhiên con số khi ra đôi khi sẽ là 7,2 mà trong mảng nếu để colors[7,2] thì sẽ không đúng cho nên chúng ta cần làm tròn nó xuống bằng cách thêm một hàm khác bọc lại giá trị ở trên chính là Math.floor() sẽ làm tròn xuống ví dụ 7,2 sẽ thành 7, lúc này trở đi ta có thể dùng một biến có tên là randomColor để lấy ra màu ngẫu nhiên bằng đoạn code mà chúng ta phân tích nãy giờ như sau:

Sau khi lấy được mã màu rồi thì việc tiếp theo đơn giản chỉ cần thay đổi cho thẻ body bằng cách dùng đoạn code này

Như vậy là xong một chức năng đổi màu đơn giản rồi, ở dưới đây là tổng hợp code Javascript từ nãy đến giờ nhé

Tạm kết

Qua bài viết này, mình hi vọng sẽ giúp ích được cho các bạn phần nào trong việc học tập và thực hành với Javascript nhé, cũng như học thêm được cách phân tích vấn đề, các bước để làm ra kết quả như mong muốn, học cách lấy giá trị ngẫu nhiên trong một mảng với các hàm Math, ôn lại sự kiện click, gán giá trị vào style của DOM… Cuối cùng mình chúc các bạn một ngày an lành và vui vẻ. Nếu bài viết mình có gì sai thì các bạn góp ý giúp mình nhé.

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

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

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

Phần 1 – Tự động hóa công việc nhàm chán với Heroku

Phần 1 - Tự động hóa công việc nhàm chán với Heroku

Bài viết được sự cho phép của tác giả Trần Khôi Nguyên Hoàng

Mở bài

Bác Gates đã bảo rằng bác luôn muốn chọn những người lười biếng vì họ sẽ tìm ra cách thực hiện việc đó một cách đơn giản hơn.
Hơn nữa, đôi khi có một số công việc nhàm chán phải lặp đi lặp lại nhiều lần, trong một ngày. Với một developer thì tại sao không tìm một cách nào đó nhàn hơn để làm?
Hôm nay mình sẽ giới thiệu với các bạn cách để tự động hóa một số công việc bằng NodeJS và Heroku, hoàn toàn miễn phí.
Sau đó, các bạn có thể áp dụng vào chính công việc hiện tại của các bạn như gửi mail, tự động chúc mừng sinh nhật trên Facebook, và hàng tá việc khác nữa.

  10 Công cụ Go-To Tech dành riêng cho các Software Developer
  20 trường hợp sử dụng lệnh Docker cho developer

Áp dụng

Để áp dụng, mình sẽ hướng dẫn các bạn viết một cái script vui vui nhằm áp dụng thử tự động hóa một số việc đơn giản. Mình sẽ viết một cái script lấy bài từ Subreddit r/listentothis và post sang Facebook Page bằng NodeJS mỗi giờ một lần.

Series gồm hai phần:

  • Viết script
  • Tự động hóa bằng Heroku

Code nào

Đầu tiên là mình sẽ viết một script để nó tự động lấy bài bên Subreddit và post sang Facebook Page. Các bước cụ thể sẽ như sau:

  1. Tạo dự án
  2. Config Api của Đít đỏ
  3. Lấy random post từ Subreddit r/listentothis
  4. Config Facebook Page API
  5. Post status lên Facebook Page

Tạo dự án

Ở đây mình sẽ sử dụng NodeJS cùng một số package như snoowrap cho Reddit API và node-fetch để post bài lên Page. Ngoài ra dùng thêm dotenv để config các biến environment nữa thôi. Easy

npm init -y
touch index.js
npm i snoowrap node-fetch dotenv
Bash

Config Đít Đỏ

Để Config Đít Đỏ thì mình sử dụng Snoowrap package. Setup gồm hai bước là tạo Reddit App và tạo Token vĩnh viễn.

Tạo Reddit App

Đầu tiên, các bạn vào https://www.reddit.com/prefs/apps để tạo App Reddit.

Phần 1 - Tự động hóa công việc nhàm chán với Heroku

Ở mục Redirect URL nhớ gõ url https://not-an-aardvark.github.io/reddit-oauth-helper/ nhé. Nó sẽ giúp bạn tạo Token vĩnh viễn nhanh hơn.

Sau khi tạo xong thì lưu lại Client ID và Client Secret lại.

Tạo Token vĩnh viễn

Tạo Token vĩnh viễn thì các bạn tiếp tục vào https://not-an-aardvark.github.io/reddit-oauth-helper/. Sau đó điền Client Secret và Client ID vào. Nhớ tick vào Permanent sau đó tạo Token. Kéo xuống dưới nó sẽ hiện Token. Lưu tiếp 2 cái Token đó lại là xong.

Phần 1 - Tự động hóa công việc nhàm chán với Heroku

Lấy random post từ Subreddit

Đến đây mình bắt đầu vào file index.js để bắt đầu Code.

const fetch = require("node-fetch");
const snoowrap = require("snoowrap");
require("dotenv").config();

(async () => {
  try {
    // Config Snoowrap
    const r = new snoowrap({
      userAgent:
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
      clientId: process.env.REDDIT_CLIENT_ID,
      clientSecret: process.env.REDDIT_CLIENT_SECRET,
      refreshToken: process.env.REDDIT_REFRESH_TOKEN
    });

    // Get Sub Reddit
    const subReddit = r.getSubreddit("listentothis");

    // Get Random post
    const randomPost = await subReddit.getRandomSubmission();
    console.log(randomPost);
  } catch (error) {
    console.error(error);
  }
})();
JavaScript

Kết quả sẽ trả về Object một bài post random từ Subreddit r/listentothis. Ở đây mình sẽ lấy demo 3 giá trị thôi: Title, Author và Url của bài hát đó.

const messageData = {
    url: randomPost.url,
    author: randomPost.author.name,
    title: randomPost.title
};
JavaScript

Kết quả như sau

{ url: 'https://youtube.com/watch?v=eiHvJVHzrvM',
  author: 'Encyclopedia_Green',
  title: '100 Proof Haze - Jimmy Mack [rap/hiphop]' 
}
JSON

Config Facebook Page API

Tiếp theo là các bạn phải tạo Page, sau đó tạo App trên Facebook Developer. Và lấy token vĩnh viễn. Các bạn chưa biết cách lấy Token vĩnh viễn thì xem ở đây nhé. Đoạn này nhiều bài hướng dẫn nên mình lười viết lại quá.

Post Status lên Page

Tiếp theo là mình post status lên Page bằng Facebook Page API thôi.

// Post Status
    const access_token = process.env.FACEBOOK_ACCESS_TOKEN;
    const messageData = {
      url: randomPost.url,
      author: randomPost.author.name,
      title: randomPost.title
    };
    const messageTemplate = `Listen and enjoy to this song ${messageData.title} | Credit: ${messageData.author}
  `;
    const url = `https://graph.facebook.com/v5.0/101580544646661/feed?message=${messageTemplate}&link=${messageData.url}&access_token=${access_token}`;
    const postStatus = await fetch(url, {
      method: "POST"
    });
    const response = await postStatus.json();
    console.log(response);
JavaScript

Test thử

Bật Tơ Mi Nồ lên và gõ node index.js để test. Nếu kết quả như sau là chính xác

{ id: '101580544646661_102170374587678' }
JSON

Kết luận

Đến đây là coi như đã xong cái script đơn giản, tự động lấy bài bên Reddit để post qua Facebook Page rồi nhé. Các bạn có thể xem thử kết quả ở Page http://fb.com/listenthisawesomesong của mình.
Source Code của script này mình ở đây https://github.com/nguyen47/listen-to-this
Phần sau mình sẽ giới thiệu cách để tự động hóa việc này bằng Heroku. Đơn giản và không tốn chi phí gì cả.

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

Tuốt tuồn tuột về Functions as a Service (FaaS)

Tuốt tuồn tuột về Functions as a Service (FaaS)

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

Hello anh em!. Do mùa dịch nên lụm được một kèo làm project với Client bên Canada về AWS Lambda, nên tiện viết luôn bài về Functions as a Service (FaaS).

Bài viết không có gì hơn ngoài mục đích cung cấp cho anh em một cái nhìn tương đối hoàn chỉnh về Faas, sau này còn có thêm về Platform-as-a-Service (PaaS). So sánh điểm mạnh yếu, khác nhau giữa hai kiến trúc này.

  5 điều cần nhớ khi làm việc với service worker

  Giao tiếp hiệu quả giữa các Microservice

Mong anh em chú ý đón đọc (rang ráng sao đó đọc cho hết bài). Lụm được kèo thơm – tiện đây nói với anh em là Tiếng Anh đối với dev như anh em mình quan trọng lắm luôn

Functions as a service là gì?

Function as a service (FaaS) is a serverless way to execute modular pieces of code on the edge. FaaS lets developers write and update a piece of code on the fly, which can then be executed in response to an event.

Function as a Service (FaaS) là kiến trúc serverless, thực thi các phần module của code bên phía server. FaaS giúp lập trình viên viết và cập nhận các phần của code nhanh chóng, sau đó thực thi và trả vè kết quả.

Tuốt tuồn tuột về Functions as a Service (FaaS)
Biết về FaaS thì nên vọc vạch cho biết về Amazon Lambda luôn nha.

Đọc hơi khó hiểu, nhưng bình thường, nếu không biết về kiến trúc FaaS. Chỉ đơn giản cần hình dung là:

With FaaS, the physical hardware, virtual machine operating system, and web server software management are all handled automatically by your cloud service provider.

Với FaaS, các thiết bị phần cứng, hệ thống máy ảo và web server đều được handle một cách tự động bởi cloud service được cung cấp

Function chỉ làm một việc

Với triết lý lập trình hàm (Function do only one thing), khi làm việc với kiến trúc Functions as a service, chỉ nên để function làm một việc duy nhất

Make your code scope limited, efficient, and lightweight so functions load and execute quickly.

Làm cho source code bớt dài dòng, hiệu quả và nhẹ để các chức năng tải và thực thi nhanh chóng.

Đừng gọi function này trong function khác

Điểm mạnh nhất của FaaS là nó độc lập các function, nếu function chỉ thực thi một nhiệm vụ duy nhất. FaaS sẽ làm rất tốt công việc của nó được giao. Tuy nhiên, nếu gọi các function lồng nhau, rất dễ xảy ra vấn đề về performance.

Too many functions will increase your costs and remove the value of the isolation of your functions.

Quá nhiều functions sẽ làm răng giá phải trả và loại bỏ đi giá trị của sự độc lập giữa các function.

Sử dụng quá nhiều libraries

Một số services hướng FaaS hỗ trợ tận răng cho developer các function, libraries. Tuy nhiên, không phải vì vậy mà ta lạm dụng.

Using too many libraries can slow functions down and make them harder to scale.

Sử dụng quá nhiều libraries sẽ làm chậm các functions và khiến chúng khó để scale.

Ưu điểm khi sử dụng Faas

Tốc độ – Improved developer velocity

Rõ ràng mà nói, thay vì ngồi lò mò lo code, rồi build, rồi run. Chưa hết, nếu lên server test thì còn deploy nữa. Thật là quá nhiều công đoạn, quá trình nhiêu khê.

Với Functions as a service, dev giờ chỉ lo code. Nhanh hơn rất nhiều!

With FaaS, developers can spend more time writing application logic and less time worrying about servers and deploys. This typically means a much faster development turnaround.

Với FaaS, lập trình viên có thể có thểm thời gian để viết về logic của ứng dụng, bớt thời gian lo lắng về servers và deploys. Điều đó cũng đồng nghĩa với việc development nhanh hơn.

Khả năng mở rộng – Scability

Thay vì phải lo lắng phía server handle ra sao cho hàng triệu request. Với Functions as a service, dev giờ chỉ focus vào thực thi function, còn scale ra sao đã có phía server lo.

Developers don’t have to worry about creating contingencies for high traffic or heavy use. The serverless provider will handle all of the scaling concerns.

Dev không còn phải lo vấn đề về quá tải khi traffic cao/ Server sẽ cung cấp và handle tất cả các vấn đề liên quan với scaling.

Giá cả – Cost efficiency

Thay vì phải trả tiền hằng tháng cho một service to bự. Hầu hết các nhà cung cấp đều chỉ tính tiền khi người dùng thực sự sử dụng

Clients only pay for as much computation time as they use, and do not need to waste money over-provisioning cloud resources.

Khách hàng chỉ trả tiền cho thời gian mà họ sử dụng, không phải phung phí tiền cho các tài nguyên cloud khác.

Nhược điểm

Sinh ra với kha khá ưu điểm hơn người, tuy nhiên cũng có những nhược điểm cần biết về Functions as a Service (FaaS) để mà tránh.

Thứ nhất, sử dụng FaaS sẽ gây khó khăn cho việc code. Khởi tạo environtment để test hoặc investigation bug ở môi trường local là vô cùng khó khăn.

It can be very difficult to incorporate FaaS code into a local testing environment, making thorough testing of an application a more intensive task.

Sẽ là rất khó để tích hợp code của FaaS vào môi trường kiểm thử ở local. Việc này vô hình chung biến kiểm thử cho ứng dụng trở thành một task chuyên sâu hơn

Tham khảo thêm

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

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

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

Mục tiêu phát triển nào bạn đặt ra vào 5 năm tới? – Phần 1

mục tiêu phát triển

Nhiều thách thức được nhà tuyển dụng đặt ra trong buổi phòng vấn nhằm đánh giá năng lực, mục tiêu phát triển và khai thác cá tính nghề nghiệp trong bạn. Chắc hẳn câu hỏi: “Mục tiêu của bạn trong 5 năm hay 10 năm tới là gì?” không còn quá xa lạ với bạn. Vậy bạn sẽ giải quyết thách thức này ra sao?

Cùng TopDev đi vào phần 1 của vấn đề này – Những vấn đề xoay quanh việc nhận ra giá trị bản thân và nắm bắt mong muốn từ nhà tuyển dụng nhé!  

Nhìn nhận về tâm lý chung, các ứng viên dường như rất e ngại về một đáp án cho câu hỏi tuyển dụng. Đơn giản, vì họ lo lắng rằng mục tiêu phát triển của bản thân không đáp ứng với những gì nhà tuyển dụng mong muốn. Bạn khó có thể đánh giá được chính xác bạn là ai, sẽ ra sao sau 5 năm nữa. Đó là lý do mà một mô tả quá cụ thể cho đáp án hiện tại chưa thể nói lên điều gì. 

Đừng áp lực! Vì không có một đáp án nào hoàn hảo cho câu hỏi này

Trên thực tế, nhà tuyển dụng có thể đặt ra câu hỏi hoặc không? Và khi họ cố tình đặt ra chúng thì chắc chắn phải có mục đích.

mục tiêu phát triển

Xem thêm: Tư duy cầu tiến (Growth Mindset) – Yếu tố nhà tuyển dụng tìm kiếm

Họ không quá kỳ vọng rằng bạn có thể lên các kế hoạch chi tiết cho cuộc sống và hành trình sự nghiệp. Thế điều gì ở bạn mà họ muốn tìm kiếm? Nhà tuyển dụng rất chú trọng đến việc các ứng viên theo đuổi những giá trị gì. Từ các giá trị, mỗi ứng viên có thể liên kết các kế hoạch. Đó chính là cơ sở nền tảng để thiêt lập các nhiệm vụ cụ thể. Qua đó, giúp họ từng bước chạm gần hơn với các mục tiêu.         

Bạn hãy xem đây là cơ hội để nhà tuyển dụng thấy được đâu là các giá trị thực mà bạn có thể tạo ra. Đồng thời, họ cũng muốn đánh giá các chỉ số khác về sự đam mê, sự nỗ lực,.. thông qua cách thức mà bạn trải nghiệm dựa trên những giá trị đó.

Thấu hiểu những mong muốn từ nhà tuyển dụng – “Dễ” mà “Khó”

Những mong muốn từ nhà tuyển dụng từ ứng viên rất khó để xác định. Từng vị trí với những đòi hỏi về chuyên môn khác nhau sẽ tương ứng với các tiêu chí riêng biệt.

Đặc biệt hơn, khi mỗi cá nhân đang sống và làm việc trong một nhịp sống quá ganh đua, họ quên đi cái gọi là giá trị mà bản thân họ đang sở hữu.

Chung quy lại, nhà tuyển dụng họ chỉ muốn biết được bạn đang làm việc gì cái gì? Bạn thử sức cho các vị trí ấy với mong muốn tạo ra giá trị gì cho bản thân? Bạn muốn trở thành một người như thế nào?

  Tips lời khuyên giúp nhà tuyển dụng phỏng vấn ứng viên hiệu quả
  Những lý do làm kìm hãm sự thăng tiến của bạn

mục tiêu phát triển

Hiểu được mong muốn của nhà tuyển dụng vừa dễ lại vừa khó. Tuy nhiên, việc nắm bắt tốt các mong muốn dù chỉ là những hình dung nhỏ, bạn đã đủ sức tạo ra được sự khác biệt trong vô số ứng viên. Thế nên, điều quan trọng là hãy tìm kiếm bạn đang theo đuổi điều gì. Và làm thế nào để bạn có được nó. Sự quyết tâm, hay tính nhẫn nại? Hãy chia sẻ chúng với nhà tuyển dụng vì họ thật sự cần biết điều đó từ bạn.

Giữ các giá trị và kết nối chúng để tạo dấu ấn

Có thể sẽ khó khăn ghi bạn tự nhìn nhận lại các giá trị bản thân. Tuy vậy hãy cố gắng nhận ra nó. Bạn cần phải giữ chúng trong một trục định hướng chung. Hơn hết, bạn cần tạo ra cơ hội để kết nối các giá trị.

mục tiêu phát triển

Thực tế cho thấy, cách sống của chúng ta ít nhiều đã làm giảm sự liên kết về các giá trị. Bạn đã mất quá nhiều thời gian để theo đuổi các mục tiêu chưa phù hợp, không phải sao? 

Đối với gười trẻ thì lý do của họ rất đa dạng. Bạn đã từng nghĩ về các lý do đó chưa? Tìm một công việc để học hỏi, trải nghiệm? Có người xem nó là bước đầu trong hành trình chinh phục sự nghiệp. Trong khi đó, có người xem đó như một lần thử sức để đánh giá mức độ phù hợp. Họ nghĩ rằng tuổi trẻ còn dài, cứ đi và đích đến hoàn hảo nhất sẽ được tìm thấy.

Xem thêm: Bí mật giúp tạo động lực và tăng năng suất cho nhân viên!

Nếu bạn cứ trải nghiệm vì cho rằng bạn có năng lực thì điều đó hoàn toàn sai lầm. Bạn chưa tận dụng hợp lý khả năng, bạn chỉ đang lãng phí tài năng của mình. Hãy đặt ra câu hỏi: “Tai sao bạn lại lựa chọn làm công việc này? Động lực nào khiến bạn muốn thực hiện nó? Đừng quên mất mục đích bạn mong muốn là gì! Điều đó sẽ tao ra sự hoài nghi. Và tất nhiên, hành trình trải nghiệm và thực hiện mục tiêu sẽ sớm bị thủ tiêu. 5 năm hay 10 năm lúc này chỉ còn là một câu nói vui mà thôi.

Lời kết

Thế là cách giúp bạn tự nhìn nhận về giá trị bản thân và hiểu được mong muốn từ nhà tuyển dụng đã được giải đáp. Mục tiêu phát triển bản thân của bạn có được thăng hoa hay không phụ thuộc lớn vào bước đi đầu tiên này. Ở phần tiếp theo, TopDev sẽ có những phân tích sâu sắc hơn về cách thức trả lời thách thức từ nhà tuyển dụng: Mục tiêu nào bạn đặt ra vào 5 năm tới?

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

Xem thêm việc làm it lương cao hàng đầu tại TopDev

Những projects giúp nâng hạng Front-end Developer

Project FrontEnd

Tác giả: Kyle Prinsloo

Cách nhanh nhất để lên trình Front end là tự triển những project thật. Bạn có thể xem tutorials, hay tham gia rất nhiều khóa học, nhưng nếu không tự ứng dụng và thực hành thì sẽ rất khó để bạn thực sự tiếp thu những kỹ năng cần thiết cho những projects thực tế.

Những project từ client thì sẽ không có hướng dẫn từ A đến Z, nếu có thì họ cũng chẳng cần bạn làm gì. Với project được giao, bạn phải tự thân vận động từ solution, thực hiện từng bước, thậm chí hack quá trình để về đích.

Vì vậy cách tốt nhất để luyện skill là bắt tay tự làm những project front-end và tự rút ra bài học kinh nghiệm cá nhân luôn một thể. Chưa cần khách hàng vào thời điểm này khi tự bạn có thể build project cho riêng mình.

Chọn Project cá nhân như thế nào?

Xác định level kỹ năng

Khoan hãy chọn những project quá nâng cao so với trình hiện tại, nhất là nếu bạn dễ nản khi gặp khó khăn. Nhưng cũng đừng quên mục tiêu đặt ra là để master front-end, cho nên hãy chọn một project cao hơn so với skill level hiện tại, mà vẫn khả thi.

Ví dụ, bạn vừa hoàn thành HTML và CSS, thì đã đến lúc tìm hiểu thêm JavaScript.

Xử lý problem cá nhân hay bài toán mà bạn quan tâm

Bạn sẽ hào hứng và “dính” với project hơn nếu có problem liên quan đến cuộc sống xung quanh hay nó có thể đáp ứng mong muốn nào đó của riêng bạn.

Có thể nhiều lúc bạn mất kiểm soát về thời gian khi lướt Facebook quá nhiều, hoặc bạn đang muốn có một cái web mà có thể tự tạo Youtube thumbnails. Nói chung là bạn hãy c nhắc một vấn đề cá nhân mà công nghệ có thể nhúng tay vào và bắt đầu từ đó, những gợi ý trong bài này chỉ là khởi điểm cơ bản thôi, nếu bạn tự thêm những tính năng độc lạ thì càng đỉnh.

Front-end tuyển dụng lương cao trên TopDev

5 project thú vị về Front-end development

Dựng bản clone front-end của một website

Luyện skill: HTML, CSS, JavaScript, and/or Bootstrap.

Một cách hay để tìm hiểu một trang web được dựng như thế nào và một số cách bài trí cơ bản như cấu trúc trang, màu sắc, font chữ, media, table, vân vân. Đào càng chi tiết có thể để dựng bản y hệt từ phiên bản gốc. Có thể chọn website nào tùy thích, hạn chế nhìn source code để có cái nhìn tổng thể nhất.

Clone Google là một trong những bài tập của Thinkful – một tổ chức giáo dục cung cấp các khóa học technology bao gồm web development bootcamp, giao cho học viên của họ.

Project Front-End

Bạn cũng có thể bắt chước bài tập này để clone trang của app Karma WiFi, của Kyle Koshki, một trong những giảng viên tại Thinkful, và sử dụng HTML và CSS.

Ưu điểm khi clone một website là có thể tùy ý chọn độ phức tạp của trang web đó. Mới bắt đầu thì có thể chọn web nào đơn giản mà chỉ cần mỗi HTML và CSS. Nâng cấp hơn thì có thể thêm JavaScript và React.

  9 CSS animation mới "mãn nhãn" cho các project

Tạo một quiz game JavaScript front-end

Luyện skill: JavaScript

JavaScript là ngôn ngữ lập trình cho phép tạo trang web tương tác. Sử dụng ngôn ngữ này bạn có thể tạo những element responsive như là menu, video, hiệu ứng animation, interactive maps và thậm chí game in-browser. Vậy tại sao đầu tiên phải build quiz?

Không chỉ vì game thú vị, quiz đang dần trở nên phổ biến như các công cụ content marketing. Bạn đã bắt gặp những thứ này chưa?

Front-end project

Quizz là công cụ marketing khá hiệu quả vì chúng có tính năng tương tác. Theo một khảo sát của Content Marketing Institute, 81% marketer cho rằng interactive content – bất kỳ nội dung nào yêu cầu người dùng phải tham gia – thu hút chú ý hiệu quả hơn hẳn content tĩnh. Vì lý do này, quiz được dùng cho các mục đích marketing khác nhau. Những câu quiz đơn giản, như hình bên trái, được dùng để đẩy traffic của web.

Tại sao bạn cần biết những chuyên này? Bởi vì công việc của bạn không phải chỉ tạo nên sản phẩm đẹp, mà còn phải tạo những tính năng thân thiện với user – user-friendly và khiến web của khách hàng hoạt động hiệu quả, đạt mục đích sale và marketing của họ nữa.

Để tạo quiz thì bạn có thể coi qua tutorial của WebDevTrickSitePoint.

  Những Project Cá Nhân Giúp Mình Lên Trình Senior Javascript

Tạo ứng dụng front-end quét mã QR

Luyện skill: JavaScript

Barcode và QR đang dần thay đổi cách thức mua sắm của người dùng. Với smartphone, khách hàng có thể scan sản phẩm và có được hàng tá thông tin về sản phẩm như giá cả hay nơi bán. Không cần phải gõ những dòng code dài ngoằng lên web như activation code hay số hiệu model, khiến cho trải nghiệm mua sắm đơn giản và dễ dàng dho7n.

Trái với những gì mọi người nghĩ, bạn không cần hẳn một cái app native để scan QR codes. Website chạy trên thiết bị thông minh có camera có thể làm được chuyện đó. Trang này sẽ hướng dẫn bạn từng bước một tạo máy quét QR code của riêng mình.

Bạn sẽ dùng HTML và JavaScript, nhưng phần quan trọng nhất là sử dụng thư viện JS mà có thể biên dịch QR code. Không cần phải tạo một thư viện từ đầu vì đã có sẵn khá nhiều.

Build app front-end thời tiết

Luyện skill: Angular 8

Angular là một trong ba frameworks front-end phổ biến nhất bên cạnh React và Vue.js. Nó thường được dùng để build app form-based (app mà phải sign up để tạo account) nhưng cũng có thể dùng để build game và thậm chí những app có yếu tố virtual reality (thực tế ảo).

Trên Medium có một tutorial step-by-step rất chi tiết hướng dẫn beginner cách tạp một cái app thời tiết khá đẹp mắt với Angular 8 (phiên bản mới nhất của Angular). Cái weather app đó như thế này:

Front-end project

Ứng dụng này có thiết kế tinh gọn và tối giản với hình minh họa bắt mắt và giao diện đơn giản. Nó còn có cả tính năng light/dark mode. Với project này bạn sẽ cảm giác như build một app responsive, hữu dụng từ đầu đến cuối. Có thể học thêm vài thứ như install Node.js và Angular CLI để test code với LightHouse.

Mặc dù tác giả của tutorial này đã thiết kế giao diện của riêng ổng, nhưng bạn vẫn có thể sáng tạo thêm styling của riêng mình. Chọn thêm animation CSS, dùng thêm logo, icon và những materials khác.

Tutorial này thích hợp với beginner nhưng vẫn cần một chút hiểu biết về Angular, và bạn có thể xem qua Angular.io.

Thiết kế và code một website portfolio front-end của riêng bạn

Với một số project, có thể bạn sẽ làm chung với web designer để quyết định phần ngoại hình của website. Mặc dù design và dev là hai khái niệm khác nhau, tuy nhiên nếu nắm bắt được web design không chỉ là bổ sung skill mà còn trang bị cho bạn khá đầy đủ nếu sau này trở thành freelancer, tự bạn có thể triển từ design tới deploy. Design và code một web portfolio của riêng mình cũng là cách tự do thể hiện đồng thời khía cạnh nghệ thuật và kỹ thuật.

Bước đầu hãy nghĩ về thông điệp và branding. Core service – service cốt lõi của bạn là gì, bạn muốn làm cho ai, tại sao họ nên chọn bạn? (Đọc thêm tại đây)

Thứ hai là tạo bản mock design để chi tiết hóa layout, màu sắc và chữ viết.

Về theme của web thì nên là tối giản hay sôi nổi, màu đơn sắc hay đậm màu? Sau đó thì thêm một số page cần thiết, như là contact page, vài bài blog, page About me, và page terms and condition (Điều khoản và Điều kiện).

Thứ ba, code đi! Dùng CSS modern để layout, thêm vài animations, chèn hình chất lượng cao. Đừng giới hạn bản thân vì bạn có thể thêm cái gì cũng được, đó là portfolio của bạn mà!

Nguồn thực hành front-end development

Cách tốt nhất để thực hành front-end development là build app thực tế, tuy nhiên cũng cần một số nơi để tìm tips, tutorials và support khi bí hay cần thêm ý kiến đóng góp.

Đây là một số bookmark phù hợp cho bạn:

  1. freeCodeCamp.org – website với free tutorial về lý thuyết, ngôn ngữ và thực hành về web development. Họ cũng có một cộng đồng giải đáp những thắc mắc/câu hỏi.
  2. Modern HTML & CSS From the Beginning – Đây là khóa học Udemy của Brad Traversy. Nó có những thông tin rất hữu ích, chỉ bạn mọi thứ để bắt đầu với những ngôn ngữ mới.
  3. Frontendmentor.io – bạn có thể tìm những challenge vừa sức và nâng cấp để phát triển kỹ năng trong thời gian rảnh. Cái khó của những challenge này sẽ xếp từ “junior” đến “advanced”. Ví dụ:

Và đó là 5 dự án front-end cho bạn thử sức. Nhắc lần nữa là đây chỉ là điểm khởi đầu thôi. Bạn có thể nâng cấp lên để customize theo ý mình. Đây mới chỉ là thực hành thôi, bạn cần phải tự tay build cái gì đó để nâng trình bản thân. 

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

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

Xem thêm các việc làm IT chất trong tháng mới nhất tại Topdev.vn

Bài quyền Bowling Game

Bài quyền Bowling Game

Bài viết được sự cho phép của BBT Tạp chí Lập trình

Bowling Game là một bài kata kinh điển của hoạt động Coding Dojo. Bài kata này rất phù hợp để thực hành kỹ thuật TDD, Baby Steps và Refactoring.

  8 video game giúp bạn lập trình web tốt hơn
  Amanotes - Kẻ viết tiếp giấc mơ game Việt

Về TDD

TDD (Test Driven Development – Phát triển (mà trong đó việc phát triển) được lái bởi Kiểm thử) là một phương pháp tiếp cận để phát triển phần mềm. Nói cách khác, là một cách để suy nghĩ về requirement (yêu cầu) cũng như thiết kế trước khi viết các mã triển khai.

Có một mô hình giải thích khác về TDD mà trong đó coi TDD là một kỹ thuật lập trình. Tuy vậy trong bài viết này sử dụng thuật ngữ TDD theo mô hình “cách nghĩ”.

Cụ thể, “cách nghĩ” theo phương pháp TDD được diễn giải như sau:

TDD explained
  1. RED: Quá trình phát triển bắt đầu bằng thao tác Add a Test: bổ sung một ca kiểm thử. Chưa có mã triển khai tương ứng nên ca kiểm thử này sẽ Failed. Nhưng ngay từ thời điểm đó ca kiểm thử đã có tác dụng mô tả yêu cầu cũng như thiết kế của mã triển khai.
  2. GREEN: Mã triển khai tương ứng với ca kiểm thử được bổ sung. Mã nguồn chuyển sang giai đoạn Passed (vượt qua kiểm thử). Các mã triển khai nội bộ của chức năng có thể linh hoạt, nhưng thiết kế của mã thì tuân theo mô tả của kiểm thử.
  3. BLUE: Mã nguồn được tái cấu trúc. Mục đích của việc tái cấu trúc là đưa mã nguồn tới trạng thái sẵn sàng để bổ sung tính năng mới. Clean CodeSOLIDClean ArchitectureKISSSimple Design là các quy tắc và tiêu chuẩn thường được áp dụng trong bước này.
  4. Quá trình RGB (RedGreenBlue) được lặp đi lặp lại cho đến khi các chức năng được triển khai hoàn thiện.

Về các Coding Dojo Kata

Kata (bài quyền) trong một buổi Coding Dojo được định nghĩa là những bài toán được thiết kế cho lập trình viên để luyện tập một kỹ năng trong lập trình, thông qua thực hành và lặp lại.

Các vấn đề (bài toán) được sử dụng làm kata thường đủ nhỏ (không quá khó) để giải quyết nhưng đủ thách thức để người tập không có khả năng hoàn thành trong thời gian cho phép. Đây là thiết kế của Coding Dojo nhằm giúp người tham gia tập trung vào luyện tập kỹ năng thay vì hướng tới mục đích “xong việc”.

Về Vấn đề Bowling

Vấn đề Bowling xuất phát từ luật của trò chơi Bowling.

Một ván chơi diễn ra trong 10 frame. Mỗi frame, người chơi có 2 lượt ném để hạ đổ 10 pin. Điểm của frame là tổng số pin bị hạ đổ cộng thêm điểm thưởng từ trike và spare.

Spare (các ký hiệu / trong hình trên)xảy ra khi người chơi hạ thành công cả 10 pin sau hai lượt ném. Điểm thưởng cho spare là số pin bị hạ tại lượt ném ngay sau đó.

Strike (các ký hiệu X trong hình trên) xảy ra khi người chơi hạ thành công cả 10 pin ngay từ lượt ném đầu tiên, và theo đó kết thúc frame trong một roll duy nhất. Điểm thưởng cho strike là tổng số pin bị hạ tại hai lượt ném ngay sau đó.

Người chơi đạt spare hay strike tại frame cuối cùng sẽ được ném thêm các lượt ném phụ để nhận trọn các lượt thưởng. Theo đó frame này sẽ kết thúc sau ba lượt ném.

Bài kata Bowling Game yêu cầu lập trình viên viết chương trình để tính điểm cho trò chơi này.

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

Bài quyền

Thiết kế ban đầu

Mọi tính thông tin cần thiết để có được điểm của một ván chơi nằm trọn trong một ván chơi.

 BowlingGame game = new BowlingGame();

Rõ ràng, điểm của một game chỉ có thể tính được tại thời điểm mà kết quả của mọi roll đều đã rõ ràng. Giả sử ta thiết kế phương thức getScore dùng để tính về điểm số của game, getScore chỉ làm được điều đó khi nó đã nhận được đầy đủ thông tin về các roll. Chẳng hạn:

 BowlingGame game = new BowlingGame(); int[] rolls = // a dummy rolls array int score = game.getScore(rolls);

Cách thiết kế này không ổn, hãy để ý game.getScore(rolls), ở đây game là một thực thể (entity) nhưng lại đang được sử dụng như một service cung cấp khả năng tính điểm.

Một thiết kế tốt hơn là đặt một phương thức roll để nhận thông tin về các roll, và đặt một phương thức score được gọi khi các roll đều đã được nhập liệu hoàn chỉnh.

 BowlingGame game = new BowlingGame(); repeat () {     int pins = // a dummy pins;     game.roll(pins); } int score = game.score();

Đây là thiết kế tối thiểu mà chúng ta có thể có thể bắt đầu phát triển chương trình.

Bắt đầu

Bài viết này dựa trên tiền đề rằng chương trình được viết bằng ngôn ngữ Java và test framework được sử dụng là JUnit.

Tạo một kiểm thử đơn vị

Với JUnit, một kiểm thử đơn vị là một class trong đó có các ca kiểm thử là những phương thức được chú thích @Test. Dưới đây là kiểm thử đơn vị cho chương trình BowlingGame với một ca kiểm thử “dummy” dùng để xác nhận rằng test framework hoạt động ổn định.

 import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*;  public class BowlingGameTest {     @Test     void testAddition() {         assertEquals(2, 1 + 1);     } }

Thực thi kiểm thử cho kết quả

 +-- JUnit Jupiter [OK] | '-- BowlingGameTest [OK]

Ca kiểm thử đầu tiên

Kiểm thử đầu tiên mô tả rằng “nếu người chơi ném trượt tất cả các roll thì điểm số sẽ là 0”.

Mô tả class chức năng

 @Test void testAllMissedGame() {     BowlingGame game = new BowlingGame(); }

Mã triển khai để vượt qua kiểm thử:

 public class BowlingGame { }

Mô tả thao tác nhập thông tin các roll

Để mô tả một ván chơi mà tất cả các roll (tổng cộng 20) đều trượt, ở đây sử dụng một phép lặp:

 @Test void testAllMissedGame() {     BowlingGame game = new BowlingGame();     for (int i = 0; i < 20; i++) {         game.roll(0);        } }

Mã triển khai để vượt qua kiểm thử (để đơn giản, từ mục này về sau mã triển khai sẽ được viết ra mà không có chú thích gì thêm):

 public class BowlingGame {     public void roll(int pins) {     } }
Mô tả thao tác tính điểm
 @Test void testAllMissedGame() {     BowlingGame game = new BowlingGame();     for (int i = 0; i < 20; i++) {         game.roll(0);        }     int score = game.score(); }
 public class BowlingGame {     public void roll(int pins) {     }          public int score() {         return -1;     } }
Mô tả điểm số mong muốn
 @Test void testAllMissedGame() {     BowlingGame game = new BowlingGame();     for (int i = 0; i < 20; i++) {         game.roll(0);        }     assertEquals(0, game.score()); }
 public int score() {     return 0; }

Tới bước này, chương trình đã có khả năng tính đúng số điểm của những ván chơi mà tất cả các roll đều trượt.

Ca kiểm thử thứ hai

Ca kiểm thử thứ hai mô tả trường hợp mà “người chơi ném đổ một số pin nào đó, nhưng không có điểm thưởng”, chúng ta chọn một trường hợp điển hình là “người chơi chỉ ném đổ một pin mỗi roll”.

Mô tả một game ăn một điểm mỗi roll
 @Test void testAllMissedGame() {     BowlingGame game = new BowlingGame();     for (int i = 0; i < 20; i++) {         game.roll(0);        }     assertEquals(0, game.score()); }  @Test void testAllOneGame() {     BowlingGame game = new BowlingGame();     for (int i = 0; i < 20; i++) {         game.roll(1);        }     assertEquals(20, game.score()); }
 private int score;  public void roll(int pins) {     score += pins; }      public int score() {     return score; }

Trước khi triển khai chức năng tiếp theo, hãy để ý có dấu hiệu mã xấu

  • Trùng lắp mã khởi tạo đối tượng game
  • Trùng lắp mã lặp lại thao tác roll
Khử trùng lắp cho mã khởi tạo đối tượng game

Trùng lắp này có thể được khử bằng một phương thức setup mà hầu như mọi test framework đều hỗ trợ. Trong JUnit, phương thức setup được mô tả bởi chú thích @BeforeEach:

 private BowlingGame game;  @BeforeEach void setup() {     game = new BowlingGame();    }  @Test void testAllMissedGame() {     for (int i = 0; i < 20; i++) {         game.roll(0);        }     assertEquals(0, game.score()); }  @Test void testAllOneGame() {     for (int i = 0; i < 20; i++) {         game.roll(1);        }     assertEquals(20, game.score()); }
Khử trùng lắp cho thao tác roll nhiều lần

Trùng lắp này có thể được khử bằng kỹ thuật tách hàm:

 private BowlingGame game;  @BeforeEach void setup() {     game = new BowlingGame();    }  @Test void testAllMissedGame() {     rollMany(0, 20);     assertEquals(0, game.score()); }  @Test void testAllOneGame() {     rollMany(1, 20);     assertEquals(20, game.score()); }  private void rollMany(int pins, int times) {     for (int i = 0; i < times; i++) {         game.roll(pins);        } }

Ca kiểm thử thứ ba

Ca kiểm thử thứ ba hướng đến việc mô tả chức năng tính điểm thưởng cho spare.

Mô tả một spare
 @Test void testSpare() {     game.roll(3);     game.roll(7); // spare!     game.roll(4);     rollMany(0, 17);     assertEquals(18, game.score()); }

Thiết kế hiện tại không thể vượt qua được kiểm thử này vì những lý do sau đây:

  • Score đang được tính toán “lâm thời”, trong khi để tính điểm thưởng thì cần dựa vào roll “tương lai” (hoặc “quá khứ”, tùy cách hiểu).
  • Để giải quyết vấn đề trên thì lịch sử kết quả của các roll cần được lưu lại, nhưng phương thức roll hiện tại không làm điều đó.
  • Việc tính toán điểm số cần dựa trên lịch sử, nhưng phương thức score hiện tại không làm điều đó.

Để giải quyết vấn đề trên, cần tái thiết kế mã nguồn. Để có thể tái thiết kế an toàn ta cần giữ lại hai ca kiểm thử đầu tiên. Ca kiểm thử thứ ba tạm thời chưa thể pass được và cần phải đặt sang một bên.

 // @Test // void testSpare() { // ...
Lưu giữ lịch sử các roll

Phương thức roll sẽ đảm nhiệm chức năng lưu giữ lịch sử ném:

 private int score = 0; private int[] rolls = new int[21]; private int currentRoll = 0;  public void roll(int pins) {     rolls[currentRoll++] = pins;     score += pins; }      public int score() {     return score; }
Tính điểm số dựa trên lịch sử ném

Các mã đảm nhiệm chức năng tính điểm sẽ được bỏ ra khỏi phương thức roll. Phương thức score sẽ đảm nhiệm tính năng này, và nó thực hiện dựa theo lịch sử ném:

 private int[] rolls = new int[21]; private int currentRoll = 0;  public void roll(int pins) {     rolls[currentRoll++] = pins; }      public int score() {     int score = 0;     for (int i = 0; i < rolls.length; i++) {         score += rolls[i];     }     return score; }

Tới lúc này thì ca kiểm thử số ba có thể được gỡ comment.

Phát hiện spare

Thao tác cộng điểm thưởng cho spare bắt đầu bằng việc phát hiện ra sự kiện spare:

 public int score() {     // ...     for (int i = 0; i < rolls.length; i++) {         if (rolls[i] + rolls[i+1] == 10) // spare score += ...         // score += rolls[i];     }     // ... }

Giải pháp này không sử dụng được bởi thông tin i không mô tả được roll hiện tại là roll bắt đầu hay kết thúc của một frame. Thiết kế hiện tại vẫn chưa đáp ứng được ca kiểm thử số 3. Chúng ta cần một biến đếm có khả năng đại diện cho một frame, không phải một roll.

Duyệt qua các frame

Ca kiểm thử số 3 cần được comment lại một lần nữa. Phương thức score được tái cấu trúc để duyệt qua từng frame một:

 public int score() {     int score = 0;     int i = 0;     for (int frame = 0; frame < 10; frame++) {         score += rolls[i] + rolls[i + 1];         i += 2;     }     return score; }

Tới lúc này thì thiết kế đã sẵn sàng để vượt qua ca kiểm thử thứ ba.

Vượt qua ca kiểm thử thứ 3

Gỡ bỏ comment cho ca kiểm thử thứ ba và bổ sung mã tính điểm thưởng cho spare:

 public int score() {     int score = 0;     int i = 0;     for (int frame = 0; frame < 10; frame++) {         if (rolls[i] + rolls[i + 1] == 10) { // spare             score += 10 + rolls[i + 2];             i += 2;         } else {             score += rolls[i] + rolls[i + 1];             i += 2;         }     }     return score; }

Kiểm thử số ba đã được vượt qua, nhưng những mã xấu sau vẫn hiện diện:

  • Tên biến không có tính mô tả (biến i) tại mã triển khai
  • Sự tồn tại của comment tại mã triển khai (để giải thích cho phép so sánh magic == 10)
  • Sự tồn tại của comment tại mã kiểm thử (để giải thích cho cặp số magic 3-7)
Đặt lại tên biến mặc tả

Biến i của phương thức score đang mô tả vị trí bắt đầu của frame trong lịch sử các roll, có thể được đặt lại tên thành frameIndex.

 public int score() {     int score = 0;     int frameIndex = 0;     for (int frame = 0; frame < 10; frame++) {         if (rolls[frameIndex] + rolls[frameIndex + 1] == 10) { // spare             score += 10 + rolls[frameIndex + 2];             frameIndex += 2;         } else {             score += rolls[frameIndex] + rolls[frameIndex + 1];             frameIndex += 2;         }     }     return score; }
Khử comment tại mã triển khai

Comment tại mã triển khai có thể được khử bằng cách đặt tên cho biểu thức so sánh magic rolls[frameIndex] + rolls[frameIndex + 1] == 10. Biểu thức này này mô tả dấu hiệu nhận diện một spare. Mục tiêu “đặt tên” có thể được thực hiện bằng kỹ thuật tách phương thức:

 public int score() {     int score = 0;     int frameIndex = 0;     for (int frame = 0; frame < 10; frame++) {         if (isSpare(frameIndex)) {             score += 10 + rolls[frameIndex + 2];             frameIndex += 2;         } else {             score += rolls[frameIndex] + rolls[frameIndex + 1];             frameIndex += 2;         }     }     return score; }  private boolean isSpare(int frameIndex) {     return rolls[frameIndex] + rolls[frameIndex + 1] == 10; }
Khử comment tại mã kiểm thử

Tương tự, cặp magic roll tại mã kiểm thử có thể được khử bằng kỹ thuật tách phương thức:

 @Test void testSpare() {     rollSpare();     game.roll(4);     rollMany(0, 17);     assertEquals(18, game.score()); }  private void rollSpare() {     game.roll(3);     game.roll(7); }

Tới lúc này thì mã nguồn đã sẵn sàng cho kiểm thử tiếp theo.

Ca kiểm thử thứ tư

Mục đích của kiểm thử thứ tư là mô tả khả năng tính điểm thưởng trong trường hợp người chơi ăn strike.

Kiểm thử strike
 @Test void testStrike() {     game.roll(10); // strike     game.roll(1);     game.roll(2);     rollMany(0, 16);     assertEquals(16, game.score()); }
 public int score() {     int score = 0;     int frameIndex = 0;     for (int frame = 0; frame < 10; frame++) {         if (rolls[frameIndex] == 10) { // strike             score += 10                 + rolls[frameIndex + 1]                 + rolls[frameIndex + 2];             frameIndex++;         } else if (isSpare(frameIndex)) {             score += 10 + rolls[frameIndex + 2];             frameIndex += 2;         } else {             score += rolls[frameIndex] + rolls[frameIndex + 1];             frameIndex += 2;         }     }     return score; }

Nhờ có các tái cấu trúc trước đó, ca kiểm thử thứ tư được vượt qua rất dễ dàng. Nhưng những mã xấu sau vẫn hiện diện:

  • Comment tại mã triển khai
  • Comment tại mã kiểm thử
Khử comment tại mã triển khai

Comment tại mã triển khai hiện diện nhằm giải thích cho biểu thức magic rolls[frameIndex] == 10. Biểu thức này mô tả dấu hiệu nhận diện một strike. Dấu hiệu này có thể được đặt tên bằng kỹ thuật tách phương thức:

 public int score() {     int score = 0;     int frameIndex = 0;     for (int frame = 0; frame < 10; frame++) {         if (isStrike(frameIndex)) {             // ...     }     return score; }  private boolean isStrike(int frameIndex) {     return rolls[frameIndex] == 10; }
Khử comment tại mã kiểm thử

Comment tại mã kiểm thử nhằm mô tả magic roll 10. Roll này có thể được đặt tên bằng kỹ thuật tách phương thức:

 @Test void testStrike() {     rollStrike();     game.roll(1);     game.roll(2);     // ... }  private void rollStrike() {     game.roll(10); }

Tới lúc này thì mã triển khai đã có thể tính điểm chính xác trên tất cả các roll có thể xảy ra.

Ca kiểm thử thứ năm

Ca kiểm thử này nhằm kiểm thử trường hợp đặc biệt nhất, khi mà người chơi ăn strike trên tất cả các roll.

 @Test void testPerfectGame() {     rollMany(10, 12);     assertEquals(300, game.score()); }

Ca kiểm thử này được vượt qua mà không cần thêm bất kỳ nỗ lực nào. Đây cũng là kiểm thử cuối cùng của bài kata Bowling Game.

Bài viết gốc được đăng tải tại Tạp chí Lập trình

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

Angular – Tự xây dựng module “lazy load images”

Angular - Tự xây dựng module

Bài viết được sự cho phép của tác giả Lương Văn Phúc

  8 lợi thế khi sử dụng Polymer so với Angular và React
  Buils một ứng dụng thời tiết sử dụng AngularJS

Lời tựa

Trong bài viết trước của mình về lazy-loading images, mình đã giới thiệu chi tiết cả về lý thuyết lẫn thực hành kèm với các kĩ thuật khác nhau. Tuy nhiên nếu bạn đang lúng túng chưa biết cách tích hợp vào dự án sử dụng framework Angular, thì bài viết này sẽ hướng dẫn các bạn tự tay xây dựng một angular module đơn giản hỗ trợ lazy-load images mà không cần sử dụng thư viện bên ngoài. Để tránh làm bài viết quá dài, mình sẽ chỉ trình bày về phần hướng tiếp cận và thiết lập chứ không giải thích lại về “lazy-loading images” là gì nữa nhé.

Online Demo

Nếu bạn không muốn đọc bài viết dài dòng thì có thể xem online demo tại đây: https://stackblitz.com/edit/angular-lazy-load-images-module

Trước khi bắt đầu

Trở lại với phong cách hay nói dông dài của mình 😅, mình sẽ phân tích một tí về vấn đề chúng ta sẽ code sắp tới đây. Nếu các bạn muốn thực hành ngay thì có thể bỏ qua phần này.

Trước khi bắt đầu, bạn nên tự hỏi xem project của bạn có phải hỗ trợ các browser cũ hay không:

  • Nếu KHÔNG: bài viết này không cần thiết nữa vì browser hiện đại đã chính thức hỗ trợ lazy-loading images với thuộc tính loading="lazy"
  • Nếu KHÔNG nhưng bạn vẫn cần lazyload ảnh nền (background-image): bài viết này sẽ giúp bạn.
  • Nếu CÓ: không phải nói nhiều, chiến thôi.
<!-- Thật tốt nếu bạn không phải support IE -->
<img src="sample.png" loading="lazy">

Bạn có thể kiểm tra xem browser nào đã chính thức hỗ trợ thuộc tính loading="lazy" tại Can I Use.

Hướng tiếp cận với directive

Nếu các bạn đã làm việc với Angular một thời gian, thì sẽ dễ dàng đoán được directive là hướng tiếp cận phù hợp với bài toán này. Tuy nhiên việc sử dụng directive cũng có 2 cách như sau:

  1. Nhúng directive trực tiếp vào app.module.ts để có thể sử dụng bất kì chỗ nào.
  2. Tạo một module riêng biệt và nhúng directive vào module đó. Chỗ nào cần sử dụng thì nhúng module đó vào.

Bạn chọn cách nào cũng được, nhưng thông thường mình sẽ chọn cách số 2 theo practice của team mình. Bài viết này mình sẽ thực hiện theo cách số 2 nhé.

Chọn kĩ thuật nào để lazy-load images?

Mình đã thống nhất sử dụng directive rồi, nhưng bên trong directive mình sẽ sử dụng kĩ thuật gì để lazy-load images (trong bài viết trước mình có đề cập đến 3 kĩ thuật đấy)? Câu trả lời là mình sẽ sử dụng cả native và Intersection Observable API nhé. Logic code sẽ như sau:

  1. Nếu browser có hỗ trợ thuộc tính loading="lazy", thì chúng ta tận dụng lợi thế này và để cho browser làm công việc của mình.
  2. Nếu browser không hỗ trợ, hoặc là bạn đang muốn lazy-load ảnh nền (background image), thì chúng ta sẽ fallback về Intersection Observable API.

Thông tin thêm cho bạn, nếu bạn muốn support IE thì cần sử dụng polyfill hoặc có thể chuyển sang dùng kĩ thuật scroll event handler. Các bạn kiểm tra tính tương thích của Intersection Observable tại Can I Use.

Tất cả sẽ được code trong phần tiếp theo.

Bắt tay vào code module images-lazyload

Mình sẽ khởi tạo một project Angular rỗng để thực hành nhé. Các bạn khởi tạo dự án với tên là “angular-demo-lazyload”:

ng new angular-demo-lazyload

Tiếp theo, bạn cần tạo một nơi để chứa module lazy-load. Bạn tạo thư mục tên là “shared” và các file cho directive, service và module như bên dưới.

  app/
  ├── shared/
  │   └── images-lazyload/
  │       ├── images-lazyload.directive.ts
  │       ├── images-lazyload.service.ts
  │       └── images-lazyload.module.ts
  │
  ├── app.component.html
  ├── app.component.scss
  ├── app.component.ts
  └── app.module.ts

Giờ thì code thôi, mình có đặt comment chi tiết bên trong code rồi nên sẽ không giải thích nhiều nữa.

Đầu tiên là images-lazyload.directive.ts, chúng ta tận dụng thuộc tính loading để làm directive selector luôn.

import { Injector, Directive, ElementRef } from '@angular/core';
import { ImagesLazyloadService } from './images-lazyload.service';

@Directive({
  // Tận dụng thuộc tính "loading" làm directive selector
  // Bạn có thể thay đổi thành "img[loading], div[loading]" nếu chỉ muốn target đến thẻ img và div
  selector: '[loading]',
})
export class ImagesLazyloadDirective {

  constructor(
    private injector: Injector,
    private el: ElementRef,
  ) {
    const img = this.el.nativeElement;

    // Nếu browser đã support thuộc tính "loading", chúng ta không cần phải làm gì thêm nữa, hãy để nó làm công việc của nó.
    // Tuy nhiên nếu element không phải là img (nó là background image), thì fallback về intersection observable
    if ('loading' in HTMLImageElement.prototype && img.tagName.toLowerCase() === 'img') {
      img.src = img.dataset?.src;
    } else {
      // fallback sử dụng intersection observable API
      const lazyService = this.injector.get(ImagesLazyloadService);
      lazyService.observe(img);
    }
  }
}

Tiếp theo là images-lazyload.service.ts, phần core của Intersection Observable. Nếu bạn muốn lazy-load với scroll thì chỉ cần thay logic bên trong là được.

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class ImagesLazyloadService {
  private observer: IntersectionObserver;

  constructor() {
    this.init();
  }

  private init() {
    // Khởi tạo
    this.observer = new IntersectionObserver((entries, imgObserver) => {
      entries.forEach(entry => {
        // chưa đến viewport, dừng sớm bớt đau khổ
        if (!entry.isIntersecting) {
          return;
        }

        // src được lưu trong data-src, chúng ta copy nó vào src là xong.
        const lazyImage = entry.target as HTMLImageElement;
        const src = lazyImage.dataset.src;

        // nếu ảnh là thẻ img, copy vào src
        // nếu ảnh là background image, copy vào background-image
        lazyImage.tagName.toLowerCase() === 'img'
          ? lazyImage.src = src
          : lazyImage.style.backgroundImage = 'url(\'' + src + '\')';

        // xong việc thì nên dọn dẹp
        lazyImage.removeAttribute('lazy');

        // tiếp tục dọn dẹp
        imgObserver.unobserve(lazyImage);
      });
    });
  }

  observe(target: Element) {
    // "trải chiếu nằm chờ" tấm ảnh scroll tới viewport
    this.observer.observe(target);
  }
}

Cuối cùng là images-lazyload.module.ts, chỉ là khai báo thôi, không có gì đặc biệt.

import { NgModule } from '@angular/core';
import { ImagesLazyloadDirective } from './images-lazyload.directive';

@NgModule({
  declarations: [ImagesLazyloadDirective],

  // chúng ta chỉ cần export directive để sử dụng, không cần export service ra ngoài
  exports: [ImagesLazyloadDirective],
})
export class ImagesLazyloadModule { }

Sử dụng module images-lazyload

Chúng ta đã tạo xong module của lazyload rồi. Nó sẽ như là một thư viện do chính bạn tạo ra vậy, và bạn chỉ cần nhúng vào nơi mà bạn muốn sử dụng. Ở đây mình sẽ nhúng vào app.module.ts.

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { ImagesLazyloadModule } from './shared/images-lazyload/images-lazyload.module';

@NgModule({
  declarations: [AppComponent],
  imports: [
    BrowserModule,
    ImagesLazyloadModule, // nhúng vào đây
  ],
  providers: [],
  bootstrap: [AppComponent],
})
export class AppModule { }

Bây giờ thì chúng ta có thể sử dụng được rồi. Trong app.component.html, chúng ta hãy thử lazy-load một loạt các tấm ảnh, bao gồm cả thẻ img và ảnh nền sử dụng thẻ div. Các bạn để ý là mình không lazy-load 2 tấm ảnh đầu tiên để tránh lỗi layout-shift. Như có chia sẻ trong bài viết trước, các bạn không nên lazy-load các tấm ảnh above-the-fold nhé.

<img src="https://images.unsplash.com/photo-1507525428034-b723cf961d3e?w=753&q=80" width="753" height="500">
<img src="https://images.unsplash.com/photo-1519046904884-53103b34b206?w=753&q=80" width="753" height="500">

<!-- lưu ý là KHÔNG sử dụng thuộc tính src="..." nhé -->
<img loading="lazy" data-src="https://images.unsplash.com/photo-1495954484750-af469f2f9be5?w=753&q=80" width="753" height="500">
<img loading="lazy" data-src="https://images.unsplash.com/photo-1587502536900-baf0c55a3f74?w=753&q=80" width="753" height="500">
<img loading="lazy" data-src="https://images.unsplash.com/photo-1510414842594-a61c69b5ae57?w=753&q=80" width="753" height="500">
<img loading="lazy" data-src="https://images.unsplash.com/photo-1471922694854-ff1b63b20054?w=753&q=80" width="753" height="500">
<div loading="lazy" data-src="https://images.unsplash.com/photo-1473186578172-c141e6798cf4?w=753&q=80" class="lazy-bg-image"></div>
<div loading="lazy" data-src="https://images.unsplash.com/photo-1487349384428-12b47aca925e?w=753&q=80" class="lazy-bg-image"></div>
<div loading="lazy" data-src="https://images.unsplash.com/photo-1527437934671-61474b530017?w=753&q=80" class="lazy-bg-image"></div>
<div loading="lazy" data-src="https://images.unsplash.com/photo-1473496169904-658ba7c44d8a?w=753&q=80" class="lazy-bg-image"></div>

Với ảnh img, mình hard-code luôn chiều rộng và chiều cao để tránh lỗi layout-shift. Đương nhiên cách này chỉ dùng được nếu bạn đã biết chiều rộng và cao của nó thôi nhé. Thực tế việc này nằm ngoài phạm vi bài viết nên mình dùng tạm cách này để demo cho nhanh, chứ ở production mình không nên dùng mà sẽ có những cách khác “xịn xò” hơn.

Với ảnh background sử dụng thẻ div, nếu bạn không có content bên trong thì bạn sẽ chẳng thấy gì đâu. Bạn thêm một tí CSS vào file app.component.scss

.lazy-bg-image {
  width: 753px;
  height: 500px;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

Vậy là xong rồi đấy, cùng chạy thử thôi.

Online demo: https://stackblitz.com/edit/angular-lazy-load-images-module

NPM Package

Phần này mình bổ sung thêm nếu bạn nào không thích copy paste và tự maintain code, mà muốn install thư viện bên ngoài để “đảm bảo chất lượng” và hi vọng “họ sẽ maintain giúp mình”, thì mình đã publish module trên thành một thư viện nho nhỏ tại đây: https://github.com/luongvanphuc/ng-lazy-image. Phần hướng dẫn cài đặt và sử dụng các bạn vào xem là thấy.

Bạn có thể xem online demo sử dụng thư viện ng-lazy-image tại đây: https://stackblitz.com/edit/angular-ng-lazy-image

Kết bài

Hi vọng bài viết của mình giúp ích cho các bạn Angular developer đang tìm cách lazy-load các tấm ảnh của mình. Nếu thấy hữu ích thì hãy upvote để mình có động lực viết tiếp các bài tiếp theo nhé. Hoặc các bạn có thắc mắc hay góp ý thì vui lòng để lại comment bên dưới.

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

12 plugin nên dùng trong Adobe XD

12 plugin nên dùng trong Adobe XD

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

Trước kia khi nói đến design chắc ai cũng nghĩ ngay đến bộ tool của adobe như photoshop, illustrator … Vì nó làm được mọi thứ. Từ xoá phông nền cho đến thiết kế banner, logo website.

1 người mới bắt đầu mà đi dùng bộ adobe này chắc ngộp thở mất. Vì nó trang bị quá nhiều chức năng.

Chính vì trong hoàn cảnh đó mà 1 số công cụ khác đã ra đời giúp dễ dùng hơn. 1 trong những công cụ không thể kể đến đó là Adobe XD.

Bản thân mình cũng rất thích dùng Adobe XD. Vì nó free, mà lại còn nhẹ nữa.

Logo nghệ thuật coding mình cũng dùng adobe XD để thiết kế.

Hôm nay mình sẽ giới thiệu cho các bạn 1 số plugin mình thấy khá là hay khi dùng AdobeXD. Bản thân mình cũng đang dùng nó.

  Cách sử dụng các plugins jQuery trong VueJS
  Top các Plugin jQuery tạo Lightbox free đẹp nhất cho website

VizziCharts công cụ vẽ đồ thị

12 plugin nên dùng trong Adobe XD

Đây là plugin giúp chúng ta vẽ đồ thị 1 cách nhanh hơn.

Chi tiết xem ở đây.

Yotako tự động sinh ra source code

12 plugin nên dùng trong Adobe XD

Đây là plugin giúp chúng ta có thể tự động sinh ra source code từ 1 file design data có trước.

Chi tiết xem ở đây.

Icondrop chứa hàng triệu vector icon

12 plugin nên dùng trong Adobe XD

Đây là 1 trong những plugin mình thích nhất. Nó cung cấp cho chúng ta hàng triệu icon free. Từ banner cho đến những ảnh infographics. Toàn hàng ngon cả. Tuy nhiên cũng có 1 số ảnh mất phí.

Plugin này có thể sử dụng được trong cả sketchapp và photoshop nữa.

Chi tiết xem ở đây.

Zeplin tự động sinh ra style guide

12 plugin nên dùng trong Adobe XD

Đây là 1 trong những plugin sinh ra style guide khá là tiện.

Nếu làm design mà không có style guide cũng giống như việc râu ông nọ cắm cằm bà kia. Màu sắc, font chữ nó sẽ rất lộn xộn, không thống nhất.

Ví dụ như designer tạo ra banner với màu sắc như này. Nhưng mà ông frontend lại dùng với màu sắc khác (không giống hoàn toàn). Rồi có khi lúc dùng font này, lúc dùng font khác.

Do đó cần phải có 1 style guide chuẩn.

Chi tiết xem ở đây.

Airtable chèn ảnh và text dummy dễ dàng

12 plugin nên dùng trong Adobe XD

Ví dụ như khi thiết kế màn hình danh sách người dùng. Khi đó chắc chắn cần phải hiển thị ảnh avatar của người dùng ra. Vậy lúc đó sẽ tìm ảnh ở đâu?

Chắc mọi người sẽ lên mạng search rồi tự chèn bằng tay vào. Cách này cũng được nhưng hơi mất công.

Có 1 cách nhanh hơn là dùng plugin này. Nó sẽ giúp chúng ta chèn ảnh với text dummy 1 cách dễ dàng. Ảnh thì vô cùng phong phú luôn. Không phải lo về nguồn ảnh.

Chi tiết xem ở đây.

UI Faces chèn ảnh avatar

12 plugin nên dùng trong Adobe XD

Plugin này thì chuyên về ảnh avatar.

Chi tiết xem ở đây.

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

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

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

Tất tần tật về thuộc tính position trong CSS

Hiểu về thuộc tính position trong CSS – Khi bạn thiết kế các layout cho website việc chuyển từ file thiết kế theo định dạng HTML (Hypertext Markdown Language) bạn sẽ buộc phải sử dụng thuộc tính position trong CSS. Ví dụ như làm thanh tính năng trên menu, header, v.v. Có thể hiểu nó là thuộc tính xác định loại của phương pháp định vị trí cho thành phần.

position trong css

Với thuộc tính position chúng ta có 5 giá trị chính cần biết:

Static: Đây được xem là giá trị hiển thị Position trong css một cách mặc định (default), các thành phần sẽ nằm theo thứ tự của văn bản

Relative: Định vị trí tuyệt đối cho các thành phần, không gây ảnh hưởng tới vị trí ban đầu hay các thành phần khác.

Absolute: Giá trị này sẽ giúp định vị trí tuyệt đối cho thành phần theo thành phần bao ngoài, hoặc ít nhất là theo cửa sổ trình duyệt. Fixed: Định vị trí tương đối cho thành phần theo cửa sổ trình duyệt.

Fixed: Định vị và giúp cho phần tử luôn cố định một chỗ, ví dụ như khi bạn scroll trình duyệt chẳng hạn, phần tử sẽ không thay đổi.

Inherit: Xác định thừa hưởng thuộc tính từ thành phần cha (thành phần bao ngoài).

  Mẹo quy ước tên cho CSS giúp bạn rút ngắn 2/3 thời gian khi debug!
  Responsive HTML bằng một dòng CSS

Trước hết hãy nói về thuộc tính position relative, absolute và các thuộc tính cool ngầu khác

Thuộc tính Position Relative

Thuộc tính position: relative trong CSS giúp Định vị trí tuyệt đối cho các thành phần. Ví dụ:

selector{position: relative;}

Nếu bạn sử dụng thuộc tính này thì sẽ phải sử dụng kèm theo với các thuộc tính căn chỉnh tọa độ của thành phần (lưu ý: các giá trị của các thẻ này là chính là đơn vị đo như px). Top: là cách trên, Bottom: là cách dưới, Left: là cách trái, Right: là cách phải. Hãy cùng nhìn qua đoạn code ví dụ sau đây:

<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Thuộc tính position trong CSS</title>
</head>
<style type="text/css" media="screen">
    div {
        padding: 40px;
        margin: 20px;
        width: 320px;
        border: 2px solid red;
    }
</style>
<body>
    <div>TopDev tuyen dung IT hang dau.</div>
    <div class="relative">TopDev tuyen dung IT hang dau.</div>
    <div>TopDev tuyen dung IT hang dau.</div>
</body>
</html>0

Mọi người có thể test thử và thấy rằng các thẻ hiển thị đúng thứ tự, giờ ta có thể thêm đoạn CSS vào class relative như sau:

.relative {position: relative;
   /Cách bên trái 260px/
    left: 260px;
    /Cách bên trên 290px/ 
    top: 290px; 
    background-color: #e1ab22; 
}

Lưu ý, khi bạn bù một vị trí phần tử với position: relative, không gian nó chiếm không di chuyển, vị trí hiện tại của nó sẽ khiến đổi bố cục xung quanh vị trí đó không thay đổi…Tưởng tượng như thế này, position: relative giống như nhân vật có khả năng di chuyển tự do, nhưng luôn luôn liên quan đến nơi ban đầu.

position trong css

Thuộc tính Position Absolute

Như đã nói ở trên thuộc tính position: absolute trong CSS có tác dụng giúp định vị trí tuyệt đối cho thành phần theo thành phần bao ngoài, hoặc ít nhất là theo cửa sổ trình duyệt. Cụ thể hơn, thuộc tính absolute xác định định tọa độ của thành phần theo một thẻ cha relative (nếu có), Nếu không có thẻ cha thì nó sẽ đi theo body của toàn trang web. Cách sử dụng cũng tương tự như relative.

Dưới đây là ví dụ tương tự như bên trên thay vào đó là thẻ absolute. Các bạn sẽ thấy rõ rằng khi chúng ta di chuyển các thành phần bằng absolute thì các thẻ tiếp theo sẽ được đưa lên vị trí mặc định. Bạn có thể thử ngay nhé.

.absolute {
    position: absolute;
    /Cách bên trái 260px/
    left: 260px;
    /Cách bên trên 290px/
    top: 290px;
    background-color: #e1ab22;
}

Thuộc tính Position Static

Thuộc tínhposition: staticđược xem là giá trị mặc định (default) của position. Đây là các giá trị mà dù bạn có khai báo chúng hay không khai báo thì các phần tử (element) sẽ tự được sắp xếp vị trí một cách như bình thường trên trang web. Bạn có thể nhìn vào ví dụ sau

<body>

   <div class="box-red"></div>

   <div class="box-green"></div>

</body>

Bạn có thể thử thêm position static như sau:

// Đây là khi bạn không khai báo position
.box-orange {          

  background: Green;

  height: 250px;

  width: 250px;       

}

.box-blue {

  background: grey;

  height: 250px;

  width: 250px;

  position: static;   
}
//*Sau khi bạn đã khai báo static
  SASS/SCSS là gì?
  Sử dụng CSS content như thế nào cho đúng

Thuộc tính Position Fixed

Thuộc tính thường được các lập trình viên dùng để định vị một thành phần so với window hiển thị của các trình duyệt. Bạn có thể thấy ví dụ này, khi vào một website nào đó và bạn thử scroll browser, bạn sẽ thấy menu hay button cứ đứng yên một chỗ không thay đổi thì đó chính là position fixed. Giá trị này hoàn toàn không phụ thuộc vào phần tử cha, khi nào scroll trình duyệt là nó hoạt động thôi. Bạn có thể thử tham khảo ví dụ sau đây:

.header {
    margin-top: 0px;
    text-align: center;
    position: fixed;
    top: 0px;
    width: 100%;
    background: #e1ab22;
}

Thuộc tính Position Sticky

Đây là một thuộc tính khá tương đồng với fixed, bạn có thể xem nó như một sự kết hợp “lưỡng long nhất thể” của relative và fixed. Vì có sự lai tạo này nên nó cũng không được hỗ trợ quá nhiều trong cộng đồng làm web. Nó cũng không sử dụng được trên trình duyệt Internet Explorer cũng như một số phiên bản đầu của Edge nên sẽ dễ gây lỗi. Không khuyến khích các lập trình viên sử dụng

position-trong-css-sticky

10 khóa học Font-end không thể bỏ qua

TopDev xin giới thiệu đến các bạn đọc top 10 Khóa học, Hướng dẫn, Đào tạo, Lớp học và Chứng chỉ về font-end hoàn toàn miễn phí.

Web Designing Certification by University of Michigan (Coursera)

Khóa học này do Đại học Michigan tiến hành phù hợp nhất cho tất cả những ai muốn học cách thiết kế các trang web chuyên nghiệp và tinh tế. Các giảng viên sẽ dạy bạn cách xây dựng một trang web bằng cách sử dụng JavaScript, CSS3 và HTML5.

Đến với khóa học này, bạn còn có thể đảm nhiệm luôn cả vai trò của web developer. Bạn sẽ được dạy về các kỹ thuật công nghệ mới, phát triển các trang web chất lượng có thể hoạt động trên trình duyệt máy tính bàn, máy tính bảng và điện thoại di động.

Ngoài ra, thời gian học của khóa học này khéo dài khoảng 3 tháng, thời gian linh hoạt, lịch học được xếp tùy thuộc vào thời gian của người học.

The Front-End Web Developer Bootcamp (Udemy)

Khóa học này hứa hẹn sẽ giúp bạn tìm hiểu tất cả các công nghệ, nền tảng cần thiết để phát triển web. Các lớp nhập môn sẽ giới thiệu cho bạn những kiến ​​thức cơ bản về nhiều loại ngôn ngữ khác nhau như HTML, CSS, JS, Node, MongoDB…

Bạn sẽ học được cách tạo các ứng dụng web, game và được tiếp cận nhiều kiến thức phức tạp hơn. Udemy chú trọng cân bằng giữa các lớp lý thuyết và thực hành giúp người mới học dễ dàng theo dõi hơn.

Vào cuối chương trình, bạn sẽ có một loạt kinh nghiệm để đưa vào sơ yếu lý lịch của mình và một loạt các dự án tuyệt vời để giới thiệu. Thời gian học của khóa học này khéo dài khoảng 46 giờ.

The Complete Web Developer: Zero to Mastery (Udemy)

Andrei – cha đẻ của khóa học này đã có kinh nghiệm làm việc với tư cách là nhà phát triển cấp cao tại Thung lũng Silicon trước khi quyết định chia sẻ kiến ​​thức phong phú của mình với học viên. Trong khóa học này, anh ấy sẽ dạy bạn viết mã bằng HTML5, CSS, Javascript, React, Node.js, Machine Learning và nhiều hơn nữa.

Front-End Web Development Certification (Coursera)

Nếu bạn đang mong muốn đưa kiến ​​thức Bootstrap của mình để sử dụng và làm việc trong quá trình phát triển ứng dụng front-end thì không cần tìm đâu xa, khóa học này sẽ giúp bạn sử dụng thư viện React và Javascript ES6 để xây dựng ứng dụng.

Bạn sẽ được làm quen với các khía cạnh khác nhau của React, Flux, Redux và học về thuộc tính position trong css. Sau khi đạt được mục tiêu cốt lõi của chương trình, bạn sẽ kết thúc các lớp học với các bài giảng về hỗ trợ và kiểm tra hoạt ảnh React. Vì đây là lớp trình độ trung cấp nên cần có kiến ​​thức về Bootstrap 4, Javascript và các công nghệ web liên quan.

Thời gian học của khóa học này khéo dài 4 tuần, 6 – 8 giờ mỗi tuần.

Front-End Web Development Courses (Udemy)

Với sự tiến bộ của web, sự phát triển của các ứng dụng web cũng đã trải qua một chặng đường dài và đang phát triển mỗi ngày. Vì vậy, khóa học này được đặc biệt thiết kế để giúp bạn xây dựng sự nghiệp trên con đường phát triển ứng dụng web.

Điểm nổi bật của khóa học này là nó phù hợp cho tất cả mọi người ở mọi cấp độ khác nhau. Các bài học xoay quanh về ngôn ngữ và đa dạng các loại công nghệ, do đó học viên sẽ có thể tự do lựa chọn bài giảng phù hợp với bản thân.

Trong cuối các bài giảng, bạn sẽ có dịp tham gia các khóa học nâng cao hơn khi bạn đã nắm rõ hết tất cả kiến thức và có kết quả thực hành tốt. Thời gian học của khóa học này do chính bạn tự điều chỉnh theo năng lực.

Front-End Web Developer Course (LinkedIn Learning – Lynda)

Khóa học này được tạo ra để giúp bạn đạt được các kỹ năng chính, cần thiết để phát triển trải nghiệm người dùng và tương tác trên web. Tìm hiểu mọi kỹ thuật cần thiết để thiết kế và xây dựng mã hướng tới người dùng.

Hơn nữa, các bài giảng dạy bạn làm thế nào để đưa ra các ý tưởng và concept từ cuộc sống vào canvas của trình duyệt bằng cách kết hợp các kỹ năng đồ họa và mã hóa cần thiết. Với hơn 15 mục học tập và nội dung nâng cao.

Thời gian học của khóa học này do chính bạn tự điều chỉnh theo năng lực.

Các khóa học chứng nhận Front-End (Coursera)

Khóa học này sẽ liệt kê ra các chương trình, khóa học chuyên môn bao gồm các khía cạnh và công nghệ khác nhau cần thiết để phát triển front-end. Có rất nhiều framework và ngôn ngữ được dạy trong khóa học này như React, Bootstrap, Angular JS, bạn cũng sẽ phải hiểu về thuộc tính position trong css…

Các khóa học này có yêu cầu thời lượng dạy khác nhau, bạn có thể chọn khóa nào phù hợp với yêu cầu của mình. Thời gian học của khóa học này do chính bạn tự điều chỉnh theo năng lực.

Front-End Web Developer Certification by W3C (edX)

Kỳ thi chứng chỉ chuyên nghiệp về Font-end này do W3C tạo ra bao gồm tất cả các kỹ thuật cần thiết cần thiết để xây dựng trải nghiệm người dùng phản hồi và tương tác trên web.

Trọng tâm chính là ba ngôn ngữ nền tảng web: CSS, HTML5 và Javascript. Với sự giúp đỡ của các chuyên gia nổi tiếng, bạn được hưỡng dẫn học từng bước cách tạo và triển khai các khái niệm đổi mới và làm việc trên các ví dụ thực tế để hiểu rõ hơn về các chủ đề.

Thời gian học của khóa học này gồm 4 – 6 tuần mỗi khóa, 6 – 10 giờ mỗi tuần, bạn cần học 5 khóa để hoàn thành chứng chỉ này.

Microsoft Professional Certification in Front-End Web Development (edX)

Khóa học chuyên nghiệp do Microsoft tạo ra này được thiết kế để giúp bạn xây dựng nền tảng kiến thức vững chắc bằng cách tập trung vào các nguyên tắc cơ bản và giúp bạn giải đáp những thắc mắc của bạn. Các bài giảng sẽ giới thiệu cho bạn về một số công cụ và tính năng được sử dụng thường xuyên nhất với nhiều bản trình diễn khác nhau.

Sẽ có một dự án ở cuối chương trình để giúp bạn tổng hợp, sắp xếp các kiến thức mà bạn đã học. Bạn sẽ phải sử dụng kiến thức của bạn để tự xây dựng một dự án nâng cấp portfolio của bạn.

Sau khi hoàn thành chuỗi 11 khóa học này, bạn sẽ thành thạo và sẵn sàng ứng tuyển vị trí web developer front-end tại công ty bạn chọn hoặc làm nghề tự do.

Thời gian học của khóa học này gồm 11 khóa học, 6 – 10 giờ/tuần/khóa

Front-End Web Developer Course for Beginners (Codecademy)

Lộ trình học tập này của Codecademy được thiết kế dành cho các bạn vừa mới bắt đầu, không có kinh nghiệm trở thành một web developer ở level junor. Bài học bắt đầu với các ngôn ngữ giao diện người dùng như HTML, CSS và JavaScript.

Khi bạn đã nắm vững các công nghệ giao diện người dùng, bạn sẽ được học các kỹ năng khác với trình độ cao hơn. Cuối cùng, bạn sẽ thành thạo trong việc xây dựng và design các trang web.

Thời gian học của khóa học này kéo dài khoảng 30 tuần.

Lời kết

Có thể nói, thuộc tính position trong CSS là một trong những kiến thức cực kỳ quan trọng cần được nắm vững. Các thuộc tính này được sử dụng rất nhiều trong việc làm website hiện nay đặc biệt là khi bạn thực hiện việc cắt layout cũng như làm các thành phần như menu. Bạn nên tìm hiểu thêm một số bài tập về position để sử dụng tính năng này thuần thục hơn nữa.

Bài viết liên quan:

Xem thêm việc làm CSS không yêu cầu kinh nghiệm tại TopDev

Lộ diện top 7 công ty công nghệ Hàn Quốc tại Việt Nam tiếp tục trao cơ hội cho lập trình viên Việt

top 7 công ty công nghệ Hàn Quốc

Sau sự kiện ký kết văn bản ghi nhớ vào ngày 29/07/2020, đánh dấu 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, các lập trình viên càng có nhiều cơ hội 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 là môi trường làm việc chuyên nghiệp cùng nhiều công nghệ tiên tiến tại các công ty Công Nghệ Hàn Quốc.

Đừng bỏ lỡ top 7 cơ hội tiếp theo từ các công ty Công Nghệ Hàn Quốc chất lượng này nhé!

top 7 công ty công nghệ Hàn Quốc

1. VNIB Tech 

Mở màn danh sách chính là VNIB TECH, là công ty phần mềm được đầu tư 100% vốn bởi công ty mẹ – Công ty TNHH Innerbus tại Hàn Quốc. Tại đây, bạn sẽ có cơ hội làm việc trong môi trường chuyên nghiệp & linh hoạt, cùng những đồng nghiệp thân thiện, hòa đồng và vui tính.

Bạn đã sẵn sàng cùng VNIB Tech hoàn thành sứ mệnh: “Mang thế giới gần nhau hơn bằng công nghệ”?

⇒ Gia nhập ngay hôm nay tại các vị trí hấp dẫn tại VNIB:

2. PLUS N SOFT

Được thành lập vào năm 2014, PLUS N SOFT chuyên thực hiện nhiều dự án mobile với các công ty hàng đầu trong và ngoài nước. Ngoài ra, công ty đã xây dựng nhiều loại cơ sở hạ tầng khác nhau, giúp tối ưu hóa bộ xử lý để cung cấp các dịch vụ Outsourcing, Business Consulting and Global Platform chất lượng.

Và nếu bạn đam mê “dò code tìm bug”, muốn thử sức với các dự án test về hệ thống, thì vị trí Backend Developer tại PLUS N SOFT đang chờ bạn!

3. Shark Market

Shark Market là công ty hoạt động trong lĩnh vực Thương mại điện tử/bán lẻ. Thông qua website www.sharkmarket.vn và ứng dụng Shark Market, công ty đang nỗ lực không ngừng để hoàn thiện sứ mệnh chọn lọc những sản phẩm tốt nhất, giao hàng hóa thực phẩm tươi ngon nhất đến tay khách hàng. 

Bạn đang tìm kiếm cơ hội phát triển tay nghề lập trình tại một trong những công ty thuộc lĩnh vực Thương mại điện tử? Khám phá Shark Market để nắm bắt cơ hội ngay hôm nay.

4. Coconut Silo 

Coconut Silo là startup in-house trực thuộc Hyundai Motor Group, ra đời với nhiệm vụ phát triển nền tảng logistics xuyên biên giới ở các nước ASEAN: bắt đầu từ Việt Nam đến Campuchia, Lào và Thái Lan. 

Tự hào với với văn hóa làm việc tuyệt vời cùng các công nghệ hiện đại, Coconut Silo hứa hẹn sẽ là nơi để các lập trình viên Việt tỏa sáng tài năng. Đừng quên, tại Coconut Silo còn có cơ hội công tác tại Hàn Quốc, giúp vươn tầm sự nghiệp của các lập trình viên.

⇒ Mời bạn khám phá ngay công ty Coconut Silo

5. Mintpot 

Mintpot là một trong những công ty sáng tạo thông minh, chuyên cung cấp các dịch vụ video VR có phụ đề Mint VR. Được thành lập từ năm 2016 cho đến nay, Mintpot luôn theo đuổi mục tiêu tạo ra một cuộc sống tốt hơn với VR.

3 lý do bạn nên lựa chọn về với Mintpot:

  • Môi trường làm việc năng động, trẻ trung, linh hoạt;
  • Cơ hội phát triển và thăng tiến cao;
  • Chế độ lương thưởng hấp dẫn cùng nhiều đãi ngộ tốt: Lương tháng 13, tặng Quà Tết, Bánh sinh nhật, Party hàng tháng, Hoạt động giải trí vui vẻ hết mình cùng đội ngũ,…

⇒ Vậy bạn chờ chi không mau lựa chọn 1 trong 2 vị trí đang chiêu mộ tài năng tại Mintpot

6. T&Y 

T&Y chuyên hoạt động trong lĩnh vực xuất nhập khẩu máy móc, linh kiện điện tử, gia công phần mềm, đại lý du lịch trong và ngoài nước, hỗ trợ các vấn đề pháp lý cho người Việt tại Hàn…

Đây sẽ là lựa chọn tuyệt vời nếu bạn là C++ Software Engineer, bởi ngoài mức lương cực cao, T&Y còn có nhiều hấp dẫn khác:

  • Thưởng theo hiệu suất công việc xứng đáng;
  • Giờ giấc tự do miễn là hoàn thành công việc được giao với hiệu quả tốt nhất.

7. ZOOKIZ

ZOOKIZ là công ty chuyên phát triển các dịch vụ quảng cáo dựa trên các nhân vật hư cấu – fictional characters – như comic, sticker, animation trên các nền tảng social media. ZOOKIZ vẫn đang tìm kiếm những “người bạn” lập trình tài năng tham gia và cùng thực hiện mục tiêu “share love and fun to people”.

Nếu đó là bạn? Đừng chần chừ khám phá thêm về ZOOKIZ nhé!

top 7 công ty công nghệ Hàn Quốc

Cùng với sự xuất hiện tiếp theo của 7 công ty IT Hàn Quốc trên đường đua công nghệ tại Việt Nam, “cái bắt tay chiến lược” của KICC HCMC X TopDev sẽ còn mang đến cho cộng đồng IT Việt Nam nhiều cơ hội mới. Đừng quên 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 các công ty IT Hàn Quốc 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

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

Cách tạo dự án trong Android Studio phiên bản năm 2020

Cách tạo dự án trong Android Studio phiên bản năm 2020

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

Ở bài 1 Tui đã hướng dẫn chi tiết cách tải và cài đặt Android Studio phiên bản năm 2020. ở bài này Tui sẽ trình bày cách sử dụng nó bằng cách tạo một dự án siêu kinh điển “HelloWorld”, tuy nhiên trước khi tạo dự án thì ta cần Go Over qua một số chức năng quan trọng.

  10 tài liệu lập trình Android miễn phí từ cơ bản đến nâng cao
  30+ công cụ phát triển ứng dụng Android chuyên nghiệp ( Phần 1)

Khởi động phần mềm Android Studio phiên bản năm 2020 lên:

Ở màn hình trên ta thấy có tên phương bản và có các mục bên dưới:

Tên chức năng Ý nghĩa
Start a new Android Studio project Tạo một dự án mới
Open an existing Android Studio project Mở một dự án đã có, dự án này được viết bằng công cụ Android Studio
Get from Version Control Lấy Code từ server về, chắc hạn như: Github, TFS…
Profile or debug APK Kiểm tra đo lường, debug APK
Import Project (Gradle, eclipse ADT, etc.) Mở một dự án Android được viết bằng Gradle, Eclipse….
Import an Android code sample Mở một số code Android mẫu

Ở góc dưới cùng có nút “Configure”, nhấn vào nó:

Cách tạo dự án trong Android Studio phiên bản năm 2020

Tên chức năng Ý nghĩa
AVD Manager(quan trọng) Quản lý thiết bị giả lập (điện thoại thông minh, đồng hồ thông minh,…)AVD: Android Virtual Device
SDK  Manager(quan trọng) Quản lý các phiên bản thư viện lập trìnhSDK: Software Development Kit
Settings Cấu hình đủ loại: giao diện, màu mè
Plugins Cấu hình Plugins cho Android
Default Project Structer(quan trọng) Cấu hình Android SDK Location, Android NDK location, JDK location
Check for Updates(quan trọng) Cập nhật phiên bản mới
Và Các chức năng khác

Bản thân các chức năng này cũng được Android Studio bố trí trong màn hình của 1 Project (các chức năng Tui sẽ lần lượt hướng dẫn chi tiết khi có nhu cầu dùng). Google để ở đây là vì các cấu hình này thường ta chỉ làm 1 lần đầu tiên mà thôi, khi mọi thứ đã ổn rồi thì không cần vào đây phá phách làm gì, hư bột hư đường.

Việc cấu hình mấy chỗ này rất quan trọng, nếu làm sai thì không thể chạy được phần mềm (tuy nhiên nó chỉ xảy ra với các newBie thôi nhé). Nên để không rắc rối thì trong quá trình học, gặp lỗi nào Tui sẽ hướng dẫn cách khắc phục.

Bây giờ ta bắt đầu new 1 dự án Siêu kinh điển nhé “HelloWorld”:

Từ màn hình khởi động phần mềm Android Studio, ta nhấn vào “Start a new Android Studio project“, lúc này Android sẽ yêu cầu chúng ta chọn một dự án mẫu:

Cách tạo dự án trong Android Studio phiên bản năm 2020

Trong này có rất nhiều Template dự án, mới học thì ta chọn loại “Empty Activity”, đừng cố tỏ vẻ nguy hiểm chọn mấy loại khác nha (không cần thiết), chúng ta lưu ý khi làm bất cứ việc gì thì điều quan trọng là phải làm đúng trước đã sau đó mới tới sáng tạo, tới đẹp. Còn ngay từ đầu chưa làm được gì mà đòi đẹp đòi sáng tạo thì thật là hi vọng điên cuồng, đi ngược lại nguyên lý triết học. Khi nắm được căn cơ rồi thì việc bung lụa sau này không còn là vấn đề:

Cách tạo dự án trong Android Studio phiên bản năm 2020

Sau khi chọn “Empty Activity”, ta nhấn “Next” để tiếp tục, lúc này màn hình Cấu hình dự án sẽ xuất hiện ra như dưới đây:

Cách tạo dự án trong Android Studio phiên bản năm 2020

Tên chức năng Ý nghĩa
Name Tên Dự án, nên đặt tên có ý nghĩa, nó phải súc tích và toát lên được ý nghĩa của dự án
Package name Package name rất quan trọng, nó được dùng để tải APK lên Google Play. Được xem như là ứng dụng. Nếu sản phẩm này viết cho ai thì nên đặt theo domain của người đó.Ví dụ:

Khách hàng A có domain tranduythanh.com

Công ty B có domain: duythanhcse.wordpress.com

Công ty B viết dự án cho Khách hàng A, thì package nên đặt là tranduythanh.com (không đặt duythanhcse.wordpress.com) để sau này không xảy ra tranh chấp, cũng như khi đưa lên Google play thì phải lấy theo các tài khoản của A. Vì với bản Mobile nếu ta chỉ có mỗi Coding cũng chả làm gì được, nó còn các file xác thực nữa (đội IT của bên A phải  chủ động tư vấn)

Save location Nơi lưu trữ dự án
Language Chọn Java (nó có Kotlin) nhưng Tui trình bày Java
Minimum SDK Chọn tối thiểu là 26

Bây giờ ta đặt các thông số giống như màn hình Tui chụp và sau đó nhấn nút “FINISH“, ráng chờ nha:

Cách tạo dự án trong Android Studio phiên bản năm 2020

ở màn hình trên là Android Studio đang trong quá trình tạo dự án, bạn đừng có manh động, chờ , chờ … tùy vào độ cùi bắp của máy tính chúng ta mà chờ lâu hay mau:

Cách tạo dự án trong Android Studio phiên bản năm 2020

Bạn chờ cho tới khi nó ra được màn hình như trên là đã hoàn tất quá trình tạo một dự án Trong Android Studio rồi đó.

Chúng ta lưu ý, trong Android: Mỗi màn hình nó sẽ có 2 thành phần:

  • Giao diện (XML) -> mở thư mục res -> layout.
  • Xử lý code (Java, kotlin, python, C++…)

Cách tạo dự án trong Android Studio phiên bản năm 2020

Như vậy chúng ta đã hoàn thành xong bài học Tạo một dự án trong Android Studio

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

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

Tuyển nhân viên android, các việc làm Mobile hấp dẫn tại TopDev

Thủ thuật với Sublime Text (P1)

Thủ thuật với Sublime Text (P1)

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

  Sublime Text là gì? Hướng dẫn cài đặt Sublime Text 3 chi tiết
  Text Editors: Atom và Sublime

1.Sublime Text là gì?

Mọi developer thì đều chắc cũng đã biết đến sublime text, nói ngắn gọn thì nó là một chương trình dùng để code. Nhưng ở bài viết này tôi sẽ không hướng dẫn về code mà sẽ hướng dẫn về những thủ thuật của sublime text mà sẽ giúp chúng ta tăng hiệu suất làm việc lên.

2. Ví dụ

Tôi sẽ cho ví dụ về một bài tập java Problem1, bài tập này yêu cầu chúng ta tạo class Drink, Food, Cloth, Material và tạo các thuộc tính cho những class đó theo như hình bên dưới.

Thủ thuật với Sublime Text (P1)

Nếu ai đã làm qua java hoặc môt ngôn ngữ nào đó thì khi đọc vào bài Prolem1 này thì các bạn sẽ đều hình dung ra cách làm rồi. Đầu tiên là chúng ta sẽ tạo class Drink sau đó sẽ copy các thuộc tính vào và tạo public/private, kiểu dữ liệu cho các thuộc tính đó. Tuy nhiên những class này có số lượng các thuộc tính ít cho nên sẽ không mất thời gian nhiều cho việc này. Giả sử những class sẽ có vài chục hay lên đến cả trăm thuộc tính thì cũng sẽ mất rất nhiều thời gian để tạo.

Vì vậy bài viết này ra đời nhằm giúp cho các bạn rút ngắn được thời gian tạo các thuộc tính cho class. Tôi sẽ sử dụng chức năng trong sublime text để hỗ trợ cho việc này. Hãy cùng bắt đầu nhé.

2.1 Tạo class Drink (Tôi sử dụng eclipse)

Thủ thuật với Sublime Text (P1)

2.2 Copy các thuộc tính và kiểu dữ liệu của Drink vào sublime text

Thủ thuật với Sublime Text (P1)

2.3 Nhấn giữ nút Shift + Chuột phải, rê chuột từ đầu dòng của vị trí 1 – 6 để chọn toàn bộ tất cả các đầu dòng.

2.4 Gõ vào chữ [private]

Thủ thuật với Sublime Text (P1)

2.5 Nhấn giữ nút Ctrl + Shift, và nhấn nút > để chọn tất cả các tên thuộc tính, khi đó ra được hình bên dưới.

Thủ thuật với Sublime Text (P1)

2.6 Nhấn phím > (2 lần), để di chuyển con trỏ sang phải 2 ký tự.

Thủ thuật với Sublime Text (P1)

2.7 Nhấn giữ nút Shift và nhấn thêm nút End để chọn toàn bộ những kiểu dữ liệu phía sau.

Thủ thuật với Sublime Text (P1)

2.8 Nhấn Ctrl + X để cắt toàn bộ kiểu dữ liệu để di chuyển ra vị trí trước của thuộc tính.

Thủ thuật với Sublime Text (P1)

2.9 Nhấn phím BackSpace để xóa đi khoảng trắng, sau đó nhấn ; để thêm vào cuối cho các thuộc tính.

Thủ thuật với Sublime Text (P1)

2.10 Nhấn giữ Ctrl + Shift và nhấn phím < (Left) để chọn toàn bộ tên các thuộc tính.

Thủ thuật với Sublime Text (P1)

2.11 Nhấn phím < để di chuyển sang trái 1 ký tự và Ctrl + V để dán các kiểu dữ liệu mà đã cắt ở 2.8, sau đó nhấn phím space sẽ được như sau.

Thủ thuật với Sublime Text (P1)

2.12 Cuối cùng ta copy toàn bộ và paste vào trong eclipse

Thủ thuật với Sublime Text (P1)

Quá trình trên tuy nhiều bước nhưng nếu các bạn mà thao tác quen thì sẽ làm rất là nhanh, không mất quá nhiều thời gian. Hãy xem video demo nhé, mình thao tác rất chậm mà chưa tới 1p

Thủ thuật với Sublime Text (P1)

File proplem1 tôi để ở link này nhé : File Proplem1

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

Java Reflection là gì? Hướng dẫn Java Reflection API

Java Reflection là gì? Hướng dẫn Java Reflection API

Bài viết được sự cho phép của tác giả Trần Hữu Cương

Java Reflection là gì?

Java Refelection là một tính năng (gọi là API hay thư viện cũng được) trong Java. Java Reflection cho phép truy cập các thông tin của đối tượng (tên class, các field, các method) và chỉnh sửa các field của đối tượng (kể cả các field private) trong quá trình run time.

Ta có thể áp dụng Java Reflection trong những trường hợp không biết object được xử lý là gì. (tên class là gì, ở package nào, có những field nào, method nào…).

Ví dụ mình muốn viết một hàm copy 2 đối tượng có thể dùng cho loại đối tượng khác nhau. Thì mình cần phải biết 2 đối tượng có cùng kiểu không, có những field nào, lấy và copy giá trị từng field.

Ngoài ra, với các field, method có modifier là private thì ta không thể truy cập ở bên ngoài class đó. Trong những trường hợp bắt buộc phải gọi, truy cập các field, method private ở bên ngoài class đó thì Reflection là một giải pháp.

Tuyển dụng Java lương cao cho SV mới ra trường

Một số framework sử dụng Java Reflection:

  • Spring
  • JUnit
  • Tomcat
  • Eclipse (dùng để autocomplete)

>>> Xem thêm: Thông não Java Design Pattern – Dependency Injection

Hạn chế, nhược điểm của Java Reflection

Trong trường hợp đã biết rõ cấu trúc class, có quyền truy cập các field, method thì ta không nên sử dụng Java Reflection bởi các lý do sau:

  • Hiệu năng thấp: Ví dụ nó phải quét classpath để tìm class.
  • Các vấn đề bảo mật: Việc chỉnh sửa class/object trong quá trình runtime có thể ảnh hưởng tới các thread … khiến cho ứng dụng bị fail.
  • Khó bảo trì: Việc Reflection khá khó hiểu với người mới và không dễ để debug, nên sẽ rất khó để có thể tìm ra lỗi. Ngoài ra chúng ta cũng không thể check được một số lỗi trong quá trình compile (không tìm thấy class, không tìm thấy field…)

Các thành phần trong Java Reflection

Tương ứng với các thành phần trong một class, thì Java Reflection cũng cung cấp các class tương ứng để ta có thể xử lý:

  • Class: Đại diện cho class/interface để lấy ra các thông tin của class (tên class, super class, class modifier, các method, các field …)
  • Constructor: Xử lý các hàm khởi tạo của class
  • Field: Xử lý các field của class (tên, modifier của field, lấy giá trị, thiết lập giá trị cho object…)
  • Method: Xử lý các method của class (liệt kê các method, thực thi các method …)

>>> Xem thêm: Semaphore trong Java

Code ví dụ Java Reflection

Giả sử mình có 2 class sau:

Person.java
package stackjava.com.reflection;
public class Person {
  public String address;
  
 // setter - getter
}
Customer.java
package stackjava.com.reflection;

public class Customer extends Person {
 private int age;
 protected String gender;
 public String name;
 String phone;

 public Customer() {
 }
 public Customer(int age, String name) {
 this.age = age;
 this.name = name;
 }
 // setter - getter

 @Override
 public String toString() {
  return "Customer [age=" + age + ", gender=" + gender + ", name=" + name + ", phone=" + phone + "]";
 }

}

Bây giờ mình sẽ thực hiện liệt kê tất cả các field, method của Class Customer:

package stackjava.com.reflection;

import java.lang.reflect.*;

public class Demo1 {
 public static void main(String[] args) throws ClassNotFoundException {
  Customer customer = new Customer();
  customer.setName("kai");
  customer.setAge(25);

 demoReflection(customer);

 }

 public static void demoReflection(Object object) throws ClassNotFoundException {
Class myClass = object.getClass();
//   Class myClass = Class.forName("stackjava.com.reflection.Customer");

   System.out.println("Class name: " + myClass.getName());
   System.out.println("Super Class name: " + myClass.getSuperclass().getName());
   System.out.println("Is interface: " + myClass.isInterface());
   System.out.println("Constructors: ");
   Constructor[] constructors = myClass.getDeclaredConstructors();
   for (Constructor constructor : constructors) {
     System.out.println(" Number of parameters: " + constructor.getParameterCount() + " - modifier: "
         + getModifierName(constructor.getModifiers()));
    }
    
    System.out.println("Fields:");
    Field[] allFields = myClass.getDeclaredFields();
    for (Field field : allFields) {
      System.out.println(" " + field.getName() + " - type: " + field.getType() + " - modifier: "
          + getModifierName(field.getModifiers()));
    }

    System.out.println("Methods: ");
    Method[] methods = myClass.getDeclaredMethods();
    for (Method field : methods) {
      System.out.println(" " + field.getName() + " - modifier: " + getModifierName(field.getModifiers()));
    }
  }
  
  public static String getModifierName(int mod) {
    if (Modifier.isPrivate(mod)) {
      return "private";
    }
    if (Modifier.isProtected(mod)) {
      return "protected";
    }
    if (Modifier.isPublic(mod)) {
       return "public";
    }
    if (Modifier.isPrivate(mod)) {
       return "private";
    }
    return "default";
  }

}

Bạn có thể lấy đối tượng Class thông qua một object với method getClass() hoặc thông qua tên package + tên class với method Class.forName

Để lấy danh cách các hàm khởi tạo, các field, các method ta có thể dùng method getConstructors()getFields() hoặc getMethods(). Tuy nhiên các method không cho phép lấy các constructor, method, field có modifier là private do đó mình sẽ dùng getDeclaredConstructors()getDeclaredFields()getDeclaredMethods().

Method getModifier() trả về modifier của class, method, field nhưng ở dạng số dó đó mình sẽ viết thêm method getModifierName để hiển thị nó dưới dạng String.

Để lấy giá trị hoặc truyền giá trị cho các field của đối tượng bạn có thể dùng method field.set() / field.get()

Demo:

Class name: stackjava.com.reflection.Customer
Super Class name: stackjava.com.reflection.Person
Is interface: false
Constructors:
 Number of parameters: 0 - modifier: public
 Number of parameters: 2 - modifier: public
Fields:
 age - type: int - modifier: private
 gender - type: class java.lang.String - modifier: protected
 name - type: class java.lang.String - modifier: public
 phone - type: class java.lang.String - modifier: default
Methods: 
 toString - modifier: public
 getName - modifier: public
 setName - modifier: public
 setAge - modifier: public
 hello - modifier: public
 setPhone - modifier: public
 goodbye - modifier: private
 setGender - modifier: public
 getPhone - modifier: public
 getAge - modifier: public
 getGender - modifier: public

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

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

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

Học lập trình qua blog của các công ty công nghệ

học lập trình

  10 kênh Youtube học lập trình không thể bỏ qua dành cho Junior Web Developer / Designer

  32 cuốn sách học lập trình bạn nhất định phải đọc

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

Xem thêm IT Jobs Web Developer tại TopDev

Dùng con trỏ this trong JavaScript thế nào cho đúng?

Dùng con trỏ this trong Javascript thế nào cho đúng?

Bài viết được sự cho phép của tác giả Vũ Công Tấn Tài

Con trỏ this có lẽ là một khái niệm không mấy xa lạ trong lập trình hướng đối tượng, nó là một thể hiện cho đối tượng đang chứa đoạn mã lệnh đang được thực thi, hiểu nôm na kiểu ngôn ngữ con người là thế này:

Nam học bài rất chăm chỉ vì sẽ có một bài kiểm tra vào cuối tuần, bài kiểm tra này rất quan trọng đối với Nam.

           Có thể biểu diễn câu nói này bằng một cách khác như sau:

Nam học bài rất chăm chỉ vì sẽ có một bài kiểm tra vào cuối tuần này, bài kiểm tra này rất quan trọng đối với anh ấy.

          Hai câu trên hoàn toàn đồng nghĩa với nhau, mặc dù không nói rõ ràng nhưng tất cả chúng ta đều hiểu “anh ấy” chính là “Nam”. Con trỏ this cũng có ý nghĩa tương tự như thế, và nếu nói theo ngôn ngữ con người, thì con trỏ this chính là một “đại từ nhân xưng” nhằm ám chỉ một đối tượng cụ thể đã được chỉ rõ ở ngữ cảnh trước đó. Con trỏ this được sử dụng rất nhiều trong các đoạn mã JS, và nó cũng là một trong những khái niệm gây ra nhiều sự hiểu lầm (dẫn đến bug) nhất trong ngôn ngữ này.

Để lập trình tốt bằng Javascript thì người lập trình viên buộc phải hiểu rõ cách mà con trỏ this vận hành, sẽ là hơi dài dòng nếu ta muốn tìm hiểu đầy đủ về nó, nhưng một khi đã hiểu về nó, ta sẽ thấy công sức ta bỏ ra không phí một chút nào. Mọi người sẽ cần 1 chút kiên nhẫn để đạt được điều đó

         Trong các ngôn ngữ lập trình như C++, C#, Java, PHP hay cả Javascript, con trỏ this thường được sử dụng để chỉ đến object chứa phương thức đang được gọi thực thi, trông ra thì cách dùng này có vẻ tường minh và dễ hiểu, các đoạn mã kiểu đó thường có dạng như:

class student {
    String name;
    . . .
    String getName(){
        Return this.name;
    }
}

student Hocsinh1 = new student();
String _name = Hocsinh1.getName();

          Khi đoạn code trên được biên dịch và hàm getName() được gọi, thì con trỏ this trong hàm getName() được hiểu là đối tượng Hocsinh1 và this.name chính là chỉ định tới thuộc tính name của đối tượng Hocsinh1 đó. Cũng giống như “đại từ nhân xưng” trong ngôn ngữ nói, this đại diện cho đối tượng (object) ở trong ngữ cảnh (context) được nhắc đến trước đó. Rất dễ hiểu phải không nào, tuy nhiên ta hãy xem xét một chút sâu hơn bên trong, chúng ta cũng sẽ bàn sâu hơn về khái niệm object và context ở những phần tiếp theo.

  12 tips hay cho JavaScript
  24 code ES6 tân tiến để khắc phục các lỗi thực hành JavaScript

Cơ bản về con trỏ this trong Javascript

          Cần nói qua một chút về hàm (function) ở trong Javascript, như ta đã biết thì trong JS một hàm cũng chính là một đối tượng (object), và đối tượng thì sẽ có những thuộc tính của riêng nó. Trong JS, khi một hàm được gọi, thì nó sẽ có một thuộc tính là this, và thuộc tính this này chứa giá trị về một đối tượng đang gọi tới hàm này.

          Tức là, khi một function được gọi (tạm gọi là function A), thì con trỏ this chứa giá trị của đối tượng gọi tới A, và ta có thể thông qua con trỏ this này để lấy các giá trị thuộc tính khác nằm trong đối tượng vừa gọi tới A.

var Hocsinh1 = {
    name: “John”,
    getName: function(){
        return this.name;
    }
};

var _name = Hocsinh1.getName();

          Quay lại ví dụ trước, this được khai báo trong hàm getName(), và hàm getName() là hàm sẽ được gọi tới bởi đối tượng Hocsinh1, do đó this ở đây được hiểu là sẽ mang giá trị tham chiếu tới đối tượng Hocsinh1. Tới đây thì cách dùng con trỏ this trong Javascript là tương đồng với các ngôn ngữ khác: giá trị của con trỏ this là rỗng cho tới khi thực sự có một đối tượng gọi tới hàm chứa con trỏ this.

           Trong hầu hết mọi trường hợp, this sẽ chứa giá trị của đối tượng gọi tới nó, tuy nhiên việc một hàm trong Javascript cũng chính là 1 đối tượng khiến ta có thể dễ dàng truyền nó vào một tham số của hàm nào đó để sử dụng như một hàm callback, chính điều này sẽ dẫn tới các tình huống mà con trỏ this không thực sự chứa giá trị của đối tượng mà nó thuộc về.

          Chúng ta sẽ xem xét 4 trường hợp mà con trỏ this trở nên mơ hồ hơn so với ví dụ ở trên, chúng ta sẽ đi phân tích chi tiết từng trường hợp ở phần tiếp theo:

  1. Con trỏ this trong việc sử dụng hàm callback
  2. Con trỏ this bên trong 1 closure
  3. Con trỏ this trong trường hợp gán hàm cho một biến khác
  4. Con trỏ this trong hàm mượn (borrowing methods)

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

1. Con trỏ this trong sử dụng hàm callback

           Mặc dù các ngôn ngữ lập trình hiện đại như C# hoặc Java cũng hỗ trợ hàm callback (như delegate function của C#), tuy nhiên việc sử dụng hàm callback ở trong Javascript thông dụng hơn rất nhiều. Có thể nói nôm na hàm callback là việc chúng ta truyền 1 hàm với vai trò như một tham số vào một hàm khác để có thể kích hoạt hàm đó sau này. Xét ví dụ sau:

//Định nghĩa 1 đối tượng với phương thức hiển thị thuộc tính ra màn hình
var Hocsinh = {
    name: “John”,
    printName: function(){
       console.log(this.name);
    }
};

//Bắt sự kiện click chuột lên button, sẽ thực thi hàm hiển thị tên của Hocsinh lên màn hình
$(‘button’).click(Hocsinh.printName);

          Theo ý tưởng của người lập trình, khi người dùng click chuột vào button thì hàm printName() sẽ được gọi để hiển thị tên của Hocsinh lên màn hình. Tuy nhiên đoạn code trên sẽ không thể chạy đúng như mong muốn. Lí do bởi vì khi sự kiện click được kích hoạt, thì sự kiện này đang được gán tới đối tượng $(‘button’), chúng ta truyền hàm Hocsinh.printName vào bên trong hàm click() như một đối tượng callback. Lúc này – khi hàm click() được gọi – hàm Hocsinh.printName được kích hoạt, tuy nhiên đối tượng gọi tới hàm này không còn là đối tượng Hocsinh nữa (mà là đối tượng $(‘button’) của jQuery) nên cho trỏ this không còn tham chiếu tới giá trị của đối tượng Hocsinh, dẫn tới việc gọi “this.name” là vô nghĩa.

                Sự nhập nhằng này có thể được mô tả ngắn gọn như sau: khi hàm click() kích hoạt hàm callback Hocsinh.printName, thì context của hàm Hocsinh.printName đã bị thay đổi sang đối tượng $(‘button’).

                Để đoạn code trên chạy đúng như mong muốn – in ra được name của Hocsinh – thì ta phải đảm bảo được context của hàm callback Hocsinh.printName là chính đối tượng Hocsinh lúc hàm này được gọi. Để thay đổi context, chúng ta có thể dùng hàm Apply(), Call() hay Bind() hỗ trợ sẵn bởi Javascript. Cụ thể trong trường hợp này chúng ta có thể dùng hàm Bind() để gắn context vào hàm callback đó.

//Thay vì viết
$(‘button’).click(Hocsinh.printName);

//Chúng ta sẽ viết
$(‘button’).click(Hocsinh.printName.Bind(Hocsinh));

          Đoạn code trên có ý nghĩa là: khi hàm click() gọi tới hàm callback Hocsinh.printName, thì context của hàm callback này là đối tượng Hocsinh chứ không phải đối tượng $(‘button’). Khi đó thì hàm callback Hocsinh.printName sẽ lấy đúng giá trị this.name là Hocsinh.name. Vấn đề được giải quyết!

2. Con trỏ this trong closure

          Nói một cách ngắn gọn thì closure là một hàm con (inner function) nằm bên trong 1 hàm khác (outer function). Mọi người có thể tìm hiểu thêm ở đây. Ta đã biết rằng closure thì không thể truy cập tới con trỏ this của hàm cha (outer function), do đó sẽ có thể xuất hiện trường hợp như sau:

var user = {
    tournament:"The Masters",
    data: [
         {name:"T. Woods", age:37},
         {name:"P. Mickelson", age:43}
     ],

     clickHandler: function () {
        //Sử dụng con trỏ this ở đây thì OK, this đang mang giá trị tham chiếu tới đối tượng “user”
        this.data.forEach (function (person) {
            //Tuy nhiên, trong closure này thì this không còn tham chiếu tới đối tượng “user” nữa
            // Hàm inner function này không thể truy cập tới this của outer function

            console.log (person.name + " is playing at " + this.tournament);
            })

     }

}

user.clickHandler();

Kết quả của đoạn mã trên như sau:

//Chú ý kết quả undefined
T. Woods is playing at undefined
P. Mickelson is playing at undefined

          Như mong đợi của chúng ta, thì this (bôi đỏ) phải tham chiếu tới giá trị của đối tượng user, khi đó ta sẽ lấy được thông tin về tournament của đối tượng user. Tuy nhiên giá trị this bên trong một hàm closure thì không thể truy cập tới giá trị this của hàm bên ngoài (trong trường hợp này nếu không dùng strict mode thì this mang giá trị của biến toàn cục window).

          Để sửa lỗi cho trường hợp này, các javascript developer thường giải quyết bằng việc gán giá trị của biến this vào một biến trung gian trước khi gọi closure:

var user = {
    tournament:"The Masters",
    data: [
         {name:"T. Woods", age:37},
         {name:"P. Mickelson", age:43}
     ],

     clickHandler: function () {
        //Sử dụng con trỏ this ở đây thì OK, this đang mang giá trị tham chiếu tới đối tượng “user”
        var self = this;
        this.data.forEach (function (person) {
            //Ta sẽ dùng biến self như một biến bình thường trong hàm closure
            console.log (person.name + " is playing at " + self.tournament);
        });
    }
}

user.clickHandler();

           Đoạn code trên trông có vẻ kì lạ đối với những người ít code bằng Javascript trước đây, tuy nhiên đây là một tình huống xảy ra khá thường xuyên trong Javascript.

3. Con trỏ this trong trường hợp gán hàm cho một biến khác

           Trường hợp ta gán hàm cho một biến khác, cũng sẽ xảy ra tình trạng thay đổi context của hàm nếu được gọi. Ta xét ví dụ sau:

//Định nghĩa 1 đối tượng với phương thức hiển thị thuộc tính ra màn hình
var name = “Peter”;
var Hocsinh = {
    name: “John”,
    printName: function(){
        console.log(this.name);
    }
};

//Gán hàm Hocsinh.printName vào một biến
Var printHocsinhName = Hocsinh.printName;

//Gọi hàm printHocsinhName để hiển thị tên học sinh
printHocsinhName();


//------> Kết quả
Peter

     Cũng tương tự như các trường hợp đã phân tích ở trên, context của hàm Hocsinh.printName đã bị thay đổi khi ta thực hiện gán hàm cho đối tượng khác. Để giữ nguyên được context là biến Hocsinh thì ta sẽ sửa lại code như sau:

//Gán hàm Hocsinh.printName vào một biến
Var printHocsinhName = Hocsinh.printName.bind(Hocsinh);

//Gọi hàm printHocsinhName để hiển thị tên học sinh
printHocsinhName();


//------> Kết quả
John

4. Con trỏ this trong hàm mượn (borrowing methods)

          Hàm mượn (borrowing method) là một trong những khái niệm độc đáo của Javascript. Để hiểu rõ được nó có lẽ cần thêm một bài viết riêng, tuy nhiên mình sẽ đưa ra ví dụ về việc nó thay đổi context của con trỏ this như thế nào. Xét ví dụ sau:

// Chúng ta có 2 đối tượng, 1 đối tượng có hàm computeAvg() và 1 đối tượng thì không
// Chúng ta sẽ thực hiện mượn hàm này
var gameController = {
    scores: [10, 15, 20],
    avgScore: null,
    players: [
        {name: "Tommy", playerID: 987, age: 23},
        {name: "Pau", playerID: 87, age: 33}
    ]
};

var appController = {
    scores: [30, 40, 50],
    avgScore: null,
    computeAvg: function () {      
       var sumOfScores = this.scores.reduce (function (prev, cur, index, array) {
           return prev + cur;
       });
       this.avgScore = sumOfScores / this.scores.length;
   }
};

           Ta muốn mượn hàm computeAvg() của đối tượng appController để tính điểm trung bình cho đối tượng gameController, vậy cần gọi hàm này như thế nào? Ở đây do hàm computeAvg() thuộc đối tượng appController, nếu muốn thực hiện tính điểm trung bình cho đối tượng gameController thì hàm này phải truy cập được tới các thuộc tính của đối tượng này. Do đó ta cần phải thay đổi context của hàm computeAvg() sang thành đối tượng gameController khi chạy, ta sẽ dùng hàm apply() trong JS để làm được điều này:

appController.computeAvg.apply(gameController);
console.log(gameController.avgScore);

           Như vậy ta vừa thực hiện dùng hàm mượn (borrowing method) và thay đổi context để thực hiện.

Tóm lại

           Qua vài chia sẻ trên đây, hi vọng mọi người có thể hiểu rõ hơn về con trỏ this trong lập trình Javascript. Chúng ta có trong tay các công cụ là các hàm như apply(), bind(), call() để kiểm soát con trỏ this trong nhiều tình huống khác nhau.

         Chúng ta thấy rằng, hầu hết mọi rắc rối xảy ra với con trỏ this là do dự thay đổi context của hàm khi được gọi (đã không còn là context ban đầu nơi bản thân hàm được khai báo), cụ thể là trong: hàm callbackclosure, gọi từ một đối tượng khác hay khi trong thực thi hàm mượn (borrowing method). Do đó, quy tắc cốt lõi cần nhớ khi làm việc với con trỏ this là: luôn chú tới context của con trỏ this khi hàm được gọi, đảm bảo chúng ta đang sử dụng đúng context của hàm như ý muốn.

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

Typescript là gì? Ưu và nhược điểm của Typescript

typescript là gì

Typescript là gì? Hôm nay chúng ta sẽ cùng nhau phân tích cặn kẽ điểm mạnh và điểm yếu của typescript để có thể quyết định xem nên sử dụng nó như thế nào cho hiệu quả nhé!

Định nghĩa Typescript là gì?

Typescript là gì

TypeScript là gì? – Là một ngôn ngữ được Microsoft tặng free cho chúng ta, nền tảng của TypeScript ít nhiều cũng có sự liên quan đến JavaScript vì nó là một ngôn ngữ mã nguồn mở của JavaScript. Vai trò của TypeScript là dùng để thiết kế và xây dựng các dự án ứng dụng quy mô lớn mang tính chất phức tạp.

Khác với sự đơn giản của JavaScript, du TypeScript cũng đồng thời kế thừa nhiều định nghĩa, khái niệm của đa dạng các ngôn ngữ C#, Java,… nhưng TypeScript lại có yêu cầu cao về trật tự rõ ràng. 

TypeScript được xem là một phiên bản nâng cao hơn của JavaScript vì nó được thiết kế thêm nhiều chức năng tiện lợi hơn, cải tiến hơn từ những điểm yếu của JavaScript như các lớp hướng đối tượng và Static Structural typing, bên cạnh đó TypeScript còn có thể hoạt động rộng rãi cho các ứng dụng của ngôn ngữ Angular2 và Nodejs.

Tìm việc làm Typescript từ các công ty HOT mới nhất

Chức năng của TypeScript là gì?

Static Typing

Một trong những chức năng không thể lẫn vào đâu được của TypeScript đó là hỗ trợ ‘static typing’. Đồng nghĩa với việc bạn có thể khai báo kiểu cho biến, và trình biên dịch sẽ giảm được tỷ lệ gán sai kiểu của các giá trị. Nếu khai báo kiểu bị bỏ qua, chúng sẽ được tự động phát hiện từ code của bạn.

Ví dụ: Các biến, tham số của hàm hoặc giá trị trả lại có thể có các kiểu được định nghĩa khi khởi tạo:

var burger: string = 'Spaghetti',     // String 
    calories: number = 400,           // Numeric
    tasty: boolean = true;            // Boolean

// Alternatively, you can omit the type declaration:
// var pasta = 'Spaghetti';

// The function expects a string and an integer.
// It doesn't return anything so the type of the function itself is void.

function speak(food: string, energy: number): void {
  console.log("Our " + food + " has " + energy + " calories.");
}

speak(pasta, calories);

Toàn bộ khai báo kiểu sẽ bị xóa trong trường hợp TypeScript biên dịch thành JavaScript thành công

// JavaScript code from the above TS example.

var burger = 'Spaghetti',
    calories = 400, 
    tasty = true; 

function speak(food, energy) {
    console.log("Our " + food + " has " + energy + " calories.");
}

speak(Spaghetti, calories);

Biên dịch tsc sẽ báo lỗi khi chúng ta thao tác không hợp lệ. Ví dụ:

// The given type is boolean, the provided value is a string.
var tasty: boolean = "I haven't tasted it yet";
main.ts(1,5): error TS2322: Type 'string' is not assignable to type 'boolean'.

Hệ thống cũng sẽ báo lỗi nếu thao tác truyền sai tham số tới một hàm:

function speak(food: string, energy: number): void{
  console.log("Our " + food + " has " + energy + " calories.");
}

// Arguments don't match the function parameters.
speak("Sea Food Spaghetti", "a ton of");
main.ts(5,30): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.

Các kiểu dữ liệu được sử dụng phổ biến nhất:

  • Any – Một biến với kiểu này có thể có giá trị là một string, number hoặc bất kỳ kiểu nào.
  • String – Giống chức năng của string trong JavaScript, có thể được bao quanh bởi ‘dấu nháy đơn’ hoặc “dấu nháy kép”.
  • Number – Tất cả giá trị số trong hàm đều được biểu diễn bởi kiểu number, không có định nghĩa riêng cho số nguyên (interger), số thực (float) cũng như các kiểu khác.
  • Boolean – true hoặc false, sử dụng 0 và 1 sẽ gây ra lỗi biên dịch.
  • Arrays – Có 2 kiểu cú pháp: my_arr: number[]; hoặc my_arr: Array<number>.
  • Void – sử dụng khi hàm không trả lại bất kỳ giá trị nào.

Để xem danh sách tất cả các kiểu biến, đọc tài liệu hướng dẫn của TypeScript tại đây.

Interfaces

Chức năng chính của Interfaces là sử dụng để kiểm tra, xem một đối tượng có phù hợp với một cấu trúc nhất định hay không, trợ giúp trong giai đoạn giai đoạn phát triển.

Bằng cách định nghĩa một interface, ta có thể đặt tên trong trường hợp có sự kết hợp đặc biệt của các biến, đảm bảo rằng chúng luôn luôn đi cùng nhau.

Ví dụ:

// Here we define our Food interface, its properties, and their types.
interface Food {
    name: string;
    calories: number;
}

// We tell our function to expect an object that fulfills the Food interface. 
// This way we know that the properties we need will always be available.
function speak(food: Food): void{
  console.log("Our " + food.name + " has " + food.calories + " calories.");
}

// We define an object that has all of the properties the Food interface expects.
// Notice that types will be inferred automatically.
var ice_cream = {
  name: "cookies", 
  calories: 250
}

speak();

Ngoài ra bạn nên biết rằng, thứ tự của các thuộc tính không quan trọng bằng việc chúng ta phải fill đủ số lượng các thuộc tính và đúng kiểu. Nếu một thuộc tính nào đó bị thiếu, hoặc sai kiểu, hoặc sai tên, trình biên dịch sẽ cảnh báo chúng ta.

interface Food {
    name: string;
    calories: number;
}

function speak(food: Food): void{
  console.log("Our " + food.name + " has " + food.calories + " grams.");
}

// We've made a deliberate mistake and name is misspelled as nmae.
var cookies = {
  nmae: "cookies", 
  calories: 250
}

speak(cookies);
main.ts(16,7): error TS2345: Argument of type '{ nmae: string; calories: number; } 
is not assignable to parameter of type 'Food'. 
Property 'name' is missing in type '{ nmae: string; calories: number; }'.

Classes

Trong các dự án, ứng dụng lớn, lập trình hướng đối tượng rất hay được các Dev sử dụng nhất là trong các ngôn ngữ như Java hoặc C#.

TypeScript cung cấp hệ thống class khá tương đồng với các ngôn ngữ này ví dụ như chức năng kế thừa, abstract classes, interface implementations, setter/getters, …

Từ phiên bản ECMAScript 2015 trở đi, classes được xem là một tính năng có sẵn trong JS và có thể không cần sử dụng TypeScript. Mặc dù 2 phiên bản này có nhiều chức năng tương tự nhau, nhưng chúng vẫn có điểm khác biệt, đó là TypeScript nghiêm ngặt hơn.

Ví dụ:

class Menu {
  // Our properties:
  // By default they are public, but can also be private or protected.
  items: Array<string>;  // The items in the menu, an array of strings.
  pages: number;         // How many pages will the menu be, a number.

  // A straightforward constructor. 
  constructor(item_list: Array<string>, total_pages: number) {
    // The this keyword is mandatory.
    this.items = item_list;    
    this.pages = total_pages;
  }

  // Methods
  list(): void {
    console.log("Our special meal today is:");
    for(var i=0; i<this.items.length; i++) {
      console.log(this.items[i]);
    }
  }

} 

// Create a new instance of the Menu class.
var sundayMenu = new Menu(["Banana cakes","waffles","Lemon juice"], 1);

// Call the list method.
sundayMenu.list();

Cú pháp này khá quen thuộc cho dân Java hoặc C#. Tương tự cho kế thừa:

class HappyMeal extends Menu {
  // Properties are inherited

  // A new constructor has to be defined.
  constructor(item_list: Array<string>, total_pages: number) {
    // In this case we want the exact same constructor as the parent class (Menu), 
    // To automatically copy it we can call super() - a reference to the parent's constructor.
    super(item_list, total_pages);
  }

  // Just like the properties, methods are inherited from the parent.
  // However, we want to override the list() function so we redefine it.
  list(): void{
    console.log("Our special menu for children:");
    for(var i=0; i<this.items.length; i++) {
      console.log(this.items[i]);
    }

  }
}

// Create a new instance of the HappyMeal class.
var menu_for_children = new HappyMeal(["French Fries","Coke","toy"], 1);

// This time the log message will begin with the special introduction.
menu_for_children.list();

Modules

Tính module hóa rất quan trọng khi bạn đang thực hiện những dự án lớn. Nó phân chia code thành nhiều thành phần nhỏ và còn có khả năng tái sử dụng giúp dự án của bạn dễ tổ chức và dễ hiểu hơn so với file có hàng ngàn dòng code.

TypeScript có chức năng exporting và importing các module, nhưng bản thân nó không thể xử lý thực sự việc liên kết giữa các file. Dùng require.js cho các ứng dụng client và CommonJS cho Node.js để cho phép modules TS dựa trên các thư viện của bên thứ ba.

Đặt trường hợp có 2 file: 1 file export một hàm, 1 file import, chúng ta sẽ gọi nó là:

exporter.ts

var sayHi = function(): void {
    console.log("Hello!");
}

export = sayHi;

importer.ts

import sayHi = require('./exporter');
sayHi();

Để có thể hoàn thành thao tác, cần download require.js và thêm nó trong một thẻ script – xem hướng dẫn typescript là gì của requirejs.org. Sau đó biên dịch 2 file .ts. Mộ tham số mở rộng cần được thêm vào để nói với TypeScript chúng ta đang xây dựng các module cho require.js (còn được gọi là AMD):

tsc --module amd *.ts

Generics

Chức năng của Generics là cho phép cùng một hàm có thể chấp nhận các tham số với nhiều kiểu khác nhau. Việc tạo ra các thành phần có thể tái sử dụng với generics tốt hơn sử dụng kiểu any, vì generics bảo tồn kiểu của các biến vào và ra của chúng.

Ví dụ: Generics trong ví dụ dưới đây đã nhận một tham số và trả lại một mảng chứa cùng tham số

// The <T> after the function name symbolizes that it's a generic function.
// When we call the function, every instance of T will be replaced with the actual provided type.

// Receives one argument of type T,
// Returns an array of type T.

function genericFunc<T>(argument: T): T[] {    
  var arrayOfT: T[] = [];    // Create empty array of type T.
  arrayOfT.push(argument);   // Push, now arrayOfT = [argument].
  return arrayOfT;
}

var arrayFromString = genericFunc<string>("beep");
console.log(arrayFromString[0]);         // "beep"
console.log(typeof arrayFromString[0])   // String

var arrayFromNumber = genericFunc(42);
console.log(arrayFromNumber[0]);         // 42
console.log(typeof arrayFromNumber[0])   // number

Lần đầu tiên gọi hàm chúng ta thiết lập kiểu thành string. Điều này không bắt buộc vì trình biên dịch có thể xem tham số được truyền và tự động quyết định kiểu nào phù hợp nhất, giống như lần gọi hàm thứ 2.

Mặc dù không bắt buộc, luôn luôn cung cấp kiểu được coi là cần thiết vì trình biên dịch có thể đoán sai kiểu trong các kịch bản phức tạp.

Tài liệu hướng dẫn của TypeScript là gì gồm một vài ví dụ cao cấp bao gồm generics classes, kết hợp chúng với interfaces, …ở typescriptlang.org.

  Kiểu enum trong TypeScript: làm việc như thế nào, sử dụng ra sao
  Học kiến thức căn bản TypeScript chỉ trong 30 phút

Ưu điểm của Typescript là gì?

Typescript là gì

TypeScript thật sự thuận tiện và hoàn toàn miễn phí

Đối với loại ngôn ngữ lập trình tĩnh như TypeScript, tất cả những số liệu, thông số của bạn sẽ dễ dàng được lấy hơn nhờ IDE và trình biên dịch.

TypeScript hỗ trợ quá trình tìm kiếm giúp bạn tiết kiệm thời gian kiểm tra lại code, không cần thông qua bất cứ một ai để có thể tìm thông tin dữ liệu, ngoài ra TypeScript làm giảm phần trăm va chạm lỗi trong thời gian vận hành.

Ngoài ra, đây cũng là một trong những phần mềm nổi trội được Microsoft hỗ trợ hoàn toàn miễn phí.

  TypeScript thoáng qua
  Typescript vs Javascript: Nên chọn ngôn ngữ nào?

Thao tác nhanh chóng và đơn giản hơn

Ngôn ngữ TypeScript có thao tác khá đơn giản, tiết kiệm thời gian hơn nhưng lại đem đến kết quả tốt đến bất ngờ, nó khắc phục tình trạng xuất hiện lỗi và dễ đọc hơn.

Cụ thể là, đối với ngôn ngữ thông thường người dùng thường thao tác theo các bước như:

  • Restart lại hàm, tạo đối số, hoàn thành đoạn mã
  • Sau khi apply hết các đoạn mã, công cụ cần thiết thì cho vận hành
  • Trong quá trình vận hành nếu phát hiện lỗi thì sửa chữa lại.

Tái cấu trúc

Chắc chắn trong quá trình viết code, các lập trình viên sẽ thường xuyên mắc phải nhiều lỗi nhỏ và cần chỉnh sửa, việc sử dụng TypeScript sẽ giúp bước chỉnh sửa code trở nên dễ dàng hơn nhờ hiệu quả của lệnh Rename Symbol/Find All Occurrences.

Đối với các ngôn ngữ khác, khi muốn sửa chi tiết nào đó thì thường phải thay đổi luôn những tập tin khác nếu có liên quan hoặc sử dụng RegEx

Trong trường hợp người dùng TypeScript muốn nâng cấp hệ thống của mình (thêm hoặc xóa thuộc tính, đổi tên,…) thì TypeScript sẽ giúp bạn tái cấu trúc lại sao cho phù hợp với nhu cầu tìm kiếm của bạn mà không gây náo loạn trong hệ thống. Trong trường hợp code của bạn không match được bất cứ dữ liệu nào thì sẽ được báo đến bạn ngay để được xử lý ổn thỏa.

Giảm tỷ lệ mắc lỗi trong hệ thống

Nhờ vào việc cảnh báo lỗi ngay khi viết code, nên tỷ lệ mắc lỗi trong hệ thống khi sử dụng TypeScript khá thấp, TypeScript sẽ trả lại giá trị null hoặc gợi ý thay đổi chỉnh sửa. Mỗi lần chỉnh sửa sau khi được TypeScript báo lỗi thì phần trăm hệ thống hoạt động mà không mắc phải lỗi là rất cao, có thể dễ dàng thấy được TypeScript giúp người dùng tiết kiệm không ít thời gian để sửa lỗi.

  12 Thư viện JavaScript trực quan hoá dữ liệu hot nhất năm 2024

Hạn chế thử nghiệm Boilerplate

Với quy trình kiểm tra và báo lỗi tự động ngay khi code, khi bạn đã chắc chắn rằng các biến dữ liệu của mình nằm ở đúng chỗ thì bạn không cần phải lo hệ thống không vận hành hoặc không cần phải kiểm tra lại nữa.

Điều này sẽ giúp bạn tiết kiệm thời gian, không đặt quá nhiều chú ý vào những thao tác đơn giản cho việc kiểm tra mà có thể tận dụng thời gian tối ưu hơn bằng cách kiểm tra chất lượng logic của hệ thống.

Việc hạn chế được các bước thử nghiệm sẽ giúp tiết kiệm được thời gian hơn, nâng cao hiệu quả công việc của các lập trình viên.

Hợp nhất mã đơn giản

Sau khi hoàn thiện được một đoạn code và cho chúng chạy thử nghiệm, có thể ngay trong môi trường đó mọi thứ đều hoạt động trơn tru, nhưng bạn có chắc được đoạn code đó cũng sẽ hoạt động tốt khi ở trong môi trường điều kiện khác? 

Một trong những điểm mạnh của TypeScript là bạn có thể hợp nhất mã một cách đơn giản để có thể dễ dàng kiểm tra đánh giá đoạn mã bạn vừa mới cho ra đời kia bằng cách sử dụng Typedef – kiểm tra biên dịch.

Lại một lần nữa, TypeScript lại giúp người dùng tiết kiệm thời gian và công sức!

  Khi nào thì sử dụng Generics trong TypeScript
  freeCodeCamp là gì? Các giáo trình chứng chỉ IT dành cho lập trình viên

Hỗ trợ tối ưu hóa quy trình làm việc

TypeScript sẽ không khuyến khích người dùng nhảy bước, thực hiện sai thao tác. TypeScript khuyến khích người dùng đưa ra quyết định về kiểu dữ liệu khi sử dụng ngôn ngữ kiểu tĩnh trước khi thực hiện thao tác, các bước tiếp theo. Chính vì những quy luật như thế sẽ giúp cho các lập trình viên tối ưu được quy trình làm việc hiệu quả hơn.

Nhược điểm của Typescript là gì?

Bất kỳ ngôn ngữ nào cũng có điểm yếu và hạn chế của nó, và TypeScript cũng vậy, điểm hạn chế của TypeScript là:

Bắt buộc dùng biên dịch

Để có thể vận hành một tệp TypeScript với đuôi .js trên nền tảng Node.js bạn bắt buộc phải dùng trình biên dịch để có thể sử dụng.

Bước thiết lập cồng kềnh 

Trước khi có thể sử dụng được TypeScript, bạn cần đảm bảo rằng máy chủ Node.js, trình thử nghiệm và webpack đều có thể hoạt động với TypeScript, nếu không thì bạn sẽ không sử dụng được.

Bên cạnh đó, mỗi khi bạn apply thêm bất kỳ library nào như Redux, React và Styled-Component thì bạn cũng phải thêm Typedef vào.

Chỉ là phần ngôn ngữ mở rộng hỗ trợ

Sau cùng, chức năng của TypeScript cũng chỉ là để biên dịch về JavaScript, nó không phải là một ngôn ngữ có thể vận hành độc lập và nó cũng đồng thời không thể thay thế được vai trò của JavaScript. Chức năng của TypeScript bị giới hạn bởi chức năng của JavaScript, TypeScript chỉ là được nâng cấp từ điểm yếu của JavaScript.

Chỉ với mỗi TypeScript, người dùng không thể nào hoàn thiện được các công đoạn của dự án, công dụng của TypeScript chỉ thực sự nổi bật khi được kết hợp nhuần nhuyễn và tối ưu với các ngôn ngữ, nền tảng và tool khác.

TypeScript có thực sự là một mã nguồn mở?

Có nhiều luồng ý kiến cho rằng TypeScript là một mã nguồn mở, và đó cũng là một trong những lý do họ thích sử dụng TypeScript. Nhưng liệu đó có phải sự thật?

Đúng! TypeScript thực sự là một mã nguồn mở nhưng nó vẫn nằm dưới sự chi phối của Microsoft – công ty phần mềm nổi tiếng về các phiên bản phần mềm độc quyền. 

Nhiều người dự đoán, TypeScript là một sản phẩm marketing của Microsoft dùng để thu hút người dùng về công năng và sự miễn phí. Tuy nhiên sau cùng, việc Microsoft có kéo dài việc miễn phí này hay không vẫn phụ thuộc rất nhiều vào Microsoft và người dùng hoàn toàn bị động trong chuyện này.

tuyển dụng it

Cài đặt TypeScript

Cách dễ nhât để thiết lập TypeScript là thông qua trình quản lý NPM (Node.js).

Các bạn có thể dễ dàng thao tác và sử dụng thử các lệnh cơ bản, đơn giản sau đây dưới để có thể cài đặt TypeScript package toàn cục:

npm install -g typescriptjavascript:void(0)

Open bât kỳ cửa sổ terminal ở bất kỳ đâu và chạy lệnh tsc -vnếu cài đặt thành công màn hình sẽ như thế này:

tsc -v
Version 1.8.10

Hướng dẫn biên dịch sang từ TypeScript sang JavaScript

TypeScript được viết trong các file .ts (hoặc .tsx cho JSX), nó không thể sử dụng trực tiếp trong trình duyệt và cần biên dịch thành JavaScript. Điều này có thể thực hiện với một số cách:

  • Sử dụng các task runner như Gulp
  • Trực tiếp trong Visual Studio hoặc các IDE và trình soạn thảo khác
  • Trong terminal sử dụng lệnh tsc

Đối với Newbie chúng nên bắt đầu từ cách dễ nhất:

Câu lệnh sau sẽ nhận một file TypeScipt là main.ts và chuyển nó thành JavaScipt main.js. Nếu main.js đã tồn tại nó sẽ bị ghi đè:

tsc main.ts

Trong cùng 1 thời điểm, chúng ta có thể biên dịch nhiều file bằng cách liệt kê chúng hoặc áp dụng các wildcard:

# Will result in separate .js files: main.js worker.js.
tsc main.ts worker.ts    

# Compiles all .ts files in the current folder. Does NOT work recursively.
tsc *.ts

Chúng ta cũng có thể sử dụng tùy chọn –watch để tự động biên dịch một file TypeScript khi có thay đổi:

# Initializes a watcher process that will keep main.js up to date.
tsc main.ts --watch

Một file tsconfig.json chứa nhiều thiết lập đôi khi cũng được viết bởi các TypeScript giàu kinh nghiệm. Các file như thế rất tiện lợi khi làm việc trên các dự án lớn có nhiều file .ts, nó hỗ trợ tự động hóa một phần tiến trình.

TopDev tổng hợp

Sharding là gì? – Cách Instagram tạo ID trong database của họ bằng Sharding

sharding-la-gi

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

Đối với những hệ thống nhỏ chỉ cần 1 Database thì chắc chẳng mấy ai quan tâm đến việc tạo ra ID cho bản ghi. Vì dùng auto increment trong MySQL là có thể làm được rồi, chẳng cần phải làm gì thêm.

Thế nhưng với dữ liệu càng ngày càng to ra thì hệ thống chỉ có 1 database duy nhất có thể sẽ không thể đáp ứng được. Bởi vì traffic đang tập trung hết vào database đó.

Để giải quyết bài toán đó thì người ta đã tách database ra thành nhiều database khác nhau, và mỗi database đó sẽ chứa 1 phần dữ liệu. Ví dụ db01 chứa thông tin user từ 1 đến 1000, db02 chứa thông tin user từ 1001 đến 2000 chẳng hạn. Và khi query sẽ tìm xem user thuộc database nào và thực hiện truy vấn.

Tuyển dụng database vị trí lương cao, hấp dẫn

Và kĩ thuật này người ta gọi là sharding.

Thế nhưng có vấn đề xảy ra ở đây là làm thế nào sinh ra ID cho user mà không bị trùng lặp giữa các database đó? Dùng auto increment mặc định của database có giải quyết được không? Làm thế nào để từ 2 ID có thể phán đoán cái nào được sinh ra trước, cái nào được sinh ra sau?

Vậy cùng đọc bài này xem các kĩ sư Instagram đã giải quyết bài toán này thế nào nhé.

Mục tiêu bài viết:

  • Hiểu thêm được 1 cơ chế sinh ID mới.
  • Có thể áp dụng vào các bài toán sharding data trong database.

Bối cảnh

Instagram là 1 trong những mạng xã hội chia sẻ ảnh nổi tiếng nhất cái hành tinh này.

Theo thống kê năm 2016 thì cứ mỗi giây sẽ có 915 photos, 1k post được tạo ra. Quá khủng khiếp phải không nào.

Khi dữ liệu tăng lên kinh khủng như thế thì 1 database sẽ không thể lưu trữ hết được dữ liệu, cùng với tốc độ truy vấn sẽ trở nên ì ạch và tốn nhiều dung lượng bộ nhớ.

Để đảm bảo tất cả dữ liệu quan trọng luôn được lưu trữ trên memory, và sẵn sàng trả về kết quả nhanh nhất cho người dùng thì Instagram bắt đầu thực hiện Sharding dữ liệu.

Ảnh bên dưới là 1 ví dụ về sharding trong database. Database sẽ được tách ra thành nhiều database khác nhau, mỗi database sẽ chứa 1 phần dữ liệu. Như ví dụ bên dưới là tách bảng user ra thành nhiều database, mỗi database sẽ chứa 1 phần dữ liệu của bảng user.

Người ta gọi mỗi database tách biệt này là ”Shard“.

Instagram đã sinh ra ID trong database của họ như thế nào

Tuy nhiên tại thời điểm này có 1 bài toán được đặt ra. Làm thế nào có thể sinh ra ID duy nhất trên từng shard mà không sợ bị trùng lặp (Ví dụ như mỗi photo được upload vào trong hệ thống)? Cùng đi đọc tiếp phần tiếp theo nhé.

Yêu cầu về mặt chức năng

Trước khi đi vào giải quyết bài toán bên trên, thì cùng xem hệ thống Instagram yêu cầu những gì về ID của từng shard nhé.

  • ID được tạo ra phải được sắp xếp theo thời gian. Ví dụ như với 2 ID thì có thể phán đoán được ID nào tạo ra trước, ID nào tạo ra sau.
  • ID sẽ bao gồm 64 bits. (Vì sao lại cần 64 bits? Vì nó tương thích với các hệ thống như Redis …)
  • Thuật toán sinh ra ID phải đơn giản, dễ hiểu và đặc biệt không được làm thay đổi architecture server của Instagram.

1 số giải pháp generate ID

Hiện tại có rất nhiều giải pháp cho việc sinh ra ID unique. Cụ thể như:

Sử dụng auto increment trong database

Về chức năng này thì ai cũng biết rồi. Lúc tạo bảng chỉ cần khai báo auto increment là xong.

Ưu điểm:

  • Cách dùng đơn giản.

Nhược điểm:

  • Chỉ tập trung vào 1 database và không thể phân chia sang database khác được.
  • Không thể đảm bảo rằng việc sinh ID ở nhiều database là không bị trùng nhau.

Sử dụng UUID

Đây cũng là 1 cách khá hay để giải quyết bài toán. UUID là 1 chuẩn chung nhằm sinh ra chuỗi random không trùng nhau (xác suất gần như bằng 0). Ví dụ như: b875d561-20fd-498d-8452-5d5ffa879856.

Thế nhưng cùng xem nó có ưu điểm nhược điểm gì nhé.

Ưu điểm:

  • Cho dù chạy trên nhiều máy tính cùng thời điểm đi chăng nữa thì xác suất các string đó trùng nhau dường như gần bằng 0.

Nhược điểm:

  • Nó bao gồm 128 bits nên hơi to, không phù hợp với yêu cầu của hệ thống (là 64 bits)
  • Với 2 ID thì không thể phân biệt ID nào tạo trước, ID nào tạo sau.

Snowflake

Đây chính là 1 công cụ sinh ra ID random được phát triển bởi Twitter. Cái này sử dụng Apache Zookepper để phối hợp với các node để tạo ID 64 bit duy nhất.

Ưu điểm:

  • Snowflake ID có 64 bit
  • Có thể sử dụng time trong component đầu tiên của ID nên có thể sắp xếp được

Nhược điểm:

  • Phải đưa ZooKeeper, Snowflake vào trong kiến trúc của Instagram.

Giải pháp của Instagram

Những giải pháp trên đều không đáp ứng được yêu cầu của Instagram nên họ quyết định tự xây dựng cho mình 1 giải pháp riêng.

Họ sẽ dùng thuật toán đơn giản để sinh ra 1 chuỗi ID random duy nhất từ 1 số input đầu vào. Và từ chuỗi ID đó có thể decode ngược lại để lấy ra được input.

ID ở đây chính là ID của photo, ID của posts chẳng hạn.

Database họ sử dụng là PostgreSQL.

Cụ thể như sau.

ID có độ dài 64 bits, sẽ bao gồm những bộ phận sau:

  • 41 bits để lưu thời gian (đơn vị milliseconds). Khoảng thời gian này sẽ được tính từ ngày 2011/01/01 00:00.
  • 13 bits để lưu shard ID. (tối đa có thể tạo ra được 2^13 = 8192 shard)
  • 10 bits để lưu auto-incrementing sequence, sau đó module 1024. (Vì sao lại là 1024 vì tối đa có 10 bit thôi, mà 2^10 = 1024). Điều đó có nghĩa là có thể tạo ra 1024 IDs trên 1 shard, trên millisecond.

Câu hỏi đặt ra là nếu tạo upload quá 1024 bức ảnh trong 1ms có được không?

Câu trả lời là không nhé. Vì lúc đó thằng thứ 1025 sinh ra ID sẽ bị trùng với thằng thứ 1. Với cả ID là khoá chính nên khi insert vào sẽ bị lỗi. Nên lúc đó chỉ cần try cach đoạn đó là ok.

Công thức sinh ID như sau:

ID = (time << 23) | (shardID << 10) | (seqId <<0)

Trong đó:
・time    = now - instagram_epoch_time (2011/01/01 00:00)
・shardId = userId % 2000
・seqId   = (currentSeqID + 1) % 1024

Từ công thức trên ta có thể thấy ID được tạo ra bằng cách:

**ID = (Dịch trái time sang trái 23 bit) bitwise OR (dịch trái shardID 10 bit) bitwise OR (dịch trái seqID 0 bit) **

Để mình tổng hợp lại kiến thức về bitwise cho mọi người hiểu nhé:

  • Dịch trái, dịch phải nó cũng giống như chúng ta kéo cảnh cửa sang trái, sang phải thôi. Nếu dịch trái n bit tức là sẽ điền n số 0 vào sau số đó. Ví dụ như dịch trái số 7 (dạng nhị phân là 110) sang trái 5 bit, khi đó nó sẽ thành: 11000000
  • bitwise OR tức là thực hiện OR từng bit 1 của 2 số từ phải sang trái. Nếu 2 bit đều là 1 thì sẽ cho kết quả là 1, ngược lại sẽ cho kết quả là 0. Ví dụ như 7 (dạng nhị phân là 110) OR 8 (dạng nhị phân là 111) khi đó kết quả là: 110 OR 111 = 110.

Ví dụ:

Giả sử như người dùng có user_id là 5001, post bức ảnh lên instagram vào thời điểm 2019/05/19 00:00. Tại thời điểm đó sequence hiện tại của table đang là 9000.

Cách tính:

Do thời gian được tính từ ngày 2011/01/01 00:00 nên từ thời điểm đó đến ngày 2019/05/19 00:00 có time = 264384000000 ms.

=> ID = 264384000000 << 23 (dịch sang trái 23 bit)

Do user_id = 5001, và instagram chỉ có 2000 shard. Nên shardId = 5001 % 2000 = 1001

=> ID |= 1001 << 10

sequence hiện tại của table đang là 9000, khi đó nextsequenceid là 9001. vậy seqId = 9001 % 1024 = 809

=> ID |= (809) << 0

Sau khi tính chúng ta ra kết quả ID = 2217813737473025832.

Vậy làm thế nào mà từ số 2217813737473025832 chúng ta có thể decode ngược lại ra time là 264384000000, shardId là 1001, seqId là 809?

Đây có lẽ là phần mình thấy hay nhất. Chúng ta cùng xem tiếp nhé:

Time      = (2217813737473025832 >> 23) & 0x1FFFFFFFFFF = 264384000000
Shard ID  = (2217813737473025832 >> 10) & 0x1FFF = 1001
seqID     = (2217813737473025832 >>  0) & 0x3FF = 809

Từ công thức trên ta có thể thấy được:

  • Time sẽ được tính bằng cách dịch sang phải ID 23 bit, sau đó thực hiện AND với 1 số 41 bit toàn số 1. Cái số 41 bit toàn số 1 này chuyển sang dạng hex sẽ là 0x1FFFFFFFFFF.
  • ShardID và seqId cũng được decode tương tự.

Đây là 1 example về encode và decode mình đã chuẩn bị được. Dành cho ai muốn test:

<?php

$uuid = 0;

$userId = 5001;
$currentSequenceId = 9000;
$time = 264384000000;

// ENCODE

$shardId = $userId % 2000;
$seqId = ($currentSequenceId + 1) % 1024;

$uuid = $time << 23;
$uuid = $uuid | ($shardId << 10);
$uuid = $uuid | ($seqId);

echo $uuid . PHP_EOL;

// DECODE

$time = ($uuid >> 23) & 0x1FFFFFFFFFF;
$shardId = ($uuid >> 10) & 0x1FFF;
$seqId = ($uuid >> 0) & 0x3FF;

echo $time . PHP_EOL;
echo $shardId . PHP_EOL;
echo $seqId . PHP_EOL;

Sau khi lấy được shardId là chúng ta có thể dễ dàng truy cập vào từng shard để lấy ra record dựa vào ID (photoid, postid …) được rồi. Mà chẳng phải tốn công đi join, select làm gì cho mệt cả.

Hơn nữa nó thao tác giữa các bit nên cứ gọi là nhanh đừng hỏi.

Và đây là ví dụ về PL/PGSQL trong PostgreSQL:

CREATE OR REPLACE FUNCTION insta5.next_id(OUT result bigint) AS $
DECLARE
    our_epoch bigint := 1293843600000;
    seq_id bigint;
    now_millis bigint;
    shard_id int := 5;
BEGIN
    SELECT nextval('insta5.table_id_seq') %% 1024 INTO seq_id;
    SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
    result := (now_millis - our_epoch) << 23;
    result := result | (shard_id <<10);
    result := result | (seq_id);
END;
    $ LANGUAGE PLPGSQL;

Khi tạo bảng sẽ làm như sau:

CREATE TABLE insta5.our_table (
    "id" bigint NOT NULL DEFAULT insta5.next_id(),
    ...rest of table schema...
  )

Kết luận

Từ 1 con số mà có thể dễ dàng decode nó ra để lấy các thông tin bên trong nó. Đoạn này mình thấy thật vi diệu.

Đúng là mấy anh kĩ sư có kinh nghiệm về design mấy bo mạch, chip các thứ áp dụng vào thấy nó khác bọt thật.

Hi vọng qua bài này sẽ giúp các bạn có 1 kiến thức mới về việc sinh ra ID random, và decode ngược lại.

Xem thêm những nội dung liên quan:

Xem thêm việc làm IT Đà Nẵng, Hà Nội, HCM mới nhất tại TopDev 

Bài viết gốc được đăng tải tại Nghệ thuật Coding

Lời khuyên sau khi phỏng vấn hơn 100 Kỹ sư Phần mềm

phỏng vấn

Tác giả: Hugo Rocha

Trong những năm vừa qua tôi đã thực hiện hơn 100 cuộc phỏng vấn về kỹ sư phần mềm – software engineer. Nếu các bạn thắc mắc cách mà nhà phỏng vấn hiểu ứng viên, làm thế nào họ đánh giá ứng viên có phù hợp với vị trí công việc hay không, hãy đọc hết bài viết này. Mặc dù mỗi công ty có một quy trình của riêng họ, nhưng vẫn có một số bẫy rất quen thuộc mà ứng viên thường không vượt qua được, và sau đây là lời khuyên chân thành để tránh được chúng.

  8 câu hỏi phỏng vấn dành cho các lập trình viên Mobile app

Software engineer giỏi

Colin R. Davis từng nói “Con đường dẫn đến thành công và thất bại là gần như nhau”. Không có một tiêu chuẩn độc nhất nào để miêu tả một SE – software engineer giỏi cả. Nó còn phụ thuộc vào nhu cầu vị trí ấy và mức độ đa dạng sản phẩm và tuổi đời của một công ty. Một công ty startup dĩ nhiên thì cần marketing trong thời gian ngắn, trong khi một công ty lão làng đã có lượng khách hàng lớn và ổn định sẽ đối mặt với những thách thức khác về quy mô và cấu trúc công ty. Từ đó, xây dựng product với sự hiểu biết về doanh nghiệp sẽ khác với chuyện giải quyết những challenge công nghệ phức tạp.

  Biến Git và GitHub trở thành công cụ đắc lực cho Software Engineer

Một engineer cầu toàn đến từng chi tiết sẽ khác với engineer phải thực hiện công việc trong thời gian gấp rút. Vì thế bài toán ở đây là phải hiểu được công ty nào đang tìm kiếm điều gì và hướng hành động và cách giao tiếp phù hợp vào “khung” ấy. Hạn chế những CV “one-fits all” mà hãy ứng dụng với từng trường hợp thực tế. Ngoài ra bạn cũng nên định hình “giỏi” là như thế nào trong tình cảnh của công ty và chứng minh kiến thức, kinh nghiệm và thái độ của mình phù hợp thế nào với hoàn cảnh ấy.

Hãy làm homework

Benjamin Franklin nói rằng “Thất bại trong khâu chuẩn bị cũng có nghĩa là chuẩn bị để thất bại”

Đi phỏng vấn mà không biết chút gì về công ty cũng như đi hẹn hò mà chỉ toàn nói về bản thân, cũng không hẳn là sẽ không có buổi hẹn tiếp theo mà chỉ là ấn tượng đầu chưa được tốt lắm. Hãy bỏ một chút công sức tìm hiểu về doanh nghiệp, mục tiêu, sứ mệnh, chiến lược và kết quả. Tôi thì không đánh rớt ứng viên chưa tìm hiểu về công ty, nhưng đó là dấu hiệu cho động lực của người nhân viên ấy. Ngoài những mục đích kinh doanh, bạn cũng nên check qua techblog của công ty (nếu có) và tìm hiểu chút về team tech. Không nhiều ứng viên thể hiện sự quan tâm đến doanh nghiệp, nên nếu bạn làm những chuyện ấy thì bạn sẽ rất nổi bật.

Tư duy phản biện

“Trí óc có học thức sẽ có khả năng suy nghĩ phản biện, chứ không dễ dàng chấp nhận và hài lòng với bất cứ điều gì” – Aristotle

Trong suốt sự nghiệp của mình, tôi đã gặp nhiều chuyên gia công nghệ “ngoại hạng” và họ đều là những tuýp người rất khác nhau. Dù vậy thì ở họ có ít nhất một điểm chung như: họ sẽ là những người thách thức tình trạng hiện tại để cải tiến quy trình và công nghệ. 

Một số người khi được yêu cầu đưa ra câu hỏi cho người phỏng vấn, thì không biết phải hỏi cái gì. Trốn tránh việc đặt câu hỏi là chính bạn đã lãng phí cơ hội. Hãy chớp lấy thời cơ để hỏi về những quyết định technical của công ty và những thách thức mà họ đang đối mặt, từ đó trao đổi về ưu/khuyết điểm của từng loại công nghệ.

Ví dụ:

  • Họ có đang cân nhắc chuyển sang HTTP/3 chưa?
  • Họ có đang chuyển sang cấu trúc event-driven microservice không? Họ đang dùng message broker gì? Tại sao không dùng Kafka thay vì RabbitMQ?
  • Họ đang dùng công nghệ database gì? Usecase là gì?
  • Liệu rằng ElasticSearch có là sự thay thế hoàn hảo cho SQL trong use case đó không?

Vân vân. Đặt câu hỏi về technical decision sẽ chứng minh không những bạn hiểu về những thứ công nghệ ấy, có thể tranh luận khi nào nên sử dụng mà còn show được mức độ bạn quan tâm đến việc cải thiện những công nghệ được công ty áp dụng.

Câu hỏi phỏng vấn về thách thức kỹ thuật

“No amount of experimentation can ever prove me right; a single experiment can prove me wrong.” | – Albert Einstein

Với một số quy trình, có thể bạn sẽ phải đối mặt với những vấn đề về thuật toán hay cấu trúc dữ liệu, và sẽ không thể nào tránh chúng được đâu trừ việc nắm chắc những kiến thức nền tảng về khoa học máy tính. Những cuốn sách bạn có thể tham khảo: Cracking the coding interview, Leetcode, or Pramp.

Hãy nhớ giải thích cách làm của bạn thành tiếng. Bài toán này có khi lại là lời giải của bài toán khác, nên nếu bạn không giải được bài toán này cũng không sao, miễn sao bạn có thể vượt qua được hầu hết bài toán. Ngoài ra người phỏng vấn còn có thể cho bạn một số lời khuyên nếu bạn trục trặc trong quá trình xử lý, và điều đó cũng không “trừ điểm” bạn đâu. Vì vậy đừng ngại trình bày những khó khăn cũng như hướng giải quyết để người phỏng vấn có thể nắm được mức độ hiểu biết của bạn.

Đừng nản chí nếu phỏng vấn thất bại

“Thành công là đứng lên nhiều hơn một lần so với thất bại” Oliver Goldsmith

Có lần tôi phỏng vấn một ứng viên khá run và không tự tin lắm trong buổi phỏng vấn. Tuy nhiên anh ấy làm khá tốt nên vẫn được nhận. Đến ngày nhận việc, anh ấy đột nhiên rất tự tin, có thể dẫn các cuộc thảo luận discussion và hướng dẫn team về vấn đề kỹ thuật. Tôi hỏi ảnh tại sao có sự khác biệt về phong độ như thế, thì ảnh giải thích rằng trong khoảng thời gian trước đó ảnh đã trải qua một chuỗi những buổi phỏng vấn thất bại, và ảnh không thể đối mặt với chuyện ấy. Tuy rằng từ chối là một phần của quy trình nhưng bạn lại không thể chấp nhận nó.

  Phân tích 80+ email từ chối ứng tuyển vào vị trí lập trình viên Python và kết quả không ai ngờ đến!

Đơn giản mà nói thì không thể đánh giá chính xác một kỹ sư chỉ trong vài giờ phỏng vấn. Mỗi quy trình chỉ chọn người phù hợp với công ty và phát triển họ sau đó theo cách tốt nhất. Những gì bạn đang làm rất tốt có thể không phải thứ công ty đang tìm kiếm.

Nếu tôi rớt phỏng vấn mà lại đọc những dòng thế này thì tôi cũng thấy nhảm nhí. Tôi luôn cố gắng trở thành chiến binh. Tuy nhiên, có thời điểm chiến binh này thua quá nhiều trận đấu, một chiến binh mà luôn thua cuộc thì không khác gì một cái bao cát boxing. Tuy vậy, hãy tìm lấy sức mạnh nội tại để kéo bản thân ra khỏi những gì làm bạn nản chí. Để đứng lên, hãy chiến đấu thêm một lần để thất bại không còn là điểm đến tiếp theo.

Phỏng vấn về đam mê

“Công việc của bạn sẽ lấp đầy phần lớn cuộc sống của bạn, và cách duy nhất để hài lòng tuyệt đối là làm những gì bạn tin đó là một công việc tuyệt vời. Vậy nên hãy tiếp tục tìm kiếm cho đến khi bạn thấy nó. Đừng dừng lại. Sẽ đến lúc con tim sẽ chỉ lối cho bạn. Giống như một mối quan hệ, hãy quyết tâm đến cùng, đừng bao giờ bỏ cuộc.” – Steve Jobs

Khi làm chuyện mà bạn đam mê, bạn thậm chí còn không biết cả cuộc đời đã trôi qua. Đó là ý nghĩa bất biến của lập trình, niềm đam mê của tôi và chính bạn. Niềm đam mê chính là nguyên liệu bí mật để thành công,

Đôi lúc bạn giỏi hơn ở những mảng bạn không thật sự thích, nhưng chính niềm đam mê sẽ thúc đẩy bạn. Và để đánh giá sự yêu nghề của một kỹ sư thì không hề dễ dàng. Tuy vậy, khi tôi hỏi bạn về side project hay project đỉnh nhất bạn từng làm, có thể bạn sẽ kể về chúng cả buổi. Không cần biết đó là một platform có hàng triệu người dùng hay một side project chưa từng hoạt động, một lập trình viên đam mê sẽ mô tả rất nhiệt tình về từng cái pattern, từng challenge phải vượt qua, thậm chí những lần hack chưa được. Ứng viên, hay người phỏng vấn, cũng chỉ là những techguy với những dòng code đầy nhiệt huyết.

Người phỏng vấn có thể nhận ra nhiệt huyết thông qua ánh mắt hay body language của ứng viên. Hãy kể về dự án khiến bạn khó quên nhất và đó chính là điểm khác biệt giữa bài phỏng vấn trung bình với buổi phỏng vấn xuất sắc.

Tóm lại

Phần căng thẳng nhất đối với ứng viên là khi rất cần công việc và phải chứng minh mình đủ giỏi. Người phỏng vấn cũng không hề dễ dàng, họ phải có những lý do xác đáng để chọn hay loại ứng viên. Hy vọng bài viết này sẽ cho bạn cái nhìn rõ hơn về suy nghĩ của một người phỏng vấn, từ đó giúp bạn nắm bắt cơ hội việc làm mà bạn đang tìm kiếm.

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

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

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

Bài toán thành công: Đâu là những bí quyết cần nắm bắt?

thành công

Cùng chung một quỹ thời gian là 15 phút, tại sao bạn chỉ làm được một việc trong khi nhiều người lại làm được nhiều việc khác nhau. Do hiệu suất về công việc nhiều hơn, họ có nhiều cơ hội tích lũy các kinh nghiệm. Vì thế, thành công đến nhanh với họ là tất yếu. Cùng TopDev phân tích về những lý do thực tế giúp họ đạt được những thành công.

Bài toán nhận diện mức độ: Quan trọng – Khẩn cấp

Là một người thông minh, bạn cần nhận diện, đánh giá được mức độ ưu tiên. Tức đâu là công việc quan trọng, đâu là công việc khẩn cấp cần phải thực hiện.

80% kết quả của bạn đến từ 20% công việc. Vì vậy, bạn hãy ưu tiên lựa chọn và thực hiện các công việc thật sự quan trọng. Hãy quan tâm đến những công việc có thể mang lại nhiều giá trị cho bản thân.

thành công

Tât nhiên, bạn phải dành thời gian để kiểm tra mức độ hiệu quả ban đầu. Đồng thời, cần tập trung vào những sai sót có thể phát sinh để kịp thời đưa ra các giải pháp phù hợp nhất. 

Khai thác mức độ quan trọng – khẩn cấp trong công việc còn giúp bạn sắp xếp, nắm bắt tính tổng thể trong quá trình giải quyết công việc. Đôi khi sẽ có những công việc quan trọng nhưng chưa khẩn cấp. Và ngược lại, có những công việc lại rất khẩn cấp nhưng chưa thật sự quan trọng. Việc tự xem xét về một công việc nào đó rất khó khăn, bởi bạn không phải chuyên gia. Tuy nhiên, hãy rèn luyện kỹ năng này từng ngày để gia tăng được năng lực cảm thụ, đánh giá được tiềm năng các giá trị, hiệu quả mà một công việc nào đó có thể mang lại.

Trao quyền – Bản lĩnh của người thành công

Việc trao quyền cho nhân viên không còn là vấn đề xa lạ. Dựa vào sự đánh giá của bạn về từng cá nhân, bạn sẽ cho họ cơ hội đảm nhận; chịu trách nhiệm một phần công việc nào đó. Tuy nhiên, khi không có nhân viên, bạn có thể trao quyền cho các cộng sự, các đối tác đáng tin cậy.

thành công

Là một lãnh đạo, bạn đừng để cái tôi quá cao. Nếu ví các dự án bạn thực hiện là các mảnh ghép rời rạc, thì bạn phải là người kết nối chúng. Khi sự trao quyền được thiêt lập, bạn phải sẵn sàng đối mặt với những thách thức có thể xảy ra. Đồng thời, đó cũng là cách để bạn hoàn thiện hơn về bức tranh tổng thể. 

  Cách thiết lập và duy trì mối quan hệ (networking) hiệu quả
  4 cách thúc đẩy sự phát triển nhân viên tại công ty

Quan trọng nhất là một khi đã chấp nhận trao quyền tức là chấp nhận rủi ro. Ván cờ đã diễn ra và bạn không thể dừng lại khi thấy những quân bài dần trở nên xấu đi. Hãy lưu tâm: Khi sở hữu các quân bài xấu, bạn vẫn phải là một người chơi giỏi.

Bạn đừng đặt nặng vấn đề về sự hoàn hảo khi trao quyền. Điều quan trọng chính là bạn sẽ tìm kiếm và thiết lập các mối quan tốt đẹp. Đồng thời, đó cũng là cách bạn tạo ra sự thúc đẩy cho các nhân viên mình.

Hãy thể hiện thông minh và có chừng mực

Bạn có thể làm ít, nhưng nó phải chất lượng. Làm ít nhưng vẫn đủ khối lượng công việc. Chính điều này tạo ra sự khác biệt. Và sự khác biệt luôn dẫn đến sự đố kỵ, ganh đua. Đồng nghiệp họ sẽ nghĩ bạn là luôn giả vờ, họ hoài nghi về khả năng thật sự của bạn. Bạn không nên tạo ra cho họ những lối suy nghĩ như vậy. 

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

Thế nên, điều bạn cần quan tâm chính là hãy thể hiện bản thân một cách thông minh và có chừng mực. Đây cũng được đánh giá là một chiến lược giúp bạn chạm đến sự thăng tiến trong sự nghiệp.

Bạn cần giao tiếp với đồng nghiệp một cách cởi mở, học hỏi để gia tăng các hệ giá trị của bản thân về niềm tin. Hãy ghi nhớ, đừng tỏ vẻ mình là một người quá sành sỏi về cả chuyên môn lẫn cách sống. Đó được xem là một biểu hiện tiêu cực. Hãy đi từ từ, chậm mà chắc, cho họ có đủ thời gian nhìn nhận được thực lực của bạn. Đó sẽ là lúc thích hợp để bạn tăng tốc trên cuộc đua nghề nghiệp

Sở hữu tầm nhìn nhà lãnh đạo

Có những cá nhân chỉ làm tốt vai trò của mình và cái họ thiếu chính sự bức phá. Đây cũng lý do cản trở sự thăng tiến của họ. Họ dậm chân không phải không đủ giỏi mà do họ chưa thật sự có cái nhìn xa hơn. 

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

thành công

Có lẽ, tiền và những áp lực trước mắt khiến họ chỉ tập trung vào giai đoạn hiện tại. Họ nhận lương cuối tháng, ít giao thiệp với mọi người. Họ lại thiếu đi các mối quan hệ. Chúng ta sẽ không có ý kiến vì thực tế, đây không phải là sự lựa chọn tồi. Chỉ là họ hoàn toàn có thể thành công hơn với một sự lựa chọn khác. 

Ngược lại, nếu bạn xem mỗi ngày đi làm là mỗi bước trưởng thành hơn, có ý nghĩa lớn đối với sự nghiệp, bạn sẽ có động lực hơn. Chính lối suy nghĩ, cách nhìn nhận tích cực giúp bạn vạch ra những hướng đi cụ thể. Để mỗi chăng đường bạn đi, bạn biết mình cần phải làm gì, làm như thế nào, làm chúng với ai,… Khi có tầm nhìn tốt, bạn sẽ phấn đấu để hoàn thiện để mỗi ngày trôi qua, bạn đều là một phiên bản tốt hơn của chính mình.

Lời kết

Thành công là đỉnh cao ai cũng muốn chạm đến. Và tất nhiên, để đạt được nó là cả một sự nỗ lực, đôi khi bạn còn phải đánh đổi nhiều thứ. Quan trọng nhất vẫn nằm ở chính bạn. Bạn cần áp dụng các bí quyết đồng thời phối hợp các kỹ năng để có cho mình những định hướng thật sự phù hợp. TopDev hi vọng các bạn sẽ có những kế hoạch đầu tư phát triển bản thân đề con đường vươn đến thành công không còn xa nữa.

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

Xem thêm Top việc làm it mới nhất trên TopDev

freeCodeCamp là gì? Các giáo trình chứng chỉ IT dành cho lập trình viên

freecodecamp-la-gi

FreeCodeCamp là gì? – Trong ngành IT chúng mình, tự học cũng là một phần nhiệm vụ của lập trình viên vì: 

  • Để làm mới những skill của bản thân, để theo kịp thời đại, không bị thụt lùi so với thế giới, chúng ta phải tự học.
  • Đôi khi vì yêu cầu của dự án, vì nhu cầu tìm việc chúng ta phải học và tìm hiểu những ngôn ngữ/công nghệ mới.

Lập trình là một lộ trình “tự mài dũa” liên tục, và các nền tảng cho phép lập trình viên luyện tập code hàng ngày – miễn phí – dễ sử dụng là điều cần thiết cho cộng đồng IT hiện tại. Và đương nhiên nói đến “luyện tập” và “luyện hàng ngày” thì không thể không nói đến freeCodeCamp, nền tảng miễn phí cung cấp chứng chỉ lập trình phi lợi nhuận hàng đầu cho lập trình viên. Đối với các bạn lập trình viên Việt Nam mới vào nghề chắc chắn không thể bỏ qua và nên dành một ít thời gian tìm hiểu và cân nhắc nếu phù hợp với mình.

freecodecamp là gì?

freeCodeCamp là gì?

freeCodeCamp là một “tượng đài” với dân lập trình và người mê code nói chung, là “học viện code trực tuyến” miễn phí nổi tiếng nhất trong cộng đồng developer nhiều năm qua. Tuy nhiên, không ít bạn trẻ Việt Nam mới vào nghề có thể chưa hiểu rõ về nó cũng như cần một guideline hướng dẫn cụ thể hơn để tận dụng triệt để nền tảng này cho mục tiêu lập trình dài hạn của mình.

freeCodeCamp chính thức gia trình làng giới code vào năm 2014, với mục tiêu của họ là “giúp mọi người đều biết viết code” hoàn toàn miễn phí. Cách thức để phục vụ cho mục tiêu này đó là thông qua các bài giảng theo chương trình học cụ thể, video hướng dẫn, article bài blog và các nhóm cùng học tập trên khắp thế giới.

Có rất nhiều chứng chỉ học tập trên freeCodeCamp offer đa dạng các chương trình học tập khác nhau – tình từ thời điểm năm 2014 đã có đến 40,000 “developer” tốt nghiệp từ nền tảng. Và bộ phận không nhỏ đã được recruit vào các công ty “tech khủng” nhất trên thế giới.

freeCodeCamp là một cộng đồng chứa những mã nguồn mở bởi những con người bận rộn – những người học cách viết code và xây dựng các dự án cho các tổ chức phi lợi nhuận. Kênh youtube của họ đăng tải các video hướng dẫn dưới dạng một khóa học trực tuyến.

Tìm hiểu thêm lộ trình Tự học lập trình TẠI ĐÂY

Hệ sinh thái cộng đồng freeCodeCamp

freeCodeCamp còn mở các medium khác phục vụ toàn diện cho giới code:

Kênh có nhiều gia sư khác nhau dạy đa dạng các công nghệ hiện nay. Nếu bạn đang muốn học phát triển Android hoặc Ionic, bạn cũng có thể tham khảo ở kênh này.Kênh của họ còn có một chương trình âm nhạc có thể giúp bạn thư giãn trong khi code. Bạn có thể xem qua kênh freeCodeCamp tại đây.

  • Forum của freeCodeCamp hỗ trợ cộng đồng, như “Quora của giới code” vậy. Khi học mà gặp phải vấn đề hoặc bất kì thắc mắc về chương trình bạn hoàn toàn có thể lên forum gửi thông tin. 

freeCodeCamp mang tính cộng đồng cao, nên phần nhiều các lập trình viên hoạt động tạo profile để trau dồi kỹ năng qua việc luyện tập và support các coder khác tại trên forum. Ở giao diện chính của người dùng, freeCodeCamp có mục cho người dùng setting, sign out, ảnh đại diện người dùng trên freeCodeCamp và bên dưới là các tài khoản social như GitHub hay LinkedIn.

Bên dưới cùng sẽ có điểm của bạn hiện tại, các link dẫn tới Certification, lịch làm việc gần đây của bạn trên freeCodeCamp (đo bằng cách hôm đó có ghi điểm nào hay không), số ngày liên tiếp dài nhất, số ngày liên tiếp hiện tại và bên dưới cùng là các thử thách đã vượt qua.

  Có còn nên học Công nghệ thông tin thời điểm hiện tại?

Nhúng tay vào freeCodeCamp

Các giáo trình chứng chỉ cho các bạn mới vào nghề

freeCodeCamp hiện offer đến cộng đồng 6 chứng chỉ lập trình quan trọng và giúp bạn đi từ beginner lên fullstack

Mỗi chứng chỉ cần 300 giờ học, trung bình (chăm chỉ) mỗi ngày học 3 tiếng thì có thể hoàn thành 1 chứng chỉ trong 3 tháng. Một số người có thể mất nhiều thời gian hơn. Các chứng chỉ này hoàn toàn do bạn tự thực hiện, vì vậy, bạn có thể mất bao lâu tùy ý.

Tất cả các khóa học bao gồm một bộ các bài học phụ hỗ trợ và chi tiết. Mỗi bài học dạy cho bạn một khái niệm duy nhất. Sau đó, bạn phải hoàn thành một thử thách ngắn. Mỗi khóa học sẽ kết thúc sau 5 dự án và hiển thị những gì bạn đã học được. 

Bạn có thể tham gia tất cả các khóa học theo bất kỳ thứ tự nào. Nhưng hiện tại chúng đã được sắp xếp một cách khá khoa học bạn hoàn toàn có thể follow. freeCodeCamp sẽ đặc biệt dạy cho sinh viên IT mới các kỹ năng quan trọng đối với một software developer và các khóa học tập trung phát triển web chuyên sâu. 

Hiện freeCodeCamp offer 6 chứng chỉ basic “hot nhất” bạn có thể follow bao gồm:

  • Responsive Web Design: Khóa học này đi từ những step cơ bản nhất như HTML, CSS cùng các bài học về thiết kế ứng dụng và thành phần cho CSS flexbox và grid. Đây là giáo trình đầy đủ nhất, cho các bạn kiến thức cơ bản về HTML, CSS và javascript. Hoàn thành nó bạn sẽ có chứng chỉ Front-end Developers
  • Thuật toán JavaScript và Data Structures (Cấu trúc dữ liệu): Khóa học sẽ dạy về cả JavaScript và lập trình nói chung. Ngoài ra sẽ cover cả hai định nghĩa căn bản trong lập trình như debug hoặc object-oriented và lập trình hàm (functional programming) song song với các bài về JavaScript như ES6 và Thuật toán JavaScript. 
  • Front End Libraries: Khoá này sẽ dạy cho bạn các kĩ thuật và công nghệ front-end mới nhất gồm jQuery, React, Redux, và Bootstrap. 

freecodecamp là gì

  • Data Visualization: Một khoá học tập trung về visualize dữ liệu, một trong những kỹ năng rất quan trọng nhất nếu bạn muốn trở thành data scientistdata analyst, qua các skill như D3, JSON APIs, và Ajax. Hoàn thành xong bạn sẽ có chứng chỉ Data Visualization tương ứng.
  • APIs và Microservices: Khoá chuyên về API và công nghệ mới như Npm, Node, Express, MongoDB, và Mongoose.
  • Information Security (Bảo mật thông tin) và Quality Assurance: Một khóa học trau dồi các kỹ năng hiện được săn đón nhất trên thị trường, gồm Helmet JS cho security testing và Chai cho QA testing. 

freecodecamp là gì

Mỗi chứng chỉ yêu cầu 5 project bắt buộc, và các câu hỏi bài tập là không bắt buộc. Nếu hoàn thành đầy đủ lộ trình 6 chứng chỉ trên sẽ được chứng chỉ Full Stack – một điểm sáng phân biệt freeCodeCamp với các nền tảng học code khác vì họ đã định hướng rõ lộ trình để cả newbie hoàn toàn có thể theo học và định hướng. 

Bên cạnh đó là còn có một khoá Technical interview để trang bị cần thiết cho bạn khi đi phỏng vấn xin việc. 

Lưu ý rằng đây không phải là 6 khoá học duy nhất trên freeCodeCamp. Trên kênh youtube của freeCodeCamp bạn sẽ nhận được rất nhiều source free và tut hướng dẫn nhiều chủ đề khác nhau như lập trình, bao gồm cả ngôn ngữ đang hot nhất hiện nay – Python và Machine Learning. 

Tham khảo kinh nghiệm của Senior Developer bắt đầu sự nghiệp từ freeCodeCamp

Học trên freeCodeCamp như thế nào?

Style giảng dạy của nền tảng rất trực tiếp qua thiết kế rõ ràng, giống như một khóa học đại học. Các bài học rõ ràng dễ nhìn như thiết kế của trang web. Bài giảng được thể hiện hiện chủ yếu qua các ví dụ thực tế để bạn dễ học – nhớ lâu hơn.

Chính sự đơn giản này cũng mang lại một mặt bất lợi cho một số level nhất định. Có những bài học đơn giản sẽ rất phù hợp cho level các bạn mới học – mới vào nghề. Và các bài học sau sẽ mở rộng hơn tuỳ thuộc vào nội dung. Tuy nhiên, có nhiều cách để sử dụng code nên bài học có thể sẽ hơi chậm với một số bạn.

Nhưng đây là vấn đề chung đối với hầu hết các khóa học và chương trình đào tạo coding online. Nói chung, cách tốt nhất để học viết code là học qua kinh nghiệm thực hành. Và freeCodeCamp cung cấp cho các bạn nền tảng mở và MIỄN PHÍ để làm chuyện này. Cứ mỗi cuối bài học sẽ có một project. Và chương trình học sẽ chú trọng nâng cao các kỹ năng một lập trình viên giỏi cần có. 

Giao diện sử dụng 

Thoạt nhìn giao diện của freeCodeCamp rõ ràng đến mức nhìn như một trang web thuở mới có Internet. Nhưng thực tế bên trong là một số thiết kế rất thông minh. Ít hình ảnh gây rối mắt và không có quảng cáo. Bố cục của mỗi trang rất đơn giản, chỉ có người học – trang học và code thôi.

Chính vậy mà freeCodeCamp cung cấp được một trải nghiệm học tập tập trung hơn, hiển thị lộ trình tiến bộ rõ ràng và là một điểm bắt đầu cụ thể cho các bạn mới vào ngành. Khi bắt đầu các bài học, bạn không cần phải quay lại danh sách chính, vì mỗi bài học sẽ tự sang bài tiếp theo khi hoàn thành.

Khi bắt đầu vào bài học, giao diện sẽ hiển thị chia thành 3 lane (cột). Ví dụ như bài HTML dưới đây, trang sẽ tách làm 3 cột từ trái qua: cột “bài giảng” => cột “user code” => cột “Ví dụ” hiển thị kết quả. Với thiết kế này hiện đang được xem là dễ sử dụng nhất với cho tất cả các trình độ.

  32 cuốn sách học lập trình bạn nhất định phải đọc
  10 kênh Youtube học lập trình không thể bỏ qua dành cho Junior Web Developer / Designer

Ưu nhược điểm của freeCodeCamp

Ưu điểm & Quyền lợi

  • freeCodeCamp khá dễ dàng, trực quan và dễ học
  • Đây lại là một cộng đồng phi lợi nhuận nên bạn học hoàn toàn miễn phí
  • Các chứng chỉ từ freeCodeCamp khá là được quan tâm từ các doanh nghiệp khi tuyển dụng. 

Riêng với thị trường Việt Nam thì vẫn chưa nhiều, tuy nhiên với các công ty Global – công ty IT mới sẽ rất coi trọng nếu như Portfolio / Linkedin của bạn có Certificate từ freeCodeCamp.

  • Bạn sẽ có trợ giúp từ chatroom 24/7 từ khắp nơi trên thế giới – như “Quora của giới code”

Với các bạn Lập trình viên thì thật sự không quá nhiều lý do để từ chối lên freeCodeCamp vì:

  1. Nó FREE.
  2. Có lộ trình sẵn cụ thể, dành ra 1 khoảng thời gian mỗi ngày để học liền tay
  3. Học được nhiều ngôn ngữ code và tự trau dồi trở thành một lập trình viên full-stack thành thạo cả frontend và backend 
  4. Được nhúng tay vào các project real-life 
  5. Nhận certificate chứng nhận – làm đẹp “Giấy bán thân” CV & Portfolio 
  6. Kết nối với cộng đồng các coder khắp nơi 

Nhược điểm

Nếu có những điểm để các bạn sinh viên từ chối không đụng đến freeCodeCamp thì:

  • Phần đông mọi người khá lười và chỉ lấy chứng chỉ cơ bản như front end – vừa đủ cho mình. 

Việc này không sai, mỗi bạn sẽ có một định hướng và kế hoạch riêng cho mình để trang bị, tuy nhiên với các bạn chưa có định hướng hoặc căn bản là lười thì không tốt.

  • Ngay cả khi mang chứng chỉ thì bạn vẫn cần đi thực tập hay tham gia các dự án phi lợi nhuận về code

Nói đi cũng phải nói lại, riêng với đặc thù các công ty IT tại Việt Nam sẽ require các bạn nhiều hơn các tấm Certs, mặt bằng chung ai đã tìm việc đều sẽ nắm chuyện này. Nên freeCodeCamp có tác dụng bổ trợ, như một lớp học thêm các bạn trang bị các nhiều vũ khí thì chinh chiến càng có nhiều cơ hội hơn thôi!

Kết luận: Liệu freeCodeCamp có đáng thử không?

Đây là nền tảng DIY “Do It Yourself” hơn là một bootcamp theo mô hình thông thường. Mô hình ở đây của freeCodeCamp chỉ cung cấp lộ trình, bài học giáo án cụ thể và còn đặt lịch học schedule cụ thể cho bạn. Vì thế, nếu bản thân là một người tự học giỏi, gọi là self-motivation cao (có tinh thần cầu tiến) cũng như có kỷ luật, thì không hà cớ gì mà skip freeCodeCamp cả, log in và tìm niềm vui ngay. Bản thân viết tự học và tự phấn đấu qua các khóa học này cũng đã giúp bạn có vững vàng hơn khi đối mặt với các khó khăn thực tế của nghệ lập trình.

Còn nếu như, các ví dụ trên không áp dụng được cho bạn, thì bạn có thể cân nhắc về các dạng bootcamp. Các dạng coding bootcamp nổi tiếng về mức độ khắt khe về thời gian, lịch trình để đôn thúc người dùng “lên tay” trong thời gian ngắn. Và đương nhiên là có nhiều cơ hội nghề nghiệp chất lượng sau các khóa bootcamp cho bạn. Không ít bạn thích có trải nghiệm thực tế – tương tác qua lại nhiều để thúc đẩy học nhanh hơn, và rất nhiều service trên thị trường cung cấp dạng này – KHÔNG FREE nhé. 

Ngoài ra, các chương trình học lập trình truyền thống cũng là 1 option cho các bạn – chi tiết hơn, lộ trình rõ ràng có hướng dẫn hơn. Và đương nhiên là option nhiều phí nhất trong cả ba, do chất lượng và thời gian đảm bảo hơn nếu như không thể làm quá nhiều thứ một mình. 

Bonus: Những nguồn tài liệu đáng xem cho những ai đang tự học lập trình

  • Hãy bắt đầu với kiến thức giới thiệu về CS50 trong khoa học máy tính trên edX CS50’s Introduction to Computer Science, đây đơn giản là những tài liệu cho người mới miễn phí tốt nhất và dễ học nhất được đánh giá. Sau đó hãy đọc tiếp lập trình web CS50 bằng Python và JavaScript CS50’s Web Programming with Python and JavaScript.
  • Xem qua lộ trình mới nhất về thiết kế web qua video tại đây.
  • Một số subreddit nên theo dõi: r/learnprogramming, r/programming, r/webdev, r/web_design, r/reactjs, r/freecodecamp, r/cscareerquestions ,… Bạn có thể tự tạo một tài khoản Reddit chỉ đơn thuần cập nhật các subreddit về CS, để đảm bảo rằng feed không bị nhiễm những thứ không liên quan khác.
  • Udemy: khóa học hot nhất từng mua là MERN Stack Front To Back của Brad Traversy. Những video hướng dẫn rất tuyệt vời sẽ giúp bạn trở thành một chuyên gia trên các platform mạng xã hội. Tuy nó mất phí nhưng đáng đồng tiền bát gạo.
  • Hướng dẫn của Net Ninja về Node/Express tại đây
  • Stack Overflow, cái này thì không cần phải động não quá nhiều. Search GG và đọc định nghĩa là đủ.
  • Học CSS qua các kênh Flexbox Froggy, Grid Garden. Xem xong bạn sẽ vận dụng khá tốt cho các buổi phỏng vấn đấy.
  • Các nguồn sách ebook về JavaScript miễn phí: The Road to Learn React, You Don’t Know JS, và Eloquent Javascript nếu bạn muốn thử cái gì khó hơn.
  • HackerRank hoặc Leetcode để rèn luyện kĩ năng problem solving (giải toán) của bạn. Nếu bạn thực sự giỏi kĩ năng này bạn có thể apply vào Big-N.
  • Tính chần chừ không dám hành động có thể là một trở ngại lớn trong công việc của bạn. Nếu bạn đang là một con người như vậy, đừng lo lắng hãy yên vị ở một công ty tốt và bạn sẽ cải thiện được tính chất này.

TopDev tổng hợp.

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

Xem thêm IT Jobs Software Developers mới nhất trên TopDev