Home Blog Page 182

Những lý do ảnh hưởng đến ReactNative performance của bạn

lý do ảnh hưởng đến ReactNative performance

Đối với các bạn mới bắt đầu làm quen React Native thì việc tối ưu performance là điều không cần thiết. Các bạn nên dành thời gian để tìm hiểu xem props/state là gì, tạo style thế nào, tạo component ra sao, blabla…

Nhưng khi đã thành thạo những kiến thức cơ bản và bắt đầu làm 1 sản phẩm hoàn chỉnh thì việc quan tâm đến performance là điều cực kỳ quan trọng, đặc biệt trong những view phức tạp hoặc có dữ liệu lớn.

Nguyên tắc chung khi lập trình giao diện là: render càng nhiều, performance càng thấp (app càng lag). Vậy nên để cải thiện performance, việc đầu tiên chúng ta phải xem xét là có xử lý nào gây ra những render không cần thiết hay không?

Tuy nhiên, có những thói quen lập trình tưởng chửng rất đơn giản nhưng lại là nguyên nhân của những render không mong muốn. Cùng thử xem các lý do ảnh hưởng đến ReactNative performance của bạn để khắc phục nhé!

Sử dụng literal object làm props

Literal object là gì?

Nó đơn giản chỉ là các JS object như {a:1, b:2} hoặc [1, 2, 3]…

Ví dụ:

<MyView style={{flex: 1}} /> // <== literal object for style props

Vậy tại sao lại có vấn đề với cách viết super basic này? Thậm chí trên trang chủ của facebook cũng có sample kiểu như vậy!!!

Tất cả đều do cách làm việc của Shallow Compare của React.

Quay lại phân tích ví dụ trên có thể thấy mỗi lần được Component cha của MyView được render, nó sẽ tạo ra 1 literal object {flex: 1} và gán vào props style của MyView => props style bị thay đổi!

oldProps.style = {flex: 1}
newProps.style = {flex: 1}
// Nhìn thì giống nhau, nhưng thực tế lại khác nhau!!!
shallowEqual(oldProps, newProps) // = false

Nếu component MyView không phải kế thừa từ React. Component và implement phương thức shouldComponentUpdate để lờ đi sự thay đổi của props này, hoặc sử dụng Function Component mà không có biện pháp xử lý phù hợp thì chắc chắn MyView sẽ bị re-render!

Cách đơn giản nhất để giải quyết vấn đề này đó là:

Không sử dụng literal object làm props

class ParentView extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: ["a", "b", props.name],
    };
  }
  render() {
    return <MyView style={styles.myView} data={this.state.data} />
  }
}

const styles = {
  myView: { flex: 1 }
}

Nếu ParentView là 1 function component thì sao? Câu trả lời là Hooks

const ParentView = (props) => {
  // useMemo sẽ tạo ra 1 object data
  // và chỉ tạo object khác khi nào props.name thay đổi
  const data = useMemo(() => ["a", "b", props.name], [props.name])
  
  return <MyView style={styles.myView} data={data} />
}

const styles = {
  myView: { flex: 1 }
}

Sử dụng arrow function làm props

Thói quen phổ biến thứ 2 gây ra những re-render vô nghĩa là sử dụng arrow function làm props.

<MyView onUpdate={(data) => OtherModule.update(data, this.props.name)} />

hoặc

<TextInput
  value={this.state.name}
  onValueChange={(name) => this.setState({name})}
/>

Khi sử dụng cách viết code này, props của component có sử dụng arrow function sẽ luôn được gán 1 function mới (do arrow function sinh ra) mỗi lần component cha của nó re-render. Có props mới truyền vào, component này sẽ bị re-render theo đúng cơ chế giống như literal object ở trường hợp đầu tiên!

Vì vậy, hãy tử bỏ ngay thói quen sử dụng arrow function làm props.

class ParentView extends React.Component {
  updateData = (data) => OtherModule.update(data, this.props.name); 

  render() {
    return <MyView onUpdate={this.updateData} />
  }
}

Nếu ParentView là function component, hãy nghĩ ngay đến Hooks.

const ParentView = (props) => {

  // useCallback sẽ tạo ra 1 function updateData
  // và chỉ tạo function khác khi nào props.name thay đổi
  const updateData = useCallback((data) => {
    OtherModule.update(data, props.name);
  }, [props.name]);

  return <MyView onUpdate={updateData} />
}

Sử dụng hàm bind() khi tạo props

Về cơ bản, hàm bind hoạt động giống với arrow function khi nó luôn tạo ra 1 function mới mỗi khi được gọi.

<MyView onUpdate={this.update.bind(this)} />

Chính vì sự tương đồng với arrow function nên cách giải quyết nó cũng giống với arrow function như đã trình bày ở phần 2.

Có thể bạn chưa biết, 1 arrow function đã tự động bind con trỏ this trong scope mà function đó được sinh ra, nên trong nhiều trường hợp, việc bind là không cần thiết.

class ParentView extends Component {
  
  update = (data) => this.updateData(data);
  
  render() {
    // không cần bind this nữa vì đã được auto bind từ arrow function rồi
    return <MyView onUpdate={this.update} /> 
  }
}

Nếu thực sự phải bind (do không muốn sửa code hiện tại để tránh sinh ra nhiều different khi commit code chẳng hạn), thì có thể bind trước ở construtor:

class ParentView extends Component {
  constructor(props) {
    ..
    this.update = this.update.bind(this)
  }

  function update(data) {
    this.updateData(data);
  }

  render() {
    // this.update ở đây là kết quả của hàm bind ở constructor,
    // không phải là "function update(data) {...}" ban đầu
    return <MyView onUpdate={this.update} /> 
  }
}

Lời kết

Hãy luôn luôn nhớ rằng, render càng nhiều, performance càng thấp. Vì vậy, khi cảm thấy ứng dụng của bạn chạy không mượt mà, hãy điều tra ngay xem có xử lý nào gây nên tình trạng re-render ngoài ý muốn hay không.

Tối ưu performance là công việc quan trọng, đòi hỏi nhiều thời gian và kinh nghiệm. Chúng tôi sẽ tiếp tục đề cập đến vấn đề này trong những bài viết tiếp theo. Nếu có ý kiến đóng góp cho bài viết, vui lòng để lại bình luận cho chúng tôi.

Thanks for reading!

Xem thêm việc làm React Native hấp dẫn nhất trên TopDev

Người viết: Nguyen Duc Binh

TopDev via blog.icts.vn

Bài viết liên quan:

  9 ứng dụng tuyệt vời được viết bằng React Native

  React Native là gì? Kiến thức tổng quan về React Native

  Tạo slider component trong React Native bằng PanResponder

Cách Engineer Nhật Bản thực hiện test như thế nào

cach-engineer-nhat-ban-thuc-hien-test-nhu-the-nao

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

Hôm qua mình đọc được bài khá hay về 1 thanh niên nhật (tên miwa) chia sẻ cách engineer Nhật Bản thực hiện test như thế nào.

Đọc xong thấy công nhận khâm phục thật. Công ty họ chạy theo cách đó được gần hơn chục năm rồi. Và gần như sản phẩm chạy rất khó ra bug.

Cùng nhau đọc xem họ làm kiểu gì nhé.

  Doanh nhân kiên nhẫn nhất Nhật Bản: Năm nào cũng viết thư hỏi mua các công ty trên khắp thế giới, có khi chờ tới 16 năm để đối tác gật đầu bán mình
  Test tải hệ thống thực sự cần thiết?

Bối cảnh

Công ty này chuyên phát triển về các phần mềm cho lĩnh vực y tế và cũng chạy được gần 30 năm rồi.

Hiện tại anh Miwa cũng đã từng tham gia vào nhiều dự án, làm với rất nhiều các kĩ sư nhưng team hiện tại mà a đang làm thì quả thực năng lực test của các engineer khá là đỉnh.

Vậy tại sao họ lại test đỉnh như vậy?

Có rất nhiều yếu tố giúp họ làm được điều đó, nhưng mà trong những thứ đó có 1 thứ làm mình thực sự ấn tượng đó là: Mỗi ngày mọi kĩ sư bỏ ra 1 tiếng để test hệ thống.

Từ trước đến giờ quả thực chưa gặp công ty nào kiên trì như công ty này. Kĩ sư thì mình nghĩ ai ai cũng ghét test cả, ai cũng muốn làm cho xong. Nhưng mà công ty này đã làm được, và làm được trên 15 năm mới kinh khủng.

Mọi engineer mỗi ngày phải dành ra 1 tiếng để test hệ thống

Hằng ngày, bất kì ai trong team cũng phải bỏ ra 1 tiếng để test.

Thời gian test thì sẽ từ 10:00 ~ 17:00 mỗi ngày. Không phải là trong khoảng thời gian đó ai thích test lúc nào thì test mà thời gian này sẽ được fix từ trước cùng với PC để test.

Ví dụ như A sẽ test từ 10:00 ~ 11:00 sử dụng PC-01. B sẽ test từ 11:00 ~ 12:00 sử dụng PC-02. Và cứ thế cho đến hết member thì thôi.

PC test ở đây được cài đặt sẵn chương trình để test rồi. Việc test này cũng giống như khách hàng đang sử dụng sản phẩm thật vậy.

Test case thì đã được chuẩn bị từ trước và cứ thế làm theo. Test từng case 1 và xác nhận xem kết quả có như mong đợi hay không và ghi lại kết quả đã test. Đương nhiên có thể free test. Cứ miễn là tìm ra bug thì thôi.

Cứ hết thời gian là kết thúc quá trình test, kể cả chưa test xong đi chăng nữa.

Kết quả thu được sau quá trình test hệ thống

  • Có thể biết được những chức năng hay sản phẩm mà bản thân mình không tham gia phát triển.
  • Biết được workflow mà khách hàng sử dụng hệ thống.
  • Có thể phát hiện được những bug tiềm tàng.
  • Biết được quá trình phát triển phần mềm như thế nào? ai là người đảm nhiệm, ai thiết kế…
  • Ngoài những test case được ghi trong bản đặc tả ra thì có thể test tự do. Do đó có thể tìm ra được những bug mà ít ai để ý đến.

Kết luận

Ai ai cũng ghét test nhưng mà nếu làm theo cách này quả thực chất lượng sản phẩm theo mình nghĩ sẽ được cải thiện rõ rệt.

Một mình tester thì có thể không cover đủ hết tất tần tật các trường hợp nhưng nếu có sự giúp đỡ của các engineer thì điều đó là hoàn toàn có thể.

Nếu dự án nào đang gặp phải vấn đề về chất lượng thì hy vọng qua bài này sẽ có chút giải pháp gì đó cho các bạn.

Xem thêm việc làm Software Developers hot nhất trên TopDev

Bài viết gốc được đăng tải tại Nghệ thuật coding

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

Sự thật về nghề lập trình

nghề lập trình

Giới thiệu

Phải nói rằng công việc của developer chúng ta là một trong những công việc bí ẩn, “nguy hiểm” nhất thế giới. Ai cũng biết một anh thợ điện thì hay leo cột điện, một anh thợ sửa ống nước thì hay vào nhà mấy chị gái để thông ống, nhưng một lập trình viên thì chính xác là làm gì? À, nghe bảo là nó lập trình. Vậy nghề lập trình là gì?

Thuở hàn vi, khi mới bắt đầu theo học ngành này, thậm chí là đến năm 2 đại học mình vẫn chưa biết nghề lập trình thật sự là làm cái gì. Dẫn đến mình có rất nhiều ngộ nhận, mình tin rằng mấy đứa xung quanh mình thời điểm đó cũng thế.

Vì thế hôm nay mình sẽ bật mí cho các bạn một vài sự thật về nghề lập trình mà mình đã rút ra được qua vài năm lăn lộn, đặc biệt là cho các bạn mới nhé.

  Những góc khuất "đeo bám" người làm nghề lập trình
  Vì miếng ăn mà phá cả nồi cơm – Thực tại đáng lo của nghề lập trình

Sự thật về nghề lập trình

Toán học và lập trình

nghề lập trình

Mình đã nghe, đọc ở đâu đó về nhận định này từ hồi cấp 3, rằng muốn lập trình giỏi bạn cần cực kì giỏi toán. Lên đại học, trước khi học lập trình mình đã được học các môn về toán như: toán cao cấp 1, 2, đại số tuyến tính, toán rời rạc… Phải chăng chúng ta cần thật sự giỏi toán để có thể code giỏi?

Câu trả lời là: nó còn tùy. Tùy thuộc vào chuyên ngành, hướng đi mà bạn chọn.

Giả sử như bạn muốn làm game 2d, game 3d, các thể loại game liên quan đến hình ảnh nhiều chiều, chuyển động, rõ ràng bạn cần nắm các kiến thức về toán học để có thể tính toán tọa độ, khung hình cho các đối tượng trong game. Hoặc là bạn muốn làm việc thiên về nghiên cứu, các lĩnh vực như trí tuệ nhân tạo, deep learning…, rõ ràng là bạn cần kiến thức chuyên sâu về toán học để có thể giải quyết các vấn đề.

Nhưng nếu bạn đi theo hướng “bình thường”, bạn muốn làm web, làm ứng dụng di động…, thì mình có thể khẳng định rằng bạn không cần giỏi toán. Không cần giỏi toán ở đây có nghĩa là bạn không cần giỏi về nhị thức newton, tích phân mở rộng, nguyên hàm gì gì đấy mình không nhớ, nói chung là các kiến thức toán chuyên sâu. Thứ duy nhất về toán bạn cần giỏi là toán logic, dùng để phân tích, mổ xẻ vấn đề khi bạn lập trình.

Tất nhiên cũng còn tùy vào loại dự án mà bạn tham gia. Vừa rồi mình có làm một trang web giúp trẻ em học toán thông qua hình ảnh, trong đó có một số chỗ áp dụng các kiến thức về đường tròn, ellipse để vẽ ra các hình ảnh, cuối cùng mình mất cả đêm vẫn chưa thể làm xong vì mình không thể nhớ tan=sin/cos.

Thế đấy, tất cả mọi thứ đều liên quan đến chữ “tùy”, tuy nhiên, nếu bạn không tập trung vào những ngóc ngách đặc biệt của ngành lập trình thì đừng quá lo lắng về kiến thức toán học nhé.

Tham khảo thêm các vị trí tuyển IT:

Lập trình = gõ phím?

nghề lập trình

Một developer dùng phần lớn thời gian để gõ code?

Nghe có vẻ hợp lý, developer không code thì làm gì nữa? Qua đôi ba năm cày ải mình nhận ra nhận định này có vẻ không đúng lắm.

Những ngày đầu tiên mình đi làm, mình thường quan sát các anh senior xung quanh xem họ làm việc như thế nào. Lạ ở chỗ là mình thấy họ không tập trung code mà cứ ngồi vẽ vẽ, viết viết gì đấy giống như là viết văn.

Tại sao lại như vậy? Tại sao senior trình code cao lại không code nhiều? Lý do là bởi lập trình không phải là gõ phím, để lập trình hiệu quả, bạn cần dành thời gian phân tích yêu cầu, suy nghĩ hướng làm, research hướng làm hiệu quả, đôi lúc là phác họa luồng chạy của code… Viết code gần như là một trong những bước cuối cùng của quá trình lập trình.

Thế nhé, chỉ mấy đứa gà mới code như một cái máy thôi.

Biết nhiều ngôn ngữ, công nghệ = code giỏi?

nghề lập trình

Đây là một trong những nhận định sai lầm nhất về lập trình, các bạn mới học rất dễ ngộ nhận điều này, đặc biệt là các anh chàng mới lớn.

Ngày xưa mấy đứa bạn mình trong trường hay bàn tán về một thằng tên S: “ôi thằng S nó biết PHP, C#”, “ôi thằng S nó biết cả Nodejs”, “ôi nó lại còn biết cả Java nữa”. Cuối cùng S được gọi là “S master“. S cũng tưởng mình master thật, ra oai ghê lắm. Thằng S này ngày càng cố gắng học nhiều ngôn ngữ lập trình mới vì nó nghĩ biết nhiều ngôn ngữ đồng nghĩa với code giỏi, đồng nghĩa với master.

Lúc đấy mình cũng nghĩ giống như thằng S kia, cũng muốn được như nó lắm. Nhưng không lâu sau thì nghe bảo S vào một công ty nọ bị hành ghê lắm, nó chẳng làm được gì với đống ngôn ngữ nó học cả. Bởi vì mấy cái trong thực tế cái nào cũng phức tạp, rối rắm, S thì chỉ biết code ứng dụng CRUD (ứng dụng thêm xóa sửa). Thế là mình thôi không bắt chước thằng S master nữa.

Sau này thằng S nó nói với mình là nó nhận ra rằng, hóa ra không phải cứ biết nhiều ngôn ngữ, công nghệ thì sẽ đồng nghĩa với code giỏi. Hóa ra kĩ năng giải quyết vấn đề, phân tích chương trình, thiết kế chương trình, clean code, kinh nghiệm… mới là những vũ khí tối thượng.

Cần nhớ mọi thứ để có thể lập trình?

nghề lập trình

Bắt đầu từ năm 2 đại học mình bắt đầu được học một loạt các kiến thức mới. Nào là các kĩ thuật lập trình như kĩ thuật vét cạn, quay lui…, các loại giải thuật khác nhau như: search, sort… Nói chung là rất nhiều thứ cần nhớ. Vậy chúng ta có cần nhớ hết mọi thứ đã được học hay không?

Câu trả lời là không. Không ai có thể nhớ hết mọi thứ được. Mình đã từng cố gắng nhớ hết gần chục cái thuật toán sort, cuối cùng sau vài tháng mình đã quên hơn một nửa.

Ngày nay chúng ta may mắn có internet, mọi thứ đều có thể được tìm kiếm dễ dàng. Vì vậy bạn có thể sử dụng internet như một bộ nhớ ngoài để lưu trữ những thông tin ít quan trọng hơn. Chúng ta chỉ nên sử dụng hàng xịn để lưu những thông tin quan trọng nhất mà thôi.

Cái gì search cũng có thì không cần học nữa hay sao? Không, có một thứ bạn không thể search đó là kĩ năng. Kĩ năng là một trong những thứ quan trọng cần dùng não để lưu. Giả sử như bạn đã code, rèn luyện rất nhiều các thuật toán search khác nhau, như vậy là bạn đã có kĩ năng với các thuật toán search. Sau này mặc dù bạn đã quên đi cách search cụ thể cho từng thuật toán nhưng kĩ năng thì vẫn còn đó, bạn có thể dễ dàng tìm kiếm google và học lại nhanh chóng.

Để có thể lập trình hiệu quả, bạn cần hiểu, nhớ mọi thứ ở mức trừu tượng nhất. Giả sử như bạn học lập trình kết nối cơ sở dữ liệu với C#, bạn không cần nhớ cụ thể cú pháp, syntax như thế nào, cái bạn cần nhớ là cơ chế hoạt động của nó, khi nào thì nên sử dụng… Có những thứ bạn chỉ cần nhớ rằng nó có tồn tại trên đời là đủ, khi gặp các bài toán cụ thể chúng ta sẽ tìm hiểu sâu hơn về nó sau.

Tóm lại, cái bạn cần nhớ là hệ thống kiến thứcliên kết giữa các mảng kiến thứckĩ năng (thông qua rèn luyện).

Kĩ năng tìm kiếm thông tin vô cùng quan trọng

nghề lập trình

Như mình nói ở trên, bạn không thể nhớ mọi thứ được. Vì vậy kĩ năng tìm kiếm thông tin là kĩ năng quan trọng mà bạn cần giỏi để có thể lập trình.

Kĩ năng tìm kiếm thông tin là gì? Là kĩ năng google, đôi khi còn là kĩ năng đi hỏi người khác sao cho không bị chửi.

Google thì cứ thế search thôi chứ cần gì kĩ năng? Không đúng, cùng 2 đứa search một vấn đề nhưng đứa có kĩ năng sẽ ra ngay, đứa không có kĩ năng có thể mất cả ngày vẫn không ra. Kĩ năng sẽ giúp bạn chọn keyword phù hợp cho từng vấn đề, đôi khi chỉ cần đúng keyword là vấn đề sẽ được giải quyết.

Ngoài ra, để có thể tìm kiếm thông tin phù hợp, nhanh chóng, bạn cần có một hệ thống kiến thức rộng lớn trong đầu, đó là những thứ mà mình đã nói chúng ta cần nhớ ở phần trên. Tưởng tượng bạn cần tìm kiếm một viên ngọc màu đen nằm sâu trong lòng đại dương. Một gã thất phu sẽ nhảy ngay ra lòng biển để tìm kiếm một cách vô vọng, người có kiến thức trong đầu sẽ biết được ngọc màu đen sẽ nằm ở Thái Bình Dương, ngọc màu đỏ sẽ nằm ở Đại Tây Dương. Vậy ai sẽ là người tìm kiếm hiệu quả hơn?

Kĩ năng tìm kiếm thông tin = Kĩ năng tìm kiếm + hệ thống kiến thức.

Trên đây mình đã chia sẻ một số sự thật về nghề lập trình mà mình thấy được. Cảm ơn các bạn đã theo dõi bài viết!

Xem thêm việc làm hot nhất trên TopDev

Người viết: Võ Cao Sơn via thedarkknighttech.com

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

OOP là gì? Giải thích dễ hiểu về lập trình hướng đối tượng

Lập trình hướng đối tượng là gì?

Lập trình hướng đối tượng (Object Oriented Programming – OOP) là một trong những kỹ thuật lập trình rất quan trọng và sử dụng nhiều hiện nay. Hầu hết các ngôn ngữ lập trình hiện nay như Java, PHP, .NET, Ruby, Python… đều hỗ trợ OOP. Vậy lập trình hướng đối tượng là gì? Và các nguyên lý cơ bản trong OOP cần biết là gì?

Lập trình hướng đối tượng (OOP) là gì?

Lập trình hướng đối tượng (OOP) là một kỹ thuật lập trình cho phép lập trình viên tạo ra các đối tượng trong code trừu tượng hóa các đối tượng.

Đối tượng là những sự vật, sự việc mà nó có những tính chất, đặc tính, hành động giống nhau và ta gom góp lại thành đối tượng giống trong thực tế cuộc sống. Khi lập trình OOP, chúng ta sẽ định nghĩa các lớp (class) để gom (mô hình) các đối tượng thực tế.

Đối tượng

Một đối tượng bao gồm 2 thông tin: thuộc tính và phương thức.

  •  Thuộc tính chính là những thông tin, đặc điểm của đối tượng. Ví dụ: con người có các đặc tính như mắt, mũi, tay, chân…
  •  Phương thức là những thao tác, hành động mà đối tượng đó có thể thực hiện. Ví dụ: một người sẽ có thể thực hiện hành động nói, đi, ăn, uống, . . .

