Home Blog Page 42

Tìm hiểu về ExpressJS và những ưu nhược điểm của ExpressJS

ưu nhược điểm của ExpressJS

Trong thế giới lập trình, ExpressJS đã trở thành một từ khóa quen thuộc đối với các lập trình viên. Với khả năng xây dựng ứng dụng web một cách nhanh chóng, ExpressJS đã trở thành một lựa chọn hàng đầu cho việc phát triển ứng dụng web.

Vậy cụ thể ExpressJS được sử dụng như thế nào? Ưu nhược điểm của ExpressJS và nó khác gì với NodeJS? Bài viết này sẽ giúp bạn giải đáp những thắc mắc đó và mang đến cái nhìn chi tiết hơn về ExpressJS. Bắt đầu thôi nào!

ExpressJS là gì?

ExpressJS là một framework mạnh mẽ và phổ biến được xây dựng trên nền tảng Node.js. Nó giúp đơn giản hóa quá trình phát triển ứng dụng web bằng cách cung cấp các công cụ và thư viện cần thiết để xử lý yêu cầu và phản hồi HTTP một cách dễ dàng.

ExpressJS cho phép bạn xây dựng các ứng dụng web độc lập, linh hoạt và có hiệu suất cao. Với cú pháp đơn giản và dễ hiểu, ExpressJS giúp lập trình viên tập trung vào việc xây dựng logic ứng dụng thay vì phải lo lắng về các chi tiết cơ bản của việc xử lý yêu cầu và phản hồi.

ExpressJS là gì?

Điều đặc biệt về ExpressJS là khả năng sử dụng middleware. Middleware là các chức năng trung gian được thực thi trước khi yêu cầu của người dùng được xử lý hoặc sau khi phản hồi được gửi đi. Điều này giúp bạn thực hiện các tác vụ như xác thực người dùng, ghi log, xử lý lỗi và nhiều hơn nữa một cách dễ dàng.

  bodyParser() trong Express.js

  Worker threads là gì? Bạn đã biết khi nào thì sử dụng Worker threads trong node.js chưa?

Tính năng của ExpressJS là gì?

ExpressJS là một framework Node.js mã nguồn mở phổ biến được sử dụng rộng rãi trong lập trình web. Nó đi kèm với một loạt tính năng mạnh mẽ, cho phép lập trình viên xây dựng và triển khai các ứng dụng web nhanh chóng và dễ dàng. Dưới đây là một vài tính năng chính của ExpressJS:

Tính năng của ExpressJS là gì?

  • Phát triển máy chủ nhanh hơn: ExpressJS tối ưu hóa cú pháp và cung cấp các phương thức và hàm tiện ích để xử lý các tác vụ phổ biến trong lập trình web. Nhờ đó, bạn có thể viết code ngắn gọn và tối giản hóa quy trình phát triển.
  • Định tuyến (Routing): ExpressJS cung cấp một hệ thống định tuyến mạnh mẽ, cho phép bạn xác định các tuyến đường (routes) để xử lý yêu cầu từ người dùng và phản hồi tương ứng. Điều này giúp tổ chức và quản lý các thành phần của ứng dụng một cách dễ dàng.
  • Middleware: ExpressJS hỗ trợ middleware, cho phép bạn thêm các chức năng trung gian vào quy trình xử lý yêu cầu và phản hồi. Middleware giúp xác thực người dùng, ghi log, xử lý lỗi, nén dữ liệu và thực hiện nhiều tác vụ khác một cách linh hoạt.
  • Cấu hình môi trường: ExpressJS cung cấp một cách để cấu hình môi trường phát triển và môi trường sản xuất. Bạn có thể thiết lập các biến môi trường, cấu hình định dạng và quy tắc, tùy chỉnh ứng dụng của mình theo các môi trường khác nhau.
  • Xử lý lỗi: ExpressJS cung cấp cơ chế xử lý lỗi cho phép bạn kiểm soát và xử lý các lỗi xảy ra trong quá trình xử lý yêu cầu. Bạn có thể tạo ra các middleware để xử lý lỗi và phản hồi với các thông báo lỗi tùy chỉnh.

Xem thêm việc làm Node.js developer hấp dẫn nhất tại TopDev

Ưu nhược điểm của ExpressJS

Ưu điểm của ExpressJS

  • Đơn giản và dễ sử dụng: ExpressJS có cú pháp đơn giản và dễ hiểu, giúp lập trình viên dễ dàng nắm bắt và triển khai các tính năng.
  • Linh hoạt: ExpressJS không áp đặt một cấu trúc cụ thể, cho phép lập trình viên tự do tùy chỉnh và xây dựng ứng dụng theo ý muốn.
  • Hỗ trợ middleware: ExpressJS cung cấp hệ thống middleware mạnh mẽ, cho phép thực hiện các chức năng như xác thực, ghi log, nén dữ liệu và xử lý lỗi một cách linh hoạt và dễ dàng.
  • Hiệu suất cao: ExpressJS được xây dựng trên Node.js, nền tảng có hiệu suất cao, cho phép xử lý nhanh chóng các yêu cầu web đồng thời và có khả năng mở rộng tốt.

Nhược điểm của ExpressJS

  • Thiếu cấu trúc: Do ExpressJS không áp đặt một cấu trúc nghiêm ngặt, việc tổ chức dự án và quản lý mã nguồn có thể trở nên khó khăn, đặc biệt khi ứng dụng phát triển lớn và phức tạp.
  • Khả năng mở rộng: Khi ứng dụng phát triển lớn và phức tạp, việc quản lý mã nguồn và mở rộng có thể trở nên khó khăn với ExpressJS. Cần có sự kiểm soát cẩn thận để tránh sự phức tạp và rối rắm trong việc quản lý các module và tương tác giữa chúng.
  • Cộng đồng hỗ trợ: Mặc dù ExpressJS có một cộng đồng lớn và đầy đủ tài liệu, tuy nhiên, không đạt được mức độ hỗ trợ như các framework web khác như Angular hoặc React.

Điểm khác biệt giữa ExpressJS với NodeJS

Dưới đây là bảng phân biệt giữa ExpressJS và Node.js dựa trên các mục sau:

ExpressJS Node.js
Công dụng Framework xây dựng ứng dụng web Môi trường chạy mã JavaScript phía máy chủ
Thời gian mã hóa Tốc độ phát triển nhanh Tùy thuộc vào quy mô và độ phức tạp của dự án
Khối xây dựng Dựa trên Node.js Dựa trên V8 của Google
Ngôn ngữ chính JavaScript JavaScript, C, C++
Định tuyến Không
Nền tảng Xây dựng trên Node.js Môi trường chạy các ứng dụng JavaScript
Mức độ của các tính năng Cung cấp các tính năng cao cấp Cung cấp các tính năng cơ bản
Phần mềm trung gian Không cần Cần thiết (Node.js là phần mềm trung gian)
Bộ điều khiển Sử dụng bộ điều khiển Express Không cần

Tóm lại

ExpressJS là một framework mạnh mẽ giúp xây dựng ứng dụng web nhanh chóng và linh hoạt. Với cú pháp đơn giản và tích hợp tốt với Node.js, ExpressJS giúp rút ngắn thời gian mã hóa và tăng cường hiệu suất phát triển. Tuy nhiên, việc sử dụng ExpressJS hay không phụ thuộc vào yêu cầu và mục tiêu cụ thể của dự án. Lập trình viên cần đánh giá cẩn thận các ưu nhược điểm của ExpressJS để lựa chọn công nghệ phù hợp nhất cho dự án của mình.

TopDev tổng hợp

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

Bài viết liên quan

Nguyên lý SOLID trong Node.js với TypeScript

Bài viết được sự cho phép của tác giả Sơn Dương Với những bạn lập trình Java thì có lẽ biết rất rõ nguyên lý SOLID. Với Java thì SOLID gần như là quy tắc bất di bất dịch mà mọi lập trình viên phải nắm vững. Mình cũng đã có một bài viết về clean code với nguyên lý SOLID.  Các bạn có thể đọc lại nhé. Tuy nhiên, với Node.js hay Javascript nói chúng thì lại rất dễ dãi. Bạn viết code kiểu gì cũng được, bạ đâu viết đấy cũng được và tùy thuộc style code của mỗi người. Chính vì điều này mà Node.js/Javascript cực dễ học. Nhưng vì viết code thoải mái, không có quy tắc sẽ dẫn đến dự án khó maintain, code sẽ rất rối, khó debug… Chính vì vậy, nếu có thể áp dụng được nguyên tắc SOLID cho dự án Node.js thì thật tuyệt. Bài viết này mình sẽ chia sẻ cách thực hiệ [...]

Worker threads là gì? Bạn đã biết khi nào thì sử dụng Worker threads trong node.js chưa?

Bài viết được sự cho phép của tác giả Tống Xuân Hoài Vấn đề Worker threads được giới thiệu lần đầu tiên từ phiên bản node.js 10.5, tại thời điểm đó API của nó vẫn đang còn trong giai đoạn thử nghiệm trước khi chính thức nhận được bản phát hành ổn định ở phiên bản 12LTS. Worker threads cung cấp một giải pháp giúp chạy mã Javascript trên một luồng khác song song với luồng chính. Vậy cụ thể điều này là như thế nào và nó mang lại lợi ích gì thì xin mời các bạn đọc tiếp bài viết dưới đây. Các tác vụ đòi hỏi nhiều CPU Có thể bạn đã biết node.js xử lý các tác vụ I/O không đồng bộ rất tốt. Nói đến I/O ở đây người ta thường liên tưởng đến những công việc liên quan đến đọc/ghi dữ liệu vào file, hay các request http… Còn với những công việc đồng bộ chẳng hạn [...]

10 Công ty hàng đầu thế giới sử dụng Node.js

Tác giả: Natalia Chrzanowska Node.js là một công nghệ trending mà nhiều doanh nghiệp quyết định đưa vào vận hành. Nó rất phổ biến trong các app real-time hoặc khi chúng ta tìm kiếm môt giải pháp nhanh chóng và linh hoạt. Nó có rất nhiều ưu điểm so với các công nghệ khác và có lẽ vì thế mà ngày càng nhiều người lấn sân sử dụng Node.js trên app của mình như vậy. Họ kì vọng gì khi sử dụng Node.js khi tạo app như vậy? Chúng ta có một vài ví dụ công ty Nodejs điển hình như sau. Netflix Netflix là nhà cung cấp streaming media và video theo yêu cầu hàng đầu thế giới. Hệ thống data-driven của họ thường xuyên chạy những bài toán A/B testing khổng lồ để build nên trải nghiệm phong phú cho hơn 93 triệu subcriber toàn cầu. Một lượng lớn các unique package mỗi cycle dẫn đến một vấn đề về các dependency có điều kiện và [...]

 

Kỹ thuật tối ưu Javascript nhằm tăng tốc độ web gấp 2 lần

Kỹ thuật tối ưu Javascript nhằm tăng tốc độ web gấp 2 lần

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

Khi ứng dụng của bạn ngày càng phát triển với vô số tính năng được thêm vào thì performance luôn là vấn đề nhức nhối. Chẳng hạn như các animation hay transition không được mượt, scroll thì giật hay thậm chí là treo cả UI của ứng dụng. Một trải nghiệm tồi tệ với người dùng! Vậy làm thế nào tối ưu Javascript để tăng tốc độ web?

Tất cả đều chỉ ra một điều, ứng dụng bị chậm là khi bạn không thể giữ hiệu năng ứng dụng với tiêu chuẩn cơ bản 60 FPS (khung hình/giây).

Hãy thử làm một vài phép toán và xem nó là gì nhé!

FPS là gì?

Trước khi chúng ta bắt tay vào đo đạc và tối ưu mã nguồn, mình muốn làm rõ khái niệm đã nhắc đến ở trên. Thực sự FPS là gì?

FPS là viết tắt của từ Frames per second, dịch nghĩa là: khung hình trên giây. Giống như bạn hay xem tivi, người ta hay nhắc đến cụm từ 24 hình/giây đó. Thì khái niệm này cũng tương tự như vậy.

FPS là đại lượng biểu thị số lượng khung hình mà card màn hình của bạn có thể hiển thị mỗi giây và/hoặc số lượng các khung hình mà màn hình của bạn có thể hiển thị mỗi giây.

Giá trị nhỏ nhất để một ứng dụng được coi là mượt mà là 60 FPS. Đây là con số vàng mà các lập trình viên front end nên biết rõ. Nó giống như 24 hình/giây trong video vậy.

  Triển khai mã hiệu quả hơn với compose & pipe function trong Javascript

  7 khái niệm Javascript cơ bản không thể bỏ qua

Cách tính Performance để tối ưu Javascript

1 second = 1000 milliseconds
1000/60 = ~16.6 milliseconds

Vì vậy, bạn chỉ có khoảng 16,6ms cho hiển thị 1 khung hình. Chính là điều kiện để ứng dụng của bạn được coi là mượt mà.

Ứng dụng bắt đầu có vẻ giật lag khi fps giảm xuống dưới 30fps. Tức là:

1000/30 = ~ 33,3 mili giây

Khung hình của bạn đang cần nhiều hơn 33,3ms để hiển thị. Có thể bạn đang thực hiện một số tính toán cần nhiều tài nguyên và hệ thống phải chờ kết quả của việc tính toán đó.

Và mục tiêu của bạn phải tăng khung hình 30 fps đến 60 fps (tất nhiên cao hơn thì càng tốt) bằng mọi giá.

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

Một số gợi ý tối ưu Javascript

Như các bạn đã biết thì JavaScript Runtime bao gồm Call Stack, Render Queue và Callback queue.

Và thứ tự ưu tiên để hệ thống thực hiện là:

Call Stack > Render Queue > Callback queue

Khi code chạy, các hàm bạn gọi ra sẽ được đẩy vào Call Stack. Khi chúng được thực hiện xong, chúng sẽ được đẩy ra khỏi stack đó.

Vì vậy, mục tiêu là xử lý mọi thứ trong stack trong khoảng từ 16 đến ~ 33 ms. Nếu còn bất kỳ chức năng nào hơn 33 ms trên Call Stack, render queue sẽ không thể khung hình hiển thị cho người dùng.

Có nhiều cách làm giảm gánh nặng cho call stack để hạn chế ứng dụng bị giật lag.

Gợi ý 1: Ưu tiên sử dụng API bất đồng bộ

Đầu tiên, là với những tác vụ nặng cần thời gian để xử lý thì nên dùng các API async (là các API bất đồng bộ) thay vì sử dụng API đồng bộ.

Ví dụ: Với Nodejs chẳng hạn, các tác vụ đọc ghi file (IO processing) thì nên dùng API async thay vì API sync.

// Nên sử dụng async api
fs.writeFile('message.txt', 'Hello Node.js', (err) => {
  if (err) throw err;
  console.log('The file has been saved!');
});
//Không nên sử dụng sync API
fs.writeFileSync('message.txt', 'Hello Node.js')
console.log('The file has been saved!');

Lý do là Render queue được ưu tiên nhiều hơn callback queue. Không giống như call stack, callback queue cho phép chuyển sang render queue để vẽ lại màn hình trước khi xử lý xong tất cả mọi callback.

Gợi ý 2: Chọn API phù hợp cho Animation

Cuối cùng ưu tiên sử dụng  requestAnimationFramehơn setTimeout hoặc setInterval cho các animation.

// Không nên
setTimeout(function() {
    console.log(‘running async callback’);
}, 0);
// Thay vì đó nên dùng hàm này
requestAnimationFrame(function() {
     console.log(‘running async callback’);
});

Như vậy mình đã chia sẻ với các bạn 2 thủ thuật rất đơn giản để tối ưu code Javascript. Nhờ đó giúp bạn hạn chế tối đa ứng dụng bị sluggish (hiện tượng giật lag).

Nếu bạn có bí kíp nào khác nữa thì comment bên dưới để mọi người cùng thảo luận nhé.

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

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

Bài viết liên quan

Top 5 tips and tricks hot nhất của JavaScript năm 2024

Tác giả Filip Mở đầu Dưới đây tôi sẽ chia sẻ với các bạn top 5 tip cho JavaScript tốt nhất, hữu ích nhất khi làm việc mà tôi rút ra được sau quá trình làm việc với vai trò là một Software Engineering. 1. Lọc ra những value duy nhất trong cùng một array Tip cho JavaScript đầu tiên bạn cần thiết lập một array và tạo cho nó những value khác nhau, phụ thuộc vào mục đích coding của bạn. Sau đó hãy bắt đầu khai thác các value duy nhất từ array này bằng cách sử dụng lệnh Const filtered array để cho tất cả các value còn lại vào trong một tập hợp array mới. Tiếp theo sử dụng lệnh console.log(filteredArray)màn hình kết quả sẽ xuất hiện một terminal và chạy node tricks.js sẽ lọc được các value phức tạp. Bằng cách này, bạn không chỉ áp dụng lọc value duy nhất cho một array mà có thể áp dụng với mọi objects, [...]

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ẽ đượ [...]

Top 10 câu hỏi phỏng vấn JavaScript cực chi tiết

Theo khảo sát dành cho các lập trình viên hàng năm của Stack Overflow (Stack Overflow Developer Survey) thì trong 2 năm trở lại đây, JavaScript là ngôn ngữ lập trình phổ biến nhất hiện nay. Mức phổ biến của JavaScript (JS) khiến cho nhu cầu tuyển dụng lập trình viên về ngôn ngữ này trở nên rất lớn trong những năm trở lại đây. Nếu bạn cũng đang có dự định chuẩn bị cho việc cuộc phỏng vấn tuyển dụng vị trí lập trình viên JS, bài viết này sẽ dành cho bạn. Chúng ta cùng nhau đi qua top 10 những câu hỏi phỏng vấn về JavaScript phổ biến nhất nhé. Câu 1: JavaScript là gì? Nó thường sử dụng để làm gì? Đây là câu hỏi cơ bản mà thường để bắt đầu phỏng vấn chuyên môn thì nhà tuyển dụng sẽ hay hỏi. Tất nhiên nếu bạn apply vào vị trí Senior thì sẽ không nhà tuyển dụng nào hỏi câu [...]

Công bố Agenda (dự kiến) khu vực thành phố Hồ Chí Minh sự kiện Vietnam Mobile Day 2023

agenda2023

Ngày 09/06 tuần sau, sự kiện Vietnam Mobile Day 2023 sẽ chính thức bùng nổ cánh cửa mới về nền Kinh tế Di động tại Grand Palace.

Mang trong mình sứ mệnh quy tụ và gắn kết các nhân tố của ngành IT, Vietnam Mobile Day 2023 trở lại với chủ đề mang tên Multiverse Mobile Economy, khám phá tương lai của ngành công nghiệp di động, cách chúng định hình nền kinh tế của Việt Nam và lan rộng ra Quốc tế.

Sự kiện này đem đến các bài chia sẻ, phân tích chuyên sâu, phiên thảo luận đa chiều từ các diễn giả/ chuyên gia đầu ngành với nhiều chủ đề nổi bật, từ phát triển di động (Mobile Development), tiếp thị di động (Mobile Marketing), thương mại di động (Mobile Business) đến các xu thế mới như ChatGPT, OpenAI…

Vietnam Mobile Day 2023 gồm bốn chủ đề chính: 

  • Mobile Economy: Disrupt or be disrupt
  • Mobile CX: Convenient & Fast
  • Mobile Infrastructure: Build & Scale
  • Vietnam Technology Landscape 2023

Thông qua bốn chủ đề này, các diễn giả tại Vietnam Mobile Day 2023 – cũng chính là các chuyên gia trong lĩnh vực công nghệ sẽ giúp chúng ta khám phá ra những khía cạnh chưa được vén màn của ngành.

Agenda của sự kiện:

agenda-2023

Hãy cùng điểm qua những Topic mang những từ khóa nóng hổi của ngành Công nghệ Di động 2023:

Mobile Economy: Disrupt or be disrupted

agenda 2023Mr. Lê Yên Thanh – Powering Mobile Intelligence: Exploring the Advancements and Applications of AI Integration

Mr. Trần Duy Thanh – Building smarter mobile apps with on-device machine learning

Mr. Vỹ Nguyễn – From Developer to Product Builder: Can you do it?

Mr. Giáp Văn Đại – Mobile và Blockchain: Cơ hội và thách thức cho ngành tài chính trong tương lai.

Mr. Trần Hoàng Việt – Khởi nghiệp SaaS với Mobile App service

Mr. Nam Te – Tiêu chuẩn ATTT và Bảo Mật Ứng Dụng Di Động

Mr. Phạm Lân – From Highlights to Disruptive Use Cases: The Intersection of Mobile Economy and Blockchain

Ms. Thư Vũ – 1x TP Bank launch: will be with video demo – how long do we have?

Mobile CX: Convenient & Fast

Mr. Trần Trí Nhân – Ứng dụng Blockchain và AI để cải thiện Mobile CX

Mr. Quách Bỉnh Khiêm – Data-driven optimizing mobile app UX-UI

Mr. Trần Viết Quân – Vì sao SAAS trên di động vẫn là thị trường rất lớn trên toàn cầu?

Mr. Nguyễn Trung Thành – Cơ hội và thách thức của Web3 Applications trên nền tảng Mobile

Mr. Nguyễn Xuân Bình – TaxBook & GPT-3.5 – Trợ lý tài chính doanh nghiệp

Mr. Huỳnh Vũ Hoài Nhân – CX in Edtech with hybrid learning

Mobile Infrastructure: Build & Scale

Mr. Philip Hung Cao – Zero Trust for Edge Computing & IoT

Mr. Hoàng Minh Dương – How Gamification Can Boost Customer Engagement in Marketing Campaigns

Mr. Trần Vũ Tất Bình – Scale thành super app ở VN, hướng đi nào về tech cho phù hợp

Mr. Nguyễn Long – Start and build a side project while working full time

Ms. Đinh Mộng Kha – Build and warm the master channel

Vietnam Technology Landscape 2023

Mr. Tony Hà – Truyền thông số & Chuyển đổi số

Mr. Nguyễn Thanh Xuân – Mobile engineering career – Risks & Opportunities

Mr. Bùi Huy Hải – The security pain point in E-wallet start-up and some Self-paracetamol

Mr. Carsten Ley – Vietnam Technology Landscape: How companies get organised better

Mr. Michael Tai – Mobile Insights in Vietnam

Mr. Duy Nguyen – Unleashing Hyper-Personalization to Drive Customer Experiences

Ms. Trần Thị Quỳnh Thi – Data Maturity model for Organizational impact

Mr. Ninh Trung – Sự phát triển của AI hiện tại cũng như những năm tới

Hiện tại Vietnam Mobile Day 2023 đã mở đăng ký tại: https://topdev.vn/vms/ticket-3 

Xem Agenda tại: https://topdev.vn/vms/agendavmd2023# 

THÔNG TIN SỰ KIỆN:

  • TP.HCM: Ngày 09/06/2023 tại Grand Palace, 142/18 Cộng Hòa, phường 4, quận Tân Bình.
  • Hà Nội: Ngày 16/06/2023 Trống Đồng Palace Hoàng Quốc Việt, 489 Hoàng Quốc Việt, P. Cổ Nhuế, Quận Cầu Giấy, Hà Nội.

Vietnam Mobile Day 2023 do TopDev – Nền tảng tuyển dụng IT tổ chức

> Thông tin liên hệ:

> Hợp tác sự kiện: Ms. Tuyền Tống | tuyen.tong@topdev.vn | 0787 544 846

> Event team: event@topdev.vn | 028 6681 3236

> Hỗ trợ khác: Mr. Trung Hiếu | hieu.nguyen@topdev.vn | 0339 824 583

DevSecOps – Tương lai của an ninh bảo mật phần mềm

DevSecOps – Tương lai của an ninh bảo mật phần mềm

Trong thời đại bùng nổ thông tin hiện nay, vấn đề bảo mật tiếp tục là ưu tiên hàng đầu khi các tổ chức phải đối mặt với các mối đe dọa ngày càng tăng và chi phí cao cho các vi phạm dữ liệu. Điều này tạo ra áp lực để đảm bảo rằng phần mềm được thiết kế và sử dụng một cách an toàn. Để giải quyết vấn đề trên, nhiều tổ chức đã bắt đầu áp dụng DevSecOps trong các nhóm của họ để tăng cường bảo mật và tính linh hoạt; đây là một cách tiếp cận để phát triển phần mềm nhúng bảo mật trong mọi giai đoạn của quy trình DevOps. Bài viết hôm nay chúng ta cùng tìm hiểu về DevSecOps – xu hướng được xem là tương lai của an ninh bảo mật phần mềm này nhé.

DevOps là gì?

Trước khi đi vào tìm hiểu về DevSecOps, chúng ta cùng nhớ lại khái niệm DevOps.

DevOps là sự kết hợp của Dev-Development (phát triển) và Ops-Operations (vận hành). Đây là mô hình kết hợp giữa team Dev và team vận hành (System) để triển khai code lên các môi trường (Dev, Test, Production,…) một cách nhanh chóng theo quy trình lặp lại và tự động. 

DevSecOps – Tương lai của an ninh bảo mật phần mềm

Ưu điểm của DevOps là khả năng tự động hóa tất cả các quy trình, từ xây dựng, triển khai và áp dụng cho một ứng dụng hoặc sản phẩm. Mặc dù vậy, trong quá trình hoạt động DevOps đối diện với thách thức về mối lo bảo mật khi mà việc tấn công có thể xảy ra ở bất cứ giai đoạn nào trong xuyên suốt vòng đời phát triển của phần mềm. Và cũng vì lý do trên mà DevSecOps ra đời.

