Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng sẽ giúp hướng nghiệp cho các bạn muốn học hai ngành này.
Bài viết này lược dịch từ chương 4 quyển Professional Software Development , tác giả Steve McConnell, nhà xuất bản Addison Wesley phát hành năm 2003. Steve McConnelll vào năm 1998 được độc giả tạp chí Software Development bình chọn là một trong ba nhân vật ảnh hưởng nhất đến công nghiệp phần mềm, cùng với Bill Gates và Linus Torvalds. Ông là tổng biên tập tạp chí IEEE Software từ năm 1998 đến năm 2002.
Để hiểu sâu sắc về nghề lập trình, hãy tìm đọc tác phẩm Lập trình sư, tác giả Bàn Tải Cân. Có giai thoại anh Cân trước là một nhà toán học trẻ đại tài, bận nghiên cứu khoa học máy tính quá, một hôm về nhà thấy vợ mình đang mây mưa với người khác, anh liền đóng cửa, bước ra ngoài sau khi nói một câu để đời "Xin lỗi đã làm phiền hai người". Từ đấy anh bỏ khoa học máy tính, sang làm phần mềm, thành lập một trong những công ty tiên phong trong lĩnh vực phần mềm của Việt Nam.
Nhà khoa học xây để học, kĩ sư học để xây. – FRED BROOKS
Khi phỏng vấn ứng viên cho vị trí lập trình, câu tôi thích hỏi là: “Bạn có thể tự ví mình là ai trong quá trình làm một phần mềm?”. Tôi đưa ra một số ví dụ: thợ mộc, lính cứu hỏa, kiến trúc sư, họa sĩ, nhà văn, nhà thám hiểm, nhà khoa học. Một số ứng viên cố đoán xem câu trả lời nào sẽ làm tôi hài lòng; đa số ứng viên tự ví mình với “nhà khoa học”. Những người lập trình siêu thường bảo là họ ví mình như đặc công hoặc cảnh sát cơ động. Có một ứng viên trả lời rằng: “Khi thiết kế phần mềm, tôi là kiến trúc sư. Khi thiết kế giao diện, tôi là họa sĩ. Khi viết chương trình, tôi là thợ thủ công. Còn khi kiểm tra chương trình, tôi là thằng cực kì nghịch ngợm!”, tôi thích câu trả lời này nhất.
Tôi thích đưa ra câu hỏi này, vì nó là câu hỏi cơ bản về làm phần mềm: Làm phần mềm thuộc về lãnh vực gì? Khoa học? Nghệ thuật? Hay lãnh vực gì khác?
“Là” và “nên”
Tranh cãi làm phần mềm là nghệ thuật hay khoa học đã có từ lâu. Ba mươi năm trước, Donald Knuth bắt đầu viết bộ sách 7 tập nhan đề Nghệ thuật lập trình. 3 tập đầu gồm có 2200 trang, nghĩa là cả bộ sách có thể đạt khoảng 5000 trang. Nếu nghệ thuật lập trình là như thế, tôi không chắc là mình sẽ muốn tìm hiểu khoa học lập trình.
Những người chủ trương lập trình là nghệ thuật chỉ ra khía cạnh thẩm mỹ của việc làm phần mềm, và cho rằng khoa học không cho phép độ cảm hứng và tự do sáng tạo đạt đến mức cao như vậy. Những người chủ trương lập trình là khoa học dẫn ra lỗi trong nhiều chương trình, và cho rằng đối với chương trình máy tính thì độ tin cậy thấp như vậy là không thể chấp nhận – không có chỗ cho tự do sáng tạo. Cả 2 quan điểm đều không toàn diện và cả 2 đều đặt sai câu hỏi. Làm phần mềm là nghệ thuật, là khoa học, là xã hội học, và nhiều hoạt động khác nữa. Nó mang tính tài tử ở một số khía cạnh, nhưng lại mang tính chuyên nghiệp ở những khía cạnh khác. Do đó, câu hỏi thích hợp không là “Làm phần mềm là gì?”, mà là “Làm phần mềm một cách chuyên nghiệp nên như thế nào?”. Theo ý kiến của tôi, câu trả lời là: Làm phần mềm một cách chuyên nghiệp nên thuộc về ngành kĩ thuật.
Kĩ thuật và khoa học
Chỉ khoảng 40% người làm phần mềm có bằng cử nhân khoa học máy tính, và trên thực tế không ai có bằng kĩ sư phần mềm. Do đó không có gì ngạc nhiên là nhiều người bối rối khi phân biệt kĩ thuật phầm mềm và khoa học máy tính. Sự phân biệt giữa khoa học và kĩ thuật trong lãnh vực phần mềm cũng giống như trong các lãnh vực khác. Nhà khoa học thì nghiên cứu những chân lí, kiểm chứng những giả thuyết. Kĩ sư thì học cách áp dụng kiến thức để giải quyết những vấn đề thực tế. Nhà khoa học phải cập nhật thông tin về những nghiên cứu mới nhất. Kĩ sư phải làm quen với những kĩ thuật được chứng minh là đúng đắn và hiệu quả. Nếu là nhà khoa học, bạn có thể bỏ hết công sức để chỉ đào sâu một chuyên ngành hẹp nào đó. Nếu là kĩ sư, bạn phải hiểu biết rộng về tất cả các yếu tố ảnh hưởng đến sản phẩm mình đang thiết kế. Nhà khoa học thì không cần được chuẩn hóa, vì họ chủ yếu làm việc với nhau. Còn kĩ sư thì nhất thiết phải được chuẩn hóa, vì họ chủ yếu làm việc với số đông người bình thường, không cùng chuyên môn với họ. Kiến thức khoa học giúp sinh viên sau khi ra trường có thể tiếp tục tự nghiên cứu. Kiến thức kĩ thuật giúp sinh viên có thể tham gia vào lực lượng lao động ngay sau khi ra trường.
Các trường đại học cấp bằng cử nhân khoa học máy tính cho sinh viên, và thường thì các trường đại học cho rằng những cử nhân này sau khi ra trường có thể tham gia ngay các dự án phần mềm, các dự án mà trong đó họ phải giải quyết vấn đề của thế giới thực, không còn là của thế giới ảo trong sách vở. Chỉ một phần nhỏ những cử nhân này tiếp tục học sau đại học.
Những cử nhân khoa học máy tính này bị đặt vào tình huống hết sức khó khăn. Được gọi là nhà khoa học, chưa qua đào tạo về kĩ thuật, nhưng họ phải làm công việc của kĩ sư. Điều này giống như việc chỉ định công việc thiết kế thiết bị điện với mục đích thương mại cho một tiến sĩ vật lí. Có thể vị tiến sĩ này hiểu rất rõ các nguyên lí về điện, nhưng ông ta chỉ có kinh nghiệm chế tạo các thiết bị dùng cho nghiên cứu trong phòng thí nghiệm. Ông ta không có kinh nghiệm chế tạo các thiết bị dùng cho mục đích thương mại, theo yêu cầu của người tiêu dùng. Thiết bị ông ta chế tạo có thể hoạt động được trong điều kiện phòng thí nghiệm, nhưng thiếu thực tiễn hoặc không an toàn trong điều kiện của thế giới bên ngoài phòng thí nghiệm. Cũng có thể chi phí để chế tạo một bản mẫu để thí nghiệm là chấp nhận được, nhưng chi phí để sản xuất hàng loạt lại quá cao.
Khi người lao động được đào tạo để trở thành nhà khoa học máy tính bắt đầu tham gia làm phần mềm thực sự, những thứ mà họ thiết kế và xây dựng ra thường rất tệ, không thể gọi là sản phẩm để giao cho khách hàng. Họ thường chú tâm vào một vài vấn đề hẹp, và bỏ qua nhiều yếu tố khác quan trọng hơn. Họ có thể bỏ ra 2 ngày để điều chỉnh một thuật toán cho phù hợp với yêu cầu công việc, thay vì bỏ ra 2 tiếng đồng hồ để học cách sử dụng thư viện có sẵn. Một sinh viên vừa tốt nghiệp ngành khoa học máy tính thường phải mất vài năm đào tạo qua công việc thực tế mới đạt được những kiến thức thực dụng, những kiến thức để có thể làm ra một sản phẩm nho nhỏ thực sự.
Công nghiệp phần mềm là nạn nhân của sự thành công của chính nó. Yêu cầu của thị trường việc làm phát triển nhanh hơn khả năng cung ứng của hạ tầng giáo dục, và do đó hơn một nửa số người làm về phần mềm được đào tạo trong những ngành không phải là phần mềm. Hạ tầng giáo dục đang chạy ì ạch phía sau yêu cầu tuyển dụng.
Kĩ thuật phần mềm
Một số người nghĩ rằng “kĩ sư phần mềm” đồng nghĩa với “lập trình viên”, “kĩ thuật phần mềm” đồng nghĩa với “lập trình”. Phải thừa nhận rằng, họ đang nhầm lẫn.
Từ “kĩ thuật” dùng để chỉ việc áp dụng các nguyên lí khoa học và toán học cho những mục đích thực tiễn. Chúng ta sử dụng những thuật toán được định nghĩa bằng toán học, những phương pháp thiết kế, những phương pháp quản lí chất lượng, ... để làm phần mềm. Trong các lãnh vực kĩ thuật khác (vd: kĩ thuật xây dựng), nghề nghiệp tương ứng được phát minh ra (vd: kĩ sư xây dựng), và chúng ta có thể xác định được người có trình độ thế nào thì mới đủ tư cách để tạo ra sản phẩm (vd: nhà). Lãnh vực phần mềm cũng tương tự như vậy.
Một số người nghĩ rằng đã coi làm làm phần mềm thuộc về kĩ thuật, thì luôn luôn phải áp dụng những phương pháp chính qui – viết chương trình luôn luôn phải chặt chẽ như chứng minh định lí toán học. Ý nghĩ này xuất phát từ nhận định sai về ngành kĩ thuật. Ngành kĩ thuật là ngành áp dụng những nguyên lí khoa học cho những mục tiêu thực tiễn. Coi làm phần mềm là kĩ thuật giúp làm sáng tỏ thêm ý: những mục tiêu khác nhau là phù hợp cho những dự án phần mềm khác nhau. Khi thiết kế một căn nhà, vật liệu xây dựng phải phù hợp với mục tiêu sử dụng căn nhà. Tôi có thể xây một nhà kho để chứa máy cày từ vật liệu là thép tấm, nhưng tôi không dùng thép tấm để xây nhà ở.
Một dự án phần mềm được thực hiện tốt, thì có thể đáp ứng các mục tiêu đối với sản phẩm:
Ít lỗi
Dễ sử dụng
Dễ bảo dưỡng
Dễ nâng cấp
Thời gian xử lí nhanh
Độ chính xác cao
Những người thực hiện dự án cần xác định tầm quan trọng tương đối giữa các mục tiêu trên một các rõ ràng trước khi bắt tay thực hiện.
Trong các dự án có sử dụng vật liệu, chi phí vật liệu có thể chiếm hơn 50% giá trị của cả dự án. Một số công ty cho rằng bất kì dự án nào mà chi phí nhân công chiếm hơn 50% giá trị dự án, thì dự án đó có độ rủi ro cao. Đối với dự án phần mềm, chi phí nhân công thường chiếm 100% giá trị cả dự án. Do đó, có thêm các mục tiêu đối với dự án:
Thời gian lập dự án ngắn
Có thể xác định tương đối chính xác thời điểm giao sản phẩm
Số thành viên tham gia dự án ít
Dễ thay đổi tính năng của phần mềm khi dự án đang diễn ra
Mục tiêu đối với dự án và mục tiêu đối với sản phẩm cần cân đối với nhau.
http://kipalog.com/posts/Cu-nhan-khoa-hoc-may-tinh-khong-la-ki-su-phan-mem Tác giả: Ngoc Dao
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng sẽ giúp hướng nghiệp cho các bạn muốn học hai ngành này.
Bài viết này lược dịch từ chương 4 quyển Professional Software Development , tác giả Steve McConnell, nhà xuất bản Addison Wesley phát hành năm 2003. Steve McConnelll vào năm 1998 được độc giả tạp chí Software Development bình chọn là một trong ba nhân vật ảnh hưởng nhất đến công nghiệp phần mềm, cùng với Bill Gates và Linus Torvalds. Ông là tổng biên tập tạp chí IEEE Software từ năm 1998 đến năm 2002.
Để hiểu sâu sắc về nghề lập trình, hãy tìm đọc tác phẩm Lập trình sư, tác giả Bàn Tải Cân. Có giai thoại anh Cân trước là một nhà toán học trẻ đại tài, bận nghiên cứu khoa học máy tính quá, một hôm về nhà thấy vợ mình đang mây mưa với người khác, anh liền đóng cửa, bước ra ngoài sau khi nói một câu để đời "Xin lỗi đã làm phiền hai người". Từ đấy anh bỏ khoa học máy tính, sang làm phần mềm, thành lập một trong những công ty tiên phong trong lĩnh vực phần mềm của Việt Nam.
Nhà khoa học xây để học, kĩ sư học để xây. – FRED BROOKS
Khi phỏng vấn ứng viên cho vị trí lập trình, câu tôi thích hỏi là: “Bạn có thể tự ví mình là ai trong quá trình làm một phần mềm?”. Tôi đưa ra một số ví dụ: thợ mộc, lính cứu hỏa, kiến trúc sư, họa sĩ, nhà văn, nhà thám hiểm, nhà khoa học. Một số ứng viên cố đoán xem câu trả lời nào sẽ làm tôi hài lòng; đa số ứng viên tự ví mình với “nhà khoa học”. Những người lập trình siêu thường bảo là họ ví mình như đặc công hoặc cảnh sát cơ động. Có một ứng viên trả lời rằng: “Khi thiết kế phần mềm, tôi là kiến trúc sư. Khi thiết kế giao diện, tôi là họa sĩ. Khi viết chương trình, tôi là thợ thủ công. Còn khi kiểm tra chương trình, tôi là thằng cực kì nghịch ngợm!”, tôi thích câu trả lời này nhất.
Tôi thích đưa ra câu hỏi này, vì nó là câu hỏi cơ bản về làm phần mềm: Làm phần mềm thuộc về lãnh vực gì? Khoa học? Nghệ thuật? Hay lãnh vực gì khác?
“Là” và “nên”
Tranh cãi làm phần mềm là nghệ thuật hay khoa học đã có từ lâu. Ba mươi năm trước, Donald Knuth bắt đầu viết bộ sách 7 tập nhan đề Nghệ thuật lập trình. 3 tập đầu gồm có 2200 trang, nghĩa là cả bộ sách có thể đạt khoảng 5000 trang. Nếu nghệ thuật lập trình là như thế, tôi không chắc là mình sẽ muốn tìm hiểu khoa học lập trình.
Những người chủ trương lập trình là nghệ thuật chỉ ra khía cạnh thẩm mỹ của việc làm phần mềm, và cho rằng khoa học không cho phép độ cảm hứng và tự do sáng tạo đạt đến mức cao như vậy. Những người chủ trương lập trình là khoa học dẫn ra lỗi trong nhiều chương trình, và cho rằng đối với chương trình máy tính thì độ tin cậy thấp như vậy là không thể chấp nhận – không có chỗ cho tự do sáng tạo. Cả 2 quan điểm đều không toàn diện và cả 2 đều đặt sai câu hỏi. Làm phần mềm là nghệ thuật, là khoa học, là xã hội học, và nhiều hoạt động khác nữa. Nó mang tính tài tử ở một số khía cạnh, nhưng lại mang tính chuyên nghiệp ở những khía cạnh khác. Do đó, câu hỏi thích hợp không là “Làm phần mềm là gì?”, mà là “Làm phần mềm một cách chuyên nghiệp nên như thế nào?”. Theo ý kiến của tôi, câu trả lời là: Làm phần mềm một cách chuyên nghiệp nên thuộc về ngành kĩ thuật.
Kĩ thuật và khoa học
Chỉ khoảng 40% người làm phần mềm có bằng cử nhân khoa học máy tính, và trên thực tế không ai có bằng kĩ sư phần mềm. Do đó không có gì ngạc nhiên là nhiều người bối rối khi phân biệt kĩ thuật phầm mềm và khoa học máy tính. Sự phân biệt giữa khoa học và kĩ thuật trong lãnh vực phần mềm cũng giống như trong các lãnh vực khác. Nhà khoa học thì nghiên cứu những chân lí, kiểm chứng những giả thuyết. Kĩ sư thì học cách áp dụng kiến thức để giải quyết những vấn đề thực tế. Nhà khoa học phải cập nhật thông tin về những nghiên cứu mới nhất. Kĩ sư phải làm quen với những kĩ thuật được chứng minh là đúng đắn và hiệu quả. Nếu là nhà khoa học, bạn có thể bỏ hết công sức để chỉ đào sâu một chuyên ngành hẹp nào đó. Nếu là kĩ sư, bạn phải hiểu biết rộng về tất cả các yếu tố ảnh hưởng đến sản phẩm mình đang thiết kế. Nhà khoa học thì không cần được chuẩn hóa, vì họ chủ yếu làm việc với nhau. Còn kĩ sư thì nhất thiết phải được chuẩn hóa, vì họ chủ yếu làm việc với số đông người bình thường, không cùng chuyên môn với họ. Kiến thức khoa học giúp sinh viên sau khi ra trường có thể tiếp tục tự nghiên cứu. Kiến thức kĩ thuật giúp sinh viên có thể tham gia vào lực lượng lao động ngay sau khi ra trường.
Các trường đại học cấp bằng cử nhân khoa học máy tính cho sinh viên, và thường thì các trường đại học cho rằng những cử nhân này sau khi ra trường có thể tham gia ngay các dự án phần mềm, các dự án mà trong đó họ phải giải quyết vấn đề của thế giới thực, không còn là của thế giới ảo trong sách vở. Chỉ một phần nhỏ những cử nhân này tiếp tục học sau đại học.
Những cử nhân khoa học máy tính này bị đặt vào tình huống hết sức khó khăn. Được gọi là nhà khoa học, chưa qua đào tạo về kĩ thuật, nhưng họ phải làm công việc của kĩ sư. Điều này giống như việc chỉ định công việc thiết kế thiết bị điện với mục đích thương mại cho một tiến sĩ vật lí. Có thể vị tiến sĩ này hiểu rất rõ các nguyên lí về điện, nhưng ông ta chỉ có kinh nghiệm chế tạo các thiết bị dùng cho nghiên cứu trong phòng thí nghiệm. Ông ta không có kinh nghiệm chế tạo các thiết bị dùng cho mục đích thương mại, theo yêu cầu của người tiêu dùng. Thiết bị ông ta chế tạo có thể hoạt động được trong điều kiện phòng thí nghiệm, nhưng thiếu thực tiễn hoặc không an toàn trong điều kiện của thế giới bên ngoài phòng thí nghiệm. Cũng có thể chi phí để chế tạo một bản mẫu để thí nghiệm là chấp nhận được, nhưng chi phí để sản xuất hàng loạt lại quá cao.
Khi người lao động được đào tạo để trở thành nhà khoa học máy tính bắt đầu tham gia làm phần mềm thực sự, những thứ mà họ thiết kế và xây dựng ra thường rất tệ, không thể gọi là sản phẩm để giao cho khách hàng. Họ thường chú tâm vào một vài vấn đề hẹp, và bỏ qua nhiều yếu tố khác quan trọng hơn. Họ có thể bỏ ra 2 ngày để điều chỉnh một thuật toán cho phù hợp với yêu cầu công việc, thay vì bỏ ra 2 tiếng đồng hồ để học cách sử dụng thư viện có sẵn. Một sinh viên vừa tốt nghiệp ngành khoa học máy tính thường phải mất vài năm đào tạo qua công việc thực tế mới đạt được những kiến thức thực dụng, những kiến thức để có thể làm ra một sản phẩm nho nhỏ thực sự.
Công nghiệp phần mềm là nạn nhân của sự thành công của chính nó. Yêu cầu của thị trường việc làm phát triển nhanh hơn khả năng cung ứng của hạ tầng giáo dục, và do đó hơn một nửa số người làm về phần mềm được đào tạo trong những ngành không phải là phần mềm. Hạ tầng giáo dục đang chạy ì ạch phía sau yêu cầu tuyển dụng.
Kĩ thuật phần mềm
Một số người nghĩ rằng “kĩ sư phần mềm” đồng nghĩa với “lập trình viên”, “kĩ thuật phần mềm” đồng nghĩa với “lập trình”. Phải thừa nhận rằng, họ đang nhầm lẫn.
Từ “kĩ thuật” dùng để chỉ việc áp dụng các nguyên lí khoa học và toán học cho những mục đích thực tiễn. Chúng ta sử dụng những thuật toán được định nghĩa bằng toán học, những phương pháp thiết kế, những phương pháp quản lí chất lượng, ... để làm phần mềm. Trong các lãnh vực kĩ thuật khác (vd: kĩ thuật xây dựng), nghề nghiệp tương ứng được phát minh ra (vd: kĩ sư xây dựng), và chúng ta có thể xác định được người có trình độ thế nào thì mới đủ tư cách để tạo ra sản phẩm (vd: nhà). Lãnh vực phần mềm cũng tương tự như vậy.
Một số người nghĩ rằng đã coi làm làm phần mềm thuộc về kĩ thuật, thì luôn luôn phải áp dụng những phương pháp chính qui – viết chương trình luôn luôn phải chặt chẽ như chứng minh định lí toán học. Ý nghĩ này xuất phát từ nhận định sai về ngành kĩ thuật. Ngành kĩ thuật là ngành áp dụng những nguyên lí khoa học cho những mục tiêu thực tiễn. Coi làm phần mềm là kĩ thuật giúp làm sáng tỏ thêm ý: những mục tiêu khác nhau là phù hợp cho những dự án phần mềm khác nhau. Khi thiết kế một căn nhà, vật liệu xây dựng phải phù hợp với mục tiêu sử dụng căn nhà. Tôi có thể xây một nhà kho để chứa máy cày từ vật liệu là thép tấm, nhưng tôi không dùng thép tấm để xây nhà ở.
Một dự án phần mềm được thực hiện tốt, thì có thể đáp ứng các mục tiêu đối với sản phẩm:
Ít lỗi Dễ sử dụng Dễ bảo dưỡng Dễ nâng cấp Thời gian xử lí nhanh Độ chính xác cao Những người thực hiện dự án cần xác định tầm quan trọng tương đối giữa các mục tiêu trên một các rõ ràng trước khi bắt tay thực hiện.
Trong các dự án có sử dụng vật liệu, chi phí vật liệu có thể chiếm hơn 50% giá trị của cả dự án. Một số công ty cho rằng bất kì dự án nào mà chi phí nhân công chiếm hơn 50% giá trị dự án, thì dự án đó có độ rủi ro cao. Đối với dự án phần mềm, chi phí nhân công thường chiếm 100% giá trị cả dự án. Do đó, có thêm các mục tiêu đối với dự án:
Thời gian lập dự án ngắn Có thể xác định tương đối chính xác thời điểm giao sản phẩm Số thành viên tham gia dự án ít Dễ thay đổi tính năng của phần mềm khi dự án đang diễn ra Mục tiêu đối với dự án và mục tiêu đối với sản phẩm cần cân đối với nhau.