Home Blog Page 46

[Update] 5 xu hướng tuyển dụng IT 2024 không thể bỏ qua

5 xu hướng tuyển dụng IT 2023 không thể bỏ qua

Vượt qua những khó khăn từ làn sóng Covid-19, giờ đây các doanh nghiệp CNTT tiếp tục bước vào cuộc đua tìm kiếm và giữ chân nhân tài. Vậy bức tranh tuyển dụng nhân sự IT năm 2024 sẽ như thế nào? Nhà tuyển dụng cần phải hành động gì để thu hút được nhân sự chất lượng? Bài viết này sẽ cho bạn góc nhìn tổng quát về xu hướng tuyển dụng IT 2024, từ đó giúp doanh nghiệp xây dựng các chiến lược tuyển dụng hiệu quả nhất.

­Hình thức làm việc từ xa tiếp tục dẫn đầu xu hướng trong tuyển dụng IT 2024

Với tác động của dịch bệnh kéo dài đã ảnh hưởng trực tiếp đến lực lượng lao động, mô hình công việc truyền thống giờ đây đã không còn phù hợp trong bối cảnh hiện tại. Theo Báo cáo thị trường IT Việt Nam – Tech Hiring 2022 của TopDev, Gần 75% các lập trình viên đang làm công việc toàn thời gian, thấp hơn con số trước đó năm 2021. Lý do không phải do thất nghiệp, mà bởi xu hướng làm việc từ xa (remote)/ tự do (freelance) gia tăng.

xu hướng tuyển dụng IT 2023

Nhiều công ty đã chính thức đưa mô hình hybrid (kết hợp giữa làm việc tại công ty và làm việc từ xa) vào quá trình vận hành, điều này đã tạo ra nhiều phản hồi tích cực từ phía nhân viên trong năm 2022. Với mô hình này, nhân viên có thể linh hoạt làm việc từ bất kỳ đâu, tăng tính hiệu quả và sự thoải mái trong công việc.

xu hướng tuyển dụng IT 2023

Nhưng mô hình hybrid này cũng đứng trước nhiều thách thức như sự gắn kết của các nhân viên, sự thiếu tin tưởng từ nhà quản lý về năng suất của nhân viên, an ninh mạng hay hệ thống & các quy trình làm việc mới. Do đó, các doanh nghiệp sẽ cần thích nghi và phục vụ cho các sở thích khác nhau trong khi hỗ trợ nhân viên. Họ phải suy nghĩ lại các chiến lược hiệu quả cho công việc hybrid trong tương lai gần. Vậy nên, việc mô hình hybrid có tiếp tục trở thành xu hướng trong những năm tới hay không còn phụ thuộc vào khả năng thích nghi và quản lý của các nhà lãnh đạo.

Mức lương không còn là ưu tiên hàng đầu của ứng viên

Theo kết quả khảo sát của TopDev, hơn 50% ứng viên mong muốn tìm thấy mục đích và hiểu rõ giá trị của mình trong công việc, thông qua các thách thức kỹ thuật và những vấn đề thú vị cần giải quyết. Điều đó cho thấy các ứng viên ngày càng tự tin và hầu như không cảm thấy quá lo lắng khi thay đổi công việc mới.

Cũng dễ hiểu, bởi có đến 72% lập trình viên cảm thấy rằng họ dễ dàng thay đổi một công việc mới, trong khi chỉ 6% lập trình viên cảm thấy thiếu tự tin khi thay đổi công việc.

xu hướng tuyển dụng IT 2023

Theo khảo sát, 3 yếu tố hàng đầu khiến lập trình viên từ chối Job Offer là offer không phù hợp (trách nhiệm & mức lương); chính sách phúc lợi & đãi ngộ công ty; thiếu cơ hội phát triển/đóng góp. Vậy nên, để thu hút và giữ chân nhân tài, các doanh nghiệp cần tích cực đưa ra những gói lợi ích, những chính sách phúc lợi và lộ trình thăng tiến rõ ràng cho nhân viên.

  Top 10 vị trí tuyển dụng IT hấp dẫn 2024

  [Update] 5 xu hướng dẫn dắt “làn sóng” công nghệ trong năm 2024

Tận dụng “bệ phóng” thương hiệu nhà tuyển dụng để thu hút nhân tài

Theo TopDev, có hơn 53% nhà tuyển dụng/nhân sự IT đầu tư cho việc xây dựng thương hiệu nhà tuyển dụng và danh tiếng công ty. Khi ứng viên càng hiểu nhiều về công ty, về sứ mệnh, văn hóa, mục tiêu phát triển thì việc gây được thiện cảm và thu hút được ứng viên phù hợp là điều không khó.

xu hướng tuyển dụng IT 2023

Vậy nên ngay từ bây giờ các doanh nghiệp nên chú ý hơn trong việc xây dựng thương hiệu, tận dụng cơ hội để đưa hình ảnh thương hiệu ra bên ngoài. Đồng thời, doanh nghiệp cần tiếp tục quan sát hành vi của ứng viên và các xu hướng mới, đánh giá tính bền vững của chúng để có thể xây dựng các kế hoạch tuyển dụng phù hợp với tương lai. Điều này rất quan trọng vì sẽ ảnh hưởng đến hiệu quả của chiến lược tuyển dụng trong tương lai.

Ứng dụng phương pháp/công cụ đánh giá năng lực kỹ thuật & tính cách

Để loại bỏ sự thiên vị trong ngành tuyển dụng CNTT, nhiều nhân viên đã bắt đầu tập trung hơn vào việc đánh giá ứng viên dựa trên kỹ năng và chắc chắn rằng lập trình viên sẽ được hưởng lợi từ điều này so với những phương pháp đánh giá chủ quan trước đây thông qua phỏng vấn truyền thống.

Các bài kiểm tra tính cách có thể tiết lộ những phẩm chất quan trọng của ứng viên tác động trực tiếp đến sự phù hợp với văn hóa, với các vị trí cụ thể và hiệu suất của nhóm như: động lực làm việc của họ là gì, quá trình suy nghĩ, cách giao tiếp và thái độ của họ. Việc ứng dụng công cụ vào quá trình tuyển dụng sẽ giúp doanh nghiệp tìm kiếm được ứng viên chất lượng và phù hợp với vị trí đang tuyển.

Tổng hợp các việc làm Back-end đang tuyển trên TopDev

Tăng tỉ lệ tuyển dụng thành công bằng việc cải thiện trải nghiệm ứng viên

Những đánh giá tiêu cực về quy trình tuyển dụng và trải nghiệm của ứng viên sẽ ảnh hưởng xấu đến thương hiệu nhà tuyển dụng. Theo LinkedIn, 65% ứng viên nói rằng trải nghiệm phỏng vấn tồi tệ khiến họ mất hứng thú với công việc. Trong khi đó, trải nghiệm ứng viên tích cực khiến ứng viên có khả năng chấp nhận lời mời làm việc cao hơn 38%.

xu hướng tuyển dụng IT 2023

Vậy nên, các doanh nghiệp cần chú trọng vào việc xây dựng hành trình trải nghiệm ứng viên tích cực với sự tham gia của tất cả các bộ phận liên quan. Hãy bắt đầu từ việc xây dựng mô tả công việc rõ ràng, làm cho quá trình ứng tuyển dễ dàng và dễ tiếp cận, đồng thời hãy đối xử với ứng viên một cách tôn trọng và dành sự quan tâm đầy đủ cho ứng viên trong cuộc phỏng vấn/cuộc gọi.

Việc đón đầu các xu hướng tuyển dụng nói trên sẽ góp phần giúp doanh nghiệp xây dựng các chiến lược “săn nhân tài” tốt hơn. Bạn có thể tìm hiểu toàn cảnh thị trường IT cũng như những chỉ số chi tiết về thị trường IT thông qua Báo cáo thị trường IT Việt Nam – Tech Hiring 2022 do TopDev phát hành.

Xem thêm:

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

Câu hỏi phỏng vấn NoSQL Developer cơ bản thường gặp nhất

Câu hỏi phỏng vấn NoSQL Developer cơ bản thường gặp nhất

Năm 2023 được dự báo là năm phát triển vượt bậc của NoSQL, chính vì vậy nhu cầu nhân lực cho vị trí NoSQL Developer cũng trở nên nhiều hơn bao giờ hết, bài viết này cung cấp cho anh em một số câu hỏi phỏng vấn NoSQL Developer hay. Tất nhiên là anh em SQL Developer có thể đọc thêm NoSQL để bổ sung kiến thức.

Phỏng vấn NoSQL

Phỏng vấn NoSQL
Theo như con số thống kê thì các hệ cơ sở dữ liệu NoSQL như mongodb, nosql đang tăng dần mức độ phổ biến.

Bài viết này chia sẻ với anh em 5 câu hỏi phỏng vấn liên quan tới NoSQL. Phần một này bao gồm các câu hỏi tổng quan, chi tiết và các câu hỏi khó hơn xin được viết ở phần 2.

Ok, gét gô thôi anh em!

Phỏng vấn NoSQL Không còn đường lui nữa rồi!

1. NoSQL là gì? Điểm mạnh của NoSQL

Tất nhiên là câu hỏi đầu tiên phỏng vấn NoSQL Developer là câu hỏi về khái niệm NoSQL. Câu hỏi này anh em cố gắng trả lời càng chi tiết càng tốt.

Một câu hỏi định nghĩa cần nêu bật khái niệm một cách chính xác. Đầu tiên.

A NoSQL database provides a mechanism for storage and retrieval of data that is modeled in means other than the tabular relations used in relational databases (like SQL, Oracle, etc.).

NoSQL database cung cấp cơ chế lưu trữ và truy xuất dữ liệu được mô hình hoá theo các cách thức khác với dạng bảng được sử dụng trong cơ sở dữ liệu dạng quan hệ (như SQL, Oracle).

Các loại cơ sở dữ liệu được sử dụng trong NoSQL bao gồm:

  • Document Oriented (Hướng tài liệu)
  • Key Value
  • Graph
  • Column Oriented (Hướng theo cột)

Về ưu điểm của NoSQL anh em có thể nêu ra một số ưu điểm làm cho NoSQL trở nên mạnh mẽ hơn so với SQL truyền thống. Một số ưu điểm có thể kể tới là:

  • NoSQL không có Schema
  • Hỗ trợ đọc ghi với tần suất rất cao
  • Hỗ trợ được big data (Terra Byte và Peta Byte)
  • Tốc độ Development nhanh hơn
  • Cho phép in memory cache giúp tối ưu performance cho queries

  NoSQL là gì? Điểm mạnh vượt trội của NoSQL
  Top 5 câu hỏi phỏng vấn SQL Developer - Phần 1

2. Lúc nào thì lựa chọn sử dụng NoSQL

Sau khi đã hiểu về NoSQL và một số ưu điểm của NoSQL thì câu hỏi phỏng vấn NoSQL Developer thứ hai liên quan tới khi nào thì anh em sử dụng nó.

Biết là có rất nhiều ưu điểm so với SQL truyền thống, nhưng không phải lúc nào cũng sử dụng. Tuỳ vào dự án, tuỳ vào business và yêu cầu data mà anh em sử dụng.

Hiểu được lúc nào sử dụng NoSQL cũng giúp anh em bớt cuồng, bớt thần thánh hoá. Một số trường hợp nêu dưới đây anh em nên sử dụng NoSQL.

  • Sử dụng với dữ liệu phi cấu trúc (không đem vào bảng, mỗi dòng đều phải có đủ từng đó column,…). Cũng không cần thiết phải quan tâm với schema.
  • Khách hàng cần xây dựng web, application có thể đáp ứng lượng truy cập cao hoặc cực cao.
  • Dữ liệu phi cấu trúc của anh em đôi khi không có ý nghĩa gì nếu sử dụng với SQL, hoặc ít nhất là không thể tổ chức được trong SQL. Hoặc những thông tin đó anh em cần JOIN quá trời JOIN để lấy ra cho được.

3. Giải thích Document-oriented và Key-Value trong NoSQL

Ở hai câu hỏi trước, ta đã hiểu và biết lúc nào sẽ sử dụng NoSQL. Câu hỏi thứ 3 phỏng vấn NoSQL Developer sẽ đi sâu vào các kiểu thường được sử dụng trong NoSQL.

Cụ thể ở câu hỏi này là Document Oriented và Key Value.

3.1 Key-value

Với Key-value thì cách thức tổ chức dữ liệu đúng như tên gọi. Một khoá là một định danh duy nhất. Có thể sử dụng khoá để truy xuất dữ liệu.

Phỏng vấn NoSQL

Anh em có thể nêu các ví dụ thực tế. Phần giá trị (value) được lưu trữ không đơn giản như Hashmap. Nó có thể đơn giản như là chuỗi, các số, hoặc cũng có thể phức tạp hơn như các giá trị lồng với nhau. Key ở đây ánh xạ trực tiếp với giá trị, hoặc vị trí lưu trữ giá trị (location of data being stored)

3.2 Column Oriented

Về Column Oriented thì đúng như cái tên, Oriented (hướng về).

Column-oriented NoSQL databases use a set of columns to store data. These column sets are known as column families, and users can directly query these column families without going through all the data records. Dữ liệu hướng column là tập hợp các column để lưu dữ liệu. Các column này được gọi là danh sách họ các cột (trong cùng gia đình), user có thể truy vấn trực tiếp dữ liệu từ các cột mà không cần phải đi qua tất cả các dòng dữ liệu

Phỏng vấn NoSQL

Loại hình này rõ ràng khác biệt với cơ chế lưu theo kiểu hàng ở SQL và các RDBMS khác. Khi cần truy xuất data ở cột, anh em không cần phải lấy dữ liệu ở cột thông qua việc đi hết một lượt tất cả các dòng.

Việc sử dụng và lưu trữ dạng cột cũng giúp tăng hiệu năng, riêng đối với việc đọc dữ liệu thì Column Oriented tỏ ra có hiệu năng cao hơn hẳn so với RDBMS thông thường. Tất nhiên vẫn có những điểm yếu như việc ghi sẽ tốn nhiều effort hơn để đảm bảo tính consistency (nhất quán) của dữ liệu.

Tham khảo SQL Developer Jobs hấp dẫn trên TopDev

4. Làm thể nào để ghi lịch sử thay đổi trong NoSQL

Câu hỏi phỏng vấn NoSQL Developer số 4 liên quan tới kinh nghiệm làm thực tế. Từ những kiến thức lý thuyết ở trên, anh em có thể giải quyết được bài toán thực tế.

Đối với câu hỏi tracking history này bên SQL và RDBMS bình thường thì không có vấn đề gì ha anh em. Cứ mỗi lần thay đổi có thể insert thêm 1 dòng, có created_at và updated_at

Phỏng vấn NoSQL

Cứ insert lúc nào thì lưu history, câu chuyện không có gì khi yêu cầu thực hiện việc tương tự bên NoSQL. Với NoSQL, thông trường sẽ có vài cách để track được lịch sử thay đổi.

  • Create a new version on each change (tạo version mỗi khi thay đổi)
  • Only store changes in a new version (chỉ lưu trữ thay đổi trong version mới)
  • Store changes within the document (lưu thay đổi kiểu document)

{
  _id: "4c6b9456f61f000000007ba6"
  title: [
    { version: 1, value: "Hello world" },
    { version: 6, value: "Foo" }
  ],
  body: [
    { version: 1, value: "Is this thing on?" },
    { version: 2, value: "What should I write?" },
    { version: 6, value: "This is the new body" }
  ],
  tags: [
    { version: 1, value: [ "test", "trivial" ] },
    { version: 6, value: [ "foo", "test" ] }
  ],
  comments: [
    {
      author: "joe", // Unversioned field
      body: [
        { version: 3, value: "Something cool" }
      ]
    },
    {
      author: "xxx",
      body: [
        { version: 4, value: "Spam" },
        { version: 5, deleted: true }
      ]
    },
    {
      author: "jim",
      body: [
        { version: 7, value: "Not bad" },
        { version: 8, value: "Not bad at all" }
      ]
    }
  ]
}

