Home Blog Page 127

Cẩm nang tri thức dành cho sinh viên ngành IT

ngành IT

Hậu Codvid – 19, nhiều thách thức về tuyển dụng nhân sự ngành IT lại gia tăng. Điều này đã làm ảnh hưởng không nhỏ đến cơ hội nghề nghiệp của nhiều ứng viên, đặc biệt là các sinh viên mới ra trường. Vậy câu hỏi đặt ra làm thế nào để giảm sức ép cạnh tranh hiện tại?

Các bạn sinh viên ngành IT cần trang bị những kỹ năng gì? Xóa tan đi nỗi lo về việc quá áp lực để tìm kiếm một công việc tốt đồng thời, nhận ra được đâu là những gì bản thân cần rèn luyện chính là điều mà các bạn sinh viên hiện tại nên cần ghi nhớ.

Cùng TopDev phân tích theo dõi xem đâu là những yếu tố có mặt trong cẩm nang tri thức nhé!

Các yếu tố trong cẩm nang tri thức

Am hiểu kiến thức chuyên ngành IT – Giá trị cốt lõi chinh phục mọi thành công

Không chỉ riêng ngành IT, dù bất kỳ ngành nghề nào như freelancer it thì thì việc nắm chắc các kiến thức chuyên ngành đều rất quan trọng. Kết quả chuyên ngành là cơ sở phản ánh năng lực cảm thụ, vận dụng tính chuyên môn vào thực tế. Các kiến thức nền tảng mà bạn cần nắm bắt như:ngôn ngữ lập trình, tư duy lập trình, lập trình hướng đối tượng, cấu trúc dữ liệu & giải thuật,…

ngành IT

Một điều bạn cần lưu tâm là: Bạn phải nắm bắt chắc chắn nền tảng kiến thức trước khi “xông pha” đi tìm việc.

Ngoài ra, năng lực chuyên môn cũng thể hiện mức độ phù hợp của bạn với công việc. Kiến thức là vô tận. Dù bạn giỏi, sự học vẫn cần được duy trì. Chính sự nỗ lực tự trau dồi các kiến thức sẽ giúp bạn phát triển năng lực một cách nhanh nhất.

Thế đâu là cách giúp bạn định hình việc học tập tốt hơn? Hãy xác định cho bản thân một con đường phát triển riêng. Từ định hướng đó, bạn sẽ không bị xao nhãng, lệch ra khỏi trục định hướng về tương lai. Khi đã xác định được hướng đi bạn yêu thích, việc tự thiết lập một lộ trình học tập phù hợp sẽ dễ dàng hơn. Điều quan trọng là nhận ra đâu là cái bạn đam mê. Hãy suy nghĩ thật thận trọng!

Backend, frontend,…hay freelancer it có thể là một mảng nào đó tùy thuộc vào bạn. Khi đã có lựa chọn, hãy bắt đầu triển khai học tập. 

Nắm bắt các xu hướng công nghệ

Không thể phủ nhận, công nghệ đang có sự phát triển rất mạnh mẽ. Dường như mọi khía cạnh trong công nghệ đều được khai thác và nâng cấp nhanh chóng. Những bước lột xác cho thấy sự thăng hạng về công nghệ phải kể đến như: AI – Trí tuệ nhân tạo, Blockchain, công nghệ – IT kết hợp với con người nhân sự, các chiến lược về công nghệ,…

  HR & IT - "Cuộc chơi" đầy hoàn hảo cho việc thu hút và giữ chân nhân tài
  Phân tích con người - Chiến lược quan trọng trong ngành Nhân sự năm 2023

ngành IT

Thế nên, việc nắm bắt các xu hướng công nghệ nổi bật chính là yếu tố quan trọng tiếp theo. Các bạn sinh viên mới ra trường có thể chưa đủ “chín” để là người tạo ra xu hướng. Đơn giản, vì điều các bạn thiếu chính là sự trải nghiệm. Tất nhiên, không thể đánh đồng và quy ước thực tế ấy ra bội số chung. Song, thực tế cho thấy, các bạn vẫn cần thời gian để hoàn thiện mình nhiều hơn.

Có thể các bạn không là người tạo ra xu hướng. Nhưng khả dĩ, các bạn hoàn toàn có thể trở thành người dẫn đầu xu hướng. Mấu chốt chính là việc các bạn có nắm bắt được các xu hướng công nghệ đang thịnh hành hay không? 

Cùng TopDev điểm qua một số xu hướng công nghệ nổi bật nhất nhé:

– Trí tuệ nhân tạo – AI

– Học máy – Machine Learning/ Học tăng cường – Reinforcement Learning

– Thực tế ảo – VR và thực tế tăng cường – AR

– Điện toán biên – Edge Computing

– Tự động hóa quy trình bằng Robot – Robotic Process Automation (RPA)

– Blockchain

– An ninh mạng – Cybersecurity

Con người hội nhập 

Sức cạnh tranh hiện tại trong ngành IT hay freelancer it rất khắc nghiệt. Nếu chỉ với tiếng Anh, bạn khó có thể tiến xa. Vì đơn giản, bạn không phải là nhân tố nổi trội duy nhất trên sàn đấu IT này.

ngành IT

Chúng ta cần chấp nhận rằng tiếng Anh không còn là ưu thế nữa. Nó là điều bắt buộc các bạn phải sở hữu. Công việc ngành lập trình đòi hỏi bạn sẽ thực hiện các dự án lớn nhỏ khác nhau. Việc đọc và tra cứu các tài liệu với đa dạng các ngôn ngữ khác nhau là chuyện không mấy xa lạ.

Do vậy, ngoài kỹ năng chuyên môn, sự nỗ lực, khả năng đa ngôn ngữ là một lợi thế quan trọng. Hãy trau dồi thêm các ngôn ngữ khác như: tiếng Trung, tiếng Nhật, tiếng Hàn,…  để gia tăng cơ hội. Bạn sẽ tự tin hơn và thỏa sức làm việc với các khách hàng đa quốc gia.

Xem thêm: 6 chiến lược tuyển dụng IT giúp chinh phục ứng viên tài năng

Chính các nhà tuyển dụng nhân sự IT, freelancer it cũng chú trọng đến vấn đề này. Họ luôn xem xét thêm về tiêu chí “đối ngoại đa ngôn ngữ” bên cạnh kỹ năng chuyên môn. Điều này hoàn toàn dể hiểu. Việc biết nhiều ngôn ngữ sẽ mang lại nhiều cơ hội hợp tác với các khách hàng. Đồng thời, chính bản thân ứng viên cũng được học hỏi thêm từ các đối tác nước ngoài về: trình độ, tác phong làm việc chuyên nghiệp,… 

Những điều gì bạn còn thiếu?

Đặc điểm chung của nhiều sinh viên mới ra trường chính là việc thiếu kỹ năng mềm. Có thể chuyên môn của họ rất giỏi. Thế nhưng, kỹ năng mềm của họ chỉ đạt mức trung bình. Đồng thời, việc am hiểu nhu cầu của nhà tuyển dụng lại rất quan trọng. Bạn chưa thể đi ứng tuyển nếu chưa biết nhà tuyển dụng cần gì.

Hạn chế về kỹ năng mềm

Nếu là một sinh viên ngành IT, bạn càng phải rèn luyện kỹ năng mềm. Lý thuyết đôi khi chưa thể phát huy hết giá trị của nó nếu mỗi cá nhân không tự tạo cơ hội để lý thuyết được áp dụng. 

Xem thêm: Top 5 website giúp thiết kế CV chuẩn format, đủ nội dung

Một số kỹ năng mà các bạn sinh viên cần phải rèn luyện là: tính chủ động, tư duy độc lập, tiếp thu và phản hồi, tư duy phản biện; kỹ năng làm việc nhóm, kỹ năng giao tiếp – thuyết trình, kỹ năng viết CV, kỹ năng phân tích và giải quyết vấn đề,…

ngành IT

Tăng hiệu quả ứng tuyển bằng cách tạo CV Online hiệu quả trên TopDev

Hãy tận dụng các cơ hội để rèn luyện và phát huy kỹ năng mềm. Đừng bỏ lỡ những cơ hội trải nghiệm thực tế. Vì nó sẽ giúp bạn đánh giá được năng lực hiện tại. Đồng thời, giúp bạn ghi nhận các phản hồi từ mọi người. Các dự án nhỏ, những chương trình cộng tác, thực tập sinh,… là cơ hội tốt để bạn nâng cao level của bản thân.

Lưu ý, bạn vẫn phải biết cách cân bằng giữa việc học và tham gia trải nghiệm thực tế. Tất nhiên, mọi nhà tuyển dụng đều thích những ứng viên luôn chủ động trong công việc. Đừng để chậm nhịp, mỗi cơ hội đều đáng giá, cố lên!

Nhà tuyển dụng đang cần gì?

Bạn có mọi thứ và vì thế, bạn có thừa sự tự tin để ứng tuyển. Tuy nhiên, bạn cần xác định rõ bản thân đã hiểu về nhu cầu của nhà tuyển dụng hay chưa.

ngành IT

Công nghệ có thể được nâng cấp, kiến thức ngày một được đổi mới, nhiều ứng viên cùng ứng tuyển tạo ra một sức ép cạnh tranh lớn hơn. Nếu bạn cứ giữ tâm thế mình đã hoàn thiện, bạn khó có thể thành công. Điều quan trọng là bạn phải luôn cập nhật mình trong từng khía cạnh nhỏ. Xác định đối tượng cùng những đặc trưng mà họ hướng đến. Đồng thời, rèn luyện để phát huy các thế mạnh tương ứng về kiến thức, kỹ năng, ngoại ngữ,… sao cho phù hợp với vị trí ứng tuyển. 

Lời kết

Hành trình nghề nghiệp của bạn chỉ thật sự bắt đầu khi bạn kết thúc chặng đường sinh viên. Đừng ngại dấn thân! Đừng e ngại nỗi lo thất nghiệp! TopDev hy vọng với những yếu tố vừa kể trên phần nào sẽ giúp các bạn sinh viên ngành IT, freelancer it định hình được bản thân mình cần gì, đang thiếu những gì. Từ đó, các bạn sẽ lập được kế hoạch rèn luyện để hoàn thiện và phát triển mình một cách tốt nhất.

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

Xem thêm Top việc làm Fresher sinh viên HOT trên TopDev

Vantix – Bệ phóng lý tưởng cho các tài năng công nghệ vươn tầm sự nghiệp

Vantix - Bệ phóng lý tưởng cho các tài năng công nghệ vươn tầm sự nghiệp

Không ngừng tiên phong đón đầu xu hướng công nghệ mới, Công ty Cổ phần Giải pháp và Dịch vụ Công nghệ Vantix đã tạo nên bước đột phá cho ngành công nghệ Việt, mang đến những giải pháp và dịch vụ quản lý Dữ liệu & AI hiệu quả. Từ đó mở ra hướng đi mới, một “mảnh đất” màu mỡ cho các nhân tài công nghệ phát triển sự nghiệp và tỏa sáng tài năng.

Vantix - Bệ phóng lý tưởng cho các tài năng công nghệ vươn tầm sự nghiệp

Vantix – Khác biệt để dẫn đầu

Chính thức góp mặt vào đường đua công nghệ từ tháng 2/2019, Vantix Technology Solutions and Services (Vantix Inc) đã cho thấy sức mạnh của mình, thể hiện vị thế của một trong những công ty thuộc khối Công nghệ của Vingroup – Tập đoàn kinh tế tư nhân đa ngành lớn hàng đầu châu Á.

Hiện thực hóa mục tiêu sử dụng hiệu quả các giải pháp Trí tuệ nhân tạo & Dữ liệu trong việc nâng cao năng suất lao động, Vantix Inc trở thành đơn vị ứng dụng các công nghệ mới nhất của AI (Trí tuệ nhân tạo) nhằm tạo ra lợi thế cạnh tranh cho các doanh nghiệp trong nước và quốc tế.

Với giải pháp VinHR và vòng đeo tay vBand, Vantix Inc bước đầu phá vỡ những giới hạn đồng thời khẳng định được sức mạnh của công nghệ, đưa Vingroup trở thành một trong những đơn vị đầu tiên trên thế giới cung cấp giải pháp tối ưu hóa năng suất lao động thông qua thiết bị IoT cá nhân và AI.

Chưa dừng lại ở đó, Vantix với tham vọng lớn lao của “kẻ dẫn đầu”, hứa hẹn đem đến thách thức lớn hơn cho giới công nghệ trên toàn thế giới với những bài toán chưa có lời đáp, mở ra tương lai đầy khởi sắc ghi dấu một sự bùng nổ của công nghệ với các dự án có tính tự động hóa cao.  

Vantix – Điểm đến lý tưởng dành cho các tài năng công nghệ

Hướng đến việc tạo sự thoải mái cho con người và tối đa hóa năng suất lao động, Vantix không ngừng nghiên cứu, đưa những ý tưởng, giải pháp công nghệ đến gần hơn với cuộc sống, mang lại giá trị thực cho doanh nghiệp. 

Cùng Vantix bứt phá mọi giới hạn và thách thức chính là đội ngũ các tài năng đến từ Microsoft, IBM, Facebook, Ebay, Intel với năng lực chuyên môn cao về mảng AI, Machine Learning, Data. Không dừng lại ở đó, sức hút từ Vantix trở nên mạnh mẽ hơn khi ngày càng có thêm những “mảnh ghép” mới, dám khác biệt và sẵn sàng cống hiến sức lực và trí lực nhằm chinh phục mục tiêu phía trước.

Tại Vantix, tiềm năng cá nhân của mỗi thành viên luôn được khai phá để phát triển với sự hỗ trợ từ những nhà lãnh đạo tuyệt vời. Tin tưởng vào sức mạnh vô hạn của công nghệ cũng như khả năng kỳ diệu của trí tuệ con người, Vantix mang đến môi trường sáng tạo cùng sự khác biệt, hướng tới sự thoải mái cho con người và tối ưu hiệu quả lao động. 

Đến với Vantix, mỗi thành viên là một phần tử quan trọng, là cá thể độc lập dám nghĩ, dám làm, dám thay đổi và dám bứt phá để có được những bước nhảy vọt cho sự nghiệp. Và nếu bạn tự tin với vốn kiến thức, kinh nghiệm cùng sự nhiệt huyết và niềm đam mê với công nghệ mới, Vantix luôn có cơ hội cho bạn phát triển sự nghiệp của bản thân.

Vantix - Bệ phóng lý tưởng cho các tài năng công nghệ vươn tầm sự nghiệp

Chiêu mộ nhân tài, mang đến cơ hội phát triển tài năng

Phá vỡ giới hạn với những sản phẩm sáng tạo, Vantix tìm kiếm những nhân tố tài năng để cùng góp sức. 

Cơ hội đặc biệt gõ cửa các nhân tài công nghệ Senior C/C++ EngineerProject Manager Technical với loạt đãi ngộ phong phú và cơ hội phát triển sự nghiệp cực hấp dẫn:

  • Thu nhập cạnh tranh với lương tháng 13 và thưởng hàng năm xứng đáng theo chính sách của Tập đoàn;
  • Từng bước phát triển sự nghiệp, tỏa sáng tài năng trong môi trường quốc tế chuyên nghiệp, đầy nhiệt huyết và sáng tạo;
  • Được làm việc, tiếp xúc với những thiết bị, xu hướng công nghệ hiện đại nhất hiện nay với cơ hội học hỏi các kiến thức chuyên sâu về AI & Dữ liệu;
  • Hưởng trọn đặc quyền khi sử dụng các dịch vụ tại Vingroup: Vinmec, Vinhomes, Vinschool, VinFast, Vinsmart…
  • Cùng nhiều điều thú vị đang chờ các tài năng công nghệ trực tiếp trải nghiệm.

Bạn đã sẵn sàng cho bước ngoặt mới của sự nghiệp?

Apply ngay hôm nay và bắt đầu cuộc hành trình cùng Vantix tạo nên sự khác biệt.

Bàn Về Cái Sự Nhảy Việc!

Bàn về sự nhảy việc

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

NGƯỜI HAY NHẢY VIỆC THÌ CHẾ NHẠO NGƯỜI LÀM LÂU NĂM 1 CHỖ!

NGƯỜI LÀM LÂU DÀI 1 CHỖ THÌ PHÊ PHÁN NGƯỜI HAY NHẢY VIỆC!

  10 kinh nghiệm khi làm việc với các dự án lớn viết bằng Vue.js
  10 Kỹ năng quan trọng cần có của Front-end để tìm công việc dễ dàng hơn

Thực trạng đúng là như vậy. bạn có thể thấy nhóm bạn:

“- Mày chuyển việc đi, tao thấy chỗ này chỗ kia lương cao gấp đôi lương mày á!

– Ối giời, mày lại chuyển việc rồi hả. Mày không mệt à? Thôi cứ như tao ở một chỗ cho lành”

Bàn Về Cái Sự Nhảy Việc!

Phải công nhận là, thị trường lao động, công việc và bản thân chúng ta, đều thay đổi, và phải thay đổi.