DevSecOps là gì?

“Sec” trong DevSecOps là viết tắt của Security – bảo mật có thể được xem là một tiến hóa từ DevOps với sự tiếp cận bảo mật trong mọi giai đoạn của vòng đời phát triển phần mềm. 

DevSecOps – Tương lai của an ninh bảo mật phần mềm

Trong vòng đời phát triển của phần mềm, đánh giá bảo mật thường là bước cuối cùng trước khi phần mềm được phát hành và được thực hiện do một nhóm an ninh bảo mật riêng biệt thực hiện. Tuy nhiên điều này chỉ phù hợp với mô hình phát triển phần mềm cũ (ví dụ như WaterFall) với việc thời gian phát triển dài, số lượng bản phát hành ít và không liên tục. Với việc các công ty, tổ chức hiện nay áp dụng mô hình mới như Agile và DevOps, chu kỳ phát triển phần mềm giảm xuống chỉ tính bằng tháng, hay theo tuần hoặc thậm chí là theo ngày thì việc đánh giá bảo mật như cũ là bất hợp lý, dễ trở thành nút thắt cổ chai trong mô hình.

Để giải quyết vấn đề này, DevSecOps tích hợp bảo mật ứng dụng và bảo mật cơ sở hạ tầng một cách liền mạch vào các quy trình và công cụ của Agile, DevOps. Nó giải quyết vấn đề bảo mật khi vừa mới xuất hiện; đồng thời việc bảo mật ứng dụng và bảo mật cơ sở hạ tầng trở thành trách nhiệm chung của các nhóm phát triển, bảo mật và vận hành thay vì chỉ một bộ phận chịu trách nhiệm như trước. DevSecOps cho phép phát triển phần mềm an toàn hơn, sớm hơn bằng cách tự động hóa việc cung cấp bảo mật mà không làm chậm chu kỳ phát triển phần mềm.

  Web Security - Dữ liệu người dùng được an toàn (Phần 1)

Các thành phần cơ bản của mô hình DevSecOps

Một mô hình DevSecOps cơ bản bao gồm các thành phần:

  • CI/CD Pipeline: thành phần phân phối các sản phẩm, dịch vụ một cách nhanh chóng và an toàn
  • Infrastructure as code: thành phần giúp tài nguyên hệ thống có khả năng thay đổi đáp ứng co giãn khi cần thiết
  • Monitoring: thành phần giám sát chặt chẽ khía cạnh an ninh trong từng giai đoạn
  • Logging: ghi lại nhật ký các sự kiện bảo mật
  • Microservice: chia nhỏ hệ thống lớn thành các thành phần nhỏ hơn để dễ quản lý
  • Communication: thành phần giao tiếp, liên lạc các nhóm kết hợp

Quy trình hoạt động của DevSecOps bắt đầu khi team phát triển tạo ra source code; các team phát triển khác lấy code mới về và thực hiện phân tích để xác định lỗi hoặc lỗ hổng bảo mật bất kỳ nào. Tiếp theo đó, một môi trường được tạo ra để triển khai ứng dụng và các cấu hình bảo mật cho hệ thống; sau đó bộ tự động kiểm thử được thực thi dựa trên ứng dụng mới được triển khai gồm Backend, Frontend, tích hợp, kiểm tra bảo mật và API. Sau khi vượt qua hết được các bài kiểm tra này thì ứng dụng sẽ được triển khai tới môi trường thật (production).

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

Ưu điểm vượt trội của DevSecOps

Tăng tần suất triển khai ứng dụng an toàn

Khi security bao trùm lên toàn bộ CI/CD pipeline, chất tốc độ sẽ sản phẩm được cải thiện. Ta phải thực tế và chấp nhận rằng giai đoạn đầu của việc tích hợp có thể sẽ rất khó khăn. Khi việc phối hợp giữa các nhóm phát triển và security trở nên mượt mà hơn, những vấn đề này sẽ dần biến mất và chỉ còn lại kết quả tích cực.

Giảm thời gian khắc phục các lỗ hổng nguy hiểm

DevSecOps sẽ cải thiện đáng kể thời gian khắc phục trung bình nhờ việc rà quét sớm và tự động, có luồng feedback tốt hơn và mô hình chia sẻ trách nhiệm. Khi trách nhiệm về security được chia sẻ trên toàn bộ CI/CD pipeline cũng như trong quy trình phát triển phần mềm, thay vì tách biệt hoàn toàn về một nhóm security, các vấn đề an ninh được phát hiện sớm và nhanh hơn. Điều này cũng trực tiếp liên quan đến hiệu quả chi phí, vì nó sẽ tốn nhiều tiền hơn để khắc phục lỗi được tìm thấy trong quá trình vận hành hơn là sửa lỗi được xác định trong giai đoạn thiết kế phát triển.

Cải thiện tư duy về an ninh thông tin

Nói chung, việc phát triển phần mềm hiện nay tương đối là phức tạp. Đưa security vào như một “tính năng” từ đầu sẽ giúp tiết kiệm rất nhiều thời gian cho các nhóm security bằng cách loại bỏ các vấn đề vô hại hoặc false positive nhờ vào các quy trình tự động kiểm soát ở mỗi bước. Nó sẽ tạo ra một nền văn hóa mới, tư duy mới, nơi các phương pháp an ninh tốt nhất được chia sẻ và đem đến lợi ích cho tất cả – bắt đầu ngay từ bước thiết kế, phát triển cho tới quá trình triển khai, vận hành phần mềm ứng dụng.

Giá trị cốt lõi của DevSecOps

DevSecOps nhấn mạnh rằng security là trách nhiệm của tất cả thành viên trong một tổ chức, và mọi người đều phải tuân thủ và thực hiện đảm bảo an toàn bảo mật thông tin.

Chìa khoá để áp dụng thành công mô hình DevSecOps nằm ở ba yếu tố: Con người, quy trình và công nghệ.

Yếu tố con người

Không quan trọng bao nhiêu công nghệ được áp dụng, yếu điểm lớn nhất về mặt an ninh thông tin luôn là con người. Đây cũng là điểm khởi đầu cho bất cứ quá trình áp dụng DevSecOps nào.

Một trong những điều quan trọng nhất nhưng cũng là khía cạnh khó nhất của DevSecOps là thay đổi cách làm việc truyền thống của security team. Đa số cách tiếp cận rủi ro là loại bỏ khi nó đã xảy ra, thay vì chủ động phòng bị trước.

Security team cần chuyển từ việc hoạt động độc lập sang việc tham gia cùng trong luồng phát triển phần mềm. Điều này vừa giúp tăng nhận thức về an ninh thông tin tới tất cả thành viên trong đội dự án, vừa giúp nhận biết sớm các rủi ro tiềm tàng trong phần mềm, trong hệ thống.

Yếu tố quy trình

Các quy trình thông thường được quy phạm tới từng team và thường ít khi có sự chia sẻ giữa các team với nhau. Điều này có thể gây ra ảnh hưởng tới năng suất trong cả một tổ chức. DevSecOps hướng tới việc thiết lập các quy trình tiêu chuẩn chung, các tài liệu đảm bảo security cho tổ chức để tạo sự phối hợp giữa các team như là một khối thống nhất. Việc xây dựng ra một quy trình, tiêu chuẩn tự động hoá đảm bảo an toàn thông tin là trách nhiệm của team DevSecOps.

Version control

Khi mọi thứ được tự động hoá, thứ quan trọng nhất cần được track đó là các thay đổi (changes). Mỗi hành động tạo ra changes phải được quản lý bởi version, cũng giống như version control khi code vậy. Việc versioning này sẽ giúp ta ghi lại được lịch sử thực hiện cũng như dễ dàng khi khôi phục lại. Để đáp ứng yếu tố này, DevSecOps team sẽ xây dựng một hệ thống Gitlab private nhằm lưu trữ tất cả các mã nguồn được viết ra bởi developer.

Tích hợp

Security cần phải được đưa vào quá trình phát triển sản phẩm sớm nhất có thể, ngay từ bước thiết kế. Phương pháp này được gọi là “shift left” hay “shift security to the left”.

Áp dụng những công cụ rà soát an ninh thông tin tự động ngay từ giai đoạn đầu của việc phát triển ứng dụng. Điều này vừa giúp những vấn đề về an ninh được phát hiện và ngăn chặn sớm, đồng thời cũng giúp các developer có nhận thức tốt hơn về việc viết code an toàn.

Compliance

Tuân thủ compliance là điều bắt buộc. Nếu nền móng về yếu tố con người đã được thực hiện tốt trước đó, thì việc tuyên truyền về việc tuân thủ compliance sẽ trở nên rất đơn giản và hiệu quả. Bên cạnh đó, compliance có thể không chỉ là các văn bản quy phạm. Ta hoàn toàn có thể xây dựng các metadata biểu diễn cho các compliance requirement và đưa vào các security policy để thực hiện tự động hoá.

Xử lý sự cố

Phản ứng với các sự cố liên quan tới an ninh thông tin không nên là tạm bợ nhất thời. Thay vào đó, việc xây dựng workflow, action plan, runbook, playbook luôn cần được chuẩn bị sẵn sàng từ trước. Điều này sẽ đảm bảo việc phản ứng với các sự cố trở nên có tính chắc chắn, có khả năng đo đếm và nhanh chóng hơn. Theo quy trình và tiêu chuẩn DevSecOps tại Techcombank, các kịch bản khôi phục sự cố cần được thực hiện dưới dạng code và tự động thông qua CI/CD pipeline. Điều này sẽ giúp việc ứng phó sự cố hệ thống trên môi trường live được thực hiện nhanh chóng hơn và số lượng sự cố trong quá trình triển khai cũng sẽ giảm đi.

Yếu tố công nghệ

Công nghệ là thứ cho phép mọi người thực hiện được các quy trình DevSecOps. Đây cũng là yếu tố cuối cùng quyết định việc áp dụng DevSecOps của một tổ chức có đủ trưởng thành, có thành công hay không.

Tự động hóa việc quản lý cấu hình

Tổ chức quản lý và tự động hóa việc quản lý cấu hình dưới dạng code sẽ giúp việc audit, việc đảm bảo baseline, compliance trở nên dễ dàng hơn rất nhiều. Các template dưới dạng code được đưa ra giúp việc rà soát các thay đổi được kiểm soát qua version control, rollback, phục hồi cũng trở nên rất nhanh chóng.

Tại Techcombank, Puppet được sử dụng như là một công cụ kiểm soát cấu hình. Các cấu hình đạt tiêu chuẩn baseline sẽ được định nghĩa trước và quản trị thông qua Puppet. Mọi hành vi cố ý thay đổi ngoài baseline sẽ luôn được phục hồi lại nhanh chóng.

Host hardening

Trước khi bảo mật đến tầng ứng dụng, tầng OS cần phải được an toàn trước. Có vô số những sự cố an ninh bắt nguồn từ việc host, đặc biệt là các host bị expose ra internet, bị khai thác. Do đó, một hardening checklist là rất cần thiết trong việc xây dựng template cũng như trust model cho việc cấu hình host. Kết hợp với tự động hóa việc quản lý cấu hình, host sẽ luôn được đảm bảo ở trạng thái an toàn cao nhất. 

Audit và scan tại tầng ứng dụng

Việc thực hiện audit và scan liên tục là một phương diện thiết yếu của DevSecOps, giúp cho tổ chức hiểu được rõ ràng về các mối nguy. Các giải pháp hiện tại gồm có:

  • Quét mã nguồn: Việc quét mã nguồn có thể được thực hiện bằng cách áp dụng các SAST tool (Static Application Security Testing). SAST tool phân tích mã nguồn của dự án để xác định ra các lỗi liên quan đến bảo mật trong code cũng như vấn đề của các dependency và library mà ứng dụng sử dụng. Các công cụ được DevSecOps team đưa vào tiêu chuẩn gồm có SonarQube và Synopsys Coverity.
  • Tích hợp vào IDE: Mọi developer đều cần sử dụng IDE trong việc code. Sử dụng một số plugin trong IDE sẽ giúp ngăn chặn một phần lỗi trong code ngay từ máy cá nhân của developer trước khi cả commit code lên repository. Hiện tại, việc ngăn chặn này đang được thực hiện bằng pre-commit và sắp tới là SonarLint
  • Binary scanning: Các package của ứng dụng sau khi được build ra cần phải được rà quét lại dưới dạng binary bằng Synopsys BlackDuck. Việc một lần nữa rà quét lại bản build này giúp đảm bảo chắc chắn rằng phần mềm kể cả đã đóng gói cũng đảm bảo an toàn thông tin.
  • Audit trước và sau triển khai: Thêm một bước audit trước và sau triển khai sẽ đảm bảo ứng dụng an toàn tại day-0 và cả day-1 khi triển khai.
Quản lý secret

Secret và credential là các dữ liệu nhạy cảm hoặc thậm chí là tối mật được sử dụng cho ứng dụng. Trong quá trình thực hiện CI/CD, việc sử dụng đến các secret hay credential là một việc thường xuyên xảy ra. Do vậy, sử dụng các công cụ mã hoá và lưu trữ các dạng dữ liệu này là tối quan trọng, đặc biệt trong CI/CD pipeline. Các công cụ, nền tảng hỗ trợ cho việc này đang được áp dụng tại các công ty quy mô lớn có thể kể đến như HashiCorp Vault, AWS Secrets Manager, GPG, Ansible Vault…

DevSecOps chuyển dịch security từ phản ứng sang chủ động tham gia vào quy trình phát triển phần mềm. Những ưu điểm mà DevSecOps mang lại cho tổ chức là rất nhiều, bao gồm giảm thiểu chi phí, tăng tốc độ triển khai, tăng tốc độ phục hồi, kiểm soát và truy tìm các mối nguy. DevSecOps cũng phá bỏ đi rào cản giữa DevOps và Security, giúp tất cả cùng hoạt động hướng tới những mục tiêu chung của tổ chức.

Tác giả: Phạm Minh Khoa

Bài viết liên quan

Bảo mật ứng dụng Java web bởi Spring Security

Bài viết được sự cho phép của smartjob.vn Chúng mình xin chia sẻ với bạn kỹ thuật bảo mật tiên tiến, mạnh mẽ dành cho Java web sử dụng Spring Security. Bài viết hội tụ các best-practice, các kỹ thuật tối tân nhất hiện nay. Nội dung sẽ hay và khó. Công nghệ sử dụng (technology-stack) Spring Security Spring Boot Spring Web MVC Gradle (build system) Thymeleaf (template engine) Công cụ sử dụng IntelliJ IDEA 2016.1.3 Apache Tomcat 8.0.35 Trước khi bắt tay thực hiện, Bạn nên đọc các bài viết trên SmartJob: Giới thiệu Spring Boot (để hiểu về Spring Boot) Kiểm tra tính hợp lệ của dữ liệu đầu vào form Spring Web MVC bởi Hibernate Validator  (để hiểu về luồng đi của Spring Web MVC) Spring Security [1] là bộ khung bảo mật ứng dụng Java web cung cấp cơ chế cấp phép quyền (authorization) và xác thực người dùng (authentication). Sức mạnh của Spring Security thể hiện ở sự dễ dùng, dễ cấu hình, khả năng mở rộng, và khả năng bảo mật ứng [...]

Hãy lưu ý 5 điều sau để giảm nguy cơ bị tấn công mạng

Bài viết được sự cho phép của tác giả Kiên Nguyễn Tấn công mạng hiện đang rất phổ biến, nó không chỉ xảy ra với các tổ chức hay doanh nghiệp lớn, mà nó còn tập trung vào các cá nhân ít hiểu biết về công nghệ, về kiến thức sử dụng máy tính và có tính chủ quan trong phòng chống rò rỉ dữ liệu cá nhân, dẫn đến những hậu quả không đáng có. [irp posts="23488" name="Cách mạng 0.4 của Neovim: Floating Window"] [irp posts="872" name="Cách Mạng Công Nghệ Lần 4: Các Ông Trùm Công Nghệ Đang Hướng Đến Thị Trường Di Động Việt Nam"] Chính vì vậy mà trong bài viết này, mình sẽ chia sẻ một vài điều mà bạn cần lưu ý để có thể an toàn trước các nguy cơ tấn công mạng trên Internet. Ngoài những cách bên dưới mình đề xuất ra, nếu bạn còn có thêm phương pháp nào hay và hiệu quả khác [...]

Top 7 câu hỏi phỏng vấn Security Engineer thường gặp

Vấn đề bảo mật luôn là một thách thức lớn cho các công ty, tổ chức hiện nay; vì thế các công ty IT luôn ưu tiên tìm kiếm vị trí Security Engineer có kinh nghiệm với mức đãi ngộ cao. Bài viết hôm nay chúng ta cùng nhau tìm hiểu những câu hỏi phỏng vấn vị trí Security Engineer thường gặp nhé. 1. Công việc của một Security Engineer là gì? Security Engineer – kỹ sư bảo mật hay Security Specialist – chuyên gia bảo mật là một công việc giúp bảo vệ hệ thống máy tính khỏi các tấn công từ bên ngoài và đề phòng, hạn chế, khắc phục những lỗi xảy ra từ bên trong. Việc bảo mật trong một tổ chức bao gồm nhiều lĩnh vực như mạng (network), thông tin (information), hệ thống (system),… và nhiều vai trò công việc như khắc phục sự cố (Ttroubleshooting), quản trị (administration), phân tích (analyst), kiểm tra (testing),… Công việc của mộ [...]

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

Lợi ích và những hạn chế khi sử dụng SSH Tunneling

Lợi ích và những hạn chế khi sử dụng SSH Tunneling

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Đôi khi chúng ta phân vân trong việc có nên xuất cổng (port) của cơ sở dữ liệu hay bất kì một dịch vụ nào đó ra ngoài mạng Internet để tiện cho việc kết nối và quản lý từ xa? Việc để lộ cổng ra ngoài như vậy không khác gì cho kẻ trộm nhìn thấy cửa nhà và ổ khóa, việc cần làm của chúng là tìm một “người thợ khóa” giỏi để có thể mở được cánh cửa đó trong thời gian sớm hay muộn mà thôi.

Chúng ta đều biết việc chỉ sử dụng username và password thôi là chưa đủ cho một hệ thống bảo mật. Vì chúng có nhiều cách để bị trộm mất mà người dùng không hề hay biết. Hiện nay các hệ thống hỗ trợ đăng nhập đã bổ sung thêm tính năng xác minh hai lớp, đăng nhập bằng mật khẩu dùng một lần, OTP… hay thậm chí là đăng nhập bằng khóa bí mật được tạo ra bởi những thuật toán phức tạp để bảo vệ người dùng tốt hơn.

SSH là một giao thức để đăng nhập và quản trị thiết bị từ xa, truyền tệp qua các mạng không đáng tin cậy. Có thể nói SSH là giao thức được sử dụng phổ biến nhất để đăng nhập và điều khiển một máy tính khác trên mạng Internet. SSH trở nên mạnh mẽ bởi ngoài việc sử dụng username & password thì nó còn hỗ trợ cả việc sử dụng SSH key khiến cho việc bẻ khóa là vô cùng khó.

Khi có trong tay một phiên SSH thì chúng ta có quyền thao tác với máy chủ bằng quyền hạn của người dùng đã được thiết lập trong hệ thống. Bao gồm cả việc ánh xạ một cổng TCP/IP bất kì của máy chủ về máy tính cá nhân. Tính năng này được gọi là SSH Tunneling, trong bài viết ngày hôm nay chúng ta sẽ tìm hiểu về SSH Tunneling.

SSH Tunneling là gì?

Từ tunnel trong tiếng anh dịch ra Tiếng Việt có nghĩa là là “đường hầm”. Đúng như tên của nó thì SSH Tunneling là đào một “đường hầm” thông qua ssh.

Sử dụng SSH Tunneling chúng ta có thể chuyển tiếp bất kì cổng TCP/IP nào từ máy chủ về máy khách và bảo mật đường truyền đó.

Ví dụ bạn có một máy chủ A ở địa chỉ IP x.x.x.x có cài MySQL Server sử dụng cổng 3306. A đã cấu hình không public cổng 3306 ra ngoài. Điều đó có nghĩa là không ai khác ngoài A mới có thể kết nối được vào máy chủ MySQL đó.

Tuy nhiên nếu sử dụng SSH Tunneling để đào “hầm” chuyển tiếp cổng 3306 của A về một cổng nào đó của máy B là hoàn toàn khả thi. Tức là chúng ta có thể gián tiếp kết nối vào A thông qua B.

Để làm được điều đó, tất nhiên chúng ta phải có phiên (session) SSH vào A mới có thể thiết lập được Tunneling.

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

  Kết nối SSH với máy chủ ảo EC2 Instance Linux trên Amazon AWS

Lợi ích của việc sử dụng Tunnel SSH

SSH Tunnel có những lợi ích nhất định cho những nhóm người dùng khác nhau.

Đối với người dùng cá nhân, SSH Tunneling có thể là một giải pháp kết nối với các ứng dụng trên máy chủ từ xa một cách nhanh chóng và dễ dàng nhất mà vẫn đảm bảo được tính an toàn trên các mạng không đáng tin cậy. Không cần phải mở cổng ra ngoài Internet, không cần phải thiết lập một mạng riêng ảo…

Đối với môi trường doanh nghiệp thì SSH Tunneling được sử dụng rộng rãi trong các hệ thống máy tính thông qua những phần mềm được tạo ra dựa trên nó. Nhưng chung quy lại mục đích của nó vẫn là kết nối những ứng dụng lại với nhau trong một hệ thống máy tính.

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

Hạn chế

Tuy lợi ích mạng lại là rất lớn nhưng SSH Tunnel cũng đi kèm với những rủi ro.

Các kết nối SSH được mã hóa rất mạnh, điều này vô tình làm cho việc quan sát dữ liệu ở bên trong “đường hầm” hầu như trở nên vô hình với các công cụ giám sát mạng. Và nếu kẻ tấn công lợi dung điều này để ăn cắp dữ liệu thì rất nguy hiểm.

Sử dụng SSH tunneling có thể dễ dàng thiết lập một port-forwarding chuyển tiếp cổng bị chặn từ firewall về một máy khác. Hầu hết firewall cung cấp ít hoặc không có cơ chế ngăn chặn điều này.

Do thiết lập SSH tunnel đơn giản chỉ bằng một lệnh duy nhất nên nhiều phầm mềm độc hại lén cài mã vào để thực thi trên máy chủ với mục đích xấu.

Các cuộc tấn công bằng SSH Tunnel cũng nhằm mục đích ẩn danh. Những kẻ tấn công bằng cách nào đó vào được các máy chủ của nạn nhân sẽ mở một Tunneling và điều khiển chúng từ xa. Các máy chủ này sẽ được dùng vào mục đích tạo ra các cuộc tấn công trên quy mô lớn ví dụ như DDOS… Thực tế đã có ghi nhận vụ việc này khi hàng triệu thiết bị IoT bị tấn công và lợi dụng theo phương pháp này.

Khắc phục những hạn chế

Để ngăn chặn những rủi ro mà SSH Tunneling gây ra đòi hỏi người vận hành có khả năng giám sát, kiểm soát và kiểm tra các kết nối SSH được mã hóa. Cấu hình phù hợp và tăng cường bảo mật hệ điều hành của các thiết bị IoT.

Cách thiết lập Tunnel SSH

Chuyển tiếp cổng cục bộ (Local Forwarding)

Giả sử bạn muốn chuyển tiếp cổng 3306 của A có địa chỉ IP x.x.x.x về cổng 3307 của B có địa chỉ IP z.z.z.z:

$ ssh -L 3307:z.z.z.z:3306 user@x.x.x.x 

Với user@x.x.x.x là lệnh đăng nhập vào server thông qua SSH.
Lúc này mọi kết nối đến z.z.z.z:3307 sẽ tương đương x.x.x.x:3306.

Tương tự nếu muốn chuyển cổng 3306 của A về máy tính cá nhân:

$ ssh -L 3307:127.0.0.1:3306 user@x.x.x.x 

Mặc định các lệnh tạo Tunneling sẽ giữ lại phiên và bạn sẽ thấy terminal giữ một kết nối đến server. Để chạy Tunneling trong nền (background) thì thêm tùy chọn -N -f:

$ ssh -L 3307:z.z.z.z:3306 -N -f user@x.x.x.x 

Chuyển tiếp từ xa (Remote Forwarding)

Giả sử bạn muốn chuyển tiếp cổng 80 của A có địa chỉ IP x.x.x.x về cổng 8080 trên máy cá nhân:

$ ssh -R 80:localhost:8080 user@x.x.x.x

Với user@x.x.x.x là thông tin đăng nhập vào server thông qua SSH.

Mặc định server sẽ tắt Remote Forwarding, nếu muốn sử dụng tính năng này chúng ta cần phải chuyển cấu hình GatewayPorts no thành GatewayPorts yes trong cấu hình sshdconfig của ssh thông thường ở /etc/ssh/sshdconfig.

Hoặc thiết lập GatewayPorts clientspecified để chỉ định một địa chỉ IP mới có quyền forwarding.

$ ssh -R z.z.z.z:80:localhost:8080 user@x.x.x.x

Điều này chỉ cho phép IP z.z.z.z chuyển tiếp cổng 80 của A về cổng 8080 của local.

Tổng kết

SSH Tunneling hay chuyển tiếp cổng (port-forwarding) là một giải pháp chuyển tiếp cổng của một máy về một máy khác thông qua “đường hầm” được đào bởi SSH đảm bảo độ tin cậy cao.