Ví dụ dưới đây lưu thay đổi của các field độc lập với nhau. title có 2 version, body cũng vậy.

5. Trường hợp muốn chuyển đổi từ SQL qua NoSQL. Cần làm những gì?

Câu hỏi cuối cùng trong bài viết chia sẻ các câu hỏi phỏng vấn NoSQL Developer lần này là việc migration từ SQL qua NoSQL. Tất nhiên là việc bưng nguyên 1 cục từ SQL qua NoSQL không phải dễ dàng.

Tuy nhiên theo từng bước vẫn có thể thực hiện được. Câu hỏi này đánh vào kiến thức của anh em về cả SQL và NoSQL. Các bước thực hiện:

  • Xác định các đối tượng dữ liệu ở SQL, mối liên hệ giữa các dữ liệu, đảm bảo cấu trúc và định dạng của dữ liệu đúng sau khi đem qua NoSQL
  • Sau khi đã có cấu trúc và lưu được dữ liệu, anh em cần thực hiện query để đảm bảo tất cả dữ liệu đều được lưu đúng và đầy đủ. Bước này quan trọng
  • Cuối cùng là kiểm tra lại hiệu năng, đảm bảo với NoSQL sẽ không có vấn đề gì về hiệu năng, nếu cần thì đánh index.

Ngoài cách thực hiện thủ công thì hiện tại cũng đã có nhiều tools hỗ trợ ở mức cơ bản. Giúp cho việc chuyển đổi nhanh chóng hơn

6. Kiến thức thêm chuẩn bị phỏng vấn NoSQL Developer

Kết thúc phần 1, ở phần 2 sẽ đi sâu hơn NoSQL cho anh em với một số câu hỏi:

  • NoSQL là norelation nhưng làm sao xác định được mỗi liên hệ giữa các record (record relations)
  • Transaction trong NoSQL
  • Thực hiện scalability và giải quyết các vấn đề performance trong NoSQL.

Ngoài ra anh em có thể tham khảo thêm:

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:

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

Giới thiệu 11 nhóm ngành công nghệ thông tin mới nhất hiện nay

Tổng quan về các nhóm ngành công nghệ thông tin

Trong thời đại kỹ thuật số hiện nay, công nghệ thông tin đóng vai trò vô cùng quan trọng trong mọi lĩnh vực của cuộc sống, nó đã và đang thay đổi cách thức hoạt động của con người và xã hội. Chính vì vậy, ngành công nghệ thông tin chưa bao giờ “hạ nhiệt” bởi nhu cầu nhân lực luôn ở mức cao.

Tuy nhiên, nhiều bạn trẻ vẫn khá lúng túng khi chọn ngành học này bởi CNTT chia thành nhiều mảng, nhiều nhóm ngành khác nhau. Mỗi nhóm có những nét đặc trưng và yêu cầu công việc riêng biệt. Chính vì vậy, bài viết này TopDev sẽ giúp bạn hiểu rõ hơn về các nhóm ngành công nghệ thông tin cũng như những điểm thú vị của từng mảng. Bắt đầu thôi nào!

Tổng quan về ngành công nghệ thông tin

Các nhóm ngành công nghệ thông tin

Ngành công nghệ thông tin (IT – Information Technology) là ngành khoa học kỹ thuật xử dụng máy tính và các phần mềm máy tính để phân phối, xử lý dữ liệu cũng như lưu trữ, trao đổi và sử dụng thông tin. Các sản phẩm và dịch vụ của ngành này đã trở thành một phần không thể thiếu trong cuộc sống hiện đại, từ điện thoại thông minh, máy tính cá nhân cho đến các ứng dụng trực tuyến.

Trong thời đại số hóa, ngành công nghệ thông tin ngày càng phát triển mạnh mẽ và tạo ra nhiều cơ hội việc làm cho các lập trình viên. Các “ông lớn” công nghệ như Apple, Google, Amazon, Facebook và Microsoft cũng là những nhà tuyển dụng lớn trong ngành này. Tại Việt Nam, nhu cầu tuyển dụng lập trình viên CNTT luôn ở mức cao, điều này thúc đẩy nhiều bạn trẻ muốn học hỏi và làm việc trong ngành CNTT đầy tiềm năng này.

Có thể thấy, CNTT là một bức tranh tổng thể vô cùng to lớn, mỗi nhánh trong nó đều ẩn chứa nhiều điều thú vị, đòi hỏi bạn phải đào sâu nghiên cứu. Vậy nên, việc hiểu rõ các nhóm ngành công nghệ thông tin là bước đầu tiên giúp bạn không “lạc lối” trên con đường tìm kiếm và khám phá thế giới công nghệ phía trước.

Khoa học máy tính (Computer Science)

Computer Science

Khoa học máy tính (Computer Science) là chuyên ngành tập trung vào nghiên cứu các thuật toán, lý thuyết chuyên môn cũng như ứng dụng của tính toán vào hệ thống máy tính. Các chuyên gia Khoa học máy tính sử dụng ngôn ngữ lập trình và công cụ tính toán để thiết kế và phát triển các hệ thống thông tin, phân tích dữ liệu và xử lý thông tin.

Ngành khoa học máy tính là một lĩnh vực đang phát triển rất nhanh với nhiều cơ hội việc làm và tiềm năng phát triển cao trong tương lai. Sau khi tốt nghiệp ngành Khoa học Máy tính, sinh viên có thể làm việc ở nhiều vị trí khác nhau như lập trình viên, cán bộ kỹ thuật, quản lý hoặc điều hành trong lĩnh vực công nghệ thông tin, kiểm thử phần mềm, chuyên viên IT, quản trị và giám sát an ninh mạng, phát triển và vận hành mạng máy tính nội bộ. Sinh viên chọn chuyên ngành này có thể chọn học tiếp các chương trình thạc sĩ và tiến sĩ để nghiên cứu chuyên sâu về khoa học máy tính và trở thành giảng viên CNTT ở các trường đại học lớn.

Mức lương của kỹ sư Khoa học Máy tính tại Việt Nam khi mới ra trường vào khoảng 10-20 triệu tùy vào yêu cầu công việc của vị trí tuyển dụng.

Kỹ Thuật Phần Mềm (Software Engineering)

Kỹ Thuật Phần Mềm (Software Engineering) tập trung vào việc phát triển, thiết kế, triển khai và bảo trì phần mềm. Các chuyên gia công nghệ phần mềm thường là những nhà phát triển phần mềm chuyên nghiệp, được đào tạo để có khả năng tạo ra các giải pháp phần mềm đáp ứng nhu cầu của khách hàng và đáp ứng các tiêu chuẩn chất lượng.

Hai công việc phổ biến trong ngành kỹ thuật phần mềm là phát triển ứng dụng và phát triển hệ thống.

Các lĩnh vực con của Công nghệ phần mềm bao gồm: phát triển ứng dụng di động (App Developer), phát triển trò chơi (Game Developer), phát triển phần mềm nhúng, phát triển phần mềm mã nguồn mở và nhiều lĩnh vực khác. Có thể thấy, công nghệ phần mềm là một lĩnh vực đầy thách thức, đang phát triển rất nhanh với nhiều cơ hội việc làm và tiềm năng phát triển cao trong tương lai.

Nghề kỹ sư phần mềm có thể vừa thú vị vừa đầy thử thách với cơ hội làm việc trong hầu hết mọi ngành, bao gồm các doanh nghiệp lớn và nhỏ, cơ quan chính phủ, tổ chức phi lợi nhuận, cơ sở chăm sóc sức khỏe, v.v. Và khi công nghệ tiếp tục phát triển, nhu cầu về các nhà phát triển phần mềm cũng tiếp tục tăng. Nhiều công ty cũng đang chuyển sang tuyển dụng các kỹ sư phần mềm làm việc tại nhà, cho phép tăng tính linh hoạt và nhiều cơ hội hơn để bước vào lĩnh vực này.

Nhờ nhu cầu mạnh mẽ của ngành và chuyên môn kỹ thuật của riêng họ, các kỹ sư phần mềm lành nghề được trả lương xứng đáng với giá trị họ mang lại. Mức lương trung bình của người mới vào nghề đối với các nhà phát triển phần mềm khá cao từ 12 – 17 triệu đồng.

Mạng máy tính và truyền thông dữ liệu

Mạng máy tính và truyền thông dữ liệu

Ngành mạng máy tính và truyền thông dữ liệu (Communications and Computer Networks) được nhiều doanh nghiệp ăn đón bởi sự phát triển thần tốc của internet, cùng xu thế Internet of Things (IoT) kết nối mọi thứ với nhau bằng internet. Ngành này sẽ tập trung vào việc thiết kế, triển khai, vận hành và bảo trì các mạng máy tính, hệ thống truyền thông dữ liệu và các ứng dụng liên quan.

Một số môn học đặc trưng của ngành Mạng máy tính:

  • Giao thức mạng: TCP/IP, HTTP, FTP.
  • Thiết kế mạng: LAN, WAN, MAN.
  • Bảo mật mạng: Tường lửa, VPN, mã hóa.
  • Quản lý mạng: Cấu hình router, switch, quản trị hệ thống mạng.

Những công việc phổ biến trong lĩnh vực này bao gồm: chuyên viên quản trị mạng, kỹ thuật viên mạng, chuyên gia bảo mật mạng và nhiều công việc khác.

Kỹ thuật máy tính

Kỹ thuật máy tính (Computer Engineering) tập trung vào việc phát triển các hệ thống máy tính, thiết kế phần cứng máy tính dựa trên những nguyên lý cũng như phương pháp dùng trong thiết kế các hệ thống phần cứng đó. Đây là một sự lựa chọn cho bạn khi băn khoăn không biết nên chọn ngành nào trong các nhóm ngành công nghệ thông tin.

Ngành kỹ thuật máy tính là một lĩnh vực đầy thách thức và phát triển rất nhanh với nhiều cơ hội việc làm, tiềm năng phát triển cao trong tương lai. Các công việc phổ biến trong lĩnh vực này bao gồm: kỹ sư phần cứng máy tính; kỹ sư lập trình các loại chip cho máy tính, đồ điện tử, thiết bị công nghệ; kỹ sư vi điều khiển và nhiều công việc khác.

Tham khảo việc làm Security Engineer Developer HOT trên TopDev

An ninh mạng

Ngành An ninh mạng là một lĩnh vực quan trọng và ngày càng phát triển trong bối cảnh các mối đe dọa bảo mật và tấn công mạng ngày càng gia tăng. Đây là ngành học tập trung vào việc bảo vệ hệ thống thông tin và dữ liệu khỏi các cuộc tấn công, xâm nhập trái phép, và các nguy cơ khác. Sinh viên theo học ngành An ninh mạng sẽ được trang bị kiến thức và kỹ năng cần thiết để bảo vệ các hệ thống công nghệ thông tin, phát hiện và đối phó với các mối đe dọa bảo mật.

Để làm được ngành này bạn cần có kiến thức về quản trị mạng, an ninh mạng, dịch vụ mạng, lưu trữ cơ sở dữ liệu, hệ thống backup thông tin,…

Nội dung học của ngành này cơ bản bao gồm:

  1. Cơ Bản Về An Ninh Mạng: Hiểu về các loại tấn công mạng và cách phòng chống.
  2. Mã Hóa và Bảo Mật Thông Tin: Kỹ thuật mã hóa và giải mã dữ liệu.
  3. Hệ Thống và Mạng Máy Tính: Bảo mật mạng LAN, WAN, và mạng không dây.
  4. Phân Tích và Quản Lý Rủi Ro: Đánh giá và quản lý rủi ro bảo mật.
  5. Phát Hiện và Phản Ứng Với Tấn Công Mạng: Công nghệ phát hiện xâm nhập.
  6. Pháp Y Kỹ Thuật Số (Digital Forensics): Thu thập và phân tích bằng chứng số.

Với sự phát triển của các công nghệ mới như IoT (Internet of Things), Cloud Computing và AI (Artificial Intelligence), lĩnh vực kỹ thuật mạng đang ngày càng trở nên quan trọng hơn đối với các tổ chức và doanh nghiệp. Các chuyên gia kỹ thuật mạng sẽ tiếp tục đóng một vai trò quan trọng trong việc đảm bảo tính an toàn và hiệu quả của các hệ thống mạng.

Hệ thống quản lý thông tin

Hệ thống quản lý thông tin (MIS – Management Information Systems) là ngành kết hợp giữa phần cứng, phần mềm và mạng truyền thông để thu thập, tổng hợp, khai thác và phân phối dữ liệu thông tin trong các tổ chức, doanh nghiệp. Các chuyên gia trong lĩnh vực này cần có kiến thức về cơ sở dữ liệu, hệ quản trị cơ sở dữ liệu, hệ thống thông tin, phân tích dữ liệu và các kỹ thuật bảo mật thông tin.

Hệ thống quản lý thông tin là một lĩnh vực rất quan trọng trong các tổ chức hiện đại. Các chuyên gia trong lĩnh vực này có thể làm việc trong các công ty công nghệ, các tổ chức kinh doanh hoặc chính phủ. Những công việc phổ biến trong lĩnh vực này bao gồm: Nhân viên quản trị cơ sở dữ liệu, chuyên viên quản lý thông tin, chuyên viên phân tích dữ liệu và nhiều công việc khác.

Khoa học dữ liệu

Ngành Khoa học dữ liệu (Data Science) kết hợp các phương pháp, thuật toán và hệ thống để trích xuất tri thức từ dữ liệu. Đây là ngành liên ngành, bao gồm toán học, thống kê, khoa học máy tính và ứng dụng chuyên môn.

Sinh viên sẽ học về toán học và thống kê, khai phá dữ liệu, học máy (Machine Learning), xử lý dữ liệu lớn, trực quan hóa dữ liệu và phân tích dữ liệu. Các ngôn ngữ lập trình phổ biến như Python và R cùng với các công cụ phân tích như Jupyter Notebook và RStudio cũng sẽ được giảng dạy. Ứng dụng của khoa học dữ liệu bao gồm các lĩnh vực như y tế, tài chính, marketing và sản xuất.

Cơ hội nghề nghiệp bao gồm: Nhà khoa học dữ liệu (Data Scientist) phân tích và trích xuất thông tin từ dữ liệu lớn; Chuyên viên phân tích dữ liệu (Data Analyst) tạo báo cáo và trực quan hóa dữ liệu; Kỹ sư dữ liệu (Data Engineer) xây dựng và duy trì hệ thống dữ liệu; Chuyên gia học máy (Machine Learning Engineer) phát triển mô hình học máy; Chuyên viên trực quan hóa dữ liệu (Data Visualization Specialist) tạo biểu đồ và báo cáo; Chuyên viên BI (Business Intelligence Specialist) phân tích và xây dựng báo cáo kinh doanh.

Ngành Khoa học dữ liệu đang phát triển mạnh mẽ nhờ sự bùng nổ của dữ liệu, mở ra nhiều cơ hội nghề nghiệp hấp dẫn và đa dạng.

Big Data và Machine Learning

Big Data và Machine Learning

Big DataMachine Learning nằm trong các nhóm ngành công nghệ thông tin được quan tâm nhiều nhất hiện nay. Big Data giúp doanh nghiệp tiếp cận dữ liệu và khai thác dữ liệu dễ dàng, hiệu quả hơn. Bên cạnh đó, Machine Learning sẽ ứng dụng trí tuệ nhân tạo, học từ dữ liệu để giải quyết nhiều vấn đề khác nhau.

