Bài viết này nhằm mục đích giới thiệu cho các bạn sinh viên IT mới ra trường có một cái nhìn cụ thể về môi trường doanh nghiệp, đồng thời cũng trình bài sơ bộ về một số góc nhìn mang tính cá nhân về công việc của nhân viên IT trong môi trường doanh nghiệp sau khi các bạn ra trường và tìm việc ở một công ty chuyên về công nghệ thông tin (CNTT) nào đó.

Trước tiên, thuật ngữ IT (Information Technology) là một khái niệm rất rộng chứa gồm nhiều ngành đặc thù trong đó. Dưới góc nhìn của doanh nghiệp chuyên về kinh doanh phần mềm thì có thể chia ra thành một số ngành nhỏ hơn như sau: ngành lập trình, ngành viễn thông, mạng máy tính và truyền thông, quản trị hệ thống, phân tích/thiết kế hệ thống,… Tùy theo mỗi doanh nghiệp và mỗi môi trường làm việc khác nhau thì có những góc nhìn và cách phân chia khác nhau. Và trong bài này sẽ tập trung vào nói về ngành lập trình phần mềm (Software Development). Những bạn sinh viên học chuyên ngành CNTT hoặc Kỹ thuật phần mềm (KTPM) đều có thể trở thành lập trình viên vì đã được đào tạo những kiến thức nền tảng cần thiết.

1. Các loại hình công ty IT:

Môi trường doanh nghiệp IT (enterprise environment) là một công ty cụ thể chuyên về sản xuất phần mềm. Công ty này có thể là công ty tư nhân hoặc tập đoàn, có thể là trong nước hoặc ngoài nước,… nhưng cái quan trọng nhất là công ty chuyên kinh doanh về lĩnh vực IT, sản xuất phần mềm và các hoạt động liên quan tương ứng. Ví dụ Microsoft, Oracle, IBM, … là những doanh nghiệp IT. Ở Việt Nam, các công ty này thường tập trung ở các thành phố lớn và đông nhất là Hồ Chí Minh (HCMC) và có hai loại hình sản xuất chính của các công ty này: 1.) gia công phần mềm và 2.) tự sản xuất phần mềm.

Công ty gia công phần mềm(outsourcing company) là loại hình kinh doanh mà các công ty nhận các dự án từ một hoặc nhiều công ty khác về để làm. Lúc này khách hàng của công ty chính là các công ty khác chứ không phải là khách hàng cuối (end customer – người dùng phần mềm). Phần mềm mà công ty nhận về để làm (gia công) có thể là phần mềm mới hoàn toàn, cũng có thể là cũ hoặc hiện đang phát triển thêm tính năng. Các công ty gia công thường có bộ phận marketing để đi tìm kiếm khách hàng tiềm năng và deal các dự án (phần mềm) từ các công ty khác lớn hơn để mang về gia công và phát triển tiếp tục thêm các tính năng của phần mềm. Như vậy tiền hợp đồng thực nhận, tiền mà khách hàng trả cho cty gia công, thưởng/bonus/phụ cấp đều được đưa về phía công ty gia công trước hết, còn đội ngũ nhân viên trực tiếp làm việc và gia công trên phần mềm sẽ nhận thông qua trung gian là công ty gia công của mình. Vì đặc tính là nhận sản phẩm dang dở của khách hàng để phát triển tiếp tục thêm nên có hai khái niệm là Legacy NextGen. Legacy là phần sản phẩm đã được phát triển sẵn trước đó rồi được khách hàng bàn giao cho để phát triển tiếp tục (hiểu nôm na là sản phẩm cũ, code cũ). NextGen (next generation) là phần được bên phía công ty gia công phát triển thêm dựa trên Legacy, tích hợp thêm các tính năng dựa trên yêu cầu của khách hàng. Và vì đặc thù là khách hàng muốn cái mới, công nghệ mới, kỹ thuật tiên tiến trên sản phẩm nhưng một số tính năng cốt lõi (core feature) thì không thể đập bỏ liền được nên các sản phẩm gia công thường tập trung vào việc “hàn gắn” các tính năng mới của khách hàng dựa trên phần sản phẩm với công nghệ cũ, và dần dần theo thời gian thì sẽ di chuyển từng phần, từng phần Legacy sang công nghệ mới cho đến khi xong hết và thế là sản phẩm được hoàn thành và có thể bàn giao cho khách hàng. Thời gian để hoàn thành và chuyển giao cho khách hàng (wrap up and delivery to customer) thì tùy vào đặc tính từng dự án: có dự án tầm vài tháng, vài năm đã xong và deliver luôn, có dự án khách hàng thấy chi phí thỏa thuận không tốt và hủy hợp đồng để tìm cty gia công khác và cũng có những “đại” dự án được phát triển lên đến hơn thập kỷ. Tại sao lại có loại hình gia công này? Đơn giản là vì tính kinh tế! Một số công ty hoặc tập đoàn lớn có đủ khả năng tự sản xuất và phát triển phần mềm cho chính họ (sẽ nói phần sau) nhưng sau khi xem xét dựa trên nhiều yếu tố khác nhau thì chi phí để thuê một bên thứ ba phát triển sản phẩm của mình lại ưu việt hơn và thế là họ lại đi tìm các công ty gia công để thỏa thuận. Có rất nhiều thung lũng gia công phần mềm trên toàn thế giới, trước đây thì có Bangalore (India) nhưng sau này họ tự làm chủ được công nghệ và chuyển dần cơ cấu sang tự sản xuất và bán lại phần mềm, thế là thị trường dịch chuyển sang Trung Quốc, Đông Nam Á (trong đó có Việt Nam) đang là những trang trại tập trung rất nhiều công ty gia công vì nhân công ở đây rẻ và chất lượng sản phẩm đạt yêu cầu, thậm chí còn vượt trội hơn mong đợi.

