Home Blog Page 55

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

Tác giả: Jonathan Saring

Chúng ta đang sống trong thời đại bùng nổ dữ liệu, khi gần như mọi ứng dụng chúng tôi phát triển sử dụng hoặc tận dụng dữ liệu hoặc các thư viện JavaScript để cải thiện trải nghiệm được phân phối cho người dùng.

Đôi khi, tính năng tốt nhất mà chúng tôi có thể cung cấp cho người dùng chính là dữ liệu. Tuy nhiên, biểu đồ bảng và số thường gây khó khăn để đọc và khó để có được những hiểu hết những thông tin chi tiết và hữu ích từ các bảng dữ liệu lớn.

Thay vào đó, chúng ta có thể sử dụng các phương pháp trực quan hóa dữ liệu gọn gàng nhằm tận dụng khả năng nhận biết và xử lý dữ liệu của bộ não theo cách trực quan. Để giúp bạn bắt đầu và dễ dàng trực quan hóa dữ liệu của ứng dụng yêu thích của bạn một cách sống động và bắt mắt, dưới đây là một số thư viện trực quan hóa dữ liệu Javascript tốt nhất trong năm 2024 (chưa được đánh giá).

1. D3js

Với 80k sao, D3.js có lẽ là thư viện trực quan hóa dữ liệu JavaScript phổ biến và rộng rãi nhất hiện có. D3 được xây dựng để thao tác các tài liệu dựa trên dữ liệu và hiển thị dữ liệu bằng cách sử dụng HTML, SVG và CSS.

Điểm chú ý của D3 về các tiêu chuẩn web là cung cấp cho bạn khả năng của các trình duyệt hiện đại mà không cần sử dụng chung với một framework độc quyền nào, kết hợp các thành phần trực quan hóa và cách tiếp cận hướng dữ liệu đến thao tác DOM. Nó cho phép bạn liên kết dữ liệu tùy ý với một Document Object Model (DOM), và sau đó áp dụng các biến đổi theo hướng dữ liệu cho tài liệu. Đây là một thư viện mẫu tuyệt vời.

Lưu ý: một số người nói D3 không phải là thư viện trực quan hóa dữ liệu … 🙂

2. ChartJS

Một thư viện cực kì phổ biến (40k sao) của các dự án mã nguồn mở HMTL5 về biểu đồ cho các ứng dụng web responsive sử dụng canvas element. V.2 cung cấp các loại biểu đồ hỗn hợp, loại trục biểu đồ mới và hoạt ảnh đẹp. Thiết kế đơn giản và thanh lịch với 8 loại biểu đồ cơ bản và bạn có thể kết hợp thư viện với moment.js cho trục thời gian. Bạn cũng có thể xem thư viện trên cdnjs.

Tham khảo tuyển dụng javascript lương cao trên TopDev

3. ThreeJS

Thư viện cực kỳ phổ biến này (45K sao; 1K đóng góp) được xây dựng để tạo hoạt ảnh 3D bằng WebGL. Bản chất linh hoạt và trừu tượng của dự án có nghĩa là nó cũng hữu ích cho việc hiển thị dữ liệu trong 2 hoặc 3 chiều.

Ví dụ: Bạn cũng có thể sử dụng mô-đun được chỉ định này để hiển thị đồ thị 3D bằng WebGL hoặc thử online playground này. Một lựa chọn thú vị để xem xét.

4. Echarts & Highcharts

Dự án Echarts của Baidu (30k sao) là một thư viện biểu đồ và trực quan tương tác cho trình duyệt. Nó được viết bằng JavaScript thuần túy và dựa trên thư viện canvas zrender. Nó hỗ trợ xây dựng các biểu đồ dưới dạng Canvas, SVG (4.0+) và VML ngoài PC và trình duyệt di động, ECharts cũng có thể được sử dụng với nút-canvas trên nút để hiển thị phía máy chủ hiệu quả (SSR). Đây là một liên kết đến thư viện mẫu đầy đủ, trong đó mỗi ví dụ có thể được sử dụng với (và theo chủ đề) trong một interactive playground.

Highcharts JS với 8K sao là thư viện biểu đồ JavaScript phổ biến rộng rãi dựa trên SVG, với phương án dự phòng cho VML và canvas với các trình duyệt cũ. Nó tuyên bố đã được sử dụng bởi 72 trong số 100 công ty lớn nhất thế giới, khiến cho nó (có thể) là API biểu đồ JS phổ biến nhất trên thế giới (Facebook, Twitter).

Có thể bạn muốn xem: Việc làm lập trình Javascript

5. Metric-Graphics

MetricsGraphics.js (7k sao) là một thư viện được tối ưu hóa để hiển thị và xuất dữ liệu chuỗi thời gian. Nó tương đối nhỏ (80kb minified), và cung cấp một lựa chọn hạn chế nhưng thanh lịch cho các biểu đồ đường, điểm phân tán, histograms, biểu đồ thanh và data tables, cũng như các tính năng như rug plots và hồi quy tuyến tính cơ bản. Đây là liên kết đến thư viện mẫu tương tác.

6. Recharts

Recharts là một thư viện biểu đồ được xây dựng với React và D3 cho phép bạn triển khai như khai báo các React component. Thư viện cung cấp hỗ trợ SVG gốc, cây phụ thuộc nhẹ (các mô đun phụ D3) có thể tùy biến cao thông qua các component props.

Bạn có thể tìm thấy các ví dụ trực tiếp trên trang web tài liệu.

7. Raphael

10k sao cho một thư viện vector JavaScript để làm việc với đồ họa vector trong web. Thư viện sử dụng SVG W3C Recommendation và VML làm cơ sở để tạo đồ họa, vì vậy mọi đối tượng đồ họa cũng là đối tượng DOM và bạn có thể đính kèm trình xử lý sự kiện JavaScript. Raphaël hiện hỗ trợ Firefox 3.0+, Safari 3.0+, Chrome 5.0+, Opera 9.5+ và Internet Explorer 6.0+.

8. C3js

Với 8k sao, C3 là một thư viện biểu đồ tái sử dụng dựa trên D3 cho các ứng dụng web. Thư viện cung cấp các lớp cho mọi phần tử để bạn có thể định nghĩa một kiểu tùy chỉnh theo lớp và mở rộng cấu trúc trực tiếp bằng D3. Nó cũng cung cấp một loạt các API và gọi lại để truy cập trạng thái của biểu đồ. Bằng cách sử dụng chúng, bạn có thể cập nhật biểu đồ ngay cả khi biểu đồ được hiển thị. Hãy xem những ví dụ này.

9. React Virtualized + React Vis + Victory

React-vis (4k sao) là tập hợp các component React của Uber để hiển thị dữ liệu một cách nhất quán, bao gồm biểu đồ đường / khu vực / thanh, bản đồ nhiệt, ô tán xạ, ô đường viền, bản đồ hình lục giác và nhiều hơn nữa. Thư viện không yêu cầu bất kỳ kiến ​​thức nào trước đây với D3 hoặc bất kỳ thư viện dữ liệu nào khác, và cung cấp các thành phần khối xây dựng mô-đun cấp thấp như trục X / Y. Một sự kết hợp tuyệt vời để làm việc với Bit và một thư viện rất hữu ích để xem xét.

React virtualized (12k sao) là một tập hợp các React component để hiển thị một cách hiệu quả các danh sách lớn và dữ liệu dạng bảng. Các bản dựng ES6, CommonJS và UMD có sẵn với mỗi bản phân phối và dự án hỗ trợ luồng công việc Webpack 4. Lưu ý rằng react, react-dom phải được xác định là phụ thuộc ngang hàng để tránh xung đột phiên bản. Hãy thử một lần.

Victory là bộ sưu tập các React composable React components để xây dựng trực quan dữ liệu tương tác, được xây dựng bởi Formidable Labs và với hơn 6k sao. Victory sử dụng cùng một API cho web và ứng dụng React Native để dễ dàng lập biểu đồ đa nền tảng. Một cách thanh lịch và linh hoạt để tận dụng các thành phần React có lợi cho việc trực quan hóa dữ liệu thực tế.

Các thư viện này là sự kết hợp gọn gàng với Bit khi sử dụng các thành phần riêng lẻ, để chia sẻ và đồng bộ hóa chúng giữa các ứng dụng.

10. CartoDB

Với 2k sao, Carto là công cụ trực quan hóa thông minh vị trí & dữ liệu để khám phá thông tin chi tiết bên dưới dữ liệu vị trí. Bạn có thể tải lên dữ liệu không gian địa lý (Shapefiles, GeoJSON, v.v.) bằng cách sử dụng biểu mẫu web và trực quan hóa nó trong tập dữ liệu hoặc trên bản đồ, tìm kiếm nó bằng SQL và áp dụng kiểu bản đồ bằng CartoCSS. Dưới đây là một loạt các bản demo video để giúp bạn có được ý tưởng và bắt đầu.

11. Các biểu đồ raw 

Trên 5k sao, Raw là liên kết kết nối giữa bảng tính và trực quan hóa dữ liệu được xây dựng để tạo các hình ảnh dựa trên vector tùy chỉnh ở phía trên thư viện d3.js. Nó hoạt động với dữ liệu dạng bảng (bảng tính và các giá trị được phân tách bằng dấu phẩy) cũng như các văn bản được sao chép và dán từ các ứng dụng khác. Dựa trên định dạng SVG, các hình ảnh trực quan có thể được chỉnh sửa bằng các ứng dụng đồ họa vector để tinh chỉnh thêm, hoặc nhúng trực tiếp vào các trang web. Đây là một thư viện mẫu để khám phá trước khi tìm hiểu sâu.

12. Metabase

Với hơn 11k sao, Metabase rất nhanh chóng và đơn giản để tạo ra các bảng dữ liệu mà không biết SQL (nhưng với chế độ SQL cho các nhà phân tích và các chuyên gia dữ liệu). Bạn có thể tạo phân đoạn và chỉ số chuẩn, gửi dữ liệu tới Slack (và xem dữ liệu trong Slack với MetaBot) và hơn thế nữa. Có lẽ là một công cụ tuyệt vời để trực quan hóa dữ liệu nội bộ cho nhóm của bạn, mặc dù một số bảo trì có thể được yêu cầu.

Trên đây là những thông tin được TopDev Blog tổng hợp. Hy vọng sẽ có những kiến thức hữu ích cho các độc giả, nếu các bạn có góp ý các thông tin gì mới hơn, inbox hoặc note lại giúp ad để được cập nhật thông tin tốt nhất đến các anh chị developer nhé!

Tham khảo các vị trí tuyển dụng ngành cntt tại đây

Lựa chọn Vue hay React dành cho FE Developer

Vue hay React

Vue.js React.js hiện đang là 2 nền tảng thư viện, framework dành cho Frontend của JavaScript phổ biến nhất hiện nay. Cả 2 thư viện này đều cung cấp cho các lập trình viên 1 cách tiếp cận hiệu quả để xây dựng các ứng dụng Web khác nhau, tuy nhiên cũng có nhiều sự khác biệt về cách sử dụng và đặc thù với từng bài toán mà chúng ta nên lựa chọn framework hay thư viện nào để sử dụng. Bài viết này chúng ta cùng đi trả lời cho câu hỏi: Nên lựa chọn Vue hay React dành cho FE Developer nhé.

Vue và React là gì?

Vue và React

Vue.js là 1 framework được thiết kế bởi Evan You (1 kỹ sư phần mềm từng làm việc ở Google); trong khi đó React là 1 thư viện (library) được phát triển bởi Facebook; cả 2 đều được viết bằng JavaScript giúp tạo ra các ứng dụng đơn trang (Single Page Application) cho công việc xây dựng giao diện người dùng.

  Flutter cơ bản - Framework di động được yêu thích nhất hiện nay?

Hiện nay trên Github, số lượt star cho project của Vue đang đứng thứ 2 trong số các JavaScript project, và đứng đầu chính là React. Tại sao 2 nền tảng này là phổ biến đến như vậy, có 1 số điểm sau giúp chúng ta trả lời câu hỏi này:

  • Dễ học và dễ tiếp cận: cả 2 đều được viết bằng JS, vốn đã là 1 ngôn ngữ khá dễ học, nhiều tài liệu hướng dẫn cùng cộng đồng support lớn. Hướng thiết kế của cả Vue và React đều là mã nguồn mở, xây dựng để làm việc với các thư viện gốc; vì thế chỉ cần có kiến thức cơ bản về HTMLCSS là bạn có thể tự tin bắt tay vào học Vue hay React được ngay
  • Cấu trúc dựa trên thành phần (Component): cách cấu trúc dựa trên thành phần (Component-Based) giúp khả năng tái sử dụng code cao, tăng tính đồng bộ trong giao diện thiết kế của dự án
  • Mô hình Virtual DOM: cả Vue và React đều có Virtual DOM giúp các lập trình viên dễ tương tác và thao tác với các đối tượng, phần tử HTML trên trang mà không quá lo lắng về việc tối ưu hiển thị.
  • Cộng đồng hỗ trợ rất lớn: Như đã nhắc ở trên, nhờ mức độ phổ biến cùng sự cam kết nâng cấp lâu dài từ Facebook (cho React) và team Vue.js giúp có nhiều sự lựa chọn dành cho Developer cho việc phát triển ứng dụng.

Tham khảo việc làm JavaScrip HOT trên TopDev!

Sự khác nhau giữa Vue và React

Điểm khác biệt lớn cơ bản giữa Vue và React là cách xây dựng view layer. Mặc định thì Vue sử dụng các HTML templates, có tùy chọn viết bằng JSX; trong khi đó React chỉ có JSX. Vue tách code của chúng ta thành các phần khá riêng biệt HTML, CSS và JS giống như 1 web truyền thống; điều đó phần nào giúp các lập trình viên bắt đầu học Frontend dễ đọc và dễ hiểu hơn.

Code Vue.js

Code Vue.js

Code React.js

Code React.js

Về mặt tốc độ và hiệu suất, cả Vue và React đều cho chúng ta những khả năng tuyệt vời khi xây dựng ứng dụng web. Đối với React, khi có sự thay đổi component thì việc re-render sẽ được kích hoạt cho các component con mà không làm ảnh hưởng đến các component anh chị. Còn đối với Vue, các component có liên quan đến nhau sẽ được tracking trong suốt quá trình render, hệ thống sẽ tự xác định component nào yêu cầu re-rendering sau khi state thay đổi. Điểm khác nhau 1 chút ở đây là Vue được đánh giá tốt hơn về khả năng phân bổ bộ nhớ và thời gian khởi động trong khi React sẽ nhanh hơn 1 chút trong thời gian chạy.

Về khả năng mở rộng, Vue được thiết kế dành cho việc tạo ra các ứng dụng nhanh, thời gian phát triển được rút ngắn tối đa; ngược lại React với kinh nghiệm của đội ngũ Facebook phù hợp hơn cho việc mở rộng dự án. React được tạo ra cho các dự án Web quy mô lớn, kiến trúc của React giúp các bạn có lợi về lâu dài khi lượng code của dự án trở nên đồ sộ. Vue sẽ là 1 giải pháp tiết kiệm chi phí cho các ứng dụng vừa và nhỏ, tất nhiên nó vẫn hoàn toàn có thể sử dụng cho các ứng dụng Web lớn nhưng về mặt này React được đánh giá cao hơn.

  Cách cài đặt .NET Framework 3.5 trên Windows thành công 100%

Vậy nên lựa chọn học Vue hay React?

Phải khẳng định ngay là nếu bắt đầu học thì Vue sẽ dễ hơn cho các bạn. Khi đã biết HTML, CSS và JS thì hãy tự tin viết ứng dụng Vue đầu tiên của mình với không quá nhiều thứ mới cần phải học. Vue nhẹ, dễ học và dễ viết; cú pháp và cách sử dụng quen thuộc; việc tích hợp hoặc di chuyển các dự án cũ (viết thuần bằng HTML, CSS, JS) sang Vue sẽ dễ hơn, nhanh hơn và mượt hơn.

Nếu bạn là 1 lập trình viên có kinh nghiệm với các ngôn ngữ khác, muốn học 1 framework mới cho công việc Frontend, React là lựa chọn hợp lý hơn. React cho bạn một công cụ để xây dựng các ứng dụng SPA, đưa ra 1 giải pháp phức hợp cấp doanh nghiệp để xây dựng 1 hệ sinh thái trong tương lai, mở rộng liên tục. Ngoài ra với React, bạn còn có thể viết các ứng dụng trên di động bằng React Native.

Hay nói 1 cách dễ hiểu hơn, hãy lựa chọn Vue nếu bạn thích HTML hơn; ngược lại hãy chọn React nếu bạn thích JS hơn.

Có 1 điểm bạn cũng nên lưu ý, Vue được 1 kỹ sư Google tạo ra trong quá trình làm việc với Angular, cũng là 1 framework JS nổi tiếng. Nếu bạn có thể học Vue.js, việc học Angular cũng không quá khó khăn với bạn.

angular vs react vs vue

Kết bài

Hiện nay, nhu cầu tuyển dụng lập trình viên làm Vue và React là rất lớn, vì thế việc học 1 trong 2 framework, thư viện này sẽ có thể giúp ích các bạn rất nhiều trong quá trình tìm việc làm. Nếu có thể, hãy chọn học 1 trong 2 và sau đó tìm hiểu thư viện còn lại. Trong nhiều project, việc lựa chọn thư viện nào cũng sẽ ảnh hưởng lớn đến tương lai phát triển sau này của ứng dụng đó. Hy vọng bài viết đã mang lại được những thông tin hữu ích dành cho bạn, hẹn gặp lại các bạn trong các bài viết sau của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

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

6 Xu hướng quản trị nhân sự năm 2024

Trong những năm gần đây, ngành Quản trị Nhân sự đã có những chuyển mình đầy ấn tượng trong công tác xây dựng và phát triển chiến lược. Với việc tập trung vào tiêu dùng hóa và công nghệ số, những xu hướng mới được tạo ra góp phần quan trọng trong việc định hình quản trị nhân sự trong thập kỷ mới.

1. Quan tâm đến việc phát triển những trải nghiệm hấp dẫn nhân viên

Nghiên cứu của The Future Workplace and Beyond.com chỉ ra rằng, 83% lãnh đạo quản trị nhân sự nhận định, sự trải nghiệm nhân viên hoặc quan trọng, hoặc rất quan trọng đối với sự thành công của tổ chức và họ đang đầu tư nhiều hơn trong việc đào tạo (56%), cải thiện không gian làm việc (51%) và trao nhiều phần thưởng tạo động lực, khuyến khích nhân viên hơn (47%).

Động lực lớn giúp các công ty tập trung phát triển những trải nghiệm hấp dẫn nhân viên là khi “cuộc chiến” thu hút nhân tài đang ngày càng quyết liệt. Theo Mercer, thì 90% chủ doanh nghiệp sẽ trở nên cạnh tranh hơn trong công việc tìm người tài. Vì vậy, việc tạo ra trải nghiệm giúp công ty ghi dấu ấn mạnh mẽ đối với các nhân viên (hiện tại và tiềm năng) về văn hóa và giá trị doanh nghiệp, đồng thời dùng nó trong việc khai thác người tài tuyển dụng

Kết quả hình ảnh cho hr

Những người làm công tác quản trị nhân sự đang từng bước thực hiện chiến lược này bằng cách đa chức năng hóa công việc quản trị nhân sự. Có thể kể đến việc hợp tác với các lĩnh vực đa ngành như bất động sản, công nghệ, marketing, truyền thông nội bộ và quan hệ toàn cầu nhằm tạo ra sự kết hợp giữa trải nghiệm nhân viên với khách hàng.

2. Tuyển dụng và phát triển nguồn nhân lực phức hợp thông qua việc ứng dụng dụng mô hình Agile 

Mô hình Agile tạo mọi điều kiện để phát triển phần mềm. Agile được định hướng giúp các doanh nghiệp đạt được sự linh hoạt (Agility), từ đó xây dựng nền tảng vững chắc trước khi chuyển đến việc nâng cao sức cạnh tranh và thực hiện các mục tiêu phát triển bền vững.

  Agile và văn hóa Việt Nam
  Agile là gì? Scrum là gì? Các công cụ quản lý dự án theo Agile mà bạn nên biết

Ứng dụng Agile đã tạo ra sự thay đổi đầy nổi bật trong chính cục diện phát triển phần mềm. Agile tự hào vì là mô hình góp phần tạo ra những giá trị chất lượng trong các lĩnh vực ứng dụng như Marketing (Agile Marketing), giáo dục (EduScrum, Lean Edu,…), thiết kế (Design Thinking), khởi nghiệp (Lean Startup).Cô Amber Grewwal, hiện là Phó chủ tịch bộ phận tuyển dụng nhân tài của IBM đồng thời cũng là người đầu tiên ứng dụng mô hình Agile trong tuyển dụng. Một thực tế cho thấy Agile giúp tìm ra những ứng viên thật sự có tài năng, làm hài lòng khách hàng chỉ từ 2 đến 6 tuần. Dù có những đóng góp tích cực, mô hình Agile vẫn đang hoàn thiện và phát triển nhiều hơn, hứa hẹn sẽ còn tạo ra nhiều bất ngờ.

3. Hợp tác với các nhà phát triển bất động sản để tạo nên không gian thúc đẩy văn hóa 