Lớp

Một lớp là một kiểu dữ liệu bao gồm các thuộc tính và các phương thức được định nghĩa từ trước. Đây là sự trừu tượng hóa của đối tượng. Khác với kiểu dữ liệu thông thường, một lớp là một đơn vị (trừu tượng) bao gồm sự kết hợp giữa các phương thức và các thuộc tính. Hiểu nôm na hơn là các đối tượng có các đặc tính tương tự nhau được gom lại thành một lớp đối tượng.

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

Lớp bạn có thể hiểu nó như là khuôn mẫu, đối tượng là một thực thể thể hiện dựa trên khuôn mẫu đó. Ví dụ: Ta nói về loài chó, bạn có thể hiểu nó là class (lớp) chó có:

  • Các thông tin, đặc điểm: 4 chân, 2 mắt, có đuôi, có chiều cao, có cân nặng, màu lông…
  • Các hành động như: sủa, đi, ăn, ngủ…

Đối tượng thì chính là con chó Phú Quốc ta đang nuôi trong nhà cũng mang đặc tính của lớp chó.

Các nguyên lý cơ bản của OOP

Tính đóng gói (Encapsulation)

Note:

  • Các dữ liệu và phương thức có liên quan với nhau được đóng gói thành các lớp để tiện cho việc quản lý và sử dụng. Tức là mỗi lớp được xây dựng để thực hiện một nhóm chức năng đặc trưng của riêng lớp đó.
  •  Ngoài ra, đóng gói còn để che giấu một số thông tin và chi tiết cài đặt nội bộ để bên ngoài không thể nhìn thấy.

Các thuộc tính và phương thức của đối tượng cần cho việc giải quyết bài toán đã được chọn ra sẽ được đóng gói vào một kiểu dữ liệu gọi là class. Nhằm che dấu thông tin khỏi các đối tượng bên ngoài, thuộc tính nào thì phương thức nấy. Tức là code bên ngoài không trực tiếp nhìn thấy và thay đổi trạng thái của đối tượng đó.

OOP-Encapsulation

Nói chung trạng thái đối tượng không hợp lệ thường do: chưa được kiểm tra tính hợp lệ, các bước thực hiện không đúng trình tự hoặc bị bỏ qua nên trong OOP có một quy tắc quan trọng cần nhớ đó là phải luôn khai báo các trạng thái bên trong của đối tượng là private và chỉ cho truy cập qua các public/protected method/property.

Ví dụ ta thấy một viên thuốc chữa cảm. Chúng ta chỉ biết nó chữa cảm sổ mũi nhức đầu và một số thành phần chính, còn cụ thể bên trong nó có những hoạt chất gì thì hoàn toàn không biết.

Tính kế thừa (Inheritance)

Nó cho phép xây dựng một lớp mới dựa trên các định nghĩa của lớp đã có. Có nghĩa là lớp cha có thể chia sẽ dữ liệu và phương thức cho các lớp con. Các lớp con khỏi phải định nghĩa lại, ngoài ra có thể mở rộng các thành phần kế thừa và bổ sung thêm các thành phần mới. Tái sử dụng mã nguồn 1 cách tối ưu, tận dụng được mã nguồn. Một số loại kế loại kế thừa thường gặp: đơn kế thừa, đa kế thừa, kế thừa đa cấp, kế thừa thứ bậc.

Khi bắt đầu xây dựng ứng dụng chúng ta sẽ bắt đầu thiết kế định nghĩa các lớp trước. Thông thường một số lớp có quan hệ với những lớp khác, chúng có những đặc tính giống nhau.

VD: 2 lớp Android, iPhone

Mỗi lớp đều đại diện cho một loại smartphone khác nhau nhưng lại có những thuộc tính giống nhau như gọi điện, nhắn tin, chụp hình. Thay vì sao chép những thuộc tính này, ta nên đặt chúng vào một lớp chung gọi là lớp cha. Chúng ta có thể định nghĩa lớp cha – trong trường hợp này là Smartphone và có những lớp con kế thừa từ nó, tạo ra một mối quan hệ cha/con.

Tính đa hình (Polymorphism)

Tính đa hình là một hành động có thể được thực hiện bằng nhiều cách khác nhau. Đây lại là một tính chất có thể nói là chứa đựng hầu hết sức mạnh của lập trình hướng đối tượng.

Hiểu một cách đơn giản hơn: Đa hình là khái niệm mà hai hoặc nhiều lớp có những phương thức giống nhau nhưng có thể thực thi theo những cách thức khác nhau.

Ví dụ như ở phần trên, mỗi một smartphone kế thừa từ lớp cha Smartphone nhưng có thể lưu trữ dữ liệu trên cloud theo những cách khác nhau. Android lưu trữ bằng Google Drive iPhone lưu trên iCloud.

Một ví dụ về đa hình trong thực tế. Ta có 2 con vật: chó, mèo. Cả 2 con vật này đều là lớp động vật. Nhưng khi ta bảo cả 2 động vật kêu thì con chó sẽ kêu gâu gâu, con mèo sẽ kêu meo meo.

Vậy trong ví dụ chó, mèo xem như là các đối tượng. 2 con vật có thể hiểu cùng kêu nhưng theo các cách khác nhau.

Tính trừu tượng (Abstraction)

Trừu tượng có nghĩ là tổng quát hóa một cái gì đó lên, không cần chú ý chi tiết bên trong. Nó không màng đến chi tiết bên trong là gì và người ta vẫn hiểu nó mỗi khi nghe về nó.

Ví dụ: Bạn chạy xe tay ga thì có hành động là tăng ga để tăng tốc, thì chức năng tăng ga là đại diện cho trừu tượng (abstraction). Người dùng chỉ cần biết là tăng ga thì xe tăng tốc, không cần biết bên trong nó làm thế nào.

Ở đây trong lập trình OOP, tính trừu tượng nghĩa là chọn ra các thuộc tính, phương thức của đối tượng cần cho việc giải quyết bài toán đang lập trình. Vì một đối tượng có rất nhiều thuộc tính phương thức, nhưng với bài toán cụ thể không nhất thiết phải chọn tất cả.

Ví dụ: Bài toán quản lý sinh viên chúng ta chỉ cần quản lý các thông tin như

  • Họ tên
  • Ngày sinh
  • Giới tính
  • Điểm thi

mà lại không cần quản lý thêm các thông tin:

  • Màu tóc
  • Sở thích
  • Chiều cao

Tại vì chúng thực sự không cần thiết.

Các ưu điểm của lập trình hướng đối tượng

  • Dựa trên nguyên lý kế thừa, trong quá trình mô tả các lớp có thể loại bỏ những chương trình bị lặp, dư. Và có thể mở rộng khả năng sử dụng các lớp mà không cần thực hiện lại. Tối ưu và tái sử dụng code hiệu quả.
  • Đảm bảo rút ngắn thời gian xây dựng hệ thống và tăng năng suất thực hiện.
  • Sự xuất hiện của 2 khái niệm mới là lớp và đối tượng chính là đặc trưng của phương pháp lập trình hướng đối tượng. Nó đã giải quyết được các khuyết điểm của phương pháp lập trình hướng cấu trúc để lại. Ngoài ra 2 khái niệm này đã giúp biểu diễn tốt hơn thế giới thực trên máy tính.

Một số bài viết bạn có thể quan tâm:

Đừng bỏ lỡ các việc làm lập trình OOP hấp dẫn trên TopDev

JavaScript Closures là gì?

JavaScript Closures là gì

Bài viết này mình sẽ giới thiệu với bạn về JavaScript closures là gì. Việc hiểu closures sẽ giúp bạn viết code tốt hơn (ngắn gọn, súc tích hơn và thậm chí dễ hiểu hơn,…).

Tuy nhiên, trước khi đi vào những ưu, nhược điểm của việc sử dụng closures, chúng ta sẽ xem JavaScript closures là gì và cách sử dụng nó như thế nào nhé!

Cùng bắt đầu nào!

  Socket là gì? WebSocket là gì? Hiểu hơn về Websocket

JavaScript closures là gì?

JavaScript Closures là tập hợp bao gồm một hàm và môi trường nơi hàm số đó được khai báo. Ở đây, môi trường bao gồm tất cả những biến cục bộ trong phạm vi hàm số được khai báo. (Để đơn giản, từ nay mình sẽ sử dụng hàm closures khi nói về JavaScript closures).

Hàm closures có thể truy cập biến số ở 3 phạm vi khác nhau là:

  • Biến toàn cục (global)
  • Biến được khai báo ở hàm số chứa hàm closures (outer function)
  • Biến ở trên trong hàm closures

Ví dụ:

function adder(n){
 var intro = 'This answer is ';
 var local = n;
 return function(number){
   var result = number + local;
   console.log(intro + result);
 }
}
var adder2 = adder(2);
adder2(10);
// => This answer is 12

Trong ví dụ trên, hàm closures là một hàm số không tên function (number). Hàm closures này sử dụng biến cục bộ của outer function là intro và local.

Khi mình gọi hàm adder(2), hàm số này thực hiện và kết quả trả về được gán vào biến adder2. Khi gọi adder2(10), kết quả trả về là 12, chứng tỏ hàm closures vẫn có thể truy cập tới biến cục bộ của outer function khi hàm đó thực hiện xong.

Hàm closures lưu trữ biến số của outer function theo kiểu tham chiếu

Xét ví dụ dưới đây:

function ObjId(){
    var id = 1;
    return {
        getId: function(){
           return id;
        },
        setId: function(_id){
           id = _id;
        }
    }
}

var myObject = ObjId();
console.log(myObject.getId());  // => 1
myObject.setId(10);
console.log(myObject.getId());  // => 10

Hàm objId trả về một đối tượng bao gồm 2 hàm closures là getId và setId. Các hàm closures này sử dụng chung một biến cục bộ là id.

Ban đầu, mình gọi myObject.getId() thì kết quả trả về là 1 (giá trị của biến cục bộ). Sau đó, mình gọi myObject.setId(10). Nếu hàm closures chỉ lưu biến cục bộ theo giá trị thì nghĩa là giá trị của biến cục bộ id sẽ không thay đổi.

Nhưng khi mình gọi tiếp myObject.getId() thì giá trị trả về là 10. Chứng tỏ, hàm closures phải lưu biến cục bộ theo kiểu tham chiếu.

Bây giờ đọc lại ví dụ trên một lần nữa, bạn có thấy nó giống với cách sử dụng class (lớp) trong C++ hay Java không? Mình thì thấy có giống. Thực ra đây là một trong những cách tạo đối tượng (object) trong JavaScript.

So sánh hiệu năng giữa việc sử dụng closures và prototype

Ví dụ trên minh hoạ cách sử dụng closures. Bây giờ mình sẽ viết lại nó theo cách sử dụng prototype:

function ObjId(){
    this.id = 1;
}

ObjId.prototype.getId = function(){
    return this.id;
};

ObjId.prototype.setId = function(_id){
    this.id = _id;
};

var myObject = new ObjId();
console.log(myObject.getId());  // => 1
myObject.setId(10);
console.log(myObject.getId());  // => 10

Kết quả trả về vẫn giống y hệt như trên. Tuy nhiên, cách nào sẽ chạy nhanh hơn? Closures hay Prototype?

Dựa theo kết quả so sánh tại bài viết Performance of prototype vs closure code in JavaScript, mình tóm tắt lại như sau:

  • Định nghĩa đối tượng: JavaScript closures nhanh hơn.
  • Khả năng tiết kiệm bộ nhớ và khởi tạo đối tượng mới: Prototype nhanh hơn.
  • Truy cập hàm (getter, setter): Prototype nhanh hơn.

Một cách khách quan, việc sử dụng prototype sẽ nhanh hơn và tiết kiệm bộ nhớ hơn việc sử dụng closures. Tuy nhiên, mình vẫn không phủ nhận vai trò của closures trong việc giúp bạn viết code ngắn gọn và rõ ràng hơn. Và dù sao, việc sử dụng closures là không bắt buộc. Tất cả tuỳ thuộc vào bạn. Xem thêm JavaScript prototype là gì?

Kết luận

Bài viết trên là khá ngắn gọn. Hy vọng nó phần nào giúp bạn hiểu được JavaScript closures là gì và cách sử dụng closures.

Tham khảo:

  • Closures
  • Understand JavaScript Closures With Ease

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

Xem thêm việc làm JavaScript Developer hot nhất tại TopDev

TopDev via CompleteJavaScript.com

Kinh nghiệm vận hành MySQL – Chú ý khi chọn MySQL làm database

kinh nghiệm vận hành MySQL

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

Đến với lập trình web thì chắc hẳn ai cũng đã từng làm việc với database. Đặc biệt là hệ quản trị cơ sở dữ liệu như MySQL, PostgreSQL…

Với trường hợp nào thì nên dùng MySQL và trường hợp nào không nên? Khi vận hành MySQL cần chú ý những thứ gì? …

Hôm nay mình chia sẻ với mọi người kinh nghiệm vận hành MySQL mà mình đã học được qua nhiều năm.

Scaling khá vất vả

Mặc dù khi release xong chạy rất nhanh nhưng …

Để dễ hiểu thì mình lấy ra 1 ví dụ đã dùng MySQL vào trong hệ thống chat với dữ liệu message cực lớn. (Ví dụ như Facebook Messenger chẳng hạn).

Khi đó bảng để lưu message mình đoán sẽ kiểu như này:

messages (id, room_id, sender_id, message_body, created_at)

Đương nhiên không chỉ có mỗi bảng này mà còn rất nhiều bảng khác nữa. Ví dụ như bảng users để lưu thông tin người dùng. Bảng attachments để quản lý thông tin file được đính kèm khi gửi. Bảng tags để lưu thông tin tag của người dùng…

Ngoài ra không chỉ có tính năng chat, đôi khi cũng cần có cả tính năng phân tích hành vi của người dùng nữa. Nên lúc đó có thể chúng ta sẽ lưu access_log của người dùng vào MySQL. (Hoặc có thể lưu ở 1 số bộ phận storage bên ngoài như S3 chẳng hạn)

1 dãy các luồng xử lí như thế thì quả thực khi release xong, với số lượng người dùng ít thì tốc độ query sẽ rất nhanh. Và ít ai để ý đến vấn đề scaling sau này.

Vậy vấn đề ở đây là gì?

Dữ liệu to dần và không thể cache hết lên memory, dẫn đến phải read từ disk và làm tốc độ giảm xuống

Giai đoạn đầu khi release, lượng dữ liệu sử dụng trên MySQL còn nhỏ, memory cấp phát cho cache có nhỏ đi chăng nữa thì cũng có thể đẩy dữ liệu lên đó được.

Thế nhưng sau 1 thời gian vận hành, lượng dữ liệu tăng khủng khiếp, số lượng access của người dùng cũng tăng lên. Dẫn đến tỉ lệ cache hit trên MySQL sẽ giảm xuống (vì không dủ memory để cache). Kết quả là phải đọc dữ liệu từ disk thay vì từ cache. Và làm cho tốc độ giảm xuống. (Đọc data trên memory nhanh gấp 200 lần HDD, và gấp 10 lần SSD).

Để giải quyết vấn đề này trong thời gian ngắn thì có 2 cách:

  • Tăng memory lên để có thể cache được nhiều dữ liệu trên memory hơn. Cách này được gọi là scale up.
  • Áp dụng cơ chế master slave vào hệ thống. Master sẽ đảm nhiệm việc ghi. Slave sẽ đảm nhiệm việc đọc. Mỗi khi dữ liệu trên master bị thay đổi thì sẽ replication sang các con slave để đồng bộ dữ liệu. Cách này còn được gọi là scale out.

Cho dù thực hiện cách nào đi chăng nữa thì cost vận hành trên MySQL sẽ càng ngày càng tăng lên.
Đến 1 lúc nào đó cost này sẽ tăng đến 1 mức độ mà có khi tiền doanh thu hàng tháng không trả nổi tiền nuôi server.

Với tình trạng như này thì các bạn sẽ suy nghĩ gì?

  • Tốc độ đọc ghi sẽ chậm hơn, làm cho trải nghiệm người dùng bị giảm xuống.
  • Muốn tung ra nhiều campaign để thu hút người dùng. Thế nhưng MySQL bị bottleneck và không thể thực hiện campaign được.
  • Thay đổi sang 1 loại database mới. Thế nhưng do tính chất của nó khác nhau dẫn đến bắt buộc phải sửa logic phía application. Hơn thế nữa việc migration big data từ server này sang server khác có thể mất rất nhiều ngày. (1 ngày application maintain có thể làm doanh thu giảm xuống khá nhiều).

Xem thêm việc làm mysql, việc làm database hấp dẫn trên TopDev

Tính bảo trì, failover khá lớn

Khi MySQL đang được chạy dưới cơ chế master-slave (dữ liệu luôn luôn được đồng bộ từ master sang slave). Chẳng may vì 1 lí do nào đó mà con master bị down. Khi đó MySQL sẽ thực hiện failover (chuyển con master bị down sang 1 con master dự phòng khác). Quá trình này sẽ mất vài phút (với trường hợp RDS của aws).

Với business yêu cầu khắt khe về mặt downtime (ví dụ như game chẳng hạn) thì có lẽ với case mất vài phút để thực hiện failover thì chắc khó có thể chấp nhận được.

Vậy thì ta nên giải quyết vấn đề đó như thế nào?

Chọn database thích hợp hơn?

Để giải quyết được vấn đề này thì có lẽ ta nên chọn loại database khác không phải MySQL. Ví dụ như NoSQL chẳng hạn.

Nhưng khi dữ liệu của hệ thống đã to rồi thì việc chọn 1 database khác không phải là sự lựa chọn đúng đắn lắm vì có thể sẽ phải sửa code khá nhiều, thời gian migration từ database này sang database khác sẽ mất khá nhiều thời gian (có thể mấy ngày đến 1 tuần).

Do đó ngay trong giai đoạn thiết kế thì việc suy nghĩ chọn database nào phù hợp là 1 điều vô cùng quan trọng, đặc biệt cần suy nghĩ xem tương lai dữ liệu sẽ lớn đến mức độ nào.

Với NoSQL thì có vô số loại, ví dụ như Cassandra, DynamoDB.

Cả 2 loại này tính scalable của nó cực lớn, các ông lớn như Facebook, Discord, Instagram hiện tại cũng đang dùng nó.

Mình xin kể 1 số tính năng chính của 2 loại này:

Cassandra:

  • Được phát triển bởi Facebook, sau đó tặng cho bên Apache.
  • Cassandra là hệ cơ sở dữ liệu phân tán, kết hợp những gì tinh tuý nhất của Google Bigtable và Amazon DynamoDB. Ngôn ngữ phát triển Cassandra là Java.
  • Dữ liệu được dàn trải sang nhiều node, nên 1 node có chết đi chăng nữa thì vẫn có thể query lấy được dữ liệu trên node khác. Do đó tính chịu lỗi của nó cực lớn.
  • Throughput của nó tăng theo số lượng node. Nếu muốn nó xử lí được nhiều request hơn thì chỉ cần tăng số node lên.
  • Tốc độ write luôn luôn nhanh hơn read. Bởi vì write chỉ cần append vào đít file. Trong khi read cần phải check tính CAP (có thể hiểu đây là tính toàn vẹn dữ liệu) giữa các node nữa nên thời gian sẽ lâu hơn. Mặc dù nói là lâu nhưng mà thời gian của read hay write cũng chỉ tính bằng ms.

DynamoDB:

  • DynamoDB là hệ cơ sở dữ liệu phân tán, được phát triển bởi Amazon.
  • Có thể setting thông số throughput của read và write riêng. Và Amazon sẽ tự động scale để đáp ứng được số throughput đó.
  • Ví dụ như tại thời điểm peak time thì chúng ta setting cho số throughput của read cao hơn chút, ở thời điểm ít access thì setting throughput thấp xuống. Để tiết kiệm cost.

==> Tóm lại việc chọn database nào đi chăng nữa thì điều quan trọng nhất là nó không làm mất đi tính trải nghiệm của người dùng.

Quay lại bài toán về hệ thống chat như ở bên trên. Nếu số lượng người dùng tăng lên mà để trải nghiệm người dùng không bị mất đi thì chúng ta cần thiết kế hệ thống có tính scalable. Đặc biệt với database thì không nên chọn MySQL, mà nên chọn loại database khác tốt hơn.

Kết luận

Các bạn thấy thế nào? Đã hình dùng được sự khác nhau giữa MySQL và NoSQL chưa?

Dựa vào từng bài toán mà chúng ta nên nghiên cứu và đưa ra quyết định đúng đắn. Để về sau maintain sẽ đơn giản hơn.

Nói thì dễ nhưng quả thực chưa 1 hệ thống to nào trên thế giới mà thiết kế 1 phát chạy được cả đời cả. Hầu như hệ thống nào cũng có cải tiến về mặt hệ thống cả. Ví dụ như Chatwork lúc đầu code bằng PHP sau đó đã chuyển sang Scala để hiệu năng tốt hơn…

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

TopDev via Nghệ Thuật Coding

  Nuxt.js là gì? Một vài lưu ý khi sử dụng Nuxt.js

Javascript Prototype là gì?

javascript-prototype-la-gi

Mở đầu

Prototype là khái niệm cốt lõi cơ bản trong JavaScript khá quan trọng để thực thi OOP trong JavaScript. Vì JavaScript là một prototype-based language, không có khái niệm class như các ngôn ngữ hướng đối tượng khác hướng đối tượng khác. Trong bài viết này, ta sẽ tìm hiểu cách làm việc của prototype có thể hiểu nôm na là kế thừa (inheritance) ở javascript.

Prototype là gì?

Prototype là cơ chế mà các object trong javascript kế thừa các tính năng từ một object khác. Tất cả các object trong javascript đều có một prototype, và các object này kế thừa các thuộc tính (properties) cũng như phương thức (methods) từ prototype của mình.

Bạn cần chú ý rằng bản thân prototype là một object trong JS, được gọi là prototype object (đối tượng prototype). Chúng ta cần biết điều này để tránh nhầm lẫn với thuộc tính prototype của function.

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

Vài điều cần lưu ý:

  1. Trong Javascript, một hàm (function) cũng được coi là 1 object. Và hàm có một thuộc tính gọi là thuộc tính prototype, bản thân thuộc tính prototype này mang giá trị là 1 object.
  2. Nếu ta dùng hàm để tạo ra 1 mẫu khởi tạo đối tượng, thì bạn có thể thêm được các thuộc tính hoặc phương thức vào thuộc tính prototype của hàm khởi tạo để thực hiện kế thừa. Tất cả các đối tượng con tạo ra bởi hàm khởi tạo đều mang các giá trị trong thuộc tính prototype của hàm này.
  3. Các object trong Javascript có một khái niệm gọi là prototype attribute, đặc tính này có giá trị trỏ tới prototype object mà nó kế thừa thuộc tính. Ta dùng thuộc tính __proto__ để truy cập tới prototype object.

