Career path as a software engineer - P2

Before publish this post, I would like to say thank to Narita-san. You are my ex-customer but in my mind you are also my teacher and my friend. As your expectation, I want to share your voice to all people, not only to IT engineer, to everyone who want to be an IT engineer in the future also.

Thank you for sharing to me, to us about your experience and your dreams about working with Software.


Trong phần I https://viblo.asia/viet.ta/posts/mrDGMJRmezL chúng ta đã cùng tìm hiểu về các khái niệm cũng như những kỹ năng cần thiết cho một kỹ sư phần mềm. Bài viết này Từ bây giờ, chúng ta sẽ xem xét cụ thể hơn về vận dụng chúng như thế nàoxem làm thế nào để nâng cao kỹ năng bản thân nhé. Tôi dự định sẽ không chỉ tập trung vào “development engineer’s career” mà còn của “testing engineers” và “project managers” nữa.

Trước tiên, tôi muốn nói rõ về vai trò của mình hay cũng chính là để các bạn hiểu về “my career”.

Tôi từng giữ vài trò như một “developer”, “project manager” hay một “consultant” trong rất nhiều những dự án khác nhau. Riêng với vai trò kỹ sư phần mềmdeveloper, tôi nghĩ bản thân mình sẽ nhưtôi là một “DSP engineer”. Từ “DSP” là viết tắt của “Digital Signal Processing”. Tôi đã có khoảng thời gian khá lâu làm việc về xử lý hình ảnh tĩnh, bao gồm cả phát triểên những “applicationứng dụng” cũng như nghiên cứu phát triển về “core technology”. Qua bài viết này, tôi muốn giới thiệu một số tips để tăng thêm những kỹ năng trong cả hai lĩnh vực: “Application development” và “Core technology development”. Do đây chỉ là những kinh nghiệm của chính tôi nên chắc chắn sẽ không hoàn toàn phù hợp trong hoàn cảnh của các bạn. Nhưng cũng rất mong rằng, các bạn có thể rút ra được một vài điều bổ ích để áp dụng cho “career path” của mìnhcó thể áp dụng trong công việc hàng ngày của các bạn.

“Application development” có lẽ đã quá đỗi quen thuộc. Đó là việc chúng ta phát triển một ứng dụng phần mềm cho người dùng theo những yêu cầu được định sẵn.

Ví dụ trong trường hợp của tôi, chúng là nhữngđó là phần mềm ứng dụng ảnh tĩnh (“photo editing software)” được chạy trên Windows, Mac hay Linux. Cụ thể, sau khi những phần mềm này thực hiện load bất kỳ các định dạng ảnh nào(Jpeg, RAW, PNG, TIFF,...). Thực hiện hiển thị ảnh lên màn hình Hình ảnh được hiện lên và người dùng có thể chỉnh sửa rất nhiều những thông số của nóảnh, cắt bớt hoặc chỉnh góc,… Sau đó người dùng có thể lưu ảnh sau chỉnh sửa lại hoặc thực hiện in ra giấy.Việc lựa chọn chỉ in lại hay in ra hẳn trên giấy sẽ được tùy chọn bởi người dùng. Có lẽẽ mỗi chúng ta đều hiểu rằngbạn cũng biết, đểtrong phát triển những ứng dụng, thì việc có hiểu biếtnhững kiến thức về phát triển platformnền tảng là rất quan trọng. Bạn cần phải biết cách để open hay load data từ file. Bạn cần biết cách hiển thị, lưu và thậm chí cả cách in chúng ra… Tất cả những điều trên đềểu là những kiến thức hết sức cơ sở không chỉ cho những “still image application software” mà còn cho bất kỳ một ứng dụng nào khác. Vì vậy, bạn cần nắm vững tất cả chúng một cách thành thạo nhấtnhững kỹ thuật này. Có những kỹ năng là “cơ bản” và “thông dụng” khi phát triển trên các platform. Trong bất kỳ hệ điều hành nào Windows, Mac OS, Android, iOS hay Linux những kỹ thuật để kiểm soát hệ thống, file, graphics hoặc network,.. luôn là thứ bạn cần phải biết và nắm vữnghọc trước khi bắt tay vào làm.làm bất cứ việc gì. Picture1.png Fig.1 common skill domain around your applicationCác kỹ năng căn bản khi làm phần mềm.