Big Data và Machine Learning là một ngành khá mới tại Việt Nam, do đó nhân lực ngành này khá khan hiếm và mức lương luôn nằm trên top đầu. Vì vậy, để có thể giỏi trong ngành này bạn cần phải có kiến thức về lý thuyết dữ liệu, lập trình, kỹ thuật trí tuệ nhân tạo và phân tích dữ liệu. Các công việc phổ biến trong lĩnh vực Big Data và Machine Learning bao gồm: kỹ sư dữ liệu; chuyên viên phát triển hệ thống tự động hóa và robot; chuyên viên trí tuệ nhân tạo; chuyên gia nghiên cứu AI chuyên sâu;…

  Hiểu sâu về trí tuệ nhân tạo & Machine Learning tại Apple

Trí tuệ nhân tạo (Artificial Intelligence)

Ngành trí tuệ nhân tạo (Artificial Intelligence – AI) là một lĩnh vực tập trung vào việc phát triển các hệ thống và chương trình máy tính có khả năng tự động học và thực hiện các nhiệm vụ mà trước đó chỉ có thể được thực hiện bởi con người. Mục tiêu của trí tuệ nhân tạo là tạo ra các máy tính có khả năng hiểu, học, tư duy và thực hiện các công việc thông minh một cách tự động.

Ngành trí tuệ nhân tạo đòi hỏi chuyên môn cao, bao gồm kiến thức đa dạng từ nhiều lĩnh vực khác nhau như tâm lý học, khoa học máy tính và kỹ thuật. Ngày nay, đã có nhiều ứng dụng phổ biến của trí tuệ nhân tạo, ví dụ như ô tô tự động lái, phần mềm dịch tự động, trợ lý ảo trên điện thoại và đối thủ ảo trong trò chơi điện thoại.

Ngành Điện Toán Đám Mây

Ngành Điện toán đám mây tập trung vào cung cấp các dịch vụ tính toán qua internet, bao gồm lưu trữ, xử lý và quản lý dữ liệu. Sinh viên sẽ học cách thiết kế, triển khai và quản lý các hệ thống đám mây.

Sinh viên sẽ học về các mô hình dịch vụ đám mây như IaaS, PaaS, SaaS, các mô hình triển khai Public Cloud, Private Cloud, Hybrid Cloud. Họ cũng sẽ tìm hiểu về quản lý dịch vụ đám mây trên AWS, Azure, Google Cloud, bảo mật đám mây, mã hóa dữ liệu và quản lý quyền truy cập. Ngoài ra, sinh viên sẽ học phát triển ứng dụng trên đám mây, di chuyển dữ liệu lên đám mây và tối ưu hóa hiệu suất hệ thống.

Cơ hội nghề nghiệp bao gồm: Kỹ sư đám mây (Cloud Engineer) triển khai và quản lý hệ thống đám mây; Kiến trúc sư đám mây (Cloud Architect) thiết kế kiến trúc đám mây; Quản trị viên đám mây (Cloud Administrator) quản lý tài nguyên đám mây; Chuyên gia bảo mật đám mây (Cloud Security Specialist) đánh giá và cải thiện bảo mật; Phát triển viên ứng dụng đám mây (Cloud Application Developer) phát triển ứng dụng trên đám mây.

Ngành Điện toán đám mây cung cấp nhiều cơ hội nghề nghiệp hấp dẫn, đáp ứng nhu cầu ngày càng tăng của các doanh nghiệp về dịch vụ đám mây để cải thiện hiệu quả hoạt động và tiết kiệm chi phí.

Internet Vạn Vật (IoT)

Ngành Internet Vạn Vật (IoT) là một ngành mới nhưng tiềm năng phát triển rất lớn, tập trung vào việc kết nối các thiết bị và hệ thống với internet, cho phép chúng thu thập và trao đổi dữ liệu. Sinh viên sẽ học cách thiết kế, phát triển và triển khai các giải pháp IoT để cải thiện hiệu suất và tiện ích trong nhiều lĩnh vực khác nhau.

Sinh viên sẽ học về các nguyên lý cơ bản của IoT, bao gồm kiến trúc hệ thống IoT, các giao thức truyền thông và tiêu chuẩn kết nối. Họ cũng sẽ tìm hiểu về cảm biến và thiết bị IoT, cách thu thập và xử lý dữ liệu từ các thiết bị này. Ngoài ra, sinh viên sẽ học về an ninh và bảo mật trong IoT, đảm bảo rằng các hệ thống kết nối được bảo vệ khỏi các mối đe dọa tiềm ẩn.

Kỹ năng lập trình và phát triển phần mềm cũng là một phần quan trọng của chương trình học, với các ngôn ngữ lập trình phổ biến như Python, C++ và Java được sử dụng để phát triển ứng dụng IoT. Sinh viên cũng sẽ học cách tích hợp các hệ thống IoT với các dịch vụ đám mây để lưu trữ và phân tích dữ liệu.

Triển vọng phát triển của ngành CNTT trong tương lai

Ngành công nghệ thông tin đang phát triển với tốc độ nhanh chóng và đóng vai trò quan trọng trong nhiều lĩnh vực khác nhau, bao gồm cả kinh tế, y tế, giáo dục và giải trí. Trong tương lai, ngành công nghệ thông tin sẽ tiếp tục phát triển và mở rộng với sự gia tăng của các ứng dụng của AI, IoT, Big Data và Cloud Computing. 

Tại Việt Nam, chính phủ đã ban hành nhiều chính sách, đặt ra mục tiêu đến năm 2030 nền kinh tế kỹ thuật số sẽ chiếm 30% GDP và tỷ lệ nền kinh tế kỹ thuật số trong mỗi ngành hoặc lĩnh vực sẽ đạt ít nhất 20% (theo chủ tịch Visana Nguyễn Văn Khoa). Điều này cho thấy tiềm năng phát triển của ngành CNTT trong tương lai là vô cùng lớn.

Tổng kết

Trên đây là tất cả những chia sẻ của TopDev về các nhóm ngành công nghệ thông tin và triển vọng của ngành trong tương lai. Tham khảo thêm báo cáo thị trường IT Việt Nam 2022 để nắm bắt được xu hướng phát triển ngành CNTT, từ đó giúp bạn đưa ra quyết định chọn học ngành nào tốt hơn. Hy vọng rằng, với những kiến thức trên các bạn sẽ có lựa chọn đúng đắn cho mình trong việc lựa chọn chuyên ngành. Chúc bạn thành công trên con đường sự nghiệp của mình!

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

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

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

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

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate sẽ bao gồm 4 xử lý cơ bản đó là thêm (C), lấy dữ liệu (R), cập nhật dữ liệu (U) và xóa dữ liệu (D).

Trong những bài hướng dẫn trước, chúng tôi đã trình bày cách tạo một Web application với Spring MVC nhưng chưa có phần xử lý database. Và để xử lý database, chúng ta phải cần đến Hibernate.

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate – Các bước thực hiện

1/ Tạo một Maven Web Application Project

Các bạn có thể tạo mới một Project. Trong bài hướng dẫn này, chúng tôi sử dụng lại project của bài Hướng dẫn validation trong Spring MVC 5

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

2/ Mở file pom.xml và thêm dependency

<!-- Spring ORM -->
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.1.0.RELEASE</version>
</dependency>
<!-- Hibernate Core -->
<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.17.Final</version>
</dependency>
<!-- MySQL Server -->
<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
</dependency>
Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO). Bài viết này sẽ hướng dẫn bạn cách cài đặt và cách sử dụng Transfer Object. >>> https://topdev.vn/blog/huong-dan-java-design-pattern-transfer-object/?utm_source=facebook&utm_medium=post&utm_campaign=topdev&utm_term=luan&utm_content=b_huong-dan-java-design-pattern-transfer-object

  Hibernate Batch Processing là gì? Batch Processing trong Hibernate

  Các lưu ý về strategy của GeneratedValue khi sử dụng hibernate

3/ Tạo một file tên AppContext để cấu hình Spring và Hibernate sử dụng Java code

Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO). Bài viết này sẽ hướng dẫn bạn cách cài đặt và cách sử dụng Transfer Object. >>> https://topdev.vn/blog/huong-dan-java-design-pattern-transfer-object/?utm_source=facebook&utm_medium=post&utm_campaign=topdev&utm_term=luan&utm_content=b_huong-dan-java-design-pattern-transfer-object

Nhập code cho AppContext

package vn.giasutinhoc.spring5mvc.config;

import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.core.env.Environment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@PropertySource("classpath:database.properties")
@EnableTransactionManagement
@ComponentScan(basePackages = { "vn.giasutinhoc.spring5mvc" })
public class AppContext {

	@Autowired
	private Environment environment;

	@Bean
	public LocalSessionFactoryBean sessionFactory() {
		LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
		sessionFactory.setDataSource(dataSource());
		sessionFactory.setPackagesToScan(new String[] { "vn.giasutinhoc.spring5mvc.model" });
		sessionFactory.setHibernateProperties(hibernateProperties());
		return sessionFactory;
	}

	@Bean
	public DataSource dataSource() {
		DriverManagerDataSource dataSource = new DriverManagerDataSource();
		dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
		dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
		dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
		dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
		return dataSource;
	}

	private Properties hibernateProperties() {
		Properties properties = new Properties();
		properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
		properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
		properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
		properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto"));
		return properties;
	}

	@Bean
	public HibernateTransactionManager getTransactionManager() {
		HibernateTransactionManager transactionManager = new HibernateTransactionManager();
		transactionManager.setSessionFactory(sessionFactory().getObject());
		return transactionManager;
	}

}

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

4/ Tạo file database.properties bên trong thư mục resources để cấu hình kết nối đến database

Chọn File -> chọn New -> chọn File

Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO). Bài viết này sẽ hướng dẫn bạn cách cài đặt và cách sử dụng Transfer Object. >>> https://topdev.vn/blog/huong-dan-java-design-pattern-transfer-object/?utm_source=facebook&utm_medium=post&utm_campaign=topdev&utm_term=luan&utm_content=b_huong-dan-java-design-pattern-transfer-object

Nhập database.properties tại File name -> chọn Finish

Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO). Bài viết này sẽ hướng dẫn bạn cách cài đặt và cách sử dụng Transfer Object. >>> https://topdev.vn/blog/huong-dan-java-design-pattern-transfer-object/?utm_source=facebook&utm_medium=post&utm_campaign=topdev&utm_term=luan&utm_content=b_huong-dan-java-design-pattern-transfer-object

Nhập code cho database.properties

jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/demoDB?useSSL=false
jdbc.username = root
jdbc.password = root
hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.show_sql = true
hibernate.format_sql = true
hibernate.hbm2ddl.auto = update
Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO). Bài viết này sẽ hướng dẫn bạn cách cài đặt và cách sử dụng Transfer Object. >>> https://topdev.vn/blog/huong-dan-java-design-pattern-transfer-object/?utm_source=facebook&utm_medium=post&utm_campaign=topdev&utm_term=luan&utm_content=b_huong-dan-java-design-pattern-transfer-object

5/ Tạo một entity tên Customer

Mở Customer.java trong package vn.giasutinhoc.spring5mvc.model và thay đổi code

package vn.giasutinhoc.spring5mvc.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;

@Entity
@Table(name = "customer")
public class Customer {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private int id;

	@Column(name = "first_name")
	private String firstName;

	@Column(name = "last_name")
	@NotNull(message = "Không được bỏ trống")
	@Size(min = 1, message = "không được bỏ trống")
	private String lastName;

	@Column(name = "free_passes")
	@NotNull(message = "không được bỏ trống")
	@Min(value = 0, message = "phải lớn hơn hoặc bằng 0")
	@Max(value = 10, message = "phải nhỏ hơn hoặc bằng 10")
	private Integer freePasses;

	@Column(name = "postal_code")
	@Pattern(regexp = "^[a-zA-Z0-9]{5}", message = "5 ký tự hoặc số")
	private String postalCode;

	@Column(name = "email")
	@NotNull(message = "không được bỏ trống")
	@Email(message = "Không đúng định dạng email! Vui lòng nhập lại email")
	private String email;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public Integer getFreePasses() {
		return freePasses;
	}

	public void setFreePasses(Integer freePasses) {
		this.freePasses = freePasses;
	}

	public String getPostalCode() {
		return postalCode;
	}

	public void setPostalCode(String postalCode) {
		this.postalCode = postalCode;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}

Các bạn chú ý những chỗ chúng tôi tô màu vàng và đóng khung đỏ

Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO). Bài viết này sẽ hướng dẫn bạn cách cài đặt và cách sử dụng Transfer Object. >>> https://topdev.vn/blog/huong-dan-java-design-pattern-transfer-object/?utm_source=facebook&utm_medium=post&utm_campaign=topdev&utm_term=luan&utm_content=b_huong-dan-java-design-pattern-transfer-object

6/ Tạo một class tên CustomerDAO

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Nhập code cho CustomerService

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

7/ Tạo một class tên CustomerService

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Nhập code cho CustomerService

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

8/ Mở CustomerController.java và thêm code (phần chúng tôi đóng khung đỏ)

9/ Mở customer-form.jsp và thay đổi code (những chỗ chúng tôi tô màu vàng như trong hình)

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

10/ Tạo một view tên list-customers.jsp bên trong thư mục views

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Nhập code cho list-customers.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Danh sách khách hàng</title>
<link href="<c:url value="/resources/css/bootstrap.min.css" />"
	rel="stylesheet">
<script src="<c:url value="/resources/js/jquery-1.11.1.min.js" />"></script>
<script src="<c:url value="/resources/js/bootstrap.min.js" />"></script>
<%@ page isELIgnored="false"%>
</head>
<body>
	<div class="container">
		<div class="col-md-12">
			<h2>CRM - Customer Relationship Manager</h2>
			<hr />

			<input type="button" value="Thêm mới"
				onclick="window.location.href='showForm'; return false;"
				class="btn btn-primary" /> <br /> <br />
			<div class="panel panel-info">
				<div class="panel-heading">
					<div class="panel-title">Danh sách khách hàng</div>
				</div>
				<div class="panel-body">
					<div class="table-responsive">
						<table class="table table-striped table-bordered">
							<tr>
								<th>First Name</th>
								<th>Last Name</th>
								<th>Free Passes</th>
								<th>Postal Code</th>
								<th>Email</th>
								<th>Action</th>
							</tr>

							<!-- loop over and print our customers -->
							<c:forEach var="tempCustomer" items="${customers}">

								<!-- construct an "update" link with customer id -->
								<c:url var="updateLink" value="/customer/updateForm">
									<c:param name="customerId" value="${tempCustomer.id}" />
								</c:url>

								<!-- construct an "delete" link with customer id -->
								<c:url var="deleteLink" value="/customer/delete">
									<c:param name="customerId" value="${tempCustomer.id}" />
								</c:url>

								<tr>
									<td>${tempCustomer.firstName}</td>
									<td>${tempCustomer.lastName}</td>
									<td>${tempCustomer.freePasses}</td>
									<td>${tempCustomer.postalCode}</td>
									<td>${tempCustomer.email}</td>

									<td>
										<!-- display the update link --> <a href="${updateLink}">Cập
											nhật</a> | <a href="${deleteLink}"
										onclick="if (!(confirm('Bạn muốn xóa thông tin khách hàng này?'))) return false">Xóa</a>
									</td>

								</tr>

							</c:forEach>

						</table>
					</div>
				</div>
			</div>
		</div>

	</div>
</body>
</html>

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate – Build, Deploy và Run

1/ Tạo cơ sở dữ liệu tên demoDb

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Database sau khi tạo

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