Tạo ra Prototype như thế nào?

Ta khai báo một hàm khởi tạo:

//Tạo ra 1 mẫu khởi tạo, cũng là tạo ra 1 prototype object
function Person(_age, _name){
   this.age = _age;
   this.name = _name;
}
 
//Có thể thêm thuộc tính vào thuộc tính prototype của hàm khởi tạo
Person.prototype.height = 0;
 
//Tạo ra 1 instance của Person
//Có cả 3 thuộc tính của mẫu khởi tạo Person
var jack_person = new Person(10, "Jack");
for (var att in jack_person){
   console.log(att);
}
 
//Xem đối tượng prototype của instance vừa tạo
jack_person.__proto__;

prototype là gì

Đoạn ví dụ trên vừa tạo ra một function khởi tạo là hàm Person(_age, _name). Thuộc tính prototype của hàm này lại chứa thuộc tính height. Cho nên một object được tạo ra từ function khởi tạo này ta sẽ có 3 thuộc tính: age, name, và height.

Ta có thể truy cập prototype object của đối tượng vừa tạo (instance vừa tạo) để xem object này là một object chứa 1 hàm khởi tạo và 1 thuộc tính height.

Tại sao prototype lại quan trọng trong Javascript?

Sự kế thừa trong Javascript

Để thực hiện kế thừa trong Js, bạn chỉ cần tạo 1 hàm khởi tạo. Sau đó thêm các thuộc tính và phương thức vào thuộc tính prototype của hàm khởi tạo này.

Các instance tạo ra bởi hàm khởi tạo này sẽ chứa các thuộc tính và phương thức được định nghĩa ở trên. Do Javascript không có khái niệm class nên để thực hiện việc kế thừa để mở rộng ứng dụng như các ngôn ngữ OOP khác, chúng ta cần Prototype.

//Tạo ra 1 hàm khởi tạo cơ sở
function Animal(_age){
   this.age = _age;
}
 
//Có thể thêm thuộc tính vào thuộc tính prototype của hàm khởi tạo
Animal.prototype.showAge = function(){
   console.log( this.age );
};
 
//Tạo ra 1 hàm khởi tạo con (sẽ dùng để kế thừa hàm cơ sở)
function Dog(_color){
   this.color = _color;
}
//Thực hiện kế thừa, gán hàm khởi tạo của Animal cho prototype của Dog
Dog.prototype = new Animal();
Dog.prototype.showColor = function(){
   console.log( this.color );
};
 
//Kiểm tra sự kế thừa
var chophuquoc = new Dog('yellow');
chophuquoc.age = 3;
chophuquoc.showAge();       //3
chophuquoc.showColor();     //yellow

Đoạn code trên thì object chophuquoc sử dụng hàm showAge() thuộc Animal prototype vì ta đã gán hàm khởi tạo của Animal vào prototype của Dog. Như vậy bạn có thể thấy rõ sự kế thừa trong js. Object chophuquoc đã kế thừa những gì đã có trong Dog.prototype và kế thừa luôn những thuộc tính mà Animal.prototype có.

Truy cập vào các thuộc tính của đối tượng: Prototype chain

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

Prototype rất quan trọng trong việc giúp ta truy cập tới các thuộc tính và phương thức của đối tượng. Khi chúng ta truy cập vào một Property của một Object, JavaScript sẽ tìm Property đó bên trong chính Object. Nếu không có nó sẽ tiếp tục tìm lên trên Prototype của Object và cứ tiếp tục như thế cho đến khi gặp Object.prototype thì dừng và cho ra kết quả (undefined nếu không tìm thấy).

Quá trình lặp lại này được gọi là chuỗi prototype (prototype chain) trong Javascript. Chính điều này cộng thuộc tính prototype của function tạo nên cơ chế kế thừa prototype-based cho Javascript.

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

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

Socket là gì? WebSocket là gì? Hiểu hơn về Websocket

socket là gì?

socket là gì? – Socket là một điểm cuối (end-point) của liên kết giao tiếp hai chiều (two-way communication) giữa hai chương trình chạy trên mạng. Nghĩa là một socket được sử dụng để cho phép 1 process nói chuyện với 1 process khác.

Các lớp Socket được sử dụng để tiến hành kết nối giữa client và server. Nó được ràng buộc với một cổng port (thể hiện là một con số cụ thể) để các tầng TCP (TCP Layer) có thể định danh ứng dụng mà dữ liệu sẽ được gửi tới.

Socket sử dụng như thế nào?

Sau khái niệm socket là gì? Thì mình sẽ giới thiệu đến chức năng của socket, nó được áp dụng trong quá trình làm việc, nếu có thể chạy nhiều socket cùng một lúc nên công việc của bạn sẽ nhanh hơn, nâng cao hiệu suất làm việc.

Socket được hỗ trợ trong hầu hết các hệ điều hành như Windows, Linux. Và được sử dụng trong nhiều ngôn ngữ lập trình khác nhau.

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

Socket giúp lập trình viên kết nối các ứng dụng để truyền và nhận dữ liệu trong môi trường có kết nối Internet bằng cách sử dụng phương thức TCPIP và UDP.

Khi cần trao đổi dữ liệu cho nhau thì 2 ứng dụng cần phải biết thông tin IP và port bao nhiêu của ứng dụng kia.

Có rất nhiều dạng socket khác nhau phụ thuộc vào sự khác biệt giữa cách truyền dữ liệu (protocol). Dạng phổ biến nhất là TCP và UDP.

Phân loại Socket

Stream Socket là gì?

Dựa trên giao thức TCP( Tranmission Control Protocol), stream socket thiết lập giao tiếp 2 chiều theo mô hình client và server. Được gọi là socket hướng kết nối.

socket là gì?

Giao thức này đảm bảo dữ liệu được truyền đến nơi nhận một cách đáng tin cậy, đúng tuần tự nhờ vào cơ chế quản lý luồng lưu thông trên mạng và cơ chế chống tắc nghẽn.

Chúng cung cấp luồng dữ liệu không trùng lặp và có cơ chế được thiết lập tốt để tạo và hủy kết nối và phát hiện lỗi. Nếu việc gửi các gói dữ liệu là không thể, người gửi sẽ nhận được một chỉ báo lỗi.

Đặc điểm tóm gọn:

  • Có một đường kết nối (địa chỉ IP) giữa 2 tiến trình.
  • Một trong hai tiến trình kia phải đợi tiến trình này yêu cầu kết nối.
  • Mô hình client /sever thì sever lắng nghe và chấp nhận từ client.
  • Mỗi thông điệp gửi phải có xác nhận trả về.
  • Các gói tin chuyển đi tuần tự.

 Datagram Socket

Dựa trên giao thức UDP( User Datagram Protocol) việc truyền dữ liệu không yêu cầu có sự thiết lập kết nối giữa 2 process. Tức là nó cung cấp connection-less point cho việc gửi và nhận packets. Gọi là socket không hướng kết nối

socket là gì?

Do không yêu cầu thiết lập kết nối, không phải có những cơ chế phức tạp. Nên tốc độ giao thức khá nhanh, thuận tiện cho các ứng dụng truyền dữ liệu nhanh như chat, game online…

Đặc điểm tóm gọn:

  • Hai tiến trình liên lạc với nhau không kết nối trực tiếp
  • Thông điệp gửi đi phải kèm theo thông điệp người nhận
  • Thông điệp có thể gửi nhiều lần
  • Người gửi không chắc chắn thông điệp đến tay người nhận.
  • Thông điệp gửi sau có thể đến trước và ngược lại.
  • Để có thể thực hiện các cuộc giao tiếp, một trong 2 quá trình phải công bố port của socket mà mình đang sử dụng.

Web socket là gì?

Websocket là giao thức hỗ trợ giao tiếp hai chiều giữa client và server để tạo một kết nối trao đổi dữ liệu. Giao thức này không sử dụng HTTP mà thực hiện nó qua TCP. Mặc dù được thiết kế để chuyên sử dụng cho các ứng dụng web, lập trình viên vẫn có thể đưa chúng vào bất kì loại ứng dụng nào.

Ưu điểm

WebSocket cung cấp giao thức giao tiếp hai chiều mạnh mẽ. No có độ trễ thấp và dễ xử lý lỗi. Websocket thường được sử dụng cho những trường hợp yêu cầu real time như chat, hiển thị biểu đồ hay thông tin chứng khoán.

Các gói tin (packets) của Websocket nhẹ hơn HTTP rất nhiều. Nó giúp giảm độ trễ của network nhiều lần.

Cấu trúc WebSocket

socket là gì?

Giao thức chuẩn thông thường của WebSocket là ws:// , giao thức secure là wss:// . Chuẩn giao tiếp là String và hỗ trợ buffered arrays và blobs.

Các thuộc tính của WebSocket

THUỘC TÍNH MÔ TẢ
readyState Diễn tả trạng thái kết nối. Nó có các giá trị sau:

  • Giá trị 0: kết nối vẫn chưa được thiết lập (WebSocket.CONNECTING)
  • Giá trị 1: kết nối đã thiết lập và có thể giao tiếp (WebSocket.OPEN)
  • Giá trị 2: kết nối đang qua handshake đóng (WebSocket.CLOSING)
  • Giá trị 3: kết nối đã được đóng (WebSocket.CLOSED)
bufferedAmount Biểu diễn số byte của UTF-8 mà đã được xếp hàng bởi sử dụng phương thức send()

 

Ví dụ:

switch (socket.readyState) {
  case WebSocket.CONNECTING:
    // do something
    break;
  case WebSocket.OPEN:
    // do something
    break;
  case WebSocket.CLOSING:
    // do something
    break;
  case WebSocket.CLOSED:
    // do something
    break;
  default:
    // this never happens
    break;
}

Các sự kiện WebSocket

SỰ KIỆN EVENT HANDLER MÔ TẢ
open onopen Khi một WebSocket chuyển sang trạng thái mở, “onopen” sẽ được gọi.
message onmessage Khi WebSocket nhận dữ liệu từ Server.
error onerror Có bất kỳ lỗi nào trong giao tiếp.
close onclose Kết nối được đóng. Những sự kiện được truyền cho “onclose” có ba tham số là “code”, “reason”, và “wasClean”.

Event handlers có thể được tạo ra bằng cách sử dụng phương thức addEventListener(). Ví dụ:

onopen

socket.onopen = function(event) {
  // handle open event
};

Sử dụng addEventListener()

socket.addEventListener("open", function(event) {
  // handle open event
});

onmessage

socket.onmessage = function(event) {
  var data = event.data;
  // process data as string, blob, or ArrayBuffer
};

Sử dụng addEventListener()

socket.addEventListener("message", function(event) {
  var data = event.data;
  // process data as string, blob, or ArrayBuffer
});

onerror

socket.onerror = function(event) {
  // handle error event
};

Sử dụng addEventListener()

socket.addEventListener("error", function(event) {
  // handle error event
});

onclose

socket.onclose = function(event) {
  var code = event.code;
  var reason = event.reason;
  var wasClean = event.wasClean;
  // handle close event
};

Thực hiện handler onClose sự kiện sử dụng addEventListener()

socket.addEventListener("close", function(event) {
  var code = event.code;
  var reason = event.reason;
  var wasClean = event.wasClean;
  // handle close event
});

 

Các phương thức của WebSocket

PHƯƠNG THỨC MÔ TẢ
send() send(data) gửi dữ liệu tới server. Message data là string, ArrayBuffer, blob.
close() Đóng kết nối đang tồn tại.

 

Ví dụ:

var data = new ArrayBuffer(1000000);

// perform some operations on the ArrayBuffer
socket.send(data);

if (socket.bufferedAmount === 0) {
  // data sent
}
else {
  // data did not send
}

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

Xem thêm việc làm IT tại TopDev!

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

Bootstrap là gì

Bootstrap là gì?

Bootstrap là gì? – Nó là một framework HTML, CSS, và JavaScript cho phép lập trình viên dễ dàng xây dựng website theo tiêu chuẩn nhất định. Tạo các website thân thiện với nhiều thiết bị khác nhau.

Bạn đang muốn tạo cho mình một website hỗ trợ tất cả các màn hình bao gồm desktop, mobile…một cách nhanh chóng. Đó là lúc bạn nên sử dụng Bootstrap để giảm thiểu thời gian và công sức nhất.

Bootstrap bao gồm những cái cơ bản như: row, column, typography, forms, buttons, tables, navigation, modals, image carousels… Trong bootstrap có thêm nhiều component, Javascript hỗ trợ cho việc xây dựng reponsive cho web dễ dàng, thuận tiện và nhanh chóng hơn.

Bootstrap là gì

Tại sao bạn lại chọn sử dụng Bootstrap?

Sau khái niệm Bootstrap là gì thì bạn sẽ đến vói lí do chúng ta nên dùng Bootstrap, bạn biết chính xác những gì bạn sẽ nhận được.

Đây là một framework mobile-first (được thiết kế ưu tiên từ mobile rồi mới đến các thiết bị khác) tương đối dễ tùy chỉnh.

  10 Frameworks tốt nhất hiện nay cho PHP
  Cách Google tạo ra frameworks cho Web

Bao gồm nhiều design pattern có sẵn, đi kèm với một thư viện components và widgets “khổng lồ”. Và có lẽ quan trọng hơn cả là, với Bootstrap của bạn sẽ dễ dàng thống nhất giao diện trên tất cả các độ phân giải và giao diện màn hình.

Vì thế việc xây dựng dashboard, hay một admin panel cho web app của mình bằng framework này cực kỳ hiệu quả.

Tính năng vượt trội của Bootstrap

Với cấu trúc khá đơn giản và gọn gàng khiến các chức năng của Bootstrap linh hoạt và nhanh chóng hơn. Như đã trình bày ở trên, trong Bootstrap có thể chứa đc các tệp nén của JvScript, CSS và các font.

Bên cạnh đó, Bootstrap có ưu điểm là không kén chọn, nó có thể tích hợp với phần lớn các mã nguồn một cách dễ dàng như Joomla, WP, Magento với nhiều chức năng vượt trội khác nhờ được thiết kế giống các dạng module.

Để tạo thành một website toàn chỉnh từ font đến form, table, grib, typography…thông thường khá phức tạp, nhưng với Bootstrap bạn chỉ cần vào thư viện và lựa chọn tùy ý các giao diện mà bạn thích. Bootstrap cho phép bạn có thể dễ dàng lựa chọn giao diện cũng như framework của web.

Ngoài ra, nếu bạn tích hợp Bootstrap với jQuery, bạn thậm chí có thể sử dụng lại các thành phần trên trang web, để làm được điều đó bạn chỉ cần khai báo các tính nặng trong thời gian bạn tạo web. Để tăng tốc độ tải trang, bạn có thể sử dụng Glyphicons.

Hướng dẫn cài đặt Bootstrap

Để có thể sử dụng Bootstrap, bạn cần tải nó về máy. Đầu tiên, bạn có thể tải Bootstrap từ trang chủ của Bootstrap https://getbootstrap.com/.

Sau đó bạn sẽ nhận được 2 tệp là thư mục JS và CSS, bạn chỉ cần giải nén chúng và cài đặt nó vào web bạn thông qua giao thức FTP. Sau những bước trên là bạn đã có thể sử dụng được Bootstrap một cách đơn giản và dễ dàng.

Nhúng Bootstrap vào Web:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Bootstrap example</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
</head>
<body>
    <h1>Learning Bootstrap</h1>
    <script src="http://code.jquery.com/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
</body>
</html>

Hướng dẫn nhúng Bootstrap từ CDN

Thay vì phải tải và lưu trữ file từ trang chủ Bootstrap, để tiết kiệm băng thông các lập trình viên thường sử dụng Bootstrap thông qua Content Delivery Network – mạng phân phối nội dung (CDN) một cách nhanh chóng và tiện lợi. Với cách này bạn cũng có thể tích hợp JS, CSS, jQuerry như khi tải thông thường.

Nhúng Bootstrap vào Web:

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">

<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<!-- Popper JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>

<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

Hướng dẫn sử dụng Bootstrap là gì?

Bootstrap 4 mobile-first

Để đáp ứng nhu cầu sử dụng của thiết bị di động, Bootstrap 4 đã được cho ra mắt. Tính năng Mobile-first Index là điểm mạnh đặc biệt nhất của Bootstrap 4. Nó giúp hỗ trợ hiển thị đúng và thu phóng khung trang web linh hoạt bằng khung browser, để làm được điều đó bạn cần thêm thẻ <meta> sau vào bên trong phần tử <head>:

<meta name="viewport" content="width=device-width, initial-scale=1">

Định nghĩa Device-width dùng cho thiết lập chiều rộng của trang theo chiều rộng màn hình của thiết bị hay browser.

Định nghĩa Initial-scale có thể hiểu là 1 phần đặt mức thu phóng ban đầu khi trang được trình duyệt tải ban đầu.

Bootstrap 4 containers

Khi tạo Web, các lập trình viên nên bọc tất cả nội dung trong web bằng thẻ container (class container hoặc container-fluid). Có thể hiểu là:

  • Container-fluid class sẽ cung cấp một container có chiều rộng đầy đủ, trải rộng toàn bộ chiều rộng của khung nhìn (full width container)
  • Còn Container class thì cung cấp một container với chiều rộng tương thích (responsive fixed width container)

Bootstrap 4 Grid System

Nó rất quan trọng và đóng vai trò chủ đạo cho khả năng tương thích giao diện (web responsive) của Bootstrap.

Khi các lập trình viên khởi động Bootstrap, giao diện của Bootstrap 4 Grid System sẽ hiển thị dưới dạng grid – lưới.

Bootstrap sẽ được chia thành 12 cột đặt trong một class row. Khi đó, bắt buộc mỗi cột sẽ bao gồm các Padding tương ứng với từng độ phân giải của mỗi thiết bị (điện thoại, tablet, máy tính).

tuyển it

Cấu trúc Bootstrap 4 Grid System:

<!-- Control the column width, and how they should appear on different devices -->
<div class="row">
  <div class="col-*-*"></div>
  <div class="col-*-*"></div>
</div>
<div class="row">
  <div class="col-*-*"></div>
  <div class="col-*-*"></div>
  <div class="col-*-*"></div>
</div>

<!-- Or let Bootstrap automatically handle the layout -->
<div class="row">
  <div class="col"></div>
  <div class="col"></div>
  <div class="col"></div>
</div>
  1. Tạo dòng: <div class=”row”>
  2. Thêm số lượng cột theo nhu cầu (tags phù hợp cho lớp .col-*-* ). Với (*) đầu tiên bạn xem lại các lớp của Grid System để đảm bảo sự chính xác (sm, md, lg hay xl). Dấu (*) thứ 2 đại diện cho số khung bạn muốn chia từ 1 – 12.
  3. Thay vì thêm số cho từng col, bootstrap có thể giúp bạn chia nhanh chóng hơn. Ví dụ muốn chia 2 “col” bạn có thể thêm thuộc tính width = 50%. Tương tự với 3 “col” bạn sẽ có width = 33.33%. Để làm điều này bạn cần có hiểu biết về CSS.
  4. Dùng .col-sm|md|lg|xl để dễ tương thích hơn.