SSH Tunneling mang lại nhiều lợi ích và cũng kèm theo những rủi ro. Để ngăn chặn điều đó đòi khỏi khả năng giám sát hệ thống của người vận hành.

Thiết lập SSH Tunneling rất đơn giản chỉ bằng một câu lệnh duy nhất.

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

Bài viết liên quan

Một số mẹo cho việc phát triển ứng dụng hệ thống nhúng

Bài viết được sự cho phép của tác giả Nguyễn Hồng Quân Trong quá trình phát triển ứng dụng cho hệ thống nhúng, do sự hạn chế của thiết bị, đôi khi có những việc lắt nhắt làm tốn mớ thời gian. Sau đây mình liệt kê một số mẹo để đi tắt, giúp tiết kiệm thời gian cho công việc. Các hướng dẫn này chỉ dành cho hệ điều hành Linux (như Ubuntu). 1. Chia sẻ Internet từ laptop cho máy tính nhúng Đây là tình huống mà bạn đang phát triển ứng dụng cho máy tính mini (NUC, Raspberry Pi, Beagle Bone...) và chủ yếu dùng mạng dây (chưa setup wifi hoặc máy đó không có card wifi). Đôi lúc bạn cần phải xách nó đi đâu đó (để trình diễn demo, để cài đặt lại chẳng hạn) mà chỗ đó không có router để cấp mạng, bạn có thể chia sẻ Internet từ laptop (laptop đang kết nối Internet qua wifi) cho nó. Để cho ngắn gọn, mình sẽ gọi máy tính [...]

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

Bài viết được sự cho phép của tác giả Lê Chí Dũng Lý do bạn nên sử dụng SSH Key thay password Root: Bảo mật hơn việc sử dụng password gấp n+1 lần. Hacker sẽ không thể tấn công bằng Brute Force Attack để đánh cắp password root được. Tiện lợi trong việc chứng thực vào một hoặc nhiều server nếu không đặt password cho SSH Key thì càng tiện =]]. Dễ dàng cấp phát quyền cho ai đó làm việc trên một server hoặc nhiều server. [irp posts="30425" name="10 điều bạn có thể làm với Linux mà bạn không thể làm với Windows"] [irp posts="2905" name="14 khóa học Tech miễn phí chất lượng từ MIT, Harvard, Linux..."] Xem thêm các việc làm Linux lương cao trên TopDev 1. SSH Key hoạt động như thế nào? SSH Key hiểu đơn giản là một phương thức chứng thực người dùng truy cập vào server bằng cách đối chiếu giữa một key cá nhân (Private Key) trên thiết bị truy cập  [...]

Triển khai mã hiệu quả hơn với compose & pipe function trong Javascript

Bài viết được sự cho phép của tác giả Tống Xuân Hoài Đã bao giờ bạn gặp bài toán xử lý dữ liệu liên tục? Vậy thì bạn sẽ làm gì trong trường hợp Giới thiệu về composition function Composition là một cơ chế kết hợp nhiều hàm đơn giản để xây dựng một hàm phức tạp hơn. Kết quả của mỗi hàm sẽ được chuyển cho hàm tiếp theo. Nó giống như trong toán học, chúng ta có một hàm số f(g(x)), tức là kết quả của g(x) được chuyển cho hàm f. Thì composition là như vậy. Một ví dụ đơn giản: Viết hàm thực hiện phép tính 1 + 2 * 3. Đối với phép tính này chúng ta phải thực hiện phép nhân trước sau đó đến phép cộng. Đoạn mã khi được triển khai bằng các hàm trong Javascript sẽ trông như thế này: const add = (a, b) => a + b; const mult = (a, b) => a * b; add(1, mult(2, 3)); Oh! hàm chạy rất tố [...]

Đừng bỏ lỡ tin tuyển dụng IT mới nhất trên TopDev

Những cải tiến đáng giá của Python 3.12

Những cải tiến đáng giá của Python 3.12

Trong hầu hết các bảng xếp hạng ngôn ngữ lập trình, Python luôn có mặt trong top đầu, thậm chí là đứng đầu nhờ sự hiệu quả và tối ưu của nó. Với những phát triển nhanh của công nghệ hiện nay, nhất là trong các lĩnh vực xử lý dữ liệu lớn Big Data hay trí tuệ nhân tạo AI thì bản thân Python cũng luôn đối mặt với những thách thức cần thay đổi nhằm tăng tốc độ và hiệu quả. Mới đây ngày 24/5/2023 phiên bản Python 3.12.0b1 được phát hành với nhiều cải tiến đáng giá mang tính cách mạng trong việc tối ưu hóa của ngôn ngữ lập trình. Bài viết hôm nay chúng ta cùng nhau tìm hiểu những tính năng mới trong phiên bản Python 3.12 này nhé.

Ngôn ngữ lập trình Python

Python là một ngôn ngữ lập trình bậc cao được phát triển với mục đích lập trình đa năng cùng thiết kế dễ đọc, dễ học và dễ nhớ. Được xuất hiện lần đầu vào năm 1991, trải qua hơn 30 năm thì Python luôn được xếp hạng vào những ngôn ngữ lập trình phổ biến nhất.

Ngôn ngữ lập trình Python

Python là một ngôn ngữ lập trình đa mẫu hình, lập trình hướng đối tượng và lập trình cấu trúc được hỗ trợ hoàn toàn, và nhiều tính năng của nó cũng hỗ trợ lập trình hàm và lập trình hướng khía cạnh. Python hiện nay hỗ trợ hầu hết các nền tảng hệ điều hành phổ biến từ Windows, Mac OS hay Linux. Nhờ những tính chất trên cùng với sự hỗ trợ đóng góp đến từ cộng đồng với các thư viện đa dạng, Python được ứng dụng trong nhiều lĩnh vực, nhất là trong các ngành phát triển trí tuệ nhân tạo AI hay xử lý dữ liệu lớn Big Data.

  Python là gì? Tổng hợp kiến thức cho người mới bắt đầu

Python version 3.12

Python version 3.12

Python 3.0 được ra mắt ngày 3/12/2008; là một phiên bản lớn không tương thích ngược hoàn toàn với việc nhiều tính năng được chuyển mã ngược về loạt phiên bản Python 2.6.x và 2.7.x. Cũng vì thế mà hiện nay, Python vẫn duy trì hỗ trợ cả 2 phiên bản 3.x và 2.x; nhiều ứng dụng cũng tương thích với phiên bản Python 2.x.

Python 3.12 sẽ là phiên bản được dự kiến phát hành vào ngày 31/7/2023 sắp tới; và mới đây nhất ngày 22/5/2023 phiên bản beta thứ nhất với mã hiệu là 3.12.0b1 được giới thiệu với nhiều tính năng mang tính cách mạng trong việc tối ưu hóa ngôn ngữ, hứa hẹn triển khai nhanh hơn và hiệu quả hơn. Cùng điểm qua các tính năng mới đáng giá trên Python 3.12 này nhé:

Thông báo lỗi tốt hơn

Việc thông báo lỗi trên Python trong những phiên bản gần đây đã không chỉ dừng ở việc chỉ rõ chính xác vị trí lỗi (bao gồm dòng code, vị trí trên dòng) mà còn chi tiết hơn khi chỉ ra những đề xuất về những gì có thể sai trong đoạn code trên. Với phiên bản Python 3.12, thông báo lỗi còn có những cải tiến bổ sung như:

  • Đề xuất được module bị import thiếu, bao gồm các module từ thư viện chuẩn của Python
  • Đề xuất tốt hơn phương án xử lý khi code của bạn gặp lỗi cú pháp phổ biến khi nhập
  • Đề xuất NameError bao gồm cả thể hiện self của lớp
  Biến số và kiểu dữ liệu số trong Python

Hỗ trợ cho Linux perf profiler

Linux perf (tiện ích kiểm soát không gian người dùng) là một công cụ phân tích hiệu suất trong Linux. Với những phiên bản trước đây, Python cho phép perf hoạt động và trả về thông tin những gì đang xảy ra ở level C trong Python Runtime. Version Python 3.12 kích hoạt chế độ opt-in (chế độ chủ động nhận thông tin từ hệ thống) để cho phép perf thu thập thông tin chi tiết về các chương trình Python. Việc chọn tham gia hay không có thể được thực hiện trong khai báo môi trường (environment) hoặc trực tiếp trong chương trình với function sys.activate_stack_trampoline.

Tham khảo Job HOT Python Developer Ho Chi Minh hấp dẫn trên TopDev

Khả năng giám sát và gỡ lỗi nhanh hơn

Thông thường để giám sát hay gỡ lỗi trong chương trình Python thì bạn cần đính kèm trình gỡ lỗi (debugger), khiến cho hiệu suất chương trình của bạn bị ảnh hưởng, chạy chậm đi ở toàn chương trình một cách không cần thiết.

Tiêu chuẩn của phiên bản mới bổ sung các hooks để có thể đính kèm phần gỡ lỗi hay giám sát vào chương trình với điểm bắt đầu và kết thúc; giúp giảm bớt được chi phí khi thực hiện các công việc này và không làm ảnh hưởng nhiều đến hiệu suất chương trình.

  Python và cách tiết kiệm dung lượng cho phần mềm nhúng

Hỗ trợ phương thức đặc biệt với giao thức bộ đệm

Dunder method là các phương thức đặc biệt mà trong Python tự động gọi, được bắt đầu và kết thúc bằng dấu gạch dưới kép (__). Việc gọi các phương thức này không được thực hiện trực tiếp mà xảy ra trong nội bộ lớp trên một hành động nhất định. Python 3.12 triển khai các phương thức dunder mới cho các đối tượng cho phép mã Python hoạt động với giao thức bộ đệm, thay vì việc trước đây phải viết các đối tượng đó bằng C. Phương thức __buffer__ có thể được sử dụng cho mã cấp phát bộ nhớ mới hay truy cập bộ nhớ hiện có.

Cải tiến khả năng gợi ý code khi đánh máy

Từ phiên bản 3.5 thì Python đã cho phép các công cụ linting phát hiện trước được nhiều lỗi ngay lúc nhập để cảnh báo hay gợi ý code. Với phiên bản mới lần này bổ sung thêm các tính năng bao quát phạm vi sử dụng rộng hơn và chi tiết hơn.

Cải thiện hiệu suất

Python 3.12 mang lại một số cải thiện về mặt hiệu suất đáng chú ý như sau:

  • Comprehension inlining: Comprehension là một cú pháp cho phép bạn nhanh chóng tạo danh sách hay tập hợp; trong Python 3.12 nó có thể tạo một cách nội tuyến (inline) thay vì tạo các đối tượng tạm thời. Điều này giúp tăng tốc độ lên khoảng 11% so với trước.
  • Immortal objects: Các đối tượng bất tử trong Python là những đối tượng không bao giờ bị thay đổi số lượng tham chiếu. Về lâu dài, nó giúp việc triển khai thay đổi quy mô đa lõi dễ dàng hơn và triển khai các tối ưu hóa khác.
  • Smaller object sizes: Kích thước cơ sở của 1 đối tượng Python hiện tại là 208 bytes; kể từ phiên bản Python 3.12 sẽ được tái cấu trúc cho nhỏ hơn 1 nửa, chỉ còn 96 bytes
  • Subinterpreters: trình thông dịch phụ tạo khả năng có nhiều phiên bản trình thông dịch chạy song song trong một quy trình Python. Đây là một bước tiến lớn hướng tới tính song song (Parallelism) tốt hơn trong Python

Kết bài

Python là một ngôn ngữ lập trình năng động, luôn phải đối mặt với những thách thức trong việc tăng tốc độ và hiệu quả. Với những cải tiến trong phiên bản Python 3.12 sắp tới, tương lai của Python hứa hẹn sẽ triển khai nhanh hơn và hiệu quả hơn. Hy vọng bài viết này mang lại cho bạn những thông tin hữu ích 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

Bài viết liên quan

Khởi Đầu Dự Án Python Như Thế Nào Để Thuận Tiện Phát Triển Lên

Bài viết được sự cho phép của tác giả Nguyễn Hồng Quân Thỉnh thoảng mình có mối duyên ghé mắt qua các dự án Python, thấy cách sắp đặt vẫn còn chuệch choạc, không có lợi lắm cho việc phát triển tiếp diễn. Nên sau đây mình chia sẻ một số cách thức, công cụ, thư viện mà bạn nên chuẩn bị từ đầu, để công việc sau đó trở nên thoải mái hơn. Cách sắp đặt này có thể coi là chuẩn trong những năm 2020 này (nhưng có thể trở thành lạc hậu sau 5 năm nữa). 1. Quản lý các gói phụ thuộc Gói phụ thuộc (dependency) là các thư viện / công cụ bên ngoài mà dự án của bạn cần. Các gói này phải được cài trước khi phần mềm của bạn có thể chạy. Ví dụ bạn làm về khoa học dữ liệu thì sẽ cần NumPy, làm web thì sẽ cần Django v.v... Việc một [...]

Tuple Python là gì? Tìm hiểu về tuple python

Với anh em nào chưa biết xài Tuple, bài viết này giúp đỡ được, với anh em nào đã xài Tuple và quên té cái giống và khác với List, đọc bài này cũng ổn. Nói chung là bài viết Tuple Python này dành cho mọi người, mọi trình độ. Đọc vui anh em nhớ ủng hộ nha!. Viết khá cụ thể, giống, khác, ví dụ ví dại rõ ràng đầy đủ. Bắt đầu ngay thôi nào! 1. Tuple là gì? Bắt đầu với đặc sản là lướt qua định nghĩa. A Tuple is also a sequence data type that can contain elements of different data types, but these are immutable in nature. In other words, a tuple is a collection of Python objects separated by commas. The tuple is faster than the list because of static in nature. Tuple là kiểu dữ liệu chuỗi bao gồm nhiều các thành phần có kiểu dữ liệu khác nhau, nhưng nó là không thể thay đổi được. Nói một các khác, tuple là một object Collection phân cách nhau bằng dấu phẩy. Tuple nhanh hơn List cũng ở chỗ này, [...]

Tạo kho lưu cho các gói thư viện Python

Bài viết được sự cho phép của tác giả Nguyễn Hồng Quân Python là ngôn ngữ chính cho hệ thống backend của AgriConnect. Với đội ngũ giàu kinh nghiệm về Python, luôn đẩy sự khai thác, "bóc lột" Python đến mức cao nữa, cao nữa, nên quá trình vận hành của AgriConnect thường dẫn đến những nhu cầu "không giống ai". Một trong số đó là nhu cầu dựng một kho chứa gói thư viện Python "tại nhà". Bài dưới đây xin chia sẻ kinh nghiệm như thế. Khi hệ thống của AgriConnect vận hành, tác vụ cài đặt các gói thư viện Python được thực hiện lặp đi lặp lại rất nhiều lần. Chúng đến từ: Hệ thống chạy test tự động, kích hoạt mỗi khi có code mới được đẩy lên Git. Việc deploy bản cập nhật đến các server nội bộ đặt rải rác ở các trang trại khách hàng. Đa số các máy mà quá trình cài đặt thư viện Python diễ [...]

Top IT Jobs hot dành riêng cho Top Developers tại TopDev!

Top 7 phương pháp tự học lập trình tốt nhất dành cho Developer

Top 7 phương pháp tự học tốt nhất dành cho lập trình viên

Tự học là một yếu tố quan trọng giúp các lập trình viên phát triển kỹ năng và nâng cao hiệu suất làm việc. Tuy nhiên, tự học như thế nào cho đúng, cách học nào là hiệu quả nhất đối với bạn? Trong bài viết này, chúng ta sẽ khám phá các phương pháp tự học lập trình tốt nhất dành cho người mới, giúp bạn tận dụng tối đa tiềm năng của mình và trở thành một lập trình viên tài giỏi.

Đọc sách dạy lập trình

Đọc sách là một phương pháp tự học quan trọng cho lập trình viên. Nó mang lại nhiều lợi ích, bao gồm tiếp cận kiến thức chuyên sâu về lập trình, mở rộng phạm vi kiến thức và cập nhật với công nghệ mới.

phương pháp tự học tốt nhất dành cho lập trình viên

Để tận dụng tối đa việc đọc sách, bạn có thể chọn những tựa sách phù hợp như “Clean Code” của Robert C. Martin để rèn kỹ năng viết mã sạch, “The Pragmatic Programmer” của Andrew Hunt và David Thomas để học cách suy nghĩ như một lập trình viên chuyên nghiệp, hoặc “Design Patterns: Elements of Reusable Object-Oriented Software” của Erich Gamma và đồng tác giả để hiểu về các mẫu thiết kế phần mềm.

Đọc sách là một công cụ mạnh mẽ để tiến bộ và phát triển trong lĩnh vực lập trình. Tham khảo bài viết này để lựa chọn các quyển sách phù hợp với bạn nhé: Sách hay nhất dành cho lập trình viên (2024).

Tham gia các khóa học, khóa đào tạo trực tuyến

Tham gia các khóa học và khóa đào tạo trực tuyến là một phương pháp tự học tốt nhất dành cho lập trình viên. Các khóa học này thường được thiết kế và giảng dạy bởi các chuyên gia trong lĩnh vực lập trình, đảm bảo rằng bạn nhận được kiến thức chất lượng và được hướng dẫn từ những người có kinh nghiệm.

Thêm nữa, khóa học trực tuyến mang lại linh hoạt về thời gian và không gian. Bạn có thể học theo lịch trình của mình và từ bất kỳ địa điểm nào có kết nối internet. Cuối cùng, có sự đa dạng về chủ đề và cấp độ của các khóa học trực tuyến. Bạn có thể chọn khóa học phù hợp với kiến thức và mục tiêu của mình, từ các khóa cơ bản đến nâng cao.

Tìm một người hướng dẫn

phương pháp tự học tốt nhất dành cho lập trình viên

Tìm một người hướng dẫn là một phương pháp tốt để tự học lập trình. Bạn có thể tìm người hướng dẫn mình bằng cách:

  • Tham gia cộng đồng lập trình: Tham gia các diễn đàn, nhóm trên mạng xã hội hoặc cộng đồng lập trình để tìm kiếm người hướng dẫn. Hỏi và chia sẻ với cộng đồng sẽ giúp bạn tìm được những người có kinh nghiệm và sẵn lòng giúp đỡ.
  • Tìm giảng viên trực tuyến: Có nhiều nền tảng trực tuyến như Codementor, MentorCruise, hay Wyzant cung cấp dịch vụ tìm người hướng dẫn. Bạn có thể tìm và thuê giảng viên với chuyên môn phù hợp với nhu cầu và mục tiêu học tập của bạn.
  • Networking: Tìm kiếm và tham gia các sự kiện, hội thảo, meetup về lập trình để mở rộng mạng lưới và kết nối với những người có kinh nghiệm trong lĩnh vực lập trình. Bạn có thể tìm được người hướng dẫn thông qua mối quan hệ và trao đổi kinh nghiệm.

Tham khảo code của lập trình viên khác

Tham khảo code của lập trình viên khác là một trong những phương pháp học hiệu quả và được rất nhiều lập trình viên sử dụng. Bạn có thể tìm thấy nhiều mã nguồn mở khác nhau trên web để nắm bắt thông tin chi tiết và nâng cao kiến ​​thức của mình. Một số nền tảng như GeeksforGeeks, GitHub và nhiều nguồn khác cung cấp một kho lưu trữ mã nguồn phong phú cho các ngôn ngữ lập trình khác nhau.

phương pháp tự học tốt nhất dành cho lập trình viên

Khi tham khảo code của người khác, đừng chỉ đọc mà hãy thực hiện việc kiểm tra và chạy thử code đó. Tự cấu trúc lại code và tìm ra các giải pháp sáng tạo để nâng cao khả năng giải quyết vấn đề của mình. Bạn cũng có thể tìm hiểu về phong cách viết code, các quy tắc đặt tên biến, cấu trúc dự án và các nguyên tắc lập trình từ các mã nguồn chất lượng.

Việc làm IT Fresher dành cho bạn

Xây dựng các dự án cá nhân

Xây dựng dự án cá nhân giúp bạn áp dụng kiến thức, rèn kỹ năng thực tế và tìm hiểu quy trình phát triển phần mềm. Nó cũng cho phép bạn thử nghiệm, sáng tạo và khám phá các khía cạnh mới trong lập trình. Bạn có thể bắt đầu từ việc nắm vững cơ bản, sau đó dần dần tăng cường độ phức tạp và quy mô dự án.

Không cần phải xây dựng những dự án quá phức tạp cho dự án đầu tiên của bạn. Thay vào đó, bạn có thể bắt đầu với những dự án nhỏ như trình soạn thảo văn bản, máy tính hoặc trò chơi như rắn/cờ vua. Từ đó, bạn có thể tiến tới các dự án phức tạp hơn, nâng cao khả năng lập trình của mình.

Tham gia các cộng đồng trong lĩnh vực IT

Tham gia các cộng đồng trong lĩnh vực Công nghệ thông tin (IT) là một trong những phương pháp tự học tốt nhất dành cho lập trình viên. Thông qua việc tham gia các cộng đồng này, bạn có cơ hội gặp gỡ và làm việc với các lập trình viên khác trên toàn thế giới, những người có thể giúp bạn phát triển trong sự nghiệp và nâng cao kỹ năng lập trình của mình.

phương pháp tự học tốt nhất dành cho lập trình viên
StackOverflow

Tham gia các cộng đồng lập trình mang lại cho bạn nhiều lợi ích, bao gồm cập nhật những xu hướng mới nhất trong ngành, nhận được giải đáp cho các câu hỏi và thắc mắc về coding, chia sẻ ý tưởng dự án và học hỏi từ kinh nghiệm của người khác. Các cộng đồng trực tuyến như Developers Forum, GitHub, Viblo, StackOverflow, Tinh tế, v.v. là những nơi tốt để bạn tham gia và tìm kiếm sự hỗ trợ và trao đổi kiến thức với cộng đồng lập trình viên.

Chơi các game code

Chơi các game code là một cách thú vị và hiệu quả để rèn kỹ năng lập trình. Đây là một trong những phương pháp học tập tương tác và thực hành được nhiều lập trình viên sử dụng. Bằng cách tham gia vào các game code, bạn có thể rèn kỹ năng giải quyết vấn đề, tăng cường logics và khám phá những khía cạnh mới của lập trình.

phương pháp tự học tốt nhất dành cho lập trình viên

Có nhiều game code phổ biến và thú vị mà bạn có thể thử, bao gồm “CodeCombat”, “Codingame”, “HackerRank” và “Project Euler”. Các game này đưa bạn vào những tình huống thực tế, yêu cầu bạn tìm ra giải pháp thông qua việc viết code. Bạn có thể cạnh tranh với các lập trình viên khác, giải các câu đố lập trình và nâng cao kỹ năng của mình.

Tổng kết

Tự học lập trình là một hành trình không chỉ đòi hỏi kiên nhẫn và nỗ lực, mà còn yêu cầu sự linh hoạt trong việc áp dụng các phương pháp học hiệu quả. Bài viết trên đã tổng hợp một số phương pháp tự học tốt nhất dành cho lập trình viên mà bạn có thể áp dụng.

Tuy nhiên, không có một phương pháp tự học duy nhất phù hợp với tất cả mọi người. Quan trọng là bạn phải tìm ra phương pháp hoặc kết hợp các phương pháp phù hợp với bản thân để tiến bộ và phát triển trong lĩnh vực lập trình. Hãy kiên nhẫn, kiên trì và luôn tìm cách học hỏi, nâng cao kỹ năng của mình. Với sự đam mê và nỗ lực, bạn có thể trở thành một lập trình viên giỏi và thành công trong sự nghiệp của mình.

Tổng hợp bởi TopDev

Bài viết liên quan

Kinh nghiệm đọc tài liệu để trở thành Developer giỏi

Bài viết được sự cho phép của tác giả Sơn Dương Trong thế giới công nghệ, bạn không thể tự mình nghiên cứu và tạo ra tất cả mọi thứ của riêng mình. Từ những ngày trên ghế nhà trường, bạn đã phải tự đọc giáo trình, tự tìm hiểu tất cả mọi thứ, thầy giáo chỉ là người định hướng cho bạn mà thôi. Để trở thành một developer giỏi, bạn phải luyện thành thục hai kỹ năng: Viết code và đọc tất cả mọi thứ. Trong đó đọc tài liệu là một kinh nghiệm rất quan trọng. Khi bạn đi làm, việc tự đọc tài liệu và tự tìm hiểu công nghệ mới lại càng trở nên quan trọng hơn bao giờ hết. Nếu bạn không biết cách tự đọc, tự tìm hiểu, bạn sẽ ngày càng trở nên lạc hậu và tụt lùi so với đồng nghiệp. Bài viết này, mình sẽ chia sẻ kinh nghiệm đọc [...]

Học lập trình cần học các kiến thức cơ bản nào?

Lập trình viên cần học những gì? Làm thế nào để trở thành một lập trình viên giỏi? Đây là câu hỏi mà những người bắt đầu học lập trình rất quan tâm. Tuy nhiên, đưa ra câu trả lời cho những câu hỏi này lại không hề đơn giản. Lập trình là một lĩnh vực rộng lớn, luôn thay đổi và phát triển liên tục, điều này khiến cho nhiều người mới bắt đầu học lập trình rất mông lung khi bước chân vào thế giới của công nghệ thông tin. Nếu bạn đang gặp phải vấn đề này và chưa biết bắt đầu từ đâu, thì bài viết này sẽ giúp cho bạn. Lập trình viên cần học những gì? Kiến thức về lập trình, chuyên môn kỹ thuật Công nghệ thông tin là một lĩnh vực rất đa dạng và phức tạp, tuy nhiên, để trở thành [...]

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