Môi trường tuyển dụng nhân tài trở nên kịch tính hơn khi có sự cộng hưởng về tính cách giữa người hướng nội và người hướng ngoại. Chính họ cũng mong muốn mình được đáp ứng một cách phù hợp về môi trường, không gian làm việc để có thể phát triển bản thân tốt hơn.

Theo International Facilities Management Association, đa phần các nhân viên Mỹ đều ưa chuộng không gian làm việc mở, tuy nhiên, hiện tại, các công ty bắt đầu nhận thức được rằng đó không phải luôn là nơi thích hợp nhất để hoàn thành công việc.

Cũng theo đó, nghiên cứu từ Steelcase lấy ý kiến từ 12.480 nhân viên tại 17 quốc gia trên toàn cầu cho thấy, việc có lựa chọn một không gian làm việc mở hay không thật sự quan trọng. Điều quan trọng chính là chúng ta làm cách nào để trao quyền cho nhân viên lựa chọn nơi mình sẽ công tác và theo đuổi mục tiêu. 

Hãy nhớ rằng, đối với bộ phận quản trị nhân sự: nơi làm việc không chỉ là một tòa nhà, nó còn là một phần của cuộc hành trình tìm hiểu và chinh phục những ước mơ. Việc hợp tác với các nhà phát triển bất động sản để tạo ra nơi làm việc thân thiện giúp thúc đẩy quá trình tiếp cận và phát triển văn hóa công ty, đồng thời tạo sự gắn kết với nhân viên.

4. Ứng dụng phương pháp tiếp thị đến người tiêu dùng

Ngày nay, với sự phát triển của công nghệ, các ứng viên và nhân viên có “đặc quyền” tạo ra sự ảnh hưởng truyền thông xã hội đối với một tổ chức, doanh nghiệp nào đó thông qua các đánh giá, sự xếp hạng riêng của họ. 

Trong bối cảnh đó, bộ phận quản trị nhân sự thực hiện việc áp dụng nhiều công cụ Marketing như thiết kế suy nghĩ, hackathon (sự kiện mà các lập trình viên, cùng những người liên quan trong ngành phát triển phần mềm sẽ hợp tác với nhau trong thời gian ngắn để hoàn thành một dự án) và phân tích tâm lý để tạo nên những trải nghiệm thu hút nhân tài. 

Việc chuyển hướng từ trọng tâm khách hàng sang các nhân viên là một quyết định đúng đắn của những chuyên gia. Trọng tâm thay đổi, đối tượng được định hướng một cách rõ ràng hơn. Từ đó, ta thấy những công cụ có thể phân tích tâm lý (Social Pulse) giúp khám phá những suy nghĩ của nhân viên về vấn đề quản trị. Hay ứng dụng Ask Alex – một phần mềm giọng nói cho phép người dùng có được các thông tin về quản trị nhân sự một các nhanh chóng như chính sách nghỉ ngơi, chi phí hỗ trợ và các câu hỏi liên quan tới vấn đề bảo hiểm. 

5. Trải nghiệm chatbots trong quản trị nhân sự

Có thể hiểu đơn giản chatbots là một hình thức chưa hoàn thiện của phần mềm trí tuệ nhân tạo, có thể giao tiếp với con người để tạo ra sự tương tác với chúng ta. Đừng nghĩ rằng chatbots chưa hoàn thiện mà đánh giá thấp nó, bạn sẽ bất ngờ vì chatbots  có nhiều chức năng hơn bạn nghĩ đấy. 

Gideon Mann, Giám đốc khoa học số liệu của Bloomberg LP, “trong vòng 5 năm tới, tự động hóa sẽ thâm nhập ngày càng sâu vào công việc và cuộc sống cá nhân của chúng ta.” Và đây cũng là lời dẫn có cơ sở khi việc ứng dụng chatbots ra đời.

Điểm ứng dụng đặc biệt ở chatbots là tạo ra những người bạn đồng hành kỹ thuật số. Điều này tức là chúng ta sẽ phát triển mô hình tự động hóa với sự góp mặt của các “công sự” khác hơn. Vấn đề đặt ra là liệu việc tự động hóa có khiến con người khó khăn hơn trong tìm việc? 

Đối với vấn đề này, sẽ không quá khó khăn để có cách giải quyết. Điểm mấu chốt là đội ngũ quản trị nhân sự cần phải hiểu được nội dung, bối cảnh của tự động hóa và những ảnh hưởng của chúng đến tương lai. Bước đầu đi tiên phong trong việc sử dụng chatbots, những người quản trị nhân sự có thể từng bước theo dõi và xem xét người đồng nghiệp kỹ thuật số này có thể đưa ra các lời khuyên và cải thiện công tác quản trị nhân sự hay không.

Tham khảo thêm các nhà tuyển dụng IT HOT:

6. Tập trung vào phát triển sức mạnh tập thể, không chỉ đối với cá nhân

Một xu hướng khác trong việc quản trị nhân sự chính là phát huy trí thông minh tập thể. 

Ashley Goodall, Phó chủ tịch cấp cao của Cisco cho biết: “Một trong những sai lầm lớn nhất trong công tác quản trị nhân sự của chúng tôi là chúng tôi gần như chỉ tập trung sự chú ý vào sự phát triển và màn biểu diễn của các cá nhân. Tại Cisco, chúng tôi nhận ra, các thành quả lớn thường có được nhờ một đội ngũ, không phải là cá nhân hoạt động đơn độc”. Do đó, mục tiêu lâu dài giúp gắn kết đó chính là đặt động lực của cả nhóm vào toàn bộ quá trình quản trị nhân sự.

Từ 2018, lĩnh vực quản trị nhân sự đã được “thay áo” một một tiêu chuẩn mới. Đó là sự hội tụ giữa các giải pháp marketing hiệu quả với những thông số kỹ thuật. Đặc biệt hơn với sự trợ giúp của trí thông minh nhân tạo, công tác quản trị nhân sự đã có những hiệu quả vượt trội hơn. 

Tuy nhiên, chúng ta nên nhớ rằng dù cho công nghệ phát triển vượt bậc và tạo ra hàng loạt các công trình ứng dụng: thiết bị di động với công nghệ đám mây, trí thông minh nhân tạo,.. thì đó vẫn là sản phẩm trí tuệ thuộc về sáng kiến sáng tạo của con người. Con người vẫn là hạt nhân quan trọng và việc tập trung vào phát triển sức mạnh tập thể rất quan trọng. 

Tự động hóa về trí thông minh nhân tạo giúp bộc lộ sự phát triển nhưng sức mạnh tập thể mới là thứ giúp thúc đẩy sự phát triển đó thật lâu dài.

7. Sử dụng phương pháp quản trị mục tiêu OKRs

OKRs là phương pháp quản trị mục tiêu có lịch sử phát triển lâu đời và đã được áp dụng tại các công ty, tập đoàn hàng đầu thế giới như Google, Amazon, Intel, Facebook, LinkedIn,… Trong bối cảnh kinh tế nhiều biến động, OKRs nhanh chóng trở thành xu hướng quản trị nhân sự nổi bật với những lợi ích to lớn cho doanh nghiệp.

Hiện nay, nhiều doanh nghiệp đang phải đối mặt với tình trạng chi phí cho hoạt động kinh doanh tăng cao, nhưng hiệu quả làm việc của nhân viên lại không đạt như kỳ vọng. Do đó, thiết lập một hệ thống quản trị mục tiêu là điều mà chủ doanh nghiệp và nhà quản trị nhân sự cần ưu tiên để thích nghi với các biến động từ môi trường bên ngoài và các bất ổn đến từ nội bộ.

Phương pháp quản trị mục tiêu OKR giúp các nhà lãnh đạo, quản trị nhân sự và nhân viên trong tổ chức đo lường, theo dõi tiến độ, tạo sự liên kết giữa các mục tiêu quan trọng. Khi được áp dụng đúng cách, OKRs mang lại sự tăng trưởng trong hiệu suất, hiệu quả làm việc của nhân viên, tạo một lộ trình rõ ràng giúp chuyển đổi và thúc đẩy sự phát triển của doanh nghiệp.


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

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

Xem thêm Top vị trí tuyển dụng it HOT trên TopDev

Sách hay nhất dành cho lập trình viên (2024)

Sách hay nhất dành cho lập trình viên (2020)

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

Vậy bạn đã quyết định học Lập trình?

Tôi biết điều đầu tiên bạn có thể làm là vào Google và tìm kiếm những cuốn sách lập trình tốt nhất .

Tôi sẽ làm như vậy.

Nhưng có một vấn đề.

Có rất nhiều sách lập trình ngoài kia, bao gồm các chủ đề khác nhau và các ngôn ngữ lập trình khác nhau.

Với tất cả các tùy chọn, thật dễ bị nhầm lẫn và không bao giờ bắt đầu.

Trong bài viết này, tôi sẽ chia sẻ với bạn những cuốn sách yêu thích của tôi trong nỗ lực giúp bạn đưa ra quyết định phù hợp nhất với bạn.

Triết lý của tôi rất đơn giản

Đầu tiên, tất cả những cuốn sách tôi giới thiệu ở đây là những cuốn sách mà tôi đã tự đọc và chúng được cộng đồng đánh giá cao .

Thứ hai, tôi sẽ giữ danh sách này nhỏ nhất có thể mà không ảnh hưởng đến tính tổng quát.

Nhưng trước khi chúng tôi bắt đầu, tôi muốn đề cập rằng những cuốn sách này chỉ liên quan đến chủ đề Lập trình .

Lập trình chỉ là một chủ đề trong số nhiều lĩnh vực của Khoa học Máy tính..

Bắt đầu nào.

Đầu tiên: Ngôn ngữ lập trình

Trong phần này, tôi sẽ đề cập đến những cuốn sách có liên quan đến các khái niệm lập trình cơ bản và ngôn ngữ lập trình cụ thể.

1. Khái niệm lập trình

Sách hay nhất dành cho lập trình viên (2020)

Cấu trúc và giải thích các chương trình máy tính (còn được gọi là SICP ) là một cuốn sách cổ điển dạy cho bạn những nguyên tắc cơ bản của lập trình.

Sách giáo khoa này đã được dạy như một khóa học giới thiệu về Lập trình tại MIT.

Và mặc dù cuốn sách này sử dụng Scheme làm ngôn ngữ lập trình được lựa chọn để minh họa các khái niệm lập trình, nó không phải là một cuốn sách về ngôn ngữ lập trình Scheme.

Bạn nên nghĩ về cuốn sách này như một cuốn sách lập trình chung tình cờ sử dụng Scheme để minh họa một số khái niệm lập trình.

Có suy nghĩ này là rất quan trọng nếu bạn muốn tận dụng tốt nhất cuốn sách này.

Như đã nói, bạn có nên bắt đầu hành trình học lập trình với cuốn sách này không?

Cá nhân tôi thích bạn không bắt đầu với SICP , tôi khuyên bạn nên học một hoặc hai ngôn ngữ lập trình cụ thể trước khi bạn nhảy vào cuốn sách này.

Nhưng đừng hiểu sai ý tôi, cuốn sách này là một cuốn sách phải đọc.

Một điều nữa trước khi tôi quên, tất cả các bài giảng video của MIT (từ năm 1986) đều có sẵn trực tuyến , miễn phí, bởi chính các tác giả của cuốn sách!

Sách hay nhất dành cho lập trình viên (2020)

Tôi đã trải qua hầu hết trong số họ khi tôi đang học SICP và họ hoàn toàn tuyệt vời.

  32 cuốn sách học lập trình bạn nhất định phải đọc
  Bạn đã sẵn sàng dấn thân thêm hàng trăm “version" của bản thân để thành công?

2. Python

Python là ngôn ngữ lập trình được sử dụng rộng rãi và tôi không thấy nó chậm lại bất cứ lúc nào.

Nếu bất cứ điều gì, nó sẽ phát triển lớn hơn nữa.

Python cũng là một trong những ngôn ngữ dễ bắt đầu nhất.

Dựa trên cấp độ của bạn, đây là danh sách các sách Python mà tôi đề xuất.

Khóa học Python Crash

Sách hay nhất dành cho lập trình viên (2020)

Nếu bạn là người mới bắt đầu tuyệt đối, tôi khuyên bạn nên thử Python Crash Course .

Lý do tại sao tôi giới thiệu cuốn sách này là vì nó dựa trên dự án.

Nói cách khác, nó không nhàm chán :). Đối với người mới bắt đầu tuyệt đối, điều cuối cùng bạn muốn bắt đầu là một cuốn sách khô khan không đủ thú vị để bạn tiếp tục.

Nhược điểm của cuốn sách này là nó không toàn diện. Bạn sẽ thức dậy và chạy nhanh, nhưng nó sẽ không dạy cho bạn mọi thứ về Python mà bạn cần học.

Học Python

Sách hay nhất dành cho lập trình viên (2020)
Không giống như Python Crash Course , Learning Python là một cuốn sách rất toàn diện, đi sâu vào chi tiết hơn nhiều về ngôn ngữ lập trình Python.

Nó không áp dụng cách tiếp cận dựa trên dự án mà Python Crash Course thực hiện khi áp dụng cách dạy ngôn ngữ truyền thống hơn.

Nếu bạn là người mới bắt đầu, bạn sẽ không sai khi lấy cả hai cuốn sách và trải qua cả hai cuốn sách.

Fluent Python

Sách hay nhất dành cho lập trình viên (2020)

Fluent Python : cái này chắc chắn không dành cho những người yếu tim.

Sau khi bạn trở nên rất thoải mái trong các kỹ năng lập trình Python của mình và bạn muốn đẩy mạnh trò chơi của mình và đưa các kỹ năng của bạn lên một tầm cao mới, cuốn sách này là cuốn sách cuối cùng dành cho các lập trình viên Python nâng cao .

Tham khảo thêm các vị trí tuyển dụng python lương cao cho bạn.

3. Java

Java là một ngôn ngữ khác được sử dụng nhiều trong ngành công nghiệp.

Trường hợp điển hình: Hadoop , Spark , Kafka và ElasticSearch đều là các hệ thống phân tán được sử dụng rộng rãi được viết hoàn toàn bằng Java.

Cá nhân tôi đã học Java từ loạt Core nổi tiếng.

Core Java

Sách hay nhất dành cho lập trình viên (2020)

Core Java là một cuốn sách tuyệt vời về các nguyên tắc cơ bản của Java.

Nó dạy cho bạn những điều cơ bản của Ngôn ngữ lập trình Java với rất nhiều ví dụ minh họa và mẫu mã.

Core Java nâng cao

Sách hay nhất dành cho lập trình viên (2020)

Core Java Advanced là một cuốn sách miễn phí cho cuốn trước.

Nó bao gồm một số chủ đề nâng cao không được đề cập trong Core Java .

Effective Java

Sách hay nhất dành cho lập trình viên (2020)

Effective Java là một cuốn sách bắt buộc phải có cho mọi lập trình viên Java.

Cuốn sách này không phải là về nội dung của ngôn ngữ mà là về các thực tiễn tốt nhất để viết mã chất lượng cao chuyên nghiệp.

Cuốn sách cung cấp khoảng 80 thực tiễn tốt nhất để làm theo để làm cho mã của bạn sạch hơn, dễ đọc hơn và thành ngữ hơn.

4. C ++

Sách hay nhất dành cho lập trình viên (2020)

Tôi yêu C ++

Chủ yếu là vì đây là ngôn ngữ lập trình đầu tiên tôi học được ở trường đại học

Tuy nhiên, ngày nay rất hiếm khi sinh viên đại học bắt đầu lập trình với C ++.

Lý do cho điều đó là C ++ là một ngôn ngữ lập trình tương đối khó học hơn so với Python hoặc Java.

Và trên thực tế, tôi đồng ý rằng đó là một chiến lược tốt hơn nhiều để bắt đầu với Python hoặc Java.

Tuy nhiên, C ++ vẫn được sử dụng rộng rãi và rất quan trọng, đặc biệt nếu bạn quan tâm đến lập trình kernel cấp thấp hoặc lập trình các hệ thống nhúng.

Trường hợp điển hình: Windows, Mac OS, Linux đều được viết bằng C ++ (và C)

Đối với cuốn sách yêu thích của tôi, tôi thực sự thích C ++ Primer . Nó được viết tốt và khá toàn diện.

Tham khảo thêm các vị trí tuyển dụng lập trình C++ lương cao tại Topdev.

5. Go

Sách hay nhất dành cho lập trình viên (2020)

Ngôn ngữ được Google thiết kế hoàn toàn và đang phát triển với tốc độ rất nhanh.

Nó đã được sử dụng trong các dự án nguồn mở phổ biến.

Trường hợp điển hình: Kubernetes, Docker và Consul đều được viết bằng Go.

Không có nhiều sách về việc này, nhưng cuốn sách tôi sở hữu và giới thiệu là The Go Programming Language của Donavan và Kernighan.


Thứ hai: Craft Engineering Craft

Những cuốn sách được liệt kê trong phần này là hơi khác nhau.

Họ không phải là về việc học một ngôn ngữ lập trình cụ thể .

Họ thực sự hướng nhiều hơn đến việc dạy thủ công và nghệ thuật công nghệ phần mềm.

Nói cách khác, những cuốn sách này bao gồm các chủ đề mà bạn sẽ chỉ bắt gặp thông qua kinh nghiệm chuyên môn và công nghiệp của bạn.

Vì vậy, các chủ đề được đề cập ở đây thường không được dạy ở trường và có thể giúp bạn tiết kiệm được nhiều năm học thông qua thử và sai.

Chúng ta hãy lần lượt xem danh sách những cuốn sách yêu thích của tôi và xem những chủ đề chúng bao gồm và lý do tại sao chúng quan trọng.

1. Code Complete

Sách hay nhất dành cho lập trình viên (2020)

Code Complete không phải là thứ bạn đọc trong một lần.

Cuốn sách này là một hướng dẫn toàn diện mà bạn sẽ tiếp tục quay trở lại.

Theo tôi, thời gian tốt nhất để đọc cuốn sách này là trước khi bạn bắt đầu thực tập hoặc công việc đầu tiên.

Ví dụ, cuốn sách bao gồm mọi thứ, từ việc đặt nền tảng cho phát triển phần mềm, tạo và cải thiện phần mềm chất lượng cao, đến các vấn đề tiềm ẩn có thể phát sinh trong quá trình phát triển phần mềm và cách tránh chúng.

2. The Pragmatic Programmer

Sách hay nhất dành cho lập trình viên (2020)

The Pragmatic Programmer là một trong những cuốn sách thiêng liêng cho các lập trình viên.

Mặc dù cuốn sách tập trung vào rất nhiều khái niệm, nó đào sâu vào các thực tiễn phát triển phần mềm vượt thời gian mà hầu hết các lập trình viên (nên) sử dụng.

Một tác phẩm không vô nghĩa thu hút ý thức chung của mọi người, nó ấn tượng ở những giải pháp và lời khuyên có thể cảm thấy tội lỗi tinh tế.

Trước khi bạn biết điều đó, bạn sẽ là một tín đồ được chuyển đổi và là một lập trình viên thực dụng.

3. Clean Code

Sách hay nhất dành cho lập trình viên (2020)

Clean Code cung cấp một cái nhìn sâu sắc dễ hiểu về phát triển phần mềm và làm sạch mã.

Cuốn sách này cung cấp thông tin có giá trị và giải thích từng bước về cách viết, làm sạch và tái cấu trúc mã.

Nó không chỉ giải thích tại sao viết mã sạch là quan trọng, mà còn đưa ra rất nhiều ví dụ thực tế.

Lẩn tránh lý thuyết, làm sạch mã chỉ cho bạn cách giải quyết các vấn đề thực sự mà nhiều lập trình viên đã vấp phải trước bạn.

Vì vậy, hãy tiết kiệm cho mình nhiều năm thử và sai, và học hỏi từ những sai lầm của các lập trình viên khác.


Thứ ba: Cấu trúc dữ liệu và thuật toán

Một người đàn ông khôn ngoan đã từng nói:

Để trở thành một lập trình viên giỏi, bạn cần phải:

  • Mã chuyên nghiệp trong 10 năm
  • Mã chuyên nghiệp trong 2 năm và học thuật toán

Thành thật tôi rất khó nhớ ai đã nói chính xác câu nói này vì vậy nếu bạn biết, xin vui lòng để lại một bình luận bên dưới với tên của người đó để tôi có thể ghi nhận anh ấy

Những lời này là rất đúng mặc dù. Hiểu các cấu trúc dữ liệu và thuật toán ở mức sâu hơn là những gì phân biệt các lập trình viên rắn với các lập trình viên joe trung bình.

1. Introduction to Algorithms (CLRS)

Sách hay nhất dành cho lập trình viên (2020)

Khi nói đến các thuật toán và cấu trúc dữ liệu, thực sự không có nhiều tranh luận về cuốn sách hay nhất bao gồm chủ đề này.

Đó là giới thiệu một cách dứt khoát về các thuật toán .

Nếu bạn muốn âm thanh tuyệt vời và sử dụng biệt ngữ của nghề thủ công, bạn có thể gọi nó là CLRS .

Chữ viết tắt này thường được sử dụng và nó đề cập đến các tác giả của cuốn sách (Cormen, Leiserson, Rivest và Stein).

2.Data structure and Algorithms in Java

Sách hay nhất dành cho lập trình viên (2020)

CLRS được viết theo cách trung lập ngôn ngữ. Hầu hết các mã trong cuốn sách chủ yếu là mã giả.