5 lớp tiêu biểu trong Bootstrap 4 Grid System

  1. .col- (extra small devices – chiều rộng màn hình < 576px)
  2. .col-sm- (small devices – chiều rộng màn hình >= 576px)
  3. .col-md- (medium devices – chiều rộng màn hình >= 768px)
  4. .col-lg- (large devices – chiều rộng màn hình >= 992px)
  5. .col-xl- (xlarge devices – chiều rộng màn hình >= 1200px

20 mẫu Templates Bootstrap cho Admin Dashboard

Trong quá khứ, admin dashboard của một trang web chỉ chứa các tính năng là chính. Còn về phần giao diện không được cân nhắc nhiều vì vậy trông nó khô khan và không thân thiện lắm đối với user.

May mắn thay, mọi sự đã thay đổi, ngày nay có rất nhiều opensource đi cùng những tính năng vượt trội cùng với thiết kế đẹp mắt, hài hòa.

Cùng với độ phổ biến ngày một tăng của framework Boostrap, việc tạo nên một admin panel đẹp mắt và đa tính năng cho admin chưa bao giờ dễ dàng đến vậy.

Tất cả các giao diện admin và dashboard Boostrap miễn phí dưới đây đã được xây dựng lại để sử dụng như một giải pháp hoàn thiện giúp bạn nhanh chóng tạo nên một dashboard front-end cho web app của mình.

Cũng như những bộ sưu tập widgets của Bootstrap, chúng đều bao gồm nhiều các addon, plugin và feature khác (plugins cho biểu đồ & bảng biểu, lịch trình, quản lý file, và nhiều hơn thế nữa). Tất cả những thứ bạn cần để xây dựng dashboard.

Và bên cạnh những tính feature tuyệt vời, các giao diện này cũng rất đẹp mắt. Tất cả đều ở dưới đây:

CoreUI Bootstrap 4 Admin Template miễn phí tại coreui.io

topdev

 

Light Bootstrap Dashboard miễn phí tại creative-tim.com

topdev

 

Material Dashboard – Bootstrap Material Design dành cho Admin miễn phí tại creative-tim.com

topdev

 

Laravel Admin Bootstrap Template miễn phí tại coreui.io

topdev

 

Material Design dành cho Bootstrap 4 miễn phí tại mdbootstrap.com

tuyển dụng it

 

Bộ Flat UI dành cho BootFlat Admin Dashboard Open-Source miễn phí tại themesseo.com

tuyển dụng it

 

Startmin Admin Dashboard Template miễn phí tại themesseo.comtuyển dụng it

 

  Framework là gì? Tìm hiểu về các Framework
  Framework có đang giết chết sự sáng tạo trong thiết kế Web?

Paper Dashboard Bootstrap Admin Template miễn phí tại creative-tim.com

tuyển dụng it

Blocks – A Single-Page Widgetised Admin Template miễn phí tại prepbootstrap.com

tuyển dụng it

 

AdminLTE – A Clean Admin Theme miễn phí tại adminlte.io

tuyển dụng it

 

Gentelella Bootstrap Admin Template miễn phí tại graygrids.com

Bootstrap là gì

 

Responsive Dashboard (AngularJS & Bootstrap) miễn phí tại github.com/invertase/rdash-angular

Bootstrap là gì

 

Metis – Template Bootstrap Admin miễn phí tại colorlib.com

Bootstrap là gì

 

SB Admin v.2 – A Minimal Bootstrap Dashboard Theme miễn phí tại startbootstrap.com

Bootstrap là gì

 

TemplateVamp – Bootstrap Admin Theme miễn phí tại www.egrappler.com

Bootstrap là gì

 

Clean Bootstrap Dashboard Theme miễn phí tại startbootstrap.com

Bootstrap là gì

 

Charisma Responsive Admin Template miễn phí tại usman.it

Bootstrap là gì

 

HTML5 Admin Template miễn phí tại themeforest.net

Bootstrap là gì

 

Hierapolis – A Bold Bootstrap Admin Template miễn phí tại github.com/lab2023/hierapolis

Bootstrap là gì

Bootstrap Admin Theme miễn phí tại github.com/invertase/rdash-angular

Bootstrap là gì

 

Tổng kết Bootstrap là gì?

Có thể hiểu Bootstrap là một framework khá đơn giản, dễ sử dụng là cực kì tối ưu và chắc hẳn Bootstrap sẽ được nhiều lập trình viên ứng dụng nhiều trong tương lai vì tính tiện lợi.

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

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

Dữ liệu lớn (Big Data) là gì? Đặc điểm và ứng dụng của Big Data

big data là gì

Có data, và sau đó có big data. Vậy, sự khác biệt là gì? Big data – Dữ liệu lớn ra đời mang đến nhiều ứng dụng trong các lĩnh vực như công nghệ, y tế, giáo dục,… Hãy cùng TopDev tìm hiểu khái niệm Dữ liệu lớn là gì? Đặc điểm và vai trò của big data trong thời đại số hiện nay.

Big Data là gì?

Big Data (Dữ liệu lớn) là thuật ngữ dùng để mô tả một lượng dữ liệu khổng lồ và phức tạp đến mức các công cụ quản lý dữ liệu truyền thống không có khả năng thu thập, quản lý và xử lý dữ liệu trong một khoảng thời gian hợp lý.

Big Data không chỉ đề cập đến kích thước của dữ liệu mà còn bao gồm tốc độ, sự đa dạng và tính xác thực của dữ liệu.

Việc làm Data Analytics lương cao cho bạn

Những tập dữ liệu lớn này có thể bao gồm các dữ liệu có cấu trúc, không có cấu trúc và bán cấu trúc, mỗi tập có thể được khai thác để tìm hiểu insights.

Bao nhiêu dữ liệu để đủ gọi là “big” vẫn còn được tranh luận, nhưng nó có thể là các bội số của petabyte – và các dự án lớn nhất với phạm vi exabytes.

Dữ liệu tạo thành các kho dữ liệu lớn có thể đến từ các nguồn bao gồm các trang web, mạng xã hội, ứng dụng dành cho máy tính để bàn và ứng dụng trên thiết bị di động, các thí nghiệm khoa học, và các thiết bị cảm biến ngày càng tăng và các thiết bị khác trong internet (IoT).

7 đặc điểm và tính chất quan trọng của Big Data

Big Data không chỉ đơn thuần là dữ liệu lớn mà còn bao gồm nhiều đặc điểm và tính chất quan trọng giúp hiểu rõ hơn về cách quản lý, phân tích và khai thác dữ liệu. Dưới đây là 7V đặc điểm và tính chất quan trọng của Big Data

7 đặc điểm và tính chất quan trọng của Dữ liệu lớn - Big Data
7 đặc điểm và tính chất quan trọng của Big Data

1. Volume (Khối lượng)

Khối lượng dữ liệu trong Big Data rất lớn, thường là hàng terabyte (TB), petabyte (PB) hoặc thậm chí exabyte (EB). Khối lượng dữ liệu khổng lồ này đến từ nhiều nguồn khác nhau như mạng xã hội, cảm biến, giao dịch thương mại điện tử và các thiết bị IoT. Việc xử lý và lưu trữ lượng dữ liệu lớn đòi hỏi các công nghệ và cơ sở hạ tầng đặc biệt.

2. Velocity (Tốc độ)

Tốc độ xử lý và truyền tải dữ liệu là một yếu tố quan trọng của Big Data. Dữ liệu được tạo ra và truyền tải với tốc độ rất nhanh từ các nguồn trực tuyến, mạng xã hội, cảm biến và hệ thống giao dịch. Khả năng xử lý dữ liệu theo thời gian thực hoặc gần thời gian thực là một yêu cầu quan trọng để khai thác giá trị từ Big Data.

3. Variety (Đa dạng)

Dữ liệu trong Big Data đến từ nhiều nguồn khác nhau và ở nhiều định dạng khác nhau, bao gồm dữ liệu có cấu trúc (structured), dữ liệu bán cấu trúc (semi-structured) và dữ liệu phi cấu trúc (unstructured). Các dạng dữ liệu bao gồm văn bản, hình ảnh, video, âm thanh, log files, và nhiều loại dữ liệu khác. Sự đa dạng này đòi hỏi các kỹ thuật và công cụ đặc biệt để phân tích và xử lý.

4. Veracity (Tính xác thực)

Tính xác thực của dữ liệu đề cập đến chất lượng và độ tin cậy của dữ liệu. Dữ liệu từ nhiều nguồn khác nhau có thể không nhất quán hoặc không chính xác. Việc đảm bảo tính xác thực của dữ liệu là quan trọng để có được kết quả phân tích đáng tin cậy. Các kỹ thuật làm sạch và xác thực dữ liệu được sử dụng để cải thiện chất lượng dữ liệu.

5. Value (Giá trị)

Giá trị là mục tiêu cuối cùng của việc khai thác Big Data. Dữ liệu lớn có thể mang lại những hiểu biết và thông tin giá trị giúp các tổ chức và doanh nghiệp đưa ra các quyết định chiến lược, tối ưu hóa hoạt động và tạo ra lợi thế cạnh tranh. Việc khai thác giá trị từ Big Data đòi hỏi các công cụ và kỹ thuật phân tích mạnh mẽ.

6. Variability (Biến động)

Biến động đề cập đến sự không nhất quán của dữ liệu. Lưu lượng dữ liệu có thể thay đổi đáng kể theo thời gian, làm cho việc quản lý và phân tích dữ liệu trở nên phức tạp hơn. Việc xử lý các khối lượng dữ liệu biến động đòi hỏi các hệ thống linh hoạt và có khả năng mở rộng.

7. Visualization (Trực quan hóa)

Trực quan hóa dữ liệu là khả năng trình bày dữ liệu một cách trực quan và dễ hiểu. Việc sử dụng các công cụ trực quan hóa giúp biến dữ liệu phức tạp thành các biểu đồ, đồ thị và báo cáo dễ hiểu, hỗ trợ quá trình ra quyết định. Trực quan hóa dữ liệu là một phần quan trọng của Big Data, giúp các nhà phân tích và người ra quyết định hiểu rõ hơn về dữ liệu và các kết quả phân tích.

Các ứng dụng đang sử dụng Big data

Big data và phân tích có thể được áp dụng trong nhiều vấn đề kinh doanh và nhiều trường hợp sử dụng khác nhau. Dữ liệu lớn (Big Data) trên thực tế đang được ứng dụng vào rất nhiều lĩnh vực của nền kinh tế, tạo những chuyển biến ấn tượng, giúp tăng hiệu quả và năng suất của doanh nghiệp.

1. Ngành Ngân hàng

Các ứng dụng đang sử dụng Big data
Các ứng dụng đang sử dụng Big data

Trong hệ thống ngân hàng, Big Data đã và đang được ứng dụng hiệu quả thể hiện vai trò quan trọng của mình trong mọi hoạt động của ngân hàng: từ thu tiền mặt đến quản lý tài chính.

Ngân hàng ứng dụng Big Data như thế nào:

  • Sử dụng các kỹ thuật phân cụm giúp đưa ra quyết định quan trọng. Hệ thống phân tích có thể xác định các địa điểm chi nhánh nơi tập trung nhiều nhu cầu của khách hàng tiềm năng, để đề xuất lập chi nhánh mới.
  • Kết hợp nhiều quy tắc được áp dụng trong các lĩnh vực ngân hàng để dự đoán lượng tiền mặt cần thiết sẵn sàng cung ứng ở một chi nhánh tại thời điểm cụ thể hàng năm.
  • Khoa học dữ liệu hiện đang là nền tảng của hệ thống ngân hàng kĩ thuật số.
  • Machine learning và AI đang được nhiều ngân hàng sử dụng để phát hiện các hoạt động gian lận và báo cáo cho các chuyên viên liên quan.
  • Khoa học dữ liệu hỗ trợ xử lý, lưu trữ và phân tích lượng dữ liệu khổng lồ từ các hoạt động hàng ngày và giúp đảm bảo an ninh cho ngân hàng.

Các ngân hàng nổi bật: tuyển dụng ACB, VP Bank tuyển dụng, MSB tuyển dụng

2. Ngành y tế

Khoa học dữ liệu đang dần khẳng định vai trò khá quan trọng trong việc cải thiện sức khỏe con người ngày nay. Big Data không chỉ được ứng dụng để xác định phương hướng điều trị mà giúp cải thiện quá trình chăm sóc sức khỏe.

Big Data từ lúc được ứng dụng vào lĩnh vực chăm sóc sức khỏe, đã tạo nên nhiều tác động lớn trong việc giảm lãng phí tiền bạc và thời gian. Ở một số quốc gia, chính phủ đã tài trợ các dự án ứng dụng Big Data để phát triển cơ sở hạ tầng mới và các dịch vụ y tế khẩn cấp.

Ngành y tế ứng dụng Big Data:

  • Cho phép người quản lý ca dự đoán các bác sĩ cần thiết vào những thời điểm cụ thể
  • Theo dõi tình trạng bệnh nhân bằng để theo dõi hồ sơ sức khỏe điện tử.
  • Sử dụng các thiết bị kỹ thuật số có thể đeo, hệ thống Big Data có thể theo dõi bệnh nhân và gửi báo cáo cho các bác sĩ liên quan.
  • Big Data có thể đánh giá các triệu chứng và xác định nhiều bệnh ở giai đoạn đầu.
  • Có thể lưu giữ các hồ sơ nhạy cảm được bảo mật và lưu trữ lượng dữ liệu khổng lồ một cách hiệu quả.
  • Các ứng dụng Big Data cũng có thể báo trước khu vực có nguy cơ bùng phát dịch như: sốt xuất huyết hoặc sốt rét.

3. Thương mại điện tử

Các ứng dụng đang sử dụng Big data - Ngành thương mại điện tử
Các ứng dụng đang sử dụng Big data – Ngành thương mại điện tử

Thương mại điện tử không chỉ tận hưởng những lợi ích của việc điều hành trực tuyến mà còn phải đối mặt với nhiều thách thức để đạt được các mục tiêu kinh doanh. Lý do là bởi các doanh nghiệp dù là nhỏ hay lớn, khi đã tham gia vào thị trường này đều cần đầu tư mạnh để cải tiến công nghệ. Big Data có thể tạo lợi thế cạnh tranh cho doanh nghiệp bằng cách cung cấp thông tin chuyên sâu và các bản báo cáo phân tích xu hướng tiêu dùng.

Thương mại điện tử ứng dụng Big Data:

  • Có thể thu thập dữ liệu và yêu cầu của khách hàng ngay cả trước khi khách thực sự bắt đầu giao dịch.
  • Tạo ra một mô hình tiếp thị hiệu suất cao.
  • Nhà quản lý trang thương mại điện tử có thể xác định các sản phẩm được xem nhiều nhất và tối ưu thời gian hiển thị của các trang sản phẩm này.
  • Đánh giá hành vi của khách hàng và đề xuất các sản phẩm tương tự. Điều này làm tăng khả năng bán hàng, từ đó tạo ra doanh thu cao hơn.
  • Nếu bất kỳ sản phẩm nào được thêm vào giỏ hàng nhưng cuối cùng không được khách hàng mua, Big Data có thể tự động gửi code khuyến mại cho khách hàng cụ thể đó.
  • Các ứng dụng Big Data còn có thể tạo một báo cáo tùy chỉnh theo các tiêu chí: độ tuổi, giới tính, địa điểm của khách truy cập, v.v.
  • Xác định các yêu cầu của khách hàng, những gì họ muốn và tập trung vào việc cung cấp dịch vụ tốt nhất để thực hiện nhu cầu của họ.
  • Phân tích hành vi, sự quan tâm của khách hàng và theo xu hướng của họ để tạo ra các sản phẩm hướng đến khách hàng.
  • Cung cấp các sản phẩm tốt hơn với chi phí thấp hơn.
  • Có thể thu thập nhiều dữ liệu về hành vi khách hàng để thiết kế mô hình tiếp thị tối ưu dành được tùy biến theo đối tượng hoặc nhóm đối tượng, tăng khả năng bán hàng.
  • Tìm ra sự tương đồng giữa khách hàng và nhu cầu của họ. Từ đó, việc nhắm mục tiêu các chiến dịch quảng cáo có thể được tiến hành dễ dàng hơn dựa trên những phân tích đã có trước đó.

Công ty thương mại điện từ nổi bật: fpt shop tuyển dụng it, juno tuyển dụng,….

4. Ngành bán lẻ

Big Data mang lại cơ hội cho lĩnh vực bán lẻ bằng cách phân tích thị trường cạnh tranh và sự quan tâm của khách hàng. Nó giúp xác định hành trình trải nghiệm, xu hướng mua sắm và sự hài lòng của khách hàng bằng cách thu thập dữ liệu đa dạng. Từ những dữ liệu thu thập được có thể cải thiện hiệu suất và hiệu quả bán hàng.

Ngành bán lẻ ứng dụng Big Data:

  • Big data giúp nhà quản lý xây dựng mô hình chi tiêu của từng khách hàng.
  • Với sự trợ giúp của các phân tích dự đoán, ngành công nghiệp có thể so sánh tỷ lệ cung – cầu và có thể tránh tiếp tục tung ra thị trường các sản phẩm không được hầu hết khách hàng đón nhận.
  • Ngành bán lẻ có thể xác định vị trí bố trí sản phẩm trên kệ hàng tùy thuộc vào thói quen mua hàng và nhu cầu của khách hàng và đưa ra các chiến lược kinh doanh mới để cải thiện.
  • Kết hợp phân tích cùng lúc các dữ liệu về thời điểm, dữ liệu giao dịch, dữ liệu truyền thông xã hội, dự báo thời tiết để xác định chính xác nhất sản phẩm phù hợp để luôn sẵn sàng cung ứng cho khách hàng.

5. Digital Marketing

Các ứng dụng đang sử dụng Big data - Digital Marketing
Các ứng dụng đang sử dụng Big data – Digital Marketing

Digital Marketing là chìa khóa để cánh cửa thành công cho bất kỳ doanh nghiệp nào. Giờ đây, không chỉ các công ty lớn có thể điều hành các hoạt động quảng cáo tiếp thị mà cả các doanh nhân nhỏ cũng có thể chạy các chiến dịch quảng cáo thành công trên các nền tảng truyền thông xã hội và quảng bá sản phẩm của họ. Big Data đã tiếp sức cho Digital Marketing phát triển thực sự mạnh mẽ, và nó đã trở thành một phần không thể thiếu của bất kỳ doanh nghiệp nào.

Digital Marketing ứng dụng Big Data:

  • Phân tích thị trường, đối thủ cạnh tranh và đánh giá mục tiêu kinh doanh. Điều này giúp cho doanh nghiệp xác định rõ hơn, đâu là cơ hội tốt để tiếp tục tiến hành các kế hoạch kinh doanh tiếp theo.
  • Có thể xác định người dùng trên các phương tiện truyền thông xã hội và nhắm mục tiêu cho họ dựa trên nhân khẩu học, giới tính, thu nhập, tuổi tác và sở thích.
  • Tạo báo cáo sau mỗi chiến dịch quảng cáo bao gồm hiệu suất, sự tham gia của khán giả và những gì có thể được thực hiện để tạo kết quả tốt hơn.
  • Khoa học dữ liệu được sử dụng cho các khách hàng nhắm mục tiêu và nuôi dưỡng chu trình khách hàng.
  • Tập trung vào các chủ đề được tìm kiếm cao và tư vấn cho các chủ doanh nghiệp thực hiện chúng trên chiến lược nội dung để xếp hạng trang web doanh nghiệp trên cao hơn trên google (SEO).
  • Có thể tạo đối tượng tương tự bằng cách sử dụng cơ sở dữ liệu đối tượng hiện có để nhắm mục tiêu các khách hàng tương tự và kiếm được lợi nhuận.

Còn rất nhiều ngành đang áp dụng rất mạnh mẽ Bigdata như nông nghiệp, giáo dục…cho phép chúng ta có insight ngày càng tốt để ra quyết định nhanh chóng và chính xác.

6. Ngăn chặn nội dung đen

Ví dụ cụ thể như là Extension (Chrome, Firefox, Safari…) Có nhiều addon phục vụ cho việc content filtering miễn phí sử dụng Bigdata để thu thập và dự đoán xem nội dung đó có phù hợp không. Ví dụ chức năng Ad Block nhanh chóng block các banner, pop ups, video ads gây phiền nhiễu một lần và mãi mãi. Sau đó nó lập tức thu thập và gửi về server blacklist những yếu tố này. Data càng nhiều thì tỷ lệ nhận diện và block ngày càng chính xác.

  Big data là gì? Trò chuyện cùng CTO của Datamart Solutions để hiểu hơn về data

  26 công cụ và kỹ thuật trong Big Data có thể bạn chưa biết

Big data và analytics

Điều thực sự mang lại giá trị từ các tổ chức dữ liệu lớn là phân tích dữ liệu. Nếu không có phân tích, nó chỉ là một tập dữ liệu với việc sử dụng hạn chế trong kinh doanh.

Bằng cách phân tích dữ liệu lớn, các công ty có thể có những lợi ích như tăng doanh thu, dịch vụ khách hàng được cải thiện, hiệu quả cao hơn và tăng khả năng cạnh tranh.

Phân tích dữ liệu liên quan đến việc kiểm tra bộ dữ liệu để thu thập thông tin chi tiết hoặc rút ra kết luận về những gì chúng chứa, chẳng hạn như các xu hướng và dự đoán về hoạt động trong tương lai.

Bằng cách phân tích dữ liệu, các tổ chức có thể đưa ra các quyết định kinh doanh tốt hơn như khi nào và ở đâu nên chạy chiến dịch tiếp thị hoặc giới thiệu một sản phẩm hoặc dịch vụ mới.

  Tổng hợp Cheat Sheets cho AI, Neural Networks, Machine Learning, Deep Learning và Big Data

Sự phân tích có thể tham khảo các ứng dụng kinh doanh thông minh hay tiên tiến hơn. Phép phân tích dự đoán như ứng dụng được các tổ chức khoa học sử dụng.

Loại phân tích dữ liệu cao cấp nhất là data mining, nơi các nhà phân tích đánh giá các bộ dữ liệu lớn để xác định mối quan hệ, mô hình và xu hướng.

Phân tích dữ liệu có thể bao gồm phân tích dữ liệu thăm dò ( để xác định các mẫu và mối quan hệ trong dữ liệu) và phân tích dữ liệu xác nhận ( áp dụng các kĩ thuật thống kê để tìm ra giả thiết về một bộ dữ liệu có đúng hay không).

Một mảng khác là phân tích dữ liệu định lượng ( hoặc phân tích dữ liệu số có các biến có thể so sánh theo thống kê) so với phân tích dữ liệu định tính ( tập trung vào các dữ liệu không phải là dữ liệu cá nhân như video, hình ảnh và văn bản).

Cơ sở hạ tầng IT để hỗ trợ big data

Đối với khái niệm big data để làm việc, các tổ chức cần phải có cơ sở hạ tầng để thu thập và chứa dữ liệu, cung cấp quyền truy cập và đảm bảo thông tin trong khi lưu trữ và chuyển tiếp.

Ở cấp độ cao, bao gồm hệ thống lưu trữ và máy chủ được thiết kế cho big data, phần mềm quản lý và tích hợp dữ liệu, thông tin kinh doanh và phần mềm phân tích dữ liệu, và các ứng dụng big data.

Phần lớn các cơ sở hạ tầng này sẽ tập trung một chỗ, vì các công ty muốn tiếp tục tận dụng các khoản đầu tư vào trung tâm dữ liệu của mình. Nhưng ngày càng có nhiều tổ chức dựa vào các dịch vụ điện toán đám mây để xử lý nhiều yêu cầu big data của họ.

  Lương IT nghìn USD nếu thành thạo Cloud, Big Data, AI

Thu thập dữ liệu đòi hỏi phải có nguồn. Rất nhiều trong số những ứng dụng sau đây, như các ứng dụng web, các kênh truyền thông xã hội, ứng dụng di động và lưu trữ email đã được cài sẵn.

Nhưng khi IoT trở nên phổ biến hơn, các công ty có thể cần phải triển khai cảm biến trên tất cả các loại thiết bị, phương tiện và sản phẩm để thu thập dữ liệu, cũng như các ứng dụng mới tạo ra dữ liệu người dùng. Phân tích dữ liệu theo định hướng IoT có các kỹ thuật và công cụ chuyên biệt của nó.

Để lưu trữ tất cả các dữ liệu đến, các tổ chức cần phải có đủ dung lượng lưu trữ tại chỗ. Các tùy chọn lưu trữ bao gồm kho dữ liệu truyền thống, data lakes và lưu trữ trên đám mây.

Các công cụ cơ sở hạ tầng bảo mật có thể bao gồm việc mã hóa dữ liệu, xác thực người dùng và các điều khiển truy cập khác, hệ thống giám sát, tường lửa, quản lý di động của doanh nghiệp và các sản phẩm khác để bảo vệ hệ thống và dữ liệu.

big data

Nhưng với khối lượng dữ liệu khủng, 1 team Big Data cũng đặc biệt cần đến một phần mềm quản lý dự án và công việc để hỗ trợ trong quá trình cộng tác và thúc đẩy hiệu suất làm việc. Toàn bộ thông tin và quy trình của team được số hoá và tích hợp tại 1 không gian, hỗ trợ giao – nhận việc, giao tiếp và chia sẻ tài liệu nhanh chóng. 

Theo đó, một phần mềm quản lý dự án và công việc với gói dùng miễn phí như Cleeksy là lựa chọn lý tưởng cho các team Big Data đang tìm kiếm một giải pháp quản lý công việc linh hoạt và tiết kiệm chi phí. Phiên bản Free không giới hạn thời gian.

Các công nghệ đặc biệt dành cho Big data

Ngoài cơ sở hạ tầng IT được sử dụng cho dữ liệu nói chung, có một số công nghệ cụ thể dành cho big data mà cơ sở hạ tầng IT của bạn nên hỗ trợ.

Hệ sinh thái Hadoop

Hadoop là một trong những công nghệ liên quan chặt chẽ nhất với big data. Dự án Apache Hadoop phát triển phần mềm mã nguồn mở cho máy tính có khả năng mở rộng và phân tán.

Thư viện phần mềm Hadoop là một khuôn mẫu cho phép xử lý phân tán các bộ dữ liệu lớn trên các nhóm máy tính sử dụng các mô hình lập trình đơn giản. Nó được thiết kế để mở rộng từ một máy chủ duy nhất sang hàng ngàn máy khác, mỗi máy cung cấp tính toán và lưu trữ cục bộ.

Dự án bao gồm rất nhiều phần:

  • Hadoop Common, các tiện ích phổ biến hỗ trợ các phần Hadoop khác
  • Hadoop Distributed File System, cung cấp khả năng truy cập dữ liệu ứng dụng cao
  • Hadoop YARN, một khuôn mẫu cho kế hoạch làm việc và quản lý tài nguyên cụm
  • Hadoop MapReduce, một hệ thống dựa trên YARN để xử lý song song bộ dữ liệu lớn.

Apache Spark

Một phần của hệ sinh thái Hadoop, Apache Spark là một khuôn mẫu tính toán cụm nguồn mở được sử dụng làm công cụ xử lý big data trong Hadoop.

Spark đã trở thành một trong những khuôn mẫu xử lý big data quan trọng, và có thể được triển khai theo nhiều cách khác nhau. Nó cung cấp các phương thức hỗ trợ đối với Java, Scala, Python (đặc biệt là Anaconda Python distro ), và ngôn ngữ lập trình R (R đặc biệt phù hợp với big data) và hỗ trợ SQL, streaming data, machine learningxử lý đồ thị.

Data lakes

Data lakes là các kho lưu trữ chứa khối lượng dữ liệu thô rất lớn ở định dạng gốc của nó cho đến khi những người dùng doanh nghiệp cần dữ liệu.

Các yếu tố giúp tăng trưởng data lakes là những phong trào kỹ thuật số và sự phát triển của IoT. Các data lakes được thiết kế để giúp người dùng dễ dàng truy cập vào một lượng lớn dữ liệu khi có nhu cầu.

NoSQL Databases

Các cơ sở dữ liệu SQL thông thường được thiết kế cho các transaction đáng tin cậy và các truy vấn ngẫu nhiên.

Nhưng chúng có những hạn chế như giản đồ cứng nhắc làm cho chúng không phù hợp với một số loại ứng dụng. Cơ sở dữ liệu NoSQL nêu ra những hạn chế, và lưu trữ và quản lý dữ liệu theo những cách cho phép tốc độ hoạt động cao và sự linh hoạt tuyệt vời.

Nhiều cơ sở dữ liệu đã được phát triển bởi các công ty để tìm cách tốt hơn để lưu trữ nội dung hoặc xử lý dữ liệu cho các trang web lớn. Không giống như các cơ sở dữ liệu SQL, nhiều cơ sở dữ liệu NoSQL có thể được mở rộng theo chiều ngang trên hàng trăm hoặc hàng ngàn máy chủ.

In-memory databases

Cơ sở dữ liệu trong bộ nhớ (IMDB) là một hệ thống quản lý cơ sở dữ liệu chủ yếu dựa vào bộ nhớ chính (Ram), thay vì HDD, để lưu trữ dữ liệu. Cơ sở dữ liệu trong bộ nhớ nhanh hơn các cơ sở dữ liệu được tối ưu hóa trong đĩa, một điểm quan trọng để sử dụng phân tích big data và tạo ra các kho dữ liệu và các siêu dữ liệu. Đọc thêm Redis là gì?

Các kĩ năng Big data

Big data và các nỗ lực phân tích big data yêu cầu kĩ năng cụ thể, dù là từ bên trong tổ chức hay thông qua các chuyên gia bên ngoài.

Nhiều kĩ năng có liên quan đến các thành phần công nghệ dữ liệu quan trọng như Hadoop, Spark, NoSQL, cơ sở dữ liệu trong bộ nhớ và phần mềm phân tích.

Các lĩnh vực khác cụ thể là về các nguyên tắc như khoa học dữ liệu, khai thác dữ liệu, phân tích thống kê và định lượng, hình dung dữ liệu, lập trình mục đích chung, và cấu trúc dữ liệu và các thuật toán. Ngoài ra cũng cần có những người có kĩ năng quản lý tổng thể để quản lý tiến độ của các dự án big data.

Với độ phổ biến của các dự án phân tích dữ liệu và sự thiếu hụt nhân lực về các kĩ năng trên, việc tìm kiếm các chuyên gia có kinh nghiệm có thể là một trong những thách thức lớn nhất đối với các tổ chức.

So sánh giữa Data và Big Data

Đặc điểm Data Big Data
Khái niệm Tập hợp các thông tin, dữ liệu có thể ở dạng số, văn bản, hình ảnh, âm thanh, video, v.v. Tập hợp dữ liệu khổng lồ và phức tạp, không thể xử lý hiệu quả bằng các công cụ truyền thống.
Khối lượng Vừa phải, dễ quản lý và xử lý Rất lớn, thường là terabyte (TB) hoặc petabyte (PB)
Tốc độ Tạo ra và xử lý với tốc độ chậm hoặc trung bình Tạo ra và cập nhật với tốc độ rất cao, yêu cầu xử lý gần thời gian thực hoặc thời gian thực
Đa dạng Có thể có cấu trúc hoặc không cấu trúc, thường không quá phức tạp Đến từ nhiều nguồn khác nhau, ở nhiều định dạng như văn bản, hình ảnh, video, dữ liệu cảm biến, log files
Tính xác thực Độ tin cậy và tính xác thực cao, dễ dàng xác minh và quản lý Có thể không nhất quán, không đầy đủ hoặc không chính xác, đòi hỏi các phương pháp làm sạch và xác thực phức tạp hơn
Công cụ xử lý Excel, SQL databases (MySQL, PostgreSQL), các phần mềm phân tích đơn giản Apache Hadoop, Apache Spark, NoSQL databases (MongoDB, Cassandra), Apache Kafka
Công nghệ lưu trữ Hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) Hệ thống lưu trữ phân tán như Hadoop Distributed File System (HDFS), Amazon S3, Google Cloud Storage
Ứng dụng Quản lý kinh doanh, quản lý khách hàng, phân tích đơn giản Phân tích nâng cao, ứng dụng thời gian thực, AI và Machine Learning
Ví dụ ứng dụng Dữ liệu doanh thu, chi phí, tồn kho; dữ liệu khách hàng, giao dịch, phản hồi; báo cáo tài chính, thống kê cơ bản Phân tích hành vi khách hàng, dự đoán xu hướng thị trường, tối ưu hóa quảng cáo; giám sát hệ thống, phân tích dữ liệu cảm biến; huấn luyện mô hình AI, phát triển hệ thống học máy

 

