Trong lập trình nói chung và trong lập trình web nói riêng, chúng ta thường hay nghe tới các khái niệm như vps, hosting,… vậy chúng thật sự là gì, chúng khác nhau như thế nào và và tác dụng của chúng là gì thì mình sẽ giải thích ngắn gọn trong bài viết này nhé.
I. VPS là gì?
VPS – Virtual Private Server, tạm dịch là máy chủ ảo riêng tư. “Riêng tư” trong trường hợp này ám chỉ nó là một chiếc máy hoạt động độc lập, không chung đụng với ai, nếu bạn sở hữu nó, bạn có toàn quyền bật, tắt, cài cắm thêm phần mềm, v.v mà không ảnh hưởng tới ai, không ai cấm bạn, bạn có toàn quyền sử dụng, toàn quyền quyết định định mệnh của nó, giống như bạn sở hữu một chiếc máy tính cá nhân.
Về cơ bản VPS là một chiếc máy tính ảo – tuy không có thật, nhưng vẫn có đầy đủ các thông số cấu hình như RAM, CPU, dung lượng ổ cứng,… và cũng có hệ điều hành không khác gì một chiếc máy tính thật.
Khi bạn sở hữu một VPS, cũng giống như bạn sở hữu một chiếc máy tính bình thường. Tuy nhiên không ai sử VPS về để làm các công việc như một máy tính thông thường cả, thay vào đó VPS thường được sử dụng để làm các máy chủ web, máy chủ database,…
Để có kết nối, điều khiển, sử dụng VPS người ta thường sử dụng giao thức ssh để truy cập vào VPS. Sau khi truy cập thành công, mọi thao tác với VPS như cài đặt thêm phần mềm, copy file, tạo thư mục,v.v sẽ được thực hiện thông qua command line thay vì sử dụng giao diện GUI như trên một chiếc máy tính bình thường.
Để sở hữu một VPS, thường thì bạn sẽ phải mua của một bên thứ 3 như digitalocean.com, vultr.com,vv chứ ít ai (hoặc không ai) tự mình tạo ra một VPS rồi sử dụng cả – trừ khi chính bạn cũng là nhà cung cấp. Chi phí để trả cho một VPS cũng có nhiều mức giá khác nhau, có thể chỉ từ vài đô cho tới cả nghìn đô mỗi tháng.
Để có thể sử dụng được VPS, đòi hỏi bạn cần có một chút kiến thức về các giao thức mạng như ssh, biết cách thao tác với command line, am hiểu về một số hệ điều hành thường dành cho máy chủ như linux.
Cũng giống như mình đã trình bày ở mục VPS là gì, thì VPS giống như một máy tính “riêng”, vì vậy mà nó có tính riêng tư cao, ít bị phụ thuộc vào các yếu tố khác.
Hosting
Hosting thì độ riêng thấp hơn, về cơ bản hosting có thể được tạo ra từ một VPS, và một VPS có thể tạo ra nhiều hosting. Như vậy nếu VPS bị tắt hoặc gặp sự cố thì toàn bộ các hosting cũng sẽ bị ảnh hưởng. Ngoài ra, hosting là môi trường được cài đặt sẵn nên sẽ rất hạn chế nếu bạn muốn bổ sung thêm các thành phần khác, thường thì các nhà cung cấp sẽ chỉ cho bạn tùy biến một số thành phần quen thuộc.
Ví dụ, website của mình chạy tốt trên php 7.4, tuy nhiên hosting chỉ được cài sẵn php 7.2, và đương nhiên mình sẽ không thể tự nâng php từ 7.2 lên php 7.4 được mà phải đợi nhà cung cấp họ nâng giúp. Hay website của mình có sử dụng Redis để làm cache, tuy nhiên hosting thì không hỗ trợ Redis,…
VPS vs Hosting
3.2 Tính dễ sử dụng
VPS
Đương nhiên VPS sẽ khó sử dụng hơn. Vì VPS là của riêng bạn, nên mọi thao tác cài đặt môi trường, cấu hình an toàn thông tin,… đều phải do bạn tự làm, vì thế mà bạn cần phải có khá nhiều kiến thức.
Hosting
Hosting thì lại dễ sủ dụng hơn, vì mọi thứ đã được cài đặt sẵn, bạn chỉ cần đưa source code của mình lên, cấu hình một số thông tin nho nhỏ là có thể chạy được. Hosting có thể được sử dụng bởi một người ít am hiểu về máy tính, mạng mẽo,…
Mình quen khá nhiều các anh chị chỉ làm marketing, SEO, content nhưng cũng sử dụng hosting vô cùng rành rọt.
À mà hosting có dễ sử dụng hay không còn phụ thuộc một phần vào nhà cung cấp, nếu họ cho bạn một công cụ quản lý trực quan thì sử dụng sẽ dễ dàng hơn, còn không sẽ ngược lại. Nhưng thường thì hosting sẽ rất rễ sử dụng.
Chí phí cho một hosting cũng rẻ hơn so với VPS rất nhiều.
3.3 Khi nào sử dụng hosting, khi nào sử dụng VPS
Sự khác nhau cơ bản nhất giữa hosting và VPS nằm ở tính riêng tư. Nếu sản phẩm của bạn cần một môi trường ổn định, dễ dàng tùy biến theo ý bạn, thì VPS là lựa chọn bắt buộc. Ngược lại bạn có thể chọn hosting.
Xét trên một số sản phẩm cụ thể thì:
Hosting: website blog cá nhân, website bán hàng cho shop nhỏ, website giới thiệu doanh nghiệp.
VPS: website tin tức lớn, website bán hàng lớn, website mang các business phức tạp, máy chủ lưu trữ dữ liệu.
V. Tổng kết
Tổng kết lại thì có một số ý quan trọng như sau:
VPS: là một máy tính ảo, của riêng bạn. Để sử dụng được thì cần nhiều kiến thức về mạng, về máy tính, về hệ điều hành cho máy chủ. Phù hợp với những sản phẩm phức tạp.
Hosting: là một môi trường được cài đặt sẵn, khả năng tùy biến thấp nhưng lại dễ sử dụng. Phù hợp với những sản phẩm nhỏ, đơn giản.
Hy vọng với bài viết ngắn gọn này sẽ giúp các bạn hiểu rõ hosting là gì và VPS là gì.
Chúng ta đã từng nghe hoặc ít nhất từng chơi một trong những trò chơi phổ biến kinh điển này: Snake (con rắn), Flappy bird, Pac man, Tetris hoặc các trò chơi dân gian như cờ vua, Cờ Ca rô, Oẳn tù tì … Nhưng bạn có biết những trò chơi này được viết bằng Python không?
1. Snake (Con rắn)
Snake là một trò chơi vui nhộn cổ điển, trong đó bạn có được một con rắn trên một hộp lưới bảng. Bạn cho nó ăn, và mỗi lần con rắn của bạn ăn, nó sẽ dài ra một đoạn. Tránh những viên thuốc độc hoặc bất kỳ chướng ngại vật nào có thể giết chết nó. Giới hạn các bức tường ranh giới của bạn hoặc sử dụng chúng làm kích thước, như trong điện thoại di động Nokia. Một trò chơi thú vị mà bạn có thể thực hiện bằng cách sử dụng mã Python.
Phát triển trò chơi Snake trong python rất đơn giản. Và mọi thứ còn trở nên dễ dàng hơn với thư viện Pygame. Sử dụng kiến thức cơ bản Snake của bạn để tạo màn hình, rắn, thức ăn và chức năng tăng chiều dài. Cuối cùng, hiển thị thông báo Game Over khi con rắn va chạm vào phần cơ thể của nó.
2. Tetris (Xếp gạch)
Tetris (xếp gach) là một trò chơi ghép hình vui có thể được tạo bằng mã Python. Nó bắt đầu với một hộp rỗng và các hình dạng ngẫu nhiên rơi xuống theo chiều dọc. Cố gắng không làm lộn xộn các hình dạng và để chúng chạm vào đường viền tối đa. Nếu nó xảy ra, bạn sẽ thua! Tập trung vào từng hình dạng và đặt chúng sao cho vừa vặn và tạo thành một hàng ngang hoàn hảo. Các hàng hoàn hảo sẽ biến mất và bạn nhận được điểm. Hãy ghi điểm cao nhất có thể!
Việc xây dựng trò chơi Tetris hơi khó đối với người mới bắt đầu. Phần khó nhất trong việc tạo ra trò chơi này là quản lý các phần xoay. Vì mỗi mã màu sẽ xoay cùng với chuyển động, bạn phải liên kết các màu với các con số. Theo cách đó, một số đề cập đến một màu cụ thể và nó giống như các tập hợp con ([1, 5, 9, 13]). Hoặc bạn có thể tạo của riêng bạn (điều này sẽ rất nặng nề) hoặc tìm kiếm một nơi nào đó trên internet để sao chép phần này. Và viết phần còn lại của phần mã hóa của riêng bạn. Bằng cách này, bạn có thể tận dụng tối đa python. Không cần phải nói, thư viện Pygame chắc chắn sẽ đóng một vai trò lớn trong việc học lập trình…
3. Space Invader ( Kẻ xâm lược không gian)
Space Invader là một trò chơi arcade (chơi bằng tiền xu bỏ vào máy game). Bằng lập trình python, trò chơi này có thể được thực hiện từ đầu. Trong trò chơi này, bạn sẽ thực hiện một nhiệm vụ ngoài không gian. Trên đường đi của bạn, một số máy bay phản lực xâm lược tấn công máy bay của bạn, hãy né tránh chúng! Đối mặt với các cuộc tấn công của chúng và tiến lên phía trước. Hoàn thành tất cả các giai đoạn, mỗi giai đoạn tiếp theo sẽ nâng cao mức độ khó khăn.
Để bắt đầu xây dựng một trò chơi kẻ xâm lược không gian, bạn sẽ cần cài đặt thư viện Pygame. Sau đó, hãy thiết lập những việc quan trọng như tạo màn hình, Alien-ship tàu vũ trụ (để chúng từ từ rơi xuống từ trên cao). Và thiết kế anh hùng chính của bạn phải khác về ngoại hình, kích thước so với người ngoài hành tinh và đặt nó ở giữa dưới cùng của màn hình. Đối với lửa, hãy sử dụng các chấm di chuyển lên trên. Khi nó va vào một con tàu, con tàu sẽ biến mất.
4. Pac-man
Pac-man – một trò chơi nổi tiếng từ thập niên 80, thậm chí còn được Hollywoood làm phim, là một trò chơi thú vị khác trong danh sách mà python có thể thực hiện. Bạn sẽ nhận được một hộp hình vuông chứa đầy các hạt nhỏ xung quanh. Trên hộp, sẽ có các dòng ngẫu nhiên như đường hầm mở để nhân vật của bạn đi bộ. Ăn nhiều nhất có thể, đồng thời tránh chạm vào kẻ thù sẽ ở đó sau bạn. Bạn chạm vào, bạn thua! Xây dựng các giai đoạn khác nhau để tăng thêm niềm vui!
Để bắt đầu xây dựng trò chơi Pac-man, bạn sẽ phải tạo một mê cung nơi bạn có thể di chuyển anh hùng của mình – A-squared 800, 600, một chiếc hộp sẽ hoạt động tốt cho việc này. Sau đó, chúng ta cần tạo ra những vật thể quan trọng như Mê cung, những con ma để ăn nhân vật chính của chúng ta, Quả bóng để Anh hùng của chúng ta ăn chúng và một số món tăng sức mạnh để ăn những con ma đó! Cuối cùng, thành thật mà nói, ở đây, việc tạo ra trò chơi này không dễ dàng như người ta vẫn tưởng. Phần khó nhất ở đây là lập trình những con ma để đuổi theo Hero.
5. Sudoku (Điền số)
Sudoku là một loại trò chơi giải đố cũng được viết hoàn toàn bằng Python. Về cơ bản, đây là một trò chơi dựa trên số nhiều người chơi, trong đó mỗi người chơi cố gắng ghi điểm cao hơn đối thủ bằng cách liệt kê các số trên lưới hoặc thứ gì đó tương tự như thế này. Trò chơi đòi hỏi bạn phải suy luận, điền chữ số thích hợp từ 1-9 vào ô trống sao cho hàng ngang, hàng dọc và khung 9 ô không bị trùng chữ số, bạn giải đố nhanh hơn đối thủ bạn sẽ thắng. Tăng độ khó bằng cách tạo ô trống nhiều hơn.
Điều đầu tiên, nó giống như một trò chơi giải đố có thuật toán riêng. Điều này có nghĩa là tất cả những gì bạn phải trải qua là Thuật toán của nó; để biết cách thức hoạt động và cách xáo trộn chúng để tăng độ khó.
Giả sử như này, bạn sẽ lập trình sau khi đã có thuật toán của trò chơi này. Sau đó, hãy tiếp tục, cố gắng đưa tất cả chúng vào Pycharm IDE của bạn. Bạn có thể thực hiện điều này mà không cần sử dụng bất kỳ thư viện GUI python nào.
Bootstrap css chắc không xa lạ với các web developer, nhưng mình thấy có rất nhiều bạn sử dụng Bootstrap sai cách trong các dự án web. Tại sao mình lại nói vậy, thì các bạn hãy theo dõi bài viết này nhé.
I. Không nên tích hợp bằng cách Download.zip
Trong thực tế khi làm việc với Bootstrap, chúng ta thường hay tùy biến lại những styles mặc định mà Bootstrap cung cấp như màu sắc, box-shadow, border,… Thế nhưng khi tích hợp Bootstrap vào dự án, nhiều bạn lại chọn cách download file .zip chứa các file css, js – là những file đã được compile và không có khả năng tùy biến cao.
Khi tích hợp Bootstrap theo cách này, mà muốn tùy biến lại css thì mình thấy các bạn hay làm là viết các css muốn ghi đè vào một file là custom.css, sau đó cho file này load sau các css của Bootstrap. Nghe thì cũng hợp lý đấy, nhưng cách này có một số nhược điểm như sau:
Khó có thể override được hết các thuộc tính css của Bootstrap: Quả đúng như vậy, mình lấy ví dụ trong trường hợp bạn muốn đổi màu primary của Bootstrap chẳng hạn. Mặc định màu primary của Bootstrap có tông màu xanh da trời, và tông màu này được áp dụng ở rất nhiều chỗ như border, button, text, background… Nếu bạn muốn đổi màu primary này đồng nghĩa bạn phải ghi đè hết styles của các class về border, button, text, background,… Chỉ cần bỏ sót một class thì coi như bạn thất bại.
CSS bị thừa – phí tài nguyên: Khi ghi đè, kết quả bạn sẽ thấy css của mình. Nhưng trước đó trình duyệt vẫn phải load các css của Bootstrap, điều này gây lãng phí tài nguyên máy chủ cho một lý do không đáng có.
Không sử hết các components: Bootstrap dựng sẵn cho mình cả một bầu trời components, thế nhưng chẳng bao giờ mình dùng hết cả. Những component như well, jumbotron rất ít khi dùng, vậy mà vẫn được load trong css của bootstrap – khá thừa thãi.
Không biết bạn có để ý không, chứ ngoài việc cung cấp các file css đã được compile, Bootstrap còn cung cấp cả những file scss. Nếu muốn tùy biến styles, chúng ta nên tùy biến trong những file scss này.
Về công cụ compile từ scss ra css, mình sẽ sử dụng Laravel Mix cho gần gũi. Bạn nên đọc 2 bài viết của mình dưới đây nếu chưa hiểu scss là gì cũng như chưa biết cách sử dụng Laravel Mix để compile scss ra css.
Cách 2: Dùng component nào thì thì import component đấy.
Bạn mở file src/app.scss, xóa hết nội dung và thay thế bằng:
// Bắt buộc phải import những file này
@import "../node_modules/bootstrap/scss/functions";
@import "../node_modules/bootstrap/scss/variables";
@import "../node_modules/bootstrap/scss/mixins";
// Những components bạn cần
// Bạn có thể xem danh sách các components
// ở trong file 'node_modules/bootstrap/scss/bootstrap.scss'
@import "../node_modules/bootstrap/scss/reboot";
@import "../node_modules/bootstrap/scss/type";
@import "../node_modules/bootstrap/scss/images";
@import "../node_modules/bootstrap/scss/code";
@import "../node_modules/bootstrap/scss/grid";
Ở đây, mình sẽ chọn Cách 2 để tăng khả năng tùy biến.
Không chỉ cho phép tùy biến các components, Bootstrap còn cho bạn tùy biến các thông số về màu sắc, khoảng cách giữa các col, kích thước xs, sm, md, lg,… thông qua giá trị của các biến.
Để xem chi tiết Bootstrap có những biến nào, mỗi biến mang ý nghĩa là gì bạn có xem trong file node_modules/bootstrap/scss/variables.
Để chỉnh sửa các biến, bạn chỉ cần override chúng trước khi import những file scss của Bootstrap là được. Trong ví dụ sau đây, mình sẽ override lại màu nền, mà màu chữ thông qua 2 biến là $body-bg và $body-color.
// Các biến cần ghi đè
$body-bg: #000;
$body-color: #111;
// Import scss của Bootstrap
@import "../node_modules/bootstrap/scss/bootstrap";
Bước 3: Compile thôi.
Bạn chạy:
npm run watch
Hoặc chạy command sau trong trường hợp command trên không hoạt động với hệ điều hành của bạn:
npm run watch-poll
Toàn bộ scss của Bootstrap sẽ được compile ra dist/app.css – rất cùng gọn gàng và sạch sẽ.
III. Kết luận
Mình làm việc với Bootstrap được một thời gian khá dài rồi mới phát hiện ra cách làm này. Do khi vào trang chủ của Bootstrap, là nó gợi ý ngay một nút Download to tướng, thế là mình chỉ biết đường tải .zip về rồi dùng thôi, mãi về sau tự đặt ra câu hỏi “Làm sao để tùy biến lại css của bootstrap hiệu quả hơn” thì mới chịu tìm tòi thêm.
Bài viết được viết dựa trên kinh nghiệm cá nhân. Rất mong nhận được góp ý từ các bạn.
Chào tạm biệt, hẹn gặp lại trong những bài viết sau.
Ta có 1 tin nhắn với 2 cách log là ghi ra file và show ra màn hình mỗi cách lại được thực hiện làm 2 kiểu là thực hiện với kết quả là text rõ hoặc text đã được mã hóa.
Message: là 1 lớp trừu tượng khai báo chức năng log
MessageLogger: là 1 interface thực thi chức năng log của Message
ConsoleLogger: thừa kế MessageLogger, có chức năng show message ra console
FileLogger: thừa kế MessageLogger, có chức năng ghi message vào file
TextMessage và EncryptedMessage: thừa kế Message, quyết định xem việc log tin nhắn là text rõ hoặc text đã được mã hóa.
publicclass MainApp {publicstaticvoidmain(String[] args){ // chọn log kiểu show ra console MessageLogger messageLogger = newConsoleLogger(); // chọn cách thức hiển thị kiểu mã hóa Message message1 = newEncryptedMessage(messageLogger); // chọn cách thức hiển thị kiểu text rõ Message message2 = newTextMessage(messageLogger); // thực thi phương thức log message1.log("stackjava.com"); message2.log("stackjava.com");}}
Bài viết được sự cho phép của BBT Tạp chí lập trình
Có rất nhiều các loại chứng chỉ tester dành cho các kiểm thử viên từ nghiệp dư đến chuyên nghiệp. Các chứng chỉ này sẽ hỗ trợ người kiểm thử ở từng cấp độ để nắm vững các kiến thức chuyên sâu trong lĩnh vực này.
Bài viết này xin giới thiệu các loại chứng chỉ mà một kiểm thử viên có thể học để cải thiện kiến thức và kỹ năng của mình trên hành trình sự nghiệp
Chứng chỉ ISTQB
ISTQB là chứng chỉ kiểm thử phần mềm hàng đầu. ISTQB có rất nhiều level thi, bạn nên có ít nhất 1 hoặc 2 loại chứng chỉ này.
ISTQB–Foundation Level: Cung cấp kiến thức nền tảng và những kỹ năng cần thiết về kiểm thử phần mềm, thiết kế test case, estimation, quản lý trong kiểm thử phần mềm.
ISTQB- Advanced Level: Mức độ nâng cao với 3 chứng chỉ riêng biệt, bạn có thể chọn 1 trong 3 chứng chỉ để thi.
ISTQB Test Analyst: Dành cho các tester chuyên kiểm tra functional test với các kỹ thuật thiết kế test case và coverage nâng cao.
ISTQB Test Manager: Dành cho người quản lý test, cải tiến quy trình test và kiểm soát hoạt động test.
ISTQB Advanced Technical Test Analyst: Dành cho tester chuyên kiểm thử về structure test và non-functional test.
Chứng chỉ ISTQB Foundation Level (CTFL) dành cho bất kỳ ai quan tâm đến việc thể hiện kiến thức cơ bản về kiểm thử phần mềm. Bao gồm các loại kiểm thử phần mềm, lập kế hoạch và thiết kế kiểm thử, quản lý lỗi và đánh giá rủi ro của dự án và sản phẩm.
Chứng nhận này phù hợp để đóng góp các vai trò nền tảng trong thử nghiệm, chẳng hạn như người thử nghiệm, nhà phân tích thử nghiệm và chuyên gia tư vấn thử nghiệm. Không có tiêu chí đủ điều kiện cho chứng chỉ ISTQB Foundation Level (CTFL).
Kiểm thử nhanh là một cách tiếp cận mới hơn đối với kiểm thử phần mềm đang được ưa chuộng gần đây. Nó dựa trên phương pháp phát triển phần mềm Agile. Chứng nhận này dành cho:
Tester quan tâm đến kiểm thử Agile.
Tester có kinh nghiệm trong các cách tiếp cận truyền thống để phát triển phần mềm.
Các nhà phát triển chuyên nghiệp gắn liền với các dự án Agile với kiến thức cơ bản về kiểm thử.
Chứng chỉ ISTQB Agile Tester là một phần bổ sung cho chứng chỉ ISTQB Foundation Level (CTFL). Điều này có nghĩa là các ứng viên quan tâm trước tiên phải có chứng chỉ ISTQB Foundation Level (CTFL) hợp lệ để đăng ký chứng chỉ ISTQB Agile Tester.
Chứng chỉ tester CAST
CAST là chứng chỉ tester quốc tế được cung cấp bởi Viện Đảm bảo Chất lượng tại Hoa Kỳ cho những người có từ 3 đến 4 năm kinh nghiệm trong ngành công nghệ thông tin hoặc đại học và những ứng viên học 2 năm đại học với 1 năm kinh nghiệm.
Đây sẽ là chứng chỉ phù hợp cho những ai đang theo học lập trình nhưng muốn học hỏi thêm về kiểm thử phần mềm để hỗ trợ cho các dự án của mình. Kỳ thi lấy chứng chỉ CAST được tổ chức tại Trung tâm Khảo thí Pearson VUE. Sau khi đơn đăng ký được gửi thành công cho CAST, ứng viên sẽ nhận được một bản PDF 367 trang có tên là Cơ quan kiểm tra kiến thức phần mềm (STBOK) cho CAST.
Chứng chỉ Tester CSTE
Chứng nhận Certified Software Testing Engineer được sử dụng để chứng nhận đảm bảo năng lực ở cấp độ chuyên nghiệp về các nguyên tắc và thực hành kiểm soát chất lượng. Đây được xem là chứng chỉ tốt nhất để bất kỳ ai yêu thích lĩnh vực lập trình thử sức ở vị trí kiểm thử viên.
Để đạt đủ điều kiện đăng ký chứng chỉ CSTE ứng viên phải làm việc trong lĩnh vực kiểm thử phần mềm trong vòng 18 tháng trước khi đăng ký và phải sở hữu bằng đại học cùng 2 năm kinh nghiệm trong lĩnh vực CNTT.
Chứng chỉ Tester CMST
Đây là chứng chỉ toàn cầu phù hợp với vị trí quản lý cấp cao. Ngoài việc đảm bảo rằng người được cấp chứng chỉ có năng lực ở cấp độ làm việc trong các nguyên tắc và thực tiễn của kiểm thử phần mềm, CMST cũng chứng minh rằng người được cấp chứng chỉ có bộ kỹ năng để quản lý các dự án kiểm thử phần mềm.
Để sở hữu chứng chỉ này, ứng viên phải đáp ứng các yêu cầu như sau:
Sở hữu bằng cử nhân và có 4 năm kinh nghiệm trong lĩnh vực kiểm thử phần mềm.
Bằng cao đẳng hoặc 6 năm kinh nghiệm kiểm thử phần mềm
Có 8 năm kinh nghiệm làm việc trong lĩnh vực kiểm thử phần mềm
Để chuẩn bị cho bài kiểm tra, các ứng viên đủ điều kiện nhận được giáo trình 609 trang cho CMST (STBOK) PDF. Kỳ thi có hai bài thi, với thời gian nghỉ 10 phút, đánh giá kiến thức và kinh nghiệm của thí sinh trong 4 lĩnh vực sau:
Quản lý kiểm tra
Phân tích thử nghiệm
Lập kế hoạch và Thực thi Kiểm tra
Truyền thông và các mối quan hệ
Tùy theo công việc và các doanh nghiệp các Tester đang làm yêu cầu để các bạn lựa chọn thi các chứng chỉ cần có, không nhất thiết phải thi toàn bộ các chứng chỉ này.
Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh
1. Uống cà phê. Cà phê giúp bạn tỉnh táo trong một ngày dài. (Đây là ý kiến cá nhân)
2. Hãy giải quyết vấn đề của bug đúng cách. Đừng fix bug theo kiểu bưng vá. Nó sẽ phản tác dụng với bạn.
3. Commit code của bạn theo định kỳ và push code của bạn ít nhất một lần trong 2 ngày. Đừng để code dưới máy của bạn quá nhiều. Bạn không bao giờ biết khi nào máy tính bị hỏng đâu.
4. Đừng đặt tên biến quá ngắn. Sẽ là một cơn ác mộng khi bạn đọc lại code của bạn sau vài tháng.
5. Hãy luôn thêm comment vào code khi có thể.
Tài liệu luôn cập nhật với code. Sử dụng các cách viết tài liệu trực tiếp trong code, ví dụ /** Javadocs comments */
7. Đặt tất cả các biến static ra bên ngoài hàm. Nó sẽ giúp bạn dễ dàng hơn trong việc quản lý biến static.
8. Luôn luôn viết unit test với độ phủ 95%. Điều này giúp bạn biết được những thay đổi nhỏ của code có làm hỏng phần mềm không.
9. Cấu hình linters trong IDE của bạn, nó sẽ giúp code của bạn sạch hơn.
10. Luôn có code-style chung cho dự án của bạn.
11. Khi nghi ngờ, hãy luôn hỏi. Bạn không bao giờ biết những gì những người khác trong nhóm của bạn biết. Đừng bao giờ đánh giá thấp bất kỳ ai.
12. Liên quan đến điểm trên: Đừng hỏi những câu hỏi ngu ngốc. Tra cứu nó trên google trước khi bạn hỏi những người xung quanh. Rất có thể ai đó đã từng có câu hỏi tương tự trước đây và đã hỏi trên internet.
Đừng chỉ viết code trong các case đúng, hãy thử các case có khả năng sinh lỗi. Hãy viết test cẩn thận.
14. Khi các thành viên trong team bạn có câu hỏi, hãy giúp họ. Bạn không biết được bao giờ bạn cần sự giúp đỡ từ họ đâu.
Cuối cùng nhưng không kém phần… Đừng ngần ngại học các công nghệ mới. Ra khỏi vùng an toàn của bạn đi. Đó là cách bạn tồn tại trong ngành công nghiệp phần mềm.
Điều quan trọng nhất trong tất cả.
Khi có lỗi hãy thử khởi động lại máy tính của bạn xem. Biết đâu nó fix bug đấy.
Ngày xưa lúc mới học lập trình, thì cứ vài hôm mình lại thay đổi phong cách code một lần. Lúc thì đặt tên biến kiểu ten_bien, lúc thì đặt kiểu tenbien, lúc thì tenBien,… đến lúc hoàn thành dự án, mặc dù code chạy không sai đọc lại thấy ngu không tả nổi, cảm giác cứ như nhìn vào tờ giấy nháp vậy.
Mình đặt ra câu hỏi “Làm một mình còn code khuyết tật thế này, thế làm team thì sao, chẳng lẽ lại mạnh ai người ý code à?”. Không, không thể nào như vậy được, mình cho rằng phải có một quy ước chung nào đó. Thế là mình thử lên mạng tìm hiểu xem, thì thấy có khái niệm về coding convention giải quyết được vấn đề mình gặp phải.
I. CODING CONVENTION LÀ GÌ?
Coding convention dịch ra Tiếng Việt là quy ước coding. Hiểu nôm na nó là một tập hợp các quy ước về phong cách code, cách đặt tên biến, tên hàm, tên file,… để các coder tuân theo.
Coding convention sẽ đem lại lợi ích nhiều hơn khi bạn làm việc nhóm. Hãy tưởng tượng nhóm 5 người và cùng tuân theo một phong cách code, thì khi người này đọc code của người kia sẽ dễ hiểu hơn, không cảm thấy “ngứa mắt” hay muốn đánh đồng nghiệp.
Ý kiến cá nhân: Code không có convention là dấu hiệu thất bại đầu tiên khi làm phần mềm.
Ngay cả khi bạn làm một mình, thì tuân theo coding convention cũng vẫn rất quan trọng. Những dòng code chuẩn chỉ sẽ khiến bạn có hứng thú đọc hơn là những dòng code xiên xẹo đúng không.
Coding convention nói chung rất rộng, tùy vào ngôn ngữ lập trình, tùy vào team mà có thể có coding convention khác nhau. Còn với PSR, nó là coding convention được áp dụng phổ biến nhất khi code PHP.
PSR là viết tắt của PHP Standards Recommendations – khuyến nghị về tiêu chuẩn của PHP.
Bạn có thể tìm hiểu chi tiết về PSR tại trang chủ chính thức https://www.php-fig.org, còn trong bài viết này mình sẽ tóm tắt một số ý cơ bản về PSR.
Tính đến thời điểm hiện tại, PSR có tất cả 12 chuẩn (bao gồm cả các chuẩn đã lỗi thời), chia làm 4 nhóm:
STT
Nhóm
Mô tả
Phiên bản PSR
1
Autoloading
Quy ước về cách code để có thể sử dụng namespace dễ dàng
Trong các nhóm kể trên, mình muốn nhấn mạnh vào nhóm Coding styles nhất, bởi đây chính là nhóm quy định về phong cách code, cách đặt tên biến, tên hàm, tên class,… cũng chính là nội dung mà mình muốn đề cập tới trong bài viết này. Các nhóm còn lại sẽ ít sử dụng hơn, sử dụng chủ yếu khi bạn có ý định code các thư viện hay framework cho PHP.
Tính đến thời điểm mình viết bài này, PSR-1 và PSR-12 là 2 chuẩn được sử dụng cho coding styles.
Bạn cũng có thể nghe thấy đâu đó người ta nhắc về chuẩn PSR-2 nữa, nhưng PSR-2 đã được đánh dấu là “lỗi thời” trên trang chủ của https://www.php-fig.org. Không tin thì bạn có thể đọc tại đây: https://www.php-fig.org/psr/psr-2. PSR-2 giờ đây được thay thế bằng PSR-12.
3.1 Tìm hiểu về PSR-1
3.1.1 Đối với file PHP
Nguyên tắc 1: File PHP chỉ được phép sử dụng <?php và <?=. <?php được sử dụng để mở đầu cho code PHP, và <?= là cú pháp short-echo (thay vì code là <?php echo $a ?>, bạn có thể code là <?= $a ?>)
Nguyên tắc 2: File code PHP sử dụng encode UTF-8 without BOM.
Nguyên tắc 3: File PHP NÊN dùng để khai báo các thành phần của PHP (class, function, const) và các hiệu ứng phụ (include, thiết lập init PHP), nhưng KHÔNG NÊN dùng cả hai trong một file. Để hiểu rõ hơn nguyên tắc này, bạn hãy xem ví dụ sau
Không nên code thế này
<?php
// hiệu ứng phụ: đổi thiết lập ini
ini_set('error_reporting', E_ALL);
// hiệu ứng phụ: nạp file vào
include "file.php";
// hiệu ứng phụ: xuất dữ liệu
echo "<html>\n";
// khai báo hàm
function foo()
{
// function body
}
Đoạn code trên bao gồm cả việc khai báo các hiệu ứng phụ (init_set, include) và cả việc khai báo thành phần của PHP (function foo). Chúng ta KHÔNG NÊN code như vậy. Thay vào đó, hãy tách chúng ra làm 2 file.
functions.php
<?php
// functions.php
// khai báo hàm
function foo()
{
// function body
}
index.php
<?php
// index.php
// hiệu ứng phụ: đổi thiết lập ini
ini_set('error_reporting', E_ALL);
// hiệu ứng phụ: nạp file vào
include "file.php";
include "functions.php";
// hiệu ứng phụ: xuất dữ liệu
echo "<html>\n";
3.1.2 Đối với khai báo namespace và class
Nguyên tắc 1: namespace và class phải thuân theo chuẩn “autoload” PSR-0, PSR-4.
Mỗi class được khai báo trên một file PHP riêng và có namespace tối thiểu một cấp, cấp đầu tiên là tên vendor (tên đơn vị phát hành)
Tên class PHẢI được viết dạng ClassName thay vì classname, Classname, class_name hay Class_Name
Từ PHP 5.3, PHẢI sử dụng namespace khi khai báo class.
KHÔNG ĐƯỢC code thế này.
<?php
class Classname
{
//
}
Mà PHẢI code thế này
<?php
namespace Vendor;
class ClassName
{
//
}
Từ phiên bản PHP 5.2.x trở về trước. bạn có thể code thế này, nhưng giờ ai còn code trên PHP 5 nữa đâu chứ đừng nói là PHP 5.2.x.
<?php
class Vendor_ClassName
{
///
}
3.1.3 Hằng, thuộc tính và phương thức của class
Quy tắc 1: Hằng khai báo trong class phải được viết hoa và ngăn cách bằng dấu gạch dưới.
<?php
namespace Vendor\Model;
class Foo
{
const VERSION = '1.0';
const DATE_APPROVED = '2012-06-01';
}
Quy tắc 2: Thuộc tính khai báo trong class có thể viết ở dạng $ten_thuoc_tinh, $TenThuocTinh hoặc $tenThuocTinh. Nhưng nếu bạn chọn một kiểu rồi thì phải thống nhất về cách code trong một phạm vi nào đó, như phạm vi trong class, trong package hoặc trong vendor.
Ý kiến cá nhân: Nên chọn $tenThuocTinh
Quy tắc 3: Tên phương thực phải được đặt ở dang tenPhuongThuc()
<?php
namespace Vendor\Model;
class Foo
{
public function methodName()
{
//
}
}
3.2 Tìm hiểu về PSR-12
Các quy tắc về PSR-12 khá dài, nên mình có hẳn một bài viết để trình bày riêng tại đây:
Code không chỉ code một lần là xong, code xong có khi còn phải sửa lên sửa xuống. Mà khi sửa, có khi còn là sửa code của người khác chứ chẳng được sửa code của mình. Để không tạo ra sự lạ lẫm, khó chịu khi người khác đọc một đoạn code không phải do mình viết ra thì cách tốt nhất là áp dụng coding convention ngay từ đầu.
Áp dụng chuẩn coding convention là bước đầu tiên thể hiện bạn đang dần trở nên chuyên nghiệp hơn.
Một bài viết ngắn chia kiến thức của mình về coding convention. Hẹn gặp lại các bạn trong những bài viết kế tiếp.
Bài viết được sự cho phép của tác giả Trần Anh Tuấn
Xin chào các bạn. Lâu ngày ẩn danh tu luyện nay mềnh đã trở lại. Và để bắt đầu sự trở lại này thì mình quyết định ra series chia sẻ kỹ năng và kinh nghiệm cắt PSD sang HTML toàn tập từ A-Z cho các bạn.
Phần này rất là dài nên mình sẽ chia ra nhiều phần(modules) để cho các bạn không bị rối loạn khi làm và học. Mình đã lên danh sách các check-list nên làm khi cắt PSD của mình bao gồm:
# Phân tích design
Khi các bạn nhận được design do ai yêu cầu hoặc các bạn làm bài test thực tập hoặc tập cắt PSD tải từ trên mạng về. Thì việc đầu tiên các bạn cần làm đó là phân tích nó. Vậy các bạn nên phân tích những gì?
Sau đây là check-list (việc cần làm) của mình khi phân tích một design mà mình đã học được từ lúc ra trường đến khi đi thực tập rồi đi làm. Các bạn có thể xem và tham khảo nhé. Đầu tiên là phải mở design lên (các bạn có thể dùng Photoshop hoặc AI).
Màu sắc: Các bạn cần tìm màu chủ đạo của design và các màu phụ như màu chữ, màu liên kết, màu nền(background)….
Fonts: Fonts thì các bạn chọn công cụ text(T) của Photoshop và chọn vào đoạn text nào đó(trong design) nó sẽ hiển thị ra cho bạn biết được font gì, kích thước bao nhiêu cho tiêu đề, các đoạn chữ, button, menu….
Sau khi tìm được fonts rồi các bạn có thể dùng Google fonts hoặc nếu trường hợp Google fonts không có fonts đó thì các bạn phải tìm và tải các file fonts dạng otf ttf woff rồi đưa vào thư mục fonts và css dẫn tới các file fonts là xong
Hình ảnh: Dùng Photoshop hoặc AI cắt ra thôi. Bài sau hướng dẫn cắt PSD mình sẽ chỉ cho các bạn nhé
Icons: Nếu icons nào mà font-awesome có thì dùng nếu icons nào mà font-awesome không có thì các bạn có thể dùng các icons tương tự trong font-awesome cũng được hoặc cắt nó thành 1 tấm hình nhỏ
Kích thước Design: Các bạn đo kích thước của design để biết nó rộng bao nhiêu 1200px 1600px hay 1920px… để làm cho đúng cũng như kích thước(width, height) của các block trong design như banner, top menu, about block,….
Spacing: Các bạn cần kiểm tra các khoảng cách margin, padding của các thành phần, khoảng cách giữa các đoạn text, line-height, canh giữa trái phải nữa để code ra cho đúng chuẩn nhá.
Sau khi các bạn đã đo kích thước, biết được fonts là gì, màu sắc ra sao, khoảng cách thế nào, hình ảnh, icons đã cắt ra hết. Thì việc tiếp theo các bạn cần làm đó là tạo cấu trúc thư mục đơn giản để chuẩn bị code.
Thư mục bao gồm 1 file index.html – 1 thư mục css (hoặc styles) chứa các files .css – 1 thư mục images để chứa hình ảnh – 1 thư mục fonts để chứa fonts. Nếu các bạn có code thêm Javascripts thì thêm một thư mục js nữa nhé.
Cấu trúc thư mục đơn giản của mình
Ngoài thư mục images và fonts ra thì thư mục css(styles) các bạn nên có file reset.css để reset các style mặc định của các thẻ ở các trình duyệt khác nhau. Và một file fontawesome.css để dùng fontawesome (nếu có) và cuối cùng style.css là file mà các bạn sẽ code vào trong đó.
Sau khi chúng ta tạo xong cấu trúc thư mục cơ bản rồi thì việc tiếp theo sẽ là dựng HTML cho từng phần (block) trong design. Thường thì chỗ này có người sẽ code hết HTML cho toàn bộ từ trên xuống dưới rồi CSS 1 lần.
Nhưng mình thì không. Mình làm theo từng block và tới block nào thì dựng HTML và CSS cho nó thậm chí làm responsive luôn cho dứt điểm rồi mới tới block khác. Các bạn lưu ý cái này tùy mỗi người nha.
Giả sử nhìn vào design ở trên thì mình sẽ tạo trong file index.html 1 block là menu với các thẻ HTML và class đặt tên theo chuẩn BEM (Block Element Modified). Mình sẽ nói về cách đặt tên ở bài sau khi chúng ta cắt một PSD luôn nhé.
Khi làm thì các bạn nên xác định là làm theo giao diện nào trước. Nghĩa là đoạn code CSS khi các bạn bắt đầu vào code nó chính là giao diện mobile hay là desktop.
Nếu là mobile thì CSS các bạn đang làm là dành cho mobile rồi sau đó các bạn dùng @media min-width cho các giao diện từ mobile trở lên(tablet, pc). Ngược lại nếu là desktop thì CSS các bạn đang làm chính là desktop và sau đó các bạn dùng @media max-width cho các thiết bị nhỏ hơn(tablet, mobile)
Đây là vấn đề các bạn nên cân nhắc khi làm nếu khách hàng hoặc công ty bạn yêu cầu dùng các trình duyệt cũ như IE thì chắc chắn các bạn không thể dùng CSS Grid hay CSS Flexbox vì nó sẽ không hỗ trợ trình duyệt IE. Các bạn phải dùng các thuộc tính CSS khác như float hay display inline block….
Vì thế trước khi làm thì nên tìm hiểu yêu cầu của họ là gì, nếu không cần IE mà chỉ cần Edge, Chrome hay Firefox và sau đó check Caniuse xem có hỗ trợ grid hay flexbox không ? Nếu có thì ngại gì mà không chiến cho lẹ nà.
# Testing
Đây là bước quan trọng cho dù làm ngôn ngữ nào hay công việc gì khác, thì công việc testing luôn quan trọng để cho ra một sản phẩm hoàn hảo không có lỗi.
Việc test giao diện thì đơn giản các bạn resize trình duyệt hoặc dùng giả lập giao diện thiết bị của Chrome để test xem ở các màn hình giao diện đã đẹp chưa(UI) và trải nghiệm có tốt không(UX) ?
Sau đó copy trang web qua trình duyệt khác như Firefox, Edge hay Safari Opera Coccoc…để test thêm nếu tất cả trình duyệt màn hình mà hiển thị như nhau hết thì quá ngon rồi. Nếu có lỗi ở trình duyệt nào thì tìm cách fix nhé. Google và Stackoverflow luôn chờ đợi bạn ^^
# Hoàn thành
Sau khi làm xong và testing đã hoàn chỉnh (bao gồm đã fix bug) thì công việc tiếp theo là đưa cho leader (làm trong công ty) kiểm tra hoặc up lên mạng (Github) để cho nhiều người khác họ có thể xem sản phẩm của bạn và nhận xét góp ý giúp bạn.
Những lời nhận xét góp ý sẽ giúp bạn lên trình rất nhiều vì có khi họ phát hiện ra nhiều lỗi mà bạn không biết hoặc góp ý về giao diện như UI không đẹp, cần cải thiện hiệu ứng, nút này dưới mobile nằm đây không đẹp, button ngắn quá…. Kiểu vậy.
Tuy nhiên các bạn nên chọn lọc các góp ý nhé rồi cải thiện chứ đừng thấy ai góp ý rồi cũng làm theo, mỗi người 1 ý không làm hài lòng hết được. Chỉ cần làm đúng design đẹp ít lỗi và hài lòng khách hàng là được vì họ là người trả tiền cho chúng ta mà hehe.
# Lời kết
Phù!!! Thế là xong phần chia sẻ ngắn gọn súc tích cho các bạn nà. Ở phần tiếp theo chúng ta sẽ cắt một PSD và áp dụng những thứ mình đã nói ở trên đây vào luôn để các bạn có thể hiểu và áp dụng thực tế nó như thế nào luôn.
Hãy nhấn nút icon nhận thông báo và đón chờ siêu phẩm nhá. Cuối cùng vẫn như mọi khi chúc các bạn học tốt và có một ngày tuyệt vời ông mặt trời =))
Bài viết được sự cho phép của tác giả Edward Thien Hoang
Solution Architect hay còn được gọi là Kiến trúc sư Giải pháp là một job title trong các công ty software.
Bài viết này nhằm cung cấp cho các bạn đang là software engineer một lộ trình để có thể up skill của mình lên vai trò mới là Solution Architect. Lưu ý bài viết chỉ mang tính chất tham khảo từ kinh nghiệm cá nhân của mình.
Trước tiên, định nghĩa về Solution Architect
Có rất nhiều role về Architect trong một doanh nghiệp bao gồm: Enterprise architects, Domain architects, Solution architects, Data architects, Technical architects, Security architects, Infrastructure architects, Application architects hoặc thậm chí là Cloud Architect như AWS Architect hoặc Azure architects, …
Bài viết này không nhằm mục đích là giải thích từng role architect ở trên, mà tập trung vào Solution architects.
Có thể hiểu Solution Architect là người chịu trách nhiệm xây dựng giải pháp cho một bài toán hoặc yêu cầu cụ thể từ phía khách hàng. Solution Architect thường chịu trách nhiệm thiết kế mô hình kiến trúc giải pháp và tập trung giải quyết các yêu cầu phi chức năng (non-functional requirements), chẳng hạn như bảo mật, hiệu suất và khả năng mở rộng (scalability).
Để hiểu rõ hơn về các công việc phải làm của 1 Solution Architect, bạn có thể đọc series bài viết SOLUTIONS ARCHITECT SERIES
Tuy nhiên trong thực tế, Solution Architect có thể đảm nhận luôn vai trò của các Architect khác ví dụ như thiết kế infrastructure, security, data trên nhiều nền tảng khác nhau như on-premise hoặc on Cloud.
Có 2 role Architect rất dễ nhầm lẫn với Solution Architect đó là Technical Architect và Application Architect.
Trong khi Solution Architect chịu trách nhiệm thiết kế giải pháp toàn diện về nhiều khía cạnh như đã nói ở trên, thì Technical Architect có kiến thức chuyên sâu về một nền tảng hoặc công nghệ và họ có kinh nghiệm thực tế. Họ thường coaching các Developer, DevOps engineer trong việc triển khai giải pháp bằng việc đi sâu vào chi tiết kỹ thuật trong bản thiết kế high-level của Solution Architect.
Application Architect tập trung vào việc xây dựng các tính năng mà được yêu cầu. Không giống như các kiến trúc sư khác, họ không quan tâm nhiều đến các yêu cầu phi chức năng. Vai trò của họ là áp dụng các best practices và các pattern để tạo ra các ứng dụng dễ bảo trì và dễ đọc.
Như đã đề cập, một Solution Architect cần phải có hiểu biết rất rộng về thiết kế hệ thống. Mô hình kiến thức họ áp dụng thường là T-shaped. Nghĩa là có chiều sâu về 1 hoặc vài lĩnh vực nào đó, và có chiều rộng về rất nhiều khía cạnh khác. Điều đó có nghĩa, con đường để trở thành Solution Architect không thể một sớm một chiều mà cần qua quá trình tôi luyện từ một developer bình thường đến một Technical Architect hoặc Application Architect để phát triển về chiều sâu trước.
Sau đó, để phát triển chiều ngang (rộng), có rất nhiều cách, và mình sẽ chia sẻ 1 số nguồn kiến thức để các bạn tham khảo.
Đầu tiên, hãy đọc sách để hiểu được một kiến trúc hoàn chỉnh cần có những thành phần nào cần chú ý khi thiết kế, và các công việc của 1 Solution Architect là gì. Mình khuyên đọc cuốn Solutions Architect’s Handbook được viết bởi Saurabh Shrivastava và Neelanjali Srivastav. Mình đã có 1 series tóm tắt cuốn sách ở đây: SOLUTIONS ARCHITECT SERIES
Tiếp theo là học các khái niệm, concept khi thiết kế một một hệ thống large scale gồm những thành phần gì. Bạn có thể tìm đọc về Software Architecture và System Design nó sẽ giúp bạn có thêm rất nhiều từ vựng trong việc thiết kế hệ thống sau này.
Sau đó hãy tìm đọc thêm các sách hoặc course nói về cách để thiết kế một hệ thống hoàn chỉnh. Ví dụ như: làm sao để thiết kế được ứng dụng chat như Whatsapp, thiết kế 1 sàn giao dịch chứng khoán như thế nào. Điều này sẽ giúp cho bạn có cái hình hands-on hơn từ những concept đã đọc ở phía trên. Có rất nhiều nguồn để tham khảo, chỉ cần Google với keyword: “System design” sẽ cho bạn nhiều kết quả. Mình recommend cuốn System Design Interview của Alex Xu.
Một xu hướng không thể không nhắc đến gần đây đó là Cloud Computing. Nói đến Cloud, chúng ta cũng cần có các vai trò như Cloud Developer, Cloud Architect, Cloud DevOps, Cloud Administrator… Rất nhiều doanh nghiệp đã và đang dịch chuyển lên Cloud. Cloud giúp cho việc hiện thực hóa các yêu cầu về phi chức năng trở nên dễ dàng hơn ví dụ như auto scaling, high availability, auto recovery, … nhưng cũng đặt ra nhiều thách thức hơn về chi phí, bảo mật và quản lý vận hành. Nếu bạn có ý định trở thành một Solution Architect thì hãy đi theo một nền tảng Cloud và trở thành một Cloud Architect. Có rất nhiều khóa học và chứng chỉ để giúp bạn thiết kế giải pháp trên Cloud ví dụ như: Exam AZ-305: Designing Microsoft Azure Infrastructure Solutions, AWS Certified Solutions Architect, …
Và cuối cùng, hãy tìm kiếm cơ hội được thử nghiệm và áp dụng kiến thức của mình vào các dự án thực tế.
Chúc bạn may mắn trên con đường trở thành một Solution Architect.
Các xu hướng trong năm 2022 đang thay đổi nhanh hơn mong đợi khi bước qua 2023. Trong thời đại digital, không còn ai theo đuổi những chiến lược marketing tốt nhất mà thay vào đó là đón đầu các xu hướng. Vậy 7 xu hướng mobile marketing được mong chờ sẽ xuất hiện trong năm 2023 là gì?
1. Chatbot
Chắc chắn người dùng Internet nào cũng đã tương tác với Chatbot ít nhất một lần. Chatbot về cơ bản là một chương trình máy tính mô phỏng cuộc trò chuyện với người dùng, có thể ở dạng văn bản, như chat trên website hoặc tương tác bằng lời, như Siri của Apple hay Alexa của Amazon.
Chatbot không phải là một công nghệ mới nhưng càng ngày nó càng thông minh và được cải tiến, được sử dụng nhiều hơn trong năm 2023. Nhiều kênh bán hàng sử dụng Facebook Messenger làm giao diện chatbot.
Theo Facebook, có hơn 300.000 bot trên Messenger để xử lý khoảng tám tỷ tin nhắn hàng tháng giữa doanh nghiệp và người tiêu dùng, và con số này chắc chắn còn tăng hơn nữa.
Tại sao Chatbot sẽ “làm nên chuyện”? Mỗi con bot được lập trình bài bản có thể trả lời câu hỏi, đặt chỗ, đặt hàng, huỷ dịch vụ hay thậm chí thu thập thông tin cá nhân theo từng mục đích sử dụng. Danh sách các chức năng của Chatbot còn tiếp tục phát triển, vì đây là giải pháp hàng đầu cho các khách hàng, nơi không chỉ là kênh tương tác với khách mà còn có thể tìm hiểu thêm về người tiêu dùng.
Cũng khá thuận tiện khi thực hiện các khảo sát người tiêu dùng một cách nhanh chóng, các số liệu dễ dàng được quản lý và không dẫn đến việc treo máy vì mọi thứ đều được tự động hoá. Vào năm 2023, bot sẽ cạnh tranh với app để tiếp cận khách hàng.
Kính thực tế ảo tăng cường (AR) ngày càng trở nên phổ biến. Sự thành công của Pokemon Go hoặc bộ lọc AR trong app nhắn tin của Snapchat và Instagram đã minh chứng cho khả năng ứng dụng mạnh mẽ của công nghệ này.
Các “ông lớn” trong giới công nghệ như Apple đã bắt đầu phát triển công nghệ AR vào các thiết bị thông minh của họ. Apple đã kết hợp với IKEA để tạo ra ứng dụng trưng bày đồ nội thất vào ngay trong nhà của người mua. Điều này giúp người dùng dễ dàng lựa chọn sản phẩm, tiết kiệm thời gian và mua sắm hiệu quả hơn.
Với xu hướng mới này, dự đoán năm 2023 sẽ có hàng loạt những ứng dụng sử dụng AR ra đời, giải quyết được nhiều vấn đề trong hàng loạt các lĩnh vực khác nhau.
3. 5G phát triển mạnh mẽ
5G sẽ nhanh chóng trở thành tiêu chuẩn công nghệ trên các thiết bị di động trong năm 2023 này. Sự ưu việt của 5G với độ trễ thấp, tốc độ đường truyền siêu nhanh và ổn định sẽ thúc đẩy việc tạo ra các ứng dụng chất lượng cao hơn.
Điều này kéo theo sự tăng trưởng trong lĩnh vực phát triển Mobile App từ việc tăng sản lượng, tăng người dùng và tăng số lượng nhà phát triển.
Theo một nghiên cứu của CSS, Trung Quốc sẽ tiếp tục dẫn đầu cuộc đua 5G với hơn một nửa dân số sử dụng 5G đến cuối năm 2023.
4. Content
70% người dùng bày tỏ rằng họ không thích việc các quảng cáo trên điện thoại cứ xuất hiện một cách liên tục mà nội dung lại nhàm chán. Điển hình là các popup quảng cáo khi ta sử dụng các App hay Youtube, … Để chống lại các chương trình chặn quảng cáo và cái nhìn tiêu cực dành cho quảng cáo trên thiết bị di động, các doanh nghiệp đã chuyển nhiều hơn sang Content Marketing
Content marketing không phải là nội dung mới nhưng càng ngày càng được sử dụng nhiều và thường xuyên hơn. Trong khi số lượng người dùng tương tác trên điện thoại ngày càng tăng, các nội dung ngày càng phải được trau chuốt và mang tính sáng tạo hơn trước. Vì vậy, content cần thực sự mang lại giá trị hữu ích cho người dùng, minh bạch và dễ đọc. Người tiêu dùng có xu hướng trở nên tiết kiệm và ít kiên nhẫn hơn. Họ không muốn dành thời gian lãng phí cho việc đọc một bài báo nhảm nhí với các liên kết bán hàng ở mỗi câu hay xem một đoạn clip trên youtube 3 phút nhưng quảng cáo đã gần 1 phút.
5. Marketing tạo bởi người dùng (User-generated Marketing)
Marketing do người dùng hay marketing thương hiệu thông qua khách hàng là cách thức tiếp thị hiệu quả. Loại hình marketing này khác hẳn so với KOL (Key Opinion Leader) khi các thương hiệu mời những người nổi tiếng có lượng followers (người theo dõi) đông đảo trên mạng xã hội, đây từng là chiêu thức marketing phổ biến nhưng người tiêu dùng ngày không còn tin tưởng hoàn toàn vào hình ảnh người nổi tiếng được trả tiền để tạo dáng với bộ bikini và cầm tách trà giảm cân.
Thay vào đó khách hàng muốn thấy những thứ thật và đáng tin hơn, những khách hàng cũ đã mua và trải nghiệm sản phẩm. Khảo sát cho thấy 60% người dùng cho biết lời giới thiệu từ bạn bè và gia đình sẽ ảnh hưởng đến quyết định mua hàng trong khi lời giới thiệu từ người nổi tiếng chỉ chiếm 23%. 85% người tiêu dùng tin tưởng vào các review online. Review của người dùng dễ dàng tìm trên mạng có thể gầy dựng cũng như đánh đổ danh tiếng của một nhãn hàng. Thay vì marketing bằng những hình ảnh vĩ mô hay xây dựng content từ góc nhìn của những người chưa sử dụng sản phẩm, các nhãn hàng nên bắt đầu tập trung đánh mạnh vào trải nghiệm thực tế của khách hàng.
6. Ít app hơn
Thời gian trước khi nhà nhà đều xây dựng một ứng dụng trên di động cho việc kinh doanh của họ, từ chuỗi cửa hàng giặt là cho tới dịch vụ đăng ký thức ăn cho thú cưng, và cũng người người download những ứng dụng ấy.
Tuy nhiên, tần suất mà những ứng dụng này được sử dụng lại không thường xuyên. Năm 2018, ở Mỹ trung bình 1 người sử dụng khoảng 9 ứng dụng khác nhau mỗi ngày, đây có vẻ là con số lớn nhưng chiếm trong đó là các ứng dụng phổ biến trên điện thoại (email, nhắn tin, lịch). Sau cùng chúng ta chỉ sử dụng một vài ứng dụng theo sở thích và nhu cầu cá nhân hàng ngày, dù cho có hàng trăm ứng dụng khác được tải về.
Trong tương lai, điều chúng ta có thể thấy là các app không còn phát huy tối đa các công dụng. Thay vì xây dựng app chỉ để gắn liền với thương hiệu, các công ty có xu hướng kiểm tra chỉ số ROI (lợi tức đầu tư). Nếu khách hàng không sử dụng ứng dụng thường xuyên, vậy app của bạn có thực sự xứng đáng với chi phí và công sức không? Thay vì vậy, các doanh nghiệp sẽ hướng tới tương tác một cách hiệu quả hơn với khách hàng của họ, như Chatbot và các công cụ định hình khác.
Smartphone là nơi lưu trữ rất nhiều thông tin cá nhân của người dùng, đây chính là “món mồi béo mỡ” cho các nhóm tội phạm mạng. Khi người dùng ngày càng quan tâm đến quyền riêng tư thì vấn đề bảo mật thông tin cá nhân trở thành những mối quan tâm hàng đầu đối với các nhà phát triển ứng dụng.
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ư người dùng, các bản cập nhật bảo mật tự động trên smartphone đang có xu hướng tăng nhanh. Điều này dự báo cho xu hướng bảo mật di động vào năm 2023.
Được xem như một kênh giao tiếp và truyền thông giữa thương hiệu và người tiêu dùng, Mobile Marketing khiến bạn tiếp cận với lượng khách khổng lồ mọi nơi mọi lúc, và quan trọng hơn là tỷ lệ người tiếp cận được nội dung, thông điệp của bạn cao hơn. Toàn bộ kinh nghiệm và các case study thực tế từ các công ty đứng đầu trong ngành sẽ được cập nhật tại một trong các sự kiện Mobile lớn nhất trong năm – Vietnam Mobile Day sắp trở lại sau hơn 8 năm thành công trước đó.
QA và QC là một thuật ngữ khá quen thuộc trong lập trình. Tuy nhiên, với những người mới bước chân vào nghề thì thường hay nhầm lẫn giữa 2 vị trí công việc này. Bởi cả QA và QC đều liên quan đến chất lượng, tuy nhiên mỗi thuật ngữ đều có những khác biệt rõ rệt từ khái niệm đến đặc điểm. Bài viết này sẽ giúp bạn trả lời được QA là gì? QC là gì? Nhiệm vụ và chức năng của QA QC là gì?
Định nghĩa QA là gì? QC là gì?
QA là gì?
QA (Quality Assurance) là những người chịu trách nhiệm đảm bảo chất lượng sản phẩm thông qua việc đưa ra quy trình làm việc giữa những bên liên quan. QA sẽ tập trung vào việc hoạch định, xây dựng tài liệu và tạo ra một hệ thống tiêu chuẩn chất lượng cho từng sản phẩm. Từ đó đưa ra các nhiệm vụ cụ thể cần làm của từng cấp bậc nhân viên tham gia vào quy trình đó.
QC là gì?
QC (Quality Control) là những người chịu trách nhiệm đảm bảo chất lượng của sản phẩm. QC sẽ thực hiện các bài kiểm tra chất lượng nhằm đảm bảo sản phẩm đáp ứng đủ và đúng yêu cầu mà QA đã đề ra.
QA sẽ làm nhiệm vụ đề xuất, đưa ra những quy trình phát triển (development process) cho sản phẩm để phù hợp với từng dự án cụ thể. Thông thường, các quy trình này được phát triển dựa trên mô hình V-model hay Agile. Ngoài ra, cần phải thông qua việc áp dụng những mô hình sẵn có như ISO hoặc CMMI.
Đưa ra những tài liệu, hướng dẫn, biểu mẫu có liên quan nhằm đảm bảo chất lượng sản phẩm.
Kiểm tra, đánh giá việc thực hiện quy trình của các bộ phận trong nhóm xem đã đúng với những gì bên QA đã đề ra không.
Nhắc nhở, thúc đốc đội ngũ phát triển tuân thủ theo đúng quy trình đã được đề ra.
Dựa vào từng đội ngũ mà có những giải pháp, thay đổi phù hợp nhất để thúc đẩy tiến độ công việc.
>>> Xem thêm công việc của nhân viên QA là gì tại đây
Đối với QC
Tìm hiểu hệ thống, từ đó đưa ra những phân tích và mô tả được thiết kế một cách hợp lý.
Xây dựng hệ thống test case phục vụ cho quá trình test phần mềm trước khi giao cho khách hàng.
QC Leader sẽ lên kế hoạch testing những dự tính đã đề ra trước đó.
Viết script cho automation test.
Sử dụng các test tool để thực hiện script chi tiết.
Phối hợp với nhóm lập trình fix bug, báo cáo chi tiết đến Project Manager cùng các bên liên quan khác của dự án để đảm bảo không có sai sót xảy ra.
Có kiến thức tốt về các khía cạnh cũng như những chức năng của sản phẩm vì bạn là người review các yêu cầu của requirement.
Kỹ năng quản lý và điều hành giúp bạn làm chủ được thời gian và công việc cũng như quản lý tốt hơn nhân viên cấp dưới của mình.
Yêu cầu sự cẩn thận, kỹ tính và luôn đặt sự chính xác lên trên hết để hoàn thành tốt nhiệm vụ được giao.
Yêu cầu kỹ năng giao tiếp vì bạn phải làm việc với nhiều người trong team nhất là việc trao đổi ý kiến, phản hồi của mình với Developer, Project Manager.
Có thể thấy, QA và QC đều rất quan trọng với đội ngũ phát triển phần mềm, đảm bảo phần mềm đạt chuẩn chất lượng, hoàn thành đúng tiến độ dự án mà vẫn phù hợp với ngân sách.
Mặc dù, nhiệm vụ của QA và QC khác nhau nhưng chúng vẫn có những mối liên hệ với nhau:
QA sẽ đưa ra các quy trình và giám sát quy trình cho đội ngũ phát triển sản phẩm, lên kế hoạch kiểm thử cho QC ở một giai đoạn cụ thể, quy định các công cụ sử dụng, tiêu chuẩn để sản phẩm đạt yêu cầu.
QA đưa ra quy trình, QC sẽ thực thi các bước QA đã đề ra, QA tham gia giám sát và theo dõi sự tuân thủ của QC sau đó tiến hành chỉnh sửa để phù hợp với tiến độ và ngân sách của dự án.
Tuy nhiên, do vai trò tương đối giống nhau nên nhiều công ty chỉ sử dụng QA và phân tách ra làm 2 vị trí mới.
SQA (Software Quality Assurance): Đóng vai trò như một QC thực thụ, thực hiện công việc kiểm thử sản phẩm.
PQA (Process Quality Assurance): Là người chịu trách nhiệm các công việc liên quan đến quy trình. Vì công việc khá đặc thù và mang tính hệ thống nên chỉ những công ty lớn như FPT Software, Harvey Nash, KMS,… mới tuyển vị trí QA, còn lại đa số các công ty phần mềm thường tuyển QC, SQA hoặc Tester.
SoftwareQATest: chuyên trang về kiến thức cơ bản và nâng cao nghề Testing.
Software Testing Fundamentals: chuyên trang về nghề SQA với cực nhiều thông tin hay, được phân từ cơ bản đến nâng cao.
Testing VN: diễn đàn về Kiểm thử Phần mềm bằng Tiếng Việt rất sôi động, trao đổi rất nhiều thông tin hữu ích.
Con đường sự nghiệp của nhân viên QA, QC
Đối với một doanh nghiệp dù lớn hay nhỏ thì bộ phận QA và QC luôn giữ một vai trò quan trọng. Bởi việc hoạch định quy trình vận hành, sản xuất và kiểm tra, đánh giá chất lượng sản phẩm sẽ quyết định đến sự thành công hay thất bại của công ty. Chính vì vậy cơ hội việc làm QA/QC luôn rộng mở cho các bạn trẻ trong ngành IT.
Nhìn chung, một nhân viên QA hay QC sẽ có những hướng phát triển như:
Bắt đầu từ vị trí Tester khi chưa có kinh nghiệm.
Bước lên vị trí Test Design khi đã có kinh nghiệm.
Khi đã đạt đến trình độ Manager bạn sẽ chuyển sang lĩnh vực quản lý.
Tổng kết
QA và QC là hai công việc khác nhau và được yêu cầu như một phần của quản lý chất lượng. QA sẽ kiểm tra bao quát hệ thống chất lượng, liên quan đến toàn bộ các phòng ban trong tổ chức. QC sẽ giúp kiểm tra chất lượng sản phẩm theo từng giai đoạn nhằm mục đích phát hiện và sửa chữa vấn đề.
Hy vọng bài viết này sẽ giúp bạn trả lời được câu hỏi QA là gì? Cũng như các đặc điểm, kỹ năng cần có của một nhân viên QA/QC. Đừng quên theo dõi các bài viết mới nhất về công nghệ trên TopDev nhé!
National Australia Bank (NAB) hiện là ngân hàng thương mại lớn nhất tại Úc, với hơn 170 năm lịch sử trong ngành tài chính ngân hàng. Chúng tôi hiện có hơn 33,000 nhân sự, phục vụ cho 8 triệu khách hàng tại 700 địa điểm khắp toàn cầu, đồng thời chúng tôi cũng có một trong những đội ngũ nhân sự công nghệ đông đảo hàng đầu tại Úc. NAB là môi trường của những khả năng và cơ hội mới, nơi bạn có thể chứng tỏ và phát triển tài năng của mình và được hỗ trợ tối đa để đạt được mục tiêu trong công việc.
Được thành lập từ năm 2019, NAB Innovation Centre Vietnam (NICV) kết nối những tài năng công nghệ Việt Nam với NAB để mang tới những trải nghiệm công nghệ tuyệt vời và đồng thời đóng góp vào sự phát triển của cộng đồng công nghệ Việt Nam. Chúng tôi cung cấp cho những kỹ sư Việt Nam cơ hội làm việc trực tiếp với những đồng nghiệp tại Úc, nhằm tận dụng những công nghệ hiện đại để mang lại những trải nghiệm tuyệt vời cho khách hàng.
Trên hành trình số hoá trong lĩnh vực tài chính – ngân hàng, NAB tự hào giữ vững vị trí tiên phong trong công nghệ: chúng tôi là ngân hàng đầu tiên của Úc triển khai chiến lược cloud-first, với mục tiêu đưa 80% ứng dụng và quy trình vận hành lên cloud vào năm 2023.
Vì vậy, chúng tôi nỗ lực tăng cường tiềm lực về công nghệ điện toán đám mây cho nhân sự của mình qua việc phối hợp cùng các đối tác quốc tế – AWS và Microsoft Azure – để đào tạo và chứng nhận cho nhân sự NAB. Chúng tôi cũng tạo ra nhiều cơ hội cho nhân sự của mình nghiên cứu và ứng dụng nhiều công nghệ mới vào quy trình vận hành.
Khi bạn quyết định phát triển sự nghiệp tại NAB, bạn sẽ cùng chung tay mang lại những tác động tích cực tới khách hàng, đồng nghiệp và cả cộng đồng. Là một trong 100 doanh nghiệp phát triển bền vững nhất thế giới, chúng tôi làm việc để thay đổi tương lai ngành ngân hàng, và bạn sẽ là một phần của đội ngũ giải quyết các vấn đề lớn của xã hội. Chúng tôi tạo nên khác biệt một cách thiết thực, vì một sự nghiệp tại ngân hàng NAB cũng như slogan của chúng tôi – “More than money”.
Tại NICV, chúng tôi thấu hiểu rằng nguồn nhân lực tốt sẽ tạo nên một tương lai phát triển bền vững. Vì vậy, chúng tôi mang tới nhiều phúc lợi hàng đầu để hỗ trợ bạn trong công việc và cuộc sống. Bên cạnh mức đãi ngộ cạnh tranh, chúng tôi còn đặt sức khỏe của nhân sự lên hàng đầu, bằng việc trang bị những gói bảo hiểm y tế cao cấp cho bạn và 02 người thân cùng 20 ngày nghỉ phép hàng năm. Nhân sự của chúng tôi cũng có được sự linh hoạt trong công việc, thể hiện qua chế độ làm việc hybrid – một nửa thời gian tại văn phòng, còn lại tùy chọn; đi kèm rất nhiều lựa chọn thử sức ở vị trí mới với 150 đội nhóm khác nhau tại công ty. Ngoài ra, chúng tôi còn gắn kết với nhau thông qua nhiều hoạt động ý nghĩa hàng tháng, và được phát triển năng lực tiếng Anh và những kỹ năng khác nhờ các chương trình đào tạo bài bản.
Sau chặng đường 3 năm hoạt động, NICV có thể tự tin khẳng định rằng chúng tôi đang đi đúng hướng trên con đường hiện thực hóa tầm nhìn của NAB cho cộng đồng công nghệ Việt Nam. Hãy tham gia cùng chúng tôi để trải nghiệm và đại diện cho tinh thần “More Than Money” danh tiếng của NAB.
Bài viết được sự cho phép của tác giả Trần Anh Tuấn
Sau khi viết xong bài trước về sự khác nhau giữa 2 đơn vị em và rem thì nhiều bạn có nói rằng “nếu có demo thì tốt hơn” thế nên hôm nay mình viết bài “nên sử dụng em hay rem vào dự án” này kèm theo demo là 1 trang mình cắt đơn giản sử dụng 2 đơn vị này. Các bạn có thể xem tại đây.
Việc sử dụng đơn vị nào hay như thế nào là tùy thuộc vào mỗi người có thể là do công ty yêu cầu hoặc bạn quen sử dụng đơn vị này, đơn vị kia rồi. Bài này mình chia sẻ về cách của mình, nếu các bạn thích các bạn có thể áp dụng, nếu không thì thôi hihi.
Đầu tiên thì các bạn inspect code(F12) rồi các bạn chọn thẻ <html> các bạn sẽ thấy mình set giá trị của thuộc tính font-size: 62.5%. Tại sao vậy ?
html { font-size: 62.5%;}
Ở bài trước mình có nói mặc định font-size ở hầu hết trình duyệt là 16px tức là 100%. Nghĩa là 1em = 1rem = 100% = 16px. Thế mình muốn có một div nào đó có width là 50px đi thì mình phải tính toán 50px / 16px được bao nhỉ? Lấy máy tính ra tính à được 3.125(em-rem). Như vậy mất thời gian quá nhỉ?
Đó là lý do mình set ở thẻ <html> font-size 62.5%. 100% thì được 16px suy ra 62.5% thì được 10px. Lúc này 1em = 1rem = 10px. Hehe. Giờ box có width 50px à dễ thôi cho width = 5rem là xong vì giờ tính toán lẹ hơn, tính được trong đầu ngay lập tức 50/10 = 5.
Thế là mình áp dụng chúng vào cái template này như thế. Các bạn có thể thấy cách mình làm ở div có class task__item(F12 rồi chọn thẻ div có class này nhé)
Mình cho margin-bottom 4rem thì sẽ tương ứng 40px vì đơn vị rem chỉ phụ thuộc vào thẻ<html> nên mình không lo lắng.
Tại sao mình không chọn em trong trường hợp này là vì nó phụ thuộc vào giá trị của thuộc tính font-size của chính nó hoặc phần tử cha chứa nó nên mình sợ nảy sinh nhiều vấn đề. Các bạn xem ví dụ dưới nè.
.task__item{ margin-bottom: 4em;/*Mình đổi ở đây*/ padding: 2.5rem; background-color: white; -webkit-box-shadow: 01rem3remrgba(0, 0, 0, 0.2); box-shadow: 01rem3remrgba(0, 0, 0, 0.2); font-size: 2rem;/*Thêm thuộc tính font-size vô đây*/}
Giờ mình thay đổi giá trị margin-bottom thành 4em và thêm font-size là 2rem(20px) thì lúc này margin-bottom 4em sẽ tương đương với 80px chứ ko phải là 40px như của đơn vị rem, như vậy sẽ không được như bạn mong muốn. Các bạn phải tính toán kỹ khi dùng với đơn vị em nhé.
Đơn vị rem và em khi dùng margin-bottom
Bây giờ khi resize xuống màn hình nhỏ hơn như IPad, Mobile mình thấy toàn website kích thước to quá nhìn không hợp. Thay vì chỉnh từng cái thì mình set giá trị font-size của thẻ <html> xuống còn 50%(bao nhiêu % tùy design hoặc yêu cầu) lúc này toàn bộ size sẽ nhỏ lại theo size của từng element.
html { font-size: 50%; /* Các bạn có thể set bao nhiêu tùy yêu cầu hay design nhé */}
Các bạn có thể mở template mình đã làm rồi Inspect code, resize trình duyệt và check code để xem cách mình áp dụng đơn vị rem như thế nào nhé. Nếu không hiểu thì có thể bình luận ở dưới mình sẽ trả lời nha.
Ah còn 1 điểm lưu ý nữa đó là trong @media queries mình ít sử dụng px hay là rem mà mình lại sử dụng em. Ở đây mình nói là bên trong cái dấu () của @media queries chớ không phải nội dụng bên trong dấu {} này nha các bạn đừng hiểu sai ý mình.
@media only screen and(max-width: 60em/*giá trị này*/){}
Có rất nhiều lý do ở đây giữa 3 đơn vị này khi dùng cho @media queries. Nó rất dài để giải thích nên mình có tìm tòi và đọc được 1 bài viết khá hay, chi tiết nói về vấn đề này các bạn có thể xem tại đây nha.
# Lời kết
Thì theo quan điểm của mình thì mình sử dụng cả 2 vào project luôn. Đơn vị rem thì dùng cho toàn website kết hợp với px ở những chi tiết nhỏ như border 1px solid #abc chẳng hạn và đơn vị em thì dùng trong @media queries.
Còn các bạn thì dùng như thế nào? Cùng chia sẻ ở bên dưới bình luận nhé. Hy vọng với những kiến thức mà mình chia sẻ sẽ giúp ích cho các bạn phần nào trong việc học tập và code. Chúc các bạn ngày tốt lành.
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.