Home Blog Page 45

Database Administrator là gì? Làm thế nào để trở thành một DBA giỏi?

Database Administrator là gì? Làm thế nào để trở thành DBA giỏi?

Trong thời đại số hóa ngày càng phát triển như hiện nay, dữ liệu được coi là tài sản vô giá của các tổ chức và doanh nghiệp. Vì thế, việc quản lý và bảo vệ dữ liệu trở thành một nhu cầu cấp thiết. Đó là lý do vì sao vai trò của Database Administrator (DBA) ngày càng trở nên quan trọng. Trong bài viết này, chúng ta sẽ cùng tìm hiểu chi tiết hơn về vai trò của DBA, các nhiệm vụ và kỹ năng cần thiết để trở thành một DBA thành công.

Thế nào là một Database Administrator (DBA)?

Database Administrator

Database Administrator (DBA) là một chuyên gia quản trị cơ sở dữ liệu, có trách nhiệm quản lý và bảo vệ cơ sở dữ liệu của một tổ chức hoặc doanh nghiệp. Các nhiệm vụ của một DBA bao gồm thiết kế, triển khai, vận hành, bảo trì, sao lưu và khôi phục cơ sở dữ liệu. DBA cũng phải đảm bảo tính toàn vẹn, an ninh và hiệu suất của cơ sở dữ liệu, đồng thời là người đóng vai trò quan trọng trong việc hỗ trợ các ứng dụng và người dùng cuối sử dụng dữ liệu.

Công việc cụ thể của một Database Administrator

Công việc của một Database Administrator (DBA) bao gồm nhiều tác vụ khác nhau, ví dụ như:

  • Thiết kế cơ sở dữ liệu: DBA phải thiết kế cấu trúc cơ sở dữ liệu, lựa chọn các phương thức lưu trữ và cấu hình hệ quản trị cơ sở dữ liệu (DBMS) phù hợp với nhu cầu của tổ chức.
  • Triển khai cơ sở dữ liệu: DBA phải cài đặt và cấu hình hệ quản trị cơ sở dữ liệu, tạo ra các bảng, quan hệ, chỉ mục và khóa để đảm bảo tính toàn vẹn và hiệu suất của cơ sở dữ liệu.
  • Vận hành cơ sở dữ liệu: DBA phải đảm bảo rằng cơ sở dữ liệu luôn hoạt động một cách ổn định và hiệu quả. Điều này bao gồm quản lý bộ nhớ đệm, giám sát tài nguyên và xử lý các sự cố kỹ thuật.
  • Bảo trì cơ sở dữ liệu: DBA phải thực hiện các tác vụ bảo trì như kiểm tra, sửa chữa và tối ưu hóa cơ sở dữ liệu. Nó cũng bao gồm việc tạo sao lưu và khôi phục cơ sở dữ liệu, cập nhật phần mềm và bảo mật.
  • Tối ưu hóa hiệu suất: DBA phải tối ưu hóa hiệu suất của cơ sở dữ liệu bằng cách tối ưu hóa câu lệnh truy vấn, sử dụng các chỉ mục phù hợp và điều chỉnh cấu hình hệ thống.
  • Giám sát và báo cáo: DBA phải giám sát và báo cáo về hiệu suất, sử dụng tài nguyên và các sự cố trong cơ sở dữ liệu. Việc này giúp DBA phát hiện các vấn đề sớm và đưa ra giải pháp để giải quyết chúng.
  • Hỗ trợ người dùng: DBA phải hỗ trợ người dùng trong việc truy cập và sử dụng cơ sở dữ liệu một cách hiệu quả. Điều này bao gồm giải đáp các câu hỏi, đào tạo người dùng và cung cấp các hướng dẫn sử dụng.

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

Database Administrator cần có những kỹ năng gì?

Database Administrator skills
Nguồn ảnh: https://www.freelancermap.com/blog/what-does-database-administrator-do/

Để trở thành một Database Administrator (DBA) giỏi, bạn cần phải có những kỹ năng sau đây:

  • Kiến thức về cơ sở dữ liệu: DBA cần phải hiểu về cấu trúc cơ sở dữ liệu, các phương thức lưu trữ, mô hình quan hệ và ngôn ngữ truy vấn SQL.
  • Kiến thức về hệ thống và mạng: DBA cần phải hiểu về hệ thống máy tính, hệ điều hành, mạng và bảo mật để có thể thiết lập và quản lý các máy chủ và mạng kết nối cơ sở dữ liệu.
  • Kỹ năng quản lý dự án: DBA cần phải có khả năng quản lý dự án để có thể lập kế hoạch, triển khai và vận hành cơ sở dữ liệu một cách hiệu quả.
  • Kỹ năng giải quyết vấn đề: DBA cần phải có khả năng phân tích và giải quyết các vấn đề kỹ thuật trong cơ sở dữ liệu, từ việc sửa lỗi đến tối ưu hóa hiệu suất.
  • Kỹ năng lập trình: DBA cần phải hiểu về các ngôn ngữ lập trình để có thể tùy chỉnh và viết các công cụ và chương trình để quản lý cơ sở dữ liệu.
  • Bên cạnh đó, một Database Administrator cần phải thông thạo nhiều ngôn ngữ truy vấn, bao gồm: PL/SQL, SQL/XML (ngôn ngữ truy vấn có cấu trúc), OQL (ngôn ngữ truy vấn đối tượng), CQL (ngôn ngữ truy vấn Cassandra).

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

Muốn trở thành DBA nên bắt đầu từ đâu?

Nếu bạn muốn theo nghề DBA, có một số bước cơ bản để bắt đầu:

  • Học tập kiến thức cơ bản về cơ sở dữ liệu: Bạn cần phải nắm vững kiến thức về cơ sở dữ liệu, bao gồm các khái niệm về lưu trữ, truy xuất, sửa đổi và xóa dữ liệu. Bạn có thể bắt đầu học tập qua các khóa học trực tuyến, các sách và tài liệu về cơ sở dữ liệu.
  • Học SQL: SQL là ngôn ngữ truy vấn cơ sở dữ liệu phổ biến nhất, vì vậy hãy học và luyện tập kỹ năng sử dụng SQL để truy vấn, sửa đổi và xóa dữ liệu.
  • Tìm hiểu về các hệ quản trị cơ sở dữ liệu (DBMS): Các hệ quản trị cơ sở dữ liệu như MySQL, Oracle, SQL Server, PostgreSQLMongoDB là các công cụ quan trọng mà DBA sử dụng hàng ngày.
  • Học các kỹ năng liên quan đến quản lý dữ liệu: Bạn cần phải biết cách sao lưu dữ liệu, phục hồi dữ liệu và bảo vệ dữ liệu khỏi sự tấn công và mất mát.
  • Tham gia các khóa học và chứng chỉ về DBA: Các khóa học và chứng chỉ liên quan đến DBA như Oracle Certified Associate, MCSA: SQL Server, và MongoDB Certified DBA sẽ giúp bạn nắm vững các kỹ năng và kiến thức cần thiết để trở thành một DBA chuyên nghiệp.
  • Tìm kiếm các cơ hội thực tập hoặc làm việc: Hãy tìm kiếm các cơ hội thực tập hoặc làm việc liên quan đến DBA để có thể thực hành và tích lũy kinh nghiệm.

  ORM và SQLAlchemy — ‘chiếc đũa thần’ trong quản trị cơ sở dữ liệu

Những bước trên là những bước cơ bản để bắt đầu theo đuổi nghề DBA. Tuy nhiên, để trở thành một DBA chuyên nghiệp, bạn cần phải tiếp tục học tập, rèn luyện kỹ năng và tích lũy kinh nghiệm trong lĩnh vực này.

Cơ hội nghề nghiệp của Database Administrator

Cơ hội nghề nghiệp của Database Administrator

Với sự phát triển nhanh chóng của công nghệ thông tin và dữ liệu ngày nay, vai trò của Database Administrator (DBA) ngày càng trở nên quan trọng hơn bao giờ hết. Vì vậy, cơ hội nghề nghiệp của DBA cũng rất tiềm năng và hấp dẫn.

Nếu lựa chọn theo đuổi Database Administrator, bạn có thể làm các công việc sau đây:

  • Quản lý cơ sở dữ liệu cho các doanh nghiệp: Đây là công việc chính của DBA, nơi họ phải quản lý và bảo vệ cơ sở dữ liệu của doanh nghiệp.
  • Tư vấn về cơ sở dữ liệu cho các công ty: DBA có thể làm việc như một chuyên gia tư vấn để giúp các công ty thiết lập và vận hành hệ thống cơ sở dữ liệu.
  • Giảng dạy và đào tạo: DBA có thể trở thành giáo viên hoặc huấn luyện viên để giảng dạy các kỹ năng về cơ sở dữ liệu cho sinh viên hoặc nhân viên trong các doanh nghiệp.
  • Phát triển phần mềm quản lý cơ sở dữ liệu: DBA có thể phát triển các công cụ quản lý cơ sở dữ liệu để giúp đỡ các DBA khác trong việc quản lý cơ sở dữ liệu.
  • Tham gia vào các dự án liên quan đến Big Data: Với sự gia tăng của Big Data, DBA có thể tham gia vào các dự án liên quan đến phân tích dữ liệu, khai thác dữ liệu, và cải tiến hiệu suất của cơ sở dữ liệu.
  • Quản lý cơ sở dữ liệu đám mây: Với sự phát triển của công nghệ đám mây, DBA cũng có thể trở thành một chuyên gia về quản lý cơ sở dữ liệu đám mây cho các doanh nghiệp.
  • Nghiên cứu và phát triển mới: DBA có thể tham gia vào các dự án nghiên cứu và phát triển mới trong lĩnh vực cơ sở dữ liệu, đặc biệt là liên quan đến các công nghệ mới như Blockchain hay Machine Learning.

Tóm lại

Database Administrator là người chịu trách nhiệm quản lý và bảo vệ cơ sở dữ liệu cho các tổ chức, và đó là một công việc quan trọng trong môi trường kinh doanh hiện đại. Điều này đòi hỏi DBA phải có nhiều kỹ năng và năng lực, từ kiến thức kỹ thuật sâu rộng đến khả năng phân tích, giải quyết vấn đề, và giao tiếp hiệu quả.

Ngoài ra, cơ hội nghề nghiệp của DBA rất đa dạng và tiềm năng, từ quản lý cơ sở dữ liệu cho các doanh nghiệp đến tham gia vào các dự án liên quan đến Big Data hay cơ sở dữ liệu đám mây. Với sự phát triển không ngừng của công nghệ thông tin và dữ liệu, nghề DBA đang trở thành một trong những nghề hot trong ngành công nghệ thông tin, và cơ hội nghề nghiệp của DBA sẽ chỉ tiếp tục tăng lên trong tương lai.

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

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

Câu hỏi phỏng vấn Solution Architect không nên bỏ lỡ

Câu hỏi phỏng vấn Solution Architect không nên bỏ lỡ

Solution Architect là một vị trí rất quan trọng trong các tổ chức, công ty phần mềm hay phát triển sản phẩm, đóng vai trò quyết định đến sự thành công của một dự án hay một sản phẩm. Vị trí Solution Architect thường đòi hỏi kinh nghiệm làm việc ở trong ngành từ trên 5 năm cùng với những kiến thức chuyên sâu liên quan đến kiến trúc hệ thống và các nguyên tắc thiết kế. Hôm nay chúng ta cùng nhau điểm qua những câu hỏi phỏng vấn mà nhà tuyển dụng thường hỏi cho vị trí Solution Architect nhé.

Solution Architect là gì?

Solution Architect

Solution Architect (SA) hay kiến trúc sư giải pháp phần mềm là người có vai trò đưa ra giải pháp, tính năng của sản phẩm phục vụ và đáp ứng theo yêu cầu của khách hàng. Đối với một sản phẩm phần mềm luôn có những yêu cầu về mặt chức năng (functional) và phi chức năng (non-funtional); SA sẽ phải đưa ra giải pháp dành cho kiến trúc nhằm đáp ứng được các yêu cầu trên, đồng thời còn phải khả thi với các yếu tố về chi phí, công nghệ, con người phù hợp với tổ chức của mình.

Trong quá trình phát triển dự án, SA ban đầu cũng tham gia vào giai đoạn lấy yêu cầu từ khách hàng; tiếp đó là công việc đưa ra giải pháp từ những yêu cầu trên. Quá trình thực thi dự án, Solution Architect cũng tham gia vào quá trình phân tích nghiệp vụ như một BA (Business Analyst). Đối với những dự án phức tạp và quy mô lớn, có thể nói SA đóng vai trò quan trọng ảnh hưởng đến sự thành công trong suốt quá trình phát triển của sản phẩm.

Nhiệm vụ của một Solution Architect là gì?

Một Solution Architect sẽ có những nhiệm vụ như dưới đây:

  • Tham gia phân tích nghiệp vụ và đề xuất điều chỉnh nghiệp vụ nếu cần nhằm tăng giá trị, tính khả thi của sản phẩm, dự án hay phần mềm.
  • Đưa ra các giải pháp kiến trúc có thể đáp ứng được các yêu cầu về tính năng và phi tính năng của sản phẩm và khách hàng.
  • Tham gia triển khai phát triển sản phẩm từ phần lõi (core), những phần xử lý phức tạp hay đưa ra các prototype về code cho team phát triển.
  • Chuyển giao lại cho Team phát triển về giải pháp, công nghệ hay kiến trúc của hệ thống.
  • Xử lý các vấn đề khó phát sinh liên quan đến kiến trúc, giải pháp trong quá trình phát triển hay vận hành.

  Trở thành Solution Architect có khó không?

  Đâu là điểm khác biệt giữa Solution Architect và Software Architect?

Phương pháp thiết kế hướng miền Domain Driven Design là gì?

Domain Driven Design (DDD) là một cách tiếp cận để phát triển những phần mềm thông qua sự kết nối chặt chẽ giữa việc triển khai ứng dụng với sự phát triển của mô hình kinh doanh

Cụ thể là:

  • Đặt trọng tâm dự án vào nghiệp vụ chính (domain) và các logic của nghiệp vụ.
  • Mô hình hóa là trọng tâm, nền tảng cho các thiết kế phức tạp để khách hàng cùng lập trình viên đều có thể hiểu được vấn đề.
  • Các vấn đề chung được xác định và giải quyết nhờ sự cộng tác giữa nhóm phát triển và các chuyên gia nghiệp vụ.

Giải thích về nguyên tắc SOLID

nguyên tắc SOLID
Nguồn https://javascript.plainenglish.io/solid-principle-in-react-11272c41b529

SOLID là viết tắt của 5 nguyên tắc thiết kế trong công nghệ phần mềm giúp làm cho các thiết kế hướng đối tượng trở nên dễ hiểu, linh hoạt và dễ bảo trì hơn. 5 nguyên tắc bao gồm:

  • Single responsibility principle: Mỗi class chỉ nên giữ 1 trách nhiệm duy nhất
  • Open/closed principle: Có thể mở rộng 1 class thoải mái, nhưng không được sửa đổi bên trong class đó
  • Liskov Substitution principle: trong một chương trình, các object của class con có thể thay đổi class cha mà không làm thay đổi tính đúng đắn của chương trình
  • Interface Segregation principle: Thay vì dùng một interface lớn, ta nên tách thành nhiều interface nhỏ cho từng mục đích cụ thể
  • Dependency Inversion principle: Các module cấp cao không nên phụ thuộc vào modules cấp thấp mà cả 2 nên phụ thuộc vào abstraction

Tham khảo thêm các vị trí tuyển dụng Solution Architect lương cao tại Topdev

Nêu một số nguyên tắc thiết kế phần mềm khác mà bạn biết

Một số nguyên tắc thiết kế phần mềm thường được áp dụng hay kết hợp trong dự án:

  • Nguyên tắc YAGNI: You Aren’t Gonna Need It – chỉ cần tập trung xây dựng chức năng để giải quyết vấn đề hiện tại, vấn đề mà khách hàng cần giải quyết mà không cần lãng phí thời gian vào một chức năng “Có thể sử dụng đến”
  • Nguyên tắc KISS: Keep It Simple Stupid – Mục tiêu trọng tâm trong thiết kế là sự đơn giản và rõ ràng; cần tránh những thứ phức tạp không cần thiết.
  • Nguyên tắc DRY: Don’t Repeat Yourself – Đừng lặp lại bất cứ một đoạn mã, đoạn code nào mà hãy đóng gói nó thành những phương thức riêng để khi nào cần thì chỉ cần gọi tên nó ra.

So sánh kiến trúc Monolith và Microservice

So sánh kiến trúc Monolith và Microservice

Monolith và Microservice là 2 loại kiến trúc phần mềm (thông thường áp dụng cho Web) phổ biến hiện nay. 

  • Monolith hay kiến trúc một khối là mẫu thiết kế xây dựng hệ thống thành một đơn vị phần mềm không thể chia tách; thông thường sẽ bao gồm cơ sở dữ liệu (databases), giao diện người dùng (frontend) và ứng dụng phía máy chủ (backend). Tất cả các thành phần của phần mềm được hợp nhất và tất cả các chức năng của phần mềm được quản lý ở một nơi.
  • Microservice là mẫu kiến trúc xây dựng hệ thống từ các component đảm nhiệm từng vai trò cụ thể khác nhau, liên kết giữa các component này khá lỏng lẻo (loose coupling). Các components có thể được phát triển, kiểm thử, deploy, cập nhật,… một cách độc lập mà không ảnh hưởng đến các component khác. Ngoài ra các components có thể được phát triển, xây dựng bằng các ngôn ngữ lập trình, công nghệ riêng mà không bị ràng buộc từ hệ thống chung.

Trong thực tế dự án, Monolith thường được lựa chọn cho các dự án nhỏ và vừa nhờ tính đơn giản từ việc phát triển và bảo trì. Đối với các dự án lớn, Microservice là một xu hướng hiện nay, giúp các tổ chức dễ dàng quản trị và giảm sự phụ thuộc rủi ro giữa nhiều dịch vụ khác nhau.

Những chứng chỉ phổ biến dành cho Solution Architect

  • Amazon AWS Certified Solutions Architect: Chứng chỉ dành cho các kiến trúc sư giải pháp của AWS. Có 3 levels cho chứng chỉ này: Foundational, Associate và Professional.
  • Azure Solutions Architect Expert: Chứng chỉ chuyên môn về thiết kế và triển khai các giải pháp chạy trên Microsoft Azure bao gồm các khía cạnh như compute, mạng, lưu trữ và bảo mật.
  • Chứng chỉ ITIL: chứng chỉ chuyên gia công nghệ thông tin với 5 mức cơ bản. Với một SA thì có 2 levels có giá trị cao là ITIL Master và ITIL Expert.
  • Google Cloud Architect Certified: Chứng chỉ xác nhận kỹ năng làm việc với nền tảng đám mây Google Cloud dành cho các Solution Architect.

Kết bài

Trên đây là danh sách những câu hỏi phỏng vấn mà bạn có thể gặp phải khi ứng tuyển vị trí Solution Architect. Đây là vị trí có mức thu nhập và đãi ngộ cao trong ngành IT, vì vậy các ứng viên cũng cần có kinh nghiệm và kỹ năng tốt liên quan đến thiết kế và các giải pháp công nghệ phần mềm. Hy vọng bài viết này hữu ích dành cho bạn và hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

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

WebAssembly – Tương lai của các ứng dụng Web

WebAssembly – Tương lai của các ứng dụng Web

Nhắc đến lập trình ứng dụng Web thì gần như mặc định chúng ta nghĩ ngay đến 3 loại ngôn ngữ là HTML, CSSJavaScript. Mặc dù được cải tiến rất nhiều cùng với sự phát triển mạnh mẽ của JavaScript nhưng Web app vẫn chưa bao giờ được xem là đối thủ khi so sánh với Native app ở khía cạnh hiệu năng. Từ hạn chế này thì các ông lớn nắm giữ trình duyệt phổ biến nhất hiện tại đã hợp tác cho ra một ngôn ngữ mới đó là WebAssembly. Bài viết hôm nay chúng ta cùng tìm hiểu về ngôn ngữ này xem liệu đây có phải là tương lai của các ứng dụng Web hay không nhé.

WebAssembly là gì?

WebAssembly

WebAssembly viết tắt là Wasm là một định dạng tập lệnh nhị phân cho các máy ảo dựa trên ngăn xếp (stack-based), nó được thiết kế để có thể biên dịch từ các ngôn ngữ bậc cao như C/C++/Rust và thực thi trên các ứng dụng Web ở cả client và server.

Wasm là thành quả của sự hợp tác giữa những ông lớn công nghệ sở hữu trình duyệt phổ biến nhất hiện nay gồm Microsoft, Apple, Google, Mozilla,… điều đó cũng có nghĩa là Wasm sẽ có thể hỗ trợ tốt nhất trên các trình duyệt này trong tương lai. 

WebAssembly được ra mắt từ 2015, hiện nay thì version 1.0 đã được triển khai trên 4 trình duyệt phổ biến nhất Firefox, Chrome, Safari và Edge. Tháng 4/2022, version 2.0 của Wasm được công bố ở trạng thái dự thảo hứa hẹn sẽ ra mắt trong tương lai gần.

WebAssembly hoạt động thế nào?

Với các trình duyệt hiện tại, để máy tính có thể hiểu và thực thi được các đoạn code bằng JavaScript thì các trình duyệt được trang bị JavaScript Engine để chuyển đổi sang mã máy. Cụ thể chúng ta có các JS Engine của các trình duyệt phổ biến:

  • V8: JS Engine dành cho trình duyệt Chrome hay các trình duyệt sử dụng nhân Chromium
  • JavaScriptCore: được Apple sử dụng cho Safari
  • SpiderMonkey: JS Engine sử dụng trong trình duyệt Firefox
  • Chakra/Chakra Core: JScript Engine được sử dụng cho IE (Internet Explore) và Microsoft Edge trước đây

WebAssembly

Ở đây những dòng code JS (viết trong các JS files) sẽ được đọc và thực thi theo cơ chế thông dịch – tức là đọc từng dòng code, dịch trực tiếp ra mã máy để máy tính hiểu và thực thi.

WebAssembly cũng sẽ được thực thi một cách tương tự như trên, tuy nhiên ưu điểm của nó chính là việc định dạng nhị phân ngay từ đầu vào giúp tốc độ đọc code nhị phân của máy ảo nhanh hơn nhiều cũng như việc dịch code Wasm ra mã máy tương ứng theo từng loại hệ điều hành và CPU thiết lập trước đem lại ít overhead hơn. 

WebAssembly

Với WebAssembly, mã nguồn (source code) sẽ được viết bằng các ngôn ngữ lập trình bậc cao như C/C++, Rust,… sau đó biên dịch về định dạng nhị phân (.wasm). Những file này sẽ được nạp vào trình duyệt rồi nhờ các JavaScript Engine biên dịch tạo ra mã máy để thực thi.

  Mô hình ngôn ngữ LaMDA – Công nghệ đứng sau chatbot AI Bard của Google

  Digital Twins – xu hướng công nghệ cho ngành IoT

Trạng thái hiện tại

WebAssembly sinh ra với sứ mệnh là giải quyết bài toán hiệu năng của JavaScript, tận dụng sức mạnh tính toán ở phía thiết bị của người dùng, đặc biệt là những tác vụ cần tương tác với phần cứng hoặc xử lý đa phương tiện. WASM được thiết kế dành cho các JavaScript Engine, điều đó cũng có nghĩa là nó không thay thế cho JavaScript mà được xem như là sự bổ sung và cải tiến. Phiên bản 1.0 hiện tại thì WASM vẫn cần JavaScript để thực thi.

WebAssembly

Về hiệu năng, trên lí thuyết thì việc dịch các bytecode của WASM sẽ mang lại tốc độ nhanh hơn gấp 20 lần so với quá trình tương tự với JavaScript. Mặc dù vậy việc tối ưu WASM sẽ phụ thuộc vào sự hỗ trợ của JavaScript Engine trên từng trình duyệt. Như biểu đồ so sánh hiệu năng ở trên, hiện tại Firefox đang là trình duyệt hỗ trợ WASM tốt nhất, các trình duyệt Chrome và Edge vẫn đang trong quá trình cập nhật thêm.

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

Cách sử dụng WebAssembly

Nếu bạn muốn thử nghiệm một đoạn code WebAssembly thì hãy đi theo các bước sau:

  • Viết đoạn mã code bằng ngôn ngữ C, C++ sử dụng IDE hỗ trợ WebAssembly như WebAssembly Explorer.
  • Biên dịch source code bạn viết thành WebAssembly, đầu ra sẽ là những file có đuôi là .wasm (trình biên dịch được IDE hỗ trợ sẵn).
  • Tích hợp file .wasm vào dự án Web của bạn, cụ thể là bạn có thể để chung thư mục với các file index.html (HTML), style.css (CSS) hay script.js (JavaScript).
  • Trong phần xử lý JavaScript của Web, chúng ta thực hiện load các file .wasm thông qua function fetch và gọi các function đã được viết trong WebAssembly. JavaScript sẽ giúp chúng ta load ra các function đó và thực thi chúng trên trình duyệt.

WebAssembly

Kết bài

Tuy hiện tại WebAssembly mới chỉ đang ở giai đoạn sản phẩm tối thiểu, mang tính chất thử nghiệm hơn là việc áp dụng trong thực tế dự án; nhưng rõ ràng WASM có một tương lai hứa hẹn và đảm bảo nhờ sự chung tay của các ông lớn đứng sau các trình duyệt phổ biến. Tương lai của WebAssembly nếu giải quyết được vấn đề hiệu năng đặt ra của Web app thì không chỉ giúp nó sánh ngang được với Native app mà còn mở ra tiềm năng cho việc sử dụng rất nhiều ngôn ngữ lập trình khác nhau từ C, Java, Python,… cũng có thể làm Web một cách trực tiếp. Chúng ta sẽ không cần phải chờ đợi lâu nữa vì version 2.0 của WebAssembly đang ở bản dự thảo (Draft version) hứa hẹn sẽ ra mắt trong tương lai gần. 