Giới thiệu Trong bài viết này, TopDev sẽ tổng hợp lại những cuốn sách học lập trình “phải đọc” cho lập trình viên. Đây là những cuốn sách cung cấp nhiều kiến thức mới, dù bạn học và làm việc với bất cứ ngôn ngữ nào. Hy vọng sau bài viết này, các bạn có thể chọn được vài cuốn sách để thêm vào tủ sách yêu thích của mình nhé. [irp posts="11566" name="Tuyển tập chuẩn “sách giáo khoa” Python"] [irp posts="3764" name="Những quy tắc khi đọc sách mà tỷ phú Bill Gates đặt ra cho chính mình và bạn cũng nên học theo"] Sách học lập trình bạn nhất định phải đọc Sách định hướng nghề nghiệp Định hướng nghề nghiệp chắc hẳn là điều bạn thường tìm kiếm trên mạng. Nhưng làm thế nào để biết được hướng đi trong nghề lập trình, trong khi trên mạng có quá nhiều lời [...]

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev

Amazon Appsync có gì hay ho?

Amazon Appsync có gì hay ho?

Trước khi bắt đầu, anh em cần hiểu AWS Appsync có sử dụng GraphQL. Nếu anh em nào chưa biết GraphQL là gì, khác biệt gì so với REST API thì anh em có thể tham khảo qua bài viết này.

Appsync

Lưu ý về mặt concept thì GraphQL khác hoàn toàn so với REST API thông thường nha anh em.

Sau khi đã nắm sơ bộ và hiểu thêm về GraphQL, anh em có thể thoải mái xúc ông AppSync này. Túm cái váy lại thì không có gì khó đâu. Nên cứ từ từ là dứt hết thôi anh em

Bắt đầu ngay thôi nào!

1. AWS Appsync là gì?

AWS Appsync sử dụng Graph Query Language như là một endpoint duy nhất thay thế cho REST API. Anh em frontend thay vì gửi request tới một số endpoint khác nhau để lấy dữ liệu, giờ đây có thể gọi tới một endpoint duy nhất.

Cần gì lấy đó, cần gì sửa đó, chính là điểm mạnh của GraphQL.

Mô hình này giảm độ phức tạp của các web application và nâng cao trải nghiệm cho enduser lúc họ truy cập trang web. Giảm thời gian tải trang web.

Appsync

AWS AppSync is a fully managed GraphQL API layer developed by Amazon Web Services. AppSync allows developers to build GraphQL APIs without much of the usual work; it handles the parsing and resolution of requests as well as connecting to other AWS services like AWS Lambda, NoSQL and SQL data stores, and HTTP APIs to gather backend data for the API. AWS AppSync là lớp quản lý GraphQL API được phát triển bởi Amazon Web Services. AppSync cho phép lập trình viên xây dựng GraphQL API mà không cần phải bỏ quá nhiều công sức, nó cũng giúp xử lý cú pháp, giải quyết các yêu cầu các AWS services như AWS Lambda, NoSQL và SQL data stores.

2. AppSync hoạt động như thế nào?

Về cơ bản AWS Appsync là một GraphQL proxy. Ở proxy này, nó nhận và xử lý tất cả GraphQL request. Proxy này sẽ xử lý tất cả các request được hỗ trợ bởi GraphQL.

Ví dụ như queries (để truy vấn dữ liệu), mutations (để thay đổi dữ liệu thông qua API) và subscriptions (dữ liệu realtime để streaming data thông qua API).

Appsync cũng cho phép developers định nghĩa và sử dụng schema của GraphQL API, thêm các function resolver cho từng request đã được định nghĩa.

Appsync

Vì nằm trong hệ sinh thái AWS nên phía sau GraphQL của Appsync có thể là:

    • Amazon DynamoDB tables
    • RDS databases
    • Amazon Elasticsearch domains
    • AWS Lambda functions

Các RDBMS này đóng vai trò như datasources, giúp GraphQL có thể trả về các truy vấn với dữ liệu chính xác.

  API là gì? Các nguyên tắc xây dựng Rest API
  Cơ bản về GraphQL trong Java

3. AppSync integrate với các AWS services khác như thế nào?

Do được phát triển bởi Amazon nên AppSync có thể dễ dàng tương tác với các services khác trong hệ sinh thái AWS. Một số ví dụ cụ thể có thể kể tới như:

    • AWS Lambda functions: GraphQL resolver có thể mapping với Lambda function.
    • DynamoDB tables: Lấy hoặc truy vẫn dữ liệu từ DynamoDB table sử dụng cho GraphQL API.
    • Amazon Elastic search domains: use an Elasticsearch domain có thể được xem như data source cho GraphQL queries.
    • AWS RDS: Kết nối tới SQL và NoSQL database instances available với RDS, và sử dụng databases and tables from that service như là data sources.

Appsync

AppSync cũng hỗ trợ một số cách để authentication:

    • AWS Cognito User Pools: dùng được authentication và authorization mechanism choGraphQL API trong AppSync.
    • AWS IAM: quản lý API access bằng cách tạo IAM users.
    • OpenID Connect: authenticate API users sử dụng OpenID identity service.

Xem thêm nhiều việc làm Java lương cao trên TopDev

4. Điểm mạnh của AppSync

Ngoài việc AppSync được hỗ trợ và phát triển với AWS, sử dụng AppSync còn có 3 ưu điểm chính sau đây. Còn có ý nào anh em cứ thoải mái bổ sung giúp nha.

Đầu tiên là kiểm soát GraphQL, với AWS tất nhiên thời gian tiết kiệm hơn nhiều

    • Fully managed GraphQL API layer: AppSync tự động tạo ra GraphQL resolver và kết nối với data source. Việc này giúp anh em tiết kiệm kha khá thời gian khi thiết lập mới API GraphQL

Appsync

Thứ hai là điểm mạnh tới từ chính GraphQL

    • Real-time subscriptions and offline functionality built in: Sử dụng AppSync cho phép sử dụng subscriptions GraphQL. Loại này thì keep connection alive, rất thích hợp cho anh em build những app sử dụng dữ liệu realtime thường xuyên. Kết hợp giữa AppSync và Amplify còn giúp anh em lưu trữ dữ liệu local, đồng bộ sau khi dữ liệu đã được chuyển lên.

Thứ ba là kết hợp với các AWS Services khác

    • Integrations with core AWS services: Do AppSync có tích hợp với AWS lambda, RDS và DynamoDB nên anh em sẽ không cần làm gì nhiều nếu muốn connect tới data source. Dành thời gian tập trung vào logic business, tránh mất thời gian vào một số thứ setup loằng ngoằng.

5. AppSync một số điểm hạn chế

Tuy tốt nhưng AppSync cũng tồn tại một số nhược điểm, theo như mặc định thì mỗi tài khoản AWS có giới hạn 25API GraphQL với App Sync. Số lượng truy vấn bị giới hạn ở mức 1000 truy vấn/s cho mỗi API.

Để tăng những con số này, anh em có thể gửi ticket yêu cầu lên AWS. Nhưng một số cái không thể tăng, anh em lưu ý check lại những điểm này xem có phù hợp với ứng dụng của mình hay không?

    • The maximum number of API keys per GraphQL API is fixed at 50. (Maximum API key cho mỗi GraphQL là 50)
    • The maximum schema document size is 1MB (maximum schema size là 1MB, nếu anh em có schema quá to nên cân nhắc)
    • The maximum GraphQL query execution timeout is 30 seconds (query thực hiện maximum là 30s, không thể config, nếu backend xử lý loằng ngoằng hơn 30s thì anh em cẩn thận chỗ này)

https://www.youtube.com/watch?v=1FGDM3MrF64

3 mục này là 3 mục hạn chế của AppSync anh em cần lưu ý, kiểm tra kĩ và check lai một lần nữa với business application mình định làm trước khi quyết định sử dụng GraphQL với AppSync

6. Ai và lúc nào nên sử dụng AppSync

Do App Sync tập trung vào sử dụng GraphQL, nên các ứng dụng trước đó đã tiếp cận hoặc sử dụng với GraphQL sẽ có khả năng tích hợp nhanh và dễ dàng hơn.

Với GraphQL thì anh em biết rồi, nếu team FE quyết định chọn, vậy công việc sẽ nhẹ gánh phần nào cho team BE. Tuy nhiên cần cân nhắc trình độ và khả năng thay đổi từ REST sang GraphQL của team.

Một yếu tố nữa cần quan tâm là mô hình business, nếu business của anh em nhỏ, cứ quẩy với REST. Nhưng nếu anh em muốn xây một application có khả năng chịu tải tốt, sử dụng dữ liệu realtime thường xuyên. Mạnh dạn quẩy xúc với GraphQL và AppSync

Ngoài ra nếu các thành phần khác như BE, Gateway, Security, Authen, Autho của anh em đã go với AWS, tất nhiên AppSync là một lựa chọn tốt. Tuy nhiên nếu datasource nằm ở Azure mà GraphQL lại AppSync thì hơi cực. Cái này anh em cũng có thể lưu tâm

7. Giá cả của AWS App Sync

Nếu anh em dùng miễn phí, AWS cho phép có 250.000 queries GraphQL hoặc mutations. Kèm theo đó là 250.000 data updates.

Về thời gian kết nối thì anh em có 600,000 phút kết nối trong 12 tháng sau khi tài khoản AWS được tạo. Ngoài bậc miễn phí thì anh em trả tiền theo bảng dưới đây.

Appsync

Yếu tốt Giá
 Queries and data modification requests  $4.00 / 1 million
 Data transfer for API responses  $0.09 / GB (decreases with higher data volume)
 Real-time updates  $2.00 / 1 million
 Connection-minutes  $0.08 / 1 million

Giá cả cũng là một yếu tố quan trọng anh em cần lưu tâm ha.

‍8. Tham khảo thêm về AppSync

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

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

Bài viết liên quan

Test REST Web Service đơn giản hơn với REST Assured

Bài viết được sự cho phép của tác giả Giang Phan  Ở bài viết trước, tôi đã giới thiệu với các bạn cách test REST API trong Jersey project. Giả sử bây giờ chúng ta cần sử dụng API của bên thứ 3 (không phải source code trong jersey project của chúng ta), khi đó ta không thể sử dụng Jersey Test. Khi đó, chúng ta cần một thư viện khác có thể giúp chúng ta gửi một request thật để verfiy kết quả trả về. Trong bài này tôi sẽ giới thiệu với các bạn một thư viện rất mạnh mẽ để test web service, đó chính là REST Assured. Nó cho phép chúng ta gửi một HTTP request thật và verify trên kết quả trả về một cách dễ dàng. Chẳng hạn chúng ta có một request http://localhost:8080/lotto/{id} và server trả về response JSON như sau: [caption id="attachment_52759" align="aligncenter" width="335"] Test REST Web Service[/caption] Khi đó chúng ta dễ dàng sử dụng REST Assured để verify mọi thứ từ response trên như sau: [caption id="attachment_52758" align="aligncenter" width="560"] Test REST Web [...]

Type Query trong GraphQL với Spring Boot

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh Trong bài viết trước, mình đã giới thiệu với các bạn về GraphQL, những vấn đề mà GraphQL đã giải quyết được cho những hạn chế của RESTful Web Service. Mình cũng đã hướng dẫn  sơ qua cho các bạn về cách hiện thực type Query của GraphQL với Spring Boot. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết hơn về cách hiện thực type Query này sử dụng Spring Boot các bạn nhé! Đầu tiên, mình sẽ tạo một Spring Boot project với Web và GraphQL Starter để làm ví dụ: Kết quả: Như mình đã nói trong bài viết trước, để làm việc với GraphQL, chúng ta cần định nghĩa các tập tin schema .graphqls. Mặc định thì Spring Boot sẽ scan tất cả các thư mục trong classpath src/main/resources của project để đọc các tập tin schema này. Mình sẽ tạo một thư mục tên là graphql trong thư mục src/main/resources và để cá [...]

REST Web service: Tạo ứng dụng Java RESTful Client với Jersey Client 2.x

Bài viết được sự cho phép của tác giả Giang Phan Trong bài trước chúng ta đã cùng tìm hiểu cách xây dựng ứng dụng Java Restful web service với Jersey 1.x. Trong bài này, chúng ta sẽ cùng tìm hiểu cách tạo ra ứng dụng Java Restful web service với Jersey 2.x và ứng dụng Java RESTful Client sử dụng Jersey Client API để gọi tới RESTful web service. [irp posts="32819" name="4 tips học Java cơ bản nhanh nhất dành cho Beginner Developer"] [irp posts="4178" name="5 cách chia một mảng lớn thành nhiều mảng nhỏ trong Javascript"] Xem thêm tuyển dụng Java hấp dẫn trên TopDev 1. Tạo Jersey project Trong bài trước chúng ta đã tạo Restful web service sử dụng Jersey version 1.x. Trong bài này, chúng ta sẽ tạo Jersey project với version 2.x. Jersey 1.x : các thư viện nằm trong package com.sun. Jersey 2.x : các thư viện nằm trong package org.glassfish. Vào Menu File -> New -> Dynamic Web Project -> Finish. Nhấn chuột phải lên project vừa tạo -> Configure -& [...]

Ứng tuyển ngay việc làm IT lương cao trên TopDev!

5 lỗi phổ biến thường gặp khi lập trình Android

5 lỗi phổ biến thường gặp khi lập trình Android

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

Tại sao bạn nên biết những lỗi thường gặp khi lập trình android để tránh nó kịp thời? Rất nhiều chuyên gia ở các lĩnh vực khác nhau (kể cả chuyên gia phát triển Android) đều cho rằng:

Khi nỗ lực làm điều gì đó, quan trọng nhất là chúng ta phải hiểu thứ chúng ta đang làm là gì. Nhưng quan trọng không kém là việc chúng ta cần biết những điều cấm kị cần phải tránh – bằng mọi giá.

Những bài đăng của mình từ trước tới nay thường nói về cách phát triển một ứng dụng, một task vụ cụ thể nào đó trên Android.

Tuy nhiên, mình vẫn cảm thấy có gì đó thiếu sót khi không nhắc đến những sai lầm mà rất nhiều các bạn developer mắc phải.

5 lỗi thường gặp khi lập trình Android nên tráng

Bài viết này mình sẽ liệt kê 5 lỗi thường gặp nhất mà mình nghĩ các bạn Android developer nên tránh.

#1. Không sử dụng strings.xml

Điều này sẽ làm giảm trải nghiệm quốc tế hóa của ứng dụng. Vì bạn sẽ phải tự thiết kế phiên bản hiển thị chính xác của message dựa trên ngôn ngữ của người dùng.

Nếu như các String được đặt trong file strings.xml, chúng có thể dễ dàng được dịch và tích hợp vào ứng dụng.

Điều tuyệt vời là Android sẽ căn cứ vào thiết lập ngôn ngữ hệ thống để tự động chuyển sang file string.xml đúng với ngôn ngữ đó.

Những lý do biện minh cho việc bạn không dùng string-resources?

Dưới đây là một số lý do mà các bạn phát triển Android đưa ra để “viện cớ” không dùng string-resources:

Lý do 1: “Tôi chỉ dùng nó mỗi ở đây thôi”

Bây giờ thì bạn nghĩ thế, nhưng ai biết trước đươc tương lai. Sau này, bạn cần phải sử dụng lại String đó ở một nơi khác thì sao? Bạn có có chắc chắn là chỉ sử dụng ở mỗi đó thôi không?

Vì vậy, bạn nên đầu tư thêm một phút để sau này có thể dễ dàng tái sử dụng.

Lý do 2: String phức tạp và cần cập nhật liên tục

Đừng lo! Android đã hỗ trợ sẵn cho bạn có thể làm được điều đó trong String.xml file. Bạn hoàn toàn có thể cập nhật String thông qua các tham số truyền vào String. Ví dụ:

<string name="timeFormat">%1$d minutes ago</string>

Tham khảo tài liệu official của chính chủ Google tại đây.

Lý do 3: “Ứng dụng của tôi chỉ hỗ trợ một ngôn ngữ”

Thông thường, với các nhà phát triển độc lập (nhà phát triển phần mềm không phải là công ty) thường chỉ có kế hoạch cho một thị trường nào đó hoặc một ngôn ngữ nào đó, để giảm chi phí.

Nhưng hãy nghĩ lớn một chút, với thị trường rộng lớn ngoài kia. Khi ứng dụng phát triển, việc chuyển ứng dụng sang hỗ trợ thị trường mới sẽ đỡ tốn kém hơn rất nhiều nếu bạn sử dụng String.xml.

  Sử dụng Sqlite trong Android như thế nào hiệu quả nhất?

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

#2. Không sử dụng data-binding

Bạn có hay sử dụng hàm findViewById để tạo reference đến các View không?

Ngoài ra, trong trường hợp chúng ta cũng cần giữ view-id để đảm bảo chúng ta đang sử dụng đúng view-id nào trong findViewById.

Tất nhiên, việc này thì Android Studio có thể hỗ trợ bạn tự động, nhưng chỉ những view-id nào có sẵn trong cùng layout-tree thì mới được tìm thấy bằng findViewById. Những thứ không tồn tại sẽ trả về null (có thể gây ra một NullPointerException).

Google đã có giải pháp để tích hợp data-binding vào bất kỳ ứng dụng (mới hoặc dự án cũ) và loại bỏ tất cả view-reference mà bạn đã viết trước đó.

Một vài lợi ích của việc sử dụng data-binding :

  • Chỉ references đến những view có sẵn (điều này sẽ giúp bạn tránh được lỗi NullPointerException khi cố reference đến một view không tồn tại).
  • Có hiệu năng tốt hơn so với việc sử dụng findViewById. Bởi data-binding sẽ duyệt toàn bộ layout-tree một lần thay vì luôn duyệt layout-tree khi hàm findViewById được gọi.
  • Namespace của bạn (hay nói cách khác là các Class/Function) vẫn “clean”, và bạn không phải giữ reference đến tất cả các views.

Ngoài ra, bạn sẽ có thêm một số tính năng hay ho trong data-binding không chỉ có mỗi loại bỏ findViewById. Như ở bài viết này tác giả George Mount đã viết một Adapter cho tất cả các RecyclerView – quá kinh!

Tham khảo việc làm Android Developer Hồ Chí Minh tại TopDev

#3. Không ẩn API keys khi sử dụng Git

sai lầm trong phát triển Android

Đây là lỗi khá phổ biến và chủ yếu là do các bạn developer còn ít kinh nghiệm chưa chú ý.

Với dự án được quản lý bằng SVN hay Git, khi bạn đã từng commit một version lên server thì nó sẽ tồn tại trên đó mãi.

Người ta có thể tra lại lịch sử commit và mò ra API key đó, kể cả bạn đã xóa cái API key trong một commit sau đó.

Bạn có thể xem bài viết này để tìm hiểu cách ẩn API key khỏi repository trong khi vẫn sử dụng chúng trong quá trình build test ứng dụng mà chúng vẫn available trong source code của bạn.

#4. Không xử lý hết các trạng thái vòng đời của Activity

Tất cả các cấu hình (configuration) hay logic của Activty hiện tại sẽ bị mất khi Activity bị destroyed hay re-created.

Để đảm bảo rằng quá trình transition liền mạch, chúng ta cần lưu trữ trạng thái của ứng dụng trước khi thay đổi configuration.

Sau đó, chúng ta có thể tái tạo lại trạng thái của ứng dụng thông qua các hàm onSaveInstanceState/ onRestoreInstanceState.

Đừng để ứng dụng crash hay restart lại chỉ vì người dùng xoay ngang màn hình điện thoại nhé

#5. Không tìm hiểu các phím tắt trong Android Studio

Điều này có thể không phản ánh chất lượng đoạn mã bạn viết. Nhưng nó ảnh hưởng đến tổng quan công việc của bạn.

Android Studio được xây dựng dựa trên IntelliJ Idea (một IDE nổi tiếng về tính thân thiện với bàn phím). Điều này có nghĩa rằng, năng suất của developer có thể tăng lên bằng cách rất đơn giản. Đó là đầu tư một chút thời gian vào việc học các phím tắt.

Dưới đây là một số tài nguyên giúp bạn học/thực hành các phím tắt trên Android Studio:

  • KeyPromoter: Đây là một plugin có sẵn trong Android Studio. Nó sẽ hiển thị một hộp thoại hiển thị các lệnh phím tắt cho hành động bạn vừa thực hiện.

Hãy tin mình đi, điều này sẽ làm bạn khó chịu và bạn buộc phải học những lối tắt đó. Bạn có thể tìm và tải xuống trong Android Studio settings.

  • Cheat-sheet : Các bạn có thể download về và in ra cho dễ tra cứu. Đây là bản tổng hợp tất cả các phím tắt của Android Studio cho cả 2 nền tảng Window, MacOS.
  • Hướng dẫn chính thức từ Jetbrains – Đây là hướng dẫn chính thức được cung cấp bởi Jetbrains giúp làm chủ các phím tắt.

#Tạm kết

Đây là 5 lỗi thường gặp khi lập trình Android mà bạn nên hạn chế mắc phải. Đừng để những sai lầm làm hỏng cả dự án.

Nếu bạn có bất kỳ đề xuất hoặc bất kỳ chủ đề nào khác, hãy comment bên dưới nhé. Đừng ngại

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

Bài viết liên quan

Debug trong Android Studio – Đây là kỹ năng cần phải giỏi

Bài viết được sự cho phép của tác giả Sơn Dương Sau khi bạn đã hoàn thành việc cài đặt máy ảo Android và biết cách kết nối điện thoại tới PC. Hãy khoan nghĩ tới việc bắt tay vào lập trình luôn. Cũng như các ngôn ngữ lập trình khác, hay bất kể ai lập trình cũng đều phải biết cách debug. Debug ứng dụng là một kỹ năng rất quan trọng cho mọi lập trình viên. Đó là lý do mình trình bày về cách debug trong android studio trước khi bắt tay vào học code ứng dụng. Nội dung bài viết gồm có: Hướng dẫn sử dụng Android Studio Debugger Tìm hiểu Breakpoit là gì và cách sử dụng nó để debug trong Android Studio Và một số thủ thuật “đắt giá” khi debug trong Android Studio Chúng ta bắt đầu nhé #1. Cách sử dụng công cụ Android Studio Debugger Công cụ Android Studio Debugger cho phép ta theo dõi ứng dụng theo thời gian thực. Ngoà [...]

Cách Thiết Lập Máy Ảo, Máy Thật & Khởi Chạy Ứng Dụng Trong Android

Bài viết được sự cho phép của tác giả Nhựt Danh Chà chà… Mình biết khi các bạn đọc đến bài học này, chắc hẳn các bạn đều rất muốn được nhìn thấy diện mạo của ứng dụng khi thực thi (khởi chạy trên thiết bị) sẽ trông như thế nào đúng không. Chưa cần biết nhiều về kiến thức Android, tại đây, khi đã đọc qua và thực hiện các thao tác cài đặt theo các bài học trước, hôm nay bạn đã có thể chạy ứng dụng được rồi, thậm chí bạn có thể mang ứng dụng này để cài đặt lên các thiết bị khác để lòe bạn bè nữa đấy. Vậy làm thế nào? Trước hết chúng ta điểm qua các cách thiết lập máy ảo và máy thật ở các bước sau. Như vậy cho dù bạn đã có hay chưa có trong tay một thiết bị Android (điện thoại hoặc máy tính bảng đều được), thì vớ [...]

Tổng Hợp Các Tip Khi Sử Dụng Android Studio

Bài viết được sự cho phép của tác giả Nhựt Danh Chắc các bạn có để ý thấy, là mỗi khi khởi chạy Android Studio lên, sẽ có một popup nhỏ với tiêu đề là Tip of the Day. Popup này xuất hiện hoài cho đến khi bạn bỏ chọn Show Tips on Startup thì thôi. Mình đồng ý với bạn là popup này cực kỳ hữu ích, nhưng không phải lúc nào chúng ta cũng đều dừng lại đọc và ghi nhớ tốt mỗi khi popup này hiện lên. Đã có lúc mình note các tip này lại ở đâu đó, nhưng rồi cũng bỏ mất. Chính vì vậy hôm nay mình quyết định một lần nữa tổng hợp tất cả chúng lại vào một bài viết, và mình cũng sẽ lọc ra các tip gần gũi và có thể được sử dụng nhiều nhất với mình và các bạn. Hi vọng bài viết hôm nay sẽ là trợ thủ đắc lực trong công việc lậ [...]

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

Top 5 câu hỏi phỏng vấn Big Data Engineer hay gặp nhất 2024

Top 5 câu hỏi phỏng vấn Big Data Engineer hay gặp nhất

Phỏng vấn Big Data Engineer liệu có khó? Có phải Big là luôn đặt ra những câu hỏi hóc búa dành cho ứng viên phỏng vấn Big Data Engineer?

Câu trả lời là không, bất kì vị trí nào cũng có các topics cần và sẽ hỏi qua. Đơn cử như Big data engineer thì đó sẽ là các câu hỏi liên quan tới kỹ năng, khả năng xử lý dữ liệu.

Ngoài ra các công cụ thường được sử dụng cũng sẽ là câu hỏi đáng lưu tâm khi phỏng vấn vị trí này.

phỏng vấn Big Data Engineer