Nếu bạn muốn tìm hiểu các cấu trúc dữ liệu và thuật toán trong Java, thì tôi khuyên bạn cũng nên lấy Data structure and Algorithms in Java .

Mặc dù ngày nay tôi không thực sự làm được nhiều Java, tôi có cuốn sách này và thật vui khi đọc và hiểu.

Tôi vẫn nói cuốn sách này là một người bạn đồng hành tốt với CLRS nhưng nó không có nghĩa là một sự thay thế.

Tham khảo từ nguồn: https://www.afternerd.com

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

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

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

Xu hướng tuyển dụng IT năm 2024 mà mọi HR Manager cũng như IT Manager cần biết!

Xu hướng tuyển dụng IT 2023 mà mọi HR và IT Manager cần biết

Thiếu hụt nhân sự luôn là một bài toán tuyển dụng IT nan giải, dù xu hướng lương và phúc lợi đang tăng mạnh cho ngành này, nhưng nhiều chuyên gia dự báo dự đoán từ năm 2023 – 2025, Việt Nam vẫn sẽ thiếu hụt từ 150.000 đến 200.000 lập trình viên/kỹ sư hàng năm. Thị trường xin việc IT trở thành một “đại dương đỏ” với sự cạnh tranh khốc liệt, việc tìm kiếm và tuyển dụng được các ứng viên đạt đủ yêu cầu trở nên cực kỳ khó khăn, tốn kém và mất nhiều thời gian.

Trước sự phát triển nhanh chóng của nhiều xu hướng công nghệ mới trong năm 2022 – 2023 mở ra nhiều cơ hội tốt hơn cho các lập trình viên tại Việt Nam, đây có thể sẽ gây không ít trở ngại cho nhà tuyển dụng nếu không biết tuyển dụng đúng cách. Liệu các nhà tuyển dụng và doanh nghiệp có đang đi đúng hướng?

TopDev đã cho ra “cẩm nang” Danh sách 10 xu hướng tuyển dụng IT nổi bật trong năm 2024 này sẽ là kim chỉ nam để cải thiện chiến lược tuyển dụng IT cho cho các nhà tuyển dụng ngành CNTT và các doanh nghiệp trên đà ứng dụng công nghệ mới. 

tuyển dụng it

  IT Manager Là Gì? Những Điều Bạn Cần Biết Về IT Manager

Qua bộ cẩm nang Tuyển dụng thế hệ mới này, những người làm Tuyển dụng IT sẽ hiểu hơn về những trở ngại và thách thức mới của ngành cũng như tìm ra 10 lối đi mới cho con đường Tuyển dụng Lập trình thật sự hiệu quả:

  1. Tuyển dụng mà không đơn thuần chỉ Tuyển mộ nhân tài  mà thực ra có rất nhiều điểm tương đồng với hoạt động Marketing. Vì thế nhà tuyển dụng từ đây cần phải bắt đầu tư duy như các marketer thì mới có thể thu hút được nhân tài và tìm kiếm được những nhân tố phù hợp về cho doanh nghiệp.
  2. Tuyển dụng thông minh phải biết làm thương hiệu – Hoạt động EB của các công IT bắt đầu nhen nhóm và đã có một số doanh nghiệp sau thời gian dài đầu tư đã bắt đầu cho quả ngọt với việc cứ đăng tin tuyển dụng là hồ sơ về ào ạt. Vậy Employer Branding là gì và làm thế nào cho đúng?
  3. Inbound Recruiting – chính là chìa khóa cho những cơ hội như thế này. Bằng cách tiến hành Inbound Recruiting kết hợp với chiến lược marketing hợp lý, nhà tuyển dụng sẽ xây dựng được mối quan hệ tích cực với các ứng viên tiềm năng.
  4. Candidate Experience Trải nghiệm ứng viên là toàn bộ những cảm xúc, hành vi và thái độ mà ứng viên trải qua trong quá trình ứng tuyển tại một doanh nghiệp. Quá trình tuyển dụng đó được tính từ khi tiếp nhận thông tin qua các kênh tuyển dụng tới sàng lọc, phỏng vấn, nhận offer và cuối cùng là quy trình onboarding nhân viên mới .
  5. Talent Pool – là khái niệm chỉ một cơ sở dữ liệu nơi nhà tuyển dụng lưu trữ tất cả thông tin của ứng viên mà nhà Tuyển dụng cần phải chú ý.Xu hướng tuyển dụng IT năm 2019
  6. Giống như trong hoạt động Sales-Marketing cần có hệ thống CRM (Customer Relationship Management) để quản lý quan hệ khách hàng, thì nhu cầu quản lý quan hệ ứng viên cũng phát sinh trước những thay đổi của thị trường lao động.
  7. Nếu như các công cụ Marketing Automation đã trở thành một phần không thể tách rời Marketing những năm gần đây thì Recruitment Automation cũng đang và sẽ ngày càng phổ biến hơn trong doanh nghiệp.
  8. Social Recruiting là cách thức tuyển dụng sử dụng các mạng truyền thông xã hội (như Facebook, Twitter, LinkedIn,…) và các trang web (blog, diễn đàn,…) để tìm kiếm, thu hút và chọn lựa nhân tài.
  9. Tương tự như hoạt động Marketing đang chuyển đổi mạnh mẽ sang hướng số hóa dữ liệu, hoạt động tuyển dụng nói riêng và nhân sự nói chung sẽ phụ thuộc ngày càng nhiều vào các dữ liệu – Data-driven Recruiting và HR Analytics.
  10. Đã có rất nhiều số liệu chứng minh hiệu quả vượt trội của việc tuyển dụng nhân viên thông qua giới thiệu từ nội bộ – Họ cho biết họ phương thức Giới thiệu nội bộ (Referral) rất phổ biến và được HR áp dụng cho tất cả các vị trí, đặc biệt là các vị trí IT.
  Program Manager là gì? Học gì để trở thành Program Manager

Tham khảo việc làm IT manager lương cao trên TopDev

Digital Transformation – xu hướng trong năm 2024 và hơn thế nữa

Trước đây, làm cho sản phẩm hoặc dịch vụ của bạn ngày càng tốt và rẻ hơn là một công thức “chắc chắn thành công” trong kinh doanh. Nhưng thời đó đã qua từ lâu lắm rồi… Tự động hóa thông minh (Intelligent Automation – IA) đã sẵn sàng cho sự phát triển bùng nổ. Trước đây, IA bị giới hạn trong việc hỗ trợ các quy trình rất phức tạp như xử lý tài chính trong ngân hàng và cung cấp dịch vụ trên các mạng viễn thông khổng lồ.

Nhưng nền kinh tế đã thay đổi với sự bùng nổ của điện toán đám mây, và với sự phát triển đáng kinh ngạc của trí tuệ nhân tạo (Artificial Intelligence – AI), lợi thế cạnh tranh có thể tan biến trong nháy mắt. Theo Credit Suisse, tuổi trung bình của một công ty trong lĩnh vực S&P 500 đã giảm từ 60 tuổi trong những năm 1950 xuống dưới 20 năm hiện nay. Gần một nửa số công ty trên Fortune 500 đã biến mất trong 20 năm qua. Và 40% trong danh sách hôm nay sẽ biến mất trong vòng 10 năm tới. Câu hỏi là, làm thế nào để bạn vượt qua mối đe dọa không ngừng nghỉ của sự gián đoạn?

Các tổ chức thành công nhất nhìn thấy sự gián đoạn sắp tới. Do đó, họ xoay vòng để biến nó thành cơ hội cho sự đổi mới và tăng trưởng. Vì vậy, chúng tôi đã tham khảo quan điểm của những chuyên gia để có được thông tin về các xu hướng kỹ thuật số hot nhất cho năm 2023 và hơn thế nữa. Dưới đây là bản tóm tắt với các thông số về những xu hướng đó:

  • Vào năm 2020, 30% doanh nghiệp lớn sẽ bắt đầu tạo doanh thu dưới dạng dữ liệu khi có sự giúp sức từ AI
  • Vào năm 2020, hơn 40% các sáng kiến chuyển đổi kỹ thuật số sẽ sử dụng các dịch vụ AI
  • Đến năm 2021, 75% ứng dụng doanh nghiệp thương mại sẽ được tích hợp AI và hơn 50% người tiêu dùng sẽ tương tác với AI
  • Đến năm 2022, các trợ lý kỹ thuật số và bot cá nhân sẽ ảnh hưởng đến 10% tổng doanh số.

Trong khi đó, các chuyên gia nói rằng tương lai sẽ xuất hiện nhiều AI và thuật toán giúp đỡ chúng ta nhiều việc hơn là chỉ lấy thông tin ở hiện tại. Và thật sự thì AI đã đóng một vai trò lớn hơn trong cuộc sống hàng ngày của chúng ta. Ví dụ, các hệ thống thông minh đang đưa ra hàng tỷ quyết định mỗi ngày ảnh hưởng đến nhiều khía cạnh trong cuộc sống của chúng ta và có thể nói, AI xác định được tất cả mọi thứ.

“Các dự án chuyển đổi kỹ thuật số sẽ tiếp tục phá vỡ các giới hạn trải nghiệm của khách hàng vào năm 2023”

Chuyên gia trải nghiệm khách hàng, Aspect Software, đưa ra dự đoán về các thay đổi đối với trung tâm liên lạc và bối cảnh dịch vụ khách hàng trong năm 2023.

Đó là lý do tại sao các chuyên gia về AI như Joanna Bryson nói rằng điều đó rất cần thiết để chúng ta hiểu cách AI đưa ra quyết định, cách nó quyết định những gì chúng ta thấy và những gì chúng ta không thể, và vấn đề trách nhiệm của ai.

Joanna Bryson

“Chúng tôi sẽ chứng minh rằng chúng tôi đứng đằng sau những phần mềm này và phải chịu trách nhiệm về những gì chúng tôi đã làm” – Bryson, một nhà khoa học máy tính tại Đại học Bath ở Vương quốc Anh nói.

AI rất quan trọng và nó hiện diện xung quanh chúng ta. Và có lẽ những thách thức lớn nhất mà chúng tôi sẽ phải đối mặt trong tương lai là ảnh hưởng của chính trị, kinh tế và xã hội của việc không tối ưu đồng bộ hóa AI hiện nay.

Byson chia sẻ “Chúng tôi đã thực hiện bước nhảy vọt lớn về AI từ năm 2007 đến 2017, vì chúng tôi có nhiều dữ liệu hơn và chúng tôi đã cải tiến Machine Learning rất nhiều. Về lâu dài, tôi nghĩ rằng điều này sẽ đẩy nhanh tốc độ phát triển của chúng tôi. Vì vậy, bây giờ là thời điểm tốt nhất để tìm ra cách tích hợp AI vào cuộc sống của chúng ta”

Tham khảo thêm các vị trí tuyển dụng Machine Learning lương cao cho IT

AI

Morgan Frank – Nhà nghiên cứu ở MIT Media Lab và đồng tác giả của “Small Cities Face Greater Impact from Automation.” (Thành phố nhỏ đối mặt với tác động lớn từ từ động hóa) đã nhận định rằng “Sẽ ngày càng khó nhận ra bạn đang làm việc với công nghệ, bởi vì nó ở quanh ta và sẽ có nhiều tiện ích mà chúng ta mong đợi xuất hiện, ví dụ như Amazon Echo”.

IA ngày càng rẻ hơn và dễ làm hơn. Điều đó có nghĩa là các công ty sẽ sử dụng nó để thực hiện một loạt các công việc trên toàn bộ tổ chức. Ví dụ, nhiều người đang tận dụng IA để cung cấp dịch vụ khách hàng tốt hơn, nhanh hơn. Những người khác đang áp dụng IA để có được khả năng hiển thị nhiều hơn vào các kênh bán hàng, mô hình hoạt động và hoạt động hàng ngày của họ.

VMD2019
Vietnam Mobile Day năm thứ 9 với nhiều chủ đề hấp dẫn về Mobile Transformation

Nói cách khác, nếu bạn đang chờ đợi chu kỳ cường điệu IA lắng xuống. Hoặc, nếu bạn có kế hoạch đi chậm để mở rộng quy mô thí điểm IA đó tại một trong các đơn vị kinh doanh của bạn. Hãy suy nghĩ lại, bởi vì các doanh nghiệp không tự động nắm lấy cơ hội này (IA) sẽ “tự động” tan biến khỏi thị trường đầy tính khắc nghiệt và đào thải.

Đây là lý do tại sao nhiều CXO đang xoay vòng khỏi khoản tiết kiệm chi phí 10% của quá khứ để bù đắp vào khoản tiết kiệm chi phí từ 20 đến 40% cho lao động kỹ thuật số. Và xu hướng này sẽ tiếp tục trong năm 2023, theo kết quả của Khảo sát công việc trong tương lai của Appian, do IDG thực hiện:

  • 54% đã có hoặc đang có kế hoạch triển khai Machine Learning
  • 75% đã triển khai hoặc có kế hoạch triển khai IA trong năm tới
  • 41% kế hoạch thực hiện IA vào năm 20122

Sự phát triển nhanh chóng của điện toán đám mây, robot, trí tuệ nhân tạo và học máy đã đưa chúng ta vào đỉnh cao của sự tăng trưởng theo cấp số nhân trong tự động hóa thông minh trong ô tô, dầu khí, tiện ích, ngân hàng, dịch vụ tài chính và bán lẻ.  Vì vậy, nếu bạn là một trong số 40% các tổ chức lớn đang khám phá IA. Hoặc, nếu bạn trong số 38% chờ đợi để tự động hóa hoạt động của bạn ở nơi đầu tiên, đây có lẽ là thời điểm tốt để nhân đôi nỗ lực tự động hóa thông minh của bạn.

Tham khảo các vị trí tìm việc cho kỹ sư AI lương cao tại Topdev

Techtalk via information-age.com

Mẫu CV IT Administrator chuẩn nhất 2024

cv it administrator
cv it administrator

Liệu CV dân it sẽ được viết ra sao? Có gì khác so với các đặc trưng lĩnh vực khác hay không? Đặc biệt, viết CV IT Administrator như thế nào đủ tạo ấn tượng? Bài viết sau đây của TopDev sẽ mách cho bạn cách viết và những lưu ý khi viết CV IT Administrator.

Mẫu CV IT Administrator chuẩn

Thông tin liên hệ

Hãy cung cấp các thông tin về: 

  • Số điện thoại 
  • Email
  • Kênh liên hệ cá nhân (nếu có)

Mục tiêu nghề nghiệp

Mục tiêu này, bạn nên đưa ra các mục tiêu rõ ràng, tránh mơ hồ.

Ví dụ: Tôi nộp đơn vì mục đích: Có cơ hội trải nghiệm và phát triển nghề nghiệp tốt hơn. Tôi muốn làm việc tại … với vị trí IT Administrator và định hướng sắp tới, tôi hy vọng mình sẽ gặp gỡ các đối tác tiềm năng. Đồng thời, mục tiêu lâu dài tôi mong muốn trở thành một Administrator Manager. 

Nếu có thể, bạn hãy khéo kéo đưa vào một số thế mạnh: Một vài điểm nổi trội về bản thân

+ Kinh nghiệm làm việc (đề cập đến số năm kinh nghiệm)

+ Chứng chỉ chuyên ngành/kỹ năng mềm (nên có thông tin xác nhận) 

+ Các kỹ năng liên qua trực tiếp đến vị trí IT Administrator, các nền tảng kiến thức quan trọng từ các chương trình nghiên cứu

Trình độ học vấn

Liệt kê trường đại học hoặc các khoa học gần đây của bạn. Lưu ý, hãy đề cập đến các khóa học liên quan vị trí ứng tuyển. Điều này sẽ giúp CV IT của bạn thu hút hơn. Dù là CV IT tiếng anh hay tiếng việt, bạn cũng đang tạo ra lợi thế cho mình.

Các khóa học liên quan về:

  • Quản trị mạng
  • Quản lý bảo mật
  • Thiết kế web
  • Hỗ trợ ứng dụng và hệ thống email

Kinh nghiệm làm việc

Trình bày những kinh nghiệm làm việc tại các công ty trước đó (ghi cụ thể thời gian). Vị trí/chức vụ đảm nhận và các task – nhiệm vụ) cụ thể bạn thực hiện. 

Một số vị trí liên quan nền tảng: System Engineer, IT Excutive, IT Helpdesk,…

Bạn ghi rõ nhiệm vụ nhưng cần đảm bảo không quá dài dòng. Thông qua từng trải nghiệm công việc, nhà tuyển dụng sẽ hiểu rõ hơn về sự định hướng sự nghiệp sắp tới của bạn. Freelancer IT cũng đánh giá kinh nghiệm quan trọng cuộc đua nghề nghiệp của bạn.

  5 mẹo và mẫu CV IT để gây ấn tượng với nhà tuyển dụng!

Kỹ năng

Liệt kê các kỹ năng bạn có và đánh dấu mức độ thể hiện ở từng kỹ năng. Đây là một số kỹ năng cần có trong CV IT Administrator. Tuy nhiên, bạn vẫn phải đảm đảm độ chân thật với năng lực thực tế.

  • Giao tiếp
  • Kỹ năng tư duy hệ thống/quản lý
  • Teamwork
  • Tin học văn phòng
  • Ngoại ngữ
  • Kỹ năng hỗ trợ dịch vụ

Chứng chỉ, hoạt động, giải thưởng và các sở thích

Đây là phần nội dung bạn sẽ tự linh động về chúng có xuất hiện trong CV IT Administrator của mình hay không? Nếu có các chứng chỉ hoặc các thành tích cá nhân, bạn có thể bổ sung vào CV. Bạn nên cân nhắc và lựa chọn các thông tin có liên quan trước khi đưa chúng vào “tấm vé” tuyển dụng của mình.

Tạo CV online nhanh chóng, đẹp dành cho dân IT

Các mẫu CV IT Administrator trên TopDev

Bạn có thể tham khảo nội dung để hoàn thiện CV IT của mình.

cv system administrator
M1 – CV đa nhiệm
cv system administrator
M2 – CV đa nhiệm
cv system administrator
M3 – CV đa nhiệm
cv system administrator
Mẫu CV cổ điển
cv system administrator
Mẫu CV cổ điển
cv system administrator
M1 – CV Pro
cv it system administrator1 2 1
M2 – CV Pro
cv it system administrator
M3 – CV Pro

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

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

Xem thêm Xin việc công nghệ thông tin không yêu cầu KN tại TopDev

Tránh lỗi ConcurrentModificationException trong Java như thế nào?

Tránh lỗi ConcurrentModificationException trong Java như thế nào

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

Một trong những vấn đề phổ biến trong khi loại bỏ các phần tử từ một ArrayList trong Java là ConcurrentModificationException.

Nếu bạn sử dụng vòng lặp foreach và cố gắng thêm/ xóa phần tử khỏi ArrayList bằng phương thức remove(), bạn sẽ nhận được ConcurrentModificationException.

Tuy nhiên, nếu bạn sử dụng phương thức xóa của Iterator hoặc ListIterator bằng phương thức remove(), bạn sẽ không gặp lỗi này và có thể xóa phần tử đó.

Trong bài viết này, tôi sẽ giải thích, đưa ra một vài ví dụ cho bạn thấy được trường hợp xảy ra lỗi ConcurrentModificationException và cách có thể tránh lỗi này trong khi sửa đổi một ArrayList trong Java.

  Phân biệt ArrayList và LinkedList

  Code ví dụ Callable, Future, Executors trong Java

Ví dụ xảy ra lỗi ConcurrentModificationException

Thêm/ xóa phần tử khi sử dụng ArrayList.remove() khi duyệt qua for-each

package com.gpcoder.collection.list.ConcurrentModificationException;

import java.util.ArrayList;
import java.util.List;

public class ConcurrentModificationException1 {

    public static void main(String[] args) {
        List<String> languages = new ArrayList<>();
        languages.add("Java");
        languages.add("C#");
        languages.add("PHP");
        languages.add("C++");
        languages.add("Ruby");

        // Using forEach loop to iterate and add/ removing element during iteration will
        // throw ConcurrentModificationException in Java
        for (String language : languages) {
            if (language.equals("C#")) {
                languages.remove(language);
            }
        }
    }
}

Output của chương trình:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at com.gpcoder.collection.list.ConcurrentModificationException.ConcurrentModificationException1.main(ConcurrentModificationException1.java:18)

Ứng tuyển các vị trí việc làm Java lương cao trên TopDev

Thêm/ xóa phần tử sử dụng ArrayList.remove() khi duyệt qua Iterator

Iterator<String> iterator = languages.iterator();
while (iterator.hasNext()) {
    String language = iterator.next();
    if (language.equals("C#")) {
        languages.remove(language);
    }
}

Output của chương trình:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at com.gpcoder.collection.list.ConcurrentModificationException.ConcurrentModificationException2.main(ConcurrentModificationException2.java:19)

Tránh lỗi ConcurrentModificationException

Sử dụng vòng lặp for-index

for (int i = 0; i < languages.size(); i++) {
    String language = languages.get(i);
    if (language.equals("C#")) {
        languages.remove(language);
    }
}

Lưu ý: với cách này các bạn nên cẩn thận khi get phần tử theo index, có thể sẽ gặp lỗi IndexOutOfBoundsException.

Ví dụ:

for (int i = 0; i < languages.size(); i++) {
    String language = languages.get(i);
    if (language.equals("Ruby")) {
        languages.remove(language);
    }
    System.out.println(languages.get(i)); // IndexOutOfBoundsException
}

