Phần lớn sinh viên học về lí thuyết ở trường. Lí thuyết là những thứ như khái niệm hướng đối tượng, trừu tượng dữ liệu, thiết kế cơ sở dữ liệu, và các thuộc tính chất lượng của kiến trúc phần mềm. Lí thuyết là dễ thảo luận, dễ học nhưng khó kinh nghiệm. Phần lớn sinh viên học lí thuyết nhưng chỉ có ý niệm mơ hồ về nó. Họ thường không biết cách nó làm việc hay cách áp dụng nó. Đó là lí do tại sao họ cần thực hành. Đó là lí do tại sao các trường có bài tập, bài về nhà và phân công nhiệm vụ cho họ để áp dụng điều họ học vào thực hành.

Khi sinh viên biết lí thuyết nhưng không có thực hành, họ nghĩ rằng họ biết cái gì đó. Tâm trí của họ có thể đầy ý tưởng về cách phần mềm được giả định làm việc. Chừng nào họ còn chưa áp dụng nó, họ không có kinh nghiệm. Chẳng hạn dễ nói về lỗi và khiếm khuyết những làm sao giải quyết được lỗi là vấn đề khác. Cho tới khi bạn viết mã, khám phá lỗi và biết rằng một ứng dụng thiếu cách giải quyết lỗi mang tính định mệnh thì bạn mới đánh giá được lí thuyết về giải quyết lỗi. Chỉ bằng thực hành bạn mới biết rằng có “chức năng giải quyết lỗi” này là quan trọng. Đó là chỗ kinh nghiệm bước vào.

Kinh nghiệm là về việc phạm sai lầm. Khi bạn học lí thuyết không có sai lầm: mọi mã đều không có lỗi, mọi giao diện đều dễ làm, và không hệ thống phần mềm nào đã bao giờ bị hỏng. Nó là logic thế và hiển nhiên thế. Trong thực tế, mọi mã đều có khiếm khuyết yêu cầu nhiều nỗ lực để sửa. Phần lớn các giao diện bao giờ cũng yêu cầu nhiều thời gian để thực hiện. Việc hỏng phần mềm thường xảy ra trong kiểm thử v.v.. Đó là lí do tại sao trong đào tạo phần mềm, sinh viên không thể học được từ sách vở hay bài giảng mà phải làm bài tập về nhà, bài luyện v.v. Khi sinh viên học môn ngôn ngữ lập trình, họ phải viết mã. Không có ngoại lệ.

Với sinh viên phần mềm, bạn càng phạm nhiều sai lầm, bạn càng khá hơn. Sinh viên phần mềm phạm sai lầm nhưng mỗi sai lầm đều thêm một bài học nữa cho kinh nghiệm của họ. Kinh nghiệm chỉ có thể thu được bằng việc làm thực tại. Để giỏi hơn trong lập trình, bạn phải viết mã và phạm sai lầm. Không có cách khác. Bạn càng có nhiều kinh nghiệm, bạn càng làm công việc tốt hơn và bạn càng trở nên giỏi hơn. Sinh viên phải hiểu rằng lí thuyết và kinh nghiệm là kĩ năng. Lí thuyết là nền tảng nơi bạn xây dựng kĩ năng của bạn. Bạn không thể phát triển kĩ năng mà không có tri thức. Đó là lí do tại sao giáo dục và đào tạo là cần cho mọi người phát triển phần mềm.

Có những người chỉ học “lối tắt” và “thủ thuật”. Họ không muốn dành thời gian để thu nhận tri thức. Họ chỉ muốn học làm vài điều. Họ có thể học lập trình mà không có lí thuyết hay nền tảng. Họ có thể viết mã chạy tốt nhưng khó bảo trì. Mục đích của họ chỉ là làm cho mã chạy nhưng họ không chăm nom tới việc thay đổi hay bảo trì. Họ có thể phát triển phần mềm trong dự án nhỏ nơi viết mã là hoạt động chính. Họ không có kĩ năng làm việc trong các dự án lớn hơn hay phức tạp hơn. Dự án lớn yêu cầu kiến trúc và thiết kế. Vì mục đích của thiết kế dựa nhiều vào lí thuyết để xây dựng hệ thống phức tạp, mở rộng được, dễ hiểu, dễ bảo trì với mọi thuộc tính chất lượng được bao hàm. Hệ thống phần mềm tuỳ thuộc vào nền tảng và tri thức của kĩ sư phần mềm. Tri thức càng tốt, thiết kế càng tốt và kĩ năng càng tốt, nó càng thanh thoát hơn.

