12 Jan, 2021
Kĩ năng và tiến bộ
Cái nhìn truyền thống của đào tạo về Khoa học máy tính là phát triển người lập trình để viết mã và sửa lỗi.
Phần lớn những người lập trình KHÔNG gặp khách hàng, KHÔNG kiến trúc hay thiết kế hệ thống, KHÔNG viết yêu cầu, hay viết trường hợp kiểm thử tự động mà chỉ viết mã. Cái nhìn này bây giờ là LẠC HẬU vì viết mã chỉ là một phần nhỏ của toàn bộ việc phát triển phần mềm. Ngày nay, người phần mềm tốt nghiệp từ Khoa học máy tính hay Kĩ nghệ phần mềm phải làm nhiều thứ HƠN việc lập trình. Tuỳ theo chỗ họ làm việc, liệu đó là công ti nhỏ hay lớn, việc đào tạo của họ có thể thực sự tạo ra khác biệt trong thành công hay thất bại của họ.
Trong công ti nhỏ, người làm phần mềm phải làm nhiều điều khi được yêu cầu. KHÔNG thể nào chỉ viết mã hay kiểm thử được. Các công ti nhỏ cần người phần mềm có khả năng làm bất kì cái gì cần thiết để giúp cho dự án thành công. Đó là lí do tại sao hầu hết các công ti nhỏ đều thà thuê người kĩ sư phần mềm hơn là sinh viên khoa học máy tính bởi vì họ biết về việc đào tạo cho các bằng cấp này. Nhân tố then chốt trong công ti nhỏ là sự linh hoạt và nhanh nhẹn của người phần mềm.
Công ti lớn tổ chức qui trình phát triển thành các khu vực đặc biệt cho nên họ ưa thích thuê các chuyên gia có kinh nghiệm. Việc làm của họ thường yêu cầu nhiều năm kinh nghiệm trong khu vực đặc biệt như Kiến trúc sư phần mềm, Kĩ sư yêu cầu, Người phân tích nghiệp vụ, Người kiểm thử phần mềm, Chuyên viên đảm bảo chất lượng v.v. Trong trường hợp này, mọi việc đều đặc biệt hội tụ vào chuyên môn. Chẳng hạn Kiến trúc sư thiết kế; Người lập trình viết mã; Người lãnh đạo kĩ thuật quản lí người lập trình; Người quản lí dự án lập kế hoạch và giám sát hoạt động dự án. Nhân tố then chốt trong công ti lớn là phân biệt vai trò, trách nhiệm và đảm nhiệm.
Tính linh hoạt và vai trò đôi khi tạo ra vấn đề cho người phần mềm. Một người đã làm tốt trong công ti lớn có thể KHÔNG cảm thấy thoải mái trong công ti nhỏ và ngược lại. Theo cảnh quan giáo dục và đào tạo, tôi tin mọi sinh viên phần mềm trước hết phải học khái niệm nền tảng về phát triển phần mềm hay lập trình (viết mã và sửa lỗi). Sau khi làm chủ lập trình, sinh viên cũng phải học các kĩ năng hỗ trợ như Kiểm thử, Quản lí cấu hình, Đảm bảo chất lượng, Làm tài liệu, Phân tích yêu cầu. Thực tế đó là những kĩ năng hỗ trợ tạo ra sự khác biệt giữa người lập trình và người phát triển. Người phát triển có cái nhìn rộng hơn nhiều và có khả năng thấy toàn thể quá trình phát triển. Người lập trình chỉ viết mã và kiểm thử công việc của họ có cái nhìn hẹp hơn nhiều và KHÔNG biết qui trình phát triển. Đào tạo kĩ sư phần mềm đi xa hơn vào toàn thể hệ thống bằng việc hiểu vấn đề doanh nghiệp, giải pháp kiến trúc và thiết kế, lựa chọn phần cứng thích hợp và trên hết tất cả, họ cũng hiểu khía cạnh quản lí của dự án phần mềm.
Bởi vì sự khác biệt trong chương trình và đào tạo, một số sinh viên làm tốt hơn những người khác. Người lập trình tốt có thể KHÔNG phải là người phát triển phần mềm tốt. Viết mã là quan trọng nhưng không đủ dưới dạng phát triển phần mềm. Người phát triển tốt có thể KHÔNG phải là người có thể giải quyết được vấn đề doanh nghiệp. Biết thiết kế và viết mã là bản chất nhưng không thích hợp dưới dạng giải quyết vấn đề doanh nghiệp. Điều quan trong với sinh viên là hiểu các chương trình đào tạo khác nhau, điều họ bao quát và lựa chọn chương trình thích hợp. Nhiều giáo sư hàn lâm tranh cãi rằng chương trình bậc đại học hiện thời phải dạy nhiều chủ đề thế, sinh viên phải học nhiều môn thế nên đào tạo thêm về phát triển phần mềm là quá nhiều. Tốt hơn cả là để người lập trình viết mã và thuê người khác, người có nhiều kinh nghiệm hơn làm các hoạt động khác. Tôi KHÔNG đồng với cách nhìn đó bởi vì nó giới hạn sinh viên vào kĩ năng tầm thường và cách li họ với mọi thứ trong phát triển phần mềm. Ngày nay, công nghệ thay đổi nhanh thế, có cảnh quan hẹp sẽ làm hại cho họ nhiều hơn là giúp họ để tiến vào chuyên nghiệp phần mềm. Ngày nay, công nhân phần mềm phải hiểu công việc của khách hàng và người dùng. Họ phải giúp khách hàng giải quyết các vấn đề. Nếu nhà trường không dạy những kĩ năng này thì điều quan trọng đối với công nhân phần mềm là đi đào tạo thêm về quản lí cấu hình, đảm bảo chất lượng hay hỗ trợ kĩ thuật v.v.
Một số sinh viên KHÔNG muốn là người phát triển phần mềm hay kĩ sư phần mềm. Họ chỉ muốn là người lập trình vì họ thích viết mã và học C, C++. Java, Dot.Net, Network, J2EE v.v. Tất nhiên, họ có thể tìm được việc làm nhưng tương lai của họ bị rất giới hạn. Họ có thể học kĩ năng thêm tại công ti của mình, vì họ có kinh nghiệm họ có thể chuyển từ người lập trình sang người phát triển nhưng điều đó mất thời gian. Công nghiệp phần mềm đang thay đổi nhanh chóng bởi vì công nghệ thay đổi nhanh chóng. Công nhân phần mềm không theo kịp những thay đổi này có thể bị tụt lại sau. Công nhân phải bắt kịp với công nghệ mới để nhận diện cơ hội và xác định cách các công nghệ này tác động tới việc làm của họ. Nếu họ không làm như vậy, họ có thể bị ra ngoài công việc.
Ngày nay một số người lập trình vẫn kiếm sống tốt chỉ bằng việc viết mã nhưng việc làm lập trình sẽ thay đổi khi người lập trình từ các nước có chi phí thấp hơn đang đi vào trong thị trường này và cạnh tranh. Vài năm trước, có nhiều người lập trình ở Mĩ và châu Âu nhưng khi những người lập trình từ Ấn Độ và Trung Quốc vào thị trường này, phần lớn trong họ hoặc đổi việc làm hoặc phải học kĩ năng mới để vẫn còn được thuê. Ngày nay, người lập trình Ấn Độ và Trung Quốc sợ mất việc cho các nước có chi phí thấp như Nam Mĩ và châu Phi. Tôi đã thấy nhiều người lập trình từ các nước như Chile, Argentina, Nicaragua, Nigeria, Congo, và Kenya cạnh tranh thành công với Ấn Độ và Trung Quốc khi họ làm quãng 20% của điều người lập trình trung bình ở Trung Quốc làm.
Tôi tin hoặc bạn học bây giờ hoặc học về sau nhưng bạn không thể dừng lại với cùng một kĩ năng mãi mãi được. Thế giới đang thay đổi nhanh chóng và nếu bạn KHÔNG đi cùng nó, bạn sẽ bị tụt lại sau. Ngày nay khi những công nghệ mới như dùng các bộ xử lí đa lõi và lai, tính toán ảo hoá và “kết cấu” (các bộ xử lí nối kết qua mạng), kết mạng xã hội, tính toán mây, công nghệ Web, tính toán phổ cập, tính toán ngữ cảnh, thực tại gia tăng (dữ liệu do máy tính sinh ra và dữ liệu thế giới thực hỗn hợp), và ngữ nghĩa nâng cao (ngôn ngữ phần mềm được gán nghĩa) đã làm thay đổi công nghiệp phần mềm rất nhiều khi so sánh chỉ tròn hai năm. Chẳng mấy chốc nhiều công ti sẽ bắt đầu với tính toán ảo hoá và mây, công ti phần mềm hay bộ phận CNTT vận hành theo cách truyền thống sẽ KHÔNG có khả năng cạnh tranh, người lập trình có kĩ năng hầu hết để viết mã trong Pascal hay C sẽ không có khả năng tìm được việc.
Vì công nghệ vẫn cứ thay đổi ngày một nhanh chóng hơn mọi năm, bạn phải tiếp tục học điều mới để đáp ứng cho nhu cầu thị trường. Trong tương lai rất gần, những thứ như Ruby, Ajax, Enterprise 2.0, Web 2.0, SEO, Phần mềm xã hội, Mô hình tiêu thụ, Phần mềm như dịch vụ (Saas), Tính toán mây, Hướng ngữ cảnh sẽ là thông dụng như C++, Java, Dot.Net, hay J2EE ngày nay vì môi trường làm việc tiếp tục thay đổi và trở nên phức tạp hơn. Tất cả những điều này đã thêm vào điều người phát triển phần mềm trung bình phải biết. Trong tương lai rất gần, người phát triển phần mềm phải làm việc chặt chẽ với doanh nghiệp bởi một phần của doanh nghiệp tương tác với phần khác của doanh nghiệp. Họ phải hiểu khái niệm về Quản lí quan hệ khách hàng (CRM), Lập kế hoạch tài nguyên doanh nghiệp (ERP), và Quản lí dây chuyền cung cấp (SCM) vì điều này phải được quản lí tại mức chương trình hay tuyển tập chương trình. Đó là lí do tại sao để thành công, sinh viên cần chấp thuận việc học cả đời và tiếp tục học những điều mới khi chúng tới.
—-English version—-
Skills and progress
The traditional view of Computer Science training is to develop programmers to write code and fix defects. Most programmers do NOT meet customers, do NOT architect or design systems, do NOT write requirements, or write automated test cases but only write code. This view is now OBSOLETE as coding is only a small part of the entire software development. Today, software people graduate from Computer Science or Software Engineering must do much MORE than programming. Depend on where they work, whether it is small or large company, then their training can really make the difference in their success or failure.
In small company, software people must do multiple things as needed. It is NOT possible just to write code or test. Small companies need software people who are capable to do whatever it takes to help the project succeed. That is why most small companies rather hire software engineer than computer science graduates because they know about the training for these degrees. The key factor in small company is the flexibility and versatility of software people.
Big company organizes the development process into special areas so they prefer to hire specialists who have experiences. Their jobs often require many year of experiences in specific area such as Software architect, Requirements engineer, Business analyst, Software tester, Quality assurance specialist etc. In this case, every job is specifically focusing on a specialty. For example Architects design; Programmers write code; Technical Leads manage programmers; Project Managers plan and monitor project activities. The key factor in big company is distinguishing roles, responsibilities and accountabilities.
Flexibility and roles sometime create problem to software people. A person who has been doing well in large company may NOT feel comfortable in smaller company and vice versa. From the education and training perspective, I believe every software student must first learn the fundamental concept of software development or programming (Write code and fix defects). After master the programming, students must also learn the supporting skills such as Testing, Configuration management, Quality assurance, Documentation, Requirement analysis. Actually it is these supporting skills that make the difference between a programmer and a developer. The developer has a much larger view and an ability to see the entire development process. Programmers who only write code and test their works have much narrower view and do NOT know development process. Software engineer training go further into the entire systems by understand business problems, architect and design solutions, select appropriate hardwares and most of all, they also understand the managing aspect of software project.
Because of the difference in programs and trainings, some students do better than the others. A good programmer may NOT be a good software developer. Coding is important but insufficient in term of software development. A good developer may NOT be the person who can solve business problems. Knowing to design and code are essential but inadequate in term of solving business problem. It is important for student to understand the different training programs, what they cover and select the appropriate one. Many academic professors argue that current undergraduate program must teach so many subjects, students have to take so many courses so more training in software development is too much. It is better to let programmer write code and hire others, more experienced people to do other activities. I do NOT agree with that view because it limits students to a trivial skill and insulate them from everything in software development. Today, technologies have changed so fast, having a narrow perspective will hurt them more than helping them to advance into software professionals. Today, software workers must understand the business of the customers and users. They must help customers solving problems. If the school does not teach these skills then it is important for software workers to take additional trainings in configuration management, quality assurance or tech support etc.
Some students do NOT want to be software developers or software engineer. They only want to be programmers as they like to code and learning C, C++. Java, Dot.Net, Network, J2EE etc. Of course, they can find works but their future is very limited. They may learn additional skills at their companies, as they have experiences they can move from programmer to developer but it takes time. The software industry is changing fast because technology is changing rapidly. Software workers who do not keep up with these changes could be left behind. Workers should keep up with new technology to identify opportunities and determine how these technologies impact their jobs. If they don’t, they could be out of work.
Today some programmers still make good living just by writing code but programming jobs will change as programmers from lower cost countries are moving into the market and compete. Few years ago, there are many programmers in the U.S and Europe but as programmers from India and China begin to enter the market, most of them either change jobs or have to learn new skills to stay employed. Today, India and Chinese programmers are afraid of losing works to lower cost countries such as S. America and Africa. I have seen many programmers from countries such as Chile, Argentina, Nicaragua, Nigeria, Congo, and Kenya compete successfully against India and China as they make about 20% of what an average programmer in China made.
I believe either you learn now or learn later but you can not stay with the same skill forever. The world is changing quickly and if you do NOT move with it, you will be left behind. Today as new technologies such as the use of multi-core and hybrid processors, virtualization and “fabric” computing (linking processors across a network), social networking, cloud computing, Web technology, ubiquitous computing, contextual computing, augmented reality (blending computer-generated and real-world data), and advanced semantics (the meaning-assigned software language) have change the software industry significantly as compare with just only two years ago. Soon many companies will start with virtualization and cloud computing, a software company or IT department that operates in the traditional way will NOT be able to compete, a programmer whose skill is mostly code in Pascal or C will not be able to find employment.
As technology keeps changing faster and faster every year, you must continue to learn new thing to meet the market demand. In the very near future, things such as Ruby, Ajax, Enterprise 2.0, Web 2.0, SEO, Social software, Consumption models, Software as a service (Saas), Cloud computing, Context Oriented will be as common as today C++, Java, Dot.Net, or J2EE as the software working environment continue to change and becoming more complex. All these things have added to what the average software developer must know. In very near future, software developer must work closely with the business where part of the business interacts with another part of the business. They must understand the concept of Customer Relationship Management (CRM), Enterprise Resource Planning (ERP), and Supply Chain Management (SCM) as thing should be managed at the program or portfolio levels. That is why to succeed, students need to adopt the lifelong learning and continue to learn new things as they come.