Chi tiết mời anh em cùng tìm hiểu qua 5 câu hỏi dưới đây. Bắt đầu ngay thôi nào!

1. Làm việc với dữ liệu, bạn xử lý duplicate data như thế nào?

Câu hỏi đầu tiên phỏng vấn Big Data Engineer đề cập tới SQL. Đã là làm việc với dữ liệu tất nhiên sẽ làm việc với dữ liệu được lưu ở các RDBMS.

Làm việc với RDBMS tất nhiên sẽ biết tới SQL, một trong những hiểu biết cơ bản để làm việc với dữ liệu. Câu hỏi này được đánh giá là câu hỏi dễ do chỉ xử lý dữ liệu trùng lặp.

phỏng vấn Big Data Engineer

Trả lời cho câu hỏi này, có nhiều cách để xử lý trùng lặp dữ liệu. Bao gồm sử dụng một số từ khoá phổ biến trong SQL. Một số keywords phổ biến bao gồm DISTINCT và UNIQUE.

Ngoài ra một số loại dữ liệu có thể sử dụng GROUP BY để loại bỏ trùng lặp.

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

    • Sự khác biệt giữa tuples và list là gì?
    • *args và *kwargs là gì?. Sự khác biệt?
    • Distributed file system là gì?

2. Những frameworks và ngôn ngữ nào thường được sử dụng bởi Big Data Engineer

Khởi động với câu hỏi dễ dàng đầu tiên phỏng vấn Big Data Engineer. Thông thường các kỹ sư dữ liệu lớn sẽ làm việc với một số frameworks, tools và ngôn ngữ lập trình nhất định.

Thường trong giới big data có các tools, framework của riêng mình để làm việc với dữ liệu lớn. Việc sử dụng thành thạo các công cụ cũng đồng nghĩa với việc ứng viên có khả năng có nhiều kinh nghiệm làm việc trong dự án thực tế.

phỏng vấn Big Data Engineer

Đối với câu hỏi này, anh em có thể liệt kê 3 công cụ chính thường được sử dụng bởi Big Data Engineer bao gồm:

    • Hadoop

Ngoài ra, dựa theo kinh nghiệm thực tế, anh em có thể bổ sung một số công cụ sau:

    • ElasticSearch

Ngoài ra, cần đi sâu các trường hợp cụ thể sử dụng, ví dụ Postgres, nếu thường xuyên làm việc với geospatial, anh em có thể nêu ra những cái tên cụ thể như PostGIS.

  Một số lầm tưởng về big data của software engineer
  Google Cloud hướng tới hỗ trợ tất cả dữ liệu phi cấu trúc

3. Sự khác biệt giữa dữ liệu có cấu trúc và dữ liệu không có cấu trúc

Câu hỏi phỏng vấn Big Data Engineer thứ hai liên quan tới data. Đã là kỹ sư dữ liệu tất nhiên sẽ làm việc nhiều với dữ liệu. Vậy sự khác biệt giữa dữ liệu có cấu trúc (structured data) và dữ liệu không có cấu trúc (unstructured data) là gì?

Để trả lời cho câu hỏi này, anh em có thể nêu ra một số sự khác biệt chính giữa hai loại dữ liệu này bao gồm:

    • Dữ liệu có cấu trúc (structured data) yêu cầu công cụ tích hợp ELT và được lưu trữ vào DBMS (hệ thống quản lý cơ sở dữ liệu) hoặc dữ liệu dạng bảng.
    • Dữ liệu phi cấu trúc (unstructured data) có hướng tiếp cận khác với dữ liệu, space (không gian) lưu trữ thường nhiều hơn so với dữ liệu cấu trúc
    • Ngoài ra dữ liệu phi cấu trúc (unstructured) thường khó để mở rộng, trong khi dữ liệu có cấu trúc thường dễ mở rộng hơn.

phỏng vấn Big Data Engineer

Anh em có thể chuẩn bị thêm hoặc ôn lại các câu hỏi sau:

    • Bạn định nghĩa big data như thế nào? (hoặc như thế nào là big data).
    • Data modeling là gì?
    • Những softskill nào là quan trọng đối với Big Data Engineer…

4. Bạn deploy giải pháp big data như thế nào?

Câu hỏi thứ 4 phỏng vấn Big Data Engineer đề cập tới quy trình khi đã có giải pháp xử lý dữ liệu lớn. Về cơ bản câu hỏi này đánh vào kinh nghiệm thực tế làm việc trong các dự án.

Có 3 bước cơ bản để deploy big data solutions, tuy nhiên anh em có thể thoải mái nêu thêm các bước bổ sung như kiểm tra dữ liệu, chuẩn bị dữ liệu,…

Ngoài ra ở các bước, anh em còn có thể nêu kinh nghiệm thực tế của bản thân mình, càng cụ thể thì càng tốt. Quay lại với 3 bước deploy:

    • Ingest and extract the data from each source, such as Oracle or MySQL (nhập và trích xuất dữ liệu từ các nguồn khác nhau, ví dụ như Oracle hoặc MySQL.
    • Store the data in HDFS or HBase (lưu trữ dữ liệu trong HDFS hoặc HBase)
    • Process the data by using a framework such as Hive or Spark (xử lý dữ liệu bằng các framework như Hive hoặc Spark)

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

    • Core feature của Hadoop là gì?
    • Giải thích FSCK (file system check)?
    • Collection data types nào Hive hỗ trợ (Map, Struct, Array)

5. Những library nào thường sử dụng trong Python để xử lý dữ liệu

Câu hỏi cuối cùng phỏng vấn Big Data Engineer liên quan tới các thư viện thường được sử dụng để xử lý dữ liệu.

Cái này thì tuỳ kinh nghiệm làm việc anh em có thể nêu ra các thư viện mình thường sử dụng. Ngoài ra cũng có thể nói thêm các điểm mạnh, điểm yếu. Những bất cập có thể xảy ra trong quá trình sử dụng các library này.

phỏng vấn Big Data Engineer

Danh sách một số library anh em có thể liệt kê ra. Cũng có thể chia nhóm library theo từng mục đích sử dụng.

    • SciKit-Learn
    • NumPy
    • Pandas

Anh em cũng có thể chuẩn bị thêm các câu hỏi sau:

    • File permission trong Hadoop là gì?
    • Nếu chỉ có 1 file duy nhất, có thể tạo nhiều bảng cho 1 file dữ liệu đó không?
    • Big data trên cloud có gì đặc biệt? Điểm mạnh, điểm yếu như thế nào?

6. Tham khảo thêm phỏng vấn Big Data Engineer

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

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

Bài viết liên quan

Big Data có thật sự “toàn năng” và các cơ hội nghề nghiệp trong tương lai?

Về diễn giả Anh Cảnh Trần (Calvin Canh Tran) hiện đang Senior Data Engineer tại Grab Finance Group (Singapore) Anh tốt nghiệp đại học ở Việt Nam và có khoảng thời gian 1 năm làm việc với tư cách là PHP developer. Sau đó sang Singapore để học thạc sĩ về Data Science. Sau khi tốt nghiệp thạc sĩ, anh là việc ở vị trí Data Scientist được khoảng 2.5 năm. Về sau nhận ra bản thân không hợp với công việc đó nên chuyển sang làm Data Engineer. Đến hiện tại anh đã làm việc ở vị trí Data Scientist đã được 4 năm. Sự chuyển giao giữa các vị trí công việc có gây ra khó khăn nào cho anh không? Thật sự là có khó khăn, như lúc đầu phỏng vấn làm Data Engineer mình không đạt nhiều lần. Sau khi chuyển qua lĩnh vực này mình phải học thêm rất nhiều và hầu hết là tự học vì 2 lĩnh vực này thật sự rất khác nhau, mình phải mất khá nhiều thời gian để trở [...]

Khám phá Quy trình tuyển dụng Data Engineer

Đọc bài viết dưới đây của TopDev từ kinh nghiệm của anh Calvin Cảnh Trần - Senior Data Engineer tại Grab, để hiểu rõ hơn về Quy trình và kinh nghiệm phỏng vấn Data Engineer cập nhật mới nhất trong năm 2020.  Data Engineer (Kỹ sư dữ liệu) hiện đang là ngành phát triển và nhận được sự quan tâm lớn. Nhiều cơ hội bắt đầu mở ra cho các ứng viên theo đuổi ngành nghề này. Và để có sự chuẩn bị tốt nhất, bạn cần nắm bắt rõ quy trình tuyển dụng của vị trí này. Cùng TopDev khám phá ngày những điều thú vị xoay quanh cuộc tuyển chọn cho vị trí Data Engineer nhé! Những hiểu biết cơ bản về Data Engineer Kỹ sư dữ liệu (Data Engineer) là người phát triển, xây dựng, kiểm tra và duy trì kiến trúc. Đồng thời, họ cũng là người đề xuất và đôi khi đảm nhậm việc cải thiện chất lượng dữ liệu. Để hoàn thiện và phát triển [...]

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?

Bài viết được sự cho phép của tác giả Kiên Nguyễn Chào các bạn, chúng ta đều biết rằng việc học lập trình vốn không phải là dễ dàng và không phải ai cũng có đủ kiên trì để học và học tốt được. Với các bạn sinh viên học lập trình nói riêng và những người học lập trình nói chung thì chắc hẳn đều đã nghe đến khái niệm “Cấu trúc dữ liệu và giải thuật”. Và chúng ta cũng được khuyên là nên học, nên tìm hiểu về những kiến thức này. Vậy tại sao lập trình viên lại nên học cấu trúc dữ liệu và giải thuật thì mình sẽ cùng các bạn điểm qua một vài lý do trong bài viết này. [irp posts="34918" name="Seminar môn Cấu trúc dữ liệu và giải thuật"] [irp posts="6697" name="12 Thư viện JavaScript trực quan hoá dữ liệu hot nhất năm 2019"] #1. Đó là kiế [...]

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

Worker threads là gì? Bạn đã biết khi nào thì sử dụng Worker threads trong node.js chưa?

Worker threads là gì? Sử dụng Worker threads trong node.js

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Worker threads được giới thiệu lần đầu tiên từ phiên bản node.js 10.5, tại thời điểm đó API của nó vẫn đang còn trong giai đoạn thử nghiệm trước khi chính thức nhận được bản phát hành ổn định ở phiên bản 12LTS.

Worker threads cung cấp một giải pháp giúp chạy mã Javascript trên một luồng khác song song với luồng chính. Vậy cụ thể điều này là như thế nào và nó mang lại lợi ích gì thì xin mời các bạn đọc tiếp bài viết dưới đây.

Các tác vụ đòi hỏi nhiều CPU

Có thể bạn đã biết node.js xử lý các tác vụ I/O không đồng bộ rất tốt. Nói đến I/O ở đây người ta thường liên tưởng đến những công việc liên quan đến đọc/ghi dữ liệu vào file, hay các request http…

Còn với những công việc đồng bộ chẳng hạn như những phép tính phức tạp trong một tập dữ liệu rất lớn, điều đó sẽ gây ra một cuộc tắc nghẽn nghiêm trọng ở trong luồng chính.

Tưởng tượng nếu một phép tính đồng bộ mất 10 giây để xử lý, điều đó có nghĩa là luồng chính sẽ bị chặn trong 10 giây để xử lý yêu cầu đó trước khi nó có thể xử lý những yêu cầu tiếp theo và điều đó thật là tai hại bởi vì không một ai muốn một tốc độ phản hồi của máy chủ như vậy cả.

Một ví dụ kinh điển cho những phép tính như vậy là dãy Fibonacci. Theo định nghĩa Fibonacci là một dãy vô hạn các số tự nhiên bắt đầu bằng 0 và 1, các phần tử sau đó được thiết lập theo quy tắc mỗi phần tử luôn bằng tổng hai phần tử trước nó. Một hàm Fibonacci trong Javascript có thể được viết như sau:

const fibonacci = (n) => {
  var i;
  var fib = [];

  fib[0] = 0;
  fib[1] = 1;
  for (i = 2; i <= n; i++) {
    fib[i] = fib[i - 2] + fib[i - 1];
  }
  return fib;
}

Sau đó hãy thử gọi hàm fibonacci(999999), luồng chính của bạn có thể sẽ mất hơn một giây để tính toán kết quả đó.

Woker threads là gì?

Worker threads là một module trong node.js cho phép chạy mã Javascript song song với luồng chính. Mỗi worker được chạy độc lập với nhau, tuy nhiên chúng có thể giao tiếp với nhau thông qua postMessage(). Để tìm hiểu kỹ hơn, các bạn có thể xem tài liệu đầy đủ về Worker threads ở Worker threads.

  Nguyên lý SOLID trong Node.js với TypeScript

  Shipit – Tự động deploy Javascript project

Tại sao lại cần Worker threads?

Như đã trình bày ở đầu bài viết, chúng ta có thể cần đến Worker threads để xử lý những trường hợp tính toán dữ liệu lớn hoặc phức tạp để tránh việc chặn luồng chính.

Luồng chính sẽ gửi yêu cầu đến một worker yêu cầu nó thực hiện các mã Javascript. Sau khi hoàn thành, worker sẽ thông báo đến cho luồng chính biết bằng cách gọi hàm postMessage(). Luồng chính nhận dữ liệu từ worker rồi tiếp tục xử lý yêu cầu đó.

Chúng ta có thể thấy vì mã Javascript xử lý dữ liệu phức tạp không chạy ở trong luồng chính nữa cho nên các yêu cầu tiếp theo vẫn được xử lý như bình thường mà hoàn toàn không bị chặn.

Xem thêm việc làm Node.js developer hấp dẫn nhất tại TopDev

Chi phí (cost) tạo một worker

Cho những ai chưa biết trước khi có Worker threads từ version 10.15, chúng ta đã có một số cách triển khai khác để chạy mã Javascript trên một luồng khác đó là Cluster và Child Process.

Cluster tận dụng tối đa số luồng của CPU để triển khai tối đa số luồng chính vì mặc định khi triển khai một dự án node.js nó chỉ chạy trên một luồng. Bằng cách dùng Cluster nếu máy chủ của chúng ta có 4 nhân 8 luồng thì số luồng chính tối đa được tạo ra là 8 – bằng với số luồng của CPU. Lúc này các yêu cầu đến sẽ được phân chia luân phiên nhau theo một giải thuật nào đó ví dụ như round-robin…
Nhìn chúng, Cluster là một giải pháp tận dụng số luồng của CPU để thêm một số lượng luồng chính khác.

Child Process là một giải pháp khác với Cluster. Bằng cách tạo ra một process riêng biệt với triển khai đầy đủ của một event loop + một main thread cho nên điều này gây ra một yêu cầu tài nguyên lớn cho mỗi process được tạo ra. Mặt khác, vì mỗi process là độc lập về bộ nhớ cho nên việc giao tiếp giữa các process tương đối phức tạp.

Worker threads được sinh ra để giải quyết bài toán về chi phí tài nguyên sử dụng của Child Process. Thay vì tạo một process mới, worker threads tạo ra một thread mới trong chính process của ứng dụng đang chạy. Điều này giúp giảm thiểu tài nguyên, vì tài nguyên để tạo một thread là nhỏ hơn so với process. Mặc khác các thread có tài nguyên sử dụng chung nên việc giao tiếp giữa chúng tương đối dễ dàng.

Để dễ hình dung, bạn có thể tham khảo sơ đồ so sánh về Child Process và Worker threads:

Tuy nhiên, cả hai cách triển khai Child Process và Worker threads đều tốn kém về mặt tài nguyên của hệ thống vì thế hãy cân nhắc việc tạo ra quá nhiều chúng khi sử dụng.

Sử dụng Worker threads như thế nào?

Tài liệu của node.js có đề cập đến cách triển khai đơn giản một worker, các bạn có thể xem tại Worker threads.

Trong bài viết này tôi sẽ lấy ví dụ cách triển khai đơn giản một worker thực hiện việc tính toán fibonacci trong một thread khác.

Đầu tiên hãy tạo một file main.js:

const { Worker } = require('worker_threads');

const runService = (workerData) => {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./worker.js', { workerData });

    worker.on('message', resolve);
    worker.on('error', reject);
    worker.on('exit', (code) => {
      if (code !== 0)
        reject(new Error(`stopped with  ${code} exit code`));
    });
  })
}

const run = async () => {
  const result = await runService(999999);
  console.log(result);
}

run().catch(console.log);

Tiếp theo tạo file worker.js:

const { parentPort, workerData } = require('worker_threads');

const fibonacci = (n) => {
  var i;
  var fib = [];

  fib[0] = 0;
  fib[1] = 1;
  for (i = 2; i <= n; i++) {
    fib[i] = fib[i - 2] + fib[i - 1];
  }

  parentPort.postMessage(fib);
}

fibonacci(workerData);

Sau đó hãy chạy thử main.js bạn sẽ thấy kết quả của dãy Fibonacci trong giây lát.

Để giải thích đoạn mã này, khi trong main gọi một new Worker nó sẽ tạo ra một worker là những mã có trong file worker.js. new Worker nhận vào tham số thứ hai là workerData để truyền dữ liệu từ main sang worker. Worker sau khi xử lý xong sẽ gọi một hàm postMessage để báo lại với main kết quả.

Trong triển khai Worker threads thực tế, chúng ta nên tuân thủ theo một nguyên tắc được mọi người đồng thuận để tạo sự thống nhất. Một trong số đó có thể kể đến như sử dụng những package được cộng đồng xây dựng sẵn với độ tương thích cao cùng khả năng triển khai nhanh chóng như node-worker-threads-pool npm.

Ví dụ để triển khai lại đoạn mã Fibonacci trên bằng package, tôi sẽ rút ngắn được mã đồng thời mã cũng trở nên ngắn gọn và dễ đọc hơn:

const { StaticPool } = require('node-worker-threads-pool');

const fibonacci = (n) => {
  var i;
  var fib = [];

  fib[0] = 0;
  fib[1] = 1;
  for (i = 2; i <= n; i++) {
    fib[i] = fib[i - 2] + fib[i - 1];
  }
  return fib;
}

const staticPool = new StaticPool({
  size: 4,
  task: fibonacci,
});

staticPool.exec(999999).then(console.log);

Tổng kết

Worker threads là một module trong node.js cho phép chạy mã Javascript song song với luồng chính. Sử dụng worker threads khi chúng ta có những đoạn mã đồng bộ chiếm một thời gian xử lý lớn. Bằng cách đó sẽ giảm tải được cho luồng chính tiếp tục xử lý những yêu cầu tiếp theo mà không bị chặn trong một khoảng thời gian.

Chi phí tài nguyên để tạo ra một worker là ít hơn so với Child Process, tuy nhiên cả hai vốn đều “đắt giá” nên cần thận trọng khi tạo ra quá nhiều.

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

Bài viết liên quan

Đọc ghi file trên Node.js

Bài viết được sự cho phép của smartjob.vn Bài này mình giới thiệu về phần đọc ghi file .Trong Node js có nét mới là đọc ghi file khác so với PHP có 2 chế độ là : Đồng bộ và không đồng bộ ( hay có khái niệm mới Synchronous vs Asynchronous).Asynchronous :bất đồng bộ khi tiến trình bắt đầu chạy thì tất cả cách lệnh cùng chạy và Synchronous :đồng bộ khi tiến trình chạy thì các câu lệnh được đọc  trình tự từ trên xuống dưới. [irp posts="5311" name="10 Công ty hàng đầu thế giới sử dụng Node.js"] [irp posts="34092" name="Ghi chú file package.json của node module"] Bắt đầu ví dụ : tạo 2 file : file.js và sample.txt trong thư mục  E:\file_nodejs như sau : 1. Asynchronous đọc ghi file bất đồng bộ tiến trình bắt đầu tất cả các dòng lệnh cùng chạy  Nội dung trong file : file.js var fs = require("fs"); // Asynchronous read fs.readFile('sample.txt', function (err, data) { if (err) { return console.error(err); } console.log("cau lenh thu 1: " + data.toString()); }); console.log("cau lenh thu 2"); Nội dung trong file : example.txt chao [...]

Cách tạo một Docker đơn giản cho Node.JS

Đây là một hướng dẫn ngắn và đơn giản về docker, khá hữu ích cho các anh em Nodejs. Tại sao bạn nên sử dụng Docker? Khi công việc kinh doanh cần tới nhiều ứng dụng web khác nhau, khi mà bây giờ framework hay ngôn ngữ lập trình chỉ là công cụ. Các công ty không bị giới hạn và có thể sử dụng bất kỳ ngôn ngữ nào cần. Vì vậy chúng ta cần có một môi trường mà nhiều ứng dụng khác nhau có thể chạy cùng nhau trên đó. Virtual Machines (VM) cho phép chúng ta chạy nhiều app trên cùng 1 server. Nhưng cũng có hạn chế. Mỗi VM cần toàn bộ OS để chạy. Mỗi OS lại cần CPU, RAM,... để chạy, rồi nó cần patching và licensing, do đó làm tăng chi phí và khả năng phục hồi. Google bắt đầu sử dụng mô hình container từ lâu để giải quyết các thiếu sót của mô hình VM. Về cơ bản thì mô hình container có nghĩ [...]

Triển khai mã hiệu quả hơn với compose & pipe function trong Javascript

Bài viết được sự cho phép của tác giả Tống Xuân Hoài Đã bao giờ bạn gặp bài toán xử lý dữ liệu liên tục? Vậy thì bạn sẽ làm gì trong trường hợp Giới thiệu về composition function Composition là một cơ chế kết hợp nhiều hàm đơn giản để xây dựng một hàm phức tạp hơn. Kết quả của mỗi hàm sẽ được chuyển cho hàm tiếp theo. Nó giống như trong toán học, chúng ta có một hàm số f(g(x)), tức là kết quả của g(x) được chuyển cho hàm f. Thì composition là như vậy. Một ví dụ đơn giản: Viết hàm thực hiện phép tính 1 + 2 * 3. Đối với phép tính này chúng ta phải thực hiện phép nhân trước sau đó đến phép cộng. Đoạn mã khi được triển khai bằng các hàm trong Javascript sẽ trông như thế này: const add = (a, b) => a + b; const mult = (a, b) => a * b; add(1, mult(2, 3)); Oh! hàm chạy rất tố [...]

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

Bộ câu hỏi phỏng vấn IT Manager và cách trả lời hay nhất

Bộ câu hỏi phỏng vấn IT Manager và cách trả lời hay nhất

Trong một công ty, tổ chức thì IT Manager là người chịu trách nhiệm quản lý hệ thống công nghệ và toàn bộ thông tin liên quan giúp duy trì sự ổn định và bảo mật của các hoạt động. Với vai trò quan trọng đó thì vị trí IT Manager luôn có nhu cầu tuyển dụng cao với mức đãi ngộ tốt, được nhiều công ty chú trọng. Bài viết hôm nay chúng ta cùng nhau tìm hiểu danh sách những câu hỏi tuyển dụng vị trí IT Manager để có thể chuẩn bị tốt nhất cho buổi phỏng vấn sắp tới nhé.

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

IT Manager là gì?

IT Manager là những chuyên gia công nghệ thông tin, công việc hàng ngày là lên kế hoạch, chỉ đạo và giám sát các hoạt động liên quan đến máy tính và hệ thống thông tin của công ty. IT Manager cũng là người quản lý bộ phận IT của phòng ban và là người chỉ đạo thực hiện các dự án công nghệ. Công việc của một IT Manager chia làm 2 nhiệm vụ chính:

  • Đảm bảo các hoạt động và dự án công nghệ của doanh nghiệp phát triển tốt:
    • Đánh giá nhu cầu, xem xét nguồn lực từ đó lên kế hoạch cải tiến hệ thống của công ty nhằm nâng cao hiệu suất
    • Đề xuất phương án cải tiến và nâng cấp
    • Phát triển và giám sát chính sách công nghệ thông tin
    • Giám sát các dự án công nghệ liên quan đến hệ thống của công ty
  • Quản lý nhân sự, nguồn lực IT của doanh nghiệp:
    • Phân bổ nguồn lực nhân sự cho các dự án
    • Đảm bảo nhân viên làm việc hiệu quả và hoàn thành công việc

  Program Manager là gì? Học gì để trở thành Program Manager

Kể tên một số mô hình mạng dùng trong doanh nghiệp phổ biến

Mô hình mạng là hệ thống kết hợp nhiều yếu tố để kết nối các máy tính, thực hiện nhiệm vụ thu thập, xử lý phân phối và lưu trữ dữ liệu. Đối với doanh nghiệp có một số mô hình mạng phổ biến sử dụng như sau:

  • Mạng 3 tầng (3-layer network): hệ thống mạng được chia thành 3 tầng gồm Access, Distribution và Core.
  • Multi-chassis LAG: cải tiến trên mô hình mạng 3 tầng với việc gom các kết nối thành nhóm (Link Aggregation Group).
  • CLOS Network: hệ thống chuyển mạch kênh – một giải pháp tối ưu kiến trúc mạng doanh nghiệp gồm 3 chặng từ khi dữ liệu đi vào cho tới khi đi ra gồm: Ingress, Middle và Egress.
  • IP Fabric, VXLAN: VXLAN được thiết kế với mô hình Leaf-Spine cung cấp các dịch vụ kết nối Layer2 và Layer3 thông qua mạng IP. Đây được xem như mô hình hiện đại thay thế khắc phục mô hình 3 lớp cũ trước đây.

Data Center là gì? Các tiêu chí xây dựng một Data Center cho doanh nghiệp

Data Center là gì?

