Bạn thực sự cần gì?

Trong vài tuần qua sau khi năm học mới bắt đầu, nhiều sinh viên “năm thứ nhất” tới hỏi tôi: “Là sinh viên phần mềm, em cần học môn nào trước khi lấy bằng tốt nghiệp? Em có cần học các lớp không phải máy tính để cho em có thể có việc làm tốt khi em tốt nghiệp không?” Thông thường bạn nhận được loại câu hỏi này từ sinh viên năm thứ ba, KHÔNG phải là ai đó mới bắt đầu vào trường vài tuần trước. Dường như là sau cuộc khủng hoảng tài chính, sinh viên đang chú ý nhiều hơn tới chọn lựa về học tập của họ và tới thị trường việc làm hơn là trước đây. Sau đây là gợi ý của tôi:

“Có vài môn ngôn ngữ lập trình mà bạn có thể học. Phần lớn các sinh viên bắt đầu với Java hay C++ nhưng nếu tôi là bạn, tôi sẽ lấy lớp học lập trình C trước tiên. Tôi hiểu rằng thị trường ngày nay phần lớn yêu cầu các ngôn ngữ Java, C++, và C# nhưng C có ưu thế mà các ngôn ngữ khác không có. Theo quan điểm của tôi, C là nền tảng cho lập trình vì nó gần với phần cứng hơn các ngôn ngữ khác. Khi hệ thông tin ngày càng lớn hơn và phức tạp hơn, bạn quả có cần phát triển mã hiệu quả, đặc biệt trong phần mềm nhúng, cho nên bạn phải biết C. Ngôn ngữ này sẽ cho phép bạn đi vào mức trình biên dịch và hệ điều hành để đảm bảo rằng mã làm việc tốt. Nếu bạn có thể làm chủ ngôn ngữ lập trình C, C++, C# và Java sẽ dễ học hơn nhiều.”

“Bên cạnh ngôn ngữ lập trình chính là nền tảng của khoa học máy tính, kĩ nghệ phần mềm và quản lí hệ thông tin, bạn phải biết rõ vòng đời phát triển phần mềm. Bạn phải hiểu khác biệt giữa vòng đời Thác đổ, vòng đời Xoáy ốc, vòng đời Phát triển gia tăng v.v. và biết vòng đời nào là phù hợp cho dự án đặc thù nào. Bạn nên hội tụ vào đầu thượng của vòng đời bằng việc lấy môn kĩ nghệ yêu cầu và môn kiến trúc và thiết kế trước khi tốt nghiệp và xây dựng kĩ năng của bạn trong việc thu lấy và phân tích yêu cầu người dùng. Nhiều sinh viên ưa thích dành nỗ lực của họ vào đầu hạ của vòng đợi bằng việc học nhiều về các môn viết mã và kiểm thử. Tôi biết rằng sinh viên không thích môn kĩ nghệ yêu cầu hay môn kiến trúc & thiết kế vì họ nghĩ chúng không “đủ kĩ thuật” khi so với các môn Java hay C++. Ngược lại, khi họ làm việc, họ sẽ biết rằng yêu cầu và kiến trúc là kĩ năng quan trọng nhất mà công nghiệp cần. Bởi vì những môn này hội tụ chủ yếu vào trao đổi với người dùng và khách hàng cho nên sinh viên cần học chúng đủ nghiêm túc.”

“Với một số sinh viên, “việc làm lí tưởng” là việc làm cho phép họ viết mã. Nhiều người KHÔNG thích nói chuyện với người khác, nếu họ phải nói thì gửi văn bản tin nhắn và email là chọn lựa của họ. Trong công nghiệp, người có quyền lực nhất và có ảnh hưởng tới người khác và rất có thể được đề bạt làm người quản lí là người có thể trao đổi rõ ràng và thoải mái với khách hàng. Điều then chốt trong chọn người quản lí dự án là KHÔNG dựa vào bao nhiêu ngôn ngữ lập trình mà người đó biết, bao nhiêu dòng mã người đó có thể sinh ra trong một giờ, mà là người đó có thể trao đổi tốt tới đâu. Bằng việc hiểu nhu cầu của khách hàng và có khả năng viết chúng ra một cách rõ ràng trong đặc tả yêu cầu, họ cho phép người khác làm công việc và lập trình mã của họ một cách đúng đắn. Với yêu cầu được viết ra kém và thường xuyên thay đổi, mã hoàn hảo là vô giá trị. Bằng cách kiến trúc và thiết kế tốt, họ cho phép người khác hình dung ra mã của họ được giả định làm gì, họ phải thực hiện hàm nào trước, và họ phải xem xét tới thuộc tính chất lượng nào để xây dựng phần mềm tương ứng. Với kiến trúc và thiết kế tồi, mã tốt chả có giá trị gì.”

