Home Blog Page 47

Figma là gì? Top 8 tính năng tuyệt vời của Figma

Figma là gì? Khám phá những tính năng tuyệt vời của Figma

Trong thời đại kỹ thuật số, việc thiết kế UX/UI trở thành một phần không thể thiếu trong quá trình phát triển sản phẩm công nghệ. Với sự ra đời của các công cụ thiết kế việc tạo ra những giao diện đẹp mắt và dễ sử dụng đã trở nên dễ dàng hơn bao giờ hết.

Một trong những công cụ mà bạn không thể bỏ lỡ nếu muốn trở thành một UX/UI designer đó là Figma. Trong bài viết này, chúng ta sẽ tìm hiểu Figma là gì? – một trong những công cụ thiết kế giao diện đồ họa phổ biến nhất hiện nay. Chúng ta sẽ khám phá những tính năng và ưu điểm của Figma, cũng như so sánh nó với các công cụ thiết kế giao diện khác để giúp bạn chọn được công cụ phù hợp nhất cho dự án của mình. 

Figma là gì?

Figma là gì?

Figma là một công cụ thiết kế đồ họa vector có giao diện người dùng trực tuyến dựa trên nền tảng đám mây, cho phép người dùng thiết kế UX/UI, dựng prototypes, phát triển và chia sẻ các thiết kế của họ với các thành viên khác trong nhóm làm việc.

Điểm đặc biệt nhất của Figma chính là khả năng hoạt động trực tuyến, tương tự như Google Docs hay Sheet. Tại đây, nhiều người dùng có thể thao tác trực tiếp trong cùng một file ở cùng một thời điểm. Như vậy, người dùng có thể chỉnh sửa, theo dõi chỉnh sửa một cách dễ dàng và nhanh chóng, tiết kiệm thời gian gửi đi qua lại rườm rà.

Bên cạnh đó, Figma còn có tính năng tương tự như các công cụ thiết kế đồ họa khác, tương thích với cả Window và Mac OS đồng thời tích hợp nhiều chức năng cộng tác và quản lý dự án. Figma được đánh giá cao vì tính đơn giản, dễ sử dụng và khả năng làm việc nhóm hay xử lý công việc từ xa cực hiệu quả.

  Top câu hỏi phỏng vấn Graphic Designer chinh phục nhà tuyển dụng

Lịch sử hình thành Figma

Figma được bắt đầu phát triển vào năm 2012 bởi Dylan Field và Evan Wallace. Ý tưởng ban đầu của họ là tạo ra một nền tảng dựa trên trình duyệt cho người dùng có thể thể hiện sự sáng tạo của họ trong nhiều cách khác nhau. Chương trình bắt đầu vào giai đoạn thử nghiệm vào cuối năm 2015 và được phát hành chính thức vào tháng 9 năm 2016. Kể từ đó, Figma đã phát hành nhiều cập nhật, đáng chú ý nhất là công cụ hợp tác và lập kế hoạch số Figjam.

Lịch sử hình thành và phát triển Figma
Lịch sử hình thành và phát triển Figma

Vào năm 2022, Figma đã hợp tác với Google for Education để đưa cả Figma và FigJam lên Chromebook trong lĩnh vực Giáo dục, cho thấy Figma có thể trở thành nền tảng mặc định cho những nhà thiết kế web trẻ đang phát triển.

Xem thêm video giới thiệu về Figma:

Khám phá những tính năng hấp dẫn của Figma

Figma được nhiều “ông lớn” trên thế giới sử dụng có thể kể đến như Twitter, Microsoft, Dropbox, GitHub,… bởi khả năng hỗ trợ công việc cực kỳ hiệu quả. Hãy cùng TopDev khám phá một số tính năng ưu việt của Figma nhé!

Đồng bộ trực tuyến, theo dõi công việc real-time

Figma cho phép người dùng thiết kế, phát triển và chia sẻ các thiết kế của họ trên nhiều thiết bị và định dạng khác nhau mà không cần phải cài đặt phần mềm đồ họa trên máy tính của mình. Mọi thay đổi trên file thiết kế sẽ được cập nhật ngay lập tức, bạn cũng có thể xem lại lịch sử chỉnh sửa một các dễ dàng.

Thêm nữa, khi có một người dùng truy cập vào phần mềm, Figma sẽ hiển thị avatar của người đó, chỉ cần bạn click vào thì lập tức sẽ chuyển đến vị trí người dùng đó đang làm việc. Tính năng này cực hữu ích giúp nhà quản lý nắm bắt được tiến độ công việc của các thành viên trong team.

theo dõi công việc real-time

Hỗ trợ lưu trữ đám mây (Cloud-based Storage)

Figma là một ứng dụng dựa trên đám mây, cho phép tất cả các dữ liệu thiết kế được lưu trữ an toàn trên internet. Điều này không chỉ giúp bảo vệ dữ liệu khỏi mất mát do sự cố phần cứng mà còn cho phép truy cập và chia sẻ dễ dàng từ bất kỳ địa điểm nào có kết nối internet. Người dùng có thể làm việc trên các dự án của mình mà không cần lo lắng về việc sao lưu dữ liệu thường xuyên hay hết dung lượng lưu trữ trên thiết bị cá nhân.

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

Figma hoạt động trực tiếp trên trình duyệt mà không cần cài đặt app, cho phép người dùng truy cập và làm việc từ bất kỳ đâu chỉ với kết nối internet. Điều này giúp tiết kiệm thời gian và không gian lưu trữ trên thiết bị.

Ngoài ra figma có cả bản thiết kế App cho Desktops có thể hoạt động hiệu quả trên mọi nền tảng từ Windows, MacOS cho đến Linux hay Chromebooks. Tất cả người dùng có thể thao tác, chỉnh sửa file Figma dễ dàng bằng bất cứ hệ điều hành nào. Bên cạnh đó, Figma còn cung cấp các phiên bản trên điện thoại, cho phép người dùng theo dõi các dự án của mình ở bất kỳ đâu.

Tham khảo việc làm UX/UI Design hấp dẫn trên TopDev

Thiết kế Responsive và Tích hợp Prototype

Với hỗ trợ thiết kế Responsive từ Figma, cho phép thiết kế của bạn tự động điều chỉnh phù hợp với các kích cỡ màn hình khác nhau. Ngoài ra, Figma còn cho phép thêm các yếu tố tương tác như cuộn trang, di chuột (hovering), và nhấp chuột, giúp thiết kế trở nên sống động và thực tế hơn.

Prototype là một bản mô phỏng cho sản phẩm thiết kế giúp người dùng hình dung ra được cách sản phẩm sẽ hoạt động khi hoàn thành. Thông thường, người ta sẽ thông qua một ứng dụng từ bên thứ ba để dựng Prototype, nhưng với Figma bạn hoàn toàn có thể thao tác trực tiếp trên đây cực tiện lợi và nhanh chóng.

Tích hợp Prototype

Feedback thuận tiện

Figma cho phép người dùng feedback trực tiếp trên file, các feedback này có thể theo dõi qua Email. Nhờ tính năng này bạn có thể thảo luận với team hoặc chỉnh sửa file trực tiếp khi đang họp, nhờ vậy bạn sẽ tiết kiệm được thời gian và làm việc nhóm hiệu quả hơn rất nhiều.

Kho Plugin và Template khổng lồ từ cộng đồng Figma

Cộng đồng thiết kế sử dụng Figma rất lớn và đang phát triển, với hàng loạt plugin, template và widget được tạo ra và chia sẻ bởi cộng đồng. Điều này giúp người dùng dễ dàng tìm thấy các tài nguyên và học hỏi từ các thiết kế của người khác.

Với kho tài nguyên khổng lồ này sẽ giúp người dùng xử lý các thiết kế nhanh chóng và quản lý màu sắc, hình ảnh dễ dàng hơn bao giờ hết.

Kho Plugin khổng lồ

Xuất file ảnh chất lượng cao ở nhiều định dạng

Figma cho phép xuất file ảnh ở nhiều định dạng khác nhau và vẫn đảm bảo chất lượng hình ảnh sắc nét. Thêm nữa, người dùng có thể lưu các file ảnh với định dạng PNG, SVG, JPG và thậm chí là PDF để phù hợp với các yêu cầu khác nhau của dự án.

Tính năng xuất mã (Code Exporting Features)

Figma cho phép xuất một số lượng mã (source code) từ các thiết kế, điều này giúp Developer tiết kiệm được rất nhiều thời gian, họ không phải bắt đầu với từng dòng code nữa mà giờ đây đã có sẵn mã nguồn một cách chính xác và nhanh chóng.

Figma dành cho ai?

Figma sở hữu những ưu điểm tuyệt vời và cực kỳ hữu ích cho các Designer, các nhà phát triển giao diện người dùng UX/UI. Bên cạnh đó, Figma cũng giúp việc kết nối giữa các Developer với Designer dễ dàng hơn. Figma hỗ trợ rất nhiều đối tượng khác nhau thông qua ba sản phẩm chính của mình, đáp ứng nhu cầu của nhiều người dùng trong lĩnh vực thiết kế và trình bày ý tưởng:

  1. Figma Design: Phù hợp với những người làm trong lĩnh vực thiết kế, quản lý sản phẩm, lập trình viên, và các nhà văn, giúp họ tạo, chia sẻ và kiểm thử các thiết kế cho website, ứng dụng di động và các sản phẩm kỹ thuật số khác. Nó cũng hỗ trợ bất kỳ ai liên quan đến quá trình thiết kế để đóng góp ý kiến, phản hồi và ra quyết định nhanh chóng hơn.
  2. Figma Slides: Dành cho các nhóm muốn tạo các bài thuyết trình đẹp mắt. Sản phẩm này cho phép người dùng chèn các thiết kế và nguyên mẫu từ Figma Design, hợp tác tạo và trình bày với đầy đủ công cụ. Nó cũng bao gồm các widget tương tác để thu thập phản hồi từ các bên liên quan trước khi kết thúc bài thuyết trình.
  3. FigJam: Là công cụ vẽ bảng trắng trực tuyến, cho phép mọi người tham gia vào các cuộc họp, não bộ, lập kế hoạch và nghiên cứu. FigJam rất phù hợp với việc sử dụng trong các buổi họp nhóm, lên ý tưởng, vẽ sơ đồ và lập kế hoạch.

Như vậy, Figma là một công cụ hiệu quả cho các nhóm làm việc cùng nhau trên cùng một dự án và muốn có một công cụ để trao đổi ý tưởng, phối hợp và quản lý tiến độ công việc.

Figma có miễn phí không?

Không giống như các công cụ thiết kế khác trong Adobe, Figma cho phép bạn bắt đầu sử dụng hoàn toàn miễn phí.

Tuy nhiên ở bản miễn phí, bạn chỉ được tạo 3 project có thể share public và cùng chỉnh sửa, nếu bạn muốn sử dụng thêm nhiều tính năng hơn Dev Mode đồng thời có thể chia sẻ không giới hạn collaborative design files thì có thể tham khảo pricing plan bên dưới:

Figma có miễn phí không?
Bảng giá Figma

Với tính năng miễn phí và chi phí thấp, Figma trở thành một trong những sân chơi phổ biến nhất để thiết kế giao diện và trang web.

Figma, Sketch và Adobe XD, nên chọn cái nào?

Dưới đây là bảng so sánh chi tiết giữa Figma, Sketch và Adobe XD giúp bạn lựa chọn được nền tảng phù hợp với nhu cầu sử dụng của mình:

Figma Sketch Adobe XD
Nền tảng Trình duyệt web Phần mềm Desktop và cả trình duyệt Phần mềm Desktop và App trên điện thoại
Hệ điều hành MacOS, Windows, Linux MacOS MacOS, Windows, Android, iOS
Cộng tác Thời gian thực Chỉ cộng tác thời gian thực khi người dùng mua bản quyền Sketch Chỉ cộng tác thời gian thực trên các dự án được đồng bộ hóa trên cloud
Khả năng làm việc offline Không thể
Tính năng tạo Prototype Ở mức cơ bản Ở mức cơ bản Tốt nhất trong cả 3
Giá cả Miễn phí cho gói Starter, từ $12/tháng cho phiên bản chuyên nghiệp $99/năm, cập nhật trong 1 năm

$8.25/tháng/người với gói team 

Miễn phí cho người mới bắt đầu

$24/tháng cho gói team

Cả ba công cụ đều là các phần mềm thiết kế giao diện người dùng và có những tính năng tương đồng nhau. Tuy nhiên, Figma được đánh giá cao hơn bởi tính linh hoạt với khả năng hoạt động trên nhiều nền tảng và cho phép truy cập qua trình duyệt web, cũng như khả năng cộng tác và chia sẻ một cách dễ dàng. Sketch thường được ưa chuộng bởi người dùng Mac và có các plugin hữu ích, trong khi Adobe XD cung cấp các tính năng tuyệt vời cho prototype và animation. Tùy vào nhu cầu và sở thích của người dùng, mỗi công cụ đều có điểm mạnh và yếu khác nhau.

Cách đăng kí và sử dụng Figma cho người mới

Bước 1: Truy cập trang web của Figma

Mở trình duyệt web của bạn và truy cập trang chủ của Figma tại https://www.figma.com.

Bước 2: Đăng ký tài khoản

  • Bấm vào nút “Sign up” hoặc “Get started” trên trang chủ.
  • Bạn có thể chọn đăng ký bằng email hoặc sử dụng tài khoản Google để đăng nhập nhanh.
  • Nếu bạn chọn đăng ký bằng email, bạn sẽ cần cung cấp tên của mình, địa chỉ email, và tạo một mật khẩu.
Đăng kí tài khoản Figma
Đăng kí tài khoản Figma

Bước 3: Xác nhận tài khoản

  • Sau khi đăng ký, Figma sẽ gửi một email xác nhận đến địa chỉ email mà bạn đã cung cấp.
  • Mở email và bấm vào liên kết xác nhận để hoàn tất quá trình đăng ký.

Bước 4: Đăng nhập và bắt đầu sử dụng

  • Sau khi xác nhận email, đăng nhập vào tài khoản Figma của bạn.
  • Bạn sẽ được đưa đến giao diện chính của Figma, nơi bạn có thể bắt đầu tạo dự án mới hoặc mở một dự án hiện có.

Bước 5: Tạo và quản lý dự án

  • Để tạo dự án mới, bấm vào “New Design File” từ giao diện chính.
  • Màn hình thiết kế sẽ hiện ra, từ đây bạn có thể thỏa thích thiết kế, ngoài ra Figma cũng cung cấp các mẫu sẵn có để bạn có thể bắt đầu một cách nhanh chóng.

Tóm lại

Figma – một trong những công cụ thiết kế giao diện đồ họa hàng đầu hiện nay đã giúp cho quá trình thiết kế giao diện trở nên dễ dàng và tiện lợi hơn bao giờ hết. Với những tính năng nổi bật như khả năng hoạt động trên nhiều nền tảng, tính năng tương tác trong thời gian thực và kho plugin khổng lồ, Figma đang trở thành công cụ thiết kế giao diện đồ họa được ưa chuộng và được sử dụng rộng rãi trên toàn thế giới.

TopDev hy vọng bài viết này đã giúp bạn hiểu rõ hơn về Figma cũng như so sánh với các công cụ thiết kế giao diện khác để giúp bạn có sự lựa chọn tốt nhất cho dự án của mình. Hãy bắt đầu sử dụng Figma và khám phá những tính năng tuyệt vời từ công cụ sáng tạo này nhé!

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

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

Có nên sử dụng thư viện bên thứ 3 trong dự án?

Có nên sử dụng thư viện bên thứ 3 trong dự án?

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

Chào các bạn,

Các dự án phần mềm ngày nay thường được tích hợp rất nhiều các thư viện bên thứ 3. Một phần vì chúng quá tốt, một phần vì các developer ngày càng… lười code. Mặc dù không phủ nhận được việc tích hợp thư viện bên thứ 3 giúp chúng ta tiết kiệm được một lượng lớn thời gian để code và debug, nhưng bên cạnh đó việc làm này cũng tiềm ẩn nhiều rủi ro cho dự án. Rủi ro thế nào thì mời các bạn cùng lắng nghe quan điểm của mình nhé.

I. Thư viện bên thứ 3 là gì?

Giải thích một chút.

Thư viện bên thứ 3 trong bài viết này là ý chỉ những thư viện được phát triển bởi một bên khác, nhưng bạn lại mang về sử dụng. Trong lập trình web php, một số thư viện bên thứ 3 nổi tiếng có thể kể đến như: PhpmailerPHPExcelDdoctrine,… chẳng hạn.

II. Nhược điểm của việc thường xuyên sử dụng thư viện bên thứ 3

2.1 Không có gì là mãi mãi

Không có gì đảm bảo thư viện thứ 3 mà bạn đang tích hợp sẽ được duy trì mãi mãi, nó có thể “chết” bất cứ lúc nào. Đồng ý rằng điều này rất khó xảy ra ở các thư viện được nhiều người sử dụng vì không có người này thì sẽ có người kia duy trì. Tuy nhiên lại xảy ra như cơm bữa đối với các thư viện ít người dùng.

Bản thân mình đã từng gặp trường hợp này 2 lần, chính tác giả của thư viện đó còn để lại một dòng nhắn nhủ “thư viện đã dừng hỗ trợ, vui lòng thử thư viện khác thay thế” – thật đáng buồn.

  Một số test automation framework thường gặp

2.2 Khó kiểm soát

Thông thường các công cụ quản lý gói như composer, npm sẽ thay chúng ta kiểm soát các thư viện. Tuy nhiên việc kiểm soát chỉ có hiệu quả khi tác giả của thư viện tuân theo đúng quy tắc và không bao giờ bị nhầm lẫn.

Ví dụ một thư viện chỉ chạy được trên phiên bản PHP 7.0, nhưng tác giả lại “lỡ tay” để cấu hình phiên bản PHP tối thiểu là 5.0. Điều này khiến các sản phẩm chạy trên php 5.0 có thể không hoạt động. Việc nhầm lẫn tưởng chừng như “đùa” này thực tế vẫn xảy ra, mình đã gặp 1 lần (có thể do số mình đen) và chứng kiến một số trường hợp trên khác qua các github issue.

Việc khó kiểm soát system requirements như ví dụ trên đã đủ làm dự án bị “chao đảo”. Đó là còn chưa kể tới việc chúng ta rất khó kiểm soát được bên trong thư viện đó viết gì, có gặp phải lỗi nghiêm trọng nào không, thuật toán xử lý có tối ưu không, có gắn code đào bitcoin hay không,…

  TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

2.3 Cồng kềnh

Một thư viện được viết ra để giải quyết nhiều bài toán chứ không riêng gì bài toán của bạn, vì vậy nó thường hỗ trợ nhiều tính năng “thừa” mà có thể bạn chẳng bao giờ dùng tới. Điều này vô tình làm cho source code dự án của bạn càng ngày càng phình to.

Nếu như bạn cảm thấy việc source phình to không phải là vấn đề vì server của bạn unlimited dung lượng, vậy thì việc làm giảm hiệu năng của dự án có làm bạn lo lắng? Đúng vậy, vì một thư viện có thể giải quyết nhiều trường hợp nên “dữ liệu đầu vào” của bạn cũng sẽ phải đi qua nhiều logic hơn trước khi nó được “chế biến” thành kết quả mong muốn. Điều này chắc chắn sẽ ảnh hưởng tới hiệu năng của sản phẩm.

Bạn cần biết rằng có rất nhiều doanh nghiệp chi không ít tiền chỉ hệ thống của họ chạy nhanh hơn 0.1s.

2.4 Làm “teo não” của các developer

Việc thường xuyên tích hợp thư viện bên thứ 3 vô tình tạo nên thói quen lười suy nghĩ cho developer. Thậm chí mình từng nghe thấy có người nói rằng “Trước khi làm tính năng gì đó, hãy search thư viện trước, nếu có thì mang về dùng luôn cho tiện“.

Thói quen này khiến chúng ta trở nên thụ động, bị phụ thuộc vào người tạo ra thư viện và hạn chế khả năng tư duy của bản thân. Về lâu về dài, đây chính là nguyên sẽ giết chết bạn trên con đường sự nghiệp.

2.5 Tưởng chừng tiết kiệm thời gian mà lại chẳng phải

Lợi ích lớn nhất của việc sử dụng thư viện là để tiết kiệm thời gian, nhưng đôi khi lại ngược lại – càng dùng thư viện càng tốn thời gian. Tại sao lại vậy ưu? Bởi vì bạn sẽ phải tốn thời gian để đọc tài liệu sử dụng, tốn thời gian để xem cộng đồng nói gì về nó, tốn thời gian để nghiên cứu nó có thật sự giải quyết được vấn đề của bạn, hoặc tốn thời gian để debug chính cái thư viện đó… Bằng từng ấy thời gian nếu bạn tự code thì có khi đã xong lâu rồi.

III. Kết luận

Qua loạt phân tích trên, vậy thì Có nên sử dụng thư viện bên thứ 3 trong dự án? Câu trả lời của mình là nhưng phải chọn lọc. Bởi nếu không sử dụng thì chúng ta sẽ bỏ qua một nguồn tài nguyên to lớn, thậm chí nhiều ngôn ngữ lập trình, hay framework, opensouce thì nhiều thư viện còn là một lợi thế. Nhưng nếu cứ sử dụng tùy tiện, bừa bãi thì sẽ có ngày bạn nhận hậu quả.

Bạn sẽ thấm hơn nhiều nếu sản phẩm đang chạy trên production bị ngưng hoạt động chỉ vì bạn vừa update thư viện sáng nay.

Sau nhiều lần số đen, mình đã rút ra kinh nghiệm Cái gì mình control được, thì cứ control vẫn hơn là phụ thuộc vào một thằng khác.

Bài viết được viết dựa trên góc nhìn cá nhân, rất mong nhận được góp ý của các bạn.

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

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

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

Top 10 câu hỏi phỏng vấn Flutter Developer thường gặp

Top 10 câu hỏi phỏng vấn Flutter Developer thường gặp

Flutter hiện nay đang là một hướng phát triển nghề nghiệp đầy tiềm năng dành cho các lập trình viên ứng dụng mobile. Là một framework hỗ trợ build ứng dụng cross-platform cùng với sự hỗ trợ từ ông lớn Google, Flutter đang dần trở thành ưu tiên lựa chọn của các nhà phát hành sản phẩm. Cũng vì thế mà vị trí lập trình viên Flutter cũng đang được tuyển dụng nhiều hơn với các đãi ngộ hấp dẫn. Để chuẩn bị cho buổi phỏng vấn sắp tới, hôm nay chúng ta cùng nhau tìm hiểu top 10 câu hỏi dành cho Flutter Developer thường gặp nhé.

10 câu hỏi câu hỏi phỏng vấn Flutter Developer phổ biến nhất

Cập nhật ngay 10 câu hỏi câu hỏi phỏng vấn Flutter Developer thường gặp trong các buổi phỏng vấn lập trình viên giúp bạn chủ động và tự tin hơn để đạt kết quả tốt nhất. Cùng tìm hiểu ngay qua nội dung sau đây!

Câu 1: Flutter là gì? Thành phần chính của Flutter

Flutter là gì?

Flutter là một SDK mã nguồn mở dành cho việc phát triển các ứng dụng di động, được phát hành bởi Google từ năm 2017. Flutter được viết bằng ngôn ngữ C/C++ cùng với Dart (một ngôn ngữ cũng do Google phát triển) và sự hỗ trợ của thư viện đồ họa Skia (cũng là một thư viện viết bởi Google). Flutter giao tiếp với các SDK của riêng các nền tảng mobile như Android và iOS cung cấp, từ đó tạo nên một Flutter Engine hoàn chỉnh có khả năng tạo ra các ứng dụng chạy trên nền tảng mobile.

Thành phần chính của Flutter bao gồm:

  • Nền tảng Dart: giúp lập trình viên viết code và lập trình bằng ngôn ngữ Dart
  • Flutter Engine
  • Thư viện Foundation
  • Các widget được thiết kế riêng