2/ Về cách build, deploy và run các bạn tham khảo bài Hướng dẫn tạo project sử dụng Spring MVC 5 với eclipse

3/ Kết quả khi chạy http://localhost:8080/Spring5MVCProject/customer/list

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Chọn Thêm mới

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Nhập đầy đủ thông tin

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Chọn Đăng ký

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Học lập trình cần học các kiến thức cơ bản nào?

Mới học lập trình thì nên học những gì?

Lập trình viên cần học những gì? Làm thế nào để trở thành một lập trình viên giỏi? Đây là câu hỏi mà những người bắt đầu học lập trình rất quan tâm. Tuy nhiên, đưa ra câu trả lời cho những câu hỏi này lại không hề đơn giản. Lập trình là một lĩnh vực rộng lớn, luôn thay đổi và phát triển liên tục, điều này khiến cho nhiều người mới bắt đầu học lập trình rất mông lung khi bước chân vào thế giới của công nghệ thông tin. Nếu bạn đang gặp phải vấn đề này và chưa biết bắt đầu từ đâu, thì bài viết này sẽ giúp cho bạn.

Lập trình viên cần học những gì?

học lập trình

Kiến thức về lập trình, chuyên môn kỹ thuật

Công nghệ thông tin là một lĩnh vực rất đa dạng và phức tạp, tuy nhiên, để trở thành một chuyên gia trong ngành này, bạn cần có kiến thức cơ bản về một số khái niệm và kỹ thuật lập trình quan trọng.

Do ngành lập trình rất lớn nên bạn chỉ cần chọn một mảng nhất định và nghiên cứu sâu về nó. Dưới đây là các mảng kiến thức lập trình cơ bản bạn có thể lựa chọn để học:

Mảng phát triển web

Mảng phát triển web là một trong những lĩnh vực được quan tâm và phát triển mạnh mẽ trong ngành công nghệ thông tin hiện nay. Nếu chọn làm web thì bạn khỏi lo thiếu việc làm vì công ty, doanh nghiệp nào cũng cần web. Khi học phát triển web bạn cần có kiến thức về các ngôn ngữ lập trình như JavaScript, Python, PHP, HTML, CSS,…

Thêm nữa, khi làm lập trình web bạn sẽ chọn theo 3 hướng: Frontend, Backend hoặc Fullstack; muốn có giao diện web đẹp và chuyên nghiệp thì bạn sẽ học thêm về tư duy thiết kế, WebPack. Ngoài ra, để trở thành một chuyên gia phát triển web, bạn cần nắm vững các xu hướng và thay đổi mới trong ngành, cập nhật liên tục về các công nghệ mới và các tiêu chuẩn quy định mới trong lĩnh vực phát triển web.

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

Mảng Desktop App

Mảng Desktop App là lĩnh vực phát triển phần mềm trên máy tính để bàn, đây là một trong những lĩnh vực quan trọng của ngành công nghệ thông tin. Để phát triển Desktop App bạn cần nắm vững một số ngôn ngữ lập trình như C++, C#, Java, Python,… Bên cạnh đó, bạn cần có kiến thức về các hệ điều hành như Windows, MacOS, Linux.

Mảng Mobile

học lập trình

Mảng Mobile là lĩnh vực phát triển ứng dụng trên các thiết bị di động như smartphone, tablet, smartwatch. Mảng này gần đây khá hot vì số lượng các thiết bị di động ngày càng nhiều, nhu cầu người dùng gia tăng. Nếu theo Mobile bạn sẽ học các ngôn ngữ lập trình như Java, Kotlin, Swift hoặc Objective-C. Tương tự như mảng Desktop, bạn cần có kiến thức về các hệ điều hành như Android, iOS, watchOS để đảm bảo ứng dựng hoạt động hiệu quả trên các nền tảng.

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

Mảng Embedded (Lập trình nhúng)

Mảng Embedded là một trong những lĩnh vực lập trình được sử dụng để phát triển các hệ thống nhúng, các hệ thống được tích hợp sẵn trong những thiết bị điện tử như điện thoại, máy tính bảng, xe hơi, đồ gia dụng thông minh, thiết bị y tế, và nhiều thiết bị khác.

Mảng này yêu cầu trình độ chuyên môn khá cao nhưng cũng rất thú vị. Bạn có thể học C/C++, Python hay Assembly để làm mảng này, ngoài ra bạn cũng phải hiểu về kiến trúc phần cứng như vi xử lý, các loại cảm biến, các thiết bị ngoại vi,…

Mảng Big Data

Big Data là một trong những mảng nổi bật và phát triển nhất hiện nay trong ngành Công nghệ thông tin. Với số lượng dữ liệu lớn và phức tạp ngày càng tăng, nhu cầu sử dụng và phân tích dữ liệu để đưa ra quyết định kinh doanh chính xác và nhanh chóng cũng ngày càng cao. Do đó, ngành Big Data đang là một trong những mảng có nhu cầu về nhân lực rất lớn.

Học lập trình mảng big data

Để trở thành một chuyên gia Big Data, bạn cần có kỹ năng phân tích dữ liệu và trực quan hoá dữ liệu để đưa ra những thông tin quan trọng từ dữ liệu và trình bày chúng một cách dễ hiểu cho người khác. Ngoài ra, kinh nghiệm làm việc với các công cụ và nền tảng Big Data cũng là yếu tố quan trọng để giúp bạn nhanh chóng hiểu và thích nghi với các dự án Big Data khác nhau.

Kỹ năng mềm

Ngoài các kỹ năng kỹ thuật, lập trình viên còn cần phải có các kỹ năng mềm để có thể thành công trong ngành công nghệ thông tin. Dưới đây là một số kỹ năng mềm cần thiết giúp hỗ trợ công việc bạn tốt hơn:

  • Kỹ năng giao tiếp: Lập trình viên cần phải có kỹ năng giao tiếp tốt để có thể làm việc cùng đồng nghiệp, giải thích các giải pháp kỹ thuật cho những người không phải là lập trình viên.
  • Kỹ năng giải quyết vấn đề: Viết code cũng chỉ là công cụ giúp giải quyết những vấn đề của khách hàng, vậy nên lập trình viên cần phải có khả năng xác định và phân tích các vấn đề, tìm kiếm các giải pháp và áp dụng chúng vào bài toán.
  • Kỹ năng tư duy logic: Kỹ năng này giúp lập trình viên xây dựng các thuật toán và giải pháp cho các vấn đề phức tạp. Nó giúp bạn có khả năng suy nghĩ logic và đưa ra quyết định đúng đắn.
  • Kỹ năng tự học: Với sự phát triển không ngừng của công nghệ, lập trình viên cần phải có khả năng tự học để cập nhật kiến thức mới và đáp ứng nhu cầu của khách hàng. Kỹ năng tự học giúp bạn có khả năng tìm kiếm thông tin, học hỏi từ các nguồn khác nhau và tự phát triển bản thân.
  • Kỹ năng tiếng Anh: Vì với sự phát triển của công nghệ, việc tiếp cận và áp dụng các công nghệ mới yêu cầu phải có khả năng đọc hiểu tiếng Anh. Việc biết tiếng Anh sẽ giúp bạn tra cứu thông tin, tài liệu nước ngoài dễ dàng, giải quyết các vấn đề nhanh chóng.

>> Lời khuyên từ người có kinh nghiệm: Học lập trình nên chủ động tự học là chính

Một vài kinh nghiệm cho người mới học lập trình

kinh nghiệm cho người mới học lập trình

Nếu bạn mới bắt đầu học lập trình, đây là một số kinh nghiệm hữu ích để giúp bạn bắt đầu và tiến bộ trong hành trình của mình:

  • Bắt đầu từ những kiến thức cơ bản: Hãy bắt đầu học những kiến thức cơ bản nhất của lập trình. Học về các khái niệm như biến, hàm, câu lệnh điều kiện và vòng lặp. Nắm chắc các kiến thức cơ bản sẽ giúp bạn dễ dàng tiếp cận với những khái niệm phức tạp hơn.
  • Học từ nhiều nguồn khác nhau: Không chỉ học từ một nguồn, hãy tìm kiếm và học từ nhiều nguồn khác nhau để có được cái nhìn tổng quan và tránh bị giới hạn bởi một quan điểm duy nhất.
  • Thực hành và làm bài tập: Không chỉ đọc lý thuyết mà còn cần thực hành để ứng dụng được kiến thức. Hãy tìm kiếm các bài tập và thực hành để cải thiện kỹ năng lập trình của bạn.
  • Học từ các dự án thực tế: Tham gia vào các dự án thực tế hoặc làm các bài tập thực tế để học cách áp dụng kiến thức của mình vào các dự án thực tế.
  • Xây dựng một mạng lưới liên kết: Kết nối với cộng đồng lập trình viên, hỏi đáp, chia sẻ và học hỏi từ các chuyên gia lập trình viên.
  • Không sợ thất bại: Hãy luôn đối mặt với những thất bại và học hỏi từ chúng. Không có ai là hoàn hảo, thất bại chỉ là bước đệm để tiến bộ hơn.
  • Kiên trì và kiên nhẫn: Lập trình là một quá trình dài và đòi hỏi sự kiên trì và kiên nhẫn. Hãy đặt mục tiêu, giữ tinh thần và tiếp tục học tập, cải thiện mỗi ngày để trở thành một lập trình viên giỏi.

>> Xem thêm: Phương pháp tự học lập trình hiệu quả bạn nên biết

Tổng kết lại, để trở thành một lập trình viên giỏi không chỉ đòi hỏi kiến thức chuyên môn mà còn cần phải có kỹ năng mềm. Bằng việc đầu tư vào những kỹ năng này, bạn sẽ có cơ hội tiến xa hơn trong sự nghiệp lập trình viên và đạt được thành công trong lĩnh vực công nghệ thông tin. 

Hy vọng rằng bài viết này đã giúp bạn tìm được đáp án cho câu hỏi lập trình viên cần học những gì? Hãy bắt đầu tìm hiểu, học hỏi và cải thiện những kỹ năng này để trở thành một lập trình viên chuyên nghiệp và thành công trong sự nghiệp của mình. Chúc bạn thành công!

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

Top 5 câu hỏi phỏng vấn C++ hay và khó

Top 5 câu hỏi phỏng vấn C++ hay và khó

Quay lại với chuỗi bài câu hỏi phỏng vấn, bài viết này liệt kê 5 câu hỏi phỏng vấn C++. Bài viết này liệt kê 5 câu câu hỏi đi từ dễ tới khó.

Do C++ cũng giống như các ngôn ngữ lập trình đối tượng khác, nên một số câu hỏi về OOP và nguyên lý chung của ngôn ngữ sẽ không đề cập trong bài viết này để tiết kiệm thời gian cho anh em nha. Những cái đó kiểu gì trước khi phỏng vấn anh em cũng phải xem lại, mà xem là xem chung chứ không phải chỉ xem cho C++ ha.

Ok, bắt đầu thôi. Gét gô

1. Con trỏ trong C++ là gì?

Câu hỏi đầu tiên phỏng vấn C++ không thể nào mà bỏ qua được con trỏ (pointer). Anh em dân tình ai code C++ hoặc giảng dạy về C++ lúc nói với đồng nghiệp hoặc học sinh là anh code C++. Đầu tiên là ngưỡng mộ, sau đó là câu hỏi “Ủa ông còn nhớ con trỏ trong C++ hả?”.

phỏng vấn c++Hết hồn chim én liền

Vậy con trỏ trong C++ là gì?. Tại sao mọi người thường nhớ về C++ là nhớ tới con trỏ?

Pointer is a variable that stores the memory address as its value. Con trỏ là biến chỉ tới giá địa chỉ bộ nhớ có giá trị của biến.

string category = "Phỏng vấn c++"; // Biến category có kiểu dữ liệu là string 

cout << category;  // Xuất ra giá trị của biến category (Phỏng vấn c++)
cout << &category; // Xuất ra địa chỉ bộ nhớ của biến category (0x6dfed4)

Vậy con trỏ trong C++ sử dụng làm gì?

They enable programs to simulate call-by-reference as well as to create and manipulate dynamic data structures. Iterating over elements in arrays or other data structures is one of the main use of pointers. Con trỏ cho phép chương trình gọi theo kiểu tham chiếu, cũng như các thao tác tạo, thao tác tới cấu trúc dữ liệu động. Lặp lại các phần tử trong mảng hoặc các cấu trúc dữ liệu khác. Đây là một trong các cách sử dụng chính của con trỏ.

#include <bits/stdc++.h>
using namespace std;
void geeks()
{
    int var = 20;
  
    // declare pointer variable
    int* ptr;
  
    // note that data type of ptr and var must be same
    ptr = &var;
  
    // assign the address of a variable to a pointer
    cout << "Value at ptr = " << ptr << "\n";
    cout << "Value at var = " << var << "\n";
    cout << "Value at *ptr = " << *ptr << "\n";
}
// Driver program
int main() 
{ 
  geeks(); 
  return 0;
}

Như ví dụ trên đây sẽ cho ra output

Value at ptr = 0x7ffe454c08cc // Địa chỉ của biến ptr 
Value at var = 20 // Giá trị của biến var
Value at *ptr = 20 // Giá trị của biến ptr

Anh em lưu ý là & sẽ trả về địa chỉ của biến đó. Còn * sẽ trả về giá trị của biến đó được lưu ở địa chỉ cố định (located at the address).

Một số câu hỏi anh em có thể ôn luyện thêm:

  • Copy constructor trong C++ là gì?
  • Tính module (modularity) trong C++
  • Sự khác biệt giữa method override và method overloading trong C++

  So sánh giữa C++ và Golang 
  Nạp chồng toán tử trong C++

2. Sự khác biệt giữa virtual function và pure virtual function

Câu hỏi phỏng vấn C++ thứ hai liên quan tới VF (virtual function) và PVF (pure virtual function). Vẫn là các câu hỏi liên quan tới khái niệm, nhưng nếu có thể anh em nên show ra ví dụ. Như vậy vừa dễ nhớ vừa thuyết phục hơn cho người phỏng vấn.

2.1 Virtual function

Virtual function is a member function that is declared within the base class and can be redefined by the derived class. Virtual function là một hàm thành viên được khai báo trong lớp cơ sở (base class) và có thể được định nghĩa lại ở lớp dẫn xuất (devired class)

Vừa là nhắc lại vừa để cho dễ hiểu hơn anh em có thể xem lại ví dụ này

#include <iostream>  
using namespace std;  
class base  
{  
    public:  
    void show()  
    {  
        std::cout << "Base class" << std::endl;  
    }  
};  
class derived1 : public base  
{  
    public:  
    void show()  
    {  
        std::cout << "Derived class 1" << std::endl;  
    }  
};  
class derived2 : public base  
{  
    public:  
    void show()  
    {  
        std::cout << "Derived class 2" << std::endl;  
    }  
};  
int main()  
{  
    base *b;  
    derived1 d1;  
    derived2 d2;  
    b=&d1;  
    b->show();  
    b=&d2;  
    b->show();  
    return 0;  
}

derived 1 và derived 2 đều kế thừa base class, kế thừa method show(). Hai class đó cũng được khai báo 2 biến d1 và d2. Mặc dù là b chứa địa chỉ của cả b1 và b2 nhưng khi b gọi show() nó sẽ luôn gọi method show của lớp base class. Không gọi show của derived 1 và derived 2

Giải pháp lúc này ta viết function show với keywords virtual.

virtual void show()  
{  
    std::cout << "Base class" << std::endl;  
}

Nhiều vị trí tuyển dụng C++ đãi ngộ tốt trên TopDev

2.2 Pure Virtual Function

