27 Jan, 2021
Lời khuyên cho sinh viên khoa học máy tính
Một sinh viên viết cho tôi: “Là sinh viên năm thứ nhất về khoa học máy tính, em bị lẫn lộn bởi vài ngôn ngữ lập trình. Bạn em bảo em rằng em nên học PHP và Java. Trường em chỉ dạy Java. Em nên học ngôn ngữ nào bây giờ? Em có nên theo học thêm lớp đào tạo đặc biệt về các ngôn ngữ khác không? Xin thầy lời khuyên.”
Đáp: Tôi đã trả lời câu hỏi này nhiều lần trước rồi. Xin đọc lại các câu trả lời trước vì mỗi năm, tôi thường nhận được vài câu hỏi về ngôn ngữ lập trình. Sự kiện là các ngôn ngữ nào đó là hiện thời “nóng” không nên ảnh hưởng tới mục đích học tập dài hạn của bạn. Ngôn ngữ tới rồi đi, ở lại lâu hơn chút ít nhưng cuối cùng chúng sẽ bị thay thế khi công nghệ thay đổi. Đừng lẫn lộn giữa các ngôn ngữ lập trình với các khái niệm nền tảng mà bạn đang học trong trường bây giờ. Chúng là nền tảng nơi bạn sẽ xây dựng nghề nghiệp của bạn trên đó.
Là sinh viên khoa học máy tính năm thứ nhất, bạn sẽ học các ngôn ngữ lập trình như C++ hay Java bởi vì chúng là phổ biến bây giờ. Một khi bạn học một ngôn ngữ rồi, rất dễ dàng để học ngôn ngữ khác và bạn không cần đào tạo đặc biệt. Là sinh viên đại học, bạn sẽ được dạy cho các khái niệm nền tảng về lập trình như hướng đối tượng, hàm hay thủ tục v.v. Bạn phải hiểu những khái niệm, hình mẫu, cấu trúc dữ liệu và logic nào đó vì chúng sẽ cho bạn nền tảng mạnh để làm việc với bất kì ngôn ngữ tương lai nào. Bạn cần biết về vòng đời phát triển như thác đổ, mau lẹ agile, xoáy ốc v.v. Bạn cũng cần biết về những cách tiếp cận phát triển nào đó như cấu trúc, scrum, lập trình cực đoan, lập trình song song v.v.
Tôi tin sinh viên cần biết ngôn ngữ cơ bản C hay C++ vì nó là nền tảng. Nó sẽ giúp bạn biết nhiều hơn về mối quan hệ giữa phần cứng và phần mềm như sử dụng bộ nhớ v.v. Ngày nay, nhiều ứng dụng trong môi trường Web yêu cầu Java, C# và Dot.Net. Có nhiều ngôn ngữ mới hơn như Python, Ruby, Ajax, PHP, JS, CSS (nếu bạn thích chọc ngoáy) nhưng nếu bạn đã biết C++ hay Java thì bạn có thể học các ngôn ngữ này trong vài tuần.
Để là người lập trình giỏi hơn, xin nhớ rằng vấn đề không phải là về nhiều ngôn ngữ bạn biết mà là cách bạn viết mã. Bạn phải học về “viết mã an ninh” bằng việc đưa an ninh vào đầu tiên khi viết mã. Nếu bạn dùng cơ sở dữ liệu, học cách tránh việc nhồi lệnh SQL. Nếu bạn chấp nhận cái vào của người dùng, học cách tránh bị tràn bộ đệm. Vì không ai làm việc một mình thêm nữa, bạn phải phát triển cách viết mã sạch và bảo trì được. Phải chắc rằng bạn có lời chú thích, tên biến viết rõ để người khác có thể hiểu được logic của bạn khi họ kiểm điểm hay bảo trì mã của bạn.
Nếu bạn thích làm việc trong môi trường phát triển web, bạn cần biết rõ Java, C#, Dot.Net và JavaScript. Ngày nay dường như có thể Ruby và Python đang thay thế PHP cho web. Nếu bạn thích môi trường nền di động, phải chắc rằng bạn học về iOS, Java, Objective C cho Apple và Java và JavaScript cho Android. Khu vực nóng khác là Web 2.0 yêu cầu kĩ năng trong Adobe Flex, JavaScript, Adobe Flash, AJAX và JavaScript Object Notation.
Bên cạnh kĩ năng kĩ thuật, xin hội tụ vào “kĩ năng mềm” như lắng nghe, trao đổi, làm việc tổ, cộng tác, và nếu có thể thì lấy một hay hai môn doanh nghiệp phụ. Ngày nay các công ti sẽ tìm kiếm người tốt nghiệp máy tính hiểu được doanh nghiệp và có thể thảo luận, trao đổi các vấn đề kĩ thuật với người doanh nghiệp và khách hàng. Nhiều công ti toàn cầu cũng yêu cầu ít nhất một ngoại ngữ (ưa chuộng là tiếng Anh), tri thức về tài chính, kĩ năng lãnh đạo và tri thức nào đó về toàn cầu hoá. Nhiều sinh viên khoa học máy tính tin rằng “Máy tính là tất cả về kĩ năng kĩ thuật, KHÔNG phải vậy đâu.” Để xây dựng nghề nghiệp trong lĩnh vực này, bạn cần nhiều hơn chỉ là kĩ năng kĩ thuật. Bạn phải trao đổi tốt cả bằng miệng và bằng viết. Trong thế giới toàn cầu hoá này, bạn cần kĩ năng nào đó có thể giúp bạn cạnh tranh, thích nghi với những điều kiện thị trường thay đổi nhanh chóng. Bạn phải học nhiều hơn là ngôn ngữ lập trình để sống còn vì chúng ta không còn trong thế kỉ 20 mà trong thế kỉ 21 hay thời đại tri thức, nơi tri thức rộng và kĩ năng sâu là được cần tới.
—-English version—-
Advice to Computer Science student
A student wrote to me: “As a first year student in computer science, I am confused by several programming languages. My friends told me that I should learn PHP and Java. My school only teaches Java. What language should I learn now? Should I take additional special trainings for other languages? Please advise.
Answer: I have answered this question many times before. Please read previous answers since each year, I often receive several questions about programming languages. The fact that certain languages are currently “Hot” should not influence your long term learning goals. Languages come and go, some stay a little longer but eventually they will be replaced as technology changes. Do not confuse programming languages with the fundamental concepts that you are learning in school now. They are the foundation where you will build your career on.
As first year computer science student, you will learn programming languages such as C++ or Java because they are popular now. Once you learn one language, it is very easy to learn another and you do not need special trainings. As a college student, you will be taught the fundamental concepts of programming such as object oriented, functional, or procedural, etc. You must understand certain concepts, patterns, data structures, and logic as they will give you a strong foundation to work with any future languages. You need to know about development life cycles such as waterfall, agile, spiral etc. You also need to know about certain development approaches such as structure, scrum, extreme programming, parallel programming etc.
I believe students need to know the basic language of C or C++ as it is the fundamental. It will help you to know more about relationship between hardware and software such as memory utilization etc. Today, many applications in the Web environment requires Java, C# and Dot.Net. There are several newer languages such as Python, Ruby, Ajax, PHP, JS, CSS (If you like to hack) but if you already know C++ or Java then you can learn these languages in about few weeks.
To be a better programmer, please remember that it is not about how many language that you know but how do you write your code. You must learn about “secure coding” by put security first when write code. If you are using a database, learn how to avoid SQL injection. If you’re accepting user input, learn how to avoid buffer overruns. Since nobody work alone anymore, you must develop how to write clean and maintainable code. Make sure that you have comment, name variables well so other can understand your logic when they review or maintain your code.
If you like to work in the web development environment, you need to know Java, C#, Dot.Net and JavaScript well. Today it seems like Ruby and Python are replacing PHP for the web. If you like mobile platform environment, make sure that you learn about iOS, Java, Objective C for Apple and Java and JavaScript for Android. Another hot area is Web 2.0 that requires skills in Adobe Flex, JavaScript, Adobe Flash, AJAX and JavaScript Object Notation.
Beside technical skills, please focus on “soft-skills” such as listening, communication, teamwork, collaboration, and if possible take one or two additional business courses. Today most companies will seek computer graduates who understand the business and can discuss, communicate technical things to business people and customers. Many global companies also require at least one foreign language (prefer English), knowledge of finance, leadership skills and certain knowledge about globalization. Many computer science students believe that “Computer is all about technical skills, it is NOT”. To build a career in this field, you need more than just technical. You must communicate well in both orally and in writing. In this globalized world, you need certain skills that can help you to compete, to adapt to rapidly changing market conditions. You must learn much more than programming languages to survive because we are no longer in the 20th century but in the 21st century or the knowledge age, where broader knowledge and deeper skills are needed.