Trên đây là một số thông tin cung cấp những khái niệm cơ bản cũng như đặc điểm và tính ứng dụng cao của Big data – Dữ liệu lớn. Big Data đã mở ra nhiều cơ hội mới trong các lĩnh vực phân tích nâng cao, AI và Machine Learning, mang lại giá trị lớn cho doanh nghiệp và xã hội. Theo dõi TopDev để cập nhật liên tục về xu hướng công nghệ mới nhất hiện nay!

Có thể bạn muốn xem những kiến thức xoay quanh Big Data:

Tại sao nguồn nhân lực lập trình ở Việt Nam lại đứng đầu Đông Nam Á

lập trình ở Việt Nam

Nói về cuộc cách mạng 4.0 và lập trình ở Việt Nam, nhiều người cho rằng Việt Nam có lợi thế về nguồn nhân lực công nghệ cao trong khu vực. Điều này có thể là vì Việt Nam có nền giáo dục thiên về các môn học tự nhiên như toán học và khoa học trong nhiều năm qua.

Đây chính là nền tảng giúp các lập trình viên, nhà phát triển, có thể nhanh chóng bắt kịp với các xu hướng công nghệ mới.

  Tình hình tuyển dụng IT Việt Nam 2019: Nhu cầu nhân sự CNTT cao nhất trong lịch sử!
  Thị trường EdTech Vietnam- Nhiều tiềm năng nhưng còn bị bỏ ngỏ tại Việt Nam

Học sinh lớp 11 tại Việt Nam có thể vượt qua quá trình phỏng vấn nổi tiếng của Google mà không gặp vấn đề gì

“Không còn nghi ngờ gì khi một nửa số học sinh lớp 11 đó có thể vượt qua quá trình phỏng vấn của Google”, Neil Neil Fraser – kỹ sư phần mềm tại Goolge, đã viết trên blog của mình.

Để hiểu được câu nói đó, chúng ta cần tìm hiểu một chút. Gần đây, trong một chuyến đi đến Việt Nam, Fraser đã đi vào một số phòng học từ lớp 2 đến lớp 11 để hiểu rõ hơn về chương trình giảng dạy khoa học máy tính của nước ta.

Những gì anh khám phá ra, không cần phải nói, vừa gây sốc vừa ấn tượng mạnh với anh ấy.

Đến lớp 3, mọi đứa trẻ đều được học cách sử dụng Windows. Fraser đề xuất một cách nghiêm túc: “Việt Nam nên có một hệ thống Windows XP và Windows 7 độc quyền 100%” vì chi phí phần mềm khá cao đối với hầu hết các gia đình.

Nhưng điều đó cũng không gây khó khăn cho học sinh trong việc học đánh máy bằng tiếng Anh thông qua sử dụng Microsoft Word.

Đến lớp 4, học sinh được học code bằng Logo, một ngôn ngữ lập trình máy tính đa mô hình thường được dùng trong hệ thống giáo dục. Đến lớp 5, các em đã có thể viết các phương thức chứa vòng lặp.

lập trình ở Việt Nam

Trẻ em tại Việt Nam đam mê lập trình

Điều đó tuy đơn giản nhưng thật sự rất đáng kinh ngạc, vượt xa các quốc gia phương Tây, kể cả Hoa Kỳ về kỹ năng và chương trình giảng dạy. Fraser rất muốn xem những đứa trẻ này có thể phát triển nhanh như thế nào, và anh ta cần làm gì để hỗ trợ chúng nhiều hơn.

Và đó cũng là lý do để anh thiết kế ra một phần mềm tùy chỉnh có tên là Blockly Maze, và một series hướng dẫn tự học. Ông cũng thuê thêm một giáo viên nữa, để toàn trường có thể học về khoa học máy tính.

Chuyển nhanh đến lớp 11, các em được giao một bài tập: “Đưa một tệp dữ liệu mô tả về một mê cung có các tường chéo nhau”, và đề yêu cầu “đếm số lượng các khu vực kèm theo đó là đo kích thước của khu vực lớn nhất”.

Sau này Fraser có quay trở lại Mỹ và hỏi một senior engineer tại Google, để xem anh ta so sánh thế nào giữa câu hỏi này với quy trình phỏng vấn cực kỳ khó khăn của Google. “Mặc dù không biết nguồn gốc của câu hỏi từ đâu ra, nhưng ông đánh giá rằng nó sẽ nằm trong top 3.”, Fraser nói.

Quay trở lại với lớp học hôm đó, bài tập này không phải chỉ dành cho top 5% học sinh giỏi của lớp. Hầu hết học sinh đều làm xong trong vòng 45 phút và một vài em thì cần thêm 5 phút nữa để hoàn thành nó.

Vậy câu nói ban đầu của Fraser: “Không còn nghi ngờ gì về việc nửa số học sinh lớp 11 ở Việt Nam có thể vượt qua quá trình phỏng vấn của Google”. Câu nói này cũng chỉ là một sự suy đoán. Không có cách nào để biết liệu câu hỏi trong bài tập đó có bao giờ xuất hiện trong bài kiểm tra của Google hay không, hay liệu các em học sinh có thực sự vượt qua các phần khác của bài kiểm tra hay không.

Đây cũng chỉ là kết quả tương đối của một lớp, biết đâu các học sinh ấy có thể có trình độ và kỹ năng thấp hơn hoặc cao hơn học sinh trung bình ở Việt Nam.

Nhưng cũng chẳng sao cả. Điều quan trọng là nó vừa có chút đáng sợ nhưng cũng đầy cảm hứng và vô cùng ấn tượng, để biết rằng hệ thống giáo dục Việt Nam đang sản sinh ra những lập trình viên đẳng cấp thế giới với rất ít tài nguyên.

Một ví dụ khác là vào năm 2017, PwC đã phát biểu về ngành công nghiệp gia công đầy triển vọng tại Việt Nam: “Không có gì ngạc nhiên khi Việt Nam đang dần được nhiều nước trên thế giới lựa chọn, vì các quốc gia đã “quen mặt” như Trung Quốc và Ấn Độ có chi phí vượt trội, cao hơn mặt bằng chung”. Nhìn chung, Hà Nội và Thành phố Hồ Chí Minh là 2 khu vực gia công phần mềm lớn, PwC dành nhiều lời khen ngợi cho Việt Nam.

Các báo cáo cũng chỉ ra rằng những gã khổng lồ công nghệ như Samsung, Microsoft, LG, Intel cũng đang đầu tư mạnh vào Việt Nam. Cùng với đó, một thế mạnh của người Việt Nam là bản chất không ngừng học hỏi để cải thiện bản thân. Đất nước này đã và đang thay đổi, nhờ vào một thế hệ trẻ tuổi làm việc chăm chỉ và tận tụy.

Lập trình viên Việt Nam làm việc 6 ngày 1 tuần, trong khi ở phương Tây thời gian làm việc mỗi tuần chỉ là 5 ngày. Ở thế hệ nhân sự trước đây tại Việt Nam, làm việc 12 giờ một ngày và 6-7 ngày mỗi tuần vẫn rất là bình thường.

Nhìn chung, mặc dù việc phát triển gia công phần mềm ở Việt Nam vẫn còn ở giai đoạn sơ khai, nhưng tất cả những dấu hiệu trên đều hướng đến tương lai tươi sáng.

Lên đến đỉnh trong ngành gia công, cạnh tranh với Trung Quốc và Ấn Độ

Tất cả các câu trả lời sau đây sẽ dần giải đáp cho bạn rằng: Học sinh Việt Nam “cày” rất nhiều môn toán và khoa học từ nhỏ, đó là lý do tại sao các lập trình viên Việt Nam được đánh giá cao trong khu vực Đông Nam Á.

Say Keng Lee, một người Singapore, nói rằng các sinh viên ở các nước Đông Nam Á rất “nể” sinh viên Việt Nam về môn toán học và khoa học. Tôi tới Việt Nam từ năm 2010. Là một giáo viên tiếng Anh, tôi thường xuyên tiếp xúc với nhiều học sinh cấp 3 Việt Nam, bao gồm cả hai đứa con nuôi của tôi hiện cũng đang học đại học.

Nói về Toán học và Vật lý, tôi tin chắc rằng các môn này ở đây cũng được dạy tốt như Singapore, nếu không muốn nói là tốt hơn. Bằng chứng là học sinh trung học ở Việt Nam thường đạt được kết quả rất cao trong các kỳ thi Olympic Toán học và Vật lý quốc tế.

“Hệ thống giáo dục ở Việt Nam tập trung vào toán học và khoa học. Việt Nam thực sự giành được nhiều vị trí trong bảng xếp hạng PISA và trong một số cuộc thi Olympic quốc tế.” – Khanh Luu, một nhà báo Việt Nam , cho biết.

Tất nhiên, thực tế là trên bản đồ công nghệ thế giới, Việt Nam vẫn là ‘ngôi sao tiềm năng’ chứ không phải “siêu cường quốc”, vì vậy những bình luận ‘có cánh’ của ông Pontus B hay Google Neil Fraser chỉ nên nghe để biết mà thôi.

Tại Việt Nam, ngành công nghiệp BPO đã phát triển đáng kể. Theo số liệu của Hiệp hội dịch vụ CNTT và phần mềm Việt Nam (VINASA), gia công phần mềm CNTT đã tăng 20%-​​35% hàng năm trong thập kỷ qua, với doanh thu ngành công nghiệp năm ngoái đạt 2,2 tỷ USD.

“Việt Nam thực sự là một trong những lựa chọn cạnh tranh nhất trên thế giới về gia công phần mềm”, theo Gartner. Lợi thế lớn của đất nước này là chi phí lao động ở Việt Nam chỉ bằng một nửa so với Ấn Độ.

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

Xem thêm việc làm Software Developers hot nhất trên TopDev

Người viết: Kevin Nguyen

TopDev via Medium

  Vietnam Mobile Day lần thứ 9 - Kỳ lân công nghệ sẽ xuất hiện tại Việt Nam trong một năm nữa
  Market Place Platform tại Việt Nam 2019 - Cuộc cách mạng nền tảng

Ethereum là gì? Tìm hiểu cơ bản về Blockchain (P2)

ethereum là gì

Bài trước chúng ta đã nói khá nhiều về lập trình Ethereum trong blockchain là gì và cách dùng Truffle cũng như command line Ganache. Bài này chúng ta sẽ dùng environment này để nói về 2 concept khác của Solidity: Interface và các Function Modifier.

  Ethereum là gì? Tìm hiểu cơ bản về Blockchain (P1)

Cài đặt sẵn sàng

Sau khi bạn đã cài Truffle và ganache-cli, tạo một folder mới và chạy truffle init. Chúng ta sẽ tạo 2 contract trong folder truffle mới tạo.

  • Answers.sol
pragma solidity ^0.4.18;

contract Answers {
    uint answerUniverse;

    function setAnswerUniverse(uint _answer) external {
        answerUniverse = _answer;
    }

    function getAnswerUniverse() public view returns (uint){
        return answerUniverse;
    }
}
  • Questions.sol
pragma solidity ^0.4.18;

contract AnswersInterface {
    function getAnswerUniverse() public view returns (uint);
}

contract Questions {
    AnswersInterface answersContract;

    function setAnswersContractAddress(address _address) external{
        answersContract = AnswersInterface(_address);
    }

    function whatIsTheAnswerUniverse() public view returns (uint){
        uint answer = answersContract.getAnswerUniverse();
        return answer;
    }

}

Contract Answers.sol rất đơn giản. Một variable answerUniverse có cả getter và setter. Lưu ý rằng, bởi vì nó quan trọng rằng setter là nhân tố ngoài, nghĩa là nó phải được call từ ngoài contract, còn getter thì public nghĩa là ai call nó cũng được.

Contract Questions.sol gồm 2 thứ: contract Questions, và interface AnswersInterface.

Vậy, interface là gì? Một interface cho phép chúng ta nói về một contract khác trên blockchain. Như bạn có thể thấy, để xác định một interface, bạn phải bắt đầu từ một contract bình thường, với keyword contract.

>>> Xem thêm Interface và Abstract là gì?

Trong contract này, bạn chỉ xác định các function bạn muốn tương tác không cần phần thân. Các function này cần là public hoặc từ bên ngoài để có thể call chúng từ ngoài contract gốc. Bạn không thể tương tác với các function riêng hoặc nội bộ course được.

Bên trong contract Questions, chúng ta sẽ tạo một interface mẫu trong answersContract. Function setAnswersContractAddress sẽ cho contract biết chỗ tìm được contract Answer gốc. Function whatIsTheAnswerUniverse thu về variable answerUniverse trong contract Answers.

Note: Dĩ nhiên chúng ta cần phải set địa chỉ contract trước khi lấy variable. Nếu không chúng ta sẽ chả biết nó ở đâu trên blockchain!

  • Tiếp đến, trong file truffle-config.js:
module.exports = {
    networks: {
            development: {
                    host: '127.0.0.1',
                    port: 7545,
                    network_id: '*'
            }
    }
};

Với người dùng Windows, bạn sẽ phải remove file truffle.js để tránh mâu thuẫn. Với hệ khác, bạn có thể giữ lại cả hau và bỏ vào code trong truffle.js, hoặc lằm giống như user Windows chẳng sao cả.

  • Trong folder migrations, tạo 2 file: 2_deploy_questions.js và 3_deploy_answers.js.
  • 2_deploy_questions.js
var Questions = artifacts.require("Questions")

module.exports = function(deployer) {
    deployer.deploy(Questions)
};
var Questions = artifacts.require("Questions")

module.exports = function(deployer) {
    deployer.deploy(Questions)
};
  • 3_deploy_answers.js
var Answers = artifacts.require("./Answers.sol")

module.exports = function(deployer) {
  deployer.deploy(Answers)
}

Triển khai

Mở một cửa sổ terminal mới và chạy ganache-cli -p 7545. Quay lại folder của project và chạy:

  • truffle compile
  • truffle migrate --network development
  • truffle console --network development

Bây giờ chúng ta có thể chơi với các contract và interface của nó. Đầu tiên, tạo một instance cho mỗi contract.

truffle(development)> Questions.deployed().then(inst => Questions = inst)
truffle(development)> Answers.deployed().then(inst => Answers = inst)

Sau khi launch Answers instance, bạn sẽ thấy vài thứ mới xuất hiện trong console. Sẽ có cả field address. Đây là address của contract Answers. Đây có thể là những gì ta cần để call setAnswersContractAddress function:

truffle(development)> Questions.setAnswersContractAddress('0x2e91a07090cfbbc0839e0d76d8110e2518bae18c')

Note: Hãy thế address bằng bất cứ address nào bạn thấy trong field.

Hãy xem answersUniverse variable trong Answers contract:

truffle(development)> Answers.setAnswerUniverse(76)

Và lấy nó từ contract Questions:

truffle(development)> Questions.whatIsTheAnswerUniverse().then(answer => answer.toNumber())
76

Hãy chỉnh lại answer và retrieve lần nữa:

truffle(development)> Answers.setAnswerUniverse(42)
truffle(development)> Questions.whatIsTheAnswerUniverse().then(answer => answer.toNumber())
42

Và bạn đã có một interface rồi.

Các function modifier

Có thể dễ thấy một vấn đề về bảo mật trong project của chúng ta: function setAnswersContractAddress là yếu tố từ bên ngoài, nghĩa là bất kì ai từ ngoài contract cũng gọi nó được, cũng có nghĩa là ai cũng có thể call function và đổi address được cả. Để giải quyết được việc này, chúng ta phải add một function modifier, sẽ được call khi function được thực hiện.

Căn bản là, nó sẽ chạy một vài đợt check để đảm bảo rằng mọi thứ vẫn ổn. Trong trường hợp này, chúng ta phải đảm bảo rằng chỉ có người sở hữu mới gọi được function. Để vậy chúng ta sẽ dùng contract từ thư viện OpenZeppelin Solidity gọi là OwnableCopy và dán nó vào.

Đừng hoảng lên nếu bạn không hiểu gì trong contract. Chỉ cần biết rằng nó sẽ đảm bảo cho function chỉ có thể kích hoạt được bởi chủ.

  • Tạo một file Ownable.sol trong các contract
/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }


  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }
}
  • Import contract Ownable vào Questions và xác định function modifier cho setAnswersContractAddress:
pragma solidity ^0.4.18;

import "./Ownable.sol";