“Nhiều đại học có đưa ra các lớp “viết tài liệu kĩ thuật” và bạn nên học chúng. Tôi biết rằng các lớp này yêu cầu viết nhiều nhưng bạn cần phát triển kĩ năng viết cho dù bạn làm việc trong lĩnh vực kĩ thuật. Có nhiều việc đọc, viết và trao đổi trong công nghiệp phần mềm hơn là bạn có thể hình dung cho nên bạn cần phát triển những kĩ năng này bất kì khi nào bạn có thể làm. Nhiều công ti phần mềm KHÔNG thuê người phát triển chừng nào họ không thể đọc, viết và trao đổi tốt bằng việc biểu lộ điều đó trong các cuộc phỏng vấn việc làm. Kĩ năng rất quan trọng khác mà bạn cũng phải có là biết ít nhất một ngoại ngữ như tiếng Anh.”

“Là sinh viên kĩ thuật, bạn có lẽ không lấy các môn về doanh nghiệp, kinh doanh. Đây là một sai lầm lớn, mặc dầu trường có thể KHÔNG yêu cầu nó. Tôi gợi ý rằng bạn nên lấy các môn doanh nghiệp cơ sở để cho bạn hiểu khái niệm về các qui tắc kế toán, tài chính và doanh nghiệp như cung và cầu, ưu thế cạnh tranh, giá trị doanh nghiệp v.v.. cho nên bạn sẽ biết cách doanh nghiệp làm việc bởi vì một ngày nào đó bạn có thể trở thành người quản lí dự án, người quản lí chương trình, giám đốc thông tin (CIO) và có thể sở hữu công ti riêng của mình và bạn phải có những kĩ năng này. Ngày nay, kĩ năng kĩ thuật là KHÔNG đủ, bạn phải có kĩ năng doanh nghiệp để sống còn trong môi trường cạnh tranh cao này.”

“Để có được việc làm tốt hơn khi tốt nghiệp bạn cần biết rằng phần lớn các công ti phần mềm KHÔNG chỉ nhìn vào thành tựu hàn lâm mà còn vào cả các hoạt động “phi hàn lâm”. Kinh nghiệm là yếu tố cốt yếu trong quyết định thuê người cho nên thay vì tận hưởng vài tháng nghỉ ở nhà và tận hưởng những bữa ăn do mẹ nấu, bạn nên làm việc mùa hè để thu được kinh nghiệm dù bạn có được trả lương hay không. Công việc mùa hè tốt nhất là làm việc tập trung tại công ti phần mềm nơi bạn học nhiều hơn về tương lai cũng như công ti biết điều gì đó về bạn. Nếu bạn không thể tìm được việc làm với công ti phần mềm thì bất kì việc gì với công ti không phần mềm cũng sẽ tốt, miễn là bạn thu được cái gì đó liên quan tới lĩnh vực học tập của mình. Bạn có thể thiết kế website cho ngân hàng địa phương, lập trình cho ứng dụng cho doanh nghiệp xuất/nhập khẩu nhỏ v.v. bất kì cái gì giúp bạn đưa vào bản lí lịch của mình rằng bạn có kinh nghiệm làm việc. Là sinh viên công nghệ thông tin, sai lầm lớn nhất bạn có thể mắc là làm bất kì loại việc nào trong mùa hè không liên quan tới lĩnh vực của bạn cho dù bạn có thể làm ra nhiều tiền. Tôi biết việc bán hàng trả nhiều tiền hơn và bạn có thể ăn mặc đẹp trong văn phòng thuyết phục mọi người mua cái gì đó nhưng bạn sẽ đưa vào bản lí lịch của mình cái gì khi bạn tốt nghiệp? Bạn có cho rằng công ti phần mềm sẽ chọn một ứng cử viên với bản lí lịch liệt kê: “bán tủ lạnh, bán ti vi và DVDs, bán quần áo” hay bản lí lịch liệt kê rằng: “Lập trình cho ứng dụng kế toán cho doanh nghiệp nhỏ, thiết kế website cho ngân hàng địa phương nhỏ.”

 