Câu 2: Dart là gì? Vì sao Google sử dụng Dart cho Flutter

Dart là một ngôn ngữ lập trình hướng đối tượng được Google phát triển vào năm 2011, được tối ưu hóa về phía client cho nhiều nền tảng như xây dựng ứng dụng di động, desktop, web hay server. Dart có cú pháp kiểu C, hỗ trợ biên dịch cả AOT (Ahead of Time) và JIT (Just in Time), source code có thể biên dịch thành JavaScript để chạy trên trình duyệt.

Google cho ra đời Dart như một cải tiến, cung cấp sự lựa chọn hiện đại hơn (nhưng không thay thế) cho những ngôn ngữ kịch bản trên nền tảng Web hiện nay như JavaScript. Dart cung cấp hiệu năng tốt hơn, có khả năng trở thành công cụ trong các dự án lớn, tính bảo mật cũng tốt hơn

  Giới thiệu Widgetbook – Storybook dành cho Flutter

  Thêm Firebase vào Flutter và login với Facebook

Câu 3: Các kiểu dữ liệu hỗ trợ trong Dart

Dart hỗ trợ các kiểu dữ liệu cơ bản gồm:

  • Numbers: biểu diễn dữ liệu dạng số với 2 loại là Integer (số nguyên) và Double (số thực dấu phẩy động)
  • String: biểu diễn chuỗi ký tự
  • Booleans: true/false
  • Collections: biểu diễn 1 tập các đối tượng. Flutter hỗ trợ kiểu Lists, Maps, List<T>, Map<dynamic, dynamic> và Set<T> dành cho những kiểu tập hợp dữ liệu tương ứng
  • Runes: biểu diễn dạng chuỗi Unicode 32 bit
  • Symbols

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

Câu 4: So sánh 3 kiểu khai báo biến dynamic, var và final

So sánh 3 kiểu khai báo biến dynamic, var và final

Dynamic, Var và Final là 3 kiểu khai báo biến thường được sử dụng trong Dart, cụ thể:

  • Dynamic: Khai báo 1 biến mà có thể thay đổi cả kiểu dữ liệu và giá trị sau đó
  • Var: Khai báo 1 biến với kiểu dữ liệu cố định (phụ thuộc vào giá trị khởi tạo), giá trị của biến có thể thay đổi
  • Final: Khai báo 1 hằng số, không thể thay đổi cả giá trị biến và kiểu dữ liệu

Câu 5: Phân biệt Stateful Widget và Stateless Widget

Stateless Widget là những Widget tĩnh và không thể tự thay đổi được những gì mà nó hiển thị sau khi đã được render xong, hay nói cách khác thì Stateless Widget sẽ không chứa các biến state cho việc quản lý trạng thái của UI. Ngược lại thì Stateful Widget là một Widget động, chứa state và sẽ chủ động render lại khi state thay đổi.

Stateless Widget thường được sử dụng trong trường hợp hiển thị dữ liệu cứng như AppBar, Title (tiêu đề) màn hình,… còn Stateful Widget được sử dụng rộng rãi hơn ở những phần UI mà tương tác với người dùng. Stateless Widget nhờ việc không chứa state nên việc render UI của nó nhanh và nhẹ hơn nhiều, giúp tối ưu hiệu năng chương trình của bạn.

Câu 6: Mô tả vòng đời của một Stateful Widget

Mô tả vòng đời của một Stateful Widget

Vòng đời của một stateful Widget có 7 trạng thái bao gồm:

  • createState: khi class được khởi tạo thì hàm này sẽ được gọi đầu tiên
  • initState: gọi ngay khi Widget được tạo
  • didChangeDependencies: hàm này được gọi ngay sau initState và được gọi lại khi dependency của state thay đổi
  • build: sau khi didChangeDependencies được gọi thì hàm build sẽ được gọi để thực hiện việc render UI lên màn hình
  • didUpdateWidget: hàm được gọi khi Widget configuration thay đổi, sau khi hàm này được gọi thì hàm build sẽ được gọi để render lại UI
  • deactive: hàm được gọi khi widget bị xóa khỏi cây widget
  • dispose: hàm được gọi khi widget bị xóa vĩnh viễn khỏi cây widget

Câu 7: So sánh hot reload, hot restart và full restart trong Flutter

Hot Reload là khả năng tải lại source code ứng dụng và rebuild lại widget tree mà không cần khởi động lại; đồng thời việc này không làm chạy lại các hàm main hay initState, giúp tiết kiệm thời gian và không bị mất trạng thái hiện tại của ứng dụng.

Hot restart thì sẽ tải lại toàn bộ thay đổi, khởi động lại ứng dụng Flutter và cũng khởi tạo lại trạng thái ứng dụng.

Full restart là việc khởi động lại toàn bộ ứng dụng iOS, Android hay Web và thực hiện việc compile lại Objective-C/Swift hay Java/Kotlin source code, và sẽ mất khá nhiều thời gian.

Trên giao diện của IDE Android Studio có cung cấp sẵn tính năng Hot Reload và Hot Restart; với Full restart được thực hiện khi bạn stop và thực hiện start lại việc chạy ứng dụng.

Câu 8: Stream trong Flutter là gì?

Stream là một luồng data bất đồng bộ có dữ liệu đầu vào và dữ liệu đầu ra cũng các xử lý thao tác bên trong nó. Flutter cung cấp class StreamController để handle một Stream. Để đẩy dữ liệu vào Stream thì chúng ta sử dụng thuộc tính sink, và ngược lại publish dữ liệu ra ngoài bằng thuộc tính stream. Để thao tác với dữ liệu bên trong Stream thì chúng ta sử dụng lớp StreamTransformer.

Có 2 loại Stream là Single – Subscription Stream và Broadcast Streams, trong đó:

  • Single chỉ cho phép đăng ký lắng nghe dữ liệu 1 lần khi Stream publish dữ liệu ra ngoài.
  • Broadcast cho phép nhiều chỗ lắng nghe sự kiện thay đổi dữ liệu của Stream, cũng vì thế bạn cần lưu ý việc xử lý hủy lắng nghe nếu không cần thiết tránh bị memory leak.

Câu 9: Cách điều hướng màn hình trong Flutter

Thông thường có 3 cách điều hướng màn hình trong Flutter:

  • Điều hướng trực tiếp: sử dụng MaterialPageRoute nhận tham số khởi tạo class màn hình điều hướng đến, giá trị trả về là một Route. Sau đó sử dụng Navigator.push để điều hướng đến route vừa tạo.
  • Điều hướng tĩnh: khai báo trước một Map routes trong MaterialApp. Để điều hướng đến màn hình thì chúng ta sử dụng thông qua route name sử dụng phương thức Navigator.pushNamed.
  • Điều hướng động: MaterialApp cung cấp phương thức onGenerateRoute giúp tạo route chính xác dựa trên class RouteSettings. Ưu điểm của method này là giúp bạn handle tất cả các đường dẫn trong một logic xử lý.

Câu 10: Giải thích về Bloc Pattern

BLoC là 1 pattern cho việc quản lý state được đề xuất bởi Google developers dành cho các ứng dụng Flutter. BloC có những điểm tương đồng với 2 patterns nổi tiếng là MVP và MVVM với mục đích chung là tách phần source code business logic ra khỏi phần xử lý UI. BLoC viết tắt cho Business Logic Component đóng vai trò tương tự như Presenter hay ViewModel trong mô hình MVP và MVVM tương ứng.

Giải thích về Bloc Pattern

BLoC đóng vai trò quản lý các biến states (trạng thái) trên màn hình, UI sẽ lắng nghe sự thay đổi giá trị của các biến states đến từ BLoC class để render hiển thị cho người dùng. Khi có sự tương tác của người dùng với UI, thông qua các events, BLoC sẽ nhận tín hiệu và xử lý logic tương tác với tầng dữ liệu (gửi request và nhận response) tương ứng. Để triển khai pattern này, Flutter sử dụng StreamController với việc các Input sẽ được thêm vào sink của StreamController và phía UI sử dụng stream để lắng nghe nhận state mỗi khi có event được add vào sink.

Kết bài

Trên đây là top 10 câu hỏi phỏng vấn vị trí Flutter Developer mà bạn sẽ thường gặp nhất, hãy trang bị các kiến thức cơ bản về Flutter thật tốt để chinh phục được nhà tuyển dụng. Hy vọng bài viết này hữu ích dành cho bạn và hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

Xem thêm IT Jobs for Developer hấp dẫn trên TopDev

Một số test automation framework thường gặp

Một số test automation framework thường gặp

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

Đây cũng là câu hỏi rất thường hay gặp trong các bài phỏng vấn cho các vị trí làm việc liên quan đến automation, tất nhiên là mình đã từng được hỏi câu này rồi haha, thế nên mạn phép chia sẻ một vài tìm hiểu về test automation framework cùng các bạn trong bài viết này để khỏi bỡ ngỡ khi một ngày bất ngờ được hỏi đến nha!

Test automation framework là gì?

Các automated testing framework cung cấp một kiến trúc riêng cho project kiểm thử của chúng ta, điều mà nền tảng của các công cụ test mà chúng ta sử dụng thì lại thường không cung cấp. Mỗi kiểu framework lại có những quy tắc riêng, các hướng dẫn, giao thức và thủ tục riêng dành cho các công việc như tạo test case, tổ chức và thực thi các test case.

Dưới đây là 6 framework dành cho kiểm thử tự động thường gặp nhất. Thứ tự được sắp xếp tăng dần theo độ phức tạp và các mức độ trong việc định hướng để đạt được các mục tiêu kiểm thử. Và các khía cạnh dùng để đánh giá việc đó bao gồm khả năng mở rộng, tính tái sử dụng, nỗ lực dành cho việc bảo trì và chi phí đầu tư dành cho các kỹ năng liên quan đến kỹ thuật như là chuyển giao kiến thức, đào tạo nhân lực hay các nỗ lực cần có để học hỏi các công nghệ mới…

Top 6 test automation framework phổ biến hiện nay

Trong phần lớn các trường hợp, việc tổ chức framework sẽ đóng vai trò quan trọng hơn là việc lựa chọn một framework, vì việc tổ chức tốt sẽ mang lại sự chuẩn hóa nhất định trong quy trình phát triển và kiểm thử, từ đó giúp nâng cao hiệu quả các hoạt động trong project.

1. Module-Based Testing Framework

Với framework này, thì ta sẽ xây dựng các test script độc lập, tương ứng với từng module, các compoment hoặc các function của phần mềm ứng dụng. Việc tránh sử dụng các script phụ thuộc nhau là một yếu tố quan trọng đối với sự ổn định và khả năng bảo trì của framework này.

test automation framework

Với mỗi script của một module sẽ được gắn tương ứng với các thao tác (actions) và dữ liệu (testdata) tương ứng dành cho nó. Nếu như có sự thay đổi về test data thì các script cũng phải thay đổi tương ứng, hoặc là bạn phải tạo mới một test script riêng biệt khác để đáp ứng sự thay đổi đó. Và nếu như dữ liệu test của chúng ra thường xuyên có sự thay đổi hoặc cập nhật thì việc sử dụng data-driven framework sẽ là lựa chọn tốt hơn đấy!

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

  Automation testing: Một số công cụ hữu ích cho tester

2. Common Library Testing Framework

Framework này thì về cơ bản nó có nền tảng dựa theo Module Based Framework nhưng có một một số ưu điểm hơn. Thay vì chia ứng dụng với các module và các test script tương ứng, thì ở đây ta sẽ thực hiện tách các test script của các chức năng dùng chung vào trong một thư viện chung, và có thể gọi đến bất cứ khi nào cần dùng, mà không phải làm đi làm lại cùng một scipt giống hệt nhau.

Việc này giúp cho code không bị dài và dư thừa, và giảm nỗ lực thực hiện xây dựng script.

Ví dụ đơn giản bạn có thể hình dung trong việc sử dụng framework này như công việc Login vào một ứng dụng nào đó.

Thường thì bước login là bước đầu tiên phải làm trước khi thực hiện các chức năng sau đó. Vì thế, thay vì bước login này phải được xây dựng trước toàn bộ các function cần test, thì ta sẽ xây dựng một Common Lib, có chứa bước login này, vậy là từ sau ta chỉ cần gọi chức năng này ở Common ra dùng thôi chứ không phải làm đi làm lại ở từng script nữa. Việc này còn giúp ta nhàn nhã hơn nhiều trong việc nếu như bước login này có sự thay đổi nào đó cần cập nhật, thì lúc này ta cũng chỉ phải chỉnh sửa ở một nơi thôi chứ không phải đi khắp nơi để chỉnh sửa nữa!

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

test automation framework

3. Data driven testing Framework

Trong quá trình automation test hay trong quá trình kiểm thử thông thường, việc thực hiện test một chức năng phải lặp đi lặp lại nhiều lần với các dữ liệu test khác nhau là việc mà ta sẽ phải gặp rất thường xuyên. Hơn nữa, trong một số trường hợp, ta không thể nhúng dữ liệu test vào trong test script được. Do đó mà người ta phải nghĩ tới việc sẽ lưu trữ các test data ra bên ngoài, tách biệt với các test script.

Hướng tiếp cận theo data-driven trong trường hợp này rõ ràng sẽ hiệu quả và dễ dàng quản lý hơn so với hai cách trên. Các test data cho các script được truyền vào từ một database bên ngoài, do đó tính sử dụng lại của script đó cũng cao hơn.  Các database lưu trữ dữ liệu đó có thể là các file xml, excel, file text, CSV,… Các dữ liệu này được lưu trữ theo một quy ước chung là ‘Key – Value’, các key này sẽ được sử dụng để truy cập và truyền dữ liệu vào các test script tương ứng thông qua một số thư viện chung.

Framework này sẽ giúp giảm đáng kể số lượng test script cần có so với việc sử dụng framework hướng module. Test data có thể thay đổi độc lập với các test script, có nghĩa là khi bạn thay đổi các giá trị của test data thì bạn chỉ cần cập nhật ở phần dữ liệu lưu trữ bên ngoài, chứ không phải vào trong từng script để chỉnh sửa gì cả. Tuy nhiên thì về tổng thể nó có phần phức tạp hơn và nó cũng yêu cầu người dùng phải có một kỹ năng lập trình nhất định trong việc setup và bảo trì project.

4. Keyword Driven Testing Framework

Keyword driven là một trong những test automation framework, là một dạng mở rộng của Data driven framework, nó còn được gọi với một tên khác là table-driven. Đối với hướng tiếp cận này, các test data cũng được tách khỏi các test script, và thêm vào đó các giá trị keywork của các aciton được lưu trữ trong file database bên ngoài. Các key word này chính là các hướng dẫn để xác định các action nào sẽ cần được thực hiện để test ứng dụng.

Đối với keyword driven framework, không yêu cầu quá cao đối với kỹ năng của người tạo các test cript.

Framework này cũng giúp cho các test cript của chúng ta dễ đọc hơn.

Thêm một ví dụ để các bạn có thể hiểu hơn về framework này nhé!

Ex: Mình có một test case theo keyword driven testing framework như sau:

test automation framework

Như bảng dữ liệu trên, ta có cột keywork với các giá trị như login, clickLink và verifyLink. Tùy thuộc vào tính chất của ứng dụng, thì các keyword sẽ được gọi và sử dụng tương ứng. Các keyword này có thể được gọi đến và sử dụng nhiều lần trong quá trình thực hiện test. Cột Locator/Data là giá trị locator của phần tử trên màn hình hoặc các test data cần truyền vào cho phần tử ấy.

5. Hybrid Testing Framework

Cái tên nói tên tất cả, hybrid test framework cũng là test automation framework, là sự kết hợp giữa hai hoặc nhiều các loại framework trên. Điểm cộng lớn ở đây chính là việc phát huy các ưu điểm của các framework mà nó kết hợp sử dụng.

Ví dụ, một hybrid có sự kết hợp giữa common library cùng với một kho dữ liệu test là các dữ liệu đầu vào/ra và các action keyword, lúc này mỗi bộ trong kho dữ liệu sẽ bao gồm tên của đối tượng, mô tả, action keyword, UI locator và test data tương ứng.

Đối với hybrid thì các công việc ban đầu có thể phức tạp hơn đối với các hướng tiếp cận là các framework phía trên, nhưng nếu như sự cân bằng giữa các framework được kết hợp được đánh giá và thực thi cẩn thận thì nó lại có một sự linh hoạt rất cao đối với việc nâng cấp và bảo trì project.

6. Behavior Driven Development Framework

Behavior Driven Developmet Framework viết tắt là BDD, framework này không giống như các framework đã kể trên, mục đích của nó là tạo điều kiện cho các bên liên quan trong quy trình phát triển phần mềm như: Business Analysts, Developers, Testes… có thể tiếp cận với các yêu cầu kỹ thuật của sản phẩm sớm nhất có thể. Điều này đòi hỏi sự hợp tác cao giữa team DEV và team test.

Vấn đề trọng tâm đối với framework này đó là việc sử dụng các ngôn ngữ non-technical, semi-formal, hay dễ hiểu hơn là nó sẽ gần giống với ngôn ngữ tự nhiên mà chúng ta vẫn thường sử dụng để mô tả các test case theo hướng hành vi của người dùng. Có một số công cụ hỗ trợ chúng ta trong việc này như Cucumber hay Jbehave, Rbehave…

Trên đây là những tìm hiểu của mình về các loại test automation framework thường hay gặp, nội dung trong bài được lược dịch từ nhiều nguồn trên Internet, nếu có thiếu sót rất mong nhận được sự góp ý của các bạn.

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

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

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

Hướng dẫn sử dụng Java String, StringBuffer và StringBuilder

Hướng dẫn sử dụng Java String, StringBuffer và StringBuilder

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

1. Phân cấp thừa kế

String StringBuilder StringBuffer

Khi làm việc với các dữ liệu văn bản, Java cung cấp cho bạn 3 class String, StringBuffer và StringBuilder. Nếu làm việc với các dữ liệu lớn bạn nên sử dụng StringBuffer hoặc StringBuilder để đạt hiệu năng nhanh nhất. Về cơ bản 3 class này có nhiều điểm giống nhau.

  • String là không thể thay đổi (immutable – khái niệm này sẽ được nói chi tiết ở trong phần tiếp theo của bài viết này) và không cho phép có class con.
  • StringBufferStringBuilder có thể thay đổi (mutable)

StringBuilder và StringBuffer là giống nhau, nó chỉ khác biệt tình huống sử dụng có liên quan tới đa luồng (Multi Thread).

  • Nếu xử lý văn bản sử dụng nhiều luồng (Thread) bạn nên sử dụng StringBuffer để tránh tranh chấp giữa các luồng.
  • Nếu xử lý văn bản sử dụng 1 luồng (Thread) nên sử dụng StringBuilder.

Nếu so sánh về tốc độ xử lý StringBuilder là tốt nhất, sau đó StringBuffer và cuối cùng mới là String.

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

  Cách xây dựng ThreadLocal trong Java

2. Khái niệm mutable & immutable

  • Mutable Object: khi khởi tạo 1 đối tượng, tức ta có 1 tham chiếu tới 1 thể hiện của 1 lớp, thì trạng thái của đối tượng có thể thay đổi được sau khi việc khởi tạo đối tượng thành công. Trạng thái đối tượng ở đây có thể là các trường thông tin mà đối tượng đó nắm giữ. Ví dụ: tên, tuổi của 1 đối tượng sinh viên chẳng hạn. Điều này có nghĩa là, bạn vừa có thể get() vừa có thể set() giá trị.
  • Immutable Object: khi khởi tạo 1 đối tượng, thì trạng thái của tối tượng đó không thể thay đổi được sau khi việc khởi tạo đối tượng thành công. Điều này có nghĩa là, bạn chỉ có thể get() mà không thể set().

Ví dụ:

// Đây là một class với trường value, name.
// Khi bạn khởi tạo đối tượng class này
// bạn không thể sét đặt lại value từ bên ngoài, và tất cả các trường khác của nó cũng thế.
// Class này không hề có các hàm để sét đặt lại các trường (field) từ bên ngoài.
// Nếu muốn bạn chỉ có thể tạo mới một đối tượng khác.
// Điều đó có nghĩa là class này là không thể thay đổi (immutable)
public class ImmutableClassExample {
    private final int value;
    private final String name;

    public ImmutableClassExample(String name, int value) {
           this.value = value;
           this.name= name;
    }

    public String getName() {
           return name;
    }

    public int getValue() {
          return value;
    }
}


// Đây là một class có 1 trường value.
// Sau khi khởi tạo đối tượng bạn có thể sét đặt lại giá trị của trường value
// thông qua việc gọi method setNewValue(int).
// Như vậy đây là class có thể thay đổi (mutable).
public class MutableClassExample {

      private int value;

      public MutableClassExample(int value) {
            this.value= value;
      }

      public void setNewValue(int newValue) {
           this.value = newValue;
      }

}

String là một class không thể thay đổi, String có nhiều thuộc tính (trường), ví dụ length,… nhưng các giá trị đó là không thể thay đổi.

Tìm Java job lương cao trên TopDev ngay!

3. String

Trong java, String là một class đặc biệt, nguyên nhân là nó được sử dụng một cách thường xuyên trong một chương trình, vì vậy đòi hỏi nó phải có hiệu suất và sự mềm dẻo. Đó là lý do tại sao String có tính đối tượng và vừa có tính nguyên thủy (primitive).

3.1 Tính nguyên thủy:

Bạn có thể tạo một string literal (chuỗi chữ), string literal được lưu trữ trong ngăn sếp (stack), đòi hỏi không gian lưu trữ ít, và rẻ hơn khi thao tác.

  • String literal = “Hello World”;

Bạn có thể sử dụng toán tử + để nối 2 string, toán tử này vốn quen thuộc và sử dụng cho các kiểu dữ liệu nguyên thủy int, float, double.
Các string literal được chứa trong một bể chứa (common pool). Như vậy hai string literal có nội dung giống nhau sử dụng chung một vùng bộ nhớ trên stack, điều này giúp tiết kiệm bộ nhớ.

Đừng bỏ lỡ việc làm Java hấp dẫn trên TopDev

3.2 Tính đối tượng

Vì String là một class, vì vậy nó có thể được tạo ra thông qua toán tử new.

  • String object = new String(“Hello World”);

Các đối tượng String được lưu trữ trên Heap, yêu cầu quản lý bộ nhớ phức tạp và tốn không gian lưu trữ. Hai đối tượng String có nội dung giống nhau lưu trữ trên 2 vùng bộ nhớ khác nhau của Heap.

Ví dụ:
// Tạo ngầm một String, thông qua "string literal".
// Đây là một "string literal".
// Cách này thể hiện tính nguyên thủy của String.

String str1 = "Java is Hot";

// Tạo một cách rõ ràng thông qua toán tử new.
// Đây là một "String object".
// Cách này thể hiện tính đối tượng của String,
// giống như các đối tượng khác trong Java.

String str2 = new String("I'm cool");

3.3 String Literal vs. String Object

Như đã đề cập, có hai cách để xây dựng một chuỗi (String): ngầm xây dựng bằng cách chỉ định một chuỗi chữ ( String literal) hay một cách rõ ràng tạo ra một đối tượng String thông qua toán tử new và cấu tử của String. Ví dụ:

String s1 = "Hello"; // String literal
String s2 = "Hello"; // String literal
String s3 = s1; // Cùng tham chiếu (trỏ tới cùng một vị trí)
String s4 = new String("Hello"); // Tạo mới một đối tượng String
String s5 = new String("Hello"); // Tạo mới một đối tượng String

Chúng ta sẽ giải thích bằng hình minh họa dưới đây:

String StringBuilder StringBuffer

Các string literal có cùng một nội dung, chúng sẽ chia sẻ cùng một vị trí lưu trữ trong bể chứa ( common pool). Trong khi đó các đối tượng String lưu trữ trong Heap, và không chia sẻ vị trí lưu trữ kể cả 2 đối tượng string này có nội dung giống nhau.

