25 Jun, 2021
Kĩ nghệ phần mềm: cái nhìn của sinh viên
Zhang Kai Min là một trong những sinh viên của tôi đã tốt nghiệp năm 2010 và hiện đang làm việc tại Apple. Tuần trước anh ấy quay lại trường để tuyển sinh viên và đã cho bài nói chuyện cho lớp Kĩ nghệ phần mềm của tôi. Sau đây là câu chuyện của anh ấy:
“Khi tôi tốt nghiệp bằng cử nhân trong Khoa học máy tính (CS) ở Trung Quốc, tôi có kĩ năng là một người lập trình giỏi nhưng khi tôi ghi danh vào Thạc sĩ Khoa học Kĩ nghệ phần mềm (SE) tại Carnegie Mellon, tôi nhận ra rằng tôi vẫn có nhiều điều cần học để là một kĩ sư phần mềm. Trước khi tới CMU, tôi nghĩ CS và SE là như nhau nhưng bây giờ tôi biết rằng chúng không như nhau.
Là một người tốt nghiệp CS, tôi biết cách viết mã và có kĩ năng xây dựng sản phẩm phần mềm. Xem một phần của các dự án nhà trường, tôi đã phát triển ba ứng dụng di động, chúng làm việc tốt và tôi tự hào về công việc của tôi. Khi tôi tới CMU, tôi thấy rẳng phần lớn bạn học của tôi đã xây dựng nhiều app di động phức tạp và phần mềm tinh xảo hơn app di động. Khi tôi chỉ cho họ các app di động của tôi, họ chỉ cho tôi điều họ đã xây dựng như dự án nhà trường và tôi choáng về mức độ phức tạp. Họ bảo tôi: “Học sinh trung học xây dựng app di động; sinh viên đại học phải xây dựng phần mềm lớn và phức tạp.” Điều đó làm cho tôi cảm thấy khó chịu nhưng tôi cũng biết rằng tôi có nhiều điều phải học để đuổi kịp họ.
Tôi học nhanh chóng về khác biệt giữa người lập trình và kĩ sư phần mềm. Người lập trình thường làm việc một mình và xác định chất lượng dựa trên điều người đó nghĩ là tốt. Người kĩ sư phần mềm không bao giờ làm việc một mình mà bao giờ cũng trong tổ và họ xác định chất lượng bằng việc dựa trên người dùng thấy nó thế nào. Người lập trình làm bất kì cái gì người đó thích chừng nào người đó còn làm cho phần mềm làm việc nhưng người kĩ sư phần mềm bao giờ cũng tuân theo qui trình để chắc rằng phần mềm đáp ứng yêu cầu của người dùng. Lớp đầu tiên của tôi là về vòng đời phát triển phần mềm nơi tôi học về qui trình, phương pháp, và khuôn khổ, tất cả đều là mới với tôi. Chỉ thế rồi tôi mới học cách tuân theo qui trình hệ thống của việc hiểu yêu cầu, làm việc với khách hàng, và phát triển giải pháp đáp ứng cho nhu cầu của họ.
Phần lớn các môn học tại CMU đều yêu cầu làm việc tổ; tôi đã học cách làm việc với những người khác và đã học nhiều từ họ. Ở Trung Quốc, sinh viên thường tự học một mình và đôi khi tôi hoang mang và thất vọng nhưng tôi không thể hỏi xin giúp đỡ được. Tại CMU, các bạn trong tổ sẵn sàng giúp đỡ và động viên tôi khi tôi học những điều mới. Ở Trung Quốc, tôi được dạy duy trì tính ganh đua và giữ mọi thứ cho bản thân tôi. Tôi không chia sẻ cái gì với bạn cùng lớp vì tôi sợ rằng họ sẽ giỏi hơn tôi. Chúng tôi đã là bạn bè ở trường nhưng là đối thủ trong kì thi vì mọi người đều muốn là sinh viên hàng đầu. Điều đó là khác ở đây; có bầu không khí cộng tác nơi mọi người chia sẻ mọi thứ một cách cởi mở. Khi tôi gặp khó khăn các bạn cùng lớp sẽ dành hàng giờ thậm chí hàng ngày để giúp tôi mà không ngần ngại gì. Chúng tôi không ganh đua nhưng cộng tác và đó cũng là điều mới nữa.
Tôi phải mất vài tháng để học cách xây dựng phần mềm chất lượng, không chỉ làm việc với phần mềm. Tôi cũng học được rằng chất lượng còn nhiều hơn điều khách hàng đòi hỏi trong yêu cầu nhưng bạn phải suy dẫn ra chúng dựa trên tri thức của bạn vì khách hàng mong đợi chúng. Phần lớn khách hàng sẽ nói cho bạn về yêu cầu chức năng nhưng không nói về chất lượng điều là đặc trưng phi chức năng. Người kĩ sư phần mềm giỏi phải hiểu những thuộc tính chất lượng này như tính dùng được, tính đổi qui mô được, tính bảo trì được, và tính kiểm thử được. Khách hàng có thể không nói cho bạn về hiệu năng nhưng bạn phải chắc hệ thống sẽ thực hiện tương ứng. Khách hàng có thể không nói cho bạn về tính bảo trì được nhưng bạn phải chắc rằng hệ thống được làm tài liệu đúng cho bảo trì tương lai.
Điều quan trọng nhất tôi đã học được từ giáo sư Vũ là không bao giờ dừng việc học. Thầy thường nói rằng công nghệ thay đổi nhanh chóng và là người kĩ sư phần mềm chuyên nghiệp, chúng ta phải giữ việc học bắt kịp với công nghiệp nhịp độ nhanh này. Tôi đã học đặt mục đích về điều tôi muốn học và theo dõi tiến bộ của tôi qua thời gian. Thầy bao giờ cũng nhắc nhở lớp bằng việc hỏi: “Các em có tiến gần hơn tới mục đích của các em không?” Vì thầy nói điều đó thường xuyên tới mức nhiều sinh viên thường đùa: “Ở đây thầy lại nói nữa, lặp lại cùng điều.” Nhưng dưới hướng dẫn của thầy, tất cả chúng tôi đã học được những kĩ năng cần thiết để đạt tới mục đích của chúng tôi.
Điều khác tôi thích là phương pháp học tích cực. Điều này là hoàn toàn mới với tôi vì tôi quen thuộc với việc ghi nhớ thuộc lòng và nhiều lí thuyết hàn lâm. Tôi phải mất nhiều tháng mới thay đổi được thói quen học tập vì tôi phải đọc mọi tài liệu trước khi tới lớp và chuẩn bị tham gia vào thảo luận trong lớp. Là một người nước ngoài với tiếng Anh giới hạn, tôi thường yên tĩnh nhưng tôi bị gọi phải trả lời các câu hỏi mọi lúc. Đầu tiên tôi nghĩ giáo sư không thích tôi nhưng qua thời gian, tôi biết rằng thầy muốn giúp tôi xây dựng kĩ năng tham dự và kĩ năng trao đổi của tôi. Chỉ bằng việc không sợ hãi và không sợ phạm sai lầm, tôi thu được tự tin và bằng việc có kĩ năng kĩ thuật và kĩ năng mềm tốt, tôi không có vấn đề gì với việc có được việc làm tại Apple.
—English version—
Software Engineering: A student’s view
Zhang Kai Min was one of my students who graduated in 2010 and currently working at Apple. Last week he came back to school to recruit students and gave a talk in my Software Engineering class. Following was his talk:
“When I graduated with a Bachelor’s degree in Computer Science (CS) from China, I had the skills to be a good programmer but when I enrolled in the Master of Science in Software Engineering (S.E) at Carnegie Mellon, I realized that I still had a lot to learn about being a software engineer. Before came to CMU, I thought CS and SE are the same but now I know that they are not.
As a CS graduate, I know how to code and have the skills to build software products. As part of the school projects, I have developed three mobile applications, they worked well and I was proud of my work. When I came to CMU, I found that most of my classmates have built more complex and sophisticated software than mobile apps. When I showed them my mobile apps, they showed me what they have built as school projects and I was shock on the level of complexity. They told me: “High school students build mobile apps; college students should build complex and larger software.” That made me feel bad but I also knew that I had more to learn to catch up with them.
I learned quickly about the difference between a programmer and a software engineer. A programmer often works alone and defines quality based on what he thinks is good. A software engineer never works alone but always in team and they define quality based on how users see it. A programmer does whatever he likes as long as he makes the software works but a software engineer always follow a process to make sure that the software meets users’ requirements. My first class was the software development life cycle where I learned about process, methods, and frameworks which were all new to me. Only then I learned how to follow a systematic process of understanding requirements, working with customers, and developing solution that meets their needs.
Most courses at CMU require teamwork; I learned how to work with others and learned a lot from them. In China, students often learn things by themselves and sometime I am confused and frustrated but I could not ask for help. At CMU, my teammates were ready to help and motivated me while I learned new things. In China, I was taught to stay competitive and kept thing to myself. I did not share anything with classmates as I was afraid that they would be better than me. We were friends at school but adversaries in exams as everyone wanted to be the top student. It was difference here; there was a collaborative atmosphere where people share everything openly. When I had difficulty my classmates would spent hours or even days to help me without any hesitation. We do not compete but collaborate and it is also a new thing too.
It took me several months to learn how to build quality software, not just working software. I also learned that quality was more than what customers asked in requirements but you must derive them based on your own knowledge because customers expect them. Most customers would tell you about functional requirements but not about quality which are nonfunctional characteristics. A good software engineers must understand these quality attributes such as usability, scalability, maintainability, and testability. Customers may not tell you about performance but you must make sure the system will perform accordingly. Customers may not tell you about maintainability but you must make sure that the system was documented correctly for future maintenance.
The most important that I learned from Professor Vu is never stop learning. He often said that technology changes fast and as professional software engineers, we must keep on learning to keep up with the fast-paced industry. I learned to set goals about what I wanted to learn and tracked my progress over time. He always reminded the class by asking: “Are you getting closer to your goal?” As he did it so often that many students often joked: “Here he goes again, repeating the same thing.” But under his guidance, we all learned the skills necessary to reach our goals.
Another thing that I like was the active learning method. This was completely new to me as I am familiar with the rote memorization and a lot of academic theories. It took me many months to change the study habit as I must read all materials before coming to class and prepared to participate in discussion during class. As a foreigner with limited English, I was often quiet but I was called in to answer questions all the time. First I thought the professor did not like me but overtime, I learned that he wanted to help me to build my participating skills and communication skills. Only by being fearless and not afraid of making mistakes, I gain confident and by having a good technical and soft-skills, I have no problem of getting a job at Apple.