Không thể có chuyện bao năm bao tháng không biến chuyển gì.

Nên sẽ có sự thay đổi càng phù hợp, hoặc thay đổi nên dần không hợp. Thay đổi nên cần hướng đi khác. Hoặc không thay đổi kịp bị đào thải…

Đó cũng là sự lựa chọn của mỗi người. Và tôi khẳng định, nó sẽ có sự phù hợp riêng với từng cá nhân, từng thời điểm, từng hoàn cảnh, vì chúng ta hoàn toàn không giống nhau.

Tôi đánh giá cao về các bạn ứng viên nói: “Vì kế hoạch nghề nghiệp của tôi, tôi sẽ làm việc ở đây đúng trong 2 năm, và tôi đảm bảo, tôi sẽ toàn tâm toàn ý cống hiến cho công ty bằng năng lực cao nhất của tôi.”

Hoặc 1 năm, hoặc 5 năm… Theo định hướng của bạn, chứ không phải là “Tôi muốn tìm một nơi làm việc ổn định, để gắn bó lâu dài…”. Chẳng có gì là ổn định cả, Mãi mãi lại bằng 2 năm 🙂))

Nhưng khéo 2 tháng sau có cả tá lý do để nghỉ việc, hoặc cố lắm thì được qua tết lấy thưởng rồi bye 🙂))

————-

Nếu bạn muốn nhảy việc, thì bạn cứ tìm cơ hội mới, nhưng đừng vì ngấp nghé cơ hội mới -> chán công việc hiện tại -> hiệu suất giảm -> lại chán công việc hơn -> lại tìm công việc mới -> lại tiếp diễn. Vậy là không ổn, bạn đang tự phá sự nghiệp của mình thôi.

Có lẽ bạn nên thôi ngó nghiêng và vùi đầu vào công việc thì tốt hơn.

Nếu bạn làm lâu năm, công việc mãi mãi như một, cũng chẳng thăng tiến chút nào, lương thì chỉ tăng vừa bằng lạm phát, hoặc, tăng lương chẳng phải do bạn mang về doanh thu, mà do những người khác làm công ty phát triển. Thì bạn hãy tích cực định vị lại bản thân và cập nhật thị trường đi, xem xét đi phỏng vấn job khác xem năng lực hiện tại của bản thân như thế nào, chứ bạn sắp bị đào thải mất thôi.

Thêm nữa, nhiều trường hợp, họ vẫn có một công việc fulltime bình thường, ngoài ra thì họ có công việc tay trái nữa, hoặc họ dành thời gian cho công việc/ sự nghiệp/ thú vui…nào đó.

Nói chung, chúng ta cần tự hoạch định và quản lý bản thân mình và biết mình ở đâu.

Via: Vân D

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

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

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

Callback trong PHP là gì?

Callback trong PHP là gì?

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

Callback là gì?

Callback là khái niệm một hàm được truyền vào một hàm khác như một tham số để nó có thể được thực hiện trước hoặc sau một sự kiện hoặc một thay đổi trạng thái. Trong thực tế, callback nghĩa là gọi lại, xem xét một ví dụ sau, một người hỗ trợ sẽ thực hiện lấy các thông tin về lỗi của người dùng sau đó mới gọi lại (callback) cho khách hàng. Trong PHP, thực hiện callback là rất đơn giản. Chúng ta xem một ví dụ sau:

<?php
function sayHello($callback) {
    echo "Xin chào!</br>";
    // Các câu chuyện khác ở giữa xin chào và tạm biệt
    // ...
    $callback();
}
function sayGoodbye() {
    echo "Tạm biệt!";
}

sayHello('sayGoodbye');
// Kết quả
// Xin chào!
// ...
// Tạm biệt

Trên đây là một ví dụ rất đơn giản về callback trong PHP, hàm sayGoodbye được truyền vào hàm sayHello như một tham số. Cách thực hiện này rất hữu ích khi chúng ta muốn định nghĩa một hàm (sayGoodbye) được thực hiện khi một sự kiện xảy ra (sau các câu chuyện khác). Ví dụ trên đây khá dễ hiểu nhưng có một khía cạnh chưa được bàn đến là việc sử dụng kết quả của hàm gọi trong hàm được gọi. Ví dụ tiếp theo cho thấy hỗ trợ viên sau khi lấy thông tin về lỗi người dùng và sử dụng thông tin này để gọi lại cho khách hàng:

<?php
function sayHello($first_name, $last_name, $callback) {
    $full_name = $first_name . ' ' . $last_name;
    $callback($full_name);
}
function formatName($full_name) {
    echo '<h2 style="color:red;">Xin chào '. $full_name . '!<h2>';
}

sayHello('Nguyễn Văn', 'A', 'formatName');

Kết quả như sau:

Callback trong PHP là gì?

Ứng tuyển ngay các vị trí PHP tuyển dụng mới nhất trên TopDev

Bản chất của callback(callback(full_name); là gọi đến một hàm được xây dựng sẵn trong PHP call_user_func, như vậy callback(callback(full_name); là tương đương với call_user_func(callback,callback,full_name); Sử dụng callback có thể có lỗi xảy ra nếu chúng ta callback đến một hàm chưa được định nghĩa, vậy chúng ta cần kiểm tra biến được truyền vào có phải là một hàm hay không bằng hàm is_callable():

<?php
function sayHello($first_name, $last_name, $callback) {
    $full_name = $first_name . ' ' . $last_name;
    if (is_callable($callback)) {
        call_user_func($callback, $full_name);
    }
}
function format($full_name) {
    echo '<h2 style="color:red;">Xin chào '. $full_name . '!<h2>';
}

sayHello('Nguyễn Văn', 'A', 'format');
  10 PHP Instagram Scripts & Widgets tốt nhất
  10 điều bạn cần biết về PHP7

Sử dụng callback ở đâu?

Callback thường được sử dụng trong những tình huống sau: – Khi ứng dụng cần thực hiện một hàm khác dựa trên ngữ cảnh hoặc trạng thái, hay nói một cách khác là muốn thực hiện một việc gì đó khi một sự kiện xảy ra.

  • Sử dụng với các hàm nặc danh (anonymous function) hoặc với Closure.
  • Lập trình đa luồng (multiple thread).

Ví dụ về lập xử lý đa luồng, chúng ta cần mở một file và ghi vào file một cái gì đó, vì file này rất lớn nên việc mở file có thể mất một chút thời gian. Nếu như viết theo cách cũ:

fileObject = open(file)
// Cần phải chờ file được mở thì mới ghi vào file được, có thể mất 5 phút chẳng hạn.
fileObject.write("We are writing to the file.")
// Tiếp theo mới làm được những việc khác
doSomething();

Sử dụng callback, chúng ta có thể thực hiện được những việc khác luôn

fileObject = open(file, writeToFile)
// Không cần phải chờ file mở và ghi vào file, chúng ta có thể thực hiện việc khác luôn.
doSomething();

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

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

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

Sử dụng bảng quyết định trong kiểm thử phần mềm

Sử dụng bảng quyết định trong kiểm thử phần mềm

Bài viết được sự cho phép của vntesters.com

Trong các kỹ thuật viết kịch bản kiểm thử, đối với các trường dữ liệu đơn như textbox, chúng ta thường sử dụng các phương pháp như lớp tương đương (Equivalence partitioning) hay phương pháp phân tích giá trị biên (Boundary value analysis). Đối với kiểm thử hành vi của hệ thống với nhiều trường dữ liệu, bảng quyết định (Decision table) sẽ giúp chúng ta phân loại và định hình được kịch bản kiểm thử một cách chính xác và rõ ràng hơn.

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  Các trường hợp kiểm thử OTP

Về cơ bản, bảng quyết định sử dụng mô hình luận lý phức tạp để người dùng dễ dàng thấy các kết hợp có thể có của các điều kiện đang xem xét và các hành động tương ứng với tập hợp giá trị của chuỗi điều kiện.

Một ví dụ cơ bản nhất cho bảng quyết định là hệ thống máy rút tiền tự động ATM: Để có thể rút được tiền từ máy ATM, người dùng cần một trong hai điều kiện: tiền trong tài khoản vẫn còn và lớn hơn số tiền muốn rút (Đối với thẻ debit) hoặc là, người dùng được cấp cho một khoản tín dụng từ trước (Đối với thẻ Credit). Diễn đạt bằng lời như thế này, đôi khi dễ làm chúng ta nhầm lẫn về các điều kiện thực tế, chưa kể đến từ “và” và “hoặc”. Khi đưa các điều kiện này vào bảng quyết định, chúng ta sẽ thấy mọi thứ rõ ràng hơn nhiều:

Điều kiện Trường hợp 1 Trường hợp 2 Trường 3
Số tiền trong tài khoản lớn hơn số tiền định rút Đúng (T) Sai (F) Sai (F)
Đã được cấp tín dụng Đúng (T) Sai (F)
Hành động của hệ thống
Cho rút Có (T) Có (T) Không (F)

Thông thường, bảng quyết định sử dụng giá trị luận lý để diễn đạt các điều kiện và hành động của hệ thống. Đối với “đúng/sai” hay “true/false”, chúng ta sẽ dễ dàng ứng dụng các phép toán luận lý như “”/”hoặc” hơn.

Việc liệt kê các điều kiện và các giá trị có thể có của từng điều kiện, chúng ta sẽ có thể đảm bảo toàn bộ kết hợp của các điều kiện được xuất hiện trong bảng quyết định, từ đó chúng ta sẽ đảm bảo sẽ không bỏ qua bất kỳ một kịch bản kiểm thử nào. Hơn nữa, với bảng quyết định, chúng ta có thể phát hiện nhanh chóng những yêu cầu vô lý, qua đó giúp chúng ta tiết kiệm thời gian và công sức thực thi những kịch bản kiểm thử vô nghĩa.

Mặt khác, chúng ta có thể thấy rằng, bảng quyết định không chỉ tốt cho kỹ sư kiểm thử, nó còn có tác dụng cực lớn cho tất cả mọi thành viên của nhóm phát triển phần mềm, từ chủ của sản phẩm (product owner) khi đưa ra ý tưởng, đến các lập trình viên để họ tạo dựng và phát triển hệ thống.

Các bước để tạo một bảng quyết định

1. Phân tích các điều kiện và hành động của hệ thống

Trở lại ví dụ ở trên về máy ATM, chúng ta có thể thấy có hai điều kiện xác định:

  • Số tiền trong tài khoản lớn hơn số tiền định rút
  • Được cấp tín dụng

Và chỉ có một hành động tương ứng của hệ thống: Được rút tiền hay không?

Điều kiện
Số tiền trong tài khoản lớn hơn số tiền định rút
Đã được cấp tín dụng
Hành động của hệ thống
Cho rút

2. Thêm các cột trường hợp giá trị của điều kiện

Đối với 2 điều kiện như trên, chúng ta sẽ có 4 sự kết hợp đúng/sai (2²)

Điều kiện Trường hợp 1 Trường hợp 2 Trường hợp 3 Trường hợp 4
Số tiền trong tài khoản lớn hơn số tiền định rút Đúng (T) Đúng (T) Sai (F) Sai (F)
Đã được cấp tín dụng Đúng (T) Sai (F) Đúng (T) Sai (F)
Hành động của hệ thống
Cho rút

3. Cố gắng giảm số lượng các cột điều kiện

Ở đây, chúng ta có thể thấy rằng, trường hợp 1 và trường hợp 2 là gần như nhau, khi số tiền trong tài khoản lớn hơn số tiền cần rút, chúng ta không cần quan tâm việc khách hàng có được cấp tín dụng hay không 🙂 Do đó, chúng ta có thể giảm bớt một trường hợp ở đây, chúng ta đánh dấu bằng “-“

Điều kiện Trường hợp 1 Trường hợp 2 Trường 3
Số tiền trong tài khoản lớn hơn số tiền định rút Đúng (T) Sai (F) Sai (F)
Đã được cấp tín dụng Đúng (T) Sai (F)
Hành động của hệ thống
Cho rút

4. Xác định hành động tương ứng của hệ thống

Dựa trên điều kiện, chúng ta sẽ có kết quả cuối cùng:

Điều kiện Trường hợp 1 Trường hợp 2 Trường 3
Số tiền trong tài khoản lớn hơn số tiền định rút Đúng (T) Sai (F) Sai (F)
Đã được cấp tín dụng Đúng (T) Sai (F)
Hành động của hệ thống
Cho rút Có (T) Có (T) Không (F)

5. Viết các kịch bản kiểm thử

Ở bước này, chúng ta bắt đầu viết chi tiết các bước và thiết lập dữ liệu kiểm thử cho kịch bản kiểm thử.


Một câu hỏi nhỏ thôi. Theo các bạn, việc chúng ta gom trường hợp 1 và 2 ở bước thứ 3 có tốt hay không? Có khả năng nào chúng ta sẽ bỏ lỡ một lỗi (bug) ở đây? Và trong trường hợp gom được, chúng ta nên chọn giá trị T hay F cho điều kiện thứ 2?

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

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

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

System Design Cơ Bản – Định lý Cap / Cap Theorem

định lý cap

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

Định lý CAP nói rằng một hệ thống phân tán (distributed system) không thể thỏa mãn cả ba yếu tố CAP đó là:

  • Consistency: tính nhất quán, tất cả các node phải có dữ liệu đồng nhất với nhau.
  • Availability: tính sẵn sàng hoạt động của các node. Hệ thống có thể vẫn hoạt động được khi một số node bị chết hoặc không sẵn sàng.
  • Partition Fault Tolerance: trạng thái hoạt động của hệ thống khi đường kết nối (mạng) giữa các node bị đứt, hay còn gọi là khả năng chịu lỗi của hệ thống. Hệ thống vẫn phải hoạt động bình thường cho dù các kết nối của các node trong hệ thống bị đứt gãy.
  Giải mã bí ẩn "system load" trên Linux
  System Admin là gì? Mô tả công việc vị trí System Administrator

System Design Cơ Bản - Định lý Cap / Cap Theorem
Định luật CAP

Chúng ta không thể thiết kế một hệ thống bao gồm cả ba tính CAP, bởi vì đảm bảo tính C (consistency) tất cả các cập nhật dữ liệu phải được thực hiện trên các node cùng một thời điểm. Nhưng nếu đường kết nối (mạng) giữa các node không được đảm bảo dẫn đến việc các node sẽ không được update dữ liệu cùng một thời điểm, điều này dẫn tới việc một vài node dữ liệu sẽ bị out-of-date do chưa được cập nhật dữ liệu từ đó vi phạm tính C (consistency). Và để đảm bảo đối phó với điều này ta sẽ ngừng phục vụ nhữg node bị out-of-date đó cho tới khi nó được update dữ liệu đầy đủ, nhưng việc này lại vi phạm tính A (availability) của hệ thống.

Thông thường, người ta thường đánh đổi yếu tố C để lấy hai yếu tố A và P. Khi đó họ sẽ thay thế Consistency thành eventually consistency (tính nhất quán có độ trễ), làm như thế hệ thống sẽ có hiệu năng tốt hơn

Theo medium

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

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

Xem thêm: Tìm việc làm designer hấp dẫn trên TopDev

Lưu tâm về 5 kiểu người khó hợp tác

hợp tác
hợp tác

Tính hợp tác trong công việc rất quan trọng, đặc biệt là đối với sự nghiệp thăng tiến của bạn. Vấn đề về tính cách, môi trường sống,… đã hình nên những cá tính – cái  tôi cá nhân khác nhau. Cùng TopDev điểm qua 5 kiểu người bạn mà bạn khó hợp tác qua bài viết sau!

Người thiếu đạo đức

Những cá nhân thiếu đạo đức như gian lận, tư duy luôn mưu tính thiệt hơn, không giữ uy tín, đam mê hào nhoáng – vật chất xa hoa,… Dẫu biết rằng mọi thị trường làm việc đều tồn tại những cạnh tranh với nhau. Tuy nhiên, nên cạnh tranh trên nguyên tắc công bằng – bình đẳng và đi lên từ năng lực cá nhân.

hợp tác
Giá trị nhân phẩm có một ý nghĩa quan trọng đến khả năng hợp tác.

Một freelancer IT cũng phải chịu nhiều thách thức, sức ép từ các đối thủ để có thể chứng tỏ sức ảnh hưởng và giá trị của mình.

Do vậy, bạn hãy cố gắng hết sức. Đừng làm bạn với những nhân vật đầy chiêu trò. Họ chỉ lợi dụng và ảnh hưởng tiêu cực đến bạn mà thôi.

Người ăn không nói có

Đây là dấu hiệu của những người thiếu cân thành, luôn sống hai mặt. Họ không quá thật lòng đối xử với một ai. Mặt khác họ luôn ngầm quan sát đối phương để nắm bắt những điểm mạnh, điểm yếu.

Xem thêm các việc làm về tuyển dụng Data Scientist 

Họ dễ dàng bia đặt những thứ không có thành có. Đây là kiểu người khó hợp tác vì luôn soi xét các khía cạnh khác nhau. Họ khó đưa ra những ý kiến đồng điệu trong một tập thể và chắc chắn rằng việc nói xấu người khác là một thói quen của họ.

Những cá nhân “chìm đắm” trong sự bi quan

Nếu có những người luôn tràn đầy năng lượng và lan tỏa nó đến mọi người. Ngược lại, sẽ có một kiểu người lại luôn chìm trong sự bi quan. Họ có dấu hiệu sợ hãi và nghĩ qua xa khi gặp một chuyện quá khó khăn nào đó.

hợp tác
Liệu bạn cò phải là kiểu người bi quan?

Chính sự bi quan đó sẽ khiến họ giảm đi những cơ hội thành đạt hơn. Họ sẽ khá e dè và kho nắm bắt tốt, khó bắt nhịp với quá trình phát triển của một nhóm. Do vậy, nếu tiếp xúc với những người này, bạn cần giúp họ cởi mở và thoải mái hơn.

Người “thắng kêu to”

Nói một cách dễ hiểu thì đây là kiểu người khoe khoang về thành tích. Họ luôn tự hào và cho rằng những gì mình làm được quá lớn lao.

Nhưng thực tế, việc bạn thành công sớm hay muộn là do bạn. Và nếu một giây phút nào đó bạn quá tự tin, người khác sẽ vượt mặt bạn. 

Freelancer IT không ngừng hoàn thiện kỹ năng, nếu quá tự tin thái quá, thất bại sẽ đến nhanh hơn với bạn.

Đây sẽ là kiểu người khó hợp tác bởi cái tọi của họ quá lớn. Họ luôn muốn phô bày các ý kiến, quan điểm của mình; thậm chí là áp đặt nó trong việc đi đến các quyết định chung. Tự tin đến mức không ai chấp nhận. Cái họ thiếu chính là sự khiêm nhường và nếu làm việc với họ, các bạn cần giúp họ nhận ra điều này.

Kiểu người sống thiếu trách nhiệm

Nếu là một người chăm chỉ và cầu toàn, bạn có thể một mình làm tất cả mọi thứ mà chẳng cần ai giúp. Nhưng trong một lúc mệt mỏi, bạn sẽ tự hỏi tại sao bạn phải làm cho người khác hưởng? Đối với kiểu người này, họ có thể sống bám vào người khác. Đôi khi họ nổi loạn, cá tính, bốc đồng,…

Xem thêm các việc làm NTQ Solution tuyển dụng

hợp tác
Người thiếu trách nhiệm sẽ khó có thể thành công.

Làm việc freelancer it thì không đúng giờ, trễ dealine, thiếu kỷ luật và không có tinh thần hợp tác. Do vậy, chất lượng và hiệu suất công việc bị giảm đi rõ rệt. Họ dần trở thành đối tượng không tạo được niềm tin từ đồng nghiệp. Việc họ cần thay đổi chính là sống có ý thức, tự giác tuân thủ các nguyên tắc. Đồng thời tự nhìn nhận để tạo ra các giá trị cống hiến tiếp theo trên hành trình sự nghiệp của mình.

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

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

Laravel view xây dựng logic trong giao diện

Laravel view xây dựng logic trong giao diện

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

Tìm hiểu về Laravel View

Trong mô hình MVC, V là chữ viết tắt của View. Nó giúp tách biệt giữa application logic và presentation logic giúp quản lý và phát triển mã nguồn tốt hơn. Các view trong Laravel được lưu trữ trong thư mục resources/views. Chúng ta có thể tạo thêm các thư mục trong thư mục resources/views để phân cấp quản lý, trong các ví dụ ở các bài viết trước chúng ta đã tạo thư mục fontend cho tất cả các view liên quan đến fontend, tạo thư mục backend cho các view liên quan đến quản trị. Bạn có thể tạo các thư mục con ở cấp sâu hơn, ví dụ:

  • resources/views/backend/product: Các view liên quan đến quản trị sản phẩm trên website.
  • resources/views/backend/news: Các view liên quan đến quản trị bài viết trên website.

Các view này có thể chứa mã HTML, CSS, Javascript phục vụ cho hiển thị nội dung cho người dùng.

Tham khảo vị trí tuyển dụng lập trình Laravel lương cao cho bạn

  API Authentication trong Laravel-Vue SPA sử dụng Jwt-auth
  Có gì mới trong bản cập nhật Laravel 5.5.33 vừa ra mắt

Tạo view trong Laravel

View trong Laravel không tạo được bằng câu lệnh php artisan mà chỉ đơn giản là tạo một file mới trong các thư mục con của resources/views với cấu trúc tên file như sau:

tên-view.blade.php

Chú ý phần mở rộng .blade.php là bắt buộc, khi gọi đến view này chỉ đơn giản sử dụng code như sau:

view('tên-view');

Với các view nằm ở các thư mục con, chúng ta sử dụng dấu chấm để ngăn cách giữa các thư mục và tên view. Ví dụ view resources/views/backend/product/create.blade.php sẽ được gọi như sau:

view('backend.product.create');

Ok, chúng ta sẽ bắt đầu với ví dụ về view. Tạo một file test-view.blade.php trong resources/views/fontend với nội dung như sau:

<html>
  <title>Ví dụ Laravel View - Allaravel.com</title>
<body>
  <h1>Ví dụ về view trong Laravel</h1>
</body>
</html>

Tạo một route trả về view này (routes/web.php)

Route::get('test-view', function(){
  return view('fontend.test-view');
});

Ok, vào đường dẫn http://laravel.dev/test-view để xem view hiển thị như thế nào?

Laravel view xây dựng logic trong giao diện

Chú ý, đôi khi chúng ta xóa mất một view hoặc đã thay đổi tên view mà không để ý đến các đoạn mã gọi đến view này, khi người dùng truy cập vào các đường dẫn liên quan đến view này sẽ báo lỗi. Để tránh việc này xảy ra, chúng ta nên kiểm tra sự tồn tại của một view trước khi trả về view đó.

use Illuminate\Support\Facades\View;

Route::get('contact', function(){
  if (View::exists('fontend.contact')) {
      return view('fontend.contact');
  } else {
    return 'Trang liên hệ đang bị lỗi, bạn vui lòng quay lại sau';
  }
});

Truyền dữ liệu cho View

Truyền dữ liệu cho view giúp cho view hiển thị các nội dung động, ví dụ view hiển thị chi tiết một bài viết thì tiêu đề bài viết, nội dung mỗi bài viết khác nhau chúng ta sẽ truyền các giá trị này cho view. Chúng ta hãy xem lại ví dụ về truyền dữ liệu cho view trong bài viết Laravel Controller. Nội dung MainController như sau:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class MainController extends Controller
{
  public function checkRole(){
    echo "<br>2. MainController@checkRole";
    echo "<br>Main Controller: checkRole function";
    echo "<br>Thực hiện sau khi qua bộ lọc Middleware và trước khi gửi HTTP response";
  }

  public function showNews($news_id_string){
    $news_id_arr = explode('-', $news_id_string);
    $news_id = end($news_id_arr);

    // Thực hiện lấy thông tin về bài viết $news_id, bài viết đưa ra ví dụ ở mức đơn giản
    $news_title = 'Bài viết Laravel mới với ID là ' . $news_id;
    // Các xử lý khác

    return view('fontend.news-detail')->with(['news_id' => $news_id, 'news_title' => $news_title]);
  }
}

Có thể truyền dữ liệu vào view bằng phương thức with, tham số truyền vào là một mảng giá trị.

return view('fontend.news-detail')->with(['news_id' => $news_id, 'news_title' => $news_title]);

Khi đó, muốn in nội dung các giá trị này trong view chúng ta đưa các biến này vào dấu {{ }}, xem nội dung view news-detail.blade.php nằm trong resources/views/fontend

<html>
   <head>
      <title>{{ $news_title }}</title>
      <link href = "https://fonts.googleapis.com/css?family=Arial:100" rel = "stylesheet" type = "text/css">
      <style>
         html, body {
            height: 100%;
         }
         body {
            margin: 0;
            padding: 0;
            width: 100%;
            display: table;
            font-weight: 100;
            font-family: 'Arial';
         }
         .container {
            text-align: center;
            display: table-cell;
            vertical-align: middle;
         }
         .content {
            text-align: center;
            display: inline-block;
         }
         .title {
            font-size: 96px;
         }
      </style>
   </head>
   <body>
      <div class = "container">
         <div class = "content">
            <h1>{{ $news_title }}</h1>
            <p>
               ID bài viết: {{ $news_id }}
               <br> Tiêu đề: {{ $news_title }}
               <br> Nội dung: Chưa có nội dung gì cả
            </p>
         </div>
      </div>
   </body>
</html>

Laravel view xây dựng logic trong giao diện

Chia sẻ dữ liệu cho tất cả các View

Có những lúc bạn muốn chia sẻ một dữ liệu để tất cả các view khi được render bởi hệ thống sẽ sử dụng dữ liệu này. Thực hiện bằng cách sử dụng phương thức share() trong phương thức boot() của service provider, đơn giản là thêm vào app\Provider\AppServiceProvider.php

<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        View::share('key', 'value');
    }

    ...
    public function register()
    {
        //
    }
}