contract AnswersInterface {
    function getAnswerUniverse() public view returns (uint);
}

contract Questions is Ownable{
    AnswersInterface answersContract;

    function setAnswersContractAddress(address _address) external onlyOwner{
        answersContract = AnswersInterface(_address);
    }

    function whatIsTheAnswerUniverse() public view returns (uint){
        uint answer = answersContract.getAnswerUniverse();
        return answer;
    }

}

Relaunch command ganache-cli, và các command truffle. Deploy các contract Answers và Questions. Mặc định chủ contract sẽ là account đầu tiên được tạo bởi  ganache-cli. Sau đó lấy một account khác:

truffle(development)> account = web3.eth.accounts[3]

Bây giờ, nếu chúng ta set interface address từ account này, bạn sẽ bị lỗi:

truffle(development)> Questions.setAnswersContractAddress('0x37eba1bb7d4c779474a4955437e524fbdbac0dc2', {from: account})
Error: VM Exception while processing transaction: revert

Nếu bạn remove cái object argument, hoặc dùng accounts[0] address trong key, bạn vẫn có thể set address ổn thoả.

Kết luận

Hy vọng qua 2 bài viết này các bạn có thể hiểu hơn về Ethereum trong Blockchain là gì.

Cảm ơn các bạn đã theo dõi bài viết!

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

Xem thêm việc làm blockchain hot nhất trên TopDev

Mẹo tối ưu code ứng dụng React lập trình viên phải biết

tối ưu code ứng dụng React

React hiện nay đang rất phổ biến trong cộng đồng lập trình viên. Các ứng dụng React có quy mô lớn thường rất thú vị khi làm việc. Chính vì thế mà việc tối ưu code ứng dụng React rất cần thiết cho các bạn đang theo React.

Việc tối ưu từ 2500ms thời gian chờ xuống 1500ms có thể tác động rất lớn đến UX và thời gian biên dịch ứng dụng của bạn.

Dưới đây sẽ là một số mẹo nhỏ giúp tối ưu code ứng dụng React.

React.memo

Nếu bạn có một stateless component và bạn biết rằng sẽ không cần re-render, gộp toàn bộ stateless component bên trong một React.memo function.

Ví dụ như:

import React from 'react';

const profile = ({username}) => {
  return (
    <div className="wrapper">
        <p>{username}</p>
    </div>
  )
}

Sẽ thay thế như sau:

import React, { memo } from 'react';

const profile = memo(({username}) => {
  return (
    <div className="wrapper">
        <span>{username}</span>
    </div>
  )
})

profile.displayName = 'profile'

Khi chúng ta gộp toàn bộ stateless component bên trong React.memo nên lưu ý thêm profile.displayName để có thể debug function này.

React.memo tương đương với class React.PureComponent.

React.PureComponent

PureComponent so sánh các props và state trong vòng đời của phương thức shouldComponentUpdate. Điều này có nghĩa là nó sẽ không re-render nếu states và props giống nhau. Tức là để tái cấu trúc lại stateless component trước đó đựa trên class-based component.

Xem thêm vòng đời của React Component là gì?

Ví dụ như sau:

import React, { Component } from 'react'

export default class profile extends Component {
  render() {
    return (
      <div className="wrapper">
        <span>{username}</span>
      </div>
    )
  }
}

Nếu chúng ta biết rằng các props và states sẽ không thay đổi, thay thế việc sử dụng Component. Chúng ta sẽ dụng PureComponent

import React, { PureComponent } from 'react'

export default class profile extends PureComponent {
  render() {
    return (
      <div className="wrapper">
        <span>{username}</span>
      </div>
    )
  }
}

profile.displayName = 'profile'

ComponentDidCatch(error, info) {} Lifecycle Method

Các component có thể gây ảnh hưởng làm phá vỡ cấu trúc ứng dụng sản phẩm của bạn nếu bạn có hơn 1000 components. Nó có thể khó theo dõi mọi thứ.

class MyComponent extends Component {

  state = { hasError: false };
  
  componentDidCatch(error, info) {
    this.setState({ hasError: true });
  }

  render() {
    const { hasError } = this.state
    
    if (hasError) {
      return <h1>Something went wrong.</h1>;
    }
    
    return <div>All good!</div>
  }
}

Có rất nhiều biến động của các thành phần trong một ứng dụng web hiện đại, nó đã gặp khó khăn trong việc gói gộp toàn bộ trong toàn khái niệm và xử lý lỗi. Nhưng thật may mắn, React đã giới thiệu một phương pháp vòng đời mới để xử lý lỗi.

Phương thức componentDidCatch() hoạt động giống như việc bắt {} block, nhưng đối với các components. Duy nhất chỉ class components có thể là hạn chế lỗi.

Xem thêm Component là gì?

React.lazy: Code-Splitting with Suspense

Khi bạn build cho những components để trì hoãn việc rendering trong khi tải dữ liệu đồng bộ được gọi là Suspense. Bạn có thể dừng bất cứ trạng thái cập nhật nào cho đến khi dữ liệu sẵn sàng và bạn có thể nạp vào async loading vào bất cứ component nào trong hệ sinh thái không có cần kết nối các props và state qua ứng dụng của bạn.

Trường hợp mạng nhanh, việc thực hiện cập nhật sẽ rất trôi chảy và ngay lập tức mà không thể thấy được các thay đổi của việc hiển thị và ẩn đi các biểu tưởng quay tròng (loading). Nhưng trường hợp mạng chậm, bạn có thể thiết kế trạng thái chờ tải để người dùng có thể nhìn thấy mức độ cơ bản của chúng thay vì hiển thị các biểu tượng loading trên cách viết code thông thường.

Ví dụ như:

import React, {lazy, Suspense} from 'react';

const ArticleComponent = lazy(() => import('./ArticleItemsComponent'));

const ArticleComponent = () => (
  <Suspense fallback={<div>Loading...</div>}>
    <ArticleItemsComponent />
  </Suspense>
)
 
export default ArticleComponent;

React.Fragments to Avoid Additional HTML Element Wrappers

Nếu bạn đã từng sử dụng React, có thể bạn sẽ gặp lỗi sau:

Parse Error: Adjacent JSX elements must be wrapped in an enclosing tag.

render() {
 <div></div>
 <div></div>
}

Lỗi phân tích cú pháp: Các phần tử JSX liền nhau phải được bọc trong một thẻ kèm theo sẽ làm phá vỡ cấu trúc ứng dụng React của bạn và đây là nguyên nhân gây ra lỗi cú pháp. Các components trong React chỉ có thể là một thành phần con bởi vì nó được thiết kế như vậy (thật stupid) nhưng

Các giải quyết vấn đề này là gộp tất cả trong một element như sau:

render() {
  <div>
    <div></div>
    <div></div>
  </div>
}

Nhưng khi gộp các div thành một div duy nhất chúng ta sẽ phải xét lại việc render có thể làm chậm ứng dụng của mình. Vậy nên chúng ta có thể mở rộng bằng cách sử dụng Fragment để giải quyết vấn đề này.

Fragments to the rescue:

import React, { Fragment } from 'react'
...
render() {
  <Fragment>
    <div></div>
    <div></div>
  </Fragment>
}

Hoặc sử dụng cú pháp rút gọn cho các Fragment:

import React from 'react'
...
render() {
  <>
    <div></div>
    <div></div>
  </>
}

Bài viết này tôi đã đã chia sẻ một số các mẹo nhỏ để tối ưu code ứng dụng React của bạn. Hy vọng các bạn thích bài viết này.

Cảm ơn các bạn đã theo dõi bài viết!

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

Xem thêm việc làm Software Developers hấp dẫn trên TopDev

TopDev via viblo.asia

Ethereum là gì? Tìm hiểu cơ bản về Blockchain (P1)

Ethereum là gì

Kì trước, tôi đã có bài viết Solidity cơ bản. Nó được thiết kế để dùng cho Ethereum Virtual machine (EVM). Trong bài này, chúng ta sẽ đi sâu hơn tìm hiểu Ethereum là gì và dùng test environment cho contract của mình. Từ đó chúng ta sẽ hiểu được cách thức Ethereum hoạt động như thế nào.

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

Ethereum là gì?

Ethereum (ETH) là một loại cryptocurrency được xây dựng vào năm 2013 bởi Vitalik Buterin, thường được gọi là Bitcoin 2.0. Đây không chỉ là một đồng tiền tệ mà nó còn là nền tảng tạo ra nhiều ứng dụng khác thông qua ngôn ngữ lập trình của mình.

Nó hoạt động trên một Blockchain tương tự như Bitcoin, chúng ta có thể khai thác ETH thông qua đơn vị tiền tệ Ether.

Ethereum còn là một nền tảng ứng dụng hữu ích và đã tạo ra được một hệ sinh thái tài chính phân tán cho riêng mình.

Lí do Ethereum ra đời là dựa trên ý tưởng Vitalik Buterin muốn khắc phục những nhược điểm của Bitcoin như phí thanh toán, thời gian thanh toán chậm và khuyến khích khai thác thông qua các mining-pool thay vì khai thác riêng lẻ như Bitcoin.

>>> Xem thêm Blockchain là gì?

Các tool

Trong bài này, chúng ta sử dụng truffle và ganache-cli. Truffle là một framework của lập trình Ethereum, cho phép tạo test environment, viết test cho contract và nhiều thứ khác nữa. Bài viết này chúng ta chỉ dùng nó để tạo test environment.

ganache-cli sẽ được dùng kết hợp với truffle để tạo ra một test environment đầy đủ tính năng. Phần chúng ta chuẩn bị làm sẽ không thật sự giống với blockchain trên thực tế, nhưng sẽ phần nào hình dung được cách thức hoạt động của nó.

Install các tool

  • truffle: [sudo] npm install -g truffle
  • ganache-cli: [sudo] npm install -g ganache-cli

Chuẩn bị

Đầu tiên, chúng ta cần mở một truffle project. Để làm được, tạo một directory mới, và trong nó, hãy run truffle init.

Bây giờ bạn sẽ có khá nhiều folder. Mở truffle-config.js và dán đoạn này vào:

module.exports = {
  // See <http://truffleframework.com/docs/advanced/configuration>
    // to customize your Truffle configuration!
    networks: {
        development: {
            host: '127.0.0.1',
            port: 7545,
            network_id: '*'
        }
    }
}

Đối với người Windows, bạn có thể remove file truffle.js để tránh conflict. Đối với những hệ điều hành khác, bạn có thể giữ lại cả hai, và bỏ đoạn code này vào truffle.js, hoặc cứ làm như người dùng Windows không sao cả.

File này thể hiện rằng development network của chúng ta sẽ chạy trên localhost:7545.

Tiếp theo, trong folder contracts, tạo một file DeveloperFactory.solĐây cũng là chỗ chúng ta sẽ viết contract của mình. Hãy bỏ đoạn code này vào:

pragma solidity ^0.4.18;

contract DeveloperFactory {
    // Let's create a Developer!

    event NewDeveloper(uint devId, string name, uint age);

    uint maxAge = 100;
    uint minAge = 5; 

    struct Developer {
        string name;
        uint id;
        uint age;
    }

    Developer[] public developers;

    mapping (uint => address) public devToOwner;
    mapping (address => uint) public ownerDevCount;

    function _createDeveloper( string _name, uint _id, uint _age ) private{
        uint id = developers.push( Developer( _name, _id, _age ) ) - 1;
        ownerDevCount[msg.sender]++;
        devToOwner[id] = msg.sender;
        NewDeveloper(id, _name, _age);
    }

    function _generateRandomId( string _str ) private pure returns (uint){
        uint rand = uint(keccak256(_str));
        return rand;
    }

    function createRandomDeveloper( string _name, uint _age ) public payable {
        require(_age > minAge);
        require(_age < maxAge);
    require(msg.value == 5000000000000000000);
        uint randId = _generateRandomId( _name );
        _createDeveloper(_name, randId, _age );
    }

    function getAllDevelopers() public view returns (uint) {
    return developers.length;
    }
}

Nếu bạn muốn biết chi tiết chuyện gì đang xảy ra hãy xem bài viết về Solidity của tôi. Nói ngắn gọn thì, contract này được call để tạo một Developer struct có name và tag. Trong ví dụ này, để tạo một Developer mới cần 5 ether (5000000000000000000 wei, hạng thấp nhất trên Ethereum).

Tiếp theo, vào folder migrations và tạo ra một file 2_deploy_contracts.js:

const DeveloperFactory = artifacts.require('./DeveloperFactory.sol')

module.exports = function(deployer){
    deployer.deploy(DeveloperFactory)
}

Trong file này, ta sẽ import contract và deploy nó trên blockchain.

Launch test environment

Mở một cửa sổ terminal mới và chạy ganache-cli -p 7545. Nó sẽ chạy ganache-cli trên  port 7545 (tương tự như cái chúng ta xác định trên file truffle-config.js) và tạo một vài accounts. Mỗi account có 100 ether mặc định.

Bạn sẽ thấy trong console một cái giống thế này:

Available Accounts
==================
(0) 0x473c0be352f997aa0b194786c27d26e29a3f75b1
(1) 0x9657290da5570b17a03198f490b0a2d7eea84ecf
(2) 0x516c0e0152d7b85facb7e3da2d30f67e42a80ca9
(3) 0xf81be8bbe99d2302b85f7cb0f60103c435ae703b
(4) 0xcfacf5ac5567cfdd70ee5a8a9fe4bf7f74d80b02
(5) 0x623e18e34b2de07933fe179862f038230cc69012
(6) 0xd7100dbc1d6f72777ae2a6f5d95c4b8d71f7ce07
(7) 0x7f40df6c6042888a37124821130910e77051b1cf
(8) 0x26a2c2be1f31571f289b7fb60e41f31f7c57a5be
(9) 0x08a945825a28166466987d5fc77b016fe3d80aa5

Dĩ nhiên, các address của account sẽ khác nhau, nhưng bạn sẽ có khoảng 10 giây để tìm hiểu.

Bây giờ, hãy quay lại cửa sổ terminal ban đầu. Hãy đảm bảo rằng bạn đã ở trong folder bạn tạo và chạy: truffle compile, và chạy truffle migrate --network development. Nó compile code chúng ta thành một ngôn ngữ mà Ethereum Virtual Machine (EVM) có thể hiểu được, ở đây ganache sẽ mô phỏng EVM.

Nếu mọi thứ suôn sẻ thì terminal của bạn sẽ trông như sau:

truffle migrate --network development
Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0xc83617394674cd65f751ff9c05438e16339414ccf1e1662ba66479d79335af13
  Migrations: 0xe982e78028e0dfcbdb135e7a3c1e1ed3d98e36e5
Saving successful migration to network...
  ... 0x78bdff98e4dac310de4650048a0856075a460bed9de0c4d4ea879ea399d142c4
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying DeveloperFactory...
  ... 0x0a314c5ed99c772019ea358ac98e002a1442e26903122528d705bf3ff7ed02ed
  DeveloperFactory: 0xc34cc3e53850673db1dea31d267ea1738edc629f
Saving successful migration to network...
  ... 0x95a3cd861f067cdbe8c96f13477526eacd2a7936662f31724e1354922af49664
Saving artifacts...

Chú ý ganache-cli output mà contract đã tạo ra:

Transaction: 0xc83617394674cd65f751ff9c05438e16339414ccf1e1662ba66479d79335af13
  Contract created: 0xe982e78028e0dfcbdb135e7a3c1e1ed3d98e36e5
  Gas usage: 269607
  Block Number: 1
  Block Time: Thu May 03 2018 21:04:55 GMT+0200 (CEST)

Console

Hãy chạy truffle console --network development ngay trên terminal window mà bạn đã chạy các truffle command. Nó sẽ launch truffle console và cho phép bạn tương tác với blockchain của mình.

Chúng ta sẽ dùng Web3 Javascript API cho dễ. Đầu tiên, hãy dùng một account và bỏ nó vào 1 variable:

account = web3.eth.accounts[4]

Rồi chạy command sau:

DeveloperFactory.deployed().then(inst => {Factory = inst})

Nó sẽ assign contract vào Factory variable. Nhớ rằng account có 100 ether:

truffle(development)> web3.fromWei(web3.eth.getBalance(account).toNumber())
'100'
truffle(development)>

Method getBalance sẽ trả về kiểu BigNumbertoNumber() sẽ đưa balance về cho account trong Wei. Sau đó ta sẽ covert nó về ether bằng fromWei().

  • Tạo một Developer

Hãy gọi function này là createRandomDeveloper. Như bạn thấy, function này cần 2 parameter, một string _name và một uint _age. Vì chúng ta cần đến 5 ether để call function này, ta phải làm rõ nó trong function call:

truffle(development)> Factory.createRandomDeveloper('Damien', 26, {from: account, value: web3.toWei(5, "ether")})

Factory là một contract instance. Chúng ta đưa vào 3 parameters vào function. Damien là _name, 26 là _age. Cái thứ ba là một object có key from để biết được account nào đang call nó, và một key value để xác định value được gửi bởi account đó.

Ở đây, from value là account, variable chúng ta đã tạo trước đó. Chúng ta sẽ covert 5 ether Wei để tương thích với value cần trong contract.

Terminal của bạn sẽ hiện như sau:

{ tx: '0xa3792da93311fdf60054f8a30e7624dd385ccf36cc639881eeb25308ddad5e0e',
  receipt:
   { transactionHash: '0xa3792da93311fdf60054f8a30e7624dd385ccf36cc639881eeb25308ddad5e0e',
     transactionIndex: 0,
     blockHash: '0x3ef1c41cbc79d65c1282a86da3a68120a5c069709a6a5bd3e206ed85d9c270c5',
     blockNumber: 5,
     gasUsed: 148160,
     cumulativeGasUsed: 148160,
     contractAddress: null,
     logs: [ [Object] ],
     status: '0x01',
     logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000' },
  logs:
   [ { logIndex: 0,
       transactionIndex: 0,
       transactionHash: '0xa3792da93311fdf60054f8a30e7624dd385ccf36cc639881eeb25308ddad5e0e',
       blockHash: '0x3ef1c41cbc79d65c1282a86da3a68120a5c069709a6a5bd3e206ed85d9c270c5',
       blockNumber: 5,
       address: '0x033711f6fd408b10cc94a21a3e8c20f0e75a4615',
       type: 'mined',
       event: 'NewDeveloper',
       args: [Object] } ] }
truffle(development)>

Việc chuyển đổi đã thành công. Có rất nhiều info ở đây. Chúng ta có thể thấy event ‘NewDeveloper’ đã bị bỏ đi như dự kiến, có thêm hash, block hash, lượng gas đã dùng,…

Còn balance của account là như sau:

truffle(development)> web3.fromWei(web3.eth.getBalance(account).toNumber())
'94.985184'

Chú ý rằng nó không phải 95 ether. Đó là do khi bạn tương tác với contract, bạn cũng phải trả thêm ether để thực hiện chuyển đổi. Chúng ta có cumulativeGasUsed (148160) trong thông tin của giao dịch, có nghĩa là 148160 Wei đã được dùng để thực hiện giao dịch này. Chúng ta lấy số này nhân với gasPrice. Mọi giao dịch đều có gasPrice.

Có thể lấy giá trị này bằng transactionHash, rồi nhân nó với cumulativeGasUsed để biết chi phí giao dịch bằng đơn vị ether:

truffle(development)> web3.eth.getTransaction('0xa3792da93311fdf60054f8a30e7624dd385ccf36cc639881eeb25308ddad5e0e').gasPrice.toNumber() * 148160
14816000000000000
truffle(development)> web3.fromWei(14816000000000000)
'0.014816'
truffle(development)> 100 - 0.014816
99.985184

Và chúng ta có thể tính balance như vậy. Chúng ta còn có thể đảm bảo balance của account là 5 ether như sau:

truffle(development)> web3.fromWei(web3.eth.getBalance('0x033711f6fd408b10cc94a21a3e8c20f0e75a4615').toNumber())
'5'

Bạn có thể lấy address của contract trong log field address của giao dịch trên. Cuối cùng, nếu như chúng ta không gửi 5 ether trong contract thì sao? Hãy lấy một account mới:

truffle(development)> account1 = web3.eth.accounts[9]
'0x5e273389dba808789a27cb792faaf31429c8de8c'
truffle(development)> web3.fromWei(web3.eth.getBalance(account1).toNumber())
'100'

Hãy call function createRandomDeveloper:

truffle(development)> Factory.createRandomDeveloper('Johnny', 43, {from: account1, value: web3.toWei(10, "ether")})
Error: VM Exception while processing transaction: revert
    at Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:41484:16)

truffle(development)> web3.fromWei(web3.eth.getBalance(account1).toNumber())
'99.9976828'

Có một lỗi xảy ra. Tuy nhiên, gas dùng để bắt đầu giao dịch kiểu gì chẳng bị mất đi! Bạn có thể thấy balance của account không còn là 100 ether nữa.

To be contiuned…

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

Xem thêm tuyển dụng lập trình blockchain hấp dẫn trên TopDev

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

32-cuon-sach-hoc-lap-trinh

Giới thiệu

Trong bài viết này, TopDev sẽ tổng hợp lại những cuốn sách học lập trình “phải đọc” cho lập trình viên.

Đây là những cuốn sách cung cấp nhiều kiến thức mới, dù bạn học và làm việc với bất cứ ngôn ngữ nào.

Hy vọng sau bài viết này, các bạn có thể chọn được vài cuốn sách để thêm vào tủ sách yêu thích của mình nhé.

  Tuyển tập chuẩn “sách giáo khoa” Python
  Những quy tắc khi đọc sách mà tỷ phú Bill Gates đặt ra cho chính mình và bạn cũng nên học theo

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

Sách định hướng nghề nghiệp

sách học lập trình

Định hướng nghề nghiệp chắc hẳn là điều bạn thường tìm kiếm trên mạng. Nhưng làm thế nào để biết được hướng đi trong nghề lập trình, trong khi trên mạng có quá nhiều lời khuyên và thông tin cho bạn? Cuốn sách này chắc chắn sẽ là lựa chọn phù hợp nhất dành cho bạn rồi đấy!

1. So Good They Can’t Ignore You – Cal Newport

Cuốn sách sẽ mách bạn tại sao theo đuổi đam mê của lại là một lời khuyên không tốt và thay vào đó, bạn nên làm gì?

Sách dạy cách để học

sách học lập trình

Lập trình viên thường gặp khó khăn trong việc học những kỹ năng mới và thay đổi bản thân. Vậy làm thế nào để có những thói quen mới và học những điều mới một cách dễ dàng hơn? Những cuốn sách dưới đây sẽ giúp bạn giải quyết vấn đề đó.

2. The Power of Habit: Why We Do What We Do in Life and Business – Charles Duhugg