3.4 Sự khác nhau giữa tạo chuỗi bằng cách sử dụng từ khóa new () và literal

Khi chúng ta tạo chuỗi với toán tử new (), nó được tạo ra trong heap và không được thêm vào trong String pool. Trong khi String được tạo bằng cách sử dụng literal được tạo ra trong String pool và tồn tại trong vùng PermGen của heap.

String s = new String("Test");

Nó không đặt đối tượng trong String pool, chúng ta cần gọi phương thức String.intern() để đưa chúng vào String pool một cách tường minh.

Nếu tạo ra đối tượng String như String literal. Ví dụ: String s = “Test” Java tự động đưa nó vào trong String pool.

String StringBuilder StringBuffer

Như hình trên:

  • Chuỗi str1: không được quản lý bởi String Pool, tạo thêm vùng nhớ mới để lưu giá trị trong heap.
  • Chuỗi str2: được quản lý bởi String Pool, kiểm tra giá trị java5 trong String Pool đã tồn tại hay chưa, nếu chưa thì tạo vùng nhớ mới để lưu giá trị trong heap.
  • Chuỗi str3: mặc dù cùng giá trị java5 nhưng nó vẫn lưu ở vùng nhớ mới do không được quản lý bởi String Pool.
  • Chuỗi str4: không tạo thêm vùng nhớ mới do nó đã tồn tại tại trong String Pool, nó được quản lý bởi String Pool.

3.5 So sánh equals() và ==

Phương thức equals() sử dụng để so sánh 2 đối tượng, với String nó có ý nghĩa là so sánh nội dung của 2 string. Đối với các kiểu tham chiếu (reference) toán tử == có ý nghĩa là so sánh địa chỉ vùng bộ nhớ lưu trữ của đối tượng. Hãy xem ví dụ:

String s1 = "Hello"; // String literal
String s2 = "Hello"; // String literal
String s3 = s1; // Cùng tham chiếu (trỏ tới cùng một vị trí)
String s4 = new String("Hello"); // Tạo mới một đối tượng String
String s5 = new String("Hello"); // Tạo mới một đối tượng String

s1 == s1; // true, cùng trỏ vào một vị trí
s1 == s2; // true, s1 và s2 cùng trỏ tới 1 ví trí trong "bể chứa" (common pool)
s1 == s3; // true, s3 được gán bởi s1, nó sẽ trỏ tới vị trí s1 trỏ tới.
s1 == s4; // false, trỏ tới khác vị trí.
s4 == s5; // false, trỏ tới khác vị trí trên heap

s1.equals(s3); // true, cùng nội dung
s1.equals(s4); // true, cùng nội dung
s4.equals(s5); // true, cùng nội dung

Trong thực tế bạn nên sử dụng String literal, thay vì sử dụng toán tử new. Điều này làm tăng tốc chương trình của bạn.

3.6 Các phương thức của String

# METHODS DESCRIPTION
1 char charAt(int index) Trả về một ký tự tại vị trí có chỉ số được chỉ định.
2 int compareTo(Object o) So sánh một String với một Object khác.
3 int compareTo(String anotherString) So sánh hai chuỗi theo từ điển. (Phân biệt chữ hoa chữ thường)
4 int compareToIgnoreCase(String str) So sánh hai chuỗi theo từ điển. (Không phân biệt chữ hoa chữ thường)
5 String concat(String str) Nối chuỗi được chỉ định đến cuối của chuỗi này.
6 boolean contentEquals(StringBuffer sb) Trả về true nếu và chỉ nếu chuỗi này đại diện cho cùng một chuỗi ký tự như là StringBuffer quy định.
7 static String copyValueOf(char[] data) Trả về một chuỗi đại diện cho chuỗi ký tự trong mảng quy định.
8 static String copyValueOf(char[] data, int offset, int count) Trả về một chuỗi đại diện cho chuỗi ký tự trong mảng quy định.
9 boolean endsWith(String suffix) Kiểm tra nếu chuỗi này kết thúc với hậu tố quy định.
10 boolean equals(Object anObject) So sánh với một đối tượng
11 boolean equalsIgnoreCase(String anotherString) So sánh với một String khác, không phân biệt chữ hoa chữ thường.
12 byte[] getBytes() Mã hóa chuỗi này thành một chuỗi các byte bằng cách sử dụng bảng mã mặc định của flatform (nền tảng), lưu trữ kết quả vào một mảng byte mới.
13 byte[] getBytes(String charsetName) Mã hóa chuỗi này thành một chuỗi các byte bằng cách sử dụng bảng mã cho trước, lưu trữ kết quả vào một mảng byte mới.
14 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) Copy các ký tự từ chuỗi này vào mảng ký tự đích.
15 int hashCode() Trả về một mã “hash code” cho chuỗi này.
16 int indexOf(int ch) Trả về chỉ số trong chuỗi này xuất hiện đầu tiên của ký tự cụ thể.
17 int indexOf(int ch, int fromIndex) Trả về chỉ số trong chuỗi này xuất hiện đầu tiên của ký tự được chỉ định, bắt đầu tìm kiếm từ chỉ số cụ thể đến cuối.
18 int indexOf(String str) Trả về chỉ số trong chuỗi này xuất hiện đầu tiên của chuỗi quy định.
19 int indexOf(String str, int fromIndex)
Trả về chỉ số trong chuỗi này xuất hiện đầu tiên của chuỗi quy định, bắt đầu từ chỉ số xác định.
20 String intern() Returns a canonical representation for the string object.
21 int lastIndexOf(int ch) Trả về chỉ số trong chuỗi này về sự xuất hiện cuối cùng của ký tự cụ thể.
22 int lastIndexOf(int ch, int fromIndex) Trả về chỉ số trong chuỗi này về sự xuất hiện cuối cùng của ký tự được chỉ định, tìm kiếm lùi lại bắt đầu từ chỉ số xác định.
23 int lastIndexOf(String str) Trả về chỉ số trong chuỗi này xảy ra cuối cùng bên phải của chuỗi quy định.
24 int lastIndexOf(String str, int fromIndex)
Trả về chỉ số trong chuỗi này về sự xuất hiện cuối cùng của chuỗi xác định, tìm kiếm lùi lại bắt đầu từ chỉ số xác định.
25 int length() Trả về độ dài chuỗi.
26 boolean matches(String regex) Kiểm tra chuỗi này khớp với biểu thức chính quy chỉ định hay không.
27 boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) Kiểm tra chuỗi có một phần giống nhau.
28 boolean regionMatches(int toffset, String other, int ooffset, int len) Kiểm tra chuỗi có một phần giống nhau.
29 String replace(char oldChar, char newChar) Trả về một chuỗi mới từ thay thế tất cả các lần xuất hiện của ký tự oldChar trong chuỗi này với ký tự newChar.
30 String replaceAll(String regex, String replacement)
Thay thế tất cả các chuỗi con của chuỗi này khớp với biểu thức chính quy bởi String mới replacement
31 String replaceFirst(String regex, String replacement) Thay thế chuỗi con đầu tiên của chuỗi này khớp với biểu thức chính quy bởi một String mới replacement
32 String[] split(String regex) Tách chuỗi này thành các chuỗi con, tại các chỗ khớp với biểu thức chính quy cho trước.
33 String[] split(String regex, int limit) Tách chuỗi này thành các chuỗi con, tại các chỗ khớp với biểu thức chính quy cho trước. Tối đa limit chuỗi con.
34 boolean startsWith(String prefix) Kiểm tra nếu chuỗi này bắt đầu với tiền tố quy định.
35 boolean startsWith(String prefix, int toffset)
Kiểm tra nếu chuỗi này bắt đầu với tiền tố quy định bắt đầu một chỉ số xác định.
36 CharSequence subSequence(int beginIndex, int endIndex) Trả về một chuỗi ký tự mới là một dãy con của dãy này.
37 String substring(int beginIndex) Trả về một chuỗi ký tự mới là một dãy con của dãy này. Từ chỉ số cho trước tới cuối
38 String substring(int beginIndex, int endIndex) Trả về một chuỗi ký tự mới là một dãy con của dãy này. Từ chỉ số bắt đầu cho tới chỉ số cuối.
39 char[] toCharArray() Chuyển chuỗi này thành mảng ký tự.
40 String toLowerCase() Chuyển tất cả các ký tự của chuỗi này sang chữ thường, sử dụng miền địa phương mặc định (default locale)
41 String toLowerCase(Locale locale) Chuyển tất cả các ký tự của chuỗi này sang chữ thường, sử dụng miền địa phương (locale) cho trước.
42 String toString() Trả về String này.
43 String toUpperCase() Chuyển tất cả các ký tự của chuỗi này sang chữ hoa, sử dụng miền địa phương mặc định (default locale)
44 String toUpperCase(Locale locale) Chuyển tất cả các ký tự của chuỗi này sang chữ hoa, sử dụng miền địa phương (locale) cho trước.
45 String trim() Trả về một String mới, sau khi loại bỏ các ký tự trắng (whitespace) bên trái và bên phải.
46 static String valueOf(primitive data type x) Returns the string representation of the passed data type argument.

length()

public class LengthDemo {

   public static void main(String[] args) {
       String str = "This is text";
       int len = str.length();
       System.out.println("String Length is : " + len);
   }
}

Kết quả:

String Length is : 12

concat(String)

public class ConcatDemo {

 public static void main(String[] args) {
     String s1 = "One";
     String s2 = "Two";
     String s3 = "Three";

     // s1.concat(s2) rất giống với s1 + s2;
     String s = s1.concat(s2);
     System.out.println("s1.concat(s2) = " + s);

     // s1.concat(s2).concat(s3) rất giống với s1 + s2 + s3;
     s = s1.concat(s2).concat(s3);

     System.out.println("s1.concat(s2).concat(s3) = " + s);
 }
}

Kết quả:

s1.concat(s2) = OneTwo

s1.concat(s2).concat(s3) =&amp;nbsp;OneTwoThree

indexOf(..)

String StringBuilder StringBuffer

Ví dụ:

public class IndexOfDemo {

  public static void main(String[] args) {
      String str = "This is text";

      // Tìm vị trí xuất hiện ký tự 'i' đầu tiên.
      // ==> 2
      int idx = str.indexOf('i');
      System.out.println("- indexOf('i') = " + idx);

      // Tìm vị trí xuất hiện ký tự 'i' đầu tiên
      // tính từ chỉ số thứ 4 trở về cuối chuỗi.
      // ==&amp;gt; 5
      idx = str.indexOf('i', 4);
      System.out.println("- indexOf('i',4) = " + idx);

      // Tìm vị trí xuất hiện chuỗi con "te" đầu tiên.
      // ==> 8
      idx = str.indexOf("te");
      System.out.println("- indexOf('te') = " + idx);
  }

}
Kết quả:
- indexOf('i') = 2

- indexOf('i',4) = 5

- indexOf('te') = 8

substring(..)

String StringBuilder StringBuffer

Ví dụ:

public class SubstringDemo {

  public static void main(String[] args) {
      String str = "This is text";

      // Trả về chuỗi con từ chỉ số thứ 3 tới cuối chuỗi.
      String substr = str.substring(3);

      System.out.println("- substring(3)=" + substr);

      // Trả về chuỗi con từ chỉ số thứ 2 cho tới chỉ số 7
      substr = str.substring(2, 7);

      System.out.println("- substring(2, 7) =" + substr);
  }
}

Kết quả:

- substring(3)=s is text

- substring(2, 7) =is text

replace

// Trả về một chuỗi mới từ thay thế tất cả các lần xuất hiện
// của ký tự oldChar trong chuỗi này với ký tự newChar.
public String replace(char oldChar, char newChar)

// Thay thế tất cả các chuỗi con của chuỗi này khớp
// với biểu thức chính quy bởi String mới replacement
public String replaceAll(String regex, String replacement)

// Thay thế chuỗi con đầu tiên của chuỗi này khớp
// với biểu thức chính quy bởi một String mới replacement
public String replaceFirst(String regex, String replacement)

Ví dụ:

public class ReplaceDemo {

  public static void main(String[] args) {
      String str = "This is text";

      // Thay thế các ký tự 'i' bởi ký tự 'x'.
      String s2 = str.replace('i', 'x');

      System.out.println("- s2=" + s2);

      // Thay thế tất cả các chuỗi con khớp với "is" bởi "abc".
      String s3 = str.replaceAll("is", "abc");

      System.out.println("- s3=" + s3);

      // Thay thế tất cả các chuỗi con đầu tiên khớp với "is" bởi "abc".
      String s4 = str.replaceFirst("is", "abc");

      System.out.println("- s4=" + s4);

      // (Xem thêm tài liệu biểu thức chính quy)
      // Thay thế tất cả các chuỗi con khớp với biểu thức:
      // "is|te": Nghia là "is" hoặc "te"
      // thay bởi "+".
      String s5 = str.replaceAll("is|te", "+");
      System.out.println("- s5=" + s5);
  }

}

Kết quả:

- s2=Thxs xs text
- s3=Thabc abc text
- s4=Thabc is text
- s5=Th+ + +xt

Các ví dụ khác

- str=This is text
- s2=this is text
- s3=THIS IS TEXT
- 'str' startsWith This ? true
- str= Java is hot! 

- s4=Java is hot!

4. StringBuffer vs StringBuilder

StringBuilder và StringBuffer là rất giống nhau, điều khác biệt là tất cả các phương thức của StringBuffer đã được đồng bộ, nó thích hợp khi bạn làm việc với ứng dụng đa luồng, nhiều luồng có thể truy cập vào một đối tượng StringBuffer cùng lúc. Trong khi đó StringBuilder có các phương thức tương tự nhưng không được đồng bộ, nhưng vì vậy mà hiệu suất của nó cao hơn, bạn nên sử dụng StringBuilder trong ứng dụng đơn luồng, hoặc sử dụng như một biến địa phương trong một phương thức.

4.1 Các method của StringBuffer (StringBuilder cũng tương tự)

// Cấu tử.
StringBuffer() // an initially-empty StringBuffer
StringBuffer(int size) // with the specified initial size
StringBuffer(String s) // with the specified initial content

// Độ dài
int length()

// Các method xây dựng nội dung
// type ở đây có thể là kiểu nguyên thủy (primitive), char[], String, StringBuffer, .v.v..
StringBuffer append(type arg) // ==&gt; chú ý (ở trên)
StringBuffer insert(int offset, type arg) // ==&gt; chú ý (ở trên)

// Các method thao tác trên nội dung.
StringBuffer delete(int start, int end)
StringBuffer deleteCharAt(int index)
void setLength(int newSize)
void setCharAt(int index, char newChar)
StringBuffer replace(int start, int end, String s)
StringBuffer reverse()

// Các method trích ra toàn bộ hoặc một phần dữ liệu.
char charAt(int index)
String substring(int start)
String substring(int start, int end)
String toString()

// Các method tìm kiếm vị trí.
int indexOf(String searchKey)
int indexOf(String searchKey, int fromIndex)
int lastIndexOf(String searchKey)
int lastIndexOf(String searchKey, int fromIndex)

4.2 Ví dụ minh họa

String StringBuilder StringBuffer

public class StringBuilderDemo {

  public static void main(String[] args) {

      // Tạo đối tượng StringBuilder
      // Hiện tại chưa có dữ liệu trên StringBuilder.
      StringBuilder sb = new StringBuilder(10);

      // Nối thêm chuỗi Hello vào sb.
      sb.append("Hello...");
      System.out.println("- sb after appends a string: " + sb);

      // append a character
      char c = '!';
      sb.append(c);
      System.out.println("- sb after appending a char: " + sb);

      // Trèn một String vào vị trí thứ 5
      sb.insert(8, " Java");
      System.out.println("- sb after insert string: " + sb);

      // Xóa đoạn String con trên StringBuilder.
      // Tại vị trí có chỉ số 5 tới 8
      sb.delete(5,8);

      System.out.println("- sb after delete: " + sb);
  }
}

Kết quả:

- sb after appends a string: Hello...
- sb after appending a char: Hello...!
- sb after insert string: Hello... Java!
- sb after delete: Hello Java!

5. So sánh hiệu suất giữa String, StringBuilder và StringBuffer

package com.gpcoder;

import org.apache.commons.lang3.time.StopWatch;

public class StringConcatenate {
    public static final int NUM_OF_ITEM = 10000;

    public static void main(String[] args) {
        StopWatch stopwatch = new StopWatch();

        // Concat string using String Object
        stopwatch.start();
        stringConcat();
        stopwatch.stop();
        System.out.println("time taken by String : " + stopwatch.getNanoTime() + " nanoseconds");

        // Concat string using StringBuilder
        stopwatch.reset();
        stopwatch.start();
        stringBuilder();
        stopwatch.stop();
        System.out.println("time taken by StringBuilder : " + stopwatch.getNanoTime() + " nanoseconds");

        // Concat string using StringBuffer
        stopwatch.reset();
        stopwatch.start();
        stringBuffer();
        stopwatch.stop();
        System.out.println("time taken by StringBuffer : " + stopwatch.getNanoTime() + " nanoseconds");
    }

    public static String stringConcat() {
        String res = "";
        for (int i = 0; i < NUM_OF_ITEM; i++) {
            res += i;
        }
        return res;
    }

    public static String stringBuilder() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < NUM_OF_ITEM; i++) {
            sb.append(i);
        }
        return sb.toString();
    }

    public static String stringBuffer() {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < NUM_OF_ITEM; i++) {
            sb.append(i);
        }
        return sb.toString();
    }
}

Kết quả thực thi chương trình trên:

time taken by String : 205909572 nanoseconds
time taken by StringBuilder : 572201 nanoseconds
time taken by StringBuffer : 1484385 nanoseconds

Như bạn thấy: hiệu suất tốt nhất là StringBuilder -> tiếp theo là StringBuffer và String Object.

6. Lưu ý

Cần lưu ý rằng nếu có một câu lệnh chứa nhiều toán tử ‘+’ để nối các chuỗi thì JVM sẽ tự động sử dụng StringBuffer / StringBuilder.

Ví dụ:

public class StringConcatenate {
    public final String SITE = " gpcoder" + ".com";

    public static void main(String[] args) {
        StringConcatenate str = new StringConcatenate();
        System.out.println("Welcome" + " to" + str.SITE);
    }
}

Khi bạn build lớp trên sang .class, bạn sẽ thấy nội dung như sau:

import java.io.PrintStream;

public class StringConcatenate {
    public final String SITE = " gpcoder.com";

    public static void main(String[] arg) {
        StringConcatenate arg0 = new StringConcatenate();
        PrintStream arg9999 = System.out;
        StringBuilder arg10000 = (new StringBuilder()).append("Welcome to");
        arg0.getClass();
        arg9999.println(arg10000.append(" gpcoder.com").toString());
    }
}

7. Trong những trường hợp nào thì nên dùng toán tử + với String và lúc nào thì nên dùng StringBuilder?

Vấn đề của bài toán về string là string tốn nhiều không gian lưu trữ hơn number rất nhiều. Một kí tự có thể lên tới tối đa 16-bits vậy một chuỗi như ‘Hello world’ đã có thể chiếm hết 88-bits ~ 11-bytes thông qua encoder UTF-8. Trong khi kiểu long là số nguyên to lắm mới chiếm 64-bits. Chưa kể có đôi khi trong ứng dụng thì các chuỗi string giống nhau được sử dụng lặp đi lặp lại rất nhiều lần. Giải pháp được đưa ra là sử dụng một khái niệm gọi là String pool trong đó chứa các string độc lập lẫn nhau (unique) rồi dùng một class String giao tiếp với String pool. Điểm đặc biệt là các String giống nhau sẽ cùng trỏ đến một vị trí thay vì thể hiện giống như các class bình thường (thực thể mới được tạo sẽ chiếm 1 vùng nhớ mới) Điều này giúp cho chương trình tiết kiệm bộ nhớ nhưng bù lại các xử lý sẽ trở nên phức tạp hơn. Vậy cũng chính là lí do từ khoá string vẫn tồn tại trong Java nhưng lại bị khoá lại không thể dùng được.

Một trong những sự phức tạp là bài toán cộng chuỗi. Bởi vì String thì immutable (bất khả chuyển, không thể thay đổi kích thước) dẫn đến để giải bài toán cộng chuỗi thì ta sẽ mô tả một cách không chính xác như sau (chỉ là tinh thần/chiến lược cộng chuỗi)
– Lấy độ dài của chuỗi thứ nhất
– Lấy độ dài của chuỗi thứ hai
– Tìm ra độ dài của chuỗi mới
– Tìm vùng nhớ có độ dài phù hợp
– Sao lưu chuỗi thứ nhất
– Sao lưu chuỗi thứ hai vào ngay sau chuỗi thứ nhất
– Kiểm tra xem chuỗi thứ nhất còn có ai dùng không?
– Nếu không thì để GC giải phóng nó
– Kiểm tra xem chuỗi thứ hai còn có ai dùng không?
– Nếu không thì để GC giải phóng nó
– Tái cấu trúc lại String pool để chống phân mảnh.
=> Quá nhiều bước thuật toán cho một cuộc tình.

Vậy StringBuilder (class tương tự là StringBuffer) ra đời làm cứu cánh cho vấn đề này. Chiến lược được đặt ra là cho đến khi String chính thức được hoàn thành, thì không lưu vào String pool vội mà dùng đến một mảng char[] để lưu tạm bên ngoài, xử lý hoàn toàn các thao tác với string rồi mới build ra một String để cho nó vào String pool. Nhờ vậy mà số lượng bước thuật toán được giảm đi giúp chương trình chạy nhanh hơn trong xử lý chuỗi. Tuy nhiên, vấn đề gặp phải là phải trả giá về không gian lưu trữ.

Ngoài ra, bạn có thể thấy một điều trong danh sách các cấu tử (hàm khởi tạo, constructor…) có một hàm như sau:

public StringBuffer(int capacity) {
value = new char[capacity];
}

Vậy capacity là gì? Về bản chất thì mảng char vẫn là array và mảng này sẽ chịu chung yếu điểm của tất cả các array đó là immutable. Điểm khác biệt hơn so với string trong String pool là array có thể khai báo một kích thước lớn hơn kích thước nó cần. Vì vậy khi cần phải thực hiện cộng chuỗi, nếu kích thước của array vẫn lớn hơn kích thước của chuổi mới, ta chỉ cần copy vào trong là xong. Không cần tìm vùng nhớ khác. Vậy capacity chính là kích thước đầu tiên dùng để khởi tạo nên mảng này.

Tại sao điều này lại quan trọng? Bởi vì bạn khéo chọn capacity phù hợp thì StringBuilder của bạn mới phát huy toàn bộ tác dụng của nó. Còn thế nào là phù hợp thì lại dựa vào kinh nghiệm làm việc của bạn.

Tóm lại, String là đối tượng final. Mọi thay đổi của một chuỗi sẽ tạo ra một chuỗi mới và bản gốc trở thành rác (garbage). Càng nhiều chuỗi được sửa đổi thì càng có nhiều rác xuất hiện. Cuối cùng, nó làm chậm ứng dụng hoặc toàn bộ hệ thống (do các hoạt động Thu gom rác). Do đó, chúng ta sử dụng StringBuilder khi nội dung thường xuyên thay đổi, sử dụng String khi nội dung ít hoặc không thay đổi.

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

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

Developer khác Coder như thế nào? Cách trở thành một Developer chính hiệu

Phương pháp tự học của một Developer đúng nghĩa

Bài viết được sự cho phép của tác giả Lê Nhật Thanh

Khi bạn bước vào con đường của một lập trình viên, tự học luôn là điều cốt lõi trong quá trình phát triển sự nghiệp của bạn. Từ khi còn ngồi trên giảng đường đại học cho tới khi ra trường, đi làm và trở thành một lập trình viên thực thụ, hai chữ “tự học” sẽ luôn theo bạn trong toàn bộ con đường sự nghiệp.

Ngoài ra đây cũng là một trong những câu hỏi phỏng vấn rất thường xuyên được hỏi. Ví dụ như “Cho bạn một ngôn ngữ mới mà bạn chưa biết, thì bạn sẽ học nó như thế nào? Và trong bao lâu thì có thể làm việc được?”.