Data Center (DC) hay trung tâm dữ liệu là nơi tập trung các thiết bị, tài nguyên công nghệ thông tin với mật độ cao, cung cấp các chức năng xử lý, lưu trữ thông tin một cách ổn định, nhanh chóng. Để xây dựng một Data Center “chuẩn” cho doanh nghiệp, có một số tiêu chí sau cần được đảm bảo:

  • Hệ thống nguồn điện ổn định, đảm bảo có hệ thống dự phòng cung cấp điện liên tục
  • Hệ thống an ninh, bảo mật tốt, camera giám sát liên tục
  • Hệ thống chống sét, hỏa hoạn; hệ thống làm mát chuẩn đảm bảo máy chủ luôn hoạt động tốt
  • Đáp ứng đánh giá dựa trên 4 cấp độ của thang đo ANSI/TIA-942 hoặc Uptime Tier

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

Phân biệt các phần mềm tích hợp SCM, ERP và CRM sử dụng trong doanh nghiệp

SCM, ERP và CRM

SCM, ERP và CRM là 3 hệ thống phần mềm tích hợp phổ biến được áp dụng trong các hoạt động kinh doanh, vận hành của doanh nghiệp. 3 phần mềm này có mối quan hệ chặt chẽ, hỗ trợ và trao đổi các quy trình cùng dữ liệu cho nhau. Cụ thể:

  • SCM: Supply Chain Management hay hệ thống quản lý chuỗi cung ứng là phần mềm tập trung vào các tiến trình hậu cần, mua sắm với nhà cung cấp nhằm mục đích tối ưu hóa việc lập kế hoạch mua sắm các yếu tố đầu vào phục vụ cho sản xuất. Ứng dụng SCM giúp theo dõi việc lưu hành của sản phẩm và dịch vụ từ nhà cung cấp tới khách hàng, đồng thời quản lý nhà kho, lưu vận, vận hành và các yêu cầu liên quan khác.
  • CRM: Customer Relationship Management hay hệ thống quản lý quan hệ khách hàng là hệ thống tích hợp liên tổ chức đặt trọng tâm vào khả năng giao tiếp với bên ngoài gồm khách hàng và nhà cung cấp. Mục đích sử dụng CRM là giúp doanh nghiệp có thể tìm được những khách hàng mới, duy trì mối quan hệ với các khách hàng cũ cũng như việc tối ưu hóa chi phí hoạt động và phục vụ khách hàng.
  • ERP: Enterprise Resource Planning hay hệ thống hoạch định tài nguyên doanh nghiệp là phần mềm tích hợp và phối hợp nhiều lĩnh vực hoạt động, phòng ban trong doanh nghiệp như tài chính kế toán, kinh doanh sản xuất, quản trị nhân lực, bán hàng, marketing, … Có thể xem ERP như một phần mềm tổng quan cho thấy được tất cả các hoạt động diễn ra trong doanh nghiệp, nó cũng kết nối với 2 hệ thống SCM và CRM để có thể lấy được các số liệu nhằm cung cấp bức tranh chính xác về tình trạng của doanh nghiệp hiện tại.

Với tư cách là một IT Manager, việc xây dựng hay vận hành hoặc có kế hoạch triển khai 3 phần mềm tích hợp trên sẽ giúp việc quản lý của IT Manager nói riêng và việc kiểm soát hoạt động của doanh nghiệp nói chung trở nên dễ dàng và mang lại nhiều lợi ích hơn.

  Software Manager là gì? Kỹ năng cần thiết để trở thành Software Manager

Những chứng chỉ có giá trị dành cho vị trí IT Manager

Chứng chỉ IT Manager có giá trị giúp bạn chứng minh được năng lực trong lĩnh vực quản lý của mình. Một số chứng chỉ phổ biến có giá trị cao như sau:

  • CGEIT: Certified in Governance of Enterprise IT – chứng chỉ quản trị công nghệ thông tin doanh nghiệp
  • CISSP: Certified Information Systems Security Professional – chứng nhận chuyên gia bảo mật hệ thống
  • CRISC: Certified in Risk and Information Systems Control – chứng nhận kiểm soát rủi ro 
  • CITM: Certified Information Technology Manager – chứng nhận quản lý công nghệ thông tin
  • ITIL: Information Technology Infrastructure Library – thư viện cơ sở hạ tầng công nghệ thông tin
  • ITMLP: Information Technology Management and Leadership Professional – chứng nhận lãnh đạo chuyên nghiệp
  • CISM: Certified Information Security Manager – chứng chỉ quản lý bảo mật thông tin

Định hướng phát triển sự nghiệp của bạn với vai trò là IT Manager

Với câu hỏi này, bạn có thể trả lời tùy theo dự định tương lai vị trí mà bạn muốn vươn tới theo lộ trình phát triển sự nghiệp của một IT Manager. Cụ thể có một số vị trí chức vụ như sau:

  • Team Leader: vị trí đảm nhiệm vai trò quản lý team, nhóm nhỏ 3-6 người.
  • Project Manager: nếu có mong muốn làm thiên về quản lý thì PM – quản lý dự án là một vị trí bạn có thể hướng đến.
  • Manager/Director: Quản lý, giám đốc thường sẽ là vị trí cao hơn có vai trò quản lý nhiều đội nhóm cũng như nhiều dự án trong công ty.
  • CTO – Giám đốc kỹ thuật đòi hỏi kiến thức về cả chuyên môn lẫn kỹ năng quản lý, đồng thời có khả năng cập nhật kỹ thuật, xu hướng công nghệ mới.
  • CIO – Giám đốc công nghệ thông tin có vị trí điều hành hoạt động công nghệ thông tin cho doanh nghiệp, đồng thời hoạch định chiến lược đảm bảo hiệu suất làm việc cho công ty.

Kết bài

Trên đây là danh sách những câu hỏi phỏng vấn dành cho vị trí IT Manager mà các doanh nghiệp tuyển dụng sẽ có thể hỏi bạn. Hy vọng bài viết hữu ích giúp các bạn thêm tự tin để có thể ứng tuyển cho vị trí này. Cảm ơn các bạn đã đọc bài và hẹn gặp lại trong những bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

6 câu lệnh NPM hữu ích – Web dev mà bỏ qua sẽ vô cùng tiếc

6 câu lệnh NPM hữu ích – Web dev mà bỏ qua sẽ vô cùng tiếc

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

Là một Javascript developer, có lẽ bạn cũng đồng ý với mình rằng NPM là một công cụ quản lý thư viện không thể thiếu.

NPM không chỉ giúp bạn cài đặt các thư viện cho dự án mà nó còn làm được nhiều hơn thế!

Cắt nghĩa thêm: Các thư viện mà npm quản lý có thể gọi là các packages hoặc dependencies. Tùy cách gọi của mọi người, nhưng bản chất chúng là một.

Từ khởi tạo dự án, cài thư viện, chạy ứng dụng tới khi build để deploy… đều đến tay NPM hết.

Qua đây, mình sẽ giới thiệu một số câu lệnh npm hữu ích giúp bạn tiết kiệm kha khá thời gian làm việc đấy.

1. Mở tài liệu hướng dẫn từ NPM

Bình thường, khi cài đặt một thư viện cho dự án, bạn cần phải tham khảo tài liệu hướng dẫn từ chính tác giả thư viện đó. Bạn sẽ làm như vào? Có phải là truy cập vào web của thư viện, tìm đến mục tài liệu không?

Quá chậm chạp và mất thời gian!

Chỉ với câu lệnh sau, bạn sẽ lao thẳng tới trang tài liệu của một thư viện:

npm home package-name

# Ví dụ:
npm home react # would take you to reactjs.org in the browser/

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

  Triển khai mã hiệu quả hơn với compose & pipe function trong Javascript

2. Xem danh sách các scripts trong package

Trong package.json, bạn có thể định nghĩa các script để thực hiện một tác vụ nào đó.

Ví dụ:

Xem danh sách các scripts trong package

Như trong ví dụ trên, mình có thể chạy build dự án bằng lệnh: npm run build

Cú pháp chung là: npm run <tên script>

Trên đây chỉ là ví dụ đơn giản thôi, còn với dự án lớn thì danh sách scripts có thể rất dài, bạn sẽ vô cùng khó nhớ chúng hoặc đôi lúc lâu lâu vào lại dự án thì quên béng mất.

Bạn chỉ cần gõ lệnh sau là có thể xem được danh sách script.

npm run

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

3. Bỏ qua mọi câu hỏi khi khởi tạo dự án với NPM

Bình thường, để khởi tạo dự án, có phải bạn dùng câu lệnh npm init đúng không?

Nhưng mà trình khởi tạo này nó hỏi lắm thứ quá. Nào là tên dự án, git url, tên license… Đã vội thì chứ, trong khi mình chỉ cần tạo một dự án để chạy thử một cái gì đó thôi.

Thêm thuộc tính -yes để npm điền sẵn hết thông tin mặc định, bạn khỏi cần làm gì cả.

npm init -yes

4. Cập nhật thư viện lên phiên bản mới nhất

Câu lệnh npm update mặc định của NPM CLI  sẽ chỉ cập nhật những phiên bản trong phạm vi được chỉ định trong package.json mà thôi.

Ví dụ thư viện @mdi/font như dưới đây:

Cập nhật thư viện lên phiên bản mới nhất

Nếu mình chạy lệnh npm update thì nó cũng chỉ update lên các phiên bản phụ của version 7 mà thôi, như là v7.2.0, v7.5.1… Nếu tác giả thư viện release bản v8 thì npm cũng không có update lên đâu.

Với công cụ yarn thì nó có câu lệnh: yarn upgrade-interactive –latest

Rất tiếc là npm không có câu lệnh tương tự như thế. Do đó, để làm được điều tương tự như yarn, bạn có thể sử dụng package name-check

npx npm-check --update

5. Cài đặt thư viện nhanh hơn trên CI server.

npm install sẽ tiến hành cài đặt các packages đi kèm với một số tiện ích phụ khiến nó trở lên chậm chạm vô cùng.

Tuy nhiên, những cái “phụ kiện đó” lại cần trên CI server, NPM cho phép bạn bỏ qua những cái “phụ kiện” đó bằng câu lệnh:

npm ci

Ngoài ra, bạn có thể thay thế câu lệnh npm install thành npm ci trong phần cấu hình CI.

Ví dụ, Travis CI có thể cấu hình như sau:

# .travis.yml
install:
- npm ci
# keep the npm cache around to speed up installs
cache:
 directories:
 - "$HOME/.npm"

6. Mở trang báo bugs của thư viện

Khi sử dụng thư viện, đôi khi bạn gặp một lỗi nào đó mà chưa biết cách giải quyết. Bạn có thể tham khảo các bugs tương tự mà người khác đã gặp hoặc báo trực tiếp tới tác giả thông qua trang bugs.

npm bugs package-name

# Ví dụ:
npm bugs @agney/playground 

Ngoài ra, bạn có thể tự động tìm kiếm giải pháp trên stackoverflow ngay trong cửa sổ lệnh:

npx stackoverflow-cli

Mở trang báo bugs của thư viện

Cũng khá thú vị đúng không?

Trên đây là một số câu lệnh npm hữu ích mà mình tổng hợp được. Bạn còn câu lệnh nào hay ho nữa thì chia sẻ với mọi người qua mục bình luận nhé!

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

Xem thêm:

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

Triển khai mã hiệu quả hơn với compose & pipe function trong Javascript

Triển khai mã hiệu quả hơn với compose & pipe function trong Javascript

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Đã bao giờ bạn gặp bài toán xử lý dữ liệu liên tục? Vậy thì bạn sẽ làm gì trong trường hợp

Giới thiệu về composition function

Composition là một cơ chế kết hợp nhiều hàm đơn giản để xây dựng một hàm phức tạp hơn. Kết quả của mỗi hàm sẽ được chuyển cho hàm tiếp theo.

Nó giống như trong toán học, chúng ta có một hàm số f(g(x)), tức là kết quả của g(x) được chuyển cho hàm f. Thì composition là như vậy.

Một ví dụ đơn giản: Viết hàm thực hiện phép tính 1 + 2 * 3.

Đối với phép tính này chúng ta phải thực hiện phép nhân trước sau đó đến phép cộng. Đoạn mã khi được triển khai bằng các hàm trong Javascript sẽ trông như thế này:

const add = (a, b) => a + b;
const mult = (a, b) => a * b;
add(1, mult(2, 3));

Oh! hàm chạy rất tốt tuy nhiên có hơi rối một chút nhỉ. Giả sử bây giờ tôi muốn chia tất cả cho 4 thì sao? Một đoạn mã gì đó sẽ trông như thế này:

div(add(1, mult(2, 3)), 4);

Chà rối hơn rồi đấy!

Bây giờ chúng ta sẽ đi đến một ví dụ khác. Giả sử tôi có một danh sách users bao gồm tên và tuổi, hãy lấy ra tên của những người trên 18 tuổi. Đoạn mã đó sẽ giống như:

const users = [
  { name: "A", age: 14 },
  { name: "B", age: 18 }, 
  { name: "C", age: 22 },
];

const filter = (cb, arr) => arr.filter(cb);
const map = (cb, arr) => arr.map(cb);

map(u => u.name, filter(u => u.age > 18, users)); // ["C"]

Tư tưởng là tôi sẽ tạo ra 2 hàm filter & mapfilter để lọc còn map là để duyệt qua các phần tử. Đoạn mã trên hoạt động tốt tuy nhiên cũng như ví dụ đầu tiên, nó có hơn rườm rà một chút.

Vậy thì có cách nào giải quyết được ổn thoả hai vấn đề trên? Hoặc chí ít là giúp cho mã rõ ràng hơn khi điều kiện bài toán tăng thêm.

  Hướng dẫn sử dụng composer cơ bản

  Thái cực trong lập trình - Functional Programming

Triển khai

Hàm compose

Mục tiêu của tôi là sẽ tạo ra một hàm nhận vào nhiều tham số, các tham số này là những hàm nhỏ hơn để thực hiện một khối lượng công việc nhất định (Higher Order Function). Nó sẽ trông giống như là hàm compose này:

compose(function1, function2…, functionN): Function

compose nhận vào các hàm và trả ra một hàm. Tư tưởng của compose là khi nó được gọi, nó sẽ thực hiện các hàm trong tham số từ phải sang trái, kết quả của hàm trước sẽ được chuyển thành đối số của hàm sau.

Đây là một cách đơn giản để implement hàm compose bằng ES6:

const compose = (...functions) => args => functions.reduceRight((arg, fn) => fn(arg), args);

Sẽ thật là hạnh phúc với tôi nếu bạn hiểu được những gì bên trong compose thực sự làm, còn nếu không hiểu thì hãy comment ở phía dưới bài viết nhé. Tôi sẽ theo dõi comment của bạn!

Bây giờ quay trở lại với ví dụ ban đầu, ta hãy sửa lại mã một chút:

const add = a => b => a + b;
const mult = a => b => a * b;

const operator = compose(add(1), mult(2));
const result = operator(3);

// Hoặc ngắn gọn hơn chúng ta cũng có thể viết

const result = compose(add(1), mult(2))(3);

Tôi đã biến add và mult thành hàm curry, bời vì sao? Bởi vì khi chuyển nó thành curry tôi có thể dùng nó như là một tham số là hàm vào trong compose.

Được rồi bây giờ muốn tất cả chia cho 4 thì sao?

const div = a => b => b / a;
const result = compose(div(4), add(1), mult(2))(3);

Thật dễ đọc phải không. Từ trái sang phải lần lượt thực hiện nhân với 2, sau đó cộng thêm 1 và cuối cùng chia cho 4. Cứ giống như một dòng chảy vậy.

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

Tương tự như vậy với ví dụ 2 hãy sửa lại mã của nó một chút:

const users = [
  { name: "A", age: 14 },
  { name: "B", age: 18 }, 
  { name: "C", age: 22 },
];

const filter = cb => arr => arr.filter(cb);
const map = cb => arr => arr.map(cb);

compose(
  map(u => u.name),
  filter(u => u.age > 18),
)(users); // ["C"]

Chúng ta có thể viết thêm một cơ số hàm nối tiếp ở trong compose mà vẫn giữ được dòng chảy dữ liệu hoạt động, và hơn hết là giữ cho đoạn mã tương đối dễ đọc.

Hàm pipe

Tương tự như composepipe cũng mang tư tưởng giống như compose chỉ duy nhất khác một điều là thứ tự thực hiện các hàm trong tham số là từ trái sang phải. Hàm pipe sẽ được implement như thế này:

const pipe = (...functions) => args => functions.reduce((arg, fn) => fn(arg), args);

Áp dụng pipe vào ví dụ 1:

const add = a => b => a + b;
const mult = a => b => a * b;

const result = pipe(mult(2), add(1))(3);

Như các bạn thấy các tham số được truyền vào ngược lại so với compose, nó sẽ thực hiện các hàm từ phải sang trái: nhân 3 với 2 rồi sau đó cộng 1.

Bạn có thể sử dụng compose và pipe tuỳ theo sở thích hoặc thói quen vì hai hàm đều mang lại kết quả tương tự nhau.

Tổng kết

Hai hàm compose và pipe tuy nhỏ nhưng nó mang lại lợi ích rất lớn trong việc áp dụng vào các bài toán xử lý dữ liệu liên tục. Nó giúp mã rõ ràng & dễ đọc hơn.

Hầu như các thư viện Javascript hỗ trợ việc xử lý dữ liệu đều có sẵn các hàm tương tự như compose hoặc pipe như _.compose_.pipe trong lodash hay composepipe trong ramdajs.

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

TOP 5 ngôn ngữ lập trình khó nhất thế giới

TOP 5 ngôn ngữ lập trình khó nhất thế giới

Thế giới của ngôn ngữ lập trình vô cùng đa dạng và phong phú. Có những ngôn ngữ đơn giản và dễ tiếp cận, tuy nhiên, cũng có những ngôn ngữ lập trình kỳ quặc và khó hiểu, thách thức ngay cả những lập trình viên kỳ cựu. Trong bài viết này, chúng ta sẽ khám phá một số ngôn ngữ lập trình khó nhất thế giới. Những ngôn ngữ này không chỉ phức tạp về cú pháp, mà còn đòi hỏi lập trình viên phải có trình độ cao và sự kiên nhẫn để hiểu và làm việc với chúng.

Ngôn ngữ lập trình COW

Ngôn ngữ lập trình COW (Cowsay Oriented Language) là một ngôn ngữ lập trình độc đáo và khá kỳ quặc. Nó được lấy cảm hứng từ chương trình “cowsay” được sử dụng để in ra văn bản dưới hình dạng của một con bò. COW không phải là một ngôn ngữ lập trình chính thống, mà thay vào đó nó sử dụng các từ và cụm từ để tạo ra mã.

Ngôn ngữ lập trình COW

Trong COW, các câu lệnh được viết dưới dạng các dòng chữ tiếng Anh. Mỗi dòng chữ đại diện cho một câu lệnh cụ thể. Ngôn ngữ này được thiết kế với mục đích chính là giải trí và không được sử dụng rộng rãi cho mục đích lập trình thực tế.

Ví dụ, dưới đây là một đoạn mã COW để in ra chuỗi “Hello World!”:

MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO Moo Moo MoO MoO MoO Moo OOO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOoMOo MOo MOo MOo MOo Moo MOo MOo MOo MOo MOo MOo MOo MOo Moo MoO MoO MoO Moo MOo MOo MOo MOo MOo MOo Moo MOo MOo MOo MOo MOo MOo MOo MOo MooOOO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo

Mặc dù COW không phải là một ngôn ngữ lập trình chính thống và không được sử dụng rộng rãi, nó mang lại sự thú vị và độc đáo trong việc tạo ra mã bằng cách sử dụng câu chuyện dễ thương với những con bò.

Ngôn ngữ lập trình Intercal

Ngôn ngữ lập trình Intercal (Short for “Compiler Language With No Pronounceable Acronym”) là một trong những ngôn ngữ lập trình khó nhất thế giới, độc đáo và không giống bất kỳ ngôn ngữ lập trình nào khác. Nó được tạo ra vào những năm 1970 với mục đích chính là trêu đùa và châm biếm các lập trình viên.

Ngôn ngữ lập trình Intercal

Intercal không được thiết kế để sử dụng trong các dự án thực tế hay môi trường phát triển chuyên nghiệp. Thay vào đó, nó mang tính chất giải trí và thách thức người lập trình với cú pháp độc đáo.

Một số đặc điểm của Intercal bao gồm:

  1. Cú pháp lạ: Intercal sử dụng cú pháp không thường xuyên và đôi khi vô lý, gồm các từ khóa như “PLEASE”, “DO”, “FORGET”, “NEXT”, “PLEASE ABSTAIN FROM ACTUALLY IMPLEMENTING”, vv. Cú pháp này làm cho việc đọc và viết mã trở nên khó hiểu và khó tiếp cận.
  2. Các câu lệnh vui nhộn: Intercal có các câu lệnh như “COME FROM”, “GO TO”, “READ OUT”, “IGNORE”, “REMIND”, tạo ra sự độc đáo và hài hước cho việc viết chương trình.
  3. Hạn chế ràng buộc: Intercal có rất ít cấu trúc điều khiển chuẩn, làm cho việc viết các cấu trúc lặp hoặc điều kiện trở nên phức tạp và khó khăn.

Ví dụ, đây là một đoạn mã Intercal đơn giản để in ra chuỗi “Hello, World!”:

DO ,1 <- #13
PLEASE DO ,1 SUB #1 <- #238
DO ,1 SUB #2 <- #108
DO ,1 SUB #3 <- #112
DO ,1 SUB #4 <- #0
DO ,1 SUB #5 <- #64
DO ,1 SUB #6 <- #194
DO ,1 SUB #7 <- #48
PLEASE DO ,1 SUB #8 <- #22
DO ,1 SUB #9 <- #248
DO ,1 SUB #10 <- #168
DO ,1 SUB #11 <- #24
DO ,1 SUB #12 <- #16
DO ,1 SUB #13 <- #162
PLEASE READ OUT ,1

  Ngôn ngữ lập trình nào lương cao nhất năm 2023?

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

Ngôn ngữ lập trình Whitespace

Ngôn ngữ lập trình Whitespace được phát hành vào ngày 1 tháng 4 năm 2003 bởi tác giả Edwin Brady và Chris Morris. Tên gọi “Whitespace” (dấu cách trắng) đề cập đến việc ngôn ngữ này sử dụng chỉ khoảng trắng, tab và dòng mới để tạo thành các câu lệnh và biểu thức.

Trong Whitespace, mọi ký tự không phải dấu cách, tab hay dòng mới được coi là “không tồn tại” và bị bỏ qua. Cú pháp và cấu trúc của Whitespace chỉ dựa trên khoảng trắng và các ký tự điều khiển tương ứng. Điều này làm cho Whitespace trở thành một ngôn ngữ rất khó hiểu và khó đọc.

Ví dụ, dưới đây là một đoạn mã Whitespace để in ra chuỗi “Hello, World!”:

Ngôn ngữ lập trình Whitespace

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

Ngôn ngữ lập trình Chef

Ngôn ngữ tiếp theo trong danh sách ngôn ngữ lập trình khó nhất thế giới chính là Chef. Ngôn ngữ lập trình Chef là một ngôn ngữ độc đáo và thú vị, nơi lập trình viên sử dụng cú pháp và thuật ngữ liên quan đến việc nấu ăn và nấu nướng. Ngôn ngữ này được thiết kế để tạo ra mã như một công thức nấu ăn.

Ngôn ngữ lập trình Chef

Trong Chef, các câu lệnh và biểu thức được biểu thị bằng các thành phần như một nguyên liệu (ingredient), một công cụ (utensil), một phương pháp nấu (cooking method), một bước nấu (cooking step), vv. Mỗi đoạn mã Chef thường bắt đầu bằng một danh sách nguyên liệu và kết thúc bằng một món ăn hoàn chỉnh.

Cú pháp của Chef là một sự kết hợp giữa các từ và cụm từ liên quan đến nấu ăn, như “mix”, “fold”, “stir”, “bake”, “put”, vv. Điều này tạo ra một ngôn ngữ lập trình rất độc đáo và không giống bất kỳ ngôn ngữ lập trình nào khác.

Ví dụ, dưới đây là một đoạn mã Chef để in ra chuỗi “Hello, World!”:

Hello, World!
Ingredients.
72 g flour
101 g sugar
108 g butter
108 g chocolate chips
111 g eggs
44 g vanilla extract
32 g baking powder
32 g salt

Method.
Put flour into the mixing bowl.
Put sugar into the mixing bowl.
Put butter into the mixing bowl.
Put chocolate chips into the mixing bowl.
Put eggs into the mixing bowl.
Put vanilla extract into the mixing bowl.
Put baking powder into the mixing bowl.
Put salt into the mixing bowl.
Mix the ingredients until well blended.
Fold the batter gently.
Cook the batter on the baking sheet.

Mặc dù Chef không phải là một ngôn ngữ lập trình thực tế được sử dụng trong các dự án thực tế, nó mang lại sự thú vị và sáng tạo cho những ai muốn khám phá và trải nghiệm một hình thức lập trình không truyền thống, đồng thời gợi mở về khả năng kết hợp giữa lập trình và nghệ thuật nấu ăn.

Ngôn ngữ lập trình Brainfuck

Ngôn ngữ lập trình Brainfuck được tạo ra bởi Urban Müller vào những năm 1993 như một trò đùa và thử thách cho người lập trình.