Cảm ơn các bạn đã đọc bài viết, hẹn gặp lại các bạn trong những bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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


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

 

Tìm kiếm việc làm IT mới nhất tại TopDev!

Top 5 câu hỏi phỏng vấn Scrum Master “khó nhằn” & cách trả lời

Top 5 câu hỏi phỏng vấn Scrum Master

Scrum master là vị trí quan trọng trong team phát triển phần mềm, vậy phỏng vấn Scrum master có gì khó? Những kiến thức nào cần được trình bày khi bạn phỏng vấn vị trí Scrum master?

Tất cả sẽ được liệt kê qua 3 phần của bài viết. Phần 1 do nội dung khá giới hạn nên gửi tới anh em 5 câu hỏi trước.

Phỏng vấn scrum masterVâng, anh em không có gì đâu phải trầm trồ

1. Sự khác biệt giữa Agile và Scrum là gì?

Câu hỏi thứ nhất phỏng vấn Scrum Master đề cập tới định nghĩa. Phân biệt sự khác nhau giữa Agile và Scrum. Vậy chúng có gì giống và khác nhau.

Agile Scum
Là một tập hợp các nguyên tắc lặp đi lặp lại và tăng dần. Nó là triển khai của Agile methodology (phương pháp Agile)
Nó phù hợp cho nhóm nhỏ các thành viên đều là Senior Được sử dụng cho các nhóm mà sản phẩm hoặc yêu cầu cần sự thay đổi liên tục
Project head đảm nhận các nhiệm vụ quan trọng đối với thành công hay thất bại của dự án Không có leader, các vấn đề được xử lý bởi scrum master và các thành viên (member)
Nêu có các thay đổi, các thay đổi sẽ khó cập nhật nhanh chóng Nhóm có thể xử lý nhanh và đối ứng các thay đổi
Yêu cầu gửi demo cho end-user nhiều lần Cung cấp các bản demo theo từng Sprint cho người dùng cuối

Vì là kiến thức cơ bản nên anh em có thể chuẩn bị thêm một số câu hỏi

  • Định nghĩa các role trong scrum
  • Product backlog và Sprint backlog khác gì nhau?
  • Scrum ban là gì?

  Quản lý dự án theo Agile và Scrum cho người mới bắt đầu
  Quy trình phát triển phần mềm

Phỏng vấn scrum master

2. Sprint 0 và Spike là gì?

Câu hỏi thứ hai phỏng vấn Scrum master vẫn liên quan tới định nghĩa. Tuy là câu hỏi dễ nhưng không nhiều Scrum master áp dụng Sprint 0 vào thực tế khi phát triển phần mềm.

Về định nghĩa thì”

Sprint 0 refers to the small amount of effort put in to create a rough skeleton of the product backlog. It also includes insights towards estimating the release of products. Sprint 0 is required for: Sprint 0 đề cập tới lượng nhỏ nỗ lực của team để tạo ra phần thô cho product backlog. Sprint 0 yêu cầu hiểu biết sâu sắc về quy trình phát triển sản phẩm. Thường thì Sprint 0 sẽ bắt buộc trong một số trường hợp sau:

  • Tạo khung cho dự án
  • Dữ cho thiết kế đơn giản
  • Định nghĩa một số stories cơ bản
  • Dự án phần mềm không có quá nhiều yêu cầu về mặt kĩ thuật

Phỏng vấn scrum master

Spike là tập hợp một số hoạt động liên quan tới research, investigation, POCs, giúp giảm rủi ro khi bước vào phát triển phần mềm thực tế.

Một số câu hỏi anh em có thể xem thêm chuẩn bị cho phần này:

  • Scrum of Scrums là gì?
  • User-Story Mapping là gì?

3. Những kĩ năng chính cần có của Scrum Master?

Câu hỏi thứ 3 phỏng vấn Scrum master đề cập tới kỹ năng cần có của Scrum master. Câu hỏi này ngoài những định nghĩa thông thường theo sách vở. Anh em có thể trình bày thêm những tố chất mà Scrum master cần có để tham gia dự án.

Một số kĩ năng chính cần có của  bao gồm:

  • Hiểu biết sâu về các khái niệm Scrum, mô hình Agile
  • Các kỹ năng liên quan đến tổ chức, đội nhóm
  • Triển khai cho team theo mô hình Scrum, grow up toàn bộ team sau một thời gian ứng dụng Scrum
  • Xử lý xung đột trong team, giải quyết và lên phương án giải quyết các vấn đề cùng team

Phỏng vấn scrum master

Một số câu hỏi anh em có thể tham khảo và chuẩn bị cho phần này:

  • Bạn xử lý xung đột trong team như thế nào?
  • Làm sao để xác định đúng Velocity của một team?

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

4. Nếu một team đang gặp khó khăn, bạn sẽ làm gì để giúp họ?

Câu hỏi phỏng vấn Scrum master thứ 4 liên quan tới kinh nghiệm thực tế của scrum master. Hơn nữa vị trí này đòi hỏi cách xử lý, cũng như ứng xử trong team cực kì linh hoạt.

Chính vì vậy, câu hỏi này nhắm tới kĩ năng thực tế, giải quyết những vấn đề đã gặp trong thực tế khi làm việc.

Câu trả lời có thể đưa ra theo trình dự dưới đây:

  • Xác định vấn đề gây ra khó khăn. Tìm hiểu nguyên nhân gốc rễ
  • Tìm giải pháp, gặp gỡ từng thành viên trong nhóm để tìm hiểu cặn kẽ hơn
  • Tổ chức họp để nêu giải pháp và lấy ý kiến của tất cả các thành viên trong nhóm

Câu trả lời cần nêu bật lên được Scrum Master đã cố gắng đảm bảo rằng tất cả mọi người hiểu được tầm quan trọng của sự hợp tác và giao tiếp trong team.

Một số câu hỏi tình huống khác anh em có thể tham khảo qua:

  • Đưa ra ví dụ về thời điểm bạn giúp đỡ team trải qua khó khăn, thử thách.
  • Bạn mô tả về vai trò của scrum master trong nhóm như thế nào?

5. Làm thế nào để giao tiếp khi có nhiều Scrum team?

Câu hỏi cuối cùng phỏng vấn Scrum master liên quan tới việc scale up. Với một team, anh em làm tốt. Nhưng nếu dự án lớn và có nhiều Scrum team?

Hoặc đơn cử như khách hàng có nhiều Scrum team để phát triển các domain khác nhau?. Lúc này việc giao tiếp giữa các Scrum team trở thành vấn đề.

Phỏng vấn scrum master

Một trong những cách phổ biến giải quyết cho việc giao tiếp giữa nhiều team là Scrum of Scrums meeting. Cuộc họp này là cuộc họp giữa các Scrum master hoặc người đại diện của nhóm, nơi các thành viên đại diện cùng nhau thảo luận về tiến độ, hiệu suất, rủi ro, dự định sắp tới. Tần suất của các cuộc họp như này cần được xác định trước.

Ngoài ra cần thêm vị trí Chief Scrum Master, điều phối cuộc họp giữa các Scrum master. Người này cần linh động, điều phối tốt cuộc họp giữa các Scrum master.

Một số câu hỏi anh em chuẩn bị:

  • Trường hợp có stakeholder khó tính, bạn phải làm thế nào?
  • Ba trụ cột của Scrum là gì?
  • Làm sao đảm bảo User stories khớp với requirement

6. Tham khảo thêm câu hỏi phỏng vấn Scrum master

Anh em tham khảo thêm để chuẩn bị tốt cho buổi phỏng vấn Scrum master nha. Chúc anh em may mắn

Cảm ơn anh em đã đọc bài – Thank you for your time – Happy coding!

Tác giả: Kiên Nguyễn

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

5 câu hỏi phỏng vấn Ruby on Rails Developer hay, thường gặp

5 câu hỏi phỏng vấn Ruby on Rails Developer hay, thường gặp

Ruby on Rails từ lâu đã được xem như viên hồng ngọc trong giới ngôn ngữ lập trình, vậy phỏng vấn Ruby on Rails có gì khó?

Bài viết này, với 5 câu hỏi ở phần 1 mong muốn đem tới cho anh em một số câu hỏi cơ bản phỏng vấn Ruby on Rails. Ở các phần tiếp theo sẽ đi sâu hơn vào từng phần và các phần kiến thức cần nắm chắc.

Phỏng vấn ruby on railsRuby on Rails là như này sao?

Bắt đầu thôi nào anh em! Còn chần chừ gì nữa mà không đi hái quả ngọt!

1. Sub-directory app/controllers và helper

Câu hỏi đầu tiên phỏng vấn Ruby on Rails là khái niệm cơ bản về sub-directory. Trả lời cho câu hỏi này:

App/controllers – Phần này xử lý web request từ user, đưa tới controller. Các thư mục con (sub-directory) là nơi Rails tìm kiếm các Controller class.

Phỏng vấn ruby on rails

App/helpers – Các thư mục con app/helper classs sử dụng để hỗ trợ cho view, model và các class controller khác.

Một số câu hỏi anh em có thể chuẩn bị thêm trong phần này:

  • Sự khác biệt giữa String và Symbol trong Rails?
  • Rails Active Record là gì trong Ruby on Rails?

  Làm thế nào để xây dựng social network bằng Ruby on Rails
  Mẫu bảng mô tả công việc lập trình Ruby on Rails

2. Rails Migration có những tính năng nào?

Câu hỏi thứ hai phỏng vấn Ruby on Rials liên quan tới kinh nghiệm thức tế của ứng viên khi làm việc với Ruby on Rails. Phần này anh em cứ nêu ra chính xác các function đã sử dụng với Migration trong Ruby on Rails.

Đơn cử có thể liệt kê một số tính năng như sau:

  • create_table(name, options)
  • drop_table(name)
  • rename_table(old_name, new_name)
  • add_column(table_name, column_name, type, options)
  • rename_column(table_name, column_name, new_column_name)
  • change_column(table_name, column_name, type, options)
  • remove_column(table_name, column_name)
  • add_index(table_name, column_name, index_type)
  • remove_index(table_name, column_name)

Phỏng vấn ruby on rails

Một số kinh nghiệm riêng khi sử dụng migration anh em có thể nêu ra:

  • Rollback migration (rails db:rollback)
  • Clean up old migration trước đó (rails db:migrate), nhưng anh em phải xoá hết đi trong folder db/migrations.

Các câu hỏi anh em có thể chuẩn bị thêm:

  • Giải thích Mixin trong Rails
  • Rake trong Rails là gì?
  • Swepper trong Rails

Xem thêm việc làm Ruby các vị trí hấp dẫn trên TopDev

3. Ruby on Rails có ưu điểm gì?

Câu hỏi số 3 phỏng vấn Ruby on Rails chú trọng tới góc nhìn của anh em về ngôn ngữ lập trình. Bản thân Ruby on Rails có gì tốt, lúc nào nên chọn ngôn ngữ này?

Anh em có thể liệt kê ra một số ưu điểm:

  • Cost-effective (Chi phí tốt) – Rails là miễn phí và chạy trên Linux, là mã nguồn mở.
  • Xây dựng trên kiến trúc MVC (Model, View và Controller)
  • Dễ dàng kiểm soát các thay đổi
  • Bảo mật và hiệu năng cao
  • Cộng đồng lớn để hỗ trợ
  • Nhiều plugin miễn phí, khả năng mở rộng cao

Phỏng vấn ruby on rails

Cũng có thể liệt kê các trang web hiện đang sử dụng Ruby on Rails bao gồm:

  • Github
  • AirBnB
  • Shopify

Tuy chỉ hỏi về ưu điểm của Ruby on Rails nhưng anh em có thể nêu luôn nhược điểm, những vấn đề trong thực tế anh em gặp phải với Ruby on Rails. Một số câu hỏi anh em có thể chuẩn bị:

  • Sự khác biệt giữa observers và callbacks?
  • Sự khác biệt giữa static scaffolding và dynamic scaffolding?
  • Strong parameter là gì?

4. CSRF là gì? Rails xử lý CSRF như thế nào?

Câu hỏi thứ 4 phỏng vấn Ruby on Rails liên quan tới CSRF. Về định nghĩa thì CSRF viết tắt của Cross-Site Request Forgery (giả mạo yêu cầu trên trang web). Đây là hình thức tấn công mà kẻ tấn công giả mạo để gửi tới trang web các yêu cầu lấy thông tin nhạy cảm hoặc đánh cắp thông tin.

Nếu anh em đã đăng nhập và được cấp cookies, kẻ tấn công sẽ sử dụng chính cookies đã được cập quyền để tiếp tục đi lấy các dữ liệu nhạy cảm khác. Cookies này thường sẽ được gửi kèm các http request.

Phỏng vấn ruby on rails

Để chống lại CSRF, Ruby on Rails cung cấp protect_from_forgery. Phần này anh em có thể add vào ApplicationController .Sau khi thêm phần này thì Rails application của anh em sẽ luôn yêu cầu CSRF trước khi chấp nhận bất cứ yêu cầu POST, PUT hoặc DELETE nào

Khi có protect_from_forgery, kẻ tấn công có CSRF sẽ bị chặn lại bởi same-origin policy.

Một số câu hỏi anh em có thể tham khảo:

  • Sự khác biệt giữa redirect và render trong Ruby on Rails.
  • Mục đích của RJs trong Rails

5. Ví dụ thực tế

Câu hỏi cuối cùng phỏng vấn Ruby on rails liên quan tới ví dụ thực tế. Giả sử anh em có bảng Student với id = 4. Nếu xoá Student với id = 4 thì kết quả của các câu query là gì?

  • Student.find(4)
  • Student.find_by_id(4)

Do dòng Student với id = 4 đã bị xoá, nên nếu anh em chạy Student.find(4) sẽ xuất hiện lỗi ActiveRecord::RecordNotFound: Couldn’t find Student with id=4

Ngược lại Student.find_by_id(4) sẽ trả về nil và không có bất cứ lỗi nào xuất hiện.

Phần các ví dụ này yêu cầu anh em phải nhớ rõ, phải có kinh nghiệm thực sự ở ngôn ngữ mình đã làm. Nếu không, những câu hỏi này sẽ loại đi những anh em nào không có kinh nghiệm.

Để chuẩn bị tốt cho phần này, anh em nên lọc lại, tập hợp lại kiến thức đã biết

6. Tham khảo phỏng vấn Ruby on Rails

Cảm ơn anh em đã đọc bài – Thank you for your time to read – Happy coding!

Tác giả: Kiên Nguyễn

Xem thêm:

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

Người mới bắt đầu nên học ngôn ngữ lập trình nào?

Người mới bắt đầu nên học ngôn ngữ lập trình nào?

Sinh viên CNTT nên học ngôn ngữ lập trình nào? Một câu hỏi thường gặp của đa số bạn trẻ mới “dấn thân” vào ngành lập trình. Có thể thấy, trong bối cảnh công nghệ đang phát triển mạnh mẽ, học ngôn ngữ lập trình đang trở thành một xu hướng không thể bỏ qua.

Tuy nhiên, việc lựa chọn ngôn ngữ lập trình nào để học trong hơn 200 ngôn ngữ là điều nhiều người đắn đo. Vì vậy, trong bài viết này, chúng ta sẽ cùng tìm hiểu về các lợi ích của việc học ngôn ngữ lập trình và đưa ra những gợi ý hữu ích để giúp bạn lựa chọn ngôn ngữ lập trình phù hợp nhất. Bắt đầu thôi nào!

Ngôn ngữ lập trình có khó học như bạn tưởng?

Ngôn ngữ lập trình có khó học như bạn tưởng?

Học ngôn ngữ lập trình giống như việc học ngoại ngữ, đòi hỏi bạn phải nỗ lực, kiên trì rất nhiều. Mỗi ngôn ngữ lập trình sẽ có những quy luật riêng, cách code khác nhau, tùy vào bạn chọn ngôn ngữ nào để học.

Để nói một môn ngữ lập trình dễ hay khó học còn tùy thuộc vào nhiều yếu tố, bao gồm ngôn ngữ bạn học là gì, mục đích của việc học, phương pháp học như thế nào,…

Nếu bạn chưa từng học lập trình trước đây, việc bắt đầu học ngôn ngữ lập trình mới có thể gặp một số khó khăn. Còn nếu bạn đã có kinh nghiệm về lập trình hoặc đã học một số ngôn ngữ lập trình trước đó, việc học một ngôn ngữ mới có thể dễ dàng hơn nhiều.

Bên cạnh đó, phương pháp học tập cũng có vai trò quan trọng trong việc học ngôn ngữ lập trình. Nếu bạn sử dụng các tài liệu học tập phù hợp và áp dụng phương pháp học hiệu quả, việc học ngôn ngữ lập trình sẽ “dễ thở” hơn. Ngoài ra, cũng cần phải có sự kiên nhẫn, tinh thần cởi mở và sự sẵn sàng để thử nghiệm, tìm hiểu và khám phá.

Tóm lại, việc học ngôn ngữ lập trình có thể không phải là một việc đơn giản, tuy nhiên, nếu bạn có đủ sự cố gắng, thời gian và sử dụng phương pháp học tập phù hợp, việc học ngôn ngữ lập trình sẽ không thể làm khó được bạn.

  [Update] 5 xu hướng tuyển dụng IT 2024 không thể bỏ qua

Sinh viên CNTT nên học ngôn ngữ lập trình nào?

Với những bạn vừa bắt đầu học CNTT, có thể lựa chọn những ngôn ngữ lập trình dễ học, thị trường có nhu cầu cao hoặc mức lương hấp dẫn khi ra trường. Dưới đây là một vài gợi ý dành cho các lập trình viên tương lai.

Java

Java

Java là một ngôn ngữ lập trình rất phổ biến trên thế giới, được sử dụng rộng rãi trong phát triển ứng dụng di động, ứng dụng web, phần mềm máy tính và nhiều lĩnh vực khác. Java tuân thủ theo nguyên tắc hướng đối tượng (OOP), tương tự như trên ngôn ngữ Python, C++, PHP, do đó nếu bạn thành thạo Java thì việc học các ngôn ngữ còn lại khá đơn giản.

Một trong những lợi ích của Java là nó được thiết kế để chạy trên nhiều nền tảng khác nhau, bao gồm các hệ điều hành như Windows, Mac OS và Linux. Java cũng hỗ trợ chạy trên các thiết bị di động bao gồm cả điện thoại di động và máy tính bảng.

Bên cạnh đó, Java cũng có một cộng đồng lập trình viên rất lớn, với nhiều tài liệu, hướng dẫn và ví dụ mã nguồn mở có sẵn để giúp các lập trình viên mới học Java dễ dàng hơn. Đây là một ngôn ngữ lập trình rất đáng để bạn lựa chọn.

  Học IT có khó không? 6 khó khăn khi theo học ngành CNTT

JavaScript

JavaScript là một ngôn ngữ lập trình phổ biến trong lĩnh vực phát triển ứng dụng web. Đây là một ngôn ngữ lập trình dễ học, có cú pháp đơn giản và rõ ràng. Nó cũng cho phép lập trình viên viết mã nguồn ngắn gọn và dễ đọc.

Một trong những lợi ích của JavaScript là nó được hỗ trợ bởi tất cả các trình duyệt web phổ biến như Chrome, Firefox, Safari, và cả Edge, giúp cho các lập trình viên có thể phát triển các ứng dụng web tương thích trên mọi nền tảng. Các công cụ phát triển phần mềm như Visual Studio Code, Atom, và Sublime Text cũng cung cấp hỗ trợ tốt cho JavaScript.

Với nhu cầu xây dựng website trong các công ty, doanh nghiệp ngày càng lớn thì việc học ngôn ngữ JavaScript rất có lợi cho các lập trình viên sau này.

Tổng hợp các việc làm Back-end đang tuyển trên TopDev

C/C++

C/C++

Nếu bạn chưa biết nên học ngôn ngữ lập trình nào thì hãy bắt đầu bằng C/C++. Khi học ngôn ngữ C/C++ thành thạo sẽ giúp bạn tiếp cận các ngôn ngữ lập trình khác dễ dàng hơn. Một trong những lợi ích của C và C++ là hiệu năng cao. Với kiểu dữ liệu đơn giản và cú pháp dễ hiểu, lập trình viên có thể tạo ra các ứng dụng chạy nhanh và tiết kiệm tài nguyên hệ thống. Ngoài ra, C và C++ cũng cung cấp cho lập trình viên khả năng tương tác với phần cứng, điều này cho phép tạo ra các ứng dụng nhúng và hệ thống có hiệu suất tốt.

Mặc dù C/C++ là những ngôn ngữ lập trình khó học hơn so với một số ngôn ngữ khác, nhưng chúng vẫn được coi là một trong những ngôn ngữ lập trình quan trọng nhất và nền tảng cho các lập trình viên. Tuy nhiên, để trở thành một lập trình viên thành thạo C và C++, bạn cần phải có kiến thức cơ bản về toán học và tư duy logic, đồng thời cần phải tìm hiểu và luyện tập nhiều để có thể hiểu rõ hơn về cú pháp và cách sử dụng của ngôn ngữ này.

Python

Python được nhiều lập trình viên chuyên nghiệp khuyến khích nên học cho người mới bắt đầu. Vì Python là một ngôn ngữ lập trình đơn giản và dễ học, được sử dụng rộng rãi trong nhiều lĩnh vực, từ khoa học dữ liệu, trí tuệ nhân tạo, phát triển web cho đến hệ thống nhúng và đồ họa.

Đặc biệt, cú pháp & các câu lệnh trong Python rất đơn giản, dễ hiểu nên được sử dụng nhiều trong giảng dạy và học tập. Ngoài ra, Python cũng có nhiều thư viện mạnh mẽ, đa dạng, giúp cho việc phát triển ứng dụng nhanh chóng và dễ dàng hơn.

Ruby

Ruby là một lựa chọn tuyệt vời cho những ai chưa biết nên học ngôn ngữ lập trình nào. Tương tự như Python, Ruby được xem là dễ đọc, dễ viết, giống như ngôn ngữ tự nhiên, rất thích hợp cho người mới bắt đầu. Nó cũng có nhiều framework hỗ trợ, giúp cho việc phát triển ứng dụng nhanh chóng và dễ dàng hơn.

Ruby được sử dụng rộng rãi trong phát triển web, đặc biệt là trong framework Ruby on Rails. Rails là một trong những framework web phổ biến nhất hiện nay, cung cấp nhiều tính năng mạnh mẽ cho việc phát triển ứng dụng web. Ngoài ra, Ruby cũng được sử dụng trong phát triển trò chơi, đồ họa, trí tuệ nhân tạo và các ứng dụng desktop. Các ứng dụng nổi tiếng được viết bằng Ruby bao gồm GitHub, Airbnb và Shopify.

Nếu bạn đang quan tâm đến phát triển web, đặc biệt là trong framework Ruby on Rails, thì Ruby là một ngôn ngữ lập trình rất tuyệt vời để học tập và phát triển kỹ năng của mình.

Lựa chọn ngôn ngữ lập trình theo mục tiêu công việc

Mảng lập trình Web

lập trình web

  • JavaScript: JavaScript được sử dụng để tạo ra các ứng dụng web động, các hiệu ứng và tính năng tương tác trên các trang web. Nó cũng được sử dụng để phát triển các ứng dụng web phía máy chủ bằng Node.js.
  • HTML/CSS: HTML là ngôn ngữ đánh dấu để tạo ra các trang web, còn CSS được sử dụng để thiết kế giao diện cho các trang web.
  • Python: Python là một ngôn ngữ lập trình đa năng và được sử dụng rộng rãi trong lĩnh vực lập trình web, đặc biệt là trong các framework như DjangoFlask.
  • PHP: PHP là một ngôn ngữ lập trình được sử dụng rộng rãi trong phát triển web và đặc biệt là trong các framework như WordPressLaravel

Mảng lập trình di động

  • Java: Java là ngôn ngữ lập trình phổ biến nhất cho phát triển ứng dụng di động Android. Nó cung cấp các thư viện và công cụ phát triển mạnh mẽ cho việc xây dựng các ứng dụng di động.
  • Swift: Swift là ngôn ngữ lập trình được sử dụng để phát triển ứng dụng cho hệ điều hành iOS của Apple. 
  • Kotlin: Kotlin là một ngôn ngữ lập trình đa năng và được sử dụng để phát triển ứng dụng di động cho hệ điều hành Android. Kotlin được xem là một sự thay thế tiềm năng cho Java trong lĩnh vực phát triển ứng dụng di động.

Mảng trí tuệ nhân tạo (AI)

trí tuệ nhân tạo

  • Python: Python là ngôn ngữ lập trình phổ biến nhất trong lĩnh vực trí tuệ nhân tạo. Nó cung cấp nhiều thư viện và công cụ hỗ trợ cho phát triển các mô hình học máy, xử lý ngôn ngữ tự nhiên và các ứng dụng trí tuệ nhân tạo khác.
  • R: R là một ngôn ngữ lập trình và môi trường tính toán thống kê được sử dụng rộng rãi trong phân tích dữ liệu và trí tuệ nhân tạo. Nó cung cấp các thư viện phân tích dữ liệu và hỗ trợ việc xử lý, mô hình hóa dữ liệu và vẽ biểu đồ.
  • Java: Java cũng được sử dụng trong lĩnh vực trí tuệ nhân tạo, đặc biệt là trong các hệ thống phân tán và lưu trữ dữ liệu.

