11 Jan, 2021
Lời khuyên cho người làm phần mềm
Nhiều người lập trình tin tri thức phần mềm là các ngôn ngữ lập trình hay công nghệ tính toán như: Java, C++, Linux, Windows NT, .Net, v.v. những tri thức cho phép người lập trình xây dựng phần mềm có thể chạy được trên máy tính.
Họ tin rằng nếu công ti thuê họ viết chương trình trong Java, họ phải biết cái gì đó về Java và nếu công ti muốn .Net thì họ cần biết .Net và đó là tất cả những gì họ phải học. Vì ngôn ngữ lập trình và các công nghệ đều thay đổi thường xuyên, người lập trình phải theo kịp với những thay đổi này bởi vì điều họ biết hôm nay có thể thành lạc hậu trong vòng vài năm tới. Tuy nhiên, có một loại tri thức phần mềm khác không thay đổi mấy và kéo dài theo thời gian có tên là “bộ môn Kĩ nghệ phần mềm” và đây là khác biệt then chốt giữa đào tạo về khoa học máy tính và kĩ sư phần mềm.
Bộ môn kĩ nghệ phần mềm là tri thức bản chất mà những người làm việc trong lĩnh vực phần mềm phải có, bất kể họ đã có công nghệ hay ngôn ngữ lập trình. “Tri thức bản chất” này là khả năng hiểu chiến lược doanh nghiệp, thiết lập đặc tả yêu cầu, kiến trúc hệ thống máy tính, thiết kế giao diện giữa phần cứng và phần mềm, thực hiện và trắc nghiệm rằng việc thực hiện đáp ứng các yêu cầu nguyên gốc và hiểu thuộc tính chất lượng v.v. Người kĩ sư phần mềm giỏi phải có cái nhìn rộng hơn về doanh nghiệp phần mềm so với chỉ có mỗi ngôn ngữ lập trình. Ngày nay, dễ dàng tìm ra người có kĩ năng lập trình, nhưng tìm những người có bộ môn phần mềm cần thiết để dẫn dắt dự án tới thành công lại khó hơn.
Theo một số nghiên cứu về lương trong công nghiệp phần mềm, cái nhìn rộng hiện này là đã có nhiều người lập trình trên thế giới rồi, cho nên lương của người lập trình gần như đứng lại hay hơi giảm đi trong vài năm qua. Ngày nay hầu hết các công ti Mĩ và châu Âu không thuê người lập trình nữa bởi vì rất dễ dàng khoán ngoài công việc lập trình cho Trung Quốc và Ấn Độ, nơi người lập trình làm việc chỉ vì một phần lương so với điều những người làm ở Mĩ hay châu Âu yêu cầu. Điều công nghiệp phần mềm cần là dịch chuyển từ kĩ năng lập trình sang “kĩ năng doanh nghiệp-kĩ thuật” và thường những kĩ năng này đòi hỏi lương cao hơn bởi vì họ là những người đặt ra chiều hướng và hướng dẫn cho nhu cầu dự án.
Nhiều người trong các bạn nghĩ rằng bởi vì khoán ngoài, việc lập trình là tốt nhưng đây là tư duy ngắn hạn. Nếu bạn chỉ đi theo xu hướng toàn cầu, bạn không bao giờ lên hàng đầu bởi vì ngày nay bạn đang cạnh tranh trong công việc khoán ngoài với Ấn Độ và Trung Quốc nhưng trong vài năm tới bạn sẽ phải cạnh tranh với những người khác ở Nam Mĩ và châu Phi nơi họ cũng có kĩ năng lập trình và yêu cầu lương thấp hơn nhiều. Sau đây là lời khuyên của tôi cho những người đang làm việc trong ngành công nghiệp phần mềm:
Tôi khuyên rằng bạn cần tiến lên hàng đầu của xu hướng, đừng theo sau. Để thành công, bạn phải đi lên trong các vị trí kĩ nghệ phần mềm hướng theo doanh nghiệp như người phân tích hệ thống, kĩ sư yêu cầu, người quản lí dự án, hay kiến trúc sư hệ thống để chuẩn bị cho những xu hướng tiếp nơi các công ti sẽ khoán ngoài các vị trí đó. Bằng việc có cả kĩ năng lập trình và kĩ năng kĩ nghệ phần mềm, bạn đặt mình vào ưu thế của cả hai xu hướng hiện thời và tương lai thay vì chỉ đi theo người khác. Tất nhiên, người lập trình không thể trở thành người kĩ sư phần mềm qua một đêm. Sự chuyển đổi này cần thời gian và yêu cầu kinh nghiệm và học tập đúng để thành công cho nên bạn sẽ cần đào tạo thêm.
Nếu bạn là sinh viên về khoa học máy tính và sẽ tốt nghiệp sang năm, cơ hội của bạn là nhiều để tìm việc trong ngành công nghiệp khoán ngoài nhưng bạn không nên mong đợi được lương tốt vì cạnh tranh là cao và sẽ gay gắt hơn khi ngày càng nhiều nước đi vào kinh doanh này. Tuy nhiên, nếu bạn lấy đào tạo thêm về “phía doanh nghiệp-kĩ thuật’ của người kĩ sư phần mềm hay quản lí hệ thông tin, bạn sẽ có cơ hội tốt hơn và có thể đòi hỏi lương cao hơn bởi vì ngày nay ít người có những kĩ năng này.
Nếu bạn đã làm việc trong công nghiệp như người lập trình, bạn có thể học thêm về miền “Doanh nghiệp-Kĩ thuật” như thiết kế, kiến trúc hay quản lí. Bạn có thể học về quản lí dự án phần mềm và phân tích doanh nghiệp bằng cách học các môn học ngắn ngày và áp dụng tri thức này vào dự án của bạn. Qua thời gian, người quản lí của bạn sẽ nhận ra điều đó và trao cho bạn nhiều trách nhiệm hơn hay có thể cả thăng cấp. Không cái gì là tốt hơn kinh nghiệm thực tế. Bạn càng biết nhiều bạn sẽ càng nhận ra rằng bạn cần đào tạo thêm bởi vì học tập là liên tục và không bao giờ nên dừng lại.
Chìa khóa cho thành công trong khoán ngoài là hiểu nhu cầu của khách hàng và có khả năng giải quyết các vấn đề cho họ. Tôi cũng khuyên rằng bạn nên lấy đào tạo về kĩ nghệ yêu cầu để làm việc trực tiếp với khách hàng, để biết nhu cầu của họ. Người quản lí của bạn sẽ sung sướng thấy ra rằng bạn có khả năng nhận diện vấn đề và giải quyết chúng nhanh chóng và hiệu quả. Bạn càng có thể làm tốt việc của mình với khách hàng, bạn càng học được nhiều về doanh nghiệp của họ và bạn càng biết nhiều về doanh nghiệp, bạn càng cải tiến tốt hơn kĩ năng của mình. Là người kĩ sư yêu cầu, bạn làm việc với người quản lí dự án, kiến trúc sư, và khách hàng để nhận diện điều phải được thực hiện trong các ràng buộc về thời gian, chi phí và chất lượng, tất cả những điều đó đều là yếu tố mấu chốt có thể tạo ra khác biệt giữa thành công và thất bại. Là người kĩ sư yêu cầu, bạn sẽ làm việc với khách hàng và có thể khó nhận diện ra vấn đề khi bạn không thể trao đổi tốt. Tôi khuyên bạn nên học thêm các môn ngôn ngữ, đặc biệt trong trao đổi vì bạn phải thảo luận trực tiếp với khách hàng. Đây là cơ hội để chứng tỏ cho cấp quản lí rằng bạn có giá trị cho công ti.
Nếu bạn không thích làm việc với khách hàng mà ưa chuộng kĩ năng kĩ thuật thì bạn có thể lấy khóa đào tạo phụ trong miền kiến trúc. Đây là vị trí kĩ thuật cao bao hàm các quyết định then chốt đề cập tới cách hệ thống mới sẽ khớp vào trong kết cấu nền toàn thể của tổ chức. Để thành công, người kiến trúc sư cần hiểu và kiểm soát được các yếu tố liên kết với các nhân tố tiện dụng, chi phí và may rủi của giải pháp được đề nghị. Kiến trúc sư hệ thống phải ra quyết định về cách phân rã và cô lập các cấu phần khác nhau mà sẽ được cần tới, cách khớp các cấu phần này vào trong kết cấu nền hiện có, và thực hiện từng cấu phần theo thứ tự nào. Có thể sẽ thành thảm họa nếu thực hiện một hệ thống mà lại không tương hợp với hệ thống hiện thời của tổ chức.
Kĩ năng khác đang có nhu cầu cao là người quản lí dự án phần mềm. Người này chịu trách nhiệm thuê cán bộ, lập lịch biểu, và theo dõi dấu vết tiến độ qua mọi pha phát triển. Người này cũng chịu trách nhiện phân công việc, giải quyết các vấn đề hàng ngày ảnh hưởng tới công việc đó, và đảm bảo từng người lập trình đang thực hiện nhiệm vụ riêng của họ. Người quản lí dự án có thể tiến hành tốt nhất chức năng này nếu người đó hiểu thực sự công việc mình đang quản lí. Người quản lí dự án phải vừa là “người của con người” và đồng thời là “người của kĩ thuật” để thành công. Cá nhân này phải làm việc với các cán bộ kĩ thuật và phi kĩ thuật tại mọi mức của tổ chức để thành công trong mục đích của mình. Bên cạnh đó, người quản lí dự án phải quản lí tổ của mình một cách có hiệu quả để tạo ra sản phẩm mong muốn đúng thời gian.
Ngày nay, để tiến lên hàng đầu bạn cần hiểu doanh nghiệp và cách áp dụng công nghệ để làm cho nó tốt hơn. Có khả năng đi theo chiều hướng quản lí là tốt nhưng có khả năng đưa ra đánh giá riêng của bạn mà không cần nhiều hỗ trợ còn quan trọng hơn. Chìa khóa để thành công là làm khác biệt bạn với người khác. Tôi đã khuyên bạn cải tiến kĩ năng của mình trong việc thu nhận tri thức mới nhưng có hai kĩ năng quan trọng: trao đổi và lãnh đạo.
Mọi người đều có thể học ngoại ngữ nhưng kĩ năng trao đổi cần nhiều thời gian hơn để phát triển. Trao đổi cần có trộn lẫn đúng giữa kinh nghiệm và đào tạo để trở nên hiệu quả. Nhiều khách hàng không hiểu kĩ thuật để mô tả yêu cầu của họ thật chi tiết và nhiều người kĩ thuật không hiểu các qui trình doanh nghiệp bởi vì họ không thể trao đổi được với khách hàng. Học trao đổi, và có kiên nhẫn để thu được tri thức từ khách hàng, là kĩ năng bản chất mà nhiều người không có.
Kĩ năng lãnh đạo cũng không phải là cái gì đó bạn có thể học được qua đêm. Bạn phải bắt đầu bằng thái độ tích cực, thay vì yêu cầu cấp quản lí của bạn giúp giải quyết vấn đề, hãy tự mình nhận nó để tìm ra lời giải cho vấn đề đó. Cũng không lâu mấy, bạn có thể là người mà người khác trong dự án tới hỏi ý kiến khi có vấn đề cần sửa hay dự án mới cần hoàn thành. Việc có được kinh nghiệm giải quyết vấn đề không chỉ cải tiến việc trao đổi, nó còn cải tiến cơ hội của bạn đi vào các vị trí lãnh đạo.
Cách tốt nhất để đi lên ở mọi công ti là để cấp quản lí biết bạn có khả năng về cái gì. Có khả năng trả lời các câu hỏi của khách hàng, giải quyết các vấn đề, chấp nhận nhiều trách nhiệm hơn, và chia sẻ giải pháp là cách chắc chắn để phân biệt bản thân bạn với việc “chỉ là người lập trình” để thành ứng cử viên hàng đầu cho việc đề bạt quản lí.
—-English version—-
Advise to software people
Many programmers believe software knowledge is programming languages or computing technologies such as: Java, C++, Linux, Windows NT, .Net, etc. Knowledge that allows programmer to build software that can be run in a computer. They believe that if company hires them to write program in Java, they have to know something about Java and if the company wants .Net then they need to know .Net and that is all they have to learn. Since programming languages and technologies change often, programmers must keep up with these changes because what they know today can be obsolete within the next few years. However, there is another kind of software knowledge that does not change much and last a long time called “Software engineering disciplines” and this is the key different between computer science and software engineer training.
Software engineering disciplines are the essential knowledge that people who work in software field must have regardless of the technology or programming languages. These “essential knowledge” are the ability to understand the business strategy, establish requirements specification, architect a computer system, design interfaces between hardware and software, implement and verify that the implementation meets the original requirements and understand the quality attributes etc. A good software engineer must have a broader view of software business than just programming languages. Today, it is easy to find people with programming skills, but finding people with the necessary software disciplines to guide a project to success is more difficult.
According to several studies on salary in the software industry, there is a growing view that there are many programmers in the world already, so the salary of programmers is almost stand still or slightly declining in the past few years. Today most U.S and European companies do not hire programmers anymore because it is much easy to outsource programming works to China and India where programmers work for a fraction of what people in U.S or European requires. What the software industry need is a shift from programming skills to “business-technical skills” and often these skills demand higher salaries because they are the ones who set the direction and guidance for the project’s needs.
Many of you may think that because of outsourcing, programming jobs are good but this is short term thinking. If you only following the global trend, you never get ahead because today you are competing in outsourcing works with India and China but in the next few years you will have to compete with other people in S. America and Africa where they also have programming skills and require much less salaries. Following are my advise to people who work in the software industry:
I recommend that you need to get ahead of the trend, not to follow. To be successful, you should move up into more business-oriented software engineering positions such as systems analyst, requirements engineer, project manager, or systems architect to prepare for the next trends where companies will outsourced these positions. By having both programming skills and software engineering skills, you are positioning yourself to take advantage of both current and future trends rather than just following others. Of course, programmer can not just become a software engineer overnight. The transition takes time and requires the right experience and learning to be successful so you will need additional trainings.
If you are students in computer science and will graduate next year, your chance is good in finding works in the outsourcing industry but you should not expect good salaries as the competition is high and will be much tougher as more and more countries are moving in this business. However, if you take additional trainings in “business-technical side” of software engineer or information system management, you will have much better chance and could demand better salaries because today there are few people having these skills.
If you already worked in the industry as programmer, you could try to learn more about “Business –Technical” areas such as design, architect or management. You could learn about software project management and business analysis works by taking some short courses and apply the knowledge into your project. Over time, your managers will recognize it and give you more responsibilities or maybe a promotion. Nothing is better than actual experiences. The more you know the more you will realize that you need more training because learning is continuous and should never stop.
The key to succeed in outsourcing work is to understand customer’s needs and be able to solve problems for them. I also recommend that you take requirements engineering training to work directly with the customers to know their needs. Your manager will be happy to find out that you are capable of identifying problems and solving them quickly and efficiently. The better you can work with customers, the more you will learn about their business and the more you know about business, the better you can improve your skills. As a requirements engineer, you work with project managers, architects, and customers to identify what must be done within time, cost and quality constraints, all of which are critical elements that can make the difference between success and failure. As requirements engineer, you will work with customers and it can be difficult to identify issues when you can not communicate well. I recommend that you take language courses, especially in communication as you have to discuss with customers directly. This is the chance to show management that you are valuable to the company.
If you do not like to work with customers but prefer technical skills then you may want to take additional training in the architecture areas. This is position that is highly technical involving key decisions to address how the new system will fit into the organization’s overall infrastructures. In order to be successful, the architect needs to understand and control the elements associated with the utility, cost, and risk factors of the proposed solution. System architects must make decisions how to decompose and isolate the different components that will be required, how to fit these components into the existing infrastructure, and in what order to implement each component. It can be a disaster to implement a system that isn’t compatible with the organization’s current systems.
Another skill in high demand is software project manager. This job is responsible for hiring the staff, setting the schedule, and keeping track of the progress through every phase of development. This person is also responsible for assigning the work, dealing with everyday problems affecting that work, and making sure each programmer is carrying his own task. The project manager can best carry out this function if he truly understands the work he is managing. The project manager must be both a “people person” as well as a “technical person” in order to succeed. This individual must work with technical and non-technical staff at every level of the organization in order to succeed in his goals. Additionally, the project manager has to manage his team effectively to produce the desired product on time.
Today, to get ahead you need to understand business and how to apply technology to make it better. Being able to follow management directions is good but being able to make your own judgments without a lot of support is more important. The key to success is to differentiate you from the others. I have advised you to improve your skills in acquire advanced knowledge but there are two important skills: communication and leadership.
Everyone can learn a foreign language but communication skills take much longer to develop. Communication takes the right mix of experience and training to become effective. Many customers do not understand the technical to describe their requirements in detail and many technical people do not understand the business processes because they can not communicate with the customers. Learning to communicate, and having the patience to gain knowledge from the customers, is an essential skill that many people don’t have.
Leadership skill is also not something you can learn overnight. You must start with an active attitude, instead of asking your management to help with a problem, take it upon yourself to find the answer to that problem. Before too long, you can be the one who others in project come to ask when there is a problem to fix or a new project to complete. Gaining problem-solving experience not only improves communication, it also improves your chances of moving into leadership positions.
The best way to moving up at any company is to let management know what you are capable of. Be able to answer customer’s questions, solve problems, accept more responsibilities, and share a solution is a sure way to distinguish yourself from being “just a programmer” to the top candidate for management promotion.