Pure thì có thêm chữ pure thôi mà. Đúng như ý nghĩa của tên gọi (Pure – Nguyên bản). Nguyên bản anh em hiểu kiểu như vị mộc không có thêm phụ gia gì hết.

A pure virtual function is a “do nothing” function. Here “do nothing” means that it just provides the template, and derived class implements the function. Pure virtual function là “do nothing” function. Ở đây do nothing có nghĩa là nó chỉ cung cấp mẫu, còn cần làm gì thì derived class phải tự làm.

Có hai cách để khai báo các hàm này

// Thứ nhất là return 0, thứ hai là không return gì cả
virtual void display() = 0;  
virtual void display() {}

Anh em có thể tham khảo thêm ví dụ này để hiểu về pure function

#include <iostream>  
using namespace std;  
// Abstract class  
class Shape  
{  
    public:  
    virtual float calculateArea() = 0; // pure virtual function.  
};  
class Square : public Shape  
{  
    float a;  
    public:  
    Square(float l)  
    {  
        a = l;  
    }  
    float calculateArea()  
    {  
        return a*a;  
    }  
};  
class Circle : public Shape  
{  
    float r;  
    public:  
      
    Circle(float x)  
    {  
        r = x;  
    }  
    float calculateArea()  
    {  
        return 3.14*r*r ;  
    }  
};  
class Rectangle : public Shape  
{  
    float l;  
    float b;  
    public:  
    Rectangle(float x, float y)  
    {  
       l=x;  
       b=y;  
    }  
    float calculateArea()  
    {  
        return l*b;  
    }  
};  
int main()  
{  
      
    Shape *shape;  
    Square s(3.4);  
    Rectangle r(5,6);  
    Circle c(7.8);  
    shape =&s;  
    int a1 =shape->calculateArea();  
    shape = &r;  
    int a2 = shape->calculateArea();  
    shape = &c;  
    int a3 = shape->calculateArea();  
    std::cout << "Area of the square is " <<a1<< std::endl;  
    std::cout << "Area of the rectangle is " <<a2<< std::endl;  
    std::cout << "Area of the circle is " <<a3<< std::endl;  
    return 0;  
}

Một số câu hỏi xem thêm:

  • Run time polymorphism và polymorphism khác nhau như thế nào?
  • Copy constructor trong C++ là gì?

3. Câu hỏi từ code ví dụ

Câu hỏi thứ 3 phỏng vấn C++ là câu hỏi về code. Code đây không có nghĩa là ngồi code, mà cho đoạn code và hỏi anh em về giá trị output. Tất nhiên để có kết quả đúng thì một số khái niệm anh em cần nắm rõ.

Giá trị i và j sẽ bằng bao nhiêu sau khi thực hiện đoạn code này?. Tại sao?

int i = 5;
int j = i++;

Đáp án cho câu hỏi này là i thì bằng 6, nhưng j lại chỉ bằng 5. Anh em nào lau chau trả lời cả i và j đều bằng 6 là sai.

Để giải thích cho kết quả, anh em cần xem lại kiến thức về ++ increment và — decrement trong C++. Các toán tử này khi đứng trước một biến.

Những câu như thế này nói là hỏi mẹo cũng không đúng. Vì nó là kiến thức cơ bản trong ngôn ngữ lập trình. Có gì anh em nhớ xem lại. Nếu ++ đứng trước thì giá trị đó sẽ ngay lập tức được tăng và gán vào cho j. Còn như ví dụ trên kia, khi ++ nằm phía sau biến, giá trị ban đầu của i sẽ đem gán vào cho j trước. Sau khi có gọi j thì giá trị của j mới tăng theo i, chuyển thành 6.

Một số câu hỏi có thể xem thêm:

  • Sự khác biệt giữa struct và class trong C++
  • Các kiểu data type trong C++

4. Phân bổ và giải phóng bộ nhớ trong C++ như thế nào?

Sau khi đã lướt qua OOP, con trỏ, code ví dụ các kiểu thì câu hỏi thứ 4 phỏng vấn C++ liên quan tới bộ nhớ. Phần này thường hay được hỏi để đánh giá Senior. Người phải review code kĩ, code sao tránh tràn bộ nhớ.

Ngoài ra, C++ thường xuyên được sử dụng trong mạch, trong lập trình với dữ liệu, ram giới hạn.

Câu trả lời cho phần này cũng đơn giản. Để cấp phát bộ nhớ thì như các ngôn ngữ khác, chúng ta sử dụng từ khoá new. Còn từ khoá delete sử dụng để xoá bộ nhớ được cấp phát trước đó.

int value=new int;  		//allocates memory for storing 1 integer
delete value;          		// deallocates memory taken by value

int *arr=new int[10];    	//allocates memory for storing 10 int
delete []arr;              	// deallocates memory occupied by arr.

5. Sự khác biệt giữa C và C++

Câu hỏi thứ 5, cũng là câu hỏi phỏng vấn C++ cuối cùng trong bài viết này liên quan tới sự khác nhau giữa ngôn ngữ C và C++.

Tất nhiên một số anh em có thể thành thạo nhiều hơn một ngôn ngữ lập trình (Java, Golang, Python, Nodejs). Nên so sánh sự khác nhau giữa các ngôn ngữ luôn là một câu hỏi phỏng vấn hay. Ngoài hiểu biết ngôn ngữ khác, anh em còn có thể chức tỏ mức độ hiểu biết của mình về C++0.

Sự khác biệt giữa C và C++ có bao gồm một số ý sau đây:

  • C++ hỗ trợ tham chiếu (pass by reference), trong khi C không hỗ trợ
  • Một số tính năng như functions, function overloading, inheritance, templates, và virtual functions chỉ có ở C++
  • Trong C thì exception được xử lý theo kiểu if else
  • Cái quan trọng C là ngôn ngữ lập trình thủ tục procedural programming. Trong khi C++ hỗ trợ cả lập trình thủ tục và hướng đối tượng (object-oriented programming)

Trên đây chỉ là một số khác biệt cốt lõi, những khác biệt nho nhỏ khác anh em có thể tham khảo tại đây.

6. Kiến thức thêm chuẩn bị phỏng vấn C++

Trường hợp có bỏ sót nội dung nào anh em cứ comment, tui sẽ viết tiếp phần 2. Cứ mỗi phần là 5 câu nha anh em

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

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

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

Mô hình ngôn ngữ LaMDA – Công nghệ đứng sau chatbot AI Bard của Google

Mô hình ngôn ngữ LaMDA

Cuộc chiến chatbot AI của các ông lớn hiện đang nóng hơn bao giờ hết với sự tham gia của đầy đủ các bên từ Microsoft, Google hay Facebook. Đầu tháng 2 năm nay, Google ra mắt chatbot AI của hãng đặt tên là Bard và nhanh chóng trở thành đối thủ lớn nhất của ChatGPT. Đứng sau sự “thông minh” của Bard chính là mô hình ngôn ngữ LaMDA được Google phát triển từ những năm 2020. Bài viết hôm nay chúng ta cùng nhau tìm hiểu về công nghệ này để xem khả năng của nó mạnh mẽ đến đâu nhé.

Mô hình ngôn ngữ là gì?

Mô hình ngôn ngữ hay Language Model là tập hợp các kiến thức trước đó về một ngôn ngữ nhất định, các kiến thức này có thể là các kiến thức về từ vựng, về ngữ pháp, về tần suất xuất hiện của các cụm từ,… Một mô hình ngôn ngữ có thể được xây dựng theo hướng chuyên gia hoặc hướng dữ liệu.

Mô hình ngôn ngữ lớn (Large Language Model) là các hệ thống xử lý ngôn ngữ tự nhiên (NLP) – một nhánh của nghiên cứu AI – được huấn luyện dựa trên khối lượng văn bản khổng lồ và có khả năng trả lời các câu hỏi đọc hiểu hoặc tạo văn bản mới.

LLM chứa một thuật toán học sâu (Deep Learning) có thể nhận dạng, tóm tắt, dịch, dự đoán và tạo văn bản cũng như các nội dung khác dựa trên kiến thức thu được từ những bộ dữ liệu khổng lồ. Nói cách khác, LLM chính là thứ đứng sau những siêu ứng dụng AI trò chuyện (chatbot AI) hiện nay.

  Digital Twins – xu hướng công nghệ cho ngành IoT

LaMDA là gì?

LaMDA – Language Model for Dialogue Applications là một nhóm các mô hình ngôn ngữ đàm thoại lớn do Google phát triển. Tiền thân của LaMDA được Google phát triển và giới thiệu từ năm 2020 với tên là Meena; sau đó ở hội nghị Google I/O năm 2021, LaMDA thế hệ đầu tiên được chính thức công bố. Và mới nhất vào tháng 2 năm 2023, Google công bố Bard, một chatbot AI đàm thoại phát triển dựa trên LaMDA như là một bước cạnh tranh với sự phát triển ấn tượng của ChatGPT từ OpenAI.

LaMDA là gì

LaMDA dựa trên kiến trúc Transformer giống như các mô hình ngôn ngữ khác như BERT và GPT-3, tuy nhiên do được đào tạo nên LaMDA có thể hiểu các câu hỏi và hội thoại có sắc thái về một số chủ đề khác nhau. Các chatbot thông thường chỉ xử lý các câu hỏi và cuộc hội thoại trong cùng một chủ đề; mặc dù vậy trong giao tiếp của con người hàng ngày thì việc chuyển chủ đề hay chủ đề mở mang tính phổ biến hơn; điều kiện là một vấn đề khó khăn dành cho chatbot. Theo những thông báo đến từ Google thì LaMDA đã được xây dựng để khắc phục những vấn đề này.

Việc làm AI lương thưởng hấp dẫn, mới nhất dành cho bạn!

Sức mạnh của LaMDA

Transformer Neural Network

Kiến trúc mạng nơ ron biến đổi là một mô hình học sâu (Deep Learning) được thiết kế để phục vụ giải quyết nhiều bài toán trong xử lý ngôn ngữ và tiếng nói, ví dụ như bài toán dịch tự động, nhận dạng tiếng nói, chuyển văn bản thành tiếng nói,…

Trước đây, các tác vụ xử lý ngôn ngữ tự nhiên đều sử dụng kiến trúc Recurrent Neural Networks (RNNs); câu đầu vào sẽ được xử lý một cách tuần tự khiến tốc độ xử lý trở nên chậm và gặp phải hạn chế trong việc biểu diễn sự phụ thuộc xa giữa các từ trong một câu. Transfomer không xử lý tuần tự hồi quy (Recurrent) như RNNs mà sử dụng self-attention để nhìn vào các từ khác trong lúc mã hóa hay giải mã để hiểu được sự liên quan giữa các từ trong một câu.

Transformer Neural Network

LaMDA được xây dựng dựa trên kiến trúc Transformer để hiểu ngôn ngữ, tạo ra một mô hình có thể được huấn luyện để đọc nhiều từ (một câu hay một đoạn văn), chú ý đến cách các từ đó liên quan đến nhau và sau đó dự đoán những từ nó nghĩ sẽ xuất hiện tiếp theo.

  [Update] Low Code là gì? Hướng đi nào cho Low Code 2024

Sở hữu tham số đào tạo “khủng”

Tiền thân của LaMDA là Meena được Google cung cấp dữ liệu training về 341GB văn bản được lọc từ các cuộc trò chuyện trên mạng xã hội công cộng. Với nguồn tài nguyên hội thoại vô tận đến từ Google thì Meena có thể học được sắc thái trong cuộc trò chuyện từ những ví dụ khó và chân thực nhất. Điều này mang đến cho chatbot này khả năng trả lời (hồi đáp) lại những câu có ý nghĩa, có cảm tính hoặc là hợp lý giống như con người nhất.

Đến thời điểm hiện tại, Meena có tới 2.6 tỷ tham số, nhưng không là gì so với LaMDA AI khi sở hữu tới 137 tỷ tham số cùng với trên 1.56 nghìn tỷ từ được đào tạo. Google còn tiết lộ một hệ thống lớn và phức tạp hơn mang tên là PaLM với 540 tỷ tham số hứa hẹn mang lại độ chính xác cao hơn vượt xa hiện nay.

Google LaMDA là tương lai của Google?

Với đặc thù của mình thì mô hình LaMDA còn rất nhiều thứ để có thể phát triển trong cả tương lai gần và xa hơn. Đào tạo các mô hình LaMDA trên các dữ liệu khác nhau bao gồm cả hình ảnh và video là một điều mà chúng ta có thể sẽ nhìn thấy trong những năm sắp tới. Giám đốc điều hành Sundar Pichai ủa Google tin rằng khả năng trò chuyện của LaMDA có tiềm năng làm cho thông tin và máy tính hoàn toàn dễ tiếp cận và dễ sử dụng hơn. Chúng ta cùng chờ xem LaMDA có trở thành tương lai của ông lớn Google này không nhé. Hy vọng bài viết này hữu ích dành cho bạn, cảm ơn các bạn đã đọc bài, 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

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

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

Hướng dẫn Java Design Pattern – Transfer Object

Hướng dẫn Java Design Pattern – Transfer Object

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

Transfer Object Pattern là gì?

Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO).

Transfer Object đơn giản là một POJO (Plain Old Java Object), chỉ chứa các getter/ setter method và có thể có implement serialize để truyền tải dữ liệu thông qua network.

DTO hoàn toàn không chứa behavior/ logic, chỉ được sử dụng để truyền dữ liệu và map dữ liệu từ các Domain Model trước khi truyền tới Client. Trong các ứng dụng đơn giản, các Domain Model thường có thể được sử dụng lại trực tiếp dưới dạng DTO và được truyền trực tiếp đến lớp hiển thị, do đó chỉ có một Data Model thống nhất. Đối với các ứng dụng phức tạp hơn, chúng ta không muốn hiển thị toàn bộ Domain Model cho Client, do đó, việc ánh xạ từ các Domain Model sang DTO là cần thiết.

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

Cài đặt Transfer Object Pattern như thế nào?

Transfer Object Pattern

Các thành phần tham gia Transfer Object Pattern:

  • Business Object : là một Business Service, tạo Transfer Object và trả nó về Client khi cần thiết. Nó cũng có thể nhận dữ liệu từ Client trong một Transfer Object và gửi đến Server để cập nhật vào database.
  • Transfer Object : là một POJO, chỉ chứa các getter/ setter method.
  • Client : người sử dụng ứng dụng.

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

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

Ví dụ sử dụng Transfer Object Pattern

Lớp xử lý nghiệp vụ ở phía Server thường truy vấn dữ liệu từ database và gán các giá trị vào Transfer Object để gửi lại Client. Phía Client có thể tạo một Transfer Object và gán giá trị vào để gửi lại Server thực hiện update vào database.

Trong ví dụ bên dưới, chúng ta sẽ cùng tìm hiểu cách áp dụng DTO với DAO ở bài viết trước.

Transfer Object Pattern

UserModel.java

package com.gpcoder.patterns.other.dto;

import lombok.Data;

/**
 * Domain Model / Entity
 */
@Data
public class UserModel {

    private Integer id;
    private String userName;
    private String fullName;
    private String password;
    private String email;
    private String bankAccount;
}

Dao.java

package com.gpcoder.patterns.other.dto;

import java.util.List;
import java.util.Optional;

/**
 * Data Access Object
 */
public interface Dao<T> {

    List<T> getAll();

    Optional<T> get(Integer id);

    void save(T t);

    void update(T t);

    void delete(T t);
}

UserDao.java

