Top 5 tips and tricks hot nhất của JavaScript năm 2021
Tác giả Filip
Mở đầu
Dưới đây tôi sẽ chia sẻ với các bạn top 5 tip cho JavaScript tốt nhất, hữu ích nhất khi làm việc mà tôi rút ra được sau quá trình làm việc với vai trò là một Software Engineering.
1. Lọc ra những value duy nhất trong cùng một array
Tip cho JavaScript đầu tiên bạn cần thiết lập một array và tạo cho nó những value khác nhau, phụ thuộc vào mục đích coding của bạn. Sau đó hãy bắt đầu khai thác các value duy nhất từ array này bằng cách sử dụng lệnh Const filtered array để cho tất cả các value còn lại vào trong một tập hợp array mới.
Tiếp theo sử dụng lệnh console.log(filteredArray)màn hình kết quả sẽ xuất hiện một terminal và chạy node tricks.js sẽ lọc được các value phức tạp. Bằng cách này, bạn không chỉ áp dụng lọc value duy nhất cho một array mà có thể áp dụng với mọi objects, array đang thực hiện.
2. Short – circuit evaluation
Đây là mẹo làm việc được tôi áp dụng bất cứ khi nào coding bằng ngôn ngữ JavaScript, if – else statement. Đây không phải là kỹ thuật mới lạ với các dev đang làm việc bằng ngôn ngữ lập trình JavaScript, nhưng làm sao để nó trông thật sự ngắn gọn và chỉ nằm trong một dòng mà thôi thì phải áp dụng đến kỹ thuật short – circuit evaluation.
Chẳng hạn ta viết code để tìm ra số có giá trị bé hơn 5 như sau constant number = 5, xuất hiện 2 trường hợp if number < 5 ? console.log(‘Hello :)’) : console.log(‘Bye :(‘);
Khi cho lệnh này chạy nó sự sẽ xuất hiện kết quả như bạn đã code mà dòng code không hề dài dòng chút nào.
Các tips cho javascript developer
3. Chuyển đổi floats thành số nguyên
Với tip này, bạn có thể áp dụng với cả số dương và số âm đều không quá khó khăn. Ví dụ console.log(24.6), yêu cầu là cần chuyển đổi float này thành một số nguyên, bạn chỉ cần vẽ một đường thẳng đứng là số 0 và nó sẽ tự động chuyển đổi sang số nguyên.
Nếu giá trị cung cấp là số âm kết quả sẽ được làm tròn số lên còn số dương sẽ ngược lại.
Do đó có thể hiểu một cách đơn giản là với bất kỳ float nào bạn cung cấp nó sẽ chỉ xóa đi những giá trị phía sau vị trí thập phân và để lại một số nguyên. Do đó đây được xem là một cách khá hữu ích để làm việc cho những trường hợp đặc biệt mà bạn chỉ cần số nguyên.
4. Lấy value cuối cùng của một array
Tôi đã làm việc với array rất nhiều lần kể từ khi bắt đầu công việc của mình, từ việc cố gắng tìm ra value cuối cùng, tính toán cũng như làm rất nhiều thứ phức tạp khác gắn liền với JavaScript. Đầu tiên bạn cần khai báo một constant array, cho nó một array số nguyên, dùng console.log(array) để thực hiện. Bạn slice the array (-1), sau đó print value cuối cùng, tương tự như thế bạn có thể thực hiện với bất kỳ số nào.
Giả sử tình huống khách hàng cần đăng ký họ tên cho dịch vụ và họ có cả nickname, điều đặc biệt là họ thích nickname của họ hơn tên chính của mình nên họ không (hoặc không muốn) cung cấp tên thật. Trong trường hợp này bạn sẽ tiến hành coding const user nếu muốn chỉ định tên đăng nhập là name user hoặc const nickname để sử dụng nickname làm tên đăng nhập. Sau đó sử dụng console.log(loginName) kết quả hiển thị tên thật của user.
Trong trường hợp khách hàng không cung cấp tên chính thì lúc này nickname có thể được sử dụng luôn.
Hi vọng các thông tin về tip cho JavScript sẽ cung cấp thêm cho bạn một số mẹo làm việc hữu ích với JavaScript. Giúp các dev tối ưu thời gian và hiệu quả làm việc.
Kết thúc năm 2023 đầy biến động của thị trường công nghệ, dưới đây là 5 startup tech trend được dự báo sẽ phát triển bùng nổ năm 2024.
Riêng đối với thị trường trong nước, khi mà Bất động sản thì kéo đáy, Chứng khoán thì đỏ sàn. Dòng tiền nhàn rỗi dự báo sẽ tiếp tục được đầu tư mạnh vào phần mềm và số hoá. Trong bài viết này, tất nhiên scope không chỉ trong nước, tech trend này được dự báo là xu hướng và sẽ phát triển mạnh vào năm 2024. Năm nay đánh dấu là năm toàn thế giới bước ra khỏi đại dịch covid, là một năm hi vọng các hoạt động kinh doanh sẽ quay trở lại, nhộn nhịp như thường lệ.
Không thể phủ nhận nền kinh tế nói chung và ngành công nghệ nói riêng vẫn là một năm khó khăn. Năm vừa qua, ngành IT có vô vàn sự biến đổi mạnh mẽ, năm mà các big four đua nhau sa thải hoặc cắt giảm nhân viên. Thị trường công nghệ liên quan tới IT (bao gồm cả phần mềm và phần cứng) vẫn đua nhau phát triển, nhu cầu tuyển dụng lập trình viên IT vẫn ở mức cao.
Mặc cho đống khó khăn chất đống và dồn dập, vẫn có nhiều startup tech trend được dự báo là sẽ nhảy vọt, cơ hội cũng từ đó mà mở ra.
Lan man rồi, giờ mời anh em bà con cùng điểm qua 5 startup tech trend.
1. Superapps
Dành cho anh em chưa có khái niệm gì về super app.
A superapp is defined as an application that provides users with multiple features with independently created mini-apps all piled into one.
Superapp được định nghĩa là ứng dụng cung cấp cho người dùng nhiều các tính năng mà trong đó mỗi tính năng là một ứng dụng độc lập, tất cả được gộp lại trong một
Riêng anh em đọc bài này tui xin mạnh dạn hỏi cách đây mấy ngày, mấy giờ, mấy phút anh em vừa lướt qua shopee, tiki hoặc lazada. Tất cả những app liệt kê phía trên mà anh em vừa lướt đều là super app. Nơi mà anh em có thể đặt đồ ăn, mua vé máy bay, thanh toán tiền điện, vân vân và mây mây.
Xu hướng về superapp dự kiến sẽ tiếp tục phát triển mạnh hơn nữa trong năm 2024, giải thích tại sao superapps lại nghiễm nhiên nằm vị trí đầu tiên trong danh sách top 5 startup tech trend.
Việc xây dựng super app là điều bắt buộc khi mà xu hướng người dùng hiện nay muốn tất cả được xử lý chỉ trong một ứng dụng mà họ cài đặt. Xu hướng người dùng là một chuyện, bài toán dành cho các doanh nghiệp là hiện nay có rất nhiều ứng dụng chạy độc lập.
Trong khi việc gom lại tất cả trong một thường là lựa chọn tối ưu. Điển hình như ông thần Uber. Ứng dụng Uber là để đặt xe, tất nhiên anh em biết, nhưng ngoài Uber còn có Uber Eats. Ông eats này tương tự như shopee foods bên mình, nhưng chưa được hợp nhất.
Đối thủ cạnh tranh với Uber ở khu vực Đông Nam Á là Grab, grab hợp nhất trong một super apps. Bao gồm các app nhỏ sau:
Đặt xe
Giao đồ ăn
Bác sĩ
Bảo hiểm
Danh sách này chưa phải là đủ. Nhưng nó cho thấy super apps chắc chắn là một hướng đi tốt. Nhu cầu của người dùng thì càng ngày càng nhiều, nhưng không gian cài app thì có giới hạn.
2. Thực tế ảo Metaverse
Dù cho muôn vàn khó khăn ập tới vơi Facebook nhưng ông Mark nhà chúng ta có vẻ là không bỏ cuộc. Mà cái nhìn nhận của ông về vũ trụ thực tế ảo cũng không phải là không có lý.
Quảng cáo thì thôi, đẹp khỏi bàn.
Cho dù là ý tưởng xa vời nhưng chắc chắn vẫn còn nhiều slot cho các công ty muốn tham gia vào thực tế ảo. Sớm muộn gì thì con người cũng sẽ được trải nghiệm thực tế ảo. Năm 2024 dự đoán là năm sẽ có những bước tiến nhảy vọt về thực tế ảo.
Phiên bản ông Mác Zu Cơ Bước tạo ra có thể không phải xuất sắc. Nhận được mưa lời chê nhưng thực tế ảo đang cho thấy tiềm năng phát triển rộng mở.
Chính vì vậy, metaverse được ưu tiên nằm thứ hai trong danh sách top 5 startup tech trend.
Rồi nội cái tiêu đề không là 2 chữ security rồi. Năm 2022 là một năm cảnh tỉnh chúng ta về an ninh mạng. Rất rất nhiều sự cố, vấn đề bị rò rỉ do bảo mật.
3.1 Work from home
Ngoài phát triển phần mềm cơ bản, năm 2022 còn đánh dấu sự phát triển vượt bậc của IoT, trí tuệ nhân tạo. Các thiết bị ngày nay đòi hỏi bảo mật cần ở cấp độ cao hơn, an toàn hơn.
Một trong các yếu tố ảnh hưởng tới security nữa là Work From Home. Từ khi dịch covid bùng phát, WFH trở thành một xu hướng tất yếu. Tuy nhiên làm việc ở nhà đồng nghĩa với việc các cá nhân phải tự chịu trách nhiệm về vấn đề bảo mật.
Nếu ý thức, kiến thức đầy đủ thì không sao. Ngược lại, nếu không có kiến thức, việc làm ở nhà rất dễ dần tới rủi ro về bảo mật. 2023 vẫn là năm mà WFH sẽ vô cùng phát triển khi mà mọi người đã quen với việc làm ở nhà. Các startup 100% remote không còn là điều quá xa lạ.
3.2 API Security
Ngoài WFH, API security cũng là yếu tố cần được nhắc tới. Rủi ro từ việc không bảo mật API thực sự là nỗi ám ảnh năm 2022. Ví dụ như sự kiện hack hệ thống bệnh viện Medibank ở Australia. Tất cả thông tin về hồ sơ bệnh án, thông tin của bệnh nhân đã bị lộ.
Nguyên nhân của việc mất mát thông tin này là do một API đã không được bảo mật đúng cách. Chính ví vậy, năm nay sẽ là năm mà API security sẽ được ưu tiên, cải tiến nhiều hơn để đảm bảo yếu tố an toàn.
Là một thành phần trong hệ thống thành phố thông minh (smart city). IOV là modules nhỏ trong IOT (Internet of Thing). Năm 2022 là một năm bùng nổ về ngành công nghiệp xe điện.
Tesla, Toyota, BMW, Mercedes hay Porsche đều là những ông lớn trong ngành xe hơn đã và đang tham gia cuộc đua thị trường xe điện. Thành công gặt về cũng không ít nha anh em, như mới đây mình xem BMW i7, i7 xDrive60 có thể chạy được 800km cho mỗi lần sạc.
Cuộc đua phát triển xe điện dự báo sẽ còn nóng hơn trong năm 2024. Người dùng cũng đã sẵn sàng cho việc thay đổi xe điện.
Mà nhiều xe, nhiều người sử dụng tất nhiên sẽ có nhu cầu cao trong việc sử dụng, vận hành hệ thống sạc điện. Các ứng dụng giúp tìm điểm sạc cho xe đã và sẽ ra mắt sớm. IOV rõ ràng được vinh dự góp mặt trong top 5 startup tech trend năm nay.
5. Công nghệ bền vững (Sustainable Technology)
Ở góc độ cá nhân, việc phát triển bền vững có thể là mảng rất rất được quan tâm trong năm nay. Công nghệ phát triển, các thiết bị phát thải nhiều hơn vào môi trường.
Mà yếu tố môi trường đang là yếu tố được quan tâm. Về phía người dùng, nhận thức của họ về bảo vệ môi trường càng ngày càng lớn. Đơn cử như xe xăng chuyển qua xe điện để giảm bớt phát thải vào môi trường. Mức tiêu thụ năng lượng lớn cũng là yếu tố thúc đẩy phát triển công nghệ bền vững.
Trí tuệ nhân tạo được kì vọng có thể góp phần tối ưu mức độ tiêu hao nhiên liệu. Giảm phát thải vào môi trường, sử dụng tối ưu nguồn năng lượng hiện có.
Chính vì xu hướng tất yếu là phát triển xanh, phát triển bền vững nên Sustainable Technology tự hào góp mặt ở vị trí thứ 5 trong top 5 startup tech trend.
Tới tận 5 cái mà chả thấy blockchain đâu, anh em đừng buồn. Cho dù thị trường tiền mã hoá down quá down nhưng nếu những ứng dụng blockchain vào cuộc sống được hiện thực. Năm 2024 vẫn có thể là một năm có đất diễn cho những anh em có kinh nghiệm về blockchain.
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.
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.
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).
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ằngreact, react-domphả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
Vue.jsvà 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.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.
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ề HTML và CSS 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.
Đ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 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.
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.
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.
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
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.
Ứ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.
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
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
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.
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
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
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
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 .
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
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
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
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 ++
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.
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
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
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
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)
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
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ế.
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 ITnổ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.
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ả:
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.
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?
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.
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 .
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ú ý.
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.
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.
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.
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.
Đã 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.
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.
“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”
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ọ.
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.
LiệuCV 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.
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.
Bạn có thể tham khảo nội dung để hoàn thiện CV IT của mình.
M1 – CV đa nhiệm
M2 – CV đa nhiệm
M3 – CV đa nhiệm
Mẫu CV cổ điển
Mẫu CV cổ điển
M1 – CV Pro
M2 – CV Pro
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
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.
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++]
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.
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.
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ả Android và iOS 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 đủ.
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
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ó.
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.
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.
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à iOS, iOS 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
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.
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
Bài viết được sự cho phép của tác giả Trần Văn Dem
Concurrent in Java Note
Khi lập trình đa luồng việc đảm bảo tính threadsafe, visiable,… 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.
1. Reentrant là gì?
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 Reentrant, Reentrant Lock. Vậy cụ thể tính Reentrant là gì? Xét ví dụ sau:
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)}.
*/publicReentrantLock(){
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
*/publicReentrantLock(boolean fair){
sync=fair?new FairSync():new NonfairSync();
}
Giả sử ta có 3 thread: T1,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à T3. T2, T3 đế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.
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, T3. T2, 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à:
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 FairSync. synchronized sẽ sử dụng NonfairSync. Sẽ có benchmark bên dưới.
3. synchronized
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ị deadlock. synchronized 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.
4. ReentrantLock
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ôngblock 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.
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.
Một luồng đọc và luồng ghi
Một luồng đọc và 19 luồng ghi
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
6. Segment Lock
Đâ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 Java, ConcurrentHashMap có hàm khởi tạo sau:
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.
Từ Java version >=1.8concurrentLevel 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
final V putVal(K key,V value,boolean onlyIfAbsent){
if(key==null||value==null)thrownew 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();
elseif((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
}
elseif((fh=f.hash)==MOVED)
tab=helpTransfer(tab,f);
elseif(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 hereif(tabAt(tab,i)==f){
if(fh>=0){
//............................
}
}
7. ReentrantReadWriteLock
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
8. StampedLock
StampedLock là một loại lock mới cung cấp 3 loại lock: ReadLock, WriteLock và Optimistic Read.
StampedLockkhô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.
9. Condition, wait(), notify(), notifyAll()
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.
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.
publicclassLongAdderextendsStriped64implementsSerializable{
transientvolatile Cell[] cells;
transientvolatilelong base;
publicvoidadd(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);
}
}
publiclongsum(){
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
staticfinalclassCell{
volatilelong value;
Cell(long x) {
value = x;
}
finalbooleancas(long cmp, long val){
return VALUE.compareAndSet(this, cmp, val);
}
finalvoidreset(){
VALUE.setVolatile(this, 0L);
}
finalvoidreset(long identity){
VALUE.setVolatile(this, identity);
}
finallonggetAndSet(long val){
return (long) VALUE.getAndSet(this, val);
}
// VarHandle mechanicsprivatestaticfinal VarHandle VALUE;
static {
try {
MethodHandles.Lookup l = MethodHandles.lookup();
VALUE = l.findVarHandle(Cell.class, "value", long.class);
} catch (ReflectiveOperationException e) {
thrownew ExceptionInInitializerError(e);
}
}
}
Tại hàm add(long x) cũng tương tự như các lớp Atomic, LongAdder 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 threadkhô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.
11. CountDownLatch, Semaphore, Atomic
Lời kết
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 đượ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ư MEANstack và MERNstack. Đâ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:
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 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.
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.
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.
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 ObjectPattern– 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.
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.
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;
}
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.
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.
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.
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”.
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.
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
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ó.
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.
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:
Đầ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.
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 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.
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
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
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.
Khi cần, ta có thể dễ dàng scale bằng cách tăng số lượng consumer/receiver lên
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:
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 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 đượ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:
Với Redux Toolkit (RTK) thì tối giản hơn, tạo 1 module hoàn chỉnh bằng API createSlice.
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:
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ẻ:
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.
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.
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.
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.
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.
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.
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.
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
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.
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.