01 Feb, 2021
Cảnh quan hệ thống
Từ đầu thế kỉ 20, các qui trình chế tạo dựa trên “dây chuyền lắp ráp” do Henry Ford tạo ra đã trở thành chuẩn.
Ý tưởng là chia các qui trình phức tạp thành những nhiệm vụ nhỏ nhất và đơn giản nhất để cho công nhân có thể được đào tạo là một cách hiệu lực hơn và hiệu quả hơn. Việc phân đoạn nhiệm vụ này là bản chất vào thời đó do giới hạn của kĩ năng của công nhân lao động và tính hiệu quả cần thiết của ngành công nghiệp ô tô. Henry Ford đã nói: “Cách duy nhất để một nhóm công nhân làm việc trong các qui trình phức tạp như làm xe hơi là cho từng người trong họ một việc để làm và để họ tập trung vào việc làm điều đó một cách hiệu quả và nhanh chóng nhất có thể được.”
Phương pháp này cũng tự biểu lộ nó theo cách mọi người tổ chức mọi sự thành chức năng và chuyên môn hoá. Nó có tác dụng rất tốt trong toàn thế kỉ 20, đặc biệt trong khu vực chế tạo với công nhân lao động thủ công. Tuy nhiên, nó không làm việc tốt trong khu vực công nghệ với công nhân tri thức của thế kỉ 21. Ngày nay, hầu hết công việc yêu cầu tri thức nhiều, đặc biệt công việc công nghệ. Đó là lí do tại sao có lỗ hổng lớn giữa công nhân có kĩ năng và công nhân không kĩ năng. Không may là nhiều công ti CNTT vẫn đang vận hành như khi họ ở trong thế kỉ 20. Họ phân chia công việc thành các nhóm chức năng, từng người chỉ biết một thứ dựa trên công nghệ và nền. Chẳng hạn, mạng, máy phục vụ, cơ sở dữ liệu, máy tính bàn và ứng dụng. Rất ít người biết cách toàn thể hệ thống làm việc và cách nó tác động tới doanh nghiệp. Trong phát triển phần mềm, công nhân bị chia thành nhiều chức năng, từng người được chuyên môn hoá trong một chức năng như lập kế hoạch, thiết kế, viết mã, hay kiểm thử nhưng ít người biết toàn thể công việc phần mềm. Đó là lí do tại sao nhiều dự án thất bại trong khi tích hợp.
Vấn đề với phân đoạn nhiệm vụ là ở chỗ bằng việc chia các qui trình phức tạp thành các nhiệm vụ riêng lẻ, cảnh quan toàn thể bị mất. Công nhân chỉ biết việc làm riêng của họ, chức năng riêng của họ. Bất kì cái gì bên ngoài họ đều không phải là mối quan tâm của họ. Nguyên nhân gốc rễ có thể dõi về hệ thống giáo dục. Các giáo sư hàn lâm nhìn phần mềm và coi lập trình và kiểm thử là các hoạt động chính rồi hội tụ chương trình đào tạo vào chỉ mỗi hai kĩ năng này. Trong nhiều năm, sinh viên tốt nghiệp các chương trình này chỉ biết rõ một điều nhưng mất cái nhìn về toàn thể hệ thống.
Sinh viên năm thứ nhất thường hỏi tôi: “Tại sao chúng em phải học nhiều thứ thế trong kĩ nghệ phần mềm nơi mà mọi điều em cần là viết mã để kiếm việc làm trong công nghiệp?” Tôi bảo họ: “Các bạn được đào tạo là kĩ sư phần mềm, không phải người lập trình. Người kĩ sư xây dựng ra hệ thống, người lập trình chỉ xây dựng một cấu phần của hệ thống. Nghề của các bạn bao quát toàn thể việc phát triển phần mềm và nhiều hơn nữa. Nghề của người lập trình bị giới hạn vào viết mã và kiểm thử. Bạn có thể bành trướng tri thức của bạn ra rộng hơn và sâu hơn và không có giới hạn nào về điều bạn có thể làm. Người lập trình không thể làm được điều đó và ngày nay, không có lí do gì để trả lương cao cho ai đó chỉ viết mã vì bạn có thể khoán ngoài việc viết mã cho các nước có chi phí thấp hơn. Không công ti nào khoán ngoài việc của kĩ sư phần mềm, chỉ khoán ngoài việc của người lập trình. Bạn muốn thấy toàn thể khu rừng, không chỉ một cây. Bạn muốn biết cách hệ thống làm việc và hỗ trợ cho doanh nghiệp, không phải là cách một cấu phần vận hành. Đừng giới hạn bản thân bạn vào một thứ, mở rộng đường chân trời của bạn ra thì bạn có thể đi nhanh như tiềm năng của bạn cho phép.”
Tôi thường kể cho sinh viên câu chuyện về người lập trình giỏi nhất trên thế giới. Không ai có thể viết mã giỏi hơn anh ta. Anh ta có thể viết cả nghìn dòng mã một ngày. Anh ta biết rằng có hệ thống mà phần mềm của anh ta vận hành nhưng anh ta không hiểu kĩ nó. Chưa bao giờ xuất hiện việc anh ta hỏi người dùng họ cần gì vì anh ta chưa bao giờ nói chuyện với người dùng. Anh ta không có ý tưởng nào về các chức năng và người khác, những người cũng làm việc trên hệ thống. Anh ta không có ý tưởng về cách toàn thể hệ thống vận hành. Anh ta không có khái niệm về quản lí cấu hình hay quản lí thay đổi. Anh ta chỉ biết một điều: “Viết mã”.
Trong dự án, anh ta nhận được yêu cầu từ người quản lí và trong vòng vài ngày, anh ta kết thúc nó. Vào ngày hôm sau, người quản lí của anh ta nói rằng khách hàng đã đổi ý cho nên có yêu cầu mới. Anh ta không bận tâm về sửa mã của mình cho nên anh ta thêm vài nghìn dòng mã. Vài ngày sau, người quản lí nói rằng khách hàng muốn thêm nhiều chức năng cho nên anh ta bắt đầu viết thêm vài nghìn dòng mã nữa. Vài tuần sau, khách hàng đổi ý và muốn bắt đầu với các yêu cầu mới hơn và tốt hơn. Anh ta phải vứt đi mọi thứ anh ta đã làm và bắt đầu mọi thứ mới. Anh ta viết nhiều nghìn dòng mã. Khách hàng lại đổi ý cho nên anh ta phải viết lại mã lần nữa. Anh ta phải làm điều đó ít nhất thêm hai mươi lần nữa trong vài tháng. Anh ta biết rằng anh có lẽ viết tới trên năm mươi nghìn dòng mã và anh ta thực sự bị lẫn lộn và mệt mỏi về mọi thay đổi. Cuối cùng, dự án hoàn thành nhưng khi anh ta chuyển giao phần mềm, khách hàng phàn nàn: “Đó không phải điều tôi muốn, xin làm lại nó.” Cuối cùng, người lập trình giỏi nhất bỏ việc làm và trở lại trường, lần này anh ta hiểu điều anh ta thực sự cần, anh ta muốn học về kĩ nghệ phần mềm.”
Ngày nay, người phát triển phần mềm không làm việc một mình. Họ bao giờ cũng làm việc trong tổ bởi vì phần mềm đang ngày một lớn hơn và phức tạp hơn. Điều người phát triển cần là tri thức về toàn thể hệ thống, và mối quan hệ của mọi cấu phần chính và cách chúng làm việc cùng nhau để hỗ trợ cho mục đích của doanh nghiệp. Họ phải hiểu toàn thể qui trình phần mềm, không phải là từng mảnh của nó. Họ phải biết cách làm việc với khách hàng để nhận diện nhu cầu của họ và lấy được yêu cầu tốt hơn. Họ phải biết cách kiến trúc hệ thống bằng việc nhận diện mọi cấu phần cũng như các giao diện người dùng, thuộc tính chất lượng. Họ phải biết cách thiết kế từng cấu phần bằng việc tiến hành bù trừ và đặt ưu tiên để giảm rủi ro. Họ phải biết cách thực hiện các cấu phần này và chắc chắn rằng chúng tất cả đều làm việc tốt cùng nhau. Họ phải biết cách tiến hành kiểm thử để thẩm tra rằng mọi thứ làm việc như được thiết kế và đáp ứng yêu cầu khách hàng. Họ phải biết cách hỗ trợ cho khách hàng khi hệ thống vận hành đầy đủ và chạy. Về căn bản, họ phải biết mọi thứ.
Ngày nay, công nhân phần mềm cần đào tạo và giáo dục toàn diện. Đó là lí do tại sao giáo dục đại học tốt là mấu chốt thế. Đó là lí do tại sao việc lựa chọn trường tốt với chương trình đào tạo tốt là quan trọng thế. Mọi sinh viên đều phải ra “quyết định đúng” bởi vì tương lai của bạn tuỳ thuộc vào nó. Thầy giáo tốt chỉ có thể mở cánh cửa tri thức cho bạn nhưng bạn phải đi vào nó. Chương trình đào tạo tốt có thể chỉ ra cho bạn bản lộ trình tới đích đến của bạn nhưng bạn phải đích thân đi con đường này. Trong thế giới thay đổi nhanh chóng này, mọi sự có thể tới và đi nhanh chóng. Vận may có thể thay đổi nhanh hơn thời tiết nhưng tri thức và kĩ năng là điều duy nhất bạn có và không ai có thể lấy nó đi được.
—-English version—-
A system perspective
From early 20th century, manufacturing processes based on “assembly line” created by Henry Ford has become the standard. The idea is breaking down complex processes into the smallest and simplest tasks so workers can be trained to do is more efficiency and effective. This task segmentation was essential at that time due to the limitations of the skills of labor workers and the efficiency needed of the car industry. Henry Ford said: “The only way for a groups of workers to work in complex processes such as building a car is to give each of them only one thing to do and let them focus on doing that as efficiently and quickly as possible.”
This method also manifests itself into the way people organize things into functions and specialization. It works very well throughout the 20th century, especially in manufacturing sectors with manual labor workers. However, it does not work well in technology area with knowledge workers of the 21st century. Today, most works requires intensive knowledge, especially technology works. That is why there is a big gap between skilled workers and unskilled workers. Unfortunately many IT companies are still operating like when they are still in the 20th century. They divide works into functional groups, each only know one things based on technologies and platforms. For example, networks, servers, databases, desk top, and applications. Very few people know how the entire system works and how it impacts the business. In software development, workers are divided into many functions, each specializes in one such as planning, designing, coding, or testing but few know how the entire software work. That is why many projects failed during integration.
The problem with task segmentation is that by breaking down the complex processes into individual tasks the overall perspective is lost. Workers only know their own jobs, their own functions. Anything outside them is not their concerns. The root cause can be traced to the education system. Academia professors look at software and consider programming and testing as the main activities then focus program training on these two skills only. For years, graduates from these programs only know one thing well but lose sight of the entire system.
First year student often asked me: “Why do we have to study so many things in software engineering where all I need is to write code to get a job in the industry? I told them: “You are trained to be an software engineer, not a programmer. An engineer build the system, a programmer only build one component of the system. Your career cover the entire software development and much more. Programmers career is limited to coding and testing. You could expand your knowledge broader and deeper and there is no limit to what you can do. Programmer cannot do that and today, there is no reason to pay high wages for someone just to code since you can outsource coding to lower cost countries. No company outsource software engineer, only programmer. You want to see the entire forest, not just a tree. You want to know how the system works and support the business, not how one component functions. Do not limit yourself to one thing, expand your horizon then you can go as far as your potential allows.”
I often tell students a story about the best programmer in the world. No one can write code better than him. He can write thousand lines of code a day. He knows that there is a system where his software operates but he does not understand it well. It would never occur to him to ask users of what they need since he never talk to users. He has no idea about other functions and other people who also work on the system. He has no idea how the entire system works. He has no concept of configuration management or change management. He only know one thing: “Write code”.
In the project, he receives requirements from his manager and within few days, he finishes it. On the next day, his manager says that customers have changed their minds so there is new requirements. He does not mind of fixing his code so he adds few thousand lines of code. Few days later, the manager says that customer wants to add more functions so he starts write few more thousand lines of code again. Few weeks later, the customers change their minds and want to start with a newer and better requirements. He has to throw away what he did and starts everything new. He writes few more thousand lines of code. The customers change their minds again so he has to rewrite the code again. He has to do it at least twenty five times more in just few month. He knows that he probably write over fifty thousand lines of code and he is really confused and tired about all changes. At last, the project complete but when he delivers the software, customers complains: “That is not what I want, please do it again”. Finally, the best programmer quits his job and goes back to school, this time he understands what he really need, he wants to study software engineering.”
Today, software developers do not work alone. They always work in team because the software is getting larger and more complex. What developer needs are the knowledge of the entire system, and relationship of all major components and how they all work together to support the goal of the business. They must understand the entire software process, not a piece of it. They must know how to work with customers to identify their needs and to come up with better requirements. They must know how to architect a system by identify all components as well as user interfaces, quality attributes. They must know how to design each components by conducting trade-off and set priorities to reduce the risks. They must know how to implement these components and make sure that they all work well together. They must know how to conduct tests to verify that everything work as designed and meet customers requirement. They must know how to support the customers when the system is fully functioning and running. Basically, they must know everything.
Today, software workers need a comprehensive training and education. That is why a good college education is so critical. That is why selecting a good school with good training program is so important. Every students must make the “right decision” because your future depends on it. A good teacher can only open the door of knowledge for you but you must enter it. A good training program can show you a roadmap to your destination but you must travel the road by yourself. In this fast changing world, things can come and goes quickly. Fortune can change faster than the weather but knowledge and skills are the only thing you have and no one can take it away.