Thật ra thì … phát triển phần mềm là gì?

      Bất kể khi bạn đang là một nhóc học sinh còn tò mò về thế giới, hoặc giả đã là một sinh viên “IT”, hay thậm chí là một người đã đi làm và có kinh nghiệm trong lĩnh vực phát triển phần mềm. Bạn có cảm thấy rằng, mình nên có nhu cầu để hiểu “Phát triển phần mềm thực ra là gì nhỉ?” không nhỉ? Và mình tin rằng, ngay cả khi bạn đã là một người rất có kinh nghiệm, bạn cũng chưa chắc đã biết câu trả lời, hoặc ít ra là cách để trả lời cho người khác, về câu hỏi này.

Ừ, thì là … viết code chứ gì nữa … Mà hỏi làm vẹo gì?

       “Phát triển phần mềm đại loại là việc viết các đoạn mã lệnh bằng một ngôn ngữ lập trình nào đó, để máy tính có thể hiểu và xử lí một công việc nào đó trong thực tế”. Thế đấy! Nếu bạn hỏi, bạn sẽ nhận được những câu trả lời như thế hoặc tương tự như thế. Có vấn đề gì với câu trả lời này không nhỉ?

      Nếu bạn là một học sinh đang cần tìm hiểu ngành nghề, bạn đã chẳng có thêm 1 tí thông tin hoặc hiểu biết gì về ngành Công nghệ thông tin nếu nhận được câu trả lời như thế này. Nếu bạn là một người “tư vấn tuyển sinh”, bạn đang làm rất tồi công việc trả lời và tư vấn của mình. Nếu bạn là một người có kinh nghiệm, thì hẳn là bạn cần xem lại chính kinh nghiệm của mình!

obvious question.jpg

      Nếu bạn là người có kinh nghiệm, hoặc tự nhận là thế, thì đến ngay cả việc hiểu mình đang làm gì bạn còn chưa làm được, nói chi tới việc làm tốt nhiệm vụ được giao. Vấn đề tương tự cũng sẽ xảy ra với những bạn sinh viên và học sinh, bạn sẽ có kế hoạch học tập và rèn luyện ra sao, nếu bạn còn chưa rõ rằng mình đang theo đuổi điều gì?

      Chương trình đào tạo ở một trường Đại học thông thường sẽ tiêu tốn của bạn mất 4 năm, trong khi đó việc theo học tại một trung tâm đào tạo CNTT (vd: Aptech, NIIT, …) chỉ mất khoảng 2 năm. Tại sao lại có sự khác biệt lớn về thời gian như vậy nhỉ? Thậm chí bạn còn nghe nói rằng “học viên trung tâm ra trường có khi còn code tốt hơn cả sinh viên đại học”. Có vấn đề gì ở đây chăng?

Phát triển phần mềm không chỉ là … ngồi code

      Nếu bạn nghĩ rằng, việc phát triển phần mềm đơn thuần chỉ là các công việc liên quan tới … cái máy tính thì bạn đã lầm, lầm to. Càng lầm hơn nữa nếu bạn nghĩ rằng làm phần mềm tức là ngồi gõ code lọc cọc, lọc cọc ngày qua ngày. Một nhà phát triển phần mềm tốt cần phải biết rằng, việc phát triển phần mềm bao gồm rất nhiều các công đoạn:

  • Xác định vấn đề: Bạn phải định rõ được vấn đề là gì trước khi có thể giải quyết nó.
  • Xây dựng / thu thập yêu cầu: Khi đã rõ vấn đề rồi, hãy xác định nhu cầu của người dùng: họ muốn giải quyết vấn đề tới mức như thế nào? chi tiết ra sao? ..v.v.
  • Lên kế hoạch thực hiện: Bởi có rất nhiều việc cần làm, bạn phải lên kế hoạch cẩn thận nếu như không muốn tất cả “chỉ là ý tưởng”.
  • Thiết kế kiến trúc tổng quan (high-level desgin): Khi đã xác định vấn đề rồi, bạn cần phải chọn lựa công cụ cần thiết để thực hiện, các bước chính yếu cần xử lí, và tổng quan công việc cần phải làm.
  • Thiết kế chi tiết (detailed design): Khi đã hình dung sơ bộ được bộ khung công việc, đã đến lúc xử lí chi tiết từng vấn đề một, bởi vì cùng một mong muốn, nhưng sẽ có nhiều cách khác nhau để thực hiện.
  • Viết code và debug: Khi đã biết mình phải làm cụ thể những gì, bắt tay vào code thôi. Đây là phần cụ thể nhất mà ta thường làm, do đó hay bị hiểu nhầm rằng phát triển phần mềm là chỉ có … viết code.
  • Kiểm thử phần mềm  (Unit test, integration test – test tích hợp,…): Không có điều gì là hoàn hảo, bởi thế không có phần mềm nào mà không có lỗi. Hãy kiểm tra để phần mềm có thể hoạt động đúng yêu cầu.
  • Hợp nhất hệ thống: Nếu phần mềm rất lớn và cần chia ra các modules nhỏ để làm song song bởi nhiều người, thì phải hợp nhất lại thành một thể thống nhất.
  • Bảo trì hệ thống: Con người hoàn hảo cũng có lúc đau ốm bệnh tật, phần mềm cũng thế, nó cũng cần được bảo trì và chăm sóc thường xuyên.

       Như bạn thấy, việc viết code chỉ là một trong rất nhiều công đoạn của việc phát triển phần mềm. Chúng ta hãy mô hình hoá các công đoạn này bằng hình ảnh sau đây:

