Mục đích của kĩ nghệ phần mềm là thiết kế và phát triển phần mềm có chất lượng đáp ứng yêu cầu của khách hàng. Ngày nay kĩ sư phần mềm là việc làm “nóng nhất” trên thế giới và được cần ở mọi công ti vì nhiều công ti đang dựa trên công nghệ thông tin (CNTT) cho doanh nghiệp của họ và vì CNTT thay đổi nhanh chóng, họ cần người có thể điều chỉnh, cải tiến và giữ cho hệ thống CNTT của họ vận hành hiệu quả và hiệu lực.

Kĩ sư phần mềm thiết kế và phát triển nhiều kiểu phần mềm từ trò chơi máy tính tới ứng dụng doanh nghiệp; từ phần mềm kiểm soát máy bay tới phần mềm quản lí tuyến lắp ráp chế tạo. Bởi vì kĩ sư phần mềm bao giờ cũng làm việc trong tổ, sinh viên thường được đào tạo trong làm việc tổ ở năm thứ hai và thứ ba với các dự án nhỏ được phân công cho tổ thay vì cho cá nhân. Kĩ sư phần mềm hiểu rằng để xây dựng sản phẩm chất lượng, họ phải tuân theo qui trình được xác định, là sinh viên họ học về qui trình, vòng đời sớm ngay từ năm thứ nhất. Sinh viên biết chi tiết về mọi pha và cách những pha này làm việc cùng nhau bằng tiến hành kiểm điểm để chắc rằng phần mềm sẽ làm việc đúng.

Tại công việc, người kĩ sư phần mềm bao giờ cũng bắt đầu bằng việc phân tích nhu cầu của người dùng. Họ gặp người dùng sớm trong dự án để kiểm nghiệm hiểu biết của họ về những nhu cầu này và đó là lí do tại sao kĩ năng mềm như trao đổi và lắng nghe là rất quan trọng. Khi các yêu cầu được hiểu, họ bắt đầu kiến trúc hệ thống. Họ dùng biểu đồ hoàn cảnh và biểu đồ luồng dữ liệu để chỉ ra cách hệ thống làm việc; họ nhận diện các cấu phần then chốt của cả phần cứng và phần mềm để tối ưu hiệu năng hệ thống. Trong pha này, họ nhận diện mọi giao diện và xác định những trao đổi dữ liệu để chắc phần cứng và phần mềm làm việc tốt với nhau. Để làm việc tốt, người kĩ sư phần mềm phải có một số tri thức nền tảng về phần cứng tính toán nữa. Kiến trúc là công việc mức cao nơi hầu hết mọi thứ được tổ chức nhưng các chi tiết được thực hiện trong thiết kế. Đây là chỗ mọi cấu phần phần mềm được cân nhắc và các thuộc tính chất lượng được nhận diện. Trong qui trình này người kĩ sư phần mềm tạo ra lưu đồ, biểu đồ cũng như phát triển tập chi tiết các lệnh hay thuật toán để bảo cho máy tính điều cần làm. Sau khi thiết kế được thực hiện, người kĩ sư phần mềm bắt đầu thực hiện thiết kế của họ bằng việc viết các chương trình dùng các ngôn ngữ lập trình như C, C++, Java, Python hay Ruby. Họ cũng áp dụng các kĩ thuật như kiểm điểm thiết kế, giám định mã để chắc rằng công việc của họ có chất lượng cao nhất.

Kĩ sư phần mềm cũng cập nhật, kiểm thử, sửa đổi, và mở rộng chương trình thông tin hiện có. Họ thường dùng các công cụ phần mềm để tiến hành công việc của họ. Một số người dùng các công cụ kĩ nghệ phần mềm có máy tính trợ giúp (CASE) để tự động qui trình viết mã. Những công cụ này cho phép họ tập trung vào viết các phần duy nhất của chương trình. Họ cũng dùng các thư viện mã tái dụng cho các ứng dụng đặc thù. Cách tiếp cận này cho mã tốt hơn và nhất quán và tăng năng suất của họ bằng việc khử bỏ một số bước thường lệ.

Tôi thường nhận được các câu hỏi về khác biệt giữa chương trình Khoa học máy tính (CS) và Kĩ nghệ phần mềm (SWE). Về căn bản, cả hai chương trình này đều yêu cầu nền tảng trong ngôn ngữ lập trình và lí thuyết máy tính cơ sở. Ở nhiều trường, hai năm đầu là gần như nhau. Họ khác nhau trong sự hội tụ vào các chuyên môn. Chương trình Khoa học máy tính có xu hướng nhấn mạnh nhiều vào lí thuyết, cấu trúc dữ liệu, mô hình hoá, và thuật toán v.v. Tương phản lại, chương trình Kĩ nghệ phần mềm hội tụ nhiều vào khía cạnh thực hành, điều được cần trong công nghiệp như phân tích vấn đề, thiết kế phần mềm, kiểm thử phần mềm, chất lượng phần mềm, qui trình phần mềm, và quản lí dự án, v.v. Trong khi cả hai chương trình CS và SWE đều chủ trương làm việc tổ nhưng trong hầu hết chương trình CS, làm việc tổ chỉ được khuyến cáo nhưng trong SWE nó là yêu cầu. Gần như mọi chương trình SWE đều yêu cầu sinh viên phải làm dự án Capstone trong năm cuối của họ nơi sinh viên làm việc trên “dự án thực” được trao cho bởi công nghiệp.