Cuốn sách giúp bạn hiểu được cách mà các thói quen hoạt động. Từ đó bạn có thể thay đổi bản thân một cách toàn tâm toàn ý mà không phải bị cưỡng ép.

3. The Spirit of Kaizen: Creating Lasting Excellence One Small Step at a Time: Creating Lasting Excellence One Small Step at a Time – Robert Maurer

Kaizen là nguyên tắc thay đổi từ những điều nhỏ nhất và thực hiện một cách thường xuyên và liên tục.

Toyota đã sử dụng triết lý này để cải thiện chất lượng xe hơi của họ và trở thành nhà sản xuất xe lớn nhất thế giới.

Cuốn sách này chứng mình rằng bạn cũng có thể áp dụng triết lý này để cải thiện mọi thứ.

4. Badass: Making Users Awesome – Kathy Sierra

Hầu hết mọi người đều học một cách không hiệu quả. Cuốn sách này sẽ giúp bạn có cách học tốt hơn.

Sách bày cách cải thiện hiệu suất cá nhân

sách học lập trình

Ba cuốn sách dưới đây tuy có khác nhau một chút, nhưng chúng đều hướng đến cùng một mục đích. Bất kể công việc, ngành nghề hay nhiệm vụ của bạn là gì, những người làm việc hiệu quả thường có chung suy nghĩ và kỹ thuật làm việc.

5. The 7 Habits of Highly Effective People: Powerful Lessons in Personal Change – Stephen Covey

6. The Effective Executive: The Definitive Guide to Getting the Right Things Done – Peter Drucker

7. Great at Work: How Top Performers Do Less, Work Better, and Achieve More – Morten Hansen

8. Checklist Manifesto: How to Get Things Right – Atul Gawande

Kỹ năng checklist cũng vô cùng quan trọng. Cuốn sách này giúp bạn tìm hiểu sức mạnh của việc checklist đơn giản hơn để cải thiện hiệu suất của bạn và giảm bớt những lỗi sai.

Sách dạy cách cải thiện hiệu suất lập trình

sách học lập trình

Khi bạn đã hiểu rõ hiệu suất cá nhân là gì rồi, đã đến lúc tìm hiểu cách trở thành một software developer làm việc hiệu quả với những đầu sách dưới đây nhé:

9. The Effective Engineer: How to Leverage Your Efforts In Software Engineering to Make a Disproportionate and Meaningful Impact – Edmond Lau

Cuốn sách giúp bạn tập trung làm những việc đúng.

10. The Pragmatic Programmer: From Journeyman to Master – Andrew Hunt and David Thomas

Cuốn sách hướng dẫn cách áp dụng các kỹ thuật và nâng cấp bản thân dành cho những người mới bắt đầu.

Sách dạy viết code “xanh, sạch, đẹp”

sách học lập trình

11. Code Complete: A Practical Handbook of Software Construction, Second Edition – Steve McConnell

Sách cho bạn lời khuyên về cấu trúc phần mềm.

12. Clean Code: A Handbook of Agile Software Craftsmanship– Robert C Martin

Cuốn sách này đề cập đến tầm quan trọng của khả năng đọc hiểu và bảo trì, cũng như cái giá phải trả cho việc code lộn xộn.

13. Code Simplicity: The Fundamentals of Software – Max Kanat-Alexander

Bạn sẽ dễ dàng bối rối với mớ lý thuyết, ý kiến và pattern được đề xuất sử dụng khi làm phần mềm. Cuốn sách này sẽ bàn luận về những vấn đề đó.

Sách về software engineering

sách học lập trình

Mặc cho người ta nghĩ gì, các kiến thức trong software engineering đều dựa trên nghiên cứu. Đừng đi ngược lại những nghiên cứu này và trông đợi dự án của bạn sẽ ổn, nếu không thì mọi thứ sẽ đổ vỡ hết đấy.

14. Facts and Fallacies of Software Engineering – Robert Glass

Cuốn sách này giúp bạn biết những gì sẽ hoạt động được và những gì sẽ không. Nếu bạn vi phạm bất cứ quy tắc nào trong số này, thì có lẽ việc nghiên cứu không hợp với bạn rồi.

15. Rapid Development: Taming Wild Software Schedules – Steve McConnell

Cuốn sách cho bạn những lời khuyên có căn cứ về cách quản lý dự án hoặc quản lý 1 team.

16. Making Software: What Really Works, and Why We Believe It – Andy Oram & Greg Wilson

Cuốn sách này được viết dưới dạng một loạt các bài tiểu luận và hơi dài dòng, rời rạc. Tuy nhiên, nếu bạn muốn tránh làm điều gì đó dại dột, và bạn đã đọc xong những cuốn sách khác trong bài viết này, hãy thử tham khảo cuốn sách này nhé.

Sách về kỹ năng lãnh đạo

sách học lập trình

Lãnh đạo là sự tư duy và một tập hợp các kỹ năng, không đơn thuần chỉ là một chức danh hay chức vụ. Bất cứ ai cũng có thể là một nhà lãnh đạo. Khi sự nghiệp của bạn thăng tiến và cần có nhiều trách nhiệm, đây là lúc bạn rèn luyện kỹ năng lãnh đạo của mình đó.

17. Measure What Matters: How Google, Bono, and the Gates Foundation Rock the World with OKRs – John Doerr

Cuốn sách giúp bạn biết cách để mọi người trong tổ chức của bạn cố gắng hết sức theo đuổi một mục tiêu chung.

18. Turn the Ship Around!: A True Story of Turning Followers into Leaders – L. David Marquet

Cuốn sách chia sẻ mối quan hệ leader-leader thay vì leader-follower. Tổ chức của bạn sẽ có hiệu suất làm việc tốt nhất khi mọi người 100% toàn tâm vào công việc của họ và cùng hướng đến một mục tiêu chung. Bạn sẽ được biết về lý thuyết 3C:

  • Control (kiểm soát)
  • Competence (năng lực)
  • Clarity (sự rõ ràng)

Sách về quản lý dự án

sách học lập trình

Đừng tưởng rằng bạn là một coder giỏi và đã đi làm được một thời gian thì có thể chạy một dự án. Hãy tránh những sai lầm của một người mới bắt đầu này bằng cách đọc những cuốn sách dưới này nhé:

19. Rapid Development: Taming Wild Software Schedules – Steve McConnell

20. Essential Scrum: A Practical Guide to the Most Popular Agile Process – Ken Rubin

Sách cho lời khuyên tuyệt vời về scrum và quản lý dự án nói chung. Xem thêm Scrum là gì?

21. The Lean Startup: How Today’s Entrepreneurs Use Continuous Innovation to Create Radically Successful Businesses – Eric Ries

Sách giúp bạn hiểu lý do tại sao phải xây dựng MVP và vì sao sử dụng quy trình xây dựng – đo lường – học hỏi là rất quan trọng.

22. The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win – Gene Kim & Kevin Behr

Sách chia sẻ cách áp dụng lý thuyết về Constraint và Lean để giải quyết các vấn đề phát sinh trong dự án (hoặc tránh được các vấn đề đó từ lúc bắt đầu).

Sách quản lý dự án nâng cao

Khi bạn đã có những kiến thức cơ bản và các dự án của bạn không còn gặp rắc rối nữa, hãy xem xét việc học các kỹ thuật quản lý dự án nâng cao hơn qua các cuốn sách sau.

23. The Principles of Product Development Flow: Second Generation Lean Product Development – Donald Reinertsen

Sách giúp bạn sửa các lỗi mà mọi người thường mắc phải bằng cách áp dụng các kỹ thuật Lean và Six Sigma từ lúc bắt đầu cho tới khi ra sản phẩm. Cuốn sách này không dành cho người mới bắt đầu.

24. Goldratt’s Theory of Constraints: A Systems Approach to Continuous Improvement – William H. Dettmer

Cuốn sách này đưa ra cách tiếp cận có hệ thống để tìm ra sự hạn chế trong tổ chức của bạn và khắc phục nó.

Sách về Unit Testing  

sách học lập trình

Nếu bạn chưa bao giờ thử unit testing, những cuốn sách này sẽ giúp bạn bắt đầu.

25. Starting to Unit Test: Not as Hard as You Think – Erik Dietrich

Hướng dẫn cho người mới bắt đầu làm Unit Testing.

26. Working Effectively with Unit Tests – Jay Fields

Cung cấp các bài kiểm tra thực hành unit testing tốt nhất cho những người đã biết cơ bản.

27. Working Effectively with Legacy Code – Michael Feathers

Cuốn sách rất nổi tiếng về việc lấy code có sẵn đã được unit test tự động – 1 công việc vốn nổi tiếng gây khó khăn cho lập trình viên.

Sách về phân tích và thống kê dữ liệu

sách học lập trình

Bạn cần kỹ năng phân tích dữ liệu để đo lường kết quả của bạn. Nhiều lập trình viên thiếu kiến ​​thức thống kê và các kỹ năng cần thiết để thống kê dữ liệu và cho ra kết quả chính xác. Những cuốn sách dứoi đây sẽ giúp bạn giải quyết vấn đề này.

28. Data Analysis with Open Source Tools: A Hands-On Guide for Programmers and Data Scientists – Philipp K. Janert

Đây là cuốn sách bạn cần khi sếp của bạn bỏ một tấn dữ liệu lên bàn của bạn và nói “tìm hiểu kỹ nó đi”.

Bạn có thể tham khảo thêm một vài cuốn sách này:

29. Statistics For Dummies – Deborah Rumsey

30. Statistics II for Dummies – Deborah Rumsey

Sách về UX/UI

sách học lập trình hay

Hầu hết các lập trình viên không chú ý đến giao diện và trải nghiệm người dùng. Những cuốn sách này sẽ giúp bạn.

31. Don’t Make Me Think, Revisited: A Common Sense Approach to Web Usability – Steve Krug

32. Rocket Surgery Made Easy: The Do-It-Yourself Guide to Finding and Fixing Usability Problems – Steve Krug

Kết luận

Trên đây là 32 cuốn sách học lập trình mà bạn nên đọc qua để bổ sung kiến thức và kỹ năng cho mình.

Cảm ơn các bạn đã theo dõi bài viết!

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

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

  Bill Gates gợi ý 5 cuốn sách hay nhất ai cũng nên đọc mùa hè này

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

thu-vien-va-framework-cua-javascript

JavaScript đã tồn tại hơn 20 năm, và là một trong những ngôn ngữ không ngừng phát triển. Ngôn ngữ này gần đây trải qua giai đoạn tăng trưởng rất nhanh, và liệu các kỹ thuật JavaScript cho front-end nổi bật hiện nay sau vài năm nữa có còn được chú ý nữa không.

Tuy nhiên, quan trọng là luôn dẫn đầu cuộc chơi bằng cách sử dụng những công nghệ những công cụ và framework mới nhất cho việc phát triển tốt hơn. Bài viết này sẽ giúp bạn khám phá những thư viện và framework của JavaScript bạn nên cân nhắc học ngay bây giờ.

Tuyển dụng Javascript lương cao cần gấp

Môi trường JavaScript đã trở nên khổng lồ. Nó có hệ sinh thái của riêng nó với thư viện, frameworks, công cụ, các quản lý package và các ngôn ngữ mới để biên dịch ra JavaScript.

Thật thú vị, npm, là một trình quản lý package thực thụ cho JavaScript, cũng là một software registry lớn nhất của thế giới. Đây là một đoạn trích từ một bài viết xuất bản trên Linux.com vào tháng 1 năm 2017.

Với hơn 350,000 packages, npm registry chứa gần như hơn gấp đôi package registry phổ biến tiếp theo (Apache Maven). Thực tế, hiện thời nó là package registry lớn nhất thế giới.

8 tháng nhanh chóng trôi qua, và hiện giờ có 500,000 packages trong npm registry. Là một sự tăng trưởng khủng khiếp so với những package repo khác.

Những thư viện và framework của JavaScript mà bạn không thể bỏ quaNguồn: ModuleCounts.com

Làm lập trình front-end, bắt kịp với những công cụ và thư viện JavaScript thực sự rất quan trọng. Khi một công nghệ trở nên phổ biến, nhu cầu sẽ tăng cao, lần lượt sẽ xuất hiện nhiều công việc lập trình hơn với mức lương cao hơn trong ngành công nghiệp.

Vì vậy TopDev xin tập hợp một danh sách những thư viện và framework của JavaScript mà bạn nên lưu tâm.

Thư viện là các code có thể sử dụng lại để thực hiện những chắc năng cụ thể. Nó là một tập hợp những hàm, đối tượng, và class bạn có thể dùng trong ứng dụng của bạn.

Bạn có thể gọi một hàm từ thư viện và đưa các tham số, và thư viện xử lý nó và trả về quyền điều khiển cho bạn. Tuy nhiên, nó không đặt để bất kỳ quy tắc nào giới hạn cách bạn sử dụng thư viện đó.

Thư viện JavaScript phổ biến gồm có:

React là một thư viện được xây dựng cho các nhà phát triển của Facebook và Instagram. Nó được bầu chọn là một công nghệ được yêu thích nhất của các nhà phát triển, dựa theo khảo sát của Stack Overflow 2017. React cũng là một thư viện JavaScript phổ biến nhất dựa trên số sao đếm được từ GitHub.

Vậy tại sao React được toàn thể chú ý như vậy?

Với React, hoàn toàn có thể tạo ra một ứng dụng tương tác sử dụng phương pháp declarative. Ở đó bạn có thể kiểm soát trạng thái của ứng dụng bằng cách nói “view nên trông giống như vậy nè”.

Nó sử dụng model component-based, các component là những thành phần UI được tái sử dụng và mỗi component có trạng thái riêng. Xem thêm component là gì?

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

React sử dụng Virtual DOM do đó bạn không cần phải quan tâm đến việc trực tiếp thao tác DOM. Tính năng đáng chú ý khác của React bao gồm các luồng dữ liệu một chiều (one-way data flow), tùy chọn cú pháp JSX và công cụ command-line cho việc tạo ra một dự án React mà không cần cấu hình ban đầu.

jQuery là một thư viện giúp JavaScript dễ tiếp cận hơn và thao tác với DOM trở nên dễ dàng hơn bao giờ hết. Quá trình học nhẹ nhàng và cú pháp dễ dàng của jQuery đã hình thành một thế hệ nhà phát triển client-side mới.

Một vài năm trước đây, jQuery đã được xem là một giải pháp tốt nhất để xây dựng các website mạnh mẽ, với hỗ trợ đa trình duyệt. Các tính năng cốt yếu của jQuery như xử lý DOM dựa trên CSS selectors, event handling và gọi AJAX đã tạo nên sự phổ biến cho nó.

Xem thêm jQuery là gì?

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

Tuy nhiên, sự việc đã thay đổi, môi trường JavaScript phát triển nhanh chóng. Vài điểm nổi bật của jQuery đã được tích hợp vào chuẩn ECMAScript mới đây. Hơn nữa, những framework và thư viện mới được dùng ngày nay có cách riêng để gắn kết DOM, và vì thế các kỹ thuật thao tác DOM truyền thống không còn được yêu cầu nữa. Độ phổ biến của jQuery đang giảm dần, nhưng nó sẽ không biến mất sớm đâu.

D3 hoặc D3.js là một thư viện JavaScript mạnh mẽ, tạo ra những hình ảnh có tính tương tác sử dụng chuẩn mực web như SVG, HTML và CSS. Không giống với những thư viện hình ảnh trực quan khác, D3 cung cấp kết quả hình ảnh được tạo ra tốt hơn.

D3 hoạt động bằng cách gắn kết data với DOM và sau đó thực hiện công tác chuyển đổi cho phần document. Nó cũng sở hữu một hệ sinh thái, gồm có các plugin và thư viện để thêm các chức năng mở rộng.

Thư viện này đã được ra mắt từ năm 2011, và có cả tấn tài liệu và bài hướng dẫn có thể giúp bạn bắt đầu ngay.

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

Nếu bạn đang kiếm tìm cách tạo các hình ảnh đơn giản mà không tốn quá nhiều thời gian, bạn nên xem qua Chart.js.

Một framework là một kiến trúc kiểm soát luồng đi của data trong ứng dụng của bạn. Framework hình thành cấu trúc cơ bản và cho bạn biết mọi thứ nên được tổ chức ra sao, chức năng cơ bản để giúp ứng dụng lập tức vận hành cũng được cung cấp.

Hơn thế nữa, bạn bị ràng buộc phải tuân theo các pattern và quy luật mà framwork thiết kế. Sự khác biệt giữa framework và thư viên là: bạn gọi một thư viện còn framework thì gọi bạn.

Một framework chứa đựng nhiều thư viện và có hình thái cấp độ cao hơn. Chức năng như event binding, gọi AJAX, template và data binding, và testing được xây dựng bên trọng framework. Tìm hiểu chi tiết Framework là gì?

AngularJS là một trong những công nghệ JavaScript phổ biến nhất trong giới phát triển Front-End. Nó được hậu thuẫn bởi Google và một cộng đồng gồm nhiều cá nhân và tổ chức khác. Mặc cho sự phổ biến của mình, AngularJS cũng từng có những sai sót của nó. Nhóm Angular đã bỏ ra 2 năm làm ra một phiên bản mới, cuối cùng đã ra mắt và tháng 9 năm 2016.

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

Angular 2 là một phiên bản viết lại từ đầu của AngularJS. Một vài tính năng của Angular 2 gồm có:

  • TypeScript thay cho JavaScript làm ngôn ngữ mặc định;
  • Kiến trúc component-based;
  • Cải thiện hiệu năng trên nền tảng web và mobile;
  • Chọn lựa tốt hơn cho tooling và scaffolding.

Tuy nhiên, nâng cấp từ Angular 1.x sang Angular 2.x khá là xa xỉ vì Angular 2 là một thứ hoàn toàn khác biệt. Đó là lý do cho việc tại sao Angular 2 chưa có tỉ lệ thực nghiệm cao như người tiền nhiệm của nó.

Nhưng Angular và AngularJS vẫn tiếp tục là một công nghệ phổ dụng nhất dựa theo Stack Overflow 2017. Dự án Angular nhận được 28,000 sao trên GitHub.

Vue.js là một framework JavaScript nhỏ gọn mới xuất hiện. Nó là một framework JavaScript phổ biến trên GitHub tính theo lượng sao trên GitHub. Vue là một framework không quá cứng nhắc và do đó giúp nhà phát triển dễ dàng nắm bắt được nó. Các mẫu cú pháp HTML của Vue gắn kết phần DOM đã render với giá trị của dữ liệu.

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

Framework này cung cấp trải nghiệm giống React với những Virtual DOM của nó và các component có thể tái sử dụng giúp bạn tạo ra cả widgets và toàn bộ ứng dụng web. Hơn nữa, bạn cũng có thể dùng cú pháp JSX để viết phần chức năng render trực tiếp.

Khi trạng thái thay đổi, Vue.js sẽ mở một hệ thống phản ứng để xác định rằng điều gì đã thay đổi và render số lượng nhỏ nhất các component.

Vue.js cũng hỗ trợ tích hợp những thư viện khác vào framework mà không cần tốn công sức nhiều.

Ember.js là một framework front-end vân hành trên mô hình Model-View-View-Model (cấu trúc MVVM). Nó tuân theo nguyên tắc hơn là phương pháp cấu hình, nó phổ biến hơn những framework khác như Ruby on Raila hoặc Laravel.

Ember.js tổng hợp với những câu thành ngữ và thực tiễn nhất vào trong framework vì thế bạn có thể khởi động một ứng dụng chẳng mất nhiều công sức.

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

Ember thông thường gồm có:

  • Ember CLI: cung cấp chọn lựa tạo khuôn mẫu cơ bản (scaffolding) và hỗ trợ hàng trăm add-ons.
  • Ember Data: là một thư viện data vững chắc được cấu hình để làm việc với bất kỳ server back-end nào.
  • Ember Inspector: Một extension (phần mở rộng) cho Chrome và Firefox.
  • Liquid Fire: Một add-on cho việc chuyển đổi và hoạt hình.

Một công cụ là một tập hợp các công việc thường dùng, giúp bạn trong quá trình phát triển. Không giống thư viện, công cụ thường xử lý một task ở mã lệnh phía client. Nó dùng mã code làm dữ liệu ban đầu, thực hiện task trên đó, và trả về kết quả. Các công cụ thường dùng có transpiler và công cụ build, asset minifiers, module bundler và công cụ scaffolding.

Trình chạy task General-purpose là các công cụ được dùng để tự động các công vlệc cụ thể. Các trình chạy task general-purpose gồm có:

Gulp là một bộ công cụ JavaScript được dùng như một trình chạy task. Biên dịch, thu gọn code, tối ưu hình ảnh, unit testing linting là những task lập lại đã được tự động hoá. Nó giúp quá trình viết task dễ dàng hơn, thậm chí cho những người ít kinh nghiệm với JavaScript.

Gulp sử dụng pipeline để dẫn data từ một plugin này sang một plugin khác. Kết quả sau cùng là xuất ra một thư mục đã được chỉ định trước.

Nó thực hiện công việc tốt hơn so với Grunt bởi vì nó không tạo ra file tạm thời để lưu trữ các kết quả, nó cho kết quả có ít lần gọi I/O hơn.

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

Grunt là một task runner (trình chạy task) và một công cụ tự động của JavaScript. Grunt có một giao diện command-line cho phép bạn chạy các task tự chọn được định nghĩa trong một Gruntfile.

Nó có hàng ngàn plugins để chọn lựa, gồm có những task lập đi lập lại mà bạn sẽ gặp phải. Với Grunt, bạn có thể dùng tất cả task bằng một dòng lệnh, làm cuộc sống bạn dễ dàng hơn.

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

Gulp và Grunt đòi hỏi bạn dành thời gian học và thuần thục công cụ. Giới thiệu các phần phụ thuộc bổ sung vào dự án của bạn có thể tránh được bằng cách chọn lựa một thay thế đã được đóng gói với Node.js.

Dù npm được biết đến nhiều hơn là một trình quản lý package, mã lệnh npm cũng có thể sử dụng để thực hiện các nhiệm vụ được đề cập trước đó.

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

Xem chi tiết về npm là gì?

Testing là quá trình đánh giá và thẩm định phần mềm, đáp ứng được các yêu cầu về kỹ thuật và kinh doanh. Phương pháp Test-Driven Development cũng hướng đến việc phát hiện lỗi và được xem như một phần không thể thiếu của công việc phát triển front-end hiện đại.

Jest là một testing framework khá mới được xây dựng bởi Facebook và được cộng đồng React rất đón nhận. Có một quan niệm sai lầm là Jest được thiết kế đặc thù để làm việc với React, tuy nhiên, theo tài liệu của Jest:

“Dù Jest có thể xem là test runner đặc thù cho React, nhưng thực tế là một nền tảng testing phổ cập, với khả năng thích nghi cho bất kể thư viện hoặc framework JavaScript nào. Bạn có thể sử dụng Jest để test bất kỳ mã JavaScript nào.”