software construction.gif
Trích: Code Complete – Steve McConnell

     Ở hình trên, chúng ta thấy được tổng quan các hoạt động của việc “phát triển phần mềm“, trong đó việc “xây dựng phần mềm” là một công đoạn con, được thể hiện trong ô tròn màu cam. Đừng nhầm lẫn 2 khái niệm này nhé. Trong quá trình xây dựng phần mềm, việc viết code chiếm một lượng lớn thời gian, đó chính là lí do mà người ta lầm tưởng rằng việc “phát triển và xây dựng phần mềm” chỉ là ngồi viết code.

      Trong chương trình đại học, sinh viên được đào tạo nhiều kĩ năng hơn trong việc phát triển phần mềm. Ngoài việc được học về tư duy lập trình và việc lập trình, sinh viên còn được đào tạo thêm rất nhiều các kĩ năng khác như: kiến thức nền tảng, việc lên kế hoạch, kiểm soát thời gian và tiến độ, thu thập yêu cầu, … Và có một thứ rất quan trọng mà bạn sẽ học được không chỉ ở chương trình đào tạo, mà còn từ những người thầy hoặc bạn bè tuyệt vời ở ĐH là kĩ năng “xác định vấn đề“, “giải quyết vấn đề” cũng như khả năng “tự học“. Nếu bạn chưa biết một thứ nào đó thì cũng ko quá nghiêm trọng, bởi khi bạn có tư duy phát hiện và định nghĩa vấn đề, rất có thể bạn cũng sẽ có luôn khả năng giải quyết được vấn đề đó.

       Ở các trung tâm dạy tin học, chương trình học tập trung vào phần “viết code” ở pha “xây dựng phần mềm”. Học viên thường chỉ được đào tạo để có thể sử dụng được các công cụ có sẵn (những tools, frameworks, công nghệ …) để giải quyết những vấn đề cụ thể nào đó đã được đặt ra sẵn. Học viên ở các trung tâm khi ra trường có khả năng “làm việc ngay” tốt hơn những sinh viên đại học, đó là bởi vì họ đã học “viết code” nhiều hơn. Nhưng có lẽ họ không có thế mạnh trong việc “tư duy ở mức vấn đề”, nền tảng kiến thức bổ trợ vững chắc, hoặc khả năng tự phát triển bản thân, chính những điều này khiến cho về lâu dài họ khó khăn trong việc tự phát triển bản thân sau này.

learn to think.jpg

        Tất nhiên, những nhận định ở trên chỉ có ý nghĩa trên mức độ thống kê, một người chỉ học ở các trung tâm vẫn có khả năng tiến xa hơn những người được đào tạo lâu hơn. Tất cả còn tuỳ thái độ và sự cố gắng của mỗi người nữa.

       Nói đi cũng phải nói lại, chương trình đào tạo ở bậc đại học thường không chú trọng quá nhiều vào các công nghệ mới, cũng như các công cụ phát triển hiện đại. Nếu các sinh viên ĐH cũng có khả năng sử dụng các công nghệ mới cách thành thạo, chắc hẳn là sẽ đáng giá hơn rất nhiều. Về cơ bản là càng có nhiều kĩ năng càng tốt, nhưng bạn cũng nên biết rõ nền tảng và tập trung cho thế mạnh của mình.

developer in dream.jpg

      Đối với người học là thế, còn với những ai đã đi làm, bên cạnh việc hoàn thành nhiệm vụ viết code cho các chức năng được giao, để phát triển, chúng ta còn phải để ý phát triển các kĩ năng khác ngoài việc code như đã nói tới ở trên. Đi dần từ việc có khả năng viết code tốt (chạy được; code phải sạch: biến, cấu trúc điều khiển, mô hình lớp, …), đến khả năng design từ chi tiết tới tổng quát (cấu trúc modules, kiểm soát ground works, perfomance & security, tuning code,… ), cũng như các kĩ năng về xử lí vấn đề, xác định yêu cầu, lên kế hoạch, quản lí tiến độ .v.v.. Điều quan trọng là luôn tiếp tục phát triển kĩ năng của mình. Tuỳ vào hoàn cảnh hiện tại và định hướng, mà cân nhắc cải thiện các kĩ năng tương ứng. Bạn thấy đó, phát triển phần đâu chỉ mỗi ngồi code.

      Trên đây chỉ là câu trả lời rất khái quát cho câu hỏi “Phát triển phầm mềm thực sự là gì?”, để có thể hiểu rõ hơn, không có gì tốt hơn là ta nên ánh xạ nó qua một thứ mà tất cả chúng ta đều đã biết. Từ đó mà ta có được những hiểu biết chi tiết hơn để hành động phù hợp hơn. Để điều đó cho bài sau nhé. Chúc vui 🙂

One thought on “Thật ra thì … phát triển phần mềm là gì?

  1. Pingback: [Code sao cho chuẩn] – Phần 4: Chúng ta nên định dạng code như thế nào? – Những dòng code vui

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s