Trước khi bắt đầu bài viết, mình muốn hỏi bạn một vài câu hỏi. Bạn có đang tự học? Và bạn có đang tự học đúng cách? Thực tế cho thấy, học sinh sinh viên hiện đại bây giờ cực kì thụ động đối với chuyện học hành.

Với kinh nghiệm học tập và làm việc trong nhiều năm, mình muốn chia sẻ một vài bí quyết tự học được mình đúng kết lại và cô động trong bài viết này.

Phân biệt một chút về Developer và Coder

Sở dĩ mình phân biệt coder và developer là vì theo quan điểm của mình, vấn đề tự học ở hai level này có một chút khác biệt. Chúng ta sẽ tìm hiểu ngay điều này.

Khi bạn mới đặt tay vào code, đúng hơn là lúc bạn đang ở trong trường học, cho tới lúc ra đi làm (một fresher) và có một chút kinh nghiệm (một junior) thì bạn được gọi là một coder. Đúng rồi, một coder là người có khả năng code.

Khi bạn có nhiều năm kinh nghiệm làm việc, bạn có thể trở thành một senior developer. Và lúc này, bạn được gọi là một developer đúng nghĩa. Bạn có khả năng code, phân tích và giải quyết vấn đề và khả năng training cho người khác.

Vậy thì hai level trên sẽ khác nhau như thế nào trong vấn đề tự học? Chúng ta sẽ tìm hiểu ngay sau đây.

Sự khó khăn khi tiếp cận một thứ gì đó mới của Coder, người mới học lập trình

Đối với những bạn chưa có kinh nghiệm code nhiều, thì bạn sẽ dễ bị phụ thuộc vào người khác. Bạn sẽ hay có suy nghĩ “có thầy dạy sẽ tốt hơn và nhanh hơn”. Và tư duy lập trình chưa nhiều, chưa trải nghiệm qua nhiều công nghệ, nên việc tiếp cận một cái gì đó mới thường sẽ gặp khó khăn.

Ở trong giai đoạn này, bạn sẽ có suy nghĩ tìm tới những trung tâm đào tạo lập trình viên. Đây là một lựa chọn tốt cho bạn, nhưng ở đây, mình muốn chia sẻ kinh nghiệm hoàn toàn tự học cho bạn. Vì chính bản thân mình, chưa từng học tại bất kì một trung tâm nào. Thâm chí ngành học trong trường đại học không phải là IT mà là điện tử viễn thông. Mình không được học bất cứ thứ gì về database, cấu trúc dữ liệu, giải thuật hay hướng đối tượng OOP. Toàn bộ về “background IT“, mình tự học 100%.

Mình cũng từng trải qua giai đoạn là một coder mới vào nghề và ngay bây giờ mình sẻ nói đôi chút về các phương pháp mình đã áp dụng. Vì giai đoạn này cực kì quan trọng trong quảng đời của một lập trình viên.

  Những cái “khó” khi mới học lập trình

Để tiếp cận một ngôn ngữ mới, một công nghệ mới, hay một cái gì đó mới trong ngành IT, bạn hãy lên trang chủ của nó, đọc và làm theo document hay tutorial chính thống của nó. Đây là câu trả lời rất đúng trong trường hợp… bạn đi phỏng vấn hoặc bạn là một developer đúng nghĩa.

Thực tế thì, đối với những bạn mới học lập trình, chưa có kinh nghiệm, vốn tiếng Anh không nhiều. Thì cách ở trên khá là khó tiếp cận trong thực tế.

PHƯƠNG PHÁP TỰ HỌC CỦA MỘT DEVELOPER ĐÚNG NGHĨA
Sự khó khăn của newbie khi học cái gì đó mới.

 

Lấy một ví dụ cụ thể, bạn là coder, chưa biết gì về công nghệ Nodejs và bạn đang muốn học nó. Bạn thử lên trang chủ của nó, đọc thử và cảm nhận. Đa số các bạn sẽ gặp khó khăn rất nhiều và dễ dàng bỏ cuộc vì không biết đọc như thế nào. Và bắt đầu từ đâu.

Vậy đâu là cách tốt nhất khi học một cái gì đó mới, một công nghệ mới, một ngôn ngữ mới dành cho coder?

Việc làm IT Fresher dành cho bạn

Cách tiếp cận cái gì đó mới dành cho Coder

Video. Đúng vậy, bạn nên tiếp cận trước tiên bằng các video tutorial. Nếu vốn Tiếng Anh của bạn có hạn, bạn có thể lên Youtube và tìm các video bằng Tiếng Việt. Hoặc một cách tiếp cận khác là tìm kiếm các khóa học online bằng video. Một số trang bạn có thể tham khảo là myclass, udemy, lynda. Học ở những trang online này, bạn sẽ rèn luyện được thêm kĩ năng nghe Tiếng Anh của mình.

Hãy quay lại ví dụ học Nodejs trên kia. Sau khi bạn đã tiếp cận các video tutorial trên Youtube hoặc các khóa học online (lưu ý là những khóa học này thường ngắn – khoảng vài chục giờ đồng hồ), bạn sẽ có một ít kiến thức căn bản nhất về Nodejs. Sau đó hãy quay lại trang chủ nodejs.org, lúc này là khoảng thời gian bạn tập trung, kiên trì vào tài liệu chính thống và bắt đầu chinh phục Nodejs.

Theo ví dụ trên, rõ ràng khi bạn tiếp cận một công nghệ mới, thì video là nguồn tài liệu giúp bạn dễ tiếp cận nhất. Và sau đó, chính trang chủ (homepage) của chính công nghệ, ngôn ngữ đó là nơi bạn tiếp tục rèn luyện. Hãy xem chính homepage này là một từ điển, bạn sẽ dùng và tra thường xuyên trong suốt quá trình học.

Ngoài ra, có một chuyện quan trọng khác khi tự học chính là lúc bạn gặp một vấn đề, một bug, hay một lỗi (error) nào đó. Lúc này, bạn phải học cách giải quyết vấn đề bằng nhiều cách khác nhau.

Trước tiên hãy dùng các công cụ mạnh nhất chính là internet và sử dụng google một cách thông minh nhất. Bạn có thể search bằng cả Tiếng Việt và Tiếng Anh. Điều quan trọng nhất để bạn có thể tìm được hướng giải quyết chính là đặt những câu hỏi với từ khóa đúng nhất. Hoặc bạn có thể đăng các câu hỏi thắc mắc lên các diễn đàn thích hợp. Khuyến nghị bạn dùng stackoverflow cho Tiếng Anh và daynhauhoc cho Tiếng Việt.

Bạn cũng có thể đăng câu hỏi mình lên trên các group, forum khác mà bạn nghĩ rằng sẽ nhận được câu trả lời.

Một cách khác nữa, hãy đi hỏi những người giỏi hơn bạn. Điều này giúp bạn mở rộng mối quan hệ và giải quyết vấn đề nhanh hơn. Bạn cũng thể thành lập các nhóm (2 người trở lên) để cùng học tập và làm việc. Vì teamwork có sức mạnh rất ghê gớm.

Một lưu ý cuối, bạn là coder chưa có nhiều kinh nghiệm, nên hãy tập trung vào những gì nền tảng nhất dành cho một developer (ví dụ tư duy lập trình, cấu trúc dữ liệu, giải thuật, OOP, cơ sở dữ liệu) và nắm bắt nó thật chặt. Khi bạn đã có một nền tảng tốt, quá trình học và làm việc sau này sẽ dễ dàng hơn.

Hãy nhìn cách tiếp cận của một Developer đúng nghĩa

Developer hay senior developer hoặc cao hơn là những người đã có rất nhiều kinh nghiệm trong lĩnh vực của mình. Họ đã có một lượng kiến thức, tư duy nhất định về cấu trúc, flow, hay kiến trúc của các loại công nghê khác nhau, họ luôn có cái nhìn tổng quát trong quá trình làm việc. Cho nên việc học một công nghệ mới của họ thường đơn giản hơn.

Họ là những người sẽ tiếp cận với homepage của công nghệ đó ngay từ lúc ban đầu. Bởi vì đã có cái nhìn tổng quan về các loại công nghệ, họ có một cách nhìn đa chiều vào những gì mình đang học. Họ so sánh với những gì mình biết trong quá khứ để nhìn xem công nghệ mình đang học có những điểm gì nổi trội so với các công nghệ khác.

Với khả năng phân tích và giải quyết vấn đề, họ dương như làm chủ một công nghệ mới rất nhanh và chắc chắn.

Kiên trì, đam mê là 2 từ dành cho một developer thành công. Con đường để trở thành một developer đúng nghĩa không đơn giản nhưng cũng không quá phức tạp. Chỉ cần với niềm đam mê và lòng kiên trì trong quá trình học và làm việc, bạn sẽ thành công trong con đường của mình.

Để làm được điều này, bạn cần xác định được mục tiêu rõ ràng ngay từ ban đầu và đi theo đúng những gì mà bạn đã vạch ra. Thành công sẽ đến với bạn.

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

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

Động lực để bạn trở thành một Developer

dong-luc-de-ban-tro-thanh-mot-developer

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

Chào các bạn,

Có bao giờ bạn cảm thấy con đường chinh phục nghề developer quá gian nan không? Với hàng tấn kiến thức phải học, trong khi đó thì công nghệ vẫn đang thay đổi từng ngày, còn bạn thì vẫn đang giậm chân tại chỗ với vốn kiến thức “chẳng đâu vào đâu”.

Nếu như bạn đang gặp phải tình trạng như mình mô tả trên thì bài viết này là dành cho bạn đấy. Hãy đọc hết nhé.

I. Dễ dàng có công việc tốt

Chúng ta đang sống trong cuộc cách mạng công nghiệp 4.0, thời đại mà bất kỳ lĩnh vực nào cũng có sự can thiệp của công nghệ thông tin. Vì vậy để có một công việc tốt thì không bắt buộc bạn phải là một developer siêu sao.

Khác với nhiều ngành nghề khác, nghề developer rất dễ dàng kiếm việc. Bằng chứng là bạn chỉ cần lên các trang web tìm kiếm việc làm online là thấy các tin tuyển dụng “lập trình viên” rất nhiều. Chỉ cần bạn muốn và chịu bỏ thời gian đi phỏng vấn thì chắc chắn sẽ có một công việc tốt. Anh em tại công ty mình làm việc vẫn đồng ý với nhau rằng “developer không bao giờ phải đi xin việc, chỉ có đi chọn việc“.

Chưa kể bạn hoàn toàn có thể tự làm ở nhà thông qua hình thức làm freelance hoặc làm remote cho các đơn vị khác.

Có được một công việc tốt sẽ là một khởi đầu tốt cho sự nghiệp của bạn.

  Những cái “khó” khi mới học lập trình

II. Môi trường làm việc tốt

Khi làm developer thì bạn sẽ được xếp vào tầng lớp “Dân văn phòng” – được nhiều người coi là “ngồi mát ăn bát vàng”. Thực tế thì chỉ đúng một nửa đó là ngồi mát (có điều hòa), còn ăn bát vàng hay không thì phụ thuộc vào năng lực của bạn nữa. Nhưng được ngồi mát thì đã là sướng lắm rồi.

Môi trường làm việc của các công ty IT (hoặc công ty có bộ phận IT) cũng thường thoải mái. Nhiều công ty IT mình biết thì họ cung cấp mọi thứ để developer của mình có môi trường làm việc thoải mái nhất như: đồ ăn vặt, đồ uống miễn phí, đồ tập gym, máy tính xịn,…

Việc làm IT Fresher dành cho bạn

III. Lương khủng

Đây có lẽ là liều thuốc động lực lớn nhất với nhiều người. So với mặt bằng chung, lương của developer thuộc dạng cao so với các nghành nghề khác. Một bạn sinh viên IT mới ra trường, không cần phải là siêu sao, chỉ cần tốt nghiệp loại khá cũng tự tin deal lương 9 – 10 triệu. Làm việc 1, 2 năm kinh nghiệm con số đó có thể tăng thêm gấp bội phần.

Bạn có thể tham khảo bài viết “Những tin tuyển dụng nghìn đô yêu cầu gì ở Web Developer” mà mình đã viết trước thì phần nào hiểu được việc đạt được mức lương nghìn đô với Developer cũng không phải chuyện quá khó.

Nếu kiên trì theo đuổi, thì sẽ không có con số nào có thể giới hạn mức lương của bạn được.

  30 tuổi có học lập trình được không?

IV. Cơ hội phát triển bản thân rộng mở

Developer là nghề đem lại cơ hội phát triển bản thân rất lớn cho bạn. Từ một developer bạn có thể trở thành:

  • Leader: Trưởng nhóm
  • Project manager: Quản lý dự án
  • Software architect: Kiến trúc sư phần mềm
  • CTO: Giám đốc công nghệ

Tùy vào mỗi công ty mà vị trí trên lại có vai trò và nhiệm vụ khác nhau, nhưng nhìn chung thì cơ hội phát triển bản thân của developer rất rộng mở. Thậm chí nếu bạn có máu kinh doanh thì hoàn toàn có thể startup bằng một sản phẩm công nghệ của chính mình.

V. Lời kết

Nghề developer có thể coi là trend của thời đại, và trend này chưa có dấu hiệu kết thúc. Nếu bạn chịu khó học tập, nghiên cứu kết hợp với thực hành thì chắc chắn bạn sẽ thành công.

Bài viết được viết dựa trên sự quan sát và đánh giá của bản thân mình, hy vọng sẽ giúp bạn hiểu rõ hơn về công việc này, để từ đó có thểm động lực phấn đấu.

Chúc bạn thành công.

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

Xem thêm:

Đừng bỏ lỡ hàng loạt IT job hot tại TopDev

Lombok là gì? Sinh code tự động trên Eclipse – Intellij

Lombok là gì? Sinh code tự động trên Eclipse – Intellij

Bài viết được sự cho phép của tác giả Trần Hữu Cương

1. Lombok là gì?

Lombok là một thư viện Java giúp tự sinh ra các hàm setter/getter, hàm khởi tạo, toString… và tinh gọn chúng.

Thực tế thì hầu hết các IDE hiện này đều hỗ trợ sinh code tự động ví dụ như trên eclipse ta click chuột phải vào file cần sinh code và chọn Source và chọn các method cần sinh rLombok

Tuy nhiên với những class có nhiều thuộc tính thì việc hiển thị các hàm getter/setter hay các hàm toString sẽ khiến cho class bị rối. Lombok sinh ra chính là để khắc phục những điểm đó.

Ví dụ class không sử dụng lombok và class có sử dụng lombok:

Lombok

2. Cài đặt Lombok

Để sử dụng các annotation của Lombok ta cần sử dụng thư viện lombok:

Sử dụng maven:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
    <scope>provided</scope>
</dependency>

Hoặc download file lombok-1.16.20.jar

  Project Lombok là gì? Getter, Setter và Constructors với Project Lombok

  Sử dụng Lombok để rút gọn code trong Java

Cài đặt plugin lombok cho IDE

Với Intellij: vào File/Settings/Plugins và nhập lombok ở ô tìm kiếm và click install.

Lombok

Với Eclipse: ta click vào file lombok-1.16.20.jarhoặc chạy lệnh java -jar lombok-1.16.20.jar

Trên giao diện cài đặt lombock, ta click button “Specify Location” và trỏ tới file eclipse.exe

Lombok

Lombok

Sau khi cài đặt thành công ta sẽ thây lombok xuất hiện trong phần about của eclipse.

Lombok

Tuyển dụng lập trình viên Java lương cao

3. Code ví dụ với lombok

Đầu tiên là với annotion @Getter @Setter sẽ giúp sinh ra các  method getter/setter

Lombok

Ngoài cách dùng annotation @Getter @Setter trước các field ta có thể dùng trước class để áp dụng cho tất cả các field

Lombok

Annotation @AllArgsConstructor và @NoArgsConstructor giúp tạo ra các hàm khởi tạo với tất cả các tham số và hàm khởi tạo không tham số

Lombok

Annotation @ToString @EqualsAndHashCode giúp tạo ra các hàm equal và toString theo tất cả các thuộc tính.

Lombok

Nếu bạn chỉ muốn equal hay toString cho một số field thì có thể dùng thêm thuộc tính exclude:

Ví dụ mình chỉ muốn toString trả về name, và hàm equal theo name:

@ToString(exclude="address")
@EqualsAndHashCode(exclude="address")
public class Person {
  @Getter @Setter private String name;
  @Getter @Setter private String address;
}

Annotation @Data sẽ tương đương với annotation @Getter + @Setter + @ToString + @EqualsAndHashCode + @NoArgsConstructor

Lombok

Demo:

Ta không khai báo hàm khởi tạo với tham số và các hàm getter/setter nhưng vẫn có thể gọi nó vì lombok đã tự generate và tối ưu nó.

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;

@ToString(exclude = "address")
@AllArgsConstructor
@Data
public class Person {
  private String name;
  private String address;

  public static void main(String[] args) {
    Person person = new Person("kai", "Ha Noi - Viet Nam");
    System.out.println(person);
    System.out.println("Address: " + person.getAddress());
 }

}

Kết quả:

Lombok

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

Bạn có thể quan tâm:

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

CQRS pattern là gì? Ví dụ dễ hiểu về CQRS Pattern

CQRS pattern là gì? Ví dụ dễ hiểu về CQRS Pattern

Quay lại với chuỗi bài về pattern và các pattern trong thiết kế hệ thống, bài viết hôm nay xin phép được trình bày một cách rất chi là cẩn thận, dễ hiểu cho anh em về CQRS pattern.

À trước khi bắt đầu thì thông tin thêm cho anh em là pattern này nằm trong danh sách các pattern thường apply vào thiết kế hệ thống.

Dành cho anh em nào chưa biết pattern.

In software engineering, a design pattern is a general repeatable solution to a commonly occurring problem in software design. A design pattern isn’t a finished design that can be transformed directly into code. It is a description or template for how to solve a problem that can be used in many different situations.

Trong phần mềm, design pattern là một giải pháp chung để giải quyết các vấn đề lặp đi lặp lại trong thiết kế phần mềm. Design pattern không phải là một khuôn mẫu hoàn chỉnh có thể quăng ra thành code luôn. Nó là khuôn mẫu xử lý một vấn đề được sử dụng trong nhiều hoàn cảnh khác nhau.

CQRS pattern

Rồi, tản mản về Design Pattern vậy là đủ, giờ quay qua nhân vật chính (CQRS pattern). Bắt đầu ngay thôi nào!.

1. CQRS pattern là gì?

Vẫn luôn bắt đầu với định nghĩa theo phong cách viết bài của tui. Bóc tách từng chữ từng chữ một.

Đầu tiên thì CQRS là viết tắt của Command and Query Responsibility Segregation. Bóc tách từng chữ ra thì Segregation là phân tách, Responsibility là trách nhiệm. Vậy dịch sơ sơ cái CQRS có nghĩa là phân tách trách nhiệm giữa Command và Query.

Command and Query Responsibility Segregation, a pattern that separates read and update operations for a data store. Implementing CQRS in your application can maximize its performance, scalability, and security. The flexibility created by migrating to CQRS allows a system to better evolve over time and prevents update commands from causing merge conflicts at the domain level

CQRS là pattern chia việc đọc và cập nhật dữ liệu thành 2 phần khác nhau. Ứng dụng CQRS vào ứng dụng có thể giúp nâng cao hiệu năng, khả năng mở rộng và tính bảo mật. Tính linh hoạt khi chuyển qua CQRS cho phép hệ thống phát triển tốt hơn theo thời gian và ngăn các lệnh cập nhật gây xung đột trên cùng một domain.

Vẫn hơi khó hiểu, thôi thì tạm bỏ qua phần định nghĩa ta đi tới từng phần trong đó (Command và Query).

  SAGA Pattern trong Microservices
  Hướng dẫn Java Design Pattern – Object Pool
  

2. Command và Query

CQRS pattern hướng mục tiêu chia tách Command và Query ra thành 2 phần khác biệt. Anh em lưu ý là commands sẽ bao gồm các HTTP method: POST, PUT, DELETE và PATCH.

Còn phần query theo đúng nghĩa tên gọi của gói, chỉ là GET method, lấy data từ DB.

CQRS pattern

Như hình vẽ trên đây thì findProductById sẽ lấy product theo ID. Còn createProduct sẽ gọi method POST, tạo record mới về product. Cả hai phần này đều nằm trong microservices nhưng độc lập với nhau ha.

Sau khi đã hiểu sơ Command là gì, Query là gì?. Giờ là lúc quay ngược trở lại với câu hỏi tại sao lại cần pattern này?. Anh em có hiểu được mục đích sinh ra pattern mới nhớ được lâu, mới trả lời được mục đích của pattern là gì ha.

3. Tại sao lại cần CQRS pattern?

Chính vì CQRS pattern tách GET và các Http method còn lai ra thành hai phần. Mà GET sử dụng để truy vấn data, còn các method khác là để thao tác với dữ liệu. Nên nguyên nhân đầu tiên và dễ hiểu nhất là:

Do nhu cầu giữa việc truy vấn dữ liệu và thao tác với dữ liệu khác nhau. Một ứng dụng có thể thực hiện cả triệu câu query GET hằng ngày nhưng chỉ thao tác insert vài câu.

Một số nguyên nhân khác:

  • Các tiếp cận cả Command và Queries trên cùng một services có thể gây ảnh hưởng tới performance.
  • Sự khác biệt về quyền được thực hiện Commands và Queries khác nhau đôi khi cũng làm services trở nên phức tạp.
  • Dữ liệu có thể bị xung đột khi thực hiện song song cả truy vấn và thao tác.

Tuyển dụng lập trình viên Frontend lương cao tại đây!

CQRS pattern

4. Hiện thực CQRS pattern

Như đã nói ở trên CQRS pattern tách việc đọc và ghi thành 2 models khác nhau. Ta có thể tối ưu cho từng models

  • Phần commands phải dựa trên nhiệm vụ mà nó thực hiện.
  • Trường hợp có nhiều commands, các commands sẽ đem vào hàng đợi để thực hiện bất đồng bộ.
  • Phần Queries chỉ thực hiện truy vấn dữ liệu, không bao giờ thao tác trên dữ liệu. Dữ liệu trả về theo kiểu DTO không giới hạn. Tuỳ thuộc dữ liệu muốn lấy.

Đạt được 3 điểm này là đã hiện thực được CQRS Pattern.

CQRS pattern

5. Ưu nhược điểm

Phù, cuối cùng cũng nói xong về định nghĩa và giải thích. Mong rằng tới đây anh em đã hiểu rõ mục đích của pattern này.

Giờ tới phần ưu nhược điểm, phần này giúp anh em hiểu rõ hơn ưu nhược điểm để cân nhắc lúc nào thì nên apply pattern này.

5.1 Ưu điểm

CQRS pattern có một số ưu điểm có thể nhìn được rõ:

  • Independent scaling (khả năng mở rộng độc lập). Thay vì scale cho cả đọc và ghi thì giờ phần nào nhiều anh em có thể scale phần đó. Nếu truy vấn nhiều có thể maintain, tối ưu phần queries services.
  • Optimized data schemas (các schema khác nhau). Đã chia nhỏ ra hai phần độc lập và đọc và ghi dữ liệu thì có thể tạo các schema khác nhau cho đọc và ghi.
  • Separation of concerns (tách rời các mối quan tâm). Việc tách riêng 2 phần cũng giúp hệ thống dễ bảo trì, linh hoạt hơn trong phát triển và maintain. Phần logic phức tạp có thể đem qua commands, phần queries thì đơn giản hơn, tuy nhiên cần tối ưu tốc độ.

Nói chung tất cả các benefit của CQRS đều nằm ở việc phân tách rõ ràng giữa Commands và Queries.

5.2 Nhược điểm