package com.gpcoder.patterns.other.dto;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class UserDao implements Dao<UserModel> {

    // Temporary database
    private List<UserModel> users = new ArrayList<>();

    public UserDao() {
        UserModel user = new UserModel();
        user.setId(1);
        user.setUserName("gpcoder");
        user.setEmail("gpcodervn@gmail.com");
        user.setFullName("GP Coder");
        user.setPassword("1234567");
        user.setBankAccount("9999-9999-9999");
        users.add(user);
    }

    @Override
    public List<UserModel> getAll() {
        return users;
    }

    @Override
    public Optional<UserModel> get(Integer id) {
        return users.stream().filter(u -> u.getId() == id).findFirst();
    }

    @Override
    public void save(UserModel user) {
        users.add(user);
    }

    @Override
    public void update(UserModel user) {
        int index = -1;
        for (UserModel u : users) {
            index++;
            if (user.getId().equals(u.getId())) {
                users.set(index, user);
                break;
            }
        }
    }

    @Override
    public void delete(UserModel user) {
        get(user.getId()).ifPresent(existUser -> users.remove(existUser));
    }
}

UserDTO.java

package com.gpcoder.patterns.other.dto;

import lombok.Data;

/**
 * Data Transfer Object
 */
@Data
public class UserDTO {

    private Integer id;
    private String userName;
    private String fullName;
    private String email;
}

UserService.java

package com.gpcoder.patterns.other.dto;

/**
 * Business Object / Logic
 */
public class UserService {

    private UserDao dao = new UserDao();

    public UserDTO getUser(Integer id) {
        UserModel model = dao.get(id).get();
        return convertToDTO(model);
    }

    public void saveUser(UserDTO dto) {
        UserModel model = convertToModel(dto);
        dao.save(model);
    }

    public void updateUser(UserDTO dto) {
        UserModel model = convertToModel(dto);
        dao.update(model);
    }

    private UserModel convertToModel(UserDTO dto) {
        UserModel model = new UserModel();
        model.setId(dto.getId());
        model.setFullName(dto.getFullName());
        model.setUserName(dto.getUserName());
        model.setEmail(dto.getEmail());
        return model;
    }

    private UserDTO convertToDTO(UserModel model) {
        UserDTO dto = new UserDTO();
        dto.setId(model.getId());
        dto.setFullName(model.getFullName());
        dto.setUserName(model.getUserName());
        dto.setEmail(model.getEmail());
        return dto;
    }
}

DataAccessObjectPatternExample.java

package com.gpcoder.patterns.other.dto;

/**
 * Client - Data Access Object Pattern Example
 */
public class DataAccessObjectPatternExample {

    public static void main(String[] args) {
        UserService service = new UserService();
        UserDTO dto = service.getUser(1);
        System.out.println("User: " + dto);

        dto.setFullName("gpcoder.com");
        service.updateUser(dto);
        System.out.println("User Updated: " + dto);
    }
}

Output của chương trình:

User: UserDTO(id=1, userName=gpcoder, fullName=GP Coder, email=gpcodervn@gmail.com)
User Updated: UserDTO(id=1, userName=gpcoder, fullName=gpcoder.com, email=gpcodervn@gmail.com)

Tham khảo việc làm Fresher Java mới nhất trên TopDev

Lợi ích của Transfer Object Pattern là gì?

  • Tách biệt logic một cách rõ ràng : Transfer Object chỉ chứa data, còn logic được implement trong phần khác.
  • Cãi thiện hiệu suất ứng dụng : chi phí của mỗi request/ response là lớn, chúng ta nên cố gắng gửi nhiều nhất có thể. Để làm điều này, chúng ta có thể tạo một Transfer Object để gửi data từ Client lên Server hay từ Server đến Client một lần duy nhất, thay vì phải gửi từng phần riêng lẻ.
  • Giảm kết dính giữa các tầng trong ứng dụng: Client chỉ thao tác với Transfer Object, nên nó không bị ảnh hưởng khi Domain Model thay đổi.
  • Bao đóng các đối số : một phương thức có nhiều đối số, chúng ta có thể bao đóng chúng trong một Transfer Object. Giúp chúng ta dễ dàng mở rộng, thêm/ bớt đối số.
  • Nhận nhiều dữ liệu trả về : trong Java, một phương thức chỉ có thể trả về một giá trị, để có thể nhận được nhiều giá trị, chúng ta có thể bao đóng chúng trong một Transfer Object.
  • Tăng bảo mật ứng dụng : tùy vào người dùng khác nhau có thể xem được một số dữ liệu nhất định. Chúng ta có thể tạo nhiều Transfer Object khác nhau cho từng loại người dùng thay vì trả về một Domain Object một cách trực tiếp. Trường hợp rõ ràng nhất là User Model, domain object này chứa thông tin cả email, password, số tài khoản ngân hàng. Chúng ta có thể tạo một Transfer Object đơn giản chỉ chứa thông tin họ tên, ngày sinh. Không cần thiết phải trả tất cả dữ liệu Domain Model về Client.
  • Transfer Object thường được sử dụng với Data Access Object.

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

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

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

Hibernate Batch Processing là gì? Batch Processing trong Hibernate

Hibernate Batch Processing là gì? Batch Processing trong Hibernate

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

1. Hibernate Batch Processing là gì?

Ta có tình huống như sau: cần insert 10000 bản ghi vào database

  • Nếu insert lần lượt và đẩy từng đối tượng một thì thời gian sẽ rất lâu vì phải mở/đóng connection nhiều lần
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    session.flush();
    session.clear();
}
tx.commit();
session.close();
  • Nếu insert và đẩy đồng thời cùng 1 lúc 10000 bản ghi thì sẽ xảy ra lỗi OutOfMemoryException (Lý do là hibernate sẽ lưu tất cả 10000 bản ghi vào bộ nhớ cache nhưng bộ nhớ cache không đủ)
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
}
tx.commit();
session.close();

=> Giải pháp: Batch Processing

Vậy Batch Processing là gi? Batch Processing là xử lý theo lô, tức là ta sẽ insert và đẩy từng lô bản ghi vào database.

hibernate-batch-processing

Ví dụ ở đây ta sẽ insert và đẩy 50 bản ghi vào database cùng 1 lúc, như thế sẽ giảm số lượng connection tới database, đồng thời tránh được lỗi OutOfMemoryException

  Phân biệt save, persist, update, merge, saveOrUpdate trong hibernate

  Các lưu ý về strategy của GeneratedValue khi sử dụng hibernate

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 50 == 0 ) { //50, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

2. Batch Inserts

Khi bạn tạo mới đối tượng persistent, sử dụng các method flush() và clear() để điều khiển kích thương của bộ nhớ cache.

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
      //flush a batch of inserts and release memory:
      session.flush();
      session.clear();
    }
}

tx.commit();
session.close();

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

3. Batch Update

Cũng giống như lúc insert, khi truy xuất, cập nhật dữ liệu hãy dùng các method  flush() và clear() để điều khiển kích thương của bộ nhớ cache. Ngoài ra sử dụng method scroll() để tận dụng các con trỏ ở server cho các truy vấn trả về nhiều hàng dữ liệu.

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

ScrollableResults customers = session.getNamedQuery("GetCustomers")
    .setCacheMode(CacheMode.IGNORE)
    .scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while ( customers.next() ) {
    Customer customer = (Customer) customers.get(0);
    customer.updateStuff(...);
    if ( ++count % 20 == 0 ) {
        //flush a batch of updates and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

4. StatelessSession

Trái với Session, StatelessSession không có cache-level 1 hoặc giao tiếp với cache-level 2. Nó cũng không gắn với một Persistence Context nào.

StatelessSession session = factory.openStatelessSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.insert(customer);
}

tx.commit();
session.close();

Top 7 câu hỏi phỏng vấn Security Engineer thường gặp

Top 7 câu hỏi phỏng vấn Security Engineer thường gặp

Vấn đề bảo mật luôn là một thách thức lớn cho các công ty, tổ chức hiện nay; vì thế các công ty IT luôn ưu tiên tìm kiếm vị trí Security Engineer có kinh nghiệm với mức đãi ngộ cao. Bài viết hôm nay chúng ta cùng nhau tìm hiểu những câu hỏi phỏng vấn vị trí Security Engineer thường gặp nhé.

1. Công việc của một Security Engineer là gì?

Security Engineer

Security Engineer – kỹ sư bảo mật hay Security Specialist – chuyên gia bảo mật là một công việc giúp bảo vệ hệ thống máy tính khỏi các tấn công từ bên ngoài và đề phòng, hạn chế, khắc phục những lỗi xảy ra từ bên trong. Việc bảo mật trong một tổ chức bao gồm nhiều lĩnh vực như mạng (network), thông tin (information), hệ thống (system),… và nhiều vai trò công việc như khắc phục sự cố (Ttroubleshooting), quản trị (administration), phân tích (analyst), kiểm tra (testing),…

Công việc của một kỹ sư bảo mật thường bao gồm những đầu việc dưới đây:

  • Phát triển các giao thức bảo mật
  • Kiểm tra lỗ hổng hệ thống
  • Thực hiện và nâng cấp các biện pháp bảo mật
  • Duy trì hệ thống an ninh
  • Điều tra vi phạm an ninh

2. Lỗ hổng hệ thống (Vulnerability) là gì?

Lỗ hổng hệ thống (Vulnerability) là một điểm yếu của hệ thống mà thông qua đó, những kẻ xâm nhập hoặc các lỗi có thể lợi dụng tấn công hệ thống. Nếu việc kiểm thử an ninh hệ thống không được thực hiện một cách nghiêm ngặt, kĩ càng thì lỗ hổng ngày có nguy cơ càng ngày càng trầm trọng hơn. Vì vậy cần phát hiện sớm và có những bản vá lỗi kịp thời.

Ngoài lỗ hổng hệ thống thì còn 2 khái niệm khác là mối đe dọa (threat) và nguy cơ (risk). Threat nói đến một sự cố mới được phát hiện có khả năng gây hại cho hệ thống. Risk đề cập đến khả năng mất mát hoặc thiệt hại khi một mối đe dọa khai thác lỗ hổng bảo mật. Nói cách khác chúng ta có mối tương quan giữa 3 khái niệm này như sau: RISK = Threat + Vulnerability

  Ngành Bảo Mật Thông Tin Và Những Cơ Hội Việc Làm Đầy Hấp Dẫn

  Lộ trình từng bước trở thành Machine Learning Engineer

3. Thế nào là XSS hay Cross Site Scripting

Cross Site Scripting

XSS hay Cross Site Scripting là một loại lỗ hổng mà tin tặc có thể lợi dụng để tấn công các ứng dụng Web. Lợi dụng việc chèn các đoạn mã JavaScriptHTML vào trang Web để thực hiện việc đánh cắp những thông tin bảo mật từ dữ liệu của người dùng hay hệ thống. Có 2 loại tấn công XSS là XSS lưu trữ (stored) và XSS phản xạ (reflected). Stored XSS là những đoạn script được lưu trên một trang tĩnh hoặc lấy ra từ cơ sở dữ liệu và hiển thị trực tiếp lên cho người dùng. Reflected XSS là việc người dùng bị lừa gửi đi một request (được bên tấn công thiết kế) và đoạn script độc hại đó được gửi về từ trang Web.

Phương pháp chung cho việc xử lý các tấn công XSS là việc kiểm tra làm sạch đầu vào, chỉ thực thi những đoạn mã được kiểm soát và không gây hại cho hệ thống.

4. Nêu điểm khác nhau giữa encode, encrypt và hashing

Encode – mã hóa được thiết kế để bảo vệ tính toàn vẹn của dữ liệu khi truyền tải qua các hệ thống mạng, đường truyền,… đảm bảo thông điệp nhận được sẽ chính là thông điệp được gửi đi. Trong việc mã hóa, các vấn đề về bảo mật không phải vấn đề chính được quan tâm mà tính toàn vẹn dữ liệu mới là cốt lõi. Thông điệp mã hóa thường có thể dễ dàng được dịch ngược thành văn bản vì các hệ mã hóa thường được sử dụng rộng rãi.

Để đảm bảo tính an toàn và bí mật của thông tin, chúng ta sử dụng Encrypt – mật mã. Bản mã chỉ được dịch ngược thành văn bản thông tin nếu có key – chìa khóa.

Hashing – hàm băm là hàm một chiều, không để đảo ngược; đầu ra thường ngắn hơn đầu vào và có chiều dài cố định. 

Tham khảo việc làm System Security HOT trên TopDev

5. Tấn công CSRF là gì?

CSRF – Cross-Site Request Forgery là một dạng tấn công có thể làm cho trình duyệt nạn nhân gửi đi các request cùng với các thông tin chứng thực. Bên thực hiện tấn công thường sử dụng các khiến nạn nhân (người dùng) click vào một link hoặc dùng các iframe nhúng website, đoạn mã tự động gửi request khiến người dùng thực hiện một hành động mà họ không chủ ý và không biết được kết quả xảy ra.

Để phòng chống tấn công CSRF, nhiều trang Web sử dụng tích hợp nonces vào các form hoặc URL. Nonces là một loại kỹ thuật sử dụng các token một lần dùng, các giá trị một lần dùng này được sinh ra khi người dùng truy cập vào trang Web và nó sẽ thay đổi liên tục. Khi người dùng nhấn vào một liên kết hay điền một form, token sẽ được gửi kèm theo truy vấn và được xác thực trên máy chủ. Chỉ khi token đúng (validation) thì truy vấn mới được xử lý.

6. Mục tiêu bảo mật thông tin trong một tổ chức là gì?

Đối với một tổ chức, để đảm bảo được mục tiêu bảo mật thông tin thì điều cơ bản nhất cần được thực hiện là kiểm soát tất cả các truy cập thông tin càng nhiều càng tốt. Việc kiểm soát sự truy cập là một điều không chỉ những kỹ sư bảo mật thực hiện mà còn là nhiệm vụ của bất kỳ nhân viên nào trong công ty, tổ chức. Vì thế việc nâng cao hiểu biết về an ninh, nhận thức được sự an toàn thông tin trong một tổ chức là điều mà bất cứ nhân viên nào cũng phải được đào tạo. Đối với bất kỳ công ty thương mại nào, mục tiêu bảo mật thông tin luôn là để giúp công ty thành công và đảm bảo được thành công trong tương lai.

Kỹ sư bảo mật luôn luôn phải đặt trọng tâm bảo mật dựa trên những mối quan tâm đến lỗ hổng bảo mật và những mối đe dọa có thể xảy ra. Khi có lỗ hổng xuất hiện, phải đảm bảo có biện pháp xử lý vá lỗi ngay, đấy như là việc chữa bệnh. Ngược lại, chú trọng thiết kế phòng thủ sâu dựa trên các mô hình mối đe dọa cũng giống như việc phòng bệnh. Đảm bảo thông tin trong tổ chức không bị “nhiễm bệnh” chính là mục tiêu của bảo mật thông tin.

7. Một số chứng chỉ bảo mật thông tin phổ biến

Trong lĩnh vực bảo mật thông tin thì các chứng chỉ của CompTIA – hiệp hội công nghiệp công nghệ máy tính hàng đầu của Hoa Kỳ được xem là tiêu chuẩn công nhận bạn có thể được công nhận là bước chân vào ngành này. Có 4 chứng chỉ bảo mật CompTIA:

  • CompTIA Security +
  • CompTIA PenTest +
  • Nhà phân tích an ninh mạng CompTIA (CySA +)
  • Học viên bảo mật nâng cao CompTIA (CASP +)

CompTIA Security

Ngoài 4 chứng chỉ trên thì còn các chứng chỉ có giá trị cao cho nghề bảo mật Security Engineer như dưới đây:

  • CISM: chứng chỉ được chứng nhận bởi ISACA dành cho chuyên gia đánh giá hệ thống thông tin và bảo mật.
  • CISSP: chứng chỉ bảo mật thông tin độc lập do Hiệp hội chứng nhận bảo mật hệ thống thông tin quốc tế cấp.
  • CEH: chứng nhận hacker đạo đức (hacker mũ trắng) giúp các tổ chức hệ thống phát hiện lỗ hổng, tìm cách sửa chữa và khắc phục.

Kết bài

Trên đây là danh sách những câu hỏi thường gặp dành cho kỹ sư bảo mật Security Engineer trong buổi phỏng vấn với nhà tuyển dụng. Đây là một lĩnh vực khó và đòi hỏi sự đam mê tìm tòi chuyên sâu của các kỹ sư công nghệ thông tin, vì vậy hãy trang bị thêm kiến thức thực tiễn mà bạn học được để sẵn sàng chinh phục nhà tuyển dụng nhé. Cảm ơn các bạn đã đọc bài 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 Việc làm IT hấp dẫn trên TopDev

Kiểm thử đơn vị với PHPUnit trên Netbeans

Kiểm thử đơn vị với PHPUnit trên Netbeans

Bài viết được sự cho phép của BBT Tạp chí lập trình

Khái niệm Kiểm thử đơn vị (Unit Testing) không còn xa lạ với những lập trình viên luôn hướng tới chất lượng của từng dòng code. Với bài viết này tôi mong muốn sẽ giúp các lập trình viên PHP biết cách triển khai Unit Testing với framework PHPUnit. Đây là một Framework nổi tiếng thế giới, nó cho phép bạn triển khai Unit Testing với nhiều IDE khác nhau, ở bài viết này tôi sẽ hướng dẫn bạn triển khai với Netbeans 7.2.

Netbeans là IDE được nhiều lập trình viên Java sử dụng, tuy vậy đây cũng là một trong những IDE hỗ trợ lập trình PHP và đặc biệt là hỗ trợ đắc lực cho việc triển khai kiểm thử tự động với PHPUnit.

Trước hết để có thể triển khai ứng dụng với PHP bạn cần có môi trường cho ngôn ngữ này đã. Bạn dễ dàng làm quen với PHP và chuẩn bị môi trường để phát triển ứng dụng (web) với ngôn ngữ này. Về mặt căn bản bạn chỉ cần cài XAMPP là đủ để phát triển ứng dụng web với PHP, nếu không cần đi quá sâu về môi trường phát triển PHP.

Có thể bạn đã có XAMPP, tuy nhiên PHPUnit cần phải có thêm sự hỗ trợ của PEAR. Hướng dẫn cài PEAR có khá nhiều trên Internet, ví dụ như trang web http://www.phpunit.de. Hoặc bạn có thể thực hiện các lệnh như tôi đã làm trên màn hình lệnh của Windows (cũng có thể bạn có cách khác đơn giản hơn? cho chúng tôi cùng biết với nhé). Lưu ý, nếu bạn dùng Windows với tài khoản thường thì cần phải chạy CMD (chương trình để chạy các lệnh) với quyền của Administrator (Run as Administrator), đặc biệt là trên Windows 8.

Kiểm thử đơn vị với PHPUnit trên Netbeans

Lưu ý lệnh cài đặt PHPUnit với PEAR (dòng lệnh thứ 2) chỉ thực hiện được thành công với những điều kiện sau:

  • Bạn đã sẵn có XAMPP và đang vào đúng thư mục php nằm trong thư mục cài đặt của nó (tôi đang có XAMPP ở tại C:xampp).
  • Máy tính của bạn phải được kết nối Internet vì lệnh cài đặt trên sẽ tải bộ cài từ repo trên mạng về trước khi cài vào máy tính của bạn.

  Phương pháp kiểm thử ứng dụng Web phổ biến

  NUnit – Kiểm thử Đơn vị trên Visual Studio

Bạn sẽ nhận được các thông báo dạng như sau:

Kiểm thử đơn vị với PHPUnit trên Netbeans

Nếu toàn thấy “OK” như trên thì chắc bạn đã thành công và PHPUnit đã sẵn sàng để bạn xài nó. Nếu báo lỗi bạn cần chạy lệnh sau:

pear config-set auto_discover 1

Sau đó chạy lại lệnh:

pear install pear.phpunit.de/PHPUnit

Nếu vẫn có lỗi thì hiện tại tôi chưa đoán biết được bạn đang gặp vấn đề gì cả :o)