Mảng lập trình game

  • C++: Đây là một ngôn ngữ lập trình mạnh mẽ và được sử dụng rộng rãi trong việc phát triển các game. C++ có khả năng tương tác với phần cứng và cung cấp hiệu suất cao cho các ứng dụng đòi hỏi tính toán.
  • C#: Là một ngôn ngữ lập trình được phát triển bởi Microsoft và được sử dụng trong phát triển game trên nền tảng Windows và Xbox. 
  • Java: Java cũng được sử dụng trong lĩnh vực game, đặc biệt là trong phát triển game trên nền tảng di động.
  • Python: Python được sử dụng rộng rãi trong việc phát triển các game trên nền tảng web và đặc biệt là trong việc phát triển các trò chơi đơn giản.

Tổng kết

Bài viết đã đưa ra những gợi ý chi tiết cho bạn về các ngôn ngữ lập trình nên học khi bắt đầu. Mỗi ngôn ngữ có ưu điểm và nhược điểm riêng, đồng thời cũng phù hợp với các mục đích và yêu cầu công việc khác nhau. Hy vọng rằng bạn đã tìm được câu trả lời cho câu hỏi sinh viên CNTT nên học ngôn ngữ lập trình nào?

Việc học một ngôn ngữ lập trình mới không chỉ giúp bạn phát triển kỹ năng và hỗ trợ cho sự nghiệp của mình, mà còn mở ra cơ hội tham gia vào các dự án công nghệ, sáng tạo trong tương lai. Chính vì vậy, hãy cân nhắc lựa chọn ngôn ngữ phù hợp với mục tiêu của bạn, và không ngừng nỗ lực để trau dồi kỹ năng lập trình của mình.

Xem thêm:

Tìm kiếm việc làm IT mới nhất tại TopDev!

Object Prototype Javascript – Công cụ hỗ trợ OOP cho JS

Object Prototype Javascript

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

Khi nghe người ta nói về Javascript, bạn chỉ biết Javascript là ngôn ngữ lập trình hướng sự kiện, kiểu script… Thế nhưng, có một điều thú vị rằng, Javascript cũng có thể viết code theo hướng đối tượng. Để làm được điều này, bạn cần phải hiểu về Object Prototype Javascript.

Bạn sẽ không thể nào trở thành chuyên gia về Javascript nếu bạn không nắm được khái niệm Object trong Js. Chúng là nền tảng cho mọi khía cạnh của ngôn ngữ lập trình Javascript.

Trên thực tế, với bất kỳ ai, bất kì ngôn ngữ nào, thì học cách tạo và làm việc với Object là việc đầu tiên bạn nghiên cứu và thực hành.

Tuy nhiên, chắc do Javascript là ngôn ngữ kiểu “lai tạp” , cú pháp lỏng lẻo, dễ tiếp cận… nên nhiều bạn thường bỏ qua việc tìm hiểu Object, cứ nghĩ JS không có Object. Thực ra bạn đã nhầm, rất nhầm

Để tìm hiểu một cách có hiệu quả về Prototype, chúng ta sẽ quay lại những khái niệm cơ bản nhất: “back to basic”.

Nằm trong series: Lập trình Javascript cơ bản, bài viết này mình sẽ chia sẻ những kiến thức cần thiết về Prototype Javascript.

Object Prototype Javascript

#Object javascript là gì – Các cách tạo Object

Qua bài viết Kiểu dữ liệu và hàm trong JS, bạn đã biết được rằng, JS có kiểu dữ liệu cơ bản gồm: Number, String, Boolean, Undefined và Object.

Object là kiểu dữ liệu tổng hợp các kiểu dữ liệu nguyên thủy. Theo định nghĩa thì Object là một danh sách các property (thuộc tính). Mỗi Property là một cặp key-value. Trong đó value có thể là: các kiểu dữ liệu cơ bản, function, hay cũng có thể là một object khác (kiểu dữ liệu phức hợp).

Trong Javascript, mình có 3 cách để định nghĩa, tạo một Object. Chúng ta sẽ lần lượt điểm qua từng cách một.

  Javascript ES6 – Đôi điều thú vị có thể bạn chưa biết

1. Sử dụng Object literal

Ví dụ như bên dưới là cách tạo đối tượng sử dụng Object literal. Đây là cách mà mình hay sử dụng nhất, vừa đơn giản, lại dễ hiểu.

var human = {
    firstName: "Duong",
    lastName: "Anh Son",
    age: 30,
    fullName: function(){
        return this.firstName + " " + this.lastName
    }
}

2. Sử dụng từ khóa new Object()

Với các ngôn ngữ khác, từ khóa new dùng để tạo một instance của một Object. Thì với Javascript, từ khóa new vừa tạo Object, vừa tạo instance.

Ví dụ về cách sử từ khóa new Object():

var human = new Object()
human
console.log(human);// Creates an empty object

Để thêm thuộc tính cho Object, bạn có thể sử dụng ký hiệu dot (.) và gán giá trị luôn cho thuộc tính đó. Ví dụ cho dễ hình dung nhé:

var human = new Object()
human.firstName = "Duong"
human.age = 30
console.log(human);// Creates an empty object

Tham khảo thêm về công việc của Java Developer tại đây

3. Sử dụng Object Constructor

Khái niệm hàm khởi tạo (constructor) có lẽ không còn quá xa lạ với các bạn đã biết C# hay Java.

Contructor trong Javascript cũng có vai trò tương tự như vậy.

Để tạo một Object bằng hàm constructor, cần phải qua 2 bước:

  • Định nghĩa các thuộc tính của một prototype javascript class bằng một hàm constructor. Theo Javascript convention, thì tên của hàm khởi tạo nên bắt đầu bằng chữ in hoa.
  • Tạo đối tượng được định nghĩa bằng hàm constructor bằng từ khóa new.

Nhìn các bước tạo object này, mình lại có sự liên tưởng tới Kotlin. Cách làm rất giống nhau.

Đây là một ví dụ:

// Định nghĩa một class bằng hàm khởi tạo.
function Human(firstName, lastName) {
    this.firstName = firstName,
    this.lastName = lastName,
    this.fullName = function() {
         return this.firstName + " " + this.lastName;
    }
}

var person1 = new Human("Virat", "Kohli");

console.log(person1)
// Tạo instance bằng từ khóa new
var anhson = new Human("Duong", "Anh Son")
var sachinTendulkar = new Human("Sachin", "Tendulkar")

  Object Prototype Javascript – Công cụ hỗ trợ OOP cho JS
thêm một lần nào nữa”]

3. Vấn đề khi tạo Object bằng hàm khởi tạo constructor

Chúng ta sẽ xem xét đoạn mã tạo Object bên dưới đây:

var person1 = new Human("Virat", "Kohli");
var person2 = new Human("Sachin", "Tendulkar");

Khi đoạn code thực thi, Javascript engine sẽ tạo ra 2 bản sao của hàm constructor tương ứng với person1 và person2.

Object Prototype Javascript

Điều này có nghĩa là mọi đối tượng được tạo bằng hàm constructor sẽ có bản sao tương ứng các thuộc tính và method riêng.

Việc này dẫn đến việc phung phí tài nguyên khi mà hàm fullName() làm cùng một việc như nhau ở mọi bản sao.

Đề giải quyết bài toán này, chúng ta sử dụng khái niệm Prototype.

Xem thêm các tin đăng tuyển dụng lập trình viên javascript trên TopDev

# Prototypes Javascript là gì?

Prototype có hai khái niệm mà bạn cần phân biệt:

  • Prototype object là một đối tượng trong Javascript.
  • Thuộc tính Prototype của function.

Có một điều kì cục trong Javascript đó là: function cũng là một object. Function có một thuộc tính đặc biệt là prototype property. Và bản thân thuộc tính prototype này lại mang một giá trị object.

Ngoài ra, vì chúng ta sử dụng function để tạo hàm khởi tạo đối tượng, nên thuộc tính prototype của function cũng có khả năng đặc biệt. Đó là bạn có thể thêm các thuộc tính hoặc phương thức vào thuộc tính prototype để thực hiện kế thừa.

Cuối cùng, khi bạn tạo một object, Javascript engine sẽ mặc định thêm một thuộc tính propotype. Thuộc tính này có giá trị trỏ tới prototype object mà nó kế thừa. Ta dùng thuộc tính “__proto__” để truy cập tới prototype object.

Object Prototype Javascript

1. Cách tạo propotype

Do hàm khởi tạo đối tượng cũng được xem là 1 đối tượng prototype, do đó các đơn giản để tạo ra 1 đối tượng prototype là khai báo một hàm khởi tạo:

function Student() {
    this.name = 'Duong Anh Son';
    this.gender = 'M';
}

Student.prototype.age = 20;

var sinhvien1 = new Student();
console.log(sinhvien1.age); // 20

var sinhvien2 = new Student();
console.log(sinhvien2.age); // 20

2. Changing Prototype

Như mình đã nói ở trên, mỗi một prototype object sẽ link tới một prototype object của hàm.

Nếu bạn thay đổi prototype của hàm thì chỉ các đối tượng tạo mới sau này mới bị ảnh hưởng. Còn các đối tượng đã được tạo trước đó vẫn giữ nguyên prototype cũ.

Để dễ hình dung, mời bạn xem đoạn code bên dưới đây:

function Student() {
    this.name = 'John';
    this.gender = 'M';
    this.website = 'vntalking.com'
}

Student.prototype.age = 15;

var sinhvien1 = new Student();
console.log('sinhvien1.age = ' + sinhvien1.age); // 15

var sinhvien2 = new Student();
console.log('sinhvien2.age = ' + sinhvien2.age); // 15

Student.prototype = { age : 20 };

var sinhvien3 = new Student();
console.log('sinhvien3.age = ' + sinhvien3.age); // 20

console.log('sinhvien1.age = ' + sinhvien1.age); // 15
console.log('sinhvien2.age = ' + sinhvien2.age); // 15

3. Prototype Javascript sử dụng như nào?

Tổng kết lại thì prototype object được sử dụng nhằm 2 mục đích:

  • Để tìm các thuộc tính và phương thức của một object.
  • Thực hiện kế thừa trong Javascript.
function Student() {
    this.name = 'John';
    this.gender = 'M';
}

Student.prototype.sayHi = function(){
    console.log("Hi");
};

var studObj= new Student();
studObj.toString();

Ở ví dụ trên, bạn thấy rằng hàm toString() không được định nghĩa trong Student.

Vậy đoạn code trên có bị crash không? Làm thế nào và chương trình tìm thấy hàm toString()?

Để trả lời cho câu hỏi trên, bạn cần tham khảo hình bên dưới:

Object Prototype Javascript

Đầu tiên, JavaScript engine sẽ kiểm tra xem hàm toString() có sẵn trong studObj hay không?

Nếu nó không tìm thấy, nó sẽ sử dụng thuộc tính prototype của studObj để tìm tới Prototype của Student.

Cuối cùng, nếu nó vẫn không thấy hàm toString() được định nghĩa trong Student, nó sẽ kiếm tra trong đối tượng Object (đây là đối tượng mà tất các đối tượng khác đều kế thừa).

Như ví dụ ở đoạn code trên, chương trình sẽ gọi hàm toString() của đối tượng Object, và nó không in ra gì cả (vì hàm toString() trong Object không làm gì).

Qua cách này, bạn có thể thấy là prototypechỉ giữ duy nhất một bản sao các hàm cho tất cả các đối tượng (instances).

Và đây cũng chính là câu trả lời cho câu hỏi ở đầu bài viết: tại sao sử dụng prototype lại tiết kiệm tài nguyên hơn so với cách sử dụng hàm khởi tạo constructor.

4. Kế thừa trong Javascript bằng cách sử dụng Propotype

Kế thừa là một khái niệm quan trọng trong lập trình hướng đối tượng. Trong kế thừa cổ điển (ví dụ như Java), các hàm trong class cha sẽ được copy vào lớp con.

Với Javascript thì có vẻ nhiều người cứ nghĩ ngôn ngữ lập trình này không có khái niệm kế thừa. Nhưng thực tế thì có đấy.

Trong Javascript, kế thừa được hỗ trợ bởi Propotype. Đó là lý do mà một số người gọi kế thừa trong javascript là “Prototypal Inheriatance“.

Để dễ hiểu hơn, chúng ta sẽ bắt đầu bằng một ví dụ:

function Person(firstName, lastName) {
    this.FirstName = firstName || "unknown";
    this.LastName = lastName || "unknown";
};

Person.prototype.getFullName = function () {
    return this.FirstName + " " + this.LastName;
}

Ở ví dụ này, mình định nghĩa một class Person với 2 thuộc tính là FirstName và LastName, và một hàm getFullName(). Hàm getFullName() được thêm vào class thông qua prototype object.

Và giờ chúng ta sẽ tạo một class Student, kế thừa từ class Person.

function Student(firstName, lastName, schoolName, grade)
{
    Person.call(this, firstName, lastName);

    this.SchoolName = schoolName || "unknown";
    this.Grade = grade || 0;
}
//Student.prototype = Person.prototype;
Student.prototype = new Person();
Student.prototype.constructor = Student;

Các bạn để ý rằng, mình đã đặt Student.prototype là một Person.

Từ khóa new tạo một đối tượng của lớp Person và cũng gán Person.prototype cho prototype object của đối tượng mới. Và cuối cùng gán đối tượng được tạo cho Student.prototype

Bây giờ bạn có thể tạo một đối tượng student sử dụng  các thuộc tính và hàm của lớp Person như sau:

function Person(firstName, lastName) {
    this.FirstName = firstName || "unknown";
    this.LastName = lastName || "unknown";
}

Person.prototype.getFullName = function () {
    return this.FirstName + " " + this.LastName;
}
function Student(firstName, lastName, schoolName, grade)
{
    Person.call(this, firstName, lastName);

    this.SchoolName = schoolName || "unknown";
    this.Grade = grade || 0;
}
//Student.prototype = Person.prototype;
Student.prototype = new Person();
Student.prototype.constructor = Student;

var std = new Student("James","Bond", "XYZ", 10);

console.log(std.getFullName()); // James Bond
console.log (std instanceof Student); // true
console.log (std instanceof Person); // true

Nhìn cũng giống với kế thừa như các ngôn ngữ kinh điển (Java, C#) nhỉ!

#Tạm kết

Như vậy là chúng ta đã hiểu rõ hơn về prototype javascript object rồi đúng không? Quả thực, đây là khái niệm mà rất nhiều người cảm thấy khó khăn khi mới tiếp cận. Nhưng hãy cứ bình tĩnh và đừng nản chí.

Khi bạn đã quen với prototype javascript, bạn sẽ cảm thấy đây là một khái niệm tuyệt vời. Bạn có cảm thấy thế không? Để lại bình luận chia sẻ cảm nghĩ với mọi người nhé.

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

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

Xem thêm việc làm công nghệ hấp dẫn trên TopDev

Tổng Hợp Các Phương Thức Của Thread

Tổng Hợp Các Phương Thức Của Thread

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

Thread có nhiều phương thức khá hay, nếu lúc nào đó bỗng nhiên bạn cần đến, thì việc tìm hiểu thêm về chúng cũng mất kha khá thời gian. Và cũng nhân tiện có nhiều bạn cũng đặt các câu hỏi xoay quanh một vài phương thức được dùng nhiều, hôm nay mình viết hẳn một bài để tổng hợp lại các phương thức đó của Thread lại. Mình sẽ tập trung giải nghĩa cụ thể vào từng phương thức, có ví dụ rõ ràng, để các bạn nắm rõ hơn và để mình nhanh chóng cho ra những bài viết còn lại của chuỗi kiến thức Thread khá là đồ sộ này nhé.

Lưu ý rằng bài viết hôm nay sẽ chưa có đủ mặt các phương thức, nhưng mình sẽ cập nhật thêm sau này và sẽ để lại đường link đến bài này từ các bài viết liên quan khác.

Thread.sleep()

Một phương thức đơn giản nhưng khá nhiều bạn thắc mắc.

Giải Nghĩa

sleep() là một phương thức static của Thread. Do đó chúng ta gọi kèm với tên của lớp: Thread.sleep().

Thread.sleep() làm cho Thread hiện tại (chính là Thread đang gọi đến lệnh Thread.sleep()) phải tạm hoãn lại việc thực thi trong một khoảng thời gian được chỉ định. Nói cho đầy đủ thì là vậy, nhưng các lập trình viên hay dùng theo tên của phương thức, đó là “Ngủ”.

Tuy Thread.sleep() được nạp chồng cho phép bạn chỉ định thời gian ngủ cho Thread hiện tại tính đến nano giây. Nhưng bạn đừng có nghĩ rằng Thread.sleep() sẽ thực sự ngủ với chính xác khoảng thời gian mà bạn định nghĩa nhé. Vì việc ngủ và thức này khiến cho hệ thống phải xử lý và cho ra các độ trễ khác nhau tùy vào thiết bị phần cứng nữa. Do đó Thread.sleep() cũng chỉ tương đối, và chúng ta không bao giờ được dùng Thread.sleep() để xây dựng một chức năng hẹn giờ hay đếm ngược thời gian, điều mà đòi hỏi tính chính xác về mặt thời gian rất cao.

Sử Dụng

Thread.sleep() được nạp chồng bởi 2 phương thức.

  • Thread.sleep(long millis): xác định thời gian ngủ cho Thread, tính bằng mili giây.
  • Thread.sleep(long millis, int nanos): như trên, nhưng bạn có thể thêm vào tham số thứ hai, giúp cộng thêm thời gian ngủ tính bằng nano giây.

Khi sử dụng Thread.sleep(), bạn phải try catch phương thức này bằng một Checked Exception có tên là InterruptedException. Exception này sẽ được tung ra nếu như có một Thread nào đó khác interrupt Thread này (dừng Thread lại) khi Thread.sleep() đang hoạt động.

  Cách xây dựng ThreadLocal trong Java

  Khởi tạo và chạy một thread trong Java

Ví Dụ

Một ví dụ đơn giản, ví dụ này sẽ tin ra console các con số từ 0 đến 5. Mỗi lần in cách nhau nửa giây (500 mili giây). Và vì chúng ta không start() bất cứ Thread nào trong đoạn code dưới, điều đó không có nghĩa rằng là hiện tại ứng dụng đang rỗng không có Thread nào đấy nhé. Bản thân phương thức main() tự nó đã được đưa vào một Thread rồi, gọi là main thread, nên bạn có thể thoải mái gọi đến Thread.sleep() ở đây.

public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(i);
    }
}

join()

Giải Nghĩa

Phương thức join() cho phép một Thread phải chờ cho đến khi các Thread khác kết thúc. Vậy Thread nào phải chờ Thread nào? Vấn đề này khiến nhiều bạn bỡ ngỡ ban đầu, do chỉ có một phương thức join() thì thể hiện thế nào về việc Thread nào chờ Thread nào. Bạn chỉ cần nhớ, Thread nào sử dụng (hay khai báo) các Thread khác, mà một trong các Thread được khai báo này gọi đến phương thức join(), Thread sử dụng sẽ phải đợi Thread khai báo đó kết thúc mới làm tiếp công việc của mình.

join() cũng có các phương thức nạp chồng cho phép Thread hiện tại chỉ cần phải chờ trong một khoảng thời gian tính bằng mili giây hoặc thêm đến nano giây. Và cũng như Thread.sleep()join() không thực sự đếm thời gian chính xác, nên bạn cũng đừng dùng join() cho một số tình huống đòi hỏi mặt khắt khe về thời gian nhé.

Đừng bỏ lỡ việc làm Java hấp dẫn trên TopDev

Sử Dụng

join() được nạp chồng bởi 3 phương thức.

  • join(): chờ đến khi Thread này kết thúc.
  • join(final long millis): chờ trong khoảng thời gian tính bằng mili giây. Nếu truyền vào đây giá trị 0, sẽ trở thành join() trên kia.
  • join(long millis, int nanos): như trên nhưng có thể cộng thêm thời gian tính bằng nano giây vào tham số thứ hai. Nếu truyền vào 2 tham số đều là 0 thì sẽ trở thành join().

Cũng giống như Thread.sleep(), sử dụng join() cũng cần phải try catch với InterruptedException. Cả hai phương thức này sẽ tung ra Exception này khi được gọi bởi lệnh interrupt.

Ví Dụ

Chúng ta hãy xây dựng một Thread đơn giản sau đây. Thread này khi chạy sẽ in ra các con số từ 0 đến 5 ở mỗi 0,5 giây.

public class MyThread extends Thread {

    public MyThread(String threadName) {
        super(threadName);
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(getName() + " " + i);
        }
    }
}

Còn ở phương thức main() chúng ta sẽ khai báo 3 đối tượng Thread từ lớp MyThread này. Sau khi start thread1 xong thì gọi thread1.join(), sau đó chúng ta cũng sẽ start các Thread còn lại.

public static void main(String[] args) {
    MyThread thread1 = new MyThread("Thread1");
    MyThread thread2 = new MyThread("Thread2");
    MyThread thread3 = new MyThread("Thread3");

    thread1.start();
    try {
        thread1.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    thread2.start();
    thread3.start();
}

Kết quả in ra console như sau.

Thread1 0
Thread1 1
Thread1 2
Thread1 3
Thread1 4
Thread2 0
Thread3 0
Thread2 1
Thread3 1
Thread2 2
Thread3 2
Thread2 3
Thread3 3
Thread2 4
Thread3 4

Bạn có thể thấy, sau khi thread1.start()thread1 này sẽ bắt đầu in các con số ra console. Tuy nhiên lời gọi thread1.join() sau đó khiến Thread đang sử dụng thread1 này (chính là main thread, thread đang chứa phương thức main() của chúng ta) rơi vào trạng thái đợi cho thread1 hoàn thành, trong quá trình đợi đó, các thread2 và thread3 khi này vẫn chưa được thực thi với hàm start(). Sau khi thread1 đếm xong và hoàn thành nhiệm vụ, các Thread còn lại mới được chạy và bắt đầu đếm là vậy.

interrupt()/isInterrupted()/Thread.interrupted()

Giải Nghĩa

Đôi khi chúng ta cần phải ngưng một Thread nào đó đang hoạt động. Cách hợp lý là gọi đến phương thức interrupt() của Thread. Lời gọi interrupt() thực chất cũng không làm cho Thread được gọi đến ngưng tác vụ ngay đâu, điều đó khá là nguy hiểm khi mà hệ thống không biết chắc Thread này đang làm việc gì, biết đâu nó đang ghi một file quan trọng nào đó. Việc một Thread khác interrupt() thoải mái một Thread nào đó có thể gây nên hậu quả khôn lường. Do đó, interrupt() không được xây dựng sẵn các lệnh giúp dừng Thread từ hệ thống, nó chỉ được xem như là một chỉ thị đưa ra cho Thread đang hoạt động biết, tốt hơn hết chính Thread đang hoạt động đó phải biết được chỉ thị này và tự biết cách ngưng tác cụ của mình lại. Một lát ở ví dụ bên dưới chúng ta sẽ nắm được điều này. Hai phương thức còn lại isInterrupted() và Thread.interrupted() dùng để kiểm tra Thread này có bị interrupt hay chưa.

Sử Dụng

  • interrupt(): đưa ra chỉ thị cho Thread rằng nó đang được gọi để chấm dứt việc thực thi.
  • isInterrupted(): kiểm tra xem Thread đó có bị chấm dứt hay chưa.
  • Thread.interrupted(): cũng như isInterrupted(), nhưng việc gọi kiểm ta với phương thức này cũng kèm với việc trả lại trạng thái ban đầu cho Thread sau đó. Nên việc gọi kiểm tra một Thread có bị chấm dứt hay chưa bởi hai lần gọi phương thức này có thể cho ra hai kết quả khác nhau.

Ví Dụ

Ví dụ lần này chúng ta hãy đi từ phương thức main(), để xem với lời gọi interrupt() như thế này thì MyThread phải làm sao là đúng nhé.

public static void main(String[] args) {
    MyThread thread = new MyThread();

    System.out.println("We start this Thread");
    thread.start();

    try {
        thread.join(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println("We stop this Thread");
    thread.interrupt();
}

Nếu như ở MyThread, chúng ta “thờ ơ” với InterruptedException, tức là không có chuẩn bị gì cho sự interrupt cả, như sau.

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 5; i++){
            System.out.println(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
        }
    }
}

Kết quả in ra console sẽ như sau. Bạn thấy ở phương thức main() gọi interrupt() trong “vô vọng”, vòng lặp vẫn lặp và đếm như thường, nó chỉ kết thúc khi hoàn thành tác vụ mà thôi.

We start this Thread
0
1
We stop this Thread
2
3
4

Tuy nhiên, nếu chúng ta sửa MyThread một chút, có “trách nhiệm” hơn vớ InterruptedException, Thread này sẽ kết thúc dễ dàng do có sự chuẩn bị trước.

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 5; i++){
            System.out.println(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println("OK, I'm stop.");
                return;
            }
        }
    }
}

Console sẽ in ra như sau.

We start this Thread
0
1
We stop this Thread
OK, I'm stop.

Hoặc try catch như thế này cũng cho ra kết quả viên mãn như trên.

public class MyThread extends Thread {

    @Override
    public void run() {
        try {
            for (int i = 0; i < 5; i++) {
                System.out.println(i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("OK, I'm stop.");
        }
    }
}

Thread.currentThread()

Giải Nghĩa

Lời gọi Thread.currentThread() sẽ nhận về một tham chiếu đến đối tượng Thread hiện tại. Phương thức này cũng không quá phức tạp nên mình cũng không giải thích gì nhiều.

Ví Dụ

Bạn hãy nhìn vào MyRunnable sau. Trong trường hợp này thì để có thể lấy được tên của Thread đang chạy, chỉ có cách gọi đến Thread.currentThread() mà thôi.

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " started.");
    }
}