Toàn ưu điểm nhưng pattern nào cũng tồn tại nhược điểm của riêng nó. Đối với CQRS tồn tại một số nhược điểm:

  • Complexity (phức tạp). Cái này rõ ràng là phân tách sẽ phức tạp hơn nhiều so với cách làm truyền thống. Nếu microservices của anh em còn có Event Sourcing pattern thì lại càng phức tạp. Cái này tui sẽ nói ở bài Event Sourcing ha.
  • Eventual consistency (nhất quán của sự kiện). Khi đã phân tách commands và queries. Sự nhất quán của dữ liệu có thể bị ảnh hưởng. Phần dữ liệu đã ghi vào rồi nhưng queries lấy ra lại chưa có. Cái này là vấn đề lớn

5.3 Lúc nào không nên apply

Pattern này được khuyến cáo không nên apply nếu:

  • Mô hình business đơn giản, không có quá nhiều truy vấn hay thao tác tới dữ liệu.
  • Ứng dụng CRUD đơn giản, hoặc ứng dụng chỉ yêu cầu truy vấn dữ liệu

Viết ra đây không lỡ anh em cứ cắm đầu apply lại mệt, thực chất tách ra cũng không phải dễ mà triển khai.

6. Tham khảo

Bài sau sẽ là Event Sourcing Pattern nha anh em. Ráng biết nhiều để phục vụ được các ý tưởng sáng tạo nha.

Cảm ơn anh em đã đọc bài – Thank you for your time – Happy coding!

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

Xem thêm: 

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

DRM là gì? DRM hoạt động như thế nào?

DRM là gì? DRM hoạt động như thế nào?

Anh em dạo gần đây nếu chụp screenshot cho Udemy hay Netflix (cả trên MacOS và Windows), anh em có thấy màn hình đen thùi lùi không?, đó chính là DRM (Digital Right Management).

Bài viết này giới thiệu cho anh em đôi điều về DRM và giải thích DRM hoạt động như thế nào?

DRM

Mong rằng kiến thức về DRM sẽ hữu ích với anh em nếu sau này có làm gì liên quan tới media và muốn protect media. Tất nhiên nhu cầu bảo vệ bản quyền là chính đáng ha, tất cả đều là tài sản trí tuệ nên bảo vệ được anh em cứ bảo vệ nha.

1. Nhu cầu cần có

Bảo vệ tài sản kỹ thuật số từ lâu đã không còn là nhu cầu mới mẻ đối với cá nhân, tổ chức. Tất cả các tài liệu kỹ thuật số (từ hình ảnh, video, file pdf). Tất cả tạo ra với chi phí lớn, bao gồm bản quyền trí tuệ của cá nhân tổ chức.

Chính vì lí do đó, tất cả cần được bảo vệ ở mức độ thích hợp. DRM là công nghệ sinh ra để bảo vệ bản quyền trí tuệ đó. Nhờ có nó mà hạn chế được rất nhiều các vụ vi phạm bản quyền, ăn cắp trí tuệ. Bảo vệ được bản quyền cũng đồng nghĩa với việc bảo vệ được người tạo ra sản phẩm đó. Từ đó giúp phát triển hơn nữa các sản phẩm trí tuệ có tính ứng dụng cao.

DRMNhư Netflix hoặc Udemy anh em cứ vào thử chụp hình đảm bảo là đen thùi lùi, đó là DRM ha.

2. DRM là gì?

Digital rights management is a technology that helps control what viewers or users can do with digital assets. For example, DRM software can prevent unauthorised copying, forwarding or editing of a media file

DRM (Digtal right management) là công nghệ giúp kiểm soát người xem hoặc người sử dụng những gì họ có thể làm với các tài nguyên kỹ thuật số. Ví dụ, phần mềm DRM có thể bảo vệ khỏi sao xem, gửi hoặc chỉnh sửa bất hợp pháp các nội dung không được cho phép

Tất nhiên là DRM không phải là công cụ duy nhất sử dụng để bảo vệ các tài nguyên kỹ thuật số nha anh em. Những file cần có yêu cầu bảo mật cao nên được lưu trữ trong hệ thống an toàn, khó bị tấn công đánh cắp.

Chứ tới lúc đã vào xem được file, xem được nội dung mà dùng DRM thì không ổn lắm. Vì thực chất DRM chặn copy từ chính máy đang xem, chứ DRM không thể bảo vệ trường hợp dùng điện thoại hoặc máy ảnh khác chụp lại.

Về mặt lý thuyết thì DRM nên đứng sau, chứ không phải đứng trước để bảo vệ tài nguyên. Tất cả nên được bảo vệ và kiểm soát kĩ trước khi được phép truy cập tài nguyên.

  Tại sao Web Developer nên học về Digital Marketing?
  Digital Twins – xu hướng công nghệ cho ngành IoT

DRMBảo vệ thật sự chứ không phải bảo vệ giữa chừng nha anh em.

3. DRM bảo vệ nội dung như thế nào?

DRM (Digital rights management) hoạt động bằng cách mã hoá file (encrypting files). Về cơ bản là làm cho nội dung bị trộn lẫn, không thể đọc được. Công nghệ DRM hiện tại thường dùng mã hoá AES 128 bit.

Mặc dù như bộ phim ở Netflix anh em có thể xem được bình thường, nhưng tải về mà không giải mã được thì file đó cũng trở thành file vô dụng. Để DRM có thể hoạt động thì phía nội dung cần dựng lên một máy chủ (server).

Về phía browser thì browser cần nhận biết được nội dung đang phát là nội dung được bảo vệ và cần có key để yêu cầu mở khoá. Từng bước hoạt động của DRM có thể hiểu theo các bước đơn giản dưới đây:

  • Nội dung được mã hoá
  • Trình chiếu yêu cầu key mã hoá
  • Licence service (service này dùng để kiểm tra key đúng không) xác thực người dùng
  • Server trả về key cho người dùng hợp pháp
  • Người dùng sử dụng key để mã hoá nội dung

Hiện nay trên thị trường đang có 3 hệ thống DRM lớn là:

  • Widevine của Google,
  • FairPlay của Apple
  • PlayReady của Microsoft.

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

DRM

Với 3 hệ thống DRM này thì việc xác thực và giải mã không hề gây gián đoạn cho người xem.

4. Tham khảo

Cảm ơn anh em đã đọc bài – Thank you for your time – Happy coding!

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

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

Tìm kiếm việc làm IT mới nhất tại TopDev!

SAGA Pattern trong Microservices

SAGA Pattern trong Microservices

Tìm ra bài viết này chắc hẳn anh em đã biết về microservices, concept của micro services chia các service nhỏ để scale và quản lý, nhưng nó lại phát sinh vấn đề về sự nhất quán của dữ liệu giữa các micro services, đó là lý do tui viết bài về SAGA Pattern cho anh em.

SAGA pattern Anh em yên tâm, nhức đầu sẽ theo cấp độ. Cứ nhức đầu dần thôi à =)))

Vậy SAGA pattern là gì? Bằng các nào nó có thể quản lý và đảm bảo được sự nhất quán dữ liệu giữa các micro services?

Tất cả sẽ được trình bày rõ trong bài viết này.

Microservices concept thì nhiều anh em biết rồi, nhưng SAGA pattern thì ít

Bắt đầu thôi anh em. Luôn là định nghĩa.

1. Saga Pattern là gì?

The Saga design pattern is a way to manage data consistency across microservices in distributed transaction scenarios. A saga is a sequence of transactions that updates each service and publishes a message or event to trigger the next transaction step. If a step fails, the saga executes compensating transactions that counteract the preceding transactions.

Saga design pattern là cách quản lý sự thống nhất của dữ liệu giữa các microservices trong các kịch bản việc giao dịch là phân tán (distributed). SAGA là một chuỗi các giao dịch cập nhật giữa các service và publish thông báo hoặc trigger các bước transaction. Nếu một bước thất bại, SAGA sẽ thực hiện giao dịch tương tự để khoả lấp cho các transactions trước đó

Ôi lạy chúa cái định nghĩa đọc thôi đã thấy khó hiểu. Để tóm tắt lại cho anh em, đơn giản thì có 2 ý:

  • SAGA Pattern là pattern đảm bảo tính nhất quán của dữ liệu (bằng các quản lý transactions) giữa các microservices khác nhau.
  • Vì là hệ thống phân tán nên mỗi ông có thể xử lý một phần (nằm trên một transactions), nếu một cái bị fail thì SAGA lúc này có thể thực hiện một transactions thay thế bù vào cái transactions bị fail đó.

SAGA pattern Phân tán (distributed) nghĩa là chia rỏ và nằm rải rác nhiều nơi. Kiến trúc này có thể apply cho cả hệ thống, database,…

  Phát triển phần mềm theo kiến trúc microservice
  Thiết kế service có tải ghi cao không gây tranh chấp tài nguyên

2. Giải pháp

Về mặt ý tưởng, mỗi micro services khi nhận được yêu cầu thực hiện transactions, bản thân micro services đó sẽ thực hiện transactions tại chính services đó. Sau khi đã thực hiện xong, theo hướng của SAGA Pattern, services đó sẽ publish một thông báo (message) hoặc một events (sự kiện).

Từ thông báo hoặc sự kiện đó sẽ biết được transactions nào nên được thực hiện tiếp.

SAGA pattern

Như hình phía trên, Order Services sau khi thực hiện transactions tại service sẽ publish message hoặc event để biết kế tiếp sẽ phải thực hiện transactions tại Customer Service.

Customer Services sau đó publish tiếp để biết cần phải quay lại Order Service để thực hiện tiếp transactions.

Tuyển dụng lập trình viên Frontend lương cao tại đây!

3. Hai cách quản lý

Theo như concept này, có 2 cách để SAGA có thể quản lý được transactions:

  • Thứ nhất là Choreography (Vũ đạo), ở đây anh em hiểu là vũ công cũng được, vì người nào múa người đó. Cái này như ví dụ phía trên, mỗi transactions tự quản lý transactions nào sẽ cần được thực hiện kế tiếp, ông nào lo ông đó.
  • Thứ hai là Orchestration (Ban nhạc), ban nhạc thì anh em biết rồi, có ông nhạc trưởng ban nhạc mới chơi nhạc được. Cách số hai này hướng tới một ông có thể điều phối, tức là hết transactions ở ông Order Service sẽ qua Customer Services, cái này ông điều phối lo.

SAGA pattern Các khái niệm trong lập trình nếu có tên đều có concept giống với thực tế. Anh em cố gắng liên tưởng tí là sẽ hiểu concept

Ngoài ra cách hiểu theo ví dụ thực tế như thế này sẽ nhớ rất lâu. Rất khó quên, anh em nên luyện tập nhớ theo kiểu này nha.

Rồi đi vào từng cái với hình ảnh minh hoạ cho dễ hiểu hơn.

4. Choreography-based saga

Như đã giải thích sơ với anh em ở phía trên, Choreography trong SAGA Pattern theo concept ông nào lo ông đấy.

SAGA pattern

SAGA Pattern mà cụ thể là Choreography thường được áp dụng cho các sàn giao dịch thương mại điện tử. Như ví dụ trên đây:

  • 1. Đầu tiên khi anh em đặt hàng, ông Order Service nhận được một POST request /orders. Lúc này đơn hàng ở trạng thái PENDING.
  • 2. Sau khi đơn hàng đã xong, services này đẩy ra một event là order created.
  • 3. Customer Service nhận được event (hoặc nó trigger events) này, xử lý thanh toán liên quan tới thẻ tín dụng của khách
  • 4. Sau khi đã xong nó sẽ publish lại một event hoặc message cho ông Order biết để approver hoặc reject đơn hàng của khách.

Đơn giản, dễ hiểu. Services nào tự lo, tự xử lý cái event của riêng mình, cần ông nào thì publish ra cho ông đó xài.

4.1 Ưu nhược điểm

Về ưu nhược điểm của Choreography chắc anh em nào code nhiều sẽ đoán ra được. Đầu tiên là ưu điểm:

  • Mẫu này đơn giản, dễ hiểu nên có thể apply nhanh chóng cho các business nhỏ
  • Do services nào handle event, message của services đó nên có thể implement nhanh chóng

Về nhược điểm thì lúc có nhiều hơn events sẽ khiến logic trở nên phức tạp và khó kiểm soát.

5. Orchestration-based saga

Orchestration trong SAGA Pattern thì ngược với Choreography. Chỗ này các micro services không tự handle event mà tập trung lại ở ông Message Broker. Ông này đóng vai trò như người điều phối trong dàn nhạc.

Event nào tới, event nào đi đều phải thông qua ổng, ông điều tới điều lui

SAGA pattern

Giải thích cho hình vẽ phía trên:

  • 1. Anh em cũng nhận được order từ POST request, trạng thái order lúc này vẫn là PENDING.
  • 2. Microservices vẫn đẩy event ra là nhận được order, nhưng nó không cần biết services nào sẽ xử lý tiếp theo, chỉ việc đẩy lên message brokers
  • 3. Ông message broker lúc này gửi tới Customer Services là xử lý credit đi.
  • 4. Ông Customer services xử lý
  • 5. Đẩy lại lên message broker về đơn hàng thanh toán thành công hay thất bại
  • 6. Message broker đẩy lại cho Order service xử tiếp

5.1 Ưu nhược điểm

Về ưu điểm thì Orchestration thích hợp cho các mô hình kinh doanh phức tạp. Cần phải quản lý và xử lý liên quan nhiều giữa các micro services. Trường hợp có thêm services hoặc thêm event, message cũng không quá phức tạp

Về nhược điểm thì có 2 nhược điểm rõ ràng là:

  • Tốn effort để manage và xử lý với message broker. Cái kia chỉ viết logic publish message hoặc event ngay trong services.
  • Signle point of failure -> Ông message broker mà ngủm thì toàn bộ ngủm theo. Cái này không đúng với concept của microservice. Một cái ngủm các cái khác vẫn hoạt động.

6. Tham khảo

Chỉ một bài viết này e là chưa đủ với SAGA Pattern, hẹn anh em ở phần hai, đi sâu hơn và ví dụ sử dụng cho từng loại.

Cảm ơn anh em đã đọc bài – Thank you for your time – Happy coding!

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

Xem thêm: 

Xem thêm các vị trí IT Job hấp dẫn trên TopDev

Tổng hợp 10 câu hỏi phỏng vấn Android Developer thường gặp

Tổng hợp 10 câu hỏi phỏng vấn Android Developer thường gặp

Lập trình Android hiện nay không còn xa lạ với các bạn lập trình viên, nó đã trở thành một hướng đi mà nhiều bạn lựa chọn nhờ thị trường vô cùng rộng lớn. Nếu bạn đang có nhu cầu tìm kiếm một vị trí Android Developer, bài viết hôm nay mình sẽ giúp các bạn chuẩn bị cho buổi phỏng vấn sắp tới bằng top 10 câu hỏi về Android thường gặp nhất đến từ nhà tuyển dụng nhé.

Câu 1: Android là gì?

Android là gì?

Android là một hệ điều hành mã nguồn mở dựa trên Linux được sử dụng trong các thiết bị di động như điện thoại thông minh, máy tính bảng, tivi,… Được Google phát hành lần đầu vào năm 2008, sau nhiều lần cập nhật thường xuyên định kỳ hàng năm, Android hiện đang trở thành nền tảng hệ điều hành điện thoại thông minh (smartphone) phổ biến nhất thế giới.

Android có một hạt nhân dựa trên nhân Linux; middleware, thư viện và API được viết bằng C; còn phần mềm ứng dụng chạy trên một nền tảng ứng dụng gồm các thư viện tương thích với Java. Nó sử dụng máy ảo Dalvik với một trình biên dịch động thường được biên dịch sang Java bytecode.

Câu 2: Lập trình Android sử dụng ngôn ngữ gì?

Hiện nay có nhiều cách để tạo ra các ứng dụng Android, có thể là native app, cross-platform app hay hybrid app. Đối với Native App chỉ những ứng dụng được viết bằng công cụ và SDK mà Google cung cấp cho lập trình viên, chúng ta có thể sử dụng ngôn ngữ lập trình Kotlin, Java hoặc C/C++ cho việc viết source code và phát triển phần mềm. Ngoài ra thì trong lập trình Android, để dựng giao diện ứng dụng chúng ta sử dụng ngôn ngữ XML; thao tác với cơ sở dữ liệu bằng hệ quản trị CSDL quan hệ SQLite. 

Android cung cấp công cụ phát triển chính thức dành cho lập trình viên bao gồm:

  • Android SDK (Software Development Kit) bao gồm ADB (Android Debug Bridge), Fastboot và gói ứng dụng Android (APK)
  • NDK (Native Development Kit): bộ công cụ giúp sử dụng code C/C++ trong Android
  • ART (Android Runtime) – một sự thay thế cho Dalvik là môi trường chạy ứng dụng Android
  • Android Studio: IDE môi trường phát triển tích hợp

  Sử dụng Sqlite trong Android như thế nào hiệu quả nhất?

Câu 3: Nêu vòng đời của một Activity trong Android

Activity trong Android

Activity là thành phần quan trọng nhất của ứng dụng Android, thông thường sẽ cung cấp một cửa sổ (window / frame) hiển thị các thành phần UI (giao diện người dùng) để tương tác. Mỗi Activity sẽ có một vòng đời cụ thể trong quá trình hoạt động tương ứng với những trạng thái cùng methods mà Android cung cấp:

  • Launched: trạng thái mà Activity được kích hoạt, hệ thống đẩy vào stack. Lúc này lần lượt các callback methods sẽ được gọi: onCreate, onStart và onResume.
  • Running: trạng thái Activity đang chạy, người dùng sẽ nhìn thấy UI của Activity và có thể tương tác với chúng. Trong lúc này, nếu có một Activity nào khác chiếm quyền hiển thị thì Activity của chúng ta sẽ callback method onPause. Lúc này nếu người dùng quay lại Activity thì method onResume sẽ được gọi, nếu Activity không được hiển thị lên nữa thì method onStop sẽ được gọi. Khi Actvity đã onStop, để mở lại Activity thì method onRestart sẽ được gọi.
  • Process Killed: Trong trường hợp Activity đang ở không được Active, hệ thống thiếu bộ nhớ để hoạt động thì Activity sẽ bị thu hồi (xử lý hủy) để giải phóng tài nguyên. Khi Activity được gọi lại thì nó sẽ call lại method onCreate.
  • Shutdown: Khi người dùng chủ động tắt ứng dụng thì Activity cũng kết thúc vòng đời của nó và call method onDestroy.

Tham khảo nhiều việc làm Mobile Developer hấp dẫn tại đây!

Câu 4: Fragment là gì? Khi nào sử dụng Fragment

Fragment là một thành phần độc lập trong Android, được sử dụng bởi một Activity, có thể hiểu như một sub-Activity. Fragment có vòng đời và UI riêng. Trong ứng dụng Android, tại một thời điểm thì chỉ có 1 Activity được hiển thị duy nhất lên màn hình; vì thế để đáp ứng cho các giao diện cần chia màn hình ra thành nhiều phần (ví dụ như dạng Tab) để sử dụng, chúng ta sử dụng Fragment cho bài toán này.

  Hướng dẫn sử dụng Content Provider trong Android

Nhiều fragment kết hợp với nhau trong một Activity để xây dựng giao diện đa cửa sổ và có thể tái sử dụng. Lợi ích khi sử dụng Fragment:

  • Có tính module hóa cao hơn
  • Quản lý tốt hơn cho vòng đời của một phần UI riêng biệt
  • Có khả năng tái sử dụng trong các Activity
  • Dễ dàng giải phóng dữ liệu, giảm chi phí bộ nhớ
  • Khả năng xử lý logic linh hoạt hơn nhờ khả năng chia sẻ dữ liệu giữa các Fragment trong cùng một Activity

Câu 5: Nêu các thành phần cơ bản xây dựng UI trong Android

Trong Android, để xây dựng giao diện người dùng (UI) chúng ta sử dụng thành phần cơ bản bao gồm View, ViewGroup và Layout. 

  • View là lớp cơ sở (class) của tất cả các thành phần giao diện được Android cung cấp sẵn như Button, TextView, CheckBox, RadioButton, ImageView,…
  • ViewGroup là một lớp trừu tượng (abstract) kế thừa từ View, nó cũng chính là View nhưng có khả năng chứa các View khác bên trong. 
  • Layout chính là các ViewGroup được xây dựng sẵn với mục đích chứa các View con cùng các điều khiển để sắp xếp vị trí cho các View đó hiển thị lên màn hình. Layout phổ biến sử dụng bao gồm: FrameLayout, ConstraintLayout, LinearLayout, RelativeLayout, GridLayout, TableLayout,…

Câu 6: Canvas là gì?

Canvas được xem như một bề mặt 2D để chúng ta có thể vẽ bất cứ thứ gì lên đó và hiển thị cho người dùng thấy. Chẳng hạn chúng ta có thể vẽ một điểm, một đường thẳng, một hình chữ nhật, đường tròn, elip hay thậm chí cả những hình ảnh phức tạp khác. Có rất nhiều bài toán mà chúng ta sử dụng đến Canvas khi mà nội dung chúng ta muốn hiển thị lên cho người dùng không thể biểu diễn được bằng các View sẵn có. 

Android cung cấp cho chúng ta những method để vẽ các đối tượng trong Canvas như sau:

  • Các đối tượng hình học cơ bản: Point, Line, Oval, React,…
  • Vẽ hình ảnh: Bitmap, Drawable
  • Vẽ tập hợp các điểm: Path
  • Vẽ Text

Câu 7: Làm sao hiển thị các nội dung dạng danh sách trong Android

ListView và RecycleView

ListView và RecycleView là 2 ViewGroup phổ biến sử dụng để hiển thị các nội dung dạng danh sách. ListView giúp hiển thị các thành phần (elements) theo dạng một danh sách có thể cuộn được theo chiều thẳng đứng và được sử dụng như một class cơ bản trong Android từ những phiên bản đầu tiên. RecycleView mới được giới thiệu trong Android L (API level 21) với sự mạnh mẽ và bổ sung nhiều chức năng hơn so với ListView.

RecycleView hỗ trợ scroll theo cả chiều ngang (horizontal) và chiều dọc (vertical); ngoài ra RecycleView.LayoutManager cho phép layout các item trong list theo dạng grid hay staggered grid. RecycleView còn nhiều hỗ trợ bổ sung đáng giá như Animation khi thêm hay xóa 1 item trong danh sách; hỗ trợ draw divider tùy ý. Thêm một cải thiện nữa là RecycleView bắt buộc sử dụng ViewHolder khi tạo một Adapter nhằm cải thiện performance của danh sách tốt hơn.

Câu 8: Broadcast Receiver là gì?

Broadcast Receiver là một trong 4 components lớn trong Android với nhiệm vụ lắng nghe các sự kiện, trạng thái của hệ thống phát ra ví dụ như có tin nhắn đến, hành động rút / cắm sạc, hành động bật/ tắt mạng,… từ đó ứng dụng của chúng ta sẽ xử lý các hành động tương ứng bên trong. Broadcast Receiver có thể hoạt động cả khi ứng dụng đang ở background mode và hay được sử dụng với Service.

Để thực thi được Broadcast Receiver, chúng ta cần phải đăng ký Broadcast trong file Android Manifest hoặc trong file Java (source code) của ứng dụng thông qua lớp IntentFilter tương ứng với từng hành động, sự kiện cụ thể xảy ra trên thiết bị. Chúng ta cũng có thể tự định nghĩa các Custom Broadcast Receiver để truyền thông điệp trong và ngoài ứng dụng mà chúng ta mong muốn. Ngoài ra, Android cũng cung cấp component Local Broadcast Receiver cho việc gửi thông điệp gói gọn trong project, không thông qua hệ thống nhằm tránh bị rò rỉ thông tin ra ngoài các ứng dụng khác.

Câu 9: Có những loại Service nào trong Android

Service cũng là một thành phần chính trong ứng dụng Android giúp chúng ta thực hiện các tác vụ cần nhiều thời gian, không có giao diện người dùng (UI) và không bị tắt khi đóng ứng dụng; chẳng hạn như download file từ Internet, chạy nhạc, đồng bộ dữ liệu lên cloud,…