Bây giờ là lúc bạn cần kiểm tra xem Netbeans bạn đang dùng đã hỗ trợ PHP chưa? Nếu chưa bạn có hai lựa chọn sau:

  1. Tải bản Netbeans hỗ trợ PHP và cài đặt nó: http://netbeans.org/downloads/index.html
  2. Sử dụng công cụ cài đặt plug-in của Netbeans để tìm các plug-in về PHP:

Kiểm thử đơn vị với PHPUnit trên Netbeans

Tham khảo việc làm Tester HOT trên TopDev

Bạn cần cài đủ những plug-in sau:

  1. PHP
  2. Selenium Module for PHP
  3. PHP Documentor Tag Help
  4. PHP Documentor

Những plug-in trên ngoài việc hỗ trợ viết PHP nó còn giúp bạn triển khai Unit Testing ngay trên Netbeans với PHPUnit.

Việc tiếp theo là kiểm tra xem Netbeans đã nhận PHPUnit chưa theo các bước sau: Từ thanh trình đơn của Netbeans > Tools > Options > chọn tab PHP

Kiểm thử đơn vị với PHPUnit trên Netbeans

Mở tiếp sang tab Unit Testing:

Kiểm thử đơn vị với PHPUnit trên Netbeans

Bấm nút Search trong phần PHPUnit Script để Netbeans tự động xác định PHPUnit.

Kiểm thử đơn vị với PHPUnit trên Netbeans

Bấm nút Search trong phần Skeleton Generator Script để Netbeans tự động xác định công cụ sinh ra các mã dành cho Unit Testing.

Kiểm thử đơn vị với PHPUnit trên Netbeans

Sau khi 2 script này được xác định bạn đã sẵn sàng cho những Kiểm thử đơn vị đầu tiên rồi.

Vấn đề lúc này là: bạn đã biết căn bản về PHP chưa? Nếu câu trả lời là chưa! Xin mời bạn tìm hiểu trước về PHP ở loạt bài sau:

  1. Bắt đầu với PHP và CMS
  2. [PHP] Những dòng code đầu tiên
  3. [PHP] Các cấu trúc điều kiện
  4. [PHP]Các cấu trúc lặp
  5. [PHP]Quy ước đặt tên

Hoặc tự tìm hiểu ở những nguồn phong phú hơn như www.php.net hay w3schools.com. Tuy nhiên với những dòng code mà tôi sử dụng dưới đây, bạn không nên lo lắng về trình PHP của mình (chỉ cần bạn đã biết về OOP với JavaC++C#v.v..)

Nếu câu trả lời là OK, chúng ta cùng nhau đi tiếp từ đây.

Bước đầu tiên của công đoạn này, bạn cần tạo một project PHP trên Netbeans, VD project của tôi là DemoPHP:

Kiểm thử đơn vị với PHPUnit trên Netbeans

Kiểm thử đơn vị với PHPUnit trên Netbeans

Kiểm thử đơn vị với PHPUnit trên Netbeans

Kiểm thử đơn vị với PHPUnit trên Netbeans

Giờ ta cần xây dựng một lớp (class) như sau cho project của mình:

Kiểm thử đơn vị với PHPUnit trên Netbeans

Cụ thể trên Netbeans như sau:

Kiểm thử đơn vị với PHPUnit

Bạn nên đưa các class vào một thư mục để tiện quản lý, VD tôi đưa chúng vào thư mục classes:

Kiểm thử đơn vị với PHPUnit trên Netbeans

Đây là code tôi viết cho class này (thực tế phần lớn là do Netbeasn tự sinh ra )

[sourcecode language=”php”]
<?php
/*
** Description of Person
** @author KhoaNV
*/
class Person {
private $name;
private $gender;
private $age;

function __construct($name, $gender, $age) {
$this->name = $name;
$this->gender = $gender;
$this->age = $age;
}

public function getName() {
return $this->name;
}

public function setName($name) {
$this->name = $name;
}

public function getGender() {
return $this->gender;
}

public function setGender($gender) {
$this->gender = $gender;
}

public function getAge() {
return $this->age;
}

public function setAge($age) {
$this->age = $age;
}

public function sayHello($otherName){
throw new Exception("Error!");
}

public function sayGoodbye($otherName){
throw new Exception("Error!");
}
}
?>
[/sourcecode]

Bạn lưu ý là Netbeans hỗ trợ tự động sinh các code căn bản cho một class trong PHP (sử dụng tổ hợp phím Alt+Insert):

Kiểm thử đơn vị với PHPUnit

Tôi chưa vội hoàn chỉnh hàm sayHello và sayGoodbye, vì cái chúng ta đang cần là Unit Testing với PHPUnit và tôi thì thích triển khai nó theo TDD. Do đó, tôi sẽ tạo một test (kiểm thử) cho lớp Person, cụ thể là cho phương thức sayHello. Netbeans với những plug-in mà bạn cài đặt ở trên sẽ dễ dàng giúp bạn tạo ra cái test này. Bạn nên tạo một thư mục để chứa các test, VD tôi đặt thư mục này là tests (cùng thư mục cha với thư mục classes). Mời bạn quan sát hình ảnh sau:

Kiểm thử đơn vị với PHPUnit

Nếu không gặp lỗi gì, bạn sẽ có một lớp mới dùng để test cho lớp Person vừa tạo ở trên:

Kiểm thử đơn vị với PHPUnit

Để đỡ mất tập trung vào các hàm test khác (tự sinh ra bởi công cụ) bạn có thể xóa hết các hàm có trong lớp PersonTest này và chỉ để lại hàm test cho sayHello:

[sourcecode language=”php”]
<?php
/**
* Generated by PHPUnit_SkeletonGenerator 1.2.0 on 2013-03-23 at 15:45:45.
*/
require_once ‘../../classes/Person.php’;

class PersonTest extends PHPUnit_Framework_TestCase {

/**
* @covers Person::sayHello
* @todo Implement testSayHello().
*/
public function testSayHello() {
$this->markTestIncomplete(
‘This test has not been implemented yet.’
);
}

}
[/sourcecode]

Giờ ta cần hoàn chỉnh một test-case để kiểm tra tính đúng đắn của sayHello. Mời bạn xem đoạn code sau:

[sourcecode language=”php”]
<?php
/**
* Generated by PHPUnit_SkeletonGenerator 1.2.0 on 2013-03-23 at 15:45:45.
*/
require_once ‘../../classes/Person.php’;

class PersonTest extends PHPUnit_Framework_TestCase {

/**
* @covers Person::sayHello
* @todo Implement testSayHello().
*/
public function testSayHello() {
$expected = "Hello TapChiLapTrinh. I’m Khoa";
$person = new Person("Khoa", true, 18);

$this->assertEquals($expected, $person->sayHello(‘TapChiLapTrinh’));
}

}
[/sourcecode]

Lưu ý dòng code “require_once ‘../../classes/Person.php’;” dùng để xác định nơi chứa code của lớp mà bạn muốn test. Tôi không hiểu sao nó không được tự động chèn vào? Hiện tôi tự code dòng đó, nếu bạn biết cách nào đó mà không phải làm vậy, xin hãy khai sáng cho tôi.

Bạn hãy chạy thử test-case này để kiểm tra kết quả (nhấp chuột phải vào và chọn Run File hoặc nhấp chuột phải vào lớp Person và chọn Test). Chắc chắn nếu bạn chưa hoàn chỉnh code của hàm sayHello thì bạn sẽ nhận được thông báo như sau:

Kiểm thử đơn vị với PHPUnit

Nếu bạn nhận được thông báo như trên thì bạn đã có tín hiệu vui mừng đầu tiên trong TDD,  “Red: Create a test and make it fail”.

Nào, bây giờ thì chúng ta quay lại để hoàn tất code của hàm sayHello.

[sourcecode language=”php”]
public function sayHello($otherName){
$strTemp = trim($otherName);
if($strTemp!=”){
return "Hello " . $otherName . ". I’m " . $this->name;
}
throw new Exception("Error!");
}
[/sourcecode]

Vòng lại bước chạy test-case xem sao nào? Nếu bạn vẫn nhận được Red, chắc là bạn cần xem lại code của hàm sayHello. Còn với tôi kết quả là như sau:

Kiểm thử đơn vị với PHPUnit

Tôi có thể vui được rồi, vì mình đã hoàn tất khâu tiếp theo trong TDD đó là “Green: Make the test pass by any means necessary”.

Đến đây tôi xin tạm dừng bài viết của mình, tôi nghĩ rằng lúc này bạn đã có thể tự mình triển khai Unit Testing với PHPUnit được rồi :o)

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

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

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

Bật mí 10 câu hỏi phỏng vấn Magento Developer hay và khó

Bật mí 10 câu hỏi phỏng vấn Magento Developer hay và khó

Thương mại điện tử đang phát triển bùng nổ trong thời đại số hóa hiện nay, bạn dễ dàng có thể tìm kiếm bất kỳ sản phẩm nào trên Internet. Sự phổ biến đó phần lớn là nhờ sự phát triển mạnh mẽ của các nền tảng xây dựng website thương mại điện tử và Magento là một đại diện tiêu biểu trong đó. Lập trình website e-commerce dựa trên nền tảng Magento đang là một công việc hấp dẫn hiện nay với nhu cầu khá lớn, bài viết hôm nay chúng ta cùng nhau tìm hiểu top 10 câu hỏi phỏng vấn Magento Developer thường gặp nhé.

Câu 1: Website thương mại điện tử là gì?

Website thương mại điện tử là gì?

E-commerce (Electronic commerce) hay Thương mại điện tử chỉ việc các công ty, cá nhân thực hiện việc kinh doanh thông qua Internet. Thương mại điện tử chú trọng đến việc mua bán trực tuyến, cho phép các doanh nghiệp kết nối hệ thống dữ liệu bên trong và bên ngoài một cách hiệu quả và linh hoạt; hợp tác chặt chẽ hơn với các nhà cung cấp và đối tác, qua đó có thể thỏa mãn tốt hơn nhu cầu và sự mong đợi của khách hàng.

Website thương mại điện tử là trang thông tin điện tử được thiết lập để phục vụ một phần hoặc toàn bộ quy trình của hoạt động thương mại điện tử từ mua bán hàng hóa, cung ứng dịch vụ, giới thiệu sản phẩm, kết hợp thanh toán và các dịch vụ sau bán hàng khác. Chức năng của một website E-commerce bao gồm cả việc giúp người bán (cung cấp dịch vụ) dễ dàng quản lý nhiều thành phần của quy trình bán hàng trực tuyến, cung cấp trải nghiệm mua sắm tối ưu cho khách hàng.

Câu 2: Magento là gì?

Magento là một nền tảng thương mại điện tử mã nguồn mở được viết bằng ngôn ngữ lập trình PHP. Magento được viết dựa trên nền tảng Zend Framework, phát hành lần đầu từ năm 2008 và hiện đang là sở hữu của Adobe Inc.

Magento cung cấp cho người dùng 2 phiên bản gồm: 

  • Magento Open Source: bản miễn phí dành cho cộng đồng – trước đây gọi là Community Edition (CE) 
  • Magento Commerce: bản trả phí dành cho doanh nghiệp sử dụng với các tính năng nâng cấp và cải tiến – trước đây gọi là Enterprise Edition

Theo thống kê hiện nay có hơn 100.000 website thương mại điện tử được phát triển bằng nền tảng này với 2.5 triệu lượt tải về Magento từ người dùng. 

  Hướng dẫn viết code PHP chuẩn – PSR tiêu chuẩn khi lập trình PHP

  Chuẩn coding convention trong PHP với PSR