Phương thức main() như sau.

public static void main(String[] args) {
    MyRunnable myRunnable1 = new MyRunnable();
    MyRunnable myRunnable2 = new MyRunnable();

    new Thread((myRunnable1)).start();
    new Thread((myRunnable2)).start();
}

Kết quả in ra console.

Thread-1 started.
Thread-0 started.

getName()/setName()

Giải Nghĩa

Mặc định thì các Thread khi khởi chạy trong ứng dụng, sẽ được hệ thống đặt cho một cái tên, tuần tự, như sau: Thread-0Thread-1,….

Nếu bạn thấy các tên này rất khó để gợi nhớ, hãy đặt cho chúng một cái tên khác theo ý bạn.

Sử Dụng

  • getName(): trả về tên của Thread.
  • setName(String name): đặt một tên mới cho Thread.

Ví Dụ

Như bao ví dụ khác, chúng ta cần một Thread khá đơn giản như sau. Thread này sẽ in ra các con số từ 0 đến 5 ở mỗi 0,5 giây. Tuy nhiên Thread có kèm theo phương thức getName() để hiển thị tên của nó ra console.

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 5; i++){
            System.out.println(getName() + " " + i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Ở main() chúng ta sẽ start Thread với cái tên mặc định trước. Đợi Thread này chạy 1 giây sau rồi đổi tên cho nó.

public static void main(String[] args) {
    MyThread thread = new MyThread();

    thread.start();
    try {
        thread.join(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    thread.setName("Thread Changed Name");
}

Kết quả in ra console, tên Thread bị đổi sau 2 lần lặp.

Thread-0 0
Thread-0 1
Thread Changed Name 2
Thread Changed Name 3
Thread Changed Name 4

Kết Luận

Hy vọng với bài mở rộng này sẽ giúp các bạn thêm hiểu rõ hơn về sử dụng Thread trong java.

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

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

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

Hướng dẫn debug code trong eclipse

Hướng dẫn debug code trong eclipse

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

Debug là gì?

Bug (lỗi) có thể là từ chương trình của bạn viết ra hoặc là từ chương trình mà bạn kế thừa từ người khác. Khi chương trình chạy và kết quả không phải là những gì mà bạn mong đợi, tức là đã có lỗi. Lỗi có thể do dự đoán của bạn đã bị sai hoặc là có gì đó phát sinh khi chương trình được thực thi mà bạn không lường trước được. Đôi khi chỉ cần nhìn vào source code là bạn tìm ra ngay nguyên nhân, nhưng khi cách đó không mang lại kết quả thì lúc này bạn cần phải Debug.

Debug (gỡ lỗi) là một kỹ năng nền tảng của lập trình viên. Mục đích chính của debug là để dò tìm lỗi (error) của chương trình, ngoài ra nó còn giúp lập trình viên hiểu rõ hơn cách chương trình hoạt động.

Các phương pháp Debug

Có nhiều phương pháp để debug, thông thường chúng ta sử dụng các phương pháp sau:

  • Print Console: là cách thêm vào source code của bạn những dòng lệnh để in ra những thông tin mà bạn cần theo dõi trong quá trình thực thi. Ví dụ: System.out.println(), hay System.error.println(),… Cách này hơi phiền phức vì bạn phải thay đổi code của chương trình, những dòng code này vô nghĩa và sau khi debug bạn phải xóa khỏi source code của chương trình.
  • Logging: tạo ra một tập tin để ghi (log) lại những thông tin sau khi chương trình thực thi. Chúng ta sẽ dựa vào thông tin này để phân tích nguyên nhân lỗi. Kỹ thuật này thường được áp dụng trong môi trường thực, khi mà ứng dụng của bạn đang được mọi người sử dụng, bạn không thể thay đổi code hay sử dụng công cụ để dò tìm lỗi.
  • Debugging Tool (dùng công cụ để Debug) là phương pháp debug đi sâu vào source code nhất. Các công cụ này thông thường được tích hợp vào các IDE, ví dụ công cụ debugger của eclipse, Microsoft Visual Studio Debugger,… Cách này thường được sử dụng nhất khi bạn đang phát triển chương trình, bạn dễ dàng theo dõi, kiểm tra các giá trị, thay đổi các giá trị để kiểm tra tính đúng đắn của chương trình.

Debug code Java trong Eclipse

Debug code Java trong Eclipse cũng giống như việc chạy một ứng dụng Java. Khi debug chúng ta có thể tạm ngưng (pause) chương trình để xem giá trị của các biến, từ đó biết được luồng chạy của chương trình, thậm chí là thay đổi giá trị của các biến. Đặc biệt debug được sử dụng để tìm kiếm bug, đây là một việc quan trọng trong phát triển phần mềm.

BreakPoint (điểm ngắt): một BreakPoint trong mã nguồn xác định nơi thực thi của chương trình nên dừng lại trong quá trình gỡ lỗi. Một khi chương trình đã dừng, bạn có thể kiểm tra giá trị các biến, thay đổi nội dung,…

  Làm thế nào để cải thiện kỹ năng debug?

  Một số lệnh console hữu ích khi debug website

Các bước debug code Java trong Eclipse

Các bước thực hiện debug code trong Java:

  1. Tạo BreakPoint.
  2. Start chương trình ở chế độ Debug.
  3. Sử dụng các phím tắt để theo dõi giá trị các biến, theo dõi flow thực thi của chương trình.

Code minh họa

Trước khi đi vào chi tiết, hãy xem đoạn code bên dưới sẽ được sử dụng để minh họa các thao tác debug:

package com.gpcoder;

public class MainApp {

    public static void main(String[] args) {
        Student student = new Student(1, "GP Coder");
        String hello = sayHello(student);
        System.out.println(hello);
    }

    public static String sayHello(Student student) {
        return "Hello " + student.getName();
    }

    public static void checkStudent(Integer id) {
        if (id != null) {
           System.out.printf("Valid");
        } else {
           System.out.printf("Invalid");
        }
    }
}

Xem thêm việc làm Tester chưa có kinh nghiệm hấp dẫn tại TopDev

Tạo BreakPoint

Để xác định điểm ngắt trong mã nguồn, bạn nhấp chuột phải vào lề trái trong trình soạn thảo Java và chọn Toggle Breakpoint. Hoặc bạn có thể nhấp đúp vào vị trí cần đánh dấu BreakPoint.

debug eclipse

Ví dụ tôi thiết lập một BreakPoint tại dòng code số 6, ta có kết quả sau:

debug eclipse

Start chương trình ở chế độ debug

Có thể thực hiện một trong các cách bên dưới để Start ở project ở chế độ debug trong Eclipse:

  • Chọn menu Run -> Debug As -> Java Application.
  • Click chuột phải vào class chứa phương thức main() -> Debug As -> Java Application.
  • Nhấn phím F11.
  • Click vào button Debug trong thanh công cụ -> Debug As -> Java Application.

debug eclipseLần đầu tiên debug hộp thoại sau được hiển thị ra, check vào “Remember my decision” nếu bạn không muốn nhìn thấy nó lần nữa -> chọn Yes.

Nếu khung làm việc Debug không được mở, bạn có thể vào Window -> Perspective -> Open Perspective -> Others -> Debug.

debug eclipse

Khung nhìn BreakPoint gồm có 5 cửa sổ nhỏ:

  • Cửa sổ 1 (Debug): hiển thị thông tin Class của dòng lệnh đang thực thi.
  • Cửa sổ 2 (Variables/ BreakPoints, Expressions): hiển thị giá trị các biến, hiển thị tất cả các BreakPoint đánh dấu của project, thiết lập các biểu thức (expression), điều kiện để đánh dấu BreakPoint.
  • Cửa sổ 3 (Java Class): cho phép thực hiện điều khiển thực hiện debug.
  • Cửa sổ 4 (Outline): hiển thị tên các biến, phương thức của class hiện đang thực thi, bạn có thể di chuyển nhanh đến vị trí của phương thức bằng cách click lên tên phương thức tương ứng.
  • Cửa sổ 5 (Console): hiển thị thông tin kết quả của câu lệnh System.out, System.error, … ra cửa sổ Console.

Các phím tắt để Debug Java project trong Eclipse

debug eclipse

Eclipse cung cấp các nút trên thanh công cụ để kiểm soát việc thực hiện chương trình mà bạn đang debug. Bạn có thể sử dụng cho phép sử dụng phím tắt tương ứng để kiểm soát việc thực hiện này.

  • F5 (Step Into): nhảy vào phương thức đang debug.
  • F6 (Step Over): thực thi câu lệnh hiện tại và nhảy đến câu lệnh tiếp tiếp.
  • F7 (Step Return): thực thi câu lệnh hiện tại và quay lại lệnh đã gọi phương thức này.
  • F8 (Resume): thực thi câu lệnh hiện tại và nhảy đến breakpoint tiếp theo.
  • Ctrl + F2 (Terminate): kết thúc chế độ debug.
  • Ctrl Shift + B: đánh dấu/ hủy BreakPoint
  • Ctrl + Shift + I: mở popup hiển thị thông tin giá trị biến được chọn.

Xem giá trị các biến trong khung debugger

Sau khi start chương trình ở chế độ debug, chương trình sẽ thực thi bình thường. Nếu gặp BreakPoint, chương trình sẽ dừng lại để cho phép bạn điều khiển và theo dõi. Như bạn thấy, chương trình sẽ dừng lại ở BreakPoint tại dòng code số 6:

debug eclipse

Nhấn F6 để thực thi câu lệnh hiện tại và trỏ tới câu lệnh tiếp theo.

debug eclipse

Để xem giá trị của biến, bạn thực hiện một trong các cách sau:

  • Hover chột vào biến tương ứng.
  • Bôi đen biến và nhấn tổ hợp phím Ctrl + Shift + I.
  • Mở cửa sổ Variable.

Như bạn thấy hình trên, chương trình dừng tại dòng code số 7, khi bạn hover chuột lên biến student, bạn có thể thấy được giá trị của biến student.

Tại dòng code số 7, bạn có thể nhấn phím F5 để vào xem nội dụng của phương thức sayHello.

debug eclipse

Như bạn thấy, hiện tại chương trình đã nhảy vào phương thức sayHello(). Tại đây, bạn có thể nhấn phím F6 để chuyển sang dòng code kế tiếp, khi thực thi đến hết phương thức sayHello(), chương trình sẽ quay lại dòng code số 7.

Để quay lại dòng code số 7 mà không cần thực thi từng dòng lệnh (không nhấn phím F6), chúng ta sẽ nhấn phím F7, khi đó chương trình sẽ thực thi tất cả các câu lệnh còn lại phương thức sayHello() và quay lại lệnh đã gọi phương thức này (tức là dòng code số 7).

debug eclipse

Nhấn F8 để thực thi câu lệnh hiện tại và nhảy đến BreakPoint tiếp theo (nếu có). Trong ví dụ của chúng ta là kết thúc chương trình.

debug eclipse

Lưu ý: sau khi thực hiện debug xong, bạn có thể chuyển lại khung nhìn Java bằng cách click vào icon bên phải như sau:

debug eclipse

Nếu không có các icon trên, bạn có thể vào menu chính -> Window -> Perspective -> Open Perspective -> Other -> chọn Debug hoặc Java hoặc Java EE.

Thay đổi/ gán giá trị biến trong lúc debug

Ví dụ thực hiện debug chương trình trên đến dòng code số 8, khi đó giá trị hello tại cửa sổ Variables của khung nhìn Debug như sau:

debug eclipse

Chúng ta có thể thay đổi giá trị của biến hello bằng cách nhấp chuột vào value của biến hello, sau đó nhập giá trị mới. Ví dụ, tôi đổi giá trị “GP Coder” thành “gpcoder.com“:

debug eclipse

Nhấn phím F8 để chương trình thực thi tiếp phần còn lại. Tại cửa sổ Console, bạn sẽ thấy giá trị “gpcoder.com” được hiển thị:

debug eclipse

Xóa các BreakPoint hoặc hủy kích hoạt BreakPoint

Khung nhìn Breakpoints cho phép bạn xóa và hủy kích hoạt các BreakPoint. Để hủy kích hoạt một điểm ngắt, loại bỏ hộp kiểm tương ứng trong khung nhìn Breakpoints. Để xóa nó, bạn có thể sử dụng các nút tương ứng trong thanh công cụ.

Mở khung nhìn BreakPoint: Trên menu chính, chọn Window -> Show view -> Others -> BreakPoints

debug eclipse

Như bạn thấy khung nhìn BreakPoint sẽ hiển thị tất cả các BreakPoint được đánh dấu trong chương trình của bạn. Trong hình trên, tôi đã đánh dấu 2 BreakPoint tại dòng code 6 và 16, khung nhìn view cũng thể hiện 2 BreakPoint này.

Trên đây là những hướng dẫn cơ bản nhất để thực hiện debug trong Java. Thao tác debug khá đơn giản nhưng rất quan trọng, mỗi lập trình viên đều cần biết và vận dụng nó để dễ dàng dò tìm lỗi, cũng như hiểu sâu hơn về cách hoạt động của chương trình. Tôi xin dừng bài viết ở đây, cám ơn các bạn đã quan tâm và theo dõi. Hẹn gặp lại ở các bài viết tiếp theo.

Remote Debug – Debug từ xa

Thế nào là Remote debug?

Thông thường, chúng ta debug ứng dụng trực tiếp trên IDE ở máy local, cụ thể chúng ta sẽ dùng Eclipse, IntelliJ, … để debug, chúng ta đặt BreakPoint và tiến hành debug. Nhưng vì một lý do nào đó, chúng ta không thể deploy project trên máy local bằng IDE mà phải deploy ứng dụng ở một máy khác hoặc trên server (remote). Sau đó, chúng ta cũng vẫn sẽ debug ứng dụng đó bằng source code trên IDE của máy local. Đó chính là remote debug.

Remote debug (Debug từ xa) rất hữu dụng khi có những bug chỉ xảy ra trên một môi trường mà máy local không thể tái hiện được. Chẳng hạng như xảy ra trên môi trường staging, testing và thỉnh thoảng trên cả production.

Thực hiện Remote debug như thế nào?

Java cung cấp sẵn tính năng remote debug, chúng ta chỉ cần truyền vào thông số -Xdebug cho JVM lúc start chương trình. Sau đó, đặt BreakPoint và thực hiện debug như hướng dẫn ở phần trên. Chỉ khác biệt là khi chạy ứng dụng thì quá trình thì các dữ liệu của quá trình debug sẽ được JVM trên môi trường đang chạy đẩy về máy local thông qua qua socket trên một port đã định nghĩa lúc start JVM.

Ví dụ: chúng ta deploy ứng dụng của mình như sau:

java -Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=8090 -jar gpcoder-app.jar

Trong đó:

  • –Xdebug là lệnh dùng để enable tính năng remote debug.
  • gpcoder-app.jar là ứng dụng được start.
  • -Xrunjdwp:transport=dt_socket : ứng dụng publish message thông qua transport là socket và giao thức JDWP (Java Debug Wire Protocol). Từ Java 5 trở đi, chúng ta có thể sử dụng -agentlib:jdwp thay cho -Xdebug và Xrunjdwp.
  • server=y,address=8090: ứng dụng sẽ được debug ở server được deploy với port là 8090.
  • suspend=n : JVM sẽ start ở chế độ suppend cho đến khi được debug.

Lưu ý: ứng dụng chạy ở chế độ remote debug sẽ bị ảnh hưởng đến performance, do đó chỉ sử dụng chế độ này khi thực sự cần thiết.

Debug như thế nào mới hiệu quả?

Nếu ta chịu khó debug chi tiết thì sẽ hiểu rõ hơn về hệ thống và biết được chương trình đang bị lỗi gì. Tuy nhiên, đôi khi chúng ta không có đủ thời gian để debug chi tiết từng dòng code. Dưới đây là một vài điểm giúp quá trình debug nhanh hơn, dễ phát hiện lỗi xảy ra hơn mà tôi muốn chia sẽ với các bạn:

  • Đọc cẩn thận các dòng thông báo lỗi khi chạy đoạn mã, đôi khi những dòng báo lỗi đã chỉ ra cho ta biết nguyên nhân lỗi là gì.
  • Khi ta chạy chương trình debug ngoài xem các giá trị của biến cần ta cần xem thêm các comment để hiểu hơn nghiệp vụ xử lý trong chương trình. Từ đó có thể phán đoán được khả năng xảy ra lỗi trong chương trình nhanh hơn.
  • Phân vùng lỗi thông qua các BreakPoint. Nếu ta chạy từng dòng lệnh một cách chi tiết sẽ tốn nhiều thời gian. Thường thì tôi đoán lỗi khả năng xảy ra ở đâu, sau đó đặt các BreakPoint ở đó. Chạy debug để loại bỏ các dự đoán khả năng lỗi. Rồi phân vùng khả năng lỗi để tiến hành debug sâu dưới dạng Step into để gỡ lỗi. Theo kinh nghiệm của tôi thì làm cách này tôi thấy phát hiện lỗi được nhanh hơn. Nhưng nhanh hay chậm cũng phụ thuộc kinh nghiệm, nếu kinh nghiệm tốt sẽ đoán được phân vùng lỗi nhanh và đỡ tốn thời gian hơn.
Bài viết gốc được đăng tải tại gpcoder.com

Xem thêm:

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

Callback hell là gì? 6 cách “trị” callback hell trong javascript

Callback hell là gì? 6 cách “trị” callback hell trong javascript

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

Chắc hẳn những bạn nào quen lập trình Nodejs hay Javascript rồi thì khái niệm Callback không còn xa lạ nữa. Nhưng với người mới như mình thì callback hell trong javascript luôn là một ám ảnh. Vậy Callback hell là gì? Nó có hay xảy ra khi làm việc với Nodejs không?

Mình phải thừa nhận một điều là mình quyết định học Nodejs chẳng qua bị sếp ép mà thôi. Với xuất phát điểm từ lập trình Java, cho đến lập trình Android nên tư duy xử lý bất đồng bộ của Javascript thực sự làm mình bối rối.

Như mọi người cũng biết, việc xử lý các tác vụ trong Javascript là bất đồng bộ. Tức là các tác vụ sẽ được Javascript đẩy hết một event loop.

Các bạn có thể xem video bên dưới để hiểu rõ hơn về Event Loop trong Javascript nhé.

Tác vụ nào hoàn thành thì sẽ được bắn sự kiện để thông báo và trả kết quả. Do đó các tác vụ sẽ không được thực hiện theo đúng trình tự như chúng ta nhìn trong code.

Từ  đó, chúng ta sử dụng callback để có thể điều khiển việc thực hiện các tác vụ theo đúng trình tự mong muốn.

Tuy nhiên, nếu lạm dụng callback mà không được thiết kế cẩn thận sẽ làm cho code của bạn trở lên khó đọc, khó bảo trì.
Callback hell là gì? 6 cách "trị" callback hell trong javascript dễ nhất

#Callback hell trong javascript là gì?

Chắc hẳn bạn đang rất muốn biết bản chất callbackhell trong javascript là gì đúng không?

Thực ra callback hell trong javascript chỉ là bạn thực hiện quá nhiều callback lồng nhau. Đại khái, callback hell sẽ có hình dạng như bên dưới.

getData(function(a){
    getMoreData(a, function(b){
        getMoreData(b, function(c){
            getMoreData(c, function(d){
                getMoreData(d, function(e){
                    ...
                });
            });
        });
    });
});

Nhìn qua đoạn code bạn có thấy khiếp không?

Những người mới bắt đầu học Nodejs thường rất dễ bị lỗi này. Đơn giản vì các bạn chưa có một tư duy thiết kế chuẩn cho kiểu hệ thống hướng sự kiện.

Bài viết này, mình sẽ chia sẻ 5 cách để các bạn hạn chế bị callback hell trong javascript mà dễ thực hiện nhất.

  JavaScript là gì? Làm thế nào để trở thành lập trình viên JavaScript?

#6 cách xử lý callback hell trong javascript dễ nhất

1. Thiết kế ứng dụng theo dạng module

Cũng giống với các ngôn ngữ lập trình khác, một trong những cách để hạn chế sự phức tạp của code là module hóa.

Bất cứ khi nào bạn viết code, đừng cắm cổ vào viết ngay mà hãy dành một chút thời gian để suy nghĩ xem mình viết như này đã tốt nhất chưa.

Bạn đang viết một đoạn code và đoạn code này xuất hiện ở rất nhiều nơi? Hay các phần của đoạn code đó lại đang có vẻ tái sử dụng được… Lúc này bạn hãy mạnh dạn nghĩ tới module hóa nó.

Bạn nên nhớ rằng, Nodejs được như ngày hôm nay là do được xây dựng trên hàng trăm ngàn modules khác nhau. Nodejs sẽ không là gì cả nếu không có các module. Nên việc bạn module mã nguồn của mình là đi đúng hướng với triết lý của Nodejs đấy.

Ví dụ cách viết một module. Bạn tạo một module tên là Test.

//node_modules/test/index.js
module.exports = {
  hello: function(name) {
    console.log("Hello, " + name);
  },
  bye: function(name) {
    console.log("Goodbye, " + name);
  }
};

Sau đó gọi ở ứng dụng như sau:

var greeter = require('test');

greeter.hello("Monkey");
greeter.bye("Steven");

Việc làm JavaScript Hồ Chí Minh dành cho bạn!

2. Nên đặt tên cho callback trong javascript

Bạn hay bắt gặp cách viết callback là các hàm anonymous function. Tức là các hàm không có tên.

Ví dụ một đoạn code sử dụng callback là anonymous function. Và có đến 2 callback lồng nhau.

var fs = require('fs');

var myFile = '/tmp/test';
fs.readFile(myFile, 'utf8', function(err, txt) {
    if (err) return console.log(err);

    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt, function(err) {
        if(err) return console.log(err);
        console.log('Appended text!');
    });
});

Nhìn vào đoạn code này sẽ khiến bạn mất vài giây để xem callback thực hiện điều gì và được gọi từ đâu.

Để khắc phục điều này, đơn giản bạn thêm một thao tác nhỏ là đặt tên cho callback. Nó sẽ giúp bạn dễ đọc code hơn, đặc biệt khi các callback lồng nhau nhiều hơn.

var fs = require('fs');

var myFile = '/tmp/test';
fs.readFile(myFile, 'utf8', function appendText(err, txt) {
    if (err) return console.log(err);

    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt, function notifyUser(err) {
        if(err) return console.log(err);
        console.log('Appended text!');
    });
});

Lúc này, bạn chỉ cần lướt qua là biết callback đầu tiên thực hiện việc nối các text lại với nhau. Còn callback thứ 2 là để thông báo cho người người dùng. Việc này giúp bạn tránh được callback hell trong javascript dễ dàng đúng không?

  DOM là gì? Tìm hiểu và thao tác DOM trong Javascript

3. Định nghĩa hàm trước khi gọi để tránh callback hell trong javascript

Vẫn với ví dụ ở trên, việc bạn đặt tên đã giúp cho code dễ đọc hơn rất nhiều. Nhưng nó vẫn còn khá cồng kềnh.

Bạn thực hiện thêm một bước nữa, đó là tách riêng và định nghĩa các callback riêng ra. Hãy cứ tách hàm khi có thể!

var fs = require('fs');

function notifyUser(err) {
    if(err) return console.log(err);
    console.log('Appended text!');
};

function appendText(err, txt) {
    if (err) return console.log(err);

    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt, notifyUser);
}

var myFile = '/tmp/test';
fs.readFile(myFile, 'utf8', appendText);

Bạn  thế code trên đẹp trai hơn chưa?

Mặc dù cách viết code đã giải quyết được phần nào vấn đề. Nhưng nó vẫn chưa phải là giải pháp tốt nhất. Nếu bạn đọc lại code mà không nhớ chính xác hàm đó làm gì, bạn sẽ phải trace lại code, mà thường thì code của hàm đó lại trôi tuột ở đâu đó. Rất mất thời gian.

Chúng ta còn có giải pháp tốt hơn, ngay phía bên dưới thôi!

  Arguments object trong javascript là gì? Cách sử dụng?

4. Sử dụng module Async.js

Đúng với tên gọi của nó, module Async.js sẽ giúp bạn xử lý các hàm bất độ theo cách đồng bộ.

Module này có rất nhiều methods để bạn chọn như seriesparallelwaterfall,… Vì vậy, bạn nên dành chút thời gian để đọc tài liệu hướng dẫn của tác giả trước khi quyết định chọn method nào.

Async.js thực sự là một thư viện tốt, nhưng nếu lạm dụng quá thì cũng không tốt. Bạn nên nhớ Nodejs là nền tảng được thiết kế cho hệ thống xử lý bất đồng bộ, với ưu điểm xử lý realtime. Nên nếu dự án toàn sử dụng Async.js để xử lý các tác vụ theo kiểu đồng bộ tuần tự là tự đập bỏ điểm mạnh của Nodejs.

Đây là đoạn code sử dụng Async.js cho ví dụ trên:

var fs = require('fs');
var async = require('async');

var myFile = '/tmp/test';

async.waterfall([
    function(callback) {
        fs.readFile(myFile, 'utf8', callback);
    },
    function(txt, callback) {
        txt = txt + '\nAppended something!';
        fs.writeFile(myFile, txt, callback);
    }
], function (err, result) {
    if(err) return console.log(err);
    console.log('Appended text!');
});

Nhìn cũng khá tường minh và dễ hiểu phải không?

5. Sử dụng Promises

Mặc dù khái niệm Promies hơi khó hiểu chút khi mới tiếp cận. Nhưng theo mình thì đây là một khái niệm quan trọng mà bạn nên cố hiểu khi học Javascrip/Nodejs.

Promises giúp làm giảm số dòng code đáng kể, nó còn giúp mã dễ đọc, dễ bảo trì hơn nhiều.

Quay lại ví dụ ban đầu, nếu sử dụng Promises sẽ như sau:

var Promise = require('bluebird');
var fs = require('fs');
Promise.promisifyAll(fs);

var myFile = '/tmp/test';
fs.readFileAsync(myFile, 'utf8').then(function(txt) {
    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt);
}).then(function() {
    console.log('Appended text!');
}).catch(function(err) {
    console.log(err);
});