Service được chia thành 3 loại:

  • Foreground Service: là những services mà người dùng chú ý và thấy rõ ràng như play music (người dùng có thể tương tác control nó). Một điều bắt buộc là Foreground Service phải hiển thị một Notification.
  • Background Service: những services mà người dùng không chú ý trực tiếp như thu gom bộ nhớ của hệ thống.
  • Bound Service: là những services được ràng buộc bởi một thành phần trong ứng dụng và khởi động nó bằng lời gọi bindService. Điều đó cũng có nghĩa là khi thành phần ràng buộc này tháo bỏ ràng buộc với service thì Service đó cũng bị destroy.

Câu 10: Hãy giải thích về kiến trúc MVP trong Android

MVP viết tắt bởi Model – View – Presenter là một kiến trúc phần mềm thường được đề xuất, khuyến nghị sử dụng trong các dự án Android. MVP được thiết kế để tạo điều kiện cho việc kiểm thử đơn vị tự động (Automated Unit Testing) và cải tiến Separation of Concerns (tách biệt thành phần) trong việc trình bày logic (presentation logic).

Với Android, MVP tách ứng dụng (cấu trúc source code) thành 3 tầng Model, View, Presenter và trong mỗi tầng đều được chia thành module nhỏ có vai trò riêng biệt. Tầng Presenter là nơi tập trung xử lý logic, cũng là cầu nối giữa Model và View. Đây là nơi theo dõi sự thay đổi của ứng dụng, các biến trạng thái và xử lý logic tương ứng. Presenter có phần giống với Controller trong mô hình MVC, dù vậy thì trong mô hình MVP, Model và View không hề liên kết với nhau mà tất cả phải qua Presenter.

Kết bài

Như vậy chúng ta đã đi qua được top 10 câu hỏi phỏng vấn dành cho vị trí Android Developer. Lập trình Android là mảng khá rộng và có rất nhiều kiến thức xung quanh để nhà tuyển dụng có thể hỏi bạn, vì thế hãy trang bị thêm thật nhiều những câu hỏi lập trình khác để chuẩn bị tốt nhất cho buổi phỏng vấn của mình nhé. Cảm ơn các bạn đã đọc bài và hẹn gặp lại trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

Tìm việc làm IT mọi cấp độ tại TopDev

Software Manager là gì? Kỹ năng cần thiết để trở thành Software Manager

Software Manager là gì? Kỹ năng quan trọng để trở thành Software Manager

Trong một công ty hay một dự án phần mềm có rất nhiều vị trí chức danh tương ứng với vai trò khác nhau. Software Manager hay Quản lý phần mềm là một chức danh mà không phải ở công ty nào cũng có, mặc dù công việc và trách nhiệm của họ rất quan trọng và có nhiều điểm giống với một vài vị trí khác. Trong bài viết hôm nay chúng ta cùng tìm hiểu về công việc của một Software Manager cũng như những kỹ năng cần thiết để trở thành quản lý phần mềm nhé.

Software Manager là gì?

Người quản lý phần mềm là vị trí trong công ty, tổ chức có nhiệm vụ giám sát sự phát triển, việc cài đặt và bảo trì một phần mềm mới và những phiên bản cập nhật mở rộng (upgraded) của nó.

Với tư cách là một Software Manager, bạn sẽ phải phối hợp với các thành viên khác trong team hay trong công ty để xác định nhu cầu và mong đợi của khách hàng; từ đó thiết lập ngân sách (budgets) và thời gian (schedules) cũng như đảm bảo rằng người sử dụng thao tác với sản phẩm đúng cách. Bên cạnh đó là việc đào tạo, hướng dẫn người sử dụng thao tác với phần mềm sau khi phần mềm được cài đặt để khắc phục các sự cố phát sinh.

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

Software Manager

Công việc của một Software Manager

1. Quản lý team phát triển phần mềm

Trong một dự án phần mềm, team phát triển thông thường sẽ bao gồm nhiều vị trí khác nhau như:

Software Manager trực tiếp trao đổi và làm việc với team phát triển nhằm đảm bảo yêu cầu của phần mềm được đáp ứng đúng, đủ và kịp thời theo yêu cầu về ngân sách và thời gian. Ở yếu tố này, công việc của quản lý phần mềm khá tương đồng với quản lý dự án; mặc dù vậy điểm khác biệt ở đây là một Software Manager không đi sâu vào trực tiếp các nhiệm vụ chi tiết trong dự án như Project Manager, đồng thời họ cần quản lý nhiều hơn một team dự án cho cùng một sản phẩm phần mềm.

  Tạo thư viện bằng Swift Package Manager trong Xcode

2. Tuyển dụng, điều phối nhân sự

Việc quản lý nhân sự trong team là yếu tố quan trọng quyết định đến sự phát triển của phần mềm cũng như ảnh hưởng đến việc cài đặt, bảo trì trong tương lai. Nhân sự có kiến thức về phần mềm luôn có vai trò quan trọng, đồng thời có giá trị cao trong việc vận hành sản phẩm phần mềm. Một nhà quản lý phần mềm luôn cần có kỹ năng tốt trong việc tìm kiếm nhân sự phù hợp cho sản phẩm của mình; vì thế việc tham gia vào quá trình tuyển dụng cũng là điều cần thiết.

  Bộ câu hỏi phỏng vấn IT Manager và cách trả lời hay nhất

3. Đảm bảo chất lượng phần mềm

Chất lượng phần mềm là yếu tố quan trọng nhất đối với một sản phẩm phần mềm, vì vậy đây cũng là một công việc quan trọng của Software Manager. Các quy trình đảm bảo chất lượng trong tổ chức được áp dụng vào, đồng thời có thể có sự tham gia của thành viên QA (Quality Assurance). Mặc dù vậy công việc của quản lý phần mềm vẫn phải là đảm bảo chất lượng sản phẩm đầu cuối đến tay khách hàng một cách hoàn thiện nhất.

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

4. Chỉ đạo lựa chọn kiến trúc phần mềm

Đây được xem như là công việc quyết định đến sự thành công của phần mềm ở giai đoạn thiết kế. Software Manager là người chỉ đạo, tổ chức các cuộc họp thống nhất kiến trúc của sản phẩm phần mềm cũng như đảm bảo khả năng mở rộng của hệ thống. Sự tham gia của các bên phụ trách kỹ thuật, cùng với yêu cầu từ khách hàng về sản phẩm kết hợp với những hiểu biết về phần mềm, quản lý phần mềm sẽ giúp cuộc họp đưa ra quyết định cho kiến trúc tốt nhất của phần mềm sẽ xây dựng.

5. Thúc đẩy chiến lược sản phẩm 

Việc xác định các tính năng và yêu cầu cốt lõi là nhiệm vụ cần thiết để Software Manager đưa ra phương pháp và hệ thống phát triển phù hợp, hay nói cách khác là chiến lược phát triển sản phẩm. Quản lý phần mềm lúc này đồng thời cũng là một chuyên gia về sản phẩm, tham gia đóng góp tiếng nói về lộ trình của sản phẩm bằng việc liên lạc trao đổi thường xuyên với chủ sở hữu sản phẩm đó (Product Owner).

Những kỹ năng cần có của một Software Manager

Software Manager

Trong một công ty phát triển phần mềm sẽ có nhiều vị trí khác nhau bao gồm cả phụ trách kĩ thuật và các công việc quản lý. Một người xuất sắc trong việc phát triển sản phẩm và xây dựng kiến trúc hệ thống không phải lúc nào cũng giỏi trong việc giải quyết các vấn đề về ngân sách, chính sách trong dự án, quản lý con người. Chính vì thế có nhiều vai trò khác nhau trong công ty đi cùng các kỹ năng yêu cầu đặc thù. Với Software Manager, một vị trí thiên về vấn đề quản lý thì những kỹ năng cần có bao gồm:

  • Kiến thức và chuyên môn sâu về ngành và sản phẩm
  • Kỹ năng tuyển dụng và xây dựng đội ngũ
  • Kỹ năng setup, xây dựng một sản phẩm phần mềm mới từ đầu
  • Duy trì hay cập nhật, cải tiến một sản phẩm hiện có
  • Kỹ năng quản lý dự án: bao gồm các kĩ năng của một Project Manager
  • Kỹ năng nói chuyện với khách hàng hay chủ sản phẩm
  • Kỹ năng giải quyết vấn đề và đàm phán với các bên liên quan

Kết bài

Trong bài viết này chúng ta đã cùng tìm hiểu về Software Manager và các công việc mà họ đảm nhận. Tùy thuộc vào từng công ty hay tổ chức thì chức danh có thể sẽ khác với quản lý phần mềm, nhưng chắc chắn sẽ có những người đảm nhiệm vai trò cụ thể quản lý phần mềm như Giám đốc công nghệ hay Giám đốc phần mềm. Hy vọng bài viết này mang lại cho các bạn cái nhìn tổng quát về vị trí này, nếu đây là định hướng của bạn trong tương lai, hãy trang bị những kỹ năng cần thiết mà trong bài đã đề cập đến nhé. Hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

Xem thêm tuyển dụng việc làm IT hấp dẫn trên TopDev

Hướng dẫn sử dụng Content Provider trong Android

Hướng dẫn sử dụng Content Provider trong Android

Bài viết được sự cho phép của tác giả Lê Hồng Kỳ

Hướng dẫn sử dụng content provider trong android sẽ giới thiệu về Content Provider, vai trò và cách sử dụng nó.

Content Provider là thành phần giúp cho những ứng dụng khác nhau trong cùng một thiết bị có thể đọc và ghi dữ liệu từ file hoặc từ SQLite của ứng dụng khác.

Hướng dẫn sử dụng Content Provider trong Android

Như vậy, content provider cho phép chúng ta tập trung dữ liệu tại một nơi mà có nhiều ứng dụng khác truy cập vào khi cần thiết.

Hướng dẫn sử dụng content provider trong android – Ứng dụng hiển thị danh sách contact hiện có trong thiết bị

Mô tả chức năng

Hiển thị danh sách contact hiện có trong thiết bị khi người dùng chọn nút “LOAD ALL CONTACTS”. Ứng dụng có hỗ trợ thanh cuộn (scrollbar) cho phép người dùng trượt lên, xuống để xem hết contact.

Mỗi một contact được hiển thị theo định dạng Tên : Số điện thoại

  Sử dụng Sqlite trong Android như thế nào hiệu quả nhất?

Hướng dẫn thực hiện

Bước 1: Tạo mới activity tên RetrievingContactsListActivity

1/ Thiết kế giao diện

Hướng dẫn sử dụng Content Provider trong Android

2/ Viết xử lý cho nút “Load all contacts”

LoadContactsAyscn lca = new LoadContactsAyscn();
lca.execute();

Code của lớp LoadContactsAyscn

3/ Cấp quyền cho ứng dụng tại AndroidManifest.xml

<uses-permission android:name="android.permission.READ_CONTACTS" />

Bước 2: Build và run

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

Hướng dẫn sử dụng content provider trong android – Ứng dụng gửi tin nhắn (SMS)

Mô tả chức năng

Một ứng dụng cho phép người dùng gửi tin nhắn đến một số điện thoại được chỉ định ngay trong ứng dụng android của bạn.

Hướng dẫn sử dụng Content Provider trong Android

Lưu ý khi người dùng chọn “SEND”, Số điện thoại và tin nhắn không được bỏ trống.

  Cách Thiết Lập Máy Ảo, Máy Thật & Khởi Chạy Ứng Dụng Trong Android

Hướng dẫn thực hiện

Bước 1: Tạo mới activity tên SMSAppActivity

1/ Thiết kế giao diện

Hướng dẫn sử dụng Content Provider trong Android

2/ Viết xử lý cho nút “SEND”

// Khởi tạo đối tượng
SmsManager sm = SmsManager.getDefault();
// Gửi tin nhắn
sm.sendTextMessage(Số điện thoại người nhận, null, Nội dung tin nhắn, null, null);
// Thông báo
Toast.makeText(this, "Tin nhắn đã được gửi", Toast.LENGTH_LONG).show();

3/ Viết xử lý cho nút “EXIT”

finish();

4/ Cấp quyền cho ứng dụng

<uses-permission android:name="android.permission.SEND_SMS" />

Bước 2: Build và run

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

Xem thêm:

Tìm việc làm IT mọi cấp độ tại TopDev

NFT tiềm năng hay “bong bóng công nghệ”?

NFT tiềm năng hay

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

Câu chuyện đằng sau sự ra đời của NFT

Chắc các bạn cũng đã biết các hình thức đấu giá, vật được đấu giá có thể là bất kỳ đồ vật nào được mọi người quan tâm, nó mang tính chất khan hiếm, một tính chất hay một niềm tin nào đó, mà người tham gia đấu giá bỏ ra số tiền rất lớn để sở hữu được đồ vật đó bằng được. NFT cũng vậy người mua NFT cũng đang đấu giá để sở hữu được tài sản kỹ thuật số mà họ tin tưởng nó quý hiếm và có thể mang lại lợi nhuận tiềm năng trong tương lai. Tính khan hiếm của tài sản kỹ thuật số và quyền sở hữu tài sản kỹ thuật số đó, có lẽ là điều mà người mua NFT đang quan tâm chăng? Họ có thể quan tâm những thứ khác như mua NFT để đầu tư, đầu cơ lướt sóng thần hay họ bị hiệu ứng FOMO (Fear Of Missing Out) của đám đông tác động v.v. Nó có thể là bất kỳ thứ gì nhưng điều tiên quyết vẫn là tính khan hiếm và quyền sở hữu, bởi vì người sưu tầm ai cũng đồng ý rằng thứ họ săn đuổi phải có số lượng giới hạn.

Đi đến một câu chuyện khác. Để tạo ra được một tác phẩm nghệ thuật như một bức tranh, một bài nhạc hoặc một bộ phim v.v. Các nghệ sĩ và người sáng tạo ra nội dung đó phải mất rất nhiều thời gian và chất xám của mình để hoàn thành tác phẩm. Sau khi hoàn thành tác phẩm nghệ thuật, những người nghệ sĩ buộc phải nhờ đến bên thứ ba để sản phẩm nghệ thuật của họ được truyền bá rộng rãi ra thế giới. Ví dụ như muốn một bài nhạc của nghệ sĩ được truyền bá rộng rãi, bên hãng thu âm và phát hành sẽ hứa hẹn mang lại khả năng sinh lời cho tác phẩm, để đổi lại phần lợi nhuận tương xứng hoặc thậm chí là bản quyền sở hữu của tác phẩm đó.

Lúc này NFT ra đời giúp các chủ thể sáng tạo nội dung lấy lại được vô lăng, bỏ qua sự góp mặt của bên trung gian, và toàn quyền sở hữu, kiểm soát tài sản trí tuệ của mình.

Ví dụ về NFT Everydays: The First 5000 Days của Mike Winkelmann (Beeple). Tác phẩm nghệ thuật kỹ thuật số này đã được bán với giá 69 triệu đô vào tháng 3 năm 2021. Tại sao một tác phẩm nghệ thuật kỹ thuật số như thế lại có mức giá trên trời như vậy. Thực sự thì bên trong tác phẩm này là một câu chuyện truyền cảm hứng cho rất nhiều người, kể cả tôi. Beeple đã bắt đầu tạo ra tác phẩm đầu tiên trong bộ sưu tập Everydays của mình vào tháng 5 năm 2007, ông là một nhà khoa học máy tính nên không có nền tảng về nghệ thuật, đơn giản ông chỉ muốn học vẽ và cho rằng việc tạo ra tác phẩm liên tục mỗi ngày sẽ giúp ông tiến bộ và tạo nên kỳ tích. Hơn 5000 tác phẩm đã được tạo ra trong suốt gần 14 năm, đó là cả một quá trình rất dài, ông đã kiên trì, bền bỉ để không bỏ lỡ một ngày nào kể cả là ngày đám cưới và ngày con ông được chào đời. Qua câu chuyện truyền cảm hứng này, thì người sưu tầm NFT này chắc chắn sẽ có lý do đủ thuyết phục để mua nó với mức giá cao như vậy phải không?

Đằng sau NFT còn có nhiều câu chuyện thú vị khác nữa, mình xin được đề cập ở một bài viết khác.

Thời điểm để hòa mình vào dòng xu hướng NFT là năm 2020, nhưng thời điểm tốt thứ hai là ngay bây giờ. (Trích từ: NFT Handbook)

  The Merge – Bước tiến quan trọng của blockchain Ethereum

  Tiềm năng ứng dụng thực tế của blockchain & Web3

NFT là gì?

NFT được viết tắt của Non-Fungible Token, tạm dịch là Token không thể thay thế. Vậy như thế nào là Token không thể thay thế? Trước khi đi vào câu hỏi này thì chúng ta nên hiểu Fungible là gì.

Fungible là tính từ mang ý nghĩa “cùng tính chất, cùng thể loại có thể trao đổi hoặc thay thế một cách tự do, một phần hoặc từng phần cho các vật phẩm khác tương tự (đặc biệt khi nói về các loại hàng hóa)”. Ví dụ mình có tờ 50 ngàn và bạn có 2 tờ 20 ngàn và 1 tờ 10 ngàn thì chúng ta có thể hoàn toàn trao đổi 1 tờ của mình lấy 3 tờ của bạn, vì chúng có cùng chung giá trị. Hoặc hôm trước mình mời bạn uống một lon Coca-Cola và bạn hứa lần sau bạn sẽ mời lại mình một lon Coca-Cola khác. 2 lon Coca-Cola này có thể trao đổi với nhau bởi vì nó không phải là độc nhất và có cùng chung giá trị.

Vậy thì Non-Fungible mang tính độc nhất và không thể dễ dàng thay thế hay trao đổi. Ví dụ như bức tranh Mona Lisa của thiên tài toàn năng Leonardo da Vinci, bức tranh này là độc nhất trên thế giới và không thể thay thế hay trao đổi với một bức tranh khác. Một ví dụ khác như mỗi viên kim cương có kích thước, màu sắc, độ trong và đường cắt khác nhau mang tính độc nhất. Nếu bạn sở hữu một viên kim cương cụ thể nào đó, thì viên kim cương đó không thể dễ dàng hoán đổi hay thay thế bằng một viên kim cương khác.

Còn Token trong NFT được nhiều người hiểu theo nghĩa “kỷ vật”, bởi vì NFT được biết đến như là một đồ sưu tầm kỹ thuật số nhưng nó hoàn toàn không có ý nghĩa như vậy. Token ở đây mang ý nghĩa hoàn toàn khác. Bạn có thể đọc tiếp phần Phân biệt Coin và Token thì bạn sẽ hiểu Token ở đây là gì.

Tham khảo việc làm Blockchain mới nhất tại đây!

Vì sao NFT có giá trị?

Ngoài việc NFT là một tác phẩm hiếm có và số lượng giới hạn, người ta muốn sưu tầm bởi vì nó như một kỷ vật thì NFT có giá trị bởi vì đằng sau NFT đó là một câu chuyện truyền cảm hứng như NFT Everydays: The First 5000 Days của Beeple. Người mua NFT đó ngoài quyền sở hữu các tác phẩm nghệ thuật, còn bị câu chuyện đằng sau nó thuyết phục.

Người mua NFT cũng tin rằng danh tiếng và sự đảm bảo của nghệ sĩ tạo ra NFT đó, sẽ thúc đẩy giá NFT mà họ mua tăng trưởng trong tương lai.

Có nhiều người lầm tưởng rằng cứ đúc NFT ngày hôm nay và đăng bán vào ngày hôm sau trên các sàn giao dịch sẽ có người bỏ tiền ra mua NFT của mình và thu được món hời lớn như những thương vụ NFT đình đám. “Thành công sau một đêm” là chuyện không thể, nó đòi hỏi quá trình gian nan và sự hiểu biết. Chúng ta đã quen với các thuật toán quảng bá của các trang mạng xã hội như Youtube, Tiktok, Facebook v.v. Nhưng các sàn giao dịch không hoạt động dựa trên những thuật toán như vậy, sẽ không ai tìm đến NFT của bạn nếu như bạn không quảng bá nó. Trước hết hãy tìm hiểu về những khán giả hay khách hàng tiềm năng của bạn, và xây dựng một cộng đồng để giới thiệu và quảng bá cho mọi người quá trình mà bạn làm ra NFT đó. Mọi người sẽ hiểu câu chuyện của bạn và sẽ không ngại bỏ tiền ra ủng hộ những tác phẩm nghệ thuật đó.

Blockchain là gì?

Để hiểu rõ hơn về NFT, chúng ta nên hiểu về Blockchain và cách hoạt động của nó. Bởi vì việc mua bán các NFT sẽ dựa trên nền tảng công nghệ Blockchain. Blockchain như cái tên của nó là chuỗi khối, là một chuỗi các khối được liên kết với nhau, mỗi khối sẽ chứa đựng thông tin từng giao dịch một đã xác minh và xảy ra trong Blockchain đó. Mỗi khối sẽ có một dung lượng lưu trữ nhất định, sau khi giao dịch đã được xác minh và khối đã đầy thì khối mới sẽ được tạo ra gắn liền vào khối liền trước đã được xác minh.

Blockchain là mạng lưới phi tập trung bao gồm nhiều máy tính ở khắp nơi trên thế giới liên kết lại với nhau. Mỗi máy tính này lại lưu trữ một bản sao về các khối và thông tin giao dịch trong mỗi khối, nên việc hack và thay thế thông tin trong mạng lưới Blockchain là rất khó, bởi vì hacker phải thay đổi toàn bộ thông tin trên rất nhiều máy tính đó thì mới có thể thao túng và làm giả được các thông tin đã được xác thực trên Blockchain. Bất kỳ thông tin nào không trùng khớp với các khối còn lại thì giao dịch đó sẽ không được công nhận và không được ghi vào mạng lưới Blockchain.

Blockchain hiểu ngắn gọn như là một cuốn sổ cái kế toán dài lê thê, ghi lại các giao dịch trong mạng lưới. Cuốn sổ cái đó được sao chép và phân phát cho mọi người tham gia vào Blockchain đó. Nếu muốn thêm thông tin gì mới vào cuốn sổ cái đó, thì phải được sự đồng ý của tất cả mọi người trong mạng lưới đó chấp thuận. Nếu như một người bị mất cuốn sổ cái, thì có thể sao chép từ mạng lưới Blockchain và luôn chắc rằng cuốn sổ bạn giữ sẽ có đầy đủ thông tin như mọi người trong mạng lưới Blockchain.

Cuốn sổ cái Blockchain là công khai, ai cũng có thể truy cập và xem thông tin từng giao dịch, đó là tính chất minh bạch của Blockchain. Ví dụ các bạn có thể truy cập trang https://etherscan.io để tìm kiếm và xem tất cả các giao dịch của một địa chỉ trong Blockchain của Ethereum, để xem thông tin giao dịch của địa chỉ nào đó trên Blockchain của Bitcoin thì các bạn có thể tìm và truy cập Blockchain explorer https://www.blockchain.com/explorer.

Một số đồng tiền kỹ thuật số như Bitcoin, Ethereum v.v. sẽ có mạng lưới Blockchain riêng của nó. Ngoài việc xác thực việc giao dịch các đồng tiền kỹ thuật số như Bitcoin, Ethereum v.v. Blockchain còn nhiều ứng dụng tuyệt vời khác nữa.

Ứng dụng trong nông nghiệp như truy xuất được nguồn gốc của trái cây, hoa màu v.v. Để có thể đảm bảo được nguồn gốc, chất lượng và độ tin cậy của sản phẩm. Ví dụ như mình sống ở Sài Gòn, đi dọc đường sẽ thấy người ta rao bán dâu tươi Đà Lạt, nhưng liệu đó có phải là dâu Đà Lạt hay không thì cần phải xem xét lại, nguồn gốc của nó vẫn đang là một dấu hỏi lớn.

Trong lĩnh vực sản xuất như quản lý kho bãi và hàng tồn kho, tránh việc hao hụt hay mất mác tài sản của doanh nghiệp v.v.

