1. Software Architect là gì?
Software Architect là người chịu trách nhiệm thiết kế bộ khung cho hệ thống, thực hiện cách phân chia và chi tác giữa các component. Ngoài ra, họ còn có nhiệm vụ viết các tài liệu kiến trúc tổng quan, coding convention cũng như hướng dẫn các developer phát triển các bản thiết kế chức năng chi tiết. Chính vì thế, nếu như là việc với 1 SA tốt và khi thêm các tính năng mới thì độ phức tạp của các phần mềm sẽ không bị gia tăng nhiều.
Cần có thời gian và kinh nghiệm để trở thành một Kỹ sư phần mềm. Bạn cần tích lũy kỹ năng và kiến thức từ nhiều chức năng khác nhau. Bên cạnh những thức đầu tiên về phía kỹ thuật, vị trí này cũng đòi hỏi phải có kỹ năng xã hội tốt.
2. Các kỹ năng cần có để trở thành một Kỹ sư phần mềm
Kỹ năng công nghệ
Vậy các kỹ năng cần có của một Software Architect là gì? Không có định nghĩa chung cho tất cả vì các dự án khác nhau có thể yêu cầu kiến thức kỹ thuật khác nhau, nhưng có một số kỹ năng mà tất cả các dự án sẽ yêu cầu.
Đầu tiên hãy đến với kỹ năng liên quan đến kỹ thuật:
- Ngôn ngữ mô hình hóa thống nhất (UML): thường được liệt kê là một yêu cầu thiết yếu. Việc quen thuộc với phương thức lập sơ đồ các kiến trúc phức tạp là điều gần như bắt buộc đối với Software Architect.
- Giỏi về công nghệ: Các công ty công nghệ luôn tìm kiếm các ứng viên có kiến thức chuyên sâu về một hoặc nhiều ngôn ngữ lập trình cần thiết cho doanh nghiệp để hỗ trợ các mục tiêu dài hạn của họ. Một vài ngôn ngữ lập trình phổ biến như Java, JavaScript, Python, Ruby, Rust, Go, C hoặc thậm chí là COBOL.
- Khả năng quản lý các hoạt động phát triển phần mềm: theo cách hợp tác và nhanh nhẹn. Điều đó thường có nghĩa là bạn đã quen thuộc sâu sắc với các phương pháp DevOps. Điều này đòi hỏi các kỹ năng cứng, chẳng hạn như tạo môi trường DevOps hiệu quả và các kỹ năng mềm, để giữ cho các nhóm phát triển và vận hành được liên kết với nhau.
Kiến thức về Thiết kế (Design Skills)
- Có kiến thức về design patterns cơ bản: Design pattern là một trong những thứ quan trọng mà SA cần phải có để phát triển và maintain một hệ thống. Với design patterns bạn có thể reuse để giải quyết một số vấn đề hay gặp phải trước đó.
- Đi sâu vào pattern và anti-pattern: Khi đã biết một vài pattern cơ bản rồi, bạn nên đào sâu/mở rộng kiến thức thêm về software design pattern. Tác giả có giới thiệu cuốn sách Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions mọi người có thể tham khảo qua.
- Biết đánh giá chất lượng: Đó là lý do tài liệu hướng dẫn và coding standards được nêu ra phía trên để áp dụng. Làm vậy để hướng tới một hệ thống dễ maintain, bảo mật, tin cậy,...(điều mà ai cũng mong muốn).
Simplify
Hãy luôn nhớ những nguyên lý giải quyết vấn đề Occam’s Razor (đề cao sự đơn giản). Có thể giải thích nguyên lý này như sau: Nếu bạn có quá nhiều giả định về một vấn đề cần giải quyết, để giải quyết vấn đề bạn có thể nghĩ sai hoặc dẫn tới những cách giải quyết phức tạp khác. Những giả định đó nên được tối giản nhất (nghĩ đơn giản) để có thể đưa ra cách giải quyết tốt.
- Shake the solution: Để có thể đưa ra được những cách giải quyết đơn giản nhất, thường thì chúng ta sẽ móc nối các cách giải quyết lại với nhau và nhìn nhận vấn đề từ những vị trí khác nhau. Hãy cố gắng định hình cách giải quyết theo hướng là top-down hoặc bottom-up. Nếu bạn có data flow hoặc một quy trình, thì đầu tiên hay nghĩ theo hướng từ trái sang phải và ngược lại.
- Take a step back: Sau những cuộc tranh luận dài thì thường hướng giải quyết phức tạp sẽ là kết quả còn lại. Nhưng chúng chưa phải là kết quả cuối cùng. Nên hãy dừng lại và nghĩ liệu nó có thực sự có ý nghĩa ? sau đó xem xét lại vấn đề và refactor. Cuộc tranh luận có thể sẽ diễn ra vào ngày tiếp theo, nhưng ít nhất chúng ta có thời gian để suy nghĩ về giải pháp tốt hơn và đơn giản hơn.
- Devide and conquer: Đơn giản hóa vấn đề bằng cách chia để trị. Chia nhỏ vấn đề và giải quyết từng thằng đó một. sau khi validate thì match chúng lại và có cái nhìn tổng quan nhất
- Refactoring is not evil: Chấp nhận việc giải quyết vấn đề theo hướng hơi phức tạp nếu hiện tại chưa có giải pháp nào tốt hơn. Chúng ta có thể suy nghĩ về điều đó sau này. Trước khi refactor thì chúng ta nên có: một automated tests để đảm bảo các function của hệ thống hoạt động chính xác và được sự đồng ý từ stackholders
Kỹ năng về Decide
Một SA giỏi sẽ biết cách đưa ra quyết định để lead project hoặc team đi theo hướng đúng. Một Software Architect không nên lãng phí thời gian vào những việc không quan trọng mà cần phải biết phân loại để giải quyết các công việc trọng tâm trước. Chính vì vậy, nếu như bạn quyết định làm việc theo một cách nào đó thì nên tập trung theo cách đó nếu như đó là cách làm việc đơn giản nhất và có thể dẫn đến một concept dễ hiểu, đơn giản và dễ bảo trì.
Nên áp dụng một naming conventions ở bất cứ đâu bởi vì nó không chỉ là chữ hoa hay chữ thường và biết cách đưa ra quyết định như thế nào là đúng và như thế nào là sớm. Đôi khi việc đưa ra quyết định sớm sẽ mang lại rất nhiều lợi ích cho dự án của bạn.
Kỹ năng mềm
Tuy nhiên, cũng quan trọng không kém các kỹ năng liên quan đến công nghệ là các kỹ năng mềm. Chúng có thể thúc đẩy hiệu suất và gắn kết các thành viên trong nhóm lại với nhau để thực hiện các dự án thành công.
- Khả năng lãnh đạo: Giám sát sự phát triển của một dự án và điều phối các nhóm phát triển để đáp ứng các tiêu chuẩn thiết kế đòi hỏi khả năng lãnh đạo đáng kể. Software Architect phải có khả năng sắp xếp các nhu cầu và đòi hỏi của các dự án và nhóm.
- Giải quyết vấn đề: Quản lý và điều phối tất cả các yếu tố tạo nên một dự án ứng dụng thành công đòi hỏi kỹ năng giải quyết vấn đề mạnh mẽ – cả về kỹ thuật lẫn con người.
- Kỹ năng giao tiếp tốt: Giao tiếp là một thành phần quan trọng trong bất kỳ vị trí lãnh đạo nào. Để có được những nhóm tốt nhất, kiến trúc sư phần mềm phải giải thích rõ ràng nhiệm vụ, thời hạn và kỳ vọng.
- Huấn luyện & truyền cảm hứng: Nếu kỳ vọng không được đáp ứng, các nhà lãnh đạo phải huấn luyện và truyền cảm hứng cho các thành viên trong nhóm để đạt được mục tiêu chung.
- Kỹ năng tổ chức: Vì các kiến trúc sư phần mềm có nhiệm vụ thiết lập lộ trình phát triển, nên việc tổ chức chính là chìa khóa quan trọng. Thông thường, các sơ đồ UML quy mô lớn và phức tạp là yếu tố cần thiết, điều này đòi hỏi một cách suy nghĩ có hệ thống và có tổ chức.
- Sự tỉ mỉ, cẩn thận: Trong bất kỳ dự án phát triển nào, có một số lượng đáng kể các chi tiết phải được quản lý một cách chính xác. Điều này đòi hỏi sự chú ý cao độ đến từng chi tiết để đảm bảo mã dự án đáp ứng các mục tiêu.
- Tư duy sáng tạo: Software Architect phải thúc đẩy các nhóm tiến lên để hoàn thành việc xây dựng bất kể trở ngại. Điều này đòi hỏi khả năng suy nghĩ sáng tạo để tìm ra giải pháp thay thế hoặc giải quyết vấn đề.
>> Tìm hiểu thêm về các công việc của Kỹ sư phầm mềm:
Việc làm Kỹ sư phần mềm
Việc làm Thực tập sinh Kĩ sư phần mềm
Việc làm Lập trình viên C++
Việc làm Kỹ sư lập trình nhúng
3. Mẫu kiến trúc phần mềm là gì?
Kiến trúc Serverless
Kiểu kiến trúc hướng đến những ứng dụng với giải pháp là sử dụng service của bên thứ 3 để giảm tải sự phức tạp của việc quản lý server và backend. Kiến trúc Serverless được chia ra làm 2 loại chính. Loại đầu tiên là Backend as a service (BaaS) và loại thứ 2 là Function as a Service (FaaS). Kiến trúc serverless giúp bạn tiết kiệm thời gian fix bug deploy hoặc các task server thông thường.
Nhà cung cấp serverless thông dụng nhất là Amazon AWS Lambda.
Kiến trúc Event-Driven
Kiến trúc này phụ thuộc vào Event Producer và Event Consumer. Ý tưởng chính là tách hệ thống thành nhiều phần, và mỗi phần sẽ được trigger khi có một event từ phần khác được trigger. Nghe có vẻ hơi phức tạp nhỉ? Giả sử bạn là nhà thiết kế một hệ thống cửa hàng online và nó có 2 module. Module đặt hàng và module kho hàng. Nếu một khách hàng đặt hàng, module đặt hàng sẽ sinh ra một sự kiện là orderPending. Vì module kho hàng quan tâm đến event orderPending, nên nó sẽ nghe được, đấy được gọi là trigger. Một khi module kho hàng lấy được event, nó sẽ thực thi một số tác vụ, và từ đó lại có thể bắn ra một số event khác.
Hãy nhớ rằng event-producer không biết event-consumer nào đang nghe event nào. Và consumer cũng không biết event nó đang nghe là event nào. Nói tóm lại là các phần của hệ thống hoàn toàn tách biệt.
Kiến trúc Microservices
Kiến trúc microservice là kiến trúc phổ biến nhất trong vài năm trở lại đây. Ý tưởng là phát triển những module service nhỏ, độc lập, mỗi service giải quyết một vấn đề riêng biệt. Những service này kết nối với nhau thông qua một API.
Software Design
Trong khi kiến trúc phần mềm chịu trách nhiệm cho phần khung và cơ sở hạ tầng của phần mềm, thì thiết kế phần mềm lại chịu trách nhiệm cho phần thiết kế ở mức độ code, chẳng hạn như module này làm gì, phạm vi class, mục đích của function... Là một developer, chắc hẳn bạn phải biết được nguyên lý SOLID, và cách một design pattern giải quyết các vấn đề thông dụng ra sao.
SOLID bao gồm Single Responsibility, Open Closed, Liskov substitution, Interface Segregation và Dependency Inversion Principles.
Mẫu kiến trúc phần mềm (Software architecture pattern)
Hầu hết mọi người đều đã nghe về thuật ngữ Microservices. Microservice là một trong rất nhiều mẫu kiến trúc phần mềm, chẳng hạn như Layered Pattern, Event-Driven Pattern, Serverless Pattern... Chúng ta sẽ thảo luận về một số mẫu kiến trúc sau. Microservice trở nên nổi tiếng sau khi được áp dụng bởi Amazon và Netflix. Giờ hãy đào sâu vào architecture pattern.
Lưu ý: là đừng nhầm lẫn giữa design pattern như Factory hay Adapter với architecture pattern.
Kiến trúc Serverless
Kiểu kiến trúc hướng đến những ứng dụng với giải pháp là sử dụng service của bên thứ 3 để giảm tải sự phức tạp của việc quản lý server và backend. Kiến trúc Serverless được chia ra làm 2 loại chính. Loại đầu tiên là Backend as a service (BaaS) và loại thứ 2 là Function as a Service (FaaS). Kiến trúc serverless giúp bạn tiết kiệm thời gian fix bug deploy hoặc các task server thông thường.
Nhà cung cấp serverless thông dụng nhất là Amazon AWS Lambda.
Kiến trúc Event - Driven
Kiến trúc này phụ thuộc vào Event Producer và Event Consumer. Ý tưởng chính là tách hệ thống thành nhiều phần, và mỗi phần sẽ được trigger khi có một event từ phần khác được trigger. Nghe có vẻ hơi phức tạp nhỉ? Giả sử bạn thiết kế một hệ thống cửa hàng online và nó có 2 module. Module đặt hàng và module kho hàng. Nếu một khách hàng đặt hàng, module đặt hàng sẽ sinh ra một sự kiện là orderPending. Vì module kho hàng quan tâm đến event orderPending, nên nó sẽ nghe được, đấy được gọi là trigger. Một khi module kho hàng lấy được event, nó sẽ thực thi một số tác vụ, và từ đó lại có thể bắn ra một số event khác.
Hãy nhớ rằng event-producer không biết event-consumer nào đang nghe event nào. Và consumer cũng không biết event nó đang nghe là event nào. Nói tóm lại là các phần của hệ thống hoàn toàn tách biệt.
4. Lộ trình trở thành Kỹ sư phần mềm chuyên nghiệp
Bắt đầu với kiến thức cơ bản
Nếu bạn đang cân nhắc trở thành Software Architect, điều đầu tiên và quan trọng nhất bạn cần làm – hãy đăng ký tham gia chương trình học cơ bản phù hợp. Bạn có thể mong muốn sở hữu bằng Cử nhân hoặc Thạc sĩ về Khoa học Máy tính / Công nghệ Thông tin hoặc lĩnh vực liên quan khác vì nó không chỉ giúp bạn vững vàng hơn về các nền tảng cơ bản mà còn giúp bạn đủ điều kiện để có nhiều cơ hội nghề nghiệp hấp dẫn trong các công ty CNTT khổng lồ khác nhau.
Ngoài ra, cùng với bằng cấp và nền tảng giáo dục, bạn có thể chọn tham gia một số chương trình đào tạo cụ thể để có được sự thành thạo và tiếp xúc nhiều hơn trong lĩnh vực Software Architecture.
Làm quen với các ngôn ngữ lập trình
Để bắt đầu sự nghiệp của mình với tư cách là Software Architect, bạn luôn được yêu cầu phải có kiến thức vững chắc về các ngôn ngữ và khuôn khổ lập trình. Là một Kiến trúc sư phần mềm, bạn không chỉ chịu trách nhiệm viết code cả ngày mà còn được yêu cầu lãnh đạo nhóm các Developers, cộng tác với các nhóm khác, xem xét mã, v.v. do đó, bạn phải hiểu thấu đáo về các khái niệm lập trình và mô hình như một lập trình viên thực thụ.
Vì vậy, bạn có thể bắt đầu học lập trình với nhiều ngôn ngữ lập trình đòi hỏi khắt khe khác nhau như C ++, Python, Ruby, Go, v.v. Ngoài ra, bạn có thể chọn xây dựng một số dự án nhỏ và có thể tham gia vào các thử thách code khác nhau để nâng cao kỹ năng lập trình của mình.
Bước vào thế giới CNTT với tư cách là Nhà phát triển phần mềm
Như đã đề cập ở trên, Software Architect không phải là một lĩnh vực nghề nghiệp cấp đầu vào và có thể được coi là một trong những vị trí thành công của một Developer. Do đó, bạn thực sự nên có đủ kinh nghiệm thực hành trên hồ sơ của nhà phát triển.
Ngoài các kỹ năng mã hóa, bạn cần hiểu và làm việc trên một số khía cạnh quan trọng khác với tư cách là nhà phát triển để trở thành Kiến trúc sư phần mềm, chẳng hạn như làm việc nhóm & phân bổ nhiệm vụ, các giai đoạn SDLC của dự án, phân tích yêu cầu từ khách hàng, v.v. Bạn cần phải hiểu toàn bộ hoạt động của lĩnh vực phát triển từ thiết kế đến triển khai, điều này sẽ giúp con đường trở thành Software Architect trở nên dễ dàng hơn.
Đọc thêm: Thông tin tuyển sinh Top 6 trường đào tạo Công nghệ thông tin Hà Nội
Có được kiến thức vững chắc về thiết kế hệ thống, DevOps, v.v.
Khi bạn đã tham gia vào lĩnh vực Phát triển phần mềm và trở nên thành thạo với các ngôn ngữ & khuôn khổ lập trình, giờ là lúc bạn thực hiện mục tiêu của mình (nghĩa là trở thành Kiến trúc sư phần mềm) và theo đó học hỏi & nâng cấp các kỹ năng của bạn để đạt được mục tiêu .
Software Architect chịu trách nhiệm cho nhiều nhiệm vụ, do đó, bạn bắt buộc phải làm quen với một số lĩnh vực quan trọng như Thiết kế hệ thống, Vận hành phát triển hoặc DevOps, v.v. Bạn cần có hiểu biết sâu sắc về Mẫu thiết kế & Kiến trúc, Nguyên tắc cơ bản của Mô hình hóa dữ liệu, Ngôn ngữ mô hình hóa thống nhất (UML) và các khái niệm liên quan khác để bắt đầu sự nghiệp của bạn với tư cách là Kiến trúc sư phần mềm.
Nhận các chứng chỉ liên quan
Ngoài ra, hãy thảo luận về một số chứng chỉ nổi tiếng dành cho Kiến trúc sư phần mềm đầy tham vọng. Những chứng chỉ này không chỉ xác nhận các kỹ năng & kiến thức của bạn mà còn giúp bạn tiếp xúc thực tế. Ngoài ra, việc sở hữu những chứng chỉ này có thể giúp bạn có được nhiều cơ hội nghề nghiệp khác nhau trong những gã khổng lồ CNTT.
Có rất nhiều chứng chỉ uy tín mà bạn có thể xem xét để đạt được theo thị trường ngách của mình cho dù đó là Giải pháp, Doanh nghiệp và Kiến trúc miền. Một số chứng chỉ này là – ISAQB Software Architecture – Foundation Level, CITA-P: Certified IT Architect, ITIL Master (Axelos), chứng chỉ AZURE Architect, v.v.
Cải thiện các kỹ năng mềm cần thiết
Làm sao chúng ta có thể quên được điều này nhỉ? Thật vậy, việc có các kỹ năng mềm phù hợp cũng quan trọng như việc thành thạo các kỹ năng kỹ thuật để trở thành một Kỹ sư phần mềm thành công. Đầu tiên, bạn bắt buộc phải có kỹ năng giao tiếp tốt vì bạn phải cộng tác với khách hàng, nhà phát triển, các nhóm khác để các quy trình hoạt động trơn tru.
Ngoài ra, bạn cần có kỹ năng giải quyết vấn đề tốt để đưa ra các giải pháp sáng tạo & tối ưu cho vấn đề. Ngoài những kỹ năng này, bạn bắt buộc phải rèn luyện một số kỹ năng mềm quan trọng khác như quản lý thời gian, lãnh đạo, v.v. để trở thành một Kiến trúc sư phần mềm chuyên nghiệp.
Kỹ sư phần mềm chính là ngọn cờ là team leader có kinh nghiệm và kiến thức về những solution, giúp họ ra quyết định đúng đắn trong pha lập kế hoạch. Như vậy, 1900 - tin tức việc làm vừa cung cấp những thông tin hữu ích về Vai trò và các kỹ năng cần có để trở thành một kiến trúc sư phần mềm. Hy vọng qua bài viết bạn hiểu được tầm quan trọng kiến trúc sư phần mềm và thực hành hiệu quả.
>> Khám phá thêm các chuyên mục hấp dẫn và hữu ích khác tại 1900.com.vn:
Review các công ty hàng đầu
Cẩm nang nghề nghiệp chi tiết nhất
Tham khảo mức lương hơn 1000 công việc phổ biến
Tổng hợp TOP công ty hàng đầu đa lĩnh vực