Bài viết được sự cho phép của tác giả Phạm Minh Khoa
Trong kiểm thử phần mềm, có 2 khái niệm khá tương đồng nhau dễ nhầm lẫn đấy là Simulators và Emulators. Để dịch ra tiếng việt thì Simulators là trình mô phỏng; còn Emulator nghĩa là giả lập – phần nào các bạn cũng hiểu được nghĩa rồi đúng ko. Bài viết này sẽ giải thích chi tiết hơn cho các bạn, nhất là các bạn Tester để có thể hiểu và phân biệt rõ 2 khái niệm trên.
Điểm gì chung giữa 2 khái niệm trên
Emulators và Simulators đều có thể tạo ra môi trường nhằm chạy và kiểm thử các phần mềm. Cả 2 cho phép chúng ta chạy các tests (kiểm thử) 1 cách nhanh chóng và dễ dàng, rất hữu ích nhất là khi bạn không có sẵn 1 thiết bị thật (phần cứng).
Tester thường xuyên sử dụng Simulators và Emulators để thực hiện các bài tests chức năng phần mềm trước khi đưa lên môi trường production để đến tay với người dùng đầu cuối.
Simulators (trình mô phỏng) được thiết kế để tạo ra 1 môi trường chứa tất cả cấu hình và biến số để có thể chạy được ứng dụng giống như trên môi trường production. Tuy nhiên Simulators chỉ tạo ra môi trường phần mềm và chúng được tạo ra bằng cách sử dụng 1 ngôn ngữ lập trình bậc cao.
Trong khi đó, Emulators cố gắng “bắt chước” 1 cách tốt nhất có thể tất cả các features (tính năng) phần cứng của môi trường production, và để đạt được điều đó, chứng thường cần được viết bằng hợp ngữ (assembly language).
Một cách tự nhiên thì ta có thể hình dung Emulators nằm ở giữa cấp độ của 1 Simulators và 1 thiết bị phần cứng (real devices). Chẳng hạn chúng ta có cả Simulators và Emulators tạo ra thiết bị “máy ảo” Android, khi đó Simulators cố gắng mô phỏng lại cách 1 ứng dụng Android hoạt động; còn Emulators giả lập 1 chiếc điện thoại Android và cho phép chúng ta chạy ứng dụng trên chiếc điện thoại đó bằng cách tương tác với phần cứng mà nó giả lập ra.
Simulators thích hợp cho các kịch bản test phần mềm mà tester tập trung vào việc ứng dụng thực hiện có đúng với yêu cầu (requirements) hay không, các chức năng ít tác động đến phần cứng. Chẳng hạn bạn muốn test giao diện có đúng hay không, chức năng gửi dữ liệu có hoạt động chính xác không, …
Ưu điểm của Simulators là cấu hình có thể cao hơn thiết bị thực tế, vì thế tốc độ test sẽ nhanh hơn, đỡ mất thời gian hơn. Ví dụ Simulators là BlueStacks được trang bị cấu hình đi theo PC, thậm chí hay được sử dụng để chơi game giả lập trên PC.
Gennymotion là 1 trình giả lập Android thông dụng; ngoài ra thì Android Studio cũng cung cấp Android Virtual Devices cho các bạn. Đó đều là các Emulators bạn cần khi test phần mềm trên môi trường giống device thật. Bạn có để ý là Emulators cung cấp nhiều firmware để bạn có thể tạo ra các thiết bị đúng mẫu, đúng hãng, đúng phiên bản hệ điều hành.
Nó sẽ rất hữu ích khi bạn cần phải tái hiện đúng bugs chỉ xảy ra với 1 vài loại devices (nhất là anh em làm Android sẽ hiểu cảm giác này). Tất nhiên do hạn chế phải tạo ra đúng cấu hình (RAM, CPU) giống với thiết bị thật nên Emulators thường chạy khá chậm, đôi khi không ổn định khiến việc test sẽ mất thời gian hơn.
Kết luận
Tùy chức năng cụ thể cần test (kiểm thử) để lựa chọn trình giả lập hay máy ảo phù hợp. Điều quan trọng vẫn là ứng dụng được chạy đúng yêu cầu trước khi đưa ra môi trường production. Và khuyên chân thành là nếu “nhà” có điều kiện thì tốt nhất vẫn nên sắm lấy vài em real devices mà test cho nó được “trải nghiệm chân thực” nhất.
Sự phát triển vượt bậc của các công nghệ di động luôn đem lại nguồn cảm hứng bất tận cho thị trường Tech trong những năm gần đây. Sự tích hợp của AI và Machine Learning vào việc hiểu người dùng thông qua các ứng dụng đang trở nên thịnh hành. Các công nghệ mobile gì sẽ thống trị năm 2024?
1. Công nghệ AR/VR định hình những chiến lược mobile
Các ứng dụng thực tế tăng cường đã phát triển đáng kể trong những năm gần đây, với sự thành công của các ứng dụng AR như Pokemon Go, bộ lọc AR nâng cao trải nghiệm của các mạng xã hội khác nhau cũng như ứng dụng cho các doanh nghiệp như IKEA (của Apple).
Năm nay, với ARKit trên iOS và ARCore trên Android, chúng ta sẽ thấy những tiến bộ hơn nữa trong công nghệ này. Các framework này cho phép các lập trình viên sử dụng các thiết bị cảm biến của máy tính để tạo bản đồ môi trường xung quanh và đặt các vật thể ảo vào đó. Do đó, AR có thể sẽ được sử dụng thường xuyên hơn để giới thiệu và quảng bá sản phẩm.
Một ví dụ điển hình cho những nỗ lực tiếp thị sử dụng công nghệ AR là ứng dụng Welcome to Marwen đã quảng bá cho bộ phim mới nhất của Robert Zemeckis trước khi phát hành. Nó sử dụng các công cụ nói trên (ARKit và ARCore) để hiển thị cảnh phim trên bất kỳ bề mặt nào, vì vậy người dùng có thể điều tra nó từ các góc độ khác nhau, tìm hiểu thêm về các nhân vật và chính bộ phim.
2. AI sẽ thay đối định hướng công nghệ
Những tiến bộ trong AI đã, đang và sẽ thay đổi cách chúng ta tương tác với các ứng dụng di động. Các trợ lý ảo như Siri, Cortana và Google Assistant giờ đây có thể giúp chúng ta thu thập thông tin, sắp xếp lịch trình, đặt lịch hẹn hoặc tối ưu hóa năng suất của chúng ta.
Những phát triển trong Xử lý ngôn ngữ tự nhiên và học máy giúp trợ lý ảo nhận thức rõ hơn theo ngữ cảnh, giúp phản hồi của họ tốt hơn và chính xác hơn. Đồng thời, các công ty lớn như Facebook, Microsoft, Google và Amazon đầu tư vào các giải pháp dựa trên học máy để tạo giao diện đàm thoại tốt hơn. Ngày nay, AI không chỉ trở thành một trợ lý ảo, khi nó cố gắng mô phỏng một người bạn của con người. Gần đây, ứng dụng Alternika.ai được xem là một ví dụ tuyệt vời điển hình.
3. Bảo mật vẫn là mối quan tâm hàng đầu của các dev
Năm 2019, bảo mật ứng dụng di động vẫn là một trong những xu hướng quan trọng nhất. Sự phát triển chung của ngành công nghiệp, số lượng người dùng lên hàng tỷ, SDK của bên thứ 3 và số lượng lớn dữ liệu người dùng được lưu trữ bởi các công ty đã tạo ra mối quan tâm bảo mật hàng đầu cho các nhà phát triển ứng dụng di động.
Điều này được thể hiện qua xu hướng ngày càng tăng của các ứng dụng nhắn tin được mã hóa như Telegram, trình duyệt di động bảo vệ quyền riêng tư của người dùng và sự thay đổi trong ngành theo hướng bảo vệ dữ liệu người dùng, bao gồm cả Apple nỗ lực bảo mật ứng dụng (ATS) và các nỗ lực của Google. Đồng thời, cả hai công ty đều bao gồm các bản cập nhật bảo mật tự động cho các hệ điều hành của họ.
Các chuyên gia đã dự đoán, chúng ta sẽ thấy nhiều cải tiến hơn về bảo mật di động trong
4. Các ứng dụng theo nhu cầu (On-demand apps)
Năm 2018, người dùng trên toàn thế giới đã quen với việc sử dụng các On-demand apps mà điển hình như là Grab và Uber. Ngoài vấn đề di chuyển, các On-demand apps đang chiếm lĩnh các loại dịch vụ khác như dọn dẹp, giao hàng, giặt ủi, mua sắm hoặc đặt lịch hẹn,v.v…
Xu hướng sẽ tiếp tục phát triển khi người dùng thích các sự tiện lợi, tốc độ và phương thức thanh toán được cung cấp thông qua các On-demand apps cho các công việc hằng ngày.
5. Mức độ lan rộng của thanh toán di động
Thanh toán di động và cổng thanh toán đang ngày càng trở nên quan trọng, vì số lượng người dùng mua hàng trực tuyến tăng lên đều đặn hàng năm. Thương mại điện tử, dịch vụ đặt phòng du lịch, ứng dụng theo yêu cầu đều phụ thuộc vào giao dịch di động.
Sự tăng trưởng này của thanh toán di động sẽ tác động đến bảo mật hơn nữa, vì các thương hiệu sẽ phải đảm bảo mã hóa bảo mật trong khi triển khai ví di động và thanh toán trong ứng dụng của họ.
6. Điện toán đám mây di động (Mobile Cloud Computing)
Theo IDC, gần một nửa chi tiêu CNTT trong năm 2018 là dành cho Cloud. Năm 2019, chúng ta sẽ tiếp tục chứng kiến số lượng ngày càng tăng của các công cụ và dịch vụ Cloud. Sự tăng trưởng sẽ bao gồm phần mềm, cơ sở hạ tầng hoặc nền tảng dạng dịch vụ (Software-as-a-Service, Infrastructure-as-a-Service and Platform-as-a-Service).
Với các giải pháp điện toán đám mây di động (MCC), ý tưởng là cung cấp các ứng dụng di động phong phú và trải nghiệm người dùng liền mạch trên nhiều thiết bị. Điều này sẽ có lợi cho các công ty muốn phục vụ người dùng của họ trên thiết bị di động, nhưng cần nhiều khả năng và tốc độ tính toán hơn, điều này có thể làm chậm trải nghiệm trên các thiết bị này. Một ví dụ điển hình là các ứng dụng chăm sóc sức khỏe di động cần xử lý thông tin để cung cấp chẩn đoán từ xa như một phần của dịch vụ của họ.
7. Accelerated Mobile Pages
Tốc độ tải vẫn là một yếu tố quan trọng đối với người dùng di động.
Để cải thiện nó, Google đã giới thiệu các trang di động tăng tốc. Đây là một dự án nguồn mở nhằm cải thiện trải nghiệm duyệt web trên thiết bị di động. Bạn có thể dễ dàng nhận ra trang web dựa trên AMP đang tìm kiếm Google trên thiết bị di động, vì chúng được đánh dấu như vậy.
Các nhà phát triển web, doanh nghiệp và nhà xuất bản sẽ cần xem xét giải pháp này, vì nó không chỉ cải thiện trải nghiệm người dùng trên thiết bị di động mà còn là yếu tố SEO (các trang web AMP xếp hạng cao hơn trong Google).
Đồng thời, việc phát triển và duy trì AMP sẽ rẻ hơn so với việc xây dựng một ứng dụng di động native hoặc hybrid.
8. Progressive Web Apps
Progressive Web App (PWA) được mệnh danh là thế hệ ứng dụng web di động tiếp theo. Họ không bị ràng buộc bởi các trang web di động như tốc độ chậm và nhu cầu kết nối Internet liên tục.
PWAs mang lại cảm giác rất “tự nhiên” với các tính năng bao gồm chế độ ngoại tuyến và toàn màn hình, trình khởi chạy màn hình chính, quyền truy cập vào camera và thông báo đẩy. Thêm vào đó, chúng nhanh hơn và tiêu thụ ít dữ liệu hơn các trang web di động. Ngoài ra, PWAs không yêu cầu tải xuống và cài đặt,
Một ví dụ điển hình của một thương hiệu toàn cầu đã quyết định xây dựng Progressive Web Apps đa nền tảng là AliExpress. Chủ sở hữu của thị trường trực tuyến này nhận thấy rằng thương mại di động của họ phát triển nhanh gấp ba lần so với thương mại điện tử và muốn cải thiện trải nghiệm trên thiết bị di động. Việc triển khai PWA dẫn đến thêm 104% người dùng trên thiết bị di động và tăng 82% tỷ lệ chuyển đổi chỉ riêng trên iOS.
9. Android Instant Apps (Ứng dụng tức thì)
Xem xét số lượng lớn các ứng dụng di động trong các cửa hàng ứng dụng, Google nhận ra rằng việc người dùng tải xuống và cập nhật ứng dụng mới mỗi lúc, cho các mục đích khác nhau sẽ rất khó khăn. Đó là lý do tại sao công ty giới thiệu Ứng dụng tức thì (Instant Apps).
Với Android Instant Apps, người dùng chỉ có thể tải xuống các phần cần thiết nhất của ứng dụng, truy cập phần còn lại của nội dung ngay lập tức thông qua URL, tiết kiệm dung lượng trên thiết bị. Instant Apps của Android đang được phát triển đồng thời Progressive Web App của Google.
Vimeo, một nền tảng phát video, đã sử dụng Instant Apps để giảm trọng lượng ứng dụng Android của họ từ gói cài đặt 15MB xuống mô-đun tính năng 4 MB. Ứng dụng đã thoát khỏi một số thư viện và sử dụng thư viện bộ nhớ đệm hình ảnh nhỏ hơn. Do đó, ứng dụng cung cấp trải nghiệm tốt hơn trên các thiết bị Android và công ty đã chứng kiến sự gia tăng 130% trong số lượng truy cập các video.
10. Chatbot
Chatbots trở thành một phần không thể thiếu trong các ứng dụng liên lạc như Slack, Facebook Messenger hay Telegram để giúp họ có thể tương tác với khách hàng 24/7. Và dễ dàng hơn bao giờ hết để xây dựng một chatbot bằng cách sử dụng các trình tạo trò chuyện, từ các ứng dụng như AWS Lex có thể yêu cầu một số kiến thức lập trình, cho đến các công cụ xây dựng đơn giản hơn sử dụng các thành phần hiện có.
Với nhiều tích hợp và các công cụ xây dựng trò chuyện đơn giản với giá cả phải chăng, chúng ta sẽ thấy nhiều chatbot hơn trong năm 2024, chúng sẽ thúc đẩy các cuộc trò chuyện giữa người tiêu dùng và doanh nghiệp.
10 xu hướng công nghệ di động kể trên đang hăm he “soán ngôi” các công nghệ trước đó, Việt Nam đang dần áp dụng hầu hết các xu hướng trên để bước dần đến một nền tảng kinh doanh trên mobile hiện đại, tiện ích và hiệu quả.
Bài viết được sự cho phép của tác giả Trần Anh Tuấn
Mùa đông gần đến rồi, chắc ai cũng cảm nhận được hơi lạnh của nó rồi nhỉ. Mỗi người ai cũng có cách của riêng mình để tận hưởng hơi lạnh này như đi chơi với gấu hay ở nhà đắp mền mà ngủ. Riêng với mình thì mình sẽ chia sẻ cho các bạn cách tận hưởng thời tiết mùa đông này bằng việc hướng dẫn cắt một PSD toàn tập để giúp các bạn làm ấm áp người nhé.
Không để các bạn chờ lâu, chúng ta sẽ đi nhanh vào phần khởi động. Như tiêu đề các bạn đã thấy chúng ta sẽ cắt một giao diện có tên là LeoSpa một LandingPage về Spa. Các bạn có thể xem qua hình ảnh của nó ở đây hoặc tải PSD ở đây.
# Phân tích thiết kế
Bước đầu tiên như những lần mình chia sẻ trước đó đó chính là phân tích thiết kế mà chúng ta được giao. Và mình cũng đã hướng dẫn các checklist cho các bạn luôn rồi, các bạn có thể nhấn vào đây để xem lại bài đó hoặc xem luôn ngay tại đây:
Màu sắc: Chúng ta có màu chủ đạo là màu san hô với mã màu là #ff817e, màu xám tối là #263a41 và màu xám sáng là #888, ngoài ra còn có màu nền trong các block là #fff9f8. Để lấy màu sắc thì các bạn chỉ cần mở thiết kế bằng Photoshop hoặc công cụ nào đó hỗ trợ việc lấy mã màu rồi lấy thôi.
Font chữ: Trong thiết kế này dùng 2 fonts chữ đó chính là Roboto và Rufina. Hai fonts này đều có sẵn ở Google Font nên việc dùng chúng rất là đơn giản. Chỉ việc vào Google Font chọn rồi sau đó chèn vào thẻ head của file index.html như sau
Icons: Chúng ta sẽ dùng FontAwesome bằng việc Google “fontawesome cdnjs” là ra trang của Cloudflare rồi vào để lấy link sau đó cũng chèn vào thẻ head như sau
Hình ảnh: Cắt ra bằng Photoshop hoặc các công cụ hỗ trợ khác.
Kích thước: Design này rộng 1920px và container của nó là 1140px với Grid được chia thành 12 cột bằng nhau và grid-gap giữa các cột là 30px
Về kích thước thì mình mở thiết kế lên bằng Photoshop và đo mới có kết quả như ở trên là 1920px và container là nội dung nằm ở giữa 1140px được chia thành 12 cột bằng nhau với khoảng cách giữa các cột( chỗ mũi tên màu đỏ ) là 30px. Từ đây chúng ta có thể dùng CSS Grid để chia cột, kết hợp với CSS Flexbox để dàn layout.
Container tuy là 1140px nhưng khi bắt đầu thiết lập code CSS cơ bản thì mình sẽ cho nó thêm 15px mỗi bên trái phải để nó có khoảng trống khi co lại dưới giao diện mobile, nghĩa là lúc này nó sẽ là 1170px = 1140 + 15 + 15. Chỗ 15px các bạn cho bao nhiêu tuỳ các bạn nhé, ở đây mình cho 15px là hiển thị đẹp rồi.
Mình sẽ hướng dẫn chi tiết hơn cho các bạn khi chúng ta bắt đầu vào code phần Header ở bài sau.
Mình dùng phần mềm Visual Studio Code với Shade of Purple Theme kết hợp với font chữ Operator Mono. Các bạn dùng gì thì tuỳ các bạn nhé.
Cấu trúc thư mục đơn giản gồm có file index.html, thư mục css để chứa các file css như reset.css, setting.css và main.css .Thư mục js có file main.js để code Javascript (nếu có) và thư mục images để chứa các hình ảnh.
File reset.css để reset css ở các trình duyệt các bạn có thể Google để hiểu thêm về nó nha, file setting.css để thiết lập các đoạn code cần phải có ban đầu như dùng biến trong CSS để lưu các mã màu, font chữ, kích thước, dùng đơn vị rem và cuối cùng là file main.css để chúng ta bắt đầu code CSS trong đó. Dưới đây là đoạn code trong file setting.css
Mình lưu các biến lại trong :root để tiện sử dụng nhé. Nếu bạn nào chưa biết thì đọc lại bài cách dùng biến trong CSS, cũng như là đơn vị REM. Để hiểu lý do vì sao mình để font-size: 62.5% ở thẻ html.
# Tạm kết
Như vầy là xong phần khởi động đơn giản. Mình đã list ra những tài nguyên, công cụ cũng như các thiết lập đơn giản ban đầu mà chúng ta cần có để có thể code ra giao diện hoàn chỉnh ở các bài sau. Mình có đính kèm code setup cơ bản như bài hướng dẫn, các bạn có thể nhấn vào đây để tải về nhé. Hẹn gặp lại các bạn ở bài sau.
Bài viết được cho phép bởi tác giả Nguyễn Thái Dương
Những ai từng học lập trình hướng đối tượng OOP chắc chắn đều biết đến khái niệm nạp chồng (Override). Nhưng thông thường, ít bạn quan tâm đến việc compiler đã xử lý nó như thế nào. Phía sau hậu trường hệ thống đã làm gì để tạo nên điều kì diệu? Bài viết này hi vọng sẽ giúp các bạn có câu trả lời xác đáng nhất.
Để dễ dàng trong việc hiển thị các giá trị trong vùng bộ nhớ, tôi chọn C++. Đối với Java hay các ngôn ngữ lập trình khác, tôi tin rằng các bạn cũng có thể dễ dàng luận ra được dựa trên cơ chế của C++
Trước hết, chúng ta cần tìm hiểu về hàm virtual. Hãy xét 1 class đơn giản sau (Giả sử ta compile cho hệ vi xử lý 64 bit). Bạn có thể copy paste vào http://cpp.sh để chạy thử:
#include <iostream>
#include <string>
class Sample1 {
public:
virtual void vMethod1() {
printf("This is virtual method 1\n");
}
virtual void vMethod2() {
printf("This is virtual method 2\n");
}
void method2() {
printf("This is NONVIRTUAL method 2\n");
}
public:
int member1;
int member2;
};
//Define method type
typedef void (*MyFunc)();
int main(int argc, const char * argv[]) {
Sample1 *a = new Sample1();
printf("size of Sample1: %d\n", sizeof(Sample1));
MyFunc *virtualMethodTable = (MyFunc*)(*(MyFunc*)a);
virtualMethodTable[0](); //call method1
virtualMethodTable[1](); //call method2
return 0;
}
Kết quả sẽ như sau:
size of Sample1: 16
This is virtual method 1
This is virtual method 2
Yeah!!. Đến đây bạn thấy không? Chúng ta có thể call được class method mà không cần gọi thông qua instance của nó. Ta hãy thử đi phân tích cấu trúc dữ liệu 16 byte của class Sample1:
#
vị trí (byte)
size (bytes)
field
1
0
8
con trỏ trỏ tới virtual method table (VMT)
2
8
4
member1
3
12
4
member2
Chỗ này có 1 khái niệm mới là Virtual Method Table (VMT). Vậy nó là cái gì? Virtual Method Table thực chất là một mảng các con trỏ hàm chứa địa chỉ của các hàm virtual trong class. Trong ví dụ trên sẽ là:
OK, có 1 điều hơi lấn cấn ở đây khi bạn sử dụng member1 trong vMethod1:
#include <iostream>
#include <string>
class Sample1 {
public:
virtual void vMethod1() {
printf("This is virtual method 1\n");
printf("member1 = %d\n", member1);
}
virtual void vMethod2() {
printf("This is virtual method 2\n");
}
void method2() {
printf("This is NONVIRTUAL method 2\n");
}
public:
int member1;
int member2;
};
//Define method type
typedef void (*MyFunc)();
int main(int argc, const char * argv[]) {
Sample1 *a = new Sample1();
a->member1 = 1000;
printf("size of Sample1: %d\n", sizeof(Sample1));
MyFunc *virtualMethodTable = (MyFunc*)(*(MyFunc*)a);
virtualMethodTable[0](); //call method1
virtualMethodTable[1](); //call method2
return 0;
}
Kết quả sẽ có dạng như sau:
size of Sample1: 16
This is virtual method 1
member1 = 1268843168
This is virtual method 2
giá trị member1 là 1 giá trị không phải là 1000 như mình đã gán ở trên mà là 1 giá trị rác. Nguyên nhân là do lời gọi virtualMethodTable[0](); chỉ đơn thuần là gọi 1 đoạn code của hàm mà chưa truyền con trỏ this vào trong hàm đó (vMethod1).
Thông thường, lời gọi đúng phải là: a->vMethod1();
Giờ chúng ta sẽ tìm cách truyền con trỏ a vào cho lời gọi virtualMethodTable[0]();. Giờ ta sửa lại 1 chút:
#include <iostream>
#include <string>
class Sample1 {
public:
virtual void vMethod1() {
printf("This is virtual method 1\n");
printf("member1 = %d\n", member1);
}
virtual void vMethod2() {
printf("This is virtual method 2\n");
}
void method2() {
printf("This is NONVIRTUAL method 2\n");
}
public:
int member1;
int member2;
};
//Define method type
//Thêm tham số thisPtr ở đây
typedef void (*MyFunc)(Sample1 *thisPtr);
int main(int argc, const char * argv[]) {
Sample1 *a = new Sample1();
a->member1 = 1000;
printf("size of Sample1: %d\n", sizeof(Sample1));
MyFunc *virtualMethodTable = (MyFunc*)(*(MyFunc*)a);
//Lệnh trên tương đương với:
// memcpy(&virtualMethodTable2, b, 8);
virtualMethodTable[0](a); //call method1
virtualMethodTable[1](a); //call method2
return 0;
}
Giờ chạy thử nhé:
size of Sample1: 16
This is virtual method 1
member1 = 1000
This is virtual method 2
Yeah. Giờ member1 đã là 1000. Đúng với giá trị chúng ta truyền vào. Giờ chúng ta thử fake lại cách 1 instance được tạo ra từ 1 class theo cách không dùng class nhé:
#include <iostream>
#include <string>
class Sample1 {
public:
virtual void vMethod1() {
printf("This is virtual method 1\n");
printf("member1 = %d\n", member1);
}
virtual void vMethod2() {
printf("This is virtual method 2\n");
}
void method2() {
printf("This is NONVIRTUAL method 2\n");
}
public:
int member1;
int member2;
};
//Define method type
//Thêm tham số thisPtr ở đây
typedef void (*MyFunc)(Sample1 *thisPtr);
struct ClassDesc {
MyFunc* vmt;
int member1;
int member2;
};
void fakeVMethod1(ClassDesc* thisPtr) {
printf("fake virtual method1 - member1: %d\n", thisPtr->member1);
}
void fakeVMethod2(ClassDesc* thisPtr) {
printf("fake virtual method2 - member2: %d\n", thisPtr->member2);
}
void constructor(ClassDesc* desc) {
//Init virtual method table
desc->vmt = new MyFunc[2];
desc->vmt[0] = (MyFunc)&fakeVMethod1;
desc->vmt[1] = (MyFunc)&fakeVMethod2;
}
void destructor(ClassDesc* desc) {
//delete virtual method table
delete []desc->vmt;
}
int main(int argc, const char * argv[]) {
Sample1 *a = new Sample1();
a->member1 = 1000;
printf("size of Sample1: %d\n", sizeof(Sample1));
MyFunc *virtualMethodTable = (MyFunc*)(*(MyFunc*)a);
virtualMethodTable[0](a); //call method1
virtualMethodTable[1](a); //call method2
printf("\n--------------FAKE CLASS----------------\n\n");
ClassDesc* clsDesc = new ClassDesc(); // |
constructor(clsDesc); // | <=> a = new Sample1();
clsDesc->member1 = 2000;
clsDesc->member2 = 3000;
Sample1* b = reinterpret_cast<Sample1*>(clsDesc); // cast Class Description struct to Sample1*
b->vMethod1();
b->vMethod2();
destructor(clsDesc); //
delete clsDesc; // <=> delete b;
return 0;
}
Kết quả:
size of Sample1: 16
This is virtual method 1
member1 = 1000
This is virtual method 2 ————–FAKE CLASS—————-
fake virtual method1 – member1: 2000
fake virtual method2 – member2: 3000
Đến đây chúng ta ít nhiều đã hình dung ra được cách C++ tổ chức dữ liệu trong một class như thế nào. Giờ chúng ta sẽ cùng tìm hiểu xem cách mà C++ override một method trong Class như thế nào:
#include < iostream >
#include < string >
#include < cstring >
class Sample1 {
public:
virtual void vMethod1() {
printf("This is virtual method 1\n");
printf("Sample1: member1 = %d\n", member1);
}
virtual void vMethod2() {
printf("Sample1: This is virtual method 2\n");
}
void method2() {
printf("This is NONVIRTUAL method 2\n");
}
public:
int member1;
int member2;
};
class Sample2: public Sample1 {
public:
//override vMethod1()
virtual void vMethod1() {
printf("Sample2: This is virtual method 1\n");
}
virtual void vMethod3() {
printf("Sample2: This is virtual method 3\n");
}
};
//Define method type
//Thêm tham số thisPtr ở đây
typedef void (*MyFunc)(Sample1 *thisPtr);
int main(int argc, const char * argv[]) {
Sample1 *a = new Sample1();
MyFunc *virtualMethodTable = (MyFunc*)(*(MyFunc*)a);
Sample2 *b = new Sample2();
MyFunc* virtualMethodTable2;
memcpy(&virtualMethodTable2, b, 8);
printf("\n\n");
printf("Sample1 - vMethod1 Addr: %p\n", virtualMethodTable[0]);
printf("Sample1 - vMethod2 Addr: %p\n", virtualMethodTable[1]);
printf("--------------------------------\n");
printf("Sample2 - vMethod1 Addr: %p\n", virtualMethodTable2[0]);
printf("Sample2 - vMethod2 Addr: %p\n", virtualMethodTable2[1]);
return 0;
}
Chúng ta thấy ngay, Class B được override method1 nên địa chỉ của vMethod1 trong VMT của b khác với của a, trong khi vMethod2 thì giống hết nhau vì không bị override.
Ta có thể fake lại việc override một cách đơn giản như sau:
#include <iostream>
#include <string>
class Sample1 {
public:
virtual void vMethod1() {
printf("This is virtual method 1\n");
printf("member1 = %d\n", member1);
}
virtual void vMethod2() {
printf("This is virtual method 2\n");
}
void method2() {
printf("This is NONVIRTUAL method 2\n");
}
public:
int member1;
int member2;
};
//Define method type
//Thêm tham số thisPtr ở đây
typedef void (*MyFunc)(Sample1 *thisPtr);
struct ClassDesc {
MyFunc* vmt;
int member1;
int member2;
};
void fakeVMethod1(ClassDesc* thisPtr) {
printf("fake virtual method1 - member1: %d\n", thisPtr->member1);
}
void fakeVMethod2(ClassDesc* thisPtr) {
printf("fake virtual method2 - member2: %d\n", thisPtr->member2);
}
void constructor(ClassDesc* desc) {
//Init virtual method table
desc->vmt = new MyFunc[2];
desc->vmt[0] = (MyFunc)&fakeVMethod1;
desc->vmt[1] = (MyFunc)&fakeVMethod2;
}
void destructor(ClassDesc* desc) {
//delete virtual method table
delete []desc->vmt;
}
void override_fakeVMethod1(ClassDesc* thisPtr) {
printf("override fake virtual method1 - member1: %d\n", thisPtr->member1);
}
void constructor_Extend(ClassDesc* desc) {
constructor(desc);
desc->vmt[0] = (MyFunc)&override_fakeVMethod1;
}
int main(int argc, const char * argv[]) {
Sample1 *a = new Sample1();
a->member1 = 1000;
printf("size of Sample1: %d\n", sizeof(Sample1));
MyFunc *virtualMethodTable = (MyFunc*)(*(MyFunc*)a);
virtualMethodTable[0](a); //call method1
virtualMethodTable[1](a); //call method2
printf("\n--------------FAKE CLASS----------------\n\n");
ClassDesc* clsDesc = new ClassDesc(); // |
constructor(clsDesc); // | <=> a = new Sample1();
clsDesc->member1 = 2000;
clsDesc->member2 = 3000;
Sample1* b = reinterpret_cast<Sample1*>(clsDesc); // cast Class Description struct to Sample1*
b->vMethod1();
b->vMethod2();
destructor(clsDesc); //
delete clsDesc; // <=> delete b;
printf("\n--------------FAKE INHERITANCE CLASS----------------\n\n");
ClassDesc* clsDesc2 = new ClassDesc(); // |
constructor_Extend(clsDesc2); // | <=> a = new Sample1();
clsDesc2->member1 = 2000;
clsDesc2->member2 = 3000;
b = reinterpret_cast<Sample1*>(clsDesc2); // cast Class Description struct to Sample1*
b->vMethod1();
b->vMethod2();
destructor(clsDesc2); //
delete clsDesc2; // <=> delete b;
return 0;
}
Kết quả:
size of Sample1: 16
This is virtual method 1 member1 = 1000
This is virtual method 2
Yeah. Ta thấy ngay khi gọi b->vMethod1() thì hàm override_fakeVMethod1 được gọi. Vậy là chúng ta đã thực hiện thành công việc override hàm method.
Bài viết này hi vọng mang đến cho các bạn 1 cái nhìn rõ hơn về khía cạnh cài đặt của virtual method và override – cái mà trình biên dịch đã che dấu khỏi developer. Chúng ta sẽ cùng nhau tìm hiểu những điều thú vị khác nằm sâu bên trong chương trình để hiểu rõ hơn cách thức mà máy tính hoạt động đằng sau những dòng code của bạn.
Các nội dung được chia sẻ sẽ mang đến cho người đọc một cái nhìn tổng quan hơn về bối cảnh cũng như xu hướng của ngành kiểm thử tự động trong giai đoạn hiện tại và tương lai.
Về diễn giả
Anh Thanh Lê hiện đang là Delivery Manager tại LogiGear.
Anh đã có 9 năm làm việc trong ngành kiểm thử phần mềm.
Công việc hiện tại khá đa dạng các nhiệm vụ khác nhau như xây dựng mối quan hệ với khách hàng, quản lý chất lượng dự án và quản lý con người, tham gia đào tạo nguồn nhân lực cho công ty thông qua các lớp kiểm thử tự động, tham gia viết các bài báo chia sẻ kinh nghiệm sử dụng công cụ kiểm thử tự động.
Tất cả các kinh nghiệm được chia sẻ hôm nay đều dựa trên kinh nghiệm làm việc và ý kiến khách quan của mình. Bên cạnh đó, mình đã tham khảo nhiều nghiên cứu về lĩnh vực kiểm thử phần mềm tại LogiGear để đi tới một số kết luận này.
Có thể bạn đã nghe qua nhiều cụm từ như “chính phủ điện tử”, “thành phố thông minh”, “ngân hàng điện tử”, “chatbot”, “ứng dụng dịch vụ đám mây”… Tất cả những thuật ngữ này đều là bước đi của những quốc gia, công ty nhằm mục đích chuyển đổi số.
Vậy chuyển đổi số là gì?
Nói một cách dễ hiểu, chuyển đổi số là quá trình mà thông qua việc sử dụng những công cụ, ứng dụng khoa học kỹ thuật để thay thế hoặc cải thiện những công việc chưa được ứng dụng khoa học kỹ thuật hoặc những công việc đòi hỏi nhiều công sức của con người. Covid-19 là một nhân tố thúc đẩy sự phát triển mạnh mẽ của chuyển đổi số trong 2 năm gần đây.
Một điều chắc chắn là kinh tế thế giới bị ảnh hưởng rất rõ rệt trong suốt đại dịch này nên việc cắt giảm chi phí hoạt động, ngân sách, nguồn nhân lực là việc không thể tránh khỏi ở rất nhiều công ty. Tuy nhiên, chất lượng dịch vụ là thứ không thể cắt giảm, vậy làm thế nào để sống sót được qua đại dịch và cạnh tranh với thị trường?
Câu trả lời chính là chuyển đổi số.
Thực hiện việc tự động hóa nhiều hơn, chúng ta có thể viết nên những chương trình, những ứng dụng mà qua đó máy móc sẽ làm việc để giảm bớt chi phí và nhân lực mà công ty cần có để hoạt động. Chuyển đổi số phụ thuộc rất nhiều vào khoa học kỹ thuật, nhiều ứng dụng ra đời với mục đích chuyển đổi số. Là một tester, một dev, công việc của mình sẽ nhiều hơn, có nhiều cơ hội việc làm hơn trong thời đại chuyển đổi số này.
DevOps, Continuous Testing, CI/CD
DevOps
Điều đầu tiên khi nhắc đến DevOps được nhiều người nghĩ chính là rất nhiều các công nghệ và công cụ cần phải đào sâu nghiên cứu, điều này đúng nhưng chưa đủ. DevOps giống như Agile mà không phải là một công cụ hay một process, nó là một văn hóa làm việc.
Văn hóa này đề cao sự gắn kết giữa team phát triển phần mềm và team vận hành sản phẩm khi đưa ra thị trường. QA hiện nay vẫn đóng vai trò rất quan trọng trong việc phát triển phần mềm cho dù các công ty, các dự án đang apply những dự án như thế nào.
QA sẽ góp phần đưa ra những quyết định như việc sản phẩm này có được đưa ra thị trường hay không. Khi làm việc trong team thuần về Devops, QA có thể vô tình trở thành điểm nghẽn cho sự phát triển và đưa sản phẩm ra thị trường. Làm sao để có thể hoàn thành công việc một cách liên tục, không gây ảnh hưởng đến team phát triển phần mềm cũng như ngăn cản việc phải chờ đợi feedback từ QA mới có thể cho sản phẩm ra thị trường?
Phương thức kiểm thử mới Continuous testing bắt buộc bạn phải tìm ra một cách nào đó để kiểm thử sớm hơn trước khi sản phẩm được đưa ra thị trường cũng như có thể kiểm thử thường xuyên hơn. Để áp dụng continuous testing vào trong quá trình kiểm, yêu cầu chúng ta phải tự động hóa luôn quá trình kiểm thử.
Chẳng hạn như khi sắp có một bản phát hành mới thì đội ngũ tester cần tham gia kiểm thử sản phẩm đó để đưa ra feedback cho đội ngũ phát triển phần mềm. Nếu team dev release sản phẩm vào lúc khuya chẳng hạn, thì việc QA có thể thức để chờ có sản phẩm và test sẽ khá khó khăn. Công việc này đòi hỏi yếu tố quan trọng là tự động hóa – tự động hóa những công việc mà tester cần phải làm khi muốn đưa ra phản hồi về chất lượng sản phẩm.
Nói một cách dễ hiểu là bạn phải dùng những chương trình để tự động hóa việc mô phỏng lại những thao tác mà tester sẽ làm khi kiểm thử một ứng dụng nào đó.
CI/CD
Thông qua đó, chúng ta sẽ để cho những hệ thống CI/CD vận hành và tự động chạy những automatic test mỗi khi có một sản phẩm mới cần đưa ra thị trường. Việc này hoàn toàn không gây nên gánh nặng gì cho testing mà còn giải phóng testing khỏi những công việc lặp đi lặp lại.
Nhờ vậy đội ngũ testing sẽ có nhiều thời gian hơn để tập trung vào những loại hình kiểm thử cần kinh nghiệm và khả năng sáng tạo của con người mà máy không thể nào thay thế được.
Có một số tools bạn có thể sẽ gặp khi sử dụng DevOps hay Continuous Testing bên dưới mà bạn có thể tìm hiểu:
Robotic Process Automation (RPA) – Tự động hóa quy trình bằng robot
Đây là xu hướng vẫn còn khá mới mẻ với cộng đồng công nghệ thông tin tại Việt Nam. RPA là một cơ hội mới trong mảng Công nghệ thông tin.
RPA thực chất là tập hợp những chương trình được lập trình sẵn và thông qua đó mô phỏng lại những thao tác mà người dùng thường xuyên thực hiện trên một ứng dụng.
Thông qua những chương trình được lập trình sẵn như vậy, RPA giúp nâng cao năng suất hoạt động của nhân viên, giảm thiểu các rủi ro và sai sót trong quá trình làm việc.
Kiểm thử tự động là quá trình mô phỏng lại những thao tác của testers và đưa ra các phản hồi về chất lượng sản phẩm. Trong khi đó, RPA cũng tương tự vậy, nó cũng mô phỏng lại những thao tác mà người dùng sẽ làm trên các ứng dụng như trích xuất dữ liệu từ một file PDF và nhập vào một chương trình hay lấy thông tin từ một website và tạo ra báo cáo chẳng hạn.
Bước khởi đầu của cả hai khá giống nhau nhưng mục đích của RPA là để thay thế con người làm những công việc mang tính chất có quy tắc, lặp đi lặp lại, phải xử lý nhiều dữ liệu thì RPA là lĩnh vực mới sẽ phát triển tại Việt Nam trong thời gian tới.
Ngoài việc giống với automation testing, rất nhiều cơ quan tổ chức đang chuyển mình trong thời đại chuyển đổi số này và thông qua đó họ muốn nâng cao năng lực hoạt động của công ty. Do đó có thể thấy automation chắc chắn là một yếu tố rất quan trọng trong hiện tại và cả tương lai. RPA sẽ trở thành nhân tố chính ảnh hưởng đến sự thành bại của các bước đi trong suốt quá trình chuyển đổi số.
Theo dự đoán của Gartner, trong năm 2022, doanh thu từ việc sản xuất ra các công cụ RPA trên toàn cầu có thể lên tới khoảng 2 tỉ USD. Đây là một con số khá lớn cho thấy “mảnh đất” này thật sự màu mỡ và rất đáng để chúng ta thử sức. Vì vẫn còn khá mới nên nếu muốn thử sức với RPA thì sẽ phải bắt đầu từ đâu?
May mắn là những công ty phát triển các công cụ RPA đã biết được điều đó và đưa ra các chương trình về đào tạo, sử dụng tools cũng như các chương trình giúp hiểu hơn về RPA cũng như cách tổ chức một dự án RPA sẽ như thế nào.
More IoT và AI testing
Các thiết bị IoT ngày nay xuất hiện ở khắp mọi nơi và nhiều lĩnh vực khác nhau. Theo báo cáo của Gartner vào năm 2020, trên thế giới sẽ có khoảng 30 tỷ thiết bị IoT. Điều này đồng nghĩa với việc những ứng dụng được tạo ra nhằm quản lý và sử dụng các thiết bị IoT sẽ rất nhiều. Dẫn đến kết quả tất yếu là công việc trong ngành này cũng sẽ ngày càng nhiều hơn cả về mặt chất lượng và số lượng.
Nhưng có một thử thách lớn đó là việc kiểm thử hệ thống IoT hoặc các hệ thống kiểm thử có tích hợp IoT thì không hề đơn giản. Nó đòi hỏi chúng ta phải nghiên cứu để tìm ra những hướng đi mới, cách đi mới để có thể test một cách toàn diện hệ thống mới này.
Theo tìm hiểu của mình, để test một hệ thống tích hợp AI sẽ cần có 4 điểm chính. Trong đó, data và giải thuật là 2 yếu tố đầu tiên quyết định chất lượng của ứng dụng AI, chất lượng của sản phẩm sẽ phụ thuộc vào chất lượng dữ liệu mà chúng ta dùng để train và kiểm thử hệ thống AI. Trong giải thuật sẽ có rất nhiều libraries được đưa ra trên internet đã tích hợp sẵn giải thuật trước đó.
Các hệ thống AI có sự kết hợp của rất nhiều libraries, nhiều giải thuật khác nhau để tạo ra một hệ thống AI hoàn chỉnh. Vì thế chúng ta không thể xem nhẹ việc test giải thuật của ứng dụng AI. Sau khi chương trình đã chạy được rồi, bạn sẽ còn cần phải quan tâm đến hiệu suất và tính bảo mật của chương trình.
Yếu tố cuối cùng, khi một hệ thống IoT hoặc một thiết bị AI được tạo ra chắc chắn sẽ không chỉ sử dụng với một chương trình cụ thể nào hết mà có thể được tích hợp, liên kết với rất nhiều chương trình, thiết bị khác mà một người tester phải xem xét và kiểm thử những hệ sinh thái xung quanh chương trình mà chúng ta đang phát triển.
Flaky test là một trong những khó khăn với bất cứ ai làm trong ngành kiểm thử tự động. Đó là test của những chương trình đã viết rồi nhưng đôi lúc lại gặp thất bại một cách khá đột ngột và không thể lường trước được. Đó có thể là những lỗi sai xảy ra do sự thay đổi nhỏ trên giao diện ứng dụng chẳng hạn.
Khi nhập môn kiểm thử tự động, các tester sẽ biết được cách định vị những controls, locate elements và sử dụng các công cụ, các chương trình để tương tác với controls đó. Chẳng hạn như khi làm việc với Selenium thì sẽ có rất nhiều các kỹ thuật khác nhau để locate elements như sử dụng ID, name, CSS, xpath,…
Nhưng đa số trong các dự án mình đã tham gia mọi người đều chọn xpath vì nó rất hiệu quả trong việc giúp định vị những controls không có các attribute cụ thể nào cả.
Selenium
Điều đó dẫn đến các xpath đã được generate ra sẽ trở nên khá khó để có ai khác sau này, khi họ tiếp tục dự án có thể đọc và hiểu được. Vì lí do đó nên 4 versions đang được phát triển của Selenium đã đưa ra một feature mới là Relative Locators.
Relative Locators cho phép tìm kiếm và locate những elements thông qua các phương hướng. Rõ ràng Selenium là tool đang được sử dụng rộng rãi và hi vọng rằng trong version 4 của Selenium Webdriver sẽ có nhiều features hỗ trợ giảm thiểu việc tốn quá nhiều thời gian để tạo automation script.
Cypress
Bên cạnh đó cũng có những thương hiệu gần đây được biết đến khá nhiều như Cypress – một automation tool có cách hoạt động trái ngược hoàn toàn với Selenium Webdriver. Thay vì tương tác trực tiếp với browser thì nó sẽ chạy bên trong trình duyệt, có thể nắm bắt tất cả các traffic đi ra và đi vào trong ứng dụng.
Protractor cũng là một tool khác dựa trên Selenium Webdriver, hỗ trợ giảm bớt công việc khi build các dự án để kiểm thử tự động những ứng dụng được build bằng Angular.
Puppeteer
Puppeteer chú trọng đến việc cho phép test trên các headless browser. Một điều dễ dàng nhận ra trong các dự án kiểm thử phần mềm là trong một team không phải ai cũng biết code và code tốt, nhưng khi đã chuyển dự án qua kiểm thử tự động thì bắt buộc bạn phải dành thời gian để học thêm về lập trình và cách sử dụng những tools mình sẽ dùng để mô phỏng các thao tác của một tester.
Trên thị trường hiện nay đã có nhiều tools ra đời với mục đích giảm thiểu thời gian coding, tạm gọi là những feature record and playback. Các công cụ này sẽ ghi nhớ lại các thao tác đã làm trên ứng dụng và tự động generate ra những đoạn script mà bạn có thể sử dụng để chạy lại. Selenium IDE là công cụ khá quen thuộc cho phép bạn làm chuyện này. Ngoài ra còn có TestArchitect và Gondola.
Một vấn đề khác khá thú vị trong việc phát triển các tools kiểm thử tự động đó là tích hợp hệ thống trí thông minh nhân tạo vào quá trình kiểm thử phần mềm. Có một viễn cảnh tươi sáng được vạch ra, đó là khi đưa một ứng dụng đang phát triển cho một chương trình kiểm thử tự động tích hợp AI thì nó sẽ tự động test tất cả mọi thứ và trả về feedback.
Có những công ty tiên phong trong việc tích hợp AI vào công cụ kiểm thử tự động ví dụ như Applitools – là một phần mềm tích hợp AI giúp tester test các giao diện của web application một cách đơn giản và hiệu quả nhất. Applitools sẽ tự động dùng AI định vị những vấn đề mà ứng dụng cần cải thiện hoặc những bugs có thể xảy ra trong suốt quá trình. Testim là một tool khác đang tập trung phát triển hệ thống AI phục vụ cho functional testing, test các features ứng dụng nhiều hơn test về giao diện.
Đây là 2 công cụ đang rất phát triển và có tiềm năng phát triển trong các dự án. Chẳng hạn như có thể kết hợp Applitools vào Selenium framework để kết hợp giữa kiểm thử tự động với những chức năng của ứng dụng cũng như kiểm thử tự động các bug về giao diện có thể có trong ứng dụng.
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