Ngoài ra Blockchain còn nhiều ứng dụng trong các lĩnh vực khác như giáo dục, y tế, tài chính ngân hàng, các bạn có thể tìm hiểu thêm về các ứng dụng tuyệt vời của Blockchain mang lại.

Phân biệt Coin và Token

Coin là đồng tiền kỹ thuật số có Blockchain của riêng từng loại như Bitcoin, Ethereum, Litecoin v.v. Trong khi đó Token là loại tiền điện tử không sở hữu Blockchain riêng của nó mà nó tận dụng Blockchain của những đồng coin khác. Hiện tại hầu hết các NFT được tạo ra và vận hành trên Blockchain của Ethereum. Môt số NFT được tạo ra  và hoạt động trên WAX, Binance Smart Chain và một số Blockchain khác.

Các loại NFT phổ biến

Các NFT là một sản phẩm kỹ thuật số có thể là:

    – Hình ảnh

    – Video

    – Audio

    – GIF

    – Mô hình 3D

    – Sách và văn bản

    – Tên miền (tên miền trên blockchain)

    – Bất động sản ảo

    – Vật phẩm game

NFT và những nghi hoặc

“Tại sao tôi lại muốn mua một thứ gì đó mà ai cũng có thể xem được trực tuyến, chụp lại màn hình và tuyên bố quyền sở hữu với sản phẩm kỹ thuật số ấy?”. Để trả lời cho câu hỏi này thì chúng ta hãy xem lại mục, tại sao NFT có giá trị và mục đích mà người ta sưu tầm kỹ vật.

NFT là một phương tiện để mua bán trao đổi các sản phẩm kỹ thuật số, vậy còn việc NFT hóa các tài sản thực như một đồ vật nào đó thì sao? Người mua NFT đó chỉ sở hữu NFT và một lời hứa hẹn, và chuyện gì sẽ xảy ra khi người tạo NFT không bàn giao tài sản ở dạng vật chất cho người mua NFT. Điều này đi ngược với giá trị của tài sản Blockchain, khi ta phải phụ thuộc vào bên thứ ba.

Nội dung của NFT ví dụ như hình ảnh, video sẽ không được tải lên Blockchain bởi vì nó có dung lượng lớn và chi phí cao. Trên các sàn giao dịch như OpenSea người đúc và bán NFT sẽ phải cung cấp đường dẫn đến hình ảnh hoặc video đó và chuyện gì sẽ xảy ra khi hình ảnh NFT đó được tải lên một máy chủ tập trung và hiện tại nó đã chết? NFT của bạn sẽ tan tành phải không. Hãy áp dụng những giải pháp lưu trữ phi tập trung như IPFS (InterPlanetary File System) hay những nhà cung cấp dịch vụ đám mây đáng tin cậy như AWS hay Google Cloud. Đừng nên tải nội dung NFT lên các dịch vụ lưu trữ web tập trung, trang web cá nhân hay tài khoản lưu trữ cá nhân.

Các sàn giao dịch NFT

Tên sàn Trang web Mô tả
Open Sea https://opensea.io/ Đây là sàn giao dịch NFT đầu tiên cũng là sàn giao dịch lớn nhất thế giới. Open Sea có vô số các NFT được đúc ra và rao bán, giao diện người dùng đơn giản và dễ tiếp cận.
Nifty Gateway https://www.niftygateway.com/ Là sàn giao dịch chỉ bán NFT của các nghệ sĩ có tên tuổi, ở đây các bạn có thể mua NFT bằng thẻ tín dụng hoặc thẻ ghi nợ.
Super Rare https://superrare.com/ Như tên gọi của nó, đây là sàn giao dịch chỉ bán những NFT có một phiên bản duy nhất. Các NFT kỹ thuật số không mua được ở bất kỳ nơi nào khác thì mới có thể bán được tại Super Rare.
WAX https://wax.atomichub.io/ Sàn WAX dựa trên Blockchain WAX với chi phí giao dịch (phí gas) nhỏ hơn rất nhiều so với phí gas của Ethereum. WAX sử dụng phương thức xác thực proof of stake giúp ít tiêu tốn năng lượng và giảm tác động đến môi trường tự nhiên.
Foundation https://foundation.app/ Cách thiết kế và hoạt động của sàn này ảnh hưởng từ mạng xã hội. Người dùng được Khuyến khích liên kết trang mạng xã hội với Foundation. Ai cũng có thể đăng ký sử dụng Foundation, nhưng nếu muốn bán NFT thì phải nhận được upvote như cộng đồng, điều này khiến cho người dùng khó bán được NFT nhưng phần lớn NFT được cộng đồng đón nhận đều có chất lượng.

Tóm lại

Nhiều nhận định cho rằng thị trường NFT là thị trường đầu cơ, và bong bóng NFT sẽ vỡ như bong bóng dot-com vào cuối thập niên 1990. Nhưng suy cho cùng thị trường NFT đã tạo ra một sân chơi và nhiều lợi ích cho các nghệ sĩ và người sưu tầm kỹ thuật số. NFT nói riêng và Blockchain nói chung đã và đang mang lại những ứng dụng và tiện ích công nghệ không thể phủ nhận.

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

Xem thêm:

Top Developer đừng bỏ lỡ Top việc làm IT mới nhất trên TopDev!

Top 10 câu hỏi thường gặp khi phỏng vấn WordPress Developer

Top 10 câu hỏi thường gặp khi phỏng vấn WordPress Developer

Để xây dựng một website cơ bản với các chức năng viết bài, đăng bài đầy đủ với các thao tác cơ bản thì WordPress là một lựa chọn không thể tốt hơn dành cho chúng ta. Sự đơn giản, linh hoạt và dễ sử dụng khiến WordPress trở thành một CMS phổ biến nhất hiện nay, cùng vì thế mà nhu cầu tuyển dụng lập trình viên WordPress luôn luôn ở mức cao. Bài viết hôm nay chúng ta cùng nhau điểm qua top 10 câu hỏi phỏng vấn WordPress Developer thường gặp nhé.

Câu 1: CMS là gì? Các chức năng cơ bản của CMS

CMS – Content Management System là hệ thống quản trị nội dung là nơi mà người dùng có thể thao tác cập nhật, thay đổi nội dung text, video, hình ảnh, files, .. trên website của họ mà không cần sự hỗ trợ từ lập trình viên thông qua việc sửa source code. Các chức năng cơ bản của CMS bao gồm:

  • Quản lý nội dung: text, hình ảnh, files, video,… trên website
  • Quản lý quyền truy cập, sử dụng, vai trò trên trang web
  • Quản lý các tài nguyên sử dụng, themes, plugin,… 
  • Quản lý cấu hình: các thông tin liên quan đến domain, cấu hình bài viết, tài khoản thanh toán,…
  • Chức năng giao diện tương tác tức thời (WYSIWYG) – kết quả chỉnh sửa sẽ được hiển thị ngay trong quá trình chỉnh sửa

CMS là gì

Câu 2: WordPress là gì?

WordPress là một CMS mã nguồn mở, miễn phí dùng để xây dựng các blog, website được viết bằng ngôn ngữ lập trình PHP, sử dụng hệ quản trị cơ sở dữ liệu MySQL. WordPress thích hợp cho các trang web dạng blog cá nhân, portfolio online, các diễn đàn, group thảo luận hay các trang web thương mại điện tử, giới thiệu sản phẩm, doanh nghiệp. WordPress ra mắt chính thức từ năm 2003 và nhanh chóng trở thành một nền tảng phổ biến trên website, chiếm khoảng 40% thị phần các trang Web trên Internet.

Đến nay có hơn 75 triệu trang web sử dụng nền tảng này với một vài thương hiệu nổi tiếng thế giới như Coca Cola, CNN hay BBC,…

  Hướng dẫn Export và Import dữ liệu trong WordPress

  26 đoạn code hay dùng trong lập trình theme WordPress

Câu 3: Ưu điểm của WordPress

Ngoài việc là một CMS mã nguồn mở và miễn phí, WordPress cũng được cộng đồng lập trình Web ưa chuộng vì những ưu điểm sau:

  • Tính đơn giản và dễ sử dụng: Một người không cần biết nhiều về lập trình cũng có thể dễ dàng thao tác với WordPress. Giao diện Admin của WordPress rất dễ hiểu, thân thiện với người sử dụng và còn hỗ trợ đến hơn 50 loại ngôn ngữ khác nhau.
  • Khả năng mở rộng cao: WordPress có hệ sinh thái phong phú với các themes (giao diện) và plugins đa dạng tùy theo nhu cầu và mục đích sử dụng.
  • Tối ưu hóa SEO và tốc độ website: Website đã tối ưu sẵn SEO trong phiên bản miễn phí cung cấp của mình. Ngoài ra các hosting từ nhà cung cấp cũng cho phép cài đặt các công cụ giúp tăng tốc độ website WordPress, tối ưu hóa tìm kiếm từ các công cụ.
  • Cộng đồng hỗ trợ lớn: với tính phổ biến và thị phần của nó, WordPress thu hút hàng triệu lập trình viên và các nhà phát hành. Bạn dễ dàng nhận được hỗ trợ từ cộng đồng nếu gặp phải bất cứ vấn đề gì liên quan đến WordPress.

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

 Câu 4: Những công việc của WordPress Developer

Từ việc cung cấp một CMS hoàn chỉnh thì WordPress tạo ra 3 vai trò riêng biệt khá rõ dành cho các lập trình viên có thể đảm nhiệm.

  • Quản trị hệ thống WordPress

Đây là những người có kiến thức về WordPress từ việc sử dụng mã nguồn cung cấp sẵn kết hợp với các bộ giao diện (themes) và plugins sẵn có và tạo nên website theo yêu cầu của khách hàng. Công việc này cũng đòi hỏi những kiến thức liên quan đến hosting, domain,… để setup hệ thống chạy WordPress tối ưu nhất, đồng thời hỗ trợ bảo trì trong suốt quá trình sử dụng. 

  • Xây dựng, tạo ra các themes cho WordPress

Đây là công việc của những Frontend Developer, có nhiệm vụ xây dựng giao diện cho các website WordPress theo yêu cầu của khách hàng, hoặc tạo ra những themes được nhiều người yêu thích và sử dụng, có thể trả phí để sử dụng. Ngoài những kiến thức về HTML, CSS, JS thì PHP cũng là bắt buộc vì source code của WordPress kể cả phần giao diện cũng được viết bằng PHP. Bạn bắt buộc phải viết theo đúng quy tắc hiển thị mà WordPress đã tạo ra.

themes cho WordPress

  • Tạo ra các plugins

Plugins là những chức năng được thêm vào trang web WordPress để mở rộng hay thêm mới các tính năng của website. Để tạo ra các plugins cho WordPress, lập trình viên sử dụng PHP để tạo ra các function để giao tiếp với phần core của nó. Bạn có thể sử dụng plugins cho website của mình hoặc có thể phát hành chúng lên store của WordPress.

Câu 5: Phân loại nhóm người dùng theo quyền (User Roles) trong WordPress

Có 6 nhóm người dùng gồm:

  • Super Admin: Quyền cao nhất quản trị toàn bộ hệ thống. 1 hệ thống có thể có nhiều website
  • Administrator: Người dùng có toàn quyền với những website được chỉ định trong hệ thống
  • Editor: Nhóm có quyền đăng bài viết, quản lý bài viết của những người khác
  • Author: Nhóm có quyền đăng bài viết và quản lý bài viết của chính họ
  • Contributor: Nhóm có quyền viết bài, lưu nháp và gửi duyệt nhưng không có quyền duyệt để đăng bài
  • Subscriber: Nhóm người dùng đăng ký trang để theo dõi, chỉ có quyền sửa thông tin cá nhân của họ

Câu 6: Widget trong WordPress là gì?

Widget là một trong những công cụ cơ bản của WordPress với các chức năng chính là định hình cho chân trang (footer), thanh bên (sidebar) hoặc thêm nội dung mới. Widget mang đến nhiều chức năng và lợi ích; ví dụ như người đọc sẽ có thể xem được những bài viết mới nhất trên website, hoặc tìm kiếm nhanh bài viết theo chủ đề, danh mục, …

Có một số Widget có sẵn trong WordPress và bạn có thể kéo thả vào để sử dụng. Để tạo những widgets mới chúng ta có thể viết thêm source code tùy chỉnh trong plugin, file functions.php hoặc theme website.

Widget trong WordPress

Câu 7: Cách xử lý lỗi Error establishing a database connection

Đây là lỗi thông dụng trong WordPress, thường gặp lúc dựng trang web hoặc có tác động liên quan đến việc kết nối đến cơ sở dữ liệu. WordPress viết bằng PHP và sử dụng MySQL làm database. Khi người dùng truy cập  vào website của bạn, source code viết bằng PHP sẽ truy xuất database MySQL để lấy các thông tin cần thiết để chạy trang cũng như xử lý tương tác với người dùng. Nếu quá trình truy xuất này thất bại, lỗi “Error establishing a database connection” được WordPress trả ra và hiển thị cho người dùng. Để xử lý lỗi này, chúng ta cần kiểm tra lại cấu hình kết nối database, thông thường được thiết lập trong file wp-config.php.

Câu 8: Permalink là gì?

Liên kết tĩnh Permalink là đường dẫn (URL) của một trang web, bài viết, chuyên mục mà không thay đổi trong suốt quá trình xây dựng website. Các dạng permalink gồm có:

  • Mặc định: sử dụng id mặc định
  • Ngày và tên bài viết: đường dẫn chứa ngày tháng và tên bài viết
  • Tháng và tên bài viết: đường dẫn chứa tháng năm và tên bài viết (không có ngày)
  • Chuỗi mã bài viết: hiển thị id bài viết
  • Tiêu đề bài viết: chỉ hiển thị tên bài viết trên đường dẫn
  • Tùy biến: tùy chỉnh URL theo ý người dùng

Câu 9: Làm sao để kiểm tra website được tạo bằng WordPress

Có một vài cách để kiểm tra xem website bất kỳ có phải được tạo ra bằng WordPress hay không như sau:

  • Có chứa credit WordPress trên trang: thông thường source code mặc định của WordPress hoặc các dịch vụ tạo website bằng WordPress miễn phí sẽ vẫn còn chứa các dòng credit powered by WordPress.
  • Kiểm tra đường dẫn /wp-admin: đây là đường dẫn mặc định để truy cập vào trang admin (quản trị) của WordPress.
  • Kiểm tra mã nguồn trang: trong mã nguồn website tạo bằng WordPress sẽ luôn chứa các đường dẫn có chứa những từ khóa wp như wp-includes, wp-content, wp-ver,….
  • Các dịch vụ kiểm tra: Ngoài những cách trên thì chúng ta cũng có thể kiểm tra bằng một số website như Is It WordPress hay Built With để xem website có được tạo bằng WordPress hay không.

Câu 10: Một số plugins thường dùng dành cho WordPress

Thông thường các plugins sẽ hỗ trợ cho website của bạn những yếu tố liên quan đến tính bảo mật, khả năng tăng tốc website, khả năng backup sao lưu dữ liệu hoặc giúp website SEO tốt hơn. Dưới đây là một vài plugins được đánh giá cao mà lập trình viên WordPress thường sử dụng:

  • WooCommerce: plugins hỗ trợ việc bán hàng, biến website của bạn thành các trang bán hàng trực tuyến hay thương mại điện tử. Đây được xem là nền tảng phổ biến nhất hiện nay trên WordPress.
  • CloudFlare: sử dụng CDN để phân phối các file, hình ảnh một cách nhanh chóng giúp website của bạn trở nên nhanh hơn.
  • WP Rocket: một cache plugin giúp bạn giảm tải trên server, chức năng preload giúp người truy cập load website nhanh hơn.
  • iThemes Security: plugins hỗ trợ bảo mật tốt nhất hiện nay.
  • Yoast SEO: giúp tối ưu SEO đơn giản mà hiệu quả.

Kết bài

Trên đây là top 10 câu hỏi dành cho vị trí lập trình viên WordPress mà bạn sẽ thường xuyên gặp phải trong buổi phỏng vấn của mình. Hy vọng bài viết hữu ích dành cho những bạn chuẩn bị tìm kiếm một công việc mới; hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

Web Security – Dữ liệu người dùng được an toàn (Phần 1)

Web Security - Dữ liệu người dùng được an toàn

Bài viết được sự cho phép của tác giả Lê Nhật Thanh

Có một câu nói cực kì nổi tiếng trong thế giới hacker. “Không có một hệ thống nào là an toàn tuyệt đối”. Website của bạn cũng vậy, là một hệ thống thì luôn luôn có lỗ hổng bảo mật. Trong series web security này, bạn sẽ được học về những thứ cơ bản nhất trong thế giới security.

Vì lý do đó, một lập trình viên phải biết những kĩ thuật đơn giản để bảo mật cho một website. Trong bài viết này, bạn sẽ học cách để giữ cho người dùng, nội dung, và mọi thứ trên website bạn được an toàn và bảo mật.

#1 Giới thiệu về Security hay Web Security

Trước khi bắt đầu bài, mình muốn hỏi bạn một câu hỏi. Khi nhắc tới chữ “security”, bạn sẽ tưởng tượng gì trong đầu?

Hackers? Tấn công? Phòng thủ? Một hacker trong một phòng tối và đang mặc một chiếc áo khoác đen? Có phải bạn đang suy nghĩ về các bối cảnh trên?

Lý do là bạn cũng thường nghe thấy những thông tin như. “Một mạng xã hội lớn đã bị lộ thông tin người dùng”. “Một hacker đã tấn công và lấy đi hàng triệu thẻ tín dụng của một website mua sắm”.

Nhưng thực tế, security (ở đây là web security) một cách đơn giản có thể hiểu là bảo mật bảo mật tài nguyên dữ liệu và dự án trước, trong, và sau quá trình phát triển sản phẩm (ở đây là web development).

Ví dụ như bảo mật dữ liệu người dùng database, bảo mật source code. Bảo mật resource trong khi làm việc giữa các team, hay trong và ngoài công ty, bảo mật tài liệu, dụng cụ, phần cứng. Hay ai có thể xem và tham gia và dự án phần mềm, và ai thì không được. Các quy định bảo mật đối với từng dự án nhất định.

Còn đối với từng user trong hệ thống, họ được cấp những quyền hạn gì. Hay cách ngăn chặn việc “leo thang đặc quyền” (privilege escalation) của các users, …. Chúng ta có thể gọi chung là “user experience” hay “accessibility”.

Web securityWeb security

Trong phần hướng dẫn tiếp theo, bạn sẽ được học về các khái niệm và kĩ thuật cơ bản trong security dành cho một lập trình viên.

  Bảo mật ứng dụng Java web bởi Spring Security

  Security Considerations khi Designing Web Applications

#2 Lỗ hỏng bảo mật là gì?

Trong lĩnh vực phát triển phần mềm (software development), khi một ứng dụng hay một chức năng nào đó chạy không đúng với yêu cầu (requirement), bạn sẽ gọi đó là một “bug”. Một bug về security (security bug) được định nghĩa là một lỗ hỏng bảo mật hay một điểm dễ bị tổn thương (vulnerability).

Trong quá trình phát triển phần mềm, bạn – một lập trình viên luôn luôn tạo ra bug, hãy ghi nhớ điều này, dù ít hay nhiều. Thậm chí bạn sẽ luôn lặp lại những bug bạn đã tạo ra trong quá khứ.

Cho nên, để trở thành một lập trình viên giỏi và tốt, bạn phải rút kinh nghiệm của mình qua những lần học hỏi từ các sai lầm để dần dần giảm thiểu số bug ít nhất có thể.

Sau đây là một số kĩ thuật cơ bản nhất để giảm thiểu số bug mà bạn có thể tạo ra:

  • Luôn luôn kiểm tra các giá trị người dùng nhập vào (not null, not empty string, kiểm tra số lượng dữ liệu). Kĩ thuật này còn gọi là validation.
  • Đảm bảo rằng một người dùng không được có quá nhiều thời gian với hệ thống của bạn. Ví dụ số lần đăng nhập sai cho phép, thời gian tồn tại trong một session.
  • Luôn xây dựng unit test cho source code của bạn. Bạn có thể tham khảo kĩ thuật test TDD.

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

#3 Tính năng bảo mật (Security Feature) là gì?

Các tuyến phòng thủ đầu tiên của bạn chính là các tính năng bảo mật ví dụ như sử dụng HTTPS và CORS (bạn có thể tìm hiểu trên internet về HTTPS và CORS trước, và đừng lo lắng, bạn sẽ được học trong những bài sau).

Ví dụ, việc mã hóa dữ liệu của bạn sử dụng HTTPS có thể sẽ không fix được bug của bạn, nhưng việc này đảm bảo an toàn cho việc truyền nhận dữ liệu giữa các bên, tránh được các cuộc tấn công cơ bản như nghe lén, sniffer, MITM (Man in the middle).

#4 Sự ảnh hưởng của các lỗ hổng bảo mật

Khi sản phẩm của bạn không được bảo mật một an toàn, một số vấn đề sau có thể gây ra:

Ảnh hưởng tới người dùng Những thông tin nhạy cảm, dữ liệu cá nhân người dùng có thể bị lộ ra ngoài.
Ảnh hưởng đến sản phẩm Người dùng sẽ cảm thấy không tin tưởng vào sản phẩm của bạn, từ đó việc kinh doanh sản phẩm sẽ không thuận lợi nữa.
Ảnh hưởng đến hệ thống khác Khi hệ thống của bạn bị chiếm tấn công. Hacker có thể dùng hệ thống của bạn để tấn công các hệ thống khác. Ví dụ như tấn công DDOS sử dụng botnet.

Việc đảm bảo an toàn và bảo mật cho hệ thống ứng dụng của bạn còn đảm bảo sự an toàn cho người dùng và các hệ thống khác liên quan. Cho nên vấn đề an toàn bảo mật luôn được đặt lên hàng đầu trong quá trình phát triển phần mềm.

Như vậy bạn đã có một số khái niệm tổng quan và có cái nhìn dễ chịu hơn về web security. Phần tiếp theo chúng ta sẽ cùng nhau tìm hiểu về khái niệm về các loại tấn công cơ bản.

Bạn có biết tấn công (attack) là gì? Khi sản phẩm của bạn có những lổ hỏng, các hacker khai thác các lổ hổng đó và gây ra các thiệt hại cho sản phẩm của bạn, thì đó được gọi là tấn công. Trong thế giới của security, có 2 loại tấn công: Active attack và passive attack.

#5 Active Attack

Ở các cuộc tấn công này, attacker sẽ cố gắng xâm nhập hệ thống của bạn một cách trực tiếp. Ví dụ cố gắng truy cập vào những dữ liệu nhạy cảm của bạn, hoặc các cuộc tấn công từ chối dịch vụ DDOS.

Có một loại tấn công khác có tên gọi là phishing, đây cũng là một active attack. Lúc này, attacker sẽ cố gắng sửa đổi thông tin trên website bạn đang truy cập. Hoặc cố gắng điều hướng bạn đến một website khác nhằm chiếm đoạt thông tin của bạn.

Bối cảnh một cuộc tấn công phishingBối cảnh một cuộc tấn công phishing

#6 Passive Attack

Các attacker sẽ cố gắng thu thập thông tin cần thiết và không làm ảnh hưởng gì hệ thống sản phẩm của bạn. Thì đây được gọi là passive attack. Kẻ tấn công luôn tìm cách thu thập thông tin một cách âm thầm nhất. Khi đã có đầy đủ thông tin cần thiết. Họ có thể sẽ có một cuộc tấn công active attack hoặc một hành động nào đó.

Bối cảnh của một passive attackBối cảnh của một passive attack

Trong bên trên, bạn là người đang truy cập internet, kẻ tấn công sẽ đứng ở giữa. Và cố gắng nghe lén các cuộc giao tiếp của bạn với các máy chủ khác. Nhằm mục đích đánh cắp các thông tin cá nhân nhạy cảm như password, profile, history, … Kĩ thuật này còn được gọi là sniffer.