Output của chương trình:

Java
C#
PHP
C++
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at com.gpcoder.collection.list.ConcurrentModificationException.ForIndexExample.main(ForIndexExample.java:21)

Sử dụng phương thức remove() được hỗ trợ bởi Iterator

Iterator<String> iterator = languages.iterator();
while (iterator.hasNext()) {
    String language = iterator.next();
    if (language.equals("C#")) {
        // languages.remove(language); // Don't use ArrayList.remove()
        iterator.remove();
    }
}

Không remove trong khi duyệt các phần tử

Nếu chúng ta muốn giữ vòng lặp for-each, thì chúng ta cần đợi cho đến khi kết thúc trước khi chúng ta xóa các phần tử.

List<String> toRemove = new ArrayList<>();
for (String language : languages) {
    if (language.equals("C#") || language.equals("Ruby")) {
        toRemove.add(language);
    }
}
languages.removeAll(toRemove); // [Java, PHP, C++]

Sử dụng phương thức removeIf() trong Java 8

languages.removeIf(language -> language.equals("C#") || language.equals("Ruby"));

Sử dụng Stream filter() trong Java 8

List<String> removedList = languages.stream()
    .filter(language -> language.equals("C#") || language.equals("Ruby"))
    .collect(Collectors.toList());

Trong bài viết này, tôi đã trình bày cho bạn thấy một số trường hợp có thể gặp phải nếu bạn thêm/ xóa một phần tử khi đang duyệt và cũng đã cung cấp một số giải pháp để giải quyết lỗi ConcurrentModificationException. Hy vọng bài viết giúp ích cho các bạn, hẹn gặp lại ở các bài viết tiếp theo.

Bài viết gốc được đăng tải tại gpcoder.com
Xem thêm:

Hiểu sâu về mobile app deep link

Hiểu sâu về mobile app deep link

Mobile app linking (bao gồm cả mobile app deep link) là công nghệ cho phép run app và mở một trang hoặc một screen cụ thể ở trong app khi người dùng nhập hoặc nhấn vào URL ở trên trang web hoặc ứng dụng khác.

URL thì anh em cũng biết rồi, từ đông chí tây, từ mail tới app, share qua mess, vân vân mây mây. Nói chung rất chi là nhiều URL được chia sẻ nếu ứng dụng của anh em có phiên bản web.

mobile app deep link

Việc triển khai mobile app deep link giúp tăng trải nghiệm người dùng (ấn đâu thì ấn, đi đâu thì đi nhưng cuối cùng vẫn về app của em). Ngoài ra nó còn tăng tỷ lệ chuyển đổi (từ nguồn social, marketing dẫn về app của anh em).

Bài viết này tui sẽ liệt kê cụ thể những gì cần có ở deep linking. Mobile app deep link cho cả AndroidiOS như thế nào. Bắt đầu thôi anh em ui.

1. Tại sao chúng ta cần deep linking?

Ví dụ anh em code rần rần cho ra được 1 app cả android và iOS (flutter đi ha). Mọi thứ ok anh em submit review app lên store, duyệt. Ngon lành cành đào app lên store xong.

Mà app âm nhạc thì phải có bài hát, không hát không hò thì còn gì là app âm nhạc. Rồi nhạc thì phải có bìa album cho nó bắt cmn mắt. Không bắt mắt thì khó làm marketing.

Sau khi đã có album ngầu lòi, nhạc bá cháy bọ chét thì sau đó anh em bán luôn con xe đổ tiền vào chiến dịch marketing, trong chiến dịch đó thì hình album chắc chắn show ra. Nhưng để khuyến khích người dùng vào nghe tại app thì mỗi hình album là chưa đủ.

Tại sao chúng ta cần deep linking?

Vậy expect là khi người dùng bấm vào link album trên web -> link người dùng tới app và mở một đoạn sample âm nhạc. Bùm chíu bùm chang bùm bùm bùm.

Ví dụ trên đây cho thấy sự cần thiết như thế nào khi dùng deep linking, deep linking giúp những ý tưởng kết nối giữa web và app trở nên khả thi hơn bao giờ hết. Nó giúp cho end user có trải nghiệm liền mạch, tăng đáng kể tỷ lệ chuyển đổi của người dùng. Chi tiết thêm anh em có thể đọc bài viết này

  3 trang web giúp kết hợp nhiều link thành một link rút gọn duy nhất

2. Trọng tâm của mobile app deep link

Như anh em đã biết ở phần một, deep linking giúp người dùng di chuyển từ web qua app, từ app qua web một cách liền mạch, không có trở ngại. Việc đem lại sử trải nghiệm liền mạch giữa web và app giúp tăng chuyển đổi.

Nếu anh em muốn chạy quảng cáo chiến dịch bán hàng dịp năm mới, một loạt sản phẩm sẽ được giảm giá. Tất nhiên người dùng sẽ không ấn vào để đặt hàng trên web, cái họ cần và mình cần là đặt trên app. Khi ấn vào URL chạy quảng bá, nếu người dùng đã cài app thì sẽ mở thẳng app lên. Mở app lên thì danh sách sản phẩm giảm giá cũng sẽ hiện lên.

Rõ ràng thay vì phải vào web, ấn vào link tải app, deep linking mang lại trải nghiệm tốt hơn. Kích thích mua hàng hơn. Giữ chân người dùng cũng là trọng tâm của deep linking, qua app là cả một bầu trời tính năng mở ra. Thoải mái lướt web nhưng vẫn quay về mua hàng của anh em.

Nếu có cả một hệ sinh thái từ website cho tới app với các dịch vụ khác nhau, deep linking cho phép người dùng trải nghiệm thông suốt trong hệ sinh thái.

Rồi ha, xong trọng tâm, ưu điểm và ví dụ sắc nét về deep linking. Giờ là lúc bay vào 2 loại deep linking chính đang có.

Tham khảo việc làm lập trình viên Mobie hấp dẫn

3. Hai loại deep links

Trên thị trường hiện đang bày bán 2 loại deep links, một là Default (mặc định) và Deferred (hoãn lại). Mời anh em tham khảo từng loại.

3.1 Default deep links

Loại cơ bản và mặc định của deep link chỉ chuyển hướng người dùng đến app khi và chỉ khi app đã được cài đặt trên mobile của anh em. Nếu app chưa được cài thì khi anh em ấn vào url, lỗi sẽ xuất hiện.

Chính vì default deep links chỉ hỗ trợ link tới app khi mà người dùng đã tải app và sử dụng trước đó. Nên thường loại deep links này hỗ trợ quảng cáo lại nhóm khách hàng thân quen. Anh em chỉ sử dụng link này quảng bá tới enduser mà chắc chắn là đã cài app.

Cái này có thể là tư vấn qua web cho khách hàng đã có tài khoản, hoặc khi khách hàng có vấn đề trên web link tới app để xem hướng dẫn mobile app deep link.

  Mobile native là gì? Vì sao nên phát triển mobile app bằng Native

3.2 Deferred deep links

Loại thứ hai nâng cao hơn, như hàng ngoài chợ có rẻ có đắt. Cả hai đều tốt nhưng Deferred deep links lại phức tạp hơn Default deep links. Loại deep links có thể hướng người dùng tới app store để cài đặt app nếu ứng dụng chưa được cài. Khá là tiện lợi.

Ngoài ra deep links kiểu này còn cho phép người dùng ghé qua trang web để lấy thông tin, sau khi đã tải và cài đặt app.

Ví dụ anh em đặt một đôi giày, nếu Shopee hay Lazada chưa cài đặt thì sau khi cài đặt xau, anh em sẽ bay thẳng tới cái đôi giày đó, tất cả những gì cần làm là bấm đặt hàng.

Hướng dẫn về loại deep links này anh em có thể tham khảo thêm ở đây cho Android và đây cho iOS.

https://www.youtube.com/watch?v=XJgPIeolJu8

4. Contextual deep linking?

Contextual ở đây là ngữ cảnh, loại liên kết theo ngữ cảnh này cho phép bổ sung thêm một số thông tin ở deep links phục vụ theo từng ngữ cảnh riêng biệt.

Việc sử dụng ở từng ngữ cảnh sẽ cần thêm các parameters khác nhau. Mobile app deep link hữu dụng hơn với parameters.

5. Tạo deep links như thế nào?

Cái đầu tiên của tạo deep links là generate (tạo ra deep links thủ công). Việc này có 2 bất cập rõ ràng có thể nhận ra:

  • Thứ nhất là rất mất thời gian để tạo ra deep links theo cách thủ công. Những trường hợp có nhiều deep links sẽ tiêu tốn một lượng thời gian khổng lồ.
  • Thứ hai là bất cứ việc làm gì nếu đã là thủ công do con người làm đều có thể dẫn ra lỗi (human mistake). Lỗi đánh máy thì kể cả có là kỹ sư hay người nhập liệu giỏi nhất đôi khi cũng mắc lỗi

Chính vì vậy, việc generate tự động backlink là công cụ hữu hiệu, giúp loại bỏ sai sót, tiết kiệm thời gian. Thời gian và công sức dành cho chiến dịch cũng là điều phải cân nhắc tới.

Về công cụ tạo deep links thì anh em có thể tham khảo qua Adjust’s Deeplink Generator. Tools này cho phép anh em tạo ra deeps link đầy đủ. Hoạt động được cho cả Android và iOS. Giảm bớt thời gian và công sức.

Anh em chú ý là scheme-based của mobile app deep linking cho Android và iOSiOS 9+ Universal Link đều có tài liệu cụ thể. Anh em có thể tham khảo. Có demo đầy đủ xem hoạt động như nào luôn.

6. Implement deep link cho Android

Trước khi bắt tay vào implement deep linking cho Android, giả sử anh em có linking url là yourapp://path/, và app bundle ID là com.yourapp.example

Đầu tiên là sử dụng Javascript.

6.1 Javascript solutions

Cách cũ và được sử dụng nhiều từ xưa tới nay là dùng iframe để load deep link URL và set delay để chuyển hướng tới store. Bằng cách sử dụng Javascript thì khi input URL vào, việc đầu tiên browser cần làm là load yourapp://path/ trước

  • Nếu app đã cài đặt, app sẽ mở lên, đoạn code JS sẽ không thực thi.
  • Nếu app chưa được cài đặt, không có gì trả về khi anh em load yourapp://path/. Sau đó 2 giây, đoạn code Javascript sẽ chạy, chuyển hướng anh em tới App Store hoặc Play Store. Anh em tiến hành cài app trên đó

Cách dùng JS có một vấn đề nhỏ là sau khi code đã thực thi, anh em đã tới store cài xong. Ấn back lại web, lúc này JS lại được thực thi -> enduser lại tiếp tục bay tới store

6.3 Intent solutions

Kể từ Chrome cho Android phiên bản 25 trở lên, code JS không còn được support để chuyển hướng người dùng tới Store. Thay vào đó Google cung cấp Intent URL như một giải pháp tốt hơn. Khi người dùng ấn vào đường dẫn intent://path/#Intent;scheme=yourapp;package=com.yourapp.example;

  • Nếu app đã được cài đặt, app sẽ được mở bở Chrome
  • Nếu app chưa được cài đặt, Chrome sẽ mở Play Store

7. Loại deep link nào anh em nên sử dụng

Sau khi đã nắm sơ 2 giải pháp xài deep links thì có vẻ như Intent là giải pháp khuyếnh khích anh em sử dụng. Tuy nhiên là không phải lúc nào và ai ai cũng xài bản Android từ 25 trở lên.

Thành ra tiện thì rất là tiện nhưng không phải lúc nào Intent URL cũng hoạt động

mobile app deep link

8. Implement deep links cho iOS

8.1 Giải pháp Javascript

Tương tự như Android, cũng có vài trick iOS nếu muốn xử cái deeplink thông qua iOS

html <script>

window.location.replace("yourapp://path/"); setTimeout(function () {

window.location.replace("https://itunes.apple.com/app/id12345678"); }, 2000);

</script>

  • Nếu app đã cài. dòng đầu tiên sẽ chạy, mở app lên và cái đoạn code mở store itunes sẽ không chạy nữa
  • Nếu app chưa cài, dòng đầu chạy nhưng không có cái gì, dẫn tới cái timeout chạy, sau 2 giây sẽ mở app trên app store cho anh em xài.

Cách này thì work cho iOS 8 trở về sau trên Safari nhưng các version khác thì không phải lúc nào cũng work. Anh em tham khảo bảng dưới đây.

mobile app deep link

8.2 Giải pháp universal link

Bắt đầu từ iOS 9, Apple release universal link, hoạt động tương tự như Android intent nhưng yêu cầu cài đặt nhiều hơn. Từ bản 9.2 thì Apple không còn hỗ trợ giải pháp sử dụng Javascript (do cái promp window không modal nữa)

