07 Jan, 2021
Người kỹ sư phần mềm giỏi nhất
Bạn tôi hỏi tôi: Làm sao anh biết người kĩ sư phần mềm giỏi nhất so với người trung bình? Sau đây là ý kiến cá nhân của tôi:
Người kĩ sư phần mềm giỏi nhất là người rất cẩn thận khi viết mã bằng việc tập trung vào chất lượng chứ không số lượng. Người kĩ sư phần mềm trung bình thích viết mã, họ dường như ngồi lì trước máy tính hầu hết thời gian để sinh ra hàng đống mã nhưng chương trình của họ có thể hay không thể làm việc được nên họ phải sửa chúng lặp đi lặp lại. Việc “viết mã và sửa” này làm phí hoài nhiều nỗ lực và chẳng bao giờ đạt tới chất lượng như khách hàng mong đợi. Mã tốt được tạo ra bởi người kĩ sư phần mềm có kỉ luật, họ biết từng vấn đề phải mất bao lâu, và lập kế hoạch cẩn thận về cách tiếp cận của mình để đảm bảo rằng họ hoàn thành nhiệm vụ tương ứng. Là người quản lí, tôi đã thấy cả hai kiểu kĩ sư phần mềm này, khi tôi bảo họ “Tôi cần nhiệm vụ này được hoàn thành trước thứ sáu” rồi trước thứ sáu, ai đó tới và cho tôi biết rằng họ đã kiểm thử mã của họ và nó đã sẵn sàng cho kiểm thử tích hợp. Với những người này tôi có thể cảm thấy rằng sẽ có rất ít, nếu không nói là không có lỗi được tìm ra bởi tổ kiểm thử. Tuy nhiên, có những người bảo tôi “Tôi vẫn còn đang viết mã nhưng nó sẽ xong vào cuối ngày thứ sáu hay đầu ngày thứ hai” vậy thì với họ, tôi có thể chắc chắn rằng họ có thể đã bỏ qua một số kiểm thử để đáp ứng hạn chót và hầu hết thời gian mã của họ đầy những lỗi. Vì sao? Bởi vì người kĩ sư phần mềm tốt biết công việc cần bao nhiêu thời gian và lập kế hoạch công việc cẩn thận và sẽ cho tôi biết liệu họ có thể đáp ứng hạn chót hay không trong khi người kĩ sư phần mềm trung bình thà ngồi viết mã trước rồi mới hỏi câu hỏi đó sau.
Với mọi vấn đề đều có nhiều cách giải quyết nó nhưng người kĩ sư phần mềm giỏi nhất sẽ cố gắng hiểu vấn đề trước khi làm bất kì cái gì. Bằng việc hiểu vấn đề, người đó sẽ nghĩ cẩn thận về cách giải quyết nó và thảo luận nó với tổ của mình về giải pháp tốt nhất. Người đó biết rằng có nhiều tuỳ chọn và điều người đó đề nghị có thể không phải là tốt nhất cho nên người đó tìm kiếm lời khuyên từ những người khác và đi tới cách tiếp cận logic và tốt hơn. Bằng việc nhìn vào vấn đề, hình dung ra kết quả cần phải là gì, người đó sẽ hình dung mình cần giải quyết nó trong bao lâu, và loại phẩm chất nào được mong đợi trước khi người đó thậm chí bắt đầu làm việc trên giải pháp. Ngược lại, người kĩ sư phần mềm trung bình sẽ ngay lập tức bắt đầu viết mã trước mà không nghĩ gì mấy rồi sửa nó nếu nó không đáp ứng yêu cầu. Kiểu “viết mã và sửa” rồi “sửa rồi viết mã” này sẽ chẳng bao giờ tạo ra phần mềm chất lượng được bởi vì họ càng sửa nó, họ càng đưa thêm nhiều lỗi vào trong giải pháp.
Người kĩ sư phần mềm giỏi nhất bao giờ cũng chia sẻ mọi điều với tổ và học lẫn nhau. Họ biết rằng bằng việc chia sẻ, họ học nhiều hơn cho nên khi họ học điều mới, công nghệ mới, họ sẽ thảo luận với tổ về cái gì có tác dụng và cái gì không tác dụng cho nên mọi người có thể tránh phạm phải sai lầm. Họ trở nên tốt hơn bằng việc làm cho người khác tốt hơn. Họ bao giờ cũng tìm kiếm lời khuyên từ những người thâm niên bởi vì những người này có kinh nghiệm, đã trải qua nhiều dự án và biết theo bản năng để ra quyết định đúng. Người kĩ sư phần mềm trung bình có thể rất giỏi trong điều họ làm nhưng họ giống như một anh hùng, được người khác thừa nhận cho nên họ không thích chia sẻ và giữ thông tin cho riêng mình, trong trường hợp này họ đánh mất giá trị của mình bởi vì công việc phần mềm là công việc tổ và tổ mà có quá nhiều anh hùng chung cuộc sẽ không có anh hùng nào cả bởi vì mọi người sẽ thất bại. Cho dù họ giỏi và có thể kết thúc công việc của mình đúng hạn nhưng nếu tổ không làm thì dự án vẫn thất bại. Khi dự án thất bại, chả thành vấn đề ai hoàn thành công việc trước và ai có thể làm công việc tốt, đó là thất bại của tổ bởi vì mục đích toàn thể không thể được đạt tới.
Một trong những kĩ năng có thể đem mọi thứ vào trong dự án là kĩ năng tổ chức. Người kĩ sư phần mềm trung bình rất giỏi về kĩ thuật nhưng nếu họ không được tổ chức, họ sẽ không có khả năng làm cho mọi thứ được thực hiện và cuối cùng sẽ bị tràn ngập bởi sức ép dự án. Người kĩ sư phần mềm giỏi nhất bao giờ cũng giữ kế hoạch dự án với các nhiệm vụ hàng ngày chi tiết và có khả năng sắp ưu tiên chúng một cách tương ứng. Họ biết cái nhìn hàng ngày về các cuộc họp và nhiệm vụ và cập nhật mọi thứ mà họ phải đạt tới vào ngày đó để cho mọi sự sẽ không bị trì hoãn sang ngày sau. Họ giữ dấu vết của tất cả công việc của mình và có thể lập tức chèo lái dự án, báo cáo cho cuộc họp, và cung cấp các chi tiết khác khi được yêu cầu. Bằng việc làm cho mọi sự được thực hiện từng ngày họ biết lịch biểu và các mong đợi và có khả năng điều chỉnh chúng để đáp ứng cho các mục đích dự án. Ngược lại, người kĩ sư phần mềm trung bình không nghĩ xa trước mà chỉ làm việc tương ứng với điều người quản lí bảo họ và điều lịch biểu ấn định mỗi ngày. Khi mọi sự thay đổi, họ không biết phải ưu tiên cái gì và không có kế hoạch hoàn thành chúng mà dựa vào người quản lí dự án phân công cho họ việc tương ứng. Người kĩ sư phần mềm giỏi nhất không chỉ nghĩ về mục đích dự án, mà còn hình dung nó và hiểu làm sao hoàn thành nó bởi vì họ có thể thấy đích xác điều họ phải làm từng ngày, từng tuần, từng tháng để đáp ứng mong đợi.
Người kĩ sư phần mềm giỏi nhất sẽ thường xuyên cải tiến kĩ năng của họ. Họ bao giờ cũng tìm kiếm tri thức mới và thường không đợi người quản lí yêu cầu họ nhận việc huấn luyện thêm. Họ học điều mới theo cách riêng của họ bởi vì họ muốn là người giỏi nhất. Họ thấy các lớp huấn luyện mới mà họ muốn đi học và yêu cầu người quản lí cho phép tham dự để cho họ có thể học cái gì đó mới và đóng góp thêm cho tổ chức. Người kĩ sư phần mềm trung bình không thích học cái mới nhiều bởi vì họ tin rằng họ đã tốt nghiệp đại học, đã có bằng cấp và biết “đủ để làm việc của mình”. Họ bằng lòng với điều họ biết nhưng họ không hiểu sự kiện là công nghệ bao giờ cũng thay đổi cho nên sau vài năm làm việc họ sẽ lo lắng về nghề nghiệp của mình bởi vì họ có thể không có kĩ năng mà công ti cần và có thể không có khả năng giữ được việc. Phần mềm là lĩnh vực rất năng động và nếu người ta không giữ cùng nhịp với thay đổi công nghệ, họ có thể bị loại.
Có nhiều kĩ sư phần mềm trung bình trong công nghiệp ngày nay nhưng có rất ít “kĩ sư phần mềm giỏi nhất”. Lí do thật đơn giản: ngày nay rất ít trường dạy về trao đổi và công việc tổ trong chương trình kĩ sư phần mềm. Kĩ sư phần mềm trung bình có thể giỏi về kĩ thuật nhưng lại nghèo nàn về trao đổi và công việc tổ. Họ không biết cách thảo luận mọi sự qua email, đặc biệt trong các cuộc họp SCRUM, chia sẻ “Thực hành giỏi nhất: trong kiểm điểm kĩ thuật, trình bày cho khách hàng về giải pháp kĩ thuật và quảng cáo cho hàng trăm người về sản phẩm phần mềm trong chiến dịch tiếp thị. Năng lực trao đổi rõ ràng và hiệu quả là rất mấu chốt cho mọi kĩ sư phần mềm. Kĩ năng trao đổi của bạn càng tốt, bạn sẽ càng đi xa hơn bởi vì người kĩ sư phần mềm giỏi nhất dành hầu hết thời gian vào trao đổi, giải thích về mục đích của công ti, thu hút kinh doanh của khách hàng, giải quyết vấn đề, cho hướng dẫn, động viên công nhân khác v.v..
Tất nhiên một số trong các bạn có thể nghĩ rằng tôi là người lí tưởng thế về kĩ nghệ phần mềm nhưng tôi đã từng ở trong kinh doanh phần mềm trong hơn 35 năm và đã thấy nhiều kĩ sư phần mềm giỏi cũng như kĩ sư trung bình. Tôi có thể tự tin mà nói rằng bạn càng cải tiến kĩ năng phần mềm của mình tốt hơn, càng làm cho bản thân mình dự ứng trong học tập, chia sẻ, cải tiến thì bạn sẽ càng có cơ hội tốt hơn để trở thành một trong những kĩ sư phần mềm giỏi nhất mà bạn đã từng hình dung. Nếu bạn chọn nghĩ về bản thân mình như “đủ tốt”, và chẳng có gì hơn để học, bạn bao giờ cũng sẽ ở nơi bạn đã đã ở đó qua thời gian, bạn sẽ bắt đầu lo nghĩ bởi vì nếu bạn không tiến lên, bạn thậm chí không đứng yên đâu mà thực tế bạn đang đi lùi bởi vì thế giới đang đi nhanh lên trước.
Là người kĩ sư phần mềm và một giáo sư, lời khuyên cuối cùng của tôi với bạn là bạn phải có đam mê về điều bạn làm. Không có đam mê, bạn sẽ không là người kĩ sư phần mềm lớn được, hay không lớn về bất kì cái gì. Thiếu đam mê là lí do số một cho nên nhiều kĩ sư phần mềm chưa bao giờ trở thành giỏi trong điều họ làm và điều đó cũng là lí do số một mà nhiều người không thành công trong nghề nghiệp của mình. Bằng việc tuân theo những lời khuyên này, bạn có thể có được vị trí bạn muốn, cải thiện điều bạn đã chờ đợi, và bạn sẽ hạnh phúc hơn với nghề của mình bởi vì công nghiệp phần mềm bao giờ cũng đời hỏi người kĩ sư giỏi nhất và điều tuyệt vời là biết rằng bạn là một trong số họ.
—-English version—-
The best software engineer
My friend asked me: How do you know a best software engineer from an average one? Following is my personal opinion:
The best software engineer is very careful when writing code by focusing on the quality not the quantity. The average software engineers like to code, they seem to stay in front of the computer most of the time to generate a lot of code but their programs may or may not work so they have to fix them over and over. This “code and fix” wastes lot of efforts and never achieve the quality as expected by the customers. Good code is done by software engineers that are disciplined, they know how long each problem should take, and carefully planning their approaches to make sure that they complete their task accordingly. As a manager, I have seen both types of software engineer, when I told them “I need this task completed by Friday” then by Friday, someone come and let me know that they have tested their code and it is ready for integration testing. With these people I can feel that there will be very little, if any, defects found by the testing team. However, there are people that told me “I am still coding but it will be done late Friday or early Monday” then with them, I can be sure that they may have skipped some tests to meet the dateline and most of the time their codes are full of defects. Why? Because a good software engineer know how long it takes and plan the work carefully and will let me know whether they can make the dateline or not when an average software engineer would rather code first then ask question later.
For every problem there are many ways to solve it but the best software engineer would try to understand the problem first before doing anything. By having understood the problem, he will be carefully thinking on how to solve it and discuss it with their team on the best solution. He knows that there are many options and what he proposes may not be the best so he is seeking advises from others and come up with a logical and better approach. By look at the problem, figure out what the outcome needs to be, he will figure how much time he need to solve it, and what kind of quality being expected before he even starts to work on the solution. On the contrary, average software engineers would immediately start to code first without much thinking then fixing it if it does not meet the requirements. This type of “code and fix “then “fix then code” will never create quality software because the more they fix, the more defects they will injected into the solution.
Best software engineers always share things with the team and learn from each others. They know that by sharing, they learn more so when they learn new things, new technologies they will discuss with the team about what works and what do not work so people can avoid making mistakes. They are better by making other better .They always seek advises from senior people because these people have experiences, been through many projects and know by instinct to make the right decision. Average software engineers may be very good in what they do but they like to be a hero, to be recognized by others so they do not like to share and keep information to themselves, in this case they are losing their value because software work is teamwork and a team that have too many heroes eventually will have no hero at all because everybody will fail. Even if they are good and could finish their works on time but if the team did not then the project still fail. When a project fail, it does not matter who is finishing the work first and who can do good work it is a team’s failure because the overall goal can not be achieved.
One of the skills that can bring everything in the project together is organization skill. Average software engineers are very good in technical but if they are not organized, they will not be able to get things done and eventually will be overwhelmed by the project pressure. Best software engineers always keep a project plan with detailed daily tasks and are able to prioritize them accordingly. They know their daily outlook of meetings and tasks and keep up to date everything that they must achieve on that day so things will not get postponed into the next day. They keep track of all their works and can instantly pull up projects, meeting reports, and other details when asked. By getting things done each day they know their schedules and expectations and be able to adjust them to meet project’s goals. On the contrary, average software engineers do not think far ahead but only work according to what the manager tell them and what the schedule dictated each day. When things change, they do not know what to prioritize and have no plan to accomplish them but rely on the project manager to assign them works accordingly. Best software engineers not only thinking about the project goals, but also visualizes it and understands how to accomplish it because they can see exactly what they must be doing each day, each week, each month to meet the expectation.
Best software engineers will constantly improving their skills. They always seeking new knowledge and usually do not wait for managers to ask them to take additional training. They learn new things on their own because they want to be the best. They find new training classes that they want to go and ask managers for permission to attend so they can learn some thing new and contribute more to the organization. Average software engineers do not like to learn new things much because they believe that they already graduated from universities, have degrees and know “enough to do their jobs”. They are content of what they know but they do not understand the fact that technology always changes so after few working years they will worry about their career because they may not have the skills that the company need and may not be able to keep the jobs. Software is a very dynamic field and if people do not keep up with the technology change, they may be eliminated.
There are many average software engineers in the industry today but there are very few “best software engineers”. The reason is simple: today very few schools would teach communication and teamwork in the software engineer program. Average software engineers may be good in technical but poorly in communication and teamwork. They do not know how to discuss things over emails, participate in SCRUM meetings, share “Best practices: in a technical reviews, present to the customer about a technical solution and promote hundreds people about the software product in a marketing campaign. The ability to communicate clearly and effectively is very critical to all software engineers. The better your communication skill, the farther you will go because best software engineers spend most of the time in communication, explaining the company’s goal, solicit customer’s business, solving problems, giving directions, motivating other workers etc.
Of course some of you may think that I am so idealistic about software engineering but I have been in this software business for over 35 years and have seen a lot of good software engineers as well as average engineers. I can confidently stated that the better you can improve your software skill, make yourself proactive in learning, sharing, improving then the better chance you will become one of the best software engineer that you have ever imagined. If you choose to think of yourself as “good enough”, and have nothing more to learn, you will always staying where you are then over time, you will start to worry because if you are not moving forward, you are not even standing still but actually you are moving backward because the world is moving fast forward.
As a software engineer and a professor, my last advice to you is you must have passion on what you do. Without passion, you will not be a great software engineer, or great at anything. Lack of passion is the number one reason so many software engineer never become good for what they do and it is also the number one reason many people do not succeed in their career. By follow these advises, you may get the position you want, improve what you have been waiting for, and you will be happier with your career because the software industry always demand the best engineer and it is great to know that you are one of them.