Khi đó, trong các view bạn chỉ cần sử dụng {{ $key }} là nó sẽ in ra ‘value’.

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

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

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

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

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

Khi các bạn làm việc với CSS đặc biệt là làm những giao diện liên quan đến nội dung như những đoạn chữ ngắn hay dài. Đôi khi trong thiết kế chỉ hiển thị vài ba chữ làm giao diện trở nên rất đẹp, tuy nhiên khi chúng ta đưa vào dự án, nội dung có thể thay đổi dài hơn hoặc ngắn đi làm cho giao diện chúng ta gặp nhiều vấn đề không mong muốn.

  5 điều phiền toái nhất của CSS
  11 công cụ hữu ích để kiểm tra và tối ưu hóa các file CSS

Vì thế trong bài viết này mình sẽ đi vào các vấn đề đó kèm theo là các kỹ thuật để xử lý chúng một cách hiệu quả để kết quả chúng ta làm ra luôn được kết quả tốt nhất nhé. Bắt đầu thôi nào.

Vấn đề

Trước khi đi sâu vào kỹ thuật để xử lý các vấn đề về nội dung liên quan tới chữ, thì mình sẽ trình bày một vài vấn đề trước cho các bạn dễ hình dung, như ở dưới hình này chúng ta có một vertical menu(menu hiển thị theo chiều dọc)

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Như các bạn thấy là nếu bên trái là theo thiết kế rất chi là đẹp, tuy nhiên nếu nội dung dài ra thì sẽ bị xấu đi một chút. Thì lúc này chúng ta cần đặt ra những câu hỏi như là

  • Chúng ta có nên sử dụng kỹ thuật cắt chữ để hiển thị trên một hàng hay không ?
  • Hay là chúng ta cứ để nó hiển thị thành nhiều hàng ? Nếu có thì hiển thị tối đa bao nhiêu hàng là được hay là thích bao nhiêu hàng cũng được.

Đó là trường hợp có nhiều chữ hơn là chúng ta muốn nhưng nếu nội dung là một chữ nhưng kéo dài thì sao? Mặc định thì chắc chắn nó sẽ tràn ra ngoài Container bao ngoài như này

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Là một Frontend Developer thì chúng ta phải biết cách để giải quyết những vấn đề thế này. Và tất nhiên là trong CSS sẽ có những thuộc tính CSS mà có thể giúp chúng ta xử lý chúng. Như ở trên là mình nói những nội dung dài làm bể layout, tuy nhiên nội dung ngắn cũng có thể luôn nhé nhưng sẽ khác một chút, có thể các bạn thắc mắc là nội dung ngắn sao mà gây ảnh hưởng tới giao diện được chứ, cùng xem giao diện ở dưới đây nha

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Bí kíp tự học thiết kế web hiệu quả chỉ trong 30 ngày mà bạn nên tham khảo( Khoá học của mình, học xong đảm bảo cải thiện trình độ ) bạn nhấn vào đây và đừng quên nhập mã FECOVID để được giảm thêm 100k nha.

Như hai Button ở trên khi nội dung dài bên trái thì giao diện rất là đẹp, nhưng bên phải khi nội dung chỉ có chữ Ok thì nhìn UI nó kỳ kỳ không ổn chút nào cả. Vậy làm sao để giải quyết vấn đề này, có thể sử dụng thuộc tính min-width cho Button được không nhỉ ?

Như bạn vừa mới đọc xong phần vấn đề thì sẽ thấy là không chỉ có những nội dung dài mới làm giao diện bị ảnh hưởng mà những nội dung ngắn cũng sẽ gây ảnh hưởng. Cho nên với việc sử dụng các kỹ thuật trong CSS thì ít nhất chúng ta có thể giảm thiểu được các vấn đề liên quan đến nội dung này. Tiếp tục tìm hiểu thôi nào.

Nội dung dài

Overflow Wrap

Thuộc tính overflow-wrap này sẽ giúp cho chúng ta xử lý khi nội dung chữ bị tràn ra ngoài khi nó quá dài(ví dụ: aaaaaaaaaaaaaaaaaaaa), các bạn xem hình dưới đây sẽ rõ

.card {
  overflow-wrap: break-word;
}

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Hyphens

Một thuộc tính CSS hay ho khác đó chính là hyphens, thuộc tính này sẽ thêm vào dấu  khi chữ dài không vừa với Container bao ngoài, việc thêm dấu  vào tuỳ thuộc vào trình duyệt quyết định là thêm vào khúc nào nên chúng ta sẽ không kiểm soát được nhé.
.element {
  hyphens: auto;
}

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Text Truncation

Nghe cụm từ này thì các bạn có thể hiểu là những thuộc tính CSS nó sẽ cắt chữ sau đó là thêm dấu 3 chấm vào phía sau nha. Coi hình phát là hiểu ngay

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Để làm được kết quả như trên thì không có một thuộc tính nào làm ra được cả mà là bao gồm nhiều thuộc tính CSS kết hợp lại với nhau