Công ty tự sản xuất phần mềm(product company) là loại hình công ty tự phát triển (100%) các sản phẩm phần mềm và có thể dùng vào mục đích cho chính nội bộ công cty hoặc bán ra thị trường mang doanh thu về. Lúc này khách hàng của công ty là người dùng cuối (end customer) và tất nhiên phần lên ý tưởng, thiết kế, quy trình phát triển, quản lý chất lượng, bảo trì đều do công ty đảm nhận hết không có sự can thiệp từ bên thứ ba. Nhân viên làm việc trên phần mềm sẽ trực tiếp làm việc, khảo sát, lấy ý kiến từ người dùng; họ cũng chính là người tự lên ý tưởng, tự thiết kế, tự phát triển và tự bảo trì sản phẩm. Vì không có bên trung gian nào nên thưởng/bonus, xét duyệt PA (performance assessment) hàng năm, KPI đều dựa trên trực tiếp sản phẩm mình đang phát triển (thường là rất hậu hĩnh!). Hầu như các phần mềm được phát triển là mới, nên các công nghệ, kỹ thuật áp dụng vào đều bắt trend thị trường và hầu như không có (rất hiếm) phải tích hợp với các modules cũ với nền tảng công nghệ cũ. Khi một dự án đang giai đoạn release beta (thử nghiệm) thì vẫn có thể nhận feedback từ end user có cả tốt và không tốt, nên vẫn có khả năng dự án tiếp tục phát triển nếu nhận nhiều feedback tốt và ngược lại (up/down project). Thời gian để hoàn thành một dự án thì tùy vào đặc tính từng dự án, nhưng thời gian bảo trì (maintenance phase) thì rất lâu và dài hạn (ex, Microsoft Inc. bảo trì Windows XP tận 13 năm). Hiện tại cũng có nhiều startup làm về product nhưng bị chết non ngay từ những năm đầu do nhiều nguyên nhân khác nhau, nên chọn các công ty product có uy tín sẽ đỡ tốn thời gian chuyển việc nhưng bù lại chúng ta được học hỏi nhiều technical mới! Có nhiều công ty, tập đoàn lớn trên thế giới nhằm mục đích mở rộng kinh doanh và giảm chi phí, họ thường đặt các offshore (chi nhánh của cty tại một quốc gia nào đó) và phát triển chính sản phẩm của cty mình dựa trên nguồn nhân lực bản địa.