Brainfuck được thiết kế với mục đích tối giản hóa, chỉ bao gồm một tập lệnh rất nhỏ và không có cấu trúc điều khiển phức tạp. Ngôn ngữ này hoạt động trên một bộ nhớ trạng thái duy nhất, gồm một dãy các ô nhớ đơn giản và một con trỏ.

Cú pháp của Brainfuck chỉ bao gồm 8 ký tự đơn giản: +, -, >, <, [, ], ., ,. Mỗi ký tự đại diện cho một câu lệnh cụ thể trong việc thao tác với ô nhớ và di chuyển con trỏ.

Do tính đơn giản và thiếu cấu trúc của Brainfuck, việc viết chương trình trong ngôn ngữ này thường khá khó khăn và đòi hỏi sự tập trung cao. Người lập trình cần có khả năng suy nghĩ logic và tư duy trừu tượng để biểu diễn các thuật toán và tác vụ phức tạp.

Ví dụ, dưới đây là một đoạn mã Brainfuck để in ra chuỗi “Hello, World!”:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.——.——–.>+.>.

Tổng kết

Trong bài viết này chúng ta đã khám phá một số ngôn ngữ lập trình khó nhất thế giới. Từ ngôn ngữ lập trình COW, Intercal, Whitespace cho đến Chef và Brainfuck, mỗi ngôn ngữ đều mang đến một cách tiếp cận độc đáo và thách thức trong việc viết mã.

Những ngôn ngữ lập trình này thường không được sử dụng trong các dự án thực tế hoặc môi trường phát triển chuyên nghiệp. Thay vào đó, chúng mang tính chất giải trí, thách thức và thú vị cho những người muốn khám phá và đối mặt với những trở ngại đặc biệt trong việc viết mã.

Dù bạn là một lập trình viên chuyên nghiệp, người yêu công nghệ hay chỉ đơn giản là muốn khám phá và thách thức bản thân, việc tìm hiểu về những ngôn ngữ lập trình khó nhất thế giới sẽ mở ra một cánh cửa mới đầy kỳ thú trong thế giới lập trình.

Tổng hợp bởi TopDev

Xem thêm:

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

Tận dụng ưu thế cơ sở vật chất tại Techcombank: Nền tảng Machine Learning on-premise mang lại khả năng phân tích dữ liệu mạnh mẽ

Tận dụng ưu thế cơ sở vật chất tại Techcombank: Nền tảng Machine Learning on-premise mang lại khả năng phân tích dữ liệu mạnh mẽ

Bài viết đến từ chị Nguyễn Khánh Linh – Quản lý Cao cấp Khoa học dữ liệu

Data Science team @Techcombank

Xây dựng các mô hình Học máy (Machine Learning models) để phục vụ các bài toán của doanh nghiệp hay khách hàng là một trong những công việc quan trọng của khối Dữ liệu và Phân tích (Data & Analytics Division) tại Techcombank. Mọi chuyện tưởng chừng đơn giản nếu chúng ta có ít nhu cầu hay lượng dữ liệu không cần cập nhật nhiều và thường xuyên, hoặc team quy mô nhỏ tới rất nhỏ. Tuy nhiên, khi team lớn dần và nhu cầu từ các bên ngày một nhiều, việc có một hạ tầng để phát triển những mô hình học máy này sẽ trở nên cần thiết. 

Tận dụng ưu thế cơ sở vật chất tại Techcombank: Nền tảng Machine Learning on-premise mang lại khả năng phân tích dữ liệu mạnh mẽ

Việc có một hệ thống về Machine Learning tốt sẽ giúp giải quyết các vấn đề như:

  1. Cung cấp cho nhà phân tích dữ liệu (Data analyst), nhà khoa học dữ liệu (Data scientist) và kỹ sư học máy (Machine learning engineer) một công cụ để cùng xử lý dữ liệu và phát triển thuật toán hay mô hình một cách thuận tiện, nhanh chóng.
  2. Tích hợp kèm với một kho thuộc tính (Feature/attribute store) để lưu trữ, tái sử dụng, và phát triển thêm các thuộc tính mới một cách tập trung để cải tiến mô hình.
  3. Kết nối từ đầu tới cuối (end-to-end) cho một quy trình tích hợp, phát triển cũng như triển khai liên tục (CI/CD) các mô hình học máy và code của nó, từ việc xử lý dữ liệu cho tới triển khai mô hình lên vận hành.
  4. Write Once, Run Everywhere.

Vì vậy, bài viết dưới đây sẽ giới thiệu về Machine Learning platform mà hiện tại Techcombank đang sử dụng on-premise (tại chỗ), hay còn được gọi là Research Environment (RE).

Nền tảng Machine Learning on-premise

Thiết kế tổng quan

Đầu tiên, người dùng sẽ truy cập hệ thống thông qua Web UI bằng username và password của mình. Hệ thống ML Platform này bao gồm các phần:

  1. Features Ingestion & Processing Layer: Được dựng bởi Kubernetes và đã được cài đặt Apache Spark và Airflow để giúp tạo các luồng lấy features từ các nguồn dữ liệu (vd: Datawarehouse)
  2. Offline Storage Layer: Đây là layer chứa các features sau khi được kéo về từ nguồn dữ liệu.
  3. Analyze Layer: Đây chính là component chính mà người dùng sử dụng và tương tác, đã bao gồm Jupyter Notebook, PySpark được dựng bởi Kubernetes.

Trước mắt để trả lời cho câu hỏi “vì sao dùng Kubernetes cho ML Platform”, hãy cùng tìm hiểu về Kubernetes là gì và cấu trúc của nó thế nào nhé.

Cấu trúc và mục đích sử dụng của Kubernetes (hay còn gọi là K8s)

Cấu trúc và mục đích sử dụng của Kubernetes

Kubernetes là một nền tảng mã nguồn mở, di động, có thể mở rộng để quản lý khối lượng công việc và dịch vụ được chứa trong container, hỗ trợ cả cấu hình khai báo và tự động hóa. Đây là một giải pháp tốt để đóng gói và chạy các ứng dụng của bạn với môi trường riêng biệt. Nó cung cấp cho chúng ta một framework để chạy các hệ thống phân tán một cách linh hoạt. Kubernetes có khả năng đảm nhiệm việc mở rộng quy mô và chuyển đổi dự phòng cho ứng dụng của bạn, cung cấp các mẫu deploy một các nhanh nhất.

Vì vậy, khi xem xét đến use-case của một ngân hàng như Techcombank, quy mô team Data Science có thể lớn tới hàng chục thậm chí cả trăm người thì đây là giải pháp thích hợp nhất. Mỗi một Data Scientist hay Data Analyst đều có thể tự khởi tạo một môi trường riêng của mình, chạy các ứng dụng, cài đặt thư viện hay phát triển mô hình hoặc code trên đó mà không làm ảnh hưởng đến người dùng khác. 

Features Ingestion & Processing Layer

Đây là layer phụ trách việc lấy dữ liệu ban đầu, xử lý qua các trường dữ liệu và thuộc tính một cách tự động.

Hàng tháng, hàng tuần hoặc hàng ngày, dữ liệu phải được ETL (Extract, Transform, Load) từ kho dữ liệu đến một nơi chứa, ví dụ Hadoop. Hiện tại, ML Platform đang cài đặt Airflow để giúp ETL tự động các dữ liệu này. Các bước để tự động hoá luồng ETL dữ liệu như sau:

  1. Code của bạn phải là code chạy được (executable code/program file), bao gồm input, output rõ ràng và không phải là file notebook. Bạn cần test trước trên máy cá nhân để chắc chắn rằng file code này chạy được và chạy đúng. Code mẫu cho file ETL có thể trông như sau:
config = utils.get_config_spark('etl_table',
                                local=False,
                                user='airflow',
                                driver_mem='4g',
                                driver_core='4',
                                instances='3',
                                executor_mem='4',
                                executor_core='3',
                                message=256,
                                maxResultSize='32g')

spark = utils.get_spark_session(config=config)

TIME_FORMAT = "%Y%m%d"

options = {
    "use_secret": True,
    "reader": "spark",
    "writer": "spark",
    "mode": "daily",
    'n_partition': 200,
    'output_pattern': "/path/to/output/upto_date={}",
    'query': etl_params['data_txn_query'],
    'source': 'your_data_source',
    'partition_column': etl_params['data_txn_partition_column'],
    'spark': spark,
    'spark_schema': etl_params['data_txn_schema_spark'],
    'pandas_schema': etl_params['data_txn_schema_pandas']
}

if __name__ == "__main__":
    today = (datetime.date.today() + datetime.timedelta(hours=7) - datetime.timedelta(days=2)).strftime('%Y%m%d')
    etl_table.run_ETL_raw([today], options=options)

Ta có thể có một file code khác để gộp các files nhỏ như ở trên cho các bảng khác nhau, sau đó dùng chúng để biến đổi và gộp. Ví dụ:

dag_monthly = DAG(
    dag_id="etl_monthly",
    description="etl monthly",
    schedule_interval="0 0 9 * *",
    default_args=default_args,
    catchup=False,
)

etl_src_1 = kubernetes_pod_etl(arguments=[f"path/to/etl/src1.py"],
                            task_id=" etl_src_1",
                            dag=dag_monthly)

etl_src_2 = kubernetes_pod_etl(arguments=[f"path/to/etl/src2.py"],
                            task_id=" etl_src_2",
                            dag=dag_monthly)

etl_src_3 = kubernetes_pod_etl(arguments=[f"path/to/etl/src3.py"],
                            task_id=" etl_src_3",
                            dag=dag_monthly)

etl_src_1 >> etl_src_2 >> etl_src_3 

2. Bạn cần có quyền kết nối vào các data sources cần thiết để lấy dữ liệu về. Ví dụ: 

os.environ.get('user_{your_db}')
os.environ[‘PASSWORD’]
os.environ[‘USERNAME’]

3. Viết và commit DAGs file vào Git repo, sau đó file sẽ được tự động deployed vào Airflow thông qua ArgoCD. Ví dụ như hình dưới đây.

Features Ingestion & Processing Layer

Sau đó, những file DAG sẽ được Airflow tự động chạy (execute) và tự kéo dữ liệu hay features về Offline Storage Layer. 

Offline Storage Layer

Offline Storage Layer (Tầng lưu trữ dữ liệu ngoại tuyến) là nơi lưu trữ những features sau khi đã được biến đổi logic để phù hợp với việc phân tích dữ liệu. Tầng lưu trữ dữ liệu cũng được dựng lên bởi Kubernetes, là một nơi lưu trữ centralized cho cả team Data Scientist. Features được tập trung với mục đích:

  • Thống nhất định nghĩa, logic về features giữa các team
  • Tránh việc phát triển trùng lặp features
  • Tái sử dụng những features được phát triển của team khác, tiết kiệm thời gian, tài nguyên

Để đảm bảo tính reliability và fault-tolerant cho tầng lưu trữ dữ liệu này, hệ thống Hadoop Distributed Filesystem (HDFS) được sử dụng. HDFS hỗ trợ việc replication và partition dữ liệu một cách tự động. Cụ thể hơn về HDFS, mời các bạn tham khảo tài liệu chính thức từ Apache.

Sau khi dữ liệu được lưu trữ lên HDFS, những thành viên trong team có thể truy cập để lấy và sử dụng dữ liệu một cách đơn giản thông qua câu lệnh hdfs dfs -get. HDFS được dựng trên một pod của Kubernetes và mọi người trong team Data Scientist có thể access pod và lấy dữ liệu về sử dụng cho Analyze Layer.

Offline Storage Layer

Analyze Layer

Analyze Layer (Tầng phân tích), tương tự với tầng Features Ingestion, cũng được dựng lên bởi Kubernetes. Analyze Layer là tầng cuối trong thiết kế hệ thống phân tích dữ liệu On-premises của Techcombank, nơi Data Scientist phân tích, tối đa hoá giá trị của dữ liệu mang lại cho từng bài toán cụ thể. 

Về mặt dữ liệu, như đã trình bày ở trên, sau khi dữ liệu nguồn được biến đổi thành features dễ sử dụng,  Data Scientist có thể truy cập từ một nguồn feature thống nhất của team với số lượng feature lên tới gần 1000. Data Scientist hoàn toàn có thể phát triển thêm và làm giàu cho hệ thống lưu trữ này. 

Về mặt phần cứng và sức mạnh xử lý cho từng người dùng, với sự hỗ trợ từ Kubernetes, người dùng có thể tự tạo workspace với nguyện vọng phần cứng về số nhân CPU, GPU, RAM, volume phù hợp và Kubeflow sẽ tìm cách phân bổ phần cứng phù hợp. Về mặt thư viện, để đảm bảo tính bảo mật với thư viện mã nguồn mở, những thư viện, docker image được cài lên hệ thống cần phải được kiểm duyệt trước khi sử dụng, thông qua Nexus. 

Với sự kết hợp của phần cứng, thư viện và dữ liệu, Data Scientist giờ đây đã được cung cấp một môi trường làm việc với đầy đủ công cụ để phát triển mô hình.

Monitoring

Tất nhiên, việc triển khai hệ thống On-premises sẽ gặp những sự cố không đáng có về mặt phần cứng hay sai sót trong quản lý phần mềm. Đó là lý do chúng ta cần một hệ thống giám sát thông số, performance metrics để dễ dàng trace back trong trường hợp sự cố xảy ra. Những thông số kỹ thuật này được generate thông qua Prometheus và sau đó được trực quan hoá bằng Grafana dashboard. Những câu hỏi thường gặp của Data Scientist mà Grafana có thể cung cấp câu trả lời là:

  • Tại sao code chạy mãi mà cứ quay hoài? 

=> lỗi thường gặp là do tràn RAM, check thông số về tỉ lệ giữa RAM sử dụng thực tế và RAM được cung cấp. Nếu do lỗi tràn RAM, có thể cần cung cấp thêm RAM cho người dùng, hoặc người dùng tìm cách để tối ưu hoá code của mình

– Sao không xóa được file này nhỉ?

=> lỗi thường gặp là do hết ROM và interface trên jupyter lab không xoá triệt để những dữ liệu cũ. Kiểm tra bằng việc xem thông số về bộ nhớ.


Thuộc dự án Inside GemTechnology do TopDev hợp tác cùng Techcombank triển khai, chuỗi nội dung thuần “Tech” độc quyền được chia sẻ bởi đội ngũ chuyên gia Công nghệ & Dữ liệu tại Techcombank sẽ được cập nhật liên tục tại chuyên mục Tech Blog | Techcombank Careers x TopDev. Cùng theo dõi & gặp gỡ các chuyên gia bạn nhé!

 

Các cơ hội việc làm tại Techcombank


Bài viết liên quan

Khoa học dữ liệu - Đòn bẩy cho Ngân hàng 4.0 toàn diện

Khoa học dữ liệu là một trong những chiếc chìa khóa giúp nhiều doanh nghiệp cũng như các tổ chức tài chính lớn như ngân hàng đột phá trong kỷ nguyên 4.0. Càng ngày việc thu thập và hiểu dữ liệu dần trở thành một kim chỉ nam giúp các doanh nghiệp tạo ra tính đột phá trong tương lai.  Anh Nguyễn Hoàng Huy hiện đang là Giám đốc khoa học dữ liệu, và đã được trao bằng tiến sĩ ngành Khoa học máy tính của Đại học tổng hợp Greifswald. Năm 2012, anh được giải thưởng bài báo xuất sắc nhất của Hội khoa học dữ liệu CHLB Đức. Sau đó anh trở về Việt Nam tham gia nhiều công ty được đầu tư bài bản vào dữ liệu lớn. Ứng dụng Data Science: dữ liệu là nguồn nhiên liệu cho trí tuệ nhân tạo Theo anh, dữ liệu quan trọng như thế nào với tương lai của Digital Banking? “Thực ra dữ liệu quan trọng trong [...]

 

Kotlin là gì? Kotlin và Java khác nhau như thế nào?

Kotlin là gì? Kotlin và Java khác nhau như thế nào?

Kotlin – một cái tên đã nhanh chóng ghi dấu trong cộng đồng lập trình viên và trở thành ngôn ngữ lập trình hàng đầu cho phát triển ứng dụng di động và backend. Với sự tiến bộ và khả năng đáp ứng nhu cầu ngày càng cao của các nhà phát triển, Kotlin đã thu hút sự quan tâm từ cộng đồng lập trình toàn cầu. Vậy Kotlin là gì? Hãy cùng TopDev tìm hiểu tất tần tật những thứ liên quan đến Kotlin trong bài viết này!

Kotlin là gì? Lịch sử hình thành của Kotlin

1. Kotlin là gì?

Kotlin là một ngôn ngữ lập trình đa nền tảng (cross-platform) được phát triển bởi JetBrains, một công ty phát triển phần mềm có trụ sở tại Nga. Kotlin được thiết kế để chạy trên Java Virtual Machine (JVM) và có thể sử dụng để phát triển ứng dụng di động, web và backend.

Kotlin là gì?

Mục tiêu chính của Kotlin là cung cấp một ngôn ngữ lập trình hiện đại, có tính năng mạnh mẽ và cú pháp dễ đọc, giúp tăng cường hiệu suất và năng suất của lập trình viên. Kotlin được xây dựng với mục tiêu tương thích ngược (interoperability) với Java, điều này có nghĩa là mã nguồn Java hiện có có thể được tích hợp và sử dụng trong dự án Kotlin và ngược lại.

2. Lịch sử hình thành của Kotlin

  • Năm 2010: JetBrains bắt đầu nghiên cứu và phát triển Kotlin như một ngôn ngữ mới dựa trên JVM.
  • Tháng 7 năm 2011: Phiên bản M1 của Kotlin được giới thiệu công khai lần đầu tiên.
  • Tháng 6 năm 2013: JetBrains công bố rằng Kotlin sẽ được phát triển dưới dạng dự án mã nguồn mở.
  • Tháng 2 năm 2016: Phiên bản 1.0 của Kotlin được phát hành, đánh dấu bước ngoặt quan trọng trong lịch sử của ngôn ngữ.
  • Tháng 5 năm 2017: Google công bố hỗ trợ chính thức Kotlin trong việc phát triển ứng dụng Android.
  • Tháng 10 năm 2017: Phiên bản Kotlin 1.2 được phát hành với nhiều cải tiến như hỗ trợ cho multiplatform projects và kotlinx.coroutines.
  • Tháng 5 năm 2019: Kotlin 1.3 ra mắt với tính năng chính là Kotlin/Native, cho phép phát triển ứng dụng đa nền tảng không cần JVM.
  • Tháng 12 năm 2020: Kotlin 1.4 được phát hành với các tính năng mới như kotlinx.serialization và JVM IR compiler.
  • Tháng 8 năm 2021: Kotlin 1.5 ra mắt với nhiều cải tiến về tương thích ngược với Java và tính năng mới như sealed interfaces và implicit conversions.

  Mình đã học kotlin như thế nào?: Phần 1: từ 1 dev IOS nhảy sang dev android

Những điểm nội bật và hạn chế của Kotlin

Kotlin nhận được nhiều sự quan tâm từ các nhà lập trình với sự tăng trưởng nhanh chóng trong thời gian ngắn. Vậy ngôn ngữ lập trình này có gì đặc biệt, những ưu điểm và hạn chế của Kotlin là gì?

1. Ưu điểm

Tương thích ngược với Java: Kotlin được thiết kế để tương thích hoàn toàn với mã nguồn Java. Điều này cho phép lập trình viên dễ dàng tích hợp Kotlin vào các dự án Java hiện có và sử dụng lại mã nguồn Java đã có mà không cần phải viết lại từ đầu.

An toàn null: Kotlin có tính năng “null safety” giúp giảm thiểu lỗi NullPointerException, một lỗi phổ biến trong lập trình Java. Kotlin đưa ra cú pháp cho phép khai báo kiểu dữ liệu không thể null, giúp tránh được các lỗi liên quan đến giá trị null và tăng cường tính ổn định của ứng dụng.

Cú pháp đơn giản và dễ đọc: Kotlin có cú pháp ngắn gọn và dễ đọc, giúp lập trình viên viết mã một cách dễ dàng và nhanh chóng. Cú pháp Kotlin cũng giúp làm giảm sự lặp lại mã và tăng cường tính rõ ràng trong việc hiểu mã nguồn.

Hỗ trợ lập trình hàm: Kotlin hỗ trợ lambda expression và higher-order functions, cho phép lập trình viên sử dụng các khái niệm lập trình hàm để viết mã ngắn gọn, linh hoạt và dễ dàng đọc hiểu. Điều này giúp tăng cường tính linh hoạt và mạnh mẽ của ngôn ngữ.

Cộng đồng phát triển sáng tạo và hỗ trợ mạnh mẽ: Kotlin có một cộng đồng lập trình viên đông đảo, sáng tạo và nhiệt tình. JetBrains, công ty phát triển Kotlin, cung cấp sự hỗ trợ mạnh mẽ và liên tục cho ngôn ngữ này, và cộng đồng cũng đóng góp vào việc phát triển và cải thiện Kotlin.

Được ưu tiên hỗ trợ trong Android Studio và IDE: Việc này mang lại lợi ích cho lập trình viên bằng cách cung cấp tính năng như hoàn thành mã thông minh, phân tích mã, refactoring dễ dàng, gỡ rối hiệu quả và cập nhật liên tục.

Việc làm Mobile Developer hấp dẫn nhất trên TopDev

2. Nhược điểm

Kích thước file và tài nguyên: Kotlin có xu hướng tạo ra các file.class lớn hơn so với mã nguồn Java tương đương. Điều này có thể làm tăng kích thước ứng dụng và tiêu tốn nhiều tài nguyên hơn.

Kích thước file và tài nguyên

Tài liệu và nguồn học tập: Mặc dù Kotlin đang trở nên phổ biến, nhưng so với Java, tài liệu và nguồn học tập về Kotlin vẫn còn hạn chế. Điều này có thể làm cho việc học và nắm bắt Kotlin khó khăn hơn đối với một số lập trình viên mới.

Tốc độ biên dịch: Kotlin có thể có tốc độ biên dịch chậm hơn so với Java, đặc biệt khi xử lý các tệp mã lớn. Điều này có thể ảnh hưởng đến thời gian phát triển và kiểm thử của ứng dụng.

Thời gian khởi động ứng dụng: Ứng dụng Kotlin có thể mất thời gian khởi động lâu hơn so với ứng dụng Java tương đương. Điều này có thể gây khó khăn đối với trải nghiệm người dùng khi khởi động ứng dụng.

  Tăng tốc lập trình Android với Kotlin

Kotlin và Java khác nhau như thế nào?

Kotlin và Java khác nhau như thế nào?

Sự khác biệt giữa Java và Kotlin là gì? Dưới đây là một bảng so sánh các khía cạnh chính giữa Java và Kotlin:

Java Kotlin
Cú pháp Cú pháp dài và lặp lại Cú pháp ngắn gọn, ít lặp lại
Nullable Types Không hỗ trợ nullable types Hỗ trợ nullable types
Extension Functions Không hỗ trợ Hỗ trợ extension functions
Lambda Expressions Cú pháp dài và phức tạp Cú pháp ngắn gọn và dễ đọc
Tương thích Đầy đủ và tương thích ngược Hoàn toàn tương thích với Java
Hỗ trợ IDE IDE tốt (Eclipse, IntelliJ) IDE tốt, ưu tiên hỗ trợ trong Android Studio
Sự phát triển Đã có từ lâu và mạnh mẽ Phát triển nhanh, ngày càng phổ biến
Cộng đồng hỗ trợ Rộng lớn và phát triển Hỗ trợ cộng đồng đang tăng, nhưng còn hạn chế

Lưu ý rằng bảng so sánh này chỉ tóm tắt một số khác biệt chính giữa Java và Kotlin. Mỗi ngôn ngữ có những ưu điểm và hạn chế riêng, và lựa chọn ngôn ngữ phụ thuộc vào yêu cầu cụ thể của dự án và sở thích của lập trình viên.

Kết luận

Kotlin là một ngôn ngữ lập trình đa nền tảng mạnh mẽ và đang phát triển nhanh chóng. Với cú pháp ngắn gọn, tính năng an toàn kiểu dữ liệu, hỗ trợ tốt cho lập trình hướng đối tượng, Kotlin đã thu hút sự quan tâm của cộng đồng phát triển phần mềm. Thêm nữa, khả năng tương thích ngược với Java, sự ưu tiên hỗ trợ trong các công cụ như Android Studio và IDE, cùng với cộng đồng ngày càng phát triển, đã làm cho Kotlin trở thành một lựa chọn hấp dẫn cho việc phát triển ứng dụng đa nền tảng.

Hy vọng rằng bài viết này đã giúp bạn hiểu Kotlin là gì. Và không còn nghi ngờ gì nữa, Kotlin đã tạo ra một sự lan tỏa tích cực trong cộng đồng lập trình và đang trở thành một ngôn ngữ lập trình đầy tiềm năng cho tương lai.

TopDev tổng hợp

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

 

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

Câu hỏi phỏng vấn RPA Engineer nhất định bạn phải biết!

Câu hỏi phỏng vấn RPA Engineer nhất định bạn phải biết!

RPA là một xu hướng mới và đang hot trong giới công nghệ thời gian gần đây, được xem là một trong những giải pháp chủ chốt của Digital Business Automation triển khai cho các khách hàng doanh nghiệp. Chính vì thế mà nhu cầu tuyển dụng kỹ sư xây dựng phần mềm tự động hóa RPA Engineer hiện tại đang khá cao trên thị trường. Bài viết hôm nay chúng ta cùng nhau tìm hiểu top những câu hỏi phỏng vấn vị trí RPA Engineer thường gặp nhé.