Theo dữ liệu từ công nghiệp CNTT, quãng 75% kĩ sư phần mềm làm trong các công ti phần mềm như Microsoft, Google, Facebook, IBM, Oracle v.v. Quãng 15% làm việc cho cơ quan chính phủ và 10% làm việc như các nhà tư vấn hay nhà thầu độc lập. Trong các công ti nhỏ, các kĩ sư phần mềm làm nhiều thứ, từ gặp gỡ người dùng và khách hàng tới viết mã và kiểm thử. Trong các công ti lớn hơn, kĩ sư phần mềm thường được phân công cho những vai trò nào đó trong các dự án tuỳ theo kinh nghiệm của họ. Những vai trò này là người phân tích yêu cầu, kiến trúc sư, người thiết kế, người phát triển, người kiểm thử, người đảm bảo chất lượng, người quản lí cấu hình, và người quản lí dự án v.v.

Để làm việc như một kĩ sư phần mềm, sinh viên phải có ít nhất là bằng cử nhân từ đại học được công nhận trong hoặc Kĩ nghệ phần mềm hoặc Khoa học máy tính; phải có khả năng chứng tỏ kĩ năng trong lập trình cũng như tri thức về vòng đời phát triển phần mềm và công cụ phần mềm. Các kĩ năng mềm là rất quan trọng trong nghề này và ngoại ngữ là quan trọng để tiến xa hơn. Chẳng hạn ngày nay, nhiều dự án phần mềm lớn được phân bố toàn cầu dựa trên quan niệm có tên “Đi theo mặt trời” nơi việc phát triển được thực hiện 24 giờ và 7 ngày một tuần với các thành viên tổ đặt ở nhiều nước, có ngôn ngữ thứ hai như tiếng Anh là được yêu cầu để tham gia các tổ đó. Trong số mọi nghề với lĩnh vực công nghệ thông tin, kĩ sư phần mềm có lương cao nhất và nhiều phúc lợi đặc biệt hơn. Tưởng tượng rằng người kĩ sư làm việc cho Google mười lăm năm trước khi họ mới bắt đầu; hay làm cho Facebook năm năm trước; hay Instagram vài tháng trước khi bị mua. Ngày nay với hàng trăm công ti mới thành lập, cơ hội là vô hạn.

—-English version—-

What Software Engineers do

The goal of software engineering is to design and develop quality software that meets customers’ requirement. Today software engineers is the “Hottest” job in the world and are needed in every company because more companies are relying on Information Technology (IT) for their business and as IT changes quickly, they need people who can adjust, improve and keep their IT systems operate effectively and efficiently.

Software engineers design and develop many types of software from computer games to business applications; from software that control airplanes to software that manage manufacturing assembly lines. Because software engineers always work in team, students are often trained in teamwork at the second or third year with small projects assigned to team instead of individual. Software engineers understand that to build quality products, they must follow a defined process, as students they learn about process, lifecycle early in their first year. Students know all phases in detail and how these phases work together by conduct reviews to make sure that the software will work properly.

At work, software engineers always begin by analyzing users’ needs. They meet users early in the project to validate their understanding of these needs and that is why soft-skills such as communication and listening are very important. When the requirements are understood, they begin to architect the system. They use context diagram and data flow diagrams to show how the system works; they identify key components of both hardware and software to optimize system performance. In this phase, they identify all interfaces and define data exchanges to make sure hardware and software work well together. To do a good job, software engineers must possess some fundamental knowledge of computing hardware too. Architect is the high level work where most things are organized but the details are done in the design. This is where all the software components are considered and quality attributes are identified. During this process software engineers create flowcharts, diagrams as well as develop detailed sets of instructions or algorithms to tell the computer what to do. After the design is done, software engineers begin to implement their design by write programs using programming language such as C, C++, Java, Python or Ruby. They also apply techniques such as design reviews, code inspections to make sure that their works have the highest quality.

Software engineers also update, test, modify, and expand existing information programs. They often use software tools to expedite their works. Some use computer-assisted software engineering (CASE) tools to automate the coding process. These tools allow them to concentrate on writing the unique parts of a program. They also use libraries of reusable code for specific application. This approach yields better and consistent code and increases their productivity by eliminating some routine steps.

I often receive questions about the difference between Computer Science (CS) and Software Engineering (SWE) program. Basically, both programs require a foundation in programming languages and basic computer theories. In many schools, the first two years are almost the same. They diverge in their focus on specifics. Computer Science programs tend to emphasize more on the theories, data structures, modeling, and algorithms, etc. In contrast, Software Engineering programs focuses more on the practical aspects that are needed in the industry such as problem analysis, software design, software testing, software quality, software process, and project management, etc. While both CS and SWE programs advocate teamwork but in most CS programs, teamwork is recommended but in SWE it is a requirement. Almost all SWE programs also require students to have a Capstone project in their last year where students work on “real projects” given by the industry.

According to data from IT industry, about 75% of software engineers work in software companies such as Microsoft, Google, Facebook, IBM, Oracle etc. About 15% work for government agencies and 10% work as consultants or independent contractors. In small companies, software engineers do many things, from meeting users and customers to write code and test. In larger companies, software engineers are often assigned certain roles in projects depending on their experiences. These roles are requirements analysts, architects, designers, developers, testers, quality assurance, configuration managers, and project managers etc.

To work as software engineer, students must have at least a bachelor degree from an accredited university in either Software Engineering or Computer Science; be able to demonstrate skills in programming as well as knowledge of software development lifecycle and software tools. Soft-skills are very important in this career and foreign language is important for more advancement. For example today, many large software projects are globally distributed based on a concept called “Following the Sun” where development works are done 24 hours and 7 days a week with team members located in several countries, having a second language such as English is required to be on those teams. Among all the careers with the Information Technology field, software engineer have the highest salary and more special benefits. Imagine that a software engineer who work for Google fifteen years ago when they started; or Facebook five years ago; or Instagram few months ago before the acquisition. Today with hundreds of startups, the opportunities are endless.