Tóm tắt lại, có hai mô hình doanh nghiệp/công ty IT và mỗi loại có từng ưu nhược điểm riêng nên không thể so sánh được. Trong xu thế ngày nay, rất nhiều công ty outsourcing cũng làm product và ngược lại – nhiều công ty product lấn sang mảng outsourcing vẫn có, nên biên giới để xác định cũng mờ nhạt và chính những người làm trong từng dự án cụ thể mới biết được chính xác các ưu nhược điểm đó.

2. Từ internship đến master:

Là sinh viên ngành phần mềm máy tính đang thực tập ở các công ty hoặc đã tốt nghiệp đều phải đi từ bước một – từ vị trí thấp nhất và đi lên. Bên dưới là một số title (cấp bậc) trong ngành kỹ thuật phần mềm, lưu ý là chỉ mang tính chất tương đối vì chưa có một quy định nào về vấn đề này và mỗi công ty, mỗi quốc gia lại có những title riêng và đặc thù nhưng nhìn chung sẽ được sắp xếp như sau:

Internship(thực tập sinh), thông thường sinh viên thực tập sẽ làm việc tại nơi mình đăng ký thực tập để có trải nghiệm: môi trường làm việc, văn hóa làm việc, tính chất đặc thù của các công ty chuyên về kinh doanh phần mềm, làm việc nhóm, kỹ năng giao tiếp và đặc biệt là bước đầu được tiếp thu về các kỹ thuật, công nghệ trong enterprise software product, có một cái nhìn và cơ hội tiếp xúc với dự án mà công ty hiện tại đang phát triển. Được các mentor/trainer hướng dẫn cụ thể từng bước một để có được những kinh nghiệm trong cả kỹ năng chuyên ngành và kỹ năng giao tiếp. Nên sẽ có nhiều vấn đề bỡ ngỡ và khác nhiều với môi trường học thuật.

Fresher(người mới), đôi khi được gộp chung vào title Internship vì tính chất công việc nhìn chung là giống nhau nhưng khác nhau về số năm kinh nghiệm – là những người có kinh nghiệm nhiều hơn Internship. Được phân công một số nhiệm vụ nhỏ, phụ trong dự án đang làm và thường không có tính chất quyết định quan trọng nhiều trong dự án. Fresher cũng có mentor/trainer và đôi khi họ là những trợ thủ đắc lực để các mentor/trainer giao việc và qua đây là cơ hội để học hỏi thêm nhiều kiến thức và kỹ năng.

Junior, thường có khoảng từ 6 tháng kinh nghiệm trở lên và có cái nhìn rõ hơn về dự án và được đào tạo đầy đủ các kiến thức về dự án, nhưng chưa có nhiều kinh nghiệm giải quyết và xử lý các vấn đề trong quá trình phát triển sản phẩm. Junior có thể code được một số tính năng và tích hợp vào sản phẩm, đôi khi họ cũng được train/review bởi một số Senior để đánh giá quá trình phát triển và kiến thức đã được tiếp thu.

Mid, đây là title đệm nhưng đôi khi cũng được gộp chung vào Junior và không có định nghĩa cụ thể rõ ràng về các tố chất cần đạt được ở một số công ty. Nhìn chung Mid có thể tiếp cận dự án một cách nhanh nhẹn, tác phong làm việc gọn gàng và có thể giải quyết một số vấn đề “tầm trung” của dự án. Kinh nghiệm cho Mid từ dưới 2 năm, mà nhìn chung tùy vào sự cố gắng và phấn đấu của từng người. Phải biết rõ về kỹ thuật, biết nhiều về các tools, hiểu và tiếp cận nhanh để có thể đưa ra giải pháp hợp lý.