Người lập trình với kĩ năng giới hạn không thể xây dựng được hệ thống như vậy. Họ bị giới hạn vào viết mã và kiểm thử. Họ là công nhân nhưng chưa bao giờ là kiến trúc sư, người thiết kế hay người quản lí dự án. Hệ thống thiếu thiết kế sẽ thường xuyên bị hỏng, nó sẽ khó bảo trì. Hệ thống càng lớn, vấn đề càng trở nên tồi tệ. Có nhiều hệ thống như vậy ngày nay, mã của chúng tệ tới mức không ai muốn bảo trì. Không ai hiểu nó được thực hiện ra sao. Khi kiểm điểm những hệ thống này, bạn có thể thấy rằng nó bao gồm hàng nghìn dòng mã nhảy lung tung qua lại mà không có chức năng logic. Rất dễ biết rằng nó được công nhân thiết kế ra chứ không phải kiến trúc sư.

Khi hệ thống trở nên ngày càng lớn hơn và phức tạp hơn, công nghiệp phần mềm cần nhiều người phần mềm có giáo dục và đào tạo tốt. Công nghiệp cần nhiều người với cả nền tảng về lí thuyết và kĩ năng thực hành. Công nghiệp phần mềm cần những người này bởi vì phần mềm kiểm soát nhiều thứ thế, và lỗi có thể có hậu quả tồi tệ và có thể làm mất mạng người. Đó là lí do tại sao các công ti sẵn lòng trả lương nhiều hơn cho những người này.

—-English version—-

Theory and practice

Most students learn about theory in school. Theory is things like object-oriented concepts, data abstraction, database design, and quality attributes of software architecture. Theory is easy to discuss, easy to learn but difficult to experience. Most students learn theory but only have a vague idea about it. They often do not know how it work or how to apply it. That is why they need practices. That is why schools have exercises, homeworks and assignments for them to apply what they learn into practice.

When students know theory but have no practice, they think that they know something. Their mind maybe full of ideas in the ways of software supposed to work. Until they apply it, they do not have the experience. For example it is easy to talk about errors and defects but how to handle error is different issue. Until you code, discover errors and know that an application that lacks error handling is fatal then you appreciate the theory of error handling. Only by practice you know that having this “error handling function” is important. That is where experience comes in.

Experience is about making mistakes. When you study theory there are no mistakes: all codes have zero error, all interface are easy to do, and no software systems ever crash. It is so logic and so obvious. In reality, all codes have defects that require a lot of efforts to fix. Most interfaces always require more time to do. Software crash often during testing etc. That is why in software trainings, students cannot learn from books or lectures but must do homeworks, exercises etc. When students take programming languages course, they must write code. There is no exception.

For software students, the more mistakes you make, the better you are. Software students make mistakes but each mistake added one more lesson to their experience. Experience can only be gained by actually doing. To be better at programming, you must write code and make mistakes. There is no other way. The more experience you have, the better you do the work and the better you become. Students must understand that theory is the knowledge and experience is the skills. Theory is the foundation where you build your skills. You cannot develop the skills without knowledge. That is why education and training are needed for all software developers.

There are people who only learn “short cuts” and “tricks”. They do not want to spend time acquiring the knowledge. They only want to learn to do few things. They can learn programming without theory or foundation. They can write code that runs well but is difficult to maintain. Their goal is only to make the code works but they do not care about change or maintain. They can develop software in small project where coding is the main activity. They do not have the skills to work in larger or more complex projects. Large projects require architect and design. Since the goal of design relies a lot on theory to build system that is complex, extensible, easily-understood, easy to maintain with all the quality attributes included. Software system depends on the foundation and knowledge of the software engineer. The better knowledge, the better the design and the better the skills, the more elegant it is.

A programmer with limited skills cannot build system like that. They are limited to coding and testing. They are workers but never architect, designer or project manager. A system lacking in design will crash often, it will be difficult to maintain. The larger the system, the worse the problem becomes. There are many system like that today, their code is so bad that no one want to maintain. No one will understand how it was done. When reviewing these systems, you can see that it consisted of thousand lines of code jumping back and forth with no logical functions. It is very easy to tell that it is designed by workers not architect.

As more system become larger and more complex, software industry needs more software people with good education and training. Industry needs more people with both foundation of theory and practical skills. Software industry needs these people because software controls so many things, an error can have bad consequences and possible human life. That is why companies are willing to pay more for these people.