Ưu điểm của Jest so với những bộ kiểm thử khác là không cần phải có cấu hình gì để bắt đầu viết các testing. Framework đã có phần thư viên dựng sẵn và hỗ trợ sử dụng của việc bắt chước các hàm.

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

Jest có một tính năng gọi là snapshot testing, cho phép bạn chắc chắn rằng UI của ứng dụng không thay đổi theo cách không mong muốn. Nhà phát triển tại Facebook và những người đóng góp khác đã bỏ rất nhiều công sức vào dự án này, vì vậy sẽ không ngạc nhiên nếu Jet trở thành testing framework phổ biến nhất trong những năm tới đây.

Mocha là một testing JavaScript framework nổi bật với sự hỗ trợ của trình duyệt, hỗ trợ không đồng bộ gồm có promises, test coverage report (báo cáo kiểm tra), và một JavaScript API để vận hành các bài kiểm tra.

Mocha thường dùng chung với một thư viện khác như Chai, should.jsexpect.js hoặc một thu viện tốt hơn vì nó thiếu thư viện riêng.

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

Jasmine là một testing framework theo kiểu behavior-driven cho JavaScript. Nó được định hướng trở thành một trình duyệt, nền tảng và bộ kiểm tra không lệ thuộc vào framework.

Jasmine có một thư viện riêng của nó gọi là matchers với cú pháp rõ ràng và dễ đọc. Nó không có một test runner (trình chạy test) dựng sẵn, và bạn có lẽ phải dùng một test runner thuần tuý như Karma.

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua

JavaScript xuất hiện từ những năm 1995, và nó dĩ nhiên sẽ tồn tại mãi miễn là các trình duyệt không quyết định thay nó bằng một ngôn ngữ khác. Mặc dù có rất nhiều ngôn ngữ khác biên dịch thành JavaScript, nhưng không có ngôn ngữ scripting nào khác có thể thay được JavaScript trong tương lai gần. Tại sao? Vì JavaScript đã trở nên quá phổ biến để có thể bị thay thế.

Ngôn ngữ này không chỉ dễ học, mà còn có rất nhiều framework và thư viện đủ để bạn bận rộn với nó. Những thư viện và framework cũ đã bị thay thế bởi những công nghệ mới hơn. Giống như jQuery, một trong những thư viện JavaScript từng được yêu mến nhất, đang đương đầu với sự thất thế về độ hấp dẫn, cách sử dụng và sự phổ biến. Các thư viện, framework và công cụ thế hệ mới đang tăng trưởng và có được sự đón nhận rộng rãi.

Việc luôn cập nhật các thư viện và framework của JavaScript sẽ là cuộc chiến lâu dài đối với các lập trình viên.

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

Xem thêm việc làm JavaScript Developer hot nhất trên TopDev

Functional Programming là gì? Tại sao nên sử dụng?

functional programming
Functional Programming là gì? Tại sao nên sử dụng

Functional Programming có điểm vượt trội so với các mô hình lập trình khác là bởi tính đơn giản, rõ ràng, dễ hiểu dễ đọc. Đồng thời chính kết cấu rõ ràng của nó tạo nên tính ổn định và tin cậy, ít xảy ra lỗi.

Functional Programming là gì?

Functional programming là một dạng mô hình lập trình (FP – Gọi là lập trình hàm), cũng giống như lập trình tuần tự hay lập trình hướng đối tượng (OOP). Functional programming là một phương pháp lập trình dựa trên các hàm toán học (function), tránh việc thay đổi giá trị của dữ liệu. Nó có nhiều lợi ích như : các khối xử lý độc lập dễ tái sử dụng, thuận lợi cho việc thay đổi logic hoặc tìm lỗi chương trình.

Functional Programming là gì? Tại sao nên sử dụng

Functional Programming có ưu điểm gì?

Functional Programming hướng đến tính kết hợp (composability) các hàm (function) để tối đa hóa khả năng tái sử dụng (reusability) trong chương trình.

Functional Programming thì chỉ có function, không assignment statements, không lưu giữ global state… Trong Functional Programming, chúng ta điều khiển luồng chương trình bằng cách phối hợp các functions lại với nhau.

Điểm khác biệt lớn nhất của lập trình hàm khác với lập trình thủ tục thuần túy (procedural programming) nằm ở điểm thay vì thực hiện tuần tự theo từng bước với các biến để lưu trạng thái thì FP chú trọng đến thực thi luồng chương trình thông qua việc kết hợp các hàm bậc cao (high order function).

Đối với các ngôn ngữ có hỗ trợ high order function thì các hàm cũng có thể được truyền như là các tham số hoặc là kết quả trả về. Do đó các thuật toán trong FP có thể được diễn tả một cách ngắn gọn và trong sáng.

Tại sao nên sử dụng Functional Programming?

Việc hiểu rõ được Functional Programming thường là một trong những bước phát triển quan trọng nhất trong sự nghiệp lập trình của bạn, và đôi khi cũng là bước khó khăn nhất.

  • Nguyên tắc thứ nhất trong Functional Programming là: cái nào đã khai báo một lần thì mãi mãi như vậy, không bao giờ thay đổi nữa. Các biến hoặc đối tượng trong kịch bản Functional Programming nếu có thì phải immutable.
  • Với Pure Function, cung cấp sự tự tin không thay đổi mọi thứ bên ngoài phạm vi của nó. Đây là nguyên tắc thứ hai trong Functional Programming: tất cả các hàm đều phải là pure function, sẽ không bị side effect ( kết quả trả về bị ảnh hưởng bởi tác nhân bên ngoài hàm). Nó sẽ không đọc, nhận bất kỳ cái gì nào ở bên ngoài hàm hoặc ghi bất kỳ cái gì ở bên ngoài hàm.
  • Dễ kiểm tra, bởi vì nó không phụ thuộc vào trạng thái của ứng dụng và xác minh kết quả cũng sẽ dễ dàng.
  • Nó làm cho code dễ đọc dễ hiểu hơn.

Functional Programming có nhược điểm gì?

  • Để viết một Pure Function đứng một mình thì đơn giản, nhưng khi kết hợp chúng vào một chương trình lớn thì rất khó: Tất cả các hàm phải tuân theo pattern giống nhau, nếu không lỗi rất dễ xảy ra.
  • FP đi kèm với các khái niệm về toán học nâng cao: đây sẽ là lý do gây nản lòng khi bạn học nó.
  • Bắt đầu với functional programming, chúng ta phải làm quen và nắm vững recursive (đệ quy), thay vì for, while sử dụng phổ biếng trong OOP. Chính vì thế việc tối ưu bộ nhớ khi sử dụng đệ quy là điểm cần lưu ý. Nhưng điều này có thể giảm đáng kể bằng cách sử dụng tail recursion.

Hadoop là gì? Kiến trúc của Hadoop

hadoop là gì

Big Data đang trở thành một phần thế mạnh và là tài sản to lớn của mỗi công ty, và Hadoop là công nghệ cốt lõi cho việc lưu trữ và truy cập dữ liệu lớn.

Hadoop là gì?

Hadoop là một Apache framework mã nguồn mở cho phép phát triển các ứng dụng phân tán (distributed processing) để lưu trữ và quản lý các tập dữ liệu lớn. Hadoop hiện thực mô hình MapReduce, mô hình mà ứng dụng sẽ được chia nhỏ ra thành nhiều phân đoạn khác nhau được chạy song song trên nhiều node khác nhau. Hadoop được viết bằng Java tuy nhiên vẫn hỗ trợ C++, Python, Perl bằng cơ chế streaming.

Hadoop giải quyết vấn đề gì?

  • Xử lý và làm việc khối lượng dữ liệu khổng lồ tính bằng Petabyte.
  • Xử lý trong môi trường phân tán, dữ liệu lưu trữ ở nhiều phần cứng khác nhau, yêu cầu xử lý đồng bộ
  • Các lỗi xuất hiện thường xuyên.
  • Băng thông giữa các phần cứng vật lý chứa dữ liệu phân tán có giới hạn.

Kiến trúc Hadoop là gì?

Một cụm Hadoop nhỏ gồm 1 master node và nhiều worker/slave node. Toàn bộ cụm chứa 2 lớp, một lớp MapReduce Layer và lớp kia là HDFS Layer. Mỗi lớp có các thành phần liên quan riêng. Master node gồm JobTracker, TaskTracker, NameNode, và DataNode. Slave/worker node gồm DataNode, và TaskTracker. Cũng có thể slave/worker node chỉ là dữ liệu hoặc node để tính toán.

Hadoop framework gồm 4 module:

1.Hadoop Distributed File System (HDFS)

Đây là hệ thống file phân tán cung cấp truy cập thông lượng cao cho ứng dụng khai thác dữ liệu. Hadoop Distributed File System (HDFS) là hệ thống tập tin ảo. Khi chúng ta di chuyển 1 tập tin trên HDFS, nó tự động chia thành nhiều mảnh nhỏ. Các đoạn nhỏ của tập tin sẽ được nhân rộng và lưu trữ trên nhiều máy chủ khác để tăng sức chịu lỗi và tính sẵn sàng cao.

HDFS sử dụng kiến trúc master/slave, trong đó master gồm một NameNode để quản lý hệ thống file metadata và một hay nhiều slave DataNodes để lưu trữ dữ liệu thực tại.

Một tập tin với định dạng HDFS được chia thành nhiều khối và những khối này được lưu trữ trong một tập các DataNodes. NameNode định nghĩa ánh xạ từ các khối đến các DataNode. Các DataNode điều hành các tác vụ đọc và ghi dữ liệu lên hệ thống file. Chúng cũng quản lý việc tạo, huỷ, và nhân rộng các khối thông qua các chỉ thị từ NameNode.

  26 công cụ và kỹ thuật trong Big Data có thể bạn chưa biết
  Tổng hợp Cheat Sheets cho AI, Neural Networks, Machine Learning, Deep Learning và Big Data

2. Hadoop MapReduce

Đây là hệ thống dựa trên YARN dùng để xử lý song song các tập dữ liệu lớn. Là cách chia một vấn đề dữ liệu lớn hơn thành các đoạn nhỏ hơn và phân tán nó trên nhiều máy chủ. Mỗi máy chủ có 1 tập tài nguyên riêng và máy chủ xử lý dữ liệu trên cục bộ. Khi máy chủ xử lý xong dữ liệu, chúng sẽ gởi trở về máy chủ chính.

MapReduce gồm một single master (máy chủ) JobTracker và các slave (máy trạm) TaskTracker trên mỗi cluster-node. Master có nhiệm vụ quản lý tài nguyên, theo dõi quá trình tiêu thụ tài nguyên và lập lịch quản lý các tác vụ trên các máy trạm, theo dõi chúng và thực thi lại các tác vụ bị lỗi. Những máy slave TaskTracker thực thi các tác vụ được master chỉ định và cung cấp thông tin trạng thái tác vụ (task-status) để master theo dõi.

JobTracker là một điểm yếu của Hadoop Mapreduce. Nếu JobTracker bị lỗi thì mọi công việc liên quan sẽ bị ngắt quãng.

3. Hadoop Common

Đây là các thư viện và tiện ích cần thiết của Java để các module khác sử dụng. Những thư viện này cung cấp hệ thống file và lớp OS trừu tượng, đồng thời chứa các mã lệnh Java để khởi động Hadoop.

4. Hadoop YARN

Quản lý tài nguyên của các hệ thống lưu trữ dữ liệu và chạy phân tích.

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

Giai đoạn 1

Một user hay một ứng dụng có thể submit một job lên Hadoop (hadoop job client) với yêu cầu xử lý cùng các thông tin cơ bản:

  1. Nơi lưu (location) dữ liệu input, output trên hệ thống dữ liệu phân tán.
  2. Các java class ở định dạng jar chứa các dòng lệnh thực thi các hàm map và reduce.
  3. Các thiết lập cụ thể liên quan đến job thông qua các thông số truyền vào.

Giai đoạn 2

Hadoop job client submit job (file jar, file thực thi) và các thiết lập cho JobTracker. Sau đó, master sẽ phân phối tác vụ đến các máy slave để theo dõi và quản lý tiến trình các máy này, đồng thời cung cấp thông tin về tình trạng và chẩn đoán liên quan đến job-client.

Giai đoạn 3

TaskTrackers trên các node khác nhau thực thi tác vụ MapReduce và trả về kết quả output được lưu trong hệ thống file.

Khi “chạy Hadoop” có nghĩa là chạy một tập các trình nền – daemon, hoặc các chương trình thường trú, trên các máy chủ khác nhau trên mạng của bạn. Những trình nền có vai trò cụ thể, một số chỉ tồn tại trên một máy chủ, một số có thể tồn tại trên nhiều máy chủ.

Các daemon bao gồm:

  • NameNode
  • DataNode
  • SecondaryNameNode
  • JobTracker
  • TaskTracker

Tại sao dùng Hadoop?

Các điểm thuận lợi khi dùng Hadoop:

  • Robus and Scalable – Có thể thêm node mới và thay đổi chúng khi cần.
  • Affordable and Cost Effective – Không cần phần cứng đặc biệt để chạy Hadoop.
  • Adaptive and Flexible – Hadoop được xây dựng với tiêu chí xử lý dữ liệu có cấu trúc và không cấu trúc.
  • Highly Available and Fault Tolerant – Khi 1 node lỗi, nền tảng Hadoop tự động chuyển sang node khác.

Nguồn tham khảo:

  • https://www.mastercode.vn/blog/web-development/hadoop-la-gi-huong-dan-cai-dat-cau-hinh-hadoop-tren-windows.84
  • https://bigdataviet.wordpress.com/2015/08/08/hadoop-la-gi/

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

26 công cụ và kỹ thuật trong big data có thể bạn chưa biết

Big Data là gì? Tất tần tật về Big Data

Big data là gì? Trò chuyện cùng CTO của Datamart Solutions để hiểu hơn về data

Xem thêm Java Developer Jobs hấp dẫn lương cao tại TopDev!

Những theme cho VS Code tốt nhất

Những theme cho VS Code tốt nhất

Visual Studio Code đã chiếm được cảm tình của nhiều nhà phát triển trong những năm gần đây. Dễ sử dụng, tùy biến và trọng lượng nhẹ khiến mọi người lựa chọn. Hãy cùng xem một số theme VSCode tốt nhất có sẵn trên thị trường đang được sử dụng bởi một số nhà phát triển nổi tiếng trong cộng đồng.

Để áp dụng theme, Khởi động VS Code (Ctrl + P), dán lệnh bên dưới mỗi theme và nhấn enter để apply.

1. Night Owl

VScode Theme - Owl

ext install sdras.night-owl

Links: GitHub | MarketPlace

2. Ariake Dark

Vscode Theme- Ariake

ext install wart.ariake-dark

Links: MarketPlace

3. One Dark Pro

VScode Them One Dark Pro

ext install zhuangtongfa.Material-theme

Links: GitHub | MarketPlace

Monokai Darker

Những theme cho VS Code tốt nhất

ext install eserozvataf.one-dark-pro-monokai-darker

Links: GitHub | MarketPlace

4. Nord

Những theme cho VS Code tốt nhất

ext install arcticicestudio.nord-visual-studio-code

Links: GitHub | MarketPlace

5. Dracula Official

Những theme cho VS Code tốt nhất

ext install dracula-theme.theme-dracula

Links: GitHub | MarketPlace

6. Pitch Black

Những theme cho VS Code tốt nhất

ext install viktorqvarfordt.vscode-pitch-black-theme

Links: GitHub | MarketPlace

7. City Lights

Những theme cho VS Code tốt nhất

ext install Yummygum.city-lights-theme

Links: GitHub | MarketPlace

8. Cobalt Next

Những theme cho VS Code tốt nhất

ext install dline.CobaltNext

Links: GitHub | MarketPlace

9. Cobalt2

Những theme cho VS Code tốt nhất

ext install wesbos.theme-cobalt2

Links: GitHub | MarketPlace

10. Material Theme

Những theme cho VS Code tốt nhất

ext install Equinusocio.vsc-material-theme

Links: GitHub | MarketPlace

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

kênh Youtube học lập trình

Nếu bạn đang làm lập trình web ở level junior, có lẽ một trong những câu hỏi mà bạn thường hay tự hỏi chính mình đó là: Làm sao kiếm được đúng nguồn để mà học?

Đây là lúc Youtube phát huy tác dụng của nó. Youtube đã quá đỗi quen thuộc với mọi người. Nó là một dịch vụ chia sẻ video cho phép người dùng tạo những channel của riêng họ và đăng tải lên các nội dung dưới dạng video dành cho cộng đồng.

Nếu bạn là một người mới bắt đầu vào ngành, bạn cần phải sắc sảo và tinh tế hơn trên con đường học tập của mình. Không phải ai cũng đủ kiên nhẫn bỏ ra một số tiền để mua một khóa học lỗi thời trên mạng để học cả.

Đó là lý do vì sao trong bài viết này, TopDev sẽ tập hợp lại danh sách các kênh Youtube học lập trình sở hữu các nội dung tuyệt vời về Web Developer/Designer. Mong rằng sau bài viết này sẽ giúp các bạn phần nào trên con đường phát triển của mình.

Bắt đầu nhé!

  Tài nguyên thiết kế web và hình ảnh hot nhất cho Lập trình viên

  Trước khi trở thành Web Developer mình đã phải bỏ lỡ những điều gì?

Dev Ed

Là channel dạy các ngôn ngữ trong mảng front-end và các thư viện javascript cũng như là react, hay môi trường runtime trong back-end như nodejs, hoặc dạy thiết kế bằng các công cụ như figma và photoshop.

Dev Ed cung cấp cho bạn các công cụ phát triển web phong phú để đảm bảo bạn không cảm thấy nhàm chán trong quá trình học.

Bạn có thể xem qua kênh Dev Ed tại đây.

Tech Lead

Kênh Tech Lead sẽ không dạy bạn cách viết code thông qua các ví dụ thực tế. Thay vào đó, Patrick Shyu – người tạo ra kênh này sẽ chia sẻ những kiến thức của ông qua nhiều năm với tư cách là một cựu lãnh đạo công nghệ Google.

Ông cung cấp cái nhìn sâu sắc về các vấn đề mà junior developer đang phải đối mặt, từ cách làm việc sao cho hiệu quả hơn cho đến cách mọi người loại bỏ căng thẳng trong công việc. Ông ấy cũng rất có khiếu hài hước nên bạn sẽ rất thích channel này đấy.

Bạn có thể xem kênh Tech Lead tại đây.

Programming with Mosh

Programming with Mosh cung cấp cho bạn các hướng dẫn giúp bạn trở thành một lập trình viên giỏi nhất có thể. Kênh của anh ấy upload đầy đủ các ngôn ngữ front-end và cả back-end, cũng như các thư viện và framework.

Nếu bạn đang có ý định hướng tới việc cải thiện các kỹ năng code của mình với tư cách là một nhà developer front-end hoặc back-end, thì đây sẽ là một channel thích hợp nhất cho bạn.

Bạn có thể xem qua kênh Programming with Mosh tại đây.

Tyler Moore

Khi nhắc đến kênh Tyler Moore, mọi người sẽ nghĩ ngay đến những video hướng dẫn học lập trình web dành cho người dùng một cách thân thiện nhất bằng wordpress. Kênh này có hơi hướng về thiết kế hơn so với các kênh ở trên.

Tuy nhiên, nếu bạn là một developer tự do, đôi khi bạn sẽ cần phải sử dụng các công cụ như wordpress để hoàn thành công việc. Kênh Tyler Moore là một lựa chọn hoàn hảo để bạn đạt hiệu quả cao nhất trong công việc. Hiện Tyler Moore đã có gần 31 triệu lượt xem trên youtube.

Bạn có thể xem qua kênh Tyler Moore tại đây.

Wes Bos

Wes Bos cung cấp cho các bạn các hướng dẫn để cải thiện kỹ năng phát triển web của mình. Danh sách hướng dẫn về javascript trên kênh của anh ấy có tới tận 30 dự án javascript khác nhau.

Bạn có thể xem qua kênh Web Bos tại đây.

Design Course

Kênh này thuộc quyền sở hữu của Gary Simon và đã hoạt động được 8 năm rồi. Design Course cung cấp cho bạn các video giúp nâng cao kỹ năng UI/UX bằng các công cụ như photoshop và Adobe XD.

Ngoài ra, ông còn dạy cho các lập trình viên kiến thức về front-end và back-end… Chính những điều này giúp cho kênh của ông trở thành một công cụ tuyệt vời để học hỏi các công nghệ phát triển web.

Bạn có thể xem qua kênh Design Coure tại đây.

CodingTheSmartWay

CodingTheSmartWay cung cấp cho bạn các hướng dẫn về phát triển web fullstack với machine learning.

Nếu bạn đang có định hướng phát triển web fullstack, kênh này sẽ là lựa chọn phù hợp nhất cho bạn.

Bạn có thể xem qua kênh CodingTheSmartWay tại đây.

Joshua Fluke

Bỏ qua phần dịch nghĩa của tên kênh đi nhé. Khi bạn muốn tìm một công việc developer mà lại không có hoặc hạn chế về mặt kinh nghiệm, chắc chắn bạn sẽ gặp khó khăn với việc viết CV để gây ấn tượng với nhà tuyển dụng.

Đó là lý do tại sao bạn nên ghé qua kênh này. Joshua Fluke sẽ giúp bạn cách viết CV xin việc tốt hơn cũng như nhiều thứ khác nữa.

Bạn có thể xem qua kênh Joshua Fluke tại đây.

freeCodeCamp

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.

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.

Traversy Media

Một kênh được khá nhiều người ưa thích trong danh sách này chính là Traversy Media (thuộc quyền sở hữu của Brad Traversy). Đây quả thật là một kênh rất tuyệt vời. Với 60 triệu lượt xem trên kênh đã đủ để chứng minh cho điều này.

Traversy Media có các hướng dẫn trực tuyến về lập trình và phát triển web tốt nhất cho tất cả các công nghệ web mới nhất hiện nay như Node.js, Angular, React.js, PHP, Rails, HTML, CSS và còn nhiều hơn thế nữa.

Bạn có thể xem qua kênh Traversy Media tại đây.

Phần kết luận

Sử dụng kênh Youtube học lập trình chưa bao giờ là một ý kiến tồi, nhưng việc tìm cho mình một kênh để học tập hiệu quả nhất thì thật sự rất mất thời gian. Bên trên là 10 kênh Youtube mà TopDev đã tổng hợp lại, hi vọng sau bài viết này các bạn đã có bí quyết học tập tốt nhất cho bản thân.

Bạn đang tìm việc làm Web Developer hay việc làm designer? Xem ngay tại TopDev

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