Senior, đây là title chính thức cho những lập trình viên gạo cội và có nhiều năm kinh nghiệm “lăn lộn” với các loại vấn đề/khó khăn khác nhau của phần mềm. Họ có thể chủ động và trực tiếp giải quyết các vấn đề một cách nhanh nhẹn và tế nhị nhất dựa trên kinh nghiệm từng trải. Senior phải có một cái nhìn sâu sắc và thấu đáo tận tường mọi giải pháp, mọi kỹ thuật liên quan, những xung đột trong bản thiết kế, những rủi ro tương lai và những tools hợp lý nhất để phát triển sản phẩm. Mỗi dòng code của senior đều phải suy nghĩ trên nhiều khía cạnh: kết hợp với hệ thống cũ như thế nào? Code có đơn giản không? Đồng nghiệp đọc code hiểu không? Vấn đề hiệu năng của sản phẩm? Chi phí bảo trì? Chi phí tích hợp và tháo lắp module? Có bị Technical dept không?... Ngoài ra Senior là những người thảo luận các vấn đề kỹ thuật chính của sản phẩm đang phát triển cùng với Architect (trình bài bên dưới) để đảm bảo chất lượng sản phẩm và hoàn thành đúng tiến độ.

Architect, đây là “kiến trúc sư về kỹ thuật” của dự án và là người lên bản vẽ kỹ thuật chính trong dự án. Đôi khi title của họ được gọi nhiều cách khác nhau: Architect Leader, Solution Architect, Technical Architect,… Nhưng công việc chính là liên quan đến tư vấn, giải pháp, quản lý kỹ thuật trong dự án. Những Senior có nhiều kinh nghiệm sẽ trở thành Architect và thông thường phải ít nhất từ 10 năm kinh nghiệm để đạt được vị trí này. Ngoài vấn đề hiểu rộng về những công nghệ, kỹ thuật ra họ còn phải có cái nhìn chi tiết và sâu sắc mọi khía cạnh của từng loại kỹ thuật dựa trên kinh nghiệm từng trải để biết cách thiết kế một kiến trúc dự án hoạt động hoàn hảo tránh xung đột kỹ thuật, tránh nợ kỹ thuật (tech debt – một thuật kỹ chuyên ngành) và mang lại hiệu suất cao của sản phẩm.

Bên trên là một số title chính trong ngành Lập trình, ngoài ra còn có những title mà đi ra hoặc phát sinh ra từ những cái bên trên:

Project Manager, đây là người quản lý toàn bộ dự án về mặt nhân sự, kế hoạch, giao tiếp với khách hàng; lập biểu đồ, báo cáo tiến độ dự án và đảm mọi mọi hoạt động về con người được tốt nhất trong dự án. Những Mid hoặc Senior nếu có thiên hướng về mặt kỹ năng mềm (soft skills) có thể chuyển qua làm vị trí này.

CTO(Chief Technical Officer), đây là những người nằm trong ban lãnh đạo công ty cùng với CEO (Chief Executive Officer), COO (Chief Operating Officer), CIO (Chief Information Officer). Hiểu nôm na CTO là quản lý kỹ thuật trong công ty và quản lý/tư vấn kỹ thuật cho nhiều dự án hiện đang phát triển trong công ty. CTO đảm bảo chất lượng kỹ thuật của từng dự án một khi release và đóng vai trò tham mưu, tư vấn kỹ thuật cho Architect; tham mưu, tư vấn tài chính phải chi khi phải dùng công nghệ này, kỹ thuật kia cho CFO (Chief Financial Officer) để đảm bảo tính kinh tế của dự án. Thường những Architect có nhiều năm kinh nghiệm sẽ có thể trở thành CTO. Ở các công ty lớn và các tập đoàn vị trí này đóng vai trò rất quan trọng trong thời đại công nghệ ngày nay.

3. Vai trò trong dự án:

Một lập trình viên thường không viết code từ đầu luồng cho đến cuối luồng của chương trình. Như vậy thường đòi hỏi ở lập trình viên rất nhiều kỹ năng khác nhau. Lấy ví dụ ở lập trình web:

  • Lập trình giao diện (GUI): html, scss, javascript (AngularJs, Angular, React, Bootstrap, jQuery, D3, Vue),…
  • Lập trình server: C#, Java, PHP, NodeJs, Python,…
  • Database: MySQL, SQLServer, Postgres, MongoDB, Cassandra,…