Để bật được universal link, anh em cần một URL có SSL (ví dụ như https://yourdomain.com/), cái domain này phải liên kết tới ứng dụng của anh em và phải được deploy ở https://yourdomain.com/apple-app-site-association.

{
  "applinks": {
      "details": [
           {
             "appIDs": [ "ABCDE12345.com.example.app", "ABCDE12345.com.example.app2" ],
             "components": [
               {
                  "#": "no_universal_links",
                  "exclude": true,
                  "comment": "Matches any URL with a fragment that equals no_universal_links and instructs the system not to open it as a universal link."
               },
               {
                  "/": "/buy/*",
                  "comment": "Matches any URL with a path that starts with /buy/."
               },
               {
                  "/": "/help/website/*",
                  "exclude": true,
                  "comment": "Matches any URL with a path that starts with /help/website/ and instructs the system not to open it as a universal link."
               },
               {
                  "/": "/help/*",
                  "?": { "articleNumber": "????" },
                  "comment": "Matches any URL with a path that starts with /help/ and that has a query item with name 'articleNumber' and a value of exactly four characters."
               }
             ]
           }
       ]
   },
   "webcredentials": {
      "apps": [ "ABCDE12345.com.example.app" ]
   },


    "appclips": {
        "apps": ["ABCED12345.com.example.MyApp.Clip"]
    }
}

File này cho anh em biết đường dẫn nào sẽ link tới app nào. Trong XCode anh em chỉ cần nhâp app links com.apple.developer.associated-domains entitlement là xong. Một domain sẽ được link tới nhiều ứng dụng và ngược lại một ứng dụng cũng có thể link tới nhiều domain.

Ví dụ như anh em truy cập và link https://yourdomain.com/dress/  với thiết lập “paths”:[ “/dress/”]  trong JSON file. Khi user nhập https://yourdomain.com/dress/1  trong Safari

  • Nếu app đã được cài đặt, app sẽ được mở lên khi người dùng truy cập đường dẫn ở trên Safari. Ta có thể handle View nào cần được mở
  • Nếu app chưa được cài đặt thì đường link https://yourdomain.com/dress/1 vẫn được mở trên Safari và bạn vẫn có thể hiển thị sản phẩm trên web hoặc chuyển hướng tới App Store.

Universal link xem ra là giải pháp hoàn hảo cho iOS. Nhưng một lần nữa, bản thân universal link cũng có một vài nhược điểm.

  • Đầu tiên là Universal link chỉ work trên Safari hoặc Chrome
  • Khi một site chuyển hướng với universal links. Nó chỉ hoạt động nếu người dùng ấn vào universal links, nếu link ấn trên email là https://anotherDomain.com/  chuyển hướng tới universal link là https://yourDomain.com/dress/1 thì universal link sẽ không work. Nhưng nếu mở link https://yourDomain.com từ safari thì lại work
  • Universal links sẽ không work nếu paste thẳng trên address bar
  • Univeral links sẽ không work nếu redirect thực hiện bằng JS.
  • Universal links sẽ không work nếu gọi bằng openURL ở trong app.

Phù, cuối cùng cũng hết. Phê con tê tê với deep links

9. Tham khảo

Cảm ơn anh em đã đón đọc – Thank you for your time, have a good day with deep links – Happy coding!

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

Xem thêm:

Cập nhật it jobs Developer lương cao mới nhất TopDev

Lưu ý cho Lock trong Java

Lưu ý cho Lock trong Java

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

Khi lập trình đa luồng việc đảm bảo tính threadsafevisiable,… là rất quan trọng. Để đạt được mục đích này, Java cung cấp rất nhiều phương pháp trong package java.util.concurrent

Bài viết này sẽ cung cấp cho các bạn đầy đủ những kiến thức về lớp này để có thể áp dụng vào các project của mình.

Khi lập trình hoặc các tài liệu về concurrent thường sẽ đề cập đến khái niệm ReentrantReentrant Lock. Vậy cụ thể tính Reentrant là gì? Xét ví dụ sau:

public class ReentrantTest {

    private final Object object = new Object();

    public void setA() {
        synchronized (object) {
            System.out.println("setA");
            setB();
        }
    }

    public void setB() {
        synchronized (object) {
            System.out.println("setB");
        }
    }

    public static void main(String[] args) {
        ReentrantTest t = new ReentrantTest();
        t.setA();
    }
}

Nếu Lock được sử dụng trong hàm main() bên trên không phải dạng Reentrant thì sẽ gây ra deadlock và không thể kết thúc được chương trình.

Trong Java có các loại reentrant lock sau :

  • synchronized
  • Các lock kế thừa từ class ReentrantLock.java. Trong quá trình làm việc của mình thì chỉ có một Lock không Reentrant đó là StampedLock

  Class trong Java là gì? Object trong Java là gì?

  Record class trong Java

Xét ví dụ khai báo ReentrantLock : var lock = new ReentrantLock();. Click vào trong lớp ReentrantLock.java ta thấy được hàm khởi tạo sau ta sẽ thấy FairSync và NonfairSync

    /**
 * Creates an instance of {@code ReentrantLock}.
 * This is equivalent to using {@code ReentrantLock(false)}.
 */
public ReentrantLock(){
        sync=new NonfairSync();
        }

/**
 * Creates an instance of {@code ReentrantLock} with the
 * given fairness policy.
 *
 * @param fair {@code true} if this lock should use a fair ordering policy
 */
public ReentrantLock(boolean fair){
        sync=fair?new FairSync():new NonfairSync();
        }

Giả sử ta có 3 threadT1,T2,T3 cùng muốn truy cập một tài nguyên R. Theo thứ tự thời gian thì T1 đến trước sau đó lần lượt là T2 và T3T2T3 đến sau nên phải đợi T1 release Lock mới có thể truy cập tài nguyên của R.

Vậy bài toán ở đây là sau khi T1 release Lock thì T1 hay T2 sẽ là luồng tiếp theo lấy được Lock.

Để giải quyết bài toán này Java có 2 chiến thuật :

  • FairSync: đảm bảo được thứ tự luồng nào chờ lâu nhất thì sẽ lấy được lock. Trong ví dụ trên là T2.
  • NonfairSync: không đảm bảo thứ tự, bất cứ luồng nào đang chờ đều có thể lấy được lock.

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

Dựa vào hàm khởi tạo mặc định Lock của Java thì chúng ta có thể đoán được NonfairSync sẽ mang lại hiệu năng tốt hơn.

NonfairSync mang lại hiệu năng cao hơn vì 2 lý do sau :

  • Nó không cần quan tâm đến thứ tự các thread nên sẽ không phải duy trì thêm một cấu trúc dữ liệu để phục vụ cho điều này vì vậy code phần này sẽ đơn giản hơn nhiều. Ngược lại FairSync cần phải sử dụng thêm cấu trúc dữ liệu AbstractQueuedSynchronizer để xác định được thứ tự sử dụng lock
  • Khi đánh thức tất cả các thread thì sẽ có thread dậy nhanh, thread dậy chậm. Vì vậy thread dậy trước sẽ lấy lock và thực hiện logic trước và sau đó nó sẽ trả lại lock cho các thread sau. Vì vậy sẽ tăng được hiệu năng sử dụng.

Giả sử ta có theo thời gian ta có thread T1, T2, T3T2, T3 đang chờ lock được trả lại của T1

  • Thời gian cần để thức dậy của T3 là w3 = 1ms
  • Thời gian thực hiện loigc của T3 là l3 = 1ms
  • Thời gian cần để thức dậy của T2 là w2 = 3ms
  • Thời gian thực hiện loigc của T2 là l2 = 2ms

Tổng thời gian để thực hiện xong logic của T2,T3 là:

  • FairSync : w2 + l2 + w3 + l3 = 3 + 2 + 1 +1 = 7 ms
  • NonfairSync: w3 +l3+ (w2 – w3 + l3) + l2 = 1 + 1+ (3 -1 -1 )+ 2 = 5 ms

Mặc định của các loại lock của Java sẽ sử dụng cách thức NonfairSync , vì nó mạng lại hiệu năng cao hơn với phương pháp FairSyncsynchronized sẽ sử dụng NonfairSync. Sẽ có benchmark bên dưới.

synchronized là một loại lock của Java, khi một thread gọi phương thức trong synchronized block thì nó sẽ tự động acquires một intrinsic lock.

synchronized là một dạng reentrant vì vậy trong ví dụ đầu tiên sẽ không bị deadlocksynchronized chỉ hỗ trợ NonfairSync.

Các dữ liệu được thay đổi trong synchronized block sẽ được tất cả các luồng nhìn thấy.

ReentrantLock chắc chắn sẽ là reentrant, nó hỗ trợ cả 2 loại NonfairSync và FairSync. Mặc định sẽ sử dụng chiến thuật NonfairSync.

Các dữ liệu được thay đổi trong ReentrantLock hoặc bất cứ loại lock nào đều được các luồng nhìn thấy khi thực hiện acquires lock

ReentrantLock implement interface Lock vì vậy nó cũng cấp thêm một số API mà synchronized không có như :

  • Hỗ trợ timeout khi acquires lock
  • tryLock() sẽ không block lại thread mà trả lại kết quả luôn là có acquires lock hay không

Sử dụng Lock interface thì lưu ý luôn luôn phải unlock tốt nhất nên dùng finally để tránh trường hợp deadlock.

  Java Serializable là gì? Serialization và Deserialization trong Java

  Java Developer là gì? Lộ trình để trở thành Java Developer

Các ảnh benchmark bên dưới được đo bởi phiên bản Java 11, theo throughput, Code đo hiệu năng tại Link.

benchmark

Một luồng đọc và luồng ghi

benchmark

Một luồng đọc và 19 luồng ghi

benchmark

19 luồng đọc và một luồng ghi.

Vì chưa tìm ra được chế độ để upload gallery trên github nên mọi người xem đầy đủ các hình ảnh benchmark tại benchmark-result

Đây không phải một Lock của Java, đây chỉ là một chiến thuật sử dụng Lock hiệu quả. Thiết kế này chia tài nguyên cần khóa thành các segment và một segment sẽ được kiểm soát độc lập với nhau.

Cách thiết kế này được sử dụng trong ConcurrentHashMap của JavaConcurrentHashMap có hàm khởi tạo sau:

public ConcurrentHashMap(int initialCapacity,float loadFactor,int concurrencyLevel);

Từ Java version < 1.8 giả sử concurrencyLevel=16 ở đây nghĩa sẽ có tối đa 16 thread có thể thay đổi dữ liệu trong ConcurrentHashMap thay vì chỉ 1 thread có quyền ghi vào Map.

Implement ConcurrentHashMap Java 1.7 ConcurrentHashMap java 1.7

Từ Java version >=1.8 concurrentLevel không còn ý nghĩa để giới hạn luồng ghi nữa, ConcurrentHashMap của phiên bản này đã chuyển sang implement bằng Unsafe và ít Lock hơn rất nhiều, cụ thể như sau:

  • Nếu hashslot hiện tại còn trống thì sẽ sử dụng lệnh U.compareAndSetObject(tab, ((long)i << ASHIFT) + ABASE, c, v); để thêm object vào hashTable, hàm này không block
  • Nếu hashslot đã có Object ghi vào thì sử dụng synchronized cho duy nhất hashslot đó để thực hiện ghi. Vì vậy số thread tối đa được có quyền thay đổi ConcurrentHashMap sẽ là số lượng hashslot

Chi tiết Implement ConcurrentHashMap Java 11 tại ConcurrentHashMap java 11

    final V putVal(K key,V value,boolean onlyIfAbsent){
        if(key==null||value==null)throw new NullPointerException();
        int hash=spread(key.hashCode());
        int binCount=0;
        for(Node<K, V>[]tab=table;;){
        Node<K, V> f;int n,i,fh;K fk;V fv;
        if(tab==null||(n=tab.length)==0)
        tab=initTable();
        else if((f=tabAt(tab,i=(n-1)&hash))==null){
        if(casTabAt(tab,i,null,new Node<K, V>(hash,key,value)))
        break;  // no lock when adding to empty bin
        }
        else if((fh=f.hash)==MOVED)
        tab=helpTransfer(tab,f);
        else if(onlyIfAbsent // check first node without acquiring lock
        &&fh==hash
        &&((fk=f.key)==key||(fk!=null&&key.equals(fk)))
        &&(fv=f.val)!=null)
        return fv;
        else{
        V oldVal=null;
synchronized (f){ // lock here
        if(tabAt(tab,i)==f){
        if(fh>=0){
        //............................
        }
        }

synchronized và ReentrantLock là các khóa độc quyền (Exclusive lock), nghĩa là trong một thời điểm chỉ có duy nhất một thread có quyền truy cập và giao tiếp với tài nguyên dùng chung.

Nhưng sẽ có rất nhiều chương trình có yêu cầu đọc nhiều hơn rất nhiều so với yêu cầu ghi. Sử dụng Exclusive lock sẽ làm giảm hiệu năng sử dụng trong trường hợp này.

Để nâng cao hiệu năng thì cần sử dụng một shared lock để các thread có thể cùng lúc có thể đọc dữ liệu dùng chung.

ReentrantReadWriteLock là một giải pháp cho các chương trình trên, nó cung cấp 2 loại Lock:

  • readlock : Dùng để read. Nhiều luồng có thể đọc dữ liệu cùng một lúc nếu không có luồng update dữ liệu
  • writelock : Dùng để write. Chỉ có 1 luồng được update dữ liệu tại một thời điểm.

Hiểu sâu hơn về ReentrantReadWriteLock cần phải trả lời được một số câu hỏi sau :

  • Có quá nhiều ReadLock đang chờ acquire() thì writelock sẽ phải chờ cho đến khi nào nữa thì mới có thể accquire được lock.
  • Khi một thread release writelock, thời điểm đó có yêu cầu accquire() của nhiều readlock() và writelock() thì readlock() hay writelock() sẽ được acquire(). Nếu readlock() được acquire thì sẽ tăng tính concurrent nhưng sẽ lại làm đói writelock

Tại phiên bản Java 11 thì ReentrantReadWriteLock đang được implement để thiên vị hơn cho writelock.

Tạo điều kiện tối đa cho writelock có thể acquire được Lock. Cụ thể khi đọc mã nguồn của ReentrantReadWriteLock khi thực hiện acquire() :

  • readlock : Một thread muốn acquire readlock() phải kiểm tra trong AbstractQueuedSynchronizer có writeLock() chờ được acquire hay không.
  • writelock :
    • Nếu lock có thể acquire (hiện tại không có readlock/writelock) thì thực hiện acquire và đánh dấu writelock đang giữ lock.
    • Nếu lock không thể acquire thì thực hiện ghi writeLock vào đầu AbstractQueuedSynchronizer, để được ưu tiên acquire

StampedLock là một loại lock mới cung cấp 3 loại lock: ReadLockWriteLock và Optimistic Read.

StampedLock không có tính chất Reentrant.

Optimistic Read sẽ mang lại 2 ưu điểm sau :

  • Optimistic Read không phải là một Lock thế nên tốc độ của nó sẽ nhanh hơn readLock
  • Write Thread sẽ không bị block khi có rất nhiều thread thực hiện Optimistic Read.

Pattern hay sử dụng với Optimistic Read như sau, tham khảo java doc StampedLock Java Doc

Theo benchmark thì StampedLock sẽ có tốc độ hơn rất nhiều so với ReentrantReadWriteLock khi có rất nhiều luồng đọc và ít luồng ghi.

Trong lập trình đơn luồng chúng ta sử dụng if-else để kiểm tra điều kiện sau đó thực hiện logic.

Trong lập trình đa luồng việc dùng if-else sẽ không khả thi bởi vì điều kiện sẽ được một thread khác thay đổi vậy nên sử dụng if-else sẽ không kết luận được gì cả.

Vì vậy chúng ta cần có một cơ chế để thực hiện giao tiếp giữa các Thread với nhau, để phục vụ điều đó chúng ta có interface Condition.

Nếu không sử dụng Condition, trong bài toán consumer-producer, các Thread giao tiếp thông qua một threadsafe queue có thể phải implement consumer như sau:

    public V take()throws InterruptedException{
        while(true){
            synchronized (this){
                if(!isEmpty())
                     return doTake();
                }
            Thread.sleep(100);
        }
    }

Thread sẽ phải sleep() một khoảng thời gian nhất định rồi kiểm tra lại xem đã có dữ liệu với trong queue chưa, điều này hiển nhiên là lãng phí.

Khi sử dụng Condition thì sẽ tiết kiệm hơn rất nhiều. Ví dụ method take() của ArrayBlockingQueue

public E take()throws InterruptedException{
        final ReentrantLock lock=this.lock;
        lock.lockInterruptibly();
        try{
            while(count==0)
                notEmpty.await();
            return dequeue();
        }finally{
            lock.unlock();
        }
    }

notEmpty ở đây sẽ là một Condition dùng để giao tiếp giữa các luồng consumer và producer. khi notEmpty.await() thì thread sẽ release lock,sau khi được thread khác đánh thức thì thread đang chờ bắt buộc phải acquire được lock trước khi thực hiện tiếp logic

Pattern khi sử dụng Condition thông thường sẽ là :

        acquire lock on object state 
        while(precondition does not hold){
            release lock
            wait until precondition might hold
            reacquire lock
        }
        perform action
        release lock
        (Java concurrent in practive)

Một số lưu ý khi sử dụng object.wait() hay Condition :

  • Nên sử dụng notifyAll()
  • Thread gọi notifyAll(), await(), wait() ,… nên là Thread acquired lock.
  • Nên để điều kiện check trong vòng lặp while() thay vì if-else. Bởi vì chúng ta cần thiết phải check lại điều kiện trước khi gọi await() và sau khi được trả về từ await() vì trong môi trường multiThread có thể điều kiện đã bị một Thread khác thay đổi.
  20 câu hỏi phỏng vấn Javascript dành cho Intern/Fresher

Trong ảnh benchmark bên trên chúng ta thấy một class khá mới là LongAdder. Lớp này có hiệu năng cực kỳ cao khi có nhiều luồng cùng thực hiện ghi vào. Lý do là lớp này đã sử dụng cơ chế segment khi có tương tranh khi ghi ( >= 2 luồng cùng thực hiện ghi vào LongAdder) và nguyên tắc padding dữ liệu cho các segment này.

padding là cơ chế chống lại false-sharing tại tầng Cache L1,L2,L3 của CPU. Bài viết về kỹ thuật này đã được giới thiệu qua tại Mechanical-sympathy, tương lai sẽ có bài riêng nói rõ hơn về cơ chế happen-before và padding.

Cụ thể ta xét code của LongAdder.

public class LongAdder extends Striped64 implements Serializable {
    transient volatile Cell[] cells;
    transient volatile long base;

    public void add(long x) {
        Cell[] cs;
        long b, v;
        int m;
        Cell c;
        if ((cs = cells) != null || !casBase(b = base, b + x)) {
            boolean uncontended = true;
            if (cs == null || (m = cs.length - 1) < 0 ||
                    (c = cs[getProbe() & m]) == null ||
                    !(uncontended = c.cas(v = c.value, v + x)))
                longAccumulate(x, null, uncontended);
        }
    }

    public long sum() {
        Cell[] cs = cells;
        long sum = base;
        if (cs != null) {
            for (Cell c : cs)
                if (c != null)
                    sum += c.value;
        }
        return sum;
    }
}

@jdk.internal.vm.annotation.Contended
static final class Cell {
    volatile long value;

    Cell(long x) {
        value = x;
    }

    final boolean cas(long cmp, long val) {
        return VALUE.compareAndSet(this, cmp, val);
    }

    final void reset() {
        VALUE.setVolatile(this, 0L);
    }

    final void reset(long identity) {
        VALUE.setVolatile(this, identity);
    }

    final long getAndSet(long val) {
        return (long) VALUE.getAndSet(this, val);
    }

    // VarHandle mechanics
    private static final VarHandle VALUE;

    static {
        try {
            MethodHandles.Lookup l = MethodHandles.lookup();
            VALUE = l.findVarHandle(Cell.class, "value", long.class);
        } catch (ReflectiveOperationException e) {
            throw new ExceptionInInitializerError(e);
        }
    }
}

Tại hàm add(long x) cũng tương tự như các lớp AtomicLongAdder cũng dùng cơ chế CAS để thực hiện thay đổi biến volatile long base.

Nhưng có chút khác biệt là khi thực hiện CAS bị false hoặc trước đó đã có lần bị false thì ngay lập tức tìm Cell tương ứng với luồng thực hiện hàm add(). Sau đó thực hiện CAS trên lớp Cell này.

Lớp Cell được đánh dấu là Contended thì JVM sẽ thực hiện padding các dữ liệu trong lớp này để tránh trường hợp false sharing.

False Sharing có thể sảy ra tại lớp LongAdder vì các thread không bị block khi thực hiện CAS trên lớp Cell. Và lớp LongAdder này lại lưu một mảng Cell, vậy rất có thể xảy ra trường hợp một thread thay đổi giá trị của Cell sẽ có thể khiến các thread đang thay đổi cell khác bị invalid cache.

Trên đây là các khái niệm cơ bản mình nghĩ các bạn cần phải nắm rõ để quá trình làm việc dễ dàng hơn, kèm theo đó cũng là một số kiến thực mình tự tìm hiểu và tổng hợp được trong quá trình làm việc. Nó sẽ phát huy khá nhiều trong quá trình phỏng vấn của các bạn đó.

Bài này khá dài rồi nên phần visiable mình sẽ viết tại bài blog của tháng sau. Hy vọng bài này cung cấp cho các bạn một chút kiến thức để trong quá trình làm việc hiệu quả hơn.

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

Xem thêm:

Tuyển dụng IT lương cao, đãi ngộ hấp dẫn. Ứng tuyển ngay!

Giới thiệu về JAMstack – kiến trúc phát triển web hiện đại

Giới thiệu về JAMstack

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

JAMstack là gì?

JAMstack là một kiến trúc phát triển web hiện đại. Nó không phải là ngôn ngữ lập trình hay bất kỳ hình thức công cụ nào. Đây là một cách thức phát triển web nhằm mục đích thực thi hiệu suất tốt hơn, bảo mật cao hơn, giảm chi phí mở rộng và giúp cho trải nghiệm của nhà phát triển trở nên tốt hơn.

Bạn có thể đã gặp các thuật ngữ cụ thể như MEANstackMERNstack. Đây chỉ là những thuật ngữ được sử dụng để phân loại hoặc nhóm một số công nghệ nhất định với mục đích đạt được một mục tiêu cụ thể. JAMstack cũng vậy, JAMstack ở đây là viết tắt của:

  • JavaScript
  • API
  • Markup
  • Stack nói chung chỉ là sự kết hợp của một số công nghệ được sử dụng để tạo ra một trang web hoặc ứng dụng di động. Vì vậy, JAMstack là sự kết hợp của JavaScript, API và Markup.
JAMstack

JAMstack là một kiến trúc phát triển web hiện đại dựa trên JavaScript phía client, các API có thể sử dụng lại và Markup dựng sẵn. Khi chúng ta nói về chủ đề Stack, chúng ta không còn nói về hệ điều hành, máy chủ web cụ thể, ngôn ngữ backend hoặc cơ sở dữ liệu. JAMstack không phải về công nghệ cụ thể. Nó là một cách mới để xây dựng các trang web và ứng dụng mang lại hiệu suất tốt hơn, bảo mật cao hơn, chi phí mở rộng thấp hơn và trải nghiệm nhà phát triển tốt hơn.

THEO TÀI LIỆU CHÍNH THỨC CỦA JAMSTACK

  IoV (Internet of vehicle) là gì? Kiến trúc IoV

  Phát triển web nhờ các nguồn thông tin miễn phí sao cho hiệu quả?

Tại sao là JAMstack ?

JAMstack

Các trang web truyền thống hoặc các trang web CMS (ví dụ: WordPress, Drupal, v.v.) phụ thuộc nhiều vào máy chủ, plugin và cơ sở dữ liệu. Nhưng JAMstack có thể tải một số JavaScript nhận dữ liệu từ API, phục vụ các tệp từ CDN và đánh dấu được tạo bằng trình tạo trang tĩnh trong thời gian triển khai.

  • JAMstack nhanh

Khi nói đến việc giảm thiểu thời gian tải, không gì có thể đánh bại các tệp được tạo sẵn được phân phối qua CDN. Các trang web JAMstack siêu nhanh vì HTML đã được tạo trong thời gian triển khai và chỉ được phân phối qua CDN mà không có bất kỳ sự can thiệp hoặc chậm trễ phụ trợ nào.

  • JAMstack được bảo mật cao

Mọi thứ hoạt động thông qua API và do đó không vi phạm cơ sở dữ liệu hoặc bảo mật. Với các quy trình phía máy chủ được trừu tượng hóa thành các API dịch vụ vi mô, các khu vực bề mặt cho các cuộc tấn công được giảm và do đó trang web của bạn trở nên được bảo mật cao.

  • JAMstack rẻ hơn và dễ mở rộng hơn

Các trang web JAMstack chỉ chứa một số tệp với kích thước tối thiểu có thể được phân phát ở mọi nơi. Chia tỷ lệ là vấn đề phân phát các tệp đó ở một nơi khác hoặc thông qua CDN.

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

Quy trình làm việc của website tĩnh và website động

Quy trình làm việc của website tĩnh và website động

Đối với các website truyền thống với LAMP stack, lập trình viên viết chương trình và lưu trữ trên máy chủ. Khi người dùng gửi yêu cầu từ phía máy khách, trình duyệt sẽ truy vấn về máy chủ và trả lại kết quả tại máy khách.
Trong khi đó, quy trình làm việc của website tĩnh diễn ra như sau: lập trình viên viết các mã code và lưu trữ dữ liệu trên CDN. Khi người dùng truy cập vào website, các dữ liệu được tải ngay từ lần đầu vào trang giúp tốc độ truy cập website dễ dàng và nhanh chóng hơn.
Nói tóm lại, quy trình làm việc của JAMstack giảm đáng kể nhờ kiến trúc website nhỏ gọn, giúp giảm thời gian tải trang và tối ưu các technical SEO khác.

Vậy website JAMstack có thực sự “tĩnh” không?
Mặc dù sản phẩm cuối cùng của các trang web được tạo bởi JAMstack là các tệp tĩnh, nhưng các tệp đó vẫn có các chức năng động như biểu mẫu, nhận xét, cổng thanh toán,… thường được xử lý bởi API của bên thứ ba (giao diện lập trình ứng dụng).
Trong trường hợp của JAMstack, tĩnh không có nghĩa là cố định, mà là việc các dữ liệu được tải một lần duy nhất. Chúng ta có thể gọi chúng là một dạng website tĩnh mới với rất nhiều lợi ích kinh doanh.

Các phương pháp hay nhất với JAMstack

  • Sử dụng CDN để phân phối tệp của bạn thay vì máy chủ
  • Việc cài đặt và đóng góp vào dự án của bạn phải dễ dàng và ít phức tạp hơn. Sử dụng các công cụ như npm và Git để đảm bảo thiết lập chuẩn và nhanh hơn.
  • Sử dụng các công cụ xây dựng và làm cho dự án của bạn tương thích với tất cả các trình duyệt (ví dụ: Babel, Browserify, Webpack, v.v.)
  • Đảm bảo dự án của bạn đạt tiêu chuẩn web và khả năng truy cập cao
  • Đảm bảo quá trình xây dựng của bạn được tự động hóa để giảm bớt căng thẳng.
  • Làm cho quá trình triển khai của bạn tự động, bạn có thể sử dụng các nền tảng như Netlify để thực hiện việc này

Làm cách nào để bắt đầu với JAMstack?

Bạn có thể sử dụng một số công nghệ đã được xây dựng để tạo các ứng dụng JAMstack trong vài phút, ví dụ như:

  • Gatsby: Gatsby là một khung mã nguồn mở và miễn phí dựa trên React giúp các nhà phát triển xây dựng các trang web và ứng dụng nhanh chóng mặt
  • NuxtJS: NuxtJS là Framework Vue.js dành cho các ứng dụng Universal, các ứng dụng được tạo tĩnh, ứng dụng trang đơn, ứng dụng web tiến bộ và ứng dụng dành cho máy tính để bàn
  • Hugo: Hugo là khuôn khổ xây dựng trang web nhanh nhất thế giới. Nó là một trong những trình tạo trang tĩnh mã nguồn mở phổ biến nhất. Với tốc độ và tính linh hoạt đáng kinh ngạc, Hugo khiến việc xây dựng trang web trở nên thú vị trở lại.
  • Netlify CMS: Netlify CMS là một quản lý nội dung mã nguồn mở cho quy trình làm việc Git của bạn, có thể được sử dụng với bất kỳ trình tạo trang tĩnh nào để có dự án web nhanh hơn và linh hoạt hơn
  • Contentful: Contentful là một hệ thống quản lý nội dung thông minh hơn và liền mạch, cung cấp cho các biên tập viên và nhà phát triển một nội dung thống nhất, do đó tăng cường sự hợp tác và đảm bảo các sản phẩm kỹ thuật số được đưa ra thị trường nhanh hơn.
  • Svelte: Svelte là một cách tiếp cận mới triệt để để xây dựng giao diện người dùng. Trong khi các framework truyền thống như React và Vue thực hiện phần lớn công việc của chúng trong trình duyệt, thì Svelte chuyển hoạt động sang bước biên dịch xảy ra khi bạn xây dựng ứng dụng của mình.

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

Xem thêm:

Cập nhật it jobs Developer lương cao mới nhất TopDev

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

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

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

Một trong những khía cạnh quan trọng của lớp nghiệp vụ (business layer) là lớp truy cập dữ liệu (data access layer) để kết nối các dịch vụ (service) với cơ sở dữ liệu (database). Việc truy cập dữ liệu tùy thuộc vào nguồn dữ liệu, loại lưu trữ như database, text file, xml file, json file, …Thậm chí nó khác với cách triển khai của nó, ví dụ: cú pháp truy vấn SQL khác nhau giữa MySQL, SQL Server, Oracle, … Với mong muốn sẽ không có gì khác biệt khi truy cập cơ sở dữ liệu quan hệ, phân tích xml file hay bất kỳ nguồn dữ liệu nào khác, chúng ta có thể áp dụng mẫu thiết kế đối tượng truy cập dữ liệu (Data Access Object Pattern– DAO Pattern).

DAO Pattern là gì?

Data Access Object (DAO) Pattern là một trong những Pattern thuộc nhóm cấu trúc (Structural Pattern).  Mẫu thiết kế DAO được sử dụng để phân tách logic lưu trữ dữ liệu trong một lớp riêng biệt. Theo cách này, các service được che dấu về cách các hoạt động cấp thấp để truy cập cơ sở dữ liệu được thực hiện. Nó còn được gọi là nguyên tắc Tách logic (Separation of Logic).

Ý tưởng là thay vì có logic giao tiếp trực tiếp với cơ sở dữ liệu, hệ thống file, dịch vụ web hoặc bất kỳ cơ chế lưu trữ nào mà ứng dụng cần sử dụng, chúng ta sẽ để logic này sẽ giao tiếp với lớp trung gian DAO. Lớp DAO này sau đó giao tiếp với hệ thống lưu trữ, hệ quản trị CSDL như thực hiện các công việc liên quan đến lưu trữ và truy vấn dữ liệu (tìm kiếm, thêm, xóa, sửa,…).

DAO Pattern dựa trên các nguyên tắc thiết kế abstraction và encapsulation. Nó bảo vệ phần còn lại của ứng dụng khỏi mọi thay đổi trong lớp lưu trữ, ví dụ: thay đổi database từ Oracle sang MySQL, thay đổi công nghệ lưu trữ từ file sang database.

Trong Java, DAO được triển khai theo nhiều cách khác nhau như Java Persistence API,  Enterprise Java Bean (EJP), Object-relational mapping (ORM) với các implement cụ thể như HibernateiBATISSpring JPA, … Chi tiết về các phần này chúng ta sẽ cùng thảo luận ở một bài viết khác.

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

  Vuejs Design Pattern – Dăm ba pattern phổ biến

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

Các thành phần tham gia mẫu Data Access Object (DAO) Pattern:

  • BusinessObject : đại diện cho Client, yêu cầu truy cập vào nguồn dữ liệu để lấy và lưu trữ dữ liệu.
  • DataAccessObject (DAO): là một interface định nghĩa các phương thức trừu tượng việc triển khai truy cập dữ liệu cơ bản cho BusinessObject để cho phép truy cập vào nguồn dữ liệu (DataSource).
  • DataAccessObjectConcrete : cài đặt các phương thức được định nghĩa trong DAO, lớp này sẽ thao tác trực tiếp với nguồn dữ liệu (DataSource).
  • DataSource : là nơi chứa dữ liệu, nó có thể là database, xml, json, text file, webservice, …
  • TransferObject : là một POJO (Plain old Java object) object, chứa các phương thức get/set được sử dụng để lưu trữ dữ liệu và được sử dụng trong DAO class.

Tham khảo việc làm Java HOT trên TopDev

Ví dụ sử dụng DAO Pattern

Ví dụ bên dưới cho chúng ta thấy cách áp dụng DAO Pattern trong việc cung cấp interface chung để thao tác với cơ sở dữ liệu (CRUD). Các thao tác này bao gồm: Create/ Save, Read/ Get, Update, Delete.

User.java

package com.gpcoder.patterns.structural.dao;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class User {

    private int id;

    private String name;

    private String email;
}

Dao.java

package com.gpcoder.patterns.structural.dao;

import java.util.List;
import java.util.Optional;

public interface Dao<T> {

    List<T> getAll();

    Optional<T> get(int id);

    void save(T t);

    void update(T t);

    void delete(T t);
}

UserDao.java

package com.gpcoder.patterns.structural.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class UserDao implements Dao<User> {

    private List<User> users = new ArrayList<>();

    public UserDao() {
        users.add(new User(1, "GP Coder", "contact@gpcoder.com"));
        users.add(new User(2, "Giang Phan", "gpcodervn@gmail.com"));
    } 

    @Override
    public List<User> getAll() {
        return users;
    }

    @Override
    public Optional<User> get(int id) {
        return users.stream().filter(u -> u.getId() == id).findFirst();
    }

    @Override
    public void save(User user) {
        users.add(user);
    }

    @Override
    public void update(User user) {
        get(user.getId()).ifPresent(existUser -> {
            existUser.setName(user.getName());
            existUser.setEmail(user.getEmail());
        });
     }

     @Override
     public void delete(User user) {
         get(user.getId()).ifPresent(existUser -> users.remove(existUser));
     }
}

DaoPatternExample.java

package com.gpcoder.patterns.structural.dao;

public class DaoPatternExample {

    private static Dao<User> userDao;

    public static void main(String[] args) {
        userDao = new UserDao();

        User user1 = userDao.get(1).get();
        System.out.println("user1: " + user1);

        user1.setName("updated." + user1.getName());
        userDao.update(user1);

        System.out.println("All users: ");
        userDao.getAll().forEach(user -> System.out.println(user));
    }
}

User.java

user1: User(id=1, name=GP Coder, email=contact@gpcoder.com)
All users: 
User(id=1, name=updated.GP Coder, email=contact@gpcoder.com)
User(id=2, name=Giang Phan, email=gpcodervn@gmail.com)

Lợi ích của DAO Pattern là gì?

  • Giảm sự kết nối (loose coupling) giữa logic nghiệp vụ (Business) và logic lưu trữ (Persistence).
  • Mẫu DAO cho phép đóng gói code để thực hiện thao tác CRUD, ngăn chặn việc implement riêng lẻ trong từng phần khác nhau của ứng dụng.
  • Dễ mở rộng, bảo trì: tất cả các chi tiết lưu trữ được ẩn khỏi phần còn lại của ứng dụng. Do đó, những thay đổi có thể được thực hiện bằng cách chỉ sửa đổi một implement của DAO trong khi phần còn lại của ứng dụng không bị ảnh hưởng. DAO hoạt động như một trung gian giữa ứng dụng và cơ sở dữ liệu.
  • Dễ hiểu: mọi người đều theo một quy chuẩn đã được định sẵn, nên dễ hiểu hơn, tiết kiệm được nhiều thời gian hơn.
  • Trong một dự án lớn hơn, các nhóm khác nhau làm việc trên các phần khác nhau của ứng dụng, mẫu DAO cho phép phân tách rõ ràng các thành phần này.

Sử dụng DAO Pattern khi nào?

  • Khi muốn thay đổi nguồn dữ liệu sau này, như chuyển từ cơ dữ liệu MySQL sang Oracle, SQL Server, …
  • Khi muốn phân tách rõ ràng các thành phần của ứng dụng.
Bài viết gốc được đăng tải tại gpcoder.com

Java Talk: Java – Ngôi sao hết thời?

Talkshow Java

Java “hết thời” hay “chết dần” luôn là quan điểm nhận về nhiều ý kiến trái chiều trong cộng đồng Kỹ sư phần mềm những năm gần đây. Liệu đó có phải là sự thật hay chỉ là lời đồn đại trong thế giới “tech-biz”?

*Nội dung bài viết tham khảo từ sự kiện Java Talk: Java – Ngôi sao hết thời? do CMC Global tổ chức, với sự đồng hành của Viblo Platform và Trung tâm Đổi mới Sáng tạo Quốc gia (NIC). Sự kiện được dẫn dắt bởi anh Phan Tích Hoàng – Solution Architect và anh Nguyễn Thế Hưng – Technical Leader đến từ CMC Global.

Talkshow Java

Sự thất thế của Java

Java là ngôn ngữ lập trình hướng đối tượng được phát triển bởi Sun Microsystems, phát hành lần đầu tiên năm 1995 và được Tập đoàn Oracle mua lại năm 2010. Tính đến nay, Java đã qua nhiều lần cải tiến với tổng cộng 19 phiên bản được phát hành.

Tuy nhiên, Java đang không tránh khỏi sự cạnh tranh gay gắt của những ngôn ngữ lập trình hiện đại với những điểm ưu việt riêng, mang lại tính cạnh tranh và phần nào “thắng thế” Java. 

Anh Phan Tích Hoàng (Solution Architect, CMC Global), diễn giả trong sự kiện chia sẻ “Lần đầu làm quen với Java từ những năm 1997, mình bị thu hút bởi những triết lý mới của ngôn ngữ này. Ưu điểm lớn nhất của Java là tính ổn định. Nhưng nếu làm cùng một công việc, Java phải đòi hỏi nhiều dòng code hơn. Điều này chính là bất lợi của Java so với các ngôn ngữ khác.”

Đồng quan điểm, anh Nguyễn Thế Hưng (Technical Leader, CMC Global) cũng cho rằng đứng trước sự ra đời của nhiều công nghệ và ngôn ngữ lập trình mới, Java đang dần đánh mất vị trí dẫn đầu! Những ngôn ngữ mới xuất hiện được cải tiến tối ưu hơn như Golang, Rust… dần thay thế và “soán ngôi vương” của “anh cả” Java. 

Thời kỳ cực thịnh, Java từng được sử dụng ở hầu hết các dự án phát triển phần mềm, nhưng đến nay đang bị đào thải dần ở nhiều mảng không phù hợp.

Vậy Java liệu có đang chết dần?

Câu trả lời là Không! Ngôn ngữ lập trình mới xuất hiện có phần nào “thắng thế” Java, tuy nhiên thực tế cho thấy vẫn rất nhiều sản phẩm công nghệ hiện tại đang và sẽ sử dụng Java.  

Những dự án vốn đã phát triển bằng Java từ thưở “khai sinh lập địa” rất khó để chuyển hoàn toàn sang một ngôn ngữ mới, một công nghệ mới. Còn với những dự án bắt đầu xây dựng, lý do nào khiến đội ngũ phát triển vẫn quyết định chọn Java làm ngôn ngữ chính?

Thứ nhất, Java vẫn đang thực hiện tốt “sứ mệnh” đáp ứng phù hợp bài toán doanh nghiệp đưa ra. Thứ hai, đội ngũ lập trình viên Java (Java Developer) rất đông đảo trên thị trường nhân sự. Nhiều SA hay CTO có kinh nghiệm lâu năm “gắn bó” với Java, họ sẽ tiếp tục lựa chọn ngôn ngữ này thay vì mạo hiểm chọn những công nghệ mới chưa có nhiều kinh nghiệm. 

Đồng thời, với mức phổ biến của Java, các sản phẩm viết bằng Java luôn có sẵn với chi phí tối ưu, giúp cho việc phát triển phần mềm nhanh hơn. Có thể kể tới các sản phẩm của Atlassian, Spring, Oracle…

Các lập trình viên cũng chia sẻ Java là một trong số ít ngôn ngữ lập trình dễ tiếp cận, dễ học đối với người mới bắt đầu. Java là ngôn ngữ phổ thông được giảng dạy phổ biến tại nhiều trường đại học, trung tâm đào tạo công nghệ. Học liệu, tài nguyên học Java vô cùng đa dạng trên cả nền tảng miễn phí và trả phí. Từ đó giúp các bạn có nhu cầu tìm hiểu dễ dàng học hỏi và tiếp cận kiến thức mới dễ dàng hơn. 

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

Sự chuyển mình của Java với Reactive Programming và Spring Webflux

Đứng trước sự cạnh tranh, Java cũng buộc phải được thay đổi, cải tiến qua từng phiên bản. Trước kia nếu Sun mất ba năm release một phiên bản thì nay Oracle rất nhạy bén với xu hướng release sản phẩm nhanh (một năm hai phiên bản và ba năm một phiên bản LTS). 

Xét về diện rộng, cộng đồng Java, libs, tool đang có nhiều cải tiến tối ưu hơn. Spring boot loại bỏ những thứ rườm rà của Spring MVC (khai báo manifest quá nhiều), hay Webflux hỗ trợ cách viết reactive programming (giúp làm async tốt hơn, dữ liệu được stream liên tục và liền mạch). 

Xét về diện hẹp, Java 8 ra đời với cải biến hỗ trợ Stream API (Functional programming), Async/Await. Java 9 dự kiến ra mắt cuối tháng 9 hứa hẹn nhiều tính năng hấp dẫn. 

Cụ thể về Spring Webflux, đây là một trong những công cụ phát triển web mới được ra đời từ Spring 5, hỗ trợ việc xây dựng ứng dụng web theo chuẩn mới – Reactive. Spring Webflux không yêu cầu tạo nhiều thread pool. Thông thường với 1,000 request mình cần 1,000 thread để đáp ứng, còn công nghệ Reactive chỉ cần 10 thread, sau đó tiếp nhận request và tiếp tục forward sang đội lập trình xử lý. Đây chính là mô hình event driven, non-blocking trong công nghệ thông tin. 

Cách viết code và tư duy của Spring Webflux cũng mạch lạc và dễ viết hơn so với những phiên bản trước. Tùy từng bài toán cụ thể khi lựa chọn Firmware, công nghệ Webflux hay Spring boot, reactive hay thông thường… sẽ có ưu điểm và nhược điểm riêng khi áp dụng. 

Anh Phan Tích Hoàng (Solution Architect, CMC Global): “Học cái mới, đồng thời nắm chắc kiến thức cơ bản giúp bạn có “tầm nhìn” của một software engineer hiện đại”.

Talkshow Java CMC Global
Anh Phan Tích Hoàng (Solution Architect, CMC Global): “Học cái mới, đồng thời nắm chắc kiến thức cơ bản giúp bạn có “tầm nhìn” của một software engineer hiện đại”

Cơ hội phát triển nào với nghề Java Developer?

Anh Nguyễn Thế Hưng cho rằng “Nói về tương lai thì mình không dám chắc điều gì, nhưng hiện tại Java vẫn có nhiều “đất dụng võ” trong thị trường sản xuất phần mềm. Bản thân mình đã từng suy nghĩ về tương lai khi làm Java Developer: Nên đi theo hướng nào? Cơ hội phát triển con đường sự nghiệp ra sao?”

Thay vì mất thời gian vào việc suy nghĩ tương lai, hãy bắt tay vào việc trau dồi kiến thức, nâng cao kỹ năng để tạo ra tương lai cho chính bản thân mình. Bạn hãy luôn đặt tư tưởng mình là một kỹ sư phần mềm, không chỉ đơn thuần là một Java Developer hay tự thu hẹp, hạn chế mình trong một ngôn ngữ lập trình nào. 

“Nắm chắc những kiến thức nền tảng như ngoại ngữ, tư duy logic… cộng thêm niềm đam mê và sự cầu thị trong công việc, mình tin chắc rằng khi gặp những công việc phụ thuộc vào ngôn ngữ lập trình hay công nghệ mới, các bạn đều có thể tiếp cận hòa nhập và hoàn thành tốt.” Anh Hưng chia sẻ

>> Tìm hiểu vị trí Java Developer từ CMC Global tại:  https://s2k.cmcglobal.com.vn/javashow2022

————————–

Đừng bỏ lỡ số tiếp theo của Java Talk với chủ đề: TDD/BDD in Software Developmemt – What, Why & How?  – Sự kiện đánh dấu sự trở lại bùng nổ của Java Show, khởi đầu chuỗi hoạt động chuyên môn từ CMC Global dành riêng cho Java Developer và cộng đồng CNTT trong năm 2023.

Java Talk CMC Global

Hàng loạt quà tặng CÔNG NGHỆ cực “hot” với tổng trị giá lên đến 10,000,000 VND sẽ được trao cho những người tham gia trực tiếp trong sự kiện. 

Chi tiết sự kiện & đăng ký tại: https://s2k.cmcglobal.com.vn/event

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

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

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

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

Trong các ứng dụng, một số đối tượng có thông tin về trạng thái. Hành vi của đối tượng phụ thuộc vào trạng thái của nó tại thời điểm thực thi (run-time) và các phương thức xử lý nghiệp vụ có thể thay đổi trạng thái buộc đối tượng có hành vi xử lý khác đi. Trong trường hợp như vậy, chúng ta có thể sử dụng State Pattern.

State Pattern là gì?

Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.

State Pattern là một trong những Pattern thuộc nhóm hành vi (Behavior Pattern). Nó cho phép một đối tượng thay đổi hành vi của nó khi trạng thái nội bộ của nó thay đổi. Đối tượng sẽ xuất hiện để thay đổi lớp của nó.

  Thông não Java Design Pattern – Dependency Injection

  Tìm hiểu Java Design Pattern – Service Locator

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

Các thành phần tham gia State Pattern

Các thành phần tham gia State Pattern:

  • Context : được sử dụng bởi Client. Client không truy cập trực tiếp đến State của đối tượng. Lớp Context này chứa thông tin của ConcreteState object, cho hành vi nào tương ứng với trạng thái nào hiện đang được thực hiện.
  • State : là một interface hoặc abstract class xác định các đặc tính cơ bản của tất cả các đối tượng ConcreteState. Chúng sẽ được sử dụng bởi đối tượng Context để truy cập chức năng có thể thay đổi.
  • ConcreteState : cài đặt các phương thức của State. Mỗi ConcreteState có thể thực hiện logic và hành vi của riêng nó tùy thuộc vào Context.

Một vài điểm cần ghi nhớ khi áp dụng pattern này:

  • Một đối tượng nên thay đổi hành vi của nó khi trạng thái bên trong của nó thay đổi.
  • Mỗi State nên được xác định độc lập.
  • Thêm các trạng thái mới sẽ không làm ảnh hưởng đến các trạng thái hoặc chức năng khác.

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

Ví dụ State Pattern

Giả sử chúng ta cần xây dựng một ứng dụng quản lý Document. Một Document có thể bao gồm các trạng thái: tạo mới (New), trình phê duyệt (Submitted), phê duyệt (Approved) và từ chối (Rejected).

Với yêu cầu trên, chương trình của chúng ta như sau:

package com.gpcoder.patterns.behavioral.state.document.bad;

enum DocumentState {
NEW, SUBMITTED, APPROVED, REJECTED
}

class DocumentService {
    private DocumentState state;

    public void setState(DocumentState state) {
        this.state = state;
    }

public void handleRequest() {
    switch (state) {
    case NEW:
        System.out.println("Create a new document");
        break;
    case SUBMITTED:
        System.out.println("Submitted");
        break;
    case APPROVED:
        System.out.println("Approved");
        break;
    case REJECTED:
        System.out.println("Rejected");
        break;

    default:
        break;
    }
  }
}

public class DocumentApp {

    public static void main(String[] args) {
        DocumentService service = new DocumentService();

        service.setState(DocumentState.NEW);
        service.handleRequest();

        service.setState(DocumentState.SUBMITTED);
        service.handleRequest();

        service.setState(DocumentState.APPROVED);
        service.handleRequest();
    }
}

Output của chương trình:

Create a new document
Submitted
Approved

Như bạn thấy chương trình trên chạy ok, không vấn đề gì. Nhưng bây giờ chúng ta muốn thêm một trạng thái mới như lưu nháp (Save Draft). Đơn giản chúng ta chỉ cần thêm vào enum một giá trị mới và thêm điều kiện xử lý trong switch-case. Tuy nhiên, nếu làm như vậy thì chúng ta đã vi phạm nguyên tắc Open/Close. Mỗi khi có thêm một trạng thái mới chúng ta phải sửa nhiều nơi, code trong phương thức handleRequest() ngày càng nhiều và cần phải test lại toàn bộ app.

Bây giờ chúng ta hãy áp dụng State Pattern cho chương trình trên:

design-patterns-state-example

  • Đầu tiên chúng ta sẽ tạo 1 base inteface để nhận yêu cầu xử lý. Lớp này gọi là State.
  • Tiếp theo, ứng với mỗi giá trị trong enum, chúng ta sẽ tạo một class mới và implement các phương thức của State.
  • Cuối cùng, chúng ta tạo một class Context. Class này chứa thông tin State hiện tại và nhận yêu cầu xử lý trực tiếp từ Client.

State.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public interface State {

    void handleRequest();
}

NewState.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public class NewState implements State {

    @Override
    public void handleRequest() {
        System.out.println("Create a new document");
    }
}

SubmittedState.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public class SubmittedState implements State {

    @Override
    public void handleRequest() {
        System.out.println("Submitted");
    }
}

ApprovedState.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public class ApprovedState implements State {

    @Override
    public void handleRequest() {
        System.out.println("Approved");
    }
}

RejectedState.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public class RejectedState implements State {

    @Override
    public void handleRequest() {
        System.out.println("Rejected");
    }
}

DocumentContext.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public class DocumentContext {

    private State state;

    public void setState(State state) {
        this.state = state;
    }

    public void applyState() {
        this.state.handleRequest();
    }
}

StatePatternExample.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public class StatePatternExample {

    public static void main(String[] args) {
        DocumentContext context = new DocumentContext();

        context.setState(new NewState());
        context.applyState();

        context.setState(new SubmittedState());
        context.applyState();

        context.setState(new ApprovedState());
        context.applyState();
    }
}

Output của chương trình:

Create a new document
Submitted
Approved

Như bạn thấy, kết quả cũng không đổi. Tuy nhiên, chúng ta rất dễ dàng mở rộng. Nếu muốn thêm một trạng thái mới như lưu tạm (Save Draft), đơn giản tạo một class mới implements từ State mà không làm ảnh hưởng đến các State khác và Context.

Lợi ích của State Pattern là gì?

Lợi ích:

  • Đảm bảo nguyên tắc Single responsibility principle (SRP) : tách biệt mỗi State tương ứng với 1 class riêng biệt.
  • Đảm bảo nguyên tắc Open/Closed Principle (OCP) : chúng ta có thể thêm một State mới mà không ảnh hưởng đến State khác hay Context hiện có.
  • Giữ hành vi cụ thể tương ứng với trạng thái.
  • Giúp chuyển trạng thái một cách rõ ràng.

Sử dụng State Pattern khi nào?

  • Khi hành vi của đối tượng phụ thuộc vào trạng thái của nó và nó phải có khả năng thay đổi hành vi của nó lúc run-time theo trạng thái mới.
  • Khi nhiều điều kiện phức tạp buộc đối tượng phụ thuộc vào trạng thái của nó.

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

Messege Queue – Bộ phận không thể thiếu trong các hệ thống lớn và Microservice Architecture

Messege Queue

Bài viết được cho phép bởi tác giả Phạm Huy Hoàng

Hôm nay, chúng ta cùng tìm hiểu về Message Queue. Đây là một thành phần cực kì quan trọng, không thể thiếu trong các hệ thống lớn (mình cá là Facebook, Google lẫn LinkedIn đều có nó trong hệ thống), trong kiến trúc microservice.

Tuy vậy, nếu không gặp các dự án lớn hoặc dự án đặc thù, các bạn sẽ không hề biết tới thứ này. Vậy Message Queue là gì, nó có gì hay ho mà được sử dụng nhiều như vậy?

Đọc xong bài này bạn sẽ biết ngay nhé!

Messege Queue là cái chi chi?

Nói một cách huề vốn, Message Queue tức là một cái Queue (hàng đợi), chứa nhiều Message.

message-queue-small
Message Queue tức là một queue (hàng đợi), chứa các Message

Đùa thế thôi, các bạn có thể hiểu message queue là một hộp thư, cho phép các thành phần/service trong một hệ thống (hoặc nhiều hệ thống), gửi thông tin cho nhau.

Sở dĩ gọi nó là queue (hàng đợi) vì nó thực hiện việc lấy message theo cơ chế FIFO – First In First Out, tức đút vào trước thì rút ra trước.

  Message Queue VS Message Bus

  Kafka là gì? Ứng dụng Kafka cơ bản cho hệ thống message

Một hệ thống sử dụng Message Queue thường có những thành phần sau đây:

  • Message: Thông tin được gửi đi (có thể là text, binary hoặc JSON)
  • Message Queue: Nơi chứa những message này, cho phép producer và consumer có thể trao đổi với nhau
  • Producer: Chương trình/service tạo ra thông tin, đưa thông tin vào message queue
  • Consumer: Chương trình/service nhận message từ message queue và xử lý
  • Một chương trình/service có thể vừa là producer, vừa là consumer 

sqs_seo_queue

Message Queue được sử dụng ra sao trong thực tế?

Trong các hệ thống dùng kiến trúc microservice, ta sử dụng message queue để giúp các service liên hệ với nhau một cách bất đồng bộService A làm xong việc có thể gửi message queue để service B biết mà xử lý, không cần phải chờ service B làm xong.

Giả sử, mình có một trang web cho phép người dùng tải link từ mu*vl, nhầm, từ Youtube, mình sẽ có các bộ phận sau:

  • Web service: Là 1 producer. Nhận thông tin (url Youtube) từ phía người dùng, đưa thông tin này vào message queue
  • Processing Service: Vừa là consumer vừa là producer. Service này đọc url Youtube từ message queue, bắt đầu tải file về và encode lại, lưu vào server. Sau khi encode xong, nó đưa url của file đã encode vào message queue
  • Uploading Service:  Khi nhận được message từ processing server, nó sẽ upload các video đó lên Google Drive v…v

rabbitmq-beginners-updated
Các service gửi/nhận thông tin thông qua message queue

Trong thực tế, message queue giải quyết được khá nhiều vấn đề hóc búa trong hệ thống:

  • Đảm bảo duration/recovery: Do message đã được lưu trong queue, khi 1 service đang xử lý nhưng bị crash hoặc lỗi, ta không lo bị mất dữ liệu; vì có thể lấy message từ trong queue ra và chạy lại. Trong 1 hệ thống có nhiều consumer, nếu 1, 2 consume bị crash cũng không làm sụp toàn hệ thống
  • Phân tách hệ thống: Giúp phân tách hệ thống thành nhiều service nhỏ hơn, mỗi service chỉ xử lý 1 chức năng nhất định (Ưu nhược điểm thì các bạn xem lại bài về microservice nhé)
  • Hộ trợ rate limit, batching: Trong nhiều trường hợp, năng lực xử lý hệ thống có hạn (chỉ có thể xử lý 300 đơn hàng/s). Với message queue, ta có thể dần dần lấy đơn hàng trong queue ra xử lý, không sợ thất lại. Hoặc thay vì mỗi lần gửi email mất thời gian lâu, ta có thể đợi message queue có yêu cầu gửi 200 email rồi gửi luôn 1 lượt.
  • Dễ scaling hệ thống: Vào giờ cao điểm, nhiều truy vấn, ta có thể tăng số lượng consumer lên để xử lý được nhiều messege hơn. Khi không cần ta có thể giảm lại.

Messege-Queue
Khi cần, ta có thể dễ dàng scale bằng cách tăng số lượng consumer/receiver lên

 

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

Một số điểm cần lưu ý

Tất nhiên, không có công nghệ nào là vạn năng. Khi sử dụng bất cứ công nghệ nào, ta cũng cần biết những điều cần lưu ý:

  • Khó xử lý đồng bộ: Không phải hệ thống nào cũng cần tới message queue. Nếu như service A gọi service B, theo cơ chế đồng bộ, cần kết quả xử lý ngay, ta nên dùng Rest hoặc gRPC sẽ tốt hơn.
  • Làm hệ thống phức tạp hơn: Thêm message queue sẽ tăng tính phức tạp của hệ thống.  Ta cần phải biết rõ message nào gửi vào queue nào, ai gửi ai nhận. Lúc debug ở local cũng sẽ khó khăn hơn
  • Cần đảm bảo message format: Để gửi/nhận, 2 phía producer và consumer phải thống nhất format với nhau. Nếu không cẩn thận lỡ 1 bên thay đổi sẽ làm bên kia không đọc được dữ liệu.
  • Cần Monitoring Queue: Cần có các biện phát theo dõi (monitor), để đảm bảo lượng message queue không quá nhiều, làm đầy queue. Queue tốt nhất là queue luôn rỗng, hoặc số lượng message trong queue không tăng lên (message gửi vào queue đều bị consume hết)

Một số message queue hay được dùng hiện này bao gồm:

  • RabbitMQ
  • Kafka (Kafka còn làm được lắm trò hay ho hơn message queue nữa cơ)
  • Amazon SQS
  • MSMQ (Microsoft Message Queuing)
  • RocketMQ
  • ZeroMQ

RabbitMQ và Apache Kafka
RabbitMQ và Apache Kafka là 2 message queue khá phổ biến hiện tại

 

Tạm kết

Đấy, trong bài này mình đã chia sẻ về message queue, một bộ phận không thể thiếu trong các hệ thống lớn, các hệ thống sử dụng kiến trúc microservice.

Khi các bạn ở tầm senior, tầm software architect, trong quá trình làm việc/phỏng vấn chắc chắn sẽ đụng phải thứ này đấy! Nếu bạn có kinh nghiệm gì muốn chia sẻ thêm thì cứ đăng trong phần comment nhé!

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

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

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

Redux Toolkit: Tìm hiểu createSlice

Redux Toolkit

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

Tiếp theo bài trước, mình sẽ giới thiệu chi tiết hơn các API cơ bản của Redux-Toolkit để chúng ta có thể tạo được 1 flow hoàn chỉnh của Redux.

Redux Module

Trong Redux, 1 module hoàn chỉnh bao gồm: Store, Actions và Reducer, thông thường các bạn sẽ chia viết từng phần trong các file riêng và cấu trúc folder sẽ dạng như dưới đây:

Redux Module

Với Redux Toolkit (RTK) thì tối giản hơn, tạo 1 module hoàn chỉnh bằng API createSlice.

  React Redux: Redux middleware là gì?

  Redux vận hành như thế nào

https://redux-toolkit.js.org/api/createSlice

import { createSlice } from '@reduxjs/toolkit';

const counterSlice = createSlice({
  name: 'counter',
  initialState: { count: 0 },
  reducers: {
    increment: state => state.count += 1,
    decrement: state => state.count -= 1
  }
})

export const { increment, decrement } = counterSlice.actions
export default counterSlice.reducer

Một số ưu điểm của cách viết này:

  • Không còn tạo riêng các file action, reducer, type
  • action types tự động sinh ra kèm tiền tố mặc định là trường name
  • Cú pháp hoàn chỉnh, ngắn gọn và theo 1 template logic nhất quán của redux

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

Thực tế dự án, các bạn có thể cần giải quyết 1 số case dispatch action phổ biến như lắng nghe 1 action chung nào đó của toàn bộ ứng dụng, trong trường hợp đó createSlice cung cấp 1 option extraReducers để giải quyết bài toán trên :

const otherAction = createAction('updateCounterByValue')
...
extraReducers: (builder) => {
      build.addCase(otherAction, (state, action) => {
             state.count += action.payload
      })
      .addDefaultCase((state, action) => {})
  }

hoặc
// có thể viết là [otherAction] hoặc otherAction.type
      [otherAction]: (state, action) => {
             state.count += action.payload
      }

Nếu 1 reducer lắng nghe nhiều action có cùng logic:

const isErrorAction = (action) => {
    return action.type.endsWith('FAIL')
}

const reducer = createReducer(initState, (builder) => {
    build
        .addMatcher(isErrorAction, (state, action) => {
            state.errors = action.payload
        })
        .addDefaultCase((state, action) => {})
})

Cấu trúc folder store với Redux Toolkit

Rõ ràng slice giúp Redux viết gọn và chuẩn hơn rất nhiều so với cách cũ, bao gồm cả code và cách tổ chức file.

Trong phần tới mình sẽ cùng tìm hiểu cách xử lý bất đồng bộ trong Redux Toolkit.

Cảm ơn các bạn!

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

Xem thêm:

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

Tìm hiểu về môi trường làm việc ở Amanotes, nơi coi nhân viên là khoản đầu tư không bao giờ lỗ! 

Moi truong lam viec o Amanotes

Amanotes là công ty công nghệ có co-founder là Việt Nam vừa tổ chức sinh nhật lần thứ 8 của mình với hơn 100 game âm nhạc và hơn 2.5 tỉ lượt tải trên toàn cầu. Làm nên thành công đó không thể không nhắc đến một đội ngũ nhân viên cốt cán được đầu tư bài bản thông qua chương các giá trị định vị nhân viên – EVP (Employee Value Proposition).

Bài toán nhân sự và văn hóa làm việc của Amanotes đều được xoay quanh giá trị định vị nhân viên (EVP) này. Hiểu đơn giản, EVP là những giá trị nổi bật mà doanh nghiệp mang đến cho nhân sự. Ngoài các chế độ lương thưởng hấp dẫn, EVP còn có thể bao gồm nhiều đặc quyền, đãi ngộ như các khóa khai vấn (coaching), chương trình khen thưởng hay khóa đào tạo miễn phí. 

Có thể nói, EVP là giá trị khác biệt của công ty so với các đối thủ cạnh tranh, vừa thu hút nhân sự mới, vừa giữ chân nhân sự cũ gắn bó lâu dài với công ty. Bởi vậy, bên cạnh yêu cầu cơ bản như lương thưởng, Amanotes phát triển EVP khác biệt để nuôi dưỡng bộ máy nhân sự toàn diện hơn. 4 yếu tố chính trong EVP của Amanotes bao gồm: Music Culture (Nuôi dưỡng DNA âm nhạc – văn hóa đặc trưng của Amanotes trong mọi khía cạnh), Rewarding Journey (Chế độ lương thưởng và đãi ngộ hấp dẫn); Working Environment (Xây dựng môi trường làm việc cởi mở, hợp tác và lành mạnh) và Learning & Growth (cơ hội học tập và phát triển mở rộng).

Ông Bill Võ – Nhà sáng lập Amanotes chia sẻ: “Đối với một công ty công nghệ âm nhạc như Amanotes, một đội ngũ nhân sự vững mạnh chính là yếu tố sống còn để công ty cho ra đời các ứng dụng âm nhạc “làm mưa làm gió” trên thị trường, tiếp nối kế hoạch về hệ sinh thái âm nhạc tương tác trong tương lai. Xuyên suốt trong EVP của Amanotes là dòng chảy âm nhạc được nuôi dưỡng trong huyết quản, tạo điểm khác biệt độc nhất trên thị trường Việt Nam.”

Văn hóa doanh nghiệp nuôi dưỡng DNA âm nhạc

Âm nhạc không chỉ hiện hữu trong các sản phẩm và dịch vụ của Amanotes, mà còn đi sâu vào văn hóa doanh nghiệp. Tại Amanotes, nhân viên được khuyến khích tham gia vào các đêm nhạc, chương trình thi tài âm nhạc, giờ karaoke giữa các phòng ban. Công ty cũng tạo điều kiện cho các nhân viên đề xuất các sáng kiến liên quan đến âm nhạc, đặc biệt là những chương trình có ưu điểm về mặt hình ảnh, quy mô và kết quả cụ thể. Ở một góc độ khác, việc thấu hiểu âm nhạc cũng giúp các thành viên trong công ty hiểu rõ hơn về tâm lý người dùng, từ đó hỗ trợ công việc phát triển các ứng dụng liên quan đến âm nhạc

Bạn Trần Bảo Sơn – Chuyên viên Phân tích Dữ liệu của Amanotes chia sẻ:

Amanotes
Trần Bảo Sơn tự tin thể hiện tài năng chơi piano

“Một điều thú vị chỉ có ở Amanotes là nhân viên được công ty được công ty vị chỉ có ở Amanotes là nhân viên giúp các thành viên. Hầu hết nhân viên của Amanotes đều có thể chơi ít nhất một loại nhạc cụ nào đó. Trước khi vào Amanotes, mình không nghĩ bản thân có thể chơi Piano thành thạo như bây giờ. Âm nhạc không chỉ giúp mình phá vỡ định kiến vốn có, mà còn giải tỏa căng thẳng, khai mở sức sáng tạo.” 

 

Một điều thú vị chỉ có ở Amanotes là công ty có rất nhiều hoạt động liên quan đến âm nhạc, nhân viên được công ty tạo điều kiện tham gia các các khóa học miễn phí về đàn, hát, trống, etc. Hầu hết nhân viên của Amanotes đều có thể chơi ít nhất một loại nhạc cụ nào đó. Trước khi vào Amanotes, mình không biết chơi loại nhạc cụ nào cả, nhưng giờ đây mình đã bắt đầu biết chơi đàn piano. Âm nhạc không chỉ giúp mình phá vỡ định kiến vốn có, mà còn giải tỏa căng thẳng, khai mở sức sáng tạo.”

Môi trường làm việc cởi mở

8 tiếng công sở chiếm tới 1/3 thời gian trong cuộc sống. Vậy nên một môi trường làm việc cởi mở  sẽ tạo cảm giác thoải mái cho mỗi nhân viên phát huy tối đa khả năng của mình. Đây chính là lý do Amanotes liên tục tổ chức các sự kiện nội bộ, trò chơi âm nhạc cũng như hoạt động văn thể mỹ để gắn kết nhân viên.

Công ty còn tổ chức các câu lạc bộ bóng đá, cầu lông, đồng thời có ngân sách riêng để phục vụ nhu cầu, sở thích cá nhân như vé xem phim, spa thư giãn giúp các thành viên “tái tạo” năng lượng sau những giờ làm việc căng thẳng. Sự tinh tế của ban lãnh đạo Amanotes đối với nhân viên còn thể hiện qua sự quan tâm đúng lúc, như chương trình hỗ trợ sức khỏe tinh thần trong giai đoạn COVID-19 căng thẳng. 

Chế độ lương thưởng và đãi ngộ hấp dẫn

Anh Trung Bùi – Quản lý Công nghệ của Amanotes – cho hay: “Bên cạnh mức lương cạnh tranh với thị trường, Amanotes còn thu hút nhân tài bằng nhiều đãi ngộ hấp dẫn khác. Khi tuyển dụng, mình hay nhấn mạnh với các bạn rằng các em cứ tập trung toả sáng, phát huy tài năng của mình, Amanotes sẽ tạo điều kiện hết mức để đảm bảo cân bằng giữa công việc và cuộc sống.

“Flexi Budget – gói hỗ trợ linh hoạt là một ví dụ điển hình. Amanoter có thể sử dụng Flexi Budget để trau dồi kỹ năng như đăng ký khóa học, mua sách, mua nhạc cụ, hay tận hưởng các dịch vụ giải trí, thư giãn liên quan đến games, âm nhạc, hay tập gym, yoga…”, anh Trung nói thêm.

Amanotes
Theo anh Trung, Amanotes luôn tạo điều kiện để nhân viên cân bằng công việc và cuộc sống

Cũng theo chia sẻ của anh Trung Bùi, Amanotes hiện là một trong những công ty đưa ra mức lương rất cạnh tranh trong ngành, cùng chính sách đa dạng như thưởng theo năng suất, thưởng vào dịp lễ tết hay kỷ niệm thành lập công ty. Ngoài ra, thấu hiểu tâm lý của người lao động lâu năm, Amanotes còn xây dựng giải thưởng FERMATA dành cho nhân viên gắn bó trên 3-5 năm. 

Chương trình đào tạo và phát triển 

Theo một khảo sát của Navigos Group, các chương trình huấn luyện và phát triển cá nhân đứng trong top 3 yếu tố hàng đầu trong chính sách phúc lợi được các ứng viên quan tâm nhiều nhất. Hiểu rõ điểm quan trọng này, Amanotes tạo điều kiện cho nhân viên phát triển toàn diện và chuyên sâu về chuyên môn công việc dưới sự hướng dẫn trực tiếp chuyên nghiệp và tận tình của người lãnh đạo. 

Amanotes
Chị Phương và các đồng nghiệp tại Amanotes

Các bạn nhân viên mới gia nhập Amanotes đều có thể bắt kịp tiến độ công việc rất nhanh nhờ các buổi định hướng, đào tạo hội nhập văn hoá cho nhân viên mới. Chị Phương – Giám đốc Nhân sự tại Amanotes cho biết thêm: “Thành viên Amanotes còn có cơ hội luân chuyển nội bộ để tìm hiểu một vai trò mới khi có nguyện vọng, từ đó khám phá ra tiềm năng của bản thân. Các bạn nhân viên còn được cố vấn bởi các anh chị Quản lý để giải quyết các thách thức nghề nghiệp và phát triển cá nhân.

Với một chương trình EVP bài bản và xuyên suốt, dễ hiểu vì sao chỉ trong chưa đầy 10 năm, Amanotes đã có thể gây dựng một đội ngũ nhân sự chất lượng cao. Với nền tảng con người vững chắc, chúng ta hoàn toàn có thể kỳ vọng vào kỷ lục tiếp theo của công ty công nghệ này, trong thời gian tới trên quy mô toàn cầu. 

 

MySQL so găng MariaDB, điểm khác biệt chính, ưu và nhược điểm

MySQL với MariaDB

Hello anh em, quay lại với chuỗi bài về hệ cơ sở dữ liệu, trong lập trình web nói chung và phát triển phần mềm nói riêng, MySQL hay MariaDB đều là hệ cơ sở dữ liệu. Mà dữ liệu được lưu trữ và quản lý như thế nào lại là điều tối quan trọng để phần mềm, web, app của anh em viết ra có hoạt động tốt hay không.

Bài viết này làm quả so găng giữa hai hệ cơ sở dữ liệu khá là phổ biến là MySQL (bao phổ biến) và MariaDB, hệ cơ sở dữ liệu của cô gái maria.

MySQL so găng MariaDB

Mặc dù có cấu trúc tương tự, cả hai hệ cơ sở dữ liệu này có tính năng và thành phần khác nhau. Xem và hiểu sâu về từng cái giúp anh em dễ dàng đưa ra lựa chọn hệ cơ sở dữ liệu cho chính dự án của mình. Ưu nhược điểm của từng loại lúc này xem ra là yếu tố quan trọng để anh em đem lên bàn cân.

Bắt đầu ngay thôi nào! À nói tới hệ cơ sở dữ liệu thì nghía qua tí RDBMS ha

1. Tổng quan về Relational Database (RDBMS)

Relational database management system, dịch tạm là hệ quản lý dữ liệu có liên kết, ông này có thêm chữ R (relational), là bản update của DBMS. Sử dụng một module có tên là storage engine, chuyên dùng để lưu trữ, quản lý và sửa đổi dữ liệu.

Hướng chủ yếu tới các loại dữ liệu có quan hệ, có liên kết với nhau (Relational).

Ông DBMS thì lưu trữ dữ liệu ở dạng tệp (file), còn ông RDBMS thì lại dùng bảng, dùng bảng thì có lợi hơn khi data bị dư như DBMS.

Bản thân ông MySQL và MariaDB đều thuộc về RDBMS. Sơ lược qua như thế rồi anh em mình sẽ đi vào detail sau.

  Lộ trình học MySQL từ A đến Z
  Cách Import dữ liệu từ các bảng khác nhau trong MySQL Workbench

2. MySQL là gì?

MySQL là hệ cơ sở dữ liệu liên kết, mã nguồn mở (open source) cái này quan trọng là miễn phí nha anh em. Được tạo bởi MySQL AB, ban đầu tạo ra để phát triển ứng dụng Web. Cung cấp cho các nhà phát triển Web khả năng quản lý dữ liệu dễ dàng bằng bảng.

MySQL là gì?

Trong hầu hết các trường hợp, MySQL thường đi với ông anh em thân ai nấy lo là PhP, thằng hàng xóm là Apache và hệ điều hành Linux. Dữ liệu có thể được thay đổi và truy vấn bằng SQL.

Về mức độ phổ biến thì MySQL là siêu phổ biến, vì bản thân WordPress dùng nó, nên không phải bàn cãi về độ phổ biến của MySQL.

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

3. MariaDB là gì?

MariaDB thực chất là một nhánh phát triển khác của MySQL. Việc phát triển MariaDB được tiến hành sau khi Oracle có ý định mua lại MySQL, việc này khiến một số nhà phát triển RDBMS lo ngại rằng Oracle có thể làm hệ cơ sở dữ liệu có liên kết bị thay đổi đi.

Đọc lan man đâu đó là thế, còn lại lý do thật sự sau đó anh em mà biết thì comment chia sẻ tui biết với nha. MariaDB, vì là một nhánh phải triển khác của MySQL nên cũng hỗ trợ dữ liệu kiểu bảng (table), ngoài ra còn hỗ trợ thêm các giao thức khác như client protocols, client APIs, ports và sockets.

Mục tiêu là nếu anh em có chuyển từ MySQL qua MariaDB, không có điều gì làm anh em trở ngại, support hết, hỗ trợ đầy đủ.

4. Sự khác biệt giữa MariaDB và MySQL

Mặc dù là phát triển nhánh khác, trên nền MySQL nhưng vẫn có những sự khác biệt rõ ràng giữa MySQL và MariaDB.

4.1 Miễn phí và trả phí

Đầu tiên là tiền hay không tiền, MariaDB tới hiện tại vẫn là mã nguồn mở, trong khi MySQL, một số tính năng và module đã đóng lại chỉ dành cho trả phí.

Ngoài miễn phí, MariaDB còn nhẹ hơn, hiệu suất tốt hơn do có 12 công cụ lưu trữ mới (12 new storage engines). MySQL bán giấy phép cho những công ty phát triển phần mềm theo dạng không phải miễn phí. Còn MariaDB thì cung cấp General Public License (GPL), giấy phép sử dụng miễn phí. Mà từ thưở giờ anh em cũng biết, trả phí luôn luôn khác bọt, bản trả phí của MySQL hỗ trợ tới hơn 200,000 kết nối (connections).

Đấy, tiền vào nó khác, không tiền thì chỉ support số connection ít thôi. Nhưng may mắn thay, ông MariaDB miễn phí nhưng vẫn hỗ trợ hơn 200,000 kết nối.

Số lượng kết nối quan trọng ra sao? Nếu anh em phát triển hệ thống thương mại điện tử, lượng truy cập tương đương với số lượng connections mở tới database.

4.2 Chức năng

Về mặt chức năng, MySQL giới thiệu sys schema objects (các đối tượng schema), thường được sử dụng để bảo trì cơ sở dữ liệu, đảm bảo hiệu suất. Công thêm tính năng super-read-only, cái này ngăn thay đổi trên máy chủ đối với super user.

MySQL cũng hỗ trợ data masking và dynamic columns. Data masking thường được gọi với cái tên thân thương cho chị em là mặt nạ dữ liệu. Mặt nạ này đắp dữ liệu chứ không đắp mặt.

Nó giúp bảo vệ dữ liệu nhạy cảm khỏi bị lộ ra ngoài, giảm thiểu rủi ro dữ liệu bị leak. Về cột động, động tất nhiên khác tĩnh, lấy tĩnh mà chế không nổi động. Lấy vô chiêu thắng hữu chiêu.

Má lạc đề, nói chứ tĩnh là cột anh em define ra kiểu dữ liệu nào thì xài kiểu dữ liệu đó. Còn cột động thì value trong cột vẫn có thể thay đổi, vẫn khác nhau được, nên gọi là động, có thể thay đổi. Trong khi đó, MariaDB thay vì hỗ trợ data masking, lại dùng hidden column, cột ẩn. Các cột ẩn sẽ không show ra value khi thực hiện câu SELECT, hoặc return khi INSERT.

Ngoài ra MariaDB hỗ trợ nhiều hơn các công cụ khác như XtraDB, lưu trữ trên memory và Cassandra Storage Engine

4.3 Đóng góp và tiếng nói

Cái này cũng vô cùng quan trọng, vì ông MySQL được Oracle mua lại rồi nên quyết định là thuộc về ổng. Anh em có ý kiến đóng góp hay không chưa chắc đã được Oracle xem xét và feedback.

Về phía MariaDB thì ngược lại, ổng được phát triển bởi cộng đồng và sử dụng quỹ MariaDB để phát triển. Giấy phép GNU GPL cũng cho phép cộng đồng tham gia đóng góp vào mã nguồn mở. Đồng thời MariaDB cũng có roadmap của riêng nó. Anh em có thể thoải mái tham gia đóng góp những feature mà anh em nghĩ là nó hữu ích.

Qua 3 so sánh dưới đây, anh em có một cái nhìn sơ lược về MySQL và MariaDB. Đi sâu hơn vào so sánh 2 hệ cơ sở dữ liệu này. Ta sẽ điểm qua Performance, Benchmark, Compatibility( khả năng tương thích).

5. Màn so găng giữa MySQL và MariaDB

5.1 Hiệu năng và điểm benchmarks

Cái hiệu năng và điểm benchmarks này là so sánh kiểu chuyên sâu. Tất nhiên là không thiếu nhiều ông làm so sánh rồi. Nó có vài bài kiểm tra để đánh giá xem cái nào vượt trội hơn cái nào.

Ông Dimi trĩ lòi Kravtchuk có bài test UTF8, chắc là không phải test font chữ. Nhưng MySQL8.0 có thể xử lý được số lượng truy vấn mỗi giây cao hơn MariaDB phiên bản 10.3

Về hoạt động và adapt với hardware (phần cứng), ông Axel Schwenke lại đánh giá MariaDB 10.1 hoạt động tốt hơn MySQL 5.7.9

Hiệu năng và điểm benchmarks

Tuy nhiên đánh giá nhanh hơn ở một bài test không có nghĩa là MySQL nhanh hơn hẳn hay có hiệu năng tốt hơn MariaDB. Hiệu năng còn ảnh hưởng bởi truy vấn SQL, số lượng connections và các trường hợp sử dụng khác nhau.

  Hướng dẫn cách kết nối đến Database MySQL trong Eclipse
  8 điểm so sánh giữa MySQL và PostgreSQL để chọn lựa cái nào phù hợp hơn.

5.2 Khả năng tương thích

Vì MariaDB được phát triển dựa trên binary drop-in replacement của MySQL nên Maria DB hoàn toàn tương thích với MySQL. Má cái binary drop in replacement, phải wiki cho ra coi nó là gì chứ khó hiểu vãi.

It refers to the ability to replace one hardware (or software) component with another one without any other code or configuration changes being required and resulting in no negative impacts.

Binary drop-in replacement đề cập khả năng thay thế một thành phần hoặc một nhóm thành phần bằng một thành phần khác. Mà sự thay thế này không cần bất kỳ thay đổi code hoăc cấu hình nào khác. Việc thay thế cũng không dẫn tới các tác động tiêu cực

Rồi, hiểu luôn, thay vào chả mất gì đâu. Cứ mạnh dạn thay đi anh em ơi. MariaDB cũng giữ lại config của MySQL về hệ cơ sở dữ liệu. Cổng kết nối, cách thức kết nối cũng tương tự với MySQL.

So sánh qua về hiệu năng và khả năng tương thích cũng là một phần, giờ tới đánh giá điểm mạnh điểm yếu của từng loại DB.

6. Điểm mạnh và điểm yếu của MariaDB

6.1 Điểm mạnh

Rồi giờ nắm sơ là ông MariaDb khác với MySQL rồi, nhưng điểm mạnh và điểm yếu của ổng là gì?

Đầu tiên là miễn phí, siêu quan trọng rồi nha. Kế tới là MariaDB hỗ trợ (backwards compatible – tương thích ngược), nghĩa là phiên bản mới nhất của MariaDB vẫn tương thích với các phiên bản cũ hơn. Đây là tính năng khá quan trọng, vì MariaDB do cộng đồng đóng góp.

Mà cộng đồng thì ta nói, release xoành xoạch suốt ngày.

Kế tới là dynamic thread pool (cái này hiểu là luồng động). Tính năng này cho phép cải thiện tốc độ, hiệu năng và nâng cao khả năng sao chép dữ liệu. Ngoài ra thực hiện cập nhật dữ liệu cũng nhanh hơn.

Tiếp tới là Galera cluster, giúp giảm thiểu delay khi thực hiện transaction, giảm mất mát dữ liệu và cải thiện khả năng mở rộng. MariaDB cũng hỗ trợ MariaDB ColumnStore.

6.2 Điểm yếu

Mạnh quá mạnh rồi giờ yếu quá yếu. Kiểu JSON thì quá ư là phổ biến và được hỗ trợ rất nhiều bởi các RDBMS khác, nhưng MariaDB thì chỉ hỗ trợ JSON từ bản 10.2 trở lên. Alias cho LONGTEXT cũng thế, từ bản 10.2 trở lên. Migration kiểu JSON này từ MySQL qua Maria anh em cũng cần phải đổi kiểu column JSON.

Một số tính năng khác có trong MySQL Enterprise Edition cũng không có trên MariaDB. Ngoài ra do là mã nguồn mở, nếu có vấn đề anh em phải tham khảo hoặc trợ giúp từ cộng đồng. Mà cộng đồng thì đôi khi được đôi khi không. Nên về điểm support thì MySQL vẫn ok hơn.

7. Điểm mạnh và điểm yếu của MySQL

7.1 Điểm mạnh

Data masking của MySQL thì nổi tiếng không phải bàn rồi, cả Data masking kết hợp với Dynamic Column kết hợp tạo thành một hệ cơ sở dữ liệu an toàn và nhanh chóng. Do thiết kế nhiều và hỗ trợ nhiều công cụ, MySQL đảm bảo hiệu suất tối ưu và thời gian alive tuyệt vời.

Về hỗ trợ business, điển hình như thương mại điện tử, MySQL hỗ trợ thanh toán, hỗ trợ giao dịch và bảo mật dữ liệu nhạy cảm.

Ngoài ra do được hẫu thuận bởi Oracle, MySQL được hỗ trợ bởi hơn 20 nhà cung cấp cloud. Hỗ trợ hơn 20 hệ điều hành. Được cập nhật liên tục và ghi chép đầy đủ

7.2 Điểm yếu

Ngược với mirage từ MySQL qua MariaDB, thì ở chiều ngược lại không dễ dàng tẹo nào đâu nha anh em. Có sự khác biệt giữa cấu hình copy giữa hai bên. MySQL cũng không phù hợp với quản lý hệ cơ sở dữ liệu có kích thước lớn.

MySQL thiếu hẳn công cụ tìm kiếm mạnh mẽ cho hệ cơ sở dữ liệu lớn. Nhóm các plugin có giá trị cũng bị khoá nếu bản anh em dùng không phải là bản trả phí.

Cuối cùng mang tiếng là mã nguồn mở nhưng Oracle có toàn quyền sinh sát trong đó. Nắm toàn quyền những feature nào sẽ release. MySQL cũng từ đó mà khó mở rộng quy mô của mình.

8. Tổng kết

Bài viết này tui đã liệt kê cho anh em một số điểm yếu mạnh, so sánh giữa MySQL và MariaDB. Cả hai đều là hệ cơ sở dữ liệu tốt, giờ lựa xem cái nào phù hợp với nhu cầu sử dụng của anh em nữa thôi.

MySQL Enterprise Edition giá 5k đô trên năm, tuy nhiên được hỗ trợ bởi tập đoàn Oracle. Cập nhật ổn định, hỗ trợ và đảm bảo an toàn. Có độ tin cậy cao hơn so với MariaDB.

MariaDB sau nhiều năm cập nhật và phát triển cũng đã trở thành hệ cơ sở dữ liệu tốt, MariaDB phù hợp với các dự án có thời gian phát triển ngắn. Không quá serious tới business.

9. Tham khảo

Cảm ơn anh em đã đọc bài – Chúc anh em chọn được RDBMS hợp với mình – Thank you for you time to read

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

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

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

NodeJS version manager: Quản lý đa phiên bản NodeJS trên máy tính

Ví dụ bạn có 2 project Node.js là A và B. A chạy version 14 còn B chạy version 16 trong khi 2 version này có một số khác biệt nên không thể dùng chung 1 version cho cả 2 project. Mỗi lần chạy project nào thì bạn gỡ version node.js kia ra và cài bản node.js phù hợp.

Giải pháp để giải quyết bài toán trên là 1 công cụ để quản lý các phiên bản NodeJS trên máy tính của bạn 1 cách dễ dàng, không cần phải gỡ version này và cài version kia; chỉ cần 1 dòng lệnh cho việc chuyển đổi.

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

NVM (Node Version Manager)

NVM (Node Version Manager) 

Link cài đặt:

  • Windows

https://github.com/coreybutler/nvm-windows/releases

  • MacOS
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
  • Linux
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

Lưu ý chút ở đây là phiên bản trên Windows so với phiên bản dành cho MacOS và Linux là hoàn toàn khác nhau, nhưng cách sử dụng và các lệnh thì giống nhau.

  Authentication trong NodeJS sử dụng JWT

Link github của nvmhttps://github.com/nvm-sh/nvm

Cách sử dụng:

  • Cài đặt phiên bản NodeJS
nvm install <version>

ví dụ: nvm install 8.11.2 64 (cài đặt nodejs version 8.11.2 phiên bản 64 bit)

  • Chỉ định bản NodeJS được sử dụng
nvm use [version]

ví dụ: nvm use 8.11.2 (sử dụng phiên bản nodeJS 8.11.2)

  • Liệt kê các bản NodeJS được cài đặt và sử dụng
nvm list

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

FNM (Fast Node Manager)

FNM là 1 công cụ quản lý version Nodejs nhanh và đơn giản hơn được xây dựng bằng Rust. Nó được cho là nhanh hơn NVM x40 lần

FNM (Fast Node Manager)

Link github:

https://github.com/Schniz/fnm

Cách cài đặt:

  • MacOS:
brew install Schniz/tap/fnm
  • Linux:
curl -fsSL https://github.com/Schniz/fnm/raw/master/.ci/install.sh | bash
  • Windows (sử dụng Chocolatey)
choco install fnm

Cách sử dụng

  • Cài đặt phiên bản NodeJS
fnm install [version]

ví dụ: fnm install 10.10.0 (cài đặt NodeJS phiên bản 10.10.0)

  • Chỉ định bản NodeJS được sử dụng
fnm use [version]

ví dụ: fnm use 10.10.0 (sử dụng phiên bản NodeJS 10.10.0)

  • Danh sách phiên bản
fnm ls //danh sách các phiên bản đang có
fnm ls-remote // danh sách các phiên bản có thể tải về

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

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

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

Các thành phần cơ bản trong một automation project

Các thành phần cơ bản trong một automation project

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

Các bước cơ bản dưới đây sẽ giúp bạn có cái nhìn tổng quan về những việc cần làm khi bắt đầu một automation project.

Ta có một bài toán đặt ra ở đây như sau:

Bạn có các test case để test chức năng cho một website nào đó: web app đó có thể là một trang quản trị, một trang web bán hàng online, hay là bất kỳ các ứng dụng web nào khác mà bạn cần phải test…

Các test case chức năng này được chuẩn bị để bạn thực hiện manual test. Tất nhiên, bạn phải thực hiện test từng test case một cho đến khi xong bộ test case đó, từ việc setup precondition, input testdata, đến việc so sánh kết quả thực tế và kết quả mong đợi có tương ứng với nhau hay không để đánh pass – fail cho test case đó.

Yêu cầu dành cho bạn là sẽ automate được nhiều test case nhất có thể!

Vậy thì làm thế nào? Cùng xem lời giải dưới đây để biết được các thành phần chính trong project, từ đó định hướng được các công việc bạn cần phải làm nhé!

  04 Điều Cần Chú Ý Cho Người Mới Làm Automation Test

1. Tạo automation project

Đầu tiên bạn tạo một project – Có thể sử dụng IDE là Eclipse và sau đó add hai thư viện này vào project đó:

  • Selenium Webdriver library: Thư viện hỗ trợ tương tác với trình duyệt thông qua web brower.
  • Một thư viện dùng trong unit test như TestNG: Thư viện này giúp bạn có thể tạo được các script automation độc lập.

Trong project, có các tầng (layer), mỗi tầng chỉ giao tiếp với tầng trước và kế tiếp nó theo thứ tự như dưới đây:

tầng layer

Ba layer trên cùng thường thì sẽ được tổ chức thành các package khác nhau đó là:

  1. Test classes package
  2. Page object classes package
  3. Framework classes package

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

2. Tạo các class page object

Tương ứng với mỗi web page được chia trong bộ test case, bạn sẽ tạo một page object cho nó.

Page object class thực thi các tương tác người dùng trên một trang web cụ thể, nó bao gồm các thông tin về trường dữ liệu (field) và các method.

Các trường dữ liệu của page object bao gồm:

  • Title
  • Ulr
  • Locator của các web elements
  • Và các thông tin đặc trưng khác của page ví dụ như: source page, sub title,…

Các method được sử dụng để:

  • Cung cấp thông tin về webpage và các element:
    • Page title
    • Page url
    • Value của các label
    • Kiểm tra element đó có enable hay không, có thể selected hay không
  • Thực hiện các tương tác trên page như:
    • Click vào một element cụ thể nào đó
    • Input text vào textbox
    • Select options của checkboxes hay listboxes

Các test script của chúng ta sẽ sử dụng các thông tin trong page object này. Từ đó page object sẽ sử dụng các hàm trong classes framework của project để tiến hành thực thi các tương tác với trang web.

  Automation testing: Một số công cụ hữu ích cho tester

3. Tạo các class test

Ở đây mỗi test cript bạn tạo ra sẽ tương ứng với một test case.

Và trước mỗi test script bạn cần phải thêm 1 annotation @Test tương ứng với 1 unit test

Test script này gồm có hai phần:

  • Điều hướng đến trang được test
  • Thực thi việc test, và verify

Để điều hướng đến trang được test thì trong script sẽ gọi đến các thông tin trong page object của trang đó.

Và như vậy mỗi lần khi được điều hướng đến các trang test thì script sẽ thực hiện việc test và so sánh kết quả thực tế thực hiện được với kết quả mong đợi để đưa ra kết luận test.

Trong các class test thì các test ccript được gom nhóm với nhau, thuận tiện cho việc tìm kiếm và nâng cấp.

Mỗi nhóm test script được nhóm lại với nhau dựa vào mục đích test riêng của nhóm script.

Các class test không phải chỉ có các test script mà nó còn bao gồm cả test fixtures (test fixtures này không biết dịch sang tiếng việt sao nữa, thôi để nguyên)

Test fixtures là các method đặc biệt của unit test framework như:

  1. Việc chuẩn bị môi trường test, những cái mà các script test cần phải có trước khi có thể thực thu được (bước này thường để trong một hàm riêng, có annotation là @Before)
  2. Việc clean/reset môi trường test sau khi run test script: như việc reset về các thiết lập ban đầu, không cache…, (bước này cũng được xây dựng thành hàm riêng và có annotation là @After)

Các class test có thể được gom lại với nhau bằng cách sử dụng groups và suites.

4. Tạo một class base – class dùng chung

Các công việc như chuẩn bị môi trường test hay việc reset môi trường sau khi thực hiện test có thể được sử dụng nhiều lần ở nhiều nơi khác nhau trong project, vì thế để tránh việc lặp lại nhiều lần này thì ta sẽ đưa những test fixtures này vào trong một class base.

Các class test sẽ thừa kế class base này để có thể gọi đến và sử dụng các hàm trong đó.

5. Tạo các class framework

Các class framework được sử dụng trong project cho các chức năng chung như:

  • Tạo browser driver cho từng loại browser khác nhau
  • Tương tác với web sử dụng explicit wait
  • Lấy log file
  • Đọc các thông tin từ một file text nào đó
  • Chụp lại ảnh màn hình (capture screen) khi xảy ra exception
  • Tự động gửi email kết quả test
  • Tạo một report sau khi có kết quả test.

Các class page object sẽ gọi đến các function này từ các class framework mà ta đã có, để đưa ra thông tin cần lấy cho page ấy.

Như vậy mình có thể tóm tắt lại một cách tổng quan về thành phần cần có của một automation project đó là: đầu tiên bạn sẽ cần tạo project trong IDE (Eclipse), tiếp theo bạn cần xác định rằng trong project của bạn cần có các class Page objectclass testclass base, và class liên quan đến framework.

Mỗi class đều có mục đích riêng, việc hiểu về các class đó giúp project của bạn khoa học hơn, dễ dàng hơn trong việc quản lý, bảo trì và nâng cấp.

Hi vọng bài viết giúp bạn có cái nhìn tổng thể trước khi bắt đầu với một project automation.

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

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