Nói về Promises thì còn nhiều điều để nói lắm. Ở bài viết này mình sẽ không trình bày sâu về nó(mặc dù rất thích nói về Promises). Hẹn các bạn ở bài viết sau nhé!

Tìm việc làm Javascript mới nhất trên TopDev

6. Async/Await nhằm giảm khả năng xảy ra callback hell trong javascript

Kể từ phiên bản ES7, Javascript có một khái niệm mới là Async/Await. Khi sử dụng hàm async, code của bạn sẽ trông giống như đồng bộ như thực chất là bất đồng bộ. Thế mới hay!

Ví dụ đoạn code sau:

async function getUser(id) {
    if (id) {
        return await db.user.byId(id);
    } else {
        throw 'Invalid ID!';
    }
}

try {
    let user = await getUser(123);
} catch(err) {
    console.error(err);
}

Ở đoạn code trên, hàm db.user.byId(id) sẽ trả về một Promises, và lẽ ra khi hàm này được sử dụng thì kết quả sẽ trả về trong hàm .then().

Tuy nhiên, với từ khóa await, bạn sẽ lấy trực tiếp kết quả trả về.

Lưu ý: await chỉ được sử dụng với hàm được khái báo với từ khóa async.

#Tạm kết

Như vậy, qua bài viết này bạn đã biết callback hell trong javascript là gì rồi đúng không? Khi viết code thì những sai sót phổ biến như callback hell trong javascript là khó tránh khỏi. Tuy nhiên, hãy hạn chế nó càng nhiều càng tốt.

Chỉ cần bạn cố gắng viết code chậm lại chút, suy nghĩ một chút trước khi viết code. Javascript là một ngôn ngữ “dễ dãi”, đây cũng vừa là ưu điểm và nhược điểm của Javascript.

Hãy là người viết code thông thái!

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

Xem thêm:

Đừng bỏ lỡ việc làm IT hot tại TopDev

Outsource là gì? Công ty outsource hay product sẽ tốt cho Developer

Outsource là gì? Công ty Outsource hay Product sẽ tốt cho Developer

Outsource là một thuật ngữ quen thuộc trong ngành công nghệ thông tin, đặc biệt đối với các developer. Quá trình này mang lại những lợi ích rõ rệt cho các công ty như giảm chi phí, tập trung vào nhân lực chính, tiết kiệm thời gian và tăng cường chất lượng sản phẩm. Trong bài viết này, TopDev sẽ giúp bạn tìm hiểu outsource là gì? Những lợi ích và tác động của nó đến developer, cùng những lưu ý quan trọng khi thực hiện quá trình outsource.

Outsource là gì?

Outsource là gì?

Outsource hay còn gọi là Outsourcing (thuê ngoài) là hình thức công ty hoặc tổ chức thuê một công ty hay cá nhân khác để thực hiện một số công việc cụ thể thay vì thực hiện chúng bên trong tổ chức.

Quá trình outsource này thường được thực hiện khi công ty/doanh nghiệp không có đủ nguồn lực để làm, hoặc khi công ty muốn tập trung vào nhân lực chính của mình để phát triển các sản phẩm hoặc dịch vụ mới.

Các dịch vụ và công việc được outsource thường rất đa dạng, từ quản lý dự án, phát triển phần mềm, thiết kế đồ họa, đến dịch vụ khách hàng và hỗ trợ kỹ thuật. Các công ty thường tìm kiếm các đối tác outsource có chuyên môn hoặc kỹ năng đặc biệt, hoặc đơn giản là có thể thực hiện công việc một cách hiệu quả về mặt chi phí và thời gian.

Với ngành công nghệ thông tin, loại hình outsource rất phổ biến. Các công ty outsource này thường có tính chuyên môn hóa rất cao, đội ngũ developer chuyên nghiệp, tester đông đảo, quy trình làm việc cũng khác với các công ty product. Vậy nên, các công ty cần phải có kế hoạch và quản lý tốt để đảm bảo sự thành công của dự án outsource, làm hài lòng khách hàng.

  Chuyện bi kịch của công ty code outsourcing

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

Việc sử dụng outsource trong ngành công nghệ thông tin mang lại nhiều lợi ích, nhưng cũng có những rủi ro và thách thức cần phải được xem xét. Dưới đây là một số ưu nhược điểm của hình thức outsource:

Ưu điểm

  • Tính chuyên môn hóa cao: Các công ty outsource thường sẽ chuyên về một mảng nhất định và phát triển năng lực tốt nhất trong mảng đó. Vậy nên hiệu quả công việc họ mang lại sẽ rất tốt, doanh nghiệp có thể tận dụng thời gian để làm những việc quan trọng hơn.
  • Giảm chi phí: Việc sử dụng outsource sẽ tiết kiệm chi phí hơn so với product, bởi doanh nghiệp sẽ không phải tốn thêm tiền đào tạo nhân viên, chi trả phí bảo hiểm hay lương thưởng hàng năm.
  • Tiếp cận công nghệ mới nhanh chóng: Với các công ty công nghệ thì việc tiếp cận với công nghệ mới là điều cần thiết, tuy nhiên chi phí đầu tư là vô cùng tốn kém. Vậy nên, outsource là một giải pháp thiết thực giúp doanh nghiệp tiếp cận với nguồn công nghệ mới dễ dàng hơn.
  • Đảm bảo công việc hoàn thành đúng deadline: Vì outsource làm việc theo hợp đồng nên việc đảm bảo đúng deadline là điều tất yếu. Thêm nữa, phía bên outsource phải đảm bảo chất lượng công việc theo như hợp đồng, nếu chưa hài lòng, phía khách hàng có thể đưa ra yêu cầu sửa chữa.

Nhược điểm

  • Rủi ro bảo mật: Vấn đề bảo mật là điều các doanh nghiệp lo lắng nhất khi lựa chọn hình thức outsource. Vì vậy khi lựa chọn đối tác outsource, doanh nghiệp cần phải thật thận trọng, lựa chọn các công ty uy tín để không làm lộ thông tin ra bên ngoài.
  • Khó khăn trong quản lý: Việc quản lý đối tác outsource có thể gặp phải nhiều khó khăn do địa lý xa cách hoặc khác biệt văn hóa, ngôn ngữ.
  • Không thể kiểm soát hoàn toàn chất lượng sản phẩm: Việc chưa hiểu hết tính chất và mục đích công việc dẫn đến kết quả công việc không theo đúng yêu cầu của doanh nghiệp.

Xem thêm tuyển dụng Fresher JavaScript hấp dẫn trên TopDev

Công ty outsource và product khác nhau như thế nào?

Outsource Product
Khái niệm Đây là công ty thuê ngoài, được thuê để làm phần mềm cho các công ty khác. Doanh thu của các công ty này có được dựa trên số giờ làm việc hoặc số dự án đã hoàn thành. Đây là các công ty xây dựng sản phẩm, làm mọi hoạt động phát triển sản phẩm từ A đến Z, kiếm tiền trên chính sản phẩm họ tạo ra.
Mục tiêu Làm hài lòng khách hàng, đối tác đã thuê họ. Họ phải đảm bảo deadline, chất lượng sản phẩm để giao cho khách hàng. Làm cho người dùng cuối hài lòng về sản phẩm doanh nghiệp tạo ra. Phải liên tục cải tiến, cập nhật tính năng mới, sửa lỗi để đáp ứng nhu cầu của người dùng.
Quy trình sản xuất Sản xuất phần mềm theo brief từ khách hàng, sẽ theo hơi hướng “công nghiệp”. Quy mô và cách tổ chức nhân sự chuyên nghiệp hơn công ty product nhưng thời gian gắn bó với dự án sẽ ít hơn. Thực hiện sản xuất phần mềm từ A đến Z, từ việc nghiên cứu thị trường, xây dựng sản phẩm đến quảng cáo sản phẩm. Do đó, nhân sự bên product sẽ có sự gắn bó hơn với doanh nghiệp.
Tính chất công việc Vì bị ràng buộc về nhiều thứ như deadline, ngân sách, chất lượng sản phẩm nên phía outsource thường có quy trình làm việc cứng nhắc, chủ yếu là hoàn thành sản phẩm theo yêu cầu để giao cho khách hàng.

Nhân sự outsource sẽ chỉ được làm việc trên một vấn đề rất nhỏ trong thời gian ngắn, hiếm khi được trải nghiệm hết một chu kỳ của sản phẩm. Điều này làm giảm tính sở hữu của nhân viên, nhân viên chỉ tập trung làm hài lòng khách hàng hơn là đưa ra ý tưởng để cải thiện trải nghiệm người dùng.

Công ty product sẽ tập trung vào người dùng cuối, làm cho họ hài lòng về sản phẩm. Các lập trình viên sẽ được tham gia vào toàn bộ vòng đời của sản phẩm, đến cả sau khi sản phẩm được đưa ra thị trường.

Điều này làm cho nhân viên cảm thấy trân trọng công việc mình làm hơn, quyền sở hữu sẽ cao hơn. Vậy nên, nhân viên luôn mong muốn mang lại những trải nghiệm tốt nhất cho người dùng, nỗ lực hơn để cải tiến chương trình và đưa ra những quyết định phù hợp với người dùng cuối.

Đối tượng khách hàng Khách hàng là công ty hoặc doanh nghiệp thuê outsource để thực hiện phần mềm/dự án.  Khách hàng là người dùng cuối trực tiếp sử dụng sản phẩm/phần mềm.

Fresher Developer nên chọn công ty outsource hay product?

nên chọn công ty outsource hay product?

Việc lựa chọn giữa công ty outsource và công ty product còn phụ thuộc vào mục tiêu nghề nghiệp, mong muốn và sở thích của mỗi người. 

Ở công ty outsource thường có nhiều dự án và khách hàng khác nhau, giúp fresher developer có cơ hội tiếp cận với nhiều công nghệ, kỹ năng và kinh nghiệm mới. Ngoài ra, công ty outsource thường có quy trình sản xuất sản phẩm đơn giản hơn, giúp fresher developer dễ dàng học và hiểu quy trình sản xuất.

Công việc trong công ty outsource cũng có tính động lực cao, yêu cầu fresher developer phải có tư duy sáng tạo và khả năng giải quyết vấn đề.

Còn ở công ty product, nếu fresher developer có sở thích và đam mê về một lĩnh vực cụ thể, ví dụ như game hay tài chính, thì công ty product có thể là lựa chọn tốt hơn. Công ty product thường tập trung vào nghiên cứu và phát triển sản phẩm mới, đòi hỏi nhân viên có kiến thức chuyên sâu và kinh nghiệm trong lĩnh vực đó.

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

Tổng kết

Hy vọng rằng với những chia sẻ trên của TopDev có thể giúp bạn hiểu rõ công ty outsource là gì, cũng như biết được những ưu nhược điểm của công ty outsource và product. Nếu bạn là fresher developer đang phân vân lựa chọn giữa công ty outsource và công ty product, hãy xác định rõ mục tiêu nghề nghiệp và sở thích của mình để đưa ra quyết định chính xác nhất nhé!

Xem thêm:

Xem thêm các công việc ngành IT hấp dẫn trên TopDev

Giao thức SSH là gì? Hướng dẫn sử dụng SSH từng bước

Giao thức SSH là gì? Hướng dẫn sử dụng SSH từng bước

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

Trong một ngày đẹp trời, mình được sếp giao nhiệm vụ “tối quan trọng” đó là quản trị hệ thống server của công ty. Nhưng mình đâu có biết quản trị server là thế nào đâu? Đến chuyện làm sao kết nối tới server còn chưa biết? Giao thức SSH là gì đâu?

Trong lúc khó khăn thường sẽ sản sinh “anh hùng”, và mình bắt đầu học cách quản trị server. Bước đầu tiên đó là tìm hiểu cách kết nối tới server bằng SSH.

Vậy giao thức SSH là gì? Nó có phải thứ chỉ dành chuyên gia không? Bài viết này mình sẽ chia sẻ những kiến thức mình học được trong quá trình tìm hiểu về SSH.

#SSH là gì?

Secure Shell (hay còn gọi là SSH) là một giao thức mạng cho phép người dùng thực hiện kết nối giữa máy chủ và máy khách một cách an toàn và bảo mật. SSH keys cung cấp một cách an toàn hơn để đăng nhập vào máy chủ bằng SSH so với chỉ sử dụng mật khẩu.

Mật khẩu cũng có thể bị lộ hoặc bị đánh cắp bằng ‘Brute Force attach’, SSH key gần như không thể giải mã bởi ‘Brute Force’.

Lý do để giao thức SSH bảo mật hơn, đó chính là sử dụng một cặp key: Public key và Private key.

Kết nối tới server sử dụng giao thức SSH
Kết nối tới server sử dụng giao thức SSH

 

Bạn có thể đặt ‘Public Key’ trên bất kỳ máy chủ nào, sau đó mở khóa bằng cách kết nối với Client đã có ‘Private Key’. Khi hai khóa khớp với nhau, hệ thống sẽ tự động kết nối mà không cần mật khẩu. Bạn có thể tăng cường bảo mật hơn nữa bằng cách bảo vệ ‘Private Key’ bằng mật khẩu.

  Hướng dẫn cài đặt SSH KEY cho server Linux

#Cách thức hoạt động SSH

Đọc qua khái niệm SSH, có lẽ bạn vẫn còn hơi mơ hồ về giao thức bảo mật này đúng không? Để hiểu được, bạn cần phải biết cách thức hoạt động của nó.

Với các bạn sử dụng Linux hay MacOs thì việc sử dụng SSH sẽ dễ hơn rất nhiều so với Window.

Trên Linux thì một câu lệnh SSH sẽ gồm 3 phần: ssh {user}@{host}

Trong đó:

  • ssh : đây là câu lệnh để hệ thống biết được bạn muốn tạo một kết nối bảo mật Secure Shell Connection.
  • {user}: là tài khoản mà bạn muốn dùng để truy cập. Ví dụ: tài khoản root
  • {host}: Là địa chỉ máy tính bạn muốn kết nối tới. Nó có thể là một địa chỉ IP hoặc một domain.

Khi bạn enter câu lệnh trên, máy tính sẽ yêu cầu bạn nhập mật khẩu tương ứng với tài khoản truy cập trong câu lệnh. Nếu nhập đúng là bạn đã kết nối thành công.
Cách thức hoạt động SSH

#Khi nào thì sử dụng SSH

Như mình đã nói ở trên SSH là gì, SSH có ưu điểm vượt trội về mặt bảo mật so với hình thức kết nối sử dụng mật khẩu truyền thống.

Vì vậy, lý do đầu tiên đó chính là tính bảo mật. Đảm bảo việc kết nối tới server được an toàn, không bị hacker lấy trộm thông tin, cũng như khỏi sợ việc bị hack mật khẩu, bị cài keylogger để trộm mật khẩu.

Ngoài ra, vì kết nối không cần nhập mật khẩu nên sẽ vô cùng tiện lợi. Bạn sẽ chỉ cần phải thiết lập một lần và sau đó quên nó đi, việc kết nối tới server là vô cùng đơn giản và nhanh chóng.

  Tự tạo SSH tunnel để forward port ra remote server

Về cá nhân mình, Mình làm việc trên MacOS nên việc ssh vào server rất nhiều nên việc mỗi lần login theo cách bằng mật khẩu truyền thống, nó rất nguy hiểm nếu như máy tính bạn có mã độc hoặc vô tình làm lộ mật khẩu

Ngoài ra mình thường xuyên setup Cron Job để copy file từ server này sang server kia hoặc từ server về local. Nên việc sử dụng ssh no password là rất rất cần thiết.

Do đó mình khuyên là hãy thực hành làm cho quen và sử dụng SSH ngay.

Xem thêm các việc làm Linux lương cao trên TopDev

#Hướng dẫn kết nối server sử dụng SSH

Như mình đã nói ở trên, để kết nối sử dụng giao thức SSH, bạn cần phải có private key trên máy tính local của mình và public key trên server.

1. Tạo SSH Keys

Mình sẽ hướng dẫn các bạn từng bước tạo 2 keys này trên cả Linux và Window. Sau đó sử dụng 2 key này để có thể kết nối máy tính tới server qua giao thức SSH.

1.1 Đối với Linux và macOS

Khi tạo khóa SSH trong Linux, bạn có thể sử dụng lệnh ssh-keygen được tích hợp sẵn. Để làm đươc như vậy, hãy thực hiện theo những bước sau:

Mở Terminal. Nhập lệnh sau:

ssh-keygen -t rsa -b 4096

Tiếp theo, bạn chọn nơi để lưu Private key.

Enter file in which to save the key (/home/username/.ssh/id_rsa):

Public key sẽ được lưu trong cùng một vị trí, dưới cùng tên tệp, nhưng có phần mở rộng .pub. Nếu bạn không nhập gì thì sẽ sử dụng thư mục mặc định /home/username/.ssh/id_rsa.

Cuối cùng, bạn sẽ phải nhập mật khẩu. Đây sẽ là mật khẩu cần thiết để tải Private key và sử dụng nó để kết nối qua SSH sau này:

Enter passphrase (empty for no passphrase):

Toàn bộ quá trình tạo cặp khóa sẽ như thế này:

username@server.address.com: ssh-keygen -t rsa -b 4096

Generating public/private rsa key pair.