Có quá nhiều thứ để làm, và mỗi thứ với mỗi ngôn ngữ lại có rất nhiều library riêng đi kèm cho ngôn ngữ đó. Ví dụ Springecosystem trong Java đã là một thứ vượt ngoài tầm library và trở thành chuẩn lập trình cho Java sau này! Nên việc chia ra thành từng module nhỏ hơn sẽ giúp việc lập trình viên chuyên sâu vào từng loại kỹ thuật có liên quan, đặc biệt là ở các dự án lớn và cực kỳ lớn mang tính phát triển lâu dài. Thường có hai loại chính:

  • FE Developer(Front End): FE chuyên lập trình về giao diện (UI) – là thứ end user tương tác với hệ thống. Ví dụ: lập trình giao diện trang web, giao diện mobile app,… Những kỹ năng cần có thường liên quan đến HTML, SCSS và thế giới Javascript và các thư viện của nó.
  • BE Developer(Back End):  BE chuyên về lập trình server – là phần xử lý các tác vụ chính của sản phẩm. Sau khi nhận request từ FE gửi xuống thì BE sẽ thực thi các nghiệp vụ business, logic và lưu xuống Database/query data và trả về FE. BE sẽ xử lý luôn cả vần thiết kế kiến trúc cho hệ thống server và hệ thống Database.

Ngoài ra ở một số dự án có chuyên về cài đặt phần cứng hệ thống – Infrastructure system (máy chủ, servers, network,…) để triển khai sản phầm cho khách hàng và tích hợp liên tục (CI/CD) vào quy trình phát triển liên tục của hệ thống thì có role DevOps

  • DevOps(Development & Operations): là người triển khai sản phẩm để tích hợp liên tục (CI/CD) vào chu trình phát triển phần mềm. Họ sẽ chịu trách nhiệm về triển khai các kiến trúc phần cứng (server máy chủ) và tích hợp sản phẩm phần mềm lên để người dùng - cả team Develop, team QA và End customer – có thể trải nghiệm sản phẩm nhanh nhất có thể. Ngày nay nền tảng Cloud (AWS, Azure) đang phát triển mạnh, nên vai trò của DevOps càng trở nên quan trọng, khi tất cả kiến trúc hạ tầng của server đều đặt trên Cloud Environment.

4. Một số kỹ năng bắt buộc cho Software Developer:

SOLID in Technical: phải thật vững về mặt kiến thức chuyên ngành, kỹ thuật vì đây là yếu tố quan trọng nhất để giúp thăng tiến trong sự nghiệp.

  • English skills: Tiếng Anh phải vững đặc biệt là Reading và Speaking để có thể đọc hiểu và giao tiếp tốt. 100% các đặc tả trong ngành phần mềm đều là tiếng Anh, 100% các nguồn tài liệu về kỹ thuật chuyên ngành cho sản phẩm doanh nghiệp (enterprise product) đều là tiếng Anh, sẽ không thể tìm được bằng google ở tiếng Việt đâu!
  • Self-learn: kỹ năng tự học là kỹ năng để quản lý chính mình, phải tiến bộ về nhiều mặt trong cuộc sống và quan trọng nhất là mặt technical vì công nghệ sẽ bị lạc hậu (obsolete) trung bình chỉ sau 5 năm.
  • Reading book: đọc sách là phương pháp duy nhất để nắm vững kỹ thuật và có một cái nhìn toàn cảnh về công nghệ và kỹ thuật đó, ưu nhược điểm và là cơ sở để đánh giá trình độ kỹ thuật chuyên môn trong giải quyết các vấn đề của dự án. Và như nói bên trên là 100% các nguồn tài liệu về kỹ thuật chuyên ngành cho sản phẩm doanh nghiệp (enterprise product), nên đọc sách bằng tiếng Anh là chắc chắn rồi!
  • Team work: kỹ năng làm việc nhóm phải vững để có thể giao tiếp kỹ thuật và giao tiếp xã hội hiệu quả trong công việc. Ngày nay có nhiều kỹ năng giao tiếp và quản lý được sinh ra dành riêng cho phần mềm là Agile Umbrella.

Tác giả: Lê Văn Độ - Cựu sinh viên ngành CNTT

CLB Tin Học

  • Chưa có lời bình cho bài viết này.