Bài viết được sự cho phép của tác giả Trần Hữu Cương
Trong bài này mình sẽ thực hiện tạo Project Java bằng Gradle trên giao diện dòng lệnh, các bạn có thể thực hiện bằng cmd/powershell trên windows hoặc terminal trên linux.
Hướng dẫn tạo Gradle Project Java bằng dòng lệnh cmd
Đầu tiên tạo folder chứa Project, ví dụ mình tạo folder GradleHello sau đó di chuyển tới folder vừa tạo
Để tạo project gradle ta dùng lệnh gradle init
Sau khi chạy lệnh gradle init, nó sẽ hiện ra danh sách các loại project. Để tạo project Java thì các bạn chọn java-application
Các câu hỏi sau đó thì các bạn có thể bỏ qua (để nó chọn mặc định – default) bằng cách ấn enter
Kết quả project GradleHello được tạo ra như sau:
Trong đó:
folder gradle dùng để wrapper các file
folder src/main/java chứa mã nguồn java
folder src/test/java là folder chứa các file test java
file settings.gradle dùng để thiết lập các thông tin của project như tên project
/* * This file was generated by the Gradle 'init' task. * * The settings file is used to specify which projects to include in your build. * * Detailed information about configuring a multi-project build in Gradle can be found * in the user manual at https://docs.gradle.org/5.4/userguide/multi_project_builds.html */rootProject.name = 'GradleHello'
file build.gradle chứa thông tin cấu hình gradle như plugin, repository, dependency…
Ví dụ mainClassName = 'GradleHello.App' tức là khi chạy project nó sẽ chạy file App.java trong package GradleHello
plugins { // Apply the java plugin to add support for Java id 'java' // Apply the application plugin to add support for building an application id 'application'}repositories { // Use jcenter for resolving your dependencies. // You can declare any Maven/Ivy/file repository here. jcenter()}dependencies { // This dependency is found on compile classpath of this component and consumers. implementation 'com.google.guava:guava:27.0.1-jre' // Use JUnit test framework testImplementation 'junit:junit:4.12'}// Define the main class for the applicationmainClassName = 'GradleHello.App'
Vị trí Product Owner xuất hiện phổ biến trong lĩnh vực công nghệ thông tin hiện nay với việc các dự án áp dụng phương pháp phát triển phần mềm linh hoạt Agile. Cũng vì thế mà đây trở thành một vị trí mà nhiều công ty ưu tiên tuyển dụng với các chế độ đãi ngộ cao. Hôm nay chúng ta cùng nhau tìm hiểu về những câu hỏi phỏng vấn dành cho Product Owner thường gặp để chuẩn bị tốt nhất chinh phục các nhà tuyển dụng nhé.
Product Owner là gì?
Product Owner (gọi tắt là PO) hay người “sở hữu” sản phẩm là người chịu trách nhiệm giải quyết những vấn đề liên quan đến sản phẩm được người dùng đưa ra khi sử dụng sản phẩm đó. PO được xem như là người đại diện cho khách hàng để làm việc với team phát triển, có quyền thay đổi thứ tự công việc, độ ưu tiên các tính năng của sản phẩm trong quá trình phát triển dự án.
Product Owner phải là người kết nối được với các bên liên quan đến sản phẩm để xác định được yêu cầu, kỳ vọng mà sản phẩm đáp ứng cũng như đảm bảo lợi nhuận từ sản phẩm với mức đầu tư; từ đó giải thích, giải đáp các thắc mắc cho team phát triển để họ có thể hiểu rõ hơn về tính năng mà sản phẩm sẽ có, khách hàng kỳ vọng.
Khác với vai trò là một khách hàng trong các mô hình phát triển phần mềm truyền thống, với mô hình Agile, PO sẽ tham gia trực tiếp vào quá trình xây dựng, phát triển sản phẩm. PO thường xuyên gặp và ngồi cùng team phát triển để giải thích về tính năng, theo dõi tiến độ cũng như nghiệm thu các giai đoạn sản phẩm từ team phát triển. Hơn thế, PO còn có thể nhận tư vấn từ team phát triển và lựa chọn phương án thiết kế hay điều chỉnh tính năng một cách phù hợp. Và quan trọng nhất, PO chính là người chịu trách nhiệm cao nhất đối với bất cứ sự thành công hay thất bại của một sản phẩm.
Công việc của một Product Owner là gì?
Là người “sở hữu” sản phẩm, công việc của một Product Owner xoay quanh việc định hình sản phẩm bằng cách kết nối với các stakeholder và phát triển, xây dựng, tạo ra một sản phẩm thành công. Cụ thể:
Tìm hiểu, phân tích và định hướng phát triển sản phẩm trong tương lai
Xác định, quản lý các tính năng mong muốn trong Product Backlog
Tối ưu hóa lợi nhuận trên vốn đầu tư
Đánh giá và điều chỉnh tiến độ dự án phù hợp
Kết nối giữa các Stakeholders
Truyền đạt thông tin, yêu cầu đầy đủ về sản phẩm đến nhóm phát triển
Tham gia họp cùng team phát triển, theo dõi tiến độ của sản phẩm
Chịu trách nhiệm về các vấn đề xảy ra liên quan đến đầu ra của sản phẩm hay tiến độ phát triển của sản phẩm với các nhà đầu tư hay các bên liên quan(Stakeholders)
Có những loại Stakeholder nào và làm sao để quản lý các Stakeholder
Stakeholder là một cá nhân, nhóm người hoặc một tổ chức bị ảnh hưởng bởi kết quả của dự án hay có thể là người đóng góp trực tiếp từ bên trong dự án. Thông thường có 2 loại stakeholders:
Internal Stakeholders: những người trong nội bộ tổ chức như nhân viên, ban lãnh đạo, quản lý dự án, nhà đầu tư,… Là những người trực tiếp tham gia dự án, là dự án của họ hoặc họ được thuê để làm.
External Stakeholders: là những người nằm ngoài tổ chức, gián tiếp bị ảnh hưởng bởi dự án như các nhà cung cấp, khách hàng, bên thứ 3, đối thủ,….
Để quản lý các Stakeholders thì chúng ta áp dụng 4 bước như dưới đây:
Xác định các Stakeholders
Lên kế hoạch về sự tham gia, đóng góp của Stakeholders
Phân biệt vai trò của Product Owner và Scrum Master
Scrum Master (SM) là một vị trí trong khung quản lý dự án Scrum (một phương pháp Agile). Vai trò của SM và PO trong dự án Scrum khá là khác nhau và hỗ trợ cho nhau để phát triển, quản lý dự án.
Cụ thể:
Về mục tiêu: SM sẽ là người đảm bảo dự án được quản lý, phát triển theo đúng mô hình Agile/Scrum nhằm đạt hiệu suất trong team phát triển một cách tốt nhất. Trong khi đó PO có mục tiêu liên quan trực tiếp đến chất lượng sản phẩm của dự án. Như vậy cũng có thể nói rằng mục tiêu của PO đạt được chỉ khi SM cũng hoàn thành được mục tiêu của mình.
Về nhiệm vụ: SM cũng là một thành viên của team phát triển có nhiệm vụ lập kế hoạch triển khai dự án theo khung Scrum; còn nhiệm vụ của PO là đảm bảo chất lượng đầu ra sản phẩm theo đúng định hướng, tối ưu hóa giá trị và lợi nhuận của dự án.
Về kỹ năng: SM tất nhiên sẽ phải là người nắm vững kiến thức về Agile/Scrum đồng thời là cách tổ chức và triển khai dự án theo khung Scrum. PO là người cần phải làm việc với nhiều bên, vì thế kĩ năng đàm phán và giao tiếp là những kỹ năng quan trọng nhất. Ngoài ra PO sẽ thường là người đưa ra các quyết định, trong khi SM là người giúp một team tổ chức đưa ra quyết định.
Project Manager hay PM là người quản lý dự án với nhiệm vụ chính là quản lý các bộ phận trong dự án xây dựng và phát triển sản phẩm. Mục tiêu trọng tâm của một PM là làm sao để dự án hoàn thành đúng thời hạn, trong phạm vi chi phí đã lên kế hoạch đảm bảo đầu ra để khách hàng (hoặc PO) có thể nghiệm thu. PM sẽ là người làm việc với PO một cách chặt chẽ nhất để có thể lấy được yêu cầu chính xác từ PO cũng như là người cập nhật tình hình tiến độ của sản phẩm và các vấn đề liên quan đến team phát triển.
Ngoài PM và PO thì chúng ta còn có một vị trí nữa là Product Manager – người quản lý sản phẩm. Product Manager là người chịu trách nhiệm trong việc kết nối, dẫn dắt các bộ phận hoặc quy trình để tạo ra sản phẩm; đồng thời cũng là người đưa ra chiến lược về sản phẩm từ giai đoạn lên kế hoạch, phát triển và phát hành sản phẩm. So với PO thì Product Manager tập trung nhiều hơn vào tầm nhìn của sản phẩm, đưa ra các chiến lược dài hạn, xác định các cơ hội mới, xu hướng thị trường để có thể cải tiến được sản phẩm.
Có nhiều tổ chức sẽ gộp 2 vị trí Product Manager và Product Owner vào chung, nó phù hợp với quy mô của công ty vừa và nhỏ, ít sản phẩm hay các sản phẩm liên quan chặt chẽ đến nhau.
Những chứng chỉ cần có dành cho Product Owner
Những chứng chỉ Product Owner giá trị và được đánh giá cao bởi nhiều tổ chức bao gồm:
Professional Scrum Product Owner (PSPO) I, II và III: đây là chứng chỉ được cấp bởi tổ chức Scrum.org
Scrum Alliance Certified Product Owner (CSPO): chứng chỉ được công nhận bởi Scrum Alliance
Certified SAFe Product Manager/Product Owner (POPM): chứng chỉ do Scaled Agile Framework cung cấp
Định hướng phát triển của Product Owner trong tương lai
Product Owner có khá nhiều định hướng nghề nghiệp do đặc thù của vị trí này cần những kĩ năng khác nhau từ cả quản lý, điều hành đến hiểu biết về sản phẩm và thị trường. Trong câu hỏi này, nhà tuyển dụng sẽ muốn hỏi về định hướng tương lai của bạn sau khi trải qua vị trí Product Owner, một số định hướng về vị trí sau đây bạn có thể lựa chọn:
Business Analyst: PO là những người thường xuyên làm việc với khách hàng và cần có những kiến thức nhất định về kinh doanh. Vì vậy trở thành nhà phân tích kinh doanh là một hướng đi tiềm năng nhất là với các bạn có sở thích về mảng Business.
Project Manager: trở thành một quản lý dự án lớn cũng là một lựa chọn dành cho bạn có năng lực tốt, kỹ năng quản lý phù hợp. PM sẽ đảm nhiệm vai trò lập kế hoạch và quản lý dự án một cách rõ ràng hơn, ngoài ra quản trị con người cũng là một yếu tố để bạn phấn đấu.
Product Manager: Nếu bạn muốn đi theo hướng sản phẩm, xây dựng một sản phẩm hay hệ sinh thái sản phẩm có dấu ấn của riêng mình thì trở thành người quản lý sản phẩm là một hướng đi dành cho bạn.
Giám đốc điều hành (CEO): PO có đủ phẩm chất từ quản lý đến tố chất lãnh đạo để trở thành một CEO tương lai nếu bạn mong muốn.
Kết bài
Product Owner luôn có vai trò rất quan trọng quyết định đến sự thành công của một sản phẩm, một dự án; vì thế cuộc phỏng vấn cho vị trí này sẽ đòi hỏi chúng ta cần thể hiện được nhiều kĩ năng chuyên môn cũng như cả kỹ năng mềm trong xử lý tình huống. Hy vọng bài viết này mang lại cho bạn chút tự tin để hoàn thành buổi phỏng vấn của mình. Hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.
Với sự phát triển nhanh chóng của công nghệ và nhu cầu sử dụng phần mềm ngày càng tăng, số lượng của các ngôn ngữ lập trình theo đó cũng tăng lên không ngừng. Vậy đâu là những ngôn ngữ lập trình phổ biến nhất? Đặc điểm của những ngôn ngữ lập trình đó là gì? Bài viết này, TopDev sẽ giới thiệu bạn Top 15 ngôn ngữ trình được sử dụng nhiều nhất và lý do tại sao chúng lại được ưa chuộng như vậy.
Ngôn ngữ lập trình là gì?
Ngôn ngữ lập trình (tiếng Anh: Programming Language) là một phương tiện mà các lập trình viên sử dụng để giao tiếp với máy tính. Nó là một tập hợp các quy ước, cú pháp đặc biệt được sử dụng để tạo ra các chương trình máy tính.
Hay nói đơn giản, ngôn ngữ lập trình là dạng “ngôn ngữ” mà con người có thể hiểu được (human code), sau đó được biên dịch thành mã máy (machine code) bởi trình biên dịch để giao tiếp với các thiết bị công nghệ số.
Các ngôn ngữ lập trình khác nhau có thể được sử dụng để phát triển các loại phần mềm khác nhau, từ các ứng dụng di động, trang web cho đến phần mềm máy tính và các hệ thống nhúng. Những ngôn ngữ lập trình càng phổ biến thì càng có nhiều người sử dụng và đóng vai trò quan trọng trong việc phát triển các sản phẩm công nghệ.
Lịch sử hình thành và phát triển của ngôn ngữ lập trình
Ngôn ngữ lập trình có lịch sử phát triển gắn liền với sự ra đời của máy tính. Vào những năm 1800, Charles Babbage đã phát minh ra mô hình máy tính đầu tiên, và Ada Lovelace đã viết chương trình đầu tiên cho máy tính này.
Trong những năm 1940 và 1950, các ngôn ngữ lập trình đầu tiên như Fortran, Algol, và Lisp ra đời, phục vụ cho tính toán khoa học và điều khiển thiết bị. Đến thập niên 1960, COBOL xuất hiện, trở thành ngôn ngữ phổ biến trong các ứng dụng kinh doanh.
Thập niên 1970 đánh dấu sự ra đời của ngôn ngữ C, một ngôn ngữ nền tảng cho nhiều ngôn ngữ hiện đại. Trong những năm 1990, Java và Python ra mắt, cùng với sự phát triển mạnh mẽ của lập trình web với các ngôn ngữ như PHP và JavaScript.
Ngày nay, ngôn ngữ lập trình tiếp tục phát triển để đáp ứng các nhu cầu công nghệ mới như trí tuệ nhân tạo và Internet of Things (IoT).
Thành phần và cấu trúc của ngôn ngữ lập trình
Hiểu rõ các thành phần cấu trúc của một ngôn ngữ lập trình là điều cần thiết để lập trình viên sử dụng ngôn ngữ một cách hiệu quả. Dưới đây là các thành phần chính:
Bộ ký tự (Character set)
Bộ ký tự của một ngôn ngữ lập trình bao gồm các ký tự và biểu tượng cần thiết để tạo nên mã nguồn. Điều này bao gồm các chữ cái, số, toán tử, từ khóa, ký hiệu đặc biệt và khoảng trắng. Mỗi ngôn ngữ lập trình có một bộ ký tự riêng biệt, phù hợp với cú pháp và cách thức hoạt động của nó.
Cú pháp (Syntax)
Cú pháp (syntax) là tập hợp các quy tắc xác định cách sắp xếp và cấu trúc các thành phần trong một chương trình. Nó giúp developer viết code đúng syntax và không có lỗi cú pháp. Các quy tắc cú pháp bao gồm cách đặt tên biến, định nghĩa hàm, sử dụng câu lệnh điều khiển,… Việc code đúng cú pháp là bắt buộc để chương trình có thể chạy đúng cách.
Ngữ nghĩa (Semantics)
Ngữ nghĩa liên quan đến ý nghĩa và mục đích của các câu lệnh, biểu thức và cấu trúc mã trong ngôn ngữ lập trình. Ngữ nghĩa được xác định bởi các quy tắc lập trình và cú pháp của ngôn ngữ. Hiểu ngữ nghĩa là điều quan trọng để phát triển và duy trì các ứng dụng phần mềm chất lượng cao.
Các thành phần này tạo nên nền tảng cho việc viết mã và phát triển ứng dụng trong bất kỳ ngôn ngữ lập trình nào.
Top 15 ngôn ngữ lập trình phổ biến nhất hiện nay
Dưới đây là danh sách top 16 ngôn ngữ lập trình phổ biến nhất hiện nay (Update August 2024) – nguồn TIOBE Programming Community
Python
Đứng đầu trong danh sách các ngôn ngữ lập trình phổ biến nhất năm 2024 chính là Python. Đây là một ngôn ngữ lập trình mã nguồn mở, được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau, từ khoa học dữ liệu, trí tuệ nhân tạo, phát triển web, đến quản lý hệ thống và giáo dục.
Python được thiết kế để có cú pháp rõ ràng và dễ đọc, giúp các lập trình viên dễ dàng hiểu và thao tác với mã nguồn. Nó cũng được tích hợp với nhiều thư viện và framework phổ biến như Pandas, Django và Flask, giúp cho việc phát triển các ứng dụng trở nên dễ dàng hơn và nhanh chóng hơn.
Đặc biệt, Python còn là một trong những ngôn ngữ lập trình được sử dụng nhiều nhất trong lĩnh vực trí tuệ nhân tạo, với các thư viện như TensorFlow và PyTorch giúp cho việc phát triển các mô hình học máy và deep learning trở nên dễ dàng hơn. Tuy vậy, Python còn hoạt động khá chậm do hoạt động với trình thông dịch.
C
Mặc dù đã ra đời từ lâu, C vẫn giữ vững vị trí của mình trong top các ngôn ngữ lập trình phổ biến nhờ vào sự đơn giản, hiệu quả và khả năng kiểm soát phần cứng chặt chẽ. Nhiều ngôn ngữ lập trình hiện đại như C++, C#, Java, và Python đều chịu ảnh hưởng sâu sắc từ C, thậm chí nhiều trình biên dịch, hệ điều hành, và các phần mềm hiệu suất cao khác cũng được viết bằng C.
C cho phép lập trình viên tương tác trực tiếp với phần cứng, quản lý bộ nhớ và điều khiển luồng dữ liệu một cách chi tiết. Điều này làm cho C trở thành lựa chọn lý tưởng cho các ứng dụng yêu cầu hiệu suất cao, chẳng hạn như hệ điều hành, trình biên dịch, và các phần mềm nhúng.
C là ngôn ngữ lập trình đầu tiên mà nhiều lập trình viên học vì nó là nền tảng của nhiều hệ thống và là ngôn ngữ quan trọng cho các kỹ sư phần mềm, nhà phát triển hệ thống và những ai làm việc với các ứng dụng yêu cầu hiệu suất cao.
Java
Java thường được gọi vui là “ngôn ngữ viết một lần chạy mọi nơi” bởi tính đa năng, hướng đối tượng và khả năng sử dụng ở bất cứ nền tảng nào. Các lập trình viên chỉ cần viết một lần là sẽ chạy được trên nhiều nền tảng khác nhau mà không cần phải viết lại mã nguồn.
Java cũng được sử dụng rộng rãi trong phát triển ứng dụng di động, phát triển ứng dụng trên máy chủ và phát triển ứng dụng web. Nó cũng được sử dụng để phát triển các ứng dụng trong các lĩnh vực như tài chính, giáo dục, y tế và nhiều lĩnh vực khác.
Tuy nhiên, Java vẫn có nhược điểm là không phù hợp với các chương trình chạy trên nền tảng đám mây. Đồng thời, khi vận hạnh sẽ tiêu tốn nhiều bộ nhớ và tốc độ cũng không nhanh bằng các ngôn ngữ lập trình khác.
JavaScript
Đã từng là ngôn ngữ đứng đầu danh sách các ngôn ngữ lập trình phổ biến nhất không ai khác chính là JavaScript, tuy nhiên JavaScript đã tuột xuống hạng 3. Đây là một ngôn ngữ lập trình hướng đối tượng, được thiết kế để tương tác với HTML và CSS. Với JavaScript, các nhà phát triển có thể tạo ra các ứng dụng web dễ dàng, từ các trò chơi đơn giản đến các ứng dụng web động và thậm chí là các ứng dụng web phức tạp như trang thương mại điện tử.
JavaScript là một ngôn ngữ linh hoạt và có thể được sử dụng cả trên phía máy chủ và phía client. Ngoài ra, JavaScript còn có rất nhiều thư viện và framework phổ biến như ReactJS, AngularJS, VueJS, giúp cho việc phát triển các ứng dụng web trở nên dễ dàng và hiệu quả hơn.
Nhiều ông lớn trong ngành công nghệ như Google, PayPal, Microsoft đã và đang sử dụng JavaScript. Do đó, sự phổ biến của JavaScript vẫn đang tiếp tục tăng lên và là một trong những ngôn ngữ lập trình quan trọng nhất trong thời đại số ngày nay.
SQL (Structured Query Language) là một ngôn ngữ lập trình chuyên dụng được sử dụng để quản lý và thao tác các cơ sở dữ liệu quan hệ. Được phát triển lần đầu vào những năm 1970 bởi IBM, SQL đã trở thành tiêu chuẩn quốc tế cho việc truy vấn và xử lý dữ liệu trong các hệ quản trị cơ sở dữ liệu (DBMS) như MySQL, PostgreSQL, Oracle Database, và Microsoft SQL Server.
SQL hiện nay là một trong những ngôn ngữ lập trình phổ biến nhất trên thế giới, xếp thứ 7 trong danh sách các ngôn ngữ lập trình phổ biến. Điều này không chỉ do tính quan trọng của SQL trong việc quản lý dữ liệu mà còn bởi tính đơn giản, dễ học và khả năng áp dụng rộng rãi trong nhiều lĩnh vực, từ phát triển phần mềm, phân tích dữ liệu, đến khoa học dữ liệu và trí tuệ nhân tạo.
Golang
Golang (hay còn gọi là Go) là một ngôn ngữ lập trình mới được phát triển bởi Google vào năm 2007 và chính thức ra mắt vào năm 2009. Golang được tích hợp một bộ sưu tập các công cụ, thư viện và framework tiện ích, giúp cho việc phát triển và triển khai các ứng dụng nhanh chóng, dễ dàng hơn.
Golang được sử dụng rộng rãi trong các ứng dụng web và các hệ thống phân tán, đặc biệt là các hệ thống liên quan đến lĩnh vực tài chính và các ứng dụng big data. Golang cũng được sử dụng để phát triển các công cụ và dịch vụ của Google, và được coi là một trong những ngôn ngữ lập trình phổ biến nhất hiện nay.
R
R là một ngôn ngữ lập trình chuyên dụng được thiết kế cho phân tích dữ liệu và thống kê. Được phát triển đầu tiên bởi các nhà thống kê, R nhanh chóng trở thành một công cụ quan trọng và phổ biến trong lĩnh vực khoa học dữ liệu, thống kê và phân tích dữ liệu.
R cung cấp một loạt các công cụ mạnh mẽ cho việc phân tích và trực quan hóa dữ liệu, từ những phép tính thống kê cơ bản đến các mô hình dự đoán phức tạp.
R cũng được sử dụng rộng rãi trong nghiên cứu và phát triển trí tuệ nhân tạo (AI), nơi các nhà khoa học dữ liệu tận dụng khả năng phân tích dữ liệu mạnh mẽ của nó để phát triển các mô hình học máy và các ứng dụng AI khác. Với khả năng xử lý dữ liệu lớn, R là công cụ được nhiều tổ chức, doanh nghiệp và trường đại học tin dùng trong các dự án phân tích dữ liệu và thống kê trên quy mô lớn.
PHP
Theo thống kê, có hơn 80% website hiện nay được tạo nên dựa trên PHP, điều này cho thấy mức độ phổ biến của ngôn ngữ lập trình này. PHP là một ngôn ngữ lập trình mã nguồn mở được phát triển cho mục đích tạo ra các trang web động. Ngoài ra, PHP có thể chạy trên nhiều hệ điều hành khác nhau và được hỗ trợ bởi hầu hết các nhà cung cấp dịch vụ lưu trữ web.
PHP được sử dụng rộng rãi trong các ứng dụng web như blog, trang thương mại điện tử, hệ thống quản lý nội dung (CMS), diễn đàn và các ứng dụng web khác. Với cộng đồng lập trình viên lớn và các tài liệu hướng dẫn phong phú, PHP là một trong những ngôn ngữ lập trình phổ biến nhất trên thế giới và vẫn tiếp tục phát triển để đáp ứng nhu cầu của các ứng dụng web hiện đại.
TypeScript là một ngôn ngữ lập trình mã nguồn mở được phát triển và duy trì bởi Microsoft. Được coi là một phần mở rộng của JavaScript, TypeScript giữ nguyên cú pháp của JavaScript trong khi bổ sung các tính năng mạnh mẽ như kiểm tra kiểu tĩnh (static typing) và hỗ trợ lập trình hướng đối tượng (object-oriented). TypeScript được thiết kế để giải quyết những hạn chế của JavaScript, đặc biệt trong các dự án lớn và phức tạp, nơi việc quản lý các kiểu dữ liệu (data types) trở nên quan trọng.
Một trong những ưu điểm chính của TypeScript là khả năng phát hiện lỗi ngay trong quá trình phát triển nhờ tính năng kiểm tra kiểu tĩnh, giúp lập trình viên phát hiện và sửa lỗi sớm hơn. TypeScript cũng cho phép lập trình viên sử dụng các tính năng tiên tiến của JavaScript (như ES6) ngay cả khi trình duyệt không hỗ trợ trực tiếp, bằng cách biên dịch mã TypeScript về JavaScript tương thích.
C#
C# là một ngôn ngữ lập trình được phát triển bởi Microsoft, được thiết kế để tạo ra các ứng dụng Windows và ứng dụng web, và có thể được sử dụng để phát triển các ứng dụng trên nhiều nền tảng khác nhau, bao gồm cả Android và iOS.
C# được thiết kế dựa trên ngôn ngữ C++ và có cú pháp tương tự như Java. Vì vậy, nếu muốn thực hiện tốt các thao tác người dùng phải có kiến thức về các ngôn ngữ lập trình phổ biến như C, C++, Java.
Nhược điểm của C# là ít linh hoạt bằng các ngôn ngữ khác vì phụ thuộc vào .NET framework của Microsoft. Thêm nữa, việc tìm lỗi và gỡ lỗi trên C# cũng gây khó khăn cho các lập trình viên.
C++
C++ nằm trong top các ngôn ngữ lập trình phổ biến nhất bởi tính đa năng và khả năng sử dụng mạnh mẽ. C++ được phát triển từ ngôn ngữ C, với việc bổ sung thêm các tính năng hướng đối tượng và một số tính năng khác. Đây là ngôn ngữ được sử dụng rộng rãi trong lập trình game, do tính năng xử lý đa luồng của nó và khả năng tối ưu hóa mã. C++ cũng được sử dụng trong phát triển các ứng dụng desktop và phần mềm nhúng, nơi yêu cầu hiệu suất cao và kiểm soát bộ nhớ chặt chẽ.
Kotlin
Kotlin là một ngôn ngữ lập trình cấp cao, được phát triển bởi JetBrains, cùng với việc được hỗ trợ chính thức bởi Google cho việc phát triển ứng dụng Android. Với Kotlin, lập trình viên có thể viết code ngắn gọn hơn so với Java, nhưng vẫn đảm bảo tính hiệu quả và tính chính xác. Kotlin cũng cung cấp một số tính năng mới, bao gồm hỗ trợ lập trình hướng đối tượng, lập trình hàm, và lập trình phi tuyến tính.
Với sự hỗ trợ của Google, Kotlin đã trở thành một trong những ngôn ngữ lập trình phổ biến nhất cho phát triển ứng dụng Android. Nó cũng được sử dụng trong nhiều dự án khác, từ phát triển web đến phát triển phần mềm máy tính và ứng dụng nhúng.
Swift
Swift là một ngôn ngữ lập trình mới được phát triển bởi Apple, dùng để phát triển các ứng dụng cho hệ điều hành iOS, macOS hoặc watchOS. Nó được giới thiệu lần đầu tiên vào năm 2014 và đã nhanh chóng trở thành một trong những ngôn ngữ lập trình phổ biến nhất hiện nay.
Swift được xây dựng trên nền tảng của Objective-C, nhưng nó có cú pháp đơn giản hơn, dễ đọc và dễ viết hơn nhiều so với Objective-C. Nó cũng có hỗ trợ tốt cho các tính năng mới của iOS và macOS, bao gồm phát hiện và xử lý lỗi, thao tác với các tập tin và cơ sở dữ liệu, và xử lý đa luồng.
Ruby
Ruby là một ngôn ngữ lập trình mã nguồn mở, được sử dụng phổ biến cho phát triển các ứng dụng web. Ruby cũng có một thư viện phong phú và mạnh mẽ, gồm các công cụ để xử lý chuỗi, số học, đồ họa, cơ sở dữ liệu, và nhiều hơn nữa.
Ruby thường có tốc độ khá chậm so với các ngôn ngữ lập trình khác. Hơn nữa, khi viết chương trình bằng Ruby sẽ rất khó để gỡ lỗi.
Rust
Rust là một ngôn ngữ lập trình hệ thống hiện đại, được phát triển bởi Mozilla Research và ra mắt lần đầu vào năm 2010. Rust nổi bật với khả năng quản lý bộ nhớ an toàn và hiệu quả, kết hợp với hiệu suất cao tương tự như C và C++, nhưng với một hệ thống kiểm tra lỗi mạnh mẽ giúp tránh các lỗi bảo mật phổ biến như lỗi tràn bộ nhớ (buffer overflow) và lỗi trỏ null (null pointer).
Rust trở thành một lựa chọn lý tưởng cho các ứng dụng yêu cầu xử lý nhanh và hiệu suất cao, như hệ thống nhúng, game, và các ứng dụng đòi hỏi tài nguyên lớn.
Tóm lại
Các ngôn ngữ lập trình đóng một vai trò quan trọng trong việc phát triển các ứng dụng web, mobile, game và nhiều lĩnh vực khác. Các nhà phát triển sẽ luôn cần tìm hiểu và nắm vững các ngôn ngữ lập trình mới để có thể đáp ứng được nhu cầu ngày càng cao của ngành công nghiệp công nghệ thông tin.
Hy vọng thông qua bài viết này, bạn đã có được cái nhìn tổng quan về các ngôn ngữ lập trình phổ biến nhất hiện nay và hiểu rõ hơn về vai trò, tầm quan trọng của chúng trong thế giới công nghệ thông tin.
Software Architect, chức vụ chỉ nghe thôi đã thấy to, vậy phỏng vấn Software Architect có gì đặc biệt? Những câu hỏi và nội dung kiến thức nào thường được đề cập khi phỏng vấn Software Architect?
Trách nhiệm của Solution Architect là làm sao đặt business logic vào không bể nha anh em.
Là một người chịu trách nhiệm lớn cho sự thành công hay thất bại của dự án phần mềm. SA là công việc stress. Nhưng trách nhiệm lớn đồng nghĩa với lương cao. Tất nhiên lượng kiến thức nằm trong đầu cũng thuộc dạng khủng khiếp. Thử lướt xem mấy câu hỏi phỏng vấn SA thì có gì nào?
Rồi, bắt đầu thôi anh em! Dạo qua vài ba câu định nghĩa chưa có gì khó. Phần sau sẽ là những câu hỏi khó hơn.
1. Software Architect là gì?
Câu hỏi đầu tiên phỏng vấn Software Architect chưa đi ngay vào các khái niệm kiến thức mà đi vào định nghĩa. Vậy Sofware Architect là gì?
A software architect is a software development professional who makes high-level design choices and oversees the overall software structure. A software architect is responsible for creating a software system that meets all the technical and operational requirements while also being easy to maintain and extend.
Sofware Architect là người phát triển phần mềm chuyên nghiệp, đưa ra quyết định lựa chọn high-level design và giám sát kiến trúc phần mềm tổng thể. Software Architect chịu trách nhiệm tạo ra một hệ thống phần mềm đáp ứng tất cả các yêu cầu kỹ thuật và vận hành đồng thời đảm bảo cho hệ thống dễ bảo trì và mở rộng.
Dự án lớn có yêu cầu cao mà không có SA thì xác định là toang.
Định nghĩa rất chi là dài dòng nhưng có thể tóm gọn lại như sau:
Là người phát triển phần mềm chuyên nghiệp
Đưa ra quyết định cho kiến trúc của phần mềm (tất nhiên phải đáp ứng yêu cầu)
Giám sát quá trình phát triển phần mềm (đảm bảo đúng như thiết kế)
Hệ thống thiết kế ra phải đảm bảo dễ bảo trì và mở rộng về sau
Hiểu được trách nhiệm và yêu cầu của vị trí Solution Architect giúp anh em hiểu rõ hơn những việc mình cần làm, những kiến thức cần show ra cho nhà tuyển dụng khi apply vị trí này. Anh em cũng có thể tham khảo thêm bài viết này.
Một số câu hỏi anh em có thể xem qua:
Trách nhiệm của Solution Architect?
Những skills nào cần có nếu bạn là Solution Architect?
Câu hỏi số hai phỏng vấn Software Architect liên quan tới các khái niệm thường được sử dụng trong thiết kế kiến trúc phần mềm (high level design).
Load balancing is a simple way to spread work across multiple machines or groups of devices. In this type of load balancing, requests are split up and sent to different machines in a circle. This ensures that all machines get the same number of requests and that none are overloaded or underloaded. Cân bằng tải cách đơn giản để dàn trải công việc trên nhiều máy hoặc nhiều thiết bị. Khi có một lượng lớn yêu cầu gửi tới, load balancing sẽ chia đều tất cả cho các máy, đảm bảo không có máy thì load quá nhiều, máy thì load quá ít.
Các câu hỏi liên quan tới khái niệm yêu cầu anh em cần trả lời chính xác ở mức tuyệt đối, bởi chỉ cần hiểu sai hoặc không chắc chắn mà đã đem vào cho anh em làm thì khả năng cao là bể. Vừa mất thời gian làm vừa gây stress cho team nếu không đáp ứng được yêu cầu về business.
Câu hỏi thứ ba phỏng vấn Software Architect vẫn là câu hỏi liên quan tới khái niệm, nhưng không còn là các khái niệm đơn lẻ như Load Balancing hay CAP Theorem. Câu hỏi này tập trung vào một trong những khái niệm quan trọng nhất khi thiết kế phần mềm.
SOLID là viết tắt của 5 nguyên tắc đóng vai trò cực quan trọng trong phát triển kiến trúc phần mềm.
Single responsibility: nguyên tắc này chỉ ra rằng mỗi class chỉ nên thực hiện một việc duy nhất. Một phần cụ thể trong ứng dụng.
Open/closed: nguyên tắc này chỉ ra rằng một module hoặc một class đóng cho việc sử đổi, nhưng lại mở cho việc kế thừa và mở rộng.
Liskov substitution: nguyên tắc này cho phép thay thế các đối tượng của lớp cha bằng các đối tượng của lớp con mà không gây ảnh hưởng cho ứng dụng.
Interface segregation: nguyên tắc này đảm bảo interface tốt nhất nên được chia nhỏ hết sức có thể
Dependency inversion: nguyên tắc này đảm bảo rằng một lớp ở cấp cao (high level class) không nên dựa vào một lớp cấp thấp (low level class), mặc dù cả hai lớp đều có thể phụ thuộc vào một lớp cấp cao khác.
Một số khái niệm khác anh em có thể xem lại:
ACID là gì?
Nguyên tắc DRY (don’t repeat yourself – lặp lại ít thôi)
Nguyên tắc DIE (duplicate is evil – lặp lại thì toang)
Tới với câu số 4 thôi anh em
4. Sự khác biệt giữa vertical scaling và horizontal scaling
Câu hỏi thứ 4 phỏng vấn Software Architect tập trung vào khả năng mở rộng (scaling). Bản thân SA phải chịu trách nhiệm cho bảo trì và mở rộng hệ thống. Ý ở câu hỏi đầu tiên định nghĩa SA anh em còn nhớ không?
Vậy để mở rộng được thì anh em cần biết khái niệm của mở rộng.
Horizontal scaling means scaling by adding more machines to your pool of resources (also described as “scaling out”), whereas vertical scaling refers to scaling by adding more power (e.g. CPU, RAM) to an existing machine (also described as “scaling up”). Mở rộng theo chiều ngang là cách thêm máy móc vào tài nguyên xử lý (còn được hiểu là mở rộng quy mô), trong khi đó vertical scaling, mở rộng theo chiều dọc đề cập đến việc tăng RAM, tăng CPU vào 1 máy hiện tại.
Chi tiết sâu hơn về cách thức anh em có thể tham khảo bài viết này. Các câu hỏi có thể đọc qua luôn:
Microserice Architecture
Fault tolerance là gì?
5. Database Sharing trong kiến trúc phần mềm
Câu hỏi cuối cùng trong bộ câu hỏi phỏng vấn Software Architect lần này liên quan tới Sharding, cụ thể hơn là khái niệm Database Sharding.
Sharding refers to the breaking up of our data into chunks (shards). The benefit of sharding is that it allows us to scale our database for large-scale systems. Sharding đề cập đến việc chia nhỏ dữ liệu thành các khối nhỏ (gọi là chunks). Lợi ích của sharding là cho phép mở ộng cơ sở dữ liệu cho những hệ thống lớn hoặc cực lớn.
Cụ thể hơn có thể hiểu Sharding sẽ tách các hàng của một bảng dữ liệu lớn thành nhiều hàng khác nhau, được gọi là các partitions (vùng). Dữ liệu ở trong mỗi vùng, mỗi chunks sẽ hoàn toàn độc lập với dữ liệu trong mỗi vùng hoặc các chunks khác.
Chi tiết hơn về Database Sharding anh em có thể tham khảo bài viết này.
6. Tham khảo thêm để chuẩn bị phỏng vấn Solution Architect
Một trong những khía cạnh quan trọng nhất trong quá trình phát triển một ứng dụng mà các lập trình viên phải đối đầu là sự thay đổi. Khi muốn thêm hoặc loại bỏ một tính năng của một đối tượng, điều đầu tiên chúng ta nghĩ đến là thừa kế (extends). Tuy nhiên, thừa kế không khả thi vì nó là static, chúng ta không thể thêm các lớp con mới vào một chương trình khi nó đã được biên dịch và thực thi. Để giải quyết vấn đề này, chúng ta có thể sử dụng Decorator Pattern được giới thiệu trong phần tiếp theo của bài viết này.
Decorator Pattern là gì?
Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
Decorator pattern là một trong những Pattern thuộc nhóm cấu trúc (Structural Pattern). Nó cho phép người dùng thêm chức năng mới vào đối tượng hiện tại mà không muốn ảnh hưởng đến các đối tượng khác. Kiểu thiết kế này có cấu trúc hoạt động như một lớp bao bọc (wrap) cho lớp hiện có. Mỗi khi cần thêm tính năng mới, đối tượng hiện có được wrap trong một đối tượng mới (decorator class).
Decorator pattern sử dụng composition thay vì inheritance (thừa kế) để mở rộng đối tượng. Decorator pattern còn được gọi là Wrapper hay Smart Proxy.
Decorator pattern hoạt động dựa trên một đối tượng đặc biệt, được gọi là decorator (hay wrapper). Nó có cùng một interface như một đối tượng mà nó cần bao bọc (wrap), vì vậy phía client sẽ không nhận thấy khi bạn đưa cho nó một wrapper thay vì đối tượng gốc.
Tất cả các wrapper có một trường để lưu trữ một giá trị của một đối tượng gốc. Hầu hết các wrapper khởi tạo trường đó với một đối tượng được truyền vào constructor của chúng.
Vậy làm thế nào để có thể thay đổi hành vi của đối tượng? Như đã đề cập, wrapper có cùng interface với các đối tượng đích. Khi bạn gọi một phương thức decorator, nó thực hiện cùng một phương thức trong một đối tượng được wrap và sau đó thêm một cái gì đó (tính năng mới) vào kết quả, công việc này tùy thuộc vào logic nghiệp vụ.
Các thành phần trong mẫu thiết kế Decorator:
Component: là một interface quy định các method chung cần phải có cho tất cả các thành phần tham gia vào mẫu này.
ConcreteComponent : là lớp hiện thực (implements) các phương thức của Component.
Decorator : là một abstract class dùng để duy trì một tham chiếu của đối tượng Component và đồng thời cài đặt các phương thức của Component interface.
ConcreteDecorator : là lớp hiện thực (implements) các phương thức của Decorator, nó cài đặt thêm các tính năng mới cho Component.
Để đơn giản hơn, chúng ta xem ví dụ về một hệ thống quản lý dự án, nơi nhân viên đang làm việc với các vai trò khác nhau, chẳng hạn như thành viên nhóm (team member), trưởng nhóm (team lead) và người quản lý (manager). Một thành viên trong nhóm chịu trách nhiệm thực hiện các nhiệm vụ được giao và phối hợp với các thành viên khác để hoàn thành nhiệm vụ nhóm. Mặt khác, một trưởng nhóm phải quản lý và cộng tác với các thành viên trong nhóm của mình và lập kế hoạch nhiệm vụ của họ. Tương tự như vậy, một người quản lý có thêm một số trách nhiệm đối với một trưởng nhóm như quản lý yêu cầu dự án, tiến độ, phân công công việc.
Sau đây là các thành phần tham gia vào hệ thống và hành vi của chúng:
Employee: thực hiện công việc (doTask), tham gia vào dự án (join), rời khỏi dự án (terminate).
Team member: báo cáo task được giao (report task), cộng tác với các thành viên khác (coordinate with others).
Team lead: lên kế hoạch (planning), hỗ trợ các thành viên phát triển (motivate), theo dõi chất lượng công việc và thời gian (monitor).
Manager: tạo các yêu cầu dự án (create requirement), giao nhiệm vụ cho thành viên (assign task), quản lý tiến độ dự án (progress management).
Với cách làm thông thường, chúng ta có sơ đồ như sau:
Bất cứ khi nào một thành viên trong nhóm trở thành một Team Lead, chúng ta phải tạo một đối tượng mới của Team Lead và đối tượng trước đó tham chiếu vào nhân viên đó (Team Member trong nhóm) có thể bị hủy hoặc lưu trữ. Đó không phải là cách tiếp cận được khuyến nghị khi nhân viên vẫn là một phần của tổ chức của bạn. Tương tự như trường hợp với Manager, khi một nhân viên trở thành người quản lý từ một Team Lead / Team Member.
Một trường hợp khác là khi một nhân viên có thể thực hiện trách nhiệm của một Team Member trong nhóm cũng như trách nhiệm của Team Lead hoặc một Manager. Trong trường hợp đó, bạn cần tạo hai đối tượng cho cùng một nhân viên là hoàn toàn sai.
Trong các kịch bản này, một Team Member/ Team Lead có thể có thêm trách nhiệm trong lúc thực hiện (run-time). Và trách nhiệm của họ có thể được chỉ định / thu hồi trong lúc run-time.
Hãy xem sơ đồ bên dưới để thấy được cách chúng ta áp dụng Decorator Pattern như thế nào trong trường hợp này.
Như bạn thấy, với Decorator hệ thống của chúng ta linh hoạt hơn rất nhiều. Chúng ta có thể dễ dàng gán một nhân viên sang vai trò TeamMember, TeamLeader, Manager.
package com.gpcoder.patterns.structural.decorator;
import java.util.Date;
public class EmployeeConcreteComponent implements EmployeeComponent {
private String name;
public EmployeeConcreteComponent (String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public void join(Date joinDate) {
System.out.println(this.getName() + " joined on " + formatDate(joinDate));
}
@Override
public void terminate(Date terminateDate) {
System.out.println(this.getName() + " terminated on " + formatDate(terminateDate));
}
@Override
public void doTask() {
// Unassigned task
}
}
EmployeeDecorator.java
package com.gpcoder.patterns.structural.decorator;
import java.util.Date;
public abstract class EmployeeDecorator implements EmployeeComponent {
protected EmployeeComponent employee;
protected EmployeeDecorator(EmployeeComponent employee) {
this.employee = employee;
}
@Override
public String getName() {
return employee.getName();
}
@Override
public void join(Date joinDate) {
employee.join(joinDate);
}
@Override
public void terminate(Date terminateDate) {
employee.terminate(terminateDate);
}
}
Manager.java
package com.gpcoder.patterns.structural.decorator;
public class Manager extends EmployeeDecorator {
protected Manager(EmployeeComponent employee) {
super(employee);
}
public void createRequirement() {
System.out.println(this.employee.getName() + " is create requirements.");
}
public void assignTask() {
System.out.println(this.employee.getName() + " is assigning tasks.");
}
public void manageProgress() {
System.out.println(this.employee.getName() + " is managing the progress.");
}
@Override
public void doTask() {
employee.doTask();
createRequirement();
assignTask();
manageProgress();
}
}
TeamLeader.java
package com.gpcoder.patterns.structural.decorator;
public class TeamLeader extends EmployeeDecorator {
protected TeamLeader(EmployeeComponent employee) {
super(employee);
}
public void planing() {
System.out.println(this.employee.getName() + " is planing.");
}
public void motivate() {
System.out.println(this.employee.getName() + " is motivating his members.");
}
public void monitor() {
System.out.println(this.employee.getName() + " is monitoring his members.");
}
@Override
public void doTask() {
employee.doTask();
planing();
motivate();
monitor();
}
}
TeamMember.java
package com.gpcoder.patterns.structural.decorator;
public class TeamMember extends EmployeeDecorator {
protected TeamMember(EmployeeComponent employee) {
super(employee);
}
public void reportTask() {
System.out.println(this.employee.getName() + " is reporting his assigned tasks.");
}
public void coordinateWithOthers() {
System.out.println(this.employee.getName() + " is coordinating with other members of his team.");
}
@Override
public void doTask() {
employee.doTask();
reportTask();
coordinateWithOthers();
}
}
Client.java
package com.gpcoder.patterns.structural.decorator;
public class Client {
public static void main(String[] args) {
System.out.println("NORMAL EMPLOYEE: ");
EmployeeComponent employee = new EmployeeConcreteComponent("GPCoder");
employee.showBasicInformation();
employee.doTask();
System.out.println("\nTEAM LEADER: ");
EmployeeComponent teamLeader = new TeamLeader(employee);
teamLeader.showBasicInformation();
teamLeader.doTask();
System.out.println("\nMANAGER: ");
EmployeeComponent manager = new Manager(employee);
manager.showBasicInformation();
manager.doTask();
System.out.println("\nTEAM LEADER AND MANAGER: ");
EmployeeComponent teamLeaderAndManager = new Manager(teamLeader);
teamLeaderAndManager.showBasicInformation();
teamLeaderAndManager.doTask();
}
}
Output của chương trình:
NORMAL EMPLOYEE:
-------
The basic information of GPCoder
GPCoder joined on 04/11/2018
GPCoder terminated on 04/05/2019
TEAM LEADER:
-------
The basic information of GPCoder
GPCoder joined on 04/11/2018
GPCoder terminated on 04/05/2019
GPCoder is planing.
GPCoder is motivating his members.
GPCoder is monitoring his members.
MANAGER:
-------
The basic information of GPCoder
GPCoder joined on 04/11/2018
GPCoder terminated on 04/05/2019
GPCoder is create requirements.
GPCoder is assigning tasks.
GPCoder is managing the progress.
TEAM LEADER AND MANAGER:
-------
The basic information of GPCoder
GPCoder joined on 04/11/2018
GPCoder terminated on 04/05/2019
GPCoder is planing.
GPCoder is motivating his members.
GPCoder is monitoring his members.
GPCoder is create requirements.
GPCoder is assigning tasks.
GPCoder is managing the progress.
Lợi ích của Decorator Pattern là gì?
Tăng cường khả năng mở rộng của đối tượng, bởi vì những thay đổi được thực hiện bằng cách implement trên các lớp mới.
Client sẽ không nhận thấy sự khác biệt khi bạn đưa cho nó một wrapper thay vì đối tượng gốc.
Một đối tượng có thể được bao bọc bởi nhiều wrapper cùng một lúc.
Cho phép thêm hoặc xóa tính năng của một đối tượng lúc thực thi (run-time).
Sử dụng Decorator Pattern khi nào?
Khi muốn thêm tính năng mới cho các đối tượng mà không ảnh hưởng đến các đối tượng này.
Khi không thể mở rộng một đối tượng bằng cách thừa kế (inheritance). Chẳng hạn, một class sử dụng từ khóa final, muốn mở rộng class này chỉ còn cách duy nhất là sử dụng decorator.
Trong một số nhiều trường hợp mà việc sử dụng kế thừa sẽ mất nhiều công sức trong việc viết code. Ví dụ trên là một trong những trường hợp như vậy.
Decorator cho phép thêm một tính năng mới vào một object nhưng không được phép sử dụng thừa kế. Nó cho phép thay đổi lúc thực thi (run-time). Adapter được sử dụng khi bạn có một interface, và bạn muốn ánh xạ interface đó đến một đối tượng khác có vai trò chức năng tương tự, nhưng là một interface khác.
Decorator có xu hướng hoạt động trên một đối tượng. Adapter có xu hướng hoạt động trên nhiều đối tượng (có thể wrap nhiều interface).
Google chrome là một trong những trình duyệt được yêu thích nhất trên thế giới bởi… nó là sản phẩm của Google. Nói vui vậy thôi chứ mình thấy Google chrome thật sự là trình duyệt ngon nhất hiện nay bởi nó nhanh, đơn giản lại đồng bộ được nhiều dịch vụ có sẵn của Google. Nhưng điều mình thích nhất vẫn là nó có kho extension vô cùng phong phú.
I. Extension của google chrome là gì?
Chrome extension là các “phần mềm con” mà bạn có thể cài vào nhằm bổ sung thêm tính năng mới cho trình duyệt. Ví dụ như mình có 2 sản phẩm là URL QrCode và ICTU timetable đó chẳng hạn.
Phân tích dưới góc độ của developer, thì Chrome extension giống như một web app được tạo nên từ HTML, CSS, JS và tương tác với trình duyệt thông qua các JavaScript API mà chrome cung cấp. Cơ chế nhúng extension vào chrome cũng rất đơn giản, tương tự như việc bạn nhúng một cái iframe vào trang web vậy.
II. Tạo một extension chrome
Trong phần này, mình sẽ hướng dẫn các bạn cách tạo một extension có tính năng tương tự như extension URL QrCode của mình nhé.
2.1 Chuẩn bị một web app
Như mình đã nói ở phần trên thì chrome extension giống như một web app. Vậy chúng ta cần phải tạo ra một web app trước. Vì bài viết này không tập trung vào việc tạo web app như thế nào nên mình đã chuẩn bị sẵn cho bạn một cái ở github repo này rồi, bạn chỉ cần làm theo hướng dẫn để cài đặt thôi.
Trước khi cài đặt bạn hãy đảm bảo rằng máy tính của bạn đã được cài sẵn git và nodejs nhé.
Nhìn qua có thể thấy ngay manifest.json là file khai báo các thông tin cơ bản cho extension như tên, mô tả, phiên bản,…
Một vài thông tin mà mình thường hay khai báo là:
name: Tên của extension
description: Mô tả ngắn gọn cho extension
version: Phiên bản của extension. Mỗi khi có cập nhật cho extension, bạn nhất định phải thay đổi giá trị này thì extension của bạn mới có thể tự động cập nhật trên trình duyệt của người dùng
browser_action.default_icon: Đường dẫn tới file icon của extension
browser_action.default_popup: File đầu tiên được gọi đến khi người dùng mở extension của bạn
permissions: Các quyền mà extension muốn sử dụng. Như extension URL QrCode của mình cần truy cập vào URL hiện tại của tab, vì vậy mình cần khai báo permissions là tabs. Bạn có thể xem toàn bộ permissions tại đây.
manifest_version: Là phiên bản của file manifest.json do google quy định. Bạn có thể đọc thêm tại đây, nếu bạn không hiểu thì cứ để mặc định là 2 nhé.
Nếu bạn muốn tìm hiểu chi tiết về các thành phần nội dung trong file manifest.json, bạn có thể đọc thêm ở đây.
2.3 Cài đặt thử lên chrome
Extension đã có, giờ chúng ta sẽ thêm vào chrome để xem nó hoạt động như thế nào nhé. Để thêm vào chrome bạn lần lượt thực hiện theo các bước sau:
Bước 1: Truy cập vào Settings > More tools > Extensions (chrome://extensions) để mở trang quản lý các extension đã cài đặt.
Bước 2: Bật chế độ Developer mode để cài thẳng extension vào chrome mà không cần phải download từ store.
Bước 3: Nhấn nút Load unpacked, và chọn tới thư mục dist chứa extension mà chúng ta đã build ra ở mục 2.1.
Sau khi thực hiện 3 bước trên, nếu thành công thì bạn sẽ thấy extension của mình nằm trong danh sách các extension đã được cài đặt của chrome. Bạn có thể xem video dưới của mình để hiểu rõ hơn.
III. Đưa lên store
Về cơ bản, bạn đã tạo và cài đặt được một chrome extension. Giờ là lúc chúng ta đưa nó lên store để tiếp cận nhiều người sử dụng hơn.
Để có thể đưa lên store, bạn cần chuẩn bị trước một tài khoản dành cho Nhà phát triển. Phí đăng ký tài khoản này là $5 – thanh toán qua các thẻ Quốc tế như thẻ Visa.
Bước 2: Nén zip các file nằm trong thư mục dist và tải lên. Bạn có thể xem video của mình để hiểu rõ hơn.
Bước 3: Sau khi tải lên thành công, bạn sẽ được chuyển hướng vào một trang mới. Tại đây bạn sẽ phải điền một số nội dung để mô tả về extension vừa tải lên như sau:
Ít nhất một ảnh chụp màn hình hoặc video youtube giới thiệu về extension của bạn. Nếu là hình ảnh thì phải có kích thước là 1280×800 hoặc 640×400.
Một bài mô tả ngắn ngọn về extension của bạn.
Một ảnh để làm avatar cho extension của bạn, có kích thước 128×128.
Trên là các thông tin mà mình nghĩ bạn nên chuẩn bị trước, ngoài ra còn một số thông tin khác nữa như chọn Danh mục cho extension, chọn Ngôn ngữ,… thì bạn chỉ cần làm theo hướng dẫn của Google là được. Sau cùng bạn nhấn vào nút Xuất bản các thay đổi để hoàn tất việc đưa extension lên store.
Sau khi nhấn nút Xuất bản, Google sẽ kiểm duyệt extension của bạn trong vòng 5 – 10 phút gì đó. Thường thì các extension đều được duyệt, trừ khi bạn cố tình làm điều gì đấy ảnh hưởng tới quyền lợi của người sử dụng thì Google mới từ chối.
Quá trình đưa extension lên store chỉ đơn giản, vẻn vẹn trong 3 bước vậy thôi.
IV. Kết luận
Việc tạo extension không khó, về cơ bản extension chỉ giống như một cái web, vậy nếu bạn làm được web thì chắc chắn cũng làm được extension. Mình chỉ cảm rắc rối là khi đưa extension lên store thì phải có tài khoản Nhà phát triển – đăng ký mất $5 và thanh toán qua thẻ Quốc tế – cái mà nhiều bạn không có.
Bài viết được viết dựa trên kinh nghiệm cá nhân, có chỗ nào khó hiểu cần được giải thích thêm thì bạn cứ mạnh dạn nói với mình nhé.
Thời kỳ công nghiệp 4.0 với sự phát triển của BigData, AI, Machine Learning,… tất cả các công nghệ mới hiện nay có một đặc điểm chung là cần phải xử lý dữ liệu ở một tổ chức và quy mô lớn. Cũng vì đó mà ngành kỹ sư dữ liệu trở nên hot hơn bao giờ hết. Data Engineer được rất nhiều công ty tuyển dụng với mức đãi ngộ cao cũng như định hướng tốt trong tương lai. Để chuẩn bị cho buổi phỏng vấn vị trí này, chúng ta cùng nhau tìm hiểu về những câu hỏi phỏng vấn Data Engineer thường gặp nhé.
Vai trò của một Data Engineer
Data Engineer / Kỹ sư dữ liệu là có nhiệm vụ chính là thu thập, chuẩn bị các dữ liệu và cùng những nhà khoa học, phân tích dữ liệu sử dụng. 3 vai trò của một Data Engineer bao gồm:
Generalist – Đảm nhận các công việc tổng quát: thu thập, tải lên, nhập, đồng thời xử lý dữ liệu đầu cuối. Đây là công việc cơ bản của một Data Engineer.
Pipeline-centric – Phụ trách mảng Data Pipeline: Data Pipeline hay đường ống dữ liệu là một chuỗi các bước thực hiện theo một trình tự cụ thể để xử lý dữ liệu và chuyển dữ liệu từ hệ thống này sang hệ thống khác. Vai trò này đòi hỏi các kỹ sư dữ liệu cần biết chuyên sâu về hệ thống khoa học máy tính và phân tán.
Database-centric – Chuyên về cơ sở dữ liệu: vai trò thiết lập, triển khai, đồng thời duy trì và đưa cơ sở dữ liệu đã phân tích vào hệ thống. Thông thường các hệ thống nơi dữ liệu được phân bố rộng tại nhiều kho Database thì vai trò này phải được đảm nhiệm bởi một kỹ sư, chuyên gia dữ liệu có kinh nghiệm.
Kỹ năng của Data Engineer
Ngôn ngữ lập trình thường sử dụng để xử lý dữ liệu
Data Engineer làm việc với các loại dữ liệu khác nhau thu thập từ nhiều nguồn khác nhau. Điều kiện tiên quyết để trở thành một kỹ sư dữ liệu là biết cách làm việc, thao tác, truy vấn hay quản lý các hệ thống cơ sở dữ liệu. SQL hay ngôn ngữ truy vấn có cấu trúc (Structured Query Language) phục vụ cho công việc này.
Để phục vụ cho quá trình xử lý dữ liệu, cụ thể là viết các ETL scripts trích xuất, chuyển đổi và tải dữ liệu từ hệ thống này sang hệ thống khác, ngôn ngữ lập trình thường được sử dụng là Python. Ưu điểm của Python là khả năng tối ưu hóa các script hỗ trợ thao tác dữ liệu, vì thế rất được ưa chuộng trong ngành xử lý dữ liệu nói riêng và BigData, AI nói chung.
Một ngôn ngữ lập trình thường được sử dụng trong việc phân tích thống kê và trực quan hóa dữ liệu là R, ưu điểm của ngôn ngữ lập trình này là thư viện có sẵn các thuật toán học máy, hồi quy tuyến tính, chuỗi thời gian, suy luận thống kê,… giúp lập trình viên xử lý dữ liệu tối ưu hóa xử lý của mình.
SQL và NoSQL là 2 loại hình cơ sở dữ liệu phổ biến nhất hiện nay. SQL (Structured Query Language) là ngôn ngữ truy vấn có cấu trúc. Nó được dùng để xử lý cơ sở dữ liệu quan hệ như MySQL, Oracle, MS SQL,… NoSQL (Non-Relational SQL) có mục đích sử dụng như SQL nhưng được dành cho các cơ sở dữ liệu không quan hệ, không yêu cầu một lược đồ cố định và có thể dễ dàng mở rộng. NoSQL thường được sử dụng cho các kho dữ liệu phân tán với nhu cầu lưu trữ dữ liệu khổng lồ vì vậy nó thích hợp với các ứng dụng Web thời gian thực hay BigData.
Về loại hình, SQL databases có cấu trúc dựa trên các bảng, các bảng có quan hệ với nhau. NoSQL thì dựa trên cặp tài liệu, cặp khóa giá trị hay cơ sở dữ liệu biểu đồ. NoSQL không có ngôn ngữ Query như cái tên của nó, NoSQL databases cũng dễ dàng mở rộng theo chiều ngang và phù hợp với những bài toán mà dữ liệu ban đầu chưa xác định rõ.
So sánh về hiệu suất thì NoSQL thường được cho là nhanh hơn SQL do không mất nhiều chi phí join hay các đoạn câu lệnh SQL phức tạp cần tối ưu. Ngược lại, SQL sẽ hỗ trợ ràng buộc tốt hơn cho những thao tác update nhiều records trong cùng một transaction, NoSQL có options tương tự nhưng bạn sẽ cần xử lý thủ công hơn trong khi viết code.
DataLake và DataWarehouse đều là những kho lưu trữ dữ liệu dành cho các doanh nghiệp. Điểm khác nhau cơ bản giữa 2 loại kho dữ liệu trên là trong khi DataLake chủ yếu chứa các dữ liệu thô, nguyên gốc; còn dữ liệu trong DataWarehouse cần trải qua bước biến đổi và phân loại dữ liệu từ các nguồn khác nhau trước khi nhập vào kho lưu trữ.
Dữ liệu trong DataLake được giữ nguyên gốc đầu vào vì thế doanh nghiệp cũng tiết kiệm chi phí cho việc biến đổi, phân loại dữ liệu. Ngược lại dữ liệu trong DataWarehouse sẽ trải qua quy trình ETL: Extract – Transform – Load trước khi được nhập kho, sau đó những dữ liệu này được các Data Analyst, Business Analyst hoặc Data Scientist,… sử dụng trực tiếp để báo cáo, phân tích và khai thác dữ liệu; vì vậy doanh nghiệp sử dụng DataWarehouse sẽ cần tốn chi phí cho công việc trên.
Giải thích về kỹ thuật ETL / ELT trong xử lý dữ liệu
ETL viết tắt của Extract, Transform và Load, là một kỹ thuật trích xuất dữ liệu từ các hệ thống nguồn khác nhau sau đó chuyển đổi dữ liệu áp dụng các logic tính toán để tải chúng vào hệ thống kho dữ liệu DataWarehouse.
Flow của ETL có 3 bước:
Extract – trích xuất: thu thập dữ liệu từ các nguồn
Transform – biến đổi: dựa vào các quy tắc, bảng tra cứu,… kết hợp các dữ liệu khác nhau để biểu dữ liệu thu được từ bước Extract về một dạng biểu mẫu phù hợp vơi cơ sở dữ liệu xây dựng sẵn
Load – tải: quá trình ghi dữ liệu vào đích
ELT là một kỹ thuật khác về luồng xử lý so với ETL. Vẫn giữ 3 bước như trên nhưng bước Load sẽ được thực hiện ngay sau khi trích xuất dữ liệu. Dữ liệu sẽ được sao chép và chuyển đến đích ngay, xong sau đó mới thực hiện bước biến đổi (Transform). Để thực hiện việc này thì ETL chỉ phù hợp với các database NoSQL, với những dữ liệu lớn và việc lưu trữ không yêu cầu phải đúng theo template sẵn có.
Ưu điểm của ELT chính là việc không phụ thuộc tốc độ xử lý dữ liệu ở bước Transform (thường chiếm nhiều thời gian nhất trong phương thức ETL), dữ liệu sau khi được tải có thể được xử lý sau đó mà không lo việc mất mát hay bị ngừng lại trong quá trình biến đổi. Mặc dù vậy nhược điểm của nó chính là độ phức tạp đòi hỏi kiến thức chuyên sâu về các tools sử dụng cũng như kỹ năng chuyên môn.
Có những giai đoạn nào trong quá trình phân tích dữ liệu
Có 4 giai đoạn chính trong quá trình phân tích dữ liệu:
Phân tích mô tả (Descriptive Analytics)
Giai đoạn đầu tiên này giúp tìm hiểu thông tin về quá khứ, hiện tại và xu hướng của dữ liệu. Một số phương pháp phân tích áp dụng trong giai đoạn này gồm: Định lượng hóa dữ liệu, Phân tích biểu đồ và bảng biểu, Tóm tắt thống kê, Đồ thị thời gian và phân tích nhân tố.
Phân tích chẩn đoán (Diagnostic Analytics)
Giai đoạn này sử dụng các phương pháp phân tích để giải thích các nguyên nhân hoặc đặc điểm của các hiện tượng hoặc sự kiện trong dữ liệu. Phương pháp phân tích chẩn đoán bao gồm phân tích tương quan, phân tích đa biến, phân tích thành phần chính và phân tích nhân tố.
Phân tích tiên đoán (Predictive Analytics)
Phân tích tiên đoán là việc sử dụng các mô hình dữ liệu để dự đoán các sự kiện hoặc xu hướng trong tương lai. Phương pháp sử dụng bao gồm mô hình hồi quy, mô hình chuỗi thời gian, mạng nơ ron và máy học.
Phân tích chỉ đạo (Prescriptive Analytics)
Là giai đoạn cuối cùng của phân tích dữ liệu, sử dụng kết quả từ phân tích tiên đoán để đưa ra các quyết định chỉ đạo và lập kế hoạch. Phương pháp sử dụng là tối ưu hóa và mô phỏng.
Nêu một số công cụ biểu diễn trực quan hóa dữ liệu
Kỹ sư dữ liệu cần biết đến các công cụ phân tích và trực quan hóa dữ liệu Bussiness Intelligence nhằm phục vụ việc thiết lập kết nối giữa các DataWarehouse, DataLake cùng với các nguồn dữ liệu đầu vào hay đầu ra khác. Ngoài ra còn để phục vụ cho việc lập báo cáo, lên kế hoạch; một số công cụ biểu diễn trực quan hóa dữ liệu dành cho Data Engineer:
Microsoft Power BI
Microsoft Excel
SAP Business Objects
Datapine
Oracle BI
SAS Business Intelligence
MicroStrategy
Kết bài
Trên đây là list những câu hỏi mà bạn sẽ có thể gặp trong buổi phỏng vấn của mình ở vị trí kỹ sư dữ liệu Data Engineer. Hy vọng bài viết hữu ích dành cho các bạn đang muốn tìm một công việc tốt trong ngành này. Hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.
Trên blog của mình có những bài viết cao siêu về trick nọ trick kia, thế nhưng có một điều quan trọng mà các bạn mới bắt đầu thường quan tâm đó là cài đặt những phần mềm gì vào máy tính để có thể học được lập trình web PHP thì chưa có. Vậy trong bài viết này, mình sẽ hướng dẫn các bạn cách cài đặt môi trường để có thể học lập trình web PHP nhé.
I. Cài đặt code editor
Code editor là phần mềm để chúng ta có thể viết code. Hiện nay có rất nhiều các code editor hỗ trợ cho lập trình web PHP, nhưng mình khuyên các bạn nên sử dụng Sublime Text 3 – một editor nhẹ nhàng nhưng vẫn đầy đủ.
Sublime Text 3 có mặt trên cả 3 hệ điều hành phổ biến là Windows, Mac, Ubuntu – thoải mái cho bạn lựa chọn. Sublime Texr 3 cũng có cách cài đặt đơn giản như những phần mềm bình thường khác nên bạn đừng lo lắng nhé.
II. Cài đặt trình duyệt
Đối với web developer, trình duyệt không chỉ đơng giản là phần mềm để lướt web, mà nó còn là công cụ để phát triển web, vì vậy mà máy bạn có trình duyệt hay chưa không quan trọng, quan trọng là bạn đang sử dụng trình duyệt nào. Ở đây, mình gợi ý các bạn nên sử dụng Google Chrome, bởi nó nhẹ nhàng, được tích hợp tool phát triển web, lại là trình duyệt được nhiều người dùng nhất.
Ở Việt Nam còn có một trình duyệt phổ biến nữa đó là trình duyệt Coccoc, bạn có thể sử dụng Coccoc để download video từ Youtube, tuy nhiên không nên sử dụng Coccoc làm trình duyệt để phát triển web. Tại sao thì có nhiều nguyên nhân mà trong phạm vi bài viết này mình sẽ không đề cập đến, bạn cứ nghe mình đi, nếu đang dùng Coccoc thì tải thêm cái Chrome nữa về để phát triển web sẽ tốt hơn.
Hiểu nhanh thì Web technology stack là một bộ các phần mềm liên quan để tạo nên môi trường phát triển web. Web technology stack thường bao gồm các thành phần: Hệ điều hành, Web server, CSDL, Ngôn ngữ lập trình (không bao gồm editor và trình duyệt).
Hiện nay có khá nhiều Web technology stack, nhưng chúng ta đang phát triển web PHP nên mình gợi ý các bạn nên sử dụng LAMP Stack.
LAMP là chữ viết tắt của:
Linux: Hệ điều hành lý tưởng nhất để phát triển PHP. (Bạn có thể sử dụng Windows cũng được).
Xampp là một phần mềm chứa tất cả các thành phần cần thiết cho LAMP Stack (không đúng lắm với các bạn sử dụng Windows). Nghĩa là sau khi bạn cài đặt xong XAMPP, bạn sẽ có luôn Apache, MySQL, PHP – những thành phần lẽ ra bạn phải cài đặt từng thứ một.
XAMPP có mặt trên 3 hệ điều hành phổ biến là Ubuntu, MacOS và Windows (32 bit, 64 bit). Về cách cài đặt XAMPP thì cũng cài đặt đơn giản như bao phần mềm khác, chứ không có gì đặc biệt cả.
PHP là một ngôn ngữ lâu đời (ra đời năm 1995), nên nó được các developer đóng góp một lượng thư viện khổng lồ – cái mà bạn sẽ sử dụng rất nhiều khi làm việc với các PHP framework. Để tiện quản lý các thư viện PHP, thì bạn cần cài đặt Composer.
NodeJS là môi trường cần thiết cho nhiều công cụ phát triển web mà chắc chắn bạn sẽ sử dụng tới. Vì vậy mình khuyên bạn nên cài đặt luôn. Về cách cài đặt NodeJs thì bạn chỉ cần download về và cài đặt như một phần mềm bình thường.
Git là một công cụ quản lý phiên bản, tuy nhiên với sự ra đời của Github thì Git còn giống như công cụ để chia sẻ project lẫn nhau của các developers. Trên Github có một lượng lớn các project đủ mọi thể loại, nếu bạn muốn lấy chúng về để tham khảo thì bạn nên cài đặt Git.
Command Line Interface (CLI) là công cụ mà lập trình viên nên sử dụng. Trên Ubuntu hoặc MacOS thì chính là Terminal, trên Windows thì chính là Cmd (Command Prompt). Tuy nhiên với các bạn sử dụng Windows thì nên dùng CLI là Git Bash – công cụ được tích hợp sẵn nếu bạn download Git ở mục 3.3.
Git Bash cung cấp một số command line giả lập Linux trên Windows. Hơn nữa là Git Bash có một chút màu mè, nhìn đẹp mắt và có vẻ ngầu hơn là bạn sử dụng Cmd của Windows.
3.5 Postman
Postman là công cụ hỗ trợ bạn phát triển các Web API tiện lợi hơn. Postman tồn tại dưới 2 dạng: một là extension của trình duyệt Chrome, hai là một phần mềm riêng biệt (hỗ trợ đủ hệ điều hành). Ở đây mình khuyên bạn nên sử dụng Postman như một phần mềm riêng biệt thì hơn.
Tuy là khi làm thực tế, có thể bạn sẽ cần phải cài thêm một số thứ khác nữa, nhưng cơ bản như vậy là đủ – đủ để bạn bắt đầu học lập trình web PHP được rồi.
Hiện tại mình và nhiều web developer chuyên nghiệp khác cũng chỉ cài các công cụ như trên, thế nên bạn cứ yên tâm sử dụng nhé. Trong trường hợp bạn biết một công cụ nào mà bạn cho là tốt hơn, phù hợp với bạn hơn thì bạn cứ mạnh dạn sử dụng, không nhất thiết phải 100% theo gợi ý mình.
Bài viết được viết dựa trên kinh nghiệm cá nhân, rất mong nhận được góp ý từ các bạn.
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.