Trên đây mình đã giới thiệu cho bạn 2 loại tấn công và một số ví dụ về các cuộc tấn công trong thực tế. Ở phần tiếp theo, bạn sẽ biết cách làm thế nào để ngăn chặn các cuộc tấn công này. Để bảo vệ dữ liệu, thông tin của mình.

#7 Làm sao để phòng chống các cuộc tấn công

Attacker là những người luôn có thể phá hoại hệ thống, website của bạn. Hay đánh cắp dữ liệu, chèn mã độc hay làm bất cứ điều gì gây hại cho bạn. Vì vậy, bạn cần biết một số kĩ thuật, cơ chế để phòng chống và bảo về khỏi các cuộc tấn công.

Như mình đã nói ở đầu bài, không có một hệ thống nào là an toàn tuyệt đối. Một số kĩ thuật cơ bản đã được trình bày ở đầu bài. Như là luôn kiểm tra input nếu website của bạn có form input. Luôn sử dụng giao thức HTTPS để bảo mật cho dữ liệu truyền đi. Và còn rất nhiều kĩ thuật cụ thể khác mà bạn sẽ được tiếp cận sau này.

#Kết

Bạn chính là người bảo vệ cho tài sản, sản phẩm, website, thông tin của bạn. Để làm được điều đó, bạn cần tích luỹ kiến thức về security (web security) nhiều hơn. Vì điều này dường như bắt buộc đối với lập trình viên.

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

Xem thêm:

Xem thêm IT Jobs hấp dẫn trên TopDev

Flask python là gì? – Những điều cần biết

Flask python là gì? - Những điều cần biết

Flask Python WTF, xin lỗi anh em nhưng không có gì là bậy bạ ở đây nha. FlaskWTF mà F ở đây là Forms. Ông này là một plugin hỗ trợ integration giữa Flask và WTForms. Ông WTForms lại là form validation và form render viết bằng Python.

Ối dồi sao cái tên nhạy cảm thế.

Flask PythonBậy nào bậy nào

À mà giật tít vậy thôi chứ bài viết này tập trung nhấn nhá, nhấn tới nhấn lui và giải thích về Flask Python nha.

1. Flask Python là gì?

Flask Python là web framework (giúp anh em xây dựng và phát triển web application). Framework thì anh em biết rồi, thay vì phải dựng trăm thứ bằng tay thì framework sẽ xử giúp anh em. Cứ xài là có, cứ cần là dùng.

Flask Python giúp phát triển web nhanh hơn, dễ dàng hơn. Nói chung chung vậy chứ cũng phải tổng kết lại một vài ý ha.

  • Đầu tiên Flask xây dựng trên ngôn ngữ Python
  • Flask xây dựng một phần core nhỏ gọn, dễ dàng mở rộng gọi là microframework
  • Microframework này của Flask tất nhiên không bao gồm trong đó phần ORM (Object Relational Manager). Core chỉ là core và nó chứa những thứ cơ bản nhất.
  • Flask có nhiều thứ hay ho như url routing, template engine (kỹ hơn sẽ nói ở phần sau nha anh em).

Flask Python

Xin mạn phép đá qua tí về microframework. Sợ là sợ đôi khi đọc microframework anh em lại tò mò. Mà tò mò lại không nói ra thì cũng dở. Nên thôi cứ viết ra đây cho anh em.

  Python là gì? Tổng hợp kiến thức cho người mới bắt đầu

2. Microframework

Anh em cứ tách keywork ra thành micro (nhỏ) và framework. Hai thứ này làm rõ ra được concept của từ khoá. Microframework ở đây là phần core (phần lõi của cả framework). Flask Python xây dựng phần lõi này với 2 tiêu chí

  • Thứ nhất là nhỏ (micro), đúng như tên gọi.
  • Thứ hai là nó dễ dàng mở rộng (scalable)

Ngoài ra microframework tuy nhỏ nhưng dễ dàng để mở rộng và kết nối bởi các extension. Anh cũng có thể dễ dàng kế thừa phần core này để phát triển tiếp.

Về ưu điểm thì microframework có bộ khung nhẹ, vì càng nhỏ càng tốt mà. Thứ hai là ít phải cập nhật, vì phần core nhỏ gọn nên ít phải cập nhật. Có thể đứng độc lập.

Về nhược điểm thì do phần core quá nhỏ gọn nên nó không hỗ trợ được anh em quá nhiều. Nếu cần gì thêm anh em sẽ phải nhờ cậy tới plugin.

Tham khảo Job HOT Python Developer Hồ Chí Minh hấp dẫn trên TopDev

2.1 Sự phụ thuộc

Nói là độc lập nhưng Flask Python vẫn có phụ thuộc vào 2 plugins là:

  • Werkzeug là WSGI utility library
  • jinja2 là template engine

Dành cho anh em nào chưa biết thì WSGI về cơ bản là một giao thức giúp web application python có thể dễ dàng giao tiếp với server.

Kế tới là phần quan trọng template engine. Xin mời anh em di chuyển tới mục số 3.

  Tạo kho lưu cho các gói thư viện Python

3. Template Engines là gì?

Anh em đã từng thay đổi UI hay cập nhật style của một component nào đó trên web application của anh em chưa?

Ok, thay thì thay hoài, nhưng nếu thay ít vài chỗ thì không sao. Hoặc có chia theo concept atomics design thì cũng dễ, nhưng mà nhiều thì chắc bở hơi tai.

Flask Python dùng template engines cũng với mục đích tương tự. Templates đây được hiểu là các thành phần chung như header, footer. Những thành phần này khi anh em cần thay đổi thì chỉ cần thay đổi ở một chỗ. Không phải mất công sửa đi sửa lại ở nhiều chỗ khác nhau.

Flask Python

Templates Engines cũng là một ưu điểm của Flask so với các web framework khác. Tuy nhiên để mà nói cho đầy đủ về ưu nhược điểm của Flask thì phải viết rõ hơn.

  Biến toàn cục (global), biến cục bộ (local), biến nonlocal trong Python

4. Ưu điểm của Flask

Dưới đây là một số ưu điểm của Flask anh em có thể lướt qua, cân nhắc lúc nào chọn framework này, lúc nào chọn framework khác nha.

4.1 Scalable – Mở rộng

Chính nguyên lý và áp dụng microframework đã giúp cho Flask Python có thể dễ dàng mở rộng nếu có nhu cầu từ Web Application. Do phần core chạy độc lập và ít phụ thuộc, nên cho dù mở rộng ở mức quy mô thì web application sử dụng Flask Python vẫn đáp ứng được.

4.2 Flexible – Linh hoạt

Sự linh hoạt là tính năng cốt lõi và cũng là ưu điểm của Flask Python. Chính vì giữ cho core và các thành phần khác đơn giản nên ít bị phụ thuộc vào nhau. Sự đơn giản này giúp cho anh em có thể chuyển hướng web application theo business owner dễ dàng hơn.

Ngoài ra do ít bị phụ thuộc lẫn nhau nên một thành phần nào đó bị sập cũng khó mà kéo theo cả hệ thống bị sập. Về sự linh hoạt, Flask thường được đánh gia cao hơn Django.

Flask Python

4.3. Easy to negotiate – Dễ trao đổi

Về mặt cốt lõi thì phần core của Flask Python rất dễ hiểu với anh em developers. Phần triển khai cũng vô cùng nhanh chóng. Anh em chỉ cần tập trung viết code, viết cho chính xác cái thứ mà web application mình cần làm là được.

Ngoài ra Flask Python còn được đánh giá là framework nhẹ, về phần tài liệu thì khá đầy đủ và dễ hiểu cho anh em mới bắt đầu.

5. Nhược điểm của Flask

Nhược điểm của Flask Python cũng bắt đầu từ chính ưu điểm của nó. Do phần core được giữ cho thật sự đơn giản nên trong quá trình phát triển anh em nếu cần gì thêm sẽ phải cài riêng.

Cần gì cài nấy thì ít không sao nhưng Web Application cần nhiều thì sẽ tốn thời gian của anh em để cài cho đủ các thành phần.

Flask PythonĐôi khi không có log thôi là đủ để bị xử rồi anh em ạ

Về điểm này thì cá nhân tui thấy Flask Python không bằng được với Django, support quá chời quá đất.

6. Tham khảo về Flask Python

Cảm ơn anh em đã đọc bài – Thank you for your time – Happy coding!

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

Hàng loạt việc làm IT lương cao trên TopDev đang chờ bạn, ứng tuyển ngay!

Top 5 câu hỏi phỏng vấn ASP.NET thường gặp và cách trả lời

Top 5 câu hỏi phỏng vấn ASP.NET thường gặp và cách trả lời

Quay lại với chuỗi bài phỏng vấn các ngôn ngữ lập trình, lần này là ASP.NET. Thế gian không chia thành 2 phe là .NETJava nha.

Anh em nào có dự định phỏng vấn .NET thì bài viết này đích thị là danh cho anh em rồi. Nhưng nếu anh em làm Java, làm Golang, anh em cũng có thể tham khảo. Nắm được một số điểm cơ bản của .NET cũng như kiến trúc .NET cũng tốt.

Ôi dào dễ ăn lắm anh em ơi. Dễ hơn JS, SQL này kia đấy. Cứ tự tin mà xúc thôi à.

Bắt đầu thôi anh em, điểm qua lần lượt 5 câu nha!

1. Giải thích mô hình MVC trong ASP.NET

Câu hỏi đầu tiên phỏng vấn ASP.NET tất nhiên là câu hỏi về architectural pattern. Với một số anh em đi làm đã có kinh nghiệm thì MVC không còn là gì quá xa lạ. Nhưng thôi cũng điểm qua chút định nghĩa.

MVC is a software architectural pattern that divides an application into three main parts Model, View, and Controller. MVC là mẫu kiến trúc phần mềm chia ứng dụng thành 3 phần chính là Model, View và Controller.

Cùng đi qua từng thành phần để hiểu sâu hơn.

  • Model: Model là thành phần làm việc với data và đại diện cho các thuộc tính công khai, các logic chính về business của ứng dụng. Phần này thường thiên về xử lý logic.
  • View: View thường được sử dụng để xử lý dữ liệu bảng, các đồ thị cũng như hiển thị data có được từ phía model.
  • Controller: Controller xử lý các thao tác của người dùng và kiểm soát flow hoạt động của app sao cho đúng với business đã được đề ra.

MVC là câu hỏi cơ bản, anh em chú ý nêu đúng và rõ các thành phần và chức năng của từng thành phần. Một số câu hỏi khác liên quan tới kiến trúc ASP.NET anh em có thể xem lại để củng cố kiến thức.

  • ASP.NET life cycle, các loại life cycle (Application Life Cycle, Page Life Cycle).

  Architectural Styles vs. Architectural Patterns vs. Design Patterns
  ASP.NET MVC5 #3: Thêm mới View

2. Early Binding là gì?

Sau khi hệ thống lại các kiến thức tổng quan thì câu hỏi phỏng vấn thứ hai về ASP.NET chủ yếu liên quan tới khái niệm. Lần này là Early Binding, một khái niệm chỉ có ở .NET

Early Binding is used to check the methods and properties during compilation. It is fast and easy to code and also reduces the compilation time. It also reduces the time by identifying the errors. Early Binding thường được sử dụng để kiếm tra các phương thức và thuộc tính trong lúc compile source code. Nó nhanh và dễ dàng để code, giảm thời gian compile. nó cũng giúp giảm thời gian lúc có lỗi, xác định nguyên nhân lỗi

Sau khi đã nêu ra định nghĩa anh em có thể viết luôn code ví dụ.

class Simplilearn

{

  public string name;

  public int roll no;

  public void details(string name, int roll no)

  {

    this.name = name;

    this.roll no = roll no;

    Console.WriteLine("My name is :" + name);

    Console.WriteLine("My roll no is: " + roll no);

  }

}

class Simplicode

{

  public static void main(String[] args)

  {

    Simplilearn s = new Simplilearn();

    get.details("Kumar", 20);

    s.mymethod();

  }

}

Một số câu hỏi bổ sung kiến thức phần này anh em có thể hệ thống lại bao gồm:

  • Caching trong ASP.NET
  • Late Binding là gì? (Early rồi thì Late là hợp lý ha)
  • MultiView trong ASP.NET

Câu hỏi thứ hai trong bộ câu hỏi phỏng vấn ASP.NET liên quan tới các khái niệm. Anh em nếu có thời gian cố gắng đọc lại nha.

Tham khảo việc làm ASP.NET MVC hấp dẫn trên TopDev

3. ASP.NET có bao nhiêu kiểu Authentication

Câu hỏi số 3 trong bộ câu hỏi phỏng vấn ASP.NET liên quan tới Authentication. Cái này để nhớ được đòi hỏi anh em có kinh nghiệm làm thực tế.

Ngoài nêu ra các khái niệm authen, còn phải nêu được ưu nhược điểm từng loại. Lúc nào thì nên dùng cái nào. 4 loại authentication trong ASP.NET ở đây là:

  • Form Authentication
  • Windows Authentication
  • Custom Authentication
  • Passport Authentication

Trong .NET, việc xác thực thường sẽ thông qua authentication providers. Cái hay của authentication với các phương thức sẵn có chỉ cần thực hiện thông qua file config.

// Web.config file     
<authentication mode= "[Windows|Forms|Passport|None]"/>

Chi tiết thêm về Passport Authentication anh em có thể tham khảo video dưới đây.

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

4. Giải thích về concept middleware trong ASP.NET

Trong kiến trúc của ASP.NET core, middleware là các lớp C# xử lý các yêu cầu http request khi nó được gửi tới client và xử lý một http response khi nó đang trên đường trả kết quả lại cho phía client.

Phỏng vấn ASP

Middleware đóng vai trò là bên nhận request tới, có thể can thiệp để thay đổi request tới. Sau đó gửi qua phần còn lại của middleware. Ví dụ như hình trên sẽ là logging. Việc này nêu bật lên concept của middleware.

  • Thứ nhất là chỗ tập trung để xử lý request, response
  • Thứ hai là middle không chỉ handle một việc, có thể custom và đẩy nhiều hơn các xử lý vào trong middleware.

Phần này anh em có thể tham khảo thêm một số câu hỏi khác:

  • Cookie trong ASP.NET?
  • Dependency injection hoạt động như thế nào trong ASP.NET
  • Sự khác biệt giữa IIS và Kestrel

Câu hỏi này được đánh giá là câu hỏi phỏng vấn ở mức experienced (có kinh nghiệm tốt).

Xem ngay tin tuyển dụng .NET tại các doanh nghiệp hàng đầu trên TopDev

5. Sự khác biệt giữa .NET Core và ASP.NET Core

Câu hỏi cuối cùng trong phần 1 về phỏng vấn ASP.NET là sự khác biệt giữa ASP.NET và NET core.

Trả lời câu hỏi này cũng không quá khó .NET core thì chỉ tập trung vào những gì core nhất là core. Còn ASP thì có thêm những library cần thiết.

  • .NET Core là runtime. Nó có thể thực thi các ứng dụng được xây dựng cho nó.
  • ASP.NET Core là tập hợp các thư viện tạo thành Framework để xây dựng ứng dụng web. Các thư viện ASP.NET Core có thể được sử dụng trên cả .NET Core và “Full .NET Framework”.


Phần này chú trọng tới sự khác biệt giữa ASP.NET với không chỉ là .NET core mà các framework khác. Anh em có thể tham khảo thêm một số câu hỏi:

  • ASP.NET có gì khác so với các framework khác?
  • Điểm mạnh, điểm yếu của ASP.NET
  • Lựa chọn giữa ASP.NET 4.x ASP.NET Core
  • Các loại cookies trong ASP.NET

6. Tham khảo thêm về phỏng vấn ASP.NET

Hẹn gặp lại anh em ở phần 2 – Thank you for your time to read – Happy Coding!

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

Xem thêm:

Xem thêm tuyển dụng nhân viên IT hấp dẫn trên TopDev

Top 10 vị trí tuyển dụng IT hấp dẫn 2024

tuyển dụng IT
tuyển dụng IT

Viêc làm ngành IT đang nhận được sự quan tâm lớn. Với thị trường tuyển dụng cạnh tranh như hiện tại, các ứng viên tiềm năng có nhiều sự lựa chọn hơn trong việc chọn lọc và apply các job. Bài viết sau đây, TopDev sẽ chia sẻ với các bạn về 10 vị trí tuyển dụng IT hấp dẫn năm 2023.

tuyển dụng IT

Các vị trí tuyển dụng IT phổ biến

1. Lập trình Mobile (Web/ ứng dụng)                   

Thiết bị di động đang ngày càng trở nên phổ biến, nhu cầu sử dụng Mobile App ngày càng cao. Từ đó mở ra nhiều cơ hội vệc làm cho các Lập trình viên/ Kỹ sư công nghệ mảng Di động. Cùng xem qua vài vị trí tuyển dụng Mobile tại TopDev nhé!

Xem thêm việc làm Mobile từ level Fresher trên TopDev

2. Lập trình Back-end         

Theo số liệu từ IT Market report 2022 – Tech Hiring do TopDev phát hành, Back-end Developer là việc làm IT được tuyển dụng nhiều nhất, đồng thời cũng là hướng công việc được nhiều Lập trình viên lựa chọn theo đuổi.

Tổng hợp các việc làm Back-end đang tuyển trên TopDev

3. Lập trình Full-stack 

Lập trình Full-stack cũng là một trong số các vị trí tuyển dụng IT phổ biến nhất. Các doanh nghiệp có xu hướng tập trung hơn vào vị trí này, đồng thời đây cũng là công việc được nhiều Lập trình viên lựa chọn (Theo Báo cáo thị trường IT Việt Nam – Tech Hiring 2022 do TopDev phát hành).

Việc nắm bắt các Job việc làm đối với tuyển dụng cho ngành IT có một ý nghĩa quan trọng. Chẳng hạn như bạn biết apply vị trí FULLSTACK DEVELOPER, bạn cần tự đánh giá lại các kỹ năng để nỗ lực rèn luyện. Hoặc ít nhất là biết cách chọn lọc các năng lực phù hợp để CV IT DEVELOPER của mình ghi dấu ấn với nhà tuyển dụng.

Đồng thời, viết CV giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.

Các vị trí thuộc nền tảng tuyển dụng IT TopDev với đa dạng các vị trí mà bạn có thể quan tâm. Từ Fresher, Junior, Senior Developer đến các vị trí cấp cao thuộc các công ty IT hàng đầu chắc chắn sẽ là nguồn tài nguyên tuyển dụng giá trị dành cho dân lập trình.

4. Lập trình Front-end       

Lập trình Front-end đứng vị trí thứ 3 theo bảng xếp hạng các vị trí việc làm IT phổ biến nhất so với nhu cầu cao nhất theo Báo cáo thị trường IT Việt Nam – Tech Hiring 2022.

Mức lương của vị trí này với kinh nghiệm thực chiến dưới 3 năm nằm ở khoảng $951.

Tham khảo các vị trí việc làm IT HCM trên TopDev

5. Phát triển phần mềm

Phát triển phần mềm vẫn luôn là một trong những vị trí được tuyển dụng nhiều tại các doanh nghiệp,… Sau đây là một số công việc hấp dẫn liên quan đến xây dựng và phát triển phần mềm:

[Full remote/Web]Front-end Lead Software Engineer (Angular/ReactJS/VueJS)

REERACOEN VIETNAM Co.,Ltd. – Offer lên đến 80 triệu VND

Software Engineer (NodeJS) – NGÂN HÀNG Á CHÂU (ACB) – Offer Từ $1,000

Software Developer (Java) – Laudert Vietnam – Offer từ $1,000 đến $1,800

Xem thêm các việc làm Software Developer Hồ Chí Minh tại đây

Các công việc IT theo xu hướng phát triển 

tuyển dụng it hcm

6. Việc làm Data

Data Science, Data Engineer, Data Analytics, Big Data, phát triển AI/ Machine Learning/ IoT là các vị trí bạn có thể lựa chọn khi bản thân đam mê những con số hay định hướng  phát triển sự nghiệp theo mảng này.

7. DevOps

DevOps Engineer được đánh giá là một trong những vị trí tuyển dụng nhiều nhất trong những năm gần đây. DevOps Engineer là người giám sát các quy trình coding, scripting và phát triển. Họ cũng phụ trách nhóm phát triển phần mềm tham gia vào các hoạt động triển khai và mạng.
Một số kỹ năng DevOps Engineer bao gồm: Ngôn ngữ lập trình, chẳng hạn như Python và R, coding & scripting, nắm bắt tốt các công cụ như Git và Jenkins, làm chủ trong Linux hoặc UNIX System, kỹ năng giao tiếp và giao tiếp tốt, hiểu biết sâu sắc về các best practice của DevOps (Trích: Báo cáo thị trường IT Việt Nam – Tech Hiring 2022 do TopDev phát hành)

8. Cloud Architect

Cloud Architect tạo ra cấu trúc & chiến lược trên Cloudd. Họ cũng phối hợp, thực hiện và triển khai các dịch vụ đám mây. Cloud Architect đảm bảo kiến trúc ứng dụng chính xác và thực hiện trên các nền tảng Cloud.
Một số kỹ năng của Cloud Architect bao gồm: các ngôn ngữ lập trình như Python, Ruby, Nguyên tắc cơ bản lưu trữ dữ liệu, Route 53 (DNS), CloudFront (CDN) và Virtual Private Cloud (VPC), các khuôn mẫu và công nghệ cụ thể của Cloud.

(Trích: Báo cáo thị trường IT Việt Nam – Tech Hiring 2022 do TopDev phát hành)

Tuyển dụng ngành IT đang diễn ra sôi nổi và chưa bao giờ hạ nhiệt. Các ứng viên ngành lập trình ngoài tìm kiếm các việc làm thích hợp với bản thân, họ cần quan tâm đến nhiều khía cạnh hơn. Chuẩn bị CV Template IT như thế nảo? Đâu là một Cover Letter cho Dev thu hút nhà tuyển dụng cho các vị trí đòi hỏi nhiều năm kinh nghiệm như Senior Developer,… Mọi ứng viên cần chuẩn bị sẵn sàng trước mọi thách thức từ cuộc chơi tuyển mảng IT.

Xem thêm các việc làm Cloud tại đây.

9. Blockchain Developer   

Blockchain Developer phát triển và thực hiện kiến trúc và giải pháp dựa trên blockchain. Một Blockchain Developer nên có khả năng lập trình mạnh và hiểu biết đầy đủ về các công nghệ, chẳng hạn như điện toán đám mây, security protocol stacks, crypto libraries, functions và quy trình đồng thuận.
Một số kỹ năng của Blockchain Developer bao gồm: các ngôn ngữ lập trình như C ++,
Java, Python, JavaScript và C#, làm việc với các cơ sở mã, kiến thức tốt về thuật
toán và cấu trúc dữ liệu.

(Trích: Báo cáo thị trường IT Việt Nam – Tech Hiring 2022 do TopDev phát hành)

Xem thêm các việc làm Blockchain tại đây.

10. AI / Machine Learning / Deep Learning

Sự phát triển mạnh mẽ của Trí tuệ nhân tạo trong giai đoạn gần đây đã gay được sự chú ý của các doanh nghiệp. Chat GPT, Bing AI, Bard,.. là những cái tên được nhắc đến. Theo xu hướng, các vị trí này ngày càng được quan tâm và tuyển dụng.

Xem thêm các vị trí về AI, Machine Learning trên TopDev

Lời kết

Phía trên là top 10 vị trí tuyển dụng IT hấp dẫn được TopDev cập nhật. Để biết thêm nhiều job IT hơn, bạn có thể truy cập tại đây. TopDev hi vọng với những thông tin kể trên, các ứng viên sẽ sớm tìm được cho mình một ví trí thật sự phù hợp với bản thân. Đừng quên sự đầu tư về kỹ năng và các trải nghiệm thực tế. Chúc các bạn thành công!


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