Câu 3: Những tính năng chính của Magento

Những tính năng chính của Magento

Những tính năng chính của Magento Open Source – phiên bản miễn phí của Magento bao gồm:

  • Tính năng quản lý toàn bộ website trong hệ thống thương mại điện tử Magento
  • Tính năng quản lý danh mục sản phẩm, sản phẩm, quản lý tồn kho
  • Tính năng quản lý khách hàng, các dịch vụ khách hàng liên quan
  • Tính năng quản lý bán hàng và hỗ trợ bán hàng như checkout, thanh toán, vận chuyển
  • Tính năng hỗ trợ tiếp thị, quảng cáo, cho phép tích hợp các dịch vụ bên thứ 3
  • Tính năng phân tích và báo cáo dựa trên số liệu hoạt động
  • Tính năng tối ưu hóa tìm kiếm trên các search engine (SEO)
  • Hỗ trợ đa ngôn ngữ, đa tiền tệ cùng các hỗ trợ về thuế

Ở bản trả phí, Magento còn cung cấp nhiều tính năng hỗ trợ chuyên biệt và hữu ích, ngoài ra chúng ta cũng có thể tìm kiếm các plugins hỗ trợ khác trên các marketplace của Magento.

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

Câu 4: Giải thích kiến trúc của Magento

Magento áp dụng các quy ước về lập trình hướng đối tượng và sử dụng kiến trúc MVC (Model-View-Controller) kết hợp mô hình EAV (Entity-Attribute-Value) trong việc lưu trữ dữ liệu.

Kiến trúc Magento bao gồm các thành phần:

  • User Request: tiếp nhận các yêu cầu được gửi đến máy chủ
  • View: là các lớp định nghĩa cách thức trình bày dữ liệu hay nói cách khác là giao diện người dùng
  • Controller: lớp điều khiển luồng ứng dụng
  • Model: lớp cung cấp dữ liệu và logic của dữ liệu
  • Database: cơ sở dữ liệu
  • WSDL: Web Services Description Language – ngôn ngữ mô tả dịch vụ Web để mô tả các dịch vụ và cách sử dụng

Câu 5: Trình bày cấu trúc module trong Magento

Một module trong Magento bao gồm các thành phần chính sau:

  • block: là nơi để load dữ liệu, điều chỉnh dữ liệu từ database trước khi hiển thị
  • controller: nhận yêu cầu từ người dùng qua http request sau đó chuyển yêu cầu tới các lớp xử lý
  • etc: chứa các files xml để config module
  • helper: hỗ trợ giải thích các chức năng trong hệ thống
  • sql: sử dụng để cập nhật, tạo bảng dữ liệu và đưa ra các điều chỉnh về dữ liệu
  • model: nơi viết các câu lệnh truy vấn đối với cơ sở dữ liệu

Câu 6: Nền tảng kỹ thuật của Magento gồm những gì?

Để lập trình Magento, lập trình viên sử dụng ngôn ngữ lập trình PHP version 5.4+ (trở lên). Magento được viết dựa trên Zend Framework. Từ phiên bản Magento version 2, chúng ta có thể sử dụng Require JS để module hóa source code viết bằng JavaScript cho việc chỉnh sửa, thiết kế giao diện người dùng và logic phía Frontend. Về phía server, Magento sử dụng cơ sở dữ liệu quan hệ MySQL hoặc MariaDB; phiên bản hỗ trợ MySQL là từ MySQL 5.1 trở lên. 

Magento yêu cầu chạy trên nền Web Service Apache 2.4 hoặc Nginx 1.x. Phiên bản Magento mới nhất sử dụng một số công nghệ Web phổ biến hiện nay như Redis, Varnish, Elasticsearch, RabbitMQ,…

Câu 7: Liệt kê các loại sản phẩm trong Magento

Magento cung cấp sẵn 6 loại sản phẩm bao gồm:

  • Simple Products: sản phẩm thường, là nền tảng cơ bản cho các loại sản phẩm khác.
  • Grouped Products: sản phẩm theo nhóm, chứa 1 vài sản phẩm thường.
  • Configurable Products: sản phẩm tùy biến, có thể tùy chỉnh được các giá trị thuộc tính.
  • Virtual Products: sản phẩm ảo, ví dụ như thẻ thành viên, gói bảo hành,… sẽ không có 1 vài thuộc tính mặc định của sản phẩm như cân nặng, tùy chọn giao hàng,…
  • Bundle Products: Set sản phẩm tùy chọn, xử lý các sản phẩm thành combo (các sản phẩm có thể được chọn chứ không cố định như grouped).
  • Downloadable Products: sản phẩm tải xuống được, có thể tải về dạng file, tệp như eBook, video, phần mềm,…

Câu 8: Vòng đời của một đơn hàng trong Magento

Đơn hàng (Orders) trong Magento có vòng đời giống với thực tế, cụ thể gồm những trạng thái dưới đây:

  • New Orders: đơn hàng mới – khách hàng đặt hàng trên một cửa hàng của Magento.
  • Pending: đơn hàng trạng thái chờ xử lý – một đơn hàng được khách hàng submit thì sẽ chuyển sang trạng thái này để chờ người bán thực hiện các hành động tiếp theo.
  • Pending PayPal: đơn hàng mới và chưa được thanh toán qua PayPal.
  • Processing: khi người bán thực hiện lập hóa đơn cho đơn hàng, đơn hàng sẽ chuyển sang trạng thai đang xử lý.
  • Cancelled: khi khách hàng có yêu cầu hủy đơn thì đơn hàng sẽ chuyển sang trạng thái này.
  • Order Shipped: Đơn hàng đã xử lý và đang được vận chuyển.
  • On Hold: đơn hàng tạm dừng do cần thêm thông tin từ khách hàng trước khi giao dịch mua được xử lý.
  • Complete: đơn hàng hoàn thành, đã lập hóa đơn, vận chuyển bàn giao xong đến người dùng.

Câu 9: Công việc của một Magento Developer là gì?

Giống như nhiều các platform khác, lập trình viên Magento thông thường chia thành 3 vị trí bao gồm:

  • Frontend – xây dựng UI: phát triển, tích hợp hoặc đưa ra các tùy biến về theme, giao diện.
  • Tùy biến chức năng: sử dụng ngôn ngữ lập trình PHP, kết hợp với kiến thức và kỹ thuật dành cho Magento để xử lý thay đổi phần core nhằm tùy biến chức năng phù hợp với mô hình kinh doanh trong thực tế của khách hàng. Ngoài ra chúng ta còn có thể tạo ra các extensions giải quyết một số bài toán nhỏ cụ thể, áp dụng cho hệ thống đồng thời phát hành lên các chợ chính thức của Magento.
  • Thiết lập, tối ưu hệ thống: khởi tạo, import (hoặc hỗ trợ việc import) các danh mục, sản phẩm, thông tin khách hàng,… Trong quá trình vận hành, nếu có sự cập nhật đến từ Magento thì hỗ trợ người dùng cập nhật bản mới, đồng thời điều chỉnh hiệu suất thực thi (performance tuning) cho hệ thống.

Câu 10: Kể tên một số extensions phổ biến cho Magento

  • Shipworks: hỗ trợ vận chuyển đơn hàng.
  • Zopim Live Chat: tính năng trò chuyện trực tiếp trên website.
  • Fontis SecurePay: giải pháp hỗ trợ bảo mật thanh toán.
  • Magic Zoom: hỗ trợ preview ảnh sản phẩm qua việc zoom, hover trên nhiều loại màn hình khác nhau.
  • SEO Hub: hỗ trợ SEO website qua việc cập nhật thông tin meta, chuẩn hóa URLs,…
  • Language Translator: hỗ trợ dịch tự động nội dung website sang các ngôn ngữ khác nhau.

Kết bài

Như vậy chúng ta đã cùng đi qua top 10 câu hỏi phỏng vấn vị trí tuyển dụng Magento Developer thường gặp, hy vọng bài viết này hữu ích dành cho những ai đang có nhu cầu tìm kiếm một vị trí trong ngành này. Hẹn gặp lại các bài 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 các vị trí IT hấp dẫn trên TopDev

Tự do và khám phá: Adhoc testing vs Exploratory testing

Tự do và khám phá: Adhoc testing vs Exploratory testing

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

Vẫn là chủ đề lý thuyết nhàm cmn chán, nhưng mà vẫn phải học :v. Học rồi còn đi áp dụng, và trên thực tế là mình đã và đang sử dụng 2 loại này rồi nhé – không đùa tí nào :v. Bây giờ vấn đề là gõ lại cho nhớ và luyện khả năng diễn giải các ý cho dễ hiểu nữa. Về hai loại này theo mình có một vài điểm cần nhớ, chi tiết đọc tiếp nội dung phía dưới nha. Hi vọng bài viết sẽ giúp ích cho các bạn.

1. Adhoc testing

Adhoc testing là một loại kiểm thử không chính thức, với mục đích là tìm các “điểm chết” của hệ thống. Loại kiểm thử này thường không có kế hoạch thực hiện tức là bạn sẽ không cần tuân theo một kỹ thuật thiết kế test design nào để tạo test case cả.

Và thực tế là chúng ta cũng sẽ không tạo và làm theo test case nào hết! Do đó, loại kiểm thử này yêu cầu rất cao về mức độ hiểu hệ thống của người thực hiện kiểm thử. Và tester sẽ thực hiện kiểm thử ứng dụng một cách ngẫu nhiên các trường hợp mà không sử dụng một tài liệu test case hay mô tả nghiệp vụ nào.

Adhoc testing không yêu cầu các tài liệu, kế hoạch hay quy trình. Vì mục đích của loại kiểm thử này là tìm lỗi thông qua hướng tiếp cận ngẫu nhiên, vì không dựa theo bất kỳ tài liệu nào, nên các lỗi tìm thấy sẽ không được ánh xạ tới các test case tương ứng như bình thường. Vì thế mà đôi khi sẽ rất khó để tái hiện lại lỗi.

Khi nào thì sử dụng Adhoc testing?

Adhoc testing có thể được thực hiện khi có một thời gian giới hạn nào đó cho các kiểm thử phức tạp. Thông thường Adhoc testing được thực hiện sau khi đã hoàn thành việc thực thi kiểm thử theo đúng quy trình.

Nếu như có thời gian, thì có thể hoàn thành thực hiện Adhoc testing cho hệ thống. Adhoc testing sẽ hiệu quả hơn nếu người thực thi kiểm thử có kiến thức tốt về hệ thống đó.

  Unit Testing trong phát triển phần mềm hiện đại

  So Sánh Giữa Regression Testing Và Retesting

Thực hiện Adhoc testing hiệu quả:

* Nắm chắc nghiệp vụ

Yếu tố then chốt quyết định phần lớn hiệu quả trong Adhoc testing đó là việc người thực thi kiểm thử hiểu nghiệp vụ của hệ thống đến đâu. Do đó, khi quyết định thực hiện Adhoc testing thì cần phải chắc chắc được rằng bạn đã thông suốt về các ngõ ngách của hệ thống, ứng dụng. Điều này giúp bạn có thể dễ dàng thực hiện được những trường hợp thực tế nhất, và có thể đoán được các vùng có khả năng xảy ra lỗi nhiều nhất.

* Kiểm tra các module chính

Cần xác định các chức năng quan trọng chính của hệ thống là đối tượng tập trung của Adhoc testing. Vì sao lại thế, đơn giản thôi vì chức năng chính quan trọng chính là cái mà người dùng sẽ sử dụng và tương tác nhiều nhất, thế mà lại để lọt lỗi trên đó thì sẽ là điều khó mà chấp nhận được!

* Lưu lại các defect

Tất cả các lỗi tìm được từ Adhoc testing đều cần phải được lưu lại và gửi cho team dev để fix bug. Các lỗi hợp lệ cần được viết bổ sung và thêm vào trong bộ test case. Cái này thường là do viết test case thiếu, chưa bao phủ được các trường hợp.

Các defect tìm được này chính là những bài học kinh nghiệm, cần phải được xem xét và đánh giá nghiêm túc, rút kinh nghiệm cho các vòng test sau hay những trường hợp, sản phẩm có tính năng tương tự.

Xem thêm các vị trí tuyển Tester lương cao trên TopDev

2. Exploratory testing

Exploratory testing, bao gồm các hoạt động khám phá, tìm hiểu và học hỏi. Chủ yếu nhấn mạnh vào khả năng kiểm thử tự do, đi kèm với trách nhiệm của người kiểm thử.

Trong Exploratory testing, các test case cũng không được tạo ra khi tiến hành kiểm thử. Tuy nhiên là ta có thể ghi ra một vài ý tưởng chính sẽ được thực hiện trước khi bắt tay vào làm. Exploratory testing tập trung vào việc thăm dò khám phá ứng dụng hơn việc thực thi dựa trên các hoạt động như các loại kiểm thử khác.

* Ưu điểm

  • Loại kiểm thử này sẽ rất hữu ích trong trường hợp các tài liệu yêu cầu chưa được cung cấp đầy đủ hoặc có rất ít thông tin.
  • Liên quan đến quá trình tìm hiểu, giúp tìm ra được nhiều lỗi hơn so với các bước kiểm thử thông thường.
  • Tìm ra được các lỗi nhỏ mà có thể bị bỏ qua bởi các kỹ thuật kiểm thử khác
  • Mở rộng khả năng tưởng tượng các tình huống bằng cách thực hiện nhiều hơn các trường hợp kiểm thử.
  • Đi sâu vào các phần chức năng nhỏ nhất của ứng dụng và bao phủ được các yêu cầu chức năng
  • Loại kiểm thử này bao phủ được nhiều loại kiểm thử và nhiều loại các kịch bản và trường hợp kiểm thử khác nhau.
  • Khuyến khích sự sáng tạo và khả năng phán đoán
  • Có thể tạo ra các ý tưởng mới trong quá trình thực hiện kiểm thử.

* Nhược điểm

  • Loại kiểm thử này phụ thuộc rất nhiều vào kỹ năng của người thực hiện kiểm thử
  • Do đó, sẽ dễ bị hạn chế bởi vùng kiến thức của tester
  • Không phù hợp với dự án có nhiều thời gian cho việc thực thi kiểm thử.

Khi nào thì thực hiện Exploratory testing?

Có thể thực hiện Exploratory testing nếu như:

  • Nhóm kiểm thử có những tester nhiều kinh nghiệm
  • Early iteration is required (Dự án có yêu cầu lặp sớm)
  • Đây là một ứng dụng quan trọng
  • Hoặc có những tester mới tham gia vào nhóm.

3. So sánh nho nhỏ giữa Adhoc testing và Exploratory testing

Adhoc testing Exploratory testing
Bạn cần phải hiểu và nắm được ứng dụng trước khi thực hiện Adhoc testing. Với Exploratory testing thì bạn sẽ tìm hiểu ứng dụng trong khi thực hiện test.
Với Adhoc testing, tài liệu không phải là yếu tố quan trọng cần thiết, Adhoc testing được thực hiện bình thường mà không cần tài liệu đặc tả cụ thể nào. Ngược lại, với Exploratory testing, tài liệu là một yếu tố cần thiết để ghi lại chi tiết các thông tin trong khi thực hiện kiểm thử.
Adhoc được thực hiện để nâng cao mức độ hoàn thiện hướng tới sự hoàn hảo của việc kiểm thử ứng dụng. Exploratory testing thiên về hướng học hỏi, tìm hiểu ứng dụng hơn.
Người thực hiện Adhoc testing cần có kiến thức về quy trình thực hiện khi thực hiện kiểm thử. Với Exploratory testing thì từ đây sẽ giúp cho người thực thi có kiến thức về ứng dụng thông qua các kết quả test.

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

Xem thêm:

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

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