Một người tốt nghiệp phần mềm hỏi tôi: “Khác biệt là gì giữa công ti phần mềm tốt và công ti xấu. Làm sao tôi phân biệt được họ? Có cách nào tìm ra trước khi tôi làm việc cho họ không? Xin thầy lời khuyên.”

Đáp: Cách tốt nhất là hỏi những người làm việc ở đó. Hỏi người phát triển về điều kiện làm việc của họ. Tìm ra ai từ trường của bạn ra và làm việc ở đó và hỏi họ.

Công ti phần mềm xấu đầy quan liêu và cạnh tranh. Trong công ti xấu, người quản lí thiên vị một số người phát triển hơn những người khác bằng việc chỉ chia sẻ thông tin với những người phát triển họ ưa chuộng. Người phát triển có kinh nghiệm kiểm soát hoạt động dự án và bảo vệ vị trí của họ bằng việc nhận mọi việc quan trọng, để lại cho các thành viên tổ ít kinh nghiệm với công việc tầm thường, phần lớn là viết mã và kiểm thử. Những người phát triển cạnh tranh lẫn nhau để có được sự chú ý của người quản lí với hi vọng “lên lương tốt hơn” hay “điểm thưởng”.

Công ti phần mềm tốt là năng động hơn và thường tăng trưởng nhanh. Trong công ti tốt, người quản lí có viễn kiến và chiều hướng rõ ràng về làm cái gì. Có ý thức làm việc tổ nơi các thành viên tổ giúp đỡ lẫn nhau khi mọi người đều có cơ hội đóng góp cho mục đích chung của công ti. Thông tin và tri thức thường được chia sẻ cởi mở qua cộng tác thường xuyên. Không có anh hùng cá nhân nhưng chỉ có tổ khi những người phát triển nhìn nhau như đối tác thay vì đối thủ cạnh tranh.

Công ti phần mềm xấu đầy sức ép gây ra bởi lịch biểu bị lỡ, yêu cầu bị thiếu và mong đợi không hiện thực. Những người phát triển chỉ làm điều họ được người quản lí bảo. Họ có thể dành nhiều tuần làm việc theo cách riêng của họ để chuyển giao một chức năng nhưng không muốn chia sẻ thông tin với người khác. Nhiều công việc kéo dài nhiều giờ và thường ở khu vực cô lập. Họ không thích kiểm điểm và thường tranh cãi với nhau để bảo vệ vị trí của họ. Ít người có trách nhiệm cho công việc của họ và thường để trễ những việc cố định cho tới phút chót. Nhiều người thường bỏ công ti sau vài tháng cho nên bao giờ cũng có việc làm mở ra.

Trong công ti phần mềm tốt, người phát triển cam kết với công việc của họ và nói chung chuyển giao chúng. Họ lập kế hoạch công việc tương ứng và tuân theo nó với nhịp độ giữ cho họ tìm ra giải pháp tốt nhất và không chạy xô làm mọi việc một cách nhanh chóng. Kiểm thử và tích hợp nghĩa là lấy các bước nhỏ, biết ngay nếu có lỗi nào và không bao giờ để các lỗi trở thành không thể quản lí được. Người phát triển hỗ trợ lẫn nhau khi mọi sự thành khó khăn. Bằng việc cộng tác họ chuyển giao sản phẩm đều đặn và nhận phản hồi trong kiểm điểm. Họ thường nhận trách nhiệm tập thể để liên tục cải tiến công việc của họ. Họ hiểu rằng họ sửa càng sớm mọi thứ, sẽ càng dễ chuyển giao hơn về phần mềm chất lượng. Phần lớn những người phát triển tận hưởng làm việc ở đó và thường ở lại đó.

—-English version—-

Good and bad company

A software graduate asked me: “What is the difference between a good software company and a bad one. How do I distinguish them? Is there any way to find out before I work for them? Please advice.”

Answer: The best way is to ask people who work there. Ask developers about their work condition. Find out who are from your school that work there and ask them.

Bad Software Company is full of bureaucracy and competition. In bad company, managers favor some developers over others by only share important information with their favorite developers. Experienced developers control project activities and protect their positions by get all important works, leaving less experienced team members with trivial works, mostly coding and testing. Developers compete with each other for managers’ attention with the hope of “better raise” or “extra bonus”.

Good Software Company is more dynamic and usually growing fast. In good company, managers have vision and clear direction on what to do. There is a sense of teamwork where team members are helping each others as everyone has a chance to contribute to the common goal of the company. Information and knowledge are often shared openly through constant collaboration. There is no individual hero but only team as developers see each other as partners rather than competitors.

Bad Software Company is full of pressures caused by missed schedules, missed requirements and unrealistic expectations. Developers only do what they are told by managers. They may spend weeks working on their own to deliver a function but do not want to share information with others. Many work long hours and often in an isolated area. They do not like reviews and often argue with each others to defend their positions. Few are responsible for their works and often delay fixing things until the last minute. Many often leave the company after few months so there are always jobs opening.

In good software company, developers commit to their works and generally deliver them. They plan works accordingly and follow it at a pace that keeps them finding the best solutions and not rushing to do thing quickly. Testing and integration means taking small steps, knowing immediately if there is any error and never letting defects become unmanageable. Developers support each other when things get difficult. By collaborating they deliver products regularly and get feedback during reviews. They often take a collective responsibility for continually improving their work. They understand that the sooner they fix things, the easier it will be to deliver quality software. Most developers enjoy working there and often stay.