Sự khác biệt giữa AI và RPA là gì?

Sự khác biệt giữa AI và RPA là gì?

AI (Artificial Intelligence) là công nghệ mô phỏng lại bộ não của con người về việc lấy một lượng lớn dữ liệu, tự cập nhật cho phù hợp để có thể học hỏi, tiếp thu sau đó xử lý các dữ liệu mới hay đưa ra các dự đoán và phản hồi tương ứng. 

Đối với RPA, mục đích là xử lý tốt các công việc lặp đi lặp lại dựa trên những thứ (chương trình, logic,…) được nạp vào sẵn mà không có khả năng nhận diện hay xử lý những thứ mới. Hay nói cách khác RPA không có sự thông minh của AI.

UiPath là gì?

UiPath là công cụ tự động hóa RPA phổ biến nhất hiện nay. UiPath cũng là tên của công ty chuyên sản xuất phần mềm tự động hóa quy trình bằng robot sở hữu phần mềm UiPath, giúp hỗ trợ người dùng tự động hóa quy trình bằng cách xây dựng các ứng dụng RPA trên nền tảng ngôn ngữ lập trình C#.

Các tính năng nổi bật của UiPath bao gồm:

  • Cung cấp phần mềm tự động hóa miễn phí: UiPath Community Edition
  • Hỗ trợ phát triển ứng dụng nhanh (RAD)
  • Khả năng tương thích cao: hoạt động trên máy tính để bàn (desktop), SAP, Mainframe và ứng dụng Web
  • Hỗ trợ nhiều tùy chọn lưu trữ: cloud, máy ảo và dịch vụ đầu cuối

  RPA Career Talk: Triển vọng và công việc của RPA Developer

  Trí tuệ nhân tạo (Artificial Intelligence) và cơn đau tim (Heart Attack)

Những tác vụ nào có thể sử dụng RPA để thay thế

RPA thường được sử dụng để tự động hóa các tác vụ có một hoặc nhiều đặc tính như dưới đây:

  • Tác vụ có thao tác lặp đi lặp lại theo những quy tắc nhất định
  • Tác vụ có dữ liệu được cấu trúc rõ ràng
  • Tác vụ có nghiệp vụ đã được chuẩn hóa
  • Tác vụ đòi hỏi nhiều nhân sự tham gia và dễ xảy ra lỗi do con người gây ra

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

Những ngành ứng dụng RPA phổ biến hiện nay

Những ngành ứng dụng RPA phổ biến hiện nay

RPA với ưu điểm của nó sẽ phù hợp với một số ngành nhất định, cụ thể:

  • Tài chính và ngân hàng: Các tác vụ như mở tài khoản, xác minh KYC,… với quy trình rõ ràng, làm việc với nhiều dữ liệu sẽ thích hợp để xây dựng ứng dụng RPA giúp thực hiện nhanh chóng và chính xác.
  • Lĩnh vực sản xuất/bán lẻ: Các bot phần mềm hữu ích với các tác vụ như xử lý hóa đơn, xử lý đơn hàng,… giúp giảm chi phí thuê nhân sự.
  • Lĩnh vực viễn thông: RPA giúp xử lý các tác vụ thanh toán, giải đáp thắc mắc khách hàng hay giúp việc quản lý sự cố trở nên dễ dàng hơn.
  • Lĩnh vực Logistics: Các tác vụ xử lý đơn hàng, theo dõi vận chuyển sẽ được tự động hóa nhờ các ứng dụng RPA.

Những lợi ích dành cho doanh nghiệp khi áp dụng RPA

Tùy vào ngành nghề kinh doanh của doanh nghiệp mà việc áp dụng RPA có những lợi ích khác nhau, cụ thể như sau:

  • Tiết kiệm chi phí: doanh nghiệp triển khai RPA có khả năng cắt giảm chi phí nhân sự, chi phí vận hành, chi phí xử lý lỗi phát sinh,… từ đó tối ưu được lợi nhuận.
  • Tăng năng suất: RPA cho phép tinh gọn các quy trình doanh nghiệp, giúp gia tăng năng suất xử lý công việc.
  • Nâng cao độ chính xác: Robot luôn tuân thủ quy trình với mức ổn định cao nên sẽ giảm được lỗi trong quá trình thực hiện tác vụ.
  • Hoạt động liên tục, không gián đoạn: Các bot phần mềm có khả năng hoạt động 24/7, ngoài thời gian bảo trì định kỳ thì có thể xem như hệ thống hoạt động một cách liên tục.
  • Giúp nhân viên tập trung vào công việc giá trị hơn: nhân sự sẽ có nhiều thời gian cho các tác vụ cần sự sáng tạo, cải tiến trong công việc; giảm bớt các tác vụ lặp đi lặp lại gây nhàm chán và giảm năng suất.

RPA là gì? Lập trình viên RPA làm công việc gì?

RPA – Robotic Process Automation là tâp hợp các công nghệ nhằm xây dựng các phần mềm làm thay đổi công việc của con người trên máy tính, với hiệu suất, độ chính xác cao hơn cũng như có khả năng theo dõi, đánh giá và nâng cấp được.

Hiểu một cách đơn giản hơn thì RPA cung cấp khả năng xây dựng các nhân công “Robot” làm thay việc của một nhân công “người” cho cùng một công việc; mang lại khả năng vận hành với công suất cao hơn, tốc độ, độ chính xác tốt hơn.

Lập trình viên RPA làm công việc gì?

Cách thức hoạt động của RPA là hoạt động trên tầng giao diện của trình duyệt (Web), phần mềm,… mô phỏng tương tác của con người trên giao diện đồ họa người dùng (Graphic User Interface) giữa các hệ thống khác nhau. Lập trình viên có vai trò xây dựng các quy trình cụ thể để phần mềm (Robot) mô phỏng những tương tác trên; trong trường hợp thay đổi quy trình; lập trình viên cũng là người chỉnh sửa lại “Robot” để đáp ứng, đảm bảo hoạt động vận hành.

Ngôn ngữ lập trình sử dụng trong RPA

Nền tảng RPA (RPA Platform) thường được xây dựng trên các công cụ khác nhau và tùy vào ngôn ngữ bạn có thể lựa chọn một số nền tảng như dưới đây:

  • Python: Python có rất nhiều thư viện, công cụ tích hợp và modules dành cho các tác vụ tự động hóa khác nhau. 2 thư viện phổ biến là Pandas dành cho các tác vụ sắp xếp và dọn dẹp dữ liệu; PyAutoGUI dùng để tự động hóa GUI.
  • C# .NET: bạn có thể sử dụng phần mềm UiPath hay Automation Anywhere’s – 2 trong số những công cụ xây dựng ứng dụng RPA phổ biến nhất hiện nay
  • Java: Công cụ Automation Anywhere’s cũng cho phép bạn lập trình bằng ngôn ngữ Java
  • Ngoài ra lập trình viên RPA cũng có thể lựa chọn những phần mềm, công cụ chuyên biệt phổ biến như: Blue Prism, Power Automate, Robocorp, …

Kết bài

Trên đây là danh sách những câu hỏi phỏng vấn dành cho vị trí RPA Engineer thường gặp. Hy vọng bài viết này hữu ích dành cho những bạn có dự định tìm kiếm một vị trí mới cho công việc là kỹ sư RPA. Cảm ơn các bạn đã đọc bài 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 tuyển dụng IT mới nhất tại TopDev

3 cách truyền dữ liệu giữa các Components trong Vue.js

3 cách truyền dữ liệu giữa các Components trong Vue.js

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

Dù ở bất cứ hoàn cảnh nào, việc “giao thương” qua lại là không thể tránh khỏi. Trong ứng dụng Vue.js cũng vậy. Có rất nhiều cách khác nhau để chia sẻ dữ liệu giữa các components. Tùy vào từng tình huống mà giải pháp chia sẻ dữ liệu mà bạn chọn là tốt nhất.

Chia sẻ dữ liệu giữa các components là một tính năng cốt lõi của Vue.js. Nó cho phép bạn module hóa, kiểm soát phạm vi dữ liệu và tạo một luồng trao đổi dữ liệu an toàn trong ứng dụng.

Qua bài viết này, mình sẽ chia sẻ 3 cách để truyền dữ liệu giữa các Components:

  • Sử dụng props để truyền dữ liệu từ component cha xuống component con.
  • Emitting event để chia sẻ ngược lại từ component con lên component cha.
  • Sử dụng Vuex để chia sẻ dữ liệu cho toàn ứng dụng.

Okay, bắt đầu thôi!

1. Sử dụng Props để truyền dữ liệu từ component cha xuống component con

VueJS props là cách đơn giản nhất để truyền dữ liệu giữa các Components. Hiểu đơn giản props là thuộc tính do chính chúng ta tạo ra (khác với thuộc tính do nhà phát hành vue tạo sẵn).

Sau đó, trong template, chúng ta cung cấp giá trị thông qua thuộc tính tùy chỉnh đó. Như vậy là bạn đã thực hiện chia sẻ dữ liệu giữa các component rồi đấy.

Để dễ hình dung hơn, mình sẽ lấy một ví dụ thế này: Chúng ta có một trang Profile người dùng, trong đó có thông tin về tài khoản của người đó. Với yêu cầu này, mình sẽ tạo 2 components:  AccountInfo.vue và ProfilePage.vue.

Trong AccountInfo.vue, mình sẽ khai báo props, trong đó có thuộc tính username. Kiểu như bên dưới:

//AccountInfo.vue

<template>
 <div id='account-info'>
   {{ userName }}
 </div>
</template>

<script>
export default {
 props: {
    userName: String

 }
}
</script>

Sau đó, để truyền dữ liệu từ component cha (ProfilePage.vue), chúng ta truyền dữ liệu kiểu như sau:

// ProfilePage.vue
<account-info userName='matt' />

Trong Vue.js có các VueJS directives khá hay ho. Ví dụ, bạn có thể sử dụng v:bind để truyền động giá trị cho props.

Ở trong ví dụ trên, giả sử mình muốn gán trị cho userName props thông qua một biến. Chúng ta có thể thực hiện điều này bằng cách sử dụng v:bind.

<template>
 <div>
  <account-info :username="user.username" />
 </div>
</template>

<script>
import AccountInfo from "@/components/AccountInfo.vue";

export default {
 components: {
   AccountInfo
 },
 data() {
   return {
     user: {
       username: 'matt'
     }
   }
  }
}
</script>

Nhân tiện đây, mình có một vài lưu ý về cách sử dụng Props trong Vue.js

  Sự kiện cầu nối trong giao tiếp giữa các Vue.js component

  Một vài pattern để viết component của React cần dùng chung state

#Luôn luôn verify các thuộc tính khi định nghĩa Props

Nếu bạn đang trăn trở về cách viết mã nguồn Vue sao cho sạch đẹp hơn, hãy nhớ tới một quy tắc quan trọng: luôn verify props.

Nói một cách ngắn gọn, tức là bạn luôn cần phải định nghĩa rõ ràng kiểu dữ liệu cho props. Nếu sau này khi sử dụng props đó mà bạn truyền sai kiểu dữ liệu, Vue sẽ cảnh báo.

Không nên
// Như thế này chỉ OK khi viết prototype
props: [' userName ']

Nên
props: {
  userName: String
}

Verifying props là công việc cần thiết khi xây dựng hệ thống lớn, hoặc thiết kế plugin cho ứng dụng khác. Điều này đảm bảo tất cả mọi người đều phải tuân theo quy tắc mà nhà thiết kế đã quy định.

#Đặt tên cho props theo chuẩn camelCase

Theo như hướng dẫn của chính nhà phát hành Vue, họ khuyến khích đặt tên Component, props theo chuẩn camelCase. Lý do đơn giản là trong Javascript, camelcase là quy ước đặt tên tiêu chuẩn.

// Nên
<account-info :my-username="user.username" />
props: {
   myUsername: String
}

// Không nên
<account-info :myUsername="user.username" />
props: {
   "my-username": String
}

Tham khảo việc làm React mới nhất trên TopDev

2. Emitting Events để chia sẻ ngược lại từ component con lên component cha.

Với cách sử dụng props, bạn có thể truyền dữ liệu từ cha cho con. Thế component con muốn “biếu” lại gì đó cho component cha thì sao?

Với trường hợp này, chúng ta không thể sử dụng props được. Tất nhiên là Vue có giải pháp thay thế rồi. Đó chính là sử dụng custom events và listeners.

Trong mỗi Vue instance, bạn đều có thể sử dụng hàm .$emit(eventName) để trigger một event. Và chúng ta sẽ tận dụng kỹ thuật này để truyền dữ liệu.

#Tạo một custom event

Quay lại ví dụ về trang profile trên, chúng ta cần một button để thay đổi username. Khi nhấn vào button này, chúng ta sẽ phát một event: changeUsername

<template>
 <div id='account-info'>
   <button @click='changeUsername()'>Change Username</button>
   {{username}}
 </div>
</template>

<script>
export default {
 props: {
   username: String
 },
 methods: {
   changeUsername() {
     this.$emit('changeUsername')
   }
 }
}
</script>

Bên trong component cha (ProfilePage.vue), chúng ta sẽ bắt event đó và thay đổi giá trị của biến user.username.

<template>
 <div>
   <account-info :username="user.username" @changeUsername="user.username = 'new name'"/>
 </div>
</template>

3. Sử dụng Vuex

Qua 2 giải pháp trên, chúng ta đã biết cách chia sẻ dữ liệu giữa các component “trong cùng một gia đình, giữa cha và con”… Thế còn “người ngoài” thì sao? Chúng ta có phải tạo ra một hệ thống phân cấp thật phức tạp, bao phủ toàn bộ ứng dụng để truyền dữ liệu?

Rất may không cần. Thư viện quản lý state Vuex sẽ đơn giản hóa việc truyền dữ liệu. Vuex sẽ tạo một kho lưu trữ dữ liệu mà bất kì component nào cũng có thể lấy và sử dụng được. Kho lưu trữ này được gọi là store.

Vuex là gì

Vuex là thư viện được tách ra từ Vue Core. Mục đích của thư viện Vuex là giúp quản lý state của các component trong Vue.js. Về một khía cạnh nào đó, Vuex khá tương đồng với Redux trong ReactJS. Nguyên tắc của Vuex là state chỉ có thể được thay đổi theo kiểu có thể dự đoán được.

Thư viện vuex không được tích hợp mặc định trong Vue, bạn muốn sử dụng nó thì cần phải cài đặt.

npm install vuex --save

Sau đó, trong thư mục src, bạn tạo thêm thư mục store. Tiếp tục tạo tệp index.js trong thư mục store.

// src/store/index.js

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store({
 state: {},
 getters: {},
 mutations: {},
 actions: {}
});

Tiếp theo, bạn cần khai báo store với Vue instance gốc.

// main.js

import store from "./store";

new Vue({
  store,
      ...

Để các bạn có thể hiểu rõ hơn về Vuex, cũng như cách sử dụng, chúng ta sẽ   cùng tìm hiểu 4 thành phần chính của Vuex store: State, Getters, Mutations, Actions.

#State

Vuex state là một object chứa dữ liệu được chia sẻ cho toàn ứng dụng. Tất cả Vue instances đều có thể truy cập được dữ liệu này.

Ví dụ:

export default new Vuex.Store({
 state: {
   user: {
     username: 'matt',
     fullName: 'Matt Maribojoc'
   }
 },
 getters: {},
 mutations: {},
 actions: {}
});

Và ở bất kỳ component nào cũng truy cập được, kiểu như thế này:

mounted () {
   console.log(this.$store.state.user.username);
},

#Getters

Chúng ta sử dụng Vuex getters để trả về dữ liệu đã được thay đổi từ giá trị khai báo trong state data. Một case sử dụng phổ biến nhất đó là coi getter như là các thuộc tính đã được tính toán theo mục đích nào đó.

Như trong ví dụ trên, mình muốn lấy first name từ full name của người dùng.

getters: {
   firstName: state => {
     return state.user.fullName.split(' ')[0]
   }
}

Sau đó thì chúng ta có thể sử dụng thuộc tính getter này như bình thường.

mounted () {
   console.log(this.$store.getters.firstName);
}

Mặc định Vuex getters chấp nhận 2 tham số:

  • state: là state object của ứng dụng.
  • getters: là store.getters object – tức là chúng ta có thể gọi getter của một store khác.

Mỗi getter mặc định sẽ có tham số đầu tiên (state). Còn tùy vào thiết kế, yêu cầu bài toán cụ thể mà bạn có thể cần tới tham số thứ 2 (getters).

Ok, lại lấy ví dụ trên, mình tạo getter lấy last name từ full name và first name.

lastName (state, getters) {
     return state.user.fullName.replace(getters.firstName, '');
}

#Mutations

Mutations là cách duy nhất để thay đổi giá trị của state object. Một chi tiết quan trọng của mutations đó là Mutations phải là synchronous.

Giống như getters, Mutations cũng chấp nhận 2 tham số:

  • State: là state object của ứng dụng.
  • Payload: là giá trị bạn muốn truyền vào cho mutations

Ví dụ:

mutations: {
   changeName (state, payload) {
     state.user.fullName = payload
   }
},

Để gọi Mutations trong component bất kỳ, chúng ta sử dụng hàm commit.

this.$store.commit("changeName", "New Name");

#Actions

Trong Vuex, các actions có cách hoạt động khá giống với Mutation, bởi vì chúng đều được sử dụng để thay đổi state. Tuy nhiên, actions không trực tiếp thay đổi giá trị của state. Thay vào đó, actions sẽ commit các mutations.

Ngoài ra, trong khi mutations phải là hàm đồng bộ, actions thì không bắt buộc như vậy.

Trong hầu hết các trường hợp thì Vuex chấp nhập state là tham số chính, actions còn chấp nhận Context làm tham số. Với Context, chúng cho phép truy cập vào các thuộc tính của Vuex store (ví dụ: state, commit, getters).

Dưới đây là ví dụ về actions: đợi 2 giây rồi commit một changeName mutation.

actions: {
   changeName (context, payload) {
     setTimeout(() => {
       context.commit("changeName", payload);
     }, 2000);
   }
}

Tạm kết

Qua bài viết này, mình đã giới thiệu 3 cách để bạn có truyền dữ liệu giữa các Components: props, custom events, và Vuex store Tùy vào hoàn cảnh, thiết kế của ứng dụng mà bạn chọn cách làm phù hợp. Cũng có thể trong ứng dụng, bạn phải sử dụng cả 3 cách làm này.

Mình hi vọng, các bạn sẽ hiểu thêm về Vue, về Vuex. Hãy để lại bình luận của bạn ở bên dưới nhé. Mình luôn luôn chờ ý kiến của bạn.

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

Xem thêm:

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

IT cần rèn luyện kỹ năng làm việc nhóm như thế nào?

IT cần rèn luyện kỹ năng làm việc nhóm như thế nào?

Trong thời đại công nghệ số, ngành công nghệ thông tin (IT) đã trở thành một lĩnh vực quan trọng và không thể thiếu trong hầu hết các doanh nghiệp và tổ chức. Với sự phát triển nhanh chóng của công nghệ và sự phức tạp ngày càng tăng của các dự án IT, khả năng làm việc nhóm đã trở thành một yếu tố quyết định đến thành công trong ngành này. Điều đó đặt ra câu hỏi: IT cần rèn luyện kỹ năng làm việc nhóm như thế nào?

Hãy cùng tìm hiểu trong bài viết này nhé!

Lợi ích của kỹ năng làm việc nhóm trong lĩnh vực IT

kỹ năng làm việc nhóm trong lĩnh vực IT

Kỹ năng làm việc nhóm là một yếu tố quan trọng trong lĩnh vực công nghệ thông tin (IT) và mang lại nhiều lợi ích đáng kể. Dưới đây là một số lợi ích của việc phát triển kỹ năng làm việc nhóm trong lĩnh vực IT:

  • Tăng hiệu suất làm việc: Lĩnh vực IT thường liên quan đến các dự án phức tạp và đòi hỏi sự phối hợp giữa nhiều thành viên trong nhóm. Kỹ năng làm việc nhóm giúp tăng hiệu suất làm việc bằng cách phân chia công việc, tận dụng tài năng và kiến thức của từng thành viên để tạo ra một quy trình làm việc hợp lý.
  • Khả năng giải quyết vấn đề: Khi làm việc nhóm, các thành viên có thể cùng nhau tư vấn, trao đổi ý kiến và tìm ra các giải pháp sáng tạo cho những vấn đề này. Sự kết hợp của các ý kiến và kiến thức khác nhau giúp tăng cường khả năng tư duy đa phương diện và đưa ra quyết định tốt hơn.
  • Phát triển kỹ năng mềm: Giao tiếp hiệu quả, lãnh đạo, quản lý thời gian, khả năng làm việc trong môi trường đa dạng và linh hoạt là những kỹ năng mềm quan trọng mà bạn nên phát triển.
  • Tạo sự sáng tạo và đổi mới: Việc làm việc nhóm trong lĩnh vực IT tạo ra một môi trường đa ngành, nơi mà các ý tưởng mới có thể được thảo luận, chia sẻ và kích thích. Những điều này sẽ thúc đẩy sự sáng tạo và đổi mới, giúp nhóm IT tạo ra các giải pháp mới và nâng cao chất lượng công việc.
  • Xây dựng mối quan hệ và tăng cường tinh thần đồng đội: Làm việc trong một nhóm IT tạo ra cơ hội để xây dựng mối quan hệ đồng đội mạnh mẽ. Mối quan hệ tốt và tinh thần đồng đội sẽ thúc đẩy sự hỗ trợ và sự hài lòng trong công việc.

  Kỹ năng giao tiếp? Làm thế nào để cải thiện giao tiếp hiệu quả?

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

IT cần rèn luyện kỹ năng làm việc nhóm như thế nào?

Để rèn luyện kỹ năng làm việc nhóm trong lĩnh vực IT, dưới đây là một số phương pháp  giúp bạn tiến bộ và trở thành một thành viên nhóm IT hiệu quả:

Tìm hiểu về môi trường làm việc nhóm trong IT: Nắm vững cách thức làm việc, quy trình và công nghệ được sử dụng trong team. Hiểu rõ vai trò của từng thành viên, nguyên tắc giao tiếp và quy định của dự án.

Giao tiếp hiệu quả: Kỹ năng giao tiếp là yếu tố quan trọng trong làm việc nhóm. Hãy lắng nghe mọi ý kiến và đặt câu hỏi để hiểu rõ hơn. Sử dụng cách giao tiếp rõ ràng, trôi chảy và tự tin.

kỹ năng làm việc nhóm trong lĩnh vực IT
Kỹ năng giao tiếp tốt giúp quá trình làm việc nhóm hiệu quả hơn rất nhiều

Phối hợp và chia sẻ kiến thức: Hãy chia sẻ kiến thức, kinh nghiệm và tài nguyên của mình với các thành viên khác trong nhóm. Tìm hiểu cách làm việc của từng thành viên và tận dụng tài năng của họ để cùng nhau đạt được mục tiêu chung.

Phân công công việc: Hãy phân công công việc một cách công bằng và hiệu quả. Xác định rõ nhiệm vụ và trách nhiệm của từng thành viên. Đồng thời, hãy tạo cơ hội cho các thành viên tham gia vào các dự án khác nhau để mở rộng kỹ năng và kiến thức của họ.

Việc làm IT Fresher dành cho bạn

kỹ năng làm việc nhóm trong lĩnh vực IT
Phân công nhiệm vụ phù hợp với năng lực từng người làm tăng hiệu quả công việc

Xây dựng lòng tin và tạo động lực: Tạo một môi trường làm việc thoải mái và đồng đều giữa các thành viên. Đồng thời, tạo động lực cho các thành viên thông qua việc công nhận thành tựu, khích lệ và hỗ trợ khi gặp khó khăn.

Thực hành qua các dự án thực tế: Để rèn luyện kỹ năng làm việc nhóm, không có gì tốt hơn là thực hành qua các dự án thực tế. Tham gia vào các dự án trong công ty, tổ chức hoặc tham gia các dự án mã nguồn mở để áp dụng và cải thiện kỹ năng làm việc nhóm của mình.

Học hỏi từ người khác: Tận dụng cơ hội xây dựng mạng lưới và học hỏi từ những người thành công trong ngành IT. Tham gia vào các cộng đồng trực tuyến, hội thảo, sự kiện và gặp gỡ những người có kinh nghiệm trong làm việc nhóm trong lĩnh vực IT. Họ có thể chia sẻ những bài học quý báu và gợi ý để phát triển kỹ năng làm việc nhóm của bạn.

Kết luận

Kỹ năng làm việc nhóm đóng vai trò quan trọng trong lĩnh vực công nghệ thông tin (IT). Nó không chỉ giúp tăng hiệu suất làm việc và khả năng giải quyết vấn đề mà còn phát triển các kỹ năng mềm quan trọng như giao tiếp, lãnh đạo, và quản lý thời gian. Hy vọng câu hỏi IT cần rèn luyện kỹ năng làm việc nhóm như thế nào đã có lời giải đáp.

Với sự phát triển không ngừng của công nghệ thông tin, kỹ năng làm việc nhóm trở thành yếu tố quan trọng giúp đảm bảo thành công của các dự án và tạo nên một môi trường làm việc tốt đẹp. Hãy nắm bắt và rèn luyện kỹ năng này để đạt được thành công và góp phần vào sự phát triển của ngành công nghệ thông tin.

TopDev tổng hợp

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

Xem thêm Top vị trí tuyển dụng IT trên TopDev