.element {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

Multiple Line Text Truncation

Như ở trên là khi chúng ta muốn hiển thị chữ một dòng rồi kết hợp dấu 3 chấm, nhưng trường hợp chúng ta muốn hiển thị nhiều dòng rồi mới có dấu 3 chấm phía sau thì làm sao ? Thì lúc này chúng ta nên sử dụng thuộc tính line-clamp trong CSS để xử lý vấn đề này như sau

.element {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

Để kỹ thuật này hoạt động tốt thì bắt buộc phải sử dụng display: -webkit-box, và thuộc tính -webkit-line-clamp sẽ điền vào giá trị là số dòng mà các bạn muốn hiển thị rồi mới có dấu 3 chấm.

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Tuy nhiên kỹ thuật này sẽ gặp một vấn đề đó là nếu các bạn sử dụng kèm thuộc tính padding thì nó sẽ hiển thị ra kết quả không như mong muốn.

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Cho nên để khắc phục các bạn nên áp dụng kỹ thuật này cho những thẻ mà không có padding. Mình ví dụ các bạn có HTML như sau

<h2>This is long content</h2>

Nếu thẻ h2 có padding và áp dụng kỹ thuật cắt chữ nhiều hàng ở trên thì sẽ bị lỗi đúng không ? Cho nên lúc này để có thể áp dụng được tốt thì trong thẻ h2 các bạn thêm một thẻ khác bọc lại đoạn chữ đó, như thẻ span chẳng hạn rồi áp dụng kỹ thuật trên cho thẻ span là ngon lành.

<h2><span>This is long content</span></h2>

Horizontal Scrolling

Đôi khi không phải lúc nào cắt chữ hay thêm dấu hyphens(-) cho nội dung là cách tốt nhất. Ví dụ nếu các bạn đọc các bài viết ở blog mình và có các đoạn code mình chia sẻ trong một khung hiển thị, thì nếu mình áp dụng các kỹ thuật trên thì sẽ rất kỳ vì code mà rớt dòng từ chữ hay ký tự thì sẽ không hiểu là viết cái gì.

Ở vấn đề này thì cách tốt nhất là không áp dụng các kỹ thuật mà chúng ta vừa nói đến ở trên mà chỉ đơn giản là cho phép người dùng scroll ngang là được với thuộc tính overflow-x: auto như này

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Nội dung ngắn

Vấn đề nội dung dài chúng ta đã tìm hiểu và áp dụng các kỹ thuật CSS vào rồi. Ở mục này chúng ta sẽ tìm hiểu các vấn đề liên quan tới nội dung ngắn nha.

Thiết lập độ rộng tối thiểu

Giờ thì quay lại vấn đề mà mình đã đề cập ở đầu bài. Làm sao để có thể xử lý vấn đề này cho Button để giao diện của chúng ta trông ổn hơn khi nội dung Button quá ngắn

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Cách đơn giản nhất là sử dụng thuộc tính min-width cho Button là xong. Lúc này thì giao diện của chúng ta sẽ ổn hơn rất nhiều.

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Các ví dụ thực tế

Profile Card

Như giao diện thông tin cá nhân dưới đây thì sẽ nảy sinh nhiều vấn đề, giả sử trong thiết kế chỉ có một hàng nhưng ra ngoài nội dung dài quá thì sao ? Chúng ta nên dùng single line truncate hay multiple lines truncate, cái này tuỳ thuộc vào yêu cầu của sếp hay khách hàng nha keke.

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

/* Solution 1 */
.card__title {
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
}

/* Solution 2 */
.card__title {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

Chúng ta có giải pháp rồi, chỉ áp dụng vào thôi, nếu họ cần một dòng thì áp dụng giải pháp 1, còn nhiều dòng thì áp dụng giải pháp 2. Thế thôi!

Article Content

Khi chúng ta làm việc với nội dung mà hiển thị ở trên điện thoại, và trong nội dung đó có thẻ a(link) với nội dung cực dài, tất nhiên là giao diện chúng ta sẽ bị ảnh hưởng thôi.

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Để giải quyết vấn đề này thì chúng ta có thể áp dụng một trong hai cách chúng ta đã nói đó chính là overflow-wrap hoặc hyphens

.article-content p {
  overflow-wrap: break-word;
}

Shopping Cart

Khi các bạn làm việc với giỏ hàng, trong giỏ hàng có thông tin sản phẩm với giao diện gồm có hình ảnh, tên sản phẩm và nút xoá, nếu các bạn không chú ý thì lỡ tên sản phẩm quá dài thì sẽ dính vào nút xoá như này

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Để khắc phục nó cách đơn giản là dùng padding-right hay margin-righrt là xong xuôi

.product__name {
  margin-right: 1rem;
}

Flexbox And Long Content

Đây là một vấn đề rất hay gặp khi chúng ta làm việc với flexbox khi chúng ta có nội dung nằm trên một hàng nhưng nội dung một bên quá dài làm ảnh hưởng phần tử bên kia như này

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

<div class="user">
  <div class="user__meta">
    <h3 class="user__name">Ahmad Shadeed</h3>
  </div>
  <button class="btn">Follow</button>
</div>
.user {
  display: flex;
  align-items: flex-start;
}

.user__name {
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
}

Chúng ta có thể áp dụng các kỹ thuật đã bàn tới nhưng nó lại không hoạt động, nội dung vẫn bị dài ra và làm ảnh hưởng tới giao diện

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Bí kíp tự học thiết kế web hiệu quả chỉ trong 30 ngày mà bạn nên tham khảo( Khoá học của mình, học xong đảm bảo cải thiện trình độ ) bạn nhấn vào đây và đừng quên nhập mã FECOVID để được giảm thêm 100k nha.

Lý do chính là khi chúng ta làm việc với flexbox thì flex item sẽ không shrink(co lại) dưới độ rộng tối thiểu của nội dung. Để giải quyết nó thì chúng ta sẽ áp dụng min-width: 0 cho thằng bao ngoài user__name là user__meta là ngon lành
.user__meta {
  /* other styles */
  min-width: 0;
}

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Các bạn có thể thắc mắc là tại sao min-width: 0 lại hoạt động khi sử dụng cho flex item trong flexbox, mình xin giải thích cho các bạn luôn nha.

Giá trị mặc định của thuộc tính min-width là auto, có thể hiểu là được tính là 0. Khi một phần tử là flex item(phần tử nằm trong phần tử có sử dụng flexbox), thì giá trị của min-width lúc này không được tính là 0 nữa. Mà độ rộng tối thiểu của flex item lúc này bằng độ rộng của nội dung của nó, tức là nó dài bao nhiêu thì min-width lúc này sẽ bấy nhiêu luôn. Các bạn xem ví dụ này

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Lúc này các bạn sẽ thấy là tên người dùng(class ví dụ là c-person__name) rất là dài cho nên sẽ làm cho nội dung bị tràn và xuất hiện scroll ngang cho nên lúc này mình áp dụng các kỹ thuật đã học vào để cắt chữ lại cho giao diện ổn hơn như sau

.c-person__name {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

Nhưng mà do đây là flex item cho nên nó sẽ không hoạt động, vì thế chúng ta phải dùng thêm thuộc tính min-width để giải quyết nó

.c-person__name {
  /*Other styles*/
  min-width: 0;
}

Tada! Chúng ta sẽ có kết quả đẹp như mong muốn

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Tạm kết

Mình hi vọng với bài viết này sẽ giúp các bạn nâng cao kiến thức hơn, biết thêm nhiều kỹ thuật mới hơn để có thể xử lý nhiều vấn đề về giao diện mà liên quan tới nội dung nhé.

Bài viết này mình đã xin phép tác giả Ishadeed và xin được viết lại dưới ngôn ngữ tiếng Việt để có thể giúp các bạn hiểu hơn từ bài viết gốc ở đây.

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

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

Xem thêm tuyển dụng CSS hấp dẫn trên TopDev

SQL vs NoSQL – Nên chọn gì để quản trị cơ sở dữ liệu

Sql vs NoSql

Bài viết được sự cho phép của tác giả Edward Thiên Hoàng

Trong thế giới của CSDL hiện tại ta có hai loại giải pháp chính đó là: SQL và NoSQL (cơ sở dữ liệu quan hệ và cơ sở dữ liệu phi quan hệ). Cả hai đều rất khác nhau về cách chúng được xây dựng, loại dữ liệu nó chúng lưu trữ và cả cách thức lưu trữ dữ liệu của chúng.
Cơ sở dữ liệu quan hệ lưu trữ những dữ liệu có cấu trúc rõ ràng ví dụ như danh bạ điện thoại thì sẽ chắc chắn sẽ chứa tên người và số điện thoại của người đó.

Còn cơ sở dữ liệu phi quan hệ lưu trữ giữ liệu không có cấu trúc, cấu trúc của nó rất động và phân tán, ví dụ như chứa một tệp tài liệu (document) về người dùng như số điện thoại, địa chỉ, hay những activity của họ trên Facebook hay các trang mua sắm trực tuyến. Dữ liệu của nó thường dưới dạng key-value dạng JSON, và những document có thể được tạo mà không cần phải xác định trước cấu trúc.

SQL

CSDLQH chứa dữ liệu theo dạng dòng (rows) và cột (columns). Mỗi dòng sẽ chứa những thông tin của dữ liệu và mỗi cột sẽ chứa những đặc điểm của dữ liệu, giữa các bảng có thể có liên kết với nhau qua khóa ngoại (foreign key). Một số CSDLQH phổ biến là MySQL, Oracle, MS SQL Server, SQLite, Postgres, MariaDB và IMB D2.

Tham khảo ngay các SQL Developer Jobs tại đây

NOSQL

NoSQL được phân thành 4 loại chính sau:

Key-Value Stores

Dữ liệu sẽ được lưu dưới dạng cặp key-value, với ‘key’ là thuộc tính duy nhất để liên kết với giá trị (value) của nó. Các Key-Value stores nổi tiếng bao gồm Redis hay Amazon DynamoDB.

System Design Cơ Bản - Sql vs. Nosql

Document Databases

Là DB chứa dữ liệu dạng theo kiểu các tệp tài liệu (document) để thay thế cho kiểu dòng và cột trong table và nhiều document gộp lại sẽ thành một Collection. Khác với kiểu table là mỗi document sẽ chưa các dạng cấu trúc khác nhau. Ví dụ trong MongoDB thì mỗi document sẽ chứa dữ liệu kiểu JSON, tức là mỗi document là một JSON. Document DB tiêu biểu hiện tại có MongoDB và CouchDB.

System Design Cơ Bản - Sql vs. Nosql

Wide-Column Databases

Wide-Column hay còn gọi là Big-Table là mô hình dữ liệu để lưu trữ dữ liệu với khả năng mỗi rows chứa rất nhiều column(cột) mỗi cột lại là một cặp key-value, và ở đây số lượng cột là tùy biến (dynamic) cho mỗi rows, có nghĩa là số cột ở mỗi rows là khác nhau. Có thể thấy nó giống như kiểu key-value hai chiều với mỗi key lại chứa nhiều cặp key-value bên trong. Các Wide-Column DB tiêu biểu bao gồm Cassandra hay HBase.

System Design Cơ Bản - Sql vs. Nosql

Graph Databases

DB dạng này sẽ lưu dữ liệu dạng cấu trúc dữ liệu kiểu đồ thị (graph) để biểu thị mối quan hệ giữa các dữ liệu với nhau. Dữ liệu được lưu vào các nodes (entities) và thuộc tính của node, liên kết giữa các nodes sẽ qua các lines. Graph DB phổ biến có Neo4J và InfiniteGraph.

System Design Cơ Bản - Sql vs. Nosql

Mô tả quan hệ trên Facebook của người dùng sử dụng Graph DB

  NoSQL là gì? Điểm mạnh vượt trội của NoSQL

SỰ KHÁC NHAU GIỮA SQL VÀ NOSQL

Lưu trữ — Storage

– SQL lưu trữ dữ liệu trong các bảng (tables) trong đó mỗi row đại diện cho một thực thể dữ liệu (entity), và mỗi column sẽ chứa các thuộc tính của entity; ví dụ nếu ta chứa dữ liệu của thực thể xe hơi (car entity) ta sẽ lưu trữ vào một bảng dữ liệu có nhiều column đại diện cho đặc điểm của chiếc xe đó như “màu” “nhãn hiệu” “hãng sản xuất” …
– NoSQL lưu trữ dữ liệu trên rất nhiều loại cấu trúc dữ liệu khác nhau như đã bàn bên trên như dạng key-value, document hay graph.

Lược đồ dữ liệu của thực thể — Schema

– Trong SQL thì mỗi bản ghi có schema là cố định, tức là mỗi column trong table phải được định nghĩa từ trước khi tạo bảng, và mỗi khi dữ liệu được thêm vào một row thì các column của nó phải có giá trị (chấp nhận giá trị NULL). Các schema có thể được thay đổi sau đó (alter table), nhưng sự thay đổi này phải nằm ở phía Database và khi DB thực hiện thay đổi này nó sẽ offline tạm thời.
– Trong NoSQL, schema là động (dynamic) có nghĩa là ta không cần phải định nghĩa một schema nào trước mà schema sẽ được dựa vào cấu trúc của records được đưa vào.

Truy vấn — Querying

– SQL truy vấn thông qua một ngôn ngữ truy vấn mang tính cấu trúc được gọi là Structured Query Language (SQL) thao tác với dữ liệu. SQL là một ngôn ngữ rất mạnh mẽ và lâu đời là đại diện duy nhất cho toàn bộ các RDBMS khác nhau.
– NoSQL truy vấn của nó thường được gọi là UnSQL (Unstructured Query Language) mỗi dạng NoSQL khác nhau sẽ có cấu trúc cú pháp (syntax) khác nhau để có thể lấy ra các dạng dữ liệu khác nhau (collection, key-value, node …)

Khả năng mở rộng — Scalability

– Trong hầu hết các RDBMS thì khả năng mở rộng là theo chiều ngang (vertically scalable) ví dụ như tăng sức mạnh phần cứng của máy chủ hiện tại (tăng CPU, Ram…), tất nhiên rằng cách làm này rất đắt đỏ cũng như tốn thời gian mà đặc biệt là nó luôn có giới hạn nào đó.
– Còn với NoSQL DB thì hỗ trợ rất tốt cho mở rộng theo chiều dọc (horizontally scalable), có nghĩa là đơn giản chỉ thêm server vào các nodes hiện có, cách làm này đơn giản cũng như rẻ tiền hơn. Phần lớn các NoSQL DB công việc này đã được hỗ trợ sẵn và được làm tự động, có nghĩa là rất dễ để triển khai.

Độ tin cậy — Reliability

– Hầu hết các RDBMS đều tuân thủ theo các thuộc tính của ACID (atomicityconsistencyisolation, và durability) vì vậy nó rất đảm bảo độ tin cậy và bảo toàn dữ liệu.
– Còn với NoSQL thì đa phần sẽ hy sinh tính chất ACID để đánh đổi với performance (hiệu năng) và khả năng mở rộng (scalability).

KHI NÀO THÌ CHÚNG TA SỬ DỤNG SQL HAY NOSQL

SQL hay NoSQL đều có những tính chất khác nhau phục vụ cho những nhu cầu đặc biệt khác nhau, do vậy không có DB nào thực sự là hoàn hảo phù hợp cho mọi nhu cầu tùy vào mục đích của hệ thống sở tại. Ngay cả khi hiện tại NoSQL đang trở nên phổ biến rộng rãi về tốc độ và khả năng mở rộng, nhưng vẫn có tình huống mà một SQL DB sẽ hoạt động tốt hơn (ví dụ hệ thống về giao dịch tiền tệ cần đảm bảo về tính ACID)

Lý do sử dụng SQL DB

1. Ứng dụng yêu cầu sử lý dữ liệu theo các transaction để tuân thủ tính ACID để bảo toàn tính nhất quán và toàn vẹn của dữ liệu bằng cách quy định các thuộc tính ACID bắt buộc khi thực hiện một transaction, ví dụ như các hệ thống về tài chính hay thương mại điện tử.
2. Nếu ứng dụng của hệ thống được xác định trước cấu trúc dữ liệu, và nghiệp vụ không đòi hỏi sự mở rộng trong tương lai và đòi hỏi sự nhất quán (consistent) trong dữ liệu.

Lý do sử dụng NoSQL DB

1. Hệ thống đòi hỏi cần lưu một số lượng cực lớn dữ liệu không có cấu trúc rõ ràng ngay từ đầu và tăng dần theo thời gian. Lúc này NoSQL là sự lựa chọn tốt nhất vì tính không rằng buộc trong kiểu dữ liệu (data type) bằng cách lưu trữ dữ liệu dạng document và tính chất mở rộng theo chiều ngang (horizontally scalable).

2. Các hệ thống cần phát triển nhanh (rapid development). NoSQL rất phù hợp với rapid development bởi vì nó không cần mất thời gian chuẩn bị (cấu trúc DB, cấu trúc bảng cột…). Nếu chúng ta cần làm việc với hệ thống nghiệp vụ chưa thực sự rõ ràng ngay từ đầu và đòi hỏi sự linh hoạt thay đổi “data type” giữa các sprint mà không ảnh hưởng cũng như đòi hỏi sự thay đổi hay độ trễ (downtime) tới hệ thống giữa các version, lúc này cơ sở dữ liệu quan hệ (RDBMS) sẽ làm chậm chúng ta lại.

3. Hệ thống được xây dựng và lưu trữ dữ liệu trên Cloud Computing. Lưu trữ dữ liệu trên Cloud là một giải pháp tiết kiệm chi phí tuyệt vời nhưng đòi hỏi dữ liệu phải lưu trữ đồng thời trên nhiều máy chủ để mở rộng quy mô (scale up). NoSQL như Cassandra được thiết kế tối ưu cho việc này mà không cần ta phải động tay động chân quá nhiều.

(*) Bonus: Bên trên tôi nhắc khá nhiều về transaction và ACID, vậy hãy đi qua một chút thế nào là một transaction và ACID?

Một transaction là một quá trình xử lý từ khi bắt đầu tới khi kết thúc thỏa mãn bốn tính chất ACID. Bốn chữ đó viết tắt của bốn tính chất quan trọng sau:

  • Atomicity: tính “nguyên tử” của giao dịch. Nghĩa là mọi giao dịch chỉ thành công khi tất cả các phần thành công All or Nothings.
  • Consistency: tính nhất quán. Nghĩa là mọi dữ liệu được thao tác đều nhất quán với tất cả các quy tắc (rules), các ràng buộc (constraint)… trong toàn bộ quá trình xử lý từ khi bắt đầu tới khi kết thúc.
  • Isolation: tính cô lập. Nó đảm bảo việc thực thi đồng thời của các giao dịch chỉ có thể có kết quả khi các giao dịch được thực hiện tuần tự. Ví dụ: hai giao dịch cùng sửa một table, thì các giao dịch đó phải được thực hiện tuần tự, giao dịch này xong mới tới giao dịch kia.
  • Durability: tính bền. Nghĩa là mọi giao dịch khi commit thì kết quả nó phải được đảm bảo, cho dù ứng dụng bị tắt, mất điện server.

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

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

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

Để tự động hóa kiểm thử thành công – Phần 2

Để tự động hóa kiểm thử thành công – Phần 2

Bài viết được sự cho phép của vntesters.com

Theo Hans, dịch từ opensource.com

Phần 1

Tôi sẽ mô tả một vài bước mà có thể giúp chúng ta giảm thiểu những vấn đề này. Một kiểm thử tự động tốt là dựa trên mệt thiết kế tốt. Cách chúng ta thiết kế kịch bản kiểm thử có tác động lớn đến cách tự động hóa kiểm thử của chúng ta. Nói cách khác, kiểm thử tự động không phải là một thách thức về kỹ thuật mà là thách thức về thiết kế. Nhìn toàn diện, có hai cấp độ lớn của một thiết kế kiểm thử tốt:

  • Cấu trúc của toàn bộ kịch bản kiểm thử
  • Thiết kế của từng kịch bản kiểm thử riêng biệt
  Các mức độ kiểm thử được sử dụng trong kiểm thử chức năng của một phần mềm
  Kiểm thử một đối tượng Textbox

Về cấu trúc của toàn bộ kịch bản kiểm thử, chúng tôi đi theo cách tiếp cận dạng modul, một cách tiếp cận tương tự như cách ứng dụng được thiết kế. Mỗi kịch bản kiểm thử được tổ chức trong một modul kiểm thử. Chúng tôi có các bản mẫu hướng dẫn chi tiết để làm như vây, nhưng tối thiểu, bạn nên thử phân biệt các kiểm thử nghiệp vụ và kiểm thử tương tác. Các kiểm thử chức năng nên thiên về các đối tượng nghiệp vụ và các luồng hoạt động của nghiệp vụ, bỏ qua hoàn toàn bất kỳ kiểm thử hướng giao diện (hay dịch vụ API). Kiểm thử tương tác nhìn vào tính tương tác của ứng dụng từ người dùng hay các hệ thống/ứng dụng khác, do đó giao diện là vấn đề cần quan tâm. Mục tiêu chính là để bỏ qua việc pha trộn các kịch bản kiểm thử nghiệp vụ và tương tác, mà ở đó, mức độ chi tiết của kịch bản kiểm thử tương tác sẽ quá phức tạp để có thể hiểu và duy trì.

Một khi các modul kiểm thử được xác định, chúng có thể được tự động hóa bất cứ khi nào thuận tiện. Thông thường, các kịch bản kiềm thử nghiệp vụ có thể được tạo ra sớm, bởi vì nó phụ thuộc vào các quy tắc nghiệp vụ nhiều hơn cách mà ứng dụng hiện thí chúng ở giao diện. Kiểm thử tương tác có thể được tạo ra khi nhóm phát triển xác định được giao diện và các dịch vụ API.

Một cách có hiệu quả khác là kiểm thử theo hướng BDD hoặc từ khóa (hành động). Trong BDD, kịch bản được viết với định dạng như ngôn ngữ tự nhiên. Các từ khóa là các hành động và so sánh được định nghĩa với các bước cần được làm trong từng bước của kịch bản kiểm thử. Trong cách tiếp cận ABT, các hành động được viết với một định dạng bảng để các bước trong kiểm thử dễ đọc và dễ duy trì hơn so với việc viết kịch bản kiểm thử với ngôn ngữ lập trình. Từ việc sử dụng các từ khóa làm cho kịch bản kiểm thử rõ ràng và dễ quản lý hơn các câu lệnh dài dòng, tôi đã tạo ra một công cụ cho phép chuyển đổi giữa hai định dạng, kết hợp lợi ích của cả hai thế giới: từ khóa và câu lệnh lập trình. Các bạn có thể tham khảo thêm bài viết của tôi cho Techwell Insights về BDD và từ khóa.

Hình dưới đây mô tả cách kiểm thử được quản lý với ABT, với các modul kiểm thử và hành động bên trong nó. Chú ý rằng có sự phân biệt giữa kiểm thử nghiệp vụ và kiểm thử tương tác. Sự tự động hóa tập trung chủ yếu vào việc thiết lập các hành động.

Để tự động hóa kiểm thử thành công – Phần 2

Một yếu tố quan trọng khác để xác định sự thành công của kiểm thử tự động là khả năng kiểm thử của hệ thống. Ứng dụng của chúng ta nên coi việc tạo điều kiện cho việc kiểm thử là một việc quan trọng. Một nhóm Agile rất thích hợp để đạt được điều này khi mà mọi người trong nhóm phát triển đều hợp tác để cho ra một sản phẩm cuối cùng. Tuy nhiên, với các dự án mã nguồn mở không nhất thiết sẽ có một nhóm như vậy, và quyền sở hữu sản phẩm sẽ quyết định khả năng kiểm thử của sản phẩm.

Về khả năng kiểm thử của hệ thống, các bạn có thể tham khảo thêm ở đây. Các khía cạnh chính của khả năng kiểm thử của hệ thống bao gồm:

  • Thiết kế tổng hợp của ứng dụng (bao gồm rõ ràng các thành phần, dịch vụ, v.v…)
  • Tính năng cụ thể của ứng dụng (như API hay các thuộc tính thời gian, tính đơn nhất và ổn định của đối tượng giao diện, các dữ liệu đầu vào và sự kiện của ứng dụng, v.v…)

Tự động hóa là một thách thức, đặc biệt là với giao diện. Tuy nhiên, nó không thể – hay không nên – bị bỏ qua bởi vì nó khó. Hợp tác giữa tất cả mọi người tham gia vào dự án có thể dẫn đến một kết quả tốt, ổn định, dễ duy trì và hiệu quả.

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

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

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

System Design Cơ Bản: Mô hình về tính nhất quán Acid và Base

Mô hình nhất quán dữ liệu

Bài viết được sự cho phép của tác giả Edward Thiên Hoàng

Khi nói đến cơ sở dữ liệu NoSQL, các mô hình nhất quán dữ liệu đôi khi có thể khác biệt đáng kể so với các cơ sở dữ liệu quan hệ được sử dụng (cũng như khá khác biệt so với các cơ sở dữ liệu NoSQL khác).

Hai mô hình nhất quán phổ biến nhất được biết đến bởi các từ viết tắt ACID và BASE. Mặc dù chúng thường đọ sức với nhau trong một trận chiến để giành chiến thắng cuối cùng, cả hai mô hình nhất quán đều có ưu điểm – và nhược điểm – và không phải lúc nào cũng phù hợp hoàn hảo.

  12 Thư viện JavaScript trực quan hoá dữ liệu hot nhất năm 2024
  Crawl dữ liệu bằng JavaScript ngay trên trình duyệt

Chúng ta hãy xem xét kỹ hơn về sự đánh đổi của cả hai mô hình nhất quán cơ sở dữ liệu.

17-1

ACID

Nhiều developer đã quen thuộc với các ACID transaction khi làm việc với các cơ sở dữ liệu quan hệ. Như vậy, mô hình nhất quán ACID đã trở thành chuẩn mực trong một thời gian.

ACID là 1 tập hợp các thuộc tính mà 1 transaction (giao dịch) thao tác với database phải đạt được nhằm bảo đảm tính toàn vẹn, hợp lệ, an toàn, tính bền vững… của dữ liệu ở database.

Nếu 1 transaction không thoả mản 1 trong các thuộc tính này thì sẽ không thể thao tác với database thành công, bị rollback ngay lập tức.

ACID là cụm từ viết tắt của 4 thuộc tính sau: AtomicityConsistencyIsolation và Durability. Giờ cùng nhau tìm hiểu các thuộc tính này nhé:

Atomicity (tính nguyên tử ): dựa vào rule “All or nothing“, như ông bà có câu: được cả ngã về không vậy đó. Khi một chuỗi các transaction lần lượt thao tác với database, nếu 1 transaction đang trong xử lý mà xảy lỗi ở database, hay crash hệ thống, bla bla,… thì toàn bộ các transaction sẽ bị hủy bỏ và bị rollback, dữ liệu ở database vẫn giữ như cũ trước khi có sự thay đổi. Nếu như không xảy ra lỗi hay vấn đề gì trong quá trình xử lý các transaction thì các transaction đó sẽ commit thành công, dữ liệu phía database cũng được cập nhật thành công luôn, nhà trai nhà gái ai nấy đều vui 😀 .

Consistency (Tính nhất quán): 1 transaction phải đảm bảo tính hợp lệ của dữ liệu khi cập nhật vào database. Nếu dữ liệu đưa vào database mà như kiễu dữ liệu không phù hợp, không thỏa mãn constraint, rule, trigger, nhầm table,… thì transaction đó sẽ bị rollback, dữ liệu ở database vẫn được giữ nguyên lúc chưa thay đổi. Chính vì vậy dữ liệu từ transaction phải hợp lệ, đúng đắn, nhất quán với những constraint, cấu trúc table, rule…được định nghĩa hay khai báo từ phía database.

Isolation (Tính cô lập): Mọi thao tác của 1 transaction đều phải được cô lập, tránh xa khỏi “bàn tay” của các transaction khác, kiểu như nhà ai nấy ở, đèn ai nấy sáng vậy đó. 1 transaction này thì không thể đọc dữ liệu ở database mà transaction kia đang update. Nếu 2 transaction đang làm việc đồng bộ với nhau thì sẽ “giả vờ” như đang làm việc tuần tự, 1 transation này sẽ chờ cho đến khi transaction kia commit thành công thì mới bắt đầu xông pha ra mặt trận.

Durability (Tính bền bỉ): Khi 1 transaction update dữ liệu thành công, thì thay đổi của dữ liệu đó phải được đảm bảo lưu trữ ở trạng thái bền vững, vĩnh viễn,…Và ngay cả khi database bị crash, lỗi hay hệ thống restart thì dữ liệu ở database vẫn luôn ở trạng thái thay đổi mới nhất, chính xác.

BASE

Cơ sở dữ liệu NoSQL phù hợp hơn nhiều để lưu trữ dữ liệu như nội dung bài viết, bài đăng trên các kênh media, dữ liệu cần kiểm duyệt và các loại dữ liệu phi cấu trúc khác khó mà xếp vừa trong một bảng. Cơ sở dữ liệu NoSQL được xây dựng với tính linh hoạt, khả năng mở rộng và tuân theo mô hình nhất quán BASE, có nghĩa là:

Basic Availability – Tính sẵn sàng ở mức cơ bản: Trong khi cơ sở dữ liệu đảm bảo tính khả dụng cho dữ liệu, cơ sở dữ liệu có thể không nhận được dữ liệu được yêu cầu, dữ liệu có thể ở trạng thái thay đổi hoặc không nhất quán.

Soft state – Trạng thái mềm: Trạng thái của cơ sở dữ liệu có thể thay đổi theo thời gian.

Eventual consistency – Tính nhất quán: Cơ sở dữ liệu sẽ trở nên nhất quán và dữ liệu sẽ được lan truyền khắp mọi nơi tại một thời điểm nào đó trong tương lai.

Mô hình BASE được xây dựng để tạo ra tính linh hoạt tối đa. Nhưng trên thực tế có một số cơ sở dữ liệu NoSQL vẫn tuân thủ hệ quy chuẩn ACID.

Nhìn chung, mô hình nhất quán BASE cung cấp một sự đảm bảo ít nghiêm ngặt hơn ACID: dữ liệu sẽ nhất quán trong tương lai, tại thời điểm đọc (ví dụ: Rịa) hoặc sẽ luôn nhất quán, nhưng chỉ đối với các ảnh chụp nhanh được xử lý trước đó (ví dụ: Datomic) .

Mô hình nhất quán BASE được sử dụng chủ yếu bởi các aggregate stores, including column family, key-value và document stores

ACID VS. BASE TRADE-OFFS

Không có câu trả lời đúng nào cho việc ứng dụng của bạn cần mô hình nhất quán ACID so với BASE. Các developer và architect nên lựa chọn sự đánh đổi tính nhất quán dữ liệu của họ trong từng trường hợp cụ thể – không chỉ dựa trên những gì chỉ mang tính xu hướng hoặc mô hình nào đã được sử dụng trước đó.

Với tính nhất quán lỏng lẻo của BASE, các developer cần phải hiểu biết nhiều hơn và nghiêm ngặt hơn về dữ liệu nhất quán nếu họ chọn BASE cho ứng dụng.

Mặt khác, việc lập kế hoạch xung quanh các giới hạn của BASE đôi khi có thể là một bất lợi lớn khi so sánh với sự đơn giản của các giao dịch ACID. Một cơ sở dữ liệu ACID đầy đủ là sự phù hợp hoàn hảo cho các trường hợp sử dụng trong đó độ tin cậy và tính nhất quán của dữ liệu là điều cần thiết (ví dụ như ngân hàng).

READ MORE:

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

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

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

Lập trình viên vượt qua rào cản bất lực bằng cách nào?

developer-vuot-qua-rao-can-bat-luc-bang-cach-nao

Ai cũng đã từng trải qua nó.

Sự kiệt sức xảy ra với tất cả chúng ta. Nhưng đầu tiên, làm sao chúng ta phân biệt được giữa kiệt sức và chỉ mệt mỏi đơn thuần? Có rất nhiều nhân tố ảnh hưởng đến việc này.

  • Coding không còn là đam mê sở thích nữa và bạn không thể tập trung làm nó được.
  • Dễ cáu kỉnh (cứ như thể dev chưa đủ chuyện để nóng nảy vậy)
  • Có dấu hiệu trầm cảm

Đây chỉ là một vài trong số nhiều suy nghĩ cảm xúc của một người kiệt sức. Tất cả đều có một điểm chung: Bạn đang bị mắc kẹt một chỗ.

Hằng ngày tôi làm việc nhiều giờ đồng hồ, hiếm khi mới có ngày off. Tôi là chủ doanh nghiệp và là dev duy nhất của các web project. Để có thể hoàn thành các project đúng hạn, tôi thường phải thức rất khuya, hi sinh giờ sinh hoạt và ngủ ít lại.

Chính vì thế mà mọi chuyện còn tệ hơn nữa khi tôi nhận job thứ hai.

Rất nhiều người (nhất là người khởi nghiệp) bị ám ảnh về việc thành công sớm mà hi sinh cả thanh xuân, sức khỏe để làm không ngừng nghỉ. Vượt qua giới hạn của bản thân là tốt nhưng hành hạ nó không đâu là ngu ngốc không đáng.

Sau 6 tuần dằng dẳng làm job thứ hai (kết hợp với việc phải cân bằng project kia), tôi mới nhận ra rằng mình đang lẵng phí thời gian. Tôi làm mà không còn vui thích nữa. Tôi cảm thấy tôi đã phá hủy niềm đam mê tôi từng có. Tôi sẽ như thế này mãi mãi ư?

Câu trả lời là không. Tôi làm rất nhiều thứ khác nhau để hồi phục sau chuyện này. Đây là những gì tôi học được.

Ngừng làm việc quá sức.

Okay fine, tôi biết là câu này quá nhàm chán, nhưng cứ nghe tôi nói đã. Ví dụ bạn là một dev đi làm 5 ngày một tuần từ 9 giờ sáng đến 5 giờ chiều. Làm việc dằng dẳng 8 tiếng một ngày, và có 2 ngày off để làm những việc bạn thích.

Bây giờ tôi sẽ phân chia tính chất công việc ra. Nếu bạn code vì bạn được trả lương cho việc đó (có thể bạn không thực lòng 100% muốn code). Nếu bạn làm dev 40 tiếng một ngày, thì vẫn không sao.

Còn nếu như coding là tình yêu của cuộc đời bạn, hãy học cách biết nghỉ ngơi. Đôi khi hãy code cái gì bạn thích, đưa nó lên các project Open Source. Học cách dừng đúng lúc là điều bạn cần nhất lúc này.

Ưu tiên sức khỏe của mình.

Nói chung programmer là những người không khỏe mạnh. Đây không phải lỗi của chúng tôi nhé. Công việc này không chỉ đòi hỏi hàng giờ gõ máy, mà còn gõ ở nhiều kiểu nhiều mục. May mắn thay chúng tôi có cái “bánh lăn hamster” để vừa code vừa chạy bộ ở bàn làm việc.

Cá nhân tôi thì bởi vì không ảnh hưởng đến tiến độ công việc nên tôi đã mua một thẻ thành viên tập gym và đi tập mỗi ngày trong khi kết hợp giảm cân. Không chỉ tôi cảm thấy đỡ hơn mà cả lúc code cũng tốt hơn rất nhiều. Sau một buổi tập, tôi quyết định viết lại mớ jQuery tôi làm 6 tháng trước, cảm giác tuyệt biết bao.

Thử cái gì đó mới mẻ.

Cuộc sống của tôi là những chuỗi ngày thần kì. Làm, đọc, ngủ, lặp lại. Tôi bắt đầu tập gym vào ban ngày và chạy bộ vào ban đêm để thử cái gì đó khác và tôi cảm thấy cực kì phấn khởi khi quay lại làm việc và làm việc hết mình. Nhờ đó mà dần dần tôi hồi phục khỏi sự bế tắc.

Tôi cùng bạn gái nấu ăn và đi bộ với nhau nhiều hơn. Từ đó cuộc sống của tôi cũng trở nên thú vị hơn hẳn.

Trên đây là những tip giúp phòng tránh căng thẳng. Còn nếu như tôi đã bị thì sao?

Qua quá trình thực hiện những thay đổi trên, lời khuyên tốt nhất tôi có thể cho bạn đó là:

Chìa khóa chính là sự kiên nhẫn. Hãy nói chuyện với người thân về nó.

Trầm cảm là căn bệnh rất nghiêm trọng. Bạn không thể làm việc gì nếu cảm thấy mệt mỏi chán nản với mọi thứ. Sau tất cả bạn sẽ trở nên rất tiêu cực và nghi ngờ bản thân. Tôi chưa bao giờ suy nghĩ nhiều về cuộc đời trong một thời gian ngắn như vậy. Thật buồn.

Bỏ qua những hố đen tiêu cực trong cuộc đời mình, tôi phải không ngừng nhắc nhở bản thân rằng, tôi đã làm việc nhiều đến mức nào để chịu như vậy, thì chắc chắc cũng sẽ tốn rất nhiều thời gian và công sức để thoát khỏi nó. Chính vì thế tôi đã quyết định off 1 tuần để hồi phục lại tâm lý. Đôi khi quá trình hồi phục sẽ chậm hơn một chút nhưng không sao, cứ bình tĩnh đón nhận.

Hãy nói chuyện với người bạn thân yêu nhất về cảm xúc suy nghĩ của mình và để họ giúp bạn trong quá trình hồi phục năng lượng.

  Nếu không biết nói "Không", bạn sẽ chỉ là một "kẻ nô lệ" và mãi "tầm thường"

TopDev

React Native tại Airbnb (Phần 1): Mở đầu

ReactNative Airbnb

Tác giả: Gabriel Peal

Vào năm 2016, chúng tôi đã quyết định dồn hết đầu tư và tâm huyết vào React Native. Và hai năm sau, chúng tôi muốn chia sẻ cho cả thế giới về những trải nghiệm của mình và cả những dự tính của mình trong tương lai.

10 năm trước khi Airbnb ra đời, thì đó là thời kì mới sinh sôi nảy nở của thiết vị smartphone. Kể từ đó, smartphone đã trở thành một thiết bị quá sức cần thiết trong cuộc sống hằng ngày của chúng ta, đặc biệt là khi con người ngày càng vươn xa ra thế giới. Là một cộng đồng cung cấp giải pháp du lịch mới cho hàng triệu người dùng, một app toàn cầu là điều cần thiết. Các thiết bị mobile giờ đây sẽ là ưu tiên hàng đầu, hoặc cũng có thể là công cụ giao tiếp duy nhất mà họ dùng đến khi ở xa nhà.

Khởi điểm với chỉ 3 khách đặt phòng trên đường Rausch Street vào năm 2008, giờ đây con số đã lên đến hàng triệu lượt booking hằng năm. Các app cho phép host (chủ nhà) có khả năng quản lý danh sách đặt nhanh chóng và người đi du lịch nhiều gợi ý và cảm hứng để khám phá các địa điểm mới ngay tầm tay.

Để bắt kịp với lưu lượng sử dụng thiết bị hiện nay, chúng tôi đã phát triển đội ngũ hơn 100 kĩ sư mobile xuất sắc nhất để mang đến những trải nghiệm người dùng mới tuyệt vời hơn và cải thiện cái sẵn có.

Tuyển dụng React, việc làm React Native cho SV mới ra trường

“Đặt cược” vào React Native

Chúng ta phải liên tục phân tích các công nghệ mới để cải thiện trải nghiệm người dùng của cả người đi lẫn host tại Airbnb, và maintain được trải nghiệm tốt cho developer. Trong năm 2016, một trong những công nghệ mới đó chính là React Native. Từ đó chúng tôi đã nhận ra được tầm quan trọng của mobile đối với mình nhưng căn bản là không có đủ kĩ sư để hiện thực hoá nó. Vì thế, chúng tôi bắt đầu tìm đến những option thay thế khác. Website của chúng tôi được build chủ yếu dựa trên React – một web framework cực kì hiệu quả và được ưa chuộng rộng rãi tại Airbnb. Chúng tôi xem React Native như một cơ hội mới mở đường cho sự phát triển của mobile cũng như chuyển code đi nhanh chóng hơn bằng cách tận dụng bản chất cross-platform của nó.

Khi bắt đầu đầu tư vào React Native, chúng tôi cũng biết rằng có rất nhiều rủi ro. Chúng tôi đã add vào codebase của mình một platform mới, nhanh hơn nhưng chưa được kiểm chứng mà có thể tách nó ra thay vì hợp nhất nó lại. Mục tiêu của Airbnb với React Native gồm có:

  1. Giúp Airbnb tiến xa nhanh chóng hơn.
  2. Maintain quality bar được viết bằng native.
  3. Viết product code chỉ một lần cho mobile thay vì phải hai lần.
  4. Cải thiện trải nghiệm của developer.

Trải nghiệm của chúng tôi

Trong vòng 2 năm qua, thí nghiệm này đã biến thành một nỗ lực thực sự. Chúng tôi đã build lên một sự kết hợp cực kì bền vững trong app để kích hoạt được nhiều feature phức tạp như các shared element transitions, parallax, và geofencing cũng như các bridge trong cấu trúc hạ tầng phức tạp hiện có như networking, experimentation và internationalization.

Chúng ta đã cho ra mắt một loạt các sản phẩm cho Airbnb dùng React Native. React Native cho phép chúng tôi launch Experiences, một đứa con mới của Airbnb, cũng như hàng tá feature khác từ review đến quà tặng. Đây là thời điểm chúng tôi đã cho ra lò nhiều feature dù cho chưa có đủ kĩ sư để đạt được mục tiêu mình.

Các team khác nhau sẽ có những trải nghiệm khác nhau với React Native. React Native đã được chứng minh là một tool hết sức tuyệt vời mặc dù vẫn tồn đọng nhiều thách thức về kĩ thuật và tổ chức đối với các team khác. Trong series này, chúng tôi sẽ cung cấp một số kinh nghiệm của mình và những dự định trong tương lai sắp tới.

Trong phần 2, chúng tôi sẽ liệt kê một loạt những thứ hiệu quả và không hiệu quả với React Native.

Trong phần 3, chúng tôi sẽ liệt kê một số thách thức tổ chức hiện tại mà chúng tôi đang đối mặt khi build một mobile team xuyên platform.

Trong phần 4, chúng tôi highlight chỗ đứng hiện tại của mình bằng React Native và tương lai của Airbnb.

Trong phần 5, đúc kết những kinh nghiệm sâu sắc nhất về React Native và tận dụng nó tốt hơn.

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

  Tiki đã dùng React Native như thế nào?

  Đi phỏng vấn vị trí React Native cần trang bị những gì?

Hiểu về null, undefined và NaN trong JavaScript

Tác giả: Kuba Michalski

Hiểu rõ các khái niệm cơ bản trong JavaScript là yếu tố then chốt trong quá trình học và sử dụng JavaScript. Trong số đó, ba giá trị đặc biệt thường gây nhầm lẫn là null, undefined, và NaN. Bài viết này sẽ giải thích chi tiết từng khái niệm, sự khác biệt giữa chúng, và cách sử dụng đúng để cải thiện kỹ năng lập trình của bạn.

Nếu bạn muốn hiểu rõ các ví dụ dưới đây, hãy mở DevTools Console bằng cách nhấn Ctrl+Shift+J (Windows / Linux) or Cmd+Opt+J (Mac).

null là gì?

null là một giá trị đặc biệt trong JavaScript, biểu thị rằng một object hoặc address không chứa giá trị nào cả. Đây là một đối tượng và thường được dùng để gán giá trị không xác định cho một biến. Ví dụ, bạn có thể sử dụng null khi muốn xóa bỏ giá trị của một biến, nhưng vẫn giữ lại biến đó.

null

null không phải một kiểu giá trị, null là một trạng thái không có dữ liệu.

null là một trong những giá trị nguyên thủy của JavaScript và được xử lý như một giá trị “falsy” trong các phép toán boolean. Điều này có nghĩa là khi kiểm tra null trong điều kiện if, nó sẽ được coi là false.

Phủ nhận null sẽ return true, nhưng khi so sánh nó với false (hoặc cả true) thì đưa về false.

null là gì

Theo công thức toán căn bản, null value chuyển về 0.

(null)

undefined là gì?

undefined xuất hiện khi một biến đã được khai báo nhưng chưa được gán giá trị. Khi bạn truy cập một biến mà không có bất kỳ giá trị nào được gán, JavaScript sẽ trả về undefined. Điều này cũng áp dụng khi một hàm không trả về giá trị cụ thể. undefined là một kiểu dữ liệu nguyên thủy trong JavaScript.

undefined là gì

Nếu bạn thử theo phương pháp toán tin bằng undefined, bạn sẽ nhận về NaN. Tương tự như null, phủ nhận undefined sẽ trả về true, nhưng so nó với hoặc true hoặc false sẽ trả về false.undefined

Vậy điểm khác biệt null vs undefined là gì?

Giống nhau undefined and null trong Javascript

  • Cùng là giá trị nguyên thủy: Cả null và undefined đều là các giá trị nguyên thủy trong JavaScript.
  • Cùng có giá trị “falsy”: Cả hai giá trị này đều được coi là “falsy” trong các phép toán boolean, nghĩa là chúng sẽ được đánh giá là false trong các câu lệnh điều kiện.

Khác nhau null vs undefined

Kiểu dữ liệu

  • null: Được coi là một đối tượng (object) trong JavaScript.
  • undefined: Là một kiểu dữ liệu nguyên thủy (undefined).

Gán giá trị

  • null: Thường được lập trình viên gán giá trị một cách có chủ ý để biểu thị không có giá trị.
  • undefined: Tự động được gán bởi JavaScript khi biến chưa có giá trị hoặc khi một hàm không trả về giá trị.

Trong toán tin

  • null đưa về 0 khi vận hành bằng toán
  • undefined trả về NaN

Ngoài ra còn một vài thứ khác cần lưu ý.

null vs undefined

Dòng đầu tiên: undefined == null, trả về true vì JavaScript cố gắng chuyển đổi cả hai giá trị về cùng loại.

Dòng thứ hai: undefined === null, cho chúng ta biết “Hãy so sánh với các loại data” (căn bản là check xem cả hai có giống nhau không) và JavaScript cũng đủ thông minh để thấy được sự khác biệt nên nó trả về “false”.

Và dòng cuối cùng: !undefined === !null, cái này thì đơn giản hơn. Vì cả hai giá trị bị phủ nhận đều trả về true, bạn có hai giá trị true, thì cuối cùng nó là true.

Nghe có vẻ hơi sai sai, và thật ra, đó là cái hay của ngôn ngữ này.

Xem ngay những tin đăng tuyển lập trình viên Javascript lương cao

NaN là gì?

Sau khi đã hiểu null và undefined là gì, và sự khác nhau của chúng, chúng ta sẽ nói về giá trị NaN.

NaNNot a Number. Tôi nghĩ tên gọi cũng chính là định nghĩa của NaN, cũng đủ dễ hiểu nhỉ? JavaScript return giá trị này khi cái chúng ta nhận được không phải số.

Ví dụ, bạn muốn lấy giá trị “cucumber” trừ 10 hoặc lấy “R2D2” chia cho 12 vậy.

NaN js

Dưới đây là một số trường hợp bạn nghĩ sẽ nhận dược giá trị này nhưng thật ra thì không:

  • Khi bạn add cái gì đó vào string. Khi JavaScript thấy và sign vào một string, nó cũng tự động chuyển đổi element thứ hai của cả string được add.
nan là gì
  • Khi bạn làm việc với number và boolean. Boolean được chuyển thành 0 và 1. True = 1. False = 0.
nan javascript
true * false giống như 1 * 0 bằng 0

Bây giờ mới là phần hack não. NaN thật ra là một số.

js nan

Vậy là, nó đại diện cho cái nó thiếu. Nói cho thông minh là nó là cái đối nghịch của chính nó.

nan trong js

Vậy nếu như NaN tự so và trả về false, vậy thì ta có so nó với cái gì đi nữa cũng sẽ trả về false. May thay là chúng ta có một function để check xem nó có phải NaN hay không — isNaN().nan in javascript

Tóm lại về null, undefined và NaN trong JavaScript

Giá trị null đại diện cho nothing, một object hoặc address không tồn tại hoặc không có giá trị. Nó chuyển đổi từ 0 trong phương pháp vận hành toán đơn giản và là một global object.
null == false cho chúng ta false.

Property global undefined đại diện cho gá trị ban đầu undefined. Nó cho biết một cái không được gán giá trị; không được xác định. undefined không chuyển đổi bất cứ gì thành số, nên khi dùng nó dùng tính toán số học sẽ trả về NaN.

NaN (Not-A-Number) đại diện một cái không phải là số, mặc dù bản thân nó thật ra là một số. Nó không bằng chính nó và để check xem có NaN không chúng ta sẽ dùng isNaN() function.

Tất cả những cái trên đều là các giá trị mang tính false nên nó sẽ trả về false.

JavaScript rất giỏi chuyển đổi giá trị vì thế bạn cần phải dùng dấu bằng đến 3 lần (===) để đảm bảo cả hai elements không giống nhau.

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

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

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?

Bài viết được sự cho phép của tác giả Lương Văn Phúc

Chào hỏi xã giao

Chào các bạn, cho phép mình giật dòng tít câu view tí nhé. Ngày 28 tháng 8 vừa rồi, Chrome 85 đã chính thức hỗ trợ ảnh AVIF. Bạn thử search nhanh trên Google là sẽ thấy ngay cộng đồng developer háo hức và kì vọng vào nó như thế nào (mình không nói điêu đâu). Vậy AVIF là định dạng ảnh gì và nó có gì đặc biệt so với các định dạng ảnh lâu đời như JPEG hay PNG? Hãy cùng mình tìm hiểu nhé.

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?

Bối cảnh lịch sử

Hiện tại bạn vẫn còn sử dụng ảnh JPEG và PNG chứ? Không phải chỉ mình bạn đâu, mà cả thế giới này vẫn đang sử dụng chúng. Từ các trang web, cho đến các phần mềm, và cả các thiết bị như điện thoại, máy tính bảng… đều mặc định sử dụng định dạng ảnh này.

JPEG ra đời năm 1992, PNG ra đời năm 1996, nay đã là năm 2020 rồi, chẳng lẽ chúng ta không có định dạng ảnh nào tốt hơn để thay thế sao? Mà khoan đã, điều này có gì đáng quan tâm chứ, chúng vẫn rất tốt mà? Hãy cùng mình điểm qua một vài điểm yếu tiêu biểu khi sử dụng ảnh JPEG và PNG nhé:

  • Dung lượng ảnh quá lớn: hiển nhiên ảnh càng nặng thì web load càng chậm, các thiết bị lưu trữ ảnh cũng sẽ mau chóng bị “đầy” nếu các bạn lưu trữ quá nhiều ảnh. Ngoài ra, dung lượng ảnh quá lớn cũng sẽ khiến dung lượng của video lớn theo.
  • Nén ảnh sẽ giảm chất lượng đáng kể: để web load nhanh hơn, ta thường nén ảnh xuống mức “chấp nhận được” (kết hợp với crop), từ vài MB xuống còn vài trăm KB chẳng hạn, hoặc thậm chí xuống vài chục KB. Đây là một practice thường dùng và “chuẩn mực” của bất kì frontend developer nào khi muốn tối ưu trang web của mình. Tuy nhiên bạn sẽ luôn phải đắn đo giữa dung lượng ảnh và chất lượng ảnh. Giá như có một phép màu giúp nén tấm ảnh xuống siêu thấp, nhưng chất lượng vẫn tương đối cao thì tốt biết mấy.
  • Thiếu các chức năng cần thiết: JPEG là ảnh lossy, PNG là ảnh lossess. JPEG không hỗ trợ transparency, PNG thì có. JPEG không hỗ trợ ảnh động, PNG thì . Bù lại thì PNG dung lượng thường lớn hơn JPEG, nên tùy vào mục đích sử dụng, chúng ta thường phải convert qua lại giữa 2 định dạng ảnh này. Giá như có một phép màu giúp trộn tất cả các chức năng trên vào một định dạng ảnh duy nhất thì tốt biết mấy.

Vì thế, từ lâu đã có rất nhiều dự án (của các công ty hoặc nhóm độc lập) nghiên cứu và phát triển các định dạng ảnh mới thay thế cho JPEG và PNG. Một trong số chúng như HEIF, JPEG XR, JPEG XL, JPEG 2000, WebP, AVIF… Trong bài viết này mình sẽ giới thiệu về định dạng AVIF như một ứng viên cực kì sáng giá, tuy nhiên cũng không thể làm ngơ người anh WebP cũng đã rất thành công. Hãy cùng tìm hiểu định dạng ảnh “không mới cũng không cũ” WebP nhé.

Giới thiệu một tí về tiền bối WebP

WebP ra đời năm 2010 và được phát triển bởi Google, và đến nay ảnh WebP đã được hỗ trợ bởi hầu hết các browser. Chắc chắn bạn cũng đã ít nhiều thấy định dạng ảnh này xuất hiện rồi đúng không.

Ảnh WebP có tất cả các chức năng mà mình liệt kê ở trên. Nó vừa hỗ trợ lossy, lossess, transparency (alpha channel), ảnh động… Và điều đặc biệt, nó được nén rất tốt. Theo Google, nó giúp giảm dung lượng ảnh từ 25-34% so với JPEG.

Nếu bạn thường sử dụng công cụ PageSpeed Insights của Google để đánh giá tốc độ web thì chắc hẳn bạn sẽ thường xuyên nhận được lời hướng dẫn convert ảnh của bạn về các định dạng ảnh hiện đại để giảm dung lượng. Thực tế thì công cụ này sẽ thử chuyển tấm ảnh của bạn về WebP và so sánh sự khác biệt về dung lượng rồi mới đưa ra khuyến cáo.

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Gợi ý chuyển đổi định dạng ảnh để tăng tốc độ web của Google

Hậu bối AVIF có gì đặc biệt?

AVIF là viết tắt của “AV1 Image File Format”, và AV1 có thể tạm hiểu là tên của thuật toán nén (không chỉ cho ảnh mà còn cho cả video). AVIF ra đời với sứ mệnh thay thế không chỉ JPEG, PNG hay GIF, mà còn thay thế cả người tiền bối WebP của mình nữa. Đọc đến đây là bạn có thể hiểu ra rằng, AVIF có tất cả các chức năng như WebP mà mình trình bày ở trên, và nó còn “siêu nén” hơn cả WebP nữa. Mình xin liệt kê lại ở đây nếu bạn nào bỏ qua phần giới thiệu WebP ở trên. Các chức năng cơ bản của ảnh đều nằm trong một định dạng duy nhất là AVIF:

  • Hỗ trợ lossy (như JPEG) và lossess (như PNG)
  • Hỗ trợ transparency (alpha channel) như PNG
  • Hỗ trợ ảnh động với định dạng .avifs (như GIF hay APNG)
  • Siêu nén với chất lượng được duy trì tốt (hơn cả người tiền bối WebP)

Có một điều quan trọng bạn cũng nên biết là AV1 và AVIF đều được khởi xướng và phát triển cũng được vài năm rồi, và cũng đã trải qua nhiều cuộc thử nghiệm mang kết quả tốt. Tuy nhiên với góc nhìn của một web developer, nó sẽ chẳng có ý nghĩa gì nếu browser không support ảnh AVIF. Vì thế vào ngày 28-8-2020 vừa qua, Chrome 85 đã chính thức hỗ trợ ảnh AVIF. Ngoài ra Firefox cũng sẽ sớm support mặc định định dạng ảnh này (hiện tại bạn cần bật cờ image.avif.enabled trên firefox để sử dụng). Bạn tham khảo các browser hiện đang support AVIF tại đây

So sánh

Theo kết quả đo của Daniel Aleksandersen tại Ctrl.blog, AVIF có mức giảm dung lượng đáng kể so với JPEG và WebP. Cụ thể AVIF trung bình giảm đến 50% so với JPEG, và 20% so với WebP (bạn có thể suy ra rằng WebP cũng có mức giảm khá tốt là 30% so với JPEG)

Nếu chỉ đưa ra số liệu thôi thì nhàm chán quá, nhìn hình thì sẽ trực quan hơn nhiều phải không. Ở đây mình sẽ chọn một bức ảnh để thử so sánh mức độ nén của AVIF, WebP và JPEG.

Tấm ảnh được đưa lên thớt là tấm ảnh (png) nàng công chúa tóc xù của Disney. Mình tải về với kích thước 800×509, dung lượng 849KB. Vì AVIF vẫn còn kén trình duyệt, nên mình sẽ screenshot lại để mọi người so sánh (sẽ không chính xác lắm), tuy nhiên mình vẫn sẽ đính kèm ảnh gốc nếu bạn nào muốn xem nhé.

Ảnh gốc PNG với 849KB:

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh gốc PNG của nàng công chúa tóc xù là 849KB
Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh JPEG nén đến mức chấp nhận được là 110KB
Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh WebP nén đến mức chấp nhận được là 83.7KB
Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh AVIF nén đến mức chấp nhận được là 78.5KB

Các bạn có thể thấy ảnh AVIF và WebP đều nén khá tốt mà vẫn giữ được chất lượng ở mức chấp nhận được. Thú thật mình không phải chuyên gia nên không thể tùy chỉnh cấu hình để có một so sánh chính xác. Nhưng mình cũng đã cố gắng nén ở mức mà mắt mình thấy hợp lý (góc nhìn của một user thường).

Để bổ sung cho phần so sánh, mình sẽ nén cả 3 tấm ảnh về cùng dung lượng là khoảng 11-12KB, hãy cùng xem kết quả nào:

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh JPEG nén xuống ~11KB
Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh WebP nén xuống ~11KB
Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh AVIF nén xuống ~11KB

Các bạn thấy đấy, nén sâu sẽ giúp dễ dàng nhận ra sự khác biệt giữa các định dạng. Nếu các bạn muốn tìm hiểu sâu hơn thì có thể đọc bài viết của Netflix Techblog. Bài viết này có rất nhiều thông tin hữu ích, cả về mặt kĩ thuật, thông số kĩ thuật cho đến hình ảnh minh họa trực quan.

Tạo ảnh AVIF như thế nào

Hiện tại công cụ tạo ảnh AVIF không nhiều, nhưng may mắn trang Squoosh của Google đã cho phép chúng ta chuyển đổi và nén ảnh sang nhiều định dạng khác nhau với nhiều mức độ nén khác nhau (có cả AVIF và WebP). Nếu bạn nào chưa biết trang web này, thì nó hoạt động khá giống với trang TinyPNG nhưng đặc biệt hơn là bạn có thể tùy chỉnh định dạng và mức độ nén theo ý muốn. Ngoài ra Squoosh còn cho phép bạn so sánh ảnh trước và sau khi chuyển đổi rất trực quan và tiện lợi.

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Webapp Squoosh của Google

Nếu bạn muốn vọc sâu hơn về mã nguồn để encode/decode ảnh AVIF, thì có thể tham khảo thư viện libavif.

Browser support?

Như mình có chia sẻ ở trên, Chrome chỉ vừa mới chính thức hỗ trợ AVIF cách đây chưa đầy 1 tháng, nhưng đó đã là một tín hiệu khả quan. Thêm nữa là Firefox cũng đã hỗ trợ với cờ image.avif.enabled được bật. Sẽ sớm thôi là Edge, Opera hay Safari (riêng Safari thì mình không chắc).

Vậy câu hỏi đặt ra là chúng ta có nên sử dụng AVIF cho web của chúng ta không? Câu trả lời này tùy vào tính chất và mục tiêu dự án của bạn. Tuy nhiên tại thời điểm này, nếu không sử dụng AVIF, việc sử dụng người anh WebP cũng là một việc đáng cân nhắc.

Ngoài ra, có một kĩ thuật khá hay ho và an toàn nếu bạn vừa muốn sử dụng công nghệ mới, vừa muốn hỗ trợ các browser cũ hơn, là sử dụng thẻ picture.

<picture>
  <!-- Nếu browser hỗ trợ AVIF, thì load AVIF -->
  <source srcset="image.avif" type="image/avif">

  <!-- Nếu không hỗ trợ AVIF, thì load WebP -->
  <source srcset="image.webp" type="image/webp">

  <!-- Nếu không hỗ trợ cả 2 định dạng ảnh trên, fallback về ảnh jpeg -->
  <img src="image.jpg">
</picture>

Lời kết

AVIF vẫn còn rất trẻ và vẫn đang được tối ưu cả về thuật toán lẫn tốc độ encode/decode. Vì thế chúng ta hãy mong đợi đến ngày AVIF được phổ biến rộng rãi như cách JPEG và PNG đã từng và đang “bá chủ võ lâm” hiện nay. Tuy nhiên để đánh bại được JPEG hay PNG, web là chưa đủ. Nó cần phải được hỗ trợ mặc định bởi nhiều phần mềm, thiết bị điện tử khác (cả ảnh và video) thì mới mong có thể soán ngôi vương được. Hoặc không, sẽ lại có một định dạng khác ra đời và tiếp tục cuộc hành trình dang dở.

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

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

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

10 Add-on Google Sheets phải có dành cho các Recruiters

Tác giả: DENIS DINKEVICH

Dưới đây là 10 Google Sheet Add-ons mà bất cứ recruiters nào cũng cần có được Topdev tổng hợp cho các bạn đọc tham khảo

YAMM

Add-on này cho phép bạn tạo các campaign được cá nhân hóa và mass email mà không cần truy cập vào tập spam của khách hàng. Track tỉ lệ mở mail/ reply, làm các follow-up dựa trên các nhóm lead cụ thể (ai đã mở/ chưa xem,…)
Ngoài ra nó còn tạo các labels riêng có mỗi campaign để nhanh chóng truy cập data. Dưới đây là một tutorial ngắn về cách nó hoạt động.

Power Tools

Đây là một bộ tool dành cho task hằng ngày: thay đổi case; tổng hợp theo màu; loại ỏ trùng lặp; tách, hợp, so sánh, tìm, dọn data và các tool khác.
Bạn đang phải làm việc với một lượng data khủng? Add-on chính là giải pháp. Nó giúp bạn loại bỏ các email trùng lặp từ list tổng hợp email của ứng viên/ người tham dự,… Và nhiều loại data khác bao gồm trong đó.

Split Names

Nó giúp ta tách họ tên ứng viên nhanh chóng thành nhiều cột họ, tên lót, tên, vị trí và/ hoặc bằng cấp.

Crop Sheet

Nếu như bạn đã chán kéo spreadsheet lên xuống, thì add-on này sẽ giúp loại bỏ các hàng và cột thừa trong sheet.

LinkedIn Profiles Search

Add-on này nên được sử dụng khi bạn có data và muốn tìm các gói profile Linkedin tham khảo.
Nó sẽ không cho bạn link URL trực tiếp đến profile nhưng bạn vẫn có được profile của ai đó trong kết quả search.

Blockspring

Với nó bạn có thể làm bất cứ cái gì trên Spreadsheet. Connect Google Sheet với hàng trăm web app và dịch vụ khác để tự động hóa bớt công việc của bạn.
Có rất nhiều hướng dẫn từng bước sẵn có, nhưng nếu bạn chauw từng nghe đến nó, thì video dưới đây sẽ giúp bạn có cái nhìn tổng thể.

Save As Doc

Convert bất kì Google Sheets spreadsheet nào thành Google Document để cải thiện độ dài các ô text phù hợp.

Files Cabinet

Add-on này list tất cả các file của tập Google Drive vào một spreadsheet, và tự động hiển thị nó trong Awesome Table.

FindThatLead

Nó căn bản là một công cụ hướng sale. Tuy nhiên, bạn sẽ dùng khá nhiều tính năng cho sourcing. Extension của nó cho phép bạn tạo/ đoán email (cả cá nhân và doanh nghiệp) trong contact/ các lead/ list người tham dự,… của bạn ngay trong Google Spreadsheet.
Tạo một account, cài add-on, connect với API key, và bạn đã có thể sử dụng nó rồi.

Text2Link

Convert ô thành link dựa trên data của ô. Một cách nhanh và tiện lợi để link nhiều thông tin hơn.

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

Bài học tôi rút ra được từ việc “clone” ứng dụng Uber

Tác giả: Shai Almog

Như mọi người đọc ở đây sẽ thấy xuất hiện chữ “Clone”, tôi dùng chữ clone để nói về sự giống nhau giữa 2 sản phẩm này, không phải nói về bản sao 1:1. Uber đã là một ứng dụng quá phổ biến rồi, tuy nhiên cá nhân tôi chỉ mất khoảng một tuần để viết tất cả các code có liên quan … Mục tiêu của tôi là tạo ra thứ hoàn thiện và chi tiết hơn.

Tôi đã học được gì?

Trong quá trình làm, tôi đã khám phá ra khá nhiều thứ bất ngờ. Ví dụ như việc team Uber đã sử dụng và tận dụng khá nhiều material design cho ứng dụng chạy native trên iOS này. Ví dụ:

Ứng dụng của Uber trên iOS

Để ý thử nhé, phiên bản này nhìn gần như giống y đúc phiên bản Android, ví dụ như các staple Android UI, floating action button, material design, v.v…

Trước đó tôi từng nghĩ, những thứ như native widgets chỉ giống nhau về phần engagement thôi. Tôi với bạn của mình thường tranh cãi về vấn đề này khá nhiều, tôi thì thiên về phần “native widget feel” nhiều hơn, trong khi Chen bạn tôi lại nghiên hẳn về single UI trên tất cả các platform.

Lần này Uber đã “ủng hộ” và đứng về phía Chen hơn, có thể nói phần UI của Uber được thiết kế gần như 1:1 giữa iOS và Android

Lý do cho triết lý thiết kế này cũng dễ hiểu thôi, họ có thể dùng đi dùng lại cho các platform. Dùng 1 screenshot dùng chung cho cả iOS và Android cho phần tài liệu training. Nói tóm lại, chỉ cần mọi thứ chạy mượt là ngon.

Ở thời điểm Android 2.x và iOS 6.x, sự khác biệt của 2 hệ điều hành này là khá lớn. Ví dụ chuyện có một vài tính năng khác biệt trên Android thôi cũng là một vấn đề. Nói chuyện hiện tại, nếu bạn không quy hết mọi về chung một nhà bằng các công cụ crossplatform thì sẽ khá tốn kém đấy.

Transition vẫn còn nhiều khác biệt

Không biết có phải cố tình hay không, nhưng các transition giữa Android và iOS lại khá khác biệt. Ví dụ như Android thì dùng nhiều material style transition, trong khi iOS dùng cover và slide transition.

Nếu đây là cố tình, thì điều này có nghĩa là cái họ đã tư duy theo kiểu “feel” đập chết cái “look”. Hoặc cũng có thể họ không quan tâm lắm đến mấy cái transition này.

Bug Portability

Đây là màn hình đăng nhập gốc của Uber trên Android:

Cùng một màn hình trên iOS trông giống nhau nhưng lại có lỗi hiển thị:

Ở đây bạn không nhìn thấy phần text “Enter your mobile number”.

Dù Uber có dùng khá nhiều QA. Nhưng rõ ràng ta thấy rằng lỗi hiển thị này xảy ra ở những quốc gia có 3 mã dial digit. Phiên bản Android (phiên bản của tôi) xử lý vụ này ngon hơn hẳn. Tuy nhiên vì nó được mặc định trong lúc phát triển, nên lỗi này họ đã không chú ý tới.

Dù biết rằng Uber có rất nhiều QA. Nhưng lỗi hiển thị này đa phần vẫn xảy ra với những quốc gia có 3 dial digit. Bản Android của tôi build thì không gặp tình trạng này. Có lẽ vì tính “toàn cầu hóa” và hợp nhất như có đề cập ở trên, mà bên phát triển đã không nhìn ra lỗi này, hoặc không sửa được?

Các bản sửa lỗi được thực hiện cho phiên bản Android không được sửa trên iOS.

Có thể bạn muốn xem:

  Flutter là gì? Ưu điểm vượt trội và cơ hội việc làm hấp dẫn

Một số tính năng khó nhằn hơn trên Android

Nếu bạn chạy bản Uber trên iOS, để ý thử phần login screen ở trên, bạn sẽ thấy phần pattern của background sẽ xoay (rotate). Đây là một phần effect nhìn khá bắt mắt và dễ chịu.

Tuy nhiên không hiểu sao họ lại không làm cái hiệu ứng tương tự cho Android, có lẽ là thiếu lập trình viên để triển khai phần này?

Sau một thời gian triển khai thử trên Android, tôi mới nhận ra vì sao điều này không khả thi trên Android. Android gặp nhiều vấn đề ở phân khúc vector graphic, tức là khi bạn thử generate cái path tương tự và chạy rotation effect thì sẽ gặp error, lỗi báo như thế này

“OpenGLRenderer: Path too large to be rendered into a texture”

Một trong những cách xử lý trong trường hợp của tôi là disable hardware rendering. Vấn đề nằm ở chỗ bạn không thể biết được chuyện gì đã xảy ra. Rendering path không show exception nào cả. Đọc code Android liên quan đến lỗi đó cũng không tìm ra nguyên nhân.

Dù không có được hiệu ứng ngon lành như trên iOS thì cũng đành phải chấp nhận sự khác biệt này.

Không có tính năng SMS trên Android

Điều tôi thích nhất của Android chính là việc nó cho developer có nhiều tự do hơn. Đây tuy nhiên, cũng là con dao 2 lưỡi.

Một ví dụ điển hình là SMS interception support. Khi bạn có một tin nhắn SMS activation, Android có thể lấy luôn thông tin trên SMS và skip luôn bước type in.

Vậy mà, phiên bản Uber Android lại không có tính năng đó, chỉ vì họ không dùng native Android activation.

Sau khi đọc nhiều tài liệu, thì tôi mới nhận ra rằng Uber cũng gặp nhiều vấn đề vì “too many permissions”. Tôi không biết liệu bất cập này có phải do API level 23 (nơi cho phép Android dùng permission) hay không? Dù thế nào đi nữa, tôi cũng đã thêm tính năng này vào phiên bản của mình và cải thiện đáng kể phần signup cho sản phẩm.

Điều tôi yêu thích nhất về Android là mức kiểm soát thấp mà bạn nhận được với tư cách là nhà phát triển. Đây là một con dao hai lưỡi nhưng trong một số trường hợp nó đánh bại tất cả mọi thứ khác …

Một ví dụ tuyệt vời là hỗ trợ chặn chặn tin nhắn SMS. Khi bạn có khả năng kích hoạt với SMS, Android có thể lấy được SMS sẽ đến và nhập nó vào.

Đáng ngạc nhiên là ứng dụng Uber bản địa không làm điều đó. Họ không áp dụng tính năng kích hoạt SMS cho Android.

Sau khi đọc một chút, có vẻ như Uber đã nhận được nhiều flak trong nhiều năm cho “quá nhiều quyền cho phép”. Tôi nghĩ họ chỉ quan tâm đến việc cho phép thực hiện các phone call …

Tôi không chắc chắn nếu điều này sẽ áp dụng nhiều như thế nào với mức API 23 (khi Android chuyển sang lời nhắc cho phép). Dù bằng cách nào tôi đã thêm chức năng này vào phiên bản Uber và làm cho quá trình đăng ký trở nên dễ dàng hơn trên Android.

Potrait Lock ứng dụng

Đây là một tính năng mà tôi khá thích, tuy nhiên Uber đã lock tính năng này. Tôi cũng khá hiểu rằng việc cho phép việc xoay landscape trên điện thoại sẽ khiến sinh ra nhiều vấn đề hơn về mặt tính năng. Điều này cũng vô tình chỉ ra một điểm khá hay rằng, Uber tư duy tập trung vào tính năng nhiều hơn là tốn nhân lực vào trải nghiệm này. Rất đáng nể.

Suy ra, triết lý của Uber chính là function over form (chú trọng tính năng hơn). Gạt bỏ những thứ rườm rà không quá cần thiết, tập trung vào các tính năng chủ lực (core functionality)

Họ thay đổi thiên biến vạn hóa

Cho tới khi nhúng tay vào làm sản phẩm tôi mới thấy sự thay đổi liên tục của Uber là như thế nào. Khi mới bắt đầu, nút history được đặt dưới bottom, nhưng sau đó họ lại dời nó lên nằm ở phần search.

Việc dám thay đổi và thể nghiệm là rất quan trọng với một ứng dụng như Uber.

Khổng Minh nói, phải biết MƯỢN!

Tôi dùng khá nhiều từ những thứ đã được phát triển, đa phần là từ Google. Ví dụ như, native Google Maps widget và một vài Google webservices (geocoding, directions, v.v). Tôi còn dùng Twilio và Braintree cho SMS/billing. Với những trợ giúp này, bạn có thể build những tính năng quan trọng của một sản phẩm lớn như Uber trong khoảng dưới 1 tuần

Việc dùng một API như Google Maps cho các tool crossplatform này sẽ giúp bạn giảm nhân lực đáng kể.

Uber trên Android & ứng dụng clone của Uber. Không có gì khác nhau cả…

Tôi thật sự khâm phục các kỹ sư Uber. Đây là một ứng dụng phức tạp với giao diện tuyệt vời.

Sự đột phá luôn bắt đầu từ việc xây dựng một thứ gì đó mới, nhưng cũng không cần quá mới. Chúng ta có thể cải tiến từ những thứ có sẵn và xây dựng những cái kinh khủng hơn. Tôi nghĩ nếu tư duy việc build app như Uber trở nên đơn giản hơn, thì chúng ta sẽ có cơ hội thấy được những ứng dụng còn khủng hơn.

Chúng ta học được gì

  • Uber có giao diện người dùng gần như giống hệt nhau trong iOS và Android
  • Các bản sửa lỗi được thực hiện cho phiên bản Android không được sửa trên phiên bản iOS
  • Dù có giao diện giống hệt nhau, nhưng các tính năng giữa 2 phiên bản có sự khác biệt
  • Họ không sử dụng tính năng kích hoạt SMS trên Android
  • Uber tin thiên về cải thiện tính năng vận hành hơn là form hiển thị.
  • Việc thao tác nhanh chóng và trải nghiệm rất quan trọng đối với một ứng dụng như Uber
  • Với một số trợ giúp từ các công cụ hiện có, việc xây dựng ứng dụng như Uber thực sự không khó.

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

  5 tips cải tiến chất lượng phát triển Mobile App

Instant AJAX Search với Laravel và Vuejs

Tính năng tìm kiếm tức thì (instant search) hiện là một tính năng khá phổ biến trong web và app. Trong bài đăng này, mình cố gắng trình bày các điểm chính của việc xây dựng một component tìm kiếm theo thời gian thực có các tính năng như debounce* hoặc highlighting các kết quả.

* : Các sự kiện input từ người dùng (thông qua mouse, keyboard,…) thường diễn ra với tần suất rất nhanh. Điều này khiến hàm xử lý sự kiện được thực thi rất nhiều và có thể ảnh hưởng đến performance cũng như user experience (UX), đặc biệt khi việc input tác động đến giao diện trang web. Để khắc phục điều này, ta hãy tìm hiểu và ứng dụng phương pháp “Debounce” trong javascript. Để hiểu rõ hơn bạn vào link tại đây để xem.

Mở đầu:

Tiến trình cũng như kết quả của 1 process như sau: chúng ta gõ bất kỳ vào input field và dữ liệu được truyền đến server side bằng AJAX request. Sau đó chúng ta bắt được keyword tại back end và load những dữ liệu phù hợp với truy vấn đã cho.

Tại đây như ta biết là nó đang diễn ra cả 1 tiến trình ngầm bên dưới front lẫn back-end. Vì vậy chúng ta nên làm 1 chút gì đó để giúp cho người dùng cảm thấy sự phản hồi tức thì, khi đó họ sẽ không cảm thấy confuse nữa.

Dựng back-end:

Tạo controller cái nha

<?php // SearchController.php

public function search(Request $request)
{
    $posts = Post::where('name', $request->keywords)->get();

    return response()->json($posts);
}

Như bạn thấy, nó thực sự đơn giản, nhưng chúng ta nên lưu ý 2 điều sau:

– Đầu tiên, chúng ta trả về với một JSON response, sau đó front-end sẽ nhận và xử lý chúng. Chúng ta nên xuất dữ liệu thông qua API cho dễ làm việc với front-end

– Điều thứ hai, vì chúng ta sử dụng $request->keywords nên chuỗi truy vấn sẽ trong như thế này ?keywords=Some+search+query.

Kết quả là chúng ta get được một tập những dữ liệu phù hợp, convert sang JSON và có thể xử lý tại front-end. Ở đây mình sẽ không nói quá chi tiết việc build API nha mà chỉ hướng dẫn anh em giải pháp.

Thực hiện tìm kiếm với Vue

Để đơn giản hóa mọi thứ, chúng ta sẽ chỉ có một đầu vào và một danh sách các kết quả. Bước đầu tiên, chúng ta tạo 1 Vue instance*, sau đó chúng ta thêm một số hành động khi giá trị của đầu vào thay đổi. Hãy xem nó trông như thế nào:

<template>
    <div>
        <input type="text" v-model="keywords">
        <ul v-if="results.length > 0">
            <li v-for="result in results" :key="result.id" v-text="result.name"></li>
        </ul>
    </div>
</template>

<script>
export default {
    data() {
        return {
            keywords: null,
            results: []
        };
    },

    watch: {
        keywords(after, before) {
            this.fetch();
        }
    },

    methods: {
        fetch() {
            axios.get('/api/search', { params: { keywords: this.keywords } })
                .then(response => this.results = reponse.data)
                .catch(error => {});
        }
    }
}
</script>

Rồi có những gì xảy ra với đoạn code trên? Đầu tiên, chúng ta có 1 khúc template, nơi mà ta gắn Vue model và lặp những kết quả. Ở khúc script, ta set up data mà mình muốn sử dụng, cũng như định nghĩa phương thức nạp dữ liệu (fetch method) và wrapper bao quanh một axios request.

Khi giá trị của keywords thay đổi, chúng ta khởi tạo phương thức nạp dữ liệu lại, với keywords mới và list kết quả mới.

Note*: Instance trong lập trình chính là thể hiện của một class. Nếu bạn khai báo một class Phim và khi bạn tạo một object phim thì đối tượng đó chính là một thể hiện của class Phim. Vậy Vue instance là gì? Đơn giản chúng ta có thể coi Vue là một class có tên gọi là Vue, để khởi tạo một Instance thì sử dụng cú pháp var app = new Vue({});

Debounce cho v-model

Có 1 problem trong đoạn code trên, đó là chúng ta fetch data ngay tức thì sau khi người gõ 1 ký tự. Thường thì đa số người dùng gõ nhiều từ hoặc đôi khi cả 1 đoạn văn bản, nhưng vậy thì sẽ request quá nhiều lên server. Cách tốt nhất là chúng ta thực thi phương thức nạp dữ liệu sau khi họ dừng gõ.

Có nhiều cách, cách đầu tiên là lazy modifier. Với v-model modifier, chúng ta có thể thay đổi sync event từ input. Có nghĩa là dữ liệu sẽ được update giá trị mới nếu người dùng thoát focus trong trường input (blur event) hoặc nhấn enter.  Có cách khác là implement 1 debouncer cho v-model, tuy nhiên Vue ver 2 đã không hỗ trợ nó rồi. Không hỗ trợ nên chúng ta nếu lưới thì có thể sử dụng thư viện bên thứ ba là lodash’s (_) debounce , nhưng theo quan điểm mình, nên tự làm 1 giải pháp debounce để tránh phụ thuộc vào thư viện hen.

Vừa rồi mình có tìm được 1 giải pháp khá ngon, bạn vào post này và repo này để xem thêm và lấy code về xài thôi.

Để em nó chạy được, bạn phải add .lazy modifier vào model nha, đừng quên!

Rồi, già sử chúng ta đã tích hợp debounce. Bây giờ chúng ta có thể delay bất kỳ thay đổi nào trên Vue model nếu muốn. Tưởng tượng xem trong quá trình người dùng gõ nhiều ký tự và họ tạm dừng sau đó, nếu không có bất kỳ thay đổi nào trong khoảng thời gian nhất định, chúng ta commit trạng thái cuối cùng cho v-model. Watch method sẽ được kích hoạt và fetch dữ liệu mới.Tất nhiên là chúng ta chỉ phải thực hiện nó 1 lần thay vì hàng chục lần.

Rồi mình thử add delay 300ms nhé:

<input type="text" v-model.lazy="keywords" v-debounce="300">

Highlight kết quả

Từ khía cạnh UX, phần này rất quan trọng. Nếu chúng ta có thể làm nổi bật các kết quả phù hợp với từ khóa nhất định thì đó sẽ là một cách hay để giúp người sử dụng tìm thấy những gì mình muốn.

highlight(text) {
    return text.replace(new RegExp(this.keywords, 'gi'), '<span class="highlighted">$&</span>');
}

Tóm lược

Nói chung là cũng không quá khó mà còn mang lại nhiều lợi ích, nó cho cảm giác phản hồi nhanh cho người dùng, giảm thiểu request lên server tránh ngốn resource. Dưới đây là ví dụ đầy đủ nhưng là dữ liệu tĩnh nhé, không có back-end.

Html:

<div id="app">
	<input type="text" v-model.lazy="keywords" v-debounce="500" placeholder="Tìm kiếm (VD: gõ Vue...)">
	<ul v-if="results.length > 0">
		<li v-for="result in results" :key="result.id" v-html="highlight(result.title)"></li>
	</ul>
</div>

Css:

.highlighted { color: red }

JS:

function debounce(fn, delay = 300) {
	var timeoutID = null;

    return function () {
		clearTimeout(timeoutID);

        var args = arguments;
        var that = this;

        timeoutID = setTimeout(function () {
        	fn.apply(that, args);
        }, delay);
    }
};

// this is where we integrate the v-debounce directive!
// We can add it globally (like now) or locally!
Vue.directive('debounce', (el, binding) => {
	if (binding.value !== binding.oldValue) {
		// window.debounce is our global function what we defined at the very top!
		el.oninput = debounce(ev => {
			el.dispatchEvent(new Event('change'));
		}, parseInt(binding.value) || 300);
	}
});

new Vue({
	el: '#app',
	
	data() {
		return {
			keywords: null,
			posts: [
				{id: 1, title: 'Front-end Performance – Where should we start?'},
				{id: 2, title: 'Vue Calendar Component with Laravel API'},
				{id: 3, title: 'Optimise Your Front-end Workflow with Prepros'},
				{id: 4, title: 'Affinity Designer vs. Adobe Illustrator – Which One is Better for You?'},
				{id: 5, title: 'Implementing Laravel’s Authorization on the Front-End'},
				{id: 6, title: 'Using CodePen Can Boost Your Front-end Development Workflow'},
				{id: 7, title: 'Connecting GitLab, Codeship and Laravel Forge'},
				{id: 8, title: 'Dynamic Author Email with Contact Form 7'},
				{id: 9, title: 'Impersonating Users in Laravel'},
				{id: 10, title: 'Introduction to Affinity Designer'},
				{id: 11, title: 'Using Contenteditable Attribute'},
				{id: 12, title: 'Using Laravel’s Localization in JS'},
				{id: 13, title: 'CSS Gradient Basics'},
			]
		}
	},
	
	computed: {
		results() {
			return this.keywords ? this.posts.filter(result => result.title.includes(this.keywords)) : [];
		}
	},
	
	methods: {
		highlight(text) {
			return text.replace(new RegExp(this.keywords, 'gi'), '<span class="highlighted">$&</span>');
		}
	}
})

Thêm cái jsfiddle run xem sao:

Tham khảo thêm vị trí tuyển dụng kỹ sư Laravel lương cao cho bạn

Các thủ thuật hữu ích mà bạn có thể không biết về Git stash

git

Tác giả: Srebalaji Thirumalai

Nếu đã sử dụng Git trong một khoảng thời gian ắt hẳn bạn đã sử dụng Git stash. Đây là một trong những tính năng hữu ích của Git.

Dưới đây là một số mẹo hữu ích mà tác giả đã rút ra được từ Git stash tuần trước.

Git stash save

Lệnh này giống như Git stash nhưng đi kèm với các tùy chọn khác. Tôi sẽ đưa ra một số điều quan trọng trong bài viết này.

Git stash cùng với message

git stash save “Your stash message”.

Lệnh trên sẽ đưa ra cùng với một message. Hãy cùng nhau xem nó hữu ích như thế nào.

Ẩn các tệp không theo dõi

Bạn cũng có thể ẩn các tệp không theo dõi.

git stash save -u
or
git stash save --include-untracked

Git stash list

Khi bạn dùng Git stash hoặc lưu Git stash, Git thực sự sẽ tạo một đối tượng Git với một số tên và sau đó lưu nó vào repo.

Vì vậy, nó có nghĩa là bạn có thể xem danh sách các “stash” bạn tạo ra.

git stash list

Hãy cùng xem ví dụ dưới đây:

git

                                                   ví dụ về git stash list 

Bạn có thể xem danh sách các stash mới nhất được tạo ra ở đầu trang.

Và bạn có thể thấy rằng phần trên cùng được đưa ra một thông báo tùy chỉnh (sử dụng Git stash lưu “message”).

Git stash apply

Lệnh này sẽ chiếm phần trên cùng trong stack và apply nó vào repo. Trong trường hợp này là stash@{0}

Nếu bạn muốn áp dụng một số stash khác, bạn có thể chỉ định stash id.

Đây là một ví dụ:

git stash apply stash@{1}

Git stash pop

Lệnh này rất giống với stash apply nhưng nó xóa stash từ stack sau khi nó được áp dụng.

Hãy cùng xem ví dụ:

git

Ví dụ về Git stash pop

Như bạn có thể thấy phần trên cùng đã bị xoá và stash@{0} được cập nhật với phần cũ.

Nếu bạn muốn một stash cụ thể để “pop”, bạn có thể chỉ định stash id.

git stash pop stash@{1}

Git stash show

Lệnh này chỉ ra bản tóm tắt của các stash diff. Lệnh trên chỉ xem xét về stash mới nhất.

Dưới đây là ví dụ:

git

Ví dụ về Git stash show

Nếu bạn muốn xem full diff, bạn có thể sử dụng

git stash show -p

Tương tự như các lệnh khác, bạn cũng có thể chỉ định stash id để có được tóm tắt diff.

git stash show stash@{1}

Git stash branch <name>

Lệnh này tạo ra một nhánh mới với một stash hiện thời, và sau đó xóa các stash mới nhất (như stash pop).

Nếu bạn cần một stash cụ thể bạn có thể chỉ định stash id.

git stash branch <name> stash@{1}

Điều này thật sự hữu ích khi bạn gặp rắc rối sau khi đã áp dụng stash vào phiên bản mới nhất của chi nhánh.

Git stash clear

Lệnh này xóa tất cả các stash được tạo ra trong repo này và có thể không thể revert.

Git stash drop

Lệnh này sẽ xoá stash mới nhất khỏi stack, nhưng hãy dùng nó cẩn thận, có thể sẽ khó để revert.

Bạn cũng có thể chỉ định stash id.

git stash drop stash@{1}

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

  Một vài câu hỏi thông dụng về Git thường gặp