—-English version—-

 

What do you really need?

In the past few weeks after the new school year started, several “first-year” students came to ask me: “As a Software students, what courses do I need to take before graduation? What other non-computer classes that I need to take so I can have good job when I graduate?”. Usually you receive this kind of questions from third year students, NOT someone just start school few weeks ago. It seems that after the financial crisis, students are paying more attention to their choices of study and the job market than ever before. Following are my suggestions:

“There are several programming languages courses that you could take. Most students start with Java or C++ but if I were you, I would take the C programming class first. I understand that today market requires mostly Java, C++, and C# languages but C has the advantages that others do not. From my view, C is the foundation of programming because it is closer to the hardware than other languages. As information systems are getting larger and more complex, you do need to develop efficient code, especially in the embedded software, so you must know C. This language will allow you to go to the level of compilers and operating systems to ensure that the code works well. If you can master C programming language, C++, C# and Java would be much easier to learn”.

“Beside programming language which is the foundation of Computer Science, Software Engineering and Information System Management, you must know the software development life cycle well. You must understand the differences between the Waterfall lifecycle, the Spiral Lifecycle, the Incremental Built Lifecycle, etc. and know which one would be suitable for which particular project. You should focus on the front-end of the lifecycle by taking the requirements engineering and the architect and design courses before graduate and build your skills in obtaining and analyzing users’ requirements. Many students prefer to spend their efforts on the back-end of the Lifecycle by taking more coding and testing courses. I know that students do not like the requirements engineering course or the architect & design course because they think they are not “Technical enough” as compare with the Java or C++ courses. On the contrary, when they work, they will learn that requirements and architect are the most important skills that the industry need. Because these courses focus mostly on communication with users and customers so students do take them seriously enough”

“To some students, the “ideal job” is the job that allows them to write code. Many do NOT like to talk to people, if they have to, texting and email are their choices. In the industry, the person that have the most power and influence over others and likely being promoted to manager is the one who can communicate clearly and comfortably with customers. The key in selecting project manager is NOT on how many programming languages a person know, how many lines of code a person can generate in an hour, but how well can a person communicate. By understand what customers’ needs and be able to write them clearly in requirements specs, they allow others to do their works and program their codes correctly. With poorly written and constantly change requirements, perfect code is worthless. By architect and design well, they allow others to figure out what their code is supposed to do, which function they must implement first, and what quality attributes they must consider to build their software accordingly. With bad architect and design, good code has no value”.

“Many colleges do offer classes in “Technical writing” and you should take them. I know that these classes require a lot of writings but you do need to develop writing skill even you work in the technical field. There are so many readings, writings and communicating in the software industry than you can imagine so you need to develop these skills whenever you can. Many software companies do NOT  hire developers unless they can read, write, and communication well by demonstrate them during job interviews. Another very important skill that you also must have is knowing at least one foreign language such as English”.

“As technical students, you probably do not have to take business courses. This is a big mistake, although the school may NOT require it. I do suggest that you take some basic business courses so you understand the concept of accounting, finance and business rules such as supply and demand, competitive advantage, business values etc. so you will know how the business works because someday you may become project managers, product managers, Chief Information Officers (CIO) and maybe own a company and you must have these knowledge. Today, technical skill is NOT enough, you must also have business skill to survive in this highly competitive environment”.

“To get a better jobs when graduate you need to know that most software companies do NOT only look at academic achievement but also “Non-academic” activities. Experience is critical factor in the hiring decision so instead of enjoy few months vacation at home and enjoy mother’s cooking meals, you should work in the summer to get the experience whether you get pay or not. The best summer job is the internship at a software company where you learn more about your future prospective as well as the company know something about you. If you cannot find jobs with software company then any works with non-software companies would be fine, as long as you are gaining something relate to your field of study. You may design a website for a local Bank, program an application for a small import/export business etc. anything that help you to put in your resume that you have work experiences. As information technology students, the biggest mistake you can make is to take any kind of job in the summer that is not relate to your field even you may make more money. I know sale jobs pay more and you can dress nicely in an office convincing people to buy something but what do you put on your resume when you graduate? Do you think a software company would select a candidate with a resume that lists: “selling refrigerators, selling TV and DVDs, selling clothes” or a resume that lists: “Programming a accounting application for a small business, design a website for a small local bank”