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.
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.
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.
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.
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ó.
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 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%.
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.
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.
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!
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
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.
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
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.
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
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)
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.
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
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)
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
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.
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:
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.
Mã Hóa và Bảo Mật Thông Tin: Kỹ thuật mã hóa và giải mã dữ liệu.
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.
Phân Tích và Quản Lý Rủi Ro: Đánh giá và quản lý rủi ro bảo mật.
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.
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 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;…
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!
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
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ì?
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.
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
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.
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.
Để 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.
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.
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!
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ả?”.
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++
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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 đủ)
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.
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
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.
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 – 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
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ã JavaScript và HTML 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.
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 +)
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.
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.
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.
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:
Giờ ta cần xây dựng một lớp (class) như sau cho project của mình:
Cụ thể trên Netbeans như sau:
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:
Đâ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):
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:
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:
Để đỡ 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:
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:
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)
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ì?
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.
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.
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.
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 đó.
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.
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à 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ả.
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
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.
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.
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.
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.
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:
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.
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.
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:
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ể
Có
Có
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
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á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ư: Phpmailer, PHPExcel, Ddoctrine,… 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.
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,…
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à có, 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.
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 choFlutter Developer thường gặp nhé.
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à 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.
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
Câu 4: 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
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.
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.
Đâ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.
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!
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!
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:
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 được sự cho phép của tác giả Nguyễn Hữu Khanh
1. Phân cấp thừa kế
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.
StringBuffer, StringBuilder 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.
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.
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ớ.
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:
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.
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.
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);
}
}
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.
// ==&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);
}
}
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) // ==> chú ý (ở trên)
StringBuffer insert(int offset, type arg) // ==> 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
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 đượ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.
Để 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ế.
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?
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.
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.
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,…
Đâ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.
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.