Nhưng ngay cả trong mỗi tầng “application development” phía trên cũng chứưa trong nó một vài “expert skills” nào đó tại mỗi domain. Có thể kể đến như trong xử lý ảnh tĩnh, “Color Management” là một trong những kỹ năng khó và quan trọng nhất. Nó được nằm trong phần “graphics domain” của hệ thống vàđể đảm bảo việc hiển thị màu sắc trên màn hình của khác và các thiết bị khác nhau. Picture2.png Fig.2 Color Management Technology domain.

Theo như Fig 2, ta có thể thấy color management technology bao gồm một số công nghệ và, khái niệm cốt lõi và thông dụng, và chúng độc lập với các platform. Với hệ điều Windows, ICM và WCS là hai hệ thống được sửủ dụng cho color management system. Còn với Mac ta sử dụng ColorSync. Điều này đồng nghĩa với việc, khi muốn phát triển một “color management software”, bạn sẽ cần dùng ICM và WCS trênvới nền tảng Windows và dùng ColorSync trênvới Mac. Trên tất cả các hệ thống, ICM, WCS và ColorSync được build cho kỹ thuật color management.Tổng quát hơn, mọi systems đều sử dụng ICM, WCS hoặc ColorSync để phát triển color management. Vì vậy, bạn cần nắm vững về “Ccolor Mmanagement” để có thể một phát triển một phần mềm ứng dụng đúng đắn có sử dụng ICM, WCS và ColorSync. Nói cách khác, nếu bạn hiểu biết về “Color Management”, sẽ dễ dàng hơn cho bạn khi học về ICM, WCS và ColorSync. trên bất kỳ một nền tảng nào đó một cách dễ dàng hơn. Ai đó có thể cảm thấy khá kỳ lạ vì sao tôi lại chỉ liệt kê đến Windows và Mac mà không có Android hay iOS. Bạn biết vì sao không? Bởi ngày nay, cả Android và iOS đều không có cho mình một hệ thống color management tiêu chuẩn trong bản thân hệ điều hành. Điều đó có nghĩa là gì? Điều đó có nghĩa là, khi những hệ điều hành này cài đặt color management system như là một kỹ thuật mới của họ, những kỹ sư đã có hiểu biết về “Color Management” , mỗi khi có bất kỳ cập nhật nào về công nghệ, những kỹ sư có cái nhìn tốt về color management sẽ có thể dễ dàng thích ứng với các tính năng mới hơn kỹ sư khác. Don’t you think it is a big advantage as an engineer? Bạn không nghĩ rằng đây là một lợi thế lớn của một kỹ sư ư?

Ý tôi là, có 2 kiểu kỹ năng trong việc phát triển ứng dụng nền tảng (platform application development. Kỹ năng đầu chỉ có thể áp dụng cho các platform. Cái còn lại bao hàm các khái niệm cốt lõi về kỹ thuật chung vượt ra khỏi giới hạn của platform. Và sẽ tốt hơn nếu bạn tìm ra “kỹ thuật cốt lõi trong công việc của mình” và trở nên thành thạo nó. Việc này sẽ có ích cho các kỹ năng trong tương lai giúp bạn trở thành một kỹ sư phát triển phần mềm.

~Tip tăng kỹ năng~

  1. Tìm ra kỹ thuật cốt lõi trong công việc và biến nó thành kỹ thuật của riêng bạn.

Không chỉ riêng về “Kỹ thuật”, trong bối cảnh phát triển ngày nay, chúng ta có rất nhiều “standard” và “đặc điểm kỹ thuật”. Ví dụ như, “ICC profile” là một chuẩn quốc tế. Tất nhiên định dạng ảnh “Jpeg” là định dạng tập tin chuẩn và cũng có rất nhiều chuẩn khác liên quan như “Exif”, “DCF”. Hoặc như khi dự án của bạn phát triển một ứng dụng web cho khách hàng, bạn sẽ sử dụng những định dạng dữ liệu như “XML” hay “JSON”. Chúng cũng đều được gọi là “các standard”.

Hiện nay, “JSON” đã được định nghĩa trong RFC7159 và bạn có thể tìm thấy những tài liệu đặc tả từ Internet. Bạn đã đọc những tài liệu ấy chưa? Nếu chưa, hoặc bạn mới chỉ tìm kiếm thông tin “Làm thế nào để phân tích” hay “Sử dụng library phân tích JSON như thế nào”, hãy cố gắng để có được những đặc điểm kỹ thuật bạn đầu và hiểu các standard của nó. Trong trường hợp này, có “Một standard” và “Một library để sử dụng standard ấy”. Nếu bạn biết sử dụng “Một library để sử dụng standard” thì không có nghĩa rằng “bạn đã hiểu Một standard”.

Nếu bạn hiểu được cả về standard gốc và library mà bạn đang sử dụng,

  • Bạn có thể đánh giá chất lượng và năng lực của library.
  • Bạn có thể tạo ra library để sử dụng standard. Cuối cùng, bạn sẽ trở thành một chuyên gia về standard.

Một vài ví dụ khác. UTF-8 là một chuẩn rất phổ biến để diễn tả mã ký tự quốc tế. Và bạn không cần phải hiểu các đặc điểm kỹ thuật của nó khi bạn xử lý chuỗi trong phần mềm ứng dụng. (Có bạn nhiêu người đã đọc bản đặc tả kỹ thuật ISO-10646 hay truy cập vào trang web Unicode Consortium) Nhưng bạn có biết điều gì sẽ xảy ra khi bạn chuyển đổi chuỗi từ UTF-8 sang UTF-16? Bạn cần xem xét điều gì khi chuyển đổi? Có thể bạn chưa từng gặp tình huống mà bạn cần phải biết về nó nhưng thực ra bạn luôn sử dụng Unicode trong phần mềm của mình. Đợi, đợi chút đã, đầu tiên, bạn có biết mã ký tự Tiếng Việt? Nếu bạn không biết, hãy thử nghiên cứu về những thứ quanh mình trước. Picture3.png Fig.3 Học về Standard hay Học các Library sử dụng Standard

~ Tip tăng kỹ năng ~ 2. Thử đọc các standard gốc khi bạn sử dụng nó.

Tôi nghĩ bạn sẽ tìm thấy rất nhiều standard kể cả khi bạn chỉ phát triển “lớp ứng dụng”. Hãy chú ý vào code mà bạn đang viết, library bạn đang sử dụng, không hề khó khăn để tìm ra những “standard” đó. Và “hiểu standard” sẽ trở thành một “kỹ năng” mạnh của bạn. Để học và có được “kỹ thuật” bạn cần sự nỗ lực và cả thời gian nữa. Nhưng đọc những “standard” dễ dàng hơn nhiều. Tôi tin rằng đây là “con đường dễ dàng” để bạn nâng cao kỹ năng của mình.

Nhân tiện, chúng ta đã cố gắng để tìm ra “kỹ năng độc lập nền tảng” trong 2 tip trước. Nhưng tất nhiên trong “kỹ năng độc lập nền tảng” cũng có những tip để ta nâng cao hơn kỹ năng của mình.

Về kỹ năng độc lập nền tảng, có 2 điểm chính, một là sự hiểu biết rộng về các platform và điểm thứ hai là mức độ hiểu biết sâu sắc về một domain xác định. Không may rằng, để làm tăng sự hiểu biết về các platform, tôi không có phương pháp nào tốt, ngoại trừ việc học và học từ những kinh nghiệm của bản thân. Chỉ đọc sách hay xem từ những tutorial online, bạn sẽ không có được kỹ thuật thuộc về mình. Bạn phải sử dụng nó trong công việc thực tế. Điều đó cũng có nghĩa, bạn phải thử trong nhiều dạng dự án và sản phẩm mà có những kỹ thuật mới.

Còn về mức độ hiểu biết sâu sắc về một domain, có một phương pháp rất đơn giản và dễ dàng thực hiện. Tôi sẽ giới thiệu ở cuối bài viết. Nhưng trước hết, tôi sẽ hỏi bạn một câu hỏi.

Bạn sẽ làm gì sau khi gặp khó khăn với sản phẩm của mình và đã tìm ra biện pháp để giải quyết nó?

Nếu bạn đã hoàn hiện giải pháp của mình, có lẽ bạn sẽ tận hưởng thành quả. Nhưng tôi có một lời khuyên khác cho bạn. Sẽ rất tốt nến bạn thử tìm một các giải quyết khác. Trong mỗi platform, luôn có nhiều cách xử lý cho cùng một vấn đề. Ví dụ, có những lệnh điều khiển phần cứng, và thông thường, chức năng điều khiển phần cứng sẽ điều hành hệ thống API cho tính năng này. Hoặc có thể hệ thống có cách dễ dàng hơn để truy cập tính năng bằng cách sử dụng ngôn ngữ bậc cao. Hãy kiểm tra môi trường phát triển của bạn.

Thông thường trong hệ thống mới nhất, các chức năng phần cứng bị ẩn đi khi thực hiện ứng dụng. Nhưng cũng có vài lớp kiến trúc để nhận biết một chức năng, hoặc có nhiều môi trường phát triển cho phần cứng hay platform điều hành hệ thống. Hãy kiểm tra môi trường bạn đang phát triển.

Picture4.png Fig.4 Một ví dụ của lớp kiến trúc hệ thống

Nói chung, môi trường phát triển bậc cao khá dễ dàng để sử dụng các tính năng, nhưng khó để kiểm soát những chi tiết của các tính năng. Trong khi môi trường phát triển bậc thấp hơi khó sử dụng các tính năng, nhưng lại dễ dàng kiểm soát các chi tiết và tối ưu hóa hiệu suất. Mục đích của chúng cũng khác nhau. Môi trường bậc cao cung cấp khả năng tự vận hành, trong khi môi trường bậc thấp cung cấp khả năng kiểm soát.

Để hiểu và đạt được kỹ năng cao hơn trong phát triển platform, luôn có cách để tìm ra hướng giải quyết khác, kể cả khi bạn đã tìm ra cách xử lý và hoàn thành tính năng. Khi bạn đã tìm ra cách giải quyết, đừng ngừng việc tìm kiếm những cách giải quyết khác, và so sánh để chọn ra cách tốt nhất với yêu cầu của bạn. Tìm ra cách giải quyết tốt nhất cho tính năng sẽ giúp bạn hiểu sâu sắc hơn về môi trường.

~ Tip tăng kỹ năng ~ 3. Cố gắng tìm một giải pháp khác kể cả khi bạn đã tìm thấy một một cách thức để giải quyết khó khăn.

Những tip trên để phát triển kỹ năng chỉ là vài ví dụ nhỏ. Điều mà tôi muốn nói là, khi bạn phát triển phần mềm tầng ứng dụng, có rất nhiều cơ hội để tìm hiểu sâu hơn về từng yếu tố (platform, môi trường, kỹ thuật, standard…) mà bạn đang phát triển. Bạn nên thử tìm hiểu về những kiến thức căn bản của chúng. Điều này sẽ mở mang khả năng của bạn và giúp bạn với những công việc phát triển khác trong tương lai. Hãy cố gắng tìm cách để phát triển kỹ năng của mình.

Trong phần này, chúng ta đã thấy những cơ hội phát triển kỹ năng để trở thành một kỹ sư phát triển ứng dụng. Có một sự khác biệt lớn giữa phát triển tầng ứng dụng và phát triển tầng core technology. Trong phần tiếp theo, chúng ta sẽ cùng xem xét kinh nghiệm nghề nghiệp cho một kỹ sư “core technology” nhé!

Theo Geek and Tech magazine, Hiroshi Narita