Enter file in which to save the key (/home/username/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in id_rsa.

Your public key has been saved in id_rsa.pub.

The key fingerprint is:

15:8e:e9:f2:1d:c9:b1:ca:41:8a:c3:3b:a1:1d:92:92 username@server.address.com

Như vậy là bạn đã tạo được cả 2 keys:

  • Một Private key được ghi vào /home/{username}/.ssh/id_rsa.
  • Một Public key được ghi vào /home/{username}/.ssh/id_rsa.pub

Trong đó {username} tên đăng nhập của máy tính của bạn.

1.2. Đối với Windows

Để tạo SSH key, mình khuyên các bạn sử dụng phần mềm PuTTY. Sau này, dùng luôn phần mềm này để kết nối bằng SSH tới server.

Với PuTTY, các bước thực hiện như sau:

  • Tải và khởi động puttygen.exe.
  • Trong phần “Parameters”, chọn SSH2 DSA và nhấn Generate.
  • Di chuyển chuột của bạn trong màn hình nhỏ để tạo các khóa.
  • Nhập một comment
  • Nhập mật khẩu và xác nhận nó. Cụm mật khẩu được sử dụng để bảo vệ khóa của bạn.
  • Bạn sẽ được yêu cầu khi bạn kết nối qua SSH.
  • Nhấp vào “Save private key” để lưu Private Key của bạn.
  • Nhấp vào “Save Public key” để lưu Public Key của bạn.

Tạo SSH key bằng PuTTY
Tạo SSH key bằng PuTTY

 

Như vậy là bạn đã tạo xong cả 2 loại key. Việc tiếp theo là thêm public key lên server.

Với ZOC7, bạn làm như sau:

Tạo SSH key bằng ZOC7
Tạo SSH key bằng ZOC7

 

2. Thêm Public Key vào server.

2. 1 Cài đặt SSH trên server

Mặc định thì Linux không có SSH, bạn cần phải cài đặt SSH thì mới sử dụng được.

Ví dụ bạn tự thuê riêng một server, bạn phải tự cài đặt hệ điều hành từ đầu thì sẽ phải cài thêm SSH. Còn với trường hợp VPS thì các nhà cung cấp thường cài đặt sẵn cho bạn SSH rồi.

Đối với RHEL/CentOS

yum -y install openssh-server openssh-clients

chkconfig sshd on

service sshd start

Đối với Ubuntu/Debian

sudo apt install openssh-client

sudo apt install openssh-server

2.2 Thêm Public key lên server

Để thêm SSH Public key của bạn vào máy chủ, bạn sẽ sao chép SSH Public key mà bạn vừa tạo vào máy chủ.

$ cat ~/.ssh/id_rsa.pub | ssh username@server.address.com 'cat >> ~/.ssh/authorized_keys'

Sau đó, máy chủ sẽ nhắc bạn nhập mật khẩu của bạn:

username@server.address.com's password:

Bây giờ bạn sẽ được thiết lập để kết nối với máy chủ mà không cần phải xác thực mật khẩu

3. Đăng nhập vào Server sử dụng SSH key

Để kết nối đến một server sử dụng giao thức SSH, bạn có thể thực hiện trên Window, Linux, hoặc MacOS. Trên Linux thì Terminal đã hỗ trợ sắn tính năng kết nối SSH rồi, bạn có thể sử dụng luôn. Còn với Window thì cần phải cài thêm một phần mềm bên thứ 3.

Ví dụ, với Window thì có nhiều phần mềm giúp bạn kết nối SSH như PuTTY, ZOC7… Cá nhân mình thì hay sử dụng ZOC7 vì giao diện đơn giản, thân thiện.

Những thông tin để đăng nhập một máy chủ qua SSH sẽ gồm:

  • IP của Server. Ví dụ: 104.31.76.95
  • Tên đăng nhập, đa phần là root
  • Mật khẩu đăng nhập
  • Cổng kết nối: 22. Mặc định SSH sử dụng cổng 22
Lưu ý: Bạn sử dụng phần mềm nào để kết nối SSH nào thì dùng chính phần mềm ý tạo SSH Keys để hạn chế những lỗi không đáng có.

Ví dụ, sử dụng phần mềm ZOC7, bạn cần điền thông tin cần thiết khi khởi động ứng dụng như sau:

Đăng nhập vào server sử dụng SSH bằng ZOC7
Đăng nhập vào server sử dụng SSH bằng ZOC7

 

Vậy là xong rồi đấy, từ nay về sau việc kết nối tới server sẽ đơn giản hơn rất nhiều.

#Tạm kết

Như vậy, qua bài viết này các bạn đã hiểu được SSH là gì, cách thức hoạt động, ưu điểm nổi bật của giao thức SSH…

Qua đó, mình khuyên các bạn cũng nên dần bỏ cách thức đăng nhập bằng mật khẩu truyền thống để tăng cường bảo mật cho server.

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

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

Hướng dẫn tạo Gradle Project Java bằng dòng lệnh CMD

Hướng dẫn tạo Gradle Project Java bằng dòng lệnh CMD

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

Trong bài này mình sẽ thực hiện tạo Project Java bằng Gradle trên giao diện dòng lệnh, các bạn có thể thực hiện bằng cmd/powershell trên windows hoặc terminal trên linux.

Hướng dẫn tạo Gradle Project Java bằng dòng lệnh cmd

Đầu tiên tạo folder chứa Project, ví dụ mình tạo folder GradleHello sau đó di chuyển tới folder vừa tạo

tạo Gradle Project Java bằng dòng lệnh cmd

Để tạo project gradle ta dùng lệnh gradle init

Sau khi chạy lệnh gradle init, nó sẽ hiện ra danh sách các loại project. Để tạo project Java thì các bạn chọn java-application

Các câu hỏi sau đó thì các bạn có thể bỏ qua (để nó chọn mặc định – default) bằng cách ấn enter

tạo Gradle Project Java bằng dòng lệnh cmd

Kết quả project GradleHello được tạo ra như sau:

tạo Gradle Project Java bằng dòng lệnh cmd

Trong đó:

  • folder gradle dùng để wrapper các file
  • folder src/main/java chứa mã nguồn java
  • folder src/test/java là folder chứa các file test java

Tìm Java job lương cao trên TopDev

Các file khác:

file settings.gradle dùng để thiết lập các thông tin của project như tên project

/*
 * This file was generated by the Gradle 'init' task.
 *
 * The settings file is used to specify which projects to include in your build.
 *
 * Detailed information about configuring a multi-project build in Gradle can be found
 * in the user manual at https://docs.gradle.org/5.4/userguide/multi_project_builds.html
 */

rootProject.name = 'GradleHello'

file build.gradle chứa thông tin cấu hình gradle như plugin, repository, dependency…

Ví dụ mainClassName = 'GradleHello.App' tức là khi chạy project nó sẽ chạy file App.java trong package GradleHello

plugins {
    // Apply the java plugin to add support for Java
    id 'java'

    // Apply the application plugin to add support for building an application
    id 'application'
}

repositories {
    // Use jcenter for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

dependencies {
    // This dependency is found on compile classpath of this component and consumers.
    implementation 'com.google.guava:guava:27.0.1-jre'

    // Use JUnit test framework
    testImplementation 'junit:junit:4.12'
}

// Define the main class for the application
mainClassName = 'GradleHello.App'

File main java App.java

package GradleHello;

public class App {
    public String getGreeting() {
        return "Hello world.";
    }

    public static void main(String[] args) {
        System.out.println(new App().getGreeting());
    }
}

File test

package GradleHello;

import org.junit.Test;
import static org.junit.Assert.*;

public class AppTest {
    @Test public void testAppHasAGreeting() {
        App classUnderTest = new App();
        assertNotNull("app should have a greeting", classUnderTest.getGreeting());
    }
}

Trong file AppTest.java có sử dụng thư viện JUnit (đây là một dependency được khai báo trong build.gradle)

Demo

Chạy project java gradle vừa tạo bằng lệnh gradle run

Kết quả:

tạo Gradle Project Java bằng dòng lệnh cmd

Okay, Done!

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

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

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

Câu hỏi phỏng vấn Product Owner thường gặp và cách trả lời

Câu hỏi phỏng vấn Product Owner thường gặp và cách trả lời

Vị trí Product Owner xuất hiện phổ biến trong lĩnh vực công nghệ thông tin hiện nay với việc các dự án áp dụng phương pháp phát triển phần mềm linh hoạt Agile. Cũng vì thế mà đây trở thành một vị trí mà nhiều công ty ưu tiên tuyển dụng với các chế độ đãi ngộ cao. Hôm nay chúng ta cùng nhau tìm hiểu về những câu hỏi phỏng vấn dành cho Product Owner thường gặp để chuẩn bị tốt nhất chinh phục các nhà tuyển dụng nhé.

Product Owner là gì?

Product Owner (gọi tắt là PO) hay người “sở hữu” sản phẩm là người chịu trách nhiệm giải quyết những vấn đề liên quan đến sản phẩm được người dùng đưa ra khi sử dụng sản phẩm đó. PO được xem như là người đại diện cho khách hàng để làm việc với team phát triển, có quyền thay đổi thứ tự công việc, độ ưu tiên các tính năng của sản phẩm trong quá trình phát triển dự án.

Product Owner phải là người kết nối được với các bên liên quan đến sản phẩm để xác định được yêu cầu, kỳ vọng mà sản phẩm đáp ứng cũng như đảm bảo lợi nhuận từ sản phẩm với mức đầu tư; từ đó giải thích, giải đáp các thắc mắc cho team phát triển để họ có thể hiểu rõ hơn về tính năng mà sản phẩm sẽ có, khách hàng kỳ vọng.

Product Owner là gì?

Khác với vai trò là một khách hàng trong các mô hình phát triển phần mềm truyền thống, với mô hình Agile, PO sẽ tham gia trực tiếp vào quá trình xây dựng, phát triển sản phẩm. PO thường xuyên gặp và ngồi cùng team phát triển để giải thích về tính năng, theo dõi tiến độ cũng như nghiệm thu các giai đoạn sản phẩm từ team phát triển. Hơn thế, PO còn có thể nhận tư vấn từ team phát triển và lựa chọn phương án thiết kế hay điều chỉnh tính năng một cách phù hợp. Và quan trọng nhất, PO chính là người chịu trách nhiệm cao nhất đối với bất cứ sự thành công hay thất bại của một sản phẩm.

Công việc của một Product Owner là gì?

Là người “sở hữu” sản phẩm, công việc của một Product Owner xoay quanh việc định hình sản phẩm bằng cách kết nối với các stakeholder và phát triển, xây dựng, tạo ra một sản phẩm thành công. Cụ thể:

  • Tìm hiểu, phân tích và định hướng phát triển sản phẩm trong tương lai
  • Xác định, quản lý các tính năng mong muốn trong Product Backlog
  • Tối ưu hóa lợi nhuận trên vốn đầu tư
  • Đánh giá và điều chỉnh tiến độ dự án phù hợp
  • Kết nối giữa các Stakeholders
  • Truyền đạt thông tin, yêu cầu đầy đủ về sản phẩm đến nhóm phát triển
  • Tham gia họp cùng team phát triển, theo dõi tiến độ của sản phẩm
  • Chịu trách nhiệm về các vấn đề xảy ra liên quan đến đầu ra của sản phẩm hay tiến độ phát triển của sản phẩm với các nhà đầu tư hay các bên liên quan(Stakeholders)

  Top 5 câu hỏi phỏng vấn C++ hay và khó

Có những loại Stakeholder nào và làm sao để quản lý  các Stakeholder

Stakeholder

Stakeholder là một cá nhân, nhóm người hoặc một tổ chức bị ảnh hưởng bởi kết quả của dự án hay có thể là người đóng góp trực tiếp từ bên trong dự án. Thông thường có 2 loại stakeholders:

  • Internal Stakeholders: những người trong nội bộ tổ chức như nhân viên, ban lãnh đạo, quản lý dự án, nhà đầu tư,… Là những người trực tiếp tham gia dự án, là dự án của họ hoặc họ được thuê để làm.
  • External Stakeholders: là những người nằm ngoài tổ chức, gián tiếp bị ảnh hưởng bởi dự án như các nhà cung cấp, khách hàng, bên thứ 3, đối thủ,….

Để quản lý các Stakeholders thì chúng ta áp dụng 4 bước như dưới đây:

  1. Xác định các Stakeholders
  2. Lên kế hoạch về sự tham gia, đóng góp của Stakeholders
  3. Quản lý sự đóng góp, tham dự của Stakeholders
  4. Giám sát hoạt động của Stakeholders

  Tuyển tập câu hỏi phỏng vấn Data Engineer mới nhất

Phân biệt vai trò của Product Owner và Scrum Master

Scrum Master (SM) là một vị trí trong khung quản lý dự án Scrum (một phương pháp Agile). Vai trò của SM và PO trong dự án Scrum khá là khác nhau và hỗ trợ cho nhau để phát triển, quản lý dự án.

Cụ thể:

  • Về mục tiêu: SM sẽ là người đảm bảo dự án được quản lý, phát triển theo đúng mô hình Agile/Scrum nhằm đạt hiệu suất trong team phát triển một cách tốt nhất. Trong khi đó PO có mục tiêu liên quan trực tiếp đến chất lượng sản phẩm của dự án. Như vậy cũng có thể nói rằng mục tiêu của PO đạt được chỉ khi SM cũng hoàn thành được mục tiêu của mình.
  • Về nhiệm vụ: SM cũng là một thành viên của team phát triển có nhiệm vụ lập kế hoạch triển khai dự án theo khung Scrum; còn nhiệm vụ của PO là đảm bảo chất lượng đầu ra sản phẩm theo đúng định hướng, tối ưu hóa giá trị và lợi nhuận của dự án.
  • Về kỹ năng: SM tất nhiên sẽ phải là người nắm vững kiến thức về Agile/Scrum đồng thời là cách tổ chức và triển khai dự án theo khung Scrum. PO là người cần phải làm việc với nhiều bên, vì thế kĩ năng đàm phán và giao tiếp là những kỹ năng quan trọng nhất. Ngoài ra PO sẽ thường là người đưa ra các quyết định, trong khi SM là người giúp một team tổ chức đưa ra quyết định.

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

So sánh công việc của Product Owner, Project Manager và Product Manager

Product Owner, Project Manager và Product Manager
Nguồn; https://teamhood.com/project-management/product-owner-vs-project-manager/

Project Manager hay PM là người quản lý dự án với nhiệm vụ chính là quản lý các bộ phận trong dự án xây dựng và phát triển sản phẩm. Mục tiêu trọng tâm của một PM là làm sao để dự án hoàn thành đúng thời hạn, trong phạm vi chi phí đã lên kế hoạch đảm bảo đầu ra để khách hàng (hoặc PO) có thể nghiệm thu. PM sẽ là người làm việc với PO một cách chặt chẽ nhất để có thể lấy được yêu cầu chính xác từ PO cũng như là người cập nhật tình hình tiến độ của sản phẩm và các vấn đề liên quan đến team phát triển.

Ngoài PM và PO thì chúng ta còn có một vị trí nữa là Product Manager – người quản lý sản phẩm. Product Manager là người chịu trách nhiệm trong việc kết nối, dẫn dắt các bộ phận hoặc quy trình để tạo ra sản phẩm; đồng thời cũng là người đưa ra chiến lược về sản phẩm từ giai đoạn lên kế hoạch, phát triển và phát hành sản phẩm. So với PO thì Product Manager tập trung nhiều hơn vào tầm nhìn của sản phẩm, đưa ra các chiến lược dài hạn, xác định các cơ hội mới, xu hướng thị trường để có thể cải tiến được sản phẩm.

Có nhiều tổ chức sẽ gộp 2 vị trí Product Manager và Product Owner vào chung, nó phù hợp với quy mô của công ty vừa và nhỏ, ít sản phẩm hay các sản phẩm liên quan chặt chẽ đến nhau. 

Những chứng chỉ cần có dành cho Product Owner

Những chứng chỉ Product Owner giá trị và được đánh giá cao bởi nhiều tổ chức bao gồm:

  • Professional Scrum Product Owner (PSPO) I, II và III: đây là chứng chỉ được cấp bởi tổ chức Scrum.org
  • Scrum Alliance Certified Product Owner (CSPO): chứng chỉ được công nhận bởi Scrum Alliance
  • Certified SAFe Product Manager/Product Owner (POPM): chứng chỉ do Scaled Agile Framework cung cấp

Định hướng phát triển của Product Owner trong tương lai

Product Owner có khá nhiều định hướng nghề nghiệp do đặc thù của vị trí này cần những kĩ năng khác nhau từ cả quản lý, điều hành đến hiểu biết về sản phẩm và thị trường. Trong câu hỏi này, nhà tuyển dụng sẽ muốn hỏi về định hướng tương lai của bạn sau khi trải qua vị trí Product Owner, một số định hướng về vị trí sau đây bạn có thể lựa chọn:

  • Business Analyst: PO là những người thường xuyên làm việc với khách hàng và cần có những kiến thức nhất định về kinh doanh. Vì vậy trở thành nhà phân tích kinh doanh là một hướng đi tiềm năng nhất là với các bạn có sở thích về mảng Business.
  • Project Manager: trở thành một quản lý dự án lớn cũng là một lựa chọn dành cho bạn có năng lực tốt, kỹ năng quản lý phù hợp. PM sẽ đảm nhiệm vai trò lập kế hoạch và quản lý dự án một cách rõ ràng hơn, ngoài ra quản trị con người cũng là một yếu tố để bạn phấn đấu.
  • Product Manager: Nếu bạn muốn đi theo hướng sản phẩm, xây dựng một sản phẩm hay hệ sinh thái sản phẩm có dấu ấn của riêng mình thì trở thành người quản lý sản phẩm là một hướng đi dành cho bạn.
  • Giám đốc điều hành (CEO): PO có đủ phẩm chất từ quản lý đến tố chất lãnh đạo để trở thành một CEO tương lai nếu bạn mong muốn. 

Kết bài

Product Owner luôn có vai trò rất quan trọng quyết định đến sự thành công của một sản phẩm, một dự án; vì thế cuộc phỏng vấn cho vị trí này sẽ đòi hỏi chúng ta cần thể hiện được nhiều kĩ năng chuyên môn cũng như cả kỹ năng mềm trong xử lý tình huống. Hy vọng bài viết này mang lại cho bạn chút tự tin để hoàn thành buổi phỏng vấn của mình. Hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm: 

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

Tìm hiểu ngôn ngữ lập trình và xếp hạng 15 NNLT phổ biến nhất năm 2024

Với sự phát triển nhanh chóng của công nghệ và nhu cầu sử dụng phần mềm ngày càng tăng, số lượng của các ngôn ngữ lập trình theo đó cũng tăng lên không ngừng. Vậy đâu là những ngôn ngữ lập trình phổ biến nhất? Đặc điểm của những ngôn ngữ lập trình đó là gì?  Bài viết này, TopDev sẽ giới thiệu bạn Top 15 ngôn ngữ trình được sử dụng nhiều nhất và lý do tại sao chúng lại được ưa chuộng như vậy.

Tìm hiểu ngôn ngữ lập trình và xếp hạng 15 NNLT phổ biến nhất năm 2024

Ngôn ngữ lập trình là gì?

Ngôn ngữ lập trình (tiếng Anh: Programming Language) là một phương tiện mà các lập trình viên sử dụng để giao tiếp với máy tính. Nó là một tập hợp các quy ước, cú pháp đặc biệt được sử dụng để tạo ra các chương trình máy tính.

Hay nói đơn giản, ngôn ngữ lập trình là dạng “ngôn ngữ” mà con người có thể hiểu được (human code), sau đó được biên dịch thành mã máy (machine code) bởi trình biên dịch để giao tiếp với các thiết bị công nghệ số.

Các ngôn ngữ lập trình khác nhau có thể được sử dụng để phát triển các loại phần mềm khác nhau, từ các ứng dụng di động, trang web cho đến phần mềm máy tính và các hệ thống nhúng. Những ngôn ngữ lập trình càng phổ biến thì càng có nhiều người sử dụng và đóng vai trò quan trọng trong việc phát triển các sản phẩm công nghệ.

Lịch sử hình thành và phát triển của ngôn ngữ lập trình

Ngôn ngữ lập trình có lịch sử phát triển gắn liền với sự ra đời của máy tính. Vào những năm 1800, Charles Babbage đã phát minh ra mô hình máy tính đầu tiên, và Ada Lovelace đã viết chương trình đầu tiên cho máy tính này.

Trong những năm 1940 và 1950, các ngôn ngữ lập trình đầu tiên như Fortran, Algol, và Lisp ra đời, phục vụ cho tính toán khoa học và điều khiển thiết bị. Đến thập niên 1960, COBOL xuất hiện, trở thành ngôn ngữ phổ biến trong các ứng dụng kinh doanh.

Thập niên 1970 đánh dấu sự ra đời của ngôn ngữ C, một ngôn ngữ nền tảng cho nhiều ngôn ngữ hiện đại. Trong những năm 1990, JavaPython ra mắt, cùng với sự phát triển mạnh mẽ của lập trình web với các ngôn ngữ như PHPJavaScript.

Ngày nay, ngôn ngữ lập trình tiếp tục phát triển để đáp ứng các nhu cầu công nghệ mới như trí tuệ nhân tạo và Internet of Things (IoT).

Thành phần và cấu trúc của ngôn ngữ lập trình

Hiểu rõ các thành phần cấu trúc của một ngôn ngữ lập trình là điều cần thiết để lập trình viên sử dụng ngôn ngữ một cách hiệu quả. Dưới đây là các thành phần chính:

Bộ ký tự (Character set)

Bộ ký tự của một ngôn ngữ lập trình bao gồm các ký tự và biểu tượng cần thiết để tạo nên mã nguồn. Điều này bao gồm các chữ cái, số, toán tử, từ khóa, ký hiệu đặc biệt và khoảng trắng. Mỗi ngôn ngữ lập trình có một bộ ký tự riêng biệt, phù hợp với cú pháp và cách thức hoạt động của nó.

Cú pháp (Syntax)

Cú pháp (syntax) là tập hợp các quy tắc xác định cách sắp xếp và cấu trúc các thành phần trong một chương trình. Nó giúp developer viết code đúng syntax và không có lỗi cú pháp. Các quy tắc cú pháp bao gồm cách đặt tên biến, định nghĩa hàm, sử dụng câu lệnh điều khiển,… Việc code đúng cú pháp là bắt buộc để chương trình có thể chạy đúng cách.

Ngữ nghĩa (Semantics)

Ngữ nghĩa liên quan đến ý nghĩa và mục đích của các câu lệnh, biểu thức và cấu trúc mã trong ngôn ngữ lập trình. Ngữ nghĩa được xác định bởi các quy tắc lập trình và cú pháp của ngôn ngữ. Hiểu ngữ nghĩa là điều quan trọng để phát triển và duy trì các ứng dụng phần mềm chất lượng cao.

Các thành phần này tạo nên nền tảng cho việc viết mã và phát triển ứng dụng trong bất kỳ ngôn ngữ lập trình nào.

Top 15 ngôn ngữ lập trình phổ biến nhất hiện nay 

Dưới đây là danh sách top 16 ngôn ngữ lập trình phổ biến nhất hiện nay (Update August 2024) – nguồn TIOBE Programming Community

Python

top 1 - ngôn ngữ lập trình python

Đứng đầu trong danh sách các ngôn ngữ lập trình phổ biến nhất năm 2024 chính là Python. Đây là một ngôn ngữ lập trình mã nguồn mở, được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau, từ khoa học dữ liệu, trí tuệ nhân tạo, phát triển web, đến quản lý hệ thống và giáo dục.

Python được thiết kế để có cú pháp rõ ràng và dễ đọc, giúp các lập trình viên dễ dàng hiểu và thao tác với mã nguồn. Nó cũng được tích hợp với nhiều thư viện và framework phổ biến như Pandas, Django và Flask, giúp cho việc phát triển các ứng dụng trở nên dễ dàng hơn và nhanh chóng hơn.

Đặc biệt, Python còn là một trong những ngôn ngữ lập trình được sử dụng nhiều nhất trong lĩnh vực trí tuệ nhân tạo, với các thư viện như TensorFlow và PyTorch giúp cho việc phát triển các mô hình học máy và deep learning trở nên dễ dàng hơn. Tuy vậy, Python còn hoạt động khá chậm do hoạt động với trình thông dịch.

C

Mặc dù đã ra đời từ lâu, C vẫn giữ vững vị trí của mình trong top các ngôn ngữ lập trình phổ biến nhờ vào sự đơn giản, hiệu quả và khả năng kiểm soát phần cứng chặt chẽ. Nhiều ngôn ngữ lập trình hiện đại như C++, C#, Java, và Python đều chịu ảnh hưởng sâu sắc từ C, thậm chí nhiều trình biên dịch, hệ điều hành, và các phần mềm hiệu suất cao khác cũng được viết bằng C.

C cho phép lập trình viên tương tác trực tiếp với phần cứng, quản lý bộ nhớ và điều khiển luồng dữ liệu một cách chi tiết. Điều này làm cho C trở thành lựa chọn lý tưởng cho các ứng dụng yêu cầu hiệu suất cao, chẳng hạn như hệ điều hành, trình biên dịch, và các phần mềm nhúng.

C là ngôn ngữ lập trình đầu tiên mà nhiều lập trình viên học vì nó là nền tảng của nhiều hệ thống và là ngôn ngữ quan trọng cho các kỹ sư phần mềm, nhà phát triển hệ thống và những ai làm việc với các ứng dụng yêu cầu hiệu suất cao.

Java

Java thường được gọi vui là “ngôn ngữ viết một lần chạy mọi nơi” bởi tính đa năng, hướng đối tượng và khả năng sử dụng ở bất cứ nền tảng nào. Các lập trình viên chỉ cần viết một lần là sẽ chạy được trên nhiều nền tảng khác nhau mà không cần phải viết lại mã nguồn.

Java cũng được sử dụng rộng rãi trong phát triển ứng dụng di động, phát triển ứng dụng trên máy chủ và phát triển ứng dụng web. Nó cũng được sử dụng để phát triển các ứng dụng trong các lĩnh vực như tài chính, giáo dục, y tế và nhiều lĩnh vực khác.

Tuy nhiên, Java vẫn có nhược điểm là không phù hợp với các chương trình chạy trên nền tảng đám mây. Đồng thời, khi vận hạnh sẽ tiêu tốn nhiều bộ nhớ và tốc độ cũng không nhanh bằng các ngôn ngữ lập trình khác.

JavaScript

Đã từng là ngôn ngữ đứng đầu danh sách các ngôn ngữ lập trình phổ biến nhất không ai khác chính là JavaScript, tuy nhiên JavaScript đã tuột xuống hạng 3. Đây là một ngôn ngữ lập trình hướng đối tượng, được thiết kế để tương tác với HTML và CSS. Với JavaScript, các nhà phát triển có thể tạo ra các ứng dụng web dễ dàng, từ các trò chơi đơn giản đến các ứng dụng web động và thậm chí là các ứng dụng web phức tạp như trang thương mại điện tử.

JavaScript là một ngôn ngữ linh hoạt và có thể được sử dụng cả trên phía máy chủ và phía client. Ngoài ra, JavaScript còn có rất nhiều thư viện và framework phổ biến như ReactJS, AngularJS, VueJS, giúp cho việc phát triển các ứng dụng web trở nên dễ dàng và hiệu quả hơn.

Nhiều ông lớn trong ngành công nghệ như Google, PayPal, Microsoft đã và đang sử dụng JavaScript. Do đó, sự phổ biến của JavaScript vẫn đang tiếp tục tăng lên và là một trong những ngôn ngữ lập trình quan trọng nhất trong thời đại số ngày nay.

  Cách viết "Hello World" với 28 Ngôn ngữ Lập trình

  Ngôn ngữ lập trình bậc cao - Cao thấp do đâu?

SQL

SQL (Structured Query Language) là một ngôn ngữ lập trình chuyên dụng được sử dụng để quản lý và thao tác các cơ sở dữ liệu quan hệ. Được phát triển lần đầu vào những năm 1970 bởi IBM, SQL đã trở thành tiêu chuẩn quốc tế cho việc truy vấn và xử lý dữ liệu trong các hệ quản trị cơ sở dữ liệu (DBMS) như MySQL, PostgreSQL, Oracle Database, và Microsoft SQL Server.

SQL hiện nay là một trong những ngôn ngữ lập trình phổ biến nhất trên thế giới, xếp thứ 7 trong danh sách các ngôn ngữ lập trình phổ biến. Điều này không chỉ do tính quan trọng của SQL trong việc quản lý dữ liệu mà còn bởi tính đơn giản, dễ học và khả năng áp dụng rộng rãi trong nhiều lĩnh vực, từ phát triển phần mềm, phân tích dữ liệu, đến khoa học dữ liệu và trí tuệ nhân tạo.

Golang

Golang (hay còn gọi là Go) là một ngôn ngữ lập trình mới được phát triển bởi Google vào năm 2007 và chính thức ra mắt vào năm 2009. Golang được tích hợp một bộ sưu tập các công cụ, thư viện và framework tiện ích, giúp cho việc phát triển và triển khai các ứng dụng nhanh chóng, dễ dàng hơn.

Golang được sử dụng rộng rãi trong các ứng dụng web và các hệ thống phân tán, đặc biệt là các hệ thống liên quan đến lĩnh vực tài chính và các ứng dụng big data. Golang cũng được sử dụng để phát triển các công cụ và dịch vụ của Google, và được coi là một trong những ngôn ngữ lập trình phổ biến nhất hiện nay.

R

R là một ngôn ngữ lập trình chuyên dụng được thiết kế cho phân tích dữ liệu và thống kê. Được phát triển đầu tiên bởi các nhà thống kê, R nhanh chóng trở thành một công cụ quan trọng và phổ biến trong lĩnh vực khoa học dữ liệu, thống kê và phân tích dữ liệu.

R cung cấp một loạt các công cụ mạnh mẽ cho việc phân tích và trực quan hóa dữ liệu, từ những phép tính thống kê cơ bản đến các mô hình dự đoán phức tạp.

R cũng được sử dụng rộng rãi trong nghiên cứu và phát triển trí tuệ nhân tạo (AI), nơi các nhà khoa học dữ liệu tận dụng khả năng phân tích dữ liệu mạnh mẽ của nó để phát triển các mô hình học máy và các ứng dụng AI khác. Với khả năng xử lý dữ liệu lớn, R là công cụ được nhiều tổ chức, doanh nghiệp và trường đại học tin dùng trong các dự án phân tích dữ liệu và thống kê trên quy mô lớn.

PHP

ngôn ngữ lập trình PHP

Theo thống kê, có hơn 80% website hiện nay được tạo nên dựa trên PHP, điều này cho thấy mức độ phổ biến của ngôn ngữ lập trình này. PHP là một ngôn ngữ lập trình mã nguồn mở được phát triển cho mục đích tạo ra các trang web động. Ngoài ra, PHP có thể chạy trên nhiều hệ điều hành khác nhau và được hỗ trợ bởi hầu hết các nhà cung cấp dịch vụ lưu trữ web.

PHP được sử dụng rộng rãi trong các ứng dụng web như blog, trang thương mại điện tử, hệ thống quản lý nội dung (CMS), diễn đàn và các ứng dụng web khác. Với cộng đồng lập trình viên lớn và các tài liệu hướng dẫn phong phú, PHP là một trong những ngôn ngữ lập trình phổ biến nhất trên thế giới và vẫn tiếp tục phát triển để đáp ứng nhu cầu của các ứng dụng web hiện đại.

Việc làm Back-end Developer hấp dẫn đang chờ bạn tại TopDev

TypeScript

TypeScript là một ngôn ngữ lập trình mã nguồn mở được phát triển và duy trì bởi Microsoft. Được coi là một phần mở rộng của JavaScript, TypeScript giữ nguyên cú pháp của JavaScript trong khi bổ sung các tính năng mạnh mẽ như kiểm tra kiểu tĩnh (static typing) và hỗ trợ lập trình hướng đối tượng (object-oriented). TypeScript được thiết kế để giải quyết những hạn chế của JavaScript, đặc biệt trong các dự án lớn và phức tạp, nơi việc quản lý các kiểu dữ liệu (data types) trở nên quan trọng.

Một trong những ưu điểm chính của TypeScript là khả năng phát hiện lỗi ngay trong quá trình phát triển nhờ tính năng kiểm tra kiểu tĩnh, giúp lập trình viên phát hiện và sửa lỗi sớm hơn. TypeScript cũng cho phép lập trình viên sử dụng các tính năng tiên tiến của JavaScript (như ES6) ngay cả khi trình duyệt không hỗ trợ trực tiếp, bằng cách biên dịch mã TypeScript về JavaScript tương thích.

C#

C# là một ngôn ngữ lập trình được phát triển bởi Microsoft, được thiết kế để tạo ra các ứng dụng Windows và ứng dụng web, và có thể được sử dụng để phát triển các ứng dụng trên nhiều nền tảng khác nhau, bao gồm cả Android và iOS.

C# được thiết kế dựa trên ngôn ngữ C++ và có cú pháp tương tự như Java. Vì vậy, nếu muốn thực hiện tốt các thao tác người dùng phải có kiến thức về các ngôn ngữ lập trình phổ biến như C, C++, Java.

Nhược điểm của C# là ít linh hoạt bằng các ngôn ngữ khác vì phụ thuộc vào .NET framework của Microsoft. Thêm nữa, việc tìm lỗi và gỡ lỗi trên C# cũng gây khó khăn cho các lập trình viên.

C++

C++ nằm trong top các ngôn ngữ lập trình phổ biến nhất bởi tính đa năng và khả năng sử dụng mạnh mẽ. C++ được phát triển từ ngôn ngữ C, với việc bổ sung thêm các tính năng hướng đối tượng và một số tính năng khác. Đây là ngôn ngữ được sử dụng rộng rãi trong lập trình game, do tính năng xử lý đa luồng của nó và khả năng tối ưu hóa mã. C++ cũng được sử dụng trong phát triển các ứng dụng desktop và phần mềm nhúng, nơi yêu cầu hiệu suất cao và kiểm soát bộ nhớ chặt chẽ.

Kotlin

Kotlin là một ngôn ngữ lập trình cấp cao, được phát triển bởi JetBrains, cùng với việc được hỗ trợ chính thức bởi Google cho việc phát triển ứng dụng Android. Với Kotlin, lập trình viên có thể viết code ngắn gọn hơn so với Java, nhưng vẫn đảm bảo tính hiệu quả và tính chính xác. Kotlin cũng cung cấp một số tính năng mới, bao gồm hỗ trợ lập trình hướng đối tượng, lập trình hàm, và lập trình phi tuyến tính.

Với sự hỗ trợ của Google, Kotlin đã trở thành một trong những ngôn ngữ lập trình phổ biến nhất cho phát triển ứng dụng Android. Nó cũng được sử dụng trong nhiều dự án khác, từ phát triển web đến phát triển phần mềm máy tính và ứng dụng nhúng.

Swift

ngôn ngữ lập trình swift

Swift là một ngôn ngữ lập trình mới được phát triển bởi Apple, dùng để phát triển các ứng dụng cho hệ điều hành iOS, macOS hoặc watchOS. Nó được giới thiệu lần đầu tiên vào năm 2014 và đã nhanh chóng trở thành một trong những ngôn ngữ lập trình phổ biến nhất hiện nay.

Swift được xây dựng trên nền tảng của Objective-C, nhưng nó có cú pháp đơn giản hơn, dễ đọc và dễ viết hơn nhiều so với Objective-C. Nó cũng có hỗ trợ tốt cho các tính năng mới của iOS và macOS, bao gồm phát hiện và xử lý lỗi, thao tác với các tập tin và cơ sở dữ liệu, và xử lý đa luồng.

Ruby

Ruby là một ngôn ngữ lập trình mã nguồn mở, được sử dụng phổ biến cho phát triển các ứng dụng web. Ruby cũng có một thư viện phong phú và mạnh mẽ, gồm các công cụ để xử lý chuỗi, số học, đồ họa, cơ sở dữ liệu, và nhiều hơn nữa.

Ruby thường có tốc độ khá chậm so với các ngôn ngữ lập trình khác. Hơn nữa, khi viết chương trình bằng Ruby sẽ rất khó để gỡ lỗi.

Rust

Rust là một ngôn ngữ lập trình hệ thống hiện đại, được phát triển bởi Mozilla Research và ra mắt lần đầu vào năm 2010. Rust nổi bật với khả năng quản lý bộ nhớ an toàn và hiệu quả, kết hợp với hiệu suất cao tương tự như C và C++, nhưng với một hệ thống kiểm tra lỗi mạnh mẽ giúp tránh các lỗi bảo mật phổ biến như lỗi tràn bộ nhớ (buffer overflow) và lỗi trỏ null (null pointer).

Rust trở thành một lựa chọn lý tưởng cho các ứng dụng yêu cầu xử lý nhanh và hiệu suất cao, như hệ thống nhúng, game, và các ứng dụng đòi hỏi tài nguyên lớn.

Tóm lại

Các ngôn ngữ lập trình đóng một vai trò quan trọng trong việc phát triển các ứng dụng web, mobile, game và nhiều lĩnh vực khác. Các nhà phát triển sẽ luôn cần tìm hiểu và nắm vững các ngôn ngữ lập trình mới để có thể đáp ứng được nhu cầu ngày càng cao của ngành công nghiệp công nghệ thông tin.

Hy vọng thông qua bài viết này, bạn đã có được cái nhìn tổng quan về các ngôn ngữ lập trình phổ biến nhất hiện nay và hiểu rõ hơn về vai trò, tầm quan trọng của chúng trong thế giới công nghệ thông tin.

Xem thêm:

Đừng bỏ lỡ hàng loạt IT job hot tại TopDev

Top 5 câu hỏi phỏng vấn Software Architect hàng đầu

Top 5 câu hỏi phỏng vấn Software Architect hàng đầu

Software Architect, chức vụ chỉ nghe thôi đã thấy to, vậy phỏng vấn Software Architect có gì đặc biệt? Những câu hỏi và nội dung kiến thức nào thường được đề cập khi phỏng vấn Software Architect?

Phỏng vấn solution architect      Trách nhiệm của Solution Architect là làm sao đặt business logic vào không bể nha anh em.

Là một người chịu trách nhiệm lớn cho sự thành công hay thất bại của dự án phần mềm. SA là công việc stress. Nhưng trách nhiệm lớn đồng nghĩa với lương cao. Tất nhiên lượng kiến thức nằm trong đầu cũng thuộc dạng khủng khiếp. Thử lướt xem mấy câu hỏi phỏng vấn SA thì có gì nào?

Rồi, bắt đầu thôi anh em! Dạo qua vài ba câu định nghĩa chưa có gì khó. Phần sau sẽ là những câu hỏi khó hơn.

1. Software Architect là gì?

Câu hỏi đầu tiên phỏng vấn Software Architect chưa đi ngay vào các khái niệm kiến thức mà đi vào định nghĩa. Vậy Sofware Architect là gì?

A software architect is a software development professional who makes high-level design choices and oversees the overall software structure. A software architect is responsible for creating a software system that meets all the technical and operational requirements while also being easy to maintain and extend.

Sofware Architect là người phát triển phần mềm chuyên nghiệp, đưa ra quyết định lựa chọn high-level design và giám sát kiến trúc phần mềm tổng thể. Software Architect chịu trách nhiệm tạo ra một hệ thống phần mềm đáp ứng tất cả các yêu cầu kỹ thuật và vận hành đồng thời đảm bảo cho hệ thống dễ bảo trì và mở rộng.

Phỏng vấn solution architect Dự án lớn có yêu cầu cao mà không có SA thì xác định là toang.

Định nghĩa rất chi là dài dòng nhưng có thể tóm gọn lại như sau:

  • Là người phát triển phần mềm chuyên nghiệp
  • Đưa ra quyết định cho kiến trúc của phần mềm (tất nhiên phải đáp ứng yêu cầu)
  • Giám sát quá trình phát triển phần mềm (đảm bảo đúng như thiết kế)
  • Hệ thống thiết kế ra phải đảm bảo dễ bảo trì và mở rộng về sau

Hiểu được trách nhiệm và yêu cầu của vị trí Solution Architect giúp anh em hiểu rõ hơn những việc mình cần làm, những kiến thức cần show ra cho nhà tuyển dụng khi apply vị trí này. Anh em cũng có thể tham khảo thêm bài viết này.

Một số câu hỏi anh em có thể xem qua:

  • Trách nhiệm của Solution Architect?
  • Những skills nào cần có nếu bạn là Solution Architect?

Tiếp tới với câu hỏi số hai

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

2. Load Balancing là gì?

Câu hỏi số hai phỏng vấn Software Architect liên quan tới các khái niệm thường được sử dụng trong thiết kế kiến trúc phần mềm (high level design).

Load balancing is a simple way to spread work across multiple machines or groups of devices. In this type of load balancing, requests are split up and sent to different machines in a circle. This ensures that all machines get the same number of requests and that none are overloaded or underloaded. Cân bằng tải cách đơn giản để dàn trải công việc trên nhiều máy hoặc nhiều thiết bị. Khi có một lượng lớn yêu cầu gửi tới, load balancing sẽ chia đều tất cả cho các máy, đảm bảo không có máy thì load quá nhiều, máy thì load quá ít.

Phỏng vấn solution architect

Các câu hỏi liên quan tới khái niệm yêu cầu anh em cần trả lời chính xác ở mức tuyệt đối, bởi chỉ cần hiểu sai hoặc không chắc chắn mà đã đem vào cho anh em làm thì khả năng cao là bể. Vừa mất thời gian làm vừa gây stress cho team nếu không đáp ứng được yêu cầu về business.

Một số câu hỏi anh em có thể tham khảo:

  • CAP Theorem là gì?
  • Bốn loại system test là những loại nào?
  • Tại sao chúng ta cần sử dụng WebSocket?

  Trở thành Solution Architect có khó không?
  Đâu là điểm khác biệt giữa Solution Architect và Software Architect?

3. SOLID là gì?

Câu hỏi thứ ba phỏng vấn Software Architect vẫn là câu hỏi liên quan tới khái niệm, nhưng không còn là các khái niệm đơn lẻ như Load Balancing hay CAP Theorem. Câu hỏi này tập trung vào một trong những khái niệm quan trọng nhất khi thiết kế phần mềm.

SOLID là viết tắt của 5 nguyên tắc đóng vai trò cực quan trọng trong phát triển kiến trúc phần mềm.

  • Single responsibility: nguyên tắc này chỉ ra rằng mỗi class chỉ nên thực hiện một việc duy nhất. Một phần cụ thể trong ứng dụng.
  • Open/closed: nguyên tắc này chỉ ra rằng một module hoặc một class đóng cho việc sử đổi, nhưng lại mở cho việc kế thừa và mở rộng.
  • Liskov substitution: nguyên tắc này cho phép thay thế các đối tượng của lớp cha bằng các đối tượng của lớp con mà không gây ảnh hưởng cho ứng dụng.
  • Interface segregation: nguyên tắc này đảm bảo interface tốt nhất nên được chia nhỏ hết sức có thể
  • Dependency inversion: nguyên tắc này đảm bảo rằng một lớp ở cấp cao (high level class) không nên dựa vào một lớp cấp thấp (low level class), mặc dù cả hai lớp đều có thể phụ thuộc vào một lớp cấp cao khác.

Phỏng vấn solution architect

Một số khái niệm khác anh em có thể xem lại:

  • ACID là gì?
  • Nguyên tắc DRY (don’t repeat yourself – lặp lại ít thôi)
  • Nguyên tắc DIE (duplicate is evil – lặp lại thì toang)

Tới với câu số 4 thôi anh em

4. Sự khác biệt giữa vertical scaling và horizontal scaling

Câu hỏi thứ 4 phỏng vấn Software Architect tập trung vào khả năng mở rộng (scaling). Bản thân SA phải chịu trách nhiệm cho bảo trì và mở rộng hệ thống. Ý ở câu hỏi đầu tiên định nghĩa SA anh em còn nhớ không?

Vậy để mở rộng được thì anh em cần biết khái niệm của mở rộng.

Horizontal scaling means scaling by adding more machines to your pool of resources (also described as “scaling out”), whereas vertical scaling refers to scaling by adding more power (e.g. CPU, RAM) to an existing machine (also described as “scaling up”). Mở rộng theo chiều ngang là cách thêm máy móc vào tài nguyên xử lý (còn được hiểu là mở rộng quy mô), trong khi đó vertical scaling, mở rộng theo chiều dọc đề cập đến việc tăng RAM, tăng CPU vào 1 máy hiện tại.

Phỏng vấn solution architect

Chi tiết sâu hơn về cách thức anh em có thể tham khảo bài viết này. Các câu hỏi có thể đọc qua luôn:

  • Microserice Architecture
  • Fault tolerance là gì?

5. Database Sharing trong kiến trúc phần mềm

Câu hỏi cuối cùng trong bộ câu hỏi phỏng vấn Software Architect lần này liên quan tới Sharding, cụ thể hơn là khái niệm Database Sharding.

Sharding refers to the breaking up of our data into chunks (shards). The benefit of sharding is that it allows us to scale our database for large-scale systems. Sharding đề cập đến việc chia nhỏ dữ liệu thành các khối nhỏ (gọi là chunks). Lợi ích của sharding là cho phép mở ộng cơ sở dữ liệu cho những hệ thống lớn hoặc cực lớn.

Cụ thể hơn có thể hiểu Sharding sẽ tách các hàng của một bảng dữ liệu lớn thành nhiều hàng khác nhau, được gọi là các partitions (vùng). Dữ liệu ở trong mỗi vùng, mỗi chunks sẽ hoàn toàn độc lập với dữ liệu trong mỗi vùng hoặc các chunks khác.

Phỏng vấn solution architect

Phỏng vấn solution architect

Chi tiết hơn về Database Sharding anh em có thể tham khảo bài viết này.

6. Tham khảo thêm để chuẩn bị phỏng vấn Solution Architect

Cảm ơn anh em đã đọc bài – Thank you so much for your time – Happy coding!

Tác giả: Kiên Nguyễn

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

Hướng dẫn Java Design Pattern – Decorator

Hướng dẫn Java Design Pattern – Decorator

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

Một trong những khía cạnh quan trọng nhất trong quá trình phát triển một ứng dụng mà các lập trình viên phải đối đầu là sự thay đổi. Khi muốn thêm hoặc loại bỏ một tính năng của một đối tượng, điều đầu tiên chúng ta nghĩ đến là thừa kế (extends). Tuy nhiên, thừa kế không khả thi vì nó là static, chúng ta không thể thêm các lớp con mới vào một chương trình khi nó đã được biên dịch và thực thi. Để giải quyết vấn đề này, chúng ta có thể sử dụng Decorator Pattern được giới thiệu trong phần tiếp theo của bài viết này.

Decorator Pattern là gì?

Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.

Decorator pattern là một trong những Pattern thuộc nhóm cấu trúc (Structural Pattern). Nó cho phép người dùng thêm chức năng mới vào đối tượng hiện tại mà không muốn ảnh hưởng đến các đối tượng khác. Kiểu thiết kế này có cấu trúc hoạt động như một lớp bao bọc (wrap) cho lớp hiện có. Mỗi khi cần thêm tính năng mới, đối tượng hiện có được wrap trong một đối tượng mới (decorator class).

Decorator pattern sử dụng composition thay vì inheritance (thừa kế) để mở rộng đối tượng. Decorator pattern còn được gọi là Wrapper hay Smart Proxy.

Tìm Java job lương cao trên TopDev ngay!

Cài đặt Decorator Pattern như thế nào?

Decorator pattern hoạt động dựa trên một đối tượng đặc biệt, được gọi là decorator (hay wrapper). Nó có cùng một interface như một đối tượng mà nó cần bao bọc (wrap), vì vậy phía client sẽ không nhận thấy khi bạn đưa cho nó một wrapper thay vì đối tượng gốc.

Tất cả các wrapper có một trường để lưu trữ một giá trị của một đối tượng gốc. Hầu hết các wrapper khởi tạo trường đó với một đối tượng được truyền vào constructor của chúng.

Vậy làm thế nào để có thể thay đổi hành vi của đối tượng? Như đã đề cập, wrapper có cùng interface với các đối tượng đích. Khi bạn gọi một phương thức decorator, nó thực hiện cùng một phương thức trong một đối tượng được wrap và sau đó thêm một cái gì đó (tính năng mới) vào kết quả, công việc này tùy thuộc vào logic nghiệp vụ.

Decorator Pattern

Các thành phần trong mẫu thiết kế Decorator:

  • Component: là một interface quy định các method chung cần phải có cho tất cả các thành phần tham gia vào mẫu này.
  • ConcreteComponent : là lớp hiện thực (implements) các phương thức của Component.
  • Decorator : là một abstract class dùng để duy trì một tham chiếu của đối tượng Component và đồng thời cài đặt các phương thức của Component  interface.
  • ConcreteDecorator : là lớp hiện thực (implements) các phương thức của Decorator, nó cài đặt thêm các tính năng mới cho Component.
  • Client : đối tượng sử dụng Component.

  Hướng dẫn Java Design Pattern – Flyweight

  Hướng dẫn Java Design Pattern – Proxy

Ví dụ:

Để đơn giản hơn, chúng ta xem ví dụ về một hệ thống quản lý dự án, nơi nhân viên đang làm việc với các vai trò khác nhau, chẳng hạn như thành viên nhóm (team member), trưởng nhóm (team lead) và người quản lý (manager). Một thành viên trong nhóm chịu trách nhiệm thực hiện các nhiệm vụ được giao và phối hợp với các thành viên khác để hoàn thành nhiệm vụ nhóm. Mặt khác, một trưởng nhóm phải quản lý và cộng tác với các thành viên trong nhóm của mình và lập kế hoạch nhiệm vụ của họ. Tương tự như vậy, một người quản lý có thêm một số trách nhiệm đối với một trưởng nhóm như quản lý yêu cầu dự án, tiến độ, phân công công việc.

Sau đây là các thành phần tham gia vào hệ thống và hành vi của chúng:

  • Employee: thực hiện công việc (doTask), tham gia vào dự án (join), rời khỏi dự án (terminate).
  • Team member: báo cáo task được giao (report task), cộng tác với các thành viên khác (coordinate with others).
  • Team lead: lên kế hoạch (planning), hỗ trợ các thành viên phát triển (motivate), theo dõi chất lượng công việc và thời gian (monitor).
  • Manager: tạo các yêu cầu dự án (create requirement), giao nhiệm vụ cho thành viên (assign task), quản lý tiến độ dự án (progress management).

Với cách làm thông thường, chúng ta có sơ đồ như sau:

Decorator Pattern

Bất cứ khi nào một thành viên trong nhóm trở thành một Team Lead, chúng ta phải tạo một đối tượng mới của Team Lead và đối tượng trước đó tham chiếu vào nhân viên đó (Team Member trong nhóm) có thể bị hủy hoặc lưu trữ. Đó không phải là cách tiếp cận được khuyến nghị khi nhân viên vẫn là một phần của tổ chức của bạn. Tương tự như trường hợp với Manager, khi một nhân viên trở thành người quản lý từ một Team Lead / Team Member.

Một trường hợp khác là khi một nhân viên có thể thực hiện trách nhiệm của một Team Member trong nhóm cũng như trách nhiệm của Team Lead hoặc một Manager. Trong trường hợp đó, bạn cần tạo hai đối tượng cho cùng một nhân viên là hoàn toàn sai.

Trong các kịch bản này, một Team Member/ Team Lead có thể có thêm trách nhiệm trong lúc thực hiện (run-time). Và trách nhiệm của họ có thể được chỉ định / thu hồi trong lúc run-time.

Tham khảo việc làm Fresher Java mới nhất trên TopDev

Hãy xem sơ đồ bên dưới để thấy được cách chúng ta áp dụng Decorator Pattern như thế nào trong trường hợp này.

Decorator Pattern

Như bạn thấy, với Decorator hệ thống của chúng ta linh hoạt hơn rất nhiều. Chúng ta có thể dễ dàng gán một nhân viên sang vai trò TeamMember, TeamLeader, Manager.

EmployeeComponent.java

package com.gpcoder.patterns.structural.decorator;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public interface EmployeeComponent {

    String getName();

    void doTask();

    void join(Date joinDate);

    void terminate(Date terminateDate);

    default String formatDate(Date theDate) {
        DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        return sdf.format(theDate);
    }

    default void showBasicInformation() {
        System.out.println("-------");
        System.out.println("The basic information of " + getName());

        join(Calendar.getInstance().getTime());

        Calendar terminateDate = Calendar.getInstance();
        terminateDate.add(Calendar.MONTH, 6);
        terminate(terminateDate.getTime());
    }
}

EmployeeConcreteComponent.java

package com.gpcoder.patterns.structural.decorator;

import java.util.Date;

public class EmployeeConcreteComponent implements EmployeeComponent {

    private String name;

    public EmployeeConcreteComponent (String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void join(Date joinDate) {
        System.out.println(this.getName() + " joined on " + formatDate(joinDate));
    }

    @Override
    public void terminate(Date terminateDate) {
        System.out.println(this.getName() + " terminated on " + formatDate(terminateDate)); 
    }

    @Override
    public void doTask() {
        // Unassigned task
    }
}

EmployeeDecorator.java

package com.gpcoder.patterns.structural.decorator;

import java.util.Date;

public abstract class EmployeeDecorator implements EmployeeComponent {

    protected EmployeeComponent employee;

    protected EmployeeDecorator(EmployeeComponent employee) {
        this.employee = employee;
    }

    @Override
    public String getName() {
        return employee.getName();
    }

    @Override
    public void join(Date joinDate) {
        employee.join(joinDate);
    }

    @Override
    public void terminate(Date terminateDate) {
        employee.terminate(terminateDate);
    }
}

Manager.java

package com.gpcoder.patterns.structural.decorator;

public class Manager extends EmployeeDecorator {

    protected Manager(EmployeeComponent employee) {
        super(employee);
    }

    public void createRequirement() {
        System.out.println(this.employee.getName() + " is create requirements.");
    }

    public void assignTask() {
        System.out.println(this.employee.getName() + " is assigning tasks.");
    }

    public void manageProgress() {
        System.out.println(this.employee.getName() + " is managing the progress.");
    }

    @Override
    public void doTask() {
        employee.doTask();
        createRequirement();
        assignTask();
        manageProgress();
    }
}

TeamLeader.java

package com.gpcoder.patterns.structural.decorator;

public class TeamLeader extends EmployeeDecorator {

    protected TeamLeader(EmployeeComponent employee) {
        super(employee);
    }

    public void planing() {
        System.out.println(this.employee.getName() + " is planing.");
    }

    public void motivate() {
        System.out.println(this.employee.getName() + " is motivating his members.");
    }

    public void monitor() {
        System.out.println(this.employee.getName() + " is monitoring his members.");
    }

    @Override
    public void doTask() {
        employee.doTask();
        planing();
        motivate();
        monitor();
    }
}

TeamMember.java

package com.gpcoder.patterns.structural.decorator;

public class TeamMember extends EmployeeDecorator {

    protected TeamMember(EmployeeComponent employee) {
        super(employee);
    }

    public void reportTask() {
        System.out.println(this.employee.getName() + " is reporting his assigned tasks.");
    }

    public void coordinateWithOthers() {
        System.out.println(this.employee.getName() + " is coordinating with other members of his team.");
    }

    @Override
    public void doTask() {
        employee.doTask();
        reportTask();
        coordinateWithOthers();
    }
}

Client.java

package com.gpcoder.patterns.structural.decorator;

public class Client {

     public static void main(String[] args) {
         System.out.println("NORMAL EMPLOYEE: ");
         EmployeeComponent employee = new EmployeeConcreteComponent("GPCoder");
         employee.showBasicInformation();
         employee.doTask();
    
         System.out.println("\nTEAM LEADER: ");
         EmployeeComponent teamLeader = new TeamLeader(employee);
         teamLeader.showBasicInformation();
         teamLeader.doTask();

         System.out.println("\nMANAGER: ");
         EmployeeComponent manager = new Manager(employee);
         manager.showBasicInformation();
         manager.doTask();

         System.out.println("\nTEAM LEADER AND MANAGER: ");
         EmployeeComponent teamLeaderAndManager = new Manager(teamLeader);
         teamLeaderAndManager.showBasicInformation();
         teamLeaderAndManager.doTask();
    }
}

Output của chương trình:

NORMAL EMPLOYEE: 
-------
The basic information of GPCoder
GPCoder joined on 04/11/2018
GPCoder terminated on 04/05/2019

TEAM LEADER: 
-------
The basic information of GPCoder
GPCoder joined on 04/11/2018
GPCoder terminated on 04/05/2019
GPCoder is planing.
GPCoder is motivating his members.
GPCoder is monitoring his members.

MANAGER: 
-------
The basic information of GPCoder
GPCoder joined on 04/11/2018
GPCoder terminated on 04/05/2019
GPCoder is create requirements.
GPCoder is assigning tasks.
GPCoder is managing the progress.

TEAM LEADER AND MANAGER: 
-------
The basic information of GPCoder
GPCoder joined on 04/11/2018
GPCoder terminated on 04/05/2019
GPCoder is planing.
GPCoder is motivating his members.
GPCoder is monitoring his members.
GPCoder is create requirements.
GPCoder is assigning tasks.
GPCoder is managing the progress.

Lợi ích của Decorator Pattern là gì?

  • Tăng cường khả năng mở rộng của đối tượng, bởi vì những thay đổi được thực hiện bằng cách implement trên các lớp mới.
  • Client sẽ không nhận thấy sự khác biệt khi bạn đưa cho nó một wrapper thay vì đối tượng gốc.
  • Một đối tượng có thể được bao bọc bởi nhiều wrapper cùng một lúc.
  • Cho phép thêm hoặc xóa tính năng của một đối tượng lúc thực thi (run-time).

Sử dụng Decorator Pattern khi nào?

  • Khi muốn thêm tính năng mới cho các đối tượng mà không ảnh hưởng đến các đối tượng này.
  • Khi không thể mở rộng một đối tượng bằng cách thừa kế (inheritance). Chẳng hạn, một class sử dụng từ khóa final, muốn mở rộng class này chỉ còn cách duy nhất là sử dụng decorator.
  • Trong một số nhiều trường hợp mà việc sử dụng kế thừa sẽ mất nhiều công sức trong việc viết code. Ví dụ trên là một trong những trường hợp như vậy.

So sánh Decorator và Adapter

Giống nhau:

Khác nhau:

  • Decorator cho phép thêm một tính năng mới vào một object nhưng không được phép sử dụng thừa kế. Nó cho phép thay đổi lúc thực thi (run-time). Adapter được sử dụng khi bạn có một interface, và bạn muốn ánh xạ interface đó đến một đối tượng khác có vai trò chức năng tương tự, nhưng là một interface khác.
  • Decorator có xu hướng hoạt động trên một đối tượng. Adapter có xu hướng hoạt động trên nhiều đối tượng (có thể wrap nhiều interface).

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

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

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

Hướng dẫn tạo extension chrome và đưa lên store chỉ trong 5 phút

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

Google chrome là một trong những trình duyệt được yêu thích nhất trên thế giới bởi… nó là sản phẩm của Google. Nói vui vậy thôi chứ mình thấy Google chrome thật sự là trình duyệt ngon nhất hiện nay bởi nó nhanh, đơn giản lại đồng bộ được nhiều dịch vụ có sẵn của Google. Nhưng điều mình thích nhất vẫn là nó có kho extension vô cùng phong phú.

I. Extension của google chrome là gì?

Chrome extension là các “phần mềm con” mà bạn có thể cài vào nhằm bổ sung thêm tính năng mới cho trình duyệt. Ví dụ như mình có 2 sản phẩm là URL QrCode và ICTU timetable đó chẳng hạn.

Phân tích dưới góc độ của developer, thì Chrome extension giống như một web app được tạo nên từ HTML, CSS, JS và tương tác với trình duyệt thông qua các JavaScript API mà chrome cung cấp. Cơ chế nhúng extension vào chrome cũng rất đơn giản, tương tự như việc bạn nhúng một cái iframe vào trang web vậy.

II. Tạo một extension chrome

Trong phần này, mình sẽ hướng dẫn các bạn cách tạo một extension có tính năng tương tự như extension URL QrCode của mình nhé.

2.1 Chuẩn bị một web app

Như mình đã nói ở phần trên thì chrome extension giống như một web app. Vậy chúng ta cần phải tạo ra một web app trước. Vì bài viết này không tập trung vào việc tạo web app như thế nào nên mình đã chuẩn bị sẵn cho bạn một cái ở github repo này rồi, bạn chỉ cần làm theo hướng dẫn để cài đặt thôi.

Trước khi cài đặt bạn hãy đảm bảo rằng máy tính của bạn đã được cài sẵn git và nodejs nhé.

  Giới thiệu một số extension trên Chrome cho web developer

  Hướng dẫn chi tiết xây dựng web app với Reactjs

Các bước cài đặt

Bước 1: Clone repo về máy

git clone https://github.com/phambinh217/qr-code-chrome-ext.git

Bước 2: Cài đặt các package cần thiết

cd qr-code-chrome-ext
npm install

Bước 3: Build ra sản phẩm cuối

npm run build

Sau khi build xong, toàn bộ các file mà bạn cần quan tâm sẽ nằm tại thư mục dist như hình

Tạo một extension chrome

Trong các file khoanh đỏ ở hình trên, bạn hãy để ý cho mình file manifest.json

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

2.2 Khai báo nội dung cho file manifest.json

Hãy mở file manifest.json mà mình lưu ý ở trên để xem nội dung bên trong là gì nhé

{
   "name": "URL QrCode",
   "description": "Generate QrCode from website URL",
   "version": "1.0",
   "browser_action": {
     "default_icon": "logo.png",
     "default_popup": "index.html"
   },
   "permissions": [
     "tabs"
   ],
   "manifest_version": 2
 }

Nhìn qua có thể thấy ngay manifest.json là file khai báo các thông tin cơ bản cho extension như tênmô tảphiên bản,…

Một vài thông tin mà mình thường hay khai báo là:

  • name: Tên của extension
  • description: Mô tả ngắn gọn cho extension
  • version: Phiên bản của extension. Mỗi khi có cập nhật cho extension, bạn nhất định phải thay đổi giá trị này thì extension của bạn mới có thể tự động cập nhật trên trình duyệt của người dùng
  • browser_action.default_icon: Đường dẫn tới file icon của extension
  • browser_action.default_popup: File đầu tiên được gọi đến khi người dùng mở extension của bạn
  • permissions: Các quyền mà extension muốn sử dụng. Như extension URL QrCode của mình cần truy cập vào URL hiện tại của tab, vì vậy mình cần khai báo permissions là tabs. Bạn có thể xem toàn bộ permissions tại đây.
  • manifest_version: Là phiên bản của file manifest.json do google quy định. Bạn có thể đọc thêm tại đây, nếu bạn không hiểu thì cứ để mặc định là 2 nhé.

Nếu bạn muốn tìm hiểu chi tiết về các thành phần nội dung trong file manifest.json, bạn có thể đọc thêm ở đây.

2.3 Cài đặt thử lên chrome

Extension đã có, giờ chúng ta sẽ thêm vào chrome để xem nó hoạt động như thế nào nhé. Để thêm vào chrome bạn lần lượt thực hiện theo các bước sau:

  • Bước 1: Truy cập vào Settings > More tools > Extensions (chrome://extensions) để mở trang quản lý các extension đã cài đặt.
  • Bước 2: Bật chế độ Developer mode để cài thẳng extension vào chrome mà không cần phải download từ store.
  • Bước 3: Nhấn nút Load unpacked, và chọn tới thư mục dist chứa extension mà chúng ta đã build ra ở mục 2.1.

Sau khi thực hiện 3 bước trên, nếu thành công thì bạn sẽ thấy extension của mình nằm trong danh sách các extension đã được cài đặt của chrome. Bạn có thể xem video dưới của mình để hiểu rõ hơn.

III. Đưa lên store

Về cơ bản, bạn đã tạo và cài đặt được một chrome extension. Giờ là lúc chúng ta đưa nó lên store để tiếp cận nhiều người sử dụng hơn.

Để có thể đưa lên store, bạn cần chuẩn bị trước một tài khoản dành cho Nhà phát triển. Phí đăng ký tài khoản này là $5 – thanh toán qua các thẻ Quốc tế như thẻ Visa.

Việc đưa lên store khá đơn giản

Bước 1: Đăng nhập tài khoản Nhà phát triển của bạn, sau đó truy cập vào Trang tổng quan dành cho nhà phát triển, nhấn vào nút Thêm mục mới.

Tạo một extension chrome

Bước 2: Nén zip các file nằm trong thư mục dist và tải lên. Bạn có thể xem video của mình để hiểu rõ hơn.

Bước 3: Sau khi tải lên thành công, bạn sẽ được chuyển hướng vào một trang mới. Tại đây bạn sẽ phải điền một số nội dung để mô tả về extension vừa tải lên như sau:

  • Ít nhất một ảnh chụp màn hình hoặc video youtube giới thiệu về extension của bạn. Nếu là hình ảnh thì phải có kích thước là 1280×800 hoặc 640×400.
  • Một bài mô tả ngắn ngọn về extension của bạn.
  • Một ảnh để làm avatar cho extension của bạn, có kích thước 128×128.

Trên là các thông tin mà mình nghĩ bạn nên chuẩn bị trước, ngoài ra còn một số thông tin khác nữa như chọn Danh mục cho extension, chọn Ngôn ngữ,… thì bạn chỉ cần làm theo hướng dẫn của Google là được. Sau cùng bạn nhấn vào nút Xuất bản các thay đổi để hoàn tất việc đưa extension lên store.

Tạo một extension chrome

Sau khi nhấn nút Xuất bản, Google sẽ kiểm duyệt extension của bạn trong vòng 5 – 10 phút gì đó. Thường thì các extension đều được duyệt, trừ khi bạn cố tình làm điều gì đấy ảnh hưởng tới quyền lợi của người sử dụng thì Google mới từ chối.

Quá trình đưa extension lên store chỉ đơn giản, vẻn vẹn trong 3 bước vậy thôi.

IV. Kết luận

Việc tạo extension không khó, về cơ bản extension chỉ giống như một cái web, vậy nếu bạn làm được web thì chắc chắn cũng làm được extension. Mình chỉ cảm rắc rối là khi đưa extension lên store thì phải có tài khoản Nhà phát triển – đăng ký mất $5 và thanh toán qua thẻ Quốc tế – cái mà nhiều bạn không có.

Bài viết được viết dựa trên kinh nghiệm cá nhân, có chỗ nào khó hiểu cần được giải thích thêm thì bạn cứ mạnh dạn nói với mình nhé.

Chào tạm biệt.

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

Xem thêm:

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

Tuyển tập câu hỏi phỏng vấn Data Engineer mới nhất

Tuyển tập câu hỏi phỏng vấn Data Engineer mới nhất

Thời kỳ công nghiệp 4.0 với sự phát triển của BigData, AI, Machine Learning,… tất cả các công nghệ mới hiện nay có một đặc điểm chung là cần phải xử lý dữ liệu ở một tổ chức và quy mô lớn. Cũng vì đó mà ngành kỹ sư dữ liệu trở nên hot hơn bao giờ hết. Data Engineer được rất nhiều công ty tuyển dụng với mức đãi ngộ cao cũng như định hướng tốt trong tương lai. Để chuẩn bị cho buổi phỏng vấn vị trí này, chúng ta cùng nhau tìm hiểu về những câu hỏi phỏng vấn Data Engineer thường gặp nhé.

Vai trò của một Data Engineer

Data Engineer / Kỹ sư dữ liệu là có nhiệm vụ chính là thu thập, chuẩn bị các dữ liệu và cùng những nhà khoa học, phân tích dữ liệu sử dụng. 3 vai trò của một Data Engineer bao gồm:

  • Generalist – Đảm nhận các công việc tổng quát: thu thập, tải lên, nhập, đồng thời xử lý dữ liệu đầu cuối. Đây là công việc cơ bản của một Data Engineer.
  • Pipeline-centric – Phụ trách mảng Data Pipeline: Data Pipeline hay đường ống dữ liệu là một chuỗi các bước thực hiện theo một trình tự cụ thể để xử lý dữ liệu và chuyển dữ liệu từ hệ thống này sang hệ thống khác. Vai trò này đòi hỏi các kỹ sư dữ liệu cần biết chuyên sâu về hệ thống khoa học máy tính và phân tán.
  • Database-centric – Chuyên về cơ sở dữ liệu: vai trò thiết lập, triển khai, đồng thời duy trì và đưa cơ sở dữ liệu đã phân tích vào hệ thống. Thông thường các hệ thống nơi dữ liệu được phân bố rộng tại nhiều kho Database thì vai trò này phải được đảm nhiệm bởi một kỹ sư, chuyên gia dữ liệu có kinh nghiệm.

Data Engineer
Kỹ năng của Data Engineer

Ngôn ngữ lập trình thường sử dụng để xử lý dữ liệu

Data Engineer làm việc với các loại dữ liệu khác nhau thu thập từ nhiều nguồn khác nhau. Điều kiện tiên quyết để trở thành một kỹ sư dữ liệu là biết cách làm việc, thao tác, truy vấn hay quản lý các hệ thống cơ sở dữ liệu. SQL hay ngôn ngữ truy vấn có cấu trúc (Structured Query Language) phục vụ cho công việc này.

Để phục vụ cho quá trình xử lý dữ liệu, cụ thể là viết các ETL scripts trích xuất, chuyển đổi và tải dữ liệu từ hệ thống này sang hệ thống khác, ngôn ngữ lập trình thường được sử dụng là Python. Ưu điểm của Python là khả năng tối ưu hóa các script hỗ trợ thao tác dữ liệu, vì thế rất được ưa chuộng trong ngành xử lý dữ liệu nói riêng và BigData, AI nói chung.

Một ngôn ngữ lập trình thường được sử dụng trong việc phân tích thống kê và trực quan hóa dữ liệu là R, ưu điểm của ngôn ngữ lập trình này là thư viện có sẵn các thuật toán học máy, hồi quy tuyến tính, chuỗi thời gian, suy luận thống kê,… giúp lập trình viên xử lý dữ liệu tối ưu hóa xử lý của mình. 

  Khám phá Quy trình tuyển dụng Data Engineer

  Một số lầm tưởng về big data của software engineer

So sánh SQL và NoSQL

SQL vs NoSQL

SQL và NoSQL là 2 loại hình cơ sở dữ liệu phổ biến nhất hiện nay. SQL (Structured Query Language) là ngôn ngữ truy vấn có cấu trúc. Nó được dùng để xử lý cơ sở dữ liệu quan hệ như MySQL, Oracle, MS SQL,… NoSQL (Non-Relational SQL) có mục đích sử dụng như SQL nhưng được dành cho các cơ sở dữ liệu không quan hệ, không yêu cầu một lược đồ cố định và có thể dễ dàng mở rộng. NoSQL thường được sử dụng cho các kho dữ liệu phân tán với nhu cầu lưu trữ dữ liệu khổng lồ vì vậy nó thích hợp với các ứng dụng Web thời gian thực hay BigData.

Về loại hình, SQL databases có cấu trúc dựa trên các bảng, các bảng có quan hệ với nhau. NoSQL thì dựa trên cặp tài liệu, cặp khóa giá trị hay cơ sở dữ liệu biểu đồ. NoSQL không có ngôn ngữ Query như cái tên của nó, NoSQL databases cũng dễ dàng mở rộng theo chiều ngang và phù hợp với những bài toán mà dữ liệu ban đầu chưa xác định rõ.

So sánh về hiệu suất thì NoSQL thường được cho là nhanh hơn SQL do không mất nhiều chi phí join hay các đoạn câu lệnh SQL phức tạp cần tối ưu. Ngược lại, SQL sẽ hỗ trợ ràng buộc tốt hơn cho những thao tác update nhiều records trong cùng một transaction, NoSQL có options tương tự nhưng bạn sẽ cần xử lý thủ công hơn trong khi viết code.

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

Sự khác biệt giữa DataLake và DataWarehouse?

DataLake và DataWarehouse đều là những kho lưu trữ dữ liệu dành cho các doanh nghiệp. Điểm khác nhau cơ bản giữa 2 loại kho dữ liệu trên là trong khi DataLake chủ yếu chứa các dữ liệu thô, nguyên gốc; còn dữ liệu trong DataWarehouse cần trải qua bước biến đổi và phân loại dữ liệu từ các nguồn khác nhau trước khi nhập vào kho lưu trữ.

Dữ liệu trong DataLake được giữ nguyên gốc đầu vào vì thế doanh nghiệp cũng tiết kiệm chi phí cho việc biến đổi, phân loại dữ liệu. Ngược lại dữ liệu trong DataWarehouse sẽ trải qua quy trình ETL: Extract – Transform – Load trước khi được nhập kho, sau đó những dữ liệu này được các Data Analyst, Business Analyst hoặc Data Scientist,… sử dụng trực tiếp để báo cáo, phân tích và khai thác dữ liệu; vì vậy doanh nghiệp sử dụng DataWarehouse sẽ cần tốn chi phí cho công việc trên.

Giải thích về kỹ thuật ETL / ELT trong xử lý dữ liệu

ETL viết tắt của Extract, Transform và Load, là một kỹ thuật trích xuất dữ liệu từ các hệ thống nguồn khác nhau sau đó chuyển đổi dữ liệu áp dụng các logic tính toán để tải chúng vào hệ thống kho dữ liệu DataWarehouse.

Flow của ETL có 3 bước:

  1. Extract – trích xuất: thu thập dữ liệu từ các nguồn
  2. Transform  – biến đổi: dựa vào các quy tắc, bảng tra cứu,… kết hợp các dữ liệu khác nhau để biểu dữ liệu thu được từ bước Extract về một dạng biểu mẫu phù hợp vơi cơ sở dữ liệu xây dựng sẵn
  3. Load – tải: quá trình ghi dữ liệu vào đích

ELT là một kỹ thuật khác về luồng xử lý so với ETL. Vẫn giữ 3 bước như trên nhưng bước Load sẽ được thực hiện ngay sau khi trích xuất dữ liệu. Dữ liệu sẽ được sao chép và chuyển đến đích ngay, xong sau đó mới thực hiện bước biến đổi (Transform). Để thực hiện việc này thì ETL chỉ phù hợp với các database NoSQL, với những dữ liệu lớn và việc lưu trữ không yêu cầu phải đúng theo template sẵn có.

Ưu điểm của ELT chính là việc không phụ thuộc tốc độ xử lý dữ liệu ở bước Transform (thường chiếm nhiều thời gian nhất trong phương thức ETL), dữ liệu sau khi được tải có thể được xử lý sau đó mà không lo việc mất mát hay bị ngừng lại trong quá trình biến đổi. Mặc dù vậy nhược điểm của nó chính là độ phức tạp đòi hỏi kiến thức chuyên sâu về các tools sử dụng cũng như kỹ năng chuyên môn.

Có những giai đoạn nào trong quá trình phân tích dữ liệu

4 giai đoạn chính trong quá trình phân tích dữ liệu
Nguồn: https://www.enablerspace.com/digitalmarketingtips/understanding-the-different-types-of-data-analysis/

Có 4 giai đoạn chính trong quá trình phân tích dữ liệu:

  • Phân tích mô tả (Descriptive Analytics)

Giai đoạn đầu tiên này giúp tìm hiểu thông tin về quá khứ, hiện tại và xu hướng của dữ liệu. Một số phương pháp phân tích áp dụng trong giai đoạn này gồm: Định lượng hóa dữ liệu, Phân tích biểu đồ và bảng biểu, Tóm tắt thống kê, Đồ thị thời gian và phân tích nhân tố.

  • Phân tích chẩn đoán (Diagnostic Analytics)

Giai đoạn này sử dụng các phương pháp phân tích để giải thích các nguyên nhân hoặc đặc điểm của các hiện tượng hoặc sự kiện trong dữ liệu. Phương pháp phân tích chẩn đoán bao gồm phân tích tương quan, phân tích đa biến, phân tích thành phần chính và phân tích nhân tố.

  • Phân tích tiên đoán (Predictive Analytics)

Phân tích tiên đoán là việc sử dụng các mô hình dữ liệu để dự đoán các sự kiện hoặc xu hướng trong tương lai. Phương pháp sử dụng bao gồm mô hình hồi quy, mô hình chuỗi thời gian, mạng nơ ron và máy học.

  • Phân tích chỉ đạo (Prescriptive Analytics)

Là giai đoạn cuối cùng của phân tích dữ liệu, sử dụng kết quả từ phân tích tiên đoán để đưa ra các quyết định chỉ đạo và lập kế hoạch. Phương pháp sử dụng là tối ưu hóa và mô phỏng.

Nêu một số công cụ biểu diễn trực quan hóa dữ liệu

Kỹ sư dữ liệu cần biết đến các công cụ phân tích và trực quan hóa dữ liệu Bussiness Intelligence nhằm phục vụ việc thiết lập kết nối giữa các DataWarehouse, DataLake cùng với các nguồn dữ liệu đầu vào hay đầu ra khác. Ngoài ra còn để phục vụ cho việc lập báo cáo, lên kế hoạch; một số công cụ biểu diễn trực quan hóa dữ liệu dành cho Data Engineer:

  • Microsoft Power BI
  • Microsoft Excel
  • SAP Business Objects
  • Datapine
  • Oracle BI
  • SAS Business Intelligence
  • MicroStrategy

Kết bài

Trên đây là list những câu hỏi mà bạn sẽ có thể gặp trong buổi phỏng vấn của mình ở vị trí kỹ sư dữ liệu Data Engineer. Hy vọng bài viết hữu ích dành cho các bạn đang muốn tìm một công việc tốt trong ngành này. Hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

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

Cài đặt môi trường lập trình web PHP

Cài đặt môi trường lập trình web PHP

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

Chào các bạn,

Trên blog của mình có những bài viết cao siêu về trick nọ trick kia, thế nhưng có một điều quan trọng mà các bạn mới bắt đầu thường quan tâm đó là cài đặt những phần mềm gì vào máy tính để có thể học được lập trình web PHP thì chưa có. Vậy trong bài viết này, mình sẽ hướng dẫn các bạn cách cài đặt môi trường để có thể học lập trình web PHP nhé.

I. Cài đặt code editor

Code editor là phần mềm để chúng ta có thể viết code. Hiện nay có rất nhiều các code editor hỗ trợ cho lập trình web PHP, nhưng mình khuyên các bạn nên sử dụng Sublime Text 3 – một editor nhẹ nhàng nhưng vẫn đầy đủ.

Sublime Text 3

Sublime Text 3 có mặt trên cả 3 hệ điều hành phổ biến là Windows, Mac, Ubuntu – thoải mái cho bạn lựa chọn. Sublime Texr 3 cũng có cách cài đặt đơn giản như những phần mềm bình thường khác nên bạn đừng lo lắng nhé.

II. Cài đặt trình duyệt

Đối với web developer, trình duyệt không chỉ đơng giản là phần mềm để lướt web, mà nó còn là công cụ để phát triển web, vì vậy mà máy bạn có trình duyệt hay chưa không quan trọng, quan trọng là bạn đang sử dụng trình duyệt nào. Ở đây, mình gợi ý các bạn nên sử dụng Google Chrome, bởi nó nhẹ nhàng, được tích hợp tool phát triển web, lại là trình duyệt được nhiều người dùng nhất.

Ở Việt Nam còn có một trình duyệt phổ biến nữa đó là trình duyệt Coccoc, bạn có thể sử dụng Coccoc để download video từ Youtube, tuy nhiên không nên sử dụng Coccoc làm trình duyệt để phát triển web. Tại sao thì có nhiều nguyên nhân mà trong phạm vi bài viết này mình sẽ không đề cập đến, bạn cứ nghe mình đi, nếu đang dùng Coccoc thì tải thêm cái Chrome nữa về để phát triển web sẽ tốt hơn.

  So sánh ASP.NET và PHP? Lập trình website nên học ngôn ngữ nào?

III. Cài đặt một web technology stack

Hiểu nhanh thì Web technology stack là một bộ các phần mềm liên quan để tạo nên môi trường phát triển web. Web technology stack thường bao gồm các thành phần: Hệ điều hành, Web server, CSDL, Ngôn ngữ lập trình (không bao gồm editor và trình duyệt).

Hiện nay có khá nhiều Web technology stack, nhưng chúng ta đang phát triển web PHP nên mình gợi ý các bạn nên sử dụng LAMP Stack.

LAMP là chữ viết tắt của:

  • Linux: Hệ điều hành lý tưởng nhất để phát triển PHP. (Bạn có thể sử dụng Windows cũng được).
  • Apache: Đóng vai trò là một web server.
  • MySQL: Đóng vai trò là CSDL.
  • PHP: Chính là PHP.

  Hướng dẫn kết nối PHP với SQL Server

Cài đặt LAMP Stack với XAMPP

Xampp là một phần mềm chứa tất cả các thành phần cần thiết cho LAMP Stack (không đúng lắm với các bạn sử dụng Windows). Nghĩa là sau khi bạn cài đặt xong XAMPP, bạn sẽ có luôn Apache, MySQL, PHP – những thành phần lẽ ra bạn phải cài đặt từng thứ một.

XAMPP

XAMPP có mặt trên 3 hệ điều hành phổ biến là Ubuntu, MacOS và Windows (32 bit, 64 bit). Về cách cài đặt XAMPP thì cũng cài đặt đơn giản như bao phần mềm khác, chứ không có gì đặc biệt cả.

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

III. Một số công cụ khác

3.1 Composer

PHP là một ngôn ngữ lâu đời (ra đời năm 1995), nên nó được các developer đóng góp một lượng thư viện khổng lồ – cái mà bạn sẽ sử dụng rất nhiều khi làm việc với các PHP framework. Để tiện quản lý các thư viện PHP, thì bạn cần cài đặt Composer.

3.2 NodeJS – NPM

NodeJS là môi trường cần thiết cho nhiều công cụ phát triển web mà chắc chắn bạn sẽ sử dụng tới. Vì vậy mình khuyên bạn nên cài đặt luôn. Về cách cài đặt NodeJs thì bạn chỉ cần download về và cài đặt như một phần mềm bình thường.

3.3 Git

Git là một công cụ quản lý phiên bản, tuy nhiên với sự ra đời của Github thì Git còn giống như công cụ để chia sẻ project lẫn nhau của các developers. Trên Github có một lượng lớn các project đủ mọi thể loại, nếu bạn muốn lấy chúng về để tham khảo thì bạn nên cài đặt Git.

>> Đọc thêm: GIT là gì mà giúp bạn và cả team làm việc hiệu quả hơn

3.4 CLI

Command Line Interface (CLI) là công cụ mà lập trình viên nên sử dụng. Trên Ubuntu hoặc MacOS thì chính là Terminal, trên Windows thì chính là Cmd (Command Prompt). Tuy nhiên với các bạn sử dụng Windows thì nên dùng CLI là Git Bash – công cụ được tích hợp sẵn nếu bạn download Git ở mục 3.3.

Git Bash cung cấp một số command line giả lập Linux trên Windows. Hơn nữa là Git Bash có một chút màu mè, nhìn đẹp mắt và có vẻ ngầu hơn là bạn sử dụng Cmd của Windows.

3.5 Postman

Postman là công cụ hỗ trợ bạn phát triển các Web API tiện lợi hơn. Postman tồn tại dưới 2 dạng: một là extension của trình duyệt Chrome, hai là một phần mềm riêng biệt (hỗ trợ đủ hệ điều hành). Ở đây mình khuyên bạn nên sử dụng Postman như một phần mềm riêng biệt thì hơn.

IV. Kết luận

Tuy là khi làm thực tế, có thể bạn sẽ cần phải cài thêm một số thứ khác nữa, nhưng cơ bản như vậy là đủ – đủ để bạn bắt đầu học lập trình web PHP được rồi.

Hiện tại mình và nhiều web developer chuyên nghiệp khác cũng chỉ cài các công cụ như trên, thế nên bạn cứ yên tâm sử dụng nhé. Trong trường hợp bạn biết một công cụ nào mà bạn cho là tốt hơn, phù hợp với bạn hơn thì bạn cứ mạnh dạn sử dụng, không nhất thiết phải 100% theo gợi ý mình.

Bài viết được viết dựa trên kinh nghiệm cá nhân, rất mong nhận